MSK: DB 00 WY: DB 00 EX: DB 00 EKS: DB 00 SSIZ EQU 02000H RSIZ EQU 040H SORG EQU 0C000H ; POINT MODE: MOVE CURSOR RIGHT PXPL:: LXI H,MSK MOV A,M ANI 0AAH JZ PXP1 RRC MOV M,A RET PXP1: MOV A,M RRC RRC RRC MOV M,A ANI 0A0H RZ LDA EX ADI 004H STA EX RET ; POINT MODE: MOVE CURSOR LEFT PXMI:: LXI H,MSK MOV A,M ANI 055H JZ PXM1 RLC MOV M,A RET PXM1: MOV A,M RLC RLC RLC MOV M,A ANI 005H RZ LDA EX SUI 004H STA EX RET ; POINT MODE: MOVE CURSOR UP PYPL:: LXI H,MSK MOV A,M ANI 033H JZ PYP1 RLC RLC MOV M,A RET PYP1: MOV A,M RRC RRC MOV M,A LDA WY SUI 002H STA WY RET ; POINT MODE: MOVE CURSOR DOWN PYMI:: LXI H,MSK MOV A,M ANI 0CCH JZ PYM1 RRC RRC MOV M,A RET PYM1: MOV A,M RLC RLC MOV M,A LDA WY ADI 002H STA WY RET ; LOAD ACC WITH MASK, HL WITH BYTE ADDRESS FROM ; (MSK,WY,EX) DOT: LHLD WY MOV A,H MVI H,SORG/02000H DAD H DAD H DAD H DAD H DAD H RRC RRC ORA L MOV L,A LDA MSK RET ; POINT MODE: HOME CURSOR PHOM:: LXI H,08080H SHLD WY MVI A,040H STA MSK RET ; POINT MODE: MAKE WHITE DOT AT CURSOR PWHIT:: CALL DOT ORA M MOV M,A RET ; POINT MODE: MAKE BLACK DOT AT CURSOR PBLAK:: CALL DOT CMA ANA M MOV M,A RET ; POINT MODE: REVERSE DOT UNDER CURSOR PREV:: CALL DOT XRA M MOV M,A RET ; POINT MODE: TEST DOT UNDER CURSOR PTEST:: CALL DOT ANA M RET ; BOTH MODES: CLEAR SCREEN TO WHITE WHIT:: LXI D,SSIZ LXI H,SORG WHI1: MVI M,0FFH INX H DCR E JNZ WHI1 DCR D JNZ WHI1 RET ; BOTH MODES: CLEAR SCREEN TO BLACK BLAK:: LXI D,SSIZ LXI H,SORG BLA1: MVI M,000H INX H DCR E JNZ BLA1 DCR D JNZ BLA1 RET ; BOTH MODES: REVERSE ENTIRE SCREEN REVE:: LXI D,SSIZ LXI H,SORG REV1: MOV A,M XRI 0FFH MOV M,A INX H DCR E JNZ REV1 DCR D JNZ REV1 RET ; POINT MODE: GIVEN A CARTESIAN ADDRESS, FORM A BIT ; MASK AND BYTE ADDRESS FOR THE CURSOR PCAR:: MOV A,M ANI 0FCH STA EX LDAX D ANI 0FEH STA WY MVI B,80H MOV A,M RRC JNC PCA1 MOV C,A MOV A,B RRC MOV B,A MOV A,C PCA1: RRC JNC PCA2 MOV A,B RRC RRC RRC RRC MOV B,A PCA2: LDAX D RRC MOV A,B JNC PCA3 RRC RRC PCA3: STA MSK RET ; POINT MODE: DRAW A LINE BETWEEN TWO POINTS ; GIVEN THE INCREMENTS (B,C)=(DX,DY) PLIN:: MOV B,M XCHG MOV C,M LXI H,PXPL MOV A,B ORA A JP PLI1 CMA INR A MOV B,A LXI H,PXMI PLI1: LXI D,PYMI MOV A,C ORA A JP PLI2 CMA INR A MOV C,A LXI D,PYPL PLI2: CMP B JNC PLI3 XCHG MOV C,B MOV B,A MOV A,C PLI3: STA EKS XRA A SUB B SUB B MOV B,A ADD C PUSH PSW ADD C MOV C,A PLI4: POP PSW PUSH H LXI H,PWHIT XTHL JP PLI5 PUSH H ADD C JMP PLI6 PLI5: ADD B PLI6: PUSH D PUSH PSW LDA EKS DCR A STA EKS JNZ PLI4 POP PSW RET ; POINT MODE: SHIFT WITHIN ONE BYTE TO SCROLL THE ; SCREEN RIGHT ONE PIXEL PEXPL:: MOV A,M RRC MOV B,A ANI 055H ORA C MOV C,A MOV A,B RRC RRC MOV B,A ANI 00AH ORA C MOV C,A MOV A,B ANI 0A0H MOV B,C MOV C,A RET ; POINT MODE: INTRA-BYTE SHIFT TO SCROLL LEFT ONE PIXEL PEXMI:: MOV A,M RLC MOV B,A ANI 0AAH ORA C MOV C,A MOV A,B RLC RLC MOV B,A ANI 050H ORA C MOV C,A MOV A,B ANI 005H MOV B,C MOV C,A RET ; POINT MODE: INTRABYTE SHIFT TO SCROLL UP ONE PIXEL PWYPL:: MOV A,M MOV B,A RLC RLC ANI 0CCH ORA C MOV C,A MOV A,B ANI 0CCH RRC RRC MOV B,C MOV C,A RET ; POINT MODE: INTRABYTE SHIFT TO SCROLL DOWN ONE PIXEL PWYMI:: MOV A,M MOV B,A RRC RRC ANI 033H ORA C MOV C,A MOV A,B ANI 033H RLC RLC MOV B,C MOV C,A RET ; POINT MODE: MOVE ENTIRE SCREEN RIGHT ONE PIXEL PEKSPL:: LXI H,SORG LXI D,RSIZ-1 PEKSP1: PUSH H DAD D CALL PEXPL POP H PEKSP2: CALL PEXPL MOV M,B INX H MOV A,L ANI 03FH JNZ PEKSP2 MOV A,H CPI HIGH(SORG+SSIZ) JNZ PEKSP1 RET ; POINT MODE: SHIFT ENTIRE SCREEN LEFT ONE PIXEL PEKSMI:: LXI H,SORG+SSIZ-1 LXI D,-RSIZ+1 PEKSM1: PUSH H DAD D CALL PEXMI POP H PEKSM2: CALL PEXMI MOV M,B MOV A,L ANI 03FH DCX H JNZ PEKSM2 MOV A,H CPI HIGH(SORG)-1 JNZ PEKSM1 RET ; POINT MODE: SHIFT ENTIRE SCREEN UP ONE PIXEL PWYEPL:: LXI H,SORG+SSIZ-1 PWYEP1: LXI D,-SSIZ+RSIZ PUSH H DAD D CALL PWYPL POP H PUSH H LXI D,-RSIZ PWYEP2: CALL PWYPL MOV M,B DAD D MOV A,H CPI HIGH(SORG)-1 JNZ PWYEP2 POP H MOV A,L ANI 03FH DCX H JNZ PWYEP1 RET ; POINT MODE: MOVE ENTIRE SCREEN DOWN ONE PIXEL PWYEMI:: LXI H,SORG PWYEM1: LXI D,SSIZ-RSIZ PUSH H DAD D CALL PWYMI POP H PUSH H LXI D,RSIZ PWYEM2: CALL PWYMI MOV M,B DAD D MOV A,H CPI HIGH(SORG+SSIZ) JNZ PWYEM2 POP H INX H MOV A,L ANI 03FH JNZ PWYEM1 RET ; FAST RIGHT SHIFT OF 4 PIXELS= 1 BYTE FXPL:: LXI H,SORG LXI D,RSIZ-1 FXP1: PUSH H DAD D MOV B,M POP H FXP2: MOV A,M MOV M,B MOV B,A INX H MOV A,L ANI 03FH JNZ FXP2 MOV A,H CPI HIGH(SORG+SSIZ) JNZ FXP1 RET ; FAST LEFT SHIFT OF 4 PIXELS WHICH IS ONE BYTE FXMI:: LXI H,SORG+SSIZ-1 LXI D,-RSIZ+1 FXM1: PUSH H DAD D MOV B,M POP H FXM2: MOV A,M MOV M,B MOV B,A MOV A,L ANI 03FH DCX H JNZ FXM2 MOV A,H CPI HIGH(SORG)-1 JNZ FXM1 RET ; FAST SHIFT UP BY 2 PIXELS = 1 BYTE FYPL:: LXI H,SORG+SSIZ-1 FYP1: LXI D,-SSIZ+RSIZ PUSH H DAD D MOV B,M POP H PUSH H LXI D,-RSIZ FYP2: MOV A,M MOV M,B MOV B,A DAD D MOV A,H CPI HIGH(SORG)-1 JNZ FYP2 POP H MOV A,L ANI 03FH DCX H JNZ FYP1 RET ; FAST DOWN SHIFT OF ENTIRE SCREEN BY 2 PIXELS = 1 BYTE FYMI:: LXI H,SORG FYM1: LXI D,SSIZ-RSIZ PUSH H DAD D MOV B,M POP H PUSH H LXI D,RSIZ FYM2: MOV A,M MOV M,B MOV B,A DAD D MOV A,H CPI HIGH(SORG+SSIZ) JNZ FYM2 POP H INX H MOV A,L ANI 03FH JNZ FYM1 RET ; GRAY MODE: IN-BYTE RIGHT SHIFT GEXPL:: MOV A,M RRC RRC RRC RRC MOV B,A ANI 00FH ORA C MOV C,A MOV A,B ANI 0F0H MOV B,C MOV C,A RET ; GRAY MODE: INTRABYTE LEFT SHIFT OF ONE PIXEL GEXMI:: MOV A,M RLC RLC RLC RLC MOV B,A ANI 0E0H ORA C MOV C,A MOV A,B ANI 00FH MOV B,C MOV C,A RET ; GRAY MODE: SHIFT WHOLE SCREEN 1 PIXEL RIGHT GEKSPL:: LXI H,SORG LXI D,RSIZ-1 GEKSP1: PUSH H DAD D CALL GEXPL POP H GEKSP2: CALL GEXPL MOV M,B INX H MOV A,L ANI 03FH JNZ GEKSP2 MOV A,H CPI HIGH(SORG+SSIZ) JNZ GEKSP1 RET ; GRAY MODE: SHIFT ENTIRE SCREEN LEFT ONE PIXEL GEKSMI:: LXI H,SORG+SSIZ-1 LXI D,-RSIZ+1 GEKSM1: PUSH H DAD D CALL GEXMI POP H GEKSM2: CALL GEXMI MOV M,B MOV A,L ANI 03FH DCX H JNZ GEKSM2 MOV A,H CPI HIGH(SORG)-1 JNZ GEKSM1 RET ; GRAY MODE: MOVE CURSOR RIGHT ONE PIXEL GXPL:: LXI H,MSK MOV A,M ANI 0F0H JZ GXP1 MVI M,00FH RET GXP1: MVI M,0F0H LDA EX ADI 004H STA EX RET ; GRAY MODE: SHIFT CURSOR LEFT ONE PIXEL GXMI:: LXI H,MSK MOV A,M ANI 00FH JZ GXM1 MVI M,0F0H RET GXM1: MVI M,00FH LDA EX SUI 004H STA EX RET ; GRAY MODE: MOVE CURSOR UP ONE PIXEL GYPL:: LDA WY SUI 002H STA WY RET ; GRAY MODE: MOVE CURSOR DOWN ONE PIXEL GYMI:: LDA WY ADI 002H STA WY RET ; GRAY MODE: HOME CURSOR GHOM:: LXI H,08080H SHLD WY MVI A,00FH STA MSK RET ; GRAY MODE: MAKE CURSOR PIXEL WHITE GWHI:: CALL DOT ORA M MOV M,A RET ; GRAY MODE: MAKE CURSOR PIXEL BLACK GBLA:: CALL DOT CMA ANA M MOV M,A RET ; GRAY MODE: REVERSE CURSOR PIXEL GREV:: CALL DOT XRA M MOV M,A RET ; GRAY MODE: SENSE CURSOR PIXEL GSEN:: CALL DOT ANA M RZ PUSH PSW ANI 0F0H POP PSW RZ RRC RRC RRC RRC RET ; GRAY MODE: RAISE GRAY LEVEL OF CURSOR PIXEL GZPL:: CALL DOT MOV B,A CMA ANA M MOV C,A MOV A,B ANA M ADI 011H ANA B ORA C MOV M,A RET ; GRAY MODE: LOWER PIXEL UNDER CURSOR ONE GRAY LEVEL GZMI:: CALL DOT MOV B,A CMA ANA M MOV C,A MOV A,B ANA M ADI 0FFH ANA B ORA C MOV M,A RET ; GRAY MODE: CARTESIAN COORDINATES TO MASK, BYTE ADDRESS GCART:: LDAX D ANI 03FH RLC STA WY MOV A,M ANI 03FH RRC PUSH PSW RLC RLC RLC STA EX POP PSW MVI A,00FH JC GCAR1 XRI 0FFH GCAR1: STA MSK RET ; BLOCK OF COMBINED CURSOR MOVEMENTS AND CURSOR ; INVERSIONS IN THE POINT MODE - FOR DEMONSTRATION PN: CALL PREV CALL PYPL JMP PREV PS: CALL PREV CALL PYMI JMP PREV PE: CALL PREV CALL PXPL JMP PREV PW: CALL PREV CALL PXMI JMP PREV ; PLACE THE INDIVIDUAL NEGATIVES OF THE BYTES B,C IN H,L NEGL: MOV A,C CMA INR A MOV L,A MOV A,B CMA INR A MOV H,A RET ; BLOCK OF COMBINED SCREEN-CURSOR SHIFTS PEA: CALL PEKSPL JMP PXPL PWE: CALL PEKSMI JMP PXMI PNO: CALL PWYEPL JMP PYPL PSO: CALL PWYEMI JMP PYMI ; SIMILAR BLOCK FOR GREY MODE GEA: CALL GEKSPL JMP GXPL GWE: CALL GEKSMI JMP GXMI GNO: CALL FYPL JMP GYPL GSO: CALL FYMI JMP GYMI ; COMBINED CURSOR MOVEMENT AND 8-LEVEL GRAY SHIFT GE: CALL GZEH CALL GXPL JMP GZEH GW: CALL GZEH CALL GXMI JMP GZEH GN: CALL GZEH CALL GYPL JMP GZEH GS: CALL GZEH CALL GYMI JMP GZEH ; MOVE WHOLE SCREEN THROUGH 8 GRAY POINTS GZEEH: LXI D,SSIZ LXI H,SORG GZEE1: MOV B,M MOV A,B ANI 0F0H MOV C,A MOV A,B ADI 008H ANI 00FH ORA C ADI 080H MOV M,A INX H DCR E JNZ GZEE1 DCR D JNZ GZEE1 RET ; LIGHTEN THE WHOLE SCREEN BY ONE GREY POINT GZEEPL: LXI D,SSIZ LXI H,SORG GZEEP1: MOV B,M MOV A,B ANI 0F0H MOV C,A MOV A,B ADI 001H ANI 00FH ORA C ADI 010H MOV M,A INX H DCR E JNZ GZEEP1 DCR D JNZ GZEEP1 RET ; DARKEN WHOLE SCREEN BY ONE GRAY POINT GZEEMI: LXI D,SSIZ LXI H,SORG GZEEM1: MOV B,M MOV A,B ANI 0F0H MOV C,A MOV A,B ADI 00FH ANI 00FH ORA C ADI 0F0H MOV M,A INX H DCR E JNZ GZEEM1 DCR D JNZ GZEEM1 RET ; LIGHTEN THE PIXEL UNDER THE CURSOR BY 8 POINTS GZEH: CALL DOT GZED: MOV C,A CMA ANA M MOV B,A MOV A,M ANA C ADI 088H ANA C ORA B MOV M,A RET ; LIGHTEN ALL PIXELS FROM HERE TO LEFT MARGIN 8 POINTS EDGE: CALL DOT ORA A JP EDG1 CALL GZED EDG1: MOV A,L ANI 03FH RZ DCX H MOV B,M MOV A,B ANI 0F0H MOV C,A MOV A,B SUI 008H ANI 00FH ORA C SUI 080H MOV M,A JMP EDG1 ; BLOCK OF COMBINED CURSOR MOVEMENTS AND PIXEL REVERSES GEE: CALL GXPL JMP GZEH GWW: CALL GXMI JMP GZEH GNN: CALL GYPL JMP GZEH GSS: CALL GYMI JMP GZEH ; DRAW A LINE WITH GIVEN INCREMENTS IN GREY MODE GLIN: LXI H,GXPL MOV A,B ORA A JP GLI1 CMA INR A MOV B,A LXI H,GXMI GLI1: LXI D,GYPL MOV A,C ORA A JP GLI2 CMA INR A MOV C,A LXI D,GYMI GLI2: CMP B JNC GLI3 XCHG MOV C,B MOV B,A GLI3: MOV A,C STA EKS MOV A,B ADD A MOV B,A SUB C PUSH PSW SUB C MOV C,A GLI4: POP PSW PUSH H LXI H,GZEH XTHL CPI 001H JM GLI5 PUSH H ADD C JMP GLI6 GLI5: ADD B GLI6: PUSH D PUSH PSW LDA EKS DCR A STA EKS JNZ GLI4 POP PSW RET ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; - - - LIFE IN THE GRAY MODE - - - ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ORDINARY CYCLE FOR NEIGHBORS OF LEFT PIXEL OLEP: PUSH H PUSH H DAD D MOV A,M ADI 011H MOV M,A DCX H INR M POP H DCX H INR M DAD B INR M INX H MOV A,M ADI 011H MOV M,A POP H RET ; ORDINARY CYCLE FOR NEIGHBORS OF RIGHT PIXEL ORIP: PUSH H PUSH H DAD D MOV A,M ADI 011H MOV M,A INX H MOV A,M ADI 010H MOV M,A POP H INX H MOV A,M ADI 010H MOV M,A DAD B MOV A,M ADI 010H MOV M,A DCX H MOV A,M ADI 011H MOV M,A POP H RET ; COUNT NEIGHBORS OF ORDINARY CELLS ONEC: LXI B,RSIZ LXI D,-RSIZ LXI H,SORG+RSIZ ONE1: MOV A,M ANI 080H CNZ RNOM MOV A,M ANI 008H CNZ LNOM INX H MOV A,L CPI 0C0H JNZ ONE1 MOV A,H CPI HIGH(SORG+SSIZ)-1 JNZ ONE1 RET ; UPDATE TO NEXT GENERATION ONCE NEIGHBOR COUNT DONE NEXT: LXI D,SSIZ LXI H,SORG NEX1: MOV A,M ORA A JZ NEX8 MOV C,A ANI 077H MOV B,A MOV A,C ANI 088H MOV C,A RLC ADD B MOV B,A PUSH H LXI H,NEX4 XTHL MOV A,B ANI 0F0H CPI 020H JZ NEX2 CPI 030H JZ NEX3 XRA A RET NEX2: MOV A,C ANI 080H RET NEX3: MVI A,080H RET NEX4: PUSH PSW PUSH H LXI H,NEX7 XTHL MOV A,B ANI 00FH CPI 002H JZ NEX5 CPI 003H JZ NEX6 XRA A RET NEX5: MOV A,C ANI 008H RET NEX6: MVI A,008H RET NEX7: POP B ORA B MOV M,A NEX8: INX H DCR E JNZ NEX1 DCR D JNZ NEX1 RET ; CYCLE FOR LEFT PIXEL ON LEFT MARGIN LLEP: PUSH H PUSH H PUSH H DAD D MOV A,M ADI 011H MOV M,A MOV A,L ORI 03FH MOV L,A INR M POP H MOV A,L ORI 03FH MOV L,A INR M DAD B INR M POP H DAD B MOV A,M ADI 011H MOV M,A POP H RET ; CYCLE FOR RIGHT PIXEL ON RIGHT MARGIN RRIP: PUSH H PUSH H PUSH H DAD D MOV A,M ADI 011H MOV M,A MOV A,L ANI 0C0H MOV L,A MOV A,M ADI 010H MOV M,A POP H MOV A,L ANI 0C0H MOV L,A MOV A,M ADI 010H MOV M,A DAD B MOV A,M ADI 010H MOV M,A POP H DAD B MOV A,M ADI 011H MOV M,A POP H RET ; LEFT PIXEL: CHOOSE BETWEEN NORMAL OR MARGIN CYCLE RNOM: MOV A,L ANI 03FH JZ LLEP JMP OLEP ; RIGHT PIXEL: CHOSE NORMAL OR MARGIN CYCLE LNOM: MOV A,L ANI 03FH CPI 03FH JZ RRIP JMP ORIP ; COUNT NEIGHBORS ALONG TOP MARGIN NCTO: LXI B,RSIZ LXI D,SSIZ-RSIZ LXI H,SORG NCTI: MOV A,M ANI 080H CNZ RNOM MOV A,M ANI 008H CNZ LNOM INX H MOV A,L ANI 03FH JNZ NCTI RET ; COUNT NEIGHBORS ALONG BOTTOM MARGIN NCBO: LXI B,-SSIZ+RSIZ LXI D,-RSIZ LXI H,SORG+SSIZ-RSIZ JMP NCTI ; EXECUTE ONE CYCLE OF LIFE LIFE: CALL ONEC CALL NCTO CALL NCBO JMP NEXT END