mirror of
https://github.com/PDP-10/its.git
synced 2026-02-28 09:27:41 +00:00
2130 lines
45 KiB
Plaintext
2130 lines
45 KiB
Plaintext
;<DRAW>MAC.FAI.65, 15-NOV-75 18:06:33, EDIT BY HELLIWELL
|
||
VERSION(MAC,5)
|
||
CHARIN: MOVE P,CHARP
|
||
MOVEM C,CHARP
|
||
TIMER C,
|
||
MOVEM C,BOOPLR
|
||
PUSHJ P,POPIT
|
||
MOVE C,CHARP ;RETURN CHAR IN C
|
||
POPJ P,
|
||
|
||
GREADY: PUSHJ P,READY
|
||
MOVEM 0,SAVER0
|
||
MOVEM M,SAVERM
|
||
SKIPN BOOPCN
|
||
POPJ P,
|
||
PUSH P,T
|
||
TIMER T,
|
||
SUB T,BOOPLR
|
||
ADDM T,BOOPLR
|
||
IDIVI T,=60
|
||
CAMGE T,BOOPCN
|
||
JRST GRDY1
|
||
PUSH P,[3]
|
||
SKIPA T,[1]
|
||
GRDY2: SLEEP T,
|
||
OUTCHR[7]
|
||
SOSL (P)
|
||
JRST GRDY2
|
||
POP P,(P)
|
||
GRDY1: POP P,T
|
||
POPJ P,
|
||
|
||
CMU,<
|
||
XCHRIN: EXCH C,CHKSVC ;SAVE CHAR AND GET BACK C
|
||
PUSHJ P,PUSHIT ;SAVE THE REGISTERS
|
||
SUBM P,P-17(P) ;MAKE THE SAVED P RELATIVE
|
||
CMU,< JSP TT,INATYO ;SAVE THE CURRENT POG INFO IN THE GDP2
|
||
SAVPOG
|
||
PASREGS
|
||
PUSHJ P,DOATYO
|
||
PUSH P,IIIX ;SAVE THE PDP-10 INFO TOO!
|
||
PUSH P,IIIY
|
||
PUSH P,IIIBRT
|
||
PUSH P,CHRSCL
|
||
PUSH P,PGLASS
|
||
>;CMU
|
||
MOVE T,P
|
||
MOVE P,CHARP ;POP THE STACK
|
||
SUB T,P ;FIGURE OUT HOW MUCH WE POPPED
|
||
CAMLE T,[PSVLEN,,PSVLEN] ;SEE IF IT'S TOO MUCH
|
||
JRST [ OUTSTR [ASCIZ/INTERNAL ERROR: PSVLEN IS TOO SMALL FOR SAVING THE PDL IN ROUTINE XCHRIN
|
||
/]
|
||
HALT . ]
|
||
MOVEM T,PSVCNT
|
||
HRLZI TT,1(P)
|
||
HRRI TT,PDLSAV
|
||
BLT TT,PDLSAV-1(T) ;SAVE THE STUFF ON THE STACK
|
||
PUSHJ P,POPIT
|
||
JSP C,[ EXCH C,DSPDSP
|
||
MOVEM C,C
|
||
MOVE C,CHKSVC
|
||
POPJ P, ] ;AND RETURN TO THE CALLER OF THE DISPLAY ROUTINES.
|
||
;WE GET HERE (@DSPDSP) WHEN WE DECIDE TO CONTINUE BECAUSE MCHG=0.
|
||
MOVE P,CHARP ;RESTORE THE PDL
|
||
HRLZI TT,PDLSAV
|
||
HRRI TT,1(P)
|
||
ADD P,PSVCNT ;BUMP THE PDL POINTER
|
||
BLT TT,(P) ;RESTORE THE CONTENTS
|
||
CMU,< JSP TT,INATYO ;RESTORE THE CURRENT POG INFO IN THE GDP2
|
||
RSTPOG
|
||
PASREGS
|
||
PUSHJ P,DOATYO
|
||
POP P,PGLASS ;RESTORE THE PDP-10 INFO ABOUT THE POG.
|
||
POP P,CHRSCL
|
||
POP P,IIIBRT
|
||
POP P,IIIY
|
||
POP P,IIIX
|
||
>;CMU
|
||
SUBM P,P-17(P) ;RE ABSOLUTIZE THE SAVED P
|
||
PUSHJ P,POPIT
|
||
POPJ P,
|
||
>;CMU
|
||
|
||
MACDSP: TLNN DSPACT ;DISPLAYING?
|
||
JRST CPOPJ1 ;NO, SAY WE'RE DONE
|
||
MOVEM C,CINST ;STORE INSTRUCTION TO GET CHAR
|
||
PUSHJ P,PUSHIT
|
||
MOVEM P,CHARP
|
||
CHECKIN
|
||
PUSHJ P,GETCLS ;UPDATE IT BEFORE DISPLAYING IT
|
||
JFCL
|
||
PUSHJ P,UPCLOS
|
||
PUSHJ P,PMODE
|
||
PUSHJ P,UPSCAL
|
||
PUSHJ P,UPLVL
|
||
PUSHJ P,UPCURS
|
||
PUSHJ P,DOSLPB
|
||
CHECKIN
|
||
PUSHJ P,DISP
|
||
NOCMU,< PUSHJ P,DOPOGS > ;HIDE ANY REQUESTED POGS
|
||
PUSHJ P,POPIT
|
||
JRST CPOPJ1
|
||
|
||
GETLET: PUSHJ P,GETLIN
|
||
CAIL C,"a"
|
||
CAILE C,"z"
|
||
CAIA
|
||
SUBI C,40
|
||
CAIL C,"A"
|
||
CAILE C,"Z"
|
||
POPJ P,
|
||
JRST CPOPJ1
|
||
|
||
GETLCH: PUSHJ P,GETLIN
|
||
CAIL C,"A"+40
|
||
CAILE C,"Z"+40
|
||
POPJ P,
|
||
SUBI C,40
|
||
POPJ P,
|
||
|
||
YORN: TLNN M,DSKACT!MACACT
|
||
OUTCHR["?"]
|
||
PUSHJ P,GETCH
|
||
JRST YORN
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
CAIN C,ALTMOD
|
||
POPJ P,
|
||
AOS (P)
|
||
CAIE C,"Y"
|
||
CAIN C,"y"
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
YORNTT: OUTCHR["?"]
|
||
INCHRW C
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
CAIN C,ALTMOD
|
||
POPJ P,
|
||
AOS (P)
|
||
CAIE C,"Y"
|
||
CAIN C,"y"
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
GETLI1: TLNN M,DSKACT!MACACT
|
||
NOSKEY,< OUTSTR[ASCIZ/
|
||
/]
|
||
>;NOSKEY
|
||
SKEY,< OUTSTR[ASCIZ/
|
||
^/]
|
||
>;SKEY
|
||
GETLIN:PUSHJ P,GETLN
|
||
JRST GETLI1
|
||
POPJ P,
|
||
|
||
GETCHM: TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/
|
||
*/]
|
||
PUSHJ P,GETCH
|
||
JRST GETCHM
|
||
POPJ P,
|
||
|
||
GETCHR: TLNN M,DSKACT!MACACT
|
||
OUTSTR [ASCIZ /
|
||
_/]
|
||
PUSHJ P,GETCH
|
||
JRST GETCHR
|
||
POPJ P,
|
||
|
||
GETLN: SETZM BITS
|
||
SKIPE C,INPNT
|
||
JRST GETMAC ;GETTING INPUT INTERNALLY
|
||
TLNE M,DSKACT
|
||
JRST [ PUSHJ P,DSKCHR
|
||
POPJ P,
|
||
JRST GETCAN]
|
||
GETLP2: MOVE C,[INCHSL C]
|
||
PUSHJ P,MACDSP
|
||
JRST GOTCL
|
||
PUSHJ P,GREADY
|
||
INCHWL C
|
||
III,< CAIN C,33
|
||
MOVEI C,11
|
||
>;III
|
||
PUSH P,T
|
||
TIMER T,
|
||
MOVEM T,BOOPLR
|
||
POP P,T
|
||
PUSHJ P,NREADY
|
||
GOTCL:
|
||
CMU,< ;I'M NOT SURE EVERYONE WANTS THIS, THOUGH THEY PROBABLY DO
|
||
CAIN C,177 ;IGNORE SPURIOUS RUBOUTS IN LINE MODE!
|
||
JRST GETLP2
|
||
>;CMU
|
||
JRST GETCAN
|
||
|
||
|
||
GETCH: SKIPE C,INPNT ;GETTING INPUT INTERNALLY?
|
||
JRST GETMAC ;YES
|
||
ZERBTS: SETZM BITS
|
||
GETLP1: TLNE M,DSKACT
|
||
JRST [ PUSHJ P,DSKCHR
|
||
POPJ P,
|
||
JRST GETCAN]
|
||
III,< MOVE C,[INSKIP]
|
||
PUSHJ P,MACDSP
|
||
CAIA
|
||
PUSHJ P,GREADY
|
||
PUSHJ P,UPLHY ;UPDATE DISPLAY
|
||
TTCALL 17,C ;READ CHAR WITH BITS
|
||
>;III
|
||
NOIII,< MOVE C,[INCHRS C]
|
||
PUSHJ P,MACDSP
|
||
JRST GETCAN
|
||
PUSHJ P,GREADY
|
||
INCHRW C
|
||
>;NOIII
|
||
PUSH P,T
|
||
TIMER T,
|
||
MOVEM T,BOOPLR
|
||
POP P,T
|
||
PUSHJ P,NREADY
|
||
GETCAN: SKIPE LCFLAG ;CONVERT LC TO UC?
|
||
JRST NOLCCN ;NO
|
||
CAIL C,"a"
|
||
CAILE C,"z"
|
||
CAIA
|
||
SUBI C,40
|
||
NOLCCN:
|
||
SKEY,<
|
||
III,< CAIE C,11 > ;MAKE TAB BE THE C-M-BIT KEY
|
||
NOIII,< CAIE C,33 >
|
||
CAIN C,175
|
||
JRST ALTXFN
|
||
CAIN A,176
|
||
JRST [
|
||
ALTXFN: MOVEI C,200 ;PUT IN CONTROL-META BITS
|
||
ADDB C,BITS
|
||
TRNN C,1000 ;OVERFLOW?
|
||
JRST GETLP1 ;NO
|
||
MOVEI C,ALTMOD
|
||
SETZM BITS
|
||
JRST .+1]
|
||
CAIN C,177 ;BS?
|
||
JRST [ SKIPN BITS ;ONLY IF BITS TYPED, SO LOSER CAN TYPE BS
|
||
JRST .+1
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/XXX /]
|
||
JRST ZERBTS]
|
||
>;SKEY
|
||
NOSKEY,<
|
||
CAIN C,CTRL
|
||
JRST [ MOVEI C,200
|
||
MOVEM C,BITS
|
||
JRST GETLP1]
|
||
CAIN C,META
|
||
JRST [ MOVEI C,400
|
||
MOVEM C,BITS
|
||
JRST GETLP1]
|
||
CAIN C,CTLMTA
|
||
JRST [ MOVEI C,600
|
||
MOVEM C,BITS
|
||
JRST GETLP1]
|
||
CAIN C,TTYCM
|
||
JRST [
|
||
NOCMU,< SKIPE ISDPY
|
||
JRST DODEPA
|
||
>;NOCMU
|
||
MOVE C,BITS
|
||
TRCE C,200
|
||
TRC C,400
|
||
MOVEM C,BITS
|
||
JRST GETLP1]
|
||
>;NOSKEY
|
||
CAIN C,15
|
||
JRST GETLP1
|
||
IOR C,BITS
|
||
DODEPA:
|
||
ITS,< CAIE C,14 > ;FF refreshes display also
|
||
CAIN C,600+"!" ;IS THIS THE MAGIC CHAR.?
|
||
JRST [ PUSHJ P,DSPOUT ;yes, refresh display
|
||
POPJ P,]
|
||
CAIN C,600+LAMBDA ;DISK CONTINUE CHAR?
|
||
JRST DSKCON ;YES, CONTINUE IT
|
||
TLNE M,DSKACT ;DOING DISK INPUT?
|
||
JRST DODEPB ;YES, NO OUTPUT CHECK!
|
||
SKIPE DSKOPN ;DISK OUTPUT?
|
||
PUSHJ P,DSKOCHR ;YES
|
||
DODEPB: CAIE C,12 ;DEC ONLY USES LF
|
||
JRST DODEP
|
||
PUSH P,T
|
||
MOVE T,MACPNT
|
||
SKIPL -4(T) ;I ACTIVE?
|
||
JRST TREST ;NO, RESTORE T AND GO ON
|
||
MOVEI C,200+":" ;IT IS, CHANGE TO END OF ;I
|
||
TREST: POP P,T
|
||
DODEP: SKIPN CDEPPN ;ARE WE DEPOSITING A DEFINITION?
|
||
JRST DODEP1
|
||
PUSH P,T ;YES, SAVE T
|
||
MOVE T,CDEPPN ;GET DEPOSIT LIST POINTER
|
||
PUSH P,TT ;SAVE TT
|
||
PUSH P,TTT ;SAVE TTT
|
||
DODLOP: MOVE TT,1(T) ;GET BYTE POINTER
|
||
TLNE TT,770000 ;END OF WORD?
|
||
JRST DOTP4 ;NO
|
||
GETFS (TTT)
|
||
SETZM (TTT) ;CLEAR POINTER TO NEXT
|
||
SETZM 1(TTT) ;AND DATA
|
||
HRRM TTT,-1(TT) ;DEPOSIT POINTER HERE
|
||
HRR TT,TTT
|
||
DOTP4: IDPB C,TT ;DEPOSIT CHR.
|
||
MOVEM TT,1(T) ;DEPOSIT NEW POINTER
|
||
HRRZ T,(T) ;GET NEXT THING IN DEPOSIT LIST
|
||
JUMPN T,DODLOP ;LOOP IF MORE DEPOSITING TO DO
|
||
POP P,TTT
|
||
POP P,TT
|
||
POP P,T
|
||
DODEP1: TLNN IGNORE ;DOING DEFINITION OR FALSE PART OF ;F?
|
||
TRNN C,600 ;NO, BITS?
|
||
JRST CPOPJ1
|
||
CAIN C,":"+200 ;IS THIS ;R0?
|
||
JRST ITRETX ;YES
|
||
MOVEM C,1(P)
|
||
ANDI C,177
|
||
CAIN C,";" ;OR SEMI COLON
|
||
JRST DOSEMI ;WILL POPJ
|
||
CAIE C,12 ;DON'T PUT BITS BACK ON LF!
|
||
MOVE C,1(P)
|
||
JRST CPOPJ1 ;IT'S A CHARACTER
|
||
|
||
ITRETX: PUSHJ P,PUSHIT
|
||
PUSHJ P,ITRETZ
|
||
PUSHJ P,POPIT
|
||
POPJ P, ;TELL HIM TO ASK AGAIN
|
||
|
||
DOSEMI: PUSHJ P,PUSHIT
|
||
PUSHJ P,ITSEM ;DO THE SEMICOLON THING
|
||
PUSHJ P,POPIT
|
||
POPJ P,
|
||
|
||
GETMAC: TLNN C,770000 ;END OF WORD?
|
||
JRST GETBYT
|
||
GOTBYT: ILDB C,INPNT ;GET CHR.
|
||
JUMPN C,DODEP
|
||
ENDMAC: MOVEI C,":"+200 ;GET A ;R0 AT END
|
||
JRST DODEP
|
||
|
||
GETBYT: HRR C,-1(C)
|
||
TRNN C,-1 ;END OF LIST?
|
||
JRST ENDMAC ;YES, GENERATE <CTRL>:
|
||
MOVEM C,INPNT ;DEPOSIT INCREMENTED POINTER
|
||
JRST GOTBYT
|
||
;"D"
|
||
ITDEF: PUSHJ P,ITMAC ;STARTS JUST LIKE NAMED MACRO
|
||
HRRZ T,MACPNT
|
||
ITSKPF: TLOE IGNORE ;START IGNORING
|
||
POPJ P, ;ALREADY IGNORING, LEAVE
|
||
PUSH P,T
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/IGNORING!
|
||
/]
|
||
ITLOP1: SETZ B, ;KEEP LEVEL HERE
|
||
ITLOOP: PUSHJ P,GETLN
|
||
JRST ITLOOP ;GET AGAIN
|
||
CAIN C,":"+200 ;ITZERO?
|
||
JRST ITPOP ;UP A LEVEL
|
||
TRZN C,600 ;ANY BITS?
|
||
JRST ITLOOP
|
||
CAIE C,";" ;YES, IS IT SEMI COLON?
|
||
JRST ITLOOP ;NO
|
||
PUSHJ P,MREADN ;GET ARG AND COMMAND
|
||
TRZ C,600 ;CLEAR BITS
|
||
CAIN C,"R"
|
||
JRST ITPOPA
|
||
CAIN C,"S" ;THIS ENDS IT ALL
|
||
JRST ITPOP
|
||
CAIE C,"M" ;THESE 3 HAVE MATCHING ;R'S OR $:'S
|
||
CAIN C,"P"
|
||
AOJA B,ITLOOP
|
||
CAIN C,"D"
|
||
AOJA B,ITLOOP
|
||
JRST ITLOOP
|
||
|
||
ITPOPA: PUSHJ P,READN ;EAT ARG TO ;R
|
||
ITPOP: SOJGE B,ITLOOP
|
||
PUSHJ P,ITRETZ ;THIS WILL POP UP A LEVEL
|
||
HRRZ TT,MACPNT
|
||
CAML TT,(P) ;HAVE WE PASSED WHERE WE WANTED TO STOP?
|
||
JRST ITLOP1 ;NO
|
||
POP P,(P) ;POP OFF LEVEL
|
||
TLZ IGNORE ;YES, STOP IGNORING
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/END IGNORING!
|
||
/]
|
||
POPJ P,
|
||
;"F"
|
||
ITFLAG: PUSHJ P,READN ;GET LEVEL TO RETURN UP TO
|
||
MOVE TT,T
|
||
IMULI TT,5 ;MULT LEVEL BY 5
|
||
MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
SUB T,TT ;BACK UP CORRECT NUMBER OF LEVELS
|
||
ANDI T,-1
|
||
CAIG T,MACPDL ;TOO FAR?
|
||
JRST [ADDI T,5 ;YES
|
||
JRST .-1]
|
||
PUSH P,T ;SAVE POINTER TO MACPDL
|
||
MOVE TT,C
|
||
CAIN TT,"-"
|
||
JRST [ PUSHJ P,GETWRD
|
||
JRST WASNOT]
|
||
MOVE A,[POINT 6,T]
|
||
SETZ T,
|
||
PUSHJ P,ISCHRX
|
||
WASNOT: EXCH TT,C
|
||
CAIE TT,12
|
||
JRST ERRXT
|
||
MOVSI TT,-FLGLEN ;TABLE LENGTH
|
||
CAME T,FLGNAM(TT)
|
||
AOBJN TT,.-1
|
||
POP P,T
|
||
JUMPGE TT,PERRET ;ERROR RETURN IF FLAG NOT FOUND
|
||
HRRZ TT,TT ;CLEAR COUNT IN LEFT HALF
|
||
XCT FLGTAB(TT)
|
||
TDZA TT,TT ;FALSE
|
||
SETO TT, ;TRUE
|
||
CAIN C,"-" ;DID HE TYPE ?
|
||
SETCA TT, ;FLAG YES
|
||
JUMPE TT,CPOPJ ;NOOP IF NOT TRUE
|
||
JRST ITSKPF ;AND START IGNORING
|
||
|
||
ERRXT: POP P,(P)
|
||
JRST ERRX
|
||
|
||
DEFINE FLGMAC(A,B,C)
|
||
<
|
||
IFIDN<B><BOTH>< <SIXBIT/A/> >
|
||
IFIDN<B><D><MD,<<SIXBIT/A/>> >
|
||
IFIDN<B><PC><MPC,<<SIXBIT/A/>> >
|
||
>
|
||
FLGNAM: FLAGS ;MACRO FROM DATA FILE
|
||
FLGLEN__.-FLGNAM
|
||
;HERE ARE SOME FLAG TESTING ROUTINES
|
||
DEFINE FLGMAC(A,B,C)
|
||
<
|
||
IFIDN<B><BOTH>< IFIDN<C><><SKIPN A;>C >
|
||
IFIDN<B><D><MD,< IFIDN<C><><SKIPN A;>C> >
|
||
IFIDN<B><PC><MPC,< IFIDN<C><><SKIPN A;>C> >
|
||
>
|
||
FLGTAB: FLAGS ;COMMAND TO EXECUTE FOR FLAG TEST
|
||
|
||
;ROUTINE FOR CLOSES FLAG
|
||
CLTEST: PUSH P,A
|
||
PUSHJ P,GETCLS
|
||
CAIA
|
||
AOS -1(P) ;THERE IS A CLOSEST, SKIP
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
;ROUTINE FOR RITEON FLAG
|
||
ROTEST: PUSH P,T
|
||
PUSH P,A
|
||
MOVEI T,1
|
||
LSH T,@MODE
|
||
TDNN T,[MD,<1BTXTM!1EDTM!1EDTTM!1EDTPM!>1SETM!1BODM!1PNTM!1TXTM]
|
||
JRST ROTST1
|
||
PUSHJ P,GETCLS
|
||
JRST ROTST1
|
||
MOVE T,1(A)
|
||
TDZ T,[1,,1]
|
||
CAMN T,CURSE
|
||
AOS -2(P)
|
||
ROTST1: POP P,A
|
||
POP P,T
|
||
POPJ P,
|
||
|
||
;ROUTINE FOR EXPR FLAG
|
||
FEXPR: PUSHJ P,PUSHIT
|
||
PUSHJ P,EXPSET ;READ AND TEST EXPRESSION
|
||
JFCL ;GIVE FALSE RETURN ON ERROR
|
||
JRST [ PUSHJ P,POPIT ;FALSE
|
||
POPJ P,]
|
||
PUSHJ P,POPIT ;TRUE
|
||
JRST CPOPJ1
|
||
;SEMI COLON DISPATCH RENMAC DELMAC PMACRO
|
||
ITSEM: SKIPN T,CDEPPN ;ARE WE DEPOSITING A DEFINITON?
|
||
JRST NOMFIX ;NO, NOTHING TO DO
|
||
DOFIX: LDB C,1(T) ;GET SEMI-COLON
|
||
TRO C,600 ;MAKE SURE IT ALWAYS LOOKS LIKE A MACRO COMMAND
|
||
DPB C,1(T) ;AND PUT IT BACK
|
||
HRRZ T,(T)
|
||
JUMPN T,DOFIX ;DO SOME MORE?
|
||
NOMFIX: PUSHJ P,MREADN ;GET # AND CHAR WHICH FOLLOWS
|
||
SEMCAL: TRZ C,600 ;IGNORE CONTROL BITS
|
||
CAIL C,"A"+40
|
||
SUBI C,40 ;CONVERT LC TO UC
|
||
;HERE ARE THE COMMANDS WHICH DON'T PUSH THE MACRO PDL.
|
||
CAIN C,"R"
|
||
JRST ITRET
|
||
CAIN C,"O"
|
||
JRST ITOUT
|
||
CAIN C,"F"
|
||
JRST ITFLAG
|
||
CAIN C,"S"
|
||
JRST ITSTOP
|
||
;HERE ARE THE COMMANDS WHICH DO PUSH THE MACRO PDL.
|
||
HLRE T,MACPNT
|
||
CAML T,[-5] ;ENOUGH ROOM FOR ANOTHER MACRO LEVEL?
|
||
JRST [ OUTSTR[ASCIZ/
|
||
|
||
****** MACRO PDL OVERFLOW ******
|
||
|
||
/]
|
||
JRST ITSTOP]
|
||
CAIN C,"M" ;IS IT M?
|
||
JRST ITMAC ;YES
|
||
CAIN C,"P"
|
||
JRST ITPNT
|
||
CAIN C,"D"
|
||
JRST ITDEF
|
||
CAIN C,"T"
|
||
JRST ITTYP
|
||
CAIN C,"U"
|
||
JRST ITOOPS
|
||
CAIN C,"C"
|
||
JRST ITCAL
|
||
CAIN C,"A"
|
||
JRST ITARG
|
||
CAIN C,"N"
|
||
JRST ITSARG
|
||
CAIN C,"L"
|
||
JRST ITLET
|
||
CAIN C,"V"
|
||
JRST ITVAR
|
||
CAIN C,"E"
|
||
JRST ITEVAL
|
||
CAIN C,"X"
|
||
JRST ITEXPR
|
||
CAIN C,"#"
|
||
JRST ITDEQU
|
||
CAIN C,"="
|
||
JRST ITEQU
|
||
CAIN C,"H"
|
||
JRST ITVAR0
|
||
CAIN C,"I"
|
||
JRST ITIN
|
||
CAIN C,"Y"
|
||
JRST ITYANK
|
||
CAIN C,"G"
|
||
JRST ITLOWG
|
||
CAIN C,"^"
|
||
JRST ITCTRL
|
||
JRST PERRET
|
||
|
||
RENMAC: PUSHJ P,ITGET
|
||
JRST NXMAC
|
||
HRLM E,(P)
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/TYPE NEW MACRO NAME./]
|
||
PUSHJ P,ITGETA
|
||
JRST ITMOK
|
||
TLNE M,DSKACT!MACACT
|
||
JRST PERRET
|
||
OUTSTR[ASCIZ/SORRY, ALREADY IN USE!
|
||
/]
|
||
POPJ P,
|
||
|
||
UNSAVM: SKIPA F,[ANDCAM T,(E)]
|
||
SAVMAC: MOVE F,[IORM T,(E)]
|
||
PUSHJ P,ITGET
|
||
JRST NXMAC
|
||
MOVSI T,MSAVE
|
||
XCT F ;SET OR CLEAR BIT
|
||
POPJ P,
|
||
|
||
ITMOK: HLRZ E,(P)
|
||
HRRZ B,1(E) ;GET OLD NAME
|
||
HRRM D,1(E) ;STORE NEW ONE
|
||
JRST PUTFS
|
||
|
||
DELMAC: HRRZ T,MACPNT
|
||
CAIL T,MACPDL
|
||
JRST NINMAC
|
||
PUSHJ P,ITGET ;GET MACRO
|
||
JRST NXMAC
|
||
HRRZ T,MACPNT
|
||
CAIL T,MACPDL
|
||
JRST NINMAC
|
||
;ENTER HERE WITH E:MACRO TO DELETE, C:PREVIOUS MACRO
|
||
DELMC1: HRRZ T,(E)
|
||
HRRM T,(C) ;LINK HIM OUT
|
||
HRRZ B,1(E)
|
||
PUSHJ P,PUTFS ;GIVE BACK NAME
|
||
HLRZ B,1(E)
|
||
PUSHJ P,PUTFS ;GIVE BACK BODY
|
||
MOVE TT,E ;SAVE COPY OF MACRO HEADER
|
||
FSTRET(E) ;GIVE BACK HEADER
|
||
MOVE T,MODE
|
||
CAIN T,MALTM
|
||
CAME TT,REMMAC ;DID WE JUST DELETE MACRO WE WERE EDITING?
|
||
POPJ P,
|
||
TRO MCHG
|
||
MOVE T,MODALT
|
||
JRST CHNGMD ;LEAVE MACRO ALTER MODE
|
||
|
||
DELMCS: HRRZ T,MACPNT
|
||
CAIL T,MACPDL
|
||
JRST NINMAC
|
||
MOVEI E,MDPNT
|
||
DLMCS1: MOVE C,E ;SAVE PREVIOUS
|
||
DLMCS2: HRRZ E,(C) ;GET NEXT
|
||
JUMPE E,CPOPJ ;DONE IF NO MORE
|
||
HRRZ T,1(E) ;GET MACRO NAME
|
||
PUSHJ P,OUTTXT ;TYPE IT
|
||
HRL E,C
|
||
PUSHJ P,YORN
|
||
POPJ P, ;QUIT ON ALT
|
||
JRST DLMCS1 ;GET NEXT IF NO
|
||
HLRZ C,E
|
||
HRRZ T,MACPNT
|
||
CAIL T,MACPDL
|
||
JRST NINMAC ;IF HE STARTED A MACRO, BLOW HIM OUT OF THE WATER
|
||
PUSHJ P,DELMC1 ;DELETE IF YES
|
||
JRST DLMCS2 ;GET NEXT FROM C THIS TIME
|
||
|
||
NINMAC: TLNE M,DSKACT!MACACT
|
||
JRST PERRET
|
||
OUTSTR[ASCIZ/NOT INSIDE MACRO!!
|
||
/]
|
||
POPJ P,
|
||
|
||
MREADN: PUSHJ P,GETCHR
|
||
SETZ A,
|
||
CAIE C,"-"
|
||
JRST MREADP
|
||
PUSHJ P,MREADM
|
||
MOVN A,A
|
||
POPJ P,
|
||
|
||
MREADM: SETZ A,
|
||
MREADO: PUSHJ P,GETCH
|
||
JRST MREADO
|
||
MREADP: CAIL C,"0"
|
||
CAILE C,"9"
|
||
POPJ P,
|
||
IMULI A,=10
|
||
ADDI A,-"0"(C)
|
||
JRST MREADO
|
||
|
||
PMACRO: PUSHJ P,ITGET ;WHICH MACRO
|
||
JRST NXMAC
|
||
TVOFF
|
||
HLRZ E,1(E) ;GET POINTER TO BODY
|
||
ADD E,[POINT 9,1]
|
||
PMAC1: TLNE E,770000 ;END OF WORD?
|
||
JRST PMAC2
|
||
HRR E,-1(E)
|
||
TRNE E,-1 ;END OF MACRO?
|
||
JRST PMAC2 ;NO
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
TVON
|
||
POPJ P,
|
||
|
||
PMAC2: ILDB C,E ;GET CHAR
|
||
JUMPE C,PMAC1
|
||
NOSKEY,< TRC C,600
|
||
TRCN C,600 ;CTRL META?
|
||
JRST [ ANDI C,177 ;YES
|
||
OUTCHR[CTLMTA]
|
||
JRST PMAC3]
|
||
TRZE C,200 ;CTRL?
|
||
OUTCHR[CTRL]
|
||
TRZE C,400 ;META?
|
||
OUTCHR[META]
|
||
PMAC3:
|
||
>;NOSKEY
|
||
SKEY,< MOVE T,C
|
||
LSH T,-7
|
||
CAIA
|
||
OUTCHR["$"]
|
||
SOJGE T,.-1
|
||
>;SKEY
|
||
CAIN C,12
|
||
JRST [ OUTSTR[ASCIZ/
|
||
/]
|
||
JRST PMAC1]
|
||
SKEY,< CAIGE C,40
|
||
JRST [ CAIE C,11
|
||
CAIN C,ALTMOD
|
||
JRST .+1
|
||
ADDI C,100
|
||
OUTCHR["^"]
|
||
JRST .+1]
|
||
>;SKEY
|
||
OUTCHR C
|
||
JRST PMAC1
|
||
;"P" "V"
|
||
ITPNT: HRRZ T,MACPNT
|
||
CAIGE T,MACPDL ;IS THIS TOP LEVEL?
|
||
JRST ITLAST ;YES DO ";MLAST"
|
||
MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
TLNE M,MACACT
|
||
JRST GOTINP ;YES
|
||
SKIPE B,CDEPPN ;ARE WE ALREADY DEPOSITING?
|
||
JRST GOTDEP ;YES
|
||
GETFS (B) ;NO
|
||
SETZM (B) ;CLEAR "TO NEXT" POINTER
|
||
HRRZM B,CDEPPN ;DEPOSIT DEPOSIT LIST POINTR
|
||
GETFS (C)
|
||
HRLM C,(B) ;DEPOSIT POINTER TO START OF CHAIN
|
||
SETZM (C)
|
||
IMCON1: SETZM 1(C)
|
||
HRLI C,441100 ;MAKE A BYTE POINTER
|
||
ADDI C,1
|
||
MOVEM C,1(B) ;DEPOSIT POINTER
|
||
PUSH T,B ;PUSH POINTER TO THING TO REMOVE
|
||
SKIPA
|
||
GOTDEP: PUSH T,[0] ;DON'T REMOVE ANYTHING
|
||
SETZM BRKCHR
|
||
PUSH T,[0] ;MAKE PLACE TO SAVE CDEPPN LATER ON
|
||
PUSH T,1(B) ;PUSH POINTER TO START OF LOOP
|
||
GOTRET: PUSH T,[0] ;MAKE PLACE TO SAVE COUNT
|
||
PUSH T,[-1] ;MAKE PLACE TO SAVE POINTER TO END OF LOOP
|
||
GOTRTV: MOVEM T,MACPNT ;SAVE PDL POINTER
|
||
TLNE M,DSKACT!MACACT
|
||
POPJ P,
|
||
HRRZS T
|
||
SUBI T,MACPDL-1
|
||
IDIVI T,5
|
||
OUTSTR[ASCIZ/
|
||
ENTERING MACRO LEVEL /]
|
||
PUSHJ P,DECOUT
|
||
OUTSTR[ASCIZ/.
|
||
/]
|
||
POPJ P,
|
||
|
||
GOTINP: PUSH T,[0] ;DON'T REMOVE ANYTHING
|
||
SETZM BRKCHR
|
||
PUSH T,[0] ;MAKE PLACE TO SAVE CDEPPN LATER
|
||
PUSH T,INPNT ;SAVE CURRENT INPUT POINTER AS LOOP START POINT
|
||
JRST GOTRET
|
||
|
||
;VARIABLE INPUT, TTY INPUT FIRST TIME THROUGH LOOP
|
||
ITVAR: PUSHJ P,READN ;READ LEVEL NUMBER
|
||
MOVE TT,T
|
||
IMULI TT,5 ;MULT LEVEL BY 5
|
||
MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
SUB T,TT ;BACK UP CORRECT NUMBER OF LEVELS
|
||
ANDI T,-1
|
||
CAIG T,MACPDL ;TOO FAR?
|
||
JRST [ ADDI T,5 ;YES
|
||
TLNN M,MACACT!DSKACT
|
||
OUTSTR[ASCIZ/TRUNCATING MACRO LEVEL!
|
||
/]
|
||
JRST .-1]
|
||
HRRZ TT,MACPNT ;CHECK IF ALL INTERVENING MACROES ARE IN FIRST TIME
|
||
VARCHK: SKIPE -1(T) ;FIRST TIME AT THIS LEVEL?
|
||
JRST ITCAL ;NO, DO ";C"
|
||
ADDI T,5
|
||
CAIG T,(TT) ;CHECK ALL INTERVENING MACROES YET?
|
||
JRST VARCHK ;NO
|
||
PUSHJ P,ITMACS
|
||
MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
GETFS (B)
|
||
HRRZ B,B
|
||
PUSH T,B ;THING TO RETURN LATER
|
||
SETZM BRKCHR
|
||
PUSH T,CDEPPN ;WE DON'T NEED TO DEPOSIT NEW DEFINITION (WILL ALWAYS BE TYPED)
|
||
HRRZM B,CDEPPN ;.....
|
||
GETFS (C)
|
||
HRLM C,1(E) ;PUT IN LINK TO TEXT
|
||
HRLZM C,(B) ;...
|
||
SETZM (C)
|
||
HRROS (C) ;MARK AS MACRO (SO IT WON'T GET DELETED)
|
||
SETZM 1(C)
|
||
HRLI C,441100 ;MAKE A BYTE POINTER
|
||
ADDI C,1
|
||
MOVEM C,1(B) ;DEPOSIT POINTER
|
||
PUSH T,1(B) ;LOOP START LOC
|
||
PUSH T,[0] ;MAKE PLACE FOR COUNT
|
||
PUSH T,INPNT ;SAVE CURRENT INPUT POINTER
|
||
SETZM INPNT ;TAKE INPUT FROM TTY
|
||
PUSHJ P,RSTMAC
|
||
PUSHJ P,GOTRTV
|
||
TLNE M,DSKACT ;DISK INPUT ACTIVE?
|
||
POPJ P, ;YES
|
||
OUTSTR[ASCIZ/TYPE VALUE OF /]
|
||
HRRZ T,1(E)
|
||
PUSHJ P,OUTTXT
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
POPJ P,
|
||
;":" "R" "S"
|
||
ITRETZ:
|
||
; TLNN M,MACACT!DSKACT ;DISK OR MACRO ACTIVE?
|
||
; OUTSTR[ASCIZ/
|
||
;/] ;NO, ECHO CRLF
|
||
MOVE A,MACPNT
|
||
HRRZ B,A
|
||
CAIG B,MACPDL
|
||
POPJ P,
|
||
SETOM -1(A) ;MAKE COUNT BE OUT NOW
|
||
JRST ITSTP2
|
||
|
||
ITRET: PUSHJ P,READN ;READ NUMBER OF TIMES TO ITERATE
|
||
CAIE C,"#" ;THIS SPECIAL CHAR?
|
||
JRST ITRTLF ;NO, LOSE
|
||
JUMPN T,INNERR ;ERROR IF NUMBER PRECEEDING
|
||
MOVE T,FNDNUM ;USE COUNT OF THINGS FOUND
|
||
PUSHJ P,GETLIN ;GET LF
|
||
ITRTLF: CAIE C,12 ;MUST BE LF
|
||
JRST INNERR ;LOSE
|
||
MOVE A,MACPNT ;GET PDL POINTER
|
||
HRRZ B,A ;GET ADDRESS PART
|
||
CAIG B,MACPDL ;BACK AT START?
|
||
POPJ P, ;YES, LEAVE
|
||
SKIPGE B,-1(A) ;GET COUNT. ANY COUNT YET?
|
||
JRST DONBEF ;YES, THIS IS NOT THE FIRST TIME THROUGH THIS LOOP
|
||
MOVN B,T ;NEGATE COUNT
|
||
HRLZ B,B ;DEPOSIT COUNT IN LT HF, # OF TIMES THROUGH LOOP IN RT HF
|
||
MOVEM B,-1(A) ;DEPOSIT
|
||
ITSTP2: MOVE C,INPNT ;GET CURRENT INPUT POINTER
|
||
MOVSI D,1
|
||
TDNE D,(A) ;ALREADY SAVED?
|
||
MOVEM C,(A) ;NO, SAVE
|
||
MOVE T,CDEPPN ;GET DEPOSIT LIST POINTER
|
||
SKIPN -3(A)
|
||
MOVEM T,-3(A) ;SAVE IT
|
||
SETZM CDEPPN ;DON'T DEPOSIT WHILE LOOPING
|
||
DONBEF: TLNE IGNORE ;ARE WE TRYING TO IGNORE?
|
||
JRST DONDON ;YES, MAKE BELIEVE COUNT IS OUT
|
||
MOVE B,-1(A) ;GET COUNT
|
||
AOBJP B,DONDON ;INC COUNTS, DONE?
|
||
MOVEM B,-1(A) ;NO, STO IT
|
||
MOVE C,-2(A) ;GET POINTER TO START OF LOOP
|
||
MOVEM C,INPNT ;TAKE INPUT FROM THERE
|
||
RSTMAC: SKIPE INPNT
|
||
TLOA M,MACACT
|
||
TLZN M,MACACT ;TURN OFF, AND IF WAS ALREADY OFF
|
||
JRST DSPSET ;JUST CALC STATE OF DSPACT
|
||
PUSHJ P,DSPSET ;ELSE CALC DSPACT
|
||
JRST ENDDSP ;AND CHECK DISPLAY
|
||
|
||
DONDON: POP A,INPNT ;RESTORE INPUT POINTER
|
||
PUSHJ P,RSTMAC ;FIX BIT
|
||
POP A,TT ;THROW AWAY COUNT
|
||
POP A,TT ;SAVE LOOP-START POINTER FOR CHECK LATER
|
||
POP A,CDEPPN ;RESTORE DEPOSIT LIST POINTER
|
||
HRRZS CDEPPN
|
||
POP A,B ;GET THING-TO-THROW-AWAY POINTER
|
||
HRRZ B,B ;CLEAR FLAGS AND BRKCHR
|
||
MOVEM A,MACPNT ;STORE MACRO PDL POINTER
|
||
HRRZ T,A
|
||
CAIGE T,MACPDL
|
||
TDZA T,T
|
||
HLRZ T,-4(T)
|
||
ANDI T,177
|
||
MOVEM T,BRKCHR ;RESTORE BRKCHR FROM MACRO NOW IN FORCE (IF ANY)
|
||
JUMPE TT,NOLEVP ;IF NOT LOOP START POINTER, DON'T PRINT LEVEL
|
||
TLNE M,DSKACT!MACACT
|
||
JRST NOLEVP
|
||
HRRZ T,A
|
||
SUBI T,MACPDL-1
|
||
IDIVI T,=5
|
||
ADDI T,1
|
||
OUTSTR[ASCIZ/LEAVING MACRO LEVEL /]
|
||
PUSHJ P,DECOUT
|
||
OUTSTR[ASCIZ/.
|
||
/]
|
||
NOLEVP: JUMPE B,CPOPJ ;NOTHING TO THROW AWAY
|
||
MOVEI A,CDEPPN ;GET DEPOSIT LIST POINTER
|
||
DONDN1: HRRZ D,(A) ;GET POINTER
|
||
JUMPE D,DARN2
|
||
CAMN B,D ;SAME?
|
||
JRST DONDN2 ;YES
|
||
MOVE A,D ;NO, TRY NEXT
|
||
JRST DONDN1
|
||
DONDN2: HRRZ C,(B) ;GET POINTER TO NEXT
|
||
HRRM C,(A) ;DEPOSIT POINTER AROUND
|
||
DARN2: MOVSS (B)
|
||
HRRZ C,(B) ;GET FLAG
|
||
HLRZ C,(C)
|
||
JUMPE C,PUTFS ;IF NOT A MACRO, RETURN WHOLE THING TO FS
|
||
FSTRET (B) ;OTHERWISE RETURN ONLY FIRST THING
|
||
POPJ P,
|
||
|
||
ABMAC: MOVE T,MACPNT
|
||
CAMG T,[-MPDLEN,,MACPDL]
|
||
POPJ P,
|
||
GETFS(B)
|
||
SETZM (B)
|
||
MOVE T,[BYTE(9)";"+600,"S"]
|
||
MOVEM T,1(B)
|
||
TLZ IGNORE
|
||
JRST ITLET2
|
||
|
||
ITSTOP: MOVE A,MACPNT
|
||
HRRZ B,A
|
||
TLZ IGNORE
|
||
CAIG B,MACPDL
|
||
POPJ P, ;NOT DOING ANY MACRO HACKING NOW
|
||
SETOM -1(A) ;TO COUNT OUT THIS TIME
|
||
PUSHJ P,ITSTP2 ;FAKE A ;R
|
||
JRST ITSTOP ;& TRY AGAIN AT NEXT LEVEL
|
||
;"M" "C" , STUFF SUBRS
|
||
|
||
;COME HERE TO GENERATE STOP ON ERROR DURING MACRO
|
||
ITERR: OUTSTR[ASCIZ/DOING ;T
|
||
/]
|
||
MOVEI B,0
|
||
JRST MACRT1
|
||
|
||
ITMACS: PUSHJ P,TREADV ;GET MACRO NAME
|
||
MOVE D,B ;HOLD POINTER TO IT
|
||
;ENTER HERE WITH MACRO NAME IN D
|
||
ITMACI: SKIPE 1(D)
|
||
JRST ITMLP0
|
||
MOVE E,[ASCIZ/NIL/]
|
||
MOVEM E,1(D)
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/NAMING MACRO AS NIL
|
||
/]
|
||
ITMLP0: MOVEI E,MDPNT ;GET POINTER TO MACROS
|
||
ITMLP1: HRRZ E,(E) ;GET POINTER TO MACRO
|
||
JUMPE E,NOMOTM ;NONE? ( OR NO MORE?)
|
||
HRRZ A,1(E) ;GET NAME POINTER
|
||
MOVE B,D ;GET OTHER NAME POINTER
|
||
PUSHJ P,TXTMAT ;SEE IF THE SAME
|
||
JRST ITMLP1 ;NO, TRY NEXT
|
||
HLRZ B,1(E) ;SAME, GET POINTER TO BODY
|
||
PUSHJ P,PUTFS ;RETURN TO FREE STORAGE
|
||
HRRZ B,1(E) ;GIVE BACK OLD NAME
|
||
HRRM D,1(E) ;NOT NEW (HIGHER UPS LOOK AT IT)
|
||
JRST PUTFS ;RETURN TO FREE STORAGE
|
||
|
||
NOMOTM: GETFS (E) ;GET FREE STORAGE
|
||
MOVE B,MDPNT ;GET MACRO POINTER
|
||
MOVEM B,(E) ;LINK NEW ONE IN
|
||
HRRM D,1(E) ;PUT IN NAME
|
||
HRRZM E,MDPNT ;(LINK IN)
|
||
POPJ P,
|
||
|
||
ITLAST: PUSH P,A ;SAVE ARG
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/;MLAST/]
|
||
GETFS(D)
|
||
SETZM (D)
|
||
MOVE T,[ASCIZ/LAST/]
|
||
MOVEM T,1(D)
|
||
PUSHJ P,ITMACI
|
||
JRST ITMAC0
|
||
|
||
ITMAC: PUSH P,A ;SAVE ; ARG
|
||
PUSHJ P,ITMACS
|
||
MOVE B,1(D) ;GET FIRST WORD OF NAME
|
||
CAME B,[ASCIZ/INIT/] ;THIS MACRO GETS AUTOMATIC SMACRO
|
||
JRST ITMAC0
|
||
MOVSI B,MSAVE
|
||
IORM B,(E) ;MARK IT SAVED
|
||
ITMAC0: MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
POP P,A
|
||
CAIE A,1 ;1 WILL SET MSAVE
|
||
TDZA A,A
|
||
MOVSI A,MSAVE
|
||
IORM A,(E)
|
||
GETFS (B)
|
||
MOVE F,CDEPPN ;GET DEPOSIT LIST POINTER
|
||
MOVEM F,(B) ;LINK NEW ONE IN
|
||
HRRZM B,CDEPPN ;.....
|
||
GETFS (C)
|
||
HRLM C,1(E) ;PUT IN LINK TO TEXT
|
||
HRLM C,(B) ;...
|
||
SETZM (C)
|
||
HRROS (C) ;MARK AS MACRO (SO IT WON'T GET DELETED)
|
||
JRST IMCON1
|
||
|
||
ITGET: TLNN M,DSKACT!MACACT ;INSIDE A MACRO?
|
||
OUTSTR [ASCIZ /TYPE MACRO NAME./]
|
||
ITGETA: PUSHJ P,TREADV ;GET MACRO NAME
|
||
MOVE D,B ;HOLD POINTER
|
||
MOVEI E,MDPNT ;GET POINTER TO LIST OF MACROS
|
||
ITCLP1: MOVE C,E ;SAVE PREVIOUS HERE
|
||
HRRZ E,(E) ;GET POINTER TO MACRO
|
||
JUMPE E,CPOPJ
|
||
HRRZ A,1(E) ;GET MACRO NAME
|
||
MOVE B,D ;GET TYPED NAME
|
||
PUSHJ P,TXTMAT ;SAME?
|
||
JRST ITCLP1 ;NO, LOOP
|
||
MOVE B,D ;YES
|
||
PUSHJ P,PUTFS ;RETURN TYPED NAME TO FS
|
||
HLRZ B,1(E) ;GET BODY POINTER
|
||
ADD B,[XWD 441100,1];MAKE BYTE POINTER
|
||
JRST CPOPJ1
|
||
|
||
NXMAC: MOVE B,D
|
||
PUSHJ P,PUTFS
|
||
TLNE M,DSKACT!MACACT
|
||
JRST PERRET
|
||
OUTSTR [ASCIZ /NO SUCH MACRO
|
||
/]
|
||
POPJ P,
|
||
|
||
MACCAL: SKIPN E,MDPNT
|
||
JRST CPOPJ1 ;LOSE
|
||
MACCL1: HRRZ A,1(E)
|
||
MOVE D,1(A)
|
||
CAMN D,@(P) ;SAME AS ARG?
|
||
JRST MACCL2 ;YES
|
||
HRRZ E,(E)
|
||
JUMPN E,MACCL1
|
||
JRST CPOPJ1
|
||
|
||
MACCL2: AOS (P) ;SKIP ARG
|
||
TRNN TFLG ;CHECK READIN BIT?
|
||
JRST MACCL3
|
||
HLRZ B,(E) ;GET BITS
|
||
TRNN B,MACTMP ;JUST READ IN?
|
||
POPJ P, ;NO, SKIP IT
|
||
MACCL3: HLRZ B,1(E)
|
||
ADD B,[POINT 9,1]
|
||
JRST MACRT1 ;CALL IT
|
||
|
||
ITCAL: PUSHJ P,ITGET
|
||
JRST NXMAC
|
||
MACRT1: MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
PUSH T,[0] ;DON'T RETURN ANYTHING TO FREE STORAGE AT END
|
||
SETZM BRKCHR
|
||
MACRT2: PUSH T,CDEPPN ;SAVE CDEPPN
|
||
HRROS (T)
|
||
SETZM CDEPPN
|
||
PUSH T,B ;SAVE START POINTER
|
||
PUSH T,[0] ;MAKE PLACE FOR COUNT
|
||
PUSH T,INPNT ;SAVE CURRENT INPUT POINTER
|
||
MOVEM B,INPNT ;TAKE INPUT FROM MACRO BODY
|
||
MOVEM T,MACPNT ;STORE MACRO PDL POINTER
|
||
JRST RSTMAC
|
||
|
||
;CALL WITH POINTER TO 9 BIT TEXT IN A
|
||
;BYTE POINTER TO END OF 9 BIT TEXT IN TT
|
||
ITSTUF: PUTBYT 200+":" ;ADD <CTRL><COLON> AT END
|
||
TLNN M,MACACT!DSKACT
|
||
OUTSTR[ASCIZ/TYPE TEXT MACRO NAME./]
|
||
PUSHJ P,ITMACS
|
||
MOVE A,SETSTR
|
||
HRROS (A) ;MARK AS PERMANENT
|
||
HRLM A,1(E) ;STUFF AWAY TEXT POINTER
|
||
POPJ P,
|
||
|
||
;ENTER HERE WITH 7 BIT MACRO NAME IN D
|
||
;AND 9 BIT MACRO IN A
|
||
ITMAKE: PUSH P,A
|
||
PUSHJ P,ITMACI ;FIND OLD AND DELETE, OR JUST MAKE NEW BLOCK
|
||
POP P,A
|
||
HRROS (A)
|
||
HRLM A,1(E) ;PUT IN MACRO BODY
|
||
TLNE M,DSKACT!MACACT
|
||
POPJ P,
|
||
MOVE T,D
|
||
PUSHJ P,OUTTXT ;PRINT MACRO NAME
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
POPJ P,
|
||
|
||
;CALL WITH BYTE POINTER IN T, RETURNS CHAR IN C
|
||
GETTT: TLNE T,760000
|
||
JRST GETTT1
|
||
HRR T,-1(T)
|
||
TRNN T,-1
|
||
POPJ P,
|
||
GETTT1: ILDB C,T
|
||
JUMPN C,CPOPJ1
|
||
JRST GETTT
|
||
|
||
;SETUP OUTPUT STREAM TO STRING
|
||
;RETURNS
|
||
;A = STRING HEAD
|
||
;TT = POINTER (TTPTR)
|
||
|
||
SETTT7: PUSHJ P,SETTT0
|
||
TLO TT,(<POINT 7,0>)
|
||
MOVEM TT,TTPTR
|
||
MOVE A,SETSTR
|
||
POPJ P,
|
||
|
||
SETTT0: MOVEM A,SETSTR
|
||
GETFS(A)
|
||
SETZM (A)
|
||
SETZM 1(A)
|
||
MOVE TT,[PUSHJ P,PUTTTC]
|
||
MOVEM TT,PUTCHR
|
||
MOVEI TT,1(A)
|
||
EXCH A,SETSTR
|
||
POPJ P,
|
||
|
||
SETTT: PUSHJ P,SETTT0
|
||
TLO TT,(<POINT 9,0>)
|
||
MOVEM TT,TTPTR
|
||
POPJ P,
|
||
|
||
;CALL WITH NUM IN B , AFTER SETTING UP WITH SETTT
|
||
PUTTTN: IDIVI B,=10
|
||
HRLM C,(P)
|
||
JUMPE B,.+2
|
||
PUSHJ P,PUTTTN
|
||
HLRZ C,(P)
|
||
MOVEI TTT,60(C)
|
||
;CALL WITH CHAR IN TTT, POINTER SET UP BY SETTT
|
||
PUTTTC: EXCH TT,TTPTR
|
||
TLNE TT,760000
|
||
JRST PUTTT1
|
||
PUSH P,TTT
|
||
GETFS(TTT)
|
||
HRRM TTT,-1(TT)
|
||
SETZM 1(TTT)
|
||
SETZM (TTT)
|
||
HRR TT,TTT
|
||
POP P,TTT
|
||
PUTTT1: IDPB TTT,TT
|
||
EXCH TT,TTPTR
|
||
POPJ P,
|
||
;"U" "T" "L" "^" "A" "N" "#" "="
|
||
ITOOPS: SKIPE INPNT ;IF INPUTTING FROM MACRO,
|
||
POPJ P, ;THIS IS A NOOP
|
||
;ELSE IT IS A ;T
|
||
ITTYP: TLNN M,DSKACT
|
||
OUTSTR [ASCIZ /TYPE ARGUMENT./]
|
||
MOVEI B, ;TAKE INPUT FROM TYPING
|
||
JRST MACRT1
|
||
|
||
ITDEQU: PUSHJ P,GETCHR
|
||
SKIPN T,L2N(C) ;ANY LOCATION CONVERSION FOR LETTER?
|
||
HRREI T,-100(C) ;IF NOT LETTER, DO ITEQU
|
||
MOVEI C,"#"
|
||
JRST ITLET0
|
||
|
||
ITEQU: PUSHJ P,GETCHR
|
||
HRREI T,-100(C) ;GET CODE FOR LETTER AS NUMBER IN STANDARD FORMAT
|
||
MOVEI C,"="
|
||
JRST ITLET0
|
||
|
||
ITLET: PUSHJ P,SREADN ;READ # ARG
|
||
CAIN C,12
|
||
JRST ITLETA
|
||
CAIE C,"D"
|
||
JRST INNERR
|
||
JUMPN T,INNERR
|
||
PUSHJ P,SREADN
|
||
CAIE C,12
|
||
JRST INNERR
|
||
JUMPLE T,ITLETA
|
||
CAMG T,MAXN2L ;IN LETTER RANGE?
|
||
SKIPA TT,N2L(T) ;USE THIS
|
||
ITLETA: MOVEI TT,100(T) ;CONVERT TO CHARACTER
|
||
PUSHJ P,MACLET ;MAKE LETTER MACRO
|
||
MOVEI C,"L"
|
||
JRST ITLET1 ;AND MERGE WITH IT ARG
|
||
|
||
ITCTRL: PUSHJ P,GETCHR ;GET CHARACTER
|
||
CAIL C,"A"+40
|
||
CAILE C,"Z"+40
|
||
CAIA
|
||
SUBI C,40 ;CONVERT LC TO UC
|
||
CAIL C,100 ;IF NOT ALREADY BELOW 100
|
||
SUBI C,100 ;MAKE IT A CONTROL CHARACTER
|
||
ANDI C,177 ;NO CONTROL BITS PLEASE
|
||
MOVE TT,C
|
||
PUSHJ P,MACLET ;MAKE THE MACRO
|
||
MOVEI C,"^"
|
||
JRST ITLET1
|
||
|
||
ITSARG: PUSHJ P,ARGSET ;READ ARGS
|
||
POPJ P, ;ERROR
|
||
PUSHJ P,SMACNM ;SIGNED NUMBER
|
||
MOVEI C,"N"
|
||
JRST ITLET1
|
||
|
||
ITARG: PUSHJ P,ARGSET ;READ ARGS
|
||
POPJ P, ;ERROR
|
||
MOVEI C,"A"
|
||
ITLET0: PUSHJ P,MACNUM ;CREATE TEXT NUMBER FROM IT
|
||
ITLET1: TLNE M,DSKACT!MACACT
|
||
JRST ITLET2
|
||
OUTSTR[ASCIZ/END ;/]
|
||
OUTCHR C
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
ITLET2: HRRZ T,(B) ;GET POINTER TO TEXT
|
||
HRLM T,(B) ;DUPLICATE IN LEFT HALF SO THAT LIST REMOVER AT
|
||
;END OF ITRET WILL RETURN IT TO FREE STORAGE PROPERLY
|
||
MOVE T,MACPNT ;GET MACRO PDL POINTER
|
||
HRRZ B,B
|
||
PUSH T,B ;RETURN TO FREE STORAGE AT END
|
||
SETZM BRKCHR
|
||
PUSH T,CDEPPN ;SAVE DEPOSIT LIST
|
||
HRROS (T) ;MARK AS SAVED
|
||
PUSH T,[0] ;PUSH ZERO AS START BYTE POINTER
|
||
PUSH T,[-1,,0] ;1 AS COUNT (DO ONCE) LOOP COUNT OF 0
|
||
PUSH T,INPNT ;SAVE INPUT POINTER
|
||
SETZM CDEPPN ;DON'T DEPOSIT
|
||
ADD B,[XWD 441100,1] ;MAKE BYTE POINTER
|
||
MOVEM B,INPNT ;TAKE INPUT FROM THERE
|
||
PUSHJ P,RSTMAC
|
||
MOVEM T,MACPNT
|
||
POPJ P,
|
||
|
||
ITVAR0: TLNN M,DSKACT!MACACT
|
||
SKEY,< OUTSTR [ASCIZ/VARIABLE NAME.
|
||
^/]>
|
||
NOSKEY,< OUTSTR[ASCIZ/VARIABLE NAME.
|
||
/]>
|
||
PUSHJ P,VARNM ;GET VARIABLE NAME
|
||
CAIE C,12 ;MUST END WITH <LF>
|
||
JRST INNERR
|
||
PUSHJ P,VARFND ;LOOKUP NAME
|
||
JRST VARN99 ;NOT FOUND, ERROR
|
||
HLRZ T,(E) ;GET PTR TO EXPANSION
|
||
PUSHJ P,SETTT ;COPY INTO A 9-BIT STRING
|
||
MOVE A,SETSTR
|
||
JUMPE T,ITVAR1
|
||
ADD T,[XWD 440700,1];MAKE A BYTE PTR TO TEXT
|
||
PUSHJ P,GETTT
|
||
JRST ITVAR1
|
||
PUTBYT (C)
|
||
JRST .-3
|
||
ITVAR1: MOVE B,A
|
||
PUTBYT 200+":"
|
||
MOVEI C,"H"
|
||
JRST ITLET1
|
||
|
||
ARGSET: HRRZ G,MACPNT ;SETUP INTIAL MACPDL POINTER
|
||
PUSHJ P,SREADN ;GET LEVEL # (OR INITIAL VALUE)
|
||
MOVE TT,T
|
||
CAIN C,12 ;NEW FORMAT?
|
||
JRST [ MOVEI T,1 ;ASSUME INC OF 1
|
||
JRST GOTANM]
|
||
CAIE C,","
|
||
JRST INNERR
|
||
PUSHJ P,SREADN
|
||
CAIN C,12
|
||
JRST GOTANM
|
||
MOVE TTT,T
|
||
PUSHJ P,READN
|
||
CAIE C,12 ;NOW IT MUST BE LF
|
||
JRST INNERR ;LOSE BIG
|
||
PUSHJ P,PDLCAL
|
||
MOVE T,TTT
|
||
GOTANM: HRRZ TTT,-1(G) ;GET LOOP COUNT
|
||
IMUL TTT,T ;MULT BY INC
|
||
ADD TT,TTT ;ADD TO INITIAL VALUE
|
||
MOVE T,TT ;PUT RESULT IN T
|
||
JRST CPOPJ1 ;SUCCESSFUL SCAN
|
||
|
||
PDLCAL: IMULI T,5 ;MULT LEVEL BY 5
|
||
SUB G,T ;BACK UP CORRECT NUMBER OF LEVELS
|
||
TRNLVL: CAILE G,MACPDL ;TOO FAR?
|
||
POPJ P,
|
||
ADDI G,5 ;YES
|
||
TLNN M,MACACT!DSKACT
|
||
OUTSTR[ASCIZ/TRUNCATING MACRO LEVEL!
|
||
/]
|
||
JRST TRNLVL
|
||
;"E" "X" "O" "I"
|
||
;"X"
|
||
ITEXPR: PUSHJ P,EXPSET
|
||
POPJ P, ;LOSE
|
||
TDZA T,T ;FALSE RETURN
|
||
SETO T, ;TRUE RETURN
|
||
MOVEM T,LSTEXP ;STORE HERE
|
||
GETFS (B)
|
||
HRRZ D,B ;HOLD POINTER
|
||
SETZM (D) ;CLEAR POINTER TO NEXT
|
||
SETZM 1(D) ;CLEAR DATA
|
||
ADD D,[XWD 441100,1] ;MAKE BYTE POINTER
|
||
MOVE T,[POINT 7,SIGBUF]
|
||
JRST ITEXP1
|
||
|
||
ITEXP2: PUSHJ P,PUTINL
|
||
ITEXP1: ILDB TT,T
|
||
JUMPN TT,ITEXP2
|
||
PUSHJ P,PUTRET
|
||
MOVEI C,"X"
|
||
JRST ITLET1
|
||
|
||
EXPSET: TLNN M,DSKACT!MACACT
|
||
SKEY,< OUTSTR[ASCIZ/TYPE EXPRESSION.
|
||
^/]>
|
||
NOSKEY,< OUTSTR[ASCIZ/TYPE EXPRESSION.
|
||
/]>
|
||
PUSHJ P,TREADX ;READ STRING
|
||
POPJ P, ;NULL OR ALTMODE
|
||
MOVE A,B
|
||
ADD A,[POINT 7,1]
|
||
MD,< SETZM DOVARS >
|
||
PUSHJ P,SIGSUB
|
||
JRST [
|
||
MD,< SETOM DOVARS >
|
||
OUTSTR [ASCIZ /ERROR IN EXPRESION(S):
|
||
/]
|
||
MOVE T,B
|
||
PUSHJ P,OUTTXT
|
||
OUTSTR [ASCIZ /
|
||
/]
|
||
JRST PUTFS] ;NOW GIVE BACK STRING
|
||
PUSHJ P,PUTFS ;GIVE BACK STRING
|
||
MD,< SETOM DOVARS >
|
||
MOVS T,SIGBUF
|
||
CAIE T,(<ASCIZ/0/>) ;DID EXPRESSION EVALUATE TO 0?
|
||
AOS (P)
|
||
JRST CPOPJ1
|
||
|
||
TREADX: PUSHJ P,GETLIN ;GET FIRST CHAR
|
||
CAIN C,12
|
||
POPJ P, ;IGNORE BLANK LINES
|
||
GETFS(B)
|
||
SETZM (B)
|
||
MOVSI T,(<ASCII/[/>)
|
||
MOVEM T,1(B)
|
||
MOVE T,B
|
||
ADD T,[POINT 7,1,6]
|
||
TREADY: PUSHJ P,TREADZ
|
||
PUSHJ P,GETLIN
|
||
CAIN C,ALTMOD
|
||
JRST PUTFS ;RETURN STRING IF ALTMODE
|
||
CAIE C,12
|
||
JRST TREADY
|
||
MOVEI C,"]"
|
||
AOS (P)
|
||
TREADZ: TLNE T,760000
|
||
JRST TREADW
|
||
GETFS(TT)
|
||
HRRM TT,-1(T)
|
||
HRR T,TT
|
||
SETZM (T)
|
||
SETZM 1(T)
|
||
TREADW: IDPB C,T
|
||
POPJ P,
|
||
|
||
;"E"
|
||
ITEVAL: PUSHJ P,TREADU ;READ MACRO NAME
|
||
POPJ P, ;ALTMODE
|
||
JFCL ;NULL, LET IT THROUGH
|
||
MOVE D,B ;SAVE POINTER TO NAME
|
||
PUSHJ P,SETTT
|
||
MOVE A,SETSTR
|
||
ITEVA1: PUSHJ P,GETLIN
|
||
CAIN C,600+":" ;CTRL META COLON?
|
||
JRST ITEVA2
|
||
PUTBYT (C)
|
||
JRST ITEVA1
|
||
|
||
ITEVA2: PUTBYT 200+":"
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/
|
||
END ;E /]
|
||
JRST ITMAKE
|
||
|
||
ITOUT: PUSHJ P,TREAD
|
||
MOVE T,B
|
||
TLNN M,DSKACT!MACACT ;PRINT IF NOT TAKING INPUT FROM TTY
|
||
OUTSTR[ASCIZ/END ;O
|
||
/]
|
||
PUSHJ P,OUTTXT
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
JRST PUTFS
|
||
|
||
ITIN: TLNN M,DSKACT
|
||
OUTSTR[ASCIZ/TYPE ARGUMENT (END WITH CRLF).
|
||
/]
|
||
MOVE T,MACPNT
|
||
PUSH T,[400000,,0]
|
||
MOVEI B,
|
||
SETZM BRKCHR
|
||
JRST MACRT2
|
||
|
||
ITYANK: TLNN M,DSKFLG ;ANY I FILE?
|
||
JRST [ TLNN DSKACT!MACACT
|
||
OUTSTR[ASCIZ/SORRY, NO DSKIN FILE OPEN.
|
||
/]
|
||
POPJ P,]
|
||
PUSHJ P,GETCHR ;GET CHARACTER TO USE AS BREAK CHAR
|
||
ANDI C,177 ;NO CTRL OR META PLEASE
|
||
MOVEM C,BRKCHR
|
||
PUSHJ P,DSKCON ;CONTINUE DSK INPUT
|
||
HRLZ TT,C
|
||
MOVE T,MACPNT
|
||
PUSH T,TT ;SAVE BRKCHR ON STACK
|
||
MOVEI B,
|
||
JRST MACRT2 ;AND DO ;T
|
||
|
||
DSKCON: TLNN M,DSKFLG ;DOING DISK INPUT AT ALL?
|
||
POPJ P, ;NO
|
||
NOLAY,<TLO M,DSKACT>
|
||
LAY,<MOVSI C,DSKACT
|
||
TDO M,C
|
||
IORM C,LAYM
|
||
>;LAY
|
||
POPJ P,
|
||
|
||
ITLOWG: TLNN M,DSKACT!MACACT
|
||
SKEY,< OUTSTR[ASCIZ/TYPE STRING TO CONVERT.
|
||
^/]>
|
||
NOSKEY,< OUTSTR[ASCIZ/TYPE STRING TO CONVERT.
|
||
/]>
|
||
PUSHJ P,SETTT
|
||
ITLOW1: PUSHJ P,GETLIN
|
||
CAIN C,12 ;EOL?
|
||
JRST ITLOW2
|
||
CAIL C,100 ;CONVERT RANGE 100-137 TO 140-177
|
||
TRO C,40
|
||
PUTBYT (C)
|
||
JRST ITLOW1
|
||
|
||
ITLOW2: PUTBYT 200+":"
|
||
MOVEI C,"G" ;FOR END ; MUMBLE
|
||
MOVE B,SETSTR
|
||
JRST ITLET1
|
||
;MACRO MAKERS
|
||
MACLET: GETFS(B)
|
||
HRRZ D,B
|
||
SETZM (D)
|
||
ADD D,[XWD 441100,1]
|
||
PUSHJ P,PUTINL
|
||
JRST PUTRET
|
||
|
||
SMACNM: GETFS (B)
|
||
HRRZ D,B ;HOLD POINTER
|
||
SETZM (D) ;CLEAR POINTER TO NEXT
|
||
ADD D,[XWD 441100,1];MAKE BYTE POINTER
|
||
JUMPE T,PUTRET ;NULL TEXT IF ZERO
|
||
MOVEI TT,"+"
|
||
SKIPG T
|
||
MOVEI TT,"-"
|
||
PUSHJ P,DODIV2
|
||
JRST PUTRET
|
||
|
||
MACNUM: GETFS (B)
|
||
HRRZ D,B ;HOLD POINTER
|
||
SETZM (D) ;CLEAR POINTER TO NEXT
|
||
SETZM 1(D) ;CLEAR DATA
|
||
ADD D,[XWD 441100,1];MAKE BYTE POINTE
|
||
PUSHJ P,DODIV ;PUT IN THE TEXT
|
||
PUTRET: MOVEI TT,":"+200;PUT IN THE END
|
||
PUTINL: TLNE D,770000 ;END OF WORD?
|
||
JRST DODV1 ;NO
|
||
GETFS (E) ;YES, GET MORE FREE STORAGE
|
||
SETZM (E) ;CLEAR POINTER TO NEXT
|
||
SETZM 1(E) ;CLEAR DATA
|
||
HRRM E,-1(D) ;POINT TO THIS ONE
|
||
HRR D,E
|
||
DODV1: IDPB TT,D ;DEPOSIT CHR
|
||
POPJ P,
|
||
|
||
DODIV: SKIPL T
|
||
JRST DODIV1
|
||
MOVEI TT,"-"
|
||
DODIV2: PUSHJ P,PUTINL
|
||
MOVM T,T
|
||
DODIV1: IDIVI T,=10
|
||
SOJG A,DODIV3 ;GO AT LEAST UNTIL WIDTH COUNT RUNS OUT
|
||
JUMPE T,DODIV4
|
||
DODIV3: HRLM TT,(P)
|
||
PUSHJ P,DODIV1
|
||
HLRZ TT,(P)
|
||
DODIV4: ADDI TT,60
|
||
JRST PUTINL
|
||
|
||
MACCLR: SKIPN T,MDPNT
|
||
POPJ P,
|
||
MOVSI TT,MACTMP
|
||
MCCRL1: ANDCAM TT,(T) ;CLEAR TMP BIT
|
||
HRRZ T,(T)
|
||
JUMPN T,MCCRL1 ;LOOP THRU ALL
|
||
POPJ P,
|
||
;READ/WRITE MACRO FILES
|
||
WMACRS: SETOM DX1
|
||
CAIA
|
||
WMACRO: SETZM DX1 ;FLAG NO SELECT
|
||
SKIPE VARPNT
|
||
JRST WMAC2
|
||
SKIPN MDPNT
|
||
JRST [ OUTSTR[ASCIZ/NO MACROES.
|
||
/]
|
||
POPJ P,]
|
||
WMAC2: MOVEM P,PERRSAV
|
||
TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/MACRO /]
|
||
MOVSI T,EXTMCR
|
||
PUSHJ P,SETNAM ;SET WIRE LIST FILENAME
|
||
POPJ P, ;LET HIM OUT
|
||
ENTPPN
|
||
INIT DAT,10
|
||
'DSK '
|
||
XWD IOHD,0
|
||
JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!
|
||
/]
|
||
POPJ P,]
|
||
MOVEI T,IOBUF
|
||
EXCH T,.JBFF
|
||
OUTBUF DAT,2
|
||
MOVEM T,.JBFF
|
||
PUSHJ P,EXIST ;DOES IT EXIST?
|
||
POPJ P, ;DOESN'T WANT TO OVERWRITE IT
|
||
OUTSTR[ASCIZ/WRITING /]
|
||
MOVEI A,FILNAM
|
||
JSR FPRINT
|
||
ENTER DAT,FILNAM
|
||
JRST [ RELEASE DAT,
|
||
OUTSTR[ASCIZ/, ENTER FAILED.
|
||
/]
|
||
POPJ P,]
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
SKIPN A,VARPNT
|
||
JRST WMAC14
|
||
TLNN M,DSKACT!MACACT
|
||
SKIPN DX1
|
||
CAIA
|
||
OUTSTR[ASCIZ/VARIABLES:
|
||
/]
|
||
PUSHJ P,WRTZERO
|
||
WMAC4: SKIPN DX1
|
||
JRST WMAC4A
|
||
TLNE M,DSKACT!MACACT
|
||
JRST WMAC4B
|
||
HRRZ T,1(A)
|
||
PUSHJ P,OUTTXT
|
||
WMAC4B: PUSHJ P,YORN
|
||
JRST WMAC3 ;SKIP THE REST OF THE VARIABLES ON ALT
|
||
JRST WMAC6 ;SKIP THIS ONE ON NO
|
||
WMAC4A: HRRZ TT,1(A)
|
||
PUSHJ P,WSTR ;WRITE VARIABLES
|
||
HLRZ TT,1(A)
|
||
JUMPE TT,WMAC5
|
||
HLRZ B,(TT)
|
||
HRLZ TTT,(TT)
|
||
HLR TTT,(B)
|
||
TLO TTT,400000
|
||
PUSHJ P,WORDOUT
|
||
MOVE TT,B
|
||
PUSHJ P,WSTR
|
||
WMAC13: HLRZ TT,(A)
|
||
PUSHJ P,WSTR
|
||
WMAC6: HRRZ A,(A)
|
||
JUMPN A,WMAC4
|
||
WMAC3: PUSHJ P,WRTZERO
|
||
WMAC14: SKIPN A,MDPNT
|
||
JRST WMAC8
|
||
TLNN M,DSKACT!MACACT
|
||
SKIPN DX1
|
||
CAIA
|
||
OUTSTR[ASCIZ/MACROES:
|
||
/]
|
||
WMAC1: SKIPN DX1
|
||
JRST WMAC1A
|
||
TLNE M,DSKACT!MACACT
|
||
JRST WMAC1B
|
||
HRRZ T,1(A)
|
||
PUSHJ P,OUTTXT
|
||
WMAC1B: PUSHJ P,YORN
|
||
JRST WMAC8 ;END ON ALT
|
||
JRST WMAC1C ;SKIP ON NO
|
||
WMAC1A: HRRZ TT,1(A)
|
||
PUSHJ P,WSTR
|
||
HLRZ TT,1(A)
|
||
PUSHJ P,WSTR ;WORKS FOR 9 BIT TEXT IF NO <META><NULL>'S
|
||
WMAC1C: HRRZ A,(A)
|
||
JUMPN A,WMAC1
|
||
WMAC8: PUSHJ P,WRTZERO
|
||
RELEASE DAT,
|
||
POPJ P,
|
||
|
||
WMAC5: HLRZ B,(A)
|
||
HLLZ TTT,(B)
|
||
SKIPE TTT
|
||
MOVEI TTT,1 ;MULTI-STRING VARIABLE
|
||
PUSHJ P,WORDOUT
|
||
JUMPE TTT,WMAC13
|
||
WMAC7: MOVE TT,B
|
||
PUSHJ P,WSTR
|
||
HLRZ B,(B)
|
||
JUMPN B,WMAC7
|
||
JRST WMAC6 ;NOTE: NULL STRING WRITTEN AS LAST OF MULTI-STRING VAR
|
||
|
||
MACOUT: SKIPN A,MDPNT
|
||
JRST WRTZERO ;NONE, MARK END
|
||
MACOU1: HLRZ TT,(A)
|
||
TRNN TT,MSAVE ;SHALL WE SAVE IT?
|
||
JRST MACOU3
|
||
HRRZ TT,1(A)
|
||
PUSHJ P,WSTR ;WRITE MACRO NAME
|
||
HLRZ TT,1(A)
|
||
PUSHJ P,WSTR ;NOW BODY
|
||
MACOU3: HRRZ A,(A)
|
||
JUMPN A,MACOU1
|
||
PUSHJ P,WRTZERO ;FINISH OFF
|
||
POPJ P,
|
||
|
||
IMACRO: TLNN M,DSKACT!MACACT
|
||
OUTSTR[ASCIZ/MACRO /]
|
||
MOVSI T,EXTMCR
|
||
PUSHJ P,SETNAM
|
||
POPJ P, ;LET HIM OUT
|
||
INIT DAT,10
|
||
'DSK '
|
||
IOHD
|
||
JRST [ OUTSTR[ASCIZ/CAN'T GET DISK!
|
||
/]
|
||
POPJ P,]
|
||
OUTSTR[ASCIZ/READING /]
|
||
MOVEI A,FILNAM
|
||
JSR FPRINT
|
||
DEC,< MOVE T,FILPPN >
|
||
LOOKUP DAT,FILNAM
|
||
JRST LOOKRR
|
||
DEC,< JSR DAT,LOOKCK >
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
MOVEI T,IOBUF
|
||
EXCH T,.JBFF
|
||
INBUF DAT,2
|
||
MOVEM T,.JBFF
|
||
PUSHJ P,RSTRZ
|
||
CAIA
|
||
JRST IMAC2 ;NO VARIABLES
|
||
IMAC8: PUSHJ P,RSTRZ ;READ VARIABLE NAME
|
||
JRST IMAC1
|
||
MOVE D,T
|
||
PUSHJ P,OUTTXT ;PRINT ALL VARIABLES
|
||
OUTSTR[ASCIZ/
|
||
/]
|
||
PUSHJ P,VARFND
|
||
JRST IMAC6 ;DOESN'T EXIST YET
|
||
HLRZ C,1(E)
|
||
JUMPE C,IMAC4
|
||
HLRZ B,(C)
|
||
PUSHJ P,PUTFS
|
||
FSTRET (C)
|
||
HRRZS 1(E)
|
||
IMAC4: HLRZ B,(E)
|
||
IMAC5: HLRZ D,(B)
|
||
PUSHJ P,PUTFS
|
||
SKIPE B,D
|
||
JRST IMAC5
|
||
IMAC3: PUSHJ P,WORDIN
|
||
TLZE TTT,400000
|
||
JRST IMAC9
|
||
SKIPA C,TTT
|
||
IMAC7: MOVE E,T
|
||
PUSHJ P,RSTRZ
|
||
JRST [ GETFS(T) ;MARK END OF MULTI STRING VAR
|
||
SETZM (T) ;WITH NULL STRING
|
||
SETZM 1(T)
|
||
HRLM T,(E)
|
||
JRST IMAC8]
|
||
HRLM T,(E)
|
||
JUMPN C,IMAC7 ;MULTI-STRING?
|
||
JRST IMAC8 ;NO
|
||
|
||
IMAC6: GETFS (E) ;MAKE NEW VARIABLE
|
||
MOVE B,VARPNT
|
||
HRRZM B,(E)
|
||
HRRZM D,1(E)
|
||
MOVEM E,VARPNT
|
||
JRST IMAC3
|
||
|
||
IMAC9: MOVE C,TTT
|
||
PUSHJ P,RSTR
|
||
GETFS (D)
|
||
HRLM D,1(E)
|
||
HRLZM T,(D)
|
||
HRLM C,(T)
|
||
HLRM C,(D)
|
||
PUSHJ P,RSTR
|
||
HRLM T,(E)
|
||
TRNN C,400000
|
||
JRST IMAC12
|
||
MOVE T,1(T) ;ALPHABETIC VARIABLE
|
||
ROT T,7
|
||
MOVEM T,1(D)
|
||
JRST IMAC8
|
||
|
||
IMAC12: ADD T,[POINT 7,1]
|
||
SETZB A,B
|
||
IMAC10: PUSHJ P,GETTT ;CONVERT VALUE TO BINARY
|
||
JRST IMAC11
|
||
CAIN C,"-"
|
||
SOJA A,IMAC10
|
||
IMULI B,=10
|
||
ADDI B,-"0"(C)
|
||
JRST IMAC10
|
||
|
||
IMAC11: SKIPE A
|
||
MOVN B,B
|
||
MOVEM B,1(D)
|
||
JRST IMAC8
|
||
|
||
IMAC1: PUSHJ P,RSTRZ
|
||
JRST IMAC0
|
||
IMAC2: SETZ C, ;CLEAR FLAGS WORD
|
||
PUSHJ P,MACINX
|
||
IMAC0: RELEASE DAT,
|
||
POPJ P,
|
||
|
||
MACIN: PUSHJ P,RSTRZ
|
||
POPJ P,
|
||
MACINX: MOVE D,T
|
||
PUSHJ P,RSTR ;WORKS FOR 9 BIT IF NO <META><NULL>'S IN MACRO
|
||
MOVE A,T
|
||
PUSHJ P,ITMAKE ;MAKE THIS ONE
|
||
IORM C,(E) ;OR IN BITS
|
||
JRST MACIN
|
||
;HERE TO DEFINE A NEW (OR REDEFINE AN OLD) VARIABLE
|
||
|
||
VARDEF: TLNN M,DSKACT!MACACT
|
||
OUTSTR [ASCIZ /VARIABLE DEFINITION?/]
|
||
PUSHJ P,VARNM ;BUILD LIST STRUCTURE FOR NAME
|
||
CAIN C,":" ;NAME ENDED WITH ":"?
|
||
JRST VARDE4 ;YES
|
||
CAIE C,"=" ;NAME ENDED WITH "="?
|
||
CAIN C,"_" ;NAME ENDED WITH "_"?
|
||
JRST VARDE4 ;YES
|
||
JRST INNERR
|
||
|
||
VARDE4: PUSH P,C ;SAVE NAME TERMINATING CHR
|
||
PUSHJ P,VARFND ;OLD VARIABLE?
|
||
JRST VARDE1 ;NO, MAKE A NEW ONE
|
||
JRST VARDE2
|
||
|
||
VARDE1: GETFS (E) ;BUILD VARIABLE LIST STRUCTURE
|
||
MOVE B,VARPNT
|
||
HRRZM B,(E) ;HOOK INTO LIST OF VAR NAMES
|
||
HRRZM D,1(E)
|
||
HRRZM E,VARPNT
|
||
VARDE2: PUSHJ P,TREAD ;READ DEFINITION
|
||
MOVE D,B ;SAVE POINTER TO DEFINITION
|
||
HLRZ C,1(E) ;RETURN OLD DEFINITION TO FREE STG
|
||
JUMPE C,VARDE5 ;MORE STRUCTURE EXISTS?
|
||
HLRZ B,(C)
|
||
PUSHJ P,PUTFS
|
||
VARDE5: MOVE B,(P) ;GET NAME TERMINATING CHR
|
||
CAIE B,"=" ;NUMERIC VARIABLE?
|
||
JRST VARDE6 ;NO, GO DEFINE STRING VARIABLE
|
||
JUMPN C,VARDE8 ;NEED TO BUILD MORE STRUCTURE?
|
||
GETFS (C) ;YES
|
||
HRLM C,1(E)
|
||
SETZM 1(C)
|
||
VARDE8: HRLZM D,(C) ;PLUG IN PTR TO NEW DEFINITION
|
||
JRST VARDE7
|
||
|
||
VARDE6: JUMPE C,VARDE7 ;STRUCTURE TO FLUSH?
|
||
SETZM (C)
|
||
MOVE B,C
|
||
PUSHJ P,PUTFS ;YES, FLUSH IT
|
||
VARDE7: HLRZ B,(E) ;RETURN OLD VALUE
|
||
JUMPE B,VARD10
|
||
VARDE9: HLRZ C,(B)
|
||
PUSHJ P,PUTFS
|
||
SKIPE B,C ;MULTI-STRING VARIABLE VALUE?
|
||
JRST VARDE9 ;YES, MORE TO RETURN
|
||
VARD10: HRRZS (E) ;CLEAR PTR TO OLD STRUCTURE
|
||
POP P,B ;GET NAME TERMINATING CHR
|
||
CAIN B,"=" ;NUMERIC VARIABLE?
|
||
JRST VARNX0 ;SET UP INITIAL VALUE
|
||
HRLM D,(E) ;PLUG IN NEW VALUE
|
||
HRRZS 1(E) ;CLEAR PTR TO OLD STRUCTURE
|
||
CAIE B,":" ;MULTI-STRING DEFINITION?
|
||
POPJ P,
|
||
VARDE0: TLNN M,DSKACT!MACACT
|
||
OUTCHR [":"] ;PROMPT FOR NEXT LINE
|
||
PUSHJ P,TREAD ;GET NEXT STRING
|
||
HRLM B,(D) ;SAVE PTR TO STRING
|
||
MOVE D,B ;DO NEXT STRING
|
||
SKIPE 1(B)
|
||
JRST VARDE0
|
||
POPJ P,
|
||
VARFND: MOVEI E,VARPNT ;SEARCH VARIABLE LIST FOR A NAME
|
||
VARFN1: HRRZ E,(E) ;GET PTR TO NEXT VARIABLE
|
||
JUMPE E,CPOPJ ;AT END OF LIST?
|
||
HRRZ A,1(E) ;NO, COMPARE NAMES
|
||
MOVE B,D
|
||
PUSHJ P,TXTMAT
|
||
JRST VARFN1 ;NOT FOUND, DO NEXT VARIABLE
|
||
MOVE B,D ;BINGO!
|
||
AOS (P) ;SKIP RETURN
|
||
JRST PUTFS ;RETURN NAME TO FREE STG
|
||
|
||
VARNUM: SETZB TTT,G ;READ ONE NUMBER FROM VARIABLE DEF
|
||
VARNU4: PUSHJ P,VARCHR ;GET NEXT CHR
|
||
JRST VARNU3 ;AT END
|
||
CAIL T,"0" ;NUMERIC?
|
||
CAILE T,"9"
|
||
JRST VARNU2 ;NO
|
||
IMULI TTT,=10 ;COMPILE VALUE
|
||
ADDI TTT,-"0"(T)
|
||
AOS G ;COUNT CHARACTERS
|
||
AOJA D,VARNU4 ;STEP TO NEXT INPUT CHR
|
||
|
||
VARNU2: CAIN T,"-" ;MINUS?
|
||
TROE G,200000 ;YES, 2 MINUSES?
|
||
JRST VARNU3 ;NOT MINUS OR 2 MINUSES, QUIT
|
||
AOJA D,VARNU4
|
||
|
||
VARNU3: TRNE G,200000 ;MINUS TYPED?
|
||
MOVNS TTT ;YES, SO NEGATE VALUE
|
||
POPJ P,
|
||
|
||
VARCHR: PUSHJ P,VARBYT ;GET PTR TO CHR
|
||
POPJ P, ;OFF THE END
|
||
LDB T,TT ;GET CHR
|
||
JUMPE T,CPOPJ ;AT END
|
||
CAIL T,"a" ;LOWER CASE?
|
||
CAILE T,"z"
|
||
JRST CPOPJ1 ;NO, DONE
|
||
SUBI T,40 ;CONVERT TO UPPER CASE
|
||
JRST CPOPJ1
|
||
|
||
VARBYT: MOVE T,C ;GET TEXT PTR
|
||
MOVE TT,D ;GET CHR COUNT
|
||
VARBY1: CAILE TT,4 ;CHR IN THE CURRENT WORD?
|
||
JRST [SUBI TT,5 ;NO, REDUCE COUNT
|
||
HRRZ T,(T) ;GET NEXT PTR
|
||
JUMPN T,VARBY1 ;AT END?
|
||
POPJ P,] ;YES, RETURN
|
||
MOVE TT,VARBY2(TT) ;GET BYTE PTR
|
||
JRST CPOPJ1
|
||
VARBY2: POINT 7,1(T),6 ;TABLE OF BYTE PTRS FOR GETTING CHR
|
||
POINT 7,1(T),13
|
||
POINT 7,1(T),20
|
||
POINT 7,1(T),27
|
||
POINT 7,1(T),34
|
||
VARNM: GETFS (B) ;READ ONE VARIABLE NAME
|
||
PUSH P,B ;SAVE PTR TO START OF STRUCTURE
|
||
SETZM (B)
|
||
SETZM 1(B)
|
||
HRLI B,020700 ;MAKE A BYTE PTR
|
||
VARNM2: PUSHJ P,GETLIN ;GET ONE CHR
|
||
CAIL C,"a" ;LOWER CASE?
|
||
CAILE C,"z"
|
||
JRST VARNM1 ;NO
|
||
SUBI C,40 ;CONVERT TO UPPER CASE
|
||
VARNM3: TLNE B,760000 ;PUT CHR INTO NAME. AT END OF WORD?
|
||
JRST VARNM4 ;NO
|
||
GETFS (D) ;GET NEW WORD
|
||
SETZM (D)
|
||
SETZM 1(D)
|
||
HRRZM D,-1(B) ;ADD TO END OF STRUCTURE
|
||
HRR B,D ;MAKE NEW BYTE PTR
|
||
VARNM4: IDPB C,B
|
||
JRST VARNM2
|
||
|
||
VARNM1: CAIL C,"A" ;ALPHABETIC?
|
||
CAILE C,"Z"
|
||
CAIN C,"." ;PERIOD?
|
||
JRST VARNM3 ;YES, VALID SYMBOL CONSTITUENT
|
||
CAIL C,"0" ;NUMERIC?
|
||
CAILE C,"9"
|
||
CAIN C,"%" ;PERCENT?
|
||
JRST VARNM3 ;YES, VALID
|
||
CAIN C,"$" ;DOLLAR SIGN?
|
||
JRST VARNM3 ;YES, VALID
|
||
POP P,D ;NO, END OF SYMBOL. GET PTR TO BEGINING
|
||
POPJ P,
|
||
;HERE TO TYPE THE VALUES OF ALL VARIABLES
|
||
|
||
VARTYP: TVOFF
|
||
MOVEI A,VARPNT ;POINT TO VARIABLE NAME LIST
|
||
VARTY1: OUTSTR [ASCIZ /
|
||
/]
|
||
HRRZ A,(A) ;GET NEXT VARIABLE
|
||
JUMPE A,[ TVON ;DONE?
|
||
POPJ P,]
|
||
HRRZ T,1(A) ;PTR TO NAME
|
||
PUSHJ P,OUTTXT
|
||
HLRZ T,(A) ;MULTI-STRING VARIABLE?
|
||
HLLZ T,(T)
|
||
HRRI T,":"
|
||
TLZE T,-1
|
||
JRST VARTY2 ;YES, FLAG WITH ":"
|
||
HLRZ T,1(A) ;STRING VARIABLE?
|
||
SKIPN T
|
||
TROA T,"_" ;YES, FLAG WITH "_"
|
||
MOVEI T,"="
|
||
VARTY2: OUTCHR T
|
||
HLRZ T,(A) ;PTR TO EXPANSION
|
||
PUSHJ P,OUTTXT
|
||
JRST VARTY1 ;DO NEXT ONE
|
||
|
||
;HERE TO INCREMENT A VARIABLE
|
||
|
||
VARNXT: TLNN M,DSKACT!MACACT
|
||
OUTSTR [ASCIZ /VARIABLE NAME?/]
|
||
PUSHJ P,VARNM ;GET VARIABLE NAME
|
||
CAIE C,12 ;ENDED WITH LINE FEED?
|
||
JRST INNERR ;NO, ERROR
|
||
PUSHJ P,VARFND ;LOOKUP VARIABLE NAME
|
||
JRST [VARN99:
|
||
TLNN M,MACACT ;NOT FOUND
|
||
OUTSTR [ASCIZ /NO SUCH NAME!/]
|
||
MOVE B,D ;RETURN NAME TO FREE STG
|
||
JRST PUTFS]
|
||
|
||
VARNX0: HLRZ B,1(E) ;GET PTRS TO VARIOUS PIECES OF STRUCTURE
|
||
JUMPE B,VARN40 ;INCREMENTING A STRING VARIABLE?
|
||
HLRZ C,(B) ;PTR TO TEXT
|
||
HRRZ D,(B) ;CHR NUMBER
|
||
PUSHJ P,VARNUM ;NO, GET A NUMBER
|
||
TRNN G,177777 ;ANY DIGITS SEEN?
|
||
JRST VARNX3 ;NO
|
||
PUSHJ P,VARN31 ;CHECK FORMAT
|
||
JRST VARILL ;NO, FORMAT ERROR
|
||
VARNX5: MOVEM TTT,1(B) ;SAVE VALUE
|
||
VARNX7: HRRM D,(B) ;SAVE CHR COUNT
|
||
HRLM G,(C) ;SAVE DIGIT COUNT
|
||
VARNX8: SKIPL (C) ;ALPHABETIC VARIABLE?
|
||
JRST VARN16 ;NO, PUT OUT A NUMBER
|
||
HRRZ D,1(B)
|
||
HLRZ B,(E) ;GET PTR TO OLD VALUE EXPANSION
|
||
PUSHJ P,PUTFS ;RETURN TO FREE STG
|
||
GETFS (T) ;MAKE NEW EXPANSION
|
||
SETZM (T)
|
||
HRLM T,(E)
|
||
ROT D,-7
|
||
HLLZM D,1(T)
|
||
POPJ P,
|
||
|
||
VARN16: MOVE T,1(B) ;GET THE NUMBER
|
||
HLRZ G,(C) ;GET DIGIT COUNT
|
||
TRZ G,600000 ;CLR FLAG BITS
|
||
GETFS (TTT) ;BUILD NEW EXPANSION
|
||
PUSH P,TTT ;SAVE PTR TO BEGINNING
|
||
SETZM (TTT)
|
||
SETZM 1(TTT)
|
||
HRLI TTT,020700 ;MAKE BYTE PTR
|
||
PUSHJ P,VARN17 ;DO THE DECIMAL PRINT
|
||
HLRZ B,(E) ;RETURN OLD EXPANSION TO FREE STG
|
||
PUSHJ P,PUTFS
|
||
POP P,T ;PLUG IN NEW EXPANSION
|
||
HRLM T,(E)
|
||
POPJ P,
|
||
|
||
VARNX1: JUMPE D,VARILL ;EMPTY DEFINITION?
|
||
MOVEI G,1 ;NO USE DEFAULT INCREMENT OF 1
|
||
|
||
VARNX9: MOVE T,1(B) ;GET VALUE
|
||
SKIPGE (C) ;ALPHABETIC?
|
||
JUMPN G,VARN15 ;YES, NON-ZERO INCREMENT?
|
||
ADD T,G ;NO, ADD INCREMENT TO VALUE
|
||
JRST VARN12
|
||
|
||
VARN15: HRLOI TTT,377777 ;MAKE SUPER-BIG UPPER LIMIT
|
||
JUMPG G,VARN14 ;INCREMENT POS?
|
||
MOVNS TTT ;NO, MAKE UPPER LIMIT NEGATIVE
|
||
JRST VARN14 ;GO TO GIOQ SKIPPER
|
||
VARN17: JUMPGE T,VARN19 ;NEGATIVE?
|
||
MOVNS T ;YES, SO MAKE POSITIVE
|
||
SETZM G ;NO FIXED NUMBER OF DIGITS
|
||
MOVEI TT,"-" ;OUTPUT A MINUS SIGN
|
||
IDPB TT,TTT
|
||
VARN19: IDIVI T,=10 ;RECURSIVE DECIMAL PRINT
|
||
HRLM TT,(P)
|
||
SOSG G ;DONT ZERO SUPPRESS UNTIL COUNT RUNS OUT
|
||
SKIPE T ;ALL DIGITS DONE?
|
||
PUSHJ P,VARN19 ;NO
|
||
HLRZ TT,(P)
|
||
ADDI TT,"0" ;CONVERT DIGIT TO ASCII
|
||
VARN20: TLNE TTT,760000 ;WORD FULL?
|
||
JRST VARN18 ;NO
|
||
GETFS (D) ;YES, GET ANOTHER WORD
|
||
HRRZM D,-1(TTT)
|
||
SETZM 1(D)
|
||
SETZM (D)
|
||
HRR TTT,D ;MAKE NEW BYTE PTR
|
||
VARN18: IDPB TT,TTT ;SAVE DIGIT
|
||
POPJ P,
|
||
|
||
VARNX3: TRNE G,200000 ;MINUS TYPED?
|
||
JRST VARILL ;YES, ERROR BECAUSE NO DIGITS TYPED
|
||
JUMPE T,VARNX1 ;AT END OF DEFINITION?
|
||
CAIN T,"(" ;INCREMENT COMING?
|
||
AOJA D,VARNX2 ;YES, GO GET IT
|
||
CAIL T,"A" ;ALPHABETIC VARIABLE?
|
||
CAILE T,"Z"
|
||
JRST [VARILL:OUTSTR [ASCIZ /ILLEGAL VARIABLE DEFINITION!/]
|
||
POPJ P,]
|
||
MOVEM T,1(B) ;SAVE VALUE
|
||
PUSHJ P,VARN30 ;GET NEXT CHR AND CHECK FORMAT
|
||
JRST VARILL ;NO, FORMAT ERROR!
|
||
VARNX6: MOVEI G,400000 ;FLAG ALPHABETIC VARIABLE
|
||
JRST VARNX7
|
||
VARNX2: PUSHJ P,VARNUM ;GET INCREMENT
|
||
CAIE T,")" ;MUST END WITH ")"
|
||
JRST VARILL
|
||
PUSH P,TTT ;SAVE VALUE
|
||
AOS D ;STEP TO NEXT CHR
|
||
PUSHJ P,VARNUM ;GET UPPER LIMIT
|
||
POP P,TT ;GET INCREMENT
|
||
TRNN G,177777 ;ANY DIGITS TYPED?
|
||
JRST VARN10 ;NO
|
||
PUSHJ P,VARN31 ;CHECK FORMAT
|
||
JRST VARILL ;NO, FORMAT ERROR
|
||
|
||
VARN11: JUMPE TT,VARILL ;0 INCREMENT WONT GO ANYWHERE
|
||
SKIPGE (C) ;ALPHABETIC?
|
||
JRST VARILL ;YES, SO NUMERIC UPPER LIMIT ILLEGAL
|
||
MOVE T,1(B) ;GET VALUE
|
||
JUMPL TT,[CAMG T,TTT ;ARGS IN RIGHT ORDER FOR NEG INCREMENT?
|
||
JRST VARILL ;NO
|
||
ADD T,TT ;ADD INCREMENT TO VALUE
|
||
CAMG T,TTT ;GONE PAST UPPER LIMIT?
|
||
MOVE T,TTT ;YES, USE UPPER LIMIT ITSELF
|
||
JRST VARN12];NO
|
||
CAML T,TTT ;ARGS IN RIGHT ORDER FOR POS INCREMENT?
|
||
JRST VARILL ;NO
|
||
ADD T,TT ;ADD INCREMENT TO VALUE
|
||
CAML T,TTT ;GONE PAST UPPER LIMIT?
|
||
MOVE T,TTT ;YES, USE UPPER LIMIT AS VALUE
|
||
VARN12: MOVEM T,1(B) ;SAVE INCREMENTED VALUE
|
||
CAMN T,TTT ;AT UPPER LIMIT?
|
||
HRRM D,(B) ;YES, UPDATE CHR COUNT
|
||
JRST VARNX8 ;EXPAND THE RESULT
|
||
|
||
VARN10: TRNE G,200000 ;MINUS TYPED?
|
||
JRST VARILL ;YES, ILLEGAL ALPHABETIC!
|
||
MOVE G,TT ;SAVE INCREMENT
|
||
JUMPE T,VARNX9 ;AT END OF DEFINITION?
|
||
CAIL T,"A" ;ALPHABETIC UPPER LIMIT?
|
||
CAILE T,"Z"
|
||
JRST VARILL ;NO
|
||
MOVE TTT,T ;SAVE UPPER LIMIT
|
||
JUMPE G,VARILL ;INCREMENT 0?
|
||
PUSHJ P,VARN30 ;GET NEXT CHR AND CHECK FORMAT
|
||
JRST VARILL ;NO, FORMAT ERROR
|
||
VARN13: SKIPL (C) ;ALPHABETIC VALUE?
|
||
JRST VARILL ;NO, ALPHABETIC UPPER LIMIT ILLEGAL
|
||
MOVE T,1(B) ;GET VALUE
|
||
VARN14: JUMPL G,[CAMG T,TTT ;ARGS IN RIGHT ORDER FOR NEG INCREMENT?
|
||
JRST VARILL ;NO
|
||
ADD G,T ;ADD INCREMENT TO VALUE
|
||
CAILE T,"Q" ;WENT PAST Q?
|
||
CAILE G,"Q"
|
||
CAIA ;NO
|
||
SOS G ;YES, IT SHOULD BE SKIPPED
|
||
CAILE T,"O" ;WENT PAST O?
|
||
CAILE G,"O"
|
||
CAIA ;NO
|
||
SOS G ;YES, IT SHOULD BE SKIPPED
|
||
CAILE T,"I" ;WENT PAST I?
|
||
CAILE G,"I"
|
||
CAIA ;NO
|
||
SOS G ;YES, IT SHOULD BE SKIPPED
|
||
CAILE T,"G" ;WENT PAST G?
|
||
CAILE G,"G"
|
||
SKIPA T,G ;NO
|
||
SOS T,G ;YES, IT SHOULD BE SKIPPED
|
||
CAMG G,TTT ;WENT PAST UPPER LIMIT?
|
||
MOVE T,TTT ;YES, USE UPPER LIMIT AS VALUE
|
||
JRST VARN12];NO
|
||
CAML T,TTT ;ARGS IN RIGHT ORDER FOR POS INCREMENT?
|
||
JRST VARILL ;NO
|
||
ADD G,T ;ADD VALUE TO INCREMENT
|
||
CAIGE T,"G" ;WENT PAST G?
|
||
CAIGE G,"G"
|
||
CAIA ;NO
|
||
AOS G ;YES, IT SHOULD BE SKIPPED
|
||
CAIGE T,"I" ;WENT PAST I?
|
||
CAIGE G,"I"
|
||
CAIA ;NO
|
||
AOS G ;YES, IT SHOULD BE SKIPPED
|
||
CAIGE T,"O" ;WENT PAST O?
|
||
CAIGE G,"O"
|
||
CAIA ;NO
|
||
AOS G ;YES, IT SHOULD BE SKIPPED
|
||
CAIGE T,"Q" ;WENT PAST Q?
|
||
CAIGE G,"Q"
|
||
SKIPA T,G ;NO
|
||
AOS T,G ;YES, IT SHOULD BE SKIPPED
|
||
CAML G,TTT ;WENT PAST UPPER LIMIT?
|
||
MOVE T,TTT ;YES, USE UPPER LIMIT AS VALUE
|
||
JRST VARN12 ;NO
|
||
VARN30: AOS D ;STEP TO NEXT CHR
|
||
PUSHJ P,VARCHR ;GET IT
|
||
VARN31: JUMPE T,CPOPJ1 ;END OF DEFINITION IS LEGAL
|
||
CAIN T,"," ;COMMA IS VALID
|
||
AOJA D,CPOPJ1 ;MOVE PAST COMMA
|
||
CAIE T,"(" ;NEW INCREMENT ALSO LEGAL
|
||
POPJ P, ;OTHERS ARE ILLEGAL
|
||
JRST CPOPJ1
|
||
|
||
VARN40: HLRZ C,(E) ;PTR TO STRING
|
||
HLRZ D,(C) ;MULTI-STRING VARIABLE
|
||
JUMPN D,VARN44 ;NON 0 = MULTISTRING, 0=START AT 1ST CHR
|
||
VARN41: PUSHJ P,VARCHR ;SEARCH FOR FIRST NUMBER
|
||
JRST [TLNN M,MACACT
|
||
OUTSTR [ASCIZ /NO NUMBER TO INCREMENT!/]
|
||
POPJ P,]
|
||
CAIL T,"0"
|
||
CAILE T,"9"
|
||
AOJA D,VARN41
|
||
MOVE G,D ;SAVE POSITION OF 1ST DIGIT
|
||
VARN42: PUSHJ P,VARCHR ;SEARCH FOR END OF NUMBER
|
||
JRST .+3 ;END OF DEFINITION
|
||
CAIL T,"0"
|
||
CAILE T,"9"
|
||
SOSA D ;STEP BACK TO LAST DIGIT
|
||
AOJA D,VARN42
|
||
VARN43: PUSHJ P,VARBYT ;GET BYTE PTR TO CHR
|
||
NODEC,< HALT .+1 > ;CANT HAPPEN
|
||
DEC,< PUSHJ P,TODDT >
|
||
LDB TTT,TT ;GET DIGIT
|
||
AOS TTT
|
||
CAIN TTT,"9"+1 ;DIGIT OVERFLOW?
|
||
MOVEI TTT,"0" ;YES
|
||
DPB TTT,TT ;SAVE INCREMENTED DIGIT
|
||
CAIE TTT,"0" ;NEED TO PROPAGATE A CARRY?
|
||
POPJ P, ;NO
|
||
CAMLE D,G ;YES, OVERFLOWING FIELD?
|
||
SOJA D,VARN43 ;NO, INCREMENT NEXT DIGIT
|
||
OUTSTR [ASCIZ /NUMERIC FIELD OVERFLOW!/]
|
||
POPJ P,
|
||
|
||
VARN44: HRLM D,(E) ;NEXT STRING BECOMES CURRENT VALUE
|
||
SKIPN 1(D) ;IS THIS END OF MULTI STRING VAR?
|
||
SETOM ENDMUL ;YES, FLAG IT
|
||
MOVE B,C ;RETURN OLD STRING
|
||
JRST PUTFS
|