; ; DISPLAY PROCESSOR MODULE ; ; INITIALIZATION ; STACK EQU 0FFH ;STACK ADDR CINTC EQU 0FFFBH ;RTC CONTROL ADDR GSTRT EQU 100H ;START ADDR KINTC EQU 0FFC0H ;KBRD INT CONTROL ADDR TIME EQU 3FH ;SYSTEM TIME TOP EQU 40H ;DISPLAY FILE START ADDR XYOUT EQU 0FFFCH ;CRT OUTPUT ADDR ; ORG GSTRT INIT: LXI D,0 ;ZERO XY (IN DE ALWAYS) LXI H,TABLE SHLD INCPT ;INIT INCR PTR LXI SP,STACK ;INIT STACK PTR MVI A,10H STA KINTC ;TURN ON KB INT MVI A,80H STA CINTC ;TURN ON RTC INT EI LHLD TOP SHLD PNTR ;INIT INSTRUCTION PTR ; ; OPCODE DECODING ; MLOOP: LHLD PNTR ;ADDR OF OPCODE MOV C,M MVI B,0 ;OPCODE IN BC LXI H,JMTAB ;BASE OF JUMP TABLE DAD B ;ADD OPCODE MOV C,M INX H MOV H,M MOV L,C ;ADDR OF ROUTINE IN HL PCHL ;JUMP TO IT ; ; JUMP TABLE FOR OPCODE PROCESSING ; JMTAB: DW MBEAM ;0 DW MDISP ;2 DW LVEC ;4 DW SVEC ;6 DW PARAM ;8 DW JUMP ;A DW JUMPS ;C DW RETS ;E DW EXEC ;10H DW SYNC ;12H ; ; MOVE BEAM - DON'T DIPLAY POINT ; MBEAM: LHLD PNTR INX H MOV D,M ;GET X COORD INX H MOV E,M ;GET Y COORD INX H SHLD PNTR ;RESTORE PTR JMP MLOOP ;GET ANOTHER INSTRUCTION ; ; MOVE BEAM AND DISPLAY POINT ; MDISP: LHLD PNTR INX H MOV D,M INX H MOV E,M INX H SHLD PNTR XCHG ;XY TO HL SHLD XYOUT ;WRITE TO CRT XCHG ;XY TO DE JMP MLOOP ; ; SET ORIENTATION AND SCALE ; PARAM: LHLD PNTR INX H MOV C,M INX H SHLD PNTR MOV L,C ;NEW ORIENT & SCALE IN HL MVI H,0 LXI B,TABLE ;ADDR OF INCR TABLE DAD B ;ADD ORIENT & SCALE SHLD INCPT ;STORE IN INCR PTR JMP MLOOP ;GET ANOTHER INSTRUCTION ; ; JUMP TO A NEW LOCATION IN DISPLAY FILE ; JUMP: LHLD PNTR INX H MOV A,M ;LSB OF ADDR INX H MOV H,M ;MSB OF ADDR MOV L,A SHLD PNTR ;STORE IN INSTRUCTION PTR JMP MLOOP ; ; JUMP TO SUBROUTINE ; JUMPS: LHLD PNTR INX H MOV C,M INX H MOV B,M ;NEW ADDR IN BC INX H PUSH H ;STORE OLD PTR ON STACK MOV H,B MOV L,C SHLD PNTR ;ADDR IN INSTRUCTION PTR JMP MLOOP ; ; RETURN FROM SUBROUTINE ; RETS: POP H ;RESTORE PTR FROM STACK SHLD PNTR JMP MLOOP ; ; SHORT VECTOR MODE ; SVEC: LHLD PNTR ;CURRENT INSTR INDEX INX H NEXT: MOV B,M ;SHORT VECTOR INSTRUCTION INX H SHLD PNTR ;RESTORE PTR MOV A,B ANI 7H ;MASK DIRECTION BITS MOV C,A ;OFFSET IN C MOV A,B ;ORIG INSTR IN A MVI B,0 ;ZERO IN B LHLD INCPT ;INCR PTR DAD B ;ADD DIRECTION OFFSET MOV B,M ;X INCREMENT INX H INX H MOV C,M ;Y INCREMENT XCHG ;XY IN HL MOV E,A ;ORIGINAL INSTR ANI 70H ;LENGTH BITS RRC RRC RRC RRC ;SHIFT RIGHT 4 MOV D,A ;IN D MOV A,E ;ORIGINAL INSTR ANI 8H ;ON/OFF BIT JNZ FLOOP ;JUMP IF "OFF" SHLD XYOUT ;INITIAL DOT TO CRT NLOOP: MOV A,B ;X INCREMENT ADD H MOV H,A MOV A,C ADD L MOV L,A ;NEW XY IN HL SHLD XYOUT ;WRITE TO CRT DCR D JNZ NLOOP ;LOOP IF NOT DONE JMP CKESC ;CHECK "ESCAPE" FLOOP: MOV A,B ;X INCREMENT ADD H ;ADD TO X MOV H,A MOV A,C ;Y INCREMENT ADD L MOV L,A ;NEW XY IN HL DCR D JNZ FLOOP ;LOOP IF NOT DONE CKESC: MOV A,E ;ORIGINAL INSTR XCHG ;XY TO DE RLC ;SET CARRY IF "ESCAPE" JC MLOOP ;MAIN LOOP IF SO LHLD PNTR JMP NEXT ;GET MORE DATA IF NOT ; ; LONG VECTOR MODE ; LVEC: LHLD PNTR INX H MOV B,M ;NEW X POS INX H MOV A,M ;NEW Y POS INX H SHLD PNTR ; MVI C,0F8H ;SPECIAL MASK FOR - SUB E ;DEL Y IN A JC PLUSY ;TEST SIGN OF DEL MVI C,0 ;SPECIAL MASK FOR + PLUSY: RLC RLC RLC ;DIVIDE BY 32 MOV H,A ;SAVE IN H ANI 0F8H ;SAVE 1ST 5 BITS MOV L,A ;L.O. Y INC MOV A,H ;RESTORE ANI 7 ;SAVE LAST 3 BITS XRA C ;XOR SPECIAL MASK MOV H,A ;H.O. Y INC SHLD YINC ;STORE ; MOV A,B ;X POS MVI C,0F8H SUB D ;DEL X IN A JC PLUSX MVI C,0 PLUSX: RLC RLC RLC MOV H,A ANI 0F8H MOV L,A ;L.O. X INCR MOV A,H ANI 7 XRA C MOV H,A ;H.O. X INCR SHLD XINC ; MOV B,D ;X IN BC (H.O.) MVI C,0 MOV D,E ;Y IN DE (H.O.) MVI E,0 MVI A,20H ;32 POINTS IN VECT ; LLOOP: LHLD YINC DAD D XCHG ;NEW Y IN DE LHLD XINC DAD B MOV B,H ;NEW X IN BC MOV C,L MOV L,D ;XY IN HL (H.O.) SHLD XYOUT ;WRITE TO CRT DCR A JNZ LLOOP ; XCHG ;RESTORE XY TO DE JMP MLOOP ; ; TRANSFER CONTROL TO EXECUTIVE ; EXEC: LHLD PNTR ;BUMP PTR INX H SHLD PNTR MVI H,80H ;BEAM TO SCREEN CENTER MVI L,80H SHLD XYOUT RST 3 ;XFER TO LOC 18H JMP MLOOP ;NEXT INSTRUCTION ; ; SYNCHRONIZE WITH REAL-TIME CLOCK ; SYNC: LHLD PNTR ;BUMP PTR INX H SHLD PNTR MVI H,80H ;BEAM TO SCREEN CENTER MVI L,80H SHLD XYOUT LXI H,TIME MOV A,M ;OLD TIME IN A SLOOP: CMP M ;OLD=NEW? JZ SLOOP ;YES - KEEP TRYING JMP MLOOP ;NO - NEXT INSTR ; ; TABLE FOR VECTOR ORIENTATION AND SCALING ; TABLE: DB 0 DB 2 DB 2 DB 2 DB 0 DB -2 DB -2 DB -2 DB 0 DB 2 DB 2 DB 2 DB 0 DB -2 DB -2 DB -2 DB 0 DB 3 DB 3 DB 3 DB 0 DB -3 DB -3 DB -3 DB 0 DB 3 DB 3 DB 3 DB 0 DB -3 DB -3 DB -3 DB 0 DB 4 DB 4 DB 4 DB 0 DB -4 DB -4 DB -4 DB 0 DB 4 DB 4 DB 4 DB 0 DB -4 DB -4 DB -4 DB 0 ; ; THE FOLLOWING ARE STORAGE CELLS NOT TO BE IN PROM ; WORKING STORAGE ; PNTR: DW 0 ;PTR TO NEXT INSTR XINC: DW 0 ;LVEC ONLY YINC: DW 0 ;LVEC ONLY INCPT: DW 0 ;PTR TO INCREMENT IN TABLE END