313 lines
4.3 KiB
NASM
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
|