plato.source:plaopl:aist3
Table of Contents
AIST3
Table Of Contents
Source Code
- AIST3.txt
- 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 <END OF RESIDENT
- EX DE,HL ADDRESS BACK TO HL
- BIT 7,H
- RET Z EXIT IF OK (<8000H)
- EX DE,HL ADDRESS BACK TO DE
- CHKRG0 EQU * ADDRESS IS <END OF RESIDENT
- LD HL,-BEGVAR1 OR >7FFFH
- ADD HL,DE
- JR NC,CHKRG1 JUMP IF <BEGVAR1 (ERROR)
- LD HL,-ENDVAR1
- ADD HL,DE
- EX DE,HL ADDRESS BACK TO HL
- RET NC EXIT IF <ENDVAR1 (OK)
- CHKRG1 EQU * OUT OF BOUNDS
- POP HL
- RET
- EJECT SSF AND EXT
- * * * * * * * * * * * * * * * * * * * * *
- *
- * SELECT SPECIAL FUNCTION
- *
- * THIS COMMAND IS USED TO COMMUNICATE WITH VARIOUS DEVI
- * CONNECTED TO THE EXTERNAL CHANNELS, AND SET THE TERMI
- * INTERNAL INTERRUPT MASK.
- *
- * * * * * * * * * * * * * * * * * * * * *
- SPACE 1
- *
- * ON-LINE ENTRY POINT
- *
- SSF EQU *
- CALL GET3 GET NEXT 3 BYTES
- RES 7,H CLEAR UPPER BIT
- *
- * USER ENTRY POINT
- *
- SSF0 EQU *
- LD A,H
- RRCA
- RRCA
- AND 1FH MASK DEVICE ADDRESS BITS
- JR NZ,SSF1 NOT SLIDE PROJECTOR
- *
- * OUTPUT TO SLIDE PROJECTOR
- *
- LD C,20H LOAD SLIDE PROJECTOR ADDRESS
- OUT (C),L OUTPUT LOWER EIGHT BITS
- LD A,03
- AND H MASK UPPER TWO BITS
- OUT (C),A OUTPUT UPPER TWO BITS
- RET
- *
- SSF1 EQU *
- * /--- BLOCK AIST3 00 000 73/00/00 00.00
- CP 01 TEST FOR INTERRUPT MASK
- JR NZ,SSF2 NOT INTERRUPT MASK
- LD A,L LOAD MASK
- JP ENAB AND SET INTERRUPT NASK
- *
- SSF2 EQU *
- BIT 1,H TEST FOR INPUT OR OUTPUT
- JR NZ,SSF3 GO TO INPUT IF NOT ZERO
- *
- * OUTPUT TO EXTERNAL DEVICE
- *
- LD (EXT.OUT),A STORE DEVICE ADDRESS
- LD C,A
- BIT 0,H TEST FOR DATA IN LOWER BITS
- RET NZ EXIT IF NONE
- *
- LD E,L
- LD HL,EXTD LOAD DATA STORE ADDRESS
- LD (HL),E AND STORE DATA BYTE
- CP 03 TEST FOR SERIAL/PARALLEL
- RET Z CANNOT OUTPUT TO SER CTRL PORT
- JP C,SCOUT JUMP IF SER DATA PORT
- SET 5,C SET EXTERNAL CHANNEL BIT
- OUTI OUTPUT DATA FROM MEMORY
- RET
- *
- *
- * INPUT FROM EXTERNAL DEVICE
- *
- SSF3 EQU *
- LD (EXT.IN),A STORE DEVICE ADDRESS
- LD C,A
- BIT 0,H TEST FOR DATA IN LOWER BITS
- RET NZ EXIT IF NONE
- AND 1CH TEST FOR SERIAL OR PARALLEL
- JR NZ,SSF4 JUMP IF PARALLEL CHANNEL
- * SERIAL CHANNEL INPUT
- SET 4,C SELECT SERIAL CHANNEL
- BIT 0,C
- JR Z,SSF4A JUMP IF DATA INPUT
- LD L,00H STATUS INPUT....
- LD A,11H RESET EXTERNAL STATUS
- OUT (C),A
- IN A,(C) GET STATUS REG 1(ERROR STATUS)
- AND 70H
- JR Z,SSF3A
- SET 4,L SET RECEIVE DATA ERROR STATUS
- LD A,30H RESET ERROR LATCHES
- OUT (C),A
- SSF3A EQU *
- IN A,(C) GET STATUS REG 0
- AND 0ADH CLEAR UNUSED BITS
- OR L INSERT RECEIVE ERROR STATUS
- LD L,A
- IN A,(COMMSW) GET DSR STATUS
- BIT 7,A
- JR Z,SSF4B
- SET 1,L SET DSR STATUS
- JR SSF4B
- * PARALLEL CHANNEL INPUT
- SSF4 EQU *
- SET 5,C SELECT PARALLEL CHANNEL
- SSF4A EQU *
- IN L,(C) INPUT FROM DEVICE
- SSF4B EQU *
- LD H,82H LOAD OP CODE AND CATAGORY
- LD A,(M.KSW) LOAD USER/PLATO FLAG
- PUSH HL
- CP 02 FOR M.KSW=0 OR M.KSW=1
- CALL C,R.XMIT STORE FOR TRANSMIT TO PLATO
- * /--- BLOCK AIST3 00 000 73/00/00 00.00
- POP HL FOR M.KSW=2 OR M.KSW=3
- * RETURN DATA IN L TO USER
- RET
- EJECT EXT
- * * * * * * * * * * * * * * * * * * * * *
- *
- * OUTPUT DATA TO EXTERNAL DEVICE
- *
- * THIS COMMAND TRANSFERS TWO BYTES OF DATA TO THE DEVIC
- * CONNECTED TO THE EXTERNAL CHANNEL, AND ADDRESSED BY T
- * LAST SSF COMMAND RECEIVED BY THE TERMINAL.
- *
- * * * * * * * * * * * * * * * * * * * * *
- SPACE 1
- *
- * ON-LINE ENTRY POINT
- *
- EXT EQU *
- CALL GET3 GET NEXT 3 BYTES
- EX DE,HL SAVE DATA IN TEMP AREA
- LD HL,EXTD+1
- LD (HL),E
- DEC HL
- LD (HL),D HL NOW POINTS TO TEMP AREA
- LD DE,02 LOAD DATA BYTE COUNT
- *
- * USER ENTRY POINT
- * ON ENTRY, HL=FWA AND DE=LENGTH IN BYTES
- EXTX EQU *
- LD A,(EXT.OUT) LOAD EXTERNAL DEVICE ADDRESS
- LD C,A
- AND 1CH TEST FOR SERIAL OR PARALLEL
- JR NZ,EXT3 JUMP IF PARALLEL CHANNEL
- *
- * SERIAL CHANNEL OUTPUT
- *
- BIT 0,C
- JR Z,EXT2 JUMP IF DATA OUTPUT
- SET 4,C SELECT SERIAL CHANNEL
- SRL D CONTROL OUTPUT
- RR E DIVIDE BYTE COUNT BY 2
- EXT0 EQU *
- LD A,(HL) CHECK WHICH SIO REGISTER IS
- AND 07H BEING WRITTEN INTO
- DEC A
- JR NZ,EXT0A
- INC HL REG 1 (CANNOT WRITE TO REG 1)
- INC HL
- JR EXT1
- EXT0A EQU *
- DEC A
- JR NZ,EXT0B
- INC HL REG 2 SETS CLOCK RATE
- LD B,(HL) GET RATE INFORMATION
- RES 0,B INSERT LONG LINE/RS232 BIT
- LD A,(RUNINFO) FROM RUNINFO
- AND 01H
- OR B
- OUT (SERRATE),A
- INC HL
- JR EXT1
- EXT0B EQU *
- OUTI OTHER REGISTERS ARE WRITTEN
- OUTI INTO IN BYTE PAIRS
- EXT1 EQU *
- DEC DE
- LD A,E
- OR D
- JR NZ,EXT0 LOOP UNTIL OUTPUT IS DONE
- RET
- EXT2 EQU *
- CALL SCOUT DATA OUTPUT
- DEC DE
- LD A,E
- OR D
- JR NZ,EXT2
- RET
- * /--- BLOCK AIST3 00 000 73/00/00 00.00
- * OUTPUT DATA FROM (HL) TO SERIAL I/O ADDRESS (C).
- * OUTPUT IS ABORTED IF CHARACTER REQUEST TIMEOUT OCCURS.
- SCOUT EQU *
- SET 4,C SELECT SERIAL CHANNEL
- LD A,(M.CLOCK) INITIALIZE TIMER
- ADD A,8
- LD B,A
- SCOUT1 EQU *
- IN A,(SERSTAT) CHECK SERIAL CHANNEL STATUS
- BIT 2,A
- JR NZ,SCOUT2 JUMP IF CHAR REQUEST
- LD A,(M.CLOCK)
- CP B
- JR NZ,SCOUT1 LOOP IF NO TIMEOUT
- RET ABORT OUTPUT
- SCOUT2 EQU *
- OUTI OUTPUT DATA
- RET
- *
- * PARALLEL CHANNELS
- *
- EXT3 EQU *
- SET 5,C ADD EXT CHANNEL BIT
- *
- EXT4 EQU *
- OUTI OUTPUT DATA FROM MEMORY
- *
- DEC DE DECREMENT BYTE COUNT
- LD A,D
- OR E TEST FOR LAST BYTE
- JR NZ,EXT4 OUT PUT NEXT BYTE
- RET
- SPACE 4
- *
- * COLOR COMMAND
- *
- COLOR EQU *
- LD HL,NBYTES
- INC (HL)
- LD A,02
- CP (HL)
- RET NZ
- XOR A
- LD (CMODE),A
- RET
- EJECT MODE 0, POINT PLOT
- * * * * * * * * * * * * * * * * * * * * *
- *
- * POINT PLOT MODE
- *
- * EACH MODE 0 DATA WORD SPECIFIES THE COORDINATES ON TH
- * DISPAY TO BE WRITTEN OR ERASED. BIT 2 OF THE LAST LDM
- * COMMAND RECEIVED WILL DETERMINE WRITE OR ERASE.
- *
- * MODE 0 DATA WORD
- * BITS 1-9 Y COORDINATE
- * BITS 10-18 X COORDINATE
- *
- * * * * * * * * * * * * * * * * * * * * *
- SPACE 1
- SPACE 1
- APOINT EQU *
- CALL GETXY GET COORDINATES
- *
- * WRITE/ERASE SINGLE DOT
- *
- * USER ENTRY POINT
- SPACE 1
- POINT EQU *
- PUSH DE SAVE Y COORDINATE
- CALL R.OUTX LOAD X COORDINATE
- POP HL RETREIVE Y COORDINATE
- CALL R.OUTY LOAD Y COORDINATE
- SPACE 1
- * USER ENTRY POINT
- SPACE 1
- WE EQU *
- CALL MASKS GENERATE WRITE/ERASE MASKS
- *
- EX DE,HL
- LD HL,(DMAA) LOAD DMA ADDRESS
- LD A,(M.MODE) LOAD WRITE/ERASE FLAG
- BIT 0,A TEST FOR WRITE OR ERASE
- JR Z,MODE01 GO TO ERASE
- *
- * /--- BLOCK AIST3 00 000 73/00/00 00.00
- LD A,E LOAD WRITE MASK
- OR (HL) INCLUDE POINT IN DMA DATA
- LD (HL),A AND STORE IN DMA
- RET
- *
- MODE01 EQU *
- LD A,D LOAD ERASE MASK
- AND (HL) ERASE POINT
- LD (HL),A STORE RESULT IN DMA
- RET
- EJECT MODE 1, VECTOR GENERATOR
- * * * * * * * * * * * * * * * * * * * * *
- *
- * VECTOR MODE
- *
- * EACH DATA WORD RECEIVED SPECIFIES THE END COORDINATES
- * THE LINE TO BE DRAWN. THIS LINE IS DRWWN BETWEEN THE
- * CURRENT COORDINATES AND THE END COORDINATES SPECIFIED
- * THE MODE 1 DATA WORD. THE END COORDINATES IS ALSO THE
- * OF THE NEXT LINE TO BE DRAWN.
- *
- * MODE 1 DATA WORD
- * BITS 1-9 Y COORDINATE
- * BITS 10-18 X COORDINATE
- * * * * * * * * * * * * * * * * * * * * *
- SPACE 1
- GRAPH EQU *
- CALL GETXY GET COORDINATES
- LD A,(DARK)
- AND A IF DARK VECTOR,
- JR Z,ALINE BASE POSITION
- PUSH DE SAVE Y COORD
- CALL R.OUTX OUTPUT X
- POP HL
- CALL R.OUTY OUTPUT Y
- XOR A TURN OFF DARK VECTOR
- LD (DARK),A
- RET
- *
- ALINE EQU *
- LD A,(DASH) LOAD FLAG FOR DASHED/SOLID
- RRA
- JP C,G.LINE1 IF SET, USE DASHED VECTOR
- * OTHERWISE R.LINE
- *
- LINE EQU *
- *
- LD (XEND),HL STORE X END COORDINATE
- EX DE,HL
- LD (YEND),HL STORE Y END COORDINATE
- *
- LD C,00 CLEAR C FOR VECTOR FLAG
- LD HL,(XREG) LOAD CURRENT X COORDINATE
- CALL CALDELX CALCULATE DELTA X
- LD HL,(YREG) LOAD CURRENT Y COORDINATE
- CALL CALDELY CALCULATE DELTA Y
- *
- LD A,08H TEST FOR NEGATIVE X
- AND C
- LD A,C
- LD (VECFLG),A STORE VECTOR FLAG
- JR Z,MODE11 JUMP IF Y POSITIVE
- XOR 10H TOGGLE Y DIRECTION
- LD (VECFLG),A AND STORE
- LD HL,(YEND) RESET VECTOR
- CALL R.OUTY LOAD COORDINATE.
- LD HL,(XEND)
- CALL R.OUTX LOAD COORDINATE.
- *
- MODE11 EQU *
- LD HL,(YDELTA)
- EX DE,HL
- LD HL,(XDELTA) LOAD DELTA X
- SBC HL,DE
- * /--- BLOCK AIST3 00 000 73/00/00 00.00
- JR NC,MODE12 JUMP IF X GREATER
- *
- * DELTA Y GREATER
- *
- LD HL,(XDELTA) LOAD DELTA X
- CALL DIVIDE CALCULATE SLOPE
- LD BC,(YDELTA) LOAD DELTA FOR LOOP COUNT
- CALL VECINIT INIT REGS FOR VECTOR ROUTINE
- JR YVEC
- *
- * DELTA Y IS EQUAL TO OR LESS THAN DELTA X
- *
- MODE12 EQU *
- LD HL,(XDELTA) LOAD DELTA X
- EX DE,HL
- CALL DIVIDE CALCULATE SLOPE
- LD BC,(XDELTA) LOAD DELTA FOR LOOP COUNT
- CALL VECINIT INIT REGS FOR VECTOR ROUTINE
- JR XVEC
- *
- * INITIALIZATION ROUTINE FOR VECTOR GENERATORS.
- *
- VECINIT EQU *
- LD A,C TOGGLE BIT 7 OF C FOR
- XOR 80H USE BY VECTOR GENERATOR
- LD C,A JP,PE INSTRUCTION
- EXX
- CALL MASKS GENERATE MASKS
- LD C,L
- LD B,00 SET WRITE MASK
- LD DE,0FFFFH LOAD FOR POSITIVE 'Y
- LD HL,(DMAA) LOAD STARTING ADDRESS
- LD A,(VECFLG) LOAD VECTOR PARAMETERS
- BIT 4,A TEST FOR POS 'Y DELTA
- JR Z,VECINIT1 JUMP IF X POSITIVE
- *
- INC DE SET DE FOR
- INC DE NEGATIVE 'Y
- *
- VECINIT1 EQU *
- LD A,(M.MODE) TEST MODE BITS
- RRA FOR WRITE OR ERASE
- RET C GO TO WRITE VECTOR
- DEC B SET ERASE MASK
- RET GO TO ERASE VECTOR
- EJECT
- * VECTOR GENERATOR. Y IS LONG AXIS, X 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 Y (BIT 7 OF C IS TOGGLED FOR USE WITH JP,PE)
- * DE*=SLOPE
- * HL*=ACCUMULATOR (INITIALLY 8000H)
- *
- * ENTRY POINT IS YVEC.
- *
- * THIS CODE IS TIME OPTIMIZED. DO NOT CHANGE WITHOUT
- * CAREFUL THOUGHT.
- *
- * TIMING FOR THIS ROUTINE.
- *
- * T STATES = 110*DELTA Y + 13*DELTA X
- * + 26*NO. OF HORIZONTAL BYTE BOUNDARIES CROSSED
- * + 16 (IF DELTA Y >=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