AIST3 * /--- FILE TYPE = E * /--- BLOCK AIST3 00 000 73/00/00 00.00 IDENT AIST3 ORG 0040H OFFSET EQU *-40H SPACE 15 * * * * * * * * * * * * * * * * * * * * * * INFORMATION SYSTEMS TERMINAL 3 (IST-III) * ASCII RAM RESIDENT LOAD FILE * PROCESSOR...Z80 * * VERSION 02 03/30/81 DSN LOAD FILE 00 * * CC 15632600 CONTROLWARE ID MF401-JO2 * TLA 15632812 * * CONTAINS THE FOLLOWING CODE. * 1. ASCII/PLATO RESIDENT CODE SEE ERS 16042872. * 2. ASCII/GRAPHICS RESIDENT CODE SEE ERS 16042873. * 3. ASCII/TIMESHARE RESIDENT CODE SEE ERS 16042874. * * SCREEN COPY IS AVAILABLE IN ALL THREE MODES. * COMM LINE PRINT IS AVAILABLE IN TIMESHARE AND * GRAPHIC MODES. * * THIS FILE IS INTENDED TO BE LOADED WITH THE ASCII LOADER. * SEE ERS 16042871. * * * * * * * * * * * * * * * * * * * * * SPACE 4 * COPYRIGHT CONTROL DATA CORPORATION 1980 * FOR INTERNAL USE ONLY * NOT A RELEASED PRODUCT EJECT * * * * * * * * * * * * * * * * * * * * * * SWITCH ASSIGNMENTS * * * * * * * * * * * * * * * * * * * * * * * FRONT PANEL SWITCHES * * -CLOSED/ON/0- -OPEN/OFF/1- * SE-1 NORMAL LOAD FILE SELECT LOAD FILE * SE-2 INTERNAL LOAD SOURCE EXTERNAL LOAD SOURCE * SE-3 HOST LOAD SOURCE LOCAL LOAD SOURCE * SE-4 SKIP DIAGNOSTICS RUN DIAGNOSTICS * SE-5 SKIP KB/TP TEST RUN KB/TP TEST * SE-6 LOUD BEEPER SOFT BEEPER * SE-7 (NOT USED) * SE-8 HALF DUPLEX FULL DUPLEX * SE-9 ODD PARITY EVEN PARITY * SE-10 PARITY OFF PARITY ON * * CONFIGURATION SWITCHES * * -CLOSED/ON/0- -OPEN/OFF/1- * S2-1 SWITCHED DTR CONSTANT DTR * S2-2 (NOT USED) * S2-3 PCN TRANSMIT RATE SELECT * S2-4 PCN TRANSMIT RATE SELECT * S2-5 PCN TRANSMIT RATE SELECT * S2-6 (NOT USED) * S2-7 SECONDARY CHAN XMIT PRIMARY CHAN XMIT * S2-8 EXIT DIAGNOSTICS LOOP ON DIAGNOSTICS * S2-9 NO TOUCH PANEL TOUCH PANEL PRESENT * S2-10 16K RAM 32K RAM * * INTERNAL SWITCHES * * -CLOSED/ON/0- -OPEN/OFF/1- * S5-1 PCN DEFAULT LOAD FILE SELECT BIT 0 * S5-2 PCN DEFAULT LOAD FILE SELECT BIT 1 * S5-3 ASCII DEFAULT LOAD FILE SELECT BIT 0 * S5-4 ASCII DEFAULT LOAD FILE SELECT BIT 1 * S5-5 (NOT USED) * S5-6 DEFAULT ASCII COMM DATA RATE SELECT BIT 0 * S5-7 DEFAULT ASCII COMM DATA RATE SELECT BIT 1 * S5-8 DEFAULT ASCII COMM DATA RATE SELECT BIT 2 * * * * * * * * * * * * * * * * * * * * * * /--- BLOCK AIST3 00 000 73/00/00 00.00 * BIT ASSIGNMENTS FOR INPUT ADDRESSES * * * * * * * * * * * * * * * * * * * * * * INPUT ADDRESS 00 (MAINTENANCE SWITCHES) * 7 S2-8 (1=LOOP ON DIAG, 0=EXIT DIAG) * 6 S2-9 (1=TP PRESENT, 0=NO TP) * 5 S2-10(1=32K RAM, 0=16K RAM) * 4 SE-5 (1=DO KB/TP TEST, 0=SKIP KB/TP TEST) * 3 SE-4 (1=DO DIAGNOSTICS, 0=SKIP DIAGNOSTICS) * 2 SE-3 (1=LOCAL LOAD SOURCE, 0=HOST LOAD SOURCE) * 1 SE-2 (1=EXTERNAL LOAD, 0=INTERNAL LOAD) * 0 SE-1 (1=SELECT LOAD, 0=NORMAL LOAD) * INPUT ADDRESS 01 (KEYBOARD INPUT DATA) * 7 KEYBOARD BIT 7, CONTROL BIT (1=ON, 0=OFF) * 6 KEYBOARD BIT 6 * 5 KEYBOARD BIT 5, SHIFT BIT (1=ON, 0=OFF) * 4 KEYBOARD BIT 4 * 3 KEYBOARD BIT 3 * 2 KEYBOARD BIT 2 * 1 KEYBOARD BIT 1 * 0 KEYBOARD BIT 0 * INPUT ADDRESS 02 (TOUCH PANEL INPUT DATA) * 7-4 X POSITION BITS 3-0 * 3-0 Y POSITION BITS 3-0 * INPUT ADDRESS 03 (LOWER ID BITS) * INPUT ADDRESS 04 (UPPER ID BITS) * INPUT ADDRESS 05 (INTERNAL SWITCHES) * 7 S5-8 ASCII DEFAULT COMM DATA RATE SELECT BIT 2* * 6 S5-7 ASCII DEFAULT COMM DATA RATE SELECT BIT 1* * 5 S5-6 ASCII DEFAULT COMM DATA RATE SELECT BIT 0* * 4 S5-5 (1=OPEN, 0=CLOSED) * 3 S5-4 ASCII DEFAULT LOAD FILE SELECT BIT 1 * 2 S5-3 ASCII DEFAULT LOAD FILE SELECT BIT 0 * 1 S5-2 PCN DEFAULT LOAD FILE SELECT BIT 1 * 0 S5-1 PCN DEFAULT LOAD FILE SELECT BIT 0 * * *NOTE. * SWITCHES 8-6 ARE USED TO SELECT ASCII COMM * DEFAULT DATA RATE FOR LOADER AND RESIDENT. * RATES ARE AS FOLLOWS. * SW 8-6 X64 CLOCK X32 CLOCK X16 CLOCK * 0 75 BPS 150 BPS 300 BPS * 1 150 BPS 300 BPS 600 BPS * 2 300 BPS 600 BPS 1200 BPS * 3 600 BPS 1200 BPS 2400 BPS * 4 1200 BPS 2400 BPS 4800 BPS * 5 2400 BPS 4800 BPS 9600 BPS * 6 4800 BPS 9600 BPS 19200 BPS * 7 EXT CLK X1 EXT CLK X1 EXT CLK X1 * INPUT ADDRESS 06 (COMMUNICATIONS SWITCHES AND STATUS) * 7 SERIAL I/O DSR (1=ON, 0=OFF) * 6 S2-6 (1=OPEN, 0=CLOSED) * 5 SE-10 (1=PARITY ON, 0=PARITY OFF) * 4 SE-9 (1=EVEN PARITY, 0=ODD PARITY) * 3 TALK/DATA SWITCH (1=DATA, 0=TALK) * 2 S2-1 (1=CONSTANT DTR, 0=SWITCHED DTR) * 1 SE-8 (1=FULL DUPLEX, 0=HALF DUPLEX) * 0 SE-7 (1=OPEN, 0=CLOSED) * INPUT ADDRESS 07 (CONTROLLER STATUS) * 7 BULK ERASE BUSY (1=BUSY, 0=NOT BUSY) * 6 RESET SWITCH (1=RESET OFF, 0=RESET ON) * 5 PARALLEL I/O TIMEOUT (1=TIMEOUT, 0=NO TIMEOUT) * 4 TOUCH PANEL DATA READY (1=DATA READY, 0=NO DATA READY) * 3 KEYBOARD DATA READY (1=DATA READY, 0=NO DATA READY) * 2 PCN TRANSMIT DATA REQUEST (1=REQUEST, 0=NO REQUEST) * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 1 HARDWARE FLAG (1=FLAG ON, 0=FLAG OFF)* * 0 PCN RECEIVE DATA READY (1=READY, 0=NOT READY) * * *NOTE. * HARDWARE FLAG IS SET TO 1 BY A POWER ON RESET. * INPUT ADDRESS 08 (PCN RECEIVE DATA) * FIRST BYTE * 7 FIRST BYTE FLAG (=1) * 6 START BIT (=1) * 5-0 DATA BITS 19-14 * SECOND BYTE * 7 FIRST BYTE FLAG (=0) * 6-0 DATA BITS 13-07 * THIRD BYTE * 7 FIRST BYTE FLAG (=0) * 6-1 DATA BITS 06-01 * 0 DATA BIT 00 (EVEN PARITY ON DATA BITS 19-01) * * NOTE. ADDRESSES 09-0F ARE ALSO PCN RECEIVE DATA * DUE TO INCOMPLETE ADDRESS DECODE. * INPUT ADDRESS 10 (ASCII COMM RECEIVE DATA) * Z80-SIO/2 A PORT * * NOTE. ADDRESSES 14, 18 AND 1C ARE ALSO ASCII COMM * RECEIVE DATA DUE TO INCOMPLETE ADDRESS DECODE. * INPUT ADDRESS 11 (ASCII COMM STATUS) * Z80-SIO/2 A PORT * * NOTE. ADDRESSES 15, 19 AND 1D ARE ALSO ASCII COMM * STATUS DUE TO INCOMPLETE ADDRESS DECODE. * INPUT ADDRESS 12 (SERIAL I/O RECEIVE DATA) * Z80-SIO/2 B PORT * * NOTE. ADDRESSES 16, 1A AND 1E ARE ALSO SERIAL I/O * RECEIVE DATA DUE TO INCOMPLETE ADDRESS DECODE. * INPUT ADDRESS 13 (SERIAL I/O STATUS) * Z80-SIO/2 B PORT * * NOTE. ADDRESSES 17, 1B AND 1F ARE ALSO SERIAL I/O * STATUS DUE TO INCOMPLETE ADDRESS DECODE. * INPUT ADDRESS 2X-3X (PARALLEL I/O INPUT DATA OR STATUS) * * * * * * * * * * * * * * * * * * * * * * BIT ASSIGNMENTS FOR OUTPUT ADDRESSES * * * * * * * * * * * * * * * * * * * * * * OUTPUT ADDRESS 00 (MAINTENANCE REGISTER) * 7 ROM/RAM ENABLE (1=RAM, 0=ROM) * 6 TEST MODE SELECT (1=NORMAL MODE, 0=TEST MODE) * 5 DTR LIGHT (1=OFF, 0=ON) * 4 DSR LIGHT (1=OFF, 0=ON)* *DSR, RTS, RCV AND XMT * 3 RTS LIGHT (1=OFF, 0=ON)* LIGHTS ARE ONLY AVAILABLE * 2 RCV LIGHT (1=OFF, 0=ON)* TO SOFTWARE IN TEST MODE. * 1 XMT LIGHT (1=OFF, 0=ON)* IN NORMAL MODE THEY ARE * 0 ERR LIGHT (1=OFF, 0=ON) DRIVEN BY HARDWARE. * NOTE. ALL MAINTENANCE REGISTER BITS ARE RESET TO 0 * BY ANY RESET OPERATION. * OUTPUT ADDRESS 01 (PCN TRANSMIT DATA LOWER BITS) * 7-4 DATA BITS 04-01 * 3 DATA BIT 00 (EVEN PARITY ON DATA BITS 10-01) * 2-0 NOT USED * OUTPUT ADDRESS 02 (PCN TRANSMIT DATA UPPER BITS) * 7-6 NOT USED * 5-0 DATA BITS 10-05 * OUTPUT ADDRESS 03 (VIDEO CONTROL) * 7-3 NOT USED * 2 BULK OPERATION (1=DO BULK OPER, 0=DO NOT DO BULK OPER) * 1 ENABLE/DISABLE VIDEO (1=ENABLE, 0=DISABLE) * 0 WRITE/ERASE IF DOING BULK OPERATION (1=WRITE,0=ERASE) * OUTPUT ADDRESS 04 (LOAD INTERRUPT MASK) * 7 PCN DATA READY (1=ENABLE, 0=DISABLE) (VECTOR=00) * 6 KYBD DATA READY (1=ENABLE, 0=DISABLE) (VECTOR=04) * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 5 TP DATA READY (1=ENABLE, 0=DISABLE) (VECTOR=06) * 4 PCN DATA REQUEST (1=ENABLE, 0=DISABLE) (VECTOR=02) * 3 EXT CHANNEL (1=ENABLE, 0=DISABLE) (VECTOR=0C) * 2 LONG INTERVAL (1=ENABLE, 0=DISABLE) (VECTOR=0E) * 1 SHORT INTERVAL (1=ENABLE, 0=DISABLE) (VECTOR=0A) * 0 I/O TIMEOUT (1=ENABLE, 0=DISABLE) (VECTOR=08) * * NOTE. LONG INTERVAL INTERRUPT IS 17.5 MSEC. * SHORT INTERVAL INTERRUPT IS 0.833 MSEC. * OUTPUT ADDRESS 05 (MISCELLANEOUS CONTROL) * 7 1=SELECT RAM FOR OPERAND PART OF NEXT INSTRUCTION * 6 SELECT EXTERNAL MODEM CONTROL (1=SELECT, 0=NO SELECT) * 5 SELECT INTERNAL MODEM CONTROL (1=SELECT, 0=NO SELECT) * 4 SELECT ASCII INTERFACE CONTROL (1=SELECT, 0=NO SELECT) * 3 SELECT PLATO INTERFACE CONTROL (1=SELECT, 0=NO SELECT) * 2 HARDWARE FLAG CONTROL (1=SET, 0=RESET) * 1 I/O TIMEOUT STATUS/INTERRUPT (1=RESET, 0=DO NOT RESET) * 0 ALARM CONTROL (1=SOUND ALARM, 0=DO NOT SOUND ALARM) * OUTPUT ADDRESS 06 (ASCII COMM DATA RATE) * 7-5 RECEIVE DATA BIT RATE * 4-2 TRANSMIT DATA BIT RATE * 1-0 NOT USED * BITS 7-5 X64 CLOCK X32 CLOCK X16 CLOCK * 0 75 BPS 150 BPS 300 BPS * 1 150 BPS 300 BPS 600 BPS * 2 300 BPS 600 BPS 1200 BPS * 3 600 BPS 1200 BPS 2400 BPS * 4 1200 BPS 2400 BPS 4800 BPS * 5 2400 BPS 4800 BPS 9600 BPS * 6 4800 BPS 9600 BPS 19200 BPS * 7 EXT CLK X1 EXT CLK X1 EXT CLK X1 * OUTPUT ADDRESS 07 (SERIAL I/O DATA RATE) * 7-5 XMIT AND RCV DATA BIT RATE * 4-1 NOT USED * 0 EXTERNAL INTERFACE SELECT (1=LONG LINE, 0=RS232) * BITS 7-5 X64 CLOCK X32 CLOCK X16 CLOCK * 0 37.5 BPS 75 BPS 150 BPS * 1 75 BPS 150 BPS 300 BPS * 2 150 BPS 300 BPS 600 BPS * 3 300 BPS 600 BPS 1200 BPS * 4 600 BPS 1200 BPS 2400 BPS * 5 1200 BPS 2400 BPS 4800 BPS * 6 2400 BPS 4800 BPS 9600 BPS * 7 4800 BPS 9600 BPS 19200 BPS * OUTPUT ADDRESS 08-0F (NOT USED) * OUTPUT ADDRESS 10 (ASCII COMM TRANSMIT DATA) * Z80-SIO/2 A PORT * * NOTE. ADDRESSES 14, 18 AND 1C ARE ALSO ASCII COMM * TRANSMIT DATA DUE TO INCOMPLETE ADDRESS DECODE. * OUTPUT ADDRESS 11 (ASCII COMM CONTROL) * Z80-SIO/2 A PORT * * NOTE. ADDRESSES 15, 19 AND 1D ARE ALSO ASCII COMM * CONTROL DUE TO INCOMPLETE ADDRESS DECODE. * OUTPUT ADDRESS 12 (SERIAL I/O TRANSMIT DATA) * Z80-SIO/2 B PORT * * NOTE. ADDRESSES 16, 1A AND 1E ARE ALSO SERIAL I/O * TRANSMIT DATA DUE TO INCOMPLETE ADDRESS DECODE. * /--- BLOCK AIST3 00 000 73/00/00 00.00 * OUTPUT ADDRESS 13 (SERIAL I/O CONTROL) * Z80-SIO/2 B PORT * * NOTE. ADDRESSES 17, 1B AND 1F ARE ALSO SERIAL I/O * CONTROL DUE TO INCOMPLETE ADDRESS DECODE. * OUTPUT ADDRESS 2X-3X (PARALLEL I/O OUTPUT DATA OR COMMAND) * INTERNAL PCN MODEM INFORMATION * MODEM GENERATES DSR, CD AND RD. * MODEM LOOKS AT TD. * RTS, DTR AND CTS ARE NOT USED. * TERMINAL GATES RD WITH CD AND DSR. * I/O INPUT ADDRESS ASSIGNMENTS MNTSW EQU 00H MAINTENANCE SWITCHES KBDATA EQU 01H KEYBOARD DATA TPDATA EQU 02H TOUCH PANEL DATA IDLO EQU 03H ID CODE, LOWER 8 BITS IDUP EQU 04H ID CODE, UPPER 8 BITS INTSW EQU 05H INTERNAL SWITCHES COMMSW EQU 06H COMM CONTROL SWITCHES SYSSTAT EQU 07H CONTROLLER STATUS CLADATA EQU 08H PCN RECEIVE DATA ASCDATI EQU 10H ASCII COMM RECEIVE DATA ASCSTAT EQU 11H ASCII COMM STATUS SERDATI EQU 12H SERIAL I/O RECEIVE DATA SERSTAT EQU 13H SERIAL I/O STATUS FDDATA EQU 0EEH FLOPPY DISK INPUT DATA FDSTAT EQU 0EFH FLOPPY DISK STATUS * I/O OUTPUT ADDRESS ASSIGNMENTS PNLLTS EQU 00H MAINTENANCE PANEL LIGHTS CLAL EQU 01H PCN TRANSMIT DATA LOWER BITS CLAU EQU 02H PCN TRANSMIT DATA UPPER BITS VIDEOCTL EQU 03H BULK ERASE AND VIDEO ENABLE INTMSK EQU 04H SYSTEM INTERRUPT MASK MISCTL EQU 05H MISCELLANEOUS CONTROL ASCRATE EQU 06H ASCII COMM DATA RATE SERRATE EQU 07H SERIAL I/O DATA RATE ASCDATO EQU 10H ASCII COMM TRANSMIT DATA ASCCTRL EQU 11H ASCII COMM CONTROL SERDATO EQU 12H SERIAL I/O TRANSMIT DATA SERCTRL EQU 13H SERIAL I/O CONTROL FDCMND EQU 0EFH FLOPPY DISK COMMAND EJECT * * * * * * * * * * * * * * * * * * * * * * * * * * * * *@* * * * PRINTER EQUATES * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *@* * DATAFCN EQU 2AH 001NNNN0 CNTLFCN EQU 2BH 001NNNN1 MISCFCN EQU 05H 00000101 MRESET0 EQU 00H RESET INTERFACE MRESET1 EQU 01H RESET PTR DISABLE EQU 2 DISABLE INTERRUPTS. ENABLE EQU 04H ENABLE INTERRUPTS. SECSTAT EQU 09H REQUEST SECONDARY STATUS. READID EQU 08H READ DEVICE ID. STIMER EQU 0EH START TIMER. * C.ENQ EQU 05H DOT ROW PREAMBLE C.LF EQU 0AH LINE / ROW FEED C.FF EQU 0CH FORM FEED PDISABL EQU 13H DESELECT PRINTER. EJECT EXTERNAL EQUATES SPACE 5 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 * 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 R.ALARM JP ALARM 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 FWA2 EQU * START OF SECOND 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 IVT EQU * DEFW BADINT PLATO CLA CHARACTER READY DEFW BADINT PLATO CLA CHARACTER REQUEST DEFW KYBD KEYBOARD DATA DEFW TP TOUCH PANEL DATA DEFW BADINT EXTERNAL I/O TIMEOUT DEFW BADINT SHORT INTERVAL DEFW EXTI EXTERNAL CHANNEL DEFW LINT LONG INTERVAL DEFW BADINT SERIAL I/O CHARACTER REQUEST DEFW BADINT SERIAL I/O EXT/STATUS CHANGE DEFW EXTI SERIAL I/O CHARACTER READY DEFW EXTI SERIAL I/O ERROR DEFW ASCCREQ ASCII COMM CHARACTER REQUEST DEFW ASCXTCHG ASCII COMM EXT/STATUS CHANGE DEFW ASCCRDY ASCII COMM CHARACTER READY DEFW ASCERR ASCII COMM ERROR BADINT JR BADINT ILLEGAL INTERRUPT EJECT TERMINAL INITIALIZATION * * * * * * * * * * * * * * * * * * * * * * * TERMINAL INITIALIZATION * * * * * * * * * * * * * * * * * * * * * * * INITIALIZATION ENTRY POINT. INIT EQU * DI DISABLE INTERRUPTS LD A,0DFH CLEAR TEST MODE, ENABLE RAM OUT (PNLLTS),A SET DTR, CLEAR ERR LIGHT * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD SP,ZSTACK SET STACK POINTER LD HL,CKSMTBST PRESET CHECKSUM TABLE LD (CKSUMTBL),HL ADDRESS LD A,01H SOUND BEEPER OUT (MISCTL),A LD A,(RESETFLG) IS THIS A SHORT RESET XOR 3CH JR Z,INIT1 JUMP IF YES * INITIALIZE AFTER LOAD LD A,(LDSOURCE) LD B,A AND 80H LD (MODE),A LD A,3CH XOR B LD (RESETFLG),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 A,(RUNINFO) GET DEFAULT RATE FOR RLCA STATUS LINE RLCA RLCA AND 07H LD (ASCSPEED),A IN A,(COMMSW) GET DEFAULT PARITY SETTING RLCA FOR STATUS LINE RLCA RLCA RLCA AND 03H XOR 03H CP 03H JR NZ,INITPAR DEC A INITPAR EQU * LD (PARITY),A IN A,(COMMSW) GET DEFAULT HALF/FULL DUPLEX RRCA SETTING FOR STATUS LINE AND 01H LD (DUPLEXFG),A * ALL RESETS COME THROUGH THE FOLLOWING CODE INIT1 EQU * LD A,38H LD (M.STATUS),A SET USER PROGRAM NOT RUN. XOR A FLAG USER PROGRAM NOT RUNNING LD (USERFLG),A CALL INIT3 INIT INTS AND CHECKSUM LD HL,USBUF CLEAR OUT KB/TP BUFFER XOR A LD (HL),A INC HL LD (HL),A INC HL LD (HL),A * LD A,(LDSOURCE) INC A TEST FOR MICRO TUTOR LOAD JR Z,INITA INITIALIZE FOR PLATO * LD A,(MODE) CHECK PLATO/ASCII OPERATION RLCA JR NC,INIT1A JUMP IF ASCII (TS OR GRAPHIC) INITA EQU * CALL PINIT.1 DO PLATO OPERATION INIT CALL SENDNAK SEND NAK AND SET ABORT STATE LD HL,0382H SEND RESET STATUS TO PLATO CALL R.XMIT JR INIT1C INIT1A EQU * LD A,(TGMODE) ASCII, SO CHECK TS OR GRAPHIC OR A * /--- BLOCK AIST3 00 000 73/00/00 00.00 JR Z,INIT1B JUMP IF TIMESHARE CALL AINIT.G GRAPHIC OPERATION INIT JR INIT1C INIT1B EQU * CALL AINIT TIMESHARE OPERATION INIT INIT1C EQU * 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 A,01H LOAD IST3 SUBTYPE LD (M.SBTYPE),A LD HL,M.TYPE SET TERMINAL TYPE IN A,(MNTSW) GET SWITCH S2-10(32K) AND 60H SAVE TP AND MEM BITS IN LD (M.CONFIG),A CONFIGURATION BYTE AND 20H AND PUT IN BIT 4 OF M.TYPE RRCA OR 12 SET ASCII TERMINAL TYPE LD (HL),A IN BITS 3..0 INIT2 EQU * LD HL,0 DISPLAY CALL R.OUTY .TERMINAL READY NN. LD HL,184 MESSAGE CALL R.OUTX LD HL,TRMRDY CALL R.CHARS LD HL,LDSOURCE INC (HL) TEST FOR DISK LOAD * CALL Z,5306H GO TO INTERPRETER * XOR A LD (LDSOURCE),A LD A,(MODE) CHECK ASCII/PLATO RLCA CALL NC,AFF.1 HOME CURSOR FOR TS OR GRAPHIC JP CHKCARR GO CHECK FOR CARRIER INIT3 EQU * LD HL,IVT SET INT TABLE ADDRESS LD A,H (UPPER BITS) LD I,A INTO INT. VECTOR IM 2 SET FOR MODE 2 INTERRUPTS LD HL,0444H ENABLE KEYBOARD AND CALL R.SSF LONG INTERVAL INTERRUPTS LD HL,ASCPKGI SET UP ASCII INIT PACKAGE LD DE,ASCPKG LD BC,8 LDIR CALL STAT.F1 SET UP SIO LD B,8 LD C,SERCTRL LD HL,SERPKGI OTIR CALL CHKSUM.I INITIALIZE MEMORY CHECKSUM EI RET ASCSETUP EQU * LD B,8 SET UP ASCII COMM PORT LD C,ASCCTRL LD HL,ASCPKG * /--- BLOCK AIST3 00 000 73/00/00 00.00 OTIR RET ASCPKGI EQU * ASCII COMM INIT PACKAGE DEFB 04H REG. 4 NEXT DEFB 0C4H X64 CLK, 1 STOP BIT, NO PARITY DEFB 03H REG. 3 NEXT DEFB 0C1H 8 BITS/CH, NO AUTO EN, EN RCVR DEFB 05H REG. 5 NEXT DEFB 0EAH DTR ON,8 BITS/CH,TX EN,RTS ON DEFB 01H REG. 1 NEXT DEFB 1BH PAR NOT AFF VECT,EN TX/EXT INT SERPKGI EQU * SERIAL I/O INIT PACKAGE DEFB 00H REG. 0 NEXT DEFB 18H CHANNEL CLEAR, REG. 0 NEXT DEFB 04H REG. 4 NEXT DEFB 0C4H X64 CLK,1 STOP BIT,NO PARITY DEFB 01H REG. 1 NEXT DEFB 04H DIS RCV INT, STAT AFF VECT DEFB 02H REG. 2 NEXT DEFB 10H INTERRUPT VECTOR = XX10H EJECT ********** * PLATO INITIALIZE ********** PINIT EQU * LD A,01H 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 00 WORD COUNT CALL XMIT.1 PINIT.1 EQU * LD A,01 LD (BYPASS),A SET BYPASS * PINIT.2 EQU * LD A,80H LD (MODE),A SET PLATO MODE LD HL,M0CODE00 SET UP M.M0 LD (M.M0),HL XOR A SET (M.KSW) TO PUT INPUT DATA LD (M.KSW),A INTO THE TRANSMIT BUFFER LD (CURSAVED),A CLEAR CURSOR SAVED FLAG 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 L,00 SET HOR/MEM0/SIZE1/FWD CALL R.CCR LD L,1AH SET ALPHA/REWRITE MODE JP R.MODE PINIT.3 EQU * LD HL,00D0H CALL R.XMIT SEND ECHO JR PINIT.2 *TERMINAL READY MESSAGE TRMRDY EQU * HEX 54,05,12,0D HEX 09,0E,01,0C HEX 2D,52,05,01 HEX 04,19 *VERSION (CHANGE WITH NEW PRODUCTION BINARY) VER EQU * HEX 2D,1B,1D 02 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 02 CHANGE WITH NEW PRODUCTION BIN. EJECT * * * * * * * * * * * * * * * * * * * * * * LONG INTERVAL INTERRUPT PROCESSOR * INTERRUPTS OCCUR AT 17.5 MILLISECOND INTERVALS * * * * * * * * * * * * * * * * * * * * * 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 A,(USERFLG) IS A USER PROGRAM RUNNING OR A JR Z,LINT1 JUMP IF NO LD A,(MODE) YES, IS THIS PLATO OPERATION RLCA JP NC,R.INIT NO, SIMULATE A SHORT RESET LINT1 EQU * LD HL,(M.CLOCK) AND INCREMENT (M.CLOCK) INC HL LD (M.CLOCK),HL LD HL,BLINKCTR CHECK BLINK COUNTER LD A,(HL) OR A JP Z,RETURN DEC (HL) DECREMENT IF NOT ZERO JP R.RETURN EJECT EJECT * * * * * * * * * * * * * * * * * * * * * * ASCII COMMUNICATIONS PORT INTERRUPT PROCESSOR * * * * * * * * * * * * * * * * * * * * * ASCCRDY EQU * CHARACTER READY ENTRY PUSH AF (PARITY MAY BE GOOD OR BAD) PUSH BC PUSH DE PUSH HL IN A,(ASCDATI) INPUT DATA LD C,A CALL ERRCHK CALL ERROR PROTOCOL HANDLER JP C,R.RETURN EXIT IF CHAR TO BE IGNORED ASCCRDY1 EQU * LD A,(LOC.RMT) THROW AWAY CHARACTER OR A IF LOCAL JP NZ,RETURN RES 7,C CLEAR PARITY BIT LD HL,RXBUF RECEIVE BUFFER ADDRESS LD A,0FFH LOAD MASK FOR INDEX * /--- BLOCK AIST3 00 000 73/00/00 00.00 CP (HL) TEST FOR FULL BUFF JR Z,ASCCRDY2 JUMP IF FULL 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 ASCCRDY2 EQU * LD A,(MODE) SEND NAK AND ABORT RECEIVE RLCA IF PLATO MODE CALL C,SENDNAK JP RETURN ASCERR EQU * RECEIVE CHARACTER ERROR ENTRY PUSH AF (OVERRUN OR FRAMING ERROR) PUSH BC PUSH DE PUSH HL IN A,(ASCDATI) INPUT DATA LD C,A SAVE CHARACTER IN C LD A,30H CLEAR ERROR FLAGS OUT (ASCCTRL),A LD A,(MODE) CHECK MODE RLCA JR NC,ASCERR1 CALL ERR.P PLATO MODE ERROR JR ASCERR2 ASCERR1 EQU * CALL ERR.A ASCII MODE ERROR ASCERR2 EQU * JR NC,ASCCRDY1 SAVE CHAR IF FLAGGED OK JP RETURN OTHERWISE IGNORE IT ASCCREQ EQU * CHARACTER REQUEST ENTRY PUSH AF PUSH BC PUSH DE PUSH HL LD HL,TXBUF LOAD ADDRESS OF TRANSMIT BUFF XOR A TEST FOR EMPTY OR (HL) BUFFER JR Z,ASCCREQ1 JUMP IF BUFFER EMPTY 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 (ASCDATO),A OUTPUT DATA JP RETURN ASCCREQ1 EQU * LD A,28H TURN OFF CHARACTER REQUEST INT OUT (ASCCTRL),A XOR A CLEAR ASCII TRANSMIT BUSY FLAG LD (TXBUSY),A JP RETURN * /--- BLOCK AIST3 00 000 73/00/00 00.00 ASCXTCHG EQU * CHANGE OF CTS OR DCD, OR BREAK PUSH AF PUSH BC PUSH DE PUSH HL LD A,10H CLEAR EXT/STATUS INTERRUPT OUT (ASCCTRL),A JP RETURN 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 LD L,A LOAD KEYBOARD DATA LD H,40H OP CODE AND CATAGORY LD A,(MODE) CLEAR CTRL BIT IF PLATO MODE RLCA JR NC,KYBD1 RES 7,L KYBD1 EQU * LD A,(SCOPYFLG) IS SCREEN COPY ACTIVE OR A JR NZ,KYBD2 JUMP IF YES * DO A SCREEN COPY IF SHIFT-PRINT IS PRESSED. * OTHERWISE, JUST TRANSMIT THE CHARACTER. LD A,L NO, IS KEY = SHIFT-PRINT CP 3FH JR NZ,KYBD3 JUMP IF NO LD A,01 SET SCREEN COPY ACTIVE FLAG LD (SCOPYFLG),A EI ENABLE INTERRUPTS CALL G.PRINT DO THE SCREEN COPY DI DISABLE INTERRUPTS XOR A CLEAR SCREEN COPY ACTIVE FLAG LD (SCOPYFLG),A JR RETURN * TURN OFF SCREEN COPY IF STOP OR SHIFT-STOP IS PRESSED. * OTHERWISE IGNORE THE KEY. KYBD2 EQU * LD A,L IS KEY = STOP OR SHIFT-STOP RES 5,A CP 1AH JR NZ,RETURN NO, IGNORE KEY LD A,01 YES, SET SCREEN COPY TURNOFF LD (TURNOFF),A FLAG AND TRANSMIT THE KEY LD A,(MODE) CHECK MODE RLCA JR NC,RETURN TRANSMIT ONLY IF PLATO MODE KYBD3 EQU * 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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. LD A,L TEST FOR ZERO OR H JR Z,EXTI0 JP (HL) NONZERO, GO TO USER ROUTINE * EXTI0 EQU * LD A,(EXT.IN) LOAD EXTERNAL DEVICE ADDRESS LD C,A AND 1CH TEST FOR SERIAL OR PARALLEL JR Z,EXTI1 SET 5,C SELECT PARALLEL CHANNEL JR EXTI2 * EXTI1 EQU * SET 4,C SELECT SERIAL CHANNEL EXTI2 EQU * 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 RETI 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * XOR A FLAG USER PROGRAM NOT RUNNING LD (USERFLG),A CALL CHKSUM CHECKSUM MEMORY DURING IDLE JR Z,IDLE1 JR BLOCKF NOP THIS FOR EXP TESTING IDLE1 EQU * LD A,(MODE) TEST FOR OPERATING MODE RLCA JP NC,AIDLE ASCII IDLE IF BIT 7 CLEAR ********** * PLATO OPERATIONS IDLE LOOP ********** PIDLE EQU * CALL R.EXEC TEST FOR RECEIVE OR XMIT DATA JR IDLE LOOP TO IDLE ********** * 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 DATA UNTIL RECEIVE BUFFER IS EMPTY. ********** EXEC EQU * LD A,(EREG) CHECK TIME OUT AND 04 IF COMM ERROR STATE CALL NZ,TIMOUT CALL CHECKSWS CHECK FRONT PNL SWS FOR CHANGE LD A,(MODE) CHECK MODE RLCA JR NC,EXEC3 NO TEST IF ASCII MODE LD B,3 EXEC1 EQU * CALL CARRIER JR NC,EXEC3 IF CARRIER PRESENT LD HL,0 WAIT ABOUT HALF A SECOND EXEC2 EQU * DEC HL LD A,L OR H JR NZ,EXEC2 DJNZ EXEC1 SEE IF CARRIER IS BACK ON * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD (RESETFLG),A FORCE A FULL TIMESHARE JP R.INIT MODE INIT AFTER 3 SECONDS EXEC3 EQU * LD A,(M.JOBS) TEST FOR RECEIVE DATA OR A RET Z EXIT IF NO RECEIVE DATA CALL PROCESS JR EXEC3 ********** * 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 * RES 7,C CLEAR UPPER BIT OF CHARACTER PUSH BC SAVE CHARACTER CALL ESCCTL CHECK FOR ESC SEQ OR CTL CODE POP BC GET SAVED CHARACTER JR C,XJOB2 JUMP IF ESC SEQ OR CTL CODE 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 PUSH BC SAVE CHARACTER CALL JMPHL EXECUTE COMMAND OR DATA POP BC GET SAVED CHARACTER XJOB2 EQU * LD A,(CPRINTFG) CHECK FOR COMM PRINT ACTIVE OR A JP NZ,CPRINT OUTPUT CHARACTER TO PRINTER RET JMPHL EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 JP (HL) JUMP VIA HL SELECT.C EQU * COMMAND JUMP TABLE DEFW LDC DEFW SSF DEFW LDE DEFW LDA DEFW EXT DEFW COLOR 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 ********** * CHECK FOR CHANGE IN TALK/DATA SWITCH AND UPDATE * COMM CHANNEL DTR SIGNAL ACCORDINGLY. ********** CHECKSWS EQU * LD HL,XCOMMSW POINT TO OLD SWITCH SETTING IN A,(COMMSW) GET NEW SWITCH SETTING LD C,A LD A,(HL) GET OLD SWITCH SETTING LD (HL),C SAVE NEW SWITCH SETTING XOR C COMPARE BIT 3,A RET Z EXIT IF NO CHANGE OF TALK/DATA BIT 2,C RET NZ IGNORE TALK/DATA IF CONST DTR LD HL,ASCPKG+5 POINT AT REG. 5 CONTROL BYTE RES 7,(HL) CLEAR DTR BIT LD A,0FFH CLEAR DTR AND ERR LIGHTS OUT (PNLLTS),A BIT 3,C SET DTR BIT IF IN DATA POS. JR Z,CHKSWS1 SET 7,(HL) SET DTR BIT LD A,0DFH SET DTR LIGHT, CLEAR ERR LIGHT OUT (PNLLTS),A CHKSWS1 EQU * JP ASCSETUP SET UP SIO 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 * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * INC HL LD E,(HL) INC HL MATCH, JUMP TO EXECUTE COMMAND LD D,(HL) EX DE,HL LD DE,M.CCR JP (HL) 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. ********** 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 JR NZ,TX.STOR3 NO, JUMP CALL KBCON CONVERT CHAR TO ASCII IN C JP NZ,XMIT.1 SEND THE CHAR IF DEFINED KEY RET EXIT FOR UNDEFINED KEYS 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 * GRAPHIC/TIMESHARE MODE ENTRY LD A,(LOC.RMT) OR A RET NZ JUST EXIT IF LOCAL XMIT.1 EQU * PLATO MODE ENTRY 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,C CALCULATE PARITY ON XMIT CHAR OR A JP PE,XMIT.1B SET 7,C ASSUME EVEN PARITY XMIT.1B EQU * LD A,(MODE) CHECK MODE RLCA JR C,XMIT.1E JUMP IF PLATO LD A,(PARITY) IS PARITY SELECTED BIT 1,A JR NZ,XMIT.1C JUMP IF NO BIT 0,A YES, IS IT EVEN OR ODD JR Z,XMIT.1E JUMP IF EVEN JR XMIT.1D ODD XMIT.1C EQU * IN A,(COMMSW) CHECK EVEN/ODD BIT 4,A JR NZ,XMIT.1E JUMP IF EVEN XMIT.1D EQU * LD A,C CHANGE TO ODD PARITY XOR 80H LD C,A XMIT.1E EQU * LD (HL),C STORE DATA IN TXBUF LD HL,TXBUSY EXIT IF ASCII TRANSMITTER BUSY BIT 0,(HL) RET NZ DI TRANSMITTER IS IDLE, SO SET SET 0,(HL) BUSY FLAG AND START TRANSMIT CALL ASCCREQ * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 ERROR RECOVERY PROTOCOL DURING * TRANSFERS FROM THE DSN NETWORK TO THE TERMINAL. * THE PROTOCOL FOR ASCII MODES (TIMESHARE OR GRAPHIC) MERELY * CHECKS FOR PARITY ERRORS AND TURNS ON THE ERR LIGHT UNTIL * THE NEXT CHARACTER IS RECEIVED IF THERE IS A PARITY ERROR * AND PARITY CHECKING IS SELECTED. IN TIMESHARE MODE, AN * ERROR CHARACTER IS DISPLAYED AS A PAD CHARACTER. IN PLATO * MODE, THE PROTOCOL UTILIZES EVEN PARITY ON EACH CHARACTER * TRANSFERRED AND ALSO A MODULO 96 WORD COUNT ON THE * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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 DISCARD THE CHARACTER * CARRY=0 SAYS TO UTILIZE THE CHARACTER. ********** ERRCHK EQU * LD A,(MODE) CHECK MODE RLCA JR C,ERRCHKP JUMP IF PLATO LD A,(PARITY) ASCII, SO CHECK PAR/NO PAR BIT 1,A JR NZ,ERRCHK2 JUMP IF NO PAR BIT 0,A PAR, SO CHECK EVEN/ODD LD A,C PUT CHAR IN A JR Z,ERRCHK1 JUMP IF EVEN PAR XOR 80H TOGGLE PARITY BIT ERRCHK1 EQU * OR A JP PO,ERR.A JUMP IF PARITY ERROR ERRCHK2 EQU * LD A,C PARITY OK... RES 7,A CP 7FH IS CHARACTER A RUBOUT JR NZ,E006 NO, CONTINUE LD A,0DFH TURN OFF ERR LIGHT OUT (PNLLTS),A LD A,(MODE) CHECK FOR ALPHA MODE XOR 3 RET NZ EXIT (USE CHAR) IF NOT ALPHA SCF RET EXIT(IGNORE CHARACTER) ERR.A EQU * ASCII MODE ERROR ENTRY LD A,(TGMODE) CHECK TIMESHARE/GRAPHIC OR A JR NZ,ERR.P JUMP IF GRAPHIC MODE LD C,7FH TS,SO CHANGE ERROR CHAR TO PAD ERR.P EQU * PLATO MODE ERROR ENTRY LD A,0DEH TURN ON ERR LIGHT OUT (PNLLTS),A LD HL,EREG POINT TO ERROR PROTOCOL FLAGS RES 6,(HL) CLEAR ACK FLAG OR A CLEAR CARRY BIT 0,(HL) TEST STATE 0 RET NZ USE CHAR IF STATE = 0 BIT 1,(HL) TEST STATE 1 CALL NZ,SENDNAK SEND NAK,M AND SET STATE 2 IF SCF STATE=1 RET EXIT(DISCARD CHARACTER) ERRCHKP EQU * PLATO MODE ERROR PROTOCOL LD A,C OR A JP PO,ERR.P JUMP IF PARITY ERROR LD HL,EREG POINT TO ERROR CONTROL FLAGS LD A,06H IF CHAR=ACK THEN CP C JR NZ,E001 SET 6,(HL) SET ACK FLAG SCF RET AND EXIT(DISCARD) E001 EQU * BIT 0,(HL) ELSE IF STATE=0 * /--- BLOCK AIST3 00 000 73/00/00 00.00 JR Z,E100 (NON ERROR CONTROL) THEN BIT 6,(HL) IF ACK FLAG=1 THEN JR Z,E006 E002 EQU * RES 6,(HL) CLEAR ACK FLAG LD A,C RES 7,A SUB 20H RET C EXIT(DISCARD) IF CTRL CHAR LD (MREG),A THEN SAVE BIASED CHAR LD (NREG),A AT M AND N LD (HL),02H SET STATE=1 LD A,0DFH TURN OFF ERR LIGHT OUT (PNLLTS),A SCF AND EXIT(DISCARD) RET E006 EQU * LD A,0DFH TURN OFF ERR LIGHT OUT (PNLLTS),A OR A CLEAR CARRY RET EXIT(USE CHAR) E100 EQU * BIT 1,(HL) IF NOT STATE 1 THEN JUMP JR Z,E200 BIT 6,(HL) IF ACK FLAG=1 THEN JR Z,E105 RES 6,(HL) CLEAR ACK FLAG LD A,C SUB 20H SET N = CHAR-20H LD (NREG),A SCF EXIT(DISCARD) RET 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 = CP 60H N+1 MOD 96 JR NZ,E106 XOR A E106 LD (NREG),A LD (MREG),A RES 7,(HL) MARK AS OK CHAR JR E109 E107 EQU * M<>N, SO INC A SET N = N+1 MOD 96 CP 60H JR NZ,E108 XOR A E108 LD (NREG),A SET 7,(HL) MARK AS DISCARD CHAR E109 EQU * NOW TEST THE CHAR COUNTER. LD A,(E.CNTR) IF E.CNTR<>1 THEN DEC A JR NZ,E110 LD A,20 RESET IF = 0 E110 EQU * LD (E.CNTR),A DECREMENT E.CNTR JR NZ,E114 PUSH BC COUNTER=0, SO LD C,06H SEND ACK CALL XMIT.1 LD A,(MREG) SEND M+20H ADD A,20H LD C,A CALL XMIT.1 POP BC E114 EQU * LD A,(HL) PUT MARK IN CARRY FLAG RLCA RET AND EXIT E200 EQU * ERROR STATE BIT 6,(HL) TEST ACK FLAG JP NZ,E002 RESYNC IF SET * /--- BLOCK AIST3 00 000 73/00/00 00.00 SCF EXIT(DISCARD) RET * PLATO COMMUNICATIONS ERROR STATE TIMER, * RESENDS NAK SEQUENCE EVERY 250 MS UNTIL ACK RECEIVED. TIMOUT EQU * LD HL,(ECLOCK) HAS TIMER EXPIRED DEC HL LD (ECLOCK),HL LD A,L OR H RET NZ NO, EXIT * CALLABLE ROUTINE TO SEND NAK SEQUENCE AND SET ERROR STATE. SENDNAK EQU * LD A,0DEH TURN ON ERR LIGHT OUT (PNLLTS),A LD HL,EREG BIT 0,(HL) TEST FOR STATE 0 RET NZ * LD (HL),04 ELSE SET ABORT STATE LD C,15H SEND NAK CALL XMIT.1 LD A,(MREG) SEND WC+20H ADD A,20H LD C,A CALL XMIT.1 LD HL,300 RESET 250 MS TIMER LD (ECLOCK),HL 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 PUSH DE SAVE Y COORDINATE. CALL R.OUTX SET COORDINATES POP HL GET Y COORDINATE. 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 * * =71 REQUEST (M.SBTYPE) * * =72 REQUEST (M.LDFILE) * * =73 REQUEST (M.CONFIG) * * * =7A SEND BACKOUT, TURN OFF DTR * * =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 BACKOUT1 EQU * LD A,01H WAIT UNTIL BACKOUT IS SENT OUT (ASCCTRL),A IN A,(ASCSTAT) BIT 0,A JR Z,BACKOUT1 * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD A,05H TURN OFF DTR AND RTS OUT (ASCCTRL),A LD A,28H OUT (ASCCTRL),A LD A,0FFH TURN OFF DTR AND ERR LIGHTS OUT (PNLLTS),A LD B,6 WAIT 3 SECONDS BACKOUT2 EQU * LD HL,0 BACKOUT3 EQU * DEC HL LD A,L OR H JR NZ,BACKOUT3 DJNZ BACKOUT2 XOR A FORCE FULL TIMESHARE MODE INIT LD (RESETFLG),A JP R.INIT * 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 * * BEEP THE BEEPER * ALARM EQU * LD A,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 * CP 71H TEST FOR M.SBTYPE REQUEST JR NZ,LDE5 LD A,(M.SBTYPE) SET 7,A LD L,A LD H,00 CALL R.XMIT RET LDE5 EQU * CP 72H TEST FOR M.LDFILE REQUEST JR NZ,LDE6 LD A,(M.LDFILE) SET 7,A LD L,A LD H,00 CALL R.XMIT RET LDE6 EQU * CP 73H TEST FOR M.CONFIG REQUEST JR NZ,LDE7 LD A,(M.CONFIG) SET 7,A LD L,A LD H,00 CALL R.XMIT RET LDE7 EQU * OR 80H SET ECHO OP CODE * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 BETWEEN BEGVAR1..ENDVAR1 OR ENDRES..7FFFH. * ROUTINE RETURNS TO CALLER WITH HL UNCHANGED IF IN BOUNDS. * ROUTINE EXITS THE CALLER IF HL WAS OUT OF BOUNDS. CHKRG EQU * EX DE,HL ADDRESS TO DE LD HL,-ENDRES ADD HL,DE JR NC,CHKRG0 JUMP IF 7FFFH ADD HL,DE JR NC,CHKRG1 JUMP IF =256) + 85 * * TIME FOR DELTA Y=511, DELTA X=000 IS 14.078 MILLISECONDS. * TIME FOR DELTA Y=511, DELTA X=510 IS 16.145 MILLISECONDS. * YVEC1 EQU * ADD HL,DE ADD SLOPE TO ACCUMULATOR EXX JR NC,YVEC2 RLC C MOVE ONE DOT RIGHT JR C,YVEC3 YVEC2 EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 ADD HL,DE MOVE ONE DOT UP OR DOWN SET 7,H * ENTRY POINT YVEC EQU * LD A,(HL) MODIFY CURRENT DOT XOR B OR C XOR B LD (HL),A EXX DECREMENT AND TEST COUNT DEC C JP PO,YVEC1 (LOOP IF NO OVERFLOW) DEC B JP P,YVEC1 LOOP IF NOT DONE YET JP MODE19 EXIT YVEC3 EQU * INC H MOVE RIGHT ONE BYTE INC H JP YVEC2 EJECT * VECTOR GENERATOR. X IS LONG AXIS, Y IS SHORT AXIS. * WRITE/ERASE VECTOR. * * ON ENTRY, * B=WRITE/ERASE MASK (00=WRITE, FF=ERASE) * C=BIT MASK (BIT TO BE CHANGED=1, OTHER BITS=0) * DE=-1 IF WRITING UP TO RIGHT, +1 IF WRITING DOWN TO RIGHT * HL=CURRENT DISPLAY MEMORY ADDRESS * BC*=DELTA X (BIT 7 OF C IS TOGGLED FOR USE WITH JP,PE) * DE*=SLOPE * HL*=ACCUMULATOR (INITIALLY 8000H) * * ENTRY POINT IS XVEC. * * THIS CODE IS TIME OPTIMIZED. DO NOT CHANGE WITHOUT * CAREFUL THOUGHT. * * TIMING FOR THIS ROUTINE. * * T STATES = 106*DELTA X + 17*DELTA Y * + 36*NO. OF HORIZONTAL BYTE BOUNDARIES CROSSED * + 16 (IF DELTA X >=256) + 85 * * TIME FOR DELTA X=511, DELTA Y=000 IS 14.134 MILLISECONDS. * TIME FOR DELTA X=511, DELTA Y=511 IS 16.306 MILLISECONDS. * XVEC1 EQU * ADD HL,DE ADD SLOPE TO ACCUMULATOR EXX JR NC,XVEC2 ADD HL,DE MOVE ONE DOT UP OR DOWN SET 7,H XVEC2 EQU * RLC C MOVE ONE DOT RIGHT JR C,XVEC3 * ENTRY POINT XVEC EQU * LD A,(HL) MODIFY CURRENT DOT XOR B OR C XOR B LD (HL),A EXX DECREMENT AND TEST COUNT DEC C JP PO,XVEC1 (LOOP IF NO OVERFLOW) DEC B JP P,XVEC1 LOOP IF NOT DONE YET JP MODE19 EXIT XVEC3 EQU * INC H MOVE RIGHT ONE BYTE INC H SET 7,H JP XVEC * * * 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 * * * * * * * * * * * * * * * * * * * * * * * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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,A6,40 HEX 86,87,88,89 6X HEX 5E,8B,8C,8D HEX 8E,5B,5D,06 HEX 85,00,AA,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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 CALL LDMEMSEL SELECT M0..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. * * ON ENTRY.. A-REG = 2 * MEM NO. * * ON EXIT... (MEMSEL) = FWA OF MEM NO. * C-REG = 2 * MEM NO. * LDMEMSEL EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD C,A SAVE 2*MEM IN C 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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. * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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) ********** * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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. * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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) * /--- BLOCK AIST3 00 000 73/00/00 00.00 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. * /--- BLOCK NORTHS 00 000 73/00/00 00.00 * 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) * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 ********** * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * SRA H OTHERWISE, SCALE BY RR L A FACTOR OF 2 SRA D TO SCALE INTO 512X512 RR E PUSH HL SAVE X COORD. LD HL,(BIAS) BIAS Y COORD. ADD HL,DE RES 1,H APPLY 512 MODULUS EX DE,HL POP HL RET * ERR EQU * POP AF 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 A,01H FLAG USER PROGRAM RUNNING LD (USERFLG),A 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 A,01H FLAG USER PROGRAM RUNNING LD (USERFLG),A 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 A,01H FLAG USER PROGRAM RUNNING LD (USERFLG),A LD HL,(MOD7A) LOAD MODE 7 ADDRESS JP (HL) EJECT ASSEMBLE COMM LINE INPUT * * * * * * * * * * * * * * * * * * * * * * * PROCESS INTERRUPT MASK AND ENABLE DEVICES * * INTERRUPT MASK * BIT 0 I/O TIMEOUT * BIT 1 SHORT INTERVAL * BIT 2 LONG INTERVAL * BIT 3 EXTERNAL DEVICE * BIT 4 PLATO COMM CHARACTER REQUEST * BIT 5 TOUCH PANEL * BIT 6 KEYBOARD * BIT 7 PLATO COMM CHARACTER READY * * * * * * * * * * * * * * * * * * * * * * * SPACE 1 ENAB EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 6CH DISABLE UNALLOWED INTERRUPTS OR 44H ENABLE LONG INTERVAL AND KYBD 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 * 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 (VIDEOCTL),A BULKER1 IN A,(SYSSTAT) GET SYSTEM STATUS RLCA JR C,BULKER1 WAIT UNTIL BULK ERASE DONE RET 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 * APOSTROPHE HEX 00,00,00,08 HEX 08,08,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 * /--- BLOCK AIST3 00 000 73/00/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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 (CIRCUMFLEX) 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 * LEFT ACCENT MARK 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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,00,1C HEX 1C,1C,1C,00 HEX 1C,1C,1C,1C 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 * /--- BLOCK AIST3 00 000 73/00/00 00.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 * ASSIGNMENT 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 * /--- BLOCK AIST3 00 000 73/00/00 00.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 * EMBEDDED LEFT PAREN HEX 00,00,00,40 HEX 20,10,18,14 HEX 12,14,18,30 HEX 40,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 * EMBEDDED RIGHT PAREN HEX 00,00,00,01 HEX 02,04,0C,14 HEX 24,14,0C,06 HEX 01,00,00,00 M1CODE1F EQU * TUTOR 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 * /--- BLOCK AIST3 00 000 73/00/00 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 * MATRIX MULTIPLY HEX 00,00,00,00 HEX 00,00,0C,12 HEX 12,0C,00,00 HEX 00,00,00,00 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 * VECTOR CROSS PRODUCT HEX 00,00,00,00 HEX 00,41,22,14 HEX 08,14,22,41 HEX 00,00,00,00 M1CODE26 EQU * RIGHT ACCENT MARK HEX 00,20,10,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE27 EQU * CEDILLA HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,20 HEX 10,08,00,00 M1CODE28 EQU * MAD HAT HEX 00,22,14,08 HEX 00,00,00,00 HEX 00,00,00,00 HEX 00,00,00,00 M1CODE29 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 M1CODE2A EQU * VERTICAL BAR HEX 00,00,00,08 HEX 08,08,08,08 HEX 08,08,08,08 HEX 00,00,00,00 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 15H NAK DEFW DC4 MODE ADD=REWRITE MODE DEFB 16H SYN DEFW DC1 MODE SUB=INVERSE MODE 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 01H SOH DEFW AINIT.G DEFB 1BH ESC DEFW ESC DEFB 3DH DEFW STCOL 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 0FH SI DEFW SI 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 ********** * UNIMPLEMENTED OR UNDEFINED COMMANDS COME HERE ********** TEMP EQU * RET ********** * ROUTINES TO EXECUTE CONTROL CODES AND ESCAPE SEQUENCES ********** DC1 EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * STCOL EQU * LD A,12 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,01 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 ******** * INITIALIZE GRAPHICS WITHOUT SCREEN ERASE * SI EQU * LD HL,00D0H CALL R.XMIT SEND ECHO LD A,0EH SET SO CODE FLAG LD (SAVE5F+15),A JP AINIT.G EJECT ******************************************************** * THE FOLLOWING CODE AND DATA ARE UNIQUE TO * TIMESHARE AND GRAPHICS OPERATION. ******************************************************** ********* * ASCII INITIALIZE ********** AINIT.G EQU * GRAPH MODE INIT LD HL,001EH SET ALPHA/OVERSTRIKE WRITE LD DE,CTLADR.G SELECT GRAPH MODE CTL TABLE LD BC,ESCADR.G SELECT GRAPH MODE ESC TABLE LD A,1 SET GRAPHIC MODE JR AINIT1 AINIT EQU * TIMESHARE MODE INIT LD HL,001AH SET ALPHA/REWRITE LD DE,CTLADR.T SELECT TIMESHARE CTL TABLE LD BC,ESCADR.T SELECT TIMESHARE ESC TABLE XOR A SET TIMESHARE MODE AINIT1 EQU * LD (CTLADR),DE SELECT CTL TABLE LD (ESCADR),BC SELECT ESC TABLE LD (TGMODE),A SET TIMESHARE OR GRAPHIC MODE LD A,01H SET ERROR PROTOCOL TO STATE 0 LD (EREG),A XOR A SELECT ASCII MODE LD (MODE),A LD (SCALEFG),A SET FOR SCALING CALL R.MODE SELECT WRITING MODE IN A,(COMMSW) READ COMM SWITCHES CPL FORCE APPARENT SWITCH CHANGE LD (XCOMMSW),A LD A,3 SET (M.KSW) TO PUT INPUT DATA LD (M.KSW),A INTO THE USER BUFFER LD HL,IGTASC SELECT IGT ASCII KEYBOARD LD (KBAADR),HL CALL ASIZE1 SELECT A0 CHARACTER SET LD HL,122 SET Y BIAS LD (BIAS),HL XOR A LD HL,256 PUT CROSSHAIR IN CENTER OF LD (G.XREG),HL SCREEN LD (G.YREG),HL CALL AFF CLR SCREEN, HOME, SET ALPHA LD A,MRESET0 RESET INTERFACE. OUT (CNTLFCN),A LD A,MRESET1 RESET PRINTER. OUT (CNTLFCN),A CALL CHECKID CHECK PRINTER ID RET NZ EXIT IF NO PRINTER ATTACHED * /--- BLOCK AIST3 00 000 73/00/00 00.00 IN A,(CNTLFCN) CLEAR OUT ERROR/REJECT STATUS CALL ZEROCNT ZERO OUT SOLENOID COUNTERS RET ********** * ASCII IDLE LOOP (TIMESHARE OR GRAPHIC OPERATION) ********** AIDLE EQU * ASCII IDLE CALL R.EXEC TEST FOR RECEIVE/TRANSMIT DATA CALL R.INPUT TEST FOR DATA FROM OPERATOR BIT 7,H TEST FOR DATA FROM KB OR TP JR NZ,AIDLE2 JUMP IF NO DATA EX DE,HL PUT DATA INTO DE LD A,03H TEST FOR KB DATA AND D JR NZ,AIDLE1 JUMP IF NOT KEYBOARD DATA CALL KEY PROCESS KEYBOARD DATA JR AIDLE2 AIDLE1 EQU * LD A,03H TEST FOR TP DATA AND D CP 01H CALL Z,TOUCH PROCESS TP DATA AIDLE2 EQU * CALL BLINK BLINK THE CURSOR JP IDLE LENGTH2 EQU *-FWA2 END OF SECOND CHECKSUM AREA EJECT BUFFERS AND DATA STORE AREAS * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * W A R N I N G * * * * THE PROGRAM BEFORE THIS VARIABLE AREA MUST NOT * * EXTEND BEYOND ADDRESS 22A0 HEX. THE LOAD ROUTINE * * RESIDENT IN THE ROM WHICH LOADS FROM THE PLATO * SYSTEM, USES ADDRESS 22B3 HEX AS THE TOP OF THE * PROCESSOR STACK, AND ADDRESSES DOWN TO 22A1 HEX * MAY BE DESTROYED AS THE LOADER ROUTINE USES THE * STACK FOR CALL'7S AND STORES. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SPACE 3 **************************************** * VARIABLES SET OR ACCESSED BY THE * * ROM RESIDENT PROGRAM. * * NOTE...THESE ADDRESSES MUST BE FIXED * * AND THEIR VALUES CANNOT BE CHANGED * * BY R.INIT * **************************************** LDSOURCE EQU 22C7H LOAD SOURCE FLAG (-1 = DISK) CKSUMTBL EQU 22C8H START ADDR OF CHECKSUM TABLE CHECKSUM EQU 22CAH CHECKSUM SET BY LOADER LOADFLAG EQU 22CBH 3CH=CODE IS LOADED RESETFLG EQU 22CCH 3CH=DO SHORT RESET MODE EQU 22CDH ASCII RESIDENT OPERATING MODE * (0X=ASCII, 8X=PLATO) LOADINFO EQU 22CEH LOAD INFORMATION * (BIT 0, 0=RS232, 1=LONG LINE) * (BIT 1, 0=INTERNAL, 1=EXTERNAL) * (BIT 2, 0=PLATO, 1=ASCII) * /--- BLOCK AIST3 00 000 73/00/00 00.00 * (BITS 4-3, 0X=HOST, 10=ROM, 11=DISK) * (BITS 7-5, ASCII BAUD RATE) RUNINFO EQU 22CFH RUN INFORMATION * (SAME BITS AS IN LOADINFO) **************************************** * PLATO VARIABLES * * NOTE...THESE ADDRESSES MUST BE FIXED * **************************************** M.LDFILE EQU 22E5H LOAD FILE NUMBER SET BY LOADER BEGVAR1 EQU 22E6H START OF FIRST VARIABLE AREA M.SBTYPE EQU 22E6H TERMINAL SUBTYPE M.CONFIG EQU 22E7H TERMINAL CONFIGURATION M.M0 EQU 22E8H STARTING ADDRESS OF M0 M.VERS EQU 22EAH CONTROLWARE VERSION - CHANGES * WITH NEW PRODUCTION VERSION M.TYPE EQU 22EBH TERMINAL ID CODE M.CLOCK EQU 22ECH REAL TIME CLOCK M.EXTPA EQU 22EEH EXTERNAL INT. PROC. ADDRESS M.MARGIN EQU 22F0H MARGIN USED FOR CARR RET M.JOBS EQU 22F2H JOB STACK COUNT M.CCR EQU 22F4H CHARACTER PLOTTING PARAMETERS M.MODE EQU 22F6H TERMINAL OPERATING MODE M.DIR EQU 22F8H DIRECTION OF COORDINATE STEP M.KSW EQU 22FAH DEVICE INPUT DIRECTOR M.ENAB EQU 22FCH INTERRNAL INTERRUPT MASK * 22FEH (UNUSED) MOD5A EQU 2300H MODE 5 ADDRESS MOD6A EQU 2302H MODE 6 ADDRESS MOD7A EQU 2304H MODE 7 ADDRESS * MEM2 EQU 2306H M2 CHARACTER SET ADDRESS MEM3 EQU 2308H M3 CHARACTER SET ADDRESS MEM4 EQU 230AH M4 CHARACTER SET ADDRESS MEM5 EQU 230CH M5 CHARACTER SET ADDRESS MEM6 EQU 230EH M6 CHARACTER SET ADDRESS MEM7 EQU 2310H M7 CHARACTER SET ADDRESS * 2312H AND 2313H RESERVED M.HALT EQU 2314H USER PROGRAM HALT MESSAGE * (2 BYTES) M.STATUS EQU 2316H USER PROGRAM EXECUTION STATUS * (2 BYTES) * 2318H THROUGH 231FH NOT USED ENDVAR1 EQU 2320H END OF FIRST VARIABLE AREA EJECT ORG ENDVAR1+OFFSET FWA3 EQU * START OF THIRD CHECKSUM AREA CHKCARR EQU * * SEE WHETHER THE CARRY IS PRESENT. IF SO, GO * TO THE IDLE LOOP. IF NOT, TELL THE USER AND THEN * GO TO THE IDLE LOOP. CALL CARRIER JP NC,IDLE IF CARRIER IS PRESENT * TELL THE USER THAT THE HOST IS NOT CONNECTED LD HL,16 CALL R.OUTY LD HL,184 CALL R.OUTX LD HL,HSTNCONM CALL R.CHARS CALL FF JP IDLE * HOST DISCONNECTED HSTNCONM HEX 48,4F,53,54,2D HEX 44,49,53 HEX 43,4F,4E,4E,45,43,54,45,44 HEX 3F,00 CARRIER EQU * * PURPOSE TELL WHETHER CARRIER IS PRESENT. * EXIT CARRY FLAG NOT SET IF CARRIER PRESENT * CARRY FLAG SET IF NO CARRIER * USES A LD A,10H OUT (ASCCTRL),A IN A,(ASCSTAT) AND 8H RET NZ IF CARRIER THERE, CARRY NOT SET SCF SET CARRY TO SHOW NO CARRIER RET EJECT ********** * ROUTINE TO BLINK THE CURSOR ********** BLINK EQU * CALL BLINKTST IS IT TIME TO BLINK RET NC JUST EXIT IF NO LD A,(G.SUPCUR) IS THE CURSOR SUPPRESSED OR A JP NZ,PRBLINK1 JUST BLINK PRINT ERROR IF YES CALL CUR.SAVE SAVE DATA AT CURSOR POSITION LD A,(WEFLAG) SET B = 2 OR 3 ADD A,2 LD B,A LD C,60H * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 JP PRBLINK1 BLINK PRINT ERROR IF ON * CALLABLE ROUTINE TO TEST FOR TIME TO BLINK. * ROUTINE EXITS WITH CARRY CLEAR IF NOT. * IF YES, ROUTINE RESETS BLINK COUNTER, TOGGLES THE * WRITE/ERASE FLAG AND EXITS WITH CARRY SET. BLINKTST EQU * LD HL,BLINKCTR TEST BLINK COUNTER LD A,(HL) OR A RET NZ EXIT IF NOT TIME TO BLINK LD (HL),10 RESET BLINK COUNTER LD HL,WEFLAG TOGGLE WRITE/ERASE FLAG LD A,(HL) XOR 01 LD (HL),A SCF 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * 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 KEY1 EQU * LD B,C SAVE UNMODIFIED KEY CODE LD A,(G.TTYFLG) IS ALL CAPS SELECTED OR A JR NZ,XMTEST NO, JUMP BIT 6,C IF BIT 6 IS SET, JR Z,XMTEST RES 5,C THEN CLEAR BIT 5 XMTEST EQU * LD A,(MODE) CHECK MODE CP 8 JP Z,GIN.KB JUMP IF GIN MODE CALL XMIT.1A TRANSMIT CHAR IF NOT LOCAL LD A,(DUPLEXFG) OR A JP Z,XJOB PROCESS DATA IF HALF DUPLEX LD A,(LOC.RMT) OR A JP NZ,XJOB PROCESS DATA IF LOCAL LD (BS.ERASE),A CLEAR BS ERASE FLAG RET * /--- BLOCK AIST3 00 000 73/00/00 00.00 EJECT * * * * * * * * * * * * * * * * * * * * * THE FOLLOWING KEYS PERFORM SPECIAL 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.MODE CODE 80 DEFW G.RESET CODE 81 DEFW G.CAPS CODE 82 DEFW G.BREAK CODE 83 DEFW G.PAGE CODE 84 DEFW G.ERASE CODE 85 DEFW G.RUBOUT CODE 86 DEFW G.CPRINT CODE 87 * 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.CAPS EQU * LD HL,G.TTYFLG TOGGLE TTY CAPS FLAG LD A,(HL) XOR 01H LD (HL),A JP DSTAT UPDATE STATUS LINE IF ON * G.BREAK EQU * LD A,(PRINTERR) IS THERE A PRINTER ERROR OR A JR NZ,G.PRNTCL YES, STOP THE PRINT LD A,(LOC.RMT) DO NOTHING IF LOCAL OR A RET NZ LD HL,ASCPKG+5 SEND BREAK SET 4,(HL) CALL ASCSETUP LD HL,8000H WAIT ABOUT 250 MS G.BREAK1 EQU * DEC HL LD A,L OR H JR NZ,G.BREAK1 LD HL,ASCPKG+5 CLEAR BREAK RES 4,(HL) CALL ASCSETUP RET * G.ERASE EQU * LD A,01H SET BS ERASE FLAG LD (BS.ERASE),A LD C,08H LOAD A BS CHARACTER JP KEY1 AND GO EXECUTE IT * G.RUBOUT EQU * LD BC,7F7FH LOAD A RUBOUT CHARACTER JP XMTEST SKIP OVER CAPS TEST * G.SCOPY EQU * DI SIMULATE A SHIFT-PRINT KEY PUSH AF INTERRUPT PUSH BC PUSH DE PUSH HL LD HL,403FH JP KYBD1 * G.PRINT EQU * LD A,(CPRINTFG) IS COMM PRINT ACTIVE OR A RET NZ CANNOT SCREEN COPY IF YES CALL CHECKID CHECK PRINTER ID * /--- BLOCK AIST3 00 000 73/00/00 00.00 RET NZ EXIT IF NO PRINTER ATTACHED CALL CUR.ERAS ERASE CURSOR JP PRINT DO PRINT * G.CPRINT EQU * CALL CHECKID CHECK PRINTER ID RET NZ EXIT IF NO PRINTER ATTACHED LD HL,CPRINTFG SET COMM PRINT FLAG TO 1 IF LD A,(HL) IT IS = 0, ELSE SET IT TO 0. LD (HL),1 TURN ON COMM LINE PRINT OR A JR Z,G.PRNT G.PRNTCL EQU * XOR A TURN OFF COMM LINE PRINT LD (CPRINTFG),A CALL RET.MEM RESTORE SAVED MEMORY IF PRINT * ERROR FLAG IS SET G.PRNT EQU * JP DSTAT UPDATE STATUS LINE IF ON EJECT ********* * 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,85 1X HEX 82,FF,0D,0A HEX 08,86,83,FF 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 08,86,83,FF 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 * THE FOLLOWING CODES ARE GENERATED WITH THE CTRL KEY HEX FF,FF,FF,FF 8X HEX FF,FF,FF,FF HEX FF,FF,00,1C HEX 09,1E,FF,FF HEX FF,1B,FF,85 9X HEX 82,FF,0D,0A HEX 08,86,83,FF HEX 84,80,FF,FF HEX FF,FF,1B,1D AX HEX FF,FF,1F,FF HEX FF,FF,FF,FF HEX 09,FF,FF,FF HEX FF,1B,FF,85 BX HEX 82,FF,0D,0A HEX 08,86,83,FF HEX 81,80,FF,87 HEX FF,01,02,03 CX HEX 04,05,06,07 HEX 08,09,0A,0B * /--- BLOCK AIST3 00 000 73/00/00 00.00 HEX 0C,0D,0E,0F HEX 10,11,12,13 DX HEX 14,15,16,17 HEX 18,19,1A,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF EX HEX FF,FF,FF,FF HEX FF,FF,FF,1B HEX 1C,1D,1E,1F HEX 00,FF,FF,FF FX HEX FF,FF,FF,FF HEX FF,FF,FF,FF HEX FF,FF,FF,FF EJECT ********** * JUMP TABLE FOR GRAPH MODE ESCAPE SEQUENCES ********** ESCADR.G EQU * DEFB 07H BEL DEFW BEL DEFB 08H BS DEFW BS DEFB 0DH CR DEFW ESC 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 17H ETB DEFW G.SCOPY 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 02H STX DEFW PINIT DEFB 03H ETX DEFW AINIT DEFB 1BH ESC DEFW ESC DEFB 0FFH END OF TABLE ********** * JUMP TABLE FOR GRAPH MODE CONTROL CODES ********** CTLADR.G EQU * DEFB 0DH CR DEFW ACR DEFB 0AH LF DEFW ALF DEFB 08H BS DEFW BS DEFB 0EH SO * /--- BLOCK AIST3 00 000 73/00/00 00.00 DEFW PINIT.3 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 19H EM DEFW EM DEFB 0FFH END OF TABLE SPACE 4 ********** * JUMP TABLE FOR TIMESHARE MODE ESCAPE SEQUENCES ********** ESCADR.T EQU * DEFB 01H SOH DEFW AINIT.G DEFB 02H STX DEFW PINIT DEFB 08H BS DEFW BS.3 DEFB 1BH ESC DEFW ESC DEFB 0FFH END OF TABLE ********** * JUMP TABLE FOR TIMESHARE MODE CONTROL CODES ********** CTLADR.T EQU * DEFB 0DH CR DEFW ACR DEFB 0AH LF DEFW ALF DEFB 08H BS DEFW BS DEFB 09H HT DEFW HTAB DEFB 0BH VT DEFW AVT DEFB 0CH FF DEFW AFF DEFB 07H BEL DEFW BEL DEFB 1BH ESC DEFW ESC DEFB 0FFH END OF TABLE EJECT * * * * * * * * * * * * * * * * * * * * * ROUTINES TO EXECUTE CONTROL CODES AND ESCAPE SEQUENCES * * * * * * * * * * * * * * * * * * * * ********** * SOUND AUDIBLE ALARM AND CLEAR BYPASS. ********** BEL EQU * LD A,01H SOUND AUDIBLE ALARM OUT (MISCTL),A XOR A CLEAR BYPASS LD (BYPASS),A LD (DARK),A DISABLE DARK VECTOR RET ********** * BACKSPACE CURSOR ONE CHARACTER POSITION. IF AT BEGINNING * OF LINE, GO TO LAST CHARACTER POSITION ON LINE ABOVE. IF * AT TOP LINE, WRAP TO BOTTOM LINE WITHIN AREA DEFINED BY * (PAGEND). (BYPASS) IS ALSO CLEARED. ********** BS EQU * CALL CUR.ERAS ERASE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A CALL R.INPX IS X < WIDTH OF CHAR LD DE,(WIDTH) OR A SBC HL,DE JR C,BS.1 YES, JUMP CALL R.OUTX NO, JUST BACK UP X * /--- BLOCK AIST3 00 000 73/00/00 00.00 JR BS.2 BS.1 EQU * LD HL,(LINEND) YES, GO TO END OF LINE CALL R.OUTX CALL AVT.1 AND DO A VERTICAL TAB BS.2 EQU * LD A,(BS.ERASE) IS BS ERASE FLAG SET OR A RET Z ALL DONE IF NOT LD BC,0100H ERASE THE PRESENT CHARACTER CALL ACHARGEN BY WRITING A SPACE OVER IT BS.3 EQU * XOR A CLEAR THE BS ERASE FLAG LD (BS.ERASE),A RET ********** * MOVE CURSOR UP ONE LINE. IF AT TOP LINE, WRAP CURSOR TO * BOTTOM LINE WITHIN AREA DEFINED BY (PAGEND). * (BYPASS) IS ALSO CLEARED. ********** AVT EQU * CALL CUR.ERAS ERASE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A AVT.1 EQU * CALL R.INPY IS Y+(HEIGHT)>=513-(HEIGHT) LD DE,(HEIGHT) ADD HL,DE EX DE,HL (DE=Y+HEIGHT, HL=HEIGHT) LD BC,513 SBC HL,BC ADD HL,DE JR NC,AVT.1A NO, JUST MOVE Y UP LD DE,(PAGEND) YES, WRAP TO BOTTOM AVT.1A EQU * EX DE,HL UPDATE Y JP R.OUTY ********** * DO A CARRIAGE RETURN BY MOVING CURSOR TO LEFTMOST X * POSITION. IF CR/LF IS SPECIFIED IN (STRAP), ALSO DO * A LINE FEED FUNCTION. (BYPASS) IS ALSO CLEARED. ********** ACR EQU * CALL ACR.1 DO CR, CLR BYPASS, SET ALPHA LD A,(STRAP) IS CR/LF SELECTED BIT 0,A RET Z EXIT IF NOT * CALLABLE ROUTINE TO DO A LINE FEED FUNCTION, INCLUDING * SCROLL IF IN TIMESHARE MODE. ALF.1 EQU * CALL R.INPY DE=Y-(HEIGHT) LD DE,(HEIGHT) OR A SBC HL,DE EX DE,HL LD HL,(PAGEND) IS Y-(HEIGHT)<(PAGEND) SCF SBC HL,DE JR NC,ALF.1A YES, AT BOTTOM LINE EX DE,HL NO, JUST MOVE Y DOWN ONE LINE JP R.OUTY ALF.1A EQU * LD A,(TGMODE) CHECK TIMESHARE OR GRAPHIC OR A JR Z,SCROLL JUMP IF TIMESHARE * EXTERNAL ENTRY TO SET Y TO TOP LINE OF DISPLAY. ALF.2 EQU * LD HL,512 LD DE,(HEIGHT) OR A SBC HL,DE JP R.OUTY * CALLABLE ROUTINE TO SCROLL PAGE UP ONE DISPLAY LINE. * ROUTINE SCROLLS DATA BETWEEN TOP OF PAGE AND Y=(PAGEND) * /--- BLOCK AIST3 00 000 73/00/00 00.00 * UP ONE DISPLAY LINE AND CLEARS THE BOTTOM DISPLAY LINE * IN THIS RANGE. THIS ROUTINE TAKES ABOUT 220 MILLISECONDS * TO SCROLL 34 LINES OF ASCII SIZE CHARACTERS. SCROLL EQU * LD HL,(HEIGHT) SET BC=512-(PAGEND+HEIGHT) LD DE,(PAGEND) (NUMBER OF BYTES TO MOVE) ADD HL,DE EX DE,HL LD HL,512 SBC HL,DE LD B,H LD C,L LD DE,8000H INITIALIZE DE FOR SCROLL SCROLL1 EQU * PUSH DE SAVE ADDRESS FOR LATER USE PUSH BC SAVE BYTE COUNT FOR LATER USE LD HL,(HEIGHT) HL=FROM ADDRESS LD H,D LDIR LD BC,(HEIGHT) NOW CLEAR BOTTOM LINE DEC BC LD H,D LD L,E INC DE LD (HL),0 LDIR POP BC POP DE INC D REPEAT FOR ALL COLUMNS INC D JR NZ,SCROLL1 RET ********** * DO A LINE FEED FUNCTION BY MOVING THE CURSOR DOWN ONE * CHARACTER LINE IF NOT ALREADY AT BOTTOM LINE OF AREA * DEFINED BY (PAGEND). 'IF ALREADY AT BOTTOM LINE, DO NOT * MOVE CURSOR, BUT SCROLL PAGE UP ONE CHARACTER LINE IF IN * TIMESHARE MODE. IF IN GRAPHIC MODE WITH CURSOR AT BOTTOM * CHARACTER LINE, THE CURSOR WILL WRAP TO THE TOP LINE. * (BYPASS) IS ALSO CLEARED. ALSO IF LF/CR IS SELECTED BY * (STRAP), A CARRIAGE RETURN FUNCTION IS PERFORMED. ********** ALF EQU * CALL CUR.ERAS ERASE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A CALL ALF.1 DO THE LINE FEED LD A,(STRAP) IS LF/CR SELECTED BIT 1,A RET Z EXIT IF NOT * CALLABLE ROUTINE TO DO A CARRIAGE RETURN FUNCTION BY * SETTING THE X COORDINATE TO 0, CLEARING BYPASS AND * SELECTING ALPHA MODE. ACR.1 EQU * CALL US.2 CLEAR BYPASS, SELECT ALPHA LD HL,0 JP R.OUTX ********** * MOVE CURSOR TO THE RIGHT ONE CHARACTER POSITION. IF AT * END OF LINE, DO A CARRIAGE RETURN AND LINE FEED * (INCLUDING SCROLL OR PAGE WRAP IF NECESSARY). ********** HTAB EQU * CALL CUR.ERAS ERASE CURSOR XOR A CLEAR BYPASS LD (BYPASS),A HTAB.1 EQU * CALL R.INPX DE=X+(WIDTH) LD DE,(WIDTH) ADD HL,DE EX DE,HL LD HL,(LINEND) IS X+(WIDTH)>(LINEND) SBC HL,DE * /--- BLOCK AIST3 00 000 73/00/00 00.00 JR C,HTAB.2 YES, AT END OF LINE EX DE,HL NO, JUST MOVE X RIGHT ONE CHAR JP R.OUTX HTAB.2 EQU * END OF LINE, SO CALL ACR.1 DO CARRIAGE RETURN JP ALF.1 AND LINE FEED ********** * CLEAR SCREEN, CLEAR BYPASS, SELECT ALPHA MODE AND SET * CURSOR TO LEFTMOST POSTION ON TOP CHARACTER LINE. ********** AFF EQU * CALL CUR.ERAS ERASE CURSOR LD A,(SAVE5F+15) CP 0EH TEST FOR SO CODE CALL NZ,BULKER ERASE IF NOT SO CODE XOR A LD (SAVE5F+15),A CLEAR SO CODE. CALL DSTAT REDISPLAY STATUS LINE IF ON AFF.1 EQU * CALL US.2 CLEAR BYPASS, SET ALPHA CALL ACR.1 DO CARRIAGE RETURN JP ALF.2 SET TO TOP LINE ********** * SET BYPASS ********** CAN EQU * LD HL,BYPASS SET BYPASS LD (HL),1 RET ********** * TRANSMIT TERMINAL STATUS (IF NOT IN GIN MODE), TRANSMIT * X AND Y COORDINATE, AND OPTIONALLY SEND CR OR CR,EOT * DEPENDING ON (STRAP) WORD. SET ALPHA MODE IF IN GIN MODE. ********** 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 LD A,(CPRINTFG) CHECK IF PRINTING FROM COMM OR A LINE JR NZ,ENQ.0 JUMP IF YES CALL CHECKID CHECK PRINTER ID JR NZ,ENQ.0 JUMP IF NO PRINTER ATTACHED IN A,(CNTLFCN) CHECK PRINTER STATUS AND 39H JR NZ,ENQ.0 JUMP IF STATUS ERROR RES 4,C INDICATE PRINTER AVAILABLE ENQ.0 EQU * CALL XMIT.1A ENQ.1 CALL R.INPX GET X COORD CALL HILO AND SEND IN 2 BYTES CALL R.INPY GET Y COORD LD DE,(BIAS) SUBTRACT THE BIAS OR A (CLEAR CARRY) SBC HL,DE CALL HILO AND SEND IN 2 BYTES LD A,(STRAP) TEST GIN TRANSMISSION BIT 2,A JR Z,ENQ.2 JUMP IF SEND NOTHING AUTO PUSH AF SAVE STRAP VALUE LD C,0DH SEND CAR RET CALL XMIT.1A POP AF GET SAVED STRAP BIT 3,A JR Z,ENQ.2 SEND CR ONLY LD C,04H SEND EOT CALL XMIT.1A * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * CALLABLE ROUTINE TO EXIT FROM GIN MODE. CROSSHAIR CURSOR * POSITION IS SAVED AND TOUCH PANEL IS DISABLED. 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 A,(STATLINE) DO NOT DISABLE TOUCH PANEL OR A IF STATUS LINE RET NZ IS DISPLAYED LD H,04H LOAD INTERRUPT MASK LD A,(M.ENAB) RES 5,A DISABLE TOUCH PANEL LD L,A CALL R.SSF RET * CALLABLE ROUTINE TO TRANSMIT CURRENT X OR Y POSITION OF * THE GIN CROSSHAIR CURSOR. ON ENTRY, THE COORDINATE IS IN * HL. THE POSITION IS TRANSMITTED AS TWO CHARACTERS. 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 RES 1,H LIMIT COORD TO 511 MAXIMUM 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 ********** * SELECT BLOCK WRITE/ERASE MODE ********** EM EQU * CALL CUR.ERAS ERASE CURSOR LD A,01 SUPPRESS THE CURSOR LD (G.SUPCUR),A XOR A CLEAR BYPASS LD (BYPASS),A * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD A,0B1H SET TERMINAL STATUS LD (TSTAT),A CALL GIN.EXIT DISABLE TP, SAVE CURSOR POS. JP EM.1 ********** * 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,0B1H 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 ********** * SELECT ASCII SIZE CHARACTERS. ********** 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,504 85 CHARS PER LINE LD (LINEND),HL 34 LINES PER PAGE LD HL,36 SET LINEND, PAGEND, HEIGHT LD (PAGEND),HL AND WIDTH ACCORDINGLY LD HL,14 LD (HEIGHT),HL LD HL,6 LD (WIDTH),HL XOR A SET SIZE TO ZERO LD (G.SIZE),A (SIZE 1 CHARS) RET ********** * SELECT PLATO SIZE CHARACTERS. ********** 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,504 64 CHARS PER LINE * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD (LINEND),HL 30 LINES PER PAGE LD HL,32 SET LINEND, PAGEND, HEIGHT LD (PAGEND),HL AND WIDTH ACCORDINGLY LD HL,16 LD (HEIGHT),HL LD HL,8 LD (WIDTH),HL LD A,1 INDICATE SIZE 2 CHARS LD (G.SIZE),A RET ********** * SELECT GIN MODE, SET BYPASS, ENABLE THE TOUCH PANEL * AND SET UP GIN CURSOR. ********** 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 ********** * SET UP FOR DOTTED AND DASHED VECTORS. ********** 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 * GRAPHICS MODE DASHED VECTORS GO 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 IGNORE RUBOUT CHARACTER RET Z SUB 20H BIAS CHAR LD C,A * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD A,(M.MODE) PUT W/E BITS IN B REG. LD B,A CALL ACHARGEN DISPLAY THE CHARACTER JP HTAB.1 MOVE TO NEXT COLUMN ********** * 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 JP (HL) CHGEN.S1 OR CHGEN.S2 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK NORTHS 00 000 73/00/00 00.00 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 * * ON ENTRY, B=UNMODIFIED ASCII KEY CODE * C=CAPS MODIFIED ASCII KEY CODE * * * * * * * * * * * * * * * * * * * * * GIN.KB EQU * XOR A CLEAR THE BS ERASE FLAG LD (BS.ERASE),A LD A,C IS CHAR A CR CP 0DH JR Z,GIN.XMT SEND LAST KEY IF YES LD A,C SAVE GIN CHAR KEY LD (GIN.KEY),A LD HL,1 ASSUME FINE GRID BIT 5,B CHECK FOR SHIFTED KEY JR NZ,GIN.2 FINE GRID IF UNSHIFTED ADD HL,HL COARSE GRID IF SHIFTED ADD HL,HL GIN.2 LD (DOTS),HL SAVE GRID MOVEMENT VALUE RES 5,B CLEAR BIT 5 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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.MODE 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD A,(M.ENAB) RES 5,A OR B LD L,A CALL R.SSF LD A,(STATLINE) IF STATUS LINE SELECTED OR A JP NZ,DSTAT THEN DISPLAY IT * CLEAR STATUS LINE * CLEARS FROM Y=16 THROUGH Y=31 ACROSS ENTIRE SCREEN. STAT.ERS EQU * LD H,80H STAT.ER1 EQU * INC H LD D,H LD L,0E0H LD E,0E1H LD BC,15 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 CHECK Y COORD AND 0EH RET NZ IGNORE TOUCH UNLESS Y=0 OR 1 LD A,E SET BC=X COORD DIV 2 RLCA RLCA RLCA AND 7 CP 7 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,STAT.UP1 LD (HL),A RESET IF OVERFLOW STAT.UP1 EQU * LD A,C CHECK WHICH FIELD WAS CHANGED DEC A JR Z,STAT.F1 FIELD 1 SUB 4 JR Z,STAT.F5 FIELD 5 DEC A JR NZ,DSTAT NOT FIELD 6 * UPDATE FIELD 6 (TTY/GRAPH FIELD) STAT.F6 EQU * LD A,(TGMODE) WHICH MODE OR A JR NZ,STAT.F6A CALL AINIT TIMESHARE MODE INIT JR DSTAT STAT.F6A EQU * CALL AINIT.G GRAPHICS MODE INIT JR DSTAT * UPDATE FIELD 5 (SCALE FIELD) STAT.F5 EQU * LD HL,0 UPDATE BIAS IN CASE SCALE FLAG LD A,(SCALEFG) WAS CHANGED OR A JR NZ,STAT.F5A LD HL,122 * /--- BLOCK AIST3 00 000 73/00/00 00.00 STAT.F5A EQU * LD (BIAS),HL JR DSTAT * UPDATE FIELD 1 (BAUD RATE FIELD) STAT.F1 EQU * LD A,(ASCSPEED) UPDATE (RUNINFO) IN CASE LD C,A BAUD RATE WAS CHANGED RRCA RRCA RRCA LD B,A LD HL,RUNINFO LD A,(HL) AND 1FH OR B LD (HL),A LD B,0 UPDATE BAUD RATE LD HL,BAUDRATE ADD HL,BC LD A,(HL) OUT (ASCRATE),A LD HL,ASCPKG+1 POINT TO REG. 4 OUTPUT WORD LD A,(HL) ASSUME X64 CLOCK OR 0C0H LD (HL),A LD A,C CHECK RATE VALUE CP 7 JR NZ,STAT.F1A JUMP IF NOT EXT CLK LD A,(HL) EXT CLK, SO SET X1 CLOCK AND 3FH LD (HL),A STAT.F1A EQU * CALL ASCSETUP OUTPUT PACKAGE TO SIO * DISPLAY THE CURRENT VALUES ON THE STATUS LINE DSTAT EQU * LD A,(MODE) CHECK MODE RLCA RET C NO DISPLAY IF PLATO OPERATION LD A,(STATLINE) SEE IF STATUS LINE IS ON OR A RET Z JUST EXIT IF NOT LD A,(M.ENAB) ENABLE THE TOUCH PANEL SET 5,A LD L,A LD H,04H CALL R.SSF CALL CUR.ERAS ERASE THE CURSOR CALL SAV.OP SAVE CURSOR POSITION LD HL,6 CALL R.OUTX LD HL,16 CALL R.OUTY CALL STAT.ERS ERASE STATUS LINE LD HL,STATUS PUSH HL LD C,8 NO. OF FIELDS IN STATUS LINE 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 * PUSH BC NOW DISPLAY THE WORD PUSH HL CALL DMSG DISPLAY THE FIELD MESSAGE DSTAT6 EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 JP RET.OP RESTORE SAVED CURSOR POSITION * CALLABLE ROUTINE TO DISPLAY A FIELD MESSAGE. * ON ENTRY, DE=FWA OF MESSAGE. * (DMAA)=STARTING DISPLAY ADDRESS, (DMA1)=(DMAA)+200H. * (DMAA) AND (DMA1) ARE UPDATED FOR EACH CHARACTER DISPLAYED DMSG EQU * LD A,(DE) GET CHAR OR A RET Z EXIT IF 0 LD C,A CHAR TO C LD B,1 SET W/E BITS IN B FOR REWRITE PUSH DE CALL ACHARGEN DISPLAY THE CHAR CALL HTAB.1 MOVE TO NEXT COLUMN POP DE INC DE JR DMSG * CALLABLE ROUTINE TO SAVE CURSOR POSITION. SAV.OP EQU * CALL R.INPX LD (G.XREG),HL CALL R.INPY LD (G.YREG),HL RET * CALLABLE ROUTINE TO RESTORE SAVED CURSOR POSITION. RET.OP EQU * CALL CUR.ERAS RESTORE DATA AT CURSOR POS. LD HL,(G.XREG) CALL R.OUTX LD HL,(G.YREG) JP R.OUTY * BAUD RATE TABLE BAUDRATE EQU * DEFB 00H 75/75 DEFB 24H 150/150 DEFB 48H 300/300 DEFB 6CH 600/600 DEFB 90H 1200/1200 DEFB 0B4H 2400/2400 DEFB 80H 1200/75 DEFB 0FCH EXT/EXT * DATA FOR STATUS LINE FIELDS STATTBL EQU * DEFW LNLOCMSG DEFB 2 DEFW BAUDMSG DEFB 8 DEFW CAPSMSG DEFB 2 DEFW PARMSG DEFB 3 DEFW DUPMSG DEFB 2 DEFW SCALEMSG DEFB 2 DEFW TGMSG DEFB 2 DEFW PRINTMSG DEFB 2 LNLOCMSG EQU * HEX 2C,29,2E,25,00 LINE HEX 2C,2F,23,21,2C,00 LOCAL BAUDMSG EQU * HEX 17,15,00 75 HEX 11,15,10,00 150 HEX 13,10,10,00 300 HEX 16,10,10,00 600 * /--- BLOCK AIST3 00 000 73/00/00 00.00 HEX 11,12,10,10,00 1200 HEX 12,14,10,10,00 2400 HEX 11,12,10,10,0F,17,15,00 1200/75 HEX 25,38,34,0D,23,2C,2B,00 EXT-CLK 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 PARMSG EQU * HEX 25,36,25,2E,00 EVEN HEX 2F,24,24,00 ODD HEX 2E,2F,0D,30,21,32,00 NO-PAR DUPMSG EQU * HEX 28,21,2C,26,00 HALF HEX 26,35,2C,2C,00 FULL TGMSG EQU * HEX 34,34,39,00 TTY HEX 27,32,21,30,28,00 GRAPH PRINTMSG EQU * HEX 00 BLANK MESSAGE HEX 30,32,29,2E,34,00 PRINT PAP.MSG EQU * HEX 30,21,30,25,32,00 PAPER DES.MSG EQU * HEX 24,25,33,25,2C,25,23,34,00 DESELECT REJ.MSG EQU * HEX 32,25,2A,25,23,34,00 REJECT EJECT COMMUNICATIONS PRINT * PRINT ALPHANUMERIC DATA FROM COMMUNICATION LINE. * ON ENTRY, C CONTAINS ASCII CHARACTER TO PRINT. * IF NO PRINTER STATUS PROBLEM, THE CHARACTER IS SENT * TO THE PRINTER. IF A STATUS PROBLEM EXISTS, AN * ERROR MESSAGE IS DISPLAYED AND COMMUNICATIONS PRINT * IS DESELECTED. CPRINT EQU * LD A,(CPRINTFG) IS COMM PRINT ACTIVE OR A RET Z JUST EXIT IF NO LD DE,CPRINTXT SET ERROR EXIT CALL WAITOK WAIT FOR DATA REQUEST LD A,C OUTPUT CHARACTER OUT (DATAFCN),A CPRINTXT EQU * RET SPACE 4 * WAIT FOR DATA REQUEST TO RETURN (OK TO SEND). * IF ERROR, JUNK RETURN ADDRESS AND JUMP TO * ADDRESS IN DE REG. * * IF NORMAL RETURN IS TAKEN, ONLY THE A-REGISTER * IS CHANGED. WAITOK IN A,(CNTLFCN) READ PRINTER STATUS AND 3FH MASK OUT THE UPPER 2 BITS CP 04H CHECK FOR DATA REQUEST RET Z RETURN IF OK AND 39H JR Z,WAITOK LOOP IF NO ERRORS POP HL JUNK RETURN ADDRESS EX DE,HL TAKE ERROR EXIT (IN DE) JP (HL) * BLINK PRINT ERROR MESSAGE IF A PRINTER ERROR EXISTS. * CALLABLE ENTRY POINT. PRBLINK EQU * CALL BLINKTST IS IT TIME TO BLINK RET NC JUST EXIT IF NO PRBLINK1 EQU * * /--- BLOCK AIST3 00 000 73/00/00 00.00 LD A,(CPRINTFG) IS COMM PRINT ACTIVE OR A JR NZ,PRCHECK CHECK STATUS IF YES LD A,(PRINTERR) NO, IS PRINT ERROR FLAG SET OR A RET Z NO, JUST EXIT PRCHECK EQU * IN A,(CNTLFCN) GET PRINTER STATUS AND 39H JP Z,RET.MEM RESTORE SAVED MEMORY AND CLEAR * PRINT ERROR FLAG(STATUS OK) * PRINT ERROR EXISTS, SO BLINK ERROR MESSAGE. PUSH AF SAVE STATUS CALL SAV.MEM SAVE DATA AT DISPLAY LOCATION * IF NOT ALREADY SAVED POP AF GET SAVED STATUS RRCA LD DE,REJ.MSG SET -REJECT- MESSAGE JR NC,PRBLINK5 JUMP IF REJECT LD A,SECSTAT REQUEST SECONDARY STATUS OUT (CNTLFCN),A PRBLINK4 EQU * IN A,(CNTLFCN) READ BASIC STATUS BIT 3,A JR Z,PRBLINK4 WAIT FOR DATA AVAILABLE IN A,(DATAFCN) READ SECONDARY STATUS BIT 1,A LD DE,PAP.MSG SET -PAPER- MESSAGE JR NZ,PRBLINK5 JUMP IF PAPER FAULT LD DE,DES.MSG SET -DESELECT- MESSAGE PRBLINK5 EQU * LD A,(WEFLAG) OR A JR Z,DISPLAY SHOW ERROR IF W/E FLAG=ERASE * CLEAR THE ERROR MESSAGE AREA. * F1F0..F1FF, F3F0..F3FF, .. ,FFF0..FFFF. CLEAR EQU * LD H,0F1H CLEAR1 EQU * LD D,H LD L,0F0H LD E,0F1H LD BC,15 LD (HL),0 LDIR INC H INC H BIT 7,H JR NZ,CLEAR1 RET * DISPLAY ERROR MESSAGE DISPLAY EQU * PUSH DE TEMP SAVE MESSAGE FWA CALL CUR.ERAS ERASE CURSOR CALL SAV.OP SAVE X AND Y LD HL,454 SET X AND Y FOR MESSAGE CALL R.OUTX LD HL,2 CALL R.OUTY POP DE GET SAVED MESSAGE FWA CALL DMSG DISPLAY THE MESSAGE JP RET.OP RESTORE X AND Y EJECT * SAVE SCREEN MEMORY IF PRINT ERROR FLAG IS CLEAR. * SET PRINT ERROR FLAG. SAV.MEM EQU * LD HL,PRINTERR CHECK PRINT ERROR FLAG LD A,(HL) OR A RET NZ EXIT IF ALREADY SAVED LD (HL),1 SET PRINT ERROR FLAG LD HL,0F1F0H LD DE,S.MEM * /--- BLOCK AIST3 00 000 73/00/00 00.00 S.MEM1 LD BC,10H LDIR LD BC,1F0H ADD HL,BC BIT 7,H JR NZ,S.MEM1 RET * RESTORE SAVED SCREEN MEMORY IF PRINT ERROR FLAG IS SET. * CLEAR PRINT ERROR FLAG. RET.MEM EQU * LD HL,PRINTERR CHECK PRINT ERROR FLAG LD A,(HL) OR A RET Z EXIT IF NOT SAVED LD (HL),0 CLEAR PRINT ERROR FLAG LD HL,S.MEM LD DE,0F1F0H RET.M1 LD BC,10H LDIR LD BC,1F0H EX DE,HL ADD HL,BC EX DE,HL BIT 7,D JR NZ,RET.M1 RET * ZERO OUT THE SOLENOID COUNTERS. ZEROCNT EQU * LD A,80H LD (PAUSE),A LD HL,SLCNTR LD B,24 XOR A G.PRT0 LD (HL),A INC HL DJNZ G.PRT0 RET * READ PRINTER ID. * IF ID=37H (PRINTER PRESENT) THEN EXIT WITH ZERO FLAG SET. * OTHERWISE EXIT WITH ZERO FLAG CLEAR. CHECKID EQU * LD A,READID READ PRINTER ID OUT (CNTLFCN),A IN A,(DATAFCN) CP 37H RET EJECT PERFORM A SCREEN COPY * * * * * * * * * * * * * * * * * * * * * * * * * * * * *@* * * * PERFORM A SCREEN COPY. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *@* * PRINT EQU * LD (SAVESTK),SP SAVE STACK POINTER. XOR A CLEAR TURNOFF FLAG. LD (TURNOFF),A * CHECK IF THE TIMER IS ON IN THE PRINTER. IF SO, * THEN THE PREVIOUS SCREEN COPY EXCEEDED THE DUTY * CYCLE AND A REDUCED SPEED COPY MUST BE DONE. LD A,SECSTAT REQUEST SECONDARY STATUS. OUT (CNTLFCN),A NOP WAIT A BIT. IN A,(DATAFCN) READ SECONDARY STATUS. BIT 7,A CHECK TIMER BIT. CALL Z,ZEROCNT TIMER OFF, ZERO COUNTERS. * PRINT SOME BLANK LINES. LD B,10 10 LINE FEEDS. LFLOOP EQU * PUSH BC CALL PR.IDLE POP BC LD A,C.LF OUT (DATAFCN),A DJNZ LFLOOP * TURN ON GRAPHICS MODE GMODE EQU * LD HL,BUFFER CLEAR PRINT LINE LD (HL),C.ENQ INC HL LD (HL),40H LD DE,BUFFER+2 TO ADDRESS LD BC,133 NUMBER OF BYTES LDIR * /--- BLOCK AIST3 00 000 73/00/00 00.00 CALL ANROW1 OUTPUT THE LINE * INITIALIZE SCREEN COPY COUNTERS. LD HL,0200H SET UP NUMBER OF ROWS TO PRINT LD (ROWCOUNT),HL LD HL,8000H SET UP DISPLAY MEMORY ADDRESS LD (ROW),HL * COPY THE SCREEN A ROW AT A TIME. NEWROW EQU * CALL ANROW PRINT A ROW LD DE,(ROWCOUNT) UPDATE NO. OF ROWS REMAINING. DEC DE LD (ROWCOUNT),DE LD A,D CHECK IF DONE. OR E JR Z,GDONE DONE PRINTING SCREEN IMAGE. LD A,(TURNOFF) CHECK IF TURNED OFF. AND A JR NZ,GDONE LD HL,(ROW) UPDATE SCREEN ADDRESS TO USED. INC HL LD (ROW),HL JR NEWROW GO PRINT THE NEXT ROW. * * DONE WITH THE PRINT. PRINT A BLANK ROW, * DO A FORM FEED AND EXIT. * GDONE EQU * CALL PR.IDLE LD A,C.LF OUT (DATAFCN),A CALL PR.IDLE LD A,C.FF OUT (DATAFCN),A * CHECK TO SEE IF DUTY CYCLE EXCEEDED. IF SO, * TURN ON THE TIMER SO THAT A RECENT NEXT SCREEN * COPY WILL BE START AT HALF SPEED. GDONE1 EQU * LD A,(PAUSE) AND A CHECK IF OVER DUTY CYCLE (>0) RET M NOT OVER DUTY CYCLE, EXIT. LD A,STIMER START TIMER UP. OUT (CNTLFCN),A RET EJECT IDLE LOOP WHILE PRINTING A SCREEN * * CHECK COMM LINE AND KEYBOARD WHILE IN THE PROCCESS * OF PRINTING A SCREEN. * PR.IDLE EQU * IN A,(CNTLFCN) LD D,A SAVE STATUS FOR STATERR. AND 3FH CP 04H RET Z AND 39H JP NZ,STATERR LD A,(MODE) CHECK PLATO/ASCII OPERATION RLCA CALL C,R.EXEC PROCESS PLATO JOBS. * DO NOT PROCESS JOBS IN GRAPHIC * OPERATION WHILE SCREEN COPY IS * ACTIVE, SO GIN XMIT WILL WAIT * UNTIL SCREEN COPY IS DONE. JR PR.IDLE * DELAY FOR ABOUT 10 MILLISECONDS IF (PAUSE) IS NON- * ZERO. USED TO MISS A PRINT CYCLE SO THAT THE DUTY * CYCLE IS NOT EXCEEDED. DELAY EQU * LD A,(PAUSE) AND A RET M LD HL,12000 ABOUT 60 MS DLOOP EQU * DEC HL LD A,H OR L * /--- BLOCK AIST3 00 000 73/00/00 00.00 JR NZ,DLOOP RET EJECT PRINT A ROW OF DOTS. * PRINT A ROW OF THE SCREEN. * ON ENTRY, HL=START SCREEN MEMORY LOCATION. ANROW LD B,40H ONE ROW OF MEMORY ADDRESS LD HL,(ROW) GET CURRENT MEMORY ADDRESS. * PRINT A SINGLE ROW. * FIRST CHECK IF ALL DOTS ARE 0 IN THIS ROW OR NOT. ALOOP LD A,(HL) OR A JP NZ,ARETURN DATA NOT ALL ZERO INC H INC H DJNZ ALOOP * * PRINT A NULL ROW SINCE ALL DOTS ARE 0. CALL PR.IDLE LD A,05H OUT (DATAFCN),A CALL WAITOK LD A,C.LF OUT (DATAFCN),A RET * NON ZERO DOTS EXIST IN THIS ROW. * LOOP THRU THE LINE 21 TIMES, PACKING 3 BYTES INTO * 4 PRINTER OUTPUT CHARACTERS EACH LOOP. THEN * PICK UP THE RAMAINING BYTE FROM THIS ROW OF THE * SCREEN. ARETURN LD HL,(ROW) LD DE,BUF1 START DATA AREA OF ROW. LD B,21 SET LOOP COUNTER TO 21 LOOP1 LD A,(HL) LD C,A AND 3FH LOWER 6 BITS OR 40H ADD BIT 7 FOR GRAPHIC DATA LD (DE),A STORE THE 1ST 6 BITS IN BUFFER INC H THE 2ND DISPL MEMORY IS 8200 INC H INC DE LD A,C AND 0C0H LD C,A LD A,(HL) AND 0FH OR C LD C,(HL) RLCA RLCA OR 40H LD (DE),A INC H INC H INC DE LD A,C AND 0F0H LD C,A LD A,(HL) AND 03H OR C LD C,(HL) RLCA RLCA RLCA RLCA OR 40H LD (DE),A INC DE LD A,C AND 0FCH RRCA RRCA OR 40H LD (DE),A INC DE INC H INC H DJNZ LOOP1 * PICK UP THE LAST BYTE OF THE SCREEN ROW. LD A,(HL) LD C,A AND 3FH OR 40H LD (DE),A INC DE LD A,C AND 0C0H RLCA RLCA OR 40H LD (DE),A * CALCULATE TOTAL DOTS FOR EACH SOLENOID, STORING * /--- BLOCK AIST3 00 000 73/00/00 00.00 * THE TOTAL IN (SLCNTR). THEN CHECK FOR DUTY CYCLE * EXCEEDED. LD A,255 LD (PAUSE),A FLAG DUTY CYCLE NOT EXCEEDED. LD A,12 512 DOTS FOR 12 SOLENOIDS LD (KEEPER),A LD DE,BUF1 LD HL,SLCNTR CNTR ADDRESS OF FIRST SOLENOID LOP0 LD B,7 7X6=42 DOTS PER SOLENOID LOP1 LD A,(DE) LD C,6 LOP2 RRCA JR NC,LOP2A INC (HL) JR NZ,LOP2A INC HL INC (HL) DEC HL LOP2A DEC C JR NZ,LOP2 INC DE DJNZ LOP1 INC HL LD A,(HL) GET UPPER BYTE OF COUNT. CP 10 IS DUTY CYCLE EXCEEDED JR C,LOPNE NOT EXCEEDED. XOR A LD (PAUSE),A FLAG EXCEEDED. LOPNE EQU * INC HL LD A,(KEEPER) DEC A LD (KEEPER),A JR NZ,LOP0 * AT THIS POINT, (PAUSE) IS 255 IF NO DUTY CYCLE * PROBLEM, 0 IF EXCEEDED. * * SUBTRACT OFF A ROW FROM THE SOLENIOD AVERAGE TO * PRODUCE 128 ROW RUNNING AVERAGE. * DCOUT1 EQU * LD A,(PAUSE) GET DUTY CYCLE FLAG. LD B,12 NUMBER OF SOLENOIDS TO CHECK. LD HL,SLCNTR DCLP2 EQU * PUSH HL LD E,(HL) GET CURRENT SOLENOID COUNTER. INC HL LD D,(HL) LD H,D LD L,E ADD HL,HL DOUBLE TO GET COUNT/128 IN H. LD L,H PICK OFF COUNT/128. LD H,0 EX DE,HL SBC HL,DE EX DE,HL POP HL GET SLCNTR POINTER BACK. LD (HL),E STORE UPDATED COUNTER. INC HL LD (HL),D INC HL DJNZ DCLP2 * * SEND A ROW OF DOTS TO THE PRINTER. ANROW1 EQU * CALL PR.IDLE PROCESS CPU UNTIL READY. CALL DELAY DELAY IF NEEDED. LD A,C.LF PLANT LINE FEED AT END OF BUF. LD (BUF2),A LD C,DATAFCN LD B,94 LD HL,BUFFER LD DE,STATERR ERROR EXIT OUTLP CALL WAITOK OUTI JR NZ,OUTLP RET EJECT STATUS ERROR ROUTINE * FLAG STATUS ERROR AND WAIT FOR STATUS TO BE * CORRECTED OR FOR STOP OR SHIFT-STOP TO BE PRESSED * /--- BLOCK AIST3 00 000 73/00/00 00.00 * ON THE KEYBOARD. STATERR EQU * LD A,01H SOUND ALARM OUT (MISCFCN),A CALL SAV.MEM SAVE DISPLAY MEMORY AND SET * PRINT ERROR FLAG STATERR1 EQU * CALL R.EXEC EXECUTE COMM LINE DATA CALL PRBLINK BLINK PRINT ERROR MESSAGE LD A,(PRINTERR) HAS ERROR BEEN CORRECTED OR A JR Z,STATERR2 JUMP IF YES LD A,(TURNOFF) HAS STOP OR SH-STOP BEEN OR A PUSHED JR Z,STATERR1 LOOP IF NO STATERR2 EQU * CALL RET.MEM RESTORE SAVED MEMORY AND CLEAR * PRINT ERROR FLAG LD SP,(SAVESTK) GET SAVED STACK POINTER. RET RETURN TO IDLE 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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.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 * /--- BLOCK AIST3 00 000 73/00/00 00.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 * /--- BLOCK AIST3 00 000 73/00/00 00.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 * /--- BLOCK AIST3 00 000 73/00/00 00.00 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 * /--- BLOCK AIST3 00 000 73/00/00 00.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 EJECT CONTROLWARE VARIABLES AND BUFFERS. **************************************** * CONTROLWARE VARIABLES * **************************************** STRAP DEFB 04H GRAPHICS MODE STRAP OPTIONS * BIT 0 = CR/LF * BIT 1 = LF/CR * BIT 2 = GIN XMIT CR * BIT 3 = GIN XMIT EOT * THE ABOVE VARIABLE IS PRESET AND IS NOT CHANGED. * THE FOLLOWING FOUR BYTES ARE USED AS AN END FLAG * FOR THE DISK LOADER, AND MUST ALWAYS BE THE LAST * FOUR BYTES OF THE BINARY LOAD FILE. HEX 45,4E,44,46 LENGTH3 EQU *-FWA3 LENGTH OF THIRD CHECKSUM AREA BEGVAR2 EQU * START OF SECOND VARIABLE AREA BLOCKX EQU BEGVAR2 BEGINNING X COORD. FOR MODE 4 BLOCKY EQU BLOCKX+2 BEGINNING Y COORD. FOR MODE XEND EQU BLOCKY+2 ENDING X COORD. FOR MODES 1,4 YEND EQU XEND+2 ENDING Y COORD. FOR MODES 1,4 SAVEL EQU YEND+2 FOR BLOCK MODE SAVER EQU SAVEL+2 FOR BLOCK MODE * THE ABOVE FLAGS MUST BE IN THIS ORDER FOR BLOCK MODE. BIAS EQU SAVER+2 Y COORD BIAS FOR GRAPHICS MODE BLINKCTR EQU BIAS+2 CURSOR BLINK COUNTER BP EQU BLINKCTR+1 X COORDINATE BIT POSITION BS.ERASE EQU BP+1 BACKSPACE ERASE FLAG * 00=BKSP W/O ERASE * 01=BKSP WITH ERASE * /--- BLOCK AIST3 00 000 73/00/00 00.00 BYPASS EQU BS.ERASE+1 BYPASS FLAG (00=OFF, 01=ON) CG.ADR EQU BYPASS+1 CHARACTER GENERATOR ADDRESS CHBASE EQU CG.ADR+2 ASCII CHAR GEN ADDRESS CHFWA EQU CHBASE+2 CHARACTER DATA FWA CKSUM EQU CHFWA+2 IDLE RAM CHECKSUM CKSUMADD EQU CKSUM+1 CURRENT CHECKSUM ADDRESS CKSUMTAD EQU CKSUMADD+2 CURRENT CHECKSUM TABLE ADDRESS CKSUMWC EQU CKSUMTAD+2 CURRENT CHECKSUM WORD COUNT CMODE EQU CKSUMWC+2 COMMAND MODE * 00=OFF, 02=LDC, 04=SSF, * 06=LDE, 08=LDA, 0A=EXT CONFLG EQU CMODE+1 DATA CHARACTER CONVERT FLAG * 00=NO CONVERT, 01=CONVERT CTLADR EQU CONFLG+1 CONTROL CODE TABLE ADDRESS CURSAVED EQU CTLADR+2 CURSOR DATA SAVED FLAG * 00=NOT SAVED, 01=SAVED DARK EQU CURSAVED+1 DARK VECTOR FLAG * 00=NORMAL WRITE, NONZERO=DARK DASH EQU DARK+1 DASH/SOLID VECTOR FLAG * 00=SOLID, NONZERO=DASH DMAA EQU DASH+1 DISPLAY MEMORY ADDRESS DMA1 EQU DMAA+2 DISPLAY MEMORY ADDRESS + 200H DMA2 EQU DMA1+2 DISPLAY MEMORY ADDRESS + 400H DOTS EQU DMA2+2 DOT MOVEMENT FOR GIN MODE E.CNTR EQU DOTS+2 ERROR PROTOCOL CHAR COUNTER ECLOCK EQU E.CNTR+1 ERROR PROTOCOL TIMER EREG EQU ECLOCK+2 ERROR PROTOCOL STATE * 01=STATE 0 (NON ERROR CONTROL) * 02=STATE 1 (ERROR CONTROL) * 04=STATE 2 (ABORT) * BIT 7 = TEMP SAVE FOR CARRY * BIT 6 = ACK FLAG ESEGLEN EQU EREG+1 ERASE SEGMENT LENGTH COUNT ESCADR EQU ESEGLEN+1 ESC SEQUENCE TABLE ADDRESS EXT.IN EQU ESCADR+2 EXTERNAL INPUT DEVICE ADDRESS EXT.OUT EQU EXT.IN+1 EXTERNAL OUTPUT DEVICE ADDRESS G.ESC EQU EXT.OUT+1 ESCAPE FLAG (00=CLEAR, 01=SET) G.MEMSEL EQU G.ESC+1 ADDRESS OF ASCII CHAR TABLE G.SIZE EQU G.MEMSEL+2 ASCII CHARACTER SIZE FLAG * 00=ASCII SIZE, 01=PLATO SIZE G.SUPCUR EQU G.SIZE+1 CURSOR SUPPRESS FLAG * 00=NOT SUPPRESS, 01=SUPPRESS G.XREG EQU G.SUPCUR+1 TEMP SAVE FOR X COORDINATE G.YREG EQU G.XREG+2 TEMP SAVE FOR Y COORDINATE GIN.KEY EQU G.YREG+2 LAST GIN CHARACTER KEY HEIGHT EQU GIN.KEY+1 CHARACTER MATRIX HEIGHT (DOTS) HIX EQU HEIGHT+2 COORDINATE HIGH X BYTE HIY EQU HIX+2 COORDINATE HIGH Y BYTE KBAADR EQU HIY+2 KB TO ASCII CONVERT TABLE ADDR LINEND EQU KBAADR+2 ENDING X COORD (6X84) LMASK EQU LINEND+2 BLOCK MODE LEFT MASK LOX EQU LMASK+1 COORDINATE LOW X BYTE * /--- BLOCK AIST3 00 000 73/00/00 00.00 LOY EQU LOX+1 COORDINATE LOW Y BYTE MEMREG EQU LOY+1 MODE 2 MEMORY ADDRESS MEMSEL EQU MEMREG+2 CHARACTER MEMORY SELECT ADDR. MMASK EQU MEMSEL+2 BLOCK MODE MIDDLE MASK MODE4CNT EQU MMASK+1 DATA WORD COUNT FOR BLOCK MODE MREG EQU MODE4CNT+1 ERROR PROTOCOL REGISTER NBYTES EQU MREG+1 GET3 ROUTINE BYTE COUNT NCHARS EQU NBYTES+1 CHARACTER CONVERSION COUNT NDATAB EQU NCHARS+1 DATA WORD COUNT FOR MODE 2 NREG EQU NDATAB+1 ERROR PROTOCOL REGISTER PAGEND EQU NREG+1 ENDING Y COORD (512-14X34) PRINTERR EQU PAGEND+2 PRINT ERROR FLAG * 00=NO ERROR, 01=ERROR RMASK EQU PRINTERR+1 BLOCK MODE RIGHT MASK SCOPYFLG EQU RMASK+1 SCREEN COPY ACTIVE FLAG * 00=OFF, 01=ON SIZE EQU SCOPYFLG+1 CHARACTER SIZE STATLINE EQU SIZE+2 STATUS LINE ACTIVE FLAG * 00=NOT ACTIVE, 01=ACTIVE TSTAT EQU STATLINE+1 GRAPH MODE TERMINAL STATUS WD TXBUSY EQU TSTAT+1 TRANSMIT BUSY FLAG * 00=NOT BUSY, 01=BUSY USERFLG EQU TXBUSY+1 USER PROGRAM RUNNING FLAG * 00=NO, 01=YES VDMA1 EQU USERFLG+1 DMAA-200H FOR VERTICAL CHARS VDMA2 EQU VDMA1+2 DMAA-400H FOR VERTICAL CHARS VECFLG EQU VDMA2+2 VECTOR PARAMETER FLAG WEFLAG EQU VECFLG+1 CURSOR WRITE/ERASE FLAG * 00=WRITE, 20H=ERASE WIDTH EQU WEFLAG+1 CHARACTER MATRIX WIDTH (DOTS) WSEGLEN EQU WIDTH+2 WRITE SEGMENT LENGTH XCOMMSW EQU WSEGLEN+1 OLD VALUE OF COMM SWITCHES XDELTA EQU XCOMMSW+1 X COORDINATE DELTA XREG EQU XDELTA+2 CURRENT 9 BIT X COORDINATE YDELTA EQU XREG+2 Y COORDINATE DELTA YREG EQU YDELTA+2 CURRENT 9 BIT Y COORDINATE * THE FOLLOWING VARIABLES ARE USED BY THE STATUS LINE * AND MUST BE IN THE ORDER SHOWN. STATUS EQU YREG+2 LOC.RMT EQU STATUS LOCAL/REMOTE FLAG * 00=ON LINE, 01=LOCAL ASCSPEED EQU STATUS+1 ASCII BAUD RATE SELECTED * 00=75, 01=150, 02=300, * 03=600, 04=1200, 05=2400, * 06=1200/75, 07=EXT CLK G.TTYFLG EQU STATUS+2 TTY CAPS LOCK FLAG * 00=CAPS, 01=ALL PARITY EQU STATUS+3 PARITY MODE FLAG * 00=EVEN, 01=ODD, 02=NONE DUPLEXFG EQU STATUS+4 FULL/HALF DUPLEX FLAG * 00=HALF, 01=FULL SCALEFG EQU STATUS+5 SCALE FLAG * 00=SCALE, 01=UNSCALE TGMODE EQU STATUS+6 TIMESHARE/GRAPHICS MODE FLAG * 00=TIMESHARE, 01=GRAPHICS * /--- BLOCK AIST3 00 000 73/00/00 00.00 CPRINTFG EQU STATUS+7 COMM LINE PRINT FLAG * 00=NO PRINT, 01=PRINT **************************************** * USER BUFFER * **************************************** USBUF EQU STATUS+8 (19 BYTES) * USBUF DIFFERENCE COUNT * USBUF+1 INPUT INDEX * USBUF+2 OUTPUT INDEX * USBUF+3 BUFFER STORE AREA (16 BYTES) **************************************** * RECEIVE BUFFER * **************************************** RXBUF EQU USBUF+19 (259 BYTES) * RXBUF DIFFERENCE COUNT * RXBUF+1 INPUT INDEX * RXBUF+2 OUTPUT INDEX * RXBUF+3 BUFFER STORE AREA (256 BYTES) **************************************** * TRANSMIT BUFFER * **************************************** TXBUF EQU RXBUF+259 (11 BYTES) * TXBUF DIFFERENCE COUNT * TXBUF+1 INPUT INDEX * TXBUF+2 OUTPUT INDEX * TXBUF+3 BUFFER STORE AREA (8 BYTES) **************************************** * DATA STORE FOR PROCESSING * **************************************** DWORD EQU TXBUF+11 (5 BYTES) **************************************** * EXTERNAL DEVICE DATA STORE * **************************************** EXTD EQU DWORD+5 (2 BYTES) **************************************** * ASCII COMM PORT CONTROL PACKAGE * **************************************** ASCPKG EQU EXTD+2 (8 BYTES) **************************************** * SCRATCH AREA * **************************************** SAVE1 EQU ASCPKG+8 (2 BYTES) SAVE2 EQU SAVE1+2 (12 BYTES) SAVE8 EQU SAVE2+12 (2 BYTES) SAVE0F EQU SAVE8+2 (16 BYTES) SAVE1F EQU SAVE0F+16 (16 BYTES) SAVE2F EQU SAVE1F+16 (16 BYTES) SAVE3F EQU SAVE2F+16 (16 BYTES) SAVE4F EQU SAVE3F+16 (16 BYTES) SAVE5F EQU SAVE4F+16 (16 BYTES) **************************************** * TEMP SAVE FOR CURSOR DATA * **************************************** CURDATA EQU SAVE5F+16 (10 BYTES) EJECT PRINTER VARIABLES AND BUFFERS. **************************************** * PRINTER VARIABLES AND BUFFERS * **************************************** BUFFER EQU CURDATA+10 ENQ CODE PLUS 6 SPACES BUF1 EQU BUFFER+7 PRINT DATA BUFFER (86 BYTES) * /--- BLOCK AIST3 00 000 73/00/00 00.00 S.MEM EQU BUF1 SCREEN SAVE AREA (128 BYTES) BUF2 EQU BUF1+86 * KEEPER EQU BUF1+128 COUNTER FOR SCREEN COPY ROWCOUNT EQU KEEPER+1 ROW COUNTER FOR SCREEN COPY ROW EQU ROWCOUNT+2 ROW FWA FOR SCREEN COPY PAUSE EQU ROW+2 POSITIVE=SLOW PRINT. TURNOFF EQU PAUSE+1 NON ZERO FLAGS COPY TURNED OFF SAVESTK EQU TURNOFF+1 SAVED ENTRY STACK POINTER. SLCNTR EQU SAVESTK+2 SOLENOID DUTY CYCLE COUNTERS * (24 BYTES FOR 12 COUNTERS) **************************************** * PROCESSOR STACK * **************************************** * 64 BYTES RESERVED FOR STACK ZSTACK EQU SLCNTR+24+64 ENDVAR2 EQU ZSTACK END OF SECOND VARIABLE AREA ENDRES EQU 3800H FIRST ADDRESS AVAILABLE BEYOND * THE END OF THE RESIDENT. END $EOF