
- поправлен cdx.txt - добалена возможность послать ATAPI пакет. - если нет диска в приводе, то не пишет ошибку, что нет привода
1225 lines
15 KiB
Plaintext
1225 lines
15 KiB
Plaintext
|
|
; LAST UPDATE: 29.06.2025 savelij
|
|
|
|
PAGE0 EQU 0x82 ;WIN 0x0000-0x3FFF
|
|
PAGE1 EQU 0xA2 ;WIN 0x4000-0x7FFF
|
|
PAGE2 EQU 0xC2 ;WIN 0x8000-0xBFFF
|
|
PAGE3 EQU 0xE2 ;WIN 0xC000-0xFFFF
|
|
|
|
ADRDIR EQU 0xC000
|
|
|
|
DIRPAGE EQU 0
|
|
|
|
DAY EQU 19
|
|
MONTH EQU 05
|
|
YEAR EQU 2002
|
|
|
|
NAM EQU 0
|
|
EXT EQU 8
|
|
ATR EQU 11
|
|
|
|
CLU3 EQU 20
|
|
CLU4 EQU 21
|
|
|
|
TIM1 EQU 22
|
|
TIM2 EQU 23
|
|
DAT1 EQU 24
|
|
DAT2 EQU 25
|
|
CLU1 EQU 26
|
|
CLU2 EQU 27
|
|
LEN1 EQU 28
|
|
LEN2 EQU 29
|
|
LEN3 EQU 30
|
|
LEN4 EQU 31
|
|
POS1 EQU 32
|
|
POS2 EQU 33
|
|
POS3 EQU 34
|
|
POS4 EQU 35
|
|
DIRCLU1 EQU 36
|
|
DIRCLU2 EQU 37
|
|
HND1 EQU 38
|
|
HND2 EQU 39
|
|
FDRV EQU 40
|
|
AMODE EQU 41
|
|
FTASK EQU 42
|
|
|
|
;ACCESS MODE:
|
|
; 00 - READ/WRITE
|
|
; 01 - READ
|
|
; 02 - WRITE
|
|
|
|
;File Manipulator (FM)
|
|
FM_BUF DB ". " ;+00 NAME
|
|
DB " " ;+08 EXT
|
|
DB 0x10 ;+11 ATTRIBUT
|
|
DB 0,0,0,0,0,0,0,0,0,0 ;+12 RESERVED
|
|
DW 0x0000 ;+22 TIME
|
|
DW 0x0000 ;+24 DATE
|
|
DW 0x0000 ;+26 START CLUSTER
|
|
DW 0x0000,0x0000 ;+28 SIZE FILE
|
|
DW 0x0000,0x0000 ;+32 FILE POSITION (FP)
|
|
DW 0x0000 ;+36 DIRECTORY CLUSTER
|
|
DW 0x0000 ;+38 HANDLE NUMBER
|
|
DB 0x00 ;+40 DRIVE OR CURRENT
|
|
DB 0x00 ;+41 ACCESS MODE
|
|
DB 0x00 ;+42 TASK
|
|
DB 0x00 ;+43 EMPTY
|
|
END_FM
|
|
;End of FM
|
|
; DS 44*2
|
|
|
|
FM_SIZE EQU END_FM-FM_BUF
|
|
|
|
SET_FM PUSH DE
|
|
INC A
|
|
LD IY,FM_BUF-FM_SIZE
|
|
LD DE,FM_SIZE
|
|
SET_FM1 ADD IY,DE
|
|
DEC A
|
|
JR NZ,SET_FM1
|
|
POP DE
|
|
LD A,(IY+0)
|
|
OR A
|
|
LD A,0
|
|
RET NZ
|
|
LD A,5
|
|
SCF
|
|
RET
|
|
|
|
; HL:IX - OFFSET POINTER
|
|
; A - FILE MANIPULATOR
|
|
|
|
MOVE_FP CALL SET_FM
|
|
RET C
|
|
INC B
|
|
DEC B
|
|
JP Z,MOVE_FA
|
|
DEC B
|
|
JP Z,MOVE_FB
|
|
DEC B
|
|
JP Z,MOVE_FC
|
|
LD A,1
|
|
SCF
|
|
RET
|
|
|
|
;from Start File
|
|
MOVE_FA LD BC,0
|
|
LD DE,0
|
|
JR MOVE_F1
|
|
|
|
;from End File
|
|
MOVE_FC LD C,(IY+28)
|
|
LD B,(IY+29)
|
|
LD E,(IY+30)
|
|
LD D,(IY+31)
|
|
JR MOVE_F1
|
|
|
|
;from Current Position
|
|
MOVE_FB LD C,(IY+32)
|
|
LD B,(IY+33)
|
|
LD E,(IY+34)
|
|
LD D,(IY+35)
|
|
MOVE_F1 ADD IX,BC
|
|
ADC HL,DE
|
|
LD D,IXH
|
|
LD E,IXL
|
|
LD (IY+32),E
|
|
LD (IY+33),D
|
|
LD (IY+34),L
|
|
LD (IY+35),H
|
|
XOR A
|
|
RET
|
|
|
|
;FP COMPARE
|
|
; CY - FILE POINTER > SIZE
|
|
; NC - FILE POINTER < SIZE
|
|
|
|
MOVE_CP LD L,(IY+28)
|
|
LD H,(IY+29)
|
|
LD E,(IY+32)
|
|
LD D,(IY+33)
|
|
AND A
|
|
SBC HL,DE
|
|
LD L,(IY+30)
|
|
LD H,(IY+31)
|
|
LD E,(IY+34)
|
|
LD D,(IY+35)
|
|
SBC HL,DE
|
|
RET
|
|
|
|
CHANGEDISK: LD A,(CDDRIVE)
|
|
; LD C,BIOS.DRV_RESET
|
|
; RST ToBIOS
|
|
SPBIOS BIOSF.DRV_RESET
|
|
JR NC,.cont
|
|
;
|
|
CP ERR_DRV.ATAPI_UnitAttention;BIOS.Error.ATAPI.UnitAttention
|
|
JR Z,.drv_change
|
|
;
|
|
CP ERR_DRV.ATAPI_NotReady;BIOS.Error.ATAPI.NotReady
|
|
SCF
|
|
RET NZ
|
|
LD A,ERR_DSS.NOT_READY;DSS_Error.sys.NOT_READY
|
|
RET
|
|
;
|
|
.drv_change: LD A,(CDDRIVE)
|
|
CALL SAVE_MEDIA_CHANGED
|
|
;
|
|
.cont: CALL INITDISK
|
|
RET C
|
|
AND A
|
|
RET
|
|
|
|
; NDISK11 CP BIOS.Error.ATAPI.NotReady
|
|
; SCF
|
|
; RET NZ
|
|
; ;
|
|
; LD A,DSS_Error.sys.NOT_READY
|
|
; RET
|
|
|
|
INITDISK:
|
|
LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
LD B,4
|
|
CD_I_LP PUSH BC
|
|
LD DE,ADRDIR
|
|
LD A,(CDDRIVE)
|
|
LD HL,0x0000
|
|
LD IX,0x0010
|
|
; LD BC,1*256 + BIOS.DRV_READ
|
|
; RST ToBIOS
|
|
SPBIOS BIOSF.DRV_READ,1
|
|
POP BC
|
|
JR NC,CD_I_OK
|
|
DJNZ CD_I_LP
|
|
UNKCD POP AF
|
|
OUT (PAGE3),A
|
|
LD A,ERR_DSS.UNKNOWN_FORMAT;DSS_Error.sys.UNKNOWN_FORMAT
|
|
SCF
|
|
RET
|
|
|
|
CD_I_OK LD HL,ADRDIR
|
|
LD A,(HL)
|
|
INC HL
|
|
CP 0x01
|
|
JR NZ,UNKCD
|
|
LD A,(HL)
|
|
INC HL
|
|
CP "C"
|
|
JR NZ,UNKCD
|
|
LD A,(HL)
|
|
INC HL
|
|
CP "D"
|
|
JR NZ,UNKCD
|
|
LD HL,ADRDIR+0x009E
|
|
LD DE,ROOTDIR
|
|
LDI
|
|
LDI
|
|
LDI
|
|
LDI
|
|
LD HL,ADRDIR+0x00A6
|
|
LD DE,ROOTLEN
|
|
LDI
|
|
LDI
|
|
LDI
|
|
LDI
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
; LD HL,0
|
|
; LD (FATCASH),HL
|
|
XOR A
|
|
RET
|
|
|
|
|
|
;----------------------------------------------
|
|
|
|
OPEN LD (ACCESS),A
|
|
CALL GETWORD
|
|
RET C
|
|
LD HL,TMPNAME
|
|
LD DE,MASKARE
|
|
CALL MASK
|
|
RET C
|
|
OPENEXE CALL SEARCH
|
|
RET C
|
|
LD A,1 ;;
|
|
CALL SET_FM ;; CALL GET_FM
|
|
RET C
|
|
LD A,C
|
|
EX AF,AF'
|
|
EXX
|
|
LD (IY+HND1),E
|
|
LD (IY+HND2),D
|
|
EXX
|
|
LD D,IYH
|
|
LD E,IYL
|
|
LD HL,HANDBUF
|
|
LD BC,0x0020
|
|
LDIR
|
|
LD A,(ACCESS)
|
|
LD (IY+AMODE),A
|
|
;; LD A,(TASK)
|
|
XOR A ;;
|
|
LD (IY+FTASK),A
|
|
XOR A
|
|
LD (IY+POS1),A
|
|
LD (IY+POS2),A
|
|
LD (IY+POS3),A
|
|
LD (IY+POS4),A
|
|
;; LD A,(DRIVE)
|
|
; XOR A ;;
|
|
; LD (IY+FDRV),A
|
|
LD HL,FM_BUF+CLU1
|
|
LD E,(HL)
|
|
INC HL
|
|
LD D,(HL)
|
|
LD (IY+DIRCLU1),E
|
|
LD (IY+DIRCLU2),D
|
|
|
|
LD C,(IY+CLU1)
|
|
LD B,(IY+CLU2)
|
|
LD E,(IY+CLU3)
|
|
LD D,(IY+CLU4)
|
|
EX DE,HL
|
|
PUSH BC
|
|
POP IX
|
|
LD C,(IY+LEN1)
|
|
LD B,(IY+LEN2)
|
|
LD E,(IY+LEN3)
|
|
LD D,(IY+LEN4)
|
|
EX AF,AF'
|
|
AND A
|
|
RET
|
|
|
|
;RET
|
|
; HL:IX - SECTOR
|
|
; DE:BC - SIZE IN BYTES
|
|
|
|
;PATH0 DEFW 0x0000
|
|
|
|
ACCESS DEFB 0x00
|
|
|
|
HANDBUF DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
|
|
|
|
WRT_HND LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
LD IX,ADRDIR
|
|
EXX
|
|
LD DE,0
|
|
EXX
|
|
WRT_HN1 LD A,(IX+00)
|
|
OR A
|
|
JR Z,WRT_HN2
|
|
CP 0xE5
|
|
JR Z,WRT_HN2
|
|
LD BC,0x0020
|
|
ADD IX,BC
|
|
JR NC,WRT_HN1
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
LD A,9
|
|
SCF
|
|
RET
|
|
|
|
WRT_HN2 LD D,IXH
|
|
LD E,IXL
|
|
LD HL,HANDBUF
|
|
LD BC,0x0020
|
|
LDIR
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
LD HL,ADRDIR
|
|
LD BC,(DIRSIZE)
|
|
DEC BC
|
|
ADD HL,BC
|
|
AND A
|
|
SBC HL,DE
|
|
RET NC
|
|
LD HL,(DIRSIZE)
|
|
LD BC,0x0020
|
|
ADD HL,BC
|
|
LD (DIRSIZE),HL
|
|
AND A
|
|
RET
|
|
|
|
GETNAME LD BC,0x08FF
|
|
GETN1 LD A,(HL)
|
|
CP " "
|
|
JR NZ,GETN3
|
|
GETN2 INC HL
|
|
DJNZ GETN2
|
|
JR GETN4
|
|
GETN3 LDI
|
|
DJNZ GETN1
|
|
GETN4 LD A,(HL)
|
|
CP " "
|
|
LD A,"."
|
|
JR NZ,GETN5
|
|
LD A,0x00
|
|
GETN5 LD (DE),A
|
|
INC DE
|
|
RET Z
|
|
LD B,0x03
|
|
GETN6 LD A,(HL)
|
|
CP " "
|
|
RET Z
|
|
LDI
|
|
XOR A
|
|
LD (DE),A
|
|
DJNZ GETN6
|
|
RET
|
|
|
|
DTABUF DEFW 0x0000
|
|
CURHND DEFW 0x0000
|
|
NO_NEXT DEFB 0x00
|
|
FNDMODE DEFB 0x00
|
|
|
|
F_FIRST LD (ACCESS),A
|
|
LD (DTABUF),DE
|
|
LD A,B
|
|
LD (FNDMODE),A
|
|
PUSH HL
|
|
CALL LOADDIR
|
|
POP HL
|
|
CALL GETWORD
|
|
RET C
|
|
LD HL,TMPNAME
|
|
LD DE,MASKARE
|
|
CALL MASK
|
|
RET C
|
|
LD A,(ACCESS)
|
|
CALL ASEARCH
|
|
RET C
|
|
LD HL,MASKARE
|
|
LD DE,(DTABUF)
|
|
LD BC,11
|
|
LDIR
|
|
LD A,(ACCESS)
|
|
LD (DE),A
|
|
INC DE
|
|
FIND_S LD BC,0x0020
|
|
ADD IX,BC
|
|
LD (CURHND),IX
|
|
LD HL,HANDBUF+12
|
|
LD BC,20
|
|
LDIR
|
|
LD A,(HANDBUF+11)
|
|
LD (DE),A
|
|
INC DE
|
|
LD HL,HANDBUF
|
|
LD A,(FNDMODE)
|
|
OR A
|
|
JR NZ,FIND_M2
|
|
LD BC,11
|
|
LDIR
|
|
LD A,0xFF
|
|
LD (NO_NEXT),A
|
|
XOR A
|
|
RET
|
|
FIND_M2 CALL GETNAME
|
|
LD A,0xFF
|
|
LD (NO_NEXT),A
|
|
XOR A
|
|
RET
|
|
|
|
F_NEXT LD A,(NO_NEXT)
|
|
OR A
|
|
LD A,14
|
|
SCF
|
|
RET Z
|
|
LD (DTABUF),DE
|
|
LD DE,MASKARE
|
|
LD HL,(DTABUF)
|
|
LD BC,11
|
|
LDIR
|
|
LD A,(HL)
|
|
PUSH HL
|
|
CALL NSEARCH
|
|
POP DE
|
|
EX AF,AF'
|
|
XOR A
|
|
LD (NO_NEXT),A
|
|
EX AF,AF'
|
|
RET C
|
|
INC DE
|
|
JP FIND_S
|
|
|
|
NSEARCH EX AF,AF'
|
|
LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
EX AF,AF'
|
|
CPL
|
|
LD C,A
|
|
LD IX,(CURHND)
|
|
EXX
|
|
LD DE,0
|
|
EXX
|
|
JP SEARCH1
|
|
|
|
DSEARCH LD A,0x10
|
|
CALL ASEARCH
|
|
RET NC
|
|
LD A,4
|
|
RET
|
|
|
|
SEARCH LD A,0x23
|
|
ASEARCH EX AF,AF'
|
|
LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
EX AF,AF'
|
|
CPL
|
|
LD C,A
|
|
LD IX,ADRDIR
|
|
EXX
|
|
LD DE,0
|
|
EXX
|
|
SEARCH1 LD A,(IX+00)
|
|
OR A
|
|
JR Z,SEARCH4
|
|
CP 0xE5
|
|
JR Z,SEARCH3
|
|
LD A,(IX+11)
|
|
AND C
|
|
JR NZ,SEARCH3
|
|
LD HL,MASKARE
|
|
LD D,IXH
|
|
LD E,IXL
|
|
LD B,11
|
|
EX DE,HL
|
|
SEARCH2 LD A,(DE)
|
|
CP "?"
|
|
JR Z,SEARCH5
|
|
CP (HL)
|
|
JR NZ,SEARCH3
|
|
SEARCH5 INC HL
|
|
INC DE
|
|
DJNZ SEARCH2
|
|
LD D,IXH
|
|
LD E,IXL
|
|
LD HL,HANDBUF
|
|
EX DE,HL
|
|
LD BC,0x0020
|
|
LDIR
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
AND A
|
|
RET
|
|
|
|
SEARCH3 EXX
|
|
INC DE
|
|
EXX
|
|
LD DE,0x0020
|
|
ADD IX,DE
|
|
JR NC,SEARCH1
|
|
SEARCH4 POP AF
|
|
OUT (PAGE3),A
|
|
LD A,3
|
|
SCF
|
|
RET
|
|
|
|
GETWORD LD DE,TMPNAME
|
|
LD BC,0x0DFF
|
|
GETWRD1 LD A,(HL)
|
|
INC HL
|
|
CP '\\'
|
|
JR Z,DIRNAME
|
|
CP ":"
|
|
JR Z,DRVNAME
|
|
LD (DE),A
|
|
INC DE
|
|
CP 0x21
|
|
CCF
|
|
RET NC
|
|
DJNZ GETWRD1
|
|
LD A,16
|
|
SCF
|
|
RET
|
|
|
|
DIRNAME LD A,0x00
|
|
LD (DE),A
|
|
PUSH HL
|
|
LD HL,TMPNAME
|
|
CALL OPENDIR
|
|
POP HL
|
|
JP NC,GETWORD
|
|
RET
|
|
|
|
DRVNAME LD A,(TMPNAME)
|
|
CP "a"
|
|
JR C,DRVN2
|
|
CP "{"
|
|
JR NC,DRVN2
|
|
SUB 0x20
|
|
DRVN2 SUB "A"
|
|
PUSH HL
|
|
; CALL OPENDSK
|
|
POP HL
|
|
JP NC,GETWORD
|
|
RET
|
|
|
|
TMPNAME DB " ",0x00
|
|
|
|
OPENDIR XOR A
|
|
CALL SET_FM
|
|
LD A,(HL)
|
|
OR A
|
|
JP NZ,SUBDIR
|
|
|
|
LD DE,(ROOTDIR+0)
|
|
LD (IY+CLU1),E
|
|
LD (IY+CLU2),D
|
|
LD DE,(ROOTDIR+2)
|
|
LD (IY+CLU3),E
|
|
LD (IY+CLU4),D
|
|
|
|
LD DE,(ROOTLEN+0)
|
|
LD (IY+LEN1),E
|
|
LD (IY+LEN2),D
|
|
LD DE,(ROOTLEN+2)
|
|
LD (IY+LEN3),E
|
|
LD (IY+LEN4),D
|
|
|
|
CALL LOADDIR
|
|
LD HL,DIRSPEC
|
|
LD (HL),'\\'
|
|
INC HL
|
|
LD (HL),0x00
|
|
AND A
|
|
RET
|
|
|
|
SUBDIR CP "."
|
|
JR NZ,SUBDIR2
|
|
EXX
|
|
LD HL,MASKARE
|
|
LD DE,MASKARE+1
|
|
LD BC,10
|
|
LD (HL),0x20
|
|
LDIR
|
|
EXX
|
|
LD DE,MASKARE
|
|
SUBDIR0 LDI
|
|
LD A,(HL)
|
|
OR A
|
|
JR NZ,SUBDIR0
|
|
JR SUBDIR3
|
|
|
|
SUBDIR2 LD DE,MASKARE
|
|
CALL MASK
|
|
RET C
|
|
SUBDIR3 CALL FINDDIR
|
|
RET C
|
|
LD (IY+CLU1),E
|
|
LD (IY+CLU2),D
|
|
LD (IY+CLU3),C
|
|
LD (IY+CLU4),B
|
|
EXX
|
|
LD (IY+LEN1),E
|
|
LD (IY+LEN2),D
|
|
LD (IY+LEN3),C
|
|
LD (IY+LEN4),B
|
|
EXX
|
|
CALL LOADDIR
|
|
AND A
|
|
RET
|
|
|
|
|
|
|
|
FINDD03 LD BC,0x0020
|
|
ADD IX,BC
|
|
JR NC,FINDD01
|
|
FINDD04 POP AF
|
|
OUT (PAGE3),A
|
|
LD A,4
|
|
SCF
|
|
RET
|
|
|
|
; FIND "MASKAREA" IN DIRECTORY
|
|
|
|
FINDDIR LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
LD IX,ADRDIR
|
|
FINDD01 LD A,(IX+00)
|
|
OR A
|
|
JR Z,FINDD04
|
|
CP 0xE5
|
|
JR Z,FINDD03
|
|
LD A,(IX+11)
|
|
AND 0x10
|
|
JR Z,FINDD03
|
|
LD HL,MASKARE
|
|
LD D,IXH
|
|
LD E,IXL
|
|
EX DE,HL
|
|
LD B,11
|
|
FINDD02 LD A,(DE)
|
|
CP "?"
|
|
JR Z,FINDD05
|
|
CP (HL)
|
|
JR NZ,FINDD03
|
|
FINDD05 INC HL
|
|
INC DE
|
|
DJNZ FINDD02
|
|
LD A,(IX+0)
|
|
CP "."
|
|
JP NZ,ADDSPEC
|
|
LD A,(IX+1)
|
|
CP "."
|
|
JP NZ,IT_DIR
|
|
LD HL,DIRSPEC
|
|
LD D,H
|
|
LD E,L
|
|
LD BC,0x100
|
|
XOR A
|
|
CPIR
|
|
LD BC,0x100
|
|
LD A,'\\'
|
|
CPDR
|
|
INC HL
|
|
AND A
|
|
EX DE,HL
|
|
SBC HL,DE
|
|
EX DE,HL
|
|
JR NZ,ROTZ
|
|
INC HL
|
|
ROTZ LD (HL),0
|
|
IT_DIR LD E,(IX+CLU1)
|
|
LD D,(IX+CLU2)
|
|
LD C,(IX+CLU3)
|
|
LD B,(IX+CLU4)
|
|
EXX
|
|
LD E,(IX+LEN1)
|
|
LD D,(IX+LEN2)
|
|
LD C,(IX+LEN3)
|
|
LD B,(IX+LEN4)
|
|
EXX
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
AND A
|
|
RET
|
|
|
|
ADDSPEC LD E,IXL
|
|
LD D,IXH
|
|
LD HL,DIRSPEC
|
|
LD BC,0xFF
|
|
XOR A
|
|
CPIR
|
|
DEC HL
|
|
DEC HL
|
|
LD A,'\\'
|
|
CP (HL)
|
|
INC HL
|
|
JR Z,ADDSPE0
|
|
LD (HL),A
|
|
INC HL
|
|
ADDSPE0 LD BC,0x0820
|
|
MM1 LD A,(DE)
|
|
INC DE
|
|
CP C
|
|
JR Z,MM2
|
|
LD (HL),A
|
|
INC HL
|
|
MM2 DJNZ MM1
|
|
LD A,(DE)
|
|
INC DE
|
|
CP C
|
|
JR Z,MM3
|
|
LD (HL),"."
|
|
INC HL
|
|
LD (HL),A
|
|
INC HL
|
|
LD A,(DE)
|
|
INC DE
|
|
CP C
|
|
JR Z,MM3
|
|
LD (HL),A
|
|
INC HL
|
|
LD A,(DE)
|
|
CP C
|
|
JR Z,MM3
|
|
LD (HL),A
|
|
INC HL
|
|
MM3 LD (HL),0
|
|
JP IT_DIR
|
|
|
|
CURRDIR EX DE,HL
|
|
LD HL,DIRSPEC
|
|
CURDIR1 LD A,(HL)
|
|
OR A
|
|
LDI
|
|
JP NZ,CURDIR1
|
|
RET
|
|
|
|
LOADDIR XOR A
|
|
LD HL,0
|
|
LD IX,0
|
|
LD B,0
|
|
CALL MOVE_FP
|
|
LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
LD B,3
|
|
LOADFFF PUSH BC
|
|
LD HL,0xC000
|
|
LD DE,0xC001
|
|
LD BC,0x3FFF
|
|
LD (HL),L
|
|
LDIR
|
|
; LD A,(DRIVE)
|
|
; LD (IY+FDRV),A
|
|
; LD C,(IY+LEN1)
|
|
LD C,(IY+LEN2)
|
|
LD B,(IY+LEN3)
|
|
LD E,(IY+LEN4)
|
|
LD D,0
|
|
SRL D
|
|
RR E
|
|
RR B
|
|
RR C
|
|
SRL D
|
|
RR E
|
|
RR B
|
|
RR C
|
|
SRL D
|
|
RR E
|
|
RR B
|
|
RR C
|
|
LD E,(IY+CLU1)
|
|
LD D,(IY+CLU2)
|
|
LD L,(IY+CLU3)
|
|
LD H,(IY+CLU4)
|
|
LD IXH,D
|
|
LD IXL,E
|
|
LD B,C
|
|
LD A,B
|
|
OR A
|
|
JR Z,ERRLEND
|
|
CP 0x08
|
|
JR C,NORLEND
|
|
LD B,8
|
|
NORLEND
|
|
LD A,(CDDRIVE)
|
|
; LD C,BIOS.DRV_READ
|
|
LD DE,ADRDIR
|
|
; RST ToBIOS
|
|
SPBIOS BIOSF.DRV_READ
|
|
POP BC
|
|
JR NC,LOADMMM
|
|
DEC B
|
|
JP NZ,LOADFFF
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
SCF
|
|
LD A,20
|
|
RET
|
|
|
|
ERRLEND POP BC
|
|
POP AF
|
|
OUT (PAGE3),A
|
|
SCF
|
|
LD A,20
|
|
RET
|
|
|
|
LOADMMM POP AF
|
|
OUT (PAGE3),A
|
|
CALL CORRDIR
|
|
AND A
|
|
RET
|
|
|
|
CORRDIR LD A,DIRPAGE
|
|
CALL BANK
|
|
PUSH AF
|
|
LD HL,ADRDIR
|
|
LD DE,ADRDIR
|
|
CORRL1 PUSH DE
|
|
LD C,(HL)
|
|
LD B,0
|
|
LD DE,ENTRYBF
|
|
LDIR
|
|
POP DE
|
|
PUSH HL
|
|
LD HL,FCDFLEN
|
|
LD C,(HL)
|
|
LD B,0
|
|
ADD HL,BC
|
|
INC HL
|
|
LD (HL),0
|
|
SBC HL,BC
|
|
PUSH DE
|
|
CALL MASK
|
|
POP HL
|
|
LD BC,11
|
|
ADD HL,BC
|
|
LD A,(FCDFLAG)
|
|
BIT 1,A ;IS IT DIR?
|
|
; AND 2
|
|
LD C,0x01 ;ATTRIBUT FILE
|
|
JR Z,CORRL0
|
|
LD C,0x10 ;ATTRIBUT DIRECTORY
|
|
CORRL0 BIT 0,A ;IS IT HIDDEN
|
|
JR Z,CORRL00
|
|
SET 1,C
|
|
CORRL00
|
|
LD (HL),C
|
|
INC HL
|
|
XOR A
|
|
LD B,8
|
|
FILLCDN LD (HL),A
|
|
INC HL
|
|
DJNZ FILLCDN
|
|
LD A,(FCDSEC+2)
|
|
LD (HL),A
|
|
INC HL
|
|
LD A,(FCDSEC+3)
|
|
LD (HL),A
|
|
INC HL
|
|
;MKDATE
|
|
PUSH HL
|
|
LD A,(FCDYEAR)
|
|
LD IXL,A
|
|
LD IXH,0
|
|
LD DE,1900
|
|
ADD IX,DE
|
|
LD A,(FCDMOUN)
|
|
LD E,A
|
|
LD A,(FCDDAY)
|
|
LD D,A
|
|
LD A,(FCDHOUR)
|
|
LD H,A
|
|
LD A,(FCDMIN)
|
|
LD L,A
|
|
LD A,(FCDSECN)
|
|
LD B,A
|
|
CALL MK_TIME
|
|
POP HL
|
|
; LD DE,0x0000 ;TIME
|
|
LD (HL),E
|
|
INC HL
|
|
LD (HL),D
|
|
INC HL
|
|
; LD DE,0x0000 ;DATE
|
|
LD (HL),C
|
|
INC HL
|
|
LD (HL),B
|
|
INC HL
|
|
|
|
LD DE,(FCDSEC)
|
|
LD (HL),E
|
|
INC HL
|
|
LD (HL),D
|
|
INC HL
|
|
EX DE,HL
|
|
LD HL,FCDLEN
|
|
LDI
|
|
LDI
|
|
LDI
|
|
LDI
|
|
POP HL
|
|
BIT 7,H
|
|
JR Z,CORRL2
|
|
LD A,(HL)
|
|
OR A
|
|
JP NZ,CORRL1
|
|
LD L,0
|
|
INC H
|
|
JR Z,CORRL2
|
|
LD A,(HL)
|
|
OR A
|
|
JP NZ,CORRL1
|
|
CORRL2 XOR A
|
|
LD (DE),A
|
|
LD DE,(ROOTDIR+0)
|
|
LD L,(IY+CLU1)
|
|
LD H,(IY+CLU2)
|
|
AND A
|
|
SBC HL,DE
|
|
JR NZ,CORRL6
|
|
LD DE,(ROOTDIR+2)
|
|
LD L,(IY+CLU3)
|
|
LD H,(IY+CLU4)
|
|
AND A
|
|
SBC HL,DE
|
|
JR NZ,CORRL6
|
|
LD HL,ADRDIR
|
|
LD A,(HL)
|
|
CP " "
|
|
JR NZ,CORRL4
|
|
LD (HL),0xE5
|
|
LD BC,0x0020
|
|
ADD HL,BC
|
|
LD A,(HL)
|
|
CP " "
|
|
JR NZ,CORRL4
|
|
LD (HL),0xE5
|
|
JR CORRL4
|
|
CORRL6 LD HL,ADRDIR
|
|
LD A,(HL)
|
|
CP " "
|
|
JR NZ,CORRL4
|
|
LD (HL),"."
|
|
LD BC,0x0020
|
|
ADD HL,BC
|
|
LD A,(HL)
|
|
CP " "
|
|
JR NZ,CORRL4
|
|
LD (HL),"."
|
|
INC HL
|
|
LD (HL),"."
|
|
CORRL4 POP AF
|
|
OUT (PAGE3),A
|
|
AND A
|
|
RET
|
|
|
|
;SYSTEM ATTRIBUTES
|
|
READONLY_ATR EQU %00000001
|
|
HIDDEN_ATR EQU %00000010
|
|
SYSTEM_ATR EQU %00000100
|
|
ARCHIVE_ATR EQU %00100000
|
|
|
|
ENTRYBF
|
|
DEFB 0x00 ;Entry lenght
|
|
DEFB 0x00 ;XAR in LBN
|
|
FCDSEC DEFW 0x00,0x00 ;Start sector (Intel)
|
|
DEFW 0x00,0x00 ;Start sector (Motorola)
|
|
FCDLEN DEFW 0x00,0x00 ;Lenght file (Intel)
|
|
DEFW 0x00,0x00 ;Lenght file (Motorola)
|
|
FCDYEAR DEFB 0x00 ;Year
|
|
FCDMOUN DEFB 0x00 ;Mount
|
|
FCDDAY DEFB 0x00 ;Day
|
|
FCDHOUR DEFB 0x00 ;Hour
|
|
FCDMIN DEFB 0x00 ;Minute
|
|
FCDSECN DEFB 0x00 ;Second
|
|
DEFB 0x00 ;Reserve
|
|
FCDFLAG DEFB 0x00 ;Flag
|
|
DEFB 0x00 ;Interlive size
|
|
DEFB 0x00 ;Interlive skip factor
|
|
DEFW 0x0000 ;Volume Set Sequence (Intel)
|
|
DEFW 0x0000 ;Volume Set Sequence (Motorola)
|
|
FCDFLEN DEFB 0x00
|
|
DEFSA EQU $-ENTRYBF
|
|
FCDNAME DB 0x100-DEFSA DUP 0
|
|
|
|
ROOTDIR DEFW 0,0
|
|
ROOTLEN DEFW 0,0
|
|
|
|
DIRSIZE DEFW 0
|
|
|
|
BANK LD C,A
|
|
LD B,0
|
|
LD HL,BANKTBL
|
|
ADD HL,BC
|
|
IN A,(PAGE3)
|
|
LD C,PAGE3
|
|
OUTI
|
|
RET
|
|
|
|
BANKTBL DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
|
|
DEFB 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
|
|
|
|
;HANDTA DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
; DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
|
|
MASKARE
|
|
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
|
|
|
; HL - MASK "file*.t??"
|
|
; DE - 11 bytes filename
|
|
; RET: C=2 FILE WITHOUT EXTENTION
|
|
; C=1 FILE WITH EXTENTION
|
|
|
|
MASK PUSH HL
|
|
PUSH DE
|
|
LD H,D
|
|
LD L,E
|
|
INC DE
|
|
LD (HL),0x20
|
|
LD BC,10
|
|
LDIR
|
|
POP DE
|
|
POP HL
|
|
LD A,(HL)
|
|
CP 0x21
|
|
RET C
|
|
LD BC,0x0902
|
|
MASK1 LD A,(HL)
|
|
CP 0x21
|
|
CCF
|
|
RET NC
|
|
CP 0x22
|
|
JR Z,MASK7
|
|
CP "*"
|
|
JR Z,MASK3
|
|
CP "+"
|
|
JR Z,MASK7
|
|
CP ","
|
|
JR Z,MASK7
|
|
CP "."
|
|
JR Z,MASK5
|
|
CP "/"
|
|
JR Z,MASK7
|
|
CP ":"
|
|
JR Z,MASK7
|
|
CP ";"
|
|
JR Z,MASK7
|
|
CP "<"
|
|
JR Z,MASK7
|
|
CP "="
|
|
JR Z,MASK7
|
|
CP ">"
|
|
JR Z,MASK7
|
|
CP "["
|
|
JR Z,MASK7
|
|
CP '\\' ;
|
|
JR Z,MASK7
|
|
CP "]"
|
|
JR Z,MASK7
|
|
CP "|"
|
|
JR Z,MASK7
|
|
CP "a"
|
|
JR C,MASK2
|
|
CP "{"
|
|
JR NC,MASK2
|
|
SUB 0x20
|
|
MASK2 LD (DE),A
|
|
INC HL
|
|
INC DE
|
|
DJNZ MASK1
|
|
MASK7 LD A,16
|
|
SCF
|
|
RET
|
|
|
|
MASK3 LD A,"?"
|
|
INC HL
|
|
DJNZ MASK6
|
|
LD A,16
|
|
SCF
|
|
RET
|
|
|
|
MASK6 LD (DE),A
|
|
INC DE
|
|
DJNZ MASK6
|
|
LD B,1
|
|
JR MASK1
|
|
|
|
MASK5 LD A," "
|
|
INC HL
|
|
DJNZ MASK4
|
|
LD B,4
|
|
DEC C
|
|
JP NZ,MASK1
|
|
LD A,16
|
|
SCF
|
|
RET
|
|
|
|
MASK4 LD (DE),A
|
|
INC DE
|
|
DJNZ MASK4
|
|
LD B,4
|
|
DEC C
|
|
JP NZ,MASK1
|
|
LD A,16
|
|
SCF
|
|
RET
|
|
|
|
SYSTIME LD DE,DAY*256+MONTH ;DAY/MONTH
|
|
LD HL,0x0000 ;HOUR/MINUTE
|
|
LD BC,0x0001 ;SECOND/WEEKDAY
|
|
LD IX,YEAR ;YEAR
|
|
AND A
|
|
RET
|
|
|
|
;INPUT: D - DAY; E - MONTH
|
|
; H - HOUR; L - MINUTE
|
|
; B - SECOND (0...59)
|
|
; IX- YEAR (0...65535)
|
|
;OUTPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
|
|
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
|
|
; (1980-2108)
|
|
|
|
MK_TIME LD A,L
|
|
RLCA
|
|
RLCA
|
|
SLA A
|
|
RL H
|
|
SLA A
|
|
RL H
|
|
SLA A
|
|
RL H
|
|
SRL B
|
|
OR B
|
|
LD L,A
|
|
|
|
LD BC,0xF844 ;(-1980)
|
|
ADD IX,BC
|
|
LD A,E
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
RLCA
|
|
AND 0xF0
|
|
LD B,IXL
|
|
SLA A
|
|
RL B
|
|
OR D
|
|
LD C,A
|
|
EX DE,HL
|
|
AND A
|
|
RET
|
|
|
|
;INPUT: DE - hhhhhmmmmmmsssss h - hour, m - min, s - sec/2
|
|
; BC - yyyyyyymmmmddddd y - year, m - month, d - day
|
|
; (1980-2108)
|
|
;OUTPUT: D - DAY; E - MONTH
|
|
; H - HOUR; L - MINUTE
|
|
; B - SECOND (0...59)
|
|
; IX- YEAR (0...65535)
|
|
|
|
RMKTIME EX DE,HL
|
|
LD A,C
|
|
AND 0x1F
|
|
LD D,A
|
|
SRL B
|
|
RR C
|
|
LD A,C
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
RRCA
|
|
AND 0x0F
|
|
LD E,A
|
|
LD C,B
|
|
LD B,0
|
|
LD IX,1980
|
|
ADD IX,BC
|
|
LD A,L
|
|
AND 0x1F
|
|
ADD A,A
|
|
LD B,A
|
|
SRL H
|
|
RR L
|
|
SRL H
|
|
RR L
|
|
SRL H
|
|
RR L
|
|
SRL L
|
|
SRL L
|
|
AND A
|
|
RET
|
|
|
|
; INPUT: HL - "C:\\DIR\\DIR\\DIR_NAME[\\]",0
|
|
|
|
CHDIR CALL GETWORD
|
|
RET C
|
|
LD HL,TMPNAME
|
|
LD A,(HL)
|
|
OR A
|
|
CALL NZ,OPENDIR
|
|
RET
|
|
; |