home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
list
/
printcpm.lbr
/
EPSON.AZM
/
EPSON.ASM
Wrap
Assembly Source File
|
1987-06-14
|
11KB
|
487 lines
;-----------------------------------------------------------------
;
; EPSON.COM
; Setup Epson Printer
; For CP/M 2.2 systems.
; Derived from a program by M. M. Hessel 02/15/82
;
; Re-written by Robert Kuhman on 07/02/83.
; Sysop of the "Cro'sNest" (c)1982 RCP/M - RBBS
; Released to the Public Domain for nonprofit use only.
;
;-----------------------------------------------------------------
;
; DEFINE EQUATES
;
; SET VERSION NUMBER AND REVISION NUMBERS
;
VERS: EQU 100 ;VERSION NUMBER (GETS FORMATTED X.XX)
MONTH: EQU 07 ;MONTH OF LAST REVISION
DAY: EQU 02 ;DAY OF MONTH
YEAR: EQU 83 ;YEAR
;
TRUE: EQU -1
FALSE: EQU NOT TRUE
;
; USER DEFINED EQUATES
;
STDCPM: EQU TRUE ;TRUE IF 100H LOAD
;
CLRSCR: EQU FALSE ;TRUE IF CLEAR SCREEN
;
; END USER DEFINED EQUATES
;
IF STDCPM
BASE: EQU 0000H ;STD CPM BASE
ENDIF
;
IF NOT STDCPM
BASE: EQU 4200H ;NON-STD BASE
ENDIF
;
; BDOS FUNCTIONS
;
BDOS: EQU 05 ;BDOS CALL
PSTR: EQU 09 ;PRINT BUFFER FUNCTION
GSTR: EQU 10 ;READ BUFFER FUNCTION
PRTR: EQU 05 ;PRINTER WRITE CHAR FUNCTION
CONIN: EQU 01 ;CONSOLE READ CHAR FUNCTION
;
; CLEAR SCREEN (AND HOME CURSOR) CHARACTER DEFINITIONS
;
; SOME TERMINAL TYPES CS1 CS2
; ------------------- --- ---
; OSBORNE 1AH 00H (NONE, SO USE NULL)
; HEATH/ZENITH 19/89 1BH 45H
;
;
IF CLRSCR ;CLEAR SCREEN
CS1: EQU 1BH ;LEADIN OR CLEAR SCREEN CHAR
CS2 EQU 45H ;CLEAR AND/OR HOME CURSOR CHAR OR NULL
ENDIF
;
IF NOT CLRSCR ;NO CLEAR SCREEN CAPABILITY
CS1: EQU 00H ;NULL
CS2: EQU 00H ;NULL
ENDIF
;
; ASCII DEFINITIONS
;
CR: EQU 0DH ;CARRIAGE RETURN
LF: EQU 0AH ;LINE FEED
ESC: EQU 1BH ;ESCAPE
BELL: EQU 07H ;CONSOLE BELL
;
; PROGRAM BEGINS HERE
;
ORG BASE+0100H ;ORGIN
;
START: CALL BEGIN ;GET UNDERWAY
MVI E,LF ;LINE FEED TO PRINTER
CALL PCHAR ;SEND IT
RESTOR: LHLD OLDSTK ;GET OLD STACK POINTER
SPHL ;PUT IT IN THE REGISTER
RET ;EXIT TO CP/M
;
; ASCII MESSAGES
;
SIGNON: DB CR,LF,LF,LF,'EPSON.COM v'
DB VERS/100+'0','.',VERS MOD 100/10+'0'
DB VERS MOD 10+'0',' as of '
DB MONTH/10+'0',MONTH MOD 10+'0','/'
DB DAY/10+'0',DAY MOD 10+'0','/'
DB YEAR/10+'0',YEAR MOD 10+'0'
DB CR,LF
DB '(Printer Setup program.)',CR,LF,LF
DB '* Get the PAPER READY first.',CR,LF
DB '* Then TURN ON the printer.',CR,LF,LF
DB '$'
;
HLPMSG: DB CR,LF,LF,LF,'H E L P',CR,LF
DB '-------',CR,LF,LF
DB 'This program will setup an EPSON printer until',CR,LF
DB 'you turn it off or select a new set of options.',CR,LF
DB 'The enlarged print option is not included since',CR,LF
DB 'it resets to normal size after each print line.',CR,LF
DB 'You can choose emphasized and then doublestrike',CR,LF
DB 'to provide for boldface type.',CR,LF,LF
DB '$'
;
SETUP: DB CR,LF,LF,LF,'M E N U - Epson Printer',CR,LF
DB '-----------------------',CR,LF,LF
DB '1. Select Typesize',CR,LF,LF
DB '2. Select Line Spacing',CR,LF,LF
DB '3. Select Paper Out Mode',CR,LF,LF
DB '4. Select International Chars',CR,LF,LF
DB '5. Help Information',CR,LF,LF
DB '6. Exit Program',CR,LF,LF
DB '$'
;
SLINSP: DB CR,LF,LF,LF,'L I N E S P A C I N G',CR,LF
DB '----------------------',CR,LF,LF
DB '1. 6 lpi (Default)',CR,LF,LF
DB '2. 8 lpi',CR,LF,LF
DB '3. Special Line Spacing.',CR,LF,LF
DB '$'
;
SPSPC: DB CR,LF,LF,LF,'L I N E S P A C I N G (Variable)',CR,LF
DB '---------------------------------',CR,LF,LF
DB 'You can set line spacing between',CR,LF,LF
DB '1/72 to 85/72 of an inch.',CR,LF,LF
DB 'Choose a number between 1 and 85,... ',CR,LF,LF,'$'
;
TSIZE: DB CR,LF,LF,LF,'T Y P E F A C E',CR,LF
DB '---------------',CR,LF,LF
DB '1. Emphasized Print (ON)',CR,LF
DB '2. Emphasized Print (OFF)',CR,LF,LF
DB '3. Condensed Print (ON)',CR,LF
DB '4. Condensed Print (OFF)',CR,LF,LF
DB '5. Double Strike (ON)',CR,LF
DB '6. Double Strike (OFF)',CR,LF,LF
DB '7. No Change, or enter RETURN',CR,LF,LF
DB '$'
;
PSEL: DB CR,LF,LF,LF,'P A P E R O U T',CR,LF
DB '----------------',CR,LF,LF
DB '1. Paper Out Detector. (ON)',CR,LF
DB '2. Paper Out Detector. (OFF)',CR,LF,LF
DB '$'
;
INTCHR: DB CR,LF,LF,LF,'C H A R A C T E R S E T',CR,LF
DB '------------------------',CR,LF,LF
DB '1. France',CR,LF,LF
DB '2. Germany',CR,LF,LF
DB '3. United Kingdom',CR,LF,LF
DB '4. Denmark',CR,LF,LF
DB '5. Sweden',CR,LF,LF
DB '6. Italy',CR,LF,LF
DB '7. Spain',CR,LF,LF
DB '0. USA (Default setting)',CR,LF,LF
DB '$'
;
CNTMSG: DB 'Press any key to continue.','$'
;
SELMSG: DB 'Enter your Selection,... ','$'
;
ERRMSG: DB CR,LF,LF,LF,'E R R O R',BELL,CR,LF
DB '---------',CR,LF,LF
DB 'Default of 6 lines/inch used.',CR,LF
DB 'Re-enter your selection.',CR,LF,LF
DB '$'
;
CLS: DB CS1
DB CS2
DB '$'
;
; SUBROUTINES BEGIN HERE
;
; SUBROUTINE "SAVSTK"
; SAVES CPM REGISTERS/STACK
; DEFINE SP
;
BEGIN: POP B ;SAVE STACK THEN FALL THRU TO TURNON
LXI H,0000 ;CLEAR HL
DAD SP ;GET STACK POINTER
SHLD OLDSTK ;SAVE SP
LXI H,STACK ;SET HL WITH ADDRESS OF SP
SPHL ;SET NEW STACK POINTER
PUSH B ;RETURN ADDRESS SET
;FALL THRU TO TURNON
;
; SUBROUTINE "TURNON" REMINDS
; YOU TO TURN ON THE PRINTER
;
TURNON: CALL CLEAR ;CLEAR SCREEN
LXI D,SIGNON ;POINT TO SIGNON MESSAGE
CALL PRINT ;DISPLAY IT
LXI D,CNTMSG ;POINT TO CONTINUE MESSAGE
CALL PRINT ;DISPLAY
CALL READ ;GET ANY KEYBOARD ENTRY TO CONTINUE
;FALL THRU TO MENU
;
; SUBROUTINE "MENU" THE MAIN
; SELECTION MENU. PROGRAM
; RETURNS TO THIS MENU AFTER
; SELECTING OPTION. EXIT GOES
; BACK TO CPM
;
MENU: CALL CLEAR ;CLEAR SCREEN
LXI D,SETUP ;POINT TO MENU MESSAGE
CALL PRINT ;DISPLAY IT
LXI D,SELMSG ;POINT TO SELECTION MESSAGE
CALL PRINT ;DISPLAY IT
CALL READ ;GET THE SELECTION
MVI B,36H ;LOAD THE NUMBER SIX
CMP B ;WAS IT SELECTION 6?
JZ EXIT ;EXIT TO CPM
DCR B ;DEC DOWN TO 5
CMP B
JZ HELP ;TO WRITE HELP INFORMATION
DCR B ;DEC DOWN TO 4
CMP B
JZ CHRSET ;CHARACTER SET FONT
DCR B ;DEC DOWN TO 3
CMP B
JZ PSMODE ;PAPER SELECTOR
DCR B ;DEC DOWN TO 2
CMP B
JZ LINESP ;LINE SPACING
DCR B ;DEC DOWN TO 1
CMP B
JZ TYPE ;TYPESIZE
JMP MENU ;INCORRECT NUMBER SELECTED?
EXIT: RET ;GET OUT
;
; SUBROUTINE "HELP" PRINTS
; INFORMATION ABOUT PROGRAM
;
HELP: CALL CLEAR ;CLEAR SCREEN
LXI D,HLPMSG ;POINT TO MESSAGE
CALL PRINT ;DISPLAY IT
LXI D,CNTMSG
CALL PRINT
CALL READ
JMP MENU ;BACK TO THE MENU
;
; SUBROUTINE "CHRSET" SELECTS
; ONE OF AN EIGHT POSSIBLE
; CHARACTER SETS U.S.A.,FRANCE,
; GERMANY,ETC.
;
CHRSET: CALL CLEAR
LXI D,INTCHR ;POINT TO MESSAGE
CALL PRINT
LXI D,SELMSG
CALL PRINT
CALL READ
CALL LEADIN ;SEND ESC TO PRINTER
MVI E,52H ;FOLLOWED BY 'R'
CALL PCHAR ;SEND TO PRINTER
SUI 30H ;CONVERT CONSOLE INPUT FOM ASCII TO BINARY
CMP B ;IS INPUT < 0 ?
JC INCORR ;IF YES INVALID
MVI B,08H
CMP B ;IS INPUT > 7 ?
JZ SKIP
JNC INCORR ;IF YES INVALID
SKIP: MOV E,A
CALL PCHAR ;"CHARACTER SET" TO PRINTER
JMP FIN
INCORR: MVI E,00H
CALL PCHAR ;DEFAULT SET IS USA
FIN: JMP MENU ;END OF CHARACTER SET!!
;
; SUBROUTINE "PSMODE" TURN
; THE PAPER END DETECTOR OFF
; OR ON. DEFAULT IS ON
;
PSMODE: CALL CLEAR
LXI D,PSEL
CALL PRINT
LXI D,SELMSG
CALL PRINT
CALL READ
CALL LEADIN
MVI B,32H
CMP B
JNZ SELECT
MVI E,38H
CALL PCHAR
JMP MENU
SELECT: MVI E,39H
CALL PCHAR
JMP MENU
;
; SUBROUTINE "TYPE" SETS THE
; TYPEFACE
;
TYPE: CALL CLEAR
LXI D,TSIZE
CALL PRINT
LXI D,SELMSG
CALL PRINT
CALL READ
MVI B,37H ;TEST THE SELECTION
CMP B
JZ MENU ;NO CHANGE
DCR B
CMP B
JZ DSOFF ;DOUBLESTRIKE OFF
DCR B
CMP B
JZ DSON ;DOUBLESTRIKE ON
DCR B
CMP B
JZ CNOFF ;CONDENSED PRINTING OFF
DCR B
CMP B
JZ CNON ;CONDENSED PRINTING ON
DCR B
CMP B
JZ EMOFF ;EMPHASIZED PRINTING OFF
DCR B
CMP B
JZ EMON ;EMPHASIZED PRINTING ON
JMP MENU ;TO MENU
DSOFF: CALL LEADIN
MVI E,48H ;DOUBLESTRIKE OFF
JMP PTR
DSON: CALL LEADIN
MVI E,47H ;DOUBLESTRIKE ON
JMP PTR
CNOFF: MVI E,12H ;^R CONDENSED OFF
JMP PTR
EMOFF: CALL LEADIN
MVI E,46H ;"F" EMPHASIZED OFF
JMP PTR
CNON: MVI E,0FH ;^O CONDENSED ON
JMP PTR
EMON: CALL LEADIN
MVI E,45H ;"E" EMPHASIZED ON
PTR: CALL PCHAR
NCHG: JMP MENU
;
; SUBROUTINE "LINESP" PROVIDES A
; CHOICE OF 1 - 85/72 OF AN INCH
; SPACING ON THE EPSON.
;
LINESP: CALL CLEAR
LXI D,SLINSP
CALL PRINT ;YOUR CHOICE LINE OF SPACING
LXI D,SELMSG
CALL PRINT
CALL READ
MVI B,32H
CMP B
JNZ SPSP
CALL LEADIN
MVI E,30H ;8 LINES/INCH
CALL PCHAR ;TO THE PRINTER
JMP MENU
SPSP: MVI B,33H
CMP B
JZ SPECL
DFL: CALL LEADIN
MVI E,31H
CALL PCHAR ;6 LINES/INCH (DEFAULT)
JMP MENU
SPECL: CALL CLEAR ;VARIABLE LINE SPACING
LXI D,SPSPC
CALL PRINT
LXI D,SELMSG
CALL PRINT
CALL LEADIN
MVI E,41H
CALL PCHAR ;SEND "A" TO PRINTER(ESC A)
LXI H,SPCNG ;ADDRESS OF CONSOLE BUFFER
MOV D,H ;PUT H & L IN
MOV E,L ;D & E REGISTERS
MVI M,02 ;MAXIMUM BUFFER LENGTH - 2
INX H ;POINT TO CHARACTER COUNT BYTE
MVI M,00 ;ZERO CHARCTER COUNT
CHRSTR: MVI C,GSTR ;CONSOLE BUFFER READ ROUTINE
CALL BDOS ;BDOS SERVICE CALL
CKCHR: LXI H,SPCNG+1 ;THIS ROUTINE CHECKS INPUT IS IT 1 TO 85?
MOV A,M ;CHARACTER COUNTER
CPI 02H ;TWO CHARACTERS?
INX H
INX H ;POINT TO UNITS DIGIT
JZ CTES ;IF YES PROCESS TWO DIGITS
CPI 1 ;ONE CHARACTER?
JZ SHIFT ;IF YES SHIFT TENS TO UNIT POSITION
JMP DEF ;IF 0 SET DEFAULT
CTES: MOV A,M ;PUT UNITS DIGIT IN A
CALL TEST ;TEST IF IT IS IN THE RANGE 0 TO 9
TENS: DCX H ;POINT TO TENS DIGIT
MOV A,M
CALL BLANK
CALL TEST ;TEST FOR 0 TO 9
CONV: MOV A,M ;CONVERTS TENS INPUT TO HEX
ADD A ;2
ADD A ;4
ADD M ;5
ADD A ;10
INX H ;POINTS TO UNITS
ADD M ;CONVERSION COMPLETE
CPI 0 ;IS IT 0
JZ DEF
CPI 86 ;IS IT >85
JNC DEF
MOV E,A
CALL PCHAR ;SEND SPACING TO PRINTER
JMP MENU ;DONE!
;
BLANK: CPI 20H ;IS IT BLANK?
RNZ
MVI A,30H ;YES PUT AN ASCII 0 IN A
MOV M,A ;STORE IT
RET
;
TEST: SUI 30H ;TEST FOR DIGIT
JC DEF ;<0
CPI LF
JNC DEF ;>9
MOV M,A ;STORE DIGIT
RET
SHIFT: DCX H ;POINT TO TENS DIGIT
MOV A,M ;MOVE IT TO ACCUMULATOR
MVI M,30H ;STORE ASCII 0 IN TENS
INX H ;POINT TO UNITS DIGIT
MOV M,A ;PUT TENS IN UNIT PLACE
JMP CTES
DEF: POP D
DEFLT: MVI E,0CH
CALL PCHAR ;SEND 12/72 TO PRINTER 6 LINES/INCH
CALL CLEAR
LXI D,ERRMSG
CALL PRINT
LXI D,CNTMSG
CALL PRINT
CALL READ
JMP MENU
;
; SUBROUTINE "PRINT" A STRING
; ON THE CONSOLE. STRING MUST
; END WITH A $ SIGN
;
CLEAR: LXI D,CLS ;CLEAR SCREEN FALL THRU TO PRINT
PRINT: PUSH H ;PRESERVE REGISTERS
PUSH D
PUSH B
PUSH PSW
MVI C,PSTR
CALL BDOS
POP PSW
POP B
POP D
POP H
RET
;
; SUBROUTINE "READ" CHARACTER
; FROM THE CONSOLE
;
READ: EQU $ ;REGISTERS NOT SAVED
MVI C,CONIN
CALL BDOS ;STORES THE CHARACTER IN A
RET
;
; SUBROUTINE "PCHAR" LISTS A
; CHARACTER ON THE PRINTER
;
LEADIN: MVI E,ESC ;FALL THRU TO PCHAR AND SEND ESC
PCHAR: PUSH PSW
MVI C,PRTR
CALL BDOS
POP PSW
RET
;
; BUFFER STORAGE AND STACK
;
SPCNG: DS 4 ;STORES LINE SPACING
OLDSTK: DS 2
DS 60
STACK: EQU $
;
END
;