summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/MODE/MODECP.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/MODE/MODECP.ASM')
-rw-r--r--v4.0/src/CMD/MODE/MODECP.ASM1279
1 files changed, 1279 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/MODECP.ASM b/v4.0/src/CMD/MODE/MODECP.ASM
new file mode 100644
index 0000000..c3f1e38
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODECP.ASM
@@ -0,0 +1,1279 @@
1.XLIST
2INCLUDE STRUC.INC
3.LIST
4
5
6;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
7;º º
8
9set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
10
11MOV AX,submessage ;AX=message number ;AN001;
12MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
13CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
14MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
15MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
16ENDM ;AN001;
17
18;º º
19;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
20
21 PAGE ,132 ;
22 TITLE MODECP.SAL - CODEPAGE SUPPORT
23 INCLUDE MODECPRO.INC ;MODULE PROLOGUE
24;THE FOLLOWING "INCLUDE MODECPEQ.INC" CONTAINS THE FOLLOWING DEFINITIONS:
25; MACROS: HEADER, DOSCALL
26; DOS FUNCTION CALLS EQUATES
27; MAJOR AND MINOR CODES FOR "GENERIC IOCTL" DOS FUNCTION CALL
28; ERROR RETURN CODES FROM SEVERAL SUBFUNCTIONS OF THE GENERIC IOCTL
29; OPEN MODE EQUATES
30; DEFINITIONS OF STRUC:
31; "FON" - THE HEADER OF THE CODEPAGE FONT FILE
32; "CODEPAGE_PARMS" - INPUT PARM LIST FROM CALLER
33; "PACKET" AND "DES_STRT_PACKET" - BUFFERS USED
34; BY THE SEVERAL CODEPAGE DOS IOCTL CALLS
35 INCLUDE MODECPEQ.INC ;MACROS,DOS EQUATES,STRUCS,OTHER EQUATES
36; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
37 HEADER <DESCRIPTIONS OF ALL MESSAGES USED BY MODECP.SAL>
38 INCLUDE MODECPMS.INC ;DESCRIPTIONS OF MESSAGES
39; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
40 HEADER <EXTRNS, LOCAL DATA AND OTHER WORKAREAS>
41; $SALUT CP(4,16,22,38) ;(set preprocessor columns for indenting)
42PRINTF_CODE SEGMENT WORD PUBLIC
43 ASSUME CS:PRINTF_CODE ;"MODE" IS A ".COM" FILE;
44 ASSUME DS:PRINTF_CODE ; AS SUCH, ALL FOUR SEG REGS
45 ASSUME ES:PRINTF_CODE ; POINT TO THE ONE COMMON
46 ASSUME SS:PRINTF_CODE ; SEGMENT, "PRINTF_CODE"
47
48MODECP00 EQU $ ;UNREFERENCED, LOCATES REL ZERO IN LINK MAP
49 PUBLIC MODECP00
50
51
52;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
53;º º
54
55PUBLIC CLOSE ;EQU 3EH ;CLOSE A FILE HANDLE,make available to analyze_and_invoke, see modecpeq.inc
56PUBLIC DES_STRT_FL_CART ;EQU 0001H, means CARTRIDGE prepare
57PUBLIC DEV_OPEN_MODE ;make available to analyze_and_invoke, see modecpeq.inc
58PUBLIC OPEN ;make available to analyze_and_invoke, see modecpeq.inc
59
60;º º
61;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
62
63;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
64;º º
65
66EXTRN cp_cb:WORD ;AN000;codepage_parms <>, see invoke
67
68 EXTRN NOERROR:BYTE ;ERRORLEVEL RETURN CODE FLAG BYTE
69 ; NORMAL VALUE IS "TRUE" (-1)
70 ; IF ERROR OCCURS, SET IT TO "FALSE" (0)
71 EXTRN PRINTF:NEAR ;SENDS MESSAGES TO STDOUT OR STDERR
72
73EXTRN SYSGETMSG:NEAR ;AN001;message services routine to get the address of a message. Used to get address of a submessage.
74EXTRN Utility_Msg_Class:ABS ;AN001;
75EXTRN sublist_cpmsg8:BYTE ;AN001;
76EXTRN sublist_cpmsg10:BYTE ;AN001;
77EXTRN sublist_cpmsg17:BYTE ;AN001;
78
79;º º
80;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
81
82
83INCLUDE common.stc ;AN001;includes the following structures
84
85
86;bogus EQU 88H ;totally invalid value
87;
88;codepage_parms STRUC
89; cp_device DW ?
90; des_pack_ptr DW ?
91; font_filespec DW ?
92; request_typ DW ?
93;codepage_parms ENDS
94;
95;
96;parm_list_entry STRUC ;used by parse_parameters and invoke
97;
98;parm_type DB bogus
99;item_tag DB 0FFH
100;value1 DW bogus ;used only for filespecs and code page numbers
101;value2 DW bogus ;used only for filespecs and code page numbers
102;keyword_switch_ptr DW 0
103;
104;parm_list_entry ENDS
105;
106;
107;sublist_def STRUC ;used by initialize_sublists
108;
109; db ? ;Sublist Length, fixed
110; db ? ;Reserved, not used yet ;AN000;
111;sublist_off dw ? ;offset
112;sublist_seg dw ? ;segment part of pointer to piece of message
113; db ? ;ID, special end of message format ;AN000;
114; db ? ;flags
115; db ?
116; db ?
117; db ?
118;
119;sublist_def ENDS
120
121;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
122;º º
123
124
125 ;ALL MESSAGES ARE IN THE MODEMES.ASM MODULE
126current_request DB bogus ;see 'do_refresh' and 'des_end'
127dgroup group zseg,printf_code
128zseg segment para public
129; LOCAL WORKAREA
130BUF DB 512 DUP(0) ;DEFAULT BUFFER AREA
131 public buf ;not referenced, just shows up on mapf buf
132END_OF_BUF EQU $
133zseg ends
134
135RESPONSE_LIST LABEL WORD ;WHERE TO PUT THE RESULTS OF QUERY prepareS
136RES_NUM_ENTRIES EQU 12 ;NUMBER ENTRIES IN EACH HARDWARE AND prepare LISTS
137RES_LEN DW RES_END - RESPONSE_LIST - 2 ;BYTE SIZE OF RESPONSE AREA
138RES_HWCP DW RES_NUM_ENTRIES ;NUMBER OF HARDWARE CODE PAGES IN FOLLOWING LIST
139 DW RES_NUM_ENTRIES DUP(-1)
140RES_DSCP DW RES_NUM_ENTRIES ;NUMBER OF prepare CODE PAGES IN FOLLOWING LIST
141 DW RES_NUM_ENTRIES DUP(-1)
142RES_END EQU $ ;END OF QUERY prepare RESPONSE LIST
143
144
145OLDINT24 DD ? ;ORIGINAL CONTENTS OF INT 24H VECTOR
146CRITERROR DW 0 ;ERROR REPORTED IN DI TO INT 24H HANDLER
147
148DEVICE_STATUS DW ? ;FLAGS SET BY IOCTL (GET DEVICE INFO)
149DEV_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY
150 ; OPEN TO DEVICE FOR IOCTL I/O
151FILE_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY
152 ; OPEN TO FILESPEC.
153DEV_TYPE DW prepare_STRT ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT"
154 ;THE HIGH BYTE IS JUST ZERO HERE, BUT
155 ; THAT WILL BE OR'ED IN LATER
156PK PACKET <> ;SELECT, QUERY SELECTED, prepare END
157
158PUBLIC PK
159
160DBCS_headr DBCS_head <>
161
162PUBLIC DBCS_headr
163
164; THESE NEXT TWO WORDS MUST BE KEPT TOGETHER
165; THEY ARE REFERENCED AS A DWORD
166DBUF LABEL DWORD
167BUF_OFF DW 0 ;OFFSET OF ALLOCATED BUFFER
168BUF_SEG DW ? ;SEGID OF ALLOCATED BUFFER
169
170BUF_SIZ DW 0FFFH ;REMEMBER HOW MUCH BUF IS AVAILABLE
171 ; (IN PARAGRAPHS, NOT BYTES)
172BUF_BYTES DW ? ;NUMBER OF BYTES ACTUALLY IN THE BUFFER
173PREPED DW 0 ;COUNT OF CODEPAGES KNOWN TO DEVICE
174MINOR_VERSION DB 0,0 ;MINOR VERSION OF DOS
175STATUS_BREAK DB 0 ;SAVES THE CURRENT STATUS OF "BREAK"
176DEV_TABLE LABEL BYTE ;TABLE OF SUPPORTED DEVICE NAMES
177CN DB "CON",0
178LP DB "PRN",0
179L1 DB "LPT1",0
180L2 DB "LPT2",0
181L3 DB "LPT3",0
182C1 DB "COM1",0
183C2 DB "COM2",0
184C3 DB "COM3",0
185C4 DB "COM4",0
186G1 DB "*",0
187END_DEV_TABLE LABEL BYTE
188DEV_TAB_PTRS DW CN,LP,L1,L2,L3,C1,C2,C3,C4,G1,END_DEV_TABLE
189NUM_TABL_ENTRIES EQU (($-DEV_TAB_PTRS)-2)/2 ;NUMBER OF DEVICE POINTERS
190;THE ENTRIES IN THE NEXT TABLE MUST BE KEPT IN THE SAME ORDER AS THE
191; DEVICE NAMES IN THE ABOVE LIST. THERE MUST BE A ONE-TO-ONE CORRESPONDENCE
192; BETWEEN THE DEVICE NAMES AND THIS TABLE OF DEVICE TYPES.
193DEV_TYPES DB CON_DEV_TYPE ;CN
194 DB LPT_DEV_TYPE ;LP
195 DB LPT_DEV_TYPE ;L1
196 DB LPT_DEV_TYPE ;L2
197 DB LPT_DEV_TYPE ;L3
198 DB COM_DEV_TYPE ;C1
199 DB COM_DEV_TYPE ;C2
200 DB COM_DEV_TYPE ;C3
201 DB COM_DEV_TYPE ;C4
202 DB GLOBAL_CP ;G1
203
204
205;º º
206;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
207
208
209
210MODECP PROC NEAR ;SUBROUTINE ENTRY POINT
211
212
213 PUBLIC MODECP
214 ;REMEMBER WHAT THE CURRENT SETTING IS
215 ; OF "BREAK"
216 DOSCALL BREAK_CHECK,REQUEST_BREAK_STATE ;CURRENT STATE RETURNED IN DL
217
218 MOV STATUS_BREAK,DL ;REMEMBER WHAT THE CURRENT BREAK STATUS IS
219
220 MOV DL,BREAK_OFF ;AVOID UNWANTED CTRL-BREAK DURING OPERATION
221 DOSCALL BREAK_CHECK,SET_BREAK_STATE
222
223;DOSCALL DOS_VERSION ;DETERMINE VERSION OF DOS
224 ;OUTPUT: AL=MAJOR, AH=MINOR VERSION NUMBER
225;MOV MINOR_VERSION,AH ; BX AND CX SET TO ZERO
226
227; REMEMBER ORIGINAL OWNER OF INT 24H
228; THE CRITICAL ERROR HANDLER
229 CALL SAVE_VECTOR24 ;SET DWORD AT "OLDINT24" WITH ORIGINAL POINTERS
230
231; SET UP THE DEVICE TYPE
232; FOR THE prepare START FUNCTION
233 MOV BX,CP_CB.cp_device ;SET A BASE REG TO POINT TO DEV NAME
234 CALL SET_DEV_TYPE ;INTERROGATE THE DEVICE NAME,
235 ; SET "DEV_TYPE" ACCORDINGLY
236;CMP BYTE PTR DEV_TYPE+BYTE,GLOBAL_CP ;WAS THE DEVICE SPECIFIED AS "*"?
237;$IF E
238; CALL SET_GLOBAL_CODEPAGE
239;$ELSE ;SINCE DEVICE WAS NOT "*"
240
241
242; OPEN DEVICE
243 MOV DX,BX ;DS:DX=POINTER TO ASCIIZ DEVICE NAME
244 DOSCALL OPEN,DEV_OPEN_MODE ;OPEN DEVICE WITH READ/WRITE ACCESS
245
246; $IF NC ;IF OPEN OK,
247 JC $$IF1
248 MOV DEV_HANDLE,AX ;REMEMBER HANDLE TO DEVICE
249
250 MOV BX,AX ;PASS DEVICE HANDLE TO IOCTL
251 DOSCALL IOCTL,IOCTL_FUN_GET_INFO
252
253 MOV DEVICE_STATUS,DX ;SAVE THE DEVICE STATUS
254; $IF NC,AND ;IF OK
255 JC $$IF2
256 TEST DX,ISDEVICE ;IS THIS A DEVICE OR FILE?
257; $IF NZ ;IF IS A DEVICE
258 JZ $$IF2
259 CALL FUNCTION_SELECT ;CHECK THE "request_typ", AND
260 ; CALL THE APPROPRIATE FUNCTION HANDLER
261; $ELSE ;SINCE NOT A DEVICE, MUST BE A FILE
262 JMP SHORT $$EN2
263$$IF2:
264 MOV DX,OFFSET CPMSG15 ;PASS POINTER TO MSG PARM LIST
265 CALL SEND_MSG ;"DEVICE NOT SUPPORTED FOR CODEPAGE"
266
267; $ENDIF ;OK FROM IOCTL, AND DEVICE OR FILE?
268$$EN2:
269 MOV BX,DEV_HANDLE
270 DOSCALL CLOSE ;FINISHED WITH DEVICE
271
272; $ELSE ;SINCE DEVICE OPEN NOT OK
273 JMP SHORT $$EN1
274$$IF1:
275 MOV AX,CP_CB.cp_device ;GET OFFSET TO ASCIIZ DEVICE NAME
276 MOV CPMSGLST2DEV,AX ; TO MSG PARM LIST
277 MOV DX,OFFSET CPMSG2 ;PASS POINTER TO MSG PARM LIST
278 CALL SEND_MSG ;"FAILURE TO OPEN DEVICE"
279
280; $ENDIF ;DEVICE OPEN OK?
281$$EN1:
282;$ENDIF ;DEVICE "*"?
283 MOV DL,STATUS_BREAK ;GET WHAT THE BREAK STATUS USED TO BE
284 DOSCALL BREAK_CHECK,SET_BREAK_STATE ;RETURN TO USER DEFINED BREAK CONDITION
285
286 RET ;RETURN TO CALLER
287MODECP ENDP
288; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
289
290
291SET_DEV_TYPE PROC NEAR
292
293
294
295;INPUT: BX = OFFSET TO ASCIIZ OF DEVICE NAME
296
297 MOV CX,NUM_TABL_ENTRIES ;SET LOOP COUNTER TO NUMBER OF DEVICE NAMES IN LIST
298 MOV SI,OFFSET DEV_TAB_PTRS ;SET INDEX TO FIRST ENTRY IN TABLE OF POINTERS
299 MOV DI,OFFSET DEV_TYPES ;SET INDEX TO FIRST ENTRY OF DEVICE TYPES
300;$SEARCH ;LOOK THRU TABLE FOR MATCHING ENTRY
301$$DO7:
302 PUSH DS ;AN002;
303 POP ES ;need ES and DS the same for the CMPSB ;AN002;
304 PUSH CX ;SAVE COUNTER OF DEVICE NAMES
305 PUSH SI ;SAVE POINTER TO TABLE OF POINTERS TO DEVICE NAMES
306 PUSH DI ;SAVE POINTER TO TABLE OF DEVICE TYPES
307
308 MOV CX,[SI]+WORD ;GET OFFSET TO NEXT DEVICE NAME
309 SUB CX,[SI] ;SET COUNT TO SIZE OF THIS DEVICE NAME
310 MOV DI,[SI] ;POINT TO DEVICE NAME FROM ENTRY IN TABLE
311 MOV SI,BX ;POINT TO DEVICE NAME FROM COMMAND LINE
312 REP CMPSB ;IS THIS THE ONE?
313
314 POP DI ;RESTORE POINTER TO DEVICE TYPE LIST
315 POP SI ;RESTORE POINTER TO TABLE OF DEVICE NAME POINTERS
316 POP CX ;RESTORE COUNTER OF DEVICES
317;$EXITIF E
318 JNE $$IF7
319 MOV AL,BYTE PTR[DI] ;GET TYPE OF THIS DEVICE
320;$ORELSE
321 JMP SHORT $$SR7
322$$IF7:
323 ADD SI,WORD ;BUMP INDEX TO NEXT ENTRY IN TABLE
324 ADD DI,BYTE ;BUMP INDEX TO NEXT ENTRY IN TABLE
325;$ENDLOOP LOOP
326 LOOP $$DO7
327 MOV AL,UNK_DEV_TYPE ;DEVICE NAME IS NOT IN THE ABOVE LIST
328;$ENDSRCH
329$$SR7:
330 MOV BYTE PTR DEV_TYPE+BYTE,AL ;ADD DESCRIPTOR OF DEVICE TO DEV_TYPE WORD
331
332RET
333SET_DEV_TYPE ENDP
334; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
335
336;SET_GLOBAL_CODEPAGE PROC NEAR
337;
338;;DEVICE WAS SPECIFIED AS "*", INDICATING THE GLOBAL CODEPAGE IS THE DEVICE
339;
340; MOV AX,CP_CB.request_typ
341; CMP AX,SELECT
342; $IF E
343; MOV BX,CP_CB.DES_PACK_PTR ;SET BASE REG TO POINT TO PACKET AREA
344; MOV BX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE ID FROM PACKET
345; MOV AX,SET_GLOBAL_CP ;SET GLOBAL CODEPAGE
346; DOSCALL
347;
348; $IF C ;IF ERROR TRYING TO SET GLOBAL CODEPAGE
349; MOV CPMSGLST11FUN,OFFSET CPMSG11_SET ;PUT "SETTING" INTO MESSAGE
350; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST
351; CALL SEND_MSG
352;
353; $ELSE
354; MOV CPMSGLST10FUN,OFFSET CPMSG10_GLOBAL ;SET MSG TO SAY "GLOBAL"
355; MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
356; CALL QUEUE ;"MODE GLOBAL CODEPAGE FUNCTION COMPLETED"
357;
358; $ENDIF ;ERROR IN SETTING GLOBAL CODEPAGE?
359; $ELSE ;SINCE NOT "SELECT" ASSUME IT IS "STATUS"
360; MOV AX,GET_GLOBAL_CP
361; DOSCALL
362;
363; $IF C ;IF ERROR
364; MOV CPMSGLST11FUN,OFFSET CPMSG11_GET ;PUT "GETTING" INTO MESSAGE
365; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST
366; CALL SEND_MSG
367;
368; $ELSE ;SINCE NO ERROR
369; PUSH DX ; DX=SYSTEM CODE PAGE
370; PUSH BX ; BX=ACTIVE CODE PAGE
371; MOV DX,OFFSET CPMSG12 ;PASS OFFSET TO MSG PARM LIST
372; CALL QUEUE ;"CURRENT CODEPAGE SETTINGS:"
373;
374; MOV CPMSGLST13TYP,OFFSET CPMSG13_ACT ;PUT "ACTIVE" INTO MESSAGE
375; POP CPMSGLST13CP ;PASS ACTIVE CODEPAGE ID TO MSG PARM LIST (PUSHED FROM BX)
376; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST
377; CALL QUEUE ;" XXX - ACTIVE CODEPAGE"
378;
379; POP CPMSGLST13CP ;PASS SYSTEM CODE PAGE (PUSHED FROM DX)
380; MOV CPMSGLST13TYP,OFFSET CPMSG13_SYS ;PUT "SYSTEM" INTO MESSAGE
381; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST
382; CALL QUEUE ;" XXX - SYSTEM CODEPAGE"
383;
384; $ENDIF ;ERROR IN GETTING GLOBAL CODEPAGE STATUS?
385; $ENDIF ;"SELECT" OR "STATUS"?
386;
387; RET
388;SET_GLOBAL_CODEPAGE ENDP
389; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
390 HEADER <SELECT FUNCTION HANDLING ROUTINE ACCORDING TO 'request_typ'>
391
392FUNCTION_SELECT PROC NEAR
393
394 MOV AX,CP_CB.request_typ
395 CMP AX,PREPARE ;("prepare" IS INTERNAL USAGE ONLY; "PREPARE" IS WHAT CUSTOMER SEES)
396;$IF E ;IF "prepare" IS REQUESTED FUNCTION
397 JNE $$IF12
398 CALL DO_prepare ;DEFINE FONTS TO DEVICE
399
400;$ELSE ;SINCE NOT A "prepare"
401 JMP SHORT $$EN12
402$$IF12:
403 CMP AX,SELECT
404; $IF E ;IF "SELECT" IS REQUESTED FUNCTION
405 JNE $$IF14
406 CALL DO_SELECT
407
408; $ELSE ;SINCE NOT "SELECT" EITHER
409 JMP SHORT $$EN14
410$$IF14:
411 CMP AX,REFRESH
412; $IF E ;IF "REFRESH IS REQUSTED FUNCTION
413 JNE $$IF16
414 CALL DO_REFRESH
415
416; $ELSE ;SINCE NONE OF THE ABOVE
417 JMP SHORT $$EN16
418$$IF16:
419 CALL DO_STATUS
420
421; $ENDIF ;REFRESH?
422$$EN16:
423; $ENDIF ;SELECT?
424$$EN14:
425;$ENDIF ;prepare?
426$$EN12:
427
428 RET
429FUNCTION_SELECT ENDP
430; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
431 HEADER <'prepare' - CODEPAGE FUNCTION>
432
433DO_prepare PROC NEAR
434
435PUBLIC DO_prepare
436
437 MOV BX,CP_CB.DES_PACK_PTR
438 TEST [BX].DES_STRT_PKFL,DES_STRT_FL_CART ;CARTRIDGE prepare?
439;$IF Z ;NO, LOOK FOR FONT FILE
440 JNZ $$IF21
441 MOV AX,CS ;USE PREDEFINED AREA
442 MOV BUF_SEG,AX ;REMEMBER WHERE BUFFER IS
443 lea dx,dgroup:BUF ;buf is at end of allocated memory
444 mov BUF_OFF,dx
445 mov ax,ds:[6] ;get number bytes in this segment
446 sub ax,dx ;get size of buf to segment end
447 mov cl,4 ;shift count
448 shr ax,cl ;convert buf size to para size
449 MOV BUF_SIZ,ax ;SIZE IN PARAGRAPHS
450; OPEN FILE FOR INPUT
451
452 MOV DX,CP_CB.FONT_FILESPEC ;DS:DX = POINTER TO ASCIIZ PATH NAME
453 DOSCALL OPEN,FILE_OPEN_MODE ;OPEN CODEPAGE FILE IN READ ONLY MODE
454
455; $IF NC ;IF OPEN OK,
456 JC $$IF22
457 MOV FILE_HANDLE,AX ;REMEMBER THE HANDLE TO THE FILE
458 CALL DES_START ;PERFORM THE prepare START
459
460; $IF NC ;IF prepare START WAS OK
461 JC $$IF23
462 CALL DEVICE_TO_BINARY ;SET DEVICE TO "BINARY MODE"
463
464 CALL MOVE_FILE ;READ IN THE CODEPAGE FILE, SEND TO DEVICE
465
466 CALL DES_END ;PERFORM prepare END FUNCTION
467
468; $ELSE ;SINCE prepare START HAD A PROBLEM
469 JMP SHORT $$EN23
470$$IF23:
471 CALL DES_START_ERROR ;DISPLAY MSG SAYING WHY DES_START FAILED
472
473; $ENDIF ;prepare START OK?
474$$EN23:
475
476; CLOSE A FILE HANDLE
477 MOV BX,FILE_HANDLE ;BX = HANDLE RETURNED BY OPEN OR CREATE
478 DOSCALL CLOSE
479
480; $ELSE ;SINCE FILE OPEN NOT OK
481 JMP SHORT $$EN22
482$$IF22:
483 MOV DX,OFFSET CPMSG1 ;PASS OFFSET TO MSG PARM LIST
484 CALL SEND_MSG ; "FAILURE TO OPEN CODEPAGE FONT FILE"
485
486; $ENDIF ;FILE OPEN OK?
487$$EN22:
488;$ELSE ;SINCE NO FONT FILE SPEC INDICATED FOR CARTRIDGE,
489 JMP SHORT $$EN21
490$$IF21:
491
492 CALL DES_START ;PERFORM THE prepare START
493
494; $IF C
495 JNC $$IF29
496 CALL DES_START_ERROR ;DISPLAY MSG SAYING WHY DES_START FAILED
497
498; $ELSE ;SINCE DES_START WAS OK,
499 JMP SHORT $$EN29
500$$IF29:
501 CALL DES_END ;PERFORM prepare END FUNCTION
502
503; $ENDIF ;DES_START ON CARTRIDGE OK?
504$$EN29:
505;$ENDIF ;CARTRIDGE?
506$$EN21:
507 RET
508DO_prepare ENDP
509; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
510DES_START PROC NEAR
511
512PUBLIC DES_START
513
514 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT"
515 MOV DX,CP_CB.DES_PACK_PTR ;DS:DX=DATA BUFFER "DES_STRT_PACKET"
516 CALL DO_GENERIC_IOCTL
517
518 RET
519DES_START ENDP
520; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
521DES_START_ERROR PROC NEAR
522;AFTER DES_START, CARRY WAS SET ON, INDICATING AN ERROR
523; prepare START ERROR CODES:
524 ;DS_ERR0 EQU 0 PREVIOUS prepare DELETED
525 ;DS_ERR8 EQU 8 CODE PAGE CONFLICT (USED FOR KEYB XX MISMATCH)
526 ;DS_ERRA EQU 0AH DEVICE ERROR
527 ;DS_ERR16 EQU 016H UNKNOWN COMMAND
528
529 CALL EX_ERR ;GET EXTENDED ERROR
530 ;AX=EXTENDED ERROR
531 ;BH=ERROR CLASS
532 ;BL=SUGGESTED ACTION
533 ;CH=LOCUS
534 CMP AX,DS_ERRA+MAPERR ;DEVICE ERROR?
535;$IF E
536 JNE $$IF33
537;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_PREP ;MOVE "PREPARE" INTO MESSAGE
538 set_submessage_ptr CPMSGxx_PREP,cpmsg17 ;MOVE "PREPARE" INTO MESSAGE ;AN002;
539 MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST
540 ;"DEVICE ERROR DURING PREPARE"
541
542;$ELSE ;SINCE NOT ERROR CODE 0AH,
543 JMP SHORT $$EN33
544$$IF33:
545 CMP AX,DS_ERR0+MAPERR ;PREVIOUS prepare DELETED?
546; $IF E
547 JNE $$IF35
548 MOV DX,OFFSET CPMSG5 ;PASS OFFSET TO MSG PARM LIST
549 ;"PREVIOUSLY PREPARED CODEPAGE DELETED"
550; $ELSE
551 JMP SHORT $$EN35
552$$IF35:
553 CMP AX,DS_ERR16 ;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION?
554; $IF E,OR
555 JE $$LL37
556 CMP AX,DS_ERR1 ;16=unknown command, 1=Invalid function number
557; $IF E
558 JNE $$IF37
559$$LL37:
560 MOV DX,OFFSET CPMSG15 ;PASS OFFSET TO MSG PARM LIST
561 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
562
563; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8
564 JMP SHORT $$EN37
565$$IF37:
566 MOV DX,OFFSET CPMSG19 ;PASS OFFSET TO MSG PARM LIST
567 ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
568; $ENDIF
569$$EN37:
570
571; $ENDIF ;PREV prepare DELETED?
572$$EN35:
573;$ENDIF ;WHICH ERROR CODE?
574$$EN33:
575 CALL SEND_MSG ;DISPLAY INDICATED MESSAGE
576
577
578 RET
579DES_START_ERROR ENDP
580; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
581
582MOVE_FILE PROC NEAR
583
584;CODEPAGE FILE IS OPEN, THE prepare START IS COMPLETED OK...
585
586dummy8:
587public dummy8
588
589
590;$SEARCH ;REPEAT READS UNTIL FILE COMPLETELY READ
591$$DO42:
592; READ FROM A FILE OR DEVICE
593 MOV AX,BUF_SIZ ;NUMBER OF PARAS TO READ
594 MOV CL,4
595 SHL AX,CL ;CONVERT PARA COUNT TO BYTE COUNT
596 MOV CX,AX ;PASS BYTE COUNT TO CX
597 MOV BX,FILE_HANDLE ;BX = FILE HANDLE
598 PUSH DS
599 LDS DX,DBUF ;DS:DX = BUFFER ADDRESS
600 DOSCALL READ
601
602 POP DS ;RESTORE DATA ADDRESSABILITY
603;$LEAVE C ;ERROR DURING READ?
604 JC $$EN42
605 MOV BUF_BYTES,AX ;REMEMBER HOW MANY BYTES READ
606 CMP AX,0 ;WAS ANYTHING READ?
607;$LEAVE E ;NOTHING READ, QUIT
608 JE $$EN42
609 ;SOMETHING WAS READ, PROCESS THE BUFFER
610 CALL HOOK_IN_MY_INT24 ;DO MY OWN ERROR HANDLING
611
612; WRITE TO A FILE OR DEVICE
613 MOV BX,DEV_HANDLE ;BX = FILE HANDLE
614 MOV CX,BUF_BYTES ;CX = NUMBER OF BYTES TO WRITE
615 PUSH DS
616 LDS DX,DBUF ;DS:DX = ADDRESS OF DATA TO WRITE
617 DOSCALL IOCTL,IOCTL_WRITE ;WRITE THE DATA TO THE DEVICE
618
619 POP DS
620 PUSHF ;SAVE FLAGS
621 CALL RESTORE_OLD_INT24 ;LET SYSTEM RESUME ERROR HANDLING
622
623 POPF ;RESTORE FLAGS
624
625;$EXITIF C ;QUIT IF A PROBLEM
626 JNC $$IF42
627 ;prepare WRITE ERROR CODES:
628 ;DW_ERR8 EQU 8 DEVICE NOT FOUND IN FILE ,OR
629 ; CODE PAGE NOT FOUND IN FILE
630 ;DW_ERRA EQU 0AH DEVICE ERROR
631 ;DW_ERRC EQU 0CH FILE CONTENTS NOT A FONT FILE,
632 ; OR FILE CONTENTS STRUCTURE DAMAGED
633 CALL EX_ERR ;GET EXTENDED ERROR
634 ;AX=EXTENDED ERROR
635 ;BH=ERROR CLASS
636 ;BL=SUGGESTED ACTION
637 ;CH=LOCUS
638 CMP AX,FAIL24 ;DID ERROR COME FROM THE INT 24 HANDLER?
639; $IF E
640 JNE $$IF46
641 MOV AX,CRITERROR ;REAL ERROR CAME FROM INT24
642 ADD AX,MAPERR
643; $ENDIF
644$$IF46:
645 CMP AX,DW_ERR8+MAPERR ;DEVICE NOT FOUND IN FILE ,OR
646 ; CODE PAGE NOT FOUND IN FILE
647; $IF E
648 JNE $$IF48
649 MOV DX,OFFSET CPMSG3 ;"Missing from font file is either device or codepage"
650; $ELSE ;SINCE NOT ERR 8
651 JMP SHORT $$EN48
652$$IF48:
653 CMP AX,DW_ERRA+MAPERR ;DEVICE ERROR
654
655; $IF E
656 JNE $$IF50
657;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_WRIT ;"write of font file to device",EOM
658 set_submessage_ptr CPMSG17_WRIT,cpmsg17 ;"write of font file to device",EOM;AN001;
659 MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING %S"
660; $ELSE ;SINCE NOT ERR A NEITHER, MUST BE
661 JMP SHORT $$EN50
662$$IF50:
663 ; FILE CONTENTS NOT A FONT FILE,
664 ; OR FILE CONTENTS STRUCTURE DAMAGED
665 MOV DX,OFFSET CPMSG4 ;"Font file contents invalid"
666; $ENDIF ;ERR "A"?
667$$EN50:
668; $ENDIF ;ERR 8?
669$$EN48:
670 CALL SEND_MSG ;DISPLAY THE ERROR MSG POINTED TO BY DX
671
672;$ORELSE ;SINCE WRITE TO DEVICE WAS OK,
673 JMP SHORT $$SR42
674$$IF42:
675;$ENDLOOP ;GO BACK AND READ SOME MORE
676 JMP SHORT $$DO42
677$$EN42:
678; $IF C ;IF READ ERROR
679 JNC $$IF56
680 MOV DX,OFFSET CPMSG20 ;"ERROR DURING READ OF FONT FILE"
681 CALL SEND_MSG ;DISPLAY THE ERROR MSG POINTED TO BY DX
682
683; $ENDIF ;READ ERROR?
684$$IF56:
685;$ENDSRCH
686$$SR42:
687
688 RET
689MOVE_FILE ENDP
690; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
691
692DES_END PROC NEAR
693
694 MOV CX,DEV_TYPE ;PICK UP DEVICE TYPE AS MAJOR CODE
695 MOV CL,prepare_END ;CX=xxx_DEV_TYPE * 256 + "prepare_END"
696 MOV DX,OFFSET PK ;DS:DX=DATA BUFFER, PROBABLY NOT USED
697 ; THIS IS JUST A DUMMY BUFFER, NO DATA FOR IT
698 CALL DO_GENERIC_IOCTL
699
700;$IF C ;IF THERE WAS AN ERROR
701 JNC $$IF59
702;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_PREP ;MOVE "PREPARE" INTO MESSAGE
703 set_submessage_ptr CPMSGxx_PREP,cpmsg17 ;MOVE "PREPARE" INTO MESSAGE
704 MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST
705 CALL SEND_MSG ;"DEVICE ERROR DURING PREPARE"
706
707;$ELSE ;SINCE NO ERROR DURING PREPARE END,
708 JMP SHORT $$EN59
709$$IF59:
710 CMP NOERROR,TRUE
711; $IF E ;IF no previous errors THEN
712 JNE $$IF61
713 CMP current_request,refresh_request
714; $IF E
715 JNE $$IF62
716;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_REFRESH ;SET MSG TO SAY "REFRESH"
717 set_submessage_ptr CPMSGxx_REFRESH,cpmsg10 ;SET MSG TO SAY "REFRESH";AN001;
718; $ELSE
719 JMP SHORT $$EN62
720$$IF62:
721;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_DES ;SET MSG TO SAY "PREPARE"
722 set_submessage_ptr CPMSGxx_prep,cpmsg10 ;SET MSG TO SAY "PREPARE";AN001;
723; $ENDIF
724$$EN62:
725 MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
726 CALL printf ;"MODE PREPARE CODEPAGE FUNCTION COMPLETED"
727; $ENDIF
728$$IF61:
729
730;$ENDIF ;ERROR DURING PREPARE END?
731$$EN59:
732 RET
733DES_END ENDP
734; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
735
736; 'SELECT' - FUNCTION HANDLER
737
738
739
740DO_SELECT PROC NEAR
741
742 CALL setup_packet_for_DBCS ;see if DBCS vectors needed, if so move them into the packet
743 MOV BX,CP_CB.DES_PACK_PTR ;GET PACKET FROM INPUT PARMLIST
744 MOV AX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE FROM HIS PACKET
745 MOV PK.PACKCPID,AX ; INTO PACKET EXPECTED BY SELECT FUNCTION
746 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
747 MOV CL,SELECT_CP ;SET MINOR CODE TO "SELECT"
748 MOV DX,OFFSET PK ;DS:DX=DATA BUFFER "PACKET"
749 CALL DO_GENERIC_IOCTL
750
751dummy10:
752public dummy10
753
754;$IF C ;IF SELECT WAS NOT OK
755 JNC $$IF67
756
757 CALL EX_ERR ;GET EXTENDED ERROR
758 ;AX=EXTENDED ERROR
759 ;BH=ERROR CLASS
760 ;BL=SUGGESTED ACTION
761 ;CH=LOCUS
762 CMP AX,IN_ERR7+MAPERR ;CODE PAGE NOT PREPARED?
763; $IF E
764 JNE $$IF68
765 MOV DX,OFFSET CPMSG18 ;PASS OFFSET TO MSG PARM LIST
766 ;"SPECIFIED CODEPAGE NOT PREPARED"
767; $ELSE ;NOT ERR7, MUST BE SOMETHING ELSE
768 JMP SHORT $$EN68
769$$IF68:
770 CMP AX,IN_ERR8+MAPERR ;KEYBOARD SUPPORT THIS CODEPAGE?
771; $IF E
772 JNE $$IF70
773 MOV DX,OFFSET CPMSG19 ;"CURRENT KEYBOARD DOES NOT SUPPORT THIS CP"
774; $ELSE ;SINCE NOT ERR8 EITHER, MUST BE DEVICE ERROR
775 JMP SHORT $$EN70
776$$IF70:
777
778;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_ACT
779 set_submessage_ptr CPMSGxx_select,cpmsg17 ;AN001;
780 MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING SELECT"
781; $ENDIF ;KEYB SUPPORT THIS CODEPAGE?
782$$EN70:
783; $ENDIF ;CP NOT PREPARED?
784$$EN68:
785 CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE
786
787;$ELSE ;SINCE SELECT WAS OK,
788 JMP SHORT $$EN67
789$$IF67:
790 CMP NOERROR,TRUE
791; $IF E ;IF no previous errors THEN
792 JNE $$IF75
793;AC001;MOV CPMSGLST10FUN,OFFSET CPMSG10_SELECT ;SET MSG TO SAY "SELECT"
794 set_submessage_ptr CPMSGxx_SELECT,cpmsg10 ;SET MSG TO SAY "SELECT"
795 MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
796 CALL printf ;"MODE SELECT CODEPAGE FUNCTION COMPLETED"
797; $ENDIF
798$$IF75:
799
800;$ENDIF ;SELECT OK?
801$$EN67:
802
803 RET
804DO_SELECT ENDP
805; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
806;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
807
808;³ DO_REFRESH
809;³ ----------
810
811;³ THIS EVENT WOULD BE REQUIRED IN CASE THE EXTERNAL DEVICE LOST ITS LOADABLE
812;³ FONT DESCRIPTIONS, AS PERHAPS IF THE PRINTER GOT TURNED OFF, FOR EXAMPLE.
813
814;³ The possible return codes for a REFRESH request will be returned only on a
815;³ designate start and are defined as follows:
816
817;³ 8008 - For DISPLAY.SYS this means that there is a keyboard/code page conflict.
818
819;³ 800A - Device error.
820
821;³ 800C - The device driver does not have a copy of the code page in memory.
822;³ This could be due to the DEVICE= command in CONFIG.SYS not setting up
823;³ the buffer, so all previous prepares were handled by downloading the
824;³ code page directly to the printer.
825
826;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
827
828
829 HEADER <'REFRESH' - RELOAD EXISTING FONTS>
830
831
832DO_REFRESH PROC NEAR
833
834
835 MOV current_request,refresh_request
836
837 CALL DES_START ;PERFORM THE prepare START
838
839;$IF NC ;IF prepare START WAS OK
840 JC $$IF78
841 CALL DEVICE_TO_BINARY ;SET DEVICE TO "BINARY MODE"
842
843;UNLIKE THE prepare FUNCTION, THERE IS NO FONT FILE TO BE SENT TO THE
844;DEVICE DRIVER, WHO SHOULD STILL HAVE THE FONT DESCRIPTOR DATA TO BE
845;RETRANSMITTED TO THE EXTERNAL DEVICE ITSELF.
846
847
848
849 CALL DES_END ;PERFORM prepare END FUNCTION
850
851;$ELSE ;SINCE prepare START HAD A PROBLEM
852 JMP SHORT $$EN78
853$$IF78:
854
855;AFTER DES_START, CARRY WAS SET ON, INDICATING AN ERROR
856; prepare START ERROR CODES for REFRESH request:
857;RS_ERR8 EQU 8 ;KEYBOARD/CODE PAGE CONFLICT
858;RS_ERRA EQU 0AH ;DEVICE ERROR
859;RS_ERRC EQU 0CH ;DEVICE DRIVER DOES NOT HAVE COPY OF CODE PAGE
860
861 CALL EX_ERR ;GET EXTENDED ERROR
862 ;AX=EXTENDED ERROR
863 ;BH=ERROR CLASS
864 ;BL=SUGGESTED ACTION
865 ;CH=LOCUS
866 CMP AX,DS_ERRA+MAPERR ;DEVICE ERROR?
867; $IF E
868 JNE $$IF80
869;AC001;MOV CPMSGLST17FUN,OFFSET CPMSG17_REFRESH ;MOVE "Refresh" INTO MESSAGE
870 set_submessage_ptr CPMSGxx_REFRESH,cpmsg17 ;MOVE "Refresh" INTO MESSAGE ;AN001;
871 MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST
872 ;"Device error during REFRESH"
873
874; $ELSE ;SINCE NOT ERROR CODE 0AH,
875 JMP SHORT $$EN80
876$$IF80:
877 CMP AX,RS_ERRC+MAPERR
878; $IF E ;IF driver unable to download because he has no buffer THEN
879 JNE $$IF82
880 MOV DX,OFFSET CPMSG21 ;PASS OFFSET TO MSG PARM LIST
881 ;"Unable to perform REFRESH"
882; $ELSE
883 JMP SHORT $$EN82
884$$IF82:
885 CMP AX,DS_ERR16 ;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION?
886; $IF E,OR
887 JE $$LL84
888 CMP AX,DS_ERR1 ;16=unknown command, 1=Invalid function number
889; $IF E
890 JNE $$IF84
891$$LL84:
892 MOV DX,OFFSET CPMSG15 ;PASS OFFSET TO MSG PARM LIST
893 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
894
895; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8
896 JMP SHORT $$EN84
897$$IF84:
898 MOV DX,OFFSET CPMSG19 ;PASS OFFSET TO MSG PARM LIST
899 ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
900; $ENDIF
901$$EN84:
902
903; $ENDIF ;PREV prepare DELETED?
904$$EN82:
905; $ENDIF ;WHICH ERROR CODE?
906$$EN80:
907 CALL SEND_MSG ;DISPLAY INDICATED MESSAGE
908
909;$ENDIF ;prepare START OK?
910$$EN78:
911
912 RET
913DO_REFRESH ENDP
914; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
915DEVICE_TO_BINARY PROC NEAR
916
917 MOV DX,DEVICE_STATUS ;GET BITS DEFINING DEVICE
918 OR DX,BINARY_DEV ;TURN ON THE "BINARY" FLAG BIT
919 XOR DH,DH ;BE SURE DH IS CLEAR
920 MOV BX,DEV_HANDLE ;PASS THE DEVICE HANDLE TO IOCTL
921 DOSCALL IOCTL,IOCTL_FUN_SET_INFO ;SET DEVICE TO "BINARY"
922
923 RET
924DEVICE_TO_BINARY ENDP
925; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
926 HEADER <'STATUS' - QUERY FUNCTION HANDLER>
927
928PUBLIC do_status
929
930DO_STATUS PROC NEAR
931
932 CALL setup_packet_for_DBCS
933 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
934 MOV CL,QUERY_SELECTED ;SET MINOR CODE TO "QUERY SELECT"
935 MOV DX,OFFSET PK ;DS:DX=DATA BUFFER "PACKET"
936 CALL DO_GENERIC_IOCTL
937
938;$IF C
939 JNC $$IF90
940 CALL QUERY_ERROR ;DISPLAY CAUSE OF PROBLEM
941
942;$ELSE ;SINCE NOT ERROR ON QUERY
943 JMP SHORT $$EN90
944$$IF90:
945 MOV AX,PK.PACKCPID ;GET CODEPAGE ID FROM PACKET
946 MOV CPMSGLST6CP,AX ;PASS CODEPAGE ID TO PRINTF
947 MOV AX,CP_CB.cp_device ;GET POINTER TO DEVICE NAME
948 MOV CPMSGLST6DEV,AX ;OFFSET TO DEVICE NAME MOVED TO MSG PARM LST
949 MOV DX,OFFSET CPMSG6 ;PASS OFFSET TO MSG PARM LIST
950 CALL printf ;DISPLAY THE MESSAGE:
951 ; "CURRENTLY SELECTD CODEPAGE IS %D FOR DEVICE: %S",CR,LF,0
952
953 CALL QUERY_LISTER ;DISPLAY LIST OF PREPPED CODEPAGES
954
955;$ENDIF ;ERR FROM QUERY ACTIVE?
956$$EN90:
957
958 RET
959DO_STATUS ENDP
960; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
961QUERY_LISTER PROC NEAR
962
963 MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
964 MOV CL,QUERY_DES_LST ;SET MINOR CODE TO "QUERY prepare LIST"
965 MOV DX,OFFSET RESPONSE_LIST ;DS:DX=DATA BUFFER
966 CALL DO_GENERIC_IOCTL
967
968;$IF C ;IF PROBLEM WITH QUERY LIST
969 JNC $$IF93
970 CALL QUERY_ERROR ;DISPLAY CAUSE OF PROBLEM
971
972;$ELSE ;SINCE NO PROBLEM WITH QUERY LIST
973 JMP SHORT $$EN93
974$$IF93:
975 MOV SI,OFFSET RES_HWCP ;START WITH THE LIST OF HARDWARE CODEPAGES
976 MOV CX,[SI] ;GET NUMBER OF HARDWARE CODEPAGES IN LIST IN PACKET
977 ADD SI,WORD ;START WITH THE FIRST CODEPAGE
978; $IF NCXZ ;IF ANY HARDWARE CODEPAGES ARE PRESENT
979 JCXZ $$IF95
980;AC001;MOV CPMSGLST8HD,OFFSET CPMSG8_HW ;GET OFFSET OF "HARDWARE" TO MSG PARM LIST
981 PUSH CX ;protect from SYSGETMSG ;AC001;
982 PUSH SI ;protect from SYSGETMSG ;AC001;
983 set_submessage_ptr CPMSG8_HW,cpmsg8 ;GET OFFSET OF "HARDWARE" TO MSG PARM LIST;AC001;
984 POP SI
985 POP CX
986 CALL DISPLAY_CPID
987
988; $ENDIF ;HARDWARE CODEPAGES PRESENT?
989$$IF95:
990 MOV CX,[SI] ;GET NUMBER OF prepare CODEPAGES IN LIST IN PACKET
991 ADD SI,WORD ;LOOK AT NEXT CODEPAGE ENTRY IN LIST
992; $IF NCXZ ;IF ANY prepare CODEPAGES ARE PRESENT
993 JCXZ $$IF97
994;AC001;MOV CPMSGLST8HD,OFFSET CPMSG8_PR ;GET OFFSET OF "PREPARED" TO MSG PARM LIST
995 PUSH CX ;protect from SYSGETMSG ;AC001;
996 PUSH SI ;protect from SYSGETMSG ;AC001;
997 set_submessage_ptr CPMSG8_PR,cpmsg8 ;GET OFFSET OF "PREPARED" TO MSG PARM LIST ;AC001;
998 POP SI
999 POP CX
1000 CALL DISPLAY_CPID
1001
1002; $ENDIF ;PREPARED CODEPAGES PRESENT?
1003$$IF97:
1004 CMP PREPED,0 ;CHECK COUNT OF PREPED CODEPAGES
1005; $IF Z ;IF NONE,
1006 JNZ $$IF99
1007 MOV AX,CP_CB.cp_device ;GET POINTER TO DEVICE NAME
1008 MOV CPMSGLST7DEV,AX ;OFFSET TO DEVICE NAME MOVED TO MSG PARM LST
1009 MOV DX,OFFSET CPMSG7 ;PASS OFFSET TO MSG PARM LIST
1010 CALL printf ;DISPLAY THE MESSAGE:
1011 ; "NO CODEPAGES PREPARED FOR DEVICE: %S",CR,LF,0
1012; $ENDIF ;PREPED PAGES?
1013$$IF99:
1014;$ENDIF ;ERR FROM QUERY LIST?
1015$$EN93:
1016 CMP NOERROR,TRUE
1017;$IF E ;IF no previous errors THEN
1018 JNE $$IF102
1019;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_QUERY ;SET MSG TO SAY "QUERY"
1020 set_submessage_ptr cpmSGxx_QUERY,cpmsg10 ;SET MSG TO SAY "QUERY" ;AN001;
1021 MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST
1022 CALL printf ;"MODE QUERRY CODEPAGE FUNCTION COMPLETED"
1023;$ENDIF
1024$$IF102:
1025
1026 RET
1027QUERY_LISTER ENDP
1028; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1029
1030
1031QUERY_ERROR PROC NEAR
1032
1033
1034;CARRY WAS SET AFTER "QUERY SELECT" OR "QUERY LIST".
1035
1036 CALL EX_ERR ;GET EXTENDED ERROR
1037 ;AX=EXTENDED ERROR
1038 ;BH=ERROR CLASS
1039 ;BL=SUGGESTED ACTION
1040 ;CH=LOCUS
1041 CMP AX,QS_ERR7+MAPERR ;CODE PAGE NOT SELECTD?
1042
1043 .IF <AX EQ <QS_ERR7+MAPERR>> THEN ;CODE PAGE NOT SELECTD? ;AC665;
1044 MOV DX,OFFSET CPMSG16 ;PASS OFFSET TO MSG PARM LIST
1045 ;"NO CODEPAGE HAS BEEN SELECTED"
1046 CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE
1047
1048 MOV NOERROR,TRUE ;FORGET THE ABOVE WAS FLAGGED AS "ERROR"
1049 CALL QUERY_LISTER ;LIST PREPPED CODEPAGES ANYWAY
1050
1051 .ELSEIF <AX EQ DS_ERR16> OR ;016H UNKNOWN COMMAND, i.e. device driver not loaded ;AN665;
1052 .IF <AX EQ DS_ERR1> THEN ;;AN665;16=unknown command, 1=Invalid function number
1053 MOV DX,OFFSET CPMSG15 ;AN665;PASS OFFSET TO MSG PARM LIST, "Codepage operation not supported on this device"
1054 CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE
1055
1056 .ELSE ;NOT ERR7 or 16, MUST BE DEVICE ERROR ;AC665;
1057;AC002; MOV CPMSGLST17FUN,OFFSET CPMSG17_QUERY
1058 set_submessage_ptr CPMSGxx_QUERY,cpmsg17
1059 MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING QUERY"
1060
1061 .ENDIF ;CP NOT PREPARED?
1062
1063 RET
1064QUERY_ERROR ENDP
1065; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1066DISPLAY_CPID PROC NEAR
1067;INPUT: SI=OFFSET TO CODEPAGE ID WORD IN LIST
1068
1069 MOV DX,OFFSET CPMSG8 ;PASS OFFSET TO MSG PARM LIST
1070 CALL printf ;DISPLAY THE MESSAGE:
1071 ; "%s CODEPAGES:"
1072 CLD ;REQUEST INCREMENT IF INDEX
1073;$DO
1074$$DO104:
1075 LODSW ;GET CODEPAGE ID FROM PACKET
1076 ;SI NOW POINTS TO NEXT WORD IN CODEPAGE LIST
1077 CMP AL,EMPTY
1078; $IF E
1079 JNE $$IF105
1080 MOV DX,OFFSET CPMSG14 ;PASS OFFSET TO MSG PARM LIST
1081 ; " Codepage unprepared",CR,LF,0
1082; $ELSE ;SINCE NOT EMPTY,
1083 JMP SHORT $$EN105
1084$$IF105:
1085 INC PREPED ;COUNT PREPED CODEPAGES
1086 MOV CPMSGLST9CP,AX ;PASS CODEPAGE ID TO PRINTF
1087 MOV DX,OFFSET CPMSG9 ;PASS OFFSET TO MSG PARM LIST
1088 ; " Codepage %d",CR,LF,0
1089; $ENDIF ;EMPTY?
1090$$EN105:
1091 CALL printf ;DISPLAY THE MESSAGE
1092
1093;$ENDDO LOOP
1094 LOOP $$DO104
1095
1096 RET
1097DISPLAY_CPID ENDP
1098; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1099 HEADER <SUBROUTINES TO HANDLE MESSAGES TO STDOUT OR STDERR>
1100SEND_MSG PROC NEAR ;USED TO SEND "ERROR" MESSAGES ONLY
1101 ;FOR NON-ERROR MESSAGES, CALL printf DIRECTLY.
1102;INPUT: DX=OFFSET TO PRINTF MESSAGE PARM LIST
1103
1104 MOV NOERROR,FALSE ;SET ERROR TO ERRORLEVEL
1105 CALL printf
1106
1107 RET
1108SEND_MSG ENDP
1109; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1110EX_ERR PROC NEAR
1111;THE DOSCALL RESPONDED WITH CARRY, SO GET EXTENDED ERROR
1112 MOV BX,WORD PTR MINOR_VERSION ;BX = 30 VERSION NUMBER (FOR 3.30)
1113 DOSCALL EXTERROR ;EXTENDED ERROR
1114 ;OUTPUT:
1115 ;AX=EXTENDED ERROR
1116 ;BH=ERROR CLASS
1117 ;BL=SUGGESTED ACTION
1118 ;CH=LOCUS
1119 RET
1120EX_ERR ENDP
1121; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1122DO_GENERIC_IOCTL PROC NEAR
1123
1124PUBLIC DO_GENERIC_IOCTL
1125
1126;INPUT CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
1127; DS:DX=DATA BUFFER
1128
1129 MOV BX,DEV_HANDLE ;BX=HANDLE
1130 MOV AX,GENERIC_IOCTL ;AX="GENERIC_IOCTL"
1131 DOSCALL ;SELECT DEVICE WITH GENERIC_IOCTL
1132
1133 RET
1134DO_GENERIC_IOCTL ENDP
1135; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1136 HEADER <INT 24H - CRITICAL ERROR HANDLER, AND SUBROUTINES>
1137HANDLER24 PROC NEAR ;CRITICAL ERROR HANDLER FOR INT 24H
1138;WHEN THE CRITICAL ERROR OCCURS, CONTROL IS TRANSFERRED TO INTERRUPT 24H.
1139;BP:SI POINTS TO THE DEVICE HEADER CONTROL BLOCK.
1140
1141;ERROR CODE IS IN THE LOWER HALF OF THE DI REG WITH UPPER HALF UNDEFINED.
1142;ERROR CODES ARE DEFINED IN THE "MODECPEQ.INC" MODULE.
1143
1144 MOV CRITERROR,DI ;SAVE THE ABOVE ERROR CODE
1145
1146;AT EXIT, WHEN THE IRET IS EXECUTED, DOS RESPONDS ACCORDING TO (AL)
1147
1148 MOV AL,CRERR_FAIL ;REQUEST THE "FAIL" OPTION
1149
1150 IRET ;RETURN FROM INTERRUPT
1151HANDLER24 ENDP
1152; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1153SAVE_VECTOR24 PROC NEAR
1154;GET THE ORIGINAL CONTENTS OF THE CRITICAL ERROR HANDLER VECTOR, 24H
1155; AND SAVE THEM IN THE DWORD AT "OLDINT24"
1156
1157 PUSH ES ;SAVE BASE SEGREG
1158 DOSCALL GET_VECTOR,INT24 ;GET ORIGINAL OWNER OF INT 24H VECTOR
1159
1160 MOV WORD PTR OLDINT24,BX ;OUTPUT: ES:BX = CONTENTS OF VECTOR
1161 MOV WORD PTR OLDINT24+WORD,ES
1162 POP ES ;RESTORE BASE SEGREG
1163
1164 RET
1165SAVE_VECTOR24 ENDP
1166; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1167RESTORE_OLD_INT24 PROC NEAR
1168;TAKE THE CONTENTS OF THE ORIGINAL INT24 VECTOR, SAVED IN "OLDINT24"
1169; AND RESTORE THE INT24 ENTRY IN VECTOR BACK TO ITS ORIGINAL CONTENTS.
1170
1171 PUSH DS ;SAVE MY DATA SEGREG
1172 LDS DX,OLDINT24 ;DS:DX = VECTOR TO INT HANDLER
1173 DOSCALL SET_VECTOR,INT24 ;RESTORE OLD POINTER INTO INT24 VECTOR
1174
1175 POP DS ;RESTORE MY DATA SEGREG
1176
1177 RET
1178RESTORE_OLD_INT24 ENDP
1179; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1180HOOK_IN_MY_INT24 PROC NEAR
1181;SET THE CRITICAL ERROR INTERRUPT HANDLER IN
1182; VECTOR TABLE TO POINT TO "HANDLER24"
1183
1184 MOV DX,OFFSET HANDLER24 ;DS:DX = VECTOR TO INT HANDLER
1185 DOSCALL SET_VECTOR,INT24 ;SET INT24 VECTOR TO POINT TO NEW HANDLER
1186
1187 RET
1188HOOK_IN_MY_INT24 ENDP
1189; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1190;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
1191
1192
1193;³ SETUP_PACKET_FOR_DBCS
1194;³ ---------------------
1195
1196;³ Determine if need to include codepage information in the Invoke or Query
1197;³ packet.
1198
1199
1200
1201;³ INPUT: Global access to "pk", the Invoke or Query packet.
1202
1203
1204;³ RETURN: If needed, the DBCS vetcors are added to the packet and the packet
1205;³ size is incremented.
1206
1207;³ MESSAGES: none
1208
1209;³ REGISTER
1210;³ USAGE:
1211
1212
1213;³ SIDE EFFECT:
1214
1215
1216;³ PSEUDO CODE:
1217
1218;³ set up for and call INT 21 function 6507
1219;³ IF the length field of the DBCS table is non-zero THEN
1220;³ add the length of the table to the length field of the packet
1221;³ ENDIF
1222
1223
1224;³ DATA STRUCTURES: PK - the vectors are moved into this structure beginning
1225;³ at PACKVECTOR1. The count of the vectors is added to
1226;³ PACKLEN.
1227
1228;³ DBCS_header - The return from function 6507.
1229
1230;³ DBCS_table - the table of vectors pointed to by
1231;³ DBCS_header.table_ptr.
1232
1233
1234;³ ASSUMPTIONS: No more than 12 (0CH) are in the DBCS table.
1235
1236;³ The double word pointer returned by function 6507
1237;³ (DBCS_header.table_ptr) always points to the DBCS table.
1238
1239;³ The first byte of the table (DBCS_table.table_len) is zero if
1240;³ DBCS support is not necessary.
1241;³ ;AN000;
1242;³ ES=DS. ;AN000;
1243;³ ;AN000;
1244;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
1245
1246setup_packet_for_DBCS PROC NEAR
1247
1248PUBLIC setup_packet_for_DBCS
1249
1250PUSH DS ;DS is used to address the DBCS vector table which is somewhere in IBMDOS
1251
1252;set up for and call INT 21 function 6507
1253MOV AX,6507H ;get ext country info, DBCS info
1254MOV BX,-1 ;use codepage currently active for CON
1255MOV DX,-1 ;use default contry ID
1256MOV CX,TYPE DBCS_head ;length of data to be returned
1257MOV DI,OFFSET DBCS_headr ;DI=>buffer to fill with info ID and pointer to table
1258INT 21H
1259
1260LDS SI,DBCS_header.table_ptr ;DS:SI=>DBCS table,"DBCS_table" EQU DS:[SI]
1261.IF <DBCS_table.table_len NE 0> THEN ;IF there are some vectors THEN
1262 MOV CX,DBCS_table.table_len ;set length of the list of vectors
1263 ADD CS:pk.packlen,CX
1264 ADD SI,vector1 ;DS:SI=>first DBCS vector
1265 MOV DI,OFFSET pk ;ES:DI=>the query or invoke packet
1266 ADD DI,packvector1 ;ES:DI=>holder for first DBCS vector in the query/invoke packet
1267 REP MOVSB ;mov all the vectors and the two bytes of zeros into the packet
1268.ENDIF
1269
1270POP DS ;restore to address stuff in MODE's segment
1271
1272RET
1273
1274setup_packet_for_DBCS ENDP
1275
1276
1277PRINTF_CODE ENDS ;END OF MODECP.SAL MODULE
1278END
1279 \ No newline at end of file