diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/MODE/MODECP.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/CMD/MODE/MODECP.ASM')
| -rw-r--r-- | v4.0/src/CMD/MODE/MODECP.ASM | 1279 |
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 | ||
| 2 | INCLUDE STRUC.INC | ||
| 3 | .LIST | ||
| 4 | |||
| 5 | |||
| 6 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 7 | ;º º | ||
| 8 | |||
| 9 | set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message". | ||
| 10 | |||
| 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; | ||
| 16 | ENDM ;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) | ||
| 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" | ||
| 47 | |||
| 48 | MODECP00 EQU $ ;UNREFERENCED, LOCATES REL ZERO IN LINK MAP | ||
| 49 | PUBLIC MODECP00 | ||
| 50 | |||
| 51 | |||
| 52 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 53 | ;º º | ||
| 54 | |||
| 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 | ||
| 59 | |||
| 60 | ;º º | ||
| 61 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 62 | |||
| 63 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 64 | ;º º | ||
| 65 | |||
| 66 | EXTRN 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 | |||
| 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; | ||
| 78 | |||
| 79 | ;º º | ||
| 80 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 81 | |||
| 82 | |||
| 83 | INCLUDE 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 | ||
| 126 | current_request DB bogus ;see 'do_refresh' and 'des_end' | ||
| 127 | dgroup group zseg,printf_code | ||
| 128 | zseg segment para public | ||
| 129 | ; LOCAL WORKAREA | ||
| 130 | BUF DB 512 DUP(0) ;DEFAULT BUFFER AREA | ||
| 131 | public buf ;not referenced, just shows up on mapf buf | ||
| 132 | END_OF_BUF EQU $ | ||
| 133 | zseg ends | ||
| 134 | |||
| 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 | ||
| 143 | |||
| 144 | |||
| 145 | OLDINT24 DD ? ;ORIGINAL CONTENTS OF INT 24H VECTOR | ||
| 146 | CRITERROR DW 0 ;ERROR REPORTED IN DI TO INT 24H HANDLER | ||
| 147 | |||
| 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 | ||
| 152 | ; OPEN TO FILESPEC. | ||
| 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 | ||
| 157 | |||
| 158 | PUBLIC PK | ||
| 159 | |||
| 160 | DBCS_headr DBCS_head <> | ||
| 161 | |||
| 162 | PUBLIC DBCS_headr | ||
| 163 | |||
| 164 | ; THESE NEXT TWO WORDS MUST BE KEPT TOGETHER | ||
| 165 | ; THEY ARE REFERENCED AS A DWORD | ||
| 166 | DBUF LABEL DWORD | ||
| 167 | BUF_OFF DW 0 ;OFFSET OF ALLOCATED BUFFER | ||
| 168 | BUF_SEG DW ? ;SEGID OF ALLOCATED BUFFER | ||
| 169 | |||
| 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 | ||
| 177 | CN DB "CON",0 | ||
| 178 | LP DB "PRN",0 | ||
| 179 | L1 DB "LPT1",0 | ||
| 180 | L2 DB "LPT2",0 | ||
| 181 | L3 DB "LPT3",0 | ||
| 182 | C1 DB "COM1",0 | ||
| 183 | C2 DB "COM2",0 | ||
| 184 | C3 DB "COM3",0 | ||
| 185 | C4 DB "COM4",0 | ||
| 186 | G1 DB "*",0 | ||
| 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 | ||
| 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 | |||
| 210 | MODECP 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 | ||
| 287 | MODECP ENDP | ||
| 288 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 289 | |||
| 290 | |||
| 291 | SET_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 | |||
| 332 | RET | ||
| 333 | SET_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 | |||
| 392 | FUNCTION_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 | ||
| 429 | FUNCTION_SELECT ENDP | ||
| 430 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 431 | HEADER <'prepare' - CODEPAGE FUNCTION> | ||
| 432 | |||
| 433 | DO_prepare PROC NEAR | ||
| 434 | |||
| 435 | PUBLIC 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 | ||
| 508 | DO_prepare ENDP | ||
| 509 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 510 | DES_START PROC NEAR | ||
| 511 | |||
| 512 | PUBLIC 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 | ||
| 519 | DES_START ENDP | ||
| 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 | ||
| 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 | ||
| 579 | DES_START_ERROR ENDP | ||
| 580 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 581 | |||
| 582 | MOVE_FILE PROC NEAR | ||
| 583 | |||
| 584 | ;CODEPAGE FILE IS OPEN, THE prepare START IS COMPLETED OK... | ||
| 585 | |||
| 586 | dummy8: | ||
| 587 | public 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 | ||
| 689 | MOVE_FILE ENDP | ||
| 690 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 691 | |||
| 692 | DES_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 | ||
| 733 | DES_END ENDP | ||
| 734 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 735 | |||
| 736 | ; 'SELECT' - FUNCTION HANDLER | ||
| 737 | |||
| 738 | |||
| 739 | |||
| 740 | DO_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 | |||
| 751 | dummy10: | ||
| 752 | public 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 | ||
| 804 | DO_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 | |||
| 832 | DO_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 | ||
| 913 | DO_REFRESH ENDP | ||
| 914 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 915 | DEVICE_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 | ||
| 924 | DEVICE_TO_BINARY ENDP | ||
| 925 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 926 | HEADER <'STATUS' - QUERY FUNCTION HANDLER> | ||
| 927 | |||
| 928 | PUBLIC do_status | ||
| 929 | |||
| 930 | DO_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 | ||
| 959 | DO_STATUS ENDP | ||
| 960 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 961 | QUERY_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 | ||
| 1027 | QUERY_LISTER ENDP | ||
| 1028 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1029 | |||
| 1030 | |||
| 1031 | QUERY_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 | ||
| 1064 | QUERY_ERROR ENDP | ||
| 1065 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1066 | DISPLAY_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 | ||
| 1097 | DISPLAY_CPID ENDP | ||
| 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 | ||
| 1103 | |||
| 1104 | MOV NOERROR,FALSE ;SET ERROR TO ERRORLEVEL | ||
| 1105 | CALL printf | ||
| 1106 | |||
| 1107 | RET | ||
| 1108 | SEND_MSG ENDP | ||
| 1109 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1110 | EX_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 | ||
| 1120 | EX_ERR ENDP | ||
| 1121 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1122 | DO_GENERIC_IOCTL PROC NEAR | ||
| 1123 | |||
| 1124 | PUBLIC 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 | ||
| 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. | ||
| 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 | ||
| 1151 | HANDLER24 ENDP | ||
| 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" | ||
| 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 | ||
| 1165 | SAVE_VECTOR24 ENDP | ||
| 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. | ||
| 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 | ||
| 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" | ||
| 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 | ||
| 1188 | HOOK_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 | |||
| 1246 | setup_packet_for_DBCS PROC NEAR | ||
| 1247 | |||
| 1248 | PUBLIC setup_packet_for_DBCS | ||
| 1249 | |||
| 1250 | PUSH 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 | ||
| 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 | ||
| 1258 | INT 21H | ||
| 1259 | |||
| 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 | ||
| 1268 | .ENDIF | ||
| 1269 | |||
| 1270 | POP DS ;restore to address stuff in MODE's segment | ||
| 1271 | |||
| 1272 | RET | ||
| 1273 | |||
| 1274 | setup_packet_for_DBCS ENDP | ||
| 1275 | |||
| 1276 | |||
| 1277 | PRINTF_CODE ENDS ;END OF MODECP.SAL MODULE | ||
| 1278 | END | ||
| 1279 | \ No newline at end of file | ||