home *** CD-ROM | disk | FTP | other *** search
-
- ; LISTT v1.3 -- File utility program for printers -- 02/22/83
- ;
- ; 03/17/83
- ;
- ; LISTT v1.3 has been modified to provide the following capabilities:
- ;
- ; 1) Program some of the OKIDATA Microline printer's
- ; attributes on selective basis before printing each file.
- ;
- ; 2) Time/Date stamp each page of the printed output using
- ; Electralogics Incorporated's MFIO Reat Time Clock.
- ;
- ; Since I prefer to use 8 1/2 inch paper, I have chosen to set
- ; all form width characteristics relative to that preference.
- ; These values may be easily changed to suit your own
- ; requirements.
- ;
- ; I have also chosen to set the default specifications for the
- ; printer as:- 8 lines per inch vertically and 17 characters
- ; per inch horizontally. The headers are set up to locate
- ; pertinent data in the same relative locations at the top of
- ; the printed page regardless of the print/line characteristics
- ; selected.
- ;
- ; One more little thing; I like to leave a left margin of 20
- ; spaces at 17 characters per inch, 10 spaces at 12 characters
- ; per inch and no spaces at 10 characters per inch.
- ;
- ; When the program is executed, the current printer parameters
- ; are displayed and you are then asked if you wish to
- ; alter the printer parameters (print density, or lines per
- ; inch). If you answer in the affirmative, options will be
- ; offered. Don't forget to answer "d" (for done) when you have
- ; completed your option selection. The answer "n" will result
- ; in the selection of the default parameters discussed above.
- ;
- ; If a particular parameter is changed, for example - 6 lines
- ; per inch is selected, then the variable "TEXT" is modified
- ; to allow more lines of text per page. A similar
- ; modification to the code is made if a different print
- ; density is selected. The column in which the page number
- ; starts to print is also changed to reflect the new density.
- ;
- ; Changes to Irv Hoff's code have been left in lower case to
- ; ease recognition of them.
- ;
- ; The code isn't elegant but it works. My apologies to Irv Hoff
- ; for the liberties that I have taken with his efforts. Also my
- ; thanks are extended to him for the education that this little
- ; effort has given me.
- ;
- ; If you care to leave any comments, or pose any questions,
- ; leave a message on Jud's system.
- ;
- ;
- ; Bill Harnell,
- ; Scarborough, Ontario
- ;
- ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;
- ;
- ; Irvin M. Hoff
- ; Los Altos Hills, CA 94022
- ;
- ; "LISTT" is a printer utility program that lists any re-
- ; quested file on your printer. The name was selected so
- ; it would be easy to type, easy to remember, and be illus-
- ; trative of its capabilities. It works equally well on
- ; printers that do/do not respond to form feed characters.
- ;
- ; When requesting the program, include the name of the
- ; file (and its extent) that is to be listed:
- ;
- ;
- ; A>LISTT HELLO.ASM
- ;
- ;
- ; A menu then appears asking several questions:
- ;
- ; 1) Roll paper or fanfold (it adds tear tabs each
- ; 11" if using roll paper).
- ; 2) Ability to include 0-99 spaces at the left
- ; margin for those printers without adjust-
- ; able margins.
- ; 3) Ignore form feeds (Y/N) - By default accepts normal
- ; form feeds. (Automatically paginates with or
- ; without form feeds).
- ; 4) Heading desired (such as current date, etc.)
- ; The name of the file plus current page num-
- ; ber near the right margin are both automatic.
- ; 5) Asks for starting page (defaults to page 1).
- ; 6) Asks for page to stop at (defaults to end of
- ; file).
- ;
- ; Thus you can compensate for various printers and can print
- ; any portion of the file you wish.
- ;
- ; NOTE: There are two options which may be user-set. They
- ; are locations 0103 and 0104. They may be set with
- ; "DDT", "SID" or by editing and reassembling:
- ;
- ; 1) PAGCOL -- Sets the column the Page number
- ; starts at. Some printers have
- ; 72 columns, some 80, some 132, etc.
- ;
- ; 2) TTABN -- Sets the space between tear tabs
- ; for fan fold. Some printers have
- ; 72 columns, some 80, some 132, etc.
- ;
- ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;
- ; 02/02/83 v1.2 Fixed the heading to indent on all pages, instead of
- ; only the first. (Has worked correctly if using roll
- ; paper with tear tabs, but not on fanfold.)
- ; - Irv Hoff
- ;
- ; 01/17/83 v1.1 Would only display 99 pages and start over. Now goes
- ; to 99 pages. - Irv Hoff
- ;
- ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- ;
- ;
- ORG 100H
- ;
- ;
- JMP BEGIN
- ;
- ;
- ; SPECIAL STORAGE LOCATIONS
- ;
- datcol: dw head3 ;column to start date/time
- PAGCOL: DB 85 ;COLUMN TO START PAGE NUMBER
- TTABN: DB 78 ;SPACE BETWEEN TEAR TABS FOR ROLL PAPER
- lspc: db 08 ;6 std - 6 or 8 permitted
- chwd: db 17 ;10 std - 10, 12 or 17 permitted
- stdflg: db 00 ;standard print parameter flag
- ;.....
- ;
- ;
- ; ASCII CONTROL CHARACTERS
- ;
- esc equ 1bh ;escape character
- BS EQU 'H'-40H ;CONTROL-H FOR BACKSPACE
- TAB EQU 'I'-40H ;CONTROL-I FOR TAB
- LF EQU 'J'-40H ;CONTROL-J FOR LINE FEED
- FFD EQU 'L'-40H ;CONTROL-L FOR FORM FEED
- CR EQU 'M'-40H ;CONTROL-M FOR CARRIAGE RETURN
- SI EQU 'V'-40H ;CONTROL-V FOR SYNCH IDLE
- EOF EQU 'Z'-40H ;CONTROL-Z FOR END OF FILE
- ;.....
- ;
- ;
- ; CP/M ROUTINES AND FILE MANAGEMENT
- ;
- BDOS EQU 0005H ;SYSTEM CALL ENTRY POINT
- CONIN EQU 1 ;CONSOLE INPUT CHAR
- CONOUT EQU 2 ;DISPLAY CHAR ON CONSOLE
- FCB EQU 5CH ;LOCATION OF FILE CONTROL BLOCK
- LIST EQU 5 ;SEND CHAR. TO LIST DEVICE
- pagenm equ 3 ;allows up to 999 pages
- STATUS EQU 11 ;CONSOLE STATUS
- TBUFF EQU 80H ;BUFFER FOR FILE CONTROL BLOCK
- TFCB EQU 005CH ;DEFAULT FILE CONTROL BLOCK
- ;.....
- ;
- ;
- ; MISC STORAGE LOCATIONS
- ;
- ;
- CCP: DB 0 ;INITIAL 'CCP' PAGE
- COLMN: DB 0 ;POSITION ON THE LINE
- FRMFD: DB 0 ;FORM FEED CONTROL
- LCNT: DB 0 ;LINE COUNT FOR HARD COPY
- NOTAB: DB 0 ;CHANGES TO '1' IF USING TEAR TABS
- START: DB 0 ;START PRINTING FLAG
- text: db 76 ;number of lines of text per page
- ;66 lpp = 54, 88 lpp = 76
- ;.....
- ;
- ;
- ; FILE HANDLING DATA
- ;
- FILEADR: DW BUFFER
- FILELEN: DB 0,0
- FILEPTR: DB 0,0
- FILESIZ: DB 0,0
- FCBSTR: DB 0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0
- ;.....
- ;
- ;
- ; HEADING LINE FOR HARD COPY
- ;
- HEAD1: DB SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,SI,' '
- HEAD2: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0
- HEAD3: DB ' - Page '
- HEAD4: DB SI,SI,'1',CR,LF,LF,LF,0
- PAGES: DB SI,SI,'1 '
- PAGEQ: DB SI,SI,' '
- QUIT: DB CR,LF,LF,LF,LF,LF,LF,LF,LF,LF,0
- QUITR: DB CR,LF,LF,LF,LF,LF,0
- TURNUP: DB CR,LF,LF,LF,LF,LF,LF,LF,LF,LF,CR,LF,0
- ;
- ;.....
- ;
- ;
- ; MESSAGES
- ;
- MERRN: DB '== No file by that name on this disk =='
- DB CR,LF,'$'
- MERRR: DB '== No file requested ==',CR,LF,LF,'$'
- MERRW: DB '== No "*" or "?" please ==',CR,LF,'$'
- ;
- MSG1: DB CR,LF,' LISTT Pgm v1.3 02/22/83',CR,LF
- DB '(With Okidata Microline u84 Enhancements)',cr,lf,lf,0
- MSG1B: DB cr,lf,'Do you want tear tabs to use roll paper? (y/n): ',0
- MSG1C: DB 'Number of spaces to augment left margin (0-99): ',0
- MSG1D: DB 'Accept FF (y/n): ',0
- MSG1E: DB 'Heading is: ',0
- MSG1F: DB 'Start at page : ',0
- MSG1G: DB 'Quit at page : ',0
- MSG2: DB 'HIGHEST PAGE IS: ',0
- MSG3: DB CR,LF,0
- ;
- ;.....
- ;
- msgpc: db cr,lf,lf,lf
- db 'Following are Microline 84 printer options',cr,lf
- db '(Parenthetical notes show current values)',cr,lf,lf,0
- msgpc1: db ' 1. Line Spacing ( )',cr,lf
- db ' (6 or 8 lpi permitted)',cr,lf,0
- msgpc2: db ' 2. Print Density ( )',cr,lf
- db ' (10, 12 or 17 cpi permitted)',cr,lf,0
- msgpc5: db cr,lf,'Changes Desired (y, n or (d)one) ==> ',0
- msgpc6: db cr,lf,lf,'Enter 1 or 2 ==> ',0
- ;
- lsmsg: db cr,lf,'Enter Lines Per Inch (6 or 8) ==> ',0
- lsmsg6: db esc,'6',cr,0 ;6 lpi
- lsmsg8: db esc,'8',cr,0 ;8 lpi
- tofmsg: db esc,'5',cr,0 ;top of form message
- ;
- cwmsg: db cr,lf,'Enter Print Density (10, 12 or 17 cpi)'
- db cr,lf,'1 = 10, 2 = 12 or 3 = 17 cpi ==> ',0
- cwmsg10:db 30,cr,0 ;10 cpi
- cwmsg12:db 29,cr,0 ;12 cpi
- cwmsg17:db 28,cr,0 ;17 cpi
- ;
- ;
- ;.....
- ;
- ;
- ; TO GIVE THE FINAL LISTING A LEFT-MARGIN SO THAT IT CAN BE MORE EASILY
- ; USED IN A BINDER, EXTRA SPACES CAN BE INSERTED AUTOMATICALLY INTO THE
- ; LEFT MARGIN AREA WHEN ANSWERING THE QUESTION AT BOOT TIME. (NONE ARE
- ; NEEDED IF YOUR PRINTER HAS ADJUSTABLE MARGINS.)
- ;
- FILLS: DB ' ' ;TELLS HOW FAR TO MOVE THE MARGIN
- ;
- MARGIN: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- ;
- ;
- ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- ; ;
- ; ;
- ; PROGRAM STARTS HERE ;
- ; ;
- ; ;
- ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- ;
- ;
- BEGIN: POP H ;GET RETURN ADDRESS TO'CCP'
- SHLD EXIT+1 ;STORE FOR RETURN TO 'CCP'
- LXI SP,STACK ;SETUP NEW STACK FOR THIS PGM
- ;
- ;
- ; SIGN-ON MESSAGE
- ;
- LXI H,MSG1
- CALL STRNGC ;WRITE STRING TO CRT
- ;
- ;*****************************
- ;
- ; MOVE PGM NAME INTO HEADING BUFFER
- ;
- ;*****************************
- ;
- ; SEE IF ANY FILE WAS REQUESTED
- ;
- TITL: LXI H,TBUFF ;FILE CONTROL BLOCK BUFFER
- MOV A,M ;GET FIRST CHARACTER
- ORA A
- JZ ERRORR ;IF ZERO, NO FILE WAS REQUESTED
- ;check for printer parm. change
- ;
- ; IF YES, SEE IF A DRIVE WAS MENTIONED, DO NOT PRINT THAT
- ;
- LXI H,TBUFF+3 ;SEE IF THEY SPECIFIED A DRIVE
- MOV A,M
- CPI ':'
- JZ TITL1+1 ;IF YES IGNORE
- LXI H,TBUFF ;IF NOT, RESET TO NORMAL
- ;
- TITL1: INX H ;IGNORE THE SPACE CHAR.
- LXI D,HEAD1 ;LOCATION OF HEADING BUFFER
- ;.....
- ;
- ; see if printer parameter changes necessary
- ;
- push psw!push b!push d!push h
- call shpcol
- pop h!pop d!pop b!pop psw
- ;.....
- ;
- ; MOVE THE FILE NAME AND HEADING/DATE INTO THE BUFFER
- ;
- TITL2: INX H ;NEXT LOCATION
- MOV A,M ;GET THE CHARACTER
- ORA A ;BINARY ZERO?
- JZ TITL3 ;IF YES, FINISHED
- CPI ' ' ;A SPACE AFTER FILENAME?
- JZ TITL3 ;IF YES, ALL FINISHED
- STAX D ;AND STORE IN BUFFER
- INX D ;ADVANCE BUFFER LOCATION
- JMP TITL2 ;IF NOT, CONTINUE
- ;
- ;
- ; CHECK FOR ANY WILD CARD CHARACTERS AND IF PRESENT SHOW ERROR
- ;
- TITL3: LXI H,FCB ;WHERE NAME IS
- MVI B,11 ;NUMBER OF CHARS POSSIBLE
- ;
- TITL4: INX H ;NEXT LOCATION IN FILE NAME
- MOV A,M ;GET CHARACTER
- CPI '?' ;CHECK FOR ANY WILD CARD CHARS.
- JZ ERRORW ;ERROR IF ONE IS FOUND
- DCR B ;COUNT CHARACTERS TO TEST
- JNZ TITL4 ;LOOP BACK UNLESS DONE
- ;
- ;
- ;*****************************
- ;
- ; CALCULATE MAXIMUM AVAILABLE BUFFER SIZE
- ;
- ;*****************************
- ;
- ;
- LXI D,BUFFER
- LDA BDOS+2 ;GET BDOS ADDRESS
- SUI 8 ;PROTECT 'CCP'
- MOV H,A ;GET THE MAIN PAGE
- STA CCP ;STORE FOR "CLEAR BUFFER"
- XRA A ;CLEAR CARRY IF SET
- ;
- ;
- ; CALCULATE THE DIFFERENCE TO GET SPACE AVAILABLE
- ;
- SUB E
- MOV L,A
- ;
- MOV A,H
- SBB D
- MOV H,A
- ;
- ;
- ; FREE SPACE AVAILABLE NOW IN 'HL', SO STORE FOR BUFFER SIZE
- ;
- SHLD FILESIZ
- ;
- ;*****************************
- ;
- ; OPEN REQUESTED FILE TO READ THE DATA TO LIST
- ;
- ;*****************************
- ;
- LXI H,FCB ;LOCATION OF FILE CONTROL BLOCK
- LXI D,FCBSTR
- MVI C,12 ;NORMAL FILE LENGTH
- CALL STORE
- ;
- XRA A
- STA FCBSTR+12 ;NULL LOCATION FOLLOWING FILE NAME
- STA FCBSTR+32
- LHLD FILESIZ
- SHLD FILELEN
- SHLD FILEPTR
- MVI C,15
- LXI D,FCBSTR ;OPEN FILE
- CALL BDOS
- INR A
- JZ ERRORN ;IF UNABLE, TERMINATE
- ;
- ;
- ;*****************************
- ;
- ; ASK ABOUT ROLL PAPER, MARGINS, STARTING PAGE, ETC.
- ;
- ;*****************************
- ;
- ;
- CALL PRHC ;ASK QUESTIONS
- ;
- ;
- ;***********************************************************************
- ; ;
- ; MAIN PRINT LOOP ;
- ; ;
- ;***********************************************************************
- ;
- ;
- ; HANDLES TOP OF NEW PAGE
- ;
- MAIN: call time ;set time/date etc. into header
- CALL NEWPG ;SET PARAMETERS FOR A NEW PAGE
- CALL SKIP ;SKIP CR, LF, EOF OR FFD AT NEW PAGE
- JMP MAIN2 ;ALREADY HAVE FIRST GOOD CHAR.
- ;
- ;
- ; HANDLE ASCII CHARACTERS
- ;
- MAIN1: CALL GETCH ;GET NEW CHARACTER
- CPI EOF ;END OF FILE IN MIDDLE OF LINE?
- JZ ROLL
- ;
- MAIN2: CPI ' ' ;PRINTING CHAR.?
- JC MAIN4 ;IF NOT, EXIT
- ;
- MAIN3: CALL WRITE2 ;WRITE CHARACTER
- JMP MAIN1 ;GET THE NEXT CHAR.
- ;...
- ;
- ;
- ; HANDLE NON-PRINTING CHARS.
- ;
- MAIN4: CPI CR ;CARRIAGE RETURN
- JZ MAIN5
- CPI FFD ;FORM FEED
- JZ MAIN6
- CPI LF ;LINE FEED
- JZ MAIN7
- CPI TAB ;TAB CHARACTER
- JZ MAIN8
- JMP MAIN9 ;NONE OF THESE SEND SPECIAL CHAR.
- ;.....
- ;
- ;
- ; HANDLE 'CR' CHAR.
- ;
- MAIN5: CALL ABORT ;WANT TO TERMINATE?
- MVI A,CR ;RESTORE THE CHAR.
- JMP MAIN3 ;GET NEXT CHAR.
- ;...
- ;
- ;
- ; HANDLE FORM FEED CHAR.
- ;
- MAIN6: CALL ABORT ;WANT TO TERMINATE?
- LDA FRMFD ;RESPONDING TO FORM FEED?
- ORA A
- JNZ MAIN1 ;IF NOT, IGNORE
- ;
- LDA LCNT ;INCREMENT LINE COUNT
- INR A
- STA LCNT
- push h
- lxi h,text
- cmp m
- pop h
- JNC MAIN71 ;IF DONE, TURN UP NEW PAGE
- MVI A,LF
- CALL WRITEP ;PRINT NEW LINE, DO NOT DISPLAY
- JMP MAIN6 ;CHECK AGAIN
- ;...
- ;
- ;
- ; HANDLE 'LF' CHARS.
- ;
- MAIN7: LDA LCNT ;INCREMENT THE TEXT LINE COUNT
- INR A
- STA LCNT
- push h
- lxi h,text
- cmp m
- pop h ;MAXIMUM NUMBER OF LINES NOW?
- JNC MAIN71 ;IF YES, FINISH THE PAGE
- MVI A,LF
- CALL WRITE3
- CALL INDENT ;INDENT IF REQUESTED
- JMP MAIN1 ;HANDLE NORMALLY
- ;...
- ;
- ;
- ; 'LF' SO START A NEW PAGE
- ;
- MAIN71: CALL ABORT ;WANT TO TERMINATE NOW?
- CALL SKIP ;SKIP ANY CR, LF, EOF OR FFD TOP OF PAGE
- PUSH PSW ;OTHERWISE SAVE CHAR.
- CALL TTABS ;CHECK FOR ROLL PAPER
- CALL NMBR ;INCREMENT THE PAGE NUMBER
- CALL CKSP ;READY TO STOP AS YET?
- CALL INDENT
- ;
- MAIN72: LXI H,HEAD1 ;SEND THE NEW PAGE HEADING
- CALL STRNGB ;DISPLAY AND PRINT
- CALL PAGNO ;SET IN PAGE NUMBER
- CALL NEWPG ;SET UP PARAMETERS FOR A NEW PAGE
- POP PSW ;GET THE CHAR. BACK WE LOOKED AT
- JMP MAIN2 ;IGNORE GETTING A NEW CHAR.
- ;...
- ;
- ;
- ; HANDLE TAB CHARACTERS
- ;
- MAIN8: MVI A,' ' ;SEND A SPACE IN PLACE OF TAB
- CALL WRITE2 ;DISPLAY AND PRINT
- LDA COLMN ;FIND WHAT COLUMN
- ANI 7
- JNZ MAIN8 ;IF NOT EVEN 8, DO ANOTHER SPACE
- JMP MAIN1 ;BACK TO WORK
- ;...
- ;
- ;
- ; DISPLAY CONTROL-CHARACTERS
- ;
- MAIN9: PUSH PSW ;SAVE THE CHAR.
- MVI A,'^' ;SHOW A SPECIAL "CTL-CHAR."
- CALL WRITE2 ;DISPLAY/PRINT
- POP PSW
- ADI 40H ;CONVERT TO PRINTING CHAR.
- CALL WRITE2
- JMP MAIN ;GET NEXT CHAR.
- ;.....
- ;
- ;
- ;***********************************************************************
- ; ;
- ; ;
- ; ROUTINES START HERE ;
- ; ;
- ; ;
- ;***********************************************************************
- ;
- ;
- ; CLEAR KEYBOARD OF ANY OTHER CHARS.
- ;
- ABORT: MVI C,STATUS
- CALL BDOS
- RAR
- RNC
- ;
- MVI C,CONIN ;GET THE CHAR.
- CALL BDOS
- CPI 'C'-40H ;WANT TO TERMINATE?
- JNZ ABORT ;EXIT IF NOT CTL-C
- ;
- ABORT1: LDA NOTAB ;USING FANFOLD PAPER?
- ORA A
- JZ EXIT ;IF YES, LEAVE IN NORMAL POSITION
- LXI H,TURNUP ;OTHERWISE, TERMINATE
- CALL STRNGP ;DISPLAY AND PRINT SOME LINE FEEDS
- LXI H,QUITR-7 ;..A FEW EXTRA LINES
- CALL STRNGP
- JMP EXIT
- ;
- ABORT2: LXI H,QUITR-3
- CALL STRNGC
- JMP EXIT ;FINISHED NOW
- ;.....
- ;
- ;
- ; HANDLE A BACKSPACE CHAR. WHILE ENTERING A FILE NAME
- ;
- BCKSP: MOV A,B ;GET POSITION ON LINE
- ORA A
- JNZ BCKSP1 ;EXIT IF AT INITIAL COLUMN
- MVI A,' ' ;DELETE THE CHAR.
- JMP BCKSP3
- ;
- BCKSP1: DCR B ;SHOW ONE LESS COLUMN USED
- DCX H ;DECREASE BUFFER LOCATION
- MVI A,' '
- MOV M,A ;REPLACE TO ORIGINAL
- CALL WRITCC ;BACKSPACE THE CRT
- ;
- BCKSP2: MVI A,BS ;RESET THE CRT AGAIN
- ;
- BCKSP3: CALL WRITCC ;WRITE TO CRT
- RET
- ;.....
- ;
- ;
- ; CHECK TO SEE IF READY TO STOP PRINTING YET
- ;
- CKSP: PUSH H ;SAVE THE REGS.
- PUSH D
- PUSH B
- LXI H,PAGEQ+2 ;ADDRESS OF QUITTING PAGE ANSWER
- ;
- CKSP1: INX H ;FIND THE RIGHTMOST DIGIT
- MOV A,M
- CPI ' '
- JNZ CKSP1
- DCX H
- ;
- LXI D,HEAD4+2 ;RIGHTMOST DIGIT FOR PAGE NUMBER
- MVI C,PAGENM ;ALLOWS UP TO 9,999 PAGES
- ;
- CKSP2: LDAX D ;COMPARE TWO STRINGS OF NUMBERS
- CMP M
- JNZ CKSP3 ;IF DIFFERENT, NOT READY YET
- ;
- DCX D ;CHECK NEXT DIGIT
- DCX H
- DCR C
- JNZ CKSP2
- ;
- JMP ABORT1
- ;
- CKSP3: POP B ;RESTORE THE REGS.
- POP D
- POP H
- RET
- ;.....
- ;
- ;
- ; CHECK TO SEE IF READY TO START PRINTING YET
- ;
- CKST: PUSH H ;SAVE THE REGS.
- PUSH D
- PUSH B
- LXI H,PAGES+2 ;ADDRESS OF STARTING PAGE ANSWER
- ;
- CKST1: INX H ;FIND THE RIGHTMOST DIGIT
- MOV A,M
- CPI ' '
- JNZ CKST1
- DCX H
- ;
- LXI D,HEAD4+2 ;RIGHTMOST DIGIT FOR PAGE NUMBER
- MVI C,PAGENM
- ;
- CKST2: LDAX D ;COMPARE TWO STRINGS OF NUMBERS
- CMP M
- JNZ CKST4 ;IF DIFFERENT, NOT READY YET
- ;
- DCX D ;CHECK NEXT DIGIT
- DCX H
- DCR C
- JNZ CKST2
- ;
- STA START ;ALLOWS HARD COPY TO COMMENCE
- MVI A,CR
- CALL WRITEP ;POSITION PRINTER TO LEFT FOR FIRST LINE
- LDA NOTAB ;USING TEAR TABS?
- ORA A
- CNZ TTABS ;IF YES, START FIRST PAGE WITH TEAR TABS
- CALL INDENT ;INDENT IF REQUESTED
- ;
- CKST3: LXI H,HEAD1
- CALL STRNGB
- CALL PAGNO ;SET IN PAGE NUMBER
- ;
- CKST4: POP B ;RESTORE THE REGS.
- POP D
- POP H
- RET
- ;.....
- ;
- ;
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ; ;
- ; LOAD THE DISK FILE INTO MEMORY, GET A CHAR ;
- ; ;
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ;
- ;
- ; SEE IF ANYTHING ALREADY IN THE BUFFER
- ;
- DISK1: LHLD FILELEN
- XCHG
- LHLD FILEPTR
- MOV A,L
- SUB E
- MOV A,H
- SBB D
- JC DISK5 ;IF NOT EMPTY GO GET CHAR.
- ;
- ;
- ; IF EMPTY, FILL BUFFER
- ;
- LXI H,0
- SHLD FILEPTR ;ZERO THE FILE POINTERS
- ;
- ;
- ; GET NEXT DISK SECTOR, CHECK FOR END OF FILE MARKER
- ;
- DISK2: XCHG ;PUT INTO 'DE'
- LHLD FILELEN ;SET 'HL' TO MAXIMUM BUFFER LENGTH
- MOV A,E
- SUB L
- MOV A,D
- SBB H
- JNC DISK4 ;IF NOW FULL, EXIT
- ;
- ;
- ; OTHERWISE GET NEXT SECTOR
- ;
- LHLD FILEADR ;START OF BUFFER
- DAD D ;ADD IN FILE POINTER VALUE
- XCHG ;ADDRESS FOR NEXT DISK SECTOR TO GO
- MVI C,26 ;SET DMA ADDRESS
- CALL BDOS
- LXI D,FCBSTR ;ADDRESS OF DISK FILE NAME
- MVI C,20 ;READ SEQUENTIAL INTO MEMORY BUFFER
- CALL BDOS
- ORA A ;CHECK FOR END OF FILE
- JNZ DISK3 ;IF YES, EXIT
- ;
- LXI D,TBUFF ;SECTOR SIZE IS 128 BYTES
- LHLD FILEPTR ;NEXT LOCATION TO PUT SECTOR
- DAD D ;ADD THE SECTOR SIZE
- SHLD FILEPTR ;STORE FOR NEXT SECTOR-FILL
- JMP DISK2 ;CHECK FOR FULL, IF NOT KEEP GOING
- ;.....
- ;
- ; RESET FOR END-OF-FILE MARKER LOCATION
- ;
- DISK3: LHLD FILEPTR
- SHLD FILELEN
- ;
- ; SET FOR BUFFER FULL
- ;
- DISK4: LXI D,TBUFF ;POINT TO TEMPORARY BUFFER ADDRESS
- MVI C,26 ;SET DMA ADDRESS
- CALL BDOS
- LXI H,0 ;RESET FILE POINTER TO START OF BUFFER
- SHLD FILEPTR
- ;
- ;
- ; GET THE NEXT CHARACTER FROM THE BUFFER
- ;
- DISK5: XCHG ;FILE POINTER LOCATION
- LHLD FILEADR ;START OF MEMORY BUFFER
- DAD D ;ADDRESS OF NEXT CHARACTER TO GET
- XCHG ;PUT INTO 'DE'
- LHLD FILELEN ;GET LENGTH OF FILE
- MOV A,L ;SEE IF EMPTY NOW
- ORA H
- MVI A,EOF ;END OF FILE MARKER (CTL-Z)
- RZ ;DONE IF 'H' AND 'L' BOTH ZERO
- ;
- LDAX D ;GET THE CHAR.
- LHLD FILEPTR ;BUMP THE POINTERS FOR NEXT CHARACTER
- INX H
- SHLD FILEPTR
- RET
- ;.....
- ;
- ;
- ; EXIT IF HAVING A PROBLEM OPENING A FILE
- ;
- ERROR: MVI C,9 ;PRINT STRING
- CALL BDOS
- JMP EXIT
- ;
- ERRORR: LXI D,MERRR ;NO FILE REQUESTED - ERROR MSG
- JMP ERROR
- ;
- ERRORN: LXI D,MERRN ;NO FILE BY THAT NAME - ERROR MSG
- JMP ERROR
- ;
- ERRORW: LXI D,MERRW ;NO WILDCARD - ERROR MSG
- JMP ERROR
- ;.....
- ;
- ;
- ;EXIT ROUTINE
- ;
- EXIT: JMP 0000H ;FILLED IN BY 'BEGIN' FOR RETURN TO 'CCP'
- ;.....
- ;
- ;
- ; GET A CHARACTER FROM THE BUFFER
- ;
- GETCH: CALL DISK1 ;PICK OFF THE CHAR.
- ANI 7FH ;STRIP OFF ANY PARITY
- RET
- ;.....
- ;
- ;
- ; INDENT FOR NEW LEFT MARGIN, IF REQUESTED
- ;
- INDENT: PUSH PSW ;SAVE THE CHAR.
- LXI H,MARGIN
- CALL STRNGP ;WRITE THE STRING
- XRA A
- STA COLMN ;RESET THE COLUMN COUNT
- POP PSW ;RESTORE THE CHAR.
- RET
- ;.....
- ;
- ;
- ; GET A CHARACTER FROM THE KEYBOARD
- ;
- INPUT: PUSH H
- PUSH B
- MVI C,CONIN
- CALL BDOS
- ANI 7FH ;STRIP OFF ANY PARITY
- POP B
- POP H
- CPI 3 ;CONTROL-C ?
- JZ ABORT2 ;IF YES, GO TERMINATE
- RET
- ;.....
- ;
- ;
- ; SET PARAMETERS FOR A NEW PAGE
- ;
- NEWPG: XRA A
- STA LCNT ;RESET THE TEXT COUNT
- STA COLMN ;RESET THE COLUMN COUNT
- LDA START ;ALREADY PRINTING?
- ORA A
- CZ CKST ;IF NOT CHECK WHETHER READY NOW
- JMP INDENT ;SET IN ANY LEFT MARGIN SPACES
- ;.....
- ;
- ;
- ; INCREMENT THE PAGE NUMBER FOR HARD COPY
- ;
- NMBR: LXI H,HEAD4+2
- MVI C,PAGENM
- ;
- NMBR1: MOV A,M ;GET THE VALUE
- CPI ' ' ;IS IT A SPACE?
- JZ NMBR2 ;EXIT IF NOT
- CPI SI ;SYNCH CHAR.?
- JNZ NMBR3
- ;
- NMBR2: MVI A,'0' ;OTHERWISE CALL IT A ZERO
- ;
- NMBR3: INR A
- MOV M,A
- CPI '9'+1 ;READY TO START NEXT DIGIT?
- JNZ NMBR4 ;IF NOT, FINISHED
- ;
- MVI M,'0' ;OTHERWISE MAKE THIS ONE A ZERO
- DCX H ;WORK ON NEXT COLUMN
- DCR C ;ONE LESS TO GO
- JNZ NMBR1 ;GO DO THE NEXT ONE
- ;
- NMBR4: RET ;FINISHED
- ;.....
- ;
- ;
- ; IF NO PRINT, TELL WHAT MAXIMUM PAGE WAS
- ;
- NOPNT: LXI H,MSG3 ;TURN UP A BLANK LINE
- CALL STRNGC
- LXI H,MSG2 ;FINAL PAGE MSG
- CALL STRNGC
- LXI H,HEAD4
- CALL STRNGC
- JMP EXIT ;ALL DONE NOW
- ;.....
- ;
- ; TO START A NEW PAGE
- ;
- NUPAGE: LXI H,TURNUP ;SEND A STRING OF LINE FEEDS TO
- JMP STRNGB ;..START A NEW PAGE
- ;.....
- ;
- ;
- ; DISPLAY AND PRINT THE PAGE NUMBER
- ;
- PAGNO: MVI A,' ' ;SPACE CHARACTER
- CALL WRITE2 ;DISPLAY AND PRINT AND COUNT
- LDA PAGCOL ;FIND COLUMN TO START PAGE NUMBER
- MOV B,A
- LDA COLMN ;GET PRESENT COLUMN
- ADI 1 ;COMPENSATE FOR LEFT MARGIN "0" COUNT
- SUB B ;SEE IF ROOM LEFT FOR SPACES
- JC PAGNO ;IF YES SEND ANOTHER SPACE
- ;
- LXI H,HEAD3 ;PAGE NUMBER STRING
- JMP STRNGB ;DISPLAY AND PRINT, FINISHED
- ;
- ;.....
- ;
- ;
- ; ASKS VARIOUS QUESTIONS SUCH AS HEADING, PAGE NUMBERS, ETC.
- ;
- ; TABS FOR ROLL PAPER REQUEST
- ;
- PRHC: CALL RPAPER ;USING ROLL PAPER?
- ;
- ;.....
- ;
- ; ASK FOR ANY FILL CHARS. TO AUGMENT LEFT MARGIN
- ;
- LXI H,MSG1C ;WANT FILL CHARS.?
- CALL STRNGC
- MVI B,0
- LXI H,FILLS+1 ;STORAGE FOR NUMBER OF FILL CHARS.
- ;
- PRHC1: CALL INPUT ;GET KEYBOARD ANSWER
- CPI CR ;CARRIAGE RETURN TO QUIT?
- JZ PRHC4
- CPI BS ;BACKSPACE CHAR.?
- JNZ PRHC2
- CALL BCKSP ;BACKSPACE
- JMP PRHC1
- ;
- PRHC2: CPI ' '
- JC PRHC1 ;IF NON-PRINTING, IGNORE
- MOV M,A ;STORE CHARACTER
- INX H ;NEXT STORAGE LOCATION
- INR B ;INCREMENT COUNT
- CPI '0'
- JC PRHC3 ;DIGITS FROM 0-9 ACCEPTABLE
- CPI '9'+1
- JNC PRHC3 ;DIGITS FROM 0-9 ACCEPTABLE
- MOV A,B
- CPI 2+1 ;TWO MAXIMUM DIGITS FOR 0-99
- JC PRHC1
- ;
- PRHC3: CALL BCKSP2 ;WON'T ALLOW THREE DIGITS
- CALL BCKSP1 ; (OR NON-NUMERIC CHARS.)
- JMP PRHC1 ;GET NEXT CHAR.
- ;...
- ;
- ;
- ; NOW PUT THE NUMBER OF "INDENT SPACES" INTO THE "MARGIN" BUFFER
- ;
- PRHC4: LXI D,MARGIN ;LOCATION OF THE "INDENT SPACES"
- LXI H,FILLS+2 ;SEE IF 2 DIGITS THIS TIME
- MOV A,M
- CPI ' '
- JNZ UNITS ;IF NOT, HANDLE AS A UNIT-DIGIT
- DCX H
- MOV A,M
- CPI ' ' ;THIS ONE HAVE ANYTHING?
- JZ PRHC5 ;IF NOT, NO FILLS WANTED
- ;
- UNITS: SUI '0' ;CONVERT TO BINARY
- JZ TENS ;IF ALREADY ZERO, EXIT
- MOV B,A ;STORE
- MVI A,' '
- ;
- UNITS1: STAX D ;STORE A SPACE
- INX D
- DCR B
- JNZ UNITS1
- ;
- TENS: DCX H
- MOV A,M
- CPI '1' ;A NUMBER FROM 1-9?
- JC PRHC5 ;IF NOT, ALL DONE
- SUI '0' ;IF YES, CONVERT TO BINARY
- MOV B,A ;STORE
- ;
- TENS1: MVI C,10 ;10 SPACES FOR EACH "TENS" NUMBER
- MVI A,' '
- ;
- TENS2: STAX D ;STORE A SPACE
- INX D ;NEXT LOCATION
- DCR C
- JNZ TENS2
- DCR B
- JNZ TENS1 ;RELOAD 'C' TO 10 IF NEEDED
- ;......
- ;
- ;
- ; WANT NORMAL FORM FEED?
- ;
- PRHC5: LXI H,MSG3 ;TURN UP A NEW LINE
- CALL STRNGC
- LXI H,MSG1D ;FORM FEED MSG
- CALL STRNGC
- ;
- CALL INPUT ;GET KEYBOARD CHAR.
- ANI 5FH ;CHANGE TO UPPER CASE IF NEEDED
- CPI 'Y' ;FINISHED IF 'RET'
- JNZ PRHC6
- STA FRMFD
- ;...
- ;
- ;
- ; ASK FOR CURRENT HEADING/DATE
- ;
- PRHC6: LXI H,MSG3 ;TURN UP A NEW LINE
- CALL STRNGC
- LXI H,MSG1E ;HEADING/DATE MESSAGE
- CALL STRNGC
- MVI B,0
- LXI H,HEAD2
- ;
- PRHC7: CALL INPUT ;GET KEYBOARD CHAR.
- CPI CR ;FINISHED IF 'RET'
- JZ PRHC9
- CPI BS
- JNZ PRHC8
- CALL BCKSP
- JMP PRHC7
- ;
- PRHC8: MOV M,A
- INX H
- INR B
- MOV A,B
- CPI 124+1 ;ROOM FOR 124 CHARS. IN BUFFER
- JC PRHC7
- CALL BCKSP2
- CALL BCKSP1 ;DO NOT ALLOW A TOO-LONG LINE
- JMP PRHC7
- ;
- ;
- ; ASK FOR STARTING PAGE
- ;
- PRHC9: LXI H,MSG3 ;TURN UP A NEW LINE
- CALL STRNGC
- LXI H,MSG1F
- CALL STRNGC
- MVI B,0
- LXI H,PAGES+2 ;STARTING PAGE STORAGE
- ;
- PRHC10: CALL INPUT
- CPI CR
- JZ PRHC12
- CPI BS
- JNZ PRHC11
- CALL BCKSP
- JMP PRHC10
- ;
- PRHC11: MOV M,A
- INX H
- INR B
- MOV A,B
- CPI 3+1 ;THREE MAXIMUM PAGE NUMBERS
- JC PRHC10
- CALL BCKSP2
- CALL BCKSP1 ;DO NOT ALLOW A TOO-LONG LINE
- JMP PRHC10
- ;
- ;
- ; ASK FOR STOPPING PAGE
- ;
- PRHC12: LXI H,MSG3 ;TURN UP A NEW LINE
- CALL STRNGC
- LXI H,MSG1G
- CALL STRNGC
- MVI B,0
- LXI H,PAGEQ+2 ;QUITTING PAGE STORAGE
- ;
- PRHC13: CALL INPUT
- CPI CR
- JZ PRHC15
- CPI BS
- JNZ PRHC14
- CALL BCKSP
- JMP PRHC13
- ;
- PRHC14: MOV M,A
- INX H
- INR B
- MOV A,B
- CPI 3+1 ;THREE MAXIMUM PAGE NUMBERS
- JC PRHC13
- CALL BCKSP2
- CALL BCKSP1 ;DO NOT ALLOW A TOO-LONG LINE
- JMP PRHC13
- ;
- PRHC15: LXI H,MSG3 ;TURN UP A NEW LINE
- CALL STRNGC
- RET
- ;.....
- ;
- ; show form & printer parameters - changes necessary ?
- ;
- shpcol: lxi h,msgpc ;point to message
- call strngc ; and display it
- ;
- lda lspc ;get spacing data
- mov e,a ; and store in E
- lxi h,msgpc1+32 ;point to destination
- call biasc ; convert and fill
- lxi h,msgpc1 ; point to spacing message
- call strngc ; and show it
- ;
- lda chwd ;get print density
- mov e,a ; and save in E
- lxi h,msgpc2+32 ;point to destination
- call biasc ; convert and fill
- lxi h,msgpc2 ; point to density message
- call strngc ; and show it
- ;
- askch: lxi h,msgpc5 ;changes necessary?
- call strngc ; print it
- call input ; and get answer
- ani 5fh ; make ucase
- cpi 'Y'
- jz chang ;changes needed
- cpi 'N' ; no changes, bail out
- jz stdcfg ; and set standard printer parms
- cpi 'D' ;changes done?
- rz ; yes, bail out!
- jmp askch ;wait for valid input
- ;
- stdcfg: mvi a,1 ;get a "1"
- sta stdflg ; and set the flag
- call lspac8 ;set 6 lines/in.
- call cwid17 ; and 10 cpi
- call tof ; and top-of-form
- xra a ; then
- sta stdflg ; clear the flag
- ret
- ;
- mdone: call stroki ;send a string to the oki
- lda stdflg
- ora a ; see if zero
- jz shpcol ; if yes, then maybe done
- call tof ;if not, set top-of-form
- ret ; and bail out
- ;
- ; set the top-of-form on the okidata u84
- ;
- tof: lxi h,tofmsg ;point to the tof message
- call stroki ; and tell the printer
- ret
- ;
- chang: lxi h,msgpc6 ;ask for changes
- call strngc
- call input ; get change number
- cpi '1' ;line spacing change
- jz lspac
- cpi '2' ;chars. per inch
- jz cwid
- jmp chang ;wait for valid input
- ;
- ;.....
- ;
- ; Set up line spacing parameter for Microline 84
- ;
- lspac: lxi h,lsmsg ;ask for lpi
- call strngc
- call input ;get answer
- cpi '6'
- jz lspac6 ;set 6 lpi
- cpi '8'
- jz lspac8 ;set 8 lpi
- jmp lspac ;wait for good value
- ;
- lspac6: mvi a,6 ;get a 6
- sta lspc ; store new variable
- mvi a,54 ;lines of text/page
- sta text ; for 6lpi
- lxi h,lsmsg6 ;point to message string
- jmp mdone ; and send to printer
- ;
- lspac8: mvi a,8 ;get an 8
- sta lspc ; store new variable
- mvi a,76 ;lines of text/page
- sta text ; for 8 lpi
- lxi h,lsmsg8 ;point to message string
- jmp mdone ; and send to printer
- ;
- ;.....
- ;
- ; set up print density (chars/inch) for Microline 84
- ;
- cwid: lxi h,cwmsg ;ask for cwid
- call strngc
- call input ;get value
- cpi '1'
- jz cwid10
- cpi '2'
- jz cwid12
- cpi '3'
- jz cwid17
- jmp cwid
- ;
- cwid10: mvi a,50 ;pg# loc. for 10 cpi
- sta pagcol ; store it
- mvi a,10
- sta chwd
- lxi h,cwmsg10 ;point to message string
- jmp mdone ; and sent to printer
- ;
- cwid12: mvi a,56 ;pg# loc. for 12 cpi
- sta pagcol ; and store it
- mvi a,12
- sta chwd
- lxi h,cwmsg12 ;point to message string
- jmp mdone ; and send to printer
- ;
- cwid17: mvi a,85 ;pg# loc. for 17 cpi
- sta pagcol ; and store it
- mvi a,17
- sta chwd
- lxi h,cwmsg17 ;point to message string
- jmp mdone ; and send to printer
- ;
- ;.....
- ;
- ; binary to ascii conversion routine accepts binary
- ; data in register E with HL pointing to the destination
- ; of the 2 ascii bytes.
- ;
- biasc: push psw! push b ;save registers
- lxi b,0 ; and clear BC
- mov a,e ;recall data byte
- mvi c,10 ; value to subtract
- bitod: sub c ;sub 10 from bin value
- inr b ; and tell tens accumulator
- jnc bitod ; continue till A exhausted
- add c ; too much, add once to C
- dcr b ; and reduce count in B
- adi '0' ;now, make units value ascii
- mov c,a ; and store it in C
- mov a,b ;get the tens data
- adi '0' ; and make it ascii
- mov m,a ; store it in table area
- inx h ;increment table pointer
- mov m,c ;get the units data to table area
- pop b! pop psw
- ret
- ;
- ;.....
- ;
- ; Electralogics Real Time Clock Routines
- ;
- ;
- BLK EQU 40H
- BLKSEL EQU 48H
- ;
- ;
- TIME: JMP RDCLK
- ;
- TEXIT: RET
- ;.....
- ;
- ; CONVERT CHAR IN A TO HEX AND DISPLAY
- ; ------------------------------------
- DYHEX: PUSH PSW ! RAR ! RAR ! RAR ! RAR
- CALL DYNIB ! POP PSW
- DYNIB: ANI 0FH ! ADI 30H ! CPI 3AH ! JC DY
- ADI 7
- ;.....
- ;
- ; place time character into header
- ; ----------------------
- DY: PUSH H
- LHLD DATCOL ! MOV M,A
- INX H ! SHLD DATCOL
- POP H
- RET
- ;
- SPACE: MVI B,1
- SPACES: MVI A,20H ! CALL DY
- DCR B ! JNZ SPACES
- RET
- ;
- ;
- CLKFLD: ;Set from clock (Packed BCD format)
- DB 0 ;Day of week
- DB 0 ;Day of month
- DB 0 ;Month
- DB 83H ;Year
- DB 0 ;Hour
- DB 0 ;Minutes
- DB 0 ;Seconds
- ;
- ;
- DAYLST:
- DB 'SUNMONTUEWEDTHUFRISAT'
- MONTHLST:
- DB 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'
- ;
- ;
- ;
- RDCLK: MVI A,0CH ! OUT BLKSEL ;Select counters
- LXI H,CLKFLD
- IN BLK+5 ! MOV M,A ! INX H ;Read day of week
- IN BLK+6 ! MOV M,A ! INX H ; day of month
- IN BLK+7 ! MOV M,A ! INX H ; month
- INX H ; bypass year
- IN BLK+4 ! MOV M,A ! INX H ; hour
- IN BLK+3 ! MOV M,A ! INX H ; minutes
- IN BLK+2 ! MOV M,A ; seconds
- MVI A,0EH ! OUT BLKSEL ;Select clock status block
- IN BLK+4 ! ANI 1 ! JNZ RDCLK ;Retry if time not valid
- IN BLK+0 ;Reset interrupt
- ;
- LXI D,CLKFLD
- LXI H,DAYLST
- LDAX D ! INX D ! CALL DYTX ;Day of week
- CALL SPACE
- LDAX D ! INX D ! CALL DYHEX ;Day
- CALL SPACE
- LXI H,MONTHLST ;Month
- LDAX D ! INX D ! CALL DYTX
- CALL SPACE
- LDAX D ! INX D ! CALL DYHEX ;Year
- MVI B,2 ! CALL SPACES
- LDAX D ! INX D ! CALL DYHEX ;Hour
- MVI A,':' ! CALL DY
- LDAX D ! INX D ! CALL DYHEX ;Minutes
- MVI A,':' ! CALL DY
- LDAX D ! CALL DYHEX ;Seconds
- JMP TEXIT
- ;.....
- ;
- ; DISPLAY TABLE ENTRY
- ; Accepts: HL = ptr to table, A = BCD index into table
- ;
- DYTX:
- CPI 10H ! JC DYTX1 ;Convert index to binary
- ANI 0FH ! ADI 10
- DYTX1: MOV C,A ! DCR C ! XRA A
- ADD C ! ADD C ! ADD C
- MOV C,A ! MVI B,0 ! DAD B
- MOV A,M ! INX H ! CALL DY
- MOV A,M ! INX H ! CALL DY
- MOV A,M ! JMP DY
- ;.....
- ;
- ;
- ; ROLL UP PAGE TO TERMINATE
- ;
- ROLL: LDA START ;HAVE WE STARTED PRINTING AT ALL?
- ORA A
- JZ NOPNT ;IF NOT, TELL WHAT MAXIMUM PAGE WAS
- MVI A,CR
- CALL WRITEP ;SEND
- ;
- ROLL1: LDA LCNT
- INR A
- STA LCNT
- push h
- lxi h,text
- cmp m
- pop h
- JNC ROLL2
- MVI A,LF
- CALL WRITEP ;SEND
- JMP ROLL1 ;GO DO ANOTHER UNTIL DONE
- ;
- ROLL2: CALL TTABS ;CHECK FOR TEAR TABS
- LDA NOTAB ;USING FANFOLD PAPER?
- ORA A
- JZ EXIT ;IF YES, LEAVE IN NORMAL POSITION
- LXI H,QUIT ;FINAL LINES TO FINISH PAGE
- CALL STRNGP
- JMP EXIT ;DONE
- ;.....
- ;
- ;
- ; OPTION FOR ROLL PAPER (CHANGES FANFOLD AREAS)
- ;
- RPAPER: LXI H,MSG1B ;ASK IF USING ROLL PAPER
- CALL STRNGC
- CALL INPUT
- ANI 5FH ;CHANGE TO UPPER CASE IF NEEDED
- CPI 'Y'
- JNZ RPAP1 ;IF NOT, EXIT
- ;
- INR A ;INCREMENT TO '1'
- STA NOTAB ;SHOW WE WANT TEAR TABS
- ;
- RPAP1: LXI H,MSG3
- CALL STRNGC
- RET
- ;.....
- ;
- ;
- ; IGNORE CR, LF, FFD OR EOF AT TOP OF ANY NEW PAGE
- ;
- SKIP: CALL GETCH ;GET INPUT CHAR.
- CPI CR
- JZ SKIP ;IF YES, SKIP
- CPI LF
- JZ SKIP ;IF YES, SKIP
- CPI EOF
- JZ ROLL ;IF YES, TERMINATE
- CPI FFD
- JZ SKIP ;IF YES, IGNORE
- RET
- ;.....
- ;
- ;
- ; TRANSFER A STRING OF CHARS. FROM ONE AREA TO ANOTHER
- ;
- STORE: MOV A,M
- STAX D
- INX H
- INX D
- DCR C
- JNZ STORE
- RET
- ;.....
- ;
- ;
- ; PRINT AND DISPLAY A STRING OF CHARACTERS
- ;
- STRNGB: MOV A,M
- ORA A
- RZ ;DONE IF ZERO
- CALL WRITE2 ;DISPLAY AND PRINT CHAR.
- INX H ;NEXT LOCATION
- JMP STRNGB ;DO THE NEXT ONE
- ;.....
- ;
- ;
- ; WRITE ASCII STRING TO CRT ONLY
- ;
- STRNGC: MOV A,M
- ORA A
- RZ
- CALL WRITCC ;DISPLAY ONLY
- INX H
- JMP STRNGC ;DO NEXT CHAR.
- ;.....
- ;
- ;
- ; PRINT A STRING OF CHARACTERS
- ;
- STRNGP: MOV A,M ;GET THE CHAR.
- ORA A
- RZ ;DONE IF ZERO
- CALL WRITEP ;PRINT CHAR.
- INX H
- JMP STRNGP ;DO THE NEXT ONE
- ;
- ;.....
- ;
- ; print a string of characters to OKI u84
- ;
- stroki: mov a,m ;get the character
- ora a
- rz ;done bail out
- mov e,a ;put character in E reg.
- call writpr ;print the character
- inx h
- jmp stroki ;loop till done
- ;.....
- ;
- ;
- ; ADDS TEAR TABS FOR ROLL PAPER
- ;
- TTABS: LDA NOTAB ;WANT TEAR TABS?
- ORA A
- JZ NUPAGE ;IF NOT EXIT. SEND LINE FEEDS
- LXI H,QUITR
- CALL STRNGB ;SEND LF TO FINISH THE PAGE
- MVI A,'-'
- CALL WRITE3
- LDA TTABN ;GET NUMBER OF SPACES BETWEEN TABS
- MOV B,A
- ;
- TTABS1: MVI A,' '
- CALL WRITE3
- DCR B
- JNZ TTABS1
- ;
- MVI A,'-'
- CALL WRITE2
- LXI H,QUITR
- CALL STRNGB
- XRA A
- STA COLMN ;RESET THE COLUMN COUNTER
- RET
- ;.....
- ;
- ;
- ; WRITE CHAR. TO CRT
- ;
- WRITE2: CPI SI ;SYNCH CHAR.?
- RZ ;IF YES, IGNORE
- CPI CR
- JZ WRITE3 ;DO NOT COUNT
- CPI LF
- JZ WRITE3 ;DO NOT COUNT
- PUSH PSW ;SAVE THE CHAR. VALUE
- LDA COLMN ;INCREMENT THE COLUMN COUNT
- INR A
- STA COLMN
- POP PSW ;RESTORE THE CHAR. VALUE
- ;
- ;
- WRITE3: CALL WRITEC
- ;
- ;
- ; WRITE CHAR. TO PRINTER
- ;
- WRITE1: CALL WRITEP
- RET
- ;.....
- ;
- ;
- ; WRITE ASCII CHARACTER TO CRT
- ;
- WRITEC: MOV E,A ;STORE THE CHAR. TEMP.
- LDA START ;READY TO DISPLAY YET?
- ORA A
- MOV A,E ;RESTORE THE CHAR.
- RZ
- ;
- WRITCC: PUSH H
- PUSH D
- PUSH B
- PUSH PSW
- MOV E,A
- MVI C,CONOUT ;WRITE TO THE CRT CONSOLE
- CALL BDOS
- POP PSW
- POP B
- POP D
- POP H
- RET
- ;.....
- ;
- ;
- ; WRITE ASCII CHARACTER TO PRINTER
- ;
- WRITEP: CPI SI ;SYNCH CHAR.?
- RZ ;IF YES, IGNORE
- MOV E,A ;PUT CHAR. IN 'E' REG.
- LDA START ;READY TO START YET?
- ORA A
- RZ ;EXIT IF NOT READY YET
- ;
- writpr: PUSH H
- PUSH B
- MVI C,LIST ;WRITE TO THE PRINTER
- CALL BDOS
- POP B
- POP H
- RET
- ;
- ;.....
- ;
- ;
- DS 40 ;MIMIMUM STACK DEPTH
- STACK: DS 0
- ;
- BUFF equ ($+127)/128*128 ;GET ON AN EVEN PAGE
- ;
- ;
- ORG BUFF
- ;
- BUFFER EQU $
- ;.....
- ;
- ;
- END START
-