mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
208 lines
4.3 KiB
NASM
208 lines
4.3 KiB
NASM
|
||
;[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
|
||
; CCF
|
||
; RET C
|
||
; 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
|
||
; RET
|
||
; ENDM
|
||
////////////////////////////////////////////////////////////////////////
|
||
|
||
; ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ä ©«®¢ë© ¬ ¨¯ã«ïâ®à
|
||
FM_FIND: CP FMCOUNT+1
|
||
JR NC,.error
|
||
;
|
||
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
|
||
RET
|
||
;
|
||
.error: XOR A
|
||
LD A,DSS_Error.sys.INVALID_HANDLE
|
||
RET
|
||
|
||
SET_FM: CALL FM_FIND
|
||
; error
|
||
;LD A,DSS_Error.sys.INVALID_HANDLE
|
||
; CF = 1
|
||
SCF
|
||
RET Z
|
||
; no error
|
||
XOR A ;LD A,DSS_Error.sys.NO_ERROR
|
||
; CF = 0
|
||
RET
|
||
|
||
|
||
|
||
RES_FM: CALL FM_FIND
|
||
; error
|
||
; LD A,DSS_Error.sys.INVALID_HANDLE
|
||
SCF
|
||
RET Z
|
||
; no error
|
||
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
|
||
/*
|
||
;!TODO 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
|
||
DJNZ .B_1
|
||
;from Start File
|
||
; B=0
|
||
.F_start: LD C,B
|
||
LD D,B
|
||
LD E,B
|
||
JP .DO
|
||
;
|
||
.B_1: DJNZ .B_2
|
||
;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
|
||
;
|
||
.B_2: DJNZ .error
|
||
;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
|
||
; B > 2
|
||
.error: LD A,DSS_Error.sys.INVALID_FUNCTION
|
||
SCF
|
||
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
|
||
; |