5x Read/Write отличаются от R/W Long тем, что R/W

теперь при HL=0 не переключают страницу. Вместо
этого выдаётся ошибка. В случае записи пишутся 0 в
оставшиеся сектора. Мелкие фиксы.
This commit is contained in:
Tolik 2025-04-05 03:49:40 +10:00
parent 9430a99f2b
commit 4caee04133
8 changed files with 828 additions and 600 deletions

View File

@ -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,.error ;!!!!! ¯®á¬®âà¥âì
ELSE
JR NZ,POST_5_ERROR 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

View File

@ -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,8 +182,7 @@ 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'
;[]===========================================================[] ;[]===========================================================[]
@ -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
PUSH BC
CALL SEEK 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 D,YH
LD E,YL 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,9 +291,16 @@ 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
;ADC HL,BC
;LD B,A
;XOR A
;RET
;
LD B,A LD B,A
RET NC
INC HL
XOR A XOR A
RET RET
; ;
@ -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
@ -323,8 +345,7 @@ 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'
;[]===========================================================[] ;[]===========================================================[]
@ -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,6 +375,7 @@ 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'
@ -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
@ -373,31 +398,40 @@ FDD_5x_LONG_WRITE:
OUT (SLOT3),A OUT (SLOT3),A
.DSK_LP2: LD A,D .DSK_LP2: LD A,D
EXX EXX
PUSH BC
CALL SEEK 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 D,YH
LD E,YL 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,57 +490,61 @@ 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
@ -517,78 +556,105 @@ READ_SECTOR: LD D,5 ;RETRY COUNT
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
LD A,B ; COMMAND read or write
EXX
OUT (FDC_93.Command),A OUT (FDC_93.Command),A
.FDW001: ;
IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ .wait_loop: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND #C0 AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR NZ,.FDW004 JR NZ,.RW_PROC
INC DE INC DE
LD A,E LD A,E
OR D OR D
JR NZ,.FDW001 JR NZ,.wait_loop
DJNZ .FDW001 DJNZ .wait_loop
SCF SCF
JR .FDW005 JR .after_rw ; error
.FDW004: ;
OUTI ;WRITE BYTE .RW_PROC: EXX
.FDW002: BIT 5,B
IN A,(FDC_93.DrvCTRL) EXX
AND #C0 JR NZ,.write_loop
JR Z,.FDW002 ;READ BYTE
JP P,.FDW004 .read_loop: INI
.FDW005: .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
JP P,.read_loop ; JUMP if "¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0"
.rw_return: ;
.after_rw: EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
;------------------------------- ;
POP DE POP DE
;EI POP HL
; ¯à¥à뢠­¨ï
LD A,R
AND %1000'0000
JR Z,.no_EI
EI
.no_EI: ;
LD A,BIOS.Error.NotReady
JR C,.CMD_ERROR
;
IN A,(FDC_93.Command) IN A,(FDC_93.Command)
LD C,A LD C,A
;R01
JR C,.ERR_XWR
AND #7F AND #7F
; NORMAL EXIT
RET Z RET Z
;
BIT 6,C BIT 6,C
LD A,BIOS.Error.WriteProtect LD A,BIOS.Error.WriteProtect
JR NZ,.WSTOP JR NZ,.error_exit
;
BIT 2,C BIT 2,C
JR NZ,.EWDATA JR NZ,.data_lost
;
LD A,BIOS.Error.Seek LD A,BIOS.Error.Seek
DEC D .CMD_ERROR: DEC D
JR Z,.WSTOP JR Z,.error_exit
.ERR_XWR: ;
PUSH DE PUSH DE
PUSH HL
CALL RESWG ; RESET_WG CALL RESWG ; RESET_WG
LD A,XL LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì CALL SEEK ; !!!!! ¯®á¬®âà¥âì
POP HL
POP DE POP DE
JR .WRETRY JR .RETRY
.EWDATA: ;
DEC D ; POTERIA DANNYH .data_lost: DEC D ; ¯®â¥àï ¤ ­­ëå
JR NZ,.WRETRY JR NZ,.RETRY
.ERRWR: LD A,BIOS.Error.Write ;
.WSTOP: EX AF,AF' 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 LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION OUT (FDC_93.Command),A ;STOP OPERATION
EX AF,AF' EX AF,AF'
@ -597,21 +663,26 @@ WR_SEC: LD D,5 ;RETRY COUNT
RET Z RET Z
LD A,BIOS.Error.SectorNotFound LD A,BIOS.Error.SectorNotFound
RET 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'
@ -743,6 +814,7 @@ SEEK: LD XL,A
EX AF,AF' EX AF,AF'
SRL C SRL C
JR C,.GT001 JR C,.GT001
;
OR #3C OR #3C
.GT001: OR #2C .GT001: OR #2C
OUT (FDC_93.DrvCTRL),A OUT (FDC_93.DrvCTRL),A
@ -750,6 +822,7 @@ SEEK: LD XL,A
CP C CP C
PUSH BC PUSH BC
CALL NZ,P50ms CALL NZ,P50ms
;
POP BC POP BC
LD A,C LD A,C
OUT (FDC_93.Data),A OUT (FDC_93.Data),A
@ -784,6 +857,7 @@ P50ms: LD A,12
; ;
RESWG: LD A,8 RESWG: LD A,8
;
EXECOM: OUT (FDC_93.Command),A EXECOM: OUT (FDC_93.Command),A
LD HL,#0000 ; áçñâ稪 LD HL,#0000 ; áçñâ稪
.WREST: DEC HL .WREST: DEC HL
@ -795,7 +869,6 @@ EXECOM: OUT (FDC_93.Command),A
IN A,(FDC_93.DrvCTRL) IN A,(FDC_93.DrvCTRL)
AND #80 AND #80
JR Z,.WREST JR Z,.WREST
;AND A
RET RET
; ;
@ -804,8 +877,7 @@ 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)

