5x Read/Write отличаются от R/W Long тем, что R/W
теперь при HL=0 не переключают страницу. Вместо этого выдаётся ошибка. В случае записи пишутся 0 в оставшиеся сектора. Мелкие фиксы.
This commit is contained in:
parent
9430a99f2b
commit
4caee04133
@ -126,22 +126,22 @@ NOINT: POP AF
|
|||||||
; any adress < #C0 with mask %xxxx0000
|
; any adress < #C0 with mask %xxxx0000
|
||||||
; â ¡«¨æ ¤«ï Sprinter POST-Tester-a
|
; â ¡«¨æ ¤«ï Sprinter POST-Tester-a
|
||||||
TABLE_X:
|
TABLE_X:
|
||||||
.v0: DB 00101000b ; "0"
|
.v0: DB %00101000 ; "0" a
|
||||||
.v1: DB 10111101b ; "1"
|
.v1: DB %10111101 ; "1" ___
|
||||||
.v2: DB 00110010b ; "2"
|
.v2: DB %00110010 ; "2" f | g | b
|
||||||
.v3: DB 00110100b ; "3"
|
.v3: DB %00110100 ; "3" |___|
|
||||||
.v4: DB 10100101b ; "4"
|
.v4: DB %10100101 ; "4" e | | c
|
||||||
.v5: DB 01100100b ; "5"
|
.v5: DB %01100100 ; "5" |___|.
|
||||||
.v6: DB 01100000b ; "6"
|
.v6: DB %01100000 ; "6" d
|
||||||
.v7: DB 00111101b ; "7"
|
.v7: DB %00111101 ; "7"
|
||||||
.v8: DB 00100000b ; "8"
|
.v8: DB %00100000 ; "8" a - 7
|
||||||
.v9: DB 00100100b ; "9"
|
.v9: DB %00100100 ; "9" b - 6
|
||||||
.vA: DB 00100001b ; "A"
|
.vA: DB %00100001 ; "A" . - 5
|
||||||
.vB: DB 11100000b ; "B"
|
.vB: DB %11100000 ; "B" f - 4
|
||||||
.vC: DB 01101010b ; "C"
|
.vC: DB %01101010 ; "C" g - 3
|
||||||
.vD: DB 10110000b ; "D"
|
.vD: DB %10110000 ; "D" e - 2
|
||||||
.vE: DB 01100010b ; "E"
|
.vE: DB %01100010 ; "E" c - 1
|
||||||
.vF: DB 01100011b ; "F"
|
.vF: DB %01100011 ; "F" d - 0
|
||||||
ENDIF
|
ENDIF
|
||||||
;=======================================
|
;=======================================
|
||||||
;
|
;
|
||||||
@ -268,23 +268,23 @@ ROM_DISK.Pages: ;
|
|||||||
_mInfoALIGN #10,0
|
_mInfoALIGN #10,0
|
||||||
; any adress < #C0 with mask %xxxx0000
|
; any adress < #C0 with mask %xxxx0000
|
||||||
; â ¡«¨æ ¤«ï Sprinter POST-Tester-a
|
; â ¡«¨æ ¤«ï Sprinter POST-Tester-a
|
||||||
TABLE_X: ; â ĄŤ¨ć ¤Ťď Sprinter POST-Tester-a
|
TABLE_X:
|
||||||
.v0: DB %00101000 ; "0" a
|
.v0: DB %00101000 ; "0" a
|
||||||
.v1: DB %10111101 ; "1" ___
|
.v1: DB %10111101 ; "1" ___
|
||||||
.v2: DB %00110010 ; "2" f | g | b
|
.v2: DB %00110010 ; "2" f | g | b
|
||||||
.v3: DB %00110100 ; "3" |___|
|
.v3: DB %00110100 ; "3" |___|
|
||||||
.v4: DB %10100101 ; "4" e | | c
|
.v4: DB %10100101 ; "4" e | | c
|
||||||
.v5: DB %01100100 ; "5" |___|
|
.v5: DB %01100100 ; "5" |___|.
|
||||||
.v6: DB %01100000 ; "6" d
|
.v6: DB %01100000 ; "6" d
|
||||||
.v7: DB %00111101 ; "7"
|
.v7: DB %00111101 ; "7"
|
||||||
.v8: DB %00100000 ; "8" a - 7
|
.v8: DB %00100000 ; "8" a - 7
|
||||||
.v9: DB %00100100 ; "9" b - 6
|
.v9: DB %00100100 ; "9" b - 6
|
||||||
.vA: DB %00100001 ; "A" f - 4
|
.vA: DB %00100001 ; "A" . - 5
|
||||||
.vB: DB %11100000 ; "B" g - 3
|
.vB: DB %11100000 ; "B" f - 4
|
||||||
.vC: DB %01101010 ; "C" e - 2
|
.vC: DB %01101010 ; "C" g - 3
|
||||||
.vD: DB %10110000 ; "D" c - 1
|
.vD: DB %10110000 ; "D" e - 2
|
||||||
.vE: DB %01100010 ; "E" d - 0
|
.vE: DB %01100010 ; "E" c - 1
|
||||||
.vF: DB %01100011 ; "F"
|
.vF: DB %01100011 ; "F" d - 0
|
||||||
ENDIF
|
ENDIF
|
||||||
;=======================================
|
;=======================================
|
||||||
;
|
;
|
||||||
@ -424,6 +424,25 @@ EXTINT: OR A
|
|||||||
|
|
||||||
|
|
||||||
; ==== POST PROCs =================
|
; ==== POST PROCs =================
|
||||||
|
; LPT 0 - start
|
||||||
|
; post 1. TEST RAM BUS
|
||||||
|
; IF ERROR -> ERROR RAM BUS - CODE 'X'X'X'X... - ¢ëᢥâ¨âì ®¬¥à ®è¨¡®ç®£® ¡¨â
|
||||||
|
; LPT 1 - post 1 OK
|
||||||
|
; post 2 TEST ADRESS BUS
|
||||||
|
; IF ERROR -> ®è¨¡ª ¤à¥á CODE 'XXXX - ¢ë¢¥á⨠áâ à訩 ¡ ©â á § ¯ï⮩, ¯ ã§ , ¢ë¢¥á⨠¬« ¤è¨© ¡¥§ § ¯ï⮩
|
||||||
|
; LPT 2 - post 2 OK
|
||||||
|
; post 3 init DCP
|
||||||
|
; no errors
|
||||||
|
; LPT 3 - post 3 OK
|
||||||
|
; post 4 TEST RAM PAGES § ¯¨áì ¢ ¯®àâ áâà ¨æë, ç⥨¥ § ¯¨á ®£®
|
||||||
|
; IF ERROR -> ®è¨¡ª ¯¥à¥ª«î票ï Port- CODE 'XX - ¢ë¢®¤ ¡ ©â § ¯¨á ®£® ¢ ¯®àâ
|
||||||
|
; LPT 4 - post 4 OK
|
||||||
|
; post 5 ¯à®¢¥àª ç¨áâ®âë è¨ë ¤ ëå Z84C15
|
||||||
|
; IF ERROR -> ERROR CODE '_'XX - ¢ ¡¨®á¥ ®è¨¡ª¥ ¥ § ¢¨á ¥â, å§ ¯®ç¥¬ã, ¬®¦¥â á«ãç © ª®äë á £àï§®© 訮© ᯥªâàã¬
|
||||||
|
; LPT 5 - post 5 OK
|
||||||
|
; LPT 4 - post 5 error - áâ àë© ¡¨®á
|
||||||
|
; LPT F - post 5 error - ¡¨®á 05/04/2025)))
|
||||||
|
;
|
||||||
MODULE POST_TEST
|
MODULE POST_TEST
|
||||||
START:
|
START:
|
||||||
; *********************************
|
; *********************************
|
||||||
@ -499,7 +518,7 @@ POST_1_RAM_BUS:
|
|||||||
; ¡¥áª®¥çë© æ¨ª«
|
; ¡¥áª®¥çë© æ¨ª«
|
||||||
INC L
|
INC L
|
||||||
LD A,L
|
LD A,L
|
||||||
AND #AF
|
AND +(TABLE_X or #0F) ;%1010'1111
|
||||||
LD L,A
|
LD L,A
|
||||||
JR .ERB_2
|
JR .ERB_2
|
||||||
|
|
||||||
@ -548,12 +567,12 @@ POST_2_ADRESS_BUS:
|
|||||||
.error:
|
.error:
|
||||||
.TSAB_4:
|
.TSAB_4:
|
||||||
LD C,D
|
LD C,D
|
||||||
LD B,11011111b
|
LD B,%1101'1111
|
||||||
LD IX,.TSAB_3
|
LD IX,.TSAB_3
|
||||||
JR OUT_C_BYTE ; ¢ë¢¥á⨠áâ à訩 ¡ ©â á § ¯ï⮩
|
JR OUT_C_BYTE ; ¢ë¢¥á⨠áâ à訩 ¡ ©â á § ¯ï⮩
|
||||||
.TSAB_3:
|
.TSAB_3:
|
||||||
LD C,E
|
LD C,E
|
||||||
LD B,#FF
|
LD B,%1111'1111
|
||||||
LD IX,.TSAB_4
|
LD IX,.TSAB_4
|
||||||
JR OUT_C_BYTE ; ¢ë¢¥á⨠¬« ¤è¨© ¡¥§ § ¯ï⮩
|
JR OUT_C_BYTE ; ¢ë¢¥á⨠¬« ¤è¨© ¡¥§ § ¯ï⮩
|
||||||
|
|
||||||
@ -663,7 +682,7 @@ POST_4_PAGES:
|
|||||||
.error: LD C,B
|
.error: LD C,B
|
||||||
LD IX,.error_out_ret
|
LD IX,.error_out_ret
|
||||||
.error_out_ret:
|
.error_out_ret:
|
||||||
LD B,11011111b
|
LD B,%1101'1111
|
||||||
JP OUT_C_BYTE
|
JP OUT_C_BYTE
|
||||||
|
|
||||||
; ***********************************
|
; ***********************************
|
||||||
@ -679,11 +698,17 @@ POST_5_DATA_BUS:
|
|||||||
LD B,0
|
LD B,0
|
||||||
.loop: IN A,(0)
|
.loop: IN A,(0)
|
||||||
CP #FF
|
CP #FF
|
||||||
;JR NZ,.error ;!!!!! ŻŽáŹŽâŕĽâě
|
IF ERROR_POST_5
|
||||||
JR NZ,POST_5_ERROR
|
JR NZ,.error ;!!!!! ¯®á¬®âà¥âì
|
||||||
|
ELSE
|
||||||
|
JR NZ,POST_5_ERROR
|
||||||
|
ENDIF
|
||||||
DJNZ .loop
|
DJNZ .loop
|
||||||
|
LD A,(TABLE_X.v5) ;rdlow-ok
|
||||||
JR POST_5_OK
|
JR POST_5_OK
|
||||||
|
;
|
||||||
|
;
|
||||||
|
IF ERROR_POST_5
|
||||||
; ERROR CODE '_'XX
|
; ERROR CODE '_'XX
|
||||||
.error:
|
.error:
|
||||||
LD C,A
|
LD C,A
|
||||||
@ -702,15 +727,18 @@ POST_5_DATA_BUS:
|
|||||||
OR E
|
OR E
|
||||||
JR NZ,.LOOP_WTT4
|
JR NZ,.LOOP_WTT4
|
||||||
JR .erb1
|
JR .erb1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
; **********************************
|
; **********************************
|
||||||
; ===== Point 5 =========
|
; ===== Point 5 =========
|
||||||
; **********************************
|
; **********************************
|
||||||
|
IFN ERROR_POST_5
|
||||||
|
POST_5_ERROR:
|
||||||
|
LD A,(TABLE_X.vF) ;rdlow-ok
|
||||||
|
ENDIF
|
||||||
|
|
||||||
POST_5_OK:
|
POST_5_OK:
|
||||||
LD A,(TABLE_X.v5) ;rdlow-ok
|
|
||||||
OUT (Z84.PIO.Port_A.Data),A ; ¢ë¢¥á⨠"5"
|
OUT (Z84.PIO.Port_A.Data),A ; ¢ë¢¥á⨠"5"
|
||||||
POST_5_ERROR:
|
|
||||||
; **********************************
|
; **********************************
|
||||||
; POST § ¢¥àè¥
|
; POST § ¢¥àè¥
|
||||||
ENDMODULE
|
ENDMODULE
|
||||||
|
|||||||
@ -3,6 +3,10 @@
|
|||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
|
|
||||||
|
|
||||||
|
;!TODO
|
||||||
|
; ®¡ê¥¤¥¨âì ¯à®æ¥¤ãàë FDD_5x_LONG_READ ¨ FDD_5x_LONG_WRITE
|
||||||
|
; ®¡ê¥¤¥¨âì ¯à®æ¥¤ãàë READ_SECTOR ¨ WR_SEC
|
||||||
|
|
||||||
|
|
||||||
; FDD.CHANGE:
|
; FDD.CHANGE:
|
||||||
; LD A,#01
|
; LD A,#01
|
||||||
@ -178,10 +182,9 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
|
|||||||
; HL:IX - Sector + Sector counter
|
; HL:IX - Sector + Sector counter
|
||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
FDD_5x_READ:
|
FDD_5x_READ: EX AF,AF'
|
||||||
EX AF,AF'
|
IN A,(SLOT3)
|
||||||
IN A,(SLOT3)
|
EX AF,AF'
|
||||||
EX AF,AF'
|
|
||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
;Function: Long Read Sectors
|
;Function: Long Read Sectors
|
||||||
; A - Disk
|
; A - Disk
|
||||||
@ -194,7 +197,11 @@ FDD_5x_READ:
|
|||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
FDD_5x_LONG_READ:
|
FDD_5x_LONG_READ:
|
||||||
CALL SAVE_INTERRUPTS.switch_off
|
EXX
|
||||||
|
LD B,#80 ; COMMAND READ
|
||||||
|
EXX
|
||||||
|
;
|
||||||
|
.RW_Shared: CALL SAVE_INTERRUPTS.switch_off
|
||||||
CALL .Start
|
CALL .Start
|
||||||
JP SAVE_INTERRUPTS.restore
|
JP SAVE_INTERRUPTS.restore
|
||||||
;
|
;
|
||||||
@ -202,8 +209,9 @@ FDD_5x_LONG_READ:
|
|||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH HL
|
PUSH HL
|
||||||
PUSH IX
|
PUSH IX
|
||||||
|
;
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD C,A
|
LD C,A ; Memory Page Number
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
PUSH BC
|
PUSH BC
|
||||||
CALL SET_DOS_ON
|
CALL SET_DOS_ON
|
||||||
@ -212,46 +220,53 @@ FDD_5x_LONG_READ:
|
|||||||
CALL NTRACK
|
CALL NTRACK
|
||||||
POP BC
|
POP BC
|
||||||
EX DE,HL
|
EX DE,HL
|
||||||
; LD A,B
|
|
||||||
; OR A
|
|
||||||
; JP Z,RETDOS
|
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD IY,(FDD_INIT_TABLE.FDD_0.BytesPerSector)
|
LD IY,(FDD_INIT_TABLE.FDD_0.BytesPerSector)
|
||||||
LD XH,C
|
LD XH,C ; Memory Page Number
|
||||||
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
|
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
|
||||||
LD C,A
|
LD C,A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
.DSK_LP: LD A,D
|
.DSK_LP: LD A,D
|
||||||
EXX
|
EXX
|
||||||
CALL SEEK
|
PUSH BC
|
||||||
|
CALL SEEK
|
||||||
|
POP BC
|
||||||
EXX
|
EXX
|
||||||
PUSH DE
|
PUSH DE
|
||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH HL
|
PUSH HL
|
||||||
CALL READ_SECTOR
|
;CALL READ_SECTOR
|
||||||
|
CALL FDD_RW_SECTOR
|
||||||
JR C,ERRDOS
|
JR C,ERRDOS
|
||||||
LD D,YH
|
; à §¬¥à ᥪâ®à
|
||||||
LD E,YL
|
LD D,YH
|
||||||
|
LD E,YL
|
||||||
|
;
|
||||||
POP HL
|
POP HL
|
||||||
POP BC
|
POP BC
|
||||||
ADD HL,DE
|
ADD HL,DE
|
||||||
JR NC,.THISRD
|
;
|
||||||
IN A,(SLOT3)
|
CALL C,CHANGE_MEM_BLK
|
||||||
EX AF,AF'
|
; IN A,(SLOT3)
|
||||||
LD A,SYS_PAGE
|
; EX AF,AF'
|
||||||
OUT (SLOT3),A
|
; LD A,SYS_PAGE
|
||||||
LD D,#C2
|
; OUT (SLOT3),A
|
||||||
LD E,XH
|
; LD D,high SYS_PAGE.RAM_TABLE
|
||||||
LD A,(DE)
|
; LD E,XH
|
||||||
LD XH,A
|
; LD A,(DE)
|
||||||
EX AF,AF'
|
; LD XH,A
|
||||||
OUT (SLOT3),A
|
; EX AF,AF'
|
||||||
SET 7,H
|
; OUT (SLOT3),A
|
||||||
SET 6,H
|
; ; SET 7,H
|
||||||
|
; ; SET 6,H
|
||||||
|
; LD A,%1100'0000
|
||||||
|
; OR H
|
||||||
|
; LD H,A
|
||||||
|
;
|
||||||
.THISRD: POP DE
|
.THISRD: POP DE
|
||||||
LD A,C
|
LD A,C
|
||||||
INC E
|
INC E
|
||||||
@ -261,7 +276,7 @@ FDD_5x_LONG_READ:
|
|||||||
INC D
|
INC D
|
||||||
.NINC_T: DJNZ .DSK_LP
|
.NINC_T: DJNZ .DSK_LP
|
||||||
.RETDOS: CALL SET_DOS_OFF
|
.RETDOS: CALL SET_DOS_OFF
|
||||||
LD A,XH
|
LD A,XH ; Memory Page Number
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
EX DE,HL
|
EX DE,HL
|
||||||
POP IX
|
POP IX
|
||||||
@ -276,12 +291,19 @@ FDD_5x_LONG_READ:
|
|||||||
JR NZ,.ADD8BIT
|
JR NZ,.ADD8BIT
|
||||||
INC B
|
INC B
|
||||||
.ADD8BIT: ADD IX,BC
|
.ADD8BIT: ADD IX,BC
|
||||||
LD BC,0
|
;!TEST
|
||||||
ADC HL,BC
|
;LD BC,0
|
||||||
LD B,A
|
;ADC HL,BC
|
||||||
XOR A
|
;LD B,A
|
||||||
RET
|
;XOR A
|
||||||
;
|
;RET
|
||||||
|
;
|
||||||
|
LD B,A
|
||||||
|
RET NC
|
||||||
|
INC HL
|
||||||
|
XOR A
|
||||||
|
RET
|
||||||
|
;
|
||||||
ERRDOS: POP HL
|
ERRDOS: POP HL
|
||||||
POP BC
|
POP BC
|
||||||
POP DE
|
POP DE
|
||||||
@ -289,7 +311,7 @@ ERRDOS: POP HL
|
|||||||
EX DE,HL
|
EX DE,HL
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
EXX
|
EXX
|
||||||
LD C,XH
|
LD C,XH ; Memory Page Number
|
||||||
EXX
|
EXX
|
||||||
LD A,B
|
LD A,B
|
||||||
POP IX
|
POP IX
|
||||||
@ -307,7 +329,7 @@ ERRDOS: POP HL
|
|||||||
ADC HL,BC
|
ADC HL,BC
|
||||||
POP BC
|
POP BC
|
||||||
EXX
|
EXX
|
||||||
LD A,C
|
LD A,C
|
||||||
EXX
|
EXX
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
SCF
|
SCF
|
||||||
@ -323,10 +345,9 @@ ERRDOS: POP HL
|
|||||||
; HL:IX - Sector + Sector counter
|
; HL:IX - Sector + Sector counter
|
||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
FDD_5x_WRITE:
|
FDD_5x_WRITE: EX AF,AF'
|
||||||
EX AF,AF'
|
IN A,(SLOT3)
|
||||||
IN A,(SLOT3)
|
EX AF,AF'
|
||||||
EX AF,AF'
|
|
||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
;Function: Long Write Sectors
|
;Function: Long Write Sectors
|
||||||
; A - Disk
|
; A - Disk
|
||||||
@ -340,6 +361,12 @@ FDD_5x_WRITE:
|
|||||||
;?? B - Sector counter
|
;?? B - Sector counter
|
||||||
;[]===========================================================[]
|
;[]===========================================================[]
|
||||||
FDD_5x_LONG_WRITE:
|
FDD_5x_LONG_WRITE:
|
||||||
|
EXX
|
||||||
|
LD B,#A0 ;COMMAND WRITE
|
||||||
|
EXX
|
||||||
|
JP FDD_5x_LONG_READ.RW_Shared
|
||||||
|
|
||||||
|
/*
|
||||||
CALL SAVE_INTERRUPTS.switch_off
|
CALL SAVE_INTERRUPTS.switch_off
|
||||||
CALL .Start
|
CALL .Start
|
||||||
JP SAVE_INTERRUPTS.restore
|
JP SAVE_INTERRUPTS.restore
|
||||||
@ -348,8 +375,9 @@ FDD_5x_LONG_WRITE:
|
|||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH HL
|
PUSH HL
|
||||||
PUSH IX
|
PUSH IX
|
||||||
|
;
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD C,A
|
LD C,A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
PUSH BC
|
PUSH BC
|
||||||
CALL SET_DOS_ON
|
CALL SET_DOS_ON
|
||||||
@ -358,9 +386,6 @@ FDD_5x_LONG_WRITE:
|
|||||||
CALL NTRACK
|
CALL NTRACK
|
||||||
POP BC
|
POP BC
|
||||||
EX DE,HL
|
EX DE,HL
|
||||||
; LD A,B
|
|
||||||
; OR A
|
|
||||||
; JP Z,RETDOS
|
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
@ -372,32 +397,41 @@ FDD_5x_LONG_WRITE:
|
|||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
.DSK_LP2: LD A,D
|
.DSK_LP2: LD A,D
|
||||||
EXX
|
EXX
|
||||||
CALL SEEK
|
PUSH BC
|
||||||
|
CALL SEEK
|
||||||
|
POP BC
|
||||||
EXX
|
EXX
|
||||||
PUSH DE
|
PUSH DE
|
||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH HL
|
PUSH HL
|
||||||
CALL WR_SEC
|
CALL WR_SEC
|
||||||
JR C,ERRDOS
|
JR C,ERRDOS
|
||||||
LD D,YH
|
; à §¬¥à ᥪâ®à
|
||||||
LD E,YL
|
LD D,YH
|
||||||
|
LD E,YL
|
||||||
|
;
|
||||||
POP HL
|
POP HL
|
||||||
POP BC
|
POP BC
|
||||||
ADD HL,DE
|
ADD HL,DE
|
||||||
JR NC,.THISWR
|
;
|
||||||
IN A,(SLOT3)
|
CALL C,CHANGE_MEM_BLK
|
||||||
EX AF,AF'
|
; IN A,(SLOT3)
|
||||||
LD A,SYS_PAGE
|
; EX AF,AF'
|
||||||
OUT (SLOT3),A
|
; LD A,SYS_PAGE
|
||||||
LD D,#C2
|
; OUT (SLOT3),A
|
||||||
LD E,XH
|
; LD D,high SYS_PAGE.RAM_TABLE
|
||||||
LD A,(DE)
|
; LD E,XH
|
||||||
LD XH,A
|
; LD A,(DE)
|
||||||
EX AF,AF'
|
; LD XH,A
|
||||||
OUT (SLOT3),A
|
; EX AF,AF'
|
||||||
SET 7,H
|
; OUT (SLOT3),A
|
||||||
SET 6,H
|
; ; SET 7,H
|
||||||
|
; ; SET 6,H
|
||||||
|
; LD A,%1100'0000
|
||||||
|
; OR H
|
||||||
|
; LD H,A
|
||||||
|
;
|
||||||
.THISWR: POP DE
|
.THISWR: POP DE
|
||||||
LD A,C
|
LD A,C
|
||||||
INC E
|
INC E
|
||||||
@ -435,15 +469,16 @@ FDD_5x_LONG_WRITE:
|
|||||||
XOR A
|
XOR A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
;
|
;
|
||||||
;-------------------------------
|
;-------------------------------
|
||||||
;READ SECTOR
|
;READ SECTOR
|
||||||
;-------------------------------
|
;-------------------------------
|
||||||
READ_SECTOR: LD D,5 ;RETRY COUNT
|
READ_SECTOR: LD D,5 ;RETRY COUNT
|
||||||
.RRETRY: ;DI
|
.HL_RETRY: ;DI
|
||||||
|
PUSH HL
|
||||||
PUSH DE
|
PUSH DE
|
||||||
LD A,E
|
LD A,E
|
||||||
INC A
|
INC A
|
||||||
@ -455,167 +490,203 @@ READ_SECTOR: LD D,5 ;RETRY COUNT
|
|||||||
;
|
;
|
||||||
LD B,4 ; áçñâ稪
|
LD B,4 ; áçñâ稪
|
||||||
LD C,FDC_93.Data
|
LD C,FDC_93.Data
|
||||||
LD A,#80 ;!HARDCODE COMMAND READ
|
LD A,#80 ; COMMAND READ
|
||||||
OUT (FDC_93.Command),A
|
OUT (FDC_93.Command),A
|
||||||
|
;
|
||||||
.FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
|
.FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
|
||||||
AND #C0
|
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ëå = 1). b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0).
|
||||||
JR NZ,.FDR004
|
JR NZ,.read_loop
|
||||||
INC DE
|
INC DE
|
||||||
LD A,E
|
LD A,E
|
||||||
OR D
|
OR D
|
||||||
JR NZ,.FDR001
|
JR NZ,.FDR001
|
||||||
|
;
|
||||||
DJNZ .FDR001
|
DJNZ .FDR001
|
||||||
SCF
|
SCF
|
||||||
JR .FDR005
|
JR .FDR005
|
||||||
|
;READ BYTE
|
||||||
|
.read_loop: INI
|
||||||
|
.wait_data: IN A,(FDC_93.DrvCTRL)
|
||||||
|
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ëå = 1). b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0).
|
||||||
|
JR Z,.wait_data
|
||||||
|
JP P,.read_loop ; JUMP if "¢ë¯®«ï¥âáï ª®¬ ¤ = 0"
|
||||||
;
|
;
|
||||||
.FDR004: INI ;READ BYTE
|
|
||||||
.FDR002: IN A,(FDC_93.DrvCTRL)
|
|
||||||
AND #C0
|
|
||||||
JR Z,.FDR002
|
|
||||||
JP P,.FDR004
|
|
||||||
.FDR005: EX AF,AF'
|
.FDR005: EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
;
|
;
|
||||||
POP DE
|
POP DE
|
||||||
|
POP HL
|
||||||
;EI
|
;EI
|
||||||
|
LD A,BIOS.Error.NotReady
|
||||||
|
JR C,.ERR_XRD
|
||||||
|
;
|
||||||
IN A,(FDC_93.Command)
|
IN A,(FDC_93.Command)
|
||||||
LD C,A
|
LD C,A
|
||||||
;R01 ; JP C,ERRRD ;READ ERROR
|
|
||||||
; [x] 29/06/2024
|
|
||||||
;JP C,.ERR_XRD
|
|
||||||
JR NC,.NO_ERR_XRD
|
|
||||||
DEC D
|
|
||||||
JR Z,.RSTOP
|
|
||||||
JR .RRETRY
|
|
||||||
;
|
|
||||||
.NO_ERR_XRD: ;
|
|
||||||
AND #7F
|
AND #7F
|
||||||
RET Z
|
RET Z ; ‚ë室 ¡¥§ ®è¨¡®ª
|
||||||
|
;
|
||||||
BIT 2,C
|
BIT 2,C
|
||||||
JR NZ,.ERDATA
|
JR NZ,.ERDATA
|
||||||
|
;
|
||||||
LD A,BIOS.Error.Seek
|
LD A,BIOS.Error.Seek
|
||||||
DEC D
|
.ERR_XRD: DEC D
|
||||||
JR Z,.RSTOP
|
JR Z,.RSTOP
|
||||||
|
;
|
||||||
PUSH DE
|
PUSH DE
|
||||||
|
PUSH HL
|
||||||
CALL RESWG ; RESET_WG
|
CALL RESWG ; RESET_WG
|
||||||
LD A,XL
|
LD A,XL
|
||||||
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
|
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
|
||||||
.ERR_XRD: POP DE
|
POP HL
|
||||||
JR .RRETRY
|
POP DE
|
||||||
|
JR .HL_RETRY
|
||||||
;
|
;
|
||||||
.ERDATA: DEC D ; POTERIA DANNYH
|
.ERDATA: DEC D ; ¯®â¥àï ¤ ëå
|
||||||
JR NZ,.RRETRY
|
JR NZ,.HL_RETRY
|
||||||
|
; Error Read
|
||||||
.ERRRD: LD A,BIOS.Error.Read
|
.ERRRD: LD A,BIOS.Error.Read
|
||||||
.RSTOP: EX AF,AF'
|
.RSTOP: EX AF,AF'
|
||||||
LD A,#D0
|
LD A,#D0
|
||||||
OUT (FDC_93.Command),A ;STOP OPERATION
|
OUT (FDC_93.Command),A ;STOP OPERATION
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
BIT 0,C
|
BIT 0,C
|
||||||
SCF
|
SCF
|
||||||
RET Z
|
RET Z
|
||||||
LD A,BIOS.Error.SectorNotFound
|
LD A,BIOS.Error.SectorNotFound
|
||||||
RET
|
RET
|
||||||
; ; ;
|
; ; ;
|
||||||
|
*/
|
||||||
|
|
||||||
;
|
;
|
||||||
;-------------------------------
|
;-------------------------------
|
||||||
;WRITE SECTOR
|
;WRITE SECTOR
|
||||||
;-------------------------------
|
;-------------------------------
|
||||||
WR_SEC: LD D,5 ;RETRY COUNT
|
FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
|
||||||
.WRETRY:
|
.RETRY: DI
|
||||||
;DI
|
PUSH HL
|
||||||
PUSH DE
|
PUSH DE
|
||||||
LD A,E
|
LD A,E
|
||||||
INC A
|
INC A
|
||||||
OUT (FDC_93.Sector),A
|
OUT (FDC_93.Sector),A
|
||||||
.FDWRITE:
|
IN A,(SLOT3)
|
||||||
IN A,(SLOT3)
|
EX AF,AF'
|
||||||
EX AF,AF'
|
LD A,XH
|
||||||
LD A,XH
|
OUT (SLOT3),A
|
||||||
OUT (SLOT3),A
|
;
|
||||||
LD B,4
|
LD B,4
|
||||||
LD C,FDC_93.Data
|
LD C,FDC_93.Data
|
||||||
LD A,#A0 ;COMMAND WRITE
|
EXX
|
||||||
OUT (FDC_93.Command),A
|
LD A,B ; COMMAND read or write
|
||||||
.FDW001:
|
EXX
|
||||||
IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
|
OUT (FDC_93.Command),A
|
||||||
AND #C0
|
;
|
||||||
JR NZ,.FDW004
|
.wait_loop: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
|
||||||
INC DE
|
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ëå = 1). b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0).
|
||||||
LD A,E
|
JR NZ,.RW_PROC
|
||||||
OR D
|
INC DE
|
||||||
JR NZ,.FDW001
|
LD A,E
|
||||||
DJNZ .FDW001
|
OR D
|
||||||
SCF
|
JR NZ,.wait_loop
|
||||||
JR .FDW005
|
DJNZ .wait_loop
|
||||||
.FDW004:
|
SCF
|
||||||
OUTI ;WRITE BYTE
|
JR .after_rw ; error
|
||||||
.FDW002:
|
;
|
||||||
IN A,(FDC_93.DrvCTRL)
|
.RW_PROC: EXX
|
||||||
AND #C0
|
BIT 5,B
|
||||||
JR Z,.FDW002
|
EXX
|
||||||
JP P,.FDW004
|
JR NZ,.write_loop
|
||||||
.FDW005:
|
;READ BYTE
|
||||||
EX AF,AF'
|
.read_loop: INI
|
||||||
OUT (SLOT3),A
|
.wait_data_r: IN A,(FDC_93.DrvCTRL)
|
||||||
EX AF,AF'
|
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ëå = 1). b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0).
|
||||||
;-------------------------------
|
JR Z,.wait_data_r
|
||||||
POP DE
|
JP P,.read_loop ; JUMP if "¢ë¯®«ï¥âáï ª®¬ ¤ = 0"
|
||||||
;EI
|
.rw_return: ;
|
||||||
IN A,(FDC_93.Command)
|
.after_rw: EX AF,AF'
|
||||||
LD C,A
|
OUT (SLOT3),A
|
||||||
;R01
|
EX AF,AF'
|
||||||
JR C,.ERR_XWR
|
;
|
||||||
AND #7F
|
POP DE
|
||||||
RET Z
|
POP HL
|
||||||
BIT 6,C
|
; ¯à¥àë¢ ¨ï
|
||||||
LD A,BIOS.Error.WriteProtect
|
LD A,R
|
||||||
JR NZ,.WSTOP
|
AND %1000'0000
|
||||||
BIT 2,C
|
JR Z,.no_EI
|
||||||
JR NZ,.EWDATA
|
EI
|
||||||
LD A,BIOS.Error.Seek
|
.no_EI: ;
|
||||||
DEC D
|
LD A,BIOS.Error.NotReady
|
||||||
JR Z,.WSTOP
|
JR C,.CMD_ERROR
|
||||||
.ERR_XWR:
|
;
|
||||||
PUSH DE
|
IN A,(FDC_93.Command)
|
||||||
CALL RESWG ; RESET_WG
|
LD C,A
|
||||||
LD A,XL
|
AND #7F
|
||||||
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
|
; NORMAL EXIT
|
||||||
POP DE
|
RET Z
|
||||||
JR .WRETRY
|
;
|
||||||
.EWDATA:
|
BIT 6,C
|
||||||
DEC D ; POTERIA DANNYH
|
LD A,BIOS.Error.WriteProtect
|
||||||
JR NZ,.WRETRY
|
JR NZ,.error_exit
|
||||||
.ERRWR: LD A,BIOS.Error.Write
|
;
|
||||||
.WSTOP: EX AF,AF'
|
BIT 2,C
|
||||||
LD A,#D0
|
JR NZ,.data_lost
|
||||||
OUT (FDC_93.Command),A ;STOP OPERATION
|
;
|
||||||
EX AF,AF'
|
LD A,BIOS.Error.Seek
|
||||||
BIT 0,C
|
.CMD_ERROR: DEC D
|
||||||
SCF
|
JR Z,.error_exit
|
||||||
RET Z
|
;
|
||||||
LD A,BIOS.Error.SectorNotFound
|
PUSH DE
|
||||||
RET
|
PUSH HL
|
||||||
|
CALL RESWG ; RESET_WG
|
||||||
|
LD A,XL
|
||||||
|
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
|
||||||
|
POP HL
|
||||||
|
POP DE
|
||||||
|
JR .RETRY
|
||||||
|
;
|
||||||
|
.data_lost: DEC D ; ¯®â¥àï ¤ ëå
|
||||||
|
JR NZ,.RETRY
|
||||||
|
;
|
||||||
|
EXX
|
||||||
|
BIT 5,B
|
||||||
|
EXX
|
||||||
|
LD A,BIOS.Error.Read ; Error Read
|
||||||
|
JR Z,.error_exit
|
||||||
|
;
|
||||||
|
LD A,BIOS.Error.Write ; Error Write
|
||||||
|
.error_exit: EX AF,AF'
|
||||||
|
LD A,#D0
|
||||||
|
OUT (FDC_93.Command),A ;STOP OPERATION
|
||||||
|
EX AF,AF'
|
||||||
|
BIT 0,C
|
||||||
|
SCF
|
||||||
|
RET Z
|
||||||
|
LD A,BIOS.Error.SectorNotFound
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
;WRITE BYTE
|
||||||
|
.write_loop: OUTI
|
||||||
|
.wwait_data: IN A,(FDC_93.DrvCTRL)
|
||||||
|
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ëå = 1). b7: INTRQ (¢ë¯®«ï¥âáï ª®¬ ¤ = 0).
|
||||||
|
JR Z,.wwait_data
|
||||||
|
JP P,.write_loop
|
||||||
|
JP .rw_return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;
|
;
|
||||||
; ‚àã¡ ¥â âà¥âìî ª àâã ¯®à⮢
|
; ‚àã¡ ¥â âà¥âìî ª àâã ¯®à⮢
|
||||||
SET_DOS_ON:
|
SET_DOS_ON: EX AF,AF'
|
||||||
EX AF,AF'
|
LD A,CNF_PORT.CNF_3 + ROM.BIOS
|
||||||
LD A,CNF_PORT.CNF_3 + ROM.BIOS
|
OUT (SYS_PORT.ROM),A ; - OPEN
|
||||||
OUT (SYS_PORT.ROM),A ; - OPEN
|
EX AF,AF'
|
||||||
EX AF,AF'
|
RET
|
||||||
RET
|
|
||||||
; ‚àã¡ ¥â ã«¥¢ãî ª àâã ¯®à⮢
|
; ‚àã¡ ¥â ã«¥¢ãî ª àâã ¯®à⮢
|
||||||
SET_DOS_OFF:
|
SET_DOS_OFF: EX AF,AF'
|
||||||
EX AF,AF'
|
LD A,CNF_PORT.CNF_0 + ROM.BIOS
|
||||||
LD A,CNF_PORT.CNF_0 + ROM.BIOS
|
OUT (SYS_PORT.ROM),A ; - CLOSE
|
||||||
OUT (SYS_PORT.ROM),A ; - CLOSE
|
EX AF,AF'
|
||||||
EX AF,AF'
|
RET
|
||||||
RET
|
|
||||||
|
|
||||||
;
|
;
|
||||||
S_FDD: PUSH BC
|
S_FDD: PUSH BC
|
||||||
@ -625,12 +696,12 @@ S_FDD: PUSH BC
|
|||||||
OUT (FDC_93.DrvCTRL),A
|
OUT (FDC_93.DrvCTRL),A
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
|
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
|
||||||
AND #FE
|
AND #FE
|
||||||
OR B
|
OR B
|
||||||
LD (FDD_INIT_TABLE.FDD_0.DISK),A
|
LD (FDD_INIT_TABLE.FDD_0.DISK),A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
POP BC
|
POP BC
|
||||||
@ -672,10 +743,10 @@ FDD.SET1440: LD A,FDD_Density.SET_1440
|
|||||||
;
|
;
|
||||||
SET_SPEED: IN A,(SLOT3)
|
SET_SPEED: IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD A,(FDD_INIT_TABLE.FDD_0.F144)
|
LD A,(FDD_INIT_TABLE.FDD_0.F144)
|
||||||
AND #80
|
AND #80
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
@ -687,116 +758,118 @@ FDD.SET720: LD A,FDD_Density.SET_720
|
|||||||
|
|
||||||
; ¯à¥àë¢ ¨ï ¤®«¦ë ¡ëâì ®âª«îç¥ë
|
; ¯à¥àë¢ ¨ï ¤®«¦ë ¡ëâì ®âª«îç¥ë
|
||||||
DISK_ID: EXX
|
DISK_ID: EXX
|
||||||
CALL SET_SPEED
|
CALL SET_SPEED
|
||||||
IN A,(FDC_93.Track)
|
IN A,(FDC_93.Track)
|
||||||
OUT (FDC_93.Data),A
|
OUT (FDC_93.Data),A
|
||||||
LD A,#18 ;!TODO ¢ë¯¨á âì ª®¬¬ ¤ë ‚ƒ ;SEARCH ; !HARDCODE
|
LD A,#18 ;!TODO ¢ë¯¨á âì ª®¬¬ ¤ë ‚ƒ ;SEARCH ; !HARDCODE
|
||||||
CALL EXECOM
|
CALL EXECOM
|
||||||
LD C,4 ; áçñâ稪
|
LD C,4 ; áçñâ稪
|
||||||
.loop_reg_C: LD A,#C0
|
.loop_reg_C: LD A,#C0
|
||||||
OUT (FDC_93.Command),A
|
OUT (FDC_93.Command),A
|
||||||
LD HL,#F000 ; áçñâ稪
|
LD HL,#F000 ; áçñâ稪
|
||||||
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
|
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
|
||||||
AND #C0
|
AND #C0
|
||||||
JR Z,.ID_LP4
|
JR Z,.ID_LP4
|
||||||
;
|
;
|
||||||
.ID_LP2: IN A,(FDC_93.Data)
|
.ID_LP2: IN A,(FDC_93.Data)
|
||||||
.ID_LP3: IN A,(FDC_93.DrvCTRL)
|
.ID_LP3: IN A,(FDC_93.DrvCTRL)
|
||||||
AND #C0
|
AND #C0
|
||||||
JR Z,.ID_LP3
|
JR Z,.ID_LP3
|
||||||
JP P,.ID_LP2
|
JP P,.ID_LP2
|
||||||
EXX
|
EXX
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD A,(FDD_INIT_TABLE.FDD_0.F144)
|
LD A,(FDD_INIT_TABLE.FDD_0.F144)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
AND #80
|
AND #80
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
.ID_LP4: DEC HL
|
.ID_LP4: DEC HL
|
||||||
LD A,H
|
LD A,H
|
||||||
OR L
|
OR L
|
||||||
JR NZ,.loop_reg_HL
|
JR NZ,.loop_reg_HL
|
||||||
CALL CHANGE_SPEED
|
CALL CHANGE_SPEED
|
||||||
DEC C
|
DEC C
|
||||||
JR NZ,.loop_reg_C
|
JR NZ,.loop_reg_C
|
||||||
EXX
|
EXX
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
|
|
||||||
;
|
;
|
||||||
SEEK: LD XL,A
|
SEEK: LD XL,A
|
||||||
LD C,A
|
LD C,A
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
|
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
|
||||||
AND 1
|
AND 1
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
SRL C
|
SRL C
|
||||||
JR C,.GT001
|
JR C,.GT001
|
||||||
OR #3C
|
;
|
||||||
.GT001: OR #2C
|
OR #3C
|
||||||
OUT (FDC_93.DrvCTRL),A
|
.GT001: OR #2C
|
||||||
IN A,(FDC_93.Track)
|
OUT (FDC_93.DrvCTRL),A
|
||||||
CP C
|
IN A,(FDC_93.Track)
|
||||||
PUSH BC
|
CP C
|
||||||
CALL NZ,P50ms
|
PUSH BC
|
||||||
POP BC
|
CALL NZ,P50ms
|
||||||
LD A,C
|
;
|
||||||
OUT (FDC_93.Data),A
|
POP BC
|
||||||
IN A,(FDC_93.Track)
|
LD A,C
|
||||||
CP C
|
OUT (FDC_93.Data),A
|
||||||
EX AF,AF' ;R.TRACK==PHISICAL TRACK
|
IN A,(FDC_93.Track)
|
||||||
LD A,#18
|
CP C
|
||||||
CALL EXECOM
|
EX AF,AF' ;R.TRACK==PHISICAL TRACK
|
||||||
RET C
|
LD A,#18
|
||||||
EX AF,AF'
|
CALL EXECOM
|
||||||
LD A,C
|
RET C
|
||||||
OUT (FDC_93.Track),A
|
EX AF,AF'
|
||||||
RET Z
|
LD A,C
|
||||||
.STOL: PUSH BC
|
OUT (FDC_93.Track),A
|
||||||
CALL P50ms
|
RET Z
|
||||||
POP BC
|
.STOL: PUSH BC
|
||||||
RET
|
CALL P50ms
|
||||||
|
POP BC
|
||||||
|
RET
|
||||||
;
|
;
|
||||||
;P750ms LD B,3
|
;P750ms LD B,3
|
||||||
;PMS2 LD A,255
|
;PMS2 LD A,255
|
||||||
; CALL P1ms
|
; CALL P1ms
|
||||||
; DJNZ PMS2
|
; DJNZ PMS2
|
||||||
; RET
|
; RET
|
||||||
P50ms: LD A,12
|
P50ms: LD A,12
|
||||||
.P1ms: LD C,255
|
.P1ms: LD C,255
|
||||||
.PMS: DEC C
|
.PMS: DEC C
|
||||||
JR NZ,.PMS
|
JR NZ,.PMS
|
||||||
DEC A
|
DEC A
|
||||||
JR NZ,.P1ms
|
JR NZ,.P1ms
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
|
|
||||||
;
|
;
|
||||||
RESWG: LD A,8
|
RESWG: LD A,8
|
||||||
EXECOM: OUT (FDC_93.Command),A
|
;
|
||||||
LD HL,#0000 ; áçñâ稪
|
EXECOM: OUT (FDC_93.Command),A
|
||||||
.WREST: DEC HL
|
LD HL,#0000 ; áçñâ稪
|
||||||
LD A,H
|
.WREST: DEC HL
|
||||||
OR L
|
LD A,H
|
||||||
SCF
|
OR L
|
||||||
RET Z
|
SCF
|
||||||
;
|
RET Z
|
||||||
IN A,(FDC_93.DrvCTRL)
|
;
|
||||||
AND #80
|
IN A,(FDC_93.DrvCTRL)
|
||||||
JR Z,.WREST
|
AND #80
|
||||||
;AND A
|
JR Z,.WREST
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
|
|
||||||
;
|
;
|
||||||
@ -804,35 +877,34 @@ EXECOM: OUT (FDC_93.Command),A
|
|||||||
; HL:IX - SECTOR
|
; HL:IX - SECTOR
|
||||||
; H - TRACK, L - SECTOR
|
; H - TRACK, L - SECTOR
|
||||||
;HL:IX/SECTOR_PER_TRACK
|
;HL:IX/SECTOR_PER_TRACK
|
||||||
NTRACK:
|
NTRACK: PUSH HL
|
||||||
PUSH HL
|
EX (SP),IX
|
||||||
EX (SP),IX
|
POP HL
|
||||||
POP HL
|
IN A,(SLOT3)
|
||||||
IN A,(SLOT3)
|
EX AF,AF'
|
||||||
EX AF,AF'
|
LD A,SYS_PAGE
|
||||||
LD A,SYS_PAGE
|
OUT (SLOT3),A
|
||||||
OUT (SLOT3),A
|
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
|
||||||
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
|
LD C,A
|
||||||
LD C,A
|
LD B,0
|
||||||
LD B,0
|
EX AF,AF'
|
||||||
EX AF,AF'
|
OUT (SLOT3),A
|
||||||
OUT (SLOT3),A
|
XOR A
|
||||||
XOR A
|
.NTRK: INC A
|
||||||
.NTRK: INC A
|
SBC HL,BC
|
||||||
SBC HL,BC
|
JR NC,.NTRK
|
||||||
JR NC,.NTRK
|
EX AF,AF'
|
||||||
EX AF,AF'
|
LD A,XL
|
||||||
LD A,XL
|
OR XH
|
||||||
OR XH
|
JR Z,.NTRK3
|
||||||
JR Z,.NTRK3
|
EX AF,AF'
|
||||||
EX AF,AF'
|
DEC IX
|
||||||
DEC IX
|
JR .NTRK
|
||||||
JR .NTRK
|
.NTRK3: EX AF,AF'
|
||||||
.NTRK3: EX AF,AF'
|
ADD HL,BC
|
||||||
ADD HL,BC
|
DEC A
|
||||||
DEC A
|
LD H,A
|
||||||
LD H,A
|
RET
|
||||||
RET
|
|
||||||
;
|
;
|
||||||
SAVE_INTERRUPTS:
|
SAVE_INTERRUPTS:
|
||||||
.switch_off: PUSH AF
|
.switch_off: PUSH AF
|
||||||
|
|||||||
@ -151,9 +151,12 @@ ATAPI_5x_SET_PAR:
|
|||||||
; HL:IX - Sector + Sector counter
|
; HL:IX - Sector + Sector counter
|
||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;READ SECTOR(S)
|
;READ SECTOR(S)
|
||||||
ATAPI_5x_READ: EX AF,AF'
|
ATAPI_5x_READ: PUSH IY
|
||||||
|
LD C,0 ; ¯à¨§ ª short
|
||||||
|
EX AF,AF'
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
|
JP ATAPI_5x_LONG_READ.main
|
||||||
;[]================================================================[#52]
|
;[]================================================================[#52]
|
||||||
;Function: Long Read Sectors
|
;Function: Long Read Sectors
|
||||||
; A - Disk
|
; A - Disk
|
||||||
@ -166,10 +169,11 @@ ATAPI_5x_READ: EX AF,AF'
|
|||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;LONG READ SECTOR(S)
|
;LONG READ SECTOR(S)
|
||||||
ATAPI_5x_LONG_READ:
|
ATAPI_5x_LONG_READ:
|
||||||
AND A
|
;AND A
|
||||||
;
|
;
|
||||||
PUSH IY
|
PUSH IY
|
||||||
SAFE_PORTY_2
|
LD C,1 ; ¯à¨§ ª long
|
||||||
|
.main: SAFE_PORTY_2
|
||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH IX
|
PUSH IX
|
||||||
PUSH HL
|
PUSH HL
|
||||||
@ -196,8 +200,10 @@ ATAPI_5x_LONG_READ:
|
|||||||
; OUTPUT:
|
; OUTPUT:
|
||||||
;
|
;
|
||||||
RW_ATAPI_SECTORs:
|
RW_ATAPI_SECTORs:
|
||||||
|
PUSH BC
|
||||||
LD C,IDE.Device.ATAPI
|
LD C,IDE.Device.ATAPI
|
||||||
CALL SELECT_DRIVE
|
CALL SELECT_DRIVE
|
||||||
|
POP BC
|
||||||
RET C
|
RET C
|
||||||
;
|
;
|
||||||
EXX
|
EXX
|
||||||
@ -232,16 +238,11 @@ RW_ATAPI_SECTORs:
|
|||||||
LD A,B
|
LD A,B
|
||||||
LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01
|
LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01
|
||||||
;
|
;
|
||||||
; EX AF,AF'
|
LD YL,C ; ¯à¨§ ª short/long ¨§ C ¢ YL
|
||||||
; OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
; POP AF
|
|
||||||
; OUT (SLOT3),A
|
|
||||||
LD HL,RAM_ATAPI_RW_CMD
|
LD HL,RAM_ATAPI_RW_CMD
|
||||||
CALL EXEC_PACKET_COMMAND.start
|
CALL EXEC_PACKET_COMMAND.start
|
||||||
;
|
;
|
||||||
.exit: POP BC
|
.exit: POP BC
|
||||||
;LD C,SLOT3
|
|
||||||
OUT (C),B
|
OUT (C),B
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
@ -262,9 +263,12 @@ RW_ATAPI_SECTORs:
|
|||||||
; HL:IX - Sector + Sector counter
|
; HL:IX - Sector + Sector counter
|
||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;WRITE SECTOR(S)
|
;WRITE SECTOR(S)
|
||||||
ATAPI_5x_WRITE: EX AF,AF'
|
ATAPI_5x_WRITE: PUSH IY
|
||||||
|
LD C,0 ; ¯à¨§ ª short
|
||||||
|
EX AF,AF'
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
|
JP ATAPI_5x_LONG_WRITE.main
|
||||||
;[]================================================================[#53]
|
;[]================================================================[#53]
|
||||||
;Function: Long Write Sectors
|
;Function: Long Write Sectors
|
||||||
; A - Disk
|
; A - Disk
|
||||||
@ -277,10 +281,11 @@ ATAPI_5x_WRITE: EX AF,AF'
|
|||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;WRITE SECTOR(S)
|
;WRITE SECTOR(S)
|
||||||
ATAPI_5x_LONG_WRITE:
|
ATAPI_5x_LONG_WRITE:
|
||||||
AND A
|
;AND A
|
||||||
;
|
;
|
||||||
PUSH IY
|
PUSH IY
|
||||||
SAFE_PORTY_2
|
LD C,1 ; ¯à¨§ ª long
|
||||||
|
.main: SAFE_PORTY_2
|
||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH IX
|
PUSH IX
|
||||||
PUSH HL
|
PUSH HL
|
||||||
@ -466,6 +471,7 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
|
|||||||
; #0B - ABORTED COMMAND
|
; #0B - ABORTED COMMAND
|
||||||
; #80 - TIME OUT
|
; #80 - TIME OUT
|
||||||
EXEC_PACKET_COMMAND:
|
EXEC_PACKET_COMMAND:
|
||||||
|
.error_ex: EX DE,HL
|
||||||
.error: CP #FF
|
.error: CP #FF
|
||||||
.error_fail: SCF
|
.error_fail: SCF
|
||||||
LD A,BIOS.Error.Failure
|
LD A,BIOS.Error.Failure
|
||||||
@ -475,14 +481,15 @@ EXEC_PACKET_COMMAND:
|
|||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
.error_TimeOut: CP #FF
|
.error_TimeOut: CP #FF
|
||||||
|
EX DE,HL
|
||||||
JR Z,.error_fail
|
JR Z,.error_fail
|
||||||
LD A,BIOS.Error.ATAPI.TimeOut
|
LD A,BIOS.Error.ATAPI.TimeOut
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
.start_sys_page:
|
; .start_sys_page:
|
||||||
LD A,SYS_PAGE
|
; LD A,SYS_PAGE
|
||||||
EX AF,AF'
|
; EX AF,AF'
|
||||||
;
|
;
|
||||||
.start: XOR A ; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
.start: XOR A ; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
||||||
.start_custom: EXX
|
.start_custom: EXX
|
||||||
@ -501,7 +508,7 @@ EXEC_PACKET_COMMAND:
|
|||||||
EXX
|
EXX
|
||||||
CALL ATAPI_WAITPRT
|
CALL ATAPI_WAITPRT
|
||||||
EXX
|
EXX
|
||||||
JR C,.error
|
JR C,.error_ex
|
||||||
;
|
;
|
||||||
.READY: LD C,SLOT3
|
.READY: LD C,SLOT3
|
||||||
IN B,(C)
|
IN B,(C)
|
||||||
@ -534,7 +541,7 @@ EXEC_PACKET_COMMAND:
|
|||||||
LD C,H ; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
LD C,H ; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
||||||
CALL ATAPI_WAITPRT
|
CALL ATAPI_WAITPRT
|
||||||
EXX
|
EXX
|
||||||
JR C,.error
|
JR C,.error_ex
|
||||||
;
|
;
|
||||||
EXX
|
EXX
|
||||||
LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
||||||
@ -568,16 +575,133 @@ EXEC_PACKET_COMMAND:
|
|||||||
LD XH,A ; áâà ¨æ ¤«ï R/W_LONG
|
LD XH,A ; áâà ¨æ ¤«ï R/W_LONG
|
||||||
LD XL,0
|
LD XL,0
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
;
|
|
||||||
EX DE,HL
|
EX DE,HL
|
||||||
.AP_LOOP: EX DE,HL
|
|
||||||
; IN A,(SLOT3)
|
|
||||||
; EX AF,AF' ;>-----------> \
|
|
||||||
;
|
;
|
||||||
|
.AP_LOOP: CALL ATAPI_CHECK_DRV
|
||||||
|
JP C,.error
|
||||||
|
RET Z
|
||||||
|
;====== IF DATA REQUEST ===============================================;
|
||||||
|
.data_request: IN A,(SLOT3)
|
||||||
|
EX AF,AF' ;>-----------> \
|
||||||
|
;
|
||||||
|
LD A,XH
|
||||||
|
OUT (SLOT3),A
|
||||||
|
;
|
||||||
|
;LD BC,IDE.Read.ByteCountLow
|
||||||
|
;IN E,(C)
|
||||||
|
;INC C ;LD BC,IDE.Read.ByteCountHigh
|
||||||
|
;IN D,(C) ;TRANSFER BLOCK SIZE
|
||||||
|
;;
|
||||||
|
;LD A,D
|
||||||
|
;OR E
|
||||||
|
;RET Z ;BLOCK = 0
|
||||||
|
;; 㬥ìè ¥¬ áçñâ稪 § £à㦠¥¬ëå ¡ ©â®¢ ¢ 2 à § . —¨â ¥¬ ¯® 2 ¡ ©â
|
||||||
|
;SRL D
|
||||||
|
;RR E
|
||||||
|
;;
|
||||||
|
;LD BC,IDE.Read.InterruptReason
|
||||||
|
;IN A,(C)
|
||||||
|
;AND IDE.InterruptReasonByte.IO
|
||||||
|
;LD BC,IDE.Read.Data
|
||||||
|
CALL ATAPI_PREPARE_RW
|
||||||
|
RET NC
|
||||||
|
JR Z,.WRITE_DATA
|
||||||
|
;READ
|
||||||
|
.read_loop: INI
|
||||||
|
INI
|
||||||
|
DEC DE
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR NZ,.read_loop
|
||||||
|
;
|
||||||
|
.return_rw: EX AF,AF' ;<-----------< /
|
||||||
|
INC XL ;INC LOADED SECTORS
|
||||||
|
OUT (SLOT3),A
|
||||||
|
;
|
||||||
|
LD A,H
|
||||||
|
OR L
|
||||||
|
JR NZ,.AP_LOOP
|
||||||
|
; short/long
|
||||||
|
; A = 0
|
||||||
|
SUB YL
|
||||||
|
JR NC,.END_BUFFER
|
||||||
|
; next page in mem block
|
||||||
|
CALL CHANGE_MEM_BLK
|
||||||
|
JR .AP_LOOP
|
||||||
|
;WRITE
|
||||||
|
.WRITE_DATA: INC B ; LD BC,IDE.Write.Data
|
||||||
|
.write_loop: OUTI
|
||||||
|
OUTI
|
||||||
|
DEC DE
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR NZ,.write_loop
|
||||||
|
JR .return_rw
|
||||||
|
; ;
|
||||||
|
.END_BUFFER: CALL ATAPI_CHECK_DRV
|
||||||
|
JP C,.error
|
||||||
|
JR NZ,ATAPI_IdlePasses.Enter
|
||||||
|
RET
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
ATAPI_IdlePasses:
|
||||||
|
CALL ATAPI_CHECK_DRV
|
||||||
|
JP C,EXEC_PACKET_COMMAND.error
|
||||||
|
JP Z,EXEC_PACKET_COMMAND.error_fail
|
||||||
|
;
|
||||||
|
.Enter: ;LD BC,IDE.Read.ByteCountLow
|
||||||
|
;IN E,(C)
|
||||||
|
;INC C ;LD BC,IDE.Read.ByteCountHigh
|
||||||
|
;IN D,(C) ;TRANSFER BLOCK SIZE
|
||||||
|
;;
|
||||||
|
;LD A,D
|
||||||
|
;OR E
|
||||||
|
;RET Z ;BLOCK = 0
|
||||||
|
;;
|
||||||
|
;; 㬥ìè ¥¬ áçñâ稪 § £à㦠¥¬ëå ¡ ©â®¢ ¢ 2 à § . —¨â ¥¬ ¯® 2 ¡ ©â
|
||||||
|
;SRL D
|
||||||
|
;RR E
|
||||||
|
;;
|
||||||
|
;LD BC,IDE.Read.InterruptReason
|
||||||
|
;IN A,(C)
|
||||||
|
;AND IDE.InterruptReasonByte.IO
|
||||||
|
;LD BC,IDE.Read.Data
|
||||||
|
CALL ATAPI_PREPARE_RW
|
||||||
|
RET NC
|
||||||
|
JR Z,.write_data
|
||||||
|
;
|
||||||
|
.read_loop: IN F,(C) ; ç¨â ¥¬ ¯® 1 à §ã á çñ⮣® ¤à¥á , ç¨â ¥âáï WORD
|
||||||
|
DEC DE
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR NZ,.read_loop
|
||||||
|
JR ATAPI_IdlePasses
|
||||||
|
;
|
||||||
|
.write_data: ; A = 0
|
||||||
|
OUT (C),A ; ª¨¤ ¥¬ 0 ¢ ॣ¨áâà § éñ«ªã IDE
|
||||||
|
INC B
|
||||||
|
.write_loop: XOR A
|
||||||
|
OUT (C),A ; ¯¨è¥¬ ¯® 1 à §ã ¢ ¥çñâë© ¤à¥á, ¯¨è¥âáï WORD
|
||||||
|
DEC DE
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR NZ,.write_loop
|
||||||
|
JR ATAPI_IdlePasses
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
; ¢ë室:
|
||||||
|
; CF,ZF ATAPI_WAITPRT Error ¨«¨ Check Condition á® ¢¥è¥© ®¡à ¡®âª®©
|
||||||
|
; ZF No errors, no data request
|
||||||
|
; NZ,NC DATA REQUEST
|
||||||
|
; CF Error
|
||||||
|
ATAPI_CHECK_DRV:
|
||||||
|
;EX DE,HL
|
||||||
EXX
|
EXX
|
||||||
CALL ATAPI_WAITPRT
|
CALL ATAPI_WAITPRT
|
||||||
EXX
|
EXX
|
||||||
JP C,.error
|
; ZF=1
|
||||||
|
;JP C,.error
|
||||||
|
RET C
|
||||||
;
|
;
|
||||||
; [ ] media change. ¤® «¨ âãâ? ;!FIXIT «ãçè¥ ¡«®ª¨à®¢ âì ®á¨â¥«ì
|
; [ ] media change. ¤® «¨ âãâ? ;!FIXIT «ãçè¥ ¡«®ª¨à®¢ âì ®á¨â¥«ì
|
||||||
LD A,high IDE.Read.Status
|
LD A,high IDE.Read.Status
|
||||||
@ -586,21 +710,17 @@ EXEC_PACKET_COMMAND:
|
|||||||
AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error
|
AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error
|
||||||
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
|
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
|
||||||
RRA ; Checking IDE.CtrlByte.CheckCondition
|
RRA ; Checking IDE.CtrlByte.CheckCondition
|
||||||
JR NC,.data_request
|
;JR NC,.data_request
|
||||||
|
RET NC
|
||||||
; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
||||||
EXX
|
EXX
|
||||||
DEC C ; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
DEC C ; ¯à¨§ ª ⮣®, çâ® ®è¨¡ª á¬¥ë ®á¨â¥«ï ¤®«¦ ®¡à ¡ âë¢ âìáï ¢ EXEC_PACKET_COMMAND
|
||||||
EXX
|
EXX
|
||||||
RET Z ; ¢ë室, ¥á«¨ ®è¨¡ª ®¡à ¡ âë¢ ¥âáï ¥ ¢ EXEC_PACKET_COMMAND
|
RET Z ; ¢ë室, ¥á«¨ ®è¨¡ª ®¡à ¡ âë¢ ¥âáï ¥ ¢ EXEC_PACKET_COMMAND
|
||||||
|
JP ATAPI_CHECK_ERROR
|
||||||
;
|
;
|
||||||
JP ATAPI_CHECK_ERROR
|
|
||||||
;====== IF DATA REQUEST ===============================================;
|
ATAPI_PREPARE_RW:
|
||||||
.data_request: IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
;
|
|
||||||
LD A,XH
|
|
||||||
OUT (SLOT3),A
|
|
||||||
EX DE,HL
|
|
||||||
LD BC,IDE.Read.ByteCountLow
|
LD BC,IDE.Read.ByteCountLow
|
||||||
IN E,(C)
|
IN E,(C)
|
||||||
INC C ;LD BC,IDE.Read.ByteCountHigh
|
INC C ;LD BC,IDE.Read.ByteCountHigh
|
||||||
@ -618,54 +738,17 @@ EXEC_PACKET_COMMAND:
|
|||||||
IN A,(C)
|
IN A,(C)
|
||||||
AND IDE.InterruptReasonByte.IO
|
AND IDE.InterruptReasonByte.IO
|
||||||
LD BC,IDE.Read.Data
|
LD BC,IDE.Read.Data
|
||||||
JR Z,.WRITE_DATA
|
SCF
|
||||||
;READ
|
RET
|
||||||
; ¯à®¢¥àª â㯮áâì ª®¤¥à
|
|
||||||
; CF=0
|
|
||||||
; ADC HL,DE
|
|
||||||
; JR Z,.good_buffer
|
|
||||||
; JR C,.error_buffer
|
|
||||||
;
|
|
||||||
; .good_buffer: AND A
|
|
||||||
; SBC HL,DE
|
|
||||||
|
|
||||||
.read_loop: INI
|
|
||||||
INI
|
; .AddrOverflow: EX DE,HL
|
||||||
DEC DE
|
; AND A
|
||||||
LD A,D
|
; SBC HL,DE
|
||||||
OR E
|
; EX DE,HL
|
||||||
JR NZ,.read_loop
|
; RET
|
||||||
;
|
|
||||||
.return_rw: INC XL ;INC LOADED SECTORS
|
;
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
;
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.AP_LOOP
|
|
||||||
; next page in mem block
|
|
||||||
LD HL,#C000
|
|
||||||
IN A,(SLOT3)
|
|
||||||
EX AF,AF' ;>-----------> \
|
|
||||||
LD A,SYS_PAGE
|
|
||||||
OUT (SLOT3),A
|
|
||||||
LD D,high SYS_PAGE.RAM_TABLE
|
|
||||||
LD E,XH
|
|
||||||
LD A,(DE)
|
|
||||||
LD XH,A
|
|
||||||
EX AF,AF' ;<-----------< /
|
|
||||||
OUT (SLOT3),A
|
|
||||||
JR .AP_LOOP
|
|
||||||
;WRITE
|
|
||||||
.WRITE_DATA: INC B ; LD BC,IDE.Write.Data
|
|
||||||
.write_loop: OUTI
|
|
||||||
OUTI
|
|
||||||
DEC DE
|
|
||||||
LD A,D
|
|
||||||
OR E
|
|
||||||
JR NZ,.write_loop
|
|
||||||
JR .return_rw
|
|
||||||
;
|
|
||||||
; !TODO 宫®á⮥ ç⥨¥
|
; !TODO 宫®á⮥ ç⥨¥
|
||||||
; .error_buffer: AND A
|
; .error_buffer: AND A
|
||||||
; SBC HL,DE
|
; SBC HL,DE
|
||||||
@ -702,6 +785,8 @@ ATAPI_GET_ERROR_REG:
|
|||||||
|
|
||||||
;----------------------------------------------------------------------;
|
;----------------------------------------------------------------------;
|
||||||
; D - MASK, E - PATTERN
|
; D - MASK, E - PATTERN
|
||||||
|
; !!! ¥ª®â®àë¥ äãªæ¨¨ ¤¥îâáï, çâ® ¢ë室¥ ¢á¥£¤ ZF
|
||||||
|
; ¥ ¤®«¦ âண âì ॣ. C
|
||||||
ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
|
ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
|
||||||
.Custom: LD B,100
|
.Custom: LD B,100
|
||||||
LD HL,#0000
|
LD HL,#0000
|
||||||
@ -762,7 +847,7 @@ ATAPI_READ_CAPACITY_DATA:
|
|||||||
JR NZ,.pause
|
JR NZ,.pause
|
||||||
;
|
;
|
||||||
JP .loop
|
JP .loop
|
||||||
RET
|
;RET
|
||||||
;----------------------------------------------------------------------;
|
;----------------------------------------------------------------------;
|
||||||
|
|
||||||
|
|
||||||
@ -775,6 +860,9 @@ ATAPI_READ_CAPACITY_DATA:
|
|||||||
|
|
||||||
;----------------------------------------------------------------------;
|
;----------------------------------------------------------------------;
|
||||||
ATAPI_MEDIA_ERROR:
|
ATAPI_MEDIA_ERROR:
|
||||||
|
PUSH IX
|
||||||
|
PUSH HL
|
||||||
|
;
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
PUSH AF
|
PUSH AF
|
||||||
LD A,SYS_PAGE
|
LD A,SYS_PAGE
|
||||||
@ -826,6 +914,8 @@ ATAPI_MEDIA_ERROR:
|
|||||||
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
|
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
|
||||||
;
|
;
|
||||||
.exit: POP AF
|
.exit: POP AF
|
||||||
|
POP HL
|
||||||
|
POP IX
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
LD A,C
|
LD A,C
|
||||||
SCF
|
SCF
|
||||||
|
|||||||
@ -161,10 +161,12 @@ ATA_5x_SET_PAR:
|
|||||||
; HL:IX - Sector + Sector counter
|
; HL:IX - Sector + Sector counter
|
||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;READ SECTOR(S)
|
;READ SECTOR(S)
|
||||||
ATA_5x_READ:
|
ATA_5x_READ: PUSH IY
|
||||||
EX AF,AF'
|
LD C,0 ; ¯à¨§ ª short
|
||||||
IN A,(SLOT3)
|
EX AF,AF'
|
||||||
EX AF,AF'
|
IN A,(SLOT3)
|
||||||
|
EX AF,AF'
|
||||||
|
JP ATA_5x_LONG_READ.main
|
||||||
;[]================================================================[#52]
|
;[]================================================================[#52]
|
||||||
;Function: Long Read Sectors
|
;Function: Long Read Sectors
|
||||||
; A - Disk
|
; A - Disk
|
||||||
@ -179,7 +181,8 @@ ATA_5x_READ:
|
|||||||
;LONG READ SECTOR(S)
|
;LONG READ SECTOR(S)
|
||||||
ATA_5x_LONG_READ:
|
ATA_5x_LONG_READ:
|
||||||
PUSH IY
|
PUSH IY
|
||||||
SAFE_PORTY_2
|
LD C,1 ; ¯à¨§ ª long
|
||||||
|
.main: SAFE_PORTY_2
|
||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH IX
|
PUSH IX
|
||||||
PUSH HL
|
PUSH HL
|
||||||
@ -222,8 +225,12 @@ ATA_5x_LONG_READ:
|
|||||||
PUSH BC
|
PUSH BC
|
||||||
LD B,0
|
LD B,0
|
||||||
ADD IX,BC
|
ADD IX,BC
|
||||||
LD C,B
|
;
|
||||||
ADC HL,BC
|
;LD C,B
|
||||||
|
;ADC HL,BC
|
||||||
|
JR NC,.no_inc_hl
|
||||||
|
INC HL
|
||||||
|
.no_inc_hl: ;
|
||||||
POP BC
|
POP BC
|
||||||
POP AF
|
POP AF
|
||||||
SUB C
|
SUB C
|
||||||
@ -245,10 +252,12 @@ ATA_5x_LONG_READ:
|
|||||||
; HL:IX - Sector + Sector counter
|
; HL:IX - Sector + Sector counter
|
||||||
; DE - Address + (Sector counter * Size sector)
|
; DE - Address + (Sector counter * Size sector)
|
||||||
;WRITE SECTOR(S)
|
;WRITE SECTOR(S)
|
||||||
ATA_5x_WRITE:
|
ATA_5x_WRITE: PUSH IY
|
||||||
EX AF,AF'
|
LD C,0 ; ¯à¨§ ª short
|
||||||
IN A,(SLOT3)
|
EX AF,AF'
|
||||||
EX AF,AF'
|
IN A,(SLOT3)
|
||||||
|
EX AF,AF'
|
||||||
|
JP ATA_5x_LONG_WRITE.main
|
||||||
;[]================================================================[#53]
|
;[]================================================================[#53]
|
||||||
;Function: Long Write Sectors
|
;Function: Long Write Sectors
|
||||||
; A - Disk
|
; A - Disk
|
||||||
@ -262,7 +271,8 @@ ATA_5x_WRITE:
|
|||||||
;WRITE SECTOR(S)
|
;WRITE SECTOR(S)
|
||||||
ATA_5x_LONG_WRITE:
|
ATA_5x_LONG_WRITE:
|
||||||
PUSH IY
|
PUSH IY
|
||||||
SAFE_PORTY_2
|
LD C,1 ; ¯à¨§ ª long
|
||||||
|
.main: SAFE_PORTY_2
|
||||||
PUSH BC
|
PUSH BC
|
||||||
PUSH IX
|
PUSH IX
|
||||||
PUSH HL
|
PUSH HL
|
||||||
@ -273,70 +283,19 @@ ATA_5x_LONG_WRITE:
|
|||||||
CALL RW_ATA_SECTORs
|
CALL RW_ATA_SECTORs
|
||||||
;
|
;
|
||||||
JP ATA_5x_LONG_READ.shared
|
JP ATA_5x_LONG_READ.shared
|
||||||
/*
|
|
||||||
EX DE,HL
|
|
||||||
JP C,.error
|
|
||||||
LD A,XH
|
|
||||||
EX AF,AF'
|
|
||||||
;
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
POP BC
|
|
||||||
XOR A
|
|
||||||
CP B
|
|
||||||
LD C,B
|
|
||||||
LD B,A
|
|
||||||
JR NZ,WNOT256
|
|
||||||
;
|
|
||||||
INC B
|
|
||||||
ADD IX,BC
|
|
||||||
LD B,C
|
|
||||||
ADC HL,BC
|
|
||||||
;EX AF,AF'
|
|
||||||
JR RST8WRR
|
|
||||||
;
|
|
||||||
WNOT256 ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
ADC HL,BC
|
|
||||||
JR RST8WRR
|
|
||||||
|
|
||||||
.error: LD B,A
|
|
||||||
LD C,XL
|
|
||||||
LD A,XH
|
|
||||||
EX AF,AF'
|
|
||||||
POP HL
|
|
||||||
POP IX
|
|
||||||
PUSH BC
|
|
||||||
LD B,0
|
|
||||||
ADD IX,BC
|
|
||||||
LD C,B
|
|
||||||
ADC HL,BC
|
|
||||||
POP BC
|
|
||||||
POP AF
|
|
||||||
SUB C
|
|
||||||
LD C,A
|
|
||||||
LD A,B
|
|
||||||
LD B,C
|
|
||||||
;R03
|
|
||||||
SCF ;R03
|
|
||||||
;EX AF,AF' ;R03 ;!FIXIT ¬ã¤à¨« ® çñâ ¢ í⮬ R03
|
|
||||||
;
|
|
||||||
RST8WRR: RESTORE_PORTY
|
|
||||||
POP IY
|
|
||||||
;EX AF,AF'
|
|
||||||
RET
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
||||||
; A - Disk
|
; A - Disk
|
||||||
; HL:IX - Sector
|
; HL:IX - Sector
|
||||||
; DE - Address
|
; DE - Address
|
||||||
; B - Sector counter
|
; B - Sector counter
|
||||||
|
; C - short/long
|
||||||
; A'- Memory Page Number
|
; A'- Memory Page Number
|
||||||
; CF'=1 - write, CF'=0 - read
|
; CF'=1 - write, CF'=0 - read
|
||||||
RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
RW_ATA_SECTORs: PUSH BC ; ¯à¨§ ª short/long ¢ C
|
||||||
|
LD C,IDE.Device.HDD
|
||||||
CALL SELECT_DRIVE
|
CALL SELECT_DRIVE
|
||||||
|
POP BC ; ¯à¨§ ª short/long ¢ C
|
||||||
RET C
|
RET C
|
||||||
;
|
;
|
||||||
EXX
|
EXX
|
||||||
@ -346,12 +305,16 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
|||||||
;
|
;
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
PUSH AF ; memory page number
|
PUSH AF ; memory page number
|
||||||
|
PUSH BC ; ¯à¨§ ª short/long ¢ C
|
||||||
PUSH DE ; Address
|
PUSH DE ; Address
|
||||||
CALL PRESET
|
CALL PRESET
|
||||||
|
; IY ¨§ SELECT_DRIVE ¡®«ìè¥ ¥ 㦥
|
||||||
|
;
|
||||||
POP HL ; Address
|
POP HL ; Address
|
||||||
|
POP IY ; ¯à¨§ ª short/long ¢ YL
|
||||||
POP AF ; memory page number
|
POP AF ; memory page number
|
||||||
LD XL,0
|
LD XL,0
|
||||||
LD XH,A
|
LD XH,A ; memory page number
|
||||||
LD BC,IDE.Write.Command
|
LD BC,IDE.Write.Command
|
||||||
LD A,IDE.CMD.ATA.WriteSectorsWithRetry
|
LD A,IDE.CMD.ATA.WriteSectorsWithRetry
|
||||||
JR C,.set_command ; CF = r/w
|
JR C,.set_command ; CF = r/w
|
||||||
@ -386,40 +349,43 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
|||||||
; ; ; ; ;
|
; ; ; ; ;
|
||||||
; CF=0
|
; CF=0
|
||||||
.return_rw: EX AF,AF' ;<-----------< /
|
.return_rw: EX AF,AF' ;<-----------< /
|
||||||
|
INC XL ;INC LOADED SECTORS
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
;
|
;
|
||||||
LD A,H
|
LD A,H
|
||||||
OR L
|
OR L
|
||||||
JR NZ,.W44
|
JR NZ,.end_pass
|
||||||
|
; short/long
|
||||||
|
; A = 0
|
||||||
|
SUB YL
|
||||||
|
JR NC,.END_BUFFER
|
||||||
; next page in mem block
|
; next page in mem block
|
||||||
; ᤥ« âì ¥á«¨ ¥ RW_LONG, ⮠宫®áâë¥ ç⥨¥/§ ¯¨áì ¨ ¢ë室 á ®è¨¡ª®©
|
CALL CHANGE_MEM_BLK
|
||||||
LD HL,#C000
|
; LD HL,#C000
|
||||||
IN A,(SLOT3)
|
; IN A,(SLOT3)
|
||||||
EX AF,AF' ;>-----------> \
|
; EX AF,AF' ;>-----------> \
|
||||||
LD A,SYS_PAGE
|
; LD A,SYS_PAGE
|
||||||
OUT (SLOT3),A
|
; OUT (SLOT3),A
|
||||||
LD D,high SYS_PAGE.RAM_TABLE
|
; LD D,high SYS_PAGE.RAM_TABLE
|
||||||
LD E,XH
|
; LD E,XH
|
||||||
LD A,(DE)
|
; LD A,(DE)
|
||||||
LD XH,A
|
; LD XH,A
|
||||||
EX AF,AF' ;<-----------< /
|
; EX AF,AF' ;<-----------< /
|
||||||
OUT (SLOT3),A
|
; OUT (SLOT3),A
|
||||||
;
|
;
|
||||||
.W44: INC XL ;INC LOADED SECTORS
|
.end_pass: ;INC XL ;INC LOADED SECTORS
|
||||||
EXX
|
EXX
|
||||||
CALL WAITPRT
|
CALL WAITPRT
|
||||||
EXX
|
EXX
|
||||||
RET C
|
RET C
|
||||||
|
;
|
||||||
|
;INC XL ;INC LOADED SECTORS
|
||||||
LD BC,IDE.Read.Status
|
LD BC,IDE.Read.Status
|
||||||
IN A,(C)
|
IN A,(C)
|
||||||
BIT IDE.CtrlBit.DataRequest,A
|
BIT IDE.CtrlBit.DataRequest,A
|
||||||
|
RET Z
|
||||||
;
|
;
|
||||||
RET Z
|
JP .big_loop
|
||||||
JP .big_loop
|
|
||||||
;JP NZ,.big_loop
|
|
||||||
;XOR A
|
|
||||||
;RET
|
|
||||||
;
|
|
||||||
;
|
;
|
||||||
.write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size
|
.write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size
|
||||||
INC B ; LD BC,IDE.Write.Data
|
INC B ; LD BC,IDE.Write.Data
|
||||||
@ -431,9 +397,49 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
|||||||
JR NZ,.loop
|
JR NZ,.loop
|
||||||
SCF
|
SCF
|
||||||
JP .return_rw
|
JP .return_rw
|
||||||
; ; ; ; ;
|
; ;
|
||||||
|
.END_BUFFER: CALL ATA_IdlePasses.CHECK_DRV
|
||||||
;ENDIF
|
JR NZ,ATA_IdlePasses.Enter
|
||||||
|
RET
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
ATA_IdlePasses: CALL .CHECK_DRV
|
||||||
|
JR NZ,.Enter
|
||||||
|
;
|
||||||
|
RET C
|
||||||
|
LD A,BIOS.Error.Failure
|
||||||
|
SCF
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.Enter: XOR A ; áçñâ稪 ¤«ï READ_ZEROS, ¤ ë¥ ¤«ï .WrZeros
|
||||||
|
EX AF,AF'
|
||||||
|
LD BC,IDE.Read.Data
|
||||||
|
JR C,.WrZeros
|
||||||
|
; READ > /dev/null
|
||||||
|
EX AF,AF'
|
||||||
|
.RdLoop: IN F,(C) ; ç¨â ¥¬ ¯® 1 à §ã á çñ⮣® ¤à¥á , ç¨â ¥âáï WORD
|
||||||
|
DEC A
|
||||||
|
JR NZ,.RdLoop
|
||||||
|
JR ATA_IdlePasses
|
||||||
|
; WRITE ZEROS
|
||||||
|
.WrZeros: EX AF,AF'
|
||||||
|
;
|
||||||
|
.WrLoop: OUT (C),A
|
||||||
|
DJNZ .WrLoop
|
||||||
|
;
|
||||||
|
.WrLoop2: OUT (C),A
|
||||||
|
DJNZ .WrLoop2
|
||||||
|
JR ATA_IdlePasses
|
||||||
|
;
|
||||||
|
.CHECK_DRV: EXX
|
||||||
|
CALL WAITPRT
|
||||||
|
EXX
|
||||||
|
RET C
|
||||||
|
;
|
||||||
|
LD BC,IDE.Read.Status
|
||||||
|
IN A,(C)
|
||||||
|
BIT IDE.CtrlBit.DataRequest,A
|
||||||
|
RET
|
||||||
|
;!TODO ¤®¤¥« âì íâã ¦¥ åãà¬ã ¤«ï ¤à㣨å ãáâனáâ¢
|
||||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
||||||
/*
|
/*
|
||||||
IFN OPTIMIZE_RW_PROCEDURE
|
IFN OPTIMIZE_RW_PROCEDURE
|
||||||
@ -523,7 +529,7 @@ WRITE_ATA_SECTORs:
|
|||||||
; A - Disk
|
; A - Disk
|
||||||
; HL:IX - Sector
|
; HL:IX - Sector
|
||||||
; B - Sector counter
|
; B - Sector counter
|
||||||
;Return: None
|
;Return: CF - error
|
||||||
;VERIFY SECTOR(S)
|
;VERIFY SECTOR(S)
|
||||||
ATA_5x_VERIFY: PUSH IY
|
ATA_5x_VERIFY: PUSH IY
|
||||||
SAFE_PORTY_2
|
SAFE_PORTY_2
|
||||||
@ -543,105 +549,119 @@ ATA_5x_VERIFY: PUSH IY
|
|||||||
CALL WAITPRT
|
CALL WAITPRT
|
||||||
EXX
|
EXX
|
||||||
RET C
|
RET C
|
||||||
PUSH DE
|
;PUSH DE
|
||||||
|
; IN A,(SLOT3)
|
||||||
|
; PUSH AF
|
||||||
CALL PRESET
|
CALL PRESET
|
||||||
POP HL
|
; POP AF
|
||||||
|
; OUT (SLOT3),A
|
||||||
|
;POP HL
|
||||||
LD BC,IDE.Write.Command
|
LD BC,IDE.Write.Command
|
||||||
LD A,IDE.CMD.ATA.ReadVerifySectorsWithRetry
|
LD A,IDE.CMD.ATA.ReadVerifySectorsWithRetry
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
LD BC,IDE.Read.Status
|
LD BC,IDE.Read.Status
|
||||||
IN A,(C)
|
IN A,(C)
|
||||||
;BIT IDE.CtrlBit.Error,A
|
|
||||||
RRA ;BIT IDE.CtrlBit.Error,A : SCF : RET NZ
|
RRA ;BIT IDE.CtrlBit.Error,A : SCF : RET NZ
|
||||||
RET C
|
RET C
|
||||||
;
|
;
|
||||||
CALL WAITPRT
|
JP WAITPRT
|
||||||
RET C
|
;RET C
|
||||||
XOR A
|
;XOR A
|
||||||
RET
|
;RET
|
||||||
;[]================================================================[#54]
|
;[]================================================================[#54]
|
||||||
|
|
||||||
|
|
||||||
; HL:IX - LBA SECTOR
|
; HL:IX - LBA SECTOR
|
||||||
; B - SECTOR COUNTER
|
; B - SECTOR COUNTER
|
||||||
PRESET: LD A,B
|
; ¢ë室: SLOT3 = SYS_PAGE
|
||||||
LD BC,IDE.Write.Counter
|
PRESET: LD A,B
|
||||||
OUT (C),A
|
LD BC,IDE.Write.Counter
|
||||||
;
|
OUT (C),A
|
||||||
IN A,(SLOT3)
|
;
|
||||||
EX AF,AF'
|
IN A,(SLOT3)
|
||||||
LD A,SYS_PAGE
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
LD A,SYS_PAGE
|
||||||
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
OUT (SLOT3),A
|
||||||
LD BC,IDE.Write.DeviceHead
|
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
||||||
OUT (C),A
|
LD BC,IDE.Write.DeviceHead
|
||||||
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à ¡¨â
|
OUT (C),A
|
||||||
AND %0100'0000
|
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à ¡¨â
|
||||||
LD E,XL
|
AND %0100'0000
|
||||||
LD D,XH
|
LD E,XL
|
||||||
CALL Z,LBA_CHS
|
LD D,XH
|
||||||
LD BC,IDE.Write.Sector
|
CALL Z,LBA_CHS
|
||||||
OUT (C),E ;LBA 0..7
|
LD BC,IDE.Write.Sector
|
||||||
;
|
OUT (C),E ;LBA 0..7
|
||||||
INC C ; LD BC,IDE.Write.CylinderLow
|
;
|
||||||
OUT (C),D ;LBA 8..15
|
INC C ; LD BC,IDE.Write.CylinderLow
|
||||||
INC C ; LD BC,IDE.Write.CylinderHigh
|
OUT (C),D ;LBA 8..15
|
||||||
OUT (C),L ;LBA 16..23
|
INC C ; LD BC,IDE.Write.CylinderHigh
|
||||||
LD BC,IDE.Read.Control
|
OUT (C),L ;LBA 16..23
|
||||||
IN A,(C)
|
LD BC,IDE.Read.Control
|
||||||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
IN A,(C)
|
||||||
OR H ;LBA 24..27
|
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
||||||
INC B ; LD BC,IDE.Write.DeviceHead
|
OR H ;LBA 24..27
|
||||||
;
|
INC B ; LD BC,IDE.Write.DeviceHead
|
||||||
OUT (C),A
|
;
|
||||||
EX AF,AF'
|
OUT (C),A
|
||||||
OUT (SLOT3),A
|
EX AF,AF'
|
||||||
AND A
|
OUT (SLOT3),A
|
||||||
RET
|
;AND A
|
||||||
|
RET
|
||||||
|
;PRESET ;
|
||||||
|
|
||||||
|
|
||||||
; HL:DE - SECTOR OFFSET
|
; HL:DE - SECTOR OFFSET
|
||||||
LBA_CHS:
|
LBA_CHS: LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow)
|
||||||
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow)
|
LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh)
|
||||||
LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh)
|
;
|
||||||
; HL:DE / BC => DE:IX HL-OSTATOK
|
DIV32X: ;HL:DE / BC => DE:IX HL-OSTATOK
|
||||||
DIV32X: LD XH,D
|
LD XH,D
|
||||||
LD XL,E
|
LD XL,E
|
||||||
EX DE,HL
|
EX DE,HL
|
||||||
LD HL,0
|
LD HL,0
|
||||||
LD A,#20
|
LD A,#20
|
||||||
DIV011: ADD IX,IX
|
;
|
||||||
EX DE,HL
|
.loop: ADD IX,IX
|
||||||
ADC HL,HL
|
EX DE,HL
|
||||||
EX DE,HL
|
ADC HL,HL
|
||||||
ADC HL,HL
|
EX DE,HL
|
||||||
SBC HL,BC
|
ADC HL,HL
|
||||||
JR NC,DIV012
|
SBC HL,BC
|
||||||
ADD HL,BC
|
JR NC,.DIV012
|
||||||
DEC A
|
;
|
||||||
JR NZ,DIV011
|
ADD HL,BC
|
||||||
JR DIV014
|
DEC A
|
||||||
DIV012: INC IX
|
JR NZ,.loop
|
||||||
DEC A
|
;
|
||||||
JR NZ,DIV011
|
JR .DIV014
|
||||||
DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
|
;
|
||||||
LD D,0
|
.DIV012: INC IX
|
||||||
XOR A
|
DEC A
|
||||||
CHS005: INC A
|
JR NZ,.loop
|
||||||
SBC HL,DE
|
;
|
||||||
JR NC,CHS005
|
.DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
|
||||||
ADD HL,DE
|
LD D,0
|
||||||
DEC A
|
XOR A
|
||||||
LD H,A
|
;
|
||||||
LD E,L
|
.loop2: INC A
|
||||||
INC E
|
SBC HL,DE
|
||||||
LD D,XL
|
JR NC,.loop2
|
||||||
LD A,XH
|
;
|
||||||
LD L,A
|
ADD HL,DE
|
||||||
RET
|
DEC A
|
||||||
|
LD H,A
|
||||||
|
LD E,L
|
||||||
|
INC E
|
||||||
|
LD D,XL
|
||||||
|
LD A,XH
|
||||||
|
LD L,A
|
||||||
|
RET
|
||||||
|
|
||||||
;----------------------------------------------------------------------;
|
;----------------------------------------------------------------------;
|
||||||
; D - MASK
|
; D - MASK
|
||||||
; E - PATTERN
|
; E - PATTERN
|
||||||
|
; !!! ¥ª®â®àë¥ äãªæ¨¨ ¤¥îâáï, çâ® ¢ë室¥ ¢á¥£¤ ZF
|
||||||
WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready
|
WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready
|
||||||
.custom: LD BC,IDE.Read.Status
|
.custom: LD BC,IDE.Read.Status
|
||||||
LD HL,#0000 ; § ¤¥à¦ª ;!HARDCODE
|
LD HL,#0000 ; § ¤¥à¦ª ;!HARDCODE
|
||||||
@ -663,7 +683,8 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE
|
|||||||
;
|
;
|
||||||
.error: LD A,BIOS.Error.NotReady
|
.error: LD A,BIOS.Error.NotReady
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
|
;
|
||||||
.ok: POP HL
|
.ok: POP HL
|
||||||
RET
|
RET
|
||||||
;----------------------------------------------------------------------;
|
;----------------------------------------------------------------------;
|
||||||
|
|||||||
@ -68,6 +68,23 @@ SELECT_DRIVE: AND #0F
|
|||||||
;=======================================================================
|
;=======================================================================
|
||||||
|
|
||||||
|
|
||||||
|
;=======================================================================
|
||||||
|
; next page in mem block
|
||||||
|
CHANGE_MEM_BLK: LD HL,#C000
|
||||||
|
IN A,(SLOT3)
|
||||||
|
EX AF,AF' ;>-----------> \
|
||||||
|
LD A,SYS_PAGE
|
||||||
|
OUT (SLOT3),A
|
||||||
|
LD D,high SYS_PAGE.RAM_TABLE
|
||||||
|
LD E,XH
|
||||||
|
LD A,(DE)
|
||||||
|
LD XH,A
|
||||||
|
EX AF,AF' ;<-----------< /
|
||||||
|
OUT (SLOT3),A
|
||||||
|
RET
|
||||||
|
;=======================================================================
|
||||||
|
|
||||||
|
|
||||||
;=======================================================================
|
;=======================================================================
|
||||||
;Function: Detect Disk
|
;Function: Detect Disk
|
||||||
; A - Disk
|
; A - Disk
|
||||||
|
|||||||
@ -1659,28 +1659,27 @@ LP_PR_LINE_DIR:
|
|||||||
; CF - XY-mode
|
; CF - XY-mode
|
||||||
; DE - ¬¥á⮠ᨬ¢®« ¢ ®ª¥, ¥á«¨ CF=1
|
; DE - ¬¥á⮠ᨬ¢®« ¢ ®ª¥, ¥á«¨ CF=1
|
||||||
; HL - ¤à¥á á ¢ë¢®¤¨¬®© áâப®©
|
; HL - ¤à¥á á ¢ë¢®¤¨¬®© áâப®©
|
||||||
; B - à §¤¥«¨â¥«ì
|
; B - 梥⠪®á®«¨ (¨á¯®«ì§ã¥âáï ¯à¨ áªà®««¥ ¨ ®ç¨á⪥ ®ª )
|
||||||
; IY - ¤¢ ᯥæ.ᨬ¢®« ¤«ï ¢ë室 á CF=1. „®«¦ë ¡ëâì à ¢ë B, ¥á«¨ ¥ ã¦ë
|
; IY - ¤¢ ᯥæ.ᨬ¢®« ¤«ï ¢ë室 á CF=1. „®«¦ë ¡ëâì à ¢ë B, ¥á«¨ ¥ ã¦ë
|
||||||
; A' - 梥⠪®á®«¨ (¨á¯®«ì§ã¥âáï ¯à¨ áªà®««¥ ¨ ®ç¨á⪥ ®ª )
|
|
||||||
; CF' - ¢ë¢®¤¨âì ᨬ¢®« á âਡãâ ¬¨
|
; CF' - ¢ë¢®¤¨âì ᨬ¢®« á âਡãâ ¬¨
|
||||||
;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;
|
||||||
.START: PUSH IX
|
.START: PUSH IX
|
||||||
LD XL,A ; âਡãâë ¢ë¢®¤¨¬®£® ᨬ¢®«
|
LD XL,A ; âਡãâë ¢ë¢®¤¨¬®£® ᨬ¢®«
|
||||||
;
|
;
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
PUSH AF ; 梥⠪®á®«¨, attr-mode
|
PUSH AF ; attr-mode
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
;
|
;
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
LD C,A
|
LD C,A
|
||||||
CALL LP_BEG_P
|
CALL LP_BEG_P
|
||||||
CALL C,LP_SET_CUR ; mode for DE
|
CALL C,LP_SET_CUR ; mode for DE
|
||||||
POP AF ; 梥⠪®á®«¨, attr-mode
|
POP AF ; attr-mode
|
||||||
|
LD A,B
|
||||||
|
; ¤ «¥¥ ॣ B ᢮¡®¤¥, ¬®¦® § ¤¥©á⢮¢ âì
|
||||||
LD (SYS_PAGE.SYS_WORK2),A ; 梥⠪®á®«¨
|
LD (SYS_PAGE.SYS_WORK2),A ; 梥⠪®á®«¨
|
||||||
EXX
|
EXX
|
||||||
LD C,0
|
RL C ; C' - attr-mode. ¢ë¢®¤¨âì âਡãâ
|
||||||
JR NC,.loop
|
|
||||||
INC C ; C' - attr flag. ¢ë¢®¤¨âì âਡãâ
|
|
||||||
.loop: LD A,D
|
.loop: LD A,D
|
||||||
OUT (PORT_Y),A
|
OUT (PORT_Y),A
|
||||||
EXX
|
EXX
|
||||||
@ -1690,7 +1689,7 @@ LP_PR_LINE_DIR:
|
|||||||
LD A,(HL)
|
LD A,(HL)
|
||||||
LD XH,A
|
LD XH,A
|
||||||
INC HL
|
INC HL
|
||||||
CP B
|
AND A
|
||||||
JR Z,.EXIT
|
JR Z,.EXIT
|
||||||
CP YH
|
CP YH
|
||||||
JR Z,.EXIT_SpecSymbol
|
JR Z,.EXIT_SpecSymbol
|
||||||
|
|||||||
@ -17,6 +17,7 @@ BETA_RC EQU 0 ;
|
|||||||
DEFINE LOGO_DELAY_NORM 100 ;
|
DEFINE LOGO_DELAY_NORM 100 ;
|
||||||
DEFINE LOGO_DELAY_MAX 130 ;
|
DEFINE LOGO_DELAY_MAX 130 ;
|
||||||
;----------------------------[ TEST ]---------------------------;
|
;----------------------------[ TEST ]---------------------------;
|
||||||
|
DEFINE ERROR_POST_5 0 ; ¢¨áãâì ®è¨¡ª¥ ¢ POST 5
|
||||||
DEFINE TEST_INT 1 ; ’¥áâ®¢ë© ®¡à ¡®â稪 ¯®«ì§®¢ ⥫ì᪮£® INT
|
DEFINE TEST_INT 1 ; ’¥áâ®¢ë© ®¡à ¡®â稪 ¯®«ì§®¢ ⥫ì᪮£® INT
|
||||||
DEFINE NEW_FEATURE 0 ; !TODO ¯ãªâë ¢ á¥â ¯
|
DEFINE NEW_FEATURE 0 ; !TODO ¯ãªâë ¢ á¥â ¯
|
||||||
;DEFINE HDDwriteProtect 0 ; áâ à ï ä¨èª ¤«ï äãªæ¨© 5x
|
;DEFINE HDDwriteProtect 0 ; áâ à ï ä¨èª ¤«ï äãªæ¨© 5x
|
||||||
|
|||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user