1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-30 13:36:42 +00:00
Files
PDP-10.its/src/syseng/fdits.43
Lars Brinkhoff 97b93e2b63 Add GT40 support to PDP-10 Lisp display slave.
When SYS; ATSIGN 10SLAV is assembled with GT40F=1, the type of display
is selected at run time from an argument to DISINI.
2021-01-14 09:46:27 +01:00

681 lines
14 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;GT40 CODE FOR LISP SLAVE
;LOTS CAME FROM DRAW;DITS
;December, 1974 Joseph D. Cohen
;DRAW stuff stolen from J. Pitts Jarvis
;GT40 OPCODES
DPYJMP==160000
DPYNOP==164000
DPYSTP==173400 ;STOP DISPLAY AND CAUSE INTERRUPT
DPYJSR==DPYSTP+1 ;CALL DPY SUBROUTINE
DPYRTS==DPYSTP+2 ;RETURN FROM DPY SUBROUTINE
SETPNT==114000
RPOINT==130000
SVW==104000
LVW==110000
CHARS==100000
DPYNRM==3724 ;NORMAL SET GRAPHIC MODE BITS
; INTENSITY 7
; NO LIGHT PEN
; NO BLINK
; NO ITALICS
; SOLID LINE
DBLINK==10 ; YES BLINK (IF ENABLED)
STSNRM=171640 ;NORMAL A REGISTER SETTINGS
; ENABLE STOP INTERRUPTS
; DISABLE LIGHT PEN INTERRUPTS
SYNC==4 ; SYNCS DPU WITH CLOCK
ITALICS==20 ; CAUSE ITALICS
LITEPN==200 ; ENABLE LIGHT PEN INTERRUPTS
TYOBFL==20 ;OUTPUT BUFFER LENGTH
ESCHR==20 ;ESCAPE FROM CHARACTER MODE (P)
LODER==0 ;ENTER LODER
XTRA==6 ;EXTRA BYTES IN BLOCK (MUST BE SAME AS DRAW PROG FORMAT)
BLKMRK==1 ;MARKS BEGINNING OF BLOCK
DELBLK==2 ;LIST OF PIECES OF GLASS TO BE DELETED
GM==770374036017 ;DDT MASK FOR BITS IOTED TO GT40
;MODE BITS RIGHT JUSTIFIED
SCM==0 ;SET CHAR MODE
SSVM==1 ;SET SHORT VECTOR
SLVM==2 ;LONG VECTOR
SPM==3 ;POINT
SGXM==4 ;GRAPH X
SGYM==5 ;GRAPH Y
SRPM==6 ;RELATIVE POINT
SPAR==7 ;SPARE
GBITPL==2000 ;BITS PER LINE
GNLINS==1400 ;LINES ON SCREEN
GBYTPL==GBITPL/10 ;BYTES PER LINE
GWRDPL==GBYTPL/2 ;WORDS PER LINE
GCHRWD==16 ;CHARACTER WIDTH
GCHRHT==30 ;CHARACTER HEIGHT
GCHRPL==GBITPL/GCHRWD ;CHARACTERS PER LINE
GCHRLN==GNLINS/GCHRHT ;CHARACTER LINES ON SCREEN
;PDP10 COMMANDS TO GT40
;ARGUMENTS TO COMMAND
G40LSH==0 ;LOAD ITEM AND SHOW IT
;<1(LOAD LIST); ITEM SIZE, ITEM #, CKS>OR <2(DELETE);SIZE OF COMMAND; ITEM #; CKS>
;THIS COMMAND IS USED BY DRAWING PROGRAM, NOT LIST
G40LOD==1 ;LOAD, BUT DON'T SHOW
;ITEM SIZE, ITEM #, ITEM, CKS
G40DEL==2 ;DELETE AN ITEM
;ITEM #
G40RST==3 ;RESET THE WORLD
;NO ARGS
G40SHW==4 ;SHOW AN ITEM
;ITEM #
G40ERS==5 ;ERASE AN ITEM
;ITEM #
G40CPY==6 ;COPY AN ITEM
;ITEM # TO BE COPIED, ITEM # OF COPY
G40MOV==7 ;MOVE AN ITEM
;ITEM #, ABSOLUTE XCOOR, YCOOR
G40CHM==8 ;CHANGE MODE OF ITEM
;ITEM #, NEW SET GRAPHICS MODE WORD
G40ADD==9. ;ADD TO AN ITEM
;SIZE OF ADDITION, ITEM #, ADDITION, CKS
G40SBR==10. ;SUBROUTINIZE AN ITEM
;# OF CALLING ROUTINE, #OF SUBR
G40USB==11. ;UNSUBROUTINIZE AN ITEM
;# OF CALLING ROUTINE, # OF SUBR
;INTERRUPT ROUTINE
GINT: 0
0
SKIPL GINT
.DISMIS GINT+1 ;NOT INFERIOR OR CHANNEL INTERRUPT
EXCH A,GINT ;SAVE A
TRNN A,1_GICH
JRST GINTDS ;NOT GICH (ONLY LEGAL INTERRUPT)
MOVEI A,GICH
.ITYIC A,
JRST GINTDS ;NO CHARACTER AVAILABLE
.IOT GICH,A
MOVEM A,GERCH ;SAVE FOR DEBUGGING
CAIN A,0
JRST GERFUL ;GT40 FREE STOPRAGE FULL
CAIN A,34
JRST GERINT ;GT40 INTERNAL ERROR
GINTDS: MOVE A,GINT ;RESTORE A
.DISMIS GINT+1
GERINT: SKIPA A,[5] ;LISP INTERNAL ERROR
GERFUL: MOVEI A,2 ;LISP MEMORY FULL ERROR
MOVEM A,ERRLOC
JRST GINTDS
;SOME GENERAL ROUTINES
;SAVE SOME ACS
GACSAV: EXCH (P) ;THIS AC IS CLOBBERED
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
PUSH P,G
PUSH P,T
PUSH P, ;SO WE NEEDN'T WORRY ABOUT FLAGS
POPJ P,
;RESTORE THEM
GACRES: POP P,
POP P,T
POP P,G
POP P,E
POP P,D
POP P,C
POP P,B
EXCH (P)
POPJ P,
;CHECK GT40 MODE
GCMODE: ASH G,4 ;LEAVE ROOM FOR BRIGHTNESS
PUSH P,G
LDB G,TBRITE ;INTENSITY
TRO G,10 ;ENABLE
DPB G,[400,,(P)]
MOVEI G,100000
IORM G,GSTORE(A)
LDB G,GMODE ;CURRENT MODE BITS
CAMN G,(P)
JRST GPOPGJ
POP P,G
DPB G,GMODE ;CHANGE MODE
MOVE G,GSTORE(A)
TRZ G,177 ;LIGHT PEN, BLINK, LINE TYPE DISABLED
PUSHJ P,ADBYTE
POPJ P,
;RETURNS ONE LEVEL UP IF GT40 SHOULDN'T BE USED
GCHK: SKIPN GTTY
POP P,
POPJ P,
;COMMANDS ON THIS PAGE DON'T USE VARIABLE BLOCK SIZE OR CHECKSUM
;INITIALIZE GT40
GINIT: .CLOSE GICH,
.CLOSE GOCH,
SETZM GTCSW ;GT40 CHANNNELS CLOSED
SETZ G,
MOVEI G+1,1_GICH
.SETM2 G, ;ENABLE INTERRUPTS ON GICH ONLY
POPJ P,
;HERE TO CLEAR OUT GT40
GTCLR: SKIPN G,GTTY
JRST GINIT ;DON'T USE GT40
SKIPE GTCSW
JRST GTCLR1 ;CHANNEL ALREADY OPEN, DON'T CLOSE IT
HRRM G,GTTY
HRRM G,GTYI
HRRM G,GTYO
.OPEN GICH,GTYI
.VALUE
.OPEN GOCH,GTYO
.VALUE
GTCLR1: MOVEI G,35 ;HOME UP
PUSHJ P,PUTCH1
MOVEI G,37 ;CLEAR EOF
JRST PUTCH1
;MOVE ARRAY
GMOV: PUSHJ P,GCHK
MOVEI G,G40MOV
PUSHJ P,G2WCMD ;SEND COMMAND AND ARRAY
PUSHJ P,GACSAV
MOVE G,XINCR ;INCR CURRENT POSITION
ADDM G,GXPOS(A)
MOVE G,YINCR
ADDM G,GYPOS(A)
PUSHJ P,GGTHOM ;GET X & Y HOME IN B & C, CLOBBER D
GMOV1: TRZ B,40000 ;DON'T ILLUMINATE
PUSHJ P,GCLVM ;CLEAR EXTRANEOUS BITS
MOVE G,B
PUSHJ P,PUTWRD
MOVE G,C
JRST SNDG
;MORE FIXED LENGTH COMMANDS
;DELETE ARRAY
GDEL: PUSHJ P,GCHK
MOVEI G,G40DEL
JRST G2WCMD
;SHOW ARRAY
GSHW: PUSHJ P,GCHK
MOVEI G,G40SHW
JRST G2WCMD
;DON'T SHOW ARRAY
GERS: PUSHJ P,GCHK
MOVEI G,G40ERS
G2WCMD: PUSHJ P,GACSAV
PUSHJ P,GSNDES ;SEND ESCAPE CHAR
PUSHJ P,PUTCH1 ;SEND COMMAND IN G
MOVE G,A
SNDG: PUSHJ P,PUTWRD ;SEND ARRAY
GPOACJ: PUSHJ P,GACRES
POPJ P,
;BLINK IT
GBLK: PUSHJ P,GCHK
MOVEI G,3
GBLK1: DPB G,[30200,,GSTORE(A)] ;PUT BLINK BITS IN MODE WORD
MOVEI G,G40CHM
PUSHJ P,G2WCMD
LDB G,[700,,GSTORE(A)] ;IGNORE MODE AND BRIGHTNESS
GSNDG: PUSHJ P,GACSAV
JRST SNDG ;SEND NEW SET GRAPH MODE WORD
;DON'T BLINK IT
GUBL: PUSHJ P,GCHK
MOVEI G,2
JRST GBLK1
;COPY ARRAY
GCPY: PUSHJ P,GCHK
MOVEI G,G40CPY
PUSHJ P,G2WCMD ;SEND COPY AND SOURCE ITEM
MOVE G,E ;COPY #
JRST GSNDG
;SUBROUTINIZE, SUPERIOR IN A, INFERIOR IN B
;GSBR: PUSHJ P,GCHK
; MOVEI G,G40SBR
;GSBR1: PUSHJ P,G2WCMD
; MOVE G,B ;SUBR ARRAY NUMBER
; JRST GSNDG
;UNSUBROUTINIZE
;GUSB: PUSHJ P,GCHK
; MOVEI G,G40USB
; JRST GSBR1
;THESE COMMANDS DO USE VARIABLE SIZE AND CHECKSUM
;INITIALIZE ARRAY
GINAR: PUSHJ P,GCHK
PUSHJ P,GACSAV
MOVEI G,G40LOD
MOVEM G,GCMND
MOVEM B,GXPOS(A)
MOVEM C,GYPOS(A)
PUSHJ P,INTGT ;INTIALIZE BUFFER POINTERS
PUSHJ P,GABSPI ;SET POINT
MOVEI G,174000
ANDM G,GSTORE(A) ;DISABLE BLINK ETC FOR REST OF LIST
GENDGP: PUSHJ P,ENDGT
JRST GPOACJ
;ADD A POINT, DX IN B, DY IN C
GADPNT: PUSHJ P,GCHK
PUSHJ P,GACSAV
PUSHJ P,GADD
PUSHJ P,GUDPOS ;UPDATE GXPOS AND GYPOS
PUSHJ P,GSGMAG
PUSHJ P,GRELP ;ADD THE POINT
JRST GENDGP
;ADD A LINE, SAME ARGS AS ADD A POINT
GADLIN: PUSHJ P,GCHK
PUSHJ P,GACSAV
PUSHJ P,GADD
TLNN U,PENBIT
JRST GADLI2 ;INVISIBLE
TLNN U,AWYFLG
JRST GADLI1 ;AT PENPOS
PUSH P,B
PUSH P,C
SETZB B,C
PUSHJ P,GUDPOS
PUSHJ P,INVEC ;GET BACK TO PENPOS
POP P,C
POP P,B
GADLI1: PUSHJ P,GUDPOS
PUSHJ P,GSGMAG
PUSHJ P,SVW2GT ;ADD THE LINE
JRST GENDGP
GADLI2: PUSHJ P,GUDPOS
PUSHJ P,INVEC ;JUST GO THERE INVISIBLY
JRST GENDGP
;SOME HELPFUL SUBROUTINES
;;PUT SIGN OF B IN D LH, SIGN OF C IN D RH
;CHANGE B & C TO MAGNITUDE
GSGMAG: SETZ D,
TLNE B,400000
HRLI D,-1
TLNE C,400000
HRRI D,-1
MOVMS B
MOVMS C
POPJ P,
;SET UP TO LATER ADD TO A LIST
GADD: PUSHJ P,INTGT ;INITIALIZE BUFFER POINTERS
MOVEI G,G40ADD
MOVEM G,GCMND
POPJ P,
;UPDATE POSITION TO DX IN B DY IN C RELATIVE TO PENPOS (NOT GXPOS)
;RETURNS WITH B & C RELATIVE TO GXPOS AND GYPOS
GUDPOS: SUB B,GXPOS(A)
ADD B,XDISP(A)
ADDM B,GXPOS(A)
SUB C,GYPOS(A)
ADD C,YDISP(A)
ADDM C,GYPOS(A)
POPJ P,
;GET HOME IN B & C
GGTHOM: MOVE D,ARYORG(A)
HLRZ B,1(D) ;X
HRRZ C,(D) ;Y
ANDI B,DSPMSK
ANDI C,DSPMSK
POPJ P,
;SEND ESCAPE CHAR
GSNDES: PUSH P,G
MOVEI G,ESCHR
PUSHJ P,PUTCH1
GPOPGJ: POP P,G
POPJ P,
;CHARACTERS
;START INSERTING CHARACTERS
GSTCH: PUSHJ P,GCHK
PUSHJ P,GACSAV
PUSHJ P,GADD ;INSERT COMMAND, SET UP POINTERS
JRST GPOACJ
;KEEP ON STARTING
GSTCH1: PUSHJ P,GACSAV
MOVE G,XDISP(A) ;KEEP TRACK OF WHERE WE ARE
ADD G,B
MOVEM G,GXPOS(A) ;X
MOVE G,YDISP(A)
ADD G,C
MOVEM G,GYPOS(A) ;Y
SKIPN B
SKIPE C ;DON'T DO ANTHING IF BOTH=0
GSTCH2: PUSHJ P,INVEC ;GO TO START OF CHARS
JRST GPOACJ
;ADD THE CHAR IN W
GADCH: PUSHJ P,GCHK
PUSHJ P,GACSAV
CAIL W,40
GADCH1: JRST GINCH ;>=40, JUST INSERT IT
CAIN W,15
JRST GCHCR ;CARRIAGE RETURN
CAIN W,10
JRST GINBS ;BACK SPACE
CAIN W,12
JRST GINLF ;LINE FEED
JRST GPOACJ ;CNTRL CHAR <11 OR >16
;END INSERTING CHARACTERS
GENDCH: PUSHJ P,GCHK
PUSHJ P,GACSAV
JRST GENDGP ;SEND THE WHOLE MESS
GINLF: SKIPE B,CRFLAG
JRST GPOACJ ;THIS LF IMMEDIATELY FOLLWED CR
MOVNI C,GCHRHT
JRST GINCH1
GINBS: SKIPA B,[-GCHRWD]
GINCH: MOVEI B,GCHRWD
SETZ C,
GINCH1: ADDM B,GXPOS(A) ;UPDATE X
ADDM C,GYPOS(A) ;Y
MOVEI G,SCM
PUSHJ P,GCMODE
PUSHJ P,ADCHR
JRST GPOACJ
GCHCR: MOVN B,GXPOS(A)
LDB C,XMARG ;WHERE WE WANT TO GO
ADD B,C
MOVEM C,GXPOS(A)
MOVNI C,GCHRHT ;DELTA Y, (LINE FEED)
ADDM C,GYPOS(A)
JRST GSTCH2
;HERE FOR ABSOLUTE SET POINT (IN LOAD LIST)
GABSPI: TRZA B,40000 ;INVISIBLE
GABSP: IORI B,40000 ;INTENSIFY
PUSHJ P,GCLVM
LDB G,TBRITE ;GET BRITENESS
ASH G,7
IORI G,116024 ;CHARS, NO LIGHT PEN, BLINK & INTENS ENABLE
PUSHJ P,ADBYTE
PUSHJ P,ADBYTB ;X
PUSHJ P,ADBYTC ;Y
POPJ P,
;HERE FOR SET POINT
;RELATIVE POINT
;DX IN B, SIGN IN LH OF D; DY IN C, SIGN IN RH D
GRELP: SETZM GDYZFL
PUSHJ P,LVWCHK
JRST GRELSP ;REL POINT MODE SUFFICES
TRZ B,40000 ;DOESN'T WORK, DRAW LONG INVIS VECTOR
SOJGE C,.+3 ;DECREMENT DELTA Y
MOVEI C,1 ;DELTA Y WAS 0
SETOM GDYZFL
PUSHJ P,LVWGT1 ;DRAW LONG INVISIBLE VECTOR
SETZ B, ;NOW POINT DX=0, DY=1
MOVEI C,1
MOVSS D ;RESTORE SIGNS
SKIPE GDYZFL
TRC D,-1
GRELSP: IORI C,40000 ;INTENSIFY
MOVEI G,SRPM
GRELS1: PUSHJ P,GCMODE
MOVE G,C ;DY
DPB D,[60100,,G] ;Y SIGN
DPB B,[70600,,G] ;X MAGN
MOVSS D
DPB D,[150100,,G] ;X SIGN
TRZ G,700000
PUSHJ P,ADBYTE
POPJ P,
SVWGT1: MOVEI G,SSVM ;SHORT VECTOR
JRST GRELS1
;DRAW INVSISIBLE VECTOR
INVEC: PUSHJ P,GSGMAG
TRZ B,40000 ;DON'T ILLUMINATE
TRZ C,40000
JRST SVWGT2
;HERE FOR VECTOR
;SAME ARGS AS RELATIVE POINT
SVW2GT: IORI B,40000 ;ILLUMINATE
IORI C,40000
SVWGT2: PUSHJ P,LVWCHK
JRST SVWGT1 ;SHORT VECTOR
LVWGT1: MOVEI G,SLVM
PUSHJ P,GCMODE
PUSHJ P,GCLVM
DPB D,[150100,,C] ;Y
MOVSS D
DPB D,[150100,,B] ;XSIGN
PUSHJ P,ADBYTB ;ADD B
PUSHJ P,ADBYTC ;ADD C
POPJ P,
;CLEAR ALL BUT LVM INFO
GCLVM: TRZ B,736000
TRZ C,776000
POPJ P,
;SKIP IF WE NEED LONG VECTOR OR ABS POINT
LVWCHK: CAILE B,77
SKIPA
CAILE C,77
AOS (P) ;SKIP, >= 6 BITS OF X AND Y
POPJ P,
;INITIALIZE GT40 DISPLAY LIST POINTERS
INTGT: SETZM DLBCNT
MOVEI G,DLBF
MOVEM G,DLFBYTE
INTGT1: HRRZI G,DLBF
SUBI G,1
HRLI G,042000
MOVEM G,DLPC ;BYTE PNTR FOR 16 BIT WORDS IN GT40 LIST
PUSHJ P,SETCBP
POPJ P,
;HERE TO SEND DISPLAY LIST TO GT40 OVER TTY, B HAS PIECE OF GLASS
ENDGT: SKIPE DCHCNT
PUSHJ P,ADNUL ;ODD # OF CHARS, ADD ONE TO FILL WORD
PUSHJ P,INTGT1 ;SET UP THAT BYTE POINTER AGAIN
PUSHJ P,SETCBP
PUSHJ P,SETLOD ;SEND ESCAPE, AND HEADER
MOVE D,DLBCNT
ASH D,1 ;# PDP11 BYTES
PUSHJ P,GSWRD
JUMPG D,.-1
MOVN G,E ;CHECKSUM
MOVEM G,CKS ;FOR DEBUGGING
PUSHJ P,PUTWRD
PUSHJ P,FPUT ;PUSH OUT BUFFER AND PAD
MOVE G,DLBCNT ;RETURN # PDP10 WORDS IN DISPLAY LIST
ASH G,-1
MOVEM G,DLBCNT
POPJ P,
;HERE TO ENTER LOADER AND SEND HEADER
SETLOD: PUSHJ P,SETBUF ;SET UP BUFFER POINTERS
MOVEI G,ESCHR
PUSHJ P,PUTCH1
MOVE G,GCMND ;CMD TO GT40
PUSHJ P,PUTCH1
SETZ E, ;INITIALIZE CHECKSUM
MOVE G,DLBCNT
ASH G,1 ;# PDP11 BYTES
ADDI G,XTRA
PUSHJ P,PUTWRD
MOVE G,A
JRST PUTWRD ;OUT GOES PIECE OF GLASS #
;READ 2 EIGHT BIT BYTES SEND 3 ASCII CHARACTERS DOWN THE LINE
; SENDS 6 BITS, 4 BITS, AND 6 BITS, LEAST SIGNIFICANT FIRST
GSWRD: PUSHJ P,GETBYT
ANDI G,377
LSHC G,-44
SOSLE D
PUSHJ P,GETBYT ;DON'T GET BYTE UNLESS THERE IS ON THERE
SOS D
AOSE G ;SKIPS ON END OF BLOCK
SOS G ;GET IT BACK
LSH G,10
ADDB G,T
PUTWRD: MOVE T,G
LSH G,-10 ;CHECK SUM FIRST
ANDI G,377
ADD E,G
MOVE G,T
ANDI G,377
ADD E,G
ANDI G,77 ;NOW PUT OUT 3 CHARACTERS
PUSHJ P,PUTCHR
MOVE G,T
LSH G,-6
ANDI G,17
PUSHJ P,PUTCHR
MOVE G,T
LSH G,-12
ANDI G,77
PUTCHR:
PUTCH1:
JRST DSPTYO ;IDPB G,TYOBP
;FOLLOWING STUFF IS FOR SUPER-IMAGE OUTPUT, WHICH DOESN'T WORK TO TTYS!
; SOSLE TYOCNT
; POPJ P,
; MOVE G,[-TYOBFL,,TYOBUF]
; PUSHJ P,DSPTYO
SETBUF: POPJ P,
; MOVEI G,TYOBFL*5
; MOVEM G,TYOCNT
; MOVE G,[440700,,TYOBUF]
; MOVEM G,TYOBP
; MOVE G,[TYOBUF,,TYOBUF+1]
; SETZM TYOBUF
; BLT G,TYOBUF+TYOBFL-1
; POPJ P,
FPUT: POPJ P, ;MOVNI G,4
; ADDM G,TYOCNT
; MOVEI G,TYOBFL*5
; SUB G,TYOCNT
; IDIVI G,5 ;WORDS
; JUMPE G,CPOPJ
; MOVNS G
; MOVSS G
; HRRI G,TYOBUF
DSPTYO: .IOT GOCH,G
POPJ P,
;SET UP CHARACTER (8 BIT) BYTE POINTER
SETCBP: SETZM DCHCNT ;# OF BYTES EXTRACTED
MOVE E,DLPC
MOVEI G,10 ;10 BIT BYTES
DPB G,[300600,,E]
MOVEM E,DCHBP ;HIGH ORDER PDP11 BYTE
IBP E
MOVEM E,DCHBP+1 ;LOW ORDER
POPJ P,
;ADD WORD TO STUFF TO BE SENT TO GT40
ADBYTC: SKIPA G,C
ADBYTB: MOVE G,B
ADBYTE: SOSGE DLFBYTE ;DISPLAY LIST FREE BYTES
.VALUE ;OVERFLOW
SKIPE DCHCNT
PUSHJ P,ADNUL ;ADD A NULL CHAR
IBP DCHBP ;INC CHARACTER BYTE POINTERS
IBP DCHBP
IBP DCHBP+1
IBP DCHBP+1
AOS DLBCNT ;BYTE COUNT
IDPB G,DLPC ;HALF WORD INTO DISPLAY LIST
POPJ P,
;ADD A NULL CHAR
ADNUL: PUSH P,W
SETZ W,
PUSHJ P,ADCHR
POP P,W
POPJ P,
;ADD THE CHAR IN W
ADCHR: PUSH P,G
SOSGE G,DCHCNT
JRST .+3 ;HIGH ORDER
IBP DLPC ;LOW ORDER, STARTING A NEW PDP11 WORD
AOS DLBCNT
MOVMS G,DCHCNT ;USE G AS INDEX TO WHICH BYTE POINTER TO USE
IDPB W,DCHBP(G)
IBP DCHBP(G)
JRST GPOPGJ
GETBYT: SOS C,DCHCNT ;DCHCNT IS NOW FLAG FOR WHICH ORDER PDP11 BYTE
MOVMS C,DCHCNT
ILDB G,DCHBP(C)
IBP DCHBP(C)
POPJ P,
;VARIABLES
CKS: 0 ;CHECKSUM SENT ON LAST BLOCK
TYOCNT: 0 ;TYO BUFFER BYTE COUNTER
TYOBP: 0 ;BYTE POINTER INTO TYOBUF
TYOBUF: BLOCK TYOBFL
GDYZFL: 0
DLBFSZ==100
DLBF: BLOCK DLBFSZ
DLPC: 0 ;BYTE POINTER TO GT40 LIST BUFFER
DLFBYTE:DLBFSZ ;DISPLAY LIST FREE BYTES
DLBCNT: 0 ;DISPLAY LIST BYTE COUNT
DCHBP: BLOCK 2 ;HIGH & LOW ORDER PDP11 BYTE PNTRS
DCHCNT: 0 ;PDP11 BYTE COUNT
GCMND: 0 ;COMMAND FOR VARIABLE LENGTH BLOCKS
GSTORE: BLOCK MXARS ;SET GRAPHICS MODE WORD FOR EACH ARRAY, INDEX BY A
GXPOS: BLOCK MXARS ;GT40'S X POSITION
GYPOS: BLOCK MXARS ;AND Y POSITION
GMODE: 71000,,GSTORE(A) ;BYTE POINTER FOR MODE BITS
GTTY: SIXBIT / T34/ ;GT40 TELETYPE
GTYI: 4,,0 ;IMAGE INPUT
GTYO: 45,,0 ;SUPERIMAGE OUTPUT
GTCSW: 0 ;0 IF GT40 CHANNELS CLOSED
GERCH: 0 ;ERROR CHAR FROM GT40
PATCH: BLOCK 200
GTEST: SKIPE FUNCTI
POPJ P,
MOVEI G,1
MOVEM G,FUNCTI
MOVEI G,1000
MOVEM G,XARG
MOVEI G,600
MOVEM G,YARG
POPJ P,