home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-07-13 | 23.4 KB | 1,183 lines |
- ;
- ; PROGRAM: PAGE
- ; VERSION: 2.0
- ; DATE: 18 May 84
- ; AUTHOR: RICHARD CONN
- ; PREVIOUS VERSIONS: 1.2 (26 Apr 83), 1.1 (25 Apr 83), 1.0 (22 Apr 83)
- ;
- VERS equ 20
- z3env SET 0f400h
-
- ;
- ; PAGE is THE file screen print utility for ZCPR3. Installable by
- ; Z3INS, PAGE provides a wide range of options for the user. First, PAGE
- ; allows the user to employ wild cards and file name lists (lists of files
- ; separated by commas, like: file1,file2,file3,...). Second, PAGE provides
- ; the following options:
- ; 0-9 Set Character Print Speed Delay
- ; I Inspect Files
- ; The user approves each file to be printed
- ; before the printing process begins
- ; L Toggle Line Numbering
- ; Each line may or may not begin with a line
- ; number
- ; P Toggle Screen Paging
- ; Snnnn Skip to Specified Page
- ; Printing begins on the indicated page
- ;
- ; During paged output, various parameters can be changed dynamically.
- ; In particular, the letter P toggles screen paging and the digits 0-9
- ; vary the speed WHILE the output is being presented. The effect is immediate.
- ; Control characters may be used to perform additional control functions:
- ; ^S pauses the output, ^X aborts paging of current file and advances to
- ; the next file, and ^C aborts to the operating system.
- ;
-
- FALSE EQU 0
- TRUE EQU NOT FALSE
-
- ;
- ; BASIC SYSLIB ROUTINES NEEDED BY TEMPLATE
- ;
- ESIZE EQU 16 ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
-
- EXT DIRQ ; DIRECTORY PROCESSOR
-
- EXT Z3INIT ; INIT BUFFERS
- EXT ZFNAME ; FILE NAME PROCESSOR
- EXT GETCRT ; GET CRT PARAMETERS
- EXT Z3LOG ; LOG INTO DIR
-
- EXT INITFCB ; INIT FCB
- EXT RETUD ; RETURN CURRENT USER/DISK
- EXT PUTUD ; SAVE CURRENT USER/DISK
- EXT GETUD ; RESTORE CURRENT USER/DISK
- EXT PRINT ; PRINT STRING PTED TO BY RET ADR
- EXT PADC ; PRINT A IN DEC
- EXT COUT ; CONSOLE OUTPUT ROUTINE
- EXT CST ; CONSOLE STATUS ROUTINE
- EXT CIN ; CONSOLE INPUT ROUTINE
- EXT CAPS ; CAPITALIZE ROUTINE
- EXT CRLF ; NEW LINE ROUTINE
- EXT CLINE ; COMMAND LINE STRING SAVE ROUTINE
- EXT CODEND ; CODE END COMPUTATION ROUTINE
-
- EXT F$OPEN ; FILE OPEN
- EXT F$READ ; BLOCK READ
- EXT F$CLOSE ; FILE CLOSE
-
- EXT EVAL10 ; STRING TO BINARY CONVERSION
- EXT PHLDC ; PRINT HL IN DECIMAL ROUTINE
- EXT MOVEB ; MOVEB ROUTINE
-
- ;
- ; CP/M EQUATES
- ;
- CPM EQU 0 ; WARM BOOT
- BDOSE EQU CPM+5 ; BDOS ENTRY
- FCB EQU CPM+5CH ; FCB
- TBUFF EQU CPM+80H ; INPUT LINE BUFFER
- DEL EQU 7FH ; <DEL>
- CR EQU 13 ; <CR>
- FF EQU 12 ; <FF>
- LF EQU 10 ; <LF>
- CTRLC EQU 'C'-'@' ; ^C
- CTRLG EQU 'G'-'@'
- CTRLH EQU 'H'-'@'
- CTRLI EQU 'I'-'@'
- CTRLS EQU 'S'-'@'
- CTRLX EQU 'X'-'@'
- CTRLZ EQU 'Z'-'@'
-
- ;
- ; OTHER EQUATES
- ;
- EOLD EQU 0FFH ; END OF LOAD DELIMITER
-
- ;
- ; Environment Definition
- ;
- if z3env ne 0
- ;
- ; External ZCPR3 Environment Descriptor
- ;
- jmp start
- db 'Z3ENV' ;This is a ZCPR3 Utility
- db 1 ;External Environment Descriptor
- z3eadr:
- dw z3env
- start:
- lhld z3eadr ;pt to ZCPR3 environment
- ;
- else
- ;
- ; Internal ZCPR3 Environment Descriptor
- ;
- MACLIB Z3BASE.LIB
- MACLIB SYSENV.LIB
- z3eadr:
- jmp start
- SYSENV
- start:
- lxi h,z3eadr ;pt to ZCPR3 environment
- endif
-
- ;
- ; Start of Program -- Initialize ZCPR3 Environment
- ;
- call z3init ;initialize the ZCPR3 Env and the VLIB Env
- jmp startx
-
- ;
- ; **** Special Initial Value Area
- ;
- CWIDTH:
- DB 80 ; WIDTH OF SCREEN
- CTPP:
- DB 22 ; LINES OF TEXT PER SCREEN
- CSPP:
- DB 1 ; LINES TO SKIP PER SCREEN
- ;
- ; NOTE: CTPP + CSPP + 1 (FOOTER SIZE) = TOTAL LINES PER SCREEN ON CONSOLE
- ;
- DLNUMFL:
- DB 0 ; LINE NUMBER FLAG (DEFAULT TO NO)
- DPAGEFL:
- DB 0FFH ; PAGE NUMBER FLAG (DEFAULT TO YES)
- DINSPECT:
- DB 0 ; INSPECT FILES (DEFAULT TO NO)
- DDELAY:
- DB 0 ; DELAY COUNT (DEFAULT TO 0)
- ;
- ; OTHER BUFFERS
- ;
- SKIPFL:
- DB 0 ; SKIP FLAG (DEFAULT TO NO)
- SKIPNUM:
- DS 2 ; PAGE NUMBER TO SKIP TO
- LNUM:
- DS 2 ; CURRENT LINE NUMBER
- PNUM:
- DS 2 ; CURRENT PAGE NUMBER
- LNUMFL:
- DB 0 ; LINE NUMBER FLAG (DEFAULT TO NO)
- PAGEFL:
- DB 0FFH ; PAGE NUMBER FLAG (DEFAULT TO YES)
- INSPECT:
- DB 0 ; INSPECT FILES (DEFAULT TO NO)
- DELAY:
- DB 0 ; DELAY COUNT (DEFAULT TO 0)
-
- ;
- ; Start of Program
- ;
- STARTX:
- LXI H,0 ; GET STACK PTR
- DAD SP
- SHLD STACK ; SAVE IT
- CALL CODEND ; DETERMINE FREE SPACE
- SHLD CMDLNE ; COMMAND LINE BUFFER
- LXI D,100H ; BUFFER SIZE
- DAD D
- SHLD DIRBUF ; ADDRESS OF DIRECTORY BUFFER (TOP OF LOCAL STACK)
- SPHL ; SET NEW STACK
- CALL PUTUD ; SAVE CURRENT USER/DISK AWAY
-
- CALL GETCRT ; GET CRT PARAMETERS
- MOV A,M
- STA CWIDTH
- INX H
- INX H
- MOV A,M ; GET NUMBER OF TEXT LINES
- STA CTPP
- MOV B,A ; ... IN B
- DCX H
- MOV A,M ; GET TOTAL NUMBER OF LINES
- SUB B ; COMPUTE NUMBER OF LINES TO SKIP/SCREEN
- SUI 1 ; 1 LINE FOR PROMPT
- STA CSPP
-
- LXI D,TBUFF+1 ; SAVE COMMAND LINE
- LHLD CMDLNE ; GET PTR TO COMMAND LINE SAVE BUFFER
- XCHG
- MVI B,80H ; SIZE OF LINE
- CALL MOVEB ; COPY COMMAND LINE
-
- ;
- ; **** Banner of Program
- ;
- CALL PRINT
- DB 'PAGE, Version '
- DB VERS/10+'0','.',(VERS MOD 10)+'0',0
-
- ;
- ; Check for Help Request
- ;
- LDA FCB+1 ; GET FIRST CHAR OF FILE NAME
- CPI ' ' ; NO FILE SPEC?
- JZ HELP
- CPI '/' ; OPTION CAUGHT?
- JNZ ECONT
-
- ;
- ; **** Print Help Information
- ;
- HELP:
- CALL PRINT
- DB CR,LF,'Syntax:'
- db cr,lf,' PAGE file1,file2,...,filen o...'
- db cr,lf,'Options:'
- db cr,lf,' 0-9 Select Delay Constant'
- db cr,lf,' I Inspect and Select Files First'
- db cr,lf,' L Toggle Numbering of Each Line'
- db cr,lf,' P Toggle Paging'
- db cr,lf,' Snnnn Skip to Specified Page before Printing'
- db cr,lf
- db cr,lf,'Examples:'
- db cr,lf,' PAGE MYFILE.TXT,*.MAC LI'
- db cr,lf,' -- Number Lines, Inspect Files'
- db cr,lf,' PRINT MYFILE.* S25'
- db cr,lf,' -- Skip to Page 25'
- db cr,lf
- db cr,lf,'Commands during printout:'
- db cr,lf,' ^C - abort PAGE ^X - skip to next file'
- db cr,lf,' ^S - suspend output P - toggle paging'
- db cr,lf,' 0-9 - change speed'
- DB 0
-
- ;
- ; RETURN TO OS
- ;
- RETURN:
- LHLD STACK ; GET OLD STACK
- SPHL ; SET IT
- RET
-
- ;
- ; PROGRAM'S INIT ROUTINE
- ;
- ECONT:
- CALL INIT ; PROG INIT ROUTINE
- ;
- ; EXTRACT FLAGS IF PRESENT
- ;
- LXI H,0 ; SET FILE COUNT
- SHLD FILECNT
- LHLD CMDLNE ; PT TO BUFFER
- ;
- ; SKIP TO FILE NAME STRING
- ;
- CALL SBLANK ; SKIP OVER BLANKS
- ;
- ; SKIP TO END OF FILE NAME STRING
- ;
- CALL SNBLANK ; SKIP OVER NON-BLANKS
- ;
- ; CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
- ;
- OPT:
- CPI '/' ; OPTION CHAR?
- JNZ OPTION
- INX H ; SKIP SLASH
- ;
- ; PROCESS LIST OF OPTIONS
- ;
- OPTION:
- MOV A,M ; GET BYTE
- ORA A ; DONE?
- JZ DSPEC
- INX H ; PT TO NEXT CHAR
- CPI ' ' ; SKIP OVER SPACES
- JZ OPTION
- MOV C,A ; COMMAND IN C
- LXI D,OPTAB ; PT TO OPTION TABLE
- OPTL:
- LDAX D ; GET OPTION LETTER
- ORA A ; END OF TABLE?
- JZ HELP ; HELP IF SO
- CMP C ; MATCH?
- JZ OPTM ; PROCESS IF SO
- INX D ; PT TO NEXT ENTRY
- INX D
- INX D
- JMP OPTL
- ;
- ; PROCESS OPTION
- ;
- OPTM:
- PUSH H ; SAVE HL ON STACK
- LXI H,OPTION ; GET RETURN ADDRESS
- XTHL ; ... ON STACK AND RESTORE HL
- INX D ; PT TO ADDRESS
- LDAX D ; GET ADDRESS LOW
- MOV B,A ; ... IN B
- INX D
- LDAX D ; GET ADDRESS HIGH
- MOV D,A ; ... IN D
- MOV E,B ; LOW IN E
- PUSH D ; PUT ADDRESS ON STACK
- MOV A,C ; COMMAND IN A
- RET ; "CALL" OPTION ROUTINE
-
- ;
- ; **** PROGRAM INIT ROUTINE
- ; THIS ROUTINE IS USED BY THE PROGRAM TO PERFORM ANY INITS
- ;
- INIT:
- lxi h,dlnumfl ;copy defaults into buffers
- lxi d,lnumfl
- mvi b,4 ;4 bytes
- call moveb ;do copy
- xra a ;A=0
- sta skipfl ;set no skip
- RET
-
- ;
- ; **** OPTION TABLE
- ; EACH OPTION IS A CAPITAL LETTER OR SPECIAL CHAR FOLLOWED BY
- ; AN ADDRESS; THE TABLE IS TERMINATED BY A BINARY ZERO
- ;
- OPTAB:
- db '0'
- dw optnum
- db '1'
- dw optnum
- db '2'
- dw optnum
- db '3'
- dw optnum
- db '4'
- dw optnum
- db '5'
- dw optnum
- db '6'
- dw optnum
- db '7'
- dw optnum
- db '8'
- dw optnum
- db '9'
- dw optnum
- db 'I'
- dw optinsp
- db 'L'
- dw optln
- db 'P'
- dw optpage
- db 'S'
- dw optskip
- DB 0 ; END OF TABLE
- ;
- ; Set Delay Constant
- ;
- optnum:
- sui '0' ;set constant
- sta delay
- ret
- ;
- ; Toggle Inspect Option
- ;
- optinsp:
- lda inspect ;flip flag
- cma
- sta inspect
- ret
- ;
- ; Set Line Number Flag
- ;
- optln:
- lda lnumfl ;flip flag
- cma
- sta lnumfl
- ret
- ;
- ; Toggle Paging
- ;
- optpage:
- lda pagefl ;flip flag
- cma
- sta pagefl
- ret
- ;
- ; Set Skip Flag and get number
- ;
- optskip:
- mvi a,0ffh ;set flag
- sta skipfl
- call eval10 ;get number
- xchg
- shld skipnum ;set page number to skip to
- xchg ;HL pts to next char
- mov a,d ;see if page number was zero
- ora e
- jnz option
- xra a ;if zero, just turn off skip flag
- sta skipfl
- ret
- ;
- ; BEGIN MOVING THROUGH FILE NAMES, SEPARATED BY COMMAS
- ;
- DSPEC:
- LHLD CMDLNE ; PT TO FIRST BYTE
- CALL SBLANK ; SKIP TO NON-BLANK
- ;
- ; MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
- ; HL PTS TO FIRST BYTE OF NEXT FILE SPEC
- ;
- DSPEC1:
- SHLD HLTMP ; SAVE HL
- LHLD DIRBUF ; RESET STACK
- SPHL
- LHLD HLTMP ; RESTORE HL
- CALL GETUD ; RESET USER IF NECESSARY
- LXI D,FCB ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
- MVI A,0 ; DIR BEFORE DU
- CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
- SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
- LXI D,FCB ; PT TO FCB
- CALL Z3LOG ; LOG INTO DU FOR FILE
-
- ;
- ; LOAD DIRECTORY AND PERFORM FUNCTION
- ;
- FCT:
- LXI D,FCB ; PT TO FCB
- CALL INITFCB ; INIT THE FCB
- MVI A,11000000B ; SELECT SYS AND NON-SYS FILES
- LHLD DIRBUF ; PT TO DIR BUFFER
- CALL DIRQ ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
- ;
- ; DETERMINE BEGINNING OF SCRATCH AREA (SCRATCH) AND SIZE IN PAGES (BCNT)
- ;
- PUSH H ; SAVE PTR AND COUNT
- PUSH B
- LXI D,ESIZE ; SET PTR TO NEXT FREE BLOCK
- FCTFRE:
- MOV A,B ; DONE?
- ORA C
- JZ FCTFR1
- DAD D ; PT TO NEXT
- DCX B ; COUNT DOWN
- JMP FCTFRE
- FCTFR1:
- INR H ; NEXT PAGE
- MVI L,0
- SHLD SCRATCH ; SET PTR TO SCRATCH AREA
- XCHG ; PTR IN DE
- LHLD BDOSE+1 ; COMPUTE BLOCK BUFFER SIZE
- MOV A,H ; ADJUST FOR ZCPR3
- SUI 10
- SUB D ; A=SIZE IN BLOCKS
- STA BCNT ; SET BLOCK COUNT
- POP B ; RESTORE AND SAVE REGS
- POP H
- ;
- ; ALLOW USER TO INSPECT FILES
- ;
- PUSH H
- PUSH B
- CALL ICHECK ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
- POP B ; RESTORE COUNT AND PTR
- POP H
-
- ;
- ; PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
- ;
- FCTL:
- MOV A,B ; CHECK FOR COMPLETION (COUNT = 0)
- ORA C
- JZ FCTL1
- DCX B ; COUNT DOWN
- SHLD HLTMP ; SAVE HL
- LHLD DIRBUF
- SPHL ; SET STACK
- LHLD HLTMP ; RESTORE HL
- PUSH B ; SAVE COUNT AND PTR
- PUSH H
- CALL FUNCTION ; PERFORM FUNCTION
- FCTLNXT:
- LHLD DIRBUF ; RESTORE STACK
- LXI D,-4
- DAD D ; RESTORE PTR TO BC, HL
- SPHL ; SET STACK
- POP H ; RESTORE PTR
- POP B ; RESTORE COUNT
- LXI D,ESIZE ; PT TO NEXT ENTRY
- DAD D
- JMP FCTL
-
- ;
- ; CHECK FOR NEXT FILE SPEC
- ;
- FCTL1:
- CALL GETUD ; RETURN TO BASE USER/DISK
- LHLD NEXTCH ; GET PTR
- MOV A,M ; GET DELIM
- CPI ',' ; ANOTHER FILE?
- JNZ DRETURN
- INX H ; PT TO CHAR AFTER COMMA
- JMP DSPEC1 ; CONTINUE PROCESSING
-
- ;
- ; **** EMERGENCY ABORT
- ;
- ABORT:
- CALL PRINT
- DB CR,LF,'** PAGE Abort **',CR,LF,0
- CALL GETUD ; RETURN HOME AND FALL THRU TO DRETURN
- ;
- ; **** FUNCTION COMPLETE -- CLEANUP AND EXIT
- ; FILL THIS IN WITH CLEANUP CODE FOR EXIT
- ;
- DRETURN:
- JMP RETURN
-
- ;
- ; **** INSPECT FILES -- THIS ROUTINE IS TO PERFORM A FILE INSPECTION
- ; ON INPUT, HL PTS TO FIRST 16-BYTE ENTRY AND BC=NUMBER OF ENTRIES
- ;
- ICHECK:
- mov a,b ;any files?
- ora c
- rz
- push h ;save ptrs
- push b
- lxi d,esize ;size of entry
- ichk1:
- mvi m,0 ;clear MSBytes
- dad d ;pt to next
- dcx b ;count down
- mov a,b ;done?
- ora c
- jnz ichk1
- pop b ;restore ptrs
- pop h
- lda inspect ;inspect?
- ora a ;0=no
- rz
- call print
- db cr,lf,'PAGE File Inspect Mode'
- db cr,lf,' Y (def) = Select File N = Don''t Select File'
- db cr,lf,' Q = Select Rest of Files S = Skip Rest of Files'
- db cr,lf,0
- ichk2:
- call print
- db cr,lf,'Select ',0
- call prfn ;print file name
- call print
- db ' -- (Y/N/Q/S)? ',0
- call cin ;get response
- call caps ;capitalize
- call cout ;echo
- cpi 'Q' ;select rest?
- jz ichkyr
- cpi 'S' ;skip rest
- jz ichknr
- cpi 'N' ;no to this one?
- jnz ichk3
- mvi m,0ffh ;set NO flag in file FCB
- ichk3:
- dad d ;pt to next one
- dcx b ;count down
- mov a,b ;done?
- ora c
- jnz ichk2
- RET
- ; Check Rest of Files as Selected
- ichkyr:
- call print
- db cr,lf,' Rest of Files Selected',0
- ret
- ; Check Rest of Files as NOT Selected
- ichknr:
- mvi m,0ffh ;set NO flag
- dad d ;pt to next
- dcx b ;count down
- mov a,b ;done?
- ora c
- jnz ichknr
- call print
- db cr,lf,' Rest of Files NOT Selected',0
- ret
- ;
- ; **** FUNCTION -- MAIN FUNCTION OF TEMPLATE
- ; ON ENTRY, HL PTS TO NAME OF FILE (16 BYTES) AND USER IS LOGGED INTO
- ; DIRECTORY CONTAINING INDICATED FILE
- ;
- FUNCTION:
- ;
- ; FILE PAGE Routine -- Page the File Whose Name is Pointed to by
- ; HL; we are already logged into the correct directory
- ;
- mov a,m ;file selected?
- ora a ;0=yes
- rnz
- call prinit ;init print buffers
- call fload ;load buffer initially
- lhld scratch ;pt to first char in file
- shld nxtln ;set pointer to next line
- fprloop:
- call prline ;print line of file
- jnz fprloop ;done if EOF
- call page ;advance to top of next page
- call prfoot ;print footer
- ret
- ;
- ; Init Print Buffers and Print File Name
- ;
- prinit:
- lxi d,tfcb ;set up FCB
- mvi b,12 ;12 bytes
- call moveb
- lxi h,0 ;HL=0
- shld pnum ;set page number
- shld lnum ;set line number
- lda ctpp ;set line count
- dcr a ;1 less for first line
- sta lcount
- call print
- db cr,lf,'PAGE File: ',0
- lxi h,tfcb ;print file name
- call prfn
- call crlf
- ret
- ;
- ; FILE LOAD (FLOAD) Routine -- Initial Load of memory buffer
- ;
- fload:
- lxi d,tfcb ;pt to file fcb
- call initfcb ;init file's fcb
- call f$open ;open file for input
- jz fload1 ;open was OK
- call print
- db cr,lf,'File ',0
- xchg ;HL pts to FCB
- call prfn ;print file name
- call print
- db ' NOT Found',0
- pop d ;clear return address
- ret ;abort printout of this file
- ;
- ; This is an entry point for further memory loads of the file
- ;
- fload1:
- lda bcnt ;get number of blocks to load
- mov c,a ;... in C
- lhld scratch ;get address of first block to load into
- shld nxtblk ;set pointer to next block to load
- fload2:
- call rdblk ;read a block (128 bytes)
- jnz eof ;eof encountered?
- call rdblk ;read another block (128 bytes)
- jnz eof ;eof encountered?
- dcr c ;count down
- jnz fload2
- lhld nxtblk ;pt to next byte to load
- mvi m,eold ;mark end of load
- ret
- eof:
- lxi d,tfcb ;close file
- call f$close
- lhld nxtblk ;ensure ^Z
- mvi m,ctrlz
- ret
- rdblk:
- lxi d,tfcb ;pt to FCB
- call f$read ;read next block
- ora a ;error?
- rnz
- lhld nxtblk ;get ptr to next block
- xchg ; as dest
- lxi h,tbuff ;ptr to DMA address
- mvi b,128 ;copy 128 bytes
- rdblk1:
- mov a,m ;get byte
- ani 7fh ;mask out msb
- stax d ;put byte
- inx h ;pt to next
- inx d
- dcr b ;count down
- jnz rdblk1
- xchg ;new nxtblock
- shld nxtblk
- ret
-
- ;
- ; Line Print Routine
- ; Print Next Line with Optional Disk Load
- ; Input Parameter is NXTLN, which is the address of the first char
- ; on the next line
- ; Output Parameter is Zero Flag, with Z meaning done with print, NZ
- ; meaning more yet to print
- ;
- prline:
- lhld lnum ;increment line number
- inx h
- shld lnum
- lhld nxtln ;pt to first char of next line
- mvi c,0 ;init char count
- mov a,m ;get first char of line
- cpi ctrlz ;EOF?
- cnz prlnum ;print line number (optional)
- prl1:
- mov a,m ;get char
- cpi eold ;end of load?
- jz prload
- cpi ctrlz ;eof?
- jz prexit
- inx h ;pt to next char
- cpi ctrli ;tab?
- jz prtab
- cpi cr ;<CR>?
- jz prcr
- cpi ff ;form feed?
- jz prff
- cpi lf ;end of line?
- jz prldn
- cpi ctrlh ;back space?
- jz prbs
- cpi ctrlg ;ring bell?
- jz prbell
- cpi del ;delete char?
- jz prl1 ;skip it
- cpi ' ' ;other control char?
- jc prl1 ;skip if other control char
- call prout ;print char
- inr c ;increment char count
- call eoltest ;check to see if at end of line and newline if so
- jmp prl1
- ;
- ; End of Load Reached -- Load More of File from Disk
- ;
- prload:
- push b ;save char count
- call fload1 ;use load routine
- pop b ;get char count
- lhld scratch ;next byte is here
- jmp prl1 ;continue processing
- ;
- ; Tabulate
- ;
- prtab:
- mvi a,' ' ;space
- call prout
- inr c ;new char
- call eoltest ;process EOL
- mov a,c ;done?
- ani 7
- jnz prtab ;continue tabulation
- jmp prl1 ;continue processing
- ;
- ; Exit with Zero Flag Set if Done
- ;
- prexit:
- xra a ;set zero flag
- ret
- ;
- ; Carriage Return -- Reset Character Count and Continue
- ;
- prcr:
- call prout ;send CR to printer
- mvi c,0 ;reset char count
- jmp prl1 ;continue processing
- ;
- ; Form Feed -- Advance to Top of Next Page
- ;
- prff:
- call page ;page eject with heading
- mvi c,0 ;reset char count
- jmp prl1 ;continue processing
- ;
- ; Line Feed -- End of Routine
- ;
- prldn:
- call prout ;echo LF to printer
- shld nxtln ;set ptr to first char of next line
- mvi a,0ffh ;set not done
- ora a ;set flags
- ret
- ;
- ; Backspace on Printer
- ;
- prbs:
- mov a,c ;check for beginning of line
- ora a
- jz prl1 ;continue if at BOL
- mvi a,ctrlh ;backspace
- call prout
- dcr c ;back up char position
- jmp prl1 ;continue
- ;
- ; Ring Bell on Printer
- ;
- prbell:
- call prout ;ring the bell
- jmp prl1 ;continue without advancing char position
- ;
- ; Test for End of Line and Process if so
- ;
- eoltest:
- lda cwidth ;get line width
- sui 4 ;4 chars less for continuation mark
- mov b,a ;result in B
- lda lnumfl ;line numbering (lines are 7 chars shorter if so)
- ora a ;0=no
- jz eolt1
- mov a,b ;reduce by 7 for line numbers
- sui 7
- mov b,a
- eolt1:
- mov a,b ;get line width
- cmp c ;there?
- rnz ;continue if not
- mov a,m ;get next char
- cpi cr ;new line next?
- rz ;continue if so
- cpi ctrlh ;backspace next?
- rz ;continue if so
- push h
- mvi b,3 ;see if a new line in next 3 chars
- eolt2:
- inx h
- mov a,m ;look for CR
- cpi cr
- jz eolt3
- dcr b
- jnz eolt2
- jmp eolt4
- eolt3:
- pop h ;restore ptr
- ret
- eolt4:
- pop h ;restore ptr
- mvi a,' ' ;print continuation chars
- call prout
- mvi a,'<'
- call prout
- mvi a,'<'
- call prout
- mvi a,cr ;new line
- call prout
- mvi a,lf
- call prout
- mvi c,0 ;reset char position
- lda skipfl ;skipping?
- ora a ;0=no
- rnz
- lda lnumfl ;printing line numbers?
- ora a ;0=no
- rz
- call print
- db ' : ',0
- ret
- ;
- ; Output a character to the console
- ; A = Character
- ;
- prout:
- mov b,a ;char in B
- call cst ;check for abort
- jnz prout1
- call ctrlin ;get control input
- prout1:
- lda skipfl ;skipping?
- ora a ;set flags (Z=no skip=print char)
- mov a,b ;restore char
- cz ctrlout ;send character to printer
- cpi lf ;special tests if it is a line feed
- rnz ;done if non-LF char
- lda lcount ;decrement line counter
- dcr a
- sta lcount
- rnz
- ;
- ; Paging Required
- ; Skip to top of next page; reset LCOUNT (Lines Left on Page Count);
- ; increment PNUM (Screen Number); test for skip stop; print header
- ;
- prout0:
- lda ctpp ;get number of text lines per page
- sta lcount ;set as new line count
- push h ;save ptr
- lhld pnum ;increment page number
- inx h
- shld pnum
- lda cspp ;number of lines to skip
- call lineskp ;skip lines
- pop h ;restore ptr
- call prfoot ;print 1-line footer
- mov a,m ;check next char
- cpi ctrlz ;EOF?
- jz fctlnxt ;skip to next file
- lda skipfl ;skipping?
- ora a ;0=no
- push h
- cnz skiptst ;affects HL
- pop h
- ret
- ;
- ; Skip out rest of page
- ; Form Feed Function
- ;
- page:
- lda lcount ;get count of remaining lines
- call lineskp ;skip lines
- jmp prout0 ;process top of new page
- ;
- ; Skip out lines on page
- ;
- lineskp:
- mov b,a ;line count in B
- ora a ;any?
- rz
- lda skipfl ;skipping?
- ora a
- rnz
- lda pagefl ;paging?
- ora a
- rz
- lines1:
- mvi a,cr ;output new line to printer
- call cout
- mvi a,lf
- call cout
- dcr b ;count down
- jnz lines1
- ret
- ;
- ; Control Input
- ; CTRLIN -- Main Routine Entry Point; Implements Dynamic Commands,
- ; including P, 0-9, ^S, ^X, and ^C
- ; CTRLCS -- ^S Reentry Point; Implements all Dyanamic Commands except ^S
- ;
- ctrlcs:
- call cin ;get input
- jmp ctrlns
- ctrlin:
- call cin ;get input
- cpi ctrls ;pause?
- jz ctrlcs
- ctrlns:
- call caps ;capitalize
- cpi ctrlc ;abort?
- jz abort
- cpi ctrlx ;skip to next
- jz fctlnxt
- cpi 'P' ;page now?
- jz ctrlip
- cpi '0' ;delay?
- rc
- cpi '9'+1
- rnc
- sui '0' ;convert to binary
- sta delay ;set delay count
- ret
- ctrlip:
- lda pagefl ;toggle paging
- cma
- sta pagefl
- ret
- ;
- ; Control Output
- ;
- ctrlout:
- push psw ;save char
- call cout ;output char
- lda delay ;pause?
- ora a ;any delay?
- jz ctrloz
- push h ;delay
- push b
- mov b,a ;delay count
- del1:
- lxi h,500 ;delay constant
- del2:
- xthl ;long NOP
- xthl
- dcx h ;count down
- mov a,h ;done?
- ora l
- jnz del2
- dcr b ;count down
- jnz del1
- pop b ;restore regs
- pop h
- ctrloz:
- pop psw ;restore A
- ret
- ;
- ; Print Line Number (optional)
- ;
- prlnum:
- lda skipfl ;skipping?
- ora a ;0=no
- rnz
- lda lnumfl ;get flag
- ora a ;0=don't number lines
- rz
- push h ;save ptr
- lhld lnum ;get line number
- call phldc ;print line number
- call print ;print separator
- db ': ',0
- pop h ;restore ptr
- ret
- ;
- ; Print 1-line footer
- ;
- prfoot:
- lda skipfl ;skipping?
- ora a ;0=no
- rnz
- lda pagefl ;paging?
- ora a
- rz
- push h ;save ptr
- call prpnum ;print page heading and number
- call prdash ;print dash
- lxi h,tfcb ;pt to file FCB
- call prfn ;print file name
- pop h ;restore ptr
- call print
- db ' -- Strike Any Key ',0
- call ctrlin ;get control response
- jmp crlf ;new line
- ;
- ; Test for completion of skipping
- ;
- skiptst:
- lhld pnum ;get page number
- inx h ;increment for test
- xchg ;... in DE
- lhld skipnum ;get page to skip to
- mov a,h ;compare them
- cmp d
- rnz
- mov a,l
- cmp e
- rnz
- xra a ;A=0 to stop skipping
- sta skipfl ;set flag
- ret
- ;
- ; Print Page Number
- ;
- prpnum:
- call print ;print header
- db 'Screen ',0
- lhld pnum ;print current page number
- call phldc ;print as decimal
- ret
- ;
- ; Print Separator
- ;
- prdash:
- call print
- db ' -- ',0
- ret
- ;
- ; UTILITIES
- ; SBLANK -- SKIP BLANKS PTED TO BY HL UNTIL NON-BLANK ENCOUNTERED; HL
- ; SNBLANK -- SKIP NON-BLANKS PTED TO BY HL UNTIL BLANK OR EOL; HL
- ; PRFN -- PRINT FILE NAME PTED TO BY HL; AFFECT NOTHING
- ;
-
- ;
- ; SKIP UNTIL NON-BLANK
- ;
- SBLANK:
- MOV A,M ; LOOK FOR BLANK
- INX H ; PT TO NEXT
- CPI ' ' ; BLANK?
- JZ SBLANK
- DCX H ; BACK UP
- RET
-
- ;
- ; SKIP UNTIL BLANK OR EOL
- ;
- SNBLANK:
- MOV A,M ; GET CHAR
- INX H ; PT TO NEXT
- CPI ' ' ; BLANK?
- JZ SNB1
- ORA A ; EOL?
- JNZ SNBLANK
- SNB1:
- DCX H ; BACK UP
- RET
-
- ;
- ; PRINT FILE NAME PTED TO BY HL
- ; OUTPUT TO CON:
- ;
- PRFN:
- PUSH H ; SAVE REGS
- PUSH B
- CALL RETUD ; GET CURRENT USER/DISK
- MOV A,B ; PRINT DISK
- ADI 'A' ; LETTER
- CALL COUT
- MOV A,C ; PRINT USER
- CALL PADC
- CALL PRINT
- DB ': ',0
- INX H ; PT TO FILE NAME
- MVI B,8 ; PRINT NAME
- CALL PRNT
- MVI A,'.' ; DECIMAL
- CALL COUT
- MVI B,3 ; PRINT TYPE
- CALL PRNT
- POP B ; GET REGS
- POP H
- RET
-
- ;
- ; PRINT CHARS PTED TO BY HL FOR B BYTES
- ; OUTPUT TO CON:
- ;
- PRNT:
- MOV A,M ; GET CHAR
- CALL COUT
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PRNT
- RET
-
- ;
- ; BUFFERS
- ;
- CMDLNE:
- DS 2 ; PTR TO COMMAND LINE STRING
- DIRBUF:
- DS 2 ; PTR TO DIRECTORY BUFFER
- NEXTCH:
- DS 2 ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
- FILECNT:
- DS 2 ; COUNT OF NUMBER OF FILES RENAMED
- SCRATCH:
- DS 2 ; ADDRESS OF FIRST BYTE OF SCRATCH AREA
- BCNT:
- DS 1 ; NUMBER OF PAGES IN SCRATCH AREA
- HLTMP:
- DS 2 ; TEMP BUFFER TO STORE HL
- ;
- ; PAGE Buffers
- ;
- tfcb:
- ds 36 ; FCB for current file
- nxtblk:
- ds 2 ; pointer to next block to load
- nxtln:
- ds 2 ; pointer to next line to read
- lcount:
- ds 1 ; count of text lines left on page
- ;
- ; Stack
- ;
- STACK:
- DS 2 ; OLD STACK PTR
-
- END