Код:
;LAST UPDATE: 04.03.2010 savelij
Hddinit EQU 0
Hddoff EQU 1
Hddrds EQU 2
Hddrdm EQU 3
Hddwrs EQU 4
Hddwrm EQU 5
;Ž�™?ź ’Ž—Š? ‚•Ž„? „‹ź �?�Ž’› ‘ HDD NEMO
EXA
EX (SP),HL
LD A,(HL)
INC HL
EX (SP),HL
ADD A,A
PUSH HL
LD HL,TBLHDDN
ADD A,L
LD L,A
LD A,H
ADC A,0
LD H,A
LD A,(HL)
INC HL
LD H,(HL)
LD L,A
EXA
EX (SP),HL
RET
TBLHDDN DW HDDINIT ;INIT HDD
DW HDDOFF
DW HDDRDS ;READ SINGLE SECTOR
DW HDDRDM ;READ MULTI SECTOR
DW HDDWRS ;SAVE SINGLE SECTOR
DW HDDWRM ;SAVE MULTI SECTOR
;‚室*ëĄ Ż*ŕ*¬Ąâŕë ®ˇé¨Ą:
;HL-*¤ŕĄá §*Łŕă§Ş¨ ˘ Ż*¬ďâě
;BCDE-32-ĺ ˇ¨â*ë© *®¬Ąŕ ᥪâ®ŕ*
;A-Ş®«¨çĄá⢮ ˇ«®Ş®˘ (ˇ«®Ş=512 ˇ*©â)
;⮫쪮 ¤«ď ¬*®Ł®ˇ«®ç*®© §*ݍá¨/çâĄ*¨¨
P_1F7 EQU #F0 ;�…ƒˆ‘’� ‘Ž‘’ŽźŤˆź/�…ƒˆ‘’� ŠŽŚ?Ť„
P_1F6 EQU #D0 ;CHS-ŤŽŚ…� ƒŽ‹Ž‚› ˆ “‘’�/LBA ?„�…‘ 24-27
P_1F5 EQU #B0 ;CHS-–ˆ‹ˆŤ„� 8-15/LBA ?„�…‘ 16-23
P_1F4 EQU #90 ;CHS-–ˆ‹ˆŤ„� 0-7/LBA ?„�…‘ 8-15
P_1F3 EQU #70 ;CHS-ŤŽŚ…� ‘…Š’Ž�?/LBA ?„�…‘ 0-7
P_1F2 EQU #50 ;‘—…’—ˆŠ ‘…Š’Ž�Ž‚
P_1F1 EQU #30 ;ŹŽ�’ Ž˜ˆ�ŽŠ/‘‚މ‘’‚
P_1F0 EQU #10 ;ŹŽ�’ „?ŤŤ›•
P_3F6 EQU #C8 ;�…ƒˆ‘’� ‘Ž‘’ŽźŤˆź/“Ź�?‚‹…Ťˆź
P_HI EQU #11 ;‘’?�˜ˆ… 8 �ˆ’
PRT_RW EQU P_1F0*256+P_HI ;ŹŽ�’› —’…Ťˆź/‡?Źˆ‘ˆ Ž„ŤˆŚ ‘‹Ž‚ŽŚ
;Ť? ‚›•Ž„…:
;H-„‹ź MASTER 0-HDD, 1-CDROM, #FF-NONE
;L-„‹ź SLAVE 0-HDD, 1-CDROM, #FF-NONE
HDDINIT LD A,#E0
PUSH HL
CALL ID_DEV
POP HL
AND A
CALL Z,INIT_91
LD D,A
LD A,#F0
PUSH DE
PUSH HL
CALL ID_DEV
POP HL
AND A
CALL Z,INIT_91
POP HL
LD L,A
XOR A
HDDOFF RET
INIT_91 PUSH HL
LD L,49*2+1,A,(HL)
AND 2
JR Z,INI_912
LD BC,#FF00+P_1F2
LD L,#0C
LD A,(HL)
OUT (C),A
LD L,6
LD C,P_1F6
LD A,(HL)
DEC A
OUT (C),A
LD C,P_1F7
LD A,#91
OUT (C),A
LD DE,#1000
INI_911 DEC DE
LD A,D
OR E
JR Z,INI_912
IN A,(C)
AND #80
JR NZ,INI_911
POP HL
RET
INI_912 LD A,#FF
POP HL
RET
;READ 1 SECTOR HDD
HDDRDS LD A,1
;READ "A" SECTORS HDD
HDDRDM PUSH BC
PUSH DE
CALL SETHREG
EXA
LD C,P_1F7
LD A,#20
OUT (C),A
LD C,P_1F7
HDDRD1 IN A,(C)
AND #88
CP 8
JR NZ,HDDRD1
EXA
HDDRD2 EXA
CALL READSEC
LD C,P_1F7
HDDRD3 IN A,(C)
AND #80
JR NZ,HDDRD3
EXA
DEC A
JR NZ,HDDRD2
JR EXITNHD
;WRITE 1 SECTOR HDD
HDDWRS LD A,1
;WRITE "A" SECTORS HDD
HDDWRM PUSH BC
PUSH DE
CALL SETHREG
EXA
LD C,P_1F7
LD A,#30
OUT (C),A
LD C,P_1F7
HDDWR1 IN A,(C)
AND #88
CP 8
JR NZ,HDDWR1
EXA
HDDWR2 EXA
CALL WRITSEC
LD C,P_1F7
HDDWR3 IN A,(C)
AND #80
JR NZ,HDDWR3
EXA
DEC A
JR NZ,HDDWR2
EXITNHD POP DE
POP BC
LD A,B
AND #0F
LD B,A
XOR A
RET
;READ SECTOR (512 BYTES)
READSEC LD DE,PRT_RW
LD A,#40
READSC1 LD C,D
INI
LD C,E
INI
LD C,D
INI
LD C,E
INI
LD C,D
INI
LD C,E
INI
LD C,D
INI
LD C,E
INI
DEC A
JR NZ,READSC1
RET
;SAVE SECTOR (512 BYTES)
WRITSEC EXX
PUSH HL
LD HL,0
ADD HL,SP
EXX
LD SP,HL
LD A,#40
LD HL,PRT_RW
WR_SEC1 POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
POP DE
LD C,L
OUT (C),D
LD C,H
OUT (C),E
DEC A
JR NZ,WR_SEC1
LD HL,0
ADD HL,SP
EXX
LD SP,HL
POP HL
EXX
RET
;SET HDD PORTS
SETHREG PUSH DE
LD D,B
LD E,C
LD BC,#FF00+P_1F6
OUT (C),D
EXA
LD C,P_1F7
SETHRE1 IN A,(C)
AND #80
JR NZ,SETHRE1
LD C,P_1F5
OUT (C),E
POP DE
LD C,P_1F4
OUT (C),D
LD C,P_1F3
OUT (C),E
LD C,P_1F2
EXA
OUT (C),A
RET
;HL-?„�…‘ �“”…�? ‘…Š’Ž�? ˆ„…Ť’ˆ”ˆŠ?–ˆˆ
;A=E0-„‹ź MASTER, A=F0-„‹ź SLAVE
ID_DEV LD BC,#FF00+P_1F6
OUT (C),A
LD C,P_1F7
LD D,26
ID_DEV3 EI
HALT
DI
DEC D
JR Z,NO_DEV
IN A,(C)
BIT 7,A
JR NZ,ID_DEV3
AND A
JR Z,NO_DEV
INC A
JR Z,NO_DEV
XOR A
LD C,P_1F5
OUT (C),A
LD C,P_1F4
OUT (C),A
LD A,#EC
LD C,P_1F7
OUT (C),A
LD C,P_1F7
ID_DEV1 IN A,(C)
AND A
JR Z,NO_DEV
INC A
JR Z,NO_DEV
DEC A
RRCA
JR C,ID_DEV2
RLCA
AND #88
CP 8
JR NZ,ID_DEV1
ID_DEV2 LD C,P_1F4
IN E,(C)
LD C,P_1F5
IN D,(C)
LD A,D
OR E
JP Z,READSEC
LD HL,#EB14
SBC HL,DE
LD A,1
RET Z
NO_DEV LD A,#FF
RET