.XLIST INCLUDE STRUC.INC .LIST ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º º set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message". MOV AX,submessage ;AX=message number ;AN001; MOV DH,utility_msg_class ;DH=message class=utility class ;AN001; CALL SYSGETMSG ;DS:SI=>message piece ;AN001; MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001; MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001; ENDM ;AN001; ;º º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ PAGE ,132 ; TITLE MODECP.SAL - CODEPAGE SUPPORT INCLUDE MODECPRO.INC ;MODULE PROLOGUE ;THE FOLLOWING "INCLUDE MODECPEQ.INC" CONTAINS THE FOLLOWING DEFINITIONS: ; MACROS: HEADER, DOSCALL ; DOS FUNCTION CALLS EQUATES ; MAJOR AND MINOR CODES FOR "GENERIC IOCTL" DOS FUNCTION CALL ; ERROR RETURN CODES FROM SEVERAL SUBFUNCTIONS OF THE GENERIC IOCTL ; OPEN MODE EQUATES ; DEFINITIONS OF STRUC: ; "FON" - THE HEADER OF THE CODEPAGE FONT FILE ; "CODEPAGE_PARMS" - INPUT PARM LIST FROM CALLER ; "PACKET" AND "DES_STRT_PACKET" - BUFFERS USED ; BY THE SEVERAL CODEPAGE DOS IOCTL CALLS INCLUDE MODECPEQ.INC ;MACROS,DOS EQUATES,STRUCS,OTHER EQUATES ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = HEADER INCLUDE MODECPMS.INC ;DESCRIPTIONS OF MESSAGES ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = HEADER ; $SALUT CP(4,16,22,38) ;(set preprocessor columns for indenting) PRINTF_CODE SEGMENT WORD PUBLIC ASSUME CS:PRINTF_CODE ;"MODE" IS A ".COM" FILE; ASSUME DS:PRINTF_CODE ; AS SUCH, ALL FOUR SEG REGS ASSUME ES:PRINTF_CODE ; POINT TO THE ONE COMMON ASSUME SS:PRINTF_CODE ; SEGMENT, "PRINTF_CODE" MODECP00 EQU $ ;UNREFERENCED, LOCATES REL ZERO IN LINK MAP PUBLIC MODECP00 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º º PUBLIC CLOSE ;EQU 3EH ;CLOSE A FILE HANDLE,make available to analyze_and_invoke, see modecpeq.inc PUBLIC DES_STRT_FL_CART ;EQU 0001H, means CARTRIDGE prepare PUBLIC DEV_OPEN_MODE ;make available to analyze_and_invoke, see modecpeq.inc PUBLIC OPEN ;make available to analyze_and_invoke, see modecpeq.inc ;º º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º º EXTRN cp_cb:WORD ;AN000;codepage_parms <>, see invoke EXTRN NOERROR:BYTE ;ERRORLEVEL RETURN CODE FLAG BYTE ; NORMAL VALUE IS "TRUE" (-1) ; IF ERROR OCCURS, SET IT TO "FALSE" (0) EXTRN PRINTF:NEAR ;SENDS MESSAGES TO STDOUT OR STDERR EXTRN SYSGETMSG:NEAR ;AN001;message services routine to get the address of a message. Used to get address of a submessage. EXTRN Utility_Msg_Class:ABS ;AN001; EXTRN sublist_cpmsg8:BYTE ;AN001; EXTRN sublist_cpmsg10:BYTE ;AN001; EXTRN sublist_cpmsg17:BYTE ;AN001; ;º º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ INCLUDE common.stc ;AN001;includes the following structures ;bogus EQU 88H ;totally invalid value ; ;codepage_parms STRUC ; cp_device DW ? ; des_pack_ptr DW ? ; font_filespec DW ? ; request_typ DW ? ;codepage_parms ENDS ; ; ;parm_list_entry STRUC ;used by parse_parameters and invoke ; ;parm_type DB bogus ;item_tag DB 0FFH ;value1 DW bogus ;used only for filespecs and code page numbers ;value2 DW bogus ;used only for filespecs and code page numbers ;keyword_switch_ptr DW 0 ; ;parm_list_entry ENDS ; ; ;sublist_def STRUC ;used by initialize_sublists ; ; db ? ;Sublist Length, fixed ; db ? ;Reserved, not used yet ;AN000; ;sublist_off dw ? ;offset ;sublist_seg dw ? ;segment part of pointer to piece of message ; db ? ;ID, special end of message format ;AN000; ; db ? ;flags ; db ? ; db ? ; db ? ; ;sublist_def ENDS ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;º º ;ALL MESSAGES ARE IN THE MODEMES.ASM MODULE current_request DB bogus ;see 'do_refresh' and 'des_end' dgroup group zseg,printf_code zseg segment para public ; LOCAL WORKAREA BUF DB 512 DUP(0) ;DEFAULT BUFFER AREA public buf ;not referenced, just shows up on mapf buf END_OF_BUF EQU $ zseg ends RESPONSE_LIST LABEL WORD ;WHERE TO PUT THE RESULTS OF QUERY prepareS RES_NUM_ENTRIES EQU 12 ;NUMBER ENTRIES IN EACH HARDWARE AND prepare LISTS RES_LEN DW RES_END - RESPONSE_LIST - 2 ;BYTE SIZE OF RESPONSE AREA RES_HWCP DW RES_NUM_ENTRIES ;NUMBER OF HARDWARE CODE PAGES IN FOLLOWING LIST DW RES_NUM_ENTRIES DUP(-1) RES_DSCP DW RES_NUM_ENTRIES ;NUMBER OF prepare CODE PAGES IN FOLLOWING LIST DW RES_NUM_ENTRIES DUP(-1) RES_END EQU $ ;END OF QUERY prepare RESPONSE LIST OLDINT24 DD ? ;ORIGINAL CONTENTS OF INT 24H VECTOR CRITERROR DW 0 ;ERROR REPORTED IN DI TO INT 24H HANDLER DEVICE_STATUS DW ? ;FLAGS SET BY IOCTL (GET DEVICE INFO) DEV_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY ; OPEN TO DEVICE FOR IOCTL I/O FILE_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY ; OPEN TO FILESPEC. DEV_TYPE DW prepare_STRT ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT" ;THE HIGH BYTE IS JUST ZERO HERE, BUT ; THAT WILL BE OR'ED IN LATER PK PACKET <> ;SELECT, QUERY SELECTED, prepare END PUBLIC PK DBCS_headr DBCS_head <> PUBLIC DBCS_headr ; THESE NEXT TWO WORDS MUST BE KEPT TOGETHER ; THEY ARE REFERENCED AS A DWORD DBUF LABEL DWORD BUF_OFF DW 0 ;OFFSET OF ALLOCATED BUFFER BUF_SEG DW ? ;SEGID OF ALLOCATED BUFFER BUF_SIZ DW 0FFFH ;REMEMBER HOW MUCH BUF IS AVAILABLE ; (IN PARAGRAPHS, NOT BYTES) BUF_BYTES DW ? ;NUMBER OF BYTES ACTUALLY IN THE BUFFER PREPED DW 0 ;COUNT OF CODEPAGES KNOWN TO DEVICE MINOR_VERSION DB 0,0 ;MINOR VERSION OF DOS STATUS_BREAK DB 0 ;SAVES THE CURRENT STATUS OF "BREAK" DEV_TABLE LABEL BYTE ;TABLE OF SUPPORTED DEVICE NAMES CN DB "CON",0 LP DB "PRN",0 L1 DB "LPT1",0 L2 DB "LPT2",0 L3 DB "LPT3",0 C1 DB "COM1",0 C2 DB "COM2",0 C3 DB "COM3",0 C4 DB "COM4",0 G1 DB "*",0 END_DEV_TABLE LABEL BYTE DEV_TAB_PTRS DW CN,LP,L1,L2,L3,C1,C2,C3,C4,G1,END_DEV_TABLE NUM_TABL_ENTRIES EQU (($-DEV_TAB_PTRS)-2)/2 ;NUMBER OF DEVICE POINTERS ;THE ENTRIES IN THE NEXT TABLE MUST BE KEPT IN THE SAME ORDER AS THE ; DEVICE NAMES IN THE ABOVE LIST. THERE MUST BE A ONE-TO-ONE CORRESPONDENCE ; BETWEEN THE DEVICE NAMES AND THIS TABLE OF DEVICE TYPES. DEV_TYPES DB CON_DEV_TYPE ;CN DB LPT_DEV_TYPE ;LP DB LPT_DEV_TYPE ;L1 DB LPT_DEV_TYPE ;L2 DB LPT_DEV_TYPE ;L3 DB COM_DEV_TYPE ;C1 DB COM_DEV_TYPE ;C2 DB COM_DEV_TYPE ;C3 DB COM_DEV_TYPE ;C4 DB GLOBAL_CP ;G1 ;º º ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ MODECP PROC NEAR ;SUBROUTINE ENTRY POINT PUBLIC MODECP ;REMEMBER WHAT THE CURRENT SETTING IS ; OF "BREAK" DOSCALL BREAK_CHECK,REQUEST_BREAK_STATE ;CURRENT STATE RETURNED IN DL MOV STATUS_BREAK,DL ;REMEMBER WHAT THE CURRENT BREAK STATUS IS MOV DL,BREAK_OFF ;AVOID UNWANTED CTRL-BREAK DURING OPERATION DOSCALL BREAK_CHECK,SET_BREAK_STATE ;DOSCALL DOS_VERSION ;DETERMINE VERSION OF DOS ;OUTPUT: AL=MAJOR, AH=MINOR VERSION NUMBER ;MOV MINOR_VERSION,AH ; BX AND CX SET TO ZERO ; REMEMBER ORIGINAL OWNER OF INT 24H ; THE CRITICAL ERROR HANDLER CALL SAVE_VECTOR24 ;SET DWORD AT "OLDINT24" WITH ORIGINAL POINTERS ; SET UP THE DEVICE TYPE ; FOR THE prepare START FUNCTION MOV BX,CP_CB.cp_device ;SET A BASE REG TO POINT TO DEV NAME CALL SET_DEV_TYPE ;INTERROGATE THE DEVICE NAME, ; SET "DEV_TYPE" ACCORDINGLY ;CMP BYTE PTR DEV_TYPE+BYTE,GLOBAL_CP ;WAS THE DEVICE SPECIFIED AS "*"? ;$IF E ; CALL SET_GLOBAL_CODEPAGE ;$ELSE ;SINCE DEVICE WAS NOT "*" ; OPEN DEVICE MOV DX,BX ;DS:DX=POINTER TO ASCIIZ DEVICE NAME DOSCALL OPEN,DEV_OPEN_MODE ;OPEN DEVICE WITH READ/WRITE ACCESS ; $IF NC ;IF OPEN OK, JC $$IF1 MOV DEV_HANDLE,AX ;REMEMBER HANDLE TO DEVICE MOV BX,AX ;PASS DEVICE HANDLE TO IOCTL DOSCALL IOCTL,IOCTL_FUN_GET_INFO MOV DEVICE_STATUS,DX ;SAVE THE DEVICE STATUS ; $IF NC,AND ;IF OK JC $$IF2 TEST DX,ISDEVICE ;IS THIS A DEVICE OR FILE? ; $IF NZ ;IF IS A DEVICE JZ $$IF2 CALL FUNCTION_SELECT ;CHECK THE "request_typ", AND ; CALL THE APPROPRIATE FUNCTION HANDLER ; $ELSE ;SINCE NOT A DEVICE, MUST BE A FILE JMP SHORT $$EN2 $$IF2: MOV DX,OFFSET CPMSG15 ;PASS POINTER TO MSG PARM LIST CALL SEND_MSG ;"DEVICE NOT SUPPORTED FOR CODEPAGE" ; $ENDIF ;OK FROM IOCTL, AND DEVICE OR FILE? $$EN2: MOV BX,DEV_HANDLE DOSCALL CLOSE ;FINISHED WITH DEVICE ; $ELSE ;SINCE DEVICE OPEN NOT OK JMP SHORT $$EN1 $$IF1: MOV AX,CP_CB.cp_device ;GET OFFSET TO ASCIIZ DEVICE NAME MOV CPMSGLST2DEV,AX ; TO MSG PARM LIST MOV DX,OFFSET CPMSG2 ;PASS POINTER TO MSG PARM LIST CALL SEND_MSG ;"FAILURE TO OPEN DEVICE" ; $ENDIF ;DEVICE OPEN OK? $$EN1: ;$ENDIF ;DEVICE "*"? MOV DL,STATUS_BREAK ;GET WHAT THE BREAK STATUS USED TO BE DOSCALL BREAK_CHECK,SET_BREAK_STATE ;RETURN TO USER DEFINED BREAK CONDITION RET ;RETURN TO CALLER MODECP ENDP ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = SET_DEV_TYPE PROC NEAR ;INPUT: BX = OFFSET TO ASCIIZ OF DEVICE NAME MOV CX,NUM_TABL_ENTRIES ;SET LOOP COUNTER TO NUMBER OF DEVICE NAMES IN LIST MOV SI,OFFSET DEV_TAB_PTRS ;SET INDEX TO FIRST ENTRY IN TABLE OF POINTERS MOV DI,OFFSET DEV_TYPES ;SET INDEX TO FIRST ENTRY OF DEVICE TYPES ;$SEARCH ;LOOK THRU TABLE FOR MATCHING ENTRY $$DO7: PUSH DS ;AN002; POP ES ;need ES and DS the same for the CMPSB ;AN002; PUSH CX ;SAVE COUNTER OF DEVICE NAMES PUSH SI ;SAVE POINTER TO TABLE OF POINTERS TO DEVICE NAMES PUSH DI ;SAVE POINTER TO TABLE OF DEVICE TYPES MOV CX,[SI]+WORD ;GET OFFSET TO NEXT DEVICE NAME SUB CX,[SI] ;SET COUNT TO SIZE OF THIS DEVICE NAME MOV DI,[SI] ;POINT TO DEVICE NAME FROM ENTRY IN TABLE MOV SI,BX ;POINT TO DEVICE NAME FROM COMMAND LINE REP CMPSB ;IS THIS THE ONE? POP DI ;RESTORE POINTER TO DEVICE TYPE LIST POP SI ;RESTORE POINTER TO TABLE OF DEVICE NAME POINTERS POP CX ;RESTORE COUNTER OF DEVICES ;$EXITIF E JNE $$IF7 MOV AL,BYTE PTR[DI] ;GET TYPE OF THIS DEVICE ;$ORELSE JMP SHORT $$SR7 $$IF7: ADD SI,WORD ;BUMP INDEX TO NEXT ENTRY IN TABLE ADD DI,BYTE ;BUMP INDEX TO NEXT ENTRY IN TABLE ;$ENDLOOP LOOP LOOP $$DO7 MOV AL,UNK_DEV_TYPE ;DEVICE NAME IS NOT IN THE ABOVE LIST ;$ENDSRCH $$SR7: MOV BYTE PTR DEV_TYPE+BYTE,AL ;ADD DESCRIPTOR OF DEVICE TO DEV_TYPE WORD RET SET_DEV_TYPE ENDP ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ;SET_GLOBAL_CODEPAGE PROC NEAR ; ;;DEVICE WAS SPECIFIED AS "*", INDICATING THE GLOBAL CODEPAGE IS THE DEVICE ; ; MOV AX,CP_CB.request_typ ; CMP AX,SELECT ; $IF E ; MOV BX,CP_CB.DES_PACK_PTR ;SET BASE REG TO POINT TO PACKET AREA ; MOV BX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE ID FROM PACKET ; MOV AX,SET_GLOBAL_CP ;SET GLOBAL CODEPAGE ; DOSCALL ; ; $IF C ;IF ERROR TRYING TO SET GLOBAL CODEPAGE ; MOV CPMSGLST11FUN,OFFSET CPMSG11_SET ;PUT "SETTING" INTO MESSAGE ; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST ; CALL SEND_MSG ; ; $ELSE ; MOV CPMSGLST10FUN,OFFSET CPMSG10_GLOBAL ;SET MSG TO SAY "GLOBAL" ; MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST ; CALL QUEUE ;"MODE GLOBAL CODEPAGE FUNCTION COMPLETED" ; ; $ENDIF ;ERROR IN SETTING GLOBAL CODEPAGE? ; $ELSE ;SINCE NOT "SELECT" ASSUME IT IS "STATUS" ; MOV AX,GET_GLOBAL_CP ; DOSCALL ; ; $IF C ;IF ERROR ; MOV CPMSGLST11FUN,OFFSET CPMSG11_GET ;PUT "GETTING" INTO MESSAGE ; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST ; CALL SEND_MSG ; ; $ELSE ;SINCE NO ERROR ; PUSH DX ; DX=SYSTEM CODE PAGE ; PUSH BX ; BX=ACTIVE CODE PAGE ; MOV DX,OFFSET CPMSG12 ;PASS OFFSET TO MSG PARM LIST ; CALL QUEUE ;"CURRENT CODEPAGE SETTINGS:" ; ; MOV CPMSGLST13TYP,OFFSET CPMSG13_ACT ;PUT "ACTIVE" INTO MESSAGE ; POP CPMSGLST13CP ;PASS ACTIVE CODEPAGE ID TO MSG PARM LIST (PUSHED FROM BX) ; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST ; CALL QUEUE ;" XXX - ACTIVE CODEPAGE" ; ; POP CPMSGLST13CP ;PASS SYSTEM CODE PAGE (PUSHED FROM DX) ; MOV CPMSGLST13TYP,OFFSET CPMSG13_SYS ;PUT "SYSTEM" INTO MESSAGE ; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST ; CALL QUEUE ;" XXX - SYSTEM CODEPAGE" ; ; $ENDIF ;ERROR IN GETTING GLOBAL CODEPAGE STATUS? ; $ENDIF ;"SELECT" OR "STATUS"? ; ; RET ;SET_GLOBAL_CODEPAGE ENDP ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = HEADER