View difference between Paste ID: DwrwhCSC and jerGtyVP
SHOW: | | - or go back to the newest paste.
1
with the exception of rendering a few text strings and looping that dice->LCD code, game is done. Things of note... 
2
3
1. In the game, if you CANNOT score against a combo, you are forced to enter a score of 0 on an open combo. In this code, this is written as a value of -1. Every score is therefore upped by 1, so I can just dec a before saving it. The code to see if a combo is available (under EnterScore) should exit if a non-zero value exists for that combo.
4
5
2. entryMode now controls what actions you can perform. Bit0 is throwing the dice, Bit1 is scoring against a combo. In this code, if both bits are set, you should be able to do everything. If only bit 0 is set, you should be able to roll the dice, and hold a dice, but do nothing else. If only bit 1 is set, you should be able to toggle combos and select one, but do nothing else. You should always be able to bring up the instructions and quit the game.
6
7
8
; Yatzee for TI-83+/84+
9
; Version 1.0
10
; by ACagliano 
11
12
.nolist
13
#include "ti83plus.inc"
14
#include "dcs7.inc"
15
.list
16
; defines/equates
17
#define diceOne 0
18
#define diceTwo 1
19
#define diceThree 2
20
#define diceFour 3
21
#define diceFive 4
22
#define diceSix 5
23
#define comboScores saferam1
24
 #define threeOnes 0
25
 #define threeTwos 1
26
 #define threeThrees 2
27
 #define threeFours 3
28
 #define threeFives 4
29
 #define threeSixes 5
30
 #define threeOfaKind 6
31
 #define fourOfaKind 7
32
 #define fullHouse 8
33
 #define smStraight 9
34
 #define lgStraight 10
35
 #define chance 11
36
 #define yatzee 12
37
 #define threesBonus 13 
38
#define gameScore comboScores+threesBonus
39
#define entryMode gameScore+2
40
 #define spin 0
41
 #define score 1
42
#define highScore entryMode+1
43
#define curRolls highScore+2
44
#define dieValues curRolls+1
45
#define dieHoldFlags dieValues+5
46
#define threesPoints dieHoldFlags+1
47
#define saveSize threesPoints-comboFlags
48
49
#define selectedCombo dieHoldFlags+1
50
#define ptsforSelected selectedCombo+1
51
#define rollBonuses ptsforSelected+2
52
#define ctOnes rollBonuses+1
53
#define ctTwos ctOnes+1
54
#define ctThrees ctTwos+1
55
#define ctFours ctThrees+1
56
#define ctFives ctFours+1
57
#define ctSixes ctFives+1
58
59
60
.db $BB,$6D
61
.org progstart
62
63
Start: 
64
	bcall(_ClrLCDFull)
65
	ld a,r          ;\
66
  	ld h,a          ; |
67
    	xor 77          ; |Seed the RNG
68
    	ld l,a          ; |
69
    	ld (seed1),hl   ; |
70
    	ld (seed2),hl   ;/
71
72
	push iy \ ld iy,comboScores		; push system flags location, set IY to comboScores address
73
	ld ix,dieValues				; set IX to 5-byte die roll values
74
			
75
	ld hl,gameScore \ ld b,ctSixes-comboScores \ call zeroData	; zero the RAM savestate
76
77
	ld hl,GameSave \ rst 20h \ bcall(_ChkFindSym)	; \
78
	jr c,StartGame					;  | check whether save file exists
79
	ld b,a \ or a \ jr z,{1@}			;  | if it doesn't skip to game start
80
	bcall(_Arc_Unarc) \ bcall(_ChkFindSym)		;  | if it does and is unarchived, skip to loading
81
@:	ex de,hl \ ld de,comboFlags			;  | if it does and is archived, unarchive it
82
	inc hl \ inc hl					;  | load the savestate into RAM
83
	ld bc,saveSize					;  |
84
	ldir						; /
85
StartGame:
86
	call renderDie
87
	call renderStats
88
	ld hl,entryMode \ set spin,(hl)		; enable spinning, but not scoring yet
89
KeywaitLoop:
90
	ld a,(kbdScanCode) \ or a \ jr z,KeywaitLoop
91
	ld hl,entryMode
92
	bit score,(hl) \ jr z,{1@}  	; if the score bit is reset, you are not allowed to score now
93-
	cp skLeft \ jp cycleLeftCombos
93+
	cp skEnter \ jp z,EnterScore
94-
	cp skRight \ jp cycleRightCombos
94+
	cp skLeft \ jr nz,$+11 \ ld hl,selectedCombo \ dec (hl) \ call calcScore \ jr KeywaitLoop
