home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
PROGRAMS
/
LIST
/
PSET16A.LBR
/
PSET16A.AQM
/
PSET16A.ASM
Wrap
Assembly Source File
|
2000-06-30
|
38KB
|
1,122 lines
;
; PSET16.ASM - 7 July 1986
;
; Version 1.6a - 17 Jul 86 - I found a bug in the code that could
; have caused a problem on exit of the program. This revision
; fixes that bug. Also fixed minor bug in form length setting
; code. - Barron McIntire
;
; Version 1.6 - 7 Jul 86 - I have added an equate for the Citizen
; MSP-20. I have also changed the menu to display
; only when the program is first called up. A '?' option has
; been added to re-display the menu. Also added a command line
; parsing routine. This allows you to skip the interactive mode
; completely. Thus, entering PSET (assuming that you have renamed
; this to PSET.COM) will enter interactive mode, but entering
; PSET A V 32 B will initialize the printer, set the left margin at
; column 32, set elite mode on, and then return to DOS. Spaces
; may be inserted for readability, but are not necessary between
; commands, as the program ignores them. Spaces ARE required,
; however, to end decimal numbers. Thus, PSET V32 B is valid,
; but PSET V32B is not. PSET V 3 2 B will set the left margin at
; column 3, set proportional printing off (for MSP-20), and then
; set elite mode on. The point is, be careful of spaces following
; numbers. An erroneous character in the command line will cause
; PSET to generate an error message and stop processing at the point
; where it found the error. All previous commands will be
; acted upon. - Barron McIntire
;
; Version 1.5 - 25 Aug 85 - I finally received the complete user
; guide for my citizen printer and found that it had a 160 column
; compressed elite mode. This version adds this under the citizen
; equate. - Barron McIntire
;
; Version 1.4 - 28 Jul 85 - I have added an equate for the Gemini
; printers, as it appears that they are not totally Epson compatible.
; insure that both Citizen and Gemini equates are not both set at
; the same time. - Barron McIntire
;
; Version 1.3 - 1 Mar 85 - I traded my Epson RX-80 in on a Citizen
; MSP-10, and found that it did not release the last line when the
; off-line switch was pressed. I have therefore added an option to
; generate a cr,lf. this replaces the one-line enlarged mode which
; didn't work anyway. I have also added an equate for the Citizen
; printer which will add the correspondence quality mode. Setting
; this to false will keep the Epson compatibility. - Barron McIntire
;
; Version 1.2 - 6 Jan 85 - I have added the superscript and subscript
; modes, as they can create some very fine printing when permanently
; set, if somewhat slow. (Try condensed mode, superscript mode, and
; 5/72 inch line spacing.) - Barron McIntire
;
; Version 1.1 - 12/9/84 - This is one of the nicest and most generic
; epson menus. My only contribution was to add the appropriate mask
; byte wherever required to allow selection via lower case as well
; upper case letters. It seems to run fine on a kaypro 4-84 under
; ZCPR3 with a Mannesmann-Talley Spirit 80 printer. - Bruce Morgen
;
;---------------------------------------------------------------------------
;
; Version 1.0 - 5 November 1983
;
; This program will allow the operator to pre-set certain printer
; states. The printer will remain in these states until the printer
; power is recycled, or the printer is directed into another state
; by program control.
;
; This program was originally written in Mbasic, and translated into
; asm code for speed and ease of use.
;
; This program was written for the Epson RX-80 and Heath CP/M 2.2.03.
; It has since been found to work with Heath CP/M 2.2.04 and Kaypro
; CP/M 2.2xx, and should work with any Epson compatible printer.
;
; Written by: Barron F. McIntire III
; 3400 S. Greeley Hwy #8
; Cheyenne, Wyoming 82007
; R.A.S. Phone 307-635-8366, 300/1200 baud, 24 hours
; Compuserve ID 74155,441
;
; define cp/m routines
;
boot equ 0 ;bottom of memory
bdos equ boot+5 ;jump to cp/m bdos
tpa equ boot+100h ;transient program area
conin equ 1 ;console input function
conout equ 2 ;console output function
lstout equ 5 ;printer output function
linout equ 9 ;text output function
;
; misc equates
;
no equ 0 ;for conditional assembly
yes equ not no ;(=0ffffh usually, not 0ffh)
ver equ '1'
modlev equ '6'
cr equ 13
lf equ 10
bel equ 7
esc equ 27
clptr equ 81h ;pointer to current command line position
clscr equ yes ;yes if you wish screen clear at start
;patch your clear screen data at clr below
;
; +++++ IMPORTANT NOTE +++++
;
; printer equates - insure that no more than one of these equates
; is true, as unpredictable results may occur
;
epson equ no ;yes for Epson printers
gemini equ no ;yes for Gemini printers
msp10 equ no ;yes for Citizen MSP-10 printers
msp20 equ yes ;yes for Citizen MSP-20 printers
;
org tpa
;
; set up stack
;
start
lxi h,0 ;zero hl reg
dad sp ;set hl to stack pointer
lxi sp,stack ;set our stack pointer
push h ;save cp/m's stack pointer on ours
;
; parse command line
;
lxi h,80h ;set hl to cpm command line buffer
mov a,m ;get char count in a reg
cpi 0 ;is char count 0?
jz openms ;no command line - go run pset with menu
inr a ;add one to a (parse starts by sub one)
sta ccount ;save character count +1
shld cladr ;save hl register
mvi a,1
sta clflg ;store 1 in command line flag
call clprs ;go parse command line
jmp cpopt ;skip option input, we already have it
;
openms
mvi a,0
sta clflg ;store 0 in command line flag
;
; display opening message
;
if clscr ;clear screen
lxi d,clr ;point to clear screen data
mvi c,linout ;get linout function
call bdos ;clear the screen
endif
;
lxi d,messg ;point to opening message
mvi c,linout ;get linout function
call bdos ;print the message
;
; display menu
;
mnudis
lxi d,mnumes ;point to menu message
mvi c,linout ;get linout function
call bdos ;print the message
;
; ask for option
;
optdis
lxi d,optmes ;point to options message
mvi c,linout ;get linout function
call bdos ;print the message
;
; input option
;
optin
mvi c,conin ;get menu option
call bdos ;get character
cpi 'a' ;less than 'a'?
jc cont2 ;don't mask if not lower case
cpi 'z' ;greater then 'z'?
jnc cont2 ;skip mask
ani 5fh ;mask to upper case (b.m. - 12/84)
cont2
push psw ;save a reg
mvi c,conout ;get conout function
mvi e,cr ;get cr char
call bdos ;send it
mvi c,conout ;get conout function
mvi e,lf ;get lf char
call bdos ;send it
pop psw ;get a reg back
;
; compare option
;
cpopt
push psw ;save input
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz cpopt1 ;press on if so
pop psw ;get original character back
cpi 20h ;space?
jnz cpopt2 ;no, go process it
call clprs ;else, get another character
jmp cpopt ;go again
cpopt1
pop psw ;get original character back
cpopt2
cpi '?'
jz mnudis
cpi '#'
jz exit
cpi 'A'
jz opt1
cpi 'B'
jz opt2
cpi 'C'
jz opt3
cpi 'D'
jz opt4
cpi 'E'
jz opt5
cpi 'F'
jz opt6
cpi 'G'
jz opt7
cpi 'H'
jz opt8
cpi 'I'
jz opt9
cpi 'J'
jz opt10
cpi 'K'
jz opt11
cpi 'L'
jz opt12
cpi 'M'
jz opt13
cpi 'N'
jz opt14
cpi 'O'
jz opt15
cpi 'P'
jz opt16
cpi 'Q'
jz opt17
cpi 'R'
jz opt18
cpi 'S'
jz opt19
cpi 'T'
jz opt20
cpi 'U'
jz opt21
cpi 'V'
jz opt22
cpi 'W'
jz opt23
cpi 'X'
jz opt24
;
if msp10 or msp20
cpi 'Y'
jz opt25
cpi 'Z'
jz opt26
endif
if msp20
cpi '0'
jz opt27
cpi '1'
jz opt28
cpi '2'
jz opt29
cpi '3'
jz opt30
endif
;
; error if no compare
;
erdis
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz erdis2 ;then run normal error message
lxi d,emessx ;else get command line error message
mvi c,linout ;get linout function
call bdos ;send to user
jmp exit ;exit to DOS
erdis2
lxi d,emess ;point to error message
mvi c,linout ;get linout function
call bdos ;ask if exit is desired
mvi c,conin ;get conin function
call bdos ;get the character
ani 5fh ;mask to upper case (b.m. - 12/84)
push psw ;save a reg
mvi c,conout ;get conout function
mvi e,cr ;get carriage return char
call bdos ;output to crt
mvi c,conout ;get conout function
mvi e,lf ;get line feed
call bdos ;output to crt
pop psw ;get a reg
cpi 'Y' ;is it yes?
jz exit ;then exit to cp/m
jmp optdis ;otherwise re-display options
;
; printer initialization
;
opt1
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'@' ;get printer reset char
call bdos ;send to printer
jmp more ;another option?
;
; elite-sized character setting
;
opt2
call escap ;send escape character to printer
if gemini
mvi c,lstout ;get lstout function
mvi e,'B' ;get elite first char
call bdos ;send to printer
mvi c,lstout ;get lstout char
mvi e,2 ;get lstout second char
call bdos ;send to printer
endif
if not gemini
mvi c,lstout ;get lstout function
mvi e,'M' ;get elite char
call bdos ;send to printer
endif
jmp more ;another option?
;
; pica-sized character setting
;
opt3
call escap ;send escape character to printer
if gemini
mvi c,lstout ;get lstout function
mvi e,'B' ;get pica first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get pica second char
call bdos ;send to printer
endif
if not gemini
mvi c,lstout ;get lstout function
mvi e,'P' ;get pica char
call bdos ;send to printer
endif
jmp more ;another option?
;
; enlarged mode
;
opt4
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'W' ;get enlarged mode first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get enlarged mode second char
call bdos ;send to printer
jmp more ;another option?
;
; send cr,lf to printer
;
opt5
mvi c,lstout ;get lstout function
mvi e,cr ;get carriage return char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,lf ;get line feed char
call bdos ;send to printer
jmp more ;another option?
;
; condensed mode
;
opt6
mvi c,lstout ;get lstout function
mvi e,15 ;get condensed mode char
call bdos ;send to printer
jmp more ;another option?
;
; emphasized and enlarged mode
;
opt7
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'E' ;get emphasized mode char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,esc ;get escape character
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,'W' ;get enlarged mode first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get enlarged mode second char
call bdos ;send to printer
jmp more ;another option?
;
; emphasized mode
;
opt8
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'E' ;get emphasized mode char
call bdos ;send to printer
jmp more ;another option?
;
; double-strike mode
;
opt9
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'G' ;get double-strike mode char
call bdos ;send to printer
jmp more ;another option?
;
; alternate character set (italics)
;
opt10
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'4' ;get alernate char set char
call bdos ;send to printer
jmp more ;another option?
;
; underline mode
;
opt11
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'-' ;get underline mode first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get underline mode second char
call bdos ;send to printer
jmp more ;another option?
;
; ignore paper end detector
;
opt12
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'8' ;get ignore paper end mode char
call bdos ;send to printer
jmp more ;another option?
;
; unidirectional printing
;
opt13
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'U' ;get unidirectional printing first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get unidirectional printing second char
call bdos ;send to printer
jmp more ;another option?
;
; 7/72 inch line spacing
;
opt14
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'1' ;get 7/72 inch line spacing mode char
call bdos ;send to printer
jmp more ;another option?
;
; 1/16 inch line spacing
;
opt15
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'2' ;get 1/16 inch line spacing mode char
call bdos ;send to printer
jmp more ;another option?
;
; 1/8 inch line spacing
;
opt16
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'0' ;get 1/8 inch line spacing mode char
call bdos ;send to printer
jmp more ;another option?
;
; n/72 inch line spacing
;
opt17
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o17a ;press on if so
jmp o17b ;else skip asking for data
o17a
lxi d,mes17 ;point to message
mvi c,linout ;get linout function
call bdos ;print the message
o17b
call decin ;decimal input routine
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnz o17c ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt17 ;let user re-input
jmp erdis ;else display error message and exit
o17c
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'A' ;get n/72 inch line spacing char
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get n
call bdos ;send to printer
jmp more ;another option?
;
; n/216 inch line spacing (n/144 for gemini)
;
opt18
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o18a ;press on if so
jmp o18b ;else skip asking for data
o18a
lxi d,mes18 ;point to message
mvi c,linout ;get linout function
call bdos ;print the message
o18b
call decin ;decimal input routine
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnz o18c ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt18 ;let user re-input
jmp erdis ;else display error message and exit
o18c
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'3' ;get n/216 inch line spacing char
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get n
call bdos ;send to printer
jmp more ;another option?
;
; form length setting
;
opt19
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o19a ;press on if so
call clprs ;get input from command line
cpi 20h ;valid character?
jz opt19 ;then get another
jmp o19b ;skip asking for data
o19a
lxi d,mes19 ;point to message
mvi c,linout ;get linout function
call bdos ;print the message
mvi c,conin ;get conin function
call bdos ;get the character
push psw ;save a reg
mvi c,conout ;get conout function
mvi e,cr ;get carriage return
call bdos ;output to crt
mvi c,conout ;get conout function
mvi e,lf ;get line feed
call bdos ;output to crt
pop psw ;get a reg
o19b
cpi 'I' ;is it inches?
jnz lines ;go to lines routine if not
inchs
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o19c ;press on if so
jmp o19d ;skip asking for data
o19c
lxi d,minch ;point to inches message
mvi c,linout ;get linout function
call bdos ;print the message
o19d
call decin ;get number of inches
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnz o19e ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz inchs ;let user re-input
jmp erdis ;else display error message and exit
o19e
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'C' ;get form length char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,0 ;get inches designator
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get number of inches
call bdos ;send to printer
jmp more ;another option?
lines
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o19f ;press on if so
jmp o19g ;skip asking for data
o19f
lxi d,mlin ;point to lines message
mvi c,linout ;get linout function
call bdos ;print the message
o19g
call decin ;get number of lines
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnz o18h ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz lines ;let user re-input
jmp erdis ;else display error message and exit
o18h
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'C' ;get form length char
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get number of lines
call bdos ;send to printer
jmp more ;another option?
;
; skip over perforation
;
opt20
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o20a ;press on if so
jmp o20b ;skip asking for data
o20a
lxi d,mes20 ;point to message
mvi c,linout ;get linout function
call bdos ;print the message
o20b
call decin ;get number of lines to be skipped
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnc o20c ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt20 ;let user re-input
jmp erdis ;else display error message and exit
o20c
cpi 127 ;greater than 127?
jc o20d ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt20 ;let user re-input
jmp erdis ;else display error message and exit
o20d
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'N' ;get skip perf char
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get number of lines to skip
call bdos ;send to printer
jmp more ;another option?
;
; right margin setting
;
opt21
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o21a ;press on if so
jmp o21b ;skip asking for data
o21a
lxi d,mes21 ;point to message
mvi c,linout ;get linout function
call bdos ;print the message
o21b
call decin ;get number of char in line
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnz o21c ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt21 ;let user re-input
jmp erdis ;else display error message and exit
o21c
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'Q' ;get right margin char
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get number of char in line
call bdos ;send to printer
jmp more ;another option?
;
; left margin setting
;
opt22
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o22a ;press on if so
jmp o22b ;skip asking for data
o22a
lxi d,mes22 ;point to message
mvi c,linout ;get linout function
call bdos ;print message
o22b
call decin ;get left margin column number
mov a,e ;save low byte in accumulator
cpi 00h ;check for error
jnz o22c ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt22 ;let user re-input
jmp erdis ;else display error message and exit
o22c
push psw ;save a reg
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
if gemini
mvi e,'M' ;get left margin character
endif
if not gemini
mvi e,'l' ;get left margin character
endif
call bdos ;send to printer
mvi c,lstout ;get lstout function
pop psw ;get a reg
mov e,a ;get left margin column number
call bdos ;send to printer
jmp more ;another option?
;
; superscript mode
;
opt23
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'S' ;get superscript first character
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,0 ;get superscript second character
call bdos ;send to printer
jmp more ;another option?
;
; subscript mode
;
opt24
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'S' ;get subscript first character
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get subscript second character
call bdos ;send to printer
jmp more ;another option?
;
if msp10 or msp20
;
; correspondence quality mode
;
opt25
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'x' ;get cq first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,1 ;get cq second char
call bdos ;send to printer
jmp more ;another option?
;
; condensed elite mode
;
opt26
call escap ;send escape character to printer
mvi c,lstout ;get lstout function
mvi e,'M' ;get ce first char
call bdos ;send to printer
mvi c,lstout ;get lstout function
mvi e,15 ;get ce second char
call bdos ;send to printer
jmp more ;another option?
;
endif
;
if msp20
;
; select proportional spacing
;
opt27
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz o27a ;press on if so
jmp o27b ;skip asking for data
o27a
lxi d,mes27 ;point to message
mvi c,linout ;get linout function
call bdos ;print message
o27b
call decin ;get number
mov a,e ;put number in a reg
cpi 00h ;less than 0?
jnc o27c ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt27 ;let user re-input
jmp erdis ;else display error message and exit
o27c
cpi 80h ;greater than 127?
jc o18d ;press on if not
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz opt27 ;let user re-input
jmp erdis ;else display error message and exit
o18d
push psw ;save
call escap ;send esc to ptr
mvi c,lstout
mvi e,' ' ;get space char
call bdos ;send it
pop psw ;get a reg back
mvi c,lstout
mov e,a ;put in e reg
call bdos ;send it
jmp more ;another option?
;
; Set Proportional printing on
;
opt28
call escap
mvi c,lstout
mvi e,'p'
call bdos
mvi c,lstout
mvi e,1
call bdos
jmp more
;
; Set proportional printing off
;
opt29
call escap
mvi c,lstout
mvi e,'p'
call bdos
mvi c,lstout
mvi e,0
call bdos
jmp more
;
; Clear print buffer
;
opt30
mvi c,lstout
mvi e,24
call bdos
jmp more
;
endif
;
; decimal input subroutine (returns with number in de register)
;
decin
lxi d,0000h ;clear d-e reg
next
push d ;save d-e reg
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz next1 ;get input if so
mvi a,1
sta decflg ;set decimal input flag
call clprs ;else get next char from command line
jmp next2 ;skip user input
next1
mvi c,conin ;get conin function
call bdos ;get the character
next2
pop d ;get d-e reg
cpi cr ;are we done with interactive input?
jz next3 ;return if so
cpi 20h ;are we done with command line imput?
jz next3 ;return if so
sui 0030h ;convert ascii to decimal
jc error ;no good if carry (less than 0)
cpi 000ah ;higher than 9?
jnc error ;no good if so
lxi h,0000h ;clear h-l reg for multiplication
dad d ;multiply previous data by ten
dad h
dad h
dad d
dad h
mov e,a ;new entry to e
mvi d,00h ;clear d reg
dad d ;add units value to d-e reg
xchg ;new total to d-e reg
jmp next ;loop for next char
next3
mvi a,0
sta decflg ;reset decimal input flag
ret ;return
error
lda clflg ;get command line flag
cpi 0 ;is it zero?
jnz erdis ;go to command line error routine if not
lxi d,ermes ;else point to error message
mvi c,linout ;get linout function
call bdos ;print message
lxi d,0000h ;clear d-e reg
ret
;
; misc subroutines
;
; Send ESCape character to printer
;
escap
mvi c,lstout ;get lstout function
mvi e,esc ;get escape character
call bdos ;send to printer
ret
;
; Command line parse routine - returns with char in A register
;
clprs
lhld cladr ;get address of last command line character
lda ccount ;get character count
dcr a ;decriment character count
sta ccount ;put character count back in buffer
cpi 0 ;any more characters?
jnz clprs1 ;yes, press on
lda decflg ;else, get decimal input flag
cpi 0 ;zero unless called from decimal input
jz exit ;if not, then exit to DOS
mvi a,1 ;put 1 back in character count
sta ccount ;so will decriment to 0 on next run through
mvi a,20h ;put space in a register
ret ;return to decimal input routine
clprs1
inx h ;get next character
mov a,m ;get character
cpi 'a' ;less then a?
jc clprs2 ;skip upper case mask
cpi 'z' ;greater then z?
jnc clprs2 ;skip upper case mask
ani 5fh ;otherwise mask to upper case
clprs2
shld cladr ;save character address in buffer
ret
;
; If command line, get next character
; if not, ask user if done
;
more
lda clflg ;get command line flag
cpi 0 ;is it zero?
jz more2 ;display message if not
call clprs ;go to command line parse routine if so
jmp cpopt ;go do another one if clprs didn't exit
more2
lxi d,msend ;point to message
mvi c,linout ;get linout function
call bdos ;print the message
mvi c,conin ;get conin function
call bdos ;input character
ani 5fh ;mask to upper case (b.m. -12/84)
push psw ;save a reg
mvi c,conout ;get conout function
mvi e,cr ;get carriage return
call bdos ;output to crt
mvi c,conout ;get conout function
mvi e,lf ;get line feed
call bdos ;output to crt
pop psw ;get a reg
cpi 'Y' ;is it yes?
jz optdis ;display options if so
;
exit
pop h ;get cp/m's stack
sphl ;set it
jmp boot ;return to cp/m
;
; messages
;
if clscr ;clear screen
clr db 26,'$' ;put your clear screen data here *********
endif ;i.e...heath=esc,'e'
;
messg db ' ***** '
if epson
db 'EPSON'
endif
if gemini
db 'GEMINI'
endif
if msp10
db 'CITIZEN MSP-10'
endif
if msp20
db 'CITIZEN MSP-20'
endif
db ' PRINTER PRE-SET '
db 'PROGRAM v',ver,'.',modlev,' *****',cr,lf,lf
db 'This program will allow the operator to pre-set certain '
db 'printer states.',cr,lf
db 'The printer will remain in these states until the printer '
db 'power is',cr,lf
db 'recycled, or the printer is directed into another state '
db 'by program control.',cr,lf,'$'
mnumes db lf,'The following options are available:',cr,lf,lf
db ' ?. Display this list '
db ' O. 1/16 inch line spacing',cr,lf
db ' #. Exit to DOS '
db ' P. 1/8 inch line spacing',cr,lf
db ' A. Printer initialization '
db ' Q. n/72 inch line spacing',cr,lf
db ' B. Elite-sized character setting '
if gemini
db ' R. n/144 inch line spacing',cr,lf
endif
if not gemini
db ' R. n/216 inch line spacing',cr,lf
endif
db ' C. Pica-sized character setting '
db ' S. Form length setting',cr,lf
db ' D. Enlarged mode '
db ' T. Skip over perforation',cr,lf
db ' E. Send cr,lf to printer '
db ' U. Right margin setting',cr,lf
db ' F. Condensed mode '
db ' V. Left margin setting',cr,lf
db ' G. Emphasized/enlarged mode '
db ' W. Superscript mode',cr,lf
db ' H. Emphasized mode '
db ' X. Subscript mode',cr,lf
db ' I. Double strike mode '
if msp10 or msp20
db ' Y. Correspondence quality mode',cr,lf
endif
if not (msp10 or msp20)
db ' ',cr,lf
endif
db ' J. Alternate character set (italics) '
if msp10 or msp20
db ' Z. Condensed elite mode (160 col)',cr,lf
endif
if not (msp10 or msp20)
db ' ',cr,lf
endif
db ' K. Underline mode '
if msp20
db ' 0. Select proportional spacing',cr,lf
endif
if not msp20
db ' ',cr,lf
endif
db ' L. Ignore paper end detector '
if msp20
db ' 1. Set proportional printing on',cr,lf
endif
if not msp20
db ' ',cr,lf
endif
db ' M. Unidirectional printing '
if msp20
db ' 2. Set proportional printing off',cr,lf
endif
if not msp20
db ' ',cr,lf
endif
db ' N. 7/72 inch line spacing '
if msp20
db ' 3. Clear print buffer',cr,lf
endif
if not msp20
db ' ',cr,lf
endif
db cr,lf,'$'
optmes db 'Enter desired option:','$'
emess db bel,lf,'++ Unknown entry! - exit to CP/M (Y/N)?','$'
emessx db bel,cr,lf,'++ Unknown character selected in ++',cr,lf
db '++ command line - exiting to DOS ++',cr,lf,'$'
mes17 db 'Enter n/72 line spacing required: ','$'
mes18 db 'Enter n/216 line spacing required: ','$'
mes19 db 'Specify setting by lines (l) or inches (i) ?','$'
minch db 'Enter number of inches?','$'
mlin db 'Enter number of lines?','$'
mes20 db 'Enter number of lines to be skipped?','$'
mes21 db 'Enter number of characters required in line '
db '(P=80, E=96, C=137)?','$'
mes22 db 'Enter column in which to start left margin?','$'
mes27 db 'Enter spacing between characters in half-dot'
db ' increments (0 to 127): ','$'
ermes db bel,cr,lf,'Non-numeric character entered! Try again!',cr,lf,'$'
msend db cr,lf,'Another option (Y/N) ?','$'
;
; define space
;
ccount ds 1 ;number of characters remaining in command line
;
cladr dw 0080h ;address of current command line character
;
clflg ds 1 ;command line flag (0 of none / 1 if some)
;
decflg ds 1 ;decimal input flag
;
ds 16
stack equ $
;
end start