;[BEGIN] ;//MODULE: DOS_FM ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ; ;--------------------------------------------------------------- ;FMS DB FMCOUNT ;ACCESS MODE: ; 00 - READ/WRITE ; 01 - READ ; 02 - WRITE ;FM_BUF: ;File Manipulator (FM) ; BYTE '. ' ;+00 NAME ; BYTE ' ' ;+08 EXT ; BYTE #10 ;+11 ATTRIBUT ; BYTE 0 ;+12 RESERVED; !TODO следующий кластер для чтения ; BYTE 0 ;+13 RESERVED; !TODO следующий кластер для записи ; BLOCK 8,0 ;+14 RESERVED ; WORD #0000 ;+22 TIME ; WORD #0000 ;+24 DATE ; WORD #0000 ;+26 START CLUSTER ; DWORD #0000 ;+28 SIZE FILE ; DWORD #0000 ;+32 FILE POSITION (FP) ; WORD #0000 ;+36 DIRECTORY CLUSTER ; WORD #0000 ;+38 HANDLE NUMBER ; BYTE #00 ;+40 DRIVE OR CURRENT ; BYTE #00 ;+41 ACCESS MODE ; BYTE #00 ;+42 TASK ; BYTE #00 ;+43 EMPTY /* ;!TEST FM_BUF: _sFM .Size EQU _sFM BLOCK (FMCOUNT-1)*FM_BUF.Size, 0 */ ; на выходе без ошибок IY указывает на файловый манипулятор MACRO _mFM_FIND CP FMCOUNT+1 JR NC,ABS_FM PUSH DE LD IY,CORE_BUFFERS.FM_BUF LD DE,CORE_BUFFERS.FM_BUF.Size AND A JR Z,.endLoop .loop: ADD IY,DE DEC A JR NZ,.loop .endLoop: POP DE ; A=0 OR (IY) ;+00 NAME ENDM //////////////////////////////////////////////////////////////////////// SET_FM: _mFM_FIND LD A,DSS_Error.sys.NO_ERROR RET NZ ABS_FM LD A,DSS_Error.sys.INVALID_HANDLE SCF RET RES_FM: _mFM_FIND LD A,DSS_Error.sys.INVALID_HANDLE ;EXX SCF RET Z XOR A LD (IY + _sFM.FS_REC.NAME),A RET ; GET_FM: LD B,FMCOUNT LD C,#FF LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size LD DE,CORE_BUFFERS.FM_BUF.Size .loop: ADD IY,DE INC C LD A,(IY + _sFM.FS_REC.NAME) OR A RET Z DJNZ .loop LD A,DSS_Error.sys.NO_HANDLES SCF RET /* ;!TEST CHECK LOCKING 10/11/2023 GET_FM: LD IY,0 LD (.freeHandle),IY ; LD B,FMCOUNT LD C,#FF LD IY,CORE_BUFFERS.FM_BUF - CORE_BUFFERS.FM_BUF.Size LD DE,CORE_BUFFERS.FM_BUF.Size .loop: ADD IY,DE INC C ; CHECK LOCKING ; .cont: LD A,(IY+0) OR A RET Z DJNZ .loop LD A,DSS_Error.sys.NO_HANDLES SCF RET */ ; HL:IX - OFFSET POINTER ; A - FILE MANIPULATOR MOVE_FP: CALL SET_FM RET C INC B DEC B JR Z,.F_start DEC B JR Z,.F_current DEC B JR Z,.B_end LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET ;from Start File .F_start: ; B=0 LD C,B LD D,B LD E,B JP .DO ;from End File .B_end: LD C,(IY + _sFM.FS_REC.F_SIZE) LD B,(IY + _sFM.FS_REC.F_SIZE+1) LD E,(IY + _sFM.FS_REC.F_SIZE+2) LD D,(IY + _sFM.FS_REC.F_SIZE+3) JP .DO ;from Current Position .F_current: LD C,(IY+_sFM.F_POSITION) LD B,(IY+_sFM.F_POSITION+1) LD E,(IY+_sFM.F_POSITION+2) LD D,(IY+_sFM.F_POSITION+3) .DO: ADD IX,BC ADC HL,DE LD D,XH LD E,XL LD (IY+_sFM.F_POSITION),E LD (IY+_sFM.F_POSITION+1),D LD (IY+_sFM.F_POSITION+2),L LD (IY+_sFM.F_POSITION+3),H XOR A RET ;FP COMPARE ; CY - FILE POINTER > SIZE ; NC - FILE POINTER < SIZE MOVE_CP: LD L,(IY + _sFM.FS_REC.F_SIZE) LD H,(IY + _sFM.FS_REC.F_SIZE+1) LD E,(IY + _sFM.F_POSITION) LD D,(IY + _sFM.F_POSITION+1) AND A SBC HL,DE LD L,(IY + _sFM.FS_REC.F_SIZE+2) LD H,(IY + _sFM.FS_REC.F_SIZE+3) LD E,(IY + _sFM.F_POSITION+2) LD D,(IY + _sFM.F_POSITION+3) SBC HL,DE RET ;