Код:
;IDE DRIVER for WDC (NEMO IDE PORTS)
ORG #9A00
;-IDE Ports:----------------------------
RCOM EQU #00F0
RHEAD EQU #00D0
RCYLH EQU #00B0
RCYLL EQU #0090
RSEC EQU #0070
RCOUNT EQU #0050
RERR EQU #0030
RDATL EQU #0010
RDATH EQU #0011
;---------------------------------------
FLGA NOP
TMR NOP
;-------
CDoHD NOP
NSDC NOP
EOC NOP
SRIN NOP
;-------
MAS DB #E0
SLE DB #B0
ECC NOP
NOP
;-------
LTHL DS 2
LTDE DS 2;(14)
;-------
SPDPK DB #BB,0,#01,#60:DS 8;x1:#00,#B0
; x4:#02,#C0
; x8:#05,#80
READP DB #28,0
SECTOR DB 0,0,0,#10
DB 0
SECTORS DB 0,1
DB #10:DS 2
SESSION DB #43,0:DS 4:DB 1
DB #03,#20:DB 0
DS 2
;---------------------------------------
JP ECCOM; KERNAL 2
JP EJTR
JP LOTR
JP SPEED
JP CDSPD
JP SLWCD
JP CDSLP
JP COMAH
JP COMM
JP XPOZI
JP PROZ
JP POZI
JP RPOZ
JP RDDSE
JP SDDSE
JP RDDSE
JP SLPP
JP WKUP
JP CONF
JP 0
JP SNDPAK
JP RDY; ˇĄáŞ®*Ąç. ®¦¨¤. Ł®â-â¨
JP READY;®¦¨¤. Ł®â-⨠á t-out
JP WAITDRQ
JP ERROR_7
JP SEL_SLA
JP SEL_MAS
JP TRANSIN;çâĄ*¨Ą Ż ŞĄâ ®â CD
JP HLTOLEN
JP LENTOHL
JP CDDET
JP DRDET
JP READSE
JP 0
JP TOSC
JP TOS
JP TOSE
JP TOTAK
JP TOTOK
;------¨*¨ć¨ «¨§ ć¨ď IDE ¤ŕ ©˘Ąŕ :------
IDE_INI ;JR NZ,LST_INI
; ¤ **ë© Ş®¤ ˇă¤Ąâ ˘ë§˘ * Ż®çâ¨
; áŕ §ă Ż®á«Ą § Żă᪠WDC
;˘Ąŕč¨* á⥪ 㦥 ˘ëáâ ˘«Ą* , ˘®â
;¨*¨ć¨ «¨§ 樨 ˘áĄ Ż®©¤ăâ 㦥 Ż®á«Ą í⮩
;RET
;------˘ëŕ㡠*¨Ą ¤ŕ ©˘Ąŕ :--------------
LST_INI ;§ Şŕë˘ Ą¬ âĄ*Ą˘ëĄ Ż®ŕâë ¨ â.¤.
; ¨ â.Ż.
RET
;=======================================
KEY1 LD A,#F7:IN A,(#FE):RRCA:RET
KEY2 LD A,#F7:IN A,(#FE):RRCA:RRCA
RET
;---------------------------------------
ECCOM LD A,(ECC):OR A:RET NZ
ECCO LD BC,RCOM,A,#EC:OUT A
RET
EJTR LD HL,TROUT:CALL SNDPAK
JP RDY
LOTR LD HL,TRIN:JR EJTR+3
SPEED LD A,(CDoHD):OR A:RET NZ
CDSPD LD HL,16:CALL TOSC
LD HL,SPDPK:CALL EJTR+3
LD HL,0:JP READSE
SLWCD CALL CDSLP:JP RDY
CDSLP LD HL,SLPMO:JP SNDPAK
;---------------------------------------
;-------------Źŕ®ćë ¤«ď HDD-------------
COMAH LD BC,RCOM:OUT A
JP READY
COMM LD BC,RCOM:OUT A:RET
LOLL LD BC,RCOM:IN A:RET
XPOZI LD (LTHL),HL,(LTDE),DE
PROZ LD A,H,H,D,D,E,E,A
;DE,cyl H,head L,sec
POZI LD A,H:AND %00001111:LD H,A
LD A,(DRVRE)
OR H
LD BC,RHEAD:OUT A
LD A,L,BC,RSEC:OUT A
LD A,D,BC,RCYLH:OUT A
LD A,E,BC,RCYLL:OUT A
RET
RPOZ LD BC,RHEAD:IN A:AND #0F
LD H,A,BC,RSEC:IN A
LD L,A,BC,RCYLH:IN A
LD D,A,BC,RCYLL:IN A
LD E,A
RET
;HL,in da kudy A,secs
RDDSE PUSH AF
LD BC,RCOUNT:OUT A
LD A,#20
CALL COMAH
POP BC
RDH1 PUSH BC
CALL READS
LD (BUFA),HL
CALL READY
POP BC
DJNZ RDH1
RET
SDDSE PUSH AF
LD BC,RCOUNT:OUT A
LD A,#30
CALL COMAH
POP BC
SDH1 PUSH BC
CALL SAVDS
LD (BUFA),HL
CALL READY
POP BC
DJNZ SDH1
RET
SLPP CALL CONF
LD A,#E0:CALL COMM
JP READY
WKUP CALL CONF
LD A,252
LD BC,RCOUNT:OUT A
LD A,#E2:CALL COMM
JP READY
CONF CALL SEL_MAS,READY
LD DE,0,HL,2
CALL XPOZI
LD A,1:CALL RDDSE
LD DE,0,HL,4
CALL XPOZI
LD A,1
JP RDDSE
DRVRE NOP
BUFA DS 2
HEDSEC DS 2
;---------------------------------------
;-------------Źŕ®ćë ¤«ď CD--------------
SNDPAK PUSH HL; IN HL ADDR OF PAK
CALL READY
CALL SEL_SLA
LD HL,#0800
CALL HLTOLEN
LD A,#A0:CALL COMM
POP HL
LD BC,12
TRANSOU PUSH BC
CALL RDY
CALL WAITDRQ
POP BC
OR A
RR B,C
JR NC,$+3
INC BC
TOUT1 PUSH BC
INC HL
LD A,(HL),BC,RDATH
OUT A
DEC HL
LD A,(HL),BC,RDATL
OUT A
INC HL,HL
POP BC
DEC BC
LD A,B
OR C
JR NZ,TOUT1
RET
RDY XOR A:OUT (254),A
CALL LOLL
RLCA:RET NC
LD A,4:OUT (254),A
JR RDY
READY XOR A:LD (TMR),A
REA CALL LOLL
RLCA:JR NC,RY
LD A,(TMR):CP 254:JR C,REA
LD A,1:OUT (254),A
CALL ECCOM
EI:HALT
JR READY
RY XOR A:OUT (254),A
RET
WAITDRQ CALL LOLL
BIT 3,A:RET NZ
JR WAITDRQ
ERROR_7 CALL LOLL
RRCA
RET
SEL_SLA LD A,(SLE)
LD (DRVRE),A
LD BC,RHEAD:OUT A:CALL LOLL
RLCA
RET
SEL_MAS LD A,(MAS)
JR SEL_SLA+3
ERRT POP BC
RET
TRANSIN ;HLŞă¤ë BC᪮Ş
PUSH BC
CALL SEL_SLA
CALL RDY,ERROR_7:JR C,ERRT
CALL WAITDRQ
POP BC
OR A
RR B,C
JR NC,$+3
INC BC
T_I1 PUSH BC
LD BC,RDATL
IN A:LD (HL),A:INC HL
LD BC,RDATH
IN A:LD (HL),A:INC HL
POP BC
DEC BC
LD A,B:OR C
JR NZ,T_I1
RET
HLTOLEN LD BC,RCYLL,A,L:OUT A
LD BC,RCYLH,A,H:OUT A
RET
LENTOHL LD BC,RCYLL:IN A:LD L,A
LD BC,RCYLH:IN A:LD H,A
RET
;¨¤Ą*â¨ä¨Ş ć¨ď CD ¨ HDD
CDDET CALL SEL_SLA
DRDET LD DE,0
LD H,D,L,E
CALL XPOZI
CALL ECCO
.4 HALT
CALL RPOZ
LD HL,#EB14
OR A:SBC HL,DE
RET Z
NFOC LD A,1:OR A
RET
;HLŞă¤ë ®áâ «ě*®Ą ˘ Ż ŞĄâĄ á¨¤¨â
READSE LD (HLAD),HL
RETRYL XOR A:OUT (254),A
LD A,(FLGA):OR A:JR Z,ACD
CALL KEY1,NC,ACTCD
CALL KEY2,NC,ACTHD
ACD LD HL,READP:CALL SNDPAK
LOADSE1 LD A,5:OUT (254),A
CALL READY
CALL ERROR_7:JR C,RETRYL
LD D,0
WDQ CALL LOLL
BIT 3,A:JR NZ,WQR
DEC D:JR Z,RETRYL
JR WDQ
WQR LD HL,(HLAD)
GSLOD
.4 CALL READS
XOR A:OUT (254),A
RET
ABT NOP
HLAD DS 2
;-------
; ;çâĄ*¨Ą 512ˇ ¤ **ëĺ ¨§ ˇăäĄŕ IDE ăá-˘
READS LD BC,RDATL,D,#80
RE1 INI:INC C
INI:DEC C
INI:INC C
INI:DEC C
DEC D:JR NZ,RE1
RET
;-------
;§ Ż¨áě ®çĄŕĄ¤*ëĺ 512ˇ ¤ **ëĺ * HDD
SAVDS LD BC,RDATH,D,#80
SA1 INC HL
OUTD:DEC C
OUTI:INC C
INC HL
INC HL
OUTD:DEC C
OUTI:INC C
INC HL
DEC D:JR NZ,SA1
RET
;---------------------------------------
;---------------------------------------
TOSC LD DE,0,(SECTOR),DE
LD A,H,H,L,L,A,(SECTOR+2),HL
RET
TOS XOR A
LD (NSDC),A,(SRIN),A,(EOC),A
LD A,(CDoHD):OR A:RET NZ
LD DE,SECTOR:JR TOTAK+1
TOSE LD DE,SECTOR
TOTAK LD A,(HL),(DE),A:INC HL,DE
TOTOK LD A,(HL),(DE),A:INC HL,DE
LD A,(HL),(DE),A:INC HL,DE
LD A,(HL),(DE),A:INC HL,DE
RET
;---------------------------------------
; Ź?Š…’ˆŠˆ
INFOCD DB #12:DS 3:DB 36:DS 7
TROUT DB #1B:DS 3:DB 2:DS 7;‚›„‚ˆƒ ’�…
TRIN DB #1B:DS 3:DB 3:DS 7;‡?„‚ˆƒ ’�…
SLPMO DB #1B:DS 3:DB 0:DS 7;‘Ź?’ś!
;---------------------------------------
END DS 1024-(END-FLGA)
;Ł« ˘* ď ŞĄŕ* «ě ˘ë§®˘®˘(*Ą ˘áď!):
KERN EQU #6000; SP=5E20
NP0 EQU KERN; 1
NP1 EQU KERN+3
NP3 EQU KERN+6
STN EQU KERN+9
NP6 EQU KERN+12
DLt EQU KERN+15
ACTCD EQU KERN+18
ACTHD EQU KERN+21; 8
POZIR EQU KERN+24
;---------------------------------------