mirror of
https://github.com/PDP-10/its.git
synced 2026-01-30 13:36:42 +00:00
When SYS; ATSIGN 10SLAV is assembled with GT40F=1, the type of display is selected at run time from an argument to DISINI.
681 lines
14 KiB
Plaintext
Executable File
681 lines
14 KiB
Plaintext
Executable File
|
||
;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,
|
||
|