home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug017.ark / 3DTICTAC.ASM next >
Encoding:
Assembly Source File  |  1984-04-29  |  12.6 KB  |  860 lines

  1. ;
  2. ;
  3. ;    THREE DIMENSIONAL    TIC - TAC - TOE
  4. ;
  5. ;    VER    1.0    11/20/75
  6. ;
  7. ;    THOMAS A. ROLANDER
  8. ;
  9.     ORG    100H
  10. ;
  11. CO    EQU    3809H
  12. CI    EQU    3803H
  13. CSTS    EQU    3812H
  14. ;
  15. CR    EQU    0DH
  16. LF    EQU    0AH
  17. ESC    EQU    1BH
  18. BSPACE    EQU    08H
  19. TAB    EQU    09H
  20. ;
  21. WIDTH    EQU    14
  22. SPACING EQU    3
  23. ;
  24. BEGIN:
  25.     LXI    SP,2000H    ; SET STACK POINTER
  26.     MVI    B,65    ; CLEAR THE BOARD
  27.     LXI    H,MOVEARY
  28.     XRA    A
  29. CLOOP:
  30.     MOV    M,A
  31.     INX    H
  32.     DCR    B    ; CLEAR ALL 64 SQUARES
  33.     JNZ    CLOOP
  34.     LXI    H,MSG0    ; CLEAR SCREEN AND PRINT BOARD
  35.     CALL    MESAG
  36.     CALL    BDHOME    ; MOVE CURSOR TO LOWER LEFT CORNER
  37. GETMOVE:
  38.     LXI    H,MSG1    ; PRINT "ENTER YOUR MOVE"
  39. GETX:
  40.     CALL    PRINTMESAG
  41. GETNEXT:
  42.     CALL    COPYPOSITION    ; START BY DEFAULTING TO CURRENT POSITION
  43.     CALL    CI    ; THEN GET PLAYERS KEYBOARD INPUT
  44.     ANI    7FH    ; BAG PARITY BIT
  45.     MOV    B,A    ; RESPONSE WILL BE SAVED IN B
  46.     LXI    D,CHARLIST-2    ; SCAN LIST OF OK CHARS & JUMP
  47. GLOOP:
  48.     INX    D    ; PRE-INCREMENT
  49.     INX    D
  50.     LDAX    D    ; GET CHAR FROM TABLE
  51.     ORA    A    ; TEST FOR END OF LIST
  52. GETERROR:
  53.     LXI    H,MSG2    ; JUST IN CASE BAD CHAR
  54.     JZ    GETX    ; BAD CHAR -> GO PRINT "TRY AGAIN"
  55.     INX    D    ; NOW POINT TO JUMP ADDRESS
  56.     CMP    B    ; COMPARE CHAR TO THAT KEY'D IN
  57.     JNZ    GLOOP    ; NO LUCK ?!
  58.     LDAX    D    ; EL-KLUGE-O INDIRECT JUMP
  59.     MOV    L,A
  60.     INX    D
  61.     LDAX    D
  62.     MOV    H,A
  63.     LXI    D,GETNEXT    ; SET-UP FAKE 'CALL' RETURN
  64.     PUSH    D
  65.     PCHL    ; WHITHER WANDEREST THOU .....
  66. ;
  67. CHARLIST:
  68.     DB    1FH
  69.     DW    UP
  70.     DB    0AH
  71.     DW    DOWN
  72.     DB    8
  73.     DW    LEFT
  74.     DB    1CH
  75.     DW    RIGHT
  76.     DB    'X'
  77.     DW    GOTMV
  78.     DB    CR
  79.     DW    BEGIN
  80.     DB    'C' AND NOT 40H
  81.     DW    7200H
  82.     DB    'O'
  83.     DW    YOUMOVE
  84.     DB    0
  85. ;
  86. ;
  87. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  88. ;
  89. ;    JUMP TABLE HANDLERS
  90. ;
  91. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  92. ;
  93. ;
  94. UP:
  95.     LXI    H,NRP    ; INCREMENT NEW ROW POINTER
  96.     MOV    A,M
  97.     INR    A
  98.     MOV    M,A
  99.     CPI    5    ; DO WE HAVE TO BUMP TO NEXT BOARD ?!
  100.     JC    MOVE    ; NOPE -> SIMPLY GO MOVE
  101.     MVI    M,1    ; GOING TO ROW 1 OF NEXT BOARD
  102.     JMP    BDINC    ; INCREMENT BD, TESTING FOR WRAPAROUND
  103. ;
  104. ;
  105. DOWN:
  106.     LXI    H,NRP    ; DECREMENT NEW ROW POINTER
  107.     DCR    M
  108.     JNZ    MOVE    ; OK -> STILL ON SAME BOARD
  109.     MVI    M,4    ; TOP ROW OF NEXT BOARD
  110.     JMP    BDDEC    ; GO DECREMENT BD PTR, TESTING FRO WRAPAROUND
  111. ;
  112. ;
  113. RIGHT:
  114.     LXI    H,NCP    ; INCREMENT NEW COLUMN POINTER
  115.     MOV    A,M
  116.     INR    A
  117.     MOV    M,A
  118.     CPI    5    ; OFF BOARD ?!
  119.     JC    MOVE    ; NOPE -> SIMPLY GO MOVE
  120.     MVI    M,1    ; END UP IN COLUMN ONE
  121. ;
  122. BDINC:
  123.     LXI    H,NBP    ; INCREMENT NEW BOARD POINTER
  124.     MOV    A,M
  125.     INR    A
  126.     MOV    M,A
  127.     CPI    5    ; GOING BEYOUND BOARD #4 ?!
  128.     JC    MOVE    ; NOPE SIMPLY GO MOVE
  129.     MVI    M,1    ; ELSE WRAPAROUND TO BD # 1
  130.     JMP    MOVE
  131. ;
  132. ;
  133. LEFT:
  134.     LXI    H,NCP    ; DECREMENT NEW COLUMN POINTER
  135.     DCR    M
  136.     JNZ    MOVE    ; OK -> NOT GOING TO BD #0
  137.     MVI    M,4    ; ELSE WRAPAROUND
  138. ;
  139. BDDEC:
  140.     LXI    H,NBP    ; DECREMENT NEW BOARD POINTER
  141.     DCR    M
  142.     JNZ    MOVE    ; OK NO WRAPPING
  143.     MVI    M,4
  144.     JMP    MOVE    ; GO AND WRAP IT
  145. ;
  146. ;
  147. YOUMOVE:
  148.     POP    D    ; POP PHONNEY RETURN ADDR
  149.     JMP    STRCALL    ; GO CALL STRAT SUBR.
  150. ;
  151. ;
  152. GOTMV:
  153.     POP    D    ; POP PHONNEY RETURN ADDR
  154.     LXI    H,BP    ; CONVERT BOARD POSITION INTO INDEX
  155.     MOV    A,M
  156.     DCR    A    ; 16*(BP-1)
  157.     ADD    A
  158.     ADD    A
  159.     ADD    A
  160.     ADD    A
  161.     MOV    B,A
  162.     INX    H
  163.     MOV    A,M
  164.     DCR    A    ;    + 4*(CRP-1)
  165.     ADD    A
  166.     ADD    A
  167.     INX    H
  168.     ADD    M    ;    + CCP
  169.     ADD    B
  170.     LXI    H,MOVEARY
  171.     ADD    L
  172.     MOV    L,A
  173.     MOV    A,M
  174.     SUI    1
  175.     SBB    A
  176.     JZ    GETERROR    ; SQUARE ALREADY OCCUPIED !
  177.     MVI    M,1    ; ELSE LET'M HAVE IT
  178.     MVI    C,'X'
  179.     CALL    CO
  180.     MVI    C,BSPACE    ; PRINT HIS "X"
  181.     CALL    CO    ; AND BACK SPACE CURSOR OVER POSITION
  182. STRCALL:
  183.     LXI    H,MSG3    ; PRINT
  184.     CALL    PRINTMESAG    ;    "I'M THINKING !"
  185.     CALL    STRAT    ; CALL THE STRATEGY ROUTINE
  186.     LDA    M3
  187.     CPI    3
  188.     JP    L18
  189.     CPI    1
  190.     MVI    A,'O'
  191.     LXI    H,MSG5
  192.     JNZ    L15    ; JUMP IF WE'VE WON
  193.     MVI    A,'X'
  194.     LXI    H,MSG6    ; HE'S WON !?
  195. L15:
  196.     STA    K8
  197.     CALL    PRINTMESAG
  198. L15E:
  199.     LDA    M1
  200.     DCR    A
  201.     MOV    L,A
  202.     MVI    H,0
  203.     DAD    H
  204.     DAD    H
  205.     INX    H
  206.     LXI    D,ROW
  207.     DAD    D
  208.     MVI    D,4
  209. L16:
  210.     MOV    A,M
  211.     CALL    PLACEIT
  212.     PUSH    H
  213.     PUSH    D
  214.     CALL    MOVE
  215.     POP    D
  216.     POP    H
  217.     LDA    K8
  218.     MOV    C,A
  219.     CALL    CO
  220.     MVI    C,BSPACE
  221.     CALL    CO
  222.     DCR    D
  223.     INX    H
  224.     JNZ    L16
  225.     LDA    K8
  226.     CPI    ' '
  227.     JZ    L17A
  228.     STA    J8
  229.     MVI    A,' '
  230.     JMP    L17B
  231. L17A:
  232.     LDA    J8
  233. L17B:
  234.     STA    K8
  235.     CALL    CSTS
  236.     JZ    L15E
  237.     CALL    CI
  238.     JMP    BEGIN
  239. L18:
  240.     LDA    M1
  241.     ORA    A
  242.     JNZ    L13A
  243.     LDA    CBP
  244.     MOV    E,A
  245.     MVI    D,0
  246. L14:
  247.     LXI    H,WAIT
  248.     DAD    D
  249.     MOV    C,M
  250.     MVI    B,0
  251.     LXI    H,MOVEARY    ; WE'RE GETTING A WAITING MOVE
  252.     DAD    B
  253.     MOV    A,M
  254.     ORA    A
  255.     JZ    L13
  256.     INX    D
  257.     MVI    A,21
  258.     CMP    E
  259.     JNZ    L14
  260.     LXI    H,MSG4    ; NO WAITING MOVES LEFT !
  261.     CALL    PRINTMESAG    ; PRINT "TIE GAME !!!"
  262.     CALL    CI    ; WAIT FOR INPUT
  263.     JMP    BEGIN
  264. L13A:
  265.     MOV    C,A
  266.     LXI    H,MOVEARY
  267.     ADD    L
  268.     MOV    L,A
  269. L13:
  270.     MVI    M,5    ; CLAIM SQUARE FOR US 
  271.     MOV    A,C
  272.     CALL    PLACEIT
  273.     CALL    MOVE
  274.     MVI    C,'O'    ; SHOW OUR "O"
  275.     CALL    CO
  276.     MVI    C,BSPACE
  277.     CALL    CO
  278.     JMP    GETMOVE    ; GET OPPONENTS RESPONSE
  279. ;
  280. ;
  281. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  282. ;
  283. ;    SUPPORTING SUBROUTINES
  284. ;
  285. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  286. ;
  287. ;
  288. MESAG:
  289.     MOV    A,M
  290.     ORA    A
  291.     RZ
  292.     INX    H
  293.     MOV    C,A
  294.     CALL    CO
  295.     JMP    MESAG
  296. PRINTMESAG:
  297.     PUSH    H    ; SAVE ADDR OF MESAG
  298.     CALL    REMEMBERPOSITION ;WE WANT TO COME BACK HERE
  299.     CALL    BDHOME    ; HOME CURSOR TO LOWER LEFT BD POSITION
  300.     MVI    B,24
  301.     CALL    CURSRT    ; MOVE CURSOR TO MESSAGE POSITION
  302.     POP    H
  303.     CALL    MESAG
  304.     CALL    BDHOME    ; HOME CURSOR AGAIN
  305.     JMP    MOVE    ;    & RETURN TO WHERE WE WERE
  306. ;
  307. ;
  308. MOVE:
  309.     LXI    H,BP    ; START BY GOING TO CORRECT BD
  310.     LXI    D,NBP    ; DE=NEW POSITION, HL=CURRENT POSITION
  311. MBP:
  312.     LDAX    D    ; GET NEW BD #
  313.     CMP    M    ; COMPARE TO CURRENP B@ #
  314.     JZ    MBPD    ; -> ON MATCH
  315.     JM    MBPL    ; WE'RE GOING LEFT
  316.     INR    M    ; FIRST UPDATE CURRENT BD #
  317.     MVI    B,WIDTH
  318.     CALL    CURSRT    ; MOVE CURSOR RIGHT INTO POSTION
  319.     MVI    B,2
  320.     CALL    CURSUP    ; MOVE CURSOR UP INTO POSITION
  321.     JMP    MBP    ; LOOP TILL NEW BD # = CURRENT BD #
  322. MBPL:
  323.     DCR    M    ; FIRST UPDATE CURRENT BD #
  324.     MVI    B,WIDTH
  325.     CALL    CURSLT    ; MOVE CURSOR LEFT INTO POSITION
  326.     MVI    B,2
  327.     CALL    CURSDN    ; MOVE CURSOR DOWN INTO POSITION
  328.     JMP    MBP    ; LOOP TIL NEW BD # = CURRENT BD #
  329. ;
  330. MBPD:
  331.     INX    H
  332.     INX    D    ; MEM ORGANIZED AS BP,RP,CP
  333. MRP:
  334.     MVI    B,1
  335.     LDAX    D    ; GET NEW ROW POINTER
  336.     CMP    M    ; COMPARE TO CURRENT ROW POINTER
  337.     JZ    MRPD    ; -> ON MATCH
  338.     JM    MRPL    ; GO MOVE DOWN
  339.     INR    M    ; FIRST INCREMENT CURRENT ROW POINTER
  340.     CALL    CURSUP    ; MOVE UP ONE ROW
  341.     JMP    MRP    ; LOOP UNTIL NEW ROW PTR = CURRENT ROW PTR
  342. MRPL:
  343.     DCR    M    ; FIRST DECREMENT CURRENT ROW POINTER
  344.     CALL    CURSDN    ; MOVE DOWN ONE ROW
  345.     JMP    MRP    ; LOOP UNTIL NEW ROW PTR = CURRENT ROW PTR
  346. ;
  347. MRPD:
  348.     INX    H
  349.     INX    D
  350. MCP:
  351.     MVI    B,SPACING
  352.     LDAX    D    ; GET NEW COLUMN POINTER
  353.     CMP    M    ; COMPARE WITH CURRENT COLUMN POINTER
  354.     RZ    ; DONE MOVING WITH A MATCH
  355.     JM    MCPL    ; GO MOVE CURSOR LEFT
  356.     INR    M    ; FIRST INCREMENT CURRENT COLUMN POINTER
  357.     CALL    CURSRT    ; MOVE CURSOR RIGHT ONE COLUMN
  358.     JMP    MCP    ; LOOP UNTIL NEW COLUMN PTR = CURRENT COLUMN P
  359. MCPL:
  360.     DCR    M    ; FIRST DECREMNT CURRENT COLUMN POINTER
  361.     CALL    CURSLT    ; MOVE CURSOR LEFT ONE COLUMN
  362.     JMP    MCP    ; LOOP UNTIL NEW COLUMN PTR = CURRENT COLUM PT
  363. ;
  364. ;
  365. BDHOME:
  366.     CALL    CURSHOME    ; POSITION THE CURSOR AT TRUE "HOME"
  367.     MVI    B,9
  368.     CALL    CURSDN    ; MOVE DOWN TO ROW 1, COL 1 BD 1
  369.     LXI    H,BP
  370.     MVI    A,1
  371.     MOV    M,A    ; BP = 1
  372.     INX    H
  373.     MOV    M,A    ; RP = 1
  374.     INX    H
  375.     MOV    M,A    ; CP = 1
  376.     RET
  377. ;
  378. ;
  379. REMEMBERPOSITION:
  380. COPYPOSITION:
  381.     LXI    D,BP
  382.     LXI    H,NBP    ; COP] BP(ETC) -> NBP(ETC)
  383.     MVI    B,3
  384. COPYLOOP:
  385.     LDAX    D    ; GET BP(I)
  386.     MOV    M,A    ; PUT NBP(I)
  387.     INX    D
  388.     INX    H
  389.     DCR    B    ; LOOP FOR THREE BYTES
  390.     JNZ    COPYLOOP
  391.     RET
  392. ;
  393. ;
  394. STRAT:
  395.     MVI    B,1
  396. L15A:
  397.     MOV    A,B
  398.     LXI    H,SUM
  399.     ADD    L
  400.     MOV    L,A
  401.     MVI    M,0
  402.     PUSH    H
  403.     MOV    L,B
  404.     MVI    H,0
  405.     DAD    H
  406.     DAD    H
  407.     DCX    H
  408.     DCX    H
  409.     DCX    H
  410.     XCHG
  411.     MVI    C,4
  412. L15B:
  413.     LXI    H,ROW
  414.     DAD    D
  415.     MOV    A,M
  416.     LXI    H,MOVEARY
  417.     ADD    L
  418.     MOV    L,A
  419.     MOV    A,M
  420.     POP    H
  421.     PUSH    H
  422.     ADD    M
  423.     MOV    M,A
  424.     INX    D
  425.     DCR    C
  426.     JNZ    L15B
  427.     POP    H
  428.     INR    B
  429.     MVI    A,77
  430.     CMP    B
  431.     JNZ    L15A
  432. ;
  433.     MVI    B,1    ; B = J1
  434. ;
  435. DO21:
  436.     MOV    A,B
  437.     STA    M3
  438.     LXI    H,TSTA1
  439.     ADD    L
  440.     MOV    L,A
  441.     MOV    A,M
  442.     STA    TST1
  443.     ORA    A
  444.     JM    END21
  445.     MOV    A,B
  446.     LXI    H,TSTA2
  447.     ADD    L
  448.     MOV    L,A
  449.     MOV    A,M
  450.     STA    TST2
  451.     MOV    A,B
  452.     LXI    H,TSTA3
  453.     ADD    L
  454.     MOV    L,A
  455.     MOV    A,M
  456.     STA    TST3
  457. ;
  458.     MVI    C,1    ; C = J2
  459. ;
  460. DO22:
  461.     MOV    A,C
  462.     LXI    H,SUM
  463.     ADD    L
  464.     MOV    L,A
  465.     LDA    TST1
  466.     CMP    M
  467.     JNZ    END22
  468.     MOV    A,B
  469.     SUI    3
  470.     JC    S18
  471.     MOV    L,C
  472.     MVI    H,0
  473.     DAD    H
  474.     DAD    H
  475.     DCX    H
  476.     DCX    H
  477.     DCX    H
  478.     SHLD    J3
  479.     MVI    A,4
  480.     STA    K3
  481. ;
  482. DO23:
  483.     LHLD    J3
  484.     LXI    D,ROW
  485.     DAD    D
  486.     MOV    A,M
  487.     STA    M1
  488.     LXI    H,MOVEARY
  489.     ADD    L
  490.     MOV    L,A
  491.     MOV    A,M
  492.     ORA    A
  493.     JNZ    END23
  494.     LDA    TST2
  495.     ORA    A
  496.     JM    S17
  497. ;
  498.     MVI    A,1
  499.     STA    J4
  500. DO24:
  501.     LDA    J4
  502.     LXI    H,SUM
  503.     ADD    L
  504.     MOV    L,A
  505.     LDA    TST2
  506.     CMP    M
  507.     JNZ    END24
  508.     LDA    J4
  509.     CMP    C
  510.     JZ    END24
  511. ;
  512.     MOV    L,A
  513.     MVI    H,0
  514.     DAD    H
  515.     DAD    H
  516.     DCX    H
  517.     DCX    H
  518.     DCX    H
  519.     SHLD    J5
  520.     SHLD    L5
  521.     MVI    A,4
  522.     STA    K5
  523. ;
  524. DO25:
  525.     LHLD    J5
  526.     LXI    D,ROW
  527.     DAD    D
  528.     LDA    M1
  529.     CMP    M
  530.     JNZ    END25
  531.     LDA    TST3
  532.     ORA    A
  533.     JM    S17
  534.     LHLD    L5
  535.     SHLD    J6
  536.     MVI    A,4
  537.     STA    K6
  538. ;
  539. DO26:
  540.     LHLD    J6
  541.     LXI    D,ROW
  542.     DAD    D
  543.     MOV    A,M
  544.     STA    M2
  545.     LXI    H,MOVEARY
  546.     ADD    L
  547.     MOV    L,A
  548.     MOV    A,M
  549.     ORA    A
  550.     JNZ    END26
  551. ;
  552.     MVI    A,1
  553.     STA    J7
  554. ;
  555. DO27:
  556.     LDA    J7
  557.     MOV    D,A
  558.     LXI    H,SUM
  559.     ADD    L
  560.     MOV    L,A
  561.     LDA    TST3
  562.     CMP    M
  563.     JNZ    END27
  564.     MOV    A,D
  565.     CMP    C
  566.     JZ    END27
  567.     LDA    J4
  568.     CMP    D
  569.     JZ    END27
  570.     MOV    L,D
  571.     MVI    H,0
  572.     DAD    H
  573.     DAD    H
  574.     DCX    H
  575.     DCX    H
  576.     DCX    H
  577.     SHLD    J8
  578.     MVI    A,4
  579.     STA    K8
  580. ;
  581. DO28:
  582.     LHLD    J8
  583.     LXI    D,ROW
  584.     DAD    D
  585.     LDA    M2
  586.     CMP    M
  587.     JZ    S16
  588. ;
  589. END28:
  590.     LHLD    J8
  591.     INX    H
  592.     SHLD    J8
  593.     LXI    H,K8
  594.     DCR    M
  595.     JNZ    DO28
  596. ;
  597. END27:
  598.     LXI    H,J7
  599.     INR    M
  600.     MVI    A,77
  601.     CMP    M
  602.     JNZ    DO27
  603. ;
  604. END26:
  605.     LHLD    J6
  606.     INX    H
  607.     SHLD    J6
  608.     LXI    H,K6
  609.     DCR    M
  610.     JNZ    DO26
  611. ;
  612. END25:
  613.     LHLD    J5
  614.     INX    H
  615.     SHLD    J5
  616.     LXI    H,K5
  617.     DCR    M
  618.     JNZ    DO25
  619. ;
  620. END24:
  621.     LXI    H,J4
  622.     INR    M
  623.     MVI    A,77
  624.     CMP    M
  625.     JNZ    DO24
  626. ;
  627. END23:
  628.     LHLD    J3
  629.     INX    H
  630.     SHLD    J3
  631.     LXI    H,K3
  632.     DCR    M
  633.     JNZ    DO23
  634. ;
  635. END22:
  636.     INR    C
  637.     MVI    A,77
  638.     CMP    C
  639.     JNZ    DO22
  640. ;
  641. END21:
  642.     INR    B
  643.     MVI    A,16
  644.     CMP    B
  645.     JNZ    DO21
  646. ;
  647. ;
  648.     XRA    A
  649.     STA    M1
  650.     JMP    S17
  651. ;
  652. S18:
  653.     MOV    A,C
  654.     STA    M1
  655. ;
  656. S17:
  657.     XRA    A
  658.     STA    M2
  659. ;
  660. S16:
  661.     RET
  662. ;
  663. ;
  664. ;
  665. PLACEIT:
  666.     MOV    B,A
  667.     DCR    A
  668.     RRC
  669.     RRC
  670.     RRC
  671.     RRC
  672.     ANI    0FH
  673.     INR    A
  674.     STA    NBP
  675.     DCR    A
  676.     ADD    A
  677.     ADD    A
  678.     ADD    A
  679.     ADD    A
  680.     MOV    C,A
  681.     MOV    A,B
  682.     SUB    C
  683.     MOV    B,A
  684.     DCR    A
  685.     RRC
  686.     RRC
  687.     ANI    3FH
  688.     INR    A
  689.     STA    NRP
  690.     DCR    A
  691.     ADD    A
  692.     ADD    A
  693.     MOV    C,A
  694.     MOV    A,B
  695.     SUB    C
  696.     STA    NCP
  697.     RET
  698. ;
  699. ;
  700. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  701. ;
  702. ;    CURSOR CONTROL SUBROUTINES
  703. ;
  704. ;    ++++++++++++++++++++++++++++++++++++++++/+++++++
  705. ;
  706. ;
  707. CURSUP:
  708.     MVI    C,1FH
  709.     CALL    CO
  710.     DCR    B    ; B CONTAINS CNTR FOR ALL CRSR SUB'S
  711.     JNZ    CURSUP
  712.     RET
  713. ;
  714. ;
  715. CURSDN:
  716.     MVI    C,LF
  717.     CALL    CO
  718.     DCR    B
  719.     JNZ    CURSDN
  720.     RET
  721. ;
  722. ;
  723. CURSLT:
  724.     MVI    C,BSPACE
  725.     CALL    CO
  726.     DCR    B
  727.     JNZ    CURSLT
  728.     RET
  729. ;
  730. ;
  731. CURSRT:
  732.     MVI    C,1CH
  733.     CALL    CO
  734.     DCR    B
  735.     JNZ    CURSRT
  736.     RET
  737. ;
  738. ;
  739. CURSHOME:
  740.     MVI    C,19H
  741.     JMP    CO
  742. ;
  743. ;
  744. ;
  745. MSG0:    DB    19H,0CH
  746.     DB    'THREE DIMENSIONAL'
  747.     DB    '                         +  +  +  +',CR,LF
  748.     DB    ' TIC - TAC - TOE '
  749.     DB    '                         +  +  +  +',CR,LF
  750.     DB    '                            +  +  +  +  '
  751.     DB    '  +  +  +  +',CR,LF
  752.     DB    '                            +  +  +  +  '
  753.     DB    '  +  +  +  +',CR,LF
  754.     DB    '              +  +  +  +  '
  755.     DB    '  +  +  +  +',CR,LF
  756.     DB    '              +  +  +  +  '
  757.     DB    '  +  +  +  +',CR,LF
  758.     DB    '+  +  +  +  '
  759.     DB    '  +  +  +  +',CR,LF
  760.     DB    '+  +  +  +  '
  761.     DB    '  +  +  +  +',CR,LF
  762.     DB    '+  +  +  +',CR,LF
  763.     DB    '+  +  +  +'
  764.     DB    0
  765. ;
  766. MSG1:    DB    'ENTER YOUR MOVE',0
  767. MSG2:    DB    'TRY AGAIN      ',0
  768. MSG3:    DB    'I AM THINKING !',0
  769. MSG4:    DB    'TIE GAME !!!!!!',0
  770. MSG5:    DB    'YOU HAVE LOST !',0
  771. MSG6:    DB    'CONGRATULATIONS',0
  772. ;
  773. ;
  774. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  775. ;
  776. ;    RAM BUFFER SPACE
  777. ;
  778. ;    ++++++++++++++++++++++++++++++++++++++++++++++++
  779. ;
  780. ;
  781.     ORG    1000H
  782. ;
  783. BP:
  784. CBP:    DS    1    ; CURRENT BOARD POINTER
  785. CRP:    DS    1    ; CURRENT ROW POINTER
  786. CCP:    DS    1    ; CURRENT COLUMN POINTER
  787. ;
  788. NBP:    DS    1    ; NEW BOARD POINTER
  789. NRP:    DS    1    ; NEW ROW POINTER
  790. NCP:    DS    1    ; NEW COLUMN POINTER
  791. ;
  792. MOVEARY:    DS    65
  793. SUM:    DS    77
  794. TST1:    DS    1
  795. TST2:    DS    1
  796. TST3:    DS    1
  797. M1:    DS    1
  798. M2:    DS    1
  799. M3:    DS    1
  800. J3:    DS    2
  801. K3:    DS    1
  802. J4:    DS    1
  803. J5:    DS    2
  804. K5:    DS    1
  805. L5:    DS    2
  806. J6:    DS    2
  807. K6:    DS    1
  808. J7:    DS    1
  809. J8:    DS    2
  810. K8:    DS    1
  811. ;
  812. WAIT:    DB    0,22,43,23,42,26,39,27,38,1,64,13,52,4
  813.     DB    61,16,49,22,43,23,42
  814. ;
  815. TSTA1:    DB    0, 4,15, 3,10,10, 2, 2, 2, 2, 1, 5, 5, 5, 5,-1
  816. TSTA2:    DB    0,-1,-1,-1,10, 5, 2, 1, 1, 0, 1, 5, 5, 0, 0,-1
  817. TSTA3:    DB    0,-1,-1,-1,-1,10,-1, 2, 1, 2, 1,10, 5,10, 5,-1
  818. ;
  819. ROW:    DB    0
  820.     DB    22,43,64, 1,23,42,61, 4
  821.     DB    26,39,52,13,27,38,49,16
  822.     DB    22,42,62, 2,23,43,63, 3
  823.     DB    23,38,53, 8,27,42,57,12
  824.     DB    26,38,50,14,27,39,51,15
  825.     DB    22,39,56, 5,26,43,60, 9
  826.     DB    22,38,54, 6,23,39,55, 7
  827.     DB    26,42,58,10,27,43,59,11
  828.     DB    22,23,24,21,26,27,28,25
  829.     DB    22,26,30,18,23,27,31,19
  830.     DB    22,27,32,17,23,26,29,20
  831.     DB    38,39,40,37,42,43,44,41
  832.     DB    38,42,46,34,39,43,47,35
  833.     DB    38,43,48,33,39,42,45,36
  834.     DB    61, 1,21,41,64, 4,24,44
  835.     DB    49, 4,19,34,61,16,31,46
  836.     DB    49,13,25,37,52,16,28,40
  837.     DB    52, 1,18,35,64,13,30,47
  838.     DB    49, 1,17,33,52, 4,20,36
  839.     DB    61,13,29,45,64,16,32,48
  840.     DB    4, 1, 2, 3,16,13,14,15
  841.     DB    13, 1, 5, 9,16, 4, 8,12
  842.     DB    16, 1, 6,11,13, 4, 7,10
  843.     DB    52,49,50,51,64,61,62,63
  844.     DB    61,49,53,57,64,52,56,60
  845.     DB    64,49,54,59,61,52,55,58
  846.     DB    18,34,50, 2,19,35,51, 3
  847.     DB    21,37,53, 5,24,40,56, 8
  848.     DB    25,41,57, 9,28,44,60,12
  849.     DB    30,46,62,14,31,47,63,15
  850.     DB    6, 7, 8, 5,10,11,12, 9
  851.     DB    6,10,14, 2, 7,11,15, 3
  852.     DB    18,19,20,17,30,31,32,29
  853.     DB    21,25,29,17,24,28,32,20
  854.     DB    34,35,36,33,46,47,48,45
  855.     DB    37,41,45,33,40,44,48,36
  856.     DB    54,55,56,53,58,59,60,57
  857.     DB    54,58,62,50,55,59,63,51
  858. ;
  859.     END
  860.