Blame |
Last modification |
View Log
| Download
| RSS feed
| ?url?
hddstat EQU 0XF0
hddcmd EQU 0XF0
hddhead EQU 0XD0
hddcylhi EQU 0XB0
hddcyllo EQU 0X90
hddsec EQU 0X70
hddcount EQU 0X50
hdderr EQU 0X30
hdddatlo EQU 0X10
hdddathi EQU 0X11
hddupr EQU 0XC8
hdduprON EQU 0
HDDBINI CALL SET_7FFD_0
LD HL,HDDREAD
LD DE,0XE800 ;0X5B60
LD B,8 ;BC,HDDRDLN
LDIR
RET
HDDBOOT DI
CALL HDDBINI
INIT0 LD A,0XA0 ;MASTER+CHS
LD (devnum),A
CALL SELDEVICE
LD A,0X0C
LD BC,hddupr
PUSH BC
CALL OUT_A ; ç¨ ¥¬ á¡à®á
LD B,0
DJNZ $
LD A,8
POP BC
CALL OUT_A ;á¡à®á¨«¨!
CALL NO_BSY
LD A,0X10 ;®¬ ¤ RECALIBRATE
CALL HDSC ; ¯¨áì COMMAND
INIT2 IN A,(LOW (hddstat)) ;⥨¥ STATUS REGISTER (0111)
BIT 7,A ;஢¥àª ¡¨â BSY § ïâ®áâì HDD
JR NZ,INIT2 ;¥à¥å®¤ ¥á«¨ ª®¯¨â¥«ì § ïâ
AND 0XE9
CP 0X40
;CP 0X50 ;஢¥àª ¡¨â®¢ DSC (ãáâ-ª £®«®¢®ª)
;¨ DRDY(£®â®¢®áâì HDD)
JR NZ,INIT0 ;
᫨ ãáâ ®¢«¥ë - ¢ë室
JP 0XE800
;,**************************************************************
;
HDDREAD PHASE 0XE800
CALL NO_BSY ;
,,
LD BC,hddhead ;
/
LD A,0XA0 ; 0, MASTER 0XB0-SLAVE
CALL OUT_A
LD BC,hddcylhi ;
(HI)
XOR A
CALL OUT_A
LD BC,hddcyllo ;
(LOW)
CALL OUT_A
LD BC,hddsec ;
LD A,3 ;
CALL OUT_A
LD BC,hddcount ;
LD A,0X30 ;
24K
CALL OUT_A
LD A,0X20
CALL HDSC ; ""
LD HL,0X6000
PUSH HL
LD B,0X30
READ1 PUSH BC
CALL WAIT_DRQ
;
LD B,0
READ_1 PUSH BC
LD BC,hdddatlo ;
INI
LD BC,hdddathi ;
INI
POP BC
DJNZ READ_1
POP BC
DJNZ READ1
RET
;
WAIT_DRQ
CALL IN_HDDSTAT
BIT 3,A
RET NZ
JR WAIT_DRQ
;
HDSC PUSH AF
CALL SELDEVICE
POP AF
LD BC,hddcmd
CALL OUT_A
;
NO_BSY CALL IN_HDDSTAT
RLCA
RET NC
JR NO_BSY
IN_HDDSTAT
CALL SELDEVICE
LD BC,hddstat
IN_A IN A,(C)
RET
SELDEVICE
devnum EQU $+1
LD A,device
LD BC,hddhead
OUT_A OUT (C),A
RET
CDBOOTGO
;§ £àã§ç¨ª ä ©« "AUTORUN.ZX" á CD ¯® ¤à¥áã 0X6000
;SP=0X6000, DI
;¯¥à¥¤ ¥â ¥¬ã ¢ ॣ¨áâà å:
;A=0XA0 (master) ¨«¨ 0XB0 (slave)
;B=⨯ ª®¬¯ìîâ¥à :
;0=PENTAGON, 1=ATM, 2=SCORPION, 3=PROFI, 4=SPRINTER
;C=⨯ ª®â஫«¥à IDE:
;0=NEMO, 1=ATM, 2=SMUC, 3=PROFI, 4=SPRINTER
;D=ï§ëª:
;0=ENGLISH, 1=
;E= ¤à¥á COVOX:
;0XFB=ATM/PENTAGON, 0XFF=®âáãâáâ¢ã¥â
;HL=¤®áâã¯ë¥ ¢¨¤¥®à¥¦¨¬ë ( ª« ¤ë¢ îâáï ¯® OR)
;1=512x192 BW VMG
;2=384x304 ZX AC
;4=256x192 15 AC
;8=320x200 16 ATM
device EQU 0XB0
comptype EQU 0
idetype EQU 0
language EQU 1
COVPORT EQU 0XFB
videomodes EQU 4;8
;===============¨¦¥ ¯®¤¤¥à¦ ë ⮫쪮 NEMO,SMUC,ATM============
; IF comptype-1
;atm=1
; ELSE
;atm=0
; ENDIF
; IF idetype-2
;smuc=1|atm
; ELSE
;smuc=atm
; ENDIF
; IFN smuc
; IFN atm
;á奬 ATM:
;hddstat=0XFEEF
;hddcmd=0XFEEF
;hddhead=0XFECF
;hddcylhi=0XFEAF
;hddcyllo=0XFE8F
;hddsec=0XFE6F
;hddcount=0XFE4F
;hdderr=0XFE2F
;hdddatlo=0XFE0F
;hdddathi=0XFF0F
;hddupr=0XFEBE ;¯à¨ ãáâ ®¢«¥®¬ b7 FFBA
;hdduprON=0XFFBA
;hddupr1=0XF7
;hddupr0=0X77
; ELSE
;á奬 SMUC:
;hddstat=0XFFBE
;hddcmd=0XFFBE
;hddhead=0XFEBE
;hddcylhi=0XFDBE
;hddcyllo=0XFCBE
;hddsec=0XFBBE
;hddcount=0XFABE
;hdderr=0XF9BE
;hdddatlo=0XF8BE
;hdddathi=0XD8BE
;hddupr=0XFEBE ;¯à¨ ãáâ ®¢«¥®¬ b7 FFBA
;hdduprON=0XFFBA
;hddupr1=0XF7
;hddupr0=0X77
; ENDIF
; ELSE
;á奬 Nemo:
;hddstat=0XF0
;hddcmd=0XF0
;hddhead=0XD0
;hddcylhi=0XB0
;hddcyllo=0X90
;hddsec=0X70
;hddcount=0X50
;hdderr=0X30
;hdddatlo=0X10
;hdddathi=0X11
;hddupr=0XC8
;hdduprON=0
; ENDIF
SECBUF EQU 0X6000
;DISP 0XE800
begin
;GO
; LD SP,0X6000
; LD (IY+1),0XCC
; EI
; HALT
; XOR A
; OUT (-2),A
; LD DE,0X5801
; LD H,D,L,A
; LD BC,767
; LD (HL),L
; LDIR
; IFN atm
; CALL 0X3D46 ;¢ë§®¢ "¯à®¢¥à®ç®©" â®çª¨ ¢ (v)TR-DOS
; OR A ;¥á«¨ ¥ 0,vTR-DOS ¥â ¨ ¥ ¯®¤¬¥ï¥¬
; CALL Z,0X3C98 ;¢ë§®¢ âਣ£¥à ¯®¤¬¥ë TRD/vTRD
; ENDIF
;¨¨æ¨ «¨§ æ¨ï
iniini
; LD A,device ;0XB0=slave
; LD BC,hddhead
; CALL OUT_A ;¥áâì ¢ãâਠNO_BSY
CALL NO_BSY
;LD A,0XFE
;IN A,(-2)
;RRA
;JNC SKIPINI
;LD A,0X10 ;
;CALL HDSC ;ZET9 ¤«ï HDD
LD A,0X08 ;
CALL HDSC ;SMT ¤«ï CD (á¡à®á ¤«ï ATAPI)
;RET C ;ATAPI only
; LD A,device ;0XB0=slave ;
; LD BC,hddhead ;BUDDER
; CALL OUT_A ;¥áâì ¢ HDSC ;¨ ç¥ ¯à¨ ¥à áªàã祮¬ CD
;¥ ¢ë¤ áâ EB14!!!
LD A,0XEC ;identify
CALL HDSC
;RET C ;¤«ï CD ¢ë¤ á⠮訡ªã (VEGA)
LD B,30
HALT
DJNZ $-1
CALL LEN_TO_HL
LD BC,0XEB14
OR A
SBC HL,BC
JP NZ,iniini;0 ;HDD
;LD A,1
;OUT (-2),A
LD HL,AP_00
CALL SEND_ATAPI ;VEGA
LD HL,AP_1x
CALL SEND_ATAPI
LD B,30
HALT
DJNZ $-1
SKIPINI
DI
;LD A,2
;OUT (-2),A
;ᥩç á ®¬¥à ᥪâ®à =0,0,0,0
CALL READCDSECBUF ;¨ ç¥ ¥ à ¡®â ¥â READTOC
LD HL,AP_READTOC
CALL SEND_ATAPI
;RET C
CALL NO_BSY
;RET C
CALL WAIT_DRQ
;RET C
CALL LEN_TO_HL
LD B,H
LD C,L
LD HL,SECBUF
CALL TRANS_IN
CALL NO_BSY
;LD A,3
;OUT (-2),A
;¡¥à¥¬ ¯®á« á¥áá¨î (¯à¥¤¯®á« § ¯¨áì)
LD HL,SECBUF+1
LD A,(HL)
ADD A,-10
LD L,A
LD D,0X87
;CY=1
CALL LOADER ;£à㧨¬ ç «® á¥áᨨ (0X8800 ¡ ©â)
LD BC,0X80A2
ADD HL,BC
;CY=0
CALL LOADER ;£à㧨¬ ª®à¥¢®© ª â «®£
;HL=SECBUF
;LD A,4
;OUT (-2),A
FNDIDLOOP
PUSH HL
LD C,33
ADD HL,BC
LD DE,autorunname
LD C,autorunnamesz
FNDID0 LD A,(DE)
CPI
JR NZ,FNDIDN
INC DE
JP PE,FNDID0
POP HL
LD C,6
ADD HL,BC
;CY=0
;LD A,5
;OUT (-2),A
CALL LOADER ;£à㧨¬ autorun.zx
PUSH HL
LD A,device ;0XB0=slave
LD BC,comptype*256+idetype ;1=ATM,1=ATM
LD DE,language*256+COVPORT ;1=RUS,0XFB
LD HL,videomodes ;8=ATM
RET
FNDIDN
POP HL
LD C,(HL)
INC HL
LD B,(HL)
DEC HL
LD A,B
OR C
JR NZ,NOPADDING
INC H
LD L,A
NOPADDING
ADD HL,BC
LD A,H
CP 64
JR NC,FNDIDLOOP
RST 0
LOADER
;£à㧨¬ ä ©«
;HL 㪠§ë¢ ¥â ¯®«¥ ª®®à¤¨ â ä ©« ¢ motorola ¯®à浪¥
;CY=1: à §¬¥à ¢ DE
;CY=0: à §¬¥à ¢ (HL+4)
PUSH DE
LD DE,SECTOR
LD BC,4
LDIR
POP DE
JR C,$+5
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
SCF
LD DE,2048
INC B
SBC HL,DE
JR NC,$-3
LD HL,SECBUF
PUSH HL
LOADER0 PUSH BC
CALL READCD
PUSH HL
LD HL,SECTOR+3
INC (HL)
DEC HL
JR Z,$-2
POP HL
POP BC
DJNZ LOADER0
POP HL
RET
;***************************************************************
;OUT_A
; IFN smuc
; IFN atm
; PUSH AF,BC
; CALL OPENPORTS
; POP BC,AF
; OUT (C),A
; JR CLOSEPORTS
;OPENPORTS
; LD A,%10101011
; LD BC,0X2A53
; PUSH BC
; LD BC,0X4177
; JP 0X3D2F
; ELSE
; LD IX,0X3FF0
; PUSH IX
; JP 0X3D2F
; ENDIF
; ELSE ;nemo
; OUT (C),A
; RET
; ENDIF
;IN_HDDSTAT
; LD A,device
; LD BC,hddhead
; CALL OUT_A
; LD BC,hddstat
;IN_A
; IFN smuc
; IFN atm
; PUSH BC
; CALL OPENPORTS
; POP BC
; IN A,(C)
;CLOSEPORTS
; PUSH AF,BC
; LD A,%10101011
; LD BC,0XFF77
; OUT (C),A
; POP BC,AF
; RET
; ELSE
; LD IX,0X3FF3
; PUSH IX
; JP 0X3D2F
; ENDIF
; ELSE
; IN A,(C)
; RET
; ENDIF
;
;HDSC
; PUSH AF
; LD A,device
; LD BC,hddhead
; CALL OUT_A
; POP AF
; LD BC,hddcmd
; CALL OUT_A
;
;NO_BSY
; CALL IN_HDDSTAT
; RLCA
; RET NC
; JR NO_BSY
;
;WAIT_DRQ
; CALL IN_HDDSTAT
; BIT 3,A
; RET NZ
; JR WAIT_DRQ
;
E
LEN_TO_HL
LD BC,hddcyllo
CALL IN_A
LD L,A
LD BC,hddcylhi
CALL IN_A
LD H,A
RET
;IN:HL-
; BC--
TRANS_IN
PUSH BC
CALL NO_BSY
;POP BC
;RET C
;PUSH BC
CALL WAIT_DRQ
POP BC
;RET C
INC BC
SRL B
RR C
TR_IN0 PUSH BC
LD BC,hdddatlo
CALL IN_A
LD (HL),A
INC HL
LD BC,hdddathi
CALL IN_A
LD (HL),A
POP BC
CPI
JP PE,TR_IN0
RET
;
ATAPI-
SEND_ATAPI
;LD A,device ;0XB0=slave
;LD BC,hddhead
;CALL OUT_A
LD BC,hddcyllo
XOR A
CALL OUT_A
LD BC,hddcylhi
LD A,HIGH (2048)
CALL OUT_A
LD A,0XA0
CALL HDSC
;RET C
LD B,6
TR_OUT0 PUSH BC
INC HL
LD A,(HL)
LD BC,hdddathi
CALL OUT_A
DEC HL
LD A,(HL)
LD BC,hdddatlo
CALL OUT_A
INC HL
INC HL
POP BC
DJNZ TR_OUT0
RET
READCDSECBUF
LD HL,SECBUF
READCD
;
lOAD_SECTOR
PUSH HL
LD HL,AP_READ
CALL SEND_ATAPI
POP HL
;RET C
;¡ë¢ ¥â á¨âã æ¨ï,çâ® CHECK CONDITION (D0 áâ âãá )=0,
; ¯à¨ í⮬ DRQ ¥ ¢ë¤ ¥âáï!
;CALL IN_HDDSTAT
;RRA
;RET C
CALL NO_BSY ;¨ ç¥ ¢¨á¥â ¯à¨ ¨¨æ-樨 CD
;RET C
;CALL WAIT_DRQ ;§¤¥áì ¢¨á¥â, ¥á«¨ ¨¨â¨âì ᫨誮¬ à ®
;RET C ;¯®á«¥ ¢ë室 à §£®ï¥âáï, ¦¤¥â ª®¯ªã ¨ ç¨â ¥â
;®¦¨¤ ¨¥ DRQ ¯® à¥æ¥¯âã Budder'
LD DE,0
RDCDDRQ CALL IN_HDDSTAT
BIT 3,A
JR NZ,READ_P2
INC DE
BIT 2,D ;4,D
JR Z,RDCDDRQ
PUSH HL
LD HL,AP_00
CALL SEND_ATAPI
POP HL
JR lOAD_SECTOR
READ_P2
LD BC,2048
CALL TRANS_IN
JP NO_BSY
autorunname
DB "AUTORUN.ZX"
autorunnamesz EQU $-autorunname
;ATAPI-
""
AP_00
DW 0
DUPL 10,0
;ATAPI-
"SPEED 1x"
AP_1x
DW 0XBB
DB 0
DB 176 ;1x=176k/s
DUPL 8,0
;ATAPI-
"
"
AP_READ
; IFN 0
; DW 0XBE ;"READ CD"
;SECTOR DB 0,0,0,0
; DB 0
; DB 0,1 ;=1 ᥪâ®à
; DB 0X10 ;ç¨â ¥¬ ⮫쪮 ¤ ë¥
; DB 0,0
; ELSE
DW 0X28 ;"READ(10)"
SECTOR DB 0,0,0,0
DB 0
DB 0,1 ;=1 ᥪâ®à
DB 0
DB 0,0
; ENDIF
AP_READTOC
DW 0X43 ;SCMSF=0,â.¥.ᥪâ®àë, ¥ MSF
DB 0 ;FORMAT=0:¢á¥ á¥áᨨ
DUPL 3,0
DB 0 ;á 1-© á¥áᨨ
DB HIGH (2048) ;¤«¨ â ¡«
DB LOW (2048)
DB 0X00 ;FUNC
DUPL 2,0
;end
; DISPLAY end-begin
; ORG 0X5CDD
; DB "boot B"
; INCLUDE "mrip.a80" ;,0XC0
DEPHASE