From a96e8e9ef0fc0025c155384d3eaf4bf0c6ec668b Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Wed, 5 Feb 2020 19:26:24 +0800 Subject: [PATCH 1/9] Update ppide.asm Initial multi device ppide --- Source/HBIOS/ppide.asm | 197 ++++++++++++++++++++++++++++------------- 1 file changed, 135 insertions(+), 62 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 1cf840e3..4ebb7d71 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -29,11 +29,6 @@ PPIDE_IO_BASE .EQU $80 PPIDE_IO_BASE .EQU $4C #ENDIF ; -PPIDE_IO_DATALO .EQU PPIDE_IO_BASE + 0 ; IDE DATA BUS LSB (8255 PORT A) -PPIDE_IO_DATAHI .EQU PPIDE_IO_BASE + 1 ; IDE DATA BUS MSB (8255 PORT B) -PPIDE_IO_CTL .EQU PPIDE_IO_BASE + 2 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) -PPIDE_IO_PPI .EQU PPIDE_IO_BASE + 3 ; 8255 CONTROL PORT -; ; THE CONTROL PORT OF THE 8255 IS PROGRAMMED AS NEEDED TO READ OR WRITE ; DATA ON THE IDE BUS. PORT C OF THE 8255 IS ALWAYS IN OUTPUT MODE BECAUSE ; IT IS DRIVING THE ADDRESS BUS AND CONTROL SIGNALS. PORTS A & B WILL BE @@ -173,6 +168,11 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE2: SECONDARY MASTER ; PPIDE3: SECONDARY SLAVE ; +PPIDE0IO .EQU PPIDE_IO_BASE +PPIDE1IO .EQU 20H +PPIDE2IO .EQU 00H +PPIDE3IO .EQU 00H +; PPIDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES @@ -213,7 +213,7 @@ PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE ; ; PPIDE DEVICE CONFIGURATION ; -PPIDE_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +PPIDE_CFGSIZ .EQU 16 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; @@ -223,6 +223,11 @@ PPIDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +PPIDE_PORT .EQU 12 ; PORT ADDRESS OF THIS DEVICE (BYTE) +PPIDE_DATALO .EQU 12 ; IDE DATA BUS LSB (8255 PORT A) (BYTE) +PPIDE_DATAHI .EQU 13 ; IDE DATA BUS MSB (8255 PORT B)(BYTE) +PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) +PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) ; PPIDE_CFGTBL: ; DEVICE 0, PRIMARY MASTER @@ -232,6 +237,10 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT + .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) + .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) + .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT ; DEVICE 1, PRIMARY SLAVE .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS @@ -239,6 +248,10 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT + .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) + .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) + .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT ; #IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) .ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" @@ -275,6 +288,7 @@ PPIDE_INIT: LD (PPIDE_TOSCALER),HL ; SAVE IT ; PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD IY,PPIDE_CFGTBL LD A,PPIDE_IO_BASE CALL PRTHEXBYTE ; @@ -375,11 +389,15 @@ PPIDE_DETECT: ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO ; INTERFERE WITH THE VALUE BEING READ. + LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (PPIDE_IO_PPI),A ; OUTPUT TO CONTROL WORD - LD C,PPIDE_IO_DATALO ; PPI PORT A + OUT (C),A ; OUTPUT TO CONTROL WORD + + LD C,(IY+PPIDE_DATALO) ; PPI PORT A XOR A ; VALUE ZERO OUT (C),A ; PUSH VALUE TO PORT +;; OUT (C),0 +;; .DB $ED,$71 IN A,(C) ; GET PORT VALUE DCALL PC_SPACE DCALL PRTHEXBYTE @@ -717,7 +735,7 @@ PPIDE_RUNCMD: JP NZ,PPIDE_CMDERR RET ; -; +; READ IDE DATA INTO BUFFER POINTED TO BY HL ; PPIDE_GETBUF: #IF (PPIDETRACE >= 3) @@ -729,19 +747,22 @@ PPIDE_GETBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO READ + LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (PPIDE_IO_PPI),A ; DO IT + OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER + LD C,(IY+PPIDE_CTL) ;; LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (PPIDE_IO_CTL),A ; DO IT + OUT (C),A ; DO IT + LD E,A ; E := READ UNASSERTED XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT LD D,A ; D := READ ASSERTED ; ; LOOP SETUP LD B,0 ; 256 ITERATIONS - LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) + LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) ; #IF (!PPIDE8BIT) INC C ; PRE-INCREMENT C @@ -761,16 +782,22 @@ PPIDE_GETBUF: RET ; PPIDE_GETBUF1: ; START OF READ LOOP - LD A,D ; ASSERT READ - OUT (PPIDE_IO_CTL),A ; DO IT + PUSH BC ;; + LD C,(IY+PPIDE_CTL) ;; + OUT (C),D ; ASSERT READ + POP BC ;; + #IF (!PPIDE8BIT) DEC C INI ; GET AND SAVE NEXT BYTE INC C ; LSB -> MSB #ENDIF INI ; GET AND SAVE NEXT BYTE - LD A,E ; DEASSERT READ - OUT (PPIDE_IO_CTL),A ; DO IT + + PUSH BC ;; + LD C,(IY+PPIDE_CTL) ;; + OUT (C),E ; DEASSERT READ + POP BC ;; ; JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE RET @@ -787,19 +814,23 @@ PPIDE_PUTBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO WRITE + + LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (PPIDE_IO_PPI),A ; DO IT + OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER + LD C,(IY+PPIDE_CTL) ;; LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (PPIDE_IO_CTL),A ; DO IT + OUT (C),A ;; + LD E,A ; E := WRITE UNASSERTED XOR PPIDE_CTL_DIOW ; SWAP THE READ LINE BIT LD D,A ; D := WRITE ASSERTED ; ; LOOP SETUP LD B,0 ; 256 ITERATIONS - LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) + LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) ; #IF (!PPIDE8BIT) INC C ; PRE-INCREMENT C @@ -825,10 +856,12 @@ PPIDE_PUTBUF1: ; START OF READ LOOP INC C #ENDIF OUTI - LD A,D ; ASSERT WRITE - OUT (PPIDE_IO_CTL),A ; DO IT - LD A,E ; DEASSERT WRITE - OUT (PPIDE_IO_CTL),A ; DO IT + PUSH BC + LD C,(IY+PPIDE_CTL) ; ASSERT WRITE + OUT (C),D ; DO IT + LD C,(IY+PPIDE_CTL) ; DEASSERT WRITE + OUT (C),E ; DO IT + POP BC ; JR NZ,PPIDE_PUTBUF1 ; LOOP UNTIL DONE RET @@ -860,17 +893,26 @@ PPIDE_GETRES: ; PPIDE_RESET: ; + PUSH BC + ; SETUP PPI TO READ + LD C,(IY+PPIDE_PPI) ;; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (PPIDE_IO_PPI),A ; DO IT -; + OUT (C),A ; DO IT + ; PULSE IDE RESET LINE + LD C,(IY+PPIDE_CTL) LD A,PPIDE_CTL_RESET - OUT (PPIDE_IO_CTL),A + OUT (C),A +; LD DE,20 CALL VDELAY - XOR A - OUT (PPIDE_IO_CTL),A +; + XOR A + OUT (C),A +;; OUT (C),0 +;; .DB $ED,$71 +; LD DE,20 CALL VDELAY ; @@ -909,6 +951,7 @@ PPIDE_RESET1: DJNZ PPIDE_RESET1 ; LOOP AS NEEDED ; POP IY ; RECOVER DEVICE CFG PTR + POP BC ; XOR A ; SIGNAL SUCCESS RET ; AND DONE @@ -973,9 +1016,13 @@ PPIDE_PROBE: ; RETURN SOMETHING OTHER THAN ZERO. IF AN IDE CONTROLLER IS ; THERE, THEN THE VALUE WRITTEN TO PPI PORT A IS IGNORED ; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. - XOR A - OUT (PPIDE_IO_DATALO),A -; IN A,(PPIDE_REG_STAT) ; GET STATUS +; + LD C,(IY+PPIDE_DATALO) + XOR A + OUT (C),A +;; OUT (C),0 +;; .DB $ED,$71 +; CALL PPIDE_IN .DB PPIDE_REG_STAT DCALL PC_SPACE @@ -1207,48 +1254,61 @@ PPIDE_WAITBSY2: ; ; ; -PPIDE_IN: +PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE + PUSH BC ; SAVE INCOMING BC ; 11TS + LD C,(IY+PPIDE_PPI) ; ; 19TS LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS - OUT (PPIDE_IO_PPI),A ; DO IT ; 11TS + OUT (C),A ; DO IT ; 12TS + POP BC ; RECOVER INCOMING BC ; 10TS EX (SP),HL ; GET PARM POINTER ; 19TS +; PUSH BC ; SAVE INCOMING BC ; 11TS LD B,(HL) ; GET CTL PORT VALUE ; 7TS - LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE ; 7TS + LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE ; 19TS OUT (C),B ; SET ADDRESS LINES ; 12TS SET 6,B ; TURN ON WRITE BIT ; 8TS OUT (C),B ; ASSERT WRITE LINE ; 12TS - ;NOP - ;NOP - IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS - ;NOP - ;NOP + ;NOP + ;NOP + LD C,(IY+PPIDE_DATALO) ; ; 19TS + IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS + ;NOP + ;NOP RES 6,B ; CLEAR WRITE BIT ; 8TS + LD C,(IY+PPIDE_CTL) ; 19TS OUT (C),B ; DEASSERT WRITE LINE ; 12TS POP BC ; RECOVER INCOMING BC ; 10TS INC HL ; POINT PAST PARM ; 6TS EX (SP),HL ; RESTORE STACK ; 19TS RET ; 10TS ; ; ----- -; ; 170TS +; ; 243TS WAS 170TS +; ; ----- +; OUTPUT A TO ; -PPIDE_OUT: - PUSH AF ; PRESERVE INCOMING VALUE - LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - OUT (PPIDE_IO_PPI),A ; DO IT - POP AF ; RECOVER VALUE TO WRITE +PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE + PUSH BC ; SAVE INCOMING BC + LD C,(IY+PPIDE_PPI) + LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE + OUT (C),B ; DO IT + POP BC ;; EX (SP),HL ; GET PARM POINTER + PUSH BC ; SAVE INCOMING BC LD B,(HL) ; GET IDE ADDRESS VALUE - LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE + LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE +; OUT (C),B ; SET ADDRESS LINES SET 5,B ; TURN ON WRITE BIT OUT (C),B ; ASSERT WRITE LINE - ;NOP - ;NOP - OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE - ;NOP - ;NOP + ;NOP + ;NOP + LD C,(IY+PPIDE_DATALO) ;; + OUT (C),A ; SEND DATA VALUE TO DEVICE + ;NOP + ;NOP RES 5,B ; CLEAR WRITE BIT + LD C,(IY+PPIDE_CTL) OUT (C),B ; DEASSERT WRITE LINE POP BC ; RECOVER INCOMING BC INC HL ; POINT PAST PARM @@ -1354,29 +1414,42 @@ PPIDE_PRTSTAT3: ; PRINT ALL REGISTERS DIRECTLY FROM DEVICE ; DEVICE MUST BE SELECTED PRIOR TO CALL ; +; +; PRINT ALL REGISTERS DIRECTLY FROM DEVICE +; DEVICE MUST BE SELECTED PRIOR TO CALL +; PPIDE_REGDUMP: PUSH AF PUSH BC + PUSH DE CALL PC_SPACE CALL PC_LBKT + LD C,(IY+PPIDE_PPI) ; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - OUT (PPIDE_IO_PPI),A ; DO IT - LD C,PPIDE_REG_CMD - LD B,7 + OUT (C),A ; DO IT + LD E,PPIDE_REG_CMD + LD D,7 PPIDE_REGDUMP1: - LD A,C ; REGISTER ADDRESS - OUT (PPIDE_IO_CTL),A ; SET IT + LD A,E ; REGISTER ADDRESS + LD C,(IY+PPIDE_CTL) + OUT (C),A ; SET IT XOR PPIDE_CTL_DIOR ; SET BIT TO ASSERT READ LINE - OUT (PPIDE_IO_CTL),A ; ASSERT READ - IN A,(PPIDE_IO_DATALO) ; GET VALUE + OUT (C),A ; ASSERT READ +; + LD C,(IY+PPIDE_DATALO) + IN A,(C) ; GET VALUE CALL PRTHEXBYTE ; DISPLAY IT - LD A,C ; RELOAD ADDRESS W/ READ UNASSERTED - OUT (PPIDE_IO_CTL),A ; AND SET IT - DEC C ; NEXT LOWER REGISTER - DEC B ; DEC LOOP COUNTER +; + LD A,E ; + LD C,(IY+PPIDE_CTL) ; RELOAD ADDRESS W/ READ UNASSERTED + OUT (C),E +; + DEC E ; NEXT LOWER REGISTER + DEC D ; DEC LOOP COUNTER CALL NZ,PC_SPACE ; FORMATTING JR NZ,PPIDE_REGDUMP1 ; LOOP AS NEEDED CALL PC_RBKT ; FORMATTING + POP DE POP BC POP AF RET From 8a1ddec0f0f033815b236a7e3faa0eb3008d9be8 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Wed, 5 Feb 2020 23:07:04 +0800 Subject: [PATCH 2/9] Update ppide.asm Optimization --- Source/HBIOS/ppide.asm | 137 ++++++++++++++++++++++++----------------- 1 file changed, 81 insertions(+), 56 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 4ebb7d71..a24f05b0 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -173,7 +173,7 @@ PPIDE1IO .EQU 20H PPIDE2IO .EQU 00H PPIDE3IO .EQU 00H ; -PPIDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE_DEVCNT .EQU 4 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES ; @@ -213,7 +213,7 @@ PPIDE_DRVSLAVE .DB %11110000 ; LBA, SLAVE DEVICE ; ; PPIDE DEVICE CONFIGURATION ; -PPIDE_CFGSIZ .EQU 16 ; SIZE OF CFG TBL ENTRIES +PPIDE_CFGSIZ .EQU 15 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; @@ -223,11 +223,9 @@ PPIDE_TYPE .EQU 2 ; DEVICE TYPE (BYTE) PPIDE_FLAGS .EQU 3 ; FLAG BITS BIT 0=CF, 1=LBA (BYTE) PPIDE_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) PPIDE_LBA .EQU 8 ; OFFSET OF LBA (DWORD) -PPIDE_PORT .EQU 12 ; PORT ADDRESS OF THIS DEVICE (BYTE) -PPIDE_DATALO .EQU 12 ; IDE DATA BUS LSB (8255 PORT A) (BYTE) -PPIDE_DATAHI .EQU 13 ; IDE DATA BUS MSB (8255 PORT B)(BYTE) -PPIDE_CTL .EQU 14 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) -PPIDE_PPI .EQU 15 ; 8255 CONTROL PORT(BYTE) +PPIDE_DATALO .EQU 12 ; BASE PORT AND IDE DATA BUS LSB (8255 PORT A) (BYTE) +PPIDE_CTL .EQU 13 ; IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C)(BYTE) +PPIDE_PPI .EQU 14 ; 8255 CONTROL PORT(BYTE) ; PPIDE_CFGTBL: ; DEVICE 0, PRIMARY MASTER @@ -237,10 +235,9 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT - .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) - .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) - .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT + .DB PPIDE0IO ; DATALO + .DB PPIDE0IO+2 ; CTL + .DB PPIDE0IO+3 ; PPI ; DEVICE 1, PRIMARY SLAVE .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS @@ -248,10 +245,31 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA - .DB PPIDE0IO ; DATALO IDE DATA BUS LSB (8255 PORT A)+ BASE ADDRESS OF PORT - .DB PPIDE0IO+1 ; DATAHI IDE DATA BUS MSB (8255 PORT B) - .DB PPIDE0IO+2 ; CTL IDE ADDRESS BUS AND CONTROL SIGNALS (8255 PORT C) - .DB PPIDE0IO+3 ; PPI 8255 CONTROL PORT + .DB PPIDE0IO ; DATALO + .DB PPIDE0IO+2 ; CTL + .DB PPIDE0IO+3 ; PPI +#IF (PPIDE_DEVCNT >= 2) + ; DEVICE 2, PRIMARY MASTER + .DB 2 ; DRIVER DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB 0 ; FLAGS BYTE + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB PPIDE1IO ; DATALO + .DB PPIDE1IO+2 ; CTL + .DB PPIDE1IO+3 ; PPI + ; DEVICE 3, PRIMARY SLAVE + .DB 3 ; DRIVER DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DB 0 ; DEVICE TYPE + .DB 0 ; FLAGS BYTE + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DB PPIDE1IO ; DATALO + .DB PPIDE1IO+2 ; CTL + .DB PPIDE1IO+3 ; PPI +#ENDIF ; #IF ($ - PPIDE_CFGTBL) != (PPIDE_DEVCNT * PPIDE_CFGSIZ) .ECHO "*** INVALID PPIDE CONFIG TABLE ***\n" @@ -286,15 +304,11 @@ PPIDE_INIT: LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ CALL MULT8X16 ; HL := DE * A LD (PPIDE_TOSCALER),HL ; SAVE IT -; - PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS - LD IY,PPIDE_CFGTBL - LD A,PPIDE_IO_BASE - CALL PRTHEXBYTE ; #IF (PPIDE8BIT) PRTS(" 8BIT$") #ENDIF + LD IY,PPIDE_CFGTBL CALL PPIDE_DETECT ; CHECK FOR HARDWARE JR Z,PPIDE_INIT00 ; CONTINUE IF PRESENT ; @@ -347,6 +361,11 @@ PPIDE_INIT2: ; CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX ; +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+PPIDE_DATALO) + CALL PRTHEXBYTE +; #IF (PPIDE8BIT) PRTS(" 8BIT$") #ENDIF @@ -392,12 +411,17 @@ PPIDE_DETECT: LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE OUT (C),A ; OUTPUT TO CONTROL WORD - +; LD C,(IY+PPIDE_DATALO) ; PPI PORT A +; +#IF USEZ80OPT +;; OUT (C),0 + .DB $ED,$71 +#ELSE XOR A ; VALUE ZERO OUT (C),A ; PUSH VALUE TO PORT -;; OUT (C),0 -;; .DB $ED,$71 +#ENDIF +; IN A,(C) ; GET PORT VALUE DCALL PC_SPACE DCALL PRTHEXBYTE @@ -908,10 +932,13 @@ PPIDE_RESET: LD DE,20 CALL VDELAY ; - XOR A - OUT (C),A +#IF USEZ80OPT ;; OUT (C),0 -;; .DB $ED,$71 + .DB $ED,$71 +#ELSE + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT +#ENDIF ; LD DE,20 CALL VDELAY @@ -1018,10 +1045,13 @@ PPIDE_PROBE: ; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. ; LD C,(IY+PPIDE_DATALO) - XOR A - OUT (C),A +#IF USEZ80OPT ;; OUT (C),0 -;; .DB $ED,$71 + .DB $ED,$71 +#ELSE + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT +#ENDIF ; CALL PPIDE_IN .DB PPIDE_REG_STAT @@ -1240,7 +1270,7 @@ PPIDE_WAITBSY1: LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR PPIDE_WAITBSY2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS - CALL PPIDE_IN ; 17TS + 170TS + CALL PPIDE_IN ; 17TS + 204TS .DB PPIDE_REG_STAT ; 0TS LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS @@ -1250,65 +1280,60 @@ PPIDE_WAITBSY2: OR E ; 4TS JR NZ,PPIDE_WAITBSY2 ; 12TS DJNZ PPIDE_WAITBSY1 ; ----- - JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 229TS -; -; + JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 246TS ; +; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A +; PPIDE_IN: ; IY POINT TO CURRENT CFG TABLE + EX (SP),HL ; GET PARM POINTER ; 19TS PUSH BC ; SAVE INCOMING BC ; 11TS LD C,(IY+PPIDE_PPI) ; ; 19TS LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS OUT (C),A ; DO IT ; 12TS - POP BC ; RECOVER INCOMING BC ; 10TS - EX (SP),HL ; GET PARM POINTER ; 19TS ; - PUSH BC ; SAVE INCOMING BC ; 11TS LD B,(HL) ; GET CTL PORT VALUE ; 7TS - LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE ; 19TS + DEC C ; LD C,(IY+PPIDE_CTL) ; 4TS OUT (C),B ; SET ADDRESS LINES ; 12TS SET 6,B ; TURN ON WRITE BIT ; 8TS OUT (C),B ; ASSERT WRITE LINE ; 12TS - ;NOP - ;NOP - LD C,(IY+PPIDE_DATALO) ; ; 19TS +; + DEC C ; 4TS + DEC C ; LD C,(IY+PPIDE_DATALO) ; 4TS IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS - ;NOP - ;NOP +; RES 6,B ; CLEAR WRITE BIT ; 8TS - LD C,(IY+PPIDE_CTL) ; 19TS + INC C ; 4TS + INC C ; LD C,(IY+PPIDE_CTL) ; 4TS OUT (C),B ; DEASSERT WRITE LINE ; 12TS POP BC ; RECOVER INCOMING BC ; 10TS INC HL ; POINT PAST PARM ; 6TS EX (SP),HL ; RESTORE STACK ; 19TS RET ; 10TS ; ; ----- -; ; 243TS WAS 170TS +; ; 204TS ; ; ----- -; OUTPUT A TO +; OUTPUT A TO 3 2 0 2 ; PPIDE_OUT: ; IY POINT TO CURRENT CFG TABLE + EX (SP),HL ; GET PARM POINTER PUSH BC ; SAVE INCOMING BC LD C,(IY+PPIDE_PPI) LD B,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE OUT (C),B ; DO IT - POP BC ;; - EX (SP),HL ; GET PARM POINTER - PUSH BC ; SAVE INCOMING BC LD B,(HL) ; GET IDE ADDRESS VALUE - LD C,(IY+PPIDE_CTL) ; SETUP PORT TO WRITE -; + DEC C ; LD C,(IY+PPIDE_CTL) OUT (C),B ; SET ADDRESS LINES SET 5,B ; TURN ON WRITE BIT OUT (C),B ; ASSERT WRITE LINE - ;NOP - ;NOP - LD C,(IY+PPIDE_DATALO) ;; +; + DEC C + DEC C ; LD C,(IY+PPIDE_DATALO) OUT (C),A ; SEND DATA VALUE TO DEVICE - ;NOP - ;NOP +; RES 5,B ; CLEAR WRITE BIT - LD C,(IY+PPIDE_CTL) + INC C + INC C ; LD C,(IY+PPIDE_CTL) OUT (C),B ; DEASSERT WRITE LINE POP BC ; RECOVER INCOMING BC INC HL ; POINT PAST PARM From 684a209c84138d1fba5944e340148f62d3a8e4aa Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 01:45:12 +0800 Subject: [PATCH 3/9] Update ppide.asm Optimization --- Source/HBIOS/ppide.asm | 56 +++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index a24f05b0..b0589701 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -771,12 +771,12 @@ PPIDE_GETBUF: RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO READ - LD C,(IY+PPIDE_PPI) ;; + LD C,(IY+PPIDE_PPI) ; LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER - LD C,(IY+PPIDE_CTL) ;; + DEC C ; LD C,(IY+PPIDE_CTL) LD A,PPIDE_REG_DATA ; DATA REGISTER OUT (C),A ; DO IT @@ -784,12 +784,12 @@ PPIDE_GETBUF: XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT LD D,A ; D := READ ASSERTED ; - ; LOOP SETUP - LD B,0 ; 256 ITERATIONS - LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) -; -#IF (!PPIDE8BIT) - INC C ; PRE-INCREMENT C + LD B,0 ; LOOP SETUP - 256 ITERATIONS + + ; SETUP C WITH IO PORT + DEC C ; C = IY+PPIDE_DATAHI +#IF (PPIDE8BIT) ; + DEC C ; C = IY+PPIDE_DATALO #ENDIF ; CALL PPIDE_GETBUF1 ; FIRST PASS (FIRST 256 BYTES) @@ -805,24 +805,36 @@ PPIDE_GETBUF: JP NZ,PPIDE_IOERR RET ; -PPIDE_GETBUF1: ; START OF READ LOOP - PUSH BC ;; - LD C,(IY+PPIDE_CTL) ;; - OUT (C),D ; ASSERT READ - POP BC ;; - -#IF (!PPIDE8BIT) +PPIDE_GETBUF1: ; START OF READ LOOP +; +#IF (PPIDE8BIT) + INC C + INC C + OUT (C),D ; LD C,(IY+PPIDE_CTL) + DEC C ; ASSERT READ + DEC C + INI + PUSH AF + INC C + INC C + OUT (C),E ; LD C,(IY+PPIDE_CTL) + DEC C ; DEASSERT READ + DEC C + POP AF +#ELSE + INC C + OUT (C),D ; LD C,(IY+PPIDE_CTL) + DEC C ; ASSERT READ DEC C INI ; GET AND SAVE NEXT BYTE INC C ; LSB -> MSB + INI + PUSH AF + INC C + OUT (C),E ; LD C,(IY+PPIDE_CTL) + DEC C ; DEASSERT READ + POP AF #ENDIF - INI ; GET AND SAVE NEXT BYTE - - PUSH BC ;; - LD C,(IY+PPIDE_CTL) ;; - OUT (C),E ; DEASSERT READ - POP BC ;; -; JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE RET ; From c3ef70efc08aa8a7f4e8a3c21454c554852f0432 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 03:10:26 +0800 Subject: [PATCH 4/9] Update ppide.asm Optimization --- Source/HBIOS/ppide.asm | 73 ++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index b0589701..b0850329 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -809,30 +809,30 @@ PPIDE_GETBUF1: ; START OF READ LOOP ; #IF (PPIDE8BIT) INC C - INC C - OUT (C),D ; LD C,(IY+PPIDE_CTL) - DEC C ; ASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT READ + DEC C DEC C - INI + INI ; GET AND SAVE NEXT BYTE PUSH AF INC C - INC C - OUT (C),E ; LD C,(IY+PPIDE_CTL) - DEC C ; DEASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),E ; DEASSERT READ + DEC C DEC C POP AF #ELSE - INC C - OUT (C),D ; LD C,(IY+PPIDE_CTL) - DEC C ; ASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT READ + DEC C DEC C INI ; GET AND SAVE NEXT BYTE INC C ; LSB -> MSB - INI + INI ; GET AND SAVE NEXT BYTE PUSH AF - INC C - OUT (C),E ; LD C,(IY+PPIDE_CTL) - DEC C ; DEASSERT READ + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),E ; DEASSERT READ + DEC C POP AF #ENDIF JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE @@ -851,25 +851,25 @@ PPIDE_PUTBUF: ; ; SETUP PPI TO WRITE - LD C,(IY+PPIDE_PPI) ;; + LD C,(IY+PPIDE_PPI) LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE OUT (C),A ; DO IT ; ; SELECT READ/WRITE IDE REGISTER - LD C,(IY+PPIDE_CTL) ;; + DEC C ; LD C,(IY+PPIDE_CTL) LD A,PPIDE_REG_DATA ; DATA REGISTER - OUT (C),A ;; + OUT (C),A ; LD E,A ; E := WRITE UNASSERTED XOR PPIDE_CTL_DIOW ; SWAP THE READ LINE BIT LD D,A ; D := WRITE ASSERTED ; - ; LOOP SETUP - LD B,0 ; 256 ITERATIONS - LD C,(IY+PPIDE_DATALO) ; SETUP C WITH IO PORT (LSB) -; -#IF (!PPIDE8BIT) - INC C ; PRE-INCREMENT C + ; LOOP SETUP ; 256 ITERATIONS + LD B,0 ; SETUP C WITH IO PORT (LSB) + + DEC C ; LD C,(IY+PPIDE_DATAHI) +#IF (PPIDE8BIT) + DEC C ; LD C,(IY+PPIDE_DATALO) #ENDIF ; CALL PPIDE_PUTBUF1 ; FIRST PASS (FIRST 256 BYTES) @@ -886,19 +886,28 @@ PPIDE_PUTBUF: RET ; PPIDE_PUTBUF1: ; START OF READ LOOP -#IF (!PPIDE8BIT) +#IF (PPIDE8BIT) + OUTI ; PUT NEXT BYTE ON THE BUS + PUSH AF + INC C ; LD C,(IY+PPIDE_CTL) + INC C + OUT (C),D ; ASSERT WRITE + OUT (C),E ; DEASSERT WRITE + DEC C + DEC C + POP AF +#ELSE DEC C OUTI ; PUT NEXT BYTE ON THE BUS (LSB) INC C + OUTI ; PUT NEXT BYTE ON THE BUS (MSB) + PUSH AF + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT WRITE + OUT (C),E ; DEASSERT WRITE + DEC C + POP AF #ENDIF - OUTI - PUSH BC - LD C,(IY+PPIDE_CTL) ; ASSERT WRITE - OUT (C),D ; DO IT - LD C,(IY+PPIDE_CTL) ; DEASSERT WRITE - OUT (C),E ; DO IT - POP BC -; JR NZ,PPIDE_PUTBUF1 ; LOOP UNTIL DONE RET ; From 5df54bc6fdf612e95bd70820e2f5e392fc94f908 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 04:06:44 +0800 Subject: [PATCH 5/9] PPIDE updates --- Source/HBIOS/cfg_dyno.asm | 1 + Source/HBIOS/cfg_master.asm | 1 + Source/HBIOS/cfg_mk4.asm | 1 + Source/HBIOS/cfg_n8.asm | 1 + Source/HBIOS/cfg_rcz180.asm | 1 + Source/HBIOS/cfg_rcz80.asm | 1 + Source/HBIOS/cfg_sbc.asm | 1 + Source/HBIOS/cfg_scz180.asm | 1 + Source/HBIOS/ppide.asm | 4 ++-- 9 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 6e034243..83d7e0c5 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -113,6 +113,7 @@ PPIDEENABLE .EQU TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) PPIDEMODE .EQU PPIDEMODE_DYNO ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 8c3e18e2..8a004eb8 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -172,6 +172,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_NONE ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index ef2131dc..dd2e31a5 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -127,6 +127,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_DIO3 ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 0936dae8..ac917b95 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -130,6 +130,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_N8 ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 41bfc5e0..e3a1d7bb 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -133,6 +133,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 89b70b4f..e8f91bc4 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -137,6 +137,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 120b468c..b7027b23 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -130,6 +130,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_SBC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 39677f51..0b90bc61 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -128,6 +128,7 @@ PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM PPIDEMODE .EQU PPIDEMODE_RC ; PPIDE: DRIVER MODE: PPIDEMODE_[SBC|DIO3|MFP|N8|RC|DYNO] PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPIDE8BIT .EQU FALSE ; PPIDE: USE 8-BIT TRANSFERS (CF CARDS MOSTLY) +PPICNT .EQU 1 ; PPIDE: NUMBER OF 8255 PPI INTERFACES ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index b0850329..63a6ae86 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -170,10 +170,10 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE0IO .EQU PPIDE_IO_BASE PPIDE1IO .EQU 20H -PPIDE2IO .EQU 00H +PPIDE2IO .EQU 44H PPIDE3IO .EQU 00H ; -PPIDE_DEVCNT .EQU 4 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE_DEVCNT .EQU PPICNT*2 ; ; COMMAND BYTES ; From 336393aad63d237a07ed018dc8c544821d007178 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 04:19:16 +0800 Subject: [PATCH 6/9] Update ppide.asm --- Source/HBIOS/ppide.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 63a6ae86..92eb3a66 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -248,7 +248,7 @@ PPIDE_CFGTBL: .DB PPIDE0IO ; DATALO .DB PPIDE0IO+2 ; CTL .DB PPIDE0IO+3 ; PPI -#IF (PPIDE_DEVCNT >= 2) +#IF (PPICNT> 1) ; DEVICE 2, PRIMARY MASTER .DB 2 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS From 4ac878029d09c68761b6236a87d1cf6d4779fc65 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Thu, 6 Feb 2020 11:36:28 +0800 Subject: [PATCH 7/9] Update std.asm Required by ppide.asm --- Source/HBIOS/std.asm | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index c552b5a3..a40da2d4 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -28,6 +28,7 @@ TRUE .EQU ~FALSE USENONE .EQU 0 ; NO DEBUG USEXIO .EQU 1 ; BASIC SERIAL DRIVER USEMIO .EQU 2 ; MEMORY BUFFER DRIVER +USEZ80OPT .EQU FALSE ; USE UNOFFICIAL OP CODES WBWDEBUG .EQU USENONE ; ; PRIMARY HARDWARE PLATFORMS From 7fb1a8851e97eeb940dae471b92579d1a3443f4a Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 7 Feb 2020 13:16:30 +0800 Subject: [PATCH 8/9] Add ROM based game Refer 2048game.com Requires VT100 terminal. --- Source/HBIOS/Build.ps1 | 16 +- Source/HBIOS/game.asm | 1225 ++++++++++++++++++++++++++++++++++++++ Source/HBIOS/imgpad0.asm | 2 +- Source/HBIOS/romldr.asm | 1 + Source/HBIOS/std.asm | 4 + 5 files changed, 1237 insertions(+), 11 deletions(-) create mode 100644 Source/HBIOS/game.asm diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index a94fe7d7..ad74d64f 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -170,14 +170,10 @@ Copy-Item '..\Forth\camel80.bin' 'camel80.bin' Copy-Item '..\Fonts\font*.asm' '.' # Assemble individual components. Note in the case of UNA, there is less to build. -Asm 'dbgmon' -Asm 'prefix' -Asm 'romldr' -Asm 'eastaegg' -Asm 'nascom' -Asm 'tastybasic' -Asm 'imgpad' -Asm 'imgpad0' +# +$RomComponentList = "dbgmon", "prefix", "romldr", "eastaegg", "nascom", "tastybasic", "game", "imgpad", "imgpad0" +ForEach ($RomComponentName in $RomComponentList) {Asm $RomComponentName} + if ($Platform -ne "UNA") { Asm 'hbios' '-dROMBOOT' -Output 'hbios_rom.bin' -List 'hbios_rom.lst' @@ -201,7 +197,7 @@ Concat 'prefix.bin','zsys.bin' 'zsys.sys' # Build 32K OS chunk containing the loader, debug monitor, and OS images Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', 'cpm.bin', 'zsys.bin' osimg.bin -Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'imgpad0.bin' osimg1.bin +Concat 'camel80.bin', 'nascom.bin', 'tastybasic.bin', 'game.bin', 'imgpad0.bin' osimg1.bin # # Now the ROM disk image is created. This is done by starting with a # blank ROM disk image of the correct size, then cpmtools is used to @@ -249,5 +245,5 @@ else Concat 'hbios_img.bin','osimg.bin' $ImgFile } -# Remove the temprary working ROM disk file +# Remove the temporary working ROM disk file Remove-Item $RomDiskFile diff --git a/Source/HBIOS/game.asm b/Source/HBIOS/game.asm new file mode 100644 index 00000000..cdc5fca6 --- /dev/null +++ b/Source/HBIOS/game.asm @@ -0,0 +1,1225 @@ +; 2048 +; +; Join the numbers and get to the 2048 tile. +; +; Commands: +; +; Use the arrow keys to move the tiles. +; When two tiles with the same number touch, they merge into one. +; +; w, s, a, d - Alternate keys (up, down, left, right) +; CTRL-E, CTRL-X, CTRL-S, CTRL-D - Wordstar-compatible control keys +; +; Compile: +; +; TASM -80 -b 2048.ASM 2048.COM +; +; Credits: +; +; Based on 2048 created by Gabriele Cirulli. +; Based on the console version for GNU/Linux by Maurits van der Schee +; Ported to Z80 and CP/M by Marco Maccaferri +; Ported to ROMWBW ROM by Phil Summers difficultylevelhigh@gmail from https://github.com/maccasoft/z80-apps/2048.asm + +CTRL_A .EQU 1 +CTRL_B .EQU 2 +CTRL_C .EQU 3 +CTRL_D .EQU 4 +CTRL_E .EQU 5 +CTRL_F .EQU 6 +CTRL_G .EQU 7 +CTRL_H .EQU 8 +CTRL_I .EQU 9 +CTRL_J .EQU 10 +CTRL_K .EQU 11 +CTRL_L .EQU 12 +CTRL_M .EQU 13 +CTRL_N .EQU 14 +CTRL_O .EQU 15 +CTRL_P .EQU 16 +CTRL_Q .EQU 17 +CTRL_R .EQU 18 +CTRL_S .EQU 19 +CTRL_T .EQU 20 +CTRL_U .EQU 21 +CTRL_V .EQU 22 +CTRL_W .EQU 23 +CTRL_X .EQU 24 +CTRL_Y .EQU 25 +CTRL_Z .EQU 26 + +BEL .EQU 07H +FF .EQU 0CH +CR .EQU 0DH +LF .EQU 0AH +EOS .EQU 24H + +;BDOS .EQU 0005H + +BOARD_X .EQU 25H +BOARD_Y .EQU 06H + +#include "std.asm" + + .ORG GAM_LOC + +S2048: LD A,R + LD (RAND16+1),A + LD A,R + LD (RAND16+2),A + + LD B,VAREND-BOARD + LD HL,BOARD + XOR A +CLRBOARD: LD (HL),A + INC HL + DJNZ CLRBOARD + + LD DE,INIT +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + CALL ADDRANDOM + CALL ADDRANDOM + + CALL DRAWBORDER + CALL DRAWBOARD + +LOOP2 LD A,BOARD_X-3 + LD (XPOS),A + LD A,BOARD_Y + ADD A,13H + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,MSG1 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + +LOOP: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,LOOP + CALL CIN + + CP 'a' + JP C,K3 + CP '{' + JP NC,K3 + AND 5FH + +K3 CP CTRL_C + JP Z,EXIT + + CP CTRL_E + JP Z,TOP + CP CTRL_X + JP Z,BOTTOM + CP CTRL_D + JP Z,RIGHT + CP CTRL_S + JP Z,LEFT + + CP 'W' + JP Z,TOP + CP 'S' + JP Z,BOTTOM + CP 'D' + JP Z,RIGHT + CP 'A' + JP Z,LEFT + + CP 'Q' + JP Z,QUIT + + CP 1BH + JP Z,K1 + +; LD C,02H +; LD E,BEL +; CALL BDOS +; CALL COUTE + + JP LOOP + +K1: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,K1 + CALL CIN + + CP 'O' + JP NZ,K2 + +K4: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,K4 + CALL CIN + +K2 CP 'A' + JP Z,TOP + CP 'B' + JP Z,BOTTOM + CP 'C' + JP Z,RIGHT + CP 'D' + JP Z,LEFT + +; LD C,02H +; LD E,BEL +; CALL BDOS +; CALL COUTE + + JP LOOP + +LOOP1 LD A,(MOVED) + CP 0 + JP Z,LOOP + + CALL DRAWBOARD + + CALL ADDRANDOM + CALL DRAWBOARD + + CALL ISOVER + CP 1 + JP Z,GAMEOVER + + JP LOOP + +TOP: + CALL ROTATE + CALL ROTATE + CALL ROTATE + CALL MOVEMERGE + CALL ROTATE + JP LOOP1 + +BOTTOM: + CALL ROTATE + CALL MOVEMERGE + CALL ROTATE + CALL ROTATE + CALL ROTATE + JP LOOP1 + +RIGHT: + CALL ROTATE + CALL ROTATE + CALL MOVEMERGE + CALL ROTATE + CALL ROTATE + JP LOOP1 + +LEFT: + CALL MOVEMERGE + JP LOOP1 + +QUIT: + LD A,BOARD_X-3 + LD (XPOS),A + LD A,BOARD_Y + ADD A,13H + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,MSG2 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + +Q1: +; LD C,06H +; LD E,0FFH +; CALL BDOS +; CP 0 +; JP Z,Q1 + CALL CIN + + CP 'y' + JP Z,EXIT + CP 'Y' + JP Z,EXIT + CP 'n' + JP Z,LOOP2 + CP 'N' + JP Z,LOOP2 + CP 'R' + JP S2048 + CP 'r' + JP S2048 + +; LD C,02H +; LD E,BEL +; CALL BDOS +; CALL COUTE + JP Q1 + +GAMEOVER: + LD A,BOARD_X-3 + LD (XPOS),A + LD A,BOARD_Y+13H + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,MSG3 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE +GAMEMORE: CALL CIN + CP 'y' + JP Z,S2048 + CP 'Y' + JP Z,S2048 + CP 'n' + JP Z,EXIT + CP 'N' + JP Z,EXIT + JR GAMEMORE +EXIT: + LD DE,TERM +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + LD A,00H + LD HL,0000H + JP 0FFF9H +; RET + +ISOVER: + LD A,1 + LD (RESULT),A + + LD B,16 + LD HL,BOARD +G1: LD A,(HL) + CP 13 + JP Z,GR + INC HL + DJNZ G1 + + CALL CANMERGE + CP 0 + JP Z,G2 + XOR A + LD (RESULT),A + +G2: CALL ROTATE + CALL CANMERGE + CP 0 + JP Z,G3 + XOR A + LD (RESULT),A + +G3: CALL ROTATE + CALL CANMERGE + CP 0 + JP Z,G4 + XOR A + LD (RESULT),A + +G4: CALL ROTATE + CALL CANMERGE + CP 0 + JP Z,G5 + XOR A + LD (RESULT),A + +G5: CALL ROTATE + +GR: LD A,(RESULT) + RET + +CANMERGE: + LD HL,BOARD + LD (BOARDPTR),HL + CALL TESTMERGE + CP 1 + RET Z + LD HL,BOARD+4 + LD (BOARDPTR),HL + CALL TESTMERGE + CP 1 + RET Z + LD HL,BOARD+8 + LD (BOARDPTR),HL + CALL TESTMERGE + CP 1 + RET Z + LD HL,BOARD+12 + LD (BOARDPTR),HL + CALL TESTMERGE + RET + +TESTMERGE: + LD DE,(BOARDPTR) + LD HL,(BOARDPTR) + INC HL + + LD B,3 +M8 LD A,(DE) + CP 0 + JP Z,M7 + LD C,(HL) + CP C + JP Z,M7 + INC HL + INC DE + DJNZ M8 + XOR A + RET +M7 LD A,1 + RET + +MOVEMERGE: + XOR A + LD (MOVED),A + + LD HL,BOARD + LD (BOARDPTR),HL + CALL MERGE + LD HL,BOARD+4 + LD (BOARDPTR),HL + CALL MERGE + LD HL,BOARD+8 + LD (BOARDPTR),HL + CALL MERGE + LD HL,BOARD+12 + LD (BOARDPTR),HL + CALL MERGE + + RET + +ADDRANDOM: + LD DE,0 + LD B,16 + LD HL,BOARD +N2 LD A,(HL) + CP 0 + JP NZ,N1 + INC E +N1 INC HL + DJNZ N2 + + LD A,E + CP 0 + RET Z + + PUSH DE + CALL RAND16 + POP DE + CALL DIV16 + + LD B,L +N4: LD C,16 + LD HL,BOARD +N5: LD A,(HL) + CP 0 + JP NZ,N3 + DEC B + JP Z,N6 +N3: INC HL + DEC C + JP NZ,N5 + JP N4 + +N6 PUSH HL + + CALL RAND16 + LD DE,10 + CALL DIV16 + LD DE,9 + CALL DIV16 + LD A,E + INC A + + POP HL + LD (HL),A + + RET + +MERGE: + CALL COLLAPSE + + ; merge tiles with same value + + LD DE,(BOARDPTR) + LD HL,(BOARDPTR) + INC HL + + LD B,3 +M6: LD A,(DE) + CP 0 + RET Z + LD C,(HL) + CP C + JP NZ,M5 + + INC A + LD (DE),A + CALL ADDPOINTS + XOR A + LD (HL),A + + LD A,(MOVED) + INC A + LD (MOVED),A + + PUSH DE + PUSH HL + CALL COLLAPSE + POP HL + POP DE + +M5: INC HL + INC DE + DJNZ M6 + + RET + +COLLAPSE: + ; collapse all tiles + + LD HL,(BOARDPTR) + + LD B,4 ; find first zero +M1: LD A,(HL) + CP 0 + JP Z,M2 + INC HL + DJNZ M1 + RET + +M2: LD E,L ; DE=fist zero position + LD D,H + +M4: LD A,(HL) ; move all non-zero tiles + CP 0 + JP Z,M3 + + LD (DE),A + INC DE + XOR A + LD (HL),A + + LD A,(MOVED) + INC A + LD (MOVED),A + +M3: INC HL + DJNZ M4 + + RET + +ROTATE: + ; outer ring + + LD B,3 + +R1: LD A,(BOARD+3) + LD C,A + + LD A,(BOARD+2) + LD (BOARD+3),A + LD A,(BOARD+1) + LD (BOARD+2),A + LD A,(BOARD+0) + LD (BOARD+1),A + + LD A,(BOARD+4) + LD (BOARD+0),A + LD A,(BOARD+8) + LD (BOARD+4),A + LD A,(BOARD+12) + LD (BOARD+8),A + + LD A,(BOARD+13) + LD (BOARD+12),A + LD A,(BOARD+14) + LD (BOARD+13),A + LD A,(BOARD+15) + LD (BOARD+14),A + + LD A,(BOARD+11) + LD (BOARD+15),A + LD A,(BOARD+7) + LD (BOARD+11),A + LD A,C + LD (BOARD+7),A + + DJNZ R1 + + ; inner ring + + LD A,(BOARD+6) + LD C,A + + LD A,(BOARD+5) + LD (BOARD+6),A + LD A,(BOARD+9) + LD (BOARD+5),A + LD A,(BOARD+10) + LD (BOARD+9),A + + LD A,C + LD (BOARD+10),A + + RET + +ADDPOINTS: + PUSH DE + PUSH HL + + LD E,A + LD D,0 + LD HL,POINTS + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + + LD A,(SCORE+3) + ADD A,E + DAA + LD (SCORE+3),A + + LD A,(SCORE+2) + ADC A,D + DAA + LD (SCORE+2),A + + LD A,(SCORE+1) + ADC A,00H + DAA + LD (SCORE+1),A + + LD A,(SCORE) + ADC A,00H + DAA + LD (SCORE),A + + POP HL + POP DE + RET + +PRINTSCORE: + LD HL,SCORE + LD DE,SCORESTR+4 + LD B,4 + +P1 LD A,(HL) + RRA + RRA + RRA + RRA + AND 0FH + ADD A,30H + LD (DE),A + INC DE + + LD A,(HL) + AND 0FH + ADD A,30H + LD (DE),A + INC DE + + INC HL + DJNZ P1 + + LD HL,SCORESTR+4 + LD B,7 +P3 LD A,(HL) + CP 30H + JP NZ,P2 + LD A,20H + LD (HL),A + INC HL + DJNZ P3 + +P2 LD A,BOARD_X + ADD A,16H + DAA + LD (XPOS),A + LD A,BOARD_Y + SUB 02H + DAA + LD (YPOS),A + CALL GOTOXY + + LD DE,SCORESTR +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + RET + +DRAWBORDER: + LD A,BOARD_X + LD (XPOS),A + LD A,BOARD_Y + SUB 02H + DAA + LD (YPOS),A + CALL GOTOXY + + LD DE,MSG4 +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + LD A,BOARD_X + SUB 01H + DAA + LD (XPOS),A + LD A,BOARD_Y + SUB 01H + DAA + LD (YPOS),A + CALL GOTOXY + + LD DE,TOPBORDER +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + LD B,12 +L4 PUSH BC + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY +; LD C,02H + LD E,0DBH +; CALL BDOS + CALL COUTE + LD DE,ADVANCE +; LD C,09H +; CALL BDOS + CALL PRTSTRDE +; LD C,02H + LD E,0DBH +; CALL BDOS + CALL COUTE + POP BC + DEC B + JP NZ,L4 + + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + LD DE,BTMBORDER +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + RET + +DRAWBOARD: + CALL PRINTSCORE + + LD A,BOARD_X + LD (XPOS),A + LD A,BOARD_Y + SUB 01H + DAA + LD (YPOS),A + + LD HL,BOARD + LD B,4 +L1 PUSH BC + + PUSH HL + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + POP HL + + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + CALL NEWLINE + POP HL + + DEC HL + DEC HL + DEC HL + + PUSH HL + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + POP HL + + PUSH HL + LD E,(HL) + CALL PRINTLABEL + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTLABEL + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTLABEL + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTLABEL + CALL NEWLINE + POP HL + + DEC HL + DEC HL + DEC HL + + PUSH HL + LD A,(YPOS) + ADD A,1 + DAA + LD (YPOS),A + CALL GOTOXY + POP HL + + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + POP HL + INC HL + PUSH HL + LD E,(HL) + CALL PRINTSPACE + CALL NEWLINE + POP HL + + INC HL + + POP BC + DEC B + JP NZ,L1 + + RET + +PRINTSPACE: + LD D,0 + + PUSH DE + LD HL,COLORPTR + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + POP DE + + LD DE,SPACER +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + + RET + +PRINTLABEL: + LD D,0 + + PUSH DE + LD HL,COLORPTR + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + POP DE + + PUSH DE + LD HL,LABELPTR + ADD HL,DE + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) +; LD C,09H +; CALL BDOS + CALL PRTSTRDE + POP DE + + RET + +GOTOXY: +; LD C,02H + LD E,1BH +; CALL BDOS + CALL COUTE +; LD C,02H + LD E,'[' +; CALL BDOS + CALL COUTE + + LD A,(YPOS) + CP 10H + JP C,L2 + + RRA + RRA + RRA + RRA + AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + + LD A,(YPOS) + +L2 AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + +; LD C,02H + LD E,3BH +; CALL BDOS + CALL COUTE + + LD A,(XPOS) + CP 10H + JP C,L3 + + RRA + RRA + RRA + RRA + AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + + LD A,(XPOS) + +L3 AND 0FH + ADD A,'0' + +; LD C,02H + LD E,A +; CALL BDOS + CALL COUTE + +; LD C,02H + LD E,'H' +; CALL BDOS + CALL COUTE + + RET + +NEWLINE: + +; LD C,02H + LD E,CR +; CALL BDOS + CALL COUTE + +; LD C,02H + LD E,LF +; CALL BDOS + CALL COUTE + + RET + +RAND16 LD DE,0 + LD A,D + LD H,E + LD L,253 + OR A + SBC HL,DE + SBC A,0 + SBC HL,DE + LD D,0 + SBC A,D + LD E,A + SBC HL,DE + JR NC,RAND + INC HL +RAND LD (RAND16+1),HL + RET + +DIV16: + LD A,H ; HL = HL % DE + LD C,L + LD HL,0 + LD B,16 + +DL1 SCF + RL C + RLA + ADC HL,HL + SBC HL,DE + JR NC,$+4 + ADD HL,DE + DEC C + DJNZ DL1 + + LD D,A ; DE = HL / DE + LD E,C + RET + +SPACER .DB " ", '$' + +LABELPTR: .DW LABELS + .DW LABELS + 8 + .DW LABELS + 16 + .DW LABELS + 24 + .DW LABELS + 32 + .DW LABELS + 40 + .DW LABELS + 48 + .DW LABELS + 56 + .DW LABELS + 64 + .DW LABELS + 72 + .DW LABELS + 80 + .DW LABELS + 88 + .DW LABELS + 96 + .DW LABELS + 104 + +LABELS .DB " ", EOS + .DB " 2 ", EOS + .DB " 4 ", EOS + .DB " 8 ", EOS + .DB " 16 ", EOS + .DB " 32 ", EOS + .DB " 64 ", EOS + .DB " 128 ", EOS + .DB " 256 ", EOS + .DB " 512 ", EOS + .DB " 1024 ", EOS + .DB " 2048 ", EOS + .DB " 4096 ", EOS + .DB " 8192 ", EOS + +COLORPTR: .DW COLORS + .DW COLORS + 9 + .DW COLORS + 18 + .DW COLORS + 27 + .DW COLORS + 36 + .DW COLORS + 45 + .DW COLORS + 54 + .DW COLORS + 63 + .DW COLORS + 72 + .DW COLORS + 81 + .DW COLORS + 90 + .DW COLORS + 99 + .DW COLORS + 108 + .DW COLORS + 117 + +COLORS .DB 1BH, "[40;37m", EOS ; 0 + .DB 1BH, "[44;37m", EOS ; 2 + .DB 1BH, "[46;37m", EOS ; 4 + .DB 1BH, "[42;37m", EOS ; 8 + .DB 1BH, "[43;30m", EOS ; 16 + .DB 1BH, "[45;37m", EOS ; 32 + .DB 1BH, "[41;37m", EOS ; 64 + .DB 1BH, "[47;30m", EOS ; 128 + .DB 1BH, "[44;37m", EOS ; 256 + .DB 1BH, "[46;37m", EOS ; 512 + .DB 1BH, "[42;37m", EOS ; 1024 + .DB 1BH, "[43;30m", EOS ; 2048 + .DB 1BH, "[45;37m", EOS ; 4096 + .DB 1BH, "[41;37m", EOS ; 8192 + +POINTS .DW 0000H + .DW 0000H + .DW 0004H + .DW 0008H + .DW 0016H + .DW 0032H + .DW 0064H + .DW 0128H + .DW 0256H + .DW 0512H + .DW 1024H + .DW 2048H + .DW 4096H + .DW 8192H + +INIT: .DB 1BH, "[2J", EOS +TERM: .DB 1BH, "[?25h" +RESET: .DB 1BH, "[0m", EOS + +ADVANCE: .DB 1BH, "[28C", EOS + +TOPBORDER: + .DB 1BH, "[47;37m" + .DB 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH, 0DCH + .DB 0DCH, EOS + +BTMBORDER .DB 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH, 0DFH + .DB 0DFH, 1BH, "[0m", EOS + +MSG1: .DB 1BH, "[0m" + .DB "w=up s=down a=right d=right q=quit" + + .DB EOS +MSG2: .DB 1BH, "[0m" + .DB " QUIT or RESTART (y/n/r) " + .DB EOS +MSG3: .DB 1BH, "[0m" + .DB " GAME OVER! PLAY AGAIN (y/n) " + .DB BEL, CR, LF, EOS +MSG4: .DB 1BH, "[0m" + .DB "2048 pts" + .DB EOS + +; HBIOS functions replacing BDOS functions +; +; +; PRINT A STRING AT ADDRESS SPECIFIED IN DE +; STRING MUST BE TERMINATED BY '$' +; +PRTSTRDE: + PUSH HL + LD H,D + LD L,E + CALL PRTSTR + POP HL + RET +; +; PRINT A STRING AT ADDRESS SPECIFIED IN HL +; STRING MUST BE TERMINATED BY '$' +; USAGE: +; LD HL,MYSTR +; CALL PRTSTR +; ... +; MYSTR: .DB "HELLO$" +; +PRTSTR: + LD A,(HL) + INC HL + CP '$' + RET Z + CALL COUT + JR PRTSTR +; +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +; +COUT: PUSH AF + PUSH BC + PUSH DE + LD B,01H + LD C,0 + LD E,A + RST 08 + POP DE + POP BC + POP AF + RET +; +; OUTPUT CHARACTER IN A TO CONSOLE DEVICE +; +COUTE: PUSH AF + LD A,E + CALL COUT + POP AF + RET +; +; WAIT FOR A CHARACTER FROM THE CONSOLE DEVICE AND RETURN IT IN A +; +CIN: PUSH BC + LD B,00H + LD C,00H + RST 08 + LD A,E + POP BC + RET + +; variables + +BOARD: + .DB 00, 00, 00, 00 + .DB 00, 00, 00, 00 + .DB 00, 00, 00, 00 + .DB 00, 00, 00, 00 + +XPOS: .DB 0 +YPOS: .DB 0 +BOARDPTR: .DW 0 +MOVED: .DB 0 +RESULT: .DB 0 +SCORE .DB 00H, 00H, 00H, 00H +VAREND .EQU $ +SCORESTR .DB 1BH, "[0m $" + +LASTBYTE .EQU $ + +SLACK .EQU (GAM_END - LASTBYTE) + .FILL SLACK,'e' +; + .ECHO "GAME space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" + + .END + diff --git a/Source/HBIOS/imgpad0.asm b/Source/HBIOS/imgpad0.asm index e2822918..74a2a125 100644 --- a/Source/HBIOS/imgpad0.asm +++ b/Source/HBIOS/imgpad0.asm @@ -1,6 +1,6 @@ #INCLUDE "std.asm" ; -SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ-FTH_SIZ) +SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ-FTH_SIZ-GAM_SIZ) .FILL SLACK,00H ; MON_STACK .EQU $ diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 59256504..3ac79c51 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -368,6 +368,7 @@ MENU_1: MENU_L("~CP/M$ ", "C", KY_BK, CPM_ENT, 2000h, CPM_LOC, CPM_SIZ MENU_L("~Forth$ ", "F", KY_EX, FTH_LOC, 0000h, FTH_LOC, FTH_SIZ, BID_IMG1, BID_USR, "Camel Forth$ ") MENU_L("~BASIC$ ", "B", KY_DE, BAS_LOC, 1700h, BAS_LOC, BAS_SIZ, BID_IMG1, BID_USR, "Nascom BASIC$") MENU_L("~T-BASIC$ ", "T", KY_EN, TBC_LOC, 3700h, TBC_LOC, TBC_SIZ, BID_IMG1, BID_USR, "Tasty BASIC$ ") + MENU_L("~PLAY$ ", "P", $FF, GAM_LOC, 4000h, GAM_LOC, GAM_SIZ, BID_IMG1, BID_USR, "Game$ ") #ENDIF #IF (DSKYENABLE) MENU_L("~DSKY$ ", "D", KY_GO, MON_DSKY, 1000h, MON_LOC, MON_SIZ, BID_CUR, BID_USR, "DSKY Monitor$") diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index a40da2d4..7172ef96 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -422,6 +422,10 @@ FTH_LOC .EQU $0200 ; CAMEL FORTH FTH_SIZ .EQU $1700 FTH_END .EQU FTH_LOC + FTH_SIZ +GAM_LOC .EQU $0200 ; GAME 2048 +GAM_SIZ .EQU $0900 +GAM_END .EQU GAM_LOC + GAM_SIZ + MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY) MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) ; From b89e45741478ac33d80cca0f063258e3d59c7d5d Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 7 Feb 2020 14:33:21 +0800 Subject: [PATCH 9/9] Update game.asm keypad and arrow keys --- Source/HBIOS/game.asm | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Source/HBIOS/game.asm b/Source/HBIOS/game.asm index cdc5fca6..8bbce38b 100644 --- a/Source/HBIOS/game.asm +++ b/Source/HBIOS/game.asm @@ -115,6 +115,9 @@ LOOP: K3 CP CTRL_C JP Z,EXIT + CP 1BH + JP Z,K1 + CP CTRL_E JP Z,TOP CP CTRL_X @@ -133,12 +136,18 @@ K3 CP CTRL_C CP 'A' JP Z,LEFT + CP '8' + JP Z,TOP + CP '2' + JP Z,BOTTOM + CP '6' + JP Z,RIGHT + CP '4' + JP Z,LEFT + CP 'Q' JP Z,QUIT - - CP 1BH - JP Z,K1 - + ; LD C,02H ; LD E,BEL ; CALL BDOS @@ -147,15 +156,15 @@ K3 CP CTRL_C JP LOOP K1: -; LD C,06H +; LD C,06H ; LD E,0FFH ; CALL BDOS ; CP 0 ; JP Z,K1 CALL CIN - CP 'O' - JP NZ,K2 + CP '[' + JP NZ,LOOP K4: ; LD C,06H @@ -1120,7 +1129,7 @@ BTMBORDER .DB 0DFH .DB 0DFH, 1BH, "[0m", EOS MSG1: .DB 1BH, "[0m" - .DB "w=up s=down a=right d=right q=quit" + .DB "UDLR = wsad ^E^X^S^D 8246 : Q=QUIT" .DB EOS MSG2: .DB 1BH, "[0m"