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/4201/4201.CPI | Bin 0 -> 6404 bytes v4.0/src/DEV/PRINTER/4201/4201.INC | 801 +++++++ v4.0/src/DEV/PRINTER/4201/4201.MAK | 7 + v4.0/src/DEV/PRINTER/4201/MAKEFILE | 0 v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM | 10 + v4.0/src/DEV/PRINTER/4208/4208.CPI | Bin 0 -> 720 bytes v4.0/src/DEV/PRINTER/4208/4208.INC | 90 + v4.0/src/DEV/PRINTER/4208/4208.MAK | 7 + v4.0/src/DEV/PRINTER/4208/MAKEFILE | 0 v4.0/src/DEV/PRINTER/5202/5202.ASM | 108 + v4.0/src/DEV/PRINTER/5202/MAKEFILE | 21 + v4.0/src/DEV/PRINTER/CPSFONT.ASM | 1961 ++++++++++++++++ v4.0/src/DEV/PRINTER/CPSFONT3.ASM | 1961 ++++++++++++++++ v4.0/src/DEV/PRINTER/CPSPEQU.INC | 577 +++++ v4.0/src/DEV/PRINTER/CPSPI.ASM | 2422 ++++++++++++++++++++ v4.0/src/DEV/PRINTER/CPSPI07.ASM | 1416 ++++++++++++ v4.0/src/DEV/PRINTER/CPSPM10.ASM | 3851 ++++++++++++++++++++++++++++++++ v4.0/src/DEV/PRINTER/MAKEFILE | 40 + v4.0/src/DEV/PRINTER/PARSE4E.ASM | 1106 +++++++++ v4.0/src/DEV/PRINTER/PARSER.ASM | 668 ++++++ v4.0/src/DEV/PRINTER/PRINTER.LNK | 9 + v4.0/src/DEV/PRINTER/PRINTER.SKL | 17 + v4.0/src/DEV/PRINTER/PRTINT2F.ASM | 450 ++++ v4.0/src/DEV/PRINTER/PTRMSG.ASM | 41 + v4.0/src/DEV/PRINTER/ZERO.DAT | 1 + 25 files changed, 15564 insertions(+) create mode 100644 v4.0/src/DEV/PRINTER/4201/4201.CPI create mode 100644 v4.0/src/DEV/PRINTER/4201/4201.INC create mode 100644 v4.0/src/DEV/PRINTER/4201/4201.MAK create mode 100644 v4.0/src/DEV/PRINTER/4201/MAKEFILE create mode 100644 v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM create mode 100644 v4.0/src/DEV/PRINTER/4208/4208.CPI create mode 100644 v4.0/src/DEV/PRINTER/4208/4208.INC create mode 100644 v4.0/src/DEV/PRINTER/4208/4208.MAK create mode 100644 v4.0/src/DEV/PRINTER/4208/MAKEFILE create mode 100644 v4.0/src/DEV/PRINTER/5202/5202.ASM create mode 100644 v4.0/src/DEV/PRINTER/5202/MAKEFILE create mode 100644 v4.0/src/DEV/PRINTER/CPSFONT.ASM create mode 100644 v4.0/src/DEV/PRINTER/CPSFONT3.ASM create mode 100644 v4.0/src/DEV/PRINTER/CPSPEQU.INC create mode 100644 v4.0/src/DEV/PRINTER/CPSPI.ASM create mode 100644 v4.0/src/DEV/PRINTER/CPSPI07.ASM create mode 100644 v4.0/src/DEV/PRINTER/CPSPM10.ASM create mode 100644 v4.0/src/DEV/PRINTER/MAKEFILE create mode 100644 v4.0/src/DEV/PRINTER/PARSE4E.ASM create mode 100644 v4.0/src/DEV/PRINTER/PARSER.ASM create mode 100644 v4.0/src/DEV/PRINTER/PRINTER.LNK create mode 100644 v4.0/src/DEV/PRINTER/PRINTER.SKL create mode 100644 v4.0/src/DEV/PRINTER/PRTINT2F.ASM create mode 100644 v4.0/src/DEV/PRINTER/PTRMSG.ASM create mode 100644 v4.0/src/DEV/PRINTER/ZERO.DAT (limited to 'v4.0/src/DEV/PRINTER') diff --git a/v4.0/src/DEV/PRINTER/4201/4201.CPI b/v4.0/src/DEV/PRINTER/4201/4201.CPI new file mode 100644 index 0000000..7b16921 Binary files /dev/null and b/v4.0/src/DEV/PRINTER/4201/4201.CPI differ diff --git a/v4.0/src/DEV/PRINTER/4201/4201.INC b/v4.0/src/DEV/PRINTER/4201/4201.INC new file mode 100644 index 0000000..7c82aa8 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4201/4201.INC @@ -0,0 +1,801 @@ + db 0FFH,046H,04FH,04EH,054H,020H,020H,020H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 001H,000H,001H,017H,000H,000H,000H,005H + db 000H,01CH,000H,035H,000H,000H,000H,002H + db 000H,034H,032H,030H,031H,020H,020H,020H + db 020H,05FH,003H,000H,000H,000H,000H,000H + db 000H,0A5H,000H,000H,000H,01CH,000H,051H + db 000H,000H,000H,002H,000H,034H,032H,030H + db 031H,020H,020H,020H,020H,0B5H,001H,000H + db 000H,000H,000H,000H,000H,064H,006H,000H + db 000H,01CH,000H,06DH,000H,000H,000H,002H + db 000H,034H,032H,030H,031H,020H,020H,020H + db 020H,05CH,003H,000H,000H,000H,000H,000H + db 000H,087H,006H,000H,000H,01CH,000H,089H + db 000H,000H,000H,002H,000H,034H,032H,030H + db 031H,020H,020H,020H,020H,061H,003H,000H + db 000H,000H,000H,000H,000H,045H,00BH,000H + db 000H,01CH,000H,000H,000H,000H,000H,002H + db 000H,034H,032H,030H,031H,020H,020H,020H + db 020H,052H,003H,000H,000H,000H,000H,000H + db 000H,04FH,00CH,000H,000H,001H,000H,001H + db 000H,0B9H,005H,001H,000H,00CH,000H,005H + db 01BH,049H,000H,01BH,036H,005H,01BH,049H + db 004H,01BH,036H,01BH,03DH,001H,000H,015H + db 01BH,03DH,000H,000H,01BH,049H,004H,000H + db 01BH,03DH,029H,000H,014H,084H,000H,009H + db 04EH,014H,084H,0A4H,0A4H,0A4H,084H,014H + db 04EH,000H,000H,000H,009H,004H,00AH,02AH + db 0AAH,06AH,02AH,02AH,01CH,002H,000H,000H + db 000H,009H,0C0H,0A0H,0A0H,0FEH,080H,080H + db 080H,080H,0FEH,000H,000H,000H,000H,01BH + db 03DH,077H,000H,014H,08DH,000H,009H,00AH + db 00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH + db 000H,000H,000H,009H,00EH,014H,024H,0A4H + db 064H,024H,024H,014H,00EH,000H,000H,000H + db 017H,000H,050H,0AAH,0AAH,0AAH,0AAH,0AAH + db 014H,000H,000H,000H,000H,009H,03EH,02AH + db 02AH,02AH,06AH,0AAH,02AH,022H,022H,000H + db 000H,000H,009H,03EH,02AH,02AH,0AAH,06AH + db 02AH,02AH,022H,022H,000H,000H,000H,009H + db 03EH,02AH,06AH,0AAH,0AAH,0AAH,06AH,022H + db 022H,000H,000H,000H,008H,04CH,012H,092H + db 092H,092H,012H,052H,00CH,000H,000H,000H + db 000H,009H,03EH,0AAH,0AAH,02AH,02AH,02AH + db 0AAH,0A2H,022H,000H,000H,000H,017H,000H + db 000H,0A2H,0A2H,03EH,022H,0A2H,080H,000H + db 000H,000H,000H,000H,01BH,03DH,01CH,000H + db 014H,098H,000H,008H,05DH,022H,022H,022H + db 022H,022H,022H,05DH,000H,000H,000H,000H + db 009H,01CH,022H,062H,0A2H,0A2H,0A2H,062H + db 022H,01CH,000H,000H,000H,000H,01BH,03DH + db 01CH,000H,014H,09DH,000H,009H,03CH,002H + db 002H,082H,042H,002H,002H,002H,03CH,000H + db 000H,000H,009H,05CH,002H,082H,082H,082H + db 082H,082H,002H,05CH,000H,000H,000H,000H + db 01BH,03DH,01CH,000H,014H,0A0H,000H,025H + db 000H,000H,000H,000H,0EEH,000H,000H,000H + db 000H,000H,000H,000H,025H,000H,000H,000H + db 000H,040H,080H,000H,000H,000H,000H,000H + db 000H,000H,01BH,03DH,043H,000H,014H,0A4H + db 000H,016H,000H,080H,080H,000H,000H,080H + db 080H,000H,000H,000H,000H,080H,015H,000H + db 000H,001H,001H,005H,002H,000H,000H,000H + db 000H,000H,000H,025H,000H,000H,000H,0A8H + db 0A8H,0A8H,050H,000H,000H,000H,000H,000H + db 009H,080H,080H,080H,080H,080H,080H,080H + db 080H,080H,000H,000H,000H,016H,000H,000H + db 062H,0A2H,0BEH,0A2H,062H,000H,000H,000H + db 000H,000H,000H,01BH,03DH,00FH,000H,014H + db 0ADH,000H,00BH,0A8H,0A8H,0AAH,054H,008H + db 010H,022H,046H,08AH,002H,01FH,000H,000H + db 01BH,03DH,032H,000H,015H,084H,000H,000H + db 000H,000H,001H,000H,001H,000H,021H,000H + db 023H,002H,025H,004H,06DH,008H,025H,010H + db 034H,0A0H,024H,000H,0A4H,000H,0A4H,000H + db 0A4H,000H,024H,000H,014H,0A0H,005H,010H + db 04DH,008H,005H,004H,003H,002H,001H,000H + db 001H,000H,001H,000H,000H,000H,01BH,03DH + db 032H,000H,015H,086H,000H,000H,000H,000H + db 000H,000H,000H,000H,030H,020H,030H,020H + db 078H,071H,078H,071H,078H,0F9H,078H,0F9H + db 07FH,0FFH,000H,080H,000H,080H,000H,080H + db 000H,080H,000H,080H,07FH,0FFH,000H,081H + db 000H,081H,000H,081H,000H,081H,000H,000H + db 000H,000H,000H,000H,01BH,03DH,092H,000H + db 015H,08DH,001H,000H,000H,00AH,000H,00AH + db 000H,00AH,000H,00AH,000H,00AH,000H,00AH + db 000H,00AH,000H,00AH,000H,00AH,000H,00AH + db 000H,00AH,000H,00AH,000H,00AH,000H,00AH + db 000H,00AH,000H,00AH,000H,00AH,000H,00AH + db 000H,00AH,000H,00AH,000H,00AH,000H,00AH + db 000H,00AH,000H,000H,000H,000H,001H,000H + db 001H,000H,021H,000H,023H,002H,025H,004H + db 02DH,008H,025H,010H,0B4H,020H,024H,000H + db 024H,080H,024H,000H,064H,000H,024H,000H + db 014H,020H,005H,010H,00DH,008H,005H,004H + db 003H,002H,001H,000H,001H,000H,001H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,010H,030H + db 029H,003H,000H,009H,040H,041H,024H,001H + db 000H,081H,000H,0A5H,000H,081H,012H,080H + db 001H,082H,000H,090H,04AH,0C0H,004H,00CH + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,01BH,03DH,062H,000H,015H,091H + db 000H,000H,000H,000H,000H,000H,021H,000H + db 021H,000H,021H,000H,021H,000H,03FH,03EH + db 021H,008H,021H,008H,0A1H,008H,021H,008H + db 021H,088H,021H,008H,061H,008H,02DH,01CH + db 021H,000H,021H,000H,021H,000H,021H,000H + db 021H,000H,033H,026H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,021H,000H + db 021H,000H,021H,000H,021H,000H,03FH,03EH + db 061H,008H,021H,008H,021H,088H,021H,008H + db 0A1H,008H,0A1H,008H,0A1H,008H,02DH,01CH + db 021H,080H,021H,000H,061H,000H,021H,000H + db 021H,000H,033H,026H,000H,000H,000H,000H + db 01BH,03DH,062H,000H,015H,094H,000H,000H + db 000H,000H,000H,000H,021H,000H,021H,000H + db 021H,000H,021H,000H,0BFH,0BEH,0A1H,088H + db 0A1H,088H,021H,008H,021H,008H,021H,008H + db 021H,008H,021H,008H,02DH,01CH,0A1H,080H + db 0A1H,080H,0A1H,080H,021H,000H,021H,000H + db 033H,026H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,021H,000H,0A1H,080H,0A1H,080H + db 0A1H,080H,021H,000H,021H,000H,03FH,03EH + db 021H,000H,021H,000H,0A1H,080H,0A1H,080H + db 0A1H,080H,021H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,01BH,03DH + db 062H,000H,015H,098H,000H,000H,000H,000H + db 000H,000H,042H,000H,000H,000H,018H,054H + db 000H,028H,024H,000H,000H,000H,000H,044H + db 000H,044H,000H,044H,000H,044H,000H,044H + db 000H,044H,000H,044H,000H,000H,024H,000H + db 000H,028H,018H,054H,000H,000H,042H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,01CH,01CH + db 002H,020H,060H,002H,000H,000H,001H,0C0H + db 001H,040H,081H,040H,081H,040H,081H,040H + db 001H,040H,001H,0C0H,000H,000H,060H,002H + db 002H,020H,01CH,01CH,000H,000H,000H,000H + db 000H,000H,000H,000H,01BH,03DH,062H,000H + db 015H,09DH,000H,000H,000H,000H,020H,000H + db 020H,000H,020H,000H,03CH,03CH,022H,000H + db 020H,002H,020H,000H,081H,000H,001H,000H + db 001H,080H,001H,000H,041H,000H,001H,000H + db 001H,000H,020H,000H,020H,002H,022H,000H + db 03CH,03CH,020H,000H,020H,000H,020H,000H + db 000H,000H,000H,000H,000H,000H,020H,000H + db 020H,000H,020H,000H,03CH,03CH,022H,000H + db 060H,002H,020H,000H,001H,080H,001H,000H + db 081H,000H,081H,000H,081H,000H,001H,000H + db 001H,080H,020H,000H,060H,002H,022H,000H + db 03CH,03CH,020H,000H,020H,000H,020H,000H + db 000H,000H,01BH,03DH,062H,000H,015H,0A0H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 0E7H,0E7H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,040H,000H + db 000H,000H,000H,080H,000H,000H,080H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 01BH,03DH,0F2H,000H,015H,0A4H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,080H,080H,080H,080H + db 080H,080H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,080H,080H,080H,080H + db 080H,080H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,080H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,001H + db 001H,000H,000H,002H,002H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,008H,080H + db 000H,000H,080H,008H,0A0H,008H,0A0H,008H + db 0A0H,008H,0A0H,008H,020H,000H,008H,0A0H + db 050H,050H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,021H,000H,061H,000H,021H,000H + db 021H,080H,021H,000H,0A1H,000H,0BFH,03EH + db 0A1H,000H,021H,000H,021H,080H,021H,000H + db 061H,000H,021H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,01BH,03DH + db 032H,000H,015H,0ADH,000H,000H,010H,080H + db 080H,010H,080H,010H,080H,050H,081H,050H + db 080H,052H,002H,000H,070H,0A4H,004H,000H + db 000H,008H,008H,000H,000H,010H,010H,000H + db 002H,022H,024H,006H,008H,04AH,040H,002H + db 000H,082H,000H,002H,007H,007H,000H,002H + db 000H,002H,000H,000H,001H,000H,001H,000H + db 01DH,000H,001H,000H,00CH,000H,005H,01BH + db 049H,000H,01BH,036H,005H,01BH,049H,004H + db 01BH,036H,01BH,03DH,001H,000H,015H,01BH + db 03DH,000H,000H,01BH,049H,004H,000H,001H + db 000H,001H,000H,0B8H,004H,001H,000H,00CH + db 000H,005H,01BH,049H,000H,01BH,036H,005H + db 01BH,049H,004H,01BH,036H,01BH,03DH,001H + db 000H,015H,01BH,03DH,000H,000H,01BH,049H + db 004H,000H,01BH,03DH,029H,000H,014H,084H + db 000H,009H,044H,00AH,08AH,0AAH,0AAH,06AH + db 04AH,05CH,082H,000H,000H,000H,009H,004H + db 00AH,02AH,0AAH,06AH,02AH,02AH,01CH,002H + db 000H,000H,000H,009H,00EH,014H,024H,024H + db 064H,0A4H,024H,014H,00EH,000H,000H,000H + db 000H,01BH,03DH,0DFH,000H,014H,089H,000H + db 009H,07EH,02AH,0AAH,0AAH,0AAH,0AAH,0AAH + db 022H,062H,000H,000H,000H,009H,01CH,02AH + db 02AH,0AAH,06AH,02AH,02AH,02AH,018H,000H + db 000H,000H,016H,000H,000H,022H,022H,07EH + db 0A2H,022H,000H,000H,000H,000H,000H,00BH + db 040H,000H,09CH,0A2H,0A2H,0A2H,0A2H,0A2H + db 09CH,000H,040H,000H,016H,000H,000H,012H + db 092H,05EH,002H,002H,000H,000H,000H,000H + db 000H,009H,04EH,014H,084H,0A4H,0A4H,064H + db 044H,054H,08EH,000H,000H,000H,009H,04EH + db 014H,084H,0A4H,0A4H,0A4H,084H,014H,04EH + db 000H,000H,000H,009H,03EH,02AH,02AH,02AH + db 06AH,0AAH,02AH,022H,022H,000H,000H,000H + db 009H,00EH,014H,024H,0A4H,064H,024H,024H + db 014H,00EH,000H,000H,000H,009H,03EH,02AH + db 02AH,0AAH,06AH,02AH,02AH,022H,022H,000H + db 000H,000H,008H,04CH,012H,092H,092H,092H + db 012H,052H,00CH,000H,000H,000H,000H,008H + db 04CH,092H,092H,092H,052H,052H,052H,08CH + db 000H,000H,000H,000H,008H,00CH,012H,012H + db 092H,052H,012H,012H,00CH,000H,000H,000H + db 000H,009H,03CH,002H,002H,002H,042H,082H + db 002H,002H,03CH,000H,000H,000H,009H,01CH + db 002H,002H,082H,042H,002H,002H,01CH,002H + db 000H,000H,000H,016H,000H,000H,022H,0A2H + db 07EH,022H,022H,000H,000H,000H,000H,000H + db 008H,04CH,092H,092H,092H,052H,052H,052H + db 08CH,000H,000H,000H,000H,000H,01BH,03DH + db 00FH,000H,014H,09DH,000H,009H,03CH,002H + db 002H,082H,042H,002H,002H,002H,03CH,000H + db 000H,000H,000H,01BH,03DH,00FH,000H,014H + db 09FH,000H,008H,01CH,022H,022H,022H,062H + db 0A2H,022H,01CH,000H,000H,000H,000H,000H + db 01BH,03DH,00FH,000H,014H,0A9H,000H,008H + db 01CH,022H,022H,0A2H,062H,022H,022H,01CH + db 000H,000H,000H,000H,000H,01BH,03DH,032H + db 000H,015H,084H,000H,000H,000H,000H,000H + db 000H,000H,000H,002H,004H,044H,002H,000H + db 0A0H,001H,028H,081H,028H,081H,028H,081H + db 028H,001H,028H,001H,0A8H,001H,028H,041H + db 028H,041H,028H,040H,028H,000H,00AH,010H + db 08AH,08EH,01EH,001H,000H,001H,000H,001H + db 000H,000H,000H,01BH,03DH,032H,000H,015H + db 086H,000H,000H,000H,000H,001H,000H,001H + db 000H,021H,000H,023H,002H,025H,004H,02DH + db 008H,025H,010H,034H,020H,024H,000H,064H + db 000H,024H,000H,024H,080H,024H,000H,094H + db 020H,005H,010H,00DH,008H,005H,004H,003H + db 002H,001H,000H,001H,000H,001H,000H,000H + db 000H,01BH,03DH,032H,000H,015H,089H,000H + db 000H,000H,000H,000H,000H,021H,000H,021H + db 000H,021H,000H,021H,000H,03FH,03EH,061H + db 008H,021H,008H,021H,088H,021H,008H,0A1H + db 008H,0A1H,008H,0A1H,008H,02DH,01CH,021H + db 080H,021H,000H,061H,000H,021H,000H,021H + db 000H,033H,026H,000H,000H,000H,000H,01BH + db 03DH,062H,000H,015H,08BH,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,021H,000H,021H,000H,021H,000H,021H + db 000H,021H,000H,061H,000H,03FH,03EH,021H + db 080H,021H,000H,0A1H,000H,021H,000H,021H + db 000H,021H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,00CH,008H,000H,014H,012H + db 000H,000H,000H,040H,022H,000H,000H,021H + db 080H,021H,000H,0A1H,000H,0A1H,000H,0A1H + db 000H,021H,000H,021H,080H,000H,000H,040H + db 022H,000H,000H,012H,000H,000H,014H,00CH + db 008H,000H,000H,000H,000H,01BH,03DH,062H + db 000H,015H,08EH,000H,000H,000H,000H,001H + db 000H,001H,000H,021H,000H,023H,082H,025H + db 004H,0ADH,008H,0A5H,010H,0B4H,020H,0A4H + db 000H,0A4H,000H,024H,000H,024H,080H,024H + db 080H,014H,0A0H,005H,090H,00DH,088H,005H + db 004H,083H,002H,001H,000H,001H,000H,001H + db 000H,000H,000H,000H,000H,000H,000H,001H + db 000H,001H,000H,021H,000H,023H,002H,025H + db 004H,06DH,008H,025H,010H,034H,0A0H,024H + db 000H,0A4H,000H,0A4H,000H,0A4H,000H,024H + db 000H,014H,0A0H,005H,010H,04DH,008H,005H + db 004H,003H,002H,001H,000H,001H,000H,001H + db 000H,000H,000H,01BH,03DH,062H,000H,015H + db 091H,000H,000H,000H,000H,001H,000H,001H + db 000H,021H,000H,023H,002H,025H,004H,02DH + db 008H,025H,010H,0B4H,020H,024H,000H,024H + db 080H,024H,000H,064H,000H,024H,000H,014H + db 020H,005H,010H,00DH,008H,005H,004H,003H + db 002H,001H,000H,001H,000H,001H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,021H + db 000H,021H,000H,021H,000H,021H,000H,03FH + db 03EH,021H,008H,021H,008H,0A1H,008H,021H + db 008H,021H,088H,021H,008H,061H,008H,02DH + db 01CH,021H,000H,021H,000H,021H,000H,021H + db 000H,021H,000H,033H,026H,000H,000H,000H + db 000H,01BH,03DH,032H,000H,015H,094H,000H + db 000H,000H,000H,000H,000H,000H,000H,00CH + db 00CH,042H,010H,000H,080H,010H,002H,080H + db 000H,081H,020H,081H,020H,001H,020H,001H + db 0A0H,001H,020H,041H,020H,041H,020H,040H + db 000H,010H,002H,000H,080H,082H,010H,00CH + db 00CH,000H,000H,000H,000H,000H,000H,01BH + db 03DH,032H,000H,015H,096H,000H,000H,000H + db 000H,020H,000H,020H,000H,020H,000H,03CH + db 03CH,022H,000H,020H,002H,020H,000H,001H + db 000H,001H,000H,041H,000H,001H,000H,001H + db 080H,001H,000H,081H,000H,020H,000H,020H + db 002H,022H,000H,03CH,03CH,020H,000H,020H + db 000H,020H,000H,000H,000H,01BH,03DH,062H + db 000H,015H,098H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,021H + db 000H,021H,000H,021H,000H,0A1H,000H,021H + db 000H,021H,080H,03FH,03EH,061H,000H,021H + db 000H,021H,000H,021H,000H,021H,000H,021H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,00CH,008H,000H,014H,012H,080H,000H + db 000H,080H,022H,080H,000H,0A1H,000H,0A1H + db 000H,0A1H,000H,021H,000H,021H,080H,021H + db 080H,021H,080H,000H,080H,000H,0A2H,000H + db 000H,092H,000H,000H,014H,00CH,008H,000H + db 000H,000H,000H,01BH,03DH,032H,000H,015H + db 09DH,000H,000H,000H,000H,020H,000H,020H + db 000H,020H,000H,03CH,03CH,022H,000H,020H + db 002H,020H,000H,081H,000H,001H,000H,001H + db 080H,001H,000H,041H,000H,001H,000H,001H + db 000H,020H,000H,020H,002H,022H,000H,03CH + db 03CH,020H,000H,020H,000H,020H,000H,000H + db 000H,01BH,03DH,032H,000H,015H,09FH,000H + db 000H,000H,000H,000H,000H,00CH,008H,000H + db 014H,012H,000H,000H,000H,000H,022H,000H + db 000H,021H,000H,021H,000H,061H,000H,021H + db 000H,021H,080H,021H,000H,0A1H,000H,000H + db 000H,000H,022H,000H,000H,012H,000H,000H + db 014H,00CH,008H,000H,000H,000H,000H,01BH + db 03DH,032H,000H,015H,0A9H,000H,000H,000H + db 000H,000H,000H,00CH,008H,000H,014H,012H + db 000H,000H,000H,000H,022H,000H,000H,0A1H + db 000H,021H,000H,021H,080H,021H,000H,061H + db 000H,021H,000H,021H,000H,000H,000H,000H + db 022H,000H,000H,012H,000H,000H,014H,00CH + db 008H,000H,000H,000H,000H,001H,000H,001H + db 000H,004H,001H,001H,000H,00CH,000H,005H + db 01BH,049H,000H,01BH,036H,005H,01BH,049H + db 004H,01BH,036H,01BH,03DH,001H,000H,015H + db 01BH,03DH,000H,000H,01BH,049H,004H,000H + db 01BH,03DH,029H,000H,014H,09BH,000H,009H + db 01CH,023H,022H,026H,02AH,032H,022H,05CH + db 000H,000H,000H,000H,009H,012H,012H,07EH + db 092H,092H,082H,082H,082H,042H,000H,000H + db 000H,00AH,03AH,044H,000H,08AH,092H,0A2H + db 000H,044H,0B8H,000H,000H,000H,000H,01BH + db 03DH,032H,000H,015H,09BH,080H,000H,000H + db 000H,000H,000H,018H,018H,004H,020H,000H + db 000H,021H,004H,000H,002H,002H,040H,002H + db 044H,006H,040H,002H,048H,00AH,040H,002H + db 050H,012H,040H,002H,060H,022H,040H,060H + db 000H,020H,084H,000H,000H,004H,020H,018H + db 018H,000H,000H,000H,000H,01BH,03DH,032H + db 000H,015H,09DH,000H,000H,000H,000H,000H + db 000H,018H,018H,024H,024H,002H,040H,000H + db 001H,041H,002H,001H,000H,003H,080H,005H + db 084H,001H,088H,009H,090H,011H,080H,021H + db 0A0H,001H,0C0H,000H,080H,040H,082H,080H + db 000H,002H,040H,024H,024H,018H,018H,000H + db 000H,000H,000H,01BH,03DH,00FH,000H,014H + db 0AFH,000H,009H,05DH,022H,022H,022H,022H + db 022H,022H,05DH,000H,000H,000H,01BH,03DH + db 032H,000H,015H,0AFH,000H,000H,000H,000H + db 000H,000H,042H,000H,000H,000H,018H,054H + db 000H,028H,024H,000H,000H,000H,000H,044H + db 000H,044H,000H,044H,000H,044H,000H,044H + db 000H,044H,000H,044H,000H,000H,024H,000H + db 000H,028H,018H,054H,000H,000H,042H,000H + db 000H,000H,000H,000H,000H,000H,000H,001H + db 000H,001H,000H,0AFH,00CH,001H,000H,00CH + db 000H,005H,01BH,049H,000H,01BH,036H,005H + db 01BH,049H,004H,01BH,036H,01BH,03DH,001H + db 000H,015H,01BH,03DH,000H,000H,01BH,049H + db 004H,000H,01BH,03DH,00FH,000H,014H,086H + db 000H,00AH,004H,00AH,06AH,0AAH,0AAH,0AAH + db 06AH,01CH,002H,000H,000H,000H,000H,01BH + db 03DH,036H,000H,014H,09BH,000H,009H,01DH + db 022H,026H,02AH,02AH,032H,022H,05CH,000H + db 000H,000H,000H,009H,012H,012H,07EH,092H + db 092H,082H,082H,082H,042H,000H,000H,000H + db 00AH,03AH,044H,000H,08AH,092H,0A2H,000H + db 044H,0B8H,000H,000H,000H,019H,000H,044H + db 000H,028H,000H,010H,000H,028H,000H,044H + db 000H,000H,000H,01BH,03DH,00FH,000H,014H + db 0A9H,000H,00BH,03CH,042H,081H,081H,0BDH + db 0A9H,0A9H,095H,081H,042H,03CH,000H,000H + db 01BH,03DH,036H,000H,014H,0B5H,000H,009H + db 00EH,014H,024H,024H,064H,0A4H,024H,014H + db 00EH,000H,000H,000H,009H,04EH,014H,084H + db 0A4H,0A4H,0A4H,084H,014H,04EH,000H,000H + db 000H,009H,00EH,014H,024H,0A4H,064H,024H + db 024H,014H,00EH,000H,000H,000H,00BH,038H + db 044H,000H,092H,0AAH,0AAH,0AAH,082H,000H + db 044H,038H,000H,000H,01BH,03DH,00FH,000H + db 014H,0BDH,000H,008H,018H,024H,024H,024H + db 07EH,024H,024H,024H,000H,000H,000H,000H + db 000H,01BH,03DH,01CH,000H,014H,0C6H,000H + db 009H,044H,00AH,08AH,0AAH,0AAH,06AH,04AH + db 05CH,082H,000H,000H,000H,009H,04EH,014H + db 084H,0A4H,0A4H,064H,044H,054H,08EH,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,01BH,03DH,0A2H,001H,014H,0DDH,000H + db 025H,000H,000H,000H,000H,0EEH,000H,000H + db 000H,000H,000H,000H,000H,016H,000H,000H + db 022H,0A2H,07EH,022H,022H,000H,000H,000H + db 000H,001H,00BH,0FCH,0FCH,0FCH,0FCH,0FCH + db 0FCH,0FCH,0FCH,0FCH,0FCH,0FCH,000H,008H + db 01CH,022H,022H,022H,062H,0A2H,022H,01CH + db 000H,000H,000H,000H,008H,01FH,020H,040H + db 084H,092H,082H,06AH,004H,000H,000H,000H + db 000H,00BH,040H,000H,09CH,0A2H,0A2H,0A2H + db 0A2H,0A2H,09CH,000H,040H,000H,008H,01CH + db 022H,022H,0A2H,062H,022H,022H,01CH,000H + db 000H,000H,000H,008H,04CH,092H,092H,092H + db 052H,052H,052H,08CH,000H,000H,000H,000H + db 009H,040H,01CH,080H,0A2H,0A2H,062H,040H + db 05CH,080H,000H,000H,080H,008H,001H,07EH + db 008H,008H,008H,008H,078H,004H,000H,000H + db 000H,000H,009H,081H,081H,0FFH,025H,025H + db 025H,024H,024H,018H,000H,000H,000H,018H + db 000H,081H,0FFH,0A5H,024H,024H,024H,024H + db 018H,000H,000H,000H,009H,03CH,002H,002H + db 002H,042H,082H,002H,002H,03CH,000H,000H + db 000H,009H,05CH,002H,082H,082H,082H,082H + db 082H,002H,05CH,000H,000H,000H,009H,03CH + db 002H,002H,082H,042H,002H,002H,002H,03CH + db 000H,000H,080H,008H,020H,010H,009H,002H + db 044H,088H,010H,020H,000H,000H,000H,000H + db 009H,040H,020H,010H,008H,046H,088H,010H + db 020H,040H,000H,000H,000H,009H,080H,080H + db 080H,080H,080H,080H,080H,080H,080H,000H + db 000H,000H,025H,000H,000H,000H,000H,040H + db 080H,000H,000H,000H,000H,000H,020H,00BH + db 010H,010H,010H,010H,010H,010H,010H,010H + db 010H,000H,000H,000H,009H,022H,022H,022H + db 022H,0FAH,022H,022H,022H,022H,000H,000H + db 000H,009H,00AH,00AH,00AH,00AH,00AH,00AH + db 00AH,00AH,00AH,000H,000H,000H,00BH,0A8H + db 0A8H,0AAH,054H,008H,010H,022H,046H,08AH + db 002H,01FH,000H,009H,0C0H,0A0H,0A0H,0FEH + db 080H,080H,080H,080H,0FEH,000H,000H,000H + db 017H,000H,050H,0AAH,0AAH,0AAH,0AAH,0AAH + db 014H,000H,000H,000H,000H,019H,000H,010H + db 010H,010H,0D6H,0D6H,0D6H,010H,010H,010H + db 000H,080H,015H,000H,000H,001H,001H,005H + db 002H,000H,000H,000H,000H,000H,000H,016H + db 000H,000H,060H,090H,090H,090H,060H,000H + db 000H,000H,000H,000H,018H,000H,030H,030H + db 030H,000H,000H,030H,030H,030H,000H,000H + db 000H,025H,000H,000H,000H,000H,010H,010H + db 000H,000H,000H,000H,000H,000H,016H,000H + db 000H,048H,008H,0F8H,008H,008H,000H,000H + db 000H,000H,000H,025H,000H,000H,000H,0A8H + db 0A8H,0A8H,050H,000H,000H,000H,000H,000H + db 000H,01BH,03DH,084H,000H,014H,0CFH,000H + db 008H,05DH,022H,022H,022H,022H,022H,022H + db 05DH,000H,000H,000H,000H,017H,000H,004H + db 02AH,08AH,04AH,02AH,09AH,004H,000H,000H + db 000H,000H,009H,092H,0FEH,092H,092H,082H + db 082H,082H,044H,038H,000H,000H,000H,009H + db 07EH,02AH,0AAH,0AAH,0AAH,0AAH,0AAH,022H + db 062H,000H,000H,000H,009H,03EH,0AAH,0AAH + db 02AH,02AH,02AH,0AAH,0A2H,022H,000H,000H + db 000H,009H,03EH,02AH,02AH,0AAH,06AH,02AH + db 02AH,022H,022H,000H,000H,000H,016H,000H + db 000H,012H,012H,01EH,002H,002H,000H,000H + db 000H,000H,000H,016H,000H,000H,022H,022H + db 07EH,0A2H,022H,000H,000H,000H,000H,000H + db 00BH,040H,000H,080H,0A2H,0A2H,0BEH,0A2H + db 0A2H,080H,000H,040H,000H,017H,000H,000H + db 0A2H,0A2H,03EH,022H,0A2H,080H,000H,000H + db 000H,000H,01BH,03DH,032H,000H,015H,09BH + db 080H,000H,000H,000H,000H,000H,018H,018H + db 004H,020H,000H,000H,021H,004H,000H,002H + db 002H,040H,002H,044H,006H,040H,002H,048H + db 00AH,040H,002H,050H,012H,040H,002H,060H + db 022H,040H,060H,000H,020H,084H,000H,000H + db 004H,020H,018H,018H,000H,000H,000H,000H + db 01BH,03DH,032H,000H,015H,09DH,000H,000H + db 000H,000H,000H,000H,018H,018H,024H,024H + db 002H,040H,000H,001H,041H,002H,001H,000H + db 003H,080H,005H,084H,001H,088H,009H,090H + db 011H,080H,021H,0A0H,001H,0C0H,000H,080H + db 040H,082H,080H,000H,002H,040H,024H,024H + db 018H,018H,000H,000H,000H,000H,01BH,03DH + db 032H,000H,015H,086H,000H,000H,000H,000H + db 000H,000H,000H,000H,002H,004H,004H,002H + db 000H,020H,041H,0A8H,001H,028H,081H,068H + db 081H,068H,081H,068H,081H,068H,081H,068H + db 081H,068H,081H,068H,000H,028H,040H,08AH + db 010H,00AH,00EH,01EH,001H,000H,001H,000H + db 001H,000H,000H,000H,01BH,03DH,032H,000H + db 015H,09EH,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 024H,000H,000H,000H,000H,028H,018H,000H + db 000H,000H,000H,010H,000H,000H,018H,000H + db 000H,028H,000H,000H,024H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,01BH,03DH,032H,000H,015H,0A9H + db 000H,000H,000H,000H,01CH,018H,000H,024H + db 022H,000H,000H,000H,000H,042H,000H,000H + db 05DH,03CH,049H,020H,049H,020H,049H,020H + db 049H,020H,049H,020H,049H,020H,049H,028H + db 04DH,020H,010H,014H,000H,042H,000H,000H + db 022H,000H,000H,024H,01CH,018H,000H,000H + db 01BH,03DH,0C2H,000H,015H,0B5H,000H,000H + db 000H,000H,001H,000H,001H,000H,021H,000H + db 023H,002H,025H,004H,02DH,008H,025H,010H + db 034H,020H,024H,000H,064H,000H,024H,000H + db 024H,080H,024H,000H,094H,020H,005H,010H + db 00DH,008H,005H,004H,003H,002H,001H,000H + db 001H,000H,001H,000H,000H,000H,000H,000H + db 000H,000H,001H,000H,001H,000H,021H,000H + db 023H,002H,025H,004H,06DH,008H,025H,010H + db 034H,0A0H,024H,000H,0A4H,000H,0A4H,000H + db 0A4H,000H,024H,000H,014H,0A0H,005H,010H + db 04DH,008H,005H,004H,003H,002H,001H,000H + db 001H,000H,001H,000H,000H,000H,000H,000H + db 000H,000H,001H,000H,001H,000H,021H,000H + db 023H,002H,025H,004H,02DH,008H,025H,010H + db 0B4H,020H,024H,000H,024H,080H,024H,000H + db 064H,000H,024H,000H,014H,020H,005H,010H + db 00DH,008H,005H,004H,003H,002H,001H,000H + db 001H,000H,001H,000H,000H,000H,000H,000H + db 000H,000H,01CH,018H,000H,024H,022H,000H + db 000H,000H,000H,042H,008H,018H,055H,000H + db 041H,024H,041H,024H,041H,024H,041H,024H + db 041H,024H,041H,024H,041H,024H,041H,000H + db 014H,000H,000H,042H,000H,000H,022H,000H + db 000H,024H,01CH,018H,000H,000H,01BH,03DH + db 032H,000H,015H,0BDH,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,018H,018H + db 004H,020H,020H,004H,000H,000H,002H,040H + db 002H,040H,002H,040H,0FFH,0FFH,002H,040H + db 002H,040H,002H,040H,022H,000H,022H,000H + db 030H,060H,000H,004H,000H,000H,000H,000H + db 000H,000H,000H,000H,01BH,03DH,062H,000H + db 015H,0C6H,000H,000H,000H,000H,000H,000H + db 000H,000H,002H,004H,044H,002H,000H,0A0H + db 001H,028H,081H,028H,081H,028H,081H,028H + db 001H,028H,001H,0A8H,001H,028H,041H,028H + db 041H,028H,040H,028H,000H,00AH,010H,08AH + db 08EH,01EH,001H,000H,001H,000H,001H,000H + db 000H,000H,000H,000H,000H,000H,001H,000H + db 001H,000H,021H,000H,023H,082H,025H,004H + db 0ADH,008H,0A5H,010H,0B4H,020H,0A4H,000H + db 0A4H,000H,024H,000H,024H,080H,024H,080H + db 014H,0A0H,005H,090H,00DH,088H,005H,004H + db 083H,002H,001H,000H,001H,000H,001H,000H + db 000H,000H,01BH,03DH,0E2H,001H,015H,0CFH + db 000H,000H,000H,000H,000H,000H,042H,000H + db 000H,000H,018H,054H,000H,028H,024H,000H + db 000H,000H,000H,044H,000H,044H,000H,044H + db 000H,044H,000H,044H,000H,044H,000H,044H + db 000H,000H,024H,000H,000H,028H,018H,054H + db 000H,000H,042H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 004H,00CH,0AAH,000H,000H,000H,000H,0D2H + db 000H,000H,051H,000H,011H,000H,011H,0C0H + db 011H,000H,0B1H,000H,001H,000H,001H,020H + db 010H,000H,000H,002H,000H,010H,00AH,000H + db 004H,00CH,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,010H,001H,090H + db 001H,090H,001H,090H,07FH,0FEH,001H,090H + db 001H,090H,001H,090H,001H,090H,001H,090H + db 001H,090H,001H,080H,001H,080H,001H,080H + db 000H,000H,040H,002H,000H,000H,002H,040H + db 024H,024H,018H,018H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,021H,000H + db 021H,000H,021H,000H,021H,000H,03FH,03EH + db 061H,008H,021H,008H,021H,088H,021H,008H + db 0A1H,008H,0A1H,008H,0A1H,008H,02DH,01CH + db 021H,080H,021H,000H,061H,000H,021H,000H + db 021H,000H,033H,026H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,021H,000H + db 021H,000H,021H,000H,021H,000H,0BFH,0BEH + db 0A1H,088H,0A1H,088H,021H,008H,021H,008H + db 021H,008H,021H,008H,021H,008H,02DH,01CH + db 0A1H,080H,0A1H,080H,0A1H,080H,021H,000H + db 021H,000H,033H,026H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,021H,000H + db 021H,000H,021H,000H,021H,000H,03FH,03EH + db 021H,008H,021H,008H,0A1H,008H,021H,008H + db 021H,088H,021H,008H,061H,008H,02DH,01CH + db 021H,000H,021H,000H,021H,000H,021H,000H + db 021H,000H,033H,026H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,001H,000H,001H,000H,001H,020H + db 001H,020H,001H,020H,001H,020H,001H,020H + db 001H,020H,01FH,03EH,001H,000H,001H,000H + db 001H,000H,001H,000H,001H,000H,001H,000H + db 001H,000H,001H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,021H,000H,021H,000H + db 021H,000H,021H,000H,021H,000H,061H,000H + db 03FH,03EH,021H,080H,021H,000H,0A1H,000H + db 021H,000H,021H,000H,021H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,021H,000H,061H,000H + db 021H,000H,021H,080H,021H,000H,0A1H,000H + db 0BFH,03EH,0A1H,000H,021H,000H,021H,080H + db 021H,000H,061H,000H,021H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,021H,000H,0A1H,080H + db 0A1H,080H,0A1H,080H,021H,000H,021H,000H + db 03FH,03EH,021H,000H,021H,000H,0A1H,080H + db 0A1H,080H,0A1H,080H,021H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 01BH,03DH,062H,000H,015H,0DDH,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,0E7H,0E7H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,021H,000H,021H,000H,021H,000H + db 0A1H,000H,021H,000H,021H,080H,03FH,03EH + db 061H,000H,021H,000H,021H,000H,021H,000H + db 021H,000H,021H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,01BH,03DH + db 032H,000H,015H,0E0H,000H,000H,000H,000H + db 000H,000H,00CH,008H,000H,014H,012H,000H + db 000H,000H,000H,022H,000H,000H,021H,000H + db 021H,000H,061H,000H,021H,000H,021H,080H + db 021H,000H,0A1H,000H,000H,000H,000H,022H + db 000H,000H,012H,000H,000H,014H,00CH,008H + db 000H,000H,000H,000H,01BH,03DH,0C2H,000H + db 015H,0E2H,000H,000H,000H,000H,000H,000H + db 00CH,008H,000H,014H,012H,000H,000H,000H + db 040H,022H,000H,000H,021H,080H,021H,000H + db 0A1H,000H,0A1H,000H,0A1H,000H,021H,000H + db 021H,080H,000H,000H,040H,022H,000H,000H + db 012H,000H,000H,014H,00CH,008H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 00CH,008H,000H,014H,012H,000H,000H,000H + db 000H,022H,000H,000H,0A1H,000H,021H,000H + db 021H,080H,021H,000H,061H,000H,021H,000H + db 021H,000H,000H,000H,000H,022H,000H,000H + db 012H,000H,000H,014H,00CH,008H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,00CH,00CH,042H,010H,000H,080H + db 010H,002H,080H,000H,081H,020H,081H,020H + db 001H,020H,001H,0A0H,001H,020H,041H,020H + db 041H,020H,040H,000H,010H,002H,000H,080H + db 082H,010H,00CH,00CH,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 00CH,008H,000H,014H,012H,080H,000H,000H + db 080H,022H,080H,000H,0A1H,000H,0A1H,000H + db 0A1H,000H,021H,000H,021H,080H,021H,080H + db 021H,080H,000H,080H,000H,0A2H,000H,000H + db 092H,000H,000H,014H,00CH,008H,000H,000H + db 000H,000H,01BH,03DH,0E2H,001H,015H,0E7H + db 080H,000H,080H,000H,080H,001H,080H,001H + db 080H,001H,0FFH,0FFH,024H,001H,024H,001H + db 000H,001H,000H,045H,000H,045H,000H,044H + db 000H,044H,000H,044H,000H,044H,000H,044H + db 000H,044H,000H,044H,000H,000H,024H,000H + db 000H,028H,018H,010H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,001H,080H + db 001H,080H,001H,080H,001H,080H,07FH,0FEH + db 021H,084H,021H,084H,021H,084H,021H,084H + db 021H,084H,021H,084H,020H,004H,020H,004H + db 020H,004H,020H,004H,020H,004H,020H,004H + db 000H,000H,004H,020H,018H,018H,000H,000H + db 000H,000H,000H,000H,020H,000H,020H,000H + db 020H,000H,03CH,03CH,022H,000H,020H,002H + db 020H,000H,001H,000H,001H,000H,041H,000H + db 001H,000H,001H,080H,001H,000H,081H,000H + db 020H,000H,020H,002H,022H,000H,03CH,03CH + db 020H,000H,020H,000H,020H,000H,000H,000H + db 000H,000H,000H,000H,020H,000H,020H,000H + db 020H,000H,03CH,03CH,022H,000H,060H,002H + db 020H,000H,001H,080H,001H,000H,081H,000H + db 081H,000H,081H,000H,001H,000H,001H,080H + db 020H,000H,060H,002H,022H,000H,03CH,03CH + db 020H,000H,020H,000H,020H,000H,000H,000H + db 000H,000H,000H,000H,020H,000H,020H,000H + db 020H,000H,03CH,03CH,022H,000H,020H,002H + db 020H,000H,081H,000H,001H,000H,001H,080H + db 001H,000H,041H,000H,001H,000H,001H,000H + db 020H,000H,020H,002H,022H,000H,03CH,03CH + db 020H,000H,020H,000H,020H,000H,000H,000H + db 000H,000H,000H,000H,000H,020H,000H,020H + db 000H,020H,010H,020H,000H,031H,008H,021H + db 000H,029H,004H,001H,000H,005H,043H,001H + db 002H,003H,002H,081H,000H,005H,084H,000H + db 000H,028H,008H,020H,000H,030H,010H,020H + db 000H,020H,000H,020H,000H,020H,000H,000H + db 000H,000H,000H,000H,020H,000H,020H,000H + db 020H,000H,020H,000H,020H,020H,030H,000H + db 021H,010H,009H,000H,001H,008H,005H,000H + db 047H,006H,005H,000H,001H,088H,009H,000H + db 0A1H,010H,030H,000H,020H,020H,020H,000H + db 020H,000H,020H,000H,020H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,080H,000H,080H,000H,080H,000H + db 080H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,040H,000H + db 000H,000H,000H,080H,000H,000H,080H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,008H + db 000H,008H,000H,008H,000H,008H,000H,008H + db 000H,008H,000H,008H,000H,008H,000H,008H + db 000H,008H,000H,008H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 01BH,03DH,0C2H,000H,015H,0F2H,080H,000H + db 002H,001H,002H,001H,002H,001H,002H,001H + db 002H,001H,002H,001H,002H,001H,002H,001H + db 002H,001H,002H,001H,002H,001H,002H,001H + db 002H,001H,002H,001H,002H,001H,002H,001H + db 002H,001H,002H,001H,002H,001H,002H,001H + db 002H,001H,002H,001H,002H,001H,000H,000H + db 010H,080H,080H,010H,080H,010H,080H,050H + db 081H,050H,080H,052H,002H,000H,070H,0A4H + db 004H,000H,000H,008H,008H,000H,000H,010H + db 010H,000H,002H,022H,024H,006H,008H,04AH + db 040H,002H,000H,082H,000H,002H,007H,007H + db 000H,002H,000H,002H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,030H,020H + db 030H,020H,078H,071H,078H,071H,078H,0F9H + db 078H,0F9H,07FH,0FFH,000H,080H,000H,080H + db 000H,080H,000H,080H,000H,080H,07FH,0FFH + db 000H,081H,000H,081H,000H,081H,000H,081H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,010H,030H,029H,003H,000H,009H + db 040H,041H,024H,001H,000H,081H,000H,0A5H + db 000H,081H,012H,080H,001H,082H,000H,090H + db 04AH,0C0H,004H,00CH,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,01BH,03DH + db 032H,000H,015H,0F7H,080H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,001H,001H,000H + db 000H,002H,002H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,01BH,03DH,032H,000H + db 015H,0F9H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 080H,080H,080H,080H,080H,080H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,080H,080H,080H,080H,080H,080H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,01BH,03DH,062H,000H,015H,0FBH + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,008H + db 040H,008H,000H,008H,000H,088H,000H,088H + db 0F8H,0F8H,000H,008H,000H,008H,000H,008H + db 000H,008H,000H,008H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 008H,080H,000H,000H,080H,008H,0A0H,008H + db 0A0H,008H,0A0H,008H,0A0H,008H,020H,000H + db 008H,0A0H,050H,050H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 01BH,03DH,00FH,000H,014H,0BEH,000H,009H + db 080H,054H,034H,014H,01EH,014H,034H,054H + db 080H,000H,000H,01BH,03DH,032H,000H,015H + db 0BEH,000H,000H,000H,000H,000H,080H,000H + db 080H,000H,094H,040H,094H,000H,0D4H,020H + db 094H,001H,0B4H,011H,014H,001H,014H,009H + db 004H,00FH,00EH,009H,004H,001H,014H,011H + db 014H,001H,0B4H,020H,094H,000H,0D4H,040H + db 094H,000H,094H,000H,080H,000H,080H,000H + db 000H,000H,000H,000H diff --git a/v4.0/src/DEV/PRINTER/4201/4201.MAK b/v4.0/src/DEV/PRINTER/4201/4201.MAK new file mode 100644 index 0000000..a457074 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4201/4201.MAK @@ -0,0 +1,7 @@ +#---- MAKEFILE FOR 4201.CPI ------------ +# This make file prevents build output errors for (subdirs.bat config line +# Mark Nosewicz + +4201.CPI: 4201.CPI + ECHO 4201.CPI HAS BEEN CHANGED + \ No newline at end of file diff --git a/v4.0/src/DEV/PRINTER/4201/MAKEFILE b/v4.0/src/DEV/PRINTER/4201/MAKEFILE new file mode 100644 index 0000000..e69de29 diff --git a/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM b/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM new file mode 100644 index 0000000..6bb3695 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM @@ -0,0 +1,10 @@ + +CODE segment public 'code' +ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING + org 0 + + include copyrigh.inc + +code ends + end + \ No newline at end of file diff --git a/v4.0/src/DEV/PRINTER/4208/4208.CPI b/v4.0/src/DEV/PRINTER/4208/4208.CPI new file mode 100644 index 0000000..4fe1a18 Binary files /dev/null and b/v4.0/src/DEV/PRINTER/4208/4208.CPI differ diff --git a/v4.0/src/DEV/PRINTER/4208/4208.INC b/v4.0/src/DEV/PRINTER/4208/4208.INC new file mode 100644 index 0000000..6aa3dfe --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208.INC @@ -0,0 +1,90 @@ + db 0FFH,046H,04FH,04EH,054H,020H,020H,020H + db 000H,000H,000H,000H,000H,000H,000H,000H + db 001H,000H,001H,017H,000H,000H,000H,009H + db 000H,01AH,000H,035H,000H,000H,000H,002H + db 000H,034H,032H,030H,038H,020H,020H,020H + db 020H,0B5H,001H,000H,000H,000H,000H,000H + db 000H,015H,001H,000H,000H,01AH,000H,051H + db 000H,000H,000H,002H,000H,034H,032H,030H + db 038H,020H,020H,020H,020H,05EH,003H,000H + db 000H,000H,000H,000H,000H,02BH,001H,000H + db 000H,01AH,000H,06DH,000H,000H,000H,002H + db 000H,034H,032H,030H,038H,020H,020H,020H + db 020H,060H,003H,000H,000H,000H,000H,000H + db 000H,041H,001H,000H,000H,01AH,000H,089H + db 000H,000H,000H,002H,000H,034H,032H,030H + db 038H,020H,020H,020H,020H,052H,003H,000H + db 000H,000H,000H,000H,000H,057H,001H,000H + db 000H,01AH,000H,0A5H,000H,000H,000H,002H + db 000H,034H,032H,030H,038H,020H,020H,020H + db 020H,053H,003H,000H,000H,000H,000H,000H + db 000H,06DH,001H,000H,000H,01AH,000H,0C1H + db 000H,000H,000H,002H,000H,034H,032H,030H + db 038H,020H,020H,020H,020H,055H,003H,000H + db 000H,000H,000H,000H,000H,083H,001H,000H + db 000H,01AH,000H,0DDH,000H,000H,000H,002H + db 000H,034H,032H,030H,038H,020H,020H,020H + db 020H,057H,003H,000H,000H,000H,000H,000H + db 000H,099H,001H,000H,000H,01AH,000H,000H + db 000H,000H,000H,002H,000H,034H,032H,030H + db 038H,020H,020H,020H,020H,05FH,003H,000H + db 000H,000H,000H,000H,000H,0AFH,001H,000H + db 000H,01AH,000H,000H,000H,000H,000H,002H + db 000H,034H,032H,030H,038H,020H,020H,020H + db 020H,000H,000H,000H,000H,000H,000H,000H + db 000H,000H,000H,000H,000H,001H,000H,001H + db 000H,010H,000H,002H,000H,00CH,000H,01BH + db 049H,002H,000H,000H,000H,000H,000H,000H + db 000H,01BH,036H,001H,000H,001H,000H,010H + db 000H,002H,000H,00CH,000H,01BH,049H,00EH + db 01BH,049H,007H,01BH,049H,006H,000H,01BH + db 036H,001H,000H,001H,000H,010H,000H,002H + db 000H,00CH,000H,01BH,049H,00EH,01BH,049H + db 007H,01BH,049H,006H,000H,01BH,036H,001H + db 000H,001H,000H,010H,000H,002H,000H,00CH + db 000H,01BH,049H,00EH,01BH,049H,007H,01BH + db 049H,006H,000H,01BH,036H,001H,000H,001H + db 000H,010H,000H,002H,000H,00CH,000H,01BH + db 049H,00EH,01BH,049H,007H,01BH,049H,006H + db 000H,01BH,036H,001H,000H,001H,000H,010H + db 000H,002H,000H,00CH,000H,01BH,049H,00EH + db 01BH,049H,007H,01BH,049H,006H,000H,01BH + db 036H,001H,000H,001H,000H,010H,000H,002H + db 000H,00CH,000H,01BH,049H,00EH,01BH,049H + db 007H,01BH,049H,006H,000H,01BH,036H,001H + db 000H,001H,000H,010H,000H,002H,000H,00CH + db 000H,01BH,049H,00EH,01BH,049H,007H,01BH + db 049H,006H,000H,01BH,036H,001H,000H,001H + db 000H,010H,000H,002H,000H,00CH,000H,01BH + db 049H,00EH,01BH,049H,007H,01BH,049H,006H + db 000H,01BH,036H,00AH,00DH,054H,068H,065H + db 020H,049H,042H,04DH,020H,050H,065H,072H + db 073H,06FH,06EH,061H,06CH,020H,043H,06FH + db 06DH,070H,075H,074H,065H,072H,020H,050H + db 072H,069H,06EH,074H,065H,072H,020H,043H + db 06FH,064H,065H,020H,050H,061H,067H,065H + db 020H,044H,072H,069H,076H,065H,072H,00AH + db 00DH,056H,065H,072H,073H,069H,06FH,06EH + db 020H,033H,02EH,033H,030H,020H,028H,043H + db 029H,020H,043H,06FH,070H,079H,072H,069H + db 067H,068H,074H,020H,049H,042H,04DH,020H + db 043H,06FH,072H,070H,020H,031H,039H,038H + db 037H,00AH,00DH,04CH,069H,063H,065H,06EH + db 073H,065H,064H,020H,04DH,061H,074H,065H + db 072H,069H,061H,06CH,020H,02DH,020H,050H + db 072H,06FH,067H,072H,061H,06DH,020H,050H + db 072H,06FH,070H,065H,072H,074H,079H,020H + db 06FH,066H,020H,049H,042H,04DH,01AH,01AH + db 040H,040H,040H,023H,023H,023H,020H,044H + db 04FH,053H,020H,033H,02EH,033H,030H,020H + db 044H,072H,069H,076H,065H,072H,020H,044H + db 052H,056H,030H,035H,048H,02CH,020H,031H + db 030H,02FH,032H,031H,02FH,038H,036H,00DH + db 00AH,01AH,000H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H + db 020H,020H,020H,020H,020H,020H,020H,020H diff --git a/v4.0/src/DEV/PRINTER/4208/4208.MAK b/v4.0/src/DEV/PRINTER/4208/4208.MAK new file mode 100644 index 0000000..b3d0c4d --- /dev/null +++ b/v4.0/src/DEV/PRINTER/4208/4208.MAK @@ -0,0 +1,7 @@ +#---- MAKEFILE FOR 4208.CPI ------------ +# This make file prevents build output errors for (subdirs.bat config line +# Mark Nosewicz + +4208.CPI: 4208.CPI + ECHO 4208.CPI HAS BEEN CHANGED + \ No newline at end of file diff --git a/v4.0/src/DEV/PRINTER/4208/MAKEFILE b/v4.0/src/DEV/PRINTER/4208/MAKEFILE new file mode 100644 index 0000000..e69de29 diff --git a/v4.0/src/DEV/PRINTER/5202/5202.ASM b/v4.0/src/DEV/PRINTER/5202/5202.ASM new file mode 100644 index 0000000..ed6c3cf --- /dev/null +++ b/v4.0/src/DEV/PRINTER/5202/5202.ASM @@ -0,0 +1,108 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; DESCRIPTION : Code Page Switching 5202 Printer Font File +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ESC1 EQU 01BH ; + ; +CSEG SEGMENT ; + ASSUME CS:CSEG,DS:CSEG ; +BEGIN: ORG 0 ; + ; +FNTHEAD:DB 0FFH,"FONT " ; FILE TAG + DB 8 DUP(0) ; RESERVED + DW 1 ; CNT OF POINTERS IN HEADER + DB 1 ; TYPE FOR INFO POINTER + DW OFFSET INFO,0 ; POINTER TO INFO IN FILE + ; +info : DW 5 ; COUNT OF ENTRIES + ; +QUI437: DW LEN_437 ; SIZE OF ENTRY HEADER + DW QUI850,0 ; POINTER TO NEXT HEADER + DW 2 ; DEVICE TYPE + DB "5202 " ; DEVICE SUBTYPE ID + DW 437 ; CODE PAGE ID + DW 3 DUP(0) ; RESERVED + DW OFFSET DATA437,0 ; POINTER TO FONTS +LEN_437 EQU ($-QUI437)-2 ; + ; +QUI850: DW LEN_850 ; SIZE OF ENTRY HEADER + DW QUI860,0 ; POINTER TO NEXT HEADER + DW 2 ; DEVICE TYPE + DB "5202 " ; DEVICE SUBTYPE ID + DW 850 ; CODE PAGE ID + DW 3 DUP(0) ; RESERVED + DW OFFSET DATA850,0 ; POINTER TO FONTS +LEN_850 EQU ($-QUI850)-2 ; + ; +QUI860: DW LEN_860 ; SIZE OF ENTRY HEADER + DW QUI863,0 ; POINTER TO NEXT HEADER + DW 2 ; DEVICE TYPE + DB "5202 " ; DEVICE SUBTYPE ID + DW 860 ; CODE PAGE ID + DW 3 DUP(0) ; RESERVED + DW OFFSET DATA860,0 ; POINTER TO FONTS +LEN_860 EQU ($-QUI860)-2 ; + ; +QUI863: DW LEN_863 ; SIZE OF ENTRY HEADER + DW QUI865,0 ; POINTER TO NEXT HEADER + DW 2 ; DEVICE TYPE + DB "5202 " ; DEVICE SUBTYPE ID + DW 863 ; CODE PAGE ID + DW 3 DUP(0) ; RESERVED + DW OFFSET DATA863,0 ; POINTER TO FONTS +LEN_863 EQU ($-QUI863)-2 ; + ; +QUI865: DW LEN_865 ; SIZE OF ENTRY HEADER + DW 0,0 ; POINTER TO NEXT HEADER + DW 2 ; DEVICE TYPE + DB "5202 " ; DEVICE SUBTYPE ID + DW 865 ; CODE PAGE ID + DW 3 DUP(0) ; RESERVED + DW OFFSET DATA865,0 ; POINTER TO FONTS +LEN_865 EQU ($-QUI865)-2 ; + ; +DATA437:DW 1 ; CART/NON-CART + DW 1 ; # OF FONTS + DW 16 ; LENGTH OF DATA + DW 2 ; SELECTION TYPE + DW 12 ; SELECTION length + DB ESC1,91,84,5,0,00,00,001H,0B5H,00 ; select code page ****** + dB ESC1,"6" ; + ; +DATA850:DW 1 ; CART/NON-CART + DW 1 ; # OF FONTS + DW 16 ; LENGTH OF DATA + DW 2 ; SELECTION TYPE + DW 12 ; SELECTION length + DB ESC1,91,84,5,0,00,00,003H,052H,00 ; select code page ****** + dB ESC1,"6" ; + ; +DATA860:DW 1 ; CART/NON-CART + DW 1 ; # OF FONTS + DW 16 ; LENGTH OF DATA + DW 2 ; SELECTION TYPE + DW 12 ; SELECTION length + DB ESC1,91,84,5,0,00,00,003H,05CH,00 ; select code page ****** + dB ESC1,"6" ; + ; +DATA863:DW 1 ; CART/NON-CART + DW 1 ; # OF FONTS + DW 16 ; LENGTH OF DATA + DW 2 ; SELECTION TYPE + DW 12 ; SELECTION length + DB ESC1,91,84,5,0,00,00,003H,05FH,00 ; select code page ****** + dB ESC1,"6" ; + ; +DATA865:DW 1 ; CART/NON-CART + DW 1 ; # OF FONTS + DW 16 ; LENGTH OF DATA + DW 2 ; SELECTION TYPE + DW 12 ; SELECTION length + DB ESC1,91,84,5,0,00,00,003H,061H,00 ; select code page ****** + dB ESC1,"6" ; + +include copyrigh.inc + +CSEG ENDS ; + END BEGIN ; diff --git a/v4.0/src/DEV/PRINTER/5202/MAKEFILE b/v4.0/src/DEV/PRINTER/5202/MAKEFILE new file mode 100644 index 0000000..7bb70db --- /dev/null +++ b/v4.0/src/DEV/PRINTER/5202/MAKEFILE @@ -0,0 +1,21 @@ +#********************** Makefile for Printer\5202.CPI ********************** + +inc =..\..\..\inc +dos =..\..\..\dos +hinc =..\..\..\h +msg =..\..\..\message + +# +######################### Dependencies Begin Here ########################## +# + +all: 5202.cpi + +5202.obj: 5202.asm $(inc)\copyrigh.inc makefile + + +5202.cpi: 5202.obj + link 5202; + exe2bin 5202 5202.cpi + del 5202.exe + diff --git a/v4.0/src/DEV/PRINTER/CPSFONT.ASM b/v4.0/src/DEV/PRINTER/CPSFONT.ASM new file mode 100644 index 0000000..74fa12b --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSFONT.ASM @@ -0,0 +1,1961 @@ + + PAGE ,132 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Device Driver -- Font Parser +;; MODULE NAME: CPSFONT +;; TYPE: Font Parser Module +;; LINK PROCEDURE: Link CPS+CPSSUB+CPSINT9+...+CPSINIT into .EXE format +;; CPS must be first. CPSINIT must be last. Everything +;; before CPSINIT will be resident. +;; INCLUDE FILES: +;; CPSPEQU.INC +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INCLUDE CPSPEQU.INC ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +CSEG SEGMENT PUBLIC 'CODE' ;; + ASSUME CS:CSEG ;; + ASSUME DS:NOTHING ;; + ;; +PUBLIC FTABLE,FONT_PARSER ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ************************************ +;; ** ** +;; ** Resident Code ** +;; ** ** +;; ************************************ +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FONT_PARSER data +;; +;; -- Interface table : FTABLE +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing +FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries +FTB2 FTBLK <,,,,,,,,,,,,> ;; +FTB3 FTBLK <,,,,,,,,,,,,> ;; +FTB4 FTBLK <,,,,,,,,,,,,> ;; +FTB5 FTBLK <,,,,,,,,,,,,> ;; +FTB6 FTBLK <,,,,,,,,,,,,> ;; +FTB7 FTBLK <,,,,,,,,,,,,> ;; +FTB8 FTBLK <,,,,,,,,,,,,> ;; +FTB9 FTBLK <,,,,,,,,,,,,> ;; +FTBa FTBLK <,,,,,,,,,,,,> ;; +FTBb FTBLK <,,,,,,,,,,,,> ;; +FTBc FTBLK <,,,,,,,,,,,,> ;; + ;; +FP_ERROR DW 0000H ;; internal error register + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the followings are bytes accumulated + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FTAG_LEN EQU 8 ;; FILE TAGE in the font file header +FTAG_COUNT DW 0000H ;; + ;; +FTAG_PATTERN LABEL BYTE ;; + DB 0FFH ;; + DB 'FONT ' ;; + ;; + ;; + ;; POINTER in the font file header +fptr_LOW LABEL WORD ;; +fptr_LOL DB 00H ;; NEXT +fptr_LOH DB 00H ;; +fptr_HIGH LABEL WORD ;; +fptr_HIL DB 00H ;; +fptr_HIH DB 00H ;; + ;; + ;; + ;; +ENTRY_WORD LABEL WORD ;; +ENTRY_LOB DB 00H ;; ENTRY COUNT +ENTRY_HIB DB 00H ;; +NEXT_LOW LABEL WORD ;; +NEXT_LOL DB 00H ;; NEXT +NEXT_LOH DB 00H ;; +NEXT_HIGH LABEL WORD ;; +NEXT_HIL DB 00H ;; +NEXT_HIH DB 00H ;; +TYPE_WORD LABEL WORD ;; +TYPE_LOB DB 00H ;; TYPE +TYPE_HIB DB 00H ;; +TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8) +TYPE_ID : DB ' ' ;; TYPEID +CPG_WORD LABEL WORD ;; +CPG_LOB DB 00H ;; CODE PAGE +CPG_HIB DB 00H ;; +FONT_LOW LABEL WORD ;; +FONT_LOL DB 00H ;; FONT ADDRESS +FONT_LOH DB 00H ;; +FONT_HIGH LABEL WORD ;; +FONT_HIL DB 00H ;; +FONT_HIH DB 00H ;; +;; the followings are contained in the font-block in the exact order & length +MOD_WORD LABEL WORD ;; +MOD_LOB DB 00H ;; MODIFIER +MOD_HIB DB 00H ;; +FONTS_WORD LABEL WORD ;; +FONTS_LOB DB 00H ;; FONTS +FONTS_HIB DB 00H ;; +FDLEN_WORD LABEL WORD ;; +FDLEN_LOB DB 00H ;; FONT DATA LENGTH +FDLEN_HIB DB 00H ;; +PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data + ;; to follow. -- for NON-DISPLAY +DISP_ROWS DB 00H ;; DISPLAY's parameters : +DISP_COLS DB 00H ;; BOX SIZE +DISP_X DB 00H ;; ASPECT RATIO +DISP_Y DB 00H ;; +COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS +COUNT_LOB DB 00H ;; +COUNT_HIB DB 00H ;; +PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data + ;; to follow. -- for DISPLAY + ;; +PTR_SEL_WORD LABEL WORD ;; +PTR_SELOB DB 00H ;; +PTR_SEHIB DB 00H ;; +PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data + ;; to follow -- for PRINTER with + ;; selection type = 0. + ;; +PTR_LEN_WORD LABEL WORD ;; +PTR_LNLOB DB 00H ;; +PTR_LNHIB DB 00H ;; +PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data + ;; to follow -- for PRINTER with + ;; selection type <> 0. + ;; + ;; +;; also update STAGE_CASES and indexing constants + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the stage the parsing is in : ;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +STAGE_CASES LABEL WORD ;; the stage the parsing is in : + ;; + ;; *** INDEXED BY STAGE-INDEX + ;; + DW OFFSET ENTRYLO ;; 0 + DW OFFSET ENTRYHI ;; 1 + DW OFFSET NEXTLOL ;; 2 + DW OFFSET NEXTLOH ;; 3 + DW OFFSET NEXTHIL ;; 4 + DW OFFSET NEXTHIH ;; 5 + DW OFFSET TYPELO ;; 6 + DW OFFSET TYPEHI ;; 7 + DW OFFSET TYPEIDS ;; 8 + DW OFFSET CPGLO ;; 9 + DW OFFSET CPGHI ;; A + DW OFFSET FONTLOL ;; B + DW OFFSET FONTLOH ;; C + DW OFFSET FONTHIL ;; D + DW OFFSET FONTHIH ;; E + DW 00H ;; MATCH case -- end of SEARCH stages + DW 00H ;; SCAN case -- before PRE-FOUND stage + DW OFFSET MODLO ;; 11 + DW OFFSET MODHI ;; 12 + DW OFFSET FONTSLO ;; 13 + DW OFFSET FONTSHI ;; 14 + DW OFFSET FDLENLO ;; 15 + DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY + DW OFFSET DSPROWS ;; 17 -- DISPLAY only + DW OFFSET DSPCOLS ;; 18 + DW OFFSET DSPX ;; 19 + DW OFFSET DSPY ;; 1A + DW OFFSET DSPCOUNTLO ;; 1B + DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY + DW OFFSET PTRSELLO ;; 1D -- PRINTER only + DW OFFSET PTRSELHI ;; 1E + DW OFFSET PTRLENLO ;; 1F + DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER + DW 00H ;; FOUND case + DW 00H ;; GET_FONT case + DW 00H ;; PASS special stage + DW OFFSET FILETAG ;; 24 + DW OFFSET fptrLOL ;; 25 + DW OFFSET fptrLOH ;; 26 + DW OFFSET fptrHIL ;; 27 + DW OFFSET fptrHIH ;; 28 + DW 00H ;; FPTR_SKIP_CASE + ;; + ;; The followings are individual stage +STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages + ;; + ;; STAGE-INDEX + ;; + ;; **** INDEX TO STAGE_CASES **** +ENTRY_LOX EQU 00H ;; +ENTRY_HIX EQU 01H ;; +NEXT_LOLX EQU 02H ;; NEXT +NEXT_LOHX EQU 03H ;; +NEXT_HILX EQU 04H ;; +NEXT_HIHX EQU 05H ;; +TYPE_LOBX EQU 06H ;; TYPE +TYPE_HIBX EQU 07H ;; +TYPE_IDX EQU 08H ;; TYPEID +CPG_LOBX EQU 09H ;; CODE PAGE +CPG_HIBX EQU 0AH ;; +FONT_LOLX EQU 0BH ;; FONT ADDRESS +FONT_LOHX EQU 0CH ;; +FONT_HILX EQU 0DH ;; +FONT_HIHX EQU 0EH ;; + ;; ------------------------------ +MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages +SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages + ;; ------------------------------ +MOD_LOBX EQU 11H ;; MODIFIER +MOD_HIBX EQU 12H ;; +FONTS_LOBX EQU 13H ;; FONTS +FONTS_HIBX EQU 14H ;; +FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH +FDLEN_HIBX EQU 16H ;; +DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE +DISP_COLSX EQU 18H ;; +DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO +DISP_YX EQU 1AH ;; +COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT +COUNT_HIBX EQU 1CH ;; +PTRSELLOX EQU 1DH ;; +PTRSELHIX EQU 1EH ;; +PTRLENLOX EQU 1FH ;; +PTRLENHIX EQU 20H ;; + ;; + ;; ------------------------------ +FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage +GET_FX EQU 22H ;; + ;; ------------------------------ +PASSX EQU 23H ;; see pass_brk table + ;; ------------------------------ +FTAGX EQU 24H ;; RESTART ==> FILE TAG + ;; +fptr_LOLX EQU 25H ;; POINTER in font file header +fptr_LOHX EQU 26H ;; +fptr_HILX EQU 27H ;; +fptr_HIHX EQU 28H ;; --------------------------------- + ;; +fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; PASS -- to skip some bytes ;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the PASS mechanism is used to skip + ;; a number of bytes between two fields + ;; The numbers are tabulated in + ;; PASS_BRK table in the accumulative + ;; sum. The PASS_POSTX(and PASS_POSTXX) + ;; are used to tell what is the stage + ;; after all the bytes have skipped. + ;; +PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage + ;; +FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file : + ;; ( after TAG, before POINTER) + ;; +PASS_CNT DW 0 ;; +PASS_BRK LABEL WORD ;; + DW FILE_OFFSET ;; skip in the font file header + DW FILE_OFFSET+2 ;; pass header-length, needs to reset + ;; PASS_CNT for each of the font_header + DW FILE_OFFSET+8 ;; pass header-reserved bytes +PASS_INDX EQU ($-PASS_BRK)/2 ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the control variables : ;;;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STAGE DW STAGE_MAX ;; of the STAGE-INDEX + ;; +Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA + ;; + ;; +COUNT_LO DW 00000H ;; no. of bytes parsed so far +COUNT_hI DW 00000H ;; + ;; +HIT_LO DW 00000H ;; the next byte that is addressed by : +HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK. + ;; +HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching +HIT_BX DW 00000H ;; where FTB is found for nearest hit + ;; +NUM_FTB DW 00000H ;; as defined in the FP_BUFFER + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FONT_PARSER routine +;; +;; -- to be called at every packet received to extract informations +;; from Font File on byte basis. +;; +;; -- Interface though FTABLE +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +FONT_PARSER PROC ;; + 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 + LEA BX,FTABLE ;; + PUSH CS ;; + POP ES ;; ES:[BX] + LDS SI,FTP.BUFFER_ADDR ;; DS:[SI] + MOV CX,FTP.BUFFER_LEN ;; CX = length of packet + MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB + MOV cs:num_ftb,DX ;; + AND DX,DX ;; + JNZ VALID_BUFFER ;; + MOV cs:fp_error,0020H ;; ERROR 0020H + JMP FP_RET ;; +VALID_BUFFER : ;; + MOV AX,FTP.FLAG ;; + AND AX,FLAG_RESTART ;; + Jnz has_RESTART ;; + JMP NO_RESTART ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +has_restart : ;; + PUSH BX ;; reset all the output fields + ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK + XOR AX,AX ;; + ;; + MOV cs:ftag_count,AX ;; + MOV cs:fptr_low,AX ;; + MOV cs:fptr_high,AX ;; + MOV cs:pre_font_len,AX ;; + MOV cs:count_lo,AX ;; + MOV cs:count_hi,AX ;; + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,AX ;; + MOV cs:hit_flag,AX ;; + MOV cs:pass_cnt,AX ;; + MOV cs:pass_postx,STAGE_MAX ;; + ;; + MOV cs:stage,STAGE_MAX ;; + ;; +RESET_FTB : ;; + MOV FTP.FTB_STATUS,FSTAT_SEARCH + MOV FTP.FTB_TYPE,AX ;; + MOV FTP.FTB_MOD,AX ;; + MOV FTP.FTB_FONTS,AX ;; + MOV FTP.FTB_ROWS,AL ;; + MOV FTP.FTB_COLS,AL ;; + MOV FTP.FTB_X,AL ;; + MOV FTP.FTB_Y,AL ;; + MOV FTP.FTB_COUNT,AX ;; + MOV FTP.FTB_DLEFT,AX ;; + MOV FTP.FTB_DLEN,AX ;; + MOV FTP.FTB_DALO,AX ;; + MOV FTP.FTB_DAHI,AX ;; + MOV FTP.TARGET_LO,AX ;; + MOV FTP.TARGET_HI,AX ;; + ;; + ADD BX, TYPE FTBLK ;; + ;; + DEC DX ;; + AND DX,DX ;; + JNZ RESET_FTB ;; + ;; + POP BX ;; +NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; any FTBLKs have their data all + ;; returned ? if so set their status + ;; from FOUND to COMPLETE + PUSH BX ;; + ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK + ;; + MOV DX,cs:num_ftb ;; + ;; +SET_COMPLETE : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_FONT ;; + JNE SET_NEXT ;; + ;; + MOV AX,FTP.FTB_DLEFT ;; + AND AX,AX ;; + JNZ SET_NEXT ;; + ;; + MOV FTP.FTB_STATUS,FSTAT_COMPLETE + ;; +SET_NEXT : ;; + ;; + ADD BX,TYPE FTBLK ;; + ;; + DEC DX ;; + AND DX,DX ;; + JNZ SET_COMPLETE ;; + ;; + POP BX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK + ;; + PUSH CX ;; STACK 1 = CX +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; DO WHILE CX is not zero : +;; +;; -- on each loop, the CX, COUNTs are updated +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +FTB_LOOP : ;; + POP AX ;; STACK -1 + SUB AX,CX ;; + ADD cs:count_lo,AX ;; + JNC NO_CARRY ;; + ADD cs:count_hi,1000H ;; +NO_CARRY : ;; + PUSH CX ;; STACK 1 = CX + AND CX,CX ;; + JNZ FTB_CONT ;; + JMP FTB_LPEND ;; + ;; DO CASES : +FTB_CONT : ;; ========== + ;; + MOV AX,cs:stage ;; + ;; + CMP AX,STAGE_MAX ;; + JNE FTB_010 ;; + JMP START_CASE ;; ** RESTART ** + ;; +FTB_010 : ;; + CMP AX,MATCHX ;; + JAE FTB_020 ;; + JMP SEARCH_CASE ;; ** SEARCH ** + ;; +FTB_020 : ;; + CMP AX,MATCHX ;; + JNE FTB_030 ;; + JMP MATCH_CASE ;; ** MATCH ** + ;; +FTB_030 : ;; + CMP AX,SCANX ;; + JNE FTB_040 ;; + JMP SCAN_CASE ;; ** SCAN ** + ;; +FTB_040 : ;; + CMP AX,FOUNDX ;; + JAE FTB_050 ;; + JMP PRE_FOUND_CASE ;; ** PRE-FOUND ** + ;; +FTB_050 : ;; + CMP AX,FOUNDX ;; + JNE FTB_060 ;; + JMP FOUND_CASE ;; ** FOUND ** + ;; +FTB_060 : ;; + CMP AX,GET_FX ;; + JNE FTB_070 ;; + JMP GETFONT_CASE ;; ** GET_FONT ** + ;; +FTB_070 : ;; + CMP AX,PASSX ;; + JNE FTB_080 ;; + JMP PASS ;; ** PASS ** + ;; +FTB_080 : ;; + CMP AX,FPTR_SKIPX ;; + JAE FTB_090 ;; + JMP SEARCH_CASE ;; ** SEARCH ** + ;; +FTB_090 : ;; + CMP AX,FPTR_SKIPX ;; + JNE FTB_FFF ;; + JMP FPTR_SKIP_CASE ;; ** SEARCH ** + ;; +FTB_FFF : ;; + MOV FTP.FTB_STATUS,STAT_DEVERR + JMP FTB_LPEND ;; ** DEVICE ERROR ** + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; at the entry of each STAGES /CASES +;; +;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer +;; -- CX remaining packet length +;; -- ES:[BX] points to the first FTBLK +;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +;============================================================================ +START_CASE : ;; pass the FILE leading bytes + ;; + MOV cs:ftag_count,0 ;; + MOV cs:stage,ftagx ;; + JMP FTB_LOOP ;; + ;; +;============================================================================= +FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by + ;; POINTER (in FPTR) is reached. + ;; + ;; ************** + MOV AX,cs:fptr_low ;; * HIT = FPTR * + MOV cs:hit_lo,AX ;; ************** + MOV DX,cs:fptr_high ;; + MOV cs:hit_hi,DX ;; + ;; + CMP AX,0FFFFH ;; + JNE FPTR_SKIP_VALID ;; + CMP DX,0FFFFH ;; + JNE FPTR_SKIP_VALID ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK + JMP FPTR_SKIP_MORE ;; + ;; +FPTR_SKIP_VALID : ;; + ;; normalised HIT_HI, HIT_LO + MOV AX,DX ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DX,0F000H ;; + ADD AX,cs:hit_lo ;; + JNC NO_CARRY10 ;; + ADD DX,01000H ;; +NO_CARRY10: ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,DX ;; + ;; ************************** + ;; * compare FPTR and COUNT * + ;; ************************** + ;; DX:AX = HIT_HI:HIT_LO (normalised) + ;; + SUB AX,cs:count_lo ;; + Jnc more_fptrlo ;; + sub dx,01000h ;; + jc fptr_bad ;; + ;; +more_fptrlo : ;; + SUB DX,cs:count_hi ;; + JC fptr_BAD ;; + ;; + INC AX ;; COUNT can be at the HIT, then AX=0 + JNC NO_CARRY11 ;; INC AX to make AX comparable to CX + ADD DX,01000H ;; i.e. AX = offset + 1 + ;; +NO_CARRY11: ;; + CMP AX,CX ;; + JA fptr_skip_more ;; AX > CX, whole CX to be skipped + ;; + PUSH DX ;; normalise dx:ax + AND DX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL DX,CL ;; + POP CX ;; + ADD AX,DX ;; + POP DX ;; + JNC NO_CARRY13 ;; + ADD DX,01000H ;; +NO_CARRY13: ;; + AND DX,0F000H ;; + ;; + PUSH AX ;; + PUSH DX ;; STACK +1 : normalosed DX:AX + SUB AX,CX ;; + JNC NO_BORROW11 ;; + SUB DX,1000H ;; + JC fptr_MORE_CXp ;; dx:ax < cx +NO_BORROW11: ;; + ;; dx:ax >= cx + AND AX,AX ;; + JNE fptr_skip_MOREP ;; + AND DX,DX ;; + JNE fptr_skip_MOREP ;; + ;; dx:ax = cx, or + ;; offset + 1 = CX + ;; + ;; ************************************ + ;; * POINTER is within the current CX * + ;; ************************************ +fptr_MORE_CXP : ;; + POP DX ;; + POP AX ;; STACK -1 + ;; +fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1 + DEC AX ;; = offset : 0 and above + SUB CX,AX ;; + ADD SI,AX ;; where the first byte is + ;; + MOV cs:stage,entry_lox ;; ENTRIES in the font file + ;; + JMP FTB_LOOP ;; ****** RETURN ******* + ;; + ;; *********************************** + ;; * more to skip ==> FPTR_SKIP_CASE * + ;; *********************************** +fptr_skip_morep: ;; + POP DX ;; + POP AX ;; STACK -1 + ;; +fptr_skip_more : ;; + ADD SI,CX ;; + SUB CX,CX ;; + JMP FTB_LOOP ;; ****** RETURN ***** + ;; + ;; *********************************** + ;; * bad POINTER in font file header * + ;; *********************************** + ;; +fptr_bad : ;; + MOV cs:fptr_low,0FFFFH ;; + MOV cs:fptr_high,0FFFFH ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK + ;; + JMP FPTR_SKIP_MORE ;; + ;; +;============================================================================= +SEARCH_CASE : ;; + ;; still looking for header to match + ;; the input : codepage and typeid + ;; + MOV DI,cs:stage ;; + ;; + ADD DI,DI ;; double to index to WORD-offset + ;; + JMP CS:STAGE_CASES[DI] ;; call routine to process the stage + ;; + ;; +;=========================================================================== +MATCH_CASE : ;; + ;; + PUSH BX ;; + MOV DX,cs:num_ftb ;; + ;; + ;; +MATCH_LOOP : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_SEARCH ;; + JE MATCH_SEARCH ;; + JMP MATCH_NEXT ;; + ;; +MATCH_SEARCH : ;; + MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status + CMP AX,cs:cpg_word ;; + JNE MATCH_MORE ;; + PUSH DS ;; code page matched + PUSH SI ;; + PUSH CX ;; + ;; + PUSH CS ;; + POP DS ;; + MOV SI,OFFSET TYPE_ID ;; + LEA DI,[BX].FTB_TID ;; + MOV CX,8 ;; + REPE CMPSB ;; + ;; + POP CX ;; + POP SI ;; + POP DS ;; + ;; + JNE MATCH_MORE ;; + ;; MATCH !!!!! (type_id matched) + MOV FTP.FTB_STATUS,FSTAT_MATCH + MOV AX,cs:type_word ;; + MOV FTP.FTB_TYPE,AX ;; + MOV AX,cs:font_low ;; + MOV FTP.TARGET_LO,AX ;; + MOV AX,cs:font_high ;; + MOV FTP.TARGET_HI,AX ;; + ;; + JMP MATCH_NEXT ;; + ;; +MATCH_MORE : ;; if this is the last rounf ? + ;; + MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more + CMP AX,-1 ;; header to come. + JNE MATCH_NEXT ;; + ;; + MOV AX,cs:next_high ;; + CMP AX,-1 ;; + JNE MATCH_NEXT ;; + ;; + MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match + ;; +MATCH_NEXT : ;; + ADD BX,FTP.FTB_LENGTH ;; + DEC DX ;; + AND DX,DX ;; + JZ MATCH_ALL ;; + JMP MATCH_LOOP ;; + ;; +MATCH_ALL : ;; + MOV cs:stage,SCANX ;; + ;; +MATCH_DONE : ;; + POP BX ;; + JMP FTB_LOOP ;; + ;; +;=========================================================================== +SCAN_CASE : ;; + ;; ********************************** + ;; * determine whether it the font * + ;; * data(TARGET),or the next font * + ;; * header(NEXT) that is approaching + ;; ********************************** + ;; + MOV AX,cs:next_low ;; + MOV cs:hit_lo,AX ;; + MOV AX,cs:next_high ;; + MOV cs:hit_hi,AX ;; + XOR AX,AX ;; + MOV cs:hit_flag,AX ;; + ;; + MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,cs:hit_lo ;; + JNC NO_CARRY2 ;; + ADD DI,01000H ;; +NO_CARRY2 : ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,DI ;; + ;; + MOV DX,cs:num_ftb ;; + ;; + PUSH BX ;; +SCAN_LOOP : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_MATCH ;; + JNE SCAN_NEXT ;; + ;; + ;; + MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,FTP.TARGET_LO ;; + JNC NO_CARRY1 ;; + ADD DI,01000H ;; +NO_CARRY1 : ;; DI:AX = NORMALISED TARGET + ;; + ;; ** compare the TARGET and the NEXT + ;; + CMP DI,cs:hit_hi ;; + JA SCAN_NEXT ;; + ;; + JE SCAN_EQU ;; + JMP NEAR_FONT ;; + ;; +SCAN_EQU : ;; + CMP AX,cs:hit_lo ;; + JA SCAN_NEXT ;; + JE SCAN_ERROR_CHK ;; + ;; ********************************** + ;; * the font data is approaching * + ;; ********************************** +NEAR_FONT : ;; + MOV cs:hit_flag,-1 ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,DI ;; + MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE + JMP SCAN_NEXT ;; + ;; + ;; ********************************** + ;; * the NEXT header is approaching * + ;; ********************************** +SCAN_ERROR_CHK : ;; + MOV AX,cs:hit_flag ;; + AND AX,AX ;; + JNZ SCAN_NEXT ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the + ;; same + ;; +SCAN_NEXT : ;; + DEC DX ;; + AND DX,DX ;; + JZ SCAN_DONE ;; + ;; + ADD BX,FTP.FTB_LENGTH ;; + JMP SCAN_LOOP ;; ** is there any closer font data ? + ;; + ;; ************************************ + ;; * the HIT is either font data(TARGET + ;; * or the font block (NEXT). * + ;; ************************************ +SCAN_DONE : ;; + POP BX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined + MOV AX,cs:hit_lo ;; + ;; + CMP AX,0FFFFH ;; + JNE NOT_FFFF_HIT ;; + CMP DX,0FFFFH ;; + JNE NOT_FFFF_HIT ;; + JMP SCAN_MORE ;; stage remained as SCAN, discard data + ;; +NOT_FFFF_HIT : ;; + ;; DX:AX = HIT_HI:HIT_LO (normalised) + SUB AX,cs:count_lo ;; + JNC NO_BORROW ;; + SUB DX,01000H ;; + JC SCAN_BAD ;; +NO_BORROW: ;; + SUB DX,cs:count_hi ;; + JC SCAN_BAD ;; + ;; + INC AX ;; COUNT can be at the HIT, then AX=0 + JNC NO_CARRYX ;; INC AX to make AX comparable to CX + ADD DX,01000H ;; i.e. AX = offset + 1 + ;; +NO_CARRYX : ;; + CMP AX,CX ;; + JA SCAN_MORE ;; + ;; + PUSH DX ;; + AND DX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL DX,CL ;; + POP CX ;; + ADD AX,DX ;; + POP DX ;; + JNC NO_CARRY3 ;; + ADD DX,01000H ;; +NO_CARRY3 : ;; + AND DX,0F000H ;; + ;; + ;; + PUSH AX ;; + PUSH DX ;; + SUB AX,CX ;; + JNC NO_BORROW1 ;; + SUB DX,1000H ;; + JC MORE_CXp ;; +NO_BORROW1 : ;; + ;; dx:ax >= cx + AND AX,AX ;; + JNE SCAN_MOREP ;; + AND DX,DX ;; + JNE SCAN_MOREP ;; + ;; + ;; offset + 1 = CX + ;; +MORE_CXP : ;; + POP DX ;; + POP AX ;; + ;; +MORE_CX : ;; DX = 0,to have more CX than offset+1 + DEC AX ;; = offset : 0 and above + SUB CX,AX ;; + ADD SI,AX ;; where the first byte is + MOV AX,cs:hit_flag ;; + AND AX,AX ;; + JE NEXT_REACHED ;; + ;; + MOV cs:stage,MOD_LOBX ;; font-data reached, + ;; + JMP FTB_LOOP ;; ****** RETURN ******* + ;; +NEXT_REACHED : ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,next_lolX ;; + MOV cs:pass_cnt,FILE_OFFSET ;; + ;; + ;; + JMP FTB_LOOP ;; ****** RETURN ******* + ;; + ;; *********************************** +SCAN_MOREP : ;; * scan more FTBLK for the nearest * + ;; * font data * + ;; *********************************** + POP DX ;; + POP AX ;; + ;; +SCAN_MORE : ;; + ADD SI,CX ;; + SUB CX,CX ;; + JMP FTB_LOOP ;; more SCAN stage + ;; +SCAN_BAD: ;; ************************* + MOV AX,cs:hit_flag ;; * scan is bad * + AND AX,AX ;; ************************* + JNZ BAD_BX ;; + MOV AX,-1 ;; NEXT is pointing backwards + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; no more NEXT + MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK + JMP FTB_LOOP ;; + ;; +BAD_BX : ;; + PUSH BX ;; FONT is pointing backwards + MOV BX,cs:hit_bx ;; + MOV FTP.FTB_STATUS,STAT_BADATA + POP BX ;; + JMP FTB_LOOP ;; + ;; +;=========================================================================== +PRE_FOUND_CASE : ;; + ;; extract informations from the font + ;; block until font_length is defined + ;; + MOV DI,cs:stage ;; + ;; + ADD DI,DI ;; double to index to WORD-offset + ;; + JMP CS:STAGE_CASES[DI] ;; call routine to process the stage + ;; +;=========================================================================== +FOUND_CASE : ;; + MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to + PUSH DI ;; +;=========================================================================== +FOUND_DO : ;; + ;; define informations into FTBLK of + ;; HIT_BX defined in the SCAN case + PUSH BX ;; + MOV BX,cs:hit_bx ;; + ;; FTBLK : + MOV AX,cs:mod_word ;; + MOV FTP.FTB_MOD,AX ;; + MOV AX,cs:fonts_word ;; + MOV FTP.FTB_FONTS,AX ;; + ;; + MOV AX,cs:fdlen_word ;; + MOV FTP.FTB_DLEFT,AX ;; + MOV FTP.FTB_DLEN,0 ;; + MOV FTP.FTB_DALO,0 ;; + MOV FTP.FTB_DAHI,0 ;; + ;; + MOV FTP.FTB_STATUS,FSTAT_FOUND + ;; + CMP FTP.FTB_TYPE,TYPE_DISPLAY; + JNE CHECK_PTR_TYPE ;; + CMP cs:pre_font_len,PRE_FONT_D ;; + JNE DISPLAY_BAD ;; + JMP DISPLAY_DONE ;; + ;; +CHECK_PTR_TYPE : ;; + CMP FTP.FTB_TYPE,TYPE_PRINTER; + JNE SET_STAGE ;; + CMP cs:ptr_sel_word,0 ;; + JNE PRINTER_HAS_SEL ;; + CMP cs:pre_font_len,PRE_FONT_P0;; + JNE PRINTER_BAD ;; + JMP PRINTER_DONE ;; + ;; +PRINTER_HAS_SEL : ;; + CMP cs:pre_font_len,PRE_FONT_P ;; + JNE PRINTER_BAD ;; + JMP PRINTER_DONE ;; + ;; +DISPLAY_BAD : ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. + ;; +DISPLAY_DONE : ;; + MOV AL,cs:disp_rows ;; + MOV FTP.FTB_ROWS,AL ;; + MOV AL,cs:disp_cols ;; + MOV FTP.FTB_COLS,AL ;; + MOV AL,cs:disp_x ;; + MOV FTP.FTB_X,AL ;; + MOV AL,cs:disp_y ;; + MOV FTP.FTB_Y,AL ;; + MOV AX,cs:count_word ;; + MOV FTP.FTB_COUNT,AX ;; + JMP SET_STAGE ;; + ;; +PRINTER_BAD : ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. + ;; +PRINTER_DONE : ;; + MOV AX,cs:ptr_sel_word ;; + MOV FTP.FTB_SELECT,AX ;; + MOV AX,cs:ptr_len_word ;; + MOV FTP.FTB_SELLEN,AX ;; + ;; +SET_STAGE : ;; STAGE : + MOV AX,cs:fdlen_word ;; if no font data to follow + AND AX,AX ;; + JNZ GET_FDATA ;; + MOV cs:stage,SCANX ;; then scan for next header or font + JMP FONT_RET ;; + ;; +GET_FDATA : ;; update the moving target + MOV cs:stage,GET_FX ;; + MOV AX,cs:pre_font_len ;; + ADD FTP.TARGET_LO,AX ;; + JNC FONT_RET ;; + ADD FTP.TARGET_HI,01000H ;; + ;; +FONT_RET : ;; + POP BX ;; + RET ;; + ;; +;=========================================================================== +GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font + ;; data + MOV DX,cs:num_ftb ;; + PUSH BX ;; + ;; + MOV cs:hit_hi,0 ;; temp. register + MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage + ;; + MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,cs:count_lo ;; + JNC NO_CARRY4 ;; + ADD DI,01000H ;; +NO_CARRY4 : ;; + MOV cs:count_lo,AX ;; + MOV cs:count_hi,DI ;; + ;; + ;; +GETFONT_LOOP : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_FONT ;; + JE GETFONT_CONT ;; + ;; + CMP AX,FSTAT_FOUND ;; + JE GETFONT_FOUND ;; + ;; + JMP NEXT_GETFONT ;; + ;; +GETFONT_FOUND : ;; + MOV AX,FTP.FTB_DLEFT ;; + AND AX,AX ;; + JZ NEXT_GF ;; + MOV FTP.FTB_STATUS,FSTAT_FONT; + JMP GETFONT_CONT1 ;; + ;; + ;; +GETFONT_CONT : ;; + MOV AX,FTP.FTB_DLEFT ;; + AND AX,AX ;; + JNZ GETFONT_CONT1 ;; +NEXT_GF : ;; + JMP NEXT_GETFONT ;; + ;; only on FOUND and DLEFT <> 0 +GETFONT_CONT1: ;; + MOV DI,FTP.TARGET_HI ;; normalised TARGET + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,FTP.TARGET_LO ;; + JNC NO_CARRY5 ;; + ADD DI,01000H ;; +NO_CARRY5 : ;; DI:AX = TARGET (normalised) + ;; + CMP DI,cs:count_hi ;; + JB GETFONT_BAD ;; + JNE NEXT_GETFONT ;; + CMP AX,cs:count_lo ;; + JB GETFONT_BAD ;; + JNE NEXT_GETFONT ;; + ;; + MOV FTP.FTB_DALO,SI ;; where the font data is in the packet + MOV FTP.FTB_DAHI,DS ;; + ;; + MOV AX,FTP.FTB_DLEFT ;; + CMP AX,CX ;; + JAE UPTO_CX ;; + ;; upto FDLEFT + MOV FTP.FTB_DLEFT,0 ;; + MOV FTP.FTB_DLEN,AX ;; + CMP cs:hit_hi,AX ;; + JNB NOT_HIGHER0 ;; + MOV cs:hit_hi,AX ;; +NOT_HIGHER0 : ;; + ADD FTP.TARGET_LO,AX ;; + JNC NEXT_GETFONT ;; + ADD FTP.TARGET_HI,01000H ;; + JMP NEXT_GETFONT ;; + ;; +GETFONT_BAD : ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards + JMP NEXT_GETFONT ;; + ;; +UPTO_CX : ;; + SUB AX,CX ;; + MOV FTP.FTB_DLEFT,AX ;; + MOV FTP.FTB_DLEN,CX ;; + MOV cs:hit_hi,CX ;; + ADD FTP.TARGET_LO,CX ;; + JNC NO_CARRYOVER ;; + ADD FTP.TARGET_HI,01000H ;; +NO_CARRYOVER : ;; + AND AX,AX ;; all data have been returned ? + JZ NEXT_GETFONT ;; + ;; + MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage + ;; +NEXT_GETFONT : ;; + ADD BX,FTP.FTB_LENGTH ;; + DEC DX ;; + AND DX,DX ;; + JZ GETFONT_END ;; + JMP GETFONT_LOOP ;; + ;; +GETFONT_END : ;; + MOV AX,cs:hit_hi ;; + ADD SI,AX ;; + SUB CX,AX ;; + ;; + CMP cs:hit_flag,0 ;; + Jne GETFONT_DONE ;; + MOV cs:stage,SCANX ;; no more in the GET_FONT stage + ;; + ;; +GETFONT_DONE : ;; + POP BX ;; + JMP FTB_LOOP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; STAGES -- "called by" SERACH_CASE +;; +;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer +;; -- CX remaining packet length +;; -- ES:[BX] points to the first FTBLK +;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;+++++++++++++++++++++++++++++++++ +filetag : ;; + ;; +; mov ax,ftag_len ;; + cmp cs:ftag_count,ftag_len ;; + jB valid_ftag ;; + JE FTAG_FAILED ;; + ;; + mov ftp.ftb_status,stat_deverr + mov cs:fp_error,00022H ;; ERROR 0022H + ;; +FTAG_FAILED : ;; discard all the bytes, while + ADD SI,CX ;; stage stays as FTAGX + SUB CX,CX ;; + JMP FTB_LOOP ;; **** RETURN (bytes discarded) **** + ;; +VALID_FTAG : ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + ;; + MOV DI,cs:ftag_count ;; + CMP AL,cs:ftag_pattern[DI] ;; + JE FTAG_NEXTB ;; + ;; + mov ftp.ftb_status,stat_badata + MOV ax,ftag_len ;; stays in FTAGX to consume all bytes + MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes + JMP FTB_LOOP ;; **** RETURN (FAILED !) **** + ;; +FTAG_NEXTB : ;; + INC DI ;; + MOV cs:ftag_count,DI ;; + ;; + CMP DI,ftag_len ;; + JE FTAG_DONE ;; + ;; + JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) **** + ;; +FTAG_DONE : ;; + MOV cs:pass_cnt,0 ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,fptr_lolx ;; + ;; + JMP FTB_LOOP ;; **** NEXT STAGE **** + ;; + ;;+++++++++++++++++++++++++++++++++ +fptrLOL : ;; STAGE the low byte of the low fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_fptrLO ;; + MOV cs:fptr_lol,AL ;; + MOV cs:stage,fptr_lohX ;; + JMP FTB_LOOP ;; +WORD_fptrLO : ;; + INC SI ;; + DEC CX ;; + MOV cs:fptr_low,AX ;; + MOV cs:stage,fptr_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +fptrLOH : ;; STAGE the high byte of the low fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fptr_loh,AL ;; + MOV cs:stage,fptr_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +fptrHIL : ;; STAGE the low byte of the high fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_fptrHI ;; + MOV cs:fptr_hil,AL ;; + MOV cs:stage,fptr_hihX ;; + JMP FTB_LOOP ;; +WORD_fptrHI : ;; + INC SI ;; + DEC CX ;; + MOV cs:fptr_high,AX ;; + MOV cs:stage,FPTR_SKIPX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +fptrHIH : ;; STAGE the high byte of the high fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fptr_hih,AL ;; + MOV cs:stage,FPTR_SKIPX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +ENTRYLO : ;; STAGE - ENTRY LOW BYTE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_ENTRY ;; + MOV cs:entry_lob,AL ;; + MOV cs:stage,ENTRY_HIX ;; + JMP FTB_LOOP ;; +WORD_ENTRY : ;; + INC SI ;; + DEC CX ;; + MOV cs:entry_word,AX ;; + MOV cs:stage,PASSX ;; 2 bytes to be passed + MOV cs:pass_postx,NEXT_LOLX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +ENTRYHI : ;; stage - ENTRY HIGN BYTE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:entry_hib,AL ;; + MOV cs:stage,PASSX ;; 2 bytes to be passed + MOV cs:pass_postx,NEXT_LOLX ;; + AND CX,CX ;; + JNZ ENTHI_PASS1 ;; + JMP FTB_LOOP ;; +ENTHI_PASS1 : ;; + INC SI ;; + INC cs:pass_cnt ;; + DEC CX ;; + AND CX,CX ;; + JNZ ENTHI_PASS2 ;; + JMP FTB_LOOP ;; +ENTHI_PASS2 : ;; + INC SI ;; + INC cs:pass_cnt ;; + DEC CX ;; + MOV cs:stage,NEXT_LOLX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTLOL : ;; STAGE the low byte of the low NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_NEXTLO ;; + MOV cs:next_lol,AL ;; + MOV cs:stage,NEXT_LOHX ;; + JMP FTB_LOOP ;; +WORD_NEXTLO : ;; + INC SI ;; + DEC CX ;; + MOV cs:next_low,AX ;; + MOV cs:stage,next_hilX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTLOH : ;; STAGE the high byte of the low NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:next_loh,AL ;; + MOV cs:stage,next_hilX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTHIL : ;; STAGE the low byte of the high NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_NEXTHI ;; + MOV cs:next_hil,AL ;; + MOV cs:stage,NEXT_HIHX ;; + JMP FTB_LOOP ;; +WORD_NEXTHI : ;; + INC SI ;; + DEC CX ;; + MOV cs:next_high,AX ;; + MOV cs:stage,type_lobX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTHIH : ;; STAGE the high byte of the high NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:next_hih,AL ;; + MOV cs:stage,type_lobX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +TYPELO : ;; STAGE the low byte of the TYPE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_TYPE ;; + MOV cs:type_lob,AL ;; + MOV cs:stage,type_hibX ;; + JMP FTB_LOOP ;; +WORD_TYPE : ;; + INC SI ;; + DEC CX ;; + MOV cs:type_word,AX ;; + MOV cs:stage,type_idX ;; + MOV cs:tid_cnt,0 ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +TYPEHI : ;; STAGE the high byte of the TYPE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:type_hib,AL ;; + MOV cs:stage,TYPE_IDX ;; + MOV cs:tid_cnt,0 ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +TYPEIDS : ;; STAGE the type id + CMP cs:tid_cnt,8 ;; + JNA VALID_TID ;; + MOV FTP.FTB_STATUS,STAT_DEVERR + MOV cs:fp_error,00021H ;; ERROR 0021H + ADD SI,CX ;; + SUB CX,CX ;; + JMP FTB_LOOP ;; + ;; +VALID_TID : ;; + MOV AX,8 ;; + SUB AX,cs:tid_cnt ;; + CMP CX,AX ;; + JNB TID_ALL ;; + ;; all data in FPKT are stored + PUSH ES ;; + PUSH CS ;; + POP ES ;; + ;; + MOV DI,OFFSET TYPE_ID ;; + ADD DI,cs:tid_cnt ;; + ADD cs:tid_cnt,CX ;; + REP MOVSB ;; SI is incremented accordingly + POP ES ;; + ;; + MOV CX,0 ;; STAGE remained + JMP FTB_LOOP ;; +TID_ALL : ;; + PUSH CX ;; + ;; + PUSH ES ;; + PUSH CS ;; + POP ES ;; + ;; + MOV DI,OFFSET TYPE_ID ;; + ADD DI,cs:tid_cnt ;; + MOV CX,AX ;; + REP MOVSB ;; SI is incremented accordingly + POP ES ;; + ;; + ADD cs:tid_cnt,AX ;; + POP CX ;; + SUB CX,AX ;; + ;; + MOV cs:stage,CPG_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +CPGLO : ;; STAGE the low byte of the CODE PAGE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_CPG ;; + MOV cs:cpg_lob,AL ;; + MOV cs:stage,CPG_HIBX ;; + JMP FTB_LOOP ;; +WORD_CPG : ;; + INC SI ;; + DEC CX ;; + MOV cs:cpg_word,AX ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,font_lolX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +CPGHI : ;; STAGE the high byte of the CODE PAGE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:cpg_hib,AL ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,font_lolX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTLOL : ;; STAGE the low byte of the low FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FONTLO ;; + MOV cs:font_lol,AL ;; + MOV cs:stage,FONT_LOHX ;; + JMP FTB_LOOP ;; +WORD_FONTLO : ;; + INC SI ;; + DEC CX ;; + MOV cs:font_low,AX ;; + MOV cs:stage,FONT_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTLOH : ;; STAGE the high byte of the low FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:font_loh,AL ;; + MOV cs:stage,FONT_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTHIL : ;; STAGE the low byte of the high FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FONTHI ;; + MOV cs:font_hil,AL ;; + MOV cs:stage,FONT_HIHX ;; + JMP FTB_LOOP ;; +WORD_FONTHI : ;; + INC SI ;; + DEC CX ;; + MOV cs:font_high,AX ;; +;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN + ;; anymore headers to be processed ? + MOV cs:stage,MATCHX ;; + MOV AX,cs:entry_word ;; + DEC AX ;; + MOV cs:entry_word,AX ;; + AND AX,AX ;; + JNZ CHECK_NEXT ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; as ENTRY has been consumed + JMP FTB_LOOP ;; + ;; +CHECK_NEXT : ;; + MOV AX,cs:next_low ;; + AND AX,AX ;; + JNZ MORE_HEADER ;; + MOV AX,cs:next_high ;; + AND AX,AX ;; + JNZ MORE_HEADER ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; as NEXT is nil + MOV cs:next_high,AX ;; + ;; +MORE_HEADER : ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTHIH : ;; STAGE the high byte of the high FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:font_hih,AL ;; +;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN + ;; + MOV cs:stage,MATCHX ;; + ;; anymore headers to be processed ? + MOV AX,cs:entry_word ;; + DEC AX ;; + MOV cs:entry_word,AX ;; + AND AX,AX ;; + JNZ CHECK_NEXT0 ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; as ENTRY has been consumed + JMP FTB_LOOP ;; + ;; +CHECK_NEXT0 : ;; + MOV AX,cs:next_low ;; + AND AX,AX ;; + JNZ MORE_HEADER0 ;; + MOV AX,cs:next_high ;; + AND AX,AX ;; + JNZ MORE_HEADER0 ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; as NEXT is nil + MOV cs:next_high,AX ;; + ;; +MORE_HEADER0 : ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +MODLO : ;; STAGE the low byte of the MODIFIER + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_MOD ;; + MOV MOD_LOB,AL ;; + MOV cs:stage,MOD_HIBX ;; + JMP FTB_LOOP ;; +WORD_MOD : ;; + INC SI ;; + DEC CX ;; + MOV cs:mod_word,AX ;; + MOV cs:stage,fonts_lobX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +MODHI : ;; STAGE the high byte of the MODIFIER + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:mod_hib,AL ;; + MOV cs:stage,FONTS_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTSLO : ;; STAGE the low byte of the FONTS + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FONTS ;; + MOV cs:fonts_lob,AL ;; + MOV cs:stage,FONTS_HIBX ;; + JMP FTB_LOOP ;; +WORD_FONTS : ;; + INC SI ;; + DEC CX ;; + MOV cs:fonts_word,AX ;; + MOV cs:stage,FDLEN_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTSHI : ;; STAGE the high byte of the FONTS + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fonts_hib,AL ;; + MOV cs:stage,FDLEN_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FDLENLO : ;; the low byte of the FONT-LENGTH + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FDLEN ;; + MOV cs:fdlen_lob,AL ;; + MOV cs:stage,FDLEN_HIBX ;; + JMP FTB_LOOP ;; +WORD_FDLEN : ;; + INC SI ;; + DEC CX ;; + MOV cs:pre_font_len,PRE_FONT_ND;; + MOV cs:fdlen_word,AX ;; + AND AX,AX ;; + JZ NO_DISP_PTR ;; + CMP cs:type_word,TYPE_DISPLAY ;; + JE DISPLAY_TYPE1 ;; + CMP cs:type_word,TYPE_PRINTER ;; + JE PRINTER_TYPE1 ;; + ;; +NO_DISP_PTR : ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; +DISPLAY_TYPE1 : ;; + MOV cs:stage,DISP_ROWSX ;; + JMP FTB_LOOP ;; +PRINTER_TYPE1 : ;; + MOV cs:stage,PTRSELLOX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +FDLENHI : ;; STAGE the high byte of the F-LENGTH + MOV cs:pre_font_len,PRE_FONT_ND + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fdlen_hib,AL ;; + MOV AX,cs:fdlen_word ;; + AND AX,AX ;; + JZ NO_DISP_PTR2 ;; + CMP cs:type_word,TYPE_DISPLAY ;; + JE DISPLAY_TYPE2 ;; + CMP cs:type_word,TYPE_PRINTER ;; + JE PRINTER_TYPE2 ;; +NO_DISP_PTR2: ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; +DISPLAY_TYPE2 : ;; + MOV cs:stage,DISP_ROWSX ;; + JMP FTB_LOOP ;; +PRINTER_TYPE2 : ;; + MOV cs:stage,PTRSELLOX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +DSPROWS : ;; STAGE : get the rows + XOR AX,AX ;; + MOV cs:disp_rows,AL ;; + MOV cs:disp_cols,AL ;; + MOV cs:DISP_X,AL ;; + MOV cs:disp_y,AL ;; + MOV cs:count_word,AX ;; + ;; + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV cs:disp_rows,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,disp_colsX ;; + JMP FTB_LOOP ;; +NO_DISP_FONT3 : ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +DSPCOLS : ;; STAGE : get the COLS + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV cs:disp_cols,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,DISP_XX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +DSPX : ;; STAGE : get the aspect X + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV DISP_X,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,DISP_YX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +DSPY : ;; STAGE : get the aspect Y + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV cs:disp_y,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,COUNT_LOBX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +DSPCOUNTLO : ;; the low byte of the FONT-LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + PUSH AX ;; check if length is enough + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + POP AX ;; + JNZ A_WORD_COUNT ;; + JMP NO_DISP_FONT3 ;; +A_WORD_COUNT : ;; + AND CX,CX ;; + JNZ WORD_COUNT ;; + MOV cs:count_lob,AL ;; + MOV cs:stage,COUNT_HIBX ;; + JMP FTB_LOOP ;; +WORD_COUNT : ;; + INC cs:pre_font_len ;; + INC SI ;; + DEC CX ;; + MOV cs:count_word,AX ;; +; MOV cs:pre_font_len,PRE_FONT_D; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:count_hib,AL ;; +; MOV cs:pre_font_len,PRE_FONT_D; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRSELLO : ;; the low byte of the SELECTION_TYPE + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + PUSH AX ;; check if length is enough + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + POP AX ;; + JNZ A_WORD_SEL ;; + JMP NO_PTR_FONT3 ;; +A_WORD_SEL : ;; + AND CX,CX ;; + JNZ WORD_SEL ;; + MOV cs:ptr_selob,AL ;; + MOV cs:stage,PTRSELHIX ;; + JMP FTB_LOOP ;; +WORD_SEL : ;; + INC cs:pre_font_len ;; + INC SI ;; + DEC CX ;; + MOV cs:ptr_sel_word,AX ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + ;; + CMP cs:ptr_sel_word,0 ;; + JNE PTR_SEL_NOT0 ;; + ;; + ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; +PTR_SEL_NOT0 : ;; + MOV cs:stage,PTRLENLOX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRSELHI: ;; STAGE the high byte of SELECT_TYPE + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:ptr_sehib,AL ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + ;; + CMP cs:ptr_sel_word,0 ;; + JNE PTR_SEL_NOT0 ;; + ;; + ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRLENLO : ;; the low byte of SELECTION_LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + PUSH AX ;; check if length is enough + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + POP AX ;; + JNZ A_WORD_SELEN ;; + JMP NO_PTR_FONT3 ;; +A_WORD_SELEN : ;; + AND CX,CX ;; + JNZ WORD_SELEN ;; + MOV cs:ptr_lnlob,AL ;; + MOV cs:stage,PTRLENHIX ;; + JMP FTB_LOOP ;; +WORD_SELEN : ;; + INC cs:pre_font_len ;; + INC SI ;; + DEC CX ;; + MOV cs:ptr_len_word,AX ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:ptr_lnhib,AL ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; +NO_PTR_FONT3 : ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +PASS : ;; STAGE - PASS DUMMY BYTES + ;; + PUSH DX ;; + PUSH ES ;; + PUSH DI ;; + ;; + PUSH CS ;; + POP ES ;; + MOV DI,OFFSET PASS_BRK ;; + MOV DX,PASS_INDX ;; + MOV AX,cs:pass_cnt ;; + ;; +NEXT_BRK: ;; find the next pass-break + CMP AX,ES:[DI] ;; + ;; + JB UPTO_BRK ;; + ;; + DEC DX ;; + JZ PASS_ERR ;; + INC DI ;; + INC DI ;; + JMP NEXT_BRK ;; + ;; +UPTO_BRK : ;; next break point found + MOV DX,ES:[DI] ;; + SUB DX,AX ;; bytes to be skipped + CMP CX,DX ;; all to be skipped ? + JAE PASS_ALL ;; + ;; + ADD cs:pass_cnt,CX ;; + ADD SI,CX ;; + SUB CX,CX ;; + JMP PASS_END ;; + ;; +PASS_ALL : ;; + ADD cs:pass_cnt,DX ;; + ADD SI,DX ;; + SUB CX,DX ;; + ;; + MOV AX,cs:pass_postx ;; + MOV cs:stage,AX ;; + ;; +; cmp ax,passx ;; is the next stage a pass-stage ? +; jne not_passx ;; +; mov ax,pass_postxx ;; +; mov pass_postx,ax ;; +; mov pass_postxx,stage_max ;; can support only 2 consecutive pass + ;; +;not_passx : ;; + ;; + JMP PASS_END ;; + ;; +PASS_ERR : ;; DEVICE ERROR, wrong stage + POP DI ;; + POP ES ;; + POP DX ;; + MOV FTP.FTB_STATUS,STAT_DEVERR + SUB CX,CX ;; ignore all the input string + JMP PASS_DONE ;; + ;; +PASS_END : ;; + POP DI ;; + POP ES ;; + POP DX ;; +PASS_DONE : ;; + JMP FTB_LOOP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +FTB_LPEND : ;; + ;; + CMP cs:stage,FOUNDX ;; + JNE NOT_FOUNDX ;; + ;; + CALL FOUND_DO ;; + ;; +NOT_FOUNDX : ;; + ;; + POP CX ;; STACK -1 + ;; +FP_RET : ;; + POP SI ;; restore registers + POP DI ;; + POP DX ;; + POP CX ;; + POP BX ;; + POP AX ;; + POP ES ;; + POP DS ;; + ;; + RET ;; +FONT_PARSER ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CSEG ENDS + END diff --git a/v4.0/src/DEV/PRINTER/CPSFONT3.ASM b/v4.0/src/DEV/PRINTER/CPSFONT3.ASM new file mode 100644 index 0000000..74fa12b --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSFONT3.ASM @@ -0,0 +1,1961 @@ + + PAGE ,132 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Device Driver -- Font Parser +;; MODULE NAME: CPSFONT +;; TYPE: Font Parser Module +;; LINK PROCEDURE: Link CPS+CPSSUB+CPSINT9+...+CPSINIT into .EXE format +;; CPS must be first. CPSINIT must be last. Everything +;; before CPSINIT will be resident. +;; INCLUDE FILES: +;; CPSPEQU.INC +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INCLUDE CPSPEQU.INC ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +CSEG SEGMENT PUBLIC 'CODE' ;; + ASSUME CS:CSEG ;; + ASSUME DS:NOTHING ;; + ;; +PUBLIC FTABLE,FONT_PARSER ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ************************************ +;; ** ** +;; ** Resident Code ** +;; ** ** +;; ************************************ +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FONT_PARSER data +;; +;; -- Interface table : FTABLE +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing +FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries +FTB2 FTBLK <,,,,,,,,,,,,> ;; +FTB3 FTBLK <,,,,,,,,,,,,> ;; +FTB4 FTBLK <,,,,,,,,,,,,> ;; +FTB5 FTBLK <,,,,,,,,,,,,> ;; +FTB6 FTBLK <,,,,,,,,,,,,> ;; +FTB7 FTBLK <,,,,,,,,,,,,> ;; +FTB8 FTBLK <,,,,,,,,,,,,> ;; +FTB9 FTBLK <,,,,,,,,,,,,> ;; +FTBa FTBLK <,,,,,,,,,,,,> ;; +FTBb FTBLK <,,,,,,,,,,,,> ;; +FTBc FTBLK <,,,,,,,,,,,,> ;; + ;; +FP_ERROR DW 0000H ;; internal error register + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the followings are bytes accumulated + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FTAG_LEN EQU 8 ;; FILE TAGE in the font file header +FTAG_COUNT DW 0000H ;; + ;; +FTAG_PATTERN LABEL BYTE ;; + DB 0FFH ;; + DB 'FONT ' ;; + ;; + ;; + ;; POINTER in the font file header +fptr_LOW LABEL WORD ;; +fptr_LOL DB 00H ;; NEXT +fptr_LOH DB 00H ;; +fptr_HIGH LABEL WORD ;; +fptr_HIL DB 00H ;; +fptr_HIH DB 00H ;; + ;; + ;; + ;; +ENTRY_WORD LABEL WORD ;; +ENTRY_LOB DB 00H ;; ENTRY COUNT +ENTRY_HIB DB 00H ;; +NEXT_LOW LABEL WORD ;; +NEXT_LOL DB 00H ;; NEXT +NEXT_LOH DB 00H ;; +NEXT_HIGH LABEL WORD ;; +NEXT_HIL DB 00H ;; +NEXT_HIH DB 00H ;; +TYPE_WORD LABEL WORD ;; +TYPE_LOB DB 00H ;; TYPE +TYPE_HIB DB 00H ;; +TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8) +TYPE_ID : DB ' ' ;; TYPEID +CPG_WORD LABEL WORD ;; +CPG_LOB DB 00H ;; CODE PAGE +CPG_HIB DB 00H ;; +FONT_LOW LABEL WORD ;; +FONT_LOL DB 00H ;; FONT ADDRESS +FONT_LOH DB 00H ;; +FONT_HIGH LABEL WORD ;; +FONT_HIL DB 00H ;; +FONT_HIH DB 00H ;; +;; the followings are contained in the font-block in the exact order & length +MOD_WORD LABEL WORD ;; +MOD_LOB DB 00H ;; MODIFIER +MOD_HIB DB 00H ;; +FONTS_WORD LABEL WORD ;; +FONTS_LOB DB 00H ;; FONTS +FONTS_HIB DB 00H ;; +FDLEN_WORD LABEL WORD ;; +FDLEN_LOB DB 00H ;; FONT DATA LENGTH +FDLEN_HIB DB 00H ;; +PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data + ;; to follow. -- for NON-DISPLAY +DISP_ROWS DB 00H ;; DISPLAY's parameters : +DISP_COLS DB 00H ;; BOX SIZE +DISP_X DB 00H ;; ASPECT RATIO +DISP_Y DB 00H ;; +COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS +COUNT_LOB DB 00H ;; +COUNT_HIB DB 00H ;; +PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data + ;; to follow. -- for DISPLAY + ;; +PTR_SEL_WORD LABEL WORD ;; +PTR_SELOB DB 00H ;; +PTR_SEHIB DB 00H ;; +PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data + ;; to follow -- for PRINTER with + ;; selection type = 0. + ;; +PTR_LEN_WORD LABEL WORD ;; +PTR_LNLOB DB 00H ;; +PTR_LNHIB DB 00H ;; +PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data + ;; to follow -- for PRINTER with + ;; selection type <> 0. + ;; + ;; +;; also update STAGE_CASES and indexing constants + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the stage the parsing is in : ;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +STAGE_CASES LABEL WORD ;; the stage the parsing is in : + ;; + ;; *** INDEXED BY STAGE-INDEX + ;; + DW OFFSET ENTRYLO ;; 0 + DW OFFSET ENTRYHI ;; 1 + DW OFFSET NEXTLOL ;; 2 + DW OFFSET NEXTLOH ;; 3 + DW OFFSET NEXTHIL ;; 4 + DW OFFSET NEXTHIH ;; 5 + DW OFFSET TYPELO ;; 6 + DW OFFSET TYPEHI ;; 7 + DW OFFSET TYPEIDS ;; 8 + DW OFFSET CPGLO ;; 9 + DW OFFSET CPGHI ;; A + DW OFFSET FONTLOL ;; B + DW OFFSET FONTLOH ;; C + DW OFFSET FONTHIL ;; D + DW OFFSET FONTHIH ;; E + DW 00H ;; MATCH case -- end of SEARCH stages + DW 00H ;; SCAN case -- before PRE-FOUND stage + DW OFFSET MODLO ;; 11 + DW OFFSET MODHI ;; 12 + DW OFFSET FONTSLO ;; 13 + DW OFFSET FONTSHI ;; 14 + DW OFFSET FDLENLO ;; 15 + DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY + DW OFFSET DSPROWS ;; 17 -- DISPLAY only + DW OFFSET DSPCOLS ;; 18 + DW OFFSET DSPX ;; 19 + DW OFFSET DSPY ;; 1A + DW OFFSET DSPCOUNTLO ;; 1B + DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY + DW OFFSET PTRSELLO ;; 1D -- PRINTER only + DW OFFSET PTRSELHI ;; 1E + DW OFFSET PTRLENLO ;; 1F + DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER + DW 00H ;; FOUND case + DW 00H ;; GET_FONT case + DW 00H ;; PASS special stage + DW OFFSET FILETAG ;; 24 + DW OFFSET fptrLOL ;; 25 + DW OFFSET fptrLOH ;; 26 + DW OFFSET fptrHIL ;; 27 + DW OFFSET fptrHIH ;; 28 + DW 00H ;; FPTR_SKIP_CASE + ;; + ;; The followings are individual stage +STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages + ;; + ;; STAGE-INDEX + ;; + ;; **** INDEX TO STAGE_CASES **** +ENTRY_LOX EQU 00H ;; +ENTRY_HIX EQU 01H ;; +NEXT_LOLX EQU 02H ;; NEXT +NEXT_LOHX EQU 03H ;; +NEXT_HILX EQU 04H ;; +NEXT_HIHX EQU 05H ;; +TYPE_LOBX EQU 06H ;; TYPE +TYPE_HIBX EQU 07H ;; +TYPE_IDX EQU 08H ;; TYPEID +CPG_LOBX EQU 09H ;; CODE PAGE +CPG_HIBX EQU 0AH ;; +FONT_LOLX EQU 0BH ;; FONT ADDRESS +FONT_LOHX EQU 0CH ;; +FONT_HILX EQU 0DH ;; +FONT_HIHX EQU 0EH ;; + ;; ------------------------------ +MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages +SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages + ;; ------------------------------ +MOD_LOBX EQU 11H ;; MODIFIER +MOD_HIBX EQU 12H ;; +FONTS_LOBX EQU 13H ;; FONTS +FONTS_HIBX EQU 14H ;; +FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH +FDLEN_HIBX EQU 16H ;; +DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE +DISP_COLSX EQU 18H ;; +DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO +DISP_YX EQU 1AH ;; +COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT +COUNT_HIBX EQU 1CH ;; +PTRSELLOX EQU 1DH ;; +PTRSELHIX EQU 1EH ;; +PTRLENLOX EQU 1FH ;; +PTRLENHIX EQU 20H ;; + ;; + ;; ------------------------------ +FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage +GET_FX EQU 22H ;; + ;; ------------------------------ +PASSX EQU 23H ;; see pass_brk table + ;; ------------------------------ +FTAGX EQU 24H ;; RESTART ==> FILE TAG + ;; +fptr_LOLX EQU 25H ;; POINTER in font file header +fptr_LOHX EQU 26H ;; +fptr_HILX EQU 27H ;; +fptr_HIHX EQU 28H ;; --------------------------------- + ;; +fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; PASS -- to skip some bytes ;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the PASS mechanism is used to skip + ;; a number of bytes between two fields + ;; The numbers are tabulated in + ;; PASS_BRK table in the accumulative + ;; sum. The PASS_POSTX(and PASS_POSTXX) + ;; are used to tell what is the stage + ;; after all the bytes have skipped. + ;; +PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage + ;; +FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file : + ;; ( after TAG, before POINTER) + ;; +PASS_CNT DW 0 ;; +PASS_BRK LABEL WORD ;; + DW FILE_OFFSET ;; skip in the font file header + DW FILE_OFFSET+2 ;; pass header-length, needs to reset + ;; PASS_CNT for each of the font_header + DW FILE_OFFSET+8 ;; pass header-reserved bytes +PASS_INDX EQU ($-PASS_BRK)/2 ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; the control variables : ;;;;;;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STAGE DW STAGE_MAX ;; of the STAGE-INDEX + ;; +Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA + ;; + ;; +COUNT_LO DW 00000H ;; no. of bytes parsed so far +COUNT_hI DW 00000H ;; + ;; +HIT_LO DW 00000H ;; the next byte that is addressed by : +HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK. + ;; +HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching +HIT_BX DW 00000H ;; where FTB is found for nearest hit + ;; +NUM_FTB DW 00000H ;; as defined in the FP_BUFFER + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FONT_PARSER routine +;; +;; -- to be called at every packet received to extract informations +;; from Font File on byte basis. +;; +;; -- Interface though FTABLE +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +FONT_PARSER PROC ;; + 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 + LEA BX,FTABLE ;; + PUSH CS ;; + POP ES ;; ES:[BX] + LDS SI,FTP.BUFFER_ADDR ;; DS:[SI] + MOV CX,FTP.BUFFER_LEN ;; CX = length of packet + MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB + MOV cs:num_ftb,DX ;; + AND DX,DX ;; + JNZ VALID_BUFFER ;; + MOV cs:fp_error,0020H ;; ERROR 0020H + JMP FP_RET ;; +VALID_BUFFER : ;; + MOV AX,FTP.FLAG ;; + AND AX,FLAG_RESTART ;; + Jnz has_RESTART ;; + JMP NO_RESTART ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +has_restart : ;; + PUSH BX ;; reset all the output fields + ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK + XOR AX,AX ;; + ;; + MOV cs:ftag_count,AX ;; + MOV cs:fptr_low,AX ;; + MOV cs:fptr_high,AX ;; + MOV cs:pre_font_len,AX ;; + MOV cs:count_lo,AX ;; + MOV cs:count_hi,AX ;; + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,AX ;; + MOV cs:hit_flag,AX ;; + MOV cs:pass_cnt,AX ;; + MOV cs:pass_postx,STAGE_MAX ;; + ;; + MOV cs:stage,STAGE_MAX ;; + ;; +RESET_FTB : ;; + MOV FTP.FTB_STATUS,FSTAT_SEARCH + MOV FTP.FTB_TYPE,AX ;; + MOV FTP.FTB_MOD,AX ;; + MOV FTP.FTB_FONTS,AX ;; + MOV FTP.FTB_ROWS,AL ;; + MOV FTP.FTB_COLS,AL ;; + MOV FTP.FTB_X,AL ;; + MOV FTP.FTB_Y,AL ;; + MOV FTP.FTB_COUNT,AX ;; + MOV FTP.FTB_DLEFT,AX ;; + MOV FTP.FTB_DLEN,AX ;; + MOV FTP.FTB_DALO,AX ;; + MOV FTP.FTB_DAHI,AX ;; + MOV FTP.TARGET_LO,AX ;; + MOV FTP.TARGET_HI,AX ;; + ;; + ADD BX, TYPE FTBLK ;; + ;; + DEC DX ;; + AND DX,DX ;; + JNZ RESET_FTB ;; + ;; + POP BX ;; +NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; any FTBLKs have their data all + ;; returned ? if so set their status + ;; from FOUND to COMPLETE + PUSH BX ;; + ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK + ;; + MOV DX,cs:num_ftb ;; + ;; +SET_COMPLETE : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_FONT ;; + JNE SET_NEXT ;; + ;; + MOV AX,FTP.FTB_DLEFT ;; + AND AX,AX ;; + JNZ SET_NEXT ;; + ;; + MOV FTP.FTB_STATUS,FSTAT_COMPLETE + ;; +SET_NEXT : ;; + ;; + ADD BX,TYPE FTBLK ;; + ;; + DEC DX ;; + AND DX,DX ;; + JNZ SET_COMPLETE ;; + ;; + POP BX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK + ;; + PUSH CX ;; STACK 1 = CX +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; DO WHILE CX is not zero : +;; +;; -- on each loop, the CX, COUNTs are updated +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +FTB_LOOP : ;; + POP AX ;; STACK -1 + SUB AX,CX ;; + ADD cs:count_lo,AX ;; + JNC NO_CARRY ;; + ADD cs:count_hi,1000H ;; +NO_CARRY : ;; + PUSH CX ;; STACK 1 = CX + AND CX,CX ;; + JNZ FTB_CONT ;; + JMP FTB_LPEND ;; + ;; DO CASES : +FTB_CONT : ;; ========== + ;; + MOV AX,cs:stage ;; + ;; + CMP AX,STAGE_MAX ;; + JNE FTB_010 ;; + JMP START_CASE ;; ** RESTART ** + ;; +FTB_010 : ;; + CMP AX,MATCHX ;; + JAE FTB_020 ;; + JMP SEARCH_CASE ;; ** SEARCH ** + ;; +FTB_020 : ;; + CMP AX,MATCHX ;; + JNE FTB_030 ;; + JMP MATCH_CASE ;; ** MATCH ** + ;; +FTB_030 : ;; + CMP AX,SCANX ;; + JNE FTB_040 ;; + JMP SCAN_CASE ;; ** SCAN ** + ;; +FTB_040 : ;; + CMP AX,FOUNDX ;; + JAE FTB_050 ;; + JMP PRE_FOUND_CASE ;; ** PRE-FOUND ** + ;; +FTB_050 : ;; + CMP AX,FOUNDX ;; + JNE FTB_060 ;; + JMP FOUND_CASE ;; ** FOUND ** + ;; +FTB_060 : ;; + CMP AX,GET_FX ;; + JNE FTB_070 ;; + JMP GETFONT_CASE ;; ** GET_FONT ** + ;; +FTB_070 : ;; + CMP AX,PASSX ;; + JNE FTB_080 ;; + JMP PASS ;; ** PASS ** + ;; +FTB_080 : ;; + CMP AX,FPTR_SKIPX ;; + JAE FTB_090 ;; + JMP SEARCH_CASE ;; ** SEARCH ** + ;; +FTB_090 : ;; + CMP AX,FPTR_SKIPX ;; + JNE FTB_FFF ;; + JMP FPTR_SKIP_CASE ;; ** SEARCH ** + ;; +FTB_FFF : ;; + MOV FTP.FTB_STATUS,STAT_DEVERR + JMP FTB_LPEND ;; ** DEVICE ERROR ** + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; at the entry of each STAGES /CASES +;; +;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer +;; -- CX remaining packet length +;; -- ES:[BX] points to the first FTBLK +;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +;============================================================================ +START_CASE : ;; pass the FILE leading bytes + ;; + MOV cs:ftag_count,0 ;; + MOV cs:stage,ftagx ;; + JMP FTB_LOOP ;; + ;; +;============================================================================= +FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by + ;; POINTER (in FPTR) is reached. + ;; + ;; ************** + MOV AX,cs:fptr_low ;; * HIT = FPTR * + MOV cs:hit_lo,AX ;; ************** + MOV DX,cs:fptr_high ;; + MOV cs:hit_hi,DX ;; + ;; + CMP AX,0FFFFH ;; + JNE FPTR_SKIP_VALID ;; + CMP DX,0FFFFH ;; + JNE FPTR_SKIP_VALID ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK + JMP FPTR_SKIP_MORE ;; + ;; +FPTR_SKIP_VALID : ;; + ;; normalised HIT_HI, HIT_LO + MOV AX,DX ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DX,0F000H ;; + ADD AX,cs:hit_lo ;; + JNC NO_CARRY10 ;; + ADD DX,01000H ;; +NO_CARRY10: ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,DX ;; + ;; ************************** + ;; * compare FPTR and COUNT * + ;; ************************** + ;; DX:AX = HIT_HI:HIT_LO (normalised) + ;; + SUB AX,cs:count_lo ;; + Jnc more_fptrlo ;; + sub dx,01000h ;; + jc fptr_bad ;; + ;; +more_fptrlo : ;; + SUB DX,cs:count_hi ;; + JC fptr_BAD ;; + ;; + INC AX ;; COUNT can be at the HIT, then AX=0 + JNC NO_CARRY11 ;; INC AX to make AX comparable to CX + ADD DX,01000H ;; i.e. AX = offset + 1 + ;; +NO_CARRY11: ;; + CMP AX,CX ;; + JA fptr_skip_more ;; AX > CX, whole CX to be skipped + ;; + PUSH DX ;; normalise dx:ax + AND DX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL DX,CL ;; + POP CX ;; + ADD AX,DX ;; + POP DX ;; + JNC NO_CARRY13 ;; + ADD DX,01000H ;; +NO_CARRY13: ;; + AND DX,0F000H ;; + ;; + PUSH AX ;; + PUSH DX ;; STACK +1 : normalosed DX:AX + SUB AX,CX ;; + JNC NO_BORROW11 ;; + SUB DX,1000H ;; + JC fptr_MORE_CXp ;; dx:ax < cx +NO_BORROW11: ;; + ;; dx:ax >= cx + AND AX,AX ;; + JNE fptr_skip_MOREP ;; + AND DX,DX ;; + JNE fptr_skip_MOREP ;; + ;; dx:ax = cx, or + ;; offset + 1 = CX + ;; + ;; ************************************ + ;; * POINTER is within the current CX * + ;; ************************************ +fptr_MORE_CXP : ;; + POP DX ;; + POP AX ;; STACK -1 + ;; +fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1 + DEC AX ;; = offset : 0 and above + SUB CX,AX ;; + ADD SI,AX ;; where the first byte is + ;; + MOV cs:stage,entry_lox ;; ENTRIES in the font file + ;; + JMP FTB_LOOP ;; ****** RETURN ******* + ;; + ;; *********************************** + ;; * more to skip ==> FPTR_SKIP_CASE * + ;; *********************************** +fptr_skip_morep: ;; + POP DX ;; + POP AX ;; STACK -1 + ;; +fptr_skip_more : ;; + ADD SI,CX ;; + SUB CX,CX ;; + JMP FTB_LOOP ;; ****** RETURN ***** + ;; + ;; *********************************** + ;; * bad POINTER in font file header * + ;; *********************************** + ;; +fptr_bad : ;; + MOV cs:fptr_low,0FFFFH ;; + MOV cs:fptr_high,0FFFFH ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK + ;; + JMP FPTR_SKIP_MORE ;; + ;; +;============================================================================= +SEARCH_CASE : ;; + ;; still looking for header to match + ;; the input : codepage and typeid + ;; + MOV DI,cs:stage ;; + ;; + ADD DI,DI ;; double to index to WORD-offset + ;; + JMP CS:STAGE_CASES[DI] ;; call routine to process the stage + ;; + ;; +;=========================================================================== +MATCH_CASE : ;; + ;; + PUSH BX ;; + MOV DX,cs:num_ftb ;; + ;; + ;; +MATCH_LOOP : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_SEARCH ;; + JE MATCH_SEARCH ;; + JMP MATCH_NEXT ;; + ;; +MATCH_SEARCH : ;; + MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status + CMP AX,cs:cpg_word ;; + JNE MATCH_MORE ;; + PUSH DS ;; code page matched + PUSH SI ;; + PUSH CX ;; + ;; + PUSH CS ;; + POP DS ;; + MOV SI,OFFSET TYPE_ID ;; + LEA DI,[BX].FTB_TID ;; + MOV CX,8 ;; + REPE CMPSB ;; + ;; + POP CX ;; + POP SI ;; + POP DS ;; + ;; + JNE MATCH_MORE ;; + ;; MATCH !!!!! (type_id matched) + MOV FTP.FTB_STATUS,FSTAT_MATCH + MOV AX,cs:type_word ;; + MOV FTP.FTB_TYPE,AX ;; + MOV AX,cs:font_low ;; + MOV FTP.TARGET_LO,AX ;; + MOV AX,cs:font_high ;; + MOV FTP.TARGET_HI,AX ;; + ;; + JMP MATCH_NEXT ;; + ;; +MATCH_MORE : ;; if this is the last rounf ? + ;; + MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more + CMP AX,-1 ;; header to come. + JNE MATCH_NEXT ;; + ;; + MOV AX,cs:next_high ;; + CMP AX,-1 ;; + JNE MATCH_NEXT ;; + ;; + MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match + ;; +MATCH_NEXT : ;; + ADD BX,FTP.FTB_LENGTH ;; + DEC DX ;; + AND DX,DX ;; + JZ MATCH_ALL ;; + JMP MATCH_LOOP ;; + ;; +MATCH_ALL : ;; + MOV cs:stage,SCANX ;; + ;; +MATCH_DONE : ;; + POP BX ;; + JMP FTB_LOOP ;; + ;; +;=========================================================================== +SCAN_CASE : ;; + ;; ********************************** + ;; * determine whether it the font * + ;; * data(TARGET),or the next font * + ;; * header(NEXT) that is approaching + ;; ********************************** + ;; + MOV AX,cs:next_low ;; + MOV cs:hit_lo,AX ;; + MOV AX,cs:next_high ;; + MOV cs:hit_hi,AX ;; + XOR AX,AX ;; + MOV cs:hit_flag,AX ;; + ;; + MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,cs:hit_lo ;; + JNC NO_CARRY2 ;; + ADD DI,01000H ;; +NO_CARRY2 : ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,DI ;; + ;; + MOV DX,cs:num_ftb ;; + ;; + PUSH BX ;; +SCAN_LOOP : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_MATCH ;; + JNE SCAN_NEXT ;; + ;; + ;; + MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,FTP.TARGET_LO ;; + JNC NO_CARRY1 ;; + ADD DI,01000H ;; +NO_CARRY1 : ;; DI:AX = NORMALISED TARGET + ;; + ;; ** compare the TARGET and the NEXT + ;; + CMP DI,cs:hit_hi ;; + JA SCAN_NEXT ;; + ;; + JE SCAN_EQU ;; + JMP NEAR_FONT ;; + ;; +SCAN_EQU : ;; + CMP AX,cs:hit_lo ;; + JA SCAN_NEXT ;; + JE SCAN_ERROR_CHK ;; + ;; ********************************** + ;; * the font data is approaching * + ;; ********************************** +NEAR_FONT : ;; + MOV cs:hit_flag,-1 ;; + MOV cs:hit_lo,AX ;; + MOV cs:hit_hi,DI ;; + MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE + JMP SCAN_NEXT ;; + ;; + ;; ********************************** + ;; * the NEXT header is approaching * + ;; ********************************** +SCAN_ERROR_CHK : ;; + MOV AX,cs:hit_flag ;; + AND AX,AX ;; + JNZ SCAN_NEXT ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the + ;; same + ;; +SCAN_NEXT : ;; + DEC DX ;; + AND DX,DX ;; + JZ SCAN_DONE ;; + ;; + ADD BX,FTP.FTB_LENGTH ;; + JMP SCAN_LOOP ;; ** is there any closer font data ? + ;; + ;; ************************************ + ;; * the HIT is either font data(TARGET + ;; * or the font block (NEXT). * + ;; ************************************ +SCAN_DONE : ;; + POP BX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined + MOV AX,cs:hit_lo ;; + ;; + CMP AX,0FFFFH ;; + JNE NOT_FFFF_HIT ;; + CMP DX,0FFFFH ;; + JNE NOT_FFFF_HIT ;; + JMP SCAN_MORE ;; stage remained as SCAN, discard data + ;; +NOT_FFFF_HIT : ;; + ;; DX:AX = HIT_HI:HIT_LO (normalised) + SUB AX,cs:count_lo ;; + JNC NO_BORROW ;; + SUB DX,01000H ;; + JC SCAN_BAD ;; +NO_BORROW: ;; + SUB DX,cs:count_hi ;; + JC SCAN_BAD ;; + ;; + INC AX ;; COUNT can be at the HIT, then AX=0 + JNC NO_CARRYX ;; INC AX to make AX comparable to CX + ADD DX,01000H ;; i.e. AX = offset + 1 + ;; +NO_CARRYX : ;; + CMP AX,CX ;; + JA SCAN_MORE ;; + ;; + PUSH DX ;; + AND DX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL DX,CL ;; + POP CX ;; + ADD AX,DX ;; + POP DX ;; + JNC NO_CARRY3 ;; + ADD DX,01000H ;; +NO_CARRY3 : ;; + AND DX,0F000H ;; + ;; + ;; + PUSH AX ;; + PUSH DX ;; + SUB AX,CX ;; + JNC NO_BORROW1 ;; + SUB DX,1000H ;; + JC MORE_CXp ;; +NO_BORROW1 : ;; + ;; dx:ax >= cx + AND AX,AX ;; + JNE SCAN_MOREP ;; + AND DX,DX ;; + JNE SCAN_MOREP ;; + ;; + ;; offset + 1 = CX + ;; +MORE_CXP : ;; + POP DX ;; + POP AX ;; + ;; +MORE_CX : ;; DX = 0,to have more CX than offset+1 + DEC AX ;; = offset : 0 and above + SUB CX,AX ;; + ADD SI,AX ;; where the first byte is + MOV AX,cs:hit_flag ;; + AND AX,AX ;; + JE NEXT_REACHED ;; + ;; + MOV cs:stage,MOD_LOBX ;; font-data reached, + ;; + JMP FTB_LOOP ;; ****** RETURN ******* + ;; +NEXT_REACHED : ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,next_lolX ;; + MOV cs:pass_cnt,FILE_OFFSET ;; + ;; + ;; + JMP FTB_LOOP ;; ****** RETURN ******* + ;; + ;; *********************************** +SCAN_MOREP : ;; * scan more FTBLK for the nearest * + ;; * font data * + ;; *********************************** + POP DX ;; + POP AX ;; + ;; +SCAN_MORE : ;; + ADD SI,CX ;; + SUB CX,CX ;; + JMP FTB_LOOP ;; more SCAN stage + ;; +SCAN_BAD: ;; ************************* + MOV AX,cs:hit_flag ;; * scan is bad * + AND AX,AX ;; ************************* + JNZ BAD_BX ;; + MOV AX,-1 ;; NEXT is pointing backwards + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; no more NEXT + MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK + JMP FTB_LOOP ;; + ;; +BAD_BX : ;; + PUSH BX ;; FONT is pointing backwards + MOV BX,cs:hit_bx ;; + MOV FTP.FTB_STATUS,STAT_BADATA + POP BX ;; + JMP FTB_LOOP ;; + ;; +;=========================================================================== +PRE_FOUND_CASE : ;; + ;; extract informations from the font + ;; block until font_length is defined + ;; + MOV DI,cs:stage ;; + ;; + ADD DI,DI ;; double to index to WORD-offset + ;; + JMP CS:STAGE_CASES[DI] ;; call routine to process the stage + ;; +;=========================================================================== +FOUND_CASE : ;; + MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to + PUSH DI ;; +;=========================================================================== +FOUND_DO : ;; + ;; define informations into FTBLK of + ;; HIT_BX defined in the SCAN case + PUSH BX ;; + MOV BX,cs:hit_bx ;; + ;; FTBLK : + MOV AX,cs:mod_word ;; + MOV FTP.FTB_MOD,AX ;; + MOV AX,cs:fonts_word ;; + MOV FTP.FTB_FONTS,AX ;; + ;; + MOV AX,cs:fdlen_word ;; + MOV FTP.FTB_DLEFT,AX ;; + MOV FTP.FTB_DLEN,0 ;; + MOV FTP.FTB_DALO,0 ;; + MOV FTP.FTB_DAHI,0 ;; + ;; + MOV FTP.FTB_STATUS,FSTAT_FOUND + ;; + CMP FTP.FTB_TYPE,TYPE_DISPLAY; + JNE CHECK_PTR_TYPE ;; + CMP cs:pre_font_len,PRE_FONT_D ;; + JNE DISPLAY_BAD ;; + JMP DISPLAY_DONE ;; + ;; +CHECK_PTR_TYPE : ;; + CMP FTP.FTB_TYPE,TYPE_PRINTER; + JNE SET_STAGE ;; + CMP cs:ptr_sel_word,0 ;; + JNE PRINTER_HAS_SEL ;; + CMP cs:pre_font_len,PRE_FONT_P0;; + JNE PRINTER_BAD ;; + JMP PRINTER_DONE ;; + ;; +PRINTER_HAS_SEL : ;; + CMP cs:pre_font_len,PRE_FONT_P ;; + JNE PRINTER_BAD ;; + JMP PRINTER_DONE ;; + ;; +DISPLAY_BAD : ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. + ;; +DISPLAY_DONE : ;; + MOV AL,cs:disp_rows ;; + MOV FTP.FTB_ROWS,AL ;; + MOV AL,cs:disp_cols ;; + MOV FTP.FTB_COLS,AL ;; + MOV AL,cs:disp_x ;; + MOV FTP.FTB_X,AL ;; + MOV AL,cs:disp_y ;; + MOV FTP.FTB_Y,AL ;; + MOV AX,cs:count_word ;; + MOV FTP.FTB_COUNT,AX ;; + JMP SET_STAGE ;; + ;; +PRINTER_BAD : ;; + ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0. + ;; +PRINTER_DONE : ;; + MOV AX,cs:ptr_sel_word ;; + MOV FTP.FTB_SELECT,AX ;; + MOV AX,cs:ptr_len_word ;; + MOV FTP.FTB_SELLEN,AX ;; + ;; +SET_STAGE : ;; STAGE : + MOV AX,cs:fdlen_word ;; if no font data to follow + AND AX,AX ;; + JNZ GET_FDATA ;; + MOV cs:stage,SCANX ;; then scan for next header or font + JMP FONT_RET ;; + ;; +GET_FDATA : ;; update the moving target + MOV cs:stage,GET_FX ;; + MOV AX,cs:pre_font_len ;; + ADD FTP.TARGET_LO,AX ;; + JNC FONT_RET ;; + ADD FTP.TARGET_HI,01000H ;; + ;; +FONT_RET : ;; + POP BX ;; + RET ;; + ;; +;=========================================================================== +GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font + ;; data + MOV DX,cs:num_ftb ;; + PUSH BX ;; + ;; + MOV cs:hit_hi,0 ;; temp. register + MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage + ;; + MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,cs:count_lo ;; + JNC NO_CARRY4 ;; + ADD DI,01000H ;; +NO_CARRY4 : ;; + MOV cs:count_lo,AX ;; + MOV cs:count_hi,DI ;; + ;; + ;; +GETFONT_LOOP : ;; + MOV AX,FTP.FTB_STATUS ;; + CMP AX,FSTAT_FONT ;; + JE GETFONT_CONT ;; + ;; + CMP AX,FSTAT_FOUND ;; + JE GETFONT_FOUND ;; + ;; + JMP NEXT_GETFONT ;; + ;; +GETFONT_FOUND : ;; + MOV AX,FTP.FTB_DLEFT ;; + AND AX,AX ;; + JZ NEXT_GF ;; + MOV FTP.FTB_STATUS,FSTAT_FONT; + JMP GETFONT_CONT1 ;; + ;; + ;; +GETFONT_CONT : ;; + MOV AX,FTP.FTB_DLEFT ;; + AND AX,AX ;; + JNZ GETFONT_CONT1 ;; +NEXT_GF : ;; + JMP NEXT_GETFONT ;; + ;; only on FOUND and DLEFT <> 0 +GETFONT_CONT1: ;; + MOV DI,FTP.TARGET_HI ;; normalised TARGET + MOV AX,DI ;; + AND AX,00FFFH ;; + PUSH CX ;; + MOV CX,4 ;; + SHL AX,CL ;; + POP CX ;; + AND DI,0F000H ;; + ADD AX,FTP.TARGET_LO ;; + JNC NO_CARRY5 ;; + ADD DI,01000H ;; +NO_CARRY5 : ;; DI:AX = TARGET (normalised) + ;; + CMP DI,cs:count_hi ;; + JB GETFONT_BAD ;; + JNE NEXT_GETFONT ;; + CMP AX,cs:count_lo ;; + JB GETFONT_BAD ;; + JNE NEXT_GETFONT ;; + ;; + MOV FTP.FTB_DALO,SI ;; where the font data is in the packet + MOV FTP.FTB_DAHI,DS ;; + ;; + MOV AX,FTP.FTB_DLEFT ;; + CMP AX,CX ;; + JAE UPTO_CX ;; + ;; upto FDLEFT + MOV FTP.FTB_DLEFT,0 ;; + MOV FTP.FTB_DLEN,AX ;; + CMP cs:hit_hi,AX ;; + JNB NOT_HIGHER0 ;; + MOV cs:hit_hi,AX ;; +NOT_HIGHER0 : ;; + ADD FTP.TARGET_LO,AX ;; + JNC NEXT_GETFONT ;; + ADD FTP.TARGET_HI,01000H ;; + JMP NEXT_GETFONT ;; + ;; +GETFONT_BAD : ;; + MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards + JMP NEXT_GETFONT ;; + ;; +UPTO_CX : ;; + SUB AX,CX ;; + MOV FTP.FTB_DLEFT,AX ;; + MOV FTP.FTB_DLEN,CX ;; + MOV cs:hit_hi,CX ;; + ADD FTP.TARGET_LO,CX ;; + JNC NO_CARRYOVER ;; + ADD FTP.TARGET_HI,01000H ;; +NO_CARRYOVER : ;; + AND AX,AX ;; all data have been returned ? + JZ NEXT_GETFONT ;; + ;; + MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage + ;; +NEXT_GETFONT : ;; + ADD BX,FTP.FTB_LENGTH ;; + DEC DX ;; + AND DX,DX ;; + JZ GETFONT_END ;; + JMP GETFONT_LOOP ;; + ;; +GETFONT_END : ;; + MOV AX,cs:hit_hi ;; + ADD SI,AX ;; + SUB CX,AX ;; + ;; + CMP cs:hit_flag,0 ;; + Jne GETFONT_DONE ;; + MOV cs:stage,SCANX ;; no more in the GET_FONT stage + ;; + ;; +GETFONT_DONE : ;; + POP BX ;; + JMP FTB_LOOP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; STAGES -- "called by" SERACH_CASE +;; +;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer +;; -- CX remaining packet length +;; -- ES:[BX] points to the first FTBLK +;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT +;; +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;+++++++++++++++++++++++++++++++++ +filetag : ;; + ;; +; mov ax,ftag_len ;; + cmp cs:ftag_count,ftag_len ;; + jB valid_ftag ;; + JE FTAG_FAILED ;; + ;; + mov ftp.ftb_status,stat_deverr + mov cs:fp_error,00022H ;; ERROR 0022H + ;; +FTAG_FAILED : ;; discard all the bytes, while + ADD SI,CX ;; stage stays as FTAGX + SUB CX,CX ;; + JMP FTB_LOOP ;; **** RETURN (bytes discarded) **** + ;; +VALID_FTAG : ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + ;; + MOV DI,cs:ftag_count ;; + CMP AL,cs:ftag_pattern[DI] ;; + JE FTAG_NEXTB ;; + ;; + mov ftp.ftb_status,stat_badata + MOV ax,ftag_len ;; stays in FTAGX to consume all bytes + MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes + JMP FTB_LOOP ;; **** RETURN (FAILED !) **** + ;; +FTAG_NEXTB : ;; + INC DI ;; + MOV cs:ftag_count,DI ;; + ;; + CMP DI,ftag_len ;; + JE FTAG_DONE ;; + ;; + JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) **** + ;; +FTAG_DONE : ;; + MOV cs:pass_cnt,0 ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,fptr_lolx ;; + ;; + JMP FTB_LOOP ;; **** NEXT STAGE **** + ;; + ;;+++++++++++++++++++++++++++++++++ +fptrLOL : ;; STAGE the low byte of the low fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_fptrLO ;; + MOV cs:fptr_lol,AL ;; + MOV cs:stage,fptr_lohX ;; + JMP FTB_LOOP ;; +WORD_fptrLO : ;; + INC SI ;; + DEC CX ;; + MOV cs:fptr_low,AX ;; + MOV cs:stage,fptr_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +fptrLOH : ;; STAGE the high byte of the low fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fptr_loh,AL ;; + MOV cs:stage,fptr_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +fptrHIL : ;; STAGE the low byte of the high fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_fptrHI ;; + MOV cs:fptr_hil,AL ;; + MOV cs:stage,fptr_hihX ;; + JMP FTB_LOOP ;; +WORD_fptrHI : ;; + INC SI ;; + DEC CX ;; + MOV cs:fptr_high,AX ;; + MOV cs:stage,FPTR_SKIPX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +fptrHIH : ;; STAGE the high byte of the high fptr + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fptr_hih,AL ;; + MOV cs:stage,FPTR_SKIPX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +ENTRYLO : ;; STAGE - ENTRY LOW BYTE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_ENTRY ;; + MOV cs:entry_lob,AL ;; + MOV cs:stage,ENTRY_HIX ;; + JMP FTB_LOOP ;; +WORD_ENTRY : ;; + INC SI ;; + DEC CX ;; + MOV cs:entry_word,AX ;; + MOV cs:stage,PASSX ;; 2 bytes to be passed + MOV cs:pass_postx,NEXT_LOLX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +ENTRYHI : ;; stage - ENTRY HIGN BYTE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:entry_hib,AL ;; + MOV cs:stage,PASSX ;; 2 bytes to be passed + MOV cs:pass_postx,NEXT_LOLX ;; + AND CX,CX ;; + JNZ ENTHI_PASS1 ;; + JMP FTB_LOOP ;; +ENTHI_PASS1 : ;; + INC SI ;; + INC cs:pass_cnt ;; + DEC CX ;; + AND CX,CX ;; + JNZ ENTHI_PASS2 ;; + JMP FTB_LOOP ;; +ENTHI_PASS2 : ;; + INC SI ;; + INC cs:pass_cnt ;; + DEC CX ;; + MOV cs:stage,NEXT_LOLX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTLOL : ;; STAGE the low byte of the low NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_NEXTLO ;; + MOV cs:next_lol,AL ;; + MOV cs:stage,NEXT_LOHX ;; + JMP FTB_LOOP ;; +WORD_NEXTLO : ;; + INC SI ;; + DEC CX ;; + MOV cs:next_low,AX ;; + MOV cs:stage,next_hilX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTLOH : ;; STAGE the high byte of the low NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:next_loh,AL ;; + MOV cs:stage,next_hilX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTHIL : ;; STAGE the low byte of the high NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_NEXTHI ;; + MOV cs:next_hil,AL ;; + MOV cs:stage,NEXT_HIHX ;; + JMP FTB_LOOP ;; +WORD_NEXTHI : ;; + INC SI ;; + DEC CX ;; + MOV cs:next_high,AX ;; + MOV cs:stage,type_lobX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +NEXTHIH : ;; STAGE the high byte of the high NEXT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:next_hih,AL ;; + MOV cs:stage,type_lobX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +TYPELO : ;; STAGE the low byte of the TYPE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_TYPE ;; + MOV cs:type_lob,AL ;; + MOV cs:stage,type_hibX ;; + JMP FTB_LOOP ;; +WORD_TYPE : ;; + INC SI ;; + DEC CX ;; + MOV cs:type_word,AX ;; + MOV cs:stage,type_idX ;; + MOV cs:tid_cnt,0 ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +TYPEHI : ;; STAGE the high byte of the TYPE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:type_hib,AL ;; + MOV cs:stage,TYPE_IDX ;; + MOV cs:tid_cnt,0 ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +TYPEIDS : ;; STAGE the type id + CMP cs:tid_cnt,8 ;; + JNA VALID_TID ;; + MOV FTP.FTB_STATUS,STAT_DEVERR + MOV cs:fp_error,00021H ;; ERROR 0021H + ADD SI,CX ;; + SUB CX,CX ;; + JMP FTB_LOOP ;; + ;; +VALID_TID : ;; + MOV AX,8 ;; + SUB AX,cs:tid_cnt ;; + CMP CX,AX ;; + JNB TID_ALL ;; + ;; all data in FPKT are stored + PUSH ES ;; + PUSH CS ;; + POP ES ;; + ;; + MOV DI,OFFSET TYPE_ID ;; + ADD DI,cs:tid_cnt ;; + ADD cs:tid_cnt,CX ;; + REP MOVSB ;; SI is incremented accordingly + POP ES ;; + ;; + MOV CX,0 ;; STAGE remained + JMP FTB_LOOP ;; +TID_ALL : ;; + PUSH CX ;; + ;; + PUSH ES ;; + PUSH CS ;; + POP ES ;; + ;; + MOV DI,OFFSET TYPE_ID ;; + ADD DI,cs:tid_cnt ;; + MOV CX,AX ;; + REP MOVSB ;; SI is incremented accordingly + POP ES ;; + ;; + ADD cs:tid_cnt,AX ;; + POP CX ;; + SUB CX,AX ;; + ;; + MOV cs:stage,CPG_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +CPGLO : ;; STAGE the low byte of the CODE PAGE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_CPG ;; + MOV cs:cpg_lob,AL ;; + MOV cs:stage,CPG_HIBX ;; + JMP FTB_LOOP ;; +WORD_CPG : ;; + INC SI ;; + DEC CX ;; + MOV cs:cpg_word,AX ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,font_lolX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +CPGHI : ;; STAGE the high byte of the CODE PAGE + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:cpg_hib,AL ;; + MOV cs:stage,PASSX ;; + MOV cs:pass_postx,font_lolX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTLOL : ;; STAGE the low byte of the low FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FONTLO ;; + MOV cs:font_lol,AL ;; + MOV cs:stage,FONT_LOHX ;; + JMP FTB_LOOP ;; +WORD_FONTLO : ;; + INC SI ;; + DEC CX ;; + MOV cs:font_low,AX ;; + MOV cs:stage,FONT_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTLOH : ;; STAGE the high byte of the low FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:font_loh,AL ;; + MOV cs:stage,FONT_HILX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTHIL : ;; STAGE the low byte of the high FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FONTHI ;; + MOV cs:font_hil,AL ;; + MOV cs:stage,FONT_HIHX ;; + JMP FTB_LOOP ;; +WORD_FONTHI : ;; + INC SI ;; + DEC CX ;; + MOV cs:font_high,AX ;; +;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN + ;; anymore headers to be processed ? + MOV cs:stage,MATCHX ;; + MOV AX,cs:entry_word ;; + DEC AX ;; + MOV cs:entry_word,AX ;; + AND AX,AX ;; + JNZ CHECK_NEXT ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; as ENTRY has been consumed + JMP FTB_LOOP ;; + ;; +CHECK_NEXT : ;; + MOV AX,cs:next_low ;; + AND AX,AX ;; + JNZ MORE_HEADER ;; + MOV AX,cs:next_high ;; + AND AX,AX ;; + JNZ MORE_HEADER ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; as NEXT is nil + MOV cs:next_high,AX ;; + ;; +MORE_HEADER : ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTHIH : ;; STAGE the high byte of the high FONT + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:font_hih,AL ;; +;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN + ;; + MOV cs:stage,MATCHX ;; + ;; anymore headers to be processed ? + MOV AX,cs:entry_word ;; + DEC AX ;; + MOV cs:entry_word,AX ;; + AND AX,AX ;; + JNZ CHECK_NEXT0 ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; + MOV cs:next_high,AX ;; as ENTRY has been consumed + JMP FTB_LOOP ;; + ;; +CHECK_NEXT0 : ;; + MOV AX,cs:next_low ;; + AND AX,AX ;; + JNZ MORE_HEADER0 ;; + MOV AX,cs:next_high ;; + AND AX,AX ;; + JNZ MORE_HEADER0 ;; + ;; no more header to be processed ! + MOV AX,-1 ;; + MOV cs:next_low,AX ;; as NEXT is nil + MOV cs:next_high,AX ;; + ;; +MORE_HEADER0 : ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +MODLO : ;; STAGE the low byte of the MODIFIER + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_MOD ;; + MOV MOD_LOB,AL ;; + MOV cs:stage,MOD_HIBX ;; + JMP FTB_LOOP ;; +WORD_MOD : ;; + INC SI ;; + DEC CX ;; + MOV cs:mod_word,AX ;; + MOV cs:stage,fonts_lobX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +MODHI : ;; STAGE the high byte of the MODIFIER + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:mod_hib,AL ;; + MOV cs:stage,FONTS_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTSLO : ;; STAGE the low byte of the FONTS + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FONTS ;; + MOV cs:fonts_lob,AL ;; + MOV cs:stage,FONTS_HIBX ;; + JMP FTB_LOOP ;; +WORD_FONTS : ;; + INC SI ;; + DEC CX ;; + MOV cs:fonts_word,AX ;; + MOV cs:stage,FDLEN_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FONTSHI : ;; STAGE the high byte of the FONTS + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fonts_hib,AL ;; + MOV cs:stage,FDLEN_LOBX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +FDLENLO : ;; the low byte of the FONT-LENGTH + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + AND CX,CX ;; + JNZ WORD_FDLEN ;; + MOV cs:fdlen_lob,AL ;; + MOV cs:stage,FDLEN_HIBX ;; + JMP FTB_LOOP ;; +WORD_FDLEN : ;; + INC SI ;; + DEC CX ;; + MOV cs:pre_font_len,PRE_FONT_ND;; + MOV cs:fdlen_word,AX ;; + AND AX,AX ;; + JZ NO_DISP_PTR ;; + CMP cs:type_word,TYPE_DISPLAY ;; + JE DISPLAY_TYPE1 ;; + CMP cs:type_word,TYPE_PRINTER ;; + JE PRINTER_TYPE1 ;; + ;; +NO_DISP_PTR : ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; +DISPLAY_TYPE1 : ;; + MOV cs:stage,DISP_ROWSX ;; + JMP FTB_LOOP ;; +PRINTER_TYPE1 : ;; + MOV cs:stage,PTRSELLOX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +FDLENHI : ;; STAGE the high byte of the F-LENGTH + MOV cs:pre_font_len,PRE_FONT_ND + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:fdlen_hib,AL ;; + MOV AX,cs:fdlen_word ;; + AND AX,AX ;; + JZ NO_DISP_PTR2 ;; + CMP cs:type_word,TYPE_DISPLAY ;; + JE DISPLAY_TYPE2 ;; + CMP cs:type_word,TYPE_PRINTER ;; + JE PRINTER_TYPE2 ;; +NO_DISP_PTR2: ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; +DISPLAY_TYPE2 : ;; + MOV cs:stage,DISP_ROWSX ;; + JMP FTB_LOOP ;; +PRINTER_TYPE2 : ;; + MOV cs:stage,PTRSELLOX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +DSPROWS : ;; STAGE : get the rows + XOR AX,AX ;; + MOV cs:disp_rows,AL ;; + MOV cs:disp_cols,AL ;; + MOV cs:DISP_X,AL ;; + MOV cs:disp_y,AL ;; + MOV cs:count_word,AX ;; + ;; + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV cs:disp_rows,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,disp_colsX ;; + JMP FTB_LOOP ;; +NO_DISP_FONT3 : ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +DSPCOLS : ;; STAGE : get the COLS + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV cs:disp_cols,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,DISP_XX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +DSPX : ;; STAGE : get the aspect X + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV DISP_X,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,DISP_YX ;; + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +DSPY : ;; STAGE : get the aspect Y + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; + DEC CX ;; + MOV cs:disp_y,AL ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + JZ NO_DISP_FONT3 ;; + MOV cs:stage,COUNT_LOBX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +DSPCOUNTLO : ;; the low byte of the FONT-LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + PUSH AX ;; check if length is enough + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + POP AX ;; + JNZ A_WORD_COUNT ;; + JMP NO_DISP_FONT3 ;; +A_WORD_COUNT : ;; + AND CX,CX ;; + JNZ WORD_COUNT ;; + MOV cs:count_lob,AL ;; + MOV cs:stage,COUNT_HIBX ;; + JMP FTB_LOOP ;; +WORD_COUNT : ;; + INC cs:pre_font_len ;; + INC SI ;; + DEC CX ;; + MOV cs:count_word,AX ;; +; MOV cs:pre_font_len,PRE_FONT_D; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:count_hib,AL ;; +; MOV cs:pre_font_len,PRE_FONT_D; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRSELLO : ;; the low byte of the SELECTION_TYPE + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + PUSH AX ;; check if length is enough + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + POP AX ;; + JNZ A_WORD_SEL ;; + JMP NO_PTR_FONT3 ;; +A_WORD_SEL : ;; + AND CX,CX ;; + JNZ WORD_SEL ;; + MOV cs:ptr_selob,AL ;; + MOV cs:stage,PTRSELHIX ;; + JMP FTB_LOOP ;; +WORD_SEL : ;; + INC cs:pre_font_len ;; + INC SI ;; + DEC CX ;; + MOV cs:ptr_sel_word,AX ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + ;; + CMP cs:ptr_sel_word,0 ;; + JNE PTR_SEL_NOT0 ;; + ;; + ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; +PTR_SEL_NOT0 : ;; + MOV cs:stage,PTRLENLOX ;; + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRSELHI: ;; STAGE the high byte of SELECT_TYPE + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:ptr_sehib,AL ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + ;; + CMP cs:ptr_sel_word,0 ;; + JNE PTR_SEL_NOT0 ;; + ;; + ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRLENLO : ;; the low byte of SELECTION_LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + PUSH AX ;; check if length is enough + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + POP AX ;; + JNZ A_WORD_SELEN ;; + JMP NO_PTR_FONT3 ;; +A_WORD_SELEN : ;; + AND CX,CX ;; + JNZ WORD_SELEN ;; + MOV cs:ptr_lnlob,AL ;; + MOV cs:stage,PTRLENHIX ;; + JMP FTB_LOOP ;; +WORD_SELEN : ;; + INC cs:pre_font_len ;; + INC SI ;; + DEC CX ;; + MOV cs:ptr_len_word,AX ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; + ;;+++++++++++++++++++++++++++++++++ +PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH + INC cs:pre_font_len ;; + MOV AX,FPKT ;; + INC SI ;; byte by byte + DEC CX ;; + MOV cs:ptr_lnhib,AL ;; + ;; + MOV AX,cs:fdlen_word ;; + DEC AX ;; + MOV cs:fdlen_word,AX ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;; +NO_PTR_FONT3 : ;; + MOV cs:stage,FOUNDX ;; FSTAT is to be changed + JMP FTB_LOOP ;; + ;;+++++++++++++++++++++++++++++++++ +PASS : ;; STAGE - PASS DUMMY BYTES + ;; + PUSH DX ;; + PUSH ES ;; + PUSH DI ;; + ;; + PUSH CS ;; + POP ES ;; + MOV DI,OFFSET PASS_BRK ;; + MOV DX,PASS_INDX ;; + MOV AX,cs:pass_cnt ;; + ;; +NEXT_BRK: ;; find the next pass-break + CMP AX,ES:[DI] ;; + ;; + JB UPTO_BRK ;; + ;; + DEC DX ;; + JZ PASS_ERR ;; + INC DI ;; + INC DI ;; + JMP NEXT_BRK ;; + ;; +UPTO_BRK : ;; next break point found + MOV DX,ES:[DI] ;; + SUB DX,AX ;; bytes to be skipped + CMP CX,DX ;; all to be skipped ? + JAE PASS_ALL ;; + ;; + ADD cs:pass_cnt,CX ;; + ADD SI,CX ;; + SUB CX,CX ;; + JMP PASS_END ;; + ;; +PASS_ALL : ;; + ADD cs:pass_cnt,DX ;; + ADD SI,DX ;; + SUB CX,DX ;; + ;; + MOV AX,cs:pass_postx ;; + MOV cs:stage,AX ;; + ;; +; cmp ax,passx ;; is the next stage a pass-stage ? +; jne not_passx ;; +; mov ax,pass_postxx ;; +; mov pass_postx,ax ;; +; mov pass_postxx,stage_max ;; can support only 2 consecutive pass + ;; +;not_passx : ;; + ;; + JMP PASS_END ;; + ;; +PASS_ERR : ;; DEVICE ERROR, wrong stage + POP DI ;; + POP ES ;; + POP DX ;; + MOV FTP.FTB_STATUS,STAT_DEVERR + SUB CX,CX ;; ignore all the input string + JMP PASS_DONE ;; + ;; +PASS_END : ;; + POP DI ;; + POP ES ;; + POP DX ;; +PASS_DONE : ;; + JMP FTB_LOOP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +FTB_LPEND : ;; + ;; + CMP cs:stage,FOUNDX ;; + JNE NOT_FOUNDX ;; + ;; + CALL FOUND_DO ;; + ;; +NOT_FOUNDX : ;; + ;; + POP CX ;; STACK -1 + ;; +FP_RET : ;; + POP SI ;; restore registers + POP DI ;; + POP DX ;; + POP CX ;; + POP BX ;; + POP AX ;; + POP ES ;; + POP DS ;; + ;; + RET ;; +FONT_PARSER ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CSEG ENDS + END diff --git a/v4.0/src/DEV/PRINTER/CPSPEQU.INC b/v4.0/src/DEV/PRINTER/CPSPEQU.INC new file mode 100644 index 0000000..ca086cb --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPEQU.INC @@ -0,0 +1,577 @@ + + PAGE ,132 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Printer Device Driver EQUAL Include +;; MODULE NAME: CPSEQU +;; TYPE: Include File +;; +;; LINK PROCEDURE: See CPSPx.ASM +;; +;; INCLUDE FILES: +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Request Header (Common portion) +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +RH EQU ES:[DI] ;; addressability to Request Header + ;; +RHC STRUC ;; fields common to all request types +RHC_LEN DB ? ;; length of Request Header + DB ? ;; unit code (subunit) +RHC_CMD DB ? ;; command code +RHC_STA DW ? ;; status + DQ ? ;; reserved for DOS +RHC ENDS ;; end of common portion + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; Command in the Request Header + ;; (see CMD_CODES table) + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +CMD_INI EQU 0 ;; init command +CMD_WRT EQU 8 ;; write command +CMD_GIO EQU 19 ;; generic IOCTL command + ;; (see major/minor GIO functions) + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; status values for RHC_STA + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +STAT_DONE EQU 01H ;; function complete - high order byte +STAT_CMDERR EQU 8003H ;; invalid command code error +STAT_ERROR EQU 8000H ;; error returned by normal driver + ;; +;; see Generic IOCTL Request Header section +;; for more errorneous status. ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Request Header for INIT +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +RH0 STRUC ;; + DB (TYPE RHC) DUP (?) ;; common portion + ;; + DB ? ;; not used for CHAR devices +RH0_ENDO DW ? ;; offset of ending address +RH0_ENDS DW ? ;; segment of ending address +RH0_BPBA DD ? ;; pointer to BPBA + db ? +RH0_CONFIG_ERRMSG dw 0 ;DCR D493 "Error in CONFIG.SYS..." msg flag. +RH0 ENDS ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Request Header for IOCTL +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +RH3 STRUC ;; + DB (TYPE RHC) DUP (?) ;; common portion + ;; + ;; + DB ? ;; media descriptor +RH3_DTAO DW ? ;; offset of transfer address +RH3_DTAS DW ? ;; segment of transfer address +RH3_CNT DW ? ;; byte count +RH3 ENDS ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Request Header for GENERIC IOCTL +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +GIH STRUC ;; + DB (TYPE RHC) DUP (?) ;; common portion + ;; + ;; +GIH_MAF DB ? ;; major function +GIH_MIF DB ? ;; minor function +GIH_SI DW ? ;; content of SI +GIH_DI DW ? ;; content of DI +GIH_GBA DD ? ;; Address of Generic Buffer +GIH ENDS ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; GIO major/minor functions + ;; (see GIO_CODES table) + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +MAF_CON EQU 03 ;; major function for CON device +MAF_PTR EQU 05 ;; major function for LPTX device + ;; +MIF_DST EQU 4CH ;; minor function : designate start +MIF_DEN EQU 4DH ;; designate end +MIF_IVK EQU 4AH ;; invoke +MIF_QIV EQU 6AH ;; query-invoked +MIF_QLS EQU 6BH ;; query-list + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Designate Start (MIF_DST)Flags + ;; see GBIS structure + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +DSF_FIFOCP EQU 08000H ;; Single code page FIFO command +DSF_CARTCP EQU 00001H ;; Code page for Cartridge/semi- + ;; hardware RAM + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Generic IOCTL errorneous status + ;; upon return + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +STAT_DELETE EQU 08000H ;; previous degignate deleted (DST) + ;; STAT_DELETE : only for FIFO +STAT_NOFIND EQU 08008H ;; codepage,device not found (DST) +STAT_DEVERR EQU 0800AH ;; Device error (DST,IVK,QIV,QLS,WRT) +STAT_BADATA EQU 0800CH ;; bad font file (DST) +STAT_NOBUFF EQU 0800CH ;; no font buffer for (REFRESH) +STAT_BADDEN EQU 0800CH ;; no DST (DEN) +STAT_bffDEN EQU 08000H ;; bad font file (DEN) +STAT_TOMANY EQU 0800aH ;; too manay codepages (DST) +STAT_DUPLCP EQU 0800aH ;; too manay codepages (DST) +STAT_NOCPIV EQU 08007H ;; no codepage designated/invoked +STAT_NOCP EQU 08007H ;; no codepage designated/invoked + ;; (IVK, QIV, QLS) + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Generic IOCTL Buffer DS:[SI] +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +GIOB EQU DS:[SI] ;; + ;; +GB1S STRUC ;; +GB1_FLAG DW ? ;; flag +GB1_LEN DW ? ;; length +GB1_NUM DW ? ;; length +GB1_CP DW ? ;; +GB1S ENDS ;; + ;; + ;; +GB2S STRUC ;; +GB2_LEN DW ? ;; length +GB2_CP DW ? ;; +GB2S ENDS ;; + ;; + ;; +GB3S STRUC ;; +GB3_LEN DW ? ;; length +GB3_GBL DW ? ;; hardware code page number +GB3S ENDS ;; + ;; +GB3_MINILEN EQU 4 ;; minimium length of GB3 + ;; +GBLS STRUC ;; +GBL_LEN DW ? ;; length +GBL_CP DW ? ;; hardware code page number +GBLS ENDS ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; DEVICE Header DS:[SI] -- to locate the next LPTn header +;; NEXT device header ES:[DI] +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +HP EQU DS:[SI] ;; +NHD EQU ES:[DI] ;; + ;; +NAME_LEN EQU 8 ;; + ;; +DHS STRUC ;; +DH_NEXTO DW ? ;; offset of pointer to next header +DH_NEXTS DW ? ;; segment of pointer to next header + DW ? ;; attribute +DH_STRAO DW ? ;; offset to strategy routine +DH_INTRO DW ? ;; offset to interrupt routine +DH_NAME DB NAME_LEN DUP(0) ;; device name in this header +DHS ENDS ;; end of common portion + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FONT_PARSER data +;; +;; -- Interface table : FTABLE +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +FPKT EQU DS:[SI] ;; + ;; +FTP EQU ES:[BX] ;; + ;; ( I=Input O=Output ) +FTBLK STRUC ;; +FTB_LENGTH DW TYPE FTBLK ;; (NOT TO BE CHANGED) +FTB_STATUS DW 0FFFFH ;; (O) parsing compelte +FTB_TYPE DW 0 ;; (O) +FTB_TID DB 8 DUP(?) ;; (I) +FTB_CP DW 0FFFFH ;; (I) +FTB_MOD DW 0 ;; (O) +FTB_FONTS DW 0 ;; (O) +FTB_ROWS DB 0 ;; (O) DISPLAY TYPE DEVICE +FTB_COLS DB 0 ;; (O) DISPLAY TYPE DEVICE +FTB_X DB 0 ;; (O) DISPLAY TYPE DEVICE +FTB_Y DB 0 ;; (O) DISPLAY TYPE DEVICE +FTB_COUNT DW 0 ;; (O) DISPLAY TYPE DEVICE +FTB_SELECT DW 0 ;; (O) PRINTER TYPE DEVICE +FTB_SELLEN DW 0 ;; (O) PRINTER TYPE DEVICE +FTB_DLEFT DW 0 ;; (O) =0, none to come +FTB_DLEN DW 0 ;; (O) =0, not in this packet +FTB_DALO DW 0 ;; (O) in the DOS "packet" buffer +FTB_DAHI DW 0 ;; (O) " " " " " +TARGET_LO DW 0 ;; internal registers +TARGET_HI DW 0 ;; internal registers +FTBLK ENDS ;; + ;; +TYPE_DISPLAY EQU 01H ;; display type device +TYPE_PRINTER EQU 02H ;; printer type device + ;; +FBUFS STRUC ;; +FLAG DW 0 ;; +BUFFER_LEN DW 0 ;; +BUFFER_ADDR DD 0 ;; +NUM_FTBLK DW 0 ;; no. of FTBKL entries +FBUFS ENDS ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; FLAGS : +FLAG_RESTART EQU 000001H ;; bit 1 = restart the parsing + ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; STATUS : (in FTB_STATUS) + ;; +FSTAT_COMPLETE EQU 0FFFFH ;; parsing compeleted. (good status) +FSTAT_FONT EQU 0FFFEH ;; font data is defined and returned +FSTAT_FOUND EQU 0FFFDH ;; informations including font-length +FSTAT_MATCH EQU 0FFFCH ;; font header matches FTBLK +FSTAT_SEARCH EQU 0FFFBH ;; seraching for header & font +FSTAT_BOTTOM EQU 0FFF0H ;; below this are the DOS_STATUS. + ;; +;; the FSTAT with value lower than 0FFF0H is to be returned to the DOS + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; DEVICE Command Parser Table ES:[DI] +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +table_len equ 290 ;; + ;; +PSE EQU ES:[DI] ;; + ;; +PAR_OT STRUC ;; +PAR_DEV_NUM DW ? ;; +PAR_OFF DW ? ;; +PAR_OT ENDS ;; + ;; +PAR_DEVOT STRUC ;; OFFSET to the parameters of a device +PAR_onum DW ? ;; number of offsets in the table +PAR_DNMO DW ? ;; device-name table offset +PAR_DIDO DW ? ;; device-id table offset +PAR_HWCPO DW ? ;; hwcp table offset +PAR_DESGO DW ? ;; designate table offset +PAR_PARMO DW ? ;; parameter table offset +PAR_DEVOT ENDS ;; + ;; +PAR_DNMT STRUC ;; DEVICE NAME table +PAR_DNML DW ? ;; length of device name +PAR_DNM DB ? ;; device name +PAR_DNMT ENDS ;; + ;; +PAR_DIDT STRUC ;; DEVICE ID table +PAR_DIDL DW ? ;; device ID length +PAR_DID DB ? ;; device ID +PAR_DIDT ENDS ;; + ;; +PAR_HWCPT STRUC ;; hwcp table +PAR_HWCPL DW ? ;; hwcp entry number +PAR_HWCP DW ? ;; hwcp +PAR_HWCPT ENDS ;; + ;; + ;; +PAR_DESGT STRUC ;; DESIGNATE table +PAR_DESGL DW ? ;; entry number +PAR_DESG DW ? ;; designate +PAR_FONT DW ? ;; fonts +PAR_DESGT ENDS ;; + ;; + ;; +PAR_PARMT STRUC ;; parameter table +PAR_PARML DW ? ;; length +PAR_PARM DW ? ;; +PAR_PARMT ENDS ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; LPTn printer data structure CS:[BX] +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +BUF EQU CS:[BX] ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; STATES + ;; +NORMAL EQU 0 ;; normal state +CPSW EQU 1 ;; +DESG_WR EQU 2 ;; designate write +DESG_END EQU 3 ;; designate end +LOCKED EQU 4 ;; WGR locked + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +GOOD EQU 0 ;; STATUS : +REPLX EQU 8000H ;; codepage replaced in DST +FAIL EQU 4000H ;; fail in designate +LOADED EQU 2000H ;; the font has just been loaded to +REFRESH EQU 0800H ;; there was a refresh via DST + ;; + ;; also + ;; -- DSF_CARTCP + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; for BFLAG : +BF_PRN EQU 0 ;; 0 = PRN initialized (interrupt) +BF_LPT1 EQU 1 ;; 1 = LPT1 initialized (interrupt) +BF_LPT2 EQU 2 ;; 2 = LPT2 initialized (interrupt) +BF_LPT3 EQU 3 ;; 3 = LPT3 initialized (interrupt) +BF_MEM_DONE EQU 08000H ;; memory done for this device + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; BUFFER DATA structure +BUF_DATA STRUC ;;................................. +BFLAG DW -1 ;; buf flag for initialisation + ;; -1 = buf not yet initialised + ;; (see BF_PRN, BF_LPT's) + ;; +DEV_HDRO DW -1 ;; device driver n header offset +DEV_HDRS DW -1 ;; +LPT_STRAO DW -1 ;; dos lptn strategy offset +LPT_STRAS DW -1 ;; +LPT_INTRO DW -1 ;; dos lptn strategy offset +LPT_INTRS DW -1 ;; +RH_PTRO DW -1 ;; request header offset +RH_PTRS DW -1 ;; segment ....................(unique) + ;; + ;; (following is replicated for LPT1 ) + ;; +RNORMO DW -1 ;; request-normal driver header offset +prn_bufo dw -1 ;; offset to prn buffer +did_prn dw 0 ;; where PRN is in the DID order +PCLASS DW 0 ;; +STATE DW NORMAL ;; +STATUS DW GOOD ;; + ;; (the followings should be used + ;; IFF BUT.STATE <> NORMAL : ) + ;; +PDESCO DW -1 ;; offset to printer description table. + ;; + ;;===== hwcp and designated slots ==== +HSLMX DW 0 ;; HSLMX is the size of HARDslot (at + ;; HARDSO) and the buffer(at HRBUFO) + ;; +HARDMX DW 0 ;; no. of HWCP+cart slots supported + ;; (less than or equal to .HSLOTS) +HARDSO DW -1 ;; offset to hardware slots n + ;; +HCARMX DW 0 ;; no. of cart slots supported +HRBUFO DW -1 ;; offset to cart slots' buffer + ;; + ;;===== physical and designated RAM === + ;; +RSLMX DW 0 ;; RSLMX is the size of RAMslot (at + ;; RAMSO) and the RAM buffer(at RMBUFO) + ;; + ;; +RAMMX DW 0 ;; no. of physical RAM slots(max.=1) +RAMSO DW -1 ;; offset to RAM slots(incl. designated + ;; +RBUFMX DW 0 ;; no. of designated RAM slots supported +RMBUFO DW -1 ;; offset to RAM slots's buffer + ;; +FTSZPA DW -1 ;; font buffer in paragraph = FONTSZ +FTSIZE DW 0 ;; font buffer size = FTSZPA x 16 +FTSTART DW -1 ;; start of font buffer +FTSLOTO DW -1 ;; segment address of font buffer + ;; -- of the one to be designated to +FTDLO DW -1 ;; offset to where the FTSTART:OFFSET + ;; (next destination = total length + ;; so far) +FSELEN DW 0 ;; length of selection control copied + ;; to the selection buffer + ;; (USED BY SELECT TYPE = 1 ONLY) + ;; -- initialized to 0, if selection + ;; is not 0, copied the selection + ;; from the font file until the + ;; length is reached. After copying + ;; to selection buffer, reset to 0 +FSELMAX DW 0 ;; max. room reserved for selection + ;; controls. + ;; +PAR_EXTRACTO DB (TYPE PAR_DEVOT) DUP (-1);; Offset to parameter extracts +SAVED_CP DW -1 ;; WGR saved code page during lock ;AN000; +BUFEND DW 0 ;; END OF BUFFER, for LPT1 copy. +BUF_DATA ENDS ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Printer Description Table +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +DEVN_LEN EQU 8 ;; device name (type-id) length + ;; +PDSH STRUC ;; +PD_LEN DW 30 ;; length of each entry +TYPEID DB ' ' ;; device name (id), length DEVN_LEN +VMINOR DB 0 ;; version : .00 +VMAJOR DB 1 ;; version : 1. +CLASS DW ? ;; reserved +FONTSZ DW ? ;; font buffer size in paragraph (max) +HSLOTS DW ? ;; hard-slots number (max # of Hslots) +HWCPMIN DW ? ;; what left by min_hwcp can be cart. +RSLOTS DW ? ;; ram-slots number (max # of Rslots) +PDSH ENDS ;; the SELH_O, and SELR_O are defined + ;; in the next two entries in PDS + ;; + ;; +PDS STRUC ;; + DB (TYPE PDSH) DUP (?) ;; common portion +SELH_O DW ? ;; offset to select controls on Hslots +SELR_O DW ? ;; offset to select controls on Rslots +SELB_O DW ? ;; offset to buffered select controls +PDS ENDS ;; + ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; HARD / RAM slots table structure/constants +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; NOTE : must be only FOUR bytes for + ;; codepage positioning + ;; calculation as compared + ;; with each entry in FTDL_OFF + ;; +SLTS STRUC ;; slots-table structure +SLT_CP DW -1 ;; code page : no code page +SLT_AT DW 0 ;; attribute : empty +SLTS ENDS ;; + ;; + ;; ATTRIBUTES : +AT_RAM1 EQU 00001H ;; in the 1st physical RAM slot +AT_RAM2 EQU 00002H ;; in the 2nd physical RAM slot +AT_RAM3 EQU 00004H ;; in the 3rd physical RAM slot +AT_RAM4 EQU 00008H ;; in the 4th physical RAM slot +AT_RAMS EQU 0000FH ;;(note the current logic supports + ;; only ONE physical RAM slot) + ;; +AT_OCC EQU 01000H ;; slot occupied +AT_ACT EQU 02000H ;; slot active +AT_HWCP EQU 04000H ;; slot is hwcp +AT_OLD EQU 08000H ;; codepage in buffer is not newly + ;; designated. +AT_LOAD EQU 00100H ;; slot with font to be loaded +AT_FONT EQU 00200H ;; font in this slot has been loaded +AT_NO_LOAD EQU NOT AT_LOAD ;; to reset the bit +AT_NO_FONT EQU NOT AT_FONT ;; to reset the bit +AT_SELECT EQU 00400H ;; for SELECT TYPE = 1 + ;; -- mark the FTBLK where control is + ;; copied from. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; constants on SLOTS +HARDSL_MAX EQU 12 ;; + ;; +RAMSL_MAX EQU 12 ;; + ;; +CTL_MAX EQU 32 ;; max.length of each selection control +CTL5202_OFFS EQU 8 ;; offset to CTL5202_H for codepage + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; General Constants +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +STACK_SIZE EQU 28H ;; in paragraph, total 200H bytes + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; +; STRUCS AND EQUATES +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +PARSE_NAME STRUC ;; ;AN000; +N_LENGTH DW ? ;; ;AN000; +FNAME DB " " ;; ;AN000; +PARSE_NAME ENDS ;; ;AN000; + ;; +PARSE_OFFSETS STRUC ;; ;AN000; + DW ? ;; ;AN000; +DN_OFFSET DW ? ;; ;AN000; +DI_OFFSET DW ? ;; ;AN000; +DCP_OFFSET DW ? ;; ;AN000; +DD_OFFSET DW ? ;; ;AN000; + DW ? ;; ;AN000; +PARSE_OFFSETS ENDS ;; ;AN000; + ;; +PARSE_HWCP STRUC ;; ;AN000; +NUM_HWCPS DW ? ;; ;AN000; +HWCP_1 DW ? ;; ;AN000; +HWCP_2 DW ? ;; ;AN000; +HWCP_3 DW ? ;; ;AN000; +HWCP_4 DW ? ;; ;AN000; +HWCP_5 DW ? ;; ;AN000; +HWCP_6 DW ? ;; ;AN000; +HWCP_7 DW ? ;; ;AN000; +HWCP_8 DW ? ;; ;AN000; +HWCP_9 DW ? ;; ;AN000; +HWCP_10 DW ? ;; ;AN000; +PARSE_HWCP ENDS ;; ;AN000; + ;; +PARSE_DESG STRUC ;; ;AN000; +NUM_VALUES DW ? ;; ;AN000; +NUM_DESGS DW ? ;; ;AN000; +NUM_FONTS DW ? ;; ;AN000; +PARSE_DESG ENDS ;; ;AN000; + ;; + ;; +ZERO EQU 0H ;; ;AN000; +ONE EQU 1H ;; ;AN000; +TWO EQU 2H ;; ;AN000; +THREE EQU 3H ;; ;AN000; +FOUR EQU 4H ;; ;AN000; +FIVE EQU 5H ;; ;AN000; +SIX EQU 6H ;; ;AN000; +SEVEN EQU 7H ;; ;AN000; +EIGHT EQU 8H ;; ;AN000; +NINE EQU 9H ;; ;AN000; +TEN EQU 0AH ;; ;AN000; +NUMBER EQU 1 ;; ;AN000; +STRING EQU 3 ;; ;AN000; +COMPLEX EQU 4 ;; ;AN000; +RC_EOL EQU -1 ;; ;AN000; +RC_NO_ERROR EQU 0 ;; ;AN000; +RC_OP_MISSING EQU 2 ;; ;AN000; +ON EQU 1 ;; ;AN000; +OFF EQU 0 ;; ;AN000; +BAD_SYNTAX_MSG EQU 12 ;; ;AN000; +BAD_DEVICE_MSG EQU 2 ;; ;AN000; +; + diff --git a/v4.0/src/DEV/PRINTER/CPSPI.ASM b/v4.0/src/DEV/PRINTER/CPSPI.ASM new file mode 100644 index 0000000..30bb7c9 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPI.ASM @@ -0,0 +1,2422 @@ + + PAGE ,132 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Printer Device Driver INIT module (CPSPInn) +;; MODULE NAME: +;; TYPE: Assemble file (non-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 +;; +;; LAYOUT : This file is divided into two main section : +;; ++++++++++++++++++++++++ +;; ++ DEVICE Parser ++ +;; ++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Command ++ +;; ++++++++++++++++++++++++ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INCLUDE CPSPEQU.INC ;; + ;; +PUBLIC INIT ;; +PUBLIC CODE_END ;; for MAP listing only +PUBLIC RESIDENT_END ;; +PUBLIC STACK_ALLOCATED ;; + ;; + ;; +EXTRN PRINTER_DESC_NUM:WORD ;; +EXTRN PRINTER_DESC_TBL:WORD ;; +EXTRN INIT_CHK:WORD,TABLE:WORD ;; +EXTRN HARD_SL1:BYTE,RAM_SL1:BYTE ;; +EXTRN HARD_SL2:BYTE,RAM_SL2:BYTE ;; +EXTRN HARD_SL3:BYTE,RAM_SL3:BYTE ;; +EXTRN HARD_SL4:BYTE,RAM_SL4:BYTE ;; +EXTRN RESERVED1:WORD,RESERVED2:WORD ;; + ;; +EXTRN MSG_NO_INIT_P:BYTE ;; +EXTRN MSG_NO_INIT:BYTE ;; +EXTRN MSG_BAD_SYNTAX:BYTE ;; +EXTRN MSG_INSUFF_MEM:BYTE ;; + ;; + ;; +CSEG SEGMENT PARA PUBLIC 'CODE' ;; + ASSUME CS:CSEG ;; + ;; + ;; +CODE_END EQU $ ;; end of resident code + ;; + DW 0 ;; -- there are 16 bytes kept, + ;; including this word + ;; +RESIDENT_END DW 0FFFH ;; end of extended resident area +STACK_ALLOCATED DW -1 ;; end of extended resident area + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; End of resident code +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Incorporating Device Command Parser : +;; +;; -- extracted from PARSE4E.ASM, size 49582 bytes +;; +;; (some modifications have to be made in the section right after the parser's +;; document and before the GET_PARMS_A, one of them is :) +;; +;; -- move the TABLE to the printer device driver's main module +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ++++++++++++++++++++++++ +;; ++ DEVICE Parser ++ +;; ++++++++++++++++++++++++ +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +;; PARSER's code -- non resident +;; +;; -- set ES:[DI] pointing to the Request Header before calling PARSER +;; +;; to be called as PARSER with ES:[DI] defined as Request Header +;; If there is any syntax error in the DEVICE command line, the +;; Parser return a 0 in the first word (NUMBER)of the first table. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +; +; Description: A command parser for DEVICE command in the CONFIG.SYS file. +; ------------ +; +; Procedures contained in the file: +; --------------------------------- +; PARSER: Main routine for command processing. +; GET_CHAR: Gets a character from command line. +; IS_ALPH: Checks if character is an alpha character. +; IS_DIGIT: Checks if character is a digit. +; IS_DELIM: Checks if character is a DOS delimiter. +; DEVICE_PARSE: Pulls device name from command line and +; inserts in table. +; ID_PARSE: Pulls id name from command line and insers in table +; HWCP_PARMS: Extract HWCP number, converts it to binary and +; inserts it in table. +; HWCP_PARSE: Extracts HWCP number if only one number is given. +; MUL_HWCP: Extracts multiple HWCP's numbers, if they are given +; in a list. +; DESG_PARMS: Extracts designate number, converts it to binary +; and inserts it in table. +; DESG_FONT: Extracts the designate and the font if both were +; given in command line. +; DESG_PARSE: Pulls designate number if it is the only one given. +; GET_NUMBER: Converts a number to binary. +; OFFSET_TABLE: Updates the counter in table #1. +; FIND_RIGHT_BR: Looks for a right bracket. +; +; +; Change history: +; --------------- +; +; +;LOGIC: +;------ +; Establish addressability to parameters. +; Skip until end of path and file name -first delimiter +; +; Loop: +; Isolate the first non-delimiter or non delimeter characters. +; If End_of_Line_Delimiter then +; return an error_code +; Else +; If first non-delimiter is ALPHA then +; (assume a device name) +; Extracts device name +; Update offset counter +; +; Isolate the first non-delimiter characters after id name. +; If End_of_Line_Delimiter then +; return an error_code +; Else +; If first non-delimiter is ALPHA-NUMARIC or +; If character is '(' then +; (assume an id name) +; Extracts id name +; Update offset counter +; +; Pull out HWCP +; If error flag is set then exit +; Else if end of line flag is set then exit +; +; Pull out DESG parms +; If error_flag is set then exit. +; Else if end of line flag is set then exit +; Else if Number of devices is four then Exit +; Else Loop +; +; +;Subroutines Logic: +;------------------ +; +; GET_CHAR: +; --------- +; Load character in AL +; If character less than 20h then +; turn Z-flag on +; +; IS_ALPHA: +; --------- +; Save character +; 'Convert character to upper case' +; If character >=A and <=Z then +; turn Z-flag on +; exit +; Else +; Restore character +; exit. +; +; IS_DIGIT: +; --------- If Character >=0 and <=9 then +; turn Z-flag on +; +; IS_DELIMITER: +; ------------- +; If character a dos delimiter (' ','=',',',';',TAB) +; then turn Z-flag on +; +; DEVICE_PARSE: +; ------------- +; Set device name length counter. +; Loop +; If a dos delimiter then +; add spaces to name (if require) +; Else if char is ALPHA-NUM then +; save in table +; If name >8 character thne +; error; exit +; Else +; error; exit +; +; ID_PARSE: +; --------- Set id name length counter. +; Loop +; If a dos delimiter then +; add spaces to name (if require) +; Else if char is ALPHA-NUM then +; save in table +; If name >8 character then +; error; exit +; Else if char is ')' or '(' then +; set flags +; Else +; error; exit +; +; HWCP_PARMS: +; ----------- +; Loop: Set flags off +; If char is a DIGIT then +; convert number to binary +; update table +; Else if char is ',' then +; no HWCP was given +; exit +; Else if char is '(' then +; assume multiple HWCP +; Else if char is ')' then +; end of parms, exit +; Else if not a delimiter then +; error, exit set carry flag set carry flag +; Loop +; +; HWCP_PARSE: +; ----------- Increment counter +; Get number and convert to binary +; Update the table +; Set table_5 pointer +; +; MUL_HWCP: +; --------- +; Loop: If char is ')' then +; end of list, exit +; If char is a DIGIT +; Get number and convert to binary +; Update table. +; If char is not a delimiter then +; error, exit set carry flag +; Loop +; +; DESG_PARMS: +; ----------- +; Loop: If char is a DIGIT then +; Get number and convert to binary +; Update table. +; If char is a ')' then +; end of parms, exit +; If char is a '(' then +; assume given desg. and font +; If char is a ',' then +; no desg ginven +; scane for ')' +; If char is not a delimiter then +; error, exit set carry flag +; Loop +; +; DESG_FONT: +; ---------- +; Loop: If char is a ',' then +; no desg number was given +; update table +; If char is a ')' then +; end of desg-font pair, exit +; If char is a DIGIT then +; Get number and convert to binary +; Update table +; If char not a delimiter then +; error, exit set carry flag +; Loop +; +; DESG_PARSE: +; ----------- Get number and conver to binary +; Update table +; +; GET_NUMBER: +; ----------- Get ASCII number from parms +; conver to binary +; add to total +; +; OFFSET_TABLE: +; ------------- +; Increment the number of parms +; +; FIND_RIGHT_BR: +; -------------- +; Loop: If char is ')' then +; found bracket exit +; If char is not ' ' then +; error, exit set carry flag +; Loop +; END +;------------------------------------------------------ +; +; The following is the table structure of the parser. All fields are +; two bytes field (accept for the device and id name) +; +; TABLE HEADER : +; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Number of devices. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ +; ³ Device # 2 offset ³ ³ Table_1 (a) ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ +; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device # 4 offset ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N = 1,2,3 or 4. A two bytes number indicating the number of device specified. +; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset +; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1 +; (b)...etc.). If an error was detected in the command N is set to zero. +; +; +; +; TABLE_1 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Number of Offsets. ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³ +; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³ +; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ "Reserved" ³ ³ ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ ³ ³ ³ +; ³ ÀÄÄÄÄÄij Table_4 (a) ³ +; ³ ³ ³ +; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ ³ ³ +; ÀÄÄÄÄÄÄÄij Table_5 (a) ³ +; ³ ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N=Length of table_1, or the number of offsets contained in table_1. +; The offsets are pointers (two bytes) to the parameters value of the device. +; "Reserved" : a two byte memory reserved for future use of the "PARMS" option. +; +; +; TABLE_2 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of devices name ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device name ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Length of device name. Device length is always 8 byte long. +; Device Name : the name of the device (eg. LPT1, CON, PRN). The name +; is paded with spaces to make up the rest of the 8 characters. +; +; +; +; TABLE_3 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of Id name. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Id Name ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Length of id name. Id name length is always 8 byte long. +; Id Name : the name of the id (eg. EGA, VGA, 3812). The name +; is paded with spaces to make up the rest of the 8 character. +; +; +; +; TABLE_4 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of table. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 1 ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 2 ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ . ³ +; ³ . ³ +; ³ . ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 10 ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N = Length of table in words. Or the number of HWCP's. +; HWCP # N : a hardware code page number converted to binary. The maximum +; number of pages allowed is 10. +; +; +; +; TABLE_5 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of table. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Designate ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Font ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Lenght of table. 0 - nothing was specified +; 1 - Only a designate was specified. +; 2 - Designate and font were given. If the Desg field +; was left empty in the DEVICE command then the +; Designate field is filled with 0FFFFH. +; Designate, Font : Are the Desg. and Font binary numbers. +; +;------------------------------------------------------ +; + +;RESERVED MEMORY: +TABLE_1 DW ? ; Pointer at offsets. +TABLE_2 DW ? ; Pointer at device name. +TABLE_3 DW ? ; Pointer at id name. +TABLE_4 DW ? ; Pointer at hwcp. +TABLE_5 DW ? ; Pointer at desg and font. +;TABLE DB 290 DUP (?) ; Table of parsed parms. Max 4 devices. +DEVNUM DW ? ; Counter to number of devices. +RIGHT_FLAG DB ? ; Flag to indicate a left bracket. +DEV_ERR_FLG DB ? ; Device name error flag. +ID_ERR_FLG DB ? ; Id name error flag. +ERROR_FLAG DB ? ; Error flag_terminate program if set to 1. +COMMA_FLAG DB ? ; Indicate the number of commas incounterd. +HWCP_FLAG DB ? ; Flag for multiple hwcps. +DESG_FLAG DB ? ; Flag indicates desg. and font. + +;Main part of program-links different sumbroutines together + +PARSER PROC + + PUSH AX ; ;;;;;;;;;;;;;;;;;; + PUSH BX ; ; + PUSH CX ; ; SAVE + PUSH DX ; ; ALL + PUSH DS ; ; REGISTERS. + PUSH ES ; ; + PUSH DI ; ; + PUSH SI ; ;;;;;;;;;;;;;;;;;; + + LES SI,RH.RH0_BPBA ; Point at all after DEVICE= + ; in the CONFIG.SYS file. + + +;Skip to end of file name, to the first DOS delimiter. + + MOV DEVNUM,02H ; Number of devices counter. + +GET_PARMS_A: CALL GET_CHAR ; Get command character in AL . + JZ EXIT_B ; No parms found. + CALL IS_DELIM ; If not a delimiter then. + JNE GET_PARMS_A ; Check next character. + + MOV DI,OFFSET TABLE ; Get the table address. + ADD DI,02H ; Point at devices offsets. + MOV BX,DI ; + ADD BX,08H ; Point BX at parms offsets. +TAB2: CALL UPDATE_TABLE ; Update table pointers value. + +CLR_DELIM: CALL GET_CHAR ; Get character into AL. + JZ EXIT_B ; No parms found. + CALL IS_ALPHA ; If alpha then assume. + JZ DEVICE ; A device name. + CALL IS_DELIM ; Is it a delimiter + JNE EXIT_A ; If not then error. + JMP CLR_DELIM ; Get next character. + +DEVICE: MOV DEV_ERR_FLG,00H ; Set device error flag off; + CALL DEVICE_PARSE ; Call routine to parse device name. + CMP DEV_ERR_FLG,01H ; If error flag is + JZ EXIT_A ; set then exit. + CALL OFFSET_TABLE ; Update table. + +ID_PARMS: CALL GET_CHAR ; Load a character in AL. + JZ EXIT_A ; Exit if end of line (error). + CMP AL,'(' ; If AL is a '(' then + JE ID ; Parse ID name. + CALL IS_ALPHA ; If an Alpha + JE ID ; Then parse ID name. + CALL IS_DIGIT ; If a digit + JE ID ; Then parse ID name. + CALL IS_DELIM ; If not a delimiter + JNE EXIT_A ; Then error, exit + JMP ID_PARMS ; Get another number + +EXIT_B: CMP DEVNUM,02H ; If device number above 2 then + JA EXIT_C ; Exit parse. + JMP EXIT_A ; Else error, exit + +ID: MOV ID_ERR_FLG,00H ; Set id error flag off. + CALL ID_PARSE ; Parse ID name. + CMP ID_ERR_FLG,01H ; Was error flag set, then + JE EXIT_A ; Print error message. + CALL OFFSET_TABLE ; Update table of offsets. + + CALL HWCP_PARMS ; Get code page number + CMP ERROR_FLAG,01H ; If error, then + JE EXIT_A ; Print error message and exit + CMP ERROR_FLAG,02H ; If end of string + JE EXIT_H ; Then exit. + + CALL DESG_PARMS ; Get designate number + CMP ERROR_FLAG,01H ; If error, then + JE EXIT_A ; Print error message and exit + JMP EXIT_H ; Then exit. + +EXIT_A: MOV DI,OFFSET TABLE ; Load table offset + MOV DS:WORD PTR [DI],00H ; Set error to on. + STC ; Set carry flag + JMP EXIT_P ; Exit parse. + +EXIT_H: MOV DI,OFFSET TABLE ; Load table offset. + ADD DS:WORD PTR [DI],01H ; Increment number of devices. + CMP DEVNUM,08H ; If 4 devices loaded + JE EXIT_C ; Then exit parse. + ADD DEVNUM,02H ; Increment the number of devices + ADD DI,DEVNUM ; Point at next devices offset. + MOV BX,TABLE_5 ; BX point at + ADD BX,06H ; end of previous table. + JMP TAB2 ; Get next device. + +EXIT_C: CLC + +EXIT_P: POP SI ; ;;;;;;;;;;;;;;;;;; + POP DI ; ; + POP ES ; ; RESTORE + POP DS ; ; ALL + POP DX ; ; REGISTERS. + POP CX ; ; + POP BX ; ; + POP AX ; ;;;;;;;;;;;;;;;;;; + RET + +PARSER ENDP + + +;******************************************************** +;** GET_CHAR : a routine to get next character pointed ** +;** to by ES:SI into AL. ** +;******************************************************** + +GET_CHAR PROC + + MOV AL,ES:BYTE PTR [SI] ; Load character pointed to + CMP AL,09H ; by ES:[SI] in AL. + JE ZOFF ; If tab then O.K + CMP AL,20H ; Turn Z-flag on + JL TURN_Z_ON ; if character +ZOFF: INC SI ; is below + JMP GET_CHAR_X ; 20h. + ; ( End of line +TURN_Z_ON: CMP AL,AL ; delimiters ). +GET_CHAR_X: RET + +GET_CHAR ENDP + + +;******************************************************** +;** IS_ALPHA : a routine to check the character in ** +;** AL if it is an alpha character (a...z,A...Z). ** +;** If character is lower case, convert to upper case. ** +;******************************************************** + +IS_ALPHA PROC + + PUSH AX ; Save value of AL + AND AL,0DFH ; Convert to upper case + CMP AL,'A' ; If <'A', then + JB IS_ALPHA_X ; NZ-flag is set, exit + CMP AL,'Z' ; If >'Z', then + JA IS_ALPHA_X ; NZ-flag is set, exit + CMP AL,AL ; Force Z-flag + POP DX ; Discard lower case. + JMP IA_X ; Exit. +IS_ALPHA_X: POP AX ; Restore value of AL +IA_X: RET + +IS_ALPHA ENDP + + +;******************************************************** +;** IS_DIGIT : a routine to check if the character in ** +;** AL register is a digit (i.e. 1..9). ** +;******************************************************** + +IS_DIGIT PROC + + CMP AL,'0' ; If < '0' then + JB IS_NUM_X ; NZ-flag is set, exit + CMP AL,'9' ; If > '9' then + JA IS_NUM_X ; NZ-flag is set, exit + CMP AL,AL ; Set Z-flag to indecate digit +IS_NUM_X: RET + +IS_DIGIT ENDP + + +;******************************************************** +;** IS_DELIM : This routine check if the character in ** +;** AL is a delimiter. ('+',' ',';',',','=',tab) ** +;******************************************************** + +IS_DELIM PROC + + CMP AL,' ' ; Test for space. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,',' ; Test for comma. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,';' ; Test for semicolon. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,'=' ; Test for equal sign. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,09h ; Test for TAB. + +IS_DELIM_X: RET ; Exit + +IS_DELIM ENDP + + +;******************************************************** +;** DEVICE_PARSE : Parse the device driver name and ** +;** store in table. Update offset. ** +;******************************************************** + +DEVICE_PARSE PROC + + MOV DI,TABLE_2 + MOV DS:WORD PTR [DI],0008H ; Save dev name size. + ADD DI,02H ; Increment DI. + MOV CX,9 ; Set counter. +NEXT_C: CALL IS_ALPHA ; if Check then. + JZ SAVE_C ; Save it. + CALL IS_DIGIT ; if Digit then. + JZ SAVE_C ; Save it. + CMP AL,'-' ; If '-' then. + JZ SAVE_C ; Save it. + CALL IS_DELIM ; If a delimiter then. + JZ ADD_SPACE1 ; Pad with spaces. + CMP AL,':' ; If a colon + JE ADD_SPACE1 ; then end device parse + JMP ERR_DEV_PAR ; Else an error. + +SAVE_C: DEC CX ; Decrement counter. + CMP CX,0 ; If counter zero then. + JE ERR_DEV_PAR ; Error. + MOV DS:BYTE PTR [DI],AL ; Save char in table. + INC DI ; Increment pointer. + CALL GET_CHAR ; Get another char. + JZ ERR_DEV_PAR + JMP NEXT_C ; Check char. + +ERR_DEV_PAR: MOV DEV_ERR_FLG,01H ; Set error flag. + JMP DEV_PAR_X ; Exit. + +ADD_SPACE1: DEC CX ; Check counter. + CMP CX,1 + JL DEV_PAR_X ; Exit if already 8. +LL1: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. + INC DI ; Increment pointer. + LOOP LL1 ; Loop again. +DEV_PAR_X: RET + +DEVICE_PARSE ENDP + + +;******************************************************** +;** ID_PARSE : Parse the id driver name and ** +;** store in table. Update offset. ** +;******************************************************** + +ID_PARSE PROC + + MOV DI,TABLE_3 + MOV DS:WORD PTR [DI],0008H ; Save dev name size. + ADD DI,02H ; Increment DI. + MOV RIGHT_FLAG,00H ; Clear flag. + MOV CX,9 ; Set counter. + +NEXT_I: CALL IS_ALPHA ; If Check then. + JZ SAVE_I ; Save it. + CALL IS_DIGIT ; if Digit then. + JZ SAVE_I ; Save it. + CMP AL,'-' ; If '-' then. + JZ SAVE_I ; Save it. + CMP AL,'(' ; If '(' then. + JE RIG_BR_FLG ; Set flag. + CMP AL,')' ; If ')' then + JE BR_FLG_LEF ; Pad with spaces. + CALL IS_DELIM ; If a delimiter then. + JZ ADD_SPACE2 ; Pad with spaces. + JMP ERR_ID_PAR ; Else an error. + +SAVE_I: DEC CX ; Decrement counter. + CMP CX,0 ; If counter zero then. + JLE ERR_ID_PAR ; Error. + MOV DS:BYTE PTR [DI],AL ; Save char in table. + INC DI ; Increment pointer. + CALL GET_CHAR ; Get another char. + JZ ADD_SPACE2 ; Exit routine. + JMP NEXT_I ; Check char. + +ERR_ID_PAR: MOV ID_ERR_FLG,01H ; Set error falg on. + JMP ID_PAR_X ; Exit. + +BR_FLG_LEF: CMP RIGHT_FLAG,01H ; If left bracket was + JNE ERR_ID_PAR ; found and no previous + JMP ADD_SPACE2 ; Bracket found, then error + +RIG_BR_FLG: CMP RIGHT_FLAG,01H ; If more than one bracket + JE ERR_ID_PAR ; then error. + CMP CX,09 ; If '(' and already id + JB ERR_ID_PAR ; then error. + MOV RIGHT_FLAG,01H ; Set flag for. + CALL GET_CHAR ; Left brackets. + JZ ERR_ID_PAR ; If end of line,exit. + JMP NEXT_I ; Check character. + +ADD_SPACE2: DEC CX ; Check counter. + CMP CX,1 + JL ID_PAR_X ; Exit if already 8. + +LL2: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. + INC DI ; Increment pointer. + LOOP LL2 ; Loop again. + +ID_PAR_X: RET + +ID_PARSE ENDP + +;******************************************************** +;** HWCP_PARMS : Scane for the hardware code page, and ** +;** parse it if found. Flag codes set to: ** +;** ERROR_FLAG = 0 - parsing completed. No error. ** +;** ERROR_FLAG = 1 - error found exit parse. ** +;** ERROR_FLAG = 2 - end of line found, exit parse. ** +;******************************************************** + + +HWCP_PARMS PROC + + MOV COMMA_FLAG,00H ; Set the comma flag off. + MOV ERROR_FLAG,00H ; Set the error flag off. + DEC SI ; Point at current char in Al. + CMP RIGHT_FLAG,01H ; If no left brackets then + JNE LEFT_BR ; Exit parse. + +HWCP_1: CALL GET_CHAR ; Load character in AL. + JZ LEFT_BR ; Exit, if end of line. + CALL IS_DIGIT ; Check if digit, then + JE HP1 ; Parse hwcp parms. + CMP AL,',' ; If a comma + JE COMMA_1 ; Jump to comma_1 + CMP AL,')' ; If a ')' then + JE RIGHT_BR ; end of current dev parms. + CMP AL,'(' ; If a '(' then + JE HWCP_2 ; There are multible hwcp. + CALL IS_DELIM ; Else, if not a delimiter + JNE EXIT_2 ; Then error, exit + JMP HWCP_1 ; Get another character. + +LEFT_BR: CMP RIGHT_FLAG,01H ; If no left bracket + JE EXIT_2 ; Then error, exit + JMP RB1 ; Jump to rb1 + +COMMA_1: CMP COMMA_FLAG,01H ; If comma flag set + JE COM_2_HC ; Then exit hwcp parse. + MOV COMMA_FLAG,01H ; Else set comma flag. +JMP HWCP_1 ; Get another character. + +HWCP_2: CMP RIGHT_FLAG,01H ; If left bracket not set + JNE EXIT_2 ; then error. + CALL MUL_HWCP ; else call multiple hwcp + ADD DI,02H ; routine. Increment DI + MOV TABLE_5,DI ; Desg. Table starts at end + CALL OFFSET_TABLE ; Update table of offsets. + JMP HP_X ; Exit. + +HP1: JMP HWCP ; Jump too long. + +COM_2_HC: MOV DI,TABLE_4 ; DI points at hwcp table + MOV DS:WORD PTR [DI],0000H ; Set number of pages to + MOV COMMA_FLAG,00H ; Zero and reset comma flag. + ADD DI,02H ; Increment DI. + MOV TABLE_5,DI ; Desg. Table starts at end + CALL OFFSET_TABLE ; Update table of offsets. + JMP HP_X ; of hwcp table. Exit. + +RIGHT_BR: CMP RIGHT_FLAG,01H ; If left brackets not + JNE EXIT_2 ; Found then error. +RB1: MOV ERROR_FLAG,02H ; Set end of line flag. + MOV BX,TABLE_4 ; Point at hwcp table + ADD BX,02H ; Adjust pointer to desg + MOV TABLE_5,BX ; table, and save in table_5 + MOV DI,TABLE_1 ; Point at table of offsets + ADD DI,08H ; Set at DESG offset + MOV DS:WORD PTR [DI],BX ; Update table. + JMP HP_X ; Exit + + + +EXIT_2: MOV ERROR_FLAG,01H ; Set error flag. + JMP HP_X ; and exit. + +HWCP: CMP RIGHT_FLAG,01H ; If left brackets not + JNE EXIT_2 ; Found then error. + CALL HWCP_PARSE ; Call parse one hwcp. + CMP ERROR_FLAG,01H ; If error flag set + JE HP_X ; Then exit, else + CALL OFFSET_TABLE ; Update table of offsets. + +HP_X: RET + +HWCP_PARMS ENDP + + +;******************************************************** +;** HWCP_PARSE : Parse the hardware code page page ** +;** number and change it from hex to binary. ** +;******************************************************** + +HWCP_PARSE PROC + + MOV DI,TABLE_4 ; Load address of hwcpages. + ADD DS:WORD PTR [DI],0001H ; Set count to 1 + + CALL GET_NUMBER ; Convert number to binary. + CMP ERROR_FLAG,01H ; If error then + JE HWCP_X ; Exit. + MOV DS:WORD PTR [DI+2],BX ; Else, save binary page number + ADD DI,04H ; Increment counter + MOV TABLE_5,DI ; Set pointer of designate num + +HWCP_X: RET + +HWCP_PARSE ENDP + + +;******************************************************** +;** MUL_HWCP : Parse multiple hardware code pages ** +;** and convert them from hex to binary numbers. ** +;******************************************************** + +MUL_HWCP PROC + + MOV DI,TABLE_4 ; Load offset of table_4 + MOV BX,DI ; in DI and Bx. + MOV HWCP_FLAG,00H ; Set hwcp flag off. + +MH1: CALL GET_CHAR ; Load character in AL. + JZ MH3 ; Exit if end of line. + CMP AL,')' ; If ')' then exit + JE MH2 ; end of parms. + CALL IS_DIGIT ; If a digit, then + JE MH4 ; Convert number to binary. + CALL IS_DELIM ; If not a delimiter + JNE MH3 ; then error, exit + JMP MH1 ; get another character. + +MH2: CALL GET_CHAR ; Get next character + JMP MH_X ; and exit. + +MH3: MOV ERROR_FLAG,01H ; Set error flag on. + JMP MH_X ; Exit. + +MH4: ADD HWCP_FLAG,01H ; Set hwcp flag on (0 off) + ADD DI,02H ; Increment table pointer + PUSH BX ; Save Bx + CALL GET_NUMBER ; Convert number to binary. + MOV DS:WORD PTR [DI],BX ; Add number to table + POP BX ; Restore BX. + CMP ERROR_FLAG,01H ; If error then + JE MH_X ; Exit. + ADD DS:WORD PTR [BX],01H ; Increment hwcp count. + DEC SI ; Point at character in AL + JMP MH1 ; (delimeter or ')'). +MH_X: RET + +MUL_HWCP ENDP + + + +;******************************************************** +;** DESG_PARMS : Scane for the designate numbers, and ** +;** parse it if found. Flag codes set to: ** +;** ERROR_FLAG = 0 - parsing completed. No error. ** +;** ERROR_FLAG = 1 - error found exit parse. ** +;** ERROR_FLAG = 2 - end of line found, exit parse. ** +;******************************************************** + + +DESG_PARMS PROC + + MOV DI,TABLE_1 ; Get offset of dev in DI + MOV BX,TABLE_5 ; & offset of desg. in BX. + ADD DI,08 ; Location of desg offset in table. + MOV DS:WORD PTR [DI],BX ; Update table. + MOV COMMA_FLAG,00H ; Set comma flag off. + + cmp al,'(' + je df + cmp al,')' + je right_br2 + + cmp al,',' + jne desg_parm1 + mov comma_flag,01h + +DESG_PARM1: CALL GET_CHAR ; Get character in AL. + JZ EXIT_3 ; Error, if end of line + CALL IS_DIGIT ; If character is a digit + JE DESG ; Then convert to binary. + CMP AL,')' ; If a ')', then + JE RIGHT_BR2 ; end of parameters. + CMP AL,'(' ; If a '(' then + JE DF ; parse desg and font. + CMP AL,',' ; If a comma then + JE DP3 ; set flag. + CALL IS_DELIM ; If not a delimiter + JNE EXIT_3 ; then error. + JMP DESG_PARM1 ; Get another character. + +RIGHT_BR2: CMP RIGHT_FLAG,01H ; IF no '(' encountered, + JNE EXIT_3 ; then error, exit + JMP DP_x ; Jump to DP1. + +EXIT_3: MOV ERROR_FLAG,01H ; Set error flag on + JMP DP_X ; Exit. + +DF: CMP RIGHT_FLAG,01H ; If no '(' encountered + JB EXIT_3 ; then error, exit + CALL DESG_FONT ; Parse desg and font. + JMP DP1 ; Jump to DP1. + +DP2: CALL FIND_RIGHT_BR ; Check for ')' + JMP DP_X ; Exit. + +DP3: CMP COMMA_FLAG,01H ; If comma flag set + JE DP2 ; then error + MOV COMMA_FLAG,01H ; Else set comma flag on. + JMP DESG_PARM1 ; Get another character. + +DESG: MOV ERROR_FLAG,00H ; Set error flag off. + CALL DESG_PARSE ; Parse desg. +DP1: CMP ERROR_FLAG,01H ; If error flag on then + JE DP_X ; Exit, + CALL FIND_RIGHT_BR ; Else check for ')' + CALL OFFSET_TABLE ; Update table + +DP_X: RET + +DESG_PARMS ENDP + + + +;******************************************************** +;** DESG_FONT : Parse the designate and font numbers & ** +;** change them from decimal to binary. ** +;******************************************************** + + +DESG_FONT PROC + + + MOV DI,TABLE_5 ; Get desg font table. + MOV COMMA_FLAG,00H ; Set comma flag off. +DF1: CALL GET_CHAR ; Load a character in AL. + JZ DF3 ; Error if end of line. + CMP AL,',' ; Check if a comma. + JE DF2 ; Set flag. + CALL IS_DIGIT ; If a digit, then + JE DF5 ; Convert number to binary. + CMP AL,')' ; If a ')' then + JE DF4 ; Exit. + CALL IS_DELIM ; If not a delimiter + JNE DF3 ; then error, exit + JMP DF1 ; Get another character. + +DF2: CMP COMMA_FLAG,01H ; If comma flag on + JE DF3 ; then error, exit + MOV COMMA_FLAG,01H ; Set comma flag on + ADD DS:WORD PTR [DI],01H ; Increment desg counter. + MOV DS:WORD PTR [DI+2],0FFFFH ; Load ffffh for desg empty + JMP DF1 ; field. + +DF3: MOV ERROR_FLAG,01H ; Set error flag on. + JMP DF_X ; Exit. + +DF4: CMP DESG_FLAG,00H ; If desg flag off + JE DF3 ; then error, exit + JMP DF_X ; Else exit. + +DF5: ADD DS:WORD PTR [DI],01H ; Increment desg font count. + CMP DESG_FLAG,01H ; If desg flag is on + JE DF6 ; then get font. + CMP COMMA_FLAG,01H ; if comma flag is on + JE DF6 ; then get font. + MOV DESG_FLAG,01H ; Set desg flag on + JMP DF7 ; Get desg number. + +DF6: ADD DI,02H ; adjust pointer to font. + MOV DESG_FLAG,02H ; Set desg and font flag. +DF7: CALL GET_NUMBER ; Get a number & convert to + CMP ERROR_FLAG,01H ; binary. + JE DF_X ; If error flag set, Exit. + MOV DS:WORD PTR [DI+2],BX ; Store number in table. + CMP DESG_FLAG,02H ; If desg and font flag + JNE DF1 ; not set, then get char. + CALL FIND_RIGHT_BR ; Check for right bracket. + +DF_X: RET + +DESG_FONT ENDP + + +;******************************************************** +;** DESG_PARSE : Parse the designate number and ** +;** change it from decimal to binary. ** +;******************************************************** + +DESG_PARSE PROC + + MOV DI,TABLE_5 ; Load designate location + ADD DS:WORD PTR [DI],0001H ; Update table count. + + CALL GET_NUMBER ; Get the ascii number and + CMP ERROR_FLAG,01H ; conver it to binary + JE DESG_X ; If error then exit + + MOV DS:WORD PTR [DI+2],BX ; Else, save desg number + + +DESG_X: RET + +DESG_PARSE ENDP + + +;******************************************************** +;** GET_NUMBER : Convert the number pointed to by SI ** +;** to a binary number and store it in BX ** +;******************************************************** + +GET_NUMBER PROC + + MOV CX,0AH ; Set multiplying factor + XOR BX,BX ; Clear DX + +NEXT_NUM: SUB AL,30H ; Conver number to binary + CBW ; Clear AH + XCHG AX,BX ; Switch ax and bx to mul + MUL CX ; already converted number by 10. + JO ERR_NUM ; On over flow jump to error. + ADD BX,AX ; Add number to total. + JC ERR_NUM ; On over flow jump to error. + XOR AX,AX ; Clear AX (clear if al=0a). + CALL GET_CHAR ; Get next character + JZ GET_NUM_X ; Exit, if end of line. + CALL IS_DIGIT ; Call is digit. + JNZ GET_NUM_X ; Exit if not a number. + JMP NEXT_NUM ; Loop. + +ERR_NUM: MOV ERROR_FLAG,01H ; Set error code to 1. + +GET_NUM_X: RET + +GET_NUMBER ENDP + + +;******************************************************** +;** UPDATE_TABLE : This routine set up pointers to the ** +;** different offsets of the different tables ** +;******************************************************** + +UPDATE_TABLE PROC + + MOV DS:WORD PTR [DI],BX ; Offset of offsets + MOV TABLE_1,BX ; Table_1 points at offsets + + MOV DI,BX ; + ADD BX,0CH ; + MOV DS:WORD PTR [DI+2],BX ; Offset of DEVICE name. + MOV TABLE_2,BX ; Table_2 point at device name. + + ADD BX,0AH ; + MOV DS:WORD PTR [DI+4],BX ; Offset of ID name. + MOV TABLE_3,BX ; Table_3 point at ID name. + + ADD BX,0AH ; + MOV DS:WORD PTR [DI+6],BX ; Offset of HWCP pages. + MOV TABLE_4,BX ; Table_4 point at HWCP pages. + + RET + +UPDATE_TABLE ENDP + + +;******************************************************** +;** OFFSET_TABLE : This routine set up pointers of ** +;** tables number one and two. ** +;******************************************************** + +OFFSET_TABLE PROC + + MOV DI,TABLE_1 ; Increment the number + ADD DS:WORD PTR [DI],01H ; of parms foun. (ie. id,hwcp + RET ; and desg) + +OFFSET_TABLE ENDP + + +;******************************************************** +;** FIND_RIGHT_BR :This routine scane the line for a ** +;** ')' if cannot find it turns error flag on ** +;******************************************************** + +FIND_RIGHT_BR PROC + +FBR1: CMP AL,')' ; If a right bracket + JE FBR_X ; then exit. + CMP AL,' ' ; If not a space + JNE FBR2 ; Then error. + CALL GET_CHAR ; Get a character + JZ FBR2 ; If end of line then exit. + JMP FBR1 ; Else get another character. + +FBR2: MOV ERROR_FLAG,01H ; Set error flag on +FBR_X: MOV AL,20H ; Erase character from AL. + RET + +FIND_RIGHT_BR ENDP + +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Command ++ +;; ++++++++++++++++++++++++ +;; +;;==== Command Code 0 - Initialization ====== +;; +;; messages returned : +;; +;; msg_bad_syntax -- syntax error from parser, no driver installation +;; msg_no_init -- device cannot be initialised +;; msg_insuff_mem -- insufficient memory +;; +;; layout : the initialization is done in two stages : +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 1 ++ to examine and extract the +;; ++++++++++++++++++++++++ parameters defined for the +;; device_id in DEVICE command, +;; according to the printer +;; description table for the +;; device_id. +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 2 ++ to set the BUFfer for the LPTn +;; ++++++++++++++++++++++++ or PRN according to device_id's +;; parameters +;; +;; +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ;; +DEV_NUM dw ? ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Tables for the deivce_id parameters in the order of device_id in the +; PARSE table +; === the tables serves as the link between LPTn to be defined in the 2nd +; stage, and the device_id that is processed in the first stage. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; device ID indicators : + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +DID_MAX EQU 4 ;; device entris exepcted in PARSE +;; not more than 16. ;; table + ;; +DID_STATUS DW 0 ;; status of parsing device id + ;; = 0 : all Device-ID bad + ;; -- see DID_BIT + ;; +DID_MATCH DW 0 ;; this DID has device_name matched + ;; +DID_FAIL DW 0 ;; to fail the good DID_STATUS and + ;; the matched name. (due to + ;; inconsistency among the same LPTn + ;; or between PRN and LPT1.) + ;; +;; (DID_STATUS) AND (DID_MATCH) XOR (DID_FAIL) determines the success of DID + ;; initialization + ;; +DID_ONE EQU 00001H ;; first device-ID +DID_TWO EQU 00002H ;; second " +DID_THREE EQU 00004H ;; third " +DID_FOUR EQU 00008H ;; fourth " +;;maximun number of device_id = 16 ;; + ;; +DID_BIT LABEL WORD ;; + DW DID_ONE ;; + DW DID_TWO ;; + DW DID_THREE ;; + DW DID_FOUR ;; +;;maximun number of device_id = 16 ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; device paramters according to the + ;; device_id defined in DEVICE and the + ;; parameters defined for the device_id + ;; in the printer description table. + ;; +HRMAX LABEL word ;; number of hwcp+cart slots supported + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +CTMAX LABEL word ;; number of cart slots supported + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +RMMAX LABEL word ;; number of ram-slots supported + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +RBUMAX LABEL word ;; number of ram-designate slots + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +DESCO LABEL word ;; offset to the description table + ;; where the device_id is defined. + DW -1 ;; did = 1 + DW -1 ;; did = 2 + DW -1 ;; did = 3 + DW -1 ;; did = 4 +;upto max DID_MAX ;; + ;; +FSIZE LABEL word ;; font size of the device + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Hard/RAM slots table in the order of DEVICE parameters +; +; number of entries in all HARD_SLn is determined by the max. {HSLOTS}, and +; number of entries in all RAM_SLn is determined by the max. {RSLOTS} +; +; -- they are initialized according to the device_id defined in the DEVICE. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +HARD_SLA LABEL word ;; index in the order of device in + DW OFFSET (HARD_SL1) ;; the PARSE-talbes + DW OFFSET (HARD_SL2) ;; + DW OFFSET (HARD_SL3) ;; + DW OFFSET (HARD_SL4) ;; +; up to DID_MAX ;; + ;; +RAM_SLA LABEL word ;; + DW OFFSET (RAM_SL1) ;; + DW OFFSET (RAM_SL2) ;; + DW OFFSET (RAM_SL3) ;; + DW OFFSET (RAM_SL4) ;; +; up to DID_MAX ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Command ++ +;; ++++++++++++++++++++++++ +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INIT PROC NEAR ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; parse the initialization parameters in DEVICE command +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; + ;; + CMP BUF.BFLAG,BF_PRN ;; since PRN is the FIRST device header + JNE NOT_PRN ;; + ;; + ;; + MOV AX,OFFSET CODE_END ;; defined only once for each DEVICE + XOR CX,CX ;; + MOV CL,4 ;; + SHR AX,CL ;; + PUSH CS ;; + POP CX ;; + ADD AX,CX ;; + INC AX ;; leave 16 bytes,room for resident_end + MOV RESIDENT_END,AX ;; + ;; + CALL PARSER ;; call only once, for PRM + ;; + JMP PROCESS_TABLE ;; + ;; +NOT_PRN : ;; + CMP DEV_NUM,1 ;; + ;; + JNB PROCESS_TABLE ;; + ;; + JMP SYNTAX_ERROR ;; + ;; + ;; + ;; +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 1 ++ +;; ++++++++++++++++++++++++ +;; +;; INIT - FIRST STAGE : +;; +;; == test and extract if the parameters on device-id is valid +;; == determine the DID_STATUS according to the validity of the parameters +;; == procedure(s) called -- DID_EXTRACT +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ;; +PROCESS_TABLE : ;; + ;; + PUSH CS ;; + POP ES ;; PSE points to Device offsets + MOV DI,OFFSET(table) ;; ES:[DI] + MOV DX,PSE.PAR_DEV_NUM ;; + MOV DEV_NUM,DX ;; + ;; + CMP DEV_NUM,0 ;; + JNZ NO_SYNTAX_ERR ;; + ;; + XOR AX,AX ;; + MOV AH,09H ;; + MOV DX,OFFSET MSG_BAD_SYNTAX;; + INT 21H ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SYNTAX_ERROR : ;; set the request header status + ;; according to the STATE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX, RESIDENT_END ;; + PUSH CS ;; + POP CX ;; CX=CS + SUB AX,Cx ;; additional segment required. +CS_LOOP1: ;; + CMP AX,1000H ;; + JB CS_LPEND1 ;; + ADD CX,1000H ;; + SUB AX,1000H ;; + JMP CS_LOOP1 ;; + ;; +CS_LPEND1: ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; get Request Header address +; MOV RH.RH0_ENDO,AX ;; + MOV RH.RH0_ENDO,0 ;; + MOV RH.RH0_ENDS,CX ;; + MOV RH.RHC_STA,stat_cmderr ;; set status in request header + ;; + JMP INIT_RETurn ;; + ;; + ;; +NO_SYNTAX_ERR : ;; + ;; + CMP DX,DID_MAX ;; + JNA NEXT_DID ;; + ;; + MOV INIT_CHK,0001H ;; ERROR 0001 + JMP BAD_DID ;; more than supported no. of device + ;; +NEXT_DID: ;; + PUSH DI ;; pointer to PAR_OT (table 1) + AND DX,DX ;; + JNZ SCAN_DESC ;; + JMP END_DID ;; DI = offset to the 1st PARSE table +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SCAN_DESC: ;; + MOV DI,PSE.PAR_OFF ;; points to the nth device + ;; + ;; find the description for the + ;;device-id + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV CX,PRINTER_DESC_NUM ;; + MOV SI, OFFSET(PRINTER_DESC_TBL); offset to the description table + PUSH CS ;; + POP DS ;; +; $SEARCH ;; +$$DO1: + PUSH CX ;; save device count + PUSH SI ;; pointer to printer-descn's offset + MOV SI,CS:WORD PTR[SI] ;; + AND CX,CX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $LEAVE Z ;; LEAVE if no more device description + JZ $$EN1 + PUSH DI ;; save offset to PAR_DEVOT + MOV DI,PSE.PAR_DIDO ;; + MOV CX,PSE.PAR_DIDL ;; length of parsed device name + LEA DI,PSE.PAR_DID ;; pointer to parse device name + ;; + PUSH SI ;; + LEA SI,[SI].TYPEID ;; offset to name of device-id + REPE CMPSB ;; + POP SI ;; + POP DI ;; get back offset to PAR_DEVOT + ;;;;;;;;;;;;;;;;;;;;;;;; +; $EXITIF Z ;; EXIT if name matched + JNZ $$IF1 + ;; + CALL DID_EXTRACT ;; get the parameters + ;; + POP SI ;; balance push-pop + POP CX ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $ORELSE ;; try next description : + JMP SHORT $$SR1 +$$IF1: + ;; + POP SI ;; of printer_descn offset table + INC SI ;; + INC SI ;; next offset to PRINTER_DESCn + ;; + POP CX ;; one description less + DEC CX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $ENDLOOP ;; DEVICE-ID not defined in + JMP SHORT $$DO1 +$$EN1: + ;; printer_desc; + ;; + MOV AX,INIT_CHK ;; + AND AX,AX ;; + JNZ UNCHANGED ;; + MOV INIT_CHK,0004H ;; ERROR 0004 +UNCHANGED: ;; + POP SI ;; balance push-pop + POP CX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $ENDSRCH ;; End of scanning printer_desc +$$SR1: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + POP DI ;; + INC DI ;; + INC DI ;; points to next device in PART_OT + DEC DX ;; + ;; + JMP NEXT_DID ;; + ;; +END_DID : ;; + POP DI ;; +BAD_DID : ;; + ;; + MOV AX,DID_STATUS ;; + AND AX,AX ;; + JNZ DEF_BUFFER ;; + ;; + JMP END_LPT ;; + ;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 2 ++ +;; ++++++++++++++++++++++++ +;; +;; INIT -- SECOND STAGE : +;; +;; == match the device_name extracted in stage 1 with the name of PRN or +;; LPTn +;; +;; == if the PRN/LPTn has never been defined before, then set up the BUF +;; for the PRN/LPTn if the DID_STATUS is good; otherwise message will +;; be generated indicating it cannot be initilized. +;; +;; == if there is PRN, LPT1 is also setup, and vice vera. IF both PRN and +;; LPT1 are on the DEVICE command, or there are multiple entries for +;; the same LPTn, the consistency is checked. It they are inconsistent +;; the associated LPTn or PRN is forced to fail by : DID_FAIL. +;; +;; == if the device_name on the DEVICE command is not one of the supported +;; PRN or LPTn, then DID_MATCH bit will not be set. An error message +;; will be generated for the device_name indicating it cannot be +;; initialized. +;; +;; == procedure(s) called : CHK_DID .. check DID parameters for device +;; whose name matched. +;; DEV_CHECK .. if device-name duplicated, or +;; there are both PRN/LPT1 : check +;; for consistent parameters. +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DEF_BUFFER : ;; + PUSH CS ;; + POP ES ;; PSE points to Device offsets + MOV DI,OFFSET(table) ;; ES:[DI] + xor cx,cx ;; device order in parse table +;SEARCH ;; +$$DO7: + PUSH DI ;; pointer to PAR_OT + PUSH CX ;; save device count + MOV DI,PSE.PAR_OFF ;; " " PAR_DEVOT + cmp cx,dev_num ;; + ;; +;LEAVE NB ;; LEAVE if no more device entry + jb MORE_DEVICE ;; + JMP $$EN7 +MORE_DEVICE : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; more parsed_device to be checked + PUSH DI ;; save offset to PAR_DEVOT + MOV DI,PSE.PAR_DNMO ;; + MOV CX,PSE.PAR_DNML ;; length of parsed device name + LEA DI,PSE.PAR_DNM ;; pointer to parse device name + ;; + LDS SI,DWORD PTR BUF.DEV_HDRO ; get the offset to device-n header + LEA SI,HP.DH_NAME ;; " offset to name of device-n + REPE CMPSB ;; + POP DI ;; get back offset to PAR_DEVOT + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;; +;EXITIF Z ;; EXIT if name matched + JZ NAME_MATCHED ;; + ;; + JMP MORE_PARSED_DEVICE ;; + ;; +NAME_MATCHED : ;; + ;; + POP CX ;; the DID order + PUSH BX ;; + MOV BX,CX ;; + ADD BX,BX ;; + MOV AX,DID_BIT[BX] ;; + OR DID_MATCH,AX ;; this DID matched + POP BX ;; + PUSH CX ;; + ;; + LEA SI,BUF.PAR_EXTRACTO ;; was the LPT1/PRN defined before ? + MOV AX,CS:[SI].PAR_DNMO ;; + CMP AX,0FFFFH ;; + ;; + JNE DEV_COMPARE ;; DI = PAR_DEVOT + ;;----------------------------------- + ;; + ;; no device previousely defined + MOV AX,PSE.PAR_DNMO ;; + MOV CS:[SI].PAR_DNMO,AX ;; define device parameters for LPTn + ;; + MOV AX,PSE.PAR_DIDO ;; + MOV CS:[SI].PAR_DIDO,AX ;; + ;; + MOV AX,PSE.PAR_HWCPO ;; + MOV CS:[SI].PAR_HWCPO,AX ;; + ;; + MOV AX,PSE.PAR_DESGO ;; + MOV CS:[SI].PAR_DESGO,AX ;; + ;; + MOV AX,PSE.PAR_PARMO ;; + MOV CS:[SI].PAR_PARMO,AX ;; + ;; + ;;--------------------------------- + CALL CHK_DID ;; define the STATE according to + ;; DID_STATUS + JMP MORE_PARSED_DEVICE ;; + ;; +DEV_COMPARE : ;;------------------------------- + ;; e.g. LPT1 and PRN shares one BUF. + ;; or duplicated device name + CALL DEV_CHECK ;; + ;; + CMP BUF.STATE,CPSW ;; + JNE DEV_COMPARE_FAIL ;; + ;; + JMP MORE_PARSED_DEVICE ;; + ;; +DEV_COMPARE_FAIL : ;; + ;; + POP CX ;; + POP DI ;; balance push-pop + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;$ORELSE ;; + JMP END_LPT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +MORE_PARSED_DEVICE : ;; name does not match + ;; + POP CX ;; + INC CX ;; + POP DI ;; + INC DI ;; + INC DI ;; points to next device in PART_OT + ;; + jmp $$DO7 ;; +;$ENDLOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +$$EN7: ;; no device found for LPTn + ;; + POP CX ;; + POP DI ;; balance push-pop + ;; + CMP BUF.STATE,CPSW ;; + JE END_LPT ;; for LPT1/PRN pair + ;; + MOV BUF.STATE,NORMAL ;; no device defined for the LPTn + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; End of defining LPTn Buffer + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;$ENDSRCH ;; +END_LPT : ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; set the request header status + ;; according to the STATE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX, RESIDENT_END ;; + PUSH CS ;; + POP CX ;; CX=CS + SUB AX,Cx ;; additional segment required. +CS_LOOP2: ;; + CMP AX,1000H ;; + JB CS_LPEND2 ;; + ADD CX,1000H ;; + SUB AX,1000H ;; + JMP CS_LOOP2 ;; + ;; +CS_LPEND2: ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; get Request Header address + MOV RH.RH0_ENDO,AX ;; + MOV RH.RH0_ENDS,CX ;; + XOR AX,AX ;; clear error code to be returned + MOV CX,BUF.STATE ;; + CMP CX,CPSW ;; + JE MATCH_GOOD ;; + MOV AX,STAT_CMDERR ;; + ;; +MATCH_GOOD : ;; + MOV RH.RHC_STA,AX ;; set status in request header + ;; +BUF_END : ;; + ;; + CMP BUF.BFLAG,BF_LPT1 ;; + JNE BUF_MESSAGES ;; + ;; + CMP BUF.STATE,CPSW ;; + JNE BUF_MESSAGES ;; + ;; set PRN to the same setting as LPT1 + PUSH BX ;; + ;; + LEA SI,BUF.RNORMO ;; + LEA CX,BUF.BUFEND ;; + SUB CX,SI ;; + MOV BX,BUF.PRN_BUFO ;; where PRN buffer is + LEA DI,BUF.RNORMO ;; + PUSH CS ;; + POP ES ;; + PUSH CS ;; + POP DS ;; + REP MOVSB ;; + ;; + POP BX ;; + ;; +BUF_MESSAGES : ;; + CMP BUF.BFLAG,BF_LPT3 ;; generate error message is this is + je last_round ;; the last LPTn + Jmp INIT_RETURN ;; + ;; ERROR messages will be generated + ;; at the end of initialization of all + ;; the LPT devices +last_round : ;; + MOV AX,RESIDENT_END ;; + ADD AX,STACK_SIZE ;; + MOV RESIDENT_END,AX ;; + PUSH CS ;; + POP CX ;; CX=CS + SUB AX,Cx ;; additional segment required. +CS_LOOP3: ;; + CMP AX,1000H ;; + JB CS_LPEND3 ;; + ADD CX,1000H ;; + SUB AX,1000H ;; + JMP CS_LOOP3 ;; + ;; +CS_LPENd3: ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + ;; + MOV RH.RH0_ENDO,AX ;; STACK !!!!! + MOV STACK_ALLOCATED,0 ;; from now on, internal stack is used + ;; + MOV AX,DID_STATUS ;; what is the DID combination ? + AND AX,DID_MATCH ;; + XOR AX,DID_FAIL ;; + ;; + AND AX,AX ;; + JNZ CODE_STAYED ;; +; MOV RH.RH0_ENDO,0 ;; none of the devices are good + ;; + ;; +CODE_STAYED : ;; + MOV DI,OFFSET TABLE ;; + push CS ;; + POP ES ;; + ;; + XOR CX,CX ;; +MSG_LOOP : ;; + CMP CX,DEV_NUM ;; + JNB INIT_RETURN ;; + SHR AX,1 ;; + JC MSG_NEXT ;; + ;; this device in parse table is bad + PUSH DI ;; + PUSH CX ;; + PUSH AX ;; + ;; + MOV DI,PSE.PAR_OFF ;; + MOV SI,PSE.PAR_DNMO ;; + ;; + PUSH CS ;; + POP ES ;; + PUSH CS ;; + POP DS ;; + ;; + MOV CX,8 ;; + LEA SI,[SI].PAR_DNM ;; + ;; + MOV DI,SI ;; + ADD DI,7 ;; skip backward the blanks + MOV AL,20H ;; + STD ;; + REPE SCASB ;; + CLD ;; + ;; + MOV DI, OFFSET MSG_NO_INIT_P;; + MOV DX,DI ;; for INT 21H + XOR AX,AX ;; + MOV AH,09H ;; + INT 21H ;; + ;; + ;; + MOV DI, OFFSET MSG_NO_INIT ;; + MOV DX,DI ;; for INT 21H + ;; + INC CX ;; + ;; + PUSH CX ;; remaining name that is non blank + MOV AX,CX ;; + MOV CX,8 ;; + SUB CX,AX ;; + ADD DI,CX ;; + MOV DX,DI ;; + POP CX ;; + REP MOVSB ;; + ;; + ;; + XOR AX,AX ;; + MOV AH,09H ;; + INT 21H ;; + ;; + POP AX ;; + POP CX ;; + POP DI ;; + ;; +MSG_NEXT : ;; + INC CX ;; + INC DI ;; + INC DI ;; + JMP MSG_LOOP ;; + ;; + ;; +INIT_RETURN : ;; + ;; + ;; + RET ;; + ;; +INIT ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Call by INIT to extract parameters for the deivce_id +;; +;; on rntry : +;; ES:[DI] PARSE Table 2, offsets of all parameters +;; DS:[SI] Printer Description table whose TYPEID matched +;; DX "inverse" order of devices in the PARSE tables +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +DID_EXTRACT PROC ;; + ;; + PUSH DX ;; + ;;----------------------------- + ;; define the DID_parameters + PUSH BX ;; + ;; + MOV BX,DEV_NUM ;; + SUB BX,DX ;; order in the Parse table + add bx,bx ;; double to index [bx] + MOV DX,BX ;; + ;; + MOV AX,DS:[SI].FONTSZ ;; + MOV FSIZE[BX],AX ;; size of font buffer to be created + ;; + MOV AX,DS:[SI].HSLOTS ;; + CMP AX,HARDSL_MAX ;; + JNA LESS_HARDSL ;; + MOV INIT_CHK, 0010H ;; ERROR 0010H + POP BX ;; + JMP END_MATCH_BAD ;; +LESS_HARDSL : ;; + CMP AX,DS:[SI].HWCPMIN ;; + JNB VALID_HARDSL ;; + MOV INIT_CHK, 0012H ;; ERROR 0012H + POP BX ;; + JMP END_MATCH_BAD ;; +VALID_HARDSL : ;; + MOV HRMAX[BX],AX ;; + MOV CTMAX[BX],AX ;; will be reduced by the no. of hwcp + ;; + MOV AX,DS:[SI].RSLOTS ;; + CMP AX,RAMSL_MAX ;; + JNA LESS_RAMSL ;; + MOV INIT_CHK, 0011H ;; ERROR 0011H + POP BX ;; + JMP END_MATCH_BAD ;; +LESS_RAMSL : ;; + MOV RMMAX[BX],AX ;; see also designate + ;; + MOV DESCO[BX],SI ;; + ;; + POP BX ;; + ;;---------------------------------- + ;; + PUSH CX ;; + ;; +HWCPgt: PUSH DI ;; get the hwcp + ;; + MOV DI,PSE.PAR_HWCPO ;; + MOV CX,PSE.PAR_HWCPL ;; no. of hwcp + AND CX,CX ;; + JNZ chk_hwcp ;; + push bx ;; + mov bx,dx ;; + MOV HRMAX[BX],CX ;; + MOV CX,DS:[SI].HWCPMIN ;; + SUB CTMAX[BX],CX ;; what is left becomes cartridge slot + pop bx ;; + JMP DESIGN ;; + ;; hwcp to be defined +chk_hwcp: MOV AX,DS:[SI].HSLOTS ;; defined in printer_desc + CMP CX,AX ;; + JA BAD_MATCH2 ;; + CMP CX,HARDSL_MAX ;; + JNA HWCP_GOOD ;; jump if system error + MOV INIT_CHK,0003H ;; ERROR 0003 + JMP END_MATCH ;; +BAD_MATCH2: ;; + MOV INIT_CHK,0002H ;; ERROR 0002 + JMP END_MATCH ;; + ;; +HWCP_GOOD: ;; there are sufficient hard-slot for + ;; HWCP + PUSH SI ;; printer description table of TYPEID + PUSH BX ;; + ;; + MOV BX,DX ;; + MOV AX,CTMAX[BX] ;; + ;; + PUSH CX ;; calculate what is left for cart_slot + CMP CX,DS:[SI].HWCPMIN ;; + JNB MORE_THAN_HWCPMIN ;; + MOV CX,DS:[SI].HWCPMIN ;; +MORE_THAN_HWCPMIN : ;; + SUB AX,CX ;; + POP CX ;; + mov HRMAX[BX],CX ;; + ;; + MOV CTMAX[BX],AX ;; no of cart-slot for designate + MOV SI,HARD_SLA[BX] ;; get the corresponding hard-slots + ;; + POP BX ;; + ;; + push bx ;; + push dx ;; + mov bx,si ;; + mov dx,cx ;; + mov reserved1,dx ;; IF THERE IS ANY REPETITIVE HWCP + mov reserved2,bx ;; IF THERE IS ANY REPETITIVE HWCP + ;; +FILL_HWCP: ;; + AND CX,CX ;; + JZ DESIGN_P ;; + INC DI ;; next code page in PARSE table + INC DI ;; + MOV AX,ES:[DI] ;; get code page value + ;; + ;; IF THERE IS ANY REPETITIVE HWCP + push dx ;; + push bx ;; +hwcp_norep : ;; + cmp ax,cs:[bx].slt_cp ;; + jne hwcp_repnext ;; + pop bx ;; + pop dx ;; + pop dx ;; + pop bx ;; + pop si ;; + jmp end_match ;; + ;; +hwcp_repnext: ;; + inc bx ;; + inc bx ;; + inc bx ;; + inc bx ;; + dec dx ;; + jnz hwcp_norep ;; + pop bx ;; + pop dx ;; + ;; + MOV CS:[SI].SLT_CP,AX ;; + MOV AX,CS:[SI].SLT_AT ;; get the attributes + OR AX,AT_OCC ;; occupied + OR AX,AT_HWCP ;; hwcp slot + MOV CS:[SI].SLT_AT,AX ;; + INC SI ;; + INC SI ;; next slot + INC SI ;; next slot + INC SI ;; next slot + DEC CX ;; + JMP FILL_HWCP ;; +DESIGN_P: ;; + pop dx ;; + pop bx ;; + POP SI ;; + ;;--------------------- +DESIGN: POP DI ;; get the designate no. + PUSH DI ;; + ;; + MOV DI,PSE.PAR_DESGO ;; + MOV AX,PSE.PAR_DESGL ;; + CMP AX,1 ;; + JA END_MATCH ;; there should have no font entry + AND AX,AX ;; + JZ DEF_RBUFMAX ;; + ;; + MOV AX,PSE.PAR_DESG ;; + AND AX,AX ;; + JZ DEF_RBUFMAX ;; + ;; + CMP CS:[SI].CLASS,1 ;; + JNE DESIG_NOt_CLASS1 ;; + ;; + PUSH BX ;; if there is any cartridge slot ? + PUSH AX ;; + MOV BX,DX ;; + MOV AX,ctmax[BX] ;; + AND AX,AX ;; + POP AX ;; + POP BX ;; + JZ END_MATCH ;; fail, as there is no physical RAM. + ;; + CMP AX,HARDSL_MAX ;; is the designate more than max ? + JA END_MATCH ;; + ;; + ;; + JMP DEF_RBUFMAX ;; + ;; + ;; + ;; +DESIG_NOT_CLASS1 : ;; + PUSH BX ;; if there is any physical RAM slot ? + PUSH AX ;; + MOV BX,DX ;; + MOV AX,RMMAX[BX] ;; + AND AX,AX ;; + POP AX ;; + POP BX ;; + JZ END_MATCH ;; fail, as there is no physical RAM. + ;; + ;; + CMP AX,RAMSL_MAX ;; is the designate more than max ? + JA END_MATCH ;; + ;; +DEF_RBUFMAX : ;; + PUSH BX ;; + MOV BX,DX ;; + MOV RBUMAX[BX],AX ;; + POP BX ;; + ;; + ;; +PARAM : ;; +;PARM: POP DI ;; +; PUSH DI ;; +;; MOV DI,PSE.PAR_PARMO ;; + ;; + ;,-------------------------- + ;; GOOD device_id parameters + shr dx,1 ;; + MOV AX,DID_ONE ;; + MOV CX,DX ;; + AND CX,CX ;; + JZ NO_SHL ;; + SHL AX,CL ;; +NO_SHL: OR DID_STATUS,AX ;; is defined + ;;------------------------- +END_MATCH: POP DI ;; end of extract + POP CX ;; +END_MATCH_BAD : ;; + POP DX ;; + ;; + RET ;; + ;; +DID_EXTRACT ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Called by INIT to define the STATE and BUF for the LPTn according to +;; the DID_STATUS. Create font buffer if requested through the "desi*nate" +;; +;; at entry : CX = device order in parse table +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CHK_DID PROC ;; + ;; + push cx ;; + push di ;; + push dx ;; + ;; + MOV AX,DID_STATUS ;; + ;; + PUSH CX ;; order 0 to m + POP DI ;; + ADD DI,DI ;; indexing : [DI] + ;; + INC CX ;; + SHR AX,CL ;; is the device parameter valid ? + ;; + JC DEFINE_BUFFER ;; + JMP LPT_FAIL ;;-------------------------- + ;; +DEFINE_BUFFER : ;; + ;; good device parameters as determined + MOV AX,DESCO[DI] ;; + MOV BUF.PDESCO,AX ;; + ;; + PUSH DI ;; + MOV DI,AX ;; + MOV AX,CS:[DI].CLASS ;; + MOV BUF.PCLASS,AX ;; + POP DI ;; + ;; + MOV AX,HARD_SLA[DI] ;; in the DID_EXTRACT + MOV BUF.HARDSO,AX ;; + ;; + MOV AX,RAM_SLA[DI] ;; + MOV BUF.RAMSO,AX ;; + ;; + MOV AX,HRMAX[DI] ;; + MOV BUF.HARDMX,AX ;; + ;; + MOV AX,CTMAX[DI] ;; + MOV BUF.HCARMX,AX ;; + ;; + ADD AX,HRMAX[DI] ;; defore "designate" + MOV BUF.HSLMX,AX ;; + ;; + ;; + MOV AX,RMMAX[DI] ;; + MOV BUF.RAMMX,AX ;; + ;; + XOR AX,AX ;; + PUSH CX ;; calculate the max. length of control + MOV CX,2 ;; sequence that is allowed for the + CMP BUF.PCLASS,1 ;; room reserved for physical slots. + JNE CTL_LOOP ;; + MOV CX,1 ;; class 1 printer has one control seq. +CTL_LOOP : ;; + ADD AX,CTL_MAX ;; + DEC AX ;; leave one byte for the length + DEC CX ;; + JNZ CTL_LOOP ;; + MOV BUF.FSELMAX,AX ;; + POP CX ;; + ;; + MOV AX,FSIZE[DI] ;; + MOV BUF.FTSZPA,AX ;; FTSIZE in paragraph + ;; + PUSH AX ;; + ;; + MOV DX,4 ;; +FT_PARA: ;; + ADD AX,AX ;; + DEC DX ;; + JNZ FT_PARA ;; font size + MOV BUF.FTSIZE,AX ;; font size in bytes (used with.RBUFMX) + ;; + POP DX ;; FTSIZE in paragraph + ;; + MOV CX,RBUMAX[DI] ;; create font buffer per .RBUFMX and + MOV BUF.RBUFMX,CX ;; assume sufficient memory for all the + ;; "designate request" + PUSH CX ;; + ;; + CMP BUF.PCLASS,1 ;; always create font buffer for class1 + JNE CLASS_NOT_1 ;; + ;; + AND CX,CX ;; + JZ CLASS1_NOCX ;; + ADD CX,BUF.HARDMX ;; + MOV BUF.HSLMX,CX ;; + JMP CLASS_NOT_1 ;; + ;; +CLASS1_NOCX: ;; + MOV CX,BUF.HSLMX ;; + ;; +CLASS_NOT_1 : ;; + AND CX,CX ;; + JZ MULTIPLE_DONE ;; + MOV AX,RESIDENT_END ;; +MULTIPLE_FT : ;; + ADD AX,DX ;; allocate the font buffers at the end + DEC CX ;; of the resident codes + JNZ MULTIPLE_FT ;; + ;; + ;; + MOV CX,RESIDENT_END ;; + MOV BUF.FTSTART,CX ;; + MOV RESIDENT_END,AX ;; + ;; + ;; +MULTIPLE_DONE : ;; + POP CX ;; designate requested + ;; + CMP BUF.PCLASS,1 ;; + JNE DEF_RBUF ;; + ;; CLASS 1 + CMP BUF.HARDMX,0 ;; + JE DEFBUF_DONE ;; + ;; + PUSH CX ;; STACKS... + PUSH SI ;; + PUSH DS ;; + PUSH ES ;; + PUSH DI ;; + PUSH DX ;; + ;; + MOV DX,BUF.HARDMX ;; + PUSH DX ;; STACK +1 -- # of HWCP + ;; + PUSH CS ;; + POP DS ;; + MOV BUF.RBUFMX,0 ;; + MOV SI,BUF.PDESCO ;; + MOV SI,CS:[SI].SELH_O ;; + XOR CX,CX ;; + MOV CL,CS:BYTE PTR [SI] ;; + INC CX ;; including the length byte + ;; + MOV DI,BUF.FTSTART ;; control template +DEF_FTBUF: ;; fill the font buffer with the + PUSH DI ;; + POP ES ;; + XOR DI,DI ;; + ;; + PUSH CX ;; + PUSH SI ;; + REP MOVSB ;; + POP SI ;; + POP CX ;; + ;; + PUSH ES ;; + POP DI ;; + ADD DI,BUF.FTszpa ;; + DEC DX ;; + JNZ DEF_FTBUF ;; + ;; + POP DX ;; STACK -1 + ;; + MOV SI,BUF.HARDSO ;; + MOV DI,BUF.FTSTART ;; define the HWCP values +DEF_FThwcp : ;; + PUSH DI ;; + POP ES ;; + MOV DI,CTL5202_OFFS ;; offset to the HWCP words + ;; + MOV AX,CS:[SI].SLT_CP ;; + MOV ES:WORD PTR [DI],AX ;; + ;; + INC SI ;; + INC SI ;; + INC SI ;; + INC SI ;; + ;; + PUSH ES ;; + POP DI ;; + ADD DI,BUF.FTSZPA ;; + DEC DX ;; + JNZ DEF_FThwcp ;; + ;; + POP DX ;; + POP DI ;; + POP ES ;; + POP DS ;; + POP SI ;; + POP CX ;; + ;; + JMP DEFBUF_DONE ;; + ;; + ;; +DEF_RBUF : ;; + MOV BUF.RSLMX,CX ;; the no. of ram slots supported + CMP CX,RMMAX[DI] ;; + JNB DEFBUF_DONE ;; + MOV AX,RMMAX[DI] ;; + MOV BUF.RSLMX,AX ;; the max. of .RAMMX and .RBUFMX + ;; +DEFBUF_DONE : ;; + MOV BUF.STATE,CPSW ;; the LPTn is CPSW ----- STATE + ;; + CMP BUF.BFLAG,BF_PRN ;; + JNE RET_CHK_DID ;; + MOV AX,DID_BIT[DI] ;; + MOV BUF.DID_PRN,AX ;; + ;; + ;; + JMP RET_CHK_DID ;; + ;; +LPT_FAIL: ;; + ;; + MOV BUF.STATE,NORMAL ;; the LPTn is NORMAL --- STATE + ;; + ;; +RET_CHK_DID: ;; + ;; + pop dx ;; + pop di ;; + pop cx ;; + ;; + RET ;; + ;; +CHK_DID ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Called by INIT to check for consistency between duplicated device name and +;; between PRN and LPT1 +;; +;; at entry : DI = pointer to PAR_DEVOT +;; BUF.STATE = any state +;; CX = DID order +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +DEV_CHECK PROC ;; + ;; + LEA SI,BUF.PAR_EXTRACTO ;; + ;; + PUSH CX ;; + ;; + PUSH SI ;; compare device id + PUSH DI ;; + mov SI,[SI].PAR_DIDO ;; + MOV DI,PSE.PAR_DIDO ;; + MOV CX,PSE.PAR_DNML ;; + INC CX ;; including length + INC CX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + Jz hwcp_check ;; + mov init_chk,0021h ;; error 0021h + Jmp FORCE_LPT_BAD ;; + ;; +hwcp_check : ;; + PUSH SI ;; compare HWCP + PUSH DI ;; + mov SI,[SI].PAR_HWCPO ;; + MOV DI,PSE.PAR_HWCPO ;; + MOV AX,PSE.PAR_HWCPL ;; + MOV CX,2 ;; + SHL AX,CL ;; multiply by two + INC AX ;; including length + INC AX ;; + MOV CX,AX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + Jz desig_check ;; + mov init_chk,0022h ;; error 0022h + Jmp FORCE_LPT_BAD ;; + ;; +desig_check : ;; + PUSH SI ;; compare DESIGNATE + PUSH DI ;; + mov SI,[SI].PAR_DESGO ;; + MOV DI,PSE.PAR_DESGO ;; + MOV AX,PSE.PAR_DESGL ;; + MOV CX,2 ;; + SHL AX,CL ;; multiply by two + INC AX ;; including length + INC AX ;; + MOV CX,AX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + Jz param_check ;; + mov init_chk,0023h ;; error 0023h + Jmp FORCE_LPT_BAD ;; + ;; +param_check : ;; + PUSH SI ;; compare parameters + PUSH DI ;; + mov SI,[SI].PAR_PARMO ;; + MOV DI,PSE.PAR_PARMO ;; + MOV CX,PSE.PAR_PARML ;; + INC CX ;; including length + INC CX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + JZ M_END ;; + mov init_chk,0024h ;; error 0024h + ;; +FORCE_LPT_BAD : ;; the second set of parameters is + MOV BUF.STATE,NORMAL ;; bad + ;; + CMP BUF.BFLAG,BF_LPT1 ;; + JNE M_END ;; + ;; + ;; since LPT1 is bad, force PRN to bad + push bx ;; force prn to be bad too + mov bx,buf.prn_bufo ;; + MOV BUF.STATE,NORMAL ;; + pop bx ;; + ;; + mov AX,BUF.DID_PRN ;; if PRN was not good, DID_PRN = 0 + OR DID_FAIL,AX ;; + ;; + ;; +M_END: ;; force the good did_status to fail if + ;; STATE is bad + POP CX ;; + PUSH CX ;; order 0 to m + MOV AX,DID_STATUS ;; + ;; + INC CX ;; + SHR AX,CL ;; + POP CX ;; + JNC DEV_CHECK_RET ;; already failed + ;; + CMP BUF.STATE,CPSW ;; + JE DEV_CHECK_RET ;; + ;; + PUSH BX ;; + MOV BX,CX ;; + ADD BX,BX ;; + MOV AX,DID_BIT[BX] ;; + OR DID_FAIL,AX ;; force DID to fail + POP BX ;; + ;; + ;; +DEV_CHECK_RET : ;; + ;; + RET ;; + ;; + ;; +DEV_CHECK ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +CSEG ENDS + END diff --git a/v4.0/src/DEV/PRINTER/CPSPI07.ASM b/v4.0/src/DEV/PRINTER/CPSPI07.ASM new file mode 100644 index 0000000..740b136 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPI07.ASM @@ -0,0 +1,1416 @@ + + PAGE ,132 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Printer Device Driver INIT module (CPSPInn) +;; MODULE NAME: +;; TYPE: Assemble file (non-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 +;; +;; LAYOUT : This file is divided into two main section : +;; ++++++++++++++++++++++++ +;; ++ DEVICE Parser ++ +;; ++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Command ++ +;; ++++++++++++++++++++++++ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INCLUDE CPSPEQU.INC ;; +INT2F_LOW EQU (4*2FH) ;; WGR interrupt 2F vector location ;AN000; +INT2F_HI EQU (4*2FH)+2 ;; WGR ;AN000; + ;; +.XLIST ;; +INCLUDE SYSMSG.INC ;; WGR ;AN000; +.LIST ;; + ;; +MSG_UTILNAME ;; WGR ;AN000; + ;; +PUBLIC INIT ;; +PUBLIC CODE_END ;; for MAP listing only +PUBLIC RESIDENT_END ;; +PUBLIC STACK_ALLOCATED ;; + ;; + ;; +EXTRN PRINTER_DESC_NUM:WORD ;; +EXTRN PRINTER_DESC_TBL:WORD ;; +EXTRN INIT_CHK:WORD,TABLE:WORD ;; +EXTRN HARD_SL1:BYTE,RAM_SL1:BYTE ;; +EXTRN HARD_SL2:BYTE,RAM_SL2:BYTE ;; +EXTRN HARD_SL3:BYTE,RAM_SL3:BYTE ;; +EXTRN HARD_SL4:BYTE,RAM_SL4:BYTE ;; +EXTRN RESERVED1:WORD,RESERVED2:WORD ;; + ;; + ;; + ;; +CSEG SEGMENT PARA PUBLIC 'CODE' ;; + ASSUME CS:CSEG ;; + ;; + ;; +EXTRN PARSER:NEAR ;; WGR ;AN000; +EXTRN ROM_INT2F:WORD ;; WGR ;AN000; +EXTRN INT2F_COM:NEAR ;; WGR ;AN000; +EXTRN ABORT:BYTE ;; WGR ;AN000; + +CODE_END EQU $ ;; end of resident code + ;; + DW 0 ;; -- there are 16 bytes kept, + ;; including this word + ;; +RESIDENT_END DW 0FFFH ;; end of extended resident area +STACK_ALLOCATED DW -1 ;; end of extended resident area + ;; + DW 150 DUP(0) ;; need some space here. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; End of resident code +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Command ++ +;; ++++++++++++++++++++++++ +;; +;;==== Command Code 0 - Initialization ====== +;; +;; messages returned : +;; +;; msg_bad_syntax -- syntax error from parser, no driver installation +;; msg_no_init -- device cannot be initialised +;; msg_insuff_mem -- insufficient memory +;; +;; layout : the initialization is done in two stages : +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 1 ++ to examine and extract the +;; ++++++++++++++++++++++++ parameters defined for the +;; device_id in DEVICE command, +;; according to the printer +;; description table for the +;; device_id. +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 2 ++ to set the BUFfer for the LPTn +;; ++++++++++++++++++++++++ or PRN according to device_id's +;; parameters +;; +;; +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ;; +DEV_NUM dw ? ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Tables for the deivce_id parameters in the order of device_id in the +; PARSE table +; === the tables serves as the link between LPTn to be defined in the 2nd +; stage, and the device_id that is processed in the first stage. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; device ID indicators : + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +DID_MAX EQU 4 ;; device entris exepcted in PARSE +;; not more than 16. ;; table + ;; +DID_STATUS DW 0 ;; status of parsing device id + ;; = 0 : all Device-ID bad + ;; -- see DID_BIT + ;; +DID_MATCH DW 0 ;; this DID has device_name matched + ;; +DID_FAIL DW 0 ;; to fail the good DID_STATUS and + ;; the matched name. (due to + ;; inconsistency among the same LPTn + ;; or between PRN and LPT1.) + ;; +;; (DID_STATUS) AND (DID_MATCH) XOR (DID_FAIL) determines the success of DID + ;; initialization + ;; +DID_ONE EQU 00001H ;; first device-ID +DID_TWO EQU 00002H ;; second " +DID_THREE EQU 00004H ;; third " +DID_FOUR EQU 00008H ;; fourth " +;;maximun number of device_id = 16 ;; + ;; +DID_BIT LABEL WORD ;; + DW DID_ONE ;; + DW DID_TWO ;; + DW DID_THREE ;; + DW DID_FOUR ;; +;;maximun number of device_id = 16 ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; device paramters according to the + ;; device_id defined in DEVICE and the + ;; parameters defined for the device_id + ;; in the printer description table. + ;; +HRMAX LABEL word ;; number of hwcp+cart slots supported + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +CTMAX LABEL word ;; number of cart slots supported + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +RMMAX LABEL word ;; number of ram-slots supported + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +RBUMAX LABEL word ;; number of ram-designate slots + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +DESCO LABEL word ;; offset to the description table + ;; where the device_id is defined. + DW -1 ;; did = 1 + DW -1 ;; did = 2 + DW -1 ;; did = 3 + DW -1 ;; did = 4 +;upto max DID_MAX ;; + ;; +FSIZE LABEL word ;; font size of the device + DW 0 ;; did = 1 + DW 0 ;; did = 2 + DW 0 ;; did = 3 + DW 0 ;; did = 4 +;upto max DID_MAX ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Hard/RAM slots table in the order of DEVICE parameters +; +; number of entries in all HARD_SLn is determined by the max. {HSLOTS}, and +; number of entries in all RAM_SLn is determined by the max. {RSLOTS} +; +; -- they are initialized according to the device_id defined in the DEVICE. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +HARD_SLA LABEL word ;; index in the order of device in + DW OFFSET (HARD_SL1) ;; the PARSE-talbes + DW OFFSET (HARD_SL2) ;; + DW OFFSET (HARD_SL3) ;; + DW OFFSET (HARD_SL4) ;; +; up to DID_MAX ;; + ;; +RAM_SLA LABEL word ;; + DW OFFSET (RAM_SL1) ;; + DW OFFSET (RAM_SL2) ;; + DW OFFSET (RAM_SL3) ;; + DW OFFSET (RAM_SL4) ;; +; up to DID_MAX ;; + ;; +SUB_SIZE EQU 11 ;; WGR sublist size ;AN000; +LEFT_ASCIIZ EQU 00010000B ;; WGR left-aligned asciiz string ;AN000; +UNLIMITED EQU 0 ;; WGR unlimited message size. ;AN000; + ;; WGR ;AN000; +SUBLIST LABEL DWORD ;; WGR ;AN000; + DB SUB_SIZE ;; WGR ;AN000; + DB 0 ;; WGR ;AN000; +MSG_PTR DW ? ;; WGR ;AN000; +MSG_SEG DW SEG CSEG ;; WGR ;AN000; + DB 1 ;; WGR ;AN000; + DB LEFT_ASCIIZ ;; WGR ;AN000; + DB UNLIMITED ;; WGR ;AN000; + DB 1 ;; WGR ;AN000; + DB " " ;; WGR ;AN000; + ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Command ++ +;; ++++++++++++++++++++++++ +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +INIT PROC NEAR ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; parse the initialization parameters in DEVICE command +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; + PUSH BX ;; WGR ;AN000; + CALL SYSLOADMSG ;; WGR load messages ;AN000; + JNC CONT_1 ;; WGR if no error then continue ;AN000; + CALL SYSDISPMSG ;; WGR error (DOS version)..display ;AN000; + POP BX ;; WGR message.... ;AN000; + JMP SYNTAX_ERROR ;; WGR ...and exit with error code. ;AN000; + ;; WGR ;AN000; +CONT_1: ;; WGR ;AN000; + POP BX ;; WGR ;AN000; + CMP BUF.BFLAG,BF_PRN ;; since PRN is the FIRST device header + JNE NOT_PRN ;; + ;; + ;; + MOV AX,OFFSET CODE_END ;; defined only once for each DEVICE + XOR CX,CX ;; + MOV CL,4 ;; + SHR AX,CL ;; + PUSH CS ;; + POP CX ;; + ADD AX,CX ;; + INC AX ;; leave 16 bytes,room for resident_end + MOV RESIDENT_END,AX ;; + ;; + CALL PARSER ;; call only once, for PRM + ;; + JMP PROCESS_TABLE ;; + ;; +NOT_PRN : ;; + CMP DEV_NUM,1 ;; + ;; + JNB PROCESS_TABLE ;; + ;; + JMP SYNTAX_ERROR ;; + ;; + ;; + ;; +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 1 ++ +;; ++++++++++++++++++++++++ +;; +;; INIT - FIRST STAGE : +;; +;; == test and extract if the parameters on device-id is valid +;; == determine the DID_STATUS according to the validity of the parameters +;; == procedure(s) called -- DID_EXTRACT +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ;; +PROCESS_TABLE : ;; + ;; + PUSH CS ;; + POP ES ;; PSE points to Device offsets + MOV DI,OFFSET(table) ;; ES:[DI] + MOV DX,PSE.PAR_DEV_NUM ;; + MOV DEV_NUM,DX ;; + ;; + CMP DEV_NUM,0 ;; + JNZ NO_SYNTAX_ERR ;; + ;; + ;; WGR ;AN000; + PUSH BX ;; WGR ;AN000; + MOV AX,BAD_SYNTAX_MSG ;; WGR 'bad syntax' message ;AN000; + MOV BX,STDERR ;; WGR to standard error ;AN000; + XOR CX,CX ;; WGR ;AN000; + XOR DL,DL ;; WGR ;AN000; + MOV DH,UTILITY_MSG_CLASS ;; WGR class = parse error ;AN000; + CALL SYSDISPMSG ;; WGR display message. ;AN000; + POP BX ;; WGR ;AN000; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SYNTAX_ERROR : ;; set the request header status + ;; according to the STATE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX, RESIDENT_END ;; + PUSH CS ;; + POP CX ;; CX=CS + SUB AX,Cx ;; additional segment required. +CS_LOOP1: ;; + CMP AX,1000H ;; + JB CS_LPEND1 ;; + ADD CX,1000H ;; + SUB AX,1000H ;; + JMP CS_LOOP1 ;; + ;; +CS_LPEND1: ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; get Request Header address +; MOV RH.RH0_ENDO,AX ;; + MOV RH.RH0_ENDO,0 ;; + MOV RH.RH0_ENDS,CX ;; + mov rh.RH0_CONFIG_ERRMSG, -1 ;DCR D493 2/25/88 "Error in CONFIG.SYS..." msg flag. + MOV RH.RHC_STA,stat_cmderr ;; set status in request header + ;; + JMP INIT_RETurn ;; + ;; + ;; +NO_SYNTAX_ERR : ;; + ;; + CMP DX,DID_MAX ;; + JNA NEXT_DID ;; + ;; + MOV INIT_CHK,0001H ;; ERROR 0001 + JMP BAD_DID ;; more than supported no. of device + ;; +NEXT_DID: ;; + PUSH DI ;; pointer to PAR_OT (table 1) + AND DX,DX ;; + JNZ SCAN_DESC ;; + JMP END_DID ;; DI = offset to the 1st PARSE table +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SCAN_DESC: ;; + MOV DI,PSE.PAR_OFF ;; points to the nth device + ;; + ;; find the description for the + ;;device-id + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV CX,PRINTER_DESC_NUM ;; + MOV SI, OFFSET(PRINTER_DESC_TBL); offset to the description table + PUSH CS ;; + POP DS ;; +; $SEARCH ;; +$$DO1: + PUSH CX ;; save device count + PUSH SI ;; pointer to printer-descn's offset + MOV SI,CS:WORD PTR[SI] ;; + AND CX,CX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $LEAVE Z ;; LEAVE if no more device description + JZ $$EN1 + PUSH DI ;; save offset to PAR_DEVOT + MOV DI,PSE.PAR_DIDO ;; + MOV CX,PSE.PAR_DIDL ;; length of parsed device name + LEA DI,PSE.PAR_DID ;; pointer to parse device name + ;; + PUSH SI ;; + LEA SI,[SI].TYPEID ;; offset to name of device-id + REPE CMPSB ;; + POP SI ;; + POP DI ;; get back offset to PAR_DEVOT + ;;;;;;;;;;;;;;;;;;;;;;;; +; $EXITIF Z ;; EXIT if name matched + JNZ $$IF1 + ;; + CALL DID_EXTRACT ;; get the parameters + ;; + POP SI ;; balance push-pop + POP CX ;; + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $ORELSE ;; try next description : + JMP SHORT $$SR1 +$$IF1: + ;; + POP SI ;; of printer_descn offset table + INC SI ;; + INC SI ;; next offset to PRINTER_DESCn + ;; + POP CX ;; one description less + DEC CX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $ENDLOOP ;; DEVICE-ID not defined in + JMP SHORT $$DO1 +$$EN1: + ;; printer_desc; + ;; + MOV AX,INIT_CHK ;; + AND AX,AX ;; + JNZ UNCHANGED ;; + MOV INIT_CHK,0004H ;; ERROR 0004 +UNCHANGED: ;; + POP SI ;; balance push-pop + POP CX ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; $ENDSRCH ;; End of scanning printer_desc +$$SR1: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + POP DI ;; + INC DI ;; + INC DI ;; points to next device in PART_OT + DEC DX ;; + ;; + JMP NEXT_DID ;; + ;; +END_DID : ;; + POP DI ;; +BAD_DID : ;; + ;; + MOV AX,DID_STATUS ;; + AND AX,AX ;; + JNZ DEF_BUFFER ;; + ;; + JMP END_LPT ;; + ;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +;; +;; ++++++++++++++++++++++++ +;; ++ INIT Stage 2 ++ +;; ++++++++++++++++++++++++ +;; +;; INIT -- SECOND STAGE : +;; +;; == match the device_name extracted in stage 1 with the name of PRN or +;; LPTn +;; +;; == if the PRN/LPTn has never been defined before, then set up the BUF +;; for the PRN/LPTn if the DID_STATUS is good; otherwise message will +;; be generated indicating it cannot be initilized. +;; +;; == if there is PRN, LPT1 is also setup, and vice vera. IF both PRN and +;; LPT1 are on the DEVICE command, or there are multiple entries for +;; the same LPTn, the consistency is checked. It they are inconsistent +;; the associated LPTn or PRN is forced to fail by : DID_FAIL. +;; +;; == if the device_name on the DEVICE command is not one of the supported +;; PRN or LPTn, then DID_MATCH bit will not be set. An error message +;; will be generated for the device_name indicating it cannot be +;; initialized. +;; +;; == procedure(s) called : CHK_DID .. check DID parameters for device +;; whose name matched. +;; DEV_CHECK .. if device-name duplicated, or +;; there are both PRN/LPT1 : check +;; for consistent parameters. +;; +;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +DEF_BUFFER : ;; + PUSH CS ;; + POP ES ;; PSE points to Device offsets + MOV DI,OFFSET(table) ;; ES:[DI] + xor cx,cx ;; device order in parse table +;SEARCH ;; +$$DO7: + PUSH DI ;; pointer to PAR_OT + PUSH CX ;; save device count + MOV DI,PSE.PAR_OFF ;; " " PAR_DEVOT + cmp cx,dev_num ;; + ;; +;LEAVE NB ;; LEAVE if no more device entry + jb MORE_DEVICE ;; + JMP $$EN7 +MORE_DEVICE : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; more parsed_device to be checked + PUSH DI ;; save offset to PAR_DEVOT + MOV DI,PSE.PAR_DNMO ;; + MOV CX,PSE.PAR_DNML ;; length of parsed device name + LEA DI,PSE.PAR_DNM ;; pointer to parse device name + ;; + LDS SI,DWORD PTR BUF.DEV_HDRO ; get the offset to device-n header + LEA SI,HP.DH_NAME ;; " offset to name of device-n + REPE CMPSB ;; + POP DI ;; get back offset to PAR_DEVOT + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;; +;EXITIF Z ;; EXIT if name matched + JZ NAME_MATCHED ;; + ;; + JMP MORE_PARSED_DEVICE ;; + ;; +NAME_MATCHED : ;; + ;; + POP CX ;; the DID order + PUSH BX ;; + MOV BX,CX ;; + ADD BX,BX ;; + MOV AX,DID_BIT[BX] ;; + OR DID_MATCH,AX ;; this DID matched + POP BX ;; + PUSH CX ;; + ;; + LEA SI,BUF.PAR_EXTRACTO ;; was the LPT1/PRN defined before ? + MOV AX,CS:[SI].PAR_DNMO ;; + CMP AX,0FFFFH ;; + ;; + JNE DEV_COMPARE ;; DI = PAR_DEVOT + ;;----------------------------------- + ;; + ;; no device previousely defined + MOV AX,PSE.PAR_DNMO ;; + MOV CS:[SI].PAR_DNMO,AX ;; define device parameters for LPTn + ;; + MOV AX,PSE.PAR_DIDO ;; + MOV CS:[SI].PAR_DIDO,AX ;; + ;; + MOV AX,PSE.PAR_HWCPO ;; + MOV CS:[SI].PAR_HWCPO,AX ;; + ;; + MOV AX,PSE.PAR_DESGO ;; + MOV CS:[SI].PAR_DESGO,AX ;; + ;; + MOV AX,PSE.PAR_PARMO ;; + MOV CS:[SI].PAR_PARMO,AX ;; + ;; + ;;--------------------------------- + CALL CHK_DID ;; define the STATE according to + ;; DID_STATUS + JMP MORE_PARSED_DEVICE ;; + ;; +DEV_COMPARE : ;;------------------------------- + ;; e.g. LPT1 and PRN shares one BUF. + ;; or duplicated device name + CALL DEV_CHECK ;; + ;; + CMP BUF.STATE,CPSW ;; + JNE DEV_COMPARE_FAIL ;; + ;; + JMP MORE_PARSED_DEVICE ;; + ;; +DEV_COMPARE_FAIL : ;; + ;; + POP CX ;; + POP DI ;; balance push-pop + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;$ORELSE ;; + JMP END_LPT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +MORE_PARSED_DEVICE : ;; name does not match + ;; + POP CX ;; + INC CX ;; + POP DI ;; + INC DI ;; + INC DI ;; points to next device in PART_OT + ;; + jmp $$DO7 ;; +;$ENDLOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +$$EN7: ;; no device found for LPTn + ;; + POP CX ;; + POP DI ;; balance push-pop + ;; + CMP BUF.STATE,CPSW ;; + JE END_LPT ;; for LPT1/PRN pair + ;; + MOV BUF.STATE,NORMAL ;; no device defined for the LPTn + ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; End of defining LPTn Buffer + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;$ENDSRCH ;; +END_LPT : ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; set the request header status + ;; according to the STATE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + MOV AX, RESIDENT_END ;; + PUSH CS ;; + POP CX ;; CX=CS + SUB AX,Cx ;; additional segment required. +CS_LOOP2: ;; + CMP AX,1000H ;; + JB CS_LPEND2 ;; + ADD CX,1000H ;; + SUB AX,1000H ;; + JMP CS_LOOP2 ;; + ;; +CS_LPEND2: ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + ;; + LES DI,dword ptr buf.rh_ptro ;; get Request Header address + MOV RH.RH0_ENDO,AX ;; + MOV RH.RH0_ENDS,CX ;; + XOR AX,AX ;; clear error code to be returned + MOV CX,BUF.STATE ;; + CMP CX,CPSW ;; + JE MATCH_GOOD ;; + MOV AX,STAT_CMDERR ;; + ;; +MATCH_GOOD : ;; + MOV RH.RHC_STA,AX ;; set status in request header + CALL LOAD_INT2F ;; WGR load INT2f handler ;AN000; + ;; +BUF_END : ;; + ;; + CMP BUF.BFLAG,BF_LPT1 ;; + JNE BUF_MESSAGES ;; + ;; + CMP BUF.STATE,CPSW ;; + JNE BUF_MESSAGES ;; + ;; set PRN to the same setting as LPT1 + PUSH BX ;; + ;; + LEA SI,BUF.RNORMO ;; + LEA CX,BUF.BUFEND ;; + SUB CX,SI ;; + MOV BX,BUF.PRN_BUFO ;; where PRN buffer is + LEA DI,BUF.RNORMO ;; + PUSH CS ;; + POP ES ;; + PUSH CS ;; + POP DS ;; + REP MOVSB ;; + ;; + POP BX ;; + ;; +BUF_MESSAGES : ;; + CMP BUF.BFLAG,BF_LPT3 ;; generate error message is this is + je last_round ;; the last LPTn + Jmp INIT_RETURN ;; + ;; ERROR messages will be generated + ;; at the end of initialization of all + ;; the LPT devices +last_round : ;; + MOV AX,RESIDENT_END ;; + ADD AX,STACK_SIZE ;; + MOV RESIDENT_END,AX ;; + PUSH CS ;; + POP CX ;; CX=CS + SUB AX,Cx ;; additional segment required. +CS_LOOP3: ;; + CMP AX,1000H ;; + JB CS_LPEND3 ;; + ADD CX,1000H ;; + SUB AX,1000H ;; + JMP CS_LOOP3 ;; + ;; +CS_LPENd3: ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + SHL AX,1 ;; + ;; + MOV RH.RH0_ENDO,AX ;; STACK !!!!! + MOV STACK_ALLOCATED,0 ;; from now on, internal stack is used + ;; + MOV AX,DID_STATUS ;; what is the DID combination ? + AND AX,DID_MATCH ;; + XOR AX,DID_FAIL ;; + ;; + AND AX,AX ;; + JNZ CODE_STAYED ;; +; MOV RH.RH0_ENDO,0 ;; none of the devices are good + ;; + ;; +CODE_STAYED : ;; + MOV DI,OFFSET TABLE ;; + push CS ;; + POP ES ;; + ;; + XOR CX,CX ;; +MSG_LOOP : ;; + CMP CX,DEV_NUM ;; + JNB INIT_RETURN ;; + SHR AX,1 ;; + JC MSG_NEXT ;; + ;; this device in parse table is bad + PUSH DI ;; + PUSH CX ;; + PUSH AX ;; + PUSH BX ;; WGR ;AN000; + PUSH DX ;; WGR ;AN000; + ;; + MOV DI,PSE.PAR_OFF ;; + MOV SI,PSE.PAR_DNMO ;; + ;; + PUSH CS ;; + POP ES ;; + PUSH CS ;; + POP DS ;; + ;; + MOV CX,8 ;; + LEA SI,[SI].PAR_DNM ;; + MOV DI,SI ;; + MOV AL,' ' ;; WGR ;AN000; + CLD ;; WGR ;AN000; + REPNE SCASB ;; WGR ;AN000; + DEC DI ;; WGR ;AN000; + MOV BYTE PTR ES:[DI],ZERO ;; WGR ;AN000; + ;; WGR ;AN000; + MOV MSG_SEG,CS ;; WGR ;AN000; + MOV MSG_PTR,SI ;; WGR ;AN000; + MOV AX,BAD_DEVICE_MSG ;; WGR ;AN000; + MOV BX,STDERR ;; WGR ;AN000; + LEA SI,SUBLIST ;; WGR ;AN000; + MOV CX,ONE ;; WGR ;AN000; + XOR DL,DL ;; WGR ;AN000; + MOV DH,UTILITY_MSG_CLASS ;; WGR ;AN000; + CALL SYSDISPMSG ;; WGR ;AN000; + ;; ;AN000; + POP DX ;; WGR ;AN000; + POP BX ;; WGR ;AN000; + POP AX ;; + POP CX ;; + POP DI ;; + ;; +MSG_NEXT : ;; + INC CX ;; + INC DI ;; + INC DI ;; + JMP MSG_LOOP ;; + ;; + ;; +INIT_RETURN : ;; + ;; + ;; + RET ;; + ;; +INIT ENDP ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Call by INIT to extract parameters for the deivce_id +;; +;; on rntry : +;; ES:[DI] PARSE Table 2, offsets of all parameters +;; DS:[SI] Printer Description table whose TYPEID matched +;; DX "inverse" order of devices in the PARSE tables +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +DID_EXTRACT PROC ;; + ;; + PUSH DX ;; + ;;----------------------------- + ;; define the DID_parameters + PUSH BX ;; + ;; + MOV BX,DEV_NUM ;; + SUB BX,DX ;; order in the Parse table + add bx,bx ;; double to index [bx] + MOV DX,BX ;; + ;; + MOV AX,DS:[SI].FONTSZ ;; + MOV FSIZE[BX],AX ;; size of font buffer to be created + ;; + MOV AX,DS:[SI].HSLOTS ;; + CMP AX,HARDSL_MAX ;; + JNA LESS_HARDSL ;; + MOV INIT_CHK, 0010H ;; ERROR 0010H + POP BX ;; + JMP END_MATCH_BAD ;; +LESS_HARDSL : ;; + CMP AX,DS:[SI].HWCPMIN ;; + JNB VALID_HARDSL ;; + MOV INIT_CHK, 0012H ;; ERROR 0012H + POP BX ;; + JMP END_MATCH_BAD ;; +VALID_HARDSL : ;; + MOV HRMAX[BX],AX ;; + MOV CTMAX[BX],AX ;; will be reduced by the no. of hwcp + ;; + MOV AX,DS:[SI].RSLOTS ;; + CMP AX,RAMSL_MAX ;; + JNA LESS_RAMSL ;; + MOV INIT_CHK, 0011H ;; ERROR 0011H + POP BX ;; + JMP END_MATCH_BAD ;; +LESS_RAMSL : ;; + MOV RMMAX[BX],AX ;; see also designate + ;; + MOV DESCO[BX],SI ;; + ;; + POP BX ;; + ;;---------------------------------- + ;; + PUSH CX ;; + ;; +HWCPgt: PUSH DI ;; get the hwcp + ;; + MOV DI,PSE.PAR_HWCPO ;; + MOV CX,PSE.PAR_HWCPL ;; no. of hwcp + AND CX,CX ;; + JNZ chk_hwcp ;; + push bx ;; + mov bx,dx ;; + MOV HRMAX[BX],CX ;; + MOV CX,DS:[SI].HWCPMIN ;; + SUB CTMAX[BX],CX ;; what is left becomes cartridge slot + pop bx ;; + JMP DESIGN ;; + ;; hwcp to be defined +chk_hwcp: MOV AX,DS:[SI].HSLOTS ;; defined in printer_desc + CMP CX,AX ;; + JA BAD_MATCH2 ;; + CMP CX,HARDSL_MAX ;; + JNA HWCP_GOOD ;; jump if system error + MOV INIT_CHK,0003H ;; ERROR 0003 + JMP END_MATCH ;; +BAD_MATCH2: ;; + MOV INIT_CHK,0002H ;; ERROR 0002 + JMP END_MATCH ;; + ;; +HWCP_GOOD: ;; there are sufficient hard-slot for + ;; HWCP + PUSH SI ;; printer description table of TYPEID + PUSH BX ;; + ;; + MOV BX,DX ;; + MOV AX,CTMAX[BX] ;; + ;; + PUSH CX ;; calculate what is left for cart_slot + CMP CX,DS:[SI].HWCPMIN ;; + JNB MORE_THAN_HWCPMIN ;; + MOV CX,DS:[SI].HWCPMIN ;; +MORE_THAN_HWCPMIN : ;; + SUB AX,CX ;; + POP CX ;; + mov HRMAX[BX],CX ;; + ;; + MOV CTMAX[BX],AX ;; no of cart-slot for designate + MOV SI,HARD_SLA[BX] ;; get the corresponding hard-slots + ;; + POP BX ;; + ;; + push bx ;; + push dx ;; + mov bx,si ;; + mov dx,cx ;; + mov reserved1,dx ;; IF THERE IS ANY REPETITIVE HWCP + mov reserved2,bx ;; IF THERE IS ANY REPETITIVE HWCP + ;; +FILL_HWCP: ;; + AND CX,CX ;; + JZ DESIGN_P ;; + INC DI ;; next code page in PARSE table + INC DI ;; + MOV AX,ES:[DI] ;; get code page value + ;; + ;; IF THERE IS ANY REPETITIVE HWCP + push dx ;; + push bx ;; +hwcp_norep : ;; + cmp ax,cs:[bx].slt_cp ;; + jne hwcp_repnext ;; + pop bx ;; + pop dx ;; + pop dx ;; + pop bx ;; + pop si ;; + jmp end_match ;; + ;; +hwcp_repnext: ;; + inc bx ;; + inc bx ;; + inc bx ;; + inc bx ;; + dec dx ;; + jnz hwcp_norep ;; + pop bx ;; + pop dx ;; + ;; + MOV CS:[SI].SLT_CP,AX ;; + MOV AX,CS:[SI].SLT_AT ;; get the attributes + OR AX,AT_OCC ;; occupied + OR AX,AT_HWCP ;; hwcp slot + MOV CS:[SI].SLT_AT,AX ;; + INC SI ;; + INC SI ;; next slot + INC SI ;; next slot + INC SI ;; next slot + DEC CX ;; + JMP FILL_HWCP ;; +DESIGN_P: ;; + pop dx ;; + pop bx ;; + POP SI ;; + ;;--------------------- +DESIGN: POP DI ;; get the designate no. + PUSH DI ;; + ;; + MOV DI,PSE.PAR_DESGO ;; + MOV AX,PSE.PAR_DESGL ;; + CMP AX,1 ;; + JA END_MATCH ;; there should have no font entry + AND AX,AX ;; + JZ DEF_RBUFMAX ;; + ;; + MOV AX,PSE.PAR_DESG ;; + AND AX,AX ;; + JZ DEF_RBUFMAX ;; + ;; + CMP CS:[SI].CLASS,1 ;; + JNE DESIG_NOt_CLASS1 ;; + ;; + PUSH BX ;; if there is any cartridge slot ? + PUSH AX ;; + MOV BX,DX ;; + MOV AX,ctmax[BX] ;; + AND AX,AX ;; + POP AX ;; + POP BX ;; + JZ END_MATCH ;; fail, as there is no physical RAM. + ;; + CMP AX,HARDSL_MAX ;; is the designate more than max ? + JA END_MATCH ;; + ;; + ;; + JMP DEF_RBUFMAX ;; + ;; + ;; + ;; +DESIG_NOT_CLASS1 : ;; + PUSH BX ;; if there is any physical RAM slot ? + PUSH AX ;; + MOV BX,DX ;; + MOV AX,RMMAX[BX] ;; + AND AX,AX ;; + POP AX ;; + POP BX ;; + JZ END_MATCH ;; fail, as there is no physical RAM. + ;; + ;; + CMP AX,RAMSL_MAX ;; is the designate more than max ? + JA END_MATCH ;; + ;; +DEF_RBUFMAX : ;; + PUSH BX ;; + MOV BX,DX ;; + MOV RBUMAX[BX],AX ;; + POP BX ;; + ;; + ;; +PARAM : ;; +;PARM: POP DI ;; +; PUSH DI ;; +;; MOV DI,PSE.PAR_PARMO ;; + ;; + ;,-------------------------- + ;; GOOD device_id parameters + shr dx,1 ;; + MOV AX,DID_ONE ;; + MOV CX,DX ;; + AND CX,CX ;; + JZ NO_SHL ;; + SHL AX,CL ;; +NO_SHL: OR DID_STATUS,AX ;; is defined + ;;------------------------- +END_MATCH: POP DI ;; end of extract + POP CX ;; +END_MATCH_BAD : ;; + POP DX ;; + ;; + RET ;; + ;; +DID_EXTRACT ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Called by INIT to define the STATE and BUF for the LPTn according to +;; the DID_STATUS. Create font buffer if requested through the "desi*nate" +;; +;; at entry : CX = device order in parse table +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CHK_DID PROC ;; + ;; + push cx ;; + push di ;; + push dx ;; + ;; + MOV AX,DID_STATUS ;; + ;; + PUSH CX ;; order 0 to m + POP DI ;; + ADD DI,DI ;; indexing : [DI] + ;; + INC CX ;; + SHR AX,CL ;; is the device parameter valid ? + ;; + JC DEFINE_BUFFER ;; + JMP LPT_FAIL ;;-------------------------- + ;; +DEFINE_BUFFER : ;; + ;; good device parameters as determined + MOV AX,DESCO[DI] ;; + MOV BUF.PDESCO,AX ;; + ;; + PUSH DI ;; + MOV DI,AX ;; + MOV AX,CS:[DI].CLASS ;; + MOV BUF.PCLASS,AX ;; + POP DI ;; + ;; + MOV AX,HARD_SLA[DI] ;; in the DID_EXTRACT + MOV BUF.HARDSO,AX ;; + ;; + MOV AX,RAM_SLA[DI] ;; + MOV BUF.RAMSO,AX ;; + ;; + MOV AX,HRMAX[DI] ;; + MOV BUF.HARDMX,AX ;; + ;; + MOV AX,CTMAX[DI] ;; + MOV BUF.HCARMX,AX ;; + ;; + ADD AX,HRMAX[DI] ;; defore "designate" + MOV BUF.HSLMX,AX ;; + ;; + ;; + MOV AX,RMMAX[DI] ;; + MOV BUF.RAMMX,AX ;; + ;; + XOR AX,AX ;; + PUSH CX ;; calculate the max. length of control + MOV CX,2 ;; sequence that is allowed for the + CMP BUF.PCLASS,1 ;; room reserved for physical slots. + JNE CTL_LOOP ;; + MOV CX,1 ;; class 1 printer has one control seq. +CTL_LOOP : ;; + ADD AX,CTL_MAX ;; + DEC AX ;; leave one byte for the length + DEC CX ;; + JNZ CTL_LOOP ;; + MOV BUF.FSELMAX,AX ;; + POP CX ;; + ;; + MOV AX,FSIZE[DI] ;; + MOV BUF.FTSZPA,AX ;; FTSIZE in paragraph + ;; + PUSH AX ;; + ;; + MOV DX,4 ;; +FT_PARA: ;; + ADD AX,AX ;; + DEC DX ;; + JNZ FT_PARA ;; font size + MOV BUF.FTSIZE,AX ;; font size in bytes (used with.RBUFMX) + ;; + POP DX ;; FTSIZE in paragraph + ;; + MOV CX,RBUMAX[DI] ;; create font buffer per .RBUFMX and + MOV BUF.RBUFMX,CX ;; assume sufficient memory for all the + ;; "designate request" + PUSH CX ;; + ;; + CMP BUF.PCLASS,1 ;; always create font buffer for class1 + JNE CLASS_NOT_1 ;; + ;; + AND CX,CX ;; + JZ CLASS1_NOCX ;; + ADD CX,BUF.HARDMX ;; + MOV BUF.HSLMX,CX ;; + JMP CLASS_NOT_1 ;; + ;; +CLASS1_NOCX: ;; + MOV CX,BUF.HSLMX ;; + ;; +CLASS_NOT_1 : ;; + AND CX,CX ;; + JZ MULTIPLE_DONE ;; + MOV AX,RESIDENT_END ;; +MULTIPLE_FT : ;; + ADD AX,DX ;; allocate the font buffers at the end + DEC CX ;; of the resident codes + JNZ MULTIPLE_FT ;; + ;; + ;; + MOV CX,RESIDENT_END ;; + MOV BUF.FTSTART,CX ;; + MOV RESIDENT_END,AX ;; + ;; + ;; +MULTIPLE_DONE : ;; + POP CX ;; designate requested + ;; + CMP BUF.PCLASS,1 ;; + JNE DEF_RBUF ;; + ;; CLASS 1 + CMP BUF.HARDMX,0 ;; + JE DEFBUF_DONE ;; + ;; + PUSH CX ;; STACKS... + PUSH SI ;; + PUSH DS ;; + PUSH ES ;; + PUSH DI ;; + PUSH DX ;; + ;; + MOV DX,BUF.HARDMX ;; + PUSH DX ;; STACK +1 -- # of HWCP + ;; + PUSH CS ;; + POP DS ;; + MOV BUF.RBUFMX,0 ;; + MOV SI,BUF.PDESCO ;; + MOV SI,CS:[SI].SELH_O ;; + XOR CX,CX ;; + MOV CL,CS:BYTE PTR [SI] ;; + INC CX ;; including the length byte + ;; + MOV DI,BUF.FTSTART ;; control template +DEF_FTBUF: ;; fill the font buffer with the + PUSH DI ;; + POP ES ;; + XOR DI,DI ;; + ;; + PUSH CX ;; + PUSH SI ;; + REP MOVSB ;; + POP SI ;; + POP CX ;; + ;; + PUSH ES ;; + POP DI ;; + ADD DI,BUF.FTszpa ;; + DEC DX ;; + JNZ DEF_FTBUF ;; + ;; + POP DX ;; STACK -1 + ;; + MOV SI,BUF.HARDSO ;; + MOV DI,BUF.FTSTART ;; define the HWCP values +DEF_FThwcp : ;; + PUSH DI ;; + POP ES ;; + MOV DI,CTL5202_OFFS ;; offset to the HWCP words + ;; + MOV AX,CS:[SI].SLT_CP ;; + MOV ES:WORD PTR [DI],AX ;; + ;; + INC SI ;; + INC SI ;; + INC SI ;; + INC SI ;; + ;; + PUSH ES ;; + POP DI ;; + ADD DI,BUF.FTSZPA ;; + DEC DX ;; + JNZ DEF_FThwcp ;; + ;; + POP DX ;; + POP DI ;; + POP ES ;; + POP DS ;; + POP SI ;; + POP CX ;; + ;; + JMP DEFBUF_DONE ;; + ;; + ;; +DEF_RBUF : ;; + MOV BUF.RSLMX,CX ;; the no. of ram slots supported + CMP CX,RMMAX[DI] ;; + JNB DEFBUF_DONE ;; + MOV AX,RMMAX[DI] ;; + MOV BUF.RSLMX,AX ;; the max. of .RAMMX and .RBUFMX + ;; +DEFBUF_DONE : ;; + MOV BUF.STATE,CPSW ;; the LPTn is CPSW ----- STATE + ;; + CMP BUF.BFLAG,BF_PRN ;; + JNE RET_CHK_DID ;; + MOV AX,DID_BIT[DI] ;; + MOV BUF.DID_PRN,AX ;; + ;; + ;; + JMP RET_CHK_DID ;; + ;; +LPT_FAIL: ;; + ;; + MOV BUF.STATE,NORMAL ;; the LPTn is NORMAL --- STATE + ;; + ;; +RET_CHK_DID: ;; + ;; + pop dx ;; + pop di ;; + pop cx ;; + ;; + RET ;; + ;; +CHK_DID ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Called by INIT to check for consistency between duplicated device name and +;; between PRN and LPT1 +;; +;; at entry : DI = pointer to PAR_DEVOT +;; BUF.STATE = any state +;; CX = DID order +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; +DEV_CHECK PROC ;; + ;; + LEA SI,BUF.PAR_EXTRACTO ;; + ;; + PUSH CX ;; + ;; + PUSH SI ;; compare device id + PUSH DI ;; + mov SI,[SI].PAR_DIDO ;; + MOV DI,PSE.PAR_DIDO ;; + MOV CX,PSE.PAR_DNML ;; + INC CX ;; including length + INC CX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + Jz hwcp_check ;; + mov init_chk,0021h ;; error 0021h + Jmp FORCE_LPT_BAD ;; + ;; +hwcp_check : ;; + PUSH SI ;; compare HWCP + PUSH DI ;; + mov SI,[SI].PAR_HWCPO ;; + MOV DI,PSE.PAR_HWCPO ;; + MOV AX,PSE.PAR_HWCPL ;; + MOV CX,2 ;; + SHL AX,CL ;; multiply by two + INC AX ;; including length + INC AX ;; + MOV CX,AX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + Jz desig_check ;; + mov init_chk,0022h ;; error 0022h + Jmp FORCE_LPT_BAD ;; + ;; +desig_check : ;; + PUSH SI ;; compare DESIGNATE + PUSH DI ;; + mov SI,[SI].PAR_DESGO ;; + MOV DI,PSE.PAR_DESGO ;; + MOV AX,PSE.PAR_DESGL ;; + MOV CX,2 ;; + SHL AX,CL ;; multiply by two + INC AX ;; including length + INC AX ;; + MOV CX,AX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + Jz param_check ;; + mov init_chk,0023h ;; error 0023h + Jmp FORCE_LPT_BAD ;; + ;; +param_check : ;; + PUSH SI ;; compare parameters + PUSH DI ;; + mov SI,[SI].PAR_PARMO ;; + MOV DI,PSE.PAR_PARMO ;; + MOV CX,PSE.PAR_PARML ;; + INC CX ;; including length + INC CX ;; + REPE CMPSB ;; + POP DI ;; + POP SI ;; + JZ M_END ;; + mov init_chk,0024h ;; error 0024h + ;; +FORCE_LPT_BAD : ;; the second set of parameters is + MOV BUF.STATE,NORMAL ;; bad + ;; + CMP BUF.BFLAG,BF_LPT1 ;; + JNE M_END ;; + ;; + ;; since LPT1 is bad, force PRN to bad + push bx ;; force prn to be bad too + mov bx,buf.prn_bufo ;; + MOV BUF.STATE,NORMAL ;; + pop bx ;; + ;; + mov AX,BUF.DID_PRN ;; if PRN was not good, DID_PRN = 0 + OR DID_FAIL,AX ;; + ;; + ;; +M_END: ;; force the good did_status to fail if + ;; STATE is bad + POP CX ;; + PUSH CX ;; order 0 to m + MOV AX,DID_STATUS ;; + ;; + INC CX ;; + SHR AX,CL ;; + POP CX ;; + JNC DEV_CHECK_RET ;; already failed + ;; + CMP BUF.STATE,CPSW ;; + JE DEV_CHECK_RET ;; + ;; + PUSH BX ;; + MOV BX,CX ;; + ADD BX,BX ;; + MOV AX,DID_BIT[BX] ;; + OR DID_FAIL,AX ;; force DID to fail + POP BX ;; + ;; + ;; +DEV_CHECK_RET : ;; + ;; + RET ;; + ;; + ;; +DEV_CHECK ENDP ;; + ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: LOAD_INT2F +; +; FUNCTION: +; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH +; VECTOR STORED. +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SEMAPHORE DB 0 ;AN000; + ;AN000; +LOAD_INT2F PROC NEAR ;AN000; + CMP CS:SEMAPHORE,0 ; already loaded? ;AN000; + JNE LI_1 ; yes.....exit ;AN000; + PUSH ES ; no...load. ;AN000; + PUSH CX ; ;AN000; + PUSH AX ; ;AN000; + XOR AX,AX ; point ES to low.. ;AN000; + MOV ES,AX ; memory. ;AN000; + MOV AX,ES:WORD PTR INT2F_LOW ; store original.. ;AN000; + MOV CS:ROM_INT2F,AX ; interrupt 2Fh.. ;AN000; + MOV CX,ES:WORD PTR INT2F_HI ; location.. ;AN000; + MOV CS:ROM_INT2F+2,CX ; ;AN000; + OR AX,CX ; check if old int2F.. ;AN000; + JNZ LI_0 ; is 0. ;AN000; + MOV AX,OFFSET ABORT ; yes....point to.. ;AN000; + MOV CS:ROM_INT2F,AX ; IRET. ;AN000; + MOV AX,CS ; ;AN000; + MOV CS:ROM_INT2F+2,AX ; ;AN000; +LI_0: ; ;AN000; + CLI ; ;AN000; + MOV ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector.. ;AN000; + MOV ES:WORD PTR INT2F_HI,CS ; with our own.. ;AN000; + STI ; ;AN000; + POP AX ; ;AN000; + POP CX ; ;AN000; + POP ES ; ;AN000; + MOV CS:SEMAPHORE,1 ; now loaded. ;AN000; +LI_1: RET ; ;AN000; +LOAD_INT2F ENDP + +.XLIST +MSG_SERVICES ; WGR ;AN000; +MSG_SERVICES ; WGR ;AN000; +MSG_SERVICES ; WGR ;AN000; +MSG_SERVICES ; WGR ;AN000; +MSG_SERVICES ; WGR ;AN000; +.LIST + +include msgdcl.inc + +CSEG ENDS + END 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 diff --git a/v4.0/src/DEV/PRINTER/MAKEFILE b/v4.0/src/DEV/PRINTER/MAKEFILE new file mode 100644 index 0000000..2f14f1a --- /dev/null +++ b/v4.0/src/DEV/PRINTER/MAKEFILE @@ -0,0 +1,40 @@ +#************************* Makefile for Printer *************************** + +inc =..\..\inc +msg =..\..\messages +dos =..\..\dos +hinc =..\..\h +make =nmake + +# +######################## Dependencies Begin Here ########################## +# + +all: printer.sys 5202.cpi + +printer.ctl: printer.skl $(msg)\$(COUNTRY).msg + +cpspm10.obj: cpspm10.asm cpspequ.inc + +cpsfont3.obj: cpsfont3.asm cpspequ.inc + +prtint2f.obj: prtint2f.asm cpspequ.inc $(inc)\struc.inc + +cpspi07.obj: cpspi07.asm cpspequ.inc \ + $(inc)\sysmsg.inc printer.ctl \ + $(inc)\versiona.inc + +parser.obj: parser.asm cpspequ.inc $(inc)\parse.asm \ + $(inc)\struc.inc + +printer.sys: cpspm10.obj cpsfont3.obj parser.obj cpspi07.obj prtint2f.obj + link @printer.lnk + exe2bin printer.exe printer.sys < zero.dat + del printer.exe + +5202.cpi: + cd 5202 + $(make) + cd .. + + diff --git a/v4.0/src/DEV/PRINTER/PARSE4E.ASM b/v4.0/src/DEV/PRINTER/PARSE4E.ASM new file mode 100644 index 0000000..872a458 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PARSE4E.ASM @@ -0,0 +1,1106 @@ +;*************************************************************** +;** ** +;** ******** ** ** ******* ** +;** ** ** ** ** ** +;** ** ******* ***** ** +;** ** ** ** ** ** +;** ** ** ** ******* ** +;** ** +;** ****** * ****** ****** ******* ****** ** +;** ** ** ** ** ** ** ** ** ** ** ** +;** ****** ******* ****** ***** ****** ****** ** +;** ** ** ** ** ** ** ** ** ** ** +;** ** ** ** ** ** ****** ******* ** ** ** +;** ** +;*************************************************************** +; +; File Name: PARSE.ASM +; ---------- +; +; Description: A command parser for DEVICE command in the CONFIG.SYS file. +; ------------ +; +; Procedures contained in the file: +; --------------------------------- +; PARSER: Main routine for command processing. +; GET_CHAR: Gets a character from command line. +; IS_ALPH: Checks if character is an alpha character. +; IS_DIGIT: Checks if character is a digit. +; IS_DELIM: Checks if character is a DOS delimiter. +; DEVICE_PARSE: Pulls device name from command line and +; inserts in table. +; ID_PARSE: Pulls id name from command line and insers in table +; HWCP_PARMS: Extract HWCP number, converts it to binary and +; inserts it in table. +; HWCP_PARSE: Extracts HWCP number if only one number is given. +; MUL_HWCP: Extracts multiple HWCP's numbers, if they are given +; in a list. +; DESG_PARMS: Extracts designate number, converts it to binary +; and inserts it in table. +; DESG_FONT: Extracts the designate and the font if both were +; given in command line. +; DESG_PARSE: Pulls designate number if it is the only one given. +; GET_NUMBER: Converts a number to binary. +; OFFSET_TABLE: Updates the counter in table #1. +; FIND_RIGHT_BR: Looks for a right bracket. +; +; +; Change history: +; --------------- +; +; +;LOGIC: +;------ +; Establish addressability to parameters. +; Skip until end of path and file name -first delimiter +; +; Loop: +; Isolate the first non-delimiter or non delimeter characters. +; If End_of_Line_Delimiter then +; return an error_code +; Else +; If first non-delimiter is ALPHA then +; (assume a device name) +; Extracts device name +; Update offset counter +; +; Isolate the first non-delimiter characters after id name. +; If End_of_Line_Delimiter then +; return an error_code +; Else +; If first non-delimiter is ALPHA-NUMARIC or +; If character is '(' then +; (assume an id name) +; Extracts id name +; Update offset counter +; +; Pull out HWCP +; If error flag is set then exit +; Else if end of line flag is set then exit +; +; Pull out DESG parms +; If error_flag is set then exit. +; Else if end of line flag is set then exit +; Else if Number of devices is four then Exit +; Else Loop +; +; +;Subroutines Logic: +;------------------ +; +; GET_CHAR: +; --------- +; Load character in AL +; If character less than 20h then +; turn Z-flag on +; +; IS_ALPHA: +; --------- +; Save character +; 'Convert character to upper case' +; If character >=A and <=Z then +; turn Z-flag on +; exit +; Else +; Restore character +; exit. +; +; IS_DIGIT: +; --------- If Character >=0 and <=9 then +; turn Z-flag on +; +; IS_DELIMITER: +; ------------- +; If character a dos delimiter (' ','=',',',';',TAB) +; then turn Z-flag on +; +; DEVICE_PARSE: +; ------------- +; Set device name length counter. +; Loop +; If a dos delimiter then +; add spaces to name (if require) +; Else if char is ALPHA-NUM then +; save in table +; If name >8 character thne +; error; exit +; Else +; error; exit +; +; ID_PARSE: +; --------- Set id name length counter. +; Loop +; If a dos delimiter then +; add spaces to name (if require) +; Else if char is ALPHA-NUM then +; save in table +; If name >8 character then +; error; exit +; Else if char is ')' or '(' then +; set flags +; Else +; error; exit +; +; HWCP_PARMS: +; ----------- +; Loop: Set flags off +; If char is a DIGIT then +; convert number to binary +; update table +; Else if char is ',' then +; no HWCP was given +; exit +; Else if char is '(' then +; assume multiple HWCP +; Else if char is ')' then +; end of parms, exit +; Else if not a delimiter then +; error, exit set carry flag set carry flag +; Loop +; +; HWCP_PARSE: +; ----------- Increment counter +; Get number and convert to binary +; Update the table +; Set table_5 pointer +; +; MUL_HWCP: +; --------- +; Loop: If char is ')' then +; end of list, exit +; If char is a DIGIT +; Get number and convert to binary +; Update table. +; If char is not a delimiter then +; error, exit set carry flag +; Loop +; +; DESG_PARMS: +; ----------- +; Loop: If char is a DIGIT then +; Get number and convert to binary +; Update table. +; If char is a ')' then +; end of parms, exit +; If char is a '(' then +; assume given desg. and font +; If char is a ',' then +; no desg ginven +; scane for ')' +; If char is not a delimiter then +; error, exit set carry flag +; Loop +; +; DESG_FONT: +; ---------- +; Loop: If char is a ',' then +; no desg number was given +; update table +; If char is a ')' then +; end of desg-font pair, exit +; If char is a DIGIT then +; Get number and convert to binary +; Update table +; If char not a delimiter then +; error, exit set carry flag +; Loop +; +; DESG_PARSE: +; ----------- Get number and conver to binary +; Update table +; +; GET_NUMBER: +; ----------- Get ASCII number from parms +; conver to binary +; add to total +; +; OFFSET_TABLE: +; ------------- +; Increment the number of parms +; +; FIND_RIGHT_BR: +; -------------- +; Loop: If char is ')' then +; found bracket exit +; If char is not ' ' then +; error, exit set carry flag +; Loop +; END +;------------------------------------------------------ +; +; The following is the table structure of the parser. All fields are +; two bytes field (accept for the device and id name) +; +; TABLE HEADER : +; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Number of devices. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ +; ³ Device # 2 offset ³ ³ Table_1 (a) ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ +; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device # 4 offset ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N = 1,2,3 or 4. A two bytes number indicating the number of device specified. +; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset +; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1 +; (b)...etc.). If an error was detected in the command N is set to zero. +; +; +; +; TABLE_1 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Number of Offsets. ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³ +; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³ +; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ "Reserved" ³ ³ ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ ³ ³ ³ +; ³ ÀÄÄÄÄÄij Table_4 (a) ³ +; ³ ³ ³ +; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ ³ ³ +; ÀÄÄÄÄÄÄÄij Table_5 (a) ³ +; ³ ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N=Length of table_1, or the number of offsets contained in table_1. +; The offsets are pointers (two bytes) to the parameters value of the device. +; "Reserved" : a two byte memory reserved for future use of the "PARMS" option. +; +; +; TABLE_2 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of devices name ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device name ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Length of device name. Device length is always 8 byte long. +; Device Name : the name of the device (eg. LPT1, CON, PRN). The name +; is paded with spaces to make up the rest of the 8 characters. +; +; +; +; TABLE_3 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of Id name. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Id Name ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Length of id name. Id name length is always 8 byte long. +; Id Name : the name of the id (eg. EGA, VGA, 3812). The name +; is paded with spaces to make up the rest of the 8 character. +; +; +; +; TABLE_4 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of table. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 1 ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 2 ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ . ³ +; ³ . ³ +; ³ . ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 10 ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N = Length of table in words. Or the number of HWCP's. +; HWCP # N : a hardware code page number converted to binary. The maximum +; number of pages allowed is 10. +; +; +; +; TABLE_5 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of table. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Designate ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Font ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Lenght of table. 0 - nothing was specified +; 1 - Only a designate was specified. +; 2 - Designate and font were given. If the Desg field +; was left empty in the DEVICE command then the +; Designate field is filled with 0FFFFH. +; Designate, Font : Are the Desg. and Font binary numbers. +; +;------------------------------------------------------ +; + +PROGRAM SEGMENT + + ASSUME CS:PROGRAM + ASSUME DS:PROGRAM + ASSUME ES:PROGRAM + + ORG 100H + +START: + JMP NOW + +;RESERVED MEMORY: +TABLE_1 DW ? ; Pointer at offsets. +TABLE_2 DW ? ; Pointer at device name. +TABLE_3 DW ? ; Pointer at id name. +TABLE_4 DW ? ; Pointer at hwcp. +TABLE_5 DW ? ; Pointer at desg and font. +TABLE DB 290 DUP (?) ; Table of parsed parms. Max 4 devices. +DEVNUM DW ? ; Counter to number of devices. +RIGHT_FLAG DB ? ; Flag to indicate a left bracket. +DEV_ERR_FLG DB ? ; Device name error flag. +ID_ERR_FLG DB ? ; Id name error flag. +ERROR_FLAG DB ? ; Error flag_terminate program if set to 1. +COMMA_FLAG DB ? ; Indicate the number of commas incounterd. +HWCP_FLAG DB ? ; Flag for multiple hwcps. +DESG_FLAG DB ? ; Flag indicates desg. and font. + +;Main part of program-links different sumbroutines together +NOW: + CALL PARSER + INT 20H ;Exit DOS. + +PARSER PROC + + PUSH AX ; ;;;;;;;;;;;;;;;;;; + PUSH BX ; ; + PUSH CX ; ; SAVE + PUSH DX ; ; ALL + PUSH DS ; ; REGISTERS. + PUSH ES ; ; + PUSH DI ; ; + PUSH SI ; ;;;;;;;;;;;;;;;;;; + + ;LES SI,RH.RH0_BPBA ; Point at all after DEVICE= + ; in the CONFIG.SYS file. + + mov di,81h ; ;;;;;;;;;;;;;;;;;;;;;;;;; + mov cl,cs:byte ptr [di-1] ; ; ;; + xor ch,ch ; ; ERASE THIS ;; + add di,cx ; ;;;;;;;; CODE IN ;; + mov ds:word ptr[di],0a0dh ; ; CPS ;; + ; ;;;;;;;; ;; + MOV SI,0081h ; ;Set SI at parameters. ;; + ; ;;;;;;;;;;;;;;;;;;;;;;;;; + +;Skip to end of file name, to the first DOS delimiter. + + MOV DEVNUM,02H ; Number of devices counter. + +GET_PARMS_A: CALL GET_CHAR ; Get command character in AL . + JZ EXIT_B ; No parms found. + CALL IS_DELIM ; If not a delimiter then. + JNE GET_PARMS_A ; Check next character. + + MOV DI,OFFSET TABLE ; Get the table address. + ADD DI,02H ; Point at devices offsets. + MOV BX,DI ; + ADD BX,08H ; Point BX at parms offsets. +TAB2: CALL UPDATE_TABLE ; Update table pointers value. + +CLR_DELIM: CALL GET_CHAR ; Get character into AL. + JZ EXIT_B ; No parms found. + CALL IS_ALPHA ; If alpha then assume. + JZ DEVICE ; A device name. + CALL IS_DELIM ; Is it a delimiter + JNE EXIT_A ; If not then error. + JMP CLR_DELIM ; Get next character. + +DEVICE: MOV DEV_ERR_FLG,00H ; Set device error flag off; + CALL DEVICE_PARSE ; Call routine to parse device name. + CMP DEV_ERR_FLG,01H ; If error flag is + JZ EXIT_A ; set then exit. + CALL OFFSET_TABLE ; Update table. + +ID_PARMS: CALL GET_CHAR ; Load a character in AL. + JZ EXIT_A ; Exit if end of line (error). + CMP AL,'(' ; If AL is a '(' then + JE ID ; Parse ID name. + CALL IS_ALPHA ; If an Alpha + JE ID ; Then parse ID name. + CALL IS_DIGIT ; If a digit + JE ID ; Then parse ID name. + CALL IS_DELIM ; If not a delimiter + JNE EXIT_A ; Then error, exit + JMP ID_PARMS ; Get another number + +EXIT_B: CMP DEVNUM,02H ; If device number above 2 then + JA EXIT_C ; Exit parse. + JMP EXIT_A ; Else error, exit + +ID: MOV ID_ERR_FLG,00H ; Set id error flag off. + CALL ID_PARSE ; Parse ID name. + CMP ID_ERR_FLG,01H ; Was error flag set, then + JE EXIT_A ; Print error message. + CALL OFFSET_TABLE ; Update table of offsets. + + CALL HWCP_PARMS ; Get code page number + CMP ERROR_FLAG,01H ; If error, then + JE EXIT_A ; Print error message and exit + CMP ERROR_FLAG,02H ; If end of string + JE EXIT_H ; Then exit. + + CALL DESG_PARMS ; Get designate number + CMP ERROR_FLAG,01H ; If error, then + JE EXIT_A ; Print error message and exit + JMP EXIT_H ; Then exit. + +EXIT_A: MOV DI,OFFSET TABLE ; Load table offset + MOV DS:WORD PTR [DI],00H ; Set error to on. + STC ; Set carry flag + JMP EXIT_P ; Exit parse. + +EXIT_H: MOV DI,OFFSET TABLE ; Load table offset. + ADD DS:WORD PTR [DI],01H ; Increment number of devices. + CMP DEVNUM,08H ; If 4 devices loaded + JE EXIT_C ; Then exit parse. + ADD DEVNUM,02H ; Increment the number of devices + ADD DI,DEVNUM ; Point at next devices offset. + MOV BX,TABLE_5 ; BX point at + ADD BX,06H ; end of previous table. + JMP TAB2 ; Get next device. + +EXIT_C: CLC + +EXIT_P: POP SI ; ;;;;;;;;;;;;;;;;;; + POP DI ; ; + POP ES ; ; RESTORE + POP DS ; ; ALL + POP DX ; ; REGISTERS. + POP CX ; ; + POP BX ; ; + POP AX ; ;;;;;;;;;;;;;;;;;; + RET + +PARSER ENDP + + +;******************************************************** +;** GET_CHAR : a routine to get next character pointed ** +;** to by ES:SI into AL. ** +;******************************************************** + +GET_CHAR PROC + + MOV AL,ES:BYTE PTR [SI] ; Load character pointed to + CMP AL,09H ; by ES:[SI] in AL. + JE ZOFF ; If tab then O.K + CMP AL,20H ; Turn Z-flag on + JL TURN_Z_ON ; if character +ZOFF: INC SI ; is below + JMP GET_CHAR_X ; 20h. + ; ( End of line +TURN_Z_ON: CMP AL,AL ; delimiters ). +GET_CHAR_X: RET + +GET_CHAR ENDP + + +;******************************************************** +;** IS_ALPHA : a routine to check the character in ** +;** AL if it is an alpha character (a...z,A...Z). ** +;** If character is lower case, convert to upper case. ** +;******************************************************** + +IS_ALPHA PROC + + PUSH AX ; Save value of AL + AND AL,0DFH ; Convert to upper case + CMP AL,'A' ; If <'A', then + JB IS_ALPHA_X ; NZ-flag is set, exit + CMP AL,'Z' ; If >'Z', then + JA IS_ALPHA_X ; NZ-flag is set, exit + CMP AL,AL ; Force Z-flag + POP DX ; Discard lower case. + JMP IA_X ; Exit. +IS_ALPHA_X: POP AX ; Restore value of AL +IA_X: RET + +IS_ALPHA ENDP + + +;******************************************************** +;** IS_DIGIT : a routine to check if the character in ** +;** AL register is a digit (i.e. 1..9). ** +;******************************************************** + +IS_DIGIT PROC + + CMP AL,'0' ; If < '0' then + JB IS_NUM_X ; NZ-flag is set, exit + CMP AL,'9' ; If > '9' then + JA IS_NUM_X ; NZ-flag is set, exit + CMP AL,AL ; Set Z-flag to indecate digit +IS_NUM_X: RET + +IS_DIGIT ENDP + + +;******************************************************** +;** IS_DELIM : This routine check if the character in ** +;** AL is a delimiter. ('+',' ',';',',','=',tab) ** +;******************************************************** + +IS_DELIM PROC + + CMP AL,' ' ; Test for space. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,',' ; Test for comma. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,';' ; Test for semicolon. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,'=' ; Test for equal sign. + JE IS_DELIM_X ; Z-flag is set, exit + CMP AL,09h ; Test for TAB. + +IS_DELIM_X: RET ; Exit + +IS_DELIM ENDP + + +;******************************************************** +;** DEVICE_PARSE : Parse the device driver name and ** +;** store in table. Update offset. ** +;******************************************************** + +DEVICE_PARSE PROC + + MOV DI,TABLE_2 + MOV DS:WORD PTR [DI],0008H ; Save dev name size. + ADD DI,02H ; Increment DI. + MOV CX,9 ; Set counter. +NEXT_C: CALL IS_ALPHA ; if Check then. + JZ SAVE_C ; Save it. + CALL IS_DIGIT ; if Digit then. + JZ SAVE_C ; Save it. + CMP AL,'-' ; If '-' then. + JZ SAVE_C ; Save it. + CALL IS_DELIM ; If a delimiter then. + JZ ADD_SPACE1 ; Pad with spaces. + CMP AL,':' ; If a colon + JE ADD_SPACE1 ; then end device parse + JMP ERR_DEV_PAR ; Else an error. + +SAVE_C: DEC CX ; Decrement counter. + CMP CX,0 ; If counter zero then. + JE ERR_DEV_PAR ; Error. + MOV DS:BYTE PTR [DI],AL ; Save char in table. + INC DI ; Increment pointer. + CALL GET_CHAR ; Get another char. + JZ ERR_DEV_PAR + JMP NEXT_C ; Check char. + +ERR_DEV_PAR: MOV DEV_ERR_FLG,01H ; Set error flag. + JMP DEV_PAR_X ; Exit. + +ADD_SPACE1: DEC CX ; Check counter. + CMP CX,1 + JL DEV_PAR_X ; Exit if already 8. +LL1: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. + INC DI ; Increment pointer. + LOOP LL1 ; Loop again. +DEV_PAR_X: RET + +DEVICE_PARSE ENDP + + +;******************************************************** +;** ID_PARSE : Parse the id driver name and ** +;** store in table. Update offset. ** +;******************************************************** + +ID_PARSE PROC + + MOV DI,TABLE_3 + MOV DS:WORD PTR [DI],0008H ; Save dev name size. + ADD DI,02H ; Increment DI. + MOV RIGHT_FLAG,00H ; Clear flag. + MOV CX,9 ; Set counter. + +NEXT_I: CALL IS_ALPHA ; If Check then. + JZ SAVE_I ; Save it. + CALL IS_DIGIT ; if Digit then. + JZ SAVE_I ; Save it. + CMP AL,'-' ; If '-' then. + JZ SAVE_I ; Save it. + CMP AL,'(' ; If '(' then. + JE RIG_BR_FLG ; Set flag. + CMP AL,')' ; If ')' then + JE BR_FLG_LEF ; Pad with spaces. + CALL IS_DELIM ; If a delimiter then. + JZ ADD_SPACE2 ; Pad with spaces. + JMP ERR_ID_PAR ; Else an error. + +SAVE_I: DEC CX ; Decrement counter. + CMP CX,0 ; If counter zero then. + JLE ERR_ID_PAR ; Error. + MOV DS:BYTE PTR [DI],AL ; Save char in table. + INC DI ; Increment pointer. + CALL GET_CHAR ; Get another char. + JZ ADD_SPACE2 ; Exit routine. + JMP NEXT_I ; Check char. + +ERR_ID_PAR: MOV ID_ERR_FLG,01H ; Set error falg on. + JMP ID_PAR_X ; Exit. + +BR_FLG_LEF: CMP RIGHT_FLAG,01H ; If left bracket was + JNE ERR_ID_PAR ; found and no previous + JMP ADD_SPACE2 ; Bracket found, then error + +RIG_BR_FLG: CMP RIGHT_FLAG,01H ; If more than one bracket + JE ERR_ID_PAR ; then error. + CMP CX,09 ; If '(' and already id + JB ERR_ID_PAR ; then error. + MOV RIGHT_FLAG,01H ; Set flag for. + CALL GET_CHAR ; Left brackets. + JZ ERR_ID_PAR ; If end of line,exit. + JMP NEXT_I ; Check character. + +ADD_SPACE2: DEC CX ; Check counter. + CMP CX,1 + JL ID_PAR_X ; Exit if already 8. + +LL2: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces. + INC DI ; Increment pointer. + LOOP LL2 ; Loop again. + +ID_PAR_X: RET + +ID_PARSE ENDP + +;******************************************************** +;** HWCP_PARMS : Scane for the hardware code page, and ** +;** parse it if found. Flag codes set to: ** +;** ERROR_FLAG = 0 - parsing completed. No error. ** +;** ERROR_FLAG = 1 - error found exit parse. ** +;** ERROR_FLAG = 2 - end of line found, exit parse. ** +;******************************************************** + + +HWCP_PARMS PROC + + MOV COMMA_FLAG,00H ; Set the comma flag off. + MOV ERROR_FLAG,00H ; Set the error flag off. + DEC SI ; Point at current char in Al. + CMP RIGHT_FLAG,01H ; If no left brackets then + JNE LEFT_BR ; Exit parse. + +HWCP_1: CALL GET_CHAR ; Load character in AL. + JZ LEFT_BR ; Exit, if end of line. + CALL IS_DIGIT ; Check if digit, then + JE HP1 ; Parse hwcp parms. + CMP AL,',' ; If a comma + JE COMMA_1 ; Jump to comma_1 + CMP AL,')' ; If a ')' then + JE RIGHT_BR ; end of current dev parms. + CMP AL,'(' ; If a '(' then + JE HWCP_2 ; There are multible hwcp. + CALL IS_DELIM ; Else, if not a delimiter + JNE EXIT_2 ; Then error, exit + JMP HWCP_1 ; Get another character. + +LEFT_BR: CMP RIGHT_FLAG,01H ; If no left bracket + JE EXIT_2 ; Then error, exit + JMP RB1 ; Jump to rb1 + +COMMA_1: CMP COMMA_FLAG,01H ; If comma flag set + JE COM_2_HC ; Then exit hwcp parse. + MOV COMMA_FLAG,01H ; Else set comma flag. +JMP HWCP_1 ; Get another character. + +HWCP_2: CMP RIGHT_FLAG,01H ; If left bracket not set + JNE EXIT_2 ; then error. + CALL MUL_HWCP ; else call multiple hwcp + ADD DI,02H ; routine. Increment DI + MOV TABLE_5,DI ; Desg. Table starts at end + CALL OFFSET_TABLE ; Update table of offsets. + JMP HP_X ; Exit. + +HP1: JMP HWCP ; Jump too long. + +COM_2_HC: MOV DI,TABLE_4 ; DI points at hwcp table + MOV DS:WORD PTR [DI],0000H ; Set number of pages to + MOV COMMA_FLAG,00H ; Zero and reset comma flag. + ADD DI,02H ; Increment DI. + MOV TABLE_5,DI ; Desg. Table starts at end + CALL OFFSET_TABLE ; Update table of offsets. + JMP HP_X ; of hwcp table. Exit. + +RIGHT_BR: CMP RIGHT_FLAG,01H ; If left brackets not + JNE EXIT_2 ; Found then error. +RB1: MOV ERROR_FLAG,02H ; Set end of line flag. + MOV BX,TABLE_4 ; Point at hwcp table + ADD BX,02H ; Adjust pointer to desg + MOV TABLE_5,BX ; table, and save in table_5 + MOV DI,TABLE_1 ; Point at table of offsets + ADD DI,08H ; Set at DESG offset + MOV DS:WORD PTR [DI],BX ; Update table. + JMP HP_X ; Exit + + + +EXIT_2: MOV ERROR_FLAG,01H ; Set error flag. + JMP HP_X ; and exit. + +HWCP: CMP RIGHT_FLAG,01H ; If left brackets not + JNE EXIT_2 ; Found then error. + CALL HWCP_PARSE ; Call parse one hwcp. + CMP ERROR_FLAG,01H ; If error flag set + JE HP_X ; Then exit, else + CALL OFFSET_TABLE ; Update table of offsets. + +HP_X: RET + +HWCP_PARMS ENDP + + +;******************************************************** +;** HWCP_PARSE : Parse the hardware code page page ** +;** number and change it from hex to binary. ** +;******************************************************** + +HWCP_PARSE PROC + + MOV DI,TABLE_4 ; Load address of hwcpages. + ADD DS:WORD PTR [DI],0001H ; Set count to 1 + + CALL GET_NUMBER ; Convert number to binary. + CMP ERROR_FLAG,01H ; If error then + JE HWCP_X ; Exit. + MOV DS:WORD PTR [DI+2],BX ; Else, save binary page number + ADD DI,04H ; Increment counter + MOV TABLE_5,DI ; Set pointer of designate num + +HWCP_X: RET + +HWCP_PARSE ENDP + + +;******************************************************** +;** MUL_HWCP : Parse multiple hardware code pages ** +;** and convert them from hex to binary numbers. ** +;******************************************************** + +MUL_HWCP PROC + + MOV DI,TABLE_4 ; Load offset of table_4 + MOV BX,DI ; in DI and Bx. + MOV HWCP_FLAG,00H ; Set hwcp flag off. + +MH1: CALL GET_CHAR ; Load character in AL. + JZ MH3 ; Exit if end of line. + CMP AL,')' ; If ')' then exit + JE MH2 ; end of parms. + CALL IS_DIGIT ; If a digit, then + JE MH4 ; Convert number to binary. + CALL IS_DELIM ; If not a delimiter + JNE MH3 ; then error, exit + JMP MH1 ; get another character. + +MH2: CALL GET_CHAR ; Get next character + JMP MH_X ; and exit. + +MH3: MOV ERROR_FLAG,01H ; Set error flag on. + JMP MH_X ; Exit. + +MH4: ADD HWCP_FLAG,01H ; Set hwcp flag on (0 off) + ADD DI,02H ; Increment table pointer + PUSH BX ; Save Bx + CALL GET_NUMBER ; Convert number to binary. + MOV DS:WORD PTR [DI],BX ; Add number to table + POP BX ; Restore BX. + CMP ERROR_FLAG,01H ; If error then + JE MH_X ; Exit. + ADD DS:WORD PTR [BX],01H ; Increment hwcp count. + DEC SI ; Point at character in AL + JMP MH1 ; (delimeter or ')'). +MH_X: RET + +MUL_HWCP ENDP + + + +;******************************************************** +;** DESG_PARMS : Scane for the designate numbers, and ** +;** parse it if found. Flag codes set to: ** +;** ERROR_FLAG = 0 - parsing completed. No error. ** +;** ERROR_FLAG = 1 - error found exit parse. ** +;** ERROR_FLAG = 2 - end of line found, exit parse. ** +;******************************************************** + + +DESG_PARMS PROC + + MOV DI,TABLE_1 ; Get offset of dev in DI + MOV BX,TABLE_5 ; & offset of desg. in BX. + ADD DI,08 ; Location of desg offset in table. + MOV DS:WORD PTR [DI],BX ; Update table. + MOV COMMA_FLAG,00H ; Set comma flag off. + + cmp al,'(' + je df + cmp al,')' + je right_br2 + + cmp al,',' + jne desg_parm1 + mov comma_flag,01h + +DESG_PARM1: CALL GET_CHAR ; Get character in AL. + JZ EXIT_3 ; Error, if end of line + CALL IS_DIGIT ; If character is a digit + JE DESG ; Then convert to binary. + CMP AL,')' ; If a ')', then + JE RIGHT_BR2 ; end of parameters. + CMP AL,'(' ; If a '(' then + JE DF ; parse desg and font. + CMP AL,',' ; If a comma then + JE DP3 ; set flag. + CALL IS_DELIM ; If not a delimiter + JNE EXIT_3 ; then error. + JMP DESG_PARM1 ; Get another character. + +RIGHT_BR2: CMP RIGHT_FLAG,01H ; IF no '(' encountered, + JNE EXIT_3 ; then error, exit + JMP DP_x ; Jump to DP1. + +EXIT_3: MOV ERROR_FLAG,01H ; Set error flag on + JMP DP_X ; Exit. + +DF: CMP RIGHT_FLAG,01H ; If no '(' encountered + JB EXIT_3 ; then error, exit + CALL DESG_FONT ; Parse desg and font. + JMP DP1 ; Jump to DP1. + +DP2: CALL FIND_RIGHT_BR ; Check for ')' + JMP DP_X ; Exit. + +DP3: CMP COMMA_FLAG,01H ; If comma flag set + JE DP2 ; then error + MOV COMMA_FLAG,01H ; Else set comma flag on. + JMP DESG_PARM1 ; Get another character. + +DESG: MOV ERROR_FLAG,00H ; Set error flag off. + CALL DESG_PARSE ; Parse desg. +DP1: CMP ERROR_FLAG,01H ; If error flag on then + JE DP_X ; Exit, + CALL FIND_RIGHT_BR ; Else check for ')' + CALL OFFSET_TABLE ; Update table + +DP_X: RET + +DESG_PARMS ENDP + + + +;******************************************************** +;** DESG_FONT : Parse the designate and font numbers & ** +;** change them from decimal to binary. ** +;******************************************************** + + +DESG_FONT PROC + + + MOV DI,TABLE_5 ; Get desg font table. + MOV COMMA_FLAG,00H ; Set comma flag off. +DF1: CALL GET_CHAR ; Load a character in AL. + JZ DF3 ; Error if end of line. + CMP AL,',' ; Check if a comma. + JE DF2 ; Set flag. + CALL IS_DIGIT ; If a digit, then + JE DF5 ; Convert number to binary. + CMP AL,')' ; If a ')' then + JE DF4 ; Exit. + CALL IS_DELIM ; If not a delimiter + JNE DF3 ; then error, exit + JMP DF1 ; Get another character. + +DF2: CMP COMMA_FLAG,01H ; If comma flag on + JE DF3 ; then error, exit + MOV COMMA_FLAG,01H ; Set comma flag on + ADD DS:WORD PTR [DI],01H ; Increment desg counter. + MOV DS:WORD PTR [DI+2],0FFFFH ; Load ffffh for desg empty + JMP DF1 ; field. + +DF3: MOV ERROR_FLAG,01H ; Set error flag on. + JMP DF_X ; Exit. + +DF4: CMP DESG_FLAG,00H ; If desg flag off + JE DF3 ; then error, exit + JMP DF_X ; Else exit. + +DF5: ADD DS:WORD PTR [DI],01H ; Increment desg font count. + CMP DESG_FLAG,01H ; If desg flag is on + JE DF6 ; then get font. + CMP COMMA_FLAG,01H ; if comma flag is on + JE DF6 ; then get font. + MOV DESG_FLAG,01H ; Set desg flag on + JMP DF7 ; Get desg number. + +DF6: ADD DI,02H ; adjust pointer to font. + MOV DESG_FLAG,02H ; Set desg and font flag. +DF7: CALL GET_NUMBER ; Get a number & convert to + CMP ERROR_FLAG,01H ; binary. + JE DF_X ; If error flag set, Exit. + MOV DS:WORD PTR [DI+2],BX ; Store number in table. + CMP DESG_FLAG,02H ; If desg and font flag + JNE DF1 ; not set, then get char. + CALL FIND_RIGHT_BR ; Check for right bracket. + +DF_X: RET + +DESG_FONT ENDP + + +;******************************************************** +;** DESG_PARSE : Parse the designate number and ** +;** change it from decimal to binary. ** +;******************************************************** + +DESG_PARSE PROC + + MOV DI,TABLE_5 ; Load designate location + ADD DS:WORD PTR [DI],0001H ; Update table count. + + CALL GET_NUMBER ; Get the ascii number and + CMP ERROR_FLAG,01H ; conver it to binary + JE DESG_X ; If error then exit + + MOV DS:WORD PTR [DI+2],BX ; Else, save desg number + + +DESG_X: RET + +DESG_PARSE ENDP + + +;******************************************************** +;** GET_NUMBER : Convert the number pointed to by SI ** +;** to a binary number and store it in BX ** +;******************************************************** + +GET_NUMBER PROC + + MOV CX,0AH ; Set multiplying factor + XOR BX,BX ; Clear DX + +NEXT_NUM: SUB AL,30H ; Conver number to binary + CBW ; Clear AH + XCHG AX,BX ; Switch ax and bx to mul + MUL CX ; already converted number by 10. + JO ERR_NUM ; On over flow jump to error. + ADD BX,AX ; Add number to total. + JC ERR_NUM ; On over flow jump to error. + XOR AX,AX ; Clear AX (clear if al=0a). + CALL GET_CHAR ; Get next character + JZ GET_NUM_X ; Exit, if end of line. + CALL IS_DIGIT ; Call is digit. + JNZ GET_NUM_X ; Exit if not a number. + JMP NEXT_NUM ; Loop. + +ERR_NUM: MOV ERROR_FLAG,01H ; Set error code to 1. + +GET_NUM_X: RET + +GET_NUMBER ENDP + + +;******************************************************** +;** UPDATE_TABLE : This routine set up pointers to the ** +;** different offsets of the different tables ** +;******************************************************** + +UPDATE_TABLE PROC + + MOV DS:WORD PTR [DI],BX ; Offset of offsets + MOV TABLE_1,BX ; Table_1 points at offsets + + MOV DI,BX ; + ADD BX,0CH ; + MOV DS:WORD PTR [DI+2],BX ; Offset of DEVICE name. + MOV TABLE_2,BX ; Table_2 point at device name. + + ADD BX,0AH ; + MOV DS:WORD PTR [DI+4],BX ; Offset of ID name. + MOV TABLE_3,BX ; Table_3 point at ID name. + + ADD BX,0AH ; + MOV DS:WORD PTR [DI+6],BX ; Offset of HWCP pages. + MOV TABLE_4,BX ; Table_4 point at HWCP pages. + + RET + +UPDATE_TABLE ENDP + + +;******************************************************** +;** OFFSET_TABLE : This routine set up pointers of ** +;** tables number one and two. ** +;******************************************************** + +OFFSET_TABLE PROC + + MOV DI,TABLE_1 ; Increment the number + ADD DS:WORD PTR [DI],01H ; of parms foun. (ie. id,hwcp + RET ; and desg) + +OFFSET_TABLE ENDP + + +;******************************************************** +;** FIND_RIGHT_BR :This routine scane the line for a ** +;** ')' if cannot find it turns error flag on ** +;******************************************************** + +FIND_RIGHT_BR PROC + +FBR1: CMP AL,')' ; If a right bracket + JE FBR_X ; then exit. + CMP AL,' ' ; If not a space + JNE FBR2 ; Then error. + CALL GET_CHAR ; Get a character + JZ FBR2 ; If end of line then exit. + JMP FBR1 ; Else get another character. + +FBR2: MOV ERROR_FLAG,01H ; Set error flag on +FBR_X: MOV AL,20H ; Erase character from AL. + RET + +FIND_RIGHT_BR ENDP + + +PROGRAM ENDS + END START diff --git a/v4.0/src/DEV/PRINTER/PARSER.ASM b/v4.0/src/DEV/PRINTER/PARSER.ASM new file mode 100644 index 0000000..f299838 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PARSER.ASM @@ -0,0 +1,668 @@ +PAGE ,132 +TITLE PARSE CODE AND CONTROL BLOCKS FOR PRINTER.SYS + +;****************** START OF SPECIFICATIONS ************************** +; +; MODULE NAME: PARSER.ASM +; +; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR +; PRINTER.SYS +; +; FUNCTION: THE COMMAND LINE PASSED TO PRINTER.SYS IN THE CONFIG.SYS +; STATEMENT IS PARSED TO CHECK FOR CORRECT SYNTAX. A TABLE +; IS SETUP CONTAINING THE VALUES FOUND. +; +; ENTRY POINT: PARSER +; +; INPUT: ES:DI POINTS TO REQUEST HEADER +; +; AT EXIT: +; NORMAL: TABLE SET UP WITH VALUES FOUND. +; +; ERROR: 0 RETURNED IN FIRST WORD OF TABLE. +; +; INTERNAL REFERENCES: +; +; ROUTINES: SYSPARSE - PARSING CODE +; +; DATA AREAS: PARMSx - PARSE CONTROL BLOCK FOR SYSPARSE +; +; EXTERNAL REFERENCES: +; +; ROUTINES: N/A +; +; DATA AREAS: TABLE - TO CONTAIN VALUES FOUND IN DEVICE= LINE +; +; NOTES: +; +; REVISION HISTORY: +; AN000; - DOS Version 4.00 +; AN001 - GHG Changes had to made for P897. The PARSER was +; changed to need the '=' in the keywords. +; +; Label: "DOS DISPLAY.SYS Device Driver" +; "Version 4.00 (C) Copyright 1988 Microsoft +; "Licensed Material - Program Property of Microsoft" +; +; +;****************** END OF SPECIFICATIONS **************************** +;*Modification history ******************************************************** +;AN001; p1482 - PRINTER.SYS refused to initialize 10/6/87 J.K. +;AN002; p2686 No range checking on n parameter for printer.sys 12/11/87 J.K. +;****************************************************************************** + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; The following is the table structure of the parser. All fields are +; two bytes field (accept for the device and id name) +; +; TABLE HEADER : +; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Number of devices. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ +; ³ Device # 2 offset ³ ³ Table_1 (a) ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ +; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device # 4 offset ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N = 1,2,3 or 4. A two bytes number indicating the number of device specified. +; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset +; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1 +; (b)...etc.). If an error was detected in the command N is set to zero. +; +; +; +; TABLE_1 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Number of Offsets. ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³ +; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³ +; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ "Reserved" ³ ³ ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ ³ ³ ³ +; ³ ÀÄÄÄÄÄij Table_4 (a) ³ +; ³ ³ ³ +; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ ³ ³ +; ÀÄÄÄÄÄÄÄij Table_5 (a) ³ +; ³ ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N=Length of table_1, or the number of offsets contained in table_1. +; The offsets are pointers (two bytes) to the parameters value of the device. +; "Reserved" : a two byte memory reserved for future use of the "PARMS" option. +; +; +; TABLE_2 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of devices name ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Device name ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Length of device name. Device length is always 8 byte long. +; Device Name : the name of the device (eg. LPT1, CON, PRN). The name +; is paded with spaces to make up the rest of the 8 characters. +; +; +; +; TABLE_3 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of Id name. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Id Name ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Length of id name. Id name length is always 8 byte long. +; Id Name : the name of the id (eg. EGA, VGA). The name +; is paded with spaces to make up the rest of the 8 character. +; +; +; +; TABLE_4 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of table. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 1 ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 2 ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ . ³ +; ³ . ³ +; ³ . ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ HWCP # 10 ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; +; N = Length of table in words. Or the number of HWCP's. +; HWCP # N : a hardware code page number converted to binary. The maximum +; number of pages allowed is 10. +; +; +; +; TABLE_5 : +; ÍÍÍÍÍÍÍÍÍ +; +; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +; ³ N = Length of table. ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Designate ³ +; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ +; ³ Font ³ +; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +; N = Lenght of table. 0 - nothing was specified +; 1 - Only a designate was specified. +; 2 - Designate and font were given. If the Desg field +; was left empty in the DEVICE command then the +; Designate field is filled with 0FFFFH. +; Designate, Font : Are the Desg. and Font binary numbers. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +.XLIST +INCLUDE STRUC.INC ; Structured macros ;AN000; +.LIST + +INCLUDE CPSPEQU.INC ;AN000; + +PUBLIC PARSER ; near procedure for parsing DEVICE= statement ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Set assemble switches for parse code +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +DateSW EQU 0 ;AN000; +DrvSW EQU 0 ;AN000; +SwSW EQU 0 ;AN000; +Val1SW EQU 1 ;;AN002; ;AN000; +Val2SW EQU 0 ;AN000; +Val3SW EQU 0 ;AN000; + + +CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000; + ASSUME CS:CSEG,DS:NOTHING,ES:NOTHING ;AN000; + + +EXTRN TABLE:WORD ; table for variable storage used by INIT module. ;AN000; +EXTRN DEVICE_NUM:WORD ;AN000; + +.XLIST +INCLUDE PARSE.ASM ; Parsing code ;AN000; +.LIST + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PARM control block for parsing PRINTER.SYS - DEVICE= command statement. +; Command line looks like: +; +; DEVICE=[d:][path]PRINTER.SYS LPT#[:]=(type[,[hwcp][,n]]) +; or +; DEVICE=[d:][path]PRINTER.SYS LPT#[:]=(type[,[(hwcp1,hwcp2,...)][,n]]) +; +; The command line will be parsed from left to right, taking care of the +; nesting of complex lists as they occur. +; +; The first level of control blocks is shown below. +; Complex list control blocks follow. +; Null VALUE LIST and RESULT BUFFER are placed after all other PARSE control +; blocks. +; +; d:\path\PRINTER.SYS lpt#=(complex list) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARMS1 LABEL WORD ;AN000; + DW PARMSX1 ;AN000; + DB 0 ; no extra delimeters or EOLs. ;AN000; + +PARMSX1 LABEL BYTE ;AN000; + DB 1,1 ; min,max positional operands ;AN000; + DW D_NAME ; pointer to control block ;AN000; + DB 0 ; no switches ;AN000; + DB 1 ; 1 or more keywords ;AN000; + DW PRT_LIST ; pointer to control block ;AN000; + +D_NAME LABEL WORD ;AN000; + DW 0200H ; file spec ;AN000; + DW 0001H ; cap result by file table ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; no value checking done ;AN000; + DB 0 ; no keyword/switch synonyms ;AN000; + +PRT_LIST LABEL WORD ;AN000; + DW 0402H ; complex list, repeats allowed ;AN000; + DW 0002H ; cap result by char table ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; no value checking done ;AN000; + DB 8 ; 4 keywords ;AN000; + DB "PRN=",0 ;GHG Ä¿ ;AN001; + DB "LPT1=",0 ;GHG ³ 4 possible keywords ;AN001; + DB "LPT2=",0 ;GHG ³ ;AN001; + DB "LPT3=",0 ;GHG ÄÙ ;AN001; + DB "PRN:=",0 ;GHG Ä¿ ;AN001; + DB "LPT1:=",0 ;GHG ³ 4 possible keywords ;AN001; + DB "LPT2:=",0 ;GHG ³ with colon ;AN001; + DB "LPT3:=",0 ;GHG ÄÙ ;AN001; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PARM control block for second level of nesting. +; ie. complex list from first level of nesting +; +; (type, hwcp or complex list, n) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARMS2 LABEL WORD ;AN000; + DW PARMSX2 ;AN000; + DB 0 ; no extra delimeters or EOLs. ;AN000; + +PARMSX2 LABEL BYTE ;AN000; + DB 1,3 ; min,max positional operands ;AN000; + DW PRT_TYPE ; pointer to control block ;AN000; + DW HWCP ; pointer to control block ;AN000; + DW CP_PREPS ; pointer to control block ;AN000; + DB 0 ; no switches ;AN000; + DB 0 ; no keywords ;AN000; + +PRT_TYPE LABEL BYTE ;AN000; + DW 2000H ; sstring ;AN000; + DW 0002H ; cap by char table ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; value list ;AN000; + DB 0 ; no keyword/switch synonyms ;AN000; + +HWCP LABEL BYTE ;AN000; + DW 8401H ; numeric or complex list (optional) ;AN000; + DW 0 ; no functions ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; no value checking done ;AN000; + DB 0 ; no keyword/switch synonyms ;AN000; + +CP_PREPS LABEL BYTE ;AN000; + DW 8001H ; numeric (optional) ;AN000; + DW 0 ; no functions ;AN000; + DW RESULT_BUF ; result ;AN000; + DW N_Val_Range ;AN002; value list ;AN000; + DB 0 ; no keyword/switch synonyms ;AN000; + + +N_Val_Range label byte + db 1 ;AN002; Range defintion + db 1 ;AN002; Number of ranges + db 1 ;AN002; item tag + dd 0, 12 ;AN002; 0 - 12 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PARM control block for third level of nesting. +; ie. complex list from second nesting level +; +; (hwcp1,hwcp2,...) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARMS3 LABEL WORD ;AN000; + DW PARMSX3 ;AN000; + DB 0 ; no extra delimeters or EOLs. ;AN000; + +PARMSX3 LABEL BYTE ;AN000; + DB 1,1 ; min,max positional operands ;AN000; + DW HWCPS ; pointer to control block ;AN000; + DB 0 ; no switches ;AN000; + DB 0 ; no keywords ;AN000; + +HWCPS LABEL BYTE ;AN000; + DW 8003H ; numeric, repeats allowed ;AN000; + DW 0 ; no functions ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; no value checking done ;AN000; + DB 0 ; no keyword/switch synonyms ;AN000; + + +; Null VALUE LIST and RESULT BUFFER for all PARSE control blocks + + +NOVALS LABEL BYTE ;AN000; + DB 0 ; no value checking done ;AN000; + +RESULT_BUF LABEL BYTE ;AN000; +RESULT_TYPE DB ? ; type returned (number, string, etc.) ;AN000; + DB ? ; matched item tag (if applicable) ;AN000; +SYN_PTR DW ? ; synonym ptr (if applicable) ;AN000; +RESULT_VAL DD ? ; value ;AN000; + + +OK_FLAG DB ON ; FLAG INDICATING PARSE STATUS ;AN000; +NUM_LOOP DB ZERO ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PARSER +; +; FUNCTION: +; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST +; BLOCK. +; +; AT ENTRY: ES:DI POINTS TO REQUEST HEADER +; +; AT EXIT: +; NORMAL: TABLE SET UP WITH VALUES FOUND +; +; ERROR: 0 LOADED IN FIRST WORD OF TABLE +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARSER PROC NEAR ;AN000; + PUSH DX ;AN000; + PUSH DI ;AN000; + PUSH ES ;AN000; + PUSH BX ;AN000; + PUSH DS ; ;AN000; + PUSH SI ; ;AN000; + CLD ; ;AN000; + LDS SI,RH.RH0_BPBA ; ;AN000; + PUSH CS ; establish ES .. ;AN000; + POP ES ; addressability to data ;AN000; + LEA DI,PARMS1 ; point to PARMS control block ;AN000; + XOR CX,CX ; clear both CX and DX for ;AN000; + XOR DX,DX ; SYSPARSE ;AN000; + CALL SYSPARSE ; move pointer past file spec ;AN000; + CALL SYSPARSE ; do first parse ;AN000; + LEA BX,TABLE ; ;AN000; + .WHILE AND ; EOL?...then end parse...and.. ;AN000; + .WHILE ; make sure that flag still ok.. ;AN000; + .IF ; parse error? ;AN000; + MOV OK_FLAG,OFF ; yes...reset flag ;AN000; + .ELSE ; ;AN000; + .SELECT ; ;AN000; + .WHEN ; complex string found? ;AN000; + INC DEVICE_NUM ; increment count ;AN000; + INC BX ; point to next device table ;AN000; + INC BX ; ;AN000; + .IF ; more than one? ;AN000; + MOV OK_FLAG,OFF ; yes....we have an error ;AN000; + .ELSE ; no .. ;AN000; + PUSH BX ; ;AN000; + MOV BX,CS:[BX] ; ;AN000; + CALL COPY_NAME ; ;AN000; + MOV NUM_LOOP,ZERO ; ;AN000; + CALL PARSE_MAIN ; process complex string.. ;AN000; + POP BX ; ;AN000; + .ENDIF ; ;AN000; + .OTHERWISE ; not a complex string so.. ;AN000; + MOV OK_FLAG,OFF ; we have a problem...reset flag ;AN000; + .ENDSELECT ; ;AN000; + .ENDIF ; ;AN000; + PUSH BX ; ;AN000; + CALL SYSPARSE ; continue parsing.. ;AN000; + POP BX ; ;AN000; + .ENDWHILE ; ;AN000; + .IF ; flag indicating error? ;AN000; + MOV DEVICE_NUM,ZERO ; yes...set device number to 0 ;AN000; + STC ; ;AN000; + .ELSE ; ;AN000; + CLC ; ;AN000; + .ENDIF ; ;AN000; + POP SI ; ;AN000; + POP DS ; ;AN000; + POP BX ; ;AN000; + POP ES ; ;AN000; + POP DI ; ;AN000; + POP DX ; ;AN000; + RET ; ;AN000; +PARSER ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PARSE_MAIN +; +; FUNCTION: +; THIS PROCEDURE PARSES THE LPT=( ) COMPLEX LIST DEVICE= LINE FOUND +; IN CONFIG.SYS +; +; AT ENTRY: RESULT BUFFER CONTAINS POINTER TO COMPLEX STRING +; +; AT EXIT: +; NORMAL: TABLE SET UP WITH VALUES FOUND +; +; ERROR: OK_FLAG = 0 +; +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARSE_MAIN PROC NEAR ;AN000; + PUSH BX ; ;AN000; + PUSH DI ; setup to parse the nested.. ;AN000; + PUSH DS ; complex string...but save.. ;AN000; + PUSH SI ; current parsing status. ;AN000; + PUSH CX ; ;AN000; + XOR CX,CX ; ;AN000; + LEA DI,PARMS2 ; next control block.. ;AN000; + LDS SI,RESULT_VAL ; point to stored string ;AN000; + PUSH BX ; ;AN000; + CALL SYSPARSE ; ;AN000; + POP BX ; ;AN000; + .WHILE AND ; not EOL? and.. ;AN000; + .WHILE ; error flag still ok? ;AN000; + INC NUM_LOOP ; ;AN000; + .IF ; check for parse errors ;AN000; + MOV OK_FLAG,OFF ; yes....reset error flag ;AN000; + .ELSE ; no...process ;AN000; + PUSH BX ; ;AN000; + .SELECT ; ;AN000; + .WHEN ; simple string ;AN000; + MOV BX,CS:[BX].DI_OFFSET ; ;AN000; + CALL PARSE_STR ; yes...process ;AN000; + .WHEN ; number?.. ;AN000; + .IF ; ;AN000; + MOV BX,CS:[BX].DCP_OFFSET ;AN000; + .ELSE ; ;AN000; + MOV BX,CS:[BX].DD_OFFSET ;AN000; + .ENDIF ; ;AN000; + MOV AX,WORD PTR RESULT_VAL ; get value into word form ;AN000; + .IF ;AN000; + INC WORD PTR CS:[BX] ; ;AN000; + MOV WORD PTR CS:[BX+2],AX ; load that value. ;AN000; + .ENDIF ;AN000; + .WHEN ; complex string? ;AN000; + MOV BX,CS:[BX].DCP_OFFSET ; ;AN000; + CALL PARSE_COMP ; yes...process ;AN000; + .OTHERWISE ; anything else is.. ;AN000; + MOV OK_FLAG,OFF ; an error...reset flag. ;AN000; + .ENDSELECT ; ;AN000; + CALL SYSPARSE ; continue parsing ;AN000; + POP BX ; ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + POP CX ; restore original parse.. ;AN000; + POP SI ; registers. ;AN000; + POP DS ; ;AN000; + POP DI ; ;AN000; + POP BX ; ;AN000; + RET ; ;AN000; +PARSE_MAIN ENDP ;AN000; + ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PARSE_COMP +; +; FUNCTION: +; THIS PROCEDURE PARSES A COMPLEX LIST FOUND WITHIN THE LPT=( ) +; COMPLEX LIST. +; +; AT ENTRY: RESULT BUFFER CONTAINS POINTER TO COMPLEX STRING +; +; AT EXIT: +; NORMAL: TABLE SET UP WITH VALUES FOUND +; +; ERROR: OK_FLAG = 0 +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARSE_COMP PROC NEAR ;AN000; + PUSH DI ; setup ro parse the nested.. ;AN000; + PUSH DS ; complex string..saving the.. ;AN000; + PUSH SI ; current parse status. ;AN000; + PUSH CX ; ;AN000; + MOV DI,BX ; ;AN000; + PUSH DI ; ;AN000; + XOR CX,CX ; ;AN000; + LEA DI,PARMS3 ; next control block ;AN000; + LDS SI,RESULT_VAL ; point to stored string. ;AN000; + PUSH BX ; ;AN000; + CALL SYSPARSE ; ;AN000; + POP BX ; ;AN000; + .WHILE AND ; not EOL?...and.. ;AN000; + .WHILE AND ; error flag still okay? ;AN000; + .WHILE ; ;AN000; + .IF ; parse error?...or.. ;AN000; + MOV OK_FLAG,OFF ; found?....yes..reset flag. ;AN000; + .ELSE ; no...process.. ;AN000; + INC WORD PTR CS:[BX] ; increment counter ;AN000; + .IF < LE TEN> ;AN000; + POP DI ; ;AN000; + MOV AX,WORD PTR RESULT_VAL ; get numeric value into word ;AN000; + MOV WORD PTR CS:[DI+2],AX ; ;AN000; + INC DI ; ;AN000; + INC DI ; ;AN000; + PUSH DI ; ;AN000; + PUSH BX ; ;AN000; + LEA DI,PARMS3 ; ;AN000; + CALL SYSPARSE ; continue parsing ;AN000; + POP BX ; ;AN000; + .ELSE ; ;AN000; + MOV OK_FLAG,OFF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + POP DI ; ;AN000; + POP CX ; restore previous parse.. ;AN000; + POP SI ; registers. ;AN000; + POP DS ; ;AN000; + POP DI ; ;AN000; + RET ; ;AN000; +PARSE_COMP ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PARSE_STR +; +; FUNCTION: +; THIS PROCEDURE PARSES A STRING FOUND WITHIN THE LPT=( ) STATEMENT +; +; AT ENTRY: RESULT BUFFER POINTS TO ASCIIZ STRING +; +; AT EXIT: +; NORMAL: TABLE SET UP WITH VALUES FOUND +; +; ERROR: STRING > 8 - OK_FLAG SET OFF +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARSE_STR PROC NEAR ;AN000; + PUSH DI ; get source and.. ;AN000; + PUSH DS ; destination registers.. ;AN000; + PUSH SI ; setup. ;AN000; + PUSH CX ; ;AN000; + LDS SI,RESULT_VAL ; ;AN000; + MOV DI,BX ; ;AN000; + MOV CS:[DI].N_LENGTH,EIGHT ; ;AN000; + INC DI ; ;AN000; + INC DI ; ;AN000; + MOV CX,EIGHT ; ;AN000; + LODSB ; load first character. ;AN000; + .WHILE AND ; while not at end of ASCIIZ do.. ;AN000; + .WHILE ; ;AN000; + STOSB ; store.. ;AN000; + LODSB ; load next character.. ;AN000; + DEC CX ; ;AN000; + .ENDWHILE ; ;AN000; + .IF ;AN000; + MOV OK_FLAG,OFF ;AN000; + .ENDIF ;AN000; + POP CX ; value found. ;AN000; + POP SI ; restore registers. ;AN000; + POP DS ; ;AN000; + POP DI ; ;AN000; + RET ;AN000; +PARSE_STR ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: COPY_NAME +; +; FUNCTION: +; THIS PROCEDURE COPIES THE FOUND STRING VALUE INTO THE TABLE. +; +; AT ENTRY: N/A +; +; AT EXIT: +; NORMAL: TABLE UPDATED +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +COPY_NAME PROC NEAR ;AN000; + PUSH DI ; get source and.. ;AN000; + PUSH DS ; destination registers.. ;AN000; + PUSH SI ; setup. ;AN000; + PUSH CS ; ;AN000; + POP DS ; ;AN000; + MOV SI,SYN_PTR ; ;AN000; + MOV DI,CS:[BX].DN_OFFSET ; ;AN000; + MOV CS:[DI].N_LENGTH,EIGHT ; ;AN000; + INC DI ; ;AN000; + INC DI ; ;AN000; + LODSB ; load first character. ;AN000; + .WHILE ; while not at end of ASCIIZ do.. ;AN000; + .IF AND ;ignore colon ;AN001; + .IF ; is this for PRINTER? ;AN000; + JMP DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F ;AN000; + .ENDIF ; ;AN000; + PUSH AX ; ;AN000; + PUSH BP ; ;AN000; + PUSH BX ; s r ;AN000; + PUSH CX ; a e ;AN000; + PUSH DX ; v g ;AN000; + PUSH DI ; e s ;AN000; + PUSH SI ; ;AN000; + PUSH DS ; ;AN000; + PUSH ES ; ;AN000; + MOV CS:COPY_BUF0,ZERO ; ;AN000; + MOV CS:CODE_SEGB,CS ; ;AN000; + MOV BP,BX ; move req. cp to bp ;AN000; + .SELECT ; depending on the lptx.. ;AN000; + .WHEN ; point to the appropriate ;AN000; + LEA BX,BUF1 ; buffer.. ;AN000; + LEA SI,BUF0 ; ;AN000; + MOV CS:COPY_BUF0,SI ; ;AN000; + .WHEN ; ;AN000; + LEA BX,BUF2 ; ;AN000; + .WHEN ; ;AN000; + LEA BX,BUF3 ; ;AN000; + .OTHERWISE ; ;AN000; + STC ; not a valid lptx..set flag ;AN000; + .ENDSELECT ; ;AN000; + .IF NC ; process ;AN000; + .IF ; if unlock requested ;AN000; + CALL UNLOCK_CP ; unlock code page. ;AN000; + .ELSE ; must be a lock request.. ;AN000; + CALL LOCK_CP ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + MOV SI,CS:COPY_BUF0 ; ;AN000; + PUSHF ; ;AN000; + .IF ; if this is lpt1... ;AN000; + MOV AX,CS:[BX].STATE ; copy data into prn ;AN000; + MOV CS:[SI].STATE,AX ; buffer as well. ;AN000; + MOV AX,CS:[BX].SAVED_CP ; ;AN000; + MOV CS:[SI].SAVED_CP,AX ; ;AN000; + .ENDIF ; ;AN000; + POPF ; ;AN000; + POP ES ; ;AN000; + POP DS ; restore ;AN000; + POP SI ; ;AN000; + POP DI ; registers ;AN000; + POP DX ; ;AN000; + POP CX ; ;AN000; + POP BX ; ;AN000; + MOV BP,SP ; ;AN000; + MOV AX,[BP+8] ; load flag onto.. ;AN000; + .IF NC ; ;AN000; + AND AX,NOT_CY ; ;AN000; + .ELSE ; stack flags ;AN000; + OR AX,CY ; ;AN000; + .ENDIF ; ;AN000; + MOV [BP+8],AX ; ;AN000; + POP BP ; ;AN000; + POP AX ; ;AN000; + XCHG AH,AL ; exchange ah and al to show that.. ;AN000; +ABORT: IRET ; printer.sys is present. ;AN000; +INT2F_COM ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: UNLOCK_CP +; +; FUNCTION: +; THIS FUNCTION UNLOCKS THE DEVICE THAT IS LOCKED. +; +; AT ENTRY: +; BX - POINTS TO LPTx BUFFER +; +; +; AT EXIT: +; NORMAL: CARRY CLEAR - DEVICE UNLOCKED. +; +; ERROR: CARRY SET - ERROR DURING UNLOCK, ACTIVE CODE PAGE SET TO INACTIVE +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +UNLOCK_CP PROC NEAR ;AN000; + .IF NEAR ; is device locked? ;AN000; + MOV CS:[BX].STATE,CPSW ; change status to unlocked.. ;AN000; + MOV BP,CS:[BX].SAVED_CP ; get saved code page ;AN000; + .IF ; valid?..... ;AN000; + XOR AX,AX ; ;AN000; + CALL FIND_ACTIVE_CP ; find the active code page. ;AN000; + .IF ; are they the same..? ;AN000; + MOV CS:REQ_CP,BP ; no...invoke the saved code page ;AN000; + PUSH CS ; ;AN000; + POP ES ; ;AN000; + LEA DI,INVOKE_BLOCK ; ;AN000; + MOV CS:[BX].RH_PTRO,DI ; ;AN000; + MOV CS:[BX].RH_PTRS,ES ; ;AN000; + CALL INVOKE ; ;AN000; + .IF ; error on invoke? ;AN000; + MOV AX,ONE ; yes...change the active.. ;AN000; + CALL FIND_ACTIVE_CP ; to inactive. ;AN000; + .IF ; do likewise to PRN if this ;AN000; + PUSH BX ; is lpt1. ;AN000; + MOV BX,CS:COPY_BUF0 ; ;AN000; + CALL FIND_ACTIVE_CP ; ;AN000; + POP BX ; ;AN000; + .ENDIF ; ;AN000; + STC ; set error flag. ;AN000; + .ELSE ; ;AN000; + CLC ; invoke ok...clear error flag ;AN000; + .ENDIF ; ;AN000; + .ELSE ; ;AN000; + CLC ; active = saved ..no invoke... ;AN000; + .ENDIF ; clear error ;AN000; + .ELSE ; ;AN000; + MOV AX,ONE ; saved cp was inactive...change..;AN000; + CALL FIND_ACTIVE_CP ; active to inactive. ;AN000; + .IF ; do likewise to PRN if this ;AN000; + PUSH BX ; is lpt1. ;AN000; + MOV BX,CS:COPY_BUF0 ; ;AN000; + CALL FIND_ACTIVE_CP ; ;AN000; + POP BX ; ;AN000; + .ENDIF ; ;AN000; + CLC ; ;AN000; + .ENDIF ; ;AN000; + MOV CS:[BX].SAVED_CP,UNDEFINED; reset the saved cp ;AN000; + .ENDIF ; ;AN000; + RET ;AN000; +UNLOCK_CP ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: LOCK_CP +; +; FUNCTION: +; THIS FUNCTION LOCKS THE DEVICE WITH THE CODE PAGE REQUESTED. +; +; AT ENTRY: BP - REQUESTED CODE PAGE +; BX - POINTS TO LPTx BUFFER +; +; +; AT EXIT: +; NORMAL: CARRY CLEAR - DEVICE LOCKED. +; +; ERROR: CARRY SET - ERROR, CODE PAGE NOT LOCKED. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +LOCK_CP PROC NEAR ;AN000; + .IF ; if this was previously locked.. ;AN000; + MOV CS:PREV_LOCK,ON ; then...set flag and... ;AN000; + MOV CS:[BX].STATE,CPSW ; change to unlock for this proc ;AN000; + .ELSEIF ; if this is unlocked... ;AN000; + MOV CS:PREV_LOCK,OFF ; then set flag off. ;AN000; + .ELSE ; ;AN000; + STC ; neither...set error ;AN000; + .ENDIF ; ;AN000; + .IF NC ; ;AN000; + CALL CHECK_FOR_CP ; yes..see if req cp is available. ;AN000; + .IF NC ; yes... ;AN000; + XOR AX,AX ; ;AN000; + CALL FIND_ACTIVE_CP ; find the active code page ;AN000; + .IF ; is it the same as requested?.. ;AN000; + MOV CS:REQ_CP,BP ; no..invoke the requested cp ;AN000; + PUSH CS ; ;AN000; + POP ES ; ;AN000; + LEA DI,INVOKE_BLOCK ; ;AN000; + MOV CS:[BX].RH_PTRO,DI ; ;AN000; + MOV CS:[BX].RH_PTRS,ES ; ;AN000; + PUSH DX ; ;AN000; + CALL INVOKE ; ;AN000; + POP DX ; ;AN000; + .IF ; error on invoke? ;AN000; + STC ; yes...set error flag. ;AN000; + .ELSE ; ;AN000; + MOV CS:[BX].STATE,LOCKED ; no, 'lock' the printer device ;AN000; + .IF ; if we were not locked.. ;AN000; + MOV CS:[BX].SAVED_CP,DX ; and..save the old code page. ;AN000; + .ENDIF ; ;AN000; + CLC ; clear error flag. ;AN000; + .ENDIF ; ;AN000; + .ELSE ; ;AN000; + MOV CS:[BX].STATE,LOCKED ; 'lock' the printer device ;AN000; + .IF ; if we were not locked.. ;AN000; + MOV CS:[BX].SAVED_CP,DX ; and..save the old code page. ;AN000; + .ENDIF ; ;AN000; + CLC ; clear the error flag ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + RET ;AN000; +LOCK_CP ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: CHECK_FOR_CP +; +; FUNCTION: +; THIS FUNCTION SEARCHES FOR THE CODE PAGE REQUESTED TO SEE IF IT HAS +; BEEN PREPARED OR IS A HARDWARE CODE PAGE +; +; +; AT ENTRY: BP = CODE PAGE REQUESTED +; BX - POINTS TO LPTx BUFFER +; +; +; AT EXIT: +; NORMAL: CARRY CLEAR - CODE PAGE IS VALID. +; +; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +CHECK_FOR_CP PROC NEAR ;AN000; + PUSH DX ;AN000; + MOV DX,NOT_FOUND ; initialize flag ;AN000; + MOV CX,CS:[BX].RSLMX ; load number of RAM slots ;AN000; + MOV DI,CS:[BX].RAMSO ; load DI with table offset ;AN000; + .WHILE AND ; whil not found and.... ;AN000; + .WHILE ; while still slots to check.. ;AN000; + .IF ; is it this one?? ;AN000; + MOV DX,FOUND ; yes....set flag ;AN000; + .ELSE ; ;AN000; + ADD DI,TYPE SLTS ; no..point to next entry ;AN000; + DEC CX ; decrement the count ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + .IF ; if we didn't find it then.. ;AN000; + MOV CX,CS:[BX].HSLMX ; check hardware ;AN000; + MOV DI,CS:[BX].HARDSO ; load regs as before. ;AN000; + .WHILE AND ; while not found and.. ;AN000; + .WHILE ; still have slots to check.. ;AN000; + .IF ; is it this one? ;AN000; + MOV DX,FOUND ; yes...set flag. ;AN000; + .ELSE ; ;AN000; + ADD DI,TYPE SLTS ; no ..point to next entry ;AN000; + DEC CX ; and decrement count. ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + .ENDIF ; ;AN000; + .IF ; ;AN000; + STC ; set flag appropriately ;AN000; + .ELSE ; ;AN000; + CLC ; ;AN000; + .ENDIF ; ;AN000; + POP DX ; ;AN000; + RET ; ;AN000; +CHECK_FOR_CP ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: FIND_ACTIVE_CP +; +; FUNCTION: +; THIS FUNCTION SEARCHES FOR THE ACTIVE CODE PAGE. IF REQUESTED, THE +; CODE PAGE IS MADE INACTIVE. +; +; +; AT ENTRY: +; BX - POINTS TO LPTx BUFFER +; AX = 0 - LEAVE AS ACTIVE +; AX = 1 - DE-ACTIVATE +; +; +; AT EXIT: +; NORMAL: DX - ACTIVE CODE PAGE. (NO ACTIVE = -1) +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +FIND_ACTIVE_CP PROC NEAR ;AN000; + MOV DX,UNDEFINED ; initialize register ;AN000; + MOV CX,CS:[BX].RSLMX ; load number of RAM slots ;AN000; + MOV DI,CS:[BX].RAMSO ; load DI with table offset ;AN000; + .WHILE AND ; whil not found and.... ;AN000; + .WHILE ; while still slots to check.. ;AN000; + .IF ; is it this one?? ;AN000; + MOV DX,CS:[DI].SLT_CP ; yes....load value ;AN000; + .IF ; is deactivate requested? ;AN000; + MOV CS:[DI].SLT_AT,AT_OCC; yes...change attrib. to occupied ;AN000; + .ENDIF ; ;AN000; + .ELSE ; ;AN000; + ADD DI,TYPE SLTS ; no..point to next entry ;AN000; + DEC CX ; decrement the count ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + .IF ; if we didn't find it then.. ;AN000; + MOV CX,CS:[BX].HSLMX ; check hardware ;AN000; + MOV DI,CS:[BX].HARDSO ; load regs as before. ;AN000; + .WHILE AND ; while not found and.. ;AN000; + .WHILE ; still have slots to check.. ;AN000; + .IF ; is it this one?? ;AN000; + MOV DX,CS:[DI].SLT_CP ; yes....load value ;AN000; + .IF ; is deactivate requested? ;AN000; + MOV CS:[DI].SLT_AT,AT_OCC; yes...change attrib to occupied;AN000; + .ENDIF ; ;AN000; + .ELSE ; ;AN000; + ADD DI,TYPE SLTS ; no ..point to next entry ;AN000; + DEC CX ; and decrement count. ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + .ENDIF ; ;AN000; + RET ; ;AN000; +FIND_ACTIVE_CP ENDP ;AN000; + +CSEG ENDS + END diff --git a/v4.0/src/DEV/PRINTER/PTRMSG.ASM b/v4.0/src/DEV/PRINTER/PTRMSG.ASM new file mode 100644 index 0000000..59e3299 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/PTRMSG.ASM @@ -0,0 +1,41 @@ + + PAGE ,132 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; FILENAME: CPS Device Driver -- Message File +;; MODULE NAME: PTRMSG1 +;; TYPE: Message External File +;; LINK PROCEDURE: see CPSPMNN.ASM +;; +;; INCLUDE FILES: +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; + ;; +CSEG SEGMENT PUBLIC 'CODE' ;; + ASSUME CS:CSEG ;; + ASSUME DS:NOTHING ;; + ;; +PUBLIC msg_no_init_p ;; +PUBLIC msg_no_init ;; +PUBLIC msg_bad_syntax ;; +PUBLIC msg_insuff_mem ;; + ;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; ************************************ +;; ** ** +;; ** Resident Code ** +;; ** ** +;; ************************************ +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +INCLUDE PTRMSG.INC + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CSEG ENDS + END + \ No newline at end of file diff --git a/v4.0/src/DEV/PRINTER/ZERO.DAT b/v4.0/src/DEV/PRINTER/ZERO.DAT new file mode 100644 index 0000000..573541a --- /dev/null +++ b/v4.0/src/DEV/PRINTER/ZERO.DAT @@ -0,0 +1 @@ +0 -- cgit v1.2.3