95-
	cp skEnter \ jp EnterScore
95+
	cp skRight \ jr nz,$+11 \ ld hl,selectedCombo \ inc (hl) \ call calcScore \ jr KeywaitLoop
96
	bit spin,(hl) \ jr z,KeywaitLoop	; if the spin bit is reset, you are not allowed to spin now
97
98
@:	sub 54 \ add a,5 \ jp c,holdDice
99
	add a,49
100
	cp sk2nd \ jp throwDie
101
	cp skClear \ jp QuitGame
102
	jr KeywaitLoop
103
104
holdDice:
105
	ld hl,dieValues
106
	add a,l \ ld l,a \ jr nc,$+3
107
	inc h \ ld a,(hl)
108
	xor 80h \ ld (hl),a
109
	jp KeywaitLoop
110
111
112
; ### Select Combo and Compute Score ###
113
114-
cycleLeftCombos:
114+
115-
	ld hl,selectedCombo \ dec (hl)
115+
116-
	call calcScore
116+
	ld de,dieValues-1
117
	ld bc,$0507
118-
cycleRightCombos:
118+
	inc de
119-
	ld hl,selectedCombo \ inc (hl)
119+
	ld a,(de) \ and c	; mask out the flag bits of the die
120-
	call calcScore
120+
	ld hl,ctOnes
121
	add a,l
122
	ld l,a
123
	jr nc,$+3
124
	inc h
125
	inc (hl)
126-
	call getDieValue
126+
	djnz $-11
127-
	call getDieValue
127+
128-
	call getDieValue
128+
129-
	call getDieValue
129+
130-
	call getDieValue
130+
	ld hl,jmptbl
131
	add a,a
132
	add a,l
133
	ld l,a
134-
	or a \ jr z,isThreeOnes
134+
	jr nc,$+3
135-
	cp threeTwos \ jr z,isThreeTwos
135+
	inc h
136-
	cp threeThrees \ jr z,isThreeThrees
136+
	ld a,(hl)
137-
	cp threeFours \ jr z,isThreeFours
137+
138-
	cp threeFives \ jr z,isThreeFives
138+
	ld h,(hl)
139-
	cp threeSixes \ jr z,isThreeSixes
139+
	jp (hl)
140-
	cp threeOfaKind \ jr z,isThreeOfaKind
140+
jmptbl:
141-
	cp fourOfaKind \ jr z,isFourOfaKind
141+
.dw isThreeOnes
142-
	cp fullHouse \ jr z,isFullHouse
142+
.dw isThreeTwos
143-
	cp smStraight \ jr z,isSmStraight
143+
.dw isThreeThrees
144-
	cp lgStraight \ jr z,isLgStraight
144+
.dw isThreeFours
145-
	cp chance \ jr z,sumtheDie
145+
.dw isThreeFives
146-
	cp yatzee \ jr z,isYatzee
146+
.dw isThreeSixes
147
.dw isThreeOfaKind
148
.dw isFourOfaKind
149
.dw isfullHouse
150
.dw isSmStraight
151
.dw isLgStraight
152
.dw sumtheDie
153
.dw isYatzee
154
155
calcBonuses:
156
	dec a \ ld (ptsforSelected),a
157
	call isYatzee \ or a \ jr z,{1@}
158
	dec a \ ld (rollBonuses),a
159
@:	ld a,(threesBonus) \ or a \ call z,isFullTopSix
160-
	rla \ inc a \ ret
160+
161
	call rendertPoints
162
	ret
163-
	ld b,a \ rla \ add a,b
163+
164
isThreeOnes:
165
	ld a,(ctOnes) \ inc a \ ret
166
isThreeTwos:
167-
	rla \ rla
167+
168
	add a,a \ inc a \ ret
169
isThreeThrees:
170
	ld a,(ctThrees)
171-
	ld b,a \ rla \ rla \ add a,b
171+
	ld b,a \ add a,a \ add a,b
172
	inc a \ ret
173
isThreeFours:
174
	ld a,(ctFours)
175-
	rla \ rla \ rla
175+
	add a,a \ add a,a
176
	inc a \ ret
177
isThreeFives:
178
	ld a,(ctFives)
179
	ld b,a \ add a,a \ add a,a \ add a,b
180
	inc a \ ret
181
isThreeSixes:
182
	ld a,(ctSixes)
183
	ld b,a
184
	add a,a
185
	add a,b
186
	add a,a
187-
	ld a,0
187+
188
isThreeOfaKind:
189
	ld a,2 \ jr {1@}
