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
; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
TABLE_X:
.v0: DB 00101000b ; "0"
.v1: DB 10111101b ; "1"
.v2: DB 00110010b ; "2"
.v3: DB 00110100b ; "3"
.v4: DB 10100101b ; "4"
.v5: DB 01100100b ; "5"
.v6: DB 01100000b ; "6"
.v7: DB 00111101b ; "7"
.v8: DB 00100000b ; "8"
.v9: DB 00100100b ; "9"
.vA: DB 00100001b ; "A"
.vB: DB 11100000b ; "B"
.vC: DB 01101010b ; "C"
.vD: DB 10110000b ; "D"
.vE: DB 01100010b ; "E"
.vF: DB 01100011b ; "F"
.v0: DB %00101000 ; "0" a
.v1: DB %10111101 ; "1" ___
.v2: DB %00110010 ; "2" f | g | b
.v3: DB %00110100 ; "3" |___|
.v4: DB %10100101 ; "4" e | | c
.v5: DB %01100100 ; "5" |___|.
.v6: DB %01100000 ; "6" d
.v7: DB %00111101 ; "7"
.v8: DB %00100000 ; "8" a - 7
.v9: DB %00100100 ; "9" b - 6
.vA: DB %00100001 ; "A" . - 5
.vB: DB %11100000 ; "B" f - 4
.vC: DB %01101010 ; "C" g - 3
.vD: DB %10110000 ; "D" e - 2
.vE: DB %01100010 ; "E" c - 1
.vF: DB %01100011 ; "F" d - 0
ENDIF
;=======================================
;
@ -268,23 +268,23 @@ ROM_DISK.Pages: ;
_mInfoALIGN #10,0
; any adress < #C0 with mask %xxxx0000
; â ¡«¨æ  ¤«ï Sprinter POST-Tester-a
TABLE_X: ; â ĄŤ¨ć  ¤Ťď Sprinter POST-Tester-a
TABLE_X:
.v0: DB %00101000 ; "0" a
.v1: DB %10111101 ; "1" ___
.v2: DB %00110010 ; "2" f | g | b
.v3: DB %00110100 ; "3" |___|
.v4: DB %10100101 ; "4" e | | c
.v5: DB %01100100 ; "5" |___|
.v6: DB %01100000 ; "6" d
.v5: DB %01100100 ; "5" |___|.
.v6: DB %01100000 ; "6" d
.v7: DB %00111101 ; "7"
.v8: DB %00100000 ; "8" a - 7
.v9: DB %00100100 ; "9" b - 6
.vA: DB %00100001 ; "A" f - 4
.vB: DB %11100000 ; "B" g - 3
.vC: DB %01101010 ; "C" e - 2
.vD: DB %10110000 ; "D" c - 1
.vE: DB %01100010 ; "E" d - 0
.vF: DB %01100011 ; "F"
.vA: DB %00100001 ; "A" . - 5
.vB: DB %11100000 ; "B" f - 4
.vC: DB %01101010 ; "C" g - 3
.vD: DB %10110000 ; "D" e - 2
.vE: DB %01100010 ; "E" c - 1
.vF: DB %01100011 ; "F" d - 0
ENDIF
;=======================================
;
@ -424,6 +424,25 @@ EXTINT: OR A
; ==== 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
START:
; *********************************
@ -499,7 +518,7 @@ POST_1_RAM_BUS:
; ¡¥áª®­¥ç­ë© 横«
INC L
LD A,L
AND #AF
AND +(TABLE_X or #0F) ;%1010'1111
LD L,A
JR .ERB_2
@ -548,12 +567,12 @@ POST_2_ADRESS_BUS:
.error:
.TSAB_4:
LD C,D
LD B,11011111b
LD B,%1101'1111
LD IX,.TSAB_3
JR OUT_C_BYTE ; ¢ë¢¥á⨠áâ à訩 ¡ ©â á § ¯ï⮩
.TSAB_3:
LD C,E
LD B,#FF
LD B,%1111'1111
LD IX,.TSAB_4
JR OUT_C_BYTE ; ¢ë¢¥á⨠¬« ¤è¨© ¡¥§ § ¯ï⮩
@ -663,7 +682,7 @@ POST_4_PAGES:
.error: LD C,B
LD IX,.error_out_ret
.error_out_ret:
LD B,11011111b
LD B,%1101'1111
JP OUT_C_BYTE
; ***********************************
@ -679,11 +698,17 @@ POST_5_DATA_BUS:
LD B,0
.loop: IN A,(0)
CP #FF
;JR NZ,.error ;!!!!! ŻŽáŹŽâŕĽâě
JR NZ,POST_5_ERROR
IF ERROR_POST_5
JR NZ,.error ;!!!!! ¯®á¬®âà¥âì
ELSE
JR NZ,POST_5_ERROR
ENDIF
DJNZ .loop
LD A,(TABLE_X.v5) ;rdlow-ok
JR POST_5_OK
;
;
IF ERROR_POST_5
; ERROR CODE '_'XX
.error:
LD C,A
@ -702,15 +727,18 @@ POST_5_DATA_BUS:
OR E
JR NZ,.LOOP_WTT4
JR .erb1
ENDIF
; **********************************
; ===== Point 5 =========
; **********************************
IFN ERROR_POST_5
POST_5_ERROR:
LD A,(TABLE_X.vF) ;rdlow-ok
ENDIF
POST_5_OK:
LD A,(TABLE_X.v5) ;rdlow-ok
OUT (Z84.PIO.Port_A.Data),A ; ¢ë¢¥á⨠"5"
POST_5_ERROR:
; **********************************
; POST § ¢¥à襭
ENDMODULE

View File

@ -3,6 +3,10 @@
;[]===========================================================[]
;!TODO
; ®¡ê¥¤¥­¨âì ¯à®æ¥¤ãàë FDD_5x_LONG_READ ¨ FDD_5x_LONG_WRITE
; ®¡ê¥¤¥­¨âì ¯à®æ¥¤ãàë READ_SECTOR ¨ WR_SEC
; FDD.CHANGE:
; LD A,#01
@ -178,10 +182,9 @@ FDD_5x_RESET: CALL SAVE_INTERRUPTS.switch_off
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_READ:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
FDD_5x_READ: EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;[]===========================================================[]
;Function: Long Read Sectors
; A - Disk
@ -194,7 +197,11 @@ FDD_5x_READ:
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
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
JP SAVE_INTERRUPTS.restore
;
@ -202,8 +209,9 @@ FDD_5x_LONG_READ:
PUSH BC
PUSH HL
PUSH IX
;
EX AF,AF'
LD C,A
LD C,A ; Memory Page Number
EX AF,AF'
PUSH BC
CALL SET_DOS_ON
@ -212,46 +220,53 @@ FDD_5x_LONG_READ:
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
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 C,A
EX AF,AF'
OUT (SLOT3),A
.DSK_LP: LD A,D
EXX
CALL SEEK
EXX
PUSH BC
CALL SEEK
POP BC
EXX
PUSH DE
PUSH BC
PUSH HL
CALL READ_SECTOR
;CALL READ_SECTOR
CALL FDD_RW_SECTOR
JR C,ERRDOS
LD D,YH
LD E,YL
; à §¬¥à ᥪâ®à 
LD D,YH
LD E,YL
;
POP HL
POP BC
ADD HL,DE
JR NC,.THISRD
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
;
CALL C,CHANGE_MEM_BLK
; 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
; ; SET 7,H
; ; SET 6,H
; LD A,%1100'0000
; OR H
; LD H,A
;
.THISRD: POP DE
LD A,C
INC E
@ -261,7 +276,7 @@ FDD_5x_LONG_READ:
INC D
.NINC_T: DJNZ .DSK_LP
.RETDOS: CALL SET_DOS_OFF
LD A,XH
LD A,XH ; Memory Page Number
EX AF,AF'
EX DE,HL
POP IX
@ -276,12 +291,19 @@ FDD_5x_LONG_READ:
JR NZ,.ADD8BIT
INC B
.ADD8BIT: ADD IX,BC
LD BC,0
ADC HL,BC
LD B,A
XOR A
RET
;
;!TEST
;LD BC,0
;ADC HL,BC
;LD B,A
;XOR A
;RET
;
LD B,A
RET NC
INC HL
XOR A
RET
;
ERRDOS: POP HL
POP BC
POP DE
@ -289,7 +311,7 @@ ERRDOS: POP HL
EX DE,HL
EX AF,AF'
EXX
LD C,XH
LD C,XH ; Memory Page Number
EXX
LD A,B
POP IX
@ -307,7 +329,7 @@ ERRDOS: POP HL
ADC HL,BC
POP BC
EXX
LD A,C
LD A,C
EXX
EX AF,AF'
SCF
@ -323,10 +345,9 @@ ERRDOS: POP HL
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;[]===========================================================[]
FDD_5x_WRITE:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
FDD_5x_WRITE: EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;[]===========================================================[]
;Function: Long Write Sectors
; A - Disk
@ -340,6 +361,12 @@ FDD_5x_WRITE:
;?? B - Sector counter
;[]===========================================================[]
FDD_5x_LONG_WRITE:
EXX
LD B,#A0 ;COMMAND WRITE
EXX
JP FDD_5x_LONG_READ.RW_Shared
/*
CALL SAVE_INTERRUPTS.switch_off
CALL .Start
JP SAVE_INTERRUPTS.restore
@ -348,8 +375,9 @@ FDD_5x_LONG_WRITE:
PUSH BC
PUSH HL
PUSH IX
;
EX AF,AF'
LD C,A
LD C,A
EX AF,AF'
PUSH BC
CALL SET_DOS_ON
@ -358,9 +386,6 @@ FDD_5x_LONG_WRITE:
CALL NTRACK
POP BC
EX DE,HL
; LD A,B
; OR A
; JP Z,RETDOS
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
@ -372,32 +397,41 @@ FDD_5x_LONG_WRITE:
EX AF,AF'
OUT (SLOT3),A
.DSK_LP2: LD A,D
EXX
CALL SEEK
EXX
PUSH BC
CALL SEEK
POP BC
EXX
PUSH DE
PUSH BC
PUSH HL
CALL WR_SEC
CALL WR_SEC
JR C,ERRDOS
LD D,YH
LD E,YL
; à §¬¥à ᥪâ®à 
LD D,YH
LD E,YL
;
POP HL
POP BC
ADD HL,DE
JR NC,.THISWR
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD D,#C2
LD E,XH
LD A,(DE)
LD XH,A
EX AF,AF'
OUT (SLOT3),A
SET 7,H
SET 6,H
;
CALL C,CHANGE_MEM_BLK
; 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
; ; SET 7,H
; ; SET 6,H
; LD A,%1100'0000
; OR H
; LD H,A
;
.THISWR: POP DE
LD A,C
INC E
@ -435,15 +469,16 @@ FDD_5x_LONG_WRITE:
XOR A
RET
;
*/
/*
;
;-------------------------------
;READ SECTOR
;-------------------------------
READ_SECTOR: LD D,5 ;RETRY COUNT
.RRETRY: ;DI
.HL_RETRY: ;DI
PUSH HL
PUSH DE
LD A,E
INC A
@ -455,167 +490,203 @@ READ_SECTOR: LD D,5 ;RETRY COUNT
;
LD B,4 ; áçñâ稪
LD C,FDC_93.Data
LD A,#80 ;!HARDCODE COMMAND READ
LD A,#80 ; COMMAND READ
OUT (FDC_93.Command),A
;
.FDR001: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND #C0
JR NZ,.FDR004
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR NZ,.read_loop
INC DE
LD A,E
OR D
JR NZ,.FDR001
;
DJNZ .FDR001
SCF
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'
OUT (SLOT3),A
OUT (SLOT3),A
EX AF,AF'
;
POP DE
POP HL
;EI
LD A,BIOS.Error.NotReady
JR C,.ERR_XRD
;
IN A,(FDC_93.Command)
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
RET Z
RET Z ; ‚ë室 ¡¥§ ®è¨¡®ª
;
BIT 2,C
JR NZ,.ERDATA
;
LD A,BIOS.Error.Seek
DEC D
.ERR_XRD: DEC D
JR Z,.RSTOP
;
PUSH DE
PUSH HL
CALL RESWG ; RESET_WG
LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
.ERR_XRD: POP DE
JR .RRETRY
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
POP HL
POP DE
JR .HL_RETRY
;
.ERDATA: DEC D ; POTERIA DANNYH
JR NZ,.RRETRY
.ERDATA: DEC D ; ¯®â¥àï ¤ ­­ëå
JR NZ,.HL_RETRY
; Error Read
.ERRRD: LD A,BIOS.Error.Read
.RSTOP: EX AF,AF'
LD A,#D0
OUT (FDC_93.Command),A ;STOP OPERATION
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
RET
; ; ;
*/
;
;-------------------------------
;WRITE SECTOR
;-------------------------------
WR_SEC: LD D,5 ;RETRY COUNT
.WRETRY:
;DI
PUSH DE
LD A,E
INC A
OUT (FDC_93.Sector),A
.FDWRITE:
IN A,(SLOT3)
EX AF,AF'
LD A,XH
OUT (SLOT3),A
LD B,4
LD C,FDC_93.Data
LD A,#A0 ;COMMAND WRITE
OUT (FDC_93.Command),A
.FDW001:
IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND #C0
JR NZ,.FDW004
INC DE
LD A,E
OR D
JR NZ,.FDW001
DJNZ .FDW001
SCF
JR .FDW005
.FDW004:
OUTI ;WRITE BYTE
.FDW002:
IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.FDW002
JP P,.FDW004
.FDW005:
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
;-------------------------------
POP DE
;EI
IN A,(FDC_93.Command)
LD C,A
;R01
JR C,.ERR_XWR
AND #7F
RET Z
BIT 6,C
LD A,BIOS.Error.WriteProtect
JR NZ,.WSTOP
BIT 2,C
JR NZ,.EWDATA
LD A,BIOS.Error.Seek
DEC D
JR Z,.WSTOP
.ERR_XWR:
PUSH DE
CALL RESWG ; RESET_WG
LD A,XL
CALL SEEK ; !!!!! ¯®á¬®âà¥âì
POP DE
JR .WRETRY
.EWDATA:
DEC D ; POTERIA DANNYH
JR NZ,.WRETRY
.ERRWR: LD A,BIOS.Error.Write
.WSTOP: 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
FDD_RW_SECTOR: LD D,5 ;RETRY COUNT
.RETRY: DI
PUSH HL
PUSH DE
LD A,E
INC A
OUT (FDC_93.Sector),A
IN A,(SLOT3)
EX AF,AF'
LD A,XH
OUT (SLOT3),A
;
LD B,4
LD C,FDC_93.Data
EXX
LD A,B ; COMMAND read or write
EXX
OUT (FDC_93.Command),A
;
.wait_loop: IN A,(FDC_93.DrvCTRL) ;WAIT INTRQ or DRQ
AND %1100'0000 ;b6: DRQ (§ ¯à®á ¤ ­­ëå = 1). b7: INTRQ (¢ë¯®«­ï¥âáï ª®¬ ­¤  = 0).
JR NZ,.RW_PROC
INC DE
LD A,E
OR D
JR NZ,.wait_loop
DJNZ .wait_loop
SCF
JR .after_rw ; error
;
.RW_PROC: EXX
BIT 5,B
EXX
JR NZ,.write_loop
;READ BYTE
.read_loop: INI
.wait_data_r: IN A,(FDC_93.DrvCTRL)
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
EX AF,AF'
;
POP DE
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)
LD C,A
AND #7F
; NORMAL EXIT
RET Z
;
BIT 6,C
LD A,BIOS.Error.WriteProtect
JR NZ,.error_exit
;
BIT 2,C
JR NZ,.data_lost
;
LD A,BIOS.Error.Seek
.CMD_ERROR: DEC D
JR Z,.error_exit
;
PUSH DE
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:
EX AF,AF'
LD A,CNF_PORT.CNF_3 + ROM.BIOS
OUT (SYS_PORT.ROM),A ; - OPEN
EX AF,AF'
RET
SET_DOS_ON: EX AF,AF'
LD A,CNF_PORT.CNF_3 + ROM.BIOS
OUT (SYS_PORT.ROM),A ; - OPEN
EX AF,AF'
RET
; ‚àã¡ ¥â ­ã«¥¢ãî ª àâã ¯®à⮢
SET_DOS_OFF:
EX AF,AF'
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A ; - CLOSE
EX AF,AF'
RET
SET_DOS_OFF: EX AF,AF'
LD A,CNF_PORT.CNF_0 + ROM.BIOS
OUT (SYS_PORT.ROM),A ; - CLOSE
EX AF,AF'
RET
;
S_FDD: PUSH BC
@ -625,12 +696,12 @@ S_FDD: PUSH BC
OUT (FDC_93.DrvCTRL),A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
AND #FE
OR B
LD (FDD_INIT_TABLE.FDD_0.DISK),A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
AND #FE
OR B
LD (FDD_INIT_TABLE.FDD_0.DISK),A
EX AF,AF'
OUT (SLOT3),A
POP BC
@ -672,10 +743,10 @@ FDD.SET1440: LD A,FDD_Density.SET_1440
;
SET_SPEED: IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.F144)
AND #80
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.F144)
AND #80
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
@ -687,116 +758,118 @@ FDD.SET720: LD A,FDD_Density.SET_720
; ¯à¥à뢠­¨ï ¤®«¦­ë ¡ëâì ®âª«î祭ë
DISK_ID: EXX
CALL SET_SPEED
IN A,(FDC_93.Track)
OUT (FDC_93.Data),A
LD A,#18 ;!TODO ¢ë¯¨á âì ª®¬¬ ­¤ë ‚ƒ ;SEARCH ; !HARDCODE
CALL EXECOM
LD C,4 ; áçñâ稪
.loop_reg_C: LD A,#C0
OUT (FDC_93.Command),A
LD HL,#F000 ; áçñâ稪
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP4
;
.ID_LP2: IN A,(FDC_93.Data)
.ID_LP3: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP3
JP P,.ID_LP2
CALL SET_SPEED
IN A,(FDC_93.Track)
OUT (FDC_93.Data),A
LD A,#18 ;!TODO ¢ë¯¨á âì ª®¬¬ ­¤ë ‚ƒ ;SEARCH ; !HARDCODE
CALL EXECOM
LD C,4 ; áçñâ稪
.loop_reg_C: LD A,#C0
OUT (FDC_93.Command),A
LD HL,#F000 ; áçñâ稪
.loop_reg_HL: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP4
;
.ID_LP2: IN A,(FDC_93.Data)
.ID_LP3: IN A,(FDC_93.DrvCTRL)
AND #C0
JR Z,.ID_LP3
JP P,.ID_LP2
EXX
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.F144)
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.F144)
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
AND #80
RET
;
.ID_LP4: DEC HL
LD A,H
OR L
JR NZ,.loop_reg_HL
CALL CHANGE_SPEED
DEC C
JR NZ,.loop_reg_C
.ID_LP4: DEC HL
LD A,H
OR L
JR NZ,.loop_reg_HL
CALL CHANGE_SPEED
DEC C
JR NZ,.loop_reg_C
EXX
SCF
RET
;
;
SEEK: LD XL,A
LD C,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
AND 1
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
SRL C
JR C,.GT001
OR #3C
.GT001: OR #2C
OUT (FDC_93.DrvCTRL),A
IN A,(FDC_93.Track)
CP C
PUSH BC
CALL NZ,P50ms
POP BC
LD A,C
OUT (FDC_93.Data),A
IN A,(FDC_93.Track)
CP C
EX AF,AF' ;R.TRACK==PHISICAL TRACK
LD A,#18
CALL EXECOM
RET C
EX AF,AF'
LD A,C
OUT (FDC_93.Track),A
RET Z
.STOL: PUSH BC
CALL P50ms
POP BC
RET
SEEK: LD XL,A
LD C,A
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.DISK)
AND 1
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
SRL C
JR C,.GT001
;
OR #3C
.GT001: OR #2C
OUT (FDC_93.DrvCTRL),A
IN A,(FDC_93.Track)
CP C
PUSH BC
CALL NZ,P50ms
;
POP BC
LD A,C
OUT (FDC_93.Data),A
IN A,(FDC_93.Track)
CP C
EX AF,AF' ;R.TRACK==PHISICAL TRACK
LD A,#18
CALL EXECOM
RET C
EX AF,AF'
LD A,C
OUT (FDC_93.Track),A
RET Z
.STOL: PUSH BC
CALL P50ms
POP BC
RET
;
;P750ms LD B,3
;PMS2 LD A,255
; CALL P1ms
; DJNZ PMS2
; RET
P50ms: LD A,12
.P1ms: LD C,255
.PMS: DEC C
JR NZ,.PMS
DEC A
JR NZ,.P1ms
RET
P50ms: LD A,12
.P1ms: LD C,255
.PMS: DEC C
JR NZ,.PMS
DEC A
JR NZ,.P1ms
RET
;
;
RESWG: LD A,8
EXECOM: OUT (FDC_93.Command),A
LD HL,#0000 ; áçñâ稪
.WREST: DEC HL
LD A,H
OR L
SCF
RET Z
;
IN A,(FDC_93.DrvCTRL)
AND #80
JR Z,.WREST
;AND A
RET
RESWG: LD A,8
;
EXECOM: OUT (FDC_93.Command),A
LD HL,#0000 ; áçñâ稪
.WREST: DEC HL
LD A,H
OR L
SCF
RET Z
;
IN A,(FDC_93.DrvCTRL)
AND #80
JR Z,.WREST
RET
;
;
@ -804,35 +877,34 @@ EXECOM: OUT (FDC_93.Command),A
; HL:IX - SECTOR
; H - TRACK, L - SECTOR
;HL:IX/SECTOR_PER_TRACK
NTRACK:
PUSH HL
EX (SP),IX
POP HL
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
LD C,A
LD B,0
EX AF,AF'
OUT (SLOT3),A
XOR A
.NTRK: INC A
SBC HL,BC
JR NC,.NTRK
EX AF,AF'
LD A,XL
OR XH
JR Z,.NTRK3
EX AF,AF'
DEC IX
JR .NTRK
.NTRK3: EX AF,AF'
ADD HL,BC
DEC A
LD H,A
RET
NTRACK: PUSH HL
EX (SP),IX
POP HL
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(FDD_INIT_TABLE.FDD_0.SECTORS)
LD C,A
LD B,0
EX AF,AF'
OUT (SLOT3),A
XOR A
.NTRK: INC A
SBC HL,BC
JR NC,.NTRK
EX AF,AF'
LD A,XL
OR XH
JR Z,.NTRK3
EX AF,AF'
DEC IX
JR .NTRK
.NTRK3: EX AF,AF'
ADD HL,BC
DEC A
LD H,A
RET
;
SAVE_INTERRUPTS:
.switch_off: PUSH AF

