home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG001.ARK / SPACE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  16KB  |  1,288 lines

  1. ;
  2. ; SPACEWAR FOR IMSAI 8080 AND TEKTRONIX 4013 (9600 BAUD).
  3. ;
  4. ;    COPYRIGHT (C) 1977
  5. ;    BY JEFFREY L. ZURKOW
  6. ;
  7. ;
  8.     ORG    100H
  9. ;
  10. ;
  11.     DI
  12.     LXI    H,0
  13.     DAD    SP
  14.     SHLD    SPSAVE
  15.     LXI    SP,STACK
  16.     LDA    70Q
  17.     STA    SAVE71
  18.     LHLD    71Q
  19.     SHLD    SAVE72
  20.     MVI    A,0C3H
  21.     STA    70Q
  22.     LXI    H,INT7
  23.     SHLD    71Q
  24. RESTART:
  25.     DI
  26.     MVI    C,ESC
  27.     CALL    TYOUT
  28.     MVI    C,FF
  29.     CALL    TYOUT
  30.     IN    0FFH
  31.     ANI    1
  32.     JZ    RS1
  33.     MVI    C,ESC
  34.     CALL    TYOUT
  35.     MVI    C,112
  36.     CALL    TYOUT
  37. RS1:    MVI    A,1
  38.     OUT    8    ;ENABLE TEKTRONIX IN AND OUT INTERRUPTS
  39.     XRA    A
  40.     STA    BUFSW
  41.     STA    TLIFE1
  42.     STA    RSTAR1
  43.     STA    RSTAR2
  44.     STA    HIT1
  45.     STA    HIT2
  46.     STA    MTHRUST1
  47.     STA    MTHRUST2
  48.     STA    VTHETA1
  49.     STA    VTHETA2
  50.     LXI    H,BUF1
  51.     SHLD    OUTBUF
  52.     SHLD    BPOINT
  53.     MVI    M,0
  54.     INX    H
  55.     MVI    M,13
  56.     LXI    H,BUF2
  57.     SHLD    CURBUF
  58.     LXI    H,BUF3
  59.     SHLD    MIDBUF
  60.     MVI    M,13
  61.     MVI    A,PI/2
  62.     STA    THETA1
  63.     MVI    A,3*PI/2
  64.     STA    THETA2
  65.     LXI    H,32 * X1INIT
  66.     SHLD    X1
  67.     SHLD    T1X
  68.     LXI    H,32 * Y1INIT
  69.     SHLD    Y1
  70.     SHLD    T1Y
  71.     LXI    H,32 * X2INIT
  72.     SHLD    X2
  73.     LXI    H,32 * Y2INIT
  74.     SHLD    Y2
  75.     LXI    H,0
  76.     SHLD    VX1
  77.     SHLD    VY1
  78.     SHLD    VX2
  79.     SHLD    VY2
  80.     EI
  81.     JMP    START
  82. ;
  83. ;
  84. SAVE71:    DB    0
  85. SAVE72: DW    0
  86. BPOINT:    DW    0
  87. ;
  88. ;    GLOBAL EQUATES
  89. ;    ====== =======
  90. ;
  91. ;
  92. TEKSTAT  EQU    3
  93. TEKDATA  EQU    2
  94. PI     EQU    200Q
  95. THRUST     EQU    0FH    ;MAIN THRUST MAGNITUDE
  96. TSPEED     EQU    09H    ;TORPEDO SPEED
  97. TLIFE     EQU    20H    ;TORPEDO LIFETIME
  98. ESC     EQU    27
  99. FF     EQU    12
  100. FRATE     EQU    07H
  101. RRATE     EQU    01H
  102. DELTA     EQU    0FFH
  103. EXRATE     EQU    03H
  104. SMAX     EQU    14
  105. X1INIT     EQU    150
  106. Y1INIT     EQU    150
  107. X2INIT     EQU    875
  108. Y2INIT     EQU    640
  109. THETA0     EQU    PI/2
  110. DELAY     EQU    100
  111. SIZE     EQU    3
  112. ;
  113. ;
  114. ;
  115. ;
  116. ;    KEYBOARD SHIP CONTROL CHARACTERS
  117. ;    ======== ==== ======= ==========
  118. ;
  119. ;
  120. LEFT1C    EQU    'A'
  121. RT1C    EQU    'S'
  122. FOR1C    EQU    'D'
  123. TORP1C    EQU    'F'
  124. ;
  125. LEFT2C    EQU    'J'
  126. RT2C    EQU    'K'
  127. FOR2C    EQU    'L'
  128. TORP2C    EQU    ';'
  129. ;
  130. CTRLC    EQU    03
  131. ;
  132. ;
  133. ;
  134. ;    OUTPUT BUFFER STUFF
  135. ;    ====== ====== =====
  136. ;
  137. ;
  138. BUFSW:    DB    0
  139. OUTBUF:    DW    0
  140. MIDBUF:    DW    0
  141. CURBUF:    DW    0
  142. ;
  143. ;
  144. ;
  145. ;
  146. ;
  147. ;
  148. START:    LHLD    CURBUF
  149. ST0:    CALL    SHIP1
  150.     CALL    TORP1
  151.     CALL    SHIP2
  152.     CALL    TORP2
  153.     MVI    M,13
  154. ;
  155.     LXI    H,RATE
  156.     INR    M
  157. ;
  158.     DI
  159.     LHLD    CURBUF
  160.     XCHG
  161.     LHLD    MIDBUF
  162.     SHLD    CURBUF
  163.     XCHG
  164.     SHLD    MIDBUF
  165.     MVI    A,1
  166.     STA    BUFSW
  167.     EI
  168. ;
  169. ;
  170. ;  ROTATION INTEGRATORS
  171. ;
  172.     LDA    RATE
  173.     ANI    RRATE
  174.     JNZ    ST1
  175. ;
  176.     LDA    THETA1
  177.     MOV    B,A
  178.     LDA    VTHETA1
  179.     ADD    B
  180.     STA    THETA1
  181. ;
  182.     LDA    THETA2
  183.     MOV    B,A
  184.     LDA    VTHETA2
  185.     ADD    B
  186.     STA    THETA2
  187. ;
  188. ST1:    LHLD    X1
  189.     XCHG
  190.     LHLD    VX1
  191.     DAD    D
  192.     MOV    A,H
  193.     ANI    7FH
  194.     MOV    H,A
  195.     SHLD    X1
  196. ;
  197.     LHLD    Y1
  198.     XCHG
  199.     LHLD    VY1
  200.     DAD    D
  201.     MOV    A,H
  202.     ANI    7FH
  203.     MOV    H,A
  204.     SHLD    Y1
  205. ;
  206.     LHLD    VX2
  207.     XCHG
  208.     LHLD    X2
  209.     DAD    D
  210.     MOV    A,H
  211.     ANI    7FH
  212.     MOV    H,A
  213.     SHLD    X2
  214. ;
  215.     LHLD    VY2
  216.     XCHG
  217.     LHLD    Y2
  218.     DAD    D
  219.     MOV    A,H
  220.     ANI    7FH
  221.     MOV    H,A
  222.     SHLD    Y2
  223. ;
  224.     LDA    TLIFE1
  225.     ORA    A
  226.     JZ    ST2
  227.     LHLD    T1X
  228.     XCHG
  229.     LHLD    VT1X
  230.     DAD    D
  231.     MOV    A,H
  232.     ANI    7FH
  233.     MOV    H,A
  234.     SHLD    T1X
  235. ;
  236.     LHLD    T1Y
  237.     XCHG
  238.     LHLD    VT1Y
  239.     DAD    D
  240.     MOV    A,H
  241.     ANI    7FH
  242.     MOV    H,A
  243.     SHLD    T1Y
  244. ;
  245.     JMP    ST2A
  246. ;
  247. ;
  248. ST2:    LHLD    X1
  249.     SHLD    T1X
  250.     LHLD    Y1
  251.     SHLD    T1Y
  252. ;
  253. ;
  254. ST2A:    LDA    TLIFE2
  255.     ORA    A
  256.     JZ    ST2B
  257.     LHLD    T2X
  258.     XCHG
  259.     LHLD    VT2X
  260.     DAD    D
  261.     MOV    A,H
  262.     ANI    7FH
  263.     MOV    H,A
  264.     SHLD    T2X
  265. ;
  266.     LHLD    T2Y
  267.     XCHG
  268.     LHLD    VT2Y
  269.     DAD    D
  270.     MOV    A,H
  271.     ANI    7FH
  272.     MOV    H,A
  273.     SHLD    T2Y
  274.     JMP    ST3A
  275. ;
  276. ST2B:    LHLD    X2
  277.     SHLD    T2X
  278.     LHLD    Y2
  279.     SHLD    T2Y
  280. ;
  281. ;
  282. ST3A:    LDA    RATE
  283.     ANI    EXRATE
  284.     JNZ    ST4
  285.     LDA    HIT2
  286.     ORA    A
  287.     JZ    ST3B
  288.     LXI    H,DELAY2
  289.     DCR    M
  290.     JZ    RESTART
  291.     LXI    H,RSTAR2
  292.     MOV    A,M
  293.     CPI    SMAX*4
  294.     JNC    ST3B
  295.     INR    A
  296.     MOV    M,A
  297. ;
  298. ST3B:    LDA    HIT1
  299.     ORA    A
  300.     JZ    ST4
  301.     LXI    H,DELAY2
  302.     DCR    M
  303.     JZ    RESTART
  304.     LXI    H,RSTAR1
  305.     MOV    A,M
  306.     CPI    SMAX*4
  307.     JNC    ST4
  308.     INR    A
  309.     MOV    M,A
  310. ;
  311. ST4:    LDA    TLIFE1
  312.     ORA    A
  313.     JZ    ST6
  314.     LHLD    X2
  315.     XCHG
  316.     LHLD    T1X
  317.     CALL    NBRHD
  318.     JNZ    ST5
  319.     LHLD    Y2
  320.     XCHG
  321.     LHLD    T1Y
  322.     CALL    NBRHD
  323.     JNZ    ST5
  324.     XRA    A
  325.     STA    TLIFE1
  326.     CALL    KILL2
  327. ;
  328. ST5:    LHLD    X1
  329.     XCHG
  330.     LHLD    T1X
  331.     CALL    NBRHD
  332.     JNZ    ST6
  333.     LHLD    Y1
  334.     XCHG
  335.     LHLD    T1Y
  336.     CALL    NBRHD
  337.     JNZ    ST6
  338.     XRA    A
  339.     STA    TLIFE1
  340.     CALL    KILL1
  341. ;
  342. ST6:    LDA    TLIFE2
  343.     ORA    A
  344.     JZ    ST8
  345.     LHLD    X1
  346.     XCHG
  347.     LHLD    T2X
  348.     CALL    NBRHD
  349.     JNZ    ST7
  350.     LHLD    Y1
  351.     XCHG
  352.     LHLD    T2Y
  353.     CALL    NBRHD
  354.     JNZ    ST7
  355.     XRA    A
  356.     STA    TLIFE2
  357.     CALL    KILL1
  358. ;
  359. ST7:    LHLD    X2
  360.     XCHG
  361.     LHLD    T2X
  362.     CALL    NBRHD
  363.     JNZ    ST8
  364.     LHLD    Y2
  365.     XCHG
  366.     LHLD    T2Y
  367.     CALL    NBRHD
  368.     JNZ    ST8
  369.     XRA    A
  370.     STA    TLIFE2
  371.     CALL    KILL2
  372. ;
  373. ST8:    LHLD    X1
  374.     XCHG
  375.     LHLD    X2
  376.     CALL    NBRHD
  377.     JNZ    ST9
  378.     LHLD    Y1
  379.     XCHG
  380.     LHLD    Y2
  381.     CALL    NBRHD
  382.     JNZ    ST9
  383.     CALL    KILL1
  384.     CALL    KILL2
  385. ;
  386. ST9:    JMP    START
  387. ;
  388. ;
  389. ;
  390. ;
  391. KILL1:    LDA    HIT1
  392.     ORA    A
  393.     RNZ
  394.     STA    MTHRUST1
  395.     INR    A
  396.     STA    HIT1
  397.     STA    RSTAR1
  398.     MVI    A,DELAY
  399.     STA    DELAY2
  400.     RET
  401. ;
  402. ;
  403. KILL2:    LDA    HIT2
  404.     ORA    A
  405.     RNZ
  406.     STA    MTHRUST2
  407.     INR    A
  408.     STA    HIT2
  409.     STA    RSTAR2
  410.     MVI    A,DELAY
  411.     STA    DELAY2
  412.     RET
  413. ;
  414. ;
  415. ;
  416. ;
  417. LEAVE:    DI
  418.     LHLD    SPSAVE
  419.     SPHL
  420.     MVI    A,13
  421.     CALL    TYOUT
  422.     MVI    A,10
  423.     CALL    TYOUT
  424.     LDA    SAVE71
  425.     STA    70Q
  426.     LHLD    SAVE72
  427.     SHLD    71Q
  428.     XRA    A
  429.     OUT    8
  430.     RET
  431. ;
  432. ;
  433. ;
  434. ;
  435. NBRHD:    MOV    A,L
  436.     SUB    E
  437.     MOV    L,A
  438.     MOV    A,H
  439.     SBB    D
  440.     MOV    H,A
  441.     JP    NB1
  442.     CMA
  443.     MOV    H,A
  444.     MOV    A,L
  445.     CMA
  446.     MOV    L,A
  447.     INX    H
  448. NB1:    LXI    D,NOT DELTA
  449.     MOV    A,D
  450.     ANA    H
  451.     MOV    H,A
  452.     MOV    A,E
  453.     ANA    L
  454.     ORA    H
  455.     RET
  456. ;
  457. ;
  458. ;
  459. ;
  460. ;    POINT
  461. ;    =====
  462. ;
  463. ;    POINT GENERATES A POINT FROM POLAR COORDINATES, WITH ORIGIN
  464. ;    AT (X,Y) AND THE WHOLE COORDINATE SYSTEM ROTATED BY THETA
  465. ;    ABOUT THE ORIGIN.  CALL POINT WITH THE RADIUS IN B,
  466. ;    THE ANGLE IN C, AND HL POINTING TO THE MEMORY BUFFER WHERE
  467. ;    THE RESULTS ARE TO BE PUT.  ON RETURN, THE BUFFER WILL CONTAIN
  468. ;    FIVE NEW BYTES, STARTING AT THE PREVIOUS (HL):  4 BYTES ARE
  469. ;    THE TEK 4013 COORDINATES OF THE FINAL POINT, Y FIRST,
  470. ;    AND THE FIFTH IS A ZERO BYTE TO ALLOW PROPER SETTLING TIME FOR
  471. ;    THE VECTOR GENERATOR IN THE 4013.  HL WILL POINT TO THE BYTE
  472. ;    AFTER THE NUL (ZERO) BYTE.
  473. ;
  474. ;
  475. POINT:    PUSH    H    ;SAVE BUFFER ADDRESS
  476.     LDA    THETA    ;GET SHIP ANGLE
  477.     ADD    C    ;ADD ANGLE FOR THIS POINT
  478.     MOV    C,A
  479.     PUSH    B    ;SAVE RADIUS (R) AND NEW ANGLE
  480.     CALL    SIN
  481.     POP    B    ;GET R AGAIN (SIN CLOBBERED B)
  482.     PUSH    B    ; BUT LEAVE IT ON STACK.
  483.     MOV    E,A    ;PUT SINE IN E FOR MULTIPLIER
  484.     CALL    MUL    ;THIS GETS R*SIN(THETA+PHI) IN HL
  485.     CALL    SHIFT    ;THIS SCALES THE RESULT
  486.     XCHG        ;NOW ADD Y
  487.     LHLD    Y
  488.     DAD    D
  489.     MOV    A,H
  490.     RLC
  491.     JC    ERASE1
  492.     CALL    TEKY    ;CONVERT TO 4013 FORMAT
  493.     POP    B
  494.     XCHG        ;SAVE RESULT
  495.     POP    H    ;GET BUFFER ADDRESS
  496.     MOV    M,D    ;SAVE FIRST BYTE
  497.     INX    H
  498.     MOV    M,E    ;SAVE SECOND BYTE
  499.     INX    H
  500.     PUSH    H
  501.     PUSH    B
  502.     MOV    A,C
  503.     CALL    COS    ;GET COSINE(THETA+PHI)
  504.     POP    B    ;GET R AGAIN
  505.     MOV    E,A    ;SET UP FOR MULTIPLY
  506.     CALL    MUL
  507.     CALL    SHIFT
  508.     XCHG
  509.     LHLD    X
  510.     DAD    D
  511.     MOV    A,H
  512.     RLC
  513.     JC    ERASE2
  514.     CALL    TEKX
  515.     XCHG
  516.     POP    H
  517.     MOV    M,D
  518.     INX    H
  519.     MOV    M,E
  520.     INX    H
  521.     XRA    A
  522. ;    MOV    M,A
  523. ;    INX    H
  524. ;    MOV    M,A
  525. ;    INX    H
  526.     ORA    A
  527.     RET
  528. ERASE1:    POP    B
  529. ERASE2:    POP    H
  530.     STC
  531.     RET
  532. ;
  533. ;
  534. ;
  535. ;
  536. SHIP1:    PUSH    H
  537.     LDA    THETA1
  538.     STA    THETA
  539.     LHLD    X1
  540.     SHLD    X
  541.     LHLD    Y1
  542.     SHLD    Y
  543.     LHLD    VX1
  544.     SHLD    VX
  545.     LHLD    VY1
  546.     SHLD    VY
  547.     LDA    MTHRUST1
  548.     ORA    A
  549.     JZ    SHP1B
  550.     LDA    RATE
  551.     ANI    FRATE
  552.     JNZ    SHP1B
  553.     MVI    A,THRUST
  554.     STA    MAG
  555.     CALL    RESOLVE
  556.     LHLD    VX
  557.     SHLD    VX1
  558.     LHLD    VY
  559.     SHLD    VY1
  560. ;
  561. SHP1B:    LDA    T1GO
  562.     ORA    A
  563.     JZ    SHP1C
  564.     XRA    A
  565.     STA    T1GO
  566.     MVI    A,TLIFE
  567.     STA    TLIFE1
  568.     CALL    FIRE
  569.     LHLD    VX
  570.     SHLD    VT1X
  571.     LHLD    VY
  572.     SHLD    VT1Y
  573. ;
  574.     LHLD    X
  575.     SHLD    T1X
  576.     LHLD    Y
  577.     SHLD    T1Y
  578. SHP1C:    POP    H
  579. ;
  580.     LDA    HIT1
  581.     ORA    A
  582.     LDA    RSTAR1
  583.     JNZ    STARB
  584. ;
  585.     PUSH    H
  586.     MVI    M,29
  587.     INX    H
  588.     MVI    B,5*SIZE
  589.     MVI    C,0
  590.     CALL    POINT
  591.     JC    BLANK1
  592.     MVI    B,4*SIZE
  593.     MVI    C,200Q
  594.     LDA    MTHRUST1
  595.     ORA    A
  596.     JZ    SHP1A
  597.     MVI    B,6*SIZE
  598. SHP1A:    CALL    POINT
  599.     JC    BLANK1
  600.     MVI    M,29
  601.     INX    H
  602.     MVI    B,5*SIZE
  603.     MVI    C,9AH
  604.     CALL    POINT
  605.     JC    BLANK1
  606.     MVI    B,5*SIZE
  607.     MVI    C,66H
  608.     CALL    POINT
  609.     JC    BLANK1
  610.     POP    B    ;CLEAR STACK
  611.     RET
  612. BLANK1:    POP    H
  613.     RET
  614. ;
  615. ;
  616. ;
  617. ;
  618. SHIP2:    PUSH    H
  619.     LDA    THETA2
  620.     STA    THETA
  621.     LHLD    X2
  622.     SHLD    X
  623.     LHLD    Y2
  624.     SHLD    Y
  625.     LHLD    VX2
  626.     SHLD    VX
  627.     LHLD    VY2
  628.     SHLD    VY
  629.     LDA    MTHRUST2
  630.     ORA    A
  631.     JZ    SHP2A
  632.     LDA    RATE
  633.     ANI    FRATE
  634.     JNZ    SHP2A
  635.     MVI    A,THRUST
  636.     STA    MAG
  637.     CALL    RESOLVE
  638.     LHLD    VX
  639.     SHLD    VX2
  640.     LHLD    VY
  641.     SHLD    VY2
  642. ;
  643. SHP2A:    LDA    T2GO
  644.     ORA    A
  645.     JZ    SHP2B
  646.     XRA    A
  647.     STA    T2GO
  648.     MVI    A,TLIFE
  649.     STA    TLIFE2
  650.     CALL    FIRE
  651.     LHLD    VX
  652.     SHLD    VT2X
  653.     LHLD    VY
  654.     SHLD    VT2Y
  655.     ;
  656.     LHLD    X
  657.     SHLD    T2X
  658.     LHLD    Y
  659.     SHLD    T2Y
  660. ;
  661. SHP2B:    POP    H
  662.     LDA    HIT2
  663.     ORA    A
  664.     LDA    RSTAR2
  665.     JNZ    STARB
  666.     PUSH    H
  667.     MVI    M,29
  668.     INX    H
  669.     MVI    B,5*SIZE
  670.     MVI    C,0
  671.     CALL    POINT
  672.     JC    BLANK2
  673.     MVI    B,5*SIZE
  674.     MVI    C,66H
  675.     CALL    POINT
  676.     JC    BLANK2
  677.     MVI    B,5*SIZE
  678.     MVI    C,9AH
  679.     CALL    POINT
  680.     JC    BLANK2
  681.     MVI    B,5*SIZE
  682.     MVI    C,0
  683.     CALL    POINT
  684.     JC    BLANK2
  685.     LDA    MTHRUST2
  686.     ORA    A
  687.     JZ    SHP2C
  688.     MVI    M,29
  689.     INX    H
  690.     MVI    B,3*SIZE
  691.     MVI    C,PI
  692.     CALL    POINT
  693.     JC    BLANK2
  694.     MVI    B,5*SIZE
  695.     MVI    C,PI
  696.     CALL    POINT
  697.     JC    BLANK2
  698. SHP2C:    POP    B
  699.     RET
  700. BLANK2:    POP    H
  701.     RET
  702. ;
  703. ;
  704. ;
  705. ;
  706. TORP1:    MVI    M,29
  707.     INX    H
  708.     PUSH    H
  709.     LHLD    T1Y
  710.     CALL    TEKY
  711.     XCHG
  712.     POP    H
  713.     MOV    M,D
  714.     INX    H
  715.     MOV    M,E
  716.     INX    H
  717.     PUSH    H
  718.     LHLD    T1X
  719.     CALL    TEKX
  720.     XCHG
  721.     POP    H
  722.     MOV    M,D
  723.     INX    H
  724.     MOV    M,E
  725.     INX    H
  726.     MVI    M,0
  727.     INX    H
  728.     MVI    M,0
  729.     INX    H
  730.     MOV    M,E
  731.     INX    H
  732.     RET
  733. ;
  734. ;
  735. ;
  736. ;
  737. ;
  738. TORP2:    MVI    M,29
  739.     INX    H
  740.     PUSH    H
  741.     LHLD    T2Y
  742.     CALL    TEKY
  743.     XCHG
  744.     POP    H
  745.     MOV    M,D
  746.     INX    H
  747.     MOV    M,E
  748.     INX    H
  749.     PUSH    H
  750.     LHLD    T2X
  751.     CALL    TEKX
  752.     XCHG
  753.     POP    H
  754.     MOV    M,D
  755.     INX    H
  756.     MOV    M,E
  757.     INX    H
  758.     XRA    A
  759.     MOV    M,A
  760.     INX    H
  761.     MOV    M,A
  762.     INX    H
  763.     MOV    M,E
  764.     INX    H
  765.     RET
  766. ;
  767. ;
  768. ;
  769. ;
  770. ;
  771. STARB:    PUSH    H
  772.     STA    RSTAR
  773.     MVI    M,29
  774.     INX    H
  775.     MVI    C,0
  776.     CALL    STARB1
  777.     MVI    C,PI
  778.     CALL    STARB1
  779.     MVI    M,29
  780.     INX    H
  781.     MVI    C,5*PI/4
  782.     CALL    STARB1
  783.     MVI    C,PI/4
  784.     CALL    STARB1
  785.     MVI    M,29
  786.     INX    H
  787.     MVI    C,PI/2
  788.     CALL    STARB1
  789.     MVI    C,3*PI/2
  790.     CALL    STARB1
  791.     MVI    M,29
  792.     INX    H
  793.     MVI    C,7*PI/4
  794.     CALL    STARB1
  795.     MVI    C,3*PI/4
  796.     CALL    STARB1
  797.     POP    B
  798.     RET
  799. ;
  800. STARB1:    LDA    RSTAR
  801.     MOV    B,A
  802.     CALL    POINT
  803.     RNC
  804.     POP    B
  805.     POP    H
  806.     RET
  807. ;
  808. ;
  809. ;
  810. ;
  811. ;
  812. ;
  813. INT7:    PUSH    PSW
  814.     PUSH    H
  815.     IN    TEKSTAT
  816.     ANI    2
  817.     JNZ    INPUT
  818.     LHLD    BPOINT
  819.     MOV    A,M
  820.     CPI    13
  821.     JZ    BUFEND
  822.     OUT    TEKDATA
  823.     INX    H
  824.     SHLD    BPOINT
  825. ;
  826. EXIT7:    POP    H
  827.     POP    PSW
  828.     EI
  829.     RET
  830. ;
  831. BUFEND:    LDA    BUFSW
  832.     ORA    A
  833.     JZ    BUFEN1
  834.     PUSH    D
  835.     XRA    A
  836.     STA    BUFSW
  837.     LHLD    MIDBUF
  838.     XCHG
  839.     LHLD    OUTBUF
  840.     SHLD    MIDBUF
  841.     XCHG
  842.     SHLD    OUTBUF
  843.     POP    D
  844. ;
  845. BUFEN1:    LHLD    OUTBUF
  846.     MOV    A,M
  847.     OUT    TEKDATA
  848.     INX    H
  849.     SHLD    BPOINT
  850.     LXI    H,TLIFE1
  851.     MOV    A,M
  852.     ORA    A
  853.     JZ    BUFEN2
  854.     DCR    A
  855.     MOV    M,A
  856. ;
  857. BUFEN2:    INX    H
  858.     MOV    A,M
  859.     ORA    A
  860.     JZ    EXIT7
  861.     DCR    A
  862.     MOV    M,A
  863.     JMP    EXIT7
  864. ;
  865. INPUT:    IN    TEKDATA
  866.     ANI    7FH
  867.     CPI    CTRLC
  868.     JZ    LEAVE
  869.     MOV    H,A
  870.     LDA    HIT1
  871.     ORA    A
  872.     MOV    A,H
  873.     JNZ    INP1
  874.     LXI    H,VTHETA1
  875.     CPI    LEFT1C
  876.     JZ    LEFT
  877.     CPI    RT1C
  878.     JZ    RIGHT
  879.     LXI    H,MTHRUST1
  880.     CPI    FOR1C
  881.     JZ    FORWD
  882.     CPI    TORP1C
  883.     JZ    FIRE1
  884. INP1:    MOV    H,A
  885.     LDA    HIT2
  886.     ORA    A
  887.     MOV    A,H
  888.     JNZ    INP2
  889.     LXI    H,VTHETA2
  890.     CPI    LEFT2C
  891.     JZ    LEFT
  892.     CPI    RT2C
  893.     JZ    RIGHT
  894.     LXI    H,MTHRUST2
  895.     CPI    FOR2C
  896.     JZ    FORWD
  897.     CPI    TORP2C
  898.     JZ    FIRE2
  899. ;
  900. INP2:    JMP    EXIT7
  901. ;
  902. LEFT:    INR    M
  903.     JMP    EXIT7
  904. ;
  905. RIGHT:    DCR    M
  906.     JMP    EXIT7
  907. ;
  908. FORWD:    MOV    A,M
  909.     ANI    1
  910.     XRI    1
  911.     MOV    M,A
  912.     JMP    EXIT7
  913. ;
  914. FIRE1:    LDA    TLIFE1
  915.     ORA    A
  916.     JNZ    EXIT7
  917.     INR    A
  918.     STA    T1GO
  919.     JMP    EXIT7
  920. ;
  921. ;
  922. FIRE2:    LDA    TLIFE2
  923.     ORA    A
  924.     JNZ    EXIT7
  925.     INR    A
  926.     STA    T2GO
  927.     JMP    EXIT7
  928. ;
  929. ;
  930. ;
  931. ;
  932. FIRE:    LDA    THETA
  933.     PUSH    PSW
  934.     CALL    COS
  935.     MOV    E,A
  936.     PUSH    D
  937.     MVI    B,5*SIZE
  938.     CALL    MUL
  939.     CALL    SHIFT
  940.     XCHG
  941.     LHLD    X
  942.     DAD    D
  943.     SHLD    X
  944.     POP    D
  945.     MVI    B,TSPEED
  946.     CALL    MUL
  947.     CALL    SHIFT
  948.     XCHG
  949.     LHLD    VX
  950.     DAD    D
  951.     SHLD    VX
  952.     POP    PSW
  953.     CALL    SIN
  954.     MOV    E,A
  955.     PUSH    D
  956.     MVI    B,5*SIZE
  957.     CALL    MUL
  958.     CALL    SHIFT
  959.     XCHG
  960.     LHLD    Y
  961.     DAD    D
  962.     SHLD    Y
  963.     POP    D
  964.     MVI    B,TSPEED
  965.     CALL    MUL
  966.     CALL    SHIFT
  967.     XCHG
  968.     LHLD    VY
  969.     DAD    D
  970.     SHLD    VY
  971.     RET
  972. ;
  973. ;
  974. ;
  975. ;
  976. ;
  977. RESOLVE:
  978.     LDA    THETA
  979.     PUSH    PSW
  980.     CALL    COS
  981.     MOV    E,A
  982.     LDA    MAG
  983.     MOV    B,A
  984.     CALL    MUL
  985.     MOV    E,H
  986.     MVI    D,0
  987.     MOV    A,H
  988.     RLC
  989.     JNC    FORW1
  990.     MVI    D,0FFH
  991. FORW1:    LHLD    VX
  992.     DAD    D
  993.     SHLD    VX
  994.     POP    PSW
  995.     CALL    SIN
  996.     MOV    E,A
  997.     LDA    MAG
  998.     MOV    B,A
  999.     CALL    MUL
  1000.     MOV    E,H
  1001.     MVI    D,0
  1002.     MOV    A,H
  1003.     RLC
  1004.     JNC    FORW2
  1005.     MVI    D,0FFH
  1006. FORW2:    LHLD    VY
  1007.     DAD    D
  1008.     SHLD    VY
  1009.     RET
  1010. ;
  1011. ;
  1012. ;
  1013. ;
  1014. SHIFT:    MOV    A,L
  1015.     RRC
  1016.     RRC
  1017.     ANI    3FH
  1018.     MOV    L,A
  1019.     MOV    A,H
  1020.     RRC
  1021.     RRC
  1022.     ANI    0C0H
  1023.     ORA    L
  1024.     MOV    L,A
  1025.     MOV    A,H
  1026.     RLC
  1027.     RRC
  1028.     RAR
  1029.     RLC
  1030.     RRC
  1031.     RAR
  1032.     MOV    H,A
  1033.     RET
  1034. ;
  1035. RSTAR    DB    0
  1036. RSTAR1    DB    0
  1037. RSTAR2    DB    0
  1038. HIT1:    DB    0
  1039. HIT2:    DB    0
  1040. T1GO    DB    0
  1041. T2GO    DB    0
  1042. DELAY2    DB    0
  1043. Y1    DW    390*32
  1044. X1    DW    514*32
  1045. Y    DW    390*32
  1046. X    DW    514*32
  1047. VX    DW    0
  1048. VY    DW    0
  1049. THETA    DB    0
  1050. THETA1    DB    0
  1051. THETA2    DB    0
  1052. VTHETA1    DB    0
  1053. VTHETA2    DB    0
  1054. MTHRUST1  DB    0
  1055. MTHRUST2 DB    0
  1056. VX1    DW    0
  1057. VY1    DW    0
  1058. VX2    DW    0
  1059. VY2    DW    0
  1060. X2    DW    400*32
  1061. Y2    DW    250*32
  1062. T1X    DW    0
  1063. T1Y    DW    0
  1064. VT1X    DW    0
  1065. VT1Y    DW    0
  1066. T2X    DW    0
  1067. T2Y    DW    0
  1068. VT2X    DW    0
  1069. VT2Y    DW    0
  1070. TLIFE1    DB    0
  1071. TLIFE2    DB    0
  1072. RATE    DB    0
  1073. MAG    DB    0
  1074. SPSAVE    DW    0
  1075. BUF1    DS    150
  1076. BUF2    DS    150
  1077. BUF3    DS    150
  1078. STACK    DS    256
  1079. ;
  1080. ;
  1081. ;
  1082. ;
  1083. ;    MULTIPLICATION ROUTINE
  1084. ;    ============== =======
  1085. ;
  1086. ;
  1087. ;    THIS ROUTINE USES BOOTH'S ALGORITHM TO MULTIPLY
  1088. ;    TWO 8-BIT TWO'S-COMPLEMENT NUMBERS AND GENERATE
  1089. ;    A 16-BIT TWO'S-COMPLEMENT PRODUCT.  ARGUMENTS
  1090. ;    ARE PASSED IN B AND E, AND THE PRODUCT IS RETURNED
  1091. ;    IN HL.  ALL REGISTERS AND FLAGS ARE CLOBBERED
  1092. ;    EXCEPT E.  ON RETURN, C IS ZERO, E IS INTACT, AND
  1093. ;    THE SIGN BIT OF E HAS BEEN EXTENDED THROUGH D.
  1094. ;
  1095. ;
  1096. ;
  1097. MUL:    LXI    H,0    ;CLEAR PRODUCT
  1098.     MOV    A,E    ;GET MULTIPLICAND
  1099.     MVI    D,0    ;CLEAR HIGH BYTE OF MULTIPLICAND
  1100.     RLC        ;TEST MULTIPLICAND SIGN BIT
  1101.     JNC    POS
  1102.     MVI    D,0FFH    ;IF NEGATIVE, EXTEND SIGN BIT THRU D
  1103. POS:
  1104. ;
  1105.     ORA    A    ;CLEAR CARRY=B(-1)
  1106.     MVI    C,8    ;STEP COUNT
  1107.     MOV    A,B    ;GET MULTIPLIER
  1108.     RAL        ;SET UP TO BEGIN WITH BIT 7
  1109. ;
  1110. LOOP:    JC    HBS    ;JUMP IF B(K)=1
  1111.     RLC        ;TEST B(K-1)
  1112.     MOV    B,A    ;SAVE ROTATED MULTIPLIER
  1113.     JC    LBS    ;JUMP IF B(K-1)=0
  1114. ;
  1115. NEXT:    DCR    C    ;DECREMENT STEP COUNT
  1116.     RZ        ;FINISHED IF C=0
  1117.     DAD    H    ;SHIFT PRODUCT LEFT ONE PLACE
  1118.     MOV    A,B    ;GET MULTIPLIER AGAIN
  1119.     RRC        ;RESTORE CARRY CHANGED BY DAD INSTR.
  1120.     MOV    A,B    ;ONCE AGAIN GET MULTIPLIER
  1121.     JMP    LOOP
  1122. ;
  1123. HBS:    RLC        ;TEST B(K-1)
  1124.     MOV    B,A    ;SAVE ROTATED MULTIPLIER
  1125.     JC    NEXT    ;JUMP IF B(K)=B(K-1)=1
  1126.     MOV    A,L    ;SUBTRACT MULTIPLICAND FROM PARTIAL PRODUCT
  1127.     SUB    E
  1128.     MOV    L,A
  1129.     MOV    A,H
  1130.     SBB    D
  1131.     MOV    H,A
  1132.     JMP    NEXT
  1133. ;
  1134. LBS:    DAD    D    ;ADD MULTIPLICAND TO PARTIAL PRODUCT
  1135.     JMP    NEXT
  1136. ;
  1137. ;
  1138. ;
  1139. ;
  1140. ;
  1141. ;
  1142. ;
  1143. ;
  1144. ;    SINE AND COSINE ROUTINE
  1145. ;    =======================
  1146. ;
  1147. ;
  1148. ;    THIS ROUTINE FINDS SIN(X) AND COS(X) BY A TABLE
  1149. ;    LOOK-UP. ARGUMENTS ARE PASSED IN A AND VALUES 
  1150. ;    RETURNED THERE.  THE VALUE RETURNED IS AN EIGHT-
  1151. ;    BIT NUMBER IN TWO'S COMPLEMENT FORM, SUCH THAT
  1152. ;    SIN(0) YIELDS 7F HEX AND SIN(PI/2) YIELDS FF.
  1153. ;    ANGLES ARE REPRESENTED AS BINARY FRACTIONS OF
  1154. ;    2 PI; THAT IS, PI=80H, PI/2 = 40H, AND SO FORTH.
  1155. ;    THERE ARE SEPARATE ENTRY POINTS FOR SINE AND
  1156. ;    COSINE.  THE TABLE USED IS ONLY FOR THE FIRST
  1157. ;    QUADRANT AND CONTAINS 8-BIT UNSIGNED VALUES OF
  1158. ;    SIN(X).  ONE BIT OF PRECISION IS LOST WHEN THESE
  1159. ;    ARE CONVERTED TO SIGNED 8-BIT NUMBERS.
  1160. ;
  1161. ;
  1162. ;    SINE TABLE
  1163. ;    ==========
  1164. ;
  1165. SINES:  DB  000H,006H,00CH,013H,019H,01FH,025H,02CH
  1166.     DB  032H,038H,03EH,044H,04AH,050H,056H,05CH
  1167.     DB  062H,067H,06DH,073H,078H,07EH,083H,086H
  1168.     DB  08EH,093H,098H,09DH,0A2H,0A7H,0ACH,0B0H
  1169.     DB  0B5H,0B9H,0BDH,0C2H,0C6H,0CAH,0CDH,0D1H
  1170.     DB  0D5H,0D8H,0DBH,0DEH,0E2H,0E4H,0E7H,0EAH
  1171.     DB  0ECH,0EFH,0F1H,0F3H,0F5H,0F6H,0F8H,0FAH
  1172.     DB  0FBH,0FCH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH
  1173.     DB  0FFH
  1174. ;
  1175. ;
  1176. ;
  1177. ;
  1178. ;    COSINE ENTRY POINT
  1179. ;    ====== ===== =====
  1180. ;
  1181. COS:    ADI    100Q
  1182. ;
  1183. ;
  1184. ;    SINE ENTRY POINT
  1185. ;    ==== ===== =====
  1186. ;
  1187. ;
  1188. SIN:    MVI    C,1    ;CLEAR FLAG
  1189.     MOV    B,A    ;SAVE ARGUMENT
  1190.     RLC        ;TEST BIT 7
  1191.     JC    Q34    ;SET- QUADRANT 3 OR 4
  1192.     RLC        ;TEST BIT 6
  1193.     MOV    A,B    ;GET ARGUMENT BACK
  1194.     JNC    Q1    ;JUMP IF 1ST QUADRANT
  1195.     MVI    A,200Q    ;BIT 6 SET- 2ND QUADRANT
  1196.     SUB    B    ;TAKE SIN(PI-X)
  1197. Q1:    LXI    H,SINES    ;GET START OF SINE TABLE
  1198.     MVI    D,0    ;GET OFFSET IN DE
  1199.     MOV    E,A
  1200.     DAD    D    ;GET ENTRY ADDRESS
  1201.     MOV    A,M    ;GET VALUE FROM TABLE
  1202.     ORA    A    ;CLEAR CARRY
  1203.     RAR        ;DIVIDE BY TWO
  1204.     DCR    C    ;TEST FLAG
  1205.     RZ        ;RETURN IF RESULT POSITIVE
  1206.     CMA        ;NEGATE RESULT
  1207.     INR    A
  1208.     RET
  1209. ;
  1210. Q34:    MVI    C,2    ;SET FLAG
  1211.     RLC        ;TEST BIT 6
  1212.     MOV    A,B    ;GET ARGUMENT BACK
  1213.     JC    Q4    ;JUMP IF 4TH QUADRANT
  1214.     SUI    200Q    ;SUBTRACT PI FROM ARGUMENT
  1215.     JMP    Q1    ;NOW TREAT AS FIRST QUADRANT
  1216. ;
  1217. Q4:    CMA        ;NEGATE ARGUMENT
  1218.     INR    A
  1219.     JMP    Q1
  1220. ;
  1221. ;
  1222. ;
  1223. ;
  1224. ;
  1225. ;
  1226. ;
  1227. ;    OUTPUT CHARACTER TO SCOPE
  1228. ;    ====== ========= == =====
  1229. ;
  1230. ;    CALL WITH CHARACTER IN C.
  1231. ;    CLOBBERS A AND FLAGS.
  1232. ;
  1233. ;
  1234. TYOUT:    IN    TEKSTAT
  1235.     RRC
  1236.     JNC    TYOUT
  1237.     MOV    A,C
  1238.     OUT    TEKDATA
  1239.     RET
  1240. ;
  1241. ;
  1242. ;
  1243. ;
  1244. ;    TEKX AND TEKY
  1245. ;    =============
  1246. ;
  1247. ;    THESE ROUTINES TAKE A 10-BIT QUANTITY IN HL, CONVERT IT
  1248. ;    TO TEKTRONIX 4013 COORDINATES, AND LEAVE THE TWO RESULTING
  1249. ;    BYTES IN H AND L.  TEKY APPENDS THE PROPER HIGH-ORDER
  1250. ;    OCTAL DIGIT (IN EACH BYTE) FOR Y-COORDINATES, AND
  1251. ;    TEKX DOES THE SAME FOR X-COORDINATES.
  1252. ;
  1253. ;
  1254. ;
  1255. TEKX:    MVI    B,40H
  1256.     DB    11H
  1257. TEKY:    MVI    B,60H
  1258.     MOV    C,H
  1259.     MOV    A,H
  1260.     RRC
  1261.     RRC
  1262.     ANI    1FH
  1263.     ORI    20H
  1264.     MOV    H,A
  1265.     MOV    A,L
  1266.     RLC
  1267.     RLC
  1268.     RLC
  1269.     ANI    7
  1270.     MOV    L,A
  1271.     MOV    A,C
  1272.     RLC
  1273.     RLC
  1274.     RLC
  1275.     ANI    18H
  1276.     ORA    L
  1277.     ORA    B
  1278.     MOV    L,A
  1279.     RET
  1280. ;
  1281. ;
  1282. ;
  1283. ;
  1284. ;
  1285. ;
  1286. ;
  1287.     END
  1288.