190
isFourOfaKind:
191
	ld a,3
192
@:	ld hl,ctOnes-1
193
	checkQuantity \ jr c,sumtheDie
194
	checkQuantity \ jr c,sumtheDie
195
	checkQuantity \ jr c,sumtheDie
196
	checkQuantity \ jr c,sumtheDie
197
	checkQuantity \ jr c,sumtheDie
198
	xor a
199
	ret
200
201
isFullHouse:
202
	ld a,2 \ ld hl,ctOnes-1
203
	checkQuantity \ jr c,{1@}
204-
	jr {2@}
204+
205
	checkQuantity \ jr c,{1@}
206-
@:	ld a,0 \ ret
206+
207
	checkQuantity \ jr c,{1@}
208
	jr {3@}
209
@:	ld a,1 \ ld hl,ctOnes-1
210
	checkQuantity \ jr c,{1@}
211
	checkQuantity \ jr c,{1@}
212
	checkQuantity \ jr c,{1@}
213
	checkQuantity \ jr c,{1@}
214
	checkQuantity \ jr c,{1@}
215
	xor a\ ret
216
@:	ld a,26 \ ret
217
218
isSmStraight:
219
	ld hl,ctOnes \ ld a,(hl)
220
	or a \ jr z,strt_start_2
221
	ld b,3
222
	inc hl \ and (hl)
223
	djnz $-2
224
	jr nz,{1@}
225
strt_start_2:
226
	inc hl \ ld a,(hl)
227
	or a \ jr z,strt_start_3
228
	ld b,3
229
	inc hl \ and (hl)
230
	djnz $-2
231
	jr nz,{}
232
strt_start_3:
233
	inc hl \ ld a,(hl)
234
	or a \ ret z
235
	ld b,3
236
	inc hl \ and (hl)
237
	djnz $-2
238
	ret z
239
@:	ld a,31 \ ret
240
241
isLgStraight
242-
@:	ld a,0 \ ret
242+
243
	or a \ jr z,strt_1_to_5
244
;strt_2_to_6:
245
	inc hl
246
strt_1_to5:
247
	ld a,(hl) \ ld b,3
248
	inc hl \ and (hl)
249
	djnz $-2
250
	ret z
251-
	ld a,0 \ ret
251+
252
253
isYatzee:
254
	ld hl,ctOnes-1 \ ld a,4
255-
	ld hl,comboScores \ ld a,0
255+
256
	checkQuantity \ jr c,{1@}
257
	checkQuantity \ jr c,{1@}
258
	checkQuantity \ jr c,{1@}
259
	checkQuantity \ jr c,{1@}
260-
	ld a,0 \ ret
260+
	xor a \ ret
261
@:	ld a,51 \ ret
262
263
isFullTopSix:
264
	ld hl,comboScores \ xor a
265
	ld b,6
266
@:	add a,(hl) \ inc hl
267-
	ld a,0 \ ld hl,dieValues
267+
268
	cp 62 \ jr c,{1@}
269
	xor a \ ret
270
@: 	ld a,1 \ ld (threesBonus),a \ ld a,35 \ ret
271-
	inc a
271+
272
273
274
275
sumtheDie:
276
	ld a,1 \ ld hl,dieValues
277-
getDieValue:
277+
278
@:	add a,(hl) \ inc hl
279-
	ld a,(hl) \ and %01111111	; reset high byte in A, not in memory
279+
280-
	cp 1 \ jr nz,{1@}
280+
281-
	ld a,(ctOnes) \ inc a \ ld (ctOnes),a \ ret
281+
282-
@:	cp 2 \ jr nz,{1@}
282+
283-
	ld a,(ctTwos) \ inc a \ ld (ctTwos),a \ ret
283+
284-
@:	cp 3 \ jr nz,{1@}
284+
285-
	ld a,(ctThrees) \ inc a \ ld (ctThrees),a \ ret
285+
286-
@:	cp 4 \ jr nz,{1@}
286+
287-
	ld a,(ctFours) \ inc a \ ld (ctFours),a \ ret
287+
288-
@:	cp 5 \ jr nz,{1@}
288+
289-
	ld a,(ctFives) \ inc a \ ld (ctFives),a \ ret
289+
	call roll
290-
@:	cp 6 \ ret nz
290+
	call roll
291-
	ld a,(ctSixes) \ inc a \ ld (ctSixes),a \ ret
291+
	call roll
292
	call roll
293
	call roll
294
	call renderDie
295
	ld hl,entryMode \ set score,(hl)	; allow scoring once die rolled