View File

@ -151,9 +151,12 @@ ATAPI_5x_SET_PAR:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S)
ATAPI_5x_READ: EX AF,AF'
ATAPI_5x_READ: PUSH IY
LD C,0 ; ¯à¨§­ ª short
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
JP ATAPI_5x_LONG_READ.main
;[]================================================================[#52]
;Function: Long Read Sectors
; A - Disk
@ -166,10 +169,11 @@ ATAPI_5x_READ: EX AF,AF'
; DE - Address + (Sector counter * Size sector)
;LONG READ SECTOR(S)
ATAPI_5x_LONG_READ:
AND A
;AND A
;
PUSH IY
SAFE_PORTY_2
LD C,1 ; ¯à¨§­ ª long
.main: SAFE_PORTY_2
PUSH BC
PUSH IX
PUSH HL
@ -196,8 +200,10 @@ ATAPI_5x_LONG_READ:
; OUTPUT:
;
RW_ATAPI_SECTORs:
PUSH BC
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
POP BC
RET C
;
EXX
@ -232,16 +238,11 @@ RW_ATAPI_SECTORs:
LD A,B
LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01
;
; EX AF,AF'
; OUT (SLOT3),A
;
; POP AF
; OUT (SLOT3),A
LD YL,C ; ¯à¨§­ ª short/long ¨§ C ¢ YL
LD HL,RAM_ATAPI_RW_CMD
CALL EXEC_PACKET_COMMAND.start
;
.exit: POP BC
;LD C,SLOT3
OUT (C),B
RET
;
@ -262,9 +263,12 @@ RW_ATAPI_SECTORs:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
ATAPI_5x_WRITE: EX AF,AF'
ATAPI_5x_WRITE: PUSH IY
LD C,0 ; ¯à¨§­ ª short
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
JP ATAPI_5x_LONG_WRITE.main
;[]================================================================[#53]
;Function: Long Write Sectors
; A - Disk
@ -277,10 +281,11 @@ ATAPI_5x_WRITE: EX AF,AF'
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
ATAPI_5x_LONG_WRITE:
AND A
;AND A
;
PUSH IY
SAFE_PORTY_2
LD C,1 ; ¯à¨§­ ª long
.main: SAFE_PORTY_2
PUSH BC
PUSH IX
PUSH HL
@ -466,6 +471,7 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
; #0B - ABORTED COMMAND
; #80 - TIME OUT
EXEC_PACKET_COMMAND:
.error_ex: EX DE,HL
.error: CP #FF
.error_fail: SCF
LD A,BIOS.Error.Failure
@ -475,14 +481,15 @@ EXEC_PACKET_COMMAND:
RET
;
.error_TimeOut: CP #FF
EX DE,HL
JR Z,.error_fail
LD A,BIOS.Error.ATAPI.TimeOut
SCF
RET
;
.start_sys_page:
LD A,SYS_PAGE
EX AF,AF'
; .start_sys_page:
; LD A,SYS_PAGE
; EX AF,AF'
;
.start: XOR A ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
.start_custom: EXX
@ -501,7 +508,7 @@ EXEC_PACKET_COMMAND:
EXX
CALL ATAPI_WAITPRT
EXX
JR C,.error
JR C,.error_ex
;
.READY: LD C,SLOT3
IN B,(C)
@ -534,7 +541,7 @@ EXEC_PACKET_COMMAND:
LD C,H ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
CALL ATAPI_WAITPRT
EXX
JR C,.error
JR C,.error_ex
;
EXX
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 XL,0
EX AF,AF'
;
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
CALL ATAPI_WAITPRT
EXX
JP C,.error
; ZF=1
;JP C,.error
RET C
;
; [ ] media change.   ­ ¤® «¨ âãâ? ;!FIXIT «ãçè¥ ¡«®ª¨à®¢ âì ­®á¨â¥«ì
LD A,high IDE.Read.Status
@ -586,21 +710,17 @@ EXEC_PACKET_COMMAND:
AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
RRA ; Checking IDE.CtrlByte.CheckCondition
JR NC,.data_request
;JR NC,.data_request
RET NC
; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
EXX
DEC C ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
EXX
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
EX DE,HL
ATAPI_PREPARE_RW:
LD BC,IDE.Read.ByteCountLow
IN E,(C)
INC C ;LD BC,IDE.Read.ByteCountHigh
@ -618,54 +738,17 @@ EXEC_PACKET_COMMAND:
IN A,(C)
AND IDE.InterruptReasonByte.IO
LD BC,IDE.Read.Data
JR Z,.WRITE_DATA
;READ
; ¯à®¢¥àª  ­  â㯮áâì ª®¤¥à 
; CF=0
; ADC HL,DE
; JR Z,.good_buffer
; JR C,.error_buffer
;
; .good_buffer: AND A
; SBC HL,DE
SCF
RET
.read_loop: INI
INI
DEC DE
LD A,D
OR E
JR NZ,.read_loop
;
.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
;
; .AddrOverflow: EX DE,HL
; AND A
; SBC HL,DE
; EX DE,HL
; RET
;
; !TODO 宫®á⮥ ç⥭¨¥
; .error_buffer: AND A
; SBC HL,DE
@ -702,6 +785,8 @@ ATAPI_GET_ERROR_REG:
;----------------------------------------------------------------------;
; D - MASK, E - PATTERN
; !!! ­¥ª®â®àë¥ ä㭪樨 ­ ¤¥îâáï, çâ® ­  ¢ë室¥ ¢á¥£¤  ZF
; ­¥ ¤®«¦­  âண âì ॣ. C
ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
.Custom: LD B,100
LD HL,#0000
@ -762,7 +847,7 @@ ATAPI_READ_CAPACITY_DATA:
JR NZ,.pause
;
JP .loop
RET
;RET
;----------------------------------------------------------------------;
@ -775,6 +860,9 @@ ATAPI_READ_CAPACITY_DATA:
;----------------------------------------------------------------------;
ATAPI_MEDIA_ERROR:
PUSH IX
PUSH HL
;
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
@ -826,6 +914,8 @@ ATAPI_MEDIA_ERROR:
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
;
.exit: POP AF
POP HL
POP IX
OUT (SLOT3),A
LD A,C
SCF

View File

@ -161,10 +161,12 @@ ATA_5x_SET_PAR:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S)
ATA_5x_READ:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
ATA_5x_READ: PUSH IY
LD C,0 ; ¯à¨§­ ª short
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
JP ATA_5x_LONG_READ.main
;[]================================================================[#52]
;Function: Long Read Sectors
; A - Disk
@ -179,7 +181,8 @@ ATA_5x_READ:
;LONG READ SECTOR(S)
ATA_5x_LONG_READ:
PUSH IY
SAFE_PORTY_2
LD C,1 ; ¯à¨§­ ª long
.main: SAFE_PORTY_2
PUSH BC
PUSH IX
PUSH HL
@ -222,8 +225,12 @@ ATA_5x_LONG_READ:
PUSH BC
LD B,0
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 AF
SUB C
@ -245,10 +252,12 @@ ATA_5x_LONG_READ:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
ATA_5x_WRITE:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
ATA_5x_WRITE: PUSH IY
LD C,0 ; ¯à¨§­ ª short
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
JP ATA_5x_LONG_WRITE.main
;[]================================================================[#53]
;Function: Long Write Sectors
; A - Disk
@ -262,7 +271,8 @@ ATA_5x_WRITE:
;WRITE SECTOR(S)
ATA_5x_LONG_WRITE:
PUSH IY
SAFE_PORTY_2
LD C,1 ; ¯à¨§­ ª long
.main: SAFE_PORTY_2
PUSH BC
PUSH IX
PUSH HL
@ -273,70 +283,19 @@ ATA_5x_LONG_WRITE:
CALL RW_ATA_SECTORs
;
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
; HL:IX - Sector
; DE - Address
; B - Sector counter
; C - short/long
; A'- Memory Page Number
; 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
POP BC ; ¯à¨§­ ª short/long ¢ C
RET C
;
EXX
@ -346,12 +305,16 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
;
EX AF,AF'
PUSH AF ; memory page number
PUSH BC ; ¯à¨§­ ª short/long ¢ C
PUSH DE ; Address
CALL PRESET
; IY ¨§ SELECT_DRIVE ¡®«ìè¥ ­¥ ­ã¦¥­
;
POP HL ; Address
POP IY ; ¯à¨§­ ª short/long ¢ YL
POP AF ; memory page number
LD XL,0
LD XH,A
LD XH,A ; memory page number
LD BC,IDE.Write.Command
LD A,IDE.CMD.ATA.WriteSectorsWithRetry
JR C,.set_command ; CF = r/w
@ -386,40 +349,43 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
; ; ; ; ;
; CF=0
.return_rw: EX AF,AF' ;<-----------< /
INC XL ;INC LOADED SECTORS
OUT (SLOT3),A
;
LD A,H
OR L
JR NZ,.W44
JR NZ,.end_pass
; short/long
; A = 0
SUB YL
JR NC,.END_BUFFER
; next page in mem block
; ᤥ« âì ¥á«¨ ­¥ RW_LONG, ⮠宫®áâë¥ ç⥭¨¥/§ ¯¨áì ¨ ¢ë室 á ®è¨¡ª®©
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
CALL 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
;
.W44: INC XL ;INC LOADED SECTORS
.end_pass: ;INC XL ;INC LOADED SECTORS
EXX
CALL WAITPRT
EXX
RET C
;
;INC XL ;INC LOADED SECTORS
LD BC,IDE.Read.Status
IN A,(C)
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
INC B ; LD BC,IDE.Write.Data
@ -431,9 +397,49 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD
JR NZ,.loop
SCF
JP .return_rw
; ; ; ; ;
;ENDIF
; ;
.END_BUFFER: CALL ATA_IdlePasses.CHECK_DRV
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
@ -523,7 +529,7 @@ WRITE_ATA_SECTORs:
; A - Disk
; HL:IX - Sector
; B - Sector counter
;Return: None
;Return: CF - error
;VERIFY SECTOR(S)
ATA_5x_VERIFY: PUSH IY
SAFE_PORTY_2
@ -543,105 +549,119 @@ ATA_5x_VERIFY: PUSH IY
CALL WAITPRT
EXX
RET C
PUSH DE
;PUSH DE
; IN A,(SLOT3)
; PUSH AF
CALL PRESET
POP HL
; POP AF
; OUT (SLOT3),A
;POP HL
LD BC,IDE.Write.Command
LD A,IDE.CMD.ATA.ReadVerifySectorsWithRetry
OUT (C),A
LD BC,IDE.Read.Status
IN A,(C)
;BIT IDE.CtrlBit.Error,A
RRA ;BIT IDE.CtrlBit.Error,A : SCF : RET NZ
RET C
;
CALL WAITPRT
RET C
XOR A
RET
JP WAITPRT
;RET C
;XOR A
;RET
;[]================================================================[#54]
; HL:IX - LBA SECTOR
; B - SECTOR COUNTER
PRESET: LD A,B
LD BC,IDE.Write.Counter
OUT (C),A
;
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD BC,IDE.Write.DeviceHead
OUT (C),A
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ­®¬¥à  ¡¨â
AND %0100'0000
LD E,XL
LD D,XH
CALL Z,LBA_CHS
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.CylinderHigh
OUT (C),L ;LBA 16..23
LD BC,IDE.Read.Control
IN A,(C)
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
OR H ;LBA 24..27
INC B ; LD BC,IDE.Write.DeviceHead
;
OUT (C),A
EX AF,AF'
OUT (SLOT3),A
AND A
RET
; ¢ë室: SLOT3 = SYS_PAGE
PRESET: LD A,B
LD BC,IDE.Write.Counter
OUT (C),A
;
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD BC,IDE.Write.DeviceHead
OUT (C),A
;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ­®¬¥à  ¡¨â
AND %0100'0000
LD E,XL
LD D,XH
CALL Z,LBA_CHS
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.CylinderHigh
OUT (C),L ;LBA 16..23
LD BC,IDE.Read.Control
IN A,(C)
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
OR H ;LBA 24..27
INC B ; LD BC,IDE.Write.DeviceHead
;
OUT (C),A
EX AF,AF'
OUT (SLOT3),A
;AND A
RET
;PRESET ;
; HL:DE - SECTOR OFFSET
LBA_CHS:
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow)
LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh)
; HL:DE / BC => DE:IX HL-OSTATOK
DIV32X: LD XH,D
LD XL,E
EX DE,HL
LD HL,0
LD A,#20
DIV011: ADD IX,IX
EX DE,HL
ADC HL,HL
EX DE,HL
ADC HL,HL
SBC HL,BC
JR NC,DIV012
ADD HL,BC
DEC A
JR NZ,DIV011
JR DIV014
DIV012: INC IX
DEC A
JR NZ,DIV011
DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
LD D,0
XOR A
CHS005: INC A
SBC HL,DE
JR NC,CHS005
ADD HL,DE
DEC A
LD H,A
LD E,L
INC E
LD D,XL
LD A,XH
LD L,A
RET
LBA_CHS: LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow)
LD B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh)
;
DIV32X: ;HL:DE / BC => DE:IX HL-OSTATOK
LD XH,D
LD XL,E
EX DE,HL
LD HL,0
LD A,#20
;
.loop: ADD IX,IX
EX DE,HL
ADC HL,HL
EX DE,HL
ADC HL,HL
SBC HL,BC
JR NC,.DIV012
;
ADD HL,BC
DEC A
JR NZ,.loop
;
JR .DIV014
;
.DIV012: INC IX
DEC A
JR NZ,.loop
;
.DIV014: LD E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
LD D,0
XOR A
;
.loop2: INC A
SBC HL,DE
JR NC,.loop2
;
ADD HL,DE
DEC A
LD H,A
LD E,L
INC E
LD D,XL
LD A,XH
LD L,A
RET
;----------------------------------------------------------------------;
; D - MASK
; E - PATTERN
; !!! ­¥ª®â®àë¥ ä㭪樨 ­ ¤¥îâáï, çâ® ­  ¢ë室¥ ¢á¥£¤  ZF
WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready
.custom: LD BC,IDE.Read.Status
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
SCF
RET
RET
;
.ok: POP HL
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
; A - Disk

