;[BEGIN] ;//MODULE: DOS_FM ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R01 16-11-1999 DNS ERROR READING FAT CHAIN ;--------------------------------------------------------------- ;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 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+0),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+0) 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.F_SIZE) LD B,(IY+_sFM.F_SIZE+1) LD E,(IY+_sFM.F_SIZE+2) LD D,(IY+_sFM.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.F_SIZE) LD H,(IY+_sFM.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.F_SIZE+2) LD H,(IY+_sFM.F_SIZE+3) LD E,(IY+_sFM.F_POSITION+2) LD D,(IY+_sFM.F_POSITION+3) SBC HL,DE RET ; HL:DE / C => DE:IX HL-OSTATOK (DE:BC.HL). Легко переделать под HL:DE / A => HL:DE.A DIV_for_SPC: LD A,C DEC A JR Z,.exit ; AND E LD B,A ; остаток LD A,C RRCA ; .loop: SRL H : RR L RR D : RR E RRCA JP NC,.loop LD A,B ; .exit: LD XH,D LD XL,E EX DE,HL LD H,0 LD L,A RET ; DIV32: LD A,#FF ; LD B,E ; .loop: SRL C ; JR C,.exitLoop ; SRL H : RR L : RR D : RR E : SLA A ; JP .loop ; .exitLoop: ; CPL ; AND B ; LD XH,D ; LD XL,E ; EX DE,HL ; LD H,0 ; LD L,A ; RET /* DEFINE NEW_DIV 1 DIV32: LD XH,D LD XL,E IFN NEW_DIV EX DE,HL LD HL,0 LD A,#20 DIV001: ADD IX,IX EX DE,HL ADC HL,HL EX DE,HL ADC HL,HL SBC HL,BC JR NC,DIV002 ADD HL,BC DEC A JR NZ,DIV001 RET DIV002: INC IX DEC A JR NZ,DIV001 RET ELSE div32_16: ;HLIX/BC -> HLIX remainder DE ;174+4*div32_16_sub8 ;min: 2186cc ;max: 2794cc ;avg: 2466cc ;61 bytes ex de,hl ; 4 ; Negate BC to allow add instead of sbc xor a ; 4 ; Need to set HL to 0 anyways, so save 2cc and a byte ld h,a ; 4 ld l,a ; 4 sub c ; 4 ld c,a ; 4 sbc a,a ; 4 sub b ; 4 ld b,a ; 4 ld a,d ; 4 call div32_16_sub8 ; 17 rla ; 4 ld d,a ; 4 ld a,e ; 4 call div32_16_sub8 ; 17 rla ; 4 ld e,a ; 4 ld a,ixh ; 8 call div32_16_sub8 ; 17 rla ; 4 ld ixh,a ; 8 ld a,ixl ; 8 call div32_16_sub8 ; 17 rla ; 4 ld ixl,a ; 8 ;ex de,hl ; 4 ret ; 10 div32_16_sub8: ;119+8*div32_16_sub ;min: 503cc ;max: 655cc ;avg: 573cc call 1F 1: ;17+2(17+2(div32_16_sub))) call 1F 1: ;17+2(div32_16_sub) call div32_16_sub div32_16_sub: ;48+{8,0+{0,19}} ;min: 48cc ;max: 67cc ;avg: 56.75cc rla ; 4 adc hl,hl ; 15 jr c,1F ;12/7 add hl,bc ; 11 ret c ;11/5 sbc hl,bc ; 15 ret ; 10 1: add hl,bc ; 11 scf ; 4 ret ; 10 ENDIF */ ;