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

  1.  
  2. msk:    equ    00CC9H
  3. wy:    equ    00CCAH    ;wy,ex form a double byte in this order
  4. ex:    equ    00CCBH
  5. wye:    equ    00CCCH
  6. eks:    equ    00CCDH
  7. ssiz:    equ    02000H
  8. rsiz:    equ    040H
  9. sorg:    equ    04000H
  10.  
  11.     org    0100H
  12.     jmp gdem
  13.  
  14.  
  15. ;    point mode: move cursor right
  16.  
  17. pxpl:    lxi h,msk
  18.     mov a,m
  19.     ani 0AAH
  20.     jz  pxp1
  21.     rrc
  22.     mov m,a
  23.     ret
  24. pxp1:    mov a,m
  25.     rrc
  26.     rrc
  27.     rrc
  28.     mov m,a
  29.     ani 0A0H
  30.     rz
  31.     lda ex
  32.     adi 004H
  33.     sta ex
  34.     ret
  35.  
  36. ;    point mode: move cursor left
  37.  
  38. pxmi:    lxi h,msk
  39.     mov a,m
  40.     ani 055H
  41.     jz  pxm1
  42.     rlc
  43.     mov m,a
  44.     ret
  45. pxm1:    mov a,m
  46.     rlc
  47.     rlc
  48.     rlc
  49.     mov m,a
  50.     ani 005H
  51.     rz
  52.     lda ex
  53.     sui 004H
  54.     sta ex
  55.     ret
  56.  
  57. ;    point mode: move cursor up
  58.  
  59. pypl:    lxi h,msk
  60.     mov a,m
  61.     ani 033H
  62.     jz  pyp1
  63.     rlc
  64.     rlc
  65.     mov m,a
  66.     ret
  67. pyp1:    mov a,m
  68.     rrc
  69.     rrc
  70.     mov m,a
  71.     lda wy
  72.     sui 002H
  73.     sta wy
  74.     ret
  75.  
  76. ;    point mode: move cursor down
  77.  
  78. pymi:    lxi h,msk
  79.     mov a,m
  80.     ani 0CCH
  81.     jz  pym1
  82.     rrc
  83.     rrc
  84.     mov m,a
  85.     ret
  86. pym1    mov a,m
  87.     rlc
  88.     rlc
  89.     mov m,a
  90.     lda wy
  91.     adi 002H
  92.     sta wy
  93.     ret
  94.  
  95. ;    load acc with mask, HL with byte address from
  96. ;    (msk,wy,ex)
  97.  
  98. dot:    lhld wy
  99.     mov a,h
  100.     mvi h,sorg/02000H
  101.     dad h
  102.     dad h
  103.     dad h
  104.     dad h
  105.     dad h
  106.     rrc
  107.     rrc
  108.     ora l
  109.     mov l,a
  110.     lda msk
  111.     ret
  112.  
  113. ;    point mode: home cursor
  114.  
  115. phom:    lxi h,08080H
  116.     shld wy
  117.     mvi a,040H
  118.     sta msk
  119.     ret
  120.  
  121. ;    point mode: make white dot at cursor
  122.  
  123. pwhit:    call dot
  124.     ora m
  125.     mov m,a
  126.     ret
  127.  
  128. ;    point mode: make black dot at cursor
  129.  
  130. pblak:    call dot
  131.     cma
  132.     ana m
  133.     mov m,a
  134.     ret
  135.  
  136. ;    point mode: reverse dot under cursor
  137.  
  138. prev:    call dot
  139.     xra m
  140.     mov m,a
  141.     ret
  142.  
  143. ;    point mode: test dot under cursor
  144.  
  145. ptest:    call dot
  146.     ana m
  147.     ret
  148.  
  149. ;    both modes: clear screen to white
  150.  
  151. whit:    lxi d,ssiz
  152.     lxi h,sorg
  153. whi1:    mvi m,0FFH
  154.     inx h
  155.     dcr e
  156.     jnz whi1
  157.     dcr d
  158.     jnz whi1
  159.     ret
  160.  
  161. ;    both modes: clear screen to black
  162.  
  163. blak:    lxi d,ssiz
  164.     lxi h,sorg
  165. bla1:    mvi m,000H
  166.     inx h
  167.     dcr e
  168.     jnz bla1
  169.     dcr d
  170.     jnz bla1
  171.     ret
  172.  
  173. ;    both modes: reverse entire screen
  174.  
  175. reve:    lxi d,ssiz
  176.     lxi h,sorg
  177. rev1:    mov a,m
  178.     xri 0FFH
  179.     mov m,a
  180.     inx h
  181.     dcr e
  182.     jnz rev1
  183.     dcr d
  184.     jnz rev1
  185.     ret
  186.  
  187. ;    point mode:    given a cartesian address, form a bit
  188. ;    mask and byte address for the cursor
  189.  
  190. pcar:    lhld wye
  191.     mvi b,001H
  192.     mov a,h
  193.     rrc
  194.     jnc pca1
  195.     mov h,a
  196.     mov a,b
  197.     rlc
  198.     mov b,a
  199.     mov a,h
  200. pca1:    rrc
  201.     jnc pca2
  202.     mov a,b
  203.     rlc
  204.     rlc
  205.     rlc
  206.     rlc
  207.     mov b,a
  208. pca2:    mov a,l
  209.     rrc
  210.     mov b,a
  211.     jnc pca3
  212.     rlc
  213.     rlc
  214. pca3:    sta msk
  215.     lda wye
  216.     ani 0FCH
  217.     sta wy
  218.     lda eks
  219.     ani 0FEH
  220.     sta wy
  221.     ret
  222.  
  223. ;    point mode:  draw a line between two points
  224. ;    given the increments (B,C)=(dx,dy)
  225.  
  226. plin:    lxi h,pxpl
  227.     mov a,b
  228.     ora a
  229.     jp  pli1
  230.     cma
  231.     inr a
  232.     mov b,a
  233.     lxi h,pxmi
  234. pli1:    lxi d,pypl
  235.     mov a,c
  236.     ora a
  237.     jp  pli2
  238.     cma
  239.     inr a
  240.     mov c,a
  241.     lxi d,pymi
  242. pli2:    cmp b
  243.     jnc pli3
  244.     xchg
  245.     mov c,b
  246.     mov b,a
  247. pli3:    mov a,c
  248.     sta eks
  249.     mov a,b
  250.     add a
  251.     mov b,a
  252.     sub c
  253.     push psw
  254.     sub c
  255.     mov c,a
  256. pli4:    pop psw
  257.     push h
  258.     lxi h,prev
  259.     xthl
  260.     cpi 001H
  261.     jm  pli5
  262.     push h
  263.     add c
  264.     jmp pli6
  265. pli5:    add b
  266. pli6:    push d
  267.     push psw
  268.     lda eks
  269.     dcr a
  270.     sta eks
  271.     jnz pli4
  272.     pop psw
  273.     ret
  274.  
  275. ;    point mode: shift within one byte to scroll the
  276. ;    screen right one pixel
  277.  
  278. pexpl:    mov a,m
  279.     rrc
  280.     mov b,a
  281.     ani 055H
  282.     ora c
  283.     mov c,a
  284.     mov a,b
  285.     rrc
  286.     rrc
  287.     mov b,a
  288.     ani 00AH
  289.     ora c
  290.     mov c,a
  291.     mov a,b
  292.     ani 0A0H
  293.     mov b,c
  294.     mov c,a
  295.     ret
  296.  
  297. ;    point mode: intra-byte shift to scroll left one pixel
  298.  
  299. pexmi:    mov a,m
  300.     rlc
  301.     mov b,a
  302.     ani 0AAH
  303.     ora c
  304.     mov c,a
  305.     mov a,b
  306.     rlc
  307.     rlc
  308.     mov b,a
  309.     ani 050H
  310.     ora c
  311.     mov c,a
  312.     mov a,b
  313.     ani 005H
  314.     mov b,c
  315.     mov c,a
  316.     ret
  317.  
  318. ;    point mode: intrabyte shift to scroll up one pixel
  319.  
  320. pwypl:    mov a,m
  321.     mov b,a
  322.     rlc
  323.     rlc
  324.     ani 0CCH
  325.     ora c
  326.     mov c,a
  327.     mov a,b
  328.     ani 0CCH
  329.     rrc
  330.     rrc
  331.     mov b,c
  332.     mov c,a
  333.     ret
  334.  
  335. ;    point mode: intrabyte shift to scroll down one pixel
  336.  
  337. pwymi:    mov a,m
  338.     mov b,a
  339.     rrc
  340.     rrc
  341.     ani 033H
  342.     ora c
  343.     mov c,a
  344.     mov a,b
  345.     ani 033H
  346.     rlc
  347.     rlc
  348.     mov b,c
  349.     mov c,a
  350.     ret
  351.  
  352. ;    point mode: move entire screen right one pixel
  353.  
  354. pekspl:    lxi h,sorg
  355.     lxi d,rsiz-1
  356. peksp1:    push h
  357.     dad d
  358.     call pexpl
  359.     pop h
  360. peksp2:    call pexpl
  361.     mov m,b
  362.     inx h
  363.     mov a,l
  364.     ani 03FH
  365.     jnz peksp2
  366.     mov a,h
  367.     cpi (sorg+ssiz)/0100H
  368.     jnz peksp1
  369.     ret
  370.  
  371. ;    point mode: shift entire screen left one pixel
  372.  
  373. peksmi:    lxi h,sorg+ssiz-1
  374.     lxi d,-rsiz+1
  375. peksm1:    push h
  376.     dad d
  377.     call pexmi
  378.     pop h
  379. peksm2:    call pexmi
  380.     mov m,b
  381.     mov a,l
  382.     ani 03FH
  383.     dcx h
  384.     jnz peksm2
  385.     mov a,h
  386.     cpi sorg/0100H-1
  387.     jnz peksm1
  388.     ret
  389.  
  390. ;    point mode: shift entire screen up one pixel
  391.  
  392. pwyepl:    lxi h,sorg+ssiz-1
  393. pwyep1:    lxi d,-ssiz+rsiz
  394.     push h
  395.     dad d
  396.     call pwypl
  397.     pop h
  398.     push h
  399.     lxi d,-rsiz
  400. pwyep2:    call pwypl
  401.     mov m,b
  402.     dad d
  403.     mov a,h
  404.     cpi sorg/0100H-1
  405.     jnz pwyep2
  406.     pop h
  407.     mov a,l
  408.     ani 03FH
  409.     dcx h
  410.     jnz pwyep1
  411.     ret
  412.  
  413. ;    point mode: move entire screen down one pixel
  414.  
  415. pwyemi:    lxi h,sorg
  416. pwyem1:    lxi d,ssiz-rsiz
  417.     push h
  418.     dad d
  419.     call pwymi
  420.     pop h
  421.     push h
  422.     lxi d,rsiz
  423. pwyem2:    call pwymi
  424.     mov m,b
  425.     dad d
  426.     mov a,h
  427.     cpi (sorg+ssiz)/0100H
  428.     jnz pwyem2
  429.     pop h
  430.     inx h
  431.     mov a,l
  432.     ani 03FH
  433.     jnz pwyem1
  434.     ret
  435.  
  436. ;    fast right shift of 4 pixels= 1 byte
  437.  
  438. fxpl:    lxi h,sorg
  439.     lxi d,rsiz-1
  440. fxp1:    push h
  441.     dad d
  442.     mov b,m
  443.     pop h
  444. fxp2:    mov a,m
  445.     mov m,b
  446.     mov b,a
  447.     inx h
  448.     mov a,l
  449.     ani 03FH
  450.     jnz fxp2
  451.     mov a,h
  452.     cpi (sorg+ssiz)/0100H
  453.     jnz fxp1
  454.     ret
  455.  
  456. ;    fast left shift of 4 pixels which is one byte
  457.  
  458. fxmi:    lxi h,sorg+ssiz-1
  459.     lxi d,-rsiz+1
  460. fxm1:    push h
  461.     dad d
  462.     mov b,m
  463.     pop h
  464. fxm2:    mov a,m
  465.     mov m,b
  466.     mov b,a
  467.     mov a,l
  468.     ani 03FH
  469.     dcx h
  470.     jnz fxm2
  471.     mov a,h
  472.     cpi sorg/0100H-1
  473.     jnz fxm1
  474.     ret
  475.  
  476. ;    fast shift up by 2 pixels = 1 byte
  477.  
  478. fypl:    lxi h,sorg+ssiz-1
  479. fyp1:    lxi d,-ssiz+rsiz
  480.     push h
  481.     dad d
  482.     mov b,m
  483.     pop h
  484.     push h
  485.     lxi d,-rsiz
  486. fyp2:    mov a,m
  487.     mov m,b
  488.     mov b,a
  489.     dad d
  490.     mov a,h
  491.     cpi sorg/0100H-1
  492.     jnz fyp2
  493.     pop h
  494.     mov a,l
  495.     ani 03FH
  496.     dcx h
  497.     jnz fyp1
  498.     ret
  499.  
  500. ;    fast down shift of entire screen by 2 pixels = 1 byte
  501.  
  502. fymi:    lxi h,sorg
  503. fym1:    lxi d,ssiz-rsiz
  504.     push h
  505.     dad d
  506.     mov b,m
  507.     pop h
  508.     push h
  509.     lxi d,rsiz
  510. fym2:    mov a,m
  511.     mov m,b
  512.     mov b,a
  513.     dad d
  514.     mov a,h
  515.     cpi (sorg+ssiz)/0100H
  516.     jnz fym2
  517.     pop h
  518.     inx h
  519.     mov a,l
  520.     ani 03FH
  521.     jnz fym1
  522.     ret
  523.  
  524. ;    gray mode: in-byte right shift
  525.  
  526. gexpl:    mov a,m
  527.     rrc
  528.     rrc
  529.     rrc
  530.     rrc
  531.     mov b,a
  532.     ani 00FH
  533.     ora c
  534.     mov c,a
  535.     mov a,b
  536.     ani 0F0H
  537.     mov b,c
  538.     mov c,a
  539.     ret
  540.  
  541. ;    gray mode: intrabyte left shift of one pixel
  542.  
  543. gexmi:    mov a,m
  544.     rlc
  545.     rlc
  546.     rlc
  547.     rlc
  548.     mov b,a
  549.     ani 0E0H
  550.     ora c
  551.     mov c,a
  552.     mov a,b
  553.     ani 00FH
  554.     mov b,c
  555.     mov c,a
  556.     ret
  557.  
  558. ;    gray mode: shift whole screen 1 pixel right
  559.  
  560. gekspl:    lxi h,sorg
  561.     lxi d,rsiz-1
  562. geksp1:    push h
  563.     dad d
  564.     call gexpl
  565.     pop h
  566. geksp2:    call gexpl
  567.     mov m,b
  568.     inx h
  569.     mov a,l
  570.     ani 03FH
  571.     jnz geksp2
  572.     mov a,h
  573.     cpi (sorg+ssiz)/0100H
  574.     jnz geksp1
  575.     ret
  576.  
  577. ;    gray mode: shift entire screen left one pixel
  578.  
  579. geksmi:    lxi h,sorg+ssiz-1
  580.     lxi d,-rsiz+1
  581. geksm1:    push h
  582.     dad d
  583.     call gexmi
  584.     pop h
  585. geksm2:    call gexmi
  586.     mov m,b
  587.     mov a,l
  588.     ani 03FH
  589.     dcx h
  590.     jnz geksm2
  591.     mov a,h
  592.     cpi sorg/0100H-1
  593.     jnz geksm1
  594.     ret
  595.  
  596. ;    gray mode: move cursor right one pixel
  597.  
  598. gxpl:    lxi h,msk
  599.     mov a,m
  600.     ani 0F0H
  601.     jz  gxp1
  602.     mvi m,00FH
  603.     ret
  604. gxp1:    mvi m,0F0H
  605.     lda ex
  606.     adi 004H
  607.     sta ex
  608.     ret
  609.  
  610. ;    gray mode: shift cursor left one pixel
  611.  
  612. gxmi:    lxi h,msk
  613.     mov a,m
  614.     ani 00FH
  615.     jz  gxm1
  616.     mvi m,0F0H
  617.     ret
  618. gxm1:    mvi m,00FH
  619.     lda ex
  620.     sui 004H
  621.     sta ex
  622.     ret
  623.  
  624. ;    gray mode: move cursor up one pixel
  625.  
  626. gypl:    lda wy
  627.     sui 002H
  628.     sta wy
  629.     ret
  630.  
  631. ;    gray mode: move cursor down one pixel
  632.  
  633. gymi:    lda wy
  634.     adi 002H
  635.     sta wy
  636.     ret
  637.  
  638. ;    gray mode: home cursor
  639.  
  640. ghom:    lxi h,08080H
  641.     shld wy
  642.     mvi a,00FH
  643.     sta msk
  644.     ret
  645.  
  646. ;    gray mode: make cursor pixel white
  647.  
  648. gwhi:    call dot
  649.     ora m
  650.     mov m,a
  651.     ret
  652.  
  653. ;    gray mode: make cursor pixel black
  654.  
  655. gbla:    call dot
  656.     cma
  657.     ana m
  658.     mov m,a
  659.     ret
  660.  
  661. ;    gray mode: reverse cursor pixel
  662.  
  663. grev:    call dot
  664.     xra m
  665.     mov m,a
  666.     ret
  667.  
  668. ;    gray mode: sense cursor pixel
  669.  
  670. gsen:    call dot
  671.     ana m
  672.     rz
  673.     push psw
  674.     ani 0F0H
  675.     pop psw
  676.     rz
  677.     rrc
  678.     rrc
  679.     rrc
  680.     rrc
  681.     ret
  682.  
  683. ;    gray mode: raise gray level of cursor pixel
  684.  
  685. gzpl:    call dot
  686.     mov b,a
  687.     cma
  688.     ana m
  689.     mov c,a
  690.     mov a,b
  691.     ana m
  692.     adi 011H
  693.     ana b
  694.     ora c
  695.     mov m,a
  696.     ret
  697.  
  698. ;    gray mode: lower pixel under cursor one gray level
  699.  
  700. gzmi:    call dot
  701.     mov b,a
  702.     cma
  703.     ana m
  704.     mov c,a
  705.     mov a,b
  706.     ana m
  707.     adi 0FFH
  708.     ana b
  709.     ora c
  710.     mov m,a
  711.     ret
  712.  
  713. ;    gray mode: cartesian coordinates to mask, byte address
  714.  
  715. gcart:    lhld wye
  716.     mov a,l
  717.     ani 03FH
  718.     rlc
  719.     sta wy
  720.     mov a,h
  721.     ani 03FH
  722.     rrc
  723.     push psw
  724.     rlc
  725.     rlc
  726.     rlc
  727.     sta ex
  728.     pop psw
  729.     mvi a,00FH
  730.     jc  gcar1
  731.     xri 0FFH
  732. gcar1:    sta msk
  733.     ret
  734.  
  735. ;    form decimal number from digit string
  736.  
  737. nure:    mvi b,000H
  738. nur1:    call read
  739.     cpi '-'
  740.     jz  numi
  741.     cpi '0'
  742.     rc
  743.     cpi ':'
  744.     rnc
  745.     sui '0'
  746.     mov c,a
  747.     mov a,b
  748.     rlc
  749.     rlc
  750.     add b
  751.     rlc
  752.     add c
  753.     mov b,a
  754.     jmp nur1
  755. numi:    lxi h,minu
  756.     push h
  757.     jmp nur1
  758. minu:    push psw
  759.     mov a,b
  760.     cma
  761.     inr a
  762.     mov b,a
  763.     pop psw
  764.     ret
  765.  
  766. ;    get (B,C)=(count, operation)
  767.  
  768. coop:    call nure
  769.     mov c,a
  770.     mov a,b
  771.     ora a
  772.     rnz
  773.     mvi b,001H
  774.     ret
  775.  
  776. ;    get (B,C)=(x,y)
  777.  
  778. coor:    call nure
  779.     push b
  780.     call nure
  781.     pop psw
  782.     mov c,b
  783.     mov b,a
  784.     ret
  785.  
  786. ;    repeat the subroutine in (HL) (B) times
  787.  
  788. iter:    push b
  789.     mov a,c
  790.     push h
  791.     lxi d,ite1
  792.     push d
  793.     pchl
  794. ite1:    pop h
  795.     pop b
  796.     dcr b
  797.     rz
  798.     jmp iter
  799.  
  800.     nop
  801.     nop
  802.  
  803. ;    block of combined cursor movements and cursor
  804. ;    inversions in the point mode - for demonstration
  805.  
  806. pn:    call prev
  807.     call pypl
  808.     jmp  prev
  809.  
  810. ps:    call prev
  811.     call pymi
  812.     jmp  prev
  813.  
  814. pe:    call prev
  815.     call pxpl
  816.     jmp  prev
  817.  
  818. pw:    call prev
  819.     call pxmi
  820.     jmp  prev
  821.  
  822. ;    place the individual negatives of the bytes B,C in H,L
  823.  
  824. negl:    mov a,c
  825.     cma
  826.     inr a
  827.     mov l,a
  828.     mov a,b
  829.     cma
  830.     inr a
  831.     mov h,a
  832.     ret
  833.  
  834. ;    add D,E to H,L as two separate bytes, sum in H,L
  835.  
  836. addl:    mov a,e
  837.     add l
  838.     mov l,a
  839.     mov a,d
  840.     add h
  841.     mov h,a
  842.     ret
  843.  
  844. ;    command i reads increment pair, plots line
  845.  
  846. pii:    call coor
  847.     jmp  plin
  848.  
  849. ;    command t reads two adjacent edges, plots triangle
  850.  
  851. tt:    call coor
  852.     call negl
  853.     push h
  854.     push b
  855.     call coor
  856.     call negl
  857.     pop d
  858.     call addl
  859.     push h
  860.     call plin
  861.     pop b
  862.     call plin
  863.     pop b
  864.     jmp  plin
  865.  
  866. ;    command p reads cartesian coordinates, plots point
  867.  
  868. pp:    call coor
  869.     mov a,b
  870.     adi 080H
  871.     sta eks
  872.     mov a,c
  873.     cma
  874.     adi 081H
  875.     sta wye
  876.     call pcar
  877.     jmp  prev
  878.  
  879. ;    block of combined screen-cursor shifts
  880.  
  881. pea:    call pekspl
  882.     jmp  pxpl
  883.  
  884. pwe:    call peksmi
  885.     jmp  pxmi
  886.  
  887. pno:    call pwyepl
  888.     jmp  pypl
  889.  
  890. pso:    call pwyemi
  891.     jmp  pymi
  892.  
  893. ;    similar block for grey mode
  894.  
  895. gea:    call gekspl
  896.     jmp  gxpl
  897.  
  898. gwe:    call geksmi
  899.     jmp  gxmi
  900.  
  901. gno:    call fypl
  902.     jmp  gypl
  903.  
  904. gso:    call fymi
  905.     jmp  gymi
  906.  
  907. ;    combined cursor movement and 8-level gray shift
  908.  
  909. ge:    call gzeh
  910.     call gxpl
  911.     jmp  gzeh
  912.  
  913. gw:    call gzeh
  914.     call gxmi
  915.     jmp  gzeh
  916.  
  917. gn:    call gzeh
  918.     call gypl
  919.     jmp  gzeh
  920.  
  921. gs:    call gzeh
  922.     call gymi
  923.     jmp  gzeh
  924.  
  925. ;    move whole screen through 8 gray points
  926.  
  927. gzeeh:    lxi d,ssiz
  928.     lxi h,sorg
  929. gzee1:    mov b,m
  930.     mov a,b
  931.     ani 0F0H
  932.     mov c,a
  933.     mov a,b
  934.     adi 008H
  935.     ani 00FH
  936.     ora c
  937.     adi 080H
  938.     mov m,a
  939.     inx h
  940.     dcr e
  941.     jnz gzee1
  942.     dcr d
  943.     jnz gzee1
  944.     ret
  945.  
  946. ;    lighten the whole screen by one grey point
  947.  
  948. gzeepl:    lxi d,ssiz
  949.     lxi h,sorg
  950. gzeep1:    mov b,m
  951.     mov a,b
  952.     ani 0F0H
  953.     mov c,a
  954.     mov a,b
  955.     adi 001H
  956.     ani 00FH
  957.     ora c
  958.     adi 010H
  959.     mov m,a
  960.     inx h
  961.     dcr e
  962.     jnz gzeep1
  963.     dcr d
  964.     jnz gzeep1
  965.     ret
  966.  
  967. ;    darken whole screen by one gray point
  968.  
  969. gzeemi:    lxi d,ssiz
  970.     lxi h,sorg
  971. gzeem1:    mov b,m
  972.     mov a,b
  973.     ani 0F0H
  974.     mov c,a
  975.     mov a,b
  976.     adi 00FH
  977.     ani 00FH
  978.     ora c
  979.     adi 0F0H
  980.     mov m,a
  981.     inx h
  982.     dcr e
  983.     jnz gzeem1
  984.     dcr d
  985.     jnz gzeem1
  986.     ret
  987.  
  988. ;    lighten the pixel under the cursor by 8 points
  989.  
  990. gzeh:    call dot
  991. gzed:    mov c,a
  992.     cma
  993.     ana m
  994.     mov b,a
  995.     mov a,m
  996.     ana c
  997.     adi 088H
  998.     ana c
  999.     ora b
  1000.     mov m,a
  1001.     ret
  1002.  
  1003. ;    lighten all pixels from here to left margin 8 points
  1004.  
  1005. edge:    call dot
  1006.     ora a
  1007.     jp edg1
  1008.     call gzed
  1009. edg1:    mov a,l
  1010.     ani 03FH
  1011.     rz
  1012.     dcx h
  1013.     mov b,m
  1014.     mov a,b
  1015.     ani 0F0H
  1016.     mov c,a
  1017.     mov a,b
  1018.     sui 008H
  1019.     ani 00FH
  1020.     ora c
  1021.     sui 080H
  1022.     mov m,a
  1023.     jmp edg1
  1024.  
  1025. ;    block of combined cursor movements and pixel reverses
  1026.  
  1027. gee:    call gxpl
  1028.     jmp  gzeh
  1029.  
  1030. gww:    call gxmi
  1031.     jmp  gzeh
  1032.  
  1033. gnn:    call gypl
  1034.     jmp  gzeh
  1035.  
  1036. gss:    call gymi
  1037.     jmp  gzeh
  1038.  
  1039. ;    draw a line with given increments in grey mode
  1040.  
  1041. glin:    lxi h,gxpl
  1042.     mov a,b
  1043.     ora a
  1044.     jp gli1
  1045.     cma
  1046.     inr a
  1047.     mov b,a
  1048.     lxi h,gxmi
  1049. gli1:    lxi d,gypl
  1050.     mov a,c
  1051.     ora a
  1052.     jp gli2
  1053.     cma
  1054.     inr a
  1055.     mov c,a
  1056.     lxi d,gymi
  1057. gli2:    cmp b
  1058.     jnc gli3
  1059.     xchg
  1060.     mov c,b
  1061.     mov b,a
  1062. gli3:    mov a,c
  1063.     sta eks
  1064.     mov a,b
  1065.     add a
  1066.     mov b,a
  1067.     sub c
  1068.     push psw
  1069.     sub c
  1070.     mov c,a
  1071. gli4:    pop psw
  1072.     push h
  1073.     lxi h,gzeh
  1074.     xthl
  1075.     cpi 001H
  1076.     jm gli5
  1077.     push h
  1078.     add c
  1079.     jmp gli6
  1080. gli5:    add b
  1081. gli6:    push d
  1082.     push psw
  1083.     lda eks
  1084.     dcr a
  1085.     sta eks
  1086.     jnz gli4
  1087.     pop psw
  1088.     ret
  1089.  
  1090. ;    draw a shaded triangle
  1091.  
  1092. shat:    call coor
  1093.     call negl
  1094.     push h
  1095.     push b
  1096.     call coor
  1097.     call negl
  1098.     pop d
  1099.     call addl
  1100.     push h
  1101.     call glin
  1102.     call edge
  1103.     pop b
  1104.     call glin
  1105.     call edge
  1106.     pop b
  1107.     jmp  glin
  1108.  
  1109. ;    - - -  LIFE in the gray mode - - -
  1110.  
  1111.  
  1112.  
  1113. ;    ordinary cycle for neighbors of left pixel
  1114.  
  1115. olep:    push h
  1116.     push h
  1117.     dad d
  1118.     mov a,m
  1119.     adi 011H
  1120.     mov m,a
  1121.     dcx h
  1122.     inr m
  1123.     pop h
  1124.     dcx h
  1125.     inr m
  1126.     dad b
  1127.     inr m
  1128.     inx h
  1129.     mov a,m
  1130.     adi 011H
  1131.     mov m,a
  1132.     pop h
  1133.     ret
  1134.  
  1135. ;    ordinary cycle for neighbors of right pixel
  1136.  
  1137. orip:    push h
  1138.     push h
  1139.     dad d
  1140.     mov a,m
  1141.     adi 011H
  1142.     mov m,a
  1143.     inx h
  1144.     mov a,m
  1145.     adi 010H
  1146.     mov m,a
  1147.     pop h
  1148.     inx h
  1149.     mov a,m
  1150.     adi 010H
  1151.     mov m,a
  1152.     dad b
  1153.     mov a,m
  1154.     adi 010H
  1155.     mov m,a
  1156.     dcx h
  1157.     mov a,m
  1158.     adi 011H
  1159.     mov m,a
  1160.     pop h
  1161.     ret
  1162.  
  1163. ;    count neighbors of ordinary cells
  1164.  
  1165. onec:    lxi b,rsiz
  1166.     lxi d,-rsiz
  1167.     lxi h,sorg+rsiz
  1168. one1:    mov a,m
  1169.     ani 080H
  1170.     cnz rnom
  1171.     mov a,m
  1172.     ani 008H
  1173.     cnz lnom
  1174.     inx h
  1175.     mov a,l
  1176.     cpi 0C0H
  1177.     jnz one1
  1178.     mov a,h
  1179.     cpi (sorg+ssiz)/0100H-1
  1180.     jnz one1
  1181.     ret
  1182.  
  1183. ;    update to next generation once neighbor count done
  1184.  
  1185. next:    lxi d,ssiz
  1186.     lxi h,sorg
  1187. nex1:    mov a,m
  1188.     ora a
  1189.     jz nex8
  1190.     mov c,a
  1191.     ani 077H
  1192.     mov b,a
  1193.     mov a,c
  1194.     ani 088H
  1195.     mov c,a
  1196.     rlc
  1197.     add b
  1198.     mov b,a
  1199.     push h
  1200.     lxi h,nex4
  1201.     xthl
  1202.     mov a,b
  1203.     ani 0F0H
  1204.     cpi 020H
  1205.     jz nex2
  1206.     cpi 030H
  1207.     jz nex3
  1208.     xra a
  1209.     ret
  1210. nex2:    mov a,c
  1211.     ani 080H
  1212.     ret
  1213. nex3:    mvi a,080H
  1214.     ret
  1215. nex4:    push psw
  1216.     push h
  1217.     lxi h,nex7
  1218.     xthl
  1219.     mov a,b
  1220.     ani 00FH
  1221.     cpi 002H
  1222.     jz nex5
  1223.     cpi 003H
  1224.     jz nex6
  1225.     xra a
  1226.     ret
  1227. nex5:    mov a,c
  1228.     ani 008H
  1229.     ret
  1230. nex6:    mvi a,008H
  1231.     ret
  1232. nex7:    pop b
  1233.     ora b
  1234.     mov m,a
  1235. nex8:    inx h
  1236.     dcr e
  1237.     jnz nex1
  1238.     dcr d
  1239.     jnz nex1
  1240.     ret
  1241.  
  1242. ;    cycle for left pixel on left margin
  1243.  
  1244. llep:    push h
  1245.     push h
  1246.     push h
  1247.     dad d
  1248.     mov a,m
  1249.     adi 011H
  1250.     mov m,a
  1251.     mov a,l
  1252.     ori 03FH
  1253.     mov l,a
  1254.     inr m
  1255.     pop h
  1256.     mov a,l
  1257.     ori 03FH
  1258.     mov l,a
  1259.     inr m
  1260.     dad b
  1261.     inr m
  1262.     pop h
  1263.     dad b
  1264.     mov a,m
  1265.     adi 011H
  1266.     mov m,a
  1267.     pop h
  1268.     ret
  1269.  
  1270. ;    cycle for right pixel on right margin
  1271.  
  1272. rrip:    push h
  1273.     push h
  1274.     push h
  1275.     dad d
  1276.     mov a,m
  1277.     adi 011H
  1278.     mov m,a
  1279.     mov a,l
  1280.     ani 0C0H
  1281.     mov l,a
  1282.     mov a,m
  1283.     adi 010H
  1284.     mov m,a
  1285.     pop h
  1286.     mov a,l
  1287.     ani 0C0H
  1288.     mov l,a
  1289.     mov a,m
  1290.     adi 010H
  1291.     mov m,a
  1292.     dad b
  1293.     mov a,m
  1294.     adi 010H
  1295.     mov m,a
  1296.     pop h
  1297.     dad b
  1298.     mov a,m
  1299.     adi 011H
  1300.     mov m,a
  1301.     pop h
  1302.     ret
  1303.  
  1304. ;    left pixel: choose between normal or margin cycle
  1305.  
  1306. rnom:    mov a,l
  1307.     ani 03FH
  1308.     jz  llep
  1309.     jmp olep
  1310.  
  1311. ;    right pixel: chose normal or margin cycle
  1312.  
  1313. lnom:    mov a,l
  1314.     ani 03FH
  1315.     cpi 03FH
  1316.     jz  rrip
  1317.     jmp orip
  1318.  
  1319. ;    count neighbors along top margin
  1320.  
  1321. ncto:    lxi b,rsiz
  1322.     lxi d,ssiz-rsiz
  1323.     lxi h,sorg
  1324. ncti:    mov a,m
  1325.     ani 080H
  1326.     cnz rnom
  1327.     mov a,m
  1328.     ani 008H
  1329.     cnz lnom
  1330.     inx h
  1331.     mov a,l
  1332.     ani 03FH
  1333.     jnz ncti
  1334.     ret
  1335.  
  1336. ;    count neighbors along bottom margin
  1337.  
  1338. ncbo:    lxi b,-ssiz+rsiz
  1339.     lxi d,-rsiz
  1340.     lxi h,sorg+ssiz-rsiz
  1341.     jmp ncti
  1342.  
  1343. ;    execute one cycle of LIFE
  1344.  
  1345. life:    call onec
  1346.     call ncto
  1347.     call ncbo
  1348.     jmp next
  1349.  
  1350. ;    demonstration for point mode graphics
  1351.  
  1352. pdem:    call phom
  1353. pden:    call coop
  1354.     lxi h,pvec
  1355.     call iter
  1356.     jmp pden
  1357.  
  1358. ;    menu for point mode graphics
  1359.  
  1360. pvec:    cpi 06EH
  1361.     jz  pn
  1362.     cpi 073H
  1363.     jz  ps
  1364.     cpi 065H
  1365.     jz  pe
  1366.     cpi 077H
  1367.     jz  pw
  1368.     cpi 'N'
  1369.     jz  pno
  1370.     cpi 'S'
  1371.     jz pso
  1372.     cpi 'E'
  1373.     jz  pea
  1374.     cpi 'W'
  1375.     jz  pwe
  1376.     cpi 'C'
  1377.     jz  blak
  1378.     cpi 'R'
  1379.     jz  reve
  1380.     cpi '.'
  1381.     jz prev
  1382.     cpi 069H
  1383.     jz  pii
  1384.     cpi 074H
  1385.     jz  tt
  1386.     cpi 070H
  1387.     jz  pp
  1388.     cpi ';'
  1389.     jz  0000H
  1390.     cpi 'G'
  1391.     jz  gdem
  1392.     ret
  1393.  
  1394. ;    demonstration for gray mode graphics
  1395.  
  1396. gdem:    call ghom
  1397. gden:    call coop
  1398.     lxi h,gvec
  1399.     call iter
  1400.     jmp gden
  1401.  
  1402.  
  1403. ;    vector for gray mode graphic demonstration
  1404.  
  1405. gvec:    cpi 06EH
  1406.     jz  gn
  1407.     cpi 073H
  1408.     jz  gs
  1409.     cpi 065H
  1410.     jz  ge
  1411.     cpi 077H
  1412.     jz gw
  1413.     cpi 'N'
  1414.     jz  gno
  1415.     cpi 'S'
  1416.     jz  gso
  1417.     cpi 'E'
  1418.     jz  gea
  1419.     cpi 'W'
  1420.     jz  gwe
  1421.     cpi 'B'
  1422.     jz  whit
  1423.     cpi 07FH
  1424.     jz blak
  1425.     cpi 'C'
  1426.     jz  blak
  1427.     cpi 072H
  1428.     jz  grev
  1429.     cpi 068H
  1430.     jz  gzeh
  1431.     cpi 06BH
  1432.     jz  gzmi
  1433.     cpi 06CH
  1434.     jz  gzpl
  1435.     cpi 'R'
  1436.     jz reve
  1437.     cpi 'H'
  1438.     jz  gzeeh
  1439.     cpi 'K'
  1440.     jz  gzeemi
  1441.     cpi 'L'
  1442.     jz  gzeepl
  1443.     cpi 069H
  1444.     jz gii
  1445.     cpi 067H
  1446.     jz  life
  1447.     cpi '.'
  1448.     jz  gzeh
  1449.     cpi ';'
  1450.     jz  0000H
  1451.     cpi 'P'
  1452.     jz  pdem
  1453.     ret
  1454.  
  1455. ;    i (= line) in gray mode
  1456.  
  1457. gii:    call coor
  1458.     jmp  glin
  1459.  
  1460. ;    - - - read routine - - -
  1461.  
  1462. read:    in  0EDH
  1463.     ani 040H
  1464.     jz  read
  1465.     in  0EFH
  1466.     ani 07FH
  1467.     ret
  1468.     end
  1469.