;-*-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+ 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==_<-12> END GO