Home of the original IBM PC emulator for browsers.
[PCjs Machine "ibm5170"]
Waiting for machine "ibm5170" to load....
The printer utilities in this package are for Epson and compatible
printers. Control your printer from the keyboard. Specify a variety
of print modes and fonts such as compressed, italics, emphasized,
underline, and more -- from within other applications.
SP is a print spooler used to hold data intended for the printer.
It works like the buffers that can be installed in the printer but the
data is stored in RAM storage instead of in the printer. The buffer
is unloaded to the printer at the printer's speed while DOS proceeds
at its speed. You can specify the the size of the buffer from 1k to
62K, the number of copies desired, and also which printer port you want
to use.
PC-SIG Disk No. #186, version v1
The following is a list of the file checksums which should be produced by
the CRCK4 program on disk #9 (and others). If the CRC numbers do not match
you may have a bad file. To use type: CRCK4 <filespec>
CRCK4 output for this disk:
CRCK ver 4.2B (MS DOS VERSION )
CTL-S pauses, CTL-C aborts
--> FILE: COMPRSOF.COM CRC = 00 00
--> FILE: COMPRSON.COM CRC = 00 00
--> FILE: CREATOR .BAS CRC = 91 5C
--> FILE: DBLHITOF.COM CRC = 00 00
--> FILE: DBLHITON.COM CRC = 00 00
--> FILE: DBLWDEOF.COM CRC = 00 00
--> FILE: DBLWDEON.COM CRC = 00 00
--> FILE: EMPHASOF.COM CRC = 00 00
--> FILE: EMPHASON.COM CRC = 00 00
--> FILE: EPSONCHR.ASM CRC = D6 5D
--> FILE: EPSONCHR.DOC CRC = 57 42
--> FILE: EPSONCHR.EXE CRC = E9 AD
--> FILE: ITALICOF.COM CRC = 00 00
--> FILE: ITALICON.COM CRC = 00 00
--> FILE: KYBD .BAS CRC = 43 48
--> FILE: PRINT20 .DOC CRC = 70 3F
--> FILE: PRINTSET. CRC = 00 00
--> FILE: PRINTSET.DOC CRC = 3F 31
--> FILE: PRTSCFX .COM CRC = F7 6F
--> FILE: PRTSCFX .DOC CRC = CB 01
--> FILE: RESET .COM CRC = 00 00
--> FILE: SET-PRTR.C CRC = AD E8
--> FILE: SET-PRTR.EXE CRC = EE 91
--> FILE: SET51LNS.COM CRC = 00 00
--> FILE: SETCW132.COM CRC = 00 00
--> FILE: SETPRF19.COM CRC = 00 00
--> FILE: SKP6PERF.COM CRC = 00 00
--> FILE: SKP8PERF.COM CRC = 00 00
--> FILE: SP .DOC CRC = 3C E2
--> FILE: SP .EXE CRC = DF C7
--> FILE: SPC .EXE CRC = 2E 9F
--> FILE: TOPOFORM.COM CRC = 00 00
--> FILE: UNDERLOF.COM CRC = 00 00
--> FILE: UNDERLON.COM CRC = 00 00
--> FILE: NOCOLOR .COM CRC = BA 68
--> FILE: NOCOLOR .DOC CRC = AD 2A
--> FILE: SCRLKY .ASM CRC = F8 56
--> FILE: SCRLKY .COM CRC = 7D EF
--> FILE: SCROLLK .COM CRC = 7D EF
--> FILE: SCROLLK .DOC CRC = 6D 5C
--> FILE: XXX . CRC = B5 9B
---------------------> SUM OF CRCS = C4 4E
DONE
These and other Public Domain and user-supported programs from:
PC Software Interest Group
1125 Stewart Ct Suite G
Sunnyvale, CA 94086
(408) 730-9291
10 ON KEY(1) GOSUB 510
20 KEY (1) ON
30 'Program to display dot matrix characters from ROM patterns.
40 'Will Fastie --19 Nov 81. Typed in 6 Feb 82 from Creative Computing
50 ' VOL.8 NO. 3 (MARCH 82) BY R. HILL
60 'Modified to write over whole screen 2/13/82, by R. Hill.
70 'Modified to save screen image by pressing F1. 11/18/83, by M. Seidel
80 DEFINT A-Z
90 GOSUB 480
100 DEF SEG=&HF000
110 BASEADR=&HFA6E
120 BYTESPERCHAR=8
130 KEY OFF
140 REM ADD IN COLOR STATEMENT
150 CLS
160 X=1:Y=1
170 REM ADD IN MESSAGE FOR LINE 25
180 CHAR$=INKEY$: IF CHAR$="" THEN 180
190 CODE=ASC(CHAR$)
200 IF CODE >= 128 THEN BEEP: GOTO 140
210 ADR = BASEADR+(CODE*BYTESPERCHAR)
220 DOTCHAR=CODE
230 'Change "DOTSIZE" to get different width characters.
240 DOTSIZE=1
250 DOT$=STRING$(DOTSIZE,DOTCHAR)
260 GOSUB 360
270 Y=Y+8*DOTSIZE
280 IF Y<SCREENWIDTH GOTO 180
290 IF X=17 GOTO 330
300 X=X+8
310 Y=1
320 GOTO 180
330 Y=1:CHAR$=INKEY$:IF CHAR$="" THEN 330
340 PRINT"":PRINT"":PRINT"":PRINT"":PRINT"":PRINT"":PRINT"":PRINT"":PRINT""
350 GOTO 190
360 FOR ROW=1 TO 8
370 ROWVAL=PEEK(ADR+(ROW-1))
380 FOR COL=1 TO 8
390 COLMASK=2^(7-(COL-1))
400 IF (ROWVAL AND COLMASK) <> 0 THEN GOSUB 440
410 NEXT COL
420 NEXT ROW
430 RETURN
440 'Locate to bit position and display giant pixel!
450 LOCATE X+(ROW-1),Y+(COL-1)*DOTSIZE
460 PRINT LEFT$(DOT$,DOTSIZE);
470 RETURN
480 'Initialize display
490 SCREENWIDTH=80
500 RETURN
510 DEF SEG=&HB800
520 IF SSS=0 THEN BSAVE"PICTURE",0,&H4000
530 IF SSS=1 THEN BSAVE"PICTURE1",0,&H4000
540 IF SSS=2 THEN BSAVE"PICTURE2",0,&H4000
550 IF SSS=3 THEN BSAVE"PICTURE3",0,&H4000
560 IF SSS=4 THEN BSAVE"PICTURE4",0,&H4000
570 IF SSS=5 THEN BSAVE"PICTURE5",0,&H4000
580 IF SSS=6 THEN BSAVE"PICTURE6",0,&H4000
590 IF SSS=7 THEN BSAVE"PICTURE7",0,&H4000
600 IF SSS=8 THEN BSAVE"PICTURE8",0,&H4000
610 IF SSS=9 THEN BSAVE"PICTURE9",0,&H4000
620 IF SSS=10 THEN BSAVE"PICTUREA",0,&H4000
630 IF SSS=11 THEN BSAVE"PICTUREB",0,&H4000
640 IF SSS=12 THEN BSAVE"PICTUREC",0,&H4000
650 IF SSS=13 THEN BSAVE"PICTURED",0,&H4000
660 IF SSS=14 THEN BSAVE"PICTUREE",0,&H4000
670 IF SSS=15 THEN BSAVE"PICTUREF",0,&H4000
680 IF SSS=16 THEN BSAVE"PICTUREG",0,&H4000
690 IF SSS=17 THEN BSAVE"PICTUREH",0,&H4000
700 IF SSS=18 THEN BSAVE"PICTUREI",0,&H4000
710 IF SSS=19 THEN BSAVE"PICTUREJ",0,&H4000
720 IF SSS=20 THEN BSAVE"PICTUREK",0,&H4000:END
730 SSS=SSS+1
740 RETURN
PAGE
PAGE 60,132
TITLE PR256 - IBM CHAR SET FOR MX100
;******************************************************************************
;
; PR256...Copyright Tim Field, 1982 (BYTE March 1983)
;
; IBM CHARACTER SET - This program resides on the IBM
; personal computer. All 256 characters used by the IBM will
; be available to be printed out using the MX1000 or MX80 with
; graphics option. The non-standard characters are printed
; automatically by any process or program executing the IBM
; interrupt #17H (normal print routine in BIOS).
;
;******************************************************************************
;******************************************************************************
;
; DEFINE THE CONSTANTS USED BY PROGRAM
;
;******************************************************************************
INTADDR EQU 017H * 4 ; Address to interrupt vector addr
NEWINT EQU 027H ; DOS interrupt code for "End but stay resident"
ESC_CHAR EQU 1BH ; ASCII escape character
NUL EQU 0 ; ASCII NUL character
;
; Define mask bytes used to turn on and off SYS_MODE for each printer
;
MASK$BIT_GRAF EQU 11111110B ; Printer in bit-graphics mode
MASK$SEC_BITG EQU 11111101B ; Next character is 2nd graf char count
MASK$FST_BITG EQU 11111011B ; Next character is 1st graf char count
MASK$NEW_INTL EQU 11110111B ; Next char international char defn
MASK$ESC_SING EQU 11101111B ; Expect one more control character
MASK$ESC_NULL EQU 11011111B ; Expect control chars until NUL found
MASK$ESC_C EQU 10111111B ; One more control char if non-zero, else 2 more
MASK$PREV_ESC EQU 01111111B ; Next char is escape defn char
;
; Define structure used to hold each of the three (possibly existing)
; printers.
;
PRINTERS STRUC
SYS_MODE DB 0 ; Stores bits pertaining to current printer code
GRAF_CNT DW 0 ; 16 bit count of graphics chars...for bit-graf mode
FULL_INSTR DB 0 ; <0 : CR/LF mode, >0 : No control codes, = 0 : normal
GRAF_PRINTER DB 0 ; =0; Printer has EPSON graphics, >0; no
INTLSET DB 0 ; 0-7 value of current international set for Epson
PRINTERS ENDS
;*******************************************************************************
;
; Define a temporary stack. Required for initialization of program only ...
;
;*******************************************************************************
STACK SEGMENT PARA STACK
DB 10 DUP ('STACK ')
STACK ENDS
page
;********************
;
; Start code area!!
;
;********************
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,SS:STACK,ES:NOTHING
PR256 PROC FAR
;
; Initialization code...used only once, on system startup
;
CALL INIT_CODE ; Call initialization routine
RET ; Return from initialization
;******************************************************************************
;
; Define storage area here
;
;******************************************************************************
DWORD_ADDR DW 0,0 ; Save address to BIOS print routine here
TMPBYTE DB 9 ; A multiplicand
PR1 PRINTERS <> ; Set aside area for three printers
PR2 PRINTERS <>
PR3 PRINTERS <>
;******************************************************************************
;
; Start of actual print runtime code
;
;******************************************************************************
START_UP: ; Start of actual print routine
PUSH DS ; Save segment register
PUSH SI ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH AX ;
MOV BX,CS ;
MOV DS,BX ;
CMP AH,0 ; Is this to print out a char?
JE PCHAR ; Br if yes
CALL PR2BYTE ; Otherwise, just print char
JMP DONE ; and exit
PCHAR:
MOV BX,OFFSET PR1 ; Now get offset to printer structure
CMP DL,0 ; DX contains 0,1,2 for printer number
JE T1 ; Br if printer 0
ADD BX,5 ; Move to next printer area
CMP DL,1 ; Is it printer 1?
JE T1 ; Br if yes
ADD BX,5 ; Offset to printer 2 structure
T1:
CMP GRAF_PRINTER[BX],0 ; Are we talking to a printer with Epson graphics?
JNE MORE$TO$COME ; Send out char if not graphics printer
MOV CH,SYS_MODE[bx] ; Get system mode bits
RCR CH,1 ; BIT_GRAP_MODE?
JNC NOT$BIT$MODE ; Branch if not
;
; We are in bit-graphics mode... decrement mode count and send character
; as is to printer.
;
DEC GRAF_CNT[BX] ; Decrement count of graphics chars left
JNZ MORE$TO$COME ; Are we done with graphics mode?
AND SYS_MODE[BX],MASK$BIT_GRAF ; If yes, clear bit to indicate
page
MORE$TO$COME:
JMP SHORT SENDCHAR ; Send bit-graf mode character
NOT$BIT$MODE:
CMP FULL_INSTR[BX],1 ; Are we "Full Instr Set" mode?
JE TO$CHKCHAR ; Br if yes... no "control char" check
JL NORM_MODE ; Br if in normal mode
;
; If we reach here, we are in CR/LF mode. The only "printer action"
; codes expected in this mode are CR (ASCII 13) and LF (ASCII 10).
; All other ASCII values are interpreted as characters to print.
;
CMP AL,13 ; Is Carriage Return character?
JE SENDCHAR ; Send to printer if yes
CMP AL,10 ; Is Line Feed char?
JE SENDCHAR ; Send to printer if yes
TO$CHKCHAR:
JMP CHKCHAR ; else print character from character set
NORM_MODE:
RCR CH,1 ; SEG_BITG_CNT?
JNC NOT$SEC ; Br if no
;
; If we reach here, the current character is the second count value for
; the bit-graphics mode. It is the high-order byte and must be added
; to the low oder byte which was the previous character.
;
MOV (FULL_INSTR-1)[BX],AL ; Save Graf Cnt
AND SYS_MODE[BX],MASK$SEC_BITG ; Turn off SEC_BITG_CNT bit
CMP GRAF_CNT[BX],0 ; Is count equal zero?
JLE SENDCHAR ; If yes, don't set Bit-graf mode
OR SYS_MODE[BX],NOT MASK$BIT_GRAF; Indicate in Bit-graph mode
JMP SHORT SENDCHAR ; Send out count character
page
NOT$SEC:
RCR CH,1 ; FST_BITG_CNT?
JNC NOT$FST ; Br if not
;
; If this bit is set, it indicates that the last character printed out
; was "Start Bit Graphics mode" indication. The current character is
; to be used as the low order byte of the count of bit-graphics characters
; to be sent. The next character expected is the high-order byte for the
; count.
;
AND SYS_MODE[BX],MASK$FST_BITG ; Turn off FST_BITG_CNT bit
OR SYS_MODE[BX],NOT MASK$SEC_BITG ; Turn on SEC_BITG_CNT bit
MOV GRAF_CNT[BX],AX ; Save low order count
JMP SHORT SENDCHAR ; Send count to printer
NOT$FST:
RCR CH,1 ; NEW_INTL?
JNC NOT$INTL ; Br if not
;
; If this bit is set, it indicates that we previously saw request for a
; new "International" character set to be used. The current bute is
; expected to be a value from 0 to 7 indicating the set to be used. If
; an error is found, no set charge is accomplished.
;
CMP AL,0 ; Is current char less than 0?
JL NOT$VALID ; Br if yes
CMP AL,7 ; Is it greater than 7?
JG NOT$VALID ; Br if yes
;
; If reach here, have valid set...update in memory
;
MOV INTLSET[BX],AL
NOT$VALID:
AND SYS_MODE[BX],MASK$NEW_INTL ; Clear NEW_INTL bit
JMP SHORT SENDCHAR ; Send out value to printer
NOT$INTL:
RCR CH,1 ; ESC_SINGLE mode?
JNC NOT$ESC_NULL ; Br if not
AND SYS_MODE[BX],MASK$ESC_SING ; Turn off ESC_SINGLE mode
JMP SHORT SENDCHAR ; Send char to printer
NOT$ESC_SING:
RCR CH,1 ; ESC_NULL mode?
JNC NOT$ESC_NULL ; Br if not
CMP AL,NUL ; Is this a NUL character?
JNE SENDCHAR ; If not, print out character
AND SYS_MODE[BX],MASK$ESC_NULL ; Otherwise, turn off ESC_NULL mode 1st
JMP SHORT SENDCHAR ;
NOT$ESC_NULL:
RCR CH,1 ; ESC_NULL mode?
JNC NOT$ESC_C ; Br if not
CMP AL,NUL ; Is character NUL?
JNE NOT$NUL ; Skip next if not
OR SYS_MODE[BX],NOT MASK$ESC_SING ; Expect one more control char
NOT$NUL:
AND SYS_MODE[BX],MASK$ESC_C ; Turn off ESC_C mode
SENDCHAR: ; Print out current character and return
CALL PRBYTE ; Call print routine
JMP DONE ; Go to end
page
NOT$ESC_C:
RCR CH,1 ; PREV_ESC mode?
JNC NOT$ESC ; Br if not
;
; If PREV_ESC bit is set, it indicates that the last character seen by
; this printer was an "Escape" code. We will now look and see if it is
; a control code that we need to remember. These are:
;
; ESC "L" - Puts printer in dual density bit graphics mode
; ESC "K" - Puts printer in single density bit graphics mode
; ESC "R" - Selects an International character set in printer
;
; In addition to the codes that we need to remember, we have some
; codes which set a temporary mode. These temporary modes are:
;
; "ESC_SINGLE" : Expect one more control code. This is to be
; sent to the printer.
; "ESC_NULL" : Expect control codes to continue until a NULL
; character (ASCII 0) is received.
; "ESC_C" ; Expect one more control code. If that code is
; an ASCII 0, expect one more after that.
;
; The escape sequences which set these modes are:
;
; ESC "A" - ESC_SINGLE mode
; ESC "D" - ESC_NULL mode
; ESC "Q" - ESC_SINGLE mode
; ESC "B" - ESC_NULL mode
; ESC "C" - ESC_C mode
; ESC "N" - ESC_SINGLE mode
;
AND SYS_MODE[BX],MASK$PREV_ESC ; Turn off PREV_ESC mode bit
CMP AL,'L' ; CTRL-K?
JE SET$BIT_GRAF ; Br if yes
CMP AL,'K' ; CTRL-K?
JNE ARND$BIT_GRAF ; Br if not
SET$BIT_GRAF:
OR SYS_MODE[BX],NOT MASK$FST_BITG ; Ind.that next char is FST_BITG_CNT
JMP SHORT SENDCHAR ; Done, send out
ARND$BIT_GRAF:
CMP AL,'R' ; CTRL-R?
JNE NOT$INT ; Br if not
OR SYS_MODE[BX],NOT MASK$NEW_INTL ; Indicate next char is NEW_INTL bit
JMP SHORT SENDCHAR ; Send out character
NOT$INT:
CMP AL,'A' ; ESC A?
JE DO$ESC_SINGLE ; Br if yes
CMP AL,'Q' ; ESC Q?
JE DO$ESC_SINGLE ; Br if yes
CMP AL,'N' ; ESC N?
JNE NOT$SINGLE ; Br if not ESC_SINGLE mode
DO$ESC_SINGLE: ; Set ESC_SINGLE mode
OR SYS_MODE[BX],NOT MASK$ESC_SING ;
JMP SHORT SENDCHAR ; Print out char
NOT$SINGLE: ; Check for ESC_NULL mode now
CMP AL,'D' ; ESC D?
JE DO$ESC_NULL ; Br if yes
CMP AL,'B' ; ESC B?
JNE NOT$NULL ; Br if not ESC NULL mode
DO$ESC_NULL: ; Set ESC_NULL mode
OR SYS_MODE[BX],NOT MASK$ESC_NULL ;
JMP SHORT SENDCHAR ; Print out char
NOT$NULL: ; Check for ESC_C mode now
CMP AL,'C' ; ESC C?
JNE NOT$ESCC ; Br if not
OR SYS_MODE[BX],NOT MASK$ESC_C ; Set ESC_C mode bit
NOT$ESCC: ; Whatever type of char this is...print it
JMP SHORT SENDCHAR
NOT$ESC: ; Previous char was not an ESCAPE control char
;
; Is thia an ESCAPE code?
;
CMP AL,ESC_CHAR ;
JNE NESC ; Br if not
OR SYS_MODE[BX],NOT MASK$PREV_ESC ; Set escape found bit
JMP SHORT SENDCHAR ; Send out character
NESC:
;
; See if we have any standard control codes...ASCII 7-20
;
CMP AL,07H ; Is character less than 7?
JL CHKCHAR ; Br if yes, not control code
CMP AL,14H ; Is character greater than 14?
JLE SENDCHAR ; If not, is a control code...print it
CHKCHAR:
;
; Here we ckeck to see if the character to be printed is in the range
; of 20H to 7EH (ASCII value of the character to be printed.) If in
; that range, use standard Epson character set. Otherwise, we have
; a special character to print.
;
MOV AH,0 ; Make sure nothing is in upper byte
CMP AX,20H ; Is character less than 20H?
JL BIT$CHAR ; Br if yes, special character
CMP AX,7EH ;
JLE SENDCHAR ; Not a special character, just print it
SUB AL,7EH-20H+1 ; Subtract non-special character set out
BIT$CHAR:
;
; See if current character is part of the Epson's International character
; set. (If its offset into BITTYP array is 0, international.
;
PUSH BX ; Save offset to starage area
PUSH AX ; Save current character
MOV BX,AX ;
MOV CL,3 ; Shift count
SHR BL,CL ; Shift lower three bits from AL
MOV CH,BITTYP[BX] ; Get byte containing type bit
SHL BL,CL ; Move AL back to original position
; Note: we have now lost the lower three bits from AL.
NEG BX ; Take two's complement of BL
ADD BL,AL ; Add original contents of AL to negated
; value to get right three bits
INC BL ; This is now our index to type bit
MOV CL,BL ; Let's use value as shift count
MUL TMPBYTE ; Offset into array
MOV SI,AX ; Get index into array
POP AX ; Once again, get original char
SHL CH,CL ; Recall CH holds bit-type byte
JC DO$BIT_GRAF ; Carry now is type of the char
;
; Well, we see that the bit type was 0, so we are to specify a char
; from the Epson international character set. To determine which, we
; expect the first byte in BITVAL array to tell us which international
; set to use and the second byte to tell us the character to print.
;
MOV CH,BITVAL[SI] ; Get character set
CMP INTLSET[BX],CH ; Is this the set we are now using?
JNE NEW$INTSET ; Br if not
POP BX ; Keep stack clean
MOV AL,BITVAL[SI][1] ; If yes, just send out character
JMP SENDCHAR ;
NEW$INTSET: ; Must temporarily set up new international set
MOV AL,ESC_CHAR ; Print out "ESC" char
CALL PRBYTE ;
MOV AL,'R' ; Send out new international signal
CALL PRBYTE ;
MOV AL,CH ; Print out character set to use
CALL PRBYTE ;
MOV AL,BITVAL[SI][1] ; Get intl character to print
CALL PRBYTE ;
MOV AL,ESC_CHAR ; Now restore original character set
CALL PRBYTE ;
MOV AL,'R' ;
CALL PRBYTE ;
POP BX ; Restore address to store area
MOV AL,INTLSET[BX] ; Set type
CALL PRBYTE ;
JMP DONE ; We are done so exit program
DO$BIT_GRAF: ; Special bit-graphics mode
POP BX ; Restore to keep stack straight
PUSH AX ; Save current character for indexing
MOV AL,ESC_CHAR ; Put printer in dual density bit mode
CALL PRBYTE ;
MOV AL,'L' ;
CALL PRBYTE ;
MOV AL,12 ; Each graphics character consists of
CALL PRBYTE ; exactly 9 columns of bits followed
MOV AL,0 ; by 3 blank columns (12 columns total)
CALL PRBYTE ;
POP AX ;
CMP AX,0B3H-(7EH-20H+1) ; See if extended set
JL NON_EXTND ; Br if not
CMP AX,0E0H-(7EH-20H+1) ;
JGE NON_EXTND ;
;
; The character is in the "extended" set. (ASCII 176 to 223)
;
MOV AL,BITVAL[SI] ; Pre-extended first column
CALL PR9BYTS ; Print out character
JMP AROUND ; Move around non-extended set
NON_EXTND: ; Character is non-extended
MOV AL,0 ; First column is blank
CALL PR9BYTS ; Print out character
MOV AL,0 ; Last two columns are blank
AROUND:
CALL PRBYTE ; Print out last two columns
CALL PRBYTE ;
DONE: ; Exit Program
POP DX ; Restore AL without disturbing AH
MOV AL,DL ;
POP DX ; Rsetore registers
POP CX ;
POP BX ;
POP SI ;
POP DS ;
IRET ; Return from interrupt
PR256 ENDP ; Done with main routine !!!
page
;******************************************************************************
;
; PRBYTE - clears current value of AH and prints out character in AL
;
;*****************************************************************************
PRBYTE PROC NEAR
MOV AH,0 ; Clear out for printing w/BIOS
CALL PR2BYTE ; Do actual printout of char
RET ; Done
PRBYTE ENDP
;******************************************************************************
;
; PR2BYTE - Calls IBM's BIOS print routine to print out contents of AX
;
;******************************************************************************
PR2BYTE PROC NEAR
PUSH DS
PUSH SI
PUSHF ; IBM print proc expects interrupt call
MOV SI,SEG DWORD_ADDR ; Get segment to ROM code
MOV DS,SI ;
MOV SI,OFFSET DWORD_ADDR ; Get address to ROM code for print
CALL DWORD PTR [SI] ; Call print routine
POP SI
POP DS
RET ; Return
PR2BYTE ENDP
;******************************************************************************
;
; PR9BYTS - Prints out a graphics character using BITVAL table below.
; On entry, AL contains byte value of first column to be printed.
; Next nine columns of character are fetched from indexing thru
; SI (which must be initialized by calling routine) into the
; BITVAL table.
;
;*****************************************************************************
PR9BYTS PROC NEAR
CALL PRBYTE ; Print out first column
MOV CX,9 ; Loop through 9 columns
LOOP$SEND:
MOV AL,BITVAL[SI] ; Get next column to print
CALL PRBYTE ; Print it out
INC SI ; Move to next column
LOOP LOOP$SEND ; Loop until done
RET ; If done, then return
PR9BYTS ENDP
PAGE
;******************************************************************************
;
; Define characters... 9 bytes per character
;
;******************************************************************************
.RADIX 16 ; All value in hexadecimal
BITVAL DB 000,000,000,000,000,000,000,000,000 ; 0 (Decimal ASCII)
DB 03C,042,089,0A5,085,0A5,089,042,03C ; 1
DB 03C,07E,093,9BH,0FBH,9BH,93,07E,03C ; 2
DB 060,0F0,0F8,07C,07E,07C,0F8,0F0,060 ; 3
DB 000,010,038,07C,0FE,07C,038,010,000 ; 4
DB 010,038,038,0D0,0EE,0D0,038,038,010 ; 5
DB 000,000,030,072,0FE,072,030,000,000 ; 6
DB 000,000,030,078,078,078,030,000,000 ; 7
DB 0FF,0FF,0CF,087,087,087,0CF,0FF,0FF ; 8
DB 000,018,024,042,042,042,024,018,000 ; 9
DB 0FF,0E7,0DBH,0DBH,0DBH,0DBH,0DBH,0E7,0FF ; 10
DB 000,00C,012,012,012,0B2,0CC,0E0,000 ; 11
DB 000,000,064,094,09F,094,064,000,000 ; 12
DB 000,006,006,0FE,0A0,0A0,0A0,0E0,000 ; 13
DB 006,006,0FE,0A0,0A0,0A0,0AC,0AC,0FC ; 14
DB 054,010,038,028,0EE,028,038,010,054 ; 15
DB 000,0FE,07C,07C,038,038,010,010,000 ; 16
DB 000,010,010,038,038,07C,07C,0FE,000 ; 17
DB 000,000,028,06C,0FE,06C,028,000,000 ; 18
DB 000,0F2,0F2,000,000,000,0F2,0F2,000 ; 19
DB 060,090,090,0FE,080,080,0FE,080,080 ; 20
DB 001,5DH,000,000,000,000,000,000,000 ; 21 * FRANCE - 5D
DB 000,03C,03C,03C,03C,03C,03C,03C,000 ; 22
DB 000,001,029,6DH,0FF,6DH,029,001,000 ; 23
DB 000,000,020,060,0FE,060,020,000,000 ; 24
DB 000,000,008,00C,0FE,00C,008,000,000 ; 25
DB 000,010,010,010,010,07C,038,010,000 ; 26
DB 000,010,038,07C,010,010,010,010,000 ; 27
DB 000,000,038,008,008,008,008,000,000 ; 28
DB 010,038,07C,010,010,010,07C,038,010 ; 29
DB 000,004,00C,01C,03C,01C,00C,004,000 ; 30
DB 000,020,030,038,03C,038,030,020,000 ; 31
DB 000,006,0AH,012,022,012,0AH,006,000 ; 127
DB 001,05C,000,000,000,000,000,000,000 ; 128 * FRANCE - 5C
DB 002,7DH,000,000,000,000,000,000,000 ; 129 * GERMANY - 7D
DB 001,7BH,000,000,000,000,000,000,000 ; 130 * FRANCE - 7B
DB 005,7DH,000,000,000,000,000,000,000 ; 131 * SWEDEN - 7D
DB 002,7BH,000,000,000,000,000,000,000 ; 132 * GERMANY - 7B
DB 001,040,000,000,000,000,000,000,000 ; 133 * FRANCE - 40
DB 002,007,055,0F5,0B5,0B5,0FE,04F,001 ; 134
DB 000,071,089,089,08F,088,088,050,000 ; 135
DB 000,00E,05F,0D5,095,095,0D5,5DH,00C ; 136
DB 000,01C,0BE,0AA,02A,02A,0AA,0BA,018 ; 137
DB 001,7DH,000,000,000,000,000,000,000 ; 138 * FRANCE - 7D
DB 000,0A2,0A2,03E,01E,082,082,000,000 ; 139
DB 000,052,0D2,09E,08E,0C2,042,000,000 ; 140
DB 000,012,092,0DE,04E,002,002,000,000 ; 141
DB 002,5BH,000,000,000,000,000,000,000 ; 142 * GERMANY - 5B
DB 003,047,04E,0BA,0B2,0BA,04E,047,003 ; 143
DB 005,040,000,000,000,000,000,000,000 ; 144 * SWEDEN - 40
DB 004,7BH,000,000,000,000,000,000,000 ; 145 * DENMARK - 7B
DB 004,5BH,000,000,000,000,000,000,000 ; 146 * DENMARK - 5B
DB 000,00E,05F,0D1,091,091,0D1,05F,00E ; 147
DB 002,07C,000,000,000,000,000,000,000 ; 148 * GERMANY - 7C
DB 000,00E,01F,091,0D1,051,011,01F,001 ; 149
DB 000,05E,0DF,081,081,0C1,05E,01F,001 ; 150
DB 001,07C,000,000,000,000,000,000,000 ; 151 * FRANCE - 7C
DB 020,0B0,099,00F,006,00C,098,0B0,020 ; 152
DB 002,05C,000,000,000,000,000,000,000 ; 153 * GERMANY - 5C
DB 002,05C,000,000,000,000,000,000,000 ; 154 * GERMANY - 5D
DB 018,03C,066,042,0FF,0FF,042,066,024 ; 155
DB 003,023,000,000,000,000,000,000,000 ; 156 * ENGLAND - 23
DB 000,000,094,054,03F,054,094,000,000 ; 157
DB 007,023,000,000,000,000,000,000,000 ; 158 * SPAIN - 23
DB 000,004,012,012,07C,090,090,040,000 ; 159
DB 004,00E,02A,06A,0EA,0AA,03C,01E,002 ; 160
DB 000,012,012,05E,0CE,082,002,000,000 ; 161
DB 000,00E,01F,011,051,0D1,091,01F,00E ; 162
DB 000,01E,01F,041,0C1,081,01E,01F,001 ; 163
DB 007,07C,000,000,000,000,000,000,000 ; 164 * SPAIN - 7C
DB 007,05C,000,000,000,000,000,000,000 ; 165 * SPAIN - 5C
DB 000,012,0BA,0AA,0AA,0AA,072,07A,00A ; 166
DB 000,072,0FA,08A,08A,08A,08A,0FA,072 ; 167
DB 007,5DH,000,000,000,000,000,000,000 ; 168 * SPAIN - 5D
DB 000,000,038,020,020,020,020,000,000 ; 169
DB 000,000,020,020,020,020,038,000,000 ; 170
DB 000,042,0F4,008,010,029,053,015,009 ; 171
DB 000,042,0F4,008,012,026,04A,01F,002 ; 172
DB 007,5BH,000,000,000,000,000,000,000 ; 173 * SPAIN - 5B
DB 010,038,06C,044,010,038,06C,044,000 ; 174
DB 000,044,06C,038,010,044,06C,038,010 ; 175
DB 000,055,000,0AA,000,055,000,0AA,000 ; 176
DB 055,0AA,055,0AA,055,0AA,055,0AA,055 ; 177
DB 0FF,0AA,0FF,055,0FF,0AA,0FF,055,0FF ; 178
DB 000,000,000,000,0FF,000,000,000,000 ; 179
DB 008,008,008,008,0FF,000,000,000,000 ; 180
DB 028,028,028,028,0FF,000,000,000,000 ; 181
DB 008,008,008,0FF,000,000,0FF,000,000 ; 182
DB 008,008,008,00F,008,008,00F,000,000 ; 183
DB 028,028,028,028,03F,000,000,000,000 ; 184
DB 028,028,028,0EF,000,000,0FF,000,000 ; 185
DB 000,000,000,0FF,000,000,0FF,000,000 ; 186
DB 028,028,028,02F,020,020,03F,000,000 ; 187
DB 028,028,028,0E8,008,008,0F8,000,000 ; 188
DB 008,008,008,0F8,008,008,0F8,000,000 ; 189
DB 028,028,028,028,0F8,000,000,000,000 ; 190
DB 008,008,008,008,00F,000,000,000,000 ; 191
DB 000,000,000,000,0F8,008,008,008,008 ; 192
DB 008,008,008,008,0F8,008,008,008,008 ; 193
DB 008,008,008,008,00F,008,008,008,008 ; 194
DB 000,000,000,000,0FF,008,008,008,008 ; 195
DB 008,008,008,008,008,008,008,008,008 ; 196
DB 008,008,008,008,0FF,008,008,008,008 ; 197
DB 000,000,000,000,0FF,028,028,028,028 ; 198
DB 000,000,000,0FF,000,000,0FF,008,008 ; 199
DB 000,000,000,0F8,008,008,0E8,028,028 ; 200
DB 000,000,000,03F,020,020,02F,028,028 ; 201
DB 028,028,028,0E8,008,008,0E8,028,028 ; 202
DB 028,028,028,02F,020,020,02F,028,028 ; 203
DB 000,000,000,0FF,000,000,0EF,028,028 ; 204
DB 028,028,028,028,028,028,028,028,028 ; 205
DB 028,028,028,0EF,000,000,0EF,028,028 ; 206
DB 028,028,028,028,0E8,028,028,028,028 ; 207
DB 008,008,008,0F8,008,008,0F8,008,008 ; 208
DB 028,028,028,028,02F,028,028,028,028 ; 209
DB 008,008,008,00F,008,008,00F,008,008 ; 210
DB 000,000,000,0F8,008,008,0F8,008,008 ; 211
DB 000,000,000,000,0F8,028,028,028,028 ; 212
DB 000,000,000,000,03F,028,028,028,028 ; 213
DB 000,000,000,00F,008,008,00F,008,008 ; 214
DB 008,008,008,0FF,008,008,0FF,008,008 ; 215
DB 028,028,028,028,0FF,028,028,028,028 ; 216
DB 008,008,008,008,0F8,000,000,000,000 ; 217
DB 000,000,000,000,00F,008,008,008,008 ; 218
DB 0FF,0FF,0FF,0FF,0FF,0FF,0FF,0FF,0FF ; 219
DB 00F,00F,00F,00F,00F,00F,00F,00F,00F ; 220
DB 0FF,0FF,0FF,0FF,0FF,000,000,000,000 ; 221
DB 000,000,000,000,000,0FF,0FF,0FF,0FF ; 222
DB 0F0,0F0,0F0,0F0,0F0,0F0,0F0,0F0,0F0 ; 223
DB 000,03C,042,042,042,03C,024,042,000 ; 224
DB 002,07E,000,000,000,000,000,000,000 ; 225 * GERMANY - 7E
DB 000,07E,040,040,040,040,040,070,000 ; 226
DB 000,040,07E,040,040,040,07E,040,000 ; 227
DB 082,0C6,0AA,092,082,082,082,0C6,000 ; 228
DB 000,03C,042,042,042,07C,040,040,040 ; 229
DB 000,001,07E,004,004,004,004,078,000 ; 230
DB 000,020,040,040,03E,020,040,040,000 ; 231
DB 000,099,0A5,0A5,0E7,0A5,0A5,099,000 ; 232
DB 000,038,054,092,092,092,054,038,000 ; 233
DB 002,03A,046,080,080,080,046,03A,002 ; 234
DB 000,000,04C,0B2,092,092,08C,000,000 ; 235
DB 038,044,044,044,038,044,044,044,038 ; 236
DB 000,03A,044,04C,054,064,044,0B8,000 ; 237
DB 000,000,038,054,092,082,000,000,000 ; 238
DB 000,01E,020,040,040,040,020,01E,000 ; 239
DB 000,054,054,054,054,054,054,054,000 ; 240
DB 000,022,022,022,0FA,022,022,022,000 ; 241
DB 000,002,08A,08A,052,052,022,022,000 ; 242
DB 000,022,022,052,052,08A,08A,002,000 ; 243
DB 000,000,000,000,07F,080,080,060,000 ; 244
DB 000,006,001,001,0FE,000,000,000,000 ; 245
DB 000,010,010,010,054,010,010,010,000 ; 246
DB 000,024,048,048,024,012,012,024,000 ; 247
DB 000,000,030,048,048,048,030,000,000 ; 248
DB 000,000,030,078,078,078,030,000,000 ; 249
DB 000,000,000,010,038,010,000,000,000 ; 250
DB 010,010,010,008,004,07E,040,040,040 ; 251
DB 080,070,080,080,078,000,000,000,000 ; 252
DB 044,08C,094,064,000,000,000,000,000 ; 253
DB 000,000,07C,07C,07C,07C,07C,000,000 ; 254
DB 000,000,000,000,000,000,000,000,000 ; 255
PAGE
;******************************************************************************
;
; Set up bits to distinguish between normal graphics characters
; and those which can use the MX100 International character sets
;
;*****************************************************************************
.RADIX 10 ; Back to decimal
BITTYP DB 11111111B ; ASCII 0 to 7
DB 11111111B ; 8 - 15
DB 11111011B ; 16 - 23
DB 11111111B ; 24 - 31
DB 10000001B ; 127 - 134
DB 11101110B ; 135 - 142
DB 10001011B ; 143 - 150
DB 01001010B ; 151 - 158
DB 11111001B ; 159 - 166
DB 10111101B ; 167 - 174
DB 11111111B ; 175 - 182
DB 11111111B ; 183 - 190
DB 11111111B ; 191 - 198
DB 11111111B ; 199 - 206
DB 11111111B ; 207 - 214
DB 11111111B ; 215 - 222
DB 11011111B ; 223 - 230
DB 11111111B ; 231 - 238
DB 11111111B ; 239 - 246
DB 11111111B ; 247 - 254
DB 10000000B ; 255
PAGE
LASTONE: ; All code after this label is freed to DOS use after
; initialization of the program
;******************************************************************************
;
; Code to load and initialize the printing program ...
; sets up DOS to keep all code before "LASTONE" label
; safe from overlaying during system operation.
;
;******************************************************************************
INIT_CODE PROC NEAR
POP AX ; Remove return address of CALL
;
; After this initialization routine is finished, we wish to return
; to DOS and prevent DOS from overlaying the PR256 code.
; This is done by replacing the INT X`20' command found at the front
; of the Program Segment Prefix control block with an INT X`27'
; "Program end but stay resident" command. The address to this instruction
; is placed on the front of the stack, behind the return address
; used by this subroutine. When the initialization is finished, this
; routine returns to its caller (the main program) which executes a
; return to the PSP, resulting in the INT X`27' command execution.
;
PUSH DS ; move segment address to PSP onto stack
MOV DI,0 ; Set return to first location in PSP
PUSH DI ;
PUSH AX ; Restore return address
MOV AL,NEWINT ; Set up INT X`27' in PSP
MOV [DI+1],AL ;
MOV AX,0 ; set up address to INT 17H vector
MOV DS,AX ;
MOV BX,INTADDR ;
LES DI,DWORD PTR [BX] ; Load double word addr to BIOS print routine
MOV AX,SEG DWORD_ADDR ; Now set up addr to store BIOS addr
MOV DS,AX ;
MOV DWORD_ADDR,DI ;
MOV AX,ES ;
MOV DWORD_ADDR+2,AX ; Store BIOS print routine address
MOV AX,SEG START_UP ;
MOV ES,AX ; Don't forget to save segment address
MOV DI,OFFSET START_UP ;
MOV AX,0 ;
MOV DS,AX ; Now address back to INT 17H vector
MOV BX,INTADDR ;
MOV [BX],DI ;
MOV DI,ES ;
MOV [BX+2],DI ;
MOV DX,OFFSET LASTONE ; Save all code up to "LASTONE" label
ADD DX,100H ; from overlaying by DOS
RET ; Return to MAIN program
INIT_CODE ENDP
CODE ENDS
END
Disk No: 186
Program Title: CRT and Epson Printer Utilities
PC-SIG version: 1.6
This disk contains a collection of useful printer utilities for your
EPSON and compatible printers.
Usage: Printer Utilities.
Special Requirements: An EPSON or compatible printer.
How to Start: Type the filename you wish to run. Example: type SP
(press enter)
Suggested Registration: Various.
File Descriptions:
WINEGA <DIR> Directory with files for enhancing EGA cards.
PRTSCFX <DIR> Files for graphic screen dumps on Epson FX and RX.
NOCOLOR COM Switch color graphics card to B/W mode.
NOCOLOR DOC Documentation.
SCRLKY ASM Assembler source.
SCRLKY COM Better screen scrolling control.
SCROLLK COM Another screen scrolling control utility.
SCROLLK DOC Documentation.
COMPRSOF COM Set compressed print off.
COMPRSON COM Set compressed print on.
CREATOR BAS Displays characters in dot matrix pattern.
DBLHITOF COM Set enlarged print off.
DBLHITON COM Set enlarged print on.
DBLWDEOF COM Set wide print off.
DBLWDEON COM Set wide print on.
EMPHASOF COM Set emphasized print off.
EMPHASON COM Set emphasized print off.
EPSONCHR ASM Assembler source.
EPSONCHR DOC Documentation.
EPSONCHR EXE Permits printing all characters.
ITALICOF COM Set italics off.
ITALICON COM Set italics on.
KYBD BAS Send printing directly to monochrome parallel port.
PRINT20 DOC Patch to skip LPT1? prompt from PRINT.COM.
PRINTSET Sets Epson to compressed print.
PRINTSET DOC Documentation.
RESET COM Reset printer to power-on settings.
SET-PRTR C Source.
SET-PRTR EXE MX-80 printer settings.
SET51LNS COM Set 51 lines per page.
SETCW132 COM Set 132 columns per page.
SETPRF19 COM Perforation setting.
SKP6PERF COM Perforation setting - 6 lines/inch.
SKP8PERF COM Perforation setting - 8 lines/inch.
TOPOFORM COM Skip to top of form.
UNDERLOF COM Set underline off.
UNDERLON COM Set underline on.
PC-SIG
1030D E Duane Avenue
Sunnyvale Ca. 94086
(408) 730-9291
(c) Copyright 1987,88,89 PC-SIG, Inc.
╔═════════════════════════════════════════════════════════════════════════╗
║ <<<< Disk #186 SCREEN AND PRINTER UTILITIES >>>> ║
╠═════════════════════════════════════════════════════════════════════════╣
║ To start a program type the filename that you wish to run. Example ║
║ Type SP (press enter) ║
╚═════════════════════════════════════════════════════════════════════════╝
100 'DIRECT PRINTER DRIVER. THIS PROGRAM IS USED TO SEND CHARACTERS DIRECTLY
110 'TO THE PRINTER OUTPUT PORT ON THE IBM MONOCHROME BOARD OR PARALLEL PRINTER
120 'BOARD (or equivalent). CONTROL CHARACTERS OR ESCAPE CODE SEQUENCES CAN BE
130 'SENT. REMEMBER HOWEVER, THE PRINT BUFFER IS NOT DUMPED UNTIL IT IS FULL
140 '(set by the width command), OR A CARRIAGE RETURN, LINE FEED, OR OTHER
150 'APPROPRIATE CONTROL CHARACTER IS SENT.
160 '***
170 '*** Program by: Lee M. Buck, October, 1982. Arlington, Va.(703-527-5813)
180 '*** The subroutine that performs the direct output to the printer
190 '*** is from W. Fastie's IBM column in the Oct. 82 'Creative Computing '
200 '***
210 'THE PROGRAM WILL GET 'HUNG ' IF YOU SPECIFY THE INCORRECT PRINTER ADAPTER.
220 'IF THAT HAPPENS, ENTER Ctrl-Break AND START AGAIN. TO QUIT THE PROGRAM
230 'ENTER Ctrl-Break.
240 CLEAR:CLOSE:CLS:DEFINT A-Z
250 DATAIO=&H378 : PRNTLATCH=&H37A : STATUSREG=&H379
260 LOCATE 5,1: PRINT "IS YOUR PRINTER ATTACHED TO THE IBM MONOCHROME"
270 PRINT "DISPLAY BOARD OR 'OTHER ' ? PRESS M OR O : ";
280 Q$=INKEY$: IF Q$="" THEN 280
290 IF Q$="M" OR Q$="m" OR Q$="O" OR Q$="o" THEN PRINT Q$ ELSE BEEP: GOTO 260
300 IF Q$<>"M" AND Q$<>"m" THEN 320
310 DATAIO=&H3BC : PRNTLATCH=&H3BE : STATUSREG=&H3BD
320 WIDTH "LPT1:",80
330 LOCATE 10,1:PRINT"PRESS KEY TO SEND TO PRINTER (including control keys) ";
340 DEF SEG: POKE 106,0
350 Q$=INKEY$: IF Q$="" THEN 350 ELSE PRINT Q$;
360 LNTH=LEN(Q$): C=ASC(MID$(Q$,LNTH))
370 GOSUB 390
380 LOCATE 10,1: PRINT SPACE$(79);:GOTO 330
390 OUT PRNTLATCH, &H6
400 IF INP(STATUSREG) <> &HDF THEN 400
410 OUT DATAIO, C
420 OUT PRNTLATCH, &H3F
430 IF INP(STATUSREG) <> &HDF THEN 430
440 RETURN
***************************************************************************
* NOCOLOR.COM - author unknown *
* *
* Those PC owners using a COLOR/GRAPHICS card with a monochrome monitor *
* may find this program useful. Many programs assume that if you have *
* a C/G card, you have a color display, and proceed to produce color- *
* encoded video output, which makes indecipherable garbarge on a *
* monochrome screen. *
* *
* Use this program to switch your Color/Graphics card to B/W mode from *
* within such a program. *
* *
* Run NOCOLOR at the DOS prompt. From then on, hitting Alt-Tab will *
* switch the C/G card to B/W mode. *
* *
* Uploaded to PCanada by Mark Magner November 16, 1983 *
* *
***************************************************************************
ark Magner November 16, 1983 *
* *
*************************************************************************
If you want the PRINT.COM program in dos 2.0 to skip
the prompt for the output list device, to allow for
automatic installation at boot-up,
A>debug print.com
-e c0d 90 90
-e c14 90 90
If your printer is the default, (LPT1:), that's all
there is to it. Write the file to disk and quit.
If your printer is attached to some other port,
like LPT2:, you must make one more patch, to specify
the device.
-e 120d 5 "LPT2:"
The "5" in this case is the number of characters in
the name of the device. Substitute for whatever port
your printer is attached to, then,
-w
Writing xx bytes
-q
A>
And thats all there is to it.
PRINTSET, BY MICHAEL W. CSONTOS 1/18/83
THIS "PROGRAM" SETS UP THE EPSON PRINTER TO PRINT COMPRESSED PRINT
WITH 1/8 IN SPACING WITH AUTO-SKIP-OVER-PERF ON 11 INCH PAGES. IT
ALSO RESETS THE PRINTER TO TOP-OF-FORM WHEN IT IS RUN.
TO "RUN" THE PROGRAM TURN ON THE PRINTER AND, IN DOS, TYPE "TYPE PRINTSET".
THE CHARACTERS THAT APPEAR ON THE SCREEN AND THE BEEP ARE THE RESULT OF
DOS INTERPRETING THE EPSON COMMAND CODES. THE DOTS THAT ARE PRINTED ON THE
PRINTER WERE JUST TO HELP IN DEBUGGING THE PROGRAM AND TO SHOW THAT IT
FUNCTIONED PROPERLY. IT TOOK QUITE A WHILE TO FIND A CODE THAT WAS
COMPATABLE WITH EDLIN, DOS, AND THE EPSON!
I FIND THIS SMALL ROUTINE VERY USEFUL IN PRINTING OUT LONG DOCUMENTATION
FILES WITHOUT USING TOO MUCH PAPER.
;***************************************************************************
;This program intercepts Video I/O routine.Commands to scroll the screen and
;are intercepted,allothers passed through. This routine is attached to DOS.
;***************************************************************************
;***** ***** ***** ***** ***** scrlky.asm ***** ***** ***** ***** ***** *****
;-----------------------------------------------------------------------------
;INTERRUPT VECTORS FOR VIDEO AND KEYBOARD FUNCTIONS
;---------------------------------------------------------------------------
VECTORS SEGMENT AT 0
ORG 10H*4
VIDEO_INT LABEL DWORD
ORG 16H*4
KEYBOARD_INT LABEL DWORD
VECTORS ENDS
;
ROM_BIOS_DATA SEGMENT AT 40H
ORG 17H
KB_FLAG DB ? ;bit 4 set for scroll lock
ROM_BIOS_DATA ENDS
;---------------------------------------------------------------------------
;Initialize vectors and attach to DOS
;---------------------------------------------------------------------------
CSEG SEGMENT PARA
ASSUME CS:CSEG
ORG 100H
BEGIN: JMP INIT_VECTORS ;Initialize INT 10H and attach to DOS
;----------------------------------------------------------------------------
;These memory locations store addresses of ROM routines for Video&KB I/O
;----------------------------------------------------------------------------
ROM_VIDEO_IO DD ;address of ROM routines
ROM_KEYBOARD_IO DD
SCROLL_COUNT DB 0 ;no. lines scrolled since last pause
LAST_LOCK_STATE DB 0 ;scroll by 23 lines leaving one old line
MAX_LINES DB 23 ;at the top of the screen
LAST_LINE DB ;last line the cursor was one
;----------------------------------------------------------------------------
;This routine intercepts calls to Video I/O routine in ROM
;Scroll Lock
; OFF This routine passes control directly to ROM BIOS
; ON Functions other than Scroll Up orScroll down are passed
; directly to ROM routines. Otherwise,this routine increments
; the scroll count and checks to see if it esceeds the page
; size of 25 lines. If so, loop until either shift key is
; pressed.
; left shift - allows scroll of entire window
; right shift- scroll one line
;----------------------------------------------------------------------------
INTERCEPT_VIDEO PROC FAR
ASSUME CS:CSEG
STI ;turn on interrupts again
PUSH DS ;save registers used
PUSH BX
PUSH AX
ASSUME DS:ROM_BIOS_DATA
MOV BX,ROM_BIOS_DATA
MOV DS,BX
MOV AL,KB_FLAG ;check state of scroll lock key
AND AL,10H ;pick off scroll lock bit
ASSUME DS:CSEG
MOV BX,CS ;Data segment for variables above
MOV DS,BX
CMP AL,LAST_LOCK_STATE
JE UN_CHANGED
MOV BL,MAX_LINES ;scroll lock key has changed,set to
MOV SCROLL_COUNT,BL ;MAX_LINES to stop scrolling
MOV LAST_LOCK_STATE,AL ;Save new scroll lock state
PUSH CX ;read current cursro position
PUSH DX
PUSH AX
MOV AH,3
MOV BH,0
PUSHF
CALL ROM_VIDEO_IO ;find old cursor position
MOV LAST_LINE,DH
POP AX
POP DX
POP CX
UN_CHANGED:
XCHG AX,BX ;Recover function(AH) and retain scroll lock
POP AX
OR BL,BL ;is scroll lock on?
JZ TO_VIDEO_IO ;no, jump to ROM video I/O
;----------------------------------------------------------------
;Scroll Lock On
;----------------------------------------------------------------
CMP AH,2 ;check for SET CURSOR POSITION function
JNE NOPE
CMP DH,LAST_LINE ;is cursor beingmoved to next line?
MOV LAST_LINE,DH ;save new cursor line
JLE TO_VIDEO_IO ;no, go to ROM
JMP SHORT CHECK_LOCK ;yes,see if need to lock
NOPE: CMP AH,6 ;scroll up?
JNE TO_VIDEO_IO ;no, ok to scroll
;yes,can't until shit key hit
CHECK_LOCK:
INC SCROLL_COUNT ;take care of scroll lock
MOV BH,MAX_LINES
CMP SCROLL_COUNT,BH ;have we scrolled more than MAX_LINES
JL TO_VIDEO_IO ;no,its OK to scroll
;yes,can't scroll till shift key hit
MOV BL,BH ;set scroll count to MAX_LINES-1
DEC BL ;so can print onemore line
MOV SCROLL_COUNT,BL
ASSUME DS:ROM_BIOS_DATA
MOV BX,ROM_BIOS_DATA
MOV DS,BX
LOOP: MOV BL,KB_FLAG ;wait until right orleft shift key hit
TEST BL,10H ;is scroll lock still on?
JZ TO_VIDEO_IO
AND BL,3 ;pick off shift key info
JZ LOOP ;stay in loop until shift key pushed
CMP BL,1 ;RIGHT SHIFT KEY HIT?
JE SCROLL_LINE ;yes, scroll one line
;no,must be right shift key,reset scroll ct.
XOR BX,BX
MOV SCROLL_COUNT,BL
SCROLL_LINE:
;
TO_VIDEO_IO:
POP BX
PUSHF
CALL ROM_VIDEO_IO
POP DS
IRET
INTERCEPT_VIDEO ENDP
;
;----------------------------------------------------------------------------
;If the KB function calls for a read (AH=0),then reset scroll count
;---------------------------------------------------------------------------
INTERCEPT_KEYBOARD PROC FAR
ASSUME CS:CSEG,DS:CSEG
STI
PUSH DS ;save registers used this routine
PUSH BX
MOV BX,CS
MOV DS,BX
OR AH,AH ;check to see if AH=0-read character
JNZ KB1 ;no,brancj off to KB I/O
XOR BX,BX ;yes,set scroll count to 0
MOV SCROLL_COUNT,BL
KB1: POP BX
ASSUME DS:NOTHING
POP DS
JMP ROM_KEYBOARD_IO
INTERCEPT_KEYBOARD ENDP
;-----------------------------------------------------------------------
;This section saves old interrupt vectors for KB and Video I/O.These vectors
;are replaced by addresses of INTERCEPT_VIDEO & INTERCEPT_KEYBPARD
;----------------------------------------------------------------------
INIT_VECTORS PROC NEAR
ASSUME CS:CSEG,DS:CSEG
MOV AH,3 ;set LAST_LINE to cursor line number
XOR BH,BH
INT 10H
MOV LAST_LINE,DH
;
ASSUME CS:CSEG,DS:VECTORS
MOV AX,VECTORS
MOV DS,AX
;
MOV AX,VIDEO_INT ;save address of ROM routines
MOV ROM_VIDEO_IO,AX
MOV AX,VIDEO_INT[2]
MOV ROM_VIDEO_IO[2],AX
MOV AX,OFFSET INTERCEPT_VIDEO ;set video INT 10H to point
MOV VIDEO_INT,AX ;to INTERCEPT_VIDEO above
MOV VIDEO_INT[2],CS
;
MOV AX,KEYBOARD_INT ;save address of the ROM routines
MOV ROM_KEYBOARD_IO,AX
MOV AX,KEYBOARD_INT[2]
MOV ROM_KEYBOARD_IO[2],AX
MOV AX,OFFSET INTERCEPT_KEYBOARD ;set KB INT 16H to point to
MOV KEYBOARD_INT,AX ;INTERCEPT_KEYBOARD above
MOV KEYBOARD_INT[2],CS
;
MOV DX,OFFSET INIT_VECTORS ;end of resident portion
INT 27H ;terminate but stay resident
INIT_VECTORS ENDP
;
CSEG ENDS
END BEGIN
SCROLLK: This machine-language program is attached to DOS
whenever you run scrollk.com with the A> prompt showing. It
allows much better scroll control than <Ctrl-NumLock>. See
John Socha's article in Softalk for the IBM Personal Computer
for May 1983 for more information. Scrollk will be handy in
using files under Directory 4: "Quick Looks at Distant BBSs".
SP: A PRINT SPOOLER
for the IBM Personal Computer
Version 3.81
Copyright Alan Jones 1983
3717 Wildwood Drive
Endwell, NY 13760
(607) 754-2339
June 27, 1984
SP is a software printer buffer to hold data intended for the printer.
It works like the buffers that can be installed in the printer but the
data is stored in RAM storage instead of in the printer. The buffer
is unloaded to the printer at the printer's speed while DOS proceeds
at its speed. The size of the buffer is specified as a parameter when
SP is invoked. For example,
SP 14
will produce a buffer of 14KB (1KB = 1024 bytes).
The complete syntax is:
SP [ss] [C=cc] [P=pp]
where:
ss: size of buffer in kilobytes. One kilobyte = 1024 bytes.
Maximum size is 62 KB.
cc: number of copies desired. Default: 1.
pp: printer port desired (1, 2, or 3). Default: 1.
NOTE: You do not type the square brackets. They merely indicate that the
contents are optional. For example, if you want to use printer port 2 with
a buffer size of 20 KB, you would enter:
SP 20 P=2
If you want to keep the previous buffer and only change the number of
copies to 3 copies, enter:
SP C=3
For the "C" and "P" you can enter either upper or lower case characters.
If the size parameter is omitted, a default buffer of 16KB is used.
The program will work for all work sent to the printer whether it is from
the DOS TYPE command, a PrtSc command, a BASIC LLIST or LPRINT command, a
print command from The Personal Editor, etc.
TO STOP PRINTING
If you start a printout and decide you don't want it, press,
simultaneously, Alt-LeftShift-PrtSc to flush the buffer. You can also
flush the buffer by turning the printer off and then back on.
TO PAUSE
If you want the printing to pause, hold down the ON LINE button until the
printer stops (which it will do at the end of a line). Pressing the ON
LINE button again will allow printing to resume with no loss of data.
CHANGING BUFFER SIZE
You can remove SP from the machine by specifying a buffer of zero. That
is:
SP 0
will return DOS to its original state unless another DOS extension is
installed after SP such as FileCommand.
You can change the size of the buffer by re-invoking SP with the new
parameter. In this case, SP determines that there is already a copy
present in the machine and just alters the size of the buffer of the
older copy. (This feature not available for DOS 2.0. However, you can
remove SP and then re-invoke it to get a different buffer size.) If
the last copy of SP installed was other than printer 1, you must specify
the printer to remove it, e.g.:
SP 0 P=2
MULTIPLE COPIES
To create multiple copies of a document, you must indicate to SP where the
beginning and end of the document is. To indicate the beginning of a
document press Alt-LeftShift-B. To indicate the end of a document press
Alt-LeftShift-E. Of course, if you have indicated only one copy, that is
all you will get. You can press the END indication when SP has gobbled up
the text. You don't have to wait until the first copy is printed.
One nice way of using the multiple copies is after the fact. That is, if
you just printed a document and decide you'd like another copy, from DOS
indicate the TOTAL number of copies you want (2 or more) and then invoke
the END indication. SP will determine that one copy has already been
printed and proceed to print the rest according to the quantity specified.
You have to be a bit careful. Once you indicate the beginning of a
document (Alt-LeftShift-B) that remains the beginning until you change it.
If you print multiple copies of something and then send something else to
the printer and again indicate the END, you will get a document from the
most recent BEGIN. This may or may not be what you want.
MULTIPLE PRINTERS
SP can support more than one printer. When you invoke SP it creates a
buffer for the specified printer. If you do not specify one, it will
create a buffer for LPT1. You can then re-invoke SP specifying another
printer and a new buffer will be created. From then on, the data going to
the printer will enter the appropriate buffer and be printed on the
appropriate printer. When you give keyboard commands, SP does not know
which printer they apply for so it uses them for all. That is, if you
flush the buffer (Alt-LeftShift-PrtSc) all buffers will be flushed. If you
indicate the end of a document, this will apply to all buffers.
CAVEATS:
When using with VisiCalc, do not specify a buffer larger than 23K with DOS
1.1 or 10K with DOS 2.0 since VisiCalc will not load (it cannot cross a 64K
boundary during loading.)
There is a problem when using SP with the Personal Editor Version 1.0 on
some occasions when quiting a file. This has turned out to be a problem in
PE. To patch PE: On a scratch disk, rename a copy of PE.EXE to XX and
DEBUG XX. Type E DS:56E7 and change 6 bytes of code to hex 90 by typing 90
and pressing the space bar 6 times. The previous contents of those bytes
should be C7 06 56 EF 00 00. Then use the debug command W (write) to write
the file back out. Then Q (quit) to leave DEBUG and rename XX back to
PE.EXE.
When using it in some environments such as EasyWriter, there may be
commands that allow you to stop the printer. However, when SP is present,
the program will be way ahead of the printer and will only stop sending
data to the buffer. In cases like this, turn off the printer and then turn
back on again to stop printing.
OPERATING ENVIRONMENTS
SP has been tested in the following environments:
PrtSc command WordStar
DOS TYPE to printer EasyWriter 1.1
BASIC LLIST VisiCalc
BASIC LPRINT With Communications
BASIC PRINT# The Personal Editor
Lotus 1-2-3 Multiplan
PC-FILE PC-TALK
And with the following printers:
IBM Printer and Printer-2 TI-800
C. Itoh PROWRITER Okidata
Epson MX-80 or MX-80 F/T NEC 7730
AVAILABILITY
Available from Alan Jones under the "user supported software."
See below.
COPYING
SP can be copied onto one of your own diskettes for use on your machine.
In fact we recommend including it in your AUTOEXEC's so that it is always
invoked.
DISCLAIMER.
In no event will the Author be liable to you for any damages, including any
lost profits, lost savings or other incidental or consequential damages
arising out of the use of or inability to use these programs, even if the
Author has been advised of the possibility of such damages, or for any
claim by any other party.
PERMISSION TO COPY:
Clubs and other non-profit organizations are granted permission by the
author to freely copy these programs and documentation and share it with
their members, so long as:
1. No price is charged for the software or documentation. However, a
distribution cost may be charged for the cost of the diskette, so long
as it is not more than $10 total.
2. Club members are informed of the user-supported concept and encouraged
to support it with their donations.
3. The program or documentation are not modified in any way and are
distributed together.
THE USER-SUPPORTED CONCEPT.
User-Supported Software
If you are using this program and find it to be of value
your contribution will be appreciated.
($15 is suggested)
Alan Jones
3717 Wildwood Drive
Endwell, NY 13760
Regardless of whether you make a contribution,
you are encouraged to copy and share this program.
User-supported software is an experiment in distributing computer
programs, based on these beliefs:
1. That the value and utility of software is best assessed by the
user on his/her own system.
2. That the creation of personal computer software can and should
be supported by the computing community.
3. That copying of programs should be encouraged, rather than
restricted.
Anyone may request a copy of a user-supported program by sending a blank,
formatted disk to the author of the program. An addressed, postage-paid
return mailer must accompany the disk (no exceptions, please). A copy of
the program, with documentation on the disk, will be sent by return mail.
The program will carry a notice suggesting a contribution to the program's
author. Making a contribution is completely voluntary on the part of each
user.
Free distribution of software and voluntary payment for its use eliminates
costs for advertising and copy protection schemes.
Users obtain quality software at reduced cost. They can try it out before
buying, and do so at their own pace and in the comfort of their own home or
office. The best programs will survive, based purely on their quality and
usefulness.
Please join the experiment.
If you believe in these ideals, your contribution is solicited to help make
them work.
Many of you have written requesting an invoice so that you could initiate
payment through your company accounting system. The following invoice is
provided for those of you in this category, or for those who wish an
invoice for your tax records. Perhaps it will serve the purpose.
--------------------
INVOICE
--------------------
Purchased from:
ALAN JONES
3717 Wildwood Drive
Endwell, NY 13760
DATE: / / Invoice No. 8810
--------------------------------------------------------------
PRICE PRICE
PRODUCT QTY EACH EXTENDED
------------------------- --- ----- --------
SP: A Print Spooler
program and
documentation 1 $15 $15
Version 3.82
SALES TAX 0
--------------------------------------
PLEASE PAY THIS AMOUNT $15 TOTAL
--------------------------------------------------------------
Please make check payable to :ALAN JONES
You may retain this Invoice
for your tax records.
page 60,132
title MonoCG - IBM Monochrome Display character generator data
codeSeg segment para public 'code'
public cgData
cgData label byte
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,07Eh,081h,0A5h,081h,081h,0BDh ; 0000
db 000h,000h,07Eh,0FFh,0DBh,0FFh,0FFh,0C3h,000h,000h,000h,036h,07Fh,07Fh,07Fh,07Fh ; 0010
db 000h,000h,000h,008h,01Ch,03Eh,07Fh,03Eh,000h,000h,018h,03Ch,03Ch,0E7h,0E7h,0E7h ; 0020
db 000h,000h,018h,03Ch,07Eh,0FFh,0FFh,07Eh,000h,000h,000h,000h,000h,018h,03Ch,03Ch ; 0030
db 0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,0C3h,000h,000h,000h,000h,03Ch,066h,042h,042h ; 0040
db 0FFh,0FFh,0FFh,0FFh,0C3h,099h,0BDh,0BDh,000h,000h,00Fh,007h,00Dh,019h,03Ch,066h ; 0050
db 000h,000h,03Ch,066h,066h,066h,03Ch,018h,000h,000h,03Fh,033h,03Fh,030h,030h,030h ; 0060
db 000h,000h,07Fh,063h,07Fh,063h,063h,063h,000h,000h,018h,018h,0DBh,03Ch,0E7h,03Ch ; 0070
db 000h,000h,040h,060h,070h,07Ch,07Fh,07Ch,000h,000h,001h,003h,007h,01Fh,07Fh,01Fh ; 0080
db 000h,000h,018h,03Ch,07Eh,018h,018h,018h,000h,000h,033h,033h,033h,033h,033h,033h ; 0090
db 000h,000h,07Fh,0DBh,0DBh,0DBh,07Bh,01Bh,000h,03Eh,063h,030h,01Ch,036h,063h,063h ; 00A0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,03Ch,07Eh,018h,018h,018h ; 00B0
db 000h,000h,018h,03Ch,07Eh,018h,018h,018h,000h,000h,018h,018h,018h,018h,018h,018h ; 00C0
db 000h,000h,000h,000h,00Ch,006h,07Fh,006h,000h,000h,000h,000h,018h,030h,07Fh,030h ; 00D0
db 000h,000h,000h,000h,000h,060h,060h,060h,000h,000h,000h,000h,024h,066h,0FFh,066h ; 00E0
db 000h,000h,000h,008h,01Ch,01Ch,03Eh,03Eh,000h,000h,000h,07Fh,07Fh,03Eh,03Eh,01Ch ; 00F0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,03Ch,03Ch,03Ch,018h,018h ; 0100
db 000h,063h,063h,063h,022h,000h,000h,000h,000h,000h,036h,036h,07Fh,036h,036h,036h ; 0110
db 00Ch,00Ch,03Eh,063h,061h,060h,03Eh,003h,000h,000h,000h,000h,061h,063h,006h,00Ch ; 0120
db 000h,000h,01Ch,036h,036h,01Ch,03Bh,06Eh,000h,030h,030h,030h,060h,000h,000h,000h ; 0130
db 000h,000h,00Ch,018h,030h,030h,030h,030h,000h,000h,018h,00Ch,006h,006h,006h,006h ; 0140
db 000h,000h,000h,000h,066h,03Ch,0FFh,03Ch,000h,000h,000h,018h,018h,018h,0FFh,018h ; 0150
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,000h ; 0160
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,001h,003h,006h,00Ch,018h,030h ; 0170
db 000h,000h,03Eh,063h,067h,06Fh,07Bh,073h,000h,000h,00Ch,01Ch,03Ch,00Ch,00Ch,00Ch ; 0180
db 000h,000h,03Eh,063h,003h,006h,00Ch,018h,000h,000h,03Eh,063h,003h,003h,01Eh,003h ; 0190
db 000h,000h,006h,00Eh,01Eh,036h,066h,07Fh,000h,000h,07Fh,060h,060h,060h,07Eh,003h ; 01A0
db 000h,000h,01Ch,030h,060h,060h,07Eh,063h,000h,000h,07Fh,063h,003h,006h,00Ch,018h ; 01B0
db 000h,000h,03Eh,063h,063h,063h,03Eh,063h,000h,000h,03Eh,063h,063h,063h,03Fh,003h ; 01C0
db 000h,000h,000h,018h,018h,000h,000h,000h,000h,000h,000h,018h,018h,000h,000h,000h ; 01D0
db 000h,000h,006h,00Ch,018h,030h,060h,030h,000h,000h,000h,000h,000h,07Eh,000h,000h ; 01E0
db 000h,000h,060h,030h,018h,00Ch,006h,00Ch,000h,000h,03Eh,063h,063h,006h,00Ch,00Ch ; 01F0
db 000h,000h,03Eh,063h,063h,06Fh,06Fh,06Fh,000h,000h,008h,01Ch,036h,063h,063h,07Fh ; 0200
db 000h,000h,07Eh,033h,033h,033h,03Eh,033h,000h,000h,01Eh,033h,061h,060h,060h,060h ; 0210
db 000h,000h,07Ch,036h,033h,033h,033h,033h,000h,000h,07Fh,033h,031h,034h,03Ch,034h ; 0220
db 000h,000h,07Fh,033h,031h,034h,03Ch,034h,000h,000h,01Eh,033h,061h,060h,060h,06Fh ; 0230
db 000h,000h,063h,063h,063h,063h,07Fh,063h,000h,000h,03Ch,018h,018h,018h,018h,018h ; 0240
db 000h,000h,00Fh,006h,006h,006h,006h,006h,000h,000h,073h,033h,036h,036h,03Ch,036h ; 0250
db 000h,000h,078h,030h,030h,030h,030h,030h,000h,000h,0C3h,0E7h,0FFh,0DBh,0C3h,0C3h ; 0260
db 000h,000h,063h,073h,07Bh,07Fh,06Fh,067h,000h,000h,01Ch,036h,063h,063h,063h,063h ; 0270
db 000h,000h,07Eh,033h,033h,033h,03Eh,030h,000h,000h,03Eh,063h,063h,063h,063h,06Bh ; 0280
db 000h,000h,07Eh,033h,033h,033h,03Eh,036h,000h,000h,03Eh,063h,063h,030h,01Ch,006h ; 0290
db 000h,000h,0FFh,0DBh,099h,018h,018h,018h,000h,000h,063h,063h,063h,063h,063h,063h ; 02A0
db 000h,000h,0C3h,0C3h,0C3h,0C3h,0C3h,0C3h,000h,000h,0C3h,0C3h,0C3h,0C3h,0DBh,0DBh ; 02B0
db 000h,000h,0C3h,0C3h,066h,03Ch,018h,03Ch,000h,000h,0C3h,0C3h,0C3h,066h,03Ch,018h ; 02C0
db 000h,000h,0FFh,0C3h,086h,00Ch,018h,030h,000h,000h,03Ch,030h,030h,030h,030h,030h ; 02D0
db 000h,000h,040h,060h,070h,038h,01Ch,00Eh,000h,000h,03Ch,00Ch,00Ch,00Ch,00Ch,00Ch ; 02E0
db 008h,01Ch,036h,063h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 02F0
db 018h,018h,00Ch,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,03Ch,006h,03Eh ; 0300
db 000h,000h,070h,030h,030h,03Ch,036h,033h,000h,000h,000h,000h,000h,03Eh,063h,060h ; 0310
db 000h,000h,00Eh,006h,006h,01Eh,036h,066h,000h,000h,000h,000h,000h,03Eh,063h,07Fh ; 0320
db 000h,000h,01Ch,036h,032h,030h,07Ch,030h,000h,000h,000h,000h,000h,03Bh,066h,066h ; 0330
db 000h,000h,070h,030h,030h,036h,03Bh,033h,000h,000h,00Ch,00Ch,000h,01Ch,00Ch,00Ch ; 0340
db 000h,000h,006h,006h,000h,00Eh,006h,006h,000h,000h,070h,030h,030h,033h,036h,03Ch ; 0350
db 000h,000h,01Ch,00Ch,00Ch,00Ch,00Ch,00Ch,000h,000h,000h,000h,000h,0E6h,0FFh,0DBh ; 0360
db 000h,000h,000h,000h,000h,06Eh,033h,033h,000h,000h,000h,000h,000h,03Eh,063h,063h ; 0370
db 000h,000h,000h,000h,000h,06Eh,033h,033h,000h,000h,000h,000h,000h,03Bh,066h,066h ; 0380
db 000h,000h,000h,000h,000h,06Eh,03Bh,033h,000h,000h,000h,000h,000h,03Eh,063h,038h ; 0390
db 000h,000h,008h,018h,018h,07Eh,018h,018h,000h,000h,000h,000h,000h,066h,066h,066h ; 03A0
db 000h,000h,000h,000h,000h,0C3h,0C3h,0C3h,000h,000h,000h,000h,000h,0C3h,0C3h,0DBh ; 03B0
db 000h,000h,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h,063h,063h,063h ; 03C0
db 000h,000h,000h,000h,000h,07Fh,066h,00Ch,000h,000h,00Eh,018h,018h,018h,070h,018h ; 03D0
db 000h,000h,018h,018h,018h,018h,000h,018h,000h,000h,070h,018h,018h,018h,00Eh,018h ; 03E0
db 000h,000h,03Bh,06Eh,000h,000h,000h,000h,000h,000h,000h,000h,008h,01Ch,036h,063h ; 03F0
db 000h,000h,01Eh,033h,061h,060h,060h,061h,000h,000h,066h,066h,000h,066h,066h,066h ; 0400
db 000h,006h,00Ch,018h,000h,03Eh,063h,07Fh,000h,008h,01Ch,036h,000h,03Ch,006h,03Eh ; 0410
db 000h,000h,066h,066h,000h,03Ch,006h,03Eh,000h,030h,018h,00Ch,000h,03Ch,006h,03Eh ; 0420
db 000h,01Ch,036h,01Ch,000h,03Ch,006h,03Eh,000h,000h,000h,000h,03Ch,066h,060h,066h ; 0430
db 000h,008h,01Ch,036h,000h,03Eh,063h,07Fh,000h,000h,066h,066h,000h,03Eh,063h,07Fh ; 0440
db 000h,030h,018h,00Ch,000h,03Eh,063h,07Fh,000h,000h,066h,066h,000h,038h,018h,018h ; 0450
db 000h,018h,03Ch,066h,000h,038h,018h,018h,000h,060h,030h,018h,000h,038h,018h,018h ; 0460
db 000h,063h,063h,008h,01Ch,036h,063h,063h,01Ch,036h,01Ch,000h,01Ch,036h,063h,063h ; 0470
db 00Ch,018h,030h,000h,07Fh,033h,030h,03Eh,000h,000h,000h,000h,06Eh,03Bh,01Bh,07Eh ; 0480
db 000h,000h,01Fh,036h,066h,066h,07Fh,066h,000h,008h,01Ch,036h,000h,03Eh,063h,063h ; 0490
db 000h,000h,063h,063h,000h,03Eh,063h,063h,000h,030h,018h,00Ch,000h,03Eh,063h,063h ; 04A0
db 000h,018h,03Ch,066h,000h,066h,066h,066h,000h,030h,018h,00Ch,000h,066h,066h,066h ; 04B0
db 000h,000h,063h,063h,000h,063h,063h,063h,000h,063h,063h,01Ch,036h,063h,063h,063h ; 04C0
db 000h,063h,063h,000h,063h,063h,063h,063h,000h,018h,018h,07Eh,0C3h,0C0h,0C0h,0C3h ; 04D0
db 000h,01Ch,036h,032h,030h,078h,030h,030h,000h,000h,0C3h,066h,03Ch,018h,0FFh,018h ; 04E0
db 000h,0FCh,066h,066h,07Ch,062h,066h,06Fh,000h,00Eh,01Bh,018h,018h,018h,07Eh,018h ; 04F0
db 000h,00Ch,018h,030h,000h,03Ch,006h,03Eh,000h,00Ch,018h,030h,000h,038h,018h,018h ; 0500
db 000h,00Ch,018h,030h,000h,03Eh,063h,063h,000h,00Ch,018h,030h,000h,066h,066h,066h ; 0510
db 000h,000h,03Bh,06Eh,000h,06Eh,033h,033h,03Bh,06Eh,000h,063h,073h,07Bh,07Fh,06Fh ; 0520
db 000h,03Ch,06Ch,06Ch,03Eh,000h,07Eh,000h,000h,038h,06Ch,06Ch,038h,000h,07Ch,000h ; 0530
db 000h,000h,018h,018h,000h,018h,018h,030h,000h,000h,000h,000h,000h,000h,07Fh,060h ; 0540
db 000h,000h,000h,000h,000h,000h,07Fh,003h,000h,060h,0E0h,063h,066h,06Ch,018h,030h ; 0550
db 000h,060h,0E0h,063h,066h,06Ch,018h,033h,000h,000h,018h,018h,000h,018h,018h,03Ch ; 0560
db 000h,000h,000h,000h,01Bh,036h,06Ch,036h,000h,000h,000h,000h,06Ch,036h,01Bh,036h ; 0570
db 011h,044h,011h,044h,011h,044h,011h,044h,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh ; 0580
db 0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h,018h,018h,018h,018h,018h,018h,018h,018h ; 0590
db 018h,018h,018h,018h,018h,018h,018h,0F8h,018h,018h,018h,018h,018h,0F8h,018h,0F8h ; 05A0
db 036h,036h,036h,036h,036h,036h,036h,0F6h,000h,000h,000h,000h,000h,000h,000h,0FEh ; 05B0
db 000h,000h,000h,000h,000h,0F8h,018h,0F8h,036h,036h,036h,036h,036h,0F6h,006h,0F6h ; 05C0
db 036h,036h,036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,0FEh,006h,0F6h ; 05D0
db 036h,036h,036h,036h,036h,0F6h,006h,0FEh,036h,036h,036h,036h,036h,036h,036h,0FEh ; 05E0
db 018h,018h,018h,018h,018h,0F8h,018h,0F8h,000h,000h,000h,000h,000h,000h,000h,0F8h ; 05F0
db 018h,018h,018h,018h,018h,018h,018h,01Fh,018h,018h,018h,018h,018h,018h,018h,0FFh ; 0600
db 000h,000h,000h,000h,000h,000h,000h,0FFh,018h,018h,018h,018h,018h,018h,018h,01Fh ; 0610
db 000h,000h,000h,000h,000h,000h,000h,0FFh,018h,018h,018h,018h,018h,018h,018h,0FFh ; 0620
db 018h,018h,018h,018h,018h,01Fh,018h,01Fh,036h,036h,036h,036h,036h,036h,036h,037h ; 0630
db 036h,036h,036h,036h,036h,037h,030h,03Fh,000h,000h,000h,000h,000h,03Fh,030h,037h ; 0640
db 036h,036h,036h,036h,036h,0F7h,000h,0FFh,000h,000h,000h,000h,000h,0FFh,000h,0F7h ; 0650
db 036h,036h,036h,036h,036h,037h,030h,037h,000h,000h,000h,000h,000h,0FFh,000h,0FFh ; 0660
db 036h,036h,036h,036h,036h,0F7h,000h,0F7h,018h,018h,018h,018h,018h,0FFh,000h,0FFh ; 0670
db 036h,036h,036h,036h,036h,036h,036h,0FFh,000h,000h,000h,000h,000h,0FFh,000h,0FFh ; 0680
db 000h,000h,000h,000h,000h,000h,000h,0FFh,036h,036h,036h,036h,036h,036h,036h,03Fh ; 0690
db 018h,018h,018h,018h,018h,01Fh,018h,01Fh,000h,000h,000h,000h,000h,01Fh,018h,01Fh ; 06A0
db 000h,000h,000h,000h,000h,000h,000h,03Fh,036h,036h,036h,036h,036h,036h,036h,0FFh ; 06B0
db 018h,018h,018h,018h,018h,0FFh,018h,0FFh,018h,018h,018h,018h,018h,018h,018h,0F8h ; 06C0
db 000h,000h,000h,000h,000h,000h,000h,01Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; 06D0
db 000h,000h,000h,000h,000h,000h,000h,0FFh,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h ; 06E0
db 00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h ; 06F0
db 000h,000h,000h,000h,000h,03Bh,06Eh,06Ch,000h,000h,000h,000h,03Eh,063h,07Eh,063h ; 0700
db 000h,000h,07Fh,063h,063h,060h,060h,060h,000h,000h,000h,000h,07Fh,036h,036h,036h ; 0710
db 000h,000h,07Fh,063h,030h,018h,00Ch,018h,000h,000h,000h,000h,000h,03Fh,06Ch,06Ch ; 0720
db 000h,000h,000h,000h,033h,033h,033h,033h,000h,000h,000h,000h,03Bh,06Eh,00Ch,00Ch ; 0730
db 000h,000h,07Eh,018h,03Ch,066h,066h,066h,000h,000h,01Ch,036h,063h,063h,07Fh,063h ; 0740
db 000h,000h,01Ch,036h,063h,063h,063h,036h,000h,000h,01Eh,030h,018h,00Ch,03Eh,066h ; 0750
db 000h,000h,000h,000h,000h,07Eh,0DBh,0DBh,000h,000h,003h,006h,07Eh,0DBh,0DBh,0F3h ; 0760
db 000h,000h,01Ch,030h,060h,060h,07Ch,060h,000h,000h,000h,03Eh,063h,063h,063h,063h ; 0770
db 000h,000h,000h,07Fh,000h,000h,07Fh,000h,000h,000h,018h,018h,018h,0FFh,018h,018h ; 0780
db 000h,000h,030h,018h,00Ch,006h,00Ch,018h,000h,000h,00Ch,018h,030h,060h,030h,018h ; 0790
db 000h,000h,00Eh,01Bh,01Bh,018h,018h,018h,018h,018h,018h,018h,018h,018h,018h,018h ; 07A0
db 000h,000h,018h,018h,000h,000h,0FFh,000h,000h,000h,000h,000h,03Bh,06Eh,000h,03Bh ; 07B0
db 000h,038h,06Ch,06Ch,038h,000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,018h ; 07C0
db 000h,000h,000h,000h,000h,000h,000h,018h,000h,00Fh,00Ch,00Ch,00Ch,00Ch,00Ch,0ECh ; 07D0
db 000h,0D8h,06Ch,06Ch,06Ch,06Ch,06Ch,000h,000h,070h,0D8h,030h,060h,0C8h,0F8h,000h ; 07E0
db 000h,000h,000h,000h,03Eh,03Eh,03Eh,03Eh,000h,000h,000h,000h,000h,000h,000h,000h ; 07F0
db 000h,000h,000h,000h,000h,000h,000h,000h,099h,081h,07Eh,000h,000h,000h,000h,000h ; 0800
db 0E7h,0FFh,07Eh,000h,000h,000h,000h,000h,03Eh,01Ch,008h,000h,000h,000h,000h,000h ; 0810
db 01Ch,008h,000h,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0820
db 018h,018h,03Ch,000h,000h,000h,000h,000h,018h,000h,000h,000h,000h,000h,000h,000h ; 0830
db 0E7h,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,066h,03Ch,000h,000h,000h,000h,000h,000h ; 0840
db 099h,0C3h,0FFh,0FFh,0FFh,0FFh,000h,000h,066h,066h,03Ch,000h,000h,000h,000h,000h ; 0850
db 07Eh,018h,018h,000h,000h,000h,000h,000h,070h,0F0h,0E0h,000h,000h,000h,000h,000h ; 0860
db 067h,0E7h,0E6h,0C0h,000h,000h,000h,000h,0DBh,018h,018h,000h,000h,000h,000h,000h ; 0870
db 070h,060h,040h,000h,000h,000h,000h,000h,007h,003h,001h,000h,000h,000h,000h,000h ; 0880
db 07Eh,03Ch,018h,000h,000h,000h,000h,000h,000h,033h,033h,000h,000h,000h,000h,000h ; 0890
db 01Bh,01Bh,01Bh,000h,000h,000h,000h,000h,036h,01Ch,006h,063h,03Eh,000h,000h,000h ; 08A0
db 07Fh,07Fh,07Fh,000h,000h,000h,000h,000h,07Eh,03Ch,018h,07Eh,000h,000h,000h,000h ; 08B0
db 018h,018h,018h,000h,000h,000h,000h,000h,07Eh,03Ch,018h,000h,000h,000h,000h,000h ; 08C0
db 00Ch,000h,000h,000h,000h,000h,000h,000h,018h,000h,000h,000h,000h,000h,000h,000h ; 08D0
db 07Fh,000h,000h,000h,000h,000h,000h,000h,024h,000h,000h,000h,000h,000h,000h,000h ; 08E0
db 07Fh,07Fh,000h,000h,000h,000h,000h,000h,01Ch,008h,000h,000h,000h,000h,000h,000h ; 08F0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,000h,000h,000h,000h,000h ; 0900
db 000h,000h,000h,000h,000h,000h,000h,000h,07Fh,036h,036h,000h,000h,000h,000h,000h ; 0910
db 043h,063h,03Eh,00Ch,00Ch,000h,000h,000h,018h,033h,063h,000h,000h,000h,000h,000h ; 0920
db 066h,066h,03Bh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0930
db 030h,018h,00Ch,000h,000h,000h,000h,000h,006h,00Ch,018h,000h,000h,000h,000h,000h ; 0940
db 066h,000h,000h,000h,000h,000h,000h,000h,018h,018h,000h,000h,000h,000h,000h,000h ; 0950
db 018h,018h,018h,030h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0960
db 000h,018h,018h,000h,000h,000h,000h,000h,060h,040h,000h,000h,000h,000h,000h,000h ; 0970
db 063h,063h,03Eh,000h,000h,000h,000h,000h,00Ch,00Ch,03Fh,000h,000h,000h,000h,000h ; 0980
db 030h,063h,07Fh,000h,000h,000h,000h,000h,003h,063h,03Eh,000h,000h,000h,000h,000h ; 0990
db 006h,006h,00Fh,000h,000h,000h,000h,000h,003h,063h,03Eh,000h,000h,000h,000h,000h ; 09A0
db 063h,063h,03Eh,000h,000h,000h,000h,000h,018h,018h,018h,000h,000h,000h,000h,000h ; 09B0
db 063h,063h,03Eh,000h,000h,000h,000h,000h,003h,006h,03Ch,000h,000h,000h,000h,000h ; 09C0
db 018h,018h,000h,000h,000h,000h,000h,000h,018h,018h,030h,000h,000h,000h,000h,000h ; 09D0
db 018h,00Ch,006h,000h,000h,000h,000h,000h,07Eh,000h,000h,000h,000h,000h,000h,000h ; 09E0
db 018h,030h,060h,000h,000h,000h,000h,000h,000h,00Ch,00Ch,000h,000h,000h,000h,000h ; 09F0
db 06Eh,060h,03Eh,000h,000h,000h,000h,000h,063h,063h,063h,000h,000h,000h,000h,000h ; 0A00
db 033h,033h,07Eh,000h,000h,000h,000h,000h,061h,033h,01Eh,000h,000h,000h,000h,000h ; 0A10
db 033h,036h,07Ch,000h,000h,000h,000h,000h,031h,033h,07Fh,000h,000h,000h,000h,000h ; 0A20
db 030h,030h,078h,000h,000h,000h,000h,000h,063h,033h,01Dh,000h,000h,000h,000h,000h ; 0A30
db 063h,063h,063h,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0A40
db 066h,066h,03Ch,000h,000h,000h,000h,000h,036h,033h,073h,000h,000h,000h,000h,000h ; 0A50
db 031h,033h,07Fh,000h,000h,000h,000h,000h,0C3h,0C3h,0C3h,000h,000h,000h,000h,000h ; 0A60
db 063h,063h,063h,000h,000h,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h ; 0A70
db 030h,030h,078h,000h,000h,000h,000h,000h,06Fh,03Eh,006h,007h,000h,000h,000h,000h ; 0A80
db 033h,033h,073h,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0A90
db 018h,018h,03Ch,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0AA0
db 066h,03Ch,018h,000h,000h,000h,000h,000h,0FFh,066h,066h,000h,000h,000h,000h,000h ; 0AB0
db 066h,0C3h,0C3h,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0AC0
db 061h,0C3h,0FFh,000h,000h,000h,000h,000h,030h,030h,03Ch,000h,000h,000h,000h,000h ; 0AD0
db 007h,003h,001h,000h,000h,000h,000h,000h,00Ch,00Ch,03Ch,000h,000h,000h,000h,000h ; 0AE0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,000h,000h,000h ; 0AF0
db 000h,000h,000h,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0B00
db 033h,033h,06Eh,000h,000h,000h,000h,000h,060h,063h,03Eh,000h,000h,000h,000h,000h ; 0B10
db 066h,066h,03Bh,000h,000h,000h,000h,000h,060h,063h,03Eh,000h,000h,000h,000h,000h ; 0B20
db 030h,030h,078h,000h,000h,000h,000h,000h,066h,03Eh,006h,066h,03Ch,000h,000h,000h ; 0B30
db 033h,033h,073h,000h,000h,000h,000h,000h,00Ch,00Ch,01Eh,000h,000h,000h,000h,000h ; 0B40
db 006h,006h,066h,066h,03Ch,000h,000h,000h,036h,033h,073h,000h,000h,000h,000h,000h ; 0B50
db 00Ch,00Ch,01Eh,000h,000h,000h,000h,000h,0DBh,0DBh,0DBh,000h,000h,000h,000h,000h ; 0B60
db 033h,033h,033h,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0B70
db 033h,03Eh,030h,030h,078h,000h,000h,000h,066h,03Eh,006h,006h,00Fh,000h,000h,000h ; 0B80
db 030h,030h,078h,000h,000h,000h,000h,000h,00Eh,063h,03Eh,000h,000h,000h,000h,000h ; 0B90
db 018h,01Bh,00Eh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0BA0
db 066h,03Ch,018h,000h,000h,000h,000h,000h,0DBh,0FFh,066h,000h,000h,000h,000h,000h ; 0BB0
db 01Ch,036h,063h,000h,000h,000h,000h,000h,063h,03Fh,003h,006h,03Ch,000h,000h,000h ; 0BC0
db 018h,033h,07Fh,000h,000h,000h,000h,000h,018h,018h,00Eh,000h,000h,000h,000h,000h ; 0BD0
db 018h,018h,018h,000h,000h,000h,000h,000h,018h,018h,070h,000h,000h,000h,000h,000h ; 0BE0
db 000h,000h,000h,000h,000h,000h,000h,000h,063h,07Fh,000h,000h,000h,000h,000h,000h ; 0BF0
db 033h,01Eh,006h,003h,03Eh,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0C00
db 060h,063h,03Eh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0C10
db 066h,066h,03Bh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0C20
db 066h,066h,03Bh,000h,000h,000h,000h,000h,03Ch,00Ch,006h,03Ch,000h,000h,000h,000h ; 0C30
db 060h,063h,03Eh,000h,000h,000h,000h,000h,060h,063h,03Eh,000h,000h,000h,000h,000h ; 0C40
db 060h,063h,03Eh,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0C50
db 018h,018h,03Ch,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0C60
db 07Fh,063h,063h,000h,000h,000h,000h,000h,07Fh,063h,063h,000h,000h,000h,000h,000h ; 0C70
db 030h,033h,07Fh,000h,000h,000h,000h,000h,0D8h,0DCh,077h,000h,000h,000h,000h,000h ; 0C80
db 066h,066h,067h,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0C90
db 063h,063h,03Eh,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0CA0
db 066h,066h,03Bh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0CB0
db 063h,03Fh,003h,006h,03Ch,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h ; 0CC0
db 063h,063h,03Eh,000h,000h,000h,000h,000h,07Eh,018h,018h,000h,000h,000h,000h,000h ; 0CD0
db 030h,073h,07Eh,000h,000h,000h,000h,000h,0FFh,018h,018h,000h,000h,000h,000h,000h ; 0CE0
db 066h,066h,0F3h,000h,000h,000h,000h,000h,018h,018h,018h,0D8h,070h,000h,000h,000h ; 0CF0
db 066h,066h,03Bh,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0D00
db 063h,063h,03Eh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0D10
db 033h,033h,033h,000h,000h,000h,000h,000h,067h,063h,063h,000h,000h,000h,000h,000h ; 0D20
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0D30
db 063h,063h,03Eh,000h,000h,000h,000h,000h,060h,060h,000h,000h,000h,000h,000h,000h ; 0D40
db 003h,003h,000h,000h,000h,000h,000h,000h,06Eh,0C3h,006h,00Ch,01Fh,000h,000h,000h ; 0D50
db 067h,0CFh,01Fh,003h,003h,000h,000h,000h,03Ch,03Ch,018h,000h,000h,000h,000h,000h ; 0D60
db 01Bh,000h,000h,000h,000h,000h,000h,000h,06Ch,000h,000h,000h,000h,000h,000h,000h ; 0D70
db 011h,044h,011h,044h,011h,044h,000h,000h,055h,0AAh,055h,0AAh,055h,0AAh,000h,000h ; 0D80
db 0DDh,077h,0DDh,077h,0DDh,077h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0D90
db 018h,018h,018h,018h,018h,018h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0DA0
db 036h,036h,036h,036h,036h,036h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0DB0
db 018h,018h,018h,018h,018h,018h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0DC0
db 036h,036h,036h,036h,036h,036h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0DD0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0DE0
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0DF0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E00
db 018h,018h,018h,018h,018h,018h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0E10
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0E20
db 018h,018h,018h,018h,018h,018h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0E30
db 000h,000h,000h,000h,000h,000h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0E40
db 000h,000h,000h,000h,000h,000h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0E50
db 036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E60
db 036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E70
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0E80
db 036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E90
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0EA0
db 036h,036h,036h,036h,036h,036h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0EB0
db 018h,018h,018h,018h,018h,018h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0EC0
db 018h,018h,018h,018h,018h,018h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h ; 0ED0
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,000h,000h ; 0EE0
db 00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0EF0
db 06Ch,06Eh,03Bh,000h,000h,000h,000h,000h,063h,07Eh,060h,060h,020h,000h,000h,000h ; 0F00
db 060h,060h,060h,000h,000h,000h,000h,000h,036h,036h,036h,000h,000h,000h,000h,000h ; 0F10
db 030h,063h,07Fh,000h,000h,000h,000h,000h,06Ch,06Ch,038h,000h,000h,000h,000h,000h ; 0F20
db 03Eh,030h,030h,060h,000h,000h,000h,000h,00Ch,00Ch,00Ch,000h,000h,000h,000h,000h ; 0F30
db 03Ch,018h,07Eh,000h,000h,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h ; 0F40
db 036h,036h,077h,000h,000h,000h,000h,000h,066h,066h,03Ch,000h,000h,000h,000h,000h ; 0F50
db 07Eh,000h,000h,000h,000h,000h,000h,000h,07Eh,060h,0C0h,000h,000h,000h,000h,000h ; 0F60
db 060h,030h,01Ch,000h,000h,000h,000h,000h,063h,063h,063h,000h,000h,000h,000h,000h ; 0F70
db 000h,07Fh,000h,000h,000h,000h,000h,000h,018h,000h,0FFh,000h,000h,000h,000h,000h ; 0F80
db 030h,000h,07Eh,000h,000h,000h,000h,000h,00Ch,000h,07Eh,000h,000h,000h,000h,000h ; 0F90
db 018h,018h,018h,018h,018h,018h,000h,000h,0D8h,0D8h,070h,000h,000h,000h,000h,000h ; 0FA0
db 000h,018h,018h,000h,000h,000h,000h,000h,06Eh,000h,000h,000h,000h,000h,000h,000h ; 0FB0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0FC0
db 000h,000h,000h,000h,000h,000h,000h,000h,06Ch,03Ch,01Ch,000h,000h,000h,000h,000h ; 0FD0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0FE0
db 03Eh,03Eh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0FF0
codeSeg endS
end
page 60,132
title PrtScFX - FX-80 monochrome graphics print screen patch
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Written by: Michael Geary ;;
;; P.O. Box 1479 ;;
;; Los Gatos, CA 95031 ;;
;; (408) 354-4400 ;;
;; ;;
;; This program is placed in the public domain without restriction. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; macros
print macro char
ifnb <char>
mov al, char
endif
call prtChar
endM
video macro fun
mov ah, fun
int 10h
endM
DOS macro fun
mov ah, fun
int 21h
endM
; character codes
CR equ 13
LF equ 10
ESC equ 27
; interrupt numbers
PrtSc equ 05h
keyboard equ 16h
time equ 1Ah
; interrupt vector locations in absolute zero segment
absSeg segment at 0
org PrtSc * 4
PrtScIntOffset dw ?
PrtScIntSeg dw ?
absSeg endS
; screen addresses & stuff
monoSeg equ 0B000h
graphSeg equ 0B800h
row25offset equ 24 * 160
monoBigCrs equ 000Dh
graphBigCrs equ 0007h
monoNrmCrs equ 0C0Dh
graphNrmCrs equ 0607h
save25 equ 60h ; use program segment prefix as scratch area
codeSeg segment para public 'code'
extrn cgData:byte
stkSize equ 256
cgSize equ 4096
theEnd equ offset cgData + cgSize + stkSize
org 100h
printScreen proc far
assume cs:codeSeg, ds:codeSeg, ss:codeSeg, es:absSeg
mov dx, offset credit
DOS 9
call cksum
mov ckSave, dx
mov SPinit, theEnd
mov SSinit, cs
xor ax, ax
mov es, ax
CLI
mov ax, PrtScIntOffset
mov SaveIntOffset, ax
mov ax, PrtScIntSeg
mov SaveIntSeg, ax
mov PrtScIntOffset, offset doPrint
push cs
pop PrtScIntSeg
STI
mov dx, theEnd
int 27h
SPinit dw ? ; value to load into SP
SSinit dw ? ; and SS when dump routine called
SPsave dw ? ; saved value of SP and SS at start of dump
SSsave dw 0 ; routine (SSsave=0 means not currently active)
ckSave dw ? ; saved checksum for stack overflow check
scrSeg dw ? ; B000 or B800 screen segment
pageNo db ? ; BIOS's page #
crsPos dw ? ; user's cursor row & column
crsType dw ? ; user's cursor type (size)
bigCrs dw ? ; our big cursor
saveInt label dword ; holds the "other" PrtSc interrupt vector
SaveIntOffset dw ?
SaveIntSeg dw ?
paper216ths db ? ; paper advance after pass (12/216 or 24/216 ")
dotsPerPass db ? ; # dot rows covered in a pass (4 or 8)
lastCol db ? ; last nonblank char col in this print row
prompt db ' G = text graphics dump, D = darker grap'
db 'hics, SPACE = normal dump, Esc = cancel ',0
overflow db ' Stack Overflow ',0
credit db CR,LF,'PrtScFX version 1.4 by Michael Geary',CR,LF,'$'
; PrtSc entry point
doPrint:
assume cs:codeSeg, ds:nothing, ss:nothing, es:nothing
cmp SSsave, 0
jz startOK
jmp allDone ; already running, no dice
startOK:
CLI
mov SPsave, sp
mov SSsave, ss
mov ss, SSinit
mov sp, SPinit
STI
push ds
push es
push ax
push bx
push cx
push dx
push si
push di
push bp
video 15 ; get CRT mode in AL
mov pageNo, bh
mov dx, monoSeg
mov cx, monoBigCrs
mov si, monoNrmCrs
cmp al, 7 ; must be monochrome
je newDump
mov dx, graphSeg
xor bl, bl
add dx, bx ; (current page segment)
mov cx, graphBigCrs
mov si, graphNrmCrs
and al, 0FEh
cmp al, 2 ; or 80 column text mode (2 or 3)
je newDump
jmp oldDump
newDump:
mov scrSeg, dx
mov bigCrs, cx
mov crsType, si
video 3 ; save cursor
mov crsPos, dx
cmp cx, 0067h ; avoid ROM bug - incorrect
je weirdCrs ; cursor type of 67h
mov crsType, cx
weirdCrs:
or ch, 20h
video 1 ; turn cursor off
push cs ; * * * * * * ProKey kludge!!!
pop ds
xor ax, ax
mov es, ax
les si, dword ptr es:24h ; interrupt 9 (keyboard)
cmp word ptr es:[si], 0F62Eh
jne notProKey
mov si, es:3[si] ; looks like ProKey, get their flag
test byte ptr es:[si], 0FFh
jnz notProKey ; not active
push ax
mov cx, bigCrs
video 1 ; put up a big fat cursor
pop ax
jmp oldDump ; ProKey is active, do old dump!
notProKey:
mov ds, scrSeg
mov si, row25offset
push cs
pop es
mov di, save25
mov cx, 80
rep movsw ; save row 25
push cs
pop ds
assume ds:codeSeg ; leave DS alone from now on
mov si, offset prompt
call message
kbdClr: mov ah, 1 ; clear keyboard buffer
int keyboard
pushf
xor ah, ah ; and read a key
int keyboard
popf
jnz kbdClr
mov si, save25
mov es, scrSeg
mov di, row25offset
mov cx, 80
rep movsw ; restore row 25
cmp al, 27 ; exit if Esc
jne notEsc
jmp prtDone
notEsc:
and al, 0DFh ; convert lower case --> upper
push ax
mov cx, bigCrs
video 1 ; put up a big fat cursor
pop ax
xor ch, ch ; CH = char row
xor dh, dh ; DH = dot row
mov paper216ths, 24
mov dotsPerPass, 8
cmp al, 'G'
je doGraphics
dec ch ; double strike starts at char row -1
mov dh, 10 ; dot row 10 (to do the first strike
mov paper216ths, 12 ; of the top 4 dot lines of row 0)
mov dotsPerPass, 4
cmp al, 'D'
je doGraphics
oldDump:
pushf
call SaveInt ; call the other dump routine
jmp prtDone
doGraphics:
print CR ; CR-LF to tension paper
print LF
nextRow: ; here to begin a character row
push cx
push dx
mov dh, ch
xor dl, dl
mov bh, pageNo
video 2 ; put a big cursor on current row
pop dx
pop cx
mov cl, 79
chkNxtChr: ; here to check a char col for nonblank
mov dl, 7
chkNxtDotCol: ; here to check a dot col for nonblank
call getDotCol
test al, al
jnz startRow
dec dl
jge chkNxtDotCol
dec cl
jge chkNxtChr
jmp advPaper ; nothing at to print on this row
startRow:
mov lastCol, cl
inc cl
mov al, 9
mul cl
mov bx, ax ; bx = number of dot cols to print
print ESC
print '*' ; set 720 dot graphics mode
print 6
print bl ; with the exact number of dots
print bh
mov cl, 0 ; CL = char col
nextChar: ; here to dump one character column
mov dl, 7 ; DL = dot col
nextCol: ; here for each dot column
call getDotCol
print
dec dl
cmp dl, -1
jge nextCol
inc cl
cmp cl, lastCol
jle nextChar
advPaper:
print CR
print ESC
print 'J'
print paper216ths
add dh, dotsPerPass
cmp dh, 14
jge sub14
jmp nextRow
sub14:
sub dh, 14
inc ch
cmp ch, 25
jge prtDone
jmp nextRow
prtDone:
call oldCursor
call cksum
cmp dx, ckSave
je exitOK
mov si, offset overflow ; stack overflow, complain
call message
exitOK:
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
CLI
mov ss, cs: SSsave
mov sp, cs: SPsave
mov cs: SSsave, 0
allDone:
STI
iRet
printScreen endP
; Call with CH=char row, CL=char col, DH=topmost dot row, DL=dot col.
; Returns with the dot column byte for printing in AL.
getDotCol proc near
push bx
xor bx, bx ; BH=dot row offset, BL=dot accumulator
nextDot: ; here for each dot vertically
push dx
add dh, bh
call getDot
pop dx
shl bl, 1
or bl, al
inc bh
cmp bh, 8
jl nextDot
mov al, bl
pop bx
ret
getDotCol endP
; Call with CH=char row, CL=char col, DH=dot row, DL=dot col.
; Returns with the dot in AL bit 0.
getDot proc near
push bx
push cx
push dx
cmp dh, 14 ; are we really in next char row?
jl gd1
inc ch ; yes, adjust char and dot rows
sub dh, 14
gd1:
xor al, al
or ch, ch
jl gdRet
cmp ch, 25
jge gdRet ; return 0 if outside screen bounds
call getCA ; AH = attr, AL = char
or dl, dl ; special check for dot col "-1"
jge gd2
cmp al, 192
jl gd3
cmp al, 223
jle gd4
gd3: xor al, al ; col -1 not in 192..223 is 0
jmp gd6
gd4: xor dl, dl ; col -1 in 192..223 duplicates col 0
gd2:
mov bl, al
xor bh, bh
shl bx, 1
shl bx, 1
shl bx, 1
push dx
mov dl, dh
xor dh, dh
add bx, dx ; BX = (chr*8) + dotRow
pop dx
cmp dh, 8
jl gd5
add bx, 2040 ; dot rows 8-13 are higher in ROM
gd5:
mov al, cgData[bx] ; get the character data
mov cl, dl
shr al, cl ; shift dot into position
and al, 1
gd6:
and ah, 77h
cmp ah, 70h ; check for reverse video
jne gd7
xor al, 1 ; yes, toggle the dot
gd7:
cmp dh, 12 ; is this the underline dot row?
jne gd8
cmp scrSeg, monoSeg ; yes, are we on a monochrome display?
jne gd8
cmp ah, 1 ; yes, is the underline attribute set?
jne gd8
mov al, 1 ; yes, dot on
gd8:
gdRet:
pop dx
pop cx
pop bx
ret
getDot endP
; Call with CH=row, CL=col. Returns with AH=attribute, AL=character.
getCA proc near
push bx
push cx
mov al, 80
imul ch
xor ch, ch
add ax, cx
shl ax, 1
mov bx, ax
mov ax, scrSeg
mov es, ax
mov ax, es:[bx]
pop cx
pop bx
ret
getCA endP
;prints the character in AL
prtChar proc near
push dx
xor dx, dx
xor ah, ah
int 17h
pop dx
test ah, 25h
jz prtRet
pop dx ; get rid of our return address
jmp prtDone
prtRet: ret
prtChar endP
; restores user's cursor
oldCursor proc near
push cs
pop ds
mov bh, pageNo
mov dx, crsPos
video 2 ; restore cursor position
mov cx, crsType
video 1 ; and type
ret
oldCursor endP
; display the message at [si] in reverse video at the bottom of the screen.
; doesn't worry about snow on color screen. clobbers di.
message proc near
mov es, scrSeg
mov di, row25offset
mov ah, 70h ; reverse video
prmLp: lodsb
test al, al
jz prmRet
stosw
jmp prmLp
prmRet: ret
message endP
; calculates a checksum for the character generator data, returns it in DX.
; used for stack overflow checking. clobbers si, cx.
cksum proc near
mov si, offset cgData
mov cx, cgSize / 2
xor dx, dx
ckLp: lodsw
xor dx, ax
loop ckLp
ret
cksum endP
codeSeg endS
end printScreen
PRTSCFX.DOC -- Documentation for PrtScFX 9/24/84
-------------------------------------------------------------------------------
Version 1.3
This version fixes a bug in 1.2 where the "D" dark print mode missed
part of the top line of the screen.
Be warned that ProKey has a bug which makes it crash if it is used with
PrtScFX. Because of this bug, PrtScFX attempts to determine (when you
press Shift-PrtSc) whether ProKey is active. If it is, a normal screen
dump is done instead of giving you the choice of a graphics dump. You
can include both ProKey and PrtScFX in your AUTOEXEC, but if you do, you
will not be able to get graphics dumps until you do a PROKEY/Q command
to disable ProKey.
Also, the test for discovering ProKey's presence is imperfect. If you
are running a program which grabs the keyboard interrupt (such as
Framework or BASICA), PrtScFX may not be able to tell that ProKey is
active. To be completely safe, such programs should be run from batch
files which disable ProKey. For example, if you use Framework, you
might rename FW.EXE as FRAMEWRK.EXE and then use a FW.BAT file
containing these commands:
prokey /q
cd \frame (or wherever)
framewrk
prokey /i
(If you have Framework V1.00, you will need to do this anyway, since it
does not get along with ProKey.)
-------------------------------------------------------------------------------
PrtScFX is a screen dump program which prints a graphic image of a text
mode display on an Epson FX or RX (not MX!) series printer. The printout
looks just like a screen display, including connected line graphics.
This is different from other graphics dumps, such as IBM's GRAPHICS program.
GRAPHICS dumps a graphics mode screen; PrtScFX dumps a text mode screen.
PrtScFX should be run once, typically from your AUTOEXEC.BAT file. From
then on, if you are in 80 column text mode, the Shift-Prtsc key will give
you the prompt:
G = text graphics dump, D = darker graphics, SPACE = normal dump, Esc = cancel
and you can type:
G for a text mode graphics dump
D for a better quality (double-strike) text graphics dump
Space Bar for a "normal" screen dump (passes the request on to the
standard - or other special - screen dump utility)
Esc to cancel the screen dump request
Either the IBM Monochrome Display or the color/graphics adapter can be
used, but only 80-column TEXT mode displays are dumped. For either display
adapter, the printout duplicates the font of the IBM Monochrome Display.
PrtScFX coexists nicely with IBM's GRAPHICS program. Just run them both in
your AUTOEXEC (in either order), and then GRAPHICS will handle graphics
mode displays, and PrtScFX will kick in for text mode.
PrtScFX produced the illustrations of Transend PC screens in my article
(with Richard Moore), "A Communications Package for the IBM PC", in the
November 1983 BYTE magazine. For camera-ready art like this, I recommend:
* A fairly fresh ribbon - but not brand new (smudges). The one we used
in the article was a little faint.
* Good quality bond paper - not typical printout paper (the ink bleeds).
* If available, friction feed instead of pin feed - better registration.
* The D option for double-strike graphics.
In the article, we used a ribbon that was just a little too faint.
PrtScFX is placed in the public domain without restriction.
Michael Geary
P.O. Box 1479
Los Gatos, CA 95031
(408) 354-0175
FILES
-----
If you just want to use PrtScFX, you just need PRTSCFX.COM
If you want to modify and/or re-assemble PrtScFX, the source files are
PRTSCFX.ASM and MONOCG.ASM. The latter file contains the character
generator data from the ROM on the display adapters. If you don't need to
modify this, just use MONOCG.OBJ.
ASSEMBLING & LINKING
--------------------
(change drive letters as needed)
B>masm PrtScFX ;
B>masm MonoCG ; (omit if you have MONOCG.OBJ)
B>link PrtScFX + MonoCG ;
If you have the Spacemaker program by Realia, Inc.:
B>sm PrtScFX ; /s
If you don't have Spacemaker, you should get it! For now, use:
B>exe2bin PrtScFX.exe PrtScFX.com
(Your .COM file will be larger using exe2bin)
B>erase PrtScFX.exe
Suggested modifications: Handle 40 column text, clean up & document code
(sorry, it started out as a "quick and dirty" program).
page 60,132
title MonoCG - IBM Monochrome Display character generator data
codeSeg segment para public 'code'
public cgData
cgData label byte
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,07Eh,081h,0A5h,081h,081h,0BDh ; 0000
db 000h,000h,07Eh,0FFh,0DBh,0FFh,0FFh,0C3h,000h,000h,000h,036h,07Fh,07Fh,07Fh,07Fh ; 0010
db 000h,000h,000h,008h,01Ch,03Eh,07Fh,03Eh,000h,000h,018h,03Ch,03Ch,0E7h,0E7h,0E7h ; 0020
db 000h,000h,018h,03Ch,07Eh,0FFh,0FFh,07Eh,000h,000h,000h,000h,000h,018h,03Ch,03Ch ; 0030
db 0FFh,0FFh,0FFh,0FFh,0FFh,0E7h,0C3h,0C3h,000h,000h,000h,000h,03Ch,066h,042h,042h ; 0040
db 0FFh,0FFh,0FFh,0FFh,0C3h,099h,0BDh,0BDh,000h,000h,00Fh,007h,00Dh,019h,03Ch,066h ; 0050
db 000h,000h,03Ch,066h,066h,066h,03Ch,018h,000h,000h,03Fh,033h,03Fh,030h,030h,030h ; 0060
db 000h,000h,07Fh,063h,07Fh,063h,063h,063h,000h,000h,018h,018h,0DBh,03Ch,0E7h,03Ch ; 0070
db 000h,000h,040h,060h,070h,07Ch,07Fh,07Ch,000h,000h,001h,003h,007h,01Fh,07Fh,01Fh ; 0080
db 000h,000h,018h,03Ch,07Eh,018h,018h,018h,000h,000h,033h,033h,033h,033h,033h,033h ; 0090
db 000h,000h,07Fh,0DBh,0DBh,0DBh,07Bh,01Bh,000h,03Eh,063h,030h,01Ch,036h,063h,063h ; 00A0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,03Ch,07Eh,018h,018h,018h ; 00B0
db 000h,000h,018h,03Ch,07Eh,018h,018h,018h,000h,000h,018h,018h,018h,018h,018h,018h ; 00C0
db 000h,000h,000h,000h,00Ch,006h,07Fh,006h,000h,000h,000h,000h,018h,030h,07Fh,030h ; 00D0
db 000h,000h,000h,000h,000h,060h,060h,060h,000h,000h,000h,000h,024h,066h,0FFh,066h ; 00E0
db 000h,000h,000h,008h,01Ch,01Ch,03Eh,03Eh,000h,000h,000h,07Fh,07Fh,03Eh,03Eh,01Ch ; 00F0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,03Ch,03Ch,03Ch,018h,018h ; 0100
db 000h,063h,063h,063h,022h,000h,000h,000h,000h,000h,036h,036h,07Fh,036h,036h,036h ; 0110
db 00Ch,00Ch,03Eh,063h,061h,060h,03Eh,003h,000h,000h,000h,000h,061h,063h,006h,00Ch ; 0120
db 000h,000h,01Ch,036h,036h,01Ch,03Bh,06Eh,000h,030h,030h,030h,060h,000h,000h,000h ; 0130
db 000h,000h,00Ch,018h,030h,030h,030h,030h,000h,000h,018h,00Ch,006h,006h,006h,006h ; 0140
db 000h,000h,000h,000h,066h,03Ch,0FFh,03Ch,000h,000h,000h,018h,018h,018h,0FFh,018h ; 0150
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,000h ; 0160
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,001h,003h,006h,00Ch,018h,030h ; 0170
db 000h,000h,03Eh,063h,067h,06Fh,07Bh,073h,000h,000h,00Ch,01Ch,03Ch,00Ch,00Ch,00Ch ; 0180
db 000h,000h,03Eh,063h,003h,006h,00Ch,018h,000h,000h,03Eh,063h,003h,003h,01Eh,003h ; 0190
db 000h,000h,006h,00Eh,01Eh,036h,066h,07Fh,000h,000h,07Fh,060h,060h,060h,07Eh,003h ; 01A0
db 000h,000h,01Ch,030h,060h,060h,07Eh,063h,000h,000h,07Fh,063h,003h,006h,00Ch,018h ; 01B0
db 000h,000h,03Eh,063h,063h,063h,03Eh,063h,000h,000h,03Eh,063h,063h,063h,03Fh,003h ; 01C0
db 000h,000h,000h,018h,018h,000h,000h,000h,000h,000h,000h,018h,018h,000h,000h,000h ; 01D0
db 000h,000h,006h,00Ch,018h,030h,060h,030h,000h,000h,000h,000h,000h,07Eh,000h,000h ; 01E0
db 000h,000h,060h,030h,018h,00Ch,006h,00Ch,000h,000h,03Eh,063h,063h,006h,00Ch,00Ch ; 01F0
db 000h,000h,03Eh,063h,063h,06Fh,06Fh,06Fh,000h,000h,008h,01Ch,036h,063h,063h,07Fh ; 0200
db 000h,000h,07Eh,033h,033h,033h,03Eh,033h,000h,000h,01Eh,033h,061h,060h,060h,060h ; 0210
db 000h,000h,07Ch,036h,033h,033h,033h,033h,000h,000h,07Fh,033h,031h,034h,03Ch,034h ; 0220
db 000h,000h,07Fh,033h,031h,034h,03Ch,034h,000h,000h,01Eh,033h,061h,060h,060h,06Fh ; 0230
db 000h,000h,063h,063h,063h,063h,07Fh,063h,000h,000h,03Ch,018h,018h,018h,018h,018h ; 0240
db 000h,000h,00Fh,006h,006h,006h,006h,006h,000h,000h,073h,033h,036h,036h,03Ch,036h ; 0250
db 000h,000h,078h,030h,030h,030h,030h,030h,000h,000h,0C3h,0E7h,0FFh,0DBh,0C3h,0C3h ; 0260
db 000h,000h,063h,073h,07Bh,07Fh,06Fh,067h,000h,000h,01Ch,036h,063h,063h,063h,063h ; 0270
db 000h,000h,07Eh,033h,033h,033h,03Eh,030h,000h,000h,03Eh,063h,063h,063h,063h,06Bh ; 0280
db 000h,000h,07Eh,033h,033h,033h,03Eh,036h,000h,000h,03Eh,063h,063h,030h,01Ch,006h ; 0290
db 000h,000h,0FFh,0DBh,099h,018h,018h,018h,000h,000h,063h,063h,063h,063h,063h,063h ; 02A0
db 000h,000h,0C3h,0C3h,0C3h,0C3h,0C3h,0C3h,000h,000h,0C3h,0C3h,0C3h,0C3h,0DBh,0DBh ; 02B0
db 000h,000h,0C3h,0C3h,066h,03Ch,018h,03Ch,000h,000h,0C3h,0C3h,0C3h,066h,03Ch,018h ; 02C0
db 000h,000h,0FFh,0C3h,086h,00Ch,018h,030h,000h,000h,03Ch,030h,030h,030h,030h,030h ; 02D0
db 000h,000h,040h,060h,070h,038h,01Ch,00Eh,000h,000h,03Ch,00Ch,00Ch,00Ch,00Ch,00Ch ; 02E0
db 008h,01Ch,036h,063h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 02F0
db 018h,018h,00Ch,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,03Ch,006h,03Eh ; 0300
db 000h,000h,070h,030h,030h,03Ch,036h,033h,000h,000h,000h,000h,000h,03Eh,063h,060h ; 0310
db 000h,000h,00Eh,006h,006h,01Eh,036h,066h,000h,000h,000h,000h,000h,03Eh,063h,07Fh ; 0320
db 000h,000h,01Ch,036h,032h,030h,07Ch,030h,000h,000h,000h,000h,000h,03Bh,066h,066h ; 0330
db 000h,000h,070h,030h,030h,036h,03Bh,033h,000h,000h,00Ch,00Ch,000h,01Ch,00Ch,00Ch ; 0340
db 000h,000h,006h,006h,000h,00Eh,006h,006h,000h,000h,070h,030h,030h,033h,036h,03Ch ; 0350
db 000h,000h,01Ch,00Ch,00Ch,00Ch,00Ch,00Ch,000h,000h,000h,000h,000h,0E6h,0FFh,0DBh ; 0360
db 000h,000h,000h,000h,000h,06Eh,033h,033h,000h,000h,000h,000h,000h,03Eh,063h,063h ; 0370
db 000h,000h,000h,000h,000h,06Eh,033h,033h,000h,000h,000h,000h,000h,03Bh,066h,066h ; 0380
db 000h,000h,000h,000h,000h,06Eh,03Bh,033h,000h,000h,000h,000h,000h,03Eh,063h,038h ; 0390
db 000h,000h,008h,018h,018h,07Eh,018h,018h,000h,000h,000h,000h,000h,066h,066h,066h ; 03A0
db 000h,000h,000h,000h,000h,0C3h,0C3h,0C3h,000h,000h,000h,000h,000h,0C3h,0C3h,0DBh ; 03B0
db 000h,000h,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h,063h,063h,063h ; 03C0
db 000h,000h,000h,000h,000h,07Fh,066h,00Ch,000h,000h,00Eh,018h,018h,018h,070h,018h ; 03D0
db 000h,000h,018h,018h,018h,018h,000h,018h,000h,000h,070h,018h,018h,018h,00Eh,018h ; 03E0
db 000h,000h,03Bh,06Eh,000h,000h,000h,000h,000h,000h,000h,000h,008h,01Ch,036h,063h ; 03F0
db 000h,000h,01Eh,033h,061h,060h,060h,061h,000h,000h,066h,066h,000h,066h,066h,066h ; 0400
db 000h,006h,00Ch,018h,000h,03Eh,063h,07Fh,000h,008h,01Ch,036h,000h,03Ch,006h,03Eh ; 0410
db 000h,000h,066h,066h,000h,03Ch,006h,03Eh,000h,030h,018h,00Ch,000h,03Ch,006h,03Eh ; 0420
db 000h,01Ch,036h,01Ch,000h,03Ch,006h,03Eh,000h,000h,000h,000h,03Ch,066h,060h,066h ; 0430
db 000h,008h,01Ch,036h,000h,03Eh,063h,07Fh,000h,000h,066h,066h,000h,03Eh,063h,07Fh ; 0440
db 000h,030h,018h,00Ch,000h,03Eh,063h,07Fh,000h,000h,066h,066h,000h,038h,018h,018h ; 0450
db 000h,018h,03Ch,066h,000h,038h,018h,018h,000h,060h,030h,018h,000h,038h,018h,018h ; 0460
db 000h,063h,063h,008h,01Ch,036h,063h,063h,01Ch,036h,01Ch,000h,01Ch,036h,063h,063h ; 0470
db 00Ch,018h,030h,000h,07Fh,033h,030h,03Eh,000h,000h,000h,000h,06Eh,03Bh,01Bh,07Eh ; 0480
db 000h,000h,01Fh,036h,066h,066h,07Fh,066h,000h,008h,01Ch,036h,000h,03Eh,063h,063h ; 0490
db 000h,000h,063h,063h,000h,03Eh,063h,063h,000h,030h,018h,00Ch,000h,03Eh,063h,063h ; 04A0
db 000h,018h,03Ch,066h,000h,066h,066h,066h,000h,030h,018h,00Ch,000h,066h,066h,066h ; 04B0
db 000h,000h,063h,063h,000h,063h,063h,063h,000h,063h,063h,01Ch,036h,063h,063h,063h ; 04C0
db 000h,063h,063h,000h,063h,063h,063h,063h,000h,018h,018h,07Eh,0C3h,0C0h,0C0h,0C3h ; 04D0
db 000h,01Ch,036h,032h,030h,078h,030h,030h,000h,000h,0C3h,066h,03Ch,018h,0FFh,018h ; 04E0
db 000h,0FCh,066h,066h,07Ch,062h,066h,06Fh,000h,00Eh,01Bh,018h,018h,018h,07Eh,018h ; 04F0
db 000h,00Ch,018h,030h,000h,03Ch,006h,03Eh,000h,00Ch,018h,030h,000h,038h,018h,018h ; 0500
db 000h,00Ch,018h,030h,000h,03Eh,063h,063h,000h,00Ch,018h,030h,000h,066h,066h,066h ; 0510
db 000h,000h,03Bh,06Eh,000h,06Eh,033h,033h,03Bh,06Eh,000h,063h,073h,07Bh,07Fh,06Fh ; 0520
db 000h,03Ch,06Ch,06Ch,03Eh,000h,07Eh,000h,000h,038h,06Ch,06Ch,038h,000h,07Ch,000h ; 0530
db 000h,000h,018h,018h,000h,018h,018h,030h,000h,000h,000h,000h,000h,000h,07Fh,060h ; 0540
db 000h,000h,000h,000h,000h,000h,07Fh,003h,000h,060h,0E0h,063h,066h,06Ch,018h,030h ; 0550
db 000h,060h,0E0h,063h,066h,06Ch,018h,033h,000h,000h,018h,018h,000h,018h,018h,03Ch ; 0560
db 000h,000h,000h,000h,01Bh,036h,06Ch,036h,000h,000h,000h,000h,06Ch,036h,01Bh,036h ; 0570
db 011h,044h,011h,044h,011h,044h,011h,044h,055h,0AAh,055h,0AAh,055h,0AAh,055h,0AAh ; 0580
db 0DDh,077h,0DDh,077h,0DDh,077h,0DDh,077h,018h,018h,018h,018h,018h,018h,018h,018h ; 0590
db 018h,018h,018h,018h,018h,018h,018h,0F8h,018h,018h,018h,018h,018h,0F8h,018h,0F8h ; 05A0
db 036h,036h,036h,036h,036h,036h,036h,0F6h,000h,000h,000h,000h,000h,000h,000h,0FEh ; 05B0
db 000h,000h,000h,000h,000h,0F8h,018h,0F8h,036h,036h,036h,036h,036h,0F6h,006h,0F6h ; 05C0
db 036h,036h,036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,0FEh,006h,0F6h ; 05D0
db 036h,036h,036h,036h,036h,0F6h,006h,0FEh,036h,036h,036h,036h,036h,036h,036h,0FEh ; 05E0
db 018h,018h,018h,018h,018h,0F8h,018h,0F8h,000h,000h,000h,000h,000h,000h,000h,0F8h ; 05F0
db 018h,018h,018h,018h,018h,018h,018h,01Fh,018h,018h,018h,018h,018h,018h,018h,0FFh ; 0600
db 000h,000h,000h,000h,000h,000h,000h,0FFh,018h,018h,018h,018h,018h,018h,018h,01Fh ; 0610
db 000h,000h,000h,000h,000h,000h,000h,0FFh,018h,018h,018h,018h,018h,018h,018h,0FFh ; 0620
db 018h,018h,018h,018h,018h,01Fh,018h,01Fh,036h,036h,036h,036h,036h,036h,036h,037h ; 0630
db 036h,036h,036h,036h,036h,037h,030h,03Fh,000h,000h,000h,000h,000h,03Fh,030h,037h ; 0640
db 036h,036h,036h,036h,036h,0F7h,000h,0FFh,000h,000h,000h,000h,000h,0FFh,000h,0F7h ; 0650
db 036h,036h,036h,036h,036h,037h,030h,037h,000h,000h,000h,000h,000h,0FFh,000h,0FFh ; 0660
db 036h,036h,036h,036h,036h,0F7h,000h,0F7h,018h,018h,018h,018h,018h,0FFh,000h,0FFh ; 0670
db 036h,036h,036h,036h,036h,036h,036h,0FFh,000h,000h,000h,000h,000h,0FFh,000h,0FFh ; 0680
db 000h,000h,000h,000h,000h,000h,000h,0FFh,036h,036h,036h,036h,036h,036h,036h,03Fh ; 0690
db 018h,018h,018h,018h,018h,01Fh,018h,01Fh,000h,000h,000h,000h,000h,01Fh,018h,01Fh ; 06A0
db 000h,000h,000h,000h,000h,000h,000h,03Fh,036h,036h,036h,036h,036h,036h,036h,0FFh ; 06B0
db 018h,018h,018h,018h,018h,0FFh,018h,0FFh,018h,018h,018h,018h,018h,018h,018h,0F8h ; 06C0
db 000h,000h,000h,000h,000h,000h,000h,01Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; 06D0
db 000h,000h,000h,000h,000h,000h,000h,0FFh,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h ; 06E0
db 00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h ; 06F0
db 000h,000h,000h,000h,000h,03Bh,06Eh,06Ch,000h,000h,000h,000h,03Eh,063h,07Eh,063h ; 0700
db 000h,000h,07Fh,063h,063h,060h,060h,060h,000h,000h,000h,000h,07Fh,036h,036h,036h ; 0710
db 000h,000h,07Fh,063h,030h,018h,00Ch,018h,000h,000h,000h,000h,000h,03Fh,06Ch,06Ch ; 0720
db 000h,000h,000h,000h,033h,033h,033h,033h,000h,000h,000h,000h,03Bh,06Eh,00Ch,00Ch ; 0730
db 000h,000h,07Eh,018h,03Ch,066h,066h,066h,000h,000h,01Ch,036h,063h,063h,07Fh,063h ; 0740
db 000h,000h,01Ch,036h,063h,063h,063h,036h,000h,000h,01Eh,030h,018h,00Ch,03Eh,066h ; 0750
db 000h,000h,000h,000h,000h,07Eh,0DBh,0DBh,000h,000h,003h,006h,07Eh,0DBh,0DBh,0F3h ; 0760
db 000h,000h,01Ch,030h,060h,060h,07Ch,060h,000h,000h,000h,03Eh,063h,063h,063h,063h ; 0770
db 000h,000h,000h,07Fh,000h,000h,07Fh,000h,000h,000h,018h,018h,018h,0FFh,018h,018h ; 0780
db 000h,000h,030h,018h,00Ch,006h,00Ch,018h,000h,000h,00Ch,018h,030h,060h,030h,018h ; 0790
db 000h,000h,00Eh,01Bh,01Bh,018h,018h,018h,018h,018h,018h,018h,018h,018h,018h,018h ; 07A0
db 000h,000h,018h,018h,000h,000h,0FFh,000h,000h,000h,000h,000h,03Bh,06Eh,000h,03Bh ; 07B0
db 000h,038h,06Ch,06Ch,038h,000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,018h ; 07C0
db 000h,000h,000h,000h,000h,000h,000h,018h,000h,00Fh,00Ch,00Ch,00Ch,00Ch,00Ch,0ECh ; 07D0
db 000h,0D8h,06Ch,06Ch,06Ch,06Ch,06Ch,000h,000h,070h,0D8h,030h,060h,0C8h,0F8h,000h ; 07E0
db 000h,000h,000h,000h,03Eh,03Eh,03Eh,03Eh,000h,000h,000h,000h,000h,000h,000h,000h ; 07F0
db 000h,000h,000h,000h,000h,000h,000h,000h,099h,081h,07Eh,000h,000h,000h,000h,000h ; 0800
db 0E7h,0FFh,07Eh,000h,000h,000h,000h,000h,03Eh,01Ch,008h,000h,000h,000h,000h,000h ; 0810
db 01Ch,008h,000h,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0820
db 018h,018h,03Ch,000h,000h,000h,000h,000h,018h,000h,000h,000h,000h,000h,000h,000h ; 0830
db 0E7h,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,066h,03Ch,000h,000h,000h,000h,000h,000h ; 0840
db 099h,0C3h,0FFh,0FFh,0FFh,0FFh,000h,000h,066h,066h,03Ch,000h,000h,000h,000h,000h ; 0850
db 07Eh,018h,018h,000h,000h,000h,000h,000h,070h,0F0h,0E0h,000h,000h,000h,000h,000h ; 0860
db 067h,0E7h,0E6h,0C0h,000h,000h,000h,000h,0DBh,018h,018h,000h,000h,000h,000h,000h ; 0870
db 070h,060h,040h,000h,000h,000h,000h,000h,007h,003h,001h,000h,000h,000h,000h,000h ; 0880
db 07Eh,03Ch,018h,000h,000h,000h,000h,000h,000h,033h,033h,000h,000h,000h,000h,000h ; 0890
db 01Bh,01Bh,01Bh,000h,000h,000h,000h,000h,036h,01Ch,006h,063h,03Eh,000h,000h,000h ; 08A0
db 07Fh,07Fh,07Fh,000h,000h,000h,000h,000h,07Eh,03Ch,018h,07Eh,000h,000h,000h,000h ; 08B0
db 018h,018h,018h,000h,000h,000h,000h,000h,07Eh,03Ch,018h,000h,000h,000h,000h,000h ; 08C0
db 00Ch,000h,000h,000h,000h,000h,000h,000h,018h,000h,000h,000h,000h,000h,000h,000h ; 08D0
db 07Fh,000h,000h,000h,000h,000h,000h,000h,024h,000h,000h,000h,000h,000h,000h,000h ; 08E0
db 07Fh,07Fh,000h,000h,000h,000h,000h,000h,01Ch,008h,000h,000h,000h,000h,000h,000h ; 08F0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,000h,000h,000h,000h,000h ; 0900
db 000h,000h,000h,000h,000h,000h,000h,000h,07Fh,036h,036h,000h,000h,000h,000h,000h ; 0910
db 043h,063h,03Eh,00Ch,00Ch,000h,000h,000h,018h,033h,063h,000h,000h,000h,000h,000h ; 0920
db 066h,066h,03Bh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0930
db 030h,018h,00Ch,000h,000h,000h,000h,000h,006h,00Ch,018h,000h,000h,000h,000h,000h ; 0940
db 066h,000h,000h,000h,000h,000h,000h,000h,018h,018h,000h,000h,000h,000h,000h,000h ; 0950
db 018h,018h,018h,030h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0960
db 000h,018h,018h,000h,000h,000h,000h,000h,060h,040h,000h,000h,000h,000h,000h,000h ; 0970
db 063h,063h,03Eh,000h,000h,000h,000h,000h,00Ch,00Ch,03Fh,000h,000h,000h,000h,000h ; 0980
db 030h,063h,07Fh,000h,000h,000h,000h,000h,003h,063h,03Eh,000h,000h,000h,000h,000h ; 0990
db 006h,006h,00Fh,000h,000h,000h,000h,000h,003h,063h,03Eh,000h,000h,000h,000h,000h ; 09A0
db 063h,063h,03Eh,000h,000h,000h,000h,000h,018h,018h,018h,000h,000h,000h,000h,000h ; 09B0
db 063h,063h,03Eh,000h,000h,000h,000h,000h,003h,006h,03Ch,000h,000h,000h,000h,000h ; 09C0
db 018h,018h,000h,000h,000h,000h,000h,000h,018h,018h,030h,000h,000h,000h,000h,000h ; 09D0
db 018h,00Ch,006h,000h,000h,000h,000h,000h,07Eh,000h,000h,000h,000h,000h,000h,000h ; 09E0
db 018h,030h,060h,000h,000h,000h,000h,000h,000h,00Ch,00Ch,000h,000h,000h,000h,000h ; 09F0
db 06Eh,060h,03Eh,000h,000h,000h,000h,000h,063h,063h,063h,000h,000h,000h,000h,000h ; 0A00
db 033h,033h,07Eh,000h,000h,000h,000h,000h,061h,033h,01Eh,000h,000h,000h,000h,000h ; 0A10
db 033h,036h,07Ch,000h,000h,000h,000h,000h,031h,033h,07Fh,000h,000h,000h,000h,000h ; 0A20
db 030h,030h,078h,000h,000h,000h,000h,000h,063h,033h,01Dh,000h,000h,000h,000h,000h ; 0A30
db 063h,063h,063h,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0A40
db 066h,066h,03Ch,000h,000h,000h,000h,000h,036h,033h,073h,000h,000h,000h,000h,000h ; 0A50
db 031h,033h,07Fh,000h,000h,000h,000h,000h,0C3h,0C3h,0C3h,000h,000h,000h,000h,000h ; 0A60
db 063h,063h,063h,000h,000h,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h ; 0A70
db 030h,030h,078h,000h,000h,000h,000h,000h,06Fh,03Eh,006h,007h,000h,000h,000h,000h ; 0A80
db 033h,033h,073h,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0A90
db 018h,018h,03Ch,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0AA0
db 066h,03Ch,018h,000h,000h,000h,000h,000h,0FFh,066h,066h,000h,000h,000h,000h,000h ; 0AB0
db 066h,0C3h,0C3h,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0AC0
db 061h,0C3h,0FFh,000h,000h,000h,000h,000h,030h,030h,03Ch,000h,000h,000h,000h,000h ; 0AD0
db 007h,003h,001h,000h,000h,000h,000h,000h,00Ch,00Ch,03Ch,000h,000h,000h,000h,000h ; 0AE0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0FFh,000h,000h,000h ; 0AF0
db 000h,000h,000h,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0B00
db 033h,033h,06Eh,000h,000h,000h,000h,000h,060h,063h,03Eh,000h,000h,000h,000h,000h ; 0B10
db 066h,066h,03Bh,000h,000h,000h,000h,000h,060h,063h,03Eh,000h,000h,000h,000h,000h ; 0B20
db 030h,030h,078h,000h,000h,000h,000h,000h,066h,03Eh,006h,066h,03Ch,000h,000h,000h ; 0B30
db 033h,033h,073h,000h,000h,000h,000h,000h,00Ch,00Ch,01Eh,000h,000h,000h,000h,000h ; 0B40
db 006h,006h,066h,066h,03Ch,000h,000h,000h,036h,033h,073h,000h,000h,000h,000h,000h ; 0B50
db 00Ch,00Ch,01Eh,000h,000h,000h,000h,000h,0DBh,0DBh,0DBh,000h,000h,000h,000h,000h ; 0B60
db 033h,033h,033h,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0B70
db 033h,03Eh,030h,030h,078h,000h,000h,000h,066h,03Eh,006h,006h,00Fh,000h,000h,000h ; 0B80
db 030h,030h,078h,000h,000h,000h,000h,000h,00Eh,063h,03Eh,000h,000h,000h,000h,000h ; 0B90
db 018h,01Bh,00Eh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0BA0
db 066h,03Ch,018h,000h,000h,000h,000h,000h,0DBh,0FFh,066h,000h,000h,000h,000h,000h ; 0BB0
db 01Ch,036h,063h,000h,000h,000h,000h,000h,063h,03Fh,003h,006h,03Ch,000h,000h,000h ; 0BC0
db 018h,033h,07Fh,000h,000h,000h,000h,000h,018h,018h,00Eh,000h,000h,000h,000h,000h ; 0BD0
db 018h,018h,018h,000h,000h,000h,000h,000h,018h,018h,070h,000h,000h,000h,000h,000h ; 0BE0
db 000h,000h,000h,000h,000h,000h,000h,000h,063h,07Fh,000h,000h,000h,000h,000h,000h ; 0BF0
db 033h,01Eh,006h,003h,03Eh,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0C00
db 060h,063h,03Eh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0C10
db 066h,066h,03Bh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0C20
db 066h,066h,03Bh,000h,000h,000h,000h,000h,03Ch,00Ch,006h,03Ch,000h,000h,000h,000h ; 0C30
db 060h,063h,03Eh,000h,000h,000h,000h,000h,060h,063h,03Eh,000h,000h,000h,000h,000h ; 0C40
db 060h,063h,03Eh,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0C50
db 018h,018h,03Ch,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0C60
db 07Fh,063h,063h,000h,000h,000h,000h,000h,07Fh,063h,063h,000h,000h,000h,000h,000h ; 0C70
db 030h,033h,07Fh,000h,000h,000h,000h,000h,0D8h,0DCh,077h,000h,000h,000h,000h,000h ; 0C80
db 066h,066h,067h,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0C90
db 063h,063h,03Eh,000h,000h,000h,000h,000h,063h,063h,03Eh,000h,000h,000h,000h,000h ; 0CA0
db 066h,066h,03Bh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0CB0
db 063h,03Fh,003h,006h,03Ch,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h ; 0CC0
db 063h,063h,03Eh,000h,000h,000h,000h,000h,07Eh,018h,018h,000h,000h,000h,000h,000h ; 0CD0
db 030h,073h,07Eh,000h,000h,000h,000h,000h,0FFh,018h,018h,000h,000h,000h,000h,000h ; 0CE0
db 066h,066h,0F3h,000h,000h,000h,000h,000h,018h,018h,018h,0D8h,070h,000h,000h,000h ; 0CF0
db 066h,066h,03Bh,000h,000h,000h,000h,000h,018h,018h,03Ch,000h,000h,000h,000h,000h ; 0D00
db 063h,063h,03Eh,000h,000h,000h,000h,000h,066h,066h,03Bh,000h,000h,000h,000h,000h ; 0D10
db 033h,033h,033h,000h,000h,000h,000h,000h,067h,063h,063h,000h,000h,000h,000h,000h ; 0D20
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0D30
db 063h,063h,03Eh,000h,000h,000h,000h,000h,060h,060h,000h,000h,000h,000h,000h,000h ; 0D40
db 003h,003h,000h,000h,000h,000h,000h,000h,06Eh,0C3h,006h,00Ch,01Fh,000h,000h,000h ; 0D50
db 067h,0CFh,01Fh,003h,003h,000h,000h,000h,03Ch,03Ch,018h,000h,000h,000h,000h,000h ; 0D60
db 01Bh,000h,000h,000h,000h,000h,000h,000h,06Ch,000h,000h,000h,000h,000h,000h,000h ; 0D70
db 011h,044h,011h,044h,011h,044h,000h,000h,055h,0AAh,055h,0AAh,055h,0AAh,000h,000h ; 0D80
db 0DDh,077h,0DDh,077h,0DDh,077h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0D90
db 018h,018h,018h,018h,018h,018h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0DA0
db 036h,036h,036h,036h,036h,036h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0DB0
db 018h,018h,018h,018h,018h,018h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0DC0
db 036h,036h,036h,036h,036h,036h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0DD0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0DE0
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0DF0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E00
db 018h,018h,018h,018h,018h,018h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0E10
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0E20
db 018h,018h,018h,018h,018h,018h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0E30
db 000h,000h,000h,000h,000h,000h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0E40
db 000h,000h,000h,000h,000h,000h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0E50
db 036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E60
db 036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E70
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0E80
db 036h,036h,036h,036h,036h,036h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0E90
db 000h,000h,000h,000h,000h,000h,000h,000h,018h,018h,018h,018h,018h,018h,000h,000h ; 0EA0
db 036h,036h,036h,036h,036h,036h,000h,000h,036h,036h,036h,036h,036h,036h,000h,000h ; 0EB0
db 018h,018h,018h,018h,018h,018h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0EC0
db 018h,018h,018h,018h,018h,018h,000h,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h ; 0ED0
db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h,000h,0F0h,0F0h,0F0h,0F0h,0F0h,0F0h,000h,000h ; 0EE0
db 00Fh,00Fh,00Fh,00Fh,00Fh,00Fh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0EF0
db 06Ch,06Eh,03Bh,000h,000h,000h,000h,000h,063h,07Eh,060h,060h,020h,000h,000h,000h ; 0F00
db 060h,060h,060h,000h,000h,000h,000h,000h,036h,036h,036h,000h,000h,000h,000h,000h ; 0F10
db 030h,063h,07Fh,000h,000h,000h,000h,000h,06Ch,06Ch,038h,000h,000h,000h,000h,000h ; 0F20
db 03Eh,030h,030h,060h,000h,000h,000h,000h,00Ch,00Ch,00Ch,000h,000h,000h,000h,000h ; 0F30
db 03Ch,018h,07Eh,000h,000h,000h,000h,000h,063h,036h,01Ch,000h,000h,000h,000h,000h ; 0F40
db 036h,036h,077h,000h,000h,000h,000h,000h,066h,066h,03Ch,000h,000h,000h,000h,000h ; 0F50
db 07Eh,000h,000h,000h,000h,000h,000h,000h,07Eh,060h,0C0h,000h,000h,000h,000h,000h ; 0F60
db 060h,030h,01Ch,000h,000h,000h,000h,000h,063h,063h,063h,000h,000h,000h,000h,000h ; 0F70
db 000h,07Fh,000h,000h,000h,000h,000h,000h,018h,000h,0FFh,000h,000h,000h,000h,000h ; 0F80
db 030h,000h,07Eh,000h,000h,000h,000h,000h,00Ch,000h,07Eh,000h,000h,000h,000h,000h ; 0F90
db 018h,018h,018h,018h,018h,018h,000h,000h,0D8h,0D8h,070h,000h,000h,000h,000h,000h ; 0FA0
db 000h,018h,018h,000h,000h,000h,000h,000h,06Eh,000h,000h,000h,000h,000h,000h,000h ; 0FB0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0FC0
db 000h,000h,000h,000h,000h,000h,000h,000h,06Ch,03Ch,01Ch,000h,000h,000h,000h,000h ; 0FD0
db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0FE0
db 03Eh,03Eh,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ; 0FF0
codeSeg endS
end
page 60,132
title PrtScFX - FX-80 monochrome graphics print screen patch
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Written by: Michael Geary ;;
;; P.O. Box 1479 ;;
;; Los Gatos, CA 95031 ;;
;; (408) 354-4400 ;;
;; ;;
;; This program is placed in the public domain without restriction. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; macros
print macro char
ifnb <char>
mov al, char
endif
call prtChar
endM
video macro fun
mov ah, fun
int 10h
endM
DOS macro fun
mov ah, fun
int 21h
endM
; character codes
CR equ 13
LF equ 10
ESC equ 27
; interrupt numbers
PrtSc equ 05h
keyboard equ 16h
time equ 1Ah
; interrupt vector locations in absolute zero segment
absSeg segment at 0
org PrtSc * 4
PrtScIntOffset dw ?
PrtScIntSeg dw ?
absSeg endS
; screen addresses & stuff
monoSeg equ 0B000h
graphSeg equ 0B800h
row25offset equ 24 * 160
monoBigCrs equ 000Dh
graphBigCrs equ 0007h
monoNrmCrs equ 0C0Dh
graphNrmCrs equ 0607h
save25 equ 60h ; use program segment prefix as scratch area
codeSeg segment para public 'code'
extrn cgData:byte
stkSize equ 256
cgSize equ 4096
theEnd equ offset cgData + cgSize + stkSize
org 100h
printScreen proc far
assume cs:codeSeg, ds:codeSeg, ss:codeSeg, es:absSeg
mov dx, offset credit
DOS 9
call cksum
mov ckSave, dx
mov SPinit, theEnd
mov SSinit, cs
xor ax, ax
mov es, ax
CLI
mov ax, PrtScIntOffset
mov SaveIntOffset, ax
mov ax, PrtScIntSeg
mov SaveIntSeg, ax
mov PrtScIntOffset, offset doPrint
push cs
pop PrtScIntSeg
STI
mov dx, theEnd
int 27h
SPinit dw ? ; value to load into SP
SSinit dw ? ; and SS when dump routine called
SPsave dw ? ; saved value of SP and SS at start of dump
SSsave dw 0 ; routine (SSsave=0 means not currently active)
ckSave dw ? ; saved checksum for stack overflow check
scrSeg dw ? ; B000 or B800 screen segment
pageNo db ? ; BIOS's page #
crsPos dw ? ; user's cursor row & column
crsType dw ? ; user's cursor type (size)
bigCrs dw ? ; our big cursor
saveInt label dword ; holds the "other" PrtSc interrupt vector
SaveIntOffset dw ?
SaveIntSeg dw ?
paper216ths db ? ; paper advance after pass (12/216 or 24/216 ")
dotsPerPass db ? ; # dot rows covered in a pass (4 or 8)
lastCol db ? ; last nonblank char col in this print row
prompt db ' G = text graphics dump, D = darker grap'
db 'hics, SPACE = normal dump, Esc = cancel ',0
overflow db ' Stack Overflow ',0
credit db CR,LF,'PrtScFX version 1.4 by Michael Geary',CR,LF,'$'
; PrtSc entry point
doPrint:
assume cs:codeSeg, ds:nothing, ss:nothing, es:nothing
cmp SSsave, 0
jz startOK
jmp allDone ; already running, no dice
startOK:
CLI
mov SPsave, sp
mov SSsave, ss
mov ss, SSinit
mov sp, SPinit
STI
push ds
push es
push ax
push bx
push cx
push dx
push si
push di
push bp
video 15 ; get CRT mode in AL
mov pageNo, bh
mov dx, monoSeg
mov cx, monoBigCrs
mov si, monoNrmCrs
cmp al, 7 ; must be monochrome
je newDump
mov dx, graphSeg
xor bl, bl
add dx, bx ; (current page segment)
mov cx, graphBigCrs
mov si, graphNrmCrs
and al, 0FEh
cmp al, 2 ; or 80 column text mode (2 or 3)
je newDump
jmp oldDump
newDump:
mov scrSeg, dx
mov bigCrs, cx
mov crsType, si
video 3 ; save cursor
mov crsPos, dx
cmp cx, 0067h ; avoid ROM bug - incorrect
je weirdCrs ; cursor type of 67h
mov crsType, cx
weirdCrs:
or ch, 20h
video 1 ; turn cursor off
push cs ; * * * * * * ProKey kludge!!!
pop ds
xor ax, ax
mov es, ax
les si, dword ptr es:24h ; interrupt 9 (keyboard)
cmp word ptr es:[si], 0F62Eh
jne notProKey
mov si, es:3[si] ; looks like ProKey, get their flag
test byte ptr es:[si], 0FFh
jnz notProKey ; not active
push ax
mov cx, bigCrs
video 1 ; put up a big fat cursor
pop ax
jmp oldDump ; ProKey is active, do old dump!
notProKey:
mov ds, scrSeg
mov si, row25offset
push cs
pop es
mov di, save25
mov cx, 80
rep movsw ; save row 25
push cs
pop ds
assume ds:codeSeg ; leave DS alone from now on
mov si, offset prompt
call message
kbdClr: mov ah, 1 ; clear keyboard buffer
int keyboard
pushf
xor ah, ah ; and read a key
int keyboard
popf
jnz kbdClr
mov si, save25
mov es, scrSeg
mov di, row25offset
mov cx, 80
rep movsw ; restore row 25
cmp al, 27 ; exit if Esc
jne notEsc
jmp prtDone
notEsc:
and al, 0DFh ; convert lower case --> upper
push ax
mov cx, bigCrs
video 1 ; put up a big fat cursor
pop ax
xor ch, ch ; CH = char row
xor dh, dh ; DH = dot row
mov paper216ths, 24
mov dotsPerPass, 8
cmp al, 'G'
je doGraphics
dec ch ; double strike starts at char row -1
mov dh, 10 ; dot row 10 (to do the first strike
mov paper216ths, 12 ; of the top 4 dot lines of row 0)
mov dotsPerPass, 4
cmp al, 'D'
je doGraphics
oldDump:
pushf
call SaveInt ; call the other dump routine
jmp prtDone
doGraphics:
print CR ; CR-LF to tension paper
print LF
nextRow: ; here to begin a character row
push cx
push dx
mov dh, ch
xor dl, dl
mov bh, pageNo
video 2 ; put a big cursor on current row
pop dx
pop cx
mov cl, 79
chkNxtChr: ; here to check a char col for nonblank
mov dl, 7
chkNxtDotCol: ; here to check a dot col for nonblank
call getDotCol
test al, al
jnz startRow
dec dl
jge chkNxtDotCol
dec cl
jge chkNxtChr
jmp advPaper ; nothing at to print on this row
startRow:
mov lastCol, cl
inc cl
mov al, 9
mul cl
mov bx, ax ; bx = number of dot cols to print
print ESC
print '*' ; set 720 dot graphics mode
print 6
print bl ; with the exact number of dots
print bh
mov cl, 0 ; CL = char col
nextChar: ; here to dump one character column
mov dl, 7 ; DL = dot col
nextCol: ; here for each dot column
call getDotCol
print
dec dl
cmp dl, -1
jge nextCol
inc cl
cmp cl, lastCol
jle nextChar
advPaper:
print CR
print ESC
print 'J'
print paper216ths
add dh, dotsPerPass
cmp dh, 14
jge sub14
jmp nextRow
sub14:
sub dh, 14
inc ch
cmp ch, 25
jge prtDone
jmp nextRow
prtDone:
call oldCursor
call cksum
cmp dx, ckSave
je exitOK
mov si, offset overflow ; stack overflow, complain
call message
exitOK:
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
CLI
mov ss, cs: SSsave
mov sp, cs: SPsave
mov cs: SSsave, 0
allDone:
STI
iRet
printScreen endP
; Call with CH=char row, CL=char col, DH=topmost dot row, DL=dot col.
; Returns with the dot column byte for printing in AL.
getDotCol proc near
push bx
xor bx, bx ; BH=dot row offset, BL=dot accumulator
nextDot: ; here for each dot vertically
push dx
add dh, bh
call getDot
pop dx
shl bl, 1
or bl, al
inc bh
cmp bh, 8
jl nextDot
mov al, bl
pop bx
ret
getDotCol endP
; Call with CH=char row, CL=char col, DH=dot row, DL=dot col.
; Returns with the dot in AL bit 0.
getDot proc near
push bx
push cx
push dx
cmp dh, 14 ; are we really in next char row?
jl gd1
inc ch ; yes, adjust char and dot rows
sub dh, 14
gd1:
xor al, al
or ch, ch
jl gdRet
cmp ch, 25
jge gdRet ; return 0 if outside screen bounds
call getCA ; AH = attr, AL = char
or dl, dl ; special check for dot col "-1"
jge gd2
cmp al, 192
jl gd3
cmp al, 223
jle gd4
gd3: xor al, al ; col -1 not in 192..223 is 0
jmp gd6
gd4: xor dl, dl ; col -1 in 192..223 duplicates col 0
gd2:
mov bl, al
xor bh, bh
shl bx, 1
shl bx, 1
shl bx, 1
push dx
mov dl, dh
xor dh, dh
add bx, dx ; BX = (chr*8) + dotRow
pop dx
cmp dh, 8
jl gd5
add bx, 2040 ; dot rows 8-13 are higher in ROM
gd5:
mov al, cgData[bx] ; get the character data
mov cl, dl
shr al, cl ; shift dot into position
and al, 1
gd6:
and ah, 77h
cmp ah, 70h ; check for reverse video
jne gd7
xor al, 1 ; yes, toggle the dot
gd7:
cmp dh, 12 ; is this the underline dot row?
jne gd8
cmp scrSeg, monoSeg ; yes, are we on a monochrome display?
jne gd8
cmp ah, 1 ; yes, is the underline attribute set?
jne gd8
mov al, 1 ; yes, dot on
gd8:
gdRet:
pop dx
pop cx
pop bx
ret
getDot endP
; Call with CH=row, CL=col. Returns with AH=attribute, AL=character.
getCA proc near
push bx
push cx
mov al, 80
imul ch
xor ch, ch
add ax, cx
shl ax, 1
mov bx, ax
mov ax, scrSeg
mov es, ax
mov ax, es:[bx]
pop cx
pop bx
ret
getCA endP
;prints the character in AL
prtChar proc near
push dx
xor dx, dx
xor ah, ah
int 17h
pop dx
test ah, 25h
jz prtRet
pop dx ; get rid of our return address
jmp prtDone
prtRet: ret
prtChar endP
; restores user's cursor
oldCursor proc near
push cs
pop ds
mov bh, pageNo
mov dx, crsPos
video 2 ; restore cursor position
mov cx, crsType
video 1 ; and type
ret
oldCursor endP
; display the message at [si] in reverse video at the bottom of the screen.
; doesn't worry about snow on color screen. clobbers di.
message proc near
mov es, scrSeg
mov di, row25offset
mov ah, 70h ; reverse video
prmLp: lodsb
test al, al
jz prmRet
stosw
jmp prmLp
prmRet: ret
message endP
; calculates a checksum for the character generator data, returns it in DX.
; used for stack overflow checking. clobbers si, cx.
cksum proc near
mov si, offset cgData
mov cx, cgSize / 2
xor dx, dx
ckLp: lodsw
xor dx, ax
loop ckLp
ret
cksum endP
codeSeg endS
end printScreen
PRTSCFX.DOC -- Documentation for PrtScFX 9/24/84
-------------------------------------------------------------------------------
Version 1.3
This version fixes a bug in 1.2 where the "D" dark print mode missed
part of the top line of the screen.
Be warned that ProKey has a bug which makes it crash if it is used with
PrtScFX. Because of this bug, PrtScFX attempts to determine (when you
press Shift-PrtSc) whether ProKey is active. If it is, a normal screen
dump is done instead of giving you the choice of a graphics dump. You
can include both ProKey and PrtScFX in your AUTOEXEC, but if you do, you
will not be able to get graphics dumps until you do a PROKEY/Q command
to disable ProKey.
Also, the test for discovering ProKey's presence is imperfect. If you
are running a program which grabs the keyboard interrupt (such as
Framework or BASICA), PrtScFX may not be able to tell that ProKey is
active. To be completely safe, such programs should be run from batch
files which disable ProKey. For example, if you use Framework, you
might rename FW.EXE as FRAMEWRK.EXE and then use a FW.BAT file
containing these commands:
prokey /q
cd \frame (or wherever)
framewrk
prokey /i
(If you have Framework V1.00, you will need to do this anyway, since it
does not get along with ProKey.)
-------------------------------------------------------------------------------
PrtScFX is a screen dump program which prints a graphic image of a text
mode display on an Epson FX or RX (not MX!) series printer. The printout
looks just like a screen display, including connected line graphics.
This is different from other graphics dumps, such as IBM's GRAPHICS program.
GRAPHICS dumps a graphics mode screen; PrtScFX dumps a text mode screen.
PrtScFX should be run once, typically from your AUTOEXEC.BAT file. From
then on, if you are in 80 column text mode, the Shift-Prtsc key will give
you the prompt:
G = text graphics dump, D = darker graphics, SPACE = normal dump, Esc = cancel
and you can type:
G for a text mode graphics dump
D for a better quality (double-strike) text graphics dump
Space Bar for a "normal" screen dump (passes the request on to the
standard - or other special - screen dump utility)
Esc to cancel the screen dump request
Either the IBM Monochrome Display or the color/graphics adapter can be
used, but only 80-column TEXT mode displays are dumped. For either display
adapter, the printout duplicates the font of the IBM Monochrome Display.
PrtScFX coexists nicely with IBM's GRAPHICS program. Just run them both in
your AUTOEXEC (in either order), and then GRAPHICS will handle graphics
mode displays, and PrtScFX will kick in for text mode.
PrtScFX produced the illustrations of Transend PC screens in my article
(with Richard Moore), "A Communications Package for the IBM PC", in the
November 1983 BYTE magazine. For camera-ready art like this, I recommend:
* A fairly fresh ribbon - but not brand new (smudges). The one we used
in the article was a little faint.
* Good quality bond paper - not typical printout paper (the ink bleeds).
* If available, friction feed instead of pin feed - better registration.
* The D option for double-strike graphics.
In the article, we used a ribbon that was just a little too faint.
PrtScFX is placed in the public domain without restriction.
Michael Geary
P.O. Box 1479
Los Gatos, CA 95031
(408) 354-0175
FILES
-----
If you just want to use PrtScFX, you just need PRTSCFX.COM
If you want to modify and/or re-assemble PrtScFX, the source files are
PRTSCFX.ASM and MONOCG.ASM. The latter file contains the character
generator data from the ROM on the display adapters. If you don't need to
modify this, just use MONOCG.OBJ.
ASSEMBLING & LINKING
--------------------
(change drive letters as needed)
B>masm PrtScFX ;
B>masm MonoCG ; (omit if you have MONOCG.OBJ)
B>link PrtScFX + MonoCG ;
If you have the Spacemaker program by Realia, Inc.:
B>sm PrtScFX ; /s
If you don't have Spacemaker, you should get it! For now, use:
B>exe2bin PrtScFX.exe PrtScFX.com
(Your .COM file will be larger using exe2bin)
B>erase PrtScFX.exe
Suggested modifications: Handle 40 column text, clean up & document code
(sorry, it started out as a "quick and dirty" program).
High-resolution EGA Windows drivers by Michael Geary
12/9/86
INTRODUCTION
------------
This package of Windows drivers includes several high-resolution drivers for
Enhanced Graphic Adapters with various monitors. Most of the drivers
require a 24mhz adapter card to be installed in the feature connector of the
EGA. Brief instructions for building this card are given below; more
complete instructions can be found in the September 16, 1986 issue of PC
Magazine, page 298.
These drivers and the 24mhz adapter card will work with any EGA card that
has 256K memory. They do not require one of the new "enhanced" EGA's.
(The 24mhz adapter makes your EGA an "enhanced" EGA equivalent to the VEGA
Deluxe card from Video-7.)
The following drivers are included in this package:
Filenames Resolution Display type 24mhz req'd
---------- ---------- ------------------------- -----------
E640X480.* 640 x 480 Multisync Yes
E752X410.* 752 x 410 Multisync Yes
E896X350.* 896 x 350 Standard ECD or Multisync Yes
M720X350.* 720 x 350 Monochrome No
These drivers have been tested with Windows versions 1.01 and 1.03. They
should also work with future Windows versions.
HOW TO INSTALL THE DRIVERS
--------------------------
For each driver, there are three files, .DRV, .GRB, and .LGO. To use the
drivers, these files should be copied to your Windows SETUP and BUILD disks.
Follow these instructions to install the drivers on your Windows disks.
1. Make copies of the SETUP and BUILD disks and work on the copies, not the
originals!! You will be deleting some files from these disks to make
room for the new drivers.
2. Delete some files from the SETUP disk to make room for the .DRV files.
I recommend deleting CGA.DRV, HERCULES.DRV, EGALORES.DRV, EMM.PC, and
EMM.AT. For Windows 1.01 and 1.03, this frees up enough space.
3. Copy *.DRV from this directory onto the SETUP disk.
4. Copy *.GRB and *.LGO from this directory onto the BUILD disk.
5. That completes the installation of the enhanced drivers. Now put the
SETUP disk in drive A: and run SETUP as you would normally. You will
see the additional drivers listed when it asks you what kind of display
you have. Choose the one you want and try it out!
Note: If you install the 896x350 driver, you may find that the standard
system font looks awfully tall and skinny. You may prefer the alternate
font, which is normally used with a CGA, and will give smaller, but more
normal looking characters. If you want to try this font, then on your
SETUP disk, rename HIFONTS.FON as HIFONTS.STD and then rename LOFONTS.FON
as HIFONTS.FON, and re-run SETUP. (You can rename the files back again if
you change your mind.) This is also a useful trick with the other screen
resolutions if you would rather fit more lines of text on the screen when
using the system font. It doesn't affect other fonts such as used in WRITE.
HOW TO BUILD THE 24MHZ FEATURE CARD
-----------------------------------
To use any of these drivers except the 720x350 Monochrome, you will need to
build a 24mhz "feature card" and install it on your EGA. This is a very
simple card, with only one main component, a crystal oscillator. If you
would like step-by-step instructions for building this card, I recommend
getting the September 16, 1986 issue of PC Magazine, and following the
instructions on page 298. Here are brief instructions for those who are
familiar with building electronic hardware.
You will need these parts, available from a number of suppliers, including
JDR Microdevices, 1224 S. Bascom Av., San Jose, CA 95128; (800) 538-5000
or (800) 662-6279 in California. The total cost for parts will be around
ten dollars plus shipping.
JDR Item # Description
---------- ----------------------------------
OSC24.0 24.0 MHZ crystal oscillator
HDR-80 2x40 breakable header strip
P25x45 Bare 2.5 x 4.5 " prototyping board
14 PIN ST 14-pin low profile IC socket
Cut the header strip so you have two rows of 16 pins each. Cut the
prototyping board to about 1.5 x 2 inches. Push the short pins of the
header strip through the holes along one edge of the board and glue it in
place. (But keep the glue off the pins - you will be soldering on them.)
In the middle of the board, push the IC socket through from the other side
and glue it in place.
Cut three short pieces of hookup wire, and connect the IC socket to the
2x16 header strip as follows (you will need to pass the wires through some
holes in the board):
IC socket Header strip Function
--------- ------------ --------
7 31 Ground
14 32 +5 volts
8 28 Signal
To identify the pins of the IC socket, note that one end of the socket has a
little notch in it. If you are looking at the bottom of the socket (where
the pins are), and you have the notch at the top, pin 14 is at the top left.
Pin 8 is at the bottom left. Pin 7 is at the bottom right.
To identify the pins of the header strip, observe how it will plug in to the
EGA card. On the EGA card, the topmost pin farthest from the metal bracket
is pin 31. Pin 32 is right below that, and pin 28 is two over from pin 32.
Most EGA cards have pins 31 and 32 marked (and pins 1 and 2).
Finally, push the crystal oscillator into the IC socket. There will be a
little dot at one corner of the oscillator. This end of the oscillator goes
into the notched end of the socket. You may need to trim the oscillator
pins a little bit to get it to seat fully in the socket.
Finally, double check all your connections, and cut off excess length on the
IC socket and header pins. (Don't cut off the header pins where they will
plug in to the EGA! It's the pins that pass through the card that should be
trimmed.)
Plug the card into the EGA. Check that nothing looks like it is going to
short out - you may want to cut a little piece of cardboard and put between
the adapter card and the EGA, and tape or glue it in place. Finally,
install the EGA back into your PC. To test it, first make sure that your
normal display operations still work! Then, try one of the enhanced Windows
drivers. If there's any problem, you may want to try running 120COLS.COM,
which is included with these drivers. Just run 120COLS, and then give the
command MODE BW40, and you should have a 120 column text display on your
ECD or Multisync display (it won't work on a Monochrome display). If the
enhanced Windows drivers and 120COLS don't work, but the EGA operates
normally otherwise, there is a problem with your feature card, and you
should remove it and double check everything. If in doubt, check the PC
Magazine article mentioned above.
CREDITS
-------
These enhanced EGA drivers are based on the standard EGA Windows driver from
Microsoft, and were adapted by:
Michael Geary
P.O. Box 1479
Los Gatos, CA 95031
(408) 354-0175
BIX: 'geary'
GEnie: 'geary'
AT&T Mail: 'geary'
CompuServe: 76146,42
High-resolution EGA Windows drivers by Michael Geary
12/9/86
INTRODUCTION
------------
This package of Windows drivers includes several high-resolution drivers for
Enhanced Graphic Adapters with various monitors. Most of the drivers
require a 24mhz adapter card to be installed in the feature connector of the
EGA. Brief instructions for building this card are given below; more
complete instructions can be found in the September 16, 1986 issue of PC
Magazine, page 298.
These drivers and the 24mhz adapter card will work with any EGA card that
has 256K memory. They do not require one of the new "enhanced" EGA's.
(The 24mhz adapter makes your EGA an "enhanced" EGA equivalent to the VEGA
Deluxe card from Video-7.)
The following drivers are included in this package:
Filenames Resolution Display type 24mhz req'd
---------- ---------- ------------------------- -----------
E640X480.* 640 x 480 Multisync Yes
E752X410.* 752 x 410 Multisync Yes
E896X350.* 896 x 350 Standard ECD or Multisync Yes
M720X350.* 720 x 350 Monochrome No
These drivers have been tested with Windows versions 1.01 and 1.03. They
should also work with future Windows versions.
HOW TO INSTALL THE DRIVERS
--------------------------
For each driver, there are three files, .DRV, .GRB, and .LGO. To use the
drivers, these files should be copied to your Windows SETUP and BUILD disks.
Follow these instructions to install the drivers on your Windows disks.
1. Make copies of the SETUP and BUILD disks and work on the copies, not the
originals!! You will be deleting some files from these disks to make
room for the new drivers.
2. Delete some files from the SETUP disk to make room for the .DRV files.
I recommend deleting CGA.DRV, HERCULES.DRV, EGALORES.DRV, EMM.PC, and
EMM.AT. For Windows 1.01 and 1.03, this frees up enough space.
3. Copy *.DRV from this directory onto the SETUP disk.
4. Copy *.GRB and *.LGO from this directory onto the BUILD disk.
5. That completes the installation of the enhanced drivers. Now put the
SETUP disk in drive A: and run SETUP as you would normally. You will
see the additional drivers listed when it asks you what kind of display
you have. Choose the one you want and try it out!
Note: If you install the 896x350 driver, you may find that the standard
system font looks awfully tall and skinny. You may prefer the alternate
font, which is normally used with a CGA, and will give smaller, but more
normal looking characters. If you want to try this font, then on your
SETUP disk, rename HIFONTS.FON as HIFONTS.STD and then rename LOFONTS.FON
as HIFONTS.FON, and re-run SETUP. (You can rename the files back again if
you change your mind.) This is also a useful trick with the other screen
resolutions if you would rather fit more lines of text on the screen when
using the system font. It doesn't affect other fonts such as used in WRITE.
HOW TO BUILD THE 24MHZ FEATURE CARD
-----------------------------------
To use any of these drivers except the 720x350 Monochrome, you will need to
build a 24mhz "feature card" and install it on your EGA. This is a very
simple card, with only one main component, a crystal oscillator. If you
would like step-by-step instructions for building this card, I recommend
getting the September 16, 1986 issue of PC Magazine, and following the
instructions on page 298. Here are brief instructions for those who are
familiar with building electronic hardware.
You will need these parts, available from a number of suppliers, including
JDR Microdevices, 1224 S. Bascom Av., San Jose, CA 95128; (800) 538-5000
or (800) 662-6279 in California. The total cost for parts will be around
ten dollars plus shipping.
JDR Item # Description
---------- ----------------------------------
OSC24.0 24.0 MHZ crystal oscillator
HDR-80 2x40 breakable header strip
P25x45 Bare 2.5 x 4.5 " prototyping board
14 PIN ST 14-pin low profile IC socket
Cut the header strip so you have two rows of 16 pins each. Cut the
prototyping board to about 1.5 x 2 inches. Push the short pins of the
header strip through the holes along one edge of the board and glue it in
place. (But keep the glue off the pins - you will be soldering on them.)
In the middle of the board, push the IC socket through from the other side
and glue it in place.
Cut three short pieces of hookup wire, and connect the IC socket to the
2x16 header strip as follows (you will need to pass the wires through some
holes in the board):
IC socket Header strip Function
--------- ------------ --------
7 31 Ground
14 32 +5 volts
8 28 Signal
To identify the pins of the IC socket, note that one end of the socket has a
little notch in it. If you are looking at the bottom of the socket (where
the pins are), and you have the notch at the top, pin 14 is at the top left.
Pin 8 is at the bottom left. Pin 7 is at the bottom right.
To identify the pins of the header strip, observe how it will plug in to the
EGA card. On the EGA card, the topmost pin farthest from the metal bracket
is pin 31. Pin 32 is right below that, and pin 28 is two over from pin 32.
Most EGA cards have pins 31 and 32 marked (and pins 1 and 2).
Finally, push the crystal oscillator into the IC socket. There will be a
little dot at one corner of the oscillator. This end of the oscillator goes
into the notched end of the socket. You may need to trim the oscillator
pins a little bit to get it to seat fully in the socket.
Finally, double check all your connections, and cut off excess length on the
IC socket and header pins. (Don't cut off the header pins where they will
plug in to the EGA! It's the pins that pass through the card that should be
trimmed.)
Plug the card into the EGA. Check that nothing looks like it is going to
short out - you may want to cut a little piece of cardboard and put between
the adapter card and the EGA, and tape or glue it in place. Finally,
install the EGA back into your PC. To test it, first make sure that your
normal display operations still work! Then, try one of the enhanced Windows
drivers. If there's any problem, you may want to try running 120COLS.COM,
which is included with these drivers. Just run 120COLS, and then give the
command MODE BW40, and you should have a 120 column text display on your
ECD or Multisync display (it won't work on a Monochrome display). If the
enhanced Windows drivers and 120COLS don't work, but the EGA operates
normally otherwise, there is a problem with your feature card, and you
should remove it and double check everything. If in doubt, check the PC
Magazine article mentioned above.
CREDITS
-------
These enhanced EGA drivers are based on the standard EGA Windows driver from
Microsoft, and were adapted by:
Michael Geary
P.O. Box 1479
Los Gatos, CA 95031
(408) 354-0175
BIX: 'geary'
GEnie: 'geary'
AT&T Mail: 'geary'
CompuServe: 76146,42
Volume in drive A has no label
Directory of A:\
DISK0186 ZIP 37500 3-20-90 12:07a
PRTSCFX <DIR>
WINEGA <DIR>
3 file(s) 37500 bytes
Directory of A:\PRTSCFX
. <DIR>
.. <DIR>
ARC <DIR>
NONARC <DIR>
4 file(s) 0 bytes
Directory of A:\PRTSCFX\ARC
. <DIR>
.. <DIR>
PRTSCFX ARC 15593 12-19-84 1:57p
3 file(s) 15593 bytes
Directory of A:\PRTSCFX\NONARC
. <DIR>
.. <DIR>
MONOCG ASM 23738 6-12-83 3:33p
PRTSCFX ASM 9979 12-19-84 1:56p
PRTSCFX COM 4212 12-19-84 1:57p
PRTSCFX DOC 4415 9-28-84 10:08p
6 file(s) 42344 bytes
Directory of A:\WINEGA
. <DIR>
.. <DIR>
ARC <DIR>
NONARC <DIR>
4 file(s) 0 bytes
Directory of A:\WINEGA\ARC
. <DIR>
.. <DIR>
WINEGA ARC 54424 12-09-86 3:43a
3 file(s) 54424 bytes
Directory of A:\WINEGA\NONARC
. <DIR>
.. <DIR>
120COLS COM 108 10-28-86 2:00a
E640X480 DRV 17536 12-01-86 12:41a
E640X480 GRB 14 12-09-86 2:10a
E640X480 LGO 9 12-09-86 2:11a
E752X410 DRV 17536 12-01-86 1:20a
E752X410 GRB 14 12-09-86 2:10a
E752X410 LGO 9 12-09-86 2:11a
E896X350 DRV 17536 12-09-86 3:34a
E896X350 GRB 14 12-09-86 2:10a
E896X350 LGO 9 12-09-86 2:11a
M720X350 DRV 14464 12-09-86 3:17a
M720X350 GRB 13 12-09-86 2:11a
M720X350 LGO 13 12-09-86 2:11a
README TXT 7296 12-09-86 3:43a
16 file(s) 74571 bytes
Total files listed:
39 file(s) 224432 bytes
73728 bytes free