1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-25 09:52:18 +00:00
Files
PDP-10.its/src/draw/sub.501
2018-05-05 19:19:09 +02:00

4127 lines
69 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.
;<DRAW>SUB.FAI.205, 26-NOV-75 17:02:15, EDIT BY HELLIWELL
VERSION(SUB,18)
;HERE WE SAVE DUMP FILES OF ALL SORTS
LAY,<
RSAVEM: TROA TFLG
>;LAY
SAVEME:
LAY,< TRZ TFLG >
IFN DECSW!IIISW,<
TLNE M,DSKFLG
JRST [ OUTSTR[ASCIZ/SORRY, DSKIN ACTIVE!
/]
POPJ P,]
>;IFN DECSW!IIISW
NODEC,<
NOIII,<
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/DISK SAVE /]
LAY,< MOVE H,SAVNAM
EXCH H,LSTNAM ;USE THIS AS LSTNAM FOR NOW
MOVE G,SAVPPN
EXCH G,LSTPPN
MOVE F,SAVEXT
EXCH F,LSTEXT
>;LAY
MOVSI T,EXTSAV
PUSHJ P,SETNAM
NOLAY,< POPJ P, >
LAY,< JRST [ MOVEM H,LSTNAM ;CHANGED HIS MIND, RESTORE LSTNAM
MOVEM G,LSTPPN
MOVEM F,LSTEXT
POPJ P,]
MOVEM H,LSTNAM
MOVEM G,LSTPPN
MOVEM F,LSTEXT
>;LAY
ENTPPN
ESAVEM:
MOVE T,[FILNAM,,DPCNAM]
BLT T,DPCPPN
INIT DAT,17
'DSK '
0
JRST [ OUTSTR[ASCIZ/CAN'T GET DISK FOR EXISTS CHECK!
/]
POPJ P,]
PUSHJ P,EXIST
POPJ P, ;LET HIM OUT
RELEASE DAT,
PUSH P,0
PUSH P,M
PUSHJ P,PUSHIT
MOVEM P,SSSP
LAY,< TRNE TFLG
SKIPA T,[.STRTN] ;START FROM TOP ON RESAVE
>;LAY
MOVEI T,CONTLC
MOVEM T,STRTLC
NOLAY,< JSR SVREST >
LAY,<
MD,< JSR DOSAVD >
MPC,< JSR DOSAVP >
>;LAY
CAIA ;LOSE, CRLF ALREADY OUT
OUTSTR[ASCIZ/
/] ;WIN, NEED CRLF
>;NOIII
>;NODEC
III,< PUSH P,0
PUSH P,M
PUSHJ P,PUSHIT
MOVEM P,SSSP
>;III
IFN DECSW!IIISW,<
MOVEI T,CONTLC
HRRM T,.JBSA
OUTSTR[ASCIZ/SAVE CORE IMAGE WITH "SAVE" COMMAND,
THEN TYPE "START" OR "RUN".
/]
DEC,< PUSHJ P,CTRLCS > ;SIMULATE CONTROL-C
III,< EXIT 1, >
>;INF DECSW!IIISW
NODEC,<
MOVE P,SSSP
PUSHJ P,POPIT
POP P,M
POP P,0
>;NODEC
JRST SAVCON
NOLAY,<CONTLC:>
CNTSAV:
DEC,< JSP T,CTRLCX > ;CALL CONTROL-C EXIT ROUTINE
LAY,<
MD,< OUTSTR[ASCIZ/LAYOUT, D SIDE!
/]
>;MD
MPC,< OUTSTR[ASCIZ/LAYOUT, PC SIDE!
/]
>;MPC
>;LAY
NODEC,<
MOVE P,SSSP
PUSHJ P,POPIT
POP P,M
POP P,0
PUSHJ P,DCLAIM ;RECLAIM DISPLAY FOR EVERYONE ELSE (DEC DONE IN CTRLC CODE)
>;NODEC
DEC,< PUSHJ P,CLTIME > ;RE INIT TIME CELLS
SAVCON:
NODEC,<
NOIII,< MOVE T,DPCNAM
NOLAY,< MOVEM T,LSTNAM ;UPDATE  >
LAY,< MOVEM T,SAVNAM >
MOVE T,DPCPPN
NOLAY,< MOVEM T,LSTPPN >
LAY,< MOVEM T,SAVPPN >
MOVE T,DPCEXT
NOLAY,< MOVEM T,LSTEXT >
LAY,< MOVEM T,SAVEXT >
JRST FILEUP
>;NOIII
>;NODEC
IFN DECSW!IIISW,<
MOVEI T,STRT
HRRM T,.JBSA
POPJ P,
>;IFN DECSW!IIISW
;ESAVE, EWRITE, SETSM, SETWM, MAKEWD
NODEC,<
NOIII,<
ESAVE: MOVE T,AUTOSM
MOVEM T,AUTOSN ;UPDATE AUTO-SAVE COUNTER
LAY,< SKIPN T,SAVNAM >
NOLAY,< SKIPN T,LSTNAM >
JRST [ OUTSTR[ASCIZ/NO REMEMBERED NAME AT ESAVE!
/]
POPJ P,]
MOVEM T,FILNAM
SETOM THEREXISTS
MOVSI T,EXTSAV
MOVEM T,FILEXT
SETZB T,FILDAT
LAY,< MOVE T,SAVPPN >
NOLAY,< MOVE T,LSTPPN >
MOVEM T,FILPPN
JRST ESAVEM
SETSM: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NUMBER OF COMMANDS BETWEEN ESAVES?/]
PUSHJ P,READNC
MOVEM T,AUTOSM
MOVEM T,AUTOSN
POPJ P,
CLRSM: SETZM AUTOSM
POPJ P,
>;NOIII
>;NODEC
SETWM: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NUMBER OF COMMANDS BETWEEN EWRITES?/]
PUSHJ P,READNC
MOVEM T,AUTOWM
MOVEM T,AUTOWN
POPJ P,
CLRWM: SETZM AUTOWM
POPJ P,
MAKWIR: MOVEI T,BODM
PUSHJ P,CHNGMD
PUSHJ P,XCLEAR
OUTSTR[ASCIZ/BODY MODE, CLEAR.
/]
MOVEM P,PERRSAV
MOVSI T,EXTFIL
PUSHJ P,SETNAM
POPJ P,
INIT DAT,17
'DSK '
0
JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!
/]
POPJ P,]
MOVSI G,EXTWIR
EXCH G,FILEXT
SETZ H,
DSKPPN H, ;WILL WRITE 'WD' FILE ON CURRENT AREA
EXCH H,FILPPN
OUTSTR[ASCIZ/READING DATE FROM /]
MOVEI A,FILNAM
JSR FPRINT
MOVE T,FILPPN
LOOKUP DAT,FILNAM
JRST [ HRRZ TT,FILEXT
JUMPN TT,LOOKRR
SETZM FILDAT
JRST MAKWR1]
DEC,< JSR DAT,LOOKCK >
NODEC,< MOVEM T,FILPPN >
MAKWR1: OUTSTR[ASCIZ/
/]
MOVE T,FILDAT
LDB TT,[POINT 3,FILEXT,20]
DPB TT,[POINT 6,T,23]
HRLZM T,WIRDAT
LDB T,[POINT 11,FILDAT,23]
HRRM T,WIRDAT
MOVEM G,FILEXT
MOVEM H,FILPPN
RELEASE DAT,
TLZ M,TYPREP!TYPNLY
PUSHJ P,WIRENT
SKIPN LSTNAM
POPJ P, ;LOST, OR WD FILE NOT NEEDED
JRST EWLIST
;REENTER CODE
%R: MOVEM T,RSAVET ;SAVE T HERE FOR NOW!
DEC,<
NOGT,<
MOVEI T,0
SETUWP T, ;UNWRITEPROTECT THE HIGH SEGMENT
JFCL
>;NOGT
>;DEC
MOVE T,P ;SAVE STACK HERE A SEC
MOVE P,[IOWD SPPDSZ,SPPDL] ;NOW GET A GOOD ONE (IN CASE OF PDLOV)
PUSH P,T ;NOW SAVE STACK ON STACK
OUTSTR [ASCIZ /
IF YOU TYPE "N", THE PROGRAM WILL BE CONTINUED WHERE IT LEFT OFF.
YOU WILL BE GIVEN A CHANCE TO STOP MACROS CURRENTLY BEING EXECUTED.
IF YOU TYPE "Y", THE PROGRAM WILL BE STARTED IN THE COMMAND LOOP, AND
ALL MACROS CURRENTLY BEING EXECUTED WILL BE STOPPED.
NOTE: TYPING "Y" HAS A FINITE PROBABILITY OF MUNGING THE DATA STRUCTURE.
TYPE "Y" OR "N"? /]
PUSHJ P,TTYORN
CAIA
JRST REINIT
POP P,P ;NOT RESTARTING, ASSUME STACK GOOD
MOVE T,RSAVET
PUSHJ P,PUSHIT
OUTSTR[ASCIZ/FLUSH MACROS IN PROGRESS? /]
PUSHJ P,TTYORN
CAIA
PUSHJ P,ABMAC
NODEC,< PUSHJ P,DCLAIM > ;RE-SETUP DISPLAY STUFF
PUSHJ P,POPIT
R: JRST @.JBOPC
TTYORN: TTYUUO 4,T
PUSH P,T
TTYRN1: TTYUUO 4,T
CAIE T,12 ;GOBBLE TO END OF LINE
JRST TTYRN1
POP P,T
CAIE T,"Y"+40
CAIN T,"Y"
AOS (P)
POPJ P,
MPC,<
GOTPNT: FETCHL(SID,T,PBIT)
TLZ SID,777777-FRONT
POPJ P,
>;MPC
REINIT: MOVE P,[IOWD PDLEN,PDL] ;REQUESTING PSEUDO START
MOVE 0,SAVER0
TRO MCHG!NEEDCL
MOVE M,SAVERM
SETZM DSKOPN
RELEASE ODSK, ;GIVE LOG FILE A CHANCE TO BE RESTARTED
PUSHJ P,ABMAC ;FLUSH MACROES
DEC,< PUSHJ P,DECGO >
PUSHJ P,DCLAIM
DEC,< PUSHJ P,LOGINI >
PUSHJ P,RCHNGM ;RESTORE OMODE
MPC,< SETZ SID,
SKIPE T,PONPNT
PUSHJ P,GOTPNT
TLC SID,FRONT
SKIPE T,PONPN2
PUSHJ P,GOTPNT
TLC SID,FRONT
>;MPC
JRST MAIN
SUBTTL FREE STORAGE ROUTINES
;An appeal for more core....
DEFINE DOCORE(AC,FAIL)
<
III,< PUSH P,AC
MOVEI AC,1
UNLOK. AC,
JFCL
POP P,AC
>;III
NOTWO,< CORE AC, >
TWO,< CORE2 AC, >
JRST [ JSR NOCORE
JRST FAIL]
III,< MOVEI AC,1
LOCK AC,
JFCL
>;III
>;docore
;Get core for old style free storage - 2 wd blocks
NOFSTA: MOVEM A,SAVEA
MOVEM B,SAVEB
NOFST3: GETREL A
ADDI A,1
MOVEM A,FSTPNT
ADDI A,1777
VB10,< MOVSI A,(A)>
DOCORE(A,NOFST3) ;get a coreblock
;build free list to end of new block
MOVE A,FSTPNT
GETREL B
NOFST1: ADDI A,2
CAIG A,(B)
JRST [ HRRZM A,-2(A)
JRST NOFST1]
HRLI A,[0]
HLRZM A,-2(A) ;LINK END OF LIST TO 0
SOS NOFST
SOS NOFST
MOVE B,SAVEB
MOVE A,SAVEA
JRST @NOFST
;NOBLK - GET FREE STORAGE BLOCK
; SKIPN AC,@BLKPNT+SIZE
; JSR NOBLK
; EXCH AC,BLKPNT+SIZE
COMMENT 
BLOCK STORAGE IS ALLOCATED SEQUENTIALLY OUT OF A 1K FREE AREA
_________________
! !
! used !
BLKTOP -------------> ! ------------- ! ----
! !
! FREE ! BLKFRE WORDS
! !
! !
! ! 
----------------- ----
A NEW 1K IS ADDED IF THE BLOCK SIZE WON'T FIT, BUT IT IS
TACKED ON THE END OF THE OLD 1K IF THE OLD 1K WAS AT THE TOP
OF FREE CORE.

NOBLKA: MOVEM A,SAVEA
MOVEM B,SAVEB
NOBLK2: HRRZ B,@NOBLK ;GET PTR INTO BLK TABLE
HRRZ A,BLKFRE ;# FREE WORDS LEFT IN THIS GULP
CAIL A,-BLKPNT(B) ;BIG ENOUGH FOR BLOCK?
JRST NOBOK ;YES
NOBLK1: GETREL A ;HIGH PTR
MOVE B,A
XOR B,BLKTOP ;CURRENTLY ALLOCATING RIGHT AT TOP?
TRNE B,-2000
SETZM BLKFRE ;NO, START NEW GULP
ADDI A,1
MOVE B,A ;SAVE LOCN OF NEW 1K
DOCORE(A,NOBLK1) ;Get a coreblock from system
SKIPN BLKFRE ;ADDING ON TO OLD BLK?
MOVEM B,BLKTOP ;NO, START FROM BEGINNING OF NEW 1K THEN
MOVEI A,2000 ;WE GOT 2000 NEW WORDS
ADDM A,BLKFRE
JRST NOBLK2 ;TRY AGAIN
NOBOK: MOVE A,BLKTOP ;PTR TO ADDED BLOCK
EXCH A,(B) ;PUT IT ON FREE LIST(SIZE)
HRRZM A,@(B) ;PUT BACK [0] AT END
MOVEI A,-BLKPNT(B) ;LENGTH OF BLOCK
ADDM A,BLKTOP ;CONSUME STORAGE
MOVNS A
ADDM A,BLKFRE
MOVE B,SAVEB
MOVE A,SAVEA
SOS NOBLK
SOS NOBLK
JRST @NOBLK
BLKINI: MOVEI T,[0] ;INITIALIZE FREE LISTS TO NULL
MOVEM T,BLKPNT
MOVE T,[BLKPNT,,BLKPNT+1]
BLT T,BLKPNT+FSTLEN
SETZM BLKFRE ;NO FREE SPACE FOR BLOCKS
SETOM BLKTOP ;NOT CURRENTLY ALLOCATING IN ANY BLOCK
POPJ P,
;SWITCH, UNSCAL
MPC,<
%SWITCH:MOVE T,PONPNT
EXCH T,PONPN2
MOVEM T,PONPNT
TLC SID,400000
MOVSS BARLST
POPJ P,
>;MPC
;convert from III points to internal points
;(internal coords are shifted 1 - the low bit is 0)
%UNSCAL:
PUSH P,TT
PUSH P,TTT
MPC,< ASH T,4 > ;Nscale 8 is 1:1
MD,< ASH T,2 > ;Nscale 2 is 1:1
IDIV T,NSCALE
LSH TT,1
MOVM TTT,TT
HLLE TT,TT ;IF NEG, -1
TRO TT,1 ;+1 OR -1
CAML TTT,NSCALE ;GREATER OR EQUAL TO HALF NSCALE?
ADD T,TT ;YES, FUDGE BY ONE IN PROPER DIRECTION
TRZ T,1
POP P,TTT
POP P,TT
POPJ P,
PERRET:
TLNN M,MACACT
OUTSTR[ASCIZ/???
/]
LERRET: PUSHJ P,COMCLR ;IN CASE IN ALTER MODE
TLNE M,MACACT
POPJ P, ;MACRO USERS TAKE THEIR CHANCES
TLC M,DSKACT!DSKFLG
TLCE M,DSKACT!DSKFLG ;BOTH DISK INPUT AND ACTIVE?
POPJ P, ;NO
OUTSTR[ASCIZ/DUE TO ERROR, /]
JRST IBREAK
NODEC,<
%UUOCON:MOVEM T,UUOSAV
DBG,< MOVEM G,UUOG >
LDB T,[POINT 9,UUO,8]
CAIL T,UUO2-UUO1
MOVEI T,0
MOVE T,(T)[
UUO1: BADUUO
PTBYT
PTSTR
DBG,< AFETCH
AFETL
ASTORE
ASTORL
ACLEAR
ARETBL
>;DBG
NODBG,< BADUUO  BADUUO  BADUUO  BADUUO  BADUUO
BADUUO
>;NODBG
III,< LHYADD ;Leahy display - append
LHYIOT ; 0=clr, 7=chrsize pp, 6=ypos
LHYOUT ;output display list
>;III
UUO2: ]
EXCH T,UUOSAV
JRST @UUOSAV
BADUUO: OUTSTR [ASCIZ/ILLEGAL UUO PERFORMED!! /]
HALT CPOPJ
>;NODEC
PTBYT: PUSH P,TTT
HRRZ TTT,UUO
XCT PUTCHR
POP P,TTT
POPJ P,
PTSTR: PUSH P,TTT
PUSH P,T
HRRZ T,UUO
TLOA T,(<POINT 7,0>)
PTSTRL: XCT PUTCHR
ILDB TTT,T
JUMPN TTT,PTSTRL
POP P,T
POP P,TTT
POPJ P,
;DEBUGING CHECKERS
COMMENT 
FETCH, STORES, CLEARS, are turned into UUOs for
debug mode.
.FETCH AC,<"index AC">+<element-index>
The element index points into ELEMxx tables to
define the displacment within the structure and
the fetch code.
The fetch code specifies where element is in word,
and whether sign extension is desired.

