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

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,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
@ -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
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,61 +490,65 @@ 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
@ -517,105 +556,137 @@ 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
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

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 ===============================================; 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

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