home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol167 / vgr.mac < prev    next >
Encoding:
Text File  |  1984-04-29  |  12.5 KB  |  1,220 lines

  1.  
  2. MSK:    DB    00
  3. WY:    DB    00
  4. EX:    DB    00
  5. EKS:    DB    00
  6. SSIZ    EQU    02000H
  7. RSIZ    EQU    040H
  8. SORG    EQU    0C000H
  9.  
  10.  
  11. ;    POINT MODE: MOVE CURSOR RIGHT
  12.  
  13. PXPL::    LXI    H,MSK
  14.     MOV    A,M
  15.     ANI    0AAH
  16.     JZ    PXP1
  17.     RRC
  18.     MOV    M,A
  19.     RET
  20. PXP1:    MOV    A,M
  21.     RRC
  22.     RRC
  23.     RRC
  24.     MOV    M,A
  25.     ANI    0A0H
  26.     RZ
  27.     LDA    EX
  28.     ADI    004H
  29.     STA    EX
  30.     RET
  31.  
  32. ;    POINT    MODE:    MOVE    CURSOR    LEFT
  33.  
  34. PXMI::    LXI    H,MSK
  35.     MOV    A,M
  36.     ANI    055H
  37.     JZ    PXM1
  38.     RLC
  39.     MOV    M,A
  40.     RET
  41. PXM1:    MOV    A,M
  42.     RLC
  43.     RLC
  44.     RLC
  45.     MOV    M,A
  46.     ANI    005H
  47.     RZ
  48.     LDA    EX
  49.     SUI    004H
  50.     STA    EX
  51.     RET
  52.  
  53. ;    POINT MODE: MOVE CURSOR UP
  54.  
  55. PYPL::    LXI    H,MSK
  56.     MOV    A,M
  57.     ANI    033H
  58.     JZ    PYP1
  59.     RLC
  60.     RLC
  61.     MOV    M,A
  62.     RET
  63. PYP1:    MOV    A,M
  64.     RRC
  65.     RRC
  66.     MOV    M,A
  67.     LDA    WY
  68.     SUI    002H
  69.     STA    WY
  70.     RET
  71.  
  72. ;    POINT MODE: MOVE CURSOR DOWN
  73.  
  74. PYMI::    LXI    H,MSK
  75.     MOV    A,M
  76.     ANI    0CCH
  77.     JZ    PYM1
  78.     RRC
  79.     RRC
  80.     MOV    M,A
  81.     RET
  82. PYM1:    MOV    A,M
  83.     RLC
  84.     RLC
  85.     MOV    M,A
  86.     LDA    WY
  87.     ADI    002H
  88.     STA    WY
  89.     RET
  90.  
  91. ;    LOAD ACC WITH MASK, HL WITH BYTE ADDRESS FROM
  92. ;    (MSK,WY,EX)
  93.  
  94. DOT:    LHLD    WY
  95.     MOV    A,H
  96.     MVI    H,SORG/02000H
  97.     DAD    H
  98.     DAD    H
  99.     DAD    H
  100.     DAD    H
  101.     DAD    H
  102.     RRC
  103.     RRC
  104.     ORA    L
  105.     MOV    L,A
  106.     LDA    MSK
  107.     RET
  108.  
  109. ;    POINT MODE: HOME CURSOR
  110.  
  111. PHOM::    LXI    H,08080H
  112.     SHLD    WY
  113.     MVI    A,040H
  114.     STA    MSK
  115.     RET
  116.  
  117. ;    POINT MODE: MAKE WHITE DOT AT CURSOR
  118.  
  119. PWHIT::    CALL    DOT
  120.     ORA    M
  121.     MOV    M,A
  122.     RET
  123.  
  124. ;    POINT MODE: MAKE BLACK DOT AT CURSOR
  125.  
  126. PBLAK::    CALL    DOT
  127.     CMA
  128.     ANA    M
  129.     MOV    M,A
  130.     RET
  131.  
  132. ;    POINT MODE: REVERSE DOT UNDER CURSOR
  133.  
  134. PREV::    CALL    DOT
  135.     XRA    M
  136.     MOV    M,A
  137.     RET
  138.  
  139. ;    POINT MODE: TEST DOT UNDER CURSOR
  140.  
  141. PTEST::    CALL    DOT
  142.     ANA    M
  143.     RET
  144.  
  145. ;    BOTH MODES: CLEAR SCREEN TO WHITE
  146.  
  147. WHIT::    LXI    D,SSIZ
  148.     LXI    H,SORG
  149. WHI1:    MVI    M,0FFH
  150.     INX    H
  151.     DCR    E
  152.     JNZ    WHI1
  153.     DCR    D
  154.     JNZ    WHI1
  155.     RET
  156.  
  157. ;    BOTH MODES: CLEAR SCREEN TO BLACK
  158.  
  159. BLAK::    LXI    D,SSIZ
  160.     LXI    H,SORG
  161. BLA1:    MVI    M,000H
  162.     INX    H
  163.     DCR    E
  164.     JNZ    BLA1
  165.     DCR    D
  166.     JNZ    BLA1
  167.     RET
  168.  
  169. ;     BOTH MODES: REVERSE ENTIRE SCREEN
  170.  
  171. REVE::    LXI    D,SSIZ
  172.     LXI    H,SORG
  173. REV1:    MOV    A,M
  174.     XRI    0FFH
  175.     MOV    M,A
  176.     INX    H
  177.     DCR    E
  178.     JNZ    REV1
  179.     DCR    D
  180.     JNZ    REV1
  181.     RET
  182.  
  183. ;    POINT MODE: GIVEN A CARTESIAN ADDRESS, FORM A BIT
  184. ;    MASK AND BYTE ADDRESS FOR THE CURSOR
  185.  
  186. PCAR::    MOV    A,M
  187.     ANI    0FCH
  188.     STA    EX
  189.     LDAX    D
  190.     ANI    0FEH
  191.     STA    WY
  192.     MVI    B,80H
  193.     MOV    A,M
  194.     RRC
  195.     JNC    PCA1
  196.     MOV    C,A
  197.     MOV    A,B
  198.     RRC
  199.     MOV    B,A
  200.     MOV    A,C
  201. PCA1:    RRC
  202.     JNC    PCA2
  203.     MOV    A,B
  204.     RRC
  205.     RRC
  206.     RRC
  207.     RRC
  208.     MOV    B,A
  209. PCA2:    LDAX    D
  210.     RRC
  211.     MOV    A,B
  212.     JNC    PCA3
  213.     RRC
  214.     RRC
  215. PCA3:    STA    MSK
  216.     RET
  217.  
  218. ;    POINT MODE: DRAW A LINE BETWEEN TWO POINTS
  219. ;    GIVEN THE INCREMENTS (B,C)=(DX,DY)
  220.  
  221. PLIN::    MOV    B,M
  222.     XCHG
  223.     MOV    C,M
  224.     LXI    H,PXPL
  225.     MOV    A,B
  226.     ORA    A
  227.     JP    PLI1
  228.     CMA
  229.     INR    A
  230.     MOV    B,A
  231.     LXI    H,PXMI
  232. PLI1:    LXI    D,PYMI
  233.     MOV    A,C
  234.     ORA    A
  235.     JP    PLI2
  236.     CMA
  237.     INR    A
  238.     MOV    C,A
  239.     LXI    D,PYPL
  240. PLI2:    CMP    B
  241.     JNC    PLI3
  242.     XCHG
  243.     MOV    C,B
  244.     MOV    B,A
  245.     MOV    A,C
  246. PLI3:    STA    EKS
  247.     XRA    A
  248.     SUB    B
  249.     SUB    B
  250.     MOV    B,A
  251.     ADD    C
  252.     PUSH    PSW
  253.     ADD    C
  254.     MOV    C,A
  255. PLI4:    POP    PSW
  256.     PUSH    H
  257.     LXI    H,PWHIT
  258.     XTHL
  259.     JP    PLI5
  260.     PUSH    H
  261.     ADD    C
  262.     JMP    PLI6
  263. PLI5:    ADD    B
  264. PLI6:    PUSH    D
  265.     PUSH    PSW
  266.     LDA    EKS
  267.     DCR    A
  268.     STA    EKS
  269.     JNZ    PLI4
  270.     POP    PSW
  271.     RET
  272.  
  273. ;    POINT MODE: SHIFT WITHIN ONE BYTE TO SCROLL THE
  274. ;    SCREEN RIGHT ONE PIXEL
  275.  
  276. PEXPL::    MOV    A,M
  277.     RRC
  278.     MOV    B,A
  279.     ANI    055H
  280.     ORA    C
  281.     MOV    C,A
  282.     MOV    A,B
  283.     RRC
  284.     RRC
  285.     MOV    B,A
  286.     ANI    00AH
  287.     ORA    C
  288.     MOV    C,A
  289.     MOV    A,B
  290.     ANI    0A0H
  291.     MOV    B,C
  292.     MOV    C,A
  293.     RET
  294.  
  295. ;    POINT MODE: INTRA-BYTE SHIFT TO SCROLL LEFT ONE PIXEL
  296.  
  297. PEXMI::    MOV    A,M
  298.     RLC
  299.     MOV    B,A
  300.     ANI    0AAH
  301.     ORA    C
  302.     MOV    C,A
  303.     MOV    A,B
  304.     RLC
  305.     RLC
  306.     MOV    B,A
  307.     ANI    050H
  308.     ORA    C
  309.     MOV    C,A
  310.     MOV    A,B
  311.     ANI    005H
  312.     MOV    B,C
  313.     MOV    C,A
  314.     RET
  315.  
  316. ;    POINT MODE: INTRABYTE SHIFT TO SCROLL UP ONE PIXEL
  317.  
  318. PWYPL::    MOV    A,M
  319.     MOV    B,A
  320.     RLC
  321.     RLC
  322.     ANI    0CCH
  323.     ORA    C
  324.     MOV    C,A
  325.     MOV    A,B
  326.     ANI    0CCH
  327.     RRC
  328.     RRC
  329.     MOV    B,C
  330.     MOV    C,A
  331.     RET
  332.  
  333. ;    POINT MODE: INTRABYTE SHIFT TO SCROLL DOWN ONE PIXEL
  334.  
  335. PWYMI::    MOV    A,M
  336.     MOV    B,A
  337.     RRC
  338.     RRC
  339.     ANI    033H
  340.     ORA    C
  341.     MOV    C,A
  342.     MOV    A,B
  343.     ANI    033H
  344.     RLC
  345.     RLC
  346.     MOV    B,C
  347.     MOV    C,A
  348.     RET
  349.  
  350. ;    POINT MODE: MOVE ENTIRE SCREEN RIGHT ONE PIXEL
  351.  
  352. PEKSPL::    LXI    H,SORG
  353.     LXI    D,RSIZ-1
  354. PEKSP1:    PUSH    H
  355.     DAD    D
  356.     CALL    PEXPL
  357.     POP    H
  358. PEKSP2:    CALL    PEXPL
  359.     MOV    M,B
  360.     INX    H
  361.     MOV    A,L
  362.     ANI    03FH
  363.     JNZ    PEKSP2
  364.     MOV    A,H
  365.     CPI    HIGH(SORG+SSIZ)
  366.     JNZ    PEKSP1
  367.     RET
  368.  
  369. ;    POINT MODE: SHIFT ENTIRE SCREEN LEFT ONE PIXEL
  370.  
  371. PEKSMI::    LXI    H,SORG+SSIZ-1
  372.     LXI    D,-RSIZ+1
  373. PEKSM1:    PUSH    H
  374.     DAD    D
  375.     CALL    PEXMI
  376.     POP    H
  377. PEKSM2:    CALL    PEXMI
  378.     MOV    M,B
  379.     MOV    A,L
  380.     ANI    03FH
  381.     DCX    H
  382.     JNZ    PEKSM2
  383.     MOV    A,H
  384.     CPI    HIGH(SORG)-1
  385.     JNZ    PEKSM1
  386.     RET
  387.  
  388. ;    POINT MODE: SHIFT ENTIRE SCREEN UP ONE PIXEL
  389.  
  390. PWYEPL::    LXI    H,SORG+SSIZ-1
  391. PWYEP1:    LXI    D,-SSIZ+RSIZ
  392.     PUSH    H
  393.     DAD    D
  394.     CALL    PWYPL
  395.     POP    H
  396.     PUSH    H
  397.     LXI    D,-RSIZ
  398. PWYEP2:    CALL    PWYPL
  399.     MOV    M,B
  400.     DAD    D
  401.     MOV    A,H
  402.     CPI    HIGH(SORG)-1
  403.     JNZ    PWYEP2
  404.     POP    H
  405.     MOV    A,L
  406.     ANI    03FH
  407.     DCX    H
  408.     JNZ    PWYEP1
  409.     RET
  410.  
  411. ;    POINT MODE: MOVE ENTIRE SCREEN DOWN ONE PIXEL
  412.  
  413. PWYEMI::    LXI    H,SORG
  414. PWYEM1:    LXI    D,SSIZ-RSIZ
  415.     PUSH    H
  416.     DAD    D
  417.     CALL    PWYMI
  418.     POP    H
  419.     PUSH    H
  420.     LXI    D,RSIZ
  421. PWYEM2:    CALL    PWYMI
  422.     MOV    M,B
  423.     DAD    D
  424.     MOV    A,H
  425.     CPI    HIGH(SORG+SSIZ)
  426.     JNZ    PWYEM2
  427.     POP    H
  428.     INX    H
  429.     MOV    A,L
  430.     ANI    03FH
  431.     JNZ    PWYEM1
  432.     RET
  433.  
  434. ;    FAST RIGHT SHIFT OF 4 PIXELS= 1 BYTE
  435.  
  436. FXPL::    LXI    H,SORG
  437.     LXI    D,RSIZ-1
  438. FXP1:    PUSH    H
  439.     DAD    D
  440.     MOV    B,M
  441.     POP    H
  442. FXP2:    MOV    A,M
  443.     MOV    M,B
  444.     MOV    B,A
  445.     INX    H
  446.     MOV    A,L
  447.     ANI    03FH
  448.     JNZ    FXP2
  449.     MOV    A,H
  450.     CPI    HIGH(SORG+SSIZ)
  451.     JNZ    FXP1
  452.     RET
  453.  
  454. ;    FAST LEFT SHIFT OF 4 PIXELS WHICH IS ONE BYTE
  455.  
  456. FXMI::    LXI    H,SORG+SSIZ-1
  457.     LXI    D,-RSIZ+1
  458. FXM1:    PUSH    H
  459.     DAD    D
  460.     MOV    B,M
  461.     POP    H
  462. FXM2:    MOV    A,M
  463.     MOV    M,B
  464.     MOV    B,A
  465.     MOV    A,L
  466.     ANI    03FH
  467.     DCX    H
  468.     JNZ    FXM2
  469.     MOV    A,H
  470.     CPI    HIGH(SORG)-1
  471.     JNZ    FXM1
  472.     RET
  473.  
  474. ;    FAST SHIFT UP BY 2 PIXELS = 1 BYTE
  475.  
  476. FYPL::    LXI    H,SORG+SSIZ-1
  477. FYP1:    LXI    D,-SSIZ+RSIZ
  478.     PUSH    H
  479.     DAD    D
  480.     MOV    B,M
  481.     POP    H
  482.     PUSH    H
  483.     LXI    D,-RSIZ
  484. FYP2:    MOV    A,M
  485.     MOV    M,B
  486.     MOV    B,A
  487.     DAD    D
  488.     MOV    A,H
  489.     CPI    HIGH(SORG)-1
  490.     JNZ    FYP2
  491.     POP    H
  492.     MOV    A,L
  493.     ANI    03FH
  494.     DCX    H
  495.     JNZ    FYP1
  496.     RET
  497.  
  498. ;    FAST DOWN SHIFT OF ENTIRE SCREEN BY 2 PIXELS = 1 BYTE
  499.  
  500. FYMI::    LXI    H,SORG
  501. FYM1:    LXI    D,SSIZ-RSIZ
  502.     PUSH    H
  503.     DAD    D
  504.     MOV    B,M
  505.     POP    H
  506.     PUSH    H
  507.     LXI    D,RSIZ
  508. FYM2:    MOV    A,M
  509.     MOV    M,B
  510.     MOV    B,A
  511.     DAD    D
  512.     MOV    A,H
  513.     CPI    HIGH(SORG+SSIZ)
  514.     JNZ    FYM2
  515.     POP    H
  516.     INX    H
  517.     MOV    A,L
  518.     ANI    03FH
  519.     JNZ    FYM1
  520.     RET
  521.  
  522. ;    GRAY MODE: IN-BYTE RIGHT SHIFT
  523.  
  524. GEXPL::    MOV    A,M
  525.     RRC
  526.     RRC
  527.     RRC
  528.     RRC
  529.     MOV    B,A
  530.     ANI    00FH
  531.     ORA    C
  532.     MOV    C,A
  533.     MOV    A,B
  534.     ANI    0F0H
  535.     MOV    B,C
  536.     MOV    C,A
  537.     RET
  538.  
  539. ;    GRAY MODE: INTRABYTE LEFT SHIFT OF ONE PIXEL
  540.  
  541. GEXMI::    MOV    A,M
  542.     RLC
  543.     RLC
  544.     RLC
  545.     RLC
  546.     MOV    B,A
  547.     ANI    0E0H
  548.     ORA    C
  549.     MOV    C,A
  550.     MOV    A,B
  551.     ANI    00FH
  552.     MOV    B,C
  553.     MOV    C,A
  554.     RET
  555.  
  556. ;    GRAY MODE: SHIFT WHOLE SCREEN 1 PIXEL RIGHT
  557.  
  558. GEKSPL::    LXI    H,SORG
  559.     LXI    D,RSIZ-1
  560. GEKSP1:    PUSH    H
  561.     DAD    D
  562.     CALL    GEXPL
  563.     POP    H
  564. GEKSP2:    CALL    GEXPL
  565.     MOV    M,B
  566.     INX    H
  567.     MOV    A,L
  568.     ANI    03FH
  569.     JNZ    GEKSP2
  570.     MOV    A,H
  571.     CPI    HIGH(SORG+SSIZ)
  572.     JNZ    GEKSP1
  573.     RET
  574.  
  575. ;    GRAY MODE: SHIFT ENTIRE SCREEN LEFT ONE PIXEL
  576.  
  577. GEKSMI::    LXI    H,SORG+SSIZ-1
  578.     LXI    D,-RSIZ+1
  579. GEKSM1:    PUSH    H
  580.     DAD    D
  581.     CALL    GEXMI
  582.     POP    H
  583. GEKSM2:    CALL    GEXMI
  584.     MOV    M,B
  585.     MOV    A,L
  586.     ANI    03FH
  587.     DCX    H
  588.     JNZ    GEKSM2
  589.     MOV    A,H
  590.     CPI    HIGH(SORG)-1
  591.     JNZ    GEKSM1
  592.     RET
  593.  
  594. ;    GRAY MODE: MOVE CURSOR RIGHT ONE PIXEL
  595.  
  596. GXPL::    LXI    H,MSK
  597.     MOV    A,M
  598.     ANI    0F0H
  599.     JZ    GXP1
  600.     MVI    M,00FH
  601.     RET
  602. GXP1:    MVI    M,0F0H
  603.     LDA    EX
  604.     ADI    004H
  605.     STA    EX
  606.     RET
  607.  
  608. ;    GRAY MODE: SHIFT CURSOR LEFT ONE PIXEL
  609.  
  610. GXMI::    LXI    H,MSK
  611.     MOV    A,M
  612.     ANI    00FH
  613.     JZ    GXM1
  614.     MVI    M,0F0H
  615.     RET
  616. GXM1:    MVI    M,00FH
  617.     LDA    EX
  618.     SUI    004H
  619.     STA    EX
  620.     RET
  621.  
  622. ;    GRAY MODE: MOVE CURSOR UP ONE PIXEL
  623.  
  624. GYPL::    LDA    WY
  625.     SUI    002H
  626.     STA    WY
  627.     RET
  628.  
  629. ;    GRAY MODE: MOVE CURSOR DOWN ONE PIXEL
  630.  
  631. GYMI::    LDA    WY
  632.     ADI    002H
  633.     STA    WY
  634.     RET
  635.  
  636. ;    GRAY MODE: HOME CURSOR
  637.  
  638. GHOM::    LXI    H,08080H
  639.     SHLD    WY
  640.     MVI    A,00FH
  641.     STA    MSK
  642.     RET
  643.  
  644. ;    GRAY MODE: MAKE CURSOR PIXEL WHITE
  645.  
  646. GWHI::    CALL    DOT
  647.     ORA    M
  648.     MOV    M,A
  649.     RET
  650.  
  651. ;    GRAY MODE: MAKE CURSOR PIXEL BLACK
  652.  
  653. GBLA::    CALL    DOT
  654.     CMA
  655.     ANA    M
  656.     MOV    M,A
  657.     RET
  658.  
  659. ;    GRAY MODE: REVERSE CURSOR PIXEL
  660.  
  661. GREV::    CALL    DOT
  662.     XRA    M
  663.     MOV    M,A
  664.     RET
  665.  
  666. ;    GRAY MODE: SENSE CURSOR PIXEL
  667.  
  668. GSEN::    CALL    DOT
  669.     ANA    M
  670.     RZ
  671.     PUSH    PSW
  672.     ANI    0F0H
  673.     POP    PSW
  674.     RZ
  675.     RRC
  676.     RRC
  677.     RRC
  678.     RRC
  679.     RET
  680.  
  681. ;    GRAY MODE: RAISE GRAY LEVEL OF CURSOR PIXEL
  682.  
  683. GZPL::    CALL    DOT
  684.     MOV    B,A
  685.     CMA
  686.     ANA    M
  687.     MOV    C,A
  688.     MOV    A,B
  689.     ANA    M
  690.     ADI    011H
  691.     ANA    B
  692.     ORA    C
  693.     MOV    M,A
  694.     RET
  695.  
  696. ;    GRAY MODE: LOWER PIXEL UNDER CURSOR ONE GRAY LEVEL
  697.  
  698. GZMI::    CALL    DOT
  699.     MOV    B,A
  700.     CMA
  701.     ANA    M
  702.     MOV    C,A
  703.     MOV    A,B
  704.     ANA    M
  705.     ADI    0FFH
  706.     ANA    B
  707.     ORA    C
  708.     MOV    M,A
  709.     RET
  710.  
  711. ;    GRAY MODE: CARTESIAN COORDINATES TO MASK, BYTE    ADDRESS
  712.  
  713. GCART::    LDAX    D
  714.     ANI    03FH
  715.     RLC
  716.     STA    WY
  717.     MOV    A,M
  718.     ANI    03FH
  719.     RRC
  720.     PUSH    PSW
  721.     RLC
  722.     RLC
  723.     RLC
  724.     STA    EX
  725.     POP    PSW
  726.     MVI    A,00FH
  727.     JC    GCAR1
  728.     XRI    0FFH
  729. GCAR1:    STA    MSK
  730.     RET
  731.  
  732. ;    BLOCK OF COMBINED CURSOR MOVEMENTS AND CURSOR
  733. ;    INVERSIONS IN THE POINT MODE - FOR DEMONSTRATION
  734.  
  735. PN:    CALL    PREV
  736.     CALL    PYPL
  737.     JMP    PREV
  738.  
  739. PS:    CALL    PREV
  740.     CALL    PYMI
  741.     JMP    PREV
  742.  
  743. PE:    CALL    PREV
  744.     CALL    PXPL
  745.     JMP    PREV
  746.  
  747. PW:    CALL    PREV
  748.     CALL    PXMI
  749.     JMP    PREV
  750.  
  751. ;    PLACE THE INDIVIDUAL NEGATIVES OF THE BYTES B,C IN H,L
  752.  
  753. NEGL:    MOV    A,C
  754.     CMA
  755.     INR    A
  756.     MOV    L,A
  757.     MOV    A,B
  758.     CMA
  759.     INR    A
  760.     MOV    H,A
  761.     RET
  762.  
  763.  
  764. ; BLOCK OF COMBINED SCREEN-CURSOR SHIFTS
  765.  
  766. PEA:    CALL    PEKSPL
  767.     JMP    PXPL
  768.  
  769. PWE:    CALL    PEKSMI
  770.     JMP    PXMI
  771.  
  772. PNO:    CALL    PWYEPL
  773.     JMP    PYPL
  774.  
  775. PSO:    CALL    PWYEMI
  776.     JMP    PYMI
  777.  
  778. ;    SIMILAR    BLOCK    FOR    GREY    MODE
  779.  
  780. GEA:    CALL    GEKSPL
  781.     JMP    GXPL
  782.  
  783. GWE:    CALL    GEKSMI
  784.     JMP    GXMI
  785.  
  786. GNO:    CALL    FYPL
  787.     JMP    GYPL
  788.  
  789. GSO:    CALL    FYMI
  790.     JMP    GYMI
  791.  
  792. ;    COMBINED    CURSOR    MOVEMENT    AND    8-LEVEL    GRAY    SHIFT
  793.  
  794. GE:    CALL    GZEH
  795.     CALL    GXPL
  796.     JMP    GZEH
  797.  
  798. GW:    CALL    GZEH
  799.     CALL    GXMI
  800.     JMP    GZEH
  801.  
  802. GN:    CALL    GZEH
  803.     CALL    GYPL
  804.     JMP    GZEH
  805.  
  806. GS:    CALL    GZEH
  807.     CALL    GYMI
  808.     JMP    GZEH
  809.  
  810. ;    MOVE WHOLE SCREEN THROUGH 8 GRAY POINTS
  811.  
  812. GZEEH:    LXI    D,SSIZ
  813.     LXI    H,SORG
  814. GZEE1:    MOV    B,M
  815.     MOV    A,B
  816.     ANI    0F0H
  817.     MOV    C,A
  818.     MOV    A,B
  819.     ADI    008H
  820.     ANI    00FH
  821.     ORA    C
  822.     ADI    080H
  823.     MOV    M,A
  824.     INX    H
  825.     DCR    E
  826.     JNZ    GZEE1
  827.     DCR    D
  828.     JNZ    GZEE1
  829.     RET
  830.  
  831. ;    LIGHTEN THE WHOLE SCREEN BY ONE GREY POINT
  832.  
  833. GZEEPL:    LXI    D,SSIZ
  834.     LXI    H,SORG
  835. GZEEP1:    MOV    B,M
  836.     MOV    A,B
  837.     ANI    0F0H
  838.     MOV    C,A
  839.     MOV    A,B
  840.     ADI    001H
  841.     ANI    00FH
  842.     ORA    C
  843.     ADI    010H
  844.     MOV    M,A
  845.     INX    H
  846.     DCR    E
  847.     JNZ    GZEEP1
  848.     DCR    D
  849.     JNZ    GZEEP1
  850.     RET
  851.  
  852. ;    DARKEN WHOLE SCREEN BY ONE GRAY POINT
  853.  
  854. GZEEMI:    LXI    D,SSIZ
  855.     LXI    H,SORG
  856. GZEEM1:    MOV    B,M
  857.     MOV    A,B
  858.     ANI    0F0H
  859.     MOV    C,A
  860.     MOV    A,B
  861.     ADI    00FH
  862.     ANI    00FH
  863.     ORA    C
  864.     ADI    0F0H
  865.     MOV    M,A
  866.     INX    H
  867.     DCR    E
  868.     JNZ    GZEEM1
  869.     DCR    D
  870.     JNZ    GZEEM1
  871.     RET
  872.  
  873. ;    LIGHTEN THE PIXEL UNDER THE CURSOR BY 8 POINTS
  874.  
  875. GZEH:    CALL    DOT
  876. GZED:    MOV    C,A
  877.     CMA
  878.     ANA    M
  879.     MOV    B,A
  880.     MOV    A,M
  881.     ANA    C
  882.     ADI    088H
  883.     ANA    C
  884.     ORA    B
  885.     MOV    M,A
  886.     RET
  887.  
  888. ;    LIGHTEN ALL PIXELS FROM HERE TO LEFT MARGIN 8 POINTS
  889.  
  890. EDGE:    CALL    DOT
  891.     ORA    A
  892.     JP    EDG1
  893.     CALL    GZED
  894. EDG1:    MOV    A,L
  895.     ANI    03FH
  896.     RZ
  897.     DCX    H
  898.     MOV    B,M
  899.     MOV    A,B
  900.     ANI    0F0H
  901.     MOV    C,A
  902.     MOV    A,B
  903.     SUI    008H
  904.     ANI    00FH
  905.     ORA    C
  906.     SUI    080H
  907.     MOV    M,A
  908.     JMP    EDG1
  909.  
  910. ;    BLOCK OF COMBINED CURSOR MOVEMENTS AND PIXEL REVERSES
  911.  
  912. GEE:    CALL    GXPL
  913.     JMP    GZEH
  914.  
  915. GWW:    CALL    GXMI
  916.     JMP    GZEH
  917.  
  918. GNN:    CALL    GYPL
  919.     JMP    GZEH
  920.  
  921. GSS:    CALL    GYMI
  922.     JMP    GZEH
  923.  
  924. ;    DRAW A LINE WITH GIVEN INCREMENTS IN GREY MODE
  925.  
  926. GLIN:    LXI    H,GXPL
  927.     MOV    A,B
  928.     ORA    A
  929.     JP    GLI1
  930.     CMA
  931.     INR    A
  932.     MOV    B,A
  933.     LXI    H,GXMI
  934. GLI1:    LXI    D,GYPL
  935.     MOV    A,C
  936.     ORA    A
  937.     JP    GLI2
  938.     CMA
  939.     INR    A
  940.     MOV    C,A
  941.     LXI    D,GYMI
  942. GLI2:    CMP    B
  943.     JNC    GLI3
  944.     XCHG
  945.     MOV    C,B
  946.     MOV    B,A
  947. GLI3:    MOV    A,C
  948.     STA    EKS
  949.     MOV    A,B
  950.     ADD    A
  951.     MOV    B,A
  952.     SUB    C
  953.     PUSH    PSW
  954.     SUB    C
  955.     MOV    C,A
  956. GLI4:    POP    PSW
  957.     PUSH    H
  958.     LXI    H,GZEH
  959.     XTHL
  960.     CPI    001H
  961.     JM    GLI5
  962.     PUSH    H
  963.     ADD    C
  964.     JMP    GLI6
  965. GLI5:    ADD    B
  966. GLI6:    PUSH    D
  967.     PUSH    PSW
  968.     LDA    EKS
  969.     DCR    A
  970.     STA    EKS
  971.     JNZ    GLI4
  972.     POP    PSW
  973.     RET
  974.  
  975. ;    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  976. ;        - - - LIFE IN THE GRAY MODE - - -
  977. ;    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  978.  
  979.  
  980.  
  981. ;    ORDINARY CYCLE FOR NEIGHBORS OF LEFT PIXEL
  982.  
  983. OLEP:    PUSH    H
  984.     PUSH    H
  985.     DAD    D
  986.     MOV    A,M
  987.     ADI    011H
  988.     MOV    M,A
  989.     DCX    H
  990.     INR    M
  991.     POP    H
  992.     DCX    H
  993.     INR    M
  994.     DAD    B
  995.     INR    M
  996.     INX    H
  997.     MOV    A,M
  998.     ADI    011H
  999.     MOV    M,A
  1000.     POP    H
  1001.     RET
  1002.  
  1003. ;    ORDINARY CYCLE FOR NEIGHBORS OF RIGHT PIXEL
  1004.  
  1005. ORIP:    PUSH    H
  1006.     PUSH    H
  1007.     DAD    D
  1008.     MOV    A,M
  1009.     ADI    011H
  1010.     MOV    M,A
  1011.     INX    H
  1012.     MOV    A,M
  1013.     ADI    010H
  1014.     MOV    M,A
  1015.     POP    H
  1016.     INX    H
  1017.     MOV    A,M
  1018.     ADI    010H
  1019.     MOV    M,A
  1020.     DAD    B
  1021.     MOV    A,M
  1022.     ADI    010H
  1023.     MOV    M,A
  1024.     DCX    H
  1025.     MOV    A,M
  1026.     ADI    011H
  1027.     MOV    M,A
  1028.     POP    H
  1029.     RET
  1030.  
  1031. ;    COUNT NEIGHBORS OF ORDINARY CELLS
  1032.  
  1033. ONEC:    LXI    B,RSIZ
  1034.     LXI    D,-RSIZ
  1035.     LXI    H,SORG+RSIZ
  1036. ONE1:    MOV    A,M
  1037.     ANI    080H
  1038.     CNZ    RNOM
  1039.     MOV    A,M
  1040.     ANI    008H
  1041.     CNZ    LNOM
  1042.     INX    H
  1043.     MOV    A,L
  1044.     CPI    0C0H
  1045.     JNZ    ONE1
  1046.     MOV    A,H
  1047.     CPI    HIGH(SORG+SSIZ)-1
  1048.     JNZ    ONE1
  1049.     RET
  1050.  
  1051. ;    UPDATE TO NEXT GENERATION ONCE NEIGHBOR COUNT DONE
  1052.  
  1053. NEXT:    LXI    D,SSIZ
  1054.     LXI    H,SORG
  1055. NEX1:    MOV    A,M
  1056.     ORA    A
  1057.     JZ    NEX8
  1058.     MOV    C,A
  1059.     ANI    077H
  1060.     MOV    B,A
  1061.     MOV    A,C
  1062.     ANI    088H
  1063.     MOV    C,A
  1064.     RLC
  1065.     ADD    B
  1066.     MOV    B,A
  1067.     PUSH    H
  1068.     LXI    H,NEX4
  1069.     XTHL
  1070.     MOV    A,B
  1071.     ANI    0F0H
  1072.     CPI    020H
  1073.     JZ    NEX2
  1074.     CPI    030H
  1075.     JZ    NEX3
  1076.     XRA    A
  1077.     RET
  1078. NEX2:    MOV    A,C
  1079.     ANI    080H
  1080.     RET
  1081. NEX3:    MVI    A,080H
  1082.     RET
  1083. NEX4:    PUSH    PSW
  1084.     PUSH    H
  1085.     LXI    H,NEX7
  1086.     XTHL
  1087.     MOV    A,B
  1088.     ANI    00FH
  1089.     CPI    002H
  1090.     JZ    NEX5
  1091.     CPI    003H
  1092.     JZ    NEX6
  1093.     XRA    A
  1094.     RET
  1095. NEX5:    MOV    A,C
  1096.     ANI    008H
  1097.     RET
  1098. NEX6:    MVI    A,008H
  1099.     RET
  1100. NEX7:    POP    B
  1101.     ORA    B
  1102.     MOV    M,A
  1103. NEX8:    INX    H
  1104.     DCR    E
  1105.     JNZ    NEX1
  1106.     DCR    D
  1107.     JNZ    NEX1
  1108.     RET
  1109.  
  1110. ;    CYCLE FOR LEFT PIXEL ON LEFT MARGIN
  1111.  
  1112. LLEP:    PUSH    H
  1113.     PUSH    H
  1114.     PUSH    H
  1115.     DAD    D
  1116.     MOV    A,M
  1117.     ADI    011H
  1118.     MOV    M,A
  1119.     MOV    A,L
  1120.     ORI    03FH
  1121.     MOV    L,A
  1122.     INR    M
  1123.     POP    H
  1124.     MOV    A,L
  1125.     ORI    03FH
  1126.     MOV    L,A
  1127.     INR    M
  1128.     DAD    B
  1129.     INR    M
  1130.     POP    H
  1131.     DAD    B
  1132.     MOV    A,M
  1133.     ADI    011H
  1134.     MOV    M,A
  1135.     POP    H
  1136.     RET
  1137.  
  1138. ;    CYCLE FOR RIGHT PIXEL ON RIGHT MARGIN
  1139.  
  1140. RRIP:    PUSH    H
  1141.     PUSH    H
  1142.     PUSH    H
  1143.     DAD    D
  1144.     MOV    A,M
  1145.     ADI    011H
  1146.     MOV    M,A
  1147.     MOV    A,L
  1148.     ANI    0C0H
  1149.     MOV    L,A
  1150.     MOV    A,M
  1151.     ADI    010H
  1152.     MOV    M,A
  1153.     POP    H
  1154.     MOV    A,L
  1155.     ANI    0C0H
  1156.     MOV    L,A
  1157.     MOV    A,M
  1158.     ADI    010H
  1159.     MOV    M,A
  1160.     DAD    B
  1161.     MOV    A,M
  1162.     ADI    010H
  1163.     MOV    M,A
  1164.     POP    H
  1165.     DAD    B
  1166.     MOV    A,M
  1167.     ADI    011H
  1168.     MOV    M,A
  1169.     POP    H
  1170.     RET
  1171.  
  1172. ;    LEFT    PIXEL:    CHOOSE    BETWEEN    NORMAL    OR    MARGIN    CYCLE
  1173.  
  1174. RNOM:    MOV    A,L
  1175.     ANI    03FH
  1176.     JZ    LLEP
  1177.     JMP    OLEP
  1178.  
  1179. ;    RIGHT    PIXEL:    CHOSE    NORMAL    OR    MARGIN    CYCLE
  1180.  
  1181. LNOM:    MOV    A,L
  1182.     ANI    03FH
  1183.     CPI    03FH
  1184.     JZ    RRIP
  1185.     JMP    ORIP
  1186.  
  1187. ;    COUNT    NEIGHBORS    ALONG    TOP    MARGIN
  1188.  
  1189. NCTO:    LXI    B,RSIZ
  1190.     LXI    D,SSIZ-RSIZ
  1191.     LXI    H,SORG
  1192. NCTI:    MOV    A,M
  1193.     ANI    080H
  1194.     CNZ    RNOM
  1195.     MOV    A,M
  1196.     ANI    008H
  1197.     CNZ    LNOM
  1198.     INX    H
  1199.     MOV    A,L
  1200.     ANI    03FH
  1201.     JNZ    NCTI
  1202.     RET
  1203.  
  1204. ;    COUNT    NEIGHBORS    ALONG    BOTTOM    MARGIN
  1205.  
  1206. NCBO:    LXI    B,-SSIZ+RSIZ
  1207.     LXI    D,-RSIZ
  1208.     LXI    H,SORG+SSIZ-RSIZ
  1209.     JMP    NCTI
  1210.  
  1211. ;    EXECUTE    ONE    CYCLE    OF    LIFE
  1212.  
  1213. LIFE:    CALL    ONEC
  1214.     CALL    NCTO
  1215.     CALL    NCBO
  1216.     JMP    NEXT
  1217.  
  1218.  
  1219.     END
  1220.