View File

@ -1659,28 +1659,27 @@ LP_PR_LINE_DIR:
; CF - XY-mode
; DE - ¬¥á⮠ᨬ¢®«  ¢ ®ª­¥, ¥á«¨ CF=1
; HL -  ¤à¥á á ¢ë¢®¤¨¬®© áâப®©
; B - à §¤¥«¨â¥«ì
; B - 梥⠪®­á®«¨ (¨á¯®«ì§ã¥âáï ¯à¨ áªà®««¥ ¨ ®ç¨á⪥ ®ª­ )
; IY - ¤¢  ᯥæ.ᨬ¢®«  ¤«ï ¢ë室  á CF=1. „®«¦­ë ¡ëâì à ¢­ë B, ¥á«¨ ­¥ ­ã¦­ë
; A' - 梥⠪®­á®«¨ (¨á¯®«ì§ã¥âáï ¯à¨ áªà®««¥ ¨ ®ç¨á⪥ ®ª­ )
; CF' - ¢ë¢®¤¨âì ᨬ¢®« á  âਡãâ ¬¨
;;;;;;;;;;;;;;;;;
.START: PUSH IX
LD XL,A ;  âਡãâë ¢ë¢®¤¨¬®£® ᨬ¢®« 
;
EX AF,AF'
PUSH AF ; 梥⠪®­á®«¨, attr-mode
PUSH AF ; attr-mode
EX AF,AF'
;
IN A,(SLOT3)
LD C,A
CALL LP_BEG_P
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 ; 梥⠪®­á®«¨
EXX
LD C,0
JR NC,.loop
INC C ; C' - attr flag. ¢ë¢®¤¨âì  âਡãâ
RL C ; C' - attr-mode. ¢ë¢®¤¨âì  âਡãâ
.loop: LD A,D
OUT (PORT_Y),A
EXX
@ -1690,7 +1689,7 @@ LP_PR_LINE_DIR:
LD A,(HL)
LD XH,A
INC HL
CP B
AND A
JR Z,.EXIT
CP YH
JR Z,.EXIT_SpecSymbol

View File

@ -17,6 +17,7 @@ BETA_RC EQU 0 ;
DEFINE LOGO_DELAY_NORM 100 ;
DEFINE LOGO_DELAY_MAX 130 ;
;----------------------------[ TEST ]---------------------------;
DEFINE ERROR_POST_5 0 ; ¢¨á­ãâì ­  ®è¨¡ª¥ ¢ POST 5
DEFINE TEST_INT 1 ; ’¥áâ®¢ë© ®¡à ¡®â稪 ¯®«ì§®¢ â¥«ì᪮£® INT
DEFINE NEW_FEATURE 0 ; !TODO ¯ã­ªâë ¢ á¥â ¯
;DEFINE HDDwriteProtect 0 ; áâ à ï ä¨èª  ¤«ï ä㭪権 5x

Binary file not shown.