From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/CMD/MODE/COMMON.STC | 36 + v4.0/src/CMD/MODE/DISPLAY.ASM | 181 ++ v4.0/src/CMD/MODE/INVOKE.ASM | 1549 ++++++++++++++ v4.0/src/CMD/MODE/MAIN.ASM | 168 ++ v4.0/src/CMD/MODE/MAKEFILE | 130 ++ v4.0/src/CMD/MODE/MODE.LNK | 17 + v4.0/src/CMD/MODE/MODE.SKL | 193 ++ v4.0/src/CMD/MODE/MODECOM.ASM | 592 +++++ v4.0/src/CMD/MODE/MODECP.ASM | 1279 +++++++++++ v4.0/src/CMD/MODE/MODECPEQ.INC | 365 ++++ v4.0/src/CMD/MODE/MODECPMS.INC | 157 ++ v4.0/src/CMD/MODE/MODECPRO.INC | 88 + v4.0/src/CMD/MODE/MODEDEFS.INC | 749 +++++++ v4.0/src/CMD/MODE/MODEECHO.ASM | 482 +++++ v4.0/src/CMD/MODE/MODELENG.ASM | 290 +++ v4.0/src/CMD/MODE/MODEMES.ASM | 145 ++ v4.0/src/CMD/MODE/MODEPARS.ASM | 4625 ++++++++++++++++++++++++++++++++++++++++ v4.0/src/CMD/MODE/MODEPRIN.ASM | 1096 ++++++++++ v4.0/src/CMD/MODE/MODEQUAT.INC | 48 + v4.0/src/CMD/MODE/MODESCRN.ASM | 564 +++++ v4.0/src/CMD/MODE/MODESUBS.INC | 598 ++++++ v4.0/src/CMD/MODE/MODEVID.ASM | 614 ++++++ v4.0/src/CMD/MODE/PARSHELL.ASM | 30 + v4.0/src/CMD/MODE/RESCODE.ASM | 719 +++++++ v4.0/src/CMD/MODE/SCRNTAB.ASM | 121 ++ v4.0/src/CMD/MODE/TYPAMAT.ASM | 263 +++ 26 files changed, 15099 insertions(+) create mode 100644 v4.0/src/CMD/MODE/COMMON.STC create mode 100644 v4.0/src/CMD/MODE/DISPLAY.ASM create mode 100644 v4.0/src/CMD/MODE/INVOKE.ASM create mode 100644 v4.0/src/CMD/MODE/MAIN.ASM create mode 100644 v4.0/src/CMD/MODE/MAKEFILE create mode 100644 v4.0/src/CMD/MODE/MODE.LNK create mode 100644 v4.0/src/CMD/MODE/MODE.SKL create mode 100644 v4.0/src/CMD/MODE/MODECOM.ASM create mode 100644 v4.0/src/CMD/MODE/MODECP.ASM create mode 100644 v4.0/src/CMD/MODE/MODECPEQ.INC create mode 100644 v4.0/src/CMD/MODE/MODECPMS.INC create mode 100644 v4.0/src/CMD/MODE/MODECPRO.INC create mode 100644 v4.0/src/CMD/MODE/MODEDEFS.INC create mode 100644 v4.0/src/CMD/MODE/MODEECHO.ASM create mode 100644 v4.0/src/CMD/MODE/MODELENG.ASM create mode 100644 v4.0/src/CMD/MODE/MODEMES.ASM create mode 100644 v4.0/src/CMD/MODE/MODEPARS.ASM create mode 100644 v4.0/src/CMD/MODE/MODEPRIN.ASM create mode 100644 v4.0/src/CMD/MODE/MODEQUAT.INC create mode 100644 v4.0/src/CMD/MODE/MODESCRN.ASM create mode 100644 v4.0/src/CMD/MODE/MODESUBS.INC create mode 100644 v4.0/src/CMD/MODE/MODEVID.ASM create mode 100644 v4.0/src/CMD/MODE/PARSHELL.ASM create mode 100644 v4.0/src/CMD/MODE/RESCODE.ASM create mode 100644 v4.0/src/CMD/MODE/SCRNTAB.ASM create mode 100644 v4.0/src/CMD/MODE/TYPAMAT.ASM (limited to 'v4.0/src/CMD/MODE') diff --git a/v4.0/src/CMD/MODE/COMMON.STC b/v4.0/src/CMD/MODE/COMMON.STC new file mode 100644 index 0000000..1212c55 --- /dev/null +++ b/v4.0/src/CMD/MODE/COMMON.STC @@ -0,0 +1,36 @@ +;common 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 diff --git a/v4.0/src/CMD/MODE/DISPLAY.ASM b/v4.0/src/CMD/MODE/DISPLAY.ASM new file mode 100644 index 0000000..870110f --- /dev/null +++ b/v4.0/src/CMD/MODE/DISPLAY.ASM @@ -0,0 +1,181 @@ +;m +PRINTF_CODE SEGMENT PUBLIC + +ASSUME CS:PRINTF_CODE, DS:PRINTF_CODE, ES:PRINTF_CODE, SS:PRINTF_CODE + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +PUBLIC initialize_sublists + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + +;***************************************************************************** +; External Declarations +;***************************************************************************** +; + +EXTRN first_sublist:BYTE +EXTRN number_of_sublists:ABS +EXTRN SysDispMsg:Near + + + + + + +; +;*************************************************************************** +; Message Structures +;*************************************************************************** +; + + +Message_Table struc ; ;AN000; + ; +Entry1 dw 0 ; ;AN000; +Entry2 dw 0 ; ;AN000; +Entry3 dw 0 ; ;AN000; +Entry4 dw 0 ; ;AN000; +Entry5 db 0 ; ;AN000; +Entry6 db 0 ; ;AN000; +Entry7 dw 0 ; ;AN000; + ; +Message_Table ends ; ;AN000; + +include common.stc ;contains the following structure + +;sublist_def STRUC + +; db ? ;Sublist Length, fixed +; db ? ;Reserved, not used yet ;AN000; +; 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 + +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ +;³ +;³ INITIALIZE_SUBLISTS +;³ ------------------- +;³ A .COM file cannot have references to segments in it at EXE2BIN time so +;³ the segment part of pointers to pieces of messages in sublist blocks must +;³ be done at execution time. This routine does that for all sublists. +;³ +;³ +;³ INPUT: +;³ +;³ +;³ +;³ +;³ +;³ +;³ +;³ RETURN: +;³ +;³ +;³ MESSAGES: none +;³ +;³ +;³ +;³ REGISTER +;³ USAGE AND +;³ COMVENTIONS: +;³ +;³ +;³ +;³ ASSUMPTIONS: +;³ +;³ +;³ SIDE EFFECT: +;³ +;³ +;³ ùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùù +;³ +;³ BEGIN +;³ ³ +;³ END ³ +;³ +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ + +initialize_sublists PROC NEAR ;AN000; + +MOV CX,number_of_sublists ;AN000; +MOV SI,OFFSET first_sublist ;address first sublist ;AN000; +REPEAT: ;AN000; + MOV [SI].sublist_seg,DS ;set up the segment part of the pointer field in the sublist block ;AN000; + ADD SI,TYPE sublist_def ;point to next sublist block ;AN000; +LOOPNZ repeat ;AN000; + ;AN000; +RET + ;AN000; +initialize_sublists ENDP + +;***************************************************************************** +;PRINTF +;***************************************************************************** +; +;Description: Save all registers, set up registers required for SysDispMsg +; routine. This information is contained in a message description +; table pointed to by the DX register. Call SysDispMsg, then +; restore registers. This routine assumes that the only time an +; error will be returned is if an extended error message was +; requested, so it will ignore error returns +; +;Called Procedures: sysdispmsg +; +;Change History: Created 4/22/87 MT +; +;Input: ES:DX = pointer to message description +; +;Output: None +; +;Psuedocode +;---------- +; +; Save all registers +; Setup registers for SysDispMsg from Message Description Tables +; CALL SysDispMsg +; Restore registers +; ret +;***************************************************************************** + +Public PRINTF +PRINTF PROC NEAR ; ;AN000; + +; push ax + ;Save registers ;AN000; + push bx ; " " " " ;AN000; + push cx ; " " " " ;AN000; + push dx ; " " " " ;AN000; + push si ; " " " " ;AN000; + push di ; " " " " ;AN000; + mov di,dx ;Change pointer to table ;AN000; + mov ax,[di].Entry1 ;Message number ;AN000; + mov bx,[di].Entry2 ;Handle ;AN000; + mov si,[di].Entry3 ;Sublist ;AN000; + mov cx,[di].Entry4 ;Count ;AN000; + mov dh,[di].Entry5 ;Class ;AN000; + mov dl,[di].Entry6 ;Function ;AN000; + mov di,[di].Entry7 ;Input ;AN000; + call SysDispMsg ;Display the message ;AN000; + pop di ;Restore registers ;AN000; + pop si ; " " " " ;AN000; + pop dx ; " " " " ;AN000; + pop cx ; " " " " ;AN000; + pop bx ; " " " " ;AN000; +; pop ax ; " " " " ;AN000; + ret ;All done ;AN000; + +PRINTF ENDP ; ;AN000; + +PRINTF_CODE ENDS + + end diff --git a/v4.0/src/CMD/MODE/INVOKE.ASM b/v4.0/src/CMD/MODE/INVOKE.ASM new file mode 100644 index 0000000..2d836c3 --- /dev/null +++ b/v4.0/src/CMD/MODE/INVOKE.ASM @@ -0,0 +1,1549 @@ + ;AN000; +;m ;AN000; + PAGE ,132 ; ;AN000; + TITLE ANALYZE_AND_INVOKE - call appropriate routine based on request ;AN000; +.XLIST ;AN000; + INCLUDE STRUC.INC ;AN000; +.LIST ;AN000; +;.SALL ;AN000; + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +; AC000 - P2944: Was displaying the lines and column settings for CON even +; though couldn't get them when ANSI.SYS isn't loaded. Now +; check if ANSI loaded before trying to display the settings. + +; AC002 - P3331: ES was getting zeroed, which caused problems later in MODECP. + +; AC003 - P3541: The retry status routine was assuming different format than +; the retry type byte was in. I fixed the status checking +; routine. + +; AX004 - P3982: The screen was being cleared after the "Unable to shift +; screen ..." message. + +; AC005 - P4934: The multiplex number for ANSI.SYS was changed due to a +; 5/20/88 conflict with a Microsoft product that has already been +; shipped. + +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +GET_EXTENDED_ERROR MACRO ;AN000; + ;AN000; +MOV BX,0 ;level for 3.00 to 4.00 ;AN000; +MOV AH,59H ;function number for get extended error ;AN000; +INT 21H ;AN000; + ;AN000; +ENDM ;AN000; + ;AN000; + ;AN000; +BREAK MACRO X ;AN000; + JMP endcase_&X ;AN000; +ENDM ;AN000; + ;AN000; + ;AN000; + ;AN000; + ;AN000; +DISPLAY MACRO MESSAGE ;AN000; + MOV DX,OFFSET MESSAGE ;AN000; + CALL PRINTF ;AN000; +ENDM ;AN000; + ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +INCLUDE modequat.inc ;AN000; + ;AN000; +ANSIINT2F EQU 1AH ;INT 2F multiplex number for ANSI.SYS ;AC005; +ASCII_0 EQU "0" ;change one based binary printer number into ASCII printer number ;AN000; +ASCII_1 EQU "1" ;AN000; +B EQU 2 ;retry setting ;AN000; +blink EQU 0000H ;value for flags field of IOCTL data block ;AN000; +busy_retry_active EQU 2 ;indicates bust retry is active ;AN000; +check_installed EQU 0 ;request installed state for INT2F (ANSI) ;AN000; +;COLUMNS EQU 00000010B ; ;AN000; +com1_retry_type_status EQU 0 ;request for retry status on com1 ;AN000; +com2_retry_type_status EQU 2 ;request for retry status on com2 ;AN000; +com3_retry_type_status EQU 4 ;request for retry status on com3 ;AN000; +com4_retry_type_status EQU 6 ;request for retry status on com4 ;AN000; +display_device EQU 3 ;type of device, used for calls to IOCTL 0C function ;AN000; +E EQU 1 ;retry setting ;AN000; +error_retry_active EQU 1 ;indicates error retry is active ;AN000; +false EQU 00H ;AN000; +font_not_loaded EQU 31 ;return from IOCTL 0C (via ext err) indicating DISPLAY.SYS don't have necessary font loaded +get_current_settings EQU 07FH ;request for IOCTL 0C call ;AN000; +installed EQU 0FFH ;return from get_installed_state function ;AN000; +intense EQU 0001H ;value for flags field of IOCTL data block ;AN000; +IOCTL0C EQU [SI] ;AN000; +;LINES EQU 00000001B ;flag for IOCTL0C_functions_requested ;AN000; +lowercase EQU 020H ;when ORed with char value it changes it to lowercase ;AN000; +LPT1 EQU 1 ;mask for input to display_device_reroute_status, see modeecho ;AN000; +LPT2 EQU 2 ;mask for input to display_device_reroute_status, see modeecho ;AN000; +LPT3 EQU 4 ;mask for input to display_device_reroute_status, see modeecho ;AN000; +lpt1_retry_type_status EQU 0 ;request for retry status on lpt1 ;AN000; +lpt2_retry_type_status EQU 1 ;request for retry status on lpt2 ;AN000; +lpt3_retry_type_status EQU 2 ;request for retry status on lpt3 ;AN000; +MODE_INT2F_MULTIPLEX_NUMBER EQU 0 ;AN000; +no_retry EQU 3 ;retry setting ;AN000; +no_retry_active EQU 0 ;indicates no retry active on device ;AN000; +not_supported_on_machine EQU 29 ;return from IOCTL 0C (via ext err) indicating hardware don't support the function ;AN000; +parm_list_BX EQU [BX] ;AN000; +prn_ports_attached EQU CL ;used in printer_reroute_case and check_prn_ports_attached +R EQU 3 ;retry setting for com ports ;AN000; +ready_retry_active EQU 3 ;indicates ready retry is active ;AN000; +redirected EQU 2 ;network puts a 2 in printer address word for printers redirected +rerouted_printer_mask EQU BL ;holds the mask to check ptsflag1 with, see modeecho.asm +returned_retry_type EQU AL ;holds the returned status value ;AN000; +set_display_characteristics EQU 05FH ;request for IOCTL 0C call ;AN000; +status EQU 0 ;request for modecp ;AN000; +StdOut equ 1 ;AN000; +text EQU 01 ;mode field of IOCTL 0C call indicating screen mode type (vs APA mode) ;AN000; +true EQU 0FFH ;AN000; +unspecified EQU 0FFH ;state of item_tags in parm_list if the positonal parm was not specified ;AN664; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; + ;AN000; +des_strt_packet STRUC ;AN000; + des_strt_pkfl DW 0000 ;assume a filename specified ;AN000; + des_strt_pklen DW 02 ;start with size of 'des_strt_pknum' ;AN000; + des_strt_pknum DW 0 ;number of cp numbers in the packet ;AN000; + des_strt_pkcp1 DW -1 ;code page number for 1st slot ;AN000; + des_strt_pkcp2 DW -1 ;AN000; + des_strt_pkcp3 DW -1 ;AN000; + des_strt_pkcp4 DW -1 ;AN000; + des_strt_pkcp5 DW -1 ;AN000; + des_strt_pkcp6 DW -1 ;AN000; + des_strt_pkcp7 DW -1 ;AN000; + des_strt_pkcp8 DW -1 ;AN000; + des_strt_pkcp9 DW -1 ;AN000; + des_strt_pkcpA DW -1 ;AN000; + des_strt_pkcpB DW -1 ;AN000; + des_strt_pkcpC DW -1 ;code page number for 12th slot ;AN000; +des_strt_packet ENDS ;AN000; + ;AN000; +;The info_level is 0 on input, and contains a return code on exit. If carry set ;AN000; +;and 2 then the requested function is not supported on this machine. If carry ;AN000; +;set and 3 then DISPLAY.SYS does not have the appropriate RAM font loaded to ;AN000; +;support the requested function. ;AN000; + ;AN000; +IOCTL0C_def STRUC ;AN000; + ;AN000; +info_level DB 0 ;return code: 0 on input, 1 ?, 2 or 3 as returns ;AN000; + DB 0 ;reserved ;AN000; +data_length DW 14 ;length of the data block not including this field ;AN000; +flags DW 0 ;filled with intense or blink ;AN000; +mode DB text ;filled with text, may be returned as 2 which means APA ;AN000; + DB 0 ;reserved ;AN000; +colors DW 16 ;0 means monochrome ;AN000; + DW bogus ;width in pixels for APA modes ;AN000; + DW bogus ;length in pixels for APA modes ;AN000; +cols DW bogus ;nubmer of text columns ;AN000; +rows DW bogus ;number of text rows ;AN000; + ;AN000; +IOCTL0C_def ENDS ;AN000; + ;AN000; +INCLUDE COMMON.STC ;includes the following strucs ;AN000; + ;AN000; +;codepage_parms STRUC ;AN000; +; cp_device DW ? ;AN000; +; des_pack_ptr DW ? ;AN000; +; font_filespec DW ? ;AN000; +; request_typ DW ? ;AN000; +;codepage_parms ENDS ;AN000; + ;AN000; + ;AN000; +;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000; + ;AN000; +;parm_type DB bogus ;AN000; +;item_tag DB 0FFH ;AN000; +;value1 DW bogus ;used only for filespecs and code page numbers ;AN000; +;value2 DW bogus ;used only for filespecs and code page numbers ;AN000; +;keyword_switch_ptr DW 0 ;AN000; + ;AN000; +;parm_list_entry ENDS ;AN000; + ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; +ROM SEGMENT AT 0 ;AN000; + ORG 530H ;AN000; +resseg LABEL DWORD ;location of resident mode code vector ;AN000; +ROM ENDS ;AN000; + ;AN000; + ;AN000; + PAGE ;AN000; +PRINTF_CODE SEGMENT PUBLIC ;AN000; + ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +PUBLIC analyze_and_invoke ;make available to "MAIN" ;AN000; +PUBLIC busy_retry_active ;used by modecom ;AN000; +PUBLIC cp_cb ;modepars needs to set the font file name ;AN000; +PUBLIC error_retry_active ;used by modecom ;AN000; +PUBLIC initialize_printer_port_case ;AN000; +PUBLIC no_retry_active ;used by modecom ;AN000; +PUBLIC parm_list_holder ;used by modeprin ;AN664; +PUBLIC ready_retry_active ;used by modecom ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +EXTRN ANSI_not_loaded:BYTE ;see modedefs.inc ;AN000; +EXTRN BAUD_equal:BYTE ;the string "BAUD=", see modepars ;AN000; +EXTRN BAUD_index:WORD ;see modecom.asm ;AN000; +EXTRN B_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN BW40:NEAR ;see modedefs.inc ;AN000; +EXTRN BW40_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN BW80:NEAR ;see modedefs.inc ;AN000; +EXTRN BW80_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN busy_status:ABS +EXTRN close:ABS ;EQU 3EH ;CLOSE A FILE HANDLE,see modecpeq.inc ;AN000; +EXTRN columns_ptr:WORD ;see modesubs.inc ;AN000; +EXTRN CO40:NEAR ;see modedefs.inc ;AN000; +EXTRN CO40_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN CO80:NEAR ;see modedefs.inc ;AN000; +EXTRN CO80_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN codepage_index_holder:WORD ;see MODEPARS.ASM ;AN000; +EXTRN codepage_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN columns_equal:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN columns_equal_msg:BYTE ;see MODEdefS.inc ;AN000; +EXTRN columns_holder:BYTE ;holder for printer chars per line (binary) value, see modeprin ;AN000; +EXTRN COLS_equal:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN columns_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN COM1_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN COM2_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN COM3_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN COM4_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN COMX:ABS ;one of two possible values for "device_type" +EXTRN CON_str:BYTE ;"CON"see MODEPARS.ASM ;AN000; +EXTRN CRLF:BYTE ;see MODEDEFS.ASM, used before "Invalid parameter - " for consistent spacing ;AN000; +EXTRN data_bits_index:WORD ;see modecom.asm ;AN000; +EXTRN DATA_equal:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN DELAY_equal:BYTE ;see MODEPars.asm ;AN000; +EXTRN DEL_equal:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN des_start_packet:WORD ;AX000; des_strt_packet <>, see modepars ;AN000; +EXTRN device:BYTE ;holder of com number for invoke and modeecho ;AN000; +EXTRN device_name:WORD ;AN000; +EXTRN device_type:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN dev_name_size:WORD ;see MODEPARS.ASM ;AN000; +EXTRN dev_open_mode:ABS ;read write access ;AN000; +EXTRN display_printer_reroute_status:NEAR ;see modeecho.asm +EXTRN eighty_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN eighty_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN error_status:ABS ;see MODEPRIN +EXTRN five_char_underline:BYTE ;see modedefs.inc ;AN000; +EXTRN four_char_underline:BYTE ;see modedefs.inc ;AN000; +EXTRN function_not_supported:BYTE ;see modedefs.inc ;AN000; +EXTRN err1:BYTE ;see modedefs.inc +EXTRN E_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN fourty_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN fourty_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN handle_40_or_80:NEAR ;see modescrn ;AN000; +EXTRN illegal_device_ptr:WORD ;see modesubs.inc +EXTRN keyword:ABS ;see MODEPARS ;AN000; +EXTRN invalid_number_of_parameters:WORD ;AN000; +;EXTRN invalid_parameter:WORD ;"Invalid parameter '????'",beep ;AN000; +EXTRN len_COMX_str:ABS ;see MODEPARS.ASM ;AN000; +EXTRN len_CON_str:ABS ;see MODEPARS.ASM ;AN000; +EXTRN len_LPTX_str:ABS ;see MODEPARS.ASM ;AN000; +EXTRN L_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN LINES_equal:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN LINES_equal_msg:BYTE ;see MODEDEFS.INC ;AN000; +EXTRN lines_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN long_underline:BYTE ;see modedefs.inc ;AN000; +EXTRN lptno:BYTE ;holder of printer number for invoke and modeecho ;AN000; +EXTRN lpt1_retry_type:BYTE ;see RESCODE +EXTRN LPT1_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN LPT2_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN LPT3_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN notredpt:BYTE ;printer number in "LPTn not rerouted" +EXTRN max_request_type:ABS ;see MODEPARS.ASM ;AN000; +EXTRN modecom:NEAR ;AN000; +EXTRN modecp:NEAR ;AN000; +EXTRN modeecho:NEAR ;AN000; +EXTRN modeecno:NEAR ;AN000; +EXTRN modeprin:NEAR ;AN000; +EXTRN modify_resident_code:NEAR ;see modeprin ;AN000; +EXTRN MONO:NEAR ;see modedefs.inc ;AN000; +EXTRN MONO_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN no_retry_flag:ABS ;see MODEPRIN +EXTRN noerror:BYTE ;AN000; +EXTRN none_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN none_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN offending_parameter:BYTE ;see MODEMES ;AN000; +EXTRN OFF_item_tag:ABS ;see pares.asm ;AN000; +EXTRN off_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN onethirtytwo_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN ON_item_tag:ABS ;see pares.asm ;AN000; +EXTRN on_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN open:ABS ;open a device handle, see modecpeq.inc ;AN000; +EXTRN parity_equal:BYTE ;see modepars.asm ;AN000; +EXTRN parity_index:WORD ;see modecom ;AN000; +EXTRN parm2:BYTE ;see MODEPRIN.ASM ;AN000; +EXTRN parm3:BYTE ;see MODEPARS.ASM ;AN000; +;EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>), see MODEPARS.ASM ;AN000; +EXTRN parms_form:byte ;indicator of whether the parameters were entered as positionals or as keywords ;AN000; +EXTRN pbaud_ptr:WORD ;AN000;;pointer to the baud rate string in the initialization message for COM, see modesubs.inc +EXTRN pdata:BYTE ;see modesubs.inc ;AN000; +EXTRN pparity_ptr:WORD ;see modesubs.inc ;AN000; +EXTRN pparm:BYTE ;used by modecom and for message, see modesubs.inc ;AN000; +EXTRN prepare:ABS ;AN000; +EXTRN prepare_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS +EXTRN pstop_ptr:WORD ;see modesubs.inc ;AN000; +EXTRN PRINTF:NEAR ;AN000; +EXTRN rate_equal:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN ready_status:ABS ;see modeprin +EXTRN redpt:BYTE ;printer number (n) in message "LPTn rerouted to COMm" +EXTRN refresh:ABS ;AN000; +EXTRN retry_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN request_type:BYTE ;see "MODEPARS.ASM" ;AN000; +EXTRN retry_equal:BYTE ;see MODEDEFS.INC ;AN000; +EXTRN retry_equal_str:BYTE ;AN000; +EXTRN retry_index:WORD ;see MODECOM.ASM ;AN000; +EXTRN retry_type_ptr:WORD ;see MODESUBS.INC ;AN000; +EXTRN row_ptr:WORD ;see modesubs.inc ;AN000; +EXTRN row_type:WORD ;see modesubs.inc ;AN000; +EXTRN R_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN R_str:BYTE ;see MODEPARS.ASM ;AN000; +EXTRN Required_font_not_loaded:BYTE ;see modedefs.asm ;AN000; +EXTRN res_com_retry_type:ABS ;see RESCODE.SAL ;AN000; +;EXTRN res_lpt_retry_type:ABS ;see RESCODE.SAL ;AN000; +EXTRN select:ABS ;request type for 'modecp' ;AN000; +EXTRN select_item_tag:ABS ;see MODEPARS.ASM ;AN000; +EXTRN serial_base:WORD ;see modecom ;AN000; +EXTRN set_con_features:ABS ;AN000; +EXTRN set_retry_type:NEAR ;see modeprin ;AN000; +EXTRN shift_screen:NEAR ;see modescrn ;AN000; +EXTRN stat_dev_ptr:WORD ;see modedefs.inc ;AN000; +EXTRN status_for_device:BYTE ;"Status for device %1:" see modedefs.inc ;AN000; +EXTRN status_for_everything:ABS ;AN000; +EXTRN stop_bits_index:WORD ;see modecom.asm ;AN000; +EXTRN stop_equal:BYTE ;"STOP=", see modepars ;AN000; +EXTRN typamat:NEAR ;see "typamat.asm" ;AN000; + ;AN000; +;possible values of "request_type" ;AN000; + ;AN000; +EXTRN all_con_status:ABS ;AN000; +EXTRN codepage_prepare:ABS ;AN000; +EXTRN codepage_refresh:ABS ;AN000; +EXTRN codepage_select:ABS ;AN000; +EXTRN codepage_status:ABS ;AN000; +EXTRN codepage_prepared_status:ABS ;AN000; +EXTRN codepage_selected_status:ABS ;AN000; +EXTRN com_status:ABS ;AN000; +;EXTRN con_status:ABS ;AN000; +EXTRN initialize_com_port:ABS ;AN000; +EXTRN initialize_printer_port:ABS ;AN000; +EXTRN old_initialize_printer_port:ABS ;AN000; +EXTRN old_video_mode_set:ABS ;AN000; +EXTRN printer_reroute:ABS ;AN000; +EXTRN printer_status:ABS ;AN000; +EXTRN turn_off_reroute:ABS ;AN000; + ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +ANSI_installed DB false ;boolean indicator of whether ANSI.SYS is installed ;AN000; +columns_specified DB false ;indicates if columns= was on the command line, see set_con_features_case;AN000; +code_page_numbers_encountered DB 0 ;AN000; +cp_cb codepage_parms <> ;codepage subroutine parameter block ;AN000; +com_ports_attached DB 0 ;number of com ports in the machine +current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet' ;AN000; +delay_holder DB 1 ;holder for binary form of delay requested ;AN000; +device_request DB ? ;holds device request value ;AN000; +max_pknum EQU ($ - OFFSET des_start_packet.des_strt_pkcp1)/2 ;most cp numbers can send at once ;AN000; +;IOCTL0C_functions_requested DB 0 ;for displaying messages, flag byte indicating IOCTL functions requested ;AN000; +need_typamat_call DB false ;boolean for saving up delay and rate settings ;AN000; +need_IOCTL0C DB false ;boolean for saving up parts of an IOCTL 0CH call ;AN000; +parm_list_holder DW bogus ;holder for address of parsed parameter list for when BX is needed elsewhere ;AN000; +parm_list_index_holder DW bogus ;holder for index of parsed parameter list for when DI is needed elsewhere ;AN000; +i DB 0 ;index for status loop ;AN000; +rate_holder DB 32 ;holder for binary form of rate value ;AN000; +row_value DB ? ;holder for binary form of row value during status display ;AN000; + ;AN000; +IOCTL0C_data_block IOCTL0C_def<> ;AN000; + +PUBLIC IOCTL0C_data_block + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; +check_ANSI_installed PROC NEAR ;See if ANSI.SYS is installed ;AC001; + + MOV AH,ANSIINT2F ;AC001; + MOV AL,check_installed ;AC001; + INT 2FH ;AC001; + .IF THEN ;AC001; + MOV ANSI_installed,true ;initialized to false, so no ELSE needed ;AC001; + .ENDIF + +check_ANSI_installed ENDP ;AC001; + +;------------------------------------------------------------------------------ + + + +setup_device_name PROC NEAR ;AN000; + ;AN000; +MOV DX,device_name ;DX=pointer to ASCIIZ device name ;AN000; +MOV cp_cb.cp_device,DX ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; + ;AN000; +RET ;AN000; + ;AN000; +setup_device_name ENDP ;AN000; + ;AN000; +;------------------------------------------------------------------------------- ;AN000; + ;AN000; + ;AN000; +do_IOCTL0C PROC NEAR ;AN000; +PUBLIC DO_IOCTL0C ;AN000; + MOV AH,open ;open device ;AN000; + MOV AL,dev_open_mode ;AL=open mode for devices, see modecpeq.inc ;AN000; + MOV DX,OFFSET CON_str ;know that CON is being opened, avoid using user input and having to remove colon ;AN000; + INT 21H ;AN000; + ;AN000; + MOV BX,AX ;BX=handle of CON ;AN000; + MOV AX,440CH ;AN000; + MOV CH,display_device ;type of device ;AN000; + MOV DX,OFFSET IOCTL0C_data_block ;AN000; + INT 21H ;the IOCTL data block is filled with the current settings ;AN000; + PUSHF ;save result of the IOCTL ;AN000; + ;AN000; + MOV AH,3EH ;assume that BX still has the handle ;AN000; + INT 21H ;close CON, open and close each time because if error may not be back to close ;AN000; + ;AN000; + POPF ;restore result of the IOCTL ;AN000; + ;AN000; + RET ;AN000; + ;AN000; +do_IOCTL0C ENDP ;AN000; + ;AN000; +;------------------------------------------------------------------------------- ;AN000; + ;AN000; +display_columns_status PROC NEAR ;AN000; + ;AN000; +MOV CL,get_current_settings ;AN000; +CALL do_IOCTL0C ;get current settings of CON ;AN000; +.IF THEN ;AN000; + .IF THEN ;AN000; + MOV columns_ptr,OFFSET eighty_str ;set up message block with pointer to "80" ;AN000; + .ELSE ;AN000; + MOV columns_ptr,OFFSET fourty_str ;AN000; + .ENDIF ;AN000; +.ELSE ;AN000; + MOV columns_ptr,OFFSET NONE_str ;AN000; +.ENDIF ;AN000; +display COLUMNS_equal_msg ;AN000; + ;AN000; +RET ;AN000; + ;AN000; +display_columns_status ENDP ;AN000; + ;AN000; +;------------------------------------------------------------------------------- ;AN000; + ;AN000; +display_lines_status PROC NEAR ;AN000; + ;AN000; +MOV CL,get_current_settings ;AN000; +CALL do_IOCTL0C ;get current settings of CON ;AN000; +.IF THEN ;AN000; + MOV AX,IOCTL0C_data_block.rows ;AN000; + MOV row_value,AL ;row_value=binary row value ;AN000; + MOV row_type,right_align+unsgn_bin_byte ;set up sublist so msg ret knows it is a binary byte ;AN000; + MOV row_ptr,OFFSET row_value ;set up LINES_equal sublist ;AN000; +.ELSE ;AN000; + MOV row_ptr,OFFSET NONE_str ;AN000; +.ENDIF ;AN000; +display LINES_equal_msg ;AN000; + ;AN000; +RET ;AN000; + ;AN000; +display_lines_status ENDP ;AN000; + +;------------------------------------------------------------------------------- + +old_video_mode_set_IOCTL PROC NEAR ;AN004; + +MOV CL,set_display_characteristics ;AN000; +CALL do_IOCTL0C ;AN000; +.IF C THEN ;AN000; + get_extended_error ;AN000; + .IF THEN ;AN000; + DISPLAY Function_not_supported ;AN000; + .ELSEIF THEN ;AN000; + DISPLAY Required_font_not_loaded ;AN000; + .ENDIF ;AN000; + MOV noerror,false ;AN000; +.ENDIF ;AN000;carry ;AN000; + +RET + ;AN004; +old_video_mode_set_IOCTL ENDP ;AN004; + + ;AN000; +;------------------------------------------------------------------------------- ;AN000; +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; +;³ +;³ CHECK_COM_PORTS_ATTACHED +;³ ------------------------ +;³ +;³ Return the number of com ports in the machine. +;³ +;³ INPUT: none +;³ +;³ +;³ RETURN: com_ports_attached - number of com ports +;³ +;³ +;³ MESSAGES: none +;³ +;³ REGISTER +;³ USAGE: SI - index of the FOR loop and displacement from serial_base +;³ ES - holds segment of ROM data area +;³ +;³ +;³ ASSUMPTIONS: The user has initialized com_ports_attached to zero. +;³ +;³ +;³ SIDE EFFECT: ES is lost +;³ SI is lost +;³ ;AN000; +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; + +check_com_ports_attached PROC NEAR + +MOV SI,0 +MOV ES,SI ;now ES:SERIAL_BASE addresses 40:0=0:400 + +.FOR SI = 0 TO 6 STEP 2 + + .IF < NE 0> THEN ;SEE IF THE COM PORT EXISTS + INC com_ports_attached + .ENDIF + +.NEXT SI + +RET + +check_com_ports_attached ENDP + + +;------------------------------------------------------------------------------- ;AN000; +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; +;³ +;³ CHECK_PRN_PORTS_ATTACHED +;³ ------------------------ +;³ +;³ Return the number of printer ports in the machine. The network will put a 2 +;³ in th address word if the printer is redirected, so for the printer to +;³ actually exist the address must be greater than 2 ("redirected"). Since +;³ can't have infinite retry on redirected printers only want to count ports +;³ with >2 for addresses. +;³ +;³ INPUT: none +;³ +;³ +;³ RETURN: prn_ports_attached - number of printer ports +;³ +;³ +;³ MESSAGES: none +;³ +;³ REGISTER +;³ USAGE: SI - index of the FOR loop and displacement from printr +;³ ES - holds segment of ROM data area (0 in this case) +;³ +;³ +;³ ASSUMPTIONS: All valid printer port addresses are >2. +;³ +;³ +;³ SIDE EFFECT: ES is lost +;³ SI is lost +;³ ;AN000; +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; + +check_prn_ports_attached PROC NEAR + + +MOV SI,0 +MOV ES,SI ;now ES:printr addresses 40:8=0:408 + +.FOR SI = 0 TO 4 STEP 2 ;for each of 3 printer port address holder words + + .IF < GT redirected> THEN ;SEE IF THE PORT EXISTS + INC prn_ports_attached + .ENDIF + +.NEXT SI + +RET + +check_prn_ports_attached ENDP + + +;------------------------------------------------------------------------------- ;AN000; +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; +;³ ;AN000; +;³ GET_DEVICE_RETRY_TYPE ;AN000; +;³ --------------------- ;AN000; +;³ ;AN000; +;³ Return the type of retry active for comX or lptX. ;AN000; +;³ ;AN000; +;³ INPUT: device_request - scalar indicating what status the user requested. ;AN000; +;³ use the following equates: ;AN000; +;³ ;AN000; +;³ com1_retry_type_status EQU 0 ;AN000; +;³ com2_retry_type_status EQU 2 ;AN000; +;³ com3_retry_type_status EQU 4 ;AN000; +;³ com4_retry_type_status EQU 6 ;AN000; +;³ lpt1_retry_type_status ;AN000; +;³ lpt2_retry_type_status ;AN000; +;³ lpt3_retry_type_status ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ RETURN: returned_retry_type - scalar indicating type of retry active for ;AN000; +;³ the requested device. compare with the following equates: ;AN000; +;³ ;AN000; +;³ no_retry_flag ;AN000; +;³ error_status ;AN000; +;³ busy_status ;AN000; +;³ ready_status ;AN000; +;³ ;AN000; +;³ retry_type_ptr - set to proper string ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ MESSAGES: none ;AN000; +;³ ;AN000; +;³ REGISTER ;AN000; +;³ USAGE: CL - For com ports it serves as bit shift count for the retry type byte. +;³ ;AN000; +;³ AL - On exit holds retry type scalar on exit (returned_retry_type) ;AN000; +;³ ;AN000; +;³ ES - holds segment of resident mode code ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ CONVENTIONS: The value in device_request is used as an index into the LPTX ;AN000; +;³ array of retry type flags, or as a bit shift count for the ;AN000; +;³ COM retry type byte. ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ASSUMPTIONS: The user has initialized device_request on entry with ;AN000; +;³ the equates provided. ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ SIDE EFFECT: none. ;AN000; +;³ ;AN000; +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; + ;AN000; +get_device_retry_type PROC NEAR ;AN665; + +PUBLIC get_device_retry_type + +PUSH BX ;AN665; +PUSH ES ;AN665; + +XOR BX,BX ;AN665; +MOV ES,BX ;set segment to zero ;AN665; + +.IF < NE 0000H> THEN ;IF code resident THEN ;AN665; + MOV ES,ES:WORD PTR resseg[2] ;ES=seg of resident code ;AN665; + .IF THEN + MOV CL,device_request ;CL has 0, 2, 4 or 6 for COM 1, 2, 3 or 4 respectively ;AC003; + MOV returned_retry_type,BYTE PTR ES:res_com_retry_type ;AL=the status byte for all 4 com ports ;AN665; + SHR returned_retry_type,CL ;AL=XXXXXX??, where ?? is the retry bits for port in question ;AC003; + AND returned_retry_type,00000011B ;AL=000000??, where ?? is the retry bits for port in question ;AC003; + .ELSE ;AN665; + MOV BL,device_request ;BX=index into retry bytes in resident code ;AN665; + MOV returned_retry_type,BYTE PTR ES:lpt1_retry_type[BX] ;AN665; + .ENDIF ;AN665; +.ELSE ;AN665; + MOV returned_retry_type,no_retry_flag ;AN665; +.ENDIF ;AN665; + +.IF OR ;COM form of busy flag ;AN665; +.IF THEN ;AN665; + MOV retry_type_ptr,OFFSET B_str ;AN665; +.ELSEIF OR ;COM form of error flag ;AN665; +.IF THEN ;AN665; + MOV retry_type_ptr,OFFSET E_str ;AN665; +.ELSEIF OR ;COM form of ready flag ;AN665; +.IF THEN ;AN665; + MOV retry_type_ptr,OFFSET R_str ;AN665; +.ELSE ;AN665; + MOV retry_type_ptr,OFFSET NONE_str ;not E, B or R. ;AN665; +.ENDIF ;AN665; + +POP ES ;AN665; +POP BX ;AN665; +RET ;AN665; + +get_device_retry_type ENDP ;AN665; + ;AN000; +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; +;³ ;AN000; +;³ ANALYZE_AND_INVOKE ;AN000; +;³ ------------------ ;AN000; +;³ ;AN000; +;³ The command line is boken down into pieces by "parse_parameters". Each piece ;AN000; +;³ is analyzed here, and the appropriate routine called to setup and/or execute ;AN000; +;³ the requested function. ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ INPUT: request_type - scalar indicating what operation the user requested. ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ RETURN: none ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ MESSAGES: none ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ REGISTER ;AN000; +;³ USAGE: DI - index into the list of parsed parms, the array parm_list. ;AN000; +;³ ;AN000; +;³ CX - temporary holder for memory to memory MOVs ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ CONVENTIONS: ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ASSUMPTIONS: All the input are valid. The parm_list entry past the last one ;AN000; +;³ has a parm_type of bogus. ;AN000; +;³ ;AN000; +;³ The lines and columns values are in binary for request_type= ;AN000; +;³ set_con_features ;AN000; +;³ ;AN000; +;³ The codepage numbers were put into des_start_packet. ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ ;AN000; +;³ SIDE EFFECT: ;AN000; +;³ ;AN000; +;³ ;AN000; +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; + ;AN000; +analyze_and_invoke PROC NEAR ;AX000; ;AN000; + ;AN000; + ;AN000; +;CASE request_type= ;AN000; + ;AN000; + MOV cp_cb.des_pack_ptr,OFFSET des_start_packet ;AX000;In case a codepage request ;AN000; + ;AN000; + MOV DI,0 ;initialize index into the list of parsed parameters ;AN000; + ;AN000; + ;calculate the displacement for the jump to the jump ;AN000; + MOV parm_list_holder,BX ;save parm_list_BX ;AN000; + XOR BX,BX ;AX000; ;AN000; + MOV BL,max_request_type ;AX000; ;AN000; + SUB BL,request_type ;AX000;see the list of equates for request_type ;AN000; + SHL BX,1 ;AX000;BX=word displacement into jump table ;AN000; + JMP jump_table1[BX] ;AX000;jump to appropriate jump ;AN000; + ;AN000; + jump_table1 LABEL WORD ;the order of the following entries is critical ;AN000; + ;AN000; + DW OFFSET all_con_status_case ;AN000; + DW OFFSET codepage_prepare_case ;AN000; + DW OFFSET codepage_refresh_case ;AN000; + DW OFFSET codepage_select_case ;AN000; + DW OFFSET codepage_status_case ;AN000; + DW OFFSET codepage_prepared_status_case ;AN000; + DW OFFSET codepage_selected_status_case ;AN000; + DW OFFSET com_status_case ;AN000; + DW OFFSET initialize_com_port_case ;AN000; + DW OFFSET initialize_printer_port_case ;AN000; + DW OFFSET old_initialize_printer_port_case ;AN000; + DW OFFSET old_video_mode_set_case ;AN000; + DW OFFSET printer_reroute_case ;AN000; + DW OFFSET printer_status_case ;AN000; + DW OFFSET set_con_features_case ;AN000; + DW OFFSET status_for_everything_case ;AN000; + DW OFFSET turn_off_reroute_case ;AN000; + ;AN000; + ;AN000; + all_con_status_case: ;know that all con status is requested ;AN000; + ;AN000; + ;AN000; + MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000; + MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000; + display status_for_device ;AN000; + display long_underline ;Status for device CON: ;AN000; + display four_char_underline ;---------------------- ;AN000; + ;AN000; + CAll check_ANSI_installed ;see if ANSI.SYS is installed ;AC001; + .IF THEN ;IF can get info on settings THEN display them ELSE don't display them + CALL display_columns_status ;AN000; + CALL display_lines_status ;AN000; + .ENDIF ;AC001; + MOV cp_cb.request_typ,status ;set up variables for modecp ;AN000; + MOV cp_cb.cp_device,OFFSET CON_str ;AN000; + ;AN000; + CALL modecp ;display codepage status ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + codepage_prepare_case: ;AN000; + ;AN000; + MOV cp_cb.request_typ,prepare ;AN000; + CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; + ;AN000; + call modecp ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + codepage_refresh_case: ;AN000; + ;AN000; + MOV cp_cb.request_typ,refresh ;AN000; + CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; + ;AN000; + call modecp ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + ;AN000; + codepage_select_case: ;AN000; + ;AN000; + MOV cp_cb.request_typ,select ;AN000; + CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; + MOV des_start_packet.des_strt_pknum,1 ;one cp number ;AN000; + MOV des_start_packet.des_strt_pklen,4 ;bytes for count (word) and one number (word) ;AN000; + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + MOV DI,codepage_index_holder ;DI=index in parm list of the entry for the codepage to be selected;AN000; + MOV AX,parm_list_BX[DI].value1 ;AX=codepage number in binary form ;AN000; + MOV des_start_packet.des_strt_pkcp1,AX ;setup parm block with the (single) cp number ;AN000; + ;AN000; + CALL modecp ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + codepage_status_case: ;AN000; + codepage_prepared_status_case: ;AN000; + codepage_selected_status_case: ;AN000; + ;AN000; + MOV cp_cb.request_typ,status ;AN000; + CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; + ;AN000; + CALL modecp ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + com_status_case: ;AN000; + ;AN000; + ; INPUT: device_type = COMx + ; device = ASCII COM number + + + CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000; + ;AN000; + .IF > AND ;AN000; + .IF THEN ;COM1 exists + MOV BL,COM1 ;AN000; + MOV stat_dev_ptr,OFFSET COM1_str ;set up msg ser input ;AN000; + MOV device_request,com1_retry_type_status ;AN000; + .ELSEIF > AND ;AN000; + .IF THEN ;COM2 exists + MOV BL,COM2 ;AN000; + MOV stat_dev_ptr,OFFSET COM2_str ;set up msg ser input ;AN000; + MOV device_request,com2_retry_type_status ;AN000; + .ELSEIF > AND ;AN000; + .IF THEN ;COM3 exists + MOV BL,COM3 ;AN000; + MOV stat_dev_ptr,OFFSET COM3_str ;set up msg ser input ;AN000; + MOV device_request,com3_retry_type_status ;AN000; + .ELSEIF > AND ;AN000; + .IF THEN ;COM4 exists + MOV BL,COM4 ;AN000; + MOV stat_dev_ptr,OFFSET COM4_str ;set up msg ser input ;AN000; + MOV device_request,com4_retry_type_status ;AN000; + .ELSE ;device does not exist ;AN000; + MOV CX,device_name ;AN000; ;AN000; + MOV illegal_device_ptr,CX ;put pointer to com port string in message ;AN000; + DISPLAY err1 ;AN000;"Illegal device name - COMX" ;AN000; + MOV noerror,false ;set flag for displaying status to be skipped + .ENDIF ;AN000; + .IF THEN + MOV dev_name_size,len_COMX_str ;set up for msg service, see MODEPARS.ASM ;AN000; + display status_for_device ;"Status for device COM?:" ;AN000; + display long_underline ;"------------------" ;AN000; + display five_char_underline ;has CRLF on it "-----" ;AN000; + call get_device_retry_type ;AN000; + display retry_equal ;AN000; + .ENDIF + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; +; con_status_case: ;don't know which con status is requested ;AN000; + ;AN000; +; MOV request_type,all_con_status ;AC000;DCR76 ;AN000; +; CALL analyze_and_invoke ;AC000;DCR76 ;AN000; + ;AN000; +; MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000; +; MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000; +; display status_for_device ;AN000; +; display long_underline ;Status for device CON: ;AN000; +; display four_char_underline ;---------------------- ;AN000; +; ;AN000; +; MOV DI,0 ;AN000; +; ;AN000; +; .WHILE DO ;the entry after the last has parm_type of bogus ;AN000; +; ;AN000; +; ;CASE parm_list_BX[DI].item_tag= ;AN000; +; ;AN000; +; ;CODEPAGE, ;AN000; +; ;PREPARE, ;AN000; +; ;SELECT: ;AN000; +; ;AN000; +; .IF OR ;AN000; +; .IF OR ;AN000; +; .IF THEN ;AN000; +; ;AN000; +; MOV cp_cb.request_typ,status ;AN000; +; MOV cp_cb.cp_device,OFFSET CON_str ;AN000; +; CALL modecp ;display codepage status ;AN000; +; ;AN000; +; BREAK 2 ;AN000; +; ;AN000; +; .ENDIF ;AN000; +; ;AN000; +; ;BLINK: ;AN000; +; ;AN000; +; .IF THEN ;AN000; +; ;AN000; +; CALL display_blink_status ;AN000; +; ;AN000; +; BREAK 2 ;AN000; +; ;AN000; +; .ENDIF ;AN000; +; ;AN000; +; ;AN000; +; ;COLUMNS: ;AN000; +; ;AN000; +; .IF THEN ;AN000; +; ;AN000; +; CALL display_COLUMNS_status ;AN000; +; ;AN000; +; BREAK 2 ;AN000; +; ;AN000; +; .ENDIF ;AN000; +; ;AN000; +; ;AN000; +; ;LINES: ;AN000; +; ;AN000; +; .IF THEN ;AN000; +; ;AN000; +; CALL display_lines_status ;AN000; +; ;AN000; +; BREAK 2 ;AN000; +; ;AN000; +; .ENDIF ;AN000; +; ;AN000; +; ENDCASE_2: ;AN000; +; ;AN000; +; ADD DI,TYPE parm_list_entry ;AN000; +; ;AN000; +; .ENDWHILE ;AN000; + ;AN000; +; BREAK 0 ;AN000; + ;AN000; + ;AN000; + ;AN000; + initialize_com_port_case: ;AN000; + ;AN000; + + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + + .IF THEN ;IF the parms were input as keywords THEN ;AN000; + ;AN000; + MOV DI,TYPE parm_list_entry ;skip COMN parm ;AN000; + ;AN000; + .WHILE DO NEAR ;the entry after the last has parm_type of bogus ;AN000; + ;AN000; + ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000; + ;AN000; + ;BAUD_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the baud rate string ;AN000; + MOV pbaud_ptr,AX ;set pointer to the baud rate string in the messge ;AN000; + MOV baud_index,DI ;set index into parm list for setcom ;AN000; + BREAK 3 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;PARITY_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV SI,parm_list_BX[DI].value1 ;AX= pointer to the parity string ;AN000; + MOV pparity_ptr,SI ;set pointer to the parity string in the messge ;AN000; + OR BYTE PTR [SI],lowercase ;convert to lowercase for compatibility with previous versions + MOV parity_index,DI ;set index into parm list for setcom ;AN000; + BREAK 3 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;DATA_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV BP,parm_list_BX[DI].value1 ;BP= pointer to the data bits string ;AN000; + MOV AL,[BP] ;AL= data bits character ;AN000; + MOV pdata,AL ;set the data bits string in the messge ;AN000; + MOV data_bits_index,DI ;set index into parm list for setcom ;AN000; + BREAK 3 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;STOP_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the stop bit string ;AN000; + MOV pstop_ptr,AX ;set pointer to the parity string in the messge ;AN000; + MOV stop_bits_index,DI ;set index into parm list for setcom ;AN000; + BREAK 3 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;RETRY_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV retry_index,DI ;indicate to modecom which parm is retry ;AN000; +; BREAK 3 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ENDCASE_3: ;AN000; + ;AN000; + ADD DI,TYPE parm_list_entry ;AN000; + ;AN000; + ;AN000; + .ENDWHILE ;AN000; + ;AN000; + .ELSE ;the parms were entered as positionals (the old form) ;AN000; + ;AN000; + MOV baud_index,TYPE parm_list_entry ;AN000; + MOV DI,2 * (TYPE parm_list_entry) ;AN000; + .IF THEN ;AN000;IF stopbits requested THEN + MOV parity_index,DI ;AN000; + .ENDIF + MOV DI,3 * (TYPE parm_list_entry) ;AN000; + .IF THEN ;AN000;IF stopbits requested THEN + MOV data_bits_index,DI ;AN000; + .ENDIF + MOV DI,4 * (TYPE parm_list_entry) ;DI=stopbits index ;AN000; + .IF THEN ;AN000;IF stopbits requested THEN + MOV stop_bits_index,DI ;AN000; + .ENDIF + MOV DI,5 * (TYPE parm_list_entry) ;AN000;DI=index of retry parm + .IF THEN ;AN000;IF retry requested THEN + MOV retry_index,DI ;AN000;set up index for modecom + .ENDIF ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + CALL modecom ;AN000; + ;AN000; + BREAK 0 ;AN000; + + ;AN000; + ;AN000; + old_initialize_printer_port_case: ;Assume that parms not specified have an entry in parm_list that is in initial state;AN000; + + ;printer_no has ASCII form of printer number ;AN000; + ;need to put binary form of columns in columns_holder (80 or 132) ;AN000; + ;need to put "6" or "8" in parm2 ;AN000; + ;need to set retry_index ;AN000; + + +PUBLIC old_initialize_printer_port_case + + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + MOV DI,TYPE parm_list_entry ;skip LPTN parm, point at chars per line ;AN000; + + .IF THEN ;AN000; + MOV columns_holder,132 ;AN000; + .ELSEIF THEN ;AN000; + MOV columns_holder,80 ;AN000; + .ENDIF ;if not 80 or 132 modeprin assumes not specified, and makes no change;AN000; + ADD DI,TYPE parm_list_entry ;look at lines per inch ;AN000; + + .IF THEN ;IF chars per line specified THEN ;AN000; + MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000; + MOV AL,BYTE PTR DS:[SI] ;AN000; + MOV parm2,AL ;parm2="6" or "8" ;AN000; + .ENDIF ;otherwise leave parm2=0FFH (unspecified) ;AN000; + + ADD DI,TYPE parm_list_entry ;look at retry request ;AN000; + .IF THEN ;AN000; + MOV retry_index,DI ;AN000;let modeprin know retry was requested and the index of it. + .ENDIF ;AN000; + + CALL modeecno ;AN000; + CALL modeprin ;AN000; + ;AN000; + BREAK 0 ;AN000; + + + + initialize_printer_port_case: ;printer_no has ASCII form of printer number ;AN000; + ;need to put binary form of columns in columns_holder (80 or 132) ;AN000; + ;need to put "6" or "8" in parm2 ;AN000; + ;need to set retry_index ;AN000; + ;AN000; + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + MOV DI,TYPE parm_list_entry ;skip LPTN parm ;AN000; + + .WHILE DO ;the entry after the last has parm_type of bogus ;AN000; + ;AN000; + ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000; + ;AN000; + ;AN000; + ;LINES_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000; + MOV AL,BYTE PTR DS:[SI] ;AN000; + MOV parm2,AL ;parm2="6" or "8" ;AN000; + BREAK 4 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;COLUMNS_equal: ;AN000; + ;AN000; + .IF > OR ;AN000; + .IF > THEN ;AN000; + ;AN000; + .IF THEN ;AN000; + MOV columns_holder,132 ;AN000; + .ELSE ;AN000; + MOV columns_holder,80 ;AN000; + .ENDIF ;AN000; + BREAK 4 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;RETRY_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + + MOV retry_index,DI ;AN664; + BREAK 4 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ENDCASE_4: ;AN000; + ;AN000; + ADD DI,TYPE parm_list_entry ;AN000; + ;AN000; + ;AN000; + .ENDWHILE ;AN000; + + CALL modeecno ;turn of rerouting ;AN000; + CALL modeprin ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + ;AN000; + ;AN000; + old_video_mode_set_case: ;AN000; + ;AN000; + PUBLIC old_video_mode_set_case ;AN000; + ;AN000; + ;AN000; + ;first see if ANSI.SYS is loaded ;AN000; + CALL check_ANSI_installed ;AC001; + .IF THEN ;AC001; + MOV CL,get_current_settings ;AN000; + PUSH BX ;save parm_list ;AN000; + CALL do_IOCTL0C ;get current settings of CON ;AN000; + POP BX ;restore parm_list ;AN000; + MOV IOCTL0C_data_block.mode,text ;AN000; + .ENDIF ;AN000;ANSI installed ;AN000; + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + PUSH DI ;save parm list index ;AN000; + .IF THEN + .IF THEN ;IF BW40 REQUESTED ;AN000; + CALL BW40 ;AN000; + .ELSEIF THEN ;IF BW80 REQUESTED ;AN000; + CALL BW80 ;AN000; + .ELSEIF THEN ;IF CO40 REQUESTED ;AN000; + CALL CO40 ;AN000; + .ELSEIF THEN ;IF CO80 REQUESTED ;AN000; + CALL CO80 ;AN000; + .ELSEIF THEN ;IF MONO REQUESTED ;AN000; + CALL MONO ;AN000; + .ELSE ;AN000; + .IF THEN ;AN000; +;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000; + .IF > THEN ;AN000; + MOV IOCTL0C_data_block.cols,40 ;setup IOCTL input block with the columns requested ;AN000; + .ELSE + MOV IOCTL0C_data_block.cols,80 ;setup IOCTL input block with the columns requested ;AN000; + .ENDIF ;AN000; + CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000; + .ELSE + .IF THEN ;IF 40 REQUESTED ;AN000; + MOV BL,40 ;set up for handle_40_or_80 ;AN000; + .ELSE ;AN000; + MOV BL,80 ;set up for handle_40_or_80 ;AN000; + .ENDIF ;AN000; + CALL HANDLE_40_OR_80 ;AN000; + .ENDIF + .ENDIF ;AN000; + .ENDIF + +dummy9: +PUBLIC dummy9 + ;AN000; + POP DI ;restore parm list index ;AN000; + + .IF AND ;process ,r ³ l,[T] ;AN000; + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + ADD DI,TYPE parm_list_entry ;process second parm, shift direction ;AN000; + .IF THEN ;AN000; + .IF OR ;AN000; + .IF THEN ;AN000; + MOV CL,parm_list_BX[DI].item_tag ;AN000; + MOV PARM2,CL ;set up for SHIFT_SCREEN ;AN000; + ADD DI,TYPE parm_list_entry ;look at third parm ;AN000; + MOV CL,parm_list_BX[DI].item_tag ;CL=T_item_tag or bogus ;AN000; + MOV PARM3,CL ;may be bogus, but shift_screen will handle it correctly ;AN000; + CALL SHIFT_SCREEN ;AN000; + .ELSE ;AN000;must be a rows value + .IF THEN ;AN000; +;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000; + MOV DX,parm_list_BX[DI].value1 ;AN000; + MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000; + CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000; + .ELSE ;AN000;ANSI not installed ;AN000; + DISPLAY ANSI_not_loaded ;AN000; + MOV noerror,false ;AN000; + .ENDIF ;AN000;ANSI installed ;AN000; + .ENDIF ;AN000; + .ENDIF ;AN000; + ;AN000; + BREAK 0 ;AN000; + + + ;AN000; +PUBLIC printer_reroute_case + ;AN000; + printer_reroute_case: + ;INPUT:lptno=zero based printer number OUTPUT:;AH=printer number mask: lpt1=1, lpt2=2, lpt3=4 ;AN000; + ;device=COM number in ASCII form ;SI=printer number value (one based) ;AN000; + ;AL=com number character ;AN000; + XOR CX,CX + MOV CL,lptno ;lptno always <= 255 + MOV SI,CX ;SI=zero based printer number (0, 1, or 2) ;AN000; + INC SI ;SI=one based printer number (1, 2, or 3) ;AN000; + MOV AH,1 ;AN000; + SAL AH,CL ;AH=2**SI,AH=printer number mask for MODEECHO ;AN000; + MOV DH,CL + ADD DH,ASCII_1 ;DH=ASCII printer number ;AN000; + MOV AL,device ;AL=ASCII form of com device number ;AN000; + MOV REDPT,DH ;PUT n OF LPTn IN REDIRECT MESSAGE + MOV NOTREDPT,DH ;AND INTO NOT REDIRECTED MSG + CALL modeecho ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + ;AN000; + printer_status_case: ;AN000; + +PUBLIC printer_status_case + + ; INPUT: device_type = LPTx + ; device = ASCII printer number + ; lptno = ASCII printer number + ; device_name = offset of printer string + ;AN000; + + MOV cp_cb.request_typ,status ;AN000; + MOV AX,device_name ;AN000; + MOV stat_dev_ptr,AX ;AC665;set up msg ser input ;AN000; + MOV dev_name_size,len_LPTX_str ;AN000;set up for msg service, see MODEPARS.ASM ;AN000; + MOV cp_cb.cp_device,AX ;AN665;set up for call to modecp ;AN000; + ;AN000; + .IF > THEN ;AN000; + MOV device_request,lpt1_retry_type_status ;AN000; + MOV rerouted_printer_mask,LPT1 + MOV redpt,"1" ;set up for reroute message + MOV notredpt,"1" ;set up for not rerouted message + .ELSEIF > THEN ;AN000; + MOV device_request,lpt2_retry_type_status ;AN000; + MOV rerouted_printer_mask,LPT2 + MOV redpt,"2" ;set up for reroute message + MOV notredpt,"2" ;set up for not rerouted message + .ELSEIF > THEN ;AN000; + MOV device_request,lpt3_retry_type_status ;AN000; + MOV rerouted_printer_mask,LPT3 + MOV redpt,"3" ;set up for reroute message + MOV notredpt,"3" ;set up for not rerouted message + .ENDIF ;AN000; + ;AN000; + PUSH ES ;save ES, used in MODECP ;AC002; +;AC002;PUSH AX ;AN000;save + ;AN000; + display status_for_device ;AN000; + display long_underline "Status for device LPTX?" ;AN000; + display five_char_underline ;has CRLF on it ----------------------- ;AN000; + call display_printer_reroute_status ;see modeecho.asm ;AN000; +;AC002;POP AX ;restore "device_request" ;AN000; + XOR CX,CX ;initialize prn_ports_attached ;AN000; + CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached ;AN000; + POP ES ;restore ES ;AC002; + ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number ;AN000; + .IF THEN ;IF the printer exists THEN ;AN000; + call get_device_retry_type ;AN000; + display retry_equal ;AN000; + CALL modecp ;display codepage status ;AN000; + .ENDIF ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; +;m ;AN000; + set_con_features_case: ;the command line was nothing but con keywords ;AN000; + ;AN000; + ;first see if ANSI.SYS is loaded ;AN000; + CALL check_ANSI_installed ;AC001; + .IF THEN ;AC001; + MOV CL,get_current_settings ;AN000; + CALL do_IOCTL0C ;get current settings of CON ;AN000; + ;MOV SI,OFFSET IOCTL0C_data_block ;set up IOCTL0C, addressablitiy to the IOCTL data block ;AN000; + ;AN000; + MOV IOCTL0C_data_block.mode,text ;AN000; + ;AN000; + .ENDIF ;ANSI.SYS installed ;AN000; + ;AN000; + MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; + ADD DI,TYPE parm_list_entry ;skip CON parm ;AN000; + .WHILE DO NEAR ;the entry after the last has parm_type of bogus ;AN000; + ;AN000; + ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000; + ;AN000; + ;AN000; + ;LINES_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV DX,parm_list_BX[DI].value1 ;AN000; + MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000; + MOV need_IOCTL0C,true ;AN000; + BREAK 1 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;COLUMNS_equal: ;the value is binary ;AN000; + ;AN000; + .IF > OR ;AN000; + .IF > THEN ;AN000; + ;AN000; + .IF THEN ;AN000; + MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000; + MOV DX,parm_list_BX[DI].value1 ;AN000; + MOV IOCTL0C_data_block.cols,DX ;the IOCTL input block has the columns requested ;AN000; + .ELSE + .IF THEN ;IF 40 REQUESTED ;AN000; + MOV columns_specified,40 ;set up for handle_40_or_80 ;AN000; + .ELSE ;AN000; + MOV columns_specified,80 ;set up for handle_40_or_80 ;AN000; + .ENDIF ;AN000; + .ENDIF + BREAK 1 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;RATE_equal: ;AN000; + ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save the rate requested in binary form, always <255 ;AN000; + MOV rate_holder,AL ;AN000; + MOV need_typamat_call,true ;AN000; + BREAK 1 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ;AN000; + ;DELAY_equal: ;AN000; + ;AN000; + .IF > OR ;AN000; + .IF > THEN ;AN000; + ;AN000; + MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save delay requested (binary), always <255 ;AN000; + MOV delay_holder,AL ;AN000; + MOV need_typamat_call,true ;AN000; + BREAK 1 ;AN000; + ;AN000; + .ENDIF ;AN000; + ;AN000; + ENDCASE_1: ;AN000; + ;AN000; + ADD DI,TYPE parm_list_entry ;address next parm ;AN000; + ;AN000; + .ENDWHILE ;AN000; + ;AN000; +DUMMY3: ;AN000; +PUBLIC DUMMY3 ;AN000; + ;AN000; + .IF THEN ;AN000; + .IF THEN ;AN000; + MOV CL,set_display_characteristics ;AN000; + CALL do_IOCTL0C ;AN000; + .IF C THEN ;AN000; + get_extended_error ;AN000; + .IF THEN ;AN000; + DISPLAY Function_not_supported ;AN000; + .ELSEIF THEN ;AN000; + DISPLAY Required_font_not_loaded ;AN000; + .ENDIF ;AN000; + MOV noerror,false ;AN000; + .ENDIF ;AN000; + .ELSE ;AN000; + DISPLAY ANSI_not_loaded ;AN000; + MOV noerror,false ;AN000; + .ENDIF ;AN000; + .ELSEIF THEN ;AN000; + MOV BL,columns_specified ;set up for call to handle_40_or_80 ;AN000; + CALL HANDLE_40_OR_80 ;AN000; + .ENDIF ;AN000; + + .IF THEN ;AN000; + MOV BL,rate_holder ;AN000; + MOV BH,delay_holder ;AN000; + CALL typamat ;AN000; + .ENDIF ;AN000; + ;AN000; + BREAK 0 ;AN000; + ;AN000; + ;AN000; + status_for_everything_case: ;AN000; + ;AN000; + MOV request_type,printer_status ;status routine for printers ;AN000; + MOV device_name,OFFSET LPT1_str ;will display the reroute ;AN000; + CALL analyze_and_invoke ;status for the printer whether ;AN000; + MOV device_name,OFFSET LPT2_str ;it exists or not, so call for ;AN000; + CALL analyze_and_invoke ;all of them ;AN000; + MOV device_name,OFFSET LPT3_str ;AN000; + CALL analyze_and_invoke ;AN000; + ;AN000; + MOV request_type,all_con_status ;AN000; + CALL analyze_and_invoke ;AN000; + + CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000; + + MOV request_type,com_status ;AN000; + MOV CL,com_ports_attached ;AN000; + .FOR i = 1 TO CL ;AN000; + + .SELECT ;AN000; + + .WHEN ;AN000; + MOV device_name,OFFSET COM1_str ;AN000; ;AN000; + + .WHEN ;AN000; + MOV device_name,OFFSET COM2_str ;AN000; + + .WHEN ;AN000; + MOV device_name,OFFSET COM3_str ;AN000; + + .WHEN ;AN000; + MOV device_name,OFFSET COM4_str ;AN0;AN000; + + .ENDSELECT ;AN000; + + CALL analyze_and_invoke ;AN000; ;AN000; + .NEXT i ;AN000; + + BREAK 0 ;AN000; + + + + turn_off_reroute_case: ;user specified only LPTx[:] ;AN000; + ;INPUT:lptno=ASCII printer number + + + + CALL modeecno ;turn off rerouting ;AN000; + XOR CX,CX ;initialize prn_ports_attached + CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached + ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number + .IF THEN ;IF the printer exists THEN + CALL set_retry_type ;turn off infinit retry ;AN000; + CALL modify_resident_code ;modify resident code to reflect retry turned off ;AN000; + .ENDIF + + BREAK 0 ;AN000; + + ;AN000; +ENDCASE_0: ;AN000; + ;AN000; +RET ;AN000; + ;AN000; +analyze_and_invoke ENDP ;AN000; + ;AN000; + ;AN000; +PRINTF_CODE ENDS ;AN000; + END ;AN000; diff --git a/v4.0/src/CMD/MODE/MAIN.ASM b/v4.0/src/CMD/MODE/MAIN.ASM new file mode 100644 index 0000000..73acd7f --- /dev/null +++ b/v4.0/src/CMD/MODE/MAIN.ASM @@ -0,0 +1,168 @@ +;m + PAGE ,132 ; + TITLE MODE COMMAND - MAIN PROCEDURE AND COMMAND PARSING +.XLIST + INCLUDE STRUC.INC +.LIST +;.SALL + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +; AC001 - P3976: Need to have all pieces of messages in MODE.SKL so have to +; implement the SYSGETMSG method of getting addressability to +; the pieces. This means that the code does a SYSGETMSG call +; which returns a pointer (DS:SI) to the message piece. The +; address is then put in the sublist block for the message +; being issued. + +; AN002 - P4011: Need to close all open handles before terminating and staying +; resident so don't eat into the total available handles for the +; system. +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + +INCLUDE SYSMSG.INC + +MSG_UTILNAME + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +false EQU 00H +STDIN EQU 0 ;AN002;handle for standard input device +STDPRN EQU 4 ;AN002;handle for standard printer device +TERMINATE EQU 4CH ;INT 21 "TERMINATE RETURNING CODE" FUNCTION +terminate_and_stay_resident EQU 31H ;INT 21 "terminate and remain resident" +truu EQU 0FFH + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + + + PAGE +PRINTF_CODE SEGMENT PUBLIC + ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +PUBLIC main +PUBLIC SYSDISPMSG +PUBLIC SYSGETMSG + + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +EXTRN analyze_and_invoke:NEAR +EXTRN get_machine_type:NEAR ;get model and sub-model bytes +EXTRN initialize_sublists:NEAR ;see display.asm +EXTRN move_destination:ABS ;location of res code after it has been moved +EXTRN noerror:BYTE +EXTRN parse_parameters:NEAR +EXTRN PRINTF:NEAR +EXTRN rescode_length:ABS ;length in paragraphs of the resident code +EXTRN stay_resident:BYTE ;boolean indicating just loaded resident code see 'rescode' + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + + + DB "The MODE command " + DB "--------------------------------------------------------------" + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O C E D U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +close_handles PROC NEAR ;AN002;close all standard device handles + ;AN002; +MOV AH,3EH ;AN002; + ;AN002; +.FOR BX = STDIN TO STDPRN ;AN002; + INT 21H ;AN002; +.NEXT BX ;AN002; + ;AN002; +RET ;AN002; + ;AN002; +close_handles ENDP ;AN002; + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O C E D U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + + +; +;------------------------------------------------------------------------------- + +MSG_SERVICES ;define message service data area + +MSG_SERVICES ;AC001; +MSG_SERVICES ;class B is for messages > 30 +;;RPS MSG_SERVICES + + +main PROC NEAR + +CALL SYSLOADMSG ;load the message text +.IF NC THEN ;IF messages loaded successfully THEN + CALL get_machine_type + CALL initialize_sublists + CALL parse_parameters + .IF THEN ;no problems parsing so continue + CALL analyze_and_invoke ;semantically analyze the parms and invoke appropriate routine + .ENDIF + + MOV AH,TERMINATE ;assume won't stay resident + .IF THEN + MOV AL,1 ;had a problem somewhere + .ELSE + .IF THEN + CALL close_handles ;close all standard devices;AN002; + MOV DX,move_destination + MOV CL,4 ;4 right shifts = divide by 16 + SAR DX,CL ;DX=offset of start of resident code in paragraphs + ;SET END OF RESIDENT CODE FOR "terminate and remain resident" + ;TO first usable + ADD DX,rescode_length ;BYTE OF PROGRAM segment PREFIX + MOV AH,terminate_and_stay_resident + .ENDIF + MOV AL,0 ;all went well + .ENDIF +.ELSE ;ABORT + + CALL SYSDISPMSG ;display some "I'm crashing" message + +.ENDIF + + +INT 21H ;TERMINATE RETURNING ERRORLEVEL INDICATING success +RET + +include msgdcl.inc + +main ENDP + +PRINTF_CODE ENDS + END diff --git a/v4.0/src/CMD/MODE/MAKEFILE b/v4.0/src/CMD/MODE/MAKEFILE new file mode 100644 index 0000000..0e059d8 --- /dev/null +++ b/v4.0/src/CMD/MODE/MAKEFILE @@ -0,0 +1,130 @@ +#************************** makefile for cmd\... *************************** + +msg =..\..\messages +dos =..\..\dos +inc =..\..\inc +hinc =..\..\h + +# +####################### dependencies begin here. ######################### +# + +all: mode.com + +mode.ctl: mode.skl \ + makefile \ + $(msg)\$(COUNTRY).msg + + +main.obj: main.asm \ + makefile \ + $(inc)\copyrigh.inc \ + $(inc)\versiona.inc \ + $(inc)\struc.inc \ + $(inc)\sysmsg.inc \ + $(inc)\msgserv.asm \ + mode.ctl \ + mode.cl1 \ + mode.cl2 \ + mode.cla \ + mode.clb + +scrntab.obj: scrntab.asm \ + makefile + +modescrn.obj: modescrn.asm \ + makefile \ + $(inc)\struc.inc + +rescode.obj: rescode.asm \ + makefile \ + $(inc)\struc.inc + +modecom.obj: modecom.asm \ + makefile \ + $(inc)\struc.inc \ + modequat.inc \ + common.stc + +modeprin.obj: modeprin.asm \ + makefile \ + $(inc)\struc.inc + +modevid.obj: modevid.asm \ + makefile \ + $(inc)\struc.inc + +modeecho.obj: modeecho.asm \ + makefile \ + common.stc \ + $(inc)\struc.inc + +modeleng.obj: modeleng.asm \ + modequat.inc \ + makefile \ + $(inc)\struc.inc + +modemes.obj: modemes.asm \ + makefile \ + $(inc)\msgserv.asm \ + modesubs.inc \ + modedefs.inc \ + modequat.inc \ + common.stc + +display.obj: display.asm \ + makefile \ + common.stc + +typamat.obj: typamat.asm \ + makefile \ + $(inc)\struc.inc \ + modequat.inc + +invoke.obj: invoke.asm \ + makefile \ + $(inc)\struc.inc \ + modequat.inc \ + common.stc + +modepars.obj: modepars.asm \ + makefile \ + $(inc)\struc.inc \ + $(inc)\psdata.inc \ + modequat.inc \ + common.stc + + +parshell.obj: parshell.asm \ + makefile \ + $(inc)\parse.asm + + +modecp.obj: modecp.asm \ + makefile \ + modecpro.inc \ + modecpeq.inc \ + modecpms.inc \ + $(inc)\struc.inc + +mode.com: main.obj \ + makefile \ + scrntab.obj \ + modescrn.obj \ + rescode.obj \ + modecom.obj \ + modeprin.obj \ + modevid.obj \ + modeleng.obj \ + modeecho.obj \ + modecp.obj \ + display.obj \ + typamat.obj \ + invoke.obj \ + parshell.obj \ + modepars.obj \ + modemes.obj \ + mode.lnk + link @mode.lnk + exe2bin mode.exe mode.com + del mode.exe diff --git a/v4.0/src/CMD/MODE/MODE.LNK b/v4.0/src/CMD/MODE/MODE.LNK new file mode 100644 index 0000000..5f49459 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODE.LNK @@ -0,0 +1,17 @@ +/MAP RESCODE+ +MODEECHO+ +MODELENG+ +MODEMES+ +MODESCRN+ +MAIN+ +MODEVID+ +MODEPRIN+ +MODECOM+ +SCRNTAB+ +MODECP+ +DISPLAY+ +TYPAMAT+ +INVOKE+ +PARSHELL+ +MODEPARS,MODE; + \ No newline at end of file diff --git a/v4.0/src/CMD/MODE/MODE.SKL b/v4.0/src/CMD/MODE/MODE.SKL new file mode 100644 index 0000000..b93dfc5 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODE.SKL @@ -0,0 +1,193 @@ +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» +;º º + +; AN001 - P3976: Need to have all pieces of messages in MODE.SKL so have to +; implement the SYSGETMSG method of getting addressability to +; the pieces. This means that the code does a SYSGETMSG call +; which returns a pointer (DS:SI) to the message piece. The +; address is then put in the sublist block for the message +; being issued. + +;º º +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ + + +:util MODE ;AN000; + ;AN000; +:class 1 ;AN000; + ;AN000; +;:use extend3 ;AN000; +;:use extend15 ;AN000; + ;AN000; +:class 2 ;AN000; + ;AN000; +;:use parse1 ;AN000; +;:use parse3 ;Invalid switch +;:use parse7 ;AN000; +;:use parse8 ;AN000; + ;AN000; + ;AN000; +:class A ;Transient messages, all MODE's messages are transient ;AN000; + ;AN000; +:use 1 COMMON1 ;"Incorrect DOS Version" ;AN000; +:use 2 extend1 ;AN000; +:def 3 CR,LF,"Must specify COM1, COM2, COM3 or COM4",CR,LF ;AN000; +:def 4 CR,LF,"Resident portion of MODE loaded",CR,LF ;AN000; +:def 5 CR,LF,"Illegal device name",CR,LF ;AN000; +:def 6 CR,LF,"Printer error",CR,LF ;AN000; +:def 7 CR,LF,"LPT%1: set for 80",CR,LF ;AN000; +:def 8 CR,LF,"LPT%1: set for 132",CR,LF ;AN000; +:def 9 CR,LF,"Printer lines per inch set",CR,LF ;AN000; +:def 10 CR,LF,"Invalid baud rate specified",CR,LF ;AN000; +:def 11 CR,LF,"COM%1: %2,%3,%4,%5,%6",CR,LF ;AN000; +; DEVICE - 1, 2, 3 or 4 ;AN000; +; BAUD - 110, 150, 300, 600, 1200, 2400, 4800, 9600 etc. ;AN000; +; PARITY - n, o, e etc ;AN000; +; DATA - 5, 6, 7, or 8 ;AN000; +; STOP - 1, 1.5 or 2 ;AN000; +; P - old retry indication ;AN000; +:def 12 "0123456789" ;AN000; +:def 13 CR,LF,"Do you see the %1? (YES/NO)",CR,LF ;AN000; + ;"rightmost 9?" ;goes at the end of "Do you see the" ;AN000; + ;"leftmost 0?" ;goes at the end of "Do you see the" ;AN000; +; Fourteen used to be "Invalid parameters", now use message 54 for those cases. +:def 15 "LPT%1: rerouted to COM%2:",CR,LF ;AN000; +:def 16 "LPT%1: not rerouted",CR,LF ;AN000; +:def 17 CR,LF,"%1 retry on parallel printer time-out",CR,LF ;AN000; +; ONE OF THE FOLLOWING TWO WORDS IS INSERTED: ;AN000; + ;"No" ;goes before "retry on parallel printer time-out" ;AN000; + ;"Infinite" ;goes before "retry on parallel printer time-out" ;AN000; +:def 18 CR,LF," Unable to shift screen %1",CR,LF ;AN000; + ;"left" ;goes at the end of "Unable to shift screen" ;AN000; + ;"right" ;goes at the end of "Unable to shift screen" ;AN000; +; ;The offending_parameter is determined by parsing logic ;AN000; +:use 19 PARSE10 ;"Invalid parameter - %1",CR,LF ;AN000; +:def 20 CR,LF,"Invalid number of parameters",CR,LF ;AN000; +:def 21 CR,LF,"NET 042: Unable to do requested command",CR,LF ;AN000; +:def 22 CR,LF,"Infinite retry not supported on Network printer",cr,lf ;AN000; +:def 23 CR,LF,"Failure to access code page Font File",CR,LF ;AN000; + ;%1 FILLED IN WITH PTR TO DEVICE NAME ;AN000; +:def 24 CR,LF,"Failure to access device: %1",CR,LF ;AN000; +:def 25 CR,LF,"Device or code page missing from font file",CR,LF ;AN000; +:def 26 CR,LF,"Font file contents invalid",CR,LF ;AN000; +:def 27 CR,LF,"Previously prepared code page replaced",CR,LF ;AN000; +:def 28 CR,LF,"Active code page for device %1 is %2",CR,LF ;AN000; + ;%1 FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME ;AN000; + ;%2 FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID ;AN000; +:def 29 CR,LF,"Device %1 not prepared",CR,LF ;AN000; + ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME ;AN000; + ;"hardware" ;used before "codepages:" ;AN000; + ;"prepared" ;AN000; + ;AN000; +:class B ;nothing special, just too many messages for one class ;AN000; + ;AN000; +:def 30 "%1 code pages:",CR,LF ;AN000; +:def 31 " code page %1",CR,LF ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID ;AN000; +:def 32 CR,LF,"MODE %1 code page function completed",CR,LF ;AN000; + ;FILLED IN with one of: ;AN000; + ; "Status" ;AN000; + ; "Prepare" ;AN000; + ; "Select" ;AN000; + ; "Refresh" ;AN000; + ;AN000; +:def 33 CR,LF,"Current code page settings:",CR,LF ;table header ;AN000; + ;AN000; +:def 34 " %1 - %2 code page",CR,LF ;AN000; + ;%1 FILLED IN WITH CODEPAGE ID ;AN000; + ;%2 FILLED IN TO POINT TO "Selected" or "System". ;AN000; + ;AN000; +:def 35 " Code page not prepared",CR,LF ;AN000; +:def 36 "Code page operation not supported on this device",CR,LF ;AN000; + ;AN000; +:def 37 "No code page has been SELECTED",CR,LF ;AN000; + ;AN000; +:def 38 "Device error during %1",CR,LF ;AN000; + ;FILLED IN TO POINT TO: ;AN000; +; "Status" ;AN000; +; "Prepare" ;AN000; +; "Select" ;AN000; +; "Refresh" ;AN000; +; "write of font file to device" ;AN000; + ;AN000; +:def 39 "code page not prepared",CR,LF ;AN000; + ;AN000; +:def 40 CR,LF,"Current keyboard does not support this code page",CR,LF ;AN000; + ;AN000; +:def 41 CR,LF,"Error during read of font file",CR,LF ;AN000; + ;AN000; +:def 42 CR,LF,"Unable to perform REFRESH operation",CR,LF ;AN000; + ;AN000; +:use 43 COMMON38 ;used for formatting common messages for consistent spacing ;AN000; + ;AN000; +:def 44 CR,LF,"Status for device %1:",CR,LF ;header for status reports ;AN000; + ;AN000; +:def 45 "------------------" ;first part of underline under "Status for device %1:" ;AN000; + ;AN000; +:def 46 "----",CR,LF ;four_char_underline ;AN000; + ;AN000; +:def 47 "-----",CR,LF ;five_char_underline ;AN000; + ;AN000; +:def 48 "LINES=%1",CR,LF ;AN000; + ;AN000; +:def 49 "COLUMNS=%1",CR,LF ;AN000; + ;AN000; +:def 50 CR,LF,"RATE and DELAY must be specified together",CR,LF ;AN000; + ;AN000; +:def 51 "RATE=%1",CR,LF ;AN000; + ;AN000; +:def 52 "DELAY=%1",CR,LF ;AN000; + ;AN000; +:def 53 CR,LF,"Function not supported on this computer - %1",CR,LF ;AN000; + ;AN000; +:def 54 CR,LF,"Required font not loaded",CR,LF ;AN000; + ;AN000; +:def 55 CR,LF,"ANSI.SYS must be installed to perform requested function",CR,LF ;AN000; + ;AN000; +:def 56 CR,LF,"Baud rate required",CR,LF ;AN000; + ;AN000; +:def 57 "RETRY=%1",CR,LF ;AN000; + ;AN000; +:use 58 PARSE9 ;"Syntax error - ???????",CR,LF ;AN000; + + +;Following are the definitions of pieces of messages. + + ;AN000; +;SHIFT_MSG - CR,LF,"Do you see the %s? (",YES,"/",NO,")",CR,LF,EOM + +:def 59 "rightmost 9",0 ;AN001;RIGHTMOST DB +:def 60 "leftmost 0",0 ;AN001;LEFTMOST DB + +;RETPARTO - CR,LF,"%s retry on parallel printer time-out",CR,LF,EOM + +:def 61 "No",0 ;AN001;NORETRY DB +:def 62 "Infinite",0 ;AN001;INFINITE DB + +;CANT_SHIFT - CR,LF," Unable to shift screen %s",CR,LF,BEEP,EOM + +:def 63 "left",0 ;AN001;LEFT DB +:def 64 "right",0 ;AN001;RIGHT DB + +;CPMSG8 DB "%S code pages:",CR,LF,EOM + +:def 65 "Hardware",0 ;AN001;CPMSG8_HW DB +:def 66 "Prepared",0 ;AN001;CPMSG8_PR DB + +;CPMSG10 DB "MODE %S code page function completed",CR,LF,EOM +;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM + +:def 67 "status",0 ;AN001;CPMSG17_QUERY CPMSG10_QUERY +:def 68 "prepare",0 ;AN001;CPMSG17_PREP CPMSG10_DES +:def 69 "select",0 ;AN001;CPMSG17_ACT CPMSG10_SELECT +:def 70 "refresh",0 ;AN001;CPMSG17_REFRESH CPMSG10_REFRESH + +;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM + +:def 71 "write of font file to device",0 ;AN001;CPMSG17_WRIT + +;CPMSG13 DB " %D - %S code page",CR,LF,EOM + +:def 72 "selected",0 ;AN001;CPMSG13_ACT +:def 73 "system",0 ;AN001;CPMSG13_SYS + +:end ;AN000; diff --git a/v4.0/src/CMD/MODE/MODECOM.ASM b/v4.0/src/CMD/MODE/MODECOM.ASM new file mode 100644 index 0000000..7ab77f0 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODECOM.ASM @@ -0,0 +1,592 @@ +PAGE ,132 ; ;AN000; +TITLE MODECOM.ASM - RS232 SUPPORT FOR THE MODE COMMAND ;AN000; + ;AN000; +.XLIST ;AN000; +INCLUDE STRUC.INC ;AN000; +.LIST ;AN000; + +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +; AC000 - P2852: Loading resident code trashed CX which was used as a shift +; count. + +; AC001 - P3540: PS/2 only parms other than baud not being treated properly. + +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +DISPLAY MACRO MESSAGE ;AN000; + MOV DX,OFFSET MESSAGE ;AN000; + CALL PRINTF ;AN000; +ENDM ;AN000; + ;AN000; +;------------------------------------------------------------------------ ;AN000; + ;AN000; +ABORT MACRO ;AN000; + JMP ENDIF01 ;AN000; +ENDM ;AN000; + ;AN000; + ;AN000; +;------------------------------------------------------------------------ ;AN000; + ;AN000; +INCLUDE common.stc ;contains the following structure ;AN000; + ;AN000; + ;AN000; +;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000; +; ;AN000; +;parm_type DB bogus ;AN000; +;item_tag DB 0FFH ;AN000; +;value1 DW bogus ;used only for filespecs and code page numbers ;AN000; +;value2 DW bogus ;used only for filespecs and code page numbers ;AN000; +;keyword_switch_ptr DW 0 ;AN000; +; ;AN000; +;parm_list_entry ENDS ;AN000; + ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; + +INCLUDE modequat.inc ;AN000;include definition of false, machine types + + ;AN000; +AT_family EQU 0FCH ;model byte for 286 boxes ;AN000; +DEV1 EQU "1" ;CHAR IN "COM1:" ;AN000; +DEV2 EQU "2" ;CHAR IN "COM2:" ;AN000; +DEV3 EQU "3" ;CHAR IN "COM3:" ;AN000; +DEV4 EQU "4" ;CHAR IN "COM4:" ;AN000; +OFFTO EQU modeto ;OFFSET OF MODETO IN RESIDENT CODE FROM SEGMENT ;AN000; + ; STORED AT 530H BY MODELOAD ;AN000; +not_specified EQU 0 ;AN000; +parm_list EQU [BP] ;AN000; +;Roughrider EQU 05 ;sub model byte ;AN000; +SPACE EQU " " ;BLANK CHARACTER ;AN000; +;Trailboss EQU 04 ;sub model byte for 'Trailboss' ;AN000; +true EQU 0FFH ;AN000; +;Wrangler EQU 0F8H ;primary model byte ;AN000; + ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + + ; BEGINNING OF PROC MODETO) ;AN000; +ROM SEGMENT AT 0 ;AN000; + ORG 50H ;AN000; +VECT14H LABEL DWORD ;RS232 CALL, POINTS TO PROC MODETO WHEN ;AN000; + ; WHEN CODE IS RESIDENT ;AN000; + ORG 400H ;AN000; +SERIAL_BASE LABEL WORD ;SERIAL PORT ADDRESSES ;AN000; + ORG 530H ;AN000; +RESSEG LABEL DWORD ;VECTOR OF MODETO, WHEN RESIDENT ;AN000; +ROM ENDS ;AN000; +PAGE ;AN000; +PRINTF_CODE SEGMENT PUBLIC ;AN000; + ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +EXTRN B_item_tag:ABS ;see modepars ;AN000; +EXTRN baud_19200:BYTE ;AN000; +EXTRN busy_retry_active:ABS ;see invoke.asm ;AN000; +EXTRN E_item_tag:ABS ;see modepars ;AN000; +EXTRN eight_item_tag:ABS ;see modepars ;AN000; +EXTRN ERR1:WORD ;AN000; +EXTRN even_item_tag:ABS ;see modepars ;AN000; +EXTRN error_retry_active:ABS ;see invoke.asm ;AN000; +EXTRN five_item_tag:ABS ;see modepars ;AN000; +EXTRN fourtyeighthundred_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN fourtyeighthundred_str:BYTE ;AN000; +EXTRN illegal_device_ptr:WORD ;see modesubs.inc ;AN000; +EXTRN INITMSG:BYTE,DEVICE:BYTE,PPARITY:BYTE,PDATA:BYTE,PSTOP:BYTE,PPARM:BYTE ;AN000; +EXTRN keyword:ABS ;AN000; +EXTRN machine_type:BYTE ;see 'rescode' ;AN000; +EXTRN mark_item_tag:ABS ;see modepars ;AN000; +EXTRN MODELOAD:NEAR ;AN000; +EXTRN MODETO:WORD ;AN000; +EXTRN new_com_initialize:BYTE ;flag indicating that a PS/2 only parm was specified ;AC001; +EXTRN nineteentwohundred_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN nineteentwohundred_str:BYTE ;see modepars.asm ;AN000; +EXTRN ninetysixhundred_item_tag:ABS ;AC001; +EXTRN ninetysixhundred_str:BYTE ;AN000; +EXTRN no_retry_active:ABS ;see invoke.asm ;AN000; +EXTRN noerror:byte ;boolean indicating success of previous actions ;AN000; +EXTRN none_item_tag:ABS ;see modepars ;AN000; +EXTRN onefifty_str:BYTE ;AN000; +EXTRN oneten_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN oneten_str:BYTE ;AN000; +EXTRN onefifty_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN one_point_five_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN one_point_five_str:BYTE ;see modesubs.inc ;AN000; +EXTRN p_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>) ;AN000; +EXTRN parms_form:BYTE ;AN000; +EXTRN pstop_ptr:WORD ;see modedefs.inc ;AN000; +EXTRN odd_item_tag:ABS ;see modepars ;AN000; +EXTRN one_item_tag:ABS ;see modepars ;AN000; +EXTRN PBAUD_ptr:WORD ;see 'modemes' ;AN000; +EXTRN PRINTF:NEAR ;AN000; +EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE ;AN000; +;PARM1 DB 10 DUP(0) ;AN000; +;PARM2 DB 0 ;AN000; +;PARM3 DB 0 ;AN000; +;MODE DB 0 ;AN000; +;FLAG DB 0 ;AN000; +EXTRN R_item_tag:ABS ;AN000; +EXTRN RATEMSG:WORD ;CR,LF,"Invalid baud rate specified",BEEP,CR,LF,"$" ;AN000; +EXTRN ready_retry_active:ABS ;see invoke.asm ;AN000; +;EXTRN RES_MODEFLAG:ABS ;RETRY FLAG IN RESIDENT CODE, (OFFSET FROM ;AN000; +EXTRN res_com_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is resident, see rescode +EXTRN seven_item_tag:ABS ;see modepars ;AN000; +EXTRN sixhundred_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN sixhundred_str:BYTE ;AN000; +EXTRN six_item_tag:ABS ;see modepars ;AN000; +EXTRN space_item_tag:ABS ;see modepars ;AN000; +EXTRN submodel_byte:BYTE ;see 'rescode' ;AN000; +EXTRN threehundred_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN threehundred_str:BYTE ;AN000; +EXTRN twelvehundred_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN twelvehundred_str:BYTE ;AN000; +EXTRN twentyfourhundred_str:BYTE ;AN000; +EXTRN twentyfourhundred_item_tag:ABS ;see modepars.asm ;AN000; +EXTRN two_item_tag:ABS ;see modepars ;AN000; + ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; +PUBLIC baud_index ;holder of the index in the parm list of the baud rate requested ;AN000; +PUBLIC data_bits_index ;set by invoke ;AN000; +PUBLIC MODECOM ;AN000; +PUBLIC parity_index ;set by invoke ;AN000; +PUBLIC SERIAL_BASE ;Make available to RESCODE and MAIN ;AN000; +PUBLIC retry_index ;make available to analyze_and_invoke ;AN000; +PUBLIC setcom ;get it listed in the link map ;AN000; +PUBLIC setto ;get it listed in link map for debugging ;AN000; +PUBLIC stop_bits_index ;set by invoke ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; + ;AN000; +;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; +;º º ;AN000; + ;AN000; + ;AN000; +;THESE FOLLOWING BAUD RATES REPRESENT THE 1ST 2 CHAR ;AN000; +baud_index DW TYPE parm_list_entry ;holder of the index into the parm list of the baud rate ;AN000; +data_bits_index DW 0 ;holder of the index into the parm list of the data bits ;AN000; +parity_index DW 0 ;holder of the index into the parm list of the parity ;AN000; +stop_bits_index DW 0 ;holder of the index into the parm list of the stop bits ;AN000; +retry_index DW 0 ;AN000; + ;AN000; +;INITMSG DB CR,LF ;AN000; +; DB "COM" ;AN000; +;DEVICE DB " " ;AN000; +; DB ": " ;SEPARATOR BLANK ;AN000; +;PBAUD DB 4 DUP(" ") ;AN000; +; DB "," ;SEPARATOR ;AN000; +;PPARITY DB "e" ;DEFAULT IS EVEN PARITY ;AN000; +; DB "," ;SEPARATOR ;AN000; +;PDATA DB "7" ;DEFAULT IS 7 DATA BITS PER BYTE ;AN000; +; DB "," ;SEPARATOR ;AN000; +;PSTOP DB "1" ;DEFAULT FOR BAUD > 110, CHANGED TO 2 FOR 110 ;AN000; +; DB "," ;SEPARATOR ;AN000; +;PPARM DB " " ;AN000; +; DB CR,LF,"$" ;END OF 'INITMSG' ;AN000; + ;AN000; + ;AN000; +;º º ;AN000; +;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; + ;AN000; + ;AN000; +SUBTTL SET UP FOR SERIAL RETRY ;AN000; +PAGE ;AN000; +; +; +;------------------------------------------------------------------------------- +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +;³ ³ +;³ SETTO ³ +;³ ----- ³ +;³ ³ +;³ Set the resident retry flag to type of retry active for comx. ³ +;³ ³ +;³ INPUT: device - holds '1', '2', '3' or '4' (ascii) for x of lptx. ³ +;³ retry_index - holds index value for the parsed retry parameter. ³ +;³ resseg - holds offset of resident code in memory ³ +;³ res_com_retry_type - holds offset of com retry flag in resident ³ +;³ code. ³ +;³ ³ +;³ ³ +;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³ +;³ flag in resident code set ³ +;³ ³ +;³ ³ +;³ MESSAGES: none. ³ +;³ ³ +;³ ³ +;³ REGISTER ³ +;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³ +;³ format) ³ +;³ CL - shift bit count ³ +;³ ES - holds segment of resident code ³ +;³ BP - offset of parameter list ³ +;³ DI - offset of retry index within parameter list ³ +;³ DL - current resident flag setting ³ +;³ ³ +;³ ³ +;³ PSUEDO CODE: ³ +;³ ³ +;³ SAVE REGISTERS ³ +;³ SET UP SEGMENT REGISTER AND BIT MASKS ³ +;³ IF ³ +;³ SET UP PARAMETER LIST STRUCTURE ³ +;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³ +;³ IF ³ +;³ LOAD RESIDENT CODE ³ +;³ ENDIF ³ +;³ GET CURRENT com_lpt_retry_type ³ +;³ SET AND STORE NEW com_lpt_retry_type ³ +;³ ELSEIF ³ +;³ GET CURRENT com_lpt_retry_type ³ +;³ IF ³ +;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³ +;³ ELSE ³ +;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³ +;³ ENDIF ³ +;³ ELSE ³ +;³ SET pparm TO '-' ³ +;³ ENDIF ³ +;³ RESTORE REGISTERS ³ +;³ RETURN ³ +;³ ³ +;³ ³ +;³ ³ +;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³ +;³ ³ +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ +; +SETTO PROC NEAR ;AN663; + ;AN663; + PUSH ES ;save registers ;AN663; + PUSH DI ;AN663; + PUSH AX ;AN663; + PUSH DX ;AN663; + ;AN663; + XOR AX,AX ;clear a reg ;AN663; + MOV ES,AX ;set to segment at 0 ;AN663; + MOV CL,device ;AN663; + AND CL,07H ;AN663; + DEC CL ;AN663; + SHL CL,1 ;AN663; + MOV DH,11111100B ;set bit mask to clear old flag setting ;AN663; + ROL DH,CL ;AN663; + ;AN663; + .IF THEN ;retry specified, set ;AN663; + ; byte in resident code ;AN663; + MOV DI,retry_index ; to proper setting. ;AN663; + ; if code is not loaded, ;AN663; + .SELECT ; loaded it. ;AN663; + .WHEN ;AN663; + MOV AL,busy_retry_active ;AN663; + MOV pparm,'p' ;AN663; + .WHEN ;AN663; + MOV AL,error_retry_active ;AN663; + MOV pparm,'e' ;AN663; + .WHEN ;AN663; + MOV AL,busy_retry_active ;AN663; + MOV pparm,'b' ;AN663; + .WHEN ;AN663; + MOV AL,ready_retry_active ;AN663; + MOV pparm,'r' ;AN663; + .ENDSELECT ;AN663; + ;AN663; + .IF < EQ 0000H> THEN ;AN663; + PUSH CX ;save shift count + CALL modeload ;load the resident code ;AN663; + POP CX ;restore shift count + .ENDIF ;AN663; + ;AN663; + MOV ES,ES:WORD PTR resseg[2] ;AN663; + MOV DL,BYTE PTR ES:res_com_retry_type ;AN663; + ;get the old setting ;AN663; + ROL AL,CL ;AN663; + AND DL,DH ;AN663; + OR DL,AL ;AN663; + MOV BYTE PTR ES:res_com_retry_type,DL ;store the new setting ;AN663; + ;AN663; + .ELSEIF < NE 0000H> THEN ;if code is loaded but no ;AN663; + ; retry is specified then ;AN663; + MOV ES,ES:WORD PTR resseg[2] ;AN663; + MOV DL,BYTE PTR ES:res_com_retry_type ;AN663; + ;AN663; + .IF ;if 'NONE' was specified ;AN663; + ; with positional parameter ;AN663; + AND DL,DH ; set bits to zero ;AN663; + MOV BYTE PTR ES:res_com_retry_type,DL ;AN663; + ;AN663; + .ELSE ;else update pparm with ;AN663; + ; current retry type ;AN663; + NOT DH ;AN663; + AND DL,DH ;AN663; + SHR DL,CL ;AN663; + ;AN663; + .SELECT ;set pparm to proper letter ;AN663; + .WHEN
;AN663; + MOV pparm,'-' ;AN663; + .WHEN
;AN663; + MOV pparm,'e' ;AN663; + .WHEN
;AN663; + MOV pparm,'b' ;AN663; + .WHEN
;AN663; + MOV pparm,'r' ;AN663; + .ENDSELECT ;AN663; + ;AN663; + .ENDIF ;AN663; + ;AN663; + .ELSE ;no retry, no code resident ;AN663; + ;AN663; + MOV pparm,'-' ;AN663; + ;AN663; + .ENDIF ;AN663; + ;AN663; + POP DX ;AN663; + POP AX ;restore registers ;AN663; + POP DI ;AN663; + POP ES ;AN663; + RET ;AN663; + ;AN663; +SETTO ENDP ;AN663; + + + +SUBTTL SET SERIAL PROTOCOL +PAGE + +;------------------------------------------------------------------------------ + +;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ +;³ ³ +;³ SETCOM ³ +;³ ------ ³ +;³ ³ +;³ ³ +;³ ³ +;³ INPUT: ³ +;³ ³ +;³ ³ +;³ ³ +;³ ³ +;³ ³ +;³ ³ +;³ RETURN: ³ +;³ ³ +;³ ³ +;³ ³ +;³ MESSAGES: none. ³ +;³ ³ +;³ ³ +;³ REGISTER ³ +;³ USAGE: ³ +;³ ³ +;³ ³ +;³ ASSUMPTIONS: All parms have been checked for validity as being possible and³ +;³ supported on the machine. ³ +;³ ³ +;³ ³ +;³ ³ +;³ SIDE EFFECT: ³ +;³ ³ +;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ + +SETCOM PROC NEAR ;AN000; + ;AN000; + ;AN000; +MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000; +MOV DI,baud_index ;DI=index into parm list of the baud rate entry ;AN000; + +.SELECT ;prepare AL for old init and CL for new init ;AC001; + + .WHEN ;AC001; + MOV AL,0 ;AN000; + MOV CL,0 + MOV pbaud_ptr,OFFSET oneten_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,00100000B ;AN000; + MOV CL,1 + MOV pbaud_ptr,OFFSET onefifty_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,01000000B ;AN000; + MOV CL,2 + MOV pbaud_ptr,OFFSET threehundred_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,01100000B ;AN000; + MOV CL,3 + MOV pbaud_ptr,OFFSET sixhundred_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,10000000B ;AN000; + MOV CL,4 + MOV pbaud_ptr,OFFSET twelvehundred_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,10100000B ;AN000; + MOV CL,5 + MOV pbaud_ptr,OFFSET twentyfourhundred_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,11000000B ;AN000; + MOV CL,6 + MOV pbaud_ptr,OFFSET fourtyeighthundred_str ;AN000; + .WHEN THEN ;AN000; + MOV AL,11100000B ;AN000; + MOV CL,7 + MOV pbaud_ptr,OFFSET ninetysixhundred_str ;AN000; + .WHEN NEAR THEN ;handle 19200 case if 19, 19200, 19.2 or 19.2K specified + MOV CL,8 ;value for 19200 baud, no old equivalent ;AC001; + MOV pbaud_ptr,OFFSET nineteentwohundred_str ;AC001; + +.ENDSELECT ;AC001; +; AL IS: XXX00000 for the baud rate, CL has appropriate value for baud + +MOV DI,parity_index ;AN000; +.IF THEN ;AN000; + MOV PPARITY,"n" ;set up message for no PARITY ;AN000; + MOV BH,0 ;AL already set properly for old init ;AN000; +.ELSEIF THEN ;AN000; + MOV PPARITY,"o" ;set up message for odd PARITY ;AN000; + OR AL,08H ;PUT THE 000XX000 BITS TO AL PARM WHERE XX=01 FOR PARITY=ODD ;AN000 + MOV BH,1 ;new initialize ;AN000; +.ELSEIF THEN ;AN000; + MOV PPARITY,"s" ;set up message for space PARITY ;AN000; + MOV BH,4 ;SPACE not supported in old init ;AN000; +.ELSEIF THEN ;AN000; + MOV PPARITY,"m" ;set up message for mark PARITY ;AN000; + MOV BH,3 ;MARK parity not supported in old init ;AN000; +.ELSE ;not specified or asked for even ;AN000; + MOV PPARITY,"e" ;set up message for even PARITY, the default if not specified ;AN000; + OR AL,18H ;PUT THE 000XX000 BITS TO AL PARM WHERE XX=11 FOR PARITY=EVEN ;AN000 + MOV BH,2 ;even parity for new initialize ;AN000; +.ENDIF ;AN000; + +MOV DI,data_bits_index ;AN000; +.IF THEN ;AN000; + MOV pdata,"5" ;set up message for 5 bits ;AN000; + MOV CH,0 ;not old init for 5 data bits ;AN000; +.ELSEIF THEN ;AN000; + MOV pdata,"6" ;set up message for 6 bits ;AN000; + MOV CH,1 ;no old init for 6 data bits ;AN000; +.ELSEIF THEN ;AN000; + MOV pdata,"8" ;set up message for 8 bits ;AN000; + OR AL,03H ;IN THE 000000XX POSITION, SET XX=11 TO MEAN 8 DATA BITS ;AN000; + MOV CH,3 ;AN000; +.ELSE ;asked for 7 or skipped the parm and will get 7 as default ;AN000; + OR AL,02H ;IN THE 000000XX POSITION, SET XX=10 TO MEAN 7 DATA BITS ;AN000; + MOV CH,2 ;message already set up for 7 bits ;AN000; +.ENDIF ;AN000; + +;PUT THE NO. STOP BITS TO AL PARM IN THE 00000X00 POSITION and BL for new init ;AN000 +MOV DI,stop_bits_index ;AN000; +MOV BL,0 ;assume stop bits was 1, message already set up ;AN000; +.SELECT + ;AN000; + .WHEN ;AN000; + MOV pstop,"2" ;set up message for 2 stop bits ;AN000; + MOV BL,1 ;value for two or 1.5 ;AN000; + + .WHEN ;AN000; ;AN000; + MOV pstop_ptr,OFFSET one_point_five_str ;set up message for 1.5 stop bits ;AN000; + MOV BL,1 ;new init for 1.5 ;AN000; + + .WHEN ;if stop bits not specified ;AN000; + MOV DI,baud_index ;AC000; + .IF ;BAUD=110 SPECIFIED THEN SET DEFAULT STOP BITS TO TWO ;AC000; + OR AL,04H ;TURN ON BIT IN 00000X00 POSITION TO REQUEST 2 STOP BITS ;AN000; + MOV pstop,"2" ;set up message for 2 stop bits ;AN000; + .ENDIF ;FOR STOPBITS=1, LEAVE THAT BIT OFF, message already set by modecom ;AN000; + +; .OTHERWISE specified 1, everything set up + +.ENDSELECT ;IF not 1.5 or two, already set up for 1 ;AN000; + ;AN000; +.IF THEN ;AC001; + XOR AL,AL ;ask for no break ;AN000; + MOV AH,4 ;new set baud BIOS call ;AN001; +.ELSE ;old style com initialization ;AN000; ;AC001; + XOR AH,AH ;AH=0 requests initialization ;AC001; +.ENDIF ;AC001; + + ;AN000; +;SET DX PARM TO REQUEST WHICH COM DEVICE ;AN000; + XOR DX,DX ;AN000; + MOV DL,DEVICE ;device set by modepars in first_parm_case: ;AN000; + AND DL,07 ;convert to binary 1 thru 4 ;AN000; + DEC DL ;put in BIOS digestable 0 thru 3 ;AN000; +; AH ALREADY IS 0 or 4, WHICH REQUESTS ;AN000; +; INITIALIZATION OF THE RS232 ;AN000; +; ACCORDING TO PARMS IN AL and/or BX and CX. ;AN000; + .IF THEN ;AN000; + INT 14H ;INIT THE RS232 ;AN000; +; ;AN000; +; NOW THAT THE RS232 IS INITIALIZED, ;AN000; + CALL SETTO ;LOOK AT P PARM, MAYBE TIMEOUT TO BE RETRIED ;AN000; +; ;AN000; + DISPLAY INITMSG ;TELL USER RS232 IS INITIALIZED ;AN000; + .ENDIF ;AN000; + + RET ;AN000; +SETCOM ENDP ;AN000; + ;AN000; + ;AN000; +SUBTTL ;AN000; +PAGE ;AN000; + ;AN000; + ;AN000; + +MODECOM PROC NEAR + + + MOV AL,DEVICE ;AL= DEVICE ID OF "1", "2", "3" or "4" + AND AL,07 ;TRANSLATE TO BINARY + DEC AL ;PUT IN ZERO BASE + SAL AL,1 ;POSITION OF PORT ADDRESS WORD (2*AL) + XOR AH,AH ;CLEAR AH + MOV SI,AX + XOR AL,AL ;CLEAR AX + PUSH DS + MOV DS,AX + CMP WORD PTR DS:SERIAL_BASE[SI],0 ;SEE IF THE COM PORT EXISTS + POP DS + JNE THEN01A + MOV DI,0 ;the device name is always the first parm ;AN000; + MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000; + MOV CX,parm_list[DI].value1 ;AN000; + MOV illegal_device_ptr,CX + DISPLAY err1 ;AN000;"Illegal device name - COMX" + MOV noerror,false ;AN000; + ABORT +; +THEN01A: + +; DEFINE DEFAULTS: + MOV PSTOP,"1" ;ONE STOP BIT, OK FOR BAUD>110 + MOV PDATA,"7" ;7 DATA BITS + MOV PPARM,"-" ;NO SERIAL TIMEOUT RETRY +; + +;WE HAVE THE INFORMATION NEEDED TO INITIALIZE THE RS232 DEVICE +; + CALL SETCOM ;SET THE RS232 DEVICE +; +; : ELSE ,SINCE COUNT WAS NOT BIG ENUF +ENDIF01: ;jump to here if the port does not exist + RET ;RETURN TO MODE MAIN ROUTINE +MODECOM ENDP +PRINTF_CODE ENDS + END 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 @@ +.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