1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-01 01:19:17 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

672 lines
16 KiB
Plaintext
Raw Permalink 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.
TITLE COMPAR MODULE FOR SOUPR
SUBTTL DEFINITIONS
;HANLEY A. STRAPPMAN
SEARCH PRS,JOBDAT,UUOSYM
SALL
TWOSEG
EXTERN DECO,PUTC,SIXO,ICH,BP,EATCR,CPOPJ1,INDIR
EXTERN CRLFO,SAVE3,LSNI,STRO,SWTCH,COLON,DECI
EXTERN SPCI,LKP,NTR,WLDMAT,PROMPT,OCLS,ICLS
EXTERN OCH,GETBLK,RST,FREMEM,PUR,SWINI
EXTERN WILDP,WILDER,SAVE1,SAVE2,SPCO,WLDCNT,CO,EATS,SIXI,CI
;DEFINE AC'S
F=0 ;FLAGS
A1=12 ;ADR PREVIOUS A BLK
A2=A1+1 ;ADR CURRENT A BLK
B1=14 ;ADR PREVIOUS B BLK
B2=B1+1 ;ADR CURRENT B BLK
;FLAGS
F.LOG==1 ;LOG FILENAMES
F.NUM==10 ;NUMBER PATCHES
F.LET==20 ;LETTER PATCHES
F.BAS==40 ;BASE FILE IS WILD
F.BLNK==100 ;COUNT BLANKS
;ASSEMBLY PARAMETERS
PDLSIZ==100 ;SIZE OF PDL
IFNDEF LINSIZ,<LINSIZ==^D640/5>;SIZE OF LINE OF TEXT
IFNDEF MTCH,<MTCH==3> ;DEFAULT /MATCH
IFNDEF FLAGS,<FLAGS==F.LOG> ;DEFAULT FLAGS
;CHANNEL USAGE
A==1 ;INPUT OF A FILE
B==2 ;INPUT OF B FILE
O==3 ;OUTPUT FILE
SUBTTL EDIT HISTORY
VEDIT==1 ;COMPLETE VMAJOR=2 AUG 77
VEDIT==2 ;EXTRA CRLF IN FILENAME LOG
;IF OUTPUT DEVICE IS OUR TTY 9-17-77
VEDIT==3 ;CHANGE SYMBOL NAMES TO FOLLOW CONVENTION 10-14-77
VEDIT==4 ;ADD ERROR RETURN TO OCLS 10-15-77
VEDIT==5 ;SWITCH FROM WILD TO WILDER 10-15-77
VEDIT==6 ;/NUMBER 5-18-79
VEDIT==7 ;MERGE GOT MEREOF IF FILE ENDED IN THE
;MIDDLE OF AN EDIT 8-18-80
VEDIT==10 ;MAKE LINSIZ BIGGER
VEDIT==11 ;BAD COR FILE IF THE LAST LINE OF A FILE IS
;DELETED 1-11-81
VEDIT==12 ;DEFAULT WILDCARD IS 2ND SPEC NOT 1ST 9-15-81
VEDIT==13 ;INDIRECT FILES 9-15-81
VEDIT==14 ;/LETTER 10-25-81
VEDIT==15 ;/BASE 12-2-82
VEDIT==16 ;SWITCH.INI 6-18-83
VEDIT==17 ;/BLANK 9-9-84
VEDIT==20 ;LOG ALWAYS GOES TO TTY SO ALWAYS APPEND CRLF 3-19-85
;LOAD WITH NEW PARSE WHICH USES UU.LBF (LARGE BUFFERS)
VWHO==0
VMAJOR==2
VMINOR==0
LOC .JBVER
BYTE (3)VWHO(9)VMAJOR(6)VMINOR(18)VEDIT
SUBTTL INITIALIZATION
RELOC 400000
COMPAR: JFCL ;NO CCL
MOVE P,[IOWD PDLSIZ,PDL] ;SETUP PDL
PUSHJ P,RST ;RESET
MOVEI T1,MTCH ;DEFAULT /MATCH
MOVEM T1,MATCH
MOVEI F,FLAGS ;DEFAULT FLAGS
MOVE P2,[XWD -SWIL,SWN] ;READ SWITCH.INI
MOVEI P3,SWX
PUSHJ P,SWINI
JFCL
MOVEM F,SAVFLG ;SAVE FLAGS
MOVE T1,MATCH ;SAVE /MATCH
MOVEM T1,SAVMAT
COMMAN: PUSHJ P,RST ;RESET
SETZM ZER ;ZERO CORE
MOVE T1,[XWD ZER,ZER+1]
BLT T1,ZER+ZERSIZ-1
PUSHJ P,PARSE ;PARSE THE COMMAND LINE
JRST COMMAN
SUBTTL PARSE THE COMMAND LINE
PARSE: MOVE P2,[XWD -SWL,SWN] ;PROMPT USER
MOVEI P3,SWX
PUSHJ P,PROMPT
POPJ P,
PUSHJ P,INDIR ;DO INDIRECT FILE
MOVE T1,[XWD HGH,LOW] ;COPY NON-NULL DATA
BLT T1,LOW+LOWSIZ-1
SETZM Q ;CLEAR THE STRING (1ST WORD)
MOVE F,SAVFLG ;DEFAULT FLAGS
MOVE T1,SAVMAT ;DEFAULT /MATCH FROM SWITCH.INI
MOVEM T1,MATCH
MOVEI P1,OSPC ;PASS ADR O SPC
PUSHJ P,SPCI ;GET OUTPUT SPC
POPJ P,
PUSHJ P,EATS ;EAT EQUAL
POPJ P,
CAIE C,"="
FATAL COMSYN,<Syntax error>
PUSHJ P,CI
POPJ P,
MOVEI P1,ASPC ;GET A SPC
PUSHJ P,SPCI
POPJ P,
PUSHJ P,EATS ;EAT COMMA
POPJ P,
CAIE C,","
FATAL COMSYN,<Syntax error>
PUSHJ P,CI
POPJ P,
MOVE T1,[XWD ASPC,BSPC] ;STICKY SPC
BLT T1,BSPC+SPCSIZ-1
MOVEI P1,BSPC ;GET B SPC
PUSHJ P,SPCI
POPJ P,
MOVE P2,[XWD -SWL,SWN] ;PARSE SWITCHES
MOVEI P3,SWX
PUSHJ P,SWTCH
POPJ P,
PUSHJ P,EATCR ;TEST FOR BREAK CHAR
POPJ P,
PUSHJ P,BP
FATAL COMSYN,<Syntax error>
MOVEI P1,BSPC ;ASSUME B IS WILD
MOVEI P2,ASPC ;AND A IS NOT
TRNE F,F.BAS ;TRUE?
EXCH P1,P2 ;NOPE, SWITCH THEM
PUSHJ P,WILDP ;WILD?
EXCH P1,P2 ;NO, SWITCH AGAIN
MOVEI P2,MAIN ;WILDCARD LOOKUP
PUSHJ P,WILDER
JFCL
POPJ P,
SUBTTL MAINSTREAM
MAIN: PUSHJ P,SAVE3 ;SAVE P1-P3
AOS WLDCNT ;COUNT IT
MOVEI P2,ASPC ;MATCH WLD SPCS
MOVEI P3,ASPC2
PUSHJ P,WLDMAT
MOVEI P2,BSPC
MOVEI P3,BSPC2
PUSHJ P,WLDMAT
MOVEI P2,OSPC
MOVEI P3,OSPC2
PUSHJ P,WLDMAT
MOVE T1,ASPC2+.SBNAM ;OUTPUT DEFAULT TO INPUT
SKIPN OSPC2+.SBNAM
MOVEM T1,OSPC2+.SBNAM
PUSHJ P,LOG ;DO LOGGING
POPJ P,
MOVEI T1,A ;LOOKUP A FILE
MOVEM T1,ICH
MOVEI P1,ASPC2
PUSHJ P,LKP
POPJ P,
MOVEI T1,B ;LOOKUP B FILE
MOVEM T1,ICH
MOVEI P1,BSPC2
PUSHJ P,LKP
POPJ P,
MOVEI T1,O ;ENTER OUTPUT FILE
MOVEM T1,OCH
MOVEI P1,OSPC2
PUSHJ P,NTR
POPJ P,
MOVEI T1,1 ;PAGE 1 LINE 0
MOVEM T1,PAG
SETZM LIN
SETZM CHKSUM ;RESET CHECK SUM
SETZM NUMBR ;NO PATCHES YET
SETOM LETTR
MOVEI T1,AMEM ;DELETE CORE IN CASE RESTART
PUSHJ P,PUR
MOVEI T1,BMEM
PUSHJ P,PUR
LOOP: MOVEI A2,AMEM ;POINT A TO 0TH BLK
MOVEI B2,BMEM ;POINT B TO 0TH BLK
PUSHJ P,GETA ;GET NEXT A BLK
POPJ P,
PUSHJ P,GETB ;GET NEXT B BLK
POPJ P,
PUSHJ P,EQ ;EQUAL?
JRST NOTA
SKIPN 2(A2) ;YES, EOF?
JRST SUM ;YES
PUSHJ P,DELA ;DELETE A BLK
PUSHJ P,DELB ;DELETE B BLK
JRST LOOP
LOOP2: MOVE P1,A1 ;SAVE A POSITION
MOVEI A2,AMEM ;FIND A BLK THAT MATCH LAST B BLK
BLOOP: MOVE A1,A2
HRRZ A2,(A1)
PUSHJ P,NE
POPJ P,
JUMPE T1,DISPER ;WIN
CAME P1,A1
JRST BLOOP
;HERE WHEN LAST B BLK DOESN'T MATCH ANY A BLK
NOTB: MOVE P1,B1 ;SAVE B POSITION
MOVEI B2,BMEM ;FIND B BLK THAT MATCH LAST A BLK
ALOOP: MOVE B1,B2
HRRZ B2,(B1)
PUSHJ P,NE
POPJ P,
JUMPE T1,DISPER ;WIN
CAME P1,B1
JRST ALOOP
;HERE WHEN LAST A BLK DOESN'T MATCH ANY B BLK
NOTA: PUSHJ P,GETA ;GET ANOTHER A BLK
POPJ P,
PUSHJ P,GETB ;GET ANOTHER B BLK
POPJ P,
SKIPN 1(B1) ;IS FILE B SHORTER THAN FILE A?
JRST NOTB ;YES, TEST IF LAST A MATCH ANY B
JRST LOOP2
;HERE WITH A2 AND B2 POINTING TO 1ST LINES
;THAT ARE EQUAL
DISPER: SETZ T2, ;COUNT MODIFIED A LINES
MOVEI T1,AMEM
HRRZ T1,(T1)
CAME A2,T1
AOJA T2,.-2
MOVEM T2,COUNTA
SETZ T2, ;COUNT MODIFIED B LINES
MOVEI T1,BMEM
HRRZ T1,(T1)
CAME B2,T1
AOJA T2,.-2
MOVEM T2,COUNTB
MOVEI A1,AMEM ;POINT A TO 1ST BLK
HRRZ A2,AMEM
MOVEI B1,BMEM ;POINT B TO 1ST BLK
HRRZ B2,BMEM
MOVEI C," " ;COMMANDS BEGIN WITH SPACE
PUSHJ P,PUTC
POPJ P,
MOVEI P1,'REP' ;ASSUME REPLACE
SKIPN COUNTB ;DELETE?
MOVEI P1,'DEL' ;YES
SKIPN COUNTA ;INSERT?
MOVEI P1,'INS' ;YES
HRLZ T1,P1 ;SAY WHICH
PUSHJ P,SIXO
POPJ P,
MOVEI C," "
PUSHJ P,PUTC
POPJ P,
HRRZ T1,1(A2) ;LINE
PUSHJ P,DECO
POPJ P,
MOVEI C,"/"
PUSHJ P,PUTC
POPJ P,
HLRZ T1,1(A2) ;PAGE
PUSHJ P,DECO
POPJ P,
MOVE T1,SIX ;EITHER TYPE OF NAME?
OR T1,Q
JUMPE T1,NONAME ;NO
MOVEI T1,[BYTE (7)11,";"] ;TAB SEMICOLON
PUSHJ P,STRO
POPJ P,
MOVE T1,SIX ;OUTPUT SIXBIT NAME
PUSHJ P,SIXO
POPJ P,
PUSHJ P,DOLET ;LETTER IT
POPJ P,
PUSHJ P,DONUM ;NUMBER IT
POPJ P,
SKIPN Q ;QUOTED EXTENSION?
JRST NONAME ;NO
MOVEI T1,Q ;YES, OUTPUT THE QUOTE
PUSHJ P,STRO
POPJ P,
NONAME: PUSHJ P,CRLFO
POPJ P,
DELLOP: SOSGE COUNTA ;MORE TO DELETE?
JRST DELDON ;NO
LDB T1,[POINT 7,2(A2),6] ;GET 1ST CHAR
MOVEI T2,1 ;IS IT SPECIAL?
LSH T2,(T1)
TDNE T2,[1400036000]
JRST DELLP1
MOVEI C,11 ;NO, TYPE A TAB
PUSHJ P,PUTC
POPJ P,
DELLP1: MOVEI T1,2(A2) ;TYPE THE LINE
PUSHJ P,STRO
POPJ P,
PUSHJ P,DELA ;DELETE IT
JRST DELLOP ;TRY FOR MORE
DELDON: CAIE P1,'REP' ;DELIMIT REP
JRST INSLOP
MOVEI T1,[ASCIZ / WIT
/]
PUSHJ P,STRO
POPJ P,
INSLOP: SOSGE COUNTB ;MORE TO INSERT?
JRST LOOP ;NO
LDB T1,[POINT 7,1(B2),6] ;GET 1ST CHAR
MOVEI T2,1 ;IS IT SPECIAL?
LSH T2,(T1)
TDNE T2,[1400036000]
JRST INSLP1
MOVEI C,11 ;NO, TYPE A TAB
PUSHJ P,PUTC
POPJ P,
INSLP1: MOVEI T1,1(B2) ;TYPE THE LINE
PUSHJ P,STRO
POPJ P,
PUSHJ P,DELB ;DELETE IT
JRST INSLOP ;TRY FOR MORE
SUM: MOVEI T1,[ASCIZ / SUM /] ;CHECKSUM
PUSHJ P,STRO
POPJ P,
HRRZ T1,CHKSUM ;THE SUM
ADDI T1,1
PUSHJ P,DECO
POPJ P,
PUSHJ P,CRLFO
POPJ P,
PUSHJ P,OCLS ;CLOSE FILES
JFCL
MOVEI T1,A
MOVEM T1,ICH
PUSHJ P,ICLS
MOVEI T1,B
MOVEM T1,ICH
PUSHJ P,ICLS
JRST CPOPJ1
;ROUTINE TO NUMBER THE PATCHES
DONUM: TRNN F,F.NUM ;NUMBER IT?
JRST CPOPJ1 ;NO
AOS T1,NUMBR ;YES, BUMP THE NUMBER
PJRST DECO ;TYPE IT OUT
;ROUTINE TO LETTER THE PATCHES
DOLET: TRNN F,F.LET ;LETTER IT?
JRST CPOPJ1 ;NO
AOS T1,LETTR ;YES, BUMP THE NUMBER
;PJRST R26O ;TYPE IT OUT
;ROUTINE TO OUTPUT A NUMBER IN RADIX 26
;T1 PASSES THE NUMBER
R26O: IDIVI T1,^D26
HRLM T2,(P)
JUMPE T1,R26O1
PUSHJ P,R26O
POPJ P,
R26O1: HLRZ C,(P)
ADDI C,"A"
PJRST CO
;ROUTINE TO TYPE OUT LOG MESSAGE
LOG: TRNN F,F.LOG ;LOGGING?
JRST CPOPJ1 ;NO
SETOM OCH ;OSELECT TTY
PUSHJ P,CRLFO
POPJ P,
MOVEI P1,OSPC2 ;TYPE O SPEC
PUSHJ P,SPCO
POPJ P,
MOVEI C,"="
PUSHJ P,CO
POPJ P,
MOVEI P1,ASPC2 ;TYPE A SPEC
PUSHJ P,SPCO
POPJ P,
MOVEI C,","
PUSHJ P,CO
POPJ P,
MOVEI P1,BSPC2 ;TYPE B SPEC
PUSHJ P,SPCO
POPJ P,
JRST CRLFO ;YES, EXTRA CRLF
;ROUTINE TO GET A BLK
GETA: MOVE A1,A2 ;ADVANCE TO NEXT BLK
HRRZ A2,(A1)
JUMPN A2,CPOPJ1 ;EASY IF REALLY EXISTS
PUSHJ P,SAVE2 ;SAVE P1-P2
SETZM LINE ;CLEAR BLOCK
MOVE T1,[XWD LINE,LINE+1]
BLT T1,LINE+LINSIZ-1
MOVE P1,[POINT 7,LINE] ;BP TO BLK
MOVEI P2,LINSIZ*5 ;CHAR COUNT
MOVEI T1,A ;ISELECT A
MOVEM T1,ICH
GETALP: SOJLE P2,[ERR ER.EAT,"?",COMLTL,<Line too long>]
PUSHJ P,LSNI ;GET A CHAR
JRST GETAER
IDPB C,P1 ;STORE IT
MOVE T1,CHKSUM ;ADD TO CHECKSUM
ROT T1,1
ADDI T1,1(C)
MOVEM T1,CHKSUM
PUSHJ P,BP ;LOOP UNTIL BREAK CHAR
JRST GETALP
GETADN: IBP P1 ;MAKE ASCIZ
SUBI P1,LINE ;LENGHT-1
HRRZI T1,3(P1) ;GET SOME CORE
PUSHJ P,GETBLK
POPJ P,
MOVE A2,T2 ;ADR IN A2
HRRM A2,(A1) ;LINK TO LIST
ADDI T1,-1(A2) ;ADR LAST WORD
ADDI T2,2 ;BLT LINE TO BLK
HRLI T2,LINE
BLT T2,(T1)
AOS T1,LIN ;STORE SEQUENCE
HRL T1,PAG
MOVEM T1,1(A2)
CAIE C,14 ;FORM FEED?
JRST CPOPJ1
AOS PAG ;YES, BUMP PAGE
SETZM LIN
JRST CPOPJ1
GETAER: TRNE C,IO.ERR ;QUIT IF ERROR
POPJ P,
JRST GETADN
;ROUTINE TO GET B BLK
GETB: MOVE B1,B2 ;ADVANCE TO NEXT BLK
HRRZ B2,(B1)
JUMPN B2,CPOPJ1 ;EASY IF REALLY EXISTS
PUSHJ P,SAVE2 ;SAVE P1-P2
SETZM LINE ;CLEAR BLOCK
MOVE T1,[XWD LINE,LINE+1]
BLT T1,LINE+LINSIZ-1
MOVE P1,[POINT 7,LINE] ;BP TO BLK
MOVEI P2,LINSIZ*5 ;CHAR COUNT
MOVEI T1,B ;ISELECT B
MOVEM T1,ICH
GETBLP: SOJLE P2,[ERR ER.EAT,"?",COMLTL,<Line too long>]
PUSHJ P,LSNI ;GET A CHAR
JRST GETBER
IDPB C,P1 ;STORE IT
PUSHJ P,BP ;LOOP UNTIL BREAK CHAR
JRST GETBLP
GETBDN: IBP P1 ;MAKE ASCIZ
SUBI P1,LINE ;LENGHT-1
HRRZI T1,2(P1) ;GET SOME CORE
PUSHJ P,GETBLK
POPJ P,
MOVE B2,T2 ;ADR IN B2
HRRM B2,(B1) ;LINK TO LIST
ADDI T1,-1(B2) ;ADR LAST WORD
ADDI T2,1 ;BLT LINE TO BLK
HRLI T2,LINE
BLT T2,(T1)
JRST CPOPJ1
GETBER: TRNE C,IO.ERR ;QUIT IF ERROR
POPJ P,
JRST GETBDN
;ROUTINE TO TEST IF A&B FILES ARE NOT EQUAL
;TO BE EQUAL, SEVERAL CONSECUTIVE LINES MUST MATCH
;NOSKIP IF ERROR
;SKIP IF EQUAL WITH T1=0
;SKIP IF NOT EQUAL WITH T1<>0
NE: PUSH P,P1 ;SAVE P1
MOVE P1,MATCH ;# LINES THAT MUST MATCH
PUSH P,A1 ;SAVE A POSITION
PUSH P,B1 ;SAVE B POSITION
NELOP: PUSHJ P,EQ ;EQUAL?
JRST NEDON ;NO, LOSE
PUSHJ P,BLANKP ;BLANK LINE?
SUBI P1,1 ;NOT BLANK, COUNT IT
PUSHJ P,GETA ;GET A BLK
JRST NEBAD
PUSHJ P,GETB ;GET B BLK
JRST NEBAD
JUMPG P1,NELOP ;LOOP UNTIL ENOUGH EQUAL
NEDON: AOS -3(P) ;SKIP RETURN
NEBAD: POP P,B1 ;RECALL B POSTION
HRRZ B2,(B1)
POP P,A1 ;RECALL A POSITION
HRRZ A2,(A1)
MOVE T1,P1 ;SAVE # LINES
POP P,P1 ;RECALL P1
POPJ P,
;ROUTINE TO TEST IF A&B BLKS ARE EQUAL
;SKIP IF YES
EQ: HLRZ T1,(A2) ;GET SIZE OF A BLK
HLRZ T2,(B2) ;GET SIZE OF B BLK
CAIE T1,1(T2) ;A SHOULD BE 1 BIGGER
POPJ P,
MOVEI T1,2(A2) ;ADR A DATA
MOVEI T3,1(B2) ;ADR B DATA
EQLOP: SOJE T2,CPOPJ1 ;QUIT IF NO MORE DATA
MOVE T4,(T1) ;COMPARE DATA
CAME T4,(T3)
POPJ P,
ADDI T1,1 ;ADVANCE A
AOJA T3,EQLOP ;ADVANCE B
;ROUTINE TO TEST IF A LINE IS BLANK
;(I.E. TEST IF IT SHOULD BE COUNTED).
;NOSKIP IF SHOULD BE COUNTED
;SKIP IF SHOULD NOT BE COUNTED
BLANKP: TRNE F,F.BLNK ;COUNT BLANK LINES?
POPJ P, ;YES, ALWAYS COUNT IF /BLANK
PUSHJ P,SAVE1
MOVEI P1,2(A2) ;ADDR OF DATA
HRLI P1,(POINT 7) ;BUILD A BP
BLNKP1: ILDB C,P1 ;GET A CHAR
CAIE C," " ;SPACE?
CAIN C,11 ;OR TAB?
JRST BLNKP1 ;YES
CAIN C,15 ;CR?
JRST BLNKP1 ;YES
PUSHJ P,BP ;BREAK?
POPJ P, ;NO, LINE IS NOT BLANK
JRST CPOPJ1 ;YES, LINE IS BLANK
SUBTTL DELETE CORE
;ROUTINE TO DELETE A BLK
DELA: HRRZ T1,(A2) ;UNLINK IT
HRRM T1,(A1)
HRRZ T1,FREMEM ;NO, LINK TO FREE LIST
HRRM T1,(A2)
HRRM A2,FREMEM
HRRZ A2,(A1) ;POINT TO NEXT BLK
POPJ P,
;ROUTINE TO DELETE B BLK
DELB: HRRZ T1,(B2) ;UNLINK IT
HRRM T1,(B1)
HRRZ T1,FREMEM ;NO, LINK TO FREE LIST
HRRM T1,(B2)
HRRM B2,FREMEM
HRRZ B2,(B1) ;POINT TO NEXT BLK
POPJ P,
SUBTTL SWITCHES
;/MATCH:N SWITCH
MAT: PUSHJ P,COLON ;EAT COLON
JRST CPOPJ1
PUSHJ P,DECI ;# LINES TO MATCH
JRST CPOPJ1
MOVEM T1,MATCH ;STORE IT
POPJ P, ;WIN
;NAME SWITCH
;/NAME:XXXXXX
;/NAME:"XXX XX XXX"
NAM: PUSHJ P,COLON ;EAT THE COLON
JRST CPOPJ1
PUSHJ P,EATS ;EAT SPACES
JRST CPOPJ1
CAIN C,42 ;IS 1ST CHAR A QUOTE?
JRST NAMQ ;YES, QUOTE TYPE
PUSHJ P,SIXI ;NO, GET SIXBIT NAME
JRST CPOPJ1
MOVEM T1,SIX ;STORE IT
SETZM Q ;NOT QUOTED TYPE
POPJ P,
NAMQ: PUSHJ P,CI ;EAT THE QUOTE
JRST CPOPJ1
PUSHJ P,SIXI ;GET THE FIRST WORD
JRST CPOPJ1
MOVEM T1,SIX ;STORE IT
PUSHJ P,SAVE2 ;SAVE P1-P2
MOVE P1,[POINT 7,Q] ;BP TO STORAGE FOR STRING
MOVEI P2,LINSIZ*5-1 ;STORAGE SIZE
NAMLOP: CAIN C,42 ;END QUOTE?
JRST NAMEQ ;YES
PUSHJ P,BP ;ILLEGAL IF BREAK CHAR
SOSGE P2 ;ILLEGAL IF TOO BIG
JRST NAMERR ;GO TYPE THE ERROR
IDPB C,P1 ;NO, STORE IT
PUSHJ P,CI ;GET A CHAR
JRST CPOPJ1
JRST NAMLOP ;KEEP GOING
NAMEQ: SETZ C, ;MAKE ASCIZ
IDPB C,P1
PUSHJ P,CI ;EAT END QUOTE
JRST CPOPJ1
POPJ P,
NAMERR: ERR ER.EAT,"?",COMNAM,<Illegal argument to NAME switch>
JRST CPOPJ1
DEFINE SW,<
XX BLANK,<TRO F,F.BLNK>
XX NOBLAN,<TRZ F,F.BLNK>
XX MATCH,<PUSHJ P,MAT>
XX LOG,<TRO F,F.LOG>
XX NOLOG,<TRZ F,F.LOG>
XX BASE,<TRO F,F.BAS>
XX NOBASE,<TRZ F,F.BAS>
XX USER,<TRZ F,F.BAS>
XX NOUSER,<TRO F,F.BAS> ;;LAST SWITCH IN SWITCH.INI
XX EXIT,<JRST EXT##>
XX HELP,<PUSHJ P,HELPER##>
XX NAME,<PUSHJ P,NAM>
XX NUMBER,<TRO F,F.NUM>
XX NONUMB,<TRZ F,F.NUM>
XX LETTER,<TRO F,F.LET>
XX NOLETT,<TRZ F,F.LET>
>
DEFINE XX(AA,BB),<SIXBIT /AA/>
SWN: SW
SWL==.-SWN
SWIL==11 ;NUMBER OF SWITCHES IN SWITCH.INI
DEFINE XX(AA,BB),<BB>
SWX: SW
SUBTTL LOWSEG
LIT ;PUT LITERALS IN HIGHSEG
RELOC 0
PDL: BLOCK PDLSIZ ;PUSH DOWN LIST
NUMBR: BLOCK 1 ;PATCH NUMBER
LETTR: BLOCK 1 ;PATCH LETTER
LINE: BLOCK LINSIZ ;ASCIZ LINE
Q: BLOCK LINSIZ ;QUOTED COMMENT
BSPC: BLOCK SPCSIZ ;B SPC, WITH WILDCARDS
ASPC2: BLOCK SPCSIZ ;A SPC, WITHOUT WILDCARDS
BSPC2: BLOCK SPCSIZ ;B SPC, WITHOUT WILDCARDS
OSPC2: BLOCK SPCSIZ ;O SPC, WITHOUT WILDCARDS
COUNTA: BLOCK 1 ;COUNT OF MODIFIED A LINES
COUNTB: BLOCK 1 ;COUNT OF MODIFIED B LINES
PAG: BLOCK 1 ;PAGE NUMBER
LIN: BLOCK 1 ;LINE NUMBER
CHKSUM: BLOCK 1 ;CHECKSUM
MATCH: BLOCK 1 ;NUMBER OF LINES THAT MUST MATCH
SAVFLG: BLOCK 1 ;SAVED FLAGS FROM SWITCH.INI
SAVMAT: BLOCK 1 ;SAVED /MATCH FROM SWITCH.INI
;BEGIN REGION TO BE ZEROED
ZER:!
AMEM: BLOCK 1 ;ADR 1ST A BLK
BMEM: BLOCK 1 ;ADR 1ST B BLK
;END REGION TO BE ZEROED
ZERSIZ==.-ZER
LOW: ;NON-NULL DATA
RELOC ;BACK TO HIGHSEG
HGH: PHASE LOW
;BEGIN DO NOT SEPARATE
;O SPC, WITH WILDCARDS
OSPC: XWD SPCSIZ,0 ;SIZE OF BLK
SIXBIT /DSK/ ;DEVICE
0 ;DEVICE MASK
BLOCK SFDS+1 ;PPN&SFDS
IFN SFDS,<0>
BLOCK SFDS+1 ;PPN&SFDS MASKS
0 ;FILENAME
0 ;FILENAME MASK
SIXBIT /COR/ ;EXTENSION
.IOASC ;ASCII MODE
;A SPC, WITH WILDCARDS
ASPC: XWD SPCSIZ,0 ;SIZE OF BLK
SIXBIT /DSK/ ;DEVICE
0 ;DEVICE MASK
BLOCK SFDS+1 ;PPN&SFDS
IFN SFDS,<0>
BLOCK SFDS+1 ;PPN&SFDS MASKS
0 ;FILENAME
0 ;FILENAME MASK
SIXBIT /MAC/ ;EXTENSION
.IOASC ;ASCII MODE
SIX: 0 ;SIXBIT NAME
;END DO NOT SEPARATE
DEPHASE
LOWSIZ==.-HGH
RELOC LOW ;BACK TO LOWSEG
BLOCK LOWSIZ
END COMPAR