retrocoding/src/altair8800/PokerDice.asm
2023-10-20 13:31:24 -05:00

313 lines
4.3 KiB
NASM

; PokerDice.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/>.
; Poker Dice Game Aid
;
; Toggle the first five sense switches to roll the different dice.
; Position 0 = roll
; Position 1 = hold
;
; Toggle switches 6 and 7 when you want to move on to the next roll
; or continue holding the dice.
; Once switches 6 and 7 are togged to position 1, the game ends and
; your "hand" is displayed.
ORG 100H
; Driver logic
LXI SP, STACK
PUSH D
LXI D, WELCOME
CALL PRINTS
POP D
PUSH D
LXI D, NEWLINE
CALL PRINTS
POP D
LXI H, DICE
CALL ROLLTHEMBONES
CALL OUTPUT
ROUND2
IN 0FFH
ANI 32
JZ ROUND2
CALL ROLLTHEMBONES
CALL OUTPUT
ROUND3
IN 0FFH
ANI 64
JZ ROUND3
CALL ROLLTHEMBONES
CALL OUTPUT
JMP 0h
ROLLTHEMBONES
MOV A, C
CPI 0
JNZ RTB1
CALL ROLL1
MOV M, C
INR L
CALL ROLL2
MOV M, C
INR L
CALL ROLL3
MOV M, C
INR L
CALL ROLL4
MOV M, C
INR L
CALL ROLL5
MOV M, C
JMP RTBEND
RTB1
IN 0FFH
ANI 1
JNZ RTB2
CALL ROLL1
MOV M, C
RTB2
INR L
IN 0FFH
ANI 2
JNZ RTB3
CALL ROLL2
MOV M, C
RTB3
INR L
IN 0FFH
ANI 4
JNZ RTB4
CALL ROLL3
MOV M, C
RTB4
INR L
IN 0FFH
ANI 8
JNZ RTB5
CALL ROLL4
MOV M, C
RTB5
INR L
IN 0FFH
ANI 16
JNZ RTBEND
CALL ROLL5
MOV M, C
RTBEND
DCR L
DCR L
DCR L
DCR L
RET
; Output the dice results
OUTPUT
PUSH D
LXI D, YOUROLLED
CALL PRINTS
POP D
PUSH D
MOV A, M
ADI 48
STAX D
CALL PRINTC
INR L
POP D
PUSH D
LXI D, NEWLINE
CALL PRINTS
POP D
PUSH D
MOV A, M
ADI 48
STAX D
CALL PRINTC
INR L
POP D
PUSH D
LXI D, NEWLINE
CALL PRINTS
POP D
PUSH D
MOV A, M
ADI 48
STAX D
CALL PRINTC
INR L
POP D
PUSH D
LXI D, NEWLINE
CALL PRINTS
POP D
PUSH D
MOV A, M
ADI 48
STAX D
CALL PRINTC
INR L
POP D
PUSH D
LXI D, NEWLINE
CALL PRINTS
POP D
PUSH D
MOV A, M
ADI 48
STAX D
CALL PRINTC
POP D
PUSH D
LXI D, NEWLINE
CALL PRINTS
POP D
PUSH D
LXI D, TRANSLATION
CALL PRINTS
POP D
DCR L
DCR L
DCR L
DCR L
RET
; Roll the different dice
ROLL1
ROLL1_START
MVI C, 0
ROLL1_DIE
INR C
MOV A, C
CPI 7H
JZ ROLL1_START
IN 0FFH
ANI 1
JNZ ROLL1_END
JMP ROLL1_DIE
ROLL1_END
RET
ROLL2
ROLL2_START
MVI C, 0
ROLL2_DIE
INR C
MOV A, C
CPI 7H
JZ ROLL2_START
IN 0FFH
ANI 2
JNZ ROLL2_END
JMP ROLL2_DIE
ROLL2_END
RET
ROLL3
ROLL3_START
MVI C, 0
ROLL3_DIE
INR C
MOV A, C
CPI 7H
JZ ROLL3_START
IN 0FFH
ANI 4
JNZ ROLL3_END
JMP ROLL3_DIE
ROLL3_END
RET
ROLL4
ROLL4_START
MVI C, 0
ROLL4_DIE
INR C
MOV A, C
CPI 7H
JZ ROLL4_START
IN 0FFH
ANI 8
JNZ ROLL4_END
JMP ROLL4_DIE
ROLL4_END
RET
ROLL5
ROLL5_START
MVI C, 0
ROLL5_DIE
INR C
MOV A, C
CPI 7H
JZ ROLL5_START
IN 0FFH
ANI 16
JNZ ROLL5_END
JMP ROLL5_DIE
ROLL5_END
RET
; Print a null-terminated string
PRINTS
PUSH PSW
OUT1CH
LDAX D ; LET A = (DE)
CPI 0H ; Done when null terminated.
JZ PRINTS_DONE
OUT 1H ; Output the character at the current address to the console
INR E ; Increment the address of the current character
JMP OUT1CH
PRINTS_DONE
POP PSW
RET
PRINTC
LDAX D ; LET A = (DE)
OUT 1H ; Output the character at the current address to the console
RET
SAVE_HL DW 0
WELCOME DB "Welcome to the gambling halls of Mooreheim!", 0H
YOUROLLED DB "You rolled:", CR, LF, 0H
TRANSLATION DB "Poker dice translations: 1: 9, 2: 10, 3: J, 4: Q, 5: K, 6: A", CR, LF, 0H
DICE DB 0, 0, 0, 0, 0
HELD_DICE DB 0, 0, 0, 0, 0
NEWLINE DB CR, LF, 0H
CR equ 0DH
LF equ 0AH
STACK equ 2000h
END