Estex-DSS/DSS/DOS_FM.ASM
Anatoliy Belyanskiy c0f126a95c ...
2023-12-16 04:33:15 +10:00

179 lines
3.7 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[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
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
;