AIST2 IDENT AIST2 *WIDTH 62 ORG 0040H OFFSET EQU *-40H SPACE 15 * ASCII IST2 CONTROLWARE SPACE 2 * VERSION 00 SPACE 4 * COPYRIGHT CONTROL DATA CORPORATION 1979 * FOR INTERNAL USE ONLY * NOT A RELEASED PRODUCT EJECT SPACE 2 * * INPUT FUNCTION CODES * MNTSW EQU 00 MAINTAINENCE SWITCHES KBDATA EQU 01 KEY BOARD DATA TPDATA EQU 02 TOUCH PANEL DATA IDLO EQU 03 ID CODE, LOWER 8 BITS IDUP EQU 04 ID CODE, UPPER 8 BITS EXTDATI EQU 05 INPUT EXTERNAL DEVICE DATA EXTSTAT EQU 06 INPUT EXTERNAL DEVICE STATUS SYSSTAT EQU 07 TERMINAL INTERNAL STATUS CLADATA EQU 08 COMMUNICATIONS LINE DATA * * OUTPUT FUNCTION CODES * PNLLTS EQU 00 MAINTENANCE PANEL LIGHTS CLAL EQU 01 OUTPUT LOWER DATA BITS CLAU EQU 02 OUTPUT UPPER DATA BITS BLKERS EQU 03 DISPLAY BULK ERASE INTMSK EQU 04 SYSTEM INTERRUPT MASK MISCTL EQU 05 MISCELLANEOUS CONTROL EXTDATO EQU 06 OUTPUT EXTERNAL DATA EXTCNTO EQU 07 OUTPUT EXTERNAL CONTROL * EJECT EXTERNAL EQUATES SPACE 5 * USER JUMP TABLE ADDRESSES SPACE 2 FWA1 EQU * START OF FIRST CHECKSUM AREA R.INIT JP INIT R.DOT JP POINT R.LINE JP LINE R.CHARS JP CHARS R.BLOCK JP BLOCK R.INPX JP INPX R.INPY JP INPY R.OUTX JP OUTX R.OUTY JP OUTY R.XMIT JP TX.STOR R.MODE JP MODESET R.STEPX JP STEPX R.STEPY JP STEPY R.WE JP WE R.DIR JP DIR R.INPUT JP INPUT R.SSF JP SSF0 R.CCR JP CCR R.EXTOUT JP EXTX R.EXEC JP EXEC R.GJOB JP GJOB R.XJOB JP XJOB R.RETURN JP RETURN R.CHRCV JP CONVERT EJECT ORG 00F0H+OFFSET CKSMTBST EQU * DEFW FWA1 ENTRY POINTS AND CKSM TABLE DEFW LENGTH1 DEFW FWA2 COMMON RESIDENT CODE DEFW LENGTH2 DEFW FWA3 401X UNIQUE CODE DEFW LENGTH3 DEFW 0 END OF TABLE DEFW 0 (LENGTH = 0) LENGTH1 EQU *-FWA1 END OF FIRST CHECKSUM AREA * * INTERRUPT VECTOR TABLE * LOWER 8 BITS OF INTERRUPT VECTOR FIXED AT 00 * UPPER 8 BITS INITIALIZED IN PROGRAM TO (100H+OFFSET)/100H. * ORG 0100H+OFFSET SERCHAN DEFS 2 SERIAL CHANNEL CLACRDY DEFS 2 CLA CHAR READY CLACREQ DEFS 2 CLA CHARACTER REQUEST KYBRD DEFS 2 KEYBOARD DATA THPNL DEFS 2 TOUCH PANEL SINTERV DEFS 2 SHORT INTERVAL EXTCH DEFS 2 EXTERNAL CHANNEL LINTERV DEFS 2 LONG INTERVAL FWA2 EQU * START OF SECOND CHECKSUM AREA EJECT TERMINAL INITIALIZATION * * * * * * * * * * * * * * * * * * * * * * * TERMINAL INITIALIZATION * * * * * * * * * * * * * * * * * * * * * * * ASCII 401X AND PLATO INITIALIZE INIT EQU * DI DISABLE INTERRUPTS LD A,0DFH CLEAR TEST MODE, ENABLE RAM OUT (PNLLTS),A SET DTR, CLEAR ERR LIGHT LD SP,ZSTACK SET STACK POINTER LD HL,CKSMTBST PRESET CHECKSUM TABLE LD (CKSUMTBL),HL ADDRESS LD A,(RESETFLG) IS THIS A SIMPLE RESET XOR 3CH JR NZ,INIT1 JUMP IF NO * INITIALIZE AFTER SIMPLE RESET IN A,(EXTSTAT) IS CARRIER ON BIT 4,A JR NZ,INIT1 JUMP IF NO (DO FULL INIT) LD A,(MODE) ARE WE IN PLATO MODE RLCA JR NC,INIT0 JUMP IF ASCII MODE CALL SENDNAK PLATO, SO SEND NAK SEQUENCE LD HL,0382H SEND RESET STATUS TO PLATO CALL R.XMIT INIT0 EQU * CALL INIT3 INIT INTS AND CHECKSUM JP IDLE * INITIALIZE AFTER LOAD INIT1 EQU * XOR A SET ASCII MODE LD (MODE),A LD A,3CH SET SIMPLE RESET FLAG LD (RESETFLG),A LD A,01 SOUND BEEPER OUT (MISCTL),A LD HL,BEGVAR1 CLEAR VARIABLE SCRATCH AREA LD (HL),0 LD DE,BEGVAR1+1 LD BC,ENDVAR1-BEGVAR1-1 LDIR LD HL,BEGVAR2 LD (HL),0 LD DE,BEGVAR2+1 LD BC,ENDVAR2-BEGVAR2-1 LDIR LD HL,SERCHN LOAD INTERRUPT VECTORS LD (SERCHAN),HL LD HL,KYBD LD (KYBRD),HL LD HL,TP LD (THPNL),HL LD HL,EXTI LD (EXTCH),HL LD HL,LINT LD (LINTERV),HL LD HL,EXTI0 LD (M.EXTPA),HL CALL INIT3 INIT INTS AND CHECKSUM CALL AINIT ASCII INIT LD A,(VERSION) SET CONTROLWARE VERSION LD (M.VERS),A LD HL,0000H SELECT M0/FWD/SIZE 1/HOR PLOT CALL R.CCR AND CLEAR UNCOVER FLAG LD HL,M.TYPE SET TERMINAL TYPE IN A,(MNTSW) GET SWITCHES 6(TP PRESENT) LD B,A AND 5(32K) AND PUT INTO AND 60H BITS 5 AND 4 OF M.TYPE RRCA OR 07H SET ASCII TERMINAL TYPE LD (HL),A IN BITS 3..0 LD A,B GET SWITCHES AGAIN AND 03H GET KB/TP AND TEST BITS CP 02H IF NO TEST BUT KB/TP JR NZ,INIT2 SET 6,(HL) SET EXPERIMENTAL BIT LD HL,16 AND DISPLAY CALL R.OUTY .EXPERIMENTAL VERSION NN. LD HL,160 MESSAGE CALL R.OUTX LD HL,EXP CALL R.CHARS INIT2 EQU * LD HL,0 DISPLAY CALL R.OUTY .TERMINAL READY. LD HL,184 MESSAGE CALL R.OUTX LD HL,TRMRDY CALL R.CHARS LD HL,VER DISPLAY VERSION NO. CALL R.CHARS CALL AFF.1 HOME CURSOR JP IDLE INIT3 EQU * LD HL,100H+OFFSET SET INT. TABLE ADDRESS LD A,H (UPPER BITS) LD I,A INTO INT. VECTOR IM 2 SET FOR MODE 2 INTERRUPTS LD HL,0445H ENABLE KEYBOARD, LONG INTERVAL CALL R.SSF AND SERIAL CHANNEL INTERRUPTS. LD A,(SC.OC) ENABLE CHAR READY INTERRUPT. OUT (EXTCNTO),A CALL CHKSUM.I INITIALIZE MEMORY CHECKSUM EI RET EJECT ********** * PLATO INITIALIZE ********** PINIT EQU * LD A,80H SET PLATO OPERATIONS LD (MODE),A XOR A SET (M.KSW) TO PUT INPUT DATA LD (M.KSW),A INTO THE TRANSMIT BUFFER LD HL,ISTASC SELECT PLATO/ASCII KEYBOARD LD (KBAADR),HL LD HL,CTLADR.P SELECT PLATO CTL TBL LD (CTLADR),HL LD HL,ESCADR.P SELECT PLATO ESC SEQ TBL LD (ESCADR),HL LD HL,00 NO GRAPH MODE SCREEN BIAS LD (BIAS),HL LD A,01 DO NOT SCALE LD (SCALEFG),A LD (BYPASS),A SET BYPASS LD HL,232 CALL R.OUTX POSITION AT 232,32 LD HL,32 CALL R.OUTY LD L,00 SET HOR/MEM0/SIZE1/FWD CALL R.CCR LD L,1AH SET ALPHA/REWRITE MODE CALL R.MODE LD HL,MSG DISPLAY PLATO MESSAGE CALL R.CHARS LD A,01 SET ERROR PROTOCOL TO STATE 0 LD (EREG),A LD A,20 INIT WORD COUNTER LD (E.CNTR),A LD C,06H SEND ACK CALL XMIT.1 LD C,0+20H SEND 0 (WORD COUNT) CALL XMIT.1 RET *PLATO MESSAGE MSG EQU * HEX 50,4C,41,54,4F,3F,00 *EXPERIMENTAL VERSION XX MESSAGE EXP EQU * HEX 45,18,10,05 HEX 12,09,0D,05 HEX 0E,14,01,0C HEX 2D,56,05,12 HEX 13,09,0F,0E HEX 2D,1B,1B 00(CHANGES WITH EACH ASSEMBLY) HEX 3F,00 *TERMINAL READY MESSAGE TRMRDY EQU * HEX 54,05,12,0D HEX 09,0E,01,0C HEX 2D,52,05,01 HEX 04,19,3F,00 *VERSION (CHANGE WITH NEW PRODUCTION BINARY) VER EQU * HEX 2D,1B,1B 00 HEX 3F,00 * BLOCK FAILURE MESSAGE BLKFAIL EQU * HEX 42,0C,0F,03,0B,2D HEX 46,01,09,0C,15,12,05,3F,00 VERSION DEFB 00 00 EJECT * * * * * * * * * * * * * * * * * * * * * * LONG INTERVAL INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * LINT EQU * PUSH AF PUSH BC PUSH DE PUSH HL LD A,(M.ENAB) CLEAR LONG INTERVAL INT. LD B,A RES 2,A OUT (INTMSK),A LD A,B REENABLE LONG INTERVAL INT. OUT (INTMSK),A LD HL,LINT.CTR INCREMENT LONG INT. CNTR. INC (HL) LD A,(HL) CP 21 HAVE 21 COUNTS GONE BY JP NZ,R.RETURN NO, JUST EXIT LD (HL),0 YES, RESET CNTR. LD HL,(M.CLOCK) AND INCREMENT (M.CLOCK) INC HL LD (M.CLOCK),HL JP R.RETURN EJECT EJECT * * * * * * * * * * * * * * * * * * * * * * SERIAL CHANNEL INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * SERCHN EQU * PUSH AF PUSH BC PUSH DE PUSH HL IN A,(EXTSTAT) INPUT SERIAL CHAN STATUS RRA TEST FOR INTERRUPT PENDING JP NC,R.RETURN NONE, RETURN TO PROCESSING RRA TEST FOR CHAR RDY RRA JR NC,SERCHN1 NOT RDY, SERCHN1 *CHARACTER READY IN A,(EXTDATI) INPUT DATA LD C,A LD A,(MODE) IF PLATO OPERATIONS THEN RLCA JR NC,SERCHN0 CALL ERRCHK CALL PLATO ERROR PROTOCOL JP C,R.RETURN EXIT IF CHAR TO BE IGNORED SERCHN0 EQU * RES 7,C MASK TO 7 BITS LD HL,RXBUF RECEIVE BUFFER ADDRESS LD A,0FFH LOAD MASK FOR INDEX CP (HL) TEST FOR FULL BUFF JP Z,R.RETURN FULL,RETURN INC (HL) INCREMENT DIFF COUNT INC HL STEP TO INPUT INDEX AND (HL) INDEX TO REG A INC (HL) INCREMENT INPUT INDEX INC HL STEP TO START OF INC HL STORE AREA LD E,A ADD INDEX LD D,00 ADD HL,DE LD (HL),C STORE DATA LD HL,M.JOBS INCREMENT (M.JOBS) INC (HL) JP R.RETURN SERCHN1 EQU * RLA TEST FOR CHAR REQ JP NC,R.RETURN NO CHAR REQ, RETURN *CHARACTER REQUEST IN A,(EXTSTAT) CHECK FOR CLEAR TO SEND BIT 5,A JR Z,SERCHN2 JUST EXIT IF CTS OFF LD HL,TXBUF LOAD ADDRESS OF TRANSMIT BUFF XOR A TEST FOR EMPTY OR (HL) BUFFER JR Z,SERCHN2 NO DATA, SERCHN2 DEC (HL) DECREMENT DIFFERENCE COUNT INC HL STEP TO INC HL OUT INDEX LD A,07 LOAD MASK FOR INDEX AND (HL) GET INDEX INC (HL) INCREMENT INDEX INC HL STEP TO STORE AREA LD E,A ADD INDEX TO LD D,00 START OF STORE AREA ADD HL,DE LD A,(HL) LOAD DATA TO TRANSMIT OUT (EXTDATO),A OUTPUT DATA SERCHN2 EQU * LD A,(SC.OC) TURN OFF CHAR REQ INT OUT (EXTCNTO),A JP R.RETURN RETURN TO PROCESSING EJECT * * * * * * * * * * * * * * * * * * * * * * * KEY BOARD INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * * SPACE 1 KYBD EQU * PUSH AF PUSH BC PUSH DE PUSH HL SPACE 1 IN A,(KBDATA) INPUT KEY BOARD DATA AND 7FH MASK FOR DATA BITS LD L,A LOAD KEYBOARD DATA LD H,40H OP CODE AND CATAGORY CALL FIFO.ST AND STORE FOR TRANSMIT JR RETURN SPACE 4 * * * * * * * * * * * * * * * * * * * * * * * TOUCH PANEL INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * * SPACE 1 TP EQU * PUSH AF PUSH BC PUSH DE PUSH HL SPACE 1 IN A,(TPDATA) INPUT TOUCH PANEL DATA LD L,A LOAD TOUCH PANEL DATA LD H,41H OP CODE AND CATAGORY CALL FIFO.ST AND STORE FOR TRANSMIT LD A,01 OUT (MISCTL),A JR RETURN RETURN TO INTERRUPTED PROCES EJECT EXTERNAL INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * * * EXTERNAL CHANNEL INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * * SPACE 1 EXTI EQU * PUSH AF PUSH BC PUSH DE PUSH HL * LD HL,(M.EXTPA) LOAD PROCESSOR ADDR. JP (HL) * EXTI0 EQU * LD A,(EXT.IN) LOAD EXTERNAL DEVICE ADDRESS LD C,A AND 1CH TEST FOR SERIAL OR PARALLEL LD A,C JR Z,EXTI1 ADD A,1DH ADD BITS FOR PARALLEL * EXTI1 EQU * ADD A,03 LD C,A IN L,(C) INPUT FROM EXTERNAL CHANNEL LD H,82H LOAD OP CODE AND USER/PLATO CALL FIFO.ST AND STORE FOR TRANSMIT SPACE 4 * * * * * * * * * * * * * * * * * * * * * * * RESTORE ALL REGISTERS AND ENABLE INTERRUPTS * * * * * * * * * * * * * * * * * * * * * * SPACE 1 RETURN EQU * POP HL POP DE POP BC POP AF EI ENABLE SYSTEM INTERRUPTS RET EJECT * * * * * * * * * * * * * * * * * * * * * * STORE DATA FROM INPUT DEVICES (KEYBOARD, TOUCH * PANEL OR EXTERNAL DEVICE) INTO EITHER THE TRANSMIT * BUFFER OR THE USER BUFFER DEPENDING ON (M.KSW) * * ON ENTRY, DATA IS IN HL * H7=1 FOR CATEGORY 2 DATA (EXT) * H6=1 FOR CATEGORY 1 DATA (KB OR TP) * * * * * * * * * * * * * * * * * * * * * FIFO.ST EQU * LD A,0C0H GET CATEGORY BITS AND H RLCA PUT CATEGORY BITS IN LOWER RLCA BITS LD B,A AND SAVE IN B REGISTER LD A,(M.KSW) CHECK FOR TRANSMIT/USER AND B JP Z,R.XMIT US.STOR EQU * LD E,L DE = HL WITH UPPER BITS CLEAR LD A,H AND 03H LD D,A LD HL,USBUF LD A,07H TEST FOR FULL BUFFER CP (HL) RET Z BUFFER FULL, RETURN TO CALLER INC (HL) NOT FULL, INCREMENT DIFF CNTR INC HL POINT TO INPUT POINTER AND (HL) GET LOWER BITS RLCA AND SET FOR TWO BYTE ADDRESS INC (HL) INCREMENT POINTER LD B,0 PUT INDEX IN BC LD C,A INC HL POINT TO START OF BUFFER AREA INC HL ADD HL,BC INDEX INTO BUFFER LD (HL),E STORE DATA LOWER BITS INC HL LD (HL),D STORE DATA UPPER BITS RET EJECT * * * * * * * * * * * * * * * * * * * * * * MAIN IDLE LOOP * * * * * * * * * * * * * * * * * * * * * IDLE EQU * CALL CHKSUM CHECKSUM MEMORY DURING IDLE JR NZ,BLOCKF JUMP IF BAD CHECKSUM LD A,(MODE) TEST FOR OPERATING MODE RLCA JP NC,AIDLE ASCII IDLE IF BIT 7 CLEAR ********** * PLATO OPERATIONS IDLE LOOP ********** PIDLE EQU * LD A,(EREG) CHECK TIME OUT AND 04 IF COMM ERROR STATE CALL NZ,TIMOUT CALL R.EXEC TEST FOR RECEIVE OR XMIT DATA JR IDLE LOOP TO IDLE ********** * PLATO COMMUNICATIONS ERROR STATE TIME OUT ********** TIMOUT EQU * LD A,(CLK.1) HAS TIME OUT EXPIRED ADD A,1 LD (CLK.1),A RET NC LD A,(CLK.2) INC A LD (CLK.2),A SUB 20H RET NZ NO, EXIT XOR A YES, RESET TIME OUT LD (CLK.1),A LD (CLK.2),A LD C,95H SEND NAK CALL XMIT.1 LD A,(MREG) SEND WC+20H ADD A,20H LD C,A CALL XMIT.1 RET ********** * DISPLAY .BLOCK FAILURE. MESSAGE * TERMINAL MUST BE RESET TO RECOVER ********** BLOCKF EQU * LD HL,400 CALL R.OUTX LD HL,256 CALL R.OUTY LD HL,BLKFAIL CALL R.CHARS BLOCKF1 JR BLOCKF1 HANG EJECT ********** * EXECUTE RECEIVE AND TRANSMIT DATA UNTIL RECEIVE BUFFER * IS EMPTY. ********** EXEC EQU * LD A,(LOC.RMT) CHECK FOR LOCAL OR A JR NZ,EXEC1 JUMP IF YES IN A,(EXTSTAT) CHECK FOR CARRIER BIT 4,A JR Z,EXEC1 JUMP IF ON LD A,0DEH SET ERROR LIGHT OUT (PNLLTS),A EXEC1 EQU * LD A,(M.JOBS) TEST FOR RECEIVE DATA OR A CALL NZ,PROCESS LD A,(TXBUF) TEST FOR TRANSMIT DATA OR A JR Z,EXEC2 NO DATA, JUMP IN A,(EXTSTAT) TEST FOR CHAR REQ BIT 1,A JR Z,EXEC2 JUMP IF OFF LD A,(SC.OC) ENEBLE CHAR REQ INT INC A OUT (EXTCNTO),A EXEC2 EQU * LD A,(M.JOBS) CHECK FOR RECEIVE DATA AGAIN OR A JR NZ,EXEC LOOP IF MORE RET ********** * FETCH A BYTE FROM THE RECEIVE BUFFER. * ON EXIT, THE BYTE IS IN THE C-REGISTER. ********** GJOB EQU * LD HL,M.JOBS DECREMENT (M.JOBS) DEC (HL) LD HL,RXBUF DEC (HL) DECREMENT DIFF COUNT INC HL STEP TO OUT INC HL LD A,0FFH MASK OUT INDEX WITH BUFF LEN AND (HL) DATA IN A REG INC (HL) INCREMENT OUT INDEX INC HL BEGIN OF DATA STORE LD E,A LD D,00 ADD HL,DE LD C,(HL) DATA TO C REGISTER RET EJECT ********** * PROCESS A CHARACTER TAKEN FROM RECEIVE BUFFER ********** PROCESS EQU * CALL R.GJOB GET NEXT CHAR ********** * EXECUTE CHARACTER IN THE C-REGISTER ********** XJOB EQU * CALL ESCCTL CHECK FOR ESC SEQ OR CTL CODE RET C EXIT IF YES LD A,(CMODE) TEST FOR COMMAND MODE ACTIVE OR A JR Z,XJOB.DAT JUMP IF NOT XJOB.CMD EQU * LD HL,SELECT.C-2 SELECT COMMAND TABLE JR XJOB1 AND JUMP VIA (CMODE) XJOB.DAT EQU * LD A,(BYPASS) CHECK BYPASS OR A RET NZ IGNORE DATA IF BYPASS ON LD A,(MODE) JUMP VIA (MODE) ADD A,A LD HL,SELECT.D SELECT DATA TABLE XJOB1 EQU * LD E,A INDEX INTO SELECTED TABLE LD D,0 ADD HL,DE SELECT.C OR SELECT.D LD E,(HL) GET JUMP ADDRESS INC HL LD D,(HL) EX DE,HL JMPHL EQU * JP (HL) JUMP VIA HL SELECT.C EQU * COMMAND JUMP TABLE DEFW LDC DEFW SSF DEFW LDE DEFW LDA DEFW EXT SELECT.D EQU * DATA JUMP TABLE DEFW APOINT MODE 0 DEFW GRAPH MODE 1 DEFW MEMORY MODE 2 DEFW CHARACT MODE 3 DEFW ABLOCK MODE 4 DEFW MODE5 MODE 5 DEFW MODE6 MODE 6 DEFW MODE7 MODE 7 DEFW TEMP MODE 8 EJECT * * * * * * * * * * * * * * * * * * * * * CHECK FOR AND EXECUTE ESCAPE SEQUENCES OR CONTROL CODES. * ON ENTRY, THE CHARACTER TO BE EXECUTED IS IN THE C-REG. * ON EXIT, CARRY IS SET IF CHARACTER WAS A CONTROL CODE * OR THE SECOND CHARACTER OF AN ESCAPE SEQUENCE. * OTHERWISE CARRY IS CLEAR ON EXIT. * * * * * * * * * * * * * * * * * * * * ESCCTL EQU * LD A,(G.ESC) TEST FOR ESCAPE FLAG SET OR A JR Z,CTLCK JUMP IF NOT SET XOR A CLEAR FLAG LD (G.ESC),A EX.ESC EQU * LD HL,(ESCADR) SEARCH FOR ESC SEQ MATCH JR CTLEXEC CTLCK EQU * LD A,C TEST FOR CONTROL CODE CP 20H RET NC NOT A CTL CODE, RETURN XOR A LD (CMODE),A CLEAR COMMAND MODE LD (NBYTES),A CLEAR NBYTES COUNTER EX.CTL EQU * LD HL,(CTLADR) SEARCH FOR CONTROL CODE MATCH CTLEXEC EQU * CALL SEARCH EXECUTE CHAR SCF SET CARRY FLAG RET * SEARCH EQU * LD A,(HL) IF FF REACHED, NO MATCH CP 0FFH RET Z IGNORE CHAR IF NOT FOUND SEARCH1 EQU * CP C JR Z,MATCH CHECK FOR CHAR MATCH INC HL CONTINUE SEARCHING INC HL INC HL JR SEARCH MATCH EQU * CP 0DH IS CHAR A CR JR NZ,MATCH1 NO, JUMP LD (CRLFFG),A YES, SET SCROLL FLAG JR MATCH2 MATCH1 EQU * CP 0AH IS CHAR A LF JR Z,MATCH2 YES, JUMP CALL SCROLLCL NO, CLEAR SCROLL FLAG MATCH2 EQU * INC HL LD E,(HL) INC HL MATCH, JUMP TO BUILD COMMAND LD D,(HL) EX DE,HL LD DE,M.CCR JP (HL) * SCROLLCL EQU * XOR A CLEAR SCROLL FLAG LD (CRLFFG),A RET EJECT ********** * CONVERT KEYBOARD CODE IN E REG TO ASCII CODE IN C REG. * ON EXIT, THE ZERO FLAG IS SET IF THE KEY IS UNDEFINED. * FOR DEFINED KEYS, THE ZERO FLAG IS CLEAR. ********** KBCON EQU * LD D,00 LD HL,(KBAADR) ADD HL,DE LD A,(HL) LD C,A CP 0FFH RET * ISTASC EQU * HEX 30,31,32,33 0X HEX 34,35,36,37 HEX 38,39,26,60 HEX 0A,5E,2B,2D HEX 13,04,07,08 1X HEX 7B,0B,0D,1A HEX 02,12,01,03 HEX 7D,0C,FF,FF HEX 3C,3E,5B,5D 2X HEX 24,25,5F,7C HEX 2A,28,40,27 HEX 1C,5C,23,7E HEX 17,05,14,19 3X HEX 7F,09,1E,18 HEX 0E,1D,11,16 HEX 00,0F,FF,FF HEX 20,61,62,63 4X HEX 64,65,66,67 HEX 68,69,6A,6B HEX 6C,6D,6E,6F HEX 70,71,72,73 5X HEX 74,75,76,77 HEX 78,79,7A,3D HEX 3B,2F,2E,2C HEX 1F,41,42,43 6X HEX 44,45,46,47 HEX 48,49,4A,4B HEX 4C,4D,4E,4F HEX 50,51,52,53 7X HEX 54,55,56,57 HEX 58,59,5A,29 HEX 3A,3F,21,22 EJECT ********** * 'THE FOLLOWING ROUTINE TRANSFERS DATA IN HL TO THE * TRANSMIT BUFFER. KEYBOARD DATA IS CONVERTED TO ASCII. * THE SPECIAL SEQUENCE OF SHIFT-SUP(ETB) FOLLOWED BY * SHIFT-STOP(DC1) IS DETECTED AND CAUSES THE TERMINAL * TO PERFORM AN ASCII MODE INITIALIZATION. ********** TX.STOR EQU * LD E,L SAVE DATA IN DE LD D,H ADD HL,HL IS THIS KYBD DATA LD A,07H AND H JR NZ,TX.STOR3 NO, JUMP CALL KBCON CONVERT CHAR TO ASCII IN C RET Z IGNORE UNDEFINED KEYS LD A,17H IS CODE AN ETB CP C JR Z,TX.STOR1 YES, JUMP LD A,(SH.SUP) NO, IS SH.SUP FLAG SET OR A JR Z,TX.STOR2 NO, JUMP XOR A CLEAR SH.SUP FLAG LD (SH.SUP),A LD A,11H IS CODE A DC1 CP C JR NZ,TX.STOR2 NO, JUMP XOR A YES, SET ASCII MODE LD (MODE),A JP R.INIT DO ASCII INITIALIZE TX.STOR1 EQU * LD A,1 SET SH.SUP FLAG LD (SH.SUP),A TX.STOR2 EQU * CALL XMIT.1 SEND THE CHAR RET AND EXIT. TX.STOR3 EQU * NOT KYBD DATA, SO PUSH DE LD C,1BH SEND ESC CODE CALL XMIT.1 POP DE LD A,3FH SEND LOWER 6 BITS AND E ADD A,40H LD C,A PUSH DE CALL XMIT.1 POP HL SEND UPPER 4 BITS ADD HL,HL ADD HL,HL LD A,H AND 0FH ADD A,40H LD C,A CALL XMIT.1 RET AND EXIT. ********** * STORE CHAR FROM C-REGISTER INTO TRANSMIT BUFFER. ********** XMIT.1A EQU * ASCII MODE ENTRY LD A,(LOC.RMT) OR A RET NZ JUST EXIT IF LOCAL XMIT.1 EQU * PLATO MODE ENTRY IN A,(EXTSTAT) CHECK FOR CLEAR TO SEND BIT 5,A JR Z,XMIT.3 JUST EXIT IF CTS OFF LD HL,TXBUF TEST FOR FULL BUFFER LD A,07H CP (HL) JR C,XMIT.1 JUMP IF FULL INC (HL) NOT FULL, INC DIFF CNT INC HL POINT TO INPUT INDEX AND (HL) GET IT INC (HL) AND INCREMENT IT INC HL POINT TO BUFFER AREA INC HL LD E,A ADD THE INPUT INDEX LD D,00H ADD HL,DE LD A,(MODE) CHECK ASCII/PLATO MODE RLCA LD A,C JR NC,XMIT.2 SKIP PARITY IF ASCII OR A PLATO, SO SET EVEN PARITY JP PE,XMIT.2 XOR 80H XMIT.2 EQU * LD (HL),A STORE DATA IN TXBUF XMIT.3 EQU * LD A,(SC.OC) SET CREQ ENABLE INC A OUT (EXTCNTO),A RET EJECT ********** * ROUTINE TO CHECKSUM RAM DURING IDLE TIME. * ON EXIT, ZERO FLAG IS SET IF CHECKSUM IS PROCEEDING OK. * IF THERE IS A CHECKSUM ERROR, THE ZERO FLAG IS CLEAR. ********** CHKSUM EQU * LD DE,(CKSUMADD) GET CURRENT ADDRESS LD HL,(CKSUMWC) GET CURRENT WORD COUNT LD A,(CKSUM) GET CURRENT CHECKSUM LD C,A LD B,100 SET COUNTER CHKSUM1 EQU * LD A,L ARE WE DONE WITH THIS PART OR H JR Z,CHKSUM4 YES, JUMP LD A,(DE) ADD BYTE TO CHECKSUM ADD A,C LD C,A INC DE DEC HL DJNZ CHKSUM1 LOOP IF COUNT NOT EXPIRED CHKSUM2 EQU * LD (CKSUMADD),DE SAVE CURRENT ADDRESS LD (CKSUMWC),HL SAVE CURRENT WORD COUNT LD A,C SAVE CURRENT CHECKSUM LD (CKSUM),A XOR A SET ZERO FLAG RET CHKSUM4 EQU * LD HL,(CKSUMTAD) GET CURRENT TABLE ADDRESS LD E,(HL) DE = NEW ADDRESS INC HL LD D,(HL) INC HL LD A,(HL) BA = NEW WORD COUNT INC HL LD B,(HL) INC HL LD (CKSUMTAD),HL SAVE PLACE IN TABLE LD L,A HL = BA = NEW WORD COUNT LD H,B OR B IS BYTE COUNT = 0 JR NZ,CHKSUM2 NO, CONTINUE CHKSUM5 EQU * END OF TABLE FOUND LD A,(CHECKSUM) DOES CHECKSUM AGREE CP C PUSH AF SAVE TEST RESULT CALL CHKSUM.I REINITIALIZE POP AF GET SAVED TEST RESULT RET CHKSUM.I EQU * XOR A INITIALIZE FOR CHECKSUM LD C,A COMPUTATION LD (CKSUM),A LD HL,(CKSUMTBL) LD (CKSUMTAD),HL JR CHKSUM4 EJECT ********** * 'THIS ROUTINE PERFORMS PLATO ERROR RECOVERY PROTOCOL DURING * TRANSFERS FROM THE DSN NETWORK TO THE TERMINAL. * 'THE PROTOCOL UTILIZES EVEN PARITY ON EACH CHARACTER * TRANSFERRED AND ALSO A MODULO 96 WORD COUNT ON THE * BLOCK. 'THE FIRST CHARACTER RECEIVED IS AN ACK CODE * FOLLOWED BY A WORD COUNT BYTE FOLLOWED BY THE REST OF * THE DATA. 'THE TERMINAL SENDS AN ACK,WC AFTER EACH 20TH * BYTE RECEIVED UNLESS A PARITY ERROR HAS OCCURRED IN WHICH * CASE A NAK,WC IS SENT IMMEDIATELY. * 'THE C REGISTER CONTAINS THE DATA BYTE ON ENTRY. * 'ON EXIT, CARRY=1 SAYS TO IGNORE THE CHARACTER. ********** ERRCHK EQU * LD A,06H IF CHAR=ACK THEN CP C JR NZ,E001 LD A,(EREG) SET ACK FLAG OR 80H LD (EREG),A SCF RET AND EXIT(IGNORE) E001 LD A,(EREG) ELSE IF STATE=0 RRA (INITIAL STATE) THEN JR NC,E100 LD A,C IF CHAR PARITY OK OR A JP PO,E006 LD A,(EREG) AND ACK FLAG=1 THEN RLA JR NC,E006 E002 EQU * LD A,0DFH CLEAR ERR LIGHT OUT (PNLLTS),A LD A,C IF (CHAR AND 7FH) >= 20H AND 7FH SUB 20H JP M,E003 LD (MREG),A THEN SAVE BIASED CHAR LD (NREG),A AT M AND N LD A,02H AND SET STATE=1 LD (EREG),A (EXPECTING DATA) E003 EQU * LD A,(EREG) CLEAR ACK FLAG AND 0FH LD (EREG),A SCF AND EXIT(IGNORE) RET E006 EQU * LD A,(EREG) ELSE CLEAR ACK FLAG AND 0FH LD (EREG),A RET AND EXIT(OK) E100 EQU * RRA IF NOT STATE 1 THEN JUMP JP NC,E200 LD A,C IF CHAR PARITY OK THEN JUMP OR A JP PE,E104 SENDNAK EQU * LD A,0DEH SET ERR LIGHT OUT (PNLLTS),A XOR A SET STATE=2(ERROR) OR 04H AND CLEAR ACK FLAG LD (EREG),A LD C,95H SEND NAK CALL XMIT.1 LD A,(MREG) SEND M+20H ADD A,20H LD C,A CALL XMIT.1 XOR A RESET 250 MS TIMEOUT LD (CLK.1),A LD (CLK.2),A SCF AND EXIT(IGNORE) RET E104 EQU * STATE=1 AND NO PAR ERR, SO LD A,(EREG) IF ACK FLAG=1 THEN AND 80H JR Z,E105 LD A,C STRIP CHAR PAR BIT OR A RLA RRCA SUB 20H SET N = CHAR-20H LD (NREG),A JR E003 AND GO CLEAR ACK FLAG E105 EQU * ELSE LD A,(MREG) IF N=M (NORMAL CASE) THEN LD B,A LD A,(NREG) CP B JR NZ,E107 INC A SET M AND N = LD B,60H N+1 MOD 96 CP B JP NZ,E106 XOR A E106 LD (NREG),A LD (MREG),A LD A,(EREG) MARK AS OK CHAR AND 0BFH LD (EREG),A JR E109 E107 EQU * M<>N, SO INC A SET N = N+1 MOD 96 LD C,60H CP C JR NZ,E108 XOR A E108 LD (NREG),A LD A,(EREG) AND MARK TO IGNORE CHAR OR 40H LD (EREG),A E109 EQU * NOW TEST THE CHAR COUNTER. LD A,(E.CNTR) IF E.CNTR<>1 THEN DEC A JR Z,E110 LD (E.CNTR),A DECREMENT E.CNTR LD A,(EREG) PUT MARK IN CARRY FLAG RLCA RLCA RET AND EXIT E110 EQU * COUNTER=0, SO LD B,C LD A,14H SET E.CNTR=20 LD (E.CNTR),A LD C,06H SEND ACK E111 CALL XMIT.1 JR C,E111 LD A,(MREG) SEND M+20H ADD A,20H LD C,A E113 CALL XMIT.1 JR C,E113 LD C,B LD A,(EREG) PUT MARK IN CARRY FLAG RLCA RLCA RET AND EXIT E200 EQU * ERROR STATE LD A,C IF PAR OK THEN OR A JP PO,E201 LD A,(EREG) IF ACK FLAG=1 THEN RLCA JP C,E002 JR E202 E201 EQU * LD A,(EREG) ELSE CLEAR ACK FLAG AND 0FH LD (EREG),A E202 EQU * SCF EXIT(IGNORE) RET EJECT PROCESS LDM COMMAND * * * * * * * * * * * * * * * * * * * * * * * LOAD MODE INSTRUCTION, (LDM) * * LOAD TERMINAL OPERATING MODE * * BIT 1 BULK ERASE * * BIT 3 BIT 2 * 0 0 ERASE WRITE INVERSE * 0 1 WRITE WRITE NORMAL * 1 0 ERASE OVERSTRIKE ER * 1 1 WRITE OVERSTRIKE WR * * BITS 4-6 LOAD OPERATING MODE * * * * * * * * * * * * * * * * * * * * * * SPACE 1 MODESET EQU * USER ENTRY POINT LD A,L SRL A SET CARRY IF BULK ERASE LD (M.MODE),A STORE MODE BITS CALL C,BULKER BULK ERASE IF CARRY SET LD A,(M.MODE) GET MODE BITS RRCA RRCA AND 07H LD C,A LD A,(MODE) INSERT THEM INTO MODE AND 80H OR C LD (MODE),A JP CG.SEL SELECT CHARACTER GENERATOR MODESET1 EQU * LOCAL ENTRY TO SET W/E BITS LD A,(M.MODE) GET PRESENT MODE AND 0FCH CLEAR WRITE/ERASE BITS OR L INSERT NEW WRITE/ERASE BITS LD (M.MODE),A STORE MODE BITS LD A,(MODE) IF PLATO OPER. THEN RLCA JP C,CG.SEL SELECT CHARACTER GENERATOR RET MODESET2 EQU * LOCAL ENTRY TO SET MODE BITS LD A,(MODE) GET OLD MODE BITS AND 80H CLEAR OLD MODE BITS JR Z,MODSET2A JUMP IF ASCII MODE XOR A CLEAR BYPASS IN PLATO MODE LD (BYPASS),A LD A,80H GET BACK PLATO MODE BIT MODSET2A EQU * OR C INSERT NEW MODE BITS LD (MODE),A STORE MODE BITS ADD A,A SHIFT LEFT 2 AND SAVE IN C ADD A,A LD C,A LD A,(M.MODE) UPDATE MODE BITS IN M.MODE AND 0E3H OR C LD (M.MODE),A RET EJECT * * * * * * * * * * * * * * * * * * * * * * * PROCESS LOAD COORDINATE , (LDC) * * * * * * * * * * * * * * * * * * * * * * SPACE 1 LDC EQU * CALL GETXY GET COORDINATES CALL R.OUTX SET COORDINATES EX DE,HL CALL R.OUTY RET EJECT ECHO COMMAND PROCESSOR * * * * * * * * * * * * * * * * * * * * * * * PROCESS LOAD ECHO INSTRUCTION (LDE) * * BITS 1-7 ECHO CODE * * ECHO CODE =70 STATUS REQUEST. THE CONTENTS * M.TYPE IS LOADED AS THE ECHO * * =7B SOUND AUDIBLE TONE AT TERMIN * * =7C TERMINAL ID CODE REQUEST. TH * TERMINAL SIXTEEN BIT ID CODE * LOADED INTO FOUR ECHO RESPON * * =7D REQUEST FOR TERMINAL FLAG * * * * * * * * * * * * * * * * * * * * * * SPACE 1 LDE EQU * CALL GET3 GET NEXT 3 BYTES LD A,L AND 7FH CP 70H TEST FOR STATUS REQUEST JR NZ,LDE0 SPACE 1 LD A,(M.TYPE) LOAD TERMINAL TYPE CODE SET 7,A SET ECHO OP CODE LD L,A LOAD TYPE AS ECHO LD H,00 CATEGORY 3 SET TO 0 FOR CALL R.XMIT TEST IN TX.STOR FOR XMIT RET * LDE0 EQU * CP 7AH TEST FOR TURN OFF 'D'T'R JR NZ,LDE1 BACKOUT EQU * LD HL,03FFH SEND OUT BACK OUT CODE CALL R.XMIT TO PLATO RET * LDE1 EQU * CP 7CH TEST FOR ID REQUEST JR NZ,LDE2 NOT ID REQUEST * IN A,(IDLO) INPUT LOWER EIGHT BITS OF ID PUSH AF AND 0FH MASK LOWER FOUR BITS OR 80H INCLUDE OP CODE AND ID COUNT LD L,A LD H,00 CATEGORY 3 SET TO 0 FOR CALL R.XMIT TEST IN TX.STOR FOR XMIT * POP AF RRCA RRCA RRCA RRCA AND 0FH MASK SECOND FOUR BITS OR 90H INCLUDE OP CODE AND ID COUNT LD L,A LD H,00 CATEGORY 3 SET TO 0 FOR CALL R.XMIT TEST IN TX.STOR FOR XMIT * IN A,(IDUP) INPUT UPPER EIGHT BITS PUSH AF AND 0FH MASK LOWER FOUR BITS OR 0A0H INCLUDE OP CODE AND COUNT LD L,A LD H,00 CATEGORY 3 SET TO 0 FOR CALL R.XMIT TEST IN TX.STOR FOR XMIT * POP AF RRCA RRCA RRCA RRCA AND 0FH MASK UPPER FOUR BITS OR 0B0H INCLUDE OP CODE AND ID COUNT LD L,A LD H,00 CATEGORY 3 SET TO 0 FOR CALL R.XMIT TEST IN TX.STOR FOR XMIT RET * LDE2 EQU * CP 7BH TEST FOR AUDIBLE JR NZ,LDE3 NOT AUDIBLE AND 01 OUT (MISCTL),A SOUND AUDIBLE ALARM RET * LDE3 EQU * CP 7DH TEST FOR TERMINAL FLAG REGIS JR NZ,LDE4 NOT FLAG REQUSET * LD HL,(MEMREG) LOAD FLAG POINTER LD A,(HL) LOAD CONTENTS OF FLAG REGIST AND 7FH AND MASK LOWER SEVEN BITS * LDE4 EQU * OR 80H SET ECHO OP CODE LD L,A LOAD ECHO CODE LD H,00 CATEGORY 3 SET TO 0 FOR CALL R.XMIT TEST IN TX.STOR FOR XMIT RET EXIT EJECT PROCESS LDA COMMAND * * * * * * * * * * * * * * * * * * * * * * * LOAD MEMORY ADDRESS, (LDA) * * * * * * * * * * * * * * * * * * * * * * SPACE 1 LDA EQU * CALL GET3 GET NEXT 3 BYTES CALL CHKRG CHECK ADDRESS RANGE LD (MEMREG),HL RET * * CHECK ADDRESS IN HL BETWEEN BOUNDS * ADDRESS MUST BE 22EAH-2311H OR 3300H-7FFFH CHKRG EQU * EX DE,HL ADDRESS TO DE LD HL,3300H SCF SBC HL,DE JR NC,CHKRG0 JUMP IF <3300H EX DE,HL ADDRESS BACK TO HL BIT 7,H RET Z EXIT IF OK (<8000H) CHKRG0 EQU * ADDRESS IS <3300H LD HL,22EAH SCF SBC HL,DE JR NC,CHKRG1 JUMP IF <22EAH (ERROR) LD HL,2312H SBC HL,DE (CARRY IS ALREADY SET) EX DE,HL ADDRESS BACK TO HL RET NC EXIT IF OK (<2312H) CHKRG1 EQU * OUT OF BOUNDS POP HL RET EJECT SSF AND EXT * * * * * * * * * * * * * * * * * * * * * * * SELECT SPECIAL FUNCTION * * THIS COMMAND IS USED TO COMMUNICATE WITH VARIOUS DEVI * CONNECTED TO THE EXTERNAL CHANNELS, AND SET THE TERMI * INTERNAL INTERRUPT MASK. * * * * * * * * * * * * * * * * * * * * * * SPACE 1 * * ON-LINE ENTRY POINT * SSF EQU * CALL GET3 GET NEXT 3 BYTES RES 7,H CLEAR UPPER BIT * * USER ENTRY POINT * SSF0 EQU * LD A,H RRCA RRCA AND 1FH MASK DEVICE ADDRESS BITS JR NZ,SSF1 NOT SLIDE PROJECTOR * * OUTPUT TO SLIDE PROJECTOR * LD C,20H LOAD SLIDE PROJECTOR ADDRESS OUT (C),L OUTPUT LOWER EIGHT BITS LD A,03 AND H MASK UPPER TWO BITS OUT (C),A OUTPUT UPPER TWO BITS RET * SSF1 EQU * CP 01 TEST FOR INTERRUPT MASK JR NZ,SSF2 NOT INTERRUPT MASK LD A,L LOAD MASK JP ENAB AND SET INTERRUPT NASK * SSF2 EQU * BIT 1,H TEST FOR INPUT OR OUTPUT JR NZ,SSF3 GO TO INPUT IF NOT ZERO * * OUTPUT TO EXTERNAL DEVICE * LD (EXT.OUT),A STORE DEVICE ADDRESS LD C,A BIT 0,H TEST FOR DATA IN LOWER BITS RET NZ EXIT IF NONE * LD E,L LD HL,EXTD LOAD DATA STORE ADDRESS LD (HL),E AND STORE DATA BYTE AND 1CH TEST FOR SERIAL OR PARALLEL RET Z CAN NOT SELECT SERIAL CHANNEL SET 5,C SET EXTERNAL CHANNEL BIT OUTI OUTPUT DATA FROM MEMORY RET * * * INPUT FROM EXTERNAL DEVICE * SSF3 EQU * LD (EXT.IN),A STORE DEVICE ADDRESS LD C,A BIT 0,H TEST FOR DATA IN LOWER BITS RET NZ EXIT IF NONE AND 1CH TEST FOR SERIAL OR PARALLEL LD A,C JR Z,SSF4 ADD A,1DH ADD FOR PARALLEL CHANNEL SSF4 EQU * ADD A,03 ADD FOR SERIAL CHANNEL LD C,A IN L,(C) INPUT FROM DEVICE LD H,82H LOAD OP CODE AND CATAGORY LD A,(M.KSW) LOAD USER/PLATO FLAG PUSH HL CP 02 FOR M.KSW=0 OR M.KSW=1 CALL M,TX.STOR STORE FOR TRANSMIT TO 'PLATO POP HL FOR M.KSW=2 OR M.KSW=3 * RETURN DATA IN L TO USER RET EJECT EXT * * * * * * * * * * * * * * * * * * * * * * * OUTPUT DATA TO EXTERNAL DEVICE * * THIS COMMAND TRANSFERS TWO BYTES OF DATA TO THE DEVIC * CONNECTED TO THE EXTERNAL CHANNEL, AND ADDRESSED BY T * LAST SSF COMMAND RECEIVED BY THE TERMINAL. * * * * * * * * * * * * * * * * * * * * * * SPACE 1 * * ON-LINE ENTRY POINT * EXT EQU * CALL GET3 GET NEXT 3 BYTES LD A,H SWAP H AND L LD H,L LD L,A LD (EXTD),HL SAVE IN TEMP EXT DATA AREA LD DE,02 LOAD DATA BYTE COUNT * * USER ENTRY POINT * ON ENTRY, HL=FWA AND DE=LENGTH IN BYTES EXTX EQU * LD A,(EXT.OUT) LOAD EXTERNAL DEVICE ADDRESS LD C,A AND 1CH TEST FOR SERIAL OR PARALLEL RET NZ RETURN IF SERIAL * * PARALLEL CHANNELS * SET 5,C ADD EXT CHANNEL BIT * EXT4 EQU * OUTI OUTPUT DATA FROM MEMORY * DEC DE DECREMENT BYTE COUNT LD A,D OR E TEST FOR LAST BYTE JR NZ,EXT4 OUT PUT NEXT BYTE RET EJECT MODE 0, POINT PLOT * * * * * * * * * * * * * * * * * * * * * * * POINT PLOT MODE * * EACH MODE 0 DATA WORD SPECIFIES THE COORDINATES ON TH * DISPAY TO BE WRITTEN OR ERASED. BIT 2 OF THE LAST LDM * COMMAND RECEIVED WILL DETERMINE WRITE OR ERASE. * * MODE 0 DATA WORD * BITS 1-9 Y COORDINATE * BITS 10-18 X COORDINATE * * * * * * * * * * * * * * * * * * * * * * SPACE 1 SPACE 1 APOINT EQU * CALL GETXY GET COORDINATES * * WRITE/ERASE SINGLE DOT * * USER ENTRY POINT SPACE 1 POINT EQU * PUSH DE SAVE Y COORDINATE CALL R.OUTX LOAD X COORDINATE POP HL RETREIVE Y COORDINATE CALL R.OUTY LOAD Y COORDINATE SPACE 1 * USER ENTRY POINT SPACE 1 WE EQU * CALL MASKS GENERATE WRITE/ERASE MASKS * EX DE,HL LD HL,(DMAA) LOAD DMA ADDRESS LD A,(M.MODE) LOAD WRITE/ERASE FLAG BIT 0,A TEST FOR WRITE OR ERASE JR Z,MODE01 GO TO ERASE * LD A,E LOAD WRITE MASK OR (HL) INCLUDE POINT IN DMA DATA LD (HL),A AND STORE IN DMA RET * MODE01 EQU * LD A,D LOAD ERASE MASK AND (HL) ERASE POINT LD (HL),A STORE RESULT IN DMA RET EJECT MODE 1, VECTOR GENERATOR * * * * * * * * * * * * * * * * * * * * * * * VECTOR MODE * * EACH DATA WORD RECEIVED SPECIFIES THE END COORDINATES * THE LINE TO BE DRAWN. THIS LINE IS DRWWN BETWEEN THE * CURRENT COORDINATES AND THE END COORDINATES SPECIFIED * THE MODE 1 DATA WORD. THE END COORDINATES IS ALSO THE * OF THE NEXT LINE TO BE DRAWN. * * MODE 1 DATA WORD * BITS 1-9 Y COORDINATE * BITS 10-18 X COORDINATE * * * * * * * * * * * * * * * * * * * * * SPACE 1 GRAPH EQU * CALL GETXY GET COORDINATES LD A,(DARK) AND A IF DARK VECTOR, JR Z,ALINE BASE POSITION PUSH DE SAVE Y COORD CALL R.OUTX OUTPUT X POP HL CALL R.OUTY OUTPUT Y XOR A TURN OFF DARK VECTOR LD (DARK),A RET * ALINE EQU * LD A,(DASH) LOAD FLAG FOR DASHED/SOLID RRA JP C,G.LINE1 IF SET, USE DASHED VECTOR * OTHERWISE R.LINE * LINE EQU * * LD (XEND),HL STORE X END COORDINATE EX DE,HL LD (YEND),HL STORE Y END COORDINATE * LD C,00 CLEAR C FOR VECTOR FLAG LD HL,(XREG) LOAD CURRENT X COORDINATE CALL CALDELX CALCULATE DELTA X LD HL,(YREG) LOAD CURRENT Y COORDINATE CALL CALDELY CALCULATE DELTA Y * LD A,08H TEST FOR NEGATIVE X AND C LD A,C LD (VECFLG),A STORE VECTOR FLAG JR Z,MODE11 JUMP IF Y POSITIVE XOR 10H TOGGLE Y DIRECTION LD (VECFLG),A AND STORE LD HL,(YEND) RESET VECTOR CALL R.OUTY LOAD COORDINATE. LD HL,(XEND) CALL R.OUTX LOAD COORDINATE. * MODE11 EQU * LD HL,(YDELTA) EX DE,HL LD HL,(XDELTA) LOAD DELTA X SBC HL,DE JR NC,MODE12 JUMP IF X GREATER * * DELTA Y GREATER * LD HL,(XDELTA) LOAD DELTA X CALL DIVIDE CALCULATE SLOPE JR MODE17 * * DELTA Y IS EQUAL TO OR LESS THAN DELTA X * MODE12 EQU * LD HL,(XDELTA) LOAD DELTA X EX DE,HL CALL DIVIDE CALCULATE SLOPE * LD BC,(XDELTA) LOAD DELTA FOR LOOP COUNT INC BC EXX CALL MASKS GENERATE MASKS LD C,L LD B,H LD DE,0FFFFH LOAD FOR POSITIVE 'Y LD HL,(DMAA) LOAD STARTING ADDRESS LD A,(VECFLG) LOAD VECTOR PARAMETERS BIT 4,A TEST FOR POS 'Y DELTA JR Z,MODE1A JUMP IF X POSITIVE * INC DE SET DE FOR INC DE NEGATIVE 'Y * MODE1A EQU * LD A,(M.MODE) TEST MODE BITS RRA FOR WRITE OR ERASE JP NC,XVECE ERASE JP XVEC ELSE GO TO WRITE * MODE17 EQU * LD BC,(YDELTA) LOAD DELTA FOR LOOP COUNT INC BC EXX CALL MASKS GENERATE MASKS LD C,L LD B,H LD DE,0FFFFH LOAD FOR POSTIVE 'Y LD HL,(DMAA) LOAD STARTING ADDRESS LD A,(VECFLG) LOAD CEVTOR PARAMETERS BIT 4,A TEST FOR POS 'Y DELTA JR Z,MODE18 JUMP IF X POSITIVE * INC DE SET DE FOR INC DE NEGATIVE 'Y * MODE18 EQU * LD A,(M.MODE) TEST MODE BITS RRA FOR WRITE OR ERASE JP NC,YVECE GO TO ERASE * * VECTOR GENERATOR, Y IS LONG AXIS, X IS SHORT AXIS * WRITE VECTOR * YVEC EQU * LD A,(HL) LOAD VECTOR POINT OR C INTO REFRESH MEMORY LD (HL),A EXX DEC BC DECREMENT LOOP COUNT LD A,B OR C TEST COUNT FOR ZERO JR Z,MODE19 EXIT LOOP IF ZERO * YVEC1 EQU * ADD HL,DE CALCULATE NEXT POINT EXX JR NC,YVEC2 RLC C JR NC,YVEC2 INC H INC H SET 7,H YVEC2 EQU * ADD HL,DE SET 7,H REFRESH MEMORY ADDRESS BIT JR YVEC EJECT Y AXIS VECTOR ERASE * * VECTOR GENERATOR, Y IS LONG AXIS, X IS SHORT AXIS * VECTOR ERASE * YVECE EQU * LD A,(HL) LOAD VECTOR POINT AND B INTO DMA MEMORY LD (HL),A * EXX DEC BC DECREMENT LOOP COUNT LD A,B OR C TEST COUNT FOR ZERO JR Z,MODE19 EXIT LOOP IF ZERO * YVECE1 EQU * ADD HL,DE CALCULATE NEXT POINT OF VECT EXX JR NC,YVECE2 RLC B JR C,YVECE2 INC H INC H SET 7,H YVECE2 EQU * ADD HL,DE SET 7,H REFRESH MEMORY ADDRESS BIT JR YVECE EJECT X AXIS VECTOR * * * VECTOR GENERATOR, X IS LONG AXIS, Y IS SHORT AXIS * WRITE VECTOR * XVEC EQU * LD A,(HL) LOAD VECTOR POINT OR C INTO REFRESH MEMORY LD (HL),A * EXX DEC BC DECREMENT LOOP COUNT LD A,B OR C TEST COUNT FOR ZERO JR Z,MODE19 EXIT LOOP IF ZERO * XVEC1 EQU * ADD HL,DE CALCULATE NEXT POINT EXX JR NC,XVEC2 ADD HL,DE SET 7,H XVEC2 EQU * RLC C JR NC,XVEC INC H INC H SET 7,H JR XVEC SET 7,H REFRESH MEMORY ADDRESS BIT JR XVEC EJECT X AXIS VECTOR ERASE * * VECTOR GENERATOR, X IS LONG AXIS, Y IS SHORT AXIS * VECTOR ERASE * XVECE EQU * LD A,(HL) ERASE AND B VECTOR POINT LD (HL),A OF DMA MEMORY * EXX DEC BC DECREMENT LOOP COUNT LD A,B OR C TEST COUNT FOR ZERO JR Z,MODE19 EXIT LOOP IF ZERO * XVECE1 EQU * ADD HL,DE CALCULATE NEXT POINT OF VECT EXX JR NC,XVECE2 * ADD HL,DE MOVE IN 'Y SET 7,H DIRECTION XVECE2 EQU * RLC B JR C,XVECE INC H MOVE IN 'X INC H DIRECTION SET 7,H REFRESH MEMORY ADDRESS BIT JR XVECE * * * MODE19 EQU * LD HL,(YEND) CALL R.OUTY LOAD COORDINATE. LD HL,(XEND) JP R.OUTX LOAD COORDINATE. EJECT MODE 2, DATA LOAD AND STORE * * * * * * * * * * * * * * * * * * * * * * * LOAD TERMINAL MEMORY * * EACH DATA WORD RECEIVED CONTAINS 16 BITS OF DATA TO B * STORED IN THE TERMINAL MEMORY. THIS DATA IS STORED IN * SUCCESSIVE LOCATIONS STARTING WITH THE CURRENT CONTEN * OF THE MEMORY ADDRESS REGISTER. AFTER EACH EIGHT BITS * IS STORED, THE MEMORY ADDRESS REGISTER IS INCREMENTED * THE MEMORY ADDRESS REGISTER IS INITIALIZED BY THE * LAST LDA COMMAND RECEIVED. * * * * * * * * * * * * * * * * * * * * * * * SPACE 2 MEMORY EQU * CALL GET3 GET NEXT 3 BYTES LD B,H SAVE DATA IN BC LD C,L LD HL,(MEMREG) GET MEMORY ADDRESS CALL CHKRG CHECK AGAINST BOUNDS LD (HL),C STORE DATA INC HL LD (HL),B INC HL LD (MEMREG),HL SAVE UPDATED ADDRESS LD A,(CONFLG) TEST FOR CONVERTING OR A CHAR. DATA RET Z DO NOT CONVERT LD A,(NDATAB) INC A LD (NDATAB),A INCREMENT COUNT ON DATA BYTES CP 08 IF 16 BYTES, THEN CONVERT DATA RET NZ LD DE,0010H XOR A CLEAR CARRY SBC HL,DE EX DE,HL DE _ FWA CHAR. DATA LD HL,0001 HL _ CHAR. COUNT OF 1 CALL CONVERT XOR A LD (NDATAB),A CLEAR NUMBER DATA BYTES FG. RET EJECT MODE 3, CHARACTER GENERATOR * * * * * * * * * * * * * * * * * * * * * * * * ALPHA MODE * * MODE 3 DATA WORDS ARE CHARACTERS TO BE DISPLAYED. * ON ENTRY, THE CHAR IS IN THE C-REG. * * * * * * * * * * * * * * * * * * * * * * SPACE 2 CHARACT EQU * LD A,(MODE) CHECK MODE RLCA JP NC,ALPHMODE GO TO ASCII CHAR GEN LD HL,M.CCR IS REVERSE SET BIT 6,(HL) JR Z,CHARS0 NO, JUMP PUSH BC YES, DO TAB FIRST EX DE,HL PUT M.CCR IN DE CALL TAB POP BC CHARS0 LD DE,(MEMSEL) DISPLAY THE CHARACTER LD A,C SUB 20H LD L,A JP CHARGEN ********** * USER ENTRY POINT ********** CHARS EQU * LD A,(HL) GET DATA RES 7,A MASK TO 7 BITS INC HL LD (CHFWA),HL SAVE CHAR ADDRESS LD HL,M.CCR CP 3FH IS CHAR AN UNCOVER CODE JR NZ,CHARS1 NO, JUMP SET 7,(HL) SET UNCOVER FLAG JR CHARS6 CHARS1 EQU * BIT 7,(HL) IS UNCOVER FLAG SET JR NZ,CHARS10 YES, JUMP TO HANDLE CTL CODES BIT 6,(HL) IS REVERSE SET JR Z,CHARS2 NO, JUMP PUSH AF YES, DO TAB BEFORE PLOTTING PUSH HL EX DE,HL PUT M.CCR INTO DE CALL TAB POP HL POP AF CHARS2 EQU * NOW PLOT THE CHAR LD C,A SAVE CHAR IN C LD A,(HL) GET SELECTED CHAR MEM AND 0EH JR Z,CHARS4 JUMP IF M0 SELECTED SUB 2 JR Z,CHARS3 JUMP IF M1 SELECTED LD DE,(MEMSEL) M2..M7, SO USE SELECTED MEM LD L,C AND UNTRANSLATED CHAR JR CHARS5 CHARS3 EQU * M1 SELECTED, SO SET 6,C BIAS CHAR CHARS4 EQU * M0 OR M1 SELECTED LD B,0 TRANSLATE CHAR TO ASCII LD HL,PCHARS ADD HL,BC LD L,(HL) GET BIASED ASCII CHAR IN L LD DE,M0CODE00 M0 IF L7=0 BIT 7,L JR Z,CHARS5 RES 7,L CLEAR FLAG BIT LD DE,M1CODE00 M1 IF L7=1 CHARS5 EQU * CALL CHARGEN DISPLAY THE CHAR CHARS6 EQU * LD HL,(CHFWA) GET SAVED CHAR ADDRESS JR CHARS LOOP CHARS10 EQU * UNCOVER FLAG IS SET DEC A EXIT IF CHAR=01 RET Z RES 7,(HL) CLEAR UNCOVER FLAG INC A EXIT IF CHAR=00 RET Z CP 08H EXECUTE CONTROL CODES JR C,CHARS6 IGNORE 00-07 CP 0EH JR NC,CHARS11 LD C,A EXCUTE 08-0D CALL EX.CTL JR CHARS6 CHARS11 EQU * CP 1EH JR NC,CHARS6 IGNORE 1E-7F ADD A,32H EXECUTE 0E-1D LD C,A (BIASED TO 40-4F) CALL EX.ESC JR CHARS6 EJECT ********** * THE FOLLOWING TABLE IS USED TO TRANSLATE FROM 6-BIT * PLATO CHARACTER CODES TO ASCII CODES. * BIT 7 SET INDICATES THE CHARACTER IS PHYSICALLY FOUND IN * M1, WHILE BIT 7 CLEAR INDICATES THE CHARACTER IS * PHYSICALLY FOUND IN M0. BITS 6-0 ARE THE ASCII CHARACTER * WITH 20H SUBTRACTED OFF FOR USE BY THE CHARACTER GENERATOR ********** PCHARS EQU * HEX 1A,41,42,43 0X (M0) HEX 44,45,46,47 HEX 48,49,4A,4B HEX 4C,4D,4E,4F HEX 50,51,52,53 1X HEX 54,55,56,57 HEX 58,59,5A,10 HEX 11,12,13,14 HEX 15,16,17,18 2X HEX 19,0B,0D,0A HEX 0F,08,09,04 HEX 1D,00,0C,0E HEX 8F,3B,3D,05 3X HEX 8A,84,07,02 HEX 01,1B,1C,1E HEX 3F,1F,9F,00 HEX 03,21,22,23 4X (M1) HEX 24,25,26,27 HEX 28,29,2A,2B HEX 2C,2D,2E,2F HEX 30,31,32,33 5X HEX 34,35,36,37 HEX 38,39,3A,83 HEX 80,3E,9C,40 HEX 86,87,88,89 6X HEX 5E,8B,8C,8D HEX 8E,5B,5D,06 HEX 85,00,5C,9D HEX 82,90,91,92 7X HEX 93,94,95,96 HEX 97,98,99,9A HEX 9B,20,3C,00 EJECT * * * BACKSPACE * BKSP EQU * LD A,(DE) LOAD PLOTTING FLAG XOR 40H TOGGLE FORW/REV BIT JR TAB0 * * HORIZONTAL TAB * TAB EQU * LD A,(DE) LOAD PLOTTING FLAG * TAB0 EQU * LD DE,(SIZE) LOAD CHARACTER SIZE BIT 0,A TEST FOR HORIZONTAL/VERTICAL JR NZ,TAB2 GO TO VERT ROUTINE BIT 6,A TEST FOR FORWARD/REVERSE LD HL,(XREG) LOAD CURRENT X COORDINATE JR NZ,TAB1 GO TO REVERSE ROUTINE * ADD HL,DE ADD CHARACTER SIZE JP R.OUTX LOAD COORDINATE. * TAB1 EQU * AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT CHARACTER SIZE JP R.OUTX LOAD COORDINATE. * TAB2 EQU * BIT 6,A TEST FOR FORWARD/REVERSE LD HL,(YREG) LOAD CURRENT Y COORDINATE JR NZ,TAB3 GO TO REVERSE ROUTINE * ADD HL,DE ADD CHARACTER SIZE JP R.OUTY LOAD COORDINATE. * TAB3 EQU * AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT CHARACTER SIZE JP R.OUTY LOAD COORDINATE. * * LINE FEED * LF EQU * LD HL,(SIZE) LOAD CHARACTER SIZE ADD HL,HL AND ADJUST FOR HEIGHT EX DE,HL BIT 0,(HL) TEST FOR HOR/VERT JR NZ,LF1 GO TO VERTICAL ROUTINE * LD HL,(YREG) LOAD CURRENT Y COORDINATE AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT CHARACTER SIZE JP R.OUTY LOAD COORDINATE. * LF1 EQU * LD HL,(XREG) LOAD CURRENT X COORDINATE ADD HL,DE ADD CHARACTER SIZE JP R.OUTX LOAD COORDINATE. * * VERTICAL TAB * VT EQU * LD HL,(SIZE) LOAD CHARACTER SIZE ADD HL,HL AND ADJUST FOR HEIGHT EX DE,HL BIT 0,(HL) TEST FOR HOR/VERT JR NZ,VT1 GO TO VERTICAL ROUTINE * LD HL,(YREG) LOAD CURRENT Y COORDINATE ADD HL,DE ADD CHARACTER SIZE JP R.OUTY LOAD COORDINATE. * VT1 EQU * LD HL,(XREG) LOAD CURRENT X COORDINATE AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT CHARACTER SIZE JP R.OUTX LOAD COORDINATE. * * FORM FEED * FF EQU * LD HL,512 LD A,(M.CCR) LOAD PLOTTING PARAMETERS BIT 6,A TEST FOR FORWARD OR REVERSE JR Z,FF1 JUMP IF FORWARD * LD DE,(SIZE) LOAD CHARACTER SIZE AND A CLEAR CARRY BIT SBC HL,DE AND SUBTRACT FROM FULL SCE * FF1 EQU * BIT 0,A TEST FOR HORIZONTAL OR VERTI JR NZ,FF2 JUMP IF VERTICAL * CALL R.OUTX LOAD COORDINATE. * LD HL,(SIZE) LOAD CHARACTER SIZE ADD HL,HL AND DOUBLE IT LD DE,512 LOAD FULL SCREEN SIZE EX DE,HL AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT SIZE FROM FULL SCRE JP R.OUTY LOAD COORDINATE. * FF2 EQU * CALL R.OUTY LOAD COORDINATE. * LD HL,(SIZE) LOAD CHARACTER SIZE ADD HL,HL AND DOUBLE IT DEC HL SUBTRACT ONE JP R.OUTX LOAD COORDINATE. * * CARRIAGE RETURN * CR EQU * LD HL,(SIZE) LOAD CHARACTER SIZE ADD HL,HL AND ADJUST FOR HEIGHT EX DE,HL BIT 0,(HL) TEST FOR HOR/VERT JR NZ,CR1 GO TO VERTICAL ROUTINE * LD HL,(YREG) LOAD CURRENT Y COORDINATE AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT CHARACTER SIZE CALL R.OUTY LOAD Y COORDINATE LD HL,(M.MARGIN) LOAD MARGIN JP R.OUTX LOAD COORDINATE. * CR1 EQU * LD HL,(XREG) LOAD CURRENT X COORDINATE ADD HL,DE ADD CHARACTER SIZE CALL R.OUTX LOAD X COORDINATE LD HL,(M.MARGIN) LOAD MARGIN JP R.OUTY LOAD COORDINATE. * SUB EQU * LD HL,-0005 LOAD DISPLACEMENT JR SUB0 * SUPER EQU * LD HL,0005 LOAD DISPLACEMENT SUB0 EQU * LD A,(DE) LOAD PLOTTING FLAFG BIT 0,A TEST HORIZONTAL OR VERTICAL JR NZ,SUP1 GO TO VERTICAL PLOT * BIT 5,A JR Z,SUP0 JUMP IF SIZE ZERO ADD HL,HL ELSE DOUBLE DISPLACEMENT SUP0 EQU * EX DE,HL LD HL,(YREG) LOAD Y COORDINATE ADD HL,DE ADJUST COORDINATE JP R.OUTY LOAD COORDINATE. * SUP1 EQU * BIT 5,A JR Z,SUP2 JUMP IF SIZE ZERO ADD HL,HL ELSE DOUBLE DISPLACEMENT SUP2 EQU * EX DE,HL LD HL,(XREG) LOAD X COORDINATE AND A CLEAR CARRY BIT SBC HL,DE ADJUST COORDINATE JP R.OUTX LOAD COORDINATE. * SELECTMM EQU * LD A,C GET CHAR SUB 42H REMOVE BIAS RLCA LD C,A SAVE IN C CALL LDMEMSEL SELECT M2..M7 LD HL,M.CCR UPDATE MEM SEL BITS IN (M.CCR) LD A,0F1H AND (HL) OR C LD (HL),A RET * CALLABLE ROUTINE TO SELECT M0..M7 AS SPECIFIED IN A-REG. * NOTE, C-REG IS UNCHANGED. LDMEMSEL EQU * LD DE,M0CODE00 OR A JR Z,LDMEM1 JUMP IF M0 SELECTED LD DE,M1CODE00 DEC A DEC A JR Z,LDMEM1 JUMP IF M1 SELECTED LD B,0 SELECT M2..M7 LD HL,MEM2-4 ADD HL,BC LD E,(HL) INC HL LD D,(HL) LDMEM1 LD (MEMSEL),DE RET * HOR EQU * EX DE,HL RES 0,(HL) AND SET HORIZONTAL PLOT JP CG.SEL SELECT CHARACTER GENERATOR * VERT EQU * EX DE,HL SET 0,(HL) AND SET VERTICAL PLOT JP CG.SEL SELECT CHARACTER GENERATOR * FWD EQU * EX DE,HL RES 6,(HL) AND SET FORWARD PLOT RET * REV EQU * EX DE,HL SET 6,(HL) AND SET REVERSE PLOT RET * SIZE0 EQU * LD HL,08 LOAD SIZE ONE CHARACTER LD (SIZE),HL EX DE,HL RES 5,(HL) SET SIZE 0 FLAG RET * SIZE2 EQU * LD HL,10H LOAD SIZE TWO CHARACTER LD (SIZE),HL EX DE,HL SET 5,(HL) SET SIZE 2 FLAG RET EJECT * * * * * * * * * * * * * * * * * * * * * * CHARACTER GENERATOR * CALCULATES CHARACTER DATA ADDRESS AND JUMPS TO CHARAC * GENERATOR FOR PLOTTING DATA. * * ON ENTRY, L CONTAINS BIASED CHAR TO PLOT * DE CONTAINS FWA OF CHAR MEM TO BE USED * * * * * * * * * * * * * * * * * * * * * * SPACE 1 CHARGEN EQU * * LD H,00 ADJUST CHARACTER CODE ADD HL,HL CHARACTER DATA TABLE ADD HL,HL ADD HL,HL ADD HL,HL LD BC,000FH ADD HL,BC ADD HL,DE CHARACTER DAT ADDRESS LD A,(M.CCR) LOAD PLOTTING PARAMETERS BIT 5,A TEST FOR SIZE ZERO OR SIZE T JP NZ,SIZE.2 * EX DE,HL LD HL,(CG.ADR) LOAD CHARACTER GENERATOR ADD JP (HL) EJECT BLOCK WRITE/ERASE EJECT SIZE 2 * * * * * * * * * * * * * * * * * * * * * * * SIZE 2 CHARACTER GENERATOR * CHARACTER DATA IS EXPANDED TO DOUBLE THE WIDTH AND HE * OF THE CHARACTER AS IT IS DISPLAYED ON THE DISPLAY SC * * * * * * * * * * * * * * * * * * * * * * SPACE 1 SIZE.2 EQU * PUSH HL PUT CHAR. DATA ADDR. POP IX INTO IX REG. LD DE,SAVE3F LOAD TEMP. STORE ADDRESSES LD HL,SAVE1F EXX LD BC,0010H BYTE COUNT SIZE2.A EQU * EXX LD B,02 PASS COUNT LD C,(IX+0) DATA BYTE SIZE2.B EQU * XOR A EXPLODE 4 BITS TO 16 BITS SRL C JR NC,SIZE2.C OR 03 SIZE2.C EQU * SRL C JR NC,SIZE2.D OR 0CH SIZE2.D EQU * SRL C JR NC,SIZE2.E OR 30H SIZE2.E EQU * SRL C JR NC,SIZE2.F OR 0C0H SIZE2.F EQU * LD (DE),A STORE EXPLODED DATA DEC DE LD (DE),A DEC DE EX DE,HL DJNZ SIZE2.B LOOP ON 2 PASSES DEC IX POINT TO NEXT CHAR. DATA BYTE EXX DEC BC LOOP ON 16 COUNT LD A,B OR C JR NZ,SIZE2.A EXX LD A,(M.CCR) BIT 0,A JR NZ,SIZE2V DO VERTICAL SIZE TWO SIZE2H EQU * LD HL,SAVE3F LOAD 3RD QUAD. CALL CHARGEN1 AND DISPLAY SPACE 2 * * * * * * * * * * * * * * * * * * * * * * * HORIZONTAL PLOT * * * * * * * * * * * * * * * * * * * * * * SPACE 1 BIT 6,A TEST FOR REVERSE PLOT JR NZ,SIZE2R DO REVERSE CHAR. PLOTTING LD HL,(XREG) LOAD X COORDINATE LD DE,-8 ADD HL,DE ADJUST FOR TOP HALF CALL R.OUTX LOAD COORDINATE. LD HL,(YREG) LOAD Y COORDINATE LD DE,10H ADD HL,DE CALL R.OUTY LOAD COORDINATE. * LD HL,SAVE2F LOAD 2ND QUAD. CALL CHARGEN1 AND DISPLAY LD HL,SAVE0F LOAD 1ST QUAD. CALL CHARGEN1 AND DISPLAY * LD HL,(XREG) LOAD X COORDINATE LD DE,-8 ADD HL,DE ADJUST COORDINATE FOR NEXT P CALL R.OUTX LOAD COORDINATE. LD HL,(YREG) LOAD Y COORDINATE LD DE,-10H ADD HL,DE ADJUST COORDINATE FOR NEXT P CALL R.OUTY LOAD COORDINATE. * LD HL,SAVE1F LOAD 4TH QUAD. JP CHARGEN1 PLOT LAST PART OF CHARACTER SPACE 2 * * * * * * * * * * * * * * * * * * * * * * * REVERSE HORIZONTAL PLOT * * * * * * * * * * * * * * * * * * * * * * SPACE 1 SIZE2R EQU * LD HL,(YREG) LOAD Y COORDINATE LD DE,10H ADD HL,DE CALL R.OUTY LOAD COORDINATE. * LD HL,SAVE2F LOAD 2ND QUAD. CALL CHARGEN1 PLOT NEXT PART OF CHARACTER LD HL,(XREG) LOAD CURRENT X COORDINATE LD DE,08 LOAD ADJUST CONSTANT ADD HL,DE CALL R.OUTX LOAD COORDINATE. LD HL,SAVE0F LOAD 1ST QUAD. CALL CHARGEN1 PLOT NEXT PART OF CHARACTER LD HL,(YREG) LOAD Y COORDINATE LD DE,-10H ADD HL,DE ADJUST COORDINATE FOR NEXT P CALL R.OUTY LOAD COORDINATE. * LD HL,SAVE1F LOAD 4TH QUAD. CALL CHARGEN1 PLOT LAST PART OF CHARACTER LD HL,(XREG) LOAD CURRENT X COORDINATE LD DE,-08 LOAD ADJUST CONSTANT ADD HL,DE JP R.OUTX LOAD COORDINATE. SPACE 2 * * * * * * * * * * * * * * * * * * * * * * * VERTICAL PLOT * * * * * * * * * * * * * * * * * * * * * * SPACE 1 SIZE2V EQU * LD HL,SAVE3F PLOT 3RD QUAD CALL CHARGEN1 LD A,(M.CCR) TEST FOR REVERSE PLOTTING BIT 6,A JR NZ,SIZE2VR DO VERTICAL REVERSE PLOT LD HL,(XREG) POSITION FOR 2ND QUAD LD DE,-10H ADD HL,DE CALL R.OUTX LD HL,(YREG) LD DE,-08H ADD HL,DE CALL R.OUTY LD HL,SAVE2F PLOT 2ND QUAD CALL CHARGEN1 LD HL,SAVE0F PLOT 1ST QUAD CALL CHARGEN1 LD HL,(XREG) POSITION FOR 4TH QUAD LD DE,10H ADD HL,DE CALL R.OUTX LD HL,(YREG) LD DE,-08H ADD HL,DE CALL R.OUTY LD HL,SAVE1F PLOT 4TH QUAD JP CHARGEN1 EJECT SIZE 2 VERTICAL REVERSE * * * * * * * * * * * * * * * * * * * * * * * REVERSE VERTICAL PLOT * * * * * * * * * * * * * * * * * * * * * * SPACE 1 SIZE2VR EQU * LD HL,(XREG) POSITION FOR 2ND QUAD LD DE,-10H ADD HL,DE CALL R.OUTX LD HL,SAVE2F PLOT 2ND QUAD CALL CHARGEN1 LD HL,(YREG) POSITION FOR 1ST QUAD LD DE,08H ADD HL,DE CALL R.OUTY LD HL,SAVE0F PLOT 1ST QUAD CALL CHARGEN1 LD HL,(XREG) POSITION FOR 4TH QUAD LD DE,10H ADD HL,DE CALL R.OUTX LD HL,SAVE1F PLOT 4TH QUAD CALL CHARGEN1 LD HL,(YREG) POSITION FOR NEXT CHAR LD DE,-08H ADD HL,DE CALL R.OUTY RET CHARGEN1 EQU * EX DE,HL LD HL,(CG.ADR) LOAD CHARACTER GENERATOR ADD JP (HL) EJECT FAST PLOT NORMAL(HORIZONTAL) ********** * FAST HORIZONTAL PLOT NORMAL ********** SPACE 2 FHPLOT EQU * LDDR FH.ADV EQU * LD HL,0010H MOVE TO CHARACTER BOTTOM ADD HL,DE LD A,(M.CCR) BIT 6,A JR NZ,FH.ADV1 IF REVERSE, JUST ADJUST Y INC H MOVE TO NEXT CHAR. POSITION INC H IN THE X DIRECTION SET 7,H LD (DMAA),HL LD BC,0008 LD HL,(XREG) ADD HL,BC LD A,H AND 01 LD H,A LD (XREG),HL RET FH.ADV1 EQU * SET 7,H LD (DMAA),HL RET EJECT FAST PLOT INVERSE (HORIZONTAL) ********** * FAST PLOT INVERSE HORIZONTAL ********** SPACE 2 FPLOTI EQU * LD A,(DE) COMPLEMENT CHAR. DATA CPL BEFORE WRITING TO SCREEN LD (HL),A DEC DE DEC HL DEC C JR NZ,FPLOTI EX DE,HL JP FH.ADV EJECT FAST PLOT OVERSTRIKE WRITE(HOR.) ********** * FAST PLOT OVERSTRIKE WRITE HORIZONTAL ********** SPACE 2 FPLOTOW EQU * LD A,(DE) CHAR. DATA .OR. WITH SCREEN OR (HL) LD (HL),A DEC DE DEC HL DEC C JR NZ,FPLOTOW EX DE,HL JP FH.ADV EJECT FAST PLOT OVERSTRIKE ERASE(HOR.) ********** * FAST PLOT OVERSTRIKE ERASE HORIZONTAL ********** SPACE 2 FPLOTOE EQU * LD A,(DE) CPL AND (HL) LD (HL),A DEC DE DEC HL DEC C JR NZ,FPLOTOE EX DE,HL JP FH.ADV EJECT HORIZONTAL PLOT NORMAL ********** * HORIZONTAL PLOT NORMAL ********** SPACE 2 HPLOTN EQU * EX DE,HL LD DE,(DMAA) LD BC,0010H LD A,(BP) OR A JP Z,FHPLOT X AND Y ON BOUNDARY AND 07H JR NZ,HPN0 MHP1 EQU * ONLY Y OFF BOUNDARY LDD JP PO,H.ADV CHAR DONE, POINT TO NEXT CHAR LD A,E INC A JR NZ,MHP1 BIT 0,D JR Z,MHP1 INC D INC D SET 7,D JR MHP1 * HPN0 EQU * X AND Y OFF CHAR. BOUNDARIES EXX CALL MASKS EXX PUSH HL POP IX IX HAS FWA OF CHAR. DATA LD HL,(DMAA) DISPLAY MEMORY ADDR. LD DE,(DMA1) DISPLAY MEMORY ADDR. NEXT COL. LD B,10H LOOP COUNT HPN1 EQU * EXX LD A,(BP) AND 07H LD B,A LD A,(IX+0) HPN2 EQU * RLA RL C DJNZ HPN2 * AND D LD B,A LD A,C AND E LD C,A EXX LD A,(HL) EXX AND E OR B EXX LD (HL),A LD A,(DE) EXX AND D OR C EXX EX DE,HL LD (HL),A EX DE,HL DEC DE DEC HL DEC IX DJNZ HPN3 JP H.ADV HPN3 EQU * LD A,L INC A JR NZ,HPN1 BIT 0,H JR Z,HPN1 INC H INC H SET 7,H INC D INC D SET 7,D JP HPN1 EJECT HORIZONTAL PLOT INVERSE ********** * HORIZONTAL PLOT INVERSE ********** SPACE 2 HPLOTI EQU * * DE HAS CHAR. FWA LD HL,(DMAA) HL HAS DISPLAY MEM. ADDR. LD BC,0010H LD A,(BP) OR A JP Z,FPLOTI X AND Y ON BOUNDARIES AND 07H JR NZ,HPI0 MHPI1 EQU * ONLY Y ON BOUNDARY LD A,(DE) COMPLEMENT CHAR. DATA CPL LD (HL),A DEC HL DEC DE DEC C JP Z,H.ADV LD A,L INC A JR NZ,MHPI1 CHECK FOR TOP OF SCREEN WRAP BIT 0,H JR Z,MHPI1 IF SET, ADJUST X FOR WRAP INC H INC H SET 7,H JR MHPI1 CONTINUE PLOTTING * HPI0 EQU * X AND Y OFF CHAR. BOUNDARIES EXX CALL MASKS EXX PUSH DE POP IX IX HAS FWA OF CHAR. DATA LD HL,(DMAA) DISPLAY MEMORY ADDR. LD DE,(DMA1) DISPLAY MEMORY ADDR. NEXT COL. LD B,10H LOOP COUNT HPI1 EQU * EXX LD A,(BP) AND 07H LD B,A LD A,(IX+0) CPL HPI2 EQU * RLA RL C DJNZ HPI2 AND D LD B,A LD A,C AND E LD C,A EXX LD A,(HL) EXX AND E OR B EXX LD (HL),A LD A,(DE) EXX AND D OR C EXX EX DE,HL LD (HL),A EX DE,HL DEC DE DEC HL DEC IX DJNZ HPI3 JP H.ADV HPI3 EQU * LD A,L INC A JR NZ,HPI1 BIT 0,H JR Z,HPI1 INC H INC H SET 7,H INC D INC D SET 7,D JP HPI1 EJECT HORIZONTAL OVERSTRIKE WRITE ********** * HORIZONTAL OVERSTRIKE WRITE ********** SPACE 2 HPLOTOW EQU * * DE HAS CHAR. FWA LD HL,(DMAA) HL HAS DISPLAY MEM. ADDR. LD BC,0010H LD A,(BP) OR A JP Z,FPLOTOW X AND Y ON BOUNDARY AND 07H JR NZ,HPOW0 MHPOW1 EQU * ONLY Y ON BOUNDARY LD A,(DE) CHAR. DATA .OR. WITH SCREEN OR (HL) LD (HL),A DEC HL DEC DE DEC C JP Z,H.ADV LD A,L INC A JR NZ,MHPOW1 CHECK FOR TOP OF SCREEN WRAP BIT 0,H JR Z,MHPOW1 IF SET, ADJUST X FOR WRAP INC H INC H SET 7,H JR MHPOW1 CONTINUE PLOTTING HPOW0 EQU * X AND Y OFF CHAR. BOUNDARIES EXX CALL MASKS EXX PUSH DE POP IX IX HAS FWA OF CHAR. DATA LD HL,(DMAA) DISPLAY MEMORY ADDR. LD DE,(DMA1) DISPLAY MEMORY ADDR. NEXT COL. LD B,10H LOOP COUNT HPOW1 EQU * EXX LD A,(BP) AND 07H LD B,A LD A,(IX+0) HPOW2 EQU * RLA RL C DJNZ HPOW2 AND D LD B,A LD A,C AND E LD C,A EXX LD A,(HL) EXX OR B EXX LD (HL),A LD A,(DE) EXX OR C EXX EX DE,HL LD (HL),A EX DE,HL DEC DE DEC HL DEC IX DJNZ HPOW3 JP H.ADV HPOW3 EQU * LD A,L INC A JR NZ,HPOW1 BIT 0,H JR Z,HPOW1 INC H INC H SET 7,H INC D INC D SET 7,D JP HPOW1 EJECT HORIZONTAL OVERSTRIKE ERASE ********** * HORIZONTAL OVERSTRIKE ERASE ********** SPACE 2 HPLOTOE EQU * * DE HAS CHAR. FWA LD HL,(DMAA) HL HAS DISPLAY MEM. ADDR. LD BC,0010H LD A,(BP) OR A JP Z,FPLOTOE X AND Y ON BOUNDARIES AND 07H JR NZ,HPOE0 MHPOE1 EQU * ONLY Y ON BOUNDARY LD A,(DE) CHAR. DATA .OR. WITH SCREEN CPL AND (HL) LD (HL),A DEC HL DEC DE DEC C JP Z,H.ADV LD A,L INC A JR NZ,MHPOE1 CHECK FOR TOP OF SCREEN WRAP BIT 0,H JR Z,MHPOE1 IF SET, ADJUST X FOR WRAP INC H INC H SET 7,H JR MHPOE1 CONTINUE PLOTTING HPOE0 EQU * X AND Y ON CHAR. BOUNDARIES EXX CALL MASKS EXX PUSH DE POP IX IX HAS FWA OF CHAR. DATA LD HL,(DMAA) DISPLAY MEMORY ADDR. LD DE,(DMA1) DISPLAY MEMORY ADDR. NEXT COL. LD B,10H LOOP COUNT HPOE1 EQU * EXX LD A,(BP) AND 07H LD B,A LD A,(IX+0) CPL HPOE2 EQU * RLA RL C DJNZ HPOE2 AND D OR E LD B,A LD A,C AND E OR D LD C,A EXX LD A,(HL) EXX AND B EXX LD (HL),A LD A,(DE) EXX AND C EXX EX DE,HL LD (HL),A EX DE,HL DEC DE DEC HL DEC IX DJNZ HPOE3 JP H.ADV HPOE3 EQU * LD A,L INC A JR NZ,HPOE1 BIT 0,H JR Z,HPOE1 INC H INC H SET 7,H INC D INC D SET 7,D JP HPOE1 SPACE 2 ********** * HORIZONTAL ADVANCE ********** SPACE 2 H.ADV EQU * LD A,(M.CCR) BIT 6,A RET NZ IF REVERSE, RETURN LD HL,(XREG) OTHERWISE ADVANCE LD DE,0008 BY ONE CHAR. WIDTH ADD HL,DE JP R.OUTX EJECT VERTICAL FPLOT NORMAL ********** * FAST PLOT NORMAL VERTICAL ********** SPACE 2 * THIS CHARACTER GENERATOR WORKS FOR VERTICAL * CHARACTERS WHICH ARE ON THE X BOUNDARY. * THE Y BOUNDARY WILL BE CHECKED DURING EXECUTION. * VDMA1 AND VDMA2 ARE WRITTEN TO IN THAT ORDER. * EACH IS DECREMENTED BY 1 AND SCREEN WRAP IS * CHECKED. THIS IS REPEATED 8 TIMES FOR THE * 16 BYTES MAKING UP THE CHARACTER. SPACE 2 FVPLTN EQU * LD B,08 * IX-LWA OF ROTATED CHAR DATA LD HL,(VDMA1) LD DE,(VDMA2) FVN.0 EQU * LD A,(IX+0) LD (HL),A LD A,(IX-1) LD (DE),A DEC B JR Z,FVN.1 DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR FVN.0 FVN.1 EQU * CALL V.ADV RET EJECT FAST PLOT INVERSE VERTICAL ********** * FAST PLOT INVERSE VERTICAL ********** SPACE 2 * THIS CHARACTER GENERATOR WORKS FOR VERTICAL * CHARACTERS WHICH ARE ON THE X BOUNDARY. * THE Y BOUNDARY WILL BE CHECKED DURING EXECUTION. * VDMA1 AND VDMA2 ARE WRITTEN TO IN THAT ORDER. * EACH IS DECREMENTED BY 1 AND SCREEN WRAP IS * CHECKED. THIS IS REPEATED 8 TIMES FOR THE * 16 BYTES MAKING UP THE CHARACTER. SPACE 2 FVPLTI EQU * LD B,08 * IX-LWA OF ROTATED CHAR DATA LD HL,(VDMA1) LD DE,(VDMA2) FVI.0 EQU * LD A,(IX+0) CPL LD (HL),A LD A,(IX-1) CPL LD (DE),A DEC B JR Z,FVI.1 DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR FVI.0 FVI.1 EQU * CALL V.ADV RET EJECT FAST OVERSTRIKE WRITE VERTICAL ********** * FAST OVERSTRIKE WRITE VERTICAL ********* SPACE 2 * THIS CHARACTER GENERATOR WORKS FOR VERTICAL * CHARACTERS WHICH ARE ON THE X BOUNDARY. * THE Y BOUNDARY WILL BE CHECKED DURING EXECUTION. * VDMA1 AND VDMA2 ARE WRITTEN TO IN THAT ORDER. * EACH IS DECREMENTED BY 1 AND SCREEN WRAP IS * CHECKED. THIS IS REPEATED 8 TIMES FOR THE * 16 BYTES MAKING UP THE CHARACTER. SPACE 2 FVPLTOW EQU * LD B,08 * IX-LWA OF ROTATED CHAR DATA LD HL,(VDMA1) LD DE,(VDMA2) FVOW.0 EQU * LD A,(IX+0) OR (HL) LD (HL),A LD A,(IX-1) EX DE,HL OR (HL) LD (HL),A EX DE,HL DEC B JR Z,FVOW.1 DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR FVOW.0 FVOW.1 EQU * CALL V.ADV RET EJECT FAST OVERSTRIKE ERASE VERTICAL ********** * FAST OVERSTRIKE ERASE VERTICAL ********** SPACE 2 * THIS CHARACTER GENERATOR WORKS FOR VERTICAL * CHARACTERS WHICH ARE ON THE X BOUNDARY. * THE Y BOUNDARY WILL BE CHECKED DURING EXECUTION. * VDMA1 AND VDMA2 ARE WRITTEN TO IN THAT ORDER. * EACH IS DECREMENTED BY 1 AND SCREEN WRAP IS * CHECKED. THIS IS REPEATED 8 TIMES FOR THE * 16 BYTES MAKING UP THE CHARACTER. SPACE 2 FVPLTOE EQU * LD B,08 * IX-LWA OF ROTATED CHAR DATA LD HL,(VDMA1) LD DE,(VDMA2) FVOE.0 EQU * LD A,(IX+0) CPL AND (HL) LD (HL),A LD A,(IX-1) EX DE,HL CPL AND (HL) LD (HL),A EX DE,HL DEC B JR Z,FVOE.1 DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR FVOE.0 FVOE.1 EQU * CALL V.ADV RET EJECT VERTICAL CHARACTER DATA ROTATION * VERRT- VERTICAL ROTATION ROUTINE * THIS ROUTINE MOVES THE CURRENT CHARACTER DATA * TO A TEMPORARY STORAGE AREA, SAVE4F. THEN IT * ROTATES 16 BYTES OF CHARACTER DATA TO A TEMPORARY * STORAGE AREA, SAVE5F. 'THE ALGORITHM STORES BACK * INTO SAVE4F AREA THE INTERMEDIATE ROTATES WHICH * IS WHY THE INITIAL CHARACTER DATA MOVE IS NEEDED. * THIS ROTATION FACILITATES THE VERTICAL * CHARACTER GENERATION. * ENTRY- DE HAS LWA OF CHARACTER DATA * EXIT- IX HAS LWA OF ROTATED CHAR. DATA, SAVE5F SPACE 2 VERRT EQU * EX DE,HL MOVE CHARACTER DATA LD DE,SAVE4F TO TEMPORARY STORE AREA LD BC,0010H LDDR EX DE,HL LD BC,0008 ADD HL,BC IX HAS LWA-8 OF CHAR. DATA PUSH HL C RETAINS OUTER LOOP COUNT POP IX VERRT.0 EQU * LD HL,SAVE5F FWA OF TEMPORARY CHAR. STORE LD B,08 VERRT.1 EQU * LD A,(IX+8) RRA LD (IX+8),A RL (HL) DEC HL LD A,(IX+0) RRA LD (IX+0),A RL (HL) DEC HL DJNZ VERRT.1 INNER LOOP 8 TIMES DEC IX DEC C JR NZ,VERRT.0 OUTER LOOP 8 TIMES LD HL,SAVE5F LOAD IX WITH LWA OF PUSH HL OF ROTATED CHAR. DATA POP IX FOR CHARACTER GENERATORS RET EJECT VERTICAL PLOT ADDRESS ADJUST/ADVANCE ********** * VERTICAL PLOT ADDRESS ADJUST ********** SPACE 2 VADR.ADJ EQU * LD HL,(DMAA) DEC H DEC H SET 7,H LD (VDMA1),HL POINT TO WORD LEFT OF DMAA DEC H DEC H SET 7,H LD (VDMA2),HL POINT TO WORD LEFT OF VDMA1 RET SPACE 2 ********** * VERTICAL CHARACTER GENERATOR ADVANCE ROUTINE ********* V.ADV EQU * LD A,(M.CCR) BIT 6,A RET NZ IF REVERSE, RETURN LD DE,0008 CALL R.INPY ADD HL,DE CALL R.OUTY RET EJECT VERTICAL SCREEN TOP WRAP CHECK ********** * VERTICAL WRAP ROUTINE * CHECKS TO SEE IF SCREEN TOP HAS BEEN * REACHED AND ADJUSTS VDMA1 AND VDMA2 * IF SO. * ENTRY- DE HAS CURRENT DISPLAY MEM. ADDR. ********** SPACE 2 V.WRAP EQU * LD A,E INC A RET NZ BIT 0,D RET Z INC D INC D INC H INC H SET 7,D SET 7,H RET EJECT VERTICAL BIT ROTATE ********** * VERTICAL PLOT NORMAL ********** VPLOTN EQU * CALL VERRT ROTATE CHAR DATA TO SAVE5F CALL VADR.ADJ ADJUST SCREEN ADDRESSES LD A,(BP) FOR VERTICAL WRITING AND 07 JP Z,FVPLTN ON X BOUNDARY, FAST PLOT * * OTHERWISE CHARACTER PLOTTING IS OVER THREE * EIGHT BIT WORDS. ROW BY ROW, CHARACTER DATA * ON THE SCREEN WITHIN THE RIGHTMOST AND LEFTMOST * BYTES MUST BE LEFT UNDISTURBED WHILE THE NEW * CHARACTER IS WRITTEN IN NORMAL MODE TO THE * 16 BITS MAKING UP THE CHARACTER HEIGHT. THE * RIGHT BYTE AND RIGHT OF MIDDLE BYTE ARE WRITTEN TO * FIRST THEN THE LEFT BYTE AND LEFTMOST PART OF * MIDDLE BYTE ARE WRITTEN TO ON A ROW BY ROW BASIS * FOR THE 8 ROWS MAKING UP THE CHARACTER WIDTH. * EXX CALL MASKS DE - MASKS FOR CHAR DATA * AND DISPLAY WORDS LD BC,0802H B-CHAR WIDTH COUNT, C-COLUMNS EXX LD HL,SAVE5F LWA OF VERTICAL CHAR DATA PUSH HL POP IX LD HL,(DMAA) RIGHTMOST BYTE OF VERTICALS LD DE,(VDMA1) MIDDLE BYTE OF VERTICALS VNORM.0 EQU * LD A,(BP) AND 07 LD B,A LD A,(IX+0) VNORM.1 EQU * RLA RL C DJNZ VNORM.1 EXX AND D EXX LD B,A LD A,(DE) EXX AND E EXX OR B LD (DE),A LD A,C EXX AND E EXX LD B,A LD A,(HL) EXX AND D EXX OR B LD (HL),A EXX DEC B REPEAT FOR CHAR WIDTH OF 8 JR Z,VNORM.2 EXX DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR VNORM.0 VNORM.2 EQU * LD B,08 RESET INNER LOOP COUNT DEC C EXX JR Z,VNORM.3 LD HL,(VDMA1) REPEAT FOR LEFTMOST BYTE LD DE,(VDMA2) AND LEFT OF MIDDLE BYTE LD BC,000DH ADD IX,BC JR VNORM.0 VNORM.3 EQU * CALL V.ADV RET EJECT VERTICAL PLOT INVERSE ********** * VERTICAL PLOT INVERSE ********** SPACE 2 VPLOTI EQU * CALL VADR.ADJ CALL VERRT IX - LWA OF ROTATED CHAR DATA LD A,(BP) AND 07 JP Z,FVPLTI * * OTHERWISE CHARACTER PLOTTING IS OVER THREE * EIGHT BIT WORDS. ROW BY ROW, CHARACTER DATA * ON THE SCREEN WITHIN THE RIGHTMOST AND LEFTMOST * BYTES MUST BE LEFT UNDISTURBED WHILE THE NEW * CHARACTER IS WRITTEN IN NORMAL MODE TO THE * 16 BITS MAKING UP THE CHARACTER HEIGHT. THE * RIGHT BYTE AND RIGHT OF MIDDLE BYTE ARE WRITTEN TO * FIRST THEN THE LEFT BYTE AND LEFTMOST PART OF * MIDDLE BYTE ARE WRITTEN TO ON A ROW BY ROW BASIS * FOR THE 8 ROWS MAKING UP THE CHARACTER WIDTH. * EXX CALL MASKS DE - MASKS FOR CHAR DATA * AND DISPLAY WORDS LD BC,0802H B-CHAR WIDTH COUNT, C-COLUMNS EXX * IX-LWA ROTATED CHAR DATA LD HL,(DMAA) RIGHTMOST BYTE OF VERTICALS LD DE,(VDMA1) MIDDLE BYTE OF VERTICALS VINV.0 EQU * LD A,(BP) AND 07 LD B,A LD A,(IX+0) CPL VINV.1 EQU * RLA RL C DJNZ VINV.1 EXX AND D EXX LD B,A LD A,(DE) EXX AND E EXX OR B LD (DE),A LD A,C EXX AND E EXX LD B,A LD A,(HL) EXX AND D EXX OR B LD (HL),A EXX DEC B REPEAT FOR CHAR WIDTH OF 8 JR Z,VINV.2 EXX DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR VINV.0 VINV.2 EQU * LD B,08 RESET INNER LOOP COUNT DEC C EXX JR Z,VINV.3 LD HL,(VDMA1) REPEAT FOR LEFTMOST BYTE LD DE,(VDMA2) AND LEFT OF MIDDLE BYTE LD BC,000DH ADD IX,BC JR VINV.0 VINV.3 EQU * CALL V.ADV RET EJECT VERTICAL PLOT OVERSTRIKE WRITE ********** * VERTICAL PLOT OVERSTRIKE WRITE ********** SPACE 2 VPLOTOW EQU * CALL VADR.ADJ CALL VERRT IX - LWA OF ROTATED CHAR DATA LD A,(BP) AND 07 JP Z,FVPLTOW * * OTHERWISE CHARACTER PLOTTING IS OVER THREE * EIGHT BIT WORDS. ROW BY ROW, CHARACTER DATA * ON THE SCREEN WITHIN THE RIGHTMOST AND LEFTMOST * BYTES MUST BE LEFT UNDISTURBED WHILE THE NEW * CHARACTER IS WRITTEN IN NORMAL MODE TO THE * 16 BITS MAKING UP THE CHARACTER HEIGHT. THE * RIGHT BYTE AND RIGHT OF MIDDLE BYTE ARE WRITTEN TO * FIRST THEN THE LEFT BYTE AND LEFTMOST PART OF * MIDDLE BYTE ARE WRITTEN TO ON A ROW BY ROW BASIS * FOR THE 8 ROWS MAKING UP THE CHARACTER WIDTH. * EXX CALL MASKS DE - MASKS FOR CHAR DATA * AND DISPLAY WORDS LD BC,0802H B-CHAR WIDTH COUNT, C-COLUMNS EXX * IX-LWA OF ROTATED CHAR DATA LD HL,(DMAA) RIGHTMOST BYTE OF VERTICALS LD DE,(VDMA1) MIDDLE BYTE OF VERTICALS VOW.0 EQU * LD A,(BP) AND 07 LD B,A LD A,(IX+0) VOW.1 EQU * RLA RL C DJNZ VOW.1 EXX AND D EXX EX DE,HL OR (HL) EX DE,HL LD (DE),A LD A,C EXX AND E EXX OR (HL) LD (HL),A EXX DEC B REPEAT FOR CHAR WIDTH OF 8 JR Z,VOW.2 EXX DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR VOW.0 VOW.2 EQU * LD B,08 RESET INNER LOOP COUNT DEC C EXX JR Z,VOW.3 LD HL,(VDMA1) REPEAT FOR LEFTMOST BYTE LD DE,(VDMA2) AND LEFT OF MIDDLE BYTE LD BC,000DH ADD IX,BC JR VOW.0 VOW.3 EQU * CALL V.ADV RET EJECT VERTICAL OVERSTRIKE ERASE ********** * VERTICAL OVERSTRIKE ERASE ********** SPACE 2 VPLOTOE EQU * CALL VADR.ADJ CALL VERRT IX - LWA OF ROTATED CHAR DATA LD A,(BP) AND 07 JP Z,FVPLTOE * * OTHERWISE CHARACTER PLOTTING IS OVER THREE * EIGHT BIT WORDS. ROW BY ROW, CHARACTER DATA * ON THE SCREEN WITHIN THE RIGHTMOST AND LEFTMOST * BYTES MUST BE LEFT UNDISTURBED WHILE THE NEW * CHARACTER IS WRITTEN IN NORMAL MODE TO THE * 16 BITS MAKING UP THE CHARACTER HEIGHT. THE * RIGHT BYTE AND RIGHT OF MIDDLE BYTE ARE WRITTEN TO * FIRST THEN THE LEFT BYTE AND LEFTMOST PART OF * MIDDLE BYTE ARE WRITTEN TO ON A ROW BY ROW BASIS * FOR THE 8 ROWS MAKING UP THE CHARACTER WIDTH. * EXX CALL MASKS DE - MASKS FOR CHAR DATA * AND DISPLAY WORDS LD BC,0802H B-CHAR WIDTH COUNT, C-COLUMNS EXX * IX-LWA OF ROTATED CHAR DATA LD HL,(DMAA) RIGHTMOST BYTE OF VERTICALS LD DE,(VDMA1) MIDDLE BYTE OF VERTICALS VOE.0 EQU * LD A,(BP) AND 07 LD B,A LD A,(IX+0) CPL VOE.1 EQU * RLA RL C DJNZ VOE.1 EXX AND D OR E EXX EX DE,HL AND (HL) EX DE,HL LD (DE),A LD A,C EXX AND E OR D EXX AND (HL) LD (HL),A EXX DEC B REPEAT FOR CHAR WIDTH OF 8 JR Z,VOE.2 EXX DEC IX DEC IX DEC HL DEC DE CALL V.WRAP JR VOE.0 VOE.2 EQU * LD B,08 RESET INNER LOOP COUNT DEC C EXX JR Z,VOE.3 LD HL,(VDMA1) REPEAT FOR LEFTMOST BYTE LD DE,(VDMA2) AND LEFT OF MIDDLE BYTE LD BC,000DH ADD IX,BC JR VOE.0 VOE.3 EQU * CALL V.ADV RET EJECT BLOCK WRITE/ERASE * * * * * * * * * * * * * * * * * * * * * * * * BLOCK WRITE/ERASE * * * * * * * * * * * * * * * * * * * * * * SPACE 2 * ABLOCK EQU * CALL GETXY GET AN X AND Y COORD LD A,(MODE4CNT) CHECK WHICH SET OF COORDS XOR 1 LD (MODE4CNT),A JR Z,ABLOCK1 LD (BLOCKX),HL FIRST SET OF COORDS LD (BLOCKY),DE RET ABLOCK1 LD (XEND),HL SECOND SET OF COORDS LD (YEND),DE LD HL,BLOCKX POINT TO COORDS * USER ENTRY POINT BLOCK EQU * LD DE,BLOCKX STORE USER'7S COORDINATES LD BC,0008H TO PROGRAM MEMORY LDIR STARTING AT BLOCKX * LD A,(BLOCKX) SAVE1 _ MASK FOR 1ST X COORD. AND 07 CALL MASKS0 EX DE,HL LD (SAVEL),HL * LD A,(XEND) SAVE2 _ MASK FOR 2ND X COORD. AND 07 CALL MASKS0 EX DE,HL LD (SAVER),HL * LD HL,BLOCKX+1 ENSURE EACH COORDINATE LD B,04 IS 9 BITS MAX. LD C,01 * BLOCK0 EQU * LD A,(HL) AND C LD (HL),A INC HL INC HL DJNZ BLOCK0 * MODE4.B EQU * LD C,00 LD HL,(BLOCKX) CALL CALDELX CALCULATE DELTA X LD HL,(BLOCKY) CALL CALDELY CALCULATE DELTA Y BIT 4,C IF DELTA Y IS POSITIVE LD HL,(YEND) USE YEND AS BEGINNING JR Z,MODE4.C Y COORD. LD HL,(BLOCKY) OTHERWISE, USE BLOCKY * MODE4.C EQU * CALL R.OUTY THIS WILL COMPLEMENT Y * BIT 3,C IF DELTA X IS POSITIVE LD HL,(BLOCKX) USE BLOCKX AS BEGINNING LD BC,(SAVEL) XCOORD. LD DE,(SAVER) JR Z,MODE4.D LD HL,(XEND) OTHERWISE, USE XEND LD BC,(SAVER) LD DE,(SAVEL) * MODE4.D EQU * SLA D LD A,D LD (RMASK),A LD A,B LD (LMASK),A LD A,C XOR D LD (MMASK),A CALL R.OUTX SET BEGINNING X ON SCREEN LD BC,(YDELTA) LD HL,(XDELTA) LD A,(BP) AND 07 LD E,A LD D,00 ADD HL,DE IS DELTA X + BP > 0 LD DE,0007 SBC HL,DE JR C,MODE4.E LESS THAN 8 BIT WIDTH JR NZ,MODE4.F MORE THAN 8 BIT WIDTH * MODE4.E EQU * LD A,(MMASK) *CASE 1* DELTA X WITHIN 8 BITS LD D,A LD HL,(DMAA) LD A,(M.MODE) BIT 0,A JP Z,BLOCKES LD A,D CPL LD D,A JP BLOCKWS * MODE4.F EQU * LD HL,(DMAA) EXX LD DE,(XDELTA) WORD COUNT _ DELTA X / 8 LD A,E AND 07 LD B,A SRL D RR E SRL D RR E SRL E LD A,(BP) AND 07 ADD A,B CP 08 JR C,MODE4.G INC E GREATER THAN 0, WORD COUNT + 1 * MODE4.G EQU * EXX LD A,(LMASK) LD D,A LD A,(M.MODE) BIT 0,A JP NZ,BLOCKW * LD A,(LMASK) CPL LD D,A JP BLOCKE EJECT SHORT BLOCK WRITE/ERASE * * * * * * * * * * * * * * * * * * * * * * * SHORT BLOCK ERASE, LESS THAN ONE BYTE IN Y AXIS * * * * * * * * * * * * * * * * * * * * * * SPACE 1 BLOCKES EQU * LD A,(HL) LOAD DMA DATA AND D AND MASK SAVE BITS LD (HL),A * LD A,B AND TEST OR C ZERO COUNT JP Z,BLK.EXIT END OF PLOT DEC BC DECREMENT LOOP COUNT INC HL INCREMENT ADDRESS JR BLOCKES SPACE 2 * * * * * * * * * * * * * * * * * * * * * * * SHORT BLOCK WRITE, LESS THAN ONE BYTE IN Y AXIS * * * * * * * * * * * * * * * * * * * * * * SPACE 1 BLOCKWS EQU * LD A,(HL) LOAD DMA DATA OR D WRITE LD (HL),A * LD A,B AND TEST OR C ZERO COUNT JP Z,BLK.EXIT END OF PLOT DEC BC DECREMENT LOOP COUNT INC HL INCREMENT ADDRESS JR BLOCKWS EJECT * * * * * * * * * * * * * * * * * * * * * * BLOCK ERASE * HL DMA ADDRESS * D MASK * E LINE COUNT * BC X DELTA * * * * * * * * * * * * * * * * * * * * * * SPACE 2 BLOCKE EQU * LD A,(HL) LOAD DMA DATA AND D AND MASK SAVE BITS LD (HL),A * LD A,B AND TEST OR C ZERO COUNT JR Z,BLOCK1 DEC BC DECREMENT LOOP COUNT INC HL INCREMENT ADDRESS JR BLOCKE * BLOCK1 EQU * LD BC,(YDELTA) LOAD WIDTH OF ERASE AREA LD HL,(DMAA) LOAD REFRESH MEMORY ADDRESS INC H DO NEXT COLUMN INC H SET 7,H REFRESH MEMORY ADDRESS BIT EXX DEC E DECREMENT LINE COUNT EXX JR NZ,BLOCK3 DO NEXT LINE IF NON ZERO * LD A,(RMASK) ELSE LOAD MASK LD D,A * BLOCK2 EQU * LD A,(HL) LOAD DMA DATA AND D AND MASK SAVE BITS LD (HL),A * LD A,B AND TEST OR C ZERO COUNT JR Z,BLK.EXIT END OF PLOT DEC BC DECREMENT LOOP COUNT INC HL INCREMENT ADDRESS JR BLOCK2 * BLOCK3 EQU * LD D,H LD E,L LD (DMAA),HL STORE NEXT LINE ADDRESS LD (HL),00H ERASE FIRST CELL LD A,B OR C TEST FOR SINGLE DOT WIDTH JR Z,BLOCK1 SINGLE DOT * INC DE INCREMENT DESTINATION ADDRES LDIR ERASE LINE JR BLOCK1 TEST FOR LAST LINE EJECT * * * * * * * * * * * * * * * * * * * * * * * BLOCK WRITE * * * * * * * * * * * * * * * * * * * * * * SPACE 2 BLOCKW EQU * LD A,(HL) LOAD DMA DATA OR D WRITE LD (HL),A * LD A,B AND TEST OR C ZERO COUNT JR Z,BLOCKW1 DEC BC DECREMENT LOOP COUNT INC HL INCREMENT ADDRESS JR BLOCKW * BLOCKW1 EQU * LD BC,(YDELTA) LOAD WIDTH OF WRITE AREA LD HL,(DMAA) LOAD REFRESH MEMORY ADDRESS INC H INC H DO NEXT COLUMN SET 7,H REFRESH MEMORY ADDRESS BIT EXX DEC E DECREMENT LINE COUNT EXX JR NZ,BLOCKW3 DO NEXT LINE IF NON ZERO * LD A,(RMASK) ELSE LOAD MASK CPL LD D,A * BLOCKW2 EQU * LD A,(HL) LOAD DMA DATA OR D WRITE LD (HL),A * LD A,B AND TEST OR C ZERO COUNT JR Z,BLK.EXIT END OF PLOT DEC BC DECREMENT LOOP COUNT INC HL INCREMENT ADDRESS JR BLOCKW2 * BLOCKW3 EQU * LD D,H LD E,L LD (DMAA),HL STORE NEXT LINE ADDRESS LD (HL),0FFH STORE ONES IN DMA LD A,B OR C TEST FOR SINGLE DOT WIDTH JR Z,BLOCKW1 SINGLE DOT * INC DE LDIR JR BLOCKW1 TEST FOR LAST LINE * * * * * * * * * * * * * * * * * * * * * * * BLOCK WRITE/ERASE EXIT * X COORDINATE IS SET TO FIRST X COORDINATE RECEIVED * Y COORDINATE IS SET TO FIRST Y COORDINATE 7INUS 15 * * * * * * * * * * * * * * * * * * * * * * SPACE 2 BLK.EXIT EQU * LD HL,(BLOCKX) LOAD FIRST X COORDINATE CALL OUTX AND SET REFRESH ADDRESS LD HL,(BLOCKY) LOAD FIRST Y COORDINATE LD DE,-15 LOAD NEGATIVE FIFTEEN ADD HL,DE AND ADD TO Y COORDINATE CALL OUTY AND SET REFRESH ADDRESS RET EXIT TO CALLER ********* * GET X AND Y COORDINATES. * POP RETURNS ARE EXECUTED UNTIL LOW X BYTE IS RECEIVED. * THEN A NORMAL RETURN IS EXECUTED WITH THE X COORDINATE * IN HL AND THE Y COORDINATE IN DE. ********* GETXY EQU * LD A,C RESTORE DATA LD HL,NBYTES INCR. NUMBER OF INPUTS INC (HL) AND 60H IF CHAR AND 60H=20H, HI Y CP 20H JR NZ,LOYCHK OTHERWISE, CHECK FOR LO Y LD A,1FH HIGH=(CHAR-32)*32 AND C LD L,A LD H,00 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL HL=HIGH LD A,(NBYTES) IF THIS INPUT IS FIRST CP 01 IN SEQ. IT IS HIGH Y BYE JR Z,HIYBYTE LD (HIX),HL OTHERWISE, IT IS HIGH X POP AF POP AND RET TO IDLE RET * HIYBYTE EQU * LD (HIY),HL POP AF RET LOYCHK EQU * CP 60H IF CHAR AND 60H=60H, LO Y JR NZ,LOXCHK OTHERWISE, CHECK FOR LOW X LD A,C AND 1FH LD (LOY),A LOY=(CHAR-32) POP AF POP AND RET TO IDLE RET * LOXCHK EQU * CP 40H IF CHAR AND 60H=40H, LO X JR NZ,ERR ERR RETURN TO IDLE DEFAULT LD A,C AND 1FH LOX=(CHAR-32) LD (LOX),A LD HL,(HIX) OR L LD L,A EX DE,HL DE HAS X COORD LD A,(LOY) LD HL,(HIY) OR L LD L,A EX DE,HL HL HAS X COORD * DE HAS Y COORD XOR A CLEAR COMMAND MODE FLAG LD (CMODE),A LD (NBYTES),A SET NINPUTS TO 0 LD A,(SCALEFG) LOAD SCALE/NO SCALE FLAG RRA RET C IF SET, COORDS AS IS * CALL DIVBY2 OTHERWISE, SCALE BY EX DE,HL BY FACTOR OF 2 CALL DIVBY2 TO SCALE INTO 511X511 EX DE,HL PUSH HL SAVE X COORD. LD HL,(BIAS) BIAS Y COORD. ADD HL,DE EX DE,HL POP HL RET * ERR EQU * POP AF RET * DIVBY2 EQU * LD A,H OR L RET Z LD A,H AND 7FH RRA LD H,A LD A,L RRA LD L,A RET ********** * GET NEXT 3 DATA BYTES AND ASSEMBLE THEM * INTO A 2-BIT WORD IN C REG. AND A 16-BIT WORD IN HL REG. ********** GET3 EQU * LD A,3FH UNBIAS CHAR AND C LD C,A LD HL,NBYTES LD A,(HL) INC (HL) INCREMENT NBYTES AND A TEST NBYTES JR NZ,GET3.1 LD L,C FIRST CHAR LD H,A LD (DWORD),HL POP HL RET GET3.1 EQU * DEC A JR NZ,GET3.2 LD A,C SECOND CHAR RRCA RRCA LD D,A AND 0C0H LD E,A LD A,D AND 0FH LD D,A LD HL,(DWORD) ADD HL,DE LD (DWORD),HL POP HL RET GET3.2 EQU * LD A,C THIRD CHAR RLCA RLCA RLCA RLCA LD C,A AND 0F0H LD D,A LD E,00H LD HL,(DWORD) ADD HL,DE LD A,C AND 03H LD C,A XOR A LD (NBYTES),A CLEAR NBYTES LD (CMODE),A CLEAR CMODE RET EJECT USER MODE ENTRY * * * * * * * * * * * * * * * * * * * * * * * USER MODES * * * * * * * * * * * * * * * * * * * * * * SPACE 2 MODE5 EQU * CALL GET3 GET NEXT 3 BYTES IN C,H,L EX DE,HL DE=BITS 16-01 (C=BITS 18-17) LD HL,(MOD5A) LOAD MODE 5 ADDRESS JP (HL) * MODE6 EQU * CALL GET3 GET NEXT 3 BYTES IN C,H,L EX DE,HL DE=BITS 16-01 (C=BITS 18-17) LD HL,(MOD6A) LOAD MODE 6 ADDRESS JP (HL) * MODE7 EQU * CALL GET3 GET NEXT 3 BYTES IN C,H,L EX DE,HL DE=BITS 16-01 (C=BITS 18-17) LD HL,(MOD7A) LOAD MODE 7 ADDRESS JP (HL) EJECT ASSEMBLE COMM LINE INPUT * * * * * * * * * * * * * * * * * * * * * * * PROCESS INTERRUPT MASK AND ENABLR DEVICES * * INTERRUPT MASK * BIT 0 SERIAL CHANNEL * BIT 1 UNUSED * BIT 2 UNUSED * BIT 3 EXTERNAL DEVICE * BIT 4 COMM LINE CHARACTER REQUEST * BIT 5 TOUCH PANEL * BIT 6 KEYBOARD * BIT 7 COMM LINE CHARACTER READY * * * * * * * * * * * * * * * * * * * * * * * SPACE 1 ENAB EQU * LD L,A SAVE CURRENT ENABLE BITS AND 20H MASK FOR TP ENABLE JR Z,ENAB.1 IF ZERO, DISABLE TOUCH PANEL LD A,(M.ENAB) TEST FOR REENABLE OF TP AND 20H JR NZ,ENAB.1 IF REENABLE, ENAB.1 IN A,(SYSSTAT) TEST FOR TOUCH PANEL DATA BIT 4,A JR Z,ENAB.1 NO DATA, ENAB.1 IN A,(TPDATA) RID OF EXTRA TOUCH ENAB.1 EQU * LD A,L AND 68H MASK ENABLE BITS OR 45H ENAB LONG INT, K/B AND SER CHN LD (M.ENAB),A AND STORE OUT (INTMSK),A ENABLE/DISABLE DEVICES RET EJECT M.CCR * * * * * * * * * * * * * * * * * * * * * * * M.CCR AND CHARACTER PLOTTING PARAMETERS ARE SET IN * ACCORDANCE EITH THE CONTENTS OF HL REGISTER PAIR. * * BIT FUNCTION * 0 1=VERTICAL, 0=HORIZONTAL * 1,2,3 CHARACTER MEMORY SELECT, 0-7 * 4 UNUSED * 5 1=SIZE TWO CHARACTERS, 0=SIZE ONE CHARACTER * 6 1=REVERSE, 0=FORWARD * 7 1=UNCOVER CODE LAST CHARACTER CODE RECEIVED * * * * * * * * * * * * * * * * * * * * * * SPACE 1 CCR EQU * LD (M.CCR),HL STORE BIT SETTINGS IN M.CCR LD A,0EH SET UP (MEMSEL) AND L CALL LDMEMSEL LD A,(M.CCR) SET UP (SIZE) LD HL,8 BIT 5,A JR Z,CCR.1 ADD HL,HL CCR.1 LD (SIZE),HL JP CG.SEL SET UP (CG.ADR) EJECT CHAR. GEN. SELECT * * * * * * * * * * * * * * * * * * * * * * * CHARACTER GENERATOR SELECT * * THIS ROUTINE SELECTS THE CORRECT CHARACTER GENERATOR * PLOT CHARACTERS DEPENDING ON HORIZONTAL OR VERTICAL P * WEATHER CHARACTER STARTS ON BYTE BOUNDARY OR OFF SET, * AND THE WRITE/ERASE BIT SETTING. * * * * * * * * * * * * * * * * * * * * * * SPACE 2 CG.SEL EQU * LD A,(M.MODE) LOAD WRITE/ERASE AND 03 BITS FROM MODE SELECT. LD C,A LD A,(M.CCR) LOAD HOR/VERT BITS SET 2,C BIT 0,A TEST FOR HOR. OR VERT. PLOT JR NZ,CGSEL1 JUMP IF VERT PLOT RES 2,C ELSE CLEAR BIT FOR HORIZON * CGSEL1 EQU * LD B,00 LOAD REGISTERS BC SLA C FOR INDEX TO TABLE LD HL,CG.TBL LOAD FWA OF TABLE ADD HL,BC AND ADD INDEX LD A,(HL) LOAD LOWER BITS OF CG ADDRES LD (CG.ADR),A AND STORE INC HL LD A,(HL) LOAD UPPER BITS OF CG ADDRES LD (CG.ADR+1),A AND STORE RET * * CHARACTER GENERATOR ADDRESS TABLE * CG.TBL EQU * DEFW HPLOTI HORIZONTAL PLOT INVERSE DEFW HPLOTN HORIZONTAL PLOT NORMAL DEFW HPLOTOE HORIZONTAL OVERSTRIKE ERASE DEFW HPLOTOW HORIZONTAL OVERSTRIKE WRITE DEFW VPLOTI DEFW VPLOTN DEFW VPLOTOE DEFW VPLOTOW EJECT * * * * * * * * * * * * * * * * * * * * * * * CALCULATE DELTA OF X AND Y BEGIN AND END POINTS * * * * * * * * * * * * * * * * * * * * * * SPACE 1 CALDELX EQU * EX DE,HL LD HL,(XEND) LOAD X END POINT LD B,08H LOAD PLOTTING BIT CALL CALDEL DO CALCULATION LD (XDELTA),HL STORE DELTA RET * CALDELY EQU * EX DE,HL LD HL,(YEND) LOAD Y END POINT LD B,10H LOAD PLOTTING BIT CALL CALDEL DO CALCULATION LD (YDELTA),HL STORE DELTA Y RET * CALDEL EQU * AND A CLEAR CARRY BIT SBC HL,DE SUBTRACT BEGIN POINT FROM EN RET P RETURN IF RESULT POSITIVE * LD A,L CPL COMPLIMENT LD L,A NEGATIVE DELTA LD A,H CPL LD H,A INC HL LD A,C OR B LOAD NEGATIVE DELTA FLAG LD C,A RET EJECT DIVIDE ROUTINE * * * * * * * * * * * * * * * * * * * * * * * DIVIDEND HL REGISTERS * DIVISOR DE REGISTERS * QUOTIENT BC REGISTERS * * * * * * * * * * * * * * * * * * * * * * SPACE 2 DIVIDE EQU * LD BC,0040H SET SHIFT COUNT TO TEN PLACE * DIV1 EQU * ADD HL,HL SHIFT DIVIDEND LEFT ONE PLAC LD (SAVE1),HL AND SAVE SBC HL,DE SUBTRACT DIVISOR FROM DIVIDE JR NC,DIV2 * LD HL,(SAVE1) * DIV2 EQU * CCF COMPLIMENT CARRY RL C SHIFT QUOTIENT RL B INTO BC REGISTERS JR NC,DIV1 REPEAT IF NOT COMPLETE * LD L,C LD H,B ADD HL,HL LEFT ADD HL,HL JUSTIFY ADD HL,HL FRACTIONAL ADD HL,HL QUOTIENT ADD HL,HL ADD HL,HL EX DE,HL LD HL,8000H LOAD HALF BIT OFF SET RET EXIT TO CALLER EJECT INPUT TO USER * * * * * * * * * * * * * * * * * * * * * * * INPUT FROM KEYBOARD, TOUCH PANEL OR EXTERNAL DEVICE * * DATA WORDS ARE LOADED FROM THE USER FIFO BUFFER AND T * TO THE USER IN REGISTERS HL. * ONE DATA WORD IS TRANSFERED EACH TIME THIS ROUTINE * IS CALLED. * IF THE USER BUFFER IS EMPTY, THE MOST SIGNIFICANT BIT * OF H REGISTE IS SET. * * * * * * * * * * * * * * * * * * * * * * SPACE 2 INPUT EQU * LD DE,USBUF LOAD ADDRESS OF USER BUFFER LD HL,8000H LD A,(DE) LOAD BUFFER COUNT OR A AND TEST FOR DATA IN BUFFE RET Z NO DATA, RETURN TO CALLER * EX DE,HL DEC (HL) DECREMENT COUNT INC HL STEP ADDRESS TO INC HL OUTPUT INDEX LD A,07 AND (HL) MASK INDEX FOR EIGHT WORD BU INC (HL) INCREMENT INDEX * INC HL ADVANCE ADDRESS TO START OF RLCA LD E,A LOAD INDEX TO LD D,00 DE REGISTER PAIR ADD HL,DE ADD INDEX TO START ADDRESS LD E,(HL) LOAD LOWER BITS OF WORD INC HL LD D,(HL) LOAD UPPER BITS OF WORD EX DE,HL RET EXIT EJECT * * * * * * * * * * * * * * * * * * * * * * * SET STEP COORDINATE ROUTINE DIRECTION BITS * * THIS ROUTINE SETS THE DIRECTION OF THE STEP ROUTINES. * THE LOWER TWO BITS OF HL REGISTERS ARE LOADED TO M.DI * BIT 0 0 STEP Y FORWARD (UP) * 1 STEP Y REVERSE (DOWN) * BIT 1 0 STEP X FORWARD (RIGHT) * 1 STEP X REVERSE (LEFT) * * * * * * * * * * * * * * * * * * * * * * SPACE 1 DIR EQU * LD (M.DIR),HL STORE DIRECTION BITS RET EJECT OUTPUT COORDINATES * * * * * * * * * * * * * * * * * * * * * * * SET NEW Y COORDINATE * * * * * * * * * * * * * * * * * * * * * * SPACE 1 OUTY EQU * LD A,01 MASK FOR AND H NINE BIT LD H,A COORDINATE LD (YREG),HL CALL COMPHL LD DE,(DMAA) LOAD DMA ADDRESS RES 0,D LD A,H OR D LOAD UPPER BIT INTO ADDRESS SET 7,A LD H,A LD (DMAA),HL STORE NEW REFRESH MEMORYY AD INC H ADD TWO HUNDRED INC H TO ADDRESS SET 7,H SET REFRESH MEMORY BIT LD (DMA1),HL AND STORE INC H ADD FOUR HUNDRED INC H TO REFRESH ADDRESS SET 7,H SET REFRESH MEMORY BIT LD (DMA2),HL AND STORE LD A,L AND 0F0H LD L,A LD A,01H AND H OR L LD HL,BP JR Z,OUTY1 RES 7,(HL) JR INPY OUTY1 SET 7,(HL) * * INPUT Y COORDINATE * INPY EQU * LD HL,(YREG) RET EJECT OUTPUT Y COORDINATE * * * * * * * * * * * * * * * * * * * * * * * SET NEW X COORDINATE * * * * * * * * * * * * * * * * * * * * * * SPACE 1 OUTX EQU * LD A,01 MASK FOR AND H NINE BIT LD H,A COORDINATE LD (XREG),HL STORE NINE BIT COORDINATE LD A,07H AND L LD E,A LD A,(BP) AND 80H OR E LD (BP),A LD DE,(DMAA) LOAD DMA ADDRESS LD A,81H LOAD MASK AND D MASK SAVE BITS OF ADDRESS LD D,A LD A,0F8H AND L MASK NEW BITS SRL A SRL A OR D INCLUDE Y BITS INTO ADDRESS LD D,A BIT 0,H TEST UPPER BIT JR Z,OUTX1 SET 6,D SET UPPER BIT OUTX1 EQU * SET 7,D LD (DMAA),DE LOAD NEW DMA ADDRESS INC D ADD TWO HUNDRED INC D TO REFRESH ADDRESS SET 7,D SET REFRESH MEMORY BIT LD (DMA1),DE AND STORE INC D ADD FOUR HUNDRED INC D TO REFRESH ADDRESS SET 7,D SET REFRESH MEMORY BIT LD (DMA2),DE AND STORE SPACE 2 * * INPUT X COORDINATE * INPX EQU * LD HL,(XREG) RET EJECT COMPLEMENT HL REGISTER PAIR * COMPHL EQU * LD A,L CPL LD L,A LD A,H CPL AND 01 LD H,A RET EJECT STEP X AND Y COORDINATES * * * * * * * * * * * * * * * * * * * * * * * * STEP X COORDINATE * * STEP THE X COORDINATE ONE DOT DEPENDING ON THE SETTIN * BIT 1 OF M.DIR. * * * * * * * * * * * * * * * * * * * * * * SPACE 1 STEPX EQU * CALL INPX LD A,(M.DIR) BIT 1,A TEST FOR DIRECTION OF STEP JR NZ,STEPX1 STEP NEGATIVE IF NOT ZERO SPACE 1 INC HL JP R.OUTX LOAD X COORDINATE * STEPX1 EQU * DEC HL JP R.OUTX LOAD Y COORDINATE SPACE 2 * * * * * * * * * * * * * * * * * * * * * * * * STEP Y COORDINATE * * STEP THE Y COORDINATE ONE DOT DEPENDING ON THE SETTIN * OF BIT 0 OF M.DIR. * * * * * * * * * * * * * * * * * * * * * * SPACE 1 STEPY EQU * CALL INPY LD A,(M.DIR) LOAD STEP DIRECTION FLAG BIT 0,A TEST DIRECTION OF STEP JR NZ,STEPY1 GO NEGATIVE IF NOT ZERO SPACE 1 INC HL JP R.OUTY LOAD Y COORDINATE SPACE 1 SPACE 1 STEPY1 EQU * DEC HL JP R.OUTY LOAD Y COORDINATE EJECT MASK GENERATOR EJECT * * MASK GENERATOR * * ENTRY * B = LOOP COUNT, (LOWER THREE BITS OF Y COOR * * EXIT * D = 11100000 * E = 00011111 * H = 11011111 * L = 00100000 * MASKS EQU * LD A,(BP) LOAD LOWER THREE BITS OF Y AND 07H * MASKS0 EQU * LD B,A OR A TEST BITS FOR ZERO LD A,0FFH LOAD A ALL ONES LD L,01H JR Z,MASKS2 NO SHIFT IF ZERO * MASKS1 EQU * SLA A SHIFT LEFT ZERO FILLING SLA L DJNZ MASKS1 STAY IN LOOP FOR BP COUNT * MASKS2 EQU * LD D,A LOAD 11110000 CPL LD E,A LOAD 00001111 LD A,L CPL LD H,A LOAD 11101111 RET EJECT CHARACTER CONVERT ROUTINE SPACE 2 * CONVERT CHARACTER DATA TO ACCOMMODATE DISPLAY CHANGE * ENTRY HL NUMBER CHARACTERS TO CONVERT * DE FWA OF CHARACTER DATA SPACE 2 CONVERT EQU * LD A,L STORE NUMBER OF CHARS LD (NCHARS),A TO CONVERT CON0 EQU * PUSH DE CHARACTER DATA SOURCE ADDR LD C,E ON STACK AND BC LD B,D LD HL,SAVE1+8 TEMP DEST. ADDR OF ODD ROWS EXX BRING IN AUX. REGS. POP DE CHARACTER DATA SOURCE ADDR INC DE POINTS TO EVEN ROWS LD BC,0808H B';BIT COUNT; C';LOOP COUNT LD HL,SAVE1 TEMP DESTIN. ADDR OF EVEN ROWS CON1 EQU * LD A,(DE) ROTATE UPPER BIT OF EVEN ROWS RLA TO LOWER BIT OF DESTINATION LD (DE),A SAVE ROTATED DATA OF SOURCE RR (HL) INC DE POINT TO NEXT EVEN ROW OF DATA INC DE EXX BRING IN MAIN REGS. LD A,(DE) ROTATE UPPER BIT OF ODD ROWS RLA TO LOWER BIT OF DESTINATION LD (DE),A SAVE ROTATED DATA OF SOURCE RR (HL) INC DE POINT TO NEXT ODD ROW DATA INC DE EXX BRING IN AUX. REGS. DJNZ CON1 DECREMENT BIT COUNT TO 0 EXX BRING IN MAIN REGS. INC HL POINT TO NEXT DEST. WORD * FOR ODD ROWS LD E,C DE GETS SOURCE FWA AGAIN LD D,B PUSH DE EXX BRING IN AUX. REGS. POP DE DE GETS SOURCE FWA+1 FOR INC DE EVEN ROWS INC HL POINT TO NEXT DEST. WORD * FOR EVEN ROWS LD B,08 RESET BIT COUNT DEC C DECREMENT LOOP COUNT TO 0 JR NZ,CON1 EXX BRING IN MAIN REGS. LD E,C DE GETS SOURCE FWA LD D,B LD HL,SAVE1 HL GETS TEMPORARY FWA LD BC,0010H BC GETS 16 BYTE COUNT LDIR CONVERTED DATA TO SOURCE LD A,(NCHARS) MORE DATA TO CONVERT'/ DEC A LD (NCHARS),A RESTORE NUMBER OF CHARACTERS JR NZ,CON0 NO, DO NEXT CHARACTER RET RETURN TO CALLER SPACE 4 ********** * BULK ERASE THE SCREEN ********** BULKER EQU * LD A,06H DO BULK ERASE OUT (BLKERS),A BULKER1 IN A,(SYSSTAT) GET SYSTEM STATUS RLCA JR C,BULKER1 WAIT UNTIL BULK ERASE DONE RET EJECT ********** * JUMP TABLE FOR PLATO MODE ESCAPE SEQUENCES ********** ESCADR.P EQU * DEFB 03H ETX DEFW AINIT DEFB 11H DC1 DEFW DC1 DEFB 12H DC2 DEFW DC2 DEFB 13H DC3 DEFW DC3 DEFB 14H DC4 DEFW DC4 DEFB 0CH FF DEFW BULKER DEFB 40H AMPERSAND DEFW SUPER DEFB 32H 2 DEFW LCOORD DEFB 41H UC A DEFW SUB DEFB 42H UC B DEFW SELECTMM DEFB 43H UC C DEFW SELECTMM DEFB 44H UC D DEFW SELECTMM DEFB 45H UC E DEFW SELECTMM DEFB 46H UC F DEFW SELECTMM DEFB 47H UC G DEFW SELECTMM DEFB 48H UC H DEFW SELECTMM DEFB 49H UC I DEFW SELECTMM DEFB 4AH UC J DEFW HOR DEFB 4BH UC K DEFW VERT DEFB 4CH UC L DEFW FWD DEFB 4DH UC M DEFW REV DEFB 4EH UC N DEFW SIZE0 DEFB 4FH UC O DEFW SIZE2 DEFB 50H UC P DEFW SLDM2C DEFB 51H UC Q DEFW SSPECF DEFB 52H UC R DEFW LEXT DEFB 53H UC S DEFW SLDM2 DEFB 54H UC T DEFW MODE567 (MODE 5) DEFB 55H UC U DEFW MODE567 (MODE 6) DEFB 56H UC V DEFW MODE567 (MODE 7) DEFB 57H UC W DEFW LADDR DEFB 59H UC Y DEFW LECHO DEFB 5AH UC Z DEFW LMARG DEFB 1BH ESC DEFW ESC DEFB 0FFH END OF TABLE ********** * JUMP TABLE FOR PLATO MODE CONTROL CODES ********** CTLADR.P EQU * DEFB 08H BS DEFW BKSP DEFB 0DH CR DEFW CR DEFB 09H HT DEFW TAB DEFB 0AH LF DEFW LF DEFB 0BH VT DEFW VT DEFB 0CH FF DEFW FF DEFB 19H EM DEFW EM.1 DEFB 1BH ESC DEFW ESC DEFB 1CH FS DEFW FS.1 DEFB 1DH GS DEFW GS.1 DEFB 1FH US DEFW US.1 DEFB 0FFH END OF TABLE EJECT **************************************** * M0 CHARACTER SET * **************************************** M0CODE00 EQU * SPACE HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M0CODE01 EQU * EXCLAMATION MARK HEX 00,00,00,08 HEX 08,08,08,08 HEX 08,00,00,08 HEX 00,00,00,00 M0CODE02 EQU * DOUBLE QUOTATION MARK HEX 00,00,00,14 HEX 14,14,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M0CODE03 EQU * NUMBER SIGN HEX 00,00,00,14 HEX 14,7F,14,7F HEX 14,14,00,00 HEX 00,00,00,00 M0CODE04 EQU * DOLLAR SIGN HEX 00,00,00,08 HEX 3E,49,09,3E HEX 48,49,3E,08 HEX 00,00,00,00 M0CODE05 EQU * PERCENT SIGN HEX 00,00,00,02 HEX 45,25,12,08 HEX 24,52,51,20 HEX 00,00,00,00 M0CODE06 EQU * AMPERSAND HEX 00,00,00,04 HEX 0A,0A,04,46 HEX 49,31,31,4E HEX 00,00,00,00 M0CODE07 EQU * SINGLE QUOTE(STRAIGHT) HEX 00,08,08,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M0CODE08 EQU * LEFT PARENTHESIS HEX 00,00,00,40 HEX 20,10,10,10 HEX 10,10,10,20 HEX 40,00,00,00 M0CODE09 EQU * RIGHT PARENTHESIS HEX 00,00,00,01 HEX 02,04,04,04 HEX 04,04,04,02 HEX 01,00,00,00 M0CODE0A EQU * ASTERISK HEX 00,00,00,00 HEX 00,08,2A,14 HEX 14,2A,08,00 HEX 00,00,00,00 M0CODE0B EQU * PLUS SIGN HEX 00,00,00,00 HEX 00,00,08,08 HEX 3E,08,08,00 HEX 00,00,00,00 M0CODE0C EQU * COMMA HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,0C,0C HEX 08,04,00,00 M0CODE0D EQU * MINUS SIGN HEX 00,00,00,00 HEX 00,00,00,00 HEX 3E,00,00,00 HEX 00,00,00,00 M0CODE0E EQU * PERIOD HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,0C,0C HEX 00,00,00,00 M0CODE0F EQU * SLASH HEX 00,00,00,00 HEX 00,40,20,10 HEX 08,04,02,01 HEX 00,00,00,00 M0CODE10 EQU * ZERO HEX 00,00,00,00 HEX 5C,22,32,2A HEX 2A,26,22,1D HEX 00,00,00,00 M0CODE11 EQU * ONE HEX 00,00,00,00 HEX 08,0C,08,08 HEX 08,08,08,1C HEX 00,00,00,00 M0CODE12 EQU * TWO HEX 00,00,00,00 HEX 1C,22,20,10 HEX 08,04,02,3E HEX 00,00,00,00 M0CODE13 EQU * THREE HEX 00,00,00,00 HEX 1C,22,20,18 HEX 20,20,22,1C HEX 00,00,00,00 M0CODE14 EQU * FOUR HEX 00,00,00,00 HEX 20,30,28,24 HEX 7E,20,20,20 HEX 00,00,00,00 M0CODE15 EQU * FIVE HEX 00,00,00,00 HEX 3E,02,02,1E HEX 20,20,10,0E HEX 00,00,00,00 M0CODE16 EQU * SIX HEX 00,00,00,00 HEX 18,04,02,1E HEX 22,22,22,1C HEX 00,00,00,00 M0CODE17 EQU * SEVEN HEX 00,00,00,00 HEX 3E,20,10,10 HEX 08,08,04,04 HEX 00,00,00,00 M0CODE18 EQU * EIGHT HEX 00,00,00,00 HEX 1C,22,22,1C HEX 22,22,22,1C HEX 00,00,00,00 M0CODE19 EQU * NINE HEX 00,00,00,00 HEX 1C,22,22,22 HEX 3C,20,10,0C HEX 00,00,00,00 M0CODE1A EQU * COLON HEX 00,00,00,00 HEX 00,00,0C,0C HEX 00,00,0C,0C HEX 00,00,00,00 M0CODE1B EQU * SEMICOLON HEX 00,00,00,00 HEX 00,00,0C,0C HEX 00,00,0C,0C HEX 08,04,00,00 M0CODE1C EQU * LESS THAN SIGN HEX 00,00,00,00 HEX 00,10,08,04 HEX 02,04,08,10 HEX 00,00,00,00 M0CODE1D EQU * EQUAL SIGN HEX 00,00,00,00 HEX 00,00,00,3E HEX 00,3E,00,00 HEX 00,00,00,00 M0CODE1E EQU * GREATER THAN SIGN HEX 00,00,00,00 HEX 00,04,08,10 HEX 20,10,08,04 HEX 00,00,00,00 M0CODE1F EQU * QUESTION MARK HEX 00,00,00,1C HEX 22,22,20,10 HEX 08,08,00,08 HEX 00,00,00,00 M0CODE20 EQU * COMMERCIAL AT SIGN HEX 00,00,00,00 HEX 00,1C,22,59 HEX 55,55,39,02 HEX 1C,00,00,00 M0CODE21 EQU * UPPER CASE A HEX 00,00,00,1C HEX 22,41,41,7F HEX 41,41,41,41 HEX 00,00,00,00 M0CODE22 EQU * UPPER CASE B HEX 00,00,00,1F HEX 21,21,3F,41 HEX 41,41,41,3F HEX 00,00,00,00 M0CODE23 EQU * UPPER CASE C HEX 00,00,00,3C HEX 42,01,01,01 HEX 01,01,42,3C HEX 00,00,00,00 M0CODE24 EQU * UPPER CASE D HEX 00,00,00,1F HEX 21,41,41,41 HEX 41,41,21,1F HEX 00,00,00,00 M0CODE25 EQU * UPPER CASE E HEX 00,00,00,7F HEX 01,01,01,1F HEX 01,01,01,7F HEX 00,00,00,00 M0CODE26 EQU * UPPER CASE F HEX 00,00,00,7F HEX 01,01,01,0F HEX 01,01,01,01 HEX 00,00,00,00 M0CODE27 EQU * UPPER CASE G HEX 00,00,00,3C HEX 42,01,01,01 HEX 71,41,42,3C HEX 00,00,00,00 M0CODE28 EQU * UPPER CASE H HEX 00,00,00,41 HEX 41,41,41,7F HEX 41,41,41,41 HEX 00,00,00,00 M0CODE29 EQU * UPPER CASE I HEX 00,00,00,3E HEX 08,08,08,08 HEX 08,08,08,3E HEX 00,00,00,00 M0CODE2A EQU * UPPER CASE J HEX 00,00,00,7C HEX 10,10,10,10 HEX 10,10,11,0E HEX 00,00,00,00 M0CODE2B EQU * UPPER CASE K HEX 00,00,00,41 HEX 21,11,09,05 HEX 0B,11,21,41 HEX 00,00,00,00 M0CODE2C EQU * UPPER CASE L HEX 00,00,00,01 HEX 01,01,01,01 HEX 01,01,01,7F HEX 00,00,00,00 M0CODE2D EQU * UPPER CASE M HEX 00,00,00,41 HEX 63,55,49,41 HEX 41,41,41,41 HEX 00,00,00,00 M0CODE2E EQU * UPPER CASE N HEX 00,00,00,41 HEX 43,45,45,49 HEX 51,51,61,41 HEX 00,00,00,00 M0CODE2F EQU * UPPER CASE O HEX 00,00,00,1C HEX 22,41,41,41 HEX 41,41,22,1C HEX 00,00,00,00 M0CODE30 EQU * UPPER CASE P HEX 00,00,00,3F HEX 41,41,41,3F HEX 01,01,01,01 HEX 00,00,00,00 M0CODE31 EQU * UPPER CASE Q HEX 00,00,00,1C HEX 22,41,41,41 HEX 41,41,22,1C HEX 08,30,00,00 M0CODE32 EQU * UPPER CASE R HEX 00,00,00,3F HEX 41,41,41,3F HEX 09,11,21,41 HEX 00,00,00,00 M0CODE33 EQU * UPPER CASE S HEX 00,00,00,3E HEX 41,01,01,3E HEX 40,40,41,3E HEX 00,00,00,00 M0CODE34 EQU * UPPER CASE T HEX 00,00,00,7F HEX 08,08,08,08 HEX 08,08,08,08 HEX 00,00,00,00 M0CODE35 EQU * UPPER CASE U HEX 00,00,00,41 HEX 41,41,41,41 HEX 41,41,41,3E HEX 00,00,00,00 M0CODE36 EQU * UPPER CASE V HEX 00,00,00,41 HEX 41,22,22,22 HEX 14,14,08,08 HEX 00,00,00,00 M0CODE37 EQU * UPPER CASE W HEX 00,00,00,41 HEX 41,41,49,49 HEX 49,49,55,22 HEX 00,00,00,00 M0CODE38 EQU * UPPER CASE X HEX 00,00,00,41 HEX 41,22,14,08 HEX 14,22,41,41 HEX 00,00,00,00 M0CODE39 EQU * UPPER CASE Y HEX 00,00,00,41 HEX 41,22,14,08 HEX 08,08,08,08 HEX 00,00,00,00 M0CODE3A EQU * UPPER CASE Z HEX 00,00,00,7F HEX 41,20,10,08 HEX 04,02,41,7F HEX 00,00,00,00 M0CODE3B EQU * LEFT BRACKET HEX 00,00,00,70 HEX 10,10,10,10 HEX 10,10,10,10 HEX 70,00,00,00 M0CODE3C EQU * REVERSE SLASH HEX 00,00,00,00 HEX 00,01,02,04 HEX 08,10,20,40 HEX 00,00,00,00 M0CODE3D EQU * RIGHT BRACKET HEX 00,00,00,07 HEX 04,04,04,04 HEX 04,04,04,04 HEX 07,00,00,00 M0CODE3E EQU * HAT HEX 00,08,14,22 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M0CODE3F EQU * UNDERLINE HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,7F,00,00 M0CODE40 EQU * SMALL REVERSE SLASH HEX 00,02,04,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M0CODE41 EQU * LOWER CASE A HEX 00,00,00,00 HEX 00,00,1E,20 HEX 3E,21,21,5E HEX 00,00,00,00 M0CODE42 EQU * LOWER CASE B HEX 00,00,00,01 HEX 01,01,1D,23 HEX 41,41,23,1D HEX 00,00,00,00 M0CODE43 EQU * LOWER CASE C HEX 00,00,00,00 HEX 00,00,3C,42 HEX 01,01,42,3C HEX 00,00,00,00 M0CODE44 EQU * LOWER CASE D HEX 00,00,00,40 HEX 40,40,5C,62 HEX 41,41,62,5C HEX 00,00,00,00 M0CODE45 EQU * LOWER CASE E HEX 00,00,00,00 HEX 00,00,3C,42 HEX 7F,01,02,7C HEX 00,00,00,00 M0CODE46 EQU * LOWER CASE F HEX 00,00,00,30 HEX 48,08,1C,08 HEX 08,08,08,1C HEX 00,00,00,00 M0CODE47 EQU * LOWER CASE G HEX 00,00,00,00 HEX 00,00,5E,21 HEX 21,1E,01,3E HEX 41,3E,00,00 M0CODE48 EQU * LOWER CASE H HEX 00,00,00,03 HEX 02,02,3A,46 HEX 42,42,42,42 HEX 00,00,00,00 M0CODE49 EQU * LOWER CASE I HEX 00,00,00,08 HEX 00,00,0C,08 HEX 08,08,08,1C HEX 00,00,00,00 M0CODE4A EQU * LOWER CASE J HEX 00,00,00,08 HEX 00,00,0C,08 HEX 08,08,08,08 HEX 08,08,06,00 M0CODE4B EQU * LOWER CASE K HEX 00,00,00,03 HEX 02,02,32,0A HEX 06,0A,12,63 HEX 00,00,00,00 M0CODE4C EQU * LOWER CASE L HEX 00,00,00,0C HEX 08,08,08,08 HEX 08,08,08,1C HEX 00,00,00,00 M0CODE4D EQU * LOWER CASE M HEX 00,00,00,00 HEX 00,00,37,49 HEX 49,49,49,49 HEX 00,00,00,00 M0CODE4E EQU * LOWER CASE N HEX 00,00,00,00 HEX 00,00,3B,46 HEX 42,42,42,42 HEX 00,00,00,00 M0CODE4F EQU * LOWER CASE O HEX 00,00,00,00 HEX 00,00,1C,22 HEX 41,41,22,1C HEX 00,00,00,00 M0CODE50 EQU * LOWER CASE P HEX 00,00,00,00 HEX 00,00,1D,23 HEX 41,41,23,1D HEX 01,01,01,00 M0CODE51 EQU * LOWER CASE Q HEX 00,00,00,00 HEX 00,00,5C,62 HEX 41,41,62,5C HEX 40,40,40,00 M0CODE52 EQU * LOWER CASE R HEX 00,00,00,00 HEX 00,00,3B,46 HEX 02,02,02,02 HEX 00,00,00,00 M0CODE53 EQU * LOWER CASE S HEX 00,00,00,00 HEX 00,00,3E,01 HEX 3E,40,41,3E HEX 00,00,00,00 M0CODE54 EQU * LOWER CASE T HEX 00,00,00,04 HEX 04,04,3F,04 HEX 04,04,04,38 HEX 00,00,00,00 M0CODE55 EQU * LOWER CASE U HEX 00,00,00,00 HEX 00,00,21,21 HEX 21,21,21,5E HEX 00,00,00,00 M0CODE56 EQU * LOWER CASE V HEX 00,00,00,00 HEX 00,00,63,22 HEX 14,14,08,08 HEX 00,00,00,00 M0CODE57 EQU * LOWER CASE W HEX 00,00,00,00 HEX 00,00,41,49 HEX 49,49,55,22 HEX 00,00,00,00 M0CODE58 EQU * LOWER CASE X HEX 00,00,00,00 HEX 00,00,43,24 HEX 18,18,24,42 HEX 00,00,00,00 M0CODE59 EQU * LOWER CASE Y HEX 00,00,00,00 HEX 00,00,41,41 HEX 41,22,14,08 HEX 04,02,01,00 M0CODE5A EQU * LOWER CASE Z HEX 00,00,00,00 HEX 00,00,3F,11 HEX 08,04,22,3F HEX 00,00,00,00 M0CODE5B EQU * LEFT BRACE HEX 00,00,00,60 HEX 10,10,10,10 HEX 08,10,10,10 HEX 10,60,00,00 M0CODE5C EQU * DOUBLE VERTICAL BAR HEX 00,00,0E,0E HEX 0E,0E,00,0E HEX 0E,0E,0E,00 HEX 00,00,00,00 M0CODE5D EQU * RIGHT BRACE HEX 00,00,00,03 HEX 04,04,04,04 HEX 08,04,04,04 HEX 04,03,00,00 M0CODE5E EQU * APPROXIMATION SIGN HEX 00,00,00,00 HEX 00,00,00,4C HEX 32,00,00,00 HEX 00,00,00,00 M0CODE5F EQU * RUBOUT HEX 00,00,00,3E HEX 3E,3E,3E,3E HEX 3E,3E,00,00 HEX 00,00,00,00 M0CODE60 EQU * UNDERLINE CURSOR HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,FF M0CODE61 EQU * CROSSHAIR CURSOR HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,04 HEX 04,1F,04,04 M1CODE00 EQU * SPACE HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE01 EQU * SHORTER SLASH HEX 00,00,00,00 HEX 00,40,20,10 HEX 08,04,02,01 HEX 00,00,00,00 M1CODE02 EQU * EQUIVALENCE SIGN HEX 00,00,00,00 HEX 00,00,3E,00 HEX 3E,00,3E,00 HEX 00,00,00,00 M1CODE03 EQU * TILDE HEX 00,00,4C,32 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE04 EQU * LEFT DOUBLE ARROW HEX 00,00,00,00 HEX 00,08,0C,7A HEX 01,7A,0C,08 HEX 00,00,00,00 M1CODE05 EQU * NOT EQUAL SIGN HEX 00,00,00,00 HEX 00,40,20,7F HEX 08,7F,02,01 HEX 00,00,00,00 M1CODE06 EQU * UP ARROW HEX 00,00,00,00 HEX 00,08,1C,3E HEX 08,08,08,08 HEX 00,00,00,00 M1CODE07 EQU * RIGHT ARROW HEX 00,00,00,00 HEX 00,00,10,30 HEX 7F,30,10,00 HEX 00,00,00,00 M1CODE08 EQU * DOWN ARROW HEX 00,00,00,00 HEX 00,08,08,08 HEX 08,3E,1C,08 HEX 00,00,00,00 M1CODE09 EQU * LEFT ARROW HEX 00,00,00,00 HEX 00,00,04,06 HEX 7F,06,04,00 HEX 00,00,00,00 M1CODE0A EQU * MULTIPLY SIGN HEX 00,00,00,00 HEX 00,00,24,18 HEX 18,24,00,00 HEX 00,00,00,00 M1CODE0B EQU * UPPER CASE SIGMA HEX 00,00,00,7F HEX 02,04,08,10 HEX 08,04,02,7F HEX 00,00,00,00 M1CODE0C EQU * UPPER CASE DELTA HEX 00,00,00,00 HEX 08,08,14,14 HEX 22,22,41,7F HEX 00,00,00,00 M1CODE0D EQU * LOGICAL UNION HEX 00,00,00,00 HEX 00,00,22,22 HEX 22,1C,00,00 HEX 00,00,00,00 M1CODE0E EQU * LOGICAL INTERSECTION HEX 00,00,00,00 HEX 00,00,1C,22 HEX 22,22,00,00 HEX 00,00,00,00 M1CODE0F EQU * DIVIDE SIGN HEX 00,00,00,00 HEX 00,00,08,00 HEX 3E,00,08,00 HEX 00,00,00,00 M1CODE10 EQU * LOWER CASE ALPHA HEX 00,00,00,00 HEX 00,00,46,49 HEX 29,11,19,66 HEX 00,00,00,00 M1CODE11 EQU * LOWER CASE BETA HEX 00,00,00,00 HEX 18,24,22,1E HEX 22,42,42,3E HEX 02,02,01,00 M1CODE12 EQU * LOWER CASE DELTA HEX 00,00,00,0C HEX 12,22,04,0C HEX 12,22,22,1C HEX 00,00,00,00 M1CODE13 EQU * LOWER CASE LAMBDA HEX 00,00,00,02 HEX 04,04,08,08 HEX 14,14,22,22 HEX 00,00,00,00 M1CODE14 EQU * LOWER CASE MU HEX 00,00,00,00 HEX 00,00,24,24 HEX 24,24,24,5C HEX 04,04,03,00 M1CODE15 EQU * LOWER CASE PI HEX 00,00,00,00 HEX 00,40,3E,15 HEX 14,14,14,14 HEX 00,00,00,00 M1CODE16 EQU * LOWER CASE RHO HEX 00,00,00,00 HEX 00,00,30,48 HEX 44,44,26,1A HEX 02,01,01,00 M1CODE17 EQU * LOWER CASE SIGMA HEX 00,00,00,00 HEX 00,00,7C,0A HEX 11,11,11,0E HEX 00,00,00,00 M1CODE18 EQU * LOWER CASE OMEGA HEX 00,00,00,00 HEX 00,00,22,41 HEX 49,49,49,36 HEX 00,00,00,00 M1CODE19 EQU * LESS THAN OR EQUAL TO HEX 00,00,00,00 HEX 30,0C,03,0C HEX 30,00,3F,00 HEX 00,00,00,00 M1CODE1A EQU * GREATER THAN OR EQUAL TO HEX 00,00,00,00 HEX 06,18,60,18 HEX 06,00,7E,00 HEX 00,00,00,00 M1CODE1B EQU * THETA HEX 00,00,00,1C HEX 22,41,41,7F HEX 41,41,22,1C HEX 00,00,00,00 M1CODE1C EQU * SINGLE QUOTE(STRAIGHT) HEX 00,00,00,08 HEX 08,08,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE1D EQU * DEGREE SIGN HEX 00,00,00,0C HEX 12,12,0C,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE1E EQU * VERTICAL BAR HEX 00,00,00,08 HEX 08,08,08,08 HEX 08,08,08,08 HEX 00,00,00,00 M1CODE1F EQU * RIGHT ARROW HEAD HEX 00,00,00,03 HEX 05,09,12,24 HEX 48,24,12,09 HEX 05,03,00,00 M1CODE20 EQU * CENTER OF COPYRIGHT HEX 00,00,7F,00 HEX 00,3C,42,01 HEX 01,42,3C,00 HEX 00,7F,00,00 M1CODE21 EQU * UMLAUT HEX 00,00,00,14 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE22 EQU * SQUARE HEX 00,00,00,00 HEX 00,00,3E,22 HEX 22,3E,00,00 HEX 00,00,00,00 M1CODE23 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE24 EQU * DIAMOND HEX 00,00,00,00 HEX 00,08,1C,3E HEX 7F,3E,1C,08 HEX 00,00,00,00 M1CODE25 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE26 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE27 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE28 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE29 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE2A EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE2B EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE2C EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE2D EQU * MATRIX MULTIPLY HEX 00,00,00,00 HEX 00,00,0C,12 HEX 12,0C,00,00 HEX 00,00,00,00 M1CODE2E EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE2F EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE30 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE31 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE32 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE33 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE34 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE35 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE36 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE37 EQU * PAD HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF M1CODE38 EQU * VECTOR CROSS PRODUCT HEX 00,00,00,00 HEX 00,41,22,14 HEX 08,14,22,41 HEX 00,00,00,00 M1CODE39 EQU * RIGHT ACCENT MARK HEX 00,20,10,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE3A EQU * LEFT ACCENT MARK HEX 00,02,04,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE3B EQU * EMBEDDED RIGHT PAREN HEX 00,00,00,01 HEX 02,04,0C,14 HEX 24,14,0C,06 HEX 01,00,00,00 M1CODE3C EQU * CEDILLA HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,20 HEX 10,08,00,00 M1CODE3D EQU * EMBEDDED LEFT PAREN HEX 00,00,00,40 HEX 20,10,18,14 HEX 12,14,18,30 HEX 40,00,00,00 M1CODE3E EQU * MAD HAT HEX 00,22,14,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE3F EQU * UP AND DOWN ARROWS HEX 00,00,00,00 HEX 00,08,1C,3E HEX 08,3E,1C,08 HEX 00,00,00,00 LENGTH2 EQU *-FWA2 END OF SECOND CHECKSUM AREA EJECT BUFFERS AND DATA STORE AREAS BEGVAR1 EQU * START OF FIRST VARIABLE AREA **************************************** * USER BUFFER * **************************************** USBUF DEFS 1 DIFFERENCE COUNT DEFS 1 INPUT INDEX DEFS 1 OUTPUT INDEX DEFS 16 BUFFER STORE AREA SPACE 2 **************************************** * RECEIVE BUFFER, JOB STACK * **************************************** RXBUF EQU * DEFS 1 DATA WORD COUNT DEFS 1 INPUT INDEX DEFS 1 OUTPUT INDEX DEFS 256 BUFFER STORE AREA SPACE 2 **************************************** * TRANSMIT BUFFER * **************************************** TXBUF EQU * DEFS 1 DATA WORD COUNT DEFS 1 INPUT INDEX DEFS 1 OUTPUT INDEX DEFS 8 DATA STORE AREA SPACE 2 **************************************** * DATA WORD STORE FOR PROCESSING* **************************************** DWORD DEFS 5 SPACE 2 **************************************** * EXTERNAL DEVICE DATA STORE * **************************************** EXTD DEFS 2 EXTERNAL DEVICE DATA EJECT STACK/INTERRUPT TABLE/VARIABLES ENDVAR1 EQU * END OF FIRST VARIABLE AREA **************************************** * VARIABLES SET OR ACCESSED BY THE * * ROM RESIDENT PROGRAM. * * NOTE...THESE ADDRESSES MUST BE FIXED * * AND THEIR VALUES CANNOT BE CHANGED * * BY R.INIT * **************************************** ORG 22D0H+OFFSET CKSUMTBL DEFS 2 START ADDR OF CHECKSUM TABLE CHECKSUM DEFS 1 CHECKSUM SET BY THE LOADER LOADFLAG DEFS 1 3CH=CODE IS LOADED RESETFLG DEFS 1 3CH=DO SIMPLE RESET MODE DEFS 1 OPERATIONS AND MODE **************************************** * PLATO VARIABLES * * NOTE...THESE ADDRESSES MUST BE FIXED * **************************************** ORG 22EAH+OFFSET BEGVAR2 EQU * START OF SECOND VARIABLE AREA M.VERS DEFS 1 CONTROLWARE VERSION - CHANGES * WITH NEW PRODUCTION VERSION M.TYPE DEFS 1 TERMINAL ID CODE M.CLOCK DEFS 2 REAL TIME CLOCK M.EXTPA DEFS 2 INTERNAL INT. PROC. ADDRESS M.MARGIN DEFS 2 MARGIN USED FOR CR M.JOBS DEFS 2 JOB STACK COUNT M.CCR DEFS 2 CHARACTER PLOTTING PARAMETERS M.MODE DEFS 2 TERMINAL OPERATING MODE M.DIR DEFS 2 DIRECTION OF COORDINATE STEP M.KSW DEFS 2 DEVICE INPUT DIRECTOR M.ENAB DEFS 2 INTERNAL INTERRUPT MASK DEFS 2 UNUSED MOD5A DEFS 2 MODE 5 ADDRESS MOD6A DEFS 2 MODE 6 ADDRESS MOD7A DEFS 2 MODE 7 ADDRESS MEM2 DEFS 2 M2 CHARACTER SET ADDRESS MEM3 DEFS 2 M3 CHARACTER SET ADDRESS MEM4 DEFS 2 M4 CHARACTER SET ADDRESS MEM5 DEFS 2 M5 CHARACTER SET ADDRESS MEM6 DEFS 2 M6 CHARACTER SET ADDRESS MEM7 DEFS 2 M7 CHARACTER SET ADDRESS EJECT **************************************** * PROCESSOR STACK * **************************************** DEFS 40H ZSTACK EQU * **************************************** * SCRATCH AREA * **************************************** SPACE 2 SAVE1 DEFS 2 SAVE2 DEFS 12 SAVE8 DEFS 2 SAVE0F DEFS 16 SAVE1F DEFS 16 SAVE2F DEFS 16 SAVE3F DEFS 16 SAVE4F DEFS 16 SAVE5F DEFS 16 CURDATA DEFS 10 TEMP SAVE AREA FOR CURSOR DATA EJECT CONTROLWARE VARIABLES SPACE 2 **************************************** * 'CONTROLWARE 'VARIABLES * **************************************** *********** * PLATO VARIABLES(NOT NECESSARILY PLATO UNIQUE) *********** BLOCKX DEFS 2 BEGINNING X COORD. FOR MODE 4 BLOCKY DEFS 2 BEGINNING Y COORD. FOR MODE 4 XEND DEFS 2 ENDING X COORD FOR MODES 1,4 YEND DEFS 2 ENDING Y COORD FOR MODES 1,4 SAVEL DEFS 2 FOR BLOCK MODE SAVER DEFS 2 FOR BLOCK MODE * THE ABOVE TAGS MUST BE IN THIS ORDER FOR BLOCK MODE BP DEFS 1 COORDINATE BIT POSITION CG.ADR DEFS 2 CHARACTER GENERATOR ADDRESS CHFWA DEFS 2 CHARACTER DATA FWA CONFLG DEFS 1 CONVERT CHAR. DATA FLAG DMAA DEFS 2 DISPLAY MEMORY ADDRESS DMA1 DEFS 2 DISPLAY MEMORY ADDRESS + 200H DMA2 DEFS 2 DISPLAY MEMORY ADDRESS + 400H EXT.IN DEFS 1 EXT. DEVICE INPUT ADDRESS EXT.OUT DEFS 1 EXT. DEVICE OUTPUT ADDRESS LMASK DEFS 1 BLOCK MODE LEFT MASK MEMREG DEFS 2 LOAD MEMORY ADDRESS MEMSEL DEFS 2 CHARACTER MEMORY SELECT ADDR. MODE4CNT DEFS 1 DATA WORD COUNT FOR MODE 4 MMASK DEFS 1 MIDDLE MASK FOR BLOCK MODE NCHARS DEFS 1 CHARACTER CONVERSION COUNT NDATAB DEFS 1 DATA WORD COUNT FOR MODE 2 CON RMASK DEFS 1 RIGHT MASK FOR BLOCK MODE SIZE DEFS 2 CHARACTER SIZE VDMA1 DEFS 2 DMAA - 200H FOR VERTICAL CHAR. VDMA2 DEFS 2 DMAA - 400H FOR VERTICAL CHAR. VECFLG DEFS 1 VECTOR PARAMETER FLAG XDELTA DEFS 2 X AXIS DELTA XREG DEFS 2 CURRENT 9 BIT X COORD. YDELTA DEFS 2 Y AXIS DELTA YREG DEFS 2 CURRENT 9 BIT Y COORD. ********** * 401X/PLATO VARIABLES ********** SPACE 2 BIAS DEFS 2 BIAS OF Y COORD BYPASS DEFS 1 BYPASS CONDITION FLAG CHBASE DEFS 2 401X CHAR DATA BASE ADDR CKSUM DEFS 1 IDLE RAM CHECKSUM CKSUMADD DEFS 2 CURRENT CHECKSUM ADDRESS CKSUMTAD DEFS 2 CURRENT CHECKSUM TABLE ADDRESS CKSUMWC DEFS 2 CURRENT CHECKSUM WORD COUNT CLK.1 DEFS 1 ERR PROTOCOL FLAG CLK.2 DEFS 1 ERR PROTOCOL FLAG CLOCK DEFS 2 BLINK CURSOR CLOCK CMODE DEFS 1 COMMAND MODE CRLFFG DEFS 1 CR/LF FLAG CTLADR DEFS 2 CONTROL CODE BASE ADDR CURSAVED DEFS 1 CURSOR DATA SAVED FLAG DASH DEFS 1 DASH/SOLID VECT FLAG DARK DEFS 1 FLAG FOR DARK VECTOR DOTS DEFS 2 DOT MOVEMENT FOR GIN MODE ESCADR DEFS 2 ESC SEQUENCE BASE ADDR E.CNTR DEFS 1 ERR PROTOCOL FLAG EREG DEFS 1 ERR PROTOCOL FLAG ESEGLEN DEFS 1 ERASE SEGMENT LENGTH COUNT G.CTLFLG DEFS 1 CTL MODE FLAG G.ESC DEFS 1 ESCAPE FLAG G.MEMSEL DEFS 2 BASE ADDR OF SEL CHAR SET G.SIZE DEFS 1 CHARACTER SIZE G.SUPCUR DEFS 1 UPPRESS CURSOR FLAG G.TTYFLG DEFS 1 TTY CAPS LOCK FLAG G.XREG DEFS 2 GIN CROSSHAIR X COORDINATE G.YREG DEFS 2 GIN CROSSHAIR Y COORDINATE GIN.KEY DEFS 1 GIN CHARACTER KEY HEIGHT DEFS 1 CHARACTER HEIGHT HIX DEFS 2 HIGH X BYTE HIY DEFS 2 HIGH Y BYTE LOX DEFS 1 LOW X BYTE LOY DEFS 1 LOW Y BYTE KBAADR DEFS 2 KEYBOARD TO ASCII CONVERT KEYDATA DEFS 1 KEYBOARD DATA FLAG LINEND DEFS 2 LINE END LINT.CTR DEFS 1 LONG INTERVAL INT CTR (MOD 21) LOC.RMT DEFS 1 LOCAL/REMOTE FLAG MREG DEFS 1 ERR PROTOCOL FLAG NBYTES DEFS 1 GET3 BYTE COUNT NREG DEFS 1 ERR PROTOCOL FLAGS PAGEND DEFS 2 PAGE END SAVE DEFS 2 TEMPORARY STORAGE SCALEFG DEFS 1 SCALE/NO SCALE FLAG SH.SUP DEFS 1 ERR PROTOCOL FLAG STATLINE DEFS 1 STATUS LINE ACTIVE FLAG STATUS DEFS 4 STATUS LINE FLAGS TSTAT DEFS 1 TERMINAL STATUS WORD FOR TEK. VECFLAG DEFS 1 WEFLAG DEFS 1 CURSOR W/E FLAG WIDTH DEFS 1 CHARACTER WIDTH FLAG WSEGLEN DEFS 1 SEGMENT LENGTH ENDVAR2 EQU * END OF SECOND VARIABLE AREA FWA3 EQU * START OF THIRD CHECKSUM AREA STRAP DEFW 0022H 401X MODE STRAP OPTIONS SC.OC DEFB 7EH SER CH OUTPUT CONTROL WORD EJECT ********** * UNIMPLEMENTED OR UNDEFINED COMMANDS COME HERE ********** TEMP EQU * RET ********** * ROUTINES TO EXECUTE CONTROL CODES AND ESCAPE SEQUENCES ********** DC1 EQU * LD L,0 SELECT INVERSE VIDEO JR DCX DC2 EQU * LD L,3 SELECT OVERSTRIKE WRITE JR DCX DC3 EQU * LD L,2 SELECT OVERSTRIKE ERASE JR DCX DC4 EQU * LD L,1 SELECT CLEAR WRITE DCX EQU * CALL MODESET1 RET ESC EQU * LD HL,G.ESC SET ESCAPE FLAG LD (HL),1 RET LCOORD EQU * LD A,2 SELECT COMMAND LOAD COORDINATE JR CMDSET * SSPECF EQU * LD A,4 SELECT COMMAND SEL SPEC FN JR CMDSET * LECHO EQU * LD A,6 SELECT COMMAND LOAD ECHO JR CMDSET * LADDR EQU * LD A,8 SELECT COMMAND LOAD ADDRESS JR CMDSET * LEXT EQU * LD A,10 SELECT COMMAND LOAD EXT DATA CMDSET EQU * LD (CMODE),A SAVE COMMAND MODE CMDSET.1 EQU * XOR A CLEAR BYTE COUNTER LD (NBYTES),A RET * LMARG EQU * CALL R.INPX LD A,(M.CCR) AND 01H JR Z,LMARG.1 HORIZONTAL, HL HAS X CALL R.INPY GET Y IN HL LMARG.1 LD (M.MARGIN),HL RET * SLDM2C EQU * SELECT PLATO DATA MODE 2 LD A,1 WITH CONVERT JR SLDM2.1 SLDM2 EQU * SELECT PLATO DATA MODE 2 XOR A WITHOUT CONVERT SLDM2.1 LD (CONFLG),A SET/CLEAR CONVERT FLAG XOR A CLEAR MODE 2 BYTE COUNT LD (NDATAB),A LD C,2 SELECT MODE 2 CALL MODESET2 (LOAD MODE) JR CMDSET.1 * FS.1 EQU * LD C,0 SELECT MODE 0 CALL MODESET2 (POINT PLOT) JR CMDSET.1 * GS.1 EQU * LD C,1 SELECT MODE 1 CALL MODESET2 (GRAPH) LD A,(MODE) LD (DARK),A SELECT DARK VECTORS JR CMDSET.1 * EM.1 EQU * LD C,4 SELECT MODE 4 CALL MODESET2 (BLOCK) XOR A CLEAR TWICE FLAG LD (MODE4CNT),A JR CMDSET.1 US.1 EQU * LD C,3 SELECT MODE 3 CALL MODESET2 (ALPHA) RET MODE567 EQU * LD A,C GET ESC SEQ CHAR (54H,55H,56H) SUB 4FH CHANGE TO 05, 06, 07 LD C,A CALL MODESET2 SELECT MODE (5, 6 OR 7) JR CMDSET.1 EJECT ******************************************************** * THE FOLLOWING CODE AND DATA ARE UNIQUE TO * ASCII OPERATIONS AND MAY BE OVERLAID BY * USER PROGRAMS IF OPERATING ONLY IN PLATO OPERATIONS. ******************************************************** ********* * ASCII INITIALIZE ********** AINIT EQU * LD A,3 SET (M.KSW) TO PUT INPUT DATA LD (M.KSW),A INTO THE USER BUFFER LD HL,100 INITIALIZE BLINK COUNTER LD (CLOCK),HL (BLINK 3 TIMES PER SECOND) LD A,0B5H SET TERMINAL STATUS WORD LD (TSTAT),A LD HL,IGTASC SELECT IGT ASCII KEYBOARD LD (KBAADR),HL LD HL,CTLADR.A SELECT ASCII CTL TBL LD (CTLADR),HL LD HL,ESCADR.A SELECT ASCII ESC SEQ TBL LD (ESCADR),HL CALL ASIZE1 SELECT A0 CHARACTER SET LD HL,0070H SET Y BIAS LD (BIAS),HL XOR A LD (MODE),A SELECT ASCII OPERATIONS LD (SCALEFG),A DO SCALE IN GRAPH MODE LD HL,001EH SET ALPHA/OVERSTRIKE WRITE CALL R.MODE LD HL,256 PUT CROSSHAIR IN CENTER OF LD (G.XREG),HL SCREEN LD (G.YREG),HL CALL AFF CLR SCREEN, HOME, SET ALPHA RET ********** * ASCII 401X IDLE LOOP ********** AIDLE EQU * ASCII IDLE * IN A,(EXTSTAT) CHECK FOR CARRIER * BIT 4,A * JR NZ,AIDLE0 JUMP IF CARRIER OFF * LD A,0DFH CARRIER ON, SO * OUT (PNLLTS),A CLEAR ERROR LIGHT * AIDLE0 EQU * CALL R.EXEC TEST FOR RECEIVE/TRANSMIT DATA CALL R.INPUT TEST FOR DATA FROM OPERATOR LD E,L LD D,H ADD HL,HL TEST IF DATA FROM KB OR TP JR C,AIDLE2 NO DATA, BLINK CURSOR LD A,07 HAVE DATA AND H JR NZ,AIDLE1 JUMP IF NOT KEYBOARD DATA CALL KEY PROCESS KEYBOARD DATA JR AIDLE2 AIDLE1 XOR A LD (KEYDATA),A CLEAR KEYBOARD DATA FLAG LD A,06 AND H CP 02 CALL Z,GIN.TP PROCESS TP DATA * CALL Z,TOUCH PROCESS TP DATA AIDLE2 EQU * CALL BLINK BLINK THE CURSOR JP IDLE EJECT ********** * ROUTINE TO BLINK THE CURSOR ********** BLINK EQU * LD A,(G.SUPCUR) IS THE CURSOR SUPPRESSED OR A RET NZ EXIT IF YES LD HL,(CLOCK) DECREMENT BLINK COUNTER DEC HL LD (CLOCK),HL LD A,L OR H RET NZ EXIT IF NOT ZERO YET LD HL,100 RESET BLINK COUNTER LD (CLOCK),HL CALL CUR.SAVE SAVE CURSOR DATA IF NECESSARY LD HL,WEFLAG TOGGLE CURSOR W/E FLAG LD A,(HL) XOR 01 LD (HL),A ADD A,2 SET B=2 OR 3 LD B,A LD C,60H LD A,(MODE) TEST MODE CP 8 JR NZ,BLINK1 NORMAL CURSOR IF NOT GIN MODE INC C CROSSHAIR CURSOR IF GIN MODE BLINK1 LD HL,(CHBASE) WRITE OR ERASE THE CURSOR CALL JMPHL RET SPACE 4 * SAVE DISPLAY DATA AT THE CURSOR POSITION CUR.SAVE EQU * LD HL,CURSAVED BIT 0,(HL) RET NZ EXIT IF ALREADY SAVED SET 0,(HL) SET SAVED FLAG LD DE,CURDATA+9 POINT TO DATA SAVE AREA LD HL,(DMAA) LEFT HALF OF DATA CALL CUR.SAV1 LD HL,(DMA1) RIGHT HALF OF DATA CUR.SAV1 EQU * LD BC,5 BYTE COUNT CUR.SAV2 LDD (DE)=(HL), DECR DE,HL,BC RET PO EXIT IF BC=0 LD A,L LOOP IF HL NOT 0FFH INC A JR NZ,CUR.SAV2 BIT 0,H LOOP IF H IS EVEN JR Z,CUR.SAV2 INC H COLUMN OVERFLOW, SO REALIGN INC H SET 7,H JR CUR.SAV2 LOOP SPACE 4 * ERASE CURSOR BY RESTORING SAVED DISPLAY DATA CUR.ERAS EQU * LD HL,CURSAVED BIT 0,(HL) RET Z EXIT IF NOTHING SAVED RES 0,(HL) CLEAR SAVED FLAG LD HL,CURDATA+9 POINT TO DATA SAVE AREA LD DE,(DMAA) LEFT HALF OF DATA CALL CUR.ERS1 LD DE,(DMA1) RIGHT HALF OF DATA CUR.ERS1 EQU * LD BC,5 BYTE COUNT CUR.ERS2 LDD (DE)=(HL), DECR DE,HL,BC RET PO EXIT IF BC=0 LD A,E LOOP IF DE NOT 0FFH INC A JR NZ,CUR.ERS2 BIT 0,D LOOP IF D IS EVEN JR Z,CUR.ERS2 INC D COLUMN OVERFLOW, SO REALIGN INC D SET 7,D JR CUR.ERS2 LOOP EJECT ********** * PROCESS KEYBOARD INPUT ********** KEY EQU * LD A,01 SET KEYBOARD DATA FLAG LD (KEYDATA),A CALL KBCON GET ASCII KB DATA IN A AND C RET Z IGNORE UNDEFINED KEYS ADD A,A TEST FOR SPECIAL CODE JP C,SPCODE CARRY, SPECIAL CODE KEY0 EQU * LD HL,G.CTLFLG TEST FOR CTL AS BIT 0,(HL) PREVIOUS KEY JR Z,KEY3 NO, JUMP RES 0,(HL) CLEAR CTL FLAG LD A,C CP 60H IS CODE 60H-7FH JR C,KEY1 NO, JUMP RET Z YES, IGNORE 60H CODE CP 7BH IS CODE 7BH-7FH RET NC YES, IGNORE CODE SUB 60H CHANGE 61H-7AH TO 01H-1AH JR KEY4 KEY1 EQU * CP 40H IS CODE 40H-5FH JR C,KEY2 NO, JUMP AND 0FH YES, CHANGE 4X AND 5X TO 0X JR Z,KEY4 40H AND 50H GENERATE 00H CP 0BH IS CODE NOW 0BH-0FH RET C NO, IGNORE ADD A,10H YES CHANGE TO 1BH-1FH JR KEY4 KEY2 EQU * CP 20H IS CHAR A CTL CODE JR C,XMTEST YES, PROCESS IT CP 39H CTL 9 JR Z,SCALE CP 3DH CTL = JR Z,UNSCALE CP 30H CTL 0 JR Z,ONLINE CP 31H CTL 1 JR Z,OFFLINE RET IGNORE OTHER CODES KEY3 EQU * HAVE A NON-CONTROL CODE LD A,(G.TTYFLG) IS ALL CAPS SELECTED OR A JR Z,XMTEST NO, JUMP LD A,C IS CHAR 61H OR MORE CP 61H JR C,KEY4 NO, JUMP CP 7BH YES, IS IT 7BH OR MORE JR NC,KEY4 YES, JUMP SUB 20H CONVERT 61H-7AH TO 41H-5AH KEY4 EQU * LD C,A SAVE MODIFIED CHAR IN C XMTEST EQU * LD A,(MODE) CP 8 JP Z,GIN.KB DO GIN INPUT IF GIN MODE CALL XMIT.1A TRANSMIT CHAR IF NOT LOCAL CALL R.XJOB PROCESS DATA LOCALLY RET EJECT ********** * THE FOLLOWING CONTROL KEY SEQUENCES PERFORM LOCAL FUNCTIONS ********** OFFLINE EQU * LD A,0DFH CLEAR ERR LIGHT OUT (PNLLTS),A LD A,01 SET LOCAL FLAG JR OFFLINE1 * ONLINE EQU * XOR A CLEAR LOCAL FLAG OFFLINE1 LD (LOC.RMT),A RET * SCALE EQU * XOR A SET SCALE FLAG LD HL,0070H SCREEN BIAS VALUE JR SCALE1 * UNSCALE EQU * LD A,01 CLEAR SCALE FLAG LD HL,0000 SCREEN BIAS VALUE SCALE1 LD (SCALEFG),A LD (BIAS),HL RET SPACE 4 * * * * * * * * * * * * * * * * * * * * * THE FOLLOWING KEYS PERFORM LOCAL FUNCTIONS * * * * * * * * * * * * * * * * * * * * SPCODE EQU * LD C,A LD B,0 LD HL,SPTBL ADD HL,BC LD E,(HL) INC HL LD D,(HL) EX DE,HL JP (HL) SPTBL EQU * DEFW G.CTL DEFW G.RESET DEFW G.TTY DEFW G.TTYLOK DEFW G.PAGE DEFW G.ERASE * DEFW G.HELP SPACE 4 * G.CTL EQU * LD A,01 SET CTL FLAG LD (G.CTLFLG),A RET * G.RESET EQU * CALL CUR.ERAS ERASE CURSOR CALL ASIZE1 RESET TO SIZE 1 CHARACTERS CALL AFF.1 HOME POSITION RET * G.PAGE EQU * CALL AFF CLEAR SCREEN, HOME POSITION RET * G.TTY EQU * CLEAR TTY FLAG XOR A JR G.TTY1 * G.TTYLOK EQU * LD A,01 SET TTY FLAG G.TTY1 LD (G.TTYFLG),A RET * G.ERASE EQU * CALL BS BACKSPACE LD BC,0100H B=W/E BITS, C=CHAR(SPACE) CALL ACHARGEN DISPLAY THE SPACE LD C,08 JP KEY0 ********* * ASCII KEYBOARD TABLE IGTASC EQU * HEX 30,31,32,33 0X HEX 34,35,36,37 HEX 38,39,40,5C HEX 09,5E,2B,2D HEX 7D,1B,FF,08 1X HEX 83,FF,0D,0A * HEX 83,86,0D,0A HEX FF,7F,FF,80 HEX 84,FF,FF,FF HEX 3C,3E,5B,5D 2X HEX 24,25,5F,27 HEX 2A,28,60,7C HEX 09,7E,23,26 HEX 7B,1B,FF,85 3X HEX 82,FF,0D,0A * HEX 82,86,0D,0A HEX FF,7F,FF,80 HEX 81,FF,FF,FF HEX 20,61,62,63 4X HEX 64,65,66,67 HEX 68,69,6A,6B HEX 6C,6D,6E,6F HEX 70,71,72,73 5X HEX 74,75,76,77 HEX 78,79,7A,3D HEX 3B,2F,2E,2C HEX 20,41,42,43 6X HEX 44,45,46,47 HEX 48,49,4A,4B HEX 4C,4D,4E,4F HEX 50,51,52,53 7X HEX 54,55,56,57 HEX 58,59,5A,29 HEX 3A,3F,21,22 EJECT ********** * JUMP TABLE FOR ASCII MODE ESCAPE SEQUENCES ********** ESCADR.A EQU * DEFB 07H BEL DEFW BEL DEFB 08H BS DEFW BS DEFB 0DH CR DEFW ESC DEFB 02H STX DEFW PINIT DEFB 18H CAN DEFW CAN DEFB 60H REVERSE ACCENT DEFW VECTNORM DEFB 61H LC A DEFW VECTDOT DEFB 63H LC C DEFW VECTSDSH DEFB 64H LC D DEFW VECTLDSH DEFB 11H DC1 DEFW DC1 DEFB 12H DC2 DEFW DC2 DEFB 13H DC3 DEFW DC3 DEFB 14H DC4 DEFW DC4 DEFB 05H ENQ DEFW ENQ DEFB 0CH FF DEFW AFF DEFB 1DH GS DEFW GS DEFB 09H HT DEFW HTAB DEFB 0AH LF DEFW ESC DEFB 3BH SEMICOLON DEFW ASIZE1 DEFB 3AH COLON DEFW ASIZE1 DEFB 39H 9 DEFW ASIZE1 DEFB 38H 8 DEFW ASIZE1 DEFB 37H 7 DEFW ASIZE2 DEFB 1AH SUB DEFW ASUB DEFB 1FH US DEFW US DEFB 0BH VT DEFW AVT DEFB 00H NUL DEFW ESC DEFB 1BH ESC DEFW ESC DEFB 0FFH END OF TABLE ********** * JUMP TABLE FOR ASCII MODE CONTROL CODES ********** CTLADR.A EQU * DEFB 0DH CR DEFW ACR DEFB 0AH LF DEFW ALF DEFB 08H BS DEFW BS DEFB 1BH ESC DEFW ESC DEFB 1FH US DEFW US DEFB 1CH FS DEFW FS DEFB 1DH GS DEFW GS DEFB 09H HT DEFW HTAB DEFB 0BH VT DEFW AVT DEFB 07H BEL DEFW BEL DEFB 0FFH END OF TABLE ********** * ROUTINES TO EXECUTE CONTROL CODES AND ESCAPE SEQUENCES ********** BEL EQU * LD A,01H SOUND AUDIBLE ALARM OUT (MISCTL),A XOR A CLEAR BYPASS LD (BYPASS),A RET BS EQU * CALL CUR.ERAS XOR A CLEAR BYPASS LD (BYPASS),A CALL R.INPX MOVE X BACK ONE CHAR WIDTH LD A,(WIDTH) CPL INC A LD E,A LD D,0FFH ADD HL,DE BIT 7,H IF X COORD NEGATIVE JR NZ,BS.SCK GO CHECK CHAR SIZE BS.END EQU * CALL R.OUTX SET NEW X COORD RET BS.SCK EQU * LD A,(G.SIZE) CHECK CHAR SIZE OR A JR NZ,BS.VT JUMP IF SIZE 2 DEC HL SUBT 2 FROM X, SINCE DEC HL SIZE 1 USES ONLY 510 DOTS BS.VT EQU * LD A,L VT REQUIRED IF X NEG CP 0F8H AND LOWER 8 BITS OF X ARE JR NZ,BS.END 0F8H WITH SIZE 2 CHAR CALL R.OUTX CALL VT.1 RET CAN EQU * LD HL,BYPASS SET BYPASS LD (HL),1 RET ACR EQU * CALL US.2 CLR CURSOR,SET ALPHA,CLR BYPASS CALL CR.1 DO CARRIAGE RETURN LD HL,(STRAP) TEST FOR AUTO CR/LF BIT 3,L RET Z RETURN IF NOT SET LD A,(KEYDATA) RETURN IF NOT KEYBOARD DATA OR A RET Z LD (CRLFFG),A SET SCROLL FLAG CALL LF.1A DO A LINE FEED CALL SCROLLCK SEE IF SCROLL REQUIRED CALL SCROLLCL CLEAR SCROLL FLAG RET CR.1 EQU * LD HL,0000H SET TO LEFT MARGIN CALL R.OUTX RET ENQ EQU * LD A,(MODE) IF NOT GIN MODE THEN CP 8 JR Z,ENQ.1 LD A,(TSTAT) SEND TERMINAL STATUS LD C,A CALL XMIT.1A ENQ.1 CALL R.INPX GET X COORD CALL HILO AND SEND IN 2 BYTES LD HL,(BIAS) SAVE -BIAS ON STACK CALL COMPHL PUSH HL CALL R.INPY GET Y COORD POP DE SUBT THE BIAS ADD HL,DE CALL HILO AND SEND IN 2 BYTES LD HL,(STRAP) TEST GIN TRANSMISSION BIT 1,L JR Z,ENQ.2 JUMP IF SEND NOTHING AUTO PUSH HL SAVE STRAP VALUE LD C,0DH SEND CAR RET CALL XMIT.1A POP HL GET SAVED STRAP BIT 2,L JR Z,ENQ.2 SEND CR ONLY LD C,04H SEND EOT CALL XMIT.1A ENQ.2 EQU * CALL GIN.EXIT DISABLE TP, SAVE CURSOR POS. LD HL,MODE TEST MODE LD A,(HL) CP 8 RET NZ EXIT IF NOT GIN MODE LD (HL),3 SET ALPHA MODE RET GIN.EXIT EQU * LD A,(MODE) TEST MODE CP 8 RET NZ JUST EXIT IF NOT GIN MODE CALL CUR.ERAS ERASE THE CURSOR CALL R.INPX SAVE CROSSHAIR POSITION LD (G.XREG),HL INC HL ADJUST FOR CROSSHAIR OFFSET INC HL CALL R.OUTX CALL R.INPY LD (G.YREG),HL INC HL INC HL CALL R.OUTY LD H,04H LOAD INTERRUPT MASK LD A,(M.ENAB) AND 0D8H DISABLE TOUCH PANEL LD L,A CALL R.SSF RET HILO EQU * LD A,(MODE) CHECK MODE CP 8 JR NZ,HILO.2 NO BIAS IF NOT GIN MODE INC HL BIAS FOR CENTER OF CROSSHAIR INC HL HILO.2 LD A,(SCALEFG) IF SCALING THEN OR A JR NZ,HILO.1 ADD HL,HL DOUBLE COORD VALUE HILO.1 LD A,1FH GET LOWER 5 BITS AND L PUSH AF AND TEMP SAVE ADD HL,HL GET UPPER 5 BITS IN H REG. ADD HL,HL ADD HL,HL LD A,H AND 1FH MASK TO 5 BITS OR 20H BIAS VALUE LD C,A CALL XMIT.1A SEND UPPER BITS POP AF GET SAVED LOWER BITS OR 20H BIAS VALUE LD C,A CALL XMIT.1A SEND LOWER BITS RET * CLEAR THE SCREEN AND HOME THE CURSOR AFF EQU * PAGE GETS YOU HERE CALL CUR.ERAS ERASE THE CURSOR CALL BULKER DO BULK ERASE AFF.1 EQU * RESET KEY GETS YOU HERE CALL US.2 SET ALPHA, ENABLE CURSOR CALL CR.1 CARRIAGE RETURN CALL ALF.2 SET TO TOP LINE RET * SELECT POINT PLOT MODE FS EQU * CALL CUR.ERAS ERASE CURSOR LD A,01 SUPPRESS THE CURSOR LD (G.SUPCUR),A XOR A CLEAR BYPASS LD (BYPASS),A LD A,0B5H SET TERMINAL STATUS LD (TSTAT),A CALL GIN.EXIT DISABLE TP, SAVE CURSOR POS. JP FS.1 * SELECT GRAPH MODE GS EQU * CALL CUR.ERAS ERASE CURSOR LD A,01 SUPPRESS THE CURSOR LD (G.SUPCUR),A XOR A CLEAR BYPASS LD (BYPASS),A LD A,0B9H SET TERMINAL STATUS LD (TSTAT),A CALL GIN.EXIT DISABLE TP, SAVE CURSOR POS. JP GS.1 * SELECT ALPHA MODE US EQU * LD A,(MODE) IS THIS GIN MODE CP 8 RET Z YES - EXIT US.2 EQU * CALL CUR.ERAS ERASE THE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A LD (G.SUPCUR),A ENABLE THE CURSOR LD A,0B5H SET TERMINAL STATUS LD (TSTAT),A CALL GIN.EXIT DISABLE TP, SAVE CURSOR POS. JP US.1 SELECT ALPHA MODE * MOVE CURSOR DOWN ONE CHARACTER LINE. ALF EQU * CALL CUR.ERAS ERASE THE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A CALL LF.1A DO A LINE FEED LD A,(KEYDATA) IS THIS KEYBOARD DATA OR A JR Z,LFSCROL JUMP IF NOT LD HL,(STRAP) YES - TEST FOR AUTO. LF/CR BIT 4,L CALL NZ,CR.1 IF AUTO, DO CR LFSCROL EQU * CALL SCROLLCK CALL SCROLLCL RET LF.1A EQU * CALL R.INPY GET CURRENT Y EX DE,HL STORE Y IN DE LD HL,(PAGEND) CHECK FOR PAGEND LD A,D OR A JR NZ,CHANGEY NOT PG BOTTOM. LD A,E CHANGE Y ONLY. CP L JR C,ALF.2 PAGE BOTTOM REACHED * CHANGEY EQU * EX DE,HL JUST CHANGE Y COORD JR LF.3 * ALF.2 EQU * LD HL,200H SET Y TO PAGE TOP * LF.3 EQU * LD A,(HEIGHT) CPL INC A A HAS -HEIGHT LD E,A LD D,0FFH ADD HL,DE CALL R.OUTY RET EJECT * NONDESTRUCTIVE FORWARD SPACE CURSOR ONE CHARACTER POSITION HTAB EQU * CALL CUR.ERAS ERASE THE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A HTAB.1 EQU * LD HL,(XREG) UPDATE X COORDINATE LD A,(WIDTH) LD E,A LD D,0 ADD HL,DE CALL R.OUTX * LINENDCK EQU * CALL R.INPX GET CURRENT X EX DE,HL IN DE LD A,(G.SIZE) CHECK CHAR SIZE OR A JR Z,LEND.S1 LD A,E SIZE 2, SO CHECK X COORD. OR D IF ZERO, IT HAS WRAPPED JR Z,PGCHK SO DO CR/LF. RET * LEND.S1 EQU * LD HL,(LINEND) SIZE 1 AND X AT LINEND. LD A,D DE HAS CURRENT X CP H RET C JR NZ,PGCHK IF LINEND DO CR/LF LD A,E RETURN, LINE FEED. CP L OTHERWISE SIMPLY RETURN. RET C RET Z LD HL,0000H CALL R.OUTX PGCHK EQU * CALL CR.1 CALL LF.1A LD A,(G.SUPCUR) TEST IF CURSOR ON OR A CALL Z,SCROLL SCROLL IF ON CALL SCROLLCL RET * SCROLLCK EQU * LD A,(G.SUPCUR) TEST SUPPRESS CURSOR OR A RET NZ LD A,(CRLFFG) TEST CR/LF SEQUENCE OR A CALL NZ,SCROLL CALL SCROLLCL CLEAR SCROLL FLAG RET SCROLL EQU * LD HL,0000H SET UP X1,Y1 AND X2,Y2 LD (BLOCKX),HL FOR ERASING A LINE LD HL,(LINEND) LD (XEND),HL CALL R.INPY LD (YEND),HL EX DE,HL LD HL,(HEIGHT) DEC HL ADD HL,DE LD (BLOCKY),HL LD A,(M.MODE) TEMP SAVE M.MODE PUSH AF LD L,00H SET ERASE BITS CALL MODESET1 LD HL,BLOCKX ERASE THE LINE CALL R.BLOCK POP AF GET SAVED M.MODE LD (M.MODE),A LD A,(G.SIZE) TEST FOR SIZE 2 CHARS OR A RET NZ EXIT IF SIZE 2 CALL R.INPY SIZE 1, SO GET Y COORD INC HL INC HL ADD 2 CALL R.OUTY AND OUTPUT NEW Y RET ASIZE1 EQU * CALL CUR.ERAS ERASE CURSOR LD HL,A0CODE00 SELECT SIZE 1 LD (G.MEMSEL),HL LD HL,CHGEN.S1 LD (CHBASE),HL LD HL,509 85 CHARS PER LINE LD (LINEND),HL 36 LINES PER PAGE LD HL,PAGEND SET LINEND, PAGEND AND LD (HL),22 HEIGHT ACCORDINGLY LD HL,HEIGHT LD (HL),14 LD HL,WIDTH LD (HL),6 XOR A SET SIZE TO ZERO LD (G.SIZE),A (SIZE 1 CHARS) RET ASIZE2 EQU * CALL CUR.ERAS ERASE CURSOR LD HL,M0CODE00 POINT TO IST CHAR DATA LD (G.MEMSEL),HL LD HL,CHGEN.S2 LD (CHBASE),HL LD HL,511 64 CHARS PER LINE LD (LINEND),HL 32 LINES PER PAGE LD HL,PAGEND SET PAGEND,LINEND AND LD (HL),0 HEIGHT ACCORDINGLY LD HL,HEIGHT LD (HL),16 LD HL,WIDTH LD (HL),8 LD A,1 INDICATE SIZE 2 CHARS LD (G.SIZE),A RET ASUB EQU * CALL CUR.ERAS ERASE CURSOR XOR A ENABLE CURSOR DISPLAY LD (G.SUPCUR),A INC A SET BYPASS LD (BYPASS),A LD H,04H LOAD INTERRUPT MASK LD A,(M.ENAB) OR 20H ENABLE TOUCH PANEL LD L,A CALL R.SSF LD A,8 SELECT GIN MODE LD (MODE),A LD HL,(G.XREG) GET GIN CURSOR POS. CALL R.OUTX LD HL,(G.YREG) CALL R.OUTY RET EJECT VECTNORM EQU * LD HL,DASH LD (HL),0 RET VECTDOT EQU * LD HL,DASH LD (HL),1 LD HL,VECTAB LD A,(HL) LD (WSEGLEN),A INC HL LD A,(HL) LD (ESEGLEN),A RET VECTSDSH EQU * LD HL,DASH LD (HL),1 LD HL,VECTAB+2 LD A,(HL) LD (WSEGLEN),A INC HL LD A,(HL) LD (ESEGLEN),A RET VECTLDSH EQU * LD HL,DASH LD (HL),1 LD HL,VECTAB+4 LD A,(HL) LD (WSEGLEN),A INC HL LD A,(HL) LD (ESEGLEN),A RET * MOVE CURSOR UP ONE CHARACTER LINE AVT EQU * CALL CUR.ERAS ERASE THE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A VT.1 EQU * CALL R.INPY LD A,(HEIGHT) LD E,A LD D,0 ADD HL,DE LD A,(G.SIZE) IF SIZE 2, AUTO WRAP OR A JR NZ,VT.2 LD A,H SIZE 1, CHECK FOR PAGE TOP CP 2 IF Y DOES NOT EXCEED 512, JR C,VT.2 THEN DO A SIMPLE VT LD HL,(PAGEND) OTHERWISE WRAP TO PAGE END LD A,(HEIGHT) PAGEND MINUS HEIGHT CPL INC A LD E,A LD D,0FFH ADD HL,DE VT.2 EQU * CALL R.OUTY RET *KERMIT, 401X DASHED VECTOR HERE G.LINE1 EQU * RET VECTAB EQU * HEX 03,03 DOTTED VECTOR COUNTS HEX 08,03 SHORT DASHED VECTOR COUNTS HEX 10,04 LONG DASHED VECTOR COUNTS EJECT ********** * ASCII ALPHA MODE EXECUTION ********** ALPHMODE EQU * LD A,C GET CHAR CP 7FH RET Z IGNORE IF RUBOUT SUB 20H BIAS CHAR LD C,A CALL SCROLLCL CLEAR SCROLL FLAG LD A,(M.MODE) PUT W/E BITS IN B REG. LD B,A ********** * ASCII MODE CHARACTER GENERATOR. * ON ENTRY THE CHAR-20H IS IN THE C REG. * AND DESIRED WRITE/ERASE BITS ARE IN THE B REG. ********** ACHARGEN EQU * PUSH BC TEMP SAVE CHAR AND W/E BITS CALL CUR.ERAS ERASE THE CURSOR POP BC GET SAVED CHAR AND W/E BITS LD HL,(CHBASE) DISPLAY THE CHARACTER CALL JMPHL CHGEN.S1 OR CHGEN.S2 CALL HTAB.1 MOVE TO NEXT CHAR POSITION RET CHGEN.S2 EQU * 8 BY 16 CHARS EXX SET DATA MASK LD L,00H EXX INC C GET CHAR+1 LD E,0 JR CHGENS1 CHGEN.S1 EQU * 6 BY 14 CHARS EXX SET DATA MASK LD L,0C0H EXX INC C GET CHAR+1 LD E,C CHGENS1 EQU * LD D,0 LD L,C SET IX TO BOTTOM OF CHAR DATA LD H,D ADD HL,HL ADD HL,HL ADD HL,HL SBC HL,DE ADD HL,HL DEC HL EX DE,HL LD IX,(G.MEMSEL) ADD IX,DE LD A,B GET W/E BITS EXX LD C,00H SET UP XOR MASK BIT 0,A CHECK WRITE/ERASE BIT JR NZ,CHGENS1B DEC C C = 0FFH CHGENS1B EQU * LD DE,0FFFFH BIT 1,A CHECK OVERSTRIKE/NORMAL BIT JR NZ,CHGENS1D LD E,L NORMAL, SO PUT DATA MASK IN E LD A,(BP) CHECK BIT POSITION AND 07H JR Z,CHGENS1D DONE IF 0 LD B,A POSITION DATA MASK LD A,D SCF CHGENS1C RL E RLA DJNZ CHGENS1C LD D,A CHGENS1D EQU * FALL INTO CHARACTER GENERATOR EXX ********** * ASCII HORIZONTAL PLOT ********** HPLOTA EQU * LD HL,(DMAA) LD DE,(DMA1) LD A,(HEIGHT) LD B,A HPLOTA1 EQU * LD A,(IX+0) GET CHAR DATA EXX LD L,A HL ';= CHAR DATA LD H,00H LD A,(BP) GET BIT POS AND 07H JR Z,HPLOTA3 LD B,A HPLOTA2 EQU * POSITION CHAR DATA ADD HL,HL DJNZ HPLOTA2 HPLOTA3 EQU * EXX LD A,(HL) MODIFY LEFT PART OF CHAR EXX XOR C AND E OR L XOR C EXX LD (HL),A LD A,(DE) MODIFY RIGHT PART OF CHAR EXX XOR C AND D OR H XOR C EXX LD (DE),A DEC DE UPDATE POINTERS DEC HL DEC IX DEC B RET Z EXIT IF ALL LINES DISPLAYED LD A,L LOOP IF L NOT 0FFH INC A JR NZ,HPLOTA1 BIT 0,H LOOP IF H IS EVEN JR Z,HPLOTA1 INC H COLUMN OVERFLOW INC H SET 7,H INC D INC D SET 7,D JR HPLOTA1 EJECT EJECT * * * * * * * * * * * * * * * * * * * * * * GIN MODE CURSOR POSITIONING VIA TOUCH PANEL * * * * * * * * * * * * * * * * * * * * * GIN.TP EQU * PUSH DE SAVE TP DATA ON STACK CALL CUR.ERAS ERASE CURSOR POP DE RESTORE DATA PUSH DE SAVE DATA AGAIN CALL GIN.TP1 GET Y COORD CALL R.OUTY POP DE DATA IN DE ONCE AGAIN LD A,E RRCA RRCA RRCA RRCA LD E,A CALL GIN.TP1 GET X COORD CALL R.OUTX RET * GIN.TP1 EQU * LD A,0FH MASK WITH LOWER 4 BITS AND E LD L,A LD H,00 HL = TP VALUE * 32 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,14 ADD 14 (BIAS TO SQAURE CENTER) ADD HL,DE RET * * * * * * * * * * * * * * * * * * * * * * GIN MODE CURSOR POSITIONING VIA KEYBOARD * AND GIN MODE TRANSMISSION * * * * * * * * * * * * * * * * * * * * * GIN.KB EQU * LD A,C IS CHAR A CR CP 0DH JR Z,GIN.XMT SEND LAST KEY IF YES GIN.1 EQU * LD A,C SAVE GIN CHAR KEY LD (GIN.KEY),A LD HL,1 ASSUME FINE GRID BIT 5,A LOOK AT BIT 5 JR NZ,GIN.2 FINE GRID IF SET ADD HL,HL COARSE GRID IF CLEAR ADD HL,HL GIN.2 LD (DOTS),HL SAVE GRID MOVEMENT VALUE LD A,C GET SAVED CHAR CODE AND 0DFH CLEAR BIT 5 LD B,A AND SAVE IN B REG LD HL,MOVTAB SEARCH CURSOR MOVE TABLE GIN.3 EQU * FOR THE CHAR LD A,(HL) CP 0FFH JR Z,GIN.XMT JUMP IF NOT A CURSOR MOVE KEY CP B CHECK FOR MATCH JR Z,MOVCURS JUMP IF MATCH INC HL UPDATE TO NEXT TABLE ENTRY INC HL INC HL JR GIN.3 MOVCURS EQU * INC HL MATCH FOUND LD E,(HL) JUMP TO CURSOR MOVE ROUTINE INC HL LD D,(HL) PUSH DE TEMP SAVE ADDRESS CALL CUR.ERAS ERASE THE CURSOR POP HL THEN GET SAVED ADDRESS CALL JMPHL AND DO THE JUMP RET GIN.XMT EQU * LD A,(GIN.KEY) SEND LAST KEY STORED LD C,A CALL XMIT.1A CALL ENQ.1 SEND CURSOR POSITION RET MOVTAB EQU * TABLE OF CURSOR MOVE KEYS DEFB 41H UC A DEFW WEST DEFB 43H UC C DEFW SEAST DEFB 44H UC D DEFW EAST DEFB 45H UC E DEFW NEAST DEFB 51H UC Q DEFW NWEST DEFB 57H UC W DEFW NORTH DEFB 58H UC X DEFW SOUTH DEFB 5AH UC Z DEFW SWEST DEFB 0FFH END OF TABLE SEAST EQU * CALL SOUTH EAST EQU * CALL R.INPX LD DE,(DOTS) ADD HL,DE CALL R.OUTX RET NEAST EQU * CALL EAST NORTH EQU * CALL R.INPY LD DE,(DOTS) ADD HL,DE CALL R.OUTY RET NWEST EQU * CALL NORTH WEST EQU * CALL R.INPX LD DE,(DOTS) OR A SBC HL,DE CALL R.OUTX RET SWEST EQU * CALL WEST SOUTH EQU * CALL R.INPY LD DE,(DOTS) OR A SBC HL,DE CALL R.OUTY RET * EJECT ** SELECT OR DESELECT STATUS LINE DISPLAY MODE *G.HELP EQU * * LD A,(MODE) IGNORE IF GIN MODE * CP 8 * RET Z * * LD HL,STATLINE * LD A,(HL) TOGGLE STATUS LINE FLAG * XOR 20H * LD (HL),A * LD B,A * LD H,04H ENABLE OR DISABLE TOUCH PANEL * LD A,(M.ENAB) * RES 5,A * OR B * LD L,A * CALL R.SSF * * LD A,(STATLINE) IF STATUS LINE SELECTED * OR A * JR NZ,DSTAT THEN DISPLAY IT * ** CLEAR STATUS LINE ** CLEARS FROM Y=14 THROUGH Y=27 ACROSS ENTIRE SCREEN *STAT.ERS EQU * * LD H,80H *STAT.ER1 EQU * * INC H * LD D,H * LD L,0E4H * LD E,0E5H * LD BC,13 * LD (HL),0 * LDIR * INC H * JR NZ,STAT.ER1 * RET * ** INTERPRET WHAT TO DO WITH TOUCH PANEL DATA *TOUCH EQU * * LD A,(MODE) ARE WE IN GIN MODE * CP 8 * JP Z,GIN.TP YES, HANDLE AS GIN INPUT * ** UPDATE STATUS LINE DISPLAY VIA THE TOUCH PANEL. ** ON ENTRY E7-E4 IS X COORD AND E3-E0 IS Y COORD. *STAT.UP EQU * * LD A,E SET BC=X COORD DIV 2 * RLCA * RLCA * RLCA * AND 7 * CP 4 IGNORE TOUCH IF X TOO LARGE * RET NC * LD C,A * LD B,0 * ADD A,C SET DE=3*(X COORD DIV 2) * ADD A,C * LD E,A * LD D,B * LD HL,STATTBL+2 FIND THE FIELD TO CHANGE * ADD HL,DE * LD A,(HL) GET NO. OF FIELD VALUES * LD HL,STATUS * ADD HL,BC * INC (HL) INCR SELECTED FIELD VALUE * SUB (HL) * JR NZ,DSTAT * LD (HL),A RESET IF OVERFLOW * ** DISPLAY THE CURRENT VALUES ON THE STATUS LINE *DSTAT EQU * * CALL CUR.ERAS ERASE THE CURSOR * CALL R.INPX SAVE XY AND SET TO * LD (G.XREG),HL STATUS LINE VALUES * CALL R.INPY * LD (G.YREG),HL * LD HL,6 * CALL R.OUTX * LD HL,14 * CALL R.OUTY * CALL STAT.ERS ERASE STATUS LINE * LD HL,STATUS * PUSH HL * LD C,4 * LD HL,STATTBL *DSTAT1 EQU * * LD E,(HL) FIND THE CURRENT FIELD INFO * INC HL * LD D,(HL) DE=ADDRESS OF MESSAGE * INC HL * INC HL * EX (SP),HL * LD B,(HL) B=CURRENT FIELD FLAG VALUE * INC HL * EX (SP),HL * INC B * JR DSTAT3 * *DSTAT2 EQU * * LD A,(DE) * INC DE * OR A * JR NZ,DSTAT2 * *DSTAT3 EQU * * DJNZ DSTAT2 * *DSTAT4 EQU * * LD A,(DE) GET FIRST CHAR OF THE FIELD * PUSH BC NOW DISPLAY THE WORD * PUSH HL * *DSTAT5 EQU * * LD C,A CHAR TO C * LD B,1 SET W/E BITS IN B FOR REWRITE * PUSH DE * CALL ACHARGEN DISPLAY THE CHAR * POP DE * INC DE * LD A,(DE) * OR A * JR NZ,DSTAT5 * *DSTAT6 EQU * * CALL R.INPX ADVANCE TO THE NEXT FIELD *DSTAT7 EQU * * INC HL * LD A,L * AND 3FH * CP 6 * JR NZ,DSTAT7 * CALL R.OUTX * * POP HL * POP BC * DEC C * JR NZ,DSTAT1 * * POP HL JUNK STATUS POINTER * LD HL,(G.XREG) RETURN SAVED X AND Y POS. * CALL R.OUTX * LD HL,(G.YREG) * CALL R.OUTY * RET * ** DATA FOR STATUS LINE FIELDS *STATTBL EQU * * DEFW LNLOCMSG * DEFB 2 * DEFW BAUDMSG * DEFB 2 * DEFW SCALEMSG * DEFB 2 * DEFW CAPSMSG * DEFB 2 * *LNLOCMSG EQU * * HEX 2C,29,2E,25,00 LINE * HEX 2C,2F,23,21,2C,00 LOCAL *BAUDMSG EQU * * HEX 11,12,10,10,00 1200 * HEX 13,10,10,00 300 *SCALEMSG EQU * * HEX 33,23,21,2C,25,00 SCALE * HEX 35,2E,33,23,21,2C,25,00 UNSCALE *CAPSMSG EQU * * HEX 23,21,30,33,00 CAPS * HEX 21,2C,2C,00 ALL EJECT * SMALL SIZE 6 BY 14 CHARACTERS * A0CODE00 EQU * SPACE HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00 A0CODE01 EQU * EXCLAMATION MARK HEX 00,00,04,04 HEX 04,04,04,04 HEX 00,00,04,00 HEX 00,00 A0CODE02 EQU * DOUBLE QUOTES HEX 00,00,0A,0A HEX 0A,00,00,00 HEX 00,00,00,00 HEX 00,00 A0CODE03 EQU * NUMBER SIGN HEX 00,00,0A,0A HEX 1F,0A,1F,0A HEX 0A,00,00,00 HEX 00,00 A0CODE04 EQU * DOLLAR SIGN HEX 00,00,04,0E HEX 15,05,0E,14 HEX 15,0E,04,00 HEX 00,00 A0CODE05 EQU * PERCENT SIGN HEX 00,00,00,00 HEX 03,13,08,04 HEX 02,19,18,00 HEX 00,00 A0CODE06 EQU * AMPERSAND HEX 00,00,04,0A HEX 0A,04,16,09 HEX 09,09,16,00 HEX 00,00 A0CODE07 EQU * SINGLE QUOTE HEX 00,00,08,04 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00 A0CODE08 EQU * LEFT PAREN HEX 00,00,10,08 HEX 04,04,04,04 HEX 04,04,08,10 HEX 00,00 A0CODE09 EQU * RIGHT PAREN HEX 00,00,01,02 HEX 04,04,04,04 HEX 04,04,02,01 HEX 00,00 A0CODE0A EQU * ASTERISK HEX 00,00,00,00 HEX 04,15,0A,0A HEX 15,04,00,00 HEX 00,00 A0CODE0B EQU * PLUS HEX 00,00,00,00 HEX 00,04,04,1F HEX 04,04,00,00 HEX 00,00 A0CODE0C EQU * COMMA HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,06,06,04 HEX 02,00 A0CODE0D EQU * MINUS HEX 00,00,00,00 HEX 00,00,00,1F HEX 00,00,00,00 HEX 00,00 A0CODE0E EQU * PERIOD HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,06,06,00 HEX 00,00 A0CODE0F EQU * SLASH HEX 00,00,00,00 HEX 00,10,08,04 HEX 02,01,00,00 HEX 00,00 A0CODE10 EQU * NUMERAL ZERO HEX 00,00,00,0E HEX 11,11,19,15 HEX 13,11,0E,00 HEX 00,00 A0CODE11 EQU * NUMERAL ONE HEX 00,00,00,04 HEX 06,04,04,04 HEX 04,04,0E,00 HEX 00,00 A0CODE12 EQU * NUMERAL TWO HEX 00,00,00,0E HEX 11,10,08,04 HEX 02,01,1F,00 HEX 00,00 A0CODE13 EQU * NUMERAL THREE HEX 00,00,00,0E HEX 11,10,0C,10 HEX 10,11,0E,00 HEX 00,00 A0CODE14 EQU * NUMERAL FOUR HEX 00,00,00,10 HEX 18,14,12,1F HEX 10,10,10,00 HEX 00,00 A0CODE15 EQU * NUMERAL FIVE HEX 00,00,00,1F HEX 01,01,0F,10 HEX 10,10,0F,00 HEX 00,00 A0CODE16 EQU * NUMERAL SIX HEX 00,00,00,0C HEX 02,01,0F,11 HEX 11,11,0E,00 HEX 00,00 A0CODE17 EQU * NUMERAL SEVEN HEX 00,00,00,1F HEX 10,08,08,04 HEX 04,02,02,00 HEX 00,00 A0CODE18 EQU * NUMERAL EIGHT HEX 00,00,00,0E HEX 11,11,0E,11 HEX 11,11,0E,00 HEX 00,00 A0CODE19 EQU * NUMERAL NINE HEX 00,00,00,0E HEX 11,11,11,1E HEX 10,08,06,00 HEX 00,00 A0CODE1A EQU * COLON HEX 00,00,00,00 HEX 00,06,06,00 HEX 00,06,06,00 HEX 00,00 A0CODE1B EQU * SEMICOLON HEX 00,00,00,00 HEX 00,06,06,00 HEX 00,06,06,02 HEX 01,00 A0CODE1C EQU * LESS THAN HEX 00,00,00,00 HEX 08,04,02,01 HEX 02,04,08,00 HEX 00,00 A0CODE1D EQU * EQUALS HEX 00,00,00,00 HEX 00,00,1F,00 HEX 1F,00,00,00 HEX 00,00 A0CODE1E EQU * GREATER THAN HEX 00,00,00,00 HEX 02,04,08,10 HEX 08,04,02,00 HEX 00,00 A0CODE1F EQU * QUESTION MARK HEX 00,00,0E,11 HEX 11,08,04,04 HEX 04,00,04,00 HEX 00,00 A0CODE20 EQU * COMMERCIAL AT HEX 00,00,00,00 HEX 00,0E,11,1D HEX 1D,09,02,1C HEX 00,00 A0CODE21 EQU * UPPER CASE A HEX 00,00,04,0A HEX 11,11,1F,11 HEX 11,11,11,00 HEX 00,00 A0CODE22 EQU * UPPER CASE B HEX 00,00,0F,11 HEX 11,0F,11,11 HEX 11,11,0F,00 HEX 00,00 A0CODE23 EQU * UPPER CASE C HEX 00,00,0E,11 HEX 01,01,01,01 HEX 01,11,0E,00 HEX 00,00 A0CODE24 EQU * UPPER CASE D HEX 00,00,07,09 HEX 11,11,11,11 HEX 11,09,07,00 HEX 00,00 A0CODE25 EQU * UPPER CASE E HEX 00,00,1F,01 HEX 01,01,0F,01 HEX 01,01,1F,00 HEX 00,00 A0CODE26 EQU * UPPER CASE F HEX 00,00,1F,01 HEX 01,01,0F,01 HEX 01,01,01,00 HEX 00,00 A0CODE27 EQU * UPPER CASE G HEX 00,00,0E,11 HEX 11,01,01,1D HEX 11,11,0E,00 HEX 00,00 A0CODE28 EQU * UPPER CASE H HEX 00,00,11,11 HEX 11,11,1F,11 HEX 11,11,11,00 HEX 00,00 A0CODE29 EQU * UPPER CASE I HEX 00,00,1F,04 HEX 04,04,04,04 HEX 04,04,1F,00 HEX 00,00 A0CODE2A EQU * UPPER CASE J HEX 00,00,1C,08 HEX 08,08,08,08 HEX 08,09,06,00 HEX 00,00 A0CODE2B EQU * UPPER CASE K HEX 00,00,11,11 HEX 09,05,03,03 HEX 05,09,11,00 HEX 00,00 A0CODE2C EQU * UPPER CASE L HEX 00,00,01,01 HEX 01,01,01,01 HEX 01,01,1F,00 HEX 00,00 A0CODE2D EQU * UPPER CASE M HEX 00,00,11,1B HEX 15,11,11,11 HEX 11,11,11,00 HEX 00,00 A0CODE2E EQU * UPPER CASE N HEX 00,00,11,13 HEX 13,15,15,19 HEX 19,19,11,00 HEX 00,00 A0CODE2F EQU * UPPER CASE O HEX 00,00,0E,11 HEX 11,11,11,11 HEX 11,11,0E,00 HEX 00,00 A0CODE30 EQU * UPPER CASE P HEX 00,00,0F,11 HEX 11,11,0F,01 HEX 01,01,01,00 HEX 00,00 A0CODE31 EQU * UPPER CASE Q HEX 00,00,0E,11 HEX 11,11,11,11 HEX 11,11,0E,08 HEX 10,00 A0CODE32 EQU * UPPER CASE R HEX 00,00,0F,11 HEX 11,11,0F,03 HEX 05,09,11,00 HEX 00,00 A0CODE33 EQU * UPPER CASE S HEX 00,00,0E,11 HEX 01,01,0E,10 HEX 10,11,0E,00 HEX 00,00 A0CODE34 EQU * UPPER CASE T HEX 00,00,1F,04 HEX 04,04,04,04 HEX 04,04,04,00 HEX 00,00 A0CODE35 EQU * UPPER CASE U HEX 00,00,11,11 HEX 11,11,11,11 HEX 11,11,0E,00 HEX 00,00 A0CODE36 EQU * UPPER CASE V HEX 00,00,11,11 HEX 11,11,0A,0A HEX 0A,04,04,00 HEX 00,00 A0CODE37 EQU * UPPER CASE W HEX 00,00,11,11 HEX 11,11,11,11 HEX 15,1B,11,00 HEX 00,00 A0CODE38 EQU * UPPER CASE X HEX 00,00,11,11 HEX 0A,04,04,0A HEX 0A,11,11,00 HEX 00,00 A0CODE39 EQU * UPPER CASE Y HEX 00,00,11,11 HEX 11,0E,04,04 HEX 04,04,04,00 HEX 00,00 A0CODE3A EQU * UPPER CASE Z HEX 00,00,1F,11 HEX 10,08,04,02 HEX 01,11,1F,00 HEX 00,00 A0CODE3B EQU * LEFT BRACKET HEX 00,00,1C,04 HEX 04,04,04,04 HEX 04,04,04,1C HEX 00,00 A0CODE3C EQU * REVERSE SLASH HEX 00,00,00,00 HEX 00,01,02,04 HEX 08,10,00,00 HEX 00,00 A0CODE3D EQU * RIGHT BRACKET HEX 00,00,07,04 HEX 04,04,04,04 HEX 04,04,04,07 HEX 00,00 A0CODE3E EQU * HAT HEX 00,00,00,04 HEX 0A,11,00,00 HEX 00,00,00,00 HEX 00,00 A0CODE3F EQU * UNDERLINE HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 1F,00 A0CODE40 EQU * SMALL REVERSE SLASH HEX 00,00,04,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00 A0CODE41 EQU * LOWER CASE A HEX 00,00,00,00 HEX 00,0E,10,1E HEX 11,11,1E,00 HEX 00,00 A0CODE42 EQU * LOWER CASE B HEX 00,00,01,01 HEX 01,0D,13,11 HEX 11,13,0D,00 HEX 00,00 A0CODE43 EQU * LOWER CASE C HEX 00,00,00,00 HEX 00,0E,11,01 HEX 01,11,0E,00 HEX 00,00 A0CODE44 EQU * LOWER CASE D HEX 00,00,10,10 HEX 10,1E,11,11 HEX 11,11,1E,00 HEX 00,00 A0CODE45 EQU * LOWER CASE E HEX 00,00,00,00 HEX 00,0E,11,1F HEX 01,01,1E,00 HEX 00,00 A0CODE46 EQU * LOWER CASE F HEX 00,00,0C,12 HEX 02,07,02,02 HEX 02,02,07,00 HEX 00,00 A0CODE47 EQU * LOWER CASE G HEX 00,00,00,00 HEX 10,0E,11,11 HEX 0E,01,0E,11 HEX 0E,00 A0CODE48 EQU * LOWER CASE H HEX 00,00,01,01 HEX 01,0D,13,11 HEX 11,11,11,00 HEX 00,00 A0CODE49 EQU * LOWER CASE I HEX 00,00,04,00 HEX 00,06,04,04 HEX 04,04,0E,00 HEX 00,00 A0CODE4A EQU * LOWER CASE J HEX 00,00,04,00 HEX 00,06,04,04 HEX 04,04,04,04 HEX 03,00 A0CODE4B EQU * LOWER CASE K HEX 00,00,01,01 HEX 01,11,09,07 HEX 05,09,11,00 HEX 00,00 A0CODE4C EQU * LOWER CASE L HEX 00,00,06,04 HEX 04,04,04,04 HEX 04,04,0E,00 HEX 00,00 A0CODE4D EQU * LOWER CASE M HEX 00,00,00,00 HEX 00,1B,15,15 HEX 15,15,15,00 HEX 00,00 A0CODE4E EQU * LOWER CASE N HEX 00,00,00,00 HEX 00,0D,13,11 HEX 11,11,11,00 HEX 00,00 A0CODE4F EQU * LOWER CASE O HEX 00,00,00,00 HEX 00,0E,11,11 HEX 11,11,0E,00 HEX 00,00 A0CODE50 EQU * LOWER CASE P HEX 00,00,00,00 HEX 00,0F,11,11 HEX 11,11,0F,01 HEX 01,01 A0CODE51 EQU * LOWER CASE Q HEX 00,00,00,00 HEX 00,1E,11,11 HEX 11,11,1E,10 HEX 10,10 A0CODE52 EQU * LOWER CASE R HEX 00,00,00,00 HEX 00,0D,13,01 HEX 01,01,01,00 HEX 00,00 A0CODE53 EQU * LOWER CASE S HEX 00,00,00,00 HEX 00,1E,01,0E HEX 10,11,0E,00 HEX 00,00 A0CODE54 EQU * LOWER CASE T HEX 00,00,04,04 HEX 04,1F,04,04 HEX 04,04,18,00 HEX 00,00 A0CODE55 EQU * LOWER CASE U HEX 00,00,00,00 HEX 00,11,11,11 HEX 11,11,0E,00 HEX 00,00 A0CODE56 EQU * LOWER CASE V HEX 00,00,00,00 HEX 00,11,11,0A HEX 0A,04,04,00 HEX 00,00 A0CODE57 EQU * LOWER CASE W HEX 00,00,00,00 HEX 00,11,11,11 HEX 15,15,0A,00 HEX 00,00 A0CODE58 EQU * LOWER CASE X HEX 00,00,00,00 HEX 00,11,0A,04 HEX 04,0A,11,00 HEX 00,00 A0CODE59 EQU * LOWER CASE Y HEX 00,00,00,00 HEX 00,11,11,11 HEX 12,0C,08,04 HEX 02,01 A0CODE5A EQU * LOWER CASE Z HEX 00,00,00,00 HEX 00,1F,11,08 HEX 04,12,1F,00 HEX 00,00 A0CODE5B EQU * LEFT BRACE HEX 00,00,18,04 HEX 04,04,04,02 HEX 04,04,04,04 HEX 18,00 A0CODE5C EQU * ELONGATED COLON HEX 00,00,06,06 HEX 06,06,00,06 HEX 06,06,06,00 HEX 00,00 A0CODE5D EQU * RIGHT BRACE HEX 00,00,03,04 HEX 04,04,04,08 HEX 04,04,04,04 HEX 03,00 A0CODE5E EQU * APPROXIMATE HEX 00,00,12,0D HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00 A0CODE5F EQU * RUBOUT HEX 00,00,00,1F HEX 1F,1F,1F,1F HEX 1F,1F,00,00 HEX 00,00 A0CODE60 EQU * UNDERLINE CURSOR HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,3F A0CODE61 EQU * CROSSHAIR CURSOR HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,04,04,1F HEX 04,04 LENGTH3 EQU *-FWA3 END OF THIRD CHECKSUM AREA END $EOF