View File

@ -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 ===============================================;
.data_request: IN A,(SLOT3)
EX AF,AF' ;>-----------> \
; ;
LD A,XH
OUT (SLOT3),A ATAPI_PREPARE_RW:
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

View File

@ -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
LD C,0 ; ¯à¨§­ ª short
EX AF,AF' EX AF,AF'
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' 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
LD C,0 ; ¯à¨§­ ª short
EX AF,AF' EX AF,AF'
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' 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 NZ,.big_loop
;XOR A
;RET
; ;
JP .big_loop
; ;
.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,27 +549,31 @@ 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
; ¢ë室: SLOT3 = SYS_PAGE
PRESET: LD A,B PRESET: LD A,B
LD BC,IDE.Write.Counter LD BC,IDE.Write.Counter
OUT (C),A OUT (C),A
@ -596,39 +606,48 @@ PRESET: LD A,B
OUT (C),A OUT (C),A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
AND A ;AND A
RET 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: LD XH,D DIV32X: ;HL:DE / BC => DE:IX HL-OSTATOK
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 ;
.loop: ADD IX,IX
EX DE,HL EX DE,HL
ADC HL,HL ADC HL,HL
EX DE,HL EX DE,HL
ADC HL,HL ADC HL,HL
SBC HL,BC SBC HL,BC
JR NC,DIV012 JR NC,.DIV012
;
ADD HL,BC ADD HL,BC
DEC A DEC A
JR NZ,DIV011 JR NZ,.loop
JR DIV014 ;
DIV012: INC IX JR .DIV014
;
.DIV012: INC IX
DEC A DEC A
JR NZ,DIV011 JR NZ,.loop
DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ;
.DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
LD D,0 LD D,0
XOR A XOR A
CHS005: INC A ;
.loop2: INC A
SBC HL,DE SBC HL,DE
JR NC,CHS005 JR NC,.loop2
;
ADD HL,DE ADD HL,DE
DEC A DEC A
LD H,A LD H,A
@ -642,6 +661,7 @@ CHS005: INC A
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; 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
@ -664,6 +684,7 @@ 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
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;

View File

@ -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

View File

@ -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

View File

@ -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.