home *** CD-ROM | disk | FTP | other *** search
Wrap
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 ; MO B,8ccccccccccccccccccccccccccccccccz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mt a 1rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrse2-l1r, h1rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2MB88888888888888888888888888888888,A11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111r, c 02tCrrtcreA11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmvCA111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110e2x8r2rtve rrt 88888888888888888888888888888888888888888888888888888888888888888r2 8c -acXcSrrt 88888888888888888888888888888888888888888888888888888888888888888r r M t 88888888888888888888888888888888888888888888888888888888888888888r, PcCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCrA 8 P 2C290SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSB tt1111111111111111111111111111111111111111111111111111111111111111112v c29x 2rSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSc 02tC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,88E8BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBr, 81CA111111111111111111111111111111111111111111111111111111111111111111111rI 1 2rct111111111111111111111111111111111111111111111111111111111111111111111 h1rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrg 10t2 rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrA0PcCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCr1CIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 0A. , PcCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCr:t2Prrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr_Xa1rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr22cCtB8B L0e t 8 tCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC08CCrcP cSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSPcCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC