retrocoding/src/altair8800/Mooreheim.asm

303 lines
3.8 KiB
NASM

; Mooreheim.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/>.
; Mooreheim the Dice Game
;
; 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
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
IN 0FFH
ANI 32
CNZ ROLLTHEMBONES
CALL OUTPUT
IN 0FFH
ANI 64
CNZ ROLLTHEMBONES
CALL OUTPUT
JMP 0h
ROLLTHEMBONES
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
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
DCR L
DCR L
DCR L
DCR L
RET
; Roll the different dice
ROLL1
IN 0FFH
ANI 1
JNZ ROLL1_TEST
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_TEST
MOV A, M
CPI 0h
JZ ROLL1_START
ROLL1_END
RET
ROLL2
IN 0FFh
ANI 2
JNZ ROLL2_TEST
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_TEST
MOV A, M
CPI 0
JZ ROLL2_START
ROLL2_END
RET
ROLL3
IN 0FFh
ANI 4
JNZ ROLL3_TEST
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_TEST
MOV A, M
CPI 0
JZ ROLL3_START
ROLL3_END
RET
ROLL4
IN 0FFH
ANI 8
JNZ ROLL4_TEST
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_TEST
MOV A, M
CPI 0
JZ ROLL4_START
ROLL4_END
RET
ROLL5
IN 0FFh
ANI 16
JNZ ROLL5_TEST
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_TEST
MOV A, M
CPI 0
JZ ROLL5_START
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
; PUSH PSW
LDAX D ; LET A = (DE)
OUT 1H ; Output the character at the current address to the console
; POP PSW
RET
SAVE_HL DW 0
WELCOME DB "Welcome to the gambling halls of Mooreheim!", 0H
DICE DB 0, 0, 0, 0, 0
HELD_DICE DB 0, 0, 0, 0, 0
YOUROLLED DB "You rolled:", CR, LF, 0H
NEWLINE DB CR, LF, 0H
CR equ 0DH
LF equ 0AH
END