296
	ld hl,curRolls \ inc (hl)		; increment number of rolls by one
297
	ld a,3 \ sub (hl) \ jr nz,KeywaitLoop	; if rolls != 3, leave routine
298
	ld hl,entryMode \ res spin,(hl)		; if rolls = 3, disable rolling
299
	jr KeywaitLoop
300-
    	call roll
300+
301-
    	call roll
301+
302-
    	call roll
302+
303-
   	call roll
303+
304-
    	call roll
304+
305-
    	call renderDie
305+
306-
    	ld hl,entryMode \ set score,(hl)	; allow scoring once die rolled
306+
307-
    	ld hl,curRolls \ inc (hl)		; increment number of rolls by one
307+
308-
    	ld a,3 \ sub (hl) \ jr nz,KeywaitLoop	; if rolls != 3, leave routine
308+
	inc a \ jr z,{1@}
309-
    	ld hl,entryMode \ res spin,(hl)		; if rolls = 3, disable rolling
309+
310-
    	jr KeywaitLoop
310+
311
	add hl,bc		; add score to game score
312
	xor a
313
	ld b,a \ ld c,(rollBonuses)
314
	add hl,bc		; add bonuses to game score
315
	ld (gameScore),hl	; write new score back
316
	ld hl,entryMode \ res score,(hl) \ set spin,(hl)	; disable scoring, enable spinning
317
	ld (curRolls),a			; set back to 0 rolls
318
@:	jp KeywaitLoop
319-
	cp -1 \ jr z,{1@}
319+
320
QuitGame:
321
	ld hl,GameSave \ rst 20h \ bcall(_ChkFindSym)
322
	jr nc,{1@}					; if save exists already, skip to saving
323-
	ld b,0 \ ld c,(rollBonuses)
323+
324
@:	ld hl,comboFlags \ inc de \ inc de		; set read address to RAM state, set write address to after size word
325
	ld bc,saveSize \ ldir				; set size, load
326
	bcall(_ClrLCDFull)				; clear screen
327-
	ld a,0 \ ld (curRolls),a			; set back to 0 rolls
327+
328
	ret						; exit game
329
330
renderDie:
331
	ld hl,Sprites
332
333
	ret
334
335
renderStats:
336
337
	ret
338
339
340
341
rendertPoints:
342
	ld a,(selectedCombo)
343
	ld hl,ComboNameText \ ld b,a
344
	or a \ jr z,{2@}
345
@:	add hl,7
346
	djnz {-1@}	
347
@:	; set penCol and penRow
348
	bcall(_vPutS)
349
	ld a,(ptsforSelected)
350
	; convert byte value into text string
351
	ret
352
353
die_setZero:
354
	ld hl,dieValues		; set read address to dieValues
355
	xor a \ ld (hl),a	; set dieValues to 0
356
	ld de,dieValues+1	; set write address to dieValues+1
357
	ld bc,4 \ ldir		; copy 4 bytes from read address to write address
358
	ret
359
360
zeroData:
361
	xor a
362
	ld (hl),a \ inc hl
363
	djnz zeroData
364
	ret
365-
	ld a,0 \ ld (hl),a	; set dieValues to 0
365+
366
; ########################
367
; Random Number Generator
368
; ########################
369
370
prng16:
371-
	ld a,0
371+
372
;;Output:
373
;;    HL is a pseudo-random int
374
;;    A and BC are also, but much weaker and smaller cycles
375
;;    Preserves DE
376
;;148cc, super fast
377
;;26 bytes
378
;;period length: 4,294,901,760
379
seed1=$+1
380
    ld hl,9999
381
    ld b,h
382
    ld c,l
383
    add hl,hl
384
    add hl,hl
385
    inc l
386
    add hl,bc
387
    ld (seed1),hl
388
seed2=$+1
389
    ld hl,987
390
    add hl,hl
391
    sbc a,a
392
    and %00101101
393
    xor l
394
    ld l,a
395
    ld (seed2),hl
396
    add hl,bc
397
    ret
398
roll:
399
;;Input: A is the range.
400
;;Output: Returns in A a random number from 0 to B-1.
401
;;  B=0
402
;;  DE is not changed
403
;;Destroys:
404
;;  HL
405
;;Speed:
406
;;  322cc to 373cc, 347.5cc average
407
     inc hl
408
     ld a,(hl) \ add a,a
409
     ret nc
410
     push hl
411
     call prng16
412
     ld l,h \ ld h,0
413
     ld b,h \ ld c,l
414
     add hl,hl \ add hl,bc \ add hl,hl
