Advertisement
AnthonyCagliano

Yatzee compiled source

Jan 9th, 2016
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.68 KB | None | 0 0
  1. ; Yatzee for TI-83+/84+
  2. ; Version 1.0
  3. ; by ACagliano (http://clrhome.org)
  4.  
  5. .variablename "YATZEE"
  6. .nolist
  7. #include "ti83plus.inc"
  8. #include "dcs7.inc"
  9. .list
  10. ; defines/equates
  11. #define diceOne 0
  12. #define diceTwo 1
  13. #define diceThree 2
  14. #define diceFour 3
  15. #define diceFive 4
  16. #define diceSix 5
  17. #define comboScores saferam1
  18. #define threeOnes 0
  19. #define threeTwos 1
  20. #define threeThrees 2
  21. #define threeFours 3
  22. #define threeFives 4
  23. #define threeSixes 5
  24. #define threeOfaKind 6
  25. #define fourOfaKind 7
  26. #define fullHouse 8
  27. #define smStraight 9
  28. #define lgStraight 10
  29. #define chance 11
  30. #define yatzee 12
  31. #define threesBonus 13
  32. #define gameScore comboScores+threesBonus
  33. #define entryMode gameScore+2
  34. #define spin 0
  35. #define score 1
  36. #define highScore entryMode+1
  37. #define curRolls highScore+2
  38. #define dieValues curRolls+1
  39. #define dieHoldFlags dieValues+5
  40. #define threesPoints dieHoldFlags+1
  41. #define saveSize threesPoints-comboScores
  42.  
  43. #define selectedCombo dieHoldFlags+1
  44. #define ptsforSelected selectedCombo+1
  45. #define rollBonuses ptsforSelected+2
  46. #define ctOnes rollBonuses+1
  47. #define ctTwos ctOnes+1
  48. #define ctThrees ctTwos+1
  49. #define ctFours ctThrees+1
  50. #define ctFives ctFours+1
  51. #define ctSixes ctFives+1
  52.  
  53.  
  54. .org ProgStart - 2
  55. .db t2ByteTok, tAsmCmp
  56.  
  57. Start:
  58. bcall(_ClrLCDFull)
  59. ld a,r ;\
  60. ld h,a ; |
  61. xor 77 ; |Seed the RNG
  62. ld l,a ; |
  63. ld (seed1),hl ; |
  64. ld (seed2),hl ;/
  65.  
  66. res textWrite,(iy+sGrFlags)
  67. ld ix,dieValues ; set IX to 5-byte die roll values
  68.  
  69. ld hl,gameScore \ ld b,ctSixes-comboScores \ call zeroData ; zero the RAM savestate
  70.  
  71. ld hl,GameSave \ rst 20h \ bcall(_ChkFindSym) ; \
  72. jr c,StartGame ; | check whether save file exists
  73. ld a,b \ or a \ jr z,{1@} ; | if it doesn't skip to game start
  74. bcall(_Arc_Unarc) \ bcall(_ChkFindSym) ; | if it does and is unarchived, skip to loading
  75. @: ex de,hl \ ld de,comboScores ; | if it does and is archived, unarchive it
  76. inc hl \ inc hl ; | load the savestate into RAM
  77. ld bc,saveSize ; |
  78. ldir ; /
  79. StartGame:
  80. call renderDie
  81. call renderScore
  82. ld hl,entryMode \ set spin,(hl) ; enable spinning, but not scoring yet
  83. KeywaitLoop:
  84. ld a,(kbdScanCode) \ or a \ jr z,KeywaitLoop
  85. cp skClear \ jp QuitGame
  86. ; cp skMode \ jp renderInstructions
  87. ld hl,entryMode
  88. bit score,(hl) \ jr z,{1@} ; if the score bit is reset, you are not allowed to score now
  89. cp skEnter \ jp z,EnterScore
  90. cp skLeft \ jr nz,$+11 \ ld hl,selectedCombo \ dec (hl) \ call calcScore \ jr KeywaitLoop
  91. cp skRight \ jr nz,$+11 \ ld hl,selectedCombo \ inc (hl) \ call calcScore \ jr KeywaitLoop
  92. bit spin,(hl) \ jr z,KeywaitLoop ; if the spin bit is reset, you are not allowed to spin now
  93.  
  94. @: sub 54 \ add a,5 \ jp c,holdDice
  95. add a,49
  96. cp sk2nd \ jp throwDie
  97. jr KeywaitLoop
  98.  
  99. holdDice:
  100. ld hl,dieValues
  101. push af
  102. add a,l \ ld l,a \ jr nc,$+3
  103. inc h \ ld a,(hl)
  104. xor 80h \ ld (hl),a
  105. pop af \ or a \ jr z,{2@} \ ld b,a
  106. ld a,10
  107. @: add a,16
  108. djnz {-1@}
  109. ld h,a \ ld l,52
  110. ld (penCol),hl
  111. push hl \ ld hl,$+3 \ bcall(_vPutS)
  112. .db " ",0
  113. pop hl \ ld (penCol),hl
  114. ld hl,$+3 \ bcall(_vPutS)
  115. .db "Hold",0
  116. jp KeywaitLoop
  117.  
  118.  
  119. ; ### Select Combo and Compute Score ###
  120.  
  121.  
  122. calcScore:
  123. #define checkQuantity inc hl \ sub (hl)
  124. ld hl,dieValues-1
  125. ld bc,$0507
  126. inc de
  127. ld a,(de) \ and c ; mask out the flag bits of the die
  128. ld hl,ctOnes
  129. add a,l
  130. ld l,a
  131. jr nc,$+3
  132. inc h
  133. inc (hl)
  134. djnz $-11
  135. ; call getDieValue
  136. ; call getDieValue
  137. ; call getDieValue
  138. ; call getDieValue
  139. ; call getDieValue
  140. ; now we test the combo that is active. Score is either returned, or 0.
  141. ld hl,calcBonuses \ push hl ; we do this so we can use ret at the end of the routines ahead and it acts like a jump
  142. ld a,(selectedCombo)
  143. ld hl,jmptbl
  144. add a,a
  145. add a,l
  146. ld l,a
  147. jr nc,$+3
  148. inc h
  149. ld a,(hl)
  150. inc hl
  151. ld h,(hl)
  152. jp (hl)
  153. jmptbl:
  154. .dw isThreeOnes
  155. .dw isThreeTwos
  156. .dw isThreeThrees
  157. .dw isThreeFours
  158. .dw isThreeFives
  159. .dw isThreeSixes
  160. .dw isThreeOfaKind
  161. .dw isFourOfaKind
  162. .dw isfullHouse
  163. .dw isSmStraight
  164. .dw isLgStraight
  165. .dw sumtheDie
  166. .dw isYatzee
  167. calcBonuses:
  168. dec a \ ld (ptsforSelected),a
  169. call isYatzee \ or a \ jr z,{1@}
  170. dec a \ ld (rollBonuses),a
  171. @: ld a,(threesBonus) \ or a \ call z,isFullTopSix
  172. ld hl,rollBonuses \ add a,(hl)
  173. call rendertPoints
  174. ret
  175.  
  176. isThreeOnes:
  177. ld a,(ctOnes) \ inc a \ ret
  178. isThreeTwos:
  179. ld a,(ctTwos)
  180. add a,a \ inc a \ ret
  181. isThreeThrees:
  182. ld a,(ctThrees)
  183. ld b,a \ add a,a \ add a,b
  184. inc a \ ret
  185. isThreeFours:
  186. ld a,(ctFours)
  187. add a,a \ add a,a
  188. inc a \ ret
  189. isThreeFives:
  190. ld a,(ctFives)
  191. ld b,a \ add a,a \ add a,a \ add a,b
  192. inc a \ ret
  193. isThreeSixes:
  194. ld a,(ctSixes)
  195. ld b,a
  196. add a,a
  197. add a,b
  198. add a,a
  199. inc a \ ret
  200. isThreeOfaKind:
  201. ld a,2 \ jr {1@}
  202. isFourOfaKind:
  203. ld a,3
  204. @: ld hl,ctOnes-1
  205. checkQuantity \ jp c,sumtheDie
  206. checkQuantity \ jp c,sumtheDie
  207. checkQuantity \ jp c,sumtheDie
  208. checkQuantity \ jp c,sumtheDie
  209. checkQuantity \ jp c,sumtheDie
  210. ld a,0
  211. ret
  212.  
  213. isFullHouse:
  214. ld a,2 \ ld hl,ctOnes-1
  215. checkQuantity \ jr c,{1@}
  216. checkQuantity \ jr c,{1@}
  217. checkQuantity \ jr c,{1@}
  218. checkQuantity \ jr c,{1@}
  219. checkQuantity \ jr c,{1@}
  220. jr {3@}
  221. @: ld a,1 \ ld hl,ctOnes-1
  222. checkQuantity \ jr c,{1@}
  223. checkQuantity \ jr c,{1@}
  224. checkQuantity \ jr c,{1@}
  225. checkQuantity \ jr c,{1@}
  226. checkQuantity \ jr c,{1@}
  227. jr {2@}
  228. @: ld a,26 \ ret
  229. @: ld a,0 \ ret
  230.  
  231. isSmStraight:
  232. ld hl,ctOnes \ ld a,(hl)
  233. or a \ jr z,strt_start_2
  234. ld b,3
  235. inc hl \ and (hl)
  236. djnz $-2
  237. jr nz,{1@}
  238. strt_start_2:
  239. inc hl \ ld a,(hl)
  240. or a \ jr z,strt_start_3
  241. ld b,3
  242. inc hl \ and (hl)
  243. djnz $-2
  244. jr nz,{1@}
  245. strt_start_3:
  246. inc hl \ ld a,(hl)
  247. or a \ ret z
  248. ld b,3
  249. inc hl \ and (hl)
  250. djnz $-2
  251. ret z
  252. @: ld a,31 \ ret
  253.  
  254. isLgStraight
  255. ld hl,ctOnes \ ld a,(hl)
  256. or a \ jr z,strt_1_to_5
  257. ;strt_2_to_6:
  258. inc hl
  259. strt_1_to_5:
  260. ld a,(hl) \ ld b,3
  261. inc hl \ and (hl)
  262. djnz $-2
  263. ret z
  264. ld a,41 \ ret
  265. @: ld a,0 \ ret
  266.  
  267. isYatzee:
  268. ld hl,ctOnes-1 \ ld a,4
  269. checkQuantity \ jr c,{1@}
  270. checkQuantity \ jr c,{1@}
  271. checkQuantity \ jr c,{1@}
  272. checkQuantity \ jr c,{1@}
  273. checkQuantity \ jr c,{1@}
  274. ld a,0 \ ret
  275. @: ld a,51 \ ret
  276.  
  277. isFullTopSix:
  278. ld hl,comboScores \ xor a
  279. ld b,6
  280. @: inc a \ jr z,$+3 \ add a,(hl) \ inc hl
  281. djnz {-1@}
  282. cp 62 \ jr c,{1@}
  283. ld a,0 \ ret
  284. @: ld a,1 \ ld (threesBonus),a \ ld a,35 \ ret
  285.  
  286.  
  287.  
  288.  
  289. sumtheDie:
  290. ld a,0 \ ld hl,dieValues
  291. ld b,5
  292. @: add a,(hl) \ inc hl
  293. djnz {-1@}
  294. inc a
  295. ret
  296.  
  297.  
  298.  
  299. throwDie:
  300. ; randomize the value of each die, if the hold flag for that die is not set
  301. ld hl,dieValues-1
  302. call roll
  303. call roll
  304. call roll
  305. call roll
  306. call roll
  307. call renderDie
  308. ld hl,entryMode \ set score,(hl) ; allow scoring once die rolled
  309. ld hl,curRolls \ inc (hl) ; increment number of rolls by one
  310. ld a,3 \ sub (hl) \ jp nz,KeywaitLoop ; if rolls != 3, leave routine
  311. ld hl,entryMode \ res spin,(hl) ; if rolls = 3, disable rolling
  312. jp KeywaitLoop
  313.  
  314.  
  315. EnterScore:
  316. ld hl,comboScores
  317. ld a,(selectedCombo) \ ld c,a \ ld b,0
  318. add hl,bc
  319. ld a,(hl) \ or a \ jr nz,{1@}
  320. ld a,(ptsforSelected) \ ld (hl),a
  321. inc a \ jr z,{1@}
  322. ld hl,(gameScore)
  323. ld bc,(ptsforSelected)
  324. add hl,bc ; add score to game score
  325. xor a \ ld b,a \ ld a,(rollBonuses) \ ld c,a
  326. add hl,bc ; add bonuses to game score
  327. ld (gameScore),hl ; write new score back
  328. ld hl,entryMode \ res score,(hl) \ set spin,(hl) ; disable scoring, enable spinning
  329. ld a,0 \ ld (curRolls),a ; set back to 0 rolls
  330. call renderScore
  331. @: jp KeywaitLoop
  332.  
  333. QuitGame:
  334. ld hl,GameSave \ rst 20h \ bcall(_ChkFindSym)
  335. jr nc,{1@} ; if save exists already, skip to saving
  336. ld hl,saveSize \ bcall(_CreateAppVar) ; if it doesn't, create it
  337. @: ld hl,comboScores \ inc de \ inc de ; set read address to RAM state, set write address to after size word
  338. ld bc,saveSize \ ldir ; set size, load
  339. bcall(_ClrLCDFull) ; clear screen
  340. ret ; exit game
  341.  
  342. renderDie:
  343. ld hl,dieValues-1 \ ld b,5
  344. @: inc hl \ ld a,(hl)
  345. ld c,a
  346. add a,a
  347. add a,c
  348. add a,a
  349. add a,a
  350. add a,a
  351. ld hl,Sprites
  352. add a,l
  353. ld l,a
  354. jr nc,$+3
  355. inc h
  356. ld d,$40 \ ld e,$01
  357. call drawSprite_6_Bit
  358. inc e \ inc e \ djnz {-1@}
  359. ret
  360.  
  361.  
  362. renderScore:
  363. res fracDrawLFont, (iy + fontFlags) ; set small font
  364. xor a \ ld (penCol),a \ ld (penRow),a
  365. ld hl,$+3 \ bcall(_vPutS)
  366. .db "HS: ",0
  367. ld hl,(highScore) \ call HL2str
  368. bcall(_vPutS)
  369. set fracDrawLFont, (iy + fontFlags) ; set large font
  370. ld hl,(gameScore)
  371. call HL2str
  372. ld a,10 \ ld (penRow),a \ xor a \ ld (penCol),a
  373. bcall(_vPutS)
  374. ret
  375.  
  376.  
  377.  
  378. rendertPoints:
  379. ld a,(selectedCombo)
  380. ld b,a
  381. add a,a \ add a,a \ add a,a \ sub b
  382. ld c,a \ xor b
  383. @: ld hl,ComboNameText \ add hl,bc
  384. djnz {-1@}
  385. @: res fracDrawLFont, (iy + fontFlags) ; set small font
  386. ld a,0 \ ld (penRow),a
  387. ld a,48 \ ld (penCol),a
  388. bcall(_vPutS)
  389. ld hl,penCol \ inc (hl) \ inc (hl) \ inc (hl) \ inc (hl)
  390. ld a,(ptsforSelected) \ ld l,a \ ld h,0 \ call HL2str
  391. bcall(_vPutS)
  392. ld a,(rollBonuses) \ or a \ ret z
  393. ld l,a \ ld h,0 \ call HL2str
  394. ld a,7 \ ld (penRow),a
  395. ld a,48 \ ld (penCol),a
  396. bcall(_vPutS)
  397. ret
  398.  
  399. die_setZero:
  400. ld hl,dieValues ; set read address to dieValues
  401. ld a,0 \ ld (hl),a ; set dieValues to 0
  402. ld de,dieValues+1 ; set write address to dieValues+1
  403. ld bc,4 \ ldir ; copy 4 bytes from read address to write address
  404. ret
  405.  
  406. zeroData:
  407. ld a,0
  408. ld (hl),a \ inc hl
  409. djnz zeroData
  410. ret
  411.  
  412. ; ########################
  413. ; Random Number Generator
  414. ; ########################
  415.  
  416. prng16:
  417. ;collab with Runer112
  418. ;;Output:
  419. ;; HL is a pseudo-random int
  420. ;; A and BC are also, but much weaker and smaller cycles
  421. ;; Preserves DE
  422. ;;148cc, super fast
  423. ;;26 bytes
  424. ;;period length: 4,294,901,760
  425. seed1=$+1
  426. ld hl,9999
  427. ld b,h
  428. ld c,l
  429. add hl,hl
  430. add hl,hl
  431. inc l
  432. add hl,bc
  433. ld (seed1),hl
  434. seed2=$+1
  435. ld hl,987
  436. add hl,hl
  437. sbc a,a
  438. and %00101101
  439. xor l
  440. ld l,a
  441. ld (seed2),hl
  442. add hl,bc
  443. ret
  444. roll:
  445. ;;Input: A is the range.
  446. ;;Output: Returns in A a random number from 0 to B-1.
  447. ;; B=0
  448. ;; DE is not changed
  449. ;;Destroys:
  450. ;; HL
  451. ;;Speed:
  452. ;; 322cc to 373cc, 347.5cc average
  453. inc hl
  454. ld a,(hl) \ add a,a
  455. ret nc
  456. push hl
  457. call prng16
  458. ld l,h \ ld h,0
  459. ld b,h \ ld c,l
  460. add hl,hl \ add hl,bc \ add hl,hl
  461. inc h \ ld a,h
  462. pop hl
  463. ld (hl),a
  464. ret
  465.  
  466. ; ########################
  467. ; ## Rendering Routines ##
  468. ; ########################
  469. ;
  470. ; input: d = row, e = column
  471.  
  472. drawSprite_6_Bit:
  473. ld a,d \ add a,$79 ; Y coord into A
  474. ld b,12 ; Loop this 12 times
  475. drawSprite_outerloop:
  476. inc a \ push af
  477. out ($10),a \ call lcdwait
  478. ld a,e \ add a,$20
  479. out ($10),a \ call lcdwait ; use outi instead
  480. ld c,$11
  481. outi \ call lcdwait
  482. outi \ call lcdwait
  483. pop bc \ pop af
  484. djnz drawSprite_outerloop
  485. ret
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494. lcdwait:
  495. in a,($10) ;bit 7 set if LCD is busy
  496. rla \ jr c,lcdwait
  497. ret
  498.  
  499.  
  500.  
  501. HL2str:
  502. ld de,OP1+6
  503. ld c,10
  504. xor a
  505. ld (de),a
  506. @:
  507. dec de
  508. ld b,13
  509. xor a
  510. add hl,hl \ rla
  511. add hl,hl \ rla
  512. add hl,hl \ rla
  513. add hl,hl \ rla \ cp c \ jr c,$+4 \ inc l \ sub c
  514. djnz $-7
  515. add a,$30
  516. ld (de),a
  517. ld a,h
  518. or l
  519. jr nz,{-1@}
  520. ex de,hl
  521. ret
  522.  
  523.  
  524. GameSave:
  525. .db AppVarObj,"YatSave",0
  526.  
  527. ComboNameText:
  528. .db "Ones ",0
  529. .db "Twos ",0
  530. .db "Threes",0
  531. .db "Fours ",0
  532. .db "Fives ",0
  533. .db "Sixes ",0
  534. .db "3.of.a",0
  535. .db "4.of.a.",0
  536. .db "F.Hse.",0
  537. .db "Sm.St.",0
  538. .db "Lg.St.",0
  539. .db "Chance",0
  540. .db "Yatzee",0
  541.  
  542.  
  543. Sprites:
  544. .db %11111111,%11110000
  545. .db %10000000,%00010000
  546. .db %10000000,%00010000
  547. .db %10000000,%00010000
  548. .db %10000000,%00010000
  549. .db %10000000,%00010000
  550. .db %10000000,%00010000
  551. .db %10000000,%00010000
  552. .db %10000000,%00010000
  553. .db %10000000,%00010000
  554. .db %10000000,%00010000
  555. .db %11111111,%11110000
  556. ;sprite_OneDie:
  557. .db %11111111,%11110000
  558. .db %10000000,%00010000
  559. .db %10000000,%00010000
  560. .db %10000000,%00010000
  561. .db %10000000,%00010000
  562. .db %10000110,%00010000
  563. .db %10000110,%00010000
  564. .db %10000000,%00010000
  565. .db %10000000,%00010000
  566. .db %10000000,%00010000
  567. .db %10000000,%00010000
  568. .db %11111111,%11110000
  569. ;sprite_TwoDie:
  570. .db %11111111,%11110000
  571. .db %10000000,%00010000
  572. .db %10000000,%00010000
  573. .db %10000110,%00010000
  574. .db %10000110,%00010000
  575. .db %10000000,%00010000
  576. .db %10000000,%00010000
  577. .db %10000110,%00010000
  578. .db %10000110,%00010000
  579. .db %10000000,%00010000
  580. .db %10000000,%00010000
  581. .db %11111111,%11110000
  582. ; three die
  583. .db %11111111,%11110000
  584. .db %10000000,%00010000
  585. .db %10000000,%11010000
  586. .db %10000000,%11010000
  587. .db %10000000,%00010000
  588. .db %10000110,%00010000
  589. .db %10000110,%00010000
  590. .db %10000000,%00010000
  591. .db %10110000,%00010000
  592. .db %10110000,%00010000
  593. .db %10000000,%00010000
  594. .db %11111111,%11110000
  595. ; four die
  596. .db %11111111,%11110000
  597. .db %10000000,%00010000
  598. .db %10110000,%11010000
  599. .db %10110000,%11010000
  600. .db %10000000,%00010000
  601. .db %10000000,%00010000
  602. .db %10000000,%00010000
  603. .db %10000000,%00010000
  604. .db %10110000,%11010000
  605. .db %10110000,%11010000
  606. .db %10000000,%00010000
  607. .db %11111111,%11110000
  608. ; five die
  609. .db %11111111,%11110000
  610. .db %10000000,%00010000
  611. .db %10011001,%10010000
  612. .db %10011001,%10010000
  613. .db %10000000,%00010000
  614. .db %10000110,%00010000
  615. .db %10000110,%00010000
  616. .db %10000000,%00010000
  617. .db %10011001,%10010000
  618. .db %10011001,%10010000
  619. .db %10000000,%00010000
  620. .db %11111111,%11110000
  621. ; six die
  622. .db %11111111,%11110000
  623. .db %10000000,%00010000
  624. .db %10011001,%10010000
  625. .db %10011001,%10010000
  626. .db %10000000,%00010000
  627. .db %10011001,%10010000
  628. .db %10011001,%10010000
  629. .db %10000000,%00010000
  630. .db %10011001,%10010000
  631. .db %10011001,%10010000
  632. .db %10000000,%00010000
  633. .db %11111111,%11110000
  634.  
  635. .end
  636. .END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement