;; SECOND.FAI ;Definitions and variables for Drawing prgm ;Linkage for board files NOLAY,< ;Suppressed because two versions of BOARDS need to exist EXTERNAL MAPCON,MAPGND,MAPPWR,CRDPIN,MAPSOC,%%PINN,$$PINN EXTERNAL LCINIT,GETSLT,SLTOUT,GTSLTL,GTCONP,LOCFUK,PRNLOC,PRNPIN EXTERNAL MAPOST,CPNMER,CPNSEP,CPNMAP,QUPIN,PINCUE,SLTCUE,BODCUE,CPCUE,PROTOB EXTERNAL BPINPN,PINPLS,RPNAM,CSLTLP,SLTLPN,LOCOUT EXTERNAL MATPAK,CMPPAK, CLRPAK, APACK EXTERNAL FNDWW,FNDNOM,GETBRD,GETNOM,CLRNOM,SETNOM,AVAIL EXTERNAL WWTYP,DEFNOM,SETWW,PACKNM,LOCTVV,NOMTYP EXTERNAL N2L,L2N,WNAMES,DEFWW,CLRWW,LNAMES,PUTDEC,MAXN2L INTERNAL CPOPJ,CPOPJ1,CPOPJ2,CPOPJ3,POPAJ INTERNAL TREADU,PUTFS,GTCHRX,LETTER, FORSOC, FUCKUP,NDIG ITS,< INTERNAL .TVOFF,TVMORE > >;NOLAY ;Linkage for ONE segment layout version ONE,< PASS1,;PASS1 PASS2,;PASS2 >;ONE ;Linkage for Leahy display - in CNVERT III,< EXTERNAL LHYRST,LHYADD,LHYIOT,LHYOUT,UPLHY INTERNAL LHYWRD > ;IO CHANNEL NUMBERS DAT__0 ;DATA IN AND OUT IDSK__1 ;DISK INPUT ODSK__2 ;DISK OUTPUT IOLAY__3 ;LAYOUT I/O ICARD__4 ;CARD DEF INPUT CHANNEL DEC,< DISCHN__5 ;VB10C CHANNEL PGPCHN__10 ;PGP I/O CHANNEL >;DEC CMU,< ATYO__5 ;GDP2 OUTPUT CHANNEL ATYI__6 ;GDP2 INPUT CHANNEL >;CMU ;DEFAULT PROTECTION FOR OUTPUT FILES DEFPRO__000 III,<DEFPRO__155> DEC,<DEFPRO__005> ;NOT HERE!!!!!!! CMU,<DEFPRO__155> ;NUMBER OF CHARS NECESSARY TO PRINT FILENAME INFO NOSTAN,> ;FFFFFF.EEE[PPPPPP,NNNNNN] STANFO, ;FFFFFF.EEE[PPP,NNN] ITS, ;UUUUUU;FFFFFF EEE ;NUMBER OF WORDS NECESSARY TO SHOW DEFAULT FILENAME NOLAY,;FFFFFF[PPP,NNN] LAY,;FFFFFF[PPP,NNN]&FFFFFF[PPP,NNN] ;NUMBER OF WORDS NECESSARY FOR NAMBUF PRINTOUT BUFFER NNWRDS__(NNCHRS+4)/5 ;FFFFFF.EEE[PPP,NNN] ;SPECIAL CHARACTERS, DEFINE AS YOU WISH NOSKEY,< CTRL__"" ;CHARACTER INTERPRETED AS CONTROL BIT META__3 ; " META BIT CTLMTA__"" ; " CTRL META BITS TTYCM__"'" ;HACK FOR TTY'S AT STANFORD, INC'S CTRL BITS >;NOSKEY LAMBDA__"" ;FOR DISK IO START, STOP CRCHR__24 ;CR FOR DISKIN AND MACRO ALTER MODE AMCTL__13 ;ALTER MODE CHAR (1 ALT) AMMTA__14 ;ALTER MODE CHAR (2 ALT) NOSKEY,<TEXIST__""> ;THERE EXISTS, FOR FILENAME SKEY,<TEXIST__""> BIGCHR__"" ;GET BIGGER DBLARR__"" ;CRLF IN TEXT NOSKEY,<ALTCHR__""> ;ALTMODE FOR MACRO ALTER MODE SKEY,< ALTCHR__7> ;BELL FOR DEC NOCMU, ;CLOSING CHARACTER IN ";A" CMU, VRTBAR__"|" ;VERTICAL BAR STANFO,<ALTMOD__175> ;ALTMODE CHAR NOSTANFO,<ALTMOD__33> NOT__"" ;CHAR LIKE "-", BUT DIF. NOTCHR__"-" ;FOR PERMUT AND ALPHA TILDA__32 ;LOW TRUE FOR SIGNAL NAME GENCHR__"%" ;GENERATED SIGNAL NAME CHAR. RHG, ;SPECIAL CHARS FOR SEARCH STUFF IN ALTER MODE AND F QUOCHR__"" ;QUOTE CHAR IN SEARCH STRINGS BELCHR__"|" ;BEGINNING OR END OF LINE NOSKEY, ;ANY CHAR IN SEARCH STRING SKEY, ; " NFCHR__"" ;NOT NEXT THING DEC,< NFCHR__"" > III,< NFCHR__"" > INFCHR__"" ;ANY # OF FOLLOWING LETCHR__"$" ;MATCH ANY LETTER DIGCHR__"%" ;MATCH ANY DIGIT ALFCHR__"" ;MATCH ANY ALPHANUMERIC ;SCREEN DEMENSIONS - - LEAVE TOP 3 LINES NODEC,< %TOP__700 NOIII,< %BOTTOM__-1000 %LEFT__-1000 %RIGHT__1000 >;NOIII III,< %BOTTOM__-776 %LEFT__-776 %RIGHT__776 >;III NOSTAN,<SCRTOP__1000> STAN,<SCRTOP__1000-2*CHGHT> TITBRT__2 TITBIG__2 >;NODEC DEC,< VB10,< %TOP__700 %BOTTOM__-770 %LEFT__-770 %RIGHT__766 SCRTOP__1000-10 >;VB10 GT,< ;HALF PHYSICAL HEIGHT AND WIDTH OF GT40 SCREEN GTX__1000 IFN GTSMAL, IFE GTSMAL, %TOP__GTY-10 %BOTTOM__-GTY+1 %LEFT__-GTX+1 %RIGHT__GTX-1 SCRTOP__GTY >;GT PGP,< %TOP__700 %BOTTOM__-1000 %LEFT__-1000 %RIGHT__1000 SCRTOP__1000 >;PGP TITBRT__5 TITBIG__2 >;DEC ;ALTER TEXT MODE DISPLAY PARAMETERS AXPOS__%LEFT+200 AYPOS__%TOP-200 ACHRSZ__2 ;CHAR SIZE ITS,<ACHRSZ__3 > ;CHAR SIZE ;MUST BE CHARACTER SIZE THAT CORRESPONDS ;EXACTLY TO LEGAL HARDWARE SIZE NODEC,< MAXLIN__=30 ;MAX CHARS PER LINE MAXPAG__=20 >;NODEC DEC,< MAXLIN__=60 NOGT,< MAXPAG__=40 > GT,< MAXPAG__=32 > >;DEC GT,< DPYLEN__1400 > NOGT,< DPYLEN__6000 > ORG 137 ORG ;CTRL C INTERCEPT BLOCK DEC,< STORAGE(LOW) INTBLK: XWD 4,CTRLCI 2 ;CTRL C INTERCEPT 0 0 >;DEC ;SOME MACROES FOR THE GT-40 VERSION IFN GT40SW,< ;;JB DEFINE MACROS NOW. DEFINE STOPIC(PICNUM) ;;JB DEFINE STOP PICUTRE MACRO. < PUSH P,16 ;;JB SAVE DATA REGISTER. MOVEI 16,PICNUM ;;JB GET THE PICTURE NUMBERNOW. PUSHJ P,STPSHW ;;JB STOP SHOWING THE PICUTRE NOW. POP P,16 ;;JB RESTORE DAMAGED REGISTER NOW. > DEFINE STAPIC(PICNUM) ;;JB OPPOSITE OF THE ABOVE. < PUSH P,16 ;;JB SAVE REGISTER NOW. MOVEI 16,PICNUM ;;JB GET THE PICUTRE NUMBER NOW. PUSHJ P,SRTSHW ;;JB START SHOWING IT NOW. POP P,16 ;;JB RESTORE REGISTER NOW. > DEFINE BMODS(PIC,OFF,NUM) ;;JB DEFINE PICTURE MODIFICATION MACRO. < PUSH P,13 ;;JB SAVE A BUNCH OF REGISTERS NOW. PUSH P,14 PUSH P,15 PUSH P,16 MOVEM P,STCHPS ;;JB SAVE THE STACK NOW. PUSH P,[PIC] ;;JB PLACE PIC NUMON STACK. MOVE 16,P ;;JB MOVE OVER POINTER TO START OF MODIFIFIER. PUSH P,[OFF] ;;JB PUSH THE OFFSET NOW. PUSH P,[NUM] ;;JB AND FINALLY PUSHTHE NUMBER. > DEFINE BMODF ;;JB DEFINE CALLING AND POPPING MACRO. < PUSHJ P,BMODDO ;;JB SEND IT OUT NOW. MOVE P,STCHPS ;;JB RESET STACK TO A GOOD ONE. POP P,16 ;;JB RESTORE REGISTERS NOW. POP P,15 ;;JB POP P,14 ;;JB POP P,13 ;;JB > DEFINE INCHRW(ARG) ;;JB DEFINE WAIT FOR CHAR AS MACRO < ;;JB WHICH IS REALLY A PUSHJ TO PUSHJ P,[ DLX,< SKIPN DLXFLG > SKIPN ISDPY JRST [ TTYUUO 0,ARG POPJ P,] PUSHJ P,GTCHRW ;;JB A PUSHJ WITH THE ARGUMENT AFTER POP P,ARG] ;;JB THE SECOND PUSHJ. > DEFINE INCHRS(ARG) ;;JB LIKEWISE DO THE SAME FOR THE FOLLOWING. < PUSHJ P,[ DLX,< SKIPN DLXFLG > SKIPN ISDPY JRST [ TTYUUO 2,ARG POPJ P, JRST CPOPJ1] PUSHJ P,GTCHRS ;;JB POP P,ARG] ;;JB > DEFINE INCHWL(ARG) ;;JB DEFINE THE GET A CHAR (LINE MODE) [WAIT]. < PUSHJ P,[ DLX,< SKIPN DLXFLG > SKIPN ISDPY JRST [ TTYUUO 4,ARG POPJ P,] PUSHJ P,GTCHWL ;;JB CAL THE CORRECT ROUTINE NOW. POP P,ARG] ;;JB GIVE HIM BACK THE ANSWER NOW. > DEFINE INCHSL(ARG) ;;JB AND THE GET CHAR(LINE MODE). < PUSHJ P,[ DLX,< SKIPN DLXFLG > SKIPN ISDPY JRST [ TTYUUO 5,ARG POPJ P, JRST CPOPJ1] PUSHJ P,GTCHSL ;;JB POP P,ARG] ;;JB > DEFINE GTMIX(C1,C2) ;;JB DEFINE A MACRO TO PUT THE CHARACTERS IN OK. < BYTE (4) 0 (8) 0,0,C2,C1 ;;JB > RDYCJ__25 ;;JB DEFINE THE "READY" CONTROL CHARACTER ;;JB AS BEING A ^U, WHICH IS NOT NORMALLY SENT. NRDYCJ__17 ;;JB LIKEWISE DEFINE THE NOT READY CHARACTER AS ^O. >;GT ;;JB END THE CONDITIONAL ASSEMBLY. ;SOME DEFINITIONS FOR THE PGP VERSION PGP,< $S__0 ;BLISS STACK PTR $V__3 ;BLISS VALUE RETURN REG DEFINE RTNCAL (NAME,A) < EXTERN NAME MOVE $S,P CNT$__0 IFIDN <>< FLG$__0 ;> FLG$__1 IFN FLG$,< FOR I IN (A) < PUSH $S,I CNT$__CNT$+1 >;FOR >;IFN FLG$ PUSHJ $S,NAME IFN CNT$,< SUB $S,[XWD CNT$,CNT$] > SKIPLE $V MOVEM $V,$VAL MOVE P,$S >;RTNCAL >;PGP ;PG0 -- INFO LINE, CURSOR NOCMU,< STORAGE(DPY) ;KEEP ALL DISPLAY STUFF IN LOWER SEG DEFINE RPNT(X,Y),< BYTE(11),(3)0,0(2)0,1(4)6 REPEAT 0,< BYTE(11)0,0(3)0,0(2)0,1(4)6> BYTE(8)0,0,200(12)32 BYTE(8)100,0,100(12)12 XWD .+3,20 XWD SAVWRD,64 BYTE(8)200,0,0(12)12 > DEFINE LIVW(X,Y,S) < BYTE (11),(3)3,S(2)1,2(4)6 > DEFINE RDV(X,Y) < BYTE (7),(2)0(7),(2)2(4)2 > DEC,< VB10,< ;;JB ASSEMBLE IN THIS. FBUF: 0 ;BUFFER HEADER 0 XWD 030130+TITBRT,221000+SCRTOP-TITBIG*CHGHT-20 ;LITE PEN OFF, SCALE-2 BRITE-7, Y REDWRD: BYTE (18) 061000+%RIGHT-30 (6) 35,"*",37 ;RIGHT 1/2 VARIES BYTE (18) 020000,221000+SCRTOP-TITBIG*CHGHT BYTE(18) 061000+%LEFT (6) 35,"M","O" ;X,"MO" MODWRD: BYTE(6) "D","E","=",35,35,35 ;"DE=" RIGHT 1/2 VARIES BYTE (6) 35," ","S","C","L","=" ;"SCL=" SCLWRD: BYTE (6) 35,35,35,35," ","L" ;LEFT 1/2 VARIES LVLWRD: BYTE (6) "V","L","=",35,35,35 ;"LVL=" RIGHT 1/2 VARIES BYTE (6) 35," ",37 (18) 100000 ;ENTER VECTOR MODE XWD 200005,203000 ;EXISTS IN VECTORS XWD 200204,101404 XWD 200203,501405 BYTE (18) 060000 (6) "=",35,35 ;"=" FILWRD: REPEAT NFWRDS-1,< BYTE (6) 35,35,35,35,35,35 > BYTE (6) 35,35,35,35,35,37 XWD 160000,400000 ;JSR SAVWR1 XWD SAVWR1,0 FVECT1: 0 0 0 0 0 XWD 160000,400000 XWD SAVWR1,0 ;JSR SAVWR1 FVECT2: 0 0 0 0 0 FBRT: XWD 0,160015 ;0;BRITE 5 LOCAT: XWD 0,%NLOC ;JMP %NLOC (OR JSR LOCATS) XWD 600100,160000 ;RIGHT XWD 400000,LOCATS XWD 600300,160000 ;LEFT XWD 400000,LOCATS XWD 640000,160000 ;UP XWD 400000,LOCATS XWD 740000,0 ;DOWN,0 %NLOC: XWD 160000,400000 ;JSR SAVWR1 XWD SAVWR1,0 XWD 160000,0 ;JMP ONOFF-1(OR JMP .+1) %CLOC: XWD ONOFF-1,0 XWD 120160,600100 ;SCALE-8,RIGHT XWD 160000,400000 ;JSR SAVWR1 XWD SAVWR1,0 XWD 120000,600300 ;LEFT XWD 160000,400000 ;JSR SAVWR1 XWD SAVWR1,0 XWD 120000,640000 ;UP XWD 160000,400000 ;JSR SAVWR1 XWD SAVWR1,0 XWD 120000,740000 ;DOWN XWD 160120,400000 ;SCALE-1,JSR SAVWR1 XWD SAVWR1,0 XWD 0,160000 ;JSR CROSS(OR JUMP .+1) ONOFF: XWD 400000,CROSS XWD 160000,0 ;JMP VBBUF ENDPG1: XWD FBUF,0 CROSS: 0 XWD 100137,002004 ;INVIS NE XWD 304210,004000 ;VISIB SW,INVIS N XWD 704010,160000 ;VISIB SE, JMP @CROSS XWD 200000,CROSS LOCATS: 0 XWD 0,20000 LOCATW: XWD 220000,160000 XWD 320000,LOCATS ;JMP @LOCATS (INTO VEC CONT MODE) SAVWR1: 0 XWD 0,20000 SAVWRD: XWD 221000,161000 XWD 200000,SAVWR1 NULLO: 0 ;NULL SUBROUTINE XWD 160000,200000 XWD NULLO,0 >;VB10 ;;JB GT,< ;;JB MY CRAP.... JBREDY: 0 ;;JB REMEMBERS READY-NOT READY STATE. DISTOP__173400 ;;JB DEFINE THE DISTOP INSTRUCTION. PIC3: 117124 ;;POSITION TO TOP LEFT OF SCREEN. 0 GTY+SCRTOP-CHGHT*2 100000 ;;GET INTO CHARACTER MODE. GTMIX "M","O" ;;JB STICK IN THE CORRECT HEADING GTMIX "D","E" ;;JB USING 8 BIT GT40 CHARACTERS. GTMIX "=",0 ;;JB GTMODE: GTMIX "J","B" ;;JB CHANGABLE MODE LETERS HERE. GTMIX " ","S" ;;JB GTMIX "C","L" ;;JB GTMIX "=",0 ;;JB GTSWRD: GTMIX "0",0 ;;JB CURRENT SCALING LEVEL. GTMIX " ","L" ;;JB THE LEVEL NOW. GTMIX "V","L" ;;JB GTMIX "=",0 ;;JB GTLWRD: GTMIX "0",0 ;;JB CURRENT LEVEL VALUE. GTMIX " ",135 ;;JB THE 'THERE EXISTS' SIGN. GTMIX 10,"-" ;;JB DONE BY SUPERIMPOSING. GTMIX "=",0 ;;JB GTFNAM: 0 ;;JB LEAVE ROOM FOR 25 CHARACTERS FOR 0 ;;JB THE FILE NAME (13 WORDS). 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. 0 ;;JB ALL THE WAY DOWN. DISTOP ;;JB END OF THE LIST NOW. 0 PIC3Z__.-PIC3 ;;JB SIZE OF THE LIST. XWD 3,1 ;;JB DEFINE AS SUBPICTURE 3, REMEMBER CHANGES. >;GT ;;JB END OF MYCRAP. PGP,< TSXDAT: 0 TSYDAT: 0 FILWRD: BLOCK NFWRDS 0 MODWRD: 0 SCLWRD: 0 LOCAT: 0 LVLWRD: 0 1 NULARG: 0 NILEV: 0 SEGN: 0 PSEGN: 0 $VAL: 0 FVECT1: 0 FVECT2: 0 BLNKIT: 0 PGBITS: 0 FBUF: 0 ;DUMMY SAVWRD: 0 >;PGP >;DEC ;CURSOR AND STATUS DISPLAY LISTS ;CHARACTER SIZES ;These are only used for assembled in III words, the size mentioned ;should correspond to the DPYPTX entry for STDBIG. ;There may be some discrepancies that haven't been caught yet. NODEC,< NOIII,< CWIDTH__10 CHGHT__20 >;NOIII III,< CWIDTH__4 CHGHT__10 >;III >;NODEC DEC,< CWIDTH__6 CHGHT__12 >;DEC NODEC,< NOIII,< FBUF: .+2 FEND-.-1 0 >;NOIII III,< FBUF: FEND-FBUF1,,FBUF1 FBUF1: >;III LIVW(%RIGHT-CWIDTH*4,SCRTOP-CHGHT*4,6) REDWRD: ASCID/*/ LIVW(%LEFT,SCRTOP-CHGHT*2,4) NOIII,< ASCID/MODE=/ > III,< LHYWRD: ASCID/0000 / > ;# wds of buffer used MODWRD: 1 ASCID/ SCL=/ SCLWRD: 1 ASCID/ LVL=/ LVLWRD: 1 NOIII,< ASCID/ =/ > III,< ASCID/ FILE=/ > FILWRD:REPEAT NFWRDS,<1> III, NOIII,< XWD SAVWRD,54 > FVECT1: 12 III, NOIII,< XWD SAVWRD,54 > FVECT2: 12 III, NOIII,< XWD SAVWRD,54 > FBRT: BYTE(11)0,0(3)2,0(2)0,2(4)6 ;USE CURBRT ON THE REST OF THIS LOCAT: NOIII,< XWD %NLOC,20 ;NORMALLY JUMP TO %NLOC +12 ;CLEAR EDGE FLAG RDV(20,0) ;GO RIGHT +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD LOCAT,54 +12 ;CLEAR EDGE FLAG RDV(-20,0) ;GO LEFT +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD LOCAT,54 +12 ;CLEAR EDGE FLAG RDV(0,20) ;GO UP +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD LOCAT,54 +12 ;CLEAR EDGE FLAG RDV(0,-20) ;GO DOWN +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK >;NOIII %NLOC: III, NOIII,< XWD SAVWRD,54 > %CLOC: NOIII,< XWD ONOFF,20 ;NORMALLY JUMP TO ONOFF +12 ;CLEAR EDGE FLAG RDV(10,0) ;GO RIGHT +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD SAVWRD,54 +12 ;CLEAR EDGE FLAG RDV(-10,0) ;GO LEFT +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD SAVWRD,54 +12 ;CLEAR EDGE FLAG RDV(0,10) ;GO UP +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD SAVWRD,54 +12 ;CLEAR EDGE FLAG RDV(0,-10) ;GO DOWN +12 ;EDGE YET? XWD .-2,20 ;LOOP BACK XWD SAVWRD,54 >;NOIII ONOFF: III, NOIII,< XWD CROSS,20 ;INITIALLY USE CROSS BYTE(8)167,200,0(12)12 RPNT 0,0 RPNT 0,0 ;INNER RING RPNT -4,0 RPNT 4,-4 RPNT 4,4 RPNT -4,4 ;START FIRST RING RPNT -10,-4 RPNT 10,-10 RPNT 10,10 RPNT -10,10 ;START SECOND RING RPNT -14,0 RPNT 0,-20 RPNT 14,-10 RPNT 14,10 RPNT 0,20 RPNT -14,10 ;START THIRD RING BYTE(8)0,0,200(12)12 ;DON'T DRAW IF WE SAW LIGHT PEN. 0 RPNT -14,4 RPNT -10,-10 RPNT -4,-14 RPNT 4,-14 RPNT 10,-10 RPNT 14,-4 RPNT 14,4 RPNT 10,10 RPNT 4,14 RPNT -4,14 RPNT -10,10 RPNT -14,4 ;START FOURTH RING RPNT -16,6 RPNT -12,-6 RPNT -6,-12 RPNT -2,-16 RPNT 2,-16 RPNT 6,-12 RPNT 12,-6 RPNT 16,-2 RPNT 16,2 RPNT 12,6 RPNT 6,12 RPNT 2,16 RPNT -2,16 RPNT -6,12 RPNT -12,6 RPNT -16,2 0 0 0 >;NOIII CROSS: BYTE(11)10,10(3)0,0(2)0,2(4)6 BYTE(11)<-20>,<-20>(3)0,0(2)0,0(4)6 BYTE(11)0,<20>(3)0,0(2)0,2(4)6 BYTE(11)<20>,<-20>(3)0,0(2)0,0(4)6 NOIII,< 0 0 SAVWRD: 1 0 0 0 >;NOIII FEND__. >;NODEC NODEC,< NOIII,< BLDPY: DPYOUT BLINK ;PG # WILL BE FIXED UP >;NOIII >;NODEC STORAGE(IMPURE) ;IMPURE, BUT CAN GO IN UPPER DPYDPY: DPYOUT HEAD ; " HYDDPY: DPYOUT [DPYBUF NOIII,< 0> ] ; " HEAD: DPYBUF NOIII,< 0 > NODEC,< NOIII,< BLINK: NOITS,< BLINKB > ITS,< SETZ BLINKB > ;SIGN BIT ON SAYS BLINK THIS PG 0 ;WORD COUNT BLINKB: 1 ;NO-OP IN CASE IT GETS EXECUTED(WHICH I DON'T THINK IT DOES!) ITS,< XWD DPYBUF+1,20 > ;SKIP OVER THIS BLINKING STUFF XWD BPOS,74 ;WHERE WE WERE LAST TIME! +12 BYTE(11)400,0(3)0,0(2)0,2(4)6 ;20 TO RIGHT OF THERE BYTE(11)40,0(3)0,0(2)0,2(4)6 ;20 TO RIGHT OF THERE +12 ;EDGE OVERFLOW? XWD BLEAV,20 ;NO BYTE(11)0,0(3)0,0(2)1,2(4)6 ;RESET TO CENTER +12 ;CLEAR EO AND SET CONTROL BIT! BLEAV: XWD BPOS,64 ;SAVE WHERE WE ARE NOW +12 ;CONTROL BIT ON? 0 ;NO, STOP HERE XWD DPYBUF+1,20 ;TRANSFER TO DPYBUF! BPOS: 201 ;THE 200 WONT HURT US, BUT ITS LIKES IT BLINKL__.-BLINK >;NOIII >;NODEC >;NOCMU DPYBUF: BLOCK DPYLEN+200 DATPPN_'DATDRW' CMU,< DATPPN_<10053,,473002>> ;E130RG02 DEC,< NOVIROS, ;> DATPPN__0 > VIROS,< DATPPN_<4,,253> > >;DEC III,< DATPPN__<10,,76>> LIBPPN: DATPPN NOCORE: 0 OUTSTR[ASCIZ/YOU ARE SUFFERING FROM THE UNFORTUNATE FACT THAT YOUR OVERBLOATED PROGRAM WILL NO LONGER FIT IN OUR PUNY CORE!!!!!!! /] NODEC,< HALT @NOCORE > DEC,< PUSHJ P,TODDT ;GO TRY DDT JRST @NOCORE >;DEC ;CHARACTER SCALE STUFF ;MAX LEGAL SOFTWARE CHARACTER SIZE CSIZES__7 ;The available character scales are defined to be: ;User code Ratio to min size ;0 1 ;SAME AS STDBIG ;1 1 ;2 1.5 ;3 2 ;4 3 ;5 4 ;6 6 ;7 8 ;Some sites have drawing that used more kludegy size specs... DEC,< DEFINE MAPSIZ(A) < HRRZ A,(A)[11357777] > >;DEC STAN,< DEFINE MAPSIZ(A) < HRRZ A,(A)[11345555] > >;STAN CMU,< DEFINE MAPSIZ(A) < HRRZ A,(A)[11345555] > >;CMU IFNDEF MAPSIZ,> DEFINE FOO(A,B,C,D,E,F,G,H) < =A  =B  =C  =D  =E  =F  =G  =H > STORAGE(IMPURE) STDBIG: DEC,<2;>1 ;MAIN TEXT CHARACTER SIZE (MAPPED) ;INTERNAL CHARACTER OFFSETS ARE IN TERMS OF A VIRTUAL CHARACTER SET, ; WHICH IS FIXED FROM SITE TO SITE. IT GIVES CHARACTER OFFSETS ;IN TERMS OF FRACTIONAL CHARACTER UNITS. ;These are the spacings for the virtual character set - don't change!! VIRPTX: FOO(8,8,12,16,24,32,48,64) ;Width in Points PER CHAR VIRPTY: FOO(16,16,24,32,48,64,96,128) ;Height in points ;DISPLAYS POSSIBLY HAVE DIFFERENT RASTER SPACING THAN VIRTUAL ; AND ALSO DIFF AT SITES ;This compensates for the different display hardware ;Adjust these params to make character spacing right on screen ITS,< DPYPTX: FOO(12,12,12,16,24,32,48,64) DPYPTY: FOO(16,16,24,32,48,64,96,128) >;ITS III,< ;III has only char sizes 1,1,3,5,7,7,7,7 DPYPTX: FOO(8,8,16,24,32,48,64,128) DPYPTY: FOO(16,16,24,30,42,42,42,42) >;III IFNDEF DPYPTX,< DPYPTX: FOO(8,8,12,16,24,32,48,64) DPYPTY: FOO(16,16,24,30,42,64,96,128) >;IFNDEF ;PLOTTING MAY BE DIFFERENT ITS,< PLTPTX: FOO(9,9,12,16,23,32,48,64) PLTPTY: FOO(16,16,24,30,42,64,96,128) >;ITS III,< PLTPTX: FOO(8,8,12,16,24,32,48,64) PLTPTY: FOO(12,12,20,30,42,64,96,128) >;III IFNDEF PLTPTX,< PLTPTX: FOO(8,8,12,16,24,32,48,64) PLTPTY: FOO(16,16,24,32,48,64,96,128) >;IFNDEF ;CONVERT SOFTWARE CHARACTER SIZE TO HARDWARE CHARACTER SIZE ;Note: software size 0 must be same as size 1 S2H: III,< FOO(1,1,3,5,7,7,7,7) > DEC,< FOO(1,1,2,2,3,3,4,4) > STAN,< FOO(1,1,3,4,5,6,7,7) > CMU,< FOO(1,1,4,4,5,6,6,6) > ITS,< FOO(1,1,3,4,5,6,7,7) > ;XTEXTF AND YTEXTF TABLES ARE USED TO OFFSET THE CURSOR FOR TEXT SUCH THAT ;A BOX CHGHT BY CWIDTH (IN WHICH THE CHARACTER IS ASSUMED TO BE CENTERED) ;HAS ITS LOWER LEFT CORNER AT THE CURRENT POSITION. ;THIS COMPENSATES FOR OFFSET IN THE HARDWARE DISPLAY BETWEEN CHARACTER AND ;POINTS. IT IS IN III DISPLAY UNITS. ;TABLES ARE INDEXED BY "HARDWARE" CHARACTER SIZE DEFINE FOO(A,B,C,D,E,F,G,H) < A  B  C  D  E  F  G  H > DEC,< GT,< XTEXTF: FOO(-4,-10,-12,-22) YTEXTF: FOO(-1,-4,-4,-10) >;GT NOGT,< XTEXTF: FOO(-4,-6,-12,-22) YTEXTF: FOO(-1,-2,-4,-10) >;NOGT >;DEC STAN,< XTEXTF: FOO(-2,0,0,1,4,10,0) YTEXTF: FOO(1,0,0,6,14,20,0) >;STAN CMU,< XTEXTF: FOR I IN (10,14,16,20,30,40,60) YTEXTF: FOR I IN(10,14,16,20,30,40,60) >;CMU ITS,< XTEXTF: FOO(0,0,0,0,0,0,0,0) ;TV'S ARE PERFECT! YTEXTF: FOO(0,0,0,0,0,0,0,0) >;ITS III,< XTEXTF: FOO(0,0,0,0,0,0,0,0) ;LEAHY'S NOT SO PERFECT YTEXTF: FOO(4,0,6,0,2,0,4,0) >;ITS STORAGE(PURE) ;; Constant data locs for layout NOONE,< DEFINE CDATA(LABEL,SIZE,SEG) < IFIDNSTORAGE(IMPURE) LABEL: IFIDN<><0> IFDIF<> > >;NOONE ;In ONE segment layout, the common variables live in the D side. ONE,< DEFINE CDATA(LABEL,SIZE,SEG) < MD,STORAGE(IMPURE) LABEL: INTERNAL LABEL IFIDN<><0> IFDIF<> >;MD MPC, > >;ONE STORAGE(LOW) LAY,< RDOFF: 'GODMOD' 20 OFFSET: 0 REALLN: 0 WRTOFF: 'GODMOD' 21 NEWOFF: 0 >;LAY CDATA PATCH0,40,LOW NODEC,< NOIII,< CDATA SSSNAM CDATA SSSEXT CDATA SSSDAT CDATA SSSPPN >;NOIII >;NODEC ;ZERO AREA FOR LAYOUT "CONSTANTS" ZLOWBEGIN: LAY,< TPDLLN__40 ;TEMP PDL LENGTH CDATA TPDL,TPDLLN ;TEMP PDL FOR SAVE/GET ROUTINES CDATA IWD CDATA LAYPDL CDATA LAYBIT CDATA LAYM CDATA ODISP TWO,< CDATA DNUM CDATA PCNUM >;TWO CDATA DPCPNT ;POINT PASS LIST POINTER CDATA DOPASS CDATA LAYLET CDATA LAYNUM CDATA SWHICH ;0 D currently in, -1 PC currently in CDATA SWHCHA CDATA SWHCHS ;temp LAY,< BLLEN__=400 ;ENOUGH FOR 200 LOCATIONS TO BE PASSED CDATA BLDATA,BLLEN ;POINT PASS LIST SPACE (LIB) >;LAY LIB,< ;THE FOLLOWING MUST BE IN ORDER CDATA DBAND,4 CDATA D2BAND,4 CDATA PCBAND,4 CDATA PC2BAND,4 ;INDICIES INTO BAND STUFF BAND__0 DLOC__1 LENGTH__2 SEC__3 BAND2__4 >;LIB CDATA SAVNAM CDATA SAVEXT CDATA SAVPPN CDATA LAYLOC >;LAY DEC,< CDATA RTIME CDATA QTIME CDATA DTIME GT,< CDATA NBYTES >;GT VIROS,< CDATA TYPFLG CDATA VSTBUF,10 VSTEND__ DLX,< CDATA DLDVDS CDATA DLXBUF,8 >;DLX >;VIROS GT,< CDATA OPTFLG DLX,< CDATA DLXFLG >;DLX >;GT >;DEC nodec,< NOIII,< CDATA DPCNAM CDATA DPCEXT CDATA DPCDAT CDATA DPCPPN CDATA STRTLC CDATA AUTOSM CDATA AUTOSN >;NOIII CDATA SSSP >;NODEC CDATA TJOBDA,200 ;TEMP JOB DATA AREA CDATA RSAVET,,LOW NODEC,< CDATA NAMBUF,NNWRDS >;NODEC DEC,< CDATA SPPDL2,SPD2SZ,LOW CDATA GOING VB10,< CDATA PGTBL,4 >;VB10 CDATA NAMBUF,6 >;DEC CDATA SPPDL,SPPDSZ,LOW CMU,< CDATA PPNBUF,3 > CDATA IOHD,3,LOW CDATA IOBUF,406,LOW CDATA TTBUF,2,LOW CDATA CINST CDATA CHARP CMU,< CDATA CHKSVC CDATA PSVCNT PSVLEN__100 CDATA PDLSAV,PSVLEN >;CMU CDATA BSOR CDATA ISDPY CDATA DONTDPY CDATA TVISOFF CDATA POSS1 CDATA CURCUR CDATA PAGACT CDATA REALACT CDATA SQRFLG CDATA FORSOC CDATA FILNAM,,LOW CDATA FILEXT,,LOW CDATA FILDAT,,LOW CDATA FILPPN,,LOW DEC,< CDATA TMPNAM,,LOW CDATA TMPEXT,2,LOW CDATA TMPPPN,,LOW >;DEC CDATA DSKOPN CDATA DSKOHD,3,LOW CDATA DSKOBF,210,LOW CDATA BRKCHR CDATA DSKHD,3,LOW CDATA DSKBUF,210,LOW ZLOWEND__.-1 ;For the @ Listing program ;PATCH0#,SSSNAM#,SSSEXT#,SSSDAT#,SSSPPN#,TPDL#,IWD#,LAYPDL#,LAYBIT# ;LAYM#,ODISP#,DNUM#,PCNUM#,DPCPNT#,DOPASS#,LAYLET#,LAYNUM#,SWHICH# ;SWHCHA#,SWHCHS#,BLDATA#,DBAND#,D2BAND#,PCBAND#,PC2BAND#,SAVNAM#,SAVEXT# ;SAVPPN#,LAYLOC#,RTIME#,QTIME#,DTIME#,NBYTES#,TYPFLG#,VSTBUF#,DLDVDS#,DLXBUF# ;OPTFLG#,DLXFLG#,DPCNAM#,DPCEXT#,DPCDAT#,DPCPPN#,STRTLC#,AUTOSM#,AUTOSN#,SSSP# ;TJOBDA#,RSAVET#,NAMBUF#,SPPDL2#,GOING#,PGTBL#,NAMBUF#,SPPDL#,PPNBUF#,IOHD# ;IOBUF#,TTBUF#,CINST#,CHARP#,CHKSVC#,PSVCNT#,PDLSAV#,BSOR#,ISDPY#,DONTDPY# ;TVISOFF#,POSS1#,CURCUR#,PAGACT#,REALACT#,SQRFLG#,FORSOC#,FILNAM#,FILEXT#,FILDAT# ;FILPPN#,TMPNAM#,TMPEXT#,TMPPPN#,DSKOPN#,DSKOHD#,DSKOBF#,BRKCHR#,DSKHD#,DSKBUF# ;LOW CORE LOCNS ORG 40 UUO: 0 IFN 0,< JSR UUOCON> PUSHJ P,.UUOCON ORG NODEC,< STORAGE(IMPURE) UUOSAV: 0 >;NODEC ORG 124 REENTER ORG NOFST: 0 JRST .NOFST NOBLK: 0 JRST .NOBLK LCFLAG: -1 ;ALWAYS START WITH LOWER CASE ENABLED BOOPCN: 0 ;START WITH NO BOOPING BOOPLR: 0 VIROS,< NOGT,< VBCJFN: -1 >;NOGT DLX,< DLXJFN: -1 >;DLX STPPN: 3 ;FUNCTION CODE FOR PPN TO/FROM DIRECTORY STRING USRPPN: 0 ;PPN RETURNED HERE STPTR: 0 ;POINT TO DIRECTORY STRING >;VIROS STORAGE(LOW) ;MAKE AVAILABLE TO TWO SEGMENT PROGRAMS POPBAJ: POP P,B POPAJ: POP P,A POPJ P, POPBJ: POP P,B POPJ P, CPOPJ3: AOS (P) CPOPJ2: AOS (P) CPOPJ1: AOS (P) CPOPJ: POPJ P, ;LAYOUT INITIALIZATION CODE NODEC,< NOIII,< CMU,< .JBSAV_73  .JBS41_122 > NOCMU,< EXTERNAL .JBSAV,.JBS41 > EXTERNAL .JB41,.JBCOR LAY,< STORAGE(LOW) SAVE: ONE,< JRST ERRET> NOONE,< SETZB 0,M JSR LINIT MOVE P,[IOWD TPDLLN,TPDL] ;TEMP STACK SETUP OUTSTR[ASCIZ/BE CAREFUL, WILL NOT CHECK IF ALREADY EXISTS! /] PUSHJ P,DMPNAM JRST [ MOVE T,[%PNAME] MOVEM T,FILNAM MOVE T,[' 1 3'] MOVEM T,FILPPN JRST .+1] ENTPPN MOVE T,[FILNAM,,DPCNAM] BLT T,DPCPPN MOVEI T,.STRTN MOVEM T,STRTLC LIB,< SKIPE T,.JBSYM SUBI T,LAY2S-LAY1S+LAYBEG-LAY1S MOVEM T,LAYSYM-LAYBEG+LAY2S >;LIB JSR ISAVE ;save 2nd half JRST [ OUTSTR[ASCIZ/SAVE OF FIRST PART FAILED! /] EXIT] LIB,< SKIPN T,.JBSYM JRST [ MOVEI T,LAY1E-1 SETZ TT, JRST CORDWN] HLRE TT,T MOVN TT,TT HRLZ T,T HRRI T,LAY1E BLT T,LAY1E-1(TT) ;MOVE SYMBOLS DOWN MOVEI T,LAY1E-1(TT) ;THIS IS TOP+1 MOVE TT,.JBSYM HRRI TT,LAYBEG+LAY1E-LAY1S MOVEM TT,.JBSYM CORDWN: MOVEM TT,LAYSYM-LAYBEG+LAY1S CORE T, JFCL MOVEI T,-1 HRLM T,.JBSA ;.JBFF IS ALWAYS WRONG, MAKE IT VERY WRONG >;LIB TWO,< MOVE T,[LAY1S,,400000] BLT T,400000+LAY1E-LAY1S-1 MOVEI T,LAY1E-1 CORE2 T, JRST [ OUTSTR[ASCIZ/CORE2 FAILED FOR SECOND PART! /] EXIT] SETZM .JBSYM MOVEI T,0 SETDDT T, MOVEI T,LOWEND HRRZM T,.JBFF HRLM T,.JBSA IFN 0,<;REMOVED BY JBR MOVE T,[LAY1S,,LAYBEG] BLT T,LAYBEG+LAY1E-LAY1S-1 SKIPN T,.JBSYM JRST [ MOVEI T,LAY1S MOVEM T,.JBFF HRLM T,.JBSA SOJA T,CORDWN] HLRE TT,T MOVN TT,TT HRLZ T,T HRRI T,LAY1S BLT T,LAY1S-1(TT) MOVEI T,LAY1S(TT) MOVEM T,.JBFF HRLM T,.JBSA MOVEI TT,LAY1S HRRM TT,.JBSYM >;IFN 0 SUBI T,1 CORDWN: CORE T, JFCL >;TWO SETZM SWHCHS ;D IS AT END JSR SVREST OUTSTR[ASCIZ/SAVE OF SECOND PART FAILED!/] MOVE T,[DPCNAM,,SSSNAM] BLT T,SSSPPN OUTSTR[ASCIZ/ /] HLLZS .JBSA ;DISABLE RESTART!!!!!! EXIT DOSAVD: 0 JSR SAVSPC JRST @DOSAVD JSR SVFRST JRST [ JSR SAVSD JRST @DOSAVD JRST @DOSAVD] JSR SAVSD JRST @DOSAVD SETZM SWHCHS ;PC IS AT END JSR SVREST JRST @DOSAVD MOVE T,[DPCNAM,,SSSNAM] BLT T,SSSPPN AOS DOSAVD JRST @DOSAVD DOSAVP: 0 JSR SAVSD JRST @DOSAVP JSR SVFRST JRST [ JSR SAVSPC JRST @DOSAVP JRST @DOSAVP] JSR SAVSPC JRST @DOSAVP SETOM SWHCHS ;D IS AT END JSR SVREST JRST @DOSAVP MOVE T,[DPCNAM,,SSSNAM] BLT T,SSSPPN AOS DOSAVP JRST @DOSAVP >;NOONE .STRTN: JSR UPNAME JRST .STRT CONTLC: JSR UPNAME JSR LINIT JRST .CONT ;OTHER HALF WILL COME IN WHEN NEEDED UPNAME: 0 MOVEM 0,SSSNAM ;FILENAME HERE FROM RUN COMMAND HLLZM 1,SSSEXT MOVEM 4,SSSPPN MOVEI T,.STRT HRRM T,.JBSA ;NOW START HERE JRST @UPNAME ;LAYOUT INITIALIZATION CODE LINIT: 0 LIB,< MOVEI T,LAYBEG MOVEM T,DBAND+DLOC MOVEM T,PCBAND+DLOC ADDI T,=76*2000 MOVEM T,D2BAND+DLOC MOVEM T,PC2BAND+DLOC MOVEI T,4 MOVEI TT,PC2BAND LIBLOP: MOVNM T,BAND(TT) SUBI TT,BAND2 SOJG T,LIBLOP UFBCLR ;RELEASE ALL BANDS >;LIB TWO,< SETZM DNUM SETZM PCNUM SETZ T, SETUWP T, ;MAKE SURE CURRENT ONE ISN'T WRITE PROTECTED JFCL >;TWO ONE,< MD,< MOVE A,[LAY1S,,LAYVEC] ;Save dispatch for D side BLT A,LAYVEC+LLAYVEC-1 SETZM SWHICH >;MD >;ONE JRST @LINIT ;GETD, GETPC ONE,< GETD: SKIPN SWHICH POPJ P, ;ALREADY IN D MOVE A,[LAYVEC,,LAYBEG] ;No, restore its xfer vector BLT A,LAYBEG+LLAYVEC-1 SETZM SWHICH DPCRET: EXCH P,LAYPDL EXCH 0,LAYBIT EXCH M,LAYM JUMPE P,.STRTL PUSHJ P,SCRSET ;display update JRST .BLCHK GETPC: SKIPE SWHICH POPJ P, MOVE A,[LAY2S,,LAYBEG] BLT A,LAYBEG+LLAYVEC-1 SETOM SWHICH JRST DPCRET DOSAVD: DOSAVP: 0 JRST ERRET >;ONE NOONE,< GETD: JSR SAVSD POPJ P, ;Already in D JRST DPCRET GETPC: JSR SAVSPC POPJ P, DPCRET: EXCH P,LAYPDL EXCH 0,LAYBIT EXCH M,LAYM JUMPE P,.STRTL PUSHJ P,SCRSET ;display update JRST .BLCHK SAVSD: 0 JSR RELPC JSR %GETD CAIA JRST [ AOS SAVSD JRST @SAVSD] OUTSTR[ASCIZ/CAN'T GET D PART, WILL TRY PC PART! /] JSR %GETPC CAIA JRST @SAVSD OUTSTR[ASCIZ/CAN'T GET EITHER, I DIE NOW /] HALT SAVSD+1 SAVSPC: 0 JSR RELD ;Release D half JSR %GETPC ;Get PC half CAIA JRST [ AOS SAVSPC JRST @SAVSPC] OUTSTR[ASCIZ/CAN'T GET PC PART, WILL TRY D PART! /] JSR %GETD CAIA JRST @SAVSPC OUTSTR[ASCIZ/CAN'T GET EITHER, I DIE NOW /] HALT SAVSPC+1 ;;Release D half RELD: 0 LIB,< MOVEI TT,DBAND ;START HERE JSR %PUTLIB >;LIB TWO,< SETZ T, SEGNUM T, MOVEM T,DNUM DETSEG >;TWO JRST @RELD ;;Release PC half RELPC: 0 LIB,< MOVEI TT,PCBAND JSR %PUTLIB >;LIB TWO,< SETZ T, SEGNUM T, MOVEM T,PCNUM DETSEG >;TWO JRST @RELPC ;;Get D half %GETD: 0 LIB,< MOVEI TT,DBAND JSR %GETLIB JRST GETD1 ;NOT IN YET JRST GETDX ;WAS IN, BUT LOST >;LIB TWO,< SKIPN T,DNUM JRST GETD1 ATTSEG T, JRST GETDX >;TWO LIB,< MOVE T,LAYSYM MOVEM T,.JBSYM >;LIB AOS %GETD JRST @%GETD GETDX: OUTSTR[ASCIZ/REINITIALIZING "D" PART FROM DMP FILE! /] LIB,< MOVM T,DBAND MOVNM T,DBAND MOVM T,D2BAND MOVNM T,D2BAND >;LIB TWO,< SETZM DNUM >;TWO SETZM LAYPDL GETD1: SETZ T, ;TELL HIM WE WANT D PART JSR GETDPC CAIA AOS %GETD JRST @%GETD %GETPC: 0 LIB,< MOVEI TT,PCBAND JSR %GETLIB JRST GETPC1 JRST GETPCX >;LIB TWO,< SKIPN T,PCNUM JRST GETPC1 ATTSEG T, JRST GETPCX >;TWO LIB,< MOVE T,LAYSYM MOVEM T,.JBSYM >;LIB AOS %GETPC JRST @%GETPC GETPCX: OUTSTR[ASCIZ/REINITIALIZING "PC" PART FROM DMP FILE! /] LIB,< MOVM T,PCBAND MOVNM T,PCBAND MOVM T,PC2BAND MOVNM T,PC2BAND >;LIB TWO,< SETZM PCNUM >;TWO SETZM LAYPDL GETPC1: SETO T, ;TELL HIM WE WANT PC PART JSR GETDPC CAIA AOS %GETPC JRST @%GETPC >;NOONE ;SUBRS FOR LIBRASCOPE GETD, GETPC LIB,< %PUTLIB:0 MOVE T,.JBREL SUBI T,LAYBEG-1 CAILE T,=76*2000 MOVEI T,=76*2000 JSR ONEBND MOVE T,.JBREL SUBI T,LAYBEG-1+=76*2000 JUMPLE T,@%PUTLIB ADDI TT,BAND2 JSR ONEBND JRST @%PUTLIB ONEBND: 0 MOVEM T,LENGTH(TT) SKIPL T,BAND(TT) JRST GOTDBN NODBN: MOVM T,BAND(TT) UFBGIV T, MOVM T,BAND(TT) UFBGET T, JSR NOBAND MOVMS T,BAND(TT) GOTDBN: FBWRT T,DLOC(TT) JRST NODBN FBWAIT UFBERR JRST NODBN JRST @ONEBND ;DONE! NOBAND: 0 OUTSTR[ASCIZ/NO FAST BANDS, CONTINUE TO TRY AGAIN /] SOS NOBAND SOS NOBAND HALT @NOBAND %GETLIB:0 SKIPGE T,BAND(TT) JRST @%GETLIB AOS %GETLIB JSR GETBND JRST @%GETLIB SKIPG LENGTH+BAND2(TT) JRST GETLDN ADDI TT,BAND2 MOVE T,BAND(TT) JSR GETBND JRST @%GETLIB GETLDN: AOS %GETLIB JRST @%GETLIB GETBND: 0 %GETL1: MOVE TTT,LENGTH(TT) ADD TTT,DLOC(TT) SUBI TTT,1 CORE TTT, JRST [ JSR NOCORE JRST %GETL1] FBREAD T,DLOC(TT) JRST [ OUTSTR[ASCIZ/FAST-BAND READ ERROR! /] JRST @GETBND] FBWAIT UFBERR JRST @GETBND AOS GETBND JRST @GETBND >;LIB ;GET OTHER PART FROM FILE NOONE,< GETDPC: 0 CAME T,SWHICH ;DO WE WANT THE ONE AT THE END? TDZA T,T ;NO, GET FRONT ONE SETO T, ;YES, GET END ONE MOVEM T,SWHCHA MOVE T,[SSSNAM,,FILNAM] BLT T,FILPPN INIT IOLAY,17 'DSK ' 0 JRST NOFIL PGFIL: OUTSTR[ASCIZ/GETTING /] MOVEI A,FILNAM JSR FPRINT DEC,< MOVE T,FILPPN > LOOKUP IOLAY,FILNAM JRST [ OUTSTR[ASCIZ/, LOOKUP FAILED, ANOTHER /] MOVEM P,TPDL MOVE P,[IOWD TPDLLN,TPDL] PUSH P,(P) PUSHJ P,PUSHIT ;SAVE EVERYONE PUSHJ P,DMPNAM SETZM FILNAM PUSHJ P,POPIT POP P,P SKIPN FILNAM JRST NOFIL JRST PGFIL] DEC,< JSR IOLAY,LOOKCK >;DETERMINE REAL PPN SKIPE SWHCHA ;WHICH PART DO WE WANT JRST ENDP MTAPE IOLAY,RDOFF ;GET OFFSET MOVN T,OFFSET ;BACKWARD USET USETI IOLAY,1(T) MOVE T,OFFSET LSH T,7 LIB,< MOVEI TT,LAY1S ANDI TT,177 >;LIB TWO,< SETZ TT, > JRST FRONTP ENDP: TWO,< MOVE T,[-200,,TJOBDA-1] MOVEI TT,0 INPUT IOLAY,T MOVE T,TJOBDA-.JBSAV-1+HILOC ;GET STARTING FILE ADDRESS OF UPPER MOVE TT,T LSH T,-7 USETI IOLAY,1(T) >;TWO LIB,< MOVEI T,LAY1S-.JBSAV-1+200 LSH T,-7 ;MAKE RECORD NUMBER USETI IOLAY,(T) >;LIB HLRO T,FILPPN MOVN T,T ;POS LENGTH OF FILE LIB,< MOVEI T,LAY1S-.JBSAV-1+200 > ANDCMI TT,177 ;GET FIRST WORD WE WILL READ FRONTP: SUBB T,TT ;NUMBER OF WORDS TO READ! LIB,< ADDI TT,LAYBEG-1 ;THIS IS HOW MUCH ROOM WE NEED CORE TT, >;LIB TWO,< ADDI TT,400000-1 CORE2 TT, >;TWO JRST NOFIL MOVN T,T MOVS T,T LIB,< HRRI T,LAYBEG-1 > TWO,< HRRI T,400000-1 > SETZ TT, IN IOLAY,T CAIA JRST NOFIL LIB,< SKIPN SWHCHA JRST GOTDPC MOVEI T,LAYBEG-74 ANDI T,177 ;HOW MUCH TO BLT DOWN JUMPE T,GOTDPC MOVE TT,.JBREL SUB TT,T MOVS T,T ADD T,[LAYBEG,,LAYBEG] BLT T,(TT) >;LIB GOTDPC: AOS GETDPC OUTSTR[ASCIZ/ /] LIB,< MOVE T,LAYSYM MOVEM T,.JBSYM >;LIB RELEASE IOLAY, JRST @GETDPC NOFIL: OUTSTR[ASCIZ/COULDN'T GET DISK FILE! /] RELEASE IOLAY, JRST @GETDPC >;NOONE ;SUBRS TO SAVE LAYOUT VERSIONS! NOONE,< ;;Save 2nd half of layout program in file leader ISAVE: 0 MOVE T,ISAVE MOVEM T,SVFRST LIB,< MOVEI T,LAY2S-1 ;save second half MOVEM T,IWD SKIPN T,.JBSYM JRST [ MOVNI TT,LAY2E JRST NOSYMS] HLRE TT,T SUBI TT,(T) NOSYMS: TRZ TT,177 ;ROUND UP TO MULTIPLE OF 200 WORDS SO GET WON'T LOSE ADDI TT,LAY2S HRLM TT,IWD >;LIB TWO,< MOVE TT,[LAY2S-LAY2E,,LAY2S-1] MOVEM TT,IWD >;TWO JRST ISAVE1 ;;Save 1st half of layout prgm in file leader SVFRST: 0 MOVEI T,LAYBEG-1 MOVEM T,IWD LIB,< MOVN T,.JBREL > TWO,< HRRZ T,.JBHRL MOVN T,T >;TWO ADDI T,LAYBEG-1 HRLM T,IWD ISAVE1: OUTSTR[ASCIZ/SAVING /] MOVEI A,DPCNAM JSR FPRINT INIT DAT,17 'DSK ' 0 JRST [ OUTSTR[ASCIZ/, CAN'T GET DISK! /] HALT SVFRST+1] MOVE T,[DPCNAM,,FILNAM] BLT T,FILPPN ENTER DAT,FILNAM JRST [ OUTSTR[ASCIZ/, ENTER FAILED, YOU LOSE! /] JRST SVQTF] MOVE T,IWD SETZ TT, OUT DAT,T ;POOT OUT FIRST PART JRST OUTOK OUTSTR[ASCIZ/, OUTPUT ERROR! /] SVQTF: RELEASE DAT,3 JRST @SVFRST OUTOK: UGETF DAT,NEWOFF ;GET EOF+1 MTAPE DAT,WRTOFF ;SET IT IN FILE JRST [ OUTSTR[ASCIZ/, MTAPE TO SET RECORD OFFSET FAILED! /] JRST SVQTF] USETO DAT,1 ;GET TO NEW END(BEGINNING) AOS SVFRST JRST @SVFRST ;SO FAR SO GOOD >;LAY >;NOONE HINAME__134 ;UPPER SEGMENT NAME HILOC__135 ;LOC OF UPPER SEGMENT AFTER INPUT FROM DMP FILE ;;Create TOPS-10 format SAVE file of core image (other half ;; may be in leader part of file) SVREST: 0 NOLAY,< OUTSTR[ASCIZ/SAVING /] MOVEI A,DPCNAM JSR FPRINT INIT DAT,17 'DSK ' 0 JRST [ OUTSTR[ASCIZ/CAN'T GET DISK! /] HALT SVREST+1] MOVE T,[DPCNAM,,FILNAM] BLT T,FILPPN ENTER DAT,FILNAM JRST [ OUTSTR[ASCIZ/, ENTER FAILED, YOU LOSE! /] JRST SVQUIT] >;NOLAY LAY,< MOVE T,SWHCHS EXCH T,SWHICH MOVEM T,SWHCHS >;LAY MOVE T,[.JBSAV+1,,TJOBDA] BLT T,TJOBDA+177 ;SETUP A PSUEDO JOB DATA AREA MOVE T,STRTLC HRRM T,TJOBDA-.JBSAV-1+.JBSA ;STORE PLACE FOR IT TO START MOVE T,.JB41 MOVEM T,TJOBDA-.JBSAV-1+.JBS41 SETZM TJOBDA-.JBSAV-1+.JBCOR ;ALWAYS USE SIZE OF FILE SETZM TJOBDA-.JBSAV-1+HINAME ;ALWAYS 0 HINAME (EVEN FOR SEGMENTS) NOTWO,< SETZM TJOBDA-.JBSAV-1+HILOC >;NOTWO TWO,< MOVE T,.JBREL SUBI T,.JBSAV+1 IORI T,177 ADDI T,.JBSAV+2 ;THIS IS WHAT GET WANTS TO SEE MOVEM T,TJOBDA-.JBSAV-1+HILOC ;NO PROT OF ANY KIND >;TWO MOVE T,[IOWD 200,TJOBDA] SETZ TT, OUT DAT,T CAIA JRST [ OUTSTR[ASCIZ/OUTPUT ERROR FOR JOB DATA AREA! /] JRST SVQUIT] MOVEI T,.JBSAV+1+200-1 ;START OUTPUT HERE MOVN TT,.JBREL ADD TT,T HRL T,TT SETZ TT, OUT DAT,T CAIA JRST [ OUTSTR[ASCIZ/OUTPUT ERROR ON LOW CORE WRITE! /] JRST SVQUIT] TWO,< HRRZ TT,.JBHRL MOVN TT,TT MOVEI T,400000-1 ADD TT,T HRL T,TT SETZ TT, OUT DAT,T CAIA JRST [ OUTSTR[ASCIZ/OUTPUT ERROR ON HIGH CORE WRITE! /] JRST SVQUIT] >;TWO RELEASE DAT, AOS SVREST JRST @SVREST SVQUIT: RELEASE DAT,3 ;FLUSH FILE LAY,< MOVE T,SWHCHS MOVEM T,SWHICH >;LAY JRST @SVREST ;DMP FILENAME SCANNER LAY,< DMPNAM: MOVSI T,'DMP' MOVEM T,FILEXT SETZB T,FILEXT+1 ;CLEAR THIS WORD DSKPPN T, ;HIS OWN PPN MOVEM T,FILPPN OUTSTR [ASCIZ/DMP FILENAME?/] NOITS,< PUSHJ P,GETWRD > ;SCAN FILENAME ITS,< PUSHJ P,QETNAM > ;SCAN FILENAME CAIN C,12 JUMPE T,CPOPJ ;LET HIM OUT IF HE TYPES NOTHING NOITS,< MOVEM T,FILNAM ;SAVE FILENAME CAIN C,"[" ;ANY EXTENSION? JRST NOEXT ;NO CAIN C,12 JRST NOEXT ;NO CAIE C,"." JRST [ ILGLNM: OUTSTR[ASCIZ/INPUT ERROR! /] CLRBFI JRST DMPNAM] PUSHJ P,GETWRD ;SCAN EXTENSION HLLZM T,FILEXT ;SAVE IT. NOEXT: CAIN C,12 ;HERE TO SCAN PPN JRST CPOPJ1 ;LEAVE NOW CAIE C,"[" JRST ILGLNM ;MUST BE [ PUSHJ P,GETWRD ;SCAN P. JUMPE T,ILGLNM PUSHJ P,RJUST HRLZM T,FILPPN ;AND SAVE CAIE C,"," ;BETTER BE COMMA JRST NOPRG PUSHJ P,GETWRD ;SCAN PN. JUMPE T,ILGLNM PUSHJ P,RJUST HRRM T,FILPPN ;AND SAVE NOPRG: SETZ T, CAIN C,"]" ;BETTER END WITH THIS PUSHJ P,GETWRD ;MAKE SURE HE DIDN'T TYPE TO MUCH JUMPN T,ILGLNM ;LOSE IF HE DID CAIE C,12 JRST ILGLNM ;DIDN'T END WITH LF JRST CPOPJ1 >;NOITS ITS,< CAIE C,";" JRST QOLST1 MOVEM T,FILPPN PUSHJ P,QETNAM JUMPE T,CPOPJ ;STILL NOT REASONABLE QOLST1: CAIE C,40 CAIN C,12 SKIPA JRST [ ILGLNM: OUTSTR[ASCIZ/INPUT ERROR! /] CLRBFI JRST DMPNAM] MOVEM T,FILNAM CAIN C,12 JRST CPOPJ1 ;DONE PUSHJ P,QETNAM ;GET SECOND FILE NAME CAIE C,12 JRST ILGLNM ;EXTRA GARBAGE AT END JUMPE T,ILGLNM MOVEM T,FILEXT JRST CPOPJ1 >;ITS RJUST: TRZ T,-1 ;THREE LETTERS ONLY CAIA LSH T,-6 TRNN T,77 ;RIGHT JUSTIFIED YET? JRST .-2 ;NO POPJ P, NOITS,< GETWRD: SETZ T, ;WORD WILL ACCUMULATE HERE MOVE A,[POINT 6,T] ;BYTE POINTER TO DEPOSIT CHARACTERS CHRGET: PUSHJ P,TTYIN ;READ A CHAR ISCHRX: CAIE C,15 ;IGNORE LF'S CAIN C,40 ;AND SPACES JRST CHRGET CAIL C,"0" ;NUMBERS ARE LEGAL CAILE C,"9" CAIA JRST CHROK CAILE C,"z" POPJ P, ;BREAK CHAR. CAIL C,"a" SUBI C,40 ;CHANGE LOWER CASE TO UPPER CAIL C,"A" ;NOW ONLY UPPER CASE LETTERS ARE LEGAL CAILE C,"Z" POPJ P, ;BREAK CHROK: SUBI C,40 ;NO, MAKE IT SIXBIT TLNE A,770000 ;END OF WORD? IDPB C,A ;STORE JRST CHRGET >;NOITS ;ITS NAME SCANNER ITS,< QETNAM: SETZ T, ;WORD WILL ACCUMULATE HERE MOVE A,[POINT 6,T] ;BYTE POINTER TO DEPOSIT CHARACTERS QETNM1: PUSHJ P,TTYIN ;READ A CHAR CAIE C,15 ;IGNORE LF'S CAIN C,40 ;AND SPACES JRST QETNM1 SKIPA QETNM2: PUSHJ P,TTYIN CAIN C,15 JRST QETNM2 CAIL C,"a" CAILE C,"z" CAIA SUBI C,40 ;LOWERCASE CAILE C,40 ;BREAK ON SPACE CAILE C,"_" POPJ P, ;NOT SIXBIT CHARACTER CAIE C,";" CAIN C,":" POPJ P, SUBI C,40 ;NO, MAKE IT SIXBIT TLNE A,770000 ;END OF WORD? IDPB C,A ;STORE JRST QETNM2 >;ITS TTYIN: INCHWL C ANDI C,177 CAIN C,15 JRST TTYIN POPJ P, >;LAY >;NOIII >;NODEC ;PUSHIT, POPIT STORAGE(IMPURE) FPRINT: 0 ITS,< MOVE TTT,3(A) JSP T,.SIXP OUTCHR[";"] >;ITS MOVE TTT,(A) JSP T,.SIXP NOITS,< OUTCHR["."] > ITS,< OUTCHR[" "] > HLLZ TTT,1(A) JSP T,.SIXP NOITS,< DEC,< SKIPN 3(A) JRST @FPRINT FPPPN: >;DEC OUTCHR["["] NOCMU,< HLLZ TTT,3(A) JSP T,.SIXPL OUTCHR[","] HRLZ TTT,3(A) JSP T,.SIXPL >;NOCMU CMU,< SKIPN TTT,3(A) DSKPPN TTT, MOVE T,[TTT,,PPNBUF] DECCMU T, JRST [ JSP T,.SIXPL ;IF DECCMU BLETCHES, SIXPRINT IT JRST PPNDON ] OUTSTR PPNBUF PPNDON: >;CMU OUTCHR ["]"] >;NOITS JRST @FPRINT LOOKRR: RELEASE DAT, LOOKER: HRRZ T,1(A) OUTSTR[ASCIZ/, /] CAIL T,LOKLEN MOVEI T,ULSERR OUTSTR @LOKETB(T) OUTSTR[ASCIZ/. /] NOLAY,< JRST LERRET > LAY,< JRST .LERRET > LOKETB: [ASCIZ/FILE NOT FOUND/] [ASCIZ/ILLEGAL PPN/] [ASCIZ/PROTECTION FAILURE/] [ASCIZ/FILE IN USE/] ULSERR__.-LOKETB [ASCIZ/UNKNOWN LOOKUP STATUS/] [ASCIZ/DATA TRANSMISSION ERROR/] LOKLEN__.-LOKETB DEC,< LOOKCK: 0 JUMPE T,ANYPPN MOVEM T,3(A) ;SAVE AWAY HERE FOR NOW MOVE TTT,[3,,T] MOVE T,LOOKCK LDB T,[POINT 4,-1(T),12] ;GET CHANNEL # PATH TTT, DSKPPN TTT, ;PATH LOSES, GET USER PPN CAMN TTT,3(A) ;IS THIS FILE'S ORIGIN DIFFERENT THAN REQUESTED? JRST @LOOKCK ;NO, WIN SOS LOOKCK SOS LOOKCK HLLZS 1(A) ;MAKE IT FILE NOT FOUND JRST @LOOKCK ;THIS HAD BETTER RETURN TO LOOKUP ERROR FOR LOOKUP UUO ANYPPN: MOVE TTT,[3,,T] MOVE T,LOOKCK LDB T,[POINT 4,-1(T),12] ;GET CHANNEL # PATH TTT, DSKPPN TTT, ;PATH LOSES, GET USER PPN MOVEM TTT,3(A) ;AND STORE MOVE T,LOOKCK MOVEM T,FPRINT ;TELL HIM WHERE TO GO JRST FPPPN ;NOW PRINT PPN AND RETURN >;DEC .SIXPL: NODEC,< NOIII,< TLNN TTT,777700 LSH TTT,14 TLNN TTT,770000 LSH TTT,6 >;NOIII >;NODEC IFN DECSW!IIISW,< MOVE TT,TTT JUMPE TT,(T) TRO TT,400000 ROT TT,3 TRNN TT,7 JRST .-2 .SIXP2: TRZ TT,777770 ADDI TT,"0" OUTCHR TT ROT TT,3 TLNE TT,-1 JRST .SIXP2 JRST (T) >;IFN DECSW!IIISW .SIXP: JUMPE TTT,(T) SETZ TT, LSHC TT,6 ADDI TT,40 OUTCHR TT JRST .SIXP PGP,< POPALL: SKIPE $VAL ;ANY ERROR OCCURED? PUSHJ P,PGPERR;YES, PRINT MESSAGE POP P,0 ;GET RETURN ADR EXCH 0,-17(P);RESTORE 0, SAVE RETURN ADR PUSHJ P,POPIT ;RESTORE ACS 2-17 MOVEI 1,INTBLK;ENABLE CTRL C INTERCEPT MOVEM 1,.JBINT POP P,1 ;RESTORE 1 POPJ P, PUSHAL: SETZM .JBINT ;DISABLE CTRL C INTERCEPT DURING PGP CODE SETZM $VAL ;CLEAR ERROR ACCUMULATION EXCH 0,(P) ;SAVE 0 AND GET RETURN PUSH P,1 ;SAVE 1 PUSH P,0 ;SAVE RETURN ADR MOVE 0,-2(P) ;RESTORE 0 >;PGP ;ONLY SAVE AC'S 2-17 PUSHIT:EXCH 2,(P) ;SAVE 2 AND GET RETURN. MOVEM 2,16(P) ;GEE, THIS WAY WE RETURN WITH A POPJ MOVEI 2,1(P) HRLI 2,3 BLT 2,15(P) MOVE 2,(P) ;RESTORE 2 ADD P,[XWD 16,16] POPJ P, ;RETURN TO SENDER ;ONLY RESTORES AC'S 2-17 POPIT: MOVSI 17,-15(P) HRRI 17,3 BLT 17,17 ;FIXES P MOVE 2,16(P) EXCH 2,(P) POPJ P, STORAGE(IMPURE) XLIST VAR TWO, NOTWO, LIT LIST