415
     inc h \ ld a,h
416
     pop hl
417
     ld (hl),a
418
     ret
419
420
; ########################
421
; ## Rendering Routines ##
422
; ########################
423
424
drawSprite_6_Bit:
425
	ld a,d \ add a,$79	; Y coord into A
426
	ld b,12			; Loop this 12 times
427
drawSprite_outerloop:
428
	inc a \ push af
429
	out ($10),a \ call lcdwait
430
	ld a,e \ add a,$20
431
	out ($10),a \ call lcdwait	; use outi instead
432
	ld c,$11
433
	outi \ call lcdwait
434
	outi \ call lcdwait
435
	pop bc \ pop af
436
	djnz drawSprite_outerloop
437
438
439
440
441
442
443
444
445
lcdwait:
446
	in a,($10) ;bit 7 set if LCD is busy
447
	rla \ jr c,lcdwait
448
	ret
449
450
451
452
GameSave:
453
.db AppVarObj,"YatSave",0
454
455
ComboNameText:
456
.db "Ones  ",0
457
.db "Twos  ",0
458
.db "Threes",0
459
.db "Fours ",0
460
.db "Fives ",0
461
.db "Sixes ",0
462
.db "3.of.a",0
463
.db "4.of.a.",0
464
.db "F.Hse.",0
465
.db "Sm.St.",0
466
.db "Lg.St.",0
467
.db "Chance",0
468
.db "Yatzee",0
469
470
471
Sprites:
472
; empty die
473
.db %11111111,%11110000
474
.db %10000000,%00010000
475
.db %10000000,%00010000
476
.db %10000000,%00010000
477
.db %10000000,%00010000
478
.db %10000000,%00010000
479
.db %10000000,%00010000
480
.db %10000000,%00010000
481
.db %10000000,%00010000
482
.db %10000000,%00010000
483
.db %10000000,%00010000
484
.db %11111111,%11110000
485
; one die
486
.db %11111111,%11110000
487
.db %10000000,%00010000
488
.db %10000000,%00010000
489
.db %10000000,%00010000
490
.db %10000000,%00010000
491
.db %10000110,%00010000
492
.db %10000110,%00010000
493
.db %10000000,%00010000
494
.db %10000000,%00010000
495
.db %10000000,%00010000
496
.db %10000000,%00010000
497
.db %11111111,%11110000
498
; two die
499
.db %11111111,%11110000
500
.db %10000000,%00010000
501
.db %10000000,%00010000
502
.db %10000110,%00010000
503
.db %10000110,%00010000
504
.db %10000000,%00010000
505
.db %10000000,%00010000
506
.db %10000110,%00010000
507
.db %10000110,%00010000
508
.db %10000000,%00010000
509
.db %10000000,%00010000
510
.db %11111111,%11110000
511
; three die
512
.db %11111111,%11110000
513
.db %10000000,%00010000
514
.db %10000000,%11010000
515
.db %10000000,%11010000
516
.db %10000000,%00010000
517
.db %10000110,%00010000
518
.db %10000110,%00010000
519
.db %10000000,%00010000
520
.db %10110000,%00010000
521
.db %10110000,%00010000
522
.db %10000000,%00010000
523
.db %11111111,%11110000
524
; four die
525
.db %11111111,%11110000
526
.db %10000000,%00010000
527
.db %10110000,%11010000
528
.db %10110000,%11010000
529
.db %10000000,%00010000
530
.db %10000000,%00010000
531
.db %10000000,%00010000
532
.db %10000000,%00010000
533
.db %10110000,%11010000
534
.db %10110000,%11010000
535
.db %10000000,%00010000
536
.db %11111111,%11110000
537
; five die
538
.db %11111111,%11110000
539
.db %10000000,%00010000
540
.db %10011001,%10010000
541
.db %10011001,%10010000
542
.db %10000000,%00010000
543
.db %10000110,%00010000
544
.db %10000110,%00010000
545
.db %10000000,%00010000
546
.db %10011001,%10010000
547
.db %10011001,%10010000
548
.db %10000000,%00010000
549
.db %11111111,%11110000
550
; six die
551
.db %11111111,%11110000
552
.db %10000000,%00010000
553
.db %10011001,%10010000
554
.db %10011001,%10010000
555
.db %10000000,%00010000
556
.db %10011001,%10010000
557
.db %10011001,%10010000
558
.db %10000000,%00010000
559
.db %10011001,%10010000
560
.db %10011001,%10010000
561
.db %10000000,%00010000
562
.db %11111111,%11110000