Zozo, nyúzhatlak még? A FISH hívás lefagy, ha az aktuális könyvtárat szeretném lekérdezni a 3-as funkcióval. Az EXDOS ROM lekérdezése megy, még a meghajtókat is visszaadja a 20-assal a DE és HL regiszterekben, de amikor a 3-as funkcióval hívom, megfagy.
Így kérdezem le az EXDOS ROM-ot és a FISH területet:
unsigned int FISH_VAR;
unsigned char EXDOS_ROM;
unsigned char RA, RB, RC, RD, RE, RH, RL; // Ezeket a regiszterek tartalmának tárolásához használom
unsigned int RDE;
...
RDE = (unsigned int) &EXDOS[0]; // DE erre mutat, amiben ez van (szerintem jó): 6, 'E', 'X', 'D', 'O', 'S', 0xFD
__asm__ (
"ld DE,(_RDE)\n"
"rst 0x30\n"
".byte 26\n"
"ld (_RA),A\n"
"ld (_FISH_VAR),DE\n"
"push DE\n"
"pop IY\n"
"ld A,(IY-0x5E)\n"
"ld (_EXDOS_ROM),A\n"
);
Itt pedig a 3-as funkcióval a 6-os meghajtón (F:) az aktuális könyvtárat szeretném lekérdezni:
// Get current directory
RB = 6;
FISH(3);
...
// Ezt hívja meg:
void FISH(unsigned char Function)
{
unsigned int Address;
SetEXOSVar(27,255);
RA = Function;
__asm__ (
"ld IY,(_FISH_VAR)\n"
"ld A,(_EXDOS_ROM)\n"
"out (0xB3),A\n" // Page 3: EXDOS ROM
"ld A,0xFF\n"
"out (0xB2),A\n" // Page 2: FFh segment
"ld A,(_RB)\n" // B = drive (function 3)
"ld B,A\n"
"ld A,(_RA)\n" // A = function
"call 0xC010\n"
"ld A,D\n"
"ld (_RD),A\n"
"ld A,E\n"
"ld (_RE),A\n"
"ld A,H\n"
"ld (_RH),A\n"
"ld A,L\n"
"ld (_RL),A\n"
);
Out(0xB2, VideoSeg);
SetEXOSVar(27,7);
}
A 27-es EXOS változóban keretet állítom, hogy látszódjon, hol fagy le. Fehér marad, tehát valahol az assembly rész hal meg. Kb. két napja keresem, hogy miért. Megőrülök.
Módosítás: a DI parancsot nem tettem bele a lekérdezésbe. Ha jól láttam, ez a megszakításokat tiltaná le. Ez okozhatja? Ha kell bele, utána engedélyezni kell újra a megszakításokat?