Code: Select all
;----------------------------------------------
; Driver IDE for KAY v1.0
; Written by breeze/fishbone crew 05.07.2003
; (may be standart form 4 DOORS2003 Drivers ;)
;----------------------------------------------
ORG #E000
;----------------STANDARTNY HEADER---------------------
DEFB "DRV" ;IDENTIFIKATOR
IDEINIT JP iIDEINIT ;'ZAGLUSHKA' FOR NORMAL EXIT
DRV_NAME DEFB " IDE HDD BY (C) NEMO" ; 20 SIM MAX
DRV_AUTHOR DEFB " breeze / fishbone" ; 18 SIM MAX
DRV_VER DEFB " 1.01" ; 5 MAX
DRV_LANG DEFB 7 ; LANGUAGE: 7-ENGLISH
;------------------TABLICA PORTOV--------------------
REG_COM DEFW #F0 ;SCORP: #FFBE - REGISTR COMMAND
REG_SOS DEFW #F0 ;SCORP: #FFBE - REGISTR SOSTOYANIA
REG_CYL_H DEFW #B0 ;SCORP: #FDBE - REGISTR CYLINDRA (STARSH)
REG_CYL_L DEFW #90 ;SCORP: #FCBE - REGISTR CYLINDRA (MLADSH)
REG_SEC DEFW #70 ;SCORP: #FBBE - REGISTR SECTORA
REG_HEAD DEFW #D0 ;SCORP: #FEBE - REGISTR GOLOVKI / NAKOPITEL
A
REG_CONT DEFW #50 ;SCORP: #FABE - REGISTR SCHETCHIKA SECTOROV
REG_ERR DEFW #30 ;SCORP: #F9BE - REGISTR OSHIBOK
REG_DAT_H DEFW #11 ;SCORP: #D8BE - REGISTR DANNYH (STARSH)
REG_DAT_L DEFW #10 ;SCORP: #F8BE - REGISTR DANNYH (MLADSH)
REZ_1 DEFW 0 ;RESERV
REZ_2 DEFW 0 ;RESERV
REZ_3 DEFW 0 ;RESERV
REZ_4 DEFW 0 ;RESERV
REZ_5 DEFW 0 ;RESERV
REZ_6 DEFW 0 ;RESERV
;------------TABLICA SSYLOK (NE IZMENYAT'!)------------
SEL_MASTER JP iSEL_MASTER ;VYBOR MASTER DEVICE
SEL_SLAVE JP iSEL_SLAVE ;VYBOR SLAVE DEVICE
OUT_A JP iOUT_A ;A W PORT BC
IN_A JP iIN_A ;A IZ PORT BC
WAIT_DRQ JP iWAIT_DRQ ;OZHIDANIE DRQ
HDD_READ JP iHDD_READ ;CHTENIE GRUPPY SECTOROW A W HL
READ_SS JP iREAD_SS ;CHTENIE 1 SECTORA W HL
HDD_WRITE JP iHDD_WRITE ;ZAPIS GRUPPY SECTOROV A IZ HL
WRITE_SS JP iWRITE_SS ;ZAPIS 1 SECTORA IZ HL
HDSC JP iHDSC ;KOMANADA A TO HDD
NO_BSY JP iNO_BSY ;OZHDANIE BSY
NO_ERROR JP iNO_ERROR ;OZHDANIE ERROR
W_CHS JP iW_CHS ;POZICIROWANIE PO C=BC, H=H, S=L
GET_ERROR JP iGET_ERROR ;WOZWRAT CODE OSHIBKI
;------------------START PODPROGRAMM---------------
iIDEINIT
RET
iGET_ERROR
RET
iSEL_MASTER LD A,#00
LD BC,(REG_HEAD)
CALL OUT_A
LD BC,(REG_HEAD)
CALL IN_A
RLCA
RET
iSEL_SLAVE LD A,#10
LD BC,(REG_HEAD)
CALL OUT_A
LD BC,(REG_HEAD)
CALL IN_A
RLCA
RET
iOUT_A OUT (C),A
RET
iIN_A IN A,(C)
RET
iWAIT_DRQ LD BC,(REG_SOS)
CALL IN_A
BIT 3,A
RET NZ
JR WAIT_DRQ
; CHITAEM SECTORA ZADANNYE
; IN: HL - BUFER FOR READING, A-SECTORS
iHDD_READ LD B,A
PUSH BC
LD BC,(REG_CONT)
CALL OUT_A
LD (BUF),HL
LD A,#20
CALL HDSC ;KOMM CHITAT
POP BC
hDDREAD1 PUSH BC
CALL READ_SS ;CHITAEM SECTOR
CALL NO_BSY
POP BC
DJNZ hDDREAD1
RET
iREAD_SS LD B,0
LD (BUF),HL
rEAD_1S PUSH BC
LD BC,(REG_DAT_L)
CALL IN_A
LD (HL),A
INC HL
LD BC,(REG_DAT_H)
CALL IN_A
LD (HL),A
INC HL
POP BC
DJNZ rEAD_1S
LD (BUF),HL
RET
BUF DEFW 0 ; VREMENNAYA PEREMENNAYA DLA READ/WRITE
; PISHEM SECTORA ZADANNYE
; IN: HL - BUFER FOR WRITE, A-SECTORS
iHDD_WRITE LD B,A
PUSH BC
LD BC,(REG_CONT)
CALL OUT_A
LD (BUF),HL
LD A,#30
CALL HDSC ;KOMM PISAT
POP BC
hDDWRITE1 PUSH BC
CALL WRITE_SS ;PISHEM SECTOR
CALL NO_BSY
POP BC
DJNZ hDDWRITE1
RET
iWRITE_SS LD B,0
LD (BUF),HL
wRITE_1S PUSH BC
INC HL
LD A,(HL)
LD BC,(REG_DAT_H)
CALL OUT_A
DEC HL
LD BC,(REG_DAT_L)
LD A,(HL)
CALL OUT_A
INC HL
INC HL
POP BC
DJNZ wRITE_1S
LD (BUF),HL
RET
; HDD SEND COMMAND
; IN:A, - KOD KOMMANDY OUT: CY - OPERACIYA WYPOLNENA S ERROR
iHDSC LD BC,(REG_COM)
CALL OUT_A
CALL NO_BSY
RET
iNO_BSY LD BC,(REG_COM)
CALL IN_A
RLCA
RET NC
JR iNO_BSY
iNO_ERROR LD BC,(REG_COM)
CALL IN_A
RLCA
RET
; POZICIROVANIE GOLOVOK
; DE - CYL H - HEAD L - SECTOR
iW_CHS
LD BC,(REG_HEAD)
LD A,H
CALL OUT_A
LD BC,(REG_CYL_H)
LD A,D
CALL OUT_A
LD BC,(REG_CYL_L)
LD A,E
CALL OUT_A
LD BC,(REG_SEC)
LD A,L
CALL OUT_A
RET
;----------------------------------------
ENDDRV NOP
Я написал аналогичный для спринтера:
Code: Select all
;-------------------------------
;Sprinter IDE driver
;Written BY cr0acker^NedoPC TEAM
;NON STANDART HDE FORM
;MAY BE STANDART 4 DOOR2K
;-------------------------------
ORG #E000
;------STANDART HEADER----------
DEFB "DRV"
IDEINIT JP iIDEINIT
DRV_NAME DEFB "SPRINTER IDE "
DRV_AUTH DEFB "CR0ACKER^NedoPC "
DRV_VER DEFB " 1.01"
DRV_LANG DEFB 7
;-PORTS------------------------
REG_COM DEFW #4153
REG_STAT DEFW #4053
REG_CYL_H_W DEFW #0155
REG_CYL_L_W DEFW #0154
REG_SEC_W DEFW #0153
REG_HEAD_W DEFW #4152
REG_CONT DEFW #0052
REG_ERR DEFW #0051
REG_DAT_H DEFW #0150
REG_DAT_L DEFW #0050
REG_CONT_W DEFW #0152
REZ_2 DEFW 0
REZ_3 DEFW 0
REZ_4 DEFW 0
REZ_5 DEFW 0
REZ_6 DEFW 0
;-DRIVER FUNCTIONS--------------
SEL_MASTER JP iSEL_MASTER
SEL_SLAVE JP iSEL_SLAVE
OUT_A JP iOUT_A
IN_A JP iIN_A
WAIT_DRQ JP iWAIT_DRQ
HDD_READ JP iHDD_READ
READ_SS JP iREAD_SS
HDD_WRITE JP iHDD_WRITE
WRITE_SS JP iWRITE_SS
HDSC JP iHDSC
NO_BSY JP iNO_BSY
NO_ERROR JP iNO_ERROR
W_CHS JP iW_CHS
GET_ERROR JP iGET_ERROR
;-DRIVER START-----------------
iIDEINIT
RET
iGET_ERROR
RET
iSEL_MASTER
CALL iBIOS_ON
LD C,#51
LD A,#80
RST #18
CALL iBIOS_OFF
RET
iSEL_SLAVE
CALL iBIOS_ON
LD C,#51
LD A,#81
RST #18
CALL iBIOS_OFF
RET
iOUT_A OUT (C),A
RET
iIN_A IN A,(C)
RET
iWAIT_DRQ
LD BC,(REG_STAT)
CALL IN_A
BIT 3, A
RET NZ
JR WAIT_DRQ
RET
;READ SECTORS
;IN: HL-BUFFER, A-SECTOR
iHDD_READ
LD B,A
PUSH BC
LD BC,(REG_CONT_W)
CALL OUT_A
LD (BUF), HL
LD A,#20
CALL HDSC
POP BC
hDDREAD1
PUSH BC
CALL READ_SS
CALL NO_BSY
POP BC
DJNZ hDDREAD1
RET
iREAD_SS
LD B,0
LD (BUF), HL
rEAD_1S PUSH BC
LD BC,(REG_DAT_L)
CALL IN_A
LD (HL),A
INC HL
LD BC,(REG_DAT_H)
CALL IN_A
LD (HL),A
INC HL
POP BC
DJNZ rEAD_1S
LD (BUF), HL
RET
BUF DEFW #FF
;WRITE SECTORS.
;IN: HL-BUFFER, A-SCTORS
iHDD_WRITE
LD B,A
PUSH BC
LD BC,(REG_CONT_W)
CALL OUT_A
LD (BUF), HL
LD A,#30
CALL HDSC
POP BC
hDDWRITE1
PUSH BC
CALL WRITE_SS
CALL NO_BSY
POP BC
DJNZ hDDWRITE1
RET
iWRITE_SS
LD B,0
LD (BUF), HL
wRITE_1S
PUSH BC
INC HL
LD A,(HL)
LD BC,(REG_DAT_H)
CALL OUT_A
DEC HL
LD BC,(REG_DAT_L)
LD A,(HL)
CALL OUT_A
INC HL
INC HL
POP BC
DJNZ wRITE_1S
LD (BUF), HL
RET
;SEND COMMAND TO HDD
;IN: A-COMMAND, OUT: CY-ERROR
iHDSC
LD BC,(REG_COM)
CALL OUT_A
CALL NO_BSY
RET
iNO_BSY
LD BC,(REG_STAT)
CALL IN_A
RLCA
RET NC
JR iNO_BSY
iNO_ERROR
LD BC,(REG_STAT)
CALL IN_A
RLCA
RET
;HEAD POSITIONING
;IN: DE-CYL,H-HEAD,L-SECTOR
iW_CHS
LD BC,(REG_HEAD_W)
LD A,H
CALL OUT_A
LD BC,(REG_CYL_H_W)
LD A,D
CALL OUT_A
LD BC,(REG_CYL_L_W)
LD A,E
CALL OUT_A
LD BC,(REG_SEC_W)
LD A,L
CALL OUT_A
RET
;-------------------------------
ENDDRV NOP
;REG_SEC_W DEFW #0153
;REG_CYL_L_W DEFW #0154
;REG_CYL_H_W DEFW #0155
;REG_HEAD_W DEFW #4152
;REG_STAT DEFW #4053
;REG_COM DEFW #4153
;REG_CONT_R DEFW #0052
;REG_CONT_W DEFW #0152
;REG_DAT_L DEFW #0050
;REG_DAT_H DEFW #0150
iBIOS_ON
POP HL
LD (OLDSP), SP
LD SP,#BFFF
LD A,0
OUT (#07C), A
PUSH HL
RET
OLDSP DEFB #FFFF
iBIOS_OFF
POP HL
LD SP,(OLDSP)
LD A,0
OUT (#03C), A
PUSH HL
RET