;************************************
;* *
;* QUICK TYPE II *
;* VERSION (see below) *
;* A TYPEWRITER UTILITY *
;* BY ROGER GAGNON 04/01/85 *
;* LANSING TECHNICAL DOWNLOAD *
;* (517) 694-8650 (RB) *
;* *
;************************************
;
PREFIX EQU '1' ;major version number
SUFFIX EQU '1' ;minor revision number
;
; v 1.1 4/18/84 Added NEC-8023A codes and slightly
; modified some comments to make it easier for other
; adaptations. Changed max line length from 80 to 136
; to allow smaller type sizes to be used to their full
; extent. Robert J. Sandel
;
;
; THIS PROGRAM ENABLES THE CONSOLE TO OPERATE AS A DIRECT
; OUTPUT TYPEWRITER. LINES CAN BE EDITED BEFORE PRINTING.
; PRINTER SETUP CODES CAN ALSO BE PASSED BY SIMPLY TYPING
; THE CONTROL KEYS AT THE KEYBOARD AND PRESSING RETURN. A
; HANDY UTILITY FOR NOTES, ENVELOPES, AND LABELS.
;
ORG 100H
JMP PROGRAM
;
; **** GENERAL EQUATES ****
;
maxbuf equ 136 ;was originally 80
BDOS EQU 05H ;STANDARD CALL TO OPERATING SYSTEM
INSTR EQU 0AH ;READ CONSOLE BUFFER
OUTSTR EQU 09H ;PRINT STRING
OUTCHR EQU 02H ;CONSOLE OUTPUT
CR EQU 0DH ;ASCII CODE FOR CR
LF EQU 0AH ;ASCII CODE FOR LF
TRUE EQU 01H ;VALUE FOR TRUE
FALSE EQU 00H ;VALUE FOR FALSE
TEMP DS 1 ;TEMPORARY STORAGE SPACE
;
; **** PRINTER TAB INITIALIZATION ****
;
; THE FOLLOWING EQUATES SELECT ANY NECESSARY PRINTER TAB CODES
; AND SCREEN MESSAGES. SOME PRINTERS DON'T REQUIRE ANY SPECIAL
; CODES. SET PRINTER TO TRUE THEN SET SELECTED PRINTER TO TRUE.
; ALSO SET THE POINTER TO THE CORRECT PRINTER MESSAGE IN THE
; 'DISPLAY CODES' SECTION.
;
PRINTER EQU TRUE ;SET TO TRUE IF A PRINTER IS SELECTED
PROWRTR EQU FALSE ;SET TO TRUE FOR C.ITOH PRINTERS
NEC8023 EQU TRUE ;SET TO TRUE FOR NEC-8023A PRINTER
GEMINI EQU FALSE ;SET TO TRUE FOR GEMINI 10X PRINTERS
;
; **** MAIN PROGRAM ****
;
PROGRAM CALL CRLF ;PRINT CARRIAGE RETURN & LINEFEED
MVI C,OUTSTR ;PUT FUNCTION # IN C REG
LXI D,MSG1 ;POINTER TO MESSAGE
CALL BDOS ;PRINT IT!
CALL CRLF ;PRINT A BLANK LINE ON CONSOLE
;
; **** ROUTINE TO INSTALL PRINTER TAB CODES ****
;
IF PRINTER
;
LXI H,INITSTR+2 ;SET UP HL PAIR AND B
LDA INITSTR+1 ;GET LENGTH OF SET UP STRING
MOV B,A ;GOES IN B
OVER MVI C,05H ;SEND CHARACTER TO PRINTER
MOV E,M ;GET CHARACTER FROM BUFFER
INX H ;INCREMENT POINTER
PUSH H ;SAVE H REGISTER
PUSH B ;SAVE B REG.
CALL BDOS ;DO IT!
POP B ;RESTORE B
POP H ;RESTORE H
DCR B ;CHECK IF DONE. DECREMENT COUNT
JNZ OVER ;NOT DONE, GET ANOTHER CHARACTER
JMP GETCHR ;GET ON WITH THE PROGRAM
;
ENDIF
;
;
IF PROWRTR
;
INITSTR DB 42,39,27,40,48,48,56,',',48,49,54,',',48,50,52,','
DB 48,51,50,',',48,52,48,',',48,52,56,',',48,53,54,','
DB 48,54,52,',',48,55,50,'.',CR
;
ENDIF
;
;
IF NEC8023
;
INITSTR DB INEND-$-1 ;max number of bytes in string
DB INEND-$ ;actual number of bytes
DB 11H ;select code
DB 1BH,5BH,1BH,'E' ;incremental and Elite
;:::Tab settings below:::
DB 27,40, 48,48,56,',',48,49,54,',',48,50,52,','
DB 48,51,50,',',48,52,48,',',48,52,56,',',48,53,54,','
DB 48,54,52,',',48,55,50,',',48,56,48,',',48,56,56,','
DB 48,57,54,',',49,48,52,',',49,49,50,',',49,50,48,','
DB 49,50,56,'.'
INEND DB CR
;
ENDIF
;
IF GEMINI
;
INITSTR DB 0,0,0,0,0,0 ;ECT........
;
ENDIF
;
; **** INPUT AND RESPONSE LOOP ****
;
GETCHR MVI A,maxbuf ;SET MAX BUFFER LENGTH TO xx COLUMNS
STA INBUF ;STICK IT IN BUFFER
MVI A,CR ;SEED BUFFER WITH A CARRIAGE RETURN
STA INBUF+2
MVI A,00H ;INITIALIZE STORAGE AREA
STA TEMP
MVI C,INSTR ;CALL READ CONSOLE BUFFER
LXI D,INBUF ;BUFFER ADDRESS
CALL BDOS
;
; **** CHECK IF INPUT IS A SPECIAL COMMAND CODE ****
;
LXI H,INBUF+2 ;GET THE INPUT CHARACTER ADDRESS
MOV A,M ;MOVE IT INTO A REG
CPI 0DH ;IS IT A CARRIAGE RETURN?
JZ NEWLINE ;DO A LINEFEED
CPI 3FH ;IS IT A QUESTION MARK?
JZ HELP ;PRINT HELP MESSAGE
CPI 19H ;IS IT FOR CLEAR SCREEN?
JZ CLRSCRN ;CLEAR THE SCREEN
CPI 01H ;IS IT FOR RULER LINE?
JZ RULER ;PRINT RULER
;
IF PRINTER
;
CPI 1AH ;IS IT FOR PRINTER CODES DISPLAY?
JZ CODES ;DISPLAY PRINTER CODES
;
ENDIF
;
CPI 09H ;IS IT A TAB CHARACTER?
JZ TYPE ;PROCEEDE TO PRINT IF SO
MVI B,1FH ;IS INPUT A PRINTER CODE?
ORA B ;MASK FOR CONTROL CODES
CPI 1FH
JNZ TYPE ;SKIP IF NOT
MVI A,01H ;OTHERWISE STORE YES INTO TEMP
STA TEMP
;
; **** SEND INPUT STRING TO PRINTER ****
;
TYPE LXI H,INBUF+2 ;SET UP HL PAIR AND B
LDA INBUF+1 ;NUMBER OF CHARACTERS TYPED
CPI 00H ;ANYTHING TYPED?
JZ NEWLINE ;IF NOT, DO A LINEFEED
MOV B,A ;GOES IN B
AGAIN MVI C,05H ;SEND CHARACTER TO PRINTER
MOV E,M ;GET CHARACTER FROM BUFFER
INX H ;INCREMENT POINTER
PUSH H ;SAVE H REGISTER
PUSH B ;SAVE B REG.
CALL BDOS ;DO IT!
POP B ;RESTORE B
POP H ;RESTORE H
DCR B ;CHECK IF DONE. DECREMENT COUNT
JNZ AGAIN ;NOT DONE, GET ANOTHER CHARACTER
LDA TEMP ;WAS IT A PRINTER SETUP STRING?
CPI 01H ;COMPARE TO YES
JZ ERALINE ;ERASE INPUT LINE
NEWLINE MVI C,5 ;DONE. TYPE LINEFEED
MVI E,LF
CALL BDOS
;
IF NEC8023
MVI C,5 ;TYPE CARRIAGE RETURN
MVI E,CR ;NEC PRINT COMMAND &
CALL BDOS ;CARRIAGE RETURN
ENDIF
;
CALL CRLF ;PRINT CR, LF ON CONSOLE
JMP GETCHR ;GO ANOTHER ROUND
;
; **** PRINT CHARACTERS TO CONSOLE ****
;
PUTCHR MVI C,OUTCHR ;BDOS FUNCTION #2
MOV E,A ;MOVE CHAR. TO E REG
CALL BDOS ;PRINT IT
RET
;
; **** CARRIAGE RETURN AND LINEFEED TO CONSOLE ****
;
CRLF MVI A,CR
CALL PUTCHR
MVI A,LF
CALL PUTCHR
RET
;
; **** DISPLAY HELP MESSAGE ****
;
HELP MVI C,OUTSTR ;PUT FUNCTION # IN C REG
LXI D,MSG2 ;POINTER TO HELP MESSAGE
CALL BDOS ;PRINT IT!
CALL CRLF ;PRINT A BLANK LINE ON CONSOLE
JMP GETCHR ;BACK TO INPUT LOOP
;
; **** DISPLAY PRINTER CODES ****
;
IF PRINTER
;
CODES MVI C,OUTSTR ;PUT FUNCTION # IN C REG
LXI D,PWRT ;**** SET TO CORRECT PRINTER MESSAGE ****
CALL BDOS ;PRINT IT!
JMP GETCHR ;BACK TO INPUT LOOP
;
ENDIF
;
; **** DISPLAY RULER LINE ON CONSOLE ****
;
RULER MVI C,OUTSTR ;PUT FUNCTION # IN C REG
LXI D,MSG5 ;POINTER TO RULER
CALL BDOS ;PRINT IT!
JMP GETCHR ;BACK TO INPUT LOOP
;
; **** PRINT A BLANK LINE ON CONSOLE ****
;
ERALINE MVI C,OUTSTR ;PUT FUNCTION # IN C REG
LXI D,MSG6 ;POINTER TO BLANK LINE
CALL BDOS ;DO IT!
JMP GETCHR ;BACK TO DOIN' IT
;
; **** CLEAR SCREEN SEQUENCE ****
;
CLRSCRN MVI C,OUTSTR ;PUT FUNCTION # IN C REG
LXI D,MSG3 ;POINTER TO CLEAR SCREEN
CALL BDOS ;DO IT!
JMP GETCHR ;BACK TO DOIN' IT
;
; **** MESSAGES ****
;
; SIGN ON MESSAGE
;
MSG1 DB 'Quick Type II Version ',prefix,'.',suffix,CR,LF
DB 'Use CTL-C to exit, ? for HELP',CR,LF
DB '$'
;
; HELP MESSAGE
;
MSG2 DB CR,LF,LF,LF,LF,LF
DB ' Quick Type II',CR,LF
DB ' Version ',prefix,'.',suffix
DB CR,LF,LF,LF
DB ' This program allows the use of the console',CR,LF
DB 'as a direct output typewriter. Lines are typed',CR,LF
DB 'after each <RETURN>. Input line length is 136',CR,LF
DB 'characters maximum.',CR,LF
DB LF,LF
DB 'Command Keys:'
DB CR,LF,LF
DB ' Ctrl - A Display ruler line',CR,LF
DB ' Ctrl - C Exit to CP/M',CR,LF
DB ' Ctrl - H <BS> Backspace one character',CR,LF
DB ' Ctrl - I <TAB> Tab 8 spaces',CR,LF
DB ' Ctrl - X Erase line and start over',CR,LF
DB ' Ctrl - Y Clear screen',CR,LF
;
IF PRINTER
;
DB ' Ctrl - Z Display printer setup codes',CR,LF
;
ENDIF
;
DB ' ? Display this help',CR,LF,LF,LF
DB '$'
;
MSG3 DB LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF
DB LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF ;good for 25 l.
DB '$'
;
; RULER LINE DISPLAY
;
MSG5 DB ' ------^-1-----^---2---^-----3-^-------^'
DB '-------^-5-----^---6---^-----7-^-------^'
DB '-------^-9-----^---A---^-----B-^-------^-------^-D------'
DB CR,LF
DB '$'
;
; BLANK LINE
;
MSG6 DB CR,' ',CR,'$'
;
; PROWRITER CONTROL CODE DISPLAY MESSAGE
;
IF PROWRTR
;
PWRT DB 'Prowriter control codes: '
DB ' - Quick Type II - vers. ',prefix,'.',suffix
DB CR,LF,LF
DB ' ESC - N Pica (10 / inch)',CR,LF
DB ' ESC - E Elite (12 / inch)',CR,LF
DB ' ESC - p Pica Proportional',CR,LF
DB ' ESC - P Elite Proportional',CR,LF
DB ' ESC - n Extended (9 / inch)',CR,LF
DB ' ESC - q Condensed (15 / inch)',CR,LF
DB ' ESC - Q Ultracondensed (17 / inch)',CR,LF,LF
DB ' CTL - N Headline on '
DB ' ESC - > Left to right printing',CR,LF
DB ' CTL - O Headline off '
DB ' ESC - < Bidirectional printing',CR,LF,LF
DB ' ESC - ! Boldface on '
DB ' ESC - f Forward linefeed',CR,LF
DB ' ESC - " Boldface off '
DB ' ESC - r Reverse linefeed',CR,LF,LF
DB ' ESC - X Underline on '
DB ' ESC - A 6 Lines / inch',CR,LF
DB ' ESC - Y Underline off '
DB ' ESC - B 8 Lines / inch',CR,LF
DB ' '
DB ' ESC - Tnn (distance = nn/144 inch)',CR,LF
DB ' ESC - D Slashed Zeros',CR,LF
DB ' ESC - Z Unslashed Zeros '
DB ' CTL - L Form Feed',CR,LF,LF
DB '$'
;
ENDIF
;
; NEC-8023A CONTROL CODE DISPLAY MESSAGE
;
IF NEC8023
;
PWRT DB CR,LF,LF,LF
DB 'NEC 8023A control codes: '
DB ' - Quick Type II - vers. ',prefix,'.',suffix
DB CR,LF,LF
DB ' ESC - N Pica (10 / inch)',CR,LF
DB ' ESC - E Elite (12 / inch)',CR,LF
DB ' ESC - P Elite Proportional',CR,LF
DB ' ESC - Q Ultracondensed (17 / inch)',CR,LF,LF
DB ' CTL - N Headline on '
DB ' ESC - Lnnn Left Margin Offset ',CR,LF
DB ' CTL - O Headline off '
DB ' ESC - 2 Clear(kill) all TABS',CR,LF,LF
DB ' ESC - ! Boldface on '
DB ' ESC - f Forward linefeed',CR,LF
DB ' ESC - " Boldface off '
DB ' ESC - r Reverse linefeed',CR,LF,LF
DB ' ESC - X Underline on '
DB ' ESC - A 6 Lines / inch',CR,LF
DB ' ESC - Y Underline off '
DB ' ESC - B 8 Lines / inch',CR,LF
DB ' '
DB ' ESC - Tnn (distance = nn/144 inch)',CR,LF
DB ' CTL - L Form Feed',CR,LF,LF
DB '$'
;
ENDIF
IF GEMINI
;
GEMINI DB 'Gemini control codes: '
DB ' - Quick Type II - vers. ',prefix,'.',suffix
DB CR,LF,LF
DB ' - Pica (10 / inch)',CR,LF
DB ' - Elite (12 / inch)',CR,LF
DB ' - Pica Proportional',CR,LF
DB ' - Elite Proportional',CR,LF
DB ' - Extended (9 / inch)',CR,LF
DB ' - Condensed (15 / inch)',CR,LF
DB ' - Ultracondensed (17 / inch)',CR,LF,LF
DB ' - Headline on '
DB ' - Left to right printing',CR,LF
DB ' - Headline off '
DB ' - Bidirectional printing',CR,LF,LF
DB ' - Boldface on '
DB ' - Forward linefeed',CR,LF
DB ' - Boldface off '
DB ' - Reverse linefeed',CR,LF,LF
DB ' - Underline on '
DB ' - 6 Lines / inch',CR,LF
DB ' - Underline off '
DB ' - 8 Lines / inch',CR,LF
DB ' '
DB ' - (distance = nn/144 inch)',CR,LF
DB ' - Slashed Zeros',CR,LF
DB ' - Unslashed Zeros '
DB ' - Form Feed',CR,LF,LF
DB '$'
;
ENDIF
;
INBUF DS 1 ;CONSOLE BUFFER STORAGE
;
END