From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/DEV/PRINTER/CPSPM10.ASM | 3851 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 3851 insertions(+) create mode 100644 v4.0/src/DEV/PRINTER/CPSPM10.ASM (limited to 'v4.0/src/DEV/PRINTER/CPSPM10.ASM') diff --git a/v4.0/src/DEV/PRINTER/CPSPM10.ASM b/v4.0/src/DEV/PRINTER/CPSPM10.ASM new file mode 100644 index 0000000..ea62b25 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPM10.ASM @@ -0,0 +1,3851 @@ +PAGE ,132 +TITLE DOS - Code Page Switching - Printer Device Driver +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Printer Device Driver Main Code +;; MODULE NAME: +;; TYPE: Assemble file (resident code) +;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01 +;; must be first. CPSPInn must be last. Everything +;; before CPSPInn will be resident. +;; INCLUDE FILES: +;; CPSPEQU.INC +;; +;; +;; This routine is structured as a DOS Device Driver. +;; IE it is installed via the CONFIG.SYS command: +;; +;; The following device commands are supported: +;; +;; 0 - INIT +;; -------- +;; +;; 8 - OUTPUT +;; 9 - OUTPUT +;; -------- +;; Supported in between Designate-start and the Designate_end commands. +;; +;; +;; 12 - IOCTL OUTPUT +;; ----------------- +;; CPS Function request : Major function = 05 -- printer device +;; Minor functions = 4CH -- designate start +;; 4DH -- designate end +;; 4AH -- invoke +;; 6AH -- query-invoked +;; 6BH -- query-list +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;*Modification history ******************************************************** +;AN001; p2685 Long delay on CHCP before failure message 12/10/87 J.K. +;****************************************************************************** + ;; +INCLUDE CPSPEQU.INC ;; + ;; +PUBLIC PRINTER_DESC_NUM ;; +PUBLIC PRINTER_DESC_TBL ;; +PUBLIC INIT_CHK,TABLE,DEVICE_NUM ;; WGR ;AN000; +PUBLIC INVOKE ;; WGR ;AN000; +PUBLIC BUF0,BUF1,BUF2,BUF3 ;; WGR ;AN000; +PUBLIC HARD_SL1,RAM_SL1 ;; +PUBLIC HARD_SL2,RAM_SL2 ;; +PUBLIC HARD_SL3,RAM_SL3 ;; +PUBLIC HARD_SL4,RAM_SL4 ;; +PUBLIC RESERVED1,RESERVED2 ;; + ;; +EXTRN RESIDENT_END:WORD ;; +EXTRN STACK_ALLOCATED:WORD ;; +EXTRN FONT_PARSER:NEAR,FTABLE:WORD ;; +EXTRN INIT:NEAR ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +CSEG SEGMENT PARA PUBLIC 'CODE' ;; + ASSUME CS:CSEG ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ************************************ +;; ** ** +;; ** Resident Code ** +;; ** ** +;; ************************************ +;; +;; +;; DEVICE HEADER - must be at offset zero within device driver +;; (DHS is defined according to this structure) +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +DEV_HDR0: DW OFFSET DEV_HDR1 ;; becomes pointer to next device header + DW 0 ;; must be zero for no link + DW 0e040H ;; attribute (Char device) + ;; supports IOCTL calls + DW OFFSET STRATEGY0 ;; pointer to device "strategy" routine + DW OFFSET INTERRUPT0 ;; pointer to device "interrupt handler" +DEV_NAME0: DB 'PRN ' ;; device name( length : NAME_LEN) + ;; +DEV_HDR1: DW OFFSET DEV_HDR2 ;; becomes pointer to next device header + DW 0 ;; must be zero for no link + DW 0e040H ;; attribute (Char device) + ;; supports IOCTL calls + DW OFFSET STRATEGY1 ;; pointer to device "strategy" routine + DW OFFSET INTERRUPT1 ;; pointer to device "interrupt handler" +DEV_NAME1: DB 'LPT1 ' ;; device name( length : NAME_LEN) + ;; +DEV_HDR2: DW OFFSET DEV_HDR3 ;; becomes pointer to next device header + DW 0 ;; must be zero for no link + DW 0e040H ;; attribute (Char device) + ;; supports IOCTL calls + DW OFFSET STRATEGY2 ;; pointer to device "strategy" routine + DW OFFSET INTERRUPT2 ;; pointer to device "interrupt handler" +DEV_NAME2: DB 'LPT2 ' ;; device name( length : NAME_LEN) + ;; + ;; +DEV_HDR3: DD -1 ;; becomes pointer to next device header + DW 0e040H ;; attribute (Char device) + ;; supports IOCTL calls + DW OFFSET STRATEGY3 ;; pointer to device "strategy" routine + DW OFFSET INTERRUPT3 ;; pointer to device "interrupt handler" +DEV_NAME3: DB 'LPT3 ' ;; device name( length : NAME_LEN) + ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ***************************** +;; ** Resident Data Areas ** +;; ***************************** +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PRN/LPTn printer data based on BUF +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INIT_CHK DW 0 ;; internal flag : error loc. in INIT + ;; +BUF0: BUF_DATA <,,,,,,,,,,> ;; PRN + ;; +BUF1: BUF_DATA <,,,,,,,,,,> ;; LPT1 + ;; +BUF2: BUF_DATA <,,,,,,,,,,> ;; LPT2 + ;; +BUF3: BUF_DATA <,,,,,,,,,,> ;; LPT3 + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Hard/RAM slots table in the order of DEVICE parameters +; +; number of entries in all HARD_SLn is determined by the max. {HSLOTS} +; +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +HARD_SL1 : SLTS <,> ;; 1st hardware slots +HARD_SL1B: SLTS <,> ;; +HARD_SL1C: SLTS <,> ;; +HARD_SL1D: SLTS <,> ;; +HARD_SL1E: SLTS <,> ;; +HARD_SL1F: SLTS <,> ;; +HARD_SL1G: SLTS <,> ;; +HARD_SL1H: SLTS <,> ;; +HARD_SL1I: SLTS <,> ;; +HARD_SL1J: SLTS <,> ;; +HARD_SL1K: SLTS <,> ;; +HARD_SL1L: SLTS <,> ;; +HARD_SL1M: SLTS <,> ;; -- max. no. of code pages allowed +;;upto hardsl_max + 1 ;; + ;; +HARD_SL2 : SLTS <,> ;; 2nd hardware slots +HARD_SL2B: SLTS <,> ;; +HARD_SL2C: SLTS <,> ;; +HARD_SL2D: SLTS <,> ;; +HARD_SL2E: SLTS <,> ;; +HARD_SL2F: SLTS <,> ;; +HARD_SL2G: SLTS <,> ;; +HARD_SL2H: SLTS <,> ;; +HARD_SL2I: SLTS <,> ;; +HARD_SL2J: SLTS <,> ;; +HARD_SL2K: SLTS <,> ;; +HARD_SL2L: SLTS <,> ;; +HARD_SL2M: SLTS <,> ;; -- max. no. of code pages allowed +;;upto hardsl_max + 1 ;; + ;; +HARD_SL3 : SLTS <,> ;; 3rd hardware slots +HARD_SL3B: SLTS <,> ;; +HARD_SL3C: SLTS <,> ;; +HARD_SL3D: SLTS <,> ;; +HARD_SL3E: SLTS <,> ;; +HARD_SL3F: SLTS <,> ;; +HARD_SL3G: SLTS <,> ;; +HARD_SL3H: SLTS <,> ;; +HARD_SL3I: SLTS <,> ;; +HARD_SL3J: SLTS <,> ;; +HARD_SL3K: SLTS <,> ;; +HARD_SL3L: SLTS <,> ;; +HARD_SL3M: SLTS <,> ;; -- max. no. of code pages allowed +;;upto hardsl_max + 1 ;; + ;; +HARD_SL4 : SLTS <,> ;; 4TH hardware slots +HARD_SL4B: SLTS <,> ;; +HARD_SL4C: SLTS <,> ;; +HARD_SL4D: SLTS <,> ;; +HARD_SL4E: SLTS <,> ;; +HARD_SL4F: SLTS <,> ;; +HARD_SL4G: SLTS <,> ;; +HARD_SL4H: SLTS <,> ;; +HARD_SL4I: SLTS <,> ;; +HARD_SL4J: SLTS <,> ;; +HARD_SL4K: SLTS <,> ;; +HARD_SL4L: SLTS <,> ;; +HARD_SL4M: SLTS <,> ;; -- max. no. of code pages allowed +;;upto hardsl_max + 1 ;; + ;; + ;; +RAM_SL1 : SLTS <,> ;; 1st ram slots +RAM_SL1B: SLTS <,> ;; NOTE : must be only FOUR bytes for +RAM_SL1C: SLTS <,> ;; codepage positioning +RAM_SL1D: SLTS <,> ;; calculation as compared +RAM_SL1E: SLTS <,> ;; with each entry in FTDL_OFF +RAM_SL1F: SLTS <,> ;; +RAM_SL1G: SLTS <,> ;; +RAM_SL1H: SLTS <,> ;; +RAM_SL1I: SLTS <,> ;; +RAM_SL1J: SLTS <,> ;; +RAM_SL1K: SLTS <,> ;; +RAM_SL1L: SLTS <,> ;; -- max. no. of code pages allowed +;;upto ramsl_max, ;; + ;; +RAM_SL2 : SLTS <,> ;; 2nd ram slots +RAM_SL2B: SLTS <,> ;; +RAM_SL2C: SLTS <,> ;; +RAM_SL2D: SLTS <,> ;; +RAM_SL2E: SLTS <,> ;; +RAM_SL2F: SLTS <,> ;; +RAM_SL2G: SLTS <,> ;; +RAM_SL2H: SLTS <,> ;; +RAM_SL2I: SLTS <,> ;; +RAM_SL2J: SLTS <,> ;; +RAM_SL2K: SLTS <,> ;; +RAM_SL2L: SLTS <,> ;; -- max. no. of code pages allowed +;;upto ramsl_max, ;; + ;; +RAM_SL3 : SLTS <,> ;; 3rd ram slots +RAM_SL3B: SLTS <,> ;; +RAM_SL3C: SLTS <,> ;; +RAM_SL3D: SLTS <,> ;; +RAM_SL3E: SLTS <,> ;; +RAM_SL3F: SLTS <,> ;; +RAM_SL3G: SLTS <,> ;; +RAM_SL3H: SLTS <,> ;; +RAM_SL3I: SLTS <,> ;; +RAM_SL3J: SLTS <,> ;; +RAM_SL3K: SLTS <,> ;; +RAM_SL3L: SLTS <,> ;; -- max. no. of code pages allowed +;;upto ramsl_max, ;; + ;; +RAM_SL4 : SLTS <,> ;; 4th ram slots +RAM_SL4B: SLTS <,> ;; +RAM_SL4C: SLTS <,> ;; +RAM_SL4D: SLTS <,> ;; +RAM_SL4E: SLTS <,> ;; +RAM_SL4F: SLTS <,> ;; +RAM_SL4G: SLTS <,> ;; +RAM_SL4H: SLTS <,> ;; +RAM_SL4I: SLTS <,> ;; +RAM_SL4J: SLTS <,> ;; +RAM_SL4K: SLTS <,> ;; +RAM_SL4L: SLTS <,> ;; -- max. no. of code pages allowed +;;upto ramsl_max, ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; hard/RAM buffered slots on codepages + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +HBUF_SL1 LABEL WORD ;; hardware slots' buffer for LPT1/PRN + DW 0FFFFH ;; ---- only for CART-SLOTS + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; +;;upto hardsl_max+1, there are as many HARD_SLn + ;; +HBUF_SL2 LABEL WORD ;; hardware slots' buffer for LPT2 + DW 0FFFFH ;; ---- only for CART-SLOTS + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; +;;upto hardsl_max+1, there are as many HARD_SLn + ;; +HBUF_SL3 LABEL WORD ;; hardware slots' buffer for LPT3 + DW 0FFFFH ;; ---- only for CART-SLOTS + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; +;;upto hardsl_max+1, there are as many HARD_SLn + ;; + ;; +RBUF_SL1 LABEL WORD ;; ram slots' buffer for LPT1/PRN + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; +;;upto ramsl_max, there are as many RAM_SLn + ;; +RBUF_SL2 LABEL WORD ;; ram slots' buffer for LPT2 + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; +;;upto ramsl_max, there are as many RAM_SLn + ;; +RBUF_SL3 LABEL WORD ;; ram slots' buffer for LPT3 + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; + DW 0FFFFH ;; +;;upto ramsl_max, there are as many RAM_SLn + ;; +FTDL_OFF1 LABEL WORD ;; offset of FTSTART for PRN/LPT1 + DW 0 ;; NOTE : must be only two bytes for + DW 0 ;; codepage positioning + DW 0 ;; calculation as compared + DW 0 ;; with each entry in RAM_SLOT + DW 0 ;; or CART_SLOT + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; +;;upto the max. of {ramsl_max,hardsl_max} + ;; +FTDL_OFF2 LABEL WORD ;; offset of FTSTART for LPT2 + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; +;;upto the max. of {ramsl_max,hardsl_max} + ;; +FTDL_OFF3 LABEL WORD ;; offset of FTSTART for LPT3 + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; + DW 0 ;; +;;upto the max. of {ramsl_max,hardsl_max} + ;; + ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Printer Description Tables +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +ESC_CHAR EQU 27 ;; + ;; +db 'PRINTER_DESC' ;; + ;; +PRINTER_DESC_NUM DW 3 ;; number of PRINTER_DESCn + ;; +PRINTER_DESC_TBL LABEL WORD ;; + DW OFFSET(PRINTER_DESC1) ;; + DW OFFSET(PRINTER_DESC2) ;; + DW OFFSET(PRINTER_DESC3) ;; + DW OFFSET(PRINTER_DESC4) ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Printer Description Table for Proprinter (4201) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +PRINTER_DESC1 : ;; + ;; + PDSH <,'4201 ',,,0,212,1,1,1> ;; followed by the rest in PDS + ;; CLASS = 0 + ;; FTSZPA = 212 ==> 212 x 16=3008 bytes + ;; of font buffer + ;; HSLOTS = 1 (check CTL4201_B) + ;; HWCPMIN = 1 + ;; RSLOTS = 1 (check CTL4201_B) + ;; + DW OFFSET(CTL4201_H) + DW OFFSET(CTL4201_R) + DW OFFSET(CTL4201_B) + ;; (CTL_MAX = 32) + ;; (32 bytes for each control) + ;; (MUST BE ADJACENT...no blanks bet.:) +CTL4201_H : DB 5,ESC_CHAR,'I',0,ESC_CHAR,"6" ;; selection control 1 +CTL4201_R : DB 5,ESC_CHAR,'I',4,ESC_CHAR,"6" ;; selection control 2 + db 26 dup (0) ;; for CTL4201_H + db 26 dup (0) ;; for CTL4201_R + ;; +CTL4201_B DB CTL_MAX DUP (0) ;; max. two selection + DB CTL_MAX DUP (0) ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Printer Description Table for 5202 +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +PRINTER_DESC2 : ;; + PDSH <,'5202 ',,,1,2,2,1,0> ;; followed by the rest in PDS + ;; CLASS = 1 (font buffers allowed + ;; if there is cart-slot) + ;; FTSZPA = 2 ==> 2 x 16 = 32 bytes + ;; of font buffer + ;; HSLOTS = 2 (check CTL5202_B) + ;; HWCPMIN = 1 + ;; RSLOTS = 0 (check CTL5202_B) + ;; + DW OFFSET(CTL5202_H) + DW OFFSET(CTL5202_R) + DW OFFSET(CTL5202_B) + ;; + ;; (CTL_MAX = 32) + ;; (SEE CTL5202_OFFS) + ;; (32 bytes for each control) +CTL5202_H : DB 12,ESC_CHAR,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 1 + dB ESC_CHAR,"6" ;; + DB 12,ESC_CHAR,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 2 + dB ESC_CHAR,"6" ;; + db 19 dup (0) ;; for CTL5202_H selection 1 + db 19 dup (0) ;; for CTL5202_H selection 2 +CTL5202_R : DB 0 ;; + ;; +CTL5202_B DB CTL_MAX DUP (0) ;; max. two selection + DB CTL_MAX DUP (0) ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Printer Description Table for RESERVED PRINTER (res1) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +PRINTER_DESC3 : ;; + ;; + PDSH <,'4208 ',,,1,2,2,1,0> ;; followed by the rest in PDS + ;; CLASS = 1 + ;; FTSZPA = 2 + ;; HSLOTS = 2 + ;; HWCPMIN = 1 + ;; RSLOTS = 0 + ;; + DW OFFSET(CTL4208_H) + DW OFFSET(CTL4208_R) + DW OFFSET(CTL4208_B) + ;; (CTL_MAX = 32) + ;; (32 bytes for each control) + ;; (MUST BE ADJACENT...no blanks bet.:) +CTL4208_H : DB 0Bh,ESC_CHAR,49h,0Ah ;; selection control 1 + DB ESC_CHAR,49h,03 + DB ESC_CHAR,49h,02 + DB ESC_CHAR,36h + db 20 dup (0) +CTL4208_R : DB 0Bh,ESC_CHAR,49h,0Eh ;; selection control 2 + DB ESC_CHAR,49h,7 + DB ESC_CHAR,49h,6 + DB ESC_CHAR,36h + db 20 dup (0) ;; for CTLres1_H and CTRLres1_R + ;; +CTL4208_B DB CTL_MAX DUP (0) ;; max. two selection + DB CTL_MAX DUP (0) ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Printer Description Table for RESERVED PRINTER (res2) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +PRINTER_DESC4 : ;; + ;; + PDSH <,'nnnnnnnn',,,0,0,1,1,1> ;; followed by the rest in PDS + ;; CLASS = 0 + ;; FTSZPA = 0 + ;; HSLOTS = 1 + ;; HWCPMIN = 1 + ;; RSLOTS = 1 + ;; + DW OFFSET(CTLres2_H) + DW OFFSET(CTLres2_R) + DW OFFSET(CTLres2_B) + ;; (CTL_MAX = 32) + ;; (32 bytes for each control) + ;; (MUST BE ADJACENT...no blanks bet.:) +CTLres2_H : DB 0 ;; selection control 1 +CTLres2_R : DB 32 dup (0) ;; selection control 2 + db 32 dup (0) ;; for CTLres2_H and CTRLres2_R + ;; +CTLres2_B DB CTL_MAX DUP (0) ;; max. two selection + DB CTL_MAX DUP (0) ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +TEMP_SI DW ? ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; The request header for IOCTL call +;; to the Normal device driver +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +REQ_NORM1 GIH <,,,,,> ;; for LPT1/PRN + GB2S <,> ;; +REQ_NORM2 GIH <,,,,,> ;; for LPT2 + GB2S <,> ;; +REQ_NORM3 GIH <,,,,,> ;; for LPT3 + GB2S <,> ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; +;; PARSER'S TABLES +;; +;; -- TABLE is the first table of the results of the parsing. +;; The first word (number of devices) will be set to 0 if +;; syntax error is detected in the DEVICE command line. +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; TABLE STRUCTURE FOR RETURNING VALUES TO THE INIT MODULE WGR +; (ADAPTED FROM VERSION 1.0 DISPLAY.SYS) WGR +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +TABLE LABEL BYTE ; table header ;AN000; +DEVICE_NUM DW ZERO ; initialized to zero devices ;AN000; + DW TABLE1_1 ; pointer to table 2 for device 1 ;AN000; + DW TABLE2_1 ; pointer to table 2 for device 2 ;AN000; + DW TABLE3_1 ; pointer to table 2 for device 3 ;AN000; + DW TABLE4_1 ; pointer to table 2 for device 4 ;AN000; + ;AN000; +TABLE1_1 LABEL WORD ;AN000; + DW FOUR ; 4 pointer follow ;AN000; + DW TABLE1_2 ; pointer to table 3 (device name) ;AN000; + DW TABLE1_3 ; pointer to table 4 (device id) ;AN000; + DW TABLE1_4 ; pointer to table 5 (hwcp's) ;AN000; + DW TABLE1_5 ; pointer to table 6 (num desg's and fonts) ;AN000; + DW -1 ; reserved ;AN000; + ;AN000; +TABLE1_2 LABEL WORD ; device name (ie. PRN) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE1_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE1_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; + DW ZERO ; number ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + ;AN000; +TABLE1_5 LABEL WORD ; Designates and fonts ;AN000; + DW ZERO ; values given (0 - 2 valid) ;AN000; + DW -1 ; n value ;AN000; + DW -1 ; m value ;AN000; + ;AN000; +TABLE2_1 LABEL WORD ;AN000; + DW FOUR ; 4 pointer follow ;AN000; + DW TABLE2_2 ; pointer to table 3 (device name) ;AN000; + DW TABLE2_3 ; pointer to table 4 (device id) ;AN000; + DW TABLE2_4 ; pointer to table 5 (hwcp's) ;AN000; + DW TABLE2_5 ; pointer to table 6 (num desg's and fonts) ;AN000; + DW -1 ; reserved ;AN000; + ;AN000; +TABLE2_2 LABEL WORD ; device name (ie. PRN) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE2_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE2_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; + DW ZERO ; number ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + ;AN000; +TABLE2_5 LABEL WORD ; Designates and fonts ;AN000; + DW ZERO ; values given (0 - 2 valid) ;AN000; + DW -1 ; n value ;AN000; + DW -1 ; m value ;AN000; + ;AN000; +TABLE3_1 LABEL WORD ;AN000; + DW FOUR ; 4 pointer follow ;AN000; + DW TABLE3_2 ; pointer to table 3 (device name) ;AN000; + DW TABLE3_3 ; pointer to table 4 (device id) ;AN000; + DW TABLE3_4 ; pointer to table 5 (hwcp's) ;AN000; + DW TABLE3_5 ; pointer to table 6 (num desg's and fonts) ;AN000; + DW -1 ; reserved ;AN000; + ;AN000; +TABLE3_2 LABEL WORD ; device name (ie. PRN) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE3_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE3_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; + DW ZERO ; number ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + ;AN000; +TABLE3_5 LABEL WORD ; Designates and fonts ;AN000; + DW ZERO ; values given (0 - 2 valid) ;AN000; + DW 0 ; n value ;AN000; + DW 0 ; m value ;AN000; + ;AN000; +TABLE4_1 LABEL WORD ;AN000; + DW FOUR ; 4 pointer follow ;AN000; + DW TABLE4_2 ; pointer to table 3 (device name) ;AN000; + DW TABLE4_3 ; pointer to table 4 (device id) ;AN000; + DW TABLE4_4 ; pointer to table 5 (hwcp's) ;AN000; + DW TABLE4_5 ; pointer to table 6 (num desg's and fonts) ;AN000; + DW -1 ; reserved ;AN000; + ;AN000; +TABLE4_2 LABEL WORD ; device name (ie. PRN) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE4_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; + DW ZERO ; length ;AN000; + DB " " ; value ;AN000; + ;AN000; +TABLE4_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; + DW ZERO ; number ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + DW -1 ; value ;AN000; + ;AN000; +TABLE4_5 LABEL WORD ; Designates and fonts ;AN000; + DW ZERO ; values given (0 - 2 valid) ;AN000; + DW 0 ; n value ;AN000; + DW 0 ; m value ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +reserved1 DW ? ;; reserved for debugging used +reserved2 dw ? ;; + ;; +;;;;;;;;ASSUME DS:NOTHING ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; PRN Device "strategy" entry point +;; +;; Retain the Request Header address for use by Interrupt routine +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STRATEGY0 PROC FAR ;; + PUSH BX ;; + PUSH BX ;; + LEA BX, BUF0 ;; BUF = BUF0 CS:[BX] + POP buf.RH_PTRO ;; offset of request header + MOV buf.RH_PTRS,ES ;; segment + POP BX ;; + RET ;; +STRATEGY0 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; LPT1 Device "strategy" entry point +;; +;; Retain the Request Header address for use by Interrupt routine +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STRATEGY1 PROC FAR ;; + PUSH BX ;; + PUSH BX ;; + LEA BX, BUF1 ;; BUF = BUF1 CS:[BX] + POP buf.RH_PTRO ;; offset of request header + MOV buf.RH_PTRS,ES ;; segment + POP BX ;; + RET ;; +STRATEGY1 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; LPT2 Device "strategy" entry point +;; +;; Retain the Request Header address for use by Interrupt routine +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STRATEGY2 PROC FAR ;; + PUSH BX ;; + PUSH BX ;; + LEA BX, BUF2 ;; BUF = BUF2 CS:[BX] + POP buf.RH_PTRO ;; offset of request header + MOV buf.RH_PTRS,ES ;; segment + POP BX ;; + RET ;; +STRATEGY2 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; LPT3 Device "strategy" entry point +;; +;; Retain the Request Header address for use by Interrupt routine +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STRATEGY3 PROC FAR ;; + PUSH BX ;; + PUSH BX ;; + LEA BX, BUF3 ;; BUF = BUF3 CS:[BX] + POP buf.RH_PTRO ;; offset of request header + MOV buf.RH_PTRS,ES ;; segment + POP BX ;; + RET ;; +STRATEGY3 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Table of command / functions supported by LPTn +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; CMD_CODES code supported by LPTn + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CMD_CODES LABEL BYTE ;; + DB CMD_INI ;; Initialization + DB CMD_WRT ;; output + DB 09 ;; output + DB 12 ;; output +CMD_INDX EQU ($-CMD_CODES) ;; number of entries in CMD_CODES + ;; + ;; Write (CMD_WRT) has exceptional + ;; support by LPTn + ;; + ;; Generic IOCTL (CMD_GIO) leads to + ;; GIO_CODES + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; GIO_CODES code supported by LPTn + ;; -- command = CMD_GIO and + ;; major function = MAF_PTR + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +GIO_CODES LABEL BYTE ;; minor GIO functions supported : + DB MIF_DST ;; - designate start + DB MIF_DEN ;; - designate end + DB MIF_IVK ;; - invoke + DB MIF_QIV ;; - query-invoked + DB MIF_QLS ;; - query-list +GIO_INDX EQU ($-GIO_CODES) ;; number of entries in GIO_CODES + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Cases supported by LPTn + ;; -- first section matched with + ;; CMD_CODES upto CMD_INDX + ;; + ;; -- 2nd section matched with + ;; GIO_CODES for GIO_INDEX more + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CASES LABEL WORD ;; in CMD_CODES order + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + DW OFFSET INIT ;; 0 - Initialization + DW OFFSET WRITE ;; + DW OFFSET WRITE ;; + DW OFFSET WRITE ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; in GIO_CODES order + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + DW OFFSET DESIGNATE_START ;; + DW OFFSET DESIGNATE_END ;; + DW OFFSET INVOKE ;; + DW OFFSET Q_INVOKED ;; + DW OFFSET Q_LIST ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Memory Allocation +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; + ;; +MEM_REQUEST DW -1 ;; flag used for first time memory + ;; allocation for each device + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; PRN Device "interrupt" entry point +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INTERRUPT0 PROC FAR ;; device interrupt entry point + ;; + PUSH DS ;; save all registers Revised + PUSH ES ;; + PUSH AX ;; + PUSH BX ;; + PUSH CX ;; + PUSH DX ;; + PUSH DI ;; + PUSH SI ;; + ;; BP isn't used, so it isn't saved + push cs ;; + pop ds ;; + ;; + CMP STACK_ALLOCATED,0AAH ;; + JNE PRN_NO_STACK ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; STACK RECODING SEPT 28/86 +; +; GORDON GIDDINGS +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX,STACK_SIZE ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + MOV CS:TEMP_SI,SI ;G; + MOV SI,RESIDENT_END ;G; + SUB SI,STACK_SIZE ;G; + ;G; + mov reserved1,AX ;G; + mov reserved2,SI ;G; + ;G; + CLI ;G; + MOV DX,SS ;G; + MOV CX,SP ;G; + MOV SS,SI ;G; + MOV SP,AX ;G; + STI ;G; + MOV SI,CS:TEMP_SI ;G; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + PUSH DX ;; SAVE OLD SS ONTO STACK + PUSH CX ;; " " SP " " + ;; +PRN_NO_STACK : ;; + ;; + ;; + MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor + ;; + PUSH DI ;; push return address onto stack + ;; command routine issues "RET" + ;; + LEA BX, BUF0 ;; PRN BUF = BUF0 , CS:BX + ;; + MOV MEM_REQUEST,-1 ;; to be set to zero only once + ;; + CMP BUF.BFLAG,-1 ;; + JNE PRN_INITED ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV BUF.BFLAG,BF_PRN ;; INITIALIZE PRN BUFFER + ;; + MOV DI,OFFSET DEV_HDR0 ;; PRN Device header + MOV BUF.DEV_HDRO,DI ;; + MOV BUF.DEV_HDRS,CS ;; must be CS + ;; + MOV DI,OFFSET HBUF_SL1 ;; PRN/LPT1 buffer for Hardware-slots + MOV BUF.HRBUFO,DI ;; + ;; + MOV DI,OFFSET RBUF_SL1 ;; PRN/LPT1 buffer for RAM-slots + MOV BUF.RMBUFO,DI ;; + ;; + MOV DI,OFFSET FTDL_OFF1 ;; + MOV BUF.FTDLO,DI ;; + ;; + MOV DI,OFFSET REQ_NORM1 ;; PRN/LPT1 request header + MOV BUF.RNORMO,DI ;; + ;; + MOV BUF.FSELEN,0 ;; selection control length + ;; + mov buf.prn_bufo,offset buf0;; + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +PRN_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; FONT BUFFER TO BE CREATED ? + CMP BUF.BFLAG,BF_PRN ;; + JNE PRN_MEM_DONE ;; + ;; + OR BUF.BFLAG,BF_MEM_DONE ;; do it only once. + ;; + CMP BUF.STATE,CPSW ;; + JNE PRN_MEM_DONE ;; create only if state is CPSW + ;; +PRN_MEM_CREATE : ;; + XOR AX,AX ;; THEN CREATE + MOV MEM_REQUEST,AX ;; to set to zero only once for each + ;; LPTn or PRN +PRN_MEM_DONE : ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; LPT1 Device "interrupt" entry point +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +INTERRUPT1 PROC FAR ;; device interrupt entry point + ;; + PUSH DS ;; save all registers Revised + PUSH ES ;; + PUSH AX ;; + PUSH BX ;; + PUSH CX ;; + PUSH DX ;; + PUSH DI ;; + PUSH SI ;; + ;; BP isn't used, so it isn't saved + push cs ;; + pop ds ;; + ;; + CMP STACK_ALLOCATED,0AAH ;; + JNE LPT1_NO_STACK ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; STACK RECODING SEPT 28/86 +; +; GORDON GIDDINGS +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX,STACK_SIZE ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + MOV CS:TEMP_SI,SI ;G; + MOV SI,RESIDENT_END ;G; + SUB SI,STACK_SIZE ;G; + ;G; + mov reserved1,AX ;G; + mov reserved2,SI ;G; + ;G; + CLI ;G; + MOV DX,SS ;G; + MOV CX,SP ;G; + MOV SS,SI ;G; + MOV SP,AX ;G; + STI ;G; + MOV SI,CS:TEMP_SI ;G; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + PUSH DX ;; SAVE OLD SS ONTO STACK + PUSH CX ;; " " SP " " + ;; +LPT1_NO_STACK : ;; + ;; + MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor + ;; + PUSH DI ;; push return address onto stack + ;; command routine issues "RET" + LEA BX, BUF1 ;; LPT1 BUF = BUF1 , CS:BX + ;; + MOV MEM_REQUEST,-1 ;; to be set to zero only once + ;; + CMP BUF.BFLAG,-1 ;; + JNE LPT1_INITED ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV BUF.BFLAG,BF_LPT1 ;; INITIALIZE LPT1 BUFFER + ;; + MOV DI,OFFSET DEV_HDR1 ;; LPT1 Device header + MOV BUF.DEV_HDRO,DI ;; + MOV BUF.DEV_HDRS,CS ;; must be CS + ;;.................................... + LEA DI,BUF.RNORMO ;; duplicate common infor. between + PUSH CS ;; PRN and LPT1 + POP ES ;; + LEA CX,BUF.BUFEND ;; + SUB CX,DI ;; + LEA SI, BUF0 ;; + LEA SI,[SI].RNORMO ;; + REP MOVS ES:BYTE PTR[DI],CS:[SI] + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +LPT1_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; FONT MEMORY TO BE CREATED ? + CMP BUF.BFLAG,BF_LPT1 ;; + JNE LPT1_MEM_DONE ;; + ;; + OR BUF.BFLAG,BF_MEM_DONE ;; no more next time + ;; + CMP BUF.STATE,CPSW ;; + JNE LPT1_MEM_DONE ;; do it only if state is CPSW + ;; +LPT1_MEM_CREATE : ;; + XOR AX,AX ;; THEN CREATE MEMORY + MOV MEM_REQUEST,AX ;; to set to zero only once for each + ;; +LPT1_MEM_DONE : ;; + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +INTERRUPT1 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; LPT2 Device "interrupt" entry point +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +INTERRUPT2 PROC FAR ;; device interrupt entry point + ;; + PUSH DS ;; save all registers Revised + PUSH ES ;; + PUSH AX ;; + PUSH BX ;; + PUSH CX ;; + PUSH DX ;; + PUSH DI ;; + PUSH SI ;; + ;; BP isn't used, so it isn't saved + push cs ;; + pop ds ;; + ;; + CMP STACK_ALLOCATED,0AAH ;; + JNE LPT2_NO_STACK ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; STACK RECODING SEPT 28/86 +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX,STACK_SIZE ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + MOV CS:TEMP_SI,SI ;G; + MOV SI,RESIDENT_END ;G; + SUB SI,STACK_SIZE ;G; + ;G; + mov reserved1,AX ;G; + mov reserved2,SI ;G; + ;G; + CLI ;G; + MOV DX,SS ;G; + MOV CX,SP ;G; + MOV SS,SI ;G; + MOV SP,AX ;G; + STI ;G; + MOV SI,CS:TEMP_SI ;G; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + PUSH DX ;; SAVE OLD SS ONTO STACK + PUSH CX ;; " " SP " " + ;; +LPT2_NO_STACK : ;; + ;; + MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor + ;; + PUSH DI ;; push return address onto stack + ;; command routine issues "RET" + ;; + LEA BX, BUF2 ;; LPT2 BUF = BUF2 , CS:BX + ;; + MOV MEM_REQUEST,-1 ;; to be set to zero only once + ;; + CMP BUF.BFLAG,-1 ;; + JNE LPT2_INITED ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV BUF.BFLAG,BF_LPT2 ;; initialise LPT2 buffer + ;; + MOV DI,OFFSET DEV_HDR2 ;; LPT2 Device header + MOV BUF.DEV_HDRO,DI ;; + MOV BUF.DEV_HDRS,CS ;; must be CS + ;; + MOV DI,OFFSET HBUF_SL2 ;; LPT2 buffer for Hardware-slots + MOV BUF.HRBUFO,DI ;; + ;; + MOV DI,OFFSET RBUF_SL2 ;; LPT2 buffer for RAM-slots + MOV BUF.RMBUFO,DI ;; + ;; + MOV DI,OFFSET FTDL_OFF2 ;; + MOV BUF.FTDLO,DI ;; + ;; + ;; + MOV DI,OFFSET REQ_NORM2 ;; LPT2 request header + MOV BUF.RNORMO,DI ;; + ;; + MOV BUF.FSELEN,0 ;; selection control length + ;; + mov buf.prn_bufo,offset buf2;; + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +LPT2_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; FONT BUFFER TO BE CREATED ? + CMP BUF.BFLAG,BF_LPT2 ;; + JNE LPT2_MEM_DONE ;; + ;; + OR BUF.BFLAG,BF_MEM_DONE ;; + ;; + CMP BUF.STATE,CPSW ;; + JNE LPT2_MEM_DONE ;; + ;; + XOR AX,AX ;; + MOV MEM_REQUEST,AX ;; to set to zero only once for each + ;; LPTn or PRN +LPT2_MEM_DONE : ;; + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +INTERRUPT2 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; LPT3 Device "interrupt" entry point +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +INTERRUPT3 PROC FAR ;; device interrupt entry point + ;; + PUSH DS ;; save all registers Revised + PUSH ES ;; + PUSH AX ;; + PUSH BX ;; + PUSH CX ;; + PUSH DX ;; + PUSH DI ;; + PUSH SI ;; + ;; BP isn't used, so it isn't saved + push cs ;; + pop ds ;; + ;; + CMP STACK_ALLOCATED,0AAH ;; + JNE LPT3_NO_STACK ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; STACK RECODING SEPT 28/86 +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX,STACK_SIZE ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + SHL AX,1 ;G; + MOV CS:TEMP_SI,SI ;G; + MOV SI,RESIDENT_END ;G; + SUB SI,STACK_SIZE ;G; + ;G; + mov reserved1,AX ;G; + mov reserved2,SI ;G; + ;G; + CLI ;G; + MOV DX,SS ;G; + MOV CX,SP ;G; + MOV SS,SI ;G; + MOV SP,AX ;G; + STI ;G; + MOV SI,CS:TEMP_SI ;G; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + PUSH DX ;; SAVE OLD SS ONTO STACK + PUSH CX ;; " " SP " " + ;; +LPT3_NO_STACK : ;; + ;; + MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor + ;; + PUSH DI ;; push return address onto stack + ;; command routine issues "RET" + ;; + LEA BX, BUF3 ;; LPT3 BUF = BUF3 , CS:BX + ;; + MOV MEM_REQUEST,-1 ;; to be set to zero only once + ;; + CMP BUF.BFLAG,-1 ;; + JNE LPT3_INITED ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV BUF.BFLAG,BF_LPT3 ;; INITIALIZE LPT3 BUFFER + ;; + MOV DI,OFFSET DEV_HDR3 ;; LPT3 Device header + MOV BUF.DEV_HDRO,DI ;; + MOV BUF.DEV_HDRS,CS ;; must be CS + ;; + MOV DI,OFFSET HBUF_SL3 ;; LPT3 buffer for Hardware-slots + MOV BUF.HRBUFO,DI ;; + ;; + MOV DI,OFFSET RBUF_SL3 ;; LPT3 buffer for RAM-slots + MOV BUF.RMBUFO,DI ;; + ;; + MOV DI,OFFSET FTDL_OFF3 ;; + MOV BUF.FTDLO,DI ;; + ;; + ;; + MOV DI,OFFSET REQ_NORM3 ;; LPT3 request header + MOV BUF.RNORMO,DI ;; + ;; + MOV BUF.FSELEN,0 ;; selection control length + ;; + mov buf.prn_bufo,offset buf3;; + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +LPT3_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; FONT BUFFER TO BE CREATED ? + CMP BUF.BFLAG,BF_LPT3 ;; + JNE LPT3_MEM_DONE ;; + ;; + OR BUF.BFLAG,BF_MEM_DONE ;; no more next time + ;; + CMP BUF.STATE,CPSW ;; + JNE LPT3_MEM_DONE ;; + ;; + XOR AX,AX ;; + MOV MEM_REQUEST,AX ;; to set to zero only once for each + ;; LPTn or PRN +LPT3_MEM_DONE : ;; + ;; + JMP COMMON_INTR ;; common interrupt handler + ;; +INTERRUPT3 ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Common interrupt entry : +; at entry, BUFn (CS:BX) of LPTn is defined +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +COMMON_INTR : ;; + CLD ;; all moves forward +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Check if header link has to be set +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + LDS SI,DWORD PTR BUF.DEV_HDRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; device header : DS:[SI] + CMP BUF.LPT_STRAO, -1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + JNE DOSLPT_FOUND ;; has been linked to DOS LPTn + CMP BUF.LPT_STRAS, -1 ;; + JNE DOSLPT_FOUND ;; has been linked to DOS LPTn + LDS SI,DWORD PTR BUF.DEV_HDRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; next device header : ES:[DI] + LES DI,DWORD PTR HP.DH_NEXTO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + PUSH ES ;; + POP AX ;; + AND AX,AX ;; + JNZ L1 ;; + JMP DOSLPT_FOUND ;; link not yet set up + ;; +;$SEARCH WHILE ;; pointer to next device header is NOT +L1: + PUSH ES ;; -1 + POP AX ;; + CMP AX,-1 ;; +;$LEAVE E, AND ;; leave if both offset and segment are + JNE NOT0FFFF + + CMP DI,-1 ;; 0FFFFH +;$LEAVE E ;; + JE L2 + +NOT0FFFF: ;; + PUSH DI ;; + PUSH SI ;; + MOV CX,NAME_LEN ;; + LEA DI,NHD.DH_NAME ;; + LEA SI,HP.DH_NAME ;; + REPE CMPSB ;; + POP SI ;; + POP DI ;; + AND CX,CX ;; + +;$EXITIF Z ;; exit if name is found in linked hd. + JNZ L3 ;; name is not found + ;; + ;; name is found in the linked header + MOV AX,NHD.DH_STRAO ;; get the STRATEGY address +; ADD AX,DI ;; + MOV BUF.LPT_STRAO,AX ;; + MOV AX,ES ;; +; JNC X1 ;; +; ADD AX,1000H ;; carrier overflow +X1: MOV BUF.LPT_STRAS,AX ;; + ;; + MOV AX,NHD.DH_INTRO ;; get the INTERRUPT address +; ADD AX,DI ;; + MOV BUF.LPT_INTRO,AX ;; + MOV AX,ES ;; +; JNC X2 ;; +; ADD AX,1000H ;; carrier overflow +X2: MOV BUF.LPT_INTRS,AX ;; + ;; + ;; +;$ORELSE ;; find next header to have the same + ;; device name + JMP L4 ;; +L3: ;; + LES DI,DWORD PTR NHD.DH_NEXTO ; + ;; +;$ENDLOOP ;; + JMP L1 ;; +L2: ;; +;$ENDSRCH ;; +L4: ;; + ;; +DOSLPT_FOUND : ;; device header link has been + ;; established + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; COMMAND REQUEST +; ES:DI Request Header , and +; +; CMD_CODES, GIO_CODES +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; get RH address passed to + ;; + MOV AL,RH.RHC_CMD ;; + CMP AL,CMD_GIO ;; + JE GIO_COMMAND ;; + ;; + PUSH CS ;; non-GIO command + POP ES ;; + MOV DI,OFFSET CMD_CODES ;; + MOV CX,CMD_INDX ;; + ;; find if command is in CMD_CODES ? + REPNE SCASB ;; + JNE UN_SUP ;; + MOV SI,CMD_INDX ;; the command is supported : + SUB SI,CX ;; + DEC SI ;; index to CASES + JMP SUPPORTED ;; + ;; +UN_SUP: JMP NORM_DRIVER ;; to be handled by DOS normal driver + ;; +GIO_COMMAND : ;; Check if it is valid GIO + ;; +GIO_CASES : ;; supported GIO command + MOV AL,RH.GIH_MIF ;; + ;; use minor function to locate + PUSH CS ;; + POP ES ;; + MOV DI,OFFSET GIO_CODES ;; + MOV CX,GIO_INDX ;; + ;; find if command is in GIO_CODES ? + REPNE SCASB ;; + JNE NORM_DRIVER ;; + MOV SI,GIO_INDX ;; the command is supported : + SUB SI,CX ;; + DEC SI ;; index to CASES + ADD SI,CMD_INDX ;; + ;; +SUPPORTED : ;; command/functions supported by LPTn + ;; + ADD SI,SI ;; double to index to WORD-offset + ;; + XOR AX,AX ;; initialize return to "no error" + ;; + LES DI,dword ptr buf.rh_ptro ;; get RH address again + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; At entry to command processing routine: +; +; ES:DI = Request Header address +; CS:BX = Buffer for lptn +; CS = code segment address +; AX = 0 +; +; top of stack is return address, IRPT_CMD_EXIT +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + JMP CS:CASES[SI] ;; call routine to handle the command + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +IRPT_CMD_EXIT: ;; return from command routine + ;; AX = value to OR into status word + LES DI,dword ptr buf.rh_ptro ;; restore ES:DI as Request Header ptr + MOV AX,RH.RHC_STA ;; + OR AH,STAT_DONE ;; add "done" bit to status word + MOV RH.RHC_STA,AX ;; store status into request header + ;; + ;; + ;; *** USING INTERNATL STACK ? *** + ;; + CMP STACK_ALLOCATED,-1 ;; + JE RET0_NO_STACK ;; + ;; + CMP STACK_ALLOCATED,0 ;; + JNE RET0_IN_STACK ;; + ;; + MOV STACK_ALLOCATED,0AAH ;; NEXT interrupt will start using + JMP RET0_NO_STACK ;; internal STACK + ;; +RET0_IN_STACK : ;; use internal STACK !!!! + POP CX ;get old SP from stack + POP DX ;get old SS from stack + CLI ;disable interrupts while changing SS:SP + MOV SS,DX ;restore stack segment register + MOV SP,CX ;restore stack pointer register + STI ;enable interrupts + ;; + ;; +RET0_NO_STACK : ;; + ;; + POP SI ;; restore registers + POP DI ;; + POP DX ;; + POP CX ;; + POP BX ;; + POP AX ;; + POP ES ;; + POP DS ;; + RET ;; + ;; +INTERRUPT0 ENDP ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Command not supported by CPSW device driver +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +NORM_DRIVER PROC ;; LPT OUTPUT to the DOS LPTn + ;; + PUSH BX ;; **** BUF. is changed **** + PUSH BX ;; + POP SI ;; + LES BX,DWORD PTR BUF.RH_PTRO ;; pass the request header to the + CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine. + ;; + POP BX ;; + CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn + RET ;; + ;; +NORM_DRIVER ENDP ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Command Code - lpt_output ======= +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +WRITE PROC ;; LPT OUTPUT to the DOS LPTn + ;; + ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; restore ES:DI as Request Header ptr + ;; + MOV AX,BUF.STATE ;; + CMP AX,NORMAL ;; + JNE WRT_NOT_NORMAL ;; + JMP WRT_NORMAL ;; + ;; +WRT_NOT_NORMAL : ;; + CMP AX,DESG_END ;; + JNE WRT_FONT ;; + JMP NO_MORE_FTBLK ;; ignore the write + ;; +WRT_FONT : ;; + CMP AX,DESG_WR ;; + JE WRT_DESIGNATE ;; + JMP WRT_NORMAL ;; + ;;------------------------- +WRT_DESIGNATE : ;; DESIGNATE WRITE + MOV AX,BUF.STATUS ;; + AND AX,FAIL ;; + JZ WRT_DESG_GOOD ;; + JMP WRT_IGNORE ;; already failed + ;; +WRT_DESG_GOOD : ;; + MOV SI,OFFSET FTABLE ;; + PUSH CS ;; + POP DS ;; + ;; + MOV DS:[SI].FLAG,0 ;; no restart + MOV AX,RH.RH3_CNT ;; + MOV DS:[SI].BUFFER_LEN,AX ;; length of request packet + ;; + PUSH SI ;; + LEA SI,[SI].BUFFER_ADDR ;; packet address + MOV AX,RH.RH3_DTAO ;; + MOV DS:[SI],AX ;; + INC SI ;; + INC SI ;; + MOV AX,RH.RH3_DTAS ;; + MOV DS:[SI],AX ;; + POP SI ;; + ;; +FP_CALL : ;; ************************** + CALL FONT_PARSER ;; ** Parse the Font File ** +FP_RETURN : ;; ************************** + ;; + ;; -- only for the RAM slot -- + ;; + ;; PROCESS THE RETURNED FONT : + ;; SI = FTABLE + MOV ES,BUF.FTSTART ;; ES = the start of the font buffer, + ;; its entry corresponds to the + ;; positioning of codepage in slot + MOV DI,BUF.FTSLOTO ;; DI = start of the slot of codepages + ;; CX = slot size of the font downloaded + MOV CX,BUF.RBUFMX ;; --- if there is no designate + MOV AX,BUF.STATUS ;; + AND AX,DSF_CARTCP ;; + JZ CHECK_RETURN ;; + MOV CX,BUF.HSLMX ;; -- with/without designate, <>0 + ;; +CHECK_RETURN : ;; + ;; + MOV DX,CS:[SI].NUM_FTBLK ;; DX = number fo code pages loaded + ;; + ADD SI,TYPE FBUFS ;; SI = points to FTBLK + ;;................................... +PARSE_FTBLK : ;; **** LOOP **** + ;; + ;; + AND DX,DX ;; + JNZ SKIP_SLOT ;; + JMP NO_MORE_FTBLK ;; **** LOOP EXIT (FTBLK end) **** + ;;................................... + ;; **** LOOP (on each FTBLK) **** + ;; + ;; skip on the slot until the codepage +SKIP_SLOT : ;; is one of the downloaded. + AND CX,CX ;; + JNZ LOCATE_SLOT ;; + XOR AX,AX ;; + PUSH AX ;; + POP ES ;; ES = 0, no font storage(less buffer) + JMP SLOT_FOUND ;; + ;; +LOCATE_SLOT: ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_load ;; + Jnz SLOT_FOUND ;; + INC DI ;;######## NEXT SLOT ############ + INC DI ;; + INC DI ;; + INC DI ;; next slot + PUSH ES ;; + POP AX ;; + ADD AX,BUF.FTSZPA ;; + PUSH AX ;; + POP ES ;; next buffer + DEC CX ;;#################################### + JMP SKIP_SLOT ;; + ;; +SLOT_FOUND : ;; + MOV AX,CS:[SI].FTB_STATUS ;; + CMP AX,0FFF0H ;; + JNB CHECK_FSTAT ;; + ;; + OR BUF.STATUS,FAIL ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,AX ;; + JMP WRITE_RET ;; **** LOOP EXIT (fail) **** + ;; +CHECK_FSTAT : ;; + CMP AX,FSTAT_FONT ;; + JNE NEXT_FTBLK ;; + ;; + MOV AX,CS:[SI].FTB_DLEN ;; + AND AX,AX ;; + JNZ FONT_RETURNED ;; + ;; +NEXT_FTBLK : ;; **** NEXT IN LOOP **** + ;; + ADD SI,TYPE FTBLK ;; SI = points to FTBLK + DEC DX ;; + INC DI ;;######## NEXT SLOT ############ + INC DI ;; + INC DI ;; + INC DI ;; next slot + PUSH ES ;; + POP AX ;; + ADD AX,BUF.FTSZPA ;; + PUSH AX ;; + POP ES ;; next buffer + DEC CX ;;#################################### + JMP PARSE_FTBLK ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FONT_RETURNED : ;; + ;; ********************************* + ;; * ANY SELECTION CONTROL TO BE * + ;; * STORED ? * + ;; ********************************* + ;; + ;; + ;; SI = points to FTBLK + ;; ES = font buffer segment / 0 + ;; BX = LPT buffer + ;; DI = SLOT pointer + PUSH CX ;; + ;; + ;; + MOV AX,CS:[SI].FTB_SELECT ;; + AND AX,AX ;; + JNZ SELECT_NOT0 ;; + CMP BUF.PCLASS,1 ;; + JNE SELECT_0 ;; + JMP SELECT_BAD ;; CLASS 1 printer CANNOT have SELECT=0 + ;; +SELECT_0: ;; + ;; + POP CX ;; + JMP STORE_FONT ;; + ;; +SELECT_NOT0 : ;; + ;; + CMP BUF.PCLASS,1 ;; + JNE NOT_CLASS1 ;; + JMP SELECT_CLASS1 ;; + ;; +not_class1 : ;; + MOV AX,CS:[SI].FTB_SELLEN ;; has this FTBLK already passed the + AND AX,AX ;; select ? + JNZ SELECT_NOT_PASSED ;; + ;; + POP CX ;; + JMP STORE_FONT ;; + ;; +SELECT_NOT_PASSED : ;; + CMP AX,BUF.FSELMAX ;; + JNA SELECT_NOT_LONG ;; + JMP SELECT_BAD ;; cannot be more than buffer size + ;; + ;; +SELECT_NOT_LONG : ;; + MOV AX,CS:[SI].FTB_SELECT ;; + CMP AX,1 ;; + JE SELECT_1 ;; + JMP SELECT_BAD ;; + ;; +SELECT_1 : ;; + MOV CX,BUF.FSELEN ;; +++ SELECT = 1 +++ + AND CX,CX ;; + JZ CTL_NOT_COPIED ;; + MOV AX,CS:[DI].SLT_AT ;; == copy control only from one FTBLK + AND AX,AT_SELECT ;; + JNZ CTL_NOT_COPIED ;; + JMP SKIP_SELECT ;; + ;; +CTL_NOT_COPIED : ;; + ;; + OR CS:[DI].SLT_AT,AT_SELECT;; the FTBLK where control is copied + ;; from + ;; + MOV CX,CS:[SI].FTB_SELLEN ;; + CMP CX,CS:[SI].FTB_DLEN ;; + JNA STORE_SELECT ;; + ;; + MOV CX,CS:[SI].FTB_DLEN ;; + ;; +STORE_SELECT: ;; + PUSH CX ;; CX is the length to be copied. + ;; + PUSH ES ;; + PUSH DS ;; + PUSH SI ;; + PUSH DI ;; + ;; + MOV AX,CS:[SI].FTB_DAHI ;; + PUSH AX ;; + POP DS ;; + MOV SI,CS:[SI].FTB_DALO ;; + ;; + PUSH CS ;; + POP ES ;; + ;; + MOV DI,BUF.PDESCO ;; + MOV DI,CS:[DI].SELB_O ;; + ADD DI,BUF.FSELEN ;; + ;; + REP MOVSB ;; + ;; + ;; + POP DI ;; + POP SI ;; + POP DS ;; + POP ES ;; + ;; + POP CX ;; + SUB CS:[SI].FTB_DLEN,CX ;; + SUB CS:[SI].FTB_SELLEN,CX ;; == less control bytes to be copied + ADD CS:[SI].FTB_DALO,CX ;; + ADD BUF.FSELEN,CX ;; + ;; + POP CX ;; + ;; + ;; any data left for font ? + CMP BUF.PCLASS,1 ;; + JNE MORE_FONT ;; + ;; + JMP NEXT_FTBLK ;; == CLASS 1 printer ingnores fonts + ;; +MORE_FONT : ;; more font data ? + ;; + JMP STORE_FONT ;; + ;; +SELECT_CLASS1: ;; +++ PRINTER CLASS = 1 + ;; + MOV AX,CS:[SI].FTB_SELECT ;; + CMP AX,2 ;; + JE GOOD_CLASS1 ;; + JMP SELECT_BAD ;; + ;; select type = 2 only +GOOD_CLASS1 : ;; + POP CX ;; + ;; + PUSH ES ;; STACKS... + PUSH DX ;; + PUSH DI ;; + MOV AX,DI ;; + SUB AX,BUF.FTSLOTO ;; + SHR AX,1 ;; + PUSH AX ;; stack 1 -- offest + MOV DI,BUF.FTDLO ;; + ADD DI,AX ;; + ;; + MOV AX,CS:WORD PTR [DI] ;; length copied to font buffer + ;; + POP DX ;; stack -1 + SHR DX,1 ;; + PUSH DI ;; STACK +1 -- to font buffer length + MOV DI,BUF.FTSTART ;; +CTL_ADDR : ;; + AND DX,DX ;; + JZ CTL_LOCATED ;; + ADD DI,BUF.FTSZPA ;; + DEC DX ;; + JNZ CTL_ADDR ;; + ;; +CTL_LOCATED : ;; + PUSH DI ;; + POP ES ;; + XOR DI,DI ;; start of the font buffer + MOV CX,CS:[SI].FTB_SELLEN ;; + AND AX,AX ;; + JNZ HASBEEN_COPIED ;; + MOV ES:BYTE PTR [DI],CL ;; 1st byte is the length + INC AX ;; + ;; +HASBEEN_COPIED : ;; + ;; + ADD DI,AX ;; + DEC AX ;; + CMP AX,CX ;; all copied ? + JB COPY_SELECT ;; + ;; + POP DI ;; STACK -1 + ;; + POP DI ;; STACKS... + POP DX ;; + POP ES ;; + MOV CX,CS:[SI].FTB_DLEN ;; all font data for this code page is + SUB CS:[SI].FTB_DLEN,CX ;; discarded + ADD CS:[SI].FTB_DALO,CX ;; + ;; + JMP NEXT_FTBLK ;; + ;; +COPY_SELECT : ;; + ;; + SUB CX,AX ;; + CMP CX,CS:[SI].FTB_DLEN ;; + JNA FONT_SELECT ;; + ;; + MOV CX,CS:[SI].FTB_DLEN ;; + ;; +FONT_SELECT : ;; + ;; + PUSH CX ;; STACK +2 + ;; + PUSH DS ;; STACK +3 + PUSH SI ;; STACK +4 + ;; + MOV AX,CS:[SI].FTB_DAHI ;; + PUSH AX ;; + POP DS ;; + MOV SI,CS:[SI].FTB_DALO ;; + ;; + PUSH DI ;; STACK +5 + ;; + REP MOVSB ;; + ;; + POP DI ;; STACK -5 + POP SI ;; STACK -4 + POP DS ;; STACK -3 + ;; + POP CX ;; STACK -2 + ADD CX,DI ;; + POP DI ;; STACK -1 + MOV CS:WORD PTR [DI],CX ;; + ;; + MOV CX,CS:[SI].FTB_DLEN ;; all font data for this code page is + SUB CS:[SI].FTB_DLEN,CX ;; discarded + ADD CS:[SI].FTB_DALO,CX ;; + ;; + POP DI ;; + POP DX ;; + POP ES ;; + ;; + JMP NEXT_FTBLK ;; + ;; + ;; +SKIP_SELECT : ;; ++ SKIP SELECT ++ + ;; + MOV CX,CS:[SI].FTB_SELLEN ;; + CMP CX,CS:[SI].FTB_DLEN ;; + JNA SKIP_ALL_SELLEN ;; + MOV CX,CS:[SI].FTB_DLEN ;; + ;; +SKIP_ALL_SELLEN : ;; + SUB CS:[SI].FTB_DLEN,CX ;; + SUB CS:[SI].FTB_SELLEN,CX ;; == less control bytes to be skipped + ADD CS:[SI].FTB_DALO,CX ;; + ;; + POP CX ;; + JMP STORE_FONT ;; + ;; +SELECT_BAD : ;; ++ BAD SELECT ++ + ;; + POP CX ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,STAT_BADATA ;; + ;; + OR BUF.STATUS,FAIL ;; + ;; + JMP WRITE_RET ;; + ;; + ;; + ;; ************************************* + ;; * FONT TO BE STORED OR DOWNLOADED ? * + ;; ************************************* + ;; + ;; SI = points to FTBLK + ;; ES = font buffer segment / 0 + ;; BX = LPT buffer + ;; DI = SLOT pointer +STORE_FONT : ;; + ;; + CMP CS:[SI].FTB_DLEN,0 ;; any font data left ? + JNZ HAS_FONT_DATA ;; + JMP NEXT_FTBLK ;; + ;; +HAS_FONT_DATA : ;; + PUSH ES ;; + POP AX ;; + AND AX,AX ;; + JNZ STORE_FONT_BUFFER ;; + JMP FONT_DOWNLOAD ;; + ;; + ;; + ;; +STORE_FONT_BUFFER : ;; ***************************** + PUSH DI ;; ** STORE TO FONT BUFFER ** + ;; ***************************** + PUSH CX ;; + PUSH DS ;; ES = font buffer segment + ;; + ;; -- determine where is the infor : + MOV AX,DI ;; + SUB AX,BUF.FTSLOTO ;; relative to the start of the slot + SHR AX,1 ;; '' '' '' " of FTDL_OFF + ;; + ;; + ADD AX,BUF.FTDLO ;; + MOV DI,AX ;; + ;; + ;;................................... + MOV CX,CS:[SI].FTB_DLEN ;; length of font data + ;; + MOV AX,CS:WORD PTR [DI] ;; current destination + ;; + ADD AX,CX ;; + PUSH AX ;; STACK A (next destination) + ;; + ADD AX,CS:[SI].FTB_DLEFT ;; enough room in font buffer ? + CMP AX,BUF.FTSIZE ;; + JNA ROOM_FOR_FONT ;; + ;; + POP AX ;; STACK A + POP DS ;; + POP CX ;; **** LOOP EXIT (no room) **** + POP DI ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,STAT_BADATA ;; + ;; + OR BUF.STATUS,FAIL ;; + ;; + JMP WRITE_RET ;; + ;; +ROOM_FOR_FONT : ;; + ;; + PUSH DI ;; STACK B + ;; + MOV DI,CS:WORD PTR [DI] ;; current destination + ;; + PUSH SI ;; STACK C + PUSH DS ;; STACK D + ;; + MOV AX,CS:[SI].FTB_DAHI ;; + PUSH AX ;; + POP DS ;; source : FTB_DA + MOV SI,CS:[SI].FTB_DALO ;; + ;; + REP MOVSB ;; + ;; + POP DS ;; STACK D + POP SI ;; STACK C + POP DI ;; STACK B + POP AX ;; STACK A + MOV CS:WORD PTR [DI],AX ;; next detination/current length + ;; + POP DS ;; + POP CX ;; + POP DI ;; + ;; + OR CS:[DI].SLT_AT,AT_FONT ;; font buffer has been overwritten + ;; + JMP NEXT_FTBLK ;; + ;; +FONT_DOWNLOAD : ;; *********************************** + ;; * DOWNLOAD FONT TO THE DEVICE : * + PUSH ES ;; *********************************** + PUSH DI ;; + LES DI,dword ptr buf.rh_ptro ;; -- the logic can only support one + ;; physical device slot that can be + ;; downloaded.) + MOV AX,CS:[SI].FTB_DLEN ;; + MOV RH.RH3_CNT,AX ;; + MOV AX,CS:[SI].FTB_DALO ;; + MOV RH.RH3_DTAO,AX ;; + MOV AX,CS:[SI].FTB_DAHI ;; + MOV RH.RH3_DTAS,AX ;; + ;; + MOV RH.RHC_CMD,CMD_WRT ;; 06/25 MODE.COM + ;; + PUSH SI ;; + PUSH ES ;; + PUSH BX ;; **** BUF. is changed **** + PUSH BX ;; + POP SI ;; + LES BX,DWORD PTR BUF.RH_PTRO ;; pass the request header to the + ;; +FDL_CALL_STR : ;; + CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine. + POP BX ;; + POP ES ;; + POP SI ;; + ;; +FDL_CALL_ITR : ;; + CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn + ;; +FDL_ITR_RETURN : ;; + MOV AX,rh.RHC_STA ;; + ;; + and ax,stat_error ;; + jz fdl_good1 ;; + mov ax,stat_deverr ;; + mov rh.rhc_sta,ax ;; + ;; +fdl_good1 : ;; + POP DI ;; + POP ES ;; + ;; + AND AX,STAT_ERROR ;; any error returned by normal device? + JNZ FDL_BAD ;; + OR CS:[DI].SLT_AT,AT_RAM1 ;; + JMP NEXT_FTBLK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +FDL_BAD : ;; **** LOOP EXIT (bad) **** + OR BUF.STATUS,FAIL ;; + ;; + JMP WRITE_RET ;; + ;; +WRT_NORMAL : ;; + ;; + JMP NORM_DRIVER ;; + ;; +WRT_ignore : ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,STAT_DEVERR ;; + JMP WRITE_RET ;; + ;; +NO_MORE_FTBLK : ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,0 ;; + ;; +WRITE_RET : ;; + RET ;; + ;; +WRITE ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Generic IOCTL Designate Start ====== +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +DESIGNATE_START PROC ;; + MOV AX,BUF.STATE ;; + CMP AX,NORMAL ;; + JNE DS_00 ;G; ALL OF THESE EXTRA JUMPS ARE + JMP DST_NORMAL ;; DUE TO SIZE OF FOLLOWING CODE!!!!! +DS_00: CMP AX,CPSW ;; WGR ;AN000; + JE DS_01 ;G; + CMP AX,LOCKED ;; WGR ;AN000; + JE DS_03 ;; WGR ;AN000; + JMP DST_CMDERR ;G; + +DS_01: CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE + JNC DS_02 ;G; +DS_03: ;; WGR ;AN000; + JMP DST_DEVERR ;G; PRINT.COM IS ACTIVE, CY=1 MEANS YES + ;G; +DS_02: LDS SI,RH.GIH_GBA ;; GIOB = DS:[SI] + MOV AX,GIOB.GB1_FLAG ;; + AND AX,DSF_CARTCP ;; + JNZ dst_deverr ;; DO NOT SUPPORT CARTRIDGE FLAG !!!! + ;; + ;; ****************************** + ;; ** DESIGNATE / REFRESH ? ** + ;; ****************************** + ;; check the LENGTH in BUFFER1 + ;; + MOV CX,GIOB.GB1_LEN ;; + AND CX,CX ;; + JNZ DST_NOT_NULL ;; + ;; + mov cs:init_chk,0fefeh ;; + ;; + JMP DST_REFRESH ;; null lenght ==> refresh + ;; +DST_NOT_NULL : ;; + MOV AX,CX ;; + SHR AX,1 ;; divide by 2 + MOV CX,AX ;; + MOV AX,STAT_CMDERR ;; error if LEN < 2 + AND CX,CX ;; + JZ DST_RET ;; + DEC CX ;; + JNZ NO_REFRESH ;; + ;; + MOV AX,GIOB.GB1_NUM ;; + AND AX,AX ;; + MOV AX,STAT_BADATA ;; + JNZ DST_RET ;; error, as no code pages followed + ;; + mov cs:init_chk,0ffeeh ;; + ;; + ;; + JMP DST_REFRESH ;; null length => REFRESH font from + ;; font buffer to device + ;; ********************************* + ;; ** DESIGNATE FOR CARTRIDGE ? ** +NO_REFRESH : ;; ********************************* + ;; CX = number of codepages designated + CMP BUF.PCLASS,1 ;; CLASS 1 Printer ? + JNE DST_RAM ;; + JMP DST_CART ;; + ;; +DST_RAM : ;; + ;; + MOV AX,DSF_CARTCP ;; RAM-code pages + NOT AX ;; + AND BUF.STATUS,AX ;; not CARTCP + MOV DI,BUF.RMBUFO ;; DI + MOV DX,BUF.RSLMX ;; DX = number of designate allowed + ;; (limited by available slots) + MOV AX,STAT_TOMANY ;; + CMP CX,DX ;; more codepages than supported ? + JA DST_RET ;; + ;; + JMP DST_DESIGNATE ;; + ;; +DST_NORMAL : ;; + push cs ;; + pop ds ;; + JMP NORM_DRIVER ;; + ;; +DST_DEVERR : ;; + MOV AX,STAT_DEVERR ;; + JMP DST_RET ;G; + ;; +DST_CMDERR : ;G; + MOV AX,STAT_CMDERR ;G; +DST_RET : ;; + JMP DST_RETURN ;; + ;; +DST_CART: ;; + MOV AX,DSF_CARTCP ;; Hardware code pages + OR BUF.STATUS,AX ;; + MOV DI,BUF.HRBUFO ;; DI + MOV DX,BUF.HSLMX ;; DX = number of slots available + MOV AX,DX ;; + SUB AX,BUF.HARDMX ;; no. of designate allowed + ;; + CMP CX,AX ;; more codepages than supported ? + MOV AX,STAT_TOMANY ;; + JA DST_RET ;; +;;--------------------------------------------------------------------------- + ;; ************************************* +DST_DESIGNATE : ;; * any duplicated codepages in MODE ?* + ;; * define the slot-buffer * + ;; ************************************* + ;; + ;; -- Use the buffer to hold the code + ;; page value in the MODE with the + ;; position correspondence : + ;; 1. reset the buffer to all 0FFFFH + ;; 2. if the code page in MODE does not + ;; replicate with any in the buffer, + ;; then store the code page value in + ;; the buffer. + ;; 3. proceed to the next code page in + ;; the MODE to check with what is + ;; already copied to the buffer. + ;; 4. designate will fail if there is a + ;; replication : i.e. a repetition + ;; in the MODE command. + ;; 5. skip the buffer corresponding to + ;; HWCP codepages + ;;------------------------------------- + ;; + PUSH DI ;; (the start of RAM/Hardware buffer) + PUSH DX ;; count of buffer size + MOV AX,0FFFFH ;; +RESET_BUF: ;; + MOV CS:[DI],AX ;; reset all buffer to 0FFFFH + INC DI ;; + INC DI ;; + DEC DX ;; + JNZ RESET_BUF ;; + POP DX ;; + POP DI ;; + ;; + PUSH BX ;; + PUSH DI ;; (the start of RAM/Hardware buffer) + PUSH DX ;; count of buffer size + PUSH SI ;; first code page in GB1 + PUSH CX ;; number of codepages in GB1 + ;; + PUSH SI ;; + ;; + MOV AX,BUF.STATUS ;; + AND AX,DSF_CARTCP ;; + JZ FILL_BUFFER ;; + ;; for cartridge designation + MOV SI,BUF.HARDSO ;; +SKIP_HWCP: ;; + MOV AX,CS:[SI].SLT_AT ;; + AND AX,AT_HWCP ;; + JZ FILL_BUFFER ;; + INC SI ;; skip the hwcp slots, they cannot be + INC SI ;; designated + INC SI ;; + INC SI ;; + INC DI ;; + INC DI ;; + JMP SKIP_HWCP ;; + ;; +FILL_BUFFER : ;; + ;; + POP SI ;; + ;; + PUSH DI ;; + POP BX ;; BX = the positioned buffer + ;; +DST_BUFLP : ;; **** LOOP **** + MOV AX,GIOB.GB1_CP ;; (use GIOB only for codepages) + CMP AX,0FFFFH ;; + JZ DST_BUFNXT ;; + ;; + PUSH CX ;; + ;; compare code page with SLOT-BUFFER + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; SCAN THE BUFFER FOR DUPLICATION + PUSH DX ;; + POP CX ;; no. of buffer entries + ;; + PUSH ES ;; + PUSH DI ;; + PUSH CS ;; + POP ES ;; + REPNE SCASW ;; scan codepage vs. buffer + POP DI ;; + POP ES ;; + ;; + POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + JNE BUF_DEFINE ;; + ;; + ;; **** EXIT FROM LOOP **** + ;; + POP CX ;; number of codepages in GB1 + POP SI ;; first code page in GB1 + POP DX ;; count of buffer size + POP DI ;; (the start of RAM/Hardware buffer) + POP BX ;; + ;; + MOV AX,STAT_DUPLCP ;; Duplicated code page + JMP DST_RETURN ;; + ;; + ;; +BUF_DEFINE : ;; + MOV CS:[BX],AX ;; no duplicated cp in MODE list + ;; + ;; + ;; **** NEXT IN LOOP **** +DST_BUFNXT: ;; + INC SI ;; (use GIOB only for codepages) + INC SI ;; + INC BX ;; + INC BX ;; + XOR AX,AX ;; + DEC CX ;; + JNZ DST_BUFLP ;; + ;; + ;; + POP CX ;; number of codepages in GB1 + POP SI ;; first code page in GB1 + POP DX ;; count of buffer size + POP DI ;; (the start of RAM/Hardware buffer) + POP BX ;; + ;; + ;; +;;----------------------------------------------------------------------------- + ;;************************************* + ;;* any duplicated codepages bet MODE * + ;;* and code pages in the slot ? * + ;;************************************* + ;; -- for each code page in the slot, + ;; check for any duplication to + ;; code pages in buffer, if the code + ;; page in the slot is not to be + ;; replaced. + ;; -- the designate fails if there is + ;; duplication. + ;; -- copy the codepage in the slot to + ;; the buffer if is not to be + ;; replaced. Mark the slot to be + ;; AT_OLD. + ;; -- if the code page is tobe replaced + ;; mark the STATUS with REPLX. + ;;------------------------------------- + ;; + MOV CX,DX ;; both slots & buffer of same size + ;; --exclude the hwcp which is not + ;; designatable + MOV SI,BUF.HARDSO ;; SI = hardware slot + ;; + MOV AX,BUF.STATUS ;; + AND AX,DSF_CARTCP ;; + JNZ CMP_CP ;; + MOV SI,BUF.RAMSO ;; SI = RAM slot +CMP_CP: ;; + MOV BUF.FTSLOTO,SI ;; + ;; + PUSH DI ;; (the start of RAM/Hardware buffer) + PUSH DX ;; count of buffer size + PUSH SI ;; first entry in RAM/hardware slot + PUSH CX ;; slot size + PUSH BX ;; + ;; + PUSH DI ;; + POP BX ;; BX = the positioned buffer +DST_SLTLP : ;; + ;; **** LOOP **** + ;; + MOV AX,AT_OLD ;; =**= + NOT AX ;; assumed the codepage in slot is new, + AND CS:[SI].SLT_AT,AX ;; to be downloaded if buffer <> 0FFFFH + ;; + AND CS:[SI].SLT_AT,AT_NO_LOAD; -- codepage not to be loaded + AND CS:[SI].SLT_AT,AT_NO_font; -- no font has been loaded + ;; + MOV AX,CS:[SI].SLT_CP ;; + CMP AX,0FFFFH ;; + JZ DST_SLTNXT ;; + ;; + PUSH CX ;; + MOV CX,CS:[BX] ;; + CMP CX,0FFFFH ;; if this slot to be replaced ? + POP CX ;; + JNZ DST_SLTREPLACED ;; YES, the buffer is not empty + ;; + ;; compare code page with SLOT-BUFFER + PUSH CX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; SCAN THE BUFFER FOR DUPLICATION + PUSH DX ;; + POP CX ;; no. of buffer entries + ;; + PUSH ES ;; + PUSH DI ;; + PUSH CS ;; + POP ES ;; + REPNE SCASW ;; scan codepage vs. buffer + POP DI ;; + POP ES ;; + ;; + POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + JNE SLT_BUF_DEF ;; + ;; + ;; **** LOOP EXIT **** + ;; + POP BX ;; + POP CX ;; number of codepages in slots + POP SI ;; first entry in RAM/hardware slots + POP DX ;; count of buffer size + POP DI ;; (the start of RAM/Hardware buffer) + ;; + MOV AX,STAT_DUPLCP ;; Duplicated code page + JMP DST_RETURN ;; + ;; + ;; +SLT_BUF_DEF: ;; + MOV CS:[BX],AX ;; no duplicated cp, there was no cp in + ;; =**= + OR CS:[SI].SLT_AT,AT_OLD ;; mark old so as no new font download + ;; + JMP DST_SLTNXT ;; the MODE command for this position + ;; +DST_SLTREPLACED : ;; + PUSH BX ;; + POP AX ;; save the buffer slot-position + POP BX ;; + OR BUF.STATUS,REPLX ;; there are codepage in slots replaced + PUSH BX ;; + PUSH AX ;; + POP BX ;; gets back the buffer position + ;; + ;; **** NEXT IN LOOP **** + ;; +DST_SLTNXT: ;; + INC SI ;; will take whatever is in buffer + INC SI ;; + INC SI ;; + INC SI ;; + INC BX ;; position slot in buffer + INC BX ;; + XOR AX,AX ;; + DEC CX ;; + JNZ DST_SLTLP ;; + ;; + ;; + POP BX ;; + POP CX ;; slot size + POP SI ;; first entry in RAM/hardware slots + POP DX ;; count of buffer size + POP DI ;; (the start of RAM/Hardware buffer) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;************************************ + ;;* prepare the FTABLE * + ;;************************************ + ;; + ;; -- CX slot / buffer size + ;; SI slot + ;; DI buffer + ;;------------------------------------ + PUSH BX ;; STACK +1 + PUSH SI ;; STACK +2 + ;; =**= + MOV AX,FAIL ;; + NOT AX ;; + AND BUF.STATUS,AX ;; assume it is successful + ;; + ;; +PREPARE_FTB : ;; Prepare for Font Parser + LEA BX,FTABLE ;; + MOV CS:[BX].FLAG,FLAG_RESTART; + MOV CS:[BX].BUFFER_LEN,0 ;; no data packet + MOV CS:[BX].NUM_FTBLK,0 ;; + ;; + ADD BX,TYPE FBUFS ;; points to the first FTBLK. + XOR DX,DX ;; DX = FTBLK entries (no code page yet) + ;; + ;; +GET_CODEPAGE : ;; **** LOOP **** + AND CX,CX ;; + JZ NO_MORE_SLOT ;; + MOV AX,CS:[SI].SLT_AT ;; + AND AX,AT_OLD ;; + JZ NEW_CODEPAGE ;; + ;; + MOV AX,CS:[SI].SLT_AT ;; + AND AX,AT_HWCP ;; + JZ GET_NEXT ;; not NEW and not HWCP + AND CS:[SI].SLT_AT, NOT AT_OLD ;; also load for HWCP + ;; +NEW_CODEPAGE : ;; + MOV AX,CS:[DI] ;; -- SLOT_AT is not old + ;; -- code page in buffer is not 0FFFFH + CMP AX,0FFFFH ;; + JE GET_NEXT ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + INC DX ;; LOAD FONT as : + MOV AX,CS:[DI] ;; codepage in buffer is new code page + ;; + OR CS:[SI].SLT_AT,AT_LOAD ;; set the attribute indicating load + ;; + MOV CS:[BX].FTB_CP,AX ;; + ;; + ADD BX,type ftblk ;; next FTBLK + ;; + ;; +GET_NEXT : ;; **** NEXT IN LOOP **** + INC DI ;; + INC DI ;; next in buffer + INC SI ;; + INC SI ;; + INC SI ;; + INC SI ;; next in slot + DEC CX ;; + JMP GET_CODEPAGE ;; + ;; +NO_MORE_SLOT : ;; **** EXIT LOOP **** + AND DX,DX ;; + JNZ DEFINE_DID ;; + JMP NO_FONT_DOWNL ;; + ;; + ;; ********************************** + ;; ** NEXT STATE = DESIGNATE_WRITE ** + ;; ********************************** + ;; +DEFINE_DID : ;; + POP SI ;; STACK -2 + POP BX ;; STACK -1 + ;; + PUSH BX ;; STACK +1 + PUSH SI ;; STACK +2 + ;; + PUSH DI ;; STACK +3 + PUSH CX ;; STACK +4 + PUSH ES ;; STACK +5 + PUSH DS ;; STACK +6 + ;; + PUSH CS ;; + POP ES ;; + PUSH CS ;; + POP DS ;; + ;; + MOV SI,BX ;; GET THE DEVICE_ID FROM LPTn BUFFER + LEA SI,[SI].PAR_EXTRACTO ;; + MOV SI,CS:[SI].PAR_DIDO ;; + LEA SI,[SI].PAR_DID ;; + ;; + LEA DI,FTABLE ;; + MOV CS:[DI].NUM_FTBLK,DX ;; + ;; + ADD DI,TYPE FBUFS ;; + LEA DI,[DI].FTB_TID ;; + ;; +SET_DID : ;; + MOV CX,8 ;; + PUSH SI ;; + PUSH DI ;; + ;; + REP MOVSB ;; + ;; + POP DI ;; + POP SI ;; + ;; + ADD DI,TYPE FTBLK ;; next DID + DEC DX ;; + JNZ SET_DID ;; + ;; + POP DS ;; STACK -6 + POP ES ;; STACK -5 + POP CX ;; STACK -4 + POP DI ;; STACK -3 + ;; + CALL FONT_PARSER ;; restart font parser + ;; + LEA BX,FTABLE ;; + ADD BX,TYPE FBUFS ;; + CMP CS:[BX].FTB_STATUS,FSTAT_SEARCH + ;; + JE FONT_DOWNL ;; + MOV AX,STAT_DEVERR ;; + POP SI ;; STACK -2 + POP BX ;; STACK -1 + JMP DST_RETURN ;; there is no designate_end if fails + ;; +FONT_DOWNL : ;; + POP SI ;; STACK -2 + POP BX ;; STACK -1 + MOV BUF.STATE,DESG_WR ;; enter DESIGNATE_WRITE state + MOV BUF.FSELEN,0 ;; for font selection control loading + ;; + PUSH CX ;; init the font buffer address of + PUSH DI ;; each codepage + PUSH SI ;; + MOV DI,BUF.FTDLO ;; + ;; + MOV CX,BUF.RSLMX ;; + MOV AX,BUF.STATUS ;; + AND AX,DSF_CARTCP ;; + JZ FTDL_LOOP ;; + MOV CX,BUF.HSLMX ;; + ;; +FTDL_LOOP : ;; + AND CX,CX ;; + JZ FTDL_DONE ;; + mov ax,cs:[si].slt_at ;; + and ax,at_load ;; + jz ftdl_next ;; + ;; + MOV CS:WORD PTR[DI],0 ;; the font length in font buffer is 0 + ;; +ftdl_next : ;; + INC SI ;; + INC SI ;; + INC SI ;; + INC SI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JMP FTDL_LOOP ;; +FTDL_DONE : ;; + POP SI ;; + POP DI ;; + POP CX ;; + ;; + JMP CHECK_OTHER ;; + ;; + ;; ******************************* + ;; ** NEXT STATE = DSIGNATE_END ** + ;; ******************************* +NO_FONT_DOWNL : ;; + POP SI ;; STACK -2 + POP BX ;; STACK -1 + MOV BUF.STATE,DESG_END ;; proper designate end, ignore write + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CHECK_OTHER : ;; + ;; + MOV DX,BUF.STATUS ;; + MOV AX,REPLX ;; + NOT AX ;; + AND AX,DX ;; reset the bit for "replaced" + MOV BUF.STATUS,AX ;; + ;; + XOR AX,AX ;; + AND DX,REPLX ;; + JMP DST_RETURN ;; + ;; only for the FIFO + JMP DST_RETURN ;; + ;; + ;; +DST_REFRESH: ;; ****************************** + ;; ** REFRESH FONT TO DEVICE ** + ;; ****************************** + ;; -- if there is RAM buffer on device + ;; -- if there is font assumed to be + ;; on the device, then + ;; -- load the font to the device, + ;; but no change in slot attributes + ;; + OR BUF.STATUS,REFRESH ;; -- STATE = CPSW (for Designate_end) + ;; + MOV CX,BUF.RSLMX ;; + AND CX,CX ;; + JNZ DST_CHECK_FBUFFER ;; + JMP DST_REF_INVK ;; invoke any active code page + ;; +DST_CHECK_FBUFFER: ;; + MOV DI,BUF.RAMSO ;; + ;; +DST_RAMLP: ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_RAM1 ;; + JNZ DST_RAM_LOCATED ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ DST_RAMLP ;; + JMP DST_REF_INVK ;; there was no font loaded + ;; +DST_RAM_LOCATED: ;; + CMP BUF.RBUFMX,0 ;; ANY FONT BUFFER TO BE COPIED FROM ? + JA DST_HAS_BUFFER ;; + MOV AX,STAT_NOBUFF ;; + mov cs:init_chk,ax ;; + JMP DST_RETURN ;; ERROR !!! + ;; +DST_HAS_BUFFER : ;; + SUB DI,BUF.RAMSO ;; relative to .RAMSO + SHR DI,1 ;; relative to .FTLDO + PUSH DI ;; + ;; + SHR DI,1 ;; the nth + MOV CX,DI ;; + MOV AX,BUF.FTSTART ;; + ;; +DST_LOCATE_FT: ;; + AND CX,CX ;; + JZ DST_FT_LOCATED ;; + ADD AX,BUF.FTSZPA ;; + DEC CX ;; + JNZ DST_LOCATE_FT ;; + ;; +DST_FT_LOCATED: ;; + ;; + POP DI ;; + ADD DI,BUF.FTDLO ;; + MOV CX,CS:WORD PTR [DI] ;; + ;;.................................... + ;; DOWNLOAD THE FONT TO DEVICE + MOV SI,BUF.RNORMO ;; + MOV CS:[SI].RHC_LEN,20 ;; + MOV CS:[SI].RHC_CMD,CMD_WRT ;; + MOV CS:[SI].RH3_CNT,CX ;; + MOV CS:[SI].RH3_DTAO,0 ;; + MOV CS:[SI].RH3_DTAS,AX ;; + ;; + PUSH BX ;; + ;; + PUSH BX ;; + POP DI ;; save BX in DI + PUSH CS ;; + POP ES ;; + MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) + ;; + CALL DWORD PTR CS:[DI].LPT_STRAO + ;; + CALL DWORD PTR CS:[DI].LPT_INTRO + ;; + POP BX ;; + ;; + MOV AX,CS:[SI].RHC_STA ;; + ;; + and ax,stat_error ;; + jz fdl_good2 ;; + mov ax,stat_deverr ;; + ;; +fdl_good2 : ;; + PUSH AX ;; + AND AX,STAT_ERROR ;; + POP AX ;; + JZ DST_REF_INVK ;; + ;; + ;; +DST_RETURN : ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,AX ;; + ;; + push cs ;; + pop ds ;; + ;; + RET ;; + ;; + ;; +DST_REF_INVK : ;; INVOKE FOR REFRESH + ;; + ;; ************************************ + ;; * INVOKE HIERIECHY : RAM, HARDWARE * + ;; ************************************ + ;; + MOV DI,BUF.RAMSO ;; check with the ram-slots (DI) + MOV CX,BUF.RSLMX ;; CX = size + AND CX,CX ;; + JZ DST_HWCP_CHK ;; + ;; +DST_RAM_CMP: ;; there are RAM-slots +DST_RAM_LP: ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_ACT ;; + JNZ DST_IVK_CP ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ DST_RAM_LP ;; + ;; +DST_HWCP_CHK : ;; + MOV DI,BUF.HARDSO ;; check with the HWCP-slots (DI) + MOV CX,BUF.Hslmx ;; CX = size + AND CX,CX ;; + JNZ dst_HWCP_cmp ;; + JMP DST_NO_IVK ;; + ;; +DST_HWCP_CMP : ;; +DST_HWCP_LP: ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_ACT ;; + JZ DST_HWCP_NEXT ;; + JMP DST_IVK_CP ;; + ;; +DST_HWCP_NEXT : ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ DST_HWCP_LP ;; + ;; +DST_NO_IVK: ;; + XOR AX,AX ;; + JMP DST_RETURN ;; + ;; +DST_IVK_CP : ;; + PUSH SI ;; + ;; + MOV SI,BUF.RNORMO ;; + MOV AX,SI ;; + ADD AX,TYPE GIH ;; points to buffer + ;; + PUSH AX ;; + LEA SI,[SI].GIH_GBA ;; + MOV CS:WORD PTR [SI],AX + INC SI ;; + INC SI ;; + MOV CS:WORD PTR [SI],CS ;; + POP SI ;; + MOV CS:[SI].GB2_LEN,2 ;; + MOV AX,CS:[DI].SLT_CP ;; + MOV CS:[SI].GB2_CP,AX ;; + ;; + POP SI ;; + PUSH CS ;; define RH = ES:[DI] + POP ES ;; + MOV DI,BUF.RNORMO ;; + ;; + push cs ;; + pop ds ;; + ;; + JMP INVOKE ;; + ;; +DESIGNATE_START ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Generic IOCTL Designate End ====== +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +DESIGNATE_END PROC ;; + ;; + MOV AX,BUF.STATE ;; + CMP AX,LOCKED ;; WGR ;AN000; + JNE DE_01 ;; WGR ;AN000; + MOV AX,STAT_BADDEN ;; WGR ;AN000; + JMP DE_11 ;; WGR ;AN000; +DE_01: ;; WGR ;AN000; + CMP AX,CPSW ;; + JNE DEN_NOT_CPSW ;; + MOV AX,BUF.STATUS ;; any refresh ? + AND AX,REFRESH ;; + JNZ DEN_REFRESH ;; + MOV AX,STAT_BADDEN ;; + JMP DEN_FAIL ;; + ;; +DEN_REFRESH : ;; + AND BUF.STATUS,NOT REFRESH ;; + XOR AX,AX ;; + JMP DEN_RET ;; + ;; +DEN_NOT_CPSW : ;; + CMP AX,NORMAL ;; + JNE den_NOT_NORMAL ;; + JMP NORM_DRIVER ;; not in the code page switching stage + ;; +den_NOT_NORMAL : ;; + CMP AX,DESG_END ;; + JNE den_other ;; + JMP den_ENDED ;; end with no error check + ;; +den_other : ;; + CMP AX,DESG_WR ;; + JE den_write ;; + MOV AX,STAT_BADDEN ;; + JMP DEN_FAIL ;; no designate start + ;;------------------------- +den_write : ;; DESIGNATE WRITE ended + ;; + MOV AX,BUF.STATUS ;; + AND AX,FAIL ;; + JZ DEN_FTABLE ;; failed in the middle of desig-write + XOR AX,AX ;; + JMP DEN_FAIL ;; ignore the DEN + ;; +DEN_FTABLE : ;; + ;; + LEA DI,FTABLE ;; + ADD DI,TYPE FBUFS ;; + MOV AX,CS:[DI].FTB_STATUS ;; + CMP AX,FSTAT_COMPLETE ;; + JE DEN_ENDED ;; + ;; + CMP AX,FSTAT_FONT ;; + JE DEN_FONT ;; + MOV AX,STAT_bffDEN ;; bad font file + JMP DEN_FAIL ;; the font data was not complete + ;; +DEN_FONT : ;; + MOV AX,CS:[DI].FTB_DLEFT ;; + AND AX,AX ;; + JZ DEN_ENDED ;; + MOV AX,STAT_BffDEN ;; + JMP DEN_FAIL ;; + ;; +DEN_ENDED : ;; good designate-end + ;; + MOV DI,BUF.HARDSO ;; to hardware slot + MOV SI,BUF.HRBUFO ;; to hardware-buffer +HARD_HWCPE: ;; + MOV AX,CS:[DI].SLT_AT ;; skip the HWCP + AND AX,AT_HWCP ;; + JZ HARD_CARTE ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC SI ;; + INC SI ;; + JMP HARD_HWCPE ;; +HARD_CARTE: ;; + MOV CX,BUF.HSLMX ;; size of both hardware slot/buffer + SUB CX,BUF.HARDMX ;; slots that can be designated???????? + MOV AX,BUF.STATUS ;; + AND AX,DSF_CARTCP ;; + JZ ASSIGN_RAM ;; + ;; + ;; + MOV AX,STAT_TOMANY ;; + AND CX,CX ;; any cart-slot to be designated ? + JNZ ASSIGN_CP_CART ;; + JMP DEN_FAIL ;; + ;; + ;; +ASSIGN_CP_CART : ;; + JMP ASSIGN_CP ;; + ;; +ASSIGN_RAM: ;; + MOV DI,BUF.RAMSO ;; to RAM slot + MOV SI,BUF.RMBUFO ;; to RAM-buffer + MOV CX,BUF.RSLMX ;; size of both RAM slot/buffer + ;; + MOV AX,STAT_TOMANY ;; + AND CX,CX ;; any cart-slot to be designated ? + JNZ ASSIGN_CP ;; + JMP DEN_FAIL ;; + ;; +ASSIGN_CP: ;; + MOV AX,AT_LOAD ;; + OR AX,AT_FONT ;; + OR AX,AT_SELECT ;; + NOT AX ;; + AND CS:[DI].SLT_AT,AX ;; reset load, font, select attributes + ;; + MOV AX,CS:[SI] ;; code page assigned + MOV CS:[DI].SLT_CP,AX ;; + ;; + CMP AX,0FFFFH ;; + JNE SLOT_OCC ;; + MOV AX,AT_OCC ;; + NOT AX ;; empty + AND CS:[DI].SLT_AT,AX ;; + JMP ASSIGN_NEXT ;; +SLOT_OCC: ;; + OR CS:[DI].SLT_AT,AT_OCC ;; occupied + ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_OLD ;; + JNZ ASSIGN_NEXT ;; + ;; +NOT_ACTIVE: ;; this newly designated is not active + MOV AX,AT_ACT ;; + NOT AX ;; + AND CS:[DI].SLT_AT,AX ;; not active + CMP BUF.RBUFMX,0 ;; + JE ASSIGN_NEXT ;; + AND CS:[DI].SLT_AT,NOT AT_RAM1;; not loaded to physical RAM until + ;; the code page is selected +ASSIGN_NEXT : ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC SI ;; + INC SI ;; + DEC CX ;; + AND CX,CX ;; + JNE ASSIGN_CP ;; + ;; + MOV CX,BUF.FSELEN ;; COPY SELECT-CONTROL for CLASS 0 + AND CX,CX ;; + JZ DEN_NO_SELECT ;; + ;; + PUSH ES ;; + PUSH DS ;; + PUSH SI ;; + PUSH DI ;; + ;; + PUSH CS ;; + POP ES ;; + PUSH CS ;; + POP DS ;; + ;; + PUSH DX ;; + MOV DI,BUF.PDESCO ;; + MOV SI,CS:[DI].SELB_O ;; + PUSH DI ;; + MOV DI,CS:[DI].SELH_O ;; + XOR DX,DX ;; + MOV DL,CS:BYTE PTR [SI] ;; + ADD DX,DI ;; + INC DX ;; of the length byte + ;; + REP MOVSB ;; + ;; + POP DI ;; + MOV CS:[DI].SELR_O,DX ;; + POP DX ;; + ;; + POP DI ;; + POP SI ;; + POP DS ;; + POP ES ;; + ;; + MOV BUF.FSELEN,0 ;; + ;; +DEN_NO_SELECT : ;; + XOR AX,AX ;; clear status + JMP DEN_RET ;; + ;; +DEN_FAIL : ;;------------------------------------ + PUSH AX ;; ANY FONT BUFFER DESTROYED ? + ;; + MOV AX,BUF.STATUS ;; + AND AX,DSF_CARTCP ;; + JZ DEN_RAM_FAIL ;; + ;; + MOV DI,BUF.FTSLOTO ;; + MOV CX,BUF.HSLMX ;; + JMP DEN_FAIL_LOOP ;; + ;; +DEN_RAM_FAIL : ;; + MOV DI,BUF.RAMSO ;; to RAM slot + MOV CX,BUF.RSLMX ;; size of both RAM slot/buffer + MOV DX,BUF.RBUFMX ;; + ;; + AND DX,DX ;; + JZ DEN_FAIL_RET ;; + ;; +DEN_FAIL_LOOP : ;; + AND CX,CX ;; + JZ DEN_FAIL_RET ;; + ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_LOAD ;; + JZ DEN_FAIL_NEXT ;; + ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_HWCP ;; + JNZ DEN_FAIL_NEXT ;; + ;; + MOV CS:[DI].SLT_CP,0FFFFH ;; those slot whose font has been or + MOV CS:[DI].SLT_AT,0 ;; to be loaded will be wiped out by + ;; a failing designate +DEN_FAIL_NEXT : ;; + ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNE DEN_FAIL_LOOP ;; + ;; +DEN_FAIL_RET : ;; + ;; + POP AX ;; + ;; + MOV BUF.FSELEN,0 ;; + ;; + ;;------------------------------------- +DEN_RET : ;; + MOV BUF.STATE,CPSW ;; end of designate cycle + ;; +DE_11: ;; WGR ;AN000; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,AX ;; + ;; + RET ;; + ;; +DESIGNATE_END ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Generic IOCTL Invoke ========== +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INVOKE PROC ;; ALSO JUMP FROM REFRESH + ;; + MOV AX,BUF.STATE ;; + CMP AX,CPSW ;; + JE IVK_PROCESS ;; + CMP AX,LOCKED ;; WGR ;AN000; + JE IVK_PROCESS ;; WGR ;AN000; + JMP IVK_CMDERR ;G; +IVK_PROCESS: ;;------------------------- + ;G; + CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE + JNC IVK_PROCESS_CONT ;G; PRINT.COM IS PRESENTLY ACTIVE! + JMP IVK_DEVERR ;G; If so, THEN DEVICE_ERROR + ;G; +IVK_PROCESS_CONT: ;G; + push ds ;; + LDS SI,RH.GIH_GBA ;; + MOV CX,GIOB.GB2_LEN ;; + MOV AX,STAT_CMDERR ;; + CMP CX,2 ;; + JE IVK_GOODN ;; + pop ds ;; + JMP IVK_RET ;; +IVK_GOODN: ;; + MOV DX,GIOB.GB2_CP ;; DX = the codepage to be invoked + CMP DX,0FFFFH ;; + JNE IVK_GOODCP ;; + pop ds ;; + JMP IVK_RET ;; +IVK_GOODCP: ;; + ;; ************************************ + ;; * INVOKE HIERIECHY : RAM, HARDWARE * + ;; ************************************ + pop ds ;; + ;; + MOV DI,BUF.RAMSO ;; check with the ram-slots (DI) + MOV CX,BUF.RSLMX ;; CX = size + AND CX,CX ;; + JZ HWCP_CHK ;; + ;; +RAM_CMP: ;; there are RAM-slots + PUSH CX ;; stack 1 = size + PUSH DI ;; + POP SI ;; start of the slot compared with (SI) +RAM_LP: ;; + MOV AX,CS:[DI].SLT_CP ;; + CMP AX,DX ;; + JE IVK_RAMCP ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ RAM_LP ;; + ;; + POP CX ;; stack -1 + ;; code page not found in ram-slots +HWCP_CHK : ;; + MOV DI,BUF.HARDSO ;; check with the HWCP-slots (DI) + MOV CX,BUF.Hslmx ;; CX = size + AND CX,CX ;; + JNZ HWCP_cmp ;; + JMP NO_INVOKE ;; + ;; +HWCP_CMP : ;; + PUSH CX ;; stack 1 = size of HWCP + PUSH DI ;; + POP SI ;; start of the slot compared with (SI) +HWCP_LP: ;; + MOV AX,CS:[DI].SLT_CP ;; + CMP AX,DX ;; + JNE HWCP_NEXT ;; + JMP IVK_HWCPCP ;; + ;; +HWCP_NEXT : ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ HWCP_LP ;; + POP CX ;; stack -1 + ;; + JMP NO_INVOKE ;; + ;; ********************************** + ;; ** RAM CODEPAGE TO BE INVOKED ** + ;; ********************************** + ;; -- determine if any font to be + ;; downloaded for the first time + ;; select of the font. + ;; -- send selection control to invoke + ;; + ;; CX = inverse order of slot cp found +IVK_RAMCP : ;; code page found in RAM slots + ;; set up the pointer to first controls + ;; DI = where slot found + ;; + ;;------------------------------------- + ;; **** LOAD THE FONT FIRST if **** + ;; -- there are font buffers created + ;; -- the slot's font has not been + ;; loaded + CMP CS:[BX].STATE,LOCKED ;; WGR are we locked? ;AN000; + JNE IR_0 ;; WGR no..continue ;AN000; + MOV CS:[BX].SAVED_CP,DX ;; WGR yes...save the code page ;AN000; + CMP BX,OFFSET BUF1 ;; WGR if this is lpt1..then ;AN000; + JNE NEXT_1 ;; WGR ;AN000; + LEA SI,BUF0 ;; WGR copy to PRN buffer. ;AN000; + MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; + JMP ALL_RESET ;; WGR ;AN000; +NEXT_1: ;; WGR ;AN000; + CMP BX,OFFSET BUF0 ;; WGR if this is PRN..then.. ;AN000; + JNE NEXT_2 ;; WGR ;AN000; + LEA SI,BUF1 ;; WGR copy to lpt1 buffer. ;AN000; + MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; +NEXT_2: ;; WGR ;AN000; + JMP ALL_RESET ;; WGR exit invoke with good status ;AN000; +IR_0: ;; WGR ;AN000; +; test cs:[di].SLT_AT, AT_ACT ;AN001;If it is currently active, then do nothing +; jnz Next_2 ;AN001; + CMP BUF.RBUFMX,0 ;; + JE INVK_RAM_PHYSICAL ;; + ;; + MOV AX,CS:[DI].SLT_AT ;; + AND AX,AT_RAM1 ;; supports only ONE physical ram + JNZ INVK_RAM_PHYSICAL ;; + ;; + OR BUF.STATUS,LOADED ;; font has not been loaded + ;; + ;; + POP DX ;; stack -1 + PUSH DX ;; stack 1 (size) + ;; + ;; + PUSH CX ;; + PUSH SI ;; + PUSH DI ;; + ;; + SUB DX,CX ;; + MOV AX,BUF.FTSTART ;; +LOCATE_FONT : ;; + AND DX,DX ;; + JZ FONT_LOCATED ;; + ADD AX,BUF.FTSZPA ;; + DEC DX ;; + JMP LOCATE_FONT ;; + ;; +FONT_LOCATED : ;; + ;; AX = FONT LOCATION (AX:0) + SUB DI,BUF.RAMSO ;; + SHR DI,1 ;; offset to the start of .FTDLEN + ;; + add DI,buf.ftdlo ;; length of font data + mov cx,cs:word ptr [di] ;; + + +;Before sending data, let's check the status of the printer + call Prt_status_check ;AN001;Check the printer status + jz Send_Ram_Data ;AN001;O.K.? + pop di ;AN001;Balance the stack + pop si ;AN001; + pop cx ;AN001; + jmp Ram_Prt_Status_Err ;AN001;return with error. +Send_Ram_Data: + MOV SI,BUF.RNORMO ;; + MOV CS:[SI].RHC_LEN,20 ;; + MOV CS:[SI].RHC_CMD,CMD_WRT ;; + MOV CS:[SI].RH3_CNT,CX ;; + MOV CS:[SI].RH3_DTAO,0 ;; + MOV CS:[SI].RH3_DTAS,AX ;; + ;; + PUSH BX ;; + ;; + PUSH BX ;; + POP DI ;; save BX in DI + PUSH CS ;; + POP ES ;; + MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) + ;; + CALL DWORD PTR CS:[DI].LPT_STRAO + ;; + CALL DWORD PTR CS:[DI].LPT_INTRO + ;; + POP BX ;; + ;; + MOV AX,CS:[SI].RHC_STA ;; + ;; + POP DI ;; + POP SI ;; + POP CX ;; + ;; + AND AX,STAT_ERROR ;; any error returned by normal device? + JZ INVK_RAM_PHYSICAL ;; + ;; +Ram_Prt_Status_err: + POP CX ;; stack -1 + JMP IVK_DEVERR ;; + ;;------------------------------------- + ;; **** SEND THE SELECTION CONTROL **** + ;; +INVK_RAM_PHYSICAL : ;; + ;; + POP DX ;; stack -1 + PUSH DX ;; stack 1 (size) + ;; + PUSH DI ;; stack 2 + PUSH SI ;; stack 3 + PUSH ES ;; stack 4 + ;; + ;; + ;; **** SUPPORT ONLY ONE PHYSICAL RAM + ;; + MOV DI,BUF.PDESCO ;; + MOV DI,CS:[DI].SELR_O ;; the RAM-select controls + XOR AX,AX ;; + JMP CTL_DEF ;; + ;; + ;; ******************************* + ;; ** INVOKE HARDWARE CODEPAGE ** + ;; ******************************* + ;; -- check if it is CLASS 1 device, + ;; If so then send slection control + ;; from the font buffer at FTSTART + ;; + ;; CX=inverse order of slot cp found +IVK_HWCPCP: ;; code page found in HWCP slots + ;; set up the pointer to first controls + CMP CS:[BX].STATE,LOCKED ;; WGR are we locked? ;AN000; + JNE IR_1 ;; WGR no..continue ;AN000; + MOV CS:[BX].SAVED_CP,DX ;; WGR yes...save the code page ;AN000; + CMP BX,OFFSET BUF1 ;; WGR if this is lpt1..then ;AN000; + JNE NEXT_3 ;; WGR ;AN000; + LEA SI,BUF0 ;; WGR copy to PRN buffer. ;AN000; + MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; + JMP ALL_RESET ;; WGR ;AN000; +NEXT_3: ;; WGR ;AN000; + CMP BX,OFFSET BUF0 ;; WGR if this is PRN..then.. ;AN000; + JNE NEXT_4 ;; WGR ;AN000; + LEA SI,BUF1 ;; WGR copy to lpt1 buffer. ;AN000; + MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; +NEXT_4: ;; WGR ;AN000; + JMP ALL_RESET ;; WGR exit invoke with good status ;AN000; +IR_1: ;; WGR ;AN000; +; test cs:[di].SLT_AT, AT_ACT ;AN001;If it is currently active, then do nothing +; jnz Next_4 ;AN001; + POP DX ;; stack -1 + PUSH DX ;; stack 1 (size) + ;; + PUSH DI ;; stack 2 + PUSH SI ;; stack 3 + PUSH ES ;; stack 4 + ;; + SUB DX,CX ;; the slot's order in HWCP-slots(0-n) + ;; + CMP BUF.PCLASS,1 ;; + JNE SELECT_SLOT ;; + ;; + MOV AX,BUF.FTSTART ;; ***** CLASS 1 CODEPAGE SELECT **** + AND DX,DX ;; + JZ ADJUST_DI ;; + ;; +SELECTCP_LP : ;; + ADD AX,BUF.FTSZPA ;; + ;; + DEC DX ;; + JNZ SELECTCP_LP ;; + ;; +ADJUST_DI : ;; + mov DI,AX ;; + PUSH CS ;; + POP AX ;; + SUB DI,AX ;; + SHL DI,1 ;; + SHL DI,1 ;; + SHL DI,1 ;; + SHL DI,1 ;; + JMP CTL_DEF ;; + ;; + ;; ** SELECT HARDWARE PHYSICAL SLOT ** +SELECT_SLOT : ;; + MOV DI,BUF.PDESCO ;; + MOV DI,CS:[DI].SELH_O ;; the HARDWARE-select controls + XOR AX,AX ;; + JMP RCTL_NXT ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +RCTL_NXT: ;; locate the right control sequence + AND DX,DX ;; + JZ CTL_DEF ;; + MOV AL,CS:[DI] ;; + ADD DI,AX ;; + DEC DX ;; + JMP RCTL_NXT ;; + ;; + ;; ******************************** + ;; ** SEND OUT SELECTION CONTROL ** + ;; ******************************** + ;; + ;; code page is to be invoked +CTL_DEF : ;; DI points to the control sequence +;Check the status of the printer before writing. + call Prt_status_check ;AN001;Check the printer status + jz Ctl_Def_Send ;AN001;O.K.? + jmp Ctl_Dev_Err ;AN001;Error. + +Ctl_Def_Send: + MOV SI,BUF.RNORMO ;; + MOV CS:[SI].RHC_LEN,20 ;; + MOV CS:[SI].RHC_CMD,CMD_WRT ;; + ;; + XOR CX,CX ;; + MOV CL,CS:[DI] ;; + ;; +CTL_NEXT_BYTE : ;; + ;; + CMP BUF.PCLASS,1 ;; + JE CTL_CLASS1 ;; + ;; + MOV CS:[SI].RH3_CNT,CX ;; send all at once + MOV CX,1 ;; sent only once. + JMP CTL_COMMON ;; + ;; +CTL_CLASS1 : ;; sent byte by byte to overcome + MOV CS:[SI].RH3_CNT,1 ;; DOS timeout on kingman printer +CTL_COMMON : ;; + INC DI ;; + MOV CS:[SI].RH3_DTAO,DI ;; + PUSH CS ;; + POP AX ;; + MOV CS:[SI].RH3_DTAS,AX ;; + ;; + PUSH DI ;; + PUSH BX ;; + ;; + PUSH BX ;; + POP DI ;; save BX in DI + PUSH CS ;; + POP ES ;; + MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) + ;; + CALL DWORD PTR CS:[DI].LPT_STRAO + ;; + CALL DWORD PTR CS:[DI].LPT_INTRO + ;; + POP BX ;; + POP DI ;; + ;; + MOV AX,CS:[SI].RHC_STA ;; + ;; + AND AX,STAT_ERROR ;; any error returned by normal device? + JNZ CTL_DEV_ERR ;; + DEC CX ;; + JNZ CTL_NEXT_BYTE ;; + ;; + POP ES ;; stack -4 + POP SI ;; stack -3 + POP DI ;; stack -2 + JMP IVK_CP ;; + ;; +CTL_DEV_ERR : ;; + POP ES ;; stack -4 + POP SI ;; stack -3 + POP DI ;; stack -2 + POP CX ;; stack -1 + JMP IVK_DEVERR ;; + ;; + ;; ********************************** + ;; ** ADJUST WHICH CODEPAGE TO BE ** + ;; ** ACTIVE ** + ;; ********************************** + ;; + ;; -- set the attribute bit of the + ;; slot (SLT_AT) to active for + ;; the code page just invoked. + ;; -- reset others to non-active. + ;; + ;; +IVK_CP: ;; SI = start of the slots compared + ;; DI = where code page was found + POP CX ;; stack -1 + PUSH SI ;; stack 1 = start of slots compared + mov AX,BUF.STATUS ;; + AND AX,LOADED ;; + MOV AX,AT_ACT ;; + JZ NO_LOAD ;; + OR AX,AT_RAM1 ;; reset loaded to physical RAM #1, + ;; this is reset only when there is + ;; font loading in this round of invoke +NO_LOAD: ;; (for RAM codepages only) + NOT AX ;; +NXT_CP: ;; + AND CS:[SI].SLT_AT,AX ;; not active (and not loaded) + INC SI ;; + INC SI ;; + INC SI ;; + INC SI ;; + DEC CX ;; + JNZ NXT_CP ;; + OR CS:[DI].SLT_AT,AT_ACT ;; the codepage found becomes active + MOV AX,BUF.STATUS ;; + AND AX,LOADED ;; + JZ HWCP_RESET ;; + OR CS:[DI].SLT_AT,AT_RAM1 ;; the font has just been loaded + AND BUF.STATUS,NOT LOADED ;; + ;; +HWCP_RESET : ;; + ;; + POP SI ;; stack -1 (slot : ATs adjusted ) + PUSH SI ;; stack 1 = start of slots compared + ;; + MOV DI,BUF.HARDSO ;; + CMP SI,DI ;; + JE RAM_RESET ;; + ;; HWCP's AT to be reset + MOV CX,BUF.HSLMX ;; + AND CX,CX ;; + JZ RAM_RESET ;; + MOV AX,AT_ACT ;; + NOT AX ;; +RESET_HWCP : ;; + AND CS:[DI].SLT_AT,AX ;; HWCP is not active + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ RESET_HWCP ;; + ;; + ;; +RAM_RESET: ;; + ;; + POP SI ;; stack -1 (slot : ATs adjusted ) + PUSH SI ;; stack 1 = start of slots compared + ;; + MOV DI,BUF.RAMSO ;; + CMP SI,DI ;; + JE ALL_RESET ;; + ;; HWCP's AT to be reset + MOV CX,BUF.RSLMX ;; + AND CX,CX ;; HWCP's no. + JZ ALL_RESET ;; + MOV AX,AT_ACT ;; + NOT AX ;; +RESET_RAM : ;; + AND CS:[DI].SLT_AT,AX ;; HWCP is not active + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ RESET_RAM ;; + ;; +ALL_RESET : ;; + POP SI ;; stack -1 + ;; + XOR AX,AX ;; + JMP IVK_RET ;; + ;; +NO_INVOKE : ;; + ;; + MOV AX,STAT_NOCPIV ;; + JMP IVK_RET ;; + ;; +IVK_DEVERR : ;; + MOV AX,STAT_DEVERR ;; + JMP IVK_RET ;G; + ;; +IVK_CMDERR : ;G; + MOV AX,STAT_CMDERR ;G; + ;; +IVK_RET : ;; + LES DI,dword ptr buf.rh_ptro;; + MOV RH.RHC_STA,AX ;; + ;; + RET ;; + ;; +INVOKE ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Prt_Status_Check proc near ;AN001; +;Check the printer device status +;Out) if Zero flag set - Ok. +; All registers saved. + + push es ;AN001; + push si ;AN001; + + mov si, BUF.RNORMO ;AN001; + mov cs:[si].RHC_LEN, 13 ;AN001; + mov cs:[si].RHC_CMD, 10 ;AN001;device driver status check + + push di ;AN001; + push bx ;AN001; + + push bx ;AN001; + pop di ;AN001; + push cs ;AN001; + pop es ;AN001;ES:BX -> REQ_NORMn (was cs:si) + mov bx, si ;AN001; + + call dword ptr cs:[di].LPT_STRAO ;AN001;Strategy + call dword ptr cs:[di].LPT_INTRO ;AN001;Intrrupt + test cs:[si].RHC_STA, STAT_ERROR ;AN001; + pop bx ;AN001; + pop di ;AN001; + + pop si ;AN001; + pop es ;AN001; + ret ;AN001; +Prt_Status_Check endp ;AN001; + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Generic IOCTL Query Invoked ======= +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +Q_INVOKED PROC ;; + push ds ;; + ;; + MOV AX,BUF.STATE ;; ??????????????? + CMP AX,LOCKED ;; WGR ;AN000; + JNE QI_0 ;; WGR ;AN000; + MOV AX,BUF.SAVED_CP ;; WGR ;AN000; + LDS SI,RH.GIH_GBA ;; WGR ;AN000; + CMP AX,-1 ;; WGR ;AN000; + JE QIV_NOACT ;; WGR ;AN000; + JMP QI_1 ;; WGR ;AN000; +QI_0: ;; WGR ;AN000; + CMP AX,CPSW ;; reject only in NORMAL !!!! + JNE QIV_CMDERR ;G; + ;;------------------------- + LDS SI,RH.GIH_GBA ;; + ;; + MOV DI,BUF.RAMSO ;; + MOV CX,BUF.RSLMX ;; + AND CX,CX ;; + JZ QIV_HARD ;; + ;; +QIV_RAMLP : ;; + MOV AX,CS:[DI].SLT_AT ;; check the RAM slots + AND AX,AT_ACT ;; + JNZ QIV_FOUND ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ QIV_RAMLP ;; + ;; +QIV_HARD : ;; + MOV DI,BUF.HARDSO ;; + MOV CX,BUF.HSLMX ;; + AND CX,CX ;; + JZ QIV_NOACT ;; + ;; +QIV_HARDLP : ;; + MOV AX,CS:[DI].SLT_AT ;; check the RAM slots + AND AX,AT_ACT ;; + JNZ QIV_FOUND ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + DEC CX ;; + JNZ QIV_HARDLP ;; + ;; +QIV_NOACT : ;; + ;; + MOV AX,STAT_NOCPIV ;; + JMP QIV_RET ;; + ;; + ;; +QIV_FOUND : ;; + MOV AX,CS:[DI].SLT_CP ;; +QI_1: ;; WGR ;AN000; + MOV GIOB.GB2_LEN,2 ;; + MOV GIOB.GB2_CP,AX ;; + ;; + XOR AX,AX ;; + JMP QIV_RET ;; + ;; +QIV_DEVERR : ;; + MOV AX,STAT_DEVERR ;; + JMP QIV_RET ;G; + ;; +QIV_CMDERR : ;G; + MOV AX,STAT_CMDERR ;G; + ;; +QIV_RET : ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,AX ;; + ;; + pop ds ;; + ;; + RET ;; + ;; +Q_INVOKED ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;==== Generic IOCTL Query List ======= +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Q_LIST PROC ;; + ;; + push ds ;; + ;; + MOV AX,BUF.STATE ;; ???????????????? + CMP AX,CPSW ;; reject only in NORMAL + JE QLS_CPSW ;; + CMP AX,LOCKED ;; WGR ;AN000; + JE QLS_CPSW ;; WGR ;AN000; + JMP QLS_CMDERR ;G; +QLS_CPSW : ;;------------------------- + LDS SI,RH.GIH_GBA ;; + PUSH SI ;; stack 1 -- GB3 (SI) + ;; + MOV DI,BUF.HARDSO ;; + MOV CX,BUF.HARDMX ;; + MOV DX,BUF.HSLMX ;; DX = number of entries + LEA SI,[SI].GB3_GBL ;; + MOV GIOB.GBL_LEN,CX ;; + ;; +QL_HARDLP: ;; + AND CX,CX ;; + JZ QL_PREPARE ;; + MOV AX,CS:[DI].SLT_CP ;; + MOV GIOB.GBL_CP,AX ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC SI ;; + INC SI ;; + DEC CX ;; + JMP QL_HARDLP ;; + ;; +QL_PREPARE: ;; + MOV CX,BUF.HSLMX ;; + SUB CX,BUF.HARDMX ;; less the no. of HWCP + MOV DX,BUF.RSLMX ;; + ADD DX,CX ;; DX = total number of entries + INC SI ;; + INC SI ;; + MOV GIOB.GBL_LEN,DX ;; +QL_CARTLP: ;; + AND CX,CX ;; + JZ QL_RAM_PREP ;; + MOV AX,CS:[DI].SLT_CP ;; + MOV GIOB.GBL_CP,AX ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC SI ;; + INC SI ;; + DEC CX ;; + JMP QL_CARTLP ;; + ;; + ;; +QL_RAM_PREP: ;; + MOV DI,BUF.RAMSO ;; + MOV CX,BUF.RSLMX ;; + ;; +QL_RAMLP : ;; + AND CX,CX ;; + JZ QL_DONE ;; + MOV AX,CS:[DI].SLT_CP ;; + MOV GIOB.GBL_CP,AX ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC DI ;; + INC SI ;; + INC SI ;; + DEC CX ;; + JMP QL_RAMLP ;; + ;; +QL_DONE: ;; + POP SI ;; stack -1 + mov dx,buf.hslmx ;; + add DX,BUF.RSLMX ;; + INC DX ;; + INC DX ;; + MOV CX,1 ;; + SHL DX,CL ;; + MOV GIOB.GB3_LEN,DX ;; + ;; + XOR AX,AX ;; + CMP DX,GB3_MINILEN ;; min. GBL length + JA QLS_RET ;; + MOV AX,STAT_NOCP ;; + JMP QLS_RET ;; + ;; +QLS_DEVERR : ;; + MOV AX,STAT_DEVERR ;; + JMP QLS_RET ;G; + ;; +QLS_CMDERR : ;G; + MOV AX,STAT_CMDERR ;G; + ;; +QLS_RET : ;; + LES DI,dword ptr buf.rh_ptro ;; + MOV RH.RHC_STA,AX ;; + ;; + pop ds ;; + RET ;; + ;; +Q_LIST ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; CHECK_PRINT_ACTIVE +; +; THIS ROUTINE IS CALLED BEFORE THE INVOKE, DESIGNATE +; COMMANDS ARE OPERATED ON. THIS IS TO PREVENT CONFLICT +; BETWEEN THE BACKGROUND PRINTING AND THE DOWNLOAD SEQUENCE. +; +; INPUT: +; CS:[BX].DEV_HDRO OFFSET AND SEGMENT OF ACTIVE DEVICE +; CS:[BX].DEV_HDRS +; +; WARNING: IF ANOTHER DEVICE DRIVER IS TO TAKE THE LPTx, THEN +; THIS WILL not FIND OUT THAT THE PRINTER.SYS IS ACTIVE. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CHECK_PRINT_ACTIVE PROC ;G; + PUSH AX ;G; SAVE THE REGISTERS............ + PUSH SI ;G; + PUSH DI ;G; + PUSH DS ;G; + PUSH ES ;G; + ;G; + MOV DI,BUF.DEV_HDRS ;G; SETUP ES: = ACTIVE DEVICE SEGMENT + MOV ES,DI ;G; & + MOV DI,BUF.DEV_HDRO ;G; SETUP DI: = ACTIVE DEVICE OFFSET + ;G; + MOV AX,0106H ;G; PRINT (GET LIST DEVICE) + CLC ;G; + JNC CPA_5 ;G; CY=0 IF NOT LOADED/NOT ACTIVE + ;G; + CMP SI,DI ;G; ES:DI POINTS TO THE ACTIVE DEVICE + JNE CPA_5 ;G; + MOV SI,DS ;G; + MOV DI,ES ;G; + CMP SI,DI ;G; + JNE CPA_5 ;G; + STC ;G; OTHERWISE, THIS DEVICE IS PRESENTLY + JMP CPA_6 ;G; UNDER PRINT!!! PREVENT DATASTREAM + ;G; CONFLICT IN THIS CASE. + ;G; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;G; PRINT.COM IS ASLEEP OR IS NOT + ;G; PRESENTLY LOADED. THE PRINTER.SYS +CPA_5: CLC ;G; CAN CONTINUE IT PROCESS! +CPA_6: POP ES ;G; RESTORE REGISTERS..... + POP DS ;G; + POP DI ;G; + POP SI ;G; + POP AX ;G; + RET ;G; +CHECK_PRINT_ACTIVE ENDP ;G; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + +CSEG ENDS + END -- cgit v1.2.3