небольшие оптимизации

This commit is contained in:
Anatoliy Belyanskiy 2023-07-04 22:57:49 +10:00
parent 35e9b7b9fe
commit 8965dee742

View File

@ -1,613 +0,0 @@
;
; SYSPAGE EQU #FE
; SLOT1 EQU #A2
; SLOT2 EQU #C2
; SLOT3 EQU #E2
; ORG #3CDB
; Disk Driver Specification ver. 2.20
;[]===========================================================[ 0]
;Procedure : Initialization
;
;Function : Initialization device(s)
;
;Input : C = 00h
; IX - Environment
;Output : A = Amount drive support
; HL = Size driver
;[]===========================================================[ 0]
;[]===========================================================[ 1]
;Procedure : Open
;
;Function : Open disk
;
;Input : C = 01h
; A - Drive
;Output : None
;
;[]===========================================================[ 1]
;[]===========================================================[ 2]
;Procedure : Close
;
;Function : Close disk
;
;Input : C = 02h
; A - Drive
;Output : None
;
;[]===========================================================[ 2]
;[]===========================================================[ 3]
;!TODO
;Procedure : Media check
;
;Function : Checking change line
;
;Input : C = 03h
; A - Drive
;Output : A = 00h disk no changed
; A = 0FFh disk changed
;
;[]===========================================================[ 3]
;[]===========================================================[ 4]
;Procedure : Get BPB
;
;Function : Get Block Parameters BIOS
;
;Input : C = 04h
; DE - Address
;Output : None
;
;[]===========================================================[ 4]
;[]===========================================================[ 5]
;Procedure : Input
;
;Function : Input from disk
;
;Input : C = 05h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 5]
;[]===========================================================[ 6]
;Procedure : Output
;
;Function : Output to disk
;
;Input : C = 06h
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
;Output : None
;
;[]===========================================================[ 6]
;[]===========================================================[ 7]
;!TODO
;Procedure : Removable
;
;Function : Checking change line
;
;Input : C = 07h
; A - Drive
;Output : A = 00h Removable
; A = FFh Nonremovable
;
;[]===========================================================[ 7]
;[]===========================================================[ 8]
;Procedure : Generic IOCTL
;
;Function : Generic Input Output Control
;
;Input : C = 08h
; B - Subcommand
; DE = 55AAh Magic Number
; Subcommand
;----------------------
; 00h - Get Device Parameters
; 01h - Read track
; 02h - Test track
; 80h - Set Device Parameters
; 81h - Write track
; 82h - Format track
;Output :
;
;[]===========================================================[ 8]
;[]===========================================================[ 9]
; RESERVED
;[]===========================================================[ 9]
;[]===========================================================[ 10]
;!TODO
;Procedure : Read Long
;
;Function : Reading sectors from disk
;
;Input : C = 0Ah
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 10]
;[]===========================================================[ 11]
;!TODO
;Procedure : Write Long
;
;Function : Writing sectors to disk
;
;Input : C = 0Bh
; HL:IX - Logical Block (sector)
; DE - Address
; B - Sector count
; A'- Page
;Output : A'- Next Page
; HL:IX - Next Logical Block (sector)
; DE - Next Address
;
;[]===========================================================[ 11]
;
; Errors:
; 0 (00h) - NO ERRORS
; 1 (01h) - BAD COMMAND
; 2 (02h) - BAD DRIVE NUMBER
; 3 (03h) - UNKNOW FORMAT
; 4 (04h) - NOT READY
; 5 (05h) - SEEK ERROR
; 6 (06h) - SECTOR NOT FOUND
; 7 (07h) - CRC ERROR
; 8 (08h) - WRITE PROTECT
; 9 (09h) - READ ERROR
; 10 (0Ah) - WRITE ERROR
; 11 (0Bh) - FAILURE
; 12 (0Ch) - BUSY (DEVICE OPENED)
; 13 (0Dh) - RESERVED
RMDRIVE:
INC C
DEC C
JP Z,INIT_RD ; 0
DEC C
JR Z,RESE_RD ; 1
DEC C
JR Z,STAT_RD ; 2
DEC C
JR Z,CHEK_RD ; 3
DEC C
JR Z,GBPB_RD ; 4
DEC C
JR Z,READR ; 5
DEC C
JR Z,WRITER ; 6
DEC C
JR Z,REMOV_R ; 7
DEC C
JP Z,IOCTL_R ; 8
; DEC C
; JP Z,RESR_H ; 9
; DEC C
; JP Z,LREADH ; 10
; DEC C
; JP Z,LWRITEH ; 11
.error:
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
REMOV_R:
RESE_RD:
STAT_RD:
XOR A
RET
;!FIXIT ᤥ« âì ¢ SYS_PAGE ¤«ï à ¬¤¨áª®¢ ¯¥à¥¬¥­­ë¥ ¨ ¡à âì ®ââ㤠 §­ ç¥­¨¥
CHEK_RD LD A,#FF
AND A
RET
;DE - ADDRESS
GBPB_RD LD IX,0
LD HL,0
LD B,#01
;JP READR
;READ SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
READR PUSH BC
PUSH IX
PUSH HL
PUSH BC
CALL RAMADDR
POP BC
LD IX,512
RAMRLOP PUSH BC
PUSH IX
CALL LRDSEC
POP IX
POP BC
DJNZ RAMRLOP
POP HL
POP IX
POP BC
XOR A
CP B
LD C,B
LD B,A
JR Z,DYEP256
ADD IX,BC
LD C,B
ADC HL,BC
XOR A
RET
DYEP256 INC B
ADD IX,BC
LD B,C
ADC HL,BC
XOR A
RET
;WRITE SECTORS
; HL:IX - SECTOR
; DE - ADDRESS
; B - COUNT
; A - DRIVE
WRITER PUSH BC
PUSH IX
PUSH HL
PUSH BC
CALL RAMADDR
POP BC
LD IX,512
RAMWLOP PUSH BC
PUSH IX
CALL WRDSEC
POP IX
POP BC
DJNZ RAMWLOP
POP HL
POP IX
POP BC
XOR A
CP B
LD C,B
LD B,A
JR Z,WYEP256
ADD IX,BC
LD C,B
ADC HL,BC
XOR A
RET
WYEP256 INC B
ADD IX,BC
LD B,C
ADC HL,BC
XOR A
RET
INIT_RD:
.SectorSize EQU 512 ;!HARDCODE
LD HL,.SectorSize
LD A,#80
.loop: SRL A
RR H
JR NC,.loop
LD (S_P_P),A
LD BC,#0*256 + BIOS.GET_RAMD_ST ; <20>®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª , ­ §­ ç¥­­®£® ­  RAM-Disk
LD DE,RAMDTBL
.initLoop:
PUSH BC
LD A,B
PUSH DE
RST ToBIOS
POP DE
OR A
JR Z,.noDRV
LD (DE),A
INC DE
POP BC
LD A,B
LD (DE),A
INC DE
JP 1F
.noDRV: POP BC
1: INC B
LD A,RAMDTBL.Size / 2
CP B
JR NZ,.initLoop
LD HL,RAMDTBL
EX DE,HL
AND A
SBC HL,DE
SRL L
LD A,L
; LD HL,ENDDRVR
AND A
RET
; <E28099>ˆ€ ‘ŽŽ’‚…’‘’‚ˆŸ Œ…†„“ ”ˆ‡ˆ—…‘ŠˆŒ <20>ŽŒ…<C592>ŽŒ <20>€Œ„ˆŠ€ ˆ …ƒŽ RAM-DISK ID
; DB RAM_DRIVE_ID, RAM_DRIVE_NUMBER
RAMDTBL: DUP MAX_RAMDRIVES * 2
DB #FF
EDUP
.Size EQU $-RAMDTBL
; SECTOR / S_P_P = START PAGE
; INPUT : HL:IX -SECTOR
; OUTPUT: A':HL - ADDRESS
RAMADDR LD BC,RAMDTBL
SLA A
ADD A,C
LD C,A
LD A,0
ADC A,B
LD B,A
LD A,(BC)
EX AF,AF'
LD B,XH
LD C,XL
LD A,(S_P_P) ; (S_P_P) ;SECTORS PER Page
;AGE
DIVR0 RRCA
JR C,DIVR1
RR H
RR L
RR B
RR C
JR DIVR0
DIVR1 LD B,C
LD C,#C4 ;GET FIRST PAGE
EX AF,AF'
RST ToBIOS
EX AF,AF'
LD A,(S_P_P)
LD C,A
DEC C
LD A,XL
AND C
INC A
LD HL,#C000
LD BC,512
SBC HL,BC
ADDLP ADD HL,BC
DEC A
JR NZ,ADDLP
RET
S_P_P DB #00
; A':HL - ADDRESS SOURCE
; DE - ADDRESS DESTINATION
LRDSEC LD A,D
CP #A0
LD C,SLOT3
SET 6,H
JR C,RMDL02
LD C,SLOT1
RES 7,H
RMDL02 IN A,(C)
EX AF,AF'
DI
OUT (C),A
LD B,XH
LD XH,C
LD C,XL
LDIR
EX AF,AF'
LD C,XH
OUT (C),A
LD A,H
AND #7F
EI
RET NZ
LD C,SLOT3 ;GET NEXT PAGE
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
EX AF,AF'
LD XH,#C2
LD XL,A
LD A,(IX)
EX AF,AF'
OUT (C),B
LD H,#C0
RET
; A':HL - ADDRESS SOURCE
; DE - ADDRESS DESTINATION
WRDSEC LD A,D
CP #A0
LD C,SLOT3
SET 6,H
JR C,WMDL02
LD C,SLOT1
RES 7,H
WMDL02 IN A,(C)
EX AF,AF'
DI
OUT (C),A
LD B,XH
LD XH,C
LD C,XL
EX DE,HL
LDIR
EX DE,HL
EX AF,AF'
LD C,XH
OUT (C),A
LD A,H
AND #7F
EI
RET NZ
LD C,SLOT3 ;GET NEXT PAGE
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
EX AF,AF'
LD XH,#C2
LD XL,A
LD A,(IX)
EX AF,AF'
OUT (C),B
LD H,#C0
RET
;;
;;
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_R:
BIT 7,B
JR NZ,.O_CTL_F
INC B
DEC B
JP Z,.RGETPRM
; DEC B
; JP Z,FRDTRAC
; DEC B
; JP Z,FCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
.O_CTL_F:
RES 7,B
INC B
DEC B
JP Z,.RSETPRM
; DEC B
; JP Z,FWRTRAC
; DEC B
; JP Z,FFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
; HL:DE - SECTORS ON LOGICAL DISK
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - EXTENDED INFORMATION
; D0...D3 - "0" RESERVED (MAY BE OTHER)
; D4 - DEVICE MASTER/SLAVE
; D5 - "1" RESERVED
; D6 - ADDRESSING MODE LBA/CHS
; D7 - "1" RESERVED
.RGETPRM:
EX DE,HL
LD BC,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
EX AF,AF'
LD BC,RAMDTBL
LD A,L
SLA A
ADD A,C
LD C,A
LD A,0
ADC A,B
LD B,A
INC BC
LD A,(BC)
ADD #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
PUSH AF
PUSH AF
EX AF,AF'
POP AF
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
PUSH HL ;ç¨á«® £®«®¢®ª, ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
PUSH DE ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
EXX
POP HL ;ª®«¨ç¥á⢮ 樫¨­¤à®¢
POP BC ;ç¨á«® ᥪâ®à®¢ (­  楫¨­¤à)
LD D,0
LD E,B ;ç¨á«® £®«®¢®ª
LD B,D
EXX
LD A,L
RRA
JR C,.end
.loopShift:
SLA E
RL D
RRA
JR NC,.loopShift
.end:
EX AF,AF'
POP AF
EX AF,AF'
XOR A
LD L,A
LD H,L
LD A,%10100000
RET
;!HARDCODE
.RSETPRM:
AND A
RET
ENDDRVR EQU $
;