cdx/cd_dos.a80
savelij13 194e7a1fca Версия 1.03
- поправлен cdx.txt
- добалена возможность послать ATAPI пакет.
- если нет диска в приводе, то не пишет ошибку, что нет привода
2025-07-07 19:49:39 +03:00

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
;