Updates with more code

This commit is contained in:
William Moore 2024-04-12 04:15:23 -05:00
parent e8fa4a2d95
commit f3f7cd238a
3 changed files with 688 additions and 3 deletions

View File

@ -17,7 +17,7 @@
; Modified from https://github.com/kloyd/Retro8080/blob/main/funstuff/blinken_pattern.asm ; Modified from https://github.com/kloyd/Retro8080/blob/main/funstuff/blinken_pattern.asm
; to run in CP/M and with my own pattern. ; to run in CP/M and with my own pattern.
ORG 100H ORG 00H
INIT LXI H,DATA ; HL points to blinken data INIT LXI H,DATA ; HL points to blinken data
SHLD SAVE_HL SHLD SAVE_HL
@ -31,7 +31,7 @@ GETD LHLD SAVE_HL ; restore HL
INPDEL LXI H,0 ; Init HL to zero before starting the delay loop INPDEL LXI H,0 ; Init HL to zero before starting the delay loop
IN 0FFH IN 0FFH
CPI 00H ; All Sense switches off finishes the program. CPI 01H ; All Sense switches off finishes the program.
JZ DONE JZ DONE
LXI B,4H ; Hardcoded timer LXI B,4H ; Hardcoded timer
@ -45,7 +45,7 @@ BLINK LDAX D
; Done with this loop go get the next D ; Done with this loop go get the next D
; Return to CP/M if 00 on sense switches. Some way to drop out. ; Return to CP/M if 00 on sense switches. Some way to drop out.
DONE JMP 0H DONE HLT
; Somewhere to save HL, since it will get clobbered by the delay routine. ; Somewhere to save HL, since it will get clobbered by the delay routine.
SAVE_HL DW 0 SAVE_HL DW 0
; Put your pattern list here... this is just jiggy wiggy back forth here. ; Put your pattern list here... this is just jiggy wiggy back forth here.

View File

