;VB3 GRAPHICS ROUTINE. ;WRITTEN BY MALCOLM WRIGHT, 2-3-80 ;CONCEPTS FROM CAL OHME'S VB1B ROUTINE. ;ENTRY CONDITIONS ; H=VERTICAL COORDINATE ; L=HORIZONTAL COORDINATE ;EXIT CONDITIONS ; A=USED ; B=PRESERVED ; C=BIT MASK FOR DOT ; D&E=MEMORY ADDRESS OF DOT ; H=VERTICAL COORDINATE NORMALIZED ; L=HORIZONTAL COORDINATE NORMALIZED ;SET UP FOR 80 CHARACTERS ACROSS TIMES 2. ;SET FOR "NROW" OF ROWS DOWN. CHECK: CALL CNVRT ;ZERO FLAG=1 IF WHITE ;ZERO FLAG=0 IF BLACK ANA C RET WHITE: CALL CNVRT ;CHANGE TO WHITE ORA C ;ADD DOT STAX D RET BLACK: CALL CNVRT ;CHANGE TO BLACK ORA C ;ADD DOT XRA C ;MAKE BLACK STAX D RET ;CONVERT H&L AS Y&X POSITIONS INTO ACTUAL MEMORY ADDRESS. CNVRT: PUSH B ;SAVE B&C ;NORMALIZE X-AXIS MOV A,L CPI 0FFH ;BELOW LIMIT, NEG. JNZ X1 MVI A,(80*2)-1 ;RESET TO RIGHT SIDE X1: CPI 80*2 ;ABOVE UPPER LIMIT JC X2 XRA A ;RESET TO LEFT SIDE X2: MOV L,A ;MORMALIZE Y-AXIS MOV A,H CPI 0FFH ;BELOW LIMIT, NEG. JNZ Y1 MVI A,(NROW*4)-1 ;RESET TO TOP Y1: CPI NROW*4 ;ABOVE UPPER LIMIT JC Y2 XRA A ;RESET TO BOTTOM Y2: MOV H,A ;REVERSE(FLIP-OVER) Y-AXIS PUSH H ;SAVE H&L NORMALIZED MOV C,A MVI A,(NROW*4)-1 SUB C ;FLIP OVER ;FIND ACTUAL DELTA HEIGHT MVI C,0 ;CLEAR MASK INDEX ORA A ;CLEAR CARRY RAR ;DIVIDE BY 2 MOV B,A ;SAVE QUOTIENT MOV A,C RAL ;UPDATE INDEX MOV C,A MOV A,B ;GET QUOTIENT ORA A ;CLEAR CARRY RAR ;DIVIDE BY 2 MOV E,A ;SAVE DELTA HEIGHT MOV A,C RAL ;UPDATE INDEX MOV C,A ;SAVE MASK INDEX(REMAINDER) ;COMPUTE VERTICAL ROW TIMES 80 MVI D,0 MOV L,E ;L = QUOTIENT MOV H,D DAD H ;X2 DAD H ;X4 DAD D ;X5 DAD H ;X10 DAD H ;X20 DAD H ;X40 DAD H ;X80 XCHG ;SAVE 80*NROW POP H ;FIND ACTUAL WIDTH DELTA PUSH H ORA A ;CLEAR CARRY MOV A,L ;X-AXIS RAR ;DIVIDE BY 2 MOV L,A MOV A,C RAL ;UPDATE MASK INDEX MOV C,A ;CREATE ACTUAL MEMORY ADDRESS FOR PIXEL MVI H,0 ;H&L= WIDTH DAD D ;ADD TO HEIGHT FOR OFFSET LXI D,VID ;GET VB3 ADDRESS DAD D ;OFFSET+BASE ADDRESS XCHG ;D&E= ACTUAL MEMORY ADDR. ;GET BIT MASK MVI B,0 ;B&C= MASK INDEX LXI H,BTBL ;START OF MASK TABLE DAD B ;ADD INDEX MOV A,M ;GET MASK ;RETURN AND GET VB3 BYTE POP H POP B MOV C,A ;C=MASK LDAX D RET ;MASK BIT TABLE(2 X 4) BTBL: DB 80H DB 8 DB 20H DB 2 DB 40H DB 4 DB 10H DB 1