;----------------------------------------------------------------- ; ; 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 ;