1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-20 09:55:52 +00:00
PDP-10.its/src/draw/second.521
2018-05-05 19:19:09 +02:00

2076 lines
39 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;; 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,<EXTERNAL LAY2S
INTERNAL LAYSYM,.STRT,.STRTL,SCRSET,.CONT,.BLCHK,.NOFST,.NOBLK,REENTER,.LERRET,.UUOCON
INTERNAL LAYVEC,LAYBEG
>;PASS1
PASS2,<INTERNAL LAY2S
EXTERNAL LAYSYM,.STRT,.STRTL,SCRSET,.CONT,.BLCHK,.NOFST,.NOBLK,REENTER,.LERRET,.UUOCON
EXTERNAL LAYVEC,LAYBEG
>;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,<NOITS,<NNCHRS__6+4+6+6+3>> ;FFFFFF.EEE[PPPPPP,NNNNNN]
STANFO,<NNCHRS__6+4+6+4> ;FFFFFF.EEE[PPP,NNN]
ITS,<NNCHRS__6+4+6+1> ;UUUUUU;FFFFFF EEE
;NUMBER OF WORDS NECESSARY TO SHOW DEFAULT FILENAME
NOLAY,<NFWRDS__(NNCHRS+4)/5 >;FFFFFF[PPP,NNN]
LAY,<NFWRDS__(NNCHRS*2+1+4)/5 >;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 <CTRL> CHAR (1 ALT)
AMMTA__14 ;ALTER MODE <META> 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,<ACLOSE__176> ;CLOSING CHARACTER IN ";A"
CMU,<ACLOSE__175>
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,<GENCHR__"!">
;SPECIAL CHARS FOR SEARCH STUFF IN ALTER MODE AND F
QUOCHR__"" ;QUOTE CHAR IN SEARCH STRINGS
BELCHR__"|" ;BEGINNING OR END OF LINE
NOSKEY,<ANYCHR__24> ;ANY CHAR IN SEARCH STRING
SKEY,<ANYCHR__"?"> ; "
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,<GTY__600>
IFE GTSMAL,<GTY__1000>
%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
<BYTE (3) VGROUP (9) VMAJOR (6) VMINOR>
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 <A><>< 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)<X>,<Y>(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)<X>,<Y>(3)3,S(2)1,2(4)6 >
DEFINE RDV(X,Y)
< BYTE (7)<X>,<Y>(2)0(7)<X>,<Y>(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,<SHIFT IN>"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,<SAVWR1: LIVW(0,0,0) >
NOIII,< XWD SAVWRD,54 >
FVECT1: 12
III,<SAVWR2: LIVW(0,0,0) >
NOIII,< XWD SAVWRD,54 >
FVECT2: 12
III,<SAVWR3: LIVW(0,0,0) >
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
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(20,0) ;GO RIGHT
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD LOCAT,54
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(-20,0) ;GO LEFT
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD LOCAT,54
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(0,20) ;GO UP
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD LOCAT,54
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(0,-20) ;GO DOWN
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
>;NOIII
%NLOC:
III,<SAVWR4: LIVW(0,0,0) >
NOIII,< XWD SAVWRD,54 >
%CLOC:
NOIII,< XWD ONOFF,20 ;NORMALLY JUMP TO ONOFF
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(10,0) ;GO RIGHT
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD SAVWRD,54
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(-10,0) ;GO LEFT
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD SAVWRD,54
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(0,10) ;GO UP
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD SAVWRD,54
<BYTE(8)40>+12 ;CLEAR EDGE FLAG
RDV(0,-10) ;GO DOWN
<BYTE(8)0,0,40>+12 ;EDGE YET?
XWD .-2,20 ;LOOP BACK
XWD SAVWRD,54
>;NOIII
ONOFF:
III,<SAVWR5: LIVW(0,0,0) >
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!
<BYTE(8)0,0,200>+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
<BYTE(8)0,0,40>+12 ;EDGE OVERFLOW?
XWD BLEAV,20 ;NO
BYTE(11)0,0(3)0,0(2)1,2(4)6 ;RESET TO CENTER
<BYTE(8)240,200,0>+12 ;CLEAR EO AND SET CONTROL BIT!
BLEAV: XWD BPOS,64 ;SAVE WHERE WE ARE NOW
<BYTE(8)0,0,200>+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,<PGP,< DATPPN__<362,,5010> ;> 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 MAPSIZ(A)<>>
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)
<I*(CWIDTH/2-3)/10  >
YTEXTF: FOR I IN(10,14,16,20,30,40,60)
<I*(CHGHT/2-5)/10  >
>;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)
<
IFIDN<SEG><LOW><STORAGE(LOW);>STORAGE(IMPURE)
LABEL:
IFIDN<SIZE><><0>
IFDIF<SIZE><><BLOCK SIZE>
>
>;NOONE
;In ONE segment layout, the common variables live in the D side.
ONE,<
DEFINE CDATA(LABEL,SIZE,SEG)
<
MD,<IFIDN<SEG><LOW><STORAGE(LOW);>STORAGE(IMPURE)
LABEL:
INTERNAL LABEL
IFIDN<SIZE><><0>
IFDIF<SIZE><><BLOCK SIZE>
>;MD
MPC,<EXTERNAL LABEL>
>
>;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__<POINT 7,VSTBUF+7,27>
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,<STORAGE(LOW)>
NOTWO,<STORAGE(PURE)>
LIT
LIST