@ -0,0 +1,605 @@
; DixeMille.z80 - a Z80 assembly implementation of the dice game Dixe Mille.
; Copyright (C) 2023 William R. Moore
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
ORG 100H
; Driver logic
START
; LD SP, STACK
LD DE, CLS
CALL PRINTS
LD DE, HOME
CALL PRINTS
LD DE, WELCOME
CALL PRINTS
LD DE, NEWLINE
CALL PRINTS
ROLLUNHELD
LD DE, STOPROLL
CALL PRINTS
LD DE, NEWLINE
CALL PRINTS
CALL ROLLTHEMBONES
CALL HOLDDICE
CALL OUTPUT
CALL COUNTHELD
CP 6
JP Z, DONE
CALL ROLLUNHELD
DONE
JP 00H
COUNTHELD
LD HL, HELD_DICE
ADD A, (HL)
INC L
ADD A, (HL)
INC L
ADD A, (HL)
INC L
ADD A, (HL)
INC L
ADD A, (HL)
INC L
ADD A, (HL)
LD L, 0
RET
ROLLTHEMBONES
LD HL, DICE
PUSH HL
LD HL, HELD_DICE
LD A, (HL)
POP HL
CP 1
JP Z, ROLL2
CALL ROLL
LD DE, DIE1
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
LD DE, NEWLINE
CALL PRINTS
ROLL2
INC L
PUSH HL
LD HL, HELD_DICE
INC L
LD A, (HL)
POP HL
CP 1
JP Z, ROLL3
CALL ROLL
LD DE, DIE2
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
LD DE, NEWLINE
CALL PRINTS
ROLL3
INC L
PUSH HL
LD HL, HELD_DICE
INC L
INC L
LD A, (HL)
POP HL
CP 1
JP Z, ROLL4
CALL ROLL
LD DE, DIE3
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
LD DE, NEWLINE
CALL PRINTS
ROLL4
INC L
PUSH HL
LD HL, HELD_DICE
INC L
INC L
INC L
LD A, (HL)
POP HL
CP 1
JP Z, ROLL5
CALL ROLL
LD DE, DIE4
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
LD DE, NEWLINE
CALL PRINTS
ROLL5
INC L
PUSH HL
LD HL, HELD_DICE
INC L
INC L
INC L
INC L
LD A, (HL)
POP HL
CP 1
JP Z, ROLL6
CALL ROLL
LD DE, DIE5
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
LD DE, NEWLINE
CALL PRINTS
ROLL6
INC L
PUSH HL
LD HL, HELD_DICE
INC L
INC L
INC L
INC L
INC L
LD A, (HL)
POP HL
CP 1
JP Z, ROLLEND
CALL ROLL
LD DE, DIE6
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
LD DE, NEWLINE
CALL PRINTS
; Return back to original position
ROLLEND
DEC L
DEC L
DEC L
DEC L
DEC L
RET
HOLDDIE
CALL INPUTC
CP 00H
JP Z, HOLDDIE
CP 121
JP Z, HOLDDIE_FINISH
CP 89
JP Z, HOLDDIE_FINISH
CP 110
JP Z, HOLDDIE_END
CP 78
JP Z, HOLDDIE_END
CALL HOLDDIE
HOLDDIE_FINISH
LD (HL), 1
HOLDDIE_END
RET
; Ask player to hold any dice
HOLDDICE
LD HL, HELD_DICE
LD A, (HL)
CP 1
JP Z, HD2
LD DE, DYWTH
CALL PRINTS
LD DE, DIE1
CALL PRINTS
CALL HOLDDIE
LD DE, NEWLINE
CALL PRINTS
HD2
INC L
LD A, (HL)
CP 1
JP Z, HD3
LD DE, DYWTH
CALL PRINTS
LD DE, DIE2
CALL PRINTS
CALL HOLDDIE
LD DE, NEWLINE
CALL PRINTS
HD3
INC L
LD A, (HL)
CP 1
JP Z, HD4
LD DE, DYWTH
CALL PRINTS
LD DE, DIE3
CALL PRINTS
CALL HOLDDIE
LD DE, NEWLINE
CALL PRINTS
HD4
INC L
LD A, (HL)
CP 1
JP Z, HD5
LD DE, DYWTH
CALL PRINTS
LD DE, DIE4
CALL PRINTS
CALL HOLDDIE
LD DE, NEWLINE
CALL PRINTS
HD5
INC L
LD A, (HL)
CP 1
JP Z, HD6
LD DE, DYWTH
CALL PRINTS
LD DE, DIE5
CALL PRINTS
CALL HOLDDIE
LD DE, NEWLINE
CALL PRINTS
HD6
INC L
LD A, (HL)
CP 1
JP Z, HD_DONE
LD DE, DYWTH
CALL PRINTS
LD DE, DIE6
CALL PRINTS
CALL HOLDDIE
LD DE, NEWLINE
CALL PRINTS
HD_DONE
; Return back to original position
LD L, 0
RET
; Roll the different dice
ROLL
PUSH BC
ROLL_START
LD C, 0
ROLL_DIE
INC C
LD A, C
CP 7H
JP Z, ROLL_START
CALL INPUTC
CP 00H
JP NZ, ROLL_END
JP ROLL_DIE
ROLL_END
LD (HL), C
POP BC
RET
; Output the dice results
OUTPUT
LD HL, DICE
LD DE, YOUROLLED
CALL PRINTS
LD DE, NEWLINE
CALL PRINTS
LD DE, DIE1
CALL PRINTS
LD A, (HL)
CALL PRINTFACE
PUSH HL
LD HL, HELD_DICE
LD A, (HL)
CP 1
JP Z, MARK_1
JP END_1
MARK_1
LD DE, MARKED
CALL PRINTS
END_1
POP HL
LD DE, NEWLINE
CALL PRINTS
O2
LD DE, DIE2
CALL PRINTS
INC L
LD A, (HL)
CALL PRINTFACE
PUSH HL
LD HL, HELD_DICE
INC L
LD A, (HL)
CP 1
JP Z, MARK_2
JP END_2
MARK_2
LD DE, MARKED
CALL PRINTS
END_2
DEC L
POP HL
LD DE, NEWLINE
CALL PRINTS
O3
LD DE, DIE3
CALL PRINTS
INC L
LD A, (HL)
CALL PRINTFACE
PUSH HL
LD HL, HELD_DICE
INC L
INC L
LD A, (HL)
CP 1
JP Z, MARK_3
JP END_3
MARK_3
LD DE, MARKED
CALL PRINTS
END_3
DEC L
DEC L
POP HL
LD DE, NEWLINE
CALL PRINTS
O4
LD DE, DIE4
CALL PRINTS
INC L
LD A, (HL)
CALL PRINTFACE
PUSH HL
LD HL, HELD_DICE
INC L
INC L
INC L
LD A, (HL)
CP 1
JP Z, MARK_4
JP END_4
MARK_4
LD DE, MARKED
CALL PRINTS
END_4
DEC L
DEC L
DEC L
POP HL
LD DE, NEWLINE
CALL PRINTS
O5
LD DE, DIE5
CALL PRINTS
INC L
LD A, (HL)
CALL PRINTFACE
PUSH HL
LD HL, HELD_DICE
INC L
INC L
INC L
INC L
LD A, (HL)
CP 1
JP Z, MARK_5
JP END_5
MARK_5
LD DE, MARKED
CALL PRINTS
END_5
DEC L
DEC L
DEC L
DEC L
POP HL
LD DE, NEWLINE
CALL PRINTS
O6
LD DE, DIE6
CALL PRINTS
INC L
LD A, (HL)
CALL PRINTFACE
PUSH HL
LD HL, HELD_DICE
INC L
INC L
INC L
INC L
INC L
LD A, (HL)
CP 1
JP Z, MARK_6
JP END_6
MARK_6
LD DE, MARKED
CALL PRINTS
END_6
DEC L
DEC L
DEC L
DEC L
DEC L
POP HL
LD DE, NEWLINE
CALL PRINTS
DEC L
DEC L
DEC L
DEC L
DEC L
RET
; Read 1 character when one is ready
; A is 00H if none are available
INPUTC
PUSH HL
PUSH BC
PUSH DE
LD C, CONST
CALL BDOS
CP 00H
JP Z, INPUTCEND
; LD C, CONST
; CALL BDOS
; CP FFH
; JR Z, INPUTCEND
; LD C, CONIN
; CALL BDOS
LD C, CONIN
CALL BDOS
POP DE
POP BC
POP HL
RET
INPUTCEND
POP DE
POP BC
POP HL
; LD A, 00H
; POP BC
; POP HL
RET
; Print a string
PRINTS
; preserve BC register.
; preserve HL register.
PUSH HL
PUSH BC
LD C, WRITESTR
CALL BDOS
POP BC
POP HL
RET
PRINTFACE
CP 1
JP NZ, CHECKTWO
LD DE, ONE
CALL PRINTS
JP PRINTFACE_END
CHECKTWO
CP 2
JP NZ, CHECKTHREE
LD DE, TWO
CALL PRINTS
JP PRINTFACE_END
CHECKTHREE
CP 3
JP NZ, CHECKFOUR
LD DE, THREE
CALL PRINTS
JP PRINTFACE_END
CHECKFOUR
CP 4
JP NZ, CHECKFIVE
LD DE, FOUR
CALL PRINTS
JP PRINTFACE_END
CHECKFIVE
CP 5
JP NZ, CHECKSIX
LD DE, FIVE
CALL PRINTS
JP PRINTFACE_END
CHECKSIX
CP 6
JP NZ, CHECKBADVALUE
LD DE, SIX
CALL PRINTS
JP PRINTFACE_END
CHECKBADVALUE
LD DE, BADVALUE
CALL PRINTS
PRINTFACE_END
RET
EOS DB "$"
WELCOME DB "WELCOME TO DIX MILLE FOR CP/M!$"
STOPROLL DB "PRESS ANY KEY AT ANY TIME TO STOP ROLLING A DIE!$"
DYWTH DB "DO YOU WANT TO HOLD (Y/N) $"
OPTIMAL DB "NOW, DETERMINING OPTIMAL SCORE: $"
YOUROLLED DB "RESULTS:$"
NEWLINE DB CR, LF, "$"
DIE1 DB "DIE 1: $"
DIE2 DB "DIE 2: $"
DIE3 DB "DIE 3: $"
DIE4 DB "DIE 4: $"
DIE5 DB "DIE 5: $"
DIE6 DB "DIE 6: $"
ONE DB "ONE$"
TWO DB "TWO$"
THREE DB "THREE$"
FOUR DB "FOUR$"
FIVE DB "FIVE$"
SIX DB "SIX$"
MARKED DB " *$"
CLS DB 1bh, '[2J$' ; ANSI clear screen: ESC [ 2 J
HOME DB 1bh, '[H$' ; ANSI go to screen home: ESC [ H
BADVALUE DB "BAD VALUE$"
TOTALHELD DB 0
DICE DB 0, 0, 0, 0, 0, 0
HELD_DICE DB 0, 0, 0, 0, 0, 0
CR equ 0DH
LF equ 0AH
STACK equ 2000H
CONST EQU 0BH
CONIN EQU 01H
BDOS EQU 05H
PRTCHR EQU 02H
WRITESTR EQU 09H
END

View File

@ -0,0 +1,80 @@
; blinkenlights.asm
; Copyright (C) 2023 William R. Moore
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
; Modified from https://github.com/kloyd/Retro8080/blob/main/funstuff/blinken_pattern.asm
; to run in CP/M and with my own pattern.
ORG 100H
INIT LXI H,DATA ; HL points to blinken data
SHLD SAVE_HL
GETD LHLD SAVE_HL ; restore HL
MOV A,M ; get data @ HL
CPI EOF ; End of the data list?
JZ INIT ; Yes, reset HL pointer.
MOV D,A ; No, put in D register for the display pattern.
INR L ; HL++
SHLD SAVE_HL ; Save data
INPDEL LXI H,0 ; Init HL to zero before starting the delay loop
IN 0FFH
CPI 00H ; All Sense switches off finishes the program.
JZ DONE
LXI B,4H ; Hardcoded timer
BLINK LDAX D
LDAX D
LDAX D
LDAX D
DAD B
JNC BLINK
JMP GETD
; Done with this loop go get the next D
; Return to CP/M if 00 on sense switches. Some way to drop out.
DONE JMP 0H
; Somewhere to save HL, since it will get clobbered by the delay routine.
SAVE_HL DW 0
; Put your pattern list here... this is just jiggy wiggy back forth here.
DATA
DB 10111010b
DB 11000011b
DB 11011111b
DB 10001000b
DB 01001000b
DB 00110000b
DB 01000110b
DB 10000010b
DB 01101010b
DB 01000000b
DB 00100111b
DB 01010111b
DB 00100000b
DB 11110010b
DB 01101111b
DB 10000011b
DB 00110011b
DB 00010101b
DB 10001100b
DB 10111011b
DB 00000000b
DB EOF
EOF EQU 042 ; end of data
END