Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
140
Task/Nim-game/Z80-Assembly/nim-game.z80
Normal file
140
Task/Nim-game/Z80-Assembly/nim-game.z80
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
;
|
||||
; Nim game using Z80 assembly language
|
||||
;
|
||||
; Runs under CP/M 3.1 on YAZE-AG-2.51.2 Z80 emulator
|
||||
; Assembled with zsm4 on same emulator/OS, uses macro capabilities of said assembler
|
||||
; Created with vim under Windows
|
||||
;
|
||||
; 2023-04-28 Xorph
|
||||
;
|
||||
|
||||
;
|
||||
; Useful definitions
|
||||
;
|
||||
|
||||
bdos equ 05h ; Call to CP/M BDOS function
|
||||
readstr equ 0ah ; Read string from console
|
||||
wrtstr equ 09h ; Write string to console
|
||||
|
||||
cr equ 0dh ; ASCII control characters
|
||||
lf equ 0ah
|
||||
|
||||
buflen equ 01h ; Length of input buffer
|
||||
maxtok equ 12 ; Starting number of tokens
|
||||
|
||||
;
|
||||
; Macro for BDOS calls
|
||||
;
|
||||
|
||||
readln macro buf ; Read a line from input
|
||||
push bc
|
||||
ld c,readstr
|
||||
ld de,buf
|
||||
call bdos
|
||||
pop bc
|
||||
endm
|
||||
|
||||
|
||||
;
|
||||
; =====================
|
||||
; Start of main program
|
||||
; =====================
|
||||
;
|
||||
|
||||
cseg
|
||||
|
||||
ld de,nim ; Print title and initialize
|
||||
call print
|
||||
ld c,maxtok ; Register c keeps track of remaining tokens
|
||||
|
||||
loop:
|
||||
ld de,tokens ; Print the remaining tokens
|
||||
call print
|
||||
ld b,c ; Use b for loop to print remaining tokens
|
||||
printtk:
|
||||
ld de,token
|
||||
call print
|
||||
djnz printtk
|
||||
|
||||
ld de,prompt ; Prompt user for input
|
||||
call print
|
||||
readln inputbuf
|
||||
|
||||
ld a,(bufcont) ; Now check input for validity and compute response
|
||||
ld hl,validinp+2 ; Start from end of valid string, so bc gets set to numeric equivalent
|
||||
push bc ; Save token counter, use bc for cpdr
|
||||
ld bc,3
|
||||
cpdr ; Use automatic search function
|
||||
jr nz,printerr ; If input character not found, print error
|
||||
|
||||
ld hl,mymoves ; Get character for response into a
|
||||
add hl,bc ; bc contains index into check string as well as response string
|
||||
pop bc
|
||||
ld a,(hl)
|
||||
ld (outbuf),a ; Put it in output buffer
|
||||
|
||||
ld de,response ; Print the computer's move
|
||||
call print
|
||||
|
||||
ld a,c ; Subtract 4 tokens from counter
|
||||
sub 4
|
||||
ld c,a
|
||||
|
||||
jr nz,loop ; If not finished, repeat
|
||||
ld de,lose ; Otherwise, player lost
|
||||
call print
|
||||
|
||||
ret ; Return to CP/M
|
||||
|
||||
printerr: ; Print error message and try again
|
||||
pop bc
|
||||
ld de,wronginp
|
||||
call print
|
||||
jp loop
|
||||
|
||||
print: ; Use subroutine instead of macro for smaller code
|
||||
push bc
|
||||
ld c,wrtstr
|
||||
call bdos
|
||||
pop bc
|
||||
ret
|
||||
|
||||
;
|
||||
; ===================
|
||||
; End of main program
|
||||
; ===================
|
||||
;
|
||||
|
||||
;
|
||||
; ================
|
||||
; Data definitions
|
||||
; ================
|
||||
;
|
||||
|
||||
dseg
|
||||
|
||||
inputbuf: ; Input buffer
|
||||
defb buflen ; Maximum possible length
|
||||
defb 00h ; Returned length of actual input
|
||||
bufcont:
|
||||
defs buflen ; Actual input area
|
||||
nim:
|
||||
defb 'Nim$' ; Dialog texts
|
||||
prompt:
|
||||
defb cr,lf,'How many will you take (1-3)? $'
|
||||
response:
|
||||
defb cr,lf,'I take ' ; No $ here! Saves one print command
|
||||
outbuf:
|
||||
defb ' $' ; For printing response
|
||||
tokens:
|
||||
defb cr,lf,cr,lf,'Tokens: $'
|
||||
token:
|
||||
defb '|$'
|
||||
lose:
|
||||
defb cr,lf,'You lose!$'
|
||||
wronginp:
|
||||
defb cr,lf,'Wrong input$'
|
||||
validinp:
|
||||
defb '123' ; Valid input
|
||||
mymoves:
|
||||
defb '321' ; Computer's response
|
||||
Loading…
Add table
Add a link
Reference in a new issue