home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol167 / vti.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.9 KB  |  715 lines

  1.  
  2. ;    org 0100H
  3.     org 9000H
  4.  
  5.     jmp main
  6.  
  7. go:    equ    ge
  8. chin:    equ    0C20H    ;POLY-88 WH0 (keyboard wormhole)
  9. ;chin:    equ    read    ;subroutine to read VDM (port EC)
  10.  
  11. vorg:    equ    0F800H
  12. vsiz:    equ    00400H
  13. rsiz    equ    00040H
  14. msk:    equ    00CC9H
  15. wye:    equ    00CCAH
  16. eks:    equ    00CCBH
  17. wy:    equ    00CCCH
  18. ex:    equ    00CCDH
  19.  
  20. ;    move cursor up one pixel
  21.  
  22. ypl:    lxi h,msk
  23.     mov a,m
  24.     ani 024H
  25.     jnz yp1
  26.     mov a,m
  27.     rlc
  28.     mov m,a
  29.     ret
  30. yp1:    rrc
  31.     rrc
  32.     mov m,a
  33.     lda wye
  34.     sui 010H
  35.     sta wye
  36.     ret
  37.  
  38. ;    move cursor down one pixel
  39.  
  40. ymi:    lxi h,msk
  41.     mov a,m
  42.     ani 009H
  43.     jnz ym1
  44.     mov a,m
  45.     rrc
  46.     mov m,a
  47.     ret
  48. ym1:    rlc
  49.     rlc
  50.     mov m,a
  51.     lda wye
  52.     adi 010H
  53.     sta wye
  54.     ret
  55.  
  56. ;    move cursor right one pixel
  57.  
  58. xpl:    lxi h,msk
  59.     mov a,m
  60.     ani 007H
  61.     jnz xp1
  62.     mov a,m
  63.     rrc
  64.     rrc
  65.     rrc
  66.     mov m,a
  67.     ret
  68. xp1:    rlc
  69.     rlc
  70.     rlc
  71.     mov m,a
  72.     lda eks
  73.     adi 004H
  74.     sta eks
  75.     ret
  76.  
  77. ;    move cursor left one pixel
  78.  
  79. xmi:    lxi h,msk
  80.     mov a,m
  81.     ani 038H
  82.     jnz xm1
  83.     mov a,m
  84.     rlc
  85.     rlc
  86.     rlc
  87.     mov m,a
  88.     ret
  89. xm1:    rrc
  90.     rrc
  91.     rrc
  92.     mov m,a
  93.     lda eks
  94.     sui 004H
  95.     sta eks
  96.     ret
  97.  
  98. ;    load A with the bit mask, HL with a byte address
  99. ;    given the cursor positioning data at (msk,wye,eks)
  100.  
  101. dot:    lhld wye
  102.     mov a,h
  103.     mvi h,03EH
  104.     dad h
  105.     dad h
  106.     rrc
  107.     rrc
  108.     ora l
  109.     mov l,a
  110.     lda msk
  111.     ret
  112.  
  113. ;    home the cursor
  114.  
  115. home:    lxi h,8080H
  116.     shld wye
  117.     mvi a,008H
  118.     sta msk
  119.     ret
  120.  
  121. ;    extinguish the cursor
  122.  
  123. cuex:    call dot
  124.     ora m
  125.     mov m,a
  126.     ret
  127.  
  128. ;    light the cursor
  129.  
  130. culi:    call dot
  131.     cma
  132.     ana m
  133.     mov m,a
  134.     ret
  135.  
  136. ;    reverse the cursor
  137.  
  138. crev:    call dot
  139.     xra m
  140.     mov m,a
  141.     ret
  142.  
  143. ;    sense the cursor
  144.  
  145. cuse:    call dot
  146.     ana m
  147.     ani 03FH
  148.     ret
  149.  
  150. ;    clear the whole screen to black
  151.  
  152. blak:    lxi d,vsiz
  153.     lxi h,vorg
  154. bl1:    mvi m,0FFH
  155.     inx h
  156.     dcr e
  157.     jnz bl1
  158.     dcr d
  159.     jnz bl1
  160.     ret
  161.  
  162. ;    clear the whole screen to white
  163.  
  164. whit:    lxi d,vsiz
  165.     lxi h,vorg
  166. wh1:    mvi m,080H
  167.     inx h
  168.     dcr e
  169.     jnz wh1
  170.     dcr d
  171.     jnz wh1
  172.     ret
  173.  
  174. ;    reverse the whole screen
  175.  
  176. reve:    lxi d,vsiz
  177.     lxi h,vorg
  178. rev1:    mov a,m
  179.     xri 03FH
  180.     mov m,a
  181.     inx h
  182.     dcr e
  183.     jnz rev1
  184.     dcr d
  185.     jnz rev1
  186.     ret
  187.  
  188. ;    transform cartesian coordinates in the form of x,y
  189. ;    to a mask and byte address
  190.  
  191. cart:    mvi b,016H
  192.     mvi c,004H
  193.     lda wy
  194.     cma
  195.     adi 031H
  196. car1:    cmp b
  197.     jc car2
  198.     sub b
  199. car2:    cmc
  200.     adc a
  201.     dcr c
  202.     jnz car1
  203.     mov c,a
  204.     ani 00FH
  205.     rlc
  206.     rlc
  207.     rlc
  208.     rlc
  209.     sta wye
  210.     mov a,c
  211.     ani 0F0H
  212.     jnz car3
  213.     mvi a,006H
  214. car3:    mov c,a
  215.     ani 026H
  216.     jz car4
  217.     xri 026H
  218.     mov c,a
  219. car4:    lda ex
  220.     dcr a
  221.     mov b,a
  222.     rlc
  223.     ani 0FCH
  224.     sta eks
  225.     mov a,b
  226.     ani 001H
  227.     mov a,c
  228.     jnz car5
  229.     rrc
  230.     rrc
  231.     rrc
  232. car5:    sta msk
  233.     ret
  234.  
  235. ;    draw a line with increments dx,dy = (C,B).  increment
  236. ;    may be + or - using complementary arithmetic, but less
  237. ;    than 64 in absolute value to avoid overflow problems.
  238.  
  239. line:    lxi h,ypl
  240.     mov a,b
  241.     ora a
  242.     jp lin1
  243.     cma
  244.     inr a
  245.     mov b,a
  246.     lxi h,ymi
  247. lin1:    lxi d,xpl
  248.     mov a,c
  249.     ora a
  250.     jp lin2
  251.     cma
  252.     inr a
  253.     mov c,a
  254.     lxi d,xmi
  255. lin2:    cmp b
  256.     jnc lin3
  257.     xchg
  258.     mov c,b
  259.     mov b,a
  260. lin3:    mov a,c
  261.     sta wy
  262.     mov a,b
  263.     add a
  264.     mov b,a
  265.     sub c
  266.     push psw
  267.     sub c
  268.     mov c,a
  269. lin4:    pop psw
  270.     push h
  271.     lxi h,culi
  272.     xthl
  273.     cpi 001H
  274.     jm lin5
  275.     push h
  276.     add c
  277.     jmp lin6
  278. lin5:    add b
  279. lin6:    push d
  280.     push psw
  281.     lda ex
  282.     dcr a
  283.     sta ex
  284.     jnz lin4
  285.     pop psw
  286.     ret
  287.  
  288. ;    the movements in one byte necessary to shift the
  289. ;    whole screen right one pixel.
  290.  
  291. expl:    mov a,m
  292.     ani 03FH
  293.     mov b,a
  294.     ani 038H
  295.     rrc
  296.     rrc
  297.     rrc
  298.     ora c
  299.     mov c,a
  300.     mov a,b
  301.     rlc
  302.     rlc
  303.     rlc
  304.     ani 038H
  305.     mov b,c
  306.     mov c,a
  307.     ret
  308.  
  309. ;    the movements within one pixel necessary for shifting
  310. ;    the whole screen left one pixel.
  311.  
  312. exmi:    mov a,m
  313.     ani 03FH
  314.     mov b,a
  315.     rlc
  316.     rlc
  317.     rlc
  318.     ani 038H
  319.     ora c
  320.     mov c,a
  321.     mov a,b
  322.     ani 038H
  323.     rrc
  324.     rrc
  325.     rrc
  326.     mov b,c
  327.     mov c,a
  328.     ret
  329.  
  330. ;    the movements necessary within one byte to shift the
  331. ;    whole screen down one pixel.
  332.  
  333. wymi:    mov a,m
  334.     ani 03FH
  335.     mov b,a
  336.     ani 036H
  337.     rrc
  338.     ora c
  339.     mov c,a
  340.     mov a,b
  341.     rlc
  342.     rlc
  343.     ani 024H
  344.     mov b,c
  345.     mov c,a
  346.     ret
  347.  
  348. ;    the movements necessary within one byte to shift the
  349. ;    whole screen up one pixel.
  350.  
  351. wypl:    mov a,m
  352.     ani 03FH
  353.     mov b,a
  354.     rlc
  355.     ani 036H
  356.     ora c
  357.     mov c,a
  358.     mov a,b
  359.     ani 024H
  360.     rrc
  361.     rrc
  362.     mov b,c
  363.     mov c,a
  364.     ret
  365.  
  366. ;    move the whole screen right one pixel
  367.  
  368. ekspl:    lxi h,vorg
  369.     lxi d,rsiz-1
  370. eksp1:    push h
  371.     dad d
  372.     call expl
  373.     pop h
  374. eksp2:    call expl
  375.     mov a,b
  376.     ori 080H
  377.     mov m,a
  378.     inx h
  379.     mov a,l
  380.     ani 03FH
  381.     jnz eksp2
  382.     mov a,h
  383.     cpi 0FCH
  384.     jnz eksp1
  385.     ret
  386.  
  387. ;    move the whole screen left one pixel
  388.  
  389. eksmi:    lxi h,vorg+vsiz-1
  390.     lxi d,-rsiz+1
  391. eksm1:    push h
  392.     dad d
  393.     call exmi
  394.     pop h
  395. eksm2:    call exmi
  396.     mov a,b
  397.     ori 080H
  398.     mov m,a
  399.     mov a,l
  400.     ani 03FH
  401.     dcx h
  402.     jnz eksm2
  403.     mov a,h
  404.     cpi 0F7H
  405.     jnz eksm1
  406.     ret
  407.  
  408. ;    Move the whole screen up one pixel.
  409. ;    this is the control loop which calls the shift of
  410. ;    a column in such a way as to make it cyclic.
  411.  
  412. wyepl:    lxi h,vorg+vsiz-1
  413. wyep1:    lxi d,-vsiz+rsiz
  414.     push h
  415.     dad d
  416.     call wypl
  417.     pop h
  418.     push h
  419.     lxi d,-rsiz
  420. wyep2:    call wypl
  421.     mov a,b
  422.     ori 080H
  423.     mov m,a
  424.     dad d
  425.     mov a,h
  426.     cpi 0F7H
  427.     jnz wyep2
  428.     pop h
  429.     mov a,l
  430.     ani 03FH
  431.     dcx h
  432.     jnz wyep1
  433.     ret
  434.  
  435. ;    Move the whole screen down one pixel
  436.  
  437. wyemi:    lxi h,vorg
  438. wyem1:    lxi d,vsiz-rsiz
  439.     push h
  440.     dad d
  441.     call wymi
  442.     pop h
  443.     push h
  444.     lxi d,rsiz
  445. wyem2:    call wymi
  446.     mov a,b
  447.     ori 080H
  448.     mov m,a
  449.     dad d
  450.     mov a,h
  451.     cpi 0FCH
  452.     jnz wyem2
  453.     pop h
  454.     inx h
  455.     mov a,l
  456.     ani 03FH
  457.     jnz wyem1
  458.     ret
  459.  
  460. ;    Add to the neighbor count of adjoining cells according
  461. ;    to the bits in this byte.  We do the middle pixel,
  462. ;    adding to the count of three successive neighbors in
  463. ;    registers B,C,D.
  464.  
  465. alfa:    mov a,m
  466.     rrc
  467.     jc alf1
  468.     inr b
  469.     inr c
  470.     inr d
  471. alf1:    rrc
  472.     jc alf2
  473.     inr b
  474.     inr d
  475. alf2:    rrc
  476.     rc
  477.     inr b
  478.     inr c
  479.     inr d
  480.     ret
  481.  
  482. ;    shift the neighbor count as we move forward one byte in
  483. ;    a row scan
  484.  
  485. beta:    mov b,c
  486.     mov c,d
  487.     mvi d,00H
  488.     inx h
  489.     mov a,l
  490.     ani 03FH
  491.     rnz
  492.     push d
  493.     lxi d,-rsiz
  494.     dad d
  495.     pop d
  496.     ret
  497.  
  498. ;    PRINCIPAL PROGRAM for carrying out a cycle of LIFE.
  499. ;    Only the middle pixel in each byte is calculated
  500. ;    so that three passes are necessary after each of three
  501. ;    shifts. Two adjacent pixels are used, the right to hold
  502. ;    the present living status and the left for information
  503. ;    for the next cycle.
  504.  
  505. epsi:    lxi h,vorg+rsiz-1
  506. gama:    mvi d,00H
  507.     call alfa
  508.     call beta
  509.     call alfa
  510. delt:    push h
  511.     call beta
  512.     call alfa
  513.     xthl
  514.     mov a,b
  515.     cpi 002H
  516.     jz eta
  517.     cpi 003H
  518.     jz zeta
  519.     mov a,m
  520.     ori 010H
  521.     mov m,a
  522.     jmp thet
  523. zeta:    mov a,m
  524.     ani 0EFH
  525.     mov m,a
  526.     jmp thet
  527. eta:    mov a,m
  528.     ani 0EFH
  529.     mov e,a
  530.     ani 002H
  531.     rlc
  532.     rlc
  533.     rlc
  534.     ora e
  535.     mov m,a
  536. thet:    pop h
  537.     mov a,l
  538.     ani 03FH
  539.     jnz delt
  540.     push d
  541.     lxi d,007FH
  542.     dad d
  543.     pop d
  544.     mov a,h
  545.     cpi 0FCH
  546.     jnz gama
  547.     ret
  548.  
  549. ;    updating loop, moving left pixel to right
  550.  
  551. cycl:    lxi h,vorg
  552. cyc1:    mov a,m
  553.     ani 038H
  554.     mov b,a
  555.     rrc
  556.     rrc
  557.     rrc
  558.     ora b
  559.     ori 080H
  560.     mov m,a
  561.     inx h
  562.     mov a,h
  563.     cpi 0FCH
  564.     jnz cyc1
  565.     ret
  566.  
  567. ;    execute a single cycle of LIFE by updating the middle
  568. ;    pixel and making three sweeps after shifting each time
  569.  
  570. hh:    call epsi
  571.     call wyepl
  572.     call epsi
  573.     call wyepl
  574.     call epsi
  575.     call wyemi
  576.     call wyemi
  577.     call cycl
  578.     ret
  579.  
  580. ;    repeat h unless an ASCII character is waiting
  581. ;    (version for VDM using port ED)
  582.  
  583. gg:    in  0EDH
  584.     ani 040H
  585.     rnz
  586.     call hh
  587.     jmp  gg
  588.  
  589. ;    version for POLY-88 using keyboard flag at 0C0CH
  590.  
  591. ge:    lda 0C0CH
  592.     ora a
  593.     rz
  594.     call hh
  595.     jmp ge
  596.  
  597. ;    extinguish cursor, move two pixels east, light cursor
  598.  
  599. ee:    call crev
  600.     call xpl
  601.     call xpl
  602.     jmp  crev
  603.  
  604. ;    extinguish cursor, two pixels west, light cursor
  605.  
  606. ww:    call crev
  607.     call xmi
  608.     call xmi
  609.     jmp  crev
  610.  
  611. ;    extinguish cursor, one pixel north, light cursor
  612.  
  613. nn:    call crev
  614.     call ypl
  615.     jmp  crev
  616.  
  617. ;    extinguish cursor, one pixel south, light cursor
  618.  
  619. ss:    call crev
  620.     call ymi
  621.     jmp  crev
  622.  
  623. ;    extinguish a life cell
  624.  
  625. kk:    call xpl
  626.     call cuex
  627.     jmp xmi
  628.  
  629. ;    activate a life cell
  630.  
  631. ll:    call xpl
  632.     call culi
  633.     jmp  xmi
  634.  
  635. ;    move whole screen right one life cell, with cursor
  636.  
  637. eas:    call ekspl
  638.     call ekspl
  639.     call xpl
  640.     jmp  xpl
  641.  
  642. ;    move the whole screen left one life cell, with cursor
  643.  
  644. wes:    call eksmi
  645.     call eksmi
  646.     call xmi
  647.     jmp  xmi
  648.  
  649. ;    move the whole screen up one life cell, with cursor
  650.  
  651. nor:    call wyepl
  652.     jmp  ypl
  653.  
  654. ;    move the whole screen down one life cell, with cursor
  655.  
  656. sou:    call wyemi
  657.     jmp  ymi
  658.  
  659. ;    directory vector for LIFE demonstration
  660.  
  661. vect:    cpi 'N'
  662.     jz  nor
  663.     cpi 'S'
  664.     jz  sou
  665.     cpi 'E'
  666.     jz  eas
  667.     cpi 'W'
  668.     jz  wes
  669.     cpi 06EH
  670.     jz  nn
  671.     cpi 073H
  672.     jz  ss
  673.     cpi 065H
  674.     jz  ee
  675.     cpi 077H
  676.     jz  ww
  677.     cpi 06BH
  678.     jz  kk
  679.     cpi 06CH
  680.     jz  ll
  681.     cpi 063H
  682.     jz  blak
  683.     cpi 072H
  684.     jz  reve
  685.     cpi 068H
  686.     jz  hh
  687.     cpi 067H
  688.     jz  go
  689.     cpi '.'
  690.     jz  crev
  691.     cpi ';'
  692.     jz  0000H
  693.     ret
  694.  
  695. ;    keyboard read routine
  696.  
  697. read:    in  0EDH
  698.     ani 040H
  699.     jz   read
  700.     in  0EFH
  701.     ani 07FH
  702.     ret
  703.  
  704. ;    MAIN PROGRAM for LIFE demonstration
  705.  
  706. main:    call blak
  707.     call home
  708.     call crev
  709. here:    lxi h,here
  710.     push h
  711.     call chin
  712.     jmp  vect
  713.  
  714.     end
  715.