;***********************************************
;* TYPEB.M68 - Types a .TXT file BACKWARDS.
;*
;* Useage: TYPEB {filename} or TYPEB {filename.ext}
;* (default extension is .TXT)
;*
;* NOTES: 1) The filename has the default of
;* "TXT". This program will ONLY
;* work on SEQUENTIAL file types!!!!
;* 2) If the file is bigger than the
;* buffer provided, then the program
;* 'tosses out' a full buffer and begins
;* 'reloading' the buffer from where it
;* left off, so all of the file may not
;* be present.
;* 3) Does not work well on BASIC source code
;* files that include many TABS etc.
;* 4) Origionally designed for an 85K memory
;* partition...MAY NEED TO 'SHRINK' BUFF
;*
;* by DAVE HEYLIGER - AMUS Staff
;*
;***********************************************
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
SEARCH CRT
;-- Version Goodies - please update when modifying
;
VMAJOR=1.
VMINOR=0.
VEDIT=100. ;10-85: original creation
VEDIT=101. ;03-86: clears screen upon a return after TYPEB.
;-- Define the impure storage area for the file DDB and a BUFFer
;
OFINI
OFDEF FILE,D.DDB
OFDEF BUFF,50000. ;THIS EXPECTS AN 85K MEMORY PARTITION!
OFSIZ IMPSIZ ;global replace 50000. with smaller #
;and 49999. too if necessary.
;-- Define Program Header, get impure area, and do some screen junk
;
START: PHDR -1,0,PH$REE!PH$REU ;Program is reentrant and reuseable
GETIMP IMPSIZ,A5 ;A5 will be used to point to FILE
CALL CLEAR ;Short subroutine to clear the screen
TYPE Just a second or two... ;For display purposes only
;-- Get the name of the file to TYPEB
;
NAME: BYP ;Bypass all 'white space'
FSPEC FILE(A5),TXT ;and get the name of the FILE
BYP ;Again, bypass all white space
TRM ;and check for a terminator
JNE QUIT ;Quit if there isn't one
;-- Open the file, and set up pointers to a BUFFer we are going to employ
;
OPEN: INIT FILE(A5) ;Initialize the FILE we are to TYPEB
OPENI FILE(A5) ;Open the FILE
LEA A2,BUFF(A5) ;Let A2 point to the start of the BUFF
LEA A3,BUFF(A5) ;Same goes for A3, but....
ADD #49999.,A3 ; ... it points to the END of the BUFF
MOV #0,(A2)+ ;A "0" is used to signal End-of-Line
;-- Start reading the file characters. A "0" is used to mark an End-of-Line.
; An End-of-Line in a .TXT file is recognized by a 15 followed by a 12.
;
READ: CMP A2,A3 ;See if A2 now points to END of BUFF
BNE EMPTY ;If NOT, then continue
CALL FULL ;...else reset A2 to start of BUFF
EMPTY: CTRLC QUIT ;If ^C hit, quit
FILINB FILE(A5) ;Grab the first char in the FILE
TST FILE+D.SIZ(A5) ;See if we are at the End-of-File
BEQ EOF ;If YES, then GOTO label EOF
CMPB D1,#15 ;...else see if we get an octal 15
BNE CONT ;If NOT, store the valid character
FILINB FILE(A5) ;If octal 15, get the next character
CMPB D1,#12 ;If its a 12, then 15,12 := [return]
BEQ EOLN ;...so store an End-of-Line marker
CONT: MOVB D1,(A2)+ ;All valid chars. get stored in BUFF
JMP READ ;Time for the next character in FILE
EOLN: MOVB #0,(A2)+ ;Store an End-of-Line marker
JMP READ ;Time for the next character in FILE
;-- End-of-File has been reached, set up pointers for TYPEB
;
EOF: LEA A3,BUFF(A5) ;Point A3 to start of BUFF
DEC A2 ;Point A2 to last character in BUFF
CALL CLEAR ;Clear the screen again
CRLF ;Carriage-Return-Line-Feed
;-- Decrement A2 until an End-of-Line marker is reached. When reached, time
; to type out this line.
;
TYPEB: CTRLC QUIT ;QUIT on a ^C
CMPB -(A2),#0 ;Decrement A2, Does A2 ^ point to 0?
BEQ RETURN ;If YES, simulate a 'return'
JMP TYPEB ;If not, continue decrementing A2
;-- Time to type out the line of characters pointed to by A2. If we are all
; through typing out our BUFFer, then quit.
;
RETURN: CMP A3,A2 ;See if A3=A2 (A3 ^s to start of BUFF)
BEQ QUIT ;If YES, Quit
INC A2 ;Don't have A2 ^ing to the zero!
TTYL @A2 ;Type out the line ^ed to by A2
DEC A2 ;Repoint A2 back to where it was
CALL CNTRLB ;blast in a line
JMP TYPEB ;Time for the next line to TYPEB
QUIT: CALL CNTRLB ;Blast in a line...
TYPE <Press RETURN to clear screen>
KBD
CALL CLEAR
EXIT
;-- I call this Control-B because it acts just like a control-B in VUE
;
CNTRLB: MOVB #377,D1 ;A minus one
LSLW D1,#8. ;Shift it left 8 bits
MOVB #2,D1 ;Print tab (-1,2) : Cursor to col. 1
TCRT ;This actually does the trick
MOVB #377,D1 ;Another -1
LSLW D1,#8. ;Shift it left 8 bits
MOVB #16.,D1 ;Print tab (-1,16) : insert a line
TCRT ;The actual trick
RTN
;-- CLEAR is a short subroutine that simulates a PRINT TAB (-1,0)
;
CLEAR: MOVB #377,D1 ;A minus one
LSLW D1,#8. ;Shift it left 8 bits
MOVB #0,D1 ;Print tab (-1,0) : Clear screen
TCRT ;This actually does the trick
RTN ;Return from the CALL
;-- FULL is a short subroutine that will 'blow away' all characters that
; were stored in the BUFFer, and re-start storing characters that are
; located further into the file.
;
FULL: TYPE buffer overload.. ;For fancy output
LEA A2,BUFF(A5) ;Repoint A2 to start of BUFF
LEA A3,BUFF(A5) ;Repoint A3 to the start too
ADD #49999.,A3 ;Now point A3 to END of BUFF
MOV #0,(A2)+ ;Store an End-of-Line marker
RTN ;Return from the CALL