diff --git a/ex4b.mac b/ex4b.mac new file mode 100644 index 0000000..d7fe24e --- /dev/null +++ b/ex4b.mac @@ -0,0 +1,70 @@ + TITLE REVERSE - Example 4-B + SEARCH MONSYM + +COMMENT $ + This is another program to demonstrate the reversal of the + characters of an input line. + + The structure or organizatino of this program is similar to + that found in example 4-A. In contrast to example 4-A, this + program uses the byte instructions to make character processing + easier. +$ + +A=1 ;Assign symbolic names to +B=2 ;the accumulators +C=3 +P=17 ;Symbolic for push down pointer + +BUFLEN==40 +PDLEN==240 + +IBUFR: BLOCK BUFLEN ;buffer for input line +OBUFR: BLOCK BUFLEN+1 ;buffer for output line +PDLIST: BLOCK PDLEN + +START: RESET ;initialize IO + MOVE P,[IOWD PDLEN,PDLIST] ;initial stack pointer +GETLIN: HRROI A,[ASCIZ/Reverse a line: /] + MOVE C,A ;save this prompt for RDTTY + PSOUT ;prompt for a line + HRROI A,IBUFR ;Setup buffer space for RDTTY + MOVEI B,BUFLEN*5-1 ;size of buffer + RDTTY ;read a line + ERJMP ERROR + MOVE B,[POINT 7,IBUFR] ;Initial input pointer to line +INLOOP: ILDB A,B ;gobble a byte + CAIN A,15 ;is it carriage return + JRST INLOOP ;discard return + CAIN A,12 ;is it the line-feed? + JRST INDONE ;yes. finish with line + JUMPE A,INDONE ;jump in case of input buffer overrun. + PUSH P,A ;normal character, save it. + JRST INLOOP ;loop thru line + +INDONE: CAMN P,[IOWD PDLEN,PDLIST] ;is the stack empty? + JRST STOP ;yes, line was all blank + HRROI A,[ASCIZ/Reversed line: /] ;tell them what's coming + PSOUT + MOVE B,[POINT 7,OBUFR] ;Initialize output pointer +OUTLOO: POP P,A ;get a byte from stack + IDPB A,B ;store the byte + CAME P,[IOWD PDLEN,PDLIST] ;Is the stack unwound now, + JRST OUTLOO ;no. loop until stack empties + MOVEI A,15 ;stack is now empty. + IDPB A,B ;add cr at end of line + MOVEI A,12 + IDPB A,B ;add lf + MOVEI A,0 + IDPB A,B ;end with null for PSOUT + HRROI A,OBUFR + PSOUT ;type buffer + JRST GETLIN + +ERROR: HRROI A,[ASCIZ/ERROR in RDTTY. +/] + PSOUT +STOP: HALTF ;stop at a blank line + JRST STOP ;stay stopped. + + END START