mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-17 10:20:35 +03:00
322 lines
5.8 KiB
NASM
322 lines
5.8 KiB
NASM
|
||
;[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
|
||
*/
|
||
; |