1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-27 12:42:10 +00:00
Files
PDP-10.its/src/syseng/scrimp.163
Lars Brinkhoff 6b354ee386 SCRIMP - XGP unspooler.
Update source code for FNR move to SYSEN2.
2018-11-15 05:48:54 +01:00

2422 lines
47 KiB
Plaintext
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.
TITLE SCRIMP
;THE MIT XGP UNSPOOLER PITTS JARVIS 4/13/74
;PLOT AND SCAN ADDED BY TK
;SQUISH COMMAND ADDED BY GLS AND H 4/14/75
.MLLIT==1
;AC ASSIGNMENTS
A=1
B=2
C=3
D=4
E=5
T=6 ;SUPER TEMPORARIES, NOT PRSERVED OVER SUBROUTINE CALLS
TT=7
X=10
Z=11
Y=12
X0=13
Y0=14
FONT=15 ;FONT INDEX
CHNL=16 ;TEN TO 11 CHANNEL
P=17
.XCREF A B C D E T TT X Z Y X0 Y0 FONT CHNL P XX
NCHNL==3 ;# OF CHANNELS WE ARE WILLING TO ADMIT
COCHNL==0 ;COMMAND OUT
CICHNL==1 ;COMMAND IN
DOCHNL==2 ;DATA OUT
;TIME SHARING I/O CHANNELS
TTYICH==0
TTYOCH==1
FNTICH==2
TXTICH==3
ERRICH==4
LAMBDA==10.*60. ;10 SECOND TIME OUT ON XGP
XGP11==1 ;IDENTIFICATION # OF XGP PDP-11
MAXFNT==20 ;MAXIMUM # FONTS WE WILL SEND TO PDP11
TTY1==3 ;ONLY THESE TTYS CAN SEND TO XGP
TTY2==24
CLKINT==200000 ;REAL TIME INTERRUPT, LEFT HALF
IOCINT==400 ;IO CHANNEL ERROR, RIGHT HALF
MAPMSK==574377776000 ;MASK TO TYPE 10-11 MAP TABLE ENTRIES
DEFINE CONC A,B,C
A!B!C
TERMIN
MK==117. ;MAX NUMBER OF BLOCKS ALLOWABLE FOR PLOT FILES
WDSPL==51.+2
YBITL==51.*32.
XBITL==11.*200.
BYTMAX==52.*4
LOC 42
JSR TSINT
LOC 100
GO: MOVE P,[-PDL,,PDB-1] ;GET A PDL
.OPEN TTYICH,[(SIXBIT /TTY/)] ;OPEN THE TTY
.VALUE
.OPEN TTYOCH,[1,,(SIXBIT /TTY/)]
.VALUE
.SUSET [.RIOC+TTYOCH,,A]
HLRZS A
ANDI A,77
MOVEM A,TTYNUM
CAIE A,TTY1
.VALUE [ASCIZ /:USE T03 (TELETYPE 35 NEAR XGP-11)
/]
.LOGOUT ;I HATE THOSE GOD DAMN BAG BITERS WHO TRY TO MAKE ME TOP LEVEL
PUSHJ P,VERTYP
.CORE ICORE ;REDUCE TO INITIAL CORE
.LOSE
SKIPN TXTSNM
.SUSET [.RSNAM,,TXTSNM]
SETZM DSKCMD
SETZM NOTYPE
MOVEI A,LNKVPG
MOVEM A,T11PAG
.CALL [ SETZ
SIXBIT /T11MP/
T11PAG
SETZ [<3_34.>\1777\<LNKV_10>\<XGP11_26.>]]
.VALUE NOPDP11
SKIPN 10LNKV
.HANG ;WAIT FOR 11 TO SET THINGS UP
MOVE A,[CLKINT,,IOCINT]
MOVEI B,1_<TTYICH>
.SETM2 A,
MOVE A,[200000,,B]
MOVEI B,LAMBDA ;XGP TIME OUT
.REALT A,
JFCL
PUSH P,[442000,,10LNKV]
ILDB A,(P) ;POINTS AT CHANNEL HEADERS
ILDB B,(P) ;# CHANNELS
IMULI B,BPRCHL ;# BYTES IN AREA
PUSHJ P,GET11 ;GET THAT PAGE
ILDB A,(P) ;ORIGIN OF BUFFER AREA
ILDB B,(P) ;SIZE (BYTES)
MOVEM A,BUFORG
SUB P,[1,,1]
PUSHJ P,GET11 ;GET BUFFER IN MAP
MOVEI CHNL,COCHNL
PUSHJ P,OPEN
;FALLS THROUGH
;MAIN LOOP
RECYCL: SETOM SET ;NO ERRORS FLAG
MOVE P,[-PDL,,PDB-1] ;RESET THE STACK
MOVEI CHNL,COCHNL
SETZB FONT,HDRCNT
SETZM DFHDRF
PUSHJ P,OPEN ;OPEN UP THE DATA CHANNEL
PUSHJ P,VRESET ;RESET VAIABLES
PUSHJ P,FRESET ;RESET FONTS
PUSHJ P,PRESET ;RESET PRINT FILE NAME AND DEVICE
PUSHJ P,COMMAN ;GET COMMAND FROM TTY OR OTHER
PUSHJ P,TXTOPN ;OPEN TEXT INPUT FILE
PUSHJ P,TXTFNF ; FILE NOT FOUND
SKIPN TXTCMD
JRST RECYC1 ;DON'T READ COMMANDS
SKIPGE SET
PUSHJ P,RTXTCM ;READ SETTINGS FROM TXTFILE
RECYC1: SKIPN SQSHFL ;SQUISH?
JRST RECYC2 ; NO
SKIPL SET
JRST RECYCL
PUSHJ P,PRESCN ; MUST PERFORM PRE-SCAN
PUSHJ P,TXTOPN
PUSHJ P,TXTFNF ;CONFUSION
RECYC2: SKIPL SET
JRST RECYCL
PUSHJ P,FONTS ;SEND THOSE FONTS
MOVEI FONT,0
SKIPL SET
JRST RECYCL ;ERRORS HAVE HAPPENED
PUSHJ P,SNDTXT ;SKIP PAGES AND SEND REMAINDER
.CLOSE TXTICH,
JRST RECYCL
;THIS IS THE FILE NAME READER
.INSRT SYSEN2; FNR >
;SCRIMPY INTERRUPT ROUTINES
TSINT: 0
0
PUSH P,A
SKIPGE A,TSINT
JRST TTYBRK ;TTY CHANNEL INTERUPT
TLZE A,CLKINT
JRST TSCLK ;CLOCK INTERUPT
TRZE A,IOCINT
JRST IOCERR ;IO CHANNEL ERROR
JRST TSX
TTYBRK: TRZN A,1_<TTYICH>
JRST TSX
MOVEI A,TTYICH
.ITYIC A,
JRST TSX
CAIN A,^G
PUSHJ P,CNTRLG ;STOP THE WORLD, HE TYPED CONTROL-G
TSX: POP P,A
.DISMI TSINT+1
TSCLK: MOVE A,ABORTL
TLZ A,777774
JUMPE A,TSX
POP P,A
.DISMI [CRASH]
;HERE FOR IO CHANNEL ERROR
IOCERR: MOVEI B,[ASCIZ /IO CHANNEL ERROR: /]
PUSHJ P,OUTSTR
.SUSET [.RBCHN,,A]
CAIN A,FNTICH ;IS IT FONT LOSSAGE
JRST [ PUSHJ P,FNTFNF
JRST IOCER1]
CAIN A,TXTICH ;PERHAPS IT IS THE TEXT FILE
JRST [ PUSHJ P,TXTFNF
JRST IOCER1]
PUSHJ P,ERRTYP ;HUH? WHAT'S THIS CHANNEL
IOCER1: MOVEI A,40 ;PUT A SPACE AT END
PUSHJ P,TYO
.CLOSE TXTICH,
.CLOSE FNTICH,
SETOM ABORTF ;TRY ABORTING THE LISTING
.DISMI [CRASH]
;HERE FOR CONTROL-G TYPED AT CONSOLE, GOBBLE UP ALL HIS TYPE IN
CNTRLG: SETOM ABORTF
PUSHJ P,TYI
CAIE A,^G
JRST .-2
POPJ P,
;COMMAND LINE SCANNER
COMMAN: PUSHJ P,SOUT ;CARRIAGE RETURN AND STAR
PUSHJ P,TTYLIN ;GET TTY LINE INTO COMAND BUFFER
COMAN1: MOVE B,[PUSHJ P,COMGET]
MOVE C,[-1,,["_]] ;BREAK TABLE
JSR FNR"GETFIL ;NON-SKIP RETURN FOR NULL FILE SPEC
JRST [ CAIN A,";
JRST ALTER
PUSHJ P,HUH
JRST COMMAN]
SETZM TXTFN1
SETZM TXTFN2
JUMPE E,GETFNT
MOVEM E,TXTFN1 ;FN1
SKIPN T
MOVSI T,360000 ;GREATER THAN
MOVEM T,TXTFN2 ;FN2
SKIPE TT
MOVEM TT,TXTSNM ;SNAME
SKIPE D
MOVEM D,TXTO ;DEV
GETFNT: SETZM ABORTF
CAIN A,15
PUSHJ P,COMGET ;IGNORE CARRIAGE RETURNS
CAIN A,12
POPJ P, ;END OF LINE
CAIE A,"_
SKIPA B,[[ASCIZ /IGNORING FONT SPEC/]]
PUSHJ P,GETF0 ;READ FONT FILE NAMES
JRST COMERR
POPJ P,
;ROUTINE TO READ FONT FILE NAMES
GETF0: MOVE C,[-1,,[",]]
MOVEI FONT,0
GETF0A: PUSH P,FONT
JSR FNR"GETFIL
JRST GETF2
MOVE FONT,(P)
JUMPE E,GETF1
MOVEM E,FNTFN1(FONT) ;FNAM1
SKIPN T
MOVSI T,'KST
MOVEM T,FNTFN2(FONT) ;FNAM2
GETF1: SKIPN TT
MOVE TT,FNTSNM ;DEFAULT SNAME
MOVEM TT,FNTSNM(FONT)
SKIPN D
MOVSI D,'DSK ;DEFAULT DEVICE
MOVEM D,FNTO(FONT)
SETOM FCHFLG(FONT)
CAIN A,15
PUSHJ P,COMGET ;IGNORE CARRIAGE RETURNS
GETF2: POP P,FONT
CAIN A,12
JRST POPJ1 ;A-OK
ADDI FONT,FNTVLN
CAIGE FONT,MAXFNT*FNTVLN
CAIN A,",
JRST GETF0A ;GO BACK FOR MORE
MOVEI B,[ASCIZ /IGNORING JUNK AT END OF FONT SPECS/]
POPJ P,
;TTY LEVEL COMMAND RETURN
COMERR: PUSH P,A
COMER1: PUSHJ P,TERPRI
POPXIT: POP P,A
COMXIT: CAIN A,12
POPJ P,
PUSHJ P,COMGET
JRST COMXIT
HUH: MOVEI B,[ASCIZ /???/]
JRST COMERR
;ALTER MODE COMES HERE
ALTER: PUSHJ P,SPCSKP ;SKIP OVER SPACES, TABS, AND CRS
CAIN A,12
JRST COMMAN ;IGNORE BLANK ALTER COMMANDS
ALTCOM: PUSHJ P,DECODE
JRST [ PUSHJ P,HUH
JRST COMMAN] ;UNDEFINED COMMAND
PUSHJ P,SPCSKP
SETZM ABORTF
MOVE C,COMTAB(B)
PUSHJ P,(C)
PUSHJ P,COMERR ;ROUTINE LOST, TELL THE PEOPLE WHY
PUSHJ P,COMXIT ;GOBBLE UP REST OF LINE
JRST COMMAN ;BACK TO PRINT MODE
;HERE TO SKIP OVER SPACES IN COMMAND LINE
SPCSKP: CAIN A,12 ;DON'T SKIP OVER LINE FEED
POPJ P,
SPCSK1: PUSHJ P,COMGET
SPCSK2: CAIE A,40
CAIN A,11
JRST SPCSK1
CAIN A,15
JRST SPCSK1
POPJ P,
;COMMAND DISPATCH TABLE
DEFINE XX NAME,ROUTIN
[SIXBIT /NAME/],,ROUTIN
TERMIN
;SHOULD BE IN ALPHABETICAL ORDER
;ALL THESE ROUTINES SHOULD SKIP RETURN IF NO ERRORS
; ERROR RETURN WITH POINTER TO ASCIZ STRING IN B
; NORML RETURN
COMTAB:
XX AUTCUT,SETCUT
XX BOTMAR,SETBOT
XX FFCUT,SETFFC
XX HEADER,HEADER
XX HEIGHT,SHWHGT
XX HELP,HELP
XX KILL,KILL
XX KSET,KSET
XX LFTMAR,SETLFT
XX LIST,LIST
XX LSP,SETLSP
XX LOGOUT,LOGOUT
XX NLINES,SETLIN
XX PLOT,PLOT
XX PRINT,PRINT
XX RESET,RESET
XX ROTATE,ROTATE
XX SAMPLE,SAMPLE
XX SCAN,SCAN
XX SHOW,SHOW
XX SIZE,SIZE
XX SKIP,SETPSK
XX SNDFNT,FONTSA
XX SQUISH,SQUISH
XX TEST,SETTST
XX TOPMAR,SETTOP
XX TXTCMD,SETXTC
XX VERSE,VERSE
XX VSP,SETVSP
XX X0,SETX0
XX Y0,SETY0
COMTBL==.-COMTAB
;READS COMMANDS FROM TEXT FILE
RTXTCM: AOSN ABORTF
JRST [ AOS SET
POPJ P,]
PUSH P,UDEPTH ;TO SEE IF IT CHANGES
PUSH P,DSKCMD
SETOM DSKCMD
TXTCM1: SKIPL DSKCMD
JRST TXTCXT
PUSHJ P,DSKLIN ;GET COMMAND FROM DISK
PUSHJ P,COMGET ;GET COMMAND CHARACTER
CAIN A,^M
JRST TXTCM1 ;IGNORE NULL LINE
CAIE A,";
JRST TXTCXT ;EXIT
PUSHJ P,SPCSKP
CAIN A,12
JRST TXTCM1 ;IGNORE NULL COMMAND LINE
MOVEI B,COMBUF
PUSH P,A
SKIPN NOTYPE
PUSHJ P,OUTSTR ;LET HIM KNOW WHAT'S GOING ON
POP P,A
PUSHJ P,DECODE
JRST TXTCXT ;NOT IN TABLE, GO AWAY
PUSHJ P,SPCSKP
MOVE C,COMTAB(B)
PUSHJ P,(C)
JFCL ;IGNORE LOSSAGE
PUSHJ P,COMXIT
JRST TXTCM1
;HERE TO EXIT TEXT FILE COMMAND READER
TXTCXT: POP P,DSKCMD
PUSHJ P,TXTOPN ;REOPEN, IT MIGHT EVEN BE A DIFFERENT FILE
JRST [ AOS SET ;LOSSAGE
POP P,(P) ;FLUSH UDEPTH
JRST TXTFNF]
POP P,A
CAME A,UDEPTH
JRST RTXTCM ;THAT WAS THE COMMAND FILE, NOW READ THE PRINT FILE
POPJ P,
;HERE TO DECODE COMMAND
DECODE: MOVE C,[440600,,D]
TDZA D,D
DECOD1: PUSHJ P,COMGET
PUSHJ P,CVSIX ;CONVERT TO SIX BIT
JUMPL B,[ CAIN A,15
PUSHJ P,COMGET ;IGNORE CARRIAGE RETURNS
CAIN A,12
JRST DECOD2
POPJ P,] ;COMMAND NOT UNDERSTOOD
JUMPE B,DECOD2 ;SEARCH COMMAND TABLE
TLNE C,770000
IDPB B,C ;ONLY 6 CHARACTERS
JRST DECOD1
;LOOK UP COMMAND IN D
DECOD2: JUMPE D,[ CAIN A,":
JRST DECODE ;DON'T SCREW FOR LEADING COLON
POPJ P,] ;ERROR
MOVEI B,COMTBL-1
DECOD3: MOVS C,COMTAB(B)
CAMN D,(C)
JRST POPJ1 ;FOUND HIM
SOJGE B,DECOD3
POPJ P, ;NOT FOUND
;CONVERT A TO SIXBIT, LEAVE RESULT IN B
CVSIX: CAIN A,11
MOVEI A,40
MOVNI B,1 ;ASSUME NOT SIXBIT
CAIL A,40
CAILE A,"_
JRST CVSIX1 ;MIGHT BE LOWER CASE
MOVEI B,-40(A) ;ITS UPPER CASE
POPJ P,
CVSIX1: CAIL A,"a
CAILE A,"z
POPJ P, ;NOT SIXBIT
MOVEI B,-100(A)
POPJ P,
;READ IN A DECIMAL NUMBER AND LEAVE RESULT IN D
; NON-SKIP RETURN, NUMBER NOT READ
;BREAK CHARACTER LEFT IN A
DECIN: MOVEI C,1 ;SIGN
CAIN A,"-
PUSHJ P,[ MOVNI C,1 ;NEGATIVE NUMBER
JRST COMGET]
PUSHJ P,CVDIG ;CONVERT CHARACTER CODE TO DIGIT
JUMPL B,CPOPJ ;NOT A DIGIT, NO NUMBER THERE
TDZA D,D
DECIN1: PUSHJ P,COMGET
PUSHJ P,CVDIG ;LEAVE DIGIT IN B
JUMPL B,[ JUMPGE C,POPJ1
MOVNS C
MOVNS D
JRST POPJ1]
IMULI D,10.
IMULI C,10. ;KEEP TRACK OF DIGITS READ
ADD D,B
JRST DECIN1
;COVERT DIGIT IN A TO NUMBER
CVDIG: MOVNI B,1 ;ASSUME FAILURE
CAIL A,"0
CAILE A,"9
POPJ P, ;FAILURE
MOVEI B,-"0(A)
POPJ P,
;GET POSITIVE ARGUMENT
; NON-SKIP RETURN FOR FAILURE
POSARG: PUSHJ P,ARGIN
POPJ P,
JUMPL D,CPOPJ
JRST POPJ1
ARGIN: PUSHJ P,DECIN
POPJ P, ;ERROR RETURN
PUSHJ P,SPCSK2
CAIN A,12
AOS (P)
POPJ P,
;ALTER MODE ACTION ROUTINES
SCAN: MOVEI A,SCAN2
MOVEM A,SCNRET
PUSHJ P,SCNFN
JRST [ MOVEI B,[ASCIZ /???/]
POPJ P,]
SCAN2: .SUSET [.SSNAM,,TXTSNM]
.CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.BII ? 1000,,TXTICH
TXTO ? TXTFN1 ? TXTFN2 ? SETZ TXTSNM]
JRST [ SKIPGE DELUP ;PRINT ERROR MESSAGE ONLY FOR SINGLE FILE
AOSA (P)
PUSHJ P,TXTFNF
MOVEI B,0
POPJ P,]
SKIPGE DELUP'
PUSHJ P,SFNPNT
MOVEI A,SBUF
SCAN1: HRRZ B,A
LSH B,-12
CAILE B,MK+1
JRST SEOF
.CORE 1(B)
.VALUE
HRLI A,-2000
.IOT TXTICH,A
JUMPL A,SEOF
MOVEI B,SEOF+MK*2000
CAIL B,(A)
JRST SCAN1
SEOF: .CLOSE TXTICH,
PUSH P,A
MOVEI A,2
PUSHJ P,CMDO
PUSHJ P,CMDOF
MOVEI A,30.
.SLEEP A,
POP P,A
SUBI A,SBUF
HRRZS A
LSH A,-12
AOS A
PUSH P,A
MOVE D,A
PUSHJ P,DECPNT
MOVEI B,[ASCIZ /K CORE LOCKED
/]
PUSHJ P,OUTSTR
POP P,A
HRL A,A
HRRI A,SBUF_-12
.CALL XGPPLT
JRST XPLTL
MOVEI A,30.*30.
.SLEEP A,
.CORE SBUFP
.VALUE
SKIPL DELUP
JRST POPJ1
.CALL [SETZ ? 'DELETE
CHSTS ? CHSTS+1 ? CHSTS+2 ? SETZ CHSTS+3]
JFCL
JRST @SCNRET
SFNPNT: MOVE A,[TXTICH,,CHSTS]
.RCHST A,
MOVE A,TXTSNM
MOVEM A,CHSTS+3
HRLZS CHSTS
MOVEI A,CHSTS
PUSHJ P,PNTFNM
JRST TERPRI
XPLTL: MOVEI B,[ASCIZ /XGP LOSSAGE!
/]
PUSHJ P,OUTSTR
.CORE SBUFP
.VALUE
POPJ P,
XGPPLT: SETZ
SIXBIT /XGPIM/
SETZ A
SCNFN: MOVE D,[SIXBIT /DSK/]
MOVEM D,TXTO
SETZM DELUP
PUSHJ P,COMBAC
MOVE B,[PUSHJ P,COMGET]
MOVEI C,[0]
JSR FNR"GETFIL
POPJ P,
CAMN E,[SIXBIT /*/]
JSP B,[ SETOM DELUP
MOVSI E,(SIXBIT /</)
JRST (B) ]
ALLFIL: SKIPN E
POPJ P,
SKIPN T
MOVSI T,(SIXBIT /SCN/)
SKIPN TT
MOVE TT,TXTSNM
MOVEM TT,TXTSNM
MOVEM E,TXTFN1
MOVEM T,TXTFN2
SKIPE D
MOVEM D,TXTO
JRST POPJ1
PLOT: MOVEI A,PLOT2
MOVEM A,SCNRET'
PUSHJ P,SCNFN
JRST [ MOVEI B,[ASCIZ /???/]
POPJ P,]
MOVE A,TXTFN2
CAMN A,[SIXBIT /SCN/]
MOVE A,[SIXBIT /PLX/]
MOVEM A,TXTFN2
.SUSET [.SSNAM,,TXTSNM]
PLOT2: .CORE SBUFP
.VALUE
.CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.BII ? 1000,,TXTICH
TXTO ? TXTFN1 ? SETZ TXTFN2 ]
JRST [ SKIPGE DELUP ;PRINT ERROR MESSAGE ONLY IF SINGLE FILE
AOSA (P)
PUSHJ P,TXTFNF
MOVEI B,0
POPJ P,]
.CORE SBUFP+MK+1
.VALUE
SKIPGE DELUP
PUSHJ P,SFNPNT
MOVEI TT,M1 ;initialize TT to up position
MOVE X0,INITX0 ;initial x coordinate
MOVE Y0,INITY0 ;inital y coordinate
LOOP: MOVE A,[-BUFL,,BUF] ;file buffer
.IOT TXTICH,A
MOVNI A,-BUF(A) ;get number of words really transferred
JUMPE A,SLLUP ;empty buffer, finished with file, convert to run length
HRLZS A ;get length of stuff transferred
HRRI A,BUF ;construct aobjn pointer
MOVE B,(A)
M1: JFFO B,DOIT ;dispatch on bits set
AOBJN A,.-2 ;end of this word, pick up next word of file
JRST LOOP ;back for another buffer full
BUF: BLOCK 200
BUFL==.-BUF
DOIT: ANDCM B,BITAB(C) ;clear bit for next dispatch
XCT DOBIT(C) ;dispatch on bit position of set bit
JRST (TT) ;write the bit into the bit map or not
DOBIT: BLOCK 36.
PLTD1: REPEAT 5,[
JRST M1 ;IGNORED
MOVEI TT,WRITE ;PENDOWN
MOVEI TT,M1 ;PENUP
SOJA X0,(TT)
AOJA X0,(TT)
SOJA Y0,(TT)
AOJA Y0,(TT)
]
JRST M1 ;IGNORED
PLTD2: REPEAT 5,[
JRST M1
MOVEI TT,WRITE
MOVEI TT,M1
AOJA Y0,(TT)
SOJA Y0,(TT)
SOJA X0,(TT)
AOJA X0,(TT)
]
JRST M1
BITAB: REPEAT 36.,1_<35.-.RPCNT>
WRITE: HRRZ X,X0 ;pick up x position of bit to write
TDNN B,MORMSK(D) ;don't mark till all motion done
CAIL X,XBITL ;out of range?
JRST M1 ;yes, ignore it
IMULI X,WDSPL ;words per scan line
HRRZ Z,Y0 ;pick up y position
CAIL Z,YBITL ;out of range?
JRST M1 ;yes, ignore
LSHC Z,-5 ;word # in line into z, bit position in high part of y
ADD X,Z ;add in the word number in the line
LSH Y,-<36.-5> ;move the bit position into spot to index with
MOVE Z,BITAB(Y) ;pick up the bit we really want to use
IORM Z,BITBUF(X) ;zap it into the buffer
JRST M1 ;back for another bit in the file
CNTER==36.
MORMSK: REPEAT 5,[
CNTER==CNTER-7
0
0
0
7_CNTER
3_CNTER
1_CNTER
0
]
;this routine converts the bit map just produced into a possibly more compact
;representation, using the run length encoding option. It can never result
;in a longer representation, since it can always use the image representation
;if that is more efficient
SLLUP: .CLOSE TXTICH,
MOVE A,LFTMAR
MOVEM A,VPOS'
MOVEI A,SBUF
MOVEM A,FPTR'
MOVEI A,BITBUF
SLLUP1: AOS VPOS
PUSH P,A
PUSHJ P,CNVRT
POP P,A
JUMPE B,SLLUP2
MOVE C,FPTR
MOVE D,B
ADDI D,1 ;FOR THE EXTRA POSITION/LENGTH WORD
LSH D,1
DPB D,[242000,,(C)]
MOVE D,VPOS
DPB D,[042000,,(C)]
AOS C
MOVE D,C
ADD D,B
MOVEM D,FPTR
HRLI C,BYTBF ;SOURCE
BLT C,-1(D)
SLLUP2: ADDI A,WDSPL
CAIGE A,BITBUF+MK*2000
JRST SLLUP1
MOVE A,FPTR
HRLI A,442000
MOVEI B,2
IDPB B,A
MOVEI B,XBITL+100
ADD B,LFTMAR
TRO B,100000
IDPB B,A
SETZM 1(A)
AOS FPTR
AOS A,FPTR
JRST SEOF
CNVRT: SETZM LSTBB'
SETZM BYTCNT'
SETZB E,D ;BIT COUNT, LAST DIFFERENT BIT COUNT
MOVEI C,0
JSP T,DEP
JFCL
MOVEI C,0
JSP T,DEP
JFCL
HRLI A,-WDSPL+2
W1: MOVE B,(A)
W2: JFFO B,DOW ;FOUND A BLACK BIT
W3: ADDI D,32. ;ALL BITS OF THIS WORD WHITE
AOBJN A,W1
MOVE C,LSTBB
MOVEM C,BYTCNT ;BACKUP BYTE BUFFER TO LAST BLACK BITS
REPEAT 3,[ MOVEI C,0 ;ESCAPE CODE
JSP T,DEP
JRST IMSL
]
MOVEI C,1
JSP T,DEP
JRST IMSL
JRST ESL
B1: SETCM B,(A)
B2: JFFO B,DOB ;FOUND A WHITE BIT
B3: ADDI D,32.
AOBJN A,B1
MOVEI C,0
JRST DOB ;PRETEND WE JUST GOT A WHITE BIT
DOW: ANDCA B,MTB(C)
CAIL C,40
JRST W3
ADD C,D ;BIT POSITION OF THIS BIT
EXCH C,E ;LAST CHANGE UPDATE
SUBM E,C ;DIFFERENCE IN C
DOW2: CAILE C,377
JRST DOW1
JSP T,DEP
JRST IMSL
JRST B2
DOW1: MOVEM C,TEMP'
MOVEI C,377
SUBM C,TEMP
JSP T,DEP
JRST IMSL
JSP T,DEP
JRST IMSL
MOVN C,TEMP
JRST DOW2
DOB: ANDCA B,MTB(C)
CAIL C,40
JRST B3
ADD C,D
EXCH E,C
SUBM E,C
DOB2: CAILE C,377
JRST DOB1
JSP T,DEP
JRST IMSL
MOVE C,BYTCNT
MOVEM C,LSTBB ;SAVE LAST BYTE USED FOR BLACKNESS
JRST W2
DOB1: MOVEM C,TEMP
MOVEI C,377
SUBM C,TEMP
JSP T,DEP
JRST IMSL
JSP T,DEP
JRST IMSL
MOVN C,TEMP
JRST DOB2
MTB: REPEAT 36.,[
<-1>_<-.RPCNT>
]
DEP: MOVE X,BYTCNT
CAIL X,BYTMAX ;CAN WE DO BETTER IN IMAGE MODE?
JRST (T) ;YES
MOVE Y,X
ANDI Y,3
LSH X,-2
DPB C,BYTAB(Y) ;DEPOSIT IN THE KLUDGY FORMAT WANTED BY THE XGP
MOVEI C,0
AOS BYTCNT
JRST 1(T)
BYTAB: 241000,,BYTBF(X)
341000,,BYTBF(X)
041000,,BYTBF(X)
141000,,BYTBF(X)
BYTBF: BLOCK WDSPL
;GET HERE WHEN THE RUN LENGTH ENCODED VERSION IS LONGER THAN AN IMAGE SCAN LINE,
;AND WE WANT TO CONVERT THE BIT MAP INTO AN IMAGE SCAN LINE.
IMSL: MOVE A,-1(P) ;POINTER TO BEG OF BIT MAP
HRLI A,-WDSPL+2
SETOM LSTBB ;WE HAVE BLACKNESS IN THIS LINE
SETZM BYTCNT ;START AT BEG OF THE BYTCOUNT
MOVEI C,0 ;ESC
JSP T,DEP
JFCL
MOVEI C,2 ;ENTER IMAGE MODE
JSP T,DEP
JFCL
IMSL1: MOVE C,(A) ;PICKUP WORD FROM BIT MAP
CIRC C,44 ;REVERSE BIT ORDER
MOVE C,D ;PICKUP FIRST 8 BITS
JSP T,DEP
JFCL
LSH D,-8 ;NEXT 8, ETC.
MOVE C,D
JSP T,DEP
JFCL
LSH D,-8
MOVE C,D
JSP T,DEP
JFCL
LSH D,-8
MOVE C,D
JSP T,DEP
JFCL
AOBJN A,IMSL1 ;BACK FOR THE NEXT BIT MAP WORD
ESL: MOVE B,BYTCNT
ADDI B,3 ;ROUND OFF TO NEXT HIGHER WORD
LSH B,-2 ;FOUR BYTES/WORD
SKIPN LSTBB
MOVEI B, ;RETURN ZERO IF THIS LINE IS NULL
POPJ P,
;READ ONLY MEMORY
SHWHGT: SKIPE NOTYPE
JRST POPJ1
MOVEI E,HEIGHT
ROMSHW: CAIE A,12
JRST ALTHUH
SHWARG: SKIPE NOTYPE
JRST POPJ1
MOVE D,(E)
PUSH P,A
PUSHJ P,DECPNT
JRST POPAJ1
;HERE TO GIVE # TEXT LINES
SETLIN: SKIPE NOTYPE
JRST POPJ1
MOVEI E,NLINES
JRST ROMSHW
VERSE: CAIE A,12
JRST BADARG
PUSHJ P,VERTYP ;TYPE OUT VERSION #
PUSHJ P,CRLF ;RESTORES A TO RIGHT THING!
JRST POPJ1
;POSITIVE ONLY VARIABLES
ONEARG: CAIN A,12
JRST SHWARG ;NO ARG, SHOW WHAT WE HAVE
PUSHJ P,POSARG
JRST BADARG
MOVEM D,(E)
JRST POPJ1
SETLFT: MOVEI E,LFTMAR
JRST ONEARG
SETTOP: SKIPA E,[TOPMAR]
SETBOT: MOVEI E,BOTMAR
SETVS1: PUSHJ P,ONEARG
JRST BADARG
SETVS2: PUSHJ P,CALINE ;RECALCULATE NLINES
JRST POPJ1
SETLSP: CAIE A,12
PUSHJ P,POSARG
JRST SHWARG
MOVEM D,LSP
SETOM VSP ;CAN'T HAVE IT BOTH WAYS
JRST SETVS2
SETTST: MOVEI A,3
PUSHJ P,CMDO
PUSHJ P,CMDOF
JRST COMMAN
SETVSP: CAIE A,12 ;VSP IS A FUNNY ONE
PUSHJ P,POSARG
JRST BADARG
MOVEM D,VSP
SETOM LSP
JRST SETVS2
ROTATE: MOVSI A,PLTD2
HRRI A,DOBIT
BLT A,DOBIT+43
JRST POPJ1
;ANY VALUE LEGAL VARIABLES
SETX0: SKIPA E,[INITX0]
SETY0: MOVEI E,INITY0
JRST ANYVAL
SETFFC: MOVEI E,FFCUT ;CAUSES XGP TO CUT ONLY ON FORM FEED
JRST ANYVAL
SETXTC: SKIPA E,[TXTCMD]
SETCUT: MOVEI E,AUTCUT
ANYVAL: CAIN A,12
JRST SHWARG
PUSHJ P,ARGIN
JRST BADARG
MOVEM D,(E)
JRST POPJ1
;MISCELLANEOUS ROUTINES
HEADER: SETZM HDRCNT ;SETS HEADING TEXT
CAIN A,12 ;NULL HEADER
JRST POPJ1 ; IS EASY
MOVEI B,HDRTXL*5 ;SIZE OF BUFFER
MOVE C,[440700,,HDRTXT]
HEAD1: PUSHJ P,COMGET
SOSL B ;DON'T OVERFLOW BUFFER
IDPB A,C
AOS HDRCNT
CAIE A,12 ;GO UNTIL WE FIND A LINE FEED
JRST HEAD1
JUMPGE B,POPJ1 ;JUMPE IF ALL IS OKAY
MOVEI B,[ASCIZ /HEADER TRUNCATED/]
POPJ P,
LIST: SETOM DFHDRF ;FLAG FOR DEFAULT HEADER
PRINT: SKIPE DSKCMD
JRST PRINT1 ;DIFFERENT THINGS FOR DSK COMNMANDS
MOVEM A,(P) ;CLOBBER RETURN ADDRESS
MOVEI B,[ASCIZ /PRINT MODE/]
PUSHJ P,TERPRI
POP P,A
CAIN A,12
JRST COMMAN
PUSHJ P,COMBAC
JRST COMAN1 ;READ THE FILE SPEC THAT'S THERE
;HERE TO FOR PRINT COMMAND WHILE READING DISK COMMANDS
PRINT1: AOSE UDEPTH
JRST POPJ1 ;ONLY ALLOW 1 LEVEL
PUSHJ P,COMBAC ;UNREAD THE LAST CHARACTER
MOVE B,[PUSHJ P,COMGET]
MOVEI C,0
JSR FNR"GETFIL ;NON-SKIP RETURN FOR NULL FILE SPEC
JRST POPJ1 ;IGNORE LOSSAGE
SETZM TXTFN1
SETZM TXTFN2
JUMPE E,POPJ1
MOVEM E,TXTFN1 ;FN1
SKIPN T
MOVSI T,360000 ;GREATER THAN
MOVEM T,TXTFN2 ;FN2
SKIPE TT
MOVEM TT,TXTSNM ;SNAME
SKIPE D
MOVEM D,TXTO ;DEV
JRST POPJ1
;LIST PRINTS FILES WITH DEFAULT HEADER (TIME, DATE, AND PAGE #)
COMBAC: MOVE B,COMPNT
PUSHJ P,DECBP ;DECREMENT BYTE POINTER
MOVEM B,COMPNT
AOS COMCNT
POPJ P,
KILL: SKIPE DSKCMD
JRST POPJ1
.VALUE [ASCIZ /:KILL
/]
LOGOUT: SKIPE DSKCMD
JRST POPJ1
.VALUE [ASCIZ /:LOGOUT
/]
SQUISH: SETOM SQSHFL ;JUST SET SQUISH FLAG
JRST POPJ1 .SEE SNDFNT
BADARG: MOVEI B,[ASCIZ /ARG???/]
POPJ P,
POPHUH: POP P,A
ALTHUH: MOVEI B,[ASCIZ /HUH/]
POPJ P,
SHOW: SKIPE NOTYPE
JRST POPJ1
PUSH P,A
MOVEI B,[ASCIZ /SKIP /]
MOVEI E,PSKIP
PUSHJ P,SHOW1
IRP VAR,,[LSP,VSP,LFTMAR,TOPMAR,BOTMAR,NLINES,AUTCUT,FFCUT,TXTCMD]
MOVEI B,[ASCIZ /VAR! /]
MOVEI E,VAR
PUSHJ P,SHOW1
TERMIN
MOVEI B,[ASCIZ /KSETS:/]
PUSHJ P,TERPRI
JRST KSET0A
KSET0: SKIPE NOTYPE
JRST POPJ1
PUSH P,A
KSET0A: MOVEI FONT,0
KSET1: PUSHJ P,KSET4
SKIPN FNTFN1(FONT)
JRST [ MOVEI B,[ASCIZ /UNSPECIFIED/]
PUSHJ P,TERPRI
JRST KSET69]
MOVEI A,FNTO(FONT)
PUSHJ P,PNTFNM ;PRINT FILE NAME
PUSHJ P,CRLF
KSET69: ADDI FONT,FNTVLN
CAIGE FONT,MAXFNT*FNTVLN
JRST KSET1
AOS -1(P) ;DO THE SKIP RETURN
JRST POPXIT
SHOW1: PUSHJ P,OUTSTR
MOVE D,(E)
PUSHJ P,DECPNT
JRST CRLF
KSET: CAIN A,12
JRST KSET0
PUSHJ P,COMBAC ;UN READ THE LAST CHARACTER
MOVE B,[PUSHJ P,COMGET]
PUSHJ P,GETF0 ;GET FONT FILE NAME (SETS UP C)
POPJ P, ;ERROR RETURN
PUSH P,A
MOVEI FONT,0
KSET2: SKIPN FNTFN2(FONT)
JRST [ SKIPN DSKCMD
SKIPE NOTYPE
JRST KSET3
PUSHJ P,KSET4
MOVEI B,[ASCIZ /NONE SPECIFIED/]
PUSHJ P,TERPRI
JRST KSET3]
MOVE A,FNTO
SKIPN FNTO(FONT)
MOVEM A,FNTO(FONT)
MOVE A,FNTSNM
SKIPN FNTSNM(FONT)
MOVEM A,FNTSNM(FONT)
PUSHJ P,FNTOPN
JRST [ SKIPE NOTYPE
JRST KSET3
PUSHJ P,KSET4
PUSHJ P,FNTFNF
PUSHJ P,CRLF
JRST KSET3]
.CLOSE FNTICH,
KSET3: ADDI FONT,FNTVLN
CAIGE FONT,MAXFNT*FNTVLN
JRST KSET2
JRST POPAJ1
KSET4: MOVE D,FONT
IDIVI D,FNTVLN
PUSHJ P,DECPNT
MOVEI A,40
PUSHJ P,TYO
JRST TYO
SAMPLE: PUSHJ P,VRESET
MOVEI B,[0]
CAIN A,12
POPJ P, ;ERROR, NO FONT SPECIFIED
PUSHJ P,COMBAC ;BACK UP A CHARACTER
MOVE B,[PUSHJ P,COMGET]
PUSHJ P,GETF0
POPJ P, ;ERROR
JUMPN FONT,CPOPJ ;MORE CHANCE FOR LOSSAGE
PUSH P,A
MOVE A,[FNTBEG,,FNTBEG+FNTVLN]
BLT A,FNTBEG+<FNTVLN*2>-1
MOVE A,[[SIXBIT /DSK/ ? SIXBIT /FIX25/ ? SIXBIT /KST/ ? SIXBIT /FONTS/],,FNTBEG]
BLT A,FNTBEG+FNTVLN-1
MOVEI FONT,0
SAMP1: SETOM FCHFLG(FONT)
PUSHJ P,FNTOPN
JRST POPAJ ;LOSSAGE
.CLOSE FNTICH,
JUMPN FONT,SAMP2
ADDI FONT,FNTVLN
JRST SAMP1
SAMP2: SETZM HDRCNT
MOVEI A,FNTO+FNTVLN
MOVE C,[440700,,HDRTXT]
PUSHJ P,SAMP3 ;PUT FONT NAME IN FILE
PUSHJ P,SAMP8 ;THROW IN SOME EXTRA CARRIAGE RETURNS
PUSHJ P,SAMP8
MOVE A,[[SIXBIT /DSK/ ? SIXBIT /CODES/ ? SIXBIT />/ ? SIXBIT /FONTS/],,TXTO]
BLT A,TXTSNM
POP P,A
PUSHJ P,COMXIT
SKIPE DSKCMD
JRST POPJ1
MOVEM A,(P) ;CLOBBER RETURN ADDRESS
MOVEI B,[ASCIZ /PRINT MODE/]
PUSHJ P,TERPRI
JRST POPAJ
SAMP3: PUSH P,A
MOVE B,(A) ;DEVICE
CAMN B,[SIXBIT /DSK/] ;ONLY AI HAS AN XGP
MOVE B,[SIXBIT /AI/]
PUSHJ P,SAMP4
MOVEI A,":
PUSHJ P,SAMP5
MOVE A,(P)
MOVE B,3(A) ;SNAME
PUSHJ P,SAMP4
MOVEI A,";
PUSHJ P,SAMP5
MOVE A,(P)
MOVE B,1(A) ;FILE NAME 1
PUSHJ P,SAMP4
MOVEI A,40
PUSHJ P,SAMP5
POP P,A
MOVE B,2(A) ;FILE NAME 2
SAMP4: MOVEI A,0
LSHC A,6
ADDI A,40
PUSHJ P,SAMP5
JUMPN B,SAMP4
POPJ P,
SAMP8: MOVEI A,15
PUSHJ P,SAMP5
MOVEI A,12
SAMP5: AOS HDRCNT
IDPB A,C
POPJ P,
SAMP6: HRLI B,440700
SAMP7: ILDB A,B
JUMPE A,CPOPJ
PUSHJ P,SAMP5
JRST SAMP7
RESET: PUSHJ P,VRESET
AOS (P)
JRST COMXIT
;TYPES LIST OF COMMANDS
HELP: SKIPE NOTYPE
JRST POPJ1
MOVEI D,0
HELP1: CAIL D,COMTBL
POPJ P,
MOVS B,COMTAB(D)
MOVE B,(B)
PUSHJ P,SIXO
PUSHJ P,CRLF
AOJA D,HELP1
;SET TO SKIP FIRST PAGES OF FILE
SETPSK: MOVEI E,PSKIP
CAIN A,12
JRST SHWARG
PUSHJ P,POSARG
JRST BADARG
MOVNS D
CAMGE D,PSKIP
MOVEM D,PSKIP
JRST POPJ1
;RESET VARIABLES
VRESET: MOVSI B,PLTD1
HRRI B,DOBIT
BLT B,DOBIT+43
IRP VAR,,[VSP,LSP,LFTMAR,TOPMAR,BOTMAR,PLINES,AUTCUT,PSKIP,TXTCMD,UDEPTH,INITX0,INITY0,SQSHFL,FFCUT]
MOVE B,[I!VAR]
MOVEM B,VAR
TERMIN
;CALCULATES # TEXT LINES IN TEXT AREA
CALINE: MOVE D,PLINES
SUB D,TOPMAR
SUB D,BOTMAR
MOVEM D,SLINES
SKIPGE E,LSP ;USE LSP IF SET
JRST CALIN1
SKIPGE E,VSP
MOVEI E,DVSP ;IF VSP NOT SET USE DEFAULT
ADD E,HEIGHT
CALIN1: IDIV D,E
MOVEM D,NLINES
POPJ P,
;RESET FONTS
FRESET: MOVE A,[[SIXBIT /DSK/ ? SIXBIT /FIX25/ ? SIXBIT /KST/ ? SIXBIT /FONTS/
25. ;HEIGHT
20. ;BASE LINE
0 ;CPA
0 ;KST ID
-1],,FNTBEG] ;FCHFLG
BLT A,FNTBEG+FNTVLN-1
SETZM FNTBEG+FNTVLN
MOVE A,[FNTBEG+FNTVLN,,FNTBEG+FNTVLN+1]
BLT A,FNTBEG+<FNTVLN*MAXFNT>-1
POPJ P,
;RESET PRINT FILE NAME
PRESET: MOVE A,[SIXBIT /DSK/]
MOVEM A,TXTO
SETZM TXTFN1
SETZM TXTFN2
POPJ P,
;CALCULATES SIZE OF PAGE WITH CURRENT SETTINGS
SIZE: SKIPE NOTYPE
JRST POPJ1
MOVEI FONT,0 ;DO CALUCLATIONS WITH THIS FONT
CAIE A,12
JRST SIZE2 ;SET SIZE OF PAGE BY SPECIFICATION IN INCHES
PUSH P,A
PUSHJ P,FNTOPN
JRST [ PUSHJ P,FNTFNF
JRST POPHUH]
.CLOSE FNTICH,
JUMPLE A,[ MOVEI B,[ASCIZ /ILLEGAL HEIGHT/]
JRST COMER1]
MOVE A,SLINES ;# SCAN LINES IN TEXT AREA
ADD A,TOPMAR
ADD A,BOTMAR
IDIVI A,192. ;SCAN LINE DENSITY (LINES/INCH)
PUSH P,B
MOVE D,A
PUSHJ P,DECPNT
MOVEI A,".
PUSHJ P,TYO
MOVE D,(P)
IMULI D,1000. ;THREE DECIMAL PLACES SUFFICES
IDIVI D,192. ;SCAN LINE DENSITY
MOVEI A,"0
CAIGE D,10.
PUSHJ P,TYO
CAIGE D,100.
PUSHJ P,TYO
PUSHJ P,DECPNT
MOVEI A,""
PUSHJ P,TYO
SKIPN (P)
JRST SIZE1
MOVEI B,[ASCIZ / (/]
PUSHJ P,OUTSTR
MOVE D,(P)
PUSHJ P,DECPNT
MOVEI B,[ASCIZ \/192)\]
PUSHJ P,OUTSTR
SIZE1: POP P,(P)
AOS -1(P) ;SKIP RETURN
JRST POPXIT
;HERE READ PAGE SIZE IN INCHES AND SET SLINES
SIZE2: PUSHJ P,ARGIN ;READ STRING OF DIGITS
JRST [ CAIE A,".
JRST BADARG
JRST .+1]
JUMPLE D,BADARG
IMULI D,1000. ;THOUSANDTHS OF INCHES
PUSH P,D
CAIN A,12
JRST SIZE4 ;NO DECIMAL FRACTION
PUSHJ P,COMGET ;GET FIRST DIGIT FOR ARGIN
CAIN A,15
JRST .-2
CAIN A,12
JRST SIZE4
PUSHJ P,ARGIN
SIZE3: JRST [ POP P,(D)
JRST BADARG]
JUMPL D,SIZE3
IMULI D,1000. ;THOUSANDTH'S OF INCHES
IDIV D,C ;SCALE TO # DIGITS READ
ADDM D,(P)
SIZE4: POP P,D
IMULI D,192.
IDIVI D,1000. ;SCAN LINES IN TEXT AREA
MOVE E,D
SUB D,TOPMAR
SUB D,BOTMAR
JUMPLE D,[ MOVEI B,[ASCIZ /TOP AND BOTTOM MARGINS EXCEED SIZE SPECIFIED/]
POPJ P,]
MOVEM E,PLINES
JRST SETVS2 ;RECALCULATE NLINES AND SKIP RETURN
;HERE TO TRANSMIT FONTS IN ALTER MODE
FONTSA: CAIE A,12
JRST HUH
PUSH P,A
MOVEI FONT,0 ;IF HE'S GONE TO ALL THIS TROUBLE. . .
FONTA1: SKIPE FNTFN1(FONT) ;MAKE SURE A FONT IS SPECIFIED
SETOM FCHFLG(FONT) ;TRANSMIT ALL FONTS
ADDI FONT,FNTVLN
CAIGE FONT,MAXFNT*FNTVLN
JRST FONTA1
PUSHJ P,FONTS
JRST POPAJ
;HERE TO TRANSMIT FONTS
FONTS: PUSHJ P,CLRKST ;CLEAR ALL CHARACTERS SETS FIRST
MOVEI FONT,0 ;TRANSMIT FONTS THAT NEED IT
FONTS0: AOSE FCHFLG(FONT)
JRST FONTS1 ;DONT NEED TO SEND THAT ONE
PUSHJ P,FNTOPN ;OPEN FONT FILE (READS FIRST 2 WORDS)
JRST [ PUSHJ P,FNTFNF ; FILE NOT FOUND
PUSHJ P,CRLF
JRST FNTS0A]
PUSHJ P,SNDFNT
FNTS0A: .CLOSE FNTICH,
FONTS1: ADDI FONT,FNTVLN
CAIGE FONT,MAXFNT*FNTVLN
JRST FONTS0
POPJ P,
;HERE TO CLEAR ALL KSETS IN PDP-11
CLRKST: MOVEI E,MAXFNT-1
CLRKS1: MOVEI A,0
PUSHJ P,CMDO ;KSET MODE
PUSHJ P,CMDO ;CLEAR . . .
MOVE A,E ;THIS CHARACTER SET
PUSHJ P,CMDO
SOJGE E,CLRKS1
POPJ P,
;COMMAND BUFFER FILLING AND GETTING
TTYLIN: MOVE B,[010700,,COMBUF-1]
SETZM COMCNT
TTYL1: PUSHJ P,TYI
JUMPE A,TTYL1
CAIN A,177
JRST RUBOUT ;RUBOUT
CAIN A,4
JRST [ MOVEI B,[ASCIZ / ???/]
PUSHJ P,OUTSTR
PUSHJ P,SOUT ;CONTROL-D CANCELS WHOLE LINE
JRST TTYLIN]
CAIN A,14
JRST TTYFF ;FORM FEED RETYPES BUFFER
CAIN A,15
JRST TTYCR
CAIN A,12
JRST TTYLF
PUSHJ P,COMPUT
JRST TTYL1
RUBOUT: SOSGE COMCNT
JRST [ PUSHJ P,CRLF
JRST TTYLIN]
LDB A,B
PUSHJ P,TYO
PUSHJ P,DECBP ;DECREMENT BYTE POINTER
JRST TTYL1
DECBP: ADD B,[070000,,0]
JUMPGE B,CPOPJ
SUB B,[430000,,1]
POPJ P,
TTYFF: PUSH P,B ;FORM FEED RETYPES BUFFER
PUSH P,C
PUSHJ P,CRLF
SKIPG C,COMCNT
JRST TTYFFX
MOVE B,[010700,,COMBUF-1]
TTYFF1: ILDB A,B
PUSHJ P,TYO
SOJG C,TTYFF1
TTYFFX: POP P,C
POP P,B
JRST TTYL1
TTYLF: MOVEI A,15
PUSHJ P,TYO
TTYCR: PUSHJ P,COMPUT
MOVEI A,12
PUSHJ P,COMPUT
MOVE B,[010700,,COMBUF-1]
MOVEM B,COMPNT
POPJ P,
COMPUT: IDPB A,B
AOS COMCNT
POPJ P,
COMGET: SOSGE COMCNT
.VALUE
ILDB A,COMPNT
POPJ P,
;FILL COMBUF WITH A COMMAND LINE FROM DISK FILE
DSKLIN: SETZM COMCNT
MOVE B,[010700,,COMBUF-1]
MOVEM B,COMPNT
DSKL1: PUSHJ P,TXTI
JUMPE A,DSKL1 ;IGNORE NULLS
JUMPL A,DSKSTP ;EOF?
CAIE A,3
CAIN A,14
JRST DSKSTP ;GET OUT
CAIN A,12
JRST DSKLF ;GET OUT
CAIE A,15 ;IGNORE CARRIAGE RETURNS
PUSHJ P,COMPUT
JRST DSKL1
DSKSTP: MOVEI A,1 ;STOP READING FROM DISK FILE AFTER THIS LINE
MOVEM A,DSKCMD
DSKLF: MOVEI A,15
PUSHJ P,COMPUT
MOVEI A,12
PUSHJ P,COMPUT
MOVEI A,0
JRST COMPUT
;TTY ROUTINES
TERPRI: PUSHJ P,OUTSTR
CRLF: MOVEI A,15
PUSHJ P,TYO
MOVEI A,12
TYO: .IOT TTYOCH,A
POPJ P,
SOUT: PUSHJ P,CRLF
MOVEI A,"*
JRST TYO
TYI: .IOT TTYICH,A
POPJ P,
VERTYP: MOVE B,[.FNAM1] ;PRINT VERSION NUMBER
PUSHJ P,SIXO
MOVEI A,".
PUSHJ P,TYO
MOVE B,[.FNAM2]
SIXO: MOVE C,[440600,,B]
SIXO1: ILDB A,C
JUMPE A,CPOPJ
ADDI A,40
PUSHJ P,TYO
TLNE C,770000
JRST SIXO1
POPJ P,
;FILES NOT FOUND
TXTFNF: MOVEI A,TXTO
MOVEI B,[ASCIZ /TEXT /]
JRST FNF
FNTFNF: MOVEI B,[ASCIZ /FONT /]
MOVEI A,FNTO(FONT)
FNF: PUSH P,A
AOS SET ;ERRORS HAVE HAPPENED
PUSHJ P,OUTSTR
POP P,A
PUSHJ P,PNTFNM ;PRINT FILE NAME
MOVEI A,40
PUSHJ P,TYO
ERRTYP: .OPEN ERRICH,[ (SIXBIT /ERR/)
1]
JRST .-1 ;DON'T TAKE NO FOR AN ANSWER
ERRTY1: .IOT ERRICH,A
CAIGE A,40
JRST [ .CLOSE ERRICH, ;ANY CONTROL CHARACTER STOP THIS NON-SENSE
POPJ P,]
PUSHJ P,TYO
JRST ERRTY1
OUTSTR: HRLI B,440700
OUTS1: ILDB A,B
JUMPE A,CPOPJ
PUSHJ P,TYO
JRST OUTS1
DECPNT: JUMPGE D,DECPN1
MOVEI A,"-
PUSHJ P,TYO
MOVMS D
DECPN1: IDIVI D,10.
HRLM E,(P)
JUMPE D,DECPN2
PUSHJ P,DECPN1
DECPN2: HLRZ A,(P)
ADDI A,"0
JRST TYO
;PRINTS FILE NAME
PNTFNM: PUSH P,A
MOVE B,(A) ;DEVICE
PUSHJ P,SIXO
MOVEI A,":
PUSHJ P,TYO
MOVE A,(P)
MOVE B,3(A) ;SNAME
PUSHJ P,SIXO
MOVEI A,";
PUSHJ P,TYO
MOVE A,(P)
MOVE B,1(A) ;FILE NAME 1
PUSHJ P,SIXO
MOVEI A,40
PUSHJ P,TYO
POP P,A
MOVE B,2(A) ;FILE NAME 2
JRST SIXO
CRASH: MOVE C,ABORTL+1
MOVEI D,10
MOVEM D,ABORTL
LSH C,-24
MOVEM C,XGPES'
TRNE C,200
PUSHJ P,E1
TRNE C,40
PUSHJ P,E2
TRNE C,20
PUSHJ P,E3
TRNE C,10
PUSHJ P,E4
TRNE C,4
PUSHJ P,E5
ABRTED: SETZM PSKIP
SETZM HDRCNT
SETZM DFHDRF
MOVEI B,[ASCIZ /LISTING ABORTED/]
PUSHJ P,OUTSTR
MOVE P,[-PDL,,PDB-1]
JRST RECYCL
E1: MOVEI B,[ASCIZ /PAPER LOW+/]
JRST OUTSTR
E2: MOVEI B,[ASCIZ /NO -12, PAPER JAM+/]
JRST OUTSTR
E3: MOVEI B,[ASCIZ /FUSER COLD+/]
JRST OUTSTR
E4: MOVEI B,[ASCIZ /FILAMENT COLD+/]
JRST OUTSTR
E5: MOVEI B,[ASCIZ %DRUM/WEB/PAPER OUT+%]
JRST OUTSTR
;GETS PAGES FROM PDP-11
; CALL WITH 11 ADDRESS IN A AND # BYTES DESIRED IN B
GET11: LSH B,-2 ;PROTECTION IN 10 WORDS
TRZ A,3 ;AVOID POSSIBLE EMBARASSEMENT
LSH A,10 ;10 STYLE ADDRESS
TLO A,600000 ;VALID AND WRITE ENABLE
MOVEI C,XGP11
LSH C,26. ;PDP-11 #
IOR A,C
GET11A: MOVEI C,1777 ;POSSIBLE PROTECTION
CAMG B,C
MOVE C,B ;ONLY WANTS PART OF PAGE
AOS T11PAG
IOR C,A ;MAP ENTRY
.CALL [ SETZ
SIXBIT /T11MP/
T11PAG
SETZ C]
.VALUE NOPDP11
ADD A,[2000_12] ;SET FOR NEXT PAGE
SUBI B,2000
JUMPGE B,GET11A ;HE WANTS MORE
POPJ P,
NOPDP11:
ASCIZ /: CANNOT GET PDP-11 PAGES 
/
;SENDS 8 BIT BYTE TO 11
CMDO: SOSGE T,CMDPAR(CHNL) ;GET PARITY
MOVNS T,CMDPAR(CHNL)
SKIPL @CHHDRP(CHNL)
JRST ABRTED ;CHANNEL CLOSED BY 11
IDPB A,@CMDPTR(CHNL)
IBP @CMDPTR(CHNL)
SOSLE CMDCNT(CHNL)
POPJ P, ;MORE ROOM IN BUFFER
;HERE TO FORCE BUFFER
CMDOF: MOVE T,CMDSIZ(CHNL) ;SIZE OF THIS BUFFER
SUB T,CMDCNT(CHNL) ;NUMBER OF BYTES IN BUFFER
JUMPE T,CPOPJ ;DON'T FORCE
SKIPL @CHHDRP(CHNL)
JRST ABRTED ;CHANNEL CLOSED BY 11
IDPB T,CMDBUF(CHNL) ;MARK WITH VALID COUNT
ILDB T,CMDBUF(CHNL) ;NEXT ON RING
JUMPE T,[ SKIPN @CMDBUF(CHNL) ;10-11 INTERFACE IS ON LEVEL 7
.HANG ;AND SO IS RUG
LDB T,CMDBUF(CHNL)
JRST .]
PUSHJ P,SETCBF
SKIPL @CMDBUF(CHNL)
.HANG ;WAIT FOR THAT ONE TO FREE UP
CMDOF1: PUSH P,A
ADDI T,1 ;POINT AT NEXT TEN WORD
ILDB A,T ;SIZE OF THIS BUFFER
MOVEM A,CMDCNT(CHNL)
MOVEM A,CMDSIZ(CHNL)
MOVEI A,10 ;SWITCH TO 8 BIT BYTES
DPB A,[300600,,T]
MOVEI A,0
EXCH A,T
MOVEM A,@CMDPTR(CHNL)
ADDI T,1
IBP A
MOVEM A,@CMDPTR(CHNL)
SETZM CMDPAR(CHNL)
POPAJ: POP P,A
CPOPJ: POPJ P,
;HERE TO OPEN A 10-11 CHANNEL
OPEN: SKIPL @CHHDRP(CHNL)
.HANG
MOVEI T,@CHHDRP(CHNL)
PUSHJ P,ADRING ;WILL POINT TO BUFFER 11 IS HACKING
PUSHJ P,ADRING ;ADVANCE TO NEXT BUFFER
SKIPL (T)
.VALUE ;THAT BUFFER BETTER BE FREE
JRST CMDOF1 ;FOUND HIM SET POINTERS
ADRING: LDB T,[042000,,(T)]
SETCBF: SUB T,BUFORG ;OFFSET IN BYTES
SKIPGE T
.VALUE ;PDP-11 BUFFERS BUGGERED
LSH T,-2 ;IN PDP-10 WORDS
ADD T,[442000,,BUFFER]
MOVEM T,CMDBUF(CHNL)
POPJ P,
;HERE TO SEND WORD IN A TO 11
WRDO: PUSH P,A
PUSHJ P,CMDO ;LOW ORDER BYTE FIRST
MOVE A,(P)
LSH A,-10 ;NOW HIGH ORDER BYTE
PUSHJ P,CMDO
JRST POPAJ
;TIME SHARING I/O ROUTINES
FNTOPN: SETZM HEIGHT(FONT)
SETZM KSTID(FONT)
MOVE A,FNTSNM(FONT)
.SUSET [.SSNAM,,A]
.CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.UII ? 1000,,FNTICH
FNTO(FONT) ? FNTFN1(FONT) ? SETZ FNTFN2(FONT)]
POPJ P,
PUSHJ P,FNTIN
MOVEM A,KSTID(FONT)
PUSHJ P,FNTIN
HRRZM A,HEIGHT(FONT)
PUSH P,A
LDB A,[221100,,(P)]
MOVEM A,BASE(FONT)
LDB A,[331100,,(P)]
MOVEM A,CPA(FONT)
HRRZS (P) ;RETURNS HEIGHT OF FONT IN A
PUSHJ P,CALINE
POPAJ1: POP P,A
POPJ1: AOS (P)
POPJ P,
TXTOPN: .SUSET [.SSNAM,,TXTSNM]
.CALL [ SETZ ? SIXBIT/OPEN/ ? 5000,,.BAI ? 1000,,TXTICH
TXTO ? TXTFN1 ? SETZ TXTFN2]
POPJ P,
AOS (P)
SETZM TXTFLG ;THAT FILE IS OPEN
TXTBF: SKIPGE A,TXTFLG
POPJ P, ;FOUND EOF
SETZM TXTBUF
MOVE A,[TXTBUF,,TXTBUF+1]
BLT A,TXTBUF+TXTBFL-1
MOVE A,[-TXTBFL,,TXTBUF]
.IOT TXTICH,A
MOVEM A,TXTFLG ;TRIPS EOF FLAG
MOVEI A,TXTBFL*5
MOVEM A,TXTCNT
MOVE A,[440700,,TXTBUF]
MOVEM A,TXTPTR
MOVEI A,0
SKIPL TXTFLG ;LAST BUFFER?
POPJ P,
HLRO A,TXTFLG ;CALCULATE # WORDS READ
ADDI A,TXTBFL
PUSH P,A
IMULI A,5 ;# CHARACTERS READ
MOVEM A,TXTCNT
POP P,A
ADDI A,TXTBUF
SETOM TXTBUF-1 ;END TEST IF BUFFER HAS ONLY EOF STYLE CHARACTERS IN IT.
HRLI A,010700 ;LAST BYTE OF LAST WORD IN BUFFER
PUSH P,B
DBPLR: LDB B,A
JUMPE B,DBPL ;NULL, IGNORE
CAIE B,3
CAIN B,14
JRST DBPL ;EITHER EOF CHAR OR FORM FEED, FLUSH
TXTBIX: MOVEI A,
POP P,B
POPJ P,
DBPL: MOVEI B,0
DPB B,A
ADD A,[070000,,] ;BACKUP THE BYTE POINTER
JUMPGE A,DBPLR ;RETURN TO CHECK THIS CHAR
SOS A
HRLI A,10700 ;BACK UP A WORD WORTH
JRST DBPLR
;HERE TO GET ONE CHARACTER FROM TEXT BUFFER
TXTBFI: PUSHJ P,TXTBF
JUMPL A,CPOPJ ;EOF
TXTI: SOSGE TXTCNT
JRST TXTBFI
ILDB A,TXTPTR
POPJ P,
;HERE TO GET WORD FROM FONT FILE
FNTIN: .IOT FNTICH,A
POPJ P,
;;; ROUTINE TO PRE-SCAN TEXT FILE AND DECIDE WHAT CHARS ARE NEEDED.
;;; SETS BITS IN SQSHTB FOR THE SNDFNT ROUTINE TO LOOK AT.
;;; SKIPS ON ***** FAILURE **** TO OPEN THE TEXT FILE.
.SEE RECYCL
PRESCN: SETZM SQSHTB ;CLEAR BIT TABLE
MOVE A,[SQSHTB,,SQSHTB+1]
BLT A,SQSHTB+177
PUSHJ P,TXTOPN ;OPEN TEXT FILE
JRST POPJ1 ;FAILED
SKIPA E,[400000,,0] ;INITIALLY IN FONT 0
PRSC0: IORM E,SQSHTB(A) ;HERE IF CHAR IS ACTUALLY USED (SET BIT)
PRSC1: PUSHJ P,TXTI ;GOBBLE CHAR FROM FILE
JUMPL A,CPOPJ ;EXIT ON EOF
JRST @.+1(A)
PRSC1 ;NULL
REPEAT 7, PRSC0 ;NORMAL GUYS
REPEAT 3, PRSC1 ;BS, TAB, LF
PRSC0 ;^K (NORMAL)
REPEAT 2, PRSC1 ;FF, CR
REPEAT 176-^M, PRSC0 ;NORMAL GUYS
PRSC2 ;RUBOUT (XGP ESCAPE)
PRSC2: PUSHJ P,TXTI ;XGP ESCAPE
JRST @.+1(A)
PRSC0 ;NORMAL
PRSC3 ;XGP ESCAPE 1 (GOBBLES N BYTES)
PRSC3C ;XGP ESCAPE 2 (GOBBLES 1 BYTE)
PRSC3B ;XGP ESCAPE 3 (GOBBLES 2 BYTES)
PRSC11 ;XGP ESCAPE 4 (GOBBLES 11. BYTES)
REPEAT 3, [.VALUE] ;RESERVED
REPEAT 3, PRSC0 ;BS, TAB, LF -- NORMAL
[.VALUE] ;RESERVED
REPEAT 2, PRSC0 ;FF, CR -- NORMAL
REPEAT 37-^M, [.VALUE] ;RESERVED
REPEAT 137, PRSC0 ;NORMAL GUYS
PRSC0 ;RUBOUT -- NORMAL
PRSC3: PUSHJ P,TXTI ;ESCAPE 1
JRST @PRST(A)
PRST: REPEAT 40, PRSC3A ; FONT SELECT
PRSC3B ;40 COLUMN SELECT (2 BYTES)
PRSC3C ;41 ! UNDERSCORE (1 BYTE)
PRSC3C ;42 " LINE SPACE (1 BYTE)
PRSC3C ;43 # ABSOLUTE BASE LINE ADJ (1 BYTE)
PRSC1 ;44 $ PAGE NUMBER (NO BYTES)
PRSC3D ;45 % HEADING (COUNT, THEN N BYTES)
PRSC1 ;46 & START UNDERLINE (NO BYTES)
PRSC3C ;47 ' STOP UNDERLINE (1 BYTE)
PRSC3C ;50 ( INTERCHAR SPACING (1 BYTE)
PRSC3B ;51 ) VARIABLE WIDTH UNDERLINE (2 BYTES)
PRSC3C ;52 * RELATIVE BASE LINE ADJUST (1 BYTE)
PRSTL==.-PRST
REPEAT 200-PRSTL, [.VALUE] ;RESERVED
PRSC3A: MOVSI E,400000 ;FONT SELECT
MOVNS A
LSH E,(A)
JRST PRSC1
PRSC3B: PUSHJ P,TXTI ;SKIP 2 BYTES
PRSC3C: PUSHJ P,TXTI ;SKIP 1 BYTE
JRST PRSC1
PRSC3D: PUSHJ P,TXTI ;SKIP N BYTES
SKIPA D,A
PRSC11: MOVEI D,11. ;SKIP 11. BYTES
PRSC3E: SOJL D,PRSC1
PUSHJ P,TXTI
JRST PRSC3E
COMMENT $ MIT FONT FORMAT AND CMU FONT FORMAT
WORDS 0-1
KSTID
BYTE (9) COLUMN_POSITION_ADJUSTMENT,BASE_LINE (18) HEIGHT
;base line # rasters from top of character matrix
REMAINDER OF FILE: ONE BLOCK OF DATA FOR EACH CHARACTER
USER_ID
;NOT USED 4/10/74 but LOW ORDER BIT MUST BE 1
LEFT_KERN,,CODE
;left kern always 0 for CMU
RASTER_WIDTH,,CHARACTER_WIDTH
;raster width always 0 for CMU
CHARACTER_MATRIX
;the matrix is stored 4 8-bit bytes per word so that
;ILDB with 8-bit byte size gets successive bytes.
;The bits are bit reversed in each byte (high order
;bit of character in low order bit of byte).
;the matrix is stored row by row.
$
;TRANSMITS FONT OVER COMMAND CHANNEL
SNDFNT: MOVE A,FONT ;CONVERT FONT INDEX TO FONT #
IDIVI A,FNTVLN
MOVN B,A
MOVSI X,400000
LSH X,(B) ;X HAS BIT FOR SQSHTB
SKIPGE SQSHFL
JSP E,SQCHK ;DON'T SEND FONT IF NO CHARACTERS USED
PUSH P,A ;SAVE FONT #
MOVEI A,0 ;ESCAPE TO KSET
PUSHJ P,CMDO
MOVNI A,1 ;LOAD THIS FONT
PUSHJ P,CMDO
POP P,A ;FONT #
PUSHJ P,CMDO
MOVE A,HEIGHT(FONT) ;HEIGHT
PUSHJ P,WRDO
MOVE A,BASE(FONT) ;BASE LINE
PUSHJ P,WRDO
SNDFN0: PUSHJ P,FNTIN ;IGNORE USER ID
trnn a,1 ;check terminating bit
jrst [ movei b,[asciz /bad font: /]
pushj p,outstr
movei a,fnto(font)
pushj p,pntfnm
pushj p,crlf
jrst sndf0a
]
SNDF0A: PUSHJ P,FNTIN ;CHARACTER CODE
MOVE E,A
HRRZS A ;CLEAR KERN INFO
CAILE A,177
HRROI A,200 ;ANY ILLEGAL CHARACTER STOPS US
SKIPGE SQSHFL ;IF SQUISHING, AND IF NOT END OF FONT,
JUMPGE A,SNDF7 ; THEN DECIDE WHETHER TO SEND CHARACTER
SNDF0H: movem a,lstchr
PUSHJ P,CMDO ;"SEND" IT
JUMPL A,SNDFXT ;FORCE BUFFER AND EXIT
HLRES E ;LEFT KERN
ADD E,CPA(FONT) ;FUDGE CPA INTO KERN
MOVN A,E ;FUDGE FOR THE PDP-11 PROGRAM
PUSHJ P,CMDO
PUSHJ P,FNTIN ;RASTER WIDTH,,CHARACTER WIDTH
SKIPG A
jrst [ movei b,[asciz /zero or negative char width: /]
jrst cfntnm ;0 OR NEGATIVE WIDTH
]
ADD A,E ;FUDGE IN KERN AND COLUMN POSITION ADJUSTMENT
JUMPLE A,[ movei b,[asciz /kern or cpa problem: /]
jrst cfntnm
] ;HALF HEARTED CHECK
PUSHJ P,WRDO ;SPACING WIDTH
TLNE A,-1
HLRZS A
PUSHJ P,WRDO ;RASTER WIDTH
ADDI A,7
LSH A,-3 ;# 8 BIT BYTES PER ROW
MOVEM A,BYPR ;BYTS PER ROW
MOVE E,HEIGHT(FONT)
MOVE C,BYPR
SNDF1: PUSHJ P,FNTIN
MOVE D,A ;BYTES COME PACKED 4 PER WORD
MOVE B,[441000,,D] ;THIS IS HOW WE UNPACK THEM
SNDF2: ILDB A,B
PUSHJ P,CMDO
SOJLE C,SNDF5 ;THATS ALL FOR THIS ROW
SNDF21: TLNN B,700000
JRST SNDF1 ;THAT'S ALL FOR THIS WORD
JRST SNDF2
cfntnm: pushj p,outstr
move a,lstchr'
pushj p,decpnt
movei a,".
pushj p,tyo
movei a,40
pushj p,tyo
movei a,fnto(font)
pushj p,pntfnm
pushj p,crlf
.value
SNDF5: MOVE C,BYPR
MOVEI A,0
TRNE C,1 ;IF ODD # OF BYTES, SEND A 0 BYTE
PUSHJ P,CMDO
SOJLE E,SNDFN0 ;THATS ALL FOR THIS CHAR
JRST SNDF21
;HERE TO DECIDE WHETHER TO SEND CHAR IN SQUISH MODE
SNDF7: TDNE X,SQSHTB(A) ;IF BIT NOT SET IN SQSHTB,
JRST SNDF0H ; MUST SKIP OVER CHARACTER
PUSHJ P,FNTIN ;SKIP RASTER WIDTH,,CHARACTER WIDTH
SNDF7A: PUSHJ P,FNTIN
TRNN A,1 ;BIT 1.1 => USER ID FOR NEXT CHAR
JRST SNDF7A
JRST SNDF0A
;HERE EXIT SNDFNT
SNDFXT: PUSHJ P,CMDOF ;FORCE BUFFER
SKIPGE KSTLOD ;WAIT FOR PDP-11 TO FINISH
.HANG
LDB D,[242000,,KSTLOD] ;# CHARACTERS MISSED
JUMPE D,CPOPJ
PUSHJ P,DECPNT ;TELL HIM HOW MANY HE LOST
MOVEI B,[ASCIZ / CHARACTERS LOST FONT /]
PUSHJ P,OUTSTR
MOVE D,FONT
IDIVI D,FNTVLN
PUSHJ P,DECPNT ;PRINT FONT #
MOVEI A,40
PUSHJ P,TYO
MOVEI A,FNTO(FONT)
PUSHJ P,PNTFNM
JRST CRLF
;SCAN THROUGH SQSHTB FOR THIS FONT, IF NO CHARACTERS IN THIS FONT
;ARE USED THE TAKE POPJ RETURN OTHER WISE RETURN TO SNDFNT
SQCHK: MOVEI B,177 ;CHARACTER CODE
SQCHK1: TDNE X,SQSHTB(B)
JRST (E) ;FOUND A CHARACTER THAT IS USED IN THIS FONT
SOJGE B,SQCHK1
POPJ P, ;NO CHARACTERS IN THIS FONT USED
;SNDTXT SEND TEXT TO THE PDP-11
SNDTXT: SETZM PAGE
AOS PAGE ;START PRINTING ON PAGE 1
AOSN DFHDRF ;WANT DEFAULT HEADER?
PUSHJ P,DEFHDR ; YES
SNDTX1: SKIPL PSKIP ;SKIPING PAGES
JRST XGPLPT ;NO, PRINT SOME GOODIES
PUSHJ P,TXTI ;GET A CHARACTER
CAIN A,177 ;RUBOUT IS ESCAPE CHARACTER
PUSHJ P,TXTRUB ;PROCESS RUBOUT
JUMPL A,SNDEND ;EOF WHILE SKIPPING?
CAIE A,^L ;PAGE MARK?
JRST SNDTX1
AOS PSKIP
AOS PAGE
JRST SNDTX1
;HERE TO PROCESS RUBOUT WHILE READING TEXT FILE
TXTRUB: PUSHJ P,TXTI ;GET NEXT CHARACTER
JUMPL A,CPOPJ ;EOF?
CAILE A,TXTRDL ;LEGAL CONTROL CODE
JRST RUBSXT ;NO, JUST CLOBBER A AND RETURN
JRST @.(A) ;DISPATCH
TXTRDO: RUBCA ;1 COMPLICATED
RUBS1 ;2 COLUMN INCREMENT, SOAKS UP 1 CHARACTER
RUBS2 ;3 SKIP TO SCAN LINE, SOAKS UP 2 CHARACTERS
RUBS13 ;4 VECTOR, SOAKS UP 13 CHARACTERS
TXTRDL==.-TXTRDO
;SOAKS UP CHARACTERS FROM INPUT STREAM, LOOKS FOR EOF
RUBS3: SKIPA B,[3]
RUBS13: MOVEI B,13
JRST RUBS
RUBS1: SKIPA B,[1]
RUBS2: MOVEI B,2
RUBS: PUSHJ P,TXTI ;GET CHARACTER
JUMPL A,CPOPJ ;EOF?
SOJG B,RUBS
RUBSXT: MOVEI A,0 ;CLOBBER CHARACTER
POPJ P,
;HERE TO PROCESS RUBOUT<CNTRL-A>
RUBCA: PUSHJ P,TXTI ;GET CHARACTER
JUMPL A,CPOPJ ;EOF?
CAIGE A,MAXFNT ;FONT SWITCH?
MOVE FONT,A
SUBI A,37 ;LOOK FOR OTHER CONTROL CODES
JUMPLE A,RUBSXT ;UNDER?
CAILE A,TXTADL ;OVER?
JRST RUBSXT
JRST @.(A) ;DISPATCH
TXTADO: RUBS2 ;40 COLUMN SELECT
RUBS3 ;41 ! UNDERSCORE
RUBS1 ;42 " LINE SPACE
RUBS1 ;43 # ABSOLUTE BASELINE ADJUST
RUBSXT ;44 $ PRINT PAGE NUMBER
TAKHDR ;45 % ACCEPT HEADING TEXT
RUBSXT ;46 & START UNDERLINE
RUBS1 ;47 ' STOP UNDERLINE
RUBS1 ;50 ( SET INTERCHARACTER SPACING
RUBS2 ;51 ) VARIBLE WIDTH UNDERLINE
RUBS1 ;52 * RELATIVE BASELINE ADJUST
TXTADL==.-TXTADO
;ACCEPTS HEADING TEXT
TAKHDR: PUSHJ P,TXTI ;GET CHARACTER COUNT OF HEADER
MOVEM A,HDRCNT
JUMPLE A,CPOPJ ;EOF?
SETZM HDRTXT ;CLEAR HEADER BUFFER
MOVE A,[HDRTXT,,HDRTXT+1]
BLT A,HDRTXT+HDRTXL-1
MOVE B,HDRCNT ;PREPARE TO READ HEADER TEXT
MOVE C,[440700,,HDRTXT]
MOVEI D,HDRTXL*5
TKHDR1: PUSHJ P,TXTI
JUMPL A,CPOPJ ;EOF?
SOSL D
IDPB A,C
SOJG B,TKHDR1
JUMPGE D,RUBSXT
ADDM D,HDRCNT ;D HAS -# CHARACTERS LOST
JRST RUBSXT
;SET UP THE DEFAULT HEADER
DEFHDR: SETZM HDRCNT
MOVE C,[440700,,HDRTXT]
.RLPDT A,
LDB A,[320300,,B] ;GET DAY OF WEEK (0 => SUNDAY)
MOVE B,[ [ASCIZ /Sun/]
[ASCIZ /Mon/]
[ASCIZ /Tues/]
[ASCIZ /Wednes/]
[ASCIZ /Thurs/]
[ASCIZ /Fri/]
[ASCIZ /Satur/]](A)
PUSHJ P,SAMP6
MOVEI B,[ASCIZ /day, /]
PUSHJ P,SAMP6
.RDATE B,
LSHC A,2*6 ;TWO SIX BIT CHARACTERS IS YEAR
LSH A,44-<2*6> ;SUITABLE FOR SIX BIT PRINTING
PUSH P,A
MOVEI A,0
LSHC A,6 ;FIRST DIGIT OF MONTH
MOVEI D,-20(A)
IMULI D,10.
MOVEI A,0
LSHC A,6 ;SECOND DIGIT OF MONTH
ADDI D,-20(A)
PUSH P,B
MOVE B,[ [ASCIZ /????/]
[ASCIZ /January /]
[ASCIZ /February /]
[ASCIZ /March /]
[ASCIZ /April /]
[ASCIZ /May /]
[ASCIZ /June /]
[ASCIZ /July /]
[ASCIZ /August /]
[ASCIZ /September /]
[ASCIZ /October /]
[ASCIZ /November /]
[ASCIZ /December /]](D)
PUSHJ P,SAMP6
POP P,B
MOVEI A,0 ;PRINT DAY OF MONTH
LSHC A,6 ;GET FIRST DIGIT
CAIE A,'0 ;DON'T PRINT LEADING ZERO
LSHC A,-6
PUSHJ P,SAMP4
MOVEI B,[ASCIZ /, 19/]
PUSHJ P,SAMP6
POP P,B
PUSHJ P,SAMP4 ;YEAR
MOVEI A,40
PUSHJ P,SAMP5
PUSHJ P,SAMP5
PUSHJ P,SAMP5
.RTIME B, ;DATE
LSHC A,2*6
LSH A,6
IORI A,':
LSHC A,2*6
LSH A,6
IORI A,':
PUSH P,B
MOVE B,A
PUSHJ P,SAMP4
POP P,B
PUSHJ P,SAMP4
MOVEI B,TENSP
PUSHJ P,SAMP6 ;TEN SPACES
MOVE A,[TXTICH,,CHSTS]
.RCHST A,
MOVEI A,CHSTS
HRLZS CHSTS
PUSHJ P,SAMP3 ;FILE NAME
MOVEI B,TENSP
PUSHJ P,SAMP6
MOVEI B,[ASCIZ /Page <20>$
/]
PUSHJ P,SAMP6
MOVEI A,HDRTXL*5
MOVEI B,[ASCIZ /HEADER BUFFER OVERFLOW/]
CAMGE A,HDRCNT
PUSHJ P,TERPRI
POPJ P,
TENSP: ASCIZ / /
;HERE TO PRINT THE REAL GOODS
XGPLPT: MOVEI A,1 ;ESCAPE TO "MIXED"
PUSHJ P,CMDO
SKIPL LSP ;LSP SPECIFIED
JRST SNDVAR ; LSP IS SPECIFIED, USE IT
SKIPGE A,VSP
MOVEI A,DVSP ;VSP WAS NOT SPECIFIED, USE THE DEFAULT VALUE
ADD A,HEIGHT
MOVEM A,LSP
SNDVAR: MOVEI A,ZZ
PUSHJ P,CMDO ;SEND COUNT OF NUMBER OF PARAMETER THAT FOLLOW
ZZ==0
IRP B,,[LSP,LFTMAR,TOPMAR,BOTMAR,PLINES,PAGE,AUTCUT,FFCUT]
ZZ==ZZ+1
MOVE A,B
PUSHJ P,WRDO
TERMIN
PUSHJ P,CMDOF ;FORCE OUTPUT
MOVEI CHNL,DOCHNL ;ALL THE REST GOES ON DATA OUT
PUSHJ P,OPEN
PUSHJ P,SNDRCA ;SEND RUBOUT<CNTRL-A>
MOVE A,FONT ;DO EXPLICIT FONT SELECT
PUSHJ P,CMDO
SKIPG B,HDRCNT ;SEND HEADER TEXT?
JRST XGPLOP
PUSHJ P,SNDRCA
MOVEI A,45 ;ACCEPT HEADER TEXT
PUSHJ P,CMDO
MOVE A,HDRCNT
PUSHJ P,CMDO
MOVE C,[440700,,HDRTXT]
ILDB A,C
PUSHJ P,CMDO
SOJG B,.-2
MOVE C,[440700,,HDRTXT] ;AND NOW WE SEND IT
XGPLP1: ILDB A,C ;SO THAT IT APPEARS AS HEADER OF FIRST PAGE
PUSHJ P,CMDO
SOSLE HDRCNT
JRST XGPLP1
XGPLOP: PUSHJ P,TXTI
JUMPL A,TXTEOF ;EOF?
PUSHJ P,CMDO
AOSE ABORTF
JRST XGPLOP
TXTEOF: MOVEI A,200 ;EOF CODE
PUSHJ P,CMDO
PUSHJ P,CMDOF ;FORCE BUFFER
MOVSI A,400000
ANDCAM A,@CHHDRP(CHNL) ;CLOSE DATA OUT CHANNEL
SNDEND: SETZM PSKIP
SETZM HDRCNT
SETZM DFHDRF
POPJ P, ;AND RETURN
;SENDS ROUBOUT<CNTRL-A>
SNDRCA: MOVEI A,177
PUSHJ P,CMDO
MOVEI A,1
JRST CMDO
PDL==20
PDB: BLOCK PDL
BYPR: 0 ;BYTES PER ROW WHILE LOADING FONTS
DSKCMD: 0 ;READING COMMANDS FROM DISK FLAG
NOTYPE: 0 ;DON'T TYPE OUT
TTYNUM: 0 ;NUMBER OF TTY WE HAVE
CHSTS: BLOCK 8 ;STORAGE FOR CURRENTLY PLOTTED/SCANNED FILE
ABORTF: 0 ;NON ZERO => XGP 11 PROGRAM CRAPPED OUT
;IN A WELL DEFINED WAY
TXTBFL==200
TXTCNT: 0 ;TEXT BUFFER COUNTER
TXTPTR: 0 ;BYTE POINTER INTO TEXT BUFFER
TXTFLG: 0 ;NEGATIVE=>EOF SEEN
0 ;DUMMY TEXT BUFFER LOCATION USED FOR END
;TEST AT DBPLR... MUST PRECEDE TXTBUF
TXTBUF: BLOCK TXTBFL
COMBFL==200
COMCNT: 0
COMPNT: 0
COMBUF: BLOCK COMBFL
T11PAG: 0 ;NEXT PAGE TO GET FROM 11
SET: 0 ;ERROR FLAG THAT STOPS XGP OUTPUT
BUFORG: 0 ;ORIGIN OF BUFFERS IN 11 SPACE
;DEFAULT PAGE PARAMETERS
IINITX0==1100.
IINITY0==-180.
ISQSHFL==0
ILFTMAR==200
ITOPMAR==200
IBOTMAR==174
ISLINES==3504 ;VSP, SLINES, TOPMAR, BOTMAR SET TO MAKE 60 LINES OF FIX25 PER PAGE
IPLINES==ISLINES+ITOPMAR+IBOTMAR
ILSP==-1
DLSP==25.+6 ;25 HIGH FONT + 6 LINES OF VSP
IVSP==-1 ;DEFAULT IS TO USE LSP
DVSP==6
IAUTCUT==-1
IFFCUT==0
IPSKIP==0 ;# PAGES TO SKIP AT BEGGINING
ITXTCMD==-1
IUDEPTH==-1
;PAGE PARAMETERS
INITX0: 0
INITY0: 0
SQSHFL: 0 ;NON-ZERO => SQUISH USELESS CHARS OUT OF FONTS
LFTMAR: 0
TOPMAR: 0 ;ALLOWS 60 LINES OF TEXT ON ONE 11" PAGE
BOTMAR: 0
NLINES: 0 ;11 INCHES
AUTCUT: 0
FFCUT: 0 ;NON-ZERO FORCES XGP TO CUT ONLY AT FORM FEEDS
PSKIP: 0 ;# PAGES TO SKIP AT BEGINING
TXTCMD: 0 ;0 IMPLIES DONT LOOK FOR COMMANDS IN TEXT FILE
LSP: 0 ;BASE LINE SPACING
VSP: 0 ;-1 => USE LSP, OTHER WISE LSPHEIGHT+VSP
UDEPTH: 0 ;# PRINTS IN PROGRESS
PLINES: 0 ;# SCAN LINES ON PAGE
SLINES: 0 ;# SCAN LINES IN TEXT AREA
PAGE: 0 ;PAGE # OF FIRST PRINTED PAGE
DFHDRF: 0 ;-1=>PUT DEFAULT HEADER ON EACH PAGE
HDRCNT: 0 ;# CHARACTERS IN PAGE HEADER
HDRTXL==<200+4>/5 ;SIZE OF TEXT HEADER AREA
HDRTXT: BLOCK HDRTXL ;BUFFER FOR HEADER TEXT
SQSHTB: BLOCK 200 ;ONE WORD FOR EACH ASCII CHAR
;BIT 4.9 = FONT 0, 4.8 = FONT 1, ETC.
;FONT VARIABLES
FNTBEG==.
FNTO: SIXBIT /DSK/
FNTFN1: SIXBIT /FIX25/ ;USED AS A FLAG, IF 0 THEN FONT NOT SPECIFIED
FNTFN2: SIXBIT /KST/
FNTSNM: SIXBIT /FONTS/
HEIGHT: 0 ;HEIGHT OF FONT
BASE: 0 ;BASE LINE
CPA: 0 ;COLUMN POSITON ADJUSTMENT
KSTID: 0 ;FONT ID
FCHFLG: -1 ;-1=> TRANSMIT TO 11
FNTVLN==.-FNTBEG ;LENGTH OF FONT VARIABLE AREA
LOC FNTBEG+<MAXFNT*FNTVLN>
TXTO: SIXBIT/DSK/
TXTFN1: 0
TXTFN2: 0
TXTSNM: 0
;10-11 CHANNEL DATA AREAS
CMDPAR: BLOCK NCHNL ;PARITY
CMDCNT: BLOCK NCHNL ;BUGGER BYTE COUNTER
CMDSIZ: BLOCK NCHNL ;SIZE OF THIS BUFFER
CMDBUF: BLOCK NCHNL ;BYTE POINTER TO FIRST 11 WORD OF BUFFER
CMDPTR: REPEAT NCHNL,CONC CMDPT,\.RPCNT,(T)
REPEAT NCHNL,[
CONC CMDPT,\.RPCNT,[: BLOCK 2]
]
CHHDRP: REPEAT NCHNL,CHHDR+<BPRCHL/4>*.RPCNT
LITTER: CONSTANTS
VARS:: VARIABLES
PAT:PATCH:
ICORE==<.+1777>_<-12>
;MEMORY MAP
;PROGRAM PAGES 0-ICORE
;CHANNEL HEADER POINTER AREA
LNKVPG==ICORE+1 ;PAGE #
10LNKV=LNKVPG_12 ;ORIGIN
LNKV==124 ;ORIGIN IN 11 ADDRESS SPACE
ABORTL=<402-LNKV>/4+10LNKV ;10 ADDRESS OF ABORT FLAG
KSTLOD=ABORTL+6 ;PDP-10 ADDRESS OF KST LOADER FLAG
;CHANNEL HEADER AREA
CHHDPG==LNKVPG+1 ;PAGE #
CHHDR=CHHDPG_12 ;ORIGIN
BPRCHL==10 ;# BYTES IN 1 CHANNEL HEADER
;10-11 BUFFER AREA
BUFPG==CHHDPG+1 ;FIRST PAGE #
BUFFER=BUFPG_12
SBUFP==BUFPG+1
SBUF=SBUFP_12
BITBUF=SBUF+WDSPL
END GO