IDE

Старый спектрумистский форум

Moderator: Shaos

User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

IDE

Post by cr0acker »

Вот есть такой дайвер

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

Почему мой не пашет:)