diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index 412b12d..2d84a1c 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -7,10 +7,16 @@ ; 02-08-2001 DNS Initial this module ;--------------------------------------------------------------- ;======================================================== -MAX_ATAPI_SEC_SIZE EQU 4096 + +;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO +; +; [ ] установка параметра максимального размера для чтения через DRV_SET_PAR +; +;---------------------------------------------------------------------------------- +MAX_ATAPI_SEC_SIZE EQU 4096/2 PKTSIZE EQU 12 RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b -RAM_ATAPI_READ EQU SYS_PAGE.SHARED_BUFFER_32b+16 +RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16 ASSERT ((PKTSIZE % 4) = 0), "PKTSIZE must be an even number" @@ -44,7 +50,7 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI ;READ SECTOR(S) CD_5x_READ: EX AF,AF' - IN A,(SLOT3) + IN A,(SLOT3) EX AF,AF' ;[]================================================================[#52] ;Function: Long Read Sectors @@ -64,11 +70,11 @@ CD_5x_LONG_READ: PUSH IX PUSH HL ; + EX AF,AF' + AND A ;read + EX AF,AF' CALL RW_ATAPI_SECTORs - ; - - ; - RET + JP HDD_5x_LONG_READ.shared RW_ATAPI_SECTORs: LD C,IDE.Device.ATAPI @@ -82,7 +88,11 @@ RW_ATAPI_SECTORs: LD A,SYS_PAGE OUT (C),A LD HL,ATAPI_CMD_PACKET.READ - LD DE,RAM_ATAPI_READ + EX AF,AF' + JR NC,.read_cmd + LD HL,ATAPI_CMD_PACKET.WRITE +.read_cmd: EX AF,AF' + LD DE,RAM_ATAPI_RW_CMD LD BC,PKTSIZE LDIR EXX @@ -90,25 +100,26 @@ RW_ATAPI_SECTORs: LD A,H LD H,L LD L,A - LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL + LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.SECTOR+0),HL LD A,XH - LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A ;R01 + LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.SECTOR+2),A ;R01 LD A,XL - LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A ;R01 + LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.SECTOR+3),A ;R01 LD A,B - LD (RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A ;R01 + LD (RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A ;R01 ; EX AF,AF' OUT (SLOT3),A ; ; POP AF ; OUT (SLOT3),A - LD HL,RAM_ATAPI_READ + LD HL,RAM_ATAPI_RW_CMD CALL EXEC_PACKET_COMMAND ; POP BC LD C,SLOT3 OUT (C),B + RET ;[]===========================================================[#52, #55] @@ -157,7 +168,9 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; -; INPUT: HL - AP paket (12bytes) +; INPUT: HL - AP packet (12bytes) +; DE - address for/with data if needed +; ; RETURN: CF - ERROR ; !TODO CD ERRORS to INCLUDES ; #01 - RECOVERED ERROR @@ -216,10 +229,10 @@ EXEC_PACKET_COMMAND: LD BC,IDE.Write.Command LD A,IDE.ATAPI.Packet OUT (C),A - CALL CD_WAITPRT - EXX - RET C - EXX + ;CALL CD_WAITPRT + ;EXX + ;RET C + ;EXX LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest CALL CD_WAITPRT.Custom EXX @@ -229,6 +242,16 @@ EXEC_PACKET_COMMAND: LD A,#80 ; ERROR TIME OUT ;!HARDCODE RET ; +.CDERROR: LD BC,IDE.Read.Error ;ERROR + IN A,(C) + RRCA + RRCA + RRCA + RRCA + AND #0F + SCF + RET + ; .YEP_DRQ: LD C,SLOT3 IN B,(C) PUSH BC @@ -250,29 +273,33 @@ EXEC_PACKET_COMMAND: LD B,#80 .pause2: DJNZ .pause2 ; -.AP_LOOP: EXX + EX AF,AF' + 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' ;>-----------> \ + ; + EXX CALL CD_WAITPRT EXX RET C LD BC,IDE.Read.Status IN A,(C) BIT IDE.CtrlBit.Error,A - ;JR NZ,.CDERROR - RET Z + JR NZ,.CDERROR ; -.CDERROR: LD BC,IDE.Read.Error ;ERROR - IN A,(C) - RRCA - RRCA - RRCA - RRCA - AND #0F - SCF - RET - ; - ;!FIXIT AND IDE.CtrlByte.DataRequest - RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors + RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors + ; + LD A,XH + OUT (SLOT3),A + ; + ;====== IF DATA REQUEST =======================================; + ; EX DE,HL LD BC,IDE.Read.CylinderLow IN E,(C) @@ -284,27 +311,23 @@ EXEC_PACKET_COMMAND: ; LD BC,IDE.Read.Counter IN A,(C) - AND #02 - ;WRITE ;!FIXIT + AND %0000'0010 ;SENSE DATA AVAILABLE bit LD BC,IDE.Read.Data - JR NZ,.FROM_CD + JR Z,.WRITE_DATA ; -.WR_T_CD: OUTI - OUTI + ;READ +.read_loop: INI + INI DEC DE DEC DE LD A,D OR E - JR NZ,.WR_T_CD - EX DE,HL - JR .AP_LOOP + JR NZ,.read_loop ; - ;READ -.FROM_CD: ;LD BC,IDE.Read.Data - ; проверка на переполнение адреса буфера +.return_rw: INC XL ;INC LOADED SECTORS LD A,H OR L - JR NZ,.read_loop + JR NZ,.AP_LOOP ; next page in mem block LD HL,#C000 IN A,(SLOT3) @@ -317,18 +340,18 @@ EXEC_PACKET_COMMAND: LD XH,A EX AF,AF' ;<-----------< / OUT (SLOT3),A - ; -.read_loop: INI - INI + JR .AP_LOOP + ; ; + ;WRITE +.WRITE_DATA: INC B ; LD BC,IDE.Write.Data +.write_loop: OUTI + OUTI DEC DE DEC DE LD A,D OR E - JR NZ,.read_loop - ; - EX DE,HL - JR .AP_LOOP - ; + JR NZ,.write_loop + JR .return_rw ;.NULL: LD BC,IDE.Read.Data ;.RD_N_CD: IN A,(C) @@ -366,7 +389,7 @@ CD_WAITPRT: LD DE,256*(IDE.CtrlByte.DataRequest) + 0 JR NZ,.LOOP DJNZ .LOOP ; - EX AF,AF' + ;EX AF,AF' .error: ; !FIXIT error number SCF RET diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM new file mode 100644 index 0000000..449dc1f --- /dev/null +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM @@ -0,0 +1,779 @@ + +;======================================================== +;R03 !25.07.2001! BUG FIX WITH RETURN ERROR CODE +;R02 !24.07.2001! ADD SECONDARY CHANEL +;R01 !16.08.2000! REMOVED "DI" + +/* +;Write +IDE.Write.Command EQU #4153 ; #1F7 Command +IDE.Write.DeviceHead EQU #4152 ; #1F6 Drive Control + +HDW_CLH EQU #0155 ; #1F5 Cylinder High +HDW_CLL EQU #0154 ; #1F4 Cylinder Low +HDW_SEC EQU #0153 ; #1F3 Sector +HDW_CNT EQU #0152 ; #1F2 Counter +HDW_ERR EQU #0151 ; #1F1 Error +HDW_DAT EQU #0150 ; #1F0 Data + +;Read +IDE.Read.Status EQU #4053 ; #1F7 Status (Control) +HDR_DRV EQU #4052 ; #1F6 Drive Control + +HDR_CLH EQU #0055 ; #1F5 Cylinder High +HDR_CLL EQU #0054 ; #1F4 Cylinder Low +HDR_SEC EQU #0053 ; #1F3 Sector +HDR_CNT EQU #0052 ; #1F2 Counter +HDR_ERR EQU #0051 ; #1F1 Error +HDR_DAT EQU #0050 ; #1F0 Data + +;Bits for IDE.Read.Status +;---[] +BSY EQU 7 +RDY EQU 6 +DRQ EQU 3 +ERR EQU 0 +;---[] + +HDD EQU 1 +CDROM EQU 2 + + +;EQU FOR IY+ +IDE.HDD_INIT_TABLE.DRV_Flags EQU 0 +IDE.HDD_INIT_TABLE.SectorsPerTrack EQU 1 +IDE.HDD_INIT_TABLE.HeadsNumber EQU 2 +IDE.HDD_INIT_TABLE.CylinderNumberLow EQU 3 +IDE.HDD_INIT_TABLE.CylinderNumberHigh EQU 4 +IDE.HDD_INIT_TABLE.SectorsPerCylinderLow EQU 5 +IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh EQU 6 +DTYPE_H EQU 7 + +IDE0 EQU #C1C0 +IDE1 EQU #C1C8 +IDE2 EQU #C1D0 +IDE3 EQU #C1D8 +*/ + +;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00 +; DB #FF ;SECTORS PER TRACK ;01 +; DB #FF ;HEADS ;02 +; DB #FF ;CYLINDERS LOW ;03 +; DB #FF ;CYLINDERS HIGH ;04 +; DB #FF ;SECTOR PER CYLINDER LOW ;05 +; DB #FF ;SECTOR PER CYLINDER HIGH ;06 +; DB #FF ;RESERVED ;07 + +;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00 +; DB #FF ;SECTORS PER TRACK ;01 +; DB #FF ;HEADS ;02 +; DB #FF ;CYLINDERS LOW ;03 +; DB #FF ;CYLINDERS HIGH ;04 +; DB #FF ;SECTOR PER CYLINDER LOW ;05 +; DB #FF ;SECTOR PER CYLINDER HIGH ;06 +; DB #FF ;RESERVED ;07 + + +WRITE_OUTI_DUPs EQU 32 ; bytes + +;[]================================================================[#51] +;Function: Reset drive +HDD_5x_RESET: ; !FIXIT не ресетится? +;For non-ATAPI drives, the only method a driver has of resetting a drive +; after a major error is to do a "software reset" on the bus. +; Set bit 2 (SRST, value = 4) in the proper Control Register for the +; bus. This will reset both ATA devices on the bus. Then, you have to +; clear that bit again, yourself. The master drive on the bus is +; automatically selected. + XOR A + RET +;[]================================================================[#51] + + +;[]================================================================[#58] +;Function: Get Current Media Parameters +; A - Disk +;Return: +; H - Heads +; L - Sectors per cylinder +; DE - Cylinders +; IX - Capacity sector in bytes +; B - Flags: MASTER/SLAVE, LBA/CHS +HDD_5x_GETMED: + LD C,IDE.Device.HDD + CALL SELECT_DRIVE + RET C + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) + LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) + LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) + LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh) + LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) + LD IX,512 ;!HARDCODE sector size + EX AF,AF' + OUT (SLOT3),A + ;EX AF,AF' + AND A + RET +;[]================================================================[#58] + +;[]================================================================[#59] +;Function: Set Current Media Parameters +; A - Disk +; H - Heads +; L - Sectors +; DE - Cylinders +; IX - Capacity sector in bytes +; B - Flags +;Return: None +HDD_5x_SETMED: + LD C,IDE.Device.HDD + CALL SELECT_DRIVE + RET C + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),L + LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),H + LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),E + LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D + LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B + EX AF,AF' + OUT (SLOT3),A + ;EX AF,AF' + AND A + RET +;[]================================================================[#59] + +;[]================================================================[#55] +;Function: Read Sectors +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter +;Return: +; HL:IX - Sector + Sector counter +; DE - Address + (Sector counter * Size sector) +;READ SECTOR(S) +HDD_5x_READ: + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' +;[]================================================================[#52] +;Function: Long Read Sectors +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter, 0 = 256 +; A'- Memory Page Number +;Return: +; HL:IX - Sector + Sector counter +; DE - Address + (Sector counter * Size sector) +; A' - Last mem page in RAM Block used for readed data +;LONG READ SECTOR(S) +HDD_5x_LONG_READ: + PUSH IY + SAFE_PORTY_2 + PUSH BC + PUSH IX + PUSH HL + ;IF OPTIMIZE_RW_PROCEDURE + EX AF,AF' + AND A ;read + EX AF,AF' + CALL RW_ATA_SECTORs + ;ELSE + ;CALL READ_ATA_SECTORs + ;ENDIF + ; + EX DE,HL + JR C,.error + LD A,XH ; current page in mem block for SLOT3 + EX AF,AF' + ; + POP HL + POP IX + POP BC + XOR A + CP B + LD C,B + LD B,A + JR Z,.B_256_sectors + ; + ADD IX,BC + LD C,B +.pre_exit: ADC HL,BC +.exit: RESTORE_PORTY + POP IY + RET + ; +.B_256_sectors: INC B + ADD IX,BC + LD B,C + JR .pre_exit + ; +.error: LD B,A ; A - номер ошибки + LD C,XL + LD A,XH ; current page in mem block for SLOT3 + 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 + SCF ;R03 + JR .exit +; +/* + IFN OPTIMIZE_RW_PROCEDURE +READ_ATA_SECTORs: + LD C,IDE.Device.HDD + CALL SELECT_DRIVE + RET C + EXX + ;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 + CALL WAITPRT + EXX + RET C + EX AF,AF' + PUSH AF ; memory page number + PUSH DE + CALL PRESET + POP HL + POP AF ; memory page number + LD XL,0 + LD XH,A + LD BC,IDE.Write.Command + LD A,IDE.ATA.ReadSectorsWithRetry + OUT (C),A + ;SAVE HL! + EXX + LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0 + CALL WAITPRT.custom + EXX + RET C + ;DI ;R01 REMOVED "DI" +.big_loop: IN A,(SLOT3) + EX AF,AF' ;>-----------> \ + LD A,XH + OUT (SLOT3),A + ; + ; READ SECTOR 512 bytes ;!HARDCODE sector size + LD BC,IDE.Read.Data +.loop_256_1: DUP 16 + INI + EDUP + JP NZ,.loop_256_1 +.loop_256_2: DUP 16 + INI + EDUP + JP NZ,.loop_256_2 + ; ; ; ; ; + ; + EX AF,AF' ;<-----------< / + OUT (SLOT3),A + ; + LD A,H + OR L + JR NZ,.W44 + ; 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 + ; +.W44: INC XL ;INC LOADED SECTORS + EXX + ;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1 + CALL WAITPRT + EXX + RET C + LD BC,IDE.Read.Status + IN A,(C) + BIT IDE.CtrlBit.DataRequest,A + ; + RET Z + JP .big_loop + ;JP NZ,.big_loop + ;XOR A + ;RET + ; + ENDIF +*/ +;[]===========================================================[#52, #55] + + +;[]================================================================[#56] +;Function: Write Sectors +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter +;Return: +; HL:IX - Sector + Sector counter +; DE - Address + (Sector counter * Size sector) +;WRITE SECTOR(S) +HDD_5x_WRITE: + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' +;[]================================================================[#53] +;Function: Long Write Sectors +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter +; A'- Memory Page Number +;Return: +; HL:IX - Sector + Sector counter +; DE - Address + (Sector counter * Size sector) +;WRITE SECTOR(S) +HDD_5x_LONG_WRITE: + PUSH IY + + SAFE_PORTY_2 + + PUSH IX + PUSH HL + PUSH BC + ;IF OPTIMIZE_RW_PROCEDURE + EX AF,AF' + SCF ;write + EX AF,AF' + CALL RW_ATA_SECTORs + ;ELSE + ;CALL WRITE_ATA_SECTORs + ;ENDIF + ; + EX DE,HL + JP C,HERRWR0 + LD A,XH + EX AF,AF' + POP BC + POP HL + POP IX + 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 + ;EX AF,AF' + JR RST8WRR + +HERRWR0 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 + + +;███████████████████████████████████████████████████████████████████████████████████████████████████████; +/* +temp1=0; +bp 20e3,{b@20e3==cd},{temp1=1; g}; +bp 213b,{b@213b==cd},{temp1=2; g}; +bp 21B1,{b@21b1==01 and temp1==2}; +bp 2229,{b@2229==01 and temp1==1}; +*/ +; IF OPTIMIZE_RW_PROCEDURE +; CF=1 - write, CF=0 - read +RW_ATA_SECTORs: LD C,IDE.Device.HDD + CALL SELECT_DRIVE + RET C + EXX + ;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 + CALL WAITPRT + EXX + RET C + EX AF,AF' + PUSH AF ; memory page number + PUSH DE + CALL PRESET + POP HL + POP AF ; memory page number + LD XL,0 + LD XH,A + LD BC,IDE.Write.Command + LD A,IDE.ATA.WriteSectorsWithRetry + JR C,.set_command + ; + LD A,IDE.ATA.ReadSectorsWithRetry +.set_command: OUT (C),A + ;SAVE HL! + EX AF,AF' + EXX + LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest + CALL WAITPRT.custom + EXX + RET C + ;DI ;R01 REMOVED "DI" +.big_loop: IN A,(SLOT3) + EX AF,AF' ;>-----------> \ + LD A,XH + OUT (SLOT3),A + JR C,.write_sector + ; + ; READ SECTOR 512 bytes ;!HARDCODE sector size + LD BC,IDE.Read.Data +.loop_256_1: DUP 16 + INI + EDUP + JP NZ,.loop_256_1 +.loop_256_2: DUP 16 + INI + EDUP + JP NZ,.loop_256_2 + EX AF,AF' + ; ; ; ; ; + ; CF=0 +.return_rw: EX AF,AF' ;<-----------< / + OUT (SLOT3),A + ; + LD A,H + OR L + JR NZ,.W44 + ; 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 + ; +.W44: INC XL ;INC LOADED SECTORS + EXX + CALL WAITPRT + EXX + RET C + LD BC,IDE.Read.Status + IN A,(C) + BIT IDE.CtrlBit.DataRequest,A + ; + RET Z + JP .big_loop + ;JP NZ,.big_loop + ;XOR A + ;RET + ; + ; +.write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size + LD BC,IDE.Write.Data + LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size +.loop: DUP WRITE_OUTI_DUPs + OUTI + EDUP + DEC D + JR NZ,.loop + SCF + JP .return_rw + ; ; ; ; ; + + ;ENDIF +;███████████████████████████████████████████████████████████████████████████████████████████████████████; +/* + IFN OPTIMIZE_RW_PROCEDURE +WRITE_ATA_SECTORs: + LD C,IDE.Device.HDD + CALL SELECT_DRIVE + RET C + EXX + ;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 + CALL WAITPRT + EXX + RET C + EX AF,AF' + PUSH AF + PUSH DE + CALL PRESET + POP HL + POP AF + LD XL,0 + LD XH,A + LD BC,IDE.Write.Command + LD A,IDE.ATA.WriteSectorsWithRetry + OUT (C),A + ; SAVE HL?! + EXX + LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0 + CALL WAITPRT.custom + EXX + RET C + ; +.big_loop: IN A,(SLOT3) + EX AF,AF' + LD A,XH + OUT (SLOT3),A + ; WRITE SECTOR 512 bytes ;!HARDCODE sector size + LD BC,IDE.Write.Data + LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size +.loop: DUP WRITE_OUTI_DUPs + OUTI + EDUP + DEC D + JR NZ,.loop + ; ; ; ; ; + EX AF,AF' + OUT (SLOT3),A + ;EI + ; + LD A,H + OR L + JR NZ,.W33 + ; 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 + ; +.W33: INC XL ;INC SAVED SECTORS + EXX + ;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1 + CALL WAITPRT + EXX + RET C + LD BC,IDE.Read.Status + IN A,(C) + BIT IDE.CtrlBit.DataRequest,A + ; + RET Z + JP .big_loop + ;JP NZ,.big_loop + ;XOR A + ;RET + ; + ENDIF +*/ +;[]===========================================================[#53, #56] + + +;[]================================================================[#54] +;Function: Verify Sectors +; A - Disk +; HL:IX - Sector +; B - Sector counter +;Return: None +;VERIFY SECTOR(S) +HDD_5x_VERIFY: + PUSH IY + SAFE_PORTY_2 + PUSH IX + PUSH HL + CALL VRS000 + POP HL + POP IX + RESTORE_PORTY + POP IY + RET +;[]================================================================[#54] +;VERIFY SECTOR(S) +VRS000: LD C,IDE.Device.HDD + CALL SELECT_DRIVE + RET C + EXX + CALL WAITPRT + EXX + RET C + PUSH DE + CALL PRESET + POP HL + LD BC,IDE.Write.Command + LD A,IDE.ATA.ReadVerifySectorsWithRetry + OUT (C),A +VRS002: LD BC,IDE.Read.Status + IN A,(C) + BIT IDE.CtrlBit.Error,A + JR Z,VRS003 + SCF + RET +VRS003: CALL WAITPRT + RET C + XOR A + RET + LD BC,IDE.Read.Counter +; 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 + IF IDE_Optimization + 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 + ELSE + LD BC,IDE.Write.CylinderLow + OUT (C),D ;LBA 8..15 + 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 + LD BC,IDE.Write.DeviceHead + ENDIF + OUT (C),A + EX AF,AF' + OUT (SLOT3),A + AND A + RET + +; 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 + +;----------------------------------------------------------------------; +; D - MASK +; E - PATTERN +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 + ; +.loop: PUSH HL +; +.loop2: IN A,(C) + AND D + CP E + JR Z,.ok + DEC HL + LD A,L + OR H + JP NZ,.loop2 + ; + POP HL + DEC L + JR NZ,.loop + ; +.error: LD A,BIOS.Error.NotReady + SCF + RET +.ok: POP HL + RET +;----------------------------------------------------------------------; + + +;[]================================================================[#57] +;[x] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) +;Function: Detect Disk +; A - Disk +;Return: CF=0 - A=Drive type +; CF=1 - drive not present, A=#02 +HDD_5x_DETECT: + LD C,IDE.Device.HDD + JP DRV_DETECT +;[]================================================================[#57] \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index 449dc1f..979b9c6 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -161,7 +161,7 @@ HDD_5x_SETMED: ;READ SECTOR(S) HDD_5x_READ: EX AF,AF' - IN A,(SLOT3) + IN A,(SLOT3) EX AF,AF' ;[]================================================================[#52] ;Function: Long Read Sectors @@ -181,16 +181,13 @@ HDD_5x_LONG_READ: PUSH BC PUSH IX PUSH HL - ;IF OPTIMIZE_RW_PROCEDURE + ; EX AF,AF' AND A ;read EX AF,AF' CALL RW_ATA_SECTORs - ;ELSE - ;CALL READ_ATA_SECTORs - ;ENDIF ; - EX DE,HL +.shared: EX DE,HL JR C,.error LD A,XH ; current page in mem block for SLOT3 EX AF,AF' @@ -417,15 +414,12 @@ RST8WRR: RESTORE_PORTY ;███████████████████████████████████████████████████████████████████████████████████████████████████████; -/* -temp1=0; -bp 20e3,{b@20e3==cd},{temp1=1; g}; -bp 213b,{b@213b==cd},{temp1=2; g}; -bp 21B1,{b@21b1==01 and temp1==2}; -bp 2229,{b@2229==01 and temp1==1}; -*/ -; IF OPTIMIZE_RW_PROCEDURE -; CF=1 - write, CF=0 - read +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter +; A'- Memory Page Number +; CF'=1 - write, CF'=0 - read RW_ATA_SECTORs: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C @@ -460,10 +454,10 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD EX AF,AF' ;>-----------> \ LD A,XH OUT (SLOT3),A + LD BC,IDE.Read.Data JR C,.write_sector ; ; READ SECTOR 512 bytes ;!HARDCODE sector size - LD BC,IDE.Read.Data .loop_256_1: DUP 16 INI EDUP @@ -482,6 +476,7 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD OR L JR NZ,.W44 ; next page in mem block + ; сделать если не RW_LONG, то холостые чтение/запись и выход с ошибкой LD HL,#C000 IN A,(SLOT3) EX AF,AF' ;>-----------> \ @@ -511,7 +506,7 @@ RW_ATA_SECTORs: LD C,IDE.Device.HDD ; ; .write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size - LD BC,IDE.Write.Data + INC B ; LD BC,IDE.Write.Data LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size .loop: DUP WRITE_OUTI_DUPs OUTI @@ -649,8 +644,9 @@ VRS002: LD BC,IDE.Read.Status VRS003: CALL WAITPRT RET C XOR A - RET - LD BC,IDE.Read.Counter + RET + + ; HL:IX - LBA SECTOR ; B - SECTOR COUNTER PRESET: LD A,B @@ -670,7 +666,7 @@ PRESET: LD A,B CALL Z,LBA_CHS LD BC,IDE.Write.Sector OUT (C),E ;LBA 0..7 - IF IDE_Optimization + ; INC C ; LD BC,IDE.Write.CylinderLow OUT (C),D ;LBA 8..15 INC C ; LD BC,IDE.Write.CylinderHigh @@ -680,17 +676,7 @@ PRESET: LD A,B AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask OR H ;LBA 24..27 INC B ; LD BC,IDE.Write.DeviceHead - ELSE - LD BC,IDE.Write.CylinderLow - OUT (C),D ;LBA 8..15 - 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 - LD BC,IDE.Write.DeviceHead - ENDIF + ; OUT (C),A EX AF,AF' OUT (SLOT3),A diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index 4980061..9183f7d 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -2,7 +2,6 @@ ;======================================================================= ; Вход: A - номер устройства -; C - Тип SELECT_DRIVE: AND #0F LD IY,IDE.INIT_TBL_IDE0 diff --git a/src/bios/exp/FUNC_SCREEN 2.ASM b/src/bios/exp/FUNC_SCREEN 2.ASM new file mode 100644 index 0000000..ebd7fac --- /dev/null +++ b/src/bios/exp/FUNC_SCREEN 2.ASM @@ -0,0 +1,1144 @@ + +;****************************************************************** +; вход: DE - вертикаль, HL - горизонталь, +; B - цвет точки, A - экран +PIC_FN1: + AND A + SCF + RET NZ + + IN A,(PORT_Y) + PUSH AF + + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + + LD A,(WIN_ID_0.GRAF_Y) + ADD A,E + OUT (PORT_Y),A + LD A,B + LD BC,(WIN_ID_0.GRAF_X) + ADD HL,BC + LD B,A + LD A,#50 + OUT (SLOT3),A + LD (HL),A + EX AF,AF' + OUT (SLOT3),A + + POP AF + OUT (PORT_Y),A + RET + +; вход: DE - вертикаль, HL - горизонталь. +; IX - длина линии в точках не 0 !!! +; FILL - by A +; ????? +PIC_FN2: + LD D,A + IN A,(SLOT1) + EX AF,AF' + + LD A,B + ADD A,#50 + OUT (SLOT1),A + + BIT 0,B + LD BC,#40+#4000 + JR Z,PIC_FN2_NO_2ND + LD BC,#40+320+#4000 +PIC_FN2_NO_2ND: + ADD HL,BC + + LD A,E + OUT (PORT_Y),A + + LD A,XH + AND A + JR Z,PIC_FN2_NO256 +PIC_FN2_256L: + LD B,64 +PIC_FN2_256: + LD (HL),D + INC HL + LD (HL),D + INC HL + LD (HL),D + INC HL + LD (HL),D + INC HL + DJNZ PIC_FN2_256 + DEC A + JR NZ,PIC_FN2_256L + +PIC_FN2_NO256: + LD B,XL + AND A + RR B + JR NC,PIC_FN2_NO1 + LD (HL),D + INC HL + AND A +PIC_FN2_NO1: + RR B + JR NC,PIC_FN2_NO2 + LD (HL),D + INC HL + LD (HL),D + INC HL + AND A +PIC_FN2_NO2: + XOR A + CP B + JR Z,PIC_FN2_NO4 +PIC_FN2_4: + LD (HL),D + INC HL + LD (HL),D + INC HL + LD (HL),D + INC HL + LD (HL),D + INC HL + DJNZ PIC_FN2_4 +PIC_FN2_NO4: + + EX AF,AF' + OUT (SLOT1),A + XOR A + OUT (PORT_Y),A + RET + +;************************************************************************ +; вход: dE - вертикаль, HL - горизонталь. +; A',HL' - адрес данных во второй странице ! +; BC' - длина данных +; ВЫВОД ЛИНИИ ТОЧЕК +PIC_FN3: + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,C + LD (SYS_PAGE.COPY_SLOT3),A + IN A,(SLOT2) + LD (SYS_PAGE.COPY_SLOT2),A + IN A,(SLOT1) + LD (SYS_PAGE.COPY_SLOT1),A + + LD A,B + ADD A,#50 + OUT (SLOT1),A + + BIT 0,B + LD BC,#40 + #4000 + JR Z,PIC_FN3_NO_2ND + LD BC,#40 + 320 + #4000 +PIC_FN3_NO_2ND: + ADD HL,BC + + LD A,E + OUT (PORT_Y),A + + LD A,H + EXX + LD D,A + EXX + LD A,L + EXX + LD E,A + EXX + + EX AF,AF' + OUT (SLOT2),A + EX AF,AF' + LD HL,SYS_PAGE.RAM_TABLE + LD L,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(HL) + OUT (SLOT3),A + EXX + LDIR + BIT 6,H + JR Z,PIC_FN3_NO + RES 6,H + EX AF,AF' +PIC_FN3_NO: + EXX + + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.COPY_SLOT1) + OUT (SLOT1),A + LD A,(SYS_PAGE.COPY_SLOT2) + OUT (SLOT2),A + LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A + + XOR A + OUT (PORT_Y),A + RET + +;************************************************************************** +;PIC_FN4: +; вход: HL - данные палитры RGB, E - начальный цвет +; D - число цветов, B - PAL-mask, A - page PAL +PIC_SET_PAL: + PUSH IX + + EX AF,AF' + IN A,(PORT_Y) + PUSH AF ; сохранить положение PORT_Y + LD A,E + OUT (PORT_Y),A ; начальный цвет в порт + LD A,D ; сохранить число цветов + EX AF,AF' ; вернуть страницу PAL + + BIT 7,H ; проверить адрес данных + LD C,SLOT3 ; если ниже 8000h + LD D,#C3 ; то граф.экран на странице 3 + JR Z,.NO_PAGE1 + LD D,#43 ; иначе + LD C,SLOT1 ; на странице 1 +.NO_PAGE1: + ADD A,A + PUSH AF + + ADD A,A + AND #1C + XOR #E0 ; младший байт адреса PAL + LD E,A ; DE - адрес в видео-ОЗУ + PUSH DE + POP IX ; адрес палитры + + LD D,B ; маска PAL + EX AF,AF' ; вернуть число цветов + LD B,A ; число цветов + + IN E,(C) ; сохранить страницу 3 + LD A,#50 ; страница графического RAM + OUT (C),A + + POP AF + JR C,PIC_GET_PAL + ; цикл установки цветов палитры +.loopPal: + LD A,(HL) ; B + AND D + LD (IX+2),A + INC HL + + LD A,(HL) ; G + AND D + LD (IX+1),A + INC HL + + LD A,(HL) ; R + AND D + LD (IX+0),A + INC HL + + LD A,(HL) ; Y + AND D + LD (IX+3),A + INC HL + + IN A,(PORT_Y) + INC A + OUT (PORT_Y),A + DJNZ .loopPal ; выполнять, пока не 0 + +.exit: OUT (C),E ; восстановить страницу 3 + POP AF + OUT (PORT_Y),A ; восстановить Y_PORT + POP IX + AND A + RET + +PIC_GET_PAL: + ; цикл чтения цветов палитры +.loopPal: + LD A,(IX+2) + LD (HL),A ; B + INC HL + + LD A,(IX+1) + LD (HL),A ; G + INC HL + + LD A,(IX+0) + LD (HL),A ; R + INC HL + + LD A,(IX+3) + LD (HL),A ; Y + INC HL + + IN A,(PORT_Y) + INC A + OUT (PORT_Y),A + DJNZ .loopPal ; выполнять, пока не 0 + + JR PIC_SET_PAL.exit + +;******************************************************************** +PIC_FN5: ; УСТАНОВКА СТРАНИЦЫ MODE + LD A,E + AND 1 + OUT (RGMOD),A + RET +;******************************************************************* +; Установка внутренней палитры +; A - page_pal, E - номер палитры, B - тип палитры +SET_PAL_INIT: + LD D,A + DEC B + JP Z,SET_GRAPH_PALETTE + DEC B + JP Z,SET_TXT_PALETTE.ZX + DEC B + JP Z,SET_TXT_PALETTE.IBM + +; LD IX,PAL_DAT1 +; JR Z,PIC_FN6_L1 +; DEC B +; LD IX,PAL_DAT +; JR Z,PIC_FN6_L1 + + SCF + RET + +;PIC_FN6_L1: +; AND 3 +; ADD A,A +; ADD A,A +; ADD A,#E0 +; LD L,A +; LD H,#43 +; IN A,(SLOT1) +; PUSH AF +; +; LD A,#50 +; OUT (SLOT1),A +; XOR A +; OUT (PORT_Y),A +; EX AF,AF' +; call PAL_LOOP_M +; +; POP AF +; OUT (SLOT1),A +; XOR A +; OUT (PORT_Y),A +; +; RET + +;****************************************************************** +; Рисование линии. +; dЕ - вертикаль, HL - горизонталь +; H' - высота, C'/DE',B' - add_parameters +; A - color +PIC_FN7: + LD D,A + IN A,(SLOT1) + PUSH AF + + LD A,B + ADD A,#50 + OUT (SLOT1),A + + BIT 0,B + LD BC,#40+#4000 + JR Z,.no_2nd + LD BC,#40+320+#4000 +.no_2nd: + ADD HL,BC + LD A,E + +.loop: OUT (PORT_Y),A ; страница видео-ОЗУ + LD (HL),D + + EXX + EX AF,AF' + + DEC H + JR Z,.exit + + LD A,C ; NEXT HORIZONTAL + ADD A,B + LD C,A + LD A,E + EXX + + ADC A,L + LD L,A + + EXX + LD A,D + EXX + + ADC A,H + LD H,A + INC E ; NEXT VERTICAL + EX AF,AF' + INC A + JR .loop + +.exit: EXX + POP AF + OUT (SLOT1),A + XOR A + OUT (PORT_Y),A + RET + +;****************************************************************** +; Рисование линии. +; dЕ - вертикаль, HL - горизонталь +; H' - высота, C'/DE',B' - add_parameters +; (IX) - colors +PIC_FN8: + IN A,(SLOT1) + PUSH AF + + LD A,B + ADD A,#50 + OUT (SLOT1),A + + BIT 0,B + LD BC,#40+#4000 + JR Z,.no_2nd + LD BC,#40+320+#4000 +.no_2nd: + ADD HL,BC + LD A,E + +.loop: OUT (PORT_Y),A ; страница видео-ОЗУ + LD D,(IX) + INC IX + LD (HL),D + + EXX + EX AF,AF' + + DEC H + JR Z,.exit + + LD A,C ; NEXT HORIZONTAL + ADD A,B + LD C,A + LD A,E + EXX + + ADC A,L + LD L,A + + EXX + LD A,D + EXX + + ADC A,H + LD H,A + + INC E ; NEXT VERTICAL + + EX AF,AF' + INC A + JR .loop + +.exit: EXX + POP AF + OUT (SLOT1),A + XOR A + OUT (PORT_Y),A + RET + +;************************************************** +; Вывод спрайта на экран +; HL - горизоталь, dE - вертикаль +; A',HL' - адрес данных +PIC_FN9: + +;********************************* +; HL,E - координаты D - color +; B - Magnify +PIC_FN10: +PIC_FN11: +PIC_FN12: +PIC_FN13: +PIC_FN14: +PIC_FN15: + SCF + RET +;************************************ + + +;************************************ +; SYCLES EQU 0 +; ;START EQU 1 +; ST1 EQU 2 +; DPAL1 EQU 3 +; ST2 EQU 4 +; DPAL2 EQU 5 + +; MACRO NEXT_LIN_H +; EX AF,AF' +; INC A +; OUT (PORT_Y),A +; EX AF,AF' +; ENDM + +; MACRO NEXT_LIN_HP +; EX AF,AF' +; INC A +; OUT (PORT_Y),A +; JR NZ,.MD_NO_INC_H +; INC L +; .MD_NO_INC_H: +; EX AF,AF' +; ENDM + +;**************************************** +; Загрузка режима экрана. +;**************************************** + +; CALL SINC_DEF +; CALL SET_TXT_PALETTE.ZX +; RET + +;**************************************** + +;!TODO тут функция +CL0 EQU 200 +CL1 EQU 240 + + +SET_TXT_PALETTE: +.IBM: LD DE,#8000 + JR .TXT + ; +.ZX: LD DE,0 +.TXT: PUSH IX + IN A,(PORT_Y) + PUSH AF + IN A,(SLOT3) + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + ; + LD IX,#C3F0 ; !HARDCODE адрес палитры? +.generate_loop: + CALL GENERATE_PAL1 + LD A,E + OUT (PORT_Y),A + LD (IX),L ; R + LD (IX+1),B ; G + LD (IX+2),C ; B + LD (IX+3),H ; i ? + INC E + JR NZ,.generate_loop + ; + LD BC,4 + ADD IX,BC + INC D + LD A,D + AND 3 + JR NZ,.generate_loop + ; + EX AF,AF' + OUT (SLOT3),A + POP AF + OUT (PORT_Y),A + POP IX + RET + +; генерация спектрумовской палитры. +; Вход: E - атрибут, D - номер палитры +; ВЫХОД: L - red, B - green, C - blue, H - intensity +GENERATE_PAL1: XOR A + LD C,A + LD B,A + LD L,A + BIT 7,D + JR NZ,GENERATE_IBM + BIT 1,D + JR NZ,.FLH +.NOF: BIT 0,D + JR Z,.PAPER +.INK: LD A,CL0 + BIT 6,E + JR Z,.NOI1 + LD A,CL1 +.NOI1: BIT 0,E ; BLUE + JR Z,.NO1 + LD C,A +.NO1: BIT 1,E ; RED + JR Z,.PP_NO2 + LD L,A +.PP_NO2: BIT 2,E ; GREEN + JR Z,.PP_NO3 + LD B,A +.PP_NO3: JR .PP_NO6 +; +.FLH: BIT 7,E + JR Z,.NOF + BIT 0,D + JR Z,.INK +.PAPER: LD A,CL0 + BIT 6,E + JR Z,.NOI2 + LD A,CL1 +.NOI2: BIT 3,E ; BLUE + JR Z,.PP_NO4 + LD C,A +.PP_NO4: BIT 4,E ; RED + JR Z,.PP_NO5 + LD L,A +.PP_NO5: BIT 5,E ; GREEN + JR Z,.PP_NO6 + LD B,A +.PP_NO6: LD A,C + AND A + RRA + ADD A,L + RRA + ADD A,B + RRA + LD H,A ; B/W mode + RET +;**************************************** + +GENERATE_IBM: + BIT 7,E + JR Z,.NO_FLH + BIT 1,D + JR Z,.PAPER +.NO_FLH: + BIT 0,D + JR Z,.PAPER +.INK: +.NO_INTENS: + LD A,#A8 +.INTENS: + BIT 0,E ; BLUE + JR Z,.PPI_NO4 + LD C,A +.PPI_NO4: + BIT 2,E ; RED + JR Z,.PPI_NO5 + LD L,A +.PPI_NO5: + BIT 1,E ; GREEN + JR Z,.PPI_NO6 + LD B,A +.PPI_NO6: + LD A,E + AND #0F + CP 6 + JR NZ,.no_correct + LD B,#54 +.no_correct: + BIT 3,E + JR Z,GENERATE_PAL1.PP_NO6 + + LD A,#54 + ADD A,C + LD C,A + LD A,#54 + ADD A,B + LD B,A + LD A,#54 + ADD A,L + LD L,A + JR GENERATE_PAL1.PP_NO6 +.PAPER: + LD A,#A8 + BIT 4,E ; BLUE + JR Z,.PPI_NO4X + LD C,A +.PPI_NO4X: + BIT 6,E ; RED + JR Z,.PPI_NO5X + LD L,A +.PPI_NO5X: + BIT 5,E ; GREEN + JR Z,.PPI_NO6X + LD B,A +.PPI_NO6X: + LD A,E + AND #70 + CP #60 + JR NZ,GENERATE_PAL1.PP_NO6 + LD B,#54 + JR GENERATE_PAL1.PP_NO6 +;**************************************** + +;**************************************** +;**************************************** + +; D - номер графической палитры +SET_GRAPH_PALETTE: + PUSH IX + IN A,(PORT_Y) + PUSH AF + + IN A,(SLOT3) + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + + + LD IX,#C3E0 + LD A,D + AND 3 + ADD A,A + ADD A,A + LD E,A + LD D,0 + ADD IX,DE + + LD E,0 + + XOR A + LD B,A + LD C,A + LD L,A + LD H,A + +SET_PAL_GR1: + LD A,E + OUT (PORT_Y),A + + LD (IX),L + LD (IX+1),B + LD (IX+2),C + LD (IX+3),H + + CALL GENERATE_PAL3 + + INC E + LD A,E + CP 40 + JR NZ,SET_PAL_GR1 + + XOR A + LD B,A + LD C,A + LD L,A + LD H,A + +SET_PAL_GR2: + LD A,E + OUT (PORT_Y),A + + LD (IX),L + LD (IX+1),B + LD (IX+2),C + LD (IX+3),H + + CALL GENERATE_PAL2 + + INC E + JR NZ,SET_PAL_GR2 + + EX AF,AF' + OUT (SLOT3),A + POP AF + OUT (PORT_Y),A + POP IX + RET +; +;;********************************* +; + +GENERATE_PAL3: ; gray-scale + LD A,B + ADD A,6 + LD B,A + LD C,A + LD L,A + + LD A,C + AND A + RRA + ADD A,L + RRA + ADD A,B + RRA + LD H,A + + RET + +GENERATE_PAL2: ; C - BLUE; L - RED; B - GREEN; H - INTENSITY + LD A,C + ADD A,50 + LD C,A + JR NC,GEN_PAL2_L1 + LD C,0 + LD A,L + ADD A,50 + LD L,A + JR NC,GEN_PAL2_L1 + LD L,0 + LD A,B + ADD A,50 + LD B,A + JR NC,GEN_PAL2_L1 + LD B,0 + +GEN_PAL2_L1: + LD A,C + AND A + RR A + ADD A,L + RR A + ADD A,B + RR A + LD H,A + + RET +; +;************************************ + +FN_SYNC: BIT 7,A + JR Z,.old_mode + ; + LD H,A + AND #60 ; check reserved bits + JR NZ,.error + ; + BIT 2,H ; Set V-Sinc? + JR NZ,.set_v_sinc + ; + BIT 4,H ; Set Waits? + JR Z,.error ; Error - no parameters + ; +.set_waits: LD A,H + AND 8 ; check waits. Z - no waits, NZ - waits + LD H,Port_All_Mode.DEFAULT + JR Z,.no_change + LD H,Port_All_Mode.DEFAULT-Port_All_Mode.MEM_WAITS_OFF +.no_change: LD BC,(Port_All_Mode) + IN A,(C) + AND H + OUT (C),A + RET + ; +.set_v_sinc: LD A,H + AND 3 + JR Z,.SetDefLines + DEC A + JR Z,.SetCmosLines + DEC A + JR Z,.Set320Lines + ;JR .Set312Lines +.set312lines: LD A,Port_VSYNC.SET_312L + OUT (Port_VSYNC),A + ; + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.VSyncAndWaits) + AND 2 + LD (SYS_PAGE.VSyncAndWaits),A + OUT (C),B + ; +.end_set_v_sinc: + BIT 4,H + RET Z + JR .set_waits + ; +.Set320Lines: LD A,Port_VSYNC.SET_320L + OUT (Port_VSYNC),A + ; + LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.VSyncAndWaits) + OR 1 + LD (SYS_PAGE.VSyncAndWaits),A + OUT (C),B + JR .end_set_v_sinc + ; +.SetCmosLines: LD D,CMOS_CELL.ScreenSET + CALL CMOS_RD + ; + AND high CMOS_CELL.ScreenSET.Mask.Sinc ; в регистре A значение ScreenSET + JR Z,.SetDefLines + ; + BIT 6,A + JR Z,.set312lines + JR .Set320Lines + ; +.old_mode: AND A + JR Z,.INT_DEF + DEC A + JR Z,.INT_SCORP + DEC A + JR Z,.INT_PENT + DEC A + JR Z,.INT_ORIG + DEC A + JR Z,.INT_CMOS_SINC + ; [x] кастомный экран по таблице пользователя + DEC A + JR Z,.PROG_SCR + ; +.error: SCF + RET + ; +.SetDefLines: LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD A,(SYS_PAGE.VSyncAndWaits) + OUT (C),B + AND 1 + JR Z,.set312lines + JR .Set320Lines + ; +.INT_DEF: LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD DE,(SYS_PAGE.SCREEN_TABLE) + OUT (C),B + ; + CALL Test_SCREEN_TABLE + JR NZ,.INT_CMOS_SINC + JP (IX) + ; +.INT_CMOS_SINC: LD C,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + LD DE,(SYS_PAGE.SCREEN_TABLE) + OUT (C),B + ; + LD D,CMOS_CELL.ScreenSET + CALL CMOS_RD + ; + AND high CMOS_CELL.ScreenSET.Mask.Int ; в регистре A значение ScreenSET + JR NZ,.skiptest + ; + CALL Test_SCREEN_TABLE + JP (IX) ; default int (non CMOS) + ; +.skiptest: CP #10 + JR Z,.INT_SCORP ; scorpion int + ; + CP #20 + JR Z,.INT_PENT ; pentagon int + ; + ;JR .INT_ORIG ; original int +.INT_ORIG: LD IX,SCREEN_TABLES.ORIGINAL + JR .PROG_SCR + ; +.INT_SCORP: LD IX,SCREEN_TABLES.SCORPION + JR .PROG_SCR + ; +.INT_PENT: LD IX,SCREEN_TABLES.PENTAGON + ;JR .PROG_SCR +.PROG_SCR: IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + EX AF,AF' + LD (SYS_PAGE.COPY_SLOT3),A + IN A,(PORT_Y) + LD (SYS_PAGE.COPY_RGADR),A + ; + LD (SYS_PAGE.SCREEN_TABLE),IX + XOR A +;----[START]-----------------------[? 1] +.loop_1: OUT (PORT_Y),A + EX AF,AF' + LD A,#50 + OUT (SLOT3),A + LD HL,#C300 +;----[START]------------------[v 2]----- +.loop_2: LD C,(IX) +;----[START]-------------[v 3]---------- +.loop_3: ; взять адрес данных для записи в служебную область экрана + LD E,(IX+1) ; take adress of line X + LD D,(IX+2) +;----[START]--------[v 4]--------------- +.loop_4: LD A,(DE) ; take counter in table 1, line X, column Y + INC DE + AND A + JR Z,.loop_4_exit ; exit if zero-counter + LD B,A + LD A,(DE) + INC DE +;----[START]---[v 5]-------------------- +.loop_5: LD (HL),A + INC L + LD (HL),0 + INC L + LD (HL),0 + ; + EX AF,AF' + INC A + OUT (PORT_Y),A + EX AF,AF' + ; + LD (HL),0 + DEC L + LD (HL),0 + DEC L + LD (HL),A + ; + EX AF,AF' + INC A + OUT (PORT_Y),A + EX AF,AF' + ; + DJNZ .loop_5 +;--------------[^ 5]-------------------- + JR .loop_4 +;-------------------[^ 4]--------------- +.loop_4_exit: INC HL ; next line + INC HL + INC HL + INC HL + IN A,(PORT_Y) + AND #80 + OUT (PORT_Y),A + DEC C + JR NZ,.loop_3 +;------------------------[^ 3]---------- + INC IX ; next counter + INC IX + INC IX + LD A,(IX) + AND A + JR NZ,.loop_2 +;-----------------------------[^ 2]----- + LD A,SYS_PAGE + OUT (SLOT3),A + LD IX,(SYS_PAGE.SCREEN_TABLE) + ; + EX AF,AF' + ADD A,#80 + JR NC,.loop_1 +;----------------------------------[^ 1] + ; Exit + LD A,(SYS_PAGE.COPY_RGADR) + OUT (PORT_Y),A + LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A +.exit: OR A + RET + ; + ;DE - содержимое SYS_PAGE.SCREEN_TABLE +Test_SCREEN_TABLE: + LD HL,SCREEN_TABLES.SCORPION + AND A + SBC HL,DE + LD IX,FN_SYNC.INT_SCORP + RET Z + ; + LD HL,SCREEN_TABLES.ORIGINAL + AND A + SBC HL,DE + LD IX,FN_SYNC.INT_ORIG + RET Z + ; + LD HL,SCREEN_TABLES.PENTAGON + AND A + SBC HL,DE + LD IX,FN_SYNC.INT_PENT + RET Z + AND A + RET +;--- Screen data table 1: counter1, data1 .. counterX, dataX +SCREEN_TABLES: +; | число | значения | +; | строк | в | +; | /2 | строках | +.SCR: DB 41 , #F8 + DB 3 , #FC + DB 4 , #FC + DB 7 , #FC + DB 9 , #F8 + DB 0 + +;.SCR: DB 41,#F8, 3,#FC, 4,#FC, 7,#FC, 9,#F8, 0 +.INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0 +.INT_SC: DB 41,#F8, 1,#FD, 6,#FC, 7,#FC, 9,#F8, 0 +.BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 +.SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 +.RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0 +;--------------------------------------- + +;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX +; +; | кол-во | значения | +; | строк | в | +; | | строке | +.PENTAGON: DB 33 : DW .SCR + DB 1 : DW .INT ; DW .BLN + DB 3 : DW .SNC + DB 1 : DW .BLN + DB 1 : DW .SCR + DB 1 : DW .RES + DB 0 ; end +.SCORPION: DB 31 : DW .SCR + DB 1 : DW .INT_SC + DB 1 : DW .SCR + DB 1 : DW .SNC + DB 3 : DW .SNC + DB 1 : DW .BLN + DB 2 : DW .RES + DB 0 ; end +.ORIGINAL: DB 33 : DW .SCR + DB 1 : DW .SNC + DB 1 : DW .INT + DB 2 : DW .SNC + DB 1 : DW .BLN + DB 1 : DW .SCR + DB 1 : DW .RES + DB 0 ; end +;--------------------------------------- + +;************************************ +; +; Экранные таблицы +; +;текстовое окно 80x32 +LP_SCR_80: + DB 40,32,0,0,27,0,0,0 + DB 0, 0,0,0, 0,0,0,0 + +;текстовое окно 40x32 +LP_SCR_40: + DB 40,32,0,0,123,0,0,0 + DB 0, 0,0,0, 0,0,0,0 + +;спектрумовское окно 32x24 +LP_SCR_32: + DB 32,24,4,4,48,1,0,0 + DB 0, 0,0,0, 0,0,0,0 + +;текстовое окно 64x24 +LP_SCR_64: + DB 32,24,4,4,155,0,0,0 + DB 0, 0,0,0, 0,0,0,0 + +;графическое окно 0 +PIC_320X256_1: + DB 40,32,0,0,32,0,8,0 + DB 0, 0,0,0, 0,0,0,0 + +;графическое окно 1 +PIC_320X256_2: + DB 40,32,0,0,96,0,48,0 + DB 0, 0,0,0, 0,0, 0,0 + +;************************************ +; + + diff --git a/src/bios/exp/ZX_MEM 2.TXT b/src/bios/exp/ZX_MEM 2.TXT new file mode 100644 index 0000000..cf20fbf --- /dev/null +++ b/src/bios/exp/ZX_MEM 2.TXT @@ -0,0 +1,13 @@ +Отдельные рамблоки для: + vROM + vRAM +Отдельные процедуры выделения страниц для: + #1FFD - обрабатывать первым если нужен. Не подходят #A0, #D0..#DF + #7FFD - 128/512, не выделять память для #1FFD в режиме pent 512 + vROM +Страницу 0 использовать как раньше для маппа в #7FFD и для #1FFD=1 +Подкрутить в меню спектрума переключалку режимов и освобождение памяти под новую модель памяти +При освобождении памяти vROM мапить на эти порты обратно Spec_Page +Проверить на хардкод биос и zxroms, чтоб не втыкались стандартные (зарезервированные) страницы +; +Сделать переключалку в биосе старый/новый режим работы памяти? \ No newline at end of file