DBG,<
STORAGE(IMPURE)
UUOG: 0
UUOTEM: 0
UUOHLT: 0
SUUO: 0
STORAGE(PURE)
AFETCH: MOVEI G,[HLRZ HLRE HRRZ HRRE MOVE]
JRST UUOCOM
AFETL: MOVEI G,[HLLZ HLLE HRLZ HRLE 0]
JRST UUOCOM
ASTORE: HRROI G,[HRLM HRLM HRRM HRRM MOVEM]
JRST UUOCOM
ASTORL: HRROI G,[HLLM HLLM HLRM HLRM 0]
JRST UUOCOM
ACLEAR: HRROI G,[HRRZS HRRZS HLLZS HLLZS SETZM]
UUOCOM: PUSHJ P,PUSHIT ;SAVE ALL THE AC'S
MOVEM A,UUOTEM
MOVE A,UUO
MOVEM A,SUUO
LDB A,[140600,,A] ;"SOURCE" AC FIELD
DPB A,[220400,,UUO] ; TO INDEX
EXCH A,UUOTEM
EXCH G,UUOG
HRRZ F,@UUOTEM ;F = STRUCTURE BLOCK
EXCH G,UUOG ;G = INST TYPE
LDB H,[1400,,UUO] ;THE ELEMENT INDEX
CAIL H,MAXELM
PUSHJ P,FUCKUP
HLRZ A,ELEMTB(H) ;WHERE
ADD G,A
LDB A,[331100,,(G)] ;THE OPCODE
DPB A,[331100,,UUO]
HRRZ A,ELEMTB(H)
HRRM A,UUO
HRRZ G,.JBREL ;LEGAL POINTER INTO LOW CORE?
SKIPLE F
CAMGE F,G
JRST UUAOK
HRRZ G,.JBHRL ;MAYBE POINTER IN HIGH SEG?
CAILE F,400000 ; (CAN'T BE 1ST WORD OF HI SEG EITHER)
CAML F,G
JRST [ TLO F,400000 ;FLAG THAT IT WAS ILLEGAL POINTER
JRST TROUB2]
UUAOK: MOVE A,-1(F) ;THE TYPE OF STRUC WE'RE ADDRESSING
CAME A,ELEMBL(H) ;RIGHT FOR THIS ELEM?
JRST TROUBL
UUOOK: PUSHJ P,POPIT
MOVE G,UUOG
XCT UUO
POPJ P,
TROUBL: PUSHJ P,TRBPNT ;POINT <=> BPOINT INTERCHANGABLE
CAIA
JRST UUOOK
TROUB1: MOVE A,ELEMBL(H) ;Q'S CAN BE USED TO REFERENCE ALMOST ANYTHING
CAMN A,['QOMMON']
JRST UUOOK
;Some fetches may be offset by RADDR(...), so check to
;see if the thing pointed to might be the right type (or null)
MOVSI T,-MAXRDR
TROUB4: CAME H,RADDRT(T) ;IS THIS AN ELEM WHICH COULD BE FUNNY?
AOBJN T,.-1
JUMPGE T,TROUB2
MOVE TT,F
ADD TT,RADRV2(T) ;OFFSET INTO OTHER STRUC
HRRZ TTT,RADRNM(T)
CAIL TTT,MAXELM
JRST [ CAME TT,TTT ;EXACTLY THAT POINTER?
JRST TROUB5
JRST UUOOK]
MOVE TTT,ELEMBL(TTT) ;THE OTHER STRUC'S NAME
CAMN TTT,-1(TT)
JRST UUOOK
TROUB5: AOBJN T,TROUB4
TROUB2: OUTSTR [ASCIZ /
Illegal /]
LDB A,[331100,,SUUO]
OUTSTR @FETNAM-<<.FETCH>-=27>(A)
OUTCHR ["("]
OUTSTR @ELEMNM(H)
OUTSTR [ASCIZ /) of a /]
SKIPG F ;LEGAL POINTER ADDRESS?
JRST [ OUTSTR [ASCIZ /?/]
JRST TROUB3]
MOVE TTT,-1(F)
JSP T,.SIXP
TROUB3: OUTSTR [ASCIZ /...Continue(Y,N,alt)/]
PUSHJ P,YORNTT
JRST ERRET
AOSA UUOHLT
SETZM UUOHLT
PUSHJ P,POPIT
MOVE G,UUOG
SKIPE UUOHLT
HALT .+1
XCT UUO
POPJ P,
TRBPNT: CAME A,['BPOINT'] ;WE CAN REFER TO BPOINTS AS POINTS
POPJ P,
MOVE A,ELEMBL(H)
CAMN A,['POINT ']
AOS (P)
POPJ P,
FETNAM: FOR I IN (.FETCH,.FETL,.STORE,.STORL,.CLEAR)
< [ASCIZ /I/]
>
DEFINE FOOS
< FOO(PNXT,PONPNT)
FOO(BPNXT,PONPNT)
FOO(TNXT,BODPNT)
FOO(BNXT,DBODPN)
FOO(TPNX,,TPIN)
FOO(BPLNK,,BLNK)
FOO(BPBIT,,PBIT) ;CAN REFER TO PBIT'S AS BPBITs
FOO(TCSTR,,TXVAL) ;2ND HALF OF PROP/TEXT BLOCKS CAN LOOK LIKE OFFSET
FOO(TCXY,,TXOFF)
FOO(TCX,,TXOX)
FOO(TCY,,TXOY)
MPC,< FOO(PNXT,PONPN2)
FOO(BPNXT,PONPN2)
>
MD,< FOO(GNXT,GETLST)
FOO(QNXT,,TLIN)
FOO(TPNX,PINS)
FOO(DPNXT,,DDNXT)
FOO(TXNXT,,BTXT)
FOO(TXNXT,BTEXT)
FOO(TLIB,,SLIB) ;SHORT FORM OF TYPE
FOO(TNAM,,SNAM)
FOO(TYP1,,SYP1)
FOO(TNXT,,SNXT)
>;MD
REPEAT 10,<-1 ;ROOM FOR SOME PATCHES
>
>
DEFINE FOO $ (ELEM,POINTER,ELEM2)
< U.$ELEM
>
RADDRT: FOOS
MAXRDR__.-RADDRT
DEFINE FOO $ (ELEM,POINTER,ELEM2)
< V.$ELEM-IFDIF<ELEM2><><V.$ELEM2;>0
>
RADRV2: FOOS
DEFINE FOO $ (ELEM,POINTER,ELEM2)
< IFDIF <POINTER><><POINTER;>U.$ELEM2
>
RADRNM: FOOS
ARETBL: PUSHJ P,PUSHIT
MOVEM A,UUOTEM
LDB A,[270400,,UUO]
EXCH A,UUOTEM
HRRZ F,@UUOTEM ;POINTER TO BLOCK
HRRZ H,UUO ;BLOCK TYPE#
GETREL G
SKIPLE F
CAML F,G
JRST ARETB1
MOVE A,-1(F)
CAMN A,SURNAM(H) ;RETURNING WHAT WE CLAIM?
JRST ARETOK
MOVSI T,-MAXSUR ;NO, BUT MAYBE SAME LENGTH BLK
CAME A,SURNAM(T) ; (THIS COVERS VARIOUS CASES THAT WEREN'T FIXED)
AOBJN T,.-1
JUMPGE T,ARETB1
HRRZ A,SURLEN(T)
CAMN A,SURLEN(H)
JRST ARETOK
ARETB1: OUTSTR [ASCIZ /
Illegal return of /]
SKIPLE
CAML F,G
SKIPA TTT,['?']
MOVE TTT,-1(F)
JSP T,.SIXP
OUTSTR [ASCIZ / as /]
MOVE TTT,SURNAM(H)
JSP T,.SIXP
OUTSTR [ASCIZ /...Continue(Y,N,alt)/]
PUSHJ P,YORNTT
JRST ERRET
HALT .+1
ARETOK: HRRZ A,SURLEN(H)
MOVEI F,-1(F)
EXCH F,BLKPNT+1(A) ;1 WD EXTRA FOR SUR'S NAME
HRRZM F,@BLKPNT+1(A)
PUSHJ P,POPIT
POPJ P,
>;DBG
;TXTMAT, SIGMAT, SIGMAA
;TXTMAT - MATCH TEXT STRINGS (TEXSTR) A,B
TXTMAT: MOVE T,1(B) ;GET NEXT WORD OF TEXT
CAME T,1(A) ;COMPARE IT WITH OTHER STRING
POPJ P, ;DIFFERENT, NO MATCH
HRRZ A,(A) ;GO TO NEXT WORD
HRRZ B,(B) ;...
JUMPE A,[JUMPN B,CPOPJ ;IF A ENDS AND B DOESN'T, NO MATCH
AOS(P) ;IF BOTH END, MATCH
POPJ P,]
JUMPN B,TXTMAT ;IF NEITHER ENDS, LOOP
POPJ P, ;IF B ENDS AND A DOESN'T, NO MATCH
;TXTCMP - ALPHA COMPARE FOR GREATER,LESS
;A,B - STRINGS IN TEXSTR FORMAT
;SKIPS A .GE. B
TXTCMP: LDB T,[POINT 35,1(A),34] ;FLUSH LOW BIT, AND NO SIGN BIT FOR COMPARE
LDB TT,[POINT 35,1(B),34]
CAMGE T,TT ;A .GE. B?
POPJ P, ;NO
CAME T,TT
JRST CPOPJ1 ;A .GT. B
HRRZ A,(A) ;GO TO NEXT WORD
HRRZ B,(B) ;...
JUMPE A,[JUMPN B,CPOPJ ;IF A ENDS AND B DOESN'T, A IS .LT.
JRST CPOPJ1] ;IF BOTH END, A .EQ. B
JUMPN B,TXTCMP ;IF NEITHER ENDS, LOOP
JRST CPOPJ1 ;B ENDS AND A DOESN'T, A .GT. B
IFN 0,<
NODEC,<
SIGMAT: ADD A,[POINT 7,1]
ADD B,[POINT 7,1]
LDB T,[POINT 14,(A),13]
CAIE T,""
CAIN T,""
SUB A,[160000,,0]
LDB T,[POINT 14,(B),13]
CAIE T,""
CAIN T,""
SUB B,[160000,,0]
PUSHJ P,GETITA
JRST CKENDB
CAIN T,""
MOVEI T,""
MOVE TT,T
PUSHJ P,GETITB
POPJ P,
CAIN T,""
MOVEI T,""
JRST SIGMA2
SIGMA1: PUSHJ P,GETITA
JRST [CKENDB:PUSHJ P,GETITB
AOS (P) ;ENDS ALSO, MATCH
POPJ P,]
MOVE TT,T
PUSHJ P,GETITB
POPJ P, ;A DIDN'T END, NO MATCH
SIGMA2: CAME T,TT
POPJ P,
JRST SIGMA1
>;NODEC
GETITA: TLNN A,760000
JRST [ HRR A,-1(A)
TRNN A,-1
POPJ P,
JRST .+1]
ILDB T,A
JUMPE T,GETITA
NODEC,< TRNE M,SPACES ;ARE SPACES SIGNIFICANT?
JRST SIGCHR ;YES
CAIE T,DBLARR
CAIN T," "
JRST GETITA
JRST SIGCHR
GETITB: TLNN B,760000
JRST [ HRR B,-1(B)
TRNN B,-1
POPJ P,
JRST .+1]
ILDB T,B
JUMPE T,GETITB
TRNE M,SPACES
JRST SIGCHR
CAIE T," "
CAIN T,DBLARR
JRST GETITB
SIGCHR:
>;NODEC
DEC,< CAIN T,11 ;FLUSH TABS
JRST GETITA
>;DEC
CAIL T,"a" ;CONVERT LOWER CASE TO UPPER CASE
CAILE T,"z"
CAIA
SUBI T,40
CAIE T,";" ;THIS IS THE COMMENT CHAR
AOS (P)
POPJ P,
>;IFN 0
;COMPARE SIGNAMES FOR EQV
;A = BYTE POINTER TO FIRST WORD OF STRING (TEXSTR TYPE)
;B = POINTER TO ASCIZ
SIGMAT: SETZM VARLST ;NO VARS
PUSH P,D
PUSH P,C
PUSH P,B
PUSHJ P,PERMUT
POP P,TT
POP P,C
POP P,D
MOVEI T,CMPWRD
PUSHJ P,ALPHA
POPJ P,
POPJ P,
JRST CPOPJ1
JRST CPOPJ1
JRST CPOPJ2
;CHANGE ONE SIGNAL NAME TO ANOTHER PERVASIVELY
MD,<
SIGCHG: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/OLD SIGNAL NAME?
/]
PUSHJ P,TREADC
POPJ P, ;ALTMODE
POPJ P, ;NULL
PUSH P,B
MOVE A,B
ADD A,[POINT 7,1]
PUSHJ P,SIGMAA ;PERPARE OLD NAME FOR SEARCHING
POP P,B
PUSHJ P,PUTFS
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW SIGNAL NAME?
/]
PUSHJ P,TREADC
POPJ P,
POPJ P,
MOVEM B,DX1
SKIPE E,PONPNT
PUSHJ P,ACLRP ;CLEAR ALL THE "FOUNDP" BITS
SETZM FIND
MOVSI C,17
SKIPE A,PONPNT
PUSHJ P,CLRBTS ;CLEAR MARK BITS
SKIPE H,PONPNT
PUSHJ P,SIGCDO
MOVE T,FIND
MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R
JUMPE T,.+2
SETOM FIND
SKIPN T,FNDNUM
JRST [ OUTSTR[ASCIZ/NO/]
JRST SIGCHF]
PUSHJ P,DECOUT
SIGCHF: OUTSTR[ASCIZ/ SIGNAL NAME/]
MOVE T,FNDNUM
CAIE T,1
OUTCHR["S"]
OUTSTR[ASCIZ/ CHANGED.
/]
MOVE B,DX1
JRST PUTFS
;SIGCDO: CALLING SEQUENCE
; <STRING TO FIND IN A>
; ADD A,[POINT 7,1]
; PUSHJ P,SIGMAA
; <NEW SIG IN DX1>
; SKIPE H,PONPNT
; PUSHJ P,SIGCDO
; <RETURNS HERE ALWAYS>
; <FIND AOS'D ONCE FOR EACH SIGNAL CHANGED>
SIGCDO: FETCHL(T,H,PBIT)
TLNE T,1
JRST SIGCH2 ;ALREADY DONE
FETCH(G,H,PTXT)
JUMPE G,SIGCH2
FETCH(A,G,TCSTR)
ADD A,[POINT 7,1]
MOVEI B,SIGTAB
PUSHJ P,SIGMAT
JRST SIGCH2 ;NO MATCH
JFCL ;EQUIVALENT IS OK
AOS FIND
SETBIT(FOUNDP!1,T,H,PBIT)
FETCH(A,G,TCSTR)
ADD A,[POINT 7,1]
PUSHJ P,PERME1 ;EXTRACT LEADING STUFF
MOVE T,POLAR ;GET OLD POLARITY
MOVEM T,OPOLAR ;AND SAVE HERE FOR PERMES
PUSH P,PUTCHR
PUSHJ P,SETTT7
PUSH P,A
PUSHJ P,SIGCHX ;Copy leading stuff into new string
MOVE A,DX1
ADD A,[POINT 7,1]
PUSHJ P,PERMES ;EXTRACT NEW SIGNAL NAME (POSSIBLY CHANGING POLARITY)
PUSHJ P,SIGCHX
FETCH(A,G,TCSTR)
ADD A,[POINT 7,1]
PUSHJ P,PERME2 ;NOW GET TRAILER
PUSHJ P,SIGCHX
FETCH(B,G,TCSTR)
FETCH(TT,B,TSSIZ)
PUSHJ P,PUTFS
POP P,A
STORE(TT,A,TSSIZ)
STORE(A,G,TCSTR)
POP P,PUTCHR
TRO MCHG
SKIPE ADDR(A,TSASC)
JRST SIGCH6
MOVE A,H
PUSHJ P,PTKIL1 ;FLUSH NULL TEXT
JRST SIGCH2
SIGCH6: MOVE A,H
PUSHJ P,FIXEM
SIGCH2: HRRZ H,(H)
JUMPN H,SIGCDO
POPJ P,
SIGCHX: SKIPA A,[POINT 7,ESGTAB]
SIGCHY: PUTBYT (C)
ILDB C,A
JUMPN C,SIGCHY
POPJ P,
>;MD
;PUTFS
PUTFS: JUMPE B,CPOPJ
PUSH P,T
PUTFS1: HRRZ T,(B) ;GET LINK TO NEXT
FSTRET (B)
JUMPE T,POPTJ
HRRZ B,(T)
FSTRET (T)
JUMPN B,PUTFS1 ;IF NON-ZERO LINK, LOOP
POPTJ: POP P,T
POPJ P,
;READ NUMBER INTO T
SREADN: MOVEI T,0
PUSHJ P,GETLIN
CAIE C,"-"
JRST RNLOP1
PUSHJ P,READN
MOVN T,T ;GIVE HIM NEGATIVE
POPJ P,
;TO BE CALLED TO SCAN A SINGLE NUMBER WHICH SHOULD
;END WITH LF, CALL ONLY AT TOP LEVEL (WILL POP POPJ ON ERROR)
READNC: PUSHJ P,READN
CAIN C,12
POPJ P,
POP P,(P) ;LOSE THE RETURN
JRST INNERR ;AND JUMP TO INPUT ERROR ROUTINE
CREADN: SETZ T,
JRST RNLOP1
READN: MOVEI T,
RNLOP: PUSHJ P,GETLIN ;GET A CHR.
RNLOP1: PUSH P,[=10]
CAIE C,"'"
JRST RNLOP3
MOVEI C,10
MOVEM C,(P)
RNLOP2: PUSHJ P,GETLIN
RNLOP3: CAIL C,"0" ;IS IT A DIGIT?
CAILE C,"9" ;???
JRST [ POP P,(P);NO
POPJ P,]
IMUL T,(P) ;YES, MULT BY PROPER AMOUNT
ADDI T,-60(C) ;ADD IN NEW THING
AOS NDIG ;COUNT A DIGIT
JRST RNLOP2
;READ TEXT STRING, LOOK FOR SIZE SPEC
;RETURNS
;B = TEXT STRING
;T,TEXSIZ = TEXT SIZE (-1 IF NONE)
;TT,TEXLIN = #LINES,,MAX LINE LENGTH
TXREAD: GETBLK(B,TEXSTR)
PUSH P,B ;SAVE POINTER TO BEGINNING OF STRING
CLEAR(B,TSASC) ;CLEAR BYTE WORD
ADD B,[POINT 7,1]
SETZB TT,TTT ;ZERO COUNTERS
MOVNI T,1 ;FLAG NO SIZE TYPED YET
PUSHJ P,GETLIN ;GET FIRST CHR.
ANDI C,177
CAIE C,"\" ;\?
JRST BLOPP ;NO
PUSHJ P,READSZ ;GET SIZE STUFF INTO T
CAIA
JRST BLOP
MOVNI T,1 ;ERROR, FLAG AS IF NONE TYPED
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/ILLEGAL TEXT SIZE, WILL MAKE BELIEVE NONE WAS TYPED.
/]
BLOP: PUSHJ P,GETLIN ;GET NEXT CHR OF NAME
ANDI C,177
BLOPP: CAIE C,ALTMOD ;QUIT ON ALTMODE ALSO
CAIN C,12 ;DONE (LINE FEED)
JRST BDON
CAIE C,DBLARR ;END OF LINE?
AOJA TTT,BLOPCR ;NO, COUNT CHAR
ADD TT,[1,,0] ;COUNT ANOTHER LINE
CAILE TTT,(TT) ;THIS LINE LONGEST SO FAR?
HRR TT,TTT ;YES
SETZ TTT, ;RESET LINE LENGTH COUNT
BLOPCR: TLNE B,760000 ;END OF WORD?
JRST BPNT1
GETBLK(D,TEXSTR)
CLEAR(D,TSASC)
HRRZM D,-1(B)
HRR B,D
BPNT1: IDPB C,B
JRST BLOP
BDON: CAILE TTT,(TT) ;LAST LINE LONGEST?
HRR TT,TTT ;YES
MOVEM T,TEXSIZ
MOVEM TT,TEXLIN
SETZM -1(B) ;CLEAR LAST POINTER
POP P,B ;GET POINTER TO FRONT OF STRING
POPJ P,
;READSZ - GET INITIAL SIZE SPEC ON TEXT INPUT
READSZ: PUSHJ P,GETLIN ;YES, GET SIZE
ANDI C,177
SETZ T, ;ASSUME HORIZONTAL
CAIE C,"V" ;IS HE ASKING FOR VERTICAL?
JRST NOVERT ;NO
PUSHJ P,GETLIN
ANDI C,177
MOVEI T,400000 ;MARK AS VERTICAL
NOVERT: SUBI C,60 ;NORMALIZE NUMBER
JUMPL C,CPOPJ ;TOO SMALL?
IOR T,C ;MAKE SIZE
CAIG C,CSIZES ;OR TOO BIG?
AOS (P)
POPJ P, ;ERROR RETURN
;READ TEXT
;B = POINTER TO TEXT
;TREADU,TREADC
;RETURN
; 1 $ TYPED
; 2 NULL INPUT
; 3 OK
;TREADU,TREADV CONVERT TO UPPER CASE
TREADU: PUSHJ P,TREADV
CAIA
TREADC: PUSHJ P,TREAD
CAIN C,ALTMOD ;END WITH ALTMODE?
JRST PUTFS ;YES, GIVE BACK STRING AND DIRECT RETURN
AOS (P) ;AT LEAST ONE SKIP
SKIPE 1(B) ;NULL?
AOSA (P) ;NO, ANOTHER SKIP
JRST PUTFS ;YES, GIVE IT BACK
POPJ P,
TREADV: SETOM LOW2UP
CAIA
TREAD: SETZM LOW2UP
GETBLK(B,TEXSTR)
CLEAR(B,TSASC)
PUSH P,B
ADD B,[POINT 7,1]
TREADA: PUSHJ P,GETLIN
CAIE C,ALTMOD
CAIN C,12
JRST TREDON
TLNE B,760000
JRST TREADG
GETBLK(T,TEXSTR)
CLEAR(T,TSASC)
HRRZM T,-1(B)
HRR B,T
TREADG: SKIPN LOW2UP
JRST TREADL
CAIL C,"A"+40
CAILE C,"Z"+40
CAIA
SUBI C,40
TREADL: IDPB C,B
JRST TREADA
TREDON: SETZM -1(B) ;CLEAR LAST POINTER
POP P,B ;GET POINTER TO FRONT OF STRING
POPJ P,
SCARF: CAIN C,12
AOSA (P)
CAIN C,ALTMOD
POPJ P,
PUSHJ P,GETLIN
JRST SCARF
INNERR: PUSHJ P,SCARF
JRST LERRET
OUTSTR[ASCIZ/INPUT ERROR!
/]
JRST LERRET
;LOOKUP A SIGNAL IN WIRLST, AND FLASH IT!
XFLASH: SKIPN B,BLPNTR
POPJ P,
PUSHJ P,PUTFS
SETZM BLPNTR
IFN UMLSW!LAYSW,<
MPC,< SETZM UPINS >
>;IFN UMLSW!LAYSW
TRO MCHG
POPJ P,
NOUML,<
LOKSIG: JRST PERRET
>;NOUML
UML,<
LOOKN: SKIPN A,WIRLST
JRST NOWIRL
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/WIRE NUMBER FROM WFAIL.DAT FILE?/]
PUSHJ P,READNC
MOVE C,A
SETZM DX1
LOOKN0: AOS DX1
SOJLE T,LOOKN1
HRRZ C,(C)
JUMPN C,LOOKN0
OUTSTR[ASCIZ/NO SUCH WIRE!
/]
POPJ P,
LOKSIG: SKIPN WIRLST
JRST [NOWIRL: OUTSTR[ASCIZ/NO WIRES IN WIRLST!
/]
POPJ P,]
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/SIGNAL NAME TO LOOKUP?/]
PUSHJ P,TREADC
POPJ P, ;ALTMODE
POPJ P, ;NULL
PUSH P,B ;SAVE POINTER TO ORIG STRING
MOVE A,B
ADD A,[POINT 7,1]
PUSHJ P,SIGMAA ;MAKE COMPARE STRING
POP P,B
PUSHJ P,PUTFS ;GIVE BACK TYPED IN VERSION
PUSHJ P,LOOKIT ;LOOK IT UP
JRST LOKSGN ;NONE
LOOKN1: HRRZ B,1(C) ;GET WIRE POINTER
PUSHJ P,LSTSGO ;PRINT ALL THE NAMES
PUSH P,C
PUSHJ P,LINKST
POP P,C
HRRZ C,1(C) ;POINTER TO LIST OF PINS, ETC
POKSG1:
MPC,< HRRZ A,1(C) ;WILD CON STUFF IS HERE
ADDM A,UPINS
>;MPC
HLRZ A,(C) ;PIN POINTER
JUMPE A,POKSG2
PUSH P,C
PUSHJ P,LINKIT
POP P,C
POKSG2: HRRZ C,(C)
JUMPN C,POKSG1
PUSHJ P,LINKMK ;NOW MARK BAD GUYS
TRO MCHG ;GET IT ON
TLNN M,LCENTER
POPJ P,
JRST LCENMAK ;CENTER IT!
LOOKIT: MOVE C,WIRLST ;LOOK DOWN THE LIST
SETZM DX1
LOKSG3: HRRZ D,1(C)
AOS DX1
LOKSG1: HLRZ A,1(D)
JUMPE A,LOKSG2
ADD A,[POINT 7,1]
MOVEI B,SIGTAB
PUSHJ P,SIGMAT
JRST LOKSG2 ;NO MATCH
JFCL ;EQUIVALENT IS CLOSE ENOUGH
AOS (P)
POPJ P,
LOKSG2: HRRZ D,(D)
JUMPN D,LOKSG1
HRRZ C,(C)
JUMPN C,LOKSG3
POPJ P,
LOKSGN: OUTSTR[ASCIZ/NOT FOUND!
/]
POPJ P,
LSTSIG: SKIPN A,WIRLST
JRST NOWIRL
SETZM DX1
LSTSG1: HRRZ B,1(A)
AOS DX1
PUSHJ P,LSTSGO
HRRZ A,(A)
JUMPN A,LSTSG1
POPJ P,
;CALL (LSTSGO) WITH SINGLE WIRE POINTER IN B, AND DX1 = SIGNAL #
LSTSGO: MOVE T,DX1
PUSHJ P,DECOUT
LSTSG6: HLRZ T,1(B)
JUMPE T,LSTSG3
OUTCHR[11]
PUSHJ P,OUTTXT
LSTSG3: HRRZ B,(B)
JUMPN B,LSTSG6
MPC,< HRRZ T,1(A)
HRRZ T,1(T)
JUMPE T,LSTSG4
OUTCHR[11]
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ "WILD"/]
LSTSG4:
>;MPC
OUTSTR[ASCIZ/
/]
POPJ P,
MD,<
SHWERR: SOSL TT,%LAST ;COUNT DOWN AND PICKUP LAST GEN NAME
SKIPN C,WIRLST ;ANY WIRES?
JRST PERRET ;NO MORE
SOJL TT,LOOKN1
HRRZ C,(C)
JUMPN C,.-2
JRST SHWERR
>;MD
>;UML
;CURSOR MOVING
DEFINE MOV $ (SHFT,MOVT,ADDT)
< MOVSI TT,1
LSH TT,SHFT(A)
MPC,< IMUL TT,STPSIZ>
MOV$MOVT T,CURSE
ADDT T,TT
MOV$MOVT$M T,T
JRST SETPOS
>
MOVUP1: MOV (1,S,ADD)
MOVDN1: MOV (1,S,SUB)
MOVUP2: MOV (5,S,ADD)
MOVDN2: MOV (5,S,SUB)
MOVLF1:
MPC,< TRNE M,FLIP
JRST MOVRT3
>;MPC
MOVLF3: MOV (1,E,SUB)
MOVRT1:
MPC,< TRNE M,FLIP
JRST MOVLF3
>;MPC
MOVRT3: MOV (1,E,ADD)
MOVLF2:
MPC,< TRNE M,FLIP
JRST MOVRT4
>;MPC
MOVLF4: MOV (5,E,SUB)
MOVRT2:
MPC,< TRNE M,FLIP
JRST MOVLF4
>;MPC
MOVRT4: MOV (5,E,ADD)
;SET AND CLEAR FLAGS
STBOOP: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NUMBER OF SECONDS BEFORE BOOP?/]
PUSHJ P,READN
CAIE C,12
JRST INNERR
MOVEM T,BOOPCN
TIMER T,
MOVEM T,BOOPLR
POPJ P,
CLBOOP: SETZM BOOPCN
POPJ P,
MD,<
;SOCKET - FORCE PIN'S ON DRAWINGS TO BE ACTUAL SOCKET PINS, NOT BODY
STSOC: SETOM FORSOC
tro mchg
POPJ P,
CLRSOC: SETZM FORSOC
tro mchg
POPJ P,
>;MD
DEC,<
STTIME:
GT,< MOVE T,NBYTES
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ BYTES TRANSMITTED TO GT40 (/]
SKIPN OPTFLG
OUTSTR[ASCIZ/NON-/]
OUTSTR[ASCIZ/OPTIMIZED)
/]
>;GT
MOVE A,RTIME ;SAVE LAST RUNTIME
MOVE B,QTIME ;AND LAST RUN QUEUE TIME
MOVE C,DTIME ;AND LAST REAL TIME
PUSHJ P,CLTIME ;UPDATE CELLS
OUTSTR[ASCIZ/RTIME = /]
SUB A,RTIME
MOVN T,A
PUSHJ P,SECPNT ;PRINT SECONDS WITH 3 DECIMAL POINTS
OUTSTR[ASCIZ/, QTIME = /]
SUB B,QTIME
CAMLE B,A
MOVE B,A ;MAKE SURE QTIME.GE.RTIME (NEG)
MOVN T,B
PUSHJ P,SECPNT
OUTSTR[ASCIZ/, /]
IMULI A,=100
IDIV A,B
MOVE T,A ;THIS IS PERCENTAGE SERVICE
PUSHJ P,DECOUT
OUTSTR[ASCIZ/%
REALTIME = /]
SUB C,DTIME
MUL C,[-=24*=60*=60*=60] ;MAKE IT POSITIVE AND TICS
LSHC C,=18
MOVE T,C
PUSHJ P,SECPNT
OUTSTR[ASCIZ/
/]
POPJ P,
CLTIME: MOVE T,[-1,,4]
GETTAB T, ;GET RUNTIME
SETZ T,
MOVEM T,RTIME
MOVE T,[-1,,53] ;GET RUN QUEUE TIME
GETTAB T,
SETZ T,
MOVEM T,QTIME
MOVE T,[53,,11]
GETTAB T, ;GET UNIVERSAL DAY TIME
SETZ T,
MOVEM T,DTIME
GT,< SETZM NBYTES >
POPJ P,
SECPNT: IDIVI T,=60
HRLM TT,(P)
PUSHJ P,DECOUT
OUTCHR["."]
HLRZ T,(P)
IMULI T,=10
IDIVI T,=6 ;MAKE IT HUNDREDTHS
CAIGE T,=10
OUTCHR["0"]
JRST DECOUT
>;DEC
STINIT: TLZ NOINIT
POPJ P,
CLINIT: TLO NOINIT
POPJ P,
EXACTS: TROA M,SEXACT
EXACTC: TRZ M,SEXACT
POPJ P,
SETLC: SETOM LCFLAG
POPJ P,
CLRLC: SETZM LCFLAG
POPJ P,
SIDENT: TLON M,%IDENT
TRO MCHG!NEEDCL
POPJ P,
CIDENT: TLZE M,%IDENT
TRO MCHG!NEEDCL
POPJ P,
STLPPN: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/LIBRARY PPN?/]
NOCMU,<
NOITS,< PUSHJ P,GETPPN
JRST INNERR
CAIN C,12
JRST [ HRRZM T,LIBPPN
SETZ T,
DSKPPN T,
HLLM T,LIBPPN
POPJ P,]
CAIE C,","
JRST INNERR
MOVE B,T
PUSHJ P,GETPPN
JRST INNERR
CAIE C,12
JRST INNERR
HRLZM B,LIBPPN
HRRM T,LIBPPN
>;NOITS
>;NOCMU
ITS,< PUSHJ P,GETNAM
JUMPE T,INNERR
CAIE C,12
JRST INNERR
MOVEM T,LIBPPN
>;ITS
CMU,< SETZM PPNBUF ;CLEAR OUT A BUFFER FOR THE PPN
SETZM PPNBUF+1
SETZM PPNBUF+2
MOVE B,[POINT 7,PPNBUF]
MOVEI T,=13 ;13 CHARACTERS AT MOST!
CMUPP7: PUSHJ P,GETLIN ;GET A CHAR
JRST CMUPP9
CAIE C,15 ;IGNORE CR
CAIN C,40 ;AND SPACE
JRST CMUPP7
CAIN C,12 ;LF
JRST CMUPP9 ;YES, THAT'S ALL FOLKS.
CAIE C,"[" ;IGNORE [
CAIN C,"]" ;AND ]
JRST CMUPP7
CAIL C,"a" ;CONVERT LOWER CASE TO UPPER CASE
CAILE C,"z"
JRST .+2
SUBI C,40 ;CONVERT IT
CMUPP8: IDPB C,B
SOJGE T,CMUPP7 ;AND GO GET ANOTHER CHAR UNLES WE HAVE 13+1
JRST INNERR ;FUNNY, WE DIDN'T GET THERE IN 13 CHARACTERS!
CMUPP9: MOVE T,[XWD B,PPNBUF]
CMUDEC T, ;CONVERT THE PPN TO DEC FORMAT
JRST INNERR ;WHOOPS, BAD PPN
MOVEM A,LIBPPN
>;CMU
POPJ P,
CLLPPN:
MOVE T,[DATPPN]
MOVEM T,LIBPPN
POPJ P,
SETSPC: TRO M,SPACES
POPJ P,
CLRSPC: TRZ M,SPACES
POPJ P,
SETCNT: TLO M,LCENTER
JRST LCENMAK
CLRCNT: TLZ M,LCENTER
POPJ P,
SETLCA: TLON LOCATE
TRO NEEDCL
POPJ P,
CLRLCA: TLZE LOCATE
TRO NEEDCL
POPJ P,
NEWID: SETZM BID
SETOM OLDBID
SETZM PID
SETOM OLDPID
JRST REEID ;RE-ASSIGN ID FROM START!
LMACRO: SKIPN A,MDPNT ;GET DEFINED MACRO LIST POINTER
POPJ P,
TVOFF
OUTSTR[ASCIZ/
/]
LMAC1: HRRZ T,1(A)
PUSHJ P,OUTTXT
HLRZ T,(A)
TRNE T,MSAVE ;BEING SAVED?
OUTSTR[ASCIZ/ */];YES
OUTSTR[ASCIZ/
/]
HRRZ A,(A)
JUMPN A,LMAC1
TVON
POPJ P,
GETDDT: SKIPN T,.JBDDT
JRST [ OUTSTR[ASCIZ/NO DDT.....
/]
POPJ P,]
MOVE TT,[10000,,CPOPJ]
MOVEM TT,.JBOPC
JRST (T)
STBLCS: TLON M,BLOCS
TRO MCHG
POPJ P,
CLBLCS: TLZE M,BLOCS
TRO MCHG
POPJ P,
STCLCS: TLON M,CLOCS
TRO MCHG
POPJ P,
CLCLCS: TLZE M,CLOCS
TRO MCHG
POPJ P,
SETPNS: TLON M,PLOCS
TRO MCHG
POPJ P,
CLRPNS: TLZE M,PLOCS
TRO MCHG
POPJ P,
STLINS: TRZE M,NLINES
TRO MCHG
POPJ P,
CLLINS: TRON M,NLINES
TRO MCHG
POPJ P,
MPC,<
STDIPS: TRZE M,NDIPS
TRO MCHG
POPJ P,
CLDIPS: TRON M,NDIPS
TRO MCHG
POPJ P,
STFLIP: TRC M,FLIP ;INVERT X
TRO MCHG
MOVE T,CURSE
JRST SETPOS ;GET CURSOR TO RIGHT PLACE!
STCOMP: TLNE SID,FRONT
POPJ P,
SWSID: TRZ INLIN!INMOV
SWITCH
TRO MCHG!NEEDCL
POPJ P,
STSOLD: TLNN SID,FRONT
POPJ P,
JRST SWSID
STFEED: TRZE M,XFEED
TRO MCHG
POPJ P,
CLFEED: TRON M,XFEED
TRO MCHG
POPJ P,
STFING: TRZE M,XFINGER
TRO MCHG
POPJ P,
CLFING: TRON M,XFINGER
TRO MCHG
POPJ P,
>;MPC
MD,<
SETOUT: SETOM OUTSIDE
POPJ P,
CLROUT: SETZM OUTSIDE
POPJ P,
SETCBX: TRZN M,NOCBOX
POPJ P,
TLNE M,CLOCS
TRO MCHG
POPJ P,
CLRCBX: TROE M,NOCBOX
POPJ P,
TLNE M,CLOCS
TRO MCHG
POPJ P,
SETIDS: TLON M,PINIDS
TRO MCHG
POPJ P,
CLRIDS: TLZE M,PINIDS
TRO MCHG
POPJ P,
SETRID: TLON M,RPINID
TRO MCHG
POPJ P,
CLRRID: TLZE M,RPINID
TRO MCHG
POPJ P,
STUNHI: TLON M,UNHIDE
TRO MCHG
POPJ P,
CLUNHI: TLZE M,UNHIDE
TRO MCHG
POPJ P,
STPTXT: TRZE M,NPTEXT
TRO MCHG
POPJ P,
CLPTXT: TRON M,NPTEXT
TRO MCHG
POPJ P,
STBTXT: TRZE M,NBTEXT
TRO MCHG
POPJ P,
CLBTXT: TRON M,NBTEXT
TRO MCHG
POPJ P,
STMLIB: SETOM MODLIB
POPJ P,
CLMLIB: SETZM MODLIB
POPJ P,
UREST: SKIPN A,PONPNT
POPJ P,
UREST1: MOVE T,ADDR(A,PBIT)
TLNE T,CPIN
TRNN T,-1 ;ANY BACKUP PIN NAME?
JRST UREST2
FETCH(C,A,PLOC)
MOVE TT,(C)
HRRM T,(C) ;BACKUP PIN NAME  PIN LOC
STORE(TT,A,PIN) ;EXCHANGE PIN NAMES
TRO MCHG
PUSHJ P,OFFCON ;FIX CON OFFSET
UREST2: HRRZ A,(A)
JUMPN A,UREST1
POPJ P,
>;MD
SETTXT: TRZE M,MD,<NBTEXT!>NPTEXT
TRO MCHG
TLON M,CLOCS
TRO MCHG
POPJ P,
CLRTXT: TRO M,MD,<NBTEXT!>NPTEXT
TLZ M,CLOCS
TRO MCHG
POPJ P,
SETWIN: TLZN M,XWINDOW
POPJ P,
JRST DOWIN
CLRWIN: TLOE M,XWINDOW
POPJ P,
DOWIN: MOVE T,CURSE
JRST SETPOS
SETLWN: TLON M,LWINDOW
TRO MCHG
POPJ P,
CLRLWN: TLZE M,LWINDOW
TRO MCHG
POPJ P,
SETDPY:
NOCMU,< SKIPE ISDPY >
CMU,< SKIPLE DONTDPY >
POPJ P,
SETZM DONTDPY
DLX,< SETOM DLXFLG > ;IF USER DOESN'T SPECIFY, TRY DL10
JRST DTRY
CLRDPY:
NOCMU,< SKIPE DONTDPY >
CMU,< SKIPGE DONTDPY >
POPJ P,
SETOM DONTDPY
SKIPE ISDPY
PUSHJ P,DPYREL
JRST DSPSET
NODEC,<
DPYREL: DPYCLR
CMU,< RELEASE ATYO, >
SETZM ISDPY
POPJ P,
>;NODEC
GT,<
SETOPT: SKIPE OPTFLG
SKIPN ISDPY
CAIA
POPJ P,
DLX,< SKIPN ISDPY ;IF NOT CURRENTLY DISPLAY,
SETOM DLXFLG ;THEN TRY DL10 FIRST
>;DLX
PUSHJ P,CLRDPY ;LET GO OF DISPLAY
SETZM DONTDPY
SETOM OPTFLG ;THEN TELL IT TO OPTIMIZE
JRST DTRY
CLROPT: SKIPN OPTFLG
SKIPN ISDPY
CAIA
POPJ P,
DLX,< SKIPN ISDPY ;IF NOT CURRENTLY DISPLAY,
SETOM DLXFLG ;THEN TRY DL10 FIRST
>;DLX
PUSHJ P,CLRDPY
SETZM DONTDPY
SETZM OPTFLG
JRST DTRY ;TRY DISPLAY IN CURRENT MODE
DLX,<
SETDLX: SKIPE DLXFLG
SKIPN ISDPY
CAIA
POPJ P,
PUSHJ P,CLRDPY
SETZM DONTDPY
SETOM DLXFLG
JRST DTRY
CLRDLX: SKIPN DLXFLG
SKIPN ISDPY
CAIA
POPJ P,
PUSHJ P,CLRDPY
SETZM DONTDPY
SETZM DLXFLG
JRST DTRY
>;DLX
>;GT
;TITLES, MUNGER, INNER, DIAMONDS
;ROUTINE TO PUT FILENAME INTO MACRO
CLRSIG: PUSHJ P,SETTT
SKIPN TT,(B)
JRST ITSTUF
PUSHJ P,STFSIX
PUTBYT "."
HLLZ TT,1(B)
PUSHJ P,STFSIX
PUTBYT "["
HLLZ TT,3(B)
PUSHJ P,STFPPN
PUTBYT ","
HRLZ TT,3(B)
PUSHJ P,STFPPN
PUTBYT "]"
JRST ITSTUF
STFPPN:
IFN IIISW!DECSW,< HLRZ T,TT
STFPP1: IDIVI T,10
HRLM TT,(P)
JUMPE T,.+2
PUSHJ P,STFPP1
HLRZ T,(P)
PUTBYT 60(T)
POPJ P,
>;IFN IIISW!DECSW
STFSIX: JUMPE TT,CPOPJ
SETZ T,
LSHC T,6
PUTBYT 40(T)
JRST STFSIX
MD,<
CTITLE: MOVE B,TIT1
PUSHJ P,STUFT1
PUTBYT 12
MOVE B,TIT2
PUSHJ P,STUFT2
JRST ITSTUF
STITLE: TLNE M,DSKACT!MACACT
JRST STITL1
SKIPE T,TIT1
PUSHJ P,OUTTCR
SKIPE T,TIT2
PUSHJ P,OUTTCR
OUTSTR[ASCIZ/NEW TITLE LINE 1?/]
STITL1: PUSHJ P,TREADC
POPJ P, ;ALTMODE
SETZ B, ;NULL
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>) ;DON'T CHANGE IF HE TYPE THERE EXISTS
EXCH B,TIT1
JUMPE B,.+2
PUSHJ P,PUTFS
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW TITLE LINE 2?/]
PUSHJ P,TREADC
JRST TITCHK ;ALTMODE
SETZ B, ;NULL
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>)
EXCH B,TIT2
JUMPE B,.+2
PUSHJ P,PUTFS
TITCHK:
NOITS,< MOVEI T,=31 > ;MAX LENGTH FOR BOTH STRINGS
ITS,< MOVEI T,=50 > ;APPROX 50 CHARS TOTAL ON XGP
MOVE B,TIT1
PUSHJ P,LENCHK
MOVE B,TIT2 ;REDUCED COUNT STILL IN T
PUSHJ P,LENCHK
POPJ P,
CSITE: MOVE B,SITE1
PUSHJ P,STUFT1
PUTBYT 12
MOVE B,SITE2
PUSHJ P,STUFT2
JRST ITSTUF
SITE: TLNE M,DSKACT!MACACT
JRST SITE0
SKIPE T,SITE1
PUSHJ P,OUTTCR
SKIPE T,SITE2
PUSHJ P,OUTTCR
OUTSTR[ASCIZ/NEW SITE LINE 1?/]
SITE0: PUSHJ P,TREADC
POPJ P, ;ALTMODE
SETZ B, ;NULL
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>) ;DON'T CHANGE IF HE TYPE THERE EXISTS
EXCH B,SITE1
JUMPE B,.+2
PUSHJ P,PUTFS
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NEW SITE LINE 2?/]
PUSHJ P,TREADC
POPJ P, ;ALTMODE
SETZ B, ;NULL
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>)
EXCH B,SITE2
JUMPN B,PUTFS
POPJ P,
DEFINE TITLIN $ (LABEL,CLABEL,TPTR,PROMPT,MAXLEN,CHANGE)
<
CLABEL: MOVE B,TPTR
JRST STUFT0
LABEL: TLNE M,DSKACT!MACACT
JRST .$LABEL
SKIPE T,TPTR
PUSHJ P,OUTTCR
OUTSTR[ASCIZ/NEW PROMPT?/]
.$LABEL:
PUSHJ P,TREADC
POPJ P, ;ALTMODE
SETZ B, ;NULL
IFDIF<MAXLEN><><
MOVEI T,MAXLEN
PUSHJ P,LENCHK ;CHECK LENGTH AND PRINT WARNING MESSAGE
>
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>) ;THIS SHOULD ALWAYS WORK
EXCH B,TPTR
IFIDN<CHANGE><C><TRO MCHG>
JUMPN B,PUTFS
POPJ P,
>
LENCHK: JUMPE B,CPOPJ
PUSH P,T
MOVE T,B
ADD T,[POINT 7,1]
LENCK1: TLNE T,760000
JRST LENCK2
HRR T,-1(T)
TRNN T,-1
JRST LENCK3 ;END BEFORE COUNT OUT
LENCK2: ILDB TT,T
JUMPE TT,LENCK1
SOS (P) ;COUNT DOWN BY ONE
JRST LENCK1 ;LOOP IF NOT COUNTED OUT
LENCK3: SKIPL (P) ;OVERFLOWED?
JRST LENCK4
OUTSTR[ASCIZ/STRING /]
MOVN T,(P)
PUSHJ P,DECOUT
OUTSTR[ASCIZ/. CHARS TOO LONG, WILL STORE STRING ANYWAY.
/]
LENCK4: POP P,T ;RETURN REDUCED COUNT
POPJ P,
TITLIN(AUTHOR,CAUTHOR,TAUTHOR,AUTHOR)
TITLIN(REVISE,CREVISE,TREV,REVISION,4,C)
TITLIN(MODULE,CMODULE,TMODULE,MODULE NAME,5,C)
TITLIN(VARIABLE,CVARIABLE,TVARIABLE,VARIABLE,2,C)
TITLIN(PREFIX,CPREFIX,TPREFIX,DRAWING PREFIX,4,C)
CLRNUM: MOVE B,TMODULE
PUSHJ P,STUFT1
PUTBYT 12
PUSHJ P,STUFT2
PUTBYT 12
PUSHJ P,STUFT2
JRST ITSTUF
SETNUM: PUSHJ P,MODULE
PUSHJ P,VARIABLE
JRST PREFIX
TITLIN(PROJECT,CPROJECT,TPROJ,PROJECT NAME,10)
CPAGEOF:
MOVE B,TPAGE
PUSHJ P,STUFT1
PUTBYT 12
MOVE B,TOF
PUSHJ P,STUFT2
JRST ITSTUF
PAGEOF: TLNE M,DSKACT!MACACT
JRST PAGOF0
SKIPE T,TPAGE
PUSHJ P,OUTTCR
SKIPE T,TOF
PUSHJ P,OUTTCR
OUTSTR[ASCIZ/SHEET?/]
PAGOF0: PUSHJ P,TREADC
POPJ P, ;ALTMODE
SETZ B, ;NULL
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>) ;DON'T CHANGE IF HE TYPE THERE EXISTS
EXCH B,TPAGE
JUMPE B,.+2
PUSHJ P,PUTFS
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/OF?/]
PUSHJ P,TREADC
POPJ P, ;ALTMODE
SETZ B, ;NULL
SKIPE T,B
MOVS T,1(B)
CAIE T,(<BYTE(7)TEXIST>)
EXCH B,TOF
JUMPN B,PUTFS
POPJ P,
TITLIN(DCODE,CDCODE,TDCODE,DRAWING CODE,2)
DEC,<
TITLIN(SETNXT,CLRNXT,TNXTHI,NEXT HIGHER ASSEMBLY NUMBER,=20)
CLRDRN: MOVEI B,DRNNAM
JRST CLRSIG
CLRENG: MOVEI B,ENGNAM
JRST CLRSIG
SETDRN: MOVEI A,DRNNAM
MOVEI T,[ASCIZ/DRN./]
JRST SETSIG
SETENG: MOVEI A,ENGNAM
MOVEI T,[ASCIZ/ENG./]
SETSIG: TLNE M,DSKACT!MACACT
JRST SETSG1
PUSH P,T
SKIPE (A)
JSR FPRINT
OUTSTR[ASCIZ/
NEW /]
POP P,T
OUTSTR(T)
OUTSTR[ASCIZ/ SIGNATURE /]
SETSG1: PUSH P,A
MOVSI T,EXTSIG
PUSHJ P,SETNAM
JRST [ POP P,A
SETZM (A)
POPJ P,]
INIT DAT,17
'DSK '
0
JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!
/]
POP P,A
POPJ P,]
MOVEI A,FILNAM
TLNE M,DSKACT!MACACT
JRST SETSG2
OUTSTR[ASCIZ/CHECKING EXISTENCE OF /]
JSR FPRINT
SETSG2: SKIPN T,FILPPN
MOVE T,LIBPPN
MOVEM T,FILPPN
LOOKUP DAT,FILNAM
JRST [ POP P,A
JRST LOOKRR]
DEC,< JSR DAT,LOOKCK >
NODEC,< MOVEM T,FILPPN >
OUTSTR[ASCIZ/
/]
RELEASE DAT,
POP P,A
MOVE T,FILNAM
MOVEM T,(A)
MOVE T,FILEXT
HLLZM T,1(A)
MOVE T,FILPPN
MOVEM T,3(A)
DATE T, ;USE CURRENT DATE
HRRM T,1(A)
POPJ P,
>;DEC
STUFT0: PUSHJ P,STUFT1
JRST ITSTUF
STUFT1: PUSHJ P,SETTT
STUFT2: JUMPE B,CPOPJ
MOVEI T,1(B)
HRLI T,(<POINT 7,0>)
STUFT3: PUSHJ P,GETTT
POPJ P,
PUTBYT (C)
JRST STUFT3
LTITLE: TVOFF
SKIPE T,SITE1
PUSHJ P,[OUTSTR[ASCIZ/
SITE LINE 1 /]
JRST OUTTXT]
SKIPE T,SITE2
PUSHJ P,[OUTSTR[ASCIZ/
SITE LINE 2 /]
JRST OUTTXT]
SKIPE T,TAUTHOR
PUSHJ P,[OUTSTR[ASCIZ/
AUTHOR /]
JRST OUTTXT]
SKIPE T,TIT1
PUSHJ P,[OUTSTR[ASCIZ/
TITLE LINE 1 /]
JRST OUTTXT]
SKIPE T,TIT2
PUSHJ P,[OUTSTR[ASCIZ/
TITLE LINE 2 /]
JRST OUTTXT]
SKIPN TVARIABLE
SKIPE TPREFIX
JRST DODNUM
SKIPN TMODULE
JRST NODNUM
DODNUM: OUTSTR[ASCIZ/
DRAWING NUMBER: /]
SKIPE T,TMODULE
PUSHJ P,OUTTXT
SKIPE T,TVARIABLE
PUSHJ P,[OUTCHR["-"]
JRST OUTTXT]
SKIPE T,TPREFIX
PUSHJ P,[OUTCHR["-"]
JRST OUTTXT]
NODNUM: SKIPE T,TREV
PUSHJ P,[OUTSTR[ASCIZ/
REVISION /]
JRST OUTTXT]
SKIPE T,TPROJ
PUSHJ P,[OUTSTR[ASCIZ/
PROJECT /]
JRST OUTTXT]
SKIPE T,TDCODE
PUSHJ P,[OUTSTR[ASCIZ/
DRAWING CODE = /]
JRST OUTTXT]
SKIPN T,TPAGE
SKIPE TOF
CAIA
JRST NODCOD
OUTSTR[ASCIZ/
SHEET /]
JUMPE T,.+2
PUSHJ P,OUTTXT
OUTSTR[ASCIZ/ OF /]
SKIPE T,TOF
PUSHJ P,OUTTXT
NODCOD:
DEC,<
FOR @$I IN(DRN,ENG)
< SKIPN I$NAM
JRST NLT$I
OUTSTR[ASCIZ/
I: /]
MOVEI A,I$NAM
JSR FPRINT
NLT$I:
>
SKIPE T,TNXTHI
PUSHJ P,[OUTSTR[ASCIZ/
NEXT HIGHER ASSEMBLY NUMBER = /]
JRST OUTTXT]
>;DEC
MOVE T,[OUTCHR TTT]
MOVEM T,PUTCHR
SKIPE CRDLOC
PUSHJ P,[OUTSTR [ASCIZ /
CARD LOCATION: /]
HLRZ A,CRDLOC
JRST SLTOUT]
OUTSTR [ASCIZ /
NOMENCLATURE: /]
MOVE T,NOMTYP
OUTSTR @LNAMES(T)
SKIPL T,WWTYP
JRST [ OUTSTR [ASCIZ /
BOARD TYPE: /]
OUTSTR @WNAMES(T)
JRST .+1]
OUTSTR[ASCIZ/
/]
TVON
POPJ P,
;MORE SET AND CLEAR STUFF
UNDRLN: SETOM ULNFLG
POPJ P,
NUNDRL: SETZM ULNFLG
POPJ P,
SETDMD: TLO M,DIAMONDS
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/DIAMONDS AT JUNCTIONS OF 3 LINES/]
PUSHJ P,YORN
JFCL
TLZA M,JUNC3
TLO M,JUNC3 ;YES.
POPJ P,
CLRDMD: TLZ M,DIAMONDS!JUNC3
POPJ P,
>;MD
STANFO,<
SETTHK: MOVE A,STDBIG
MOVEI B,CWIDTH+1
MOVEM B,PLTPTX(A)
POPJ P,
CLRTHK: MOVE A,STDBIG
MOVEI B,CWIDTH
MOVEM B,PLTPTX(A)
POPJ P,
>;STANFO
MPC,<
STCARD: TLON M,CRDISP
TRO MCHG
POPJ P,
CLCARD: TLZE M,CRDISP
TRO MCHG
POPJ P,
;HERE WE DELETE LINES, TEXT, AND POINTS WITHOUT DRILL HOLES
;ALSO SET PAD TYPES TO 2 (CLEARANCE)
INNER: TRZ INLIN!INMOV
TRO NEEDCL
MOVEI B,PONPNT
PUSHJ P,PNTKIL
MOVEI B,PONPN2
PUSHJ P,PNTKIL
OUTSTR[ASCIZ/WELL, NOW YOU'VE REALLY DONE IT OLLY!
THIS USED TO BE A NICE PC CARD!
/]
SETZM LSTNAM ;DISABLE 
LAY,< SETZM SAVNAM >
TRO MCHG
JRST FILEUP ;UPDATE ON SCREEN
PNTKL1: FETCHL(TT,B,PBIT)
TLNE TT,CPIN
JRST STCLR1 ;CONNECTORS ARE SPCIAL
TLNE TT,ISPIN!FEEDTH
JRST STCLR
TRZ TFLG
PUSH P,A ;SAVE LAST
PUSHJ P,DELPNT ;DELETE POINT
POP P,B ;RESTORE LAST AS THIS
JRST PNTKIL
STCLR: MOVEI TT,2 ;SET CLEARANCE PAD
STORE(TT,B,PIN)
STCLR1: PUSHJ P,KILPNT ;FLUSH LINES AND TEXT
PNTKIL: MOVE A,B
FETCH(B,B,PNXT)
JUMPN B,PNTKL1
POPJ P,
PPLOT: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/PLANE NUMBER?/]
PUSHJ P,READNC
ADDI T,1
MOVEM T,CPLANE
JRST PLPLOT
MUNG: MOVE T,MODE
CAIE T,SETM ;SET MODE IS SPECIAL
JRST MUSH
JRST STMUSH ;MUSH SET ONLY
SETPWR: MOVEI D,1 ;DIVIDE BY 1 TO GET PWR PIN
MOVEI F,2 ;AND DEPOSIT A 2 (POWER PLANE)
OUTSTR[ASCIZ/CONNECT HIGHEST NUMBERED PIN OF DIP TO POWER/]
PUSHJ P,YORN
JFCL
CAIA
PUSHJ P,PWRGND
NOUML,< POPJ P,>
UML,< MOVEI E,[<ASCII/VCC/>
ASCIZ/VCC/]
PGSIGS: OUTSTR[ASCIZ/CONNECT /]
OUTSTR 1(E)
OUTSTR[ASCIZ/ RUN TO INNER PLANE/]
PUSHJ P,YORN
POPJ P,
POPJ P,
SKIPN G,WIRLST
JRST NOPGSG
PGSIG1: HRRZ C,1(G)
PGSIG2: HLRZ A,1(C)
JUMPE A,PGSIG3
ADD A,[POINT 7,1]
MOVE B,E
PUSHJ P,SIGMAT
JRST PGSIG3
JRST ISPORG ;EQUIVALENT IS CLOSE ENOUGH
JRST ISPORG
PGSIG3: HRRZ C,(C)
JUMPN C,PGSIG2
HRRZ G,(G)
JUMPN G,PGSIG1
NOPGSG: OUTSTR[ASCIZ/NO /]
OUTSTR 1(E)
OUTSTR[ASCIZ/ RUN!
/]
POPJ P,
ISPORG: HRRZ G,1(G)
ISPOR1: HLRZ E,(G)
JUMPE E,ISNPG
HLRZ A,(E)
FETCHL(B,A,PBIT)
TLNN B,ISPIN ;PINS ONLY!
JRST ISNPG
MOVE T,F
PUSHJ P,UNPLN1 ;SET PLANE # ON PIN
ISNPG: HRRZ G,(G)
JUMPN G,ISPOR1
POPJ P,
>;UML
SETGND: MOVEI D,2 ;DIVIDE BY 2
MOVEI F,1 ;AND SET TO 1 (GROUND PLANE)
OUTSTR[ASCIZ/CONNECT HALF HIGHEST NUMBERED PIN OF DIP TO GROUND/]
PUSHJ P,YORN
JFCL
CAIA
PUSHJ P,PWRGND
NOUML,< POPJ P,>
UML,< MOVEI E,[<ASCII/GND/>
ASCIZ/GND/]
JRST PGSIGS
>;UML
PWRGND: MOVE T,F
SKIPE E,PONPNT
PUSHJ P,PGSET
SKIPE E,PONPN2
PUSHJ P,PGSET
TRO MCHG
POPJ P,
PGSET: FETCHL(B,E,PBIT)
TLNN B,ISPIN
JRST NPGPIN
FETCH(B,E,BBODY)
FETCH(B,B,BTYP)
FETCH(B,B,TNAM) ;# PINS THIS TYPE
CAIG B,3 ;IS IT BIGGER THAN TRANSISTOR?
JRST NPGPIN
IDIV B,D
FETCH(C,E,BPLOC)
FETCH(C,C,TPID)
CAMN C,B
PUSHJ P,UNPLN1 ;SET PLANE FROM T
NPGPIN: FETCH(E,E,PNXT)
JUMPN E,PGSET
POPJ P,
;ROUTING PARAMETERS
ROUTE,<
SETRTE: PUSHJ P,BITINI
TLNE M,RDISP
TRO MCHG
POPJ P,
SETRDS: TLNN M,%ROUTE
PUSHJ P,BITINI ;FORCE INTIALIZATION
TLOE M,RDISP
POPJ P,
TRO MCHG
POPJ P,
CLRRDS: TLZE M,RDISP
TRO MCHG
POPJ P,
SETRCD: OUTSTR[ASCIZ/ROUTE CODE = /]
PUSHJ P,READNC
CAILE T,3
JRST PERRET
MOVEM T,RCODE
POPJ P,
SETCNR: MOVEI A,.CNR
JRST SETRT
SETFED: MOVEI A,.FED
JRST SETRT
SETBAK: MOVEI A,.BAK
JRST SETRT
SETSID: MOVEI A,.SID
SETRT: OUTSTR[ASCIZ/OLD VALUE = /]
MOVE T,(A)
PUSHJ P,DECOUT
OUTSTR[ASCIZ/
NEW VALUE = /]
PUSHJ P,SREADN
CAIE C,12 ;ENDING OK?
JRST INNERR ;NO, GET OUT
MOVEM T,(A) ;STORE NEW VALUE
POPJ P,
>;ROUTE
>;MPC
;SET CARD LOC(D,PC)
SETLOC: TLNE M,DSKACT!MACACT
JRST SETLC1
OUTSTR[ASCIZ/SET CARD LOCATION.
/]
OUTSTR @SLTCUE
OUTCHR["?"]
SETLC1: MOVE T,[PUSHJ P,GETLCH]
MOVEM T,GTCHRX
PUSHJ P,GETSLT
JRST INNERR
CAIE C,12
JRST INNERR
SKIPN C,LETTER
JRST [
MD,< SKIPN CRDLOC ;CRDLOC SET FOR WHOLE CARD?
JRST CLRLCB ;NO, SET INDIVIDUALLY
>;MD
SETZM CRDLOC
TRO MCHG
POPJ P,]
MPC,< HLLZ C,LETTER
MOVEM C,CRDLOC
TRO MCHG
POPJ P,
>;MPC
MD,< OUTSTR[ASCIZ/SHALL I SET THIS AS PERMANENT CARD LOC FOR WHOLE DWG,
OR JUST SPREAD THIS THROUGH BODIES AND CPINS (Y FOR PERM)/]
PUSHJ P,YORN
JFCL
CAIA
JRST [ MOVE T,LETTER
MOVEM T,CRDLOC
SETZM LETTER ;NOW CLEAR CRDLOC'S IN INDIVIDUAL CPINS AND BODIES
JRST CLRLCB]
SETZM CRDLOC ;CLEAR GLOBAL CRDLOC
CLRLCB: MOVEI A,DBODPN
TRO MCHG
JRST SETLCB
STLCB1: FETCH(T,A,BLOC)
JUMPE T,SETLCB ;ANY BODY LOC SET?
HLRZ TT,LETTER
STORE(TT,A,BBRS)
MOVE T,A
PUSH P,A
PUSHJ P,OFFBLO
POP P,A
SETLCB: FETCH(A,A,BNXT)
JUMPN A,STLCB1
MOVEI A,PONPNT
JRST SETLCC
STLCC1: FETCHL(TT,A,PBIT)
TLNN TT,CPIN
JRST SETLCC
FETCH(T,A,PLOC)
HLLZ TT,LETTER
HLLM TT,(T)
SETLCC: HRRZ A,(A)
JUMPN A,STLCC1
TRO MCHG!NEEDCL
POPJ P,
>;MD
SETLZ: SKIPN A,DBODPN
POPJ P,
TRO MCHG
SETLZ1:
MD,< CLEAR(A,BLOC) >
MPC,< CLEAR(A,BLN) >
FETCH(A,A,BNXT)
JUMPN A,SETLZ1
POPJ P,
;UML STUFF
MPC,<
%LIM__=300/5*2
UMLREL: SKIPE B,XUMLPN
PUSHJ P,PUTFS
SETZM XUMLPN
SKIPE B,YUMLPN
PUSHJ P,PUTFS
SETZM YUMLPN
POPJ P,
DOUML: SKIPN DBODPN ;ANYTHING TO DO IT TO?
JRST PERRET
PUSHJ P,UMLREL
OUTSTR[ASCIZ/<SMALLEST L><SMALLEST N>?/]
PUSHJ P,GETLET
JRST INNERR
SKIPG C,L2N-"A"(C) ;GET ITS NUMBER
JRST INNERR
MOVEM C,L1
PUSHJ P,READNC
JUMPE T,INNERR
MOVEM T,N1
MOVE A,DBODPN
DOUML1: FETCHL(T,A,BX)
MOVEI B,XUMLPN
PUSHJ P,DOUMLA
FETCHL(T,A,BY)
MOVEI B,YUMLPN
PUSHJ P,DOUMLA
FETCH(A,A,BNXT)
JUMPN A,DOUML1
MOVE A,DBODPN ;TAKE IT FROM THE TOP!
DOUML2: FETCHL(T,A,BX)
MOVEI B,XUMLPN
PUSHJ P,DOUMLB
ADD C,N1
FETCH(D,A,BLN)
DPB C,[POINT 6,D,29] ;STORE NUMBER
CAILE C,77
OUTSTR[ASCIZ/NUMBER OVERFLOW!
/]
FETCHL(T,A,BY)
MOVEI B,YUMLPN
PUSHJ P,DOUMLB
ADD C,L1
DPB C,[POINT 6,D,23] ;AND LETTER
STORE(D,A,BLN)
ANDI C,77 ;MAKE SURE WE DON'T GO OFF END OF TABLE
MOVE C,N2L(C)
CAIN C,"?" ;ERROR?
OUTSTR[ASCIZ/LETTER OVERFLOW!
/]
FETCH(A,A,BNXT)
JUMPN A,DOUML2
PUSHJ P,UMLREL
;MORE UML
;HERE WE CHECK FOR DUPLICATION OF LOCATION, AND TRY TO FLUSH IT
MOVE A,DBODPN
DOUML4: MOVE B,A
FETCH(B,A,BLN)
LDB C,[POINT 6,B,29] ;NUMBER
LDB B,[POINT 6,B,23] ;LETTER
MOVE D,A
CAIL B,77
CAIE C,"Z"-100
JRST DOUML6
JRST DOUML7 ;LOSE BIG, CAN'T MOVE THIS
DOUML5: FETCH(E,D,BLN)
LDB T,[POINT 6,E,23] ;LETTER
LDB TT,[POINT 6,E,29] ;NUMBER
CAMN B,T ;SAME LETTER?
CAME C,TT ;AND NUMBER?
JRST DOUML6 ;NO
FETCH(T,A,BXY)
TLO T,1
SUB T,ADDR(D,BXY) ;THIS IS DELTA X,Y
HLRE TT,T
MOVM TT,TT
HRRE TTT,T
MOVM TTT,TTT
MOVEI F,0
MOVEI G,2
TLNE T,400000
MOVEI F,1 ;-DELTA X
TRNE T,400000
MOVEI G,3 ;-DELTA Y
CAMG TTT,TT
CAIGE B,"Z"-100 ;IF LETTER IS MAX, FORCE CHANGE OF NUMBER
CAIA
EXCH G,F ;(DELTA XDELTA Y)
XCT PNTAB(G)
FETCH(T,D,BLN)
LDB B,LNTAB(G)
ADDI B,1 ;INC LETTER OR NUMBER
DPB B,LNTAB(G) ;PUT IT BACK
STORE(T,D,BLN)
MOVE C,B
MOVE E,DBODPN ;PUSH EVERYONE UP FROM HERE
DOUML7: FETCH(T,A,BLN)
LDB B,LNTAB(G)
CAML B,C ;IS GREATER OF EQUAL TO ONE WE JUST CHANGED
CAIN D,(E) ;AND NOT THE ONE WE JUST CHANGED?
CAIA ;SKIP IT
ADDI B,1 ;INCREASE IT
DPB B,LNTAB(G) ;STORE IT BACK
STORE(T,E,BLN)
FETCH(E,E,BNXT)
JUMPN E,DOUML7 ;LOOP THROUGH ALL OF THEM
JRST DOUML4 ;THEN START OVER (SEE US BE SLOW)
DOUML6: FETCH(D,D,BNXT)
JUMPN D,DOUML5 ;CONTINUE DOWN FROM CURRENT BODY
DOUML8: FETCH(A,A,BNXT)
JUMPN A,DOUML4 ;GET ANOTHER CURRENT BODY
TRO MCHG
POPJ P, ;YOU MEAN WE'RE DONE?
PNTAB: JFCL
MOVE D,A ;AD INCREASE IT
JFCL
MOVE D,A ;AD INCREASE IT
LNTAB: POINT 6,T,29 ;NUMBER
POINT 6,T,29 ;NUMBER
POINT 6,T,23 ;LETTER
POINT 6,T,23 ;LETTER
;STILL MORE UML
DUMLA1: MOVE TT,T
SUB TT,(B)
MOVE TTT,1(B)
SUB TTT,T
JUMPG TT,ABOVEA
JUMPG TTT,BELOWA
POPJ P, ;AND RETURN
ABOVEA: HLLZ TTT,(B)
SUB TTT,1(B)
ADD TTT,TT
CAMLE TTT,[%LIM,,0]
JRST DUMLA2
HLLM T,(B) ;STORE NEW TOP
POPJ P, ;AND RETURN
BELOWA: HLLZ TT,(B)
SUB TT,1(B)
ADD TTT,TT
CAMLE TTT,[%LIM,,0]
JRST DOUMLA
HLLM T,1(B)
POPJ P,
DOUMLA: MOVE E,B
HRRZ B,(B)
JUMPN B,DUMLA1
DUMLA2: GETFS(TT)
HRRM B,(TT)
HRRM TT,(E)
HLLM T,(TT)
HLLZM T,1(TT)
POPJ P,
DUMLB1: CAML T,1(B) ;IS THIS THE ONE?
POPJ P, ;YES
AOSA C
DOUMLB: SETZ C,
DUMLB2: HRRZ B,(B)
JUMPN B,DUMLB1
PUSHJ P,FUCKUP
POPJ P,
>;MPC
;COUNT THINGS
DOCNT:
MD,< SETZM COUNT
SETZM COUNT2
>;MD
MPC,< SETZM L1
>;MPC
SKIPE A,PONPNT
PUSHJ P,DOCNT1
MPC,< SETZM COUNT
SETZM COUNT2
SKIPE A,PONPN2
PUSHJ P,DOCNT1
>;MPC
MD,< MOVE T,COUNT
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ POINTS!
/]
MOVE T,COUNT2
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ CONNECTOR PINS!
/]
>;MD
MPC,< MOVE T,COUNT
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ DIP PADS.
/]
MOVE T,COUNT2
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ FEEDTHROUGHS.
/]
MOVE T,L1
PUSHJ P,MILOUT
OUTSTR[ASCIZ/ INCHES OF ETCH.
/]
>;MPC
SKIPE DBODPN
SKIPN A,BODPNT
POPJ P,
BDCNT: MOVE B,DBODPN
SETZ C,
BDCNT1: FETCH(T,B,BTYP)
CAMN T,A
ADDI C,1
FETCH(B,B,BNXT)
JUMPN B,BDCNT1
JUMPE C,BDNONE
OUTSTR[ASCIZ/
/]
MD,<
FETCH(T,A,TNAM)
PUSHJ P,OUTTXT
OUTSTR[ASCIZ/ /]
>;MD
MOVE T,C
PUSHJ P,DECOUT
MD,< FETCH(B,A,TLIB)
JUMPE B,BDNONE
PUSHJ P,LIBTAB
OUTSTR NAMBUF
>;MD
MPC,< OUTSTR[ASCIZ/ /]
FETCH(T,A,TNAM)
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ PIN DIPS/]
FETCH(T,A,TNAM)
CAIE T,2 ;2 PIN DIPS ARE SPECIAL
JRST BDNONE
FETCH(T,A,TPIN)
FETCH(T,T,TPXY) ;1/2 Y VALUE * 2
IMULI T,5 ;CONVERT TO MILS
OUTSTR[ASCIZ/ SEPERATED BY /]
PUSH P,T
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ MILS/]
POP P,T
CAIN T,=400
OUTSTR[ASCIZ/ (RESISTORS)/]
CAIN T,=300
OUTSTR[ASCIZ/ (CAPACITORS)/]
>;MPC
BDNONE: FETCH(A,A,TNXT)
JUMPN A,BDCNT
OUTSTR[ASCIZ/
/]
POPJ P,
DOCNT1: FETCHL(C,A,PBIT)
MD,< AOS COUNT ;COUNT A POINT
TLNE C,CPIN ;THESE ARE CONNECTOR PINS
AOS COUNT2
>;MD
MPC,< TLNE C,ISPIN
AOS COUNT
TLNE C,FEEDTH
AOS COUNT2
FETCH(C,A,PXY) ;GET X,Y FOR COMPARISON
FETCH(B,A,PNEB)
JUMPE B,DOCNT2 ;SKIP IF NONE
DOCNT3: MOVEI D,2
DOCNT4: XCT (D)[HLRZ E,(B)
HLRZ E,1(B)
HRRZ E,1(B)]
JUMPE E,DOCNT5
CAML C,ADDR(E,PXY) ;ONLY DO IN ONE DIRECTION
JRST DOCNT5
HLRE T,C
FETCH(TT,E,PX)
SUB T,TT
IMUL T,T
HRRE TT,C
FETCH(TTT,E,PY)
SUB TT,TTT
IMUL TT,TT
ADD T,TT
PUSHJ P,SQRT
ADDM T,L1
DOCNT5: SOJGE D,DOCNT4
HRRZ B,(B)
JUMPN B,DOCNT3
DOCNT2:
>;MPC
FETCH(A,A,PNXT)
JUMPN A,DOCNT1
POPJ P,
;BRIGHTNESS, SCALE
ITBRT: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/NORMAL BRIGHTNESS?/]
MOVEI A,DEFBRT
PUSHJ P,ITBRTS
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/ADDITIONAL BLINKING BRIGHTNESS?/]
MOVEI A,BLBRT
PUSHJ P,ITBRTS
MPC,< TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/BOTH SIDES BRIGHTNESS?/]
MOVEI A,BTHBRT
PUSHJ P,ITBRTS
>;MPC
POPJ P,
ITBRTS: PUSHJ P,GETCHR
CAIN C,12
POPJ P,
CAIN C,ALTMOD
JRST ITBRTT ;NO CHANGE
CAIL C,"0"
CAILE C,"7" ;LEGAL BRIGHTNESS?
JRST [ PUSHJ P,PERRET ;NO
OUTSTR[ASCIZ/BRIGHTNESS?/]
JRST ITBRTS]
MOVEI T,-60(C)
CAME T,(A)
TRO MCHG ;GET IT DONE!
MOVEM T,(A) ;SET NEW DEFAULT BRIGHTNESS
ITBRTT: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/
/]
POPJ P,
CLRBRT:
NOITS,<NODEC,< MOVEI T,1 >>
ITS,< MOVEI T,4 >
DEC,< MOVEI T,5 >
CAME T,DEFBRT
TRO MCHG
MOVEM T,DEFBRT ;DEFAULT BRIGHTNESS IS 1
STANFO,< MOVEI T,3 >
NOSTANFO,< MOVEI T,7 >
CAME T,BLBRT
TRO MCHG
MOVEM T,BLBRT
MPC,<
STANFO,< MOVEI T,5 >
NOSTANFO,< MOVEI T,7 >
CAME T,BTHBRT
TRO MCHG
MOVEM T,BTHBRT
>;MPC
POPJ P,
ITCBRT: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/CURSOR BRIGHTNESS?/]
PUSHJ P,GETCHR
CAIL C,"0"
CAILE C,"7"
JRST PERRET
MOVEI T,-60(C)
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/
/]
JRST CURBRT
CLCBRT:
STANFO,< MOVEI T,3 >
ITS,< MOVEI T,7 >
DEC,< MOVEI T,5 >
III,< MOVEI T,5 >
JRST CURBRT ;START CURSOR AT BRIGHTNESS 3
ITSCAL: TLNN M,DSKACT!MACACT
OUTSTR [ASCIZ /SCALE?/]
PUSHJ P,READNC
JUMPE T,CPOPJ
CAMN T,NSCALE
POPJ P,
MOVEM T,NSCALE
JRST CHANG1
MD,<
ITSTUB: TLNN M,DSKACT!MACACT
OUTSTR [ASCIZ /STUB SIZE?/]
PUSHJ P,READNC
JUMPE T,CPOPJ
LSH T,1
MOVEM T,STBSIZ
POPJ P,
>;MD
;SIZE STUFF - ITSET, PICCEN
MD,<
PICCEN: PUSHJ P,ITSET
MOVN T,MAXX
SUB T,MINX
ASH T,-1
MOVS T,T
MOVN TT,MAXY
SUB TT,MINY
ASH TT,-1
HRR T,TT
TDZ T,[1,,1]
JUMPE T,CPOPJ
SKIPE A,PONPNT
PUSHJ P,PICCN1
SKIPE A,DBODPN
PUSHJ P,PICCN1
SKIPE A,SETPNT
PUSHJ P,PICCN1
TRO MCHG!NEEDCL
JRST HOME ;NOW CENTER PHYSICAL SCREEN
PICCN1: FETCH(TT,A,QXY)
ADJUST(ADD,TT,T)
STORE(TT,A,QXY)
HRRZ A,(A)
JUMPN A,PICCN1
POPJ P,
>;MD
ITSET: MOVSI T,400000
MOVEM T,MAXX
MOVEM T,MAXY
SETCAM T,MINX
SETCAM T,MINY
MD,< MOVEI T,10 ;DISTXT EXPECTS THIS
MOVEM T,CSCALE
SKIPE A,DBODPN
PUSHJ P,CHKBDS
>;MD
SKIPE A,PONPNT
PUSHJ P,CHKDIS
MPC,< SKIPE A,PONPN2
PUSHJ P,CHKDIS
>;MPC
HLRES MINX
HLRES MAXX
POPJ P,
;CHECK DISPLAY LIMIT, INCLUDING TEXT AND CONNECTOR BOXES
;A = POINT
CHKDIS: FETCH(T,A,PXY)
PUSHJ P,MAXMIN
TRNE M,NPTEXT ;DOING POINT TEXT?
JRST CHKDS1
FETCH(D,A,PTXT) ;TEXT POINTER
JUMPE D,CHKDS1 ;MAYBE NONE
FETCH(T,A,PXY) ;X,Y AGAIN
PUSHJ P,DISTXT ;CALC MAX AND MIN
CHKDS1:
MD,< FETCH(B,A,PBIT)
TRNE B,CPIN ;CONNECTOR PIN HERE?
TLNN M,CLOCS ;YES, DOING THEM?
JRST CHKDS2 ;NO
FETCH(T,A,PXY)
FETCH(B,A,PLOC)
MOVE C,STDBIG
HLRE TT,1(B)
IMUL TT,PLTPTX(C)
IDIV TT,VIRPTX(C)
UNSCAL TT
HRLZ TT,TT
ADD T,TT
HRRE TT,1(B)
IMUL TT,PLTPTY(C)
IDIV TT,VIRPTY(C)
UNSCAL TT
HRRZ TT,TT
ADD T,TT
TLZ T,1
PUSH P,T
TRNE M,NOCBOX
JRST CHKDS3
MOVE TT,PLTPTY(C)
ASH TT,-1
HRLZ TT,TT
SUB T,TT
CHKDS3: PUSHJ P,MAXMIN ;LOWER LEFT EXTREMES
PUSHJ P,CONCAL ;CALC LENGTH OF CONNECTOR SPEC (A)
IMUL T,PLTPTX(C)
HRLZ T,T
POP P,TT
ADD T,TT
MOVE TT,PLTPTY(C)
ADD T,TT
TLZ T,1
TRNE M,NOCBOX
JRST CHKDS4
ASH TT,-1
HRLZ TT,TT
ADD T,TT
CHKDS4: PUSHJ P,MAXMIN ;UPPER RIGHT EXTREMES
CHKDS2:
>;MD
FETCH(A,A,PNXT)
JUMPN A,CHKDIS
POPJ P,
MAXMIN: CAMLE T,MAXX
MOVEM T,MAXX
CAMGE T,MINX
MOVEM T,MINX
HRRES T
CAMLE T,MAXY
MOVEM T,MAXY
CAMGE T,MINY
MOVEM T,MINY
POPJ P,
;DISTXT - CALC MAX,MIN OF TEXT
;D = TEXCOF BLOCK (OR 2ND PART OF TEXT/PROP BLOCK)
;T = X,Y
DISTXT: HRRZ C,(D) ;ACTUAL TEXT
FETCH(C,C,TSSIZ)
SKIPN C
MOVE C,STDBIG
TRZE C,400000
TLO C,400000
HLRE TT,1(D) ;CHARACTER X,Y OFFSET (IN III POINTS?)
IMUL TT,PLTPTX(C)
IDIV TT,VIRPTX(C) ;COMPENSATE FOR CHAR SIZE DEVIATIONS
UNSCAL TT ;INTERNAL COORDS
HRLZ TT,TT
ADD T,TT ;OFFSET MAIN X,Y BY CHAR OFFSET
HRRE TT,1(D)
IMUL TT,PLTPTY(C)
IDIV TT,VIRPTY(C)
UNSCAL TT
HRRZ TT,TT
ADD T,TT
TLZ T,1
MOVE TT,PLTPTX(C) ;CHARACTER WIDTH (AS PLOTTED)
MPC,< LSH TT,1 >
PUSH P,TT
MOVE TT,PLTPTY(C) ;CHARACTER HEIGHT (AS PLOTTED)
MPC,< LSH TT,1 >
PUSH P,TT
MD,< UNSCAL TT >
TLNE C,400000 ;COMPUTE Y OF TOP OF TEXT
MOVNS TT
HRRZS TT
TLNE C,400000
MOVSS TT
PUSH P,T ;SAVE ORIG X,Y
ADJUST(ADD,T,TT) ;UPPER LEFT CORNER OF TEXT
PUSHJ P,MAXMIN ;CHECK IT
;Now find # lines, max line width of text
SETZB T,TT
ADD D,[POINT 7,1,35] ;MAKE A BYTE POINTER
DSTXT1: TLNN D,760000 ;BYTE POINTER OUT?
JRST DSTXT2
DSTXT3: ILDB TTT,D ;GET A CHAR
JUMPE TTT,DSTXT1
CAIE TTT,DBLARR ;CRLF?
AOJA T,DSTXT1 ;NO
CAILE T,(TT) ;BIGGER THAN LARGEST?
HRR TT,T ;YES
SETZ T, ;NO CHARS ON NEXT LINE YET!
ADD TT,[1,,0] ;COUNT ANOTHER LINE
JRST DSTXT1
DSTXT2: HRR D,-1(D) ;FOLLOW LINK
TRNE D,-1 ;WAS THERE ONE?
JRST DSTXT3
CAILE T,(TT)
HRR TT,T ;#LINES,,MAX LENGTH
HLRZ T,TT
HRRZS TT
IMUL T,-1(P) ;#LINES*CHAR HEIGHT
IMUL TT,-2(P) ;MAX WIDTH * CHAR WIDTH
MD,<
UNSCAL T
UNSCAL TT
>;MD
TLNN C,400000
MOVNS T ;HORIZ: -Y, VERT: +X
HRL T,TT
TLNE C,400000
MOVSS T
ADJUST(ADD,T,<(P)>)
PUSHJ P,MAXMIN ;CHECK LOWER RIGHT CORNER OF TEXT
SUB P,[3,,3]
POPJ P,
MD,<
CHKBDS: FETCH(F,A,BORI)
FETCH(T,A,BTXT)
MOVEM T,BTXLST
FETCH(B,A,BTYP)
FETCH(C,B,TLIN)
JUMPE C,NCHKLN ;ANY?
CHKLN: FETCH(T,C,QXY)
PUSHJ P,ORIENT
ADJUST(ADD,T,<ADDR(A,BXY)>)
PUSHJ P,MAXMIN
FETCH(C,C,QNXT)
JUMPN C,CHKLN
NCHKLN: TRNE M,NBTEXT
JRST NCHKT
SKIPN BTXLST
JRST CHKT0
MOVE B,BTXLST
CHKT1: FETCH(T,B,TXBIT)
TRNN T,TXBIND
JRST CHKT2
PUSH P,B
FETCH(B,B,TXIND)
PUSHJ P,DSBTXT
POP P,B
JRST CHKT3
CHKT2: PUSHJ P,DSBTXT
CHKT3: FETCH(B,B,TXNXT)
JUMPN B,CHKT1
JRST NCHKT
CHKT0: FETCH(B,B,TPROP) ;ALSO DISPLAY TEXT FROM DEF
JUMPE B,NCHKT
CHKT: PUSHJ P,DSBTXT
HRRZ B,(B)
JUMPN B,CHKT
NCHKT: HRRZ A,(A)
JUMPN A,CHKBDS
POPJ P,
DSBTXT: FETCH(T,B,TXVAL)
FETCH(T,T,TSSIZ)
TLNN M,%IDENT
JUMPE T,CPOPJ
FETCH(T,B,TXXY)
TDZ T,[1,,1]
PUSHJ P,ORIENT
ADJUST(ADD,T,<ADDR(A,BXY)>)
MOVEI D,-1+ADDR(B,TXOFF)
JRST DISTXT
>;MD
;MORE SIZE STUFF
ITSIZE: PUSHJ P,ITSET
MD,<
OUTSTR[ASCIZ/WHAT SCALE WILL YOU USE IN THE PLOT PROG?/]
PUSHJ P,READNC
JUMPE T,CPOPJ
MOVEM T,ITSSCL
>;MD
MOVE T,MAXX
SUB T,MINX
OUTSTR[ASCIZ/WIDTH OF PIC IS /]
PUSHJ P,DOSIZE
MOVE T,MAXY
SUB T,MINY
OUTSTR[ASCIZ/HEIGHT OF PIC IS /]
MD,<
PUSHJ P,DOSIZE
MOVE T,MAXX
SUB T,MINX
SCALET(T)
NODEC,< IMUL T,ITSSCL ;SCALE IT
ASH T,-3
>;NODEC
DEC,< ASH T,-2 > ;DEC SCALE LOOKS LIKE 2
MOVE TT,MAXY
SUB TT,MINY
SCALET(TT)
NODEC,< IMUL TT,ITSSCL ;SCALE IT
ASH TT,-3
>;NODEC
DEC,< ASH TT,-2 >
TRZ TFLG
MOVSI TTT,-HBXLEN
PUSHJ P,BOXCHK
MOVE TTT,[-VBXLEN,,HBXLEN]
PUSHJ P,BOXCHK
TRNN TFLG
OUTSTR[ASCIZ/NO BOX IS BIG ENOUGH.
/]
POPJ P,
BOXCHK: CAMG T,WTAB(TTT)
CAML TT,HTAB(TTT)
AOBJN TTT,BOXCHK
JUMPGE TTT,CPOPJ
TRO TFLG
OUTSTR[ASCIZ/SIZE /]
SKIPGE BTAB(TTT)
OUTCHR["V"]
OUTCHR BTAB(TTT)
OUTSTR[ASCIZ/ IS BIG ENOUGH!
/]
POPJ P,
>;MD
DOSIZE: JUMPGE T,.+2
SETZ T,
MD,< SCALET(T)
IMUL T,ITSSCL ;SCALE IT!
ASH T,-3
>;MD
MPC,< ASH T,-1 >
IDIVI T,=200
PUSH P,TT ;SAVE REMAINDER
PUSHJ P,DECOUT ;PRINT INCHES
OUTCHR["."]
POP P,T
IMULI T,5
CAIGE T,=100
OUTCHR["0"]
CAIGE T,=10
OUTCHR["0"]
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ INCHES.
/]
POPJ P,
;SHOWBOX
MD,<
STANFO,<
C16: MOVEI D,"C" ;BOX SIZE C
MOVEI T,=16
MOVEM T,SSCALE ;SCALE 16
JRST C16.1
>;STANFO
SHWBOX: TLNN M,DSKACT!MACACT
NODEC,< OUTSTR[ASCIZ\<BOX LETTER><DRAWING SCALE>/<PLOT SCALE>?\]>
DEC,< OUTSTR[ASCIZ\<BOX LETTER><DRAWING SCALE>?\]>
PUSHJ P,GETLET
JRST [ CAIE C,12
JRST INNERR
CLRSHW: SKIPN SWIDTH
POPJ P,
SETZM SWIDTH
TRO MCHG
POPJ P,]
CAIE C,"V" ;ASKING FOR VERTICAL?
JRST NXVERT
PUSHJ P,GETLET
JRST INNERR
TLO C,400000 ;MARK AS VERTICAL
NXVERT: MOVE D,C ;SAVE CHAR
PUSHJ P,READN
SKIPN T
MOVE T,NSCALE
MOVEM T,SSCALE
NODEC,< SETZ T,
CAIN C,"/"
PUSHJ P,READN
>;NODEC
CAIE C,12
JRST INNERR
NODEC,< SKIPN T>
C16.1: MOVEI T,2
MOVSI TTT,-BOXLEN
CAME D,BTAB(TTT) ;THIS LETTER?
AOBJN TTT,.-1 ;NO
JUMPGE TTT,INNERR ;LOSE, NOT IN TABLE
HRRZ D,TTT ;SAVE INDEX
PUSH P,NSCALE
MOVE TT,SSCALE
MOVEM TT,NSCALE
IMULM T,SSCALE
LSH T,3
MOVEM T,CSCALE
PUSH P,D
PUSHJ P,ITSET
POP P,D
POP P,NSCALE ;RESTORE TRUE SCALE
MOVE T,MAXX
ADD T,MINX
ASH T,-1
MOVE TT,MAXY
ADD TT,MINY
ASH TT,-1
MOVE A,WTAB(D)
IDIV A,SSCALE
ASH A,1
MOVN B,A
ADD A,T
ADD B,T
HRLM A,SWIDTH
HRRM B,SWIDTH
MOVE A,HTAB(D)
IDIV A,SSCALE
ASH A,1
MOVN B,A
ADD A,TT
ADD B,TT
HRLM A,SHEIGHT
HRRM B,SHEIGHT
TRO MCHG
POPJ P,
NSHOBX: SETZM SHEIGHT
SETZM SWIDTH
TRO MCHG
POPJ P,
;PBOX
BOXSIZ: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/WHAT BOX SIZE?/]
PUSHJ P,GETLET
JRST INNERR
CAIE C,"V"
JRST NXVRT1
PUSHJ P,GETLET
JRST INNERR
TLO C,400000
NXVRT1: MOVE D,C
PUSHJ P,GETLIN
CAIE C,12
JRST INNERR
MOVSI TTT,-BOXLEN
CAME D,BTAB(TTT)
AOBJN TTT,.-1
JUMPGE TTT,PERRET
HRRZM TTT,CBOX
PUSHJ P,ITSET ;FIND MAX X,Y'S
MOVE C,CBOX ;THIS WAS CLOBBERED
MOVE T,MAXX
SUB T,MINX
MOVE TT,MAXY
SUB TT,MINY
ASH T,-2
ASH TT,-2
MOVE A,WTAB(C)
IDIV A,T
MOVE B,HTAB(C)
IDIV B,TT
CAML A,B
MOVE A,B
DEC,< ASH A,1 >
PUSH P,NSCALE
JUMPN A,.+2
MOVEI A,1
MOVEM A,NSCALE
LSH A,3 ;FUDGE TEXT SCALE BY 10
IDIV A,(P)
JUMPN A,.+2
MOVEI A,4
CAILE A,30 ;IF SIZE 3 OR LARGER WILL SHRINK PIC
JRST [ MOVE A,(P)
IMULI A,3
MOVEM A,NSCALE
MOVEI A,30
JRST .+1]
MOVEM A,CSCALE
OUTSTR[ASCIZ/ SCALING TEXT BY /]
MOVE T,CSCALE
ASH T,-4
PUSHJ P,OCTOUT
OUTCHR [" "]
MOVE T,CSCALE
ASH T,-1
ANDI T,7
ADDI T,60
OUTCHR T
OUTSTR[ASCIZ %/8
%]
MOVE T,CSCALE
CAIGE T,10
OUTSTR[ASCIZ/SOME OF THIS TEXT WILL BE AWFULLY SMALL!
/]
PUSHJ P,DPLOT
POP P,NSCALE
POPJ P,
;SLICE
DOSLICE:PUSHJ P,SLCSET
POPJ P,
SETZM FIND
SKIPE E,PONPNT
PUSHJ P,ACLRP
SKIPN C,PONPNT
JRST SLEAVE
SLOP: PUSHJ P,SLOPDO
JRST SLOPX
JRST SLOPY
TRO MCHG ;WILL CHANGE PIC
MOVE T,[POINT 7,SIGBUF]
JRST SLOPZ1
SLOPZ2: TLNE A,760000
JRST SLOPZ3
HRRZ TTT,-1(A)
JUMPN TTT,SLOPZ4
GETBLK(TTT,TEXSTR)
CLEAR(TTT,TSNXT)
CLEAR(TTT,TSASC)
SLOPZ4: HRR A,TTT
SLOPZ3: IDPB TT,A
SLOPZ1: ILDB TT,T
JUMPN TT,SLOPZ2
CAIA
IDPB TT,A
TLNE A,760000
JRST .-2
SOS A
FETCH(B,A,TSNXT)
CLEAR(A,TSNXT)
PUSHJ P,PUTFS
HRLM C,(P)
MOVE A,C
PUSHJ P,FIXEM ;FIX OFFSETS IF BITS ON
HLRZ C,(P)
SLOPX: FETCH(C,C,PNXT)
JUMPN C,SLOP
MOVE T,FIND
MOVEM T,FNDNUM ;STORE FOR MACRO CALL AT ;R
JUMPE T,SLEAVE
SETOM FIND
TLNE M,DSKACT!MACACT
JRST SLEAVE
PUSHJ P,DECOUT
OUTSTR[ASCIZ/ EXPRESSION ERRORS FOUND AND MARKED FOR $F.
/]
SLEAVE: PUSHJ P,SLCRET
POPJ P,
SLOPY: SETBIT(FOUNDP,T,C,PBIT)
AOS FIND
JRST SLOPX
CLTSLC: TLOA WFLAG ;STORE IN MACRO SLICED FORM OF TEXT
TYPSLC: TLZ WFLAG ;TYPE THE SLICED FORM OF CLOSEST TEXT
MOVEI T,1
LSH T,@MODE
TDNN T,[1PNTM!1TXTM]
JRST PERRET
PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,PTXT)
JUMPE T,PERRET
PUSHJ P,SLCSET
POPJ P,
MOVE C,CLOSES
PUSHJ P,SLOPDO
JRST SLEAVE
JRST EXPERR
PUSHJ P,SLCRET
TLNE WFLAG
JRST TYPSL1
OUTSTR SIGBUF ;PRINT CONVERTED SIGNAL NAME
POPJ P,
EXPERR: OUTSTR [ASCIZ /ERROR IN EXPRESSION(S):
/]
MOVE T,CLOSES
FETCH(T,T,PTXT)
PUSHJ P,OUTTXT
OUTSTR [ASCIZ /
/]
JRST SLEAVE
TYPSL1: PUSHJ P,SETTT
MOVE T,[POINT 7,SIGBUF]
TYPSL2: ILDB C,T
JUMPE C,ITSTUF
PUTBYT (C)
JRST TYPSL2
;MORE SLICE STUFF - EXPRESSION SUBRS
SLCSET: SETOM DOVARS
SETZM ERRVAR
MOVNI T,400000
MOVEM T,LOWER
MOVEI T,377777
MOVEM T,UPPER
MOVEM T,WIDTH
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/LOWER BOUND<UPPER BOUND>?/]
PUSHJ P,SREADN
CAIE C,74 ;LEFT BROKET
JRST NOLOWR
MOVEM T,LOWER
PUSHJ P,SREADN
NOLOWR: CAIN C,12
JUMPE T,NOUPPR
CAIE C,76
JRST [
SLERR: PUSHJ P,SCARF
POPJ P,
OUTSTR[ASCIZ/BOUNDS ERROR!
/]
JRST DOSLICE]
MOVEM T,UPPER
SUB T,LOWER
ADDI T,1
MOVEM T,WIDTH
PUSHJ P,GETLIN
NOUPPR: CAIE C,12
JRST SLERR
VARSET: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/SET VARIABLES, LN?/]
VARCON: PUSHJ P,GETLET
JRST [ CAIN C,12 ;NO VARIABLES?
JRST CPOPJ1 ;YES
VARERR: PUSHJ P,SCARF
JRST SLCRET
OUTSTR[ASCIZ/VARIABLE INPUT ERROR!
/]
JRST VARSET]
MOVE A,C
SETZM NDIG
PUSHJ P,SREADN
CAIE C,12
CAIN C,","
CAIA
JRST VARERR
GETFS(TT)
HRL A,NDIG ;SAVE WIDTH WITH VAR
MOVEM A,1(TT)
HRLM T,(TT)
EXCH TT,VARLST
HRRM TT,@VARLST
CAIE C,12
JRST VARCON
JRST CPOPJ1
SLOPDO: FETCH(A,C,PTXT)
JUMPE A,CPOPJ
AOS (P) ;SKIP TO INDICATE ATTEMPT
FETCH(A,A,TCSTR)
ADD A,[POINT 7,1]
PUSH P,A
PUSHJ P,SIGSUB
JRST [ POP P,(P)
POPJ P,] ;LET HIGHER UPS HANDLE ERROR
POP P,A
SKIPN EXPER2 ;NO SKIP IF ERROR
AOS (P)
POPJ P,
SLCRET: SKIPE B,VARLST
PUSHJ P,PUTFS
SETZM VARLST
POPJ P,
GETVAR:SKIPN TT,VARLST
JRST GETVR2 ;IGNORE THIS EXPR IF VAR NOT SET
GETVR1: HLL TTT,1(TT) ;MAKE SURE WIDTH MATCHES
CAMN TTT,1(TT) ;IS THIS THE VARIABLE?
JRST ISVAR ;YES
HRRZ TT,(TT)
JUMPN TT,GETVR1
TLZ TTT,-1
GETVR2: SETOM EXPER2 ;FLAG ERROR
MOVEI TT,1
LSH TT,-"A"(TTT)
TDNE TT,ERRVAR ;HAVE WE COMPLAINED ABOUT THIS ONE YET?
JRST GETVR3
IORM TT,ERRVAR
OUTSTR[ASCIZ/NO VALUE FOR VARIABLE "/]
OUTCHR TTT
OUTSTR[ASCIZ/".
/]
POPJ P,
GETVR3: SETZ TT,
JRST CPOPJ1 ;AND RETURN 0
ISVAR: HLRZ TTT,TTT
CAMLE TTT,NDIG
MOVEM TTT,NDIG
HRRZ TTT,1(TT) ;GET CHAR BACK
HLRE TT,(TT)
JRST CPOPJ1
>;MD
SIGGET:TLNN A,760000
JRST [ TRNN A,-1 ;ALREADY AT END?
JRST ISENDG
HRR A,-1(A)
TRNE A,-1
JRST .+1
ISENDG: SETZ TTT,
POPJ P,]
ILDB TTT,A
JUMPN TTT,CPOPJ
JRST SIGGET ;GET ANOTHER IF NULL
;XCLEAR
XCLEAR: MOVEI T,1
LSH T,@MODE
TDNE T,[MD,<ALLEDM!>ANYALT]
JRST PERRET
PUSH P,0 ;SAVE FLAGS FOR MERGING
PUSH P,M
PUSHJ P,RSTDEF ;DEFAULTS FOR RESTART
POP P,T
AND T,[XWD DSKFLG!DSKACT!MACACT,0]
IOR M,T
POP P,T
AND T,[XWD DSPACT,0]
IOR 0,T
NODEC,<
NOIII,< SETZM AUTOSM ;RESET AUTO WRITE AND SAVE COUNTERS
SETZM AUTOSN
>;NOIII
>;NODEC
MD,<
FOR I IN(SITE1,SITE2,TAUTHOR,TIT1,TIT2,TREV,TMODULE,TVARIABLE,TPREFIX,TPROJ,TPAGE,TOF,TDCODE)
< SKIPE B,I
PUSHJ P,PUTFS
SETZM I
>
DEC,< SKIPE B,TNXTHI
PUSHJ P,PUTFS
SETZM TNXTHI
SETZM DRNNAM
SETZM CHKNAM
SETZM ENGNAM
>;DEC
SETZM SWIDTH ;CLEAR SHOWBOX
PUSHJ P,CLRWW
>;MD
PUSHJ P,CLRNOM
SETZM CRDLOC ;CLEAR CARD LOCATION IN BOTH
SKIPN A,MDPNT
JRST NCMSAV
MOVSI B,MSAVE
CMSAVE: ANDCAM B,(A) ;TURN OFF SMACRO BITS ON CLEAR
HRRZ A,(A)
JUMPN A,CMSAVE
NCMSAV: SKIPE B,BLPNTR
PUSHJ P,PUTFS
SETZM BLPNTR
SETZM MOVED
MPC,<
IFN UMLSW!LAYSW,<
SETZM UPINS
>;IFN UMLSW!LAYSW
ROUTE,< SETZM RCL1
SETZM RCL2
>;ROUTE
SHORT,< SKIPE A,SHRTER
PUSHJ P,GIVERR
SETZM SHRTER
SETZM SERR1
SETZM SERR2
>;SHORT
>;MPC
UML,< PUSHJ P,RELWIR > ;RELEASE WIRE LIST
SKIPE B,FBDLST
PUSHJ P,PUTFS
SETZM FBDLST
LAY,< SETZM LAYLOC
SETZM SAVNAM
>;LAY
SETZM LSTNAM
PUSHJ P,FILEUP
SETZM BID
SETZM PID
SKIPE SETPNT
PUSHJ P,SBLAST
SKIPE A,DBODPN
PUSHJ P,BFLUSH
SETZM DBODPN
SKIPE A,PONPNT
PUSHJ P,PFLUSH
SETZM PONPNT
MPC,< SKIPE A,PONPN2
PUSHJ P,PFLUSH
SETZM PONPN2
PUSHJ P,CRDREL ;FLUSH PC CARD
>;MPC
MD,< SKIPE A,BODPNT
PUSHJ P,DFLUSH
SETZM BODPNT
SKIPN A,LIBLST
POPJ P,
LCLEAR: HRRZ B,(A)
HLRZ C,(A)
FSTRET(A)
FSTRET(C)
MOVE A,B
JUMPN A,LCLEAR
SETZM LIBLST
>;MD
POPJ P,
PFLUSH: FETCH(B,A,PLOC)
FETCHL(T,A,PBIT)
TLNN T,CPIN
JRST PFLSH1
FSTRET(B)
PFLSH1: FETCH(B,A,PTXT)
PUSHJ P,PUTFS
MOVE C,A
FETCH(A,A,PNXT)
RETBLK(C,POINT)
JUMPN A,PFLUSH
POPJ P,
;BFLUSH - RELEASE BODY LIST IN A
BFLUSH: MOVE B,A
FETCH(A,A,BNXT)
MD,< PUSH P,A
FETCH(C,B,BTXT)
PUSHJ P,TXTREL
POP P,A
>;MD
RETBLK(B,BODY)
JUMPN A,BFLUSH
POPJ P,
MD,<
DFLUSH: FETCH(B,A,TNXT)
PUSH P,B
PUSHJ P,TYPREL
POP P,A
JUMPN A,DFLUSH
POPJ P,
>;MD
;**C, OFFSET, MOVE, POSIT
CCENTR: HRL T,XOFF
HRR T,YOFF
JRST SETPOS ;PUT CURSOR THERE
PCENTR: MOVE T,CURSE
PICSET: HLREM T,XOFF
HRREM T,YOFF
JRST CHANGE
HOME: SETZM XOFF
SETZM YOFF
MOVEI T,0
JRST CHANGE
SETXOF: PUSHJ P,SETOFF
JRST PERRET
MOVEM T,XOFF
JRST CHANG1
SETYOF: PUSHJ P,SETOFF
JRST PERRET
MOVEM T,YOFF
JRST CHANG1
SETOFF: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/ABSOLUTE OFFSET?/]
PUSHJ P,SREADN
CAIE C,12
POPJ P, ;LOSE
MD,< ASH T,1
CAIL T,377777
POPJ P, ;OOPS!
JRST CPOPJ1 >
MPC,< ASH T,1
IDIVI T,5
JUMPN TT,ILLSTP
IDIV T,STPSIZ
JUMPN TT,ILLSTP
IMUL T,STPSIZ
CAIL T,377777
POPJ P,
JRST CPOPJ1 >
MPC<
STPERR: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/ILLEGAL STEP SIZE!
/]
SETSTP: TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/MINIMUM STEP IN MILS(DIVISIBLE BY 5 MILS)?/]
PUSHJ P,READNC
JUMPE T,INNERR
IDIVI T,5
JUMPN TT,STPERR
JUMPE T,STPERR
MOVEM T,STPSIZ
JRST CHANG1
>;MPC
MOVREL: TLNN M,DSKACT!MACACT
MD,< OUTSTR[ASCIZ/RELATIVE X,Y?/] >
MPC,< OUTSTR[ASCIZ/RELATIVE X,Y(IN MILS)?/] >
PUSHJ P,SREADN
CAIN C,ALTMOD
POPJ P,
PUSH P,T
CAIN C,12
TDZA T,T ;JUST X
PUSHJ P,SREADN
CAIN C,ALTMOD
JRST [ POP P,(P)
POPJ P,]
ASH T,1
MPC,<
IDIVI T,5
JUMPN TT,[ POP P,(P)
JRST ILLSTP]
>;MPC
POP P,TT
ASH TT,1
MPC,<
TRNE M,FLIP
MOVN TT,TT
IDIVI TT,5
JUMPN TTT,ILLSTP
IDIV TT,STPSIZ
JUMPN TTT,ILLSTP
IMUL TT,STPSIZ
MOVE TTT,TT
IDIV T,STPSIZ
JUMPN TT,ILLSTP
IMUL T,STPSIZ
MOVE TT,TTT
>;MPC
HRL T,TT
ADJUST(ADD,T,CURSE)
JRST SETPOS
MPC,<
ILLSTP: OUTSTR[ASCIZ/NOT INTEGRAL # OF STEPS!!!!
/]
POPJ P,
POSIT: TLNE M,DSKACT!MACACT
POPJ P,
OUTSTR[ASCIZ/CURSOR /]
MOVE T,CURSE
PUSHJ P,PNTXY
OUTSTR[ASCIZ/
/]
MOVEI T,1
LSH T,@MODE
TDNN T,[1PNTM!1TXTM]
POPJ P,
PUSHJ P,GETCLS
POPJ P,
FETCH(T,A,PXY)
CAMN T,CURSE
POPJ P,
OUTSTR[ASCIZ/POINT /]
PUSHJ P,PNTXY
OUTSTR[ASCIZ/
/]
POPJ P,
PNTXY: HRLM T,(P)
HLRE T,T
PUSHJ P,MILOUT
OUTCHR[11]
HLRE T,(P)
MILOUT: SKIPGE T
OUTCHR["-"]
MOVM T,T
IDIVI T,=1000*2/5
PUSH P,TT
PUSHJ P,DECOUT
POP P,T
OUTCHR["."]
IMULI T,5
ASH T,-1
CAIGE T,=100
OUTCHR["0"]
CAIGE T,=10
OUTCHR["0"]
JRST DECOUT
>;MPC
;CHECK IF LOC IN T IS ON SCREEN, IF NOT GET IT ON.
;REGARDLESS, MOVE CURSOR THERE
CHKON: TLNE M,DSKACT!MACACT
JRST SETPOS
PUSHJ P,ONSCR
JRST PICSET
JRST SETPOS
;BIG, SMALL, SHIFT SCREEN
MAKBIG: MOVEI T,1
LSH T,@MODE
TDNE T,[ANYALT]
JRST PERRET
MOVE T,NSCALE ;GET CURRENT SCALE
XCT (A)[CAIA ;INCREMENT SIZE BY ONE
LSH T,-2 ;MULT BY 1,25
LSH T,-1 ;MULT BY 1,5
JFCL] ;MULT BY 2
JUMPN T,.+2
MOVEI T,1
ADDM T,NSCALE
CHANG1: MOVE T,CURSE
CHANGE: PUSH P,T
PUSH P,TT
TRO MCHG ;WE ARE CHANGING IT
TLNN M,XWINDOW ;IF WINDOWING, CLOSEST MAY CHANGE
TRO NEEDCL
SETOM CLOSUP ;BIG LETTER WILL MOVE IN ANY CASE
MPC,< MOVE T,[%RIGHT4] >
MD,< MOVE T,[%RIGHT2] >
PUSHJ P,TRUNCP
ADD T,XOFF
HRLZM T,RIGHT
MPC,< MOVE T,[%TOP4] >
MD,< MOVE T,[%TOP2] >
PUSHJ P,TRUNCP
ADD T,YOFF
MOVEM T,TOP
MPC,< MOVE T,[%LEFT4] >
MD,< MOVE T,[%LEFT2] >
PUSHJ P,TRUNCN
ADD T,XOFF
HRLZM T,LEFT
MPC,< MOVE T,[%BOTTOM4] >
MD,< MOVE T,[%BOTTOM2] >
PUSHJ P,TRUNCN
ADD T,YOFF
MOVEM T,BOTTOM
POP P,TT
POP P,T
JRST SETPOS
TRUNCP: PUSHJ P,TRUNCD
SKIPGE TT
SUBI T,2
POPJ P,
TRUNCN: PUSHJ P,TRUNCD
SKIPLE TT
ADDI T,2
POPJ P,
TRUNCD: MOVE TT,NSCALE
MPC,< IMUL TT,STPSIZ >
ASH TT,1
IDIV T,TT
MPC,< IMUL T,STPSIZ >
ASH T,1
POPJ P,
MAKSML: MOVEI T,1
LSH T,@MODE
TDNE T,[ANYALT]
JRST PERRET
MOVE T,NSCALE ;GET CURRENT SCALE
LSH T,2
XCT (A)[SOS T,NSCALE ;DECREMENT BY 1
IDIVI T,5 ;MULT BY 4/5
IDIVI T,6 ;MULT BY 2/3
ASH T,-3] ;MULT BY 1/2
SKIPN T ;0?
MOVEI T,1 ;YES, MAKE 1
MOVEM T,NSCALE
JRST CHANG1
MAKRIT: PUSHJ P,GETMAK
JRST PERRET
MPC,< TRNE M,FLIP
MOVN T,T
>;MPC
EXCH T,XOFF
SUBM T,XOFF
JRST CHANG1
MAKLFT: PUSHJ P,GETMAK
JRST PERRET
MPC,< TRNE M,FLIP
MOVN T,T
>;MPC
ADDM T,XOFF
JRST CHANG1
MAKDWN: PUSHJ P,GETMAK
JRST ALTDWN
ADDM T,YOFF
JRST CHANG1
MAKUP: PUSHJ P,GETMAK
JRST ALTUP
EXCH T,YOFF
SUBM T,YOFF
JRST CHANG1
GETMAK: MOVEI T,1
LSH T,@MODE
TDNE T,[ANYALT]
JRST ALTMAK
MD,< MOVEI T,1 >
MPC,< MOVEI T,2 >
ASH T,11(A)
IDIV T,NSCALE
SKIPN T
MOVEI T,1 ;NEVER MOVE NONE
MPC,< ADD T,STPSIZ ;ROUND UP
SUBI T,1
IDIV T,STPSIZ
IMUL T,STPSIZ
ASH T,1
>;MPC
JRST CPOPJ1
ALTMAK: MOVEI T,1
LSH T,(A)
POPJ P,
ALTDWN: MOVN T,T ;DECREASE START LINE, (MOVE TEXT DOWN)
ALTUP: ADDM T,ALTLIN
SKIPGE ALTLIN
SETZM ALTLIN ;AVOID UNDERFLOW
SETOM LPNTR
TRO MCHG
POPJ P,
;MODE SWITCHING
DEFINE MODC(A)
< MOVEI T,A
JRST CHNGMD>
TOP3P: MODC(PNTM)
TOP3B: MODC(BODM)
TOP3L: MODC(LINM)
TOP3S: MODC(SETM)
TOP3T: MODC(TXTM)
CMODE: CLRSET ;S
CLRPNT ;B
CLRPNT ;P
CPOPJ ;L
CLRPNT ;T
CPOPJ ;A
CPOPJ ;MA
CPOPJ ;SP
MD,< CLRPNT ;BT
CPOPJ ;BTA
CLRPNT ;E
CLREDI ;EI
CLRPNT ;ET
CLRPNT ;EP
CLRGET ;EG
CPOPJ ;EA
>;MD
REPEAT NUMODES+<CMODE-.>,<CPOPJ>
;RESTORE MODE AFTER TCHNGM
RCHNGM: MOVE T,OMODE ;RESET TO OLD MODE
;PERMANENT MODE CHANGE
CHNGMD: MOVEM T,OMODE
;TEMPORARY MODE CHANGE, LEAVE OMODE A LAST CHNGMD
TCHNGM: CAMN T,MODE ;ARE WE REALLY CHANGING?
POPJ P,
TRO NEEDCL ;MUST CALL FNDCLS
EXCH T,MODE ;NEW MODE
JRST @CMODE(T)
CLRSET: TRZE STBOX ;WERE WE DRAWING A BOX?
SKIPN B,SETBOX
JRST CLRPNT ;NO
PUSHJ P,PUTFS
MOVEI T,ANGLPG
PUSHJ P,HYDPOG
SETZM SETBOX
JRST CLRPNT
MD,<
CLRGET: MOVEI T,ANGLPG
JRST HYDPOG
CLREDI: SKIPN A,CRPPNT
JRST CLRPNT
MOVEI T,1
AND T,1(A)
IOR T,CURSE
MOVEM T,1(A)
>;MD
CLRPNT: TRZ INLIN!INMOV
POPJ P,
;SIXBIT, FILEUP
LSIXOUT:
IFN DECSW!IIISW,< HLRZ T,TT
LSIXOD: IDIVI T,10
HRLM TT,(P)
JUMPE T,.+2
PUSHJ P,LSIXOD
HLRZ T,(P)
ADDI T,60
IDPB T,TTT
POPJ P,
>;IFN DECSW!IIISW
NODEC,<
NOIII,<
TLNN TT,777700
LSH TT,14
TLNN TT,770000
LSH TT,6
>;NOIII
>;NODEC
SIXOUT: JUMPE TT,CPOPJ
SETZ T,
LSHC T,6
ADDI T,40
IDPB T,TTT
JRST SIXOUT
FILEUP: SKIPN ISDPY
POPJ P,
MOVEI T,1
MOVEM T,NAMBUF
MOVE T,[NAMBUF,,NAMBUF+1]
BLT T,NAMBUF+NFWRDS-1
SKIPN TT,LSTNAM
LAY,< SKIPE SAVNAM
CAIA
>;LAY
JRST NOLAST
MOVE TTT,[POINT 7,NAMBUF]
LAY,< JUMPE TT,NOFLST >
PUSHJ P,SIXOUT
MOVEI T,"."
IDPB T,TTT
HLLZ TT,LSTEXT
PUSHJ P,SIXOUT
MOVE TT,LSTPPN
PUSHJ P,UPPPN
LAY,<
NOFLST: SKIPN TT,SAVNAM
JRST NOLAST
MOVEI T,"&"
IDPB T,TTT
PUSHJ P,SIXOUT
MOVEI T,"."
IDPB T,TTT
HLLZ TT,LSTEXT
PUSHJ P,SIXOUT
MOVE TT,SAVPPN
PUSHJ P,UPPPN
>;LAY
JRST NOLAST
UPPPN: MOVEI T,"["
IDPB T,TTT
NOCMU,<
HRLM TT,(P)
HRRI TT,0
PUSHJ P,LSIXOUT
MOVEI T,","
IDPB T,TTT
HLLZ TT,(P)
PUSHJ P,LSIXOUT
>;NOCMU
CMU,<
MOVE T,[TT,,PPNBUF]
DECCMU T,
JRST [ PUSHJ P,LSIXOUT
JRST PPNDN2 ]
SKIPA TT,[POINT 7,PPNBUF]
IDPB T,TTT
ILDB T,TT
JUMPN T,.-2
PPNDN2:
>;CMU
MOVEI T,"]"
IDPB T,TTT
POPJ P,