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/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/game.asm b/Source/HBIOS/game.asm new file mode 100644 index 00000000..8bbce38b --- /dev/null +++ b/Source/HBIOS/game.asm @@ -0,0 +1,1234 @@ +; 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 1BH + JP Z,K1 + + 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 '8' + JP Z,TOP + CP '2' + JP Z,BOTTOM + CP '6' + JP Z,RIGHT + CP '4' + JP Z,LEFT + + CP 'Q' + JP Z,QUIT + +; 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 '[' + JP NZ,LOOP + +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 "UDLR = wsad ^E^X^S^D 8246 : 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/ppide.asm b/Source/HBIOS/ppide.asm index 1cf840e3..92eb3a66 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,7 +168,12 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE2: SECONDARY MASTER ; PPIDE3: SECONDARY SLAVE ; -PPIDE_DEVCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE0IO .EQU PPIDE_IO_BASE +PPIDE1IO .EQU 20H +PPIDE2IO .EQU 44H +PPIDE3IO .EQU 00H +; +PPIDE_DEVCNT .EQU PPICNT*2 ; ; 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 15 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; @@ -223,6 +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_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 @@ -232,6 +235,9 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB PPIDE0IO ; DATALO + .DB PPIDE0IO+2 ; CTL + .DB PPIDE0IO+3 ; PPI ; DEVICE 1, PRIMARY SLAVE .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS @@ -239,6 +245,31 @@ PPIDE_CFGTBL: .DB 0 ; FLAGS BYTE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA + .DB PPIDE0IO ; DATALO + .DB PPIDE0IO+2 ; CTL + .DB PPIDE0IO+3 ; PPI +#IF (PPICNT> 1) + ; 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" @@ -273,14 +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 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 ; @@ -333,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 @@ -375,11 +408,20 @@ 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 +; +#IF USEZ80OPT +;; OUT (C),0 + .DB $ED,$71 +#ELSE XOR A ; VALUE ZERO OUT (C),A ; PUSH VALUE TO PORT +#ENDIF +; IN A,(C) ; GET PORT VALUE DCALL PC_SPACE DCALL PRTHEXBYTE @@ -717,7 +759,7 @@ PPIDE_RUNCMD: JP NZ,PPIDE_CMDERR RET ; -; +; READ IDE DATA INTO BUFFER POINTED TO BY HL ; PPIDE_GETBUF: #IF (PPIDETRACE >= 3) @@ -729,22 +771,25 @@ 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 + DEC C ; 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) -; -#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) @@ -760,18 +805,36 @@ PPIDE_GETBUF: JP NZ,PPIDE_IOERR RET ; -PPIDE_GETBUF1: ; START OF READ LOOP - LD A,D ; ASSERT READ - OUT (PPIDE_IO_CTL),A ; DO IT -#IF (!PPIDE8BIT) +PPIDE_GETBUF1: ; START OF READ LOOP +; +#IF (PPIDE8BIT) + INC C + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),D ; ASSERT READ + DEC C + DEC C + INI ; GET AND SAVE NEXT BYTE + PUSH AF + INC C + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),E ; DEASSERT READ + DEC C + DEC C + POP AF +#ELSE + 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 -#ENDIF INI ; GET AND SAVE NEXT BYTE - LD A,E ; DEASSERT READ - OUT (PPIDE_IO_CTL),A ; DO IT -; + PUSH AF + INC C ; LD C,(IY+PPIDE_CTL) + OUT (C),E ; DEASSERT READ + DEC C + POP AF +#ENDIF JR NZ,PPIDE_GETBUF1 ; LOOP UNTIL DONE RET ; @@ -787,22 +850,26 @@ 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 + DEC C ; 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) -; -#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) @@ -819,17 +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 - LD A,D ; ASSERT WRITE - OUT (PPIDE_IO_CTL),A ; DO IT - LD A,E ; DEASSERT WRITE - OUT (PPIDE_IO_CTL),A ; DO IT -; JR NZ,PPIDE_PUTBUF1 ; LOOP UNTIL DONE RET ; @@ -860,17 +938,29 @@ 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 +; +#IF USEZ80OPT +;; OUT (C),0 + .DB $ED,$71 +#ELSE + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT +#ENDIF +; LD DE,20 CALL VDELAY ; @@ -909,6 +999,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 +1064,16 @@ 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) +#IF USEZ80OPT +;; OUT (C),0 + .DB $ED,$71 +#ELSE + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT +#ENDIF +; CALL PPIDE_IN .DB PPIDE_REG_STAT DCALL PC_SPACE @@ -1193,7 +1291,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 @@ -1203,52 +1301,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 ; -; -; -PPIDE_IN: - LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS - OUT (PPIDE_IO_PPI),A ; DO IT ; 11TS - EX (SP),HL ; GET PARM POINTER ; 19TS +; 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 +; LD B,(HL) ; GET CTL PORT VALUE ; 7TS - LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE ; 7TS + 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 - IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS - ;NOP - ;NOP +; + DEC C ; 4TS + DEC C ; LD C,(IY+PPIDE_DATALO) ; 4TS + IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12TS +; RES 6,B ; CLEAR WRITE BIT ; 8TS + 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 ; ; ----- -; ; 170TS +; ; 204TS +; ; ----- +; OUTPUT A TO 3 2 0 2 ; -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 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 + LD B,(HL) ; GET IDE ADDRESS VALUE - LD C,PPIDE_IO_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 - OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE - ;NOP - ;NOP +; + DEC C + DEC C ; LD C,(IY+PPIDE_DATALO) + OUT (C),A ; SEND DATA VALUE TO DEVICE +; RES 5,B ; CLEAR WRITE BIT + 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 @@ -1354,29 +1460,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 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 c552b5a3..7172ef96 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 @@ -421,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) ;