1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-19 09:29:15 +00:00

2627 lines
53 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.

;-*-MIDAS-*-
TITLE FED FONT EDITOR
;BY PITTS JARVIS--1973
;ADDITIONS BY JOE COHEN -- 1973,1974,1975
;AC'S
A=1 ;USED FOR PASSING ARGUMENTS BACK AND FORTH
B=2 ;MOSTLY SCRATCH
C=3
D=4
E=5
T=6
TT=7
U=10
V=11
X=12 ;ACTUAL BEAM LOCATION
Y=13
PX=14 ;PSEUDO BEAM LOCATION
PY=15
CODE=16
P=17
;IO CHANNELS
TTYICH==0 ;TTY INPUT CHANNEL
TTYOCH==1 ;TTY OUTPUT CHANNEL
FONTCH==2 ;FONT I/O CHANNEL
USRCH==3 ;PDP6 CHANNEL
ERRICH==4 ;CHANNEL FOR ERROR DEVICE
.MLLIT==1
.XCREF A,B,C,D,E,T,TT,U,V,CODE,P
DPYBFL==24000 ;DPY BUFFER LENGTH
PDL==40 ;PUSH DOWN LENGTH
PATL==100 ;PATCH AREA SIZE
MSETSZ==400 ;MAXIMUM SIZE OF CHAR SET
;340 MODES
340PAR==0 ;PARAMETER MODE
340PNT==1 ;POINT MODE
340CHR==3 ;CHARACTER MODE
340VEC==4 ;VECTOR MODE
340VC==5 ;VECTOR CONTINUE MODE
340INC==6 ;INCREMENT MODE
;SOME DISPLAY MACROS
DEFINE DSTOP
.DSTOP
SETZM DPYBLK
TERMIN
;TV GEOMETRY
BITPL==576. ;BITS PER LINE
NLINS==454. ;# LINES
%TY11T==10000 ;KNIGHT TV BIT IN TTYTYP
;TABLE LENGTH CHECKER
DEFINE CHECK TAG,LENGTH
IF2,[IFN .-TAG-LENGTH,[ PRINTC /TAG LOSES
/]]TERMIN
DEFINE CIRCI REG,TIMES
IFSN REG,T,.ERR CIRCI ACCUMULATOR MUST BE T.
PUSHJ P,XCIRC
TIMES
TERMIN
;HERE WHEN A CIRC MUST BE DONE. ASSUME ACCUMULATOR IS T.
;COUNT IS IN WORD FOLLOWING THE PUSHJ TO XCIRC.
XCIRC: PUSH P,A
MOVE A,@-1(P)
SKIPN CIRCP
JRST XCIRC1
CIRC T,(A) ;IF CIRC WORKS ON THIS MACHINE, GET COUNT AND DO IT.
JRST XCIRCX
;SIMULATE CIRC, ONE BIT AT A TIME.
XCIRC1: JUMPE A,XCIRCX
JUMPL A,XCIRC2
XCIRC3: ROT TT,-1
ROTC T,1
ROT TT,-1
SOJG A,XCIRC3
JRST XCIRCX
XCIRC2: ROT TT,1
ROTC T,-1
ROT TT,1
AOJL A,XCIRC2
XCIRCX: POP P,A
AOS (P)
POPJ P,
GO: MOVE P,PDP
SETZM CIRCP ;SET CIRCP NONZERO IF CIRC WORKS.
MOVE TT,[012345,,012345]
CIRC T,36.
CAMN T,[516240,,516240]
SETOM CIRCP
.OPEN TTYOCH,[SIXBIT / 1TTY/] ;DISPLAY OUTPUT
.VALUE
.OPEN TTYICH,[SIXBIT / TTY/]
.VALUE
.CALL [SETZ
SIXBIT /CNSGET/
1000,,TTYOCH
2000,,TCMXV
2000,,TCMXH
2000,,TCTYP
2000,,TTYCOM
2000,,TTYOPT
402000,,TTYTYP]
.VALUE
MOVEI A,44 ;SET BITS PER BYTE ON IMAGE INPUT
MOVEM A,BITPB
MOVE A,TTYTYP
TRNE A,%TY11T
SETOM TVDPY ;KNIGHT DISPLAY
SETZM 340DPY ;NEAR A 340?
.STATUS TTYICH,A
TRNE A,200000
SETOM 340DPY
SKIPN OFFSNM
.SUSET [.RSNAM,,OFFSNM] ;DON'T DEFAULT TO KST
SETOM TTYFLG ;IO GOES TO TTY
MOVE B,[440600,,VER1]
PUSHJ P,SIXO
MOVEI A,".
PUSHJ P,TYO
MOVE B,[440600,,VER2]
PUSHJ P,SIXO
PUSHJ P,CRLF
REGO: MOVEI A,10.
MOVEM A,RADEX
PUSHJ P,SETIN
MOVEI A,ICORE
SKIPE PDP6
JRST GO1
.CORE (A) ;REDUCE TO INITIAL CORE ALLOCATION
.VALUE
GO1: MOVEM A,CORSIZ
SETZM FREE
LSH A,12
MOVEM A,FSP
MOVE A,[400,,400000+ICORE_11]
MOVEM A,CBLK
GETKST: .SUSET [.SSNAM,,IFFSNM]
MOVEI A,IFDEV
.OPEN FONTCH,IFDEV ;READ IN FONT
JRST [ PUSHJ P,FNF ;CAN'T OPEN INPUT, TRY AGAIN
JRST REGO]
SKIPL TVDPY
JRST .+3
MOVEI A,[ASCIZ /CV/] ;IF USING TV
PUSHJ P,OUTSTR ;CLEAR SCREEN, MOVE 30 LINES FROM TOP
MOVEI A,[ASCIZ /READING: /]
PUSHJ P,OUTSTR
MOVEI A,FONTCH
PUSHJ P,PFNAM
PUSHJ P,CRLF
SETZM CHARD ;ZERO CHARACTER DISPATCH TABLE
MOVE A,[CHARD,,CHARD+1]
BLT A,CHARD+<MSETSZ-1>
SETZM IOCNT ;FORCE READ ON CALL TO WORDIN
MOVE A,ITYPE ;TYPE OF FONT WE ARE READING
SETZM ERRFLG
PUSHJ P,@READF(A)
MOVEM A,CHREAD' ;# OF CHARS READ
SKIPE ERRFLG ;IF ERRORS, ON TV LET USER SEE THEM BEFORE DISPLAYING.
SKIPN TVDPY
JRST GETKS1
MOVEI A,[ASCIZ/TYPE A CHARACTER TO IGNORE THE ERRORS./]
PUSHJ P,TYICR
GETKS1:
DEFINE GROUP FIRST,LAST
MOVEI A,FIRST
IDPB A,B
CAIGE A,LAST
AOJA A,.-2
TERMIN
MOVE B,[440700,,LINE4] ;CONTROL CHARACTERS
GROUP 1,37
MOVE B,[440700,,LINE3]
GROUP 72,100
GROUP 133,140
GROUP 173,177
MOVE B,[440700,,LINE2] ;#'S AND SPECIALS
GROUP 40,71
MOVE B,[440700,,LINE1] ;LOWER CASE
GROUP 141,172
MOVE B,[440700,,LINE0] ;UPPER CASE
GROUP 101,132
SKIPE TVDPY
JRST TVGO ;DON'T TRY 6 IF TV DPY
SKIPN 340DPY
JRST DONE
SKIPN PDP6 ;JUST 6GO IF ALREADY OPEN
JRST OPEN6
MOVEI A,6GO
SKIPG 6TASK
.HANG
MOVEM A,6DISP
SETOM 6TASK
JRST DPYGO
OPEN6: SKIPE PDP6
JRST DPYGO
SETOB A,PDP6
.SUSET [.RUNAM,,UNAME]
.OPEN USRCH,USRO
SETZB A,PDP6
JUMPE A,DPYGO
.RESET USRCH, ;CLEAR PDP-6'S CORE
.ACCES USRCH,[2000] ;LOAD THE 6'S MEMORY
MOVE A,[2000-6LAST-1,,2000]
.IOT USRCH,A
MOVEI A,ICORE-1
MOVE B,[2400+USRCH,,401001] ;.CBLK WORD
.CBLK B,
.VALUE ;OH YEAH
ADDI B,1001
SOJG A,.-3
.ACCES USRCH,[41]
MOVE A,[-1,,[JRST 6GO]]
.IOT USRCH,A
DPYGO: SKIPE TVDPY
JRST TVGO
340GO: PUSHJ P,DRESET ;RESET DISPLAY
DEFINE SHOW N
SHOW!N: MOVEI X,0
MOVN Y,HEIGHT
IMULI Y,N
ADDI Y,1777
PUSHJ P,BEAMXY
MOVE B,[440700,,LINE!N]
MOVEM B,CHARBP
PUSHJ P,LINE
TERMIN
IRPC N,,[01234]
SHOW N
TERMIN
DPYDPY: MOVE A,DBYTE
ADDI A,1
ASH A,-1 ;WORDS IN DISPLAY LIST
MOVNS A
MOVSS A
HRRI A,DPYBUF-1 ;BLKO POINTER
MOVEM A,DPYBLK
SKIPE PDP6
JRST DONE
.DSTART DPYBLK
.VALUE [ASCIZ /: CAN'T .DSTART 
/]
DONE:
DEFINE CRINFO,X
PUSHJ P,CRLF
MOVEI A,[ASCIZ /X/]
PUSHJ P,OUTSTR
TERMIN
PINFO: CRINFO [FILE: ]
PUSHJ P,RPFNAM ;PRINT FONT WE JUST READ
CRINFO [KSTID: ]
MOVE A,KSTID
PUSHJ P,DECPNT
CRINFO [CHARACTERS READ: ]
MOVE A,CHREAD
PUSHJ P,DECPNT
CRINFO [HEIGHT: ]
MOVE A,HEIGHT
PUSHJ P,DECPNT
CRINFO [WIDTH: ]
SETZ D,
SKIPE A,CHARD+40
HRRE D,(A) ;WIDTH OF SPACE
MOVEI B,MSETSZ-1
WCALC: SKIPN C,CHARD(B)
JRST WCALC1 ;CHAR NOT DEFINED
HRRE C,(C) ;WIDTH OF THIS CHAR
CAME D,C
JRST .+3
WCALC1: SOJGE B,WCALC
SKIPA A,[[ASCIZ /(Fixed)/]]
MOVEI A,[ASCIZ /(Variable)/]
PUSHJ P,OUTSTR
MOVE A,D
PUSHJ P,DECPNT
PUSHJ P,CRLF
MOVEI A,[ASCIZ /Write? (Y or N)/]
PUSHJ P,TYICR
CAIN A,"X
.BREAK 16,40000 ;KILL THYSELF
CAIN A,"Q ;ADDED TO BE COMPATIBLE WITH OTHER THINGS.
.BREAK 16,40000 ;KILL THYSELF
CAIN A,"N
JRST GO
CAIE A,"Y
JRST DONE
PUSHJ P,SETOUT
JRST REGO
;Print string pointed to by A, then read one char into A & type CRLF
TYICR: PUSHJ P,OUTSTR
.RESET TTYICH,
PUSHJ P,TYI
CAILE A,"a
SUBI A,40
PUSH P,A
PUSHJ P,CRLF
JRST POPAJ ;INITIALZE THE TV
TVGO: PUSHJ P,GET11 ;SET UP PAGE MAP FOR DISPLAY MEMORY
PUSHJ P,TVFWTI ;INTIALIZE TV WRITE ROUTINE
DEFINE TVSHOW N
TVSHW!N: SETZB X,PX
MOVN Y,HEIGHT
IMULI Y,N
ADDI Y,NLINS-1
MOVE PY,Y
MOVE B,[440700,,LINE!N]
MOVEM B,CHARBP
PUSHJ P,LINE
TERMIN
IRPC N,,[01234]
TVSHOW N
TERMIN
PUSHJ P,6TVFIN ;START BLINKING
JRST DONE
;THIS THE FILE NAME READER
.INSRT SYSEN2;FNR >
;READ INPUT FILE NAME
GETINM: SETZM IFFILE
SETZM IFFNM2
MOVEI A,[ASCIZ /INPUT: /]
PUSHJ P,OUTSTR
PUSHJ P,TTYLIN
MOVE A,COMPNT
ILDB A,A
CAIN A,15
.BREAK 16,40000 ;KILL THYSELF
MOVE B,[PUSHJ P,COMGET]
MOVEI C,0
JSR FNR"GETFIL
JRST GETIN1 ;IGNORE REST OF LINE
SKIPE D
HLRM D,IFDEV
SKIPE E
MOVEM E,IFFILE
SKIPN T
MOVSI T,'KST
MOVEM T,IFFNM2
SKIPE TT
MOVEM TT,IFFSNM
GETIN1: CAIN A,15
PUSHJ P,COMGET ;IGNORE CR
CAIN A,12
POPJ P, ;MEEKLY GO AWAY
HUH: PUSH P,A
MOVEI A,[ASCIZ /FORMAT: /]
PUSHJ P,OUTSTR
PUSHJ P,TTYLIN
MOVE B,[PUSHJ P,COMGET]
SETZ C,
JSR FNR"NAME ;GET ONE FILE NAME
MOVEI C,TYPTBL-1
CAME FNR"AC,TYPTAB(C)
SOJGE C,.-1
JUMPL C,HUH ;NO SUCH STYLE, TRY AGAIN
MOVE B,C
MOVEM B,ITYPE
POP P,A
CAIN A,12
POPJ P,
PUSHJ P,COMGET
JRST .-3
POPJ P,
;SET INPUT
SETIN: PUSHJ P,GETINM
MOVEI C,TYPTBL-1
MOVE B,IFFNM2
CAMN B,[SIXBIT />/]
MOVSI B,'AST
CAME B,TYPTAB(C)
SOJGE C,.-1
MOVEM C,ITYPE
JUMPGE C,.+2
PUSHJ P,HUH ;TYPE NOT DEFINED ASK HIM WHAT IT IS
POPJ P,
;THE TYPES OF FONTS WE GRONK
TYPTAB: SIXBIT /KST/ ;AI COMPILED
SIXBIT /FNT/ ;SAIL
SIXBIT /AST/ ;ASCII
SIXBIT /XH/ ;XEROX
SIXBIT /CMU/ ;CMU NEW FORMAT
SIXBIT /CU/ ;NEWER CMU FORMAT?
TYPTBL==.-TYPTAB
READF: KSTRED
FNTRED
ASTRED
XHRED
CMURED
CURED
CHECK READF,TYPTBL
WRITEF: KSTWRT
CNTWRT ;CAN'T WRITE 'FNT' STYLE FILES
ASTWRT
CNTWRT ;CAN'T WRITE XH STYLE
CNTWRT
CNTWRT
CHECK WRITEF,TYPTBL
CNTWRT: .CLOSE FONTCH,
MOVEI A,[ASCIZ /I CAN'T WRITE THAT STYLE.
/]
PUSHJ P,OUTSTR
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
CAIN A,15
JRST TTYCR
CAIN A,14
JRST TTYL1 ;IGNORE FORM FEEDS
CAIN A,12
JRST TTYLF
PUSHJ P,COMPUT
JRST TTYL1
RUBOUT: SOSGE COMCNT
JRST [ PUSHJ P,CRLF
JRST TTYLIN]
LDB A,B
PUSH P,B
SKIPN TVDPY
PUSHJ P,TYO
SKIPE TVDPY
PUSHJ P,[ MOVEI A,[ASCIZ /X/]
JRST OUTSTR]
POP P,B
PUSHJ P,DECBP ;DECREMENT BYTE POINTER
JRST TTYL1
DECBP: ADD B,[070000,,0]
JUMPGE B,CPOPJ
SUB B,[430000,,1]
POPJ P,
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,
TYI: .IOT TTYICH,A
POPJ P,
;TTY OUTPUT ROUTINES
OCTPNT: PUSH P,RADEX
PUSH P,[10]
POP P,RADEX
PUSHJ P,DECPNT
OCT1: POP P,RADEX
POPJ P,
DECPNT: JUMPGE A,DECPNP ;PRINT DECIMAL # IN A
PUSH P,A ;A IS NEGATIVE
MOVEI A,"-
PUSHJ P,TYO ;PRINT MINUS SIGN
POP P,A
MOVNS A ;MAKE A POSITIVE
DECPNP: IDIV A,RADEX ;PRINT POSITIVE DECIMAL #
HRLM B,(P)
SKIPE A
PUSHJ P,DECPNT
HLRZ A,(P)
ADDI A,"0
TYO: SKIPN TTYFLG
JRST PUTCHR
.IOT TTYOCH,A
POPJ P,
OUTSTR: MOVE B,A
HRLI B,440700
OUTS1: ILDB A,B
JUMPE A,CPOPJ
PUSHJ P,TYO
JRST OUTS1
TERPRI: PUSHJ P,OUTSTR
CRLF: MOVEI A,15
PUSHJ P,TYO
SKIPA A,[12]
TYOSPC: MOVEI A,40
JRST TYO
IFPNT: MOVEI A,IFDEV ;PRINTS INPUT FILE NAME
OPNPNT: MOVSS A
HRRI A,FCHST
BLT A,FCHST+FCHSTL-1
JRST RPFNAM
FNF: PUSHJ P,OPNPNT ;PRINT OPEN BLOCK AS FILE NAME
MOVEI A,[ASCIZ / /]
PUSHJ P,OUTSTR
.OPEN ERRICH,ERROPN
.VALUE ;LOSSAGE
FNF1: .IOT ERRICH,A
CAIGE A,40
JRST [ .CLOSE ERRICH,
JRST CRLF] ;FOUND CONTROL CHARACTER, END OF MESSAGE
PUSHJ P,TYO
JRST FNF1
PFNAM: HRLI A,FCHST
MOVSS A
.RCHST A,
RPFNAM: MOVE B,[220600,,FCHST]
PUSHJ P,SIXO
MOVEI A,":
PUSHJ P,TYO
MOVE B,[440600,,FCHST+3]
PUSHJ P,SIXO
MOVEI A,";
PUSHJ P,TYO
MOVE B,[440600,,FCHST+1]
PUSHJ P,SIXO
PUSHJ P,TYOSPC
MOVE B,[440600,,FCHST+2]
SIXO: TLNN B,770000
POPJ P,
ILDB A,B
JUMPE A,CPOPJ
ADDI A,40
PUSHJ P,TYO
JRST SIXO
;LOW LEVEL ROUTINES TO SUPPORT WRITE
OCTIN: PUSH P,RADEX
MOVEI A,10
MOVEM A,RADEX
PUSHJ P,DECIN
JRST OCT1
DECIN: SETZM C ;RETURNS DECIMAL # IN C
PUSHJ P,JUSTCH
CAIN A,"-
JRST DECIM ;NEGATIVE #
DECL: MOVEI B,-"0(A)
SKIPL B
CAILE B,9
POPJ P, ;RETURN WITH FIRST NON DIGIT
IMUL C,RADEX
ADD C,B
PUSHJ P,GETCHR
JRST DECL
DECIM: PUSHJ P,GETCHR
PUSHJ P,DECL ;READ A POSITIVE #
MOVNS C ;NEGATE IT
POPJ P,
JUSTCH: PUSHJ P,GETCHR ;INPUT UNTIL NON SPACE OR CR
CAIN A,15
POPJ P,
CAIE A,11
CAIN A,40
JRST JUSTCH
POPJ P,
DECINL: PUSHJ P,DECIN
JUMPL A,CPOPJ
GETL: PUSHJ P,GETCHR ;INPUT UNTIL LF OR EOF
JUMPL A,CPOPJ
CAIE A,12
JRST GETL
POPJ P,
DECNL1: PUSHJ P,DECINL ;LIKE DECINL, BUT POP EXTRA LEVEL IF EOF
JUMPGE A,.+2
SUB P,[1,,1]
POPJ P,
SPAGE: PUSHJ P,GETCHR ;INPUT UNTIL EOF OR PAGE
JUMPL A,CPOPJ
CAIE A,^L
JRST SPAGE
POPJ P,
WBUFIO: MOVE A,[-BUFSIZ,,BUF]
WBFIO1: .IOT FONTCH,A
WBFIO2: MOVE A,[440000,,BUF]
MOVEM A,IOPTR
MOVE A,BITPB ;BITS PER BYTE
DPB A,[300600,,IOPTR]
PUSH P,A
PUSH P,B
MOVEI A,44
IDIV A,-1(P)
IMULI A,BUFSIZ
POP P,B
SUB P,[1,,1]
SKIPN A
.VALUE ;BYTE SIZE TOO BIG
BUFIO1: MOVEM A,IOCNT
POPJ P,
CBUFIO: MOVE A,[-BUFSIZ,,BUF]
.IOT FONTCH,A
CBFIO2: MOVE A,[440700,,BUF]
MOVEM A,IOPTR
MOVEI A,BUFSIZ*5
JRST BUFIO1
ZAPBUF: MOVE A,[<<<<3_7\3>_7\3>_7\3>_7\3>_1] ;CLEAR LOW ORDER BIT MAKES PUB HAPPY
MOVEM A,BUF
MOVE A,[BUF,,BUF+1]
BLT A,BUF+BUFSIZ-1
POPJ P,
WIBUF: PUSHJ P,ZAPBUF
PUSHJ P,WBUFIO
WORDIN: SOSGE IOCNT
JRST WIBUF
ILDB A,IOPTR
POPJ P,
CIBUF: PUSHJ P,ZAPBUF
PUSHJ P,CBUFIO
GETCHR: SOSGE IOCNT
JRST CIBUF
ILDB A,IOPTR
CAIN A,^C
HRROS A
POPJ P,
WOBUF: PUSH P,A
PUSHJ P,WBUFIO
PUSHJ P,ZAPBUF
POP P,A
WRDOUT: SOSGE IOCNT
JRST WOBUF
IDPB A,IOPTR
POPJ P,
COBUF: PUSH P,A
PUSHJ P,CBUFIO
PUSHJ P,ZAPBUF
POP P,A
PUTCHR: SOSGE IOCNT
JRST COBUF
IDPB A,IOPTR
POPJ P,
;GET NEXT WORD OF FREE STORAGE
CONS: SOSL FREE
JRST CONS1
AOS A,CORSIZ ;INCREASE CORE ALLOCATION
.CORE (A)
.VALUE
MOVEI A,2000
ADDM A,FREE
CONS1: MOVE A,FSP
AOS FSP
SETZM (A)
POPJ P,
;GET WORD OF FREE STORAGE AND READ NEXT WORD INTO IT, RETURN POINTER
CONSIN: PUSHJ P,CONS
PUSH P,A
PUSHJ P,WORDIN
MOVEM A,@(P)
JRST POPAJ
;RESET THE DISPLAY
DRESET: DSTOP
SETZM DPYBUF
MOVE A,[DPYBUF,,DPYBUF+1]
BLT A,DPYBUF+DPYBFL-1
SETZM DBYTE
MOVE A,[442200,,DPYBUF]
MOVEM A,DBYTEP
MOVEI A,DPYBFL*2
MOVEM A,DBYTEF
SETZM DSIZE
MOVEI A,7
MOVEM A,DBRITE
MOVEI X,0
MOVEI Y,1777-24
MOVEI A,340CHR ;FAKE OUT MODESW
MOVEM A,DMODE
BEAMXY: MOVEI A,340PNT ;POSITION BEAM AT X-Y, SET PX AND PY
CAME A,DMODE
PUSHJ P,MODESW
MOVE A,Y ;Y FIRST
PUSHJ P,BEAM1
TRO A,200000 ;ITS Y
PUSHJ P,DPYPUT
MOVE A,X ;NOW X
PUSHJ P,BEAM1
MOVE PX,X
MOVE PY,Y
DPYPUT: SOSGE DBYTEF ;PUT HALF-WORD INTO DISPLAY LIST
.VALUE
IDPB A,DBYTEP
AOS DBYTE
POPJ P,
;CHECKS FOR BEAM ON SCREEN, MAKES POINT MODE INSTRUCTION
BEAM1: SKIPL A
CAILE A,1777
.VALUE ;OFF SCREEN
TRO A,20000 ;STAY IN POINT MODE
POPJ P,
;SPECIAL HACK TO ENTER INCREMENT MODE
VBEAMX: MOVEI A,340PNT ;FIRST GET INTO POINT MODE
CAME A,DMODE
PUSHJ P,MODESW
MOVE A,X
PUSHJ P,BEAM1
TRZ A,20000 ;GO INTO INCREMENT MODE
TRO A,142000 ;AND MAKE VISIBLE
PUSHJ P,DPYPUT
MOVEI A,340INC
MOVEM A,DMODE
SETZM IBYTEF
POPJ P,
;PLOT INCREMENT IN A
INCREM: MOVEI B,340INC
CAMN B,DMODE
JRST INCR1 ;ALREADY IN INCREMENT MODE
PUSH P,A
MOVEI A,340INC ;GET INTO INCREMENT MODE
PUSHJ P,MODESW
INCR0: MOVE B,DBYTEP ;BYTE POINTER TO WORD GOING IN
MOVEM B,IBYTEP
MOVEI A,200000 ;INTENSIFY BEAM
PUSHJ P,DPYPUT
POP P,A
MOVEI B,4 ;4 INCREMENTS/DISPLAY INSTRUCTION
MOVEM B,IBYTEF
MOVEI B,2 ;2 BIT BYTE SIZE
DPB B,[300600,,IBYTEP]
IBP IBYTEP ;SKIP OVER INTENSIFY AND ESCAPE BITS
MOVEI B,4 ;4 BIT BYTE SIZE
DPB B,[300600,,IBYTEP]
INCR1: SOSL IBYTEF
JRST INCR2 ;ROOM FOR THIS INCREMENT
PUSH P,A ;PUT NEXT DISPLAY WORD IN
JRST INCR0
INCR2: IDPB A,IBYTEP
POPJ P,
;DRAWS VECTOR, DELTA-X AND DELTA-Y IN PX AND PY
IVECT: SKIPA B,[0]
VECT: MOVEI B,200000 ;FOR VISIBLE VECTOR
MOVE A,PX
PUSHJ P,SGNMAG ;CONVERT TO SIGN MAGNITUDE
JRST [ JUMPE B,BEAMXY ;DO SET POINT FOR INVISIBLE
.VALUE]
IOR B,A
MOVE A,PY
PUSHJ P,SGNMAG
JRST [ TRNN B,200000 ;SET POINT FOR INVISIBLE
JRST BEAMXY
.VALUE]
LSH A,10
IOR A,B ;VECTOR WORD
PUSH P,A
MOVEI A,340VEC
CAME A,DMODE
PUSHJ P,MODESW ;GET INTO VECTOR MODE
POP P,A
JRST DPYPUT ;INTO DISPLAY LIST
;CHECKS FOR LEGAL VECTOR LENGTH AND CONVERTS TO SIGN MAGNITUDE
SGNMAG: CAML A,[-177]
CAMLE A,[177]
POPJ P, ;CAN'T HACK IT
JUMPGE A,POPJ1
MOVNS A ;CONVERT TO SIGN MAGNITUDE
TRO A,200
JRST POPJ1
;GET INTO PARAMETER MODE AND SWITCH TO MODE IN A
MODESW: SKIPL B,DMODE
CAILE B,7
.VALUE ;ILLEGAL MODE
PUSHJ P,@MODESD(B) ;GET INTO PARAMETER MODE
TDNE A,[-1,,777770]
.VALUE ;ILLEGAL MODE
MOVEM A,DMODE
LSH A,15 ;MODE IN DISPLAY INSTUCTION
IORI A,110 ;RESET INTENSITY AND SCALE
SKIPL B,DBRITE
CAILE B,7
.VALUE ;ILLEGAL INTENSITY
IOR A,B
SKIPL B,DSIZE
CAILE B,3
.VALUE ;ILLEGAL SIZE
LSH B,4
IOR A,B
JRST DPYPUT ;INTO DISPLAY LIST
;DISPATCH TABLE FOR ESCAPE TO PARAMETER MODE
MODESD: CPOPJ ;0 PARAMETER
ESCPNT ;1 POINT
[.VALUE] ;2 ILLEGAL
CPOPJ ;3 CHARACTER
ESCIV ;4 VECTOR
CPOPJ ;5 VECTOR CONTINUE
ESCIV ;6 INCREMENT
[.VALUE] ;7 ILLEGAL
;ESCAPE FROM POINT MODE
ESCPNT: PUSH P,A
LDB A,DBYTEP
MOVEI B,340PAR
DPB B,[150300,,A]
DPB A,DBYTEP
POPAJ: POP P,A
POPJ P,
;ESCAPE FROM VECTOR OR INCREMENT MODE
ESCIV: LDB B,DBYTEP
TRO B,400000
DPB B,DBYTEP
POPJ P,
;DISPLAYS ONE CHARACTER LINE
LINE: MOVE C,HEIGHT
LIN0: PUSH P,CHARBP
LIN1: ILDB CODE,CHARBP
JUMPE CODE,LIN2 ;END OF LINE
SKIPN E,CHARD(CODE) ;POINTS INTO FONT DESCRIPTION
JRST LIN1 ;NOT DEFINED
HLRE T,(E) ;Left Kern
ADD T,CPA
SKIPE TVDPY
SUB X,T
SUB PX,T
PUSHJ P,CHRROW
MOVE E,CHARD(CODE) ;Account for CW-RW & Kern
HRRZ D,(E) ;Character Width
HRRZ A,1(E) ;Raster width
SUB D,A
HLRE A,(E) ;Left Kern
ADD A,CPA
ADD D,A
SKIPE TVDPY
ADD X,D
ADD PX,D
JRST LIN1
;HERE FOR END OF RASTER LINE
LIN2: SKIPE TVDPY
COMMENT $ ;Old routine doesn't work for kerning
SKIPN TVDPY
JRST LIN3
MOVEI TT,0
MOVEI U,44
PUSHJ P,TVFWT ;FILL OUT REST OF 11AC
JFCL ;POINT OFF SCREEN
$ PUSHJ P,TVFWTI ;AND THEN RESET
LIN3: POP P,CHARBP
MOVEI X,0
SUBI Y,1
MOVE PX,X
MOVE PY,Y
SKIPN TVDPY
PUSHJ P,BEAMXY
SOJG C,LIN0
POPJ P, ;CHARACTER COMPLETE
;ROUTINES TO DISPLAY RASTER LINE ON 340
;ACCUMULATOR USAGE
; C HEIGHT COUNTER
; D WIDTH COUNTER
; E POINTS TO CURRENT ROW WORD
; T SCRATCH AC
; TT ROW MASK
; U BIT COUNTER (# BITS LEFT IN TT)
;GENERATE DISPLAY FOR ONE RASTER LINE OF ONE CHARACTER
CHRROW: MOVEI E,1(E)
HRRZ D,(E) ;WIDTH
MOVE A,HEIGHT ;HEIGHT
SUB A,C ;ROWS PROCESSED
HLRZ T,(E) ;WORDS/ROW
IMUL A,T
ADD E,A ;POINTS TO LAST WORD PROCESSED
SKIPE TVDPY
JRST TVCHR
CHROW1: PUSHJ P,ROWSH1 ;GET FRESH ROW WORD
CHROW2: JUMPE TT,CHRAZ ;ALL ZEROS LEFT IN ROW WORD
PUSHJ P,RWSHFT ;SHIFT OVER MASK
JUMPE T,[AOJA PX,.-1] ;UPDATE PSEUDO X IF NO POINT HERE
ADDI PX,1
;FOUND A POINT TO PLOT -- ENTER INCREMENT MODE
SUB PX,X ;FIND DELTA-X TO MOVE BEAM
SUB PY,Y
CAIE PY,
.VALUE ;SHOULD BE NO DELTA-Y
ADD X,PX ;NEW BEAM LOCATION
ADD Y,PY
PUSHJ P,VBEAMX ;MOVE BEAM, DISPLAY POINT, ENTER INCREMENT
PUSHJ P,RWSHFT
JUMPN T,CHROW3
ADDI X,1
LDB A,DBYTEP ;OOPS, ONLY 1 POINT TO PLOT
TRZ A,140000 ;GET OUT OF INCREMENT MODE
TRO A,20000 ;AND GET INTO POINT MODE
DPB A,DBYTEP
MOVEI A,340PNT
MOVEM A,DMODE
MOVE PX,X
MOVE PY,Y
JRST CHROW2
;INCREMENT MODE LOOP
CHROW3: MOVEI A,10 ;MOVE X RIGHT
PUSHJ P,INCREM
ADDI X,1
PUSHJ P,RWSHFT
JUMPN T,CHROW3 ;JUMP FOR ANOTHER POINT
MOVE PX,X ;ACTUAL BEAM LOCATION AND PSEUDO THE SAME
MOVE PY,Y
AOJA PX,CHROW2
;ROUTINE TO SHIFT IN THE NEXT BIT
RWSHFT: MOVEI T,0
LSHC T,1
SUBI U,1
SOJLE D,CPOPJ ;EXIT ROUTINE
JUMPG U,CPOPJ
ROWSH1: ADDI E,1 ;RESET POINTER FOR FRESH WORD
MOVE TT,(E)
MOVEI U,44 ;36. FRESH BITS
POPJ P,
;HERE FOR ALL ZERO'S LEFT IN ROW WORD
CHRAZ: JUMPLE D,CHRAZ1 ;LEAVE CHRROW, WIDTH COUNTED OUT
ADD PX,U ;MOVE PSEUDO BEAM
SUB D,U ;UPDATE WIDTH
JUMPG D,CHROW1 ;MORE TO GO
ADD PX,D ;CORRECT BEAM LOCATION
POPJ P, ;EXIT CHRROW
CHRAZ1: ADD PX,D
POPJ P,
;WRITE 1 LINE OF FONT INTO TV MEMORY
TVCHR: JUMPLE D,CPOPJ
PUSHJ P,ROWSH1 ;GET FRESH WORD
SUB D,U
SKIPGE D
ADD U,D ;# VALID BITS IN TT
PUSH P,U
PUSHJ P,TVFWT ;Write bits into 11
JFCL ;POINT OFF SCREEN
POP P,U
ADD X,U
MOVE PX,X
JRST TVCHR
COMMENT $ ;Old routine, losses for kerning etc.
;UPDATE 11AC WRITE IF OVERFLOW
TVFWT: MOVN B,11BITS ;FREE BITS IN 11AC IN SAVE PLACE
ADDM U,11BITS
SKIPGE 11BITS
JRST TVFWT1 ;JUST SHIFT AND GET OUT
MOVE U,11BITS ;OVERFLOW, # BITS LEFT IN TT
MOVNI A,40
ADDM A,11BITS
MOVEI T,0
EXCH T,11AC
LSHC T,(B)
LSH T,4 ;32 BIT PLUS 4 BITS OF 0
MOVEM T,11WRD
PUSHJ P,TVXY ;CALULATE ADDRESS OF THIS WORD
JRST TVFWTI ;POINT OFF SCREEN
MOVEM A,11ADR
MOVE A,[CSET]
MOVEM A,TVALUM
PUSHJ P,6TVWRT
SKIPL 11BITS
JRST TVFWT2 ;NEED TO WRITE ANOTHER WORD INTO 11 MEMORY
TVFWT1: MOVE T,11AC
LSHC T,(U)
MOVEM T,11AC
JRST POPJ1
TVFWT2: PUSH P,X ;SCREW CASE, WRITE TWICE
ADDI X,40 ;FORCE WRITE INTO NEXT TEN WORD
PUSHJ P,TVXY
JRST POPXJ1 ;POINT OFF SCREEN
MOVEM A,11ADR
LSHC T,40
LSH T,4
MOVEM T,11WRD
PUSHJ P,6TVWRT
MOVNI A,40
ADDM A,11BITS
MOVEI T,0
LSHC T,-40(U)
MOVEM T,11AC
POPXJ1: POP P,X
JRST POPJ1
$
;INITIALIZE 11AC AND BIT COUNT
TVFWTI: MOVNI B,40 ;32 BITS AT A TIME
MOVEM B,11BITS
SETZM 11AC
POPJ P,
;Write 36 bits in TT into X,Y
;(In worst case this can mean writing 3 32. bit double PDP11 words)
TVFWT: PUSH P,X
MOVE A,X
IDIVI A,32.
MOVN B,B ;# of bits from left of 32. bit word that 36. bits start
TVFWT1: MOVE T,TT
SETZ TT,
LSHC T,-4(B) ;shift bits into correct position in TT
LSH T,4 ;Shift bits back in T
PUSHJ P,TVXY
JRST POPXJ ;give up if off screen
JUMPE T,TVFWT2
MOVEM A,11ADR
MOVEM T,11WRD
PUSHJ P,6TVWRT
TVFWT2: ADDI X,32.
SETZ B,
JUMPN TT,TVFWT1
POPXJ: POP P,X
POPJ P,
;CALCULATE 11ADR GIVEN X,Y
TVXY: SKIPL X
CAIL X,BITPL
POPJ P, ;NON-SKIP RETURN FOR POINT OFF SCREEN
SKIPL Y
CAIL Y,NLINS
POPJ P,
MOVN A,Y ;X-Y -> 11 BIT ADDRESS
IMULI A,BITPL/10 ;BYTE ADDRESS OF BEGINNING OF LINE
ADDI A,11TVHI+2-BITPL/10
PUSH P,A
MOVE A,X
LSH A,-3 ;BYTE WITHIN LINE
ADDM A,(P)
POPAJ1: AOS -1(P) ;SKIP RETURN
JRST POPAJ
;READS IN 'KST' SYTLE SET
KSTRED: PUSHJ P,WORDIN ;READ FONT DESCRIPTION
MOVEM A,KSTID
PUSHJ P,WORDIN
HRRZM A,HEIGHT
PUSH P,A
LDB A,[221100,,(P)] ;BASE LINE
MOVEM A,BASE
LDB A,[331100,,(P)] ;COLUMN POSITION ADJUSTMENT
MOVEM A,CPA
SUB P,[1,,1]
MOVEI A,MSETSZ ;SKIP NULL, TAB, CR, VT, LF
MOVEM A,CHRCNT
PUSHJ P,KSTIN
JRST .+3 ;END OF FILE
SOSLE CHRCNT
JRST .-3
.CLOSE FONTCH,
MOVEI A,MSETSZ
SUB A,CHRCNT
POPJ P,
;READS IN 'FNT' STYLE SET
FNTRED: PUSH P,[0] ;COUNT OF CHARACTERS
MOVEI B,MSETSZ ;MAX CHARS IN SET
MOVEI CODE,0
FNTR1: PUSHJ P,WORDIN
JUMPE A,FNTR1A
AOS (P) ;ANOTHER WINNER
HLRZS A ;WIDTH
MOVNM A,CHARD(CODE)
FNTR1A: ADDI CODE,1
SOJG B,FNTR1
PUSHJ P,WORDIN ;KSTID
MOVEM A,KSTID
PUSHJ P,WORDIN ;HEIGHT
MOVEM A,HEIGHT
PUSHJ P,WORDIN ;MAX WIDTH
PUSHJ P,WORDIN
MOVEM A,BASE ;BASE LINE
PUSHJ P,WORDIN
MOVEM A,CPA ;COLUMN POSITION ADJUSTMENT
.ACCES FONTCH,[400]
SETZM IOCNT ;FORCE BUFFER INPUT ON NEXT WORDIN
PUSH P,(P) ;COUNTER
FNTR2: SOSGE (P)
JRST FNTR3 ;FINISH UP AND RETURN
PUSHJ P,FNTIN ;READ CHARACTER DEF
.VALUE ;HUH
JRST FNTR2
FNTR3: SUB P,[1,,1]
MOVEI CODE,MSETSZ-1 ;CLEAN UP THE WORLD
SKIPGE CHARD(CODE)
.VALUE
SOJGE CODE,.-2
;PERFORM CHARACTER TRANSLATIONS
;UNDER SCORE AND LEFT ARROW
IRP CODE,,[30,137,30]
EXCH A,CHARD+CODE
TERMIN
;CLOSE BRACE, ALTMODE, NOT EQUALS, TILDE
IRP CODE,,[176,175,33,32,176]
EXCH A,CHARD+CODE
TERMIN
;CARROT, UP ARROW, INTEGRAL SIGN
IRP CODE,,[177,136,13,177]
EXCH A,CHARD+CODE
TERMIN
FNTR4: .CLOSE FONTCH,
JRST POPAJ
;'CU' FORMAT, YET ANOTHER CMU STYLE FORMAT
CURED: PUSH P,[CUEXIT] ;EXIT ROUTINE TO RESET BYTE SIZE
MOVEI A,20
MOVEM A,BITPB ;FILE IS SERIES OF 16 BIT BYTES
SETOM CULCOD ;LAST CHARCTER WE LOST ON
PUSHJ P,WORDIN ;HEIGHT
SETZM BASE
SETZM CPA
MOVEM A,HEIGHT
PUSHJ P,WORDIN ;MAXIMUM WIDTH IN 16 BIT BYTES
PUSH P,A ;BYTES/ROW
SETZM CHRCNT
CUCHR: PUSHJ P,WORDIN ;ASCII CODE
CAILE A,MSETSZ-1
JRST POPAJ ;ILLEGAL CODE, RETURN
MOVE CODE,A
PUSHJ P,WORDIN ;BIT WIDTH OF THIS CHARACTER
JUMPL A,POPAJ
MOVE D,A
ADDI A,17 ;WORDS PER ROW FOR THIS CHARACTER
IDIVI A,20
; JUMPE A,POPAJ
CAMLE A,(P) ;IS DATA SELF CONSISTANT
JRST POPAJ ; NO, GET OUT NOW
MOVE B,A ;SIGNIFICANT BYTES/ROW
SUB A,(P)
MOVN C,A ;EXTRA BYTES/ROW
PUSHJ P,CONS ;GET WORD OF STORAGE
SKIPE CHARD(CODE)
PUSHJ P,DUPCHR ;DUPLICATE CHARACTER
MOVEM A,CHARD(CODE)
MOVEM D,(A) ;0 (LEFT KERN),,SPACING WIDTH
ADDI D,43
IDIVI D,44 ;WORDS/LINE
HRL D,@CHARD(CODE)
PUSHJ P,CONS
MOVSM D,(A) ;WORD/LINE,,RASTER WIDTH
SKIPG E,HEIGHT
JRST POPAJ ;ILLEGAL HEIGHT
CUROW: MOVEI V,CUPUT ;CO-ROUTINE LINKAGE THROUGH V
MOVE T,B ;SIGNIFICANT BYTES/ROW
jumple t,curfix
CUWORD: PUSHJ P,WORDIN
cain code,101 ;krokishly extract basline info from A
jrst [ came t,b
jrst .+1
jumpe a,.+1
push p,a
move a,height
sub a,t
camle a,base
movem a,base
pop p,a
jrst .+1]
JSP V,(V)
SOJG T,CUWORD
curfix: SKIPG T,C ;EXTRA BYTES/ROW
JRST CUROW1
CUROW0: PUSHJ P,WORDIN
SKIPE A
PUSHJ P,CULOST ;LOST SIGNIFCANCE
SOJG T,CUROW0
CUROW1: SOJG E,CUROW
AOS CHRCNT
JRST CUCHR
CUEXIT: MOVEI A,44
MOVEM A,BITPB
POPJ P,
;CO-ROUTINE HACKAGE FOR STORING BIT MATRIX
CUPUT: MOVE U,A ;16 BITS
MOVEI D,44 ;BITS/WORD
PUSHJ P,CONS
EXCH A,U
JRST CUPUT0
;HERE FOR WORD OVERLAP
CUPUT1: EXCH A,U ;A GETS ADDRESS TO WRITE, U GETS BITS
EXCH TT,U ;BITS GO IN TT
MOVEI U,0
LSHC TT,(D)
IORM TT,(A)
PUSHJ P,CONS
EXCH A,U
ADDI D,44 ;44 FRESH BITS
IORM A,(U)
JSP V,(V)
CUPUT0: SUBI D,20
JUMPL D,CUPUT1
LSH A,(D)
CUPUT2: IORM A,(U)
JSP V,(V) ;CO-ROUTINE RETURN
JRST CUPUT0
CULOST: CAMN CODE,CULCOD
POPJ P,
MOVEM CODE,CULCOD
PUSH P,A
PUSH P,B
MOVEI A,[ASCIZ /LOST BITS TO RIGHT OF CHARACTER /]
PUSHJ P,OUTSTR
MOVE A,CODE
PUSHJ P,OCTPNT
PUSHJ P,CRLF
JRST ERRXIT
;DUPLICATE CHARACTER
DUPCHR: PUSH P,A
PUSH P,B
MOVEI A,[ASCIZ /DUPLICATE CHARACTER - CODE /]
PUSHJ P,OUTSTR
MOVE A,CODE
PUSHJ P,OCTPNT
PUSHJ P,CRLF
ERRXIT: SETOM ERRFLG
POPBAJ: POP P,B
JRST POPAJ
;'CMU' FORMAT
CMURED: PUSHJ P,WORDIN
SETZM KSTID ;CRUFTY KSTID!
PUSHJ P,WORDIN
HRRZM A,HEIGHT ;HEIGHT
PUSHJ P,WORDIN ;"FORMAT NUMBER"
PUSHJ P,WORDIN
HRRZM A,BASE ;BASELINE
PUSHJ P,WORDIN
HRRZM A,CPA ;COLUMN BASE ADJUST
MOVEI D,200+5 ;FIVE SPARE, PLUS ONE WORD/CHAR
PUSHJ P,WORDIN
SOJG D,.-1
SETZM CHRCNT
CMULP: PUSHJ P,CMUIN
JRST CMUDN
AOS CHRCNT
JRST CMULP
CMUDN: .CLOSE FONTCH,
MOVE A,CHRCNT
POPJ P,
CMUIN: PUSHJ P,WORDIN
AOJN A,CPOPJ ;LOSER, SHOULD BE -1
PUSHJ P,WORDIN
HRRZ CODE,A ;CHAR CODE
CAILE CODE,MSETSZ-1
POPJ P, ;ILLEGAL CHARACTER CODE, GOOD BYE
SKIPE CHARD(CODE)
PUSHJ P,DUPCHR
PUSHJ P,CONS
MOVEM A,CHARD(CODE)
PUSHJ P,WORDIN
HLRZM A,@CHARD(CODE)
HRRZ D,A
PUSHJ P,CONS
HRRM D,(A)
ADDI D,35.
IDIVI D,36.
HRLM D,(A)
HRRZM D,WDSPR'
HRRZ D,(A) ;WIDTH IN BITS
ADDI D,7
IDIVI D,10
HRRZM D,BYTPR' ;BYTES PER ROW
PUSHJ P,WORDIN
HLRZM A,TOPBL'
HRRZM A,BOTBL'
MOVE C,WDSPR
IMUL C,TOPBL
SOJL C,TOPDN
PUSHJ P,CONS
JRST .-2
TOPDN: MOVE C,HEIGHT
SUB C,TOPBL
SUB C,BOTBL
PUSH P,WDSPR
PUSH P,BYTPR
MOVEI V,0
SOJL C,MDDN
PUSHJ P,FONTI
JRST .-2
MDDN: SUB P,[2,,2]
MOVE C,BOTBL
IMUL C,WDSPR
SOJL C,POPJ1
PUSHJ P,CONS
JRST .-2
COMMENT $ MIT 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 = amount to move left from the
;Logical left end of the character to the left edge
;of the raster. + means move left, - move right.
;left kern always 0 for CMU
RASTER_WIDTH,,CHARACTER_WIDTH
;raster width always 0 for CMU
;Character Wdith = amount that the line bit position
;is increased by printing the character.
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.
$
COMMENT $ FED INTERNAL FORMAT
CHARD(CODE) ;points to character description
FORMAT OF CHARACTER DESCRIPTION
LEFT_KERN,,CHARACTER_WIDTH
;used to be CHARIACTER ID
WORDS_PER_RASTER_LINE,,RASTER_WIDTH
CHARACTER_MATRIX
;the matix is stored one row per word left justified
;if the character width is more that 36 bits then
;the row is continued in the next words
$
;ROUTINE TO READ IN ONE CHARACTER FROM 'KST' FILE
;ACCUMULATOR USAGE FOR THIS ROUTINE
; A POINTS INTO FONT DESCRIPTION
; B CHUNK COUNTER
; C ROW COUNTER
; D # BITS LEFT TO PROCESS FOR THIS ROW
; E BIT COUNTER (TT)
; T CHUNK
; TT ROW BITS (36/WORD)
; U WORD FROM FONT FILE
; V BYTE POINTER INTO U
KSTIN: PUSHJ P,CONSIN ;USER ID
PUSH P,A
PUSHJ P,WORDIN
HRRZ CODE,A ;ASCII CODE
HLLM A,@(P) ;LEFT KERN
POP P,A
CAILE CODE,MSETSZ-1
POPJ P, ;ILLEGAL CODE
SKIPE CHARD(CODE)
PUSHJ P,DUPCHR ;CHARACTER PREVIOUSLY DEFINED
MOVEM A,CHARD(CODE) ;POINT INTO FONT
PUSHJ P,CONSIN ;RASTER WIDTH,,CHARACTER WIDTH
HRRZ D,(A) ;CHARACTER WIDTH
HRRM D,@CHARD(CODE)
HLRZ D,(A) ;RASTER WIDTH
CAIE D,0 ;DEFAULT TO CHARACTER WIDTH?
MOVSS (A)
HRRZ D,(A) ;RASTER WIDTH
ADDI D,35.
IDIVI D,36. ;# 36 BIT WORDS TO STORE ROW OF FONT
HRLM D,(A) ;SAVE WITH DEFINITION
HRRZ D,(A) ;WIDTH AGAIN
PUSH P,D
ADDI D,7
IDIVI D,10 ;# 8 BIT BYTES IN A ROW
MOVE C,HEIGHT ;SET UP ROW COUNTER
MOVEI V,0
PUSH P,D
KSTLP: PUSHJ P,FONTI ;Read in one row
SOJG C,KSTLP
SUB P,[2,,2]
POPJ1: AOS (P)
CPOPJ: POPJ P,
;MAIN LOOP
FONTI: MOVE B,-1(P) ;# CHUNKS PER ROW
MOVE D,-2(P) ;WIDTH OF CHARCTER
FONTI0: SETZB T,TT
MOVEI E,44
FONTI1: SOJL B,FONTI4
TLNN V,700000
PUSHJ P,[ PUSHJ P,WORDIN
MOVE U,A
MOVE V,[441000,,U]
TRNE U,1
.VALUE ;START NEXT CHARACTER DESCRIPTION
POPJ P,]
ILDB T,V
SUBI E,10
JUMPLE E,FONTI2
CIRCI T,-10
JRST FONTI1 ;MORE TO GO
FONTI2: JUMPE E,[ CIRCI T,-10
JRST FONTI3]
CAME E,[-4]
.VALUE ;SHOULD BE ONLY 4 BITS LEFT
CIRCI T,-4 ;FILL THE REST OF THE WORD
FONTI3: PUSHJ P,CONS ;STORE AWAY 36 BITS
MOVEM TT,(A)
SUBI D,44
JUMPE E,[ JUMPG B,FONTI0 ;BACK FOR MORE IF NO BITS LEFT IN T
JRST FONTI5] ;FINISHED READING THIS ROW
MOVEI TT,0
CIRCI T,-4 ;T IS NOW CLEAR
MOVEI E,40 ;AND THERE ARE 4 BITS IN TT
JUMPG B,FONTI1
JUMPLE D,FONTI5
;FINISHED READING ONE ROW
FONTI4: CAIL E,44
JRST FONTI5
LSH TT,(E) ;LEFT JUSTIFY
PUSHJ P,CONS
MOVEM TT,(A)
FONTI5: POPJ P,
COMMENT $ STANFORD FONT FORMAT:
WORDS 0-177:
XWD CHARACTER_WIDTH,CHARACTER_ADDRESS
;Character address is the word number
;in the file where the character
;definition begins.
;(unused by FC)
WORDS 200-237:
200 CHARACTER_SET_NUMBER ;(unused by FC)
201 HEIGHT ;(in scan lines)
202 MAX_WIDTH ;(in bits)(unused by FC)
203 BASE LINE ;(# of scan lines from top of character)
204 COLUMN POSITION ADJUSTMENT ;#of columns to shift left when selecting
;this font, right when delselecting,
;left at all explicit column selects.
;used for fonts with left kerns.
205 Font Characteristics Word ;Reserved for future use. Will contain
;Bits characterizing the font
WORDS 240-377:
ASCIZ/FONT DESCRIPTION/
REMAINDER OF FILE:
;(consists of "character definitions", packed sequentially into
;the file).
EACH CHARACTER DEFINITION:
BYTE(9)RASTER_WIDTH,CHARACTER_CODE(18)WORD_COUNT+2
;(wc+2 is total space devoted
;to this definition).
;if raster width=0 then use character width
BYTE(9)LEFT_KERN,ROWS_FROM_TOP(18)DATA_ROW_COUNT
;Count of blank rows from the
;top. Count of non-blank data
;rows. (pad with blank rows
;at the bottom)
;size of column adjustment for left kern
;Left Kern = amount to move left from the
;Logical left end of the character to the left edge
;of the raster. + means move left, - move right.
BLOCK WORD_COUNT ;Data packed into words such that
;an ILDB gets the next scan line
;unless character width > 36
;where next scan line starts
;at first available word boundary.
Raster width is the size of the definition of the character. Character
width is the amount the column counter is advanced bu printing this
character. This allows characters to space less than their actual
width. Caution: use of this feature will lead to more complex
lines than would otherwise result. Some space and time problems may arise.
$
;READS IN ONE 'FNT' STYLE FONT
FNTIN: PUSHJ P,CONSIN ;"USER" ID, BYTE (9) WIDTH, CODE (18) WORD COUNT
LDB CODE,[221100,,(A)]
TRNE CODE,600
.VALUE
LDB B,[331100,,(A)] ;RASTER WIDTH
PUSH P,B
MOVNS B ;MAKE IT NEGATIVE
CAIN B,0
MOVE B,CHARD(CODE) ;USED CHARACTER WIDTH ON LINE
JUMPE B,[ SETZM CHARD(CODE) ;IGNORE THIS CHARACTER
JRST POPAJ1]
SKIPL B
.VALUE
EXCH A,CHARD(CODE) ;WIDTH AND POINTER TO CHARACTER DESCRIPTION
MOVNM A,(P) ;MAKE CHARACTER WIDTH EXPLICIT
PUSHJ P,CONS
MOVNM B,(A) ;RASTER WIDTH (MIGHT BE DIFFERENT THAT CHARACTER WIDTH)
MOVNS B
ADDI B,43
IDIVI B,44 ;WORDS/ROW
HRLM B,(A)
PUSHJ P,WORDIN ;BYTE (9) LEFT_KERN,ROWS_FROM_TOP (18) ROW_COUNT
LDB C,[331100,,A] ;LEFT KERN
TRNE C,400
TRO C,-400 ;EXTEND SIGN IF NEGATIVE
HRLM C,(P) ;LEFT KERN,,CHARACTER WIDTH
LDB C,[221100,,A]
PUSH P,A
JUMPE C,FNTIN1 ;NO BLANK ROWS ON TOP
IMUL C,B ;# WORDS OF ZEROES
PUSHJ P,CONS
SOJG C,.-1
FNTIN1: HRRZ E,@CHARD(CODE) ;DATA WORD COUNT
SUBI E,2 ;WE'VE ALREADY READ 2
JUMPLE E,FNTIN2 ;NO NON-BLANK ROWS
MOVE A,CHARD(CODE)
HRRZ A,1(A) ;PICKUP RASTER WIDTH
CAIGE A,23
JRST FNTI1A ;MORE THAN 1 SCAN LINE/WORD
MOVNS A
MOVNI C,1
LSH C,(A)
PUSHJ P,CONSIN
ANDCAM C,(A)
SOJG E,.-2
FNTIN2: POP P,A
LDB D,[221100,,A] ;BLANK ROWS AT TOP
HRRZ C,A ;NON-BLANK ROW COUNT
ADD C,D
SUB C,HEIGHT ;BLANK ROWS AND END
JUMPE C,FNTIN3
IMUL C,B ;CONVERT TO WORD COUNT
SKIPL C
.VALUE
PUSHJ P,CONS
AOJL C,.-1
FNTIN3: POP P,@CHARD(CODE) ;LEFT KERN,,CHARACTER WIDTH
JRST POPJ1
;HERE TO PROCESS FONT WITH MULTIPLE SCAN LINES PER WORD
FNTI1A: PUSH P,(P)
HRRZS (P) ;ROW COUNT
PUSH P,A ;WILL BE AMOUNT TO SHIFT
PUSH P,[440000,,T] ;ALMOST A BYTE POINTER
DPB A,[300600,,(P)] ;WIDTH FIELD
MOVEI C,44
IDIV C,A ;SCAN LINES/WORD
PUSH P,C
MOVEI C,44
SUBM C,-2(P)
FNTI1B: PUSHJ P,WORDIN
MOVE T,A
MOVE TT,(P)
MOVE D,-1(P)
FNTI1C: ILDB C,D
PUSHJ P,CONS
LSH C,@-2(P)
MOVEM C,(A)
SOSLE -3(P) ;ROW COUNT
SOJG TT,FNTI1C
SOJG E,FNTI1B
SKIPE -3(P)
JFCL ;ROW COUNT AND WORD COUNT DISAGREE (ROW COUNT IS REAL THING)
SUB P,[4,,4]
JRST FNTIN2
;READS IN ONE 'XH' STYLE FONT
;FORMAT IS 2 16 BIT NOVA WORDS PER PDP10 WORD,
;NOVA WORD 0/ K NUMBER OF HCARS IN FONT
;1/ N NUMBER OF WORDS OF BIT DATA
;2/ H HEIGHT OF FONT IN BITS
;3/ W MAXIMUM WIDTH, IN WORDS, OF ANY CHAR'S DATA
;4/ SELF RELATIVE PNTRS TO DATA FOR CHAR
;4+K/ WIDTH IN BITS FOR CHAR
;4+2K/ BIT DATA FOR EACH CHAR
XHRED: SETZB V,KSTID
PUSHJ P,XHWDIN ;READ A 16 BIT WORD
MOVE D,A ;CHAR SET SIZE
PUSHJ P,XHWDIN ;IGNORE MAX WIDTH
PUSHJ P,XHWDIN
MOVEM A,HEIGHT
PUSHJ P,XHWDIN
MOVE TT,A ;MAX CHAR WIDTH (IN 16. BIT WORDS)
;READ IN SELF RELATIVE PNTRS INTO CHARD TABLE
SETZ CODE,
XHPNRD: PUSHJ P,XHWDIN ;GET RELATIVE PNTR
CAIGE CODE,MSETSZ
MOVEM A,CHARD(CODE)
AOJ CODE,
SOJG D,XHPNRD ;JUMP IF MORE PNTRS TO READ
;NOW READ WIDTHS INTO FREE STORAGE
CAILE CODE,MSETSZ
MOVEI CODE,MSETSZ ;DON'T DO MORE THAN MSETSZ CHARS
MOVEM CODE,XHSTSZ'
MOVE E,FSP ;WHERE WIDTHS BEGIN
PUSHJ P,XCONS1 ;READ NEXT 16. BIT WD INTO NEXT WD OF FS.
SOJG CODE,.-1
;NOW READ DATA FOR EACH CHARACTER
SETZB CODE,CHRCNT
XHCHRD: CAML CODE,XHSTSZ
JRST XHDONE ;DONE WITH WHOLE SET
SKIPN C,(E) ;WIDTH (IN BITS)
AOJA CODE,XHCHR1 ;CHAR NOT DEFINED
MOVE D,CHARD(CODE) ;SELF RELATIVE PNTR
PUSHJ P,CONS
MOVEM A,CHARD(CODE) ;REPLACE WITH POINTER TO FED DATA
SETZM (A) ;CHAR ID
PUSHJ P,CONS
MOVEM C,(A) ;WIDTH IN BITS
PUSHJ P,XHIN ;READ THE DATA BITS FOR ONE CHAR
AOS CHRCNT
AOJ CODE,
AOJA E,XHCHRD ;INC PNTR TO WIDTH
XHCHR1: SETZM CHARD-1(CODE)
AOJA E,XHCHRD
XHDONE: MOVE A,CHRCNT
SETZM CHRCNT
POPJ P,
;RETURN NEXT NOVA WORD RIGHT JUSTIFIED IN A
;IF V=0 READ HIGH ORDER WORD
XHWDIN: SOJE V,.+4
PUSHJ P,WORDIN ;HIGH ORDER
MOVEM A,XHWD'
MOVMS V
XCT [LDB A,[ 42000,,XHWD]
LDB A,[242000,,XHWD]](V) ;GET APPROPRIATE BITS OF A
POPJ P,
;PUT NEXT 16. BIT WORD INTO NEXT 36. FS WORD
XCONS1: PUSHJ P,XHWDIN
PUSH P,A
PUSHJ P,CONS
POP P,(A)
POPJ P,
;READ DATA FOR CHAR IN CODES
;WIDTH IS IN C
;SELF RELATIVE POINTER IN D
; EACH CHAR HAS BLOCKS OF H WORDS, WITH
; EACH BLOCK DEFINING 12. HORIZONTAL BIT POSITIONS
; HIGH 12. BITS ARE DATA, LOW 4 CONTAIN # OF VALID BITS.
XHIN: MOVE T,C
IDIVI T,36.
JUMPE TT,.+2
AOJ T,
HRLM T,(A) ;WIDTH IN 36. BIT WDS
MOVE TT,C
IDIVI TT,12.
JUMPE U,.+2
AOJ TT, ;WIDTH IN NOVA WORDS
ADDI D,4(CODE) ;MAKE REL PNTR ABSOLUTE NOVA PNTR
MOVE C,D
ASH C,-1 ;ABSOLUTE PDP10 PNTR
.ACCESS FONTCH,C
SETZB V,IOCNT ;RESET NOVA BYTE, AND IO WD COUNTERS
TRNE D,1 ;IF ODD NOVA ADDR
PUSHJ P,XHWDIN ;IGNORE EVEN NOVA WD
MOVE C,FSP ;BEGINNING OF BIT DATA FOR THIS WORD
MOVE B,T ;WIDTH IN 36.BIT WDS
IMUL B,HEIGHT
PUSHJ P,CONS ;GET ALL THE CORE WE NEED FOR THIS CHAR
SOJG B,.-1
SETZ B, ;12. BIT COLUMN MOD 3 WHICH W ARE CURRENTLY WORKING ON
;DO THIS LOOP ONCE FOR EACH 12. BIT COLUMN
XHIN1: MOVE D,C ;BEGINNING OF DATA FOR THIS 12 BIT COLUMN
MOVE U,HEIGHT
;DO THIS LOOP ONCE FOR EACH ROW
XHIN2: PUSHJ P,XHWDIN
ASH A,-4 ;IGNORE VALID BITS FIELD
XCT [DPB A,[301400,,(D)]
DPB A,[141400,,(D)]
DPB A,[ 1400,,(D)]](B) ;PUT DATA IN RIGHT FIELD OF 10 WORD
ADD D,T
SOJG U,XHIN2 ;# OF ROWS FOR THIS COLUMN
SOJLE TT,XHIN3 ;# OF COLUMNS LEFT
AOJ B, ;COLUMN #
CAIG B,2 ;MOD 3
JRST XHIN1
SETZ B,
AOJA C,XHIN1 ;INC START OF DATA FOR THIS COLUMN
XHIN3: POPJ P,
;WRITE ONE 'AST' FONT
ASTOUT: MOVE TT,CHARD(CODE)
HRRZ A,CODE ;CODE
PUSHJ P,OCTPNT
MOVEI A,[ASCIZ / CHARACTER CODE /]
PUSHJ P,OUTSTR
PUSHJ P,IFPNT
PUSHJ P,CRLF
HRRZ A,1(TT) ;RASTER WIDTH
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / RASTER WIDTH/]
PUSHJ P,TERPRI
HRRZ A,(TT) ;CHARACTER WIDTH
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / CHARACTER WIDTH/]
PUSHJ P,TERPRI
HLRE A,(TT) ;LEFT KERN
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / LEFT KERN/]
PUSHJ P,TERPRI
HLRZ A,1(TT) ;# WORDS/LINE
MOVNM A,WPERL
MOVE Y,HEIGHT
ADDI TT,2 ;TT -> CHAR START
SETZM E ;COUNTS # PENDING CRLF'S
RLINE: HRL TT,WPERL
SETZM D ;COUNTS # PENDING BLANKS
RWORD: MOVE B,(TT)
MOVEI X,36.
RBIT: SETZM A
LSHC A,1
JUMPN A,AST ;COUNT " " OR PRINT "*"
AOJA D,RNEXTB
AST: JUMPE E,ASTB
PUSHJ P,CRLF
SOJG E,.-1
ASTB: JUMPE D,ASTP
MOVEI A,"
PUSHJ P,PUTCHR
SOJG D,.-1
ASTP: MOVEI A,"*
PUSHJ P,PUTCHR
RNEXTB: SOJG X,RBIT ;ANOTHER BIT?
AOBJN TT,RWORD ;ANOTHER WORD?
AOS E
SOJG Y,RLINE ;ANOTHER LINE?
SKIPE E ;END WITH CRLF IF ANY ARE PENDING
PUSHJ P,CRLF
POPJ P,
;WRITES OUT A WHOLE AST SET
ASTWRT: PUSH P,TTYFLG
SETZM TTYFLG
PUSHJ P,ZAPBUF
PUSHJ P,CBFIO2
MOVE A,KSTID
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / KSTID /]
PUSHJ P,OUTSTR
PUSHJ P,IFPNT ;PRINT THE SOURCE FILE NAME
PUSHJ P,CRLF
MOVE A,HEIGHT
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / HEIGHT/]
PUSHJ P,TERPRI
MOVE A,BASE
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / BASE LINE/]
PUSHJ P,TERPRI
MOVE A,CPA
PUSHJ P,DECPNT
MOVEI A,[ASCIZ / COLUMN POSITION ADJUSTMENT/]
PUSHJ P,TERPRI
MOVEI A,^L
PUSHJ P,PUTCHR
PUSH P,[MSETSZ]
MOVEI CODE,0
ASTO2A: SKIPE CHARD(CODE)
PUSHJ P,[ PUSHJ P,ASTOUT
MOVEI A,^L
JRST PUTCHR]
SOSLE (P)
AOJA CODE,ASTO2A
POP P,(P)
PUSHJ P,CBUFIO
POP P,TTYFLG
JRST POPJ1
;READS IN 'AST' STYLE CHARACTER SET
ASTRED: PUSH P,[0] ;CHARACTERS READ
IRP VAR,REST,[KSTID,HEIGHT,BASE,CPA]
PUSHJ P,DECINL
JUMPL A,FNTR4
MOVEM C,VAR
IFSN [REST],[CAIE A,12
.VALUE
]
IFSE [REST],CAIE A,14
TERMIN
PUSHJ P,SPAGE
JUMPL A,FNTR4
SETZM CULCOD ;NO TOO-LONG LINES SEEN YET IN THIS FONT.
ASTR1: PUSHJ P,ASTIN
JRST FNTR4
AOS (P)
JRST ASTR1
;ROUTINE TO READ IN ONE 'AST' FONT CHARACTER.
ASTIN: PUSHJ P,OCTIN ;GET CODE
JUMPL A,CPOPJ
MOVE CODE,C
SKIPL CODE
CAILE CODE,MSETSZ-1
POPJ P, ;ILLEGAL CODE - EOF
SKIPE CHARD(CODE)
JRST WSKCH ;CHAR PREVIOUSLY DEFINED
PUSHJ P,GETL ;IGNORE REST OF LINE
JUMPL A,CPOPJ
PUSHJ P,DECNL1 ;POPS EXTRA LEVEL ON EOF
JUMPL C,[.VALUE] ;NEGATIVE RASTER WIDTH ILLEGAL
HRLZ X,C ;SAVE RASTER WIDTH
PUSHJ P,DECNL1 ;CHARACTER WIDTH
JUMPL C,[.VALUE]
HRR X,C
PUSHJ P,DECNL1 ;LEFT KERN
PUSH P,X ;RASTER WIDTH,,CHARACTER WIDTH
PUSH P,C
PUSHJ P,CONS ;WILL BE LEFT KERN,,CHARACTER WIDTH
MOVEM A,CHARD(CODE)
POP P,C ;LEFT KERN
HRLZM C,(A)
HRRZ C,(P)
HRRM C,(A) ;CHARACTER WIDTH
PUSHJ P,CONS
POP P,C
HLRZS C
MOVEM C,(A) ;RASTER WIDTH
ADDI C,35.
IDIVI C,36. ;# WORDS/LINE
HRLM C,(A)
MOVE C,(A) ;C HAS # BITS/LINE,,# WDS/LINE
SKIPA Y,HEIGHT ;# LINES/CHAR
WLINE: PUSHJ P,GETL
HLRZ X,C ;# WORDS/LINE
HRRZ D,C ;# BITS/LINE (RASTER WIDTH)
HRRZ T,FSP
SOS T
HRLI T,000100 ;B.P. TO IDPB NEXT BIT OF LINE.
WBIT: PUSHJ P,GETCHR
JUMPL A,WENDC
CAIN A,^L
JRST WENDC ;EOC
CAIN A,15
JRST WENDL ;EOL
SOJL D,ASTXTR ;THERE'S ANOTHER BIT TO STORE. LINE TOO LONG?
PUSH P,A
TLNN T,770000 ;NO, IF ABOUT TO STORE INTO A NEW WORD, ALLOCATE THE CORE.
PUSHJ P,[SOJA X,CONS] ;X IS # OF WORDS, OF MAX, THAT WE DIDN'T MAKE.
POP P,A
CAIN A,40 ;NEXT BIT IS 1 IFF CHAR NOT SPACE.
TDZA A,A
MOVEI A,1
IDPB A,T
JRST WBIT
ASTXTR: PUSHJ P,CULOST ;REPORT THIS LINE TOO LONG.
JRST WNEXTL
WENDL: PUSHJ P,WLFILL
WNEXTL: SOJG Y,WLINE ;ANOTHER LINE ?
ENDCH: PUSHJ P,SPAGE
JRST POPJ1
WSKCH: AOS CHRCNT ;SKIP CHAR
PUSHJ P,DUPCHR ;FOUND DUPLICATE CHARACTER
JRST ENDCH
WENDC: PUSHJ P,WLFILL ;AFTER ^L, END CHAR WITH ZEROES (THIS LINE AND REMAINING ONES)
WENDC1: HLRZ X,C
SOJLE Y,POPJ1 ;CHAR IS FINISHED
PUSHJ P,WLFIL1
JRST WENDC1
WLFILL: JUMPE X,CPOPJ
WLFIL1: PUSHJ P,CONS ;PAD LINE WITH ZEROS TO DESIRED # WORDS.
SOJG X,WLFIL1 ;ANY MORE WORDS ?
POPJ P,
;ROUTINE TO WRITE ONE 'KST' FONT CHARACTER.
KSTOUT: MOVE B,CHARD(CODE)
HRRZ A,1(B) ;RASTER WIDTH
JUMPE A,CPOPJ ;DON'T ATTEMPT ZERO WIDTH CHARACTERS
MOVEI A,1 ;MAKES PUB HAPPY
PUSHJ P,WRDOUT ;USRID
HRRZ A,CODE
HLL A,(B)
PUSHJ P,WRDOUT ;LEFT KERN,,CODE
MOVE A,(B)
HRL A,1(B)
PUSHJ P,WRDOUT ;RASTER WIDTH,,CHARACTER WIDTH
HLRZ C,A ;USE RASTER WIDTH
ADDI C,3
LSH C,-2 ;# 4 BIT BYTES/LINE
ADDI B,2
HRLI B,440400 ;B <- 4 BIT BYTE PTR
MOVE Y,HEIGHT ;# LINES/CHAR
SETZM TT
MOVEI D,4 ;4 8 BIT BYTES/WORD
OFLINE: MOVE X,C
OFBYTE: ILDB E,B ;GET 8 REVERSED BITS INTO TT
MOVEI T,0
SOSLE X
ILDB T,B
CIRCI T,-4
MOVE T,E
CIRCI T,-4
SOJG D,OFBYT1
MOVEI D,4 ;RESET THAT DUDE
PUSHJ P,NOFL1
SETZM TT
OFBYT1: SOJG X,OFBYTE ;ANOTHER BYTE IN LINE ?
OFLEND: HRLI B,440400
ADDI B,1
NOFLIN: SOJG Y,OFLINE
CAIN D,4
POPJ P, ;NOTHING IN TT, GO AWAY
LSH TT,10
SOJG D,.-1
NOFL1: LSH TT,4
MOVE A,TT
JRST WRDOUT
SETOUT: PUSHJ P,OPNOUT
JRST [ MOVEI A,OFDEV ;.OPEN FAILED
PUSHJ P,FNF
JRST SETOUT]
PUSHJ P,CMPACT ;Possibly compact raster
MOVE B,ITYPE ;GET TYPE
PUSHJ P,@WRITEF(B)
POPJ P, ;CNTWRT doesn't skip
.FDELE RNBLK ;Now rename file to what he really wants
.VALUE
.CLOSE FONTCH,
POPJ P,
;WRITES OUT THE WHOLE SET IN 'KST' FORMAT
KSTWRT: PUSHJ P,ZAPBUF
PUSHJ P,WBFIO2 ;SET POINTERS
MOVE A,KSTID
PUSHJ P,WRDOUT
PUSH P,HEIGHT
MOVE A,CPA
DPB A,[331100,,(P)]
MOVE A,BASE
DPB A,[221100,,(P)]
POP P,A
PUSHJ P,WRDOUT
MOVEI CODE,MSETSZ-1
SKIPE CHARD(CODE)
PUSHJ P,KSTOUT
SOJGE CODE,.-2
MOVNI A,1
PUSHJ P,WRDOUT
PUSHJ P,WRDOUT
LSTBUF: MOVEI A,BUFSIZ
SUB A,IOCNT
JUMPE A,LSTBF1
MOVNS A
HRLI A,BUF
MOVSS A
PUSHJ P,WBFIO1
LSTBF1: JRST POPJ1
;READ OUTPUT FILE NAME AND OPEN
OPNOUT: MOVE A,IFFILE
MOVEM A,OFFILE
MOVSI A,'KST
MOVEM A,OFFNM2
MOVEI A,[ASCIZ /FILE: /]
PUSHJ P,OUTSTR
PUSHJ P,TTYLIN ;GET LINE FROM TTY
MOVE B,[PUSHJ P,COMGET]
MOVEI C,0
JSR FNR"GETFIL
JRST OPNIT ;DEFAULT
SKIPE D
HLRM D,OFDEV
SKIPE E
MOVEM E,OFFILE
SKIPE T
MOVEM T,OFFNM2
SKIPE TT
MOVEM TT,OFFSNM
OPNIT: MOVEI C,TYPTBL-1
MOVE B,OFFNM2 ;Look at FN2 to see if it says what type of file.
CAMN B,[SIXBIT />/]
MOVSI B,'AST ;">" means user wants to edit it, so it must be type AST.
CAME B,TYPTAB(C)
SOJGE C,.-1
MOVEM C,ITYPE
SKIPGE C
PUSHJ P,HUH ;If it doesn't say, ask the user.
HRRZS OFDEV
.SUSET [.SSNAM,,OFFSNM]
MOVSI C,(SIXBIT/>/)
CAME C,OFDEV+1 ;Don't check for clobberage if a filename of >,
CAMN C,OFDEV+2 ;since that always writes a new file.
JRST OPNIT1
.OPEN FONTCH,OFDEV ;See if file already exists by opening for reading
JRST OPNIT1 ;No
PUSH P,A
MOVEI A,[ASCIZ /File already exists. Clobber? (Y or N)/]
PUSHJ P,TYICR
MOVE C,A
POP P,A
CAIE C,"Y
JRST OPNOUT ;Don't write
OPNIT1: PUSH P,A
MOVEI A,[ASCIZ /Writing: /]
PUSHJ P,OUTSTR
MOVE A,[OFDEV,,FCHST]
BLT A,FCHST+3 ;Fake a .RCHST
PUSHJ P,RPFNAM
PUSHJ P,CRLF
POP P,A
MOVE C,[OFFILE,,RFNAM1]
BLT C,RFNAM2 ;Save user's file name
MOVE C,[[SIXBIT /FED/
'OUTPUT],,OFFILE]
BLT C,OFFNM2 ;Open as FED OUTPUT
MOVEI C,7
HRLM C,OFDEV ;Replace mode bits (image block out)
.OPEN FONTCH,OFDEV
POPJ P, ;OPEN FAILS, TAKE DIRECT RETURN
AOS (P)
JRST GETIN1
;CMPACT compacts the raster by eliminating leading and trailing blank columns
CMPACT: MOVEI A,[ASCIZ /Compact raster? (Y or N)/]
PUSHJ P,TYICR
CAIN A,"N
POPJ P,
CAIE A,"Y
JRST CMPACT
SETZM LSPACE
SETZM RSPACE
SETZM SVWDS
HRLZI CODE,-MSETSZ
SKIPE B,CHARD(CODE) ;Skip if char not defined
PUSHJ P,CMPCHR ;Try to compact it
AOBJN CODE,.-2 ;Look at next char
MOVE A,SVWDS
IMUL A,HEIGHT
PUSHJ P,OCTPNT
MOVEI A,[ASCIZ / (octal) PDP11 words saved/]
PUSHJ P,TERPRI
POPJ P,
CMPCHR: HLRZ D,1(B) ;Width in words
HRRZ U,1(B) ;Width in bits
PUSHJ P,LSCNT ;Count leading left blank columns
CAMG U,LSPACE
JRST CM0WID ;Zero raster width
PUSHJ P,RSCNT ;Count trailing right blank columns
ADD A,LSPACE ;Total # columns to flush
MOVE B,CHARD(CODE)
PUSH P,X
PUSH P,Y
MOVE X,U
SUBB X,A ;New width in bits
JUMPLE A,CMPE
ADDI X,35.
IDIVI X,36. ;New width in words
MOVEI E,36.
SUBI E,1(Y) ;# of non-raster bits in last word of row
MOVE Y,A ;New width in bits
ADDI B,2 ;Where to get old words from
MOVE C,B ;Where to move compacted words to
MOVE V,HEIGHT
;FALLS THROUGH
;FALLS IN
CMPCH1: PUSH P,B
PUSH P,C
PUSH P,V
PUSHJ P,SHROW ;shift row
POP P,V
POP P,C
POP P,B
ADD B,D
ADD C,X
SOJG V,CMPCH1
MOVE B,CHARD(CODE) ;Now modify character definition
HLRE A,(B) ;Old left Kern
SUB A,LSPACE
HRLM A,(B)
HRLM X,1(B) ;New width in words
HRRM Y,1(B) ;in bits
ADDI U,15.
MOVEI X,15.(Y)
IDIVI U,16. ;Old width, 16. bit words
IDIVI X,16. ;New width
SUB U,X
ADDM U,SVWDS
CMPRET: POP P,Y
POP P,X
POPJ P,
CMPE: .VALUE ;Trying to flush too many columns
JRST CMPRET
CM0WID: MOVE B,CHARD(CODE) ;Here for 0 width character
HRRZS (B) ;0 left kern
;following is hack to make raster width 1, so as not to confuse some programs
;This is due to difference between CMU and KST formats
;CMU does not use raster width, which is always 0. (IE, CW=RW)
;AI XGP11 program is smart enough to not use any space for a blank character
MOVE A,[1,,1]
MOVEM A,1(B)
MOVEI B,2(B)
SETZM (B) ;Zero out Height words
MOVEI A,-1(B)
ADD A,HEIGHT
HRL B,B
AOJ B,
BLT B,(A)
POPJ P,
;SHROW compacts one Row of character in CODE
;B where to get old row from
;C where to put compacted row
;E # of bits which will be left over in last word of row
;X # of words in new (compacted) row
SHROW: MOVE T,LSPACE ;Total # of bits to shift left
IDIVI T,36.
ADD B,T ;# of words to shift left
MOVE A,TT ;# of bits to LSHC
MOVE V,X ;# of wds in new row
SHROW1: MOVE T,(B) ;get old bits
CAIG V,1 ;get 2nd word of old bits, unless there really
CAML A,E ;are no old bits of value in that word,
MOVE TT,1(B) ;in which case we must not fetch to avoid risking an MPV.
LSHC T,(A)
MOVEM T,(C)
AOJ B,
AOJ C,
SOJG V,SHROW1
MOVN TT,E
LSH T,(TT) ;Fix last word of row
LSH T,(E) ;by shifting 0s into non-matrix bits
MOVEM T,-1(C)
POPJ P,
;LSCNT counts leading blank columns in LSPACE and A
;D width in words
;U width in bits
LSCNT: SETZB A,T ;Total # of leading blanks
LSCNT1: MOVEI C,2(B)
MOVE V,HEIGHT ;# of rows
IOR T,(C) ;ior 36. columns for all rows
ADD C,D
SOJG V,.-2
JFFO T,LSCNT2 ;Count 0s in TT
ADDI A,36. ;44 bits of leading 0's
CAMGE A,U
AOJA B,LSCNT1 ;More columns to look at
JRST LSCNT3
LSCNT2: ADD A,TT ;Total leading spaces
LSCNT3: CAML A,U ;Shouldn't be larger than raster width
MOVE A,U
MOVEM A,LSPACE
POPJ P,
;RSCNT counts trailing blank columns in RSPACE and A
RSCNT: MOVE B,CHARD(CODE)
MOVE T,U
IDIVI T,36.
SKIPE E,TT
MOVEI E,36.
SUB E,TT ;# of non-raster bits in last word
SETZB A,TT
ADDI B,1(D) ;Points at last columns of first row
RSCNT1: MOVE C,B
MOVE V,HEIGHT
IOR TT,(C)
ADD C,D
SOJG V,.-2
CIRCI T,36. ;Reverses TT into T
JFFO T,RSCNT2
ADDI A,36. ;whole word of trailing 0s
CAMGE A,U
SOJA B,RSCNT1 ;Look at previous 36 columns
JRST RSCNT3
RSCNT2: ADD A,TT ;Total trailing 0s
SUB A,E ;minus non raster trailing 0s
JUMPL A,.+2
CAML A,U
RSCNT3: .VALUE ;0 raster dots, should have been caught by LSCNT
MOVEM A,RSPACE
POPJ P,
;5/29/73 PROGRAMMING THE PDP-6 TO PDP-11 INTERFACE
;THE INTERFACE LETS THE PDP-6 PROGRAMMER DIRECTLY ACCESS THE MEMORIES
;OF UP TO EIGHT PDP-11'S. PDP-6 PAGES ARE MAPPED INTO SEGMENTS OF
;VARIABLE SIZE IN THE PDP-11'S MEMORY. THE PDP-6 PAGE MAP IS ALSO
;DIRECTLY ADDRESSABLE IN MEMORY (IT CURRENTLY LIVES IN LOCATIONS
;776000-776777). THERE IS ONE ENTRY IN THE MAP FOR EACH PDP-6 PAGE.
;PAGE TABLE ENTRY:
; 4.9 VALID
; 4.8 WRITE ENABLE
; 4.3-4.7 (5 BITS) NOT USED (0)
; 3.9-4.2 (3 BITS) PDP-11 NUMBER
; 2.2-3.8 (16 BITS) RELOCATION
; ORIGIN OF SEGMENT OF IN PDP-11 ADDRESS SPACE
; PDP-11 ADDRESS=4*RELOCATION
; 1.1-2.1 (10 BITS) PROTECTION (PDP-11 PROTECTION=4*PROTECTION
; IF PROTECTION=0 THEN ONLY ONE 16 BIT WORD IS ACCESSIBLE)
;WRITE REFERENCE FORMAT
; 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD
; 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD
; 1.4 DON'T WRITE WORD 0
; 1.3 DON'T WRITE WORD 1
; 1.1-1.2 (2 BITS) NOT USED
;READ REFERENCE FORMAT
; 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD
; 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD
; 1.1-1.4 (4 BITS) 0
;NOTE -- SPLIT CYCLES WILL DO THE RIGHT THING; HENCE, ILDB AND IDPB WORK.
;CAUTION -- WHEN USING BYTE INSTRUCTIONS, A 16 BIT BYTE SIZE IS
;RECCOMMENDED. SUCCESSIVE INCREMENTS OF BYTE POINTERS WITH AN 8 BIT BYTE
;SIZE DO NOT ADDRESS CONSECUTIVE BYTES IN THE PDP-11!
;PDP-6 ROUTINES
IFL .-2000,LOC 2000
6FIRST==.
;PDP-11 ADDRESSES
11CREG==764044 ;CONSOLE REGISTER
11CSA==157776 ;CONSOLE STARTING ADDRESS REGISTER
11TVLO==60000 ;ORIGIN OF DISPLAY MEMORY
11TVHI==157656 ;LAST VISIBLE WORD IN DISPLAY MEMORY
11LKS==40 ;PSEUDO 11 LINE CLOCK STATUS REG.
;CONSOLE REGISTER ALU FUNCTIONS
CANDC==2
CSETZ==3
CCOMP==5
CXOR==6
CEQV==11
CSAME==12
CAND==13
CSETO==14
CIOR==16
CSET==17
;INITIAL 11 MAP
;I11MAP: REPEAT 10,[
; <600000,,1777>+<60000+<.RPCNT*10000>>_10] ;DISPLAY MEMORY
; <600000,,1>+<11CREG>_10 ;CONSOLE REGISTER
; <600000,,1>+<11LKS>_10 ;PDP11 CLOCK
; 0 ;END OF MAP
;11PGS==.-I11MAP-1 ;# PAGES IN PDP11 MEMORY
11PGS==11 ;VIDEO BUFFER FOLLOWED BY CONSOLE REG
;PDP-6 ADDRESSES
P6TVLO==400-11PGS ;PAGE # OF FIRST PAGE IN DISPLAY MEMORY
6TVLO=P6TVLO_12 ;ORIGIN OF DISPLAY MEMORY
6TVHI=6TVLO+17777 ;LAST WORD OF DISPLAY MEMORY
6CREG=6TVHI+1 ;CONSOLE REGISTER
;6LKS=6CREG+2000 ;LINE CLOCK STATUS REGISTER
;PDP-6 ACTION ROUTINES
;HERE TO PUT DISPLAY MEMORY IN MAP
GET11: MOVEI B,0 ;VIDEO BUFFER PAGE
MOVE A,[-11,,P6TVLO] ;MAP PAGE
.CALL [SETZ
SIXBIT /CORBLK/
1000,,600000
1000,,-1 ;TARGET USER (US)
A
1000,,-2 ;VIDEO MAP
SETZ B]
.VALUE
JRST TVCLR
IFN 0,[
MOVEI A,I11MAP
MOVEI B,P6TVLO
GET11L: SKIPN (A)
JRST TVCLR ;CLEAR SCREEN WHEN DONE
.CALL [ SETZ
SIXBIT /T11MP/
B ;PAGE
SETZ (A)] ;MAP ENTRY
.VALUE
AOJ A,
AOJA B,GET11L
]
;WRITE WORD INTO DISPLAY MEMORY
6TVWRT: MOVEI A,CIOR
DPB A,[341000,,6CREG]
MOVE A,11ADR
CAIL A,11TVLO
CAILE A,11CSA
JRST 4,. ;WE WERE PASSED ILLEGAL ADDRESS
SUBI A,11TVLO
ASH A,-2
MOVE B,11WRD
MOVEM B,6TVLO(A)
POPJ P,
;CLEAR TV SCREEN
TVCLR:
; MOVEI A,4 ;TURN OFF CLOCK
; MOVEM A,6LKS
MOVEI A,CSET
DPB A,[341000,,6CREG]
MOVE A,[6TVLO-6TVHI,,6TVLO]
TVCLR1: SETZM (A)
AOBJN A,TVCLR1
POPJ P,
6TVFIN:
; MOVE A,[100_2,,4] ;CLOCK BACK ON
; MOVEM A,6LKS
POPJ P,
6GO: MOVE P,[-100,,77]
6WAIT: SKIPE B,DPYBLK
PUSHJ P,6GO340
AOSE 6TASK
JRST 6WAIT
SKIPN A,6DISP
JRST 4,.
SETZM 6DISP
PUSHJ P,(A)
JRST 6WAIT
;PDP6 340 DISPLAY DRIVER
DIS==130
6GO340: CONO DIS,100 ;GRAB THE 340
WAIT: MOVEI A,0
JUMPL B,LOOP1
MOVE A,B
LOOP: JUMPE A,CPOPJ ;BLKO POINTER
CONO DIS,100 ;RESET 340
HLRZ B,A ;POINTS TO BLKO POINTER
HRRZS A
SKIPE A
MOVE A,(A)
JUMPE B,LOOP ;POINTS AT NOTHING
SKIPL B,(B) ;THE BLKO POINTER
JRST LOOP ;NOT REALLY BLKO POINTER
LOOP1: MOVEI C,100 ;TIME OUT IN CASE DISPLAY HANGS
CONSO DIS,200 ;WAIT FOR DONE
SOJG C,.-1
JUMPE C,ERR
LOOP2: SKIPN DPYBLK
POPJ P, ;DISPLAY STOPPED BY PDP10
BLKO DIS,B
JRST .+2 ;BLKO COUNTED OUT
JRST LOOP1 ;MORE TO GO
MOVEI C,200
CONSO DIS,100 ;WAIT FOR DONE
SOJG C,.-1
JRST LOOP
ERR: CONSO DIS,5000
JRST LOOP
CONO DIS,200 ;EDGE PROTECTION VIOLATION
JRST LOOP1
VER1: .FNAM1 ;SOURCE FILE
VER2: .FNAM2
LIT: CONSTANTS
VAR:: VARIABLES
;PUSH DOWN LIST AND PATCH AREA
PAT:
PATCH: BLOCK PATL ;PATCH AREA
PDP: -PDL,,PDB-1
PDB: BLOCK PDL
;OPEN BLOCK FOR ERR DEVICE
ERROPN: SIXBIT / ERR/
1 ;LAST CHANNEL WITH ERR
;I/O BUFFERS
BUFSIZ==200
TTYFLG: 0 ;-1 SENDS IO TO TTY, 0 TO FONTCH
BITPB: 0 ;BITS PER BYTE (USUALLY 44 BUT CAN BE 20)
IOPTR: 0 ;BYTE POINTER INTO BUFFER
IOCNT: 0 ;CHARACTER COUNTER
CULCOD: 0 ;HOLDS CODE OF LAST CHARACTER WE LOST ON
ERRFLG: 0 ;SETOM'D IF ERROR FOUND IN FILE BEING READ.
BUF: BLOCK BUFSIZ
COMBFL==100
COMPNT: 0
COMCNT: 0
COMBUF: BLOCK COMBFL
;DPYNUM: DFTDPY
;FONT VARIABLES
OFDEV: 7,,'DSK
OFFILE: SIXBIT /CYR25/
OFFNM2: SIXBIT /KST/
OFFSNM: 0
RNBLK: 0 ;File names moved here for rename
0
FONTCH
RFNAM1: 0
RFNAM2: 0
IFDEV: 6,,(SIXBIT /DSK/) ;FONT INPUT FILE
IFFILE: SIXBIT /CTL25/ ;FONT INPUT FILE CHANNEL STATUS
IFFNM2: SIXBIT /KST/
IFFSNM: SIXBIT /FONTS/
FCHST: FCHSTL==10 ? BLOCK FCHSTL
ITYPE: 0 ;TYPE OF FONT WE'RE READING IN
KSTID: 0 ;CHARACTER SET ID
HEIGHT: 0 ;FONT HEIGHT
CPA: 0 ;COLUMN POSITION ADJUSTMENT
BASE: 0 ;CHARACTER SET BASE LINE
WPERL: 0
CHARD: BLOCK MSETSZ ;POINTERS TO FONT DESCRIPTORS
CHRCNT: 0 ;CHARACTER COUNTER
CHARBP: 0 ;BYTE POINTER TO TEXT LINE
DPYBLK: 0 ;BLKO POINTER TO DISPLAY LIST
LINE0: BLOCK 6 ;UPPER CASE CHARACTER CODES
LINE1: BLOCK 6 ;LOWER CASE
LINE2: BLOCK 7 ;SPECIAL CHARACTERS AND NUMBERS
LINE3: BLOCK 7
LINE4: BLOCK 7 ;CONTROL CHARACTERS
RADEX: 0
LSPACE: 0 ;# of leading blank columns for CMPACT
RSPACE: 0 ;# of trailing blank columns
SVWDS: 0 ;# PDP11 wds saved by raster compaction
;10-6 COMMUNICATION AREA
340DPY: 0 ;-1=>WE ARE NEAR 340
PDP6: 0 ;-1=> WE HAVE PDP-6
TVDPY: 0 ;-1=>USE THE TV FOR DISPLAY
TCMXV: 0 ;TTY VERT SIZE
TCMXH: 0 ;TTY HORZ SIZ
TCTYP: 0
TTYCOM: 0
TTYOPT: 0
TTYTYP: 0
USRO: 3,,(SIXBIT /USR/) ;USER OPEN BLOCK FOR PDP-6
UNAME: 0 ;OUR UNAME
SIXBIT /PDP6/
11ADR: 0 ;PDP11 ADDRESS TO WRITE
TVALUM: 0 ;ALU MODE FOR CONSOLE REGISTER
11WRD: 0 ;WORD TO WRITE INTO 11 MEMORY
6TASK: 0 ;-1=>10 WANTS 6 TO DO SOMETHIN
;0=>6 BUSY
;>0=>6 IDLE
6DISP: 0 ;ADDRESS OF ROUTINE 6 IS TO EXECUTE
11AC: 0 ;ACCUMULATOR
11BITS: 0 ;COUNTER FOR 11AC (STARTS AT -40)
;DISPLAY LIST VARIABLES
DMODE: 0 ;DISPLAY MODE
DBYTE: 0 ;HALF-WORDS IN DISPLAY LIST
DBYTEP: 0 ;BYTE POINTER TO LAST HALF-WORD PLACED IN DISPLAY LIST
DBYTEF: 0 ;FREE HALF-WORDS IN DISPLAY BUFFER
DSIZE: 0 ;SIZE
DBRITE: 0 ;BRIGHTNESS
;INCREMENT MODE VARIABLES
IBYTEP: 0 ;BYTE POINTER INTO INCREMENT WORD
IBYTEF: 0 ;FREE BYTES IN INCREMENT WORD
;CHARACTER MODE VARIABLES
CBYTEP: 0 ;BYTE POINTER INTO CHARACTER WORD
CBYTEF: 0 ;FREE BYTES IN CHARACTER WORD
CSHIFT: 0 ;-1=> SHIFT IN
CIRCP: 0 ;NONZERO IF THE CIRC INSTRUCTION WORKS ON THIS MACHINE.
;DISPLAY BUFFER
DPYBUF: BLOCK DPYBFL
;FREE STORAGE
FREE: 0 ;FREE WORDS IN FREE STORAGE
CBLK: 0 ;.CBLK WORD OF LAST BLOCK
CORSIZ: 0 ;BLOCKS WE HAVE GOT
FSP: 0 ;POINTS TO FIRST FREE WORD
FS: 0 ;FREE STORAGE STARTS HERE
6LAST==.
ICORE==<FS+1777>_<-12>
END GO