plato:source:plaopl:asc1ram
Table of Contents
ASC1RAM
Table Of Contents
- [00005] INTERACTIVE GRAPHICS
Source Code
- ASC1RAM.txt
- ASC1RAM
- IDENT IGT,#4000
- CHIP
- TITLE INTERACTIVE GRAPHICS
- ORG #4000
- ********************
- *
- * EQUATE STATEMENTS
- *
- **************************************
- * PANEL SWITCHES
- RSF.PANL EQU #00
- PANLSWCH EQU #11 FOR BREADBOARD AND IST
- * INTERRUPT CONTROL
- COMCHAN EQU 1 CLA CHANNEL NUMBER
- COMCON EQU 2 CLA CONTROL FUNCTION
- COMSTA EQU 3 CLA STATUS FUNCTION
- * ASCII COMMUNICATIONS
- COMDATA EQU #E2 SERIAL CHANNEL DATA
- COMSTAT EQU #E3 SERIAL CHANNEL STATUS
- * TOUCH PANEL
- * KEYBOARD
- KEYCHAN EQU 2 KEYBOARD CHANNEL NUMBER
- KEYDAT EQU 2 KEYBOARD DATA
- KYBDCON EQU 0 KEYBOARD CONTROL FUNCTION
- * TOUCH PANEL
- TPCHAN EQU 3 TOUCH PANEL CHANNEL NUMBER
- TOUCHD EQU 0 TOUCH PANEL DATA
- TPCONT EQU 0 TOUCH PANEL CONTROL
- TOUCHS EQU 1 TOUCH PANEL STATUS
- TPDIS EQU 0 DISABLE TOUCH PANEL INTERRUPT
- TPEN EQU 1 ENABLE TOUCH PANEL INTERRUPT
- * VIDEO DISPLAY
- * VIDEO DISPLAY
- DISCHAN EQU 4 DISPLAY CHANNEL NUMBER
- DISDATA EQU 3 DISPLAY DATA
- DISCON1 EQU 6 DISPLAY CONTROL 1 FUNCTION
- DISCON2 EQU 7 DISPLAY CONTROL 2 FUNCTION
- YCOORD EQU 5 DISPLAY Y COORDINATE DATA
- XCOORD EQU 4 DISPLAY X COORDINATE DATA
- XYREAD EQU 2 DISPLAY READ XY BIT 9 FUNCTION
- YREAD EQU 1 DISPLAY READ Y REGISTER FUNCTION
- XREAD EQU 0 DISPLAY X REGISTER FUNCTION
- * EXTERNAL DEVICES
- IDCHAN EQU 5 ID CODE CHANNEL
- EXTCH5 EQU 5 EXTERNAL CHANNEL 5
- EXTCH6 EQU 6 EXTERNAL CHANNEL 6
- EXTCH7 EQU 7 EXTERNAL CHANNEL 7
- EXTDATA EQU 0 INPUT/OUTPUT DATA FUNCTION
- EXTCNTL EQU 1 EXTERNAL CONTROL OUTPUT FUNCTION
- EXTSTAT EQU 3 EXTERNAL IN STATUS
- IDLSBS EQU 0 INPUT LOWER BITS OF ID CODE.
- IDMSBS EQU 1 INPUT UPPER BITS OF ID CODE.
- SLDATA0 EQU 0 OUTPUT LOWER BITS OF SLIDE DATA.
- SLDATA1 EQU 1 OUTPUT UPPER BITS OF SLIDE DATA.
- OPCHAN EQU 0 OPERATORS PANEL CHANNEL NUMBER
- OPDATA EQU 0 OPERATORS PANEL OUTPUT DATA
- ***********************
- M.SBTYPE EQU #22E6
- M.CONFIG EQU #22E7
- M.M0 EQU #22E8
- M.VERS EQU #22EA
- M.TYPE EQU #22EB
- M.CLOCK EQU #22EC
- M.EXTPA EQU #22EE
- M.MARGIN EQU #22F0
- M.JOBS EQU #22F2
- M.CCR EQU #22F4
- M.MODE EQU #22F6
- M.DIR EQU #22F8
- M.KSW EQU #22FA
- M.ENAB EQU #22FC
- M.SELECT EQU #22FE
- *
- M0ADR EQU #0096 LOCATION OF M0 CHAR. SET ADR.
- M1ADR EQU #0098 LOCATION OF M1 CHAR. SET ADR.
- MODE5A EQU #2300
- MODE6A EQU #2302
- MODE7A EQU #2304
- *
- MEM2 EQU #2306
- MEM3 EQU #2308
- MEM4 EQU #230A
- MEM5 EQU #230C
- MEM6 EQU #230E
- MEM7 EQU #2310
- *
- SUPER EQU #009A
- SUB EQU #009D
- SELECTM0 EQU #00A0
- SELECTM1 EQU #00A3
- SELECTMM EQU #00A6
- HORZ EQU #00A9
- VERTICAL EQU #00AC
- FORWARD EQU #00AF
- REVERSE EQU #00B2
- SIZE.1 EQU #00B5
- SIZE.2 EQU #00B8
- BKSPACE EQU #00BB
- RETURN EQU #00BE
- TAB EQU #00C1
- LINEFEED EQU #00C4
- VERTAB EQU #00C7
- FORMFEED EQU #00CA
- *
- D.CNTL2 EQU #2050
- SIZE EQU #2051
- FWD.REV EQU #2052
- HOR EQU #2053
- VER EQU #2054
- X.PLOT EQU #2055
- Y.PLOT EQU #2057
- CHAR.GEN EQU #2059
- XREG EQU #205B
- YREG EQU #205D
- XSAVE EQU #205F
- YSAVE EQU #2061
- MEMSEL EQU #2063
- M.ORG EQU #2065
- *
- *
- M.HALT EQU #2314
- M.STATUS EQU #2316
- MODE EQU #2318
- SC.OC EQU #2319
- *
- A.INIT JMP ASTART
- R.DOT JMP POINT2 PLOT POINT
- R.LINE JMP LINE1 DRAW LINE
- R.CHARS JMP #0049
- R.BLOCK JMP BLOCK BLOCK WRITE/ERASE
- R.INPX JMP INPX READ DISPLAY X COORD
- R.INPY JMP INPY READ DISPLAY Y COORD
- R.OUTX JMP #0055
- R.OUTY JMP #0058
- R.XMIT JMP XMIT TRANSMIT DATA TO HLP
- R.MODE JMP #005E
- R.STEPX JMP STEPX STEPS X AXIS COORD
- R.STEPY JMP STEPY STEPS Y AXIS COORD
- R.WE JMP POINT3 W/E CURRENT POSITION
- R.DIR JMP DIR SET DIRECTION OF XY STEP
- R.INPUT JMP INPUT DIRECTS DEVICE INPUT
- R.SSF JMP SSF.X SELECT SPECIAL FUNCTION
- R.CCR JMP #0073
- R.EXTOUT JMP RESTORE
- R.EXEC JMP EXEC
- R.GJOB JMP GJOB
- R.XJOB JMP PPROC
- R.RETURN JMP RESTORE RESTORE, ENABLE, RETURN
- JMP RESTORE EXPANSION
- SERINP JMP SERCHN
- KBINP JMP KEYINP
- TPIN JMP TOUCHINP
- R.INIT JMP PSTART PLATO INITIALIZE
- *
- *
- *
- *STRAP DB #E8 NO ECHO, 'FRYE/'PEDERSON
- STRAP DB #22 #22 300 BAUD;#62 1200 BAUD
- DB #38
- * * * * * * *@* * * * * *
- * SERIAL CHANNEL INTERRUPT PROCESSOR
- *
- SERCHN EQU $
- IN COMSTAT INPUT SERIAL CHAN. STATUS
- RAL AND TEST, IS CHAN. READY
- JC EXT.PR
- *
- RAR TEST FOR
- RAR INTERRUPT PENDING
- JNC EXT.PR
- *
- RAR
- RAR TEST FOR CHAR. RDY
- JNC SERCHN1 NOT CHARACTER READY
- * 'CHARACTER 'READY
- IN COMDATA INPUT SERIAL DATA
- MOV C,A
- LDA MODE
- ANI #80
- MVI A,#7F
- JNZ SERCHN0
- ANA C ASCII, MASK FOR 7 BITS
- MOV C,A
- SERCHN0 EQU $
- LXI H,RXBUF LOAD RECEIVE BUFFER ADDR.
- MVI A,#FF LOAD MASK FOR INDEX
- CMP M TEST FOR FULL STACK
- JZ R.RETURN BUFFER FULL
- INR M INCREMENT DIFFERENCE COUNT
- INX H STEP TO INPUT INDEX
- ANA M MASK FOR LOWER SIX BITS.
- INR M INCREMENT INDEX.
- INX H STEP TO START
- INX H OF STACK STORE AREA.
- MOV E,A ADD INDEX
- MVI D,00 TO START
- DAD D OF STORE AREA.
- MOV M,C STORE SERIAL CHANNEL DATA.
- LDA M.JOBS
- INR A
- STA M.JOBS
- JMP R.RETURN
- *
- *
- SERCHN1 EQU $
- RAL TEST FOR CHAR. REQ.
- JNC R.RETURN NO CHARACTER REQ.
- * 'CHARACTER 'REQUEST
- LXI H,TXBUF LOAD ADDR. OF XMIT BUFFER
- XRA A TEST FOR EMPTY
- ORA M BUFFER.
- JZ SERCHN2 NO DATA
- DCR M DECREMENT DIFF. COUNT
- INX H STEP TO
- INX H OUT INDEX
- MVI A,7 LOAD MASK FOR INDEX
- ANA M MASK FOR INDEX BITS
- INR M INCREMENT INDEX
- INX H STEP TO STORE AREA.
- MOV E,A ADD INDEX TO
- MVI D,00 START OF
- DAD D STORE AREA.
- MOV A,M LOAD DATA TO TRANSMIT
- OUT COMDATA OUTPUT DATA
- SERCHN2 EQU $
- LDA SC.OC TURN OFF CHAR.REQ.INT.
- OUT COMSTAT
- JMP R.RETURN RETURN TO PROCESSING
- *
- * LOAD ALL REGISTERS FROM STACK TO RESTORE
- *
- RESTORE EQU $
- POP H RESTORE REGISTERS
- POP D
- POP B
- POP PSW
- EI ENABLE SYSTEM INTERRUPT
- RET
- *
- * KEYBOARD INTERRUPT
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- KEYINP IN KEYCHAN*32+KEYDAT
- CMA INPUT CHARACTER FROM KEY BOARD
- ANI #7F
- MVI H,#40 LOAD OP CODE AND CATAGORY BITS
- MOV L,A B05,LOAD DATA
- CALL FIFO.ST B05,STORE FOR USER/PLATO
- MVI A,#01 B05
- OUT KEYCHAN*32+KYBDCON B05,ENABLE KYBD INT.
- JMP RESTORE
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * TOUCH PANEL INTERRUPT
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- TOUCHINP IN TPCHAN*32+TOUCHD
- MVI H,#41 LOAD OP CODE AND CATAGORY BITS
- MOV L,A LOAD DATA
- CALL FIFO.ST STORE FOR USER/PLATO.
- JMP RESTORE
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * EXTERNAL INTERRUPT PROCESSOR.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- EXT.PR EQU $
- *
- LHLD M.EXTPA
- MOV A,L
- ORA H
- JNZ EXT.PR2 JUMP TO USER IF ZERO
- *
- CALL EXT.IN INPUT DEVICE DATA
- MOV L,A AND LOAD UP FOR
- MVI H,#82 FIFO INSERT
- CALL FIFO.ST FOR TRANSFER.
- JMP RESTORE RETURN TO PREVIOUS PROCESSING.
- EXT.PR2 EQU $
- PCHL JUMP TO USER IF ZERO
- *
- PSTART EQU $
- MVI A,#0F
- STA PMC.FLG SET PLATO MASTER CLEAR FLAG
- CALL PLATO0 INITIALIZE PLATO
- JMP STRT.3
- *
- * INITIALIZE TERMINAL ROUTINE
- *
- ASTART EQU $
- LXI H,G.BEGIN HL _ BEGIN OF SCRATCH AREA
- LXI D,G.END DE _ END OF SCRATCH AREA
- STRT.1 MVI M,00 CLEAR SCRATCH AREA
- INX H
- MOV A,L
- CMP E
- JC STRT.1
- MOV A,H
- CMP D
- JC STRT.1
- LXI H,#180
- SHLD CLOCK
- CALL ASCII SET UP ASCII OPERATIONS
- LHLD STRAP TEST BIT 1
- MOV A,L
- ANI 01 ON/OVERSTRIKE
- JNZ STRT.2A OFF/NORMAL
- MVI L,07 SET OVERSTRIKE
- JMP STRT.2B
- STRT.2A EQU $
- MVI L,03 SET NORMAL WRITE
- *
- *
- STRT.2B EQU $
- CALL R.MODE VIA R.MODE
- XRA A
- STA M.KSW
- LXI H,#00 POSITION X
- CALL R.OUTX AND Y TO (0,511)
- CALL LF.2 Y=PAGE TOP - HEIGHT
- *
- STRT.3 EQU *
- LXI H,0000
- SHLD M.EXTPA ZERO OUT EXT PROCESSOR
- LXI H,0000
- SHLD EXT.OUT SET UP OUTPUT AND IN ROUTINE
- LXI H,#D300
- SHLD EXT.OUT+2
- LXI H,#C900
- SHLD EXT.OUT+4
- LXI H,#EBDB
- SHLD EXT.IN
- MVI A,#C9
- STA EXT.IN+2
- LDA SC.OC OUTPUT SERIAL CHANNEL
- OUT COMSTAT CONTROL WORD
- IN COMCHAN*32+COMSTA
- XRA A TURN OFF PLATO CHAN.
- OUT COMCHAN*32+COMCON
- INR A AND TURN ON KEYBOARD,SER.CHAN.
- OUT KEYCHAN*32+KYBDCON
- OUT EXTCH5*32+EXTCNTL
- EI ENABLE SYSTEM INTERRUPTS.
- *
- IDLE EQU $
- CALL EXEC
- JMP IDLE
- EXEC EQU *
- LDA MODE
- RLC
- JNC IDLE0
- LDA EREG
- ANI #04
- CNZ TIMOUT
- IDLE0 EQU $
- LXI H,RXBUF LOAD RECEIVE BUFF. ADDR.
- XRA A CLEAR A REGISTER.
- ORA M INCLUSIVE OR A WITH DIFF.
- JZ IDLE2 NO DATA, CONTINUE
- LDA M.JOBS
- DCR A
- STA M.JOBS
- DCR M IS DATA, DEC. DIFF. COUNT
- INX H UNLOAD DATA; STEP TO OUT.
- INX H
- MVI A,#FF MASK OUT INDEX W/ BUFFR.LN
- ANA M
- INR M INCREMENT OUT INDEX.
- INX H BEGIN OF STORE FOR JOBSTK
- MOV E,A PLUS OUTPUT INDEX
- MVI D,00
- DAD D
- MOV C,M UNLOAD DATA INTO C
- LXI H,KBDATA CLEAR KB DATA FLAG
- MVI M,00
- LDA MODE
- ANI #80
- JZ IDLE1
- CALL ERRCHK
- JC EXEC
- MVI A,#7F
- ANA C
- MOV C,A
- CALL PPROC PROCESS PLATO MODE DATA
- JMP EXEC
- IDLE1 EQU $
- CALL TESTMODE PROCESS DATA
- *
- IDLE2 EQU $
- LDA TXBUF
- ORA A TEST XMIT BUFFR. FOR DATA
- JZ IDLE3 NO DATA, CONTINUE
- LXI H,KBDATA CLEAR KB DATA FLAG
- MVI M,00
- IN COMSTAT INPUT STATUS WORD
- RAR
- RAR
- JNC IDLE3 CHAR. REQ. LOW
- LDA SC.OC ENABLE CHAR REQ
- INR A
- OUT COMSTAT
- JMP EXEC
- *
- IDLE3 EQU $
- LXI H,RXBUF LOAD RECEIVE BUFF. ADDR.
- XRA A CLEAR A REGISTER.
- ORA M INCLUSIVE OR A WITH DIFF.
- JNZ EXEC
- CALL INDATA CHECK KB/TP INPUT BUFFER
- MOV E,L BUFFER AND SAVE IN DE
- MOV D,H
- DAD H TEST FOR NO DATA FLAG
- JC IDLE14 NO DATA, CONTINUE
- XCHG NONSHIFTED FOR P.XMIT
- LDA MODE
- ANI #80 IF PLATO OPERATION
- JZ IDLE3.A IDLE3.A, NOT PLATO OP.
- CALL P.XMIT
- RET
- IDLE3.A EQU $
- XCHG SHIFTED FOR ASCII TESTS
- MVI A,07
- ANA H TEST FOR KEY BOARD DATA
- JZ IDLE4 KEYBOARD DATA
- XRA A
- STA KBDATA CLEAR KB DATA FLAG
- MVI A,06 TEST FOR TOUCH PANEL DATA
- ANA H
- CPI 02
- JZ GIN.TP GO HANDLE TOUCH PANEL DATA
- JMP IDLE14 NOT KB DATA, NOT TP DATA
- IDLE4 EQU $
- LXI H,KBDATA SET KB DATA FLAG
- MVI M,01
- CALL KBCON CONVERT KB TO ASCII
- ANA A CLEAR CARRY
- RAL IF UPPER BIT SET,SPEC.CODE
- JNC IDLE8 OTHERWISE,CONT. PROCESSING
- * BC HAS INDEX INTO SPTBL
- MOV C,A
- MOV B,D
- LXI H,SPTBL
- DAD B
- MOV E,M
- INX H
- MOV D,M
- XCHG
- PCHL JUMP TO SPECIAL CODE
- *
- IDLE8 EQU $
- JZ IDLE9
- LDA G.TTYFLG IF TELETYPE FLAG SET
- ORA A CHECK FOR BIT 7 SET.
- JZ IDLE9
- MOV A,C
- ANI #40
- JZ IDLE9
- MOV A,C PUT DATA IN A REG
- ANI #5F TURN OFF BIT 6 OF 8
- MOV C,A
- *
- IDLE9 EQU $
- LDA G.CTLFLG TEST FOR CONTROL
- ORA A KEY AS PREVIOUS KEY
- JZ IDLE12 NO CONTROL KEY
- XRA A CLEAR CONTROL FLAG
- STA G.CTLFLG
- MOV A,C
- CPI #31
- JZ OFFLINE
- CPI #30
- JZ ONLINE
- CPI #3D CHECK FOR EXCEPTIONS TO
- JZ UNSCALE CTL KEY SEQUENCES.
- CPI #39
- JZ SCALE
- CPI #32
- JZ CURSON
- CPI #33
- JNZ IDLE10
- *
- CURSOFF EQU $
- LDA ECURSOR
- MOV B,A
- CALL DISCURS
- STA G.SUPCUR SUPPRESS CURSOR
- JMP EXEC
- *
- CURSON EQU $
- XRA A DO NOT SUPPRESS CURSOR
- STA G.SUPCUR
- JMP EXEC
- *
- OFFLINE EQU $
- LXI H,LOC.RMT SET OFFLINE CONDITION
- MVI M,1
- JMP EXEC
- *
- ONLINE EQU $
- LXI H,LOC.RMT SELECT ONLINE CONDITION
- MVI M,00
- JMP EXEC
- *
- SCALE EQU $
- XRA A CTL 3D
- STA SCALEFG WILL SCALE TO 511 X 511
- LXI H,#0070
- SHLD BIAS BIAS IS 112
- JMP EXEC
- *
- UNSCALE EQU $
- LXI H,SCALEFG CTL 39
- MVI M,01 ACCEPTS COORDS. AS IS
- LXI H,0000
- SHLD BIAS BIAS IS 0
- JMP EXEC
- *
- IDLE10 EQU $
- MVI A,#20 TEST FOR SHIFTED
- ANA C KEY INPUT.
- JNZ IDLE11 NOT SHIFTED
- MVI A,#10 ELSE TOGGLE
- XRA C BIT FOUR OF
- MOV C,A KEY INPUT.
- *
- IDLE11 EQU $
- MVI A,#1F LOAD MASK AND
- ANA C MASK CONTROL CODE
- MOV C,A
- XRA A CLEAR CONTROL FLAG
- STA G.CTLFLG
- *
- IDLE12 EQU $
- LDA MODE
- CPI #08 TEST FOR GIN MODE
- JNZ IDLE12.A
- CALL GIN.A GIN MODE, GIN.A
- JMP IDLE14 SKIP TO IDLE14
- IDLE12.A EQU $
- LDA LOC.RMT LOAD LOCAL/REMOTE FLAG
- ORA A
- CZ XMIT.1 STORE DATA FOR TRANSMIT
- *
- LDA BYPASS LOAD AND TEST FOR BYPASS
- ORA A
- JZ IDLE13 BYPASS NOT ON
- MOV A,C PUT DATA IN C REG.
- CPI #20 IF DATA IS CTL CODE,
- JNC IDLE14 KEY NOT CTL CODE
- *
- IDLE13 EQU $
- LHLD STRAP TEST FOR ECHO OPTION
- MOV A,L
- ANI #80
- JNZ IDLE14 NO ECHO
- CALL TESTMODE PROCESS ASCII OP. DATA
- *
- IDLE14 EQU $
- LXI H,KBDATA CLEAR KB DATA FLAG
- MVI M,00
- LDA MODE IF ALPHA, BLINK CURSOR
- CPI #08
- JZ IDLE15
- CPI #03
- RNZ
- IDLE15 EQU $
- LHLD CLOCK TEST BLINK COUNT
- DCX H
- SHLD CLOCK
- MOV A,L
- ORA H
- JNZ EXEC
- LXI H,#180
- SHLD CLOCK
- LDA WEFLAG CHECK FOR W/E CURSOR
- ORA A
- JZ BLINK
- MVI B,04
- CALL DISCURS ERASE CURSOR
- XRA A CLEAR W/E FLAG_WRITE
- STA WEFLAG
- RET
- GJOB EQU *
- MVI C,0
- LDA EREG
- ANI #04
- CNZ TIMOUT
- LXI H,RXBUF
- XRA A
- ORA M
- RZ RETURN IF NO JOBS RECEIVED
- LDA M.JOBS
- DCR A
- STA M.JOBS
- DCR M
- INX H
- INX H
- MVI A,#FF
- ANA M
- INR M
- INX H
- MOV E,A
- MVI D,00
- DAD D
- MOV C,M
- LXI H,KBDATA
- MVI M,0
- CALL ERRCHK
- RC RETURN IF ERROR
- MVI A,#7F
- ANA C
- MOV C,A
- RET
- *
- BLINK EQU $
- MVI B,6
- CALL DISCURS WRITE CURSOR
- MVI A,1 SET W/E FLAG_WRITE
- STA WEFLAG
- JMP EXEC
- *
- ERRCHK EQU $
- MVI A,#06
- CMP C
- JNZ E001 NOT ACK JUMP
- LDA EREG
- ORI #80
- STA EREG
- STC
- RET
- E001 LDA EREG
- RAR
- JNC E100 NOT STATE 0 JUMP
- MOV A,C
- ORA A
- JPO E006 P ERROR JUMP
- LDA EREG
- RAL
- JNC E006
- E002 EQU $
- MOV A,C
- ANI #7F
- SUI #20
- JM E003
- STA MREG
- STA NREG
- MVI A,#02
- STA EREG
- E003 LDA EREG
- ANI #0F
- STA EREG
- STC
- RET
- E006 LDA EREG
- ANI #0F
- STA EREG
- RET
- E100 EQU *
- RAR
- JNC E200 NOT STATE 1 JUMP
- MOV A,C
- ORA A
- JPE E104 NOT P ERROR JUMP
- XRA A
- ORI #04
- STA EREG
- E101 MVI C,#95 NAK
- E102 CALL XMIT.1
- JC E102
- LDA MREG
- ADI #20
- MOV C,A
- E103 CALL XMIT.1
- JC E103
- XRA A
- STA CLK.1
- STA CLK.2
- STC
- RET
- E104 LDA EREG
- ANI #80
- JZ E105 NO ACK FLAG JUMP
- MOV A,C
- ORA A
- RAL
- RRC
- SUI #20
- STA NREG
- JMP E003
- E105 LDA MREG
- MOV B,A
- LDA NREG
- CMP B
- JNZ E107 N^=M JUMP
- INR A
- MVI B,#60
- CMP B
- JNZ E106
- XRA A
- E106 STA NREG
- STA MREG
- LDA EREG
- ANI #BF
- STA EREG
- JMP E109
- E107 INR A
- MVI C,#60
- CMP C
- JNZ E108
- XRA A
- E108 STA NREG
- LDA EREG
- ORI #40
- STA EREG
- E109 LDA E.CNTR
- DCR A
- JZ E110
- STA E.CNTR
- LDA EREG
- RLC
- RLC
- RET
- E110 MOV B,C
- MVI A,#14
- STA E.CNTR
- MVI C,#06 ACK
- E111 CALL XMIT.1
- JC E111
- LDA MREG
- ADI #20
- MOV C,A
- E113 CALL XMIT.1
- JC E113
- MOV C,B
- LDA EREG
- RLC
- RLC
- RET
- E200 MOV A,C
- ORA A
- JPO E202
- LDA EREG
- RLC
- JC E002
- E201 STC
- RET
- E202 LDA EREG
- ANI #0F
- JMP E201
- *
- P.XMIT EQU $
- MOV E,L SAVE DATA BITS IN E
- MOV D,H SAVE NON-SHIFTED H IN D
- DAD H FOR TEST OF DATA TYPE
- MVI A,#07
- ANA H
- JNZ PX007 NOT KBDATA JP PX007
- CALL KBCON
- MVI A,#17
- CMP C
- JNZ PX002
- MVI A,#01
- STA SH.SUP
- PX001 CALL XMIT.1
- JC PX001
- RET
- PX002 LDA SH.SUP
- ORA A
- JNZ PX004 SH.SUP SET JUMP
- PX003 CALL XMIT.1
- JC PX003
- RET
- PX004 MVI A,#11
- CMP C
- JNZ PX005
- XRA A
- STA SH.SUP
- CALL ASCII
- RET
- PX005 XRA A
- STA SH.SUP
- PX006 CALL XMIT.1
- JC PX006
- RET
- PX007 EQU $
- PUSH D
- MVI C,#1B
- PX008 CALL XMIT.1
- JC PX008
- POP D
- MVI A,#3F
- ANA E
- ADI #40
- MOV C,A
- PUSH D
- PX010 EQU $
- CALL XMIT.1
- JC PX010
- POP D
- MVI A,#C0
- ANA E
- RLC
- RLC
- MOV E,A
- MVI A,#03
- ANA D
- RLC
- RLC
- ORA E
- ADI #40
- MOV C,A
- PX012 CALL XMIT.1
- JC PX012
- RET
- TIMOUT EQU *
- LDA CLK.1
- ADI #01
- STA CLK.1
- RNC
- LDA CLK.2
- INR A
- STA CLK.2
- SUI #20
- RNZ
- XRA A
- STA CLK.1
- STA CLK.2
- MVI C,#95
- TO01 CALL XMIT.1
- JC TO01
- LDA MREG
- ADI #20
- MOV C,A
- TO03 CALL XMIT.1
- JC TO03
- RET
- *
- * TRANSMIT BUFFER STORE
- XMIT EQU $
- CALL P.XMIT
- RET
- *
- XMIT.1 EQU $
- LXI H,TXBUF TEST FOR
- MVI A,07 FULL BUFFER.
- CMP M
- JC XMIT.3 FULL, ENABLE CREQ
- INR M BUFFER NOT FULL,INCR. DIFF
- INX H STEP TO INPUT INDEX
- ANA M PICK UP INPUT INDEX.
- INR M
- INX H STEP TO STORE AREA.
- INX H
- MOV E,A ADD INPUT INDEX.
- MVI D,00
- DAD D
- LDA MODE
- ANI #80
- MOV A,C
- * JZ XMIT.2 IF ASCII OP. SKIP PARITY
- ORA A
- JPE XMIT.2 PLATO SO EVEN PARITY CHK.
- XRI #80
- XMIT.2 EQU $
- MOV M,A STORE DATA IN TXBUF
- XMIT.3 EQU $
- LDA SC.OC SET CREQ ENABE
- INR A
- OUT COMSTAT
- RET
- TESTMODE EQU $
- LDA MODE LOAD MODE.
- ANI #0F MASK OFF MODE BITS
- RLC
- MOV E,A
- MVI D,0
- LHLD SELECT.M LOAD BASE ADDR. JUMP TABLE
- DAD D
- MOV E,M
- INX H
- MOV D,M
- XCHG
- *
- JMPHL EQU $
- PCHL
- *
- SELECT.P EQU $
- DW POINT
- DW GRAPH
- DW MEMORY MODE 2
- DW CHARACT
- DW ABLOCK
- DW MODE5
- DW MODE6
- DW MODE7
- DW TEMP
- *
- SELECT.A EQU $
- DW POINT
- DW GRAPH
- DW TEMP
- DW ALPHMODE
- DW ABLOCK
- DW TEMP
- DW TEMP
- DW TEMP
- DW GIN
- *
- COMMODE EQU $
- LDA CMODE LOAD COMMAND MODE
- ANI #07 MASK OFF UNWANTED BITS
- RLC
- MOV E,A
- MVI D,00
- LXI H,SELECT.C LOAD BASE ADDR. JUMP TABLE
- DAD D
- MOV E,M
- INX H
- MOV D,M
- XCHG
- PCHL
- *
- SELECT.C EQU $
- DW LDC
- DW SSF
- DW ECHO
- DW LDA
- DW EXT
- DW COLOR
- *
- SPTBL EQU $
- DW G.CTL CONTROL
- DW G.RESET RESET
- DW G.TTY
- DW G.BREAK
- DW G.PAGE PAGE
- DW G.ERASE 'B'S WITH ERASE ALWAYS
- DW G.RUBOUT
- *
- *
- * FOLLOWING ARE EXCEPTIONS TO NORMAL ASCII CHAR. SET
- *
- *
- G.CTL EQU $
- MVI A,01 SET CONTROL FLAG
- STA G.CTLFLG
- JMP EXEC
- *
- *
- G.RESET EQU $
- LDA MODE IF IN ALPHA, ERASE CURSOR
- CPI 03
- JNZ G.RES.1
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- G.RES.1 EQU $
- CALL SIZE1
- CALL AFF.1
- JMP EXEC
- *
- G.PAGE EQU $
- CALL AFF SAME AS ESC FF SEQ.
- JMP EXEC
- *
- G.TTY EQU $
- LDA G.TTYFLG
- XRI 01 CHANGE 'C'A'P'S
- STA G.TTYFLG
- JMP EXEC
- *
- G.ERASE EQU $
- CALL BS
- LDA D.CNTL2
- STA D.CNTL2P
- LDA M.MODE
- STA M.MODEP
- MVI L,02
- CALL R.MODE
- MVI C,#00
- CALL CHARGEN
- LDA D.CNTL2P
- STA D.CNTL2
- LDA M.MODEP
- STA M.MODE
- MVI C,#08
- JMP IDLE12
- *
- G.BREAK EQU *
- G.RUBOUT EQU *
- JMP EXEC
- *
- KBCON EQU $
- MVI D,00 DE-KEYBOARD DATA
- LHLD KBAADR HL-KB CONVERSION TABLE
- DAD D BASE ADDR. + KEY CODE
- MOV A,M
- MOV C,A IF VALID, RETURN IN C
- CPI #FF
- RNZ
- POP H OTHERWISE, POP STACK
- JMP EXEC
- *
- ISTASC EQU $
- DB #30,#31,#32,#33
- DB #34,#35,#36,#37
- DB #38,#39,#26,#60
- DB #0A,#5E,#2B,#2D
- DB #13,#04,#07,#08
- DB #7B,#0B,#0D,#1A
- DB #02,#12,#01,#03
- DB #7D,#0C,#FF,#FF
- DB #3C,#3E,#5B,#5D
- DB #24,#25,#5F,#7C
- DB #2A,#28,#40,#27
- DB #1C,#5C,#23,#7E
- DB #17,#05,#14,#19
- DB #7F,#09,#1E,#18
- DB #0E,#1D,#11,#16
- DB #00,#0F,#FF,#FF
- DB #20,#61,#62,#63
- DB #64,#65,#66,#67
- DB #68,#69,#6A,#6B
- DB #6C,#6D,#6E,#6F
- DB #70,#71,#72,#73
- DB #74,#75,#76,#77
- DB #78,#79,#7A,#3D
- DB #3B,#2F,#2E,#2C
- DB #1F,#41,#42,#43
- DB #44,#45,#46,#47
- DB #48,#49,#4A,#4B
- DB #4C,#4D,#4E,#4F
- DB #50,#51,#52,#53
- DB #54,#55,#56,#57
- DB #58,#59,#5A,#29
- DB #3A,#3F,#21,#22
- **********
- * KEYBOARD TO ASCII CONVERSION TABLE
- **********
- IGTASC EQU $
- DB #30,#31,#32,#33
- DB #34,#35,#36,#37
- DB #38,#39,#40,#5C
- DB #09,#5E,#2B,#2D
- DB #7D,#1B,#FF,#85 1X
- DB #82,#FF,#0D,#0A
- DB #08,#86,#83,#80
- DB #84,#FF,#FF,#FF
- DB #3C,#3E,#5B,#5D 2X
- DB #24,#25,#5F,#27
- DB #2A,#28,#60,#7C
- DB #09,#7E,#23,#26
- DB #7B,#1B,#FF,#85 3X
- DB #82,#FF,#0D,#0A
- DB #08,#86,#83,#80
- DB #81,#FF,#FF,#FF
- DB #20,#61,#62,#63
- DB #64,#65,#66,#67
- DB #68,#69,#6A,#6B
- DB #6C,#6D,#6E,#6F
- DB #70,#71,#72,#73
- DB #74,#75,#76,#77
- DB #78,#79,#7A,#3D
- DB #3B,#2F,#2E,#2C
- DB #20,#41,#42,#43
- DB #44,#45,#46,#47
- DB #48,#49,#4A,#4B
- DB #4C,#4D,#4E,#4F
- DB #50,#51,#52,#53
- DB #54,#55,#56,#57
- DB #58,#59,#5A,#29
- DB #3A,#3F,#21,#22
- *
- PPROC EQU $
- MOV A,C
- ANA A
- RZ
- LDA CMODE TEST FOR COMMAND MODES
- ANI #80
- JZ PPROC.1
- CALL COMMODE COMMAND MODE PROCESSOR
- RET
- PPROC.1 EQU $
- LDA MODE
- ANI #40 IF THIS BIT SET,
- JZ PPROC.2 NOT COMMAND OR DATA MODES
- CALL TESTMODE
- RET
- PPROC.2 EQU $
- CALL ESCCTL
- RET
- *
- ESCADR.P EQU $
- DB #03
- DW ASCII
- DB #11
- DW DC1
- DB #12
- DW DC2
- DB #13
- DW DC3
- DB #14
- DW DC4
- DB #1B
- DW ESC
- DB #0C
- DW BULKER
- DB #40
- DW SUPER
- DB #41
- DW SUB
- DB #42
- DW SELECTM0
- DB #43
- DW SELECTM1
- DB #44
- DW SELECTMM
- DB #45
- DW SELECTMM
- DB #46
- DW SELECTMM
- DB #47
- DW SELECTMM
- DB #48
- DW SELECTMM
- DB #49
- DW SELECTMM
- DB #4A
- DW HORZ
- DB #4B
- DW VERTICAL
- DB #4C
- DW FORWARD
- DB #4D
- DW REVERSE
- DB #4E
- DW SIZE.1
- DB #4F
- DW SIZE.2
- DB #32
- DW LCOORD
- DB #51
- DW SSPECF
- DB #52
- DW LEXT
- DB #53
- DW LDM2
- DB #54
- DW MODE567
- DB #55
- DW MODE567
- DB #56
- DW MODE567
- DB #57
- DW LADDR
- DB #59
- DW LECHO
- DB #5A
- DW LMARG
- DB #3D
- DW STCOL
- DB #FF
- *
- CTLADR.P EQU $
- DB #08
- DW BKSPACE
- DB #0D
- DW RETURN
- DB #09
- DW TAB
- DB #0A
- DW LINEFEED
- DB #0B
- DW VERTAB
- DB #0C
- DW FORMFEED
- DB #19
- DW EM.1
- DB #1B
- DW ESC
- DB #1C
- DW FS.1
- DB #1D
- DW GS.1
- DB #1F
- DW US
- DB #FF
- *
- TEMP EQU $
- RET
- *
- ASCII EQU $
- MVI A,#B5 SET INITIAL TERMINAL STAT.
- STA TSTAT
- MVI A,#03 SELECT ASCII MODE 3
- STA MODE
- STA WEFLAG SET W/E FLAG
- LXI H,IGTASC SELECT IGT ASCII KEYBOARD
- SHLD KBAADR
- LXI H,SELECT.A SELECT ASCII MODE TABLE
- SHLD SELECT.M
- LXI H,CTLADR.A SELECT ASCII CTL CODE TBL
- SHLD CTLADR
- LXI H,ESCADR.A SELECT ASCII ESC SEQ TBL
- SHLD ESCADR
- CALL SIZE1
- LXI H,#0070
- SHLD BIAS
- MVI A,4
- STA ECURSOR
- MVI A,6
- STA WCURSOR
- XRA A
- STA SCALEFG
- CALL BULKER ERASE SCREEN
- LXI H,#00 POSITION X TO 00
- CALL R.OUTX
- CALL LF.2 POSITION Y TO 512 - HEIGHT
- RET
- *
- BULKER EQU $
- LDA M.MODE
- RLC
- ORI 01
- MOV L,A
- CALL R.MODE
- RET
- LDM2 EQU $
- MVI A,#C2 SELECT LOAD MEMORY
- STA MODE MODE 2,PLATO OP.
- XRA A CLEAR NUMBER OF INPUTS
- STA NINPUT TO GETXY ROUTINE
- RET
- *
- LCOORD EQU $
- MVI A,#80 SELECT COMMAND LOAD
- STA CMODE COORDINATE
- XRA A
- STA NINPUT
- RET
- *
- LMARG EQU $
- CALL R.INPX
- LDA M.CCR
- ANI 01
- JZ LMARG.1 HORIZONTAL, HL HAS X
- CALL R.INPY
- LMARG.1 EQU $
- SHLD M.MARGIN SET MARGIN
- RET
- *
- SSPECF EQU $
- MVI A,#81
- STA CMODE SPECIAL FUNCTION
- XRA A
- STA NBYTES
- RET
- *
- LECHO EQU $
- MVI A,#82
- STA CMODE ECHO
- XRA A
- STA NBYTES
- RET
- *
- LADDR EQU $
- MVI A,#83
- STA CMODE ADDRESS
- XRA A
- STA NBYTES
- RET
- *
- LEXT EQU $
- MVI A,#84
- STA CMODE EXTERNAL DEVICE
- XRA A
- STA NBYTES
- RET
- *
- STCOL EQU *
- MVI A,#85
- STA CMODE COLOR
- XRA A
- STA NBYTES
- RET
- COLOR EQU *
- LXI H,NBYTES
- INR M
- MVI A,02
- CMP M
- RNZ
- XRA A
- STA CMODE
- RET
- *
- LDC EQU $ LOAD COORDINATE PROCESSOR
- CALL ESCCTL CHECK FOR COMMAND CHANGE
- CALL GETXY GET COORDINATES
- CALL OUTCOORD
- RET
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * ECHO COMMAND
- * 70H-TESTS MEMORY CONFIGURATION OF TERMINAL
- * RESPONDS WITH'; 72H- 4K
- * 73H- 20K
- * 76H- 8K
- * 77H- 24K
- * 71H-SUBTYPE (3)
- * 72H-LOADFILE (SWITCH - USUALLY 3)
- * 73H-CONFIG (0)
- * 7BH-SOUND AUDIBLE AUDIBLE ALERT
- * 7CH-ID SERIAL NUMBER
- * 7DH-SEND USER FLAG
- * OTHERS LOOP BACK
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- ECHO EQU $
- CALL ESCCTL CHECK FOR COMMAND CHANGE
- CALL GET3 GET NEXT 3 BYTES
- MOV A,E
- ANI #7F
- CPI #7C TEST FOR ID CODE RESPONSE
- JNZ LDE1 NOT ID REQUEST
- MVI A,#20 ALWAYS HAVE EXT
- ANI #20 TEST FOR ID SWITCHES
- MVI A,#7C RELOAD ECHO CODE.
- JZ ECHO.ST NO ID SWITCHES, SEND BACK ECHO CODE
- MVI C,00
- IN IDCHAN*32+IDLSBS ADD LOWER 8 BITS IF ID
- CALL LDE3 SET ID CODE IN ECHO RESPONSE
- MVI C,#20
- IN IDCHAN*32+IDMSBS LOAD UPPER BITS OF ID CODE.
- CALL LDE3 SET ID CODE IN ECHO RESPONSE.
- RET
- *
- LDE3 EQU $
- MOV B,A SAVE ID CODE.
- ANI #0F MASK OFF LOWER 4 BITS
- ORA C ADD ID RESPONSE NUMBER
- PUSH B SAVE ID CODE AND RESPONSE
- CALL ECHO.ST STORE CODE FOR TRANSMIT
- POP B RETRIEVE ID CODE
- MOV A,B
- RRC POSITION UPPER
- RRC FOUR BITS
- RRC OF ID CODE FOR
- RRC ECHO RESPONSE.
- ANI #0F MASK OFF UNWANTED BITS.
- ORA C ADD RESPONSE
- ORI #10 NUMBER FOR 'P'L'A'T'O
- JMP ECHO.ST STORE CODE FOR TRANSMIT
- *
- LDE1 EQU $
- CPI #7B TEST FOR AUDIBLE ALERT
- JNZ LDE1.A
- IN TPCHAN*32+TOUCHD SOUND TONE AND RETURN
- RET
- LDE1.A EQU $
- CPI #70 TEST FOR TERMINAL TYPE
- JNZ LDE1.B
- LDA M.TYPE LOAD TERMINAL TYPE
- JMP ECHO.ST
- LDE1.B EQU *
- CPI #71 TEST FOR SUB TYPE
- JNZ LDE1.C
- MVI A,3
- JMP ECHO.ST
- LDE1.C EQU *
- CPI #72 TEST FOR LOADFILE
- JNZ LDE1.D
- IN RSF.PANL*32+PANLSWCH
- ANI #0E0
- RLC
- RLC
- RLC
- JMP ECHO.ST
- LDE1.D EQU *
- CPI #73 TEST FOR CONFIG
- JNZ LDE2
- MVI A,0
- JMP ECHO.ST
- LDE2 EQU $
- CPI #7D TEST FOR SENDING
- JNZ ECHO.ST
- LHLD MEMREG
- MOV A,M
- ANI #7F
- *
- ECHO.ST EQU $
- ORI #80 INCLUDE ECHO CODE
- MOV L,A AND STORE
- MVI H,00 IN TRANSMIT FIFO.
- CALL P.XMIT
- RET
- ************************************************************************
- *
- * LOAD MEMORY ADDRESS THIS INSTRUCTION LOADS THE MEMORY
- * ADDRESS REGISTER WITH BITS 01-15. THIS INSTRUCTION
- * SPECIFIES THE FIRST STORAGE ADDRESS TO BE USED UPON ENTRY
- * INTO A MODE 2 OPERATION.
- *
- ************************************************************************
- LDA EQU $
- CALL ESCCTL CHECK FOR COMMAND CHANGE
- CALL GET3 GET NEXT 3 BYTES
- XRA A CLEAR THE
- STA BC.REG BLOCK CHECK REGISTER.
- MVI A,#82
- STA MODE SELECT LOAD MEM. DATA MODE
- MOV A,L
- ANI #3F
- RLC
- ADD D
- MOV H,A
- MOV L,E
- CALL CHKRG CHECK ADDRESS RANGE
- SHLD MEMREG STORE ADDRESS INTO MEMORY REGISTE
- RET
- *
- CHKRG EQU $ MEMREG RANGE CHK
- MOV A,H
- CPI #22
- JC POPRET
- JNZ CHKRG.1
- MOV A,L
- CPI #EA
- JC POPRET
- CHKRG.1 EQU $
- MOV A,H
- CPI #7F
- JZ CHKRG.2
- JNC POPRET
- RET
- CHKRG.2 EQU *
- MOV A,L
- CPI #FF
- JZ POPRET
- RET
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SSF (SELECT SPECIAL FUNCTION)
- *
- * THIS INSTRUCTION ESTABLISHES SPECIAL FUNCTIONS WITHIN THE
- * TERMINAL AND SELECTS THE VARIOUS OUTPUT DEVICES. BITS 11 THRU
- * 15 SPECIFY THE DEVICE OR SPECIAL FUNCTIONS AND BITS 01
- * THRU 10 SPECIFY CONTROL FUNCTIONS.
- *
- * FUNCTION TYPE (BITS 11 THRU 15)
- * 00 SELECT SLIDE PROJECTOR
- * 01 SET INTERRUPT MASK
- * 02 SERIAL CHANNEL DATA
- * 04-1F PARALLEL CHANNEL DATA/CONTROL
- *
- * FUNCTION OPERATIONS (BITS 01 THRU 10)
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- *
- * TEST FOR EXISTENCE OF EXTERNAL INTERFACE.
- *
- SSF EQU $
- CALL ESCCTL CHECK FOR COMMAND CHANGE
- CALL GET3 GET NEXT 3 BYTES
- MVI A,#3F LOAD LOWER
- ANA L 15 BITS INTO
- RLC HL REGISTER
- ORA D FOR PROCESSING.
- MOV H,A
- MOV L,E
- *
- SSF.X EQU $
- MOV A,H LOAD UPPER BITS
- RRC
- RRC
- ANI #1F
- *
- * TEST FUNCTION TYPE
- *
- *
- CPI 02 TEST FOR INTERRUPT MASK
- RZ RETURN IF TRY FOR SERIAL
- CPI 01
- JZ SSF.3 SET INTERRUPT MASK
- *
- MOV E,A SAVE ADDRESS BITS
- XRA A TEST FOR SLIDE PROJECTOR
- ORA E ADDRESS
- JZ SSF.1
- MVI A,02 AND TEST
- ANA H FOR INPUT OR OUTPUT.
- MVI A,#E0 LOAD UPPER ADDRESS BITS
- JNZ SSF.2 GO TO INPUT
- *
- * SELECT EXTERNAL DEVICE
- *
- ORA E LOAD DEVICE ADDRESS
- STA EXT.OUT+4 AND STORE FOR OUTPUT
- MVI A,01 TEST FOR
- ANA H OUTPUT BYPASS
- RNZ
- *
- MOV A,L LOAD SLIDE DATA
- CALL EXT.OUT
- RET
- *
- * SLIDE PROJECTOR
- *
- SSF.1 EQU $
- MOV A,L LOAD DATA
- OUT EXTCH7*32+SLDATA0 OUTPUT SLIDE PROJECTOR DATA.
- MVI A,03 LOAD LAMP AND SHUTTER BITS
- ANA H FOR SLIDE PROJECTOR.
- OUT EXTCH7*32+SLDATA1 OUTPUT SLIDE PROJECTOR DATA.
- RET
- *
- * INPUT FROM EXTERNAL DEVICE.
- *
- *
- SSF.2 EQU $
- ORA E LOAD DEVICE ADDRESS
- STA EXT.IN+1 AND STORE IN INSTRUCTION.
- MVI A,01
- ANA H TEST FOR
- RNZ DATA BYPASS.
- CALL EXT.IN INPUT DEVICE DATA.
- MOV L,A AND LOAD UP FOR
- LDA M.KSW LOAD USER/PLATO FLAG
- CPI 03
- RZ RETURN IF USER SELECTED
- MVI H,#82 FOR TRANSMIT TO PLATO.
- CALL P.XMIT HL - TRANSMIT FOR P.XMIT
- RET
- *
- SSF.3 EQU $
- MOV A,L
- ANI #20
- JZ SSF.5
- IN TPCHAN*32+TOUCHS INPUT T.P.STATUS
- RAR TEST FOR CHAR. READY
- JNC SSF.5 CHAR.NOT RDY,ENABLE
- IN TPCHAN*32+TOUCHD DUMMY INPUT TO CLEAR
- SSF.5 EQU $
- MOV A,L
- JMP ENAB
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * EXT (LOAD EXTERNAL DEVICE)
- *
- * THIS INSTRUCTION PASSES DATA TO THE DEVICE SELECTED BY THE
- * SSF INSTRUCTION. ALL 19 BITS OF THE INSTRUCTION ARE PASSED
- * IN THE FOLLOWING MANNER.
- *
- * OUTPUT DATA FUNC. 1 BITS 01-08
- * OUTPUT DATA FUNC. 2 BITS 09-16
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- *
- * TEST FOR EXISTANCE OF EXTERNAL INTERFACE.
- *
- EXT EQU $
- *
- CALL ESCCTL
- CALL GET3
- DAD H ROTATE UPPER 9 BITS LEFT.
- MOV A,L LOAD BITS 10 THRU 16
- ORA D ADD BIT 09
- CALL EXT.OUT EXT AND OUTPUT TO DEVICE.
- MOV A,E LOAD MIDDLE BITS OF EXT
- JMP EXT.OUT AND OUTPUT TO DEVICE.
- STATEX PUSH A
- LDA EXT.OUT+4 LOAD DEVICE ADDRESS
- ANI #1E IS SERIAL DATA/CONTROL
- CPI #02 IF YES, LOOP
- JNZ EXT.2 OTHERWISE,CONTINUE
- EXT.1 IN EXTCH7*32+EXTSTAT LOOP UNTIL CHARACTER
- ANI #02 REQUEST IS UP
- JZ EXT.1
- EXT.2 POP PSW
- RET
- ************************************************************************
- *
- * MODE 0 IS THE POINT PLOTTING MODE. EACH MODE 0 DATA WORD
- * SPECIFIES THE ADDRESS OF A POINT ON THE DISPLAY TO BE WRITTEN
- * OR ERASED. BIT 02 OF THE LDM INSTRUCTION DETERMINES WHETHER IT
- * IS A WRITE OR ERASE OPERATION
- *
- ************************************************************************
- STA COMMAND+1
- MVI A,#30
- STA COMMAND+2
- LXI H,COMMAND
- *
- POINT2 CALL OUTCOORD GO OUTPUT COORDINATES TO DISPLAY
- *
- POINT3 EQU $
- LDA M.MODE LOAD MODE WRITE ERASE BITS
- RLC
- ANI #06
- OUT DISCHAN*32+DISCON2 SET WRITE ERASE BITS
- MVI A,#A0
- OUT DISCHAN*32+DISCON1 VECT/Y SHORT/X POS
- XRA A
- OUT DISCHAN*32+DISDATA
- MVI A,#F8
- OUT DISCHAN*32+DISCON1 VECTOR/INHIBIT/Y SHORT/ X NE
- XRA A
- OUT DISCHAN*32+DISDATA DECREMENT X AXIS
- RET
- ************************************************************************
- *
- * MODE 1 IS THE VECTOR DRAWING MODE. EACH MODE 1 DATA WORD
- * SPECIFIES THE TERMINATING COORDINATES OF A LINE,THE ORGIN OF
- * WHICH IS CONTAINED IN THE X AND Y REGISTER. THE TERMINAL POINT
- * OF A GIVEN LINE IS ALSO THE ORIGIN OF THE NEXT LINE. LINE
- * ORIGINS CAN BE RELOCATED BY THE LDC INSTRUCTION WITHOUT
- * EXITING FROM MODE 1
- *
- ************************************************************************
- LINE EQU $
- CALL ASSEMBLE LOAD X AND Y COORDINATES.
- *
- LINE1 EQU $
- MVI B,01 LOAD MASK
- MOV A,H LOAD UPPER BIT OF X
- ANA B AND MASK UNWANTED BITS
- MOV H,A
- MOV A,D LOAD UPPER BIT OD Y
- ANA B AND MASK UNWANTED BITS.
- MOV D,A
- SHLD XEND STORE X END POINT
- XCHG
- SHLD YEND STORE Y END POINT
- ************************************************************************
- *
- * VECTOR GENERATOR SUBROUTINE
- *
- ************************************************************************
- *
- * THE ALGORITHM IMPLEMENTED FOR THE VECTOR GENERATOR IS THE
- * UNIT INCREMENT DIGITAL DIFFERENTIAL ANALYZER. THE DDA
- * GENERATES POINTS THAT ARE SPACED ONE UNIT APART ALONG THE
- * AXIS OF GREATER DELTA. THE SPACING IN THE OTHER DIRECTION
- * IS MERELY THE SLOPE. IN EQUATION FORM THE ABOVE CAN BE STATED A
- *
- * Y(0)=Y(I)+1/2 X(0)=X(I)
- * Y(N)=Y(N-1)+DELTA Y/DELTA X X(N)=X(N-1)+1
- *
- * OR
- *
- * X(0)=X(I)+1/2 Y(0)=Y(I)
- * X(N)=X(N-1)+DELTA X/DELTA Y Y(N)=Y(N-1)+1
- *
- * TO PREVENT THE GENERATED LINE FROM BEING BIASED TO LIE
- * ON ONE SIDE OF THE IDEAL LINE THE POINTS ARE ROUNDED TO THE
- * NEAREST INTEGER. ROUNDING IS EQUIVALENT TO ADDING 1/2 TO THE
- * INITIAL VALUE
- *
- ************************************************************************
- *
- * PARAMETER LOCATIONS UPON ENTRY
- *
- * LOCATION USEAGE
- *
- * XREG X BEGINNING POINT
- * XEND X ENDING POINT
- * YREG Y BEGINNING POINT
- * YEND Y ENDING POINT
- *
- * PARAMETER LOCATIONS UPON EXIT
- *
- * XDELTA XEND-XREG OR XREG-XEND
- * YDELTA YEND-YREG OR YREG-YEND
- * SLOPE XDELTA/YDELTA OR YDELTA/XDELTA
- * VECFLAG FLAG
- *
- * BITS 1-3 UNUSED
- * BIT 4 X SIGN (1 NEG 0 PO
- * BIT 5 Y SIGN (1 NEG 0 PO
- * BIT 6 LARGEST DELTA (1=X
- * BIT 7-8 UNUSED
- *
- ************************************************************************
- *
- * WRITE OR ERASE FIRST POINT OF VECTOR
- *
- MVI C,#80 SET VECTOR MODE.
- *
- LDA M.MODE LOAD MODE WRITE ERASE BITS
- RLC
- ANI #06
- OUT DISCHAN*32+DISCON2 SET WRITE/ERASE BITS
- LHLD XREG LOAD CURRENT X COORDINATE
- CALL CALDELX
- LHLD YREG LOAD CURRENT Y COORDINATE
- CALL CALDELY
- ************************************************************************
- *
- * DETERMINE IF 45 DEGREE ANGLE AND IF DELTA X GREATER DELTA Y
- *
- ************************************************************************
- MOV A,L
- ORA H TEST FOR ZERO
- JZ VECTOR6
- VECTOR4A CALL COMPHL
- XCHG
- LHLD XDELTA LOAD DELTA X
- DAD D DELTA Y MINUS DELTA X
- JC VECTOR5 JUMP IF CARRY
- *
- * DELTA Y GREATER THAN DELTA X
- *
- LHLD YDELTA LOAD DELTA Y
- CALL COMPHL
- XCHG
- LHLD XDELTA LOAD DELTA X
- MOV A,C LOAD OUTPUT FUNCTION FOR VECTOR
- JMP VECTOR7 JUMP TO OUTPUT FUNCTION
- *
- * DELTA Y IS EQUAL TO OR LESS THAN DELTA X
- *
- VECTOR5 MOV A,L
- ORA H TEST FOR ZERO
- JZ VECTOR8 JUMP IF ANGLE IS 45 DEGREES
- *
- VECTOR6 LHLD XDELTA LOAD DELTA X
- CALL COMPHL
- XCHG PLACE DIVISOR INTO REGISTER PAIR
- LHLD YDELTA LOAD DELTA Y
- MOV A,C LOAD FLAG
- ADI #20 SET BIT TO INDICATE Y SHORT AXIS
- *
- VECTOR7 OUT DISCHAN*32+DISCON1 OUTPUT CONTROL 1 FUNCTION
- STA VECFLAG
- ************************************************************************
- *
- * FRACTIONAL DIVIDE ROUTINE
- *
- ************************************************************************
- *
- * DIVIDEND REGISTER PAIR HL
- * DIVISOR REGISTER PAIR DE
- * QUOTIENT REGISTER PAIR BC
- *
- ************************************************************************
- DIV0 LXI B,#0040 SET COUNTER TO TEM PLACE ACCURACY
- DIV1 DAD H SHIFT DIVIDEND LEFT ONE PLACE
- SHLD SAVE SAVE DIVIDEND VALUE
- DAD D SUBTRACT DIVISOR FROM DIVIDEND
- JC DIV2 JUMP IF CARRY SET
- *
- LHLD SAVE RESTORE DIDIDEND TO ORIGINAL VALUE
- *
- * THIS CODE SHIFTS QUOTIENT INTO REISTER PAIR BC
- *
- DIV2 EQU $
- MOV A,C
- RAL
- MOV C,A
- MOV A,B
- RAL
- MOV B,A
- *
- JNC DIV1 REPEAT IF NOT COMPLETE.
- *
- * LEFT JUSTIFY FRACTIONAL QUOTIENT
- *
- MOV L,C TRANSFER REG PAIR BC TO REG PAIR HL
- MOV H,B
- *
- DAD H SHIFT REG PAIR HL LEFT SIX PLACES
- DAD H
- DAD H
- DAD H
- DAD H
- DAD H
- *
- XCHG SAVE FRACTIONAL ANSWER
- JMP CALPT1 GO TO CALCULATE POINTS
- ************************************************************************
- *
- * INITIALIZE FOR A 45 DEGREE ANGLE
- *
- ************************************************************************
- VECTOR8 MOV A,C LOAD FUNCTION CODE
- OUT DISCHAN*32+DISCON1 OUTPUT
- STA VECFLAG
- LXI D,#FFFF SET SLOPE TO ALL ONES.
- ************************************************************************
- *
- * THIS ROUTINE CALCULATES INCREMENTAL MOVEMENTS AND
- * OUTPUTS THEM TO THE DISPLAY
- *
- ************************************************************************
- *
- * REGISTER PAIR HL FRACTIONAL PARTIAL SUM
- * REGISTER PAIR DE SLOPE
- * REGISTER PAIR BC LOOP COUNT
- *
- ************************************************************************
- *
- * INITIALIZE LOOP COUNT INTO REGISTER PAIR BC
- *
- CALPT1 LDA VECFLAG
- LHLD XDELTA
- ANI #20 TEST FOR LARGEST DELTA.
- JNZ CALPT2 DELTA X IS LONG AXIS.
- *
- LHLD YDELTA
- CALPT2 EQU $
- MOV C,L
- MOV B,H
- LXI H,#8000 LOAD ROUNDING FACTOR INTO PARTIAL
- MOV A,C TEST FOR LOWER 8 BITS LENGTH EQUA
- ANA A
- JZ CALPT5A
- ************************************************************************
- *
- * INCREMENTAL CALCULATION LOOP
- *
- ************************************************************************
- *
- CALPT5 DAD D SHORT AXIS PLUS SLOPE
- RAR SHIFT CARRY INTO A REGISTER
- OUT DISCHAN*32+DISDATA
- DCR C DECREMENT LOOP COUNT (LOWER 8 BIT
- JNZ CALPT5 JUMP IF NOT COMPLETE
- *
- CALPT5A EQU $
- DCR B DECREMENT UPPER BITS
- JP CALPT5 RETUN IF NOT COMPLETE.
- *
- * PLACE X AND Y END COORDINATES INTO X AND Y REGISTERS
- * WHICH BECOMES THE BEGGINNING POINT OF THE NEXT VECTOR
- *
- CALPT6 EQU $
- LHLD YEND
- XCHG
- LHLD XEND
- *
- JMP POINT2 DISPLAY LAST POINT
- ************************************************************************
- *
- * MODE 2 IS THE LOAD TERMINAL MEMORY MODE. EACH MODE 2 DATA
- * WORD CONTAINS A 16 BIT WORD TO BE STORED IN THE MEMORY
- * LOCATION SPECIFIED BY THE CONTENTS OF THE MEMORY ADDRESS
- * REGISTER. AFTER THE DATA HAS BEEN STORED, THE MEMORY ADDRESS
- * REGISTER IS INCREMENTED BY ONE, THUS DATA CAN BE STORED
- * SEQUENTIALLY IN MEMORY BY TRANSMITTING ONLY MODE 2 DATA WORDS.
- * THE CONTENTS OF THE MEMORY ADDRESS REGISTER CAN BE CHANGED AT
- * ANY TIME WITH THE LDA INSTRUCTION
- * WHEN DISPLAYED ON THE DISPLAY THE DATA APPEARS AS A VERTICAL
- * COLUMN WITH BIT 01 AT THE BOTTOM AND BIT 16 AT THE TOP.
- *
- ************************************************************************
- *
- * ASSEMBLE 16 BIT MODE 2 DATA WORD AND STORE IN CHAR MEMORY
- *
- MEMORY EQU $
- CALL ESCCTL CHECK FOR COMMAND CHANGE
- CALL GET3 GET NEXT 3 BYTES
- DAD H ROTATE LEFT
- MOV A,L FROM
- ORA D SAVE IN
- MOV D,A DE REGISTER PAIR.
- MOV B,H SAVE BLOCK CHECK BITS.
- *
- * STORE DATA WORD INTO CHARACTER MEMORY
- *
- MEMORY1 LHLD MEMREG LOAD CHARACTER MEMORY ADDRESS REG
- CALL CHKRG
- *
- *
- MOV M,E STORE LOWER BYTE INTO MEMORY
- INX H INCREMENT MEMORY ADDRESS REGISTER
- MOV M,D STORE UPPER BYTE INTO MEMORY
- INX H INCREMENT MEMORY ADDRESS REGISTER
- SHLD MEMREG STORE MEMORY ADDRESS
- RET
- *
- MEMORY2 EQU $
- LXI H,BC.REG LOAD ADDRESS OF BLOCK CHECK REGISTER
- MOV A,E LOAD LOWER BYTE OF DATA
- CALL BLK.CHK DO BLOCK CHECK ROUTINE.
- *
- MOV A,D LOAD UPPER BYTE OF DATA
- * THIS ROUTINE CALCULATES THE BLOCK CHECK AND TEST RESULTS.
- * IF RESULTS ARE INCORRECT, A UNSOLICITED STATUS IS TRANSMITTED,
- * TELLING THE PLATO SYSTEM TO RETRANSMIT THE BLOCK OF DATA.
- BLK.CHK EQU $
- XRA M DO EXCLUSIVE OR
- RLC AND ROTATE RESULTS.
- MOV M,A STORE RESULTS AS NEW CHECK VALUE.
- ORA M TEST BLOCK CHECK RESULT
- MOV A,B LOAD BLOCK CHECK BITS
- RAR AND TEST FOR BLOCK CHECK THIS BYTE.
- MOV B,A SAVE BLOCK CHECK BITS.
- RNC NO CHECK, GET NEXT BYTE.
- RZ BLOCK CHECK CORRECT.
- MOV M,00
- LXI H,#0385 LOAD UNSOLICITED STATUS
- CALL P.XMIT
- RET
- ************************************************************************
- *
- * MODE 3 - CHARACTER MODE ONLINE ENTRY
- * IF NOT ESC OR CTL CODE BUILD
- * COMMAND - CODE/ESC/#30
- *
- CHARACT EQU $
- CALL ESCCTL
- MOV A,C
- STA COMMAND
- MVI A,#1B
- STA COMMAND+1
- MVI A,#30
- STA COMMAND+2
- LXI H,COMMAND
- CALL R.CHARS
- RET
- ************************************************************************
- *
- * MODE 4 IS BLOCK ERASE EACH PAIR OF DATA WORDS SPECIFIES
- * THE CORNERS OF AN AREA TO BE ERASED. THE AREA ERASED IS THAT
- * ENCLOSED BY THE ABSOLUTE VALUE OF X2-X1 AND Y2-Y1.
- *
- *
- * X1,Y1
- *
- * ****************************************
- * * *
- * * *
- * * *
- * * *
- * * AREA ERASED
- * * *
- * * *
- * * *
- * * *
- * ****************************************
- *
- * X2,Y2
- *
- ************************************************************************
- BLOCK EQU $
- MVI C,04 LOAD TRANSFER COUNT.
- LXI D,BLOCKX LOAD DESTINATION ADDRESS.
- *
- BLOC1 EQU $
- MOV A,M LOAD X/Y DATA
- STAX D AND STORE FOR PROCESSING,
- INX H INCREMENT SOURCE ADDRESS
- INX D INCREMENT DESTINATION ADDRESS.
- MOV A,M LOAD UPPER BITS
- ANI 01 MASK FOR BIT 9 OF COORDINATE.
- STAX D AND STORE.
- INX H INCREMENT TO
- INX D NEXT ADDRESS.
- DCR C DECREMENT COUNT
- JZ MODE4A PROCESS DTAT IF COUNT ZERO
- JMP BLOC1 ELSE GET NEXT BYTE.
- ************************************************************************
- *
- * CALCULATE ABSOLUTE DELTA X AND Y
- *
- ************************************************************************
- *
- * PARAMETER LOCATIONS UPON ENTRY
- *
- * BLOCKX X1 COORDINATE
- * BLOCKY Y1 COORDINATE
- * XEND X2 COORDINATE
- * YEND Y2 COORDINATE
- *
- ************************************************************************
- MODE4A MVI C,#00 CLEAR DIRECTION FLAGS
- LHLD BLOCKX
- CALL CALDELX CALCULATE DELTA X
- LHLD BLOCKY
- CALL CALDELY CALCULATE DELTA Y
- MOV A,C
- STA BLOCKF SAVE DIRECTION FLAGS
- *
- * TEST FOR POSITIVE DELTA Y
- *
- ANI #10 MASK OFF X DIRECTION BIT
- LHLD BLOCKY LOAD Y1 COORDINATE
- JNZ YSTART
- *
- NEGY LHLD YEND LOAD Y2 COORDINATE
- *
- * SET Y STARTING ADDRESS
- *
- YSTART MOV A,L
- OUT DISCHAN*32+YCOORD OUTPUT Y START ADDRESS
- IN DISCHAN*32+XYREAD GET X REGISTER BIT 9
- ANI #01
- MOV L,A SAVE X REGISTER BIT 9
- MOV A,H
- RLC
- ORA L ADD X REGISTER BIT 9
- ADI #04 ADD ENABLE LOAD COORDINATE BIT
- OUT DISCHAN*32+DISCON1
- *
- * SET WRITE/ERASE BITS
- *
- LDA M.MODE LOAD MODE WRITE ERASE BITS
- RLC
- ANI #06
- OUT DISCHAN*32+DISCON2
- *
- LHLD YDELTA LOAD NUMBER OF LINES
- INX H
- XCHG
- LHLD XDELTA
- INX H
- SHLD XSAVE SAVE COORDIMATE.
- *
- * TEST FOR POSITIVE DELTA X
- *
- LDA BLOCKF
- ANI #08 MASK OFF Y DIRECTION BIT
- LHLD BLOCKX LOAD X1 COORDINATE
- JZ NEGX1
- *
- NEGX LHLD XEND LOAD X2 COORDINATE
- NEGX1 MOV A,H
- ANI #01 MASK IF WRAP AROUND
- MOV B,A
- MOV C,L
- ************************************************************************
- *
- * BLOCK WRITE/ERASE INCREMENTAL LOOP
- *
- ************************************************************************
- *
- * REGISTER PAIR BC BASELINE ADDRESS FOR X
- * REGISTER PAIR HL NUMBER OF POINTS PER LINE
- * REGISTER PAIR DE NUMBER OF LINES PER BLOCK
- *
- ************************************************************************
- *
- * RESET X BASELINE ADDRESS FOR NEXT LINE
- *
- XSTART MOV A,C
- OUT DISCHAN*32+XCOORD OUTPUT BASELINE ADDRESS LOWER 8
- IN DISCHAN*32+XYREAD GET Y REGISTER BIT 9
- ANI #02 SAVE Y REGISTER BIT 9
- ADD B
- ADI #A4 VEC/XPOS/YPOS/YSHORT/ENABLE
- OUT DISCHAN*32+DISCON1
- LHLD XSAVE LOAD NUMBER OF POINTS PER LINE
- *
- *
- PUSH B SAVE BC ON STACK
- LXI B,#FFF8 AND LOAD -8
- *
- BLKER.1 EQU $
- MOV A,C TEST FOR GREATER THAN
- ANA L EIGHT FOR FAST ERASE.
- JZ BLKER.3 LESS THAN, TEST UPPER BIT.
- XRA A CLEAR A REGISTER
- *
- BLKER.2 EQU $
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA BLOCK ERASE/WRITE
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- DAD B SUBTRACT EIGHT FROM COUNT.
- CMP L AND TEST FOR ZERO
- JNZ BLKER.1 NOT ZERO, DO AGAIN.
- *
- BLKER.3 EQU $
- CMP H AND TEST UPPER BIT OF COUNT.
- JNZ BLKER.2 NOT ZERO, OUTPUT ANOTHER EIGHT.
- *
- POP B RESTORE BC REGISTERS
- CMP L AND TEST FOR ZERO COUNT.
- JZ BLOCK2 COMPLETED, TEST Y AXIS.
- BLOCK1 OUT DISCHAN*32+DISDATA
- DCR L
- JNZ BLOCK1 JUMP IF LINE NOT COMPLETE
- *
- *
- * TEST FOR COMPLETION OF BLOCK
- *
- BLOCK2 EQU $
- DCX D DECREMENT THE LINE COUNT
- MOV A,E AND TEST FOR
- ORA D LAST LINE COMPLETED.
- JZ BLOCK4 COMPLETED, END BLOCK WRITE/EREASE.
- *
- * INCREMENT Y AXIS BY ONE
- *
- BLOCK3 EQU $
- MVI A,#D0 VEC/INHIBIT/XSHORT/YNEG
- OUT DISCHAN*32+DISCON1
- XRA A CLEAR A REGISTER
- OUT DISCHAN*32+DISDATA INCREMENT Y AXIS
- JMP XSTART
- *
- BLOCK4 EQU $
- LHLD BLOCKY LOAD Y1 COORDINATE
- LXI D,#FFF1 SET TO MINUS 15
- DAD D Y1 MINUS 15
- CALL OUTY OUTPUT Y COORDINATE.
- LHLD BLOCKX LOAD X COORDINATE
- JMP OUTX OUTPUT X COORDINATE.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * THESE MODES ARE RESERVED FOR USE BY THE USER. USING 7ODE 2,
- * THE USER MAY LOAD A ROUTINE INTO THAT AREA OF MEMORY ALLOCATED
- * FOR HIS USE.THE ADDRESS OF THAT ROUTINE IS LOADED UNDER
- * MODE 5 ,6, OR 7 TAG.
- * BY USING THE LDM INSTRUCTION, THE USER CAN CALL THAT ROUTINE.
- * THE USER MUST EXIT THE ROUTINE WITH A RETURN INSTRUCTION
- * TO INSURE THAT CONTROL IS PASSED CORRECTLY TO THE
- * RESIDENT FIRMWARE.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- MODE5 EQU *
- CALL ESCCTL
- LHLD MODE5A
- JMP MODESEL SELECT MODE WITH HL JUMP.
- *
- MODE6 EQU *
- CALL ESCCTL
- LHLD MODE6A
- JMP MODESEL SELECT MODE WITH HL JUMP.
- *
- MODE7 EQU *
- CALL ESCCTL
- LHLD MODE7A
- *
- MODESEL EQU $
- SHLD MODEADR SAVE ABSOLUTE MODE ADDRESS
- CALL GET3 GET NEXT 3 BYTES
- DAD H AND SHOFT
- MOV C,H IT INTO
- MOV A,L REGISTERS
- ORA D C, D, AND E.
- MOV D,A
- LHLD MODEADR RETURN ABSOLUTE MODE ADDRESS
- PCHL
- MODE567 EQU *
- MOV A,C
- SBI #4F
- MOV C,A
- LDA MODE UPDATE MODE
- ANI #C0
- ORA C
- STA MODE
- MOV A,C
- ADD A
- ADD A
- MOV C,A
- LDA M.MODE UPDATE M.MODE
- ANI #E3
- ORA C
- STA M.MODE
- XRA A
- STA NBYTES
- RET
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * S U B R O U T I N E S
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SIZE ONE CHARACTER GENERATOR
- *
- * THIS ROUTINE OUTPUTS TWO BYTES OF A 8 X 16 CHARACTER
- * TO THE DISPLAY.
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- TWICE XRA A SET ZERO FLAG
- CHAR.S1 EQU $
- LDAX D LOAD BYTE OF CHARACTER DATA
- INX D INCREMENT CHARACTER ADDRESS
- OUT DISCHAN*32+DISDATA OUTPUT BYTE
- RAR
- OUT DISCHAN*32+DISDATA OUTPUT
- RAR
- OUT DISCHAN*32+DISDATA CHARACTER
- RAR
- OUT DISCHAN*32+DISDATA DATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RZ RETURN AFTER SECOND PASS
- JMP TWICE
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SIZE TWO CHARACTER GENERATOR
- *
- * THIS ROUTINE OUTPUTS TWO BYTES OF A 16 X 32 CHARACTER
- * TO THE DISPLAY.
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- TWICE1 XRA A SET ZERO FLAG
- CHAR.S2 EQU $
- LDAX D LOAD CHARACTER DATA BYTE
- INX D INCREMENT DATA ADDRESS
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- OUT DISCHAN*32+DISDATA
- JNZ TWICE1 CHECK FOR SECOND PASS
- MOV A,B LOAD COLUMN COUNT
- RAR AND TEST FOR
- RC
- DCX D DECREMENT THE DATA
- DCX D POINTER
- RET
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * DISPLAY TAB ROUTINE.
- *
- * THIS ROUTINE SET THE X AND Y REGISTERS TO TAB FOR
- * THE NEXT CHARACTER POSITION.
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- DISP.TAB EQU $
- LHLD XREG LOAD CURRENT X
- XCHG AND SAVE IN DE
- LHLD X.PLOT LOAD X CHARACTER PLOT
- DAD D ADD TO CURRENT X
- CALL OUTX OUTPUT X COORDINATE.
- LHLD YREG LOAD CURREMT Y
- XCHG AND SAVE IN DE
- LHLD Y.PLOT LOAD Y CHARACTER PLOT
- DAD D ADD TO CURRENT Y
- JMP OUTY OUTPUT Y COORDINATE.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * INPUT X COORDINATE TO HL REGISTER PAIR.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- INPX EQU $
- IN DISCHAN*32+XREAD INPUT LOWER BITS OF X
- MOV L,A AND SAVE IN L REGISTER.
- IN DISCHAN*32+XYREAD NPUT UPPER BIT
- ANI 01 MASK
- MOV H,A AND SAVE IN H REGISTER.
- RET RETURN TO CALLER.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * INPUT Y COORDINATE TO HL REGISTER PAIR.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- INPY EQU $
- IN DISCHAN*32+YREAD INPUT LOWER BITS OF Y
- MOV L,A AND SAVE IN L REGISTER.
- IN DISCHAN*32+XYREAD NPUT UPPER BIT
- ANI 02 MASK
- RRC
- MOV H,A AND SAVE IN H REGISTER.
- RET RETURN TO CALLER.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SUBROUTINE TO STEP Y AXIS.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- STEPY EQU $
- CALL INPY INPUT CURRENT Y COORDINATE.
- *
- LDA M.DIR LOAD STEP DIRECTION BIT
- ANI 01 AND MASK
- INX H INCREMENT COORDINATE
- JZ OUTY AND OUTPUT.
- *
- DCX H ELSE DECREMENT
- DCX H COORDINATE
- JMP OUTY AND OUTPUT
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SUBROUTINE TO STEP X AXIS
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- STEPX EQU $
- CALL INPX INPUT CURRENT X COORDINATE.
- *
- LDA M.DIR LOAD STEP DIRECTION BIT
- ANI 02 AND MASK
- INX H INCREMENT COORDINATE
- JZ OUTX AND OUTPUT.
- *
- DCX H ELSE DECREMENT
- DCX H COORDINATE
- JMP OUTX AND OUTPUT
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SUBROUTINE TO OUTPUT X COORDINATE TO THE DISPLAY.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- OUTX EQU $
- MVI A,01 CHOP OFF UNWANTED
- ANA H BITS THAT WILL
- MOV H,A SCREW THINGS UP.
- SHLD XREG STORE NEW X COORDINATE.
- MOV A,L LOAD LOWER 8 BITS
- OUT DISCHAN*32+XCOORD ND OUTPUT TO DISPLAY.
- IN DISCHAN*32+XYREAD PUT UPPER BITS OF X AND Y
- ANI 02 MASK Y
- ORA H INCLUDE NEW X BIT
- ORI 04 SET LOAD ENABLE
- OUT DISCHAN*32+DISCON1 OUTPUT UPPER BITS OF X AND Y.
- RET RETURN TO CALLER
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * SUBROUTINE TO OUTPUT Y COORDINATE TO THE DISPLAY.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- OUTY EQU $
- MVI A,01 CHOP OFF UNWANTED
- ANA H BITS THAT WILL
- MOV H,A SCREW THINGS UP.
- SHLD YREG STORE NEW Y COORDINATE.
- MOV A,L LOAD LOWER 8 BITS
- OUT DISCHAN*32+YCOORD ND OUTPUT TO DISPLAY.
- IN DISCHAN*32+XYREAD NPUT CURRENT UPPER BITS
- ANI 01 MASK X COORDINATE BIT
- RRC SHIFT IN
- ORA H NEW Y BIT
- RLC
- ORI 04 SET LOAD ENABLE BIT
- OUT DISCHAN*32+DISCON1 OUTPUT NEW UPPER BITS
- RET RETURN TO CALLER.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * OUTPUT X AND Y COORDINATES .
- * Y COORDINATE DE REGISTER PAIR
- * X COORDINATE HL REGISTER PAIR
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- OUTCOORD EQU $
- CALL OUTX SET X COORDINATE.
- XCHG
- JMP OUTY SET Y COORDINATE.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * USED TO CALL A ROUTINE WITH CONTENTS OF HL REGISTERS.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- INDIRECT EQU $
- PCHL
- *
- NOOP EQU $
- RET
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * STORE DIRECTION BITS FOR COORDINATE STEP ROUTINES.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- DIR EQU $
- SHLD M.DIR STORE STEP DIRECTION BITS
- RET
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * INPUT DATA TO USER INSTEAD OF TRANSMITING.
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- INPUT EQU $
- LXI H,US.FIFO LOAD USER FIFO ADDRESS
- JMP FIFO.RD AND GET DATA.
- INDATA EQU $
- LXI H,IN.BUF LOAD KB/TP INPUT BUFFER
- JMP FIFO.RD
- * * * * * * * * * * * * * * * * * * * * * * * *
- * * * * * * * * * * * * * * * * * * * * * * * *
- ENAB EQU $
- STA M.ENAB STORE INTERRUPT MASK
- RLC
- RLC
- RLC TO OUTPUT
- OUT TPCHAN*32+TPCONT TOUCH PANEL.
- *
- RLC AND ROTATE TO
- RLC EXTERNAL BIT.
- ANI 01
- ORI 01 ALWAYS ENABLE EXT CHANNEL
- OUT EXTCH5*32+EXTCNTL ABLE EXTERNAL DEVICE.
- RET
- *
- GET3 EQU $
- MVI A,#3F
- ANA C
- MOV C,A
- LDA NBYTES
- CPI #02
- JNZ GET3.1
- MOV A,C
- STA COMMAND STORE HIGH 6 BITS
- XRA A
- STA NBYTES
- STA CMODE
- CALL ASSEMBLE
- RET
- GET3.1 EQU $
- CPI #01
- JNZ GET3.2
- MOV A,C
- STA COMMAND+1 STORE MIDDLE 6 BITS
- JMP GET3.R
- GET3.2 EQU $
- MOV A,C
- STA COMMAND+2 STORE LOWER 6 BITS
- GET3.R EQU $
- LXI H,NBYTES
- INR M
- POP H
- RET
- ASSEMBLE EQU $
- LDA COMMAND+2 LOAD LOWER 6 BITS OF INPUT
- MOV E,A
- LDA COMMAND+1
- RRC
- RRC
- MOV C,A
- ANI #C0 MASK ALL BITS BUT Y COORDINATE
- ADD E
- MOV E,A STORE LOWER 8 BITS Y COORDINATE
- MOV A,C
- ANI #01
- MOV D,A STORE BIT 9 OF Y COORDINATE
- MOV A,C
- RRC
- ANI #07
- MOV L,A STORE LOWER 3 BITS OF X COORDINAT
- LDA COMMAND LOAD UPPER BITS OF INPUT.
- RLC
- RLC
- RLC
- MOV C,A
- ANI #F8
- ADD L
- MOV L,A STORE LOWER 8 BITS X COORD
- MOV A,C
- ANI #01
- MOV H,A STORE BIT 9 OF X COORD
- RET
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * THIS ROUTINE LOADS THE FIRST-IN-FIRST OUT BUFFER.
- * * * * * * * * * * * * * * * * * * * * * * * *
- FIFO.ST EQU $
- MVI A,#C0 MASK CATAGORY BITS
- ANA H FOR DATA
- XCHG SAVE DATA INDE REGISTERS.
- *
- RLC ROTATE CATAGORY BITS
- RLC
- MOV B,A AND SAVE IN B REGISTER.
- *
- MVI A,03 MASK OFF
- ANA D FLAG
- MOV D,A BITS.
- LDA M.KSW LOAD USER/PLATO FLAG.
- ANA B TEST TO DETERMINE USER OR TRANSMIT B
- LXI H,IN.BUF LOAD ADDRESS OF KB/TP INB
- JZ FIFOS.1 AND STORE FOR TRANSMIT.
- *
- LXI H,US.FIFO LOAD ADDRESS OF USER BUFFER, BIT SET.
- *
- FIFOS.1 EQU $
- MVI A,07 AND TEST FOR
- CMP M FULL BUFFRR.
- RZ BUFFER FULL, RETURN TO CALLER.
- *
- INR M NOT FULL, ADD ONE TO DIFF. COUNTER.
- INX H INCREMENT TO INPUT POINTER.
- ANA M MASK LOWER BITS,
- RLC AND SET FOR TWO BYTE ADDRESSING.
- INR M ADD ONE TO INPOINTER.
- MVI B,00 LOAD BC REGISTERS
- MOV C,A WITH INPUT INDEX.
- INX H INCREMENT TO START OF
- INX H BUFFER STORE AREA.
- DAD B ADD INDEX TO BASE ADDRESS.
- MOV M,E STORE LOWER BITS.
- INX H
- MOV M,D STORE UPPER BITS.
- RET RETURN TO CALLER.
- *
- *
- * READ DATA FROM TRANSMIT BUFFER.
- *
- FIFO.RD EQU $
- XRA A CLEAR A, AND
- CMP M TEST FOR DATA IN FIFO.
- LXI D,#8000 LOAD NO DATA CODE
- XCHG
- RZ RETURN IF NO DATA.
- XCHG
- DCR M SUBTRACT ONE FOOM DIFF.COUNT
- INX H INCREMENT TO
- INX H OUTPUT POINTER.
- MVI A,07 MASK POINTER
- ANA M TO LOWER BITS
- RLC AND SET FOR TWO BYTE ADDRESSING.
- INR M INCREMENT POINTER
- MVI D,00 LOAD DE WITH
- MOV E,A INDEX TO BUFFER.
- INX H INCREMENT TO START OF STORE AREA.
- DAD D ADD INDEX TO START OF BUFFER
- MOV E,M LOAD LOWER BITS
- INX H INCREMENT ADDRESS
- MOV D,M LOAD UPPER BITS.
- XCHG PLACE IN HL FOR TRANSFER.
- RET RETURN TO CALLER.
- * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * CALCULATE START AND END POINT DIFFERANCE
- *
- * * * * * * * * * * * * * * * * * * * * * * * *
- CALDELX EQU $
- XCHG
- LHLD XEND LOAD END POINT
- MVI B,#08 LOAD PLOTTING BIT
- CALL CALDEL DO CALCULATION.
- SHLD XDELTA STORE START AND END DIFFERANCE.
- RET
- *
- *
- CALDELY EQU $
- XCHG
- LHLD YEND LOAD END POINT
- MVI B,#10 LOAD PLOTTING BIT
- CALL CALDEL DO CALCULATION.
- SHLD YDELTA STORE START AND END DIFFERANCE.
- RET
- *
- SAVESTUF EQU $
- CALL R.INPX SAVE SCREEN POSITIONING
- SHLD G.XPOS
- CALL R.INPY
- SHLD G.YPOS
- RET
- *
- RESTORES EQU $
- LHLD G.XPOS RESTORE SCREEN POSITIONING
- CALL R.OUTX
- LHLD G.YPOS
- CALL R.OUTY
- RET
- *
- XHAIR EQU $
- CALL SAVESTUF
- LDA WIDTH
- RRC
- MOV L,A
- MVI H,00
- CALL COMPHL
- XCHG
- CALL R.INPX
- DAD D
- CALL R.OUTX
- LDA HEIGHT
- RRC
- MOV L,A
- MVI H,00
- CALL COMPHL
- XCHG
- CALL R.INPY
- DAD D
- CALL R.OUTY
- MVI C,#61
- CALL DISCURSX
- CALL RESTORES
- RET
- *
- GIN EQU $ COMM LINE ENTRY TO GIN MODE
- CALL ESCCTL
- RET
- *
- GIN.A EQU $ KEYBOARD ENTRY TO GIN MODE
- CALL ESCCTL IS ESC SEQ. OR CTL CODE
- MOV A,C
- STA GIN.KEY SAVE GIN CHAR. KEY
- ANI #20 2 TO THE FIFTH SET'/
- JNZ GIN.1
- MVI B,4 COURSE GRID
- JMP GIN.2
- GIN.1 EQU $
- MVI B,1 FINE GRID
- GIN.2 EQU $
- MOV A,B
- STA DOTS STORE GRID MOVEMENT VALUE
- MOV A,C CHARACTER CODE IN C
- ANI #DF CODE MASKED OUT 2 TO 5TH
- MOV B,A IN REGISTER B.
- LXI H,MOVTAB BASE OF CURSOR MOVE TABLE
- GIN.3 EQU $
- MOV A,M
- CPI #FF
- JZ GIN.XMT NOT A CURSOR MOVE KEY
- CMP B CHECK FOR CURSOR MOVE KEY
- JZ MOVCURS
- INX H
- INX H
- INX H
- JMP GIN.3
- MOVCURS EQU $
- INX H MATCH FOUND SO JUMP TO
- MOV E,M CURSOR MOVE ROUTINE.
- INX H
- MOV D,M
- PUSH D SAVE DE ON STACK
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- POP H
- CALL JMPHL
- RET
- *
- GIN.XMT EQU $
- LDA LOC.RMT TEST FOR ONLINE
- ORA A
- RNZ RETURN, NOT ONLINE
- LDA GIN.KEY SEND LAST KEY STORED
- MOV C,A
- CALL XMIT.1
- CALL ENQ.1 TRANSMIT CURSOR POSITION
- RET
- *
- *
- MOVTAB EQU $
- DB #41
- DW WEST
- DB #43
- DW SEAST
- DB #44
- DW EAST
- DB #45
- DW NEAST
- DB #51
- DW NWEST
- DB #57
- DW NORTH
- DB #58
- DW SOUTH
- DB #5A
- DW SWEST
- DB #FF
- *
- WEST EQU $
- CALL MINUSX
- RET
- *
- SEAST EQU $
- CALL PLUSX
- CALL MINUSY
- RET
- *
- EAST EQU $
- CALL PLUSX
- RET
- *
- NEAST EQU $
- CALL PLUSX
- CALL PLUSY
- RET
- *
- NWEST EQU $
- CALL MINUSX
- CALL PLUSY
- RET
- *
- NORTH EQU $
- CALL PLUSY
- RET
- *
- SOUTH EQU $
- CALL MINUSY
- RET
- *
- SWEST EQU $
- CALL MINUSX
- CALL MINUSY
- RET
- *
- MINUSX EQU $
- LDA DOTS
- MOV L,A
- MVI H,00
- CALL COMPHL
- PUSH H
- CALL R.INPX
- POP D
- DAD D
- CALL R.OUTX
- RET
- *
- MINUSY EQU $
- LDA DOTS
- MOV L,A
- MVI H,00
- CALL COMPHL
- PUSH H
- CALL R.INPY
- POP D
- DAD D
- CALL R.OUTY
- RET
- *
- PLUSX EQU $
- LDA DOTS
- MOV L,A
- MVI H,00
- PUSH H
- CALL R.INPX
- POP D
- DAD D
- CALL R.OUTX
- RET
- *
- PLUSY EQU $
- LDA DOTS
- MOV L,A
- MVI H,00
- PUSH H
- CALL R.INPY
- POP D
- DAD D
- CALL R.OUTY
- RET
- *
- *
- GIN.TP EQU $
- PUSH D SAVE DATA ON STACK
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- POP D RESTORE DATA
- PUSH D SAVE DATA AGAIN
- CALL GIN.TP1 GET Y COORD.
- CALL R.OUTY
- POP D DE _ DATA
- MOV A,E
- RRC
- RRC
- RRC
- RRC
- MOV E,A L HAS X TOUCH PANEL VAL.
- CALL GIN.TP1 GET X COORD
- CALL R.OUTX
- JMP IDLE14
- *
- GIN.TP1 EQU $
- MVI A,#0F MASK WITH LOWER 4 BITS
- ANA E
- MOV L,A
- MVI H,00 HL _ TOUCH PANEL VALUE
- DAD H MULTIPLY BY 32
- DAD H
- DAD H
- DAD H
- DAD H
- LXI D,#0010 ADD 16
- DAD D
- RET
- **********
- * POINT PLOT MODE- GET X AND Y COORDINATES
- * AND CALL R.DOT TO OUTPUT POINT
- **********
- *
- POINT EQU $
- CALL ESCCTL
- CALL GETXY
- CALL R.DOT
- RET
- *
- **********
- * BLOCK W/E MODE
- **********
- *
- ABLOCK EQU $
- CALL ESCCTL CHECK FOR ESC/CTL CODES
- CALL GETXY GET AN X AND Y COORD.
- LDA BTWICE SECOND SET COORDS
- ORA A
- JNZ XY2
- SHLD X1 NO FIRST SET
- XCHG
- SHLD Y1
- INR A
- STA BTWICE SET BTWICE TO TRUE*D
- RET
- *
- XY2 EQU $
- SHLD X2 SECOND SET
- XCHG
- SHLD Y2
- XRA A
- STA BTWICE TURN BTWICE OFF
- LXI H,X1 HL HAS ADDR. OF XY BUFF.
- CALL R.BLOCK
- RET
- *
- *
- GETXY EQU $
- MOV A,C RESTORE DATA
- LXI H,NINPUT INCR. NUMBER OF INPUTS
- INR M OF CURRENT NO. INPUTS
- ANI #60 IF CHAR AND 60H=20H,HI Y
- CPI #20
- JNZ LOYCHK OTHERWISE, CHECK FOR LO Y
- MVI A,#1F HIGH=(CHAR-32)*32.
- ANA C
- MOV L,A
- MVI H,0
- DAD H
- DAD H
- DAD H
- DAD H
- DAD H HL=HIGH
- LDA NINPUT IF THIS INPUT IS FIRST
- CPI 1 IN SEQ. IT IS HIGH Y BYTE.
- JZ HIYBYTE
- SHLD HIX OTHERWISE, IT IS HIGH X
- POP PSW POP AND RET TO IDLE
- RET
- *
- HIYBYTE SHLD HIY
- POP PSW POP AND RET TO IDLE
- RET
- LOYCHK EQU $
- CPI #60 IF CHAR AND 60H=60H, LO Y
- JNZ LOXCHK OTHERWISE,CHECK FOR LOW X
- MOV A,C
- ANI #1F LOY=(CHAR-32)
- STA LOY
- POP PSW POP AND RET TO IDLE
- RET
- *
- LOXCHK CPI #40 IF CHAR AND 60H=40H,LO X
- JNZ ERR ERR RETURN TO IDLE DEFAULT
- MOV A,C
- ANI #1F LOX=(CHAR-32)
- STA LOX
- LHLD HIX
- ORA L
- MOV L,A
- XCHG DE HAS X COORDINATE
- LXI H,NINPUT SET INPUTS BACK TO 0
- MVI M,0
- LDA LOY
- LHLD HIY
- ORA L
- MOV L,A
- XCHG DE HAS Y COORDINATE
- * HL HAS X COORDINATE
- XRA A CLEAR COMMAND MODE FLAG
- STA CMODE
- LDA SCALEFG LOAD SCALE/NO SCALE FLAG
- RAR
- RC IF SET, COORDS. AS IS..RET
- CALL DIVIDE OTHERWISE SCALE
- XCHG BY FACTOR OF 2
- CALL DIVIDE TO MAP INTO 511X511
- XCHG
- PUSH H SAVE X COORD.
- LHLD BIAS BIAS Y COORD.
- DAD D
- XCHG DE HAS BIASED Y COORD.
- POP H
- RET
- *
- ERR EQU $
- POP PSW
- RET
- *
- G.LINE1 EQU $
- SHLD XEND STORE X END POINT
- XCHG
- SHLD YEND STORE Y END POINT
- *
- **********
- * VECTOR GENERATOR SUBROUTINE
- **********
- *
- * 'THE ALGORITHM IMPLEMENTED FOR THE VECT. GEN. IS THE
- * UNIT INCREMENT DIGITAL DIFFERENTIAL ANALYZER. 'THE 'D'D'A
- * GENERATES POINTS THAT ARE SPACED ONE UNIT APART ALONG THE
- * AXIS OF GREATER DELTA. THE SPACING IN THE OTHER DIRECTION
- * IS MERELY THE SLOPE. 'I EQUA. FORM THE ABOVE CAN BE STATED
- *
- * Y(0)=Y(I)+1/2 X(0)=X(I)
- * Y(N)=Y(N-1)+DY/DX X(N)=X(N-1)+1
- * OR *
- * X(0)=X(I)+1/2 Y(0)=Y(I)
- * X(N)=X(N-1)+DX/DY Y(N)=Y(N-1)+1
- *
- * TO PREVENT THE GENERATED LINE FROM BEING BIASED TO LIE
- * ON ONE SIDE OF THE IDEAL LINE THE PTS. ARE ROUNDED TO THE
- * NEAREST INTEGER. 'ROUNDING IS SAME AS ADDING 1/2 TO THE
- * INITIAL VALUE.
- *
- *
- * PARAMETER LOCATIONS UPON ENTRY
- *
- * LOCATION USEAGE
- *
- * XREG X BEGINNING POINT
- * XEND X ENDING POINT
- * YREG Y BEGINNING POINT
- * YEND Y ENDING POINT
- *
- * PARAMETER LOCATIONS UPON EXIT
- *
- * XDELTA XEND-XREG / XREG-XEND
- * YDELTA YEND-YREG / YREG-YEND
- * SLOPE DX/DY OR DY/DX
- * VECFLAG FLAG
- *
- *
- * BITS 1-3 UNUSED
- * BIT 4 X SIGN
- * BIT 5 Y SIGN
- * BIT 6 BIG 'D
- * BIT 7-8 UNUSED
- *
- **********
- *
- * WRITE OR ERASE FIRST POINT OF VECTOR
- *
- MVI C,#80 SET VECTOR MODE.
- *
- LDA M.MODE LOAD MODE WRITE ERASE BITS
- RLC
- ANI #06
- OUT DISCHAN*32+DISCON2 SET WRITE/ERASE BITS
- LHLD XREG LOAD CURRENT X COORDINATE
- *
- * CALCULATE DELTA X
- *
- XCHG
- LHLD XEND LOAD END POINT
- MVI B,#08 LOAD PLOTTING BIT
- CALL CALDEL DO CALCULATION
- SHLD XDELTA STORE DIFFERANCE
- LHLD YREG LOAD CURRENT Y COORDINATE
- *
- * CALCULATE DELTA Y
- *
- XCHG
- LHLD YEND LOAD END POINT
- MVI B,#10 LOAD PLOTTING BIT
- CALL CALDEL DO CALCULATION
- SHLD YDELTA STORE DIFFERANCE
- *
- *****************************************
- *
- * DETERMINE IF 45 DEGREE ANGLE AND IF DELTA X GREATER DELTA Y
- *
- **********************************************
- MOV A,L
- ORA H TEST FOR ZERO
- JZ VECT6
- VECT4A CALL COMPHL
- XCHG
- LHLD XDELTA LOAD DELTA X
- DAD D DELTA Y MINUS DELTA X
- JC VECT5 JUMP IF CARRY
- *
- * DELTA Y GREATER THAN DELTA X
- *
- LHLD YDELTA LOAD DELTA Y
- CALL COMPHL
- XCHG
- LHLD XDELTA LOAD DELTA X
- MOV A,C LOAD OUTPUT FUNCTION
- JMP VECT7 JUMP TO OUT FUNCTION
- *
- * DELTA Y IS EQUAL TO OR LESS THAN DELTA X
- *
- VECT5 MOV A,L
- ORA H TEST FOR ZERO
- JZ VECT8 JUMP IF ANGLE IS 45
- *
- VECT6 LHLD XDELTA LOAD DELTA X
- CALL COMPHL
- XCHG PLACE DIVISOR
- LHLD YDELTA LOAD DELTA Y
- MOV A,C LOAD FLAG
- ADI #20 SET BIT TO INDICATE Y SHORT AXIS
- *
- VECT7 OUT DISCHAN*32+DISCON1 OUTPUT CONTROL 1
- STA VECFLAG
- *
- ******************************************
- *
- * FRACTIONAL DIVIDE ROUTINE
- *
- **************************************
- *
- * DIVIDEND REGISTER PAIR HL
- * DIVIDEND REGISTER PAIR HL
- *
- * DIVISOR REGISTER PAIR DE
- * QUOTIENT REGISTER PAIR BC
- *
- *************************************
- ADIV0 LXI B,#0040 SET COUNT TO 10 DIGIT ACC.
- ADIV1 DAD H SHIFT DIVIDEND LEFT ONCE
- SHLD SAVE SAVE DIVIDEND VALUE
- DAD D DIVIDEND-DIVISOR
- JC ADIV2 JUMP IF CARRY SET
- *
- LHLD SAVE RESTORE DIVIDEND
- *
- * THIS CODE SHIFTS QUOTIENT INTO REISTER PAIR BC
- *
- ADIV2 EQU $
- MOV A,C
- RAL
- MOV C,A
- MOV A,B
- RAL
- MOV B,A
- *
- JNC ADIV1 REPEAT IF NOT COMPLETE
- *
- * LEFT JUSTIFY FRACTIONAL QUOTIENT
- *
- MOV L,C TRANSFER BC TO HL
- MOV H,B
- *
- DAD H SHIFT HL LEFT SIX PLACES
- DAD H
- DAD H
- DAD H
- DAD H
- DAD H
- *
- XCHG SAVE FRACTIONAL ANSWER
- JMP ACALPT1 GO TO CALCULATE POINTS
- *
- * DIVIDE 16 BIT VALUE IN HL BY 2
- DIVIDE EQU $
- MOV A,H
- ORA L
- RZ
- MOV A,H
- ANI #7F
- RAR
- MOV H,A
- MOV A,L
- RAR
- MOV L,A
- RET
- *
- ********************
- *
- * INITIALIZE FOR A 45 DEGREE ANGLE
- *
- *********************
- VECT8 MOV A,C LOAD FUNCTION CODE
- OUT DISCHAN*32+DISCON1 OUTPUT
- STA VECFLAG
- LXI D,#FFFF SET SLOPE TO ALL ONES.
- *
- ********************
- *
- * THIS ROUTINE CALCULATES INCREMENTAL MOVEMENTS AND
- * OUTPUTS THEM TO THE DISPLAY
- *
- *********************
- *
- * REGISTER PAIR HL FRACTIONAL PARTIAL SUM
- * REGISTER PAIR DE SLOPE
- * REGISTER PAIR BC LOOP COUNT
- *
- *********************
- *
- * INITIALIZE LOOP COUNT INTO REGISTER PAIR BC
- *
- ACALPT1 LDA VECFLAG
- LHLD XDELTA
- ANI #20 TEST FOR LARGEST DELTA
- JNZ ACALPT2 DELTA X IS LONG AXIS
- *
- LHLD YDELTA
- ACALPT2 EQU $
- MOV C,L
- MOV B,H
- LXI H,#8000 PARTIAL SUM RNDG FACT
- WRITSEG EQU $
- PUSH PSW STORE ON STACK FOR LOOP
- W.SEG1 EQU $
- POP PSW POP VALUE FROM STACK
- LDA VECFLAG OUTPUT TO DISPLAY
- OUT DISCHAN*32+DISCON1
- LDA WSEGLEN LOAD UP WRITE SEG. LENGTH
- PUSH PSW STORE UNTO STACK
- MOV A,C CHECK FOR VECTOR END
- CPI 0
- JZ W.ENDCK
- *
- *
- W.SEG2 EQU $
- POP PSW LOOP ON WRITING A SEGMENT
- DCR A
- PUSH PSW
- JZ ERASEG WRITE SEGMENT DONE,ERASE
- DAD D SEGMENT NOT COMPLETE,
- RAR OUTPUT A POINT
- OUT DISCHAN*32+DISDATA
- DCR C CHECK FOR VECTOR END
- JNZ W.SEG2 NOT COMPLETE, CONT. WRITE
- W.ENDCK EQU $
- DCR C SET C REGISTER TO FF COUNT
- DCR B
- JP W.SEG2
- POP PSW
- JMP LASTPT VECTOR DONE,OUTPUT LAST PT
- *
- ERASEG EQU $
- POP PSW POP OFF WSEGLEN
- LDA VECFLAG OUTPUT TO DISPLAY
- ORI #40 WITH INHIBIT BIT SET
- OUT DISCHAN*32+DISCON1
- LDA ESEGLEN ERASE SEGMENT LENGTH COUNT
- PUSH PSW STORE UNTO STACK
- MOV A,C CHECK FOR VECTOR END
- CPI 0
- JZ E.ENDCK
- E.SEG EQU $
- POP PSW LOOP ON ERASING A SEGMENT
- DCR A
- PUSH PSW
- JZ W.SEG1 ERASE SEGMENT LENGTH DONE
- DAD D SEGMENT NOT COMPLETE
- RAR OUTPUT A POINT
- OUT DISCHAN*32+DISDATA
- DCR C CHECK FOR VECTOR END
- JNZ E.SEG NOT COMPLETE, CONT. WRITE
- E.ENDCK EQU $
- DCR C SET C REGISTER TO FF COUNT
- DCR B
- JP E.SEG
- POP PSW
- *
- * PLACE X AND Y END COORDINATES INTO X AND Y REGS.
- * WHICH BECOME THE BEGINNING PT. OF NEXT VECTOR
- *
- LASTPT EQU $ VECTOR COMPLETE, LAST PT.
- LHLD YEND
- XCHG
- LHLD XEND
- *
- CALL R.DOT DISPLAY LAST POINT
- LDA VECFLAG TURN OFF INHIBIT BIT
- XRI #40
- STA VECFLAG
- RET
- VECTAB EQU $
- DB #3,#3 DOTTED VECTOR COUNTS
- DB #8,#3 SHORT DASHED VECTOR COUNTS
- DB #10,#4 LONG DASHED VECTOR COUNTS
- *
- ********************
- *
- * SUBROUTINE GRAPH
- *
- * THIS SUBROUTINE IS CALLED UPON WHEN IN GRAPH MODE.
- * X AND Y COORDS. ARE SET UP IN HERE PRIOR TO
- * CALLING LINE1 OR OUTCOORD. IF IN DARK MODE,
- * OUTCOORD IS CALLED UPON TO DO BASE POSITION.
- * OTHERWISE, LINE1 IS CALLED TO DISPLAY A VECTOR.
- * FOUR INPUTS ARE NOT NECESSARY TO DRAW A VECTOR.
- * THE USER MAY CHANGE FROM 1 TO 4 BYTES OF THE
- * COORDINATES. IF A HIGH BYTE IS RECEIVED FIRST
- * IN A GIVEN SEQUENCE, IT MUST BE A HIGH Y BYTE.A HI
- * RECEIVED OTHER THAN FIRST IN SEQUENCE IS A HIGH
- * X BYTE. LOY AND LOX ARE DISTINGUISHABLE EACH
- * FROM THE OTHER. INPUT OF A LOW X BYTE TRIGGERS
- * BASE POSITION OR DRAWS A VECTOR.
- ********************
- GRAPH EQU $
- CALL ESCCTL CHECK ESC SEQ./CTL CODES
- CALL GETXY
- *
- LDA DARK
- ANA A IF DARK VECTOR,
- JZ ALINE BASE POSITION
- PUSH D SAVE Y COORDINATE
- CALL R.OUTX AND OUTPUT X COORDINATE
- POP H RELOAD Y COORDINATE
- CALL R.OUTY AND OUTPUT
- XRA A TURN DARK VECTOR OFF
- STA DARK
- STA BYPASS CLEAR BYPASS CONDITION
- RET
- ALINE EQU $
- LDA DASH LOAD FLAG FOR DASHED/SOLID
- RAR
- JC G.LINE1 IF SET, USE DASHED VECTOR
- CALL R.LINE OTHERWISE, USE R.LINE
- RET
- * RETURN TO CALLER
- *************************
- *
- * SUBROUTINE ALPHMODE
- *
- * TESTS DATA FOR CTL CODE, ESCAPE, AND DISPLAY CODE
- *
- *************************
- *
- CHARGEN EQU $
- PUSH B SAVE CHARACTER CODE ON STK
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- POP B RESTORE CHAR. CODE TO C
- LHLD CHBASE
- CALL JMPHL
- CALL LINENDCK
- RET
- *
- CHGEN.S1 EQU $
- MOV L,C CHARACTER CODE IN HL
- MVI H,00
- MOV D,H CHARACTER CODE-20H IN DE
- MOV E,L
- DAD H 'MULTIPLY' CODE BY 8.
- DAD H
- DAD H
- XCHG STORE IN DE
- DAD H 'MULTIPLY' CODE BY 4
- DAD H
- DAD D INDEX=4(CODE)+8(CODE).
- JMP OUTCHAR
- *
- CHGEN.S2 EQU $
- MVI A,#A1 TEST CHARACTER
- ADD C CODE FOR RUBOUT /CURSOR
- JC OUTCH.2
- MVI H,00
- MOV L,C
- DAD H
- DAD H
- DAD H
- DAD H INDEX=16(CODE)
- *
- OUTCHAR EQU $
- XCHG
- LHLD G.MEMSEL ADD INDEX TO BASE ADDRESS
- DAD D OF CHARACTER CODES.
- *
- OUTCH.0 EQU $
- XCHG SAVE CHARACTER ADDR. IN DE
- LDA D.CNTL2 LOAD CTL 2 FOR CHAR.
- OUT DISCHAN*32+DISCON2 AND OUT ORIENT./WE
- LHLD XREG LOAD CURRENT X/Y
- SHLD XSAVE FOR CHARACTER PLOT
- LHLD YREG
- SHLD YSAVE
- LDA WIDTH
- MOV B,A LOAD B WITH CHAR. WIDTH
- *
- OUTCH.1 EQU $
- CALL CHGEN.2 OUTPUT 1ST COLUMN OF CODES
- LHLD XREG INCREMENT X COORDINATE
- INX H AND OUTPUT.
- CALL R.OUTX
- LHLD YSAVE
- CALL R.OUTY AND OUTPUT.
- DCR B DECREMENT CHARACTER WIDTH
- JNZ OUTCH.1
- RET
- *
- *
- OUTCH.2 EQU $
- LXI H,M0CODE5F LOAD ADDRESS OF RUBOUT
- ORA A TEST FOR RUB-OUT
- JZ OUTCH.0 RUBOUT, DISPLAY IT
- LXI H,M0CODE60 LOAD ADDRESS OF CURSOR
- DCR A TEST FOR RUB-OUT OR XHAIR
- ORA A
- JZ OUTCH.0 CURSOR, DISPLAY IT
- LXI H,M0CODE61 ELSE, ADDR. OF XHAIR
- JMP OUTCH.0 AND DISPLAY IT
- *
- DISCURS EQU $
- LDA MODE
- CPI 08
- JZ DISCURS1 GIN MODE, ALWAYS DISPLAY
- LDA G.SUPCUR IF SUPPRESS SET, RET
- ORA A
- RNZ
- DISCURS1 EQU $
- LDA D.CNTL2 SAVE DISPLAY CONTROL WORD
- STA D.CNTL2D
- MOV A,B
- STA D.CNTL2
- LDA MODE TEST FOR GIN MODE
- CPI 08
- JNZ DISCURS2
- CALL XHAIR
- JMP DISCURS3
- DISCURS2 EQU $
- MVI C,#60 DISPLAY CURSOR
- DISCURSX EQU $
- LHLD CHBASE
- CALL JMPHL
- CALL R.INPX
- LDA WIDTH
- CMA
- INR A
- MOV E,A
- MVI D,#FF
- DAD D
- CALL R.OUTX
- DISCURS3 EQU $
- LDA D.CNTL2D
- STA D.CNTL2
- RET
- *
- CHGEN.2 EQU $
- LDAX D
- INX D
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- LDAX D
- INX D
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- MOV C,A IF SIZE 1 RETURN
- LDA G.SIZE
- ORA A
- RZ
- MOV A,C
- RAR
- OUT DISCHAN*32+DISDATA
- RAR
- OUT DISCHAN*32+DISDATA
- RET
- *
- *
- ESCCTL EQU $
- LDA G.ESC IS ESCAPE FLAG, G.ESC, SET&
- ANA A
- JZ VALCK NO, CHECK FOR CTL CODE
- XRA A
- STA G.ESC YES, CLEAR ESCAPE FG.
- LHLD ESCADR
- CALL SEARCH
- JMP POPRET
- *
- VALCK EQU $
- MOV A,C IS CURRENT CODE A CTL'/
- CPI #20
- RNC NO, RETURN TO MODE
- CALL ACONTROL
- *
- POPRET EQU $
- POP H POP OFF ADDR. FROM STK
- RET AND RETURN TO IDLE.
- *
- ALPHMODE EQU $
- CALL ESCCTL CHECK FOR ESC SEQ./CTL COD
- CPI #7F
- RZ RETURN IF RUBOUT DEL CHAR
- SUI #20
- MOV C,A CHARACTER CODE IN C.
- CALL SCROLLCL CLEAR SCROLL FGS
- CALL CHARGEN INDEX INTO CHARACTER CODE
- RET VIA CHARGEN.
- *
- ACONTROL EQU $
- LHLD CTLADR BEGIN SEARCH FOR MATCH
- SEARCH MOV A,M IF CODE IN JUMP TABLE FF
- CPI #FF END OF TABLE REACHED
- JNZ SEARCH.1
- CALL SCROLLCL CLEAR SCROLL FGS.
- RET
- SEARCH.1 EQU $
- CMP C ELSE, COMPARE HEX ENTRY W/
- JZ MATCH CONTROL CODE FOR MATCH
- INX H NO MATCH,GET NEXT ENTRY
- INX H AND CONTINUE SEARCHING.
- INX H
- JMP SEARCH
- MATCH EQU $
- CPI #0D TEST FOR 'C'R
- JNZ MATCH.1 NOT A 'C'R
- STA CRLFFG 'C'R, SO SET CRLF FLAG
- JMP MATCH.2
- MATCH.1 EQU $
- CPI #0A TEST IF 'L'F
- JZ MATCH.2
- CALL SCROLLCL
- MATCH.2 EQU $
- INX H MATCH FOUND. GET ADDR. CTL
- MOV E,M CODE ROUTINE AND DO IT.
- INX H
- MOV D,M
- XCHG
- LXI D,HOR HOR FLAG FOR PLATO CHAR.
- CALL JMPHL
- RET
- *
- *
- * ESCAPE SEQUENCES
- *
- * THE FOLLOWING IS A LIST OF ESCAPE SEQUENCES WHICH
- * WHEN ENTERED FROM KEYBOARD OR RECEIVED FROM HOST,
- * ILLICIT THE ACTIVITIES DESCRIBED AFTER EACH SEQ.
- *
- * CODE SEQUENCE DESCRIPTION
- *
- * 1B 07 ESC BEL- CLEAR BYPASS,RING
- * BELL
- * 1B 08 ESC BS- BACK SPACE
- * 1B 0D ESC CR- SET ESCAPE FLAG
- * 1B 02 ESC STX SELECTS PLATO OP.
- * 1B 18 ESC CAN- SELECTS BYPASS
- * *VECTOR ESCAPE SEQUENCES*
- * 1B 60 ESC REVERSE SLASH SEQUENCE
- * SETS NORMAL VECTORS
- * 1B 61 ESC SMALL A SEQUENCE
- * SETS DOTTED VECTORS
- * 1B 63 ESC SMALL C SEQUENCE
- * SETS SHORT DASHED VECT.
- * 1B 64 ESC SMALL D SEQUENCE
- * SETS LONG DASHED VECTOR
- * 1B 11 ESC DC1 SEQUENCE SELECTS
- * INVERSE VIDEO
- * 1B 12 ESC DC2 SEQUENCE SELECTS
- * OVERSTRIKE WRITE.
- * 1B 13 ESC DC3 SEQUENCE SELECTS
- * OVERSTRIKE ERASE.
- * 1B 14 ESC DC4 SEQUENCE SELECTS
- * CLEAR WRITE
- * 1B 05 ESC ENQ SEQUENCE-
- * SELECTS BYPASS, SENDS
- * TERMINAL STATUS AND 4
- * BYTES OF CURRENT X/Y
- * 1B 0C ESC FF SEQUENCE-
- * ERASES SCREEN, SELECTS
- * ALPHA,HOMES,CLEARS BYP.
- * 1B 1D ESC GS- SET GRAPH MODE,
- * DARK VECTOR
- * 1B 09 ESC HTAB- HORIZONTAL TAB
- * AUTO CRLF IF NEEDED
- * 1B 0A ESC LF- SET ESCAPE FLAG
- * 1B 3B ESC ; SEQUENCE -SIZE1
- * 1B 3A ESC '; SEQUENCE -SIZE1
- * 1B 39 ESC 9 SEQUENCE -SIZE1
- * 1B 38 ESC 8 SEQUENCE -SIZE1
- * 6 X 14
- * SETS APPROPRIATE LINEND
- * PAGEND,HEIGHT, WIDTH
- * 1B 37 ESC 7 SEQUENCE -SIZE2
- * 8 X 16
- * SETS APPROPRIATE LINEND
- * PAGEND,HEIGHT, WIDTH
- * 1B 1A ESC SUB SEQUENCE -SELECTS
- * GIN MODE,BYPASS,CROSS
- * HAIR CURSOR
- * 1B 1F ESC US- RESETS TO ALPHA
- * FROM ALL MODES BUT
- * GIN,CLEAR BYPASS
- * 1B 0B ESC VT- VERTICAL TAB
- ********************
- ********************
- * ESCAPE SEQUENCE LIST
- *********************
- *
- ESCADR.A EQU $
- DB #07
- DW BEL
- DB #08
- DW BS
- DB #0D
- DW ESC
- DB #02
- DW PLATO
- DB #18
- DW CAN
- DB #60
- DW VECTNORM
- DB #61
- DW VECTDOT
- DB #63
- DW VECTSDSH
- DB #64
- DW VECTLDSH
- DB #11
- DW DC1
- DB #12
- DW DC2
- DB #13
- DW DC3
- DB #14
- DW DC4
- DB #05
- DW ENQ
- DB #0C
- DW AFF
- DB #1D
- DW GS
- DB #09
- DW HTAB
- DB #0A
- DW ESC
- DB #3B
- DW SIZE1
- DB #3A
- DW SIZE1
- DB #39
- DW SIZE1
- DB #38
- DW SIZE1
- DB #37
- DW SIZE2
- DB #1A
- DW ASUB
- DB #1F
- DW US
- DB #0B
- DW VT
- DB #1B
- DW ESC
- DB #00
- DW ESC
- DB #FF
- ********************
- * CONTROL CODE SUBROUTINE
- *
- * THIS SUBROUTINE EXECUTES CONTROL CODE FUNCTIONS
- * (I.E.'C'R,'B'S,ETC.) IT WILL BE ENTERED FROM THE KB
- * AFTER THE CONTROL KEY IS RECEIVED OR FROM THE HOST
- * WHEN A CTL CODE IS RECEIVED. HEX VALUE RANGE 00-1F
- *
- * CODE DESCRIPTION
- *
- * 07 BEL-CLEARS BYPASS
- * 08 BS-BACK SPACE
- * 0D CR-CARRIAGE RETURN
- * RESET FROM GRAPH
- * TO ALPHA MODE,
- * CLEAR BYPASS
- * 1B ESC-SET G.ESC, ESCAPE FLAG
- * 1C FS-CTL FS SELECT
- * POINT PLOT MODE
- * 1D GS-SETS GRAPH MODE,
- * DARK VECTOR
- * 09 HTAB-HORIZONTAL TAB
- * AUTO. CR/LF IF NEEDED
- * 0A LF-LINE FEED; WRAP TO
- * DISPLAY TOP IF NEEDED,
- * CLEAR BYPASS
- * 19 EM-SELECT BLOCK W/E MODE
- * 1F US-RESETS TERM GRAPH TO
- * ALPHA; CLEARS BYPASS
- * 0B VT-VERTICAL TAB
- *
- **********************
- **********************
- * CONTROL CODE JUMP TABLE
- *
- ********************
- *
- CTLADR.A EQU $
- DB #07
- DW BEL
- DB #08
- DW BS
- DB #0D
- DW CR
- DB #1B
- DW ESC
- DB #1C
- DW FS
- DB #1D
- DW GS
- DB #09
- DW HTAB
- DB #0A
- DW LF
- DB #19
- DW EM
- DB #1F
- DW US
- DB #0B
- DW VT
- DB #FF
- *
- *
- BEL EQU $
- IN TPCHAN*32+TOUCHD SOUND ALERT
- MVI A,00
- STA BYPASS CLEAR BYPASS
- RET
- *
- BS EQU $
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- XRA A CLEAR BYPASS
- STA BYPASS
- BS.1 EQU $
- CALL R.INPX
- LDA WIDTH
- CMA MOVE X BACK A CHAR. WIDTH
- INR A
- MOV E,A
- MVI D,#FF
- DAD D
- MOV A,H
- ANI #80
- JNZ BS.SCK X COORD. NEGATIVE
- * GO CHECK CHAR. SIZE
- BS.END EQU $ X COORD. DID NOT BACK OFF
- CALL R.OUTX SET CURRENT X COORD.
- RET
- *
- BS.SCK EQU $
- LDA G.SIZE
- ORA A
- JNZ BS.VT X COORD NEG AND SIZE 2
- * CHECK IF FFF8
- DCX H SUBTRACT 2 FROM X AS SIZE
- DCX H 1 USES ONLY 510 DOTS.
- *
- BS.VT EQU $
- MOV A,L LOWER 8 BITS OF X MUST
- CPI #F8 BE F8 IF SIZE 2,X NEG
- JNZ BS.END BEFORE 'V'T IS REQUIRED.
- CALL R.OUTX
- CALL VT.1
- RET
- *
- CAN EQU $
- LXI H,BYPASS SELECTS BYPASS
- MVI M,1
- RET
- *
- CR EQU $
- LDA ECURSOR
- MOV B,A
- CALL DISCURS
- XRA A
- STA BYPASS CLEARS BYPASS.
- LDA MODE
- CPI 08
- JNZ CR.A
- LDA GIN.KEY GIN MODE, SEND LAST CHAR.
- MOV C,A AND RETURN TO GIN XMIT
- CALL GIN.XMT
- CALL CR.1 DO CARRIAGE RETURN
- RET
- CR.A EQU $
- CALL CR.1 DO CARRIAGE RETURN
- MVI A,03
- STA MODE SET ALPHA MODE.
- LHLD STRAP TEST FOR AUTO. CR/LF
- MOV A,L
- ANI #08
- RZ RETURN IF NOT SET
- LDA KBDATA
- ORA A
- RZ
- STA CRLFFG SET SCROLL FLAG
- CALL LF.1A OTHERWISE, 'L'F
- CALL SCROLLCK
- CALL SCROLLCL CLEAR SCROLL FLAG
- RET
- *
- CR.1 EQU $
- LXI H,00 SET TO LEFT MARGIN.
- CALL R.OUTX
- RET
- *
- *
- DC1 EQU $
- MVI L,00 SELECT INVERSE VIDEO
- CALL R.MODE
- MVI A,6 CURSOR NEEDS OPPOS. W/E
- STA ECURSOR BITS OF ALL OTHER WRITE
- MVI A,4 MODES.
- STA WCURSOR
- RET
- *
- DC2 EQU $
- MVI L,6 SELECT OVERSTRIKE WRITE
- CALL R.MODE
- DC2.1 EQU $
- MVI A,4 RESET W/E MODES SO CURSOR
- STA ECURSOR OVERSTRIKE WRITE AND
- MVI A,6 OVERSTRIKE ERASE
- STA WCURSOR
- RET
- *
- DC3 EQU $
- MVI L,4 SELECT OVERSTRIKE ERASE
- CALL R.MODE
- CALL DC2.1 SELECT W/E CURSOR WORDS
- RET
- *
- DC4 EQU $
- MVI L,02
- CALL R.MODE SELECT CLEAR WRITE
- CALL DC2.1 SELECT W/E CURSOR WORDS
- RET
- *
- ENQ EQU $
- LDA MODE
- CPI #08
- JZ ENQ.1 IF GIN, DON'7T SEND TSTAT
- LDA TSTAT LOAD TERMINAL STATUS
- MOV C,A
- CALL XMIT.1
- ENQ.1 EQU $
- CALL R.INPX
- CALL HILO SEND X IN 2 BYTES
- LHLD BIAS
- CALL COMPHL
- PUSH H SAVE -BIAS ON STACK
- CALL R.INPY
- POP D
- DAD D HL _ Y - BIAS
- CALL HILO SEND Y IN 2 BYTES
- LDA MODE IF GIN, DO AUTOMATIC
- CPI #08 TRANSMISSION CHECKS
- JNZ ENQ.2
- LHLD STRAP TEST 'G'I'N TRANSMISSION
- MOV A,L
- ANI 06
- CPI 04
- MOV L,A
- JZ ENQ.2 SEND NOTHING AUTO.
- PUSH H SAVE STRAP
- MVI C,#0D SEND CR
- CALL XMIT.1
- POP H RESTORE STRAP
- MOV A,L
- CPI 02
- JZ ENQ.2 SEND 'C'R ONLY.
- MVI C,#04 SEND EOT
- CALL XMIT.1
- *
- ENQ.2 EQU $
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- MVI A,03 SELECT ALPHA MODE
- STA MODE
- STA BYPASS SET BYPASS
- MVI H,04 LOAD INTERRUPT
- LDA M.ENAB
- ANI #D8
- MOV L,A DISABLE TOUCH PANEL
- CALL R.SSF MASK AND OUTPUT.
- RET
- *
- *
- HILO EQU $
- LDA SCALEFG TEST SCALE FLAG
- ORA A
- JNZ HILO.1 NOT SCALING, SEND AS IS
- DAD H OTHERWISE, MULT. BY 2
- HILO.1 EQU $
- MVI A,#1F
- ANA L MASK LOWER FIVE BITS
- PUSH A
- DAD H SHIFT UPPER
- DAD H FIVE BITS INTO
- DAD H H REGISTER.
- MOV A,H
- ANI #1F MASK FOR FIVE BITS
- ORI #20
- MOV C,A
- CALL XMIT.1 TRANSMIT UPPER 5 BITS
- POP A
- ORI #20
- MOV C,A
- CALL XMIT.1
- RET
- *
- ESC EQU $
- LXI H,G.ESC
- MVI M,01
- RET
- *
- AFF EQU $ PAGE GETS YOU HERE
- LDA M.MODE
- RLC
- ORI 01
- MOV L,A
- CALL R.MODE
- *
- AFF.1 EQU $ RESET KEY GETS YOU HERE
- MVI A,03 SELECT ALPHA MODE
- STA MODE SELECTS ALPHA.
- XRA A
- STA BYPASS CLEARS BYPASS.
- LXI H,00
- CALL R.OUTX
- MVI H,#FF
- LDA HEIGHT
- CMA
- INR A A HAS -(HEIGHT)
- MOV L,A
- LXI D,#200
- DAD D
- CALL R.OUTY
- RET
- *
- FS EQU $
- LDA MODE
- CPI 03
- JNZ FS.1
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- FS.1 EQU $
- LDA MODE
- ANI #80
- JZ FS.2
- ORI #40 SET PLATO DATA MODE
- FS.2 EQU $
- STA MODE SELECT POINT PLOT MODE
- XRA A CLEAR NUMBER INPUTS
- STA NINPUT TO GET COORDINATE
- RET
- *
- GS EQU $
- LDA MODE
- CPI 03
- JNZ GS.1
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- *
- *
- GS.1 EQU $
- LDA MODE
- ANI #80
- JZ GS.2
- ORI #40 SELECT PLATO DATA MODE
- GS.2 EQU $
- ORI #01 SELECT GRAPH MODE
- STA MODE
- STA DARK SETS DARK VECTOR.
- XRA A CLEAR NUMBER OF INPUTS TO
- STA NINPUT GET COORDINATE ROUTINE
- LDA TSTAT UPDATE TERMINAL STATUS
- ANI #B1
- STA TSTAT
- RET
- *
- HTAB EQU $
- LDA D.CNTL2
- STA D.CNTL2P SAVE DISPLAY CONTROL WORD
- LDA ECURSOR
- MOV B,A
- STA D.CNTL2
- MVI C,#60 ERASE CURSOR
- LHLD CHBASE
- CALL JMPHL
- CALL LINENDCK
- LDA D.CNTL2P RESTORE DISPLAY CONTROL
- STA D.CNTL2
- XRA A CLEAR BYPASS
- STA BYPASS
- RET
- *
- LF EQU $
- LDA ECURSOR
- MOV B,A
- CALL DISCURS
- LXI H,BYPASS CLEAR BYPASS.
- MVI M,00
- CALL LF.1A DO A LINE FEED.
- LDA KBDATA
- ORA A
- JZ LFSCROL
- LHLD STRAP TEST FOR AUTO. LF/CR
- MOV A,L
- ANI #10
- CNZ CR.1 AUTO. SO DO 'C'R
- LFSCROL EQU *
- CALL SCROLLCK
- CALL SCROLLCL
- RET
- LF.1A EQU $
- CALL R.INPY GET CURRENT Y
- XCHG STORE Y IN DE.
- LHLD PAGEND CHECK FOR PAGEND
- MOV A,D
- ORA A
- JNZ CHANGEY NOT PG BOTTOM,
- MOV A,E CHANGE Y ONLY.
- CMP L
- JC LF.2 PAGE BOTTOM REACHED,
- *
- CHANGEY EQU $
- XCHG JUST CHANGE Y COORD
- JMP LF.3
- RET
- *
- LF.2 EQU $
- LXI H,#200 SET Y TO PAGE TOP- HEIGHT
- *
- LF.3 EQU $
- LDA HEIGHT
- CMA
- INR A A HAS -(HEIGHT).
- MOV E,A
- MVI D,#FF
- DAD D
- CALL R.OUTY
- RET
- *
- LINENDCK EQU $
- CALL R.INPX
- XCHG CURRENT X IN DE
- LDA G.SIZE CHECK CHARACTER SIZE
- ORA A
- JZ LEND.S1
- MOV A,E SIZE 2 SO CHECK X COORD.
- ORA D IF ZERO, IT HAS WRAPPED
- JZ PGCHK SO DO CR LF.
- RET
- *
- *
- LEND.S1 EQU $ SIZE 1, X AT LINEND
- LHLD LINEND DE HAS CURRENT X
- MOV A,D
- CMP H
- RC
- JNZ PGCHK IF LINEND DO 'C'R/'L'F
- MOV A,E RETURN, LINE FEED.
- CMP L OTHERWISE SIMPLY RETURN.
- RC
- RZ
- LXI H,00
- CALL R.OUTX
- PGCHK EQU $
- CALL CR.1
- CALL LF.1A
- LDA G.SUPCUR TEST IF CURSOR ON
- ORA A
- CZ SCROLL ON, SO SCROLL
- CALL SCROLLCL
- RET
- *
- EM EQU $
- LDA MODE
- CPI 03
- JNZ EM.1
- LDA ECURSOR ERASE CURSOR
- MOV B,A
- CALL DISCURS
- EM.1 EQU $
- LDA MODE
- ANI #80
- JZ EM.2
- ORI #40 SELECT PLATO DATA MODE
- EM.2 EQU $
- ORI #04 SELECT BLOCK MODE
- STA MODE
- XRA A CLEAR TWICE FLAG
- STA BTWICE
- STA NINPUT CLEAR NINPUT TO GET COORDS
- RET
- *
- PLATO EQU $
- CALL BULKER ERASE SCREEN
- PLATO0 EQU *
- MVI A,0
- STA M.JOBS
- MVI A,12
- STA M.TYPE
- MVI A,03
- STA M.SBTYPE
- MVI A,#83 SELECT PLATO COMMAND MODE3
- STA MODE
- LXI H,ISTASC SELECT IST ASCII KEYBOARD
- SHLD KBAADR
- LXI H,SELECT.P SELECT PLATO DATAMODE TBL
- SHLD SELECT.M
- LXI H,CTLADR.P SELECT PLATO CTL CODE TBL
- SHLD CTLADR
- LXI H,ESCADR.P SELECT PLATO ESC SEQ TBL
- SHLD ESCADR
- LXI H,#0000 NO GRAPH MODE SCREEN BIAS
- SHLD BIAS
- MVI A,01 DO NOT SCALE
- STA SCALEFG
- LXI D,00
- LXI H,184
- CALL OUTCOORD
- MVI L,#1A
- CALL R.MODE
- MVI L,00
- CALL R.CCR
- LXI H,MSG
- CALL R.CHARS
- MVI A,#01
- STA EREG
- MVI A,#14
- STA E.CNTR
- MVI A,01
- OUT KEYCHAN*32+KYBDCON
- XRI #09
- CALL ENAB
- *
- LDA PMC.FLG TEST FOR PLATO
- ORA A MODE MASTER CLEAR.
- JNZ PI.3 JUMP IF M.C.
- MVI C,#06
- PI.1 CALL XMIT.1
- JC PI.1
- MVI C,#20
- PI.2 CALL XMIT.1
- JC PI.2
- LXI H,#0382 SEND MASTER CLEAR
- CALL P.XMIT STATUS TO PLATO.
- RET
- PI.3 XRA A
- STA PMC.FLG CLEAR MC FLAG
- MVI C,#95
- PI.4 CALL XMIT.1 SEND NAK
- JC PI.4 NOT SENT, TRY AGAIN
- LDA MREG
- ADI #20 ADJUST FOR ASCII
- MOV C,A
- PI.5 CALL XMIT.1 SEND M
- JC PI.5 NOT SENT.
- LXI H,#0382 SEND MASTER CLEAR
- CALL P.XMIT STATUS TO PLATO.
- RET
- MSG DB #50,#4C,#41,#54
- DB #4F,#1B,#30
- *
- SCROLLCK EQU $
- LDA G.SUPCUR TEST SUPPRESS CURSOR
- ORA A
- RNZ
- LDA CRLFFG TEST CR/LF SEQUENCE
- ORA A
- CNZ SCROLL
- *
- SCROLLCL EQU $
- XRA A CLEAR SCROLL FLAGS
- STA CRLFFG
- RET
- *
- SCROLL EQU *
- LXI H,0000 SET UP X1,Y1,X2,Y2
- SHLD X1 FOR ERASING A LINE
- LHLD LINEND
- SHLD X2
- CALL R.INPY
- SHLD Y2
- XCHG
- LHLD HEIGHT
- DCX H
- DAD D
- SHLD Y1
- LDA D.CNTL2
- STA D.CNTL2P
- LDA M.MODE
- STA M.MODEP
- MVI L,00 SET ERASE BITS
- CALL R.MODE
- LXI H,X1
- CALL R.BLOCK
- LDA D.CNTL2P
- STA D.CNTL2
- LDA M.MODEP
- STA M.MODE
- LDA G.SIZE
- ORA A
- RNZ RET IF SIZE 2
- CALL R.INPY GET Y COORD.
- INX H ADD 2 AND OUT
- INX H NEW Y.
- CALL R.OUTY
- RET
- *
- *
- SIZE1 EQU $
- LXI H,S1CODE00 SELECT SIZE 1
- SHLD G.MEMSEL
- LXI H,CHGEN.S1
- SHLD CHBASE
- LXI H,LINEND 85 CHARACTERS PER LINE
- MVI M,#FD
- INX H
- MVI M,1 36 LINES PER PAGE
- LXI H,PAGEND SET LINEND,PAGEND,HEIGHT
- MVI M,#16 ACCORDINGLY.
- LXI H,HEIGHT
- MVI M,#0E
- LXI H,WIDTH
- MVI M,06
- XRA A SIZE SET TO ZERO
- STA G.SIZE INDICATES SIZE1.
- RET
- *
- SIZE2 EQU $
- LHLD M0ADR LOAD IST CHAR. SET ADDRESS
- SHLD G.MEMSEL
- LXI H,CHGEN.S2
- SHLD CHBASE
- LXI H,LINEND 64 CHARACTERS PER LINE
- MVI M,#FF
- INX H
- MVI M,1 32 LINES PER PAGE
- LXI H,PAGEND SET LINEND, PAGEND, HEIGHT
- MVI M,0 ACCORDINGLY.
- LXI H,HEIGHT
- MVI M,#10
- LXI H,WIDTH
- MVI M,08
- MVI A,1 BIT 1 SET IN SIZE
- STA G.SIZE INDICATES SIZE2.
- RET
- *
- ASUB EQU $
- MVI H,04 LOAD INTERRUPT
- LDA M.ENAB
- ORI #20 ENABLE
- MOV L,A TOUCH PANEL
- CALL R.SSF
- LDA MODE
- CPI 03
- JNZ ASUB.1
- LDA ECURSOR
- MOV B,A
- CALL DISCURS
- ASUB.1 EQU $
- MVI A,08 SELECT GIN MODE
- STA MODE
- STA BYPASS SET BYPASS CONDITION
- RET
- *
- US EQU $
- MVI A,0
- STA BYPASS CLEAR BYPASS.
- MVI A,#BD
- STA TSTAT
- LDA MODE
- CPI #08
- RZ
- ANI #80
- JZ US.1
- ORI #40 SELECT PLATO DATA MODE
- US.1 EQU $
- ORI #03 SELECT ALPHA MODE
- STA MODE
- RET
- *
- VECTNORM EQU $
- LXI H,DASH
- MVI M,00
- RET
- *
- *
- VECTDOT EQU $
- LXI H,DASH
- MVI M,1
- LXI H,VECTAB
- MOV A,M
- STA WSEGLEN
- INX H
- MOV A,M
- STA ESEGLEN
- RET
- *
- VECTSDSH EQU $
- LXI H,DASH
- MVI M,1
- LXI H,VECTAB+2
- MOV A,M
- STA WSEGLEN
- INX H
- MOV A,M
- STA ESEGLEN
- RET
- *
- VECTLDSH EQU $
- LXI H,DASH
- MVI M,1
- LXI H,VECTAB+4
- MOV A,M
- STA WSEGLEN
- INX H
- MOV A,M
- STA ESEGLEN
- RET
- *
- VT EQU $
- LDA ECURSOR
- MOV B,A
- CALL DISCURS OVERSTRIKE ERASE CURSOR
- XRA A CLEAR BYPASS
- STA BYPASS
- VT.1 EQU $
- CALL R.INPY
- LDA HEIGHT
- MOV E,A
- MVI D,0
- DAD D
- LDA G.SIZE IF SIZE 2, WRAPS AUTO.
- ORA A
- JNZ VT.2
- MOV A,H SIZE 1, CHECK FOR PAGE TOP
- CPI 2 IF Y DOES NOT EXCEED 512
- JC VT.2 DO A SIMPLE 'V'T
- LHLD PAGEND OTHERWISE,WRAP TO PG END
- LDA HEIGHT PAGEND MINUS HEIGHT
- CMA
- INR A
- MOV E,A
- MVI D,#FF
- DAD D
- *
- VT.2 EQU $
- CALL R.OUTY
- LDA WCURSOR
- MOV B,A
- CALL DISCURS
- RET
- *
- * COMPLIMENT HL REGISTERS FOR 2'7S COMP. ARITH.
- *
- COMPHL EQU $
- MOV A,L
- CMA
- MOV L,A
- MOV A,H
- CMA
- MOV H,A
- INX H
- RET
- *
- CALDEL EQU $
- MOV A,E TEST STARTING
- ORA D POINT FOR ZERO.
- RZ RETURN IF ZERO
- *
- XCHG SUBTRACT
- CALL COMPHL STARTING POINT
- DAD D FROM END POINT.
- RC RETURN IF END GREATER
- *
- CALL COMPHL SET DELTA POSITIVE
- MOV A,C LOAD PLOTTING
- ORA B BIT FOR NEGATIVE
- MOV C,A DIRECTION.
- RET EXIT
- *
- ********************
- *
- * SIZE 1 CHARACTER CODE SET
- *
- ********************
- S1CODE00 DB #00,#00,#00,#00
- DB #00,#00,#00,#00
- DB #00,#00,#00,#00
- EXCLAMATION MARK
- S1CODE01 DB #00,#00,#00,#00
- DB #20,#3F,#00,#00
- DB #00,#00,#00,#00
- DOUBLE QUOTATION MARK
- S1CODE02 DB #00,#00,#00,#38
- DB #00,#00,#00,#38
- DB #00,#00,#00,#00
- NUMBER SIGN
- S1CODE03 DB #00,#0A,#80,#3F
- DB #00,#0A,#80,#3F
- DB #00,#0A,#00,#00
- DOLLAR SIGN
- S1CODE04 DB #80,#0C,#40,#12
- DB #E0,#3F,#40,#12
- DB #80,#09,#00,#00
- PERCENT SIGN
- S1CODE05 DB #40,#0C,#80,#0C
- DB #00,#01,#60,#02
- DB #60,#04,#00,#00
- AMPER SIGN
- S1CODE06 DB #C0,#01,#20,#1A
- DB #20,#26,#C0,#19
- DB #20,#02,#00,#00
- SINGLE QUOTATION
- S1CODE07 DB #00,#00,#00,#00
- DB #00,#38,#00,#00
- DB #00,#00,#00,#00
- LEFT PARENTHESIS (
- S1CODE08 DB #00,#00,#00,#00
- DB #C0,#0F,#20,#10
- DB #10,#20,#00,#00
- RIGHT PARENTHESIS )
- S1CODE09 DB #10,#20,#20,#10
- DB #C0,#0F,#00,#00
- DB #00,#00,#00,#00
- ASTERISK
- S1CODE0A DB #80,#04,#00,#03
- DB #C0,#0C,#00,#03
- DB #80,#04,#00,#00
- PLUS
- S1CODE0B DB #00,#01,#00,#01
- DB #C0,#07,#00,#01
- DB #00,#01,#00,#00
- COMMA
- S1CODE0C DB #00,#00,#68,#00
- DB #70,#00,#00,#00
- DB #00,#00,#00,#00
- MINUS
- S1CODE0D DB #00,#01,#00,#01
- DB #00,#01,#00,#01
- DB #00,#01,#00,#00
- PERIOD
- S1CODE0E DB #00,#00,#60,#00
- DB #60,#00,#00,#00
- DB #00,#00,#00,#00
- SLASH
- S1CODE0F DB #20,#00,#40,#00
- DB #80,#00,#00,#01
- DB #00,#02,#00,#00
- NUMERAL ZERO
- S1CODE10 DB #C0,#0F,#A0,#10
- DB #20,#11,#20,#12
- DB #C0,#0F,#00,#00
- NUMERAL ONE
- S1CODE11 DB #00,#00,#20,#08
- DB #E0,#1F,#20,#00
- DB #00,#00,#00,#00
- NUMERAL TWO
- S1CODE12 DB #60,#08,#A0,#10
- DB #20,#11,#20,#12
- DB #20,#0C,#00,#00
- NUMERAL THREE
- S1CODE13 DB #40,#08,#20,#10
- DB #20,#12,#20,#12
- DB #C0,#0D,#00,#00
- NUMERAL FOUR
- S1CODE14 DB #00,#01,#00,#03
- DB #00,#05,#00,#09
- DB #E0,#1F,#00,#00
- NUMERAL FIVE
- S1CODE15 DB #20,#1E,#20,#12
- DB #20,#12,#20,#12
- DB #C0,#11,#00,#00
- NUMERAL SIX
- S1CODE16 DB #C0,#07,#20,#0A
- DB #20,#12,#20,#12
- DB #C0,#01,#00,#00
- NUMERAL SEVEN
- S1CODE17 DB #00,#10,#60,#10
- DB #80,#11,#00,#16
- DB #00,#18,#00,#00
- NUMERAL EIGHT
- S1CODE18 DB #C0,#0D,#20,#12
- DB #20,#12,#20,#12
- DB #C0,#0D,#00,#00
- NUMERAL NINE
- S1CODE19 DB #00,#0E,#20,#11
- DB #20,#11,#40,#11
- DB #80,#0F,#00,#00
- COLON
- S1CODE1A DB #00,#00,#60,#06
- DB #60,#06,#00,#00
- DB #00,#00,#00,#00
- SEMICOLON
- S1CODE1B DB #08,#00,#70,#06
- DB #60,#06,#00,#00
- DB #00,#00,#00,#00
- LESS THAN
- S1CODE1C DB #00,#01,#80,#02
- DB #40,#04,#20,#08
- DB #00,#00,#00,#00
- EQUAL
- S1CODE1D DB #80,#02,#80,#02
- DB #80,#02,#80,#02
- DB #80,#02,#00,#00
- GREATER THAN
- S1CODE1E DB #00,#00,#20,#08
- DB #40,#04,#80,#02
- DB #00,#01,#00,#00
- QUESTION MARK
- S1CODE1F DB #00,#18,#00,#20
- DB #A0,#23,#00,#24
- DB #00,#18,#00,#00
- COMMERICAL AT
- S1CODE20 DB #C0,#03,#20,#04
- DB #90,#05,#D0,#05
- DB #90,#03,#00,#00
- CAPITAL A
- S1CODE21 DB #E0,#0F,#00,#12
- DB #00,#22,#00,#12
- DB #E0,#0F,#00,#00
- CAPITAL B
- S1CODE22 DB #E0,#3F,#20,#24
- DB #20,#24,#20,#24
- DB #C0,#1B,#00,#00
- CAPITAL C
- S1CODE23 DB #C0,#1F,#20,#20
- DB #20,#20,#20,#20
- DB #40,#10,#00,#00
- CAPITAL D
- S1CODE24 DB #E0,#3F,#20,#20
- DB #20,#20,#40,#10
- DB #80,#0F,#00,#00
- CAPITAL E
- S1CODE25 DB #E0,#3F,#20,#22
- DB #20,#22,#20,#22
- DB #20,#20,#00,#00
- CAPITAL F
- S1CODE26 DB #E0,#3F,#00,#22
- DB #00,#22,#00,#22
- DB #00,#20,#00,#00
- CAPITAL G
- S1CODE27 DB #C0,#1F,#20,#20
- DB #20,#21,#20,#21
- DB #C0,#19,#00,#00
- CAPITAL H
- S1CODE28 DB #E0,#3F,#00,#02
- DB #00,#02,#00,#02
- DB #E0,#3F,#00,#00
- CAPITAL I
- S1CODE29 DB #20,#20,#20,#20
- DB #E0,#3F,#20,#20
- DB #20,#20,#00,#00
- CAPITAL J
- S1CODE2A DB #40,#00,#20,#00
- DB #20,#20,#C0,#3F
- DB #00,#20,#00,#00
- CAPITAL K
- S1CODE2B DB #E0,#3F,#00,#03
- DB #80,#04,#40,#08
- DB #20,#30,#00,#00
- CAPITAL L
- S1CODE2C DB #E0,#3F,#20,#00
- DB #20,#00,#20,#00
- DB #20,#00,#00,#00
- CAPITAL M
- S1CODE2D DB #E0,#3F,#00,#10
- DB #00,#08,#00,#10
- DB #E0,#3F,#00,#00
- CAPITAL N
- S1CODE2E DB #E0,#3F,#00,#18
- DB #00,#06,#C0,#01
- DB #E0,#3F,#00,#00
- CAPITAL O
- S1CODE2F DB #C0,#1F,#20,#20
- DB #20,#20,#20,#20
- DB #C0,#1F,#00,#00
- CAPITAL P
- S1CODE30 DB #E0,#3F,#00,#22
- DB #00,#22,#00,#22
- DB #00,#1C,#00,#00
- CAPITAL Q
- S1CODE31 DB #C0,#1F,#20,#20
- DB #20,#20,#30,#20
- DB #C8,#1F,#00,#00
- CAPITAL R
- S1CODE32 DB #E0,#3F,#00,#23
- DB #80,#22,#40,#22
- DB #20,#1C,#00,#00
- CAPITAL S
- S1CODE33 DB #40,#1C,#20,#22
- DB #20,#22,#20,#22
- DB #C0,#11,#00,#00
- CAPITAL T
- S1CODE34 DB #00,#20,#00,#20
- DB #E0,#3F,#00,#20
- DB #00,#20,#00,#00
- CAPITAL U
- S1CODE35 DB #C0,#3F,#20,#00
- DB #20,#00,#20,#00
- DB #C0,#3F,#00,#00
- CAPITAL V
- S1CODE36 DB #00,#3C,#80,#03
- DB #60,#00,#80,#03
- DB #00,#3C,#00,#00
- CAPITAL W
- S1CODE37 DB #E0,#3F,#40,#00
- DB #80,#00,#40,#00
- DB #E0,#3F,#00,#00
- CAPITAL X
- S1CODE38 DB #60,#30,#80,#09
- DB #00,#06,#80,#09
- DB #60,#30,#00,#00
- CAPITAL Y
- S1CODE39 DB #00,#38,#00,#04
- DB #E0,#07,#00,#04
- DB #00,#38,#00,#00
- CAPITAL Z
- S1CODE3A DB #E0,#30,#20,#21
- DB #20,#22,#20,#24
- DB #60,#38,#00,#00
- LEFT CLOSURE [
- S1CODE3B DB #00,#00,#00,#00
- DB #F0,#3F,#10,#20
- DB #10,#20,#00,#00
- REVERSE SLASH
- S1CODE3C DB #00,#04,#00,#02
- DB #00,#01,#80,#00
- DB #40,#00,#00,#00
- RIGHT CLOSURE
- S1CODE3D DB #10,#20,#10,#20
- DB #F0,#3F,#00,#00
- DB #00,#00,#00,#00
- 'HAT
- S1CODE3E DB #00,#04,#00,#08
- DB #00,#10,#00,#08
- DB #00,#04,#00,#00
- UNDERLINE
- S1CODE3F DB #08,#00,#08,#00
- DB #08,#00,#08,#00
- DB #08,#00,#00,#00
- SMALL REVERSE SLASH
- S1CODE40 DB #00,#00,#00,#00
- DB #00,#20,#00,#10
- DB #00,#00,#00,#00
- SMALL LETTER A
- S1CODE41 DB #C0,#00,#20,#05
- DB #20,#05,#20,#05
- DB #E0,#03,#00,#00
- SMALL LETTER B
- S1CODE42 DB #E0,#3F,#40,#02
- DB #20,#04,#20,#04
- DB #C0,#03,#00,#00
- SMALL LETTER C
- S1CODE43 DB #C0,#03,#20,#04
- DB #20,#04,#20,#04
- DB #40,#02,#00,#00
- SMALL LETTER D
- S1CODE44 DB #C0,#03,#20,#04
- DB #20,#04,#20,#04
- DB #E0,#3F,#00,#00
- SMALL LETTER E
- S1CODE45 DB #C0,#03,#20,#05
- DB #20,#05,#20,#05
- DB #20,#03,#00,#00
- SMALL LETTER F
- S1CODE46 DB #20,#04,#E0,#1F
- DB #20,#24,#00,#20
- DB #00,#10,#00,#00
- SMALL LETTER G
- S1CODE47 DB #50,#03,#A8,#04
- DB #A8,#04,#A8,#04
- DB #10,#0B,#00,#00
- SMALL LETTER H
- S1CODE48 DB #E0,#3F,#00,#02
- DB #00,#04,#00,#04
- DB #E0,#03,#00,#00
- SMALL LETTER I
- S1CODE49 DB #20,#04,#E0,#27
- DB #20,#00,#00,#00
- DB #00,#00,#00,#00
- SMALL LETTER J
- S1CODE4A DB #00,#00,#04,#00
- DB #04,#04,#F8,#27
- DB #00,#00,#00,#00
- SMALL LETTER K
- S1CODE4B DB #E0,#3F,#00,#01
- DB #80,#01,#40,#02
- DB #20,#04,#00,#00
- SMALL LETTER L
- S1CODE4C DB #00,#00,#00,#00
- DB #20,#20,#E0,#3F
- DB #20,#00,#00,#00
- SMALL LETTER M
- S1CODE4D DB #E0,#07,#00,#04
- DB #E0,#03,#00,#04
- DB #E0,#07,#00,#00
- SMALL LETTER N
- S1CODE4E DB #E0,#07,#00,#02
- DB #00,#04,#00,#04
- DB #E0,#03,#00,#00
- SMALL LETTER O
- S1CODE4F DB #C0,#03,#20,#04
- DB #20,#04,#20,#04
- DB #C0,#03,#00,#00
- SMALL LETTER P
- S1CODE50 DB #FC,#07,#20,#04
- DB #20,#04,#20,#04
- DB #C0,#03,#00,#00
- SMALL LETTER Q
- S1CODE51 DB #C0,#03,#20,#04
- DB #20,#04,#20,#04
- DB #FC,#07,#00,#00
- SMALL LETTER R
- S1CODE52 DB #E0,#07,#00,#02
- DB #00,#04,#00,#04
- DB #00,#02,#00,#00
- SMALL LETTER S
- S1CODE53 DB #40,#02,#20,#05
- DB #20,#05,#20,#05
- DB #C0,#04,#00,#00
- SMALL LETTER T
- S1CODE54 DB #00,#04,#00,#04
- DB #C0,#3F,#20,#04
- DB #20,#04,#00,#00
- SMALL LETTER U
- S1CODE55 DB #C0,#07,#20,#00
- DB #20,#00,#20,#00
- DB #C0,#07,#00,#00
- SMALL LETTER V
- S1CODE56 DB #00,#06,#80,#01
- DB #60,#00,#80,#01
- DB #00,#06,#00,#00
- SMALL LETTER W
- S1CODE57 DB #C0,#07,#20,#00
- DB #C0,#00,#20,#00
- DB #C0,#07,#00,#00
- SMALL LETTER X
- S1CODE58 DB #20,#04,#40,#02
- DB #80,#01,#40,#02
- DB #20,#04,#00,#00
- SMALL LETTER Y
- S1CODE59 DB #04,#07,#88,#00
- DB #50,#00,#60,#00
- DB #80,#07,#00,#00
- SMALL LETTER Z
- S1CODE5A DB #20,#06,#60,#04
- DB #A0,#04,#20,#05
- DB #60,#06,#00,#00
- LEFT BRACKET [
- S1CODE5B DB #00,#00,#00,#01
- DB #F0,#1E,#08,#20
- DB #08,#20,#00,#00
- ELONGATED COLON
- S1CODE5C DB #00,#00,#E0,#3D
- DB #E0,#3D,#00,#00
- DB #00,#00,#00,#00
- RIGHT BRACKET ]
- S1CODE5D DB #08,#20,#08,#20
- DB #F0,#1E,#00,#01
- DB #00,#00,#00,#00
- APPROXIMATE
- S1CODE5E DB #00,#10,#00,#20
- DB #00,#10,#00,#10
- DB #00,#20,#00,#00
- RUB OUT
- S1CODE5F DB #C0,#1F,#C0,#1F
- DB #C0,#1F,#C0,#1F
- DB #C0,#1F,#00,#00
- CURSOR
- S1CODE60 DB #01,#00,#01,#00
- DB #01,#00,#01,#00
- DB #01,#00,#01,#00
- CHCURSOR
- S1CODE61 DB #00,#00,#00,#00
- DB #80,#00,#C0,#01
- DB #80,#00,#00,#00
- M0CODE5F DB #F0,#1F,#F0,#1F RUBOUT
- DB #F0,#1F,#F0,#1F
- DB #F0,#1F,#F0,#1F
- DB #F0,#1F,#F0,#1F
- M0CODE60 DB #01,#00,#01,#00 CURSOR
- DB #01,#00,#01,#00
- DB #01,#00,#01,#00
- DB #01,#00,#01,#00
- M0CODE61 DB #00,#00,#00,#00 CHCURSOR
- DB #00,#00,#00,#01
- DB #80,#03,#00,#01
- DB #00,#00,#00,#00
- LWA EQU *
- EJECT
- IST.STK EQU LWA+45 PROCESSOR STACK
- G.BEGIN EQU LWA+45
- ********************
- *
- * TERMINAL VARIABLES AND SCRATCH AREA
- *
- ********************
- KBAADR EQU LWA+45 KB TO ASCII CONVERT
- BIAS EQU KBAADR+2 BIAS OF Y COORDINATE
- BYPASS EQU BIAS+2 BY PASS CONDITION FLAG
- CHBASE EQU BYPASS+1
- CLK.1 EQU CHBASE+2
- CLK.2 EQU CLK.1+1
- CLOCK EQU CLK.2+1 BLINK CURSOR CLOCK
- CMODE EQU CLOCK+2 COMMAND MODE
- CRLFFG EQU CMODE+1 CR/LF FLAG
- CTLADR EQU CRLFFG+1 CONTROL CODES BASE ADR.
- DASH EQU CTLADR+2 DASH/SOLID VECTOR FLAG
- DARK EQU DASH+1 DARK VECTOR FLAG
- D.CNTL2P EQU DARK+1 TEMP DISPLAY CONTROL WORD
- D.CNTL2D EQU D.CNTL2P+1 TEMP DISPLAY CONTROL WORD
- DOTS EQU D.CNTL2D+1 DOT MOVEMENT FOR GIN MODE
- ECURSOR EQU DOTS+1 ERASE BITS FOR CURSOR
- ESCADR EQU ECURSOR+1 ESCAPE SEQUENCE BASE ADR.
- E.CNTR EQU ESCADR+2
- EREG EQU E.CNTR+1
- ESEGLEN EQU EREG+1 ERASE SEGMENT LENGTH
- G.CNTL2 EQU ESEGLEN+1
- G.CTLFLG EQU G.CNTL2+1 CTL MODE FLAG
- G.DDIR EQU G.CTLFLG+1
- G.ESC EQU G.DDIR+1
- G.MEMSEL EQU G.ESC+1
- G.MODE EQU G.MEMSEL+2
- G.SIZE EQU G.MODE+1
- G.SUPCUR EQU G.SIZE+1
- G.TTYFLG EQU G.SUPCUR+1
- G.XPOS EQU G.TTYFLG+1
- G.YPOS EQU G.XPOS+2
- GIN.KEY EQU G.YPOS+2
- HEIGHT EQU GIN.KEY+1
- HIX EQU HEIGHT+1
- HIY EQU HIX+2
- KBDATA EQU HIY+2
- LINEND EQU KBDATA+1
- LOC.RMT EQU LINEND+2
- LOX EQU LOC.RMT+1
- LOY EQU LOX+1
- MREG EQU LOY+1
- NBYTES EQU MREG+1
- NREG EQU NBYTES+1
- M.MODEP EQU NREG+1
- NINPUT EQU M.MODEP+1
- PAGEND EQU NINPUT+1
- PAGEFULL EQU PAGEND+2
- PMC.FLG EQU PAGEFULL+1
- SAVE EQU PMC.FLG+1
- SCALEFG EQU SAVE+2
- SELECT.M EQU SCALEFG+1
- SH.SUP EQU SELECT.M+2
- TSTAT EQU SH.SUP+1
- BTWICE EQU TSTAT+1
- VECFLAG EQU BTWICE+1
- WCURSOR EQU VECFLAG+1 WRITE BITS FOR CURSOR
- WEFLAG EQU WCURSOR+1
- WIDTH EQU WEFLAG+1
- WSEGLEN EQU WIDTH+1 WRITE SEGMENT LENGTH
- X1 EQU WSEGLEN+1
- Y1 EQU X1+2
- X2 EQU Y1+2
- Y2 EQU X2+2
- *
- * TRANSMIT BUFFER
- *
- TXBUF EQU Y2+2
- *
- * RECEIVE BUFFER
- *
- RXBUF EQU TXBUF+11
- BC.REG EQU RXBUF+258
- * PLATO OPERATIONS CHARACTER FLAGS NOTE ORDER
- BLOCKX EQU BC.REG+1
- BLOCKY EQU BLOCKX+2
- XEND EQU BLOCKY+2
- YEND EQU XEND+2
- XDELTA EQU YEND+2
- YDELTA EQU XDELTA+2
- BLOCKF EQU YDELTA+2
- MEMREG EQU BLOCKF+1
- *
- IN.BUF EQU MEMREG+2 KB/TP INPUT BUFFER
- *
- US.FIFO EQU IN.BUF+19
- COMMAND EQU US.FIFO+19
- * EXTERNAL DEVICE OUTPUT INSTRUCTION
- EXT.OUT EQU COMMAND+5
- * EXTERNAL DEVICE INPUT INSTRUCTION
- EXT.IN EQU EXT.OUT+6
- MODEADR EQU EXT.IN+3
- G.END EQU MODEADR+2
- END START
plato/source/plaopl/asc1ram.txt ยท Last modified: 2023/08/05 18:54 by Site Administrator