home *** CD-ROM | disk | FTP | other *** search
/ ticalc.org / ticalc_org_rev_b.iso / archives / 85 / asm / source / usgard / pente1bl.asm < prev    next >
Encoding:
Assembly Source File  |  2001-07-01  |  17.6 KB  |  1,143 lines

  1. ;            ***************************************
  2. ;            ***                                 ***
  3. ;            ***  PPPP               t           ***
  4. ;            ***  P   P              t           ***
  5. ;            ***  P   P  eee  n nn  ttt    eee   ***
  6. ;            ***  PPPP  e   e nn  n  t    e   e  ***
  7. ;            ***  P     eeeee n   n  t    eeeee  ***
  8. ;            ***  P     e     n   n  t  t e      ***
  9. ;            ***  P      eee  n   n   tt   eee   ***
  10. ;            ***                                 ***
  11. ;            ***   v1.0b Lite by Nick Blizard    ***
  12. ;            ***            11/14/97             ***
  13. ;            ***          Usgard v1.1+           ***
  14. ;            ***                                 ***
  15. ;            ***************************************
  16. ;
  17. ;Here is the source to Pente v0.10b Lite, remember to give me credit for anything you use.
  18. ;Any problems contact me at     nblizard@bellsouth.net
  19. ;
  20. ;Goals : AI , Link Play , Clean up Code , Add more comments
  21.  
  22.  
  23. #include "usgard.h"
  24.  
  25.  
  26. CURX1      = TEXT_MEM       ;cursor's x position in pixels  :  1 byte
  27. CURY1      = TEXT_MEM+1     ;cursor's y position in pixels  :  1 byte
  28. PTURN      = TEXT_MEM+2     ;determines which player's turn it is , 0=P1 , 1=P2  :  1 byte
  29. BOARD      = TEXT_MEM2      ;game board  :  160 bytes
  30. CURX2      = TEXT_MEM+3     ;cursor's x position relative to board  :  1 byte
  31. CURY2      = TEXT_MEM+4     ;cursor's y position relative to board  :  1 byte
  32. TEMP1      = TEXT_MEM+5     ;temporary variable #1  :  1 byte
  33. TEMP2      = TEXT_MEM+6     ;    "        "     #2  :  1 byte
  34. TEMP3      = TEXT_MEM+18    ;    "        "     #3  :  1 byte
  35. PTURN2     = TEXT_MEM+7     ;player's turn in game peice fashion(see below)
  36. LPTURN     = TEXT_MEM+8     ;last player's turn in game peice fashion  ,  1=P1  ,  2=P2  :  1 byte
  37. CC         = TEXT_MEM+9     ;round of check capture your on  :  1 byte
  38. QPOS1X     = TEXT_MEM+10    ;position one queud to capture X  : 1 byte
  39. QPOS1Y     = TEXT_MEM+11    ;position one queud to capture Y  :  1 byte
  40. QPOSONE    = TEXT_MEM+12    ;position one queud to capture  :  1 byte
  41. QPOS2X     = TEXT_MEM+13    ;position two queud to capture X  :  1 byte
  42. QPOS2Y     = TEXT_MEM+14    ;position two queud to capture Y  :  1 byte
  43. QPOSTWO    = TEXT_MEM+15    ;position twp queud to capture  :  1 byte
  44. CAPPOS1    = TEXT_MEM+16    ;start position of where captured peices go for player 1  :  1 byte
  45. CAPPOS2    = TEXT_MEM+17    ;  "      "     "    "      "       "    "   "    "    2  :  1 byte
  46.  
  47.  
  48. .org 0
  49. .db "v1.0b Lite  by Nick Blizard",0
  50.  
  51.  
  52. Init:
  53.   call CLEARLCD
  54.   ld a,4
  55.   out (5),a
  56.   ld a,44
  57.   ld (CURX1),a
  58.   ld a,26
  59.   ld (CURY1),a
  60.   ld a,7
  61.   ld (CURX2),a
  62.   ld a,4
  63.   ld (CURY2),a
  64.   ld a,20
  65.   ld (CAPPOS1),a
  66.   ld (CAPPOS2),a
  67.   ld a,r
  68.   and %00000001
  69.   ld (PTURN),a
  70. Start:
  71.   call CLEARLCD
  72.   call &OpeningScreen
  73.   call CLEARLCD
  74.   call &ClearBoardMem
  75.   call &DrawBoard
  76. StartLoop1:
  77.   call &Turn
  78.   call &CursorMain
  79.   jp &CheckDuplicate
  80. CDLoop:
  81.   call &GamePeice
  82.   jp &CheckCapture
  83. CCLoop:
  84.   jp &CheckWin
  85. CWRet:
  86.   jp &StartLoop1
  87.  
  88.  
  89. ;*** Subroutine to make board mem all zeros ***
  90. ClearBoardMem:
  91.   ld a,0
  92. CBMLoop1:
  93.   ld hl,BOARD
  94.   ld c,a
  95.   ld b,0
  96.   add hl,bc
  97.   ld b,h
  98.   ld c,l
  99.   push af
  100.   ld a,0
  101.   ld (bc),a
  102.   pop af
  103.   inc a
  104.   ld b,160
  105.   cp b
  106.   ret z
  107.   jp &CBMLoop1
  108.  
  109. ;*** Subroutine to draw the playing board and the other pics on the main screen ***
  110. ;--- draw vertical lines ---
  111. DrawBoard:
  112.   ld d,-4
  113.   ld e,2
  114.   ld h,-4
  115.   ld l,56
  116. BoardLoop1:
  117.   ld a,d
  118.   add a,6
  119.   ld d,a
  120.   ld a,h
  121.   add a,6
  122.   ld h,a
  123. #fncall fline
  124.   ld a,d
  125.   ld b,a
  126.   ld a,92
  127.   cp b
  128.   jp nz,&BoardLoop1
  129. ;--- draw horizontal lines ---
  130.   ld d,2
  131.   ld e,-4
  132.   ld h,92
  133.   ld l,-4
  134. BoardLoop2:
  135.   ld a,e
  136.   add a,6
  137.   ld e,a
  138.   ld a,l
  139.   add a,6
  140.   ld l,a
  141. #fncall fline
  142.   ld a,e
  143.   ld b,a
  144.   ld a,56
  145.   cp b
  146.   jp nz,&BoardLoop2
  147. ;--- draw other lines ---
  148.   ld d,95
  149.   ld e,0
  150.   ld h,95
  151.   ld l,63
  152. #fncall fline
  153.   ld d,96
  154.   ld e,50
  155.   ld h,127
  156.   ld l,50
  157. #fncall fline
  158.   ld d,97
  159.   ld e,1
  160.   ld h,126
  161.   ld l,1
  162. #fncall fline
  163.   ld h,97
  164.   ld l,9
  165. #fncall fline
  166.   ld d,97
  167.   ld e,9
  168.   ld h,126
  169.   ld l,9
  170. #fncall fline
  171.   ld d,126
  172.   ld e,1
  173.   ld h,126
  174.   ld l,9
  175. #fncall fline
  176.   ld d,97
  177.   ld e,18
  178.   ld h,107
  179.   ld l,18
  180. #fncall fline
  181.   ld d,116
  182.   ld e,18
  183.   ld h,126
  184.   ld l,18
  185. #fncall fline
  186. ;--- draw other pics and words ---
  187.   ld hl,&BoardSprite
  188.   ld b,99
  189.   ld c,4
  190. #fncall pspr_nr
  191.   ld hl,&BoardSprite
  192.   ld b,123
  193.   ld c,4
  194. #fncall pspr_nr
  195.   ld a,102
  196.   ld (CURSOR_X),a
  197.   ld a,2                 ;subtract 1 from Y, don't know why
  198.   ld (CURSOR_Y),a
  199.   ld hl,&BoardText1
  200.   call D_ZM_STR
  201.   ld a,99
  202.   ld (CURSOR_X),a
  203.   ld a,11                ;subtract 1 from Y, don't know why
  204.   ld (CURSOR_Y),a
  205.   ld hl,&BoardText2
  206.   call D_ZM_STR
  207.   ld a,118
  208.   ld (CURSOR_X),a
  209.   ld a,11                ;subtract 1 from Y, don't know why
  210.   ld (CURSOR_Y),a
  211.   ld hl,&BoardText3
  212.   call D_ZM_STR
  213.   ret
  214.  
  215.  
  216. ;*** Subroutine to show who goes next ***
  217. Turn:
  218.   ld a,(PTURN)
  219.   ld b,0
  220.   cp b
  221.   jp z,&Turn1
  222. Turn2:
  223.   ld hl,&TurnText1
  224.   ld a,101
  225.   ld (CURSOR_X),a
  226.   ld a,51
  227.   ld (CURSOR_Y),a
  228.   call D_ZM_STR
  229.   ld hl,&TurnText22
  230.   ld a,99
  231.   ld (CURSOR_X),a
  232.   ld a,57
  233.   ld (CURSOR_Y),a
  234.   call D_ZM_STR
  235.   ret
  236. Turn1:
  237.   ld hl,&TurnText1
  238.   ld a,101
  239.   ld (CURSOR_X),a
  240.   ld a,51
  241.   ld (CURSOR_Y),a
  242.   call D_ZM_STR
  243.   ld hl,&TurnText21
  244.   ld a,99
  245.   ld (CURSOR_X),a
  246.   ld a,57
  247.   ld (CURSOR_Y),a
  248.   call D_ZM_STR
  249.   ret
  250.  
  251.  
  252. ;*** Subroutine to use a cursor to place a game peice ***
  253. ;--- place the two cursor sprites ---
  254. CursorMain:
  255. CursorLoop1:
  256.   ld a,(CURX1)
  257.   ld b,a
  258.   ld a,(CURY1)
  259.   ld c,a
  260.   ld hl,&CursorSprite1
  261.   call &PlaceCursor
  262.   ld b,1
  263.   push bc
  264.   jp &CursorDelay
  265. CursorLoop2:
  266.   ld a,(CURX1)
  267.   ld b,a
  268.   ld a,(CURY1)
  269.   ld c,a
  270.   ld hl,&CursorSprite2
  271.   call &PlaceCursor
  272.   ld b,0
  273.   push bc
  274.   jp &CursorDelay
  275. ;--- delay and key check for cursor ---
  276. CursorDelay:
  277.   ld b, 0
  278.   ld c, 0
  279. CursorDelay1:
  280.   call GET_KEY
  281.   cp K_LEFT
  282.   jp z,&CursorLeft
  283.   cp K_RIGHT
  284.   jp z,&CursorRight
  285.   cp K_DOWN
  286.   jp z,&CursorDown
  287.   cp K_UP
  288.   jp z,&CursorUp
  289.   cp K_SECOND
  290.   jp z,&CursorPlacePeice
  291.   cp K_EXIT
  292.   jp z,&ExitProgram
  293.   cp K_F1
  294.   jp z,&TeacherKey
  295.   cp K_CLEAR
  296.   jp z,&Init
  297.   ld a,255
  298.   inc b
  299.   cp b
  300.   jp z,&CursorDelayLoop1
  301.   jp &CursorDelay1
  302. CursorDelayLoop1:
  303.   ld a,35
  304.   inc c
  305.   cp c
  306.   jp z,&CursorDelay2
  307.   ld b,0
  308.   jp &CursorDelay1
  309. CursorDelay2:
  310.   pop bc
  311.   ld a,0
  312.   cp b
  313.   jp z,&CursorLoop1
  314.   jp &CursorLoop2
  315. ;--- move cursor and check if it goes off screen or exists from an existing peice ---
  316. CursorLeft:
  317.   pop bc
  318.   ld a,(CURX1)
  319.   ld b,2
  320.   cp b
  321.   jp z,&CursorEnd
  322.   ld (TEMP1),a
  323.   call &CursorFixBoard
  324.   ld a,(TEMP1)
  325.   sub 6
  326.   ld (CURX1),a
  327.   ld a,(CURX2)
  328.   dec a
  329.   ld (CURX2),a
  330.   jp &CursorEnd
  331. CursorRight:
  332.   pop bc
  333.   ld a,(CURX1)
  334.   ld b,92
  335.   cp b
  336.   jp z,&CursorEnd
  337.   ld (TEMP1),a
  338.   call &CursorFixBoard
  339.   ld a,(TEMP1)
  340.   add a,6
  341.   ld (CURX1),a
  342.   ld a,(CURX2)
  343.   inc a
  344.   ld (CURX2),a
  345.   jp &CursorEnd
  346. CursorUp:
  347.   pop bc
  348.   ld a,(CURY1)
  349.   ld b,2
  350.   cp b
  351.   jp z,&CursorEnd
  352.   ld (TEMP1),a
  353.   call &CursorFixBoard
  354.   ld a,(TEMP1)
  355.   sub 6
  356.   ld (CURY1),a
  357.   ld a,(CURY2)
  358.   dec a
  359.   ld (CURY2),a
  360.   jp &CursorEnd
  361. CursorDown:
  362.   pop bc
  363.   ld a,(CURY1)
  364.   ld b,56
  365.   cp b
  366.   jp z,&CursorEnd
  367.   ld (TEMP1),a
  368.   call &CursorFixBoard
  369.   ld a,(TEMP1)
  370.   add a,6
  371.   ld (CURY1),a
  372.   ld a,(CURY2)
  373.   inc a
  374.   ld (CURY2),a
  375.   jp &CursorEnd
  376. CursorPlacePeice:
  377.   pop bc
  378.   ret
  379. ;--- fix board after cursor move ---
  380. CursorFixBoard:
  381.   ld a,(CURX1)
  382.   ld b,a
  383.   ld a,(CURY1)
  384.   ld c,a
  385.   push bc
  386.   dec b
  387.   dec c
  388.   ld hl,&FixSprite1
  389. #fncall pspr_nr
  390.   ld a,(CURY2)
  391.   ld b,a
  392.   ld c,16
  393.   call &Multiply
  394.   ld a,(CURX2)
  395.   add a,d
  396.   ld c,a
  397.   ld b,0
  398.   ld hl,BOARD
  399.   add hl,bc
  400.   ld b,h
  401.   ld c,l
  402.   ld a,(bc)
  403.   ld b,a
  404.   ld a,1
  405.   cp b
  406.   jp z,&CursorFixPeice1
  407.   ld a,2
  408.   cp b
  409.   jp z,&CursorFixPeice2
  410.   pop bc
  411.   ld a,2
  412.   cp b
  413.   call z,&CursorFixBoard1
  414.   ld a,92
  415.   cp b
  416.   call z,&CursorFixBoard2
  417.   ld a,2
  418.   cp c
  419.   call z,&CursorFixBoard3
  420.   ld a,56
  421.   cp c
  422.   call z,&CursorFixBoard4
  423.   ret
  424. CursorFixBoard1:
  425.   push bc
  426.   dec b
  427.   call &RemovePixel
  428.   pop bc
  429.   ret
  430. CursorFixBoard2:
  431.   push bc
  432.   inc b
  433.   call &RemovePixel
  434.   pop bc
  435.   ret
  436. CursorFixBoard3:
  437.   push bc
  438.   dec c
  439.   call &RemovePixel
  440.   pop bc
  441.   ret
  442. CursorFixBoard4:
  443.   push bc
  444.   inc c
  445.   call &RemovePixel
  446.   pop bc
  447.   ret
  448. CursorFixPeice1:
  449.   pop bc
  450.   ld hl,&GameSprite1
  451.   call &PlacePeice
  452.   ret
  453. CursorFixPeice2:
  454.   pop bc
  455.   ld hl,&GameSprite2
  456.   call &PlacePeice
  457.   ret
  458. CursorEnd:
  459.   jp &CursorMain
  460.  
  461.  
  462. ;*** Subroutine to place the proper game peice and write to the correct mem location ***
  463. GamePeice:
  464.   ld a,(CURX1)
  465.   ld b,a
  466.   ld a,(CURY1)
  467.   ld c,a
  468.   ld a,(PTURN)
  469.   ld d,1
  470.   cp d
  471.   jp z,&GPPlayer2
  472. GPPlayer1:
  473.   ld hl,&GameSprite1
  474.   call &PlacePeice
  475.   call &GPMemLoc
  476.   ld a,1
  477.   ld (bc),a
  478.   ld a,1
  479.   ld (PTURN),a
  480.   ld (LPTURN),a
  481.   ld a,2
  482.   ld (PTURN2),a
  483.   ret
  484. GPPlayer2:
  485.   ld hl,&GameSprite2
  486.   call &PlacePeice
  487.   call &GPMemLoc
  488.   ld a,2
  489.   ld (bc),a
  490.   ld a,0
  491.   ld (PTURN),a
  492.   ld a,2
  493.   ld (LPTURN),a
  494.   ld a,1
  495.   ld (PTURN2),a
  496.   ret
  497. GPMemLoc:
  498.   ld a,(CURY2)
  499.   ld b,a
  500.   ld c,16
  501.   call &Multiply
  502.   ld a,(CURX2)
  503.   add a,d
  504.   ld c,a
  505.   ld b,0
  506.   ld hl,BOARD
  507.   add hl,bc
  508.   ld b,h
  509.   ld c,l
  510.   ret
  511.  
  512.  
  513. ;*** Subroutine to check and see if someone tries to place a peice on an existing peice ***
  514. CheckDuplicate:
  515.   ld a,(CURY2)
  516.   ld b,a
  517.   ld c,16
  518.   call &Multiply
  519.   ld a,(CURX2)
  520.   add a,d
  521.   ld c,a
  522.   ld b,0
  523.   ld hl,BOARD
  524.   add hl,bc
  525.   ld b,h
  526.   ld c,l
  527.   ld a,(bc)
  528.   ld b,0
  529.   cp b
  530.   jp z,&CDLoop
  531.   jp &StartLoop1
  532.  
  533.  
  534. ;*** Subroutine to check if a capture has occured ***
  535. CheckCapture:
  536.   ld a,1
  537.   ld (CC),a
  538. CheckCLoop:
  539.   ld a,(CURX2)
  540.   ld (TEMP1),a
  541.   ld a,(CURY2)
  542.   ld (TEMP2),a
  543.   call &CheckC1
  544.   ld a,(PTURN2)
  545.   cp b
  546.   jp nz,&CheckCNext  
  547.   ld a,(TEMP1)
  548.   ld (QPOS1X),a
  549.   ld a,(TEMP2)
  550.   ld (QPOS1Y),a
  551.   ld a,e
  552.   ld (QPOSONE),a
  553.   call &CheckC1
  554.   ld a,(PTURN2)
  555.   cp b
  556.   jp nz,&CheckCNext
  557.   ld a,(TEMP1)
  558.   ld (QPOS2X),a
  559.   ld a,(TEMP2)
  560.   ld (QPOS2Y),a
  561.   ld a,e
  562.   ld (QPOSTWO),a
  563.   call &CheckC1
  564.   ld a,(LPTURN)
  565.   cp b
  566.   jp nz,&CheckCNext
  567.   call &CapturePeice
  568.   ld a,(CAPPOS1)
  569.   ld b,50
  570.   cp b
  571.   jp z,&PlayerWin
  572.   ld a,(CAPPOS2)
  573.   ld b,50
  574.   cp b
  575.   jp z,&PlayerWin
  576.   jp &CheckCNext
  577. CheckC1:
  578.   ld a,(TEMP1)
  579.   ld b,a
  580.   ld a,(TEMP2)
  581.   ld c,a
  582.   call &CheckC2
  583.   push bc
  584.   ld b,16
  585.   call &Multiply
  586.   pop bc
  587.   ld a,c
  588.   ld (TEMP2),a
  589.   ld a,b
  590.   ld (TEMP1),a
  591.   add a,d
  592.   ld e,a
  593.   ld c,a
  594.   ld b,0
  595.   ld hl,BOARD
  596.   add hl,bc
  597.   ld b,h
  598.   ld c,l
  599.   ld a,(bc)
  600.   ld b,a
  601.   ret
  602. CheckC2:
  603.   ld a,(CC)
  604.   ld d,a
  605.   ld a,1
  606.   cp d
  607.   call z,&CCUL
  608.   ld a,2
  609.   cp d
  610.   call z,&CCU
  611.   ld a,3
  612.   cp d
  613.   call z,&CCUR
  614.   ld a,4
  615.   cp d
  616.   call z,&CCL
  617.   ld a,5
  618.   cp d
  619.   call z,&CCR
  620.   ld a,6
  621.   cp d
  622.   call z,&CCDL
  623.   ld a,7
  624.   cp d
  625.   call z,&CCD
  626.   ld a,8
  627.   cp d
  628.   call z,&CCDR
  629.   ret
  630. CCUL:
  631.   dec b
  632.   dec c
  633.   ret
  634. CCU:
  635.   dec c
  636.   ret
  637. CCUR:
  638.   inc b
  639.   dec c
  640.   ret
  641. CCL:
  642.   dec b
  643.   ret
  644. CCR:
  645.   inc b
  646.   ret
  647. CCDL:
  648.   dec b
  649.   inc c
  650.   ret
  651. CCD:
  652.   inc c
  653.   ret
  654. CCDR:
  655.   inc b
  656.   inc c
  657.   ret
  658. CheckCNext:
  659.   ld a,(CC)
  660.   ld b,a
  661.   ld a,8
  662.   cp b
  663.   jp z,&CCLoop
  664.   inc b
  665.   ld a,b
  666.   ld (CC),a
  667.   jp &CheckCLoop
  668. CapturePeice:
  669.   ld a,(QPOS1X)
  670.   call &CapPecLoop
  671.   ld a,d
  672.   ld (TEMP1),a
  673.   ld a,(QPOS1Y)
  674.   call &CapPecLoop
  675.   ld c,d
  676.   ld a,(TEMP1)
  677.   ld b,a
  678.   ld hl,&FixSprite2
  679. #fncall pspr_nr
  680.   ld a,(QPOSONE)
  681.   call &CapPecLoop2
  682.   ld a,(QPOS2X)
  683.   call &CapPecLoop
  684.   ld a,d
  685.   ld (TEMP1),a
  686.   ld a,(QPOS2Y)
  687.   call &CapPecLoop
  688.   ld c,d
  689.   ld a,(TEMP1)
  690.   ld b,a
  691.   ld hl,&FixSprite2
  692. #fncall pspr_nr
  693.   ld a,(QPOSTWO)
  694.   call &CapPecLoop2
  695.   call &TallyPeice
  696.   ret
  697. CapPecLoop:
  698.   ld b,a
  699.   ld c,6
  700.   call &Multiply
  701.   ret
  702. CapPecLoop2:
  703.   ld c,a
  704.   ld b,0
  705.   ld hl,Board
  706.   add hl,bc
  707.   ld b,h
  708.   ld c,l
  709.   ld a,0
  710.   ld (bc),a
  711.   ret
  712. TallyPeice:
  713.   ld a,(LPTURN)
  714.   ld b,2
  715.   cp b
  716.   jp z,&TPeice2
  717.   ld a,(CAPPOS1)
  718.   ld c,a
  719.   ld b,97
  720.   ld hl,&GameSprite2
  721. #fncall pspr_nr
  722.   ld a,b
  723.   add a,6
  724.   ld b,a
  725.   ld hl,&GameSprite2
  726. #fncall pspr_nr
  727.   ld a,(CAPPOS1)
  728.   add a,6
  729.   ld (CAPPOS1),a
  730.   ret
  731. TPeice2:
  732.   ld a,(CAPPOS2)
  733.   ld c,a
  734.   ld b,116
  735.   ld hl,&GameSprite1
  736. #fncall pspr_nr
  737.   ld a,b
  738.   add a,6
  739.   ld b,a
  740.   ld hl,&GameSprite1
  741. #fncall pspr_nr
  742.   ld a,(CAPPOS2)
  743.   add a,6
  744.   ld (CAPPOS2),a
  745.   ret
  746.  
  747.  
  748. ;*** Subroutine to check if a win has occured ***
  749. CheckWin:
  750.   ld a,1
  751.   ld (CC),a
  752.   ld a,0
  753.   ld (TEMP1),a
  754. CWLoop1:
  755.   ld a,(CURX2)
  756.   ld b,a
  757.   ld a,(CURY2)
  758.   ld c,a
  759. CWLoop5:
  760.   call &CWLoop2
  761.   call &CWLoop3
  762.   cp b
  763.   jp z,&TallyMark
  764.   ld a,(CC)
  765.   inc a
  766.   ld (CC),a
  767.   call &CWLoop4
  768.   ld a,(CC)
  769.   ld b,9
  770.   cp b
  771.   jp z,&CWRet
  772.   jp &CWLoop1
  773. CWLoop2:
  774.   ld a,(CC)
  775.   ld d,1
  776.   cp d
  777.   call z,&CCL
  778.   ld d,2
  779.   cp d
  780.   call z,&CCR
  781.   ld d,3
  782.   cp d
  783.   call z,&CCUL
  784.   ld d,4
  785.   cp d
  786.   call z,&CCDR
  787.   ld d,5
  788.   cp d
  789.   call z,&CCU
  790.   ld d,6
  791.   cp d
  792.   call z,&CCD
  793.   ld d,7
  794.   cp d
  795.   call z,&CCUR
  796.   ld d,8
  797.   cp d
  798.   call z,&CCDL
  799.   ret
  800. CWLoop3:
  801.   ld a,b
  802.   ld (TEMP2),a
  803.   ld a,c
  804.   ld (TEMP3),a
  805.   push bc
  806.   ld b,16
  807.   call &Multiply
  808.   pop bc
  809.   ld a,b
  810.   add a,d
  811.   ld c,a
  812.   ld b,0
  813.   ld hl,Board
  814.   add hl,bc
  815.   ld b,h
  816.   ld c,l
  817.   ld a,(bc)
  818.   ld b,a
  819.   ld a,(LPTURN)
  820.   ret
  821. TallyMark:
  822.   ld a,(TEMP1)
  823.   inc a
  824.   ld (TEMP1),a
  825.   ld b,4
  826.   cp b
  827.   jp z,&PlayerWin
  828.   call &TMLoop
  829.   jp &CWLoop5
  830. CWLoop4:
  831.   ld b,3
  832.   cp b
  833.   call z,&CWL42
  834.   ld b,5
  835.   cp b
  836.   call z,&CWL42
  837.   ld b,7
  838.   cp b
  839.   call z,&CWL42
  840.   ret
  841. CWL42:
  842.   ld a,0
  843.   ld (TEMP1),a
  844.   ret
  845. TMLoop:
  846.   ld a,(TEMP2)
  847.   ld b,a
  848.   ld a,(TEMP3)
  849.   ld c,a
  850.   ret
  851.  
  852.  
  853. ;*** Subroutine to display who wins and wait for keypress ***
  854. PlayerWin:
  855.   ld a,3
  856.   ld (CURSOR_ROW),a
  857.   ld a,3
  858.   ld (CURSOR_COL),a
  859.   set 3,(IY+05)
  860.   ld a,(PTURN2)
  861.   ld b,1
  862.   cp b
  863.   call z,&PlWLoop2
  864.   ld b,2
  865.   cp b
  866.   call z,&PlWLoop1
  867.   call D_ZT_STR
  868.   res 3,(IY+05)
  869.   ld d,18
  870.   ld e,23
  871.   ld h,101
  872.   ld l,23
  873. #fncall fline
  874. PlWLoop3:
  875.   call GET_KEY
  876.   cp K_EXIT
  877.   jp z,&ExitProgram
  878.   cp K_F1
  879.   jp z,&TeacherKey
  880.   cp K_ENTER
  881.   jp z,&Init
  882.   jp &PlWLoop3
  883. PlWLoop2:
  884.   ld hl,&WinText2
  885.   ret
  886. PlWLoop1:
  887.   ld hl,&WinText1
  888.   ret
  889.  
  890.  
  891. ;*** Subroutine to display opening screen ***
  892. OpeningScreen:
  893.   ld a,6
  894.   ld (CURSOR_COL),a
  895.   ld a,0
  896.   ld (CURSOR_ROW),a
  897.   ld hl,&OScreenText1
  898.   call D_ZT_STR
  899.   ld a,18
  900.   ld (CURSOR_X),a
  901.   ld a,15
  902.   ld (CURSOR_Y),a
  903.   ld hl,&OScreenText2
  904.   call D_ZM_STR
  905.   jp &OSLoop2
  906. OSLoop1:
  907.   call GET_KEY
  908.   cp K_F1
  909.   jp z,&TeacherKey
  910.   cp 0
  911.   jp z,&OSLoop1
  912.   ret
  913. OSLoop2:
  914.   call &OSLoop3
  915.   call D_ZM_STR
  916.   ld b,43
  917.   cp b
  918.   jp z,&OSLoop1
  919.   jp &OSLoop2
  920. OSLoop3:
  921.   ld a,18
  922.   ld (CURSOR_X),a
  923.   ld a,(CURSOR_Y)
  924.   add a,7
  925.   ld (CURSOR_Y),a
  926.   ret
  927.  
  928.  
  929. ;*** Subroutine to crash back to TI-OS (in case of teacher :) ) ***
  930. TeacherKey:
  931.   ld a,3
  932.   ld (USG_BITS),a
  933.   ld hl,DELC_LEN
  934.   ld (HL),0
  935.   inc hl
  936.   inc hl
  937.   ld (hl),0
  938.   set 0,(iy+3)
  939.   jp OTH_EXIT
  940.  
  941.  
  942. ;*** Subroutine to exit the program ***
  943. ExitProgram:
  944.   call OTH_EXIT
  945.  
  946.  
  947. ;*** Subroutine to Multiply B and C and store answer in D   by: Nick Blizard (nblizard@bellsouth.net) ***
  948. Multiply:
  949.   ld d,0
  950.   ld a,b
  951.   ld e,0
  952.   cp e
  953.   ret z
  954.   ld a,c
  955.   cp e
  956.   ret z
  957.   ld e,1
  958.   cp e
  959.   jp z,&Multiply3
  960.   ld a,b
  961.   cp e
  962.   jp z,&Multiply4
  963.   ld a,b
  964. Multiply2:
  965.   add a,b
  966.   dec c
  967.   ld d,a
  968.   ld a,c
  969.   ld e,1
  970.   cp e
  971.   ret z
  972.   ld a,d
  973.   jp &Multiply2
  974. Multiply3:
  975.   ld a,b
  976.   ld d,a
  977.   ret
  978. Multiply4:
  979.   ld a,c
  980.   ld d,a
  981.   ret
  982.  
  983.  
  984. ;*** Subroutine to place the cursor at B,C ***
  985. PlaceCursor:
  986.   dec b
  987.   dec c
  988. #fncall pspr_nr
  989.   ret
  990.  
  991.  
  992. ;*** Subroutine to place a game peice at B,C ***
  993. PlacePeice:
  994.   dec b
  995.   dec b
  996.   dec c
  997.   dec c
  998. #fncall pspr_nr
  999.   ret
  1000.  
  1001.  
  1002. ;*** Subroutine to put a pixel at (B,C), by: Jimmy Mardell ***
  1003. PutPixel:
  1004.   ld a,63
  1005.   sub c
  1006.   ld c,a
  1007.   ROM_CALL(FIND_PIXEL)
  1008.   ld de,$FC00
  1009.   add hl,de
  1010.   or (hl)
  1011.   ld (hl),a
  1012.   ret
  1013.  
  1014.  
  1015. ;*** Subroutine to remove a pixel at (B,C), by: Jimmy Mardell ***
  1016. RemovePixel:
  1017.   ld a,63
  1018.   sub c
  1019.   ld c,a
  1020.   ROM_CALL(FIND_PIXEL)
  1021.   ld de,$FC00
  1022.   add hl,de
  1023.   cpl
  1024.   and (hl)
  1025.   ld (hl),a
  1026.   ret
  1027.  
  1028.  
  1029. ;*** Text for the program ***
  1030. ;--- text for the game board ---
  1031. BoardText1:
  1032. .db "PENTE",0
  1033. BoardText2:
  1034. .db "P1",0
  1035. BoardText3:
  1036. .db "P2",0
  1037.  
  1038. ;--- text for the player's turn ---
  1039. TurnText21:
  1040. .db "1",39,"s Turn",0
  1041. TurnText1:
  1042. .db "Player",0
  1043. TurnText22:
  1044. .db "2",39,"s Turn",0
  1045.  
  1046. ;--- text for winning ---
  1047. WinText1:
  1048. .db "Player 1 Wins!",0
  1049. WinText2:
  1050. .db "Player 2 Wins!",0
  1051.  
  1052. ;--- text for opening screen ---
  1053. OScreenText1:
  1054. .db "* Pente *",0
  1055. OScreenText2:
  1056. .db "Pente  v1.0b  Lite",0
  1057. .db "Nick  Blizard",0
  1058. .db "NBlizard@Bellsouth.net",0
  1059. .db "B|izzard  Productions  Inc.",0
  1060. .db "(c)  Nov.  14 ,  1997",0
  1061.  
  1062.  
  1063. ;*** Sprites for the program ***
  1064. BoardSprite:
  1065. .db 3,3
  1066. .db %11000000
  1067. .db %11000000
  1068. .db %11000000
  1069. .db %00000000
  1070. .db %00000000
  1071. .db %00000000
  1072. .db %00000000
  1073. .db %00000000
  1074.  
  1075. CursorSprite1:
  1076. .db 3,3
  1077. .db %11100000
  1078. .db %11100000
  1079. .db %11100000
  1080. .db %00000000
  1081. .db %00000000
  1082. .db %00000000
  1083. .db %00000000
  1084. .db %00000000
  1085.  
  1086. CursorSprite2:
  1087. .db 3,3
  1088. .db %00000000
  1089. .db %00000000
  1090. .db %00000000
  1091. .db %00000000
  1092. .db %00000000
  1093. .db %00000000
  1094. .db %00000000
  1095. .db %00000000
  1096.  
  1097. FixSprite1:
  1098. .db 3,3
  1099. .db %01000000
  1100. .db %11100000
  1101. .db %01000000
  1102. .db %00000000
  1103. .db %00000000
  1104. .db %00000000
  1105. .db %00000000
  1106. .db %00000000
  1107.  
  1108. FixSprite2:
  1109. .db 5,5
  1110. .db %00100000
  1111. .db %00100000
  1112. .db %11111000
  1113. .db %00100000
  1114. .db %00100000
  1115. .db %00000000
  1116. .db %00000000
  1117. .db %00000000
  1118.  
  1119. GameSprite1:
  1120. .db 5,5
  1121. .db %01110000
  1122. .db %11111000
  1123. .db %11111000
  1124. .db %11111000
  1125. .db %01110000
  1126. .db %00000000
  1127. .db %00000000
  1128. .db %00000000
  1129.  
  1130. GameSprite2:
  1131. .db 5,5
  1132. .db %01110000
  1133. .db %10001000
  1134. .db %10001000
  1135. .db %10001000
  1136. .db %01110000
  1137. .db %00000000
  1138. .db %00000000
  1139. .db %00000000
  1140.  
  1141.  
  1142. .end
  1143.