Still more of Return of Son of Teco!!!!!
eric
eric at tekadg.UUCP
Sat Jan 5 07:48:33 AEST 1985
Okay! Someone sed that teco.m11 got truncated after symbol QSUMY: (QSMUY:?)
thereby resulting in the heartbreaking loss of the last 700 lines of that
worthy program. Sooooo....., in typical tearjerk fashion, the conclusion
is here once again presented. If you missed earlier episodes, tough. Go
harrass me or one of the inveterate pack rats who is always complaining about
a few extra bytes wasted on their infinite net.sources archive tapes by
net.sources.wanted.requests.in.net.sources. Their reverie of quiche, fine-wine
and cheese is made more attractive and warm by occasional intrusions of the
real world.......
--------------------------------------------------------------------------------
.SBTTL GET SUM OF Q REGISTER IN "QNMBR" (QSUMY)
QSUMY: MOV QNMBR(R5),R0 ;GET THE Q REG NUMBER
.SBTTL GET SUM OF Q REGISTER IN R0 (QSUMX)
QSUMX: MOV #QARRAY,R1 ;GET OFFSET TO Q REG ARRAY
ADD R5,R1 ;NOW FIND IT FOR REAL
CLR R2 ;START OFFSET OF REG AT 0
BR 12$ ;AND ENTER COUNTING LOOP
11$: ADD (R1)+,R2 ;SUM THE TOTAL OFFSE
TST (R1)+ ;AND SKIP THE VALUE SPOT
12$: DEC R0 ;MORE TO GO?
BGT 11$ ;YES
RTS PC ;NO, EXIT
90$: ERROR IQN,<"ILLEGAL Q REG NAME">;BAD Q REG NUMBER
.DSABL LSB
.SBTTL Q REGISTER SIZE ADJUST ROUTINE
.SBTTL R0 = NEW SIZE OF Q REGISTER IN "QNMBR"
.SBTTL RETURNS: R0 = 0
.SBTTL R1 = POINTER TO NEW Q REG SIZE
.SBTTL R2 = OFFSET TO THIS Q REG
.SBTTL (R3,R4 ARE CLOBBERED)
.ENABL LSB
QADJX: CMP QNMBR(R5),QCMND(R5) ;ABOUT TO CLOBBER COMMAND?
BEQ 90$ ;YES, BOOT HIM
QADJ: MOV R0,R3 ;COPY THE NEW Q REG SIZE
JSR PC,QSUMY ;AND SUM CURRENT Q REG OFFSET
MOV QZ(R5),R0 ;GET END OF ALL Q REGS
MOV R1,R4 ;COPY Q REG SIZE POINTER
MOV R3,R1 ;AND GET WORKING COPY OF NEW SIZE
ADD (R4),R2 ;POINTER TO CURRENT END OF Q REG
SUB (R4),R1 ;SIZE CHANGE (NEW-OLD)
BLO 25$ ;NEW < OLD
BEQ QSUMY ;NEW = OLD
ADD R0,R1 ;NEW > OLD; GET NEW QZ
SIZE QREGS ;CHECK OUT THE SIZE
BCC 91$ ;WE CAN'T DO IT
MOV R3,(R4) ;SET NEW Q REG SIZE
MOV R1,QZ(R5) ;SET NEW TOTAL Q REG SIZE
MOV QRSTOR(R5),R3 ;GET Q REG AREA POINTER
ADD R3,R0 ;MAKE ALL
ADD R3,R1 ; POINTERS
ADD R3,R2 ; ABSOLUTE
MOVB (R2),R4 ;SAVE CHARACTER IN MIDDLE
CLRB (R2) ;THEN FLAG THAT BYTE AS NULL
BR 23$ ;AND ENTER MOVE LOOP
22$: MOVB -(R0),-(R1) ;MOVE A BYTE UP FROM TOP
BNE 22$ ;CANNOT BE END IF NON-ZERO
23$: CMP R0,R2 ;DONE?
BHI 22$ ;NOT YET...
MOVB R4,(R1) ;RESTORE SAVED CHARACTER
24$: MOV QCMND(R5),R0 ;GET COMMAND Q REG NUMBER
MOV #QSUMY,-(SP) ;SET FOR COMMAND SETUP JUST IN CASE
SETCMD: MOV R0,QCMND(R5) ;SET COMMAND Q REG NUMBER
JSR PC,QSUMX ;AND SUM UP FOR THAT REGISTER
MOV R2,QBASE(R5) ;STORE THE BASE OFFSET
MOV (R1),QLENGT(R5) ; AND THE LENGTH
RTS PC ;THEN EXIT
25$: MOV R3,(R4) ;SET NEW Q REG SIZE
ADD R1,QZ(R5) ;LOWER THE TOTAL Q REG SIZE
ADD R2,R1 ;POINT TO THE NEW END
MOV QRSTOR(R5),R3 ;GET Q REG AREA POINTER
ADD R3,R0 ;MAKE ALL
ADD R3,R1 ; POINTERS
ADD R3,R2 ; ABSOLUTE
CLRB (R0) ;FLAG THE END BYTE AS NULL
BR 27$ ;ENTER MOVE LOOP
26$: MOVB (R2)+,(R1)+ ;MOVE A BYTE DOWN
BNE 26$ ;CANNOT BE END IF NON-ZERO
27$: CMP R2,R0 ;DONE?
BLO 26$ ;NOT YET...
BR 24$ ;ALL DONE
90$: ERROR CCC,<"CAN'T CLOBBER COMMAND">
91$: ERROR MEM,<"MEMORY OVERFLOW"> ;NO GO
.DSABL LSB
.SBTTL GENERAL SUBROUTINES
GETXTP: MOV P(R5),R0 ;GET .
CMP R0,ZZ(R5) ;TOO FAR?
BHIS 1$ ;YES [BHIS=BCC]
ADD TXSTOR(R5),R0 ;NO, MAKE ABSOLUTE
MOVB (R0),R0 ;AND GET CHARACTER
SEC ;OK [CARRY SET]
1$: RTS PC ;EXIT
.ENABL LSB
90$: ERROR PDO,<"PUSH-DOWN LIST OVERFLOW">
1$: CMP PDL(R5),SCHBUF(R5) ;PUSHING TOO FAR?
BHIS 90$ ;YEP
ADD R5,(SP) ;NOPE, MAKE OFFSET ABSOLUTE
MOV @(SP)+, at PDL(R5) ;NOW SAVE IT
ADD #2,PDL(R5) ;AND GO TO NEXT LOCATION
PUSH: MOV (R4)+,-(SP) ;GET THE OFFSET
BPL 1$ ;NOT END OF LIST YET
2$: TST (SP)+ ;GET RID OF FLAG
RTS R4 ;AND EXIT
POP: MOV (R4)+,-(SP) ;GET THE OFFSET
BMI 2$ ;GET OUT IF END
SUB #2,PDL(R5) ;BACK UP THE LIST
ADD R5,(SP) ;MAKE ABSOLUTE
MOV @PDL(R5),@(SP)+ ;RESTORE VALUE
BR POP ;AND CONTINUE
.DSABL LSB
SCNUPP: JSR PC,SCAN ;SCAN FIRST
UPPERC: CMP R0,#141 ;ALREADY OK?
BLO 1$ ;YES
CMP R0,#173 ;DONT CHANGE HIGH CHARACTERS
BHIS 1$
BIC #40,R0 ;NO, SO CORRECT IT
1$: RTS PC ;AND EXIT
QSKP: JSR PC,QCHK ;CHECK FOR A QUOTE CHARACTER
MOV (R5),OSCANP(R5) ;AND SAVE "SCANP"
1$: JSR PC,SCAN ;NOW SCAN
CMP R0,QUOTE(R5) ;MATCH?
BNE 1$ ;NOPE
RTS PC ;NOW EXIT
.ENABL LSB
BZCHK: CMP R0,ZZ(R5) ;TOO BIG?
BLOS 1$ ;NOPE
ERROR POP,<"POINTER OFF PAGE">;YEP
NOTRCE: MOV TFLG(R5),TFGTMP(R5) ;SAVE TRACE FLAG
CLR TFLG(R5) ;THEN TURN OFF TRACE
1$: RTS PC ;EXIT
.DSABL LSB
ENTRCE: MOV TFGTMP(R5),TFLG(R5) ;RESTORE TRACE FLAG
RTS PC ;AND EXIT
.ENABL LSB
20$: MOV #1,R0 ;PRETEND WE SAW A ONE
JSR PC,NCOM ;AND COMPUTE ON IT
GETN: MOV N(R5),R0 ;GET THE NUMBER
INC NFLG(R5) ;REALLY THERE?
BNE 20$ ;NOPE
RTS PC ;YES
.DSABL LSB
.ENABL LSB
TERMS: CMP R0,#FF+1 ;TERMINATOR TEST
BHIS 11$ ;TOO BIG, RETURN C=0
10$: CMP #LF-1,R0 ;SET CARRY ON LOW RANGE
11$: RTS PC ;AND EXIT
NUMER: CMP R0,#'9+1 ;NUMERIC TEST
BHIS 1$ ;RETURN CARRY CLEAR IF HIGH
CMP #'0-1,R0 ;SET CARRY ON LOW RANGE
1$: RTS PC ;AND EXIT
RAD50: CMP R0,#'. ;.?
BEQ 10$ ;YES
CMP R0,#'$ ;$?
BEQ 10$ ;YES
ALPHAN: JSR PC,NUMER ;CHECK FOR NUMERIC FIRST
BCS 2$ ;EXIT IF SO
ALPHA: JSR PC,UPPERC ;CHECK FOR ALPHABETIC
CMP R0,#'Z+1 ;ALPHABETIC TEST
BHIS 2$ ;RETURN C=0 IF TOO HIGH
CMP #'A-1,R0 ;SET CARRY ON LOW RANGE
2$: RTS PC ;AND EXIT
TSTNXT: MOV (R5),R0 ;GET COMMAND POINTER
CMP R0,QLENGT(R5) ;END OF COMMAND?
BHIS 20$ ;YES, SO EXIT (C=0)
ADD QBASE(R5),R0 ;NO, ADD COMMAND OFFSET
ADD QRSTOR(R5),R0 ;AND MAKE ABSOLUTE
MOVB (R0),R0 ;FETCH CHARACTER
JSR PC,UPPERC ;AND MAKE UPPER CASE
CMP R0,(R4) ;MATCH?
BNE 20$ ;NO, EXIT (C=0)
INC (R5) ;YES, BUMP POINTER
TST (R4)+ ;SKIP ARGUMENT
SEC ;INDICATE ALL OK
RTS R4 ;AND EXIT
20$: TST (R4)+ ;SKIP ARGUMENT
RTS R4 ;AND EXIT
.DSABL LSB
NLINES: INC CFLG(R5) ;WAS THERE A COMMA?
BEQ 1$ ;YES
CLR CFLG(R5)
MOV P(R5),M(R5) ;NO, SO SAVE . IN "M"
JSR PC,@'L*2+TECOCH ;AND MOVE . FORWARD "N" LINES
MOV P(R5),N(R5) ;"N" IS THE NEW .
MOV M(R5),P(R5) ;RESTORE THE ORIGINAL .
1$: CLR NFLG(R5) ;USE UP THE NUMBER
MOV N(R5),R0 ;GET NTH CHARACTER POSITION
CMP R0,M(R5) ;IS IT AFTER MTH CHARACTER?
BHIS 2$ ;YES
MOV M(R5),N(R5) ;NO, SO SWITCH
MOV R0,M(R5) ; N AND M
MOV N(R5),R0 ;AND GET NTH POSITION AGAIN
2$: JSR PC,BZCHK ;IN RANGE?
SUB M(R5),R0 ;FIND DISTANCE BETWEEN N AND M
RTS PC ;THEN EXIT
ZEROD: MOV (R4)+,TEMP(R5) ;PICKUP OUTPUT ROUTINE ADDRESS
MOV R4,(SP) ;THEN SET THE RETURN ADDRESS
MOV N(R5),-(SP) ;GET NUMBER
BPL 1$ ;IT IS +
TST NMRBAS(R5) ;IT IS -, BUT IS RADIX OCTAL?
BNE 1$ ;IF OCTAL, THEN NO SIGN
MOV #'-,R0 ;IF DECIMAL, THEN SIGNED
JSR PC, at TEMP(R5) ;OUTPUT MINUS SIGN
NEG (SP) ;AND MAKE +
1$: MOV (SP)+,R0 ;RESTORE THE NUMBER
MOV #8.,R2 ;RADIX = 8?
TST NMRBAS(R5) ;THIS TELLS US...
BNE 2$ ;YES
TST (R2)+ ;NO, RADIX = 10.
2$: JSR PC,DIVD ;NOW DIVIDE
MOV R1,-(SP) ;SAVE REMAINDER
TST R0 ;MORE TO GO?
BNE 2$ ;YES
3$: MOV (SP)+,R0 ;GET BACK A DIGIT
CMP R0,#9. ;DIGIT OR RETURN ADDRESS?
BHI 4$ ;RETURN ADDRESS
ADD #'0,R0 ;DIGIT
JSR PC, at TEMP(R5) ;OUTPUT IT
BR 3$ ;AND LOOP
4$: JMP (R0) ;EXIT
.SBTTL SEARCH
.ENABL LSB
SEARCH: CMP #-2,CLNF(R5) ;"::" MODE?
BNE 2$ ;NO
MOV #-1,CFLG(R5) ;YES--FAKE AN ARG OF "1,"
MOV #1,M(R5)
2$: MOV XFLAG(R5),-(SP) ;SAVE SEARCH MATCH FLAG
JSR PC,GETN ;GET THE NUMBER
MOV R0,-(SP) ;NOW SAVE THE NUMBER
BNE 1$ ;MUSTN'T BE ZERO
ERROR ISA <%ILLEGAL SEARCH ARGUMENT%>
1$: JSR PC,QCHK ;SET UP FOR ANY QUOTED STRING
MOV SCHBUF(R5),R4 ;GET SEARCH BUFFER START
MOV #SCHSIZ-1,R3 ; AND ITS SIZE
5$: CLR R2 ;GET INPUT FROM SCAN
10$: TST R2 ;WHERE DO THEY COME FROM?
BNE 25$ ;A Q-REG IF NON-0
JSR PC,SCAN ;PICKUP A CHARACTER TO SEARCH FOR
CMP R0,QUOTE(R5) ;END OF SEARCH STRING?
BEQ 50$ ;YES
CMP R0,#'^ ;CARAT?
BNE 11$ ;NO
BIT #1,EDFLAG(R5) ;SPECIAL TREATMENT FOR IT?
BNE 11$ ;NO
JSR PC,SCNUPP ;GET NEXT AS UPPER CASE
BIC #-77-1,R0 ;AND CONVERT TO CONTROL CODE
11$: CMP R0,#'Q-100 ;CTRL/Q?
BNE 30$ ;NOPE
JSR PC,SCAN ;YES, SO GET NEXT LITERALLY
BR 40$ ;AND STORE IT IN SEARCH BUFFER
20$: TST R2 ;^E - ARE WE IN Q-REG FETCH?
BNE 35$ ;YES, USE AS NORMAL ^E
TSTNXT 'Q ;NO, IS IT Q-REG FETCH?
MOV #'E-100+200,R0 ;RESTORE IT AS CTRL/E
BCC 40$ ;NO, ENTER IT AS SPECIAL
JSR PC,QREF ;YES, REFERENCE THE Q-REG
ADD QRSTOR(R5),R2 ;MAKE SOURCE ABSOLUTE
MOV (R1),R1 ;GET THE COUNT IN R1
25$: DEC R1 ;ANYTHING LEFT IN Q-REG?
BMI 5$ ;NO, GO CLEAR FLAG
MOVB (R2)+,R0 ;YES, GET A BYTE
30$: CMP R0,#' ;LARGER THAN SPACE?
BHIS 33$
CMP R0,#'E-100 ;CTRL/E?
BEQ 20$ ;YES
CMP R0,#'N-100 ;CTRL/N?
BEQ 35$ ;YES, THAT IS SPECIAL
CMP R0,#'S-100 ;CTRL/S?
BEQ 35$ ;YES, THAT IS SPECIAL
CMP R0,#'X-100 ;CTRL/X?
BEQ 35$ ;YES, THAT IS SPECIAL
CMP R0,#'\-100 ;CTRL-\?
BNE 40$ ;NOPE--NORMAL SEARCH CHARACTER
TST XFLAG(R5) ;ANY CASE MODE?
BEQ 34$
CLR XFLAG(R5) ;FORCE ANY CASE MODE
BR 10$
34$: INC XFLAG(R5) ;FORCE EXACT CASE MODE
BR 10$
33$: TST XFLAG(R5) ;EXACT MODE?
BNE 40$ ;GOOD-SAVES TIME
JSR PC,ALPHA ;UPCASES IF ALPHA
BCC 40$ ;NOT ALPHA->NOT SPECIAL
CMPB #'E+100,-1(R4) ;IS THIS AFTER ^E?
BEQ 40$ ;THEN LEAVE IT ALONE
35$: BIS #200,R0 ;FLAG THE SPECIAL CHARACTERS
40$: MOVB R0,(R4)+ ;STORE IN SEARCH BUFFER
MOVB #-1,(R4) ; AND MARK END OF BUFFER
DEC R3 ;MORE ROOM?
BGT 10$ ;YES, SO CONTINUE
ERROR STL,<%SEARCH STRING "%<-1>%" TOO LARGE%>
50$: MOV (SP)+,R2 ;GET THE REPEAT COUNT
TST M(R5) ;MAKE M= ABS(M)
BGE .SURCH
NEG M(R5)
.DSABL LSB
.ENABL LSB
.SURCH: MOV P(R5),-(SP) ;SAVE POINTER LOCATION
MOV #1,-(SP) ;GUESS AT FORWARD TYPE SEARCH
TST R2 ;GOOD GUESS??
BPL 30$ ;YES, MOVE . BY +1 EACH FAILURE
NEG (SP) ;NO, MOVE . BY -1 EACH FAILURE
NEG R2 ;AND GET A POSITIVE HIT COUNTER
30$: CLR LSCHSZ(R5) ;SET LAST STRING SIZE TO 0
MOV P(R5),R1 ;GET .
ADD TXSTOR(R5),R1 ;AND MAKE IT ABSOLUTE
ADD TXSTOR(R5),ZZ(R5) ;NOW MAKE END OF TEXT ABSOLUTE ALSO
40$: MOV R1,R3 ;GET STARTING POINT
MOV SCHBUF(R5),R4 ;AND SEARCH STRING START
.SUR.Y: CMP R3,ZZ(R5) ;END OF TEXT?
BLO 50$ ;NOPE
CMPB (R4),#-1 ;YEP, BUT DOES IT MATCH END OF STRING?
BEQ 62$ ;YES, SO ALL DONE (FOUND)
TST (SP) ;NO, SEARCHING BACKWARDS??
BMI .SUR.N ;IF BACKWARDS THEN MOVE . IF POSSIBLE
47$: CLRB (SP) ;INDICATE FAILURE (0 OR 177400)
TST CFLG(R5) ;BOUNDED SEARCH?
BMI 65$ ;YES, SO KEEP .
BIT #16.,EDFLAG(R5) ;FAILING SEARCH ALWAYS PRESERVE .?
BNE 65$ ;BRANCH IF SO
CLR 2(SP) ;NO, SO .=0
BR 65$ ;AND EXIT
50$: MOVB (R4)+,R0 ;GET A STRING CHARACTER
BMI 60$ ;IT WAS A SPECIAL
CMPB R0,(R3)+ ;MATCH?
BEQ .SUR.Y ;YES, SO CONTINUE
.SUR.N: ADD (SP),R1 ;NOPE, MOVE . ONE POSITION
MOV #-1,R4 ;SIZE OF ENTRY
54$: TST CFLG(R5) ;SPECIAL SEARCH?
BGE 55$ ;NO--CONTINUE
TST M(R5) ;UNLIMITED BOUND?
BEQ 55$ ;YES--CONTINUE
ADD R4,M(R5) ;ADJUST LIMIT
BLE 47$ ;LIMIT REACHED--SEARCH FAILS
55$: CMP R1,TXSTOR(R5) ;NO, IS . TOO SMALL NOW??
BHIS 40$ ;. IS O.K., KEEP SEARCHING
BR 47$ ;. IS TOO SMALL, SEARCH FAILS
60$: INCB R0 ;WAS SPECIAL THE END FLAG?
BNE .SUR.S ;NOPE, REAL SPECIAL
62$: MOV R1,PST(R5) ;SAVE (ABS) STARTING POSITION
MOV R1,R4 ;COPY (ABS) START AGAIN TO
SUB R3,R4 ;GET "START"-"END" = -("LENGTH")
MOV R3,R1 ;SET NEXT START IF FORWARDS
TST (SP) ;IS SEARCH GOING FORWARDS??
BPL 63$ ;YES, SO NEW START IS SET
ADD R4,R1 ;NO, BACKWARDS, SO GO BACK AND
ADD R4,R1 ; BACK AGAIN FOR NEW START
63$: DEC R2 ;SEARCH ANOTHER TIME??
BGT 54$ ;YES, SO SEARCH AGAIN ALREADY
MOV R4,LSCHSZ(R5) ;NO, DONE, STORE -("LENGTH")
SUB TXSTOR(R5),R3 ;MAKE ENDING . RELATIVE
MOV R3,2(SP) ; AND SET THAT ENDING .
SUB TXSTOR(R5),PST(R5) ;MAKE STARTING . RELATIVE
MOV #-1,(SP) ;INDICATE SUCCESS (-1)
65$: SUB TXSTOR(R5),ZZ(R5) ;MAKE END OF TEXT RELATIVE
MOV (SP)+,R1 ;SET CC'S AND RETURN INDICATOR
MOV (SP)+,P(R5) ;SET POINTER
MOV (SP)+,XFLAG(R5) ;RESTORE FLAG
TST R1 ;SET CC'S
RTS PC ;AND EXIT
.DSABL LSB
SUR.Y: TST (SP)+ ;ARE WE IN NEG MODE?
BEQ .SUR.Y ;NO
BR .SUR.N ;YES--SEARCH FAILED!
SUR.N: TST (SP)+ ;ARE WE IN NEG MODE?
BEQ .SUR.N ;NO
BR .SUR.Y ;YES--TAKE ALTERNATE EXIT
.SUR.S: CLR -(SP) ;NEG FLAG
74$: CMPB R0,#'A+200+1 ;IS IT ANYCASE ALPHA?
BHIS 95$
CMPB R0,#'S-100+200+1 ;WAS SPECIAL CTRL/S?
BEQ 80$ ;YES (IT IS CTRL/S)
BHI 85$ ;NO (IT IS CTRL/X)
CMPB R0,#'E-100+200+1 ;NO, IS IT CTRL/E?
BEQ 81$ ;YES
MOVB (R4)+,R0 ;NO (IT IS CTRL/N)
BMI 75$ ;NEXT AS SPECIAL IS VERY SPECIAL
TST (SP)+ ;GET RID OF RETURN ITEM
CMPB R0,(R3)+ ;MATCH? (CTRL/N)
BNE .SUR.Y ;NO MATCH IS GOOD HERE
BR .SUR.N ;MATCH IS BAD...
75$: COM (SP) ;REVERSE NEGATE SENSE
INCB R0 ;TEST VALUE OF COMPARAND
BNE 74$ ;VALID CHARACTER--GO TO IT
TST (SP)+ ;END OF STRING
BR .SUR.Y ;CALL A MATCH
76$: MOVB (R3)+,R0 ;GET A TEXT CHATACTER
JSR PC,@(SP)+ ;GO TEST CHARACTER
78$: INC R4 ;BUMP SEARCH BUFFER POINTER
BCS SUR.Y ;MADE IT
BR SUR.N ;NO GO
80$: MOVB (R3)+,R0 ;GET A TEXT CHARACTER
JSR PC,ALPHAN ;ALPHANUMERIC?
BCC SUR.Y ;NO, SO OK
BR SUR.N ;YES, SO NO
81$: CMPB (R4),#'[ ;CTRL/E AND "["?
BEQ 90$
CMPB (R4),#'S ;CTRL/E AND "S"?
BEQ 87$ ;YES
MOV #ALPHA,-(SP) ;SET FOR A
CMPB (R4),#'A ;A?
BEQ 76$ ;YES
MOV #RAD50,(SP) ;SET FOR C
CMPB (R4),#'C ;C?
BEQ 76$ ;YES
MOV #NUMER,(SP) ;SET FOR D
CMPB (R4),#'D ;D?
BEQ 76$ ;YES
MOV #TERMS,(SP) ;SET FOR L
CMPB (R4),#'L ;L?
BEQ 76$ ;YES
MOV #ALPHAN,(SP) ;ALPHANUMRIC MATCH?
CMPB (R4),#'R
BEQ 76$
TST (SP)+ ;NO, POP ADDRESS
CMPB (R4),#'X ;X?
84$: BNE SUR.N ;NOTHING, SAY NO MATCH
INC R4 ;CTRL/E & X MEAN ANY MATCH
85$: INC R3 ;CTRL/X IS ANY MATCH
BR SUR.Y ;INDICATE SUCCESS
87$: MOV R3,-(SP) ;SAVE POINTER TO TEXT
88$: CMP R3,ZZ(R5) ;END OF TEXT?
BHIS 89$ ;YES, QUIT
MOVB (R3)+,R0 ;NO, GET CHARACTER
CMP R0,#SPACE ;SPACE?
BEQ 88$ ;YES
CMP R0,#TAB ;TAB?
BEQ 88$ ;YES
89$: DEC R3 ;CORRECT TEST POINTER
CMP (SP)+,R3 ;AND CHECK FOR NON-NULL
BR 78$ ;NOW EXIT
90$: INC R4
91$: TSTB (R4) ;IS THIS AN EXACT CASE MATCH?
BMI 94$
CMPB (R3),(R4)+ ;DOES CHAR MATCH?
96$: BEQ 92$ ;YES--GOTO FINISH CODE
CMPB #'],(R4) ;NOT FOUND?
BEQ 97$ ;CARRY IS CLEAR
CMPB #-1,(R4) ;END OF BUFFER?
BNE 91$ ;NO-CONTINUE
97$: INC R3 ;FINISHED (POINT PAST CHAR)
BR 78$ ;FINISHED (CARRY CLEAR)
92$: CMPB #'],(R4) ;SEARCH FOR END
BEQ 93$
CMPB #-1,(R4)+ ;END OF BUFFER
BNE 92$
DEC R4 ;CORRECT POINTER
93$: INC R4
BR 85$ ;FINISHED (MATCHED)
94$: MOVB (R3),R0 ;UPCASE COMPARAND
JSR PC,UPPERC
MOVB (R4)+,-(SP) ;DO SOME STACK ARITHMETIC
BIC #200,(SP) ;CLEAR FLAG BIT
CMPB R0,(SP)+ ;IS THERE A MATCH?
BR 96$
95$: SUB #200+1,R0 ;GET BACK AS UC ASCII CHAR
CMPB (R3),R0 ;IS IT A MATCH?
BEQ 85$
BIS #40,R0 ;CHECK FOR UPPERCASE
CMPB R0,(R3)+
BNE SUR.N ;NO MATCH
JMP SUR.Y ;MATCH
.SBTTL SIZING (SHUFFLING) ROUTINE
SIZE: MOV R0,-(SP) ;SAVE R0
MOV (R4)+,R0 ;GET OFFSET TO MAX TO CHANGE
CMP R1,#077740 ;IS REQUEST AT ALL REASONABLE?
BHIS 99$ ;NOPE [BHIS=BCC => FAILURE]
MOV R1,-(SP) ;SAVE R1
MOV R2,-(SP) ; AND SAVE R2
MOV R0,R2 ;SAVE THE MAX'S OFFSET VALUE
ADD R5,R0 ;MAKE R0 ABS PTR TO MAX
SUB (R0),R1 ;FIND CHANGE AMOUNT
BLO 98$ ;ALREADY DONE [BLO=BCS => OK]
ADD #40,R1 ;FUDGE UP REQUEST A LITTLE
MOV R3,-(SP) ;SAVE R3
SUB #ZMAX,R2 ;GET WHICH AREA IS CHANGING
MOV R2,-(SP) ;0=>TEXT; <>0=>QREGS
MOV R1,-(SP) ;SAVE ORIGINAL DELTA AMOUNT
JSR PC,40$ ;SEE IF CURRENT FREE DOES IT
MOV #QMAX,R2 ;NO, SO GET OTHER AREA'S MAX
MOV QZ(R5),R3 ; AND CURRENT IN USE
TST 2(SP) ;QREGS ARE OTHER AREA IF 0
BEQ 1$ ;WE ARE CHANGING TEXT
MOV #ZMAX,R2 ;ELSE GET REAL OTHER AREA'S
MOV ZZ(R5),R3 ; MAX AND CURRENT IN USE
1$: NEG R3 ;GET -(IN USE)
ADD R5,R2 ;ABS PTR TO OTHER MAX
ADD (R2),R3 ;FREE = MAX -(IN USE)
SUB #200.,R3 ;FIND THE PUNISH AMOUNT
BLOS 10$ ;NOT ENOUGH FREE TO PUNISH
SUB R3,(R2) ;ELSE PUNISH THE OTHER MAX
ADD R3,CURFRE(R5) ;AND UPDATE FREE SPACE
TST 2(SP) ;WHICH AREA ARE WE CHANGING
BEQ 3$ ;IF TEXT, THEN JUST PUNISHED QREGS
MOV QRSTOR(R5),R2 ;PTR TO OLD BEG
NEG R3 ;-(PUNISH)
ADD R2,R3 ;PTR TO NEW BEG (LOWER)
MOV R3,QRSTOR(R5) ;SET NEW BEGINNING
MOV R4,-(SP) ;SAVE R4
MOV R2,R4 ;PTR TO OLD BEG
ADD QMAX(R5),R4 ;PTR TO OLD END +1
MOVB -(R4),-(SP) ;SAVE @ OLD END
CLRB (R4) ;THEN FLAG IT AS NULL BYTE
2$: MOVB (R2)+,(R3)+ ;FROM OLD BEG TO NEW BEG
BNE 2$ ;CANNOT BE END IF NON-NULL
CMP R2,R4 ;OLD BEG+? CAUGHT OLD END??
BLOS 2$ ;NOT YET
MOVB (SP)+,-(R3) ;YES, SO RESTORE @ NEW END
MOV (SP)+,R4 ;RESTORE R4
3$: JSR PC,40$ ;WILL FREE SPACE DO IT NOW?
10$: JSR PC,SIZER ;ASK WHOEVER FOR MORE PLEASE
BCC 3$ ;WE GOT IT!
MOV (SP)+,R3 ;GET BACK ORIGINAL DELTA
SUB R1,R3 ;FIND WHAT WE GAVE OF FREE SPACE
ADD R3,CURFRE(R5) ;AND RETURN IT TO FREE SPACE
TST (SP)+ ;DUMP THE AREA DETERMINATION
BR 97$ ;AND EXIT
40$: MOV CURFRE(R5),R3 ;GET CURRENT FREE AMOUNT
CMP R1,R3 ;WILL IT DO THE TRICK?
BHI 41$ ;NOPE, BUT WILL HELP SOME
MOV R1,R3 ;YEP, SO DON'T USE IT ALL
41$: SUB R3,CURFRE(R5) ;WE GAVE AT THE OFFICE
SUB R3,R1 ;CORRECT DELTA CHANGE AMOUNT
BEQ 50$ ;ALL DONE
RTS PC ;ELSE RETURN FOR MORE WORK
50$: TST (SP)+ ;DUMP THE RETURN ADDRESS
MOV (SP)+,R1 ;GET ORIGINAL DELTA
ADD R1,(R0) ;AND CORRECT THE MAX
TST (SP) ;WHICH AREA IS CHANGING?
BNE 96$ ;QREGS, SO VERY EASY
MOV QRSTOR(R5),R0 ;TEXT, SO GET OLD BEG PTR
ADD R1,QRSTOR(R5) ;UPDATE QREG PTR
MOV R0,R2 ;COPY OLD BEG PTR
ADD QMAX(R5),R0 ;HAVE OLD END PTR +1
ADD R0,R1 ;HAVE NEW END PTR +1 (HIGHER)
MOVB (R2),R3 ;SAVE @ OLD BEG
CLRB (R2) ;THEN FLAG AS A NULL BYTE
51$: MOVB -(R0),-(R1) ;MOVE OLD END TO NEW END
BNE 51$ ;CANNOT BE END IF NON-NULL
CMP R2,R0 ;CAUGHT UP YET?
BLO 51$ ;NOPE, SO CONTINUE
MOVB R3,(R1) ;RESTORE @ NEW BEG
96$: COM (SP)+ ;DUMP AREA FLAG AND CARRY=1
97$: MOV (SP)+,R3 ;RESTORE R3
98$: MOV (SP)+,R2 ; AND R2
MOV (SP)+,R1 ; AND R1
99$: MOV (SP)+,R0 ; AND R0
RTS R4 ;FINALLY EXIT
.SBTTL CHARACTER LIST FOR " COMMANDS
.TABLE .CND
.ENTRY A
.ENTRY C
.ENTRY D
.ENTRY E
.ENTRY F
.ENTRY G
.ENTRY L
.ENTRY N
.ENTRY R
.ENTRY S
.ENTRY T
.ENTRY U
.WORD -1
.SBTTL CHARACTER LIST FOR E COMMANDS
.TABLE .EEE
.word '!,.eeesh ;ENTRY !
.ENTRY B
.ENTRY C
.ENTRY D
.ENTRY F
.ENTRY G
.ENTRY H
.ENTRY I
.ENTRY K
.ENTRY O
.ENTRY Q
.ENTRY R
.ENTRY S
.ENTRY T
.ENTRY V
.ENTRY W
.ENTRY X
.WORD -1
.SBTTL COMMAND CHARACTER LIST
.TABLE .CMD
.WORD BELL, .CMDBL
.WORD BS, .CMDBS
.WORD LF, .CMDLF
.WORD 'U-100, .CMDCU
.WORD ALTMOD, .CMDAM
.WORD SPACE, .CMDSP
.WORD '*, .CMDST
.WORD '?, .CMDQM
.WORD -1
.SBTTL CHARACTER TABLES FOR "SKPSET"
.TABLE .CSM
.WORD 'A-100, .CSMY ;CTRL/A
.WORD 'I-100, .CSMQ ;TAB
.WORD 'U-100, .CSMU ;CTRL/U
.WORD '^-100, .CSMD ;CTRL/^
.WORD '!, .CSMY ;!
.WORD '", .CSMDQ ;"
.WORD '%, .CSMD ;%
.WORD '<, .CSMI ;<
.WORD '>, .CSMO ;>
.WORD '@, .CSMA ;@
.WORD 'E, .CSME ;E (E!, EB, EI, ER, EW)
.WORD 'F, .CSMF ;F (FR, FS, FN, FB, FC)
.WORD 'G, .CSMD ;G
.WORD 'I, .CSMQ ;I
.WORD 'M, .CSMD ;M
.WORD 'N, .CSMQ ;N
.WORD 'O, .CSMQ ;O
.WORD 'Q, .CSMD ;Q
.WORD 'S, .CSMQ ;S
.WORD 'U, .CSMD ;U
.WORD 'X, .CSMD ;X
.WORD '[, .CSMD ;[
.WORD '], .CSMD ;]
.WORD '^, .CSMUA ;^
.WORD '_, .CSMQ ;_
.WORD -1
.TABLE .CSME
.word '!, .csmq ;E!
.WORD 'B, .CSMQ ;EB
.WORD 'I, .CSMQ ;EI
.WORD 'R, .CSMQ ;ER
.WORD 'W, .CSMQ ;EW
.WORD -1
.TABLE .CSMF
.WORD 'B, .CSMQ ;FB
.WORD 'C, .CSM2Q ;FC
.WORD 'N, .CSM2Q ;FN
.WORD 'R, .CSMQ ;FR
.WORD 'S, .CSM2Q ;FS
.WORD -1
.SBTTL F CHARACTER LIST
.TABLE .FFF
.word '',.fffq
.word '<,.fffla
.word '>,.fffra
.ENTRY B
.ENTRY C
.ENTRY N
.ENTRY R
.ENTRY S
.word vbar,.fffvb
.WORD -1
.SBTTL FINAL FIXUPS...
.PSECT TECOER
.EVEN
.END
More information about the Comp.sources.unix
mailing list