6 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
9 set_submessage_ptr
MACRO submessage
,message
;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
11 MOV AX,submessage
;AX=message number ;AN001;
12 MOV DH,utility_msg_class
;DH=message class=utility class ;AN001;
13 CALL SYSGETMSG
;DS:SI=>message piece ;AN001;
14 MOV BP,OFFSET sublist_
&message
;address the sublist control block ;AN001;
15 MOV [BP].sublist_off
,SI ;the sublist now points to the desired message piece ;AN001;
19 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
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
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)
42 PRINTF_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"
48 MODECP00 EQU
$ ;UNREFERENCED, LOCATES REL ZERO IN LINK MAP
52 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
55 PUBLIC CLOSE
;EQU 3EH ;CLOSE A FILE HANDLE,make available to analyze_and_invoke, see modecpeq.inc
56 PUBLIC DES_STRT_FL_CART
;EQU 0001H, means CARTRIDGE prepare
57 PUBLIC DEV_OPEN_MODE
;make available to analyze_and_invoke, see modecpeq.inc
58 PUBLIC OPEN
;make available to analyze_and_invoke, see modecpeq.inc
61 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
63 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
66 EXTRN cp_cb
:WORD ;AN000;codepage_parms <>, see invoke
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
73 EXTRN SYSGETMSG
:NEAR ;AN001;message services routine to get the address of a message. Used to get address of a submessage.
74 EXTRN Utility_Msg_Class
:ABS
;AN001;
75 EXTRN sublist_cpmsg8
:BYTE ;AN001;
76 EXTRN sublist_cpmsg10
:BYTE ;AN001;
77 EXTRN sublist_cpmsg17
:BYTE ;AN001;
80 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
83 INCLUDE common.stc ;AN001;includes the following structures
86 ;bogus EQU 88H ;totally invalid value
96 ;parm_list_entry STRUC ;used by parse_parameters and invoke
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
104 ;parm_list_entry ENDS
107 ;sublist_def STRUC ;used by initialize_sublists
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;
121 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
125 ;ALL MESSAGES ARE IN THE MODEMES.ASM MODULE
126 current_request
DB bogus
;see 'do_refresh' and 'des_end'
127 dgroup group zseg
,printf_code
128 zseg
segment para
public
130 BUF
DB 512 DUP(0) ;DEFAULT BUFFER AREA
131 public buf
;not referenced, just shows up on mapf buf
135 RESPONSE_LIST
LABEL WORD ;WHERE TO PUT THE RESULTS OF QUERY prepareS
136 RES_NUM_ENTRIES EQU
12 ;NUMBER ENTRIES IN EACH HARDWARE AND prepare LISTS
137 RES_LEN
DW RES_END
- RESPONSE_LIST
- 2 ;BYTE SIZE OF RESPONSE AREA
138 RES_HWCP
DW RES_NUM_ENTRIES
;NUMBER OF HARDWARE CODE PAGES IN FOLLOWING LIST
139 DW RES_NUM_ENTRIES
DUP(-1)
140 RES_DSCP
DW RES_NUM_ENTRIES
;NUMBER OF prepare CODE PAGES IN FOLLOWING LIST
141 DW RES_NUM_ENTRIES
DUP(-1)
142 RES_END EQU
$ ;END OF QUERY prepare RESPONSE LIST
145 OLDINT24
DD ?
;ORIGINAL CONTENTS OF INT 24H VECTOR
146 CRITERROR
DW 0 ;ERROR REPORTED IN DI TO INT 24H HANDLER
148 DEVICE_STATUS
DW ?
;FLAGS SET BY IOCTL (GET DEVICE INFO)
149 DEV_HANDLE
DW ?
;VALUE OF HANDLE RETURNED BY
150 ; OPEN TO DEVICE FOR IOCTL I/O
151 FILE_HANDLE
DW ?
;VALUE OF HANDLE RETURNED BY
153 DEV_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
156 PK PACKET
<> ;SELECT, QUERY SELECTED, prepare END
160 DBCS_headr DBCS_head
<>
164 ; THESE NEXT TWO WORDS MUST BE KEPT TOGETHER
165 ; THEY ARE REFERENCED AS A DWORD
167 BUF_OFF
DW 0 ;OFFSET OF ALLOCATED BUFFER
168 BUF_SEG
DW ?
;SEGID OF ALLOCATED BUFFER
170 BUF_SIZ
DW 0FFFH ;REMEMBER HOW MUCH BUF IS AVAILABLE
171 ; (IN PARAGRAPHS, NOT BYTES)
172 BUF_BYTES
DW ?
;NUMBER OF BYTES ACTUALLY IN THE BUFFER
173 PREPED
DW 0 ;COUNT OF CODEPAGES KNOWN TO DEVICE
174 MINOR_VERSION
DB 0,0 ;MINOR VERSION OF DOS
175 STATUS_BREAK
DB 0 ;SAVES THE CURRENT STATUS OF "BREAK"
176 DEV_TABLE
LABEL BYTE ;TABLE OF SUPPORTED DEVICE NAMES
187 END_DEV_TABLE
LABEL BYTE
188 DEV_TAB_PTRS
DW CN
,LP
,L1
,L2
,L3
,C1
,C2
,C3
,C4
,G1
,END_DEV_TABLE
189 NUM_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.
193 DEV_TYPES
DB CON_DEV_TYPE
;CN
206 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
210 MODECP PROC
NEAR ;SUBROUTINE ENTRY POINT
214 ;REMEMBER WHAT THE CURRENT SETTING IS
216 DOSCALL BREAK_CHECK
,REQUEST_BREAK_STATE
;CURRENT STATE RETURNED IN DL
218 MOV STATUS_BREAK
,DL ;REMEMBER WHAT THE CURRENT BREAK STATUS IS
220 MOV DL,BREAK_OFF
;AVOID UNWANTED CTRL-BREAK DURING OPERATION
221 DOSCALL BREAK_CHECK
,SET_BREAK_STATE
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
227 ; REMEMBER ORIGINAL OWNER OF INT 24H
228 ; THE CRITICAL ERROR HANDLER
229 CALL SAVE_VECTOR24
;SET DWORD AT "OLDINT24" WITH ORIGINAL POINTERS
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 "*"?
238 ; CALL SET_GLOBAL_CODEPAGE
239 ;$ELSE ;SINCE DEVICE WAS NOT "*"
243 MOV DX,BX ;DS:DX=POINTER TO ASCIIZ DEVICE NAME
244 DOSCALL OPEN
,DEV_OPEN_MODE
;OPEN DEVICE WITH READ/WRITE ACCESS
246 ; $IF NC ;IF OPEN OK,
248 MOV DEV_HANDLE
,AX ;REMEMBER HANDLE TO DEVICE
250 MOV BX,AX ;PASS DEVICE HANDLE TO IOCTL
251 DOSCALL IOCTL
,IOCTL_FUN_GET_INFO
253 MOV DEVICE_STATUS
,DX ;SAVE THE DEVICE STATUS
256 TEST DX,ISDEVICE
;IS THIS A DEVICE OR FILE?
257 ; $IF NZ ;IF IS A DEVICE
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
264 MOV DX,OFFSET CPMSG15
;PASS POINTER TO MSG PARM LIST
265 CALL SEND_MSG
;"DEVICE NOT SUPPORTED FOR CODEPAGE"
267 ; $ENDIF ;OK FROM IOCTL, AND DEVICE OR FILE?
270 DOSCALL CLOSE
;FINISHED WITH DEVICE
272 ; $ELSE ;SINCE DEVICE OPEN NOT OK
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"
280 ; $ENDIF ;DEVICE OPEN OK?
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
286 RET ;RETURN TO CALLER
288 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
291 SET_DEV_TYPE PROC
NEAR
295 ;INPUT: BX = OFFSET TO ASCIIZ OF DEVICE NAME
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
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
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?
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
319 MOV AL,BYTE PTR[DI] ;GET TYPE OF THIS DEVICE
323 ADD SI,WORD ;BUMP INDEX TO NEXT ENTRY IN TABLE
324 ADD DI,BYTE ;BUMP INDEX TO NEXT ENTRY IN TABLE
327 MOV AL,UNK_DEV_TYPE
;DEVICE NAME IS NOT IN THE ABOVE LIST
330 MOV BYTE PTR DEV_TYPE
+BYTE,AL ;ADD DESCRIPTOR OF DEVICE TO DEV_TYPE WORD
334 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
336 ;SET_GLOBAL_CODEPAGE PROC NEAR
338 ;;DEVICE WAS SPECIFIED AS "*", INDICATING THE GLOBAL CODEPAGE IS THE DEVICE
340 ; MOV AX,CP_CB.request_typ
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
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
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"
358 ; $ENDIF ;ERROR IN SETTING GLOBAL CODEPAGE?
359 ; $ELSE ;SINCE NOT "SELECT" ASSUME IT IS "STATUS"
360 ; MOV AX,GET_GLOBAL_CP
364 ; MOV CPMSGLST11FUN,OFFSET CPMSG11_GET ;PUT "GETTING" INTO MESSAGE
365 ; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST
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:"
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"
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"
384 ; $ENDIF ;ERROR IN GETTING GLOBAL CODEPAGE STATUS?
385 ; $ENDIF ;"SELECT" OR "STATUS"?
388 ;SET_GLOBAL_CODEPAGE ENDP
389 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
390 HEADER
<SELECT FUNCTION HANDLING ROUTINE ACCORDING TO
'request_typ'>
392 FUNCTION_SELECT PROC
NEAR
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
398 CALL DO_prepare
;DEFINE FONTS TO DEVICE
400 ;$ELSE ;SINCE NOT A "prepare"
404 ; $IF E ;IF "SELECT" IS REQUESTED FUNCTION
408 ; $ELSE ;SINCE NOT "SELECT" EITHER
412 ; $IF E ;IF "REFRESH IS REQUSTED FUNCTION
416 ; $ELSE ;SINCE NONE OF THE ABOVE
430 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
431 HEADER
<'prepare' - CODEPAGE FUNCTION
>
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
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
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
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
455 ; $IF NC ;IF OPEN OK,
457 MOV FILE_HANDLE
,AX ;REMEMBER THE HANDLE TO THE FILE
458 CALL DES_START
;PERFORM THE prepare START
460 ; $IF NC ;IF prepare START WAS OK
462 CALL DEVICE_TO_BINARY
;SET DEVICE TO "BINARY MODE"
464 CALL MOVE_FILE
;READ IN THE CODEPAGE FILE, SEND TO DEVICE
466 CALL DES_END
;PERFORM prepare END FUNCTION
468 ; $ELSE ;SINCE prepare START HAD A PROBLEM
471 CALL DES_START_ERROR
;DISPLAY MSG SAYING WHY DES_START FAILED
473 ; $ENDIF ;prepare START OK?
476 ; CLOSE A FILE HANDLE
477 MOV BX,FILE_HANDLE
;BX = HANDLE RETURNED BY OPEN OR CREATE
480 ; $ELSE ;SINCE FILE OPEN NOT OK
483 MOV DX,OFFSET CPMSG1
;PASS OFFSET TO MSG PARM LIST
484 CALL SEND_MSG
; "FAILURE TO OPEN CODEPAGE FONT FILE"
486 ; $ENDIF ;FILE OPEN OK?
488 ;$ELSE ;SINCE NO FONT FILE SPEC INDICATED FOR CARTRIDGE,
492 CALL DES_START
;PERFORM THE prepare START
496 CALL DES_START_ERROR
;DISPLAY MSG SAYING WHY DES_START FAILED
498 ; $ELSE ;SINCE DES_START WAS OK,
501 CALL DES_END
;PERFORM prepare END FUNCTION
503 ; $ENDIF ;DES_START ON CARTRIDGE OK?
509 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
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
520 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
521 DES_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
529 CALL EX_ERR
;GET EXTENDED ERROR
534 CMP AX,DS_ERRA
+MAPERR
;DEVICE ERROR?
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"
542 ;$ELSE ;SINCE NOT ERROR CODE 0AH,
545 CMP AX,DS_ERR0
+MAPERR
;PREVIOUS prepare DELETED?
548 MOV DX,OFFSET CPMSG5
;PASS OFFSET TO MSG PARM LIST
549 ;"PREVIOUSLY PREPARED CODEPAGE DELETED"
553 CMP AX,DS_ERR16
;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION?
556 CMP AX,DS_ERR1
;16=unknown command, 1=Invalid function number
560 MOV DX,OFFSET CPMSG15
;PASS OFFSET TO MSG PARM LIST
561 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
563 ; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8
566 MOV DX,OFFSET CPMSG19
;PASS OFFSET TO MSG PARM LIST
567 ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
571 ; $ENDIF ;PREV prepare DELETED?
573 ;$ENDIF ;WHICH ERROR CODE?
575 CALL SEND_MSG
;DISPLAY INDICATED MESSAGE
580 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
584 ;CODEPAGE FILE IS OPEN, THE prepare START IS COMPLETED OK...
590 ;$SEARCH ;REPEAT READS UNTIL FILE COMPLETELY READ
592 ; READ FROM A FILE OR DEVICE
593 MOV AX,BUF_SIZ
;NUMBER OF PARAS TO READ
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
599 LDS DX,DBUF
;DS:DX = BUFFER ADDRESS
602 POP DS ;RESTORE DATA ADDRESSABILITY
603 ;$LEAVE C ;ERROR DURING READ?
605 MOV BUF_BYTES
,AX ;REMEMBER HOW MANY BYTES READ
606 CMP AX,0 ;WAS ANYTHING READ?
607 ;$LEAVE E ;NOTHING READ, QUIT
609 ;SOMETHING WAS READ, PROCESS THE BUFFER
610 CALL HOOK_IN_MY_INT24
;DO MY OWN ERROR HANDLING
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
616 LDS DX,DBUF
;DS:DX = ADDRESS OF DATA TO WRITE
617 DOSCALL IOCTL
,IOCTL_WRITE
;WRITE THE DATA TO THE DEVICE
621 CALL RESTORE_OLD_INT24
;LET SYSTEM RESUME ERROR HANDLING
625 ;$EXITIF C ;QUIT IF A PROBLEM
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
638 CMP AX,FAIL24
;DID ERROR COME FROM THE INT 24 HANDLER?
641 MOV AX,CRITERROR
;REAL ERROR CAME FROM INT24
645 CMP AX,DW_ERR8
+MAPERR
;DEVICE NOT FOUND IN FILE ,OR
646 ; CODE PAGE NOT FOUND IN FILE
649 MOV DX,OFFSET CPMSG3
;"Missing from font file is either device or codepage"
650 ; $ELSE ;SINCE NOT ERR 8
653 CMP AX,DW_ERRA
+MAPERR
;DEVICE ERROR
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
663 ; FILE CONTENTS NOT A FONT FILE,
664 ; OR FILE CONTENTS STRUCTURE DAMAGED
665 MOV DX,OFFSET CPMSG4
;"Font file contents invalid"
670 CALL SEND_MSG
;DISPLAY THE ERROR MSG POINTED TO BY DX
672 ;$ORELSE ;SINCE WRITE TO DEVICE WAS OK,
675 ;$ENDLOOP ;GO BACK AND READ SOME MORE
678 ; $IF C ;IF READ ERROR
680 MOV DX,OFFSET CPMSG20
;"ERROR DURING READ OF FONT FILE"
681 CALL SEND_MSG
;DISPLAY THE ERROR MSG POINTED TO BY DX
683 ; $ENDIF ;READ ERROR?
690 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
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
700 ;$IF C ;IF THERE WAS AN ERROR
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"
707 ;$ELSE ;SINCE NO ERROR DURING PREPARE END,
711 ; $IF E ;IF no previous errors THEN
713 CMP current_request
,refresh_request
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;
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;
725 MOV DX,OFFSET CPMSG10
;PASS OFFSET TO MSG PARM LIST
726 CALL printf
;"MODE PREPARE CODEPAGE FUNCTION COMPLETED"
730 ;$ENDIF ;ERROR DURING PREPARE END?
734 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
736 ; 'SELECT' - FUNCTION HANDLER
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
754 ;$IF C ;IF SELECT WAS NOT OK
757 CALL EX_ERR
;GET EXTENDED ERROR
762 CMP AX,IN_ERR7
+MAPERR
;CODE PAGE NOT PREPARED?
765 MOV DX,OFFSET CPMSG18
;PASS OFFSET TO MSG PARM LIST
766 ;"SPECIFIED CODEPAGE NOT PREPARED"
767 ; $ELSE ;NOT ERR7, MUST BE SOMETHING ELSE
770 CMP AX,IN_ERR8
+MAPERR
;KEYBOARD SUPPORT THIS CODEPAGE?
773 MOV DX,OFFSET CPMSG19
;"CURRENT KEYBOARD DOES NOT SUPPORT THIS CP"
774 ; $ELSE ;SINCE NOT ERR8 EITHER, MUST BE DEVICE ERROR
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?
783 ; $ENDIF ;CP NOT PREPARED?
785 CALL SEND_MSG
;DISPLAY INDICATED ERROR MESSAGE
787 ;$ELSE ;SINCE SELECT WAS OK,
791 ; $IF E ;IF no previous errors THEN
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"
805 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
806 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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.
814 ;³ The possible return codes for a REFRESH request will be returned only on a
815 ;³ designate start and are defined as follows:
817 ;³ 8008 - For DISPLAY.SYS this means that there is a keyboard/code page conflict.
819 ;³ 800A - Device error.
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.
826 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
829 HEADER
<'REFRESH' - RELOAD EXISTING FONTS
>
835 MOV current_request
,refresh_request
837 CALL DES_START
;PERFORM THE prepare START
839 ;$IF NC ;IF prepare START WAS OK
841 CALL DEVICE_TO_BINARY
;SET DEVICE TO "BINARY MODE"
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.
849 CALL DES_END
;PERFORM prepare END FUNCTION
851 ;$ELSE ;SINCE prepare START HAD A PROBLEM
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
861 CALL EX_ERR
;GET EXTENDED ERROR
866 CMP AX,DS_ERRA
+MAPERR
;DEVICE ERROR?
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"
874 ; $ELSE ;SINCE NOT ERROR CODE 0AH,
877 CMP AX,RS_ERRC
+MAPERR
878 ; $IF E ;IF driver unable to download because he has no buffer THEN
880 MOV DX,OFFSET CPMSG21
;PASS OFFSET TO MSG PARM LIST
881 ;"Unable to perform REFRESH"
885 CMP AX,DS_ERR16
;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION?
888 CMP AX,DS_ERR1
;16=unknown command, 1=Invalid function number
892 MOV DX,OFFSET CPMSG15
;PASS OFFSET TO MSG PARM LIST
893 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM
895 ; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8
898 MOV DX,OFFSET CPMSG19
;PASS OFFSET TO MSG PARM LIST
899 ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM
903 ; $ENDIF ;PREV prepare DELETED?
905 ; $ENDIF ;WHICH ERROR CODE?
907 CALL SEND_MSG
;DISPLAY INDICATED MESSAGE
909 ;$ENDIF ;prepare START OK?
914 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
915 DEVICE_TO_BINARY PROC
NEAR
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"
924 DEVICE_TO_BINARY ENDP
925 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
926 HEADER
<'STATUS' - QUERY FUNCTION HANDLER
>
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
940 CALL QUERY_ERROR
;DISPLAY CAUSE OF PROBLEM
942 ;$ELSE ;SINCE NOT ERROR ON QUERY
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
953 CALL QUERY_LISTER
;DISPLAY LIST OF PREPPED CODEPAGES
955 ;$ENDIF ;ERR FROM QUERY ACTIVE?
960 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
961 QUERY_LISTER PROC
NEAR
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
968 ;$IF C ;IF PROBLEM WITH QUERY LIST
970 CALL QUERY_ERROR
;DISPLAY CAUSE OF PROBLEM
972 ;$ELSE ;SINCE NO PROBLEM WITH QUERY LIST
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
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;
988 ; $ENDIF ;HARDWARE CODEPAGES PRESENT?
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
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;
1002 ; $ENDIF ;PREPARED CODEPAGES PRESENT?
1004 CMP PREPED
,0 ;CHECK COUNT OF PREPED CODEPAGES
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?
1014 ;$ENDIF ;ERR FROM QUERY LIST?
1017 ;$IF E ;IF no previous errors THEN
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"
1028 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1031 QUERY_ERROR PROC
NEAR
1034 ;CARRY WAS SET AFTER "QUERY SELECT" OR "QUERY LIST".
1036 CALL EX_ERR
;GET EXTENDED ERROR
1039 ;BL=SUGGESTED ACTION
1041 CMP AX,QS_ERR7
+MAPERR
;CODE PAGE NOT SELECTD?
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
1048 MOV NOERROR
,TRUE
;FORGET THE ABOVE WAS FLAGGED AS "ERROR"
1049 CALL QUERY_LISTER
;LIST PREPPED CODEPAGES ANYWAY
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
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"
1061 .ENDIF
;CP NOT PREPARED?
1065 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1066 DISPLAY_CPID PROC
NEAR
1067 ;INPUT: SI=OFFSET TO CODEPAGE ID WORD IN LIST
1069 MOV DX,OFFSET CPMSG8
;PASS OFFSET TO MSG PARM LIST
1070 CALL printf
;DISPLAY THE MESSAGE:
1072 CLD ;REQUEST INCREMENT IF INDEX
1075 LODSW ;GET CODEPAGE ID FROM PACKET
1076 ;SI NOW POINTS TO NEXT WORD IN CODEPAGE LIST
1080 MOV DX,OFFSET CPMSG14
;PASS OFFSET TO MSG PARM LIST
1081 ; " Codepage unprepared",CR,LF,0
1082 ; $ELSE ;SINCE NOT EMPTY,
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
1091 CALL printf
;DISPLAY THE MESSAGE
1098 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1099 HEADER
<SUBROUTINES TO HANDLE MESSAGES TO STDOUT
OR STDERR
>
1100 SEND_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
1104 MOV NOERROR
,FALSE
;SET ERROR TO ERRORLEVEL
1109 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
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
1117 ;BL=SUGGESTED ACTION
1121 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1122 DO_GENERIC_IOCTL PROC
NEAR
1124 PUBLIC DO_GENERIC_IOCTL
1126 ;INPUT CX=xxx_DEV_TYPE * 256 + "MINOR CODE"
1129 MOV BX,DEV_HANDLE
;BX=HANDLE
1130 MOV AX,GENERIC_IOCTL
;AX="GENERIC_IOCTL"
1131 DOSCALL
;SELECT DEVICE WITH GENERIC_IOCTL
1134 DO_GENERIC_IOCTL ENDP
1135 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1136 HEADER
<INT 24H
- CRITICAL ERROR HANDLER
, AND SUBROUTINES
>
1137 HANDLER24 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.
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.
1144 MOV CRITERROR
,DI ;SAVE THE ABOVE ERROR CODE
1146 ;AT EXIT, WHEN THE IRET IS EXECUTED, DOS RESPONDS ACCORDING TO (AL)
1148 MOV AL,CRERR_FAIL
;REQUEST THE "FAIL" OPTION
1150 IRET ;RETURN FROM INTERRUPT
1152 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1153 SAVE_VECTOR24 PROC
NEAR
1154 ;GET THE ORIGINAL CONTENTS OF THE CRITICAL ERROR HANDLER VECTOR, 24H
1155 ; AND SAVE THEM IN THE DWORD AT "OLDINT24"
1157 PUSH ES ;SAVE BASE SEGREG
1158 DOSCALL GET_VECTOR
,INT24
;GET ORIGINAL OWNER OF INT 24H VECTOR
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
1166 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1167 RESTORE_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.
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
1175 POP DS ;RESTORE MY DATA SEGREG
1178 RESTORE_OLD_INT24 ENDP
1179 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1180 HOOK_IN_MY_INT24 PROC
NEAR
1181 ;SET THE CRITICAL ERROR INTERRUPT HANDLER IN
1182 ; VECTOR TABLE TO POINT TO "HANDLER24"
1184 MOV DX,OFFSET HANDLER24
;DS:DX = VECTOR TO INT HANDLER
1185 DOSCALL SET_VECTOR
,INT24
;SET INT24 VECTOR TO POINT TO NEW HANDLER
1188 HOOK_IN_MY_INT24 ENDP
1189 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
1190 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
1193 ;³ SETUP_PACKET_FOR_DBCS
1194 ;³ ---------------------
1196 ;³ Determine if need to include codepage information in the Invoke or Query
1201 ;³ INPUT: Global access to "pk", the Invoke or Query packet.
1204 ;³ RETURN: If needed, the DBCS vetcors are added to the packet and the packet
1205 ;³ size is incremented.
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
1224 ;³ DATA STRUCTURES: PK - the vectors are moved into this structure beginning
1225 ;³ at PACKVECTOR1. The count of the vectors is added to
1228 ;³ DBCS_header - The return from function 6507.
1230 ;³ DBCS_table - the table of vectors pointed to by
1231 ;³ DBCS_header.table_ptr.
1234 ;³ ASSUMPTIONS: No more than 12 (0CH) are in the DBCS table.
1236 ;³ The double word pointer returned by function 6507
1237 ;³ (DBCS_header.table_ptr) always points to the DBCS table.
1239 ;³ The first byte of the table (DBCS_table.table_len) is zero if
1240 ;³ DBCS support is not necessary.
1244 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
1246 setup_packet_for_DBCS PROC
NEAR
1248 PUBLIC setup_packet_for_DBCS
1250 PUSH DS ;DS is used to address the DBCS vector table which is somewhere in IBMDOS
1252 ;set up for and call INT 21 function 6507
1253 MOV AX,6507H
;get ext country info, DBCS info
1254 MOV BX,-1 ;use codepage currently active for CON
1255 MOV DX,-1 ;use default contry ID
1256 MOV CX,TYPE DBCS_head
;length of data to be returned
1257 MOV DI,OFFSET DBCS_headr
;DI=>buffer to fill with info ID and pointer to table
1260 LDS 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
1270 POP DS ;restore to address stuff in MODE's segment
1274 setup_packet_for_DBCS ENDP
1277 PRINTF_CODE ENDS
;END OF MODECP.SAL MODULE