diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/MODE | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/CMD/MODE')
26 files changed, 15099 insertions, 0 deletions
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 @@ | |||
| 1 | ;common structures | ||
| 2 | |||
| 3 | bogus EQU 88H ;totally invalid value | ||
| 4 | |||
| 5 | codepage_parms STRUC | ||
| 6 | cp_device DW ? | ||
| 7 | des_pack_ptr DW ? | ||
| 8 | font_filespec DW ? | ||
| 9 | request_typ DW ? | ||
| 10 | codepage_parms ENDS | ||
| 11 | |||
| 12 | |||
| 13 | parm_list_entry STRUC ;used by parse_parameters and invoke | ||
| 14 | |||
| 15 | parm_type DB bogus | ||
| 16 | item_tag DB 0FFH | ||
| 17 | value1 DW bogus ;used only for filespecs and code page numbers | ||
| 18 | value2 DW bogus ;used only for filespecs and code page numbers | ||
| 19 | keyword_switch_ptr DW 0 | ||
| 20 | |||
| 21 | parm_list_entry ENDS | ||
| 22 | |||
| 23 | |||
| 24 | sublist_def STRUC ;used by initialize_sublists | ||
| 25 | |||
| 26 | db ? ;Sublist Length, fixed | ||
| 27 | db ? ;Reserved, not used yet ;AN000; | ||
| 28 | sublist_off dw ? ;offset | ||
| 29 | sublist_seg dw ? ;segment part of pointer to piece of message | ||
| 30 | db ? ;ID, special end of message format ;AN000; | ||
| 31 | db ? ;flags | ||
| 32 | db ? | ||
| 33 | db ? | ||
| 34 | db ? | ||
| 35 | |||
| 36 | 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 @@ | |||
| 1 | ;m | ||
| 2 | PRINTF_CODE SEGMENT PUBLIC | ||
| 3 | |||
| 4 | ASSUME CS:PRINTF_CODE, DS:PRINTF_CODE, ES:PRINTF_CODE, SS:PRINTF_CODE | ||
| 5 | |||
| 6 | |||
| 7 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 8 | ;º º | ||
| 9 | |||
| 10 | PUBLIC initialize_sublists | ||
| 11 | |||
| 12 | ;º º | ||
| 13 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 14 | |||
| 15 | ;***************************************************************************** | ||
| 16 | ; External Declarations | ||
| 17 | ;***************************************************************************** | ||
| 18 | ; | ||
| 19 | |||
| 20 | EXTRN first_sublist:BYTE | ||
| 21 | EXTRN number_of_sublists:ABS | ||
| 22 | EXTRN SysDispMsg:Near | ||
| 23 | |||
| 24 | |||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | |||
| 29 | ; | ||
| 30 | ;*************************************************************************** | ||
| 31 | ; Message Structures | ||
| 32 | ;*************************************************************************** | ||
| 33 | ; | ||
| 34 | |||
| 35 | |||
| 36 | Message_Table struc ; ;AN000; | ||
| 37 | ; | ||
| 38 | Entry1 dw 0 ; ;AN000; | ||
| 39 | Entry2 dw 0 ; ;AN000; | ||
| 40 | Entry3 dw 0 ; ;AN000; | ||
| 41 | Entry4 dw 0 ; ;AN000; | ||
| 42 | Entry5 db 0 ; ;AN000; | ||
| 43 | Entry6 db 0 ; ;AN000; | ||
| 44 | Entry7 dw 0 ; ;AN000; | ||
| 45 | ; | ||
| 46 | Message_Table ends ; ;AN000; | ||
| 47 | |||
| 48 | include common.stc ;contains the following structure | ||
| 49 | |||
| 50 | ;sublist_def STRUC | ||
| 51 | |||
| 52 | ; db ? ;Sublist Length, fixed | ||
| 53 | ; db ? ;Reserved, not used yet ;AN000; | ||
| 54 | ; dw ? ;offset | ||
| 55 | ;sublist_seg dw ? ;segment part of pointer to piece of message | ||
| 56 | ; db ? ;ID, special end of message format ;AN000; | ||
| 57 | ; db ? ;flags | ||
| 58 | ; db ? | ||
| 59 | ; db ? | ||
| 60 | ; db ? | ||
| 61 | |||
| 62 | ;sublist_def ENDS | ||
| 63 | |||
| 64 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 65 | ;³ | ||
| 66 | ;³ INITIALIZE_SUBLISTS | ||
| 67 | ;³ ------------------- | ||
| 68 | ;³ A .COM file cannot have references to segments in it at EXE2BIN time so | ||
| 69 | ;³ the segment part of pointers to pieces of messages in sublist blocks must | ||
| 70 | ;³ be done at execution time. This routine does that for all sublists. | ||
| 71 | ;³ | ||
| 72 | ;³ | ||
| 73 | ;³ INPUT: | ||
| 74 | ;³ | ||
| 75 | ;³ | ||
| 76 | ;³ | ||
| 77 | ;³ | ||
| 78 | ;³ | ||
| 79 | ;³ | ||
| 80 | ;³ | ||
| 81 | ;³ RETURN: | ||
| 82 | ;³ | ||
| 83 | ;³ | ||
| 84 | ;³ MESSAGES: none | ||
| 85 | ;³ | ||
| 86 | ;³ | ||
| 87 | ;³ | ||
| 88 | ;³ REGISTER | ||
| 89 | ;³ USAGE AND | ||
| 90 | ;³ COMVENTIONS: | ||
| 91 | ;³ | ||
| 92 | ;³ | ||
| 93 | ;³ | ||
| 94 | ;³ ASSUMPTIONS: | ||
| 95 | ;³ | ||
| 96 | ;³ | ||
| 97 | ;³ SIDE EFFECT: | ||
| 98 | ;³ | ||
| 99 | ;³ | ||
| 100 | ;³ ùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùù | ||
| 101 | ;³ | ||
| 102 | ;³ BEGIN | ||
| 103 | ;³ ³ | ||
| 104 | ;³ END ³ | ||
| 105 | ;³ | ||
| 106 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 107 | |||
| 108 | initialize_sublists PROC NEAR ;AN000; | ||
| 109 | |||
| 110 | MOV CX,number_of_sublists ;AN000; | ||
| 111 | MOV SI,OFFSET first_sublist ;address first sublist ;AN000; | ||
| 112 | REPEAT: ;AN000; | ||
| 113 | MOV [SI].sublist_seg,DS ;set up the segment part of the pointer field in the sublist block ;AN000; | ||
| 114 | ADD SI,TYPE sublist_def ;point to next sublist block ;AN000; | ||
| 115 | LOOPNZ repeat ;AN000; | ||
| 116 | ;AN000; | ||
| 117 | RET | ||
| 118 | ;AN000; | ||
| 119 | initialize_sublists ENDP | ||
| 120 | |||
| 121 | ;***************************************************************************** | ||
| 122 | ;PRINTF | ||
| 123 | ;***************************************************************************** | ||
| 124 | ; | ||
| 125 | ;Description: Save all registers, set up registers required for SysDispMsg | ||
| 126 | ; routine. This information is contained in a message description | ||
| 127 | ; table pointed to by the DX register. Call SysDispMsg, then | ||
| 128 | ; restore registers. This routine assumes that the only time an | ||
| 129 | ; error will be returned is if an extended error message was | ||
| 130 | ; requested, so it will ignore error returns | ||
| 131 | ; | ||
| 132 | ;Called Procedures: sysdispmsg | ||
| 133 | ; | ||
| 134 | ;Change History: Created 4/22/87 MT | ||
| 135 | ; | ||
| 136 | ;Input: ES:DX = pointer to message description | ||
| 137 | ; | ||
| 138 | ;Output: None | ||
| 139 | ; | ||
| 140 | ;Psuedocode | ||
| 141 | ;---------- | ||
| 142 | ; | ||
| 143 | ; Save all registers | ||
| 144 | ; Setup registers for SysDispMsg from Message Description Tables | ||
| 145 | ; CALL SysDispMsg | ||
| 146 | ; Restore registers | ||
| 147 | ; ret | ||
| 148 | ;***************************************************************************** | ||
| 149 | |||
| 150 | Public PRINTF | ||
| 151 | PRINTF PROC NEAR ; ;AN000; | ||
| 152 | |||
| 153 | ; push ax | ||
| 154 | ;Save registers ;AN000; | ||
| 155 | push bx ; " " " " ;AN000; | ||
| 156 | push cx ; " " " " ;AN000; | ||
| 157 | push dx ; " " " " ;AN000; | ||
| 158 | push si ; " " " " ;AN000; | ||
| 159 | push di ; " " " " ;AN000; | ||
| 160 | mov di,dx ;Change pointer to table ;AN000; | ||
| 161 | mov ax,[di].Entry1 ;Message number ;AN000; | ||
| 162 | mov bx,[di].Entry2 ;Handle ;AN000; | ||
| 163 | mov si,[di].Entry3 ;Sublist ;AN000; | ||
| 164 | mov cx,[di].Entry4 ;Count ;AN000; | ||
| 165 | mov dh,[di].Entry5 ;Class ;AN000; | ||
| 166 | mov dl,[di].Entry6 ;Function ;AN000; | ||
| 167 | mov di,[di].Entry7 ;Input ;AN000; | ||
| 168 | call SysDispMsg ;Display the message ;AN000; | ||
| 169 | pop di ;Restore registers ;AN000; | ||
| 170 | pop si ; " " " " ;AN000; | ||
| 171 | pop dx ; " " " " ;AN000; | ||
| 172 | pop cx ; " " " " ;AN000; | ||
| 173 | pop bx ; " " " " ;AN000; | ||
| 174 | ; pop ax ; " " " " ;AN000; | ||
| 175 | ret ;All done ;AN000; | ||
| 176 | |||
| 177 | PRINTF ENDP ; ;AN000; | ||
| 178 | |||
| 179 | PRINTF_CODE ENDS | ||
| 180 | |||
| 181 | 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 @@ | |||
| 1 | ;AN000; | ||
| 2 | ;m ;AN000; | ||
| 3 | PAGE ,132 ; ;AN000; | ||
| 4 | TITLE ANALYZE_AND_INVOKE - call appropriate routine based on request ;AN000; | ||
| 5 | .XLIST ;AN000; | ||
| 6 | INCLUDE STRUC.INC ;AN000; | ||
| 7 | .LIST ;AN000; | ||
| 8 | ;.SALL ;AN000; | ||
| 9 | |||
| 10 | |||
| 11 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 12 | ;º º ;AN000; | ||
| 13 | ;AN000; | ||
| 14 | ; AC000 - P2944: Was displaying the lines and column settings for CON even | ||
| 15 | ; though couldn't get them when ANSI.SYS isn't loaded. Now | ||
| 16 | ; check if ANSI loaded before trying to display the settings. | ||
| 17 | |||
| 18 | ; AC002 - P3331: ES was getting zeroed, which caused problems later in MODECP. | ||
| 19 | |||
| 20 | ; AC003 - P3541: The retry status routine was assuming different format than | ||
| 21 | ; the retry type byte was in. I fixed the status checking | ||
| 22 | ; routine. | ||
| 23 | |||
| 24 | ; AX004 - P3982: The screen was being cleared after the "Unable to shift | ||
| 25 | ; screen ..." message. | ||
| 26 | |||
| 27 | ; AC005 - P4934: The multiplex number for ANSI.SYS was changed due to a | ||
| 28 | ; 5/20/88 conflict with a Microsoft product that has already been | ||
| 29 | ; shipped. | ||
| 30 | |||
| 31 | ;º º ;AN000; | ||
| 32 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 33 | ;AN000; | ||
| 34 | ;AN000; | ||
| 35 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 36 | ;º º ;AN000; | ||
| 37 | ;AN000; | ||
| 38 | GET_EXTENDED_ERROR MACRO ;AN000; | ||
| 39 | ;AN000; | ||
| 40 | MOV BX,0 ;level for 3.00 to 4.00 ;AN000; | ||
| 41 | MOV AH,59H ;function number for get extended error ;AN000; | ||
| 42 | INT 21H ;AN000; | ||
| 43 | ;AN000; | ||
| 44 | ENDM ;AN000; | ||
| 45 | ;AN000; | ||
| 46 | ;AN000; | ||
| 47 | BREAK MACRO X ;AN000; | ||
| 48 | JMP endcase_&X ;AN000; | ||
| 49 | ENDM ;AN000; | ||
| 50 | ;AN000; | ||
| 51 | ;AN000; | ||
| 52 | ;AN000; | ||
| 53 | ;AN000; | ||
| 54 | DISPLAY MACRO MESSAGE ;AN000; | ||
| 55 | MOV DX,OFFSET MESSAGE ;AN000; | ||
| 56 | CALL PRINTF ;AN000; | ||
| 57 | ENDM ;AN000; | ||
| 58 | ;AN000; | ||
| 59 | ;AN000; | ||
| 60 | ;º º ;AN000; | ||
| 61 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 62 | ;AN000; | ||
| 63 | ;AN000; | ||
| 64 | ;AN000; | ||
| 65 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 66 | ;º º ;AN000; | ||
| 67 | ;AN000; | ||
| 68 | INCLUDE modequat.inc ;AN000; | ||
| 69 | ;AN000; | ||
| 70 | ANSIINT2F EQU 1AH ;INT 2F multiplex number for ANSI.SYS ;AC005; | ||
| 71 | ASCII_0 EQU "0" ;change one based binary printer number into ASCII printer number ;AN000; | ||
| 72 | ASCII_1 EQU "1" ;AN000; | ||
| 73 | B EQU 2 ;retry setting ;AN000; | ||
| 74 | blink EQU 0000H ;value for flags field of IOCTL data block ;AN000; | ||
| 75 | busy_retry_active EQU 2 ;indicates bust retry is active ;AN000; | ||
| 76 | check_installed EQU 0 ;request installed state for INT2F (ANSI) ;AN000; | ||
| 77 | ;COLUMNS EQU 00000010B ; ;AN000; | ||
| 78 | com1_retry_type_status EQU 0 ;request for retry status on com1 ;AN000; | ||
| 79 | com2_retry_type_status EQU 2 ;request for retry status on com2 ;AN000; | ||
| 80 | com3_retry_type_status EQU 4 ;request for retry status on com3 ;AN000; | ||
| 81 | com4_retry_type_status EQU 6 ;request for retry status on com4 ;AN000; | ||
| 82 | display_device EQU 3 ;type of device, used for calls to IOCTL 0C function ;AN000; | ||
| 83 | E EQU 1 ;retry setting ;AN000; | ||
| 84 | error_retry_active EQU 1 ;indicates error retry is active ;AN000; | ||
| 85 | false EQU 00H ;AN000; | ||
| 86 | font_not_loaded EQU 31 ;return from IOCTL 0C (via ext err) indicating DISPLAY.SYS don't have necessary font loaded | ||
| 87 | get_current_settings EQU 07FH ;request for IOCTL 0C call ;AN000; | ||
| 88 | installed EQU 0FFH ;return from get_installed_state function ;AN000; | ||
| 89 | intense EQU 0001H ;value for flags field of IOCTL data block ;AN000; | ||
| 90 | IOCTL0C EQU [SI] ;AN000; | ||
| 91 | ;LINES EQU 00000001B ;flag for IOCTL0C_functions_requested ;AN000; | ||
| 92 | lowercase EQU 020H ;when ORed with char value it changes it to lowercase ;AN000; | ||
| 93 | LPT1 EQU 1 ;mask for input to display_device_reroute_status, see modeecho ;AN000; | ||
| 94 | LPT2 EQU 2 ;mask for input to display_device_reroute_status, see modeecho ;AN000; | ||
| 95 | LPT3 EQU 4 ;mask for input to display_device_reroute_status, see modeecho ;AN000; | ||
| 96 | lpt1_retry_type_status EQU 0 ;request for retry status on lpt1 ;AN000; | ||
| 97 | lpt2_retry_type_status EQU 1 ;request for retry status on lpt2 ;AN000; | ||
| 98 | lpt3_retry_type_status EQU 2 ;request for retry status on lpt3 ;AN000; | ||
| 99 | MODE_INT2F_MULTIPLEX_NUMBER EQU 0 ;AN000; | ||
| 100 | no_retry EQU 3 ;retry setting ;AN000; | ||
| 101 | no_retry_active EQU 0 ;indicates no retry active on device ;AN000; | ||
| 102 | not_supported_on_machine EQU 29 ;return from IOCTL 0C (via ext err) indicating hardware don't support the function ;AN000; | ||
| 103 | parm_list_BX EQU [BX] ;AN000; | ||
| 104 | prn_ports_attached EQU CL ;used in printer_reroute_case and check_prn_ports_attached | ||
| 105 | R EQU 3 ;retry setting for com ports ;AN000; | ||
| 106 | ready_retry_active EQU 3 ;indicates ready retry is active ;AN000; | ||
| 107 | redirected EQU 2 ;network puts a 2 in printer address word for printers redirected | ||
| 108 | rerouted_printer_mask EQU BL ;holds the mask to check ptsflag1 with, see modeecho.asm | ||
| 109 | returned_retry_type EQU AL ;holds the returned status value ;AN000; | ||
| 110 | set_display_characteristics EQU 05FH ;request for IOCTL 0C call ;AN000; | ||
| 111 | status EQU 0 ;request for modecp ;AN000; | ||
| 112 | StdOut equ 1 ;AN000; | ||
| 113 | text EQU 01 ;mode field of IOCTL 0C call indicating screen mode type (vs APA mode) ;AN000; | ||
| 114 | true EQU 0FFH ;AN000; | ||
| 115 | unspecified EQU 0FFH ;state of item_tags in parm_list if the positonal parm was not specified ;AN664; | ||
| 116 | ;AN000; | ||
| 117 | ;º º ;AN000; | ||
| 118 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 119 | ;AN000; | ||
| 120 | ;AN000; | ||
| 121 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 122 | ;º º ;AN000; | ||
| 123 | ;AN000; | ||
| 124 | ;AN000; | ||
| 125 | des_strt_packet STRUC ;AN000; | ||
| 126 | des_strt_pkfl DW 0000 ;assume a filename specified ;AN000; | ||
| 127 | des_strt_pklen DW 02 ;start with size of 'des_strt_pknum' ;AN000; | ||
| 128 | des_strt_pknum DW 0 ;number of cp numbers in the packet ;AN000; | ||
| 129 | des_strt_pkcp1 DW -1 ;code page number for 1st slot ;AN000; | ||
| 130 | des_strt_pkcp2 DW -1 ;AN000; | ||
| 131 | des_strt_pkcp3 DW -1 ;AN000; | ||
| 132 | des_strt_pkcp4 DW -1 ;AN000; | ||
| 133 | des_strt_pkcp5 DW -1 ;AN000; | ||
| 134 | des_strt_pkcp6 DW -1 ;AN000; | ||
| 135 | des_strt_pkcp7 DW -1 ;AN000; | ||
| 136 | des_strt_pkcp8 DW -1 ;AN000; | ||
| 137 | des_strt_pkcp9 DW -1 ;AN000; | ||
| 138 | des_strt_pkcpA DW -1 ;AN000; | ||
| 139 | des_strt_pkcpB DW -1 ;AN000; | ||
| 140 | des_strt_pkcpC DW -1 ;code page number for 12th slot ;AN000; | ||
| 141 | des_strt_packet ENDS ;AN000; | ||
| 142 | ;AN000; | ||
| 143 | ;The info_level is 0 on input, and contains a return code on exit. If carry set ;AN000; | ||
| 144 | ;and 2 then the requested function is not supported on this machine. If carry ;AN000; | ||
| 145 | ;set and 3 then DISPLAY.SYS does not have the appropriate RAM font loaded to ;AN000; | ||
| 146 | ;support the requested function. ;AN000; | ||
| 147 | ;AN000; | ||
| 148 | IOCTL0C_def STRUC ;AN000; | ||
| 149 | ;AN000; | ||
| 150 | info_level DB 0 ;return code: 0 on input, 1 ?, 2 or 3 as returns ;AN000; | ||
| 151 | DB 0 ;reserved ;AN000; | ||
| 152 | data_length DW 14 ;length of the data block not including this field ;AN000; | ||
| 153 | flags DW 0 ;filled with intense or blink ;AN000; | ||
| 154 | mode DB text ;filled with text, may be returned as 2 which means APA ;AN000; | ||
| 155 | DB 0 ;reserved ;AN000; | ||
| 156 | colors DW 16 ;0 means monochrome ;AN000; | ||
| 157 | DW bogus ;width in pixels for APA modes ;AN000; | ||
| 158 | DW bogus ;length in pixels for APA modes ;AN000; | ||
| 159 | cols DW bogus ;nubmer of text columns ;AN000; | ||
| 160 | rows DW bogus ;number of text rows ;AN000; | ||
| 161 | ;AN000; | ||
| 162 | IOCTL0C_def ENDS ;AN000; | ||
| 163 | ;AN000; | ||
| 164 | INCLUDE COMMON.STC ;includes the following strucs ;AN000; | ||
| 165 | ;AN000; | ||
| 166 | ;codepage_parms STRUC ;AN000; | ||
| 167 | ; cp_device DW ? ;AN000; | ||
| 168 | ; des_pack_ptr DW ? ;AN000; | ||
| 169 | ; font_filespec DW ? ;AN000; | ||
| 170 | ; request_typ DW ? ;AN000; | ||
| 171 | ;codepage_parms ENDS ;AN000; | ||
| 172 | ;AN000; | ||
| 173 | ;AN000; | ||
| 174 | ;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000; | ||
| 175 | ;AN000; | ||
| 176 | ;parm_type DB bogus ;AN000; | ||
| 177 | ;item_tag DB 0FFH ;AN000; | ||
| 178 | ;value1 DW bogus ;used only for filespecs and code page numbers ;AN000; | ||
| 179 | ;value2 DW bogus ;used only for filespecs and code page numbers ;AN000; | ||
| 180 | ;keyword_switch_ptr DW 0 ;AN000; | ||
| 181 | ;AN000; | ||
| 182 | ;parm_list_entry ENDS ;AN000; | ||
| 183 | ;AN000; | ||
| 184 | ;AN000; | ||
| 185 | ;º º ;AN000; | ||
| 186 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 187 | ;AN000; | ||
| 188 | ROM SEGMENT AT 0 ;AN000; | ||
| 189 | ORG 530H ;AN000; | ||
| 190 | resseg LABEL DWORD ;location of resident mode code vector ;AN000; | ||
| 191 | ROM ENDS ;AN000; | ||
| 192 | ;AN000; | ||
| 193 | ;AN000; | ||
| 194 | PAGE ;AN000; | ||
| 195 | PRINTF_CODE SEGMENT PUBLIC ;AN000; | ||
| 196 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000; | ||
| 197 | ;AN000; | ||
| 198 | ;AN000; | ||
| 199 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 200 | ;º º ;AN000; | ||
| 201 | ;AN000; | ||
| 202 | PUBLIC analyze_and_invoke ;make available to "MAIN" ;AN000; | ||
| 203 | PUBLIC busy_retry_active ;used by modecom ;AN000; | ||
| 204 | PUBLIC cp_cb ;modepars needs to set the font file name ;AN000; | ||
| 205 | PUBLIC error_retry_active ;used by modecom ;AN000; | ||
| 206 | PUBLIC initialize_printer_port_case ;AN000; | ||
| 207 | PUBLIC no_retry_active ;used by modecom ;AN000; | ||
| 208 | PUBLIC parm_list_holder ;used by modeprin ;AN664; | ||
| 209 | PUBLIC ready_retry_active ;used by modecom ;AN000; | ||
| 210 | ;AN000; | ||
| 211 | ;º º ;AN000; | ||
| 212 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 213 | ;AN000; | ||
| 214 | ;AN000; | ||
| 215 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 216 | ;º º ;AN000; | ||
| 217 | ;AN000; | ||
| 218 | EXTRN ANSI_not_loaded:BYTE ;see modedefs.inc ;AN000; | ||
| 219 | EXTRN BAUD_equal:BYTE ;the string "BAUD=", see modepars ;AN000; | ||
| 220 | EXTRN BAUD_index:WORD ;see modecom.asm ;AN000; | ||
| 221 | EXTRN B_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 222 | EXTRN BW40:NEAR ;see modedefs.inc ;AN000; | ||
| 223 | EXTRN BW40_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 224 | EXTRN BW80:NEAR ;see modedefs.inc ;AN000; | ||
| 225 | EXTRN BW80_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 226 | EXTRN busy_status:ABS | ||
| 227 | EXTRN close:ABS ;EQU 3EH ;CLOSE A FILE HANDLE,see modecpeq.inc ;AN000; | ||
| 228 | EXTRN columns_ptr:WORD ;see modesubs.inc ;AN000; | ||
| 229 | EXTRN CO40:NEAR ;see modedefs.inc ;AN000; | ||
| 230 | EXTRN CO40_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 231 | EXTRN CO80:NEAR ;see modedefs.inc ;AN000; | ||
| 232 | EXTRN CO80_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 233 | EXTRN codepage_index_holder:WORD ;see MODEPARS.ASM ;AN000; | ||
| 234 | EXTRN codepage_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 235 | EXTRN columns_equal:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 236 | EXTRN columns_equal_msg:BYTE ;see MODEdefS.inc ;AN000; | ||
| 237 | EXTRN columns_holder:BYTE ;holder for printer chars per line (binary) value, see modeprin ;AN000; | ||
| 238 | EXTRN COLS_equal:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 239 | EXTRN columns_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 240 | EXTRN COM1_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 241 | EXTRN COM2_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 242 | EXTRN COM3_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 243 | EXTRN COM4_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 244 | EXTRN COMX:ABS ;one of two possible values for "device_type" | ||
| 245 | EXTRN CON_str:BYTE ;"CON"see MODEPARS.ASM ;AN000; | ||
| 246 | EXTRN CRLF:BYTE ;see MODEDEFS.ASM, used before "Invalid parameter - " for consistent spacing ;AN000; | ||
| 247 | EXTRN data_bits_index:WORD ;see modecom.asm ;AN000; | ||
| 248 | EXTRN DATA_equal:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 249 | EXTRN DELAY_equal:BYTE ;see MODEPars.asm ;AN000; | ||
| 250 | EXTRN DEL_equal:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 251 | EXTRN des_start_packet:WORD ;AX000; des_strt_packet <>, see modepars ;AN000; | ||
| 252 | EXTRN device:BYTE ;holder of com number for invoke and modeecho ;AN000; | ||
| 253 | EXTRN device_name:WORD ;AN000; | ||
| 254 | EXTRN device_type:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 255 | EXTRN dev_name_size:WORD ;see MODEPARS.ASM ;AN000; | ||
| 256 | EXTRN dev_open_mode:ABS ;read write access ;AN000; | ||
| 257 | EXTRN display_printer_reroute_status:NEAR ;see modeecho.asm | ||
| 258 | EXTRN eighty_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 259 | EXTRN eighty_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 260 | EXTRN error_status:ABS ;see MODEPRIN | ||
| 261 | EXTRN five_char_underline:BYTE ;see modedefs.inc ;AN000; | ||
| 262 | EXTRN four_char_underline:BYTE ;see modedefs.inc ;AN000; | ||
| 263 | EXTRN function_not_supported:BYTE ;see modedefs.inc ;AN000; | ||
| 264 | EXTRN err1:BYTE ;see modedefs.inc | ||
| 265 | EXTRN E_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 266 | EXTRN fourty_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 267 | EXTRN fourty_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 268 | EXTRN handle_40_or_80:NEAR ;see modescrn ;AN000; | ||
| 269 | EXTRN illegal_device_ptr:WORD ;see modesubs.inc | ||
| 270 | EXTRN keyword:ABS ;see MODEPARS ;AN000; | ||
| 271 | EXTRN invalid_number_of_parameters:WORD ;AN000; | ||
| 272 | ;EXTRN invalid_parameter:WORD ;<CR><LF>"Invalid parameter '????'",beep ;AN000; | ||
| 273 | EXTRN len_COMX_str:ABS ;see MODEPARS.ASM ;AN000; | ||
| 274 | EXTRN len_CON_str:ABS ;see MODEPARS.ASM ;AN000; | ||
| 275 | EXTRN len_LPTX_str:ABS ;see MODEPARS.ASM ;AN000; | ||
| 276 | EXTRN L_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 277 | EXTRN LINES_equal:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 278 | EXTRN LINES_equal_msg:BYTE ;see MODEDEFS.INC ;AN000; | ||
| 279 | EXTRN lines_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 280 | EXTRN long_underline:BYTE ;see modedefs.inc ;AN000; | ||
| 281 | EXTRN lptno:BYTE ;holder of printer number for invoke and modeecho ;AN000; | ||
| 282 | EXTRN lpt1_retry_type:BYTE ;see RESCODE | ||
| 283 | EXTRN LPT1_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 284 | EXTRN LPT2_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 285 | EXTRN LPT3_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 286 | EXTRN notredpt:BYTE ;printer number in "LPTn not rerouted" | ||
| 287 | EXTRN max_request_type:ABS ;see MODEPARS.ASM ;AN000; | ||
| 288 | EXTRN modecom:NEAR ;AN000; | ||
| 289 | EXTRN modecp:NEAR ;AN000; | ||
| 290 | EXTRN modeecho:NEAR ;AN000; | ||
| 291 | EXTRN modeecno:NEAR ;AN000; | ||
| 292 | EXTRN modeprin:NEAR ;AN000; | ||
| 293 | EXTRN modify_resident_code:NEAR ;see modeprin ;AN000; | ||
| 294 | EXTRN MONO:NEAR ;see modedefs.inc ;AN000; | ||
| 295 | EXTRN MONO_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 296 | EXTRN no_retry_flag:ABS ;see MODEPRIN | ||
| 297 | EXTRN noerror:BYTE ;AN000; | ||
| 298 | EXTRN none_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 299 | EXTRN none_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 300 | EXTRN offending_parameter:BYTE ;see MODEMES ;AN000; | ||
| 301 | EXTRN OFF_item_tag:ABS ;see pares.asm ;AN000; | ||
| 302 | EXTRN off_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 303 | EXTRN onethirtytwo_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 304 | EXTRN ON_item_tag:ABS ;see pares.asm ;AN000; | ||
| 305 | EXTRN on_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 306 | EXTRN open:ABS ;open a device handle, see modecpeq.inc ;AN000; | ||
| 307 | EXTRN parity_equal:BYTE ;see modepars.asm ;AN000; | ||
| 308 | EXTRN parity_index:WORD ;see modecom ;AN000; | ||
| 309 | EXTRN parm2:BYTE ;see MODEPRIN.ASM ;AN000; | ||
| 310 | EXTRN parm3:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 311 | ;EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>), see MODEPARS.ASM ;AN000; | ||
| 312 | EXTRN parms_form:byte ;indicator of whether the parameters were entered as positionals or as keywords ;AN000; | ||
| 313 | EXTRN pbaud_ptr:WORD ;AN000;;pointer to the baud rate string in the initialization message for COM, see modesubs.inc | ||
| 314 | EXTRN pdata:BYTE ;see modesubs.inc ;AN000; | ||
| 315 | EXTRN pparity_ptr:WORD ;see modesubs.inc ;AN000; | ||
| 316 | EXTRN pparm:BYTE ;used by modecom and for message, see modesubs.inc ;AN000; | ||
| 317 | EXTRN prepare:ABS ;AN000; | ||
| 318 | EXTRN prepare_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 319 | EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS | ||
| 320 | EXTRN pstop_ptr:WORD ;see modesubs.inc ;AN000; | ||
| 321 | EXTRN PRINTF:NEAR ;AN000; | ||
| 322 | EXTRN rate_equal:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 323 | EXTRN ready_status:ABS ;see modeprin | ||
| 324 | EXTRN redpt:BYTE ;printer number (n) in message "LPTn rerouted to COMm" | ||
| 325 | EXTRN refresh:ABS ;AN000; | ||
| 326 | EXTRN retry_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 327 | EXTRN request_type:BYTE ;see "MODEPARS.ASM" ;AN000; | ||
| 328 | EXTRN retry_equal:BYTE ;see MODEDEFS.INC ;AN000; | ||
| 329 | EXTRN retry_equal_str:BYTE ;AN000; | ||
| 330 | EXTRN retry_index:WORD ;see MODECOM.ASM ;AN000; | ||
| 331 | EXTRN retry_type_ptr:WORD ;see MODESUBS.INC ;AN000; | ||
| 332 | EXTRN row_ptr:WORD ;see modesubs.inc ;AN000; | ||
| 333 | EXTRN row_type:WORD ;see modesubs.inc ;AN000; | ||
| 334 | EXTRN R_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 335 | EXTRN R_str:BYTE ;see MODEPARS.ASM ;AN000; | ||
| 336 | EXTRN Required_font_not_loaded:BYTE ;see modedefs.asm ;AN000; | ||
| 337 | EXTRN res_com_retry_type:ABS ;see RESCODE.SAL ;AN000; | ||
| 338 | ;EXTRN res_lpt_retry_type:ABS ;see RESCODE.SAL ;AN000; | ||
| 339 | EXTRN select:ABS ;request type for 'modecp' ;AN000; | ||
| 340 | EXTRN select_item_tag:ABS ;see MODEPARS.ASM ;AN000; | ||
| 341 | EXTRN serial_base:WORD ;see modecom ;AN000; | ||
| 342 | EXTRN set_con_features:ABS ;AN000; | ||
| 343 | EXTRN set_retry_type:NEAR ;see modeprin ;AN000; | ||
| 344 | EXTRN shift_screen:NEAR ;see modescrn ;AN000; | ||
| 345 | EXTRN stat_dev_ptr:WORD ;see modedefs.inc ;AN000; | ||
| 346 | EXTRN status_for_device:BYTE ;"Status for device %1:" see modedefs.inc ;AN000; | ||
| 347 | EXTRN status_for_everything:ABS ;AN000; | ||
| 348 | EXTRN stop_bits_index:WORD ;see modecom.asm ;AN000; | ||
| 349 | EXTRN stop_equal:BYTE ;"STOP=", see modepars ;AN000; | ||
| 350 | EXTRN typamat:NEAR ;see "typamat.asm" ;AN000; | ||
| 351 | ;AN000; | ||
| 352 | ;possible values of "request_type" ;AN000; | ||
| 353 | ;AN000; | ||
| 354 | EXTRN all_con_status:ABS ;AN000; | ||
| 355 | EXTRN codepage_prepare:ABS ;AN000; | ||
| 356 | EXTRN codepage_refresh:ABS ;AN000; | ||
| 357 | EXTRN codepage_select:ABS ;AN000; | ||
| 358 | EXTRN codepage_status:ABS ;AN000; | ||
| 359 | EXTRN codepage_prepared_status:ABS ;AN000; | ||
| 360 | EXTRN codepage_selected_status:ABS ;AN000; | ||
| 361 | EXTRN com_status:ABS ;AN000; | ||
| 362 | ;EXTRN con_status:ABS ;AN000; | ||
| 363 | EXTRN initialize_com_port:ABS ;AN000; | ||
| 364 | EXTRN initialize_printer_port:ABS ;AN000; | ||
| 365 | EXTRN old_initialize_printer_port:ABS ;AN000; | ||
| 366 | EXTRN old_video_mode_set:ABS ;AN000; | ||
| 367 | EXTRN printer_reroute:ABS ;AN000; | ||
| 368 | EXTRN printer_status:ABS ;AN000; | ||
| 369 | EXTRN turn_off_reroute:ABS ;AN000; | ||
| 370 | ;AN000; | ||
| 371 | ;AN000; | ||
| 372 | ;º º ;AN000; | ||
| 373 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 374 | ;AN000; | ||
| 375 | ;AN000; | ||
| 376 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 377 | ;º º ;AN000; | ||
| 378 | ;AN000; | ||
| 379 | ANSI_installed DB false ;boolean indicator of whether ANSI.SYS is installed ;AN000; | ||
| 380 | columns_specified DB false ;indicates if columns= was on the command line, see set_con_features_case;AN000; | ||
| 381 | code_page_numbers_encountered DB 0 ;AN000; | ||
| 382 | cp_cb codepage_parms <> ;codepage subroutine parameter block ;AN000; | ||
| 383 | com_ports_attached DB 0 ;number of com ports in the machine | ||
| 384 | current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet' ;AN000; | ||
| 385 | delay_holder DB 1 ;holder for binary form of delay requested ;AN000; | ||
| 386 | device_request DB ? ;holds device request value ;AN000; | ||
| 387 | max_pknum EQU ($ - OFFSET des_start_packet.des_strt_pkcp1)/2 ;most cp numbers can send at once ;AN000; | ||
| 388 | ;IOCTL0C_functions_requested DB 0 ;for displaying messages, flag byte indicating IOCTL functions requested ;AN000; | ||
| 389 | need_typamat_call DB false ;boolean for saving up delay and rate settings ;AN000; | ||
| 390 | need_IOCTL0C DB false ;boolean for saving up parts of an IOCTL 0CH call ;AN000; | ||
| 391 | parm_list_holder DW bogus ;holder for address of parsed parameter list for when BX is needed elsewhere ;AN000; | ||
| 392 | parm_list_index_holder DW bogus ;holder for index of parsed parameter list for when DI is needed elsewhere ;AN000; | ||
| 393 | i DB 0 ;index for status loop ;AN000; | ||
| 394 | rate_holder DB 32 ;holder for binary form of rate value ;AN000; | ||
| 395 | row_value DB ? ;holder for binary form of row value during status display ;AN000; | ||
| 396 | ;AN000; | ||
| 397 | IOCTL0C_data_block IOCTL0C_def<> ;AN000; | ||
| 398 | |||
| 399 | PUBLIC IOCTL0C_data_block | ||
| 400 | ;AN000; | ||
| 401 | ;º º ;AN000; | ||
| 402 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 403 | ;AN000; | ||
| 404 | check_ANSI_installed PROC NEAR ;See if ANSI.SYS is installed ;AC001; | ||
| 405 | |||
| 406 | MOV AH,ANSIINT2F ;AC001; | ||
| 407 | MOV AL,check_installed ;AC001; | ||
| 408 | INT 2FH ;AC001; | ||
| 409 | .IF <AL EQ installed> THEN ;AC001; | ||
| 410 | MOV ANSI_installed,true ;initialized to false, so no ELSE needed ;AC001; | ||
| 411 | .ENDIF | ||
| 412 | |||
| 413 | check_ANSI_installed ENDP ;AC001; | ||
| 414 | |||
| 415 | ;------------------------------------------------------------------------------ | ||
| 416 | |||
| 417 | |||
| 418 | |||
| 419 | setup_device_name PROC NEAR ;AN000; | ||
| 420 | ;AN000; | ||
| 421 | MOV DX,device_name ;DX=pointer to ASCIIZ device name ;AN000; | ||
| 422 | MOV cp_cb.cp_device,DX ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; | ||
| 423 | ;AN000; | ||
| 424 | RET ;AN000; | ||
| 425 | ;AN000; | ||
| 426 | setup_device_name ENDP ;AN000; | ||
| 427 | ;AN000; | ||
| 428 | ;------------------------------------------------------------------------------- ;AN000; | ||
| 429 | ;AN000; | ||
| 430 | ;AN000; | ||
| 431 | do_IOCTL0C PROC NEAR ;AN000; | ||
| 432 | PUBLIC DO_IOCTL0C ;AN000; | ||
| 433 | MOV AH,open ;open device ;AN000; | ||
| 434 | MOV AL,dev_open_mode ;AL=open mode for devices, see modecpeq.inc ;AN000; | ||
| 435 | MOV DX,OFFSET CON_str ;know that CON is being opened, avoid using user input and having to remove colon ;AN000; | ||
| 436 | INT 21H ;AN000; | ||
| 437 | ;AN000; | ||
| 438 | MOV BX,AX ;BX=handle of CON ;AN000; | ||
| 439 | MOV AX,440CH ;AN000; | ||
| 440 | MOV CH,display_device ;type of device ;AN000; | ||
| 441 | MOV DX,OFFSET IOCTL0C_data_block ;AN000; | ||
| 442 | INT 21H ;the IOCTL data block is filled with the current settings ;AN000; | ||
| 443 | PUSHF ;save result of the IOCTL ;AN000; | ||
| 444 | ;AN000; | ||
| 445 | MOV AH,3EH ;assume that BX still has the handle ;AN000; | ||
| 446 | INT 21H ;close CON, open and close each time because if error may not be back to close ;AN000; | ||
| 447 | ;AN000; | ||
| 448 | POPF ;restore result of the IOCTL ;AN000; | ||
| 449 | ;AN000; | ||
| 450 | RET ;AN000; | ||
| 451 | ;AN000; | ||
| 452 | do_IOCTL0C ENDP ;AN000; | ||
| 453 | ;AN000; | ||
| 454 | ;------------------------------------------------------------------------------- ;AN000; | ||
| 455 | ;AN000; | ||
| 456 | display_columns_status PROC NEAR ;AN000; | ||
| 457 | ;AN000; | ||
| 458 | MOV CL,get_current_settings ;AN000; | ||
| 459 | CALL do_IOCTL0C ;get current settings of CON ;AN000; | ||
| 460 | .IF <IOCTL0C_data_block.mode EQ text> THEN ;AN000; | ||
| 461 | .IF <IOCTL0C_data_block.cols EQ 80> THEN ;AN000; | ||
| 462 | MOV columns_ptr,OFFSET eighty_str ;set up message block with pointer to "80" ;AN000; | ||
| 463 | .ELSE ;AN000; | ||
| 464 | MOV columns_ptr,OFFSET fourty_str ;AN000; | ||
| 465 | .ENDIF ;AN000; | ||
| 466 | .ELSE ;AN000; | ||
| 467 | MOV columns_ptr,OFFSET NONE_str ;AN000; | ||
| 468 | .ENDIF ;AN000; | ||
| 469 | display COLUMNS_equal_msg ;AN000; | ||
| 470 | ;AN000; | ||
| 471 | RET ;AN000; | ||
| 472 | ;AN000; | ||
| 473 | display_columns_status ENDP ;AN000; | ||
| 474 | ;AN000; | ||
| 475 | ;------------------------------------------------------------------------------- ;AN000; | ||
| 476 | ;AN000; | ||
| 477 | display_lines_status PROC NEAR ;AN000; | ||
| 478 | ;AN000; | ||
| 479 | MOV CL,get_current_settings ;AN000; | ||
| 480 | CALL do_IOCTL0C ;get current settings of CON ;AN000; | ||
| 481 | .IF <IOCTL0C_data_block.mode EQ text> THEN ;AN000; | ||
| 482 | MOV AX,IOCTL0C_data_block.rows ;AN000; | ||
| 483 | MOV row_value,AL ;row_value=binary row value ;AN000; | ||
| 484 | MOV row_type,right_align+unsgn_bin_byte ;set up sublist so msg ret knows it is a binary byte ;AN000; | ||
| 485 | MOV row_ptr,OFFSET row_value ;set up LINES_equal sublist ;AN000; | ||
| 486 | .ELSE ;AN000; | ||
| 487 | MOV row_ptr,OFFSET NONE_str ;AN000; | ||
| 488 | .ENDIF ;AN000; | ||
| 489 | display LINES_equal_msg ;AN000; | ||
| 490 | ;AN000; | ||
| 491 | RET ;AN000; | ||
| 492 | ;AN000; | ||
| 493 | display_lines_status ENDP ;AN000; | ||
| 494 | |||
| 495 | ;------------------------------------------------------------------------------- | ||
| 496 | |||
| 497 | old_video_mode_set_IOCTL PROC NEAR ;AN004; | ||
| 498 | |||
| 499 | MOV CL,set_display_characteristics ;AN000; | ||
| 500 | CALL do_IOCTL0C ;AN000; | ||
| 501 | .IF C THEN ;AN000; | ||
| 502 | get_extended_error ;AN000; | ||
| 503 | .IF <AX EQ not_supported_on_machine> THEN ;AN000; | ||
| 504 | DISPLAY Function_not_supported ;AN000; | ||
| 505 | .ELSEIF <AX EQ font_not_loaded> THEN ;AN000; | ||
| 506 | DISPLAY Required_font_not_loaded ;AN000; | ||
| 507 | .ENDIF ;AN000; | ||
| 508 | MOV noerror,false ;AN000; | ||
| 509 | .ENDIF ;AN000;carry ;AN000; | ||
| 510 | |||
| 511 | RET | ||
| 512 | ;AN004; | ||
| 513 | old_video_mode_set_IOCTL ENDP ;AN004; | ||
| 514 | |||
| 515 | ;AN000; | ||
| 516 | ;------------------------------------------------------------------------------- ;AN000; | ||
| 517 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 518 | ;³ | ||
| 519 | ;³ CHECK_COM_PORTS_ATTACHED | ||
| 520 | ;³ ------------------------ | ||
| 521 | ;³ | ||
| 522 | ;³ Return the number of com ports in the machine. | ||
| 523 | ;³ | ||
| 524 | ;³ INPUT: none | ||
| 525 | ;³ | ||
| 526 | ;³ | ||
| 527 | ;³ RETURN: com_ports_attached - number of com ports | ||
| 528 | ;³ | ||
| 529 | ;³ | ||
| 530 | ;³ MESSAGES: none | ||
| 531 | ;³ | ||
| 532 | ;³ REGISTER | ||
| 533 | ;³ USAGE: SI - index of the FOR loop and displacement from serial_base | ||
| 534 | ;³ ES - holds segment of ROM data area | ||
| 535 | ;³ | ||
| 536 | ;³ | ||
| 537 | ;³ ASSUMPTIONS: The user has initialized com_ports_attached to zero. | ||
| 538 | ;³ | ||
| 539 | ;³ | ||
| 540 | ;³ SIDE EFFECT: ES is lost | ||
| 541 | ;³ SI is lost | ||
| 542 | ;³ ;AN000; | ||
| 543 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 544 | |||
| 545 | check_com_ports_attached PROC NEAR | ||
| 546 | |||
| 547 | MOV SI,0 | ||
| 548 | MOV ES,SI ;now ES:SERIAL_BASE addresses 40:0=0:400 | ||
| 549 | |||
| 550 | .FOR SI = 0 TO 6 STEP 2 | ||
| 551 | |||
| 552 | .IF <<WORD PTR ES:SERIAL_BASE[SI]> NE 0> THEN ;SEE IF THE COM PORT EXISTS | ||
| 553 | INC com_ports_attached | ||
| 554 | .ENDIF | ||
| 555 | |||
| 556 | .NEXT SI | ||
| 557 | |||
| 558 | RET | ||
| 559 | |||
| 560 | check_com_ports_attached ENDP | ||
| 561 | |||
| 562 | |||
| 563 | ;------------------------------------------------------------------------------- ;AN000; | ||
| 564 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 565 | ;³ | ||
| 566 | ;³ CHECK_PRN_PORTS_ATTACHED | ||
| 567 | ;³ ------------------------ | ||
| 568 | ;³ | ||
| 569 | ;³ Return the number of printer ports in the machine. The network will put a 2 | ||
| 570 | ;³ in th address word if the printer is redirected, so for the printer to | ||
| 571 | ;³ actually exist the address must be greater than 2 ("redirected"). Since | ||
| 572 | ;³ can't have infinite retry on redirected printers only want to count ports | ||
| 573 | ;³ with >2 for addresses. | ||
| 574 | ;³ | ||
| 575 | ;³ INPUT: none | ||
| 576 | ;³ | ||
| 577 | ;³ | ||
| 578 | ;³ RETURN: prn_ports_attached - number of printer ports | ||
| 579 | ;³ | ||
| 580 | ;³ | ||
| 581 | ;³ MESSAGES: none | ||
| 582 | ;³ | ||
| 583 | ;³ REGISTER | ||
| 584 | ;³ USAGE: SI - index of the FOR loop and displacement from printr | ||
| 585 | ;³ ES - holds segment of ROM data area (0 in this case) | ||
| 586 | ;³ | ||
| 587 | ;³ | ||
| 588 | ;³ ASSUMPTIONS: All valid printer port addresses are >2. | ||
| 589 | ;³ | ||
| 590 | ;³ | ||
| 591 | ;³ SIDE EFFECT: ES is lost | ||
| 592 | ;³ SI is lost | ||
| 593 | ;³ ;AN000; | ||
| 594 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 595 | |||
| 596 | check_prn_ports_attached PROC NEAR | ||
| 597 | |||
| 598 | |||
| 599 | MOV SI,0 | ||
| 600 | MOV ES,SI ;now ES:printr addresses 40:8=0:408 | ||
| 601 | |||
| 602 | .FOR SI = 0 TO 4 STEP 2 ;for each of 3 printer port address holder words | ||
| 603 | |||
| 604 | .IF <<WORD PTR ES:printr[SI]> GT redirected> THEN ;SEE IF THE PORT EXISTS | ||
| 605 | INC prn_ports_attached | ||
| 606 | .ENDIF | ||
| 607 | |||
| 608 | .NEXT SI | ||
| 609 | |||
| 610 | RET | ||
| 611 | |||
| 612 | check_prn_ports_attached ENDP | ||
| 613 | |||
| 614 | |||
| 615 | ;------------------------------------------------------------------------------- ;AN000; | ||
| 616 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 617 | ;³ ;AN000; | ||
| 618 | ;³ GET_DEVICE_RETRY_TYPE ;AN000; | ||
| 619 | ;³ --------------------- ;AN000; | ||
| 620 | ;³ ;AN000; | ||
| 621 | ;³ Return the type of retry active for comX or lptX. ;AN000; | ||
| 622 | ;³ ;AN000; | ||
| 623 | ;³ INPUT: device_request - scalar indicating what status the user requested. ;AN000; | ||
| 624 | ;³ use the following equates: ;AN000; | ||
| 625 | ;³ ;AN000; | ||
| 626 | ;³ com1_retry_type_status EQU 0 ;AN000; | ||
| 627 | ;³ com2_retry_type_status EQU 2 ;AN000; | ||
| 628 | ;³ com3_retry_type_status EQU 4 ;AN000; | ||
| 629 | ;³ com4_retry_type_status EQU 6 ;AN000; | ||
| 630 | ;³ lpt1_retry_type_status ;AN000; | ||
| 631 | ;³ lpt2_retry_type_status ;AN000; | ||
| 632 | ;³ lpt3_retry_type_status ;AN000; | ||
| 633 | ;³ ;AN000; | ||
| 634 | ;³ ;AN000; | ||
| 635 | ;³ RETURN: returned_retry_type - scalar indicating type of retry active for ;AN000; | ||
| 636 | ;³ the requested device. compare with the following equates: ;AN000; | ||
| 637 | ;³ ;AN000; | ||
| 638 | ;³ no_retry_flag ;AN000; | ||
| 639 | ;³ error_status ;AN000; | ||
| 640 | ;³ busy_status ;AN000; | ||
| 641 | ;³ ready_status ;AN000; | ||
| 642 | ;³ ;AN000; | ||
| 643 | ;³ retry_type_ptr - set to proper string ;AN000; | ||
| 644 | ;³ ;AN000; | ||
| 645 | ;³ ;AN000; | ||
| 646 | ;³ MESSAGES: none ;AN000; | ||
| 647 | ;³ ;AN000; | ||
| 648 | ;³ REGISTER ;AN000; | ||
| 649 | ;³ USAGE: CL - For com ports it serves as bit shift count for the retry type byte. | ||
| 650 | ;³ ;AN000; | ||
| 651 | ;³ AL - On exit holds retry type scalar on exit (returned_retry_type) ;AN000; | ||
| 652 | ;³ ;AN000; | ||
| 653 | ;³ ES - holds segment of resident mode code ;AN000; | ||
| 654 | ;³ ;AN000; | ||
| 655 | ;³ ;AN000; | ||
| 656 | ;³ CONVENTIONS: The value in device_request is used as an index into the LPTX ;AN000; | ||
| 657 | ;³ array of retry type flags, or as a bit shift count for the ;AN000; | ||
| 658 | ;³ COM retry type byte. ;AN000; | ||
| 659 | ;³ ;AN000; | ||
| 660 | ;³ ;AN000; | ||
| 661 | ;³ ASSUMPTIONS: The user has initialized device_request on entry with ;AN000; | ||
| 662 | ;³ the equates provided. ;AN000; | ||
| 663 | ;³ ;AN000; | ||
| 664 | ;³ ;AN000; | ||
| 665 | ;³ SIDE EFFECT: none. ;AN000; | ||
| 666 | ;³ ;AN000; | ||
| 667 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 668 | ;AN000; | ||
| 669 | get_device_retry_type PROC NEAR ;AN665; | ||
| 670 | |||
| 671 | PUBLIC get_device_retry_type | ||
| 672 | |||
| 673 | PUSH BX ;AN665; | ||
| 674 | PUSH ES ;AN665; | ||
| 675 | |||
| 676 | XOR BX,BX ;AN665; | ||
| 677 | MOV ES,BX ;set segment to zero ;AN665; | ||
| 678 | |||
| 679 | .IF <<ES:WORD PTR resseg> NE 0000H> THEN ;IF code resident THEN ;AN665; | ||
| 680 | MOV ES,ES:WORD PTR resseg[2] ;ES=seg of resident code ;AN665; | ||
| 681 | .IF <device_type EQ COMx> THEN | ||
| 682 | MOV CL,device_request ;CL has 0, 2, 4 or 6 for COM 1, 2, 3 or 4 respectively ;AC003; | ||
| 683 | MOV returned_retry_type,BYTE PTR ES:res_com_retry_type ;AL=the status byte for all 4 com ports ;AN665; | ||
| 684 | SHR returned_retry_type,CL ;AL=XXXXXX??, where ?? is the retry bits for port in question ;AC003; | ||
| 685 | AND returned_retry_type,00000011B ;AL=000000??, where ?? is the retry bits for port in question ;AC003; | ||
| 686 | .ELSE ;AN665; | ||
| 687 | MOV BL,device_request ;BX=index into retry bytes in resident code ;AN665; | ||
| 688 | MOV returned_retry_type,BYTE PTR ES:lpt1_retry_type[BX] ;AN665; | ||
| 689 | .ENDIF ;AN665; | ||
| 690 | .ELSE ;AN665; | ||
| 691 | MOV returned_retry_type,no_retry_flag ;AN665; | ||
| 692 | .ENDIF ;AN665; | ||
| 693 | |||
| 694 | .IF <returned_retry_type EQ B> OR ;COM form of busy flag ;AN665; | ||
| 695 | .IF <returned_retry_type EQ busy_status> THEN ;AN665; | ||
| 696 | MOV retry_type_ptr,OFFSET B_str ;AN665; | ||
| 697 | .ELSEIF <returned_retry_type EQ E> OR ;COM form of error flag ;AN665; | ||
| 698 | .IF <returned_retry_type EQ error_status> THEN ;AN665; | ||
| 699 | MOV retry_type_ptr,OFFSET E_str ;AN665; | ||
| 700 | .ELSEIF <returned_retry_type EQ R> OR ;COM form of ready flag ;AN665; | ||
| 701 | .IF <returned_retry_type EQ ready_status> THEN ;AN665; | ||
| 702 | MOV retry_type_ptr,OFFSET R_str ;AN665; | ||
| 703 | .ELSE ;AN665; | ||
| 704 | MOV retry_type_ptr,OFFSET NONE_str ;not E, B or R. ;AN665; | ||
| 705 | .ENDIF ;AN665; | ||
| 706 | |||
| 707 | POP ES ;AN665; | ||
| 708 | POP BX ;AN665; | ||
| 709 | RET ;AN665; | ||
| 710 | |||
| 711 | get_device_retry_type ENDP ;AN665; | ||
| 712 | ;AN000; | ||
| 713 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 714 | ;³ ;AN000; | ||
| 715 | ;³ ANALYZE_AND_INVOKE ;AN000; | ||
| 716 | ;³ ------------------ ;AN000; | ||
| 717 | ;³ ;AN000; | ||
| 718 | ;³ The command line is boken down into pieces by "parse_parameters". Each piece ;AN000; | ||
| 719 | ;³ is analyzed here, and the appropriate routine called to setup and/or execute ;AN000; | ||
| 720 | ;³ the requested function. ;AN000; | ||
| 721 | ;³ ;AN000; | ||
| 722 | ;³ ;AN000; | ||
| 723 | ;³ ;AN000; | ||
| 724 | ;³ ;AN000; | ||
| 725 | ;³ ;AN000; | ||
| 726 | ;³ ;AN000; | ||
| 727 | ;³ INPUT: request_type - scalar indicating what operation the user requested. ;AN000; | ||
| 728 | ;³ ;AN000; | ||
| 729 | ;³ ;AN000; | ||
| 730 | ;³ ;AN000; | ||
| 731 | ;³ ;AN000; | ||
| 732 | ;³ RETURN: none ;AN000; | ||
| 733 | ;³ ;AN000; | ||
| 734 | ;³ ;AN000; | ||
| 735 | ;³ MESSAGES: none ;AN000; | ||
| 736 | ;³ ;AN000; | ||
| 737 | ;³ ;AN000; | ||
| 738 | ;³ ;AN000; | ||
| 739 | ;³ ;AN000; | ||
| 740 | ;³ REGISTER ;AN000; | ||
| 741 | ;³ USAGE: DI - index into the list of parsed parms, the array parm_list. ;AN000; | ||
| 742 | ;³ ;AN000; | ||
| 743 | ;³ CX - temporary holder for memory to memory MOVs ;AN000; | ||
| 744 | ;³ ;AN000; | ||
| 745 | ;³ ;AN000; | ||
| 746 | ;³ CONVENTIONS: ;AN000; | ||
| 747 | ;³ ;AN000; | ||
| 748 | ;³ ;AN000; | ||
| 749 | ;³ ;AN000; | ||
| 750 | ;³ ASSUMPTIONS: All the input are valid. The parm_list entry past the last one ;AN000; | ||
| 751 | ;³ has a parm_type of bogus. ;AN000; | ||
| 752 | ;³ ;AN000; | ||
| 753 | ;³ The lines and columns values are in binary for request_type= ;AN000; | ||
| 754 | ;³ set_con_features ;AN000; | ||
| 755 | ;³ ;AN000; | ||
| 756 | ;³ The codepage numbers were put into des_start_packet. ;AN000; | ||
| 757 | ;³ ;AN000; | ||
| 758 | ;³ ;AN000; | ||
| 759 | ;³ ;AN000; | ||
| 760 | ;³ ;AN000; | ||
| 761 | ;³ SIDE EFFECT: ;AN000; | ||
| 762 | ;³ ;AN000; | ||
| 763 | ;³ ;AN000; | ||
| 764 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 765 | ;AN000; | ||
| 766 | analyze_and_invoke PROC NEAR ;AX000; ;AN000; | ||
| 767 | ;AN000; | ||
| 768 | ;AN000; | ||
| 769 | ;CASE request_type= ;AN000; | ||
| 770 | ;AN000; | ||
| 771 | MOV cp_cb.des_pack_ptr,OFFSET des_start_packet ;AX000;In case a codepage request ;AN000; | ||
| 772 | ;AN000; | ||
| 773 | MOV DI,0 ;initialize index into the list of parsed parameters ;AN000; | ||
| 774 | ;AN000; | ||
| 775 | ;calculate the displacement for the jump to the jump ;AN000; | ||
| 776 | MOV parm_list_holder,BX ;save parm_list_BX ;AN000; | ||
| 777 | XOR BX,BX ;AX000; ;AN000; | ||
| 778 | MOV BL,max_request_type ;AX000; ;AN000; | ||
| 779 | SUB BL,request_type ;AX000;see the list of equates for request_type ;AN000; | ||
| 780 | SHL BX,1 ;AX000;BX=word displacement into jump table ;AN000; | ||
| 781 | JMP jump_table1[BX] ;AX000;jump to appropriate jump ;AN000; | ||
| 782 | ;AN000; | ||
| 783 | jump_table1 LABEL WORD ;the order of the following entries is critical ;AN000; | ||
| 784 | ;AN000; | ||
| 785 | DW OFFSET all_con_status_case ;AN000; | ||
| 786 | DW OFFSET codepage_prepare_case ;AN000; | ||
| 787 | DW OFFSET codepage_refresh_case ;AN000; | ||
| 788 | DW OFFSET codepage_select_case ;AN000; | ||
| 789 | DW OFFSET codepage_status_case ;AN000; | ||
| 790 | DW OFFSET codepage_prepared_status_case ;AN000; | ||
| 791 | DW OFFSET codepage_selected_status_case ;AN000; | ||
| 792 | DW OFFSET com_status_case ;AN000; | ||
| 793 | DW OFFSET initialize_com_port_case ;AN000; | ||
| 794 | DW OFFSET initialize_printer_port_case ;AN000; | ||
| 795 | DW OFFSET old_initialize_printer_port_case ;AN000; | ||
| 796 | DW OFFSET old_video_mode_set_case ;AN000; | ||
| 797 | DW OFFSET printer_reroute_case ;AN000; | ||
| 798 | DW OFFSET printer_status_case ;AN000; | ||
| 799 | DW OFFSET set_con_features_case ;AN000; | ||
| 800 | DW OFFSET status_for_everything_case ;AN000; | ||
| 801 | DW OFFSET turn_off_reroute_case ;AN000; | ||
| 802 | ;AN000; | ||
| 803 | ;AN000; | ||
| 804 | all_con_status_case: ;know that all con status is requested ;AN000; | ||
| 805 | ;AN000; | ||
| 806 | ;AN000; | ||
| 807 | MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000; | ||
| 808 | MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000; | ||
| 809 | display status_for_device ;AN000; | ||
| 810 | display long_underline ;Status for device CON: ;AN000; | ||
| 811 | display four_char_underline ;---------------------- ;AN000; | ||
| 812 | ;AN000; | ||
| 813 | CAll check_ANSI_installed ;see if ANSI.SYS is installed ;AC001; | ||
| 814 | .IF <ANSI_installed EQ true> THEN ;IF can get info on settings THEN display them ELSE don't display them | ||
| 815 | CALL display_columns_status ;AN000; | ||
| 816 | CALL display_lines_status ;AN000; | ||
| 817 | .ENDIF ;AC001; | ||
| 818 | MOV cp_cb.request_typ,status ;set up variables for modecp ;AN000; | ||
| 819 | MOV cp_cb.cp_device,OFFSET CON_str ;AN000; | ||
| 820 | ;AN000; | ||
| 821 | CALL modecp ;display codepage status ;AN000; | ||
| 822 | ;AN000; | ||
| 823 | BREAK 0 ;AN000; | ||
| 824 | ;AN000; | ||
| 825 | ;AN000; | ||
| 826 | codepage_prepare_case: ;AN000; | ||
| 827 | ;AN000; | ||
| 828 | MOV cp_cb.request_typ,prepare ;AN000; | ||
| 829 | CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; | ||
| 830 | ;AN000; | ||
| 831 | call modecp ;AN000; | ||
| 832 | ;AN000; | ||
| 833 | BREAK 0 ;AN000; | ||
| 834 | ;AN000; | ||
| 835 | ;AN000; | ||
| 836 | codepage_refresh_case: ;AN000; | ||
| 837 | ;AN000; | ||
| 838 | MOV cp_cb.request_typ,refresh ;AN000; | ||
| 839 | CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; | ||
| 840 | ;AN000; | ||
| 841 | call modecp ;AN000; | ||
| 842 | ;AN000; | ||
| 843 | BREAK 0 ;AN000; | ||
| 844 | ;AN000; | ||
| 845 | ;AN000; | ||
| 846 | ;AN000; | ||
| 847 | codepage_select_case: ;AN000; | ||
| 848 | ;AN000; | ||
| 849 | MOV cp_cb.request_typ,select ;AN000; | ||
| 850 | CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; | ||
| 851 | MOV des_start_packet.des_strt_pknum,1 ;one cp number ;AN000; | ||
| 852 | MOV des_start_packet.des_strt_pklen,4 ;bytes for count (word) and one number (word) ;AN000; | ||
| 853 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 854 | MOV DI,codepage_index_holder ;DI=index in parm list of the entry for the codepage to be selected;AN000; | ||
| 855 | MOV AX,parm_list_BX[DI].value1 ;AX=codepage number in binary form ;AN000; | ||
| 856 | MOV des_start_packet.des_strt_pkcp1,AX ;setup parm block with the (single) cp number ;AN000; | ||
| 857 | ;AN000; | ||
| 858 | CALL modecp ;AN000; | ||
| 859 | ;AN000; | ||
| 860 | BREAK 0 ;AN000; | ||
| 861 | ;AN000; | ||
| 862 | ;AN000; | ||
| 863 | codepage_status_case: ;AN000; | ||
| 864 | codepage_prepared_status_case: ;AN000; | ||
| 865 | codepage_selected_status_case: ;AN000; | ||
| 866 | ;AN000; | ||
| 867 | MOV cp_cb.request_typ,status ;AN000; | ||
| 868 | CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000; | ||
| 869 | ;AN000; | ||
| 870 | CALL modecp ;AN000; | ||
| 871 | ;AN000; | ||
| 872 | BREAK 0 ;AN000; | ||
| 873 | ;AN000; | ||
| 874 | ;AN000; | ||
| 875 | com_status_case: ;AN000; | ||
| 876 | ;AN000; | ||
| 877 | ; INPUT: device_type = COMx | ||
| 878 | ; device = ASCII COM number | ||
| 879 | |||
| 880 | |||
| 881 | CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000; | ||
| 882 | ;AN000; | ||
| 883 | .IF <device_name EQ <OFFSET COM1_str>> AND ;AN000; | ||
| 884 | .IF <com_ports_attached GE 1> THEN ;COM1 exists | ||
| 885 | MOV BL,COM1 ;AN000; | ||
| 886 | MOV stat_dev_ptr,OFFSET COM1_str ;set up msg ser input ;AN000; | ||
| 887 | MOV device_request,com1_retry_type_status ;AN000; | ||
| 888 | .ELSEIF <device_name EQ <OFFSET COM2_str>> AND ;AN000; | ||
| 889 | .IF <com_ports_attached GE 2> THEN ;COM2 exists | ||
| 890 | MOV BL,COM2 ;AN000; | ||
| 891 | MOV stat_dev_ptr,OFFSET COM2_str ;set up msg ser input ;AN000; | ||
| 892 | MOV device_request,com2_retry_type_status ;AN000; | ||
| 893 | .ELSEIF <device_name EQ <OFFSET COM3_str>> AND ;AN000; | ||
| 894 | .IF <com_ports_attached GE 3> THEN ;COM3 exists | ||
| 895 | MOV BL,COM3 ;AN000; | ||
| 896 | MOV stat_dev_ptr,OFFSET COM3_str ;set up msg ser input ;AN000; | ||
| 897 | MOV device_request,com3_retry_type_status ;AN000; | ||
| 898 | .ELSEIF <device_name EQ <OFFSET COM4_str>> AND ;AN000; | ||
| 899 | .IF <com_ports_attached EQ 4> THEN ;COM4 exists | ||
| 900 | MOV BL,COM4 ;AN000; | ||
| 901 | MOV stat_dev_ptr,OFFSET COM4_str ;set up msg ser input ;AN000; | ||
| 902 | MOV device_request,com4_retry_type_status ;AN000; | ||
| 903 | .ELSE ;device does not exist ;AN000; | ||
| 904 | MOV CX,device_name ;AN000; ;AN000; | ||
| 905 | MOV illegal_device_ptr,CX ;put pointer to com port string in message ;AN000; | ||
| 906 | DISPLAY err1 ;AN000;"Illegal device name - COMX" ;AN000; | ||
| 907 | MOV noerror,false ;set flag for displaying status to be skipped | ||
| 908 | .ENDIF ;AN000; | ||
| 909 | .IF <noerror EQ true> THEN | ||
| 910 | MOV dev_name_size,len_COMX_str ;set up for msg service, see MODEPARS.ASM ;AN000; | ||
| 911 | display status_for_device ;"Status for device COM?:" ;AN000; | ||
| 912 | display long_underline ;"------------------" ;AN000; | ||
| 913 | display five_char_underline ;has CRLF on it "-----" ;AN000; | ||
| 914 | call get_device_retry_type ;AN000; | ||
| 915 | display retry_equal ;AN000; | ||
| 916 | .ENDIF | ||
| 917 | ;AN000; | ||
| 918 | BREAK 0 ;AN000; | ||
| 919 | ;AN000; | ||
| 920 | ;AN000; | ||
| 921 | ; con_status_case: ;don't know which con status is requested ;AN000; | ||
| 922 | ;AN000; | ||
| 923 | ; MOV request_type,all_con_status ;AC000;DCR76 ;AN000; | ||
| 924 | ; CALL analyze_and_invoke ;AC000;DCR76 ;AN000; | ||
| 925 | ;AN000; | ||
| 926 | ; MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000; | ||
| 927 | ; MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000; | ||
| 928 | ; display status_for_device ;AN000; | ||
| 929 | ; display long_underline ;Status for device CON: ;AN000; | ||
| 930 | ; display four_char_underline ;---------------------- ;AN000; | ||
| 931 | ; ;AN000; | ||
| 932 | ; MOV DI,0 ;AN000; | ||
| 933 | ; ;AN000; | ||
| 934 | ; .WHILE <parm_list_BX[DI].parm_type NE bogus> DO ;the entry after the last has parm_type of bogus ;AN000; | ||
| 935 | ; ;AN000; | ||
| 936 | ; ;CASE parm_list_BX[DI].item_tag= ;AN000; | ||
| 937 | ; ;AN000; | ||
| 938 | ; ;CODEPAGE, ;AN000; | ||
| 939 | ; ;PREPARE, ;AN000; | ||
| 940 | ; ;SELECT: ;AN000; | ||
| 941 | ; ;AN000; | ||
| 942 | ; .IF <parm_list_BX[DI].item_tag EQ CODEPAGE_item_tag> OR ;AN000; | ||
| 943 | ; .IF <parm_list_BX[DI].item_tag EQ SELECT_item_tag> OR ;AN000; | ||
| 944 | ; .IF <parm_list_BX[DI].item_tag EQ PREPARE_item_tag> THEN ;AN000; | ||
| 945 | ; ;AN000; | ||
| 946 | ; MOV cp_cb.request_typ,status ;AN000; | ||
| 947 | ; MOV cp_cb.cp_device,OFFSET CON_str ;AN000; | ||
| 948 | ; CALL modecp ;display codepage status ;AN000; | ||
| 949 | ; ;AN000; | ||
| 950 | ; BREAK 2 ;AN000; | ||
| 951 | ; ;AN000; | ||
| 952 | ; .ENDIF ;AN000; | ||
| 953 | ; ;AN000; | ||
| 954 | ; ;BLINK: ;AN000; | ||
| 955 | ; ;AN000; | ||
| 956 | ; .IF <parm_list_BX[DI].item_tag EQ BLINK_item_tag> THEN ;AN000; | ||
| 957 | ; ;AN000; | ||
| 958 | ; CALL display_blink_status ;AN000; | ||
| 959 | ; ;AN000; | ||
| 960 | ; BREAK 2 ;AN000; | ||
| 961 | ; ;AN000; | ||
| 962 | ; .ENDIF ;AN000; | ||
| 963 | ; ;AN000; | ||
| 964 | ; ;AN000; | ||
| 965 | ; ;COLUMNS: ;AN000; | ||
| 966 | ; ;AN000; | ||
| 967 | ; .IF <parm_list_BX[DI].item_tag EQ COLUMNS_item_tag> THEN ;AN000; | ||
| 968 | ; ;AN000; | ||
| 969 | ; CALL display_COLUMNS_status ;AN000; | ||
| 970 | ; ;AN000; | ||
| 971 | ; BREAK 2 ;AN000; | ||
| 972 | ; ;AN000; | ||
| 973 | ; .ENDIF ;AN000; | ||
| 974 | ; ;AN000; | ||
| 975 | ; ;AN000; | ||
| 976 | ; ;LINES: ;AN000; | ||
| 977 | ; ;AN000; | ||
| 978 | ; .IF <parm_list_BX[DI].item_tag EQ LINES_item_tag> THEN ;AN000; | ||
| 979 | ; ;AN000; | ||
| 980 | ; CALL display_lines_status ;AN000; | ||
| 981 | ; ;AN000; | ||
| 982 | ; BREAK 2 ;AN000; | ||
| 983 | ; ;AN000; | ||
| 984 | ; .ENDIF ;AN000; | ||
| 985 | ; ;AN000; | ||
| 986 | ; ENDCASE_2: ;AN000; | ||
| 987 | ; ;AN000; | ||
| 988 | ; ADD DI,TYPE parm_list_entry ;AN000; | ||
| 989 | ; ;AN000; | ||
| 990 | ; .ENDWHILE ;AN000; | ||
| 991 | ;AN000; | ||
| 992 | ; BREAK 0 ;AN000; | ||
| 993 | ;AN000; | ||
| 994 | ;AN000; | ||
| 995 | ;AN000; | ||
| 996 | initialize_com_port_case: ;AN000; | ||
| 997 | ;AN000; | ||
| 998 | |||
| 999 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 1000 | |||
| 1001 | .IF <parms_form EQ keyword> THEN ;IF the parms were input as keywords THEN ;AN000; | ||
| 1002 | ;AN000; | ||
| 1003 | MOV DI,TYPE parm_list_entry ;skip COMN parm ;AN000; | ||
| 1004 | ;AN000; | ||
| 1005 | .WHILE <parm_list_BX[DI].parm_type NE bogus> DO NEAR ;the entry after the last has parm_type of bogus ;AN000; | ||
| 1006 | ;AN000; | ||
| 1007 | ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000; | ||
| 1008 | ;AN000; | ||
| 1009 | ;BAUD_equal: ;AN000; | ||
| 1010 | ;AN000; | ||
| 1011 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET BAUD_equal>> THEN ;AN000; | ||
| 1012 | ;AN000; | ||
| 1013 | MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the baud rate string ;AN000; | ||
| 1014 | MOV pbaud_ptr,AX ;set pointer to the baud rate string in the messge ;AN000; | ||
| 1015 | MOV baud_index,DI ;set index into parm list for setcom ;AN000; | ||
| 1016 | BREAK 3 ;AN000; | ||
| 1017 | ;AN000; | ||
| 1018 | .ENDIF ;AN000; | ||
| 1019 | ;AN000; | ||
| 1020 | ;AN000; | ||
| 1021 | ;PARITY_equal: ;AN000; | ||
| 1022 | ;AN000; | ||
| 1023 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET PARITY_equal>> THEN ;AN000; | ||
| 1024 | ;AN000; | ||
| 1025 | MOV SI,parm_list_BX[DI].value1 ;AX= pointer to the parity string ;AN000; | ||
| 1026 | MOV pparity_ptr,SI ;set pointer to the parity string in the messge ;AN000; | ||
| 1027 | OR BYTE PTR [SI],lowercase ;convert to lowercase for compatibility with previous versions | ||
| 1028 | MOV parity_index,DI ;set index into parm list for setcom ;AN000; | ||
| 1029 | BREAK 3 ;AN000; | ||
| 1030 | ;AN000; | ||
| 1031 | .ENDIF ;AN000; | ||
| 1032 | ;AN000; | ||
| 1033 | ;AN000; | ||
| 1034 | ;DATA_equal: ;AN000; | ||
| 1035 | ;AN000; | ||
| 1036 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DATA_equal>> THEN ;AN000; | ||
| 1037 | ;AN000; | ||
| 1038 | MOV BP,parm_list_BX[DI].value1 ;BP= pointer to the data bits string ;AN000; | ||
| 1039 | MOV AL,[BP] ;AL= data bits character ;AN000; | ||
| 1040 | MOV pdata,AL ;set the data bits string in the messge ;AN000; | ||
| 1041 | MOV data_bits_index,DI ;set index into parm list for setcom ;AN000; | ||
| 1042 | BREAK 3 ;AN000; | ||
| 1043 | ;AN000; | ||
| 1044 | .ENDIF ;AN000; | ||
| 1045 | ;AN000; | ||
| 1046 | ;AN000; | ||
| 1047 | ;STOP_equal: ;AN000; | ||
| 1048 | ;AN000; | ||
| 1049 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET STOP_equal>> THEN ;AN000; | ||
| 1050 | ;AN000; | ||
| 1051 | MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the stop bit string ;AN000; | ||
| 1052 | MOV pstop_ptr,AX ;set pointer to the parity string in the messge ;AN000; | ||
| 1053 | MOV stop_bits_index,DI ;set index into parm list for setcom ;AN000; | ||
| 1054 | BREAK 3 ;AN000; | ||
| 1055 | ;AN000; | ||
| 1056 | .ENDIF ;AN000; | ||
| 1057 | ;AN000; | ||
| 1058 | ;AN000; | ||
| 1059 | ;RETRY_equal: ;AN000; | ||
| 1060 | ;AN000; | ||
| 1061 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RETRY_equal_str>> THEN ;AN000; | ||
| 1062 | ;AN000; | ||
| 1063 | MOV retry_index,DI ;indicate to modecom which parm is retry ;AN000; | ||
| 1064 | ; BREAK 3 ;AN000; | ||
| 1065 | ;AN000; | ||
| 1066 | .ENDIF ;AN000; | ||
| 1067 | ;AN000; | ||
| 1068 | ;AN000; | ||
| 1069 | ENDCASE_3: ;AN000; | ||
| 1070 | ;AN000; | ||
| 1071 | ADD DI,TYPE parm_list_entry ;AN000; | ||
| 1072 | ;AN000; | ||
| 1073 | ;AN000; | ||
| 1074 | .ENDWHILE ;AN000; | ||
| 1075 | ;AN000; | ||
| 1076 | .ELSE ;the parms were entered as positionals (the old form) ;AN000; | ||
| 1077 | ;AN000; | ||
| 1078 | MOV baud_index,TYPE parm_list_entry ;AN000; | ||
| 1079 | MOV DI,2 * (TYPE parm_list_entry) ;AN000; | ||
| 1080 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN | ||
| 1081 | MOV parity_index,DI ;AN000; | ||
| 1082 | .ENDIF | ||
| 1083 | MOV DI,3 * (TYPE parm_list_entry) ;AN000; | ||
| 1084 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN | ||
| 1085 | MOV data_bits_index,DI ;AN000; | ||
| 1086 | .ENDIF | ||
| 1087 | MOV DI,4 * (TYPE parm_list_entry) ;DI=stopbits index ;AN000; | ||
| 1088 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN | ||
| 1089 | MOV stop_bits_index,DI ;AN000; | ||
| 1090 | .ENDIF | ||
| 1091 | MOV DI,5 * (TYPE parm_list_entry) ;AN000;DI=index of retry parm | ||
| 1092 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF retry requested THEN | ||
| 1093 | MOV retry_index,DI ;AN000;set up index for modecom | ||
| 1094 | .ENDIF ;AN000; | ||
| 1095 | ;AN000; | ||
| 1096 | .ENDIF ;AN000; | ||
| 1097 | ;AN000; | ||
| 1098 | CALL modecom ;AN000; | ||
| 1099 | ;AN000; | ||
| 1100 | BREAK 0 ;AN000; | ||
| 1101 | |||
| 1102 | ;AN000; | ||
| 1103 | ;AN000; | ||
| 1104 | old_initialize_printer_port_case: ;Assume that parms not specified have an entry in parm_list that is in initial state;AN000; | ||
| 1105 | |||
| 1106 | ;printer_no has ASCII form of printer number ;AN000; | ||
| 1107 | ;need to put binary form of columns in columns_holder (80 or 132) ;AN000; | ||
| 1108 | ;need to put "6" or "8" in parm2 ;AN000; | ||
| 1109 | ;need to set retry_index ;AN000; | ||
| 1110 | |||
| 1111 | |||
| 1112 | PUBLIC old_initialize_printer_port_case | ||
| 1113 | |||
| 1114 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 1115 | MOV DI,TYPE parm_list_entry ;skip LPTN parm, point at chars per line ;AN000; | ||
| 1116 | |||
| 1117 | .IF <parm_list_BX[DI].item_tag EQ onethirtytwo_item_tag> THEN ;AN000; | ||
| 1118 | MOV columns_holder,132 ;AN000; | ||
| 1119 | .ELSEIF <parm_list_BX[DI].item_tag EQ eighty_item_tag> THEN ;AN000; | ||
| 1120 | MOV columns_holder,80 ;AN000; | ||
| 1121 | .ENDIF ;if not 80 or 132 modeprin assumes not specified, and makes no change;AN000; | ||
| 1122 | ADD DI,TYPE parm_list_entry ;look at lines per inch ;AN000; | ||
| 1123 | |||
| 1124 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;IF chars per line specified THEN ;AN000; | ||
| 1125 | MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000; | ||
| 1126 | MOV AL,BYTE PTR DS:[SI] ;AN000; | ||
| 1127 | MOV parm2,AL ;parm2="6" or "8" ;AN000; | ||
| 1128 | .ENDIF ;otherwise leave parm2=0FFH (unspecified) ;AN000; | ||
| 1129 | |||
| 1130 | ADD DI,TYPE parm_list_entry ;look at retry request ;AN000; | ||
| 1131 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000; | ||
| 1132 | MOV retry_index,DI ;AN000;let modeprin know retry was requested and the index of it. | ||
| 1133 | .ENDIF ;AN000; | ||
| 1134 | |||
| 1135 | CALL modeecno ;AN000; | ||
| 1136 | CALL modeprin ;AN000; | ||
| 1137 | ;AN000; | ||
| 1138 | BREAK 0 ;AN000; | ||
| 1139 | |||
| 1140 | |||
| 1141 | |||
| 1142 | initialize_printer_port_case: ;printer_no has ASCII form of printer number ;AN000; | ||
| 1143 | ;need to put binary form of columns in columns_holder (80 or 132) ;AN000; | ||
| 1144 | ;need to put "6" or "8" in parm2 ;AN000; | ||
| 1145 | ;need to set retry_index ;AN000; | ||
| 1146 | ;AN000; | ||
| 1147 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 1148 | MOV DI,TYPE parm_list_entry ;skip LPTN parm ;AN000; | ||
| 1149 | |||
| 1150 | .WHILE <parm_list_BX[DI].parm_type NE bogus> DO ;the entry after the last has parm_type of bogus ;AN000; | ||
| 1151 | ;AN000; | ||
| 1152 | ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000; | ||
| 1153 | ;AN000; | ||
| 1154 | ;AN000; | ||
| 1155 | ;LINES_equal: ;AN000; | ||
| 1156 | ;AN000; | ||
| 1157 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET LINES_equal>> THEN ;AN000; | ||
| 1158 | ;AN000; | ||
| 1159 | MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000; | ||
| 1160 | MOV AL,BYTE PTR DS:[SI] ;AN000; | ||
| 1161 | MOV parm2,AL ;parm2="6" or "8" ;AN000; | ||
| 1162 | BREAK 4 ;AN000; | ||
| 1163 | ;AN000; | ||
| 1164 | .ENDIF ;AN000; | ||
| 1165 | ;AN000; | ||
| 1166 | ;AN000; | ||
| 1167 | ;COLUMNS_equal: ;AN000; | ||
| 1168 | ;AN000; | ||
| 1169 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000; | ||
| 1170 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> THEN ;AN000; | ||
| 1171 | ;AN000; | ||
| 1172 | .IF <parm_list_BX[DI].item_tag EQ onethirtytwo_item_tag> THEN ;AN000; | ||
| 1173 | MOV columns_holder,132 ;AN000; | ||
| 1174 | .ELSE ;AN000; | ||
| 1175 | MOV columns_holder,80 ;AN000; | ||
| 1176 | .ENDIF ;AN000; | ||
| 1177 | BREAK 4 ;AN000; | ||
| 1178 | ;AN000; | ||
| 1179 | .ENDIF ;AN000; | ||
| 1180 | ;AN000; | ||
| 1181 | ;AN000; | ||
| 1182 | ;RETRY_equal: ;AN000; | ||
| 1183 | ;AN000; | ||
| 1184 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RETRY_equal_str>> THEN ;AN000; | ||
| 1185 | |||
| 1186 | MOV retry_index,DI ;AN664; | ||
| 1187 | BREAK 4 ;AN000; | ||
| 1188 | ;AN000; | ||
| 1189 | .ENDIF ;AN000; | ||
| 1190 | ;AN000; | ||
| 1191 | ;AN000; | ||
| 1192 | ENDCASE_4: ;AN000; | ||
| 1193 | ;AN000; | ||
| 1194 | ADD DI,TYPE parm_list_entry ;AN000; | ||
| 1195 | ;AN000; | ||
| 1196 | ;AN000; | ||
| 1197 | .ENDWHILE ;AN000; | ||
| 1198 | |||
| 1199 | CALL modeecno ;turn of rerouting ;AN000; | ||
| 1200 | CALL modeprin ;AN000; | ||
| 1201 | ;AN000; | ||
| 1202 | BREAK 0 ;AN000; | ||
| 1203 | ;AN000; | ||
| 1204 | ;AN000; | ||
| 1205 | ;AN000; | ||
| 1206 | ;AN000; | ||
| 1207 | old_video_mode_set_case: ;AN000; | ||
| 1208 | ;AN000; | ||
| 1209 | PUBLIC old_video_mode_set_case ;AN000; | ||
| 1210 | ;AN000; | ||
| 1211 | ;AN000; | ||
| 1212 | ;first see if ANSI.SYS is loaded ;AN000; | ||
| 1213 | CALL check_ANSI_installed ;AC001; | ||
| 1214 | .IF <ANSI_installed EQ true> THEN ;AC001; | ||
| 1215 | MOV CL,get_current_settings ;AN000; | ||
| 1216 | PUSH BX ;save parm_list ;AN000; | ||
| 1217 | CALL do_IOCTL0C ;get current settings of CON ;AN000; | ||
| 1218 | POP BX ;restore parm_list ;AN000; | ||
| 1219 | MOV IOCTL0C_data_block.mode,text ;AN000; | ||
| 1220 | .ENDIF ;AN000;ANSI installed ;AN000; | ||
| 1221 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 1222 | PUSH DI ;save parm list index ;AN000; | ||
| 1223 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN | ||
| 1224 | .IF <parm_list_BX[DI].item_tag EQ BW40_item_tag> THEN ;IF BW40 REQUESTED ;AN000; | ||
| 1225 | CALL BW40 ;AN000; | ||
| 1226 | .ELSEIF <parm_list_BX[DI].item_tag EQ BW80_item_tag> THEN ;IF BW80 REQUESTED ;AN000; | ||
| 1227 | CALL BW80 ;AN000; | ||
| 1228 | .ELSEIF <parm_list_BX[DI].item_tag EQ CO40_item_tag> THEN ;IF CO40 REQUESTED ;AN000; | ||
| 1229 | CALL CO40 ;AN000; | ||
| 1230 | .ELSEIF <parm_list_BX[DI].item_tag EQ CO80_item_tag> THEN ;IF CO80 REQUESTED ;AN000; | ||
| 1231 | CALL CO80 ;AN000; | ||
| 1232 | .ELSEIF <parm_list_BX[DI].item_tag EQ MONO_item_tag> THEN ;IF MONO REQUESTED ;AN000; | ||
| 1233 | CALL MONO ;AN000; | ||
| 1234 | .ELSE ;AN000; | ||
| 1235 | .IF <ANSI_installed EQ true> THEN ;AN000; | ||
| 1236 | ;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000; | ||
| 1237 | .IF <parm_list_BX[DI].value1 EQ <OFFSET fourty_str>> THEN ;AN000; | ||
| 1238 | MOV IOCTL0C_data_block.cols,40 ;setup IOCTL input block with the columns requested ;AN000; | ||
| 1239 | .ELSE | ||
| 1240 | MOV IOCTL0C_data_block.cols,80 ;setup IOCTL input block with the columns requested ;AN000; | ||
| 1241 | .ENDIF ;AN000; | ||
| 1242 | CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000; | ||
| 1243 | .ELSE | ||
| 1244 | .IF <parm_list_BX[DI].item_tag EQ fourty_item_tag> THEN ;IF 40 REQUESTED ;AN000; | ||
| 1245 | MOV BL,40 ;set up for handle_40_or_80 ;AN000; | ||
| 1246 | .ELSE ;AN000; | ||
| 1247 | MOV BL,80 ;set up for handle_40_or_80 ;AN000; | ||
| 1248 | .ENDIF ;AN000; | ||
| 1249 | CALL HANDLE_40_OR_80 ;AN000; | ||
| 1250 | .ENDIF | ||
| 1251 | .ENDIF ;AN000; | ||
| 1252 | .ENDIF | ||
| 1253 | |||
| 1254 | dummy9: | ||
| 1255 | PUBLIC dummy9 | ||
| 1256 | ;AN000; | ||
| 1257 | POP DI ;restore parm list index ;AN000; | ||
| 1258 | |||
| 1259 | .IF <NOERROR EQ TRUE> AND ;process ,r ³ l,[T] ;AN000; | ||
| 1260 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 1261 | ADD DI,TYPE parm_list_entry ;process second parm, shift direction ;AN000; | ||
| 1262 | .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000; | ||
| 1263 | .IF <parm_list_BX[DI].item_tag EQ R_item_tag> OR ;AN000; | ||
| 1264 | .IF <parm_list_BX[DI].item_tag EQ L_item_tag> THEN ;AN000; | ||
| 1265 | MOV CL,parm_list_BX[DI].item_tag ;AN000; | ||
| 1266 | MOV PARM2,CL ;set up for SHIFT_SCREEN ;AN000; | ||
| 1267 | ADD DI,TYPE parm_list_entry ;look at third parm ;AN000; | ||
| 1268 | MOV CL,parm_list_BX[DI].item_tag ;CL=T_item_tag or bogus ;AN000; | ||
| 1269 | MOV PARM3,CL ;may be bogus, but shift_screen will handle it correctly ;AN000; | ||
| 1270 | CALL SHIFT_SCREEN ;AN000; | ||
| 1271 | .ELSE ;AN000;must be a rows value | ||
| 1272 | .IF <ANSI_installed EQ true> THEN ;AN000; | ||
| 1273 | ;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000; | ||
| 1274 | MOV DX,parm_list_BX[DI].value1 ;AN000; | ||
| 1275 | MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000; | ||
| 1276 | CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000; | ||
| 1277 | .ELSE ;AN000;ANSI not installed ;AN000; | ||
| 1278 | DISPLAY ANSI_not_loaded ;AN000; | ||
| 1279 | MOV noerror,false ;AN000; | ||
| 1280 | .ENDIF ;AN000;ANSI installed ;AN000; | ||
| 1281 | .ENDIF ;AN000; | ||
| 1282 | .ENDIF ;AN000; | ||
| 1283 | ;AN000; | ||
| 1284 | BREAK 0 ;AN000; | ||
| 1285 | |||
| 1286 | |||
| 1287 | ;AN000; | ||
| 1288 | PUBLIC printer_reroute_case | ||
| 1289 | ;AN000; | ||
| 1290 | printer_reroute_case: | ||
| 1291 | ;INPUT:lptno=zero based printer number OUTPUT:;AH=printer number mask: lpt1=1, lpt2=2, lpt3=4 ;AN000; | ||
| 1292 | ;device=COM number in ASCII form ;SI=printer number value (one based) ;AN000; | ||
| 1293 | ;AL=com number character ;AN000; | ||
| 1294 | XOR CX,CX | ||
| 1295 | MOV CL,lptno ;lptno always <= 255 | ||
| 1296 | MOV SI,CX ;SI=zero based printer number (0, 1, or 2) ;AN000; | ||
| 1297 | INC SI ;SI=one based printer number (1, 2, or 3) ;AN000; | ||
| 1298 | MOV AH,1 ;AN000; | ||
| 1299 | SAL AH,CL ;AH=2**SI,AH=printer number mask for MODEECHO ;AN000; | ||
| 1300 | MOV DH,CL | ||
| 1301 | ADD DH,ASCII_1 ;DH=ASCII printer number ;AN000; | ||
| 1302 | MOV AL,device ;AL=ASCII form of com device number ;AN000; | ||
| 1303 | MOV REDPT,DH ;PUT n OF LPTn IN REDIRECT MESSAGE | ||
| 1304 | MOV NOTREDPT,DH ;AND INTO NOT REDIRECTED MSG | ||
| 1305 | CALL modeecho ;AN000; | ||
| 1306 | ;AN000; | ||
| 1307 | BREAK 0 ;AN000; | ||
| 1308 | ;AN000; | ||
| 1309 | ;AN000; | ||
| 1310 | ;AN000; | ||
| 1311 | printer_status_case: ;AN000; | ||
| 1312 | |||
| 1313 | PUBLIC printer_status_case | ||
| 1314 | |||
| 1315 | ; INPUT: device_type = LPTx | ||
| 1316 | ; device = ASCII printer number | ||
| 1317 | ; lptno = ASCII printer number | ||
| 1318 | ; device_name = offset of printer string | ||
| 1319 | ;AN000; | ||
| 1320 | |||
| 1321 | MOV cp_cb.request_typ,status ;AN000; | ||
| 1322 | MOV AX,device_name ;AN000; | ||
| 1323 | MOV stat_dev_ptr,AX ;AC665;set up msg ser input ;AN000; | ||
| 1324 | MOV dev_name_size,len_LPTX_str ;AN000;set up for msg service, see MODEPARS.ASM ;AN000; | ||
| 1325 | MOV cp_cb.cp_device,AX ;AN665;set up for call to modecp ;AN000; | ||
| 1326 | ;AN000; | ||
| 1327 | .IF <device_name EQ <OFFSET LPT1_str>> THEN ;AN000; | ||
| 1328 | MOV device_request,lpt1_retry_type_status ;AN000; | ||
| 1329 | MOV rerouted_printer_mask,LPT1 | ||
| 1330 | MOV redpt,"1" ;set up for reroute message | ||
| 1331 | MOV notredpt,"1" ;set up for not rerouted message | ||
| 1332 | .ELSEIF <device_name EQ <OFFSET LPT2_str>> THEN ;AN000; | ||
| 1333 | MOV device_request,lpt2_retry_type_status ;AN000; | ||
| 1334 | MOV rerouted_printer_mask,LPT2 | ||
| 1335 | MOV redpt,"2" ;set up for reroute message | ||
| 1336 | MOV notredpt,"2" ;set up for not rerouted message | ||
| 1337 | .ELSEIF <device_name EQ <OFFSET LPT3_str>> THEN ;AN000; | ||
| 1338 | MOV device_request,lpt3_retry_type_status ;AN000; | ||
| 1339 | MOV rerouted_printer_mask,LPT3 | ||
| 1340 | MOV redpt,"3" ;set up for reroute message | ||
| 1341 | MOV notredpt,"3" ;set up for not rerouted message | ||
| 1342 | .ENDIF ;AN000; | ||
| 1343 | ;AN000; | ||
| 1344 | PUSH ES ;save ES, used in MODECP ;AC002; | ||
| 1345 | ;AC002;PUSH AX ;AN000;save | ||
| 1346 | ;AN000; | ||
| 1347 | display status_for_device ;AN000; | ||
| 1348 | display long_underline "Status for device LPTX?" ;AN000; | ||
| 1349 | display five_char_underline ;has CRLF on it ----------------------- ;AN000; | ||
| 1350 | call display_printer_reroute_status ;see modeecho.asm ;AN000; | ||
| 1351 | ;AC002;POP AX ;restore "device_request" ;AN000; | ||
| 1352 | XOR CX,CX ;initialize prn_ports_attached ;AN000; | ||
| 1353 | CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached ;AN000; | ||
| 1354 | POP ES ;restore ES ;AC002; | ||
| 1355 | ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number ;AN000; | ||
| 1356 | .IF <prn_ports_attached GE redpt> THEN ;IF the printer exists THEN ;AN000; | ||
| 1357 | call get_device_retry_type ;AN000; | ||
| 1358 | display retry_equal ;AN000; | ||
| 1359 | CALL modecp ;display codepage status ;AN000; | ||
| 1360 | .ENDIF ;AN000; | ||
| 1361 | ;AN000; | ||
| 1362 | BREAK 0 ;AN000; | ||
| 1363 | ;AN000; | ||
| 1364 | ;m ;AN000; | ||
| 1365 | set_con_features_case: ;the command line was nothing but con keywords ;AN000; | ||
| 1366 | ;AN000; | ||
| 1367 | ;first see if ANSI.SYS is loaded ;AN000; | ||
| 1368 | CALL check_ANSI_installed ;AC001; | ||
| 1369 | .IF <ANSI_installed EQ true> THEN ;AC001; | ||
| 1370 | MOV CL,get_current_settings ;AN000; | ||
| 1371 | CALL do_IOCTL0C ;get current settings of CON ;AN000; | ||
| 1372 | ;MOV SI,OFFSET IOCTL0C_data_block ;set up IOCTL0C, addressablitiy to the IOCTL data block ;AN000; | ||
| 1373 | ;AN000; | ||
| 1374 | MOV IOCTL0C_data_block.mode,text ;AN000; | ||
| 1375 | ;AN000; | ||
| 1376 | .ENDIF ;ANSI.SYS installed ;AN000; | ||
| 1377 | ;AN000; | ||
| 1378 | MOV BX,parm_list_holder ;restore parm_list_BX ;AN000; | ||
| 1379 | ADD DI,TYPE parm_list_entry ;skip CON parm ;AN000; | ||
| 1380 | .WHILE <parm_list_BX[DI].parm_type NE bogus> DO NEAR ;the entry after the last has parm_type of bogus ;AN000; | ||
| 1381 | ;AN000; | ||
| 1382 | ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000; | ||
| 1383 | ;AN000; | ||
| 1384 | ;AN000; | ||
| 1385 | ;LINES_equal: ;AN000; | ||
| 1386 | ;AN000; | ||
| 1387 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET LINES_equal>> THEN ;AN000; | ||
| 1388 | ;AN000; | ||
| 1389 | MOV DX,parm_list_BX[DI].value1 ;AN000; | ||
| 1390 | MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000; | ||
| 1391 | MOV need_IOCTL0C,true ;AN000; | ||
| 1392 | BREAK 1 ;AN000; | ||
| 1393 | ;AN000; | ||
| 1394 | .ENDIF ;AN000; | ||
| 1395 | ;AN000; | ||
| 1396 | ;AN000; | ||
| 1397 | ;COLUMNS_equal: ;the value is binary ;AN000; | ||
| 1398 | ;AN000; | ||
| 1399 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000; | ||
| 1400 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> THEN ;AN000; | ||
| 1401 | ;AN000; | ||
| 1402 | .IF <ANSI_installed EQ true> THEN ;AN000; | ||
| 1403 | MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000; | ||
| 1404 | MOV DX,parm_list_BX[DI].value1 ;AN000; | ||
| 1405 | MOV IOCTL0C_data_block.cols,DX ;the IOCTL input block has the columns requested ;AN000; | ||
| 1406 | .ELSE | ||
| 1407 | .IF <parm_list_BX[DI].item_tag EQ fourty_item_tag> THEN ;IF 40 REQUESTED ;AN000; | ||
| 1408 | MOV columns_specified,40 ;set up for handle_40_or_80 ;AN000; | ||
| 1409 | .ELSE ;AN000; | ||
| 1410 | MOV columns_specified,80 ;set up for handle_40_or_80 ;AN000; | ||
| 1411 | .ENDIF ;AN000; | ||
| 1412 | .ENDIF | ||
| 1413 | BREAK 1 ;AN000; | ||
| 1414 | ;AN000; | ||
| 1415 | .ENDIF ;AN000; | ||
| 1416 | ;AN000; | ||
| 1417 | ;AN000; | ||
| 1418 | ;RATE_equal: ;AN000; | ||
| 1419 | ;AN000; | ||
| 1420 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RATE_equal>> THEN ;AN000; | ||
| 1421 | ;AN000; | ||
| 1422 | MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save the rate requested in binary form, always <255 ;AN000; | ||
| 1423 | MOV rate_holder,AL ;AN000; | ||
| 1424 | MOV need_typamat_call,true ;AN000; | ||
| 1425 | BREAK 1 ;AN000; | ||
| 1426 | ;AN000; | ||
| 1427 | .ENDIF ;AN000; | ||
| 1428 | ;AN000; | ||
| 1429 | ;AN000; | ||
| 1430 | ;DELAY_equal: ;AN000; | ||
| 1431 | ;AN000; | ||
| 1432 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DELAY_equal>> OR ;AN000; | ||
| 1433 | .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DEL_equal>> THEN ;AN000; | ||
| 1434 | ;AN000; | ||
| 1435 | MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save delay requested (binary), always <255 ;AN000; | ||
| 1436 | MOV delay_holder,AL ;AN000; | ||
| 1437 | MOV need_typamat_call,true ;AN000; | ||
| 1438 | BREAK 1 ;AN000; | ||
| 1439 | ;AN000; | ||
| 1440 | .ENDIF ;AN000; | ||
| 1441 | ;AN000; | ||
| 1442 | ENDCASE_1: ;AN000; | ||
| 1443 | ;AN000; | ||
| 1444 | ADD DI,TYPE parm_list_entry ;address next parm ;AN000; | ||
| 1445 | ;AN000; | ||
| 1446 | .ENDWHILE ;AN000; | ||
| 1447 | ;AN000; | ||
| 1448 | DUMMY3: ;AN000; | ||
| 1449 | PUBLIC DUMMY3 ;AN000; | ||
| 1450 | ;AN000; | ||
| 1451 | .IF <need_IOCTL0C EQ true> THEN ;AN000; | ||
| 1452 | .IF <ANSI_installed EQ true> THEN ;AN000; | ||
| 1453 | MOV CL,set_display_characteristics ;AN000; | ||
| 1454 | CALL do_IOCTL0C ;AN000; | ||
| 1455 | .IF C THEN ;AN000; | ||
| 1456 | get_extended_error ;AN000; | ||
| 1457 | .IF <AX EQ not_supported_on_machine> THEN ;AN000; | ||
| 1458 | DISPLAY Function_not_supported ;AN000; | ||
| 1459 | .ELSEIF <AX EQ font_not_loaded> THEN ;AN000; | ||
| 1460 | DISPLAY Required_font_not_loaded ;AN000; | ||
| 1461 | .ENDIF ;AN000; | ||
| 1462 | MOV noerror,false ;AN000; | ||
| 1463 | .ENDIF ;AN000; | ||
| 1464 | .ELSE ;AN000; | ||
| 1465 | DISPLAY ANSI_not_loaded ;AN000; | ||
| 1466 | MOV noerror,false ;AN000; | ||
| 1467 | .ENDIF ;AN000; | ||
| 1468 | .ELSEIF <columns_specified NE false> THEN ;AN000; | ||
| 1469 | MOV BL,columns_specified ;set up for call to handle_40_or_80 ;AN000; | ||
| 1470 | CALL HANDLE_40_OR_80 ;AN000; | ||
| 1471 | .ENDIF ;AN000; | ||
| 1472 | |||
| 1473 | .IF <need_typamat_call EQ true> THEN ;AN000; | ||
| 1474 | MOV BL,rate_holder ;AN000; | ||
| 1475 | MOV BH,delay_holder ;AN000; | ||
| 1476 | CALL typamat ;AN000; | ||
| 1477 | .ENDIF ;AN000; | ||
| 1478 | ;AN000; | ||
| 1479 | BREAK 0 ;AN000; | ||
| 1480 | ;AN000; | ||
| 1481 | ;AN000; | ||
| 1482 | status_for_everything_case: ;AN000; | ||
| 1483 | ;AN000; | ||
| 1484 | MOV request_type,printer_status ;status routine for printers ;AN000; | ||
| 1485 | MOV device_name,OFFSET LPT1_str ;will display the reroute ;AN000; | ||
| 1486 | CALL analyze_and_invoke ;status for the printer whether ;AN000; | ||
| 1487 | MOV device_name,OFFSET LPT2_str ;it exists or not, so call for ;AN000; | ||
| 1488 | CALL analyze_and_invoke ;all of them ;AN000; | ||
| 1489 | MOV device_name,OFFSET LPT3_str ;AN000; | ||
| 1490 | CALL analyze_and_invoke ;AN000; | ||
| 1491 | ;AN000; | ||
| 1492 | MOV request_type,all_con_status ;AN000; | ||
| 1493 | CALL analyze_and_invoke ;AN000; | ||
| 1494 | |||
| 1495 | CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000; | ||
| 1496 | |||
| 1497 | MOV request_type,com_status ;AN000; | ||
| 1498 | MOV CL,com_ports_attached ;AN000; | ||
| 1499 | .FOR i = 1 TO CL ;AN000; | ||
| 1500 | |||
| 1501 | .SELECT ;AN000; | ||
| 1502 | |||
| 1503 | .WHEN <i EQ 1> ;AN000; | ||
| 1504 | MOV device_name,OFFSET COM1_str ;AN000; ;AN000; | ||
| 1505 | |||
| 1506 | .WHEN <i EQ 2> ;AN000; | ||
| 1507 | MOV device_name,OFFSET COM2_str ;AN000; | ||
| 1508 | |||
| 1509 | .WHEN <i EQ 3> ;AN000; | ||
| 1510 | MOV device_name,OFFSET COM3_str ;AN000; | ||
| 1511 | |||
| 1512 | .WHEN <i EQ 4> ;AN000; | ||
| 1513 | MOV device_name,OFFSET COM4_str ;AN0;AN000; | ||
| 1514 | |||
| 1515 | .ENDSELECT ;AN000; | ||
| 1516 | |||
| 1517 | CALL analyze_and_invoke ;AN000; ;AN000; | ||
| 1518 | .NEXT i ;AN000; | ||
| 1519 | |||
| 1520 | BREAK 0 ;AN000; | ||
| 1521 | |||
| 1522 | |||
| 1523 | |||
| 1524 | turn_off_reroute_case: ;user specified only LPTx[:] ;AN000; | ||
| 1525 | ;INPUT:lptno=ASCII printer number | ||
| 1526 | |||
| 1527 | |||
| 1528 | |||
| 1529 | CALL modeecno ;turn off rerouting ;AN000; | ||
| 1530 | XOR CX,CX ;initialize prn_ports_attached | ||
| 1531 | CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached | ||
| 1532 | ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number | ||
| 1533 | .IF <prn_ports_attached GE LPTNO> THEN ;IF the printer exists THEN | ||
| 1534 | CALL set_retry_type ;turn off infinit retry ;AN000; | ||
| 1535 | CALL modify_resident_code ;modify resident code to reflect retry turned off ;AN000; | ||
| 1536 | .ENDIF | ||
| 1537 | |||
| 1538 | BREAK 0 ;AN000; | ||
| 1539 | |||
| 1540 | ;AN000; | ||
| 1541 | ENDCASE_0: ;AN000; | ||
| 1542 | ;AN000; | ||
| 1543 | RET ;AN000; | ||
| 1544 | ;AN000; | ||
| 1545 | analyze_and_invoke ENDP ;AN000; | ||
| 1546 | ;AN000; | ||
| 1547 | ;AN000; | ||
| 1548 | PRINTF_CODE ENDS ;AN000; | ||
| 1549 | 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 @@ | |||
| 1 | ;m | ||
| 2 | PAGE ,132 ; | ||
| 3 | TITLE MODE COMMAND - MAIN PROCEDURE AND COMMAND PARSING | ||
| 4 | .XLIST | ||
| 5 | INCLUDE STRUC.INC | ||
| 6 | .LIST | ||
| 7 | ;.SALL | ||
| 8 | |||
| 9 | |||
| 10 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 11 | ;º º | ||
| 12 | |||
| 13 | ; AC001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 14 | ; implement the SYSGETMSG method of getting addressability to | ||
| 15 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 16 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 17 | ; address is then put in the sublist block for the message | ||
| 18 | ; being issued. | ||
| 19 | |||
| 20 | ; AN002 - P4011: Need to close all open handles before terminating and staying | ||
| 21 | ; resident so don't eat into the total available handles for the | ||
| 22 | ; system. | ||
| 23 | ;º º | ||
| 24 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 25 | |||
| 26 | INCLUDE SYSMSG.INC | ||
| 27 | |||
| 28 | MSG_UTILNAME <MODE> | ||
| 29 | |||
| 30 | |||
| 31 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 32 | ;º º | ||
| 33 | |||
| 34 | false EQU 00H | ||
| 35 | STDIN EQU 0 ;AN002;handle for standard input device | ||
| 36 | STDPRN EQU 4 ;AN002;handle for standard printer device | ||
| 37 | TERMINATE EQU 4CH ;INT 21 "TERMINATE RETURNING CODE" FUNCTION | ||
| 38 | terminate_and_stay_resident EQU 31H ;INT 21 "terminate and remain resident" | ||
| 39 | truu EQU 0FFH | ||
| 40 | |||
| 41 | ;º º | ||
| 42 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 43 | |||
| 44 | |||
| 45 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 46 | ;º º | ||
| 47 | |||
| 48 | |||
| 49 | ;º º | ||
| 50 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 51 | |||
| 52 | |||
| 53 | PAGE | ||
| 54 | PRINTF_CODE SEGMENT PUBLIC | ||
| 55 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE | ||
| 56 | |||
| 57 | |||
| 58 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 59 | ;º º | ||
| 60 | |||
| 61 | PUBLIC main | ||
| 62 | PUBLIC SYSDISPMSG | ||
| 63 | PUBLIC SYSGETMSG | ||
| 64 | |||
| 65 | |||
| 66 | ;º º | ||
| 67 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 68 | |||
| 69 | |||
| 70 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 71 | ;º º | ||
| 72 | |||
| 73 | EXTRN analyze_and_invoke:NEAR | ||
| 74 | EXTRN get_machine_type:NEAR ;get model and sub-model bytes | ||
| 75 | EXTRN initialize_sublists:NEAR ;see display.asm | ||
| 76 | EXTRN move_destination:ABS ;location of res code after it has been moved | ||
| 77 | EXTRN noerror:BYTE | ||
| 78 | EXTRN parse_parameters:NEAR | ||
| 79 | EXTRN PRINTF:NEAR | ||
| 80 | EXTRN rescode_length:ABS ;length in paragraphs of the resident code | ||
| 81 | EXTRN stay_resident:BYTE ;boolean indicating just loaded resident code see 'rescode' | ||
| 82 | |||
| 83 | ;º º | ||
| 84 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 85 | |||
| 86 | |||
| 87 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 88 | ;º º | ||
| 89 | |||
| 90 | |||
| 91 | DB "The MODE command " | ||
| 92 | DB "--------------------------------------------------------------" | ||
| 93 | |||
| 94 | ;º º | ||
| 95 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 96 | |||
| 97 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O C E D U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 98 | ;º º | ||
| 99 | |||
| 100 | close_handles PROC NEAR ;AN002;close all standard device handles | ||
| 101 | ;AN002; | ||
| 102 | MOV AH,3EH ;AN002; | ||
| 103 | ;AN002; | ||
| 104 | .FOR BX = STDIN TO STDPRN ;AN002; | ||
| 105 | INT 21H ;AN002; | ||
| 106 | .NEXT BX ;AN002; | ||
| 107 | ;AN002; | ||
| 108 | RET ;AN002; | ||
| 109 | ;AN002; | ||
| 110 | close_handles ENDP ;AN002; | ||
| 111 | |||
| 112 | ;º º | ||
| 113 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O C E D U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 114 | |||
| 115 | |||
| 116 | ; | ||
| 117 | ;------------------------------------------------------------------------------- | ||
| 118 | |||
| 119 | MSG_SERVICES <MSGDATA> ;define message service data area | ||
| 120 | |||
| 121 | MSG_SERVICES <LOADmsg,GETmsg,DISPLAYmsg,CHARmsg,NUMmsg,INPUTmsg> ;AC001; | ||
| 122 | MSG_SERVICES <mode.cla,mode.clb,mode.cl1,mode.cl2> ;class B is for messages > 30 | ||
| 123 | ;;RPS MSG_SERVICES <mode.cl1,mode.cl2> | ||
| 124 | |||
| 125 | |||
| 126 | main PROC NEAR | ||
| 127 | |||
| 128 | CALL SYSLOADMSG ;load the message text | ||
| 129 | .IF NC THEN ;IF messages loaded successfully THEN | ||
| 130 | CALL get_machine_type | ||
| 131 | CALL initialize_sublists | ||
| 132 | CALL parse_parameters | ||
| 133 | .IF <noerror EQ truu> THEN ;no problems parsing so continue | ||
| 134 | CALL analyze_and_invoke ;semantically analyze the parms and invoke appropriate routine | ||
| 135 | .ENDIF | ||
| 136 | |||
| 137 | MOV AH,TERMINATE ;assume won't stay resident | ||
| 138 | .IF <noerror EQ false> THEN | ||
| 139 | MOV AL,1 ;had a problem somewhere | ||
| 140 | .ELSE | ||
| 141 | .IF <stay_resident EQ truu> THEN | ||
| 142 | CALL close_handles ;close all standard devices;AN002; | ||
| 143 | MOV DX,move_destination | ||
| 144 | MOV CL,4 ;4 right shifts = divide by 16 | ||
| 145 | SAR DX,CL ;DX=offset of start of resident code in paragraphs | ||
| 146 | ;SET END OF RESIDENT CODE FOR "terminate and remain resident" | ||
| 147 | ;TO first usable | ||
| 148 | ADD DX,rescode_length ;BYTE OF PROGRAM segment PREFIX | ||
| 149 | MOV AH,terminate_and_stay_resident | ||
| 150 | .ENDIF | ||
| 151 | MOV AL,0 ;all went well | ||
| 152 | .ENDIF | ||
| 153 | .ELSE ;ABORT | ||
| 154 | |||
| 155 | CALL SYSDISPMSG ;display some "I'm crashing" message | ||
| 156 | |||
| 157 | .ENDIF | ||
| 158 | |||
| 159 | |||
| 160 | INT 21H ;TERMINATE RETURNING ERRORLEVEL INDICATING success | ||
| 161 | RET | ||
| 162 | |||
| 163 | include msgdcl.inc | ||
| 164 | |||
| 165 | main ENDP | ||
| 166 | |||
| 167 | PRINTF_CODE ENDS | ||
| 168 | 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 @@ | |||
| 1 | #************************** makefile for cmd\... *************************** | ||
| 2 | |||
| 3 | msg =..\..\messages | ||
| 4 | dos =..\..\dos | ||
| 5 | inc =..\..\inc | ||
| 6 | hinc =..\..\h | ||
| 7 | |||
| 8 | # | ||
| 9 | ####################### dependencies begin here. ######################### | ||
| 10 | # | ||
| 11 | |||
| 12 | all: mode.com | ||
| 13 | |||
| 14 | mode.ctl: mode.skl \ | ||
| 15 | makefile \ | ||
| 16 | $(msg)\$(COUNTRY).msg | ||
| 17 | |||
| 18 | |||
| 19 | main.obj: main.asm \ | ||
| 20 | makefile \ | ||
| 21 | $(inc)\copyrigh.inc \ | ||
| 22 | $(inc)\versiona.inc \ | ||
| 23 | $(inc)\struc.inc \ | ||
| 24 | $(inc)\sysmsg.inc \ | ||
| 25 | $(inc)\msgserv.asm \ | ||
| 26 | mode.ctl \ | ||
| 27 | mode.cl1 \ | ||
| 28 | mode.cl2 \ | ||
| 29 | mode.cla \ | ||
| 30 | mode.clb | ||
| 31 | |||
| 32 | scrntab.obj: scrntab.asm \ | ||
| 33 | makefile | ||
| 34 | |||
| 35 | modescrn.obj: modescrn.asm \ | ||
| 36 | makefile \ | ||
| 37 | $(inc)\struc.inc | ||
| 38 | |||
| 39 | rescode.obj: rescode.asm \ | ||
| 40 | makefile \ | ||
| 41 | $(inc)\struc.inc | ||
| 42 | |||
| 43 | modecom.obj: modecom.asm \ | ||
| 44 | makefile \ | ||
| 45 | $(inc)\struc.inc \ | ||
| 46 | modequat.inc \ | ||
| 47 | common.stc | ||
| 48 | |||
| 49 | modeprin.obj: modeprin.asm \ | ||
| 50 | makefile \ | ||
| 51 | $(inc)\struc.inc | ||
| 52 | |||
| 53 | modevid.obj: modevid.asm \ | ||
| 54 | makefile \ | ||
| 55 | $(inc)\struc.inc | ||
| 56 | |||
| 57 | modeecho.obj: modeecho.asm \ | ||
| 58 | makefile \ | ||
| 59 | common.stc \ | ||
| 60 | $(inc)\struc.inc | ||
| 61 | |||
| 62 | modeleng.obj: modeleng.asm \ | ||
| 63 | modequat.inc \ | ||
| 64 | makefile \ | ||
| 65 | $(inc)\struc.inc | ||
| 66 | |||
| 67 | modemes.obj: modemes.asm \ | ||
| 68 | makefile \ | ||
| 69 | $(inc)\msgserv.asm \ | ||
| 70 | modesubs.inc \ | ||
| 71 | modedefs.inc \ | ||
| 72 | modequat.inc \ | ||
| 73 | common.stc | ||
| 74 | |||
| 75 | display.obj: display.asm \ | ||
| 76 | makefile \ | ||
| 77 | common.stc | ||
| 78 | |||
| 79 | typamat.obj: typamat.asm \ | ||
| 80 | makefile \ | ||
| 81 | $(inc)\struc.inc \ | ||
| 82 | modequat.inc | ||
| 83 | |||
| 84 | invoke.obj: invoke.asm \ | ||
| 85 | makefile \ | ||
| 86 | $(inc)\struc.inc \ | ||
| 87 | modequat.inc \ | ||
| 88 | common.stc | ||
| 89 | |||
| 90 | modepars.obj: modepars.asm \ | ||
| 91 | makefile \ | ||
| 92 | $(inc)\struc.inc \ | ||
| 93 | $(inc)\psdata.inc \ | ||
| 94 | modequat.inc \ | ||
| 95 | common.stc | ||
| 96 | |||
| 97 | |||
| 98 | parshell.obj: parshell.asm \ | ||
| 99 | makefile \ | ||
| 100 | $(inc)\parse.asm | ||
| 101 | |||
| 102 | |||
| 103 | modecp.obj: modecp.asm \ | ||
| 104 | makefile \ | ||
| 105 | modecpro.inc \ | ||
| 106 | modecpeq.inc \ | ||
| 107 | modecpms.inc \ | ||
| 108 | $(inc)\struc.inc | ||
| 109 | |||
| 110 | mode.com: main.obj \ | ||
| 111 | makefile \ | ||
| 112 | scrntab.obj \ | ||
| 113 | modescrn.obj \ | ||
| 114 | rescode.obj \ | ||
| 115 | modecom.obj \ | ||
| 116 | modeprin.obj \ | ||
| 117 | modevid.obj \ | ||
| 118 | modeleng.obj \ | ||
| 119 | modeecho.obj \ | ||
| 120 | modecp.obj \ | ||
| 121 | display.obj \ | ||
| 122 | typamat.obj \ | ||
| 123 | invoke.obj \ | ||
| 124 | parshell.obj \ | ||
| 125 | modepars.obj \ | ||
| 126 | modemes.obj \ | ||
| 127 | mode.lnk | ||
| 128 | link @mode.lnk | ||
| 129 | exe2bin mode.exe mode.com | ||
| 130 | 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 @@ | |||
| 1 | /MAP RESCODE+ | ||
| 2 | MODEECHO+ | ||
| 3 | MODELENG+ | ||
| 4 | MODEMES+ | ||
| 5 | MODESCRN+ | ||
| 6 | MAIN+ | ||
| 7 | MODEVID+ | ||
| 8 | MODEPRIN+ | ||
| 9 | MODECOM+ | ||
| 10 | SCRNTAB+ | ||
| 11 | MODECP+ | ||
| 12 | DISPLAY+ | ||
| 13 | TYPAMAT+ | ||
| 14 | INVOKE+ | ||
| 15 | PARSHELL+ | ||
| 16 | MODEPARS,MODE; | ||
| 17 | \ 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 @@ | |||
| 1 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 2 | ;º º | ||
| 3 | |||
| 4 | ; AN001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 5 | ; implement the SYSGETMSG method of getting addressability to | ||
| 6 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 7 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 8 | ; address is then put in the sublist block for the message | ||
| 9 | ; being issued. | ||
| 10 | |||
| 11 | ;º º | ||
| 12 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 13 | |||
| 14 | |||
| 15 | :util MODE ;AN000; | ||
| 16 | ;AN000; | ||
| 17 | :class 1 ;AN000; | ||
| 18 | ;AN000; | ||
| 19 | ;:use extend3 ;AN000; | ||
| 20 | ;:use extend15 ;AN000; | ||
| 21 | ;AN000; | ||
| 22 | :class 2 ;AN000; | ||
| 23 | ;AN000; | ||
| 24 | ;:use parse1 ;AN000; | ||
| 25 | ;:use parse3 ;Invalid switch | ||
| 26 | ;:use parse7 ;AN000; | ||
| 27 | ;:use parse8 ;AN000; | ||
| 28 | ;AN000; | ||
| 29 | ;AN000; | ||
| 30 | :class A ;Transient messages, all MODE's messages are transient ;AN000; | ||
| 31 | ;AN000; | ||
| 32 | :use 1 COMMON1 ;"Incorrect DOS Version" ;AN000; | ||
| 33 | :use 2 extend1 ;AN000; | ||
| 34 | :def 3 CR,LF,"Must specify COM1, COM2, COM3 or COM4",CR,LF ;AN000; | ||
| 35 | :def 4 CR,LF,"Resident portion of MODE loaded",CR,LF ;AN000; | ||
| 36 | :def 5 CR,LF,"Illegal device name",CR,LF ;AN000; | ||
| 37 | :def 6 CR,LF,"Printer error",CR,LF ;AN000; | ||
| 38 | :def 7 CR,LF,"LPT%1: set for 80",CR,LF ;AN000; | ||
| 39 | :def 8 CR,LF,"LPT%1: set for 132",CR,LF ;AN000; | ||
| 40 | :def 9 CR,LF,"Printer lines per inch set",CR,LF ;AN000; | ||
| 41 | :def 10 CR,LF,"Invalid baud rate specified",CR,LF ;AN000; | ||
| 42 | :def 11 CR,LF,"COM%1: %2,%3,%4,%5,%6",CR,LF ;AN000; | ||
| 43 | ; DEVICE - 1, 2, 3 or 4 ;AN000; | ||
| 44 | ; BAUD - 110, 150, 300, 600, 1200, 2400, 4800, 9600 etc. ;AN000; | ||
| 45 | ; PARITY - n, o, e etc ;AN000; | ||
| 46 | ; DATA - 5, 6, 7, or 8 ;AN000; | ||
| 47 | ; STOP - 1, 1.5 or 2 ;AN000; | ||
| 48 | ; P - old retry indication ;AN000; | ||
| 49 | :def 12 "0123456789" ;AN000; | ||
| 50 | :def 13 CR,LF,"Do you see the %1? (YES/NO)",CR,LF ;AN000; | ||
| 51 | ;"rightmost 9?" ;goes at the end of "Do you see the" ;AN000; | ||
| 52 | ;"leftmost 0?" ;goes at the end of "Do you see the" ;AN000; | ||
| 53 | ; Fourteen used to be "Invalid parameters", now use message 54 for those cases. | ||
| 54 | :def 15 "LPT%1: rerouted to COM%2:",CR,LF ;AN000; | ||
| 55 | :def 16 "LPT%1: not rerouted",CR,LF ;AN000; | ||
| 56 | :def 17 CR,LF,"%1 retry on parallel printer time-out",CR,LF ;AN000; | ||
| 57 | ; ONE OF THE FOLLOWING TWO WORDS IS INSERTED: ;AN000; | ||
| 58 | ;"No" ;goes before "retry on parallel printer time-out" ;AN000; | ||
| 59 | ;"Infinite" ;goes before "retry on parallel printer time-out" ;AN000; | ||
| 60 | :def 18 CR,LF," Unable to shift screen %1",CR,LF ;AN000; | ||
| 61 | ;"left" ;goes at the end of "Unable to shift screen" ;AN000; | ||
| 62 | ;"right" ;goes at the end of "Unable to shift screen" ;AN000; | ||
| 63 | ; ;The offending_parameter is determined by parsing logic ;AN000; | ||
| 64 | :use 19 PARSE10 ;"Invalid parameter - %1",CR,LF ;AN000; | ||
| 65 | :def 20 CR,LF,"Invalid number of parameters",CR,LF ;AN000; | ||
| 66 | :def 21 CR,LF,"NET 042: Unable to do requested command",CR,LF ;AN000; | ||
| 67 | :def 22 CR,LF,"Infinite retry not supported on Network printer",cr,lf ;AN000; | ||
| 68 | :def 23 CR,LF,"Failure to access code page Font File",CR,LF ;AN000; | ||
| 69 | ;%1 FILLED IN WITH PTR TO DEVICE NAME ;AN000; | ||
| 70 | :def 24 CR,LF,"Failure to access device: %1",CR,LF ;AN000; | ||
| 71 | :def 25 CR,LF,"Device or code page missing from font file",CR,LF ;AN000; | ||
| 72 | :def 26 CR,LF,"Font file contents invalid",CR,LF ;AN000; | ||
| 73 | :def 27 CR,LF,"Previously prepared code page replaced",CR,LF ;AN000; | ||
| 74 | :def 28 CR,LF,"Active code page for device %1 is %2",CR,LF ;AN000; | ||
| 75 | ;%1 FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME ;AN000; | ||
| 76 | ;%2 FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID ;AN000; | ||
| 77 | :def 29 CR,LF,"Device %1 not prepared",CR,LF ;AN000; | ||
| 78 | ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME ;AN000; | ||
| 79 | ;"hardware" ;used before "codepages:" ;AN000; | ||
| 80 | ;"prepared" ;AN000; | ||
| 81 | ;AN000; | ||
| 82 | :class B ;nothing special, just too many messages for one class ;AN000; | ||
| 83 | ;AN000; | ||
| 84 | :def 30 "%1 code pages:",CR,LF ;AN000; | ||
| 85 | :def 31 " code page %1",CR,LF ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID ;AN000; | ||
| 86 | :def 32 CR,LF,"MODE %1 code page function completed",CR,LF ;AN000; | ||
| 87 | ;FILLED IN with one of: ;AN000; | ||
| 88 | ; "Status" ;AN000; | ||
| 89 | ; "Prepare" ;AN000; | ||
| 90 | ; "Select" ;AN000; | ||
| 91 | ; "Refresh" ;AN000; | ||
| 92 | ;AN000; | ||
| 93 | :def 33 CR,LF,"Current code page settings:",CR,LF ;table header ;AN000; | ||
| 94 | ;AN000; | ||
| 95 | :def 34 " %1 - %2 code page",CR,LF ;AN000; | ||
| 96 | ;%1 FILLED IN WITH CODEPAGE ID ;AN000; | ||
| 97 | ;%2 FILLED IN TO POINT TO "Selected" or "System". ;AN000; | ||
| 98 | ;AN000; | ||
| 99 | :def 35 " Code page not prepared",CR,LF ;AN000; | ||
| 100 | :def 36 "Code page operation not supported on this device",CR,LF ;AN000; | ||
| 101 | ;AN000; | ||
| 102 | :def 37 "No code page has been SELECTED",CR,LF ;AN000; | ||
| 103 | ;AN000; | ||
| 104 | :def 38 "Device error during %1",CR,LF ;AN000; | ||
| 105 | ;FILLED IN TO POINT TO: ;AN000; | ||
| 106 | ; "Status" ;AN000; | ||
| 107 | ; "Prepare" ;AN000; | ||
| 108 | ; "Select" ;AN000; | ||
| 109 | ; "Refresh" ;AN000; | ||
| 110 | ; "write of font file to device" ;AN000; | ||
| 111 | ;AN000; | ||
| 112 | :def 39 "code page not prepared",CR,LF ;AN000; | ||
| 113 | ;AN000; | ||
| 114 | :def 40 CR,LF,"Current keyboard does not support this code page",CR,LF ;AN000; | ||
| 115 | ;AN000; | ||
| 116 | :def 41 CR,LF,"Error during read of font file",CR,LF ;AN000; | ||
| 117 | ;AN000; | ||
| 118 | :def 42 CR,LF,"Unable to perform REFRESH operation",CR,LF ;AN000; | ||
| 119 | ;AN000; | ||
| 120 | :use 43 COMMON38 ;used for formatting common messages for consistent spacing ;AN000; | ||
| 121 | ;AN000; | ||
| 122 | :def 44 CR,LF,"Status for device %1:",CR,LF ;header for status reports ;AN000; | ||
| 123 | ;AN000; | ||
| 124 | :def 45 "------------------" ;first part of underline under "Status for device %1:" ;AN000; | ||
| 125 | ;AN000; | ||
| 126 | :def 46 "----",CR,LF ;four_char_underline ;AN000; | ||
| 127 | ;AN000; | ||
| 128 | :def 47 "-----",CR,LF ;five_char_underline ;AN000; | ||
| 129 | ;AN000; | ||
| 130 | :def 48 "LINES=%1",CR,LF ;AN000; | ||
| 131 | ;AN000; | ||
| 132 | :def 49 "COLUMNS=%1",CR,LF ;AN000; | ||
| 133 | ;AN000; | ||
| 134 | :def 50 CR,LF,"RATE and DELAY must be specified together",CR,LF ;AN000; | ||
| 135 | ;AN000; | ||
| 136 | :def 51 "RATE=%1",CR,LF ;AN000; | ||
| 137 | ;AN000; | ||
| 138 | :def 52 "DELAY=%1",CR,LF ;AN000; | ||
| 139 | ;AN000; | ||
| 140 | :def 53 CR,LF,"Function not supported on this computer - %1",CR,LF ;AN000; | ||
| 141 | ;AN000; | ||
| 142 | :def 54 CR,LF,"Required font not loaded",CR,LF ;AN000; | ||
| 143 | ;AN000; | ||
| 144 | :def 55 CR,LF,"ANSI.SYS must be installed to perform requested function",CR,LF ;AN000; | ||
| 145 | ;AN000; | ||
| 146 | :def 56 CR,LF,"Baud rate required",CR,LF ;AN000; | ||
| 147 | ;AN000; | ||
| 148 | :def 57 "RETRY=%1",CR,LF ;AN000; | ||
| 149 | ;AN000; | ||
| 150 | :use 58 PARSE9 ;"Syntax error - ???????",CR,LF ;AN000; | ||
| 151 | |||
| 152 | |||
| 153 | ;Following are the definitions of pieces of messages. | ||
| 154 | |||
| 155 | ;AN000; | ||
| 156 | ;SHIFT_MSG - CR,LF,"Do you see the %s? (",YES,"/",NO,")",CR,LF,EOM | ||
| 157 | |||
| 158 | :def 59 "rightmost 9",0 ;AN001;RIGHTMOST DB | ||
| 159 | :def 60 "leftmost 0",0 ;AN001;LEFTMOST DB | ||
| 160 | |||
| 161 | ;RETPARTO - CR,LF,"%s retry on parallel printer time-out",CR,LF,EOM | ||
| 162 | |||
| 163 | :def 61 "No",0 ;AN001;NORETRY DB | ||
| 164 | :def 62 "Infinite",0 ;AN001;INFINITE DB | ||
| 165 | |||
| 166 | ;CANT_SHIFT - CR,LF," Unable to shift screen %s",CR,LF,BEEP,EOM | ||
| 167 | |||
| 168 | :def 63 "left",0 ;AN001;LEFT DB | ||
| 169 | :def 64 "right",0 ;AN001;RIGHT DB | ||
| 170 | |||
| 171 | ;CPMSG8 DB "%S code pages:",CR,LF,EOM | ||
| 172 | |||
| 173 | :def 65 "Hardware",0 ;AN001;CPMSG8_HW DB | ||
| 174 | :def 66 "Prepared",0 ;AN001;CPMSG8_PR DB | ||
| 175 | |||
| 176 | ;CPMSG10 DB "MODE %S code page function completed",CR,LF,EOM | ||
| 177 | ;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM | ||
| 178 | |||
| 179 | :def 67 "status",0 ;AN001;CPMSG17_QUERY CPMSG10_QUERY | ||
| 180 | :def 68 "prepare",0 ;AN001;CPMSG17_PREP CPMSG10_DES | ||
| 181 | :def 69 "select",0 ;AN001;CPMSG17_ACT CPMSG10_SELECT | ||
| 182 | :def 70 "refresh",0 ;AN001;CPMSG17_REFRESH CPMSG10_REFRESH | ||
| 183 | |||
| 184 | ;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM | ||
| 185 | |||
| 186 | :def 71 "write of font file to device",0 ;AN001;CPMSG17_WRIT | ||
| 187 | |||
| 188 | ;CPMSG13 DB " %D - %S code page",CR,LF,EOM | ||
| 189 | |||
| 190 | :def 72 "selected",0 ;AN001;CPMSG13_ACT | ||
| 191 | :def 73 "system",0 ;AN001;CPMSG13_SYS | ||
| 192 | |||
| 193 | :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 @@ | |||
| 1 | PAGE ,132 ; ;AN000; | ||
| 2 | TITLE MODECOM.ASM - RS232 SUPPORT FOR THE MODE COMMAND ;AN000; | ||
| 3 | ;AN000; | ||
| 4 | .XLIST ;AN000; | ||
| 5 | INCLUDE STRUC.INC ;AN000; | ||
| 6 | .LIST ;AN000; | ||
| 7 | |||
| 8 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 9 | ;º º ;AN000; | ||
| 10 | ;AN000; | ||
| 11 | ; AC000 - P2852: Loading resident code trashed CX which was used as a shift | ||
| 12 | ; count. | ||
| 13 | |||
| 14 | ; AC001 - P3540: PS/2 only parms other than baud not being treated properly. | ||
| 15 | |||
| 16 | ;º º ;AN000; | ||
| 17 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 18 | ;AN000; | ||
| 19 | ;AN000; | ||
| 20 | DISPLAY MACRO MESSAGE ;AN000; | ||
| 21 | MOV DX,OFFSET MESSAGE ;AN000; | ||
| 22 | CALL PRINTF ;AN000; | ||
| 23 | ENDM ;AN000; | ||
| 24 | ;AN000; | ||
| 25 | ;------------------------------------------------------------------------ ;AN000; | ||
| 26 | ;AN000; | ||
| 27 | ABORT MACRO ;AN000; | ||
| 28 | JMP ENDIF01 ;AN000; | ||
| 29 | ENDM ;AN000; | ||
| 30 | ;AN000; | ||
| 31 | ;AN000; | ||
| 32 | ;------------------------------------------------------------------------ ;AN000; | ||
| 33 | ;AN000; | ||
| 34 | INCLUDE common.stc ;contains the following structure ;AN000; | ||
| 35 | ;AN000; | ||
| 36 | ;AN000; | ||
| 37 | ;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000; | ||
| 38 | ; ;AN000; | ||
| 39 | ;parm_type DB bogus ;AN000; | ||
| 40 | ;item_tag DB 0FFH ;AN000; | ||
| 41 | ;value1 DW bogus ;used only for filespecs and code page numbers ;AN000; | ||
| 42 | ;value2 DW bogus ;used only for filespecs and code page numbers ;AN000; | ||
| 43 | ;keyword_switch_ptr DW 0 ;AN000; | ||
| 44 | ; ;AN000; | ||
| 45 | ;parm_list_entry ENDS ;AN000; | ||
| 46 | ;AN000; | ||
| 47 | ;AN000; | ||
| 48 | ;AN000; | ||
| 49 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 50 | ;º º ;AN000; | ||
| 51 | ;AN000; | ||
| 52 | |||
| 53 | INCLUDE modequat.inc ;AN000;include definition of false, machine types | ||
| 54 | |||
| 55 | ;AN000; | ||
| 56 | AT_family EQU 0FCH ;model byte for 286 boxes ;AN000; | ||
| 57 | DEV1 EQU "1" ;CHAR IN "COM1:" ;AN000; | ||
| 58 | DEV2 EQU "2" ;CHAR IN "COM2:" ;AN000; | ||
| 59 | DEV3 EQU "3" ;CHAR IN "COM3:" ;AN000; | ||
| 60 | DEV4 EQU "4" ;CHAR IN "COM4:" ;AN000; | ||
| 61 | OFFTO EQU modeto ;OFFSET OF MODETO IN RESIDENT CODE FROM SEGMENT ;AN000; | ||
| 62 | ; STORED AT 530H BY MODELOAD ;AN000; | ||
| 63 | not_specified EQU 0 ;AN000; | ||
| 64 | parm_list EQU [BP] ;AN000; | ||
| 65 | ;Roughrider EQU 05 ;sub model byte ;AN000; | ||
| 66 | SPACE EQU " " ;BLANK CHARACTER ;AN000; | ||
| 67 | ;Trailboss EQU 04 ;sub model byte for 'Trailboss' ;AN000; | ||
| 68 | true EQU 0FFH ;AN000; | ||
| 69 | ;Wrangler EQU 0F8H ;primary model byte ;AN000; | ||
| 70 | ;AN000; | ||
| 71 | ;AN000; | ||
| 72 | ;º º ;AN000; | ||
| 73 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 74 | |||
| 75 | ; BEGINNING OF PROC MODETO) ;AN000; | ||
| 76 | ROM SEGMENT AT 0 ;AN000; | ||
| 77 | ORG 50H ;AN000; | ||
| 78 | VECT14H LABEL DWORD ;RS232 CALL, POINTS TO PROC MODETO WHEN ;AN000; | ||
| 79 | ; WHEN CODE IS RESIDENT ;AN000; | ||
| 80 | ORG 400H ;AN000; | ||
| 81 | SERIAL_BASE LABEL WORD ;SERIAL PORT ADDRESSES ;AN000; | ||
| 82 | ORG 530H ;AN000; | ||
| 83 | RESSEG LABEL DWORD ;VECTOR OF MODETO, WHEN RESIDENT ;AN000; | ||
| 84 | ROM ENDS ;AN000; | ||
| 85 | PAGE ;AN000; | ||
| 86 | PRINTF_CODE SEGMENT PUBLIC ;AN000; | ||
| 87 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE ;AN000; | ||
| 88 | ;AN000; | ||
| 89 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 90 | ;º º ;AN000; | ||
| 91 | ;AN000; | ||
| 92 | EXTRN B_item_tag:ABS ;see modepars ;AN000; | ||
| 93 | EXTRN baud_19200:BYTE ;AN000; | ||
| 94 | EXTRN busy_retry_active:ABS ;see invoke.asm ;AN000; | ||
| 95 | EXTRN E_item_tag:ABS ;see modepars ;AN000; | ||
| 96 | EXTRN eight_item_tag:ABS ;see modepars ;AN000; | ||
| 97 | EXTRN ERR1:WORD ;AN000; | ||
| 98 | EXTRN even_item_tag:ABS ;see modepars ;AN000; | ||
| 99 | EXTRN error_retry_active:ABS ;see invoke.asm ;AN000; | ||
| 100 | EXTRN five_item_tag:ABS ;see modepars ;AN000; | ||
| 101 | EXTRN fourtyeighthundred_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 102 | EXTRN fourtyeighthundred_str:BYTE ;AN000; | ||
| 103 | EXTRN illegal_device_ptr:WORD ;see modesubs.inc ;AN000; | ||
| 104 | EXTRN INITMSG:BYTE,DEVICE:BYTE,PPARITY:BYTE,PDATA:BYTE,PSTOP:BYTE,PPARM:BYTE ;AN000; | ||
| 105 | EXTRN keyword:ABS ;AN000; | ||
| 106 | EXTRN machine_type:BYTE ;see 'rescode' ;AN000; | ||
| 107 | EXTRN mark_item_tag:ABS ;see modepars ;AN000; | ||
| 108 | EXTRN MODELOAD:NEAR ;AN000; | ||
| 109 | EXTRN MODETO:WORD ;AN000; | ||
| 110 | EXTRN new_com_initialize:BYTE ;flag indicating that a PS/2 only parm was specified ;AC001; | ||
| 111 | EXTRN nineteentwohundred_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 112 | EXTRN nineteentwohundred_str:BYTE ;see modepars.asm ;AN000; | ||
| 113 | EXTRN ninetysixhundred_item_tag:ABS ;AC001; | ||
| 114 | EXTRN ninetysixhundred_str:BYTE ;AN000; | ||
| 115 | EXTRN no_retry_active:ABS ;see invoke.asm ;AN000; | ||
| 116 | EXTRN noerror:byte ;boolean indicating success of previous actions ;AN000; | ||
| 117 | EXTRN none_item_tag:ABS ;see modepars ;AN000; | ||
| 118 | EXTRN onefifty_str:BYTE ;AN000; | ||
| 119 | EXTRN oneten_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 120 | EXTRN oneten_str:BYTE ;AN000; | ||
| 121 | EXTRN onefifty_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 122 | EXTRN one_point_five_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 123 | EXTRN one_point_five_str:BYTE ;see modesubs.inc ;AN000; | ||
| 124 | EXTRN p_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 125 | EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>) ;AN000; | ||
| 126 | EXTRN parms_form:BYTE ;AN000; | ||
| 127 | EXTRN pstop_ptr:WORD ;see modedefs.inc ;AN000; | ||
| 128 | EXTRN odd_item_tag:ABS ;see modepars ;AN000; | ||
| 129 | EXTRN one_item_tag:ABS ;see modepars ;AN000; | ||
| 130 | EXTRN PBAUD_ptr:WORD ;see 'modemes' ;AN000; | ||
| 131 | EXTRN PRINTF:NEAR ;AN000; | ||
| 132 | EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE ;AN000; | ||
| 133 | ;PARM1 DB 10 DUP(0) ;AN000; | ||
| 134 | ;PARM2 DB 0 ;AN000; | ||
| 135 | ;PARM3 DB 0 ;AN000; | ||
| 136 | ;MODE DB 0 ;AN000; | ||
| 137 | ;FLAG DB 0 ;AN000; | ||
| 138 | EXTRN R_item_tag:ABS ;AN000; | ||
| 139 | EXTRN RATEMSG:WORD ;CR,LF,"Invalid baud rate specified",BEEP,CR,LF,"$" ;AN000; | ||
| 140 | EXTRN ready_retry_active:ABS ;see invoke.asm ;AN000; | ||
| 141 | ;EXTRN RES_MODEFLAG:ABS ;RETRY FLAG IN RESIDENT CODE, (OFFSET FROM ;AN000; | ||
| 142 | EXTRN res_com_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is resident, see rescode | ||
| 143 | EXTRN seven_item_tag:ABS ;see modepars ;AN000; | ||
| 144 | EXTRN sixhundred_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 145 | EXTRN sixhundred_str:BYTE ;AN000; | ||
| 146 | EXTRN six_item_tag:ABS ;see modepars ;AN000; | ||
| 147 | EXTRN space_item_tag:ABS ;see modepars ;AN000; | ||
| 148 | EXTRN submodel_byte:BYTE ;see 'rescode' ;AN000; | ||
| 149 | EXTRN threehundred_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 150 | EXTRN threehundred_str:BYTE ;AN000; | ||
| 151 | EXTRN twelvehundred_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 152 | EXTRN twelvehundred_str:BYTE ;AN000; | ||
| 153 | EXTRN twentyfourhundred_str:BYTE ;AN000; | ||
| 154 | EXTRN twentyfourhundred_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 155 | EXTRN two_item_tag:ABS ;see modepars ;AN000; | ||
| 156 | ;AN000; | ||
| 157 | ;AN000; | ||
| 158 | ;º º ;AN000; | ||
| 159 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 160 | ;AN000; | ||
| 161 | ;AN000; | ||
| 162 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 163 | ;º º ;AN000; | ||
| 164 | ;AN000; | ||
| 165 | PUBLIC baud_index ;holder of the index in the parm list of the baud rate requested ;AN000; | ||
| 166 | PUBLIC data_bits_index ;set by invoke ;AN000; | ||
| 167 | PUBLIC MODECOM ;AN000; | ||
| 168 | PUBLIC parity_index ;set by invoke ;AN000; | ||
| 169 | PUBLIC SERIAL_BASE ;Make available to RESCODE and MAIN ;AN000; | ||
| 170 | PUBLIC retry_index ;make available to analyze_and_invoke ;AN000; | ||
| 171 | PUBLIC setcom ;get it listed in the link map ;AN000; | ||
| 172 | PUBLIC setto ;get it listed in link map for debugging ;AN000; | ||
| 173 | PUBLIC stop_bits_index ;set by invoke ;AN000; | ||
| 174 | ;AN000; | ||
| 175 | ;º º ;AN000; | ||
| 176 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 177 | ;AN000; | ||
| 178 | ;AN000; | ||
| 179 | ;AN000; | ||
| 180 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 181 | ;º º ;AN000; | ||
| 182 | ;AN000; | ||
| 183 | ;AN000; | ||
| 184 | ;THESE FOLLOWING BAUD RATES REPRESENT THE 1ST 2 CHAR ;AN000; | ||
| 185 | baud_index DW TYPE parm_list_entry ;holder of the index into the parm list of the baud rate ;AN000; | ||
| 186 | data_bits_index DW 0 ;holder of the index into the parm list of the data bits ;AN000; | ||
| 187 | parity_index DW 0 ;holder of the index into the parm list of the parity ;AN000; | ||
| 188 | stop_bits_index DW 0 ;holder of the index into the parm list of the stop bits ;AN000; | ||
| 189 | retry_index DW 0 ;AN000; | ||
| 190 | ;AN000; | ||
| 191 | ;INITMSG DB CR,LF ;AN000; | ||
| 192 | ; DB "COM" ;AN000; | ||
| 193 | ;DEVICE DB " " ;AN000; | ||
| 194 | ; DB ": " ;SEPARATOR BLANK ;AN000; | ||
| 195 | ;PBAUD DB 4 DUP(" ") ;AN000; | ||
| 196 | ; DB "," ;SEPARATOR ;AN000; | ||
| 197 | ;PPARITY DB "e" ;DEFAULT IS EVEN PARITY ;AN000; | ||
| 198 | ; DB "," ;SEPARATOR ;AN000; | ||
| 199 | ;PDATA DB "7" ;DEFAULT IS 7 DATA BITS PER BYTE ;AN000; | ||
| 200 | ; DB "," ;SEPARATOR ;AN000; | ||
| 201 | ;PSTOP DB "1" ;DEFAULT FOR BAUD > 110, CHANGED TO 2 FOR 110 ;AN000; | ||
| 202 | ; DB "," ;SEPARATOR ;AN000; | ||
| 203 | ;PPARM DB " " ;AN000; | ||
| 204 | ; DB CR,LF,"$" ;END OF 'INITMSG' ;AN000; | ||
| 205 | ;AN000; | ||
| 206 | ;AN000; | ||
| 207 | ;º º ;AN000; | ||
| 208 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 209 | ;AN000; | ||
| 210 | ;AN000; | ||
| 211 | SUBTTL SET UP FOR SERIAL RETRY ;AN000; | ||
| 212 | PAGE ;AN000; | ||
| 213 | ; | ||
| 214 | ; | ||
| 215 | ;------------------------------------------------------------------------------- | ||
| 216 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 217 | ;³ ³ | ||
| 218 | ;³ SETTO ³ | ||
| 219 | ;³ ----- ³ | ||
| 220 | ;³ ³ | ||
| 221 | ;³ Set the resident retry flag to type of retry active for comx. ³ | ||
| 222 | ;³ ³ | ||
| 223 | ;³ INPUT: device - holds '1', '2', '3' or '4' (ascii) for x of lptx. ³ | ||
| 224 | ;³ retry_index - holds index value for the parsed retry parameter. ³ | ||
| 225 | ;³ resseg - holds offset of resident code in memory ³ | ||
| 226 | ;³ res_com_retry_type - holds offset of com retry flag in resident ³ | ||
| 227 | ;³ code. ³ | ||
| 228 | ;³ ³ | ||
| 229 | ;³ ³ | ||
| 230 | ;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³ | ||
| 231 | ;³ flag in resident code set ³ | ||
| 232 | ;³ ³ | ||
| 233 | ;³ ³ | ||
| 234 | ;³ MESSAGES: none. ³ | ||
| 235 | ;³ ³ | ||
| 236 | ;³ ³ | ||
| 237 | ;³ REGISTER ³ | ||
| 238 | ;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³ | ||
| 239 | ;³ format) ³ | ||
| 240 | ;³ CL - shift bit count ³ | ||
| 241 | ;³ ES - holds segment of resident code ³ | ||
| 242 | ;³ BP - offset of parameter list ³ | ||
| 243 | ;³ DI - offset of retry index within parameter list ³ | ||
| 244 | ;³ DL - current resident flag setting ³ | ||
| 245 | ;³ ³ | ||
| 246 | ;³ ³ | ||
| 247 | ;³ PSUEDO CODE: ³ | ||
| 248 | ;³ ³ | ||
| 249 | ;³ SAVE REGISTERS ³ | ||
| 250 | ;³ SET UP SEGMENT REGISTER AND BIT MASKS ³ | ||
| 251 | ;³ IF <RETRY REQUESTED> ³ | ||
| 252 | ;³ SET UP PARAMETER LIST STRUCTURE ³ | ||
| 253 | ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³ | ||
| 254 | ;³ IF <RESIDENT CODE IS NOT LOADED> ³ | ||
| 255 | ;³ LOAD RESIDENT CODE ³ | ||
| 256 | ;³ ENDIF ³ | ||
| 257 | ;³ GET CURRENT com_lpt_retry_type ³ | ||
| 258 | ;³ SET AND STORE NEW com_lpt_retry_type ³ | ||
| 259 | ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³ | ||
| 260 | ;³ GET CURRENT com_lpt_retry_type ³ | ||
| 261 | ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³ | ||
| 262 | ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³ | ||
| 263 | ;³ ELSE ³ | ||
| 264 | ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³ | ||
| 265 | ;³ ENDIF ³ | ||
| 266 | ;³ ELSE ³ | ||
| 267 | ;³ SET pparm TO '-' ³ | ||
| 268 | ;³ ENDIF ³ | ||
| 269 | ;³ RESTORE REGISTERS ³ | ||
| 270 | ;³ RETURN ³ | ||
| 271 | ;³ ³ | ||
| 272 | ;³ ³ | ||
| 273 | ;³ ³ | ||
| 274 | ;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³ | ||
| 275 | ;³ ³ | ||
| 276 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 277 | ; | ||
| 278 | SETTO PROC NEAR ;AN663; | ||
| 279 | ;AN663; | ||
| 280 | PUSH ES ;save registers ;AN663; | ||
| 281 | PUSH DI ;AN663; | ||
| 282 | PUSH AX ;AN663; | ||
| 283 | PUSH DX ;AN663; | ||
| 284 | ;AN663; | ||
| 285 | XOR AX,AX ;clear a reg ;AN663; | ||
| 286 | MOV ES,AX ;set to segment at 0 ;AN663; | ||
| 287 | MOV CL,device ;AN663; | ||
| 288 | AND CL,07H ;AN663; | ||
| 289 | DEC CL ;AN663; | ||
| 290 | SHL CL,1 ;AN663; | ||
| 291 | MOV DH,11111100B ;set bit mask to clear old flag setting ;AN663; | ||
| 292 | ROL DH,CL ;AN663; | ||
| 293 | ;AN663; | ||
| 294 | .IF <retry_index NE 0> THEN ;retry specified, set ;AN663; | ||
| 295 | ; byte in resident code ;AN663; | ||
| 296 | MOV DI,retry_index ; to proper setting. ;AN663; | ||
| 297 | ; if code is not loaded, ;AN663; | ||
| 298 | .SELECT ; loaded it. ;AN663; | ||
| 299 | .WHEN <parm_list[DI].item_tag EQ P_item_tag> ;AN663; | ||
| 300 | MOV AL,busy_retry_active ;AN663; | ||
| 301 | MOV pparm,'p' ;AN663; | ||
| 302 | .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663; | ||
| 303 | MOV AL,error_retry_active ;AN663; | ||
| 304 | MOV pparm,'e' ;AN663; | ||
| 305 | .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663; | ||
| 306 | MOV AL,busy_retry_active ;AN663; | ||
| 307 | MOV pparm,'b' ;AN663; | ||
| 308 | .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663; | ||
| 309 | MOV AL,ready_retry_active ;AN663; | ||
| 310 | MOV pparm,'r' ;AN663; | ||
| 311 | .ENDSELECT ;AN663; | ||
| 312 | ;AN663; | ||
| 313 | .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663; | ||
| 314 | PUSH CX ;save shift count | ||
| 315 | CALL modeload ;load the resident code ;AN663; | ||
| 316 | POP CX ;restore shift count | ||
| 317 | .ENDIF ;AN663; | ||
| 318 | ;AN663; | ||
| 319 | MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 320 | MOV DL,BYTE PTR ES:res_com_retry_type ;AN663; | ||
| 321 | ;get the old setting ;AN663; | ||
| 322 | ROL AL,CL ;AN663; | ||
| 323 | AND DL,DH ;AN663; | ||
| 324 | OR DL,AL ;AN663; | ||
| 325 | MOV BYTE PTR ES:res_com_retry_type,DL ;store the new setting ;AN663; | ||
| 326 | ;AN663; | ||
| 327 | .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663; | ||
| 328 | ; retry is specified then ;AN663; | ||
| 329 | MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 330 | MOV DL,BYTE PTR ES:res_com_retry_type ;AN663; | ||
| 331 | ;AN663; | ||
| 332 | .IF <parms_form NE keyword> ;if 'NONE' was specified ;AN663; | ||
| 333 | ; with positional parameter ;AN663; | ||
| 334 | AND DL,DH ; set bits to zero ;AN663; | ||
| 335 | MOV BYTE PTR ES:res_com_retry_type,DL ;AN663; | ||
| 336 | ;AN663; | ||
| 337 | .ELSE ;else update pparm with ;AN663; | ||
| 338 | ; current retry type ;AN663; | ||
| 339 | NOT DH ;AN663; | ||
| 340 | AND DL,DH ;AN663; | ||
| 341 | SHR DL,CL ;AN663; | ||
| 342 | ;AN663; | ||
| 343 | .SELECT ;set pparm to proper letter ;AN663; | ||
| 344 | .WHEN <DL EQ no_retry_active> ;AN663; | ||
| 345 | MOV pparm,'-' ;AN663; | ||
| 346 | .WHEN <DL EQ error_retry_active> ;AN663; | ||
| 347 | MOV pparm,'e' ;AN663; | ||
| 348 | .WHEN <DL EQ busy_retry_active> ;AN663; | ||
| 349 | MOV pparm,'b' ;AN663; | ||
| 350 | .WHEN <DL EQ ready_retry_active> ;AN663; | ||
| 351 | MOV pparm,'r' ;AN663; | ||
| 352 | .ENDSELECT ;AN663; | ||
| 353 | ;AN663; | ||
| 354 | .ENDIF ;AN663; | ||
| 355 | ;AN663; | ||
| 356 | .ELSE ;no retry, no code resident ;AN663; | ||
| 357 | ;AN663; | ||
| 358 | MOV pparm,'-' ;AN663; | ||
| 359 | ;AN663; | ||
| 360 | .ENDIF ;AN663; | ||
| 361 | ;AN663; | ||
| 362 | POP DX ;AN663; | ||
| 363 | POP AX ;restore registers ;AN663; | ||
| 364 | POP DI ;AN663; | ||
| 365 | POP ES ;AN663; | ||
| 366 | RET ;AN663; | ||
| 367 | ;AN663; | ||
| 368 | SETTO ENDP ;AN663; | ||
| 369 | |||
| 370 | |||
| 371 | |||
| 372 | SUBTTL SET SERIAL PROTOCOL | ||
| 373 | PAGE | ||
| 374 | |||
| 375 | ;------------------------------------------------------------------------------ | ||
| 376 | |||
| 377 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 378 | ;³ ³ | ||
| 379 | ;³ SETCOM ³ | ||
| 380 | ;³ ------ ³ | ||
| 381 | ;³ ³ | ||
| 382 | ;³ ³ | ||
| 383 | ;³ ³ | ||
| 384 | ;³ INPUT: ³ | ||
| 385 | ;³ ³ | ||
| 386 | ;³ ³ | ||
| 387 | ;³ ³ | ||
| 388 | ;³ ³ | ||
| 389 | ;³ ³ | ||
| 390 | ;³ ³ | ||
| 391 | ;³ RETURN: ³ | ||
| 392 | ;³ ³ | ||
| 393 | ;³ ³ | ||
| 394 | ;³ ³ | ||
| 395 | ;³ MESSAGES: none. ³ | ||
| 396 | ;³ ³ | ||
| 397 | ;³ ³ | ||
| 398 | ;³ REGISTER ³ | ||
| 399 | ;³ USAGE: ³ | ||
| 400 | ;³ ³ | ||
| 401 | ;³ ³ | ||
| 402 | ;³ ASSUMPTIONS: All parms have been checked for validity as being possible and³ | ||
| 403 | ;³ supported on the machine. ³ | ||
| 404 | ;³ ³ | ||
| 405 | ;³ ³ | ||
| 406 | ;³ ³ | ||
| 407 | ;³ SIDE EFFECT: ³ | ||
| 408 | ;³ ³ | ||
| 409 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 410 | |||
| 411 | SETCOM PROC NEAR ;AN000; | ||
| 412 | ;AN000; | ||
| 413 | ;AN000; | ||
| 414 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000; | ||
| 415 | MOV DI,baud_index ;DI=index into parm list of the baud rate entry ;AN000; | ||
| 416 | |||
| 417 | .SELECT ;prepare AL for old init and CL for new init ;AC001; | ||
| 418 | |||
| 419 | .WHEN <parm_list[DI].item_tag EQ oneten_item_tag> ;AC001; | ||
| 420 | MOV AL,0 ;AN000; | ||
| 421 | MOV CL,0 | ||
| 422 | MOV pbaud_ptr,OFFSET oneten_str ;AN000; | ||
| 423 | .WHEN <parm_list[DI].item_tag EQ onefifty_item_tag> THEN ;AN000; | ||
| 424 | MOV AL,00100000B ;AN000; | ||
| 425 | MOV CL,1 | ||
| 426 | MOV pbaud_ptr,OFFSET onefifty_str ;AN000; | ||
| 427 | .WHEN <parm_list[DI].item_tag EQ threehundred_item_tag> THEN ;AN000; | ||
| 428 | MOV AL,01000000B ;AN000; | ||
| 429 | MOV CL,2 | ||
| 430 | MOV pbaud_ptr,OFFSET threehundred_str ;AN000; | ||
| 431 | .WHEN <parm_list[DI].item_tag EQ sixhundred_item_tag> THEN ;AN000; | ||
| 432 | MOV AL,01100000B ;AN000; | ||
| 433 | MOV CL,3 | ||
| 434 | MOV pbaud_ptr,OFFSET sixhundred_str ;AN000; | ||
| 435 | .WHEN <parm_list[DI].item_tag EQ twelvehundred_item_tag> THEN ;AN000; | ||
| 436 | MOV AL,10000000B ;AN000; | ||
| 437 | MOV CL,4 | ||
| 438 | MOV pbaud_ptr,OFFSET twelvehundred_str ;AN000; | ||
| 439 | .WHEN <parm_list[DI].item_tag EQ twentyfourhundred_item_tag> THEN ;AN000; | ||
| 440 | MOV AL,10100000B ;AN000; | ||
| 441 | MOV CL,5 | ||
| 442 | MOV pbaud_ptr,OFFSET twentyfourhundred_str ;AN000; | ||
| 443 | .WHEN <parm_list[DI].item_tag EQ fourtyeighthundred_item_tag> THEN ;AN000; | ||
| 444 | MOV AL,11000000B ;AN000; | ||
| 445 | MOV CL,6 | ||
| 446 | MOV pbaud_ptr,OFFSET fourtyeighthundred_str ;AN000; | ||
| 447 | .WHEN <parm_list[DI].item_tag EQ ninetysixhundred_item_tag> THEN ;AN000; | ||
| 448 | MOV AL,11100000B ;AN000; | ||
| 449 | MOV CL,7 | ||
| 450 | MOV pbaud_ptr,OFFSET ninetysixhundred_str ;AN000; | ||
| 451 | .WHEN <parm_list[DI].item_tag EQ nineteentwohundred_item_tag> NEAR THEN ;handle 19200 case if 19, 19200, 19.2 or 19.2K specified | ||
| 452 | MOV CL,8 ;value for 19200 baud, no old equivalent ;AC001; | ||
| 453 | MOV pbaud_ptr,OFFSET nineteentwohundred_str ;AC001; | ||
| 454 | |||
| 455 | .ENDSELECT ;AC001; | ||
| 456 | ; AL IS: XXX00000 for the baud rate, CL has appropriate value for baud | ||
| 457 | |||
| 458 | MOV DI,parity_index ;AN000; | ||
| 459 | .IF <parm_list[DI].item_tag EQ none_item_tag> THEN ;AN000; | ||
| 460 | MOV PPARITY,"n" ;set up message for no PARITY ;AN000; | ||
| 461 | MOV BH,0 ;AL already set properly for old init ;AN000; | ||
| 462 | .ELSEIF <parm_list[DI].item_tag EQ odd_item_tag> THEN ;AN000; | ||
| 463 | MOV PPARITY,"o" ;set up message for odd PARITY ;AN000; | ||
| 464 | OR AL,08H ;PUT THE 000XX000 BITS TO AL PARM WHERE XX=01 FOR PARITY=ODD ;AN000 | ||
| 465 | MOV BH,1 ;new initialize ;AN000; | ||
| 466 | .ELSEIF <parm_list[DI].item_tag EQ space_item_tag> THEN ;AN000; | ||
| 467 | MOV PPARITY,"s" ;set up message for space PARITY ;AN000; | ||
| 468 | MOV BH,4 ;SPACE not supported in old init ;AN000; | ||
| 469 | .ELSEIF <parm_list[DI].item_tag EQ mark_item_tag> THEN ;AN000; | ||
| 470 | MOV PPARITY,"m" ;set up message for mark PARITY ;AN000; | ||
| 471 | MOV BH,3 ;MARK parity not supported in old init ;AN000; | ||
| 472 | .ELSE ;not specified or asked for even ;AN000; | ||
| 473 | MOV PPARITY,"e" ;set up message for even PARITY, the default if not specified ;AN000; | ||
| 474 | OR AL,18H ;PUT THE 000XX000 BITS TO AL PARM WHERE XX=11 FOR PARITY=EVEN ;AN000 | ||
| 475 | MOV BH,2 ;even parity for new initialize ;AN000; | ||
| 476 | .ENDIF ;AN000; | ||
| 477 | |||
| 478 | MOV DI,data_bits_index ;AN000; | ||
| 479 | .IF <parm_list[DI].item_tag EQ five_item_tag> THEN ;AN000; | ||
| 480 | MOV pdata,"5" ;set up message for 5 bits ;AN000; | ||
| 481 | MOV CH,0 ;not old init for 5 data bits ;AN000; | ||
| 482 | .ELSEIF <parm_list[DI].item_tag EQ six_item_tag> THEN ;AN000; | ||
| 483 | MOV pdata,"6" ;set up message for 6 bits ;AN000; | ||
| 484 | MOV CH,1 ;no old init for 6 data bits ;AN000; | ||
| 485 | .ELSEIF <parm_list[DI].item_tag EQ eight_item_tag> THEN ;AN000; | ||
| 486 | MOV pdata,"8" ;set up message for 8 bits ;AN000; | ||
| 487 | OR AL,03H ;IN THE 000000XX POSITION, SET XX=11 TO MEAN 8 DATA BITS ;AN000; | ||
| 488 | MOV CH,3 ;AN000; | ||
| 489 | .ELSE ;asked for 7 or skipped the parm and will get 7 as default ;AN000; | ||
| 490 | OR AL,02H ;IN THE 000000XX POSITION, SET XX=10 TO MEAN 7 DATA BITS ;AN000; | ||
| 491 | MOV CH,2 ;message already set up for 7 bits ;AN000; | ||
| 492 | .ENDIF ;AN000; | ||
| 493 | |||
| 494 | ;PUT THE NO. STOP BITS TO AL PARM IN THE 00000X00 POSITION and BL for new init ;AN000 | ||
| 495 | MOV DI,stop_bits_index ;AN000; | ||
| 496 | MOV BL,0 ;assume stop bits was 1, message already set up ;AN000; | ||
| 497 | .SELECT | ||
| 498 | ;AN000; | ||
| 499 | .WHEN <parm_list[DI].item_tag EQ two_item_tag> ;AN000; | ||
| 500 | MOV pstop,"2" ;set up message for 2 stop bits ;AN000; | ||
| 501 | MOV BL,1 ;value for two or 1.5 ;AN000; | ||
| 502 | |||
| 503 | .WHEN <parm_list[DI].item_tag EQ one_point_five_item_tag> ;AN000; ;AN000; | ||
| 504 | MOV pstop_ptr,OFFSET one_point_five_str ;set up message for 1.5 stop bits ;AN000; | ||
| 505 | MOV BL,1 ;new init for 1.5 ;AN000; | ||
| 506 | |||
| 507 | .WHEN <stop_bits_index EQ not_specified> ;if stop bits not specified ;AN000; | ||
| 508 | MOV DI,baud_index ;AC000; | ||
| 509 | .IF <parm_list[DI].item_tag EQ oneten_item_tag> ;BAUD=110 SPECIFIED THEN SET DEFAULT STOP BITS TO TWO ;AC000; | ||
| 510 | OR AL,04H ;TURN ON BIT IN 00000X00 POSITION TO REQUEST 2 STOP BITS ;AN000; | ||
| 511 | MOV pstop,"2" ;set up message for 2 stop bits ;AN000; | ||
| 512 | .ENDIF ;FOR STOPBITS=1, LEAVE THAT BIT OFF, message already set by modecom ;AN000; | ||
| 513 | |||
| 514 | ; .OTHERWISE specified 1, everything set up | ||
| 515 | |||
| 516 | .ENDSELECT ;IF not 1.5 or two, already set up for 1 ;AN000; | ||
| 517 | ;AN000; | ||
| 518 | .IF <new_com_initialize EQ true> THEN ;AC001; | ||
| 519 | XOR AL,AL ;ask for no break ;AN000; | ||
| 520 | MOV AH,4 ;new set baud BIOS call ;AN001; | ||
| 521 | .ELSE ;old style com initialization ;AN000; ;AC001; | ||
| 522 | XOR AH,AH ;AH=0 requests initialization ;AC001; | ||
| 523 | .ENDIF ;AC001; | ||
| 524 | |||
| 525 | ;AN000; | ||
| 526 | ;SET DX PARM TO REQUEST WHICH COM DEVICE ;AN000; | ||
| 527 | XOR DX,DX ;AN000; | ||
| 528 | MOV DL,DEVICE ;device set by modepars in first_parm_case: ;AN000; | ||
| 529 | AND DL,07 ;convert to binary 1 thru 4 ;AN000; | ||
| 530 | DEC DL ;put in BIOS digestable 0 thru 3 ;AN000; | ||
| 531 | ; AH ALREADY IS 0 or 4, WHICH REQUESTS ;AN000; | ||
| 532 | ; INITIALIZATION OF THE RS232 ;AN000; | ||
| 533 | ; ACCORDING TO PARMS IN AL and/or BX and CX. ;AN000; | ||
| 534 | .IF <noerror EQ true> THEN ;AN000; | ||
| 535 | INT 14H ;INIT THE RS232 ;AN000; | ||
| 536 | ; ;AN000; | ||
| 537 | ; NOW THAT THE RS232 IS INITIALIZED, ;AN000; | ||
| 538 | CALL SETTO ;LOOK AT P PARM, MAYBE TIMEOUT TO BE RETRIED ;AN000; | ||
| 539 | ; ;AN000; | ||
| 540 | DISPLAY INITMSG ;TELL USER RS232 IS INITIALIZED ;AN000; | ||
| 541 | .ENDIF ;AN000; | ||
| 542 | |||
| 543 | RET ;AN000; | ||
| 544 | SETCOM ENDP ;AN000; | ||
| 545 | ;AN000; | ||
| 546 | ;AN000; | ||
| 547 | SUBTTL ;AN000; | ||
| 548 | PAGE ;AN000; | ||
| 549 | ;AN000; | ||
| 550 | ;AN000; | ||
| 551 | |||
| 552 | MODECOM PROC NEAR | ||
| 553 | |||
| 554 | |||
| 555 | MOV AL,DEVICE ;AL= DEVICE ID OF "1", "2", "3" or "4" | ||
| 556 | AND AL,07 ;TRANSLATE TO BINARY | ||
| 557 | DEC AL ;PUT IN ZERO BASE | ||
| 558 | SAL AL,1 ;POSITION OF PORT ADDRESS WORD (2*AL) | ||
| 559 | XOR AH,AH ;CLEAR AH | ||
| 560 | MOV SI,AX | ||
| 561 | XOR AL,AL ;CLEAR AX | ||
| 562 | PUSH DS | ||
| 563 | MOV DS,AX | ||
| 564 | CMP WORD PTR DS:SERIAL_BASE[SI],0 ;SEE IF THE COM PORT EXISTS | ||
| 565 | POP DS | ||
| 566 | JNE THEN01A | ||
| 567 | MOV DI,0 ;the device name is always the first parm ;AN000; | ||
| 568 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000; | ||
| 569 | MOV CX,parm_list[DI].value1 ;AN000; | ||
| 570 | MOV illegal_device_ptr,CX | ||
| 571 | DISPLAY err1 ;AN000;"Illegal device name - COMX" | ||
| 572 | MOV noerror,false ;AN000; | ||
| 573 | ABORT | ||
| 574 | ; | ||
| 575 | THEN01A: | ||
| 576 | |||
| 577 | ; DEFINE DEFAULTS: | ||
| 578 | MOV PSTOP,"1" ;ONE STOP BIT, OK FOR BAUD>110 | ||
| 579 | MOV PDATA,"7" ;7 DATA BITS | ||
| 580 | MOV PPARM,"-" ;NO SERIAL TIMEOUT RETRY | ||
| 581 | ; | ||
| 582 | |||
| 583 | ;WE HAVE THE INFORMATION NEEDED TO INITIALIZE THE RS232 DEVICE | ||
| 584 | ; | ||
| 585 | CALL SETCOM ;SET THE RS232 DEVICE | ||
| 586 | ; | ||
| 587 | ; : ELSE ,SINCE COUNT WAS NOT BIG ENUF | ||
| 588 | ENDIF01: ;jump to here if the port does not exist | ||
| 589 | RET ;RETURN TO MODE MAIN ROUTINE | ||
| 590 | MODECOM ENDP | ||
| 591 | PRINTF_CODE ENDS | ||
| 592 | 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 @@ | |||
| 1 | .XLIST | ||
| 2 | INCLUDE STRUC.INC | ||
| 3 | .LIST | ||
| 4 | |||
| 5 | |||
| 6 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 7 | ;º º | ||
| 8 | |||
| 9 | set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message". | ||
| 10 | |||
| 11 | MOV AX,submessage ;AX=message number ;AN001; | ||
| 12 | MOV DH,utility_msg_class ;DH=message class=utility class ;AN001; | ||
| 13 | CALL SYSGETMSG ;DS:SI=>message piece ;AN001; | ||
| 14 | MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001; | ||
| 15 | MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001; | ||
| 16 | ENDM ;AN001; | ||
| 17 | |||
| 18 | ;º º | ||
| 19 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 20 | |||
| 21 | PAGE ,132 ; | ||
| 22 | TITLE MODECP.SAL - CODEPAGE SUPPORT | ||
| 23 | INCLUDE MODECPRO.INC ;MODULE PROLOGUE | ||
| 24 | ;THE FOLLOWING "INCLUDE MODECPEQ.INC" CONTAINS THE FOLLOWING DEFINITIONS: | ||
| 25 | ; MACROS: HEADER, DOSCALL | ||
| 26 | ; DOS FUNCTION CALLS EQUATES | ||
| 27 | ; MAJOR AND MINOR CODES FOR "GENERIC IOCTL" DOS FUNCTION CALL | ||
| 28 | ; ERROR RETURN CODES FROM SEVERAL SUBFUNCTIONS OF THE GENERIC IOCTL | ||
| 29 | ; OPEN MODE EQUATES | ||
| 30 | ; DEFINITIONS OF STRUC: | ||
| 31 | ; "FON" - THE HEADER OF THE CODEPAGE FONT FILE | ||
| 32 | ; "CODEPAGE_PARMS" - INPUT PARM LIST FROM CALLER | ||
| 33 | ; "PACKET" AND "DES_STRT_PACKET" - BUFFERS USED | ||
| 34 | ; BY THE SEVERAL CODEPAGE DOS IOCTL CALLS | ||
| 35 | INCLUDE MODECPEQ.INC ;MACROS,DOS EQUATES,STRUCS,OTHER EQUATES | ||
| 36 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 37 | HEADER <DESCRIPTIONS OF ALL MESSAGES USED BY MODECP.SAL> | ||
| 38 | INCLUDE MODECPMS.INC ;DESCRIPTIONS OF MESSAGES | ||
| 39 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 40 | HEADER <EXTRNS, LOCAL DATA AND OTHER WORKAREAS> | ||
| 41 | ; $SALUT CP(4,16,22,38) ;(set preprocessor columns for indenting) | ||
| 42 | PRINTF_CODE SEGMENT WORD PUBLIC | ||
| 43 | ASSUME CS:PRINTF_CODE ;"MODE" IS A ".COM" FILE; | ||
| 44 | ASSUME DS:PRINTF_CODE ; AS SUCH, ALL FOUR SEG REGS | ||
| 45 | ASSUME ES:PRINTF_CODE ; POINT TO THE ONE COMMON | ||
| 46 | ASSUME SS:PRINTF_CODE ; SEGMENT, "PRINTF_CODE" | ||
| 47 | |||
| 48 | MODECP00 EQU $ ;UNREFERENCED, LOCATES REL ZERO IN LINK MAP | ||
| 49 | PUBLIC MODECP00 | ||
| 50 | |||
| 51 | |||
| 52 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 53 | ;º º | ||
| 54 | |||
| 55 | PUBLIC CLOSE ;EQU 3EH ;CLOSE A FILE HANDLE,make available to analyze_and_invoke, see modecpeq.inc | ||
| 56 | PUBLIC DES_STRT_FL_CART ;EQU 0001H, means CARTRIDGE prepare | ||
| 57 | PUBLIC DEV_OPEN_MODE ;make available to analyze_and_invoke, see modecpeq.inc | ||
| 58 | PUBLIC OPEN ;make available to analyze_and_invoke, see modecpeq.inc | ||
| 59 | |||
| 60 | ;º º | ||
| 61 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 62 | |||
| 63 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 64 | ;º º | ||
| 65 | |||
| 66 | EXTRN cp_cb:WORD ;AN000;codepage_parms <>, see invoke | ||
| 67 | |||
| 68 | EXTRN NOERROR:BYTE ;ERRORLEVEL RETURN CODE FLAG BYTE | ||
| 69 | ; NORMAL VALUE IS "TRUE" (-1) | ||
| 70 | ; IF ERROR OCCURS, SET IT TO "FALSE" (0) | ||
| 71 | EXTRN PRINTF:NEAR ;SENDS MESSAGES TO STDOUT OR STDERR | ||
| 72 | |||
| 73 | EXTRN SYSGETMSG:NEAR ;AN001;message services routine to get the address of a message. Used to get address of a submessage. | ||
| 74 | EXTRN Utility_Msg_Class:ABS ;AN001; | ||
| 75 | EXTRN sublist_cpmsg8:BYTE ;AN001; | ||
| 76 | EXTRN sublist_cpmsg10:BYTE ;AN001; | ||
| 77 | EXTRN sublist_cpmsg17:BYTE ;AN001; | ||
| 78 | |||
| 79 | ;º º | ||
| 80 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 81 | |||
| 82 | |||
| 83 | INCLUDE common.stc ;AN001;includes the following structures | ||
| 84 | |||
| 85 | |||
| 86 | ;bogus EQU 88H ;totally invalid value | ||
| 87 | ; | ||
| 88 | ;codepage_parms STRUC | ||
| 89 | ; cp_device DW ? | ||
| 90 | ; des_pack_ptr DW ? | ||
| 91 | ; font_filespec DW ? | ||
| 92 | ; request_typ DW ? | ||
| 93 | ;codepage_parms ENDS | ||
| 94 | ; | ||
| 95 | ; | ||
| 96 | ;parm_list_entry STRUC ;used by parse_parameters and invoke | ||
| 97 | ; | ||
| 98 | ;parm_type DB bogus | ||
| 99 | ;item_tag DB 0FFH | ||
| 100 | ;value1 DW bogus ;used only for filespecs and code page numbers | ||
| 101 | ;value2 DW bogus ;used only for filespecs and code page numbers | ||
| 102 | ;keyword_switch_ptr DW 0 | ||
| 103 | ; | ||
| 104 | ;parm_list_entry ENDS | ||
| 105 | ; | ||
| 106 | ; | ||
| 107 | ;sublist_def STRUC ;used by initialize_sublists | ||
| 108 | ; | ||
| 109 | ; db ? ;Sublist Length, fixed | ||
| 110 | ; db ? ;Reserved, not used yet ;AN000; | ||
| 111 | ;sublist_off dw ? ;offset | ||
| 112 | ;sublist_seg dw ? ;segment part of pointer to piece of message | ||
| 113 | ; db ? ;ID, special end of message format ;AN000; | ||
| 114 | ; db ? ;flags | ||
| 115 | ; db ? | ||
| 116 | ; db ? | ||
| 117 | ; db ? | ||
| 118 | ; | ||
| 119 | ;sublist_def ENDS | ||
| 120 | |||
| 121 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 122 | ;º º | ||
| 123 | |||
| 124 | |||
| 125 | ;ALL MESSAGES ARE IN THE MODEMES.ASM MODULE | ||
| 126 | current_request DB bogus ;see 'do_refresh' and 'des_end' | ||
| 127 | dgroup group zseg,printf_code | ||
| 128 | zseg segment para public | ||
| 129 | ; LOCAL WORKAREA | ||
| 130 | BUF DB 512 DUP(0) ;DEFAULT BUFFER AREA | ||
| 131 | public buf ;not referenced, just shows up on mapf buf | ||
| 132 | END_OF_BUF EQU $ | ||
| 133 | zseg ends | ||
| 134 | |||
| 135 | RESPONSE_LIST LABEL WORD ;WHERE TO PUT THE RESULTS OF QUERY prepareS | ||
| 136 | RES_NUM_ENTRIES EQU 12 ;NUMBER ENTRIES IN EACH HARDWARE AND prepare LISTS | ||
| 137 | RES_LEN DW RES_END - RESPONSE_LIST - 2 ;BYTE SIZE OF RESPONSE AREA | ||
| 138 | RES_HWCP DW RES_NUM_ENTRIES ;NUMBER OF HARDWARE CODE PAGES IN FOLLOWING LIST | ||
| 139 | DW RES_NUM_ENTRIES DUP(-1) | ||
| 140 | RES_DSCP DW RES_NUM_ENTRIES ;NUMBER OF prepare CODE PAGES IN FOLLOWING LIST | ||
| 141 | DW RES_NUM_ENTRIES DUP(-1) | ||
| 142 | RES_END EQU $ ;END OF QUERY prepare RESPONSE LIST | ||
| 143 | |||
| 144 | |||
| 145 | OLDINT24 DD ? ;ORIGINAL CONTENTS OF INT 24H VECTOR | ||
| 146 | CRITERROR DW 0 ;ERROR REPORTED IN DI TO INT 24H HANDLER | ||
| 147 | |||
| 148 | DEVICE_STATUS DW ? ;FLAGS SET BY IOCTL (GET DEVICE INFO) | ||
| 149 | DEV_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY | ||
| 150 | ; OPEN TO DEVICE FOR IOCTL I/O | ||
| 151 | FILE_HANDLE DW ? ;VALUE OF HANDLE RETURNED BY | ||
| 152 | ; OPEN TO FILESPEC. | ||
| 153 | DEV_TYPE DW prepare_STRT ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT" | ||
| 154 | ;THE HIGH BYTE IS JUST ZERO HERE, BUT | ||
| 155 | ; THAT WILL BE OR'ED IN LATER | ||
| 156 | PK PACKET <> ;SELECT, QUERY SELECTED, prepare END | ||
| 157 | |||
| 158 | PUBLIC PK | ||
| 159 | |||
| 160 | DBCS_headr DBCS_head <> | ||
| 161 | |||
| 162 | PUBLIC DBCS_headr | ||
| 163 | |||
| 164 | ; THESE NEXT TWO WORDS MUST BE KEPT TOGETHER | ||
| 165 | ; THEY ARE REFERENCED AS A DWORD | ||
| 166 | DBUF LABEL DWORD | ||
| 167 | BUF_OFF DW 0 ;OFFSET OF ALLOCATED BUFFER | ||
| 168 | BUF_SEG DW ? ;SEGID OF ALLOCATED BUFFER | ||
| 169 | |||
| 170 | BUF_SIZ DW 0FFFH ;REMEMBER HOW MUCH BUF IS AVAILABLE | ||
| 171 | ; (IN PARAGRAPHS, NOT BYTES) | ||
| 172 | BUF_BYTES DW ? ;NUMBER OF BYTES ACTUALLY IN THE BUFFER | ||
| 173 | PREPED DW 0 ;COUNT OF CODEPAGES KNOWN TO DEVICE | ||
| 174 | MINOR_VERSION DB 0,0 ;MINOR VERSION OF DOS | ||
| 175 | STATUS_BREAK DB 0 ;SAVES THE CURRENT STATUS OF "BREAK" | ||
| 176 | DEV_TABLE LABEL BYTE ;TABLE OF SUPPORTED DEVICE NAMES | ||
| 177 | CN DB "CON",0 | ||
| 178 | LP DB "PRN",0 | ||
| 179 | L1 DB "LPT1",0 | ||
| 180 | L2 DB "LPT2",0 | ||
| 181 | L3 DB "LPT3",0 | ||
| 182 | C1 DB "COM1",0 | ||
| 183 | C2 DB "COM2",0 | ||
| 184 | C3 DB "COM3",0 | ||
| 185 | C4 DB "COM4",0 | ||
| 186 | G1 DB "*",0 | ||
| 187 | END_DEV_TABLE LABEL BYTE | ||
| 188 | DEV_TAB_PTRS DW CN,LP,L1,L2,L3,C1,C2,C3,C4,G1,END_DEV_TABLE | ||
| 189 | NUM_TABL_ENTRIES EQU (($-DEV_TAB_PTRS)-2)/2 ;NUMBER OF DEVICE POINTERS | ||
| 190 | ;THE ENTRIES IN THE NEXT TABLE MUST BE KEPT IN THE SAME ORDER AS THE | ||
| 191 | ; DEVICE NAMES IN THE ABOVE LIST. THERE MUST BE A ONE-TO-ONE CORRESPONDENCE | ||
| 192 | ; BETWEEN THE DEVICE NAMES AND THIS TABLE OF DEVICE TYPES. | ||
| 193 | DEV_TYPES DB CON_DEV_TYPE ;CN | ||
| 194 | DB LPT_DEV_TYPE ;LP | ||
| 195 | DB LPT_DEV_TYPE ;L1 | ||
| 196 | DB LPT_DEV_TYPE ;L2 | ||
| 197 | DB LPT_DEV_TYPE ;L3 | ||
| 198 | DB COM_DEV_TYPE ;C1 | ||
| 199 | DB COM_DEV_TYPE ;C2 | ||
| 200 | DB COM_DEV_TYPE ;C3 | ||
| 201 | DB COM_DEV_TYPE ;C4 | ||
| 202 | DB GLOBAL_CP ;G1 | ||
| 203 | |||
| 204 | |||
| 205 | ;º º | ||
| 206 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 207 | |||
| 208 | |||
| 209 | |||
| 210 | MODECP PROC NEAR ;SUBROUTINE ENTRY POINT | ||
| 211 | |||
| 212 | |||
| 213 | PUBLIC MODECP | ||
| 214 | ;REMEMBER WHAT THE CURRENT SETTING IS | ||
| 215 | ; OF "BREAK" | ||
| 216 | DOSCALL BREAK_CHECK,REQUEST_BREAK_STATE ;CURRENT STATE RETURNED IN DL | ||
| 217 | |||
| 218 | MOV STATUS_BREAK,DL ;REMEMBER WHAT THE CURRENT BREAK STATUS IS | ||
| 219 | |||
| 220 | MOV DL,BREAK_OFF ;AVOID UNWANTED CTRL-BREAK DURING OPERATION | ||
| 221 | DOSCALL BREAK_CHECK,SET_BREAK_STATE | ||
| 222 | |||
| 223 | ;DOSCALL DOS_VERSION ;DETERMINE VERSION OF DOS | ||
| 224 | ;OUTPUT: AL=MAJOR, AH=MINOR VERSION NUMBER | ||
| 225 | ;MOV MINOR_VERSION,AH ; BX AND CX SET TO ZERO | ||
| 226 | |||
| 227 | ; REMEMBER ORIGINAL OWNER OF INT 24H | ||
| 228 | ; THE CRITICAL ERROR HANDLER | ||
| 229 | CALL SAVE_VECTOR24 ;SET DWORD AT "OLDINT24" WITH ORIGINAL POINTERS | ||
| 230 | |||
| 231 | ; SET UP THE DEVICE TYPE | ||
| 232 | ; FOR THE prepare START FUNCTION | ||
| 233 | MOV BX,CP_CB.cp_device ;SET A BASE REG TO POINT TO DEV NAME | ||
| 234 | CALL SET_DEV_TYPE ;INTERROGATE THE DEVICE NAME, | ||
| 235 | ; SET "DEV_TYPE" ACCORDINGLY | ||
| 236 | ;CMP BYTE PTR DEV_TYPE+BYTE,GLOBAL_CP ;WAS THE DEVICE SPECIFIED AS "*"? | ||
| 237 | ;$IF E | ||
| 238 | ; CALL SET_GLOBAL_CODEPAGE | ||
| 239 | ;$ELSE ;SINCE DEVICE WAS NOT "*" | ||
| 240 | |||
| 241 | |||
| 242 | ; OPEN DEVICE | ||
| 243 | MOV DX,BX ;DS:DX=POINTER TO ASCIIZ DEVICE NAME | ||
| 244 | DOSCALL OPEN,DEV_OPEN_MODE ;OPEN DEVICE WITH READ/WRITE ACCESS | ||
| 245 | |||
| 246 | ; $IF NC ;IF OPEN OK, | ||
| 247 | JC $$IF1 | ||
| 248 | MOV DEV_HANDLE,AX ;REMEMBER HANDLE TO DEVICE | ||
| 249 | |||
| 250 | MOV BX,AX ;PASS DEVICE HANDLE TO IOCTL | ||
| 251 | DOSCALL IOCTL,IOCTL_FUN_GET_INFO | ||
| 252 | |||
| 253 | MOV DEVICE_STATUS,DX ;SAVE THE DEVICE STATUS | ||
| 254 | ; $IF NC,AND ;IF OK | ||
| 255 | JC $$IF2 | ||
| 256 | TEST DX,ISDEVICE ;IS THIS A DEVICE OR FILE? | ||
| 257 | ; $IF NZ ;IF IS A DEVICE | ||
| 258 | JZ $$IF2 | ||
| 259 | CALL FUNCTION_SELECT ;CHECK THE "request_typ", AND | ||
| 260 | ; CALL THE APPROPRIATE FUNCTION HANDLER | ||
| 261 | ; $ELSE ;SINCE NOT A DEVICE, MUST BE A FILE | ||
| 262 | JMP SHORT $$EN2 | ||
| 263 | $$IF2: | ||
| 264 | MOV DX,OFFSET CPMSG15 ;PASS POINTER TO MSG PARM LIST | ||
| 265 | CALL SEND_MSG ;"DEVICE NOT SUPPORTED FOR CODEPAGE" | ||
| 266 | |||
| 267 | ; $ENDIF ;OK FROM IOCTL, AND DEVICE OR FILE? | ||
| 268 | $$EN2: | ||
| 269 | MOV BX,DEV_HANDLE | ||
| 270 | DOSCALL CLOSE ;FINISHED WITH DEVICE | ||
| 271 | |||
| 272 | ; $ELSE ;SINCE DEVICE OPEN NOT OK | ||
| 273 | JMP SHORT $$EN1 | ||
| 274 | $$IF1: | ||
| 275 | MOV AX,CP_CB.cp_device ;GET OFFSET TO ASCIIZ DEVICE NAME | ||
| 276 | MOV CPMSGLST2DEV,AX ; TO MSG PARM LIST | ||
| 277 | MOV DX,OFFSET CPMSG2 ;PASS POINTER TO MSG PARM LIST | ||
| 278 | CALL SEND_MSG ;"FAILURE TO OPEN DEVICE" | ||
| 279 | |||
| 280 | ; $ENDIF ;DEVICE OPEN OK? | ||
| 281 | $$EN1: | ||
| 282 | ;$ENDIF ;DEVICE "*"? | ||
| 283 | MOV DL,STATUS_BREAK ;GET WHAT THE BREAK STATUS USED TO BE | ||
| 284 | DOSCALL BREAK_CHECK,SET_BREAK_STATE ;RETURN TO USER DEFINED BREAK CONDITION | ||
| 285 | |||
| 286 | RET ;RETURN TO CALLER | ||
| 287 | MODECP ENDP | ||
| 288 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 289 | |||
| 290 | |||
| 291 | SET_DEV_TYPE PROC NEAR | ||
| 292 | |||
| 293 | |||
| 294 | |||
| 295 | ;INPUT: BX = OFFSET TO ASCIIZ OF DEVICE NAME | ||
| 296 | |||
| 297 | MOV CX,NUM_TABL_ENTRIES ;SET LOOP COUNTER TO NUMBER OF DEVICE NAMES IN LIST | ||
| 298 | MOV SI,OFFSET DEV_TAB_PTRS ;SET INDEX TO FIRST ENTRY IN TABLE OF POINTERS | ||
| 299 | MOV DI,OFFSET DEV_TYPES ;SET INDEX TO FIRST ENTRY OF DEVICE TYPES | ||
| 300 | ;$SEARCH ;LOOK THRU TABLE FOR MATCHING ENTRY | ||
| 301 | $$DO7: | ||
| 302 | PUSH DS ;AN002; | ||
| 303 | POP ES ;need ES and DS the same for the CMPSB ;AN002; | ||
| 304 | PUSH CX ;SAVE COUNTER OF DEVICE NAMES | ||
| 305 | PUSH SI ;SAVE POINTER TO TABLE OF POINTERS TO DEVICE NAMES | ||
| 306 | PUSH DI ;SAVE POINTER TO TABLE OF DEVICE TYPES | ||
| 307 | |||
| 308 | MOV CX,[SI]+WORD ;GET OFFSET TO NEXT DEVICE NAME | ||
| 309 | SUB CX,[SI] ;SET COUNT TO SIZE OF THIS DEVICE NAME | ||
| 310 | MOV DI,[SI] ;POINT TO DEVICE NAME FROM ENTRY IN TABLE | ||
| 311 | MOV SI,BX ;POINT TO DEVICE NAME FROM COMMAND LINE | ||
| 312 | REP CMPSB ;IS THIS THE ONE? | ||
| 313 | |||
| 314 | POP DI ;RESTORE POINTER TO DEVICE TYPE LIST | ||
| 315 | POP SI ;RESTORE POINTER TO TABLE OF DEVICE NAME POINTERS | ||
| 316 | POP CX ;RESTORE COUNTER OF DEVICES | ||
| 317 | ;$EXITIF E | ||
| 318 | JNE $$IF7 | ||
| 319 | MOV AL,BYTE PTR[DI] ;GET TYPE OF THIS DEVICE | ||
| 320 | ;$ORELSE | ||
| 321 | JMP SHORT $$SR7 | ||
| 322 | $$IF7: | ||
| 323 | ADD SI,WORD ;BUMP INDEX TO NEXT ENTRY IN TABLE | ||
| 324 | ADD DI,BYTE ;BUMP INDEX TO NEXT ENTRY IN TABLE | ||
| 325 | ;$ENDLOOP LOOP | ||
| 326 | LOOP $$DO7 | ||
| 327 | MOV AL,UNK_DEV_TYPE ;DEVICE NAME IS NOT IN THE ABOVE LIST | ||
| 328 | ;$ENDSRCH | ||
| 329 | $$SR7: | ||
| 330 | MOV BYTE PTR DEV_TYPE+BYTE,AL ;ADD DESCRIPTOR OF DEVICE TO DEV_TYPE WORD | ||
| 331 | |||
| 332 | RET | ||
| 333 | SET_DEV_TYPE ENDP | ||
| 334 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 335 | |||
| 336 | ;SET_GLOBAL_CODEPAGE PROC NEAR | ||
| 337 | ; | ||
| 338 | ;;DEVICE WAS SPECIFIED AS "*", INDICATING THE GLOBAL CODEPAGE IS THE DEVICE | ||
| 339 | ; | ||
| 340 | ; MOV AX,CP_CB.request_typ | ||
| 341 | ; CMP AX,SELECT | ||
| 342 | ; $IF E | ||
| 343 | ; MOV BX,CP_CB.DES_PACK_PTR ;SET BASE REG TO POINT TO PACKET AREA | ||
| 344 | ; MOV BX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE ID FROM PACKET | ||
| 345 | ; MOV AX,SET_GLOBAL_CP ;SET GLOBAL CODEPAGE | ||
| 346 | ; DOSCALL | ||
| 347 | ; | ||
| 348 | ; $IF C ;IF ERROR TRYING TO SET GLOBAL CODEPAGE | ||
| 349 | ; MOV CPMSGLST11FUN,OFFSET CPMSG11_SET ;PUT "SETTING" INTO MESSAGE | ||
| 350 | ; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST | ||
| 351 | ; CALL SEND_MSG | ||
| 352 | ; | ||
| 353 | ; $ELSE | ||
| 354 | ; MOV CPMSGLST10FUN,OFFSET CPMSG10_GLOBAL ;SET MSG TO SAY "GLOBAL" | ||
| 355 | ; MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST | ||
| 356 | ; CALL QUEUE ;"MODE GLOBAL CODEPAGE FUNCTION COMPLETED" | ||
| 357 | ; | ||
| 358 | ; $ENDIF ;ERROR IN SETTING GLOBAL CODEPAGE? | ||
| 359 | ; $ELSE ;SINCE NOT "SELECT" ASSUME IT IS "STATUS" | ||
| 360 | ; MOV AX,GET_GLOBAL_CP | ||
| 361 | ; DOSCALL | ||
| 362 | ; | ||
| 363 | ; $IF C ;IF ERROR | ||
| 364 | ; MOV CPMSGLST11FUN,OFFSET CPMSG11_GET ;PUT "GETTING" INTO MESSAGE | ||
| 365 | ; MOV DX,OFFSET CPMSG11 ;PASS OFFSET TO MSG PARM LIST | ||
| 366 | ; CALL SEND_MSG | ||
| 367 | ; | ||
| 368 | ; $ELSE ;SINCE NO ERROR | ||
| 369 | ; PUSH DX ; DX=SYSTEM CODE PAGE | ||
| 370 | ; PUSH BX ; BX=ACTIVE CODE PAGE | ||
| 371 | ; MOV DX,OFFSET CPMSG12 ;PASS OFFSET TO MSG PARM LIST | ||
| 372 | ; CALL QUEUE ;"CURRENT CODEPAGE SETTINGS:" | ||
| 373 | ; | ||
| 374 | ; MOV CPMSGLST13TYP,OFFSET CPMSG13_ACT ;PUT "ACTIVE" INTO MESSAGE | ||
| 375 | ; POP CPMSGLST13CP ;PASS ACTIVE CODEPAGE ID TO MSG PARM LIST (PUSHED FROM BX) | ||
| 376 | ; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST | ||
| 377 | ; CALL QUEUE ;" XXX - ACTIVE CODEPAGE" | ||
| 378 | ; | ||
| 379 | ; POP CPMSGLST13CP ;PASS SYSTEM CODE PAGE (PUSHED FROM DX) | ||
| 380 | ; MOV CPMSGLST13TYP,OFFSET CPMSG13_SYS ;PUT "SYSTEM" INTO MESSAGE | ||
| 381 | ; MOV DX,OFFSET CPMSG13 ;PASS OFFSET TO MSG PARM LIST | ||
| 382 | ; CALL QUEUE ;" XXX - SYSTEM CODEPAGE" | ||
| 383 | ; | ||
| 384 | ; $ENDIF ;ERROR IN GETTING GLOBAL CODEPAGE STATUS? | ||
| 385 | ; $ENDIF ;"SELECT" OR "STATUS"? | ||
| 386 | ; | ||
| 387 | ; RET | ||
| 388 | ;SET_GLOBAL_CODEPAGE ENDP | ||
| 389 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 390 | HEADER <SELECT FUNCTION HANDLING ROUTINE ACCORDING TO 'request_typ'> | ||
| 391 | |||
| 392 | FUNCTION_SELECT PROC NEAR | ||
| 393 | |||
| 394 | MOV AX,CP_CB.request_typ | ||
| 395 | CMP AX,PREPARE ;("prepare" IS INTERNAL USAGE ONLY; "PREPARE" IS WHAT CUSTOMER SEES) | ||
| 396 | ;$IF E ;IF "prepare" IS REQUESTED FUNCTION | ||
| 397 | JNE $$IF12 | ||
| 398 | CALL DO_prepare ;DEFINE FONTS TO DEVICE | ||
| 399 | |||
| 400 | ;$ELSE ;SINCE NOT A "prepare" | ||
| 401 | JMP SHORT $$EN12 | ||
| 402 | $$IF12: | ||
| 403 | CMP AX,SELECT | ||
| 404 | ; $IF E ;IF "SELECT" IS REQUESTED FUNCTION | ||
| 405 | JNE $$IF14 | ||
| 406 | CALL DO_SELECT | ||
| 407 | |||
| 408 | ; $ELSE ;SINCE NOT "SELECT" EITHER | ||
| 409 | JMP SHORT $$EN14 | ||
| 410 | $$IF14: | ||
| 411 | CMP AX,REFRESH | ||
| 412 | ; $IF E ;IF "REFRESH IS REQUSTED FUNCTION | ||
| 413 | JNE $$IF16 | ||
| 414 | CALL DO_REFRESH | ||
| 415 | |||
| 416 | ; $ELSE ;SINCE NONE OF THE ABOVE | ||
| 417 | JMP SHORT $$EN16 | ||
| 418 | $$IF16: | ||
| 419 | CALL DO_STATUS | ||
| 420 | |||
| 421 | ; $ENDIF ;REFRESH? | ||
| 422 | $$EN16: | ||
| 423 | ; $ENDIF ;SELECT? | ||
| 424 | $$EN14: | ||
| 425 | ;$ENDIF ;prepare? | ||
| 426 | $$EN12: | ||
| 427 | |||
| 428 | RET | ||
| 429 | FUNCTION_SELECT ENDP | ||
| 430 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 431 | HEADER <'prepare' - CODEPAGE FUNCTION> | ||
| 432 | |||
| 433 | DO_prepare PROC NEAR | ||
| 434 | |||
| 435 | PUBLIC DO_prepare | ||
| 436 | |||
| 437 | MOV BX,CP_CB.DES_PACK_PTR | ||
| 438 | TEST [BX].DES_STRT_PKFL,DES_STRT_FL_CART ;CARTRIDGE prepare? | ||
| 439 | ;$IF Z ;NO, LOOK FOR FONT FILE | ||
| 440 | JNZ $$IF21 | ||
| 441 | MOV AX,CS ;USE PREDEFINED AREA | ||
| 442 | MOV BUF_SEG,AX ;REMEMBER WHERE BUFFER IS | ||
| 443 | lea dx,dgroup:BUF ;buf is at end of allocated memory | ||
| 444 | mov BUF_OFF,dx | ||
| 445 | mov ax,ds:[6] ;get number bytes in this segment | ||
| 446 | sub ax,dx ;get size of buf to segment end | ||
| 447 | mov cl,4 ;shift count | ||
| 448 | shr ax,cl ;convert buf size to para size | ||
| 449 | MOV BUF_SIZ,ax ;SIZE IN PARAGRAPHS | ||
| 450 | ; OPEN FILE FOR INPUT | ||
| 451 | |||
| 452 | MOV DX,CP_CB.FONT_FILESPEC ;DS:DX = POINTER TO ASCIIZ PATH NAME | ||
| 453 | DOSCALL OPEN,FILE_OPEN_MODE ;OPEN CODEPAGE FILE IN READ ONLY MODE | ||
| 454 | |||
| 455 | ; $IF NC ;IF OPEN OK, | ||
| 456 | JC $$IF22 | ||
| 457 | MOV FILE_HANDLE,AX ;REMEMBER THE HANDLE TO THE FILE | ||
| 458 | CALL DES_START ;PERFORM THE prepare START | ||
| 459 | |||
| 460 | ; $IF NC ;IF prepare START WAS OK | ||
| 461 | JC $$IF23 | ||
| 462 | CALL DEVICE_TO_BINARY ;SET DEVICE TO "BINARY MODE" | ||
| 463 | |||
| 464 | CALL MOVE_FILE ;READ IN THE CODEPAGE FILE, SEND TO DEVICE | ||
| 465 | |||
| 466 | CALL DES_END ;PERFORM prepare END FUNCTION | ||
| 467 | |||
| 468 | ; $ELSE ;SINCE prepare START HAD A PROBLEM | ||
| 469 | JMP SHORT $$EN23 | ||
| 470 | $$IF23: | ||
| 471 | CALL DES_START_ERROR ;DISPLAY MSG SAYING WHY DES_START FAILED | ||
| 472 | |||
| 473 | ; $ENDIF ;prepare START OK? | ||
| 474 | $$EN23: | ||
| 475 | |||
| 476 | ; CLOSE A FILE HANDLE | ||
| 477 | MOV BX,FILE_HANDLE ;BX = HANDLE RETURNED BY OPEN OR CREATE | ||
| 478 | DOSCALL CLOSE | ||
| 479 | |||
| 480 | ; $ELSE ;SINCE FILE OPEN NOT OK | ||
| 481 | JMP SHORT $$EN22 | ||
| 482 | $$IF22: | ||
| 483 | MOV DX,OFFSET CPMSG1 ;PASS OFFSET TO MSG PARM LIST | ||
| 484 | CALL SEND_MSG ; "FAILURE TO OPEN CODEPAGE FONT FILE" | ||
| 485 | |||
| 486 | ; $ENDIF ;FILE OPEN OK? | ||
| 487 | $$EN22: | ||
| 488 | ;$ELSE ;SINCE NO FONT FILE SPEC INDICATED FOR CARTRIDGE, | ||
| 489 | JMP SHORT $$EN21 | ||
| 490 | $$IF21: | ||
| 491 | |||
| 492 | CALL DES_START ;PERFORM THE prepare START | ||
| 493 | |||
| 494 | ; $IF C | ||
| 495 | JNC $$IF29 | ||
| 496 | CALL DES_START_ERROR ;DISPLAY MSG SAYING WHY DES_START FAILED | ||
| 497 | |||
| 498 | ; $ELSE ;SINCE DES_START WAS OK, | ||
| 499 | JMP SHORT $$EN29 | ||
| 500 | $$IF29: | ||
| 501 | CALL DES_END ;PERFORM prepare END FUNCTION | ||
| 502 | |||
| 503 | ; $ENDIF ;DES_START ON CARTRIDGE OK? | ||
| 504 | $$EN29: | ||
| 505 | ;$ENDIF ;CARTRIDGE? | ||
| 506 | $$EN21: | ||
| 507 | RET | ||
| 508 | DO_prepare ENDP | ||
| 509 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 510 | DES_START PROC NEAR | ||
| 511 | |||
| 512 | PUBLIC DES_START | ||
| 513 | |||
| 514 | MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "prepare_STRT" | ||
| 515 | MOV DX,CP_CB.DES_PACK_PTR ;DS:DX=DATA BUFFER "DES_STRT_PACKET" | ||
| 516 | CALL DO_GENERIC_IOCTL | ||
| 517 | |||
| 518 | RET | ||
| 519 | DES_START ENDP | ||
| 520 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 521 | DES_START_ERROR PROC NEAR | ||
| 522 | ;AFTER DES_START, CARRY WAS SET ON, INDICATING AN ERROR | ||
| 523 | ; prepare START ERROR CODES: | ||
| 524 | ;DS_ERR0 EQU 0 PREVIOUS prepare DELETED | ||
| 525 | ;DS_ERR8 EQU 8 CODE PAGE CONFLICT (USED FOR KEYB XX MISMATCH) | ||
| 526 | ;DS_ERRA EQU 0AH DEVICE ERROR | ||
| 527 | ;DS_ERR16 EQU 016H UNKNOWN COMMAND | ||
| 528 | |||
| 529 | CALL EX_ERR ;GET EXTENDED ERROR | ||
| 530 | ;AX=EXTENDED ERROR | ||
| 531 | ;BH=ERROR CLASS | ||
| 532 | ;BL=SUGGESTED ACTION | ||
| 533 | ;CH=LOCUS | ||
| 534 | CMP AX,DS_ERRA+MAPERR ;DEVICE ERROR? | ||
| 535 | ;$IF E | ||
| 536 | JNE $$IF33 | ||
| 537 | ;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_PREP ;MOVE "PREPARE" INTO MESSAGE | ||
| 538 | set_submessage_ptr CPMSGxx_PREP,cpmsg17 ;MOVE "PREPARE" INTO MESSAGE ;AN002; | ||
| 539 | MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST | ||
| 540 | ;"DEVICE ERROR DURING PREPARE" | ||
| 541 | |||
| 542 | ;$ELSE ;SINCE NOT ERROR CODE 0AH, | ||
| 543 | JMP SHORT $$EN33 | ||
| 544 | $$IF33: | ||
| 545 | CMP AX,DS_ERR0+MAPERR ;PREVIOUS prepare DELETED? | ||
| 546 | ; $IF E | ||
| 547 | JNE $$IF35 | ||
| 548 | MOV DX,OFFSET CPMSG5 ;PASS OFFSET TO MSG PARM LIST | ||
| 549 | ;"PREVIOUSLY PREPARED CODEPAGE DELETED" | ||
| 550 | ; $ELSE | ||
| 551 | JMP SHORT $$EN35 | ||
| 552 | $$IF35: | ||
| 553 | CMP AX,DS_ERR16 ;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION? | ||
| 554 | ; $IF E,OR | ||
| 555 | JE $$LL37 | ||
| 556 | CMP AX,DS_ERR1 ;16=unknown command, 1=Invalid function number | ||
| 557 | ; $IF E | ||
| 558 | JNE $$IF37 | ||
| 559 | $$LL37: | ||
| 560 | MOV DX,OFFSET CPMSG15 ;PASS OFFSET TO MSG PARM LIST | ||
| 561 | ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM | ||
| 562 | |||
| 563 | ; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8 | ||
| 564 | JMP SHORT $$EN37 | ||
| 565 | $$IF37: | ||
| 566 | MOV DX,OFFSET CPMSG19 ;PASS OFFSET TO MSG PARM LIST | ||
| 567 | ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM | ||
| 568 | ; $ENDIF | ||
| 569 | $$EN37: | ||
| 570 | |||
| 571 | ; $ENDIF ;PREV prepare DELETED? | ||
| 572 | $$EN35: | ||
| 573 | ;$ENDIF ;WHICH ERROR CODE? | ||
| 574 | $$EN33: | ||
| 575 | CALL SEND_MSG ;DISPLAY INDICATED MESSAGE | ||
| 576 | |||
| 577 | |||
| 578 | RET | ||
| 579 | DES_START_ERROR ENDP | ||
| 580 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 581 | |||
| 582 | MOVE_FILE PROC NEAR | ||
| 583 | |||
| 584 | ;CODEPAGE FILE IS OPEN, THE prepare START IS COMPLETED OK... | ||
| 585 | |||
| 586 | dummy8: | ||
| 587 | public dummy8 | ||
| 588 | |||
| 589 | |||
| 590 | ;$SEARCH ;REPEAT READS UNTIL FILE COMPLETELY READ | ||
| 591 | $$DO42: | ||
| 592 | ; READ FROM A FILE OR DEVICE | ||
| 593 | MOV AX,BUF_SIZ ;NUMBER OF PARAS TO READ | ||
| 594 | MOV CL,4 | ||
| 595 | SHL AX,CL ;CONVERT PARA COUNT TO BYTE COUNT | ||
| 596 | MOV CX,AX ;PASS BYTE COUNT TO CX | ||
| 597 | MOV BX,FILE_HANDLE ;BX = FILE HANDLE | ||
| 598 | PUSH DS | ||
| 599 | LDS DX,DBUF ;DS:DX = BUFFER ADDRESS | ||
| 600 | DOSCALL READ | ||
| 601 | |||
| 602 | POP DS ;RESTORE DATA ADDRESSABILITY | ||
| 603 | ;$LEAVE C ;ERROR DURING READ? | ||
| 604 | JC $$EN42 | ||
| 605 | MOV BUF_BYTES,AX ;REMEMBER HOW MANY BYTES READ | ||
| 606 | CMP AX,0 ;WAS ANYTHING READ? | ||
| 607 | ;$LEAVE E ;NOTHING READ, QUIT | ||
| 608 | JE $$EN42 | ||
| 609 | ;SOMETHING WAS READ, PROCESS THE BUFFER | ||
| 610 | CALL HOOK_IN_MY_INT24 ;DO MY OWN ERROR HANDLING | ||
| 611 | |||
| 612 | ; WRITE TO A FILE OR DEVICE | ||
| 613 | MOV BX,DEV_HANDLE ;BX = FILE HANDLE | ||
| 614 | MOV CX,BUF_BYTES ;CX = NUMBER OF BYTES TO WRITE | ||
| 615 | PUSH DS | ||
| 616 | LDS DX,DBUF ;DS:DX = ADDRESS OF DATA TO WRITE | ||
| 617 | DOSCALL IOCTL,IOCTL_WRITE ;WRITE THE DATA TO THE DEVICE | ||
| 618 | |||
| 619 | POP DS | ||
| 620 | PUSHF ;SAVE FLAGS | ||
| 621 | CALL RESTORE_OLD_INT24 ;LET SYSTEM RESUME ERROR HANDLING | ||
| 622 | |||
| 623 | POPF ;RESTORE FLAGS | ||
| 624 | |||
| 625 | ;$EXITIF C ;QUIT IF A PROBLEM | ||
| 626 | JNC $$IF42 | ||
| 627 | ;prepare WRITE ERROR CODES: | ||
| 628 | ;DW_ERR8 EQU 8 DEVICE NOT FOUND IN FILE ,OR | ||
| 629 | ; CODE PAGE NOT FOUND IN FILE | ||
| 630 | ;DW_ERRA EQU 0AH DEVICE ERROR | ||
| 631 | ;DW_ERRC EQU 0CH FILE CONTENTS NOT A FONT FILE, | ||
| 632 | ; OR FILE CONTENTS STRUCTURE DAMAGED | ||
| 633 | CALL EX_ERR ;GET EXTENDED ERROR | ||
| 634 | ;AX=EXTENDED ERROR | ||
| 635 | ;BH=ERROR CLASS | ||
| 636 | ;BL=SUGGESTED ACTION | ||
| 637 | ;CH=LOCUS | ||
| 638 | CMP AX,FAIL24 ;DID ERROR COME FROM THE INT 24 HANDLER? | ||
| 639 | ; $IF E | ||
| 640 | JNE $$IF46 | ||
| 641 | MOV AX,CRITERROR ;REAL ERROR CAME FROM INT24 | ||
| 642 | ADD AX,MAPERR | ||
| 643 | ; $ENDIF | ||
| 644 | $$IF46: | ||
| 645 | CMP AX,DW_ERR8+MAPERR ;DEVICE NOT FOUND IN FILE ,OR | ||
| 646 | ; CODE PAGE NOT FOUND IN FILE | ||
| 647 | ; $IF E | ||
| 648 | JNE $$IF48 | ||
| 649 | MOV DX,OFFSET CPMSG3 ;"Missing from font file is either device or codepage" | ||
| 650 | ; $ELSE ;SINCE NOT ERR 8 | ||
| 651 | JMP SHORT $$EN48 | ||
| 652 | $$IF48: | ||
| 653 | CMP AX,DW_ERRA+MAPERR ;DEVICE ERROR | ||
| 654 | |||
| 655 | ; $IF E | ||
| 656 | JNE $$IF50 | ||
| 657 | ;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_WRIT ;"write of font file to device",EOM | ||
| 658 | set_submessage_ptr CPMSG17_WRIT,cpmsg17 ;"write of font file to device",EOM;AN001; | ||
| 659 | MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING %S" | ||
| 660 | ; $ELSE ;SINCE NOT ERR A NEITHER, MUST BE | ||
| 661 | JMP SHORT $$EN50 | ||
| 662 | $$IF50: | ||
| 663 | ; FILE CONTENTS NOT A FONT FILE, | ||
| 664 | ; OR FILE CONTENTS STRUCTURE DAMAGED | ||
| 665 | MOV DX,OFFSET CPMSG4 ;"Font file contents invalid" | ||
| 666 | ; $ENDIF ;ERR "A"? | ||
| 667 | $$EN50: | ||
| 668 | ; $ENDIF ;ERR 8? | ||
| 669 | $$EN48: | ||
| 670 | CALL SEND_MSG ;DISPLAY THE ERROR MSG POINTED TO BY DX | ||
| 671 | |||
| 672 | ;$ORELSE ;SINCE WRITE TO DEVICE WAS OK, | ||
| 673 | JMP SHORT $$SR42 | ||
| 674 | $$IF42: | ||
| 675 | ;$ENDLOOP ;GO BACK AND READ SOME MORE | ||
| 676 | JMP SHORT $$DO42 | ||
| 677 | $$EN42: | ||
| 678 | ; $IF C ;IF READ ERROR | ||
| 679 | JNC $$IF56 | ||
| 680 | MOV DX,OFFSET CPMSG20 ;"ERROR DURING READ OF FONT FILE" | ||
| 681 | CALL SEND_MSG ;DISPLAY THE ERROR MSG POINTED TO BY DX | ||
| 682 | |||
| 683 | ; $ENDIF ;READ ERROR? | ||
| 684 | $$IF56: | ||
| 685 | ;$ENDSRCH | ||
| 686 | $$SR42: | ||
| 687 | |||
| 688 | RET | ||
| 689 | MOVE_FILE ENDP | ||
| 690 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 691 | |||
| 692 | DES_END PROC NEAR | ||
| 693 | |||
| 694 | MOV CX,DEV_TYPE ;PICK UP DEVICE TYPE AS MAJOR CODE | ||
| 695 | MOV CL,prepare_END ;CX=xxx_DEV_TYPE * 256 + "prepare_END" | ||
| 696 | MOV DX,OFFSET PK ;DS:DX=DATA BUFFER, PROBABLY NOT USED | ||
| 697 | ; THIS IS JUST A DUMMY BUFFER, NO DATA FOR IT | ||
| 698 | CALL DO_GENERIC_IOCTL | ||
| 699 | |||
| 700 | ;$IF C ;IF THERE WAS AN ERROR | ||
| 701 | JNC $$IF59 | ||
| 702 | ;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_PREP ;MOVE "PREPARE" INTO MESSAGE | ||
| 703 | set_submessage_ptr CPMSGxx_PREP,cpmsg17 ;MOVE "PREPARE" INTO MESSAGE | ||
| 704 | MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST | ||
| 705 | CALL SEND_MSG ;"DEVICE ERROR DURING PREPARE" | ||
| 706 | |||
| 707 | ;$ELSE ;SINCE NO ERROR DURING PREPARE END, | ||
| 708 | JMP SHORT $$EN59 | ||
| 709 | $$IF59: | ||
| 710 | CMP NOERROR,TRUE | ||
| 711 | ; $IF E ;IF no previous errors THEN | ||
| 712 | JNE $$IF61 | ||
| 713 | CMP current_request,refresh_request | ||
| 714 | ; $IF E | ||
| 715 | JNE $$IF62 | ||
| 716 | ;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_REFRESH ;SET MSG TO SAY "REFRESH" | ||
| 717 | set_submessage_ptr CPMSGxx_REFRESH,cpmsg10 ;SET MSG TO SAY "REFRESH";AN001; | ||
| 718 | ; $ELSE | ||
| 719 | JMP SHORT $$EN62 | ||
| 720 | $$IF62: | ||
| 721 | ;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_DES ;SET MSG TO SAY "PREPARE" | ||
| 722 | set_submessage_ptr CPMSGxx_prep,cpmsg10 ;SET MSG TO SAY "PREPARE";AN001; | ||
| 723 | ; $ENDIF | ||
| 724 | $$EN62: | ||
| 725 | MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST | ||
| 726 | CALL printf ;"MODE PREPARE CODEPAGE FUNCTION COMPLETED" | ||
| 727 | ; $ENDIF | ||
| 728 | $$IF61: | ||
| 729 | |||
| 730 | ;$ENDIF ;ERROR DURING PREPARE END? | ||
| 731 | $$EN59: | ||
| 732 | RET | ||
| 733 | DES_END ENDP | ||
| 734 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 735 | |||
| 736 | ; 'SELECT' - FUNCTION HANDLER | ||
| 737 | |||
| 738 | |||
| 739 | |||
| 740 | DO_SELECT PROC NEAR | ||
| 741 | |||
| 742 | CALL setup_packet_for_DBCS ;see if DBCS vectors needed, if so move them into the packet | ||
| 743 | MOV BX,CP_CB.DES_PACK_PTR ;GET PACKET FROM INPUT PARMLIST | ||
| 744 | MOV AX,[BX].DES_STRT_PKCP1 ;GET CODEPAGE FROM HIS PACKET | ||
| 745 | MOV PK.PACKCPID,AX ; INTO PACKET EXPECTED BY SELECT FUNCTION | ||
| 746 | MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE" | ||
| 747 | MOV CL,SELECT_CP ;SET MINOR CODE TO "SELECT" | ||
| 748 | MOV DX,OFFSET PK ;DS:DX=DATA BUFFER "PACKET" | ||
| 749 | CALL DO_GENERIC_IOCTL | ||
| 750 | |||
| 751 | dummy10: | ||
| 752 | public dummy10 | ||
| 753 | |||
| 754 | ;$IF C ;IF SELECT WAS NOT OK | ||
| 755 | JNC $$IF67 | ||
| 756 | |||
| 757 | CALL EX_ERR ;GET EXTENDED ERROR | ||
| 758 | ;AX=EXTENDED ERROR | ||
| 759 | ;BH=ERROR CLASS | ||
| 760 | ;BL=SUGGESTED ACTION | ||
| 761 | ;CH=LOCUS | ||
| 762 | CMP AX,IN_ERR7+MAPERR ;CODE PAGE NOT PREPARED? | ||
| 763 | ; $IF E | ||
| 764 | JNE $$IF68 | ||
| 765 | MOV DX,OFFSET CPMSG18 ;PASS OFFSET TO MSG PARM LIST | ||
| 766 | ;"SPECIFIED CODEPAGE NOT PREPARED" | ||
| 767 | ; $ELSE ;NOT ERR7, MUST BE SOMETHING ELSE | ||
| 768 | JMP SHORT $$EN68 | ||
| 769 | $$IF68: | ||
| 770 | CMP AX,IN_ERR8+MAPERR ;KEYBOARD SUPPORT THIS CODEPAGE? | ||
| 771 | ; $IF E | ||
| 772 | JNE $$IF70 | ||
| 773 | MOV DX,OFFSET CPMSG19 ;"CURRENT KEYBOARD DOES NOT SUPPORT THIS CP" | ||
| 774 | ; $ELSE ;SINCE NOT ERR8 EITHER, MUST BE DEVICE ERROR | ||
| 775 | JMP SHORT $$EN70 | ||
| 776 | $$IF70: | ||
| 777 | |||
| 778 | ;AC001; MOV CPMSGLST17FUN,OFFSET CPMSG17_ACT | ||
| 779 | set_submessage_ptr CPMSGxx_select,cpmsg17 ;AN001; | ||
| 780 | MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING SELECT" | ||
| 781 | ; $ENDIF ;KEYB SUPPORT THIS CODEPAGE? | ||
| 782 | $$EN70: | ||
| 783 | ; $ENDIF ;CP NOT PREPARED? | ||
| 784 | $$EN68: | ||
| 785 | CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE | ||
| 786 | |||
| 787 | ;$ELSE ;SINCE SELECT WAS OK, | ||
| 788 | JMP SHORT $$EN67 | ||
| 789 | $$IF67: | ||
| 790 | CMP NOERROR,TRUE | ||
| 791 | ; $IF E ;IF no previous errors THEN | ||
| 792 | JNE $$IF75 | ||
| 793 | ;AC001;MOV CPMSGLST10FUN,OFFSET CPMSG10_SELECT ;SET MSG TO SAY "SELECT" | ||
| 794 | set_submessage_ptr CPMSGxx_SELECT,cpmsg10 ;SET MSG TO SAY "SELECT" | ||
| 795 | MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST | ||
| 796 | CALL printf ;"MODE SELECT CODEPAGE FUNCTION COMPLETED" | ||
| 797 | ; $ENDIF | ||
| 798 | $$IF75: | ||
| 799 | |||
| 800 | ;$ENDIF ;SELECT OK? | ||
| 801 | $$EN67: | ||
| 802 | |||
| 803 | RET | ||
| 804 | DO_SELECT ENDP | ||
| 805 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 806 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 807 | ;³ | ||
| 808 | ;³ DO_REFRESH | ||
| 809 | ;³ ---------- | ||
| 810 | ;³ | ||
| 811 | ;³ THIS EVENT WOULD BE REQUIRED IN CASE THE EXTERNAL DEVICE LOST ITS LOADABLE | ||
| 812 | ;³ FONT DESCRIPTIONS, AS PERHAPS IF THE PRINTER GOT TURNED OFF, FOR EXAMPLE. | ||
| 813 | ;³ | ||
| 814 | ;³ The possible return codes for a REFRESH request will be returned only on a | ||
| 815 | ;³ designate start and are defined as follows: | ||
| 816 | ;³ | ||
| 817 | ;³ 8008 - For DISPLAY.SYS this means that there is a keyboard/code page conflict. | ||
| 818 | ;³ | ||
| 819 | ;³ 800A - Device error. | ||
| 820 | ;³ | ||
| 821 | ;³ 800C - The device driver does not have a copy of the code page in memory. | ||
| 822 | ;³ This could be due to the DEVICE= command in CONFIG.SYS not setting up | ||
| 823 | ;³ the buffer, so all previous prepares were handled by downloading the | ||
| 824 | ;³ code page directly to the printer. | ||
| 825 | ;³ | ||
| 826 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 827 | |||
| 828 | |||
| 829 | HEADER <'REFRESH' - RELOAD EXISTING FONTS> | ||
| 830 | |||
| 831 | |||
| 832 | DO_REFRESH PROC NEAR | ||
| 833 | |||
| 834 | |||
| 835 | MOV current_request,refresh_request | ||
| 836 | |||
| 837 | CALL DES_START ;PERFORM THE prepare START | ||
| 838 | |||
| 839 | ;$IF NC ;IF prepare START WAS OK | ||
| 840 | JC $$IF78 | ||
| 841 | CALL DEVICE_TO_BINARY ;SET DEVICE TO "BINARY MODE" | ||
| 842 | |||
| 843 | ;UNLIKE THE prepare FUNCTION, THERE IS NO FONT FILE TO BE SENT TO THE | ||
| 844 | ;DEVICE DRIVER, WHO SHOULD STILL HAVE THE FONT DESCRIPTOR DATA TO BE | ||
| 845 | ;RETRANSMITTED TO THE EXTERNAL DEVICE ITSELF. | ||
| 846 | |||
| 847 | |||
| 848 | |||
| 849 | CALL DES_END ;PERFORM prepare END FUNCTION | ||
| 850 | |||
| 851 | ;$ELSE ;SINCE prepare START HAD A PROBLEM | ||
| 852 | JMP SHORT $$EN78 | ||
| 853 | $$IF78: | ||
| 854 | |||
| 855 | ;AFTER DES_START, CARRY WAS SET ON, INDICATING AN ERROR | ||
| 856 | ; prepare START ERROR CODES for REFRESH request: | ||
| 857 | ;RS_ERR8 EQU 8 ;KEYBOARD/CODE PAGE CONFLICT | ||
| 858 | ;RS_ERRA EQU 0AH ;DEVICE ERROR | ||
| 859 | ;RS_ERRC EQU 0CH ;DEVICE DRIVER DOES NOT HAVE COPY OF CODE PAGE | ||
| 860 | |||
| 861 | CALL EX_ERR ;GET EXTENDED ERROR | ||
| 862 | ;AX=EXTENDED ERROR | ||
| 863 | ;BH=ERROR CLASS | ||
| 864 | ;BL=SUGGESTED ACTION | ||
| 865 | ;CH=LOCUS | ||
| 866 | CMP AX,DS_ERRA+MAPERR ;DEVICE ERROR? | ||
| 867 | ; $IF E | ||
| 868 | JNE $$IF80 | ||
| 869 | ;AC001;MOV CPMSGLST17FUN,OFFSET CPMSG17_REFRESH ;MOVE "Refresh" INTO MESSAGE | ||
| 870 | set_submessage_ptr CPMSGxx_REFRESH,cpmsg17 ;MOVE "Refresh" INTO MESSAGE ;AN001; | ||
| 871 | MOV DX,OFFSET CPMSG17 ;PASS OFFSET TO MSG PARM LIST | ||
| 872 | ;"Device error during REFRESH" | ||
| 873 | |||
| 874 | ; $ELSE ;SINCE NOT ERROR CODE 0AH, | ||
| 875 | JMP SHORT $$EN80 | ||
| 876 | $$IF80: | ||
| 877 | CMP AX,RS_ERRC+MAPERR | ||
| 878 | ; $IF E ;IF driver unable to download because he has no buffer THEN | ||
| 879 | JNE $$IF82 | ||
| 880 | MOV DX,OFFSET CPMSG21 ;PASS OFFSET TO MSG PARM LIST | ||
| 881 | ;"Unable to perform REFRESH" | ||
| 882 | ; $ELSE | ||
| 883 | JMP SHORT $$EN82 | ||
| 884 | $$IF82: | ||
| 885 | CMP AX,DS_ERR16 ;DOES THE DEVICE DRIVER SUPPORT DESIGNATE START FUNCTION? | ||
| 886 | ; $IF E,OR | ||
| 887 | JE $$LL84 | ||
| 888 | CMP AX,DS_ERR1 ;16=unknown command, 1=Invalid function number | ||
| 889 | ; $IF E | ||
| 890 | JNE $$IF84 | ||
| 891 | $$LL84: | ||
| 892 | MOV DX,OFFSET CPMSG15 ;PASS OFFSET TO MSG PARM LIST | ||
| 893 | ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM | ||
| 894 | |||
| 895 | ; $ELSE ;SINCE NOT THAT EITHER, ASSUME MUST BE CODE 8 | ||
| 896 | JMP SHORT $$EN84 | ||
| 897 | $$IF84: | ||
| 898 | MOV DX,OFFSET CPMSG19 ;PASS OFFSET TO MSG PARM LIST | ||
| 899 | ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM | ||
| 900 | ; $ENDIF | ||
| 901 | $$EN84: | ||
| 902 | |||
| 903 | ; $ENDIF ;PREV prepare DELETED? | ||
| 904 | $$EN82: | ||
| 905 | ; $ENDIF ;WHICH ERROR CODE? | ||
| 906 | $$EN80: | ||
| 907 | CALL SEND_MSG ;DISPLAY INDICATED MESSAGE | ||
| 908 | |||
| 909 | ;$ENDIF ;prepare START OK? | ||
| 910 | $$EN78: | ||
| 911 | |||
| 912 | RET | ||
| 913 | DO_REFRESH ENDP | ||
| 914 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 915 | DEVICE_TO_BINARY PROC NEAR | ||
| 916 | |||
| 917 | MOV DX,DEVICE_STATUS ;GET BITS DEFINING DEVICE | ||
| 918 | OR DX,BINARY_DEV ;TURN ON THE "BINARY" FLAG BIT | ||
| 919 | XOR DH,DH ;BE SURE DH IS CLEAR | ||
| 920 | MOV BX,DEV_HANDLE ;PASS THE DEVICE HANDLE TO IOCTL | ||
| 921 | DOSCALL IOCTL,IOCTL_FUN_SET_INFO ;SET DEVICE TO "BINARY" | ||
| 922 | |||
| 923 | RET | ||
| 924 | DEVICE_TO_BINARY ENDP | ||
| 925 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 926 | HEADER <'STATUS' - QUERY FUNCTION HANDLER> | ||
| 927 | |||
| 928 | PUBLIC do_status | ||
| 929 | |||
| 930 | DO_STATUS PROC NEAR | ||
| 931 | |||
| 932 | CALL setup_packet_for_DBCS | ||
| 933 | MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE" | ||
| 934 | MOV CL,QUERY_SELECTED ;SET MINOR CODE TO "QUERY SELECT" | ||
| 935 | MOV DX,OFFSET PK ;DS:DX=DATA BUFFER "PACKET" | ||
| 936 | CALL DO_GENERIC_IOCTL | ||
| 937 | |||
| 938 | ;$IF C | ||
| 939 | JNC $$IF90 | ||
| 940 | CALL QUERY_ERROR ;DISPLAY CAUSE OF PROBLEM | ||
| 941 | |||
| 942 | ;$ELSE ;SINCE NOT ERROR ON QUERY | ||
| 943 | JMP SHORT $$EN90 | ||
| 944 | $$IF90: | ||
| 945 | MOV AX,PK.PACKCPID ;GET CODEPAGE ID FROM PACKET | ||
| 946 | MOV CPMSGLST6CP,AX ;PASS CODEPAGE ID TO PRINTF | ||
| 947 | MOV AX,CP_CB.cp_device ;GET POINTER TO DEVICE NAME | ||
| 948 | MOV CPMSGLST6DEV,AX ;OFFSET TO DEVICE NAME MOVED TO MSG PARM LST | ||
| 949 | MOV DX,OFFSET CPMSG6 ;PASS OFFSET TO MSG PARM LIST | ||
| 950 | CALL printf ;DISPLAY THE MESSAGE: | ||
| 951 | ; "CURRENTLY SELECTD CODEPAGE IS %D FOR DEVICE: %S",CR,LF,0 | ||
| 952 | |||
| 953 | CALL QUERY_LISTER ;DISPLAY LIST OF PREPPED CODEPAGES | ||
| 954 | |||
| 955 | ;$ENDIF ;ERR FROM QUERY ACTIVE? | ||
| 956 | $$EN90: | ||
| 957 | |||
| 958 | RET | ||
| 959 | DO_STATUS ENDP | ||
| 960 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 961 | QUERY_LISTER PROC NEAR | ||
| 962 | |||
| 963 | MOV CX,DEV_TYPE ;CX=xxx_DEV_TYPE * 256 + "MINOR CODE" | ||
| 964 | MOV CL,QUERY_DES_LST ;SET MINOR CODE TO "QUERY prepare LIST" | ||
| 965 | MOV DX,OFFSET RESPONSE_LIST ;DS:DX=DATA BUFFER | ||
| 966 | CALL DO_GENERIC_IOCTL | ||
| 967 | |||
| 968 | ;$IF C ;IF PROBLEM WITH QUERY LIST | ||
| 969 | JNC $$IF93 | ||
| 970 | CALL QUERY_ERROR ;DISPLAY CAUSE OF PROBLEM | ||
| 971 | |||
| 972 | ;$ELSE ;SINCE NO PROBLEM WITH QUERY LIST | ||
| 973 | JMP SHORT $$EN93 | ||
| 974 | $$IF93: | ||
| 975 | MOV SI,OFFSET RES_HWCP ;START WITH THE LIST OF HARDWARE CODEPAGES | ||
| 976 | MOV CX,[SI] ;GET NUMBER OF HARDWARE CODEPAGES IN LIST IN PACKET | ||
| 977 | ADD SI,WORD ;START WITH THE FIRST CODEPAGE | ||
| 978 | ; $IF NCXZ ;IF ANY HARDWARE CODEPAGES ARE PRESENT | ||
| 979 | JCXZ $$IF95 | ||
| 980 | ;AC001;MOV CPMSGLST8HD,OFFSET CPMSG8_HW ;GET OFFSET OF "HARDWARE" TO MSG PARM LIST | ||
| 981 | PUSH CX ;protect from SYSGETMSG ;AC001; | ||
| 982 | PUSH SI ;protect from SYSGETMSG ;AC001; | ||
| 983 | set_submessage_ptr CPMSG8_HW,cpmsg8 ;GET OFFSET OF "HARDWARE" TO MSG PARM LIST;AC001; | ||
| 984 | POP SI | ||
| 985 | POP CX | ||
| 986 | CALL DISPLAY_CPID | ||
| 987 | |||
| 988 | ; $ENDIF ;HARDWARE CODEPAGES PRESENT? | ||
| 989 | $$IF95: | ||
| 990 | MOV CX,[SI] ;GET NUMBER OF prepare CODEPAGES IN LIST IN PACKET | ||
| 991 | ADD SI,WORD ;LOOK AT NEXT CODEPAGE ENTRY IN LIST | ||
| 992 | ; $IF NCXZ ;IF ANY prepare CODEPAGES ARE PRESENT | ||
| 993 | JCXZ $$IF97 | ||
| 994 | ;AC001;MOV CPMSGLST8HD,OFFSET CPMSG8_PR ;GET OFFSET OF "PREPARED" TO MSG PARM LIST | ||
| 995 | PUSH CX ;protect from SYSGETMSG ;AC001; | ||
| 996 | PUSH SI ;protect from SYSGETMSG ;AC001; | ||
| 997 | set_submessage_ptr CPMSG8_PR,cpmsg8 ;GET OFFSET OF "PREPARED" TO MSG PARM LIST ;AC001; | ||
| 998 | POP SI | ||
| 999 | POP CX | ||
| 1000 | CALL DISPLAY_CPID | ||
| 1001 | |||
| 1002 | ; $ENDIF ;PREPARED CODEPAGES PRESENT? | ||
| 1003 | $$IF97: | ||
| 1004 | CMP PREPED,0 ;CHECK COUNT OF PREPED CODEPAGES | ||
| 1005 | ; $IF Z ;IF NONE, | ||
| 1006 | JNZ $$IF99 | ||
| 1007 | MOV AX,CP_CB.cp_device ;GET POINTER TO DEVICE NAME | ||
| 1008 | MOV CPMSGLST7DEV,AX ;OFFSET TO DEVICE NAME MOVED TO MSG PARM LST | ||
| 1009 | MOV DX,OFFSET CPMSG7 ;PASS OFFSET TO MSG PARM LIST | ||
| 1010 | CALL printf ;DISPLAY THE MESSAGE: | ||
| 1011 | ; "NO CODEPAGES PREPARED FOR DEVICE: %S",CR,LF,0 | ||
| 1012 | ; $ENDIF ;PREPED PAGES? | ||
| 1013 | $$IF99: | ||
| 1014 | ;$ENDIF ;ERR FROM QUERY LIST? | ||
| 1015 | $$EN93: | ||
| 1016 | CMP NOERROR,TRUE | ||
| 1017 | ;$IF E ;IF no previous errors THEN | ||
| 1018 | JNE $$IF102 | ||
| 1019 | ;AC001; MOV CPMSGLST10FUN,OFFSET CPMSG10_QUERY ;SET MSG TO SAY "QUERY" | ||
| 1020 | set_submessage_ptr cpmSGxx_QUERY,cpmsg10 ;SET MSG TO SAY "QUERY" ;AN001; | ||
| 1021 | MOV DX,OFFSET CPMSG10 ;PASS OFFSET TO MSG PARM LIST | ||
| 1022 | CALL printf ;"MODE QUERRY CODEPAGE FUNCTION COMPLETED" | ||
| 1023 | ;$ENDIF | ||
| 1024 | $$IF102: | ||
| 1025 | |||
| 1026 | RET | ||
| 1027 | QUERY_LISTER ENDP | ||
| 1028 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1029 | |||
| 1030 | |||
| 1031 | QUERY_ERROR PROC NEAR | ||
| 1032 | |||
| 1033 | |||
| 1034 | ;CARRY WAS SET AFTER "QUERY SELECT" OR "QUERY LIST". | ||
| 1035 | |||
| 1036 | CALL EX_ERR ;GET EXTENDED ERROR | ||
| 1037 | ;AX=EXTENDED ERROR | ||
| 1038 | ;BH=ERROR CLASS | ||
| 1039 | ;BL=SUGGESTED ACTION | ||
| 1040 | ;CH=LOCUS | ||
| 1041 | CMP AX,QS_ERR7+MAPERR ;CODE PAGE NOT SELECTD? | ||
| 1042 | |||
| 1043 | .IF <AX EQ <QS_ERR7+MAPERR>> THEN ;CODE PAGE NOT SELECTD? ;AC665; | ||
| 1044 | MOV DX,OFFSET CPMSG16 ;PASS OFFSET TO MSG PARM LIST | ||
| 1045 | ;"NO CODEPAGE HAS BEEN SELECTED" | ||
| 1046 | CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE | ||
| 1047 | |||
| 1048 | MOV NOERROR,TRUE ;FORGET THE ABOVE WAS FLAGGED AS "ERROR" | ||
| 1049 | CALL QUERY_LISTER ;LIST PREPPED CODEPAGES ANYWAY | ||
| 1050 | |||
| 1051 | .ELSEIF <AX EQ DS_ERR16> OR ;016H UNKNOWN COMMAND, i.e. device driver not loaded ;AN665; | ||
| 1052 | .IF <AX EQ DS_ERR1> THEN ;;AN665;16=unknown command, 1=Invalid function number | ||
| 1053 | MOV DX,OFFSET CPMSG15 ;AN665;PASS OFFSET TO MSG PARM LIST, "Codepage operation not supported on this device" | ||
| 1054 | CALL SEND_MSG ;DISPLAY INDICATED ERROR MESSAGE | ||
| 1055 | |||
| 1056 | .ELSE ;NOT ERR7 or 16, MUST BE DEVICE ERROR ;AC665; | ||
| 1057 | ;AC002; MOV CPMSGLST17FUN,OFFSET CPMSG17_QUERY | ||
| 1058 | set_submessage_ptr CPMSGxx_QUERY,cpmsg17 | ||
| 1059 | MOV DX,OFFSET CPMSG17 ;"DEVICE ERROR DURING QUERY" | ||
| 1060 | |||
| 1061 | .ENDIF ;CP NOT PREPARED? | ||
| 1062 | |||
| 1063 | RET | ||
| 1064 | QUERY_ERROR ENDP | ||
| 1065 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1066 | DISPLAY_CPID PROC NEAR | ||
| 1067 | ;INPUT: SI=OFFSET TO CODEPAGE ID WORD IN LIST | ||
| 1068 | |||
| 1069 | MOV DX,OFFSET CPMSG8 ;PASS OFFSET TO MSG PARM LIST | ||
| 1070 | CALL printf ;DISPLAY THE MESSAGE: | ||
| 1071 | ; "%s CODEPAGES:" | ||
| 1072 | CLD ;REQUEST INCREMENT IF INDEX | ||
| 1073 | ;$DO | ||
| 1074 | $$DO104: | ||
| 1075 | LODSW ;GET CODEPAGE ID FROM PACKET | ||
| 1076 | ;SI NOW POINTS TO NEXT WORD IN CODEPAGE LIST | ||
| 1077 | CMP AL,EMPTY | ||
| 1078 | ; $IF E | ||
| 1079 | JNE $$IF105 | ||
| 1080 | MOV DX,OFFSET CPMSG14 ;PASS OFFSET TO MSG PARM LIST | ||
| 1081 | ; " Codepage unprepared",CR,LF,0 | ||
| 1082 | ; $ELSE ;SINCE NOT EMPTY, | ||
| 1083 | JMP SHORT $$EN105 | ||
| 1084 | $$IF105: | ||
| 1085 | INC PREPED ;COUNT PREPED CODEPAGES | ||
| 1086 | MOV CPMSGLST9CP,AX ;PASS CODEPAGE ID TO PRINTF | ||
| 1087 | MOV DX,OFFSET CPMSG9 ;PASS OFFSET TO MSG PARM LIST | ||
| 1088 | ; " Codepage %d",CR,LF,0 | ||
| 1089 | ; $ENDIF ;EMPTY? | ||
| 1090 | $$EN105: | ||
| 1091 | CALL printf ;DISPLAY THE MESSAGE | ||
| 1092 | |||
| 1093 | ;$ENDDO LOOP | ||
| 1094 | LOOP $$DO104 | ||
| 1095 | |||
| 1096 | RET | ||
| 1097 | DISPLAY_CPID ENDP | ||
| 1098 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1099 | HEADER <SUBROUTINES TO HANDLE MESSAGES TO STDOUT OR STDERR> | ||
| 1100 | SEND_MSG PROC NEAR ;USED TO SEND "ERROR" MESSAGES ONLY | ||
| 1101 | ;FOR NON-ERROR MESSAGES, CALL printf DIRECTLY. | ||
| 1102 | ;INPUT: DX=OFFSET TO PRINTF MESSAGE PARM LIST | ||
| 1103 | |||
| 1104 | MOV NOERROR,FALSE ;SET ERROR TO ERRORLEVEL | ||
| 1105 | CALL printf | ||
| 1106 | |||
| 1107 | RET | ||
| 1108 | SEND_MSG ENDP | ||
| 1109 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1110 | EX_ERR PROC NEAR | ||
| 1111 | ;THE DOSCALL RESPONDED WITH CARRY, SO GET EXTENDED ERROR | ||
| 1112 | MOV BX,WORD PTR MINOR_VERSION ;BX = 30 VERSION NUMBER (FOR 3.30) | ||
| 1113 | DOSCALL EXTERROR ;EXTENDED ERROR | ||
| 1114 | ;OUTPUT: | ||
| 1115 | ;AX=EXTENDED ERROR | ||
| 1116 | ;BH=ERROR CLASS | ||
| 1117 | ;BL=SUGGESTED ACTION | ||
| 1118 | ;CH=LOCUS | ||
| 1119 | RET | ||
| 1120 | EX_ERR ENDP | ||
| 1121 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1122 | DO_GENERIC_IOCTL PROC NEAR | ||
| 1123 | |||
| 1124 | PUBLIC DO_GENERIC_IOCTL | ||
| 1125 | |||
| 1126 | ;INPUT CX=xxx_DEV_TYPE * 256 + "MINOR CODE" | ||
| 1127 | ; DS:DX=DATA BUFFER | ||
| 1128 | |||
| 1129 | MOV BX,DEV_HANDLE ;BX=HANDLE | ||
| 1130 | MOV AX,GENERIC_IOCTL ;AX="GENERIC_IOCTL" | ||
| 1131 | DOSCALL ;SELECT DEVICE WITH GENERIC_IOCTL | ||
| 1132 | |||
| 1133 | RET | ||
| 1134 | DO_GENERIC_IOCTL ENDP | ||
| 1135 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1136 | HEADER <INT 24H - CRITICAL ERROR HANDLER, AND SUBROUTINES> | ||
| 1137 | HANDLER24 PROC NEAR ;CRITICAL ERROR HANDLER FOR INT 24H | ||
| 1138 | ;WHEN THE CRITICAL ERROR OCCURS, CONTROL IS TRANSFERRED TO INTERRUPT 24H. | ||
| 1139 | ;BP:SI POINTS TO THE DEVICE HEADER CONTROL BLOCK. | ||
| 1140 | |||
| 1141 | ;ERROR CODE IS IN THE LOWER HALF OF THE DI REG WITH UPPER HALF UNDEFINED. | ||
| 1142 | ;ERROR CODES ARE DEFINED IN THE "MODECPEQ.INC" MODULE. | ||
| 1143 | |||
| 1144 | MOV CRITERROR,DI ;SAVE THE ABOVE ERROR CODE | ||
| 1145 | |||
| 1146 | ;AT EXIT, WHEN THE IRET IS EXECUTED, DOS RESPONDS ACCORDING TO (AL) | ||
| 1147 | |||
| 1148 | MOV AL,CRERR_FAIL ;REQUEST THE "FAIL" OPTION | ||
| 1149 | |||
| 1150 | IRET ;RETURN FROM INTERRUPT | ||
| 1151 | HANDLER24 ENDP | ||
| 1152 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1153 | SAVE_VECTOR24 PROC NEAR | ||
| 1154 | ;GET THE ORIGINAL CONTENTS OF THE CRITICAL ERROR HANDLER VECTOR, 24H | ||
| 1155 | ; AND SAVE THEM IN THE DWORD AT "OLDINT24" | ||
| 1156 | |||
| 1157 | PUSH ES ;SAVE BASE SEGREG | ||
| 1158 | DOSCALL GET_VECTOR,INT24 ;GET ORIGINAL OWNER OF INT 24H VECTOR | ||
| 1159 | |||
| 1160 | MOV WORD PTR OLDINT24,BX ;OUTPUT: ES:BX = CONTENTS OF VECTOR | ||
| 1161 | MOV WORD PTR OLDINT24+WORD,ES | ||
| 1162 | POP ES ;RESTORE BASE SEGREG | ||
| 1163 | |||
| 1164 | RET | ||
| 1165 | SAVE_VECTOR24 ENDP | ||
| 1166 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1167 | RESTORE_OLD_INT24 PROC NEAR | ||
| 1168 | ;TAKE THE CONTENTS OF THE ORIGINAL INT24 VECTOR, SAVED IN "OLDINT24" | ||
| 1169 | ; AND RESTORE THE INT24 ENTRY IN VECTOR BACK TO ITS ORIGINAL CONTENTS. | ||
| 1170 | |||
| 1171 | PUSH DS ;SAVE MY DATA SEGREG | ||
| 1172 | LDS DX,OLDINT24 ;DS:DX = VECTOR TO INT HANDLER | ||
| 1173 | DOSCALL SET_VECTOR,INT24 ;RESTORE OLD POINTER INTO INT24 VECTOR | ||
| 1174 | |||
| 1175 | POP DS ;RESTORE MY DATA SEGREG | ||
| 1176 | |||
| 1177 | RET | ||
| 1178 | RESTORE_OLD_INT24 ENDP | ||
| 1179 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1180 | HOOK_IN_MY_INT24 PROC NEAR | ||
| 1181 | ;SET THE CRITICAL ERROR INTERRUPT HANDLER IN | ||
| 1182 | ; VECTOR TABLE TO POINT TO "HANDLER24" | ||
| 1183 | |||
| 1184 | MOV DX,OFFSET HANDLER24 ;DS:DX = VECTOR TO INT HANDLER | ||
| 1185 | DOSCALL SET_VECTOR,INT24 ;SET INT24 VECTOR TO POINT TO NEW HANDLER | ||
| 1186 | |||
| 1187 | RET | ||
| 1188 | HOOK_IN_MY_INT24 ENDP | ||
| 1189 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 1190 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 1191 | ;³ | ||
| 1192 | ;³ | ||
| 1193 | ;³ SETUP_PACKET_FOR_DBCS | ||
| 1194 | ;³ --------------------- | ||
| 1195 | ;³ | ||
| 1196 | ;³ Determine if need to include codepage information in the Invoke or Query | ||
| 1197 | ;³ packet. | ||
| 1198 | ;³ | ||
| 1199 | ;³ | ||
| 1200 | ;³ | ||
| 1201 | ;³ INPUT: Global access to "pk", the Invoke or Query packet. | ||
| 1202 | ;³ | ||
| 1203 | ;³ | ||
| 1204 | ;³ RETURN: If needed, the DBCS vetcors are added to the packet and the packet | ||
| 1205 | ;³ size is incremented. | ||
| 1206 | ;³ | ||
| 1207 | ;³ MESSAGES: none | ||
| 1208 | ;³ | ||
| 1209 | ;³ REGISTER | ||
| 1210 | ;³ USAGE: | ||
| 1211 | ;³ | ||
| 1212 | ;³ | ||
| 1213 | ;³ SIDE EFFECT: | ||
| 1214 | ;³ | ||
| 1215 | ;³ | ||
| 1216 | ;³ PSEUDO CODE: | ||
| 1217 | ;³ | ||
| 1218 | ;³ set up for and call INT 21 function 6507 | ||
| 1219 | ;³ IF the length field of the DBCS table is non-zero THEN | ||
| 1220 | ;³ add the length of the table to the length field of the packet | ||
| 1221 | ;³ ENDIF | ||
| 1222 | ;³ | ||
| 1223 | ;³ | ||
| 1224 | ;³ DATA STRUCTURES: PK - the vectors are moved into this structure beginning | ||
| 1225 | ;³ at PACKVECTOR1. The count of the vectors is added to | ||
| 1226 | ;³ PACKLEN. | ||
| 1227 | ;³ | ||
| 1228 | ;³ DBCS_header - The return from function 6507. | ||
| 1229 | ;³ | ||
| 1230 | ;³ DBCS_table - the table of vectors pointed to by | ||
| 1231 | ;³ DBCS_header.table_ptr. | ||
| 1232 | ;³ | ||
| 1233 | ;³ | ||
| 1234 | ;³ ASSUMPTIONS: No more than 12 (0CH) are in the DBCS table. | ||
| 1235 | ;³ | ||
| 1236 | ;³ The double word pointer returned by function 6507 | ||
| 1237 | ;³ (DBCS_header.table_ptr) always points to the DBCS table. | ||
| 1238 | ;³ | ||
| 1239 | ;³ The first byte of the table (DBCS_table.table_len) is zero if | ||
| 1240 | ;³ DBCS support is not necessary. | ||
| 1241 | ;³ ;AN000; | ||
| 1242 | ;³ ES=DS. ;AN000; | ||
| 1243 | ;³ ;AN000; | ||
| 1244 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 1245 | |||
| 1246 | setup_packet_for_DBCS PROC NEAR | ||
| 1247 | |||
| 1248 | PUBLIC setup_packet_for_DBCS | ||
| 1249 | |||
| 1250 | PUSH DS ;DS is used to address the DBCS vector table which is somewhere in IBMDOS | ||
| 1251 | |||
| 1252 | ;set up for and call INT 21 function 6507 | ||
| 1253 | MOV AX,6507H ;get ext country info, DBCS info | ||
| 1254 | MOV BX,-1 ;use codepage currently active for CON | ||
| 1255 | MOV DX,-1 ;use default contry ID | ||
| 1256 | MOV CX,TYPE DBCS_head ;length of data to be returned | ||
| 1257 | MOV DI,OFFSET DBCS_headr ;DI=>buffer to fill with info ID and pointer to table | ||
| 1258 | INT 21H | ||
| 1259 | |||
| 1260 | LDS SI,DBCS_header.table_ptr ;DS:SI=>DBCS table,"DBCS_table" EQU DS:[SI] | ||
| 1261 | .IF <DBCS_table.table_len NE 0> THEN ;IF there are some vectors THEN | ||
| 1262 | MOV CX,DBCS_table.table_len ;set length of the list of vectors | ||
| 1263 | ADD CS:pk.packlen,CX | ||
| 1264 | ADD SI,vector1 ;DS:SI=>first DBCS vector | ||
| 1265 | MOV DI,OFFSET pk ;ES:DI=>the query or invoke packet | ||
| 1266 | ADD DI,packvector1 ;ES:DI=>holder for first DBCS vector in the query/invoke packet | ||
| 1267 | REP MOVSB ;mov all the vectors and the two bytes of zeros into the packet | ||
| 1268 | .ENDIF | ||
| 1269 | |||
| 1270 | POP DS ;restore to address stuff in MODE's segment | ||
| 1271 | |||
| 1272 | RET | ||
| 1273 | |||
| 1274 | setup_packet_for_DBCS ENDP | ||
| 1275 | |||
| 1276 | |||
| 1277 | PRINTF_CODE ENDS ;END OF MODECP.SAL MODULE | ||
| 1278 | END | ||
| 1279 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/MODECPEQ.INC b/v4.0/src/CMD/MODE/MODECPEQ.INC new file mode 100644 index 0000000..b91be28 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODECPEQ.INC | |||
| @@ -0,0 +1,365 @@ | |||
| 1 | ; MODECPEQ.INC - INCLUDED IN MODECP.SAL | ||
| 2 | IF1 | ||
| 3 | %OUT INCLUDE MODECPEQ.INC ;MACROS,DOS EQUATES,STRUCS,OTHER EQUATES | ||
| 4 | ENDIF | ||
| 5 | |||
| 6 | ; $SALUT CP(4,9,17,32) | ||
| 7 | HEADER MACRO TEXT,EJECT | ||
| 8 | ;;example: header <new subtitle goes here> | ||
| 9 | ;;the angle brackets are required | ||
| 10 | .XLIST | ||
| 11 | SUBTTL TEXT | ||
| 12 | IFB <EJECT> | ||
| 13 | .LIST | ||
| 14 | ENDIF | ||
| 15 | PAGE | ||
| 16 | ENDM | ||
| 17 | |||
| 18 | ; - - - - - - - - - - - - - - - - - - - - | ||
| 19 | ; $SALUT CP(2,28,40,47) | ||
| 20 | |||
| 21 | DOSCALL MACRO FUNC,SUBFUNC | ||
| 22 | ;;IF SUBFUNC IS USED, THEN FUNC MUST BE USED | ||
| 23 | IFNB <FUNC> ;IS THERE ANY PARMS AT ALL? | ||
| 24 | IFNB <SUBFUNC> | ||
| 25 | MOV AX,(FUNC SHL 8) + SUBFUNC | ||
| 26 | ELSE ;;SINCE THERE IS NO SUBFUNC | ||
| 27 | MOV AH,FUNC | ||
| 28 | ENDIF | ||
| 29 | ENDIF | ||
| 30 | INT 21H | ||
| 31 | ENDM | ||
| 32 | |||
| 33 | ; - - - - - - - - - - - - - - - - - - - - | ||
| 34 | ; $SALUT CP(4,21,26,32) | ||
| 35 | |||
| 36 | ; DOS FUNCTION CALLS | ||
| 37 | PRINTSTR EQU 09H ;PRINT STRING ENDING WITH "$" | ||
| 38 | ;DS:DX = POINTER TO STRING | ||
| 39 | |||
| 40 | SET_VECTOR EQU 25H ;SET INTERRUPT VECTOR | ||
| 41 | ;DS:DX = VECTOR TO INT HANDLER | ||
| 42 | ;AL = INTERRUPT NUMBER | ||
| 43 | |||
| 44 | DOS_VERSION EQU 30H ;DETERMINE VERSION OF DOS | ||
| 45 | ;OUTPUT: AL=MAJOR, AH=MINOR VERSION NUMBER | ||
| 46 | ; BX AND CX SET TO ZERO | ||
| 47 | |||
| 48 | BREAK_CHECK EQU 33H ;CNTRL-BREAK CHECK | ||
| 49 | ;AL=0 - REQUEST CURRENT STATE | ||
| 50 | ;AL=1 - SET CURRENT STATE | ||
| 51 | ;DL=0 - BREAK OFF | ||
| 52 | ;DL=1 - BREAK ON | ||
| 53 | |||
| 54 | GET_VECTOR EQU 35H ;GET INTERRUPT VECTOR | ||
| 55 | ;AL = INTRRUPT NUMBER | ||
| 56 | ;OUTPUT: ES:BX = CONTENTS OF VECTOR | ||
| 57 | |||
| 58 | OPEN EQU 3DH ;OPEN FILE FOR INPUT | ||
| 59 | ;DS:DX = POINTER TO ASCIIZ PATH NAME | ||
| 60 | ;AL = OPEN MODE | ||
| 61 | |||
| 62 | CLOSE EQU 3EH ;CLOSE A FILE HANDLE | ||
| 63 | ;BX = HANDLE RETURNED BY OPEN OR CREATE | ||
| 64 | |||
| 65 | READ EQU 3FH ;READ FROM A FILE OR DEVICE | ||
| 66 | ;BX = FILE HANDLE | ||
| 67 | ;DS:DX = BUFFER ADDRESS | ||
| 68 | ;CX NUMBER OF BYTES TO READ | ||
| 69 | |||
| 70 | WRITE EQU 40H ;WRITE TO A FILE OR DEVICE | ||
| 71 | ;BX = FILE HANDLE | ||
| 72 | ;DS:DX = ADDRESS OF DATA TO WRITE | ||
| 73 | ;CX = NUMBER OF BYTES TO WRITE | ||
| 74 | |||
| 75 | |||
| 76 | LSEEK EQU 42H ;MOVE FILE READ/WRITE POINTER | ||
| 77 | ;CX:DX - DISTANCE TO MOVE IN BYTES | ||
| 78 | ;BX = FILE HANDLE | ||
| 79 | ;AL = METHOD OF MOVING: | ||
| 80 | ; 00 - MOVE CX:DX BYTES FROM BEGINNING | ||
| 81 | ; 01 - MOVE TO CURRENT LOCATION + OFFSET | ||
| 82 | ; 02 - MOVE TO END OF FILE | ||
| 83 | ;OUTPUT:DX:AX NEW POINTER LOCATION | ||
| 84 | |||
| 85 | IOCTL EQU 44H ;I/O CONTROL FOR DEVICES | ||
| 86 | ;DS:DX = DATA OR BUFFER | ||
| 87 | ;CX = NUMBER OF BYTES TO READ OR WRITE | ||
| 88 | ;BX = FILE HANDLE, OR, | ||
| 89 | ;BL = DRIVE NUMBER (0=DEFAULT,1=A,...) | ||
| 90 | ;AL = FUNCTION VALUE | ||
| 91 | ;OUTPUT: AX=NO. BYTES TRANSFERRED | ||
| 92 | ; OR ERROR CODE IS CY SET | ||
| 93 | |||
| 94 | ALLOC_MEM EQU 48H ;ALLOCATE MEMORY | ||
| 95 | ;BX = NUMBER OF PARAGRAPHS REQUESTED | ||
| 96 | ;OUTPUT: IF NO CARRY, AX:0 POINTS TO | ||
| 97 | ; ALLOCATED MEMORY BLOCK | ||
| 98 | ; IF CARRY, BX IS SIZE OF LARGEST BLOCK | ||
| 99 | ; AVAILABLE, IN PARAGRAPHS, AX=ERR CODE | ||
| 100 | |||
| 101 | FREE_AL_MEM EQU 49H ;FREE ALLOCATED MEM | ||
| 102 | ;ES=SEG OF BLOCK BEING RETURNED | ||
| 103 | ;OUTPUT: AX=ERROR CODE IF CY SET | ||
| 104 | |||
| 105 | EXTERROR EQU 59H ;EXTENDED ERROR | ||
| 106 | ;BX = 30 VERSION NUMBER (FOR 3.30) | ||
| 107 | ;OUTPUT: | ||
| 108 | ;AX=EXTENDED ERROR | ||
| 109 | ;BH=ERROR CLASS | ||
| 110 | ;BL=SUGGESTED ACTION | ||
| 111 | ;CH=LOCUS | ||
| 112 | |||
| 113 | ; (THESE VALUES GO TO AX FOR INT 21H) | ||
| 114 | SET_GLOBAL_CP EQU 6602H ;INPUTS: | ||
| 115 | ; BX=CODE PAGE, | ||
| 116 | |||
| 117 | GET_GLOBAL_CP EQU 6601H ;RESULTS: | ||
| 118 | ; BX=ACTIVE CODE PAGE, | ||
| 119 | ; DX=SYSTEM CODE PAGE | ||
| 120 | |||
| 121 | GENERIC_IOCTL EQU 440CH ;INPUTS: | ||
| 122 | ; CH AND CL SET AS DEFINED IN NEXT 2 SECTIONS | ||
| 123 | ; IN GENERAL, CH=CATEGORY CODE (MAJOR CODE) | ||
| 124 | ; CL=FUNCTION WITHIN CATEGORY (MINOR CODE) | ||
| 125 | |||
| 126 | ; MAJOR CODES: | ||
| 127 | ; (THESE VALUES GO TO CH REG DURING GENERIC IOCTL: | ||
| 128 | UNK_DEV_TYPE EQU 00H ;USED IF TYPE NOT KNOWN | ||
| 129 | COM_DEV_TYPE EQU 01H ;COMx DEVICE TYPE | ||
| 130 | CON_DEV_TYPE EQU 03H ;CONSOLE DEVICE TYPE | ||
| 131 | LPT_DEV_TYPE EQU 05H ;LPTx DEVICE TYPE | ||
| 132 | GLOBAL_CP EQU -1 ;GLOBAL CODEPAGE, INDICATED BY DEVICE="*", | ||
| 133 | ; NOT USED WITH GENERIC IOCTL | ||
| 134 | |||
| 135 | ; MINOR CODES: | ||
| 136 | ; SUBFUNCTIONS OF GENERIC_IOCTL: | ||
| 137 | ; (THESE VALUES GO TO CL REG) | ||
| 138 | PREPARE_STRT EQU 4CH ;INPUTS: | ||
| 139 | ;BX=HANDLE, AX="GENERIC_IOCTL" | ||
| 140 | ;CX=xxx_DEV_TYPE * 256 + "PREPARE_STRT" | ||
| 141 | ;DS:DX=DATA BUFFER "DES_STRT_PACKET" | ||
| 142 | |||
| 143 | PREPARE_END EQU 4DH ;INPUTS: | ||
| 144 | ;BX=HANDLE, AX="GENERIC_IOCTL" | ||
| 145 | ; DS:DX=DATA BUFFER "PACKET" | ||
| 146 | |||
| 147 | SELECT_CP EQU 4AH ;INPUTS: | ||
| 148 | ;BX=HANDLE, AX="GENERIC_IOCTL" | ||
| 149 | ; DS:DX=DATA BUFFER "PACKET" | ||
| 150 | |||
| 151 | QUERY_SELECTED EQU 6AH ;INPUTS: | ||
| 152 | ;BX=HANDLE, AX="GENERIC_IOCTL" | ||
| 153 | ; DS:DX=DATA BUFFER "PACKET" | ||
| 154 | |||
| 155 | QUERY_DES_LST EQU 6BH ;INPUTS: | ||
| 156 | ;BX=HANDLE, AX="GENERIC_IOCTL" | ||
| 157 | ; DS:DX=DATA BUFFER | ||
| 158 | |||
| 159 | ; OTHER EQUATES | ||
| 160 | IOCTL_WRITE EQU 3 ;VAL FOR AL, WHEN WRITING TO DEVICE VIA IOCTL | ||
| 161 | FILE_OPEN_MODE EQU 0 ;BIT FIELDS ARE ISSSRAAA WHERE: | ||
| 162 | ; I=0 FILE IS INHERITED BY CHILD PROCESS | ||
| 163 | ; (OF WHICH THERE ISN'T ANY) | ||
| 164 | ; SSS=SHARING MODE IS "COMPATABILITY MODE" | ||
| 165 | ; R=0 (RESERVED) | ||
| 166 | ; AAA=0 (READ ACCESS) | ||
| 167 | DEV_OPEN_MODE EQU 2 ;SAME BITS AS ABOVE, EXCEPT AAA=010, READ/WRITE ACCESS | ||
| 168 | |||
| 169 | FALSE EQU 0 ;INDICATES AN ERROR TO ERRORLEVEL | ||
| 170 | TRUE EQU 0FFH | ||
| 171 | |||
| 172 | refresh_request EQU 0 ;scaler to indicate that the current request is refresh for 'des_end' | ||
| 173 | |||
| 174 | STDERR EQU 2 ;PRE-OPENED HANDLE FOR STANDARD ERROR | ||
| 175 | STDOUT EQU 1 ;PRE-OPENED HANDLE FOR STANDARD OUTPUT | ||
| 176 | |||
| 177 | INT24 EQU 24H ;CRITICAL ERROR HANDLER VECTOR | ||
| 178 | EMPTY EQU -1 ;EMPTY SLOT IN LIST OF CODEPAGES | ||
| 179 | |||
| 180 | IOCTL_FUN_GET_INFO EQU 0 ;GET DEVICE INFORMATION (RETURNED IN DX) FROM IOCTL | ||
| 181 | IOCTL_FUN_SET_INFO EQU 1 ;SET DEVICE INFORMATION (PASSED IN DX) TO IOCTL | ||
| 182 | ISDEVICE EQU 0080H ;FLAG IN DEVICE INFO WORD, RETURNED IN DX | ||
| 183 | BINARY_DEV EQU 0020H ;BINARY FLAG IN DEVICE INFO WORD | ||
| 184 | |||
| 185 | MAPERR EQU 19 ;ERRORS FROM DEVICES MAPPED TO COMMON ERRORS, | ||
| 186 | ; AS DEVICE ERR=0 IS REPORTED AS COM ERROR=19 | ||
| 187 | FAIL24 EQU 83 ;RET CODE, INT 24 HANDLER REQUESTED "FAIL" | ||
| 188 | |||
| 189 | ;PREPARE START ERROR CODES: | ||
| 190 | DS_ERR0 EQU 0 ;PREVIOUS PREPARE DELETED | ||
| 191 | DS_ERR1 EQU 1 ;INVALID FUNCTION NUMBER | ||
| 192 | DS_ERR8 EQU 8 ;CODE PAGE CONFLICT (USED FOR KEYB XX MISMATCH) | ||
| 193 | DS_ERRA EQU 0AH ;DEVICE ERROR | ||
| 194 | DS_ERR16 EQU 016H ;UNKNOWN COMMAND (22 DECIMAL) | ||
| 195 | |||
| 196 | ;PREPARE WRITE ERROR CODES: | ||
| 197 | DW_ERR8 EQU 8 ;DEVICE NOT FOUND IN FILE ,OR | ||
| 198 | ;CODE PAGE NOT FOUND IN FILE | ||
| 199 | DW_ERRA EQU 0AH ;DEVICE ERROR | ||
| 200 | DW_ERRC EQU 0CH ; FILE CONTENTS NOT A FONT FILE, | ||
| 201 | ; OR FILE CONTENTS STRUCTURE DAMAGED | ||
| 202 | |||
| 203 | ;PREPARE END ERROR CODES: | ||
| 204 | DE_ERRC EQU 0CH ;NO PREPARE START | ||
| 205 | |||
| 206 | ;SELECT ERROR CODES: | ||
| 207 | IN_ERR7 EQU 07H ;CODE PAGE NOT PREPARED | ||
| 208 | IN_ERR8 EQU 08H ;CURRENT KEYB DOES NOT SUPPORT THIS CP | ||
| 209 | IN_ERRA EQU 0AH ;DEVICE ERROR | ||
| 210 | |||
| 211 | ;QUERY SELECTED ERROR CODES: | ||
| 212 | QS_ERR7 EQU 07H ;NO CODE PAGE HAS BEEN SELECTED | ||
| 213 | QS_ERRA EQU 0AH ;DEVICE ERROR | ||
| 214 | |||
| 215 | ;QUERY PREPARED LIST ERROR CODES: | ||
| 216 | QL_ERR7 EQU 07H ; NO CODE PAGES HAVE BEEN SELECTED | ||
| 217 | QL_ERRA EQU 0AH ;DEVICE ERROR | ||
| 218 | |||
| 219 | ;REFRESH ERROR CODES RETURNED FROM PREPARE START FOR A REFRESH REQUEST: | ||
| 220 | |||
| 221 | RS_ERR8 EQU 8 ;KEYBOARD/CODE PAGE CONFLICT | ||
| 222 | RS_ERRA EQU 0AH ;DEVICE ERROR | ||
| 223 | RS_ERRC EQU 0CH ;DEVICE DRIVER DOES NOT HAVE COPY OF CODE PAGE | ||
| 224 | ; TO DOWNLOAD TO DEVICE | ||
| 225 | |||
| 226 | ;ERROR CODES PRESENTED IN THE LOWER HALF OF DI TO THE INT 24H HANDLER: | ||
| 227 | ;CRERR0 EQU 0 ;ATTEMPT TO WRITE ON WRITE_PROTECTED DISKETTE | ||
| 228 | ;CRERR1 EQU 1 ;UNKNOWN UNIT | ||
| 229 | ;CRERR2 EQU 2 ;DRIVE NOT READY | ||
| 230 | ;CRERR3 EQU 3 ;UNKNOWN COMMAND | ||
| 231 | ;CRERR4 EQU 4 ;DATA ERROR (crc) | ||
| 232 | ;CRERR5 EQU 5 ;BAD REQUEST STRUCTURE LENGTH | ||
| 233 | ;CRERR6 EQU 6 ;SEEK ERROR | ||
| 234 | ;CRERR7 EQU 7 ;UNKNOWN MEDIA TYPE | ||
| 235 | ;CRERR8 EQU 8 ;SECTOR NOT FOUND | ||
| 236 | ;CRERR9 EQU 9 ;PRINTER OUT OF PAPER | ||
| 237 | ;CRERRA EQU 0AH ;WRITE FAULT | ||
| 238 | ;CRERRB EQU 0BH ;READ FAULT | ||
| 239 | ;CRERRC EQU 0CH ;GENERAL FAILURE | ||
| 240 | |||
| 241 | ;EXIT CODES, IN AL, WHEN IRET FROM INT 24H ERROR HANDLER. | ||
| 242 | CRERR_IGNORE EQU 0 ;IGNORE THE ERROR | ||
| 243 | CRERR_RETRY EQU 1 ;RETRY THE OPERATION | ||
| 244 | CRERR_TERM EQU 2 ;TERMINATE PROGRAM VIA INT 23H | ||
| 245 | CRERR_FAIL EQU 3 ;FAIL THE SYSTEM CALL IN PROGRESS | ||
| 246 | |||
| 247 | ; EQUATES FOR THE BREAK CHECK FUNCTION: | ||
| 248 | |||
| 249 | ;IN AL: | ||
| 250 | REQUEST_BREAK_STATE EQU 0 | ||
| 251 | SET_BREAK_STATE EQU 1 | ||
| 252 | |||
| 253 | ;IN DL: | ||
| 254 | BREAK_OFF EQU 0 | ||
| 255 | BREAK_ON EQU 1 | ||
| 256 | |||
| 257 | DBCS_header EQU ES:[DI] ;used to address DBCS_head | ||
| 258 | DBCS_table EQU DS:[SI] ;used to address the DBCS vector table | ||
| 259 | |||
| 260 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 261 | ; DEFINITIONS OF CONTROL BLOCKS | ||
| 262 | |||
| 263 | FON STRUC ;CODEPAGE FONT FILE CONTENTS | ||
| 264 | FONTAG DB 0FFH,"FONT " ;FILE TAG | ||
| 265 | DB 8 DUP(?) ;RESERVED | ||
| 266 | FONPTCT DW ? ;COUNT OF POINTERS IN HEADER | ||
| 267 | FONPT DB ? ;START OF ARRAY OF POINTERS | ||
| 268 | FON ENDS | ||
| 269 | |||
| 270 | ; THIS STRUC MAPS AN AREA POINTED TO BY "CP_CB", AN EXTRN | ||
| 271 | ;AC001;CODEPAGE_PARMS STRUC | ||
| 272 | ;AC001;DEVICE DW ? ;POINTER TO ASCIIZ STRING OF DEVICE NAME | ||
| 273 | ;AC001;DES_PACK_PTR DW ? ;OFFSET TO "DES_STRT_PACKET" | ||
| 274 | ;AC001;FONT_FILESPEC DW ? ;PATH AND FILESPEC OF FONT FILE | ||
| 275 | ;AC001;REQUEST_TYPE DW ? ;TYPE OF FUNCTION TO BE PERFORMED | ||
| 276 | ;AC001;CODEPAGE_PARMS ENDS | ||
| 277 | ; DEFINITIONS OF VALUES FOUND IN "REQUEST_TYPE" ABOVE: | ||
| 278 | EXTRN SELECT:ABS | ||
| 279 | EXTRN PREPARE:ABS | ||
| 280 | EXTRN REFRESH:ABS | ||
| 281 | |||
| 282 | ; "PACKET" POINTED TO BY DS:DX | ||
| 283 | PACKET STRUC ;USED BY MINOR CODES: 6AH,4AH,4DH (SELECT, QUERY SELECTED, PREPARE END) | ||
| 284 | PACKLEN DW 2 ;LENGTH OF PACKET IN BYTES, FOR DBCS COUNTRIES, LENGTH OF DBCS TABLE (IF NON-ZERO) WILL be added | ||
| 285 | PACKCPID DW 0 ;CODE PAGE ID | ||
| 286 | PACKVECTOR1 DB 0 ;start of vector list if included ;AN000; | ||
| 287 | DB 0 ;AN000; | ||
| 288 | DB 0 ;AN000; | ||
| 289 | DB 0 ;AN000; | ||
| 290 | DB 0 ;AN000; | ||
| 291 | DB 0 ;AN000; | ||
| 292 | DB 0 ;AN000; | ||
| 293 | DB 0 ;AN000; | ||
| 294 | DB 0 ;AN000; | ||
| 295 | DB 0 ;AN000; | ||
| 296 | DB 0 ;AN000; | ||
| 297 | DB 0 ;AN000; | ||
| 298 | DB 0 ;AN000; | ||
| 299 | DB 0 ;AN000; | ||
| 300 | DB 0 ;AN000; | ||
| 301 | DB 0 ;AN000; | ||
| 302 | DB 0 ;AN000; | ||
| 303 | DB 0 ; holders for maximum possible number of ;AN000; | ||
| 304 | DB 0 ; DBCS vector pairs ;AN000; | ||
| 305 | DB 0 ; ;AN000; | ||
| 306 | DB 0 ; ;AN000; | ||
| 307 | DB 0 ; ;AN000; | ||
| 308 | PACKVECTOR12 DB 0 ; ;AN000; | ||
| 309 | DB 0 ; ;AN000; | ||
| 310 | PACKET ENDS ;AN000; | ||
| 311 | ;AN000; | ||
| 312 | DBCS_head STRUC ;return from function 6507, pointed to by ES:DI, addressed via "DBCS_header" ;AN000; | ||
| 313 | info_id DB 7 ;AN000; | ||
| 314 | table_ptr DD 0 ;used to address DBCS_tabl ;AN000; | ||
| 315 | DBCS_head ENDS | ||
| 316 | ;AN000; | ||
| 317 | DBCS_tabl STRUC ;map of DBCS table, addressed via DBCS_table ;AN000; | ||
| 318 | table_len DW 6 ;length in bytes of the list of vectors ;AN000; | ||
| 319 | vector1 DB 0 ;start of vector list ;AN000; | ||
| 320 | DB 0 ;AN000; | ||
| 321 | DB 0 ;AN000; | ||
| 322 | DB 0 ;AN000; | ||
| 323 | DB 0 ;AN000; | ||
| 324 | DB 0 ;AN000; | ||
| 325 | DB 0 ;AN000; | ||
| 326 | DB 0 ;AN000; | ||
| 327 | DB 0 ;AN000; | ||
| 328 | DB 0 ;AN000; | ||
| 329 | DB 0 ;each vector is two bytes, a start value and an ;AN000; | ||
| 330 | DB 0 ;end value ;AN000; | ||
| 331 | DB 0 ;AN000; | ||
| 332 | DB 0 ;AN000; | ||
| 333 | DB 0 ;AN000; | ||
| 334 | DB 0 ;AN000; | ||
| 335 | DB 0 ;AN000; | ||
| 336 | DB 0 ;AN000; | ||
| 337 | DB 0 ;AN000; | ||
| 338 | DB 0 ;AN000; | ||
| 339 | DB 0 ;AN000; | ||
| 340 | DB 0 ;AN000; | ||
| 341 | DB 0 ;AN000; | ||
| 342 | DB 0 ;AN000; | ||
| 343 | DBCS_tabl ENDS | ||
| 344 | |||
| 345 | |||
| 346 | ; "DES_STRT_PACKET" POINTED TO BY DS:DX | ||
| 347 | DES_STRT_PACKET STRUC | ||
| 348 | DES_STRT_PKFL DW ? ;FLAGS (DEFINED BELOW STRUC DEFINITION) | ||
| 349 | DES_STRT_PKLEN DW ? ;BYTE LENGTH OF REST OF THE PACKET, | ||
| 350 | ; NOT INCLUDING THIS LENGTH FIELD | ||
| 351 | DES_STRT_PKNUM DW ? ;NUMBER OF CODEPAGES IN FOLLOWING LIST | ||
| 352 | DES_STRT_PKCP1 DW ? ;CODE PAGE ONE | ||
| 353 | DES_STRT_PKCP2 DW ? ;CODE PAGE TWO | ||
| 354 | ; : : : : | ||
| 355 | DES_STRT_PKCPN DW ? ;CODE PAGE n | ||
| 356 | ;NOTE: THESE n CODEPAGES MAY HAVE A -1 VALUE, WHICH IS TREATED AS A PLACEHOLDER | ||
| 357 | ; TO ALLOW POSITION CONTROL FOR EACH CODEPAGE VALUE IN THE LIST. | ||
| 358 | DES_STRT_PACKET ENDS | ||
| 359 | |||
| 360 | ; DEFINITIONS OF CONTENTS OF "DES_STRT_PKFL" | ||
| 361 | DES_STRT_FL_SINGLE EQU 8000H ; 8000H=SINGLE CP FIFO PREPARE | ||
| 362 | ; (NOT SUPPORTED, ONLY LIST FORM IN DOS 3.30 RELEASE) | ||
| 363 | DES_STRT_FL_CART EQU 0001H ; 0001H=CARTRIDGE PREPARE | ||
| 364 | |||
| 365 | ; ED OF MODECPEQ.INC FILE | ||
diff --git a/v4.0/src/CMD/MODE/MODECPMS.INC b/v4.0/src/CMD/MODE/MODECPMS.INC new file mode 100644 index 0000000..4a015c5 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODECPMS.INC | |||
| @@ -0,0 +1,157 @@ | |||
| 1 | ;MODECPMS.INC - INCLUDED IN MODECP.SAL | ||
| 2 | IF1 | ||
| 3 | %OUT INCLUDE MODECPMS.INC ;DESCRIPTIONS OF MESSAGES | ||
| 4 | ENDIF | ||
| 5 | |||
| 6 | ;$SALUT CP(0,2,9,32) ;(set preprocessor columns for indenting) | ||
| 7 | |||
| 8 | EXTRN CPMSG1:WORD ;"Failure to access Codepage Font File",BEEP,CR,LF,EOM | ||
| 9 | |||
| 10 | EXTRN CPMSG2:WORD ;"Failure to OPEN device: %S",CR,LF,EOM | ||
| 11 | EXTRN CPMSGLST2DEV:WORD ;FILLED IN WITH PTR TO DEVICE NAME | ||
| 12 | |||
| 13 | EXTRN CPMSG3:WORD ;"Missing from font file is either device or codepage",BEEP,CR,LF,EOM | ||
| 14 | |||
| 15 | EXTRN CPMSG4:WORD ;"Font file contents invalid",CR,LF,EOM | ||
| 16 | |||
| 17 | EXTRN CPMSG5:WORD ;"Previously prepared codepage deleted",BEEP,CR,LF,EOM | ||
| 18 | |||
| 19 | EXTRN CPMSG6:WORD ;"Active codepage for %S is %D",CR,LF,EOM | ||
| 20 | EXTRN CPMSGLST6DEV:WORD ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME | ||
| 21 | EXTRN CPMSGLST6CP:WORD ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 22 | |||
| 23 | EXTRN CPMSG7:WORD ;"Device %S not prepared",CR,LF,EOM | ||
| 24 | EXTRN CPMSGLST7DEV:WORD ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME | ||
| 25 | |||
| 26 | EXTRN CPMSG8:WORD ;"%s codepages:",CR,LF,EOM | ||
| 27 | ;AC001; EXTRN CPMSGLST8HD:WORD ;OFFSET TO "HARDWARE" OR "PREPARED" | ||
| 28 | EXTRN CPMSG8_HW:WORD ;message number for "hardware ",EOM | ||
| 29 | EXTRN CPMSG8_PR:WORD ;message number for "prepared ",EOM | ||
| 30 | |||
| 31 | EXTRN CPMSG9:WORD ;" Codepage %d",CR,LF,EOM | ||
| 32 | EXTRN CPMSGLST9CP:WORD ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 33 | |||
| 34 | EXTRN CPMSG10:WORD ;"MODE %S Codepage function completed",CR,LF,EOM | ||
| 35 | ;AC001; EXTRN CPMSGLST10FUN:WORD ;FILLED IN TO POINT TO: | ||
| 36 | EXTRN CPMSGxx_QUERY:WORD ;message number for "Query",EOM | ||
| 37 | EXTRN CPMSGxx_PREP:WORD ;message number for "Prepare",EOM | ||
| 38 | EXTRN CPMSGxx_REFRESH:WORD ;message number for "Refresh",EOM | ||
| 39 | EXTRN CPMSGxx_SELECT:WORD ;message number for "Select",EOM | ||
| 40 | |||
| 41 | EXTRN CPMSG12:WORD ;"Current Codepage settings:",CR,LF,EOM | ||
| 42 | |||
| 43 | EXTRN CPMSG13:WORD ;" %D - %S Codepage",CR,LF,EOM | ||
| 44 | EXTRN CPMSGLST13CP:WORD ;FILLED IN WITH CODEPAGE ID | ||
| 45 | ;AC001; EXTRN CPMSGLST13TYP:WORD ;FILLED IN TO POINT TO: | ||
| 46 | EXTRN CPMSG13_ACT:WORD ;message number for "Active" | ||
| 47 | EXTRN CPMSG13_SYS:WORD ;message number for "System" | ||
| 48 | |||
| 49 | EXTRN CPMSG14:WORD ;" Codepage unprepared",CR,LF,EOM | ||
| 50 | |||
| 51 | EXTRN CPMSG15:WORD ;"Device not supported for Codepage",BEEP,CR,LF,EOM | ||
| 52 | |||
| 53 | EXTRN CPMSG16:WORD ;"No codepage has been selected",BEEP,CR,LF,EOM | ||
| 54 | |||
| 55 | EXTRN CPMSG17:WORD ;"Device error during %S",BEEP,CR,LF,EOM | ||
| 56 | EXTRN CPMSG17_WRIT:WORD ;message number for "write of font file to device",EOM | ||
| 57 | |||
| 58 | EXTRN CPMSG18:WORD ;"Specified Codepage not prepared",BEEP,CR,LF,EOM | ||
| 59 | |||
| 60 | EXTRN CPMSG19:WORD ;"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM | ||
| 61 | |||
| 62 | EXTRN CPMSG20:WORD ;"Error during read of font file",BEEP,CR,LF,EOM | ||
| 63 | |||
| 64 | EXTRN CPMSG21:WORD ;CR,LF,"Unable to perform REFRESH",BEEP,EOM | ||
| 65 | |||
| 66 | ;THE FOLLOWING DATA AREAS DEFINING MESSAGES CAN BE FOUND IN "MODEMES.ASM" | ||
| 67 | |||
| 68 | ;CPMSG1 DB "Failure to access Codepage Font File",BEEP,CR,LF,EOM | ||
| 69 | ;CPMSG1 DW CPMSG1 | ||
| 70 | |||
| 71 | ;CPMSG2 DB "Failure to access device: %S",BEEP,CR,LF,EOM | ||
| 72 | ;CPMSG2 DW CPMSG2 | ||
| 73 | ;CPMSGLST2DEV DW ? ;FILLED IN WITH PTR TO DEVICE NAME | ||
| 74 | |||
| 75 | ;CPMSG3 DB ;"Missing from font file is either device or codepage",BEEP,CR,LF,EOM | ||
| 76 | ;CPMSG3 DW CPMSG3 | ||
| 77 | |||
| 78 | ;CPMSG4 DB "Font file contents invalid",BEEP,CR,LF,EOM | ||
| 79 | ;CPMSG4 DW CPMSG4 | ||
| 80 | |||
| 81 | ;CPMSG5 DB "Previous prepared codepage deleted",BEEP,CR,LF,EOM | ||
| 82 | ;CPMSG5 DW CPMSG5 | ||
| 83 | |||
| 84 | ;CPMSG6 DB "Active codepage for device %S is %D",CR,LF,EOM | ||
| 85 | ;CPMSG6 DW CPMSG6 | ||
| 86 | ;CPMSGLST6DEV DW ? ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME | ||
| 87 | ;CPMSGLST6CP DW ? ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 88 | |||
| 89 | ;CPMSG7 DB "Device %S not prepared",CR,LF,EOM | ||
| 90 | ;CPMSG7 DW CPMSG7 | ||
| 91 | ;CPMSGLST7DEV DW ? ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME | ||
| 92 | |||
| 93 | ;CPMSG8 DB "%S codepages:",CR,LF,EOM | ||
| 94 | ;CPMSG8 DW CPMSG8 | ||
| 95 | ;CPMSGLST8HD DW ? ;OFFSET TO "HARDWARE" OR "PREPARED" | ||
| 96 | ;CPMSG8_HW DB "hardware",EOM | ||
| 97 | ;CPMSG8_PR DB "prepared",EOM | ||
| 98 | |||
| 99 | ;CPMSG9 DB " Codepage %d",CR,LF,EOM | ||
| 100 | ;CPMSG9 DW CPMSG9 | ||
| 101 | ;CPMSGLST9CP DW ? ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 102 | |||
| 103 | ;CPMSG10 DB "MODE %S Codepage function completed",CR,LF,EOM | ||
| 104 | ;CPMSG10 DW CPMSG10 | ||
| 105 | ;CPMSGLST10FUN DW ? ;FILLED IN TO POINT TO: | ||
| 106 | ;CPMSG10_QUERY DB "Querry",EOM | ||
| 107 | ;CPMSG10_DES DB "Prepare",EOM | ||
| 108 | ;CPMSG10_SELECT DB "Activate",EOM | ||
| 109 | ;CPMSG10_REFRESH DB "Refresh",EOM | ||
| 110 | ;CPMSG10_GLOBAL DB "Global",EOM | ||
| 111 | |||
| 112 | ;CPMSG11 DB "Error %S Global Codepage",CR,LF,EOM | ||
| 113 | ;CPMSG11 DW CPMSG11 | ||
| 114 | ;CPMSGLST11FUN DW ? ;FILLED IN TO POINT TO: | ||
| 115 | ;CPMSG11_SET DB "setting",EOM | ||
| 116 | ;CPMSG11_GET DB "getting",EOM | ||
| 117 | |||
| 118 | ;CPMSG12 DB "Current Codepage settings:",CR,LF,EOM | ||
| 119 | ;CPMSG12 DW CPMSG12 | ||
| 120 | |||
| 121 | ;CPMSG13 DB " %D - %S Codepage",CR,LF,EOM | ||
| 122 | ;CPMSG13 DW CPMSG13 | ||
| 123 | ;CPMSGLST13CP DW ? ;FILLED IN WITH CODEPAGE ID | ||
| 124 | ;CPMSGLST13TYP DW ? ;FILLED IN TO POINT TO: | ||
| 125 | ;CPMSG13_ACT DB "Active",EOM | ||
| 126 | ;CPMSG13_SYS DB "System",EOM | ||
| 127 | |||
| 128 | ;CPMSG14 DB " Codepage unprepared",CR,LF,EOM | ||
| 129 | ;CPMSG14 DW CPMSG14 | ||
| 130 | |||
| 131 | ;CPMSG15 DB "Device not supported for Codepage",BEEP,CR,LF,EOM | ||
| 132 | ;CPMSG15 DW CPMSG15 | ||
| 133 | |||
| 134 | ;CPMSG16 DB "No codepage has been selected",BEEP,CR,LF,EOM | ||
| 135 | ;CPMSG16 DW CPMSG16 | ||
| 136 | |||
| 137 | ;CPMSG17 DB "Device error during %S",BEEP,CR,LF,EOM | ||
| 138 | ;CPMSG17 DW CPMSG17 | ||
| 139 | ;CPMSGLST17FUN DW ? ;FILLED IN TO POINT TO: | ||
| 140 | ;CPMSG17_QUERY DB "Query",EOM | ||
| 141 | ;CPMSG17_PREP DB "Prepare",EOM | ||
| 142 | ;CPMSG17_REFRESH DB "Refresh",EOM | ||
| 143 | ;CPMSG17_ACT DB "Activate",EOM | ||
| 144 | |||
| 145 | ;CPMSG17_WRIT DB "write of font file to device",EOM | ||
| 146 | |||
| 147 | ;CPMSG18 DB "Specified Codepage not prepared",BEEP,CR,LF,EOM | ||
| 148 | ;CPMSG18 DW CPMSG18 | ||
| 149 | |||
| 150 | ;CPMSG19 DB "Current keyboard does not support this Codepage",BEEP,CR,LF,EOM | ||
| 151 | ;CPMSG19 DW CPMSG19 | ||
| 152 | |||
| 153 | ;CPMSG20 DB "Error during read of font file",BEEP,CR,LF,EOM | ||
| 154 | ;CPMSG20 DW CPMSG20 | ||
| 155 | |||
| 156 | ;CPMSG21 DB "Unable to perform REFRESH operation",BEEP,CR,LF,EOM | ||
| 157 | ;CPMSG21 DW CPMSG21 | ||
diff --git a/v4.0/src/CMD/MODE/MODECPRO.INC b/v4.0/src/CMD/MODE/MODECPRO.INC new file mode 100644 index 0000000..3b87113 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODECPRO.INC | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | ; MODECPRO.INC - INCLUDED BY MODECP.SAL | ||
| 2 | ;****************** START OF SPECIFICATIONS ***************************** | ||
| 3 | ; MODULE NAME: MODECP | ||
| 4 | |||
| 5 | ; DESCRIPTIVE NAME: MODE, CODEPAGE HANDLER | ||
| 6 | |||
| 7 | ;FUNCTION: Manages the codepage file, sending it to the | ||
| 8 | ; device when a DESIGNATE is requested, telling | ||
| 9 | ; the device which FONT to select when ACTIVATE | ||
| 10 | ; is requested, and displaying the font status | ||
| 11 | ; of the device when QUERY is requested. | ||
| 12 | |||
| 13 | ; NOTES: | ||
| 14 | ; This module should be processed with the SALUT pre-processor | ||
| 15 | ; with re-allignment not requested, as: | ||
| 16 | |||
| 17 | ; SALUT MODECP,NUL,; | ||
| 18 | |||
| 19 | |||
| 20 | ; ENTRY POINT: MODECP | ||
| 21 | ; LINKAGE: CALL MODECP | ||
| 22 | |||
| 23 | ; INPUT: As defined by the "CODEPAGE_PARMS" STRUC. | ||
| 24 | ; All four segregs are expected to point to the one common | ||
| 25 | ; segment, called PRINTF_CODE. | ||
| 26 | |||
| 27 | ; EXIT-NORMAL: ERRORLEVEL 0 - Successful completion | ||
| 28 | |||
| 29 | ; EXIT-ERROR: ERRORLEVEL 1 - An error message is also displayed | ||
| 30 | |||
| 31 | ; EFFECTS: | ||
| 32 | |||
| 33 | ; INTERNAL REFERENCES: | ||
| 34 | ; ROUTINES: | ||
| 35 | ; MODECP - HANDLES ALL PROCESSING FOR THE CODEPAGE SUPPORT IN MODE | ||
| 36 | ; SET_DEV_TYPE - SCANS LIST OF DEVICES FOR SPECIFIED DEVICE | ||
| 37 | ; SET_GLOBAL_CODEPAGE - DEVICE IS "*", INVOKE OR QUERY GLOBAL CODEPAGE | ||
| 38 | ; FUNCTION_SELECT - DETERMINES FUNCTION TO BE PERFORMED, DESIGNATE,QUERY,INVOKE | ||
| 39 | ; DO_DESIGNATE - PERFORMS START DESIGNATE, DOWNLOAD FONT FILE, DESIGNATE END | ||
| 40 | ; DES_START - HANDLES DETAILS OF START DESIGNATE FUNCTION | ||
| 41 | ; DES_START_ERROR - DIAGNOSES ERRORS FROM DESIGNATE START | ||
| 42 | ; MOVE_FILE - HANDLES DETAILS OF DOWNLOADING THE FONT FILE TO DEVICE | ||
| 43 | ; DES_END - HANDLES DETAILS OF DESIGNATE END FUNCTION | ||
| 44 | ; DO_INVOKE - HANDLES DETAILS OF INVOKE FUNCTION | ||
| 45 | ; DO_STATUS - INTERROGATES DEVICE FOR CODEPAGE STATUS | ||
| 46 | ; QUERY_ERROR - DISGNOSES ERRORS FROM QUERY REQUEST | ||
| 47 | ; DISPLAY_CPID - DISPLAYS THE CODEPAGE ID AS PART OF STATUS REPORT | ||
| 48 | ; SEND_MSG - SET UP ALL ERROR MESSAGES TO BE DISPLAYED | ||
| 49 | ; QUEUE - HANDLES INTERFACE TO "PRINTF" FOR ALL MESSAGES | ||
| 50 | ; EX_ERR - DOSCALL RESULTED IN CARRY, SO GO FIND OUT THE EXTENDED ERROR | ||
| 51 | ; DO_GENERIC_IOCTL - PROCESS ALL GENERIC IOCTL CALLS TO THE DEVICE | ||
| 52 | ; | ||
| 53 | |||
| 54 | ; DATA AREAS: | ||
| 55 | ; WORKAREA - Temporary storage | ||
| 56 | |||
| 57 | ; EXTERNAL REFERENCES: | ||
| 58 | ; ROUTINES: | ||
| 59 | ; PRINTF - Uses the MSG parm lists to construct the messages | ||
| 60 | ; on STDOUT, on on STDERR. | ||
| 61 | |||
| 62 | ; DATA AREAS: A large buffer is allocated from free memory, if available. | ||
| 63 | |||
| 64 | ; COPYRIGHT: The copyright notice is found in the OBJ code generated from | ||
| 65 | ; the "MAIN.ASM" module of the MODE component of the DOS utility. | ||
| 66 | |||
| 67 | ;****************** END OF SPECIFICATIONS ***************************** | ||
| 68 | IF1 | ||
| 69 | %OUT INCLUDE MODECPRO.INC ;MODULE PROLOGUE | ||
| 70 | ENDIF | ||
| 71 | |||
| 72 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 73 | ;º º | ||
| 74 | |||
| 75 | ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 76 | ; implement the SYSGETMSG method of getting addressability to | ||
| 77 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 78 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 79 | ; address is then put in the sublist block for the message | ||
| 80 | ; being issued. | ||
| 81 | |||
| 82 | ; AX002 - P4576 Segments were being trashed before calling message services | ||
| 83 | ; because device type was wrong on IOCTL call because ES was | ||
| 84 | ; zero when using CMPSB in SET_DEV_TYPE and no match was made. | ||
| 85 | |||
| 86 | ;º º | ||
| 87 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 88 | |||
diff --git a/v4.0/src/CMD/MODE/MODEDEFS.INC b/v4.0/src/CMD/MODE/MODEDEFS.INC new file mode 100644 index 0000000..846a884 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEDEFS.INC | |||
| @@ -0,0 +1,749 @@ | |||
| 1 | |||
| 2 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 3 | ;º º ;AN000; | ||
| 4 | ;AN000; | ||
| 5 | ; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the | ||
| 6 | ; USA.MSG file because it looked like a common message. Now | ||
| 7 | ; I use a different (better) message. | ||
| 8 | |||
| 9 | ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 10 | ; implement the SYSGETMSG method of getting addressability to | ||
| 11 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 12 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 13 | ; address is then put in the sublist block for the message | ||
| 14 | ; being issued. | ||
| 15 | |||
| 16 | |||
| 17 | ;º º ;AN000; | ||
| 18 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 19 | ;AN000; | ||
| 20 | Stdin equ 0 | ||
| 21 | StdOut equ 1 | ||
| 22 | StdErr equ 2 | ||
| 23 | No_Handle equ -1 | ||
| 24 | |||
| 25 | |||
| 26 | Msg_Ser_Class equ 0 | ||
| 27 | Ext_Err_Class equ 1 | ||
| 28 | Parse_Error_Class equ 2 | ||
| 29 | Utility_Msg_Class equ 0FFh | ||
| 30 | |||
| 31 | N_A equ 0 | ||
| 32 | |||
| 33 | No_Input equ 0 | ||
| 34 | DOS_keyb_input EQU 01 | ||
| 35 | clear_buffer EQU 0C0H | ||
| 36 | ; | ||
| 37 | ;***************************************************************************** | ||
| 38 | ; Macro's | ||
| 39 | ;***************************************************************************** | ||
| 40 | ; | ||
| 41 | |||
| 42 | Define_Msg macro Message_Name ; ;AN000; | ||
| 43 | ; | ||
| 44 | Create_Msg Message_Name,Message_Number,Handle,Sublist,Count,Class,Function,Input;AN000; | ||
| 45 | ; | ||
| 46 | endm ; ;AN000; | ||
| 47 | |||
| 48 | ;----------------------------------------------------------------------------- | ||
| 49 | |||
| 50 | Create_Msg macro Parm1,Parm2,Parm3,Parm4,Parm5,Parm6,Parm7,Parm8 ;AN000; | ||
| 51 | |||
| 52 | Parm1 label word ; ;AN000; | ||
| 53 | dw Parm2 ; ;AN000; | ||
| 54 | dw Parm3 ; ;AN000; | ||
| 55 | dw OFFSET Parm4 ; ;AN000; | ||
| 56 | dw Parm5 ; ;AN000; | ||
| 57 | db Parm6 ; ;AN000; | ||
| 58 | db Parm7 ; ;AN000; | ||
| 59 | dw Parm8 ; ;AN000; | ||
| 60 | endm ; ;AN000; | ||
| 61 | |||
| 62 | |||
| 63 | ; | ||
| 64 | ;***************************************************************************** | ||
| 65 | ; Message Description Tables | ||
| 66 | ;***************************************************************************** | ||
| 67 | ; | ||
| 68 | |||
| 69 | ;---------------------- ; | ||
| 70 | Message_Number = 3 ;CR,LF,"Invalid switch - %1",BEEP,CR,LF,EOM | ||
| 71 | Handle = STDOUT ; ;AN000; | ||
| 72 | Sublist = sublist_invalid_switch | ||
| 73 | Count = 1 ; ;AN000; | ||
| 74 | Class = Parse_Error_Class ;resident in COMMAND ;AN000; | ||
| 75 | Function = No_Function ; ;AN000; | ||
| 76 | Input = N_A ; ;AN000; | ||
| 77 | Define_Msg invalid_switch ; ;AN000; | ||
| 78 | ;---------------------- ; | ||
| 79 | Message_Number = 1 ;COMMON1 "Incorrect DOS Version" | ||
| 80 | Handle = STDERR ; ;AN000; | ||
| 81 | Sublist = No_Replace ; ;AN000; | ||
| 82 | Count = N_A ; ;AN000; | ||
| 83 | Class = msg_ser_Class ; ;AN000; | ||
| 84 | Function = No_Input ; ;AN000; | ||
| 85 | Input = N_A ; ;AN000; | ||
| 86 | Define_Msg wrong_version ; ;AN000; | ||
| 87 | ;---------------------- ; | ||
| 88 | Message_Number = 2 ; ;AN000; | ||
| 89 | Handle = STDERR ;extend1 ;AN000; | ||
| 90 | Sublist = No_Replace ; ;AN000; | ||
| 91 | Count = N_A ; ;AN000; | ||
| 92 | Class = ext_err_Class ; ;AN000; | ||
| 93 | Function = No_Input ; ;AN000; | ||
| 94 | Input = N_A ; ;AN000; | ||
| 95 | Define_Msg msgOutOfMemory ; ;AN000; | ||
| 96 | ;---------------------- ; | ||
| 97 | Message_Number = 3 ;CR,LF,"Must specify COM1, COM2, COM3 or COM4",CR,LF,EOM | ||
| 98 | Handle = STDOUT ; ;AN000; | ||
| 99 | Sublist = No_Replace ; ;AN000; | ||
| 100 | Count = N_A ; ;AN000; | ||
| 101 | Class = Utility_Msg_Class ; ;AN000; | ||
| 102 | Function = No_Input ; ;AN000; | ||
| 103 | Input = N_A ; ;AN000; | ||
| 104 | Define_Msg com1_or_com2 ; ;AN000; | ||
| 105 | ;---------------------- ; | ||
| 106 | Message_Number = 4 ;CR,LF,"Resident portion of MODE loaded",CR,LF,EOM | ||
| 107 | Handle = STDOUT ; ;AN000; | ||
| 108 | Sublist = No_Replace ; ;AN000; | ||
| 109 | Count = N_A ; ;AN000; | ||
| 110 | Class = Utility_Msg_Class ; ;AN000; | ||
| 111 | Function = No_Input ; ;AN000; | ||
| 112 | Input = N_A ; ;AN000; | ||
| 113 | Define_Msg moved_msg ; ;AN000; | ||
| 114 | ;---------------------- ; | ||
| 115 | Message_Number = 5 ;CR,LF,"Illegal device name",BEEP,CR,LF,EOM | ||
| 116 | Handle = STDOUT ; ;AN000; | ||
| 117 | Sublist = sublist_err1 ; ;AN000; | ||
| 118 | Count = 1 ; ;AN000; | ||
| 119 | Class = Utility_Msg_Class ; ;AN000; | ||
| 120 | Function = No_Input ; ;AN000; | ||
| 121 | Input = N_A ; ;AN000; | ||
| 122 | Define_Msg ERR1 ; ;AN000; | ||
| 123 | ;---------------------- ; | ||
| 124 | Message_Number = 6 ;CR,LF,"Printer error",BEEP,CR,LF,EOM | ||
| 125 | Handle = STDOUT ; ;AN000; | ||
| 126 | Sublist = No_Replace ; ;AN000; | ||
| 127 | Count = N_A ; ;AN000; | ||
| 128 | Class = Utility_Msg_Class ; ;AN000; | ||
| 129 | Function = No_Input ; ;AN000; | ||
| 130 | Input = N_A ; ;AN000; | ||
| 131 | Define_Msg ERR2 ; ;AN000; | ||
| 132 | ;---------------------- ; | ||
| 133 | Message_Number = 7 ;CR,LF,"LPT%1: set for 80",CR,LF,EOM | ||
| 134 | Handle = STDOUT ; ;AN000; | ||
| 135 | Sublist = sublist_PT80 ; ;AN000; | ||
| 136 | Count = 1 ; ;AN000; | ||
| 137 | Class = Utility_Msg_Class ; ;AN000; | ||
| 138 | Function = No_Input ; ;AN000; | ||
| 139 | Input = N_A ; ;AN000; | ||
| 140 | Define_Msg PT80 ; ;AN000; | ||
| 141 | ;---------------------- ; | ||
| 142 | Message_Number = 8 ;CR,LF,"LPT%1: set for 132",CR,LF,EOM | ||
| 143 | Handle = STDOUT ; ;AN000; | ||
| 144 | Sublist = sublist_PT132 ; ;AN000; | ||
| 145 | Count = 1 ; ;AN000; | ||
| 146 | Class = Utility_Msg_Class ; ;AN000; | ||
| 147 | Function = No_Function ; ;AN000; | ||
| 148 | Input = N_A ; ;AN000; | ||
| 149 | Define_Msg PT132 ; ;AN000; | ||
| 150 | ;---------------------- ; | ||
| 151 | Message_Number = 9 ;CR,LF,"Printer lines per inch set",CR,LF,EOM | ||
| 152 | Handle = STDOUT ; ;AN000; | ||
| 153 | Sublist = No_replace ; ;AN000; | ||
| 154 | Count = N_A ; ;AN000; | ||
| 155 | Class = Utility_Msg_Class ; ;AN000; | ||
| 156 | Function = No_Function ; ;AN000; | ||
| 157 | Input = N_A ; ;AN000; | ||
| 158 | Define_Msg PTLINES ; ;AN000; | ||
| 159 | ;---------------------- ; | ||
| 160 | Message_Number = 10 ;CR,LF,"Invalid baud rate specified",BEEP,CR,LF,EOM | ||
| 161 | Handle = STDOUT ; ;AN000; | ||
| 162 | Sublist = No_Replace ; ;AN000; | ||
| 163 | Count = N_A ; ;AN000; | ||
| 164 | Class = Utility_Msg_Class ; ;AN000; | ||
| 165 | Function = No_Function ; ;AN000; | ||
| 166 | Input = N_A ; ;AN000; | ||
| 167 | Define_Msg RATEMSG ; ;AN000; | ||
| 168 | ;---------------------- ; | ||
| 169 | Message_Number = 11 ;CR,LF,"COM%1: %2,%3,%4,%5,%6",CR,LF,EOM | ||
| 170 | Handle = STDOUT ; ;AN000; | ||
| 171 | Sublist = sublist_INITMSG ; ;AN000; | ||
| 172 | Count = 6 ; ;AN000; | ||
| 173 | Class = Utility_Msg_Class ; ;AN000; | ||
| 174 | Function = No_Function ; ;AN000; | ||
| 175 | Input = N_A ; ;AN000; | ||
| 176 | Define_Msg INITMSG ; ;AN000; | ||
| 177 | ;---------------------- ; | ||
| 178 | Message_Number = 12 ;"0123456789",EOM | ||
| 179 | Handle = STDOUT ; ;AN000; | ||
| 180 | Sublist = No_replace ; ;AN000; | ||
| 181 | Count = N_A ; ;AN000; | ||
| 182 | Class = Utility_Msg_Class ; ;AN000; | ||
| 183 | Function = No_Function ; ;AN000; | ||
| 184 | Input = N_A ; ;AN000; | ||
| 185 | Define_Msg NUMBERS ; ;AN000; | ||
| 186 | ;---------------------- ; | ||
| 187 | Message_Number = 13 ;CR,LF,"Do you see the %1? (",YES,"/",NO,")",CR,LF,EOM | ||
| 188 | Handle = STDOUT ; ;AN000; | ||
| 189 | Sublist = sublist_SHIFT_MSG ; ;AN000; | ||
| 190 | Count = 1 ; ;AN000; | ||
| 191 | Class = Utility_Msg_Class ; ;AN000; | ||
| 192 | Function = clear_buffer+DOS_keyb_input ; ;AN000; | ||
| 193 | Input = N_A ; ;AN000; | ||
| 194 | Define_Msg SHIFT_MSG ; ;AN000; | ||
| 195 | ;---------------------- ; | ||
| 196 | ;Message_Number = 14 ;CR,LF,"Invalid parameters",BEEP,CR,LF,EOM | ||
| 197 | ;Handle = STDOUT ; ;AC000; | ||
| 198 | ;Sublist = No_replace ; ;AC000; | ||
| 199 | ;Count = N_A ;**** Now use message 54 ***** ;AC000; | ||
| 200 | ;Class = Utility_Msg_Class ; ;AC000; | ||
| 201 | ;Function = No_Function ; ;AC000; | ||
| 202 | ;Input = N_A ; ;AC000; | ||
| 203 | ; Define_Msg MSGI ; ;AC000; | ||
| 204 | ;---------------------- ; | ||
| 205 | Message_Number = 15 ;CR,LF,"LPT%1: rerouted to COM%2:",CR,LF,EOM | ||
| 206 | Handle = STDOUT ; ;AN000; | ||
| 207 | Sublist = sublist_REDIRMSG ; ;AN000; | ||
| 208 | Count = 2 ; ;AN000; | ||
| 209 | Class = Utility_Msg_Class ; ;AN000; | ||
| 210 | Function = No_Function ; ;AN000; | ||
| 211 | Input = N_A ; ;AN000; | ||
| 212 | Define_Msg REDIRMSG ; ;AN000; | ||
| 213 | ;---------------------- ; | ||
| 214 | Message_Number = 16 ;CR,LF,"LPT%1: not rerouted",CR,LF,EOM | ||
| 215 | Handle = STDOUT ; ;AN000; | ||
| 216 | Sublist = sublist_NOTREMSG ; ;AN000; | ||
| 217 | Count = 1 ; ;AN000; | ||
| 218 | Class = Utility_Msg_Class ; ;AN000; | ||
| 219 | Function = No_Function ; ;AN000; | ||
| 220 | Input = N_A ; ;AN000; | ||
| 221 | Define_Msg NOTREMSG ; ;AN000; | ||
| 222 | ;---------------------- ; | ||
| 223 | Message_Number = 17 ;CR,LF,"%1 retry on parallel printer time-out",CR,LF,EOM | ||
| 224 | Handle = STDOUT ; ;AN000; | ||
| 225 | Sublist = sublist_RETPARTO ; ;AN000; | ||
| 226 | Count = 1 ; ;AN000; | ||
| 227 | Class = Utility_Msg_Class ; ;AN000; | ||
| 228 | Function = No_Function ; ;AN000; | ||
| 229 | Input = N_A ; ;AN000; | ||
| 230 | Define_Msg RETPARTO ; ;AN000; | ||
| 231 | ;---------------------- ; | ||
| 232 | Message_Number = 18 ;CR,LF," Unable to shift screen %1",CR,LF,BEEP,EOM | ||
| 233 | Handle = STDOUT ; ;AN000; | ||
| 234 | Sublist = sublist_CANT_SHIFT ; ;AN000; | ||
| 235 | Count = 1 ; ;AN000; | ||
| 236 | Class = Utility_Msg_Class ; ;AN000; | ||
| 237 | Function = No_Function ; ;AN000; | ||
| 238 | Input = N_A ; ;AN000; | ||
| 239 | Define_Msg CANT_SHIFT ; ;AN000; | ||
| 240 | ;---------------------- ; | ||
| 241 | Message_Number = 19 ;CR,LF,"Invalid parameter - %1",BEEP,CR,LF,EOM | ||
| 242 | Handle = STDOUT ; ;AN000; | ||
| 243 | Sublist = sublist_invalid_parameter | ||
| 244 | Count = 1 ; ;AN000; | ||
| 245 | Class = Utility_Msg_Class ; ;AN000; | ||
| 246 | Function = No_Function ; ;AN000; | ||
| 247 | Input = N_A ; ;AN000; | ||
| 248 | Define_Msg invalid_parameter ; ;AN000; | ||
| 249 | ;---------------------- ; | ||
| 250 | Message_Number = 20 ;CR,LF,'Invalid number of parameters',BEEP,CR,LF,EOM | ||
| 251 | Handle = STDOUT ; ;AN000; | ||
| 252 | Sublist = No_Replace ; ;AN000; | ||
| 253 | Count = N_A ; ;AN000; | ||
| 254 | Class = Utility_Msg_Class ; ;AN000; | ||
| 255 | Function = No_Function ; ;AN000; | ||
| 256 | Input = N_A ; ;AN000; | ||
| 257 | Define_Msg invalid_number_of_parameters ; ;AN000; | ||
| 258 | ;---------------------- ; | ||
| 259 | Message_Number = 21 ;CR,LF,'NET 042: Unable to do requested command',BEEP,CR,LF,EOM | ||
| 260 | Handle = STDOUT ; ;AN000; | ||
| 261 | Sublist = No_Replace ; ;AN000; | ||
| 262 | Count = N_A ; ;AN000; | ||
| 263 | Class = Utility_Msg_Class ; ;AN000; | ||
| 264 | Function = No_Function ; ;AN000; | ||
| 265 | Input = N_A ; ;AN000; | ||
| 266 | Define_Msg net_error ; ;AN000; | ||
| 267 | ;---------------------- ; | ||
| 268 | Message_Number = 22 ;CR,LF,'Infinite retry not supported on Network printer',beep,cr,lf,eom | ||
| 269 | Handle = STDOUT ; ;AN000; | ||
| 270 | Sublist = No_Replace ; ;AN000; | ||
| 271 | Count = N_A ; ;AN000; | ||
| 272 | Class = Utility_Msg_Class ; ;AN000; | ||
| 273 | Function = No_Function ; ;AN000; | ||
| 274 | Input = N_A ; ;AN000; | ||
| 275 | Define_Msg not_supported ; ;AN000; | ||
| 276 | ;---------------------- ; | ||
| 277 | Message_Number = 23 ;CR,LF,"Failure to access Codepage Font File",BEEP,CR,LF,EOM | ||
| 278 | Handle = STDOUT ; ;AN000; | ||
| 279 | Sublist = No_Replace ; ;AN000; | ||
| 280 | Count = N_A ; ;AN000; | ||
| 281 | Class = Utility_Msg_Class ; ;AN000; | ||
| 282 | Function = No_Function ; ;AN000; | ||
| 283 | Input = N_A ; ;AN000; | ||
| 284 | Define_Msg cpmsg1 ; ;AN000; | ||
| 285 | ;---------------------- ; | ||
| 286 | Message_Number = 24 ;CR,LF,"Failure to access device: %1",BEEP,CR,LF,EOM | ||
| 287 | Handle = STDOUT ; ;AN000; | ||
| 288 | Sublist = sublist_cpmsg2 ; ;AN000; | ||
| 289 | Count = 1 ; ;AN000; | ||
| 290 | Class = Utility_Msg_Class ; ;AN000; | ||
| 291 | Function = No_Function ; ;AN000; | ||
| 292 | Input = N_A ; ;AN000; | ||
| 293 | Define_Msg cpmsg2 ; ;AN000; | ||
| 294 | ;---------------------- ; | ||
| 295 | Message_Number = 25 ;CR,LF,"Device or codepage missing from font file",BEEP,CR,LF,EOM | ||
| 296 | Handle = STDOUT ; ;AN000; | ||
| 297 | Sublist = No_Replace ; ;AN000; | ||
| 298 | Count = N_A ; ;AN000; | ||
| 299 | Class = Utility_Msg_Class ; ;AN000; | ||
| 300 | Function = No_Function ; ;AN000; | ||
| 301 | Input = N_A ; ;AN000; | ||
| 302 | Define_Msg cpmsg3 ; ;AN000; | ||
| 303 | ;---------------------- ; | ||
| 304 | Message_Number = 26 ;CR,LF,"Font file contents invalid",BEEP,CR,LF,EOM | ||
| 305 | Handle = STDOUT ; ;AN000; | ||
| 306 | Sublist = No_Replace ; ;AN000; | ||
| 307 | Count = N_A ; ;AN000; | ||
| 308 | Class = Utility_Msg_Class ; ;AN000; | ||
| 309 | Function = No_Function ; ;AN000; | ||
| 310 | Input = N_A ; ;AN000; | ||
| 311 | Define_Msg cpmsg4 ; ;AN000; | ||
| 312 | ;---------------------- ; | ||
| 313 | Message_Number = 27 ;CR,LF,"Previously prepared codepage replaced",BEEP,CR,LF,EOM | ||
| 314 | Handle = STDOUT ; ;AN000; | ||
| 315 | Sublist = No_Replace ; ;AN000; | ||
| 316 | Count = N_A ; ;AN000; | ||
| 317 | Class = Utility_Msg_Class ; ;AN000; | ||
| 318 | Function = No_Function ; ;AN000; | ||
| 319 | Input = N_A ; ;AN000; | ||
| 320 | Define_Msg cpmsg5 | ||
| 321 | ;---------------------- ; | ||
| 322 | Message_Number = 28 ;CR,LF,"Active codepage for device %1 is %2",CR,LF,EOM | ||
| 323 | Handle = STDOUT ; ;AN000; | ||
| 324 | Sublist = sublist_cpmsg6 ; ;AN000; | ||
| 325 | Count = 2 ; ;AN000; | ||
| 326 | Class = Utility_Msg_Class ; ;AN000; | ||
| 327 | Function = No_Function ; ;AN000; | ||
| 328 | Input = N_A ; ;AN000; | ||
| 329 | Define_Msg cpmsg6 | ||
| 330 | ;---------------------- ; | ||
| 331 | Message_Number = 29 ;CR,LF,"Device %1 not prepared",CR,LF,EOM | ||
| 332 | Handle = STDOUT ; ;AN000; | ||
| 333 | Sublist = sublist_cpmsg7 ; ;AN000; | ||
| 334 | Count = 1 | ||
| 335 | Class = Utility_Msg_Class ; ;AN000; | ||
| 336 | Function = No_Function ; ;AN000; | ||
| 337 | Input = N_A ; ;AN000; | ||
| 338 | Define_Msg cpmsg7 | ||
| 339 | ;---------------------- ; | ||
| 340 | Message_Number = 30 ;"%1 codepages:",CR,LF,EOM | ||
| 341 | Handle = STDOUT ; ;AN000; | ||
| 342 | Sublist = sublist_cpmsg8 | ||
| 343 | Count = 1 | ||
| 344 | Class = Utility_Msg_Class ; ;AN000; | ||
| 345 | Function = No_Function ; ;AN000; | ||
| 346 | Input = N_A ; ;AN000; | ||
| 347 | Define_Msg cpmsg8 | ||
| 348 | ;---------------------- ; | ||
| 349 | Message_Number = 31 ;" Codepage %1",CR,LF,EOM ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 350 | Handle = STDOUT ; ;AN000; | ||
| 351 | Sublist = sublist_cpmsg9 | ||
| 352 | Count = 1 | ||
| 353 | Class = Utility_Msg_Class ; ;AN000; | ||
| 354 | Function = No_Function ; ;AN000; | ||
| 355 | Input = N_A ; ;AN000; | ||
| 356 | Define_Msg cpmsg9 | ||
| 357 | ;---------------------- ; | ||
| 358 | Message_Number = 32 ;CR,LF,"MODE %1 Codepage function completed",CR,LF,EOM | ||
| 359 | Handle = STDOUT ; ;AN000; | ||
| 360 | Sublist = sublist_cpmsg10 ; ;AN000; | ||
| 361 | Count = 1 | ||
| 362 | Class = Utility_Msg_Class ; ;AN000; | ||
| 363 | Function = No_Function ; ;AN000; | ||
| 364 | Input = N_A ; ;AN000; | ||
| 365 | Define_Msg cpmsg10 | ||
| 366 | ;---------------------- ; | ||
| 367 | Message_Number = 33 ;CR,LF,"Current Codepage settings:",CR,LF,EOM ;table header | ||
| 368 | Handle = STDOUT ; ;AN000; | ||
| 369 | Sublist = No_Replace ; ;AN000; | ||
| 370 | Count = N_A ; ;AN000; | ||
| 371 | Class = Utility_Msg_Class ; ;AN000; | ||
| 372 | Function = No_Function ; ;AN000; | ||
| 373 | Input = N_A ; ;AN000; | ||
| 374 | Define_Msg cpmsg12 | ||
| 375 | ;---------------------- ; | ||
| 376 | Message_Number = 34 ;" %1 - %2 Codepage",CR,LF,EOM | ||
| 377 | Handle = STDOUT ; ;AN000; | ||
| 378 | Sublist = sublist_cpmsg13 | ||
| 379 | Count = 2 | ||
| 380 | Class = Utility_Msg_Class ; ;AN000; | ||
| 381 | Function = No_Function ; ;AN000; | ||
| 382 | Input = N_A ; ;AN000; | ||
| 383 | Define_Msg cpmsg13 | ||
| 384 | ;---------------------- ; | ||
| 385 | Message_Number = 35 ;" Codepage not prepared",CR,LF,EOM | ||
| 386 | Handle = STDOUT ; ;AN000; | ||
| 387 | Sublist = no_replace | ||
| 388 | Count = N_A ; ;AN000; | ||
| 389 | Class = Utility_Msg_Class ; ;AN000; | ||
| 390 | Function = No_Function ; ;AN000; | ||
| 391 | Input = N_A ; ;AN000; | ||
| 392 | Define_Msg cpmsg14 | ||
| 393 | ;---------------------- ; | ||
| 394 | Message_Number = 36 ;"Codepage operation not supported on this device",BEEP,CR,LF,EOM | ||
| 395 | Handle = STDOUT ; ;AN000; | ||
| 396 | Sublist = No_Replace ; ;AN000; | ||
| 397 | Count = N_A ; ;AN000; | ||
| 398 | Class = Utility_Msg_Class ; ;AN000; | ||
| 399 | Function = No_Function ; ;AN000; | ||
| 400 | Input = N_A ; ;AN000; | ||
| 401 | Define_Msg cpmsg15 | ||
| 402 | ;---------------------- ; | ||
| 403 | Message_Number = 37 ;"No codepage has been SELECTED",BEEP,CR,LF,EOM | ||
| 404 | Handle = STDOUT ; ;AN000; | ||
| 405 | Sublist = No_Replace ; ;AN000; | ||
| 406 | Count = N_A ; ;AN000; | ||
| 407 | Class = Utility_Msg_Class ; ;AN000; | ||
| 408 | Function = No_Function ; ;AN000; | ||
| 409 | Input = N_A ; ;AN000; | ||
| 410 | Define_Msg cpmsg16 | ||
| 411 | ;---------------------- ; | ||
| 412 | Message_Number = 38 ;"Device error during %1",BEEP,CR,LF,EOM | ||
| 413 | Handle = STDOUT ; ;AN000; | ||
| 414 | Sublist = sublist_cpmsg17 | ||
| 415 | Count = 1 | ||
| 416 | Class = Utility_Msg_Class ; ;AN000; | ||
| 417 | Function = No_Function ; ;AN000; | ||
| 418 | Input = N_A ; ;AN000; | ||
| 419 | Define_Msg cpmsg17 | ||
| 420 | ;---------------------- ; | ||
| 421 | Message_Number = 39 ;"Codepage not prepared",BEEP,CR,LF,EOM | ||
| 422 | Handle = STDOUT ; ;AN000; | ||
| 423 | Sublist = No_Replace ; ;AN000; | ||
| 424 | Count = N_A ; ;AN000; | ||
| 425 | Class = Utility_Msg_Class ; ;AN000; | ||
| 426 | Function = No_Function ; ;AN000; | ||
| 427 | Input = N_A ; ;AN000; | ||
| 428 | Define_Msg cpmsg18 | ||
| 429 | ;---------------------- ; | ||
| 430 | Message_Number = 40 ;CR,LF,"Current keyboard does not support this Codepage",BEEP,CR,LF,EOM | ||
| 431 | Handle = STDOUT ; ;AN000; | ||
| 432 | Sublist = No_Replace ; ;AN000; | ||
| 433 | Count = N_A ; ;AN000; | ||
| 434 | Class = Utility_Msg_Class ; ;AN000; | ||
| 435 | Function = No_Function ; ;AN000; | ||
| 436 | Input = N_A ; ;AN000; | ||
| 437 | Define_Msg cpmsg19 | ||
| 438 | ;---------------------- ; | ||
| 439 | Message_Number = 41 ;CR,LF,"Error during read of font file",BEEP,CR,LF,EOM | ||
| 440 | Handle = STDOUT ; ;AN000; | ||
| 441 | Sublist = No_Replace | ||
| 442 | Count = N_A ; ;AN000; | ||
| 443 | Class = Utility_Msg_Class ; ;AN000; | ||
| 444 | Function = No_Function ; ;AN000; | ||
| 445 | Input = N_A ; ;AN000; | ||
| 446 | Define_Msg cpmsg20 | ||
| 447 | ;---------------------- ; | ||
| 448 | Message_Number = 42 ;CR,LF,"Unable to perform REFRESH operation",BEEP,CR,LF,EOM | ||
| 449 | Handle = STDOUT ; ;AN000; | ||
| 450 | Sublist = No_Replace ; ;AN000; | ||
| 451 | Count = N_A ; ;AN000; | ||
| 452 | Class = Utility_Msg_Class ; ;AN000; | ||
| 453 | Function = No_Function ; ;AN000; | ||
| 454 | Input = N_A ; ;AN000; | ||
| 455 | Define_Msg cpmsg21 | ||
| 456 | ;---------------------- ; | ||
| 457 | Message_Number = 43 ;CR,LF | ||
| 458 | Handle = STDOUT ; ;AN000; | ||
| 459 | Sublist = No_Replace ; ;AN000; | ||
| 460 | Count = N_A ; ;AN000; | ||
| 461 | Class = Utility_Msg_Class ; ;AN000; | ||
| 462 | Function = No_Function ; ;AN000; | ||
| 463 | Input = N_A ; ;AN000; | ||
| 464 | Define_Msg CRLF | ||
| 465 | ;---------------------- ; | ||
| 466 | Message_Number = 44 ;"Status for device %1:",CR,LF,EOM | ||
| 467 | Handle = STDOUT ; ;AN000; | ||
| 468 | Sublist = sublist_status_for_device | ||
| 469 | Count = 1 | ||
| 470 | Class = Utility_Msg_Class ; ;AN000; | ||
| 471 | Function = No_Function ; ;AN000; | ||
| 472 | Input = N_A ; ;AN000; | ||
| 473 | Define_Msg status_for_device | ||
| 474 | ;---------------------- ; | ||
| 475 | Message_Number = 45 ;"------------------" underline for status report header | ||
| 476 | Handle = STDOUT ; ;AN000; | ||
| 477 | Sublist = No_Replace ; ;AN000; | ||
| 478 | Count = N_A | ||
| 479 | Class = Utility_Msg_Class ; ;AN000; | ||
| 480 | Function = No_Function ; ;AN000; | ||
| 481 | Input = N_A ; ;AN000; | ||
| 482 | Define_Msg long_underline | ||
| 483 | ;---------------------- ; | ||
| 484 | Message_Number = 46 ;"----" underline for "CON:" | ||
| 485 | Handle = STDOUT ; ;AN000; | ||
| 486 | Sublist = No_Replace ; ;AN000; | ||
| 487 | Count = N_A | ||
| 488 | Class = Utility_Msg_Class ; ;AN000; | ||
| 489 | Function = No_Function ; ;AN000; | ||
| 490 | Input = N_A ; ;AN000; | ||
| 491 | Define_Msg four_char_underline | ||
| 492 | ;---------------------- ; | ||
| 493 | Message_Number = 47 ;"-----" underline for "COMX:" and "LPTX:" | ||
| 494 | Handle = STDOUT ; ;AN000; | ||
| 495 | Sublist = No_Replace ; ;AN000; | ||
| 496 | Count = N_A | ||
| 497 | Class = Utility_Msg_Class ; ;AN000; | ||
| 498 | Function = No_Function ; ;AN000; | ||
| 499 | Input = N_A ; ;AN000; | ||
| 500 | Define_Msg five_char_underline | ||
| 501 | ;---------------------- ; | ||
| 502 | Message_Number = 48 ;"LINES=%1" | ||
| 503 | Handle = STDOUT ; ;AN000; | ||
| 504 | Sublist = sublist_LINES_equal ; ;AN000; | ||
| 505 | Count = 1 | ||
| 506 | Class = Utility_Msg_Class ; ;AN000; | ||
| 507 | Function = No_Function ; ;AN000; | ||
| 508 | Input = N_A ; ;AN000; | ||
| 509 | Define_Msg LINES_equal_msg | ||
| 510 | ;---------------------- ; | ||
| 511 | Message_Number = 49 ;"COLUMNS=%1" | ||
| 512 | Handle = STDOUT ; ;AN000; | ||
| 513 | Sublist = sublist_COLUMNS_equal ; ;AN000; | ||
| 514 | Count = 1 | ||
| 515 | Class = Utility_Msg_Class ; ;AN000; | ||
| 516 | Function = No_Function ; ;AN000; | ||
| 517 | Input = N_A ; ;AN000; | ||
| 518 | Define_Msg COLUMNS_equal_msg | ||
| 519 | ;---------------------- ; | ||
| 520 | Message_Number = 50 ;CR,LF,"RATE and DELAY must be specified together",BELL,CR,LF | ||
| 521 | Handle = STDOUT ; ;AN000; | ||
| 522 | Sublist = No_Replace ; ;AN000; | ||
| 523 | Count = N_A | ||
| 524 | Class = Utility_Msg_Class ; ;AN000; | ||
| 525 | Function = No_Function ; ;AN000; | ||
| 526 | Input = N_A ; ;AN000; | ||
| 527 | Define_Msg RATE_and_DELAY_together | ||
| 528 | ;---------------------- ; | ||
| 529 | Message_Number = 51 ;"RATE=%1" | ||
| 530 | Handle = STDOUT ; ;AN000; | ||
| 531 | Sublist = sublist_RATE_equal ; ;AN000; | ||
| 532 | Count = 1 | ||
| 533 | Class = Utility_Msg_Class ; ;AN000; | ||
| 534 | Function = No_Function ; ;AN000; | ||
| 535 | Input = N_A ; ;AN000; | ||
| 536 | Define_Msg RATE_equal | ||
| 537 | ;---------------------- ; | ||
| 538 | Message_Number = 52 ;"DELAY=%1" | ||
| 539 | Handle = STDOUT ; ;AN000; | ||
| 540 | Sublist = sublist_DELAY_equal ; ;AN000; | ||
| 541 | Count = 1 | ||
| 542 | Class = Utility_Msg_Class ; ;AN000; | ||
| 543 | Function = No_Function ; ;AN000; | ||
| 544 | Input = N_A ; ;AN000; | ||
| 545 | Define_Msg DELAY_equal | ||
| 546 | ;---------------------- ; | ||
| 547 | Message_Number = 53 ;"Function not supported on this machine" | ||
| 548 | Handle = STDOUT ; ;AN000; | ||
| 549 | Sublist = Sublist_Not_supported ; ;AN000; | ||
| 550 | Count = 1 | ||
| 551 | Class = Utility_Msg_Class ; ;AN000; | ||
| 552 | Function = No_Function ; ;AN000; | ||
| 553 | Input = N_A ; ;AN000; | ||
| 554 | Define_Msg Function_not_supported | ||
| 555 | ;---------------------- ; | ||
| 556 | Message_Number = 54 ;"Required font not loaded" | ||
| 557 | Handle = STDOUT ; ;AN000; | ||
| 558 | Sublist = No_Replace ; ;AN000; | ||
| 559 | Count = N_A | ||
| 560 | Class = Utility_Msg_Class ; ;AN000; | ||
| 561 | Function = No_Function ; ;AN000; | ||
| 562 | Input = N_A ; ;AN000; | ||
| 563 | Define_Msg Required_font_not_loaded | ||
| 564 | ;---------------------- ; | ||
| 565 | Message_Number = 55 ;"ANSI.SYS must be installed to perform requested function",BELL,CR,LF | ||
| 566 | Handle = STDOUT ; ;AN000; | ||
| 567 | Sublist = No_Replace ; ;AN000; | ||
| 568 | Count = N_A | ||
| 569 | Class = Utility_Msg_Class ; ;AN000; | ||
| 570 | Function = No_Function ; ;AN000; | ||
| 571 | Input = N_A ; ;AN000; | ||
| 572 | Define_Msg ANSI_not_loaded | ||
| 573 | ;---------------------- ; | ||
| 574 | Message_Number = 56 ;CR,LF,"Baud rate required",BELL,CR,LF | ||
| 575 | Handle = STDOUT ; ;AN000; | ||
| 576 | Sublist = No_Replace ; ;AN000; | ||
| 577 | Count = N_A | ||
| 578 | Class = Utility_Msg_Class ; ;AN000; | ||
| 579 | Function = No_Function ; ;AN000; | ||
| 580 | Input = N_A ; ;AN000; | ||
| 581 | Define_Msg Baud_rate_required | ||
| 582 | ;---------------------- ; | ||
| 583 | Message_Number = 57 ;"RETRY=%1",CR,LF | ||
| 584 | Handle = STDOUT ; ;AN000; | ||
| 585 | Sublist = Sublist_retry_equal ; ;AN000; | ||
| 586 | Count = 1 | ||
| 587 | Class = Utility_Msg_Class ; ;AN000; | ||
| 588 | Function = No_Function ; ;AN000; | ||
| 589 | Input = N_A ; ;AN000; | ||
| 590 | Define_Msg retry_equal | ||
| 591 | ;---------------------- ; | ||
| 592 | Message_Number = 58 ;"Syntax error - ",CR,LF | ||
| 593 | Handle = STDOUT ; ;AN000; | ||
| 594 | Sublist = Sublist_syntax_error ; ;AN000; | ||
| 595 | Count = 1 | ||
| 596 | Class = Utility_msg_Class ; ;AN000; | ||
| 597 | Function = No_Function ; ;AN000; | ||
| 598 | Input = N_A ; ;AN000; | ||
| 599 | Define_Msg syntax_error | ||
| 600 | ;---------------------- ; | ||
| 601 | |||
| 602 | Message_Number = 59 ;"rightmost 9" ;AN001; | ||
| 603 | Handle = STDOUT ; ;AN000; | ||
| 604 | Sublist = No_Replace ; ;AN000; | ||
| 605 | Count = N_A | ||
| 606 | Class = Utility_Msg_Class ; ;AN000; | ||
| 607 | Function = No_Function ; ;AN000; | ||
| 608 | Input = N_A ; ;AN000; | ||
| 609 | Define_Msg rightmost ;AN001; | ||
| 610 | ;---------------------- ; | ||
| 611 | Message_Number = 60 ;"leftmost 0" ;AN001;LEFTMOST DB | ||
| 612 | Handle = STDOUT ; ;AN000; | ||
| 613 | Sublist = No_Replace ; ;AN000; | ||
| 614 | Count = N_A | ||
| 615 | Class = Utility_Msg_Class ; ;AN000; | ||
| 616 | Function = No_Function ; ;AN000; | ||
| 617 | Input = N_A ; ;AN000; | ||
| 618 | Define_Msg leftmost | ||
| 619 | ;---------------------- ; | ||
| 620 | ;RETPARTO - CR,LF,;"%s retry on parallel printer time-out",CR,LF,EOM | ||
| 621 | |||
| 622 | Message_Number = 61 ;"No" ;AN001;NORETRY DB | ||
| 623 | Handle = STDOUT ; ;AN000; | ||
| 624 | Sublist = No_Replace ; ;AN000; | ||
| 625 | Count = N_A | ||
| 626 | Class = Utility_Msg_Class ; ;AN000; | ||
| 627 | Function = No_Function ; ;AN000; | ||
| 628 | Input = N_A ; ;AN000; | ||
| 629 | Define_Msg noretry | ||
| 630 | ;---------------------- ; | ||
| 631 | Message_Number = 62 ;"Infinite" ;AN001;INFINITE DB | ||
| 632 | Handle = STDOUT ; ;AN000; | ||
| 633 | Sublist = No_Replace ; ;AN000; | ||
| 634 | Count = N_A | ||
| 635 | Class = Utility_Msg_Class ; ;AN000; | ||
| 636 | Function = No_Function ; ;AN000; | ||
| 637 | Input = N_A ; ;AN000; | ||
| 638 | Define_Msg infinite | ||
| 639 | ;---------------------- ; | ||
| 640 | ;CANT_SHIFT - CR,LF,;" Unable to shift screen %s",CR,LF,BEEP,EOM | ||
| 641 | |||
| 642 | Message_Number = 63 ;"left" ;AN001;LEFT DB | ||
| 643 | Handle = STDOUT ; ;AN000; | ||
| 644 | Sublist = No_Replace ; ;AN000; | ||
| 645 | Count = N_A | ||
| 646 | Class = Utility_Msg_Class ; ;AN000; | ||
| 647 | Function = No_Function ; ;AN000; | ||
| 648 | Input = N_A ; ;AN000; | ||
| 649 | Define_Msg left | ||
| 650 | ;---------------------- ; | ||
| 651 | Message_Number = 64 ;"right" ;AN001;RIGHT DB | ||
| 652 | Handle = STDOUT ; ;AN000; | ||
| 653 | Sublist = No_Replace ; ;AN000; | ||
| 654 | Count = N_A | ||
| 655 | Class = Utility_Msg_Class ; ;AN000; | ||
| 656 | Function = No_Function ; ;AN000; | ||
| 657 | Input = N_A ; ;AN000; | ||
| 658 | Define_Msg right | ||
| 659 | ;---------------------- ; | ||
| 660 | ;CPMSG8 DB ;"%S codepages:",CR,LF,EOM | ||
| 661 | |||
| 662 | Message_Number = 65 ;"Hardware" ;AN001;CPMSG8_HW DB | ||
| 663 | Handle = STDOUT ; ;AN000; | ||
| 664 | Sublist = No_Replace ; ;AN000; | ||
| 665 | Count = N_A | ||
| 666 | Class = Utility_Msg_Class ; ;AN000; | ||
| 667 | Function = No_Function ; ;AN000; | ||
| 668 | Input = N_A ; ;AN000; | ||
| 669 | Define_Msg cpmsg8_hw | ||
| 670 | ;---------------------- ; | ||
| 671 | Message_Number = 66 ;"Prepared" ;AN001;CPMSG8_PR DB | ||
| 672 | Handle = STDOUT ; ;AN000; | ||
| 673 | Sublist = No_Replace ; ;AN000; | ||
| 674 | Count = N_A | ||
| 675 | Class = Utility_Msg_Class ; ;AN000; | ||
| 676 | Function = No_Function ; ;AN000; | ||
| 677 | Input = N_A ; ;AN000; | ||
| 678 | Define_Msg cpmsg8_pr | ||
| 679 | ;---------------------- ; | ||
| 680 | ;CPMSG10 DB ;"MODE %S Codepage function completed",CR,LF,EOM | ||
| 681 | ;CPMSG17 DB ;"Device error during %S",BEEP,CR,LF,EOM | ||
| 682 | |||
| 683 | Message_Number = 67 ;"status" ;AN001;CPMSG17_QUERY CPMSG10_QUERY | ||
| 684 | Handle = STDOUT ; ;AN000; | ||
| 685 | Sublist = No_Replace ; ;AN000; | ||
| 686 | Count = N_A | ||
| 687 | Class = Utility_Msg_Class ; ;AN000; | ||
| 688 | Function = No_Function ; ;AN000; | ||
| 689 | Input = N_A ; ;AN000; | ||
| 690 | Define_Msg cpmsgxx_query | ||
| 691 | ;---------------------- ; | ||
| 692 | Message_Number = 68 ;"prepare" ;AN001;CPMSG17_PREP CPMSG10_DES | ||
| 693 | Handle = STDOUT ; ;AN000; | ||
| 694 | Sublist = No_Replace ; ;AN000; | ||
| 695 | Count = N_A | ||
| 696 | Class = Utility_Msg_Class ; ;AN000; | ||
| 697 | Function = No_Function ; ;AN000; | ||
| 698 | Input = N_A ; ;AN000; | ||
| 699 | Define_Msg cpmsgxx_prep | ||
| 700 | ;---------------------- ; | ||
| 701 | Message_Number = 69 ;"select" ;AN001;CPMSG17_ACT CPMSG10_SELECT | ||
| 702 | Handle = STDOUT ; ;AN000; | ||
| 703 | Sublist = No_Replace ; ;AN000; | ||
| 704 | Count = N_A | ||
| 705 | Class = Utility_Msg_Class ; ;AN000; | ||
| 706 | Function = No_Function ; ;AN000; | ||
| 707 | Input = N_A ; ;AN000; | ||
| 708 | Define_Msg cpmsgxx_select | ||
| 709 | ;---------------------- ; | ||
| 710 | Message_Number = 70 ;"refresh" ;AN001;CPMSG17_REFRESH CPMSG10_REFRESH | ||
| 711 | Handle = STDOUT ; ;AN000; | ||
| 712 | Sublist = No_Replace ; ;AN000; | ||
| 713 | Count = N_A | ||
| 714 | Class = Utility_Msg_Class ; ;AN000; | ||
| 715 | Function = No_Function ; ;AN000; | ||
| 716 | Input = N_A ; ;AN000; | ||
| 717 | Define_Msg cpmsgxx_refresh | ||
| 718 | ;---------------------- ; | ||
| 719 | |||
| 720 | ;CPMSG17 DB ;"Device error during %S",BEEP,CR,LF,EOM | ||
| 721 | |||
| 722 | Message_Number = 71 ;"write of font file to device",EOM ;AN001;CPMSG17_WRIT | ||
| 723 | Handle = STDOUT ; ;AN000; | ||
| 724 | Sublist = No_Replace ; ;AN000; | ||
| 725 | Count = N_A | ||
| 726 | Class = Utility_Msg_Class ; ;AN000; | ||
| 727 | Function = No_Function ; ;AN000; | ||
| 728 | Input = N_A ; ;AN000; | ||
| 729 | Define_Msg cpmsg17_writ | ||
| 730 | ;---------------------- ; | ||
| 731 | ;CPMSG13 DB ;" %D - %S Codepage",CR,LF,EOM | ||
| 732 | |||
| 733 | Message_Number = 72 ;"selected" ;AN001;CPMSG13_ACT | ||
| 734 | Handle = STDOUT ; ;AN000; | ||
| 735 | Sublist = No_Replace ; ;AN000; | ||
| 736 | Count = N_A | ||
| 737 | Class = Utility_Msg_Class ; ;AN000; | ||
| 738 | Function = No_Function ; ;AN000; | ||
| 739 | Input = N_A ; ;AN000; | ||
| 740 | Define_Msg cpmsg13_act | ||
| 741 | ;---------------------- ; | ||
| 742 | Message_Number = 73 ;"system" ;AN001;CPMSG13_SYS | ||
| 743 | Handle = STDOUT ; ;AN000; | ||
| 744 | Sublist = No_Replace ; ;AN000; | ||
| 745 | Count = N_A | ||
| 746 | Class = Utility_Msg_Class ; ;AN000; | ||
| 747 | Function = No_Function ; ;AN000; | ||
| 748 | Input = N_A ; ;AN000; | ||
| 749 | Define_Msg cpmsg13_sys | ||
diff --git a/v4.0/src/CMD/MODE/MODEECHO.ASM b/v4.0/src/CMD/MODE/MODEECHO.ASM new file mode 100644 index 0000000..a17c2d5 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEECHO.ASM | |||
| @@ -0,0 +1,482 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODEECHO - REDIRECT PRINTER OUTPUT FROM PARALLEL TO SERIAL | ||
| 3 | |||
| 4 | .XLIST | ||
| 5 | INCLUDE STRUC.INC | ||
| 6 | .LIST | ||
| 7 | |||
| 8 | INCLUDE common.stc ;definition of parm_list_entry struc | ||
| 9 | |||
| 10 | DISPLAY MACRO MSG | ||
| 11 | MOV DX,OFFSET MSG | ||
| 12 | CALL PRINTF | ||
| 13 | ENDM | ||
| 14 | |||
| 15 | SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG | ||
| 16 | PUSH AX | ||
| 17 | MOV AX,VALUE | ||
| 18 | MOV REG,AX | ||
| 19 | POP AX | ||
| 20 | ENDM | ||
| 21 | |||
| 22 | |||
| 23 | ;***************************************************************** | ||
| 24 | VECT SEGMENT AT 0 | ||
| 25 | ORG 50H | ||
| 26 | VECT14H LABEL DWORD ;RS232 CALL, WILL POINT TO MODETO AFTER | ||
| 27 | ; RESIDENT CODE IS LOADED. | ||
| 28 | ORG 400H | ||
| 29 | RS232_BASE DW ? ;ADDR OF RS232 ADAPTER FOR COM1 | ||
| 30 | DW ? ;ADDR OF RS232 ADAPTER FOR COM2 | ||
| 31 | DW ? ;ADDR OF RS232 ADAPTER FOR COM3 | ||
| 32 | DW ? ;ADDR OF RS232 ADAPTER FOR COM4 | ||
| 33 | ; | ||
| 34 | ORG 408H | ||
| 35 | PRINTR DW ? ;LPT1 | ||
| 36 | DW ? ;LPT2 | ||
| 37 | DW ? ;LPT3 | ||
| 38 | ; | ||
| 39 | ORG 530H | ||
| 40 | RESSEG DD ? ;VECTOR OF MODETO, IF RESIDENT,OR 0 | ||
| 41 | VECT ENDS | ||
| 42 | ;***************************************************************** | ||
| 43 | ascii_to_int EQU 0FH ;ANDed with an ascii 0-9 value yeilds binary 0-9 | ||
| 44 | CR EQU 13 ;CARRIAGE RETURN | ||
| 45 | LF EQU 10 ;LINE FEED | ||
| 46 | parm_list EQU [BP] ;AN000; ;AN000; | ||
| 47 | TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN | ||
| 48 | |||
| 49 | PUBLIC LPTNO ;used by modeprin and modepars | ||
| 50 | PUBLIC PRINTR | ||
| 51 | PUBLIC display_printer_reroute_status | ||
| 52 | |||
| 53 | PAGE | ||
| 54 | ;*************************************************************** | ||
| 55 | PRINTF_CODE SEGMENT PUBLIC | ||
| 56 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,ES:NOTHING | ||
| 57 | |||
| 58 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 59 | ;º º | ||
| 60 | |||
| 61 | two DB 2 ;used to change byte displacement to word disp. See 'modeecho' | ||
| 62 | LPTNO DB 0 ;holder of ASCII form of the LPT number (1 thru 3) | ||
| 63 | |||
| 64 | ;º º | ||
| 65 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 66 | |||
| 67 | EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE | ||
| 68 | ;PARM1 DB 10 DUP(0) | ||
| 69 | ;PARM2 DB 0 | ||
| 70 | ;PARM3 DB 0 | ||
| 71 | ;MODE DB 0 | ||
| 72 | ;FLAG DB 0 | ||
| 73 | ENDPARM EQU MODE | ||
| 74 | EXTRN CRLF:BYTE ;AN000;carriage return linefeed | ||
| 75 | EXTRN parm_lst:BYTE ;AN000; | ||
| 76 | EXTRN illegal_device_ptr:WORD ;AN000;pointer to bad com device name string | ||
| 77 | EXTRN MODELOAD:NEAR | ||
| 78 | EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE | ||
| 79 | EXTRN REDIRMSG:WORD ;CR,LF,"LPT" | ||
| 80 | EXTRN REDPT:BYTE ;" " | ||
| 81 | ; ": rerouted to COM" | ||
| 82 | EXTRN REDCOM:BYTE ;" " | ||
| 83 | ; ":",CR,LF,"$" | ||
| 84 | ; | ||
| 85 | EXTRN NOTREMSG:WORD ;CR,LF,"LPT" | ||
| 86 | EXTRN NOTREDPT:BYTE ;" " | ||
| 87 | ; ": not redirected.",CR,LF,"$" | ||
| 88 | ;EXTRN printer_reroute_mask:BYTE ;mask for testing ptsflag1 to see if a printer is rerouted | ||
| 89 | EXTRN ptsflag1:BYTE ;see rescode.sal | ||
| 90 | EXTRN ERR1:WORD ;"ILLEGAL DEVICE NAME" | ||
| 91 | EXTRN resflag2:ABS ;see rescode | ||
| 92 | EXTRN FIXUP:ABS ;IN MODEPTS, OFFSET USED BY COND. JMP | ||
| 93 | EXTRN OFFPTS:ABS ;WHERE MODEPTS IS RELATIVE TO BEGINNING | ||
| 94 | ; OF MODETO | ||
| 95 | EXTRN NEW_PTSFLAG:ABS ;WHERE PTSFLAG1 IS IN THE RESIDENT CODE | ||
| 96 | ; RELATIVE TO BEGINING OF MODETO | ||
| 97 | ; | ||
| 98 | ;*************************************************************** | ||
| 99 | VERIFY PROC NEAR | ||
| 100 | PUBLIC VERIFY | ||
| 101 | ; | ||
| 102 | SUB AX,AX ;CLEAR A REG | ||
| 103 | MOV ES,AX ;SET ES TO LOW MEMORY | ||
| 104 | ;DETERMINE WHAT PRINTER IS INVOLVED (LOOK AT n OF LPTn:) | ||
| 105 | MOV AL,BYTE PTR DS:LPTNO | ||
| 106 | MOV REDPT,AL ;PUT n OF LPTn IN REDIRECT MESSAGE | ||
| 107 | MOV NOTREDPT,AL ;AND INTO NOT REDIRECTED MSG | ||
| 108 | ; IF PRINTER DEVICE IS LPT1 | ||
| 109 | CMP AL,"1" | ||
| 110 | JNE ELSEIF01A | ||
| 111 | ; | ||
| 112 | MOV AH,01H ;SET FLAG FOR LPT1 | ||
| 113 | MOV SI,1 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY | ||
| 114 | ; ELSEIF PRINTER DEVICE IS LPT2 | ||
| 115 | JMP SHORT ENDIF01 | ||
| 116 | ELSEIF01A: | ||
| 117 | CMP AL,"2" | ||
| 118 | JNE ELSEIF01B | ||
| 119 | ; | ||
| 120 | MOV AH,02H ;SET FLAG FOR LPT2 | ||
| 121 | MOV SI,2 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY | ||
| 122 | ; ELSEIF PRINTER DEVICE IS LPT3 | ||
| 123 | JMP SHORT ENDIF01 | ||
| 124 | ELSEIF01B: | ||
| 125 | ; CMP AL,"3" | ||
| 126 | ; JNE ELSE01 | ||
| 127 | ; | ||
| 128 | MOV AH,04H ;SET FLAG FOR LPT3 | ||
| 129 | MOV SI,03 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY | ||
| 130 | ; ELSE ,SINCE NONE OF THE ABOVE, MUST BE INVALID | ||
| 131 | ; JMP SHORT ENDIF01 | ||
| 132 | ;ELSE01: | ||
| 133 | ; DISPLAY ERR1 ;FUSS ABOUT INVALID n OF LPTn | ||
| 134 | ; MOV AH,0 ;SET FLAG TO INVALID | ||
| 135 | ; ENDIF ,END OF CHECK FOR DEVICE NO. IN LPTn | ||
| 136 | ENDIF01: | ||
| 137 | ;AT EXIT: AH=MASK FOR NEW_PTSFLAG REPRESENTING WHICH LPTn, (OR 0 IF n INVALID) | ||
| 138 | ; AH HAS 0000 0XXX , WHERE BIT ON REPRESENTS: | ||
| 139 | ; || --LPT1 | ||
| 140 | ; | ---LPT2 | ||
| 141 | ; ----LPT3 | ||
| 142 | ; SI=SET TO HEX 1,2, OR 3 TO BE USED AS OFFSET BEYOND NEW_PTSFLAG | ||
| 143 | ; TO ADDRESS THE BYTES PTSFLAG2, PTSFLAG3, AND PTSFLAG4 | ||
| 144 | ; (SEE MODECODE FOR BYTE DEFINITIONS) | ||
| 145 | RET | ||
| 146 | VERIFY ENDP | ||
| 147 | ;*************************************************************** | ||
| 148 | |||
| 149 | |||
| 150 | MODEECHO PROC NEAR | ||
| 151 | PUBLIC MODEECHO | ||
| 152 | |||
| 153 | |||
| 154 | ;INPUT: | ||
| 155 | |||
| 156 | ; SI=printer number value (one based) | ||
| 157 | ; AH=printer number mask: lpt1=1, lpt2=2, lpt3=4 | ||
| 158 | ; AL=com number character | ||
| 159 | ; all values are known to be valid, but the existence of the com port has | ||
| 160 | ; not been checked. | ||
| 161 | |||
| 162 | |||
| 163 | ;REGISTER | ||
| 164 | ; USAGE : DL - hold the binary COM number | ||
| 165 | ; BX - general use | ||
| 166 | |||
| 167 | |||
| 168 | |||
| 169 | |||
| 170 | MOV REDCOM,AL ;PUT m OF COMm TO REDIRECT MESSAGE | ||
| 171 | PUSH ES ;SAVE SEG REG | ||
| 172 | SET ES,0 | ||
| 173 | |||
| 174 | MOV BH,AH ;save the lpt number | ||
| 175 | AND AL,ascii_to_int ;convert to 1 based integer | ||
| 176 | MOV DL,AL ;FLAG FOR COM1, see 'ptsflag2' in 'rescode' | ||
| 177 | ;see if the COM# ACTUALLY EXISTS | ||
| 178 | DEC AL ;AL= 0 based com number | ||
| 179 | MUL TWO ;AL=disp from 40:0 of com port address word | ||
| 180 | MOV AH,BH ;restore the lpt number | ||
| 181 | XOR BX,BX ;prepare for byte move | ||
| 182 | MOV BL,AL ;BX=disp from 40:0 of com port address word | ||
| 183 | .IF <ES:RS232_BASE[BX] NE 0> THEN ;IF the com adapter does exist THEN | ||
| 184 | |||
| 185 | ;AT THIS POINT WE KNOW THAT LPTn AND COMm ARE BOTH LEGAL | ||
| 186 | |||
| 187 | ;THE FOLLOWING IS WHERE THE APPROPRIATE ADDRESS WORD FOR THE PRINTER | ||
| 188 | ;INVOLVED IS SET TO 0001H TO INDICATE TO BASIC THAT IT CAN OPEN THE | ||
| 189 | ;DEVICE BECAUSE IT HAS BEEN REDIRECTED. SEE TECH REF PAGE A-2 | ||
| 190 | ;RS232 AND PRINTER BASE. | ||
| 191 | |||
| 192 | SAL SI,1 ;2*SI TO GET TO THE APPROPRIATE WORD | ||
| 193 | ; : : IF THE PRINTER ACTUALLY EXISTS | ||
| 194 | CMP ES:PRINTR-2+[SI],0000H ;IF THE WORD IS NONZERO THE | ||
| 195 | JNE ENDIF10 ;DEVICE EXISTS SO DON'T PUT A 1 THERE. | ||
| 196 | MOV ES:PRINTR-2+[SI],0001H ;PUT 0001H IN PRINTER WORD n | ||
| 197 | ; : : ENDIF PRINTER EXISTS | ||
| 198 | ENDIF10: | ||
| 199 | SAR SI,1 ;RESTORE SI TO n OF LPTn | ||
| 200 | ; | ||
| 201 | CALL MODELOAD ;WITHIN 'MODECODE' MODULE | ||
| 202 | ; | ||
| 203 | ;AH HAS A MASK SET BY THE 'VERIFY' PROC TO CORRESPOND TO THE LPTn | ||
| 204 | PUSH ES ;I'M ABOUT TO USE ES, SO I'LL SAVE IT | ||
| 205 | PUSH DI | ||
| 206 | LES DI,ES:RESSEG ;FETCH POINTER TO MODETO IN RESIDENT CODE | ||
| 207 | MOV BX,NEW_PTSFLAG ; FROM MODETO INTO BX | ||
| 208 | ADD BX,DI ;ES:BX IS ADDRESS OF PTSFLAG1 IN RESIDENT | ||
| 209 | ; CODE (PROC MODEPTS) | ||
| 210 | OR AH,BYTE PTR ES:[BX] ;TURN ON THIS PRINTER'S BIT | ||
| 211 | MOV BYTE PTR ES:[BX],AH ;RECORD WHICH LPT IS TO BE | ||
| 212 | ; REDIRECTED | ||
| 213 | ; SI=LPTn, DL=COMm | ||
| 214 | DEC DL ;NOW DL=0 FOR COM1, DL=1 FOR COM2 | ||
| 215 | ; SINCE SI=1, 2, OR 3, THIS PUTS A 0 OR 1 INTO | ||
| 216 | ; PTSFLAG2, PTSFLAG3, OR PTSFLAG4 | ||
| 217 | MOV BYTE PTR ES:[BX][SI],DL ;RECORD FOR THIS LPTn | ||
| 218 | ; WHICH COMm THE LPTn IS REDIRECTED TO | ||
| 219 | POP DI | ||
| 220 | POP ES ;RESTORE SEG REG USED FOR CHECKING/SETTING ADDRESS | ||
| 221 | ; WORDS AND NEW_PTSFLAG | ||
| 222 | CALL ECHO ;CHANGE JMP IN MODEPTS COPY IN LOW MEMORY | ||
| 223 | ; SO PROPER LPTn GETS REDIRECTED | ||
| 224 | DISPLAY CRLF ;AN000; | ||
| 225 | DISPLAY REDIRMSG | ||
| 226 | |||
| 227 | .ELSE ;valid com name, adapter not there | ||
| 228 | MOV DI,0 ;COM device name is always the first parm, the value of "LPTX[:]=value" ;AN000; | ||
| 229 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] | ||
| 230 | MOV CX,parm_list[DI].value1 ;AN000; ;AN000; | ||
| 231 | MOV illegal_device_ptr,CX ;AN000;set up message with bad com device name string | ||
| 232 | DISPLAY ERR1 ;"Illegal device name - COMX" | ||
| 233 | .ENDIF | ||
| 234 | |||
| 235 | |||
| 236 | POP ES ;RESTORE SEG REG | ||
| 237 | RET | ||
| 238 | MODEECHO ENDP | ||
| 239 | ;*************************************************************** | ||
| 240 | MODEECNO PROC NEAR | ||
| 241 | PUBLIC MODEECNO | ||
| 242 | ;INPUT: PARM1 AREA HAS: | ||
| 243 | ; LPTN: | ||
| 244 | ; OF WHICH VERIFICATION HAS BEEN MADE OF ONLY: | ||
| 245 | ; L???: | ||
| 246 | PUSH ES ;SAVE SEG REG | ||
| 247 | CALL VERIFY ;VERIFY THE n OF LPTn | ||
| 248 | ; SET AH ACCORDINGLY | ||
| 249 | ; ON EXIT FROM VERIFY, ES=0 | ||
| 250 | ; | ||
| 251 | ; IF n OF LPTn IS OK | ||
| 252 | CMP AH,0 | ||
| 253 | JE ENDIF06 | ||
| 254 | ; : IF IT IS POSSIBLE THAT REDIRECTION IS IN EFFECT | ||
| 255 | CMP WORD PTR ES:530H,0000H ;HAS THE POINTER BEEN SET? | ||
| 256 | JE ENDIF05 ;SINCE THE POINTER HASN'T BEEN SET, THE | ||
| 257 | ; CODE HASN'T BEEN LOADED, THEREFORE | ||
| 258 | ; THE LPT CAN'T BE REDIRECTED, SO THERE | ||
| 259 | ; IS NO NEED TO UNREDIRECT IT | ||
| 260 | ; SINCE n OF LPTn IS OK, | ||
| 261 | ; AND SI HAS 1,2,OR 3 TO CORRESPOND TO n | ||
| 262 | ; AND AH HAS: | ||
| 263 | ; 0000 0001 - LPT1 | ||
| 264 | ; 0000 0010 - LPT2 | ||
| 265 | ; 0000 0100 - LPT3 | ||
| 266 | XOR AH,0FFH ;NOW AL HAS | ||
| 267 | ; 1111 1110 - LPT1 | ||
| 268 | ; 1111 1101 - LPT2 | ||
| 269 | ; 1111 1011 - LPT3 | ||
| 270 | PUSH ES ;SAVE ES=0, SET BY VERIFY | ||
| 271 | PUSH DI ;WILL BE USED AS OFFSET IN SEGMENT 0 | ||
| 272 | ;ES:=O | ||
| 273 | LES DI,ES:RESSEG ;FETCH POINTER TO MODETO IN RESIDENT CODE | ||
| 274 | PUSH BX ;TO AVOID 'TYPE MISMATCH' I PUT OFFSET | ||
| 275 | MOV BX,NEW_PTSFLAG ;FROM MODETO INTO BX | ||
| 276 | AND AH,BYTE PTR ES:[DI]+[BX] ;CLEAR THIS PRINTER'S BIT | ||
| 277 | MOV BYTE PTR ES:[DI]+[BX],AH ;RESTORE Revised FLAG BYTE | ||
| 278 | POP BX | ||
| 279 | POP DI | ||
| 280 | POP ES ;RESTORE ES=0 | ||
| 281 | ; | ||
| 282 | ;LPTn IS BEING UNREDIRECTED. IF THE PRINTER EXISTS, THE ADDRESS WORD FOR | ||
| 283 | ;THAT DEVICE WILL NOT CONTAIN 0001H. IF IT DOES CONTAIN 0001H, IT MUST BE SET | ||
| 284 | ;TO 0000H SO BASIC WILL NOT ALLOW IT TO BE OPENED. SEE PROCEDURE MODEECHO | ||
| 285 | ;IN THIS MODULE, AND TECH REF PAGE A-2 (RS232 AND PRINTER BASE). | ||
| 286 | ; | ||
| 287 | SAL SI,1 ;SI=WORD n FOR LPTn | ||
| 288 | ; : : IF THE DUMMY PRINTER EXISTS | ||
| 289 | CMP ES:PRINTR-2+[SI],0001H ;DOES THE PRINTER EXIST? | ||
| 290 | JNE ENDIF07 ; IF SO, DON'T MESS WITH THE ADDRESS WORD | ||
| 291 | MOV ES:PRINTR-2+[SI],0000H ;IF NOT, ZERO THE ADDRESS WORD | ||
| 292 | ; : : ENDIF PRINTER EXISTS | ||
| 293 | ENDIF07: | ||
| 294 | SAR SI,1 ;RESTORE SI TO n OF LPTn | ||
| 295 | ; SO PROPER LPTn GETS REDIRECTED | ||
| 296 | ; | ||
| 297 | ;IF THE PRINTER EXISTS THE ADDRESS WORD IS NOW WHAT IT STARTED OUT AS | ||
| 298 | ;AT POWER UP INITIALIZATION TIME. IF THE PRINTER DOESN'T EXIST, THE ADDRESS | ||
| 299 | ;WORD IS NOW EQUAL TO 0000H. | ||
| 300 | ; | ||
| 301 | CALL ECHO ;GO INFORM THE RESIDENT CODE | ||
| 302 | ; | ||
| 303 | ENDIF05: | ||
| 304 | DISPLAY CRLF ;AN000;carriage return linefeed | ||
| 305 | DISPLAY NOTREMSG | ||
| 306 | ; : ENDIF IS REDIRECTION IN EFFECT | ||
| 307 | ; ENDIF IS n OF LPTn OK? | ||
| 308 | ENDIF06: | ||
| 309 | POP ES ;RESTORE SEG REG | ||
| 310 | ; | ||
| 311 | ;A RETURN CODE IS PASSED BACK TO THE CALLER, MODEPRIN. | ||
| 312 | ;AH=0 MEANS INVALID LPTn | ||
| 313 | ;AH not= 0 MEANS LPTn IS OK | ||
| 314 | ; | ||
| 315 | RET ;RETURN TO CALLER | ||
| 316 | MODEECNO ENDP | ||
| 317 | ;*************************************************************** | ||
| 318 | ECHO PROC NEAR | ||
| 319 | ;'MODEPTS' STARTS WITH THREE INSTRUCTIONS: | ||
| 320 | ; F6 C2 01 TEST DL,1 | ||
| 321 | ; 75 05 JNZ CK | ||
| 322 | ; EA ---- ---- JMP PRINTER_IO | ||
| 323 | ; CK: (REDIRECT TO COMm) | ||
| 324 | ;'PTSFLAG' HAS A FLAG BYTE SHOWING WHICH LPTn GETS REDIRECTED. | ||
| 325 | ;THIS CODE HERE IS TO MODIFY THE FIRST TWO INSTRUCTIONS AT 'MODEPTS' | ||
| 326 | ;SO REDIRECTED LPTn GOES TO 'CK:' AND OTHER LPTn GOES TO PRINTER_IO. | ||
| 327 | ; | ||
| 328 | PUSH DI | ||
| 329 | ;ES:=0 | ||
| 330 | LES DI,ES:RESSEG ;FETCH POINTER TO MODETO IN RESIDENT CODE | ||
| 331 | PUSH BX ;TO AVOID 'TYPE MISMATCH' I PUT THE OFFSET | ||
| 332 | PUSH CX ;NEED A HOLDER FOR FIXUP | ||
| 333 | MOV BX,NEW_PTSFLAG ; FROM MODETO INTO BX | ||
| 334 | MOV AL,BYTE PTR ES:[DI]+[BX] ;FIND WHICH LPTn GET REDIRECTED | ||
| 335 | MOV BX,DI ;PUT OFFSET OF MODETO INTO BX | ||
| 336 | POP DI | ||
| 337 | ADD BX,OFFPTS ;ADD OFFSET OF MODEPTS FROM MODETO, NOW | ||
| 338 | ; ES:BX POINTS TO MODEPTS | ||
| 339 | MOV CX,FIXUP ;HOLD FIXUP IN WORD FORM SO LINKER CAN FILL IN | ||
| 340 | CLI ;IF AN INTERRUPT OCCURS HERE THE JUMP WOULD | ||
| 341 | ; BE INCORRECT | ||
| 342 | MOV BYTE PTR ES:[BX]+4,CL ;SET JUMP TARGET (CK) TO +3BH | ||
| 343 | POP CX ;RETURN FIXUP'S WORD FORM HOLDER | ||
| 344 | MOV AH,0 ;CLEAR HIGH BYTE | ||
| 345 | SHL AL,1 ;COUNT WAS 0,1,2,3,...7 | ||
| 346 | ; COUNT IS NOW 0,2,4,6...14 | ||
| 347 | MOV SI,AX ;GET INDEX OF BR TABLE ENTRY | ||
| 348 | JMP CASE[SI] | ||
| 349 | ; | ||
| 350 | CASE EQU THIS WORD | ||
| 351 | DW P0 | ||
| 352 | DW P1 | ||
| 353 | DW P2 | ||
| 354 | DW P3 | ||
| 355 | DW P4 | ||
| 356 | DW P5 | ||
| 357 | DW P6 | ||
| 358 | DW P7 | ||
| 359 | ; | ||
| 360 | P0: | ||
| 361 | ; SINCE NO PRINTER IS TO BE REDIRECTED | ||
| 362 | MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NO-OP | ||
| 363 | ; TO CAUSE 'FALL THRU' TO JMP PRINTER_IO INSTR | ||
| 364 | JMP SHORT ENDC | ||
| 365 | P1: | ||
| 366 | ; REDIRECT LPT1 ONLY | ||
| 367 | MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ CK | ||
| 368 | JMP SHORT ENDC | ||
| 369 | ; | ||
| 370 | P2: | ||
| 371 | ; REDIRECT LPT2 ONLY | ||
| 372 | MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ CK | ||
| 373 | JMP SHORT ENDC | ||
| 374 | ; | ||
| 375 | P3: | ||
| 376 | ; REDIRECT LPT1 AND LPT2 ONLY | ||
| 377 | MOV WORD PTR ES:[BX]+2,7402H ; TEST 2 : JZ CK | ||
| 378 | JMP SHORT ENDC | ||
| 379 | ; | ||
| 380 | P4: | ||
| 381 | ; REDIRECT LPT3 ONLY | ||
| 382 | MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 :JNZ CK | ||
| 383 | JMP SHORT ENDC | ||
| 384 | ; | ||
| 385 | P5: | ||
| 386 | ; REDIRECT LPT1 AND LPT3 ONLY | ||
| 387 | MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ CK | ||
| 388 | JMP SHORT ENDC | ||
| 389 | ; | ||
| 390 | P6: | ||
| 391 | ; REDIRECT LPT2 AND LPT3 ONLY | ||
| 392 | MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ CK | ||
| 393 | JMP SHORT ENDC | ||
| 394 | ; | ||
| 395 | P7: | ||
| 396 | ; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3 | ||
| 397 | MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP CK | ||
| 398 | ENDC: | ||
| 399 | STI ;REENABLE INTERRUPTS | ||
| 400 | POP BX | ||
| 401 | RET | ||
| 402 | ECHO ENDP | ||
| 403 | |||
| 404 | |||
| 405 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 406 | ;³ | ||
| 407 | ;³ DISPLAY_PRINTER_REROUTE_STATUS | ||
| 408 | ;³ ------------------------------ | ||
| 409 | ;³ | ||
| 410 | ;³ Setup message for the reroute status of the specified printer. | ||
| 411 | ;³ | ||
| 412 | ;³ INPUT: BL - mask for ptsflag1 (1, 2 or 4) | ||
| 413 | ;³ REDPT - contains ASCII form of n OF LPTn in redirmsg "LPTn rerouted to COMm" | ||
| 414 | ;³ NOTREDPT - contains ASCII form of n of LPTn in message "LPTn not rerouted" | ||
| 415 | ;³ | ||
| 416 | ;³ | ||
| 417 | ;³ | ||
| 418 | ;³ RETURN: REDCOM - filled with ASCII form of m OF COMm in MESSAGE "LPTn rerouted to COMn"none | ||
| 419 | ;³ | ||
| 420 | ;³ | ||
| 421 | ;³ | ||
| 422 | ;³ MESSAGES: REDIRMSG if the printer is rerouted | ||
| 423 | ;³ NOTREMSG if the printer is not rerouted | ||
| 424 | ;³ | ||
| 425 | ;³ | ||
| 426 | ;³ REGISTER | ||
| 427 | ;³ USAGE: | ||
| 428 | ;³ | ||
| 429 | ;³ | ||
| 430 | ;³ | ||
| 431 | ;³ ASSUMPTIONS: input is valid | ||
| 432 | ;³ | ||
| 433 | ;³ | ||
| 434 | ;³ SIDE EFFECT: ES - lost | ||
| 435 | ;³ SI - lost | ||
| 436 | ;³ ;AN000; | ||
| 437 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000; | ||
| 438 | |||
| 439 | display_printer_reroute_status PROC NEAR | ||
| 440 | |||
| 441 | XOR CX,CX ;AN665; | ||
| 442 | MOV ES,CX ;set segment to zero ;AN665; | ||
| 443 | |||
| 444 | .IF <<ES:WORD PTR resseg> NE 0000H> AND ;IF the resident code is loaded AND | ||
| 445 | MOV ES,ES:WORD PTR resseg[2] ;AN665; | ||
| 446 | ;;XOR BX,BX | ||
| 447 | ;;MOV BL,printer_reroute_mask | ||
| 448 | TEST BL,ES:PTSFLAG1 ;see if the printer is rerouted | ||
| 449 | .IF NZ THEN ;the printer is rerouted | ||
| 450 | SHR BL,1 ;was 1, 2, or 4, now is 0, 1, or 2 | ||
| 451 | ;;;INC BL ;now is 1, 2, or 3 | ||
| 452 | ;;;ADD BL,resflag2 ;ES:BX=>the com byte for the desired printer | ||
| 453 | ADD BX,resflag2 ;ES:BX=>the com byte for the desired printer | ||
| 454 | .SELECT | ||
| 455 | |||
| 456 | .WHEN <<BYTE PTR ES:[BX]> EQ 0> | ||
| 457 | MOV redcom,"1" ;printer rerouted to COM1 | ||
| 458 | |||
| 459 | .WHEN <<BYTE PTR ES:[BX]> EQ 1> | ||
| 460 | MOV redcom,"2" ;printer rerouted to COM2 | ||
| 461 | |||
| 462 | .WHEN <<BYTE PTR ES:[BX]> EQ 2> | ||
| 463 | MOV redcom,"3" ;printer rerouted to COM3 | ||
| 464 | |||
| 465 | .WHEN <<BYTE PTR ES:[BX]> EQ 3> | ||
| 466 | MOV redcom,"4" ;printer rerouted to COM4 | ||
| 467 | |||
| 468 | .ENDSELECT | ||
| 469 | display redirmsg ;"LPTn rerouted to COMm" | ||
| 470 | .ELSE | ||
| 471 | display notremsg ;"LPTn not rerouted" | ||
| 472 | .ENDIF | ||
| 473 | |||
| 474 | |||
| 475 | |||
| 476 | |||
| 477 | RET | ||
| 478 | |||
| 479 | display_printer_reroute_status ENDP | ||
| 480 | |||
| 481 | PRINTF_CODE ENDS | ||
| 482 | END | ||
diff --git a/v4.0/src/CMD/MODE/MODELENG.ASM b/v4.0/src/CMD/MODE/MODELENG.ASM new file mode 100644 index 0000000..dfae017 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODELENG.ASM | |||
| @@ -0,0 +1,290 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODELENG.ASM - VARIOUS SERVICE ROUTINES | ||
| 3 | |||
| 4 | ;This module contains procedures: | ||
| 5 | ;MODELENG - convert 3 digit or less ASCII string to binary number | ||
| 6 | ;GET_MACHINE_TYPE - determine the machine type based on model byte and sub model byte | ||
| 7 | |||
| 8 | .XLIST | ||
| 9 | INCLUDE STRUC.INC | ||
| 10 | .LIST | ||
| 11 | ;.SALL | ||
| 12 | |||
| 13 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 14 | ;º º | ||
| 15 | |||
| 16 | ; AX001 - P4031: Was allowing rate and delay settings on ATs that did not have | ||
| 17 | ; the functionality in the BIOS. Have to check specifically for | ||
| 18 | ; a date of 11/15/85 or later. | ||
| 19 | |||
| 20 | ; AX002 - P4543: Add VAIL and SNOWMASS to legal choices for 19200 baud | ||
| 21 | |||
| 22 | ;º º | ||
| 23 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 24 | |||
| 25 | |||
| 26 | |||
| 27 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 28 | ;º º | ||
| 29 | |||
| 30 | PUBLIC get_machine_type | ||
| 31 | PUBLIC MODELENG | ||
| 32 | |||
| 33 | ;º º | ||
| 34 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 35 | |||
| 36 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 37 | ;º º | ||
| 38 | |||
| 39 | BREAK MACRO destination ;AN001; | ||
| 40 | |||
| 41 | JMP ENDCASE_&destination ;AN001; | ||
| 42 | |||
| 43 | ENDM ;AN001; | ||
| 44 | |||
| 45 | ;º º | ||
| 46 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 47 | |||
| 48 | |||
| 49 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 50 | ;º º | ||
| 51 | |||
| 52 | AT_or_XT286_or_PS2_50_or_PS2_60 EQU 0FCH ;AN000;primary model byte for all 286 based machines | ||
| 53 | BIOS_date EQU ES:[DI] ;used for accessing parts of the BIOS date ;AN001; | ||
| 54 | INTCONV EQU 48 ;CONVERT ASCII TO NUMERIC | ||
| 55 | model_byte_AH EQU AH | ||
| 56 | return_system_configuration EQU 0C0H ;INT 15H subfunction | ||
| 57 | system_descriptor_table EQU ES:[BX] | ||
| 58 | system_services EQU 15H ;ROM BIOS call | ||
| 59 | XT2 EQU 0FBH ;AN000;model byte for 2nd release of XT | ||
| 60 | |||
| 61 | INCLUDE modequat.inc | ||
| 62 | |||
| 63 | ;º º | ||
| 64 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 65 | |||
| 66 | |||
| 67 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 68 | ;º º | ||
| 69 | |||
| 70 | BIOS_date_struc STRUC ;in form mm/dd/yy ;AN001; | ||
| 71 | month DW ? ;AN001; | ||
| 72 | slash1 DB ? ;AN001; | ||
| 73 | day DW ? ;AN001; | ||
| 74 | slash2 DB ? ;AN001; | ||
| 75 | year DW ? ;AN001; | ||
| 76 | BIOS_date_struc ENDS ;AN001; | ||
| 77 | |||
| 78 | |||
| 79 | system_descriptor STRUC | ||
| 80 | length_of_descriptor DW bogus ;number of bytes in the descriptor table | ||
| 81 | primary_model_byte DB bogus | ||
| 82 | secondary_model_byte DB bogus | ||
| 83 | system_descriptor ENDS | ||
| 84 | |||
| 85 | ;º º | ||
| 86 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 87 | |||
| 88 | |||
| 89 | ROM SEGMENT AT 0F000H | ||
| 90 | |||
| 91 | ORG 0FFF5H ;location of date ROM BIOS for the release was written ;AN001; | ||
| 92 | date_location LABEL WORD ;AN001; | ||
| 93 | |||
| 94 | ORG 0FFFEH | ||
| 95 | model_byte LABEL BYTE | ||
| 96 | |||
| 97 | ROM ENDS | ||
| 98 | |||
| 99 | |||
| 100 | |||
| 101 | PRINTF_CODE SEGMENT PUBLIC | ||
| 102 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE | ||
| 103 | |||
| 104 | |||
| 105 | |||
| 106 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 107 | ;º º | ||
| 108 | |||
| 109 | HUNDRED DB 100 | ||
| 110 | TEN DB 10 | ||
| 111 | |||
| 112 | |||
| 113 | ;º º | ||
| 114 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 115 | |||
| 116 | |||
| 117 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 118 | ;º º | ||
| 119 | |||
| 120 | EXTRN machine_type:BYTE ;see 'rescode.sal' | ||
| 121 | EXTRN submodel_byte:BYTE ;see 'rescode.sal' | ||
| 122 | |||
| 123 | ;º º | ||
| 124 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 125 | |||
| 126 | |||
| 127 | MODELENG PROC NEAR | ||
| 128 | ; | ||
| 129 | ;INPUT:BP HAS ADDR OF PARM FIELD IN DATA SPACE (DS:) | ||
| 130 | ; | ||
| 131 | MOV BL,0 ;INIT BL TO 0 | ||
| 132 | ; IF THIS PARAMETER IS A THREE DIGIT NUMBER, | ||
| 133 | CMP BYTE PTR DS:[BP]+2,0 ;LOOK AT THIRD DIGIT | ||
| 134 | JE ENDIF01 | ||
| 135 | CMP BYTE PTR DS:[BP]+2,20H ;see if third char is a blank | ||
| 136 | JE ENDIF01 ;IF there is a third digit THEN | ||
| 137 | ; | ||
| 138 | MOV AL,DS:[BP] ;GET FIRST DIGIT | ||
| 139 | SUB AL,INTCONV ;CONVERT TO INT | ||
| 140 | MUL HUNDRED ;HUNDREDTHS PLACE | ||
| 141 | ADD BL,AL ;ADD TO BL | ||
| 142 | INC BP ;BUMP TO NEXT DIGIT | ||
| 143 | ENDIF01: ;ENDIF THIS PARAMETER IS A THREE DIGIT NUMBER | ||
| 144 | MOV AL,DS:[BP] ;GET NEXT DIGIT | ||
| 145 | SUB AL,INTCONV ;CONVERT TO INT | ||
| 146 | JNC ENDIF02 | ||
| 147 | MOV BL,0FFH ;encountered an error so put a bogus number in the sum | ||
| 148 | ENDIF02: | ||
| 149 | MUL TEN ;TENS PLACE | ||
| 150 | ADD BL,AL ;ADD TO BL | ||
| 151 | INC BP ;GO TO NEXT DIGIT | ||
| 152 | MOV AL,DS:[BP] ;GET NEXT DIGIT | ||
| 153 | SUB AL,INTCONV ;CONVERT TO INT | ||
| 154 | ADD BL,AL ;ADD TO BL | ||
| 155 | RET | ||
| 156 | MODELENG ENDP | ||
| 157 | |||
| 158 | |||
| 159 | ascii_to_int PROC NEAR ;input: AX=2 digit ascii number ;AN001; | ||
| 160 | ;output: BL has binary value ;AN001; | ||
| 161 | ;assume: no overflow or underflow ;AN001; | ||
| 162 | |||
| 163 | PUSH AX ;the MUL destroys AH ;AN001; | ||
| 164 | SUB AL,INTCONV ;CONVERT high order digit to binary ;AN001; | ||
| 165 | MUL TEN ;TENS PLACE ;AN001; | ||
| 166 | MOV BL,AL ;ADD TO BL ;AN001; | ||
| 167 | POP AX ;AN001; | ||
| 168 | MOV AL,AH ;AL=low order digit ;AN001; | ||
| 169 | SUB AL,INTCONV ;CONVERT TO binary ;AN001; | ||
| 170 | ADD BL,AL ;ADD TO BL ;AN001; | ||
| 171 | RET ;AN001; | ||
| 172 | |||
| 173 | ascii_to_int ENDP ;AN001; | ||
| 174 | |||
| 175 | |||
| 176 | ;------------------------------------------------------------------------------ | ||
| 177 | |||
| 178 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 179 | ;³ | ||
| 180 | ;³ GET_MACHINE_TYPE | ||
| 181 | ;³ ---------------- | ||
| 182 | ;³ | ||
| 183 | ;³ Get the machine type and store for future reference. | ||
| 184 | ;³ | ||
| 185 | ;³ | ||
| 186 | ;³ INPUT: none | ||
| 187 | ;³ | ||
| 188 | ;³ | ||
| 189 | ;³ RETURN: A scalar value indicating the type of machine is stored in | ||
| 190 | ;³ 'machine_type'. | ||
| 191 | ;³ | ||
| 192 | ;³ | ||
| 193 | ;³ MESSAGES: none | ||
| 194 | ;³ | ||
| 195 | ;³ | ||
| 196 | ;³ | ||
| 197 | ;³ REGISTER | ||
| 198 | ;³ USAGE AND | ||
| 199 | ;³ COMVENTIONS: AX - general usage | ||
| 200 | ;³ BX - used to address the system descriptor table | ||
| 201 | ;³ | ||
| 202 | ;³ | ||
| 203 | ;³ | ||
| 204 | ;³ | ||
| 205 | ;³ | ||
| 206 | ;³ ASSUMPTIONS: DS has segment of MODE's data area | ||
| 207 | ;³ | ||
| 208 | ;³ | ||
| 209 | ;³ SIDE EFFECT: ES is changed. | ||
| 210 | ;³ | ||
| 211 | ;³ | ||
| 212 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 213 | |||
| 214 | |||
| 215 | get_machine_type PROC NEAR | ||
| 216 | |||
| 217 | |||
| 218 | |||
| 219 | PUSH ES | ||
| 220 | PUSH BX ;will be used to point to 'system descriptor table' | ||
| 221 | MOV AH,return_system_configuration | ||
| 222 | INT 15H | ||
| 223 | .IF NC ;IF the call was handled successfully | ||
| 224 | MOV AH,system_descriptor_table.secondary_model_byte | ||
| 225 | MOV submodel_byte,AH ;save submodel byte | ||
| 226 | MOV AH,system_descriptor_table.primary_model_byte | ||
| 227 | .ELSE | ||
| 228 | MOV AX,ROM ;get addressability to the model byte | ||
| 229 | MOV ES,AX | ||
| 230 | MOV AH,ES:model_byte | ||
| 231 | .ENDIF | ||
| 232 | |||
| 233 | .IF <model_byte_AH EQ AT_or_XT286_or_PS2_50_or_PS2_60> THEN ;AN000;may have a submodel byte, check it | ||
| 234 | |||
| 235 | .IF <submodel_byte EQ PS2Model60> THEN ;AN000; | ||
| 236 | MOV AH,PS2Model60 ;AN000; | ||
| 237 | .ELSEIF <submodel_byte EQ VAIL> OR ;AN000; | ||
| 238 | .IF <submodel_byte EQ PS2Model50> THEN ;AN000; | ||
| 239 | MOV AH,PS2Model50 ;AN000; | ||
| 240 | .ELSEIF <submodel_byte EQ XT286> THEN ;AN000; | ||
| 241 | MOV AH,XT286 ;AN000; | ||
| 242 | .ELSEIF <submodel_byte EQ AT3> THEN ;AN000; | ||
| 243 | MOV DI,OFFSET date_location ;ES:DI=>BIOS date (BIOS_date EQU ES:[DI]) ;AN001; | ||
| 244 | |||
| 245 | ; CASE BIOS_date= ;AN001; | ||
| 246 | |||
| 247 | ; later than 1985: ;AN001; | ||
| 248 | |||
| 249 | MOV AX,BIOS_date.year ;AX=ASCII form of BIOS date year ;AN001; | ||
| 250 | CALL ascii_to_int ;BL=binary form of BIOS date year ;AN001; | ||
| 251 | .IF <BL GT 85> THEN ;IF AT built in 86 or later ;AN001; | ||
| 252 | |||
| 253 | MOV AH,AT4 ;AN001; | ||
| 254 | BREAK 0 ;AN001; | ||
| 255 | |||
| 256 | .ENDIF ;AN001; | ||
| 257 | |||
| 258 | ; 1985, on 11/15: ;BL already has year from above check ;AN001; | ||
| 259 | |||
| 260 | .IF <BL EQ 85> AND ;AN001; | ||
| 261 | .IF <BIOS_date.month EQ "11"> AND ;AN001; | ||
| 262 | .IF <BIOS_date.day EQ "51"> THEN ;"51" is the word form of "15" ;AN001; | ||
| 263 | |||
| 264 | MOV AH,AT4 ;AN001; | ||
| 265 | BREAK 0 ;AN001; | ||
| 266 | |||
| 267 | .ENDIF ;AN001; | ||
| 268 | |||
| 269 | ; otherwise: ;internal release of third version of AT ;AN001; | ||
| 270 | |||
| 271 | MOV AH,AT3 ;AN001; | ||
| 272 | |||
| 273 | |||
| 274 | ENDCASE_0: ;AN001; | ||
| 275 | |||
| 276 | .ELSEIF <submodel_byte EQ AT2> THEN ;AN000; | ||
| 277 | MOV AH,AT2 ;AN000; | ||
| 278 | .ENDIF ;AN000;IF none of the above AH has correct value for AT1 (FC) | ||
| 279 | .ELSEIF <model_byte_AH EQ XT2> THEN ;AN000; | ||
| 280 | MOV AH,PCXT ;AN000;no difference from XT1 | ||
| 281 | .ENDIF ;AN000; | ||
| 282 | |||
| 283 | MOV DS:machine_type,AH ;AH was set as result of getting the system configuration or during the IF. | ||
| 284 | POP BX | ||
| 285 | POP ES | ||
| 286 | |||
| 287 | RET ;RETURN TO MODE MAIN ROUTINE | ||
| 288 | get_machine_type ENDP | ||
| 289 | PRINTF_CODE ENDS | ||
| 290 | END | ||
diff --git a/v4.0/src/CMD/MODE/MODEMES.ASM b/v4.0/src/CMD/MODE/MODEMES.ASM new file mode 100644 index 0000000..43e55a4 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEMES.ASM | |||
| @@ -0,0 +1,145 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODEMES - MESSAGES DISPLAYED ON CONSOLE BY MODE | ||
| 3 | |||
| 4 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 5 | ;º º | ||
| 6 | |||
| 7 | ; AC001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 8 | ; implement the SYSGETMSG method of getting addressability to | ||
| 9 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 10 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 11 | ; address is then put in the sublist block for the message | ||
| 12 | ; being issued. | ||
| 13 | |||
| 14 | ;º º | ||
| 15 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 16 | |||
| 17 | PRINTF_CODE SEGMENT PUBLIC | ||
| 18 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE | ||
| 19 | ; | ||
| 20 | CR EQU 13 ;CARRIAGE RETURN | ||
| 21 | LF EQU 10 ;LINE FEED | ||
| 22 | BEEP EQU 7 ;AUDIBLE TONE | ||
| 23 | EOM EQU 0 ;NULL TERMINATOR, REQUIRED BY PRINTF | ||
| 24 | |||
| 25 | IF1 | ||
| 26 | %OUT including MODESUBS.INC | ||
| 27 | %OUT including MODEDEFS.INC | ||
| 28 | ENDIF | ||
| 29 | INCLUDE MODESUBS.INC | ||
| 30 | INCLUDE MODEDEFS.INC | ||
| 31 | |||
| 32 | ; | ||
| 33 | PUBLIC first_sublist | ||
| 34 | PUBLIC number_of_sublists | ||
| 35 | |||
| 36 | PUBLIC MOVED_MSG, ERR1, ERR2, PT80, PT80N, PT132, PT132N | ||
| 37 | PUBLIC PTLINES, RATEMSG, INITMSG, REDIRMSG, SHIFT_MSG, sublist_shift_msg | ||
| 38 | PUBLIC NOTREMSG, RETPARTO, sublist_retparto, CANT_SHIFT, sublist_cant_shift | ||
| 39 | PUBLIC NUMBERS, ;AC001;INF_OR_NO_ptr | ||
| 40 | PUBLIC Invalid_number_of_parameters, COM1_or_COM2, net_error | ||
| 41 | PUBLIC Invalid_parameter, not_supported, offending_parameter | ||
| 42 | PUBLIC offending_parameter_ptr | ||
| 43 | PUBLIC INITMSG, device,pbaud,pparity,pdata,pstop,pparm,pbaud,baud_19200 | ||
| 44 | PUBLIC pstop_ptr | ||
| 45 | PUBLIC pparity_ptr | ||
| 46 | PUBLIC CPMSG1 | ||
| 47 | PUBLIC CPMSG2,CPMSGLST2DEV | ||
| 48 | PUBLIC CPMSG3 | ||
| 49 | PUBLIC CPMSG4 | ||
| 50 | PUBLIC CPMSG5 | ||
| 51 | PUBLIC CPMSG6,CPMSGLST6CP,CPMSGLST6DEV | ||
| 52 | PUBLIC CPMSG7,CPMSGLST7DEV | ||
| 53 | ;AC001; PUBLIC CPMSGLST8HD | ||
| 54 | PUBLIC sublist_cpmsg8 | ||
| 55 | PUBLIC CPMSG8 | ||
| 56 | PUBLIC CPMSG8_HW | ||
| 57 | ;AC001; PUBLIC CPMSG8_PR | ||
| 58 | PUBLIC CPMSG9,CPMSGLST9CP | ||
| 59 | PUBLIC CPMSG10 | ||
| 60 | PUBLIC sublist_cpmsg10 | ||
| 61 | ;AC001; PUBLIC CPMSGLST10FUN | ||
| 62 | ;AC001; PUBLIC CPMSG10_QUERY | ||
| 63 | ;AC001; PUBLIC CPMSG10_DES | ||
| 64 | ;AC001; PUBLIC CPMSG10_REFRESH | ||
| 65 | ;AC001; PUBLIC CPMSG10_SELECT | ||
| 66 | ;AC001; PUBLIC CPMSG10_GLOBAL | ||
| 67 | PUBLIC CPMSG12 | ||
| 68 | PUBLIC CPMSG13 | ||
| 69 | PUBLIC CPMSGLST13CP | ||
| 70 | PUBLIC CPMSGLST13TYP | ||
| 71 | ;AC001; PUBLIC CPMSG13_ACT | ||
| 72 | ;AC001; PUBLIC CPMSG13_SYS | ||
| 73 | PUBLIC CPMSG14 | ||
| 74 | PUBLIC CPMSG15 | ||
| 75 | PUBLIC CPMSG16 | ||
| 76 | PUBLIC CPMSG17 | ||
| 77 | PUBLIC sublist_CPMSG17 | ||
| 78 | ;AC001; PUBLIC CPMSGLST17FUN | ||
| 79 | ;AC001; PUBLIC CPMSG17_QUERY | ||
| 80 | ;AC001; PUBLIC CPMSG17_PREP | ||
| 81 | ;AC001; PUBLIC CPMSG17_REFRESH | ||
| 82 | ;AC001; PUBLIC CPMSG17_ACT | ||
| 83 | ;AC001; PUBLIC CPMSG17_WRIT | ||
| 84 | PUBLIC CPMSG18 | ||
| 85 | PUBLIC CPMSG19 | ||
| 86 | PUBLIC CPMSG20 | ||
| 87 | PUBLIC CPMSG21 | ||
| 88 | PUBLIC dev_name_size ;used by invoke for msg srv | ||
| 89 | PUBLIC stat_dev_ptr ;used by invoke for msg srv | ||
| 90 | PUBLIC long_underline ;used by invoke for msg srv | ||
| 91 | PUBLIC five_char_underline ;used by invoke for msg srv | ||
| 92 | PUBLIC four_char_underline ;used by invoke for msg srv | ||
| 93 | PUBLIC row_ptr | ||
| 94 | PUBLIC status_for_device | ||
| 95 | PUBLIC notredpt | ||
| 96 | ;AC001; PUBLIC noretry | ||
| 97 | ;AC001; PUBLIC LEFT | ||
| 98 | ;AC001; PUBLIC RIGHT | ||
| 99 | PUBLIC row_type | ||
| 100 | PUBLIC lines_equal_msg ;used by analyze_and_invoke, "LINES=%1" definition | ||
| 101 | PUBLIC redcom | ||
| 102 | ;AC001; PUBLIC rightmost | ||
| 103 | ;AC001; PUBLIC leftmost | ||
| 104 | ;AC001; PUBLIC infinite | ||
| 105 | PUBLIC REDPT | ||
| 106 | PUBLIC PBAUD_PTR | ||
| 107 | ; PUBLIC BLINK_type | ||
| 108 | PUBLIC COLUMNS_ptr | ||
| 109 | PUBLIC COLUMNS_equal_msg | ||
| 110 | PUBLIC columns_type | ||
| 111 | PUBLIC delay_type | ||
| 112 | PUBLIC delay_ptr | ||
| 113 | PUBLIC rate_ptr | ||
| 114 | PUBLIC rate_type | ||
| 115 | PUBLIC function_not_supported | ||
| 116 | PUBLIC Required_font_not_loaded | ||
| 117 | PUBLIC ANSI_not_loaded | ||
| 118 | PUBLIC Baud_rate_required | ||
| 119 | PUBLIC RETRY_type_ptr | ||
| 120 | PUBLIC RETRY_equal | ||
| 121 | PUBLIC Baud_rate_required | ||
| 122 | PUBLIC not_supported_ptr | ||
| 123 | PUBLIC Illegal_device_ptr | ||
| 124 | PUBLIC syntax_error | ||
| 125 | PUBLIC syntax_error_ptr | ||
| 126 | PUBLIC rate_and_delay_together | ||
| 127 | PUBLIC CRLF | ||
| 128 | PUBLIC Invalid_switch | ||
| 129 | PUBLIC rightmost | ||
| 130 | PUBLIC leftmost | ||
| 131 | PUBLIC noretry | ||
| 132 | PUBLIC infinite | ||
| 133 | PUBLIC left | ||
| 134 | PUBLIC right | ||
| 135 | PUBLIC cpmsg8_pr | ||
| 136 | PUBLIC cpmsgxx_query | ||
| 137 | PUBLIC cpmsgxx_prep | ||
| 138 | PUBLIC cpmsgxx_select | ||
| 139 | PUBLIC cpmsgxx_refresh | ||
| 140 | PUBLIC cpmsg17_writ | ||
| 141 | PUBLIC cpmsg13_act | ||
| 142 | PUBLIC cpmsg13_sys | ||
| 143 | |||
| 144 | PRINTF_CODE ENDS | ||
| 145 | END | ||
diff --git a/v4.0/src/CMD/MODE/MODEPARS.ASM b/v4.0/src/CMD/MODE/MODEPARS.ASM new file mode 100644 index 0000000..afe1446 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEPARS.ASM | |||
| @@ -0,0 +1,4625 @@ | |||
| 1 | |||
| 2 | PAGE ,132 ; | ||
| 3 | TITLE MODE COMMAND - COMMAND PARSING | ||
| 4 | .XLIST ;AN000; | ||
| 5 | INCLUDE STRUC.INC ;AN000; | ||
| 6 | .LIST ;AN000; | ||
| 7 | ;.SALL ;AN000; | ||
| 8 | |||
| 9 | |||
| 10 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 11 | ;º º | ||
| 12 | |||
| 13 | ; AC001 - P3259: When "/STATUS" was only parameter was returning "Invalid | ||
| 14 | ; number of parameters". When "/STATUS" was first parameter | ||
| 15 | ; the device name was not being recognized. | ||
| 16 | |||
| 17 | ; AC002 - P3258, PS/2 only COM parameters were being allowed on non-PS/2 | ||
| 18 | ; P3540: machines. Added checks for baud=19200, parity=mark or space, | ||
| 19 | ; data=5 or 6, stop=1.5 for both keyword and positional forms. | ||
| 20 | |||
| 21 | ; AC003 - P3451: Wasn't treating semicolons as a valid blank-like delimeter. | ||
| 22 | |||
| 23 | |||
| 24 | ; AC004 - P3456: /STAT wasn't included in all checks for valid forms of /STATUS. | ||
| 25 | ; "BW" and "CO" were being accepted as valid parms. | ||
| 26 | |||
| 27 | ; AC005 - P3796: PRN /STA returned "Invalid parameter -" when worked OK for | ||
| 28 | ; LPT1. | ||
| 29 | |||
| 30 | ; AC006 - P3932: Was issuing "Invalid parameter - ???" for switches that are | ||
| 31 | ; not valid, now issue "Invalid switch - ???". | ||
| 32 | |||
| 33 | ; AC007 - P3931: "CON SEL=850" acts like a status request, should return | ||
| 34 | ; "Invalid number of parameters" because user forgot "CP". | ||
| 35 | |||
| 36 | ; AX008 - P5183: Was denying 19200 baud on PS/2 model 30s and 25s and VAILs. | ||
| 37 | |||
| 38 | ;º º | ||
| 39 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 40 | |||
| 41 | |||
| 42 | |||
| 43 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 44 | ;º º | ||
| 45 | |||
| 46 | |||
| 47 | BREAK MACRO X ;AN000; | ||
| 48 | JMP endcase_&X ;AN000; | ||
| 49 | ENDM ;AN000; | ||
| 50 | |||
| 51 | ;------------------------------------------------------------------------------- | ||
| 52 | |||
| 53 | DISPLAY MACRO MESSAGE ;AN000; | ||
| 54 | MOV DX,MESSAGE ;AN000; | ||
| 55 | CALL PRINTF ;AN000; | ||
| 56 | ENDM | ||
| 57 | |||
| 58 | ;------------------------------------------------------------------------------- | ||
| 59 | |||
| 60 | check_for_lpt_keyword MACRO ;AN000; | ||
| 61 | |||
| 62 | MOV DL,number_of_lpt_keywords ;;AN000;Initialize | ||
| 63 | MOV number_of_keywords,DL ;;AN000; for call to check_for_keyword | ||
| 64 | MOV BP,OFFSET start_lpt_keyword_ptrs ;;AN000;start_of_keyword_ptrs=[BP] | ||
| 65 | CALL check_for_keyword ;AN000; | ||
| 66 | |||
| 67 | ENDM ;AN000; | ||
| 68 | |||
| 69 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 70 | ;³ | ||
| 71 | ;³ DELETE_PARSER_VALUE_LIST_ENTRY | ||
| 72 | ;³ ------------------------------- | ||
| 73 | ;³ | ||
| 74 | ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm | ||
| 75 | ;³ become apparent and the parser control blocks need to be changed to correctly | ||
| 76 | ;³ parse the next parm. This MACRO is the interface to the approptiate routine which | ||
| 77 | ;³ modifies the list of strings or keywords in the VALUES block. | ||
| 78 | ;³ | ||
| 79 | ;³ | ||
| 80 | ;³ | ||
| 81 | ;³ | ||
| 82 | ;³ | ||
| 83 | ;³ INPUT: item_type - scalar indicating that a string or keyword is to be deleted | ||
| 84 | ;³ | ||
| 85 | ;³ item - A scalar immediate that indicates the string or keyword to | ||
| 86 | ;³ be "deleted" | ||
| 87 | ;³ | ||
| 88 | ;³ | ||
| 89 | ;³ RETURN: none | ||
| 90 | ;³ | ||
| 91 | ;³ | ||
| 92 | ;³ MESSAGES: none | ||
| 93 | ;³ | ||
| 94 | ;³ | ||
| 95 | ;³ | ||
| 96 | ;³ | ||
| 97 | ;³ REGISTER | ||
| 98 | ;³ USAGE: "item" is put into BX. | ||
| 99 | ;³ | ||
| 100 | ;³ | ||
| 101 | ;³ | ||
| 102 | ;³ CONVENTIONS: | ||
| 103 | ;³ | ||
| 104 | ;³ | ||
| 105 | ;³ | ||
| 106 | ;³ ASSUMPTIONS: All the input are valid. | ||
| 107 | ;³ | ||
| 108 | ;³ | ||
| 109 | ;³ | ||
| 110 | ;³ | ||
| 111 | ;³ | ||
| 112 | ;³ | ||
| 113 | ;³ | ||
| 114 | ;³ | ||
| 115 | ;³ | ||
| 116 | ;³ | ||
| 117 | ;³ SIDE EFFECT: | ||
| 118 | ;³ | ||
| 119 | ;³ | ||
| 120 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 121 | |||
| 122 | delete_parser_value_list_entry MACRO item_type,item ;AN000; | ||
| 123 | |||
| 124 | ;MOV BX,item ;AN000; | ||
| 125 | CALL item_type ;AN000; | ||
| 126 | |||
| 127 | ENDM ;AN000; | ||
| 128 | |||
| 129 | |||
| 130 | ;------------------------------------------------------------------------------- | ||
| 131 | |||
| 132 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 133 | ;³ | ||
| 134 | ;³ MODIFY_PARSER_CONTROL_BLOCK | ||
| 135 | ;³ --------------------------- | ||
| 136 | ;³ | ||
| 137 | ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm | ||
| 138 | ;³ become apparent and the parser control blocks need to be changed to correctly | ||
| 139 | ;³ parse the next parm. This MACRO is the interface to the routines that modify | ||
| 140 | ;³ those control blocks. | ||
| 141 | ;³ | ||
| 142 | ;³ | ||
| 143 | ;³ | ||
| 144 | ;³ | ||
| 145 | ;³ | ||
| 146 | ;³ INPUT: control_structure - A scalar immediate indicating the control block | ||
| 147 | ;³ to be modified, and the routine to call. | ||
| 148 | ;³ | ||
| 149 | ;³ action - A scalar immediate that indicates the nature | ||
| 150 | ;³ of the modification to be made. | ||
| 151 | ;³ | ||
| 152 | ;³ item - A scalar immediate that indicates the string, number, | ||
| 153 | ;³ keywords, switch, or match flags mask involved. | ||
| 154 | ;³ | ||
| 155 | ;³ RETURN: none | ||
| 156 | ;³ | ||
| 157 | ;³ | ||
| 158 | ;³ MESSAGES: none | ||
| 159 | ;³ | ||
| 160 | ;³ | ||
| 161 | ;³ | ||
| 162 | ;³ | ||
| 163 | ;³ REGISTER | ||
| 164 | ;³ USAGE: The scalar value for the modifier will be put in a register | ||
| 165 | ;³ for passing to the routine that actually does the work. | ||
| 166 | ;³ | ||
| 167 | ;³ | ||
| 168 | ;³ CONVENTIONS: | ||
| 169 | ;³ | ||
| 170 | ;³ | ||
| 171 | ;³ | ||
| 172 | ;³ ASSUMPTIONS: All the input are valid. | ||
| 173 | ;³ | ||
| 174 | ;³ | ||
| 175 | ;³ SIDE EFFECT: | ||
| 176 | ;³ | ||
| 177 | ;³ | ||
| 178 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 179 | |||
| 180 | modify_parser_control_block MACRO control_structure,action,item ;AN000; | ||
| 181 | |||
| 182 | PUSH BX ;AN000; | ||
| 183 | |||
| 184 | MOV BX,action ;AN000; | ||
| 185 | MOV AL,item ;AN000; | ||
| 186 | CALL control_structure ;AN000; | ||
| 187 | |||
| 188 | POP BX ;AN000; | ||
| 189 | |||
| 190 | ENDM ;AN000; | ||
| 191 | |||
| 192 | ;------------------------------------------------------------------------------- | ||
| 193 | |||
| 194 | |||
| 195 | ;º º | ||
| 196 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 197 | |||
| 198 | |||
| 199 | |||
| 200 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 201 | ;º º | ||
| 202 | |||
| 203 | |||
| 204 | INCLUDE modequat.inc | ||
| 205 | |||
| 206 | |||
| 207 | addd EQU 0 ;;AN000;used for "seperator_list" | ||
| 208 | binary_to_ASCII EQU 30H ;AN000;used to convert bytes from binary to ASCII | ||
| 209 | blank EQU " ";;AN000;used for "seperator_list" | ||
| 210 | both EQU 2 ;AN000;value of rate_and_delay_found when both have been found | ||
| 211 | comma EQU "," ;AN000;used to tell the difference between a blank delimeter and missing parm, see LPTX,: | ||
| 212 | current_parm EQU 0 ;;AN000;scalar for parser control block modifing routine "keywords" | ||
| 213 | current_parm_DI EQU DI ;;AN000;index for parm_list array | ||
| 214 | delete EQU 1 ;AN000;;used for "seperator_list" | ||
| 215 | deleted EQU 0 ;AN000;;used to make keywords unmatchable and strings of length zero | ||
| 216 | end_of_line_char_0D EQU 0DH ;AN000;put at end of the command line by the loader | ||
| 217 | end_of_line_char_00 EQU 00H ;AN000;put at end of the complex parm by the parser | ||
| 218 | i_CL EQU CL ;;AN000;loop index | ||
| 219 | include_string_list EQU 3 ;;AN000;number of value definitions so strings are included | ||
| 220 | include_number_list EQU 2 ;;AN000;See "nrng" in description of "values" block input for generalized parser | ||
| 221 | keyword EQU 58H ;;AN000;indicator parms are in keyword form vs positional, value for parms_form | ||
| 222 | first_com_keyword EQU SI ;;AN000;holder for "first_com_keyword_ptr" | ||
| 223 | last_com_keyword EQU SI ;;AN000;holder for "last_com_keyword_ptr" | ||
| 224 | first_LPT_keyword EQU SI ;;AN000;holder for "first_LPT_keyword_ptr" | ||
| 225 | last_LPT_keyword EQU SI ;;AN000;holder for "last_LPT_keyword_ptr" | ||
| 226 | first_CON_keyword EQU SI ;;AN000;holder for "first_con_keyword_ptr" | ||
| 227 | last_CON_keyword EQU SI ;;AN000;holder for "last_con_keyword_ptr" | ||
| 228 | max_parms EQU 16 ;;AN000;con cp prep=((1,2,3,4,5,6,7,8,9,10,11,12) filespec.cpi) | ||
| 229 | min_codepage_value EQU 0 ;AN000; | ||
| 230 | max_codepage_value EQU 999 ;;AN000;three digits | ||
| 231 | max_number_of_codepages EQU 12 ;AN000;assure that user does not specify too many code page numbers | ||
| 232 | min_number_of_codepages EQU 1 ;AN000; | ||
| 233 | min_old_com_pos_parms EQU 0 ;AN000;could have nothing else meaning status request | ||
| 234 | max_old_com_pos_parms EQU 5 ;AN000; ;baud, parity, data bits, stop bits, P | ||
| 235 | max_switches EQU 1 ;AN000;;only switch is /status | ||
| 236 | no_message EQU 0 ;AN000;indicate to message handler interface that no message to issue | ||
| 237 | none_found EQU 0 ;AN000;;if keyword_switch_ptr is returned as zero then parser did not encounter a keyword or switch | ||
| 238 | not_in_switch_list EQU 3 ;AC006; | ||
| 239 | number_of_printer_status_qualifiers EQU 4 ;;AN000;codepage, prepare, select, RETRY | ||
| 240 | parm_list EQU [BX] ;AN000; | ||
| 241 | parms_BX EQU [BX] ;AN000; | ||
| 242 | parser_return_code_AX EQU AX ;AN000; | ||
| 243 | PS2 EQU 44H ;AC002;flag for "type_of_machine" | ||
| 244 | result_BP EQU [BP] ;AN000; | ||
| 245 | range_item_tag EQU 55H ;AN000;;marker for checks in memory, otherwise just a holder | ||
| 246 | ranges_only EQU 1 ;;AN000;See "nrng" in description of "values" block input for generalized parser | ||
| 247 | start_of_keyword_ptrs EQU [BP] ;AN000;;used for indexing the list of offsets in check_for_keyword | ||
| 248 | tab EQU 09 ;AC006; | ||
| 249 | unspecified EQU 0FFH ;AN000;item tag of parm not specified: skipped optional positional parm | ||
| 250 | |||
| 251 | |||
| 252 | ;possible values for "parm_type", the type of parm returned by parser | ||
| 253 | |||
| 254 | complx EQU 4 ;AN000; | ||
| 255 | number EQU 1 ;AN000; | ||
| 256 | string EQU 3 ;AN000; | ||
| 257 | |||
| 258 | ;possible values for "return_code_AX" | ||
| 259 | |||
| 260 | no_error EQU 0 ;AN000;;not the same as "noerror" | ||
| 261 | operand_missing EQU 2 ;AN000; | ||
| 262 | syntax_error_rc EQU 9 ;AN000; | ||
| 263 | end_of_command_line EQU -1 ;AN000; | ||
| 264 | end_of_complex EQU -1 ;AN000;found 0 that parser wrote over closing ")" of complex | ||
| 265 | |||
| 266 | |||
| 267 | |||
| 268 | ;possible values of "device_type" | ||
| 269 | |||
| 270 | COMX EQU 09CH ;AN000; | ||
| 271 | ;CON EQU 0 ;AN000; | ||
| 272 | LPTX EQU 09BH ;AN000; | ||
| 273 | ;LPT1 EQU 0 ;AN000; | ||
| 274 | |||
| 275 | |||
| 276 | ;possible values of "request_type" | ||
| 277 | |||
| 278 | max_request_type EQU 09AH ;AN000;;must be same as following value | ||
| 279 | all_con_status EQU 09AH ;AN000; | ||
| 280 | codepage_prepare EQU 099H ;AN000; | ||
| 281 | codepage_refresh EQU 098H ;AN000; | ||
| 282 | codepage_select EQU 097H ;AN000; | ||
| 283 | codepage_status EQU 096H ;AN000; | ||
| 284 | codepage_prepared_status EQU 095H ;AN000; | ||
| 285 | codepage_selected_status EQU 094H ;AN000; | ||
| 286 | com_status EQU 093H ;AN000; | ||
| 287 | initialize_com_port EQU 092H ;AN000; | ||
| 288 | initialize_printer_port EQU 091H ;AN000; | ||
| 289 | old_initialize_printer_port EQU 090H ;AN000;;found traditional syntax | ||
| 290 | old_video_mode_set EQU 08FH ;AN000;;found traditional syntax | ||
| 291 | printer_reroute EQU 08EH ;AN000; | ||
| 292 | printer_status EQU 08DH ;AN000; | ||
| 293 | set_con_features EQU 08CH ;AN000; | ||
| 294 | status_for_everything EQU 08BH ;AN000; | ||
| 295 | turn_off_reroute EQU 08AH ;AN000; | ||
| 296 | last_request_type EQU 08AH ;AN000;;must be same as previous value | ||
| 297 | |||
| 298 | |||
| 299 | ;possible codepage requests, used by modecp | ||
| 300 | |||
| 301 | select EQU 086H ;AN000; | ||
| 302 | prepare EQU 085H ;AN000; | ||
| 303 | refresh EQU 084H ;AN000; | ||
| 304 | ;status ;AN000;;see request_type possibilities | ||
| 305 | |||
| 306 | |||
| 307 | |||
| 308 | ;possible values of "looking_for" | ||
| 309 | |||
| 310 | |||
| 311 | codepage EQU 6FH ;AN000; | ||
| 312 | codepage_prms EQU 6EH ;AN000; | ||
| 313 | com_keyword EQU 6DH ;AN000; | ||
| 314 | com_keyword_or_baud EQU 6CH ;AN000; | ||
| 315 | CON_keyword EQU 6BH ;AN000; | ||
| 316 | con_kwrd_status_or_cp EQU 6AH ;AN000; | ||
| 317 | databits_or_null EQU 69H ;AN000; | ||
| 318 | device_name_or_eol EQU 68H ;AN000; | ||
| 319 | eol EQU 67H ;;AN000;end of line | ||
| 320 | first_parm EQU 66H ;AN000; | ||
| 321 | li_or_null EQU 65H ;AN000; | ||
| 322 | P EQU 64H ;AN000; | ||
| 323 | parity_or_null EQU 63H ;AN000; | ||
| 324 | prn_kw_status_cp_cl_null EQU 62H ;AN000; | ||
| 325 | sd_or_dl EQU 61H ;AN000; | ||
| 326 | sd_or_dl_or_eol EQU 60H ;AN000; | ||
| 327 | status_or_eol EQU 5FH ;AN000; | ||
| 328 | stopbits_or_null EQU 5EH ;AN000; | ||
| 329 | T_or_EOL EQU 5DH ;AN000; | ||
| 330 | |||
| 331 | max_looking_for EQU 6FH ;AN000;;used for calculating the displacement into jump table for "CASE looking_for=" | ||
| 332 | |||
| 333 | |||
| 334 | |||
| 335 | |||
| 336 | ;item tags for COM port names strings | ||
| 337 | |||
| 338 | COM1_item_tag EQU 1 ;;AN000;these values must be 1 through 4 because | ||
| 339 | COM2_item_tag EQU 2 ;;AN000;parsing for COM special cases depends | ||
| 340 | COM3_item_tag EQU 3 ;;AN000;on it. | ||
| 341 | COM4_item_tag EQU 4 | ||
| 342 | |||
| 343 | ;item tags for paritys | ||
| 344 | |||
| 345 | first_parity_item_tag EQU 86H ;AN000; | ||
| 346 | mark_item_tag EQU 86H ;AN000; | ||
| 347 | space_item_tag EQU 85H ;AN000; | ||
| 348 | none_item_tag EQU 84H ;AN000; | ||
| 349 | odd_item_tag EQU 83H ;AN000; | ||
| 350 | even_item_tag EQU 82H ;AN000; | ||
| 351 | last_parity_item_tag EQU 82H ;AN000; | ||
| 352 | |||
| 353 | |||
| 354 | ;item tags for printer port names | ||
| 355 | |||
| 356 | PRN_item_tag EQU 5 ;AN000; | ||
| 357 | LPT1_item_tag EQU 6 ;AN000; | ||
| 358 | LPT2_item_tag EQU 7 ;AN000; | ||
| 359 | LPT3_item_tag EQU 8 ;AN000; | ||
| 360 | |||
| 361 | ;item tags for screen modes | ||
| 362 | |||
| 363 | first_screen_mode_item_tag EQU 9 ;AN000; | ||
| 364 | BW40_item_tag EQU 0BH ;AN000; | ||
| 365 | BW80_item_tag EQU 0CH ;AN000; | ||
| 366 | CO40_item_tag EQU 0DH ;AN000; | ||
| 367 | CO80_item_tag EQU 0EH ;AN000; | ||
| 368 | eighty_item_tag EQU 0FH ;AN000; | ||
| 369 | fourty_item_tag EQU 10H ;AN000; | ||
| 370 | MONO_item_tag EQU 11H ;AN000; | ||
| 371 | last_screen_mode_item_tag EQU 11H ;AN000; | ||
| 372 | |||
| 373 | con_item_tag EQU 12H ;AN000; | ||
| 374 | |||
| 375 | |||
| 376 | ;item tags for LPT special cases | ||
| 377 | |||
| 378 | first_lpt_special_case_item_tag EQU 13H ;;AN000;following value must be the same as this one | ||
| 379 | LPT1132_item_tag EQU 13H ;AN000; | ||
| 380 | LPT2132_item_tag EQU 14H ;AN000; | ||
| 381 | LPT3132_item_tag EQU 15H ;AN000; | ||
| 382 | LPT180_item_tag EQU 16H ;AN000; | ||
| 383 | LPT280_item_tag EQU 17H ;AN000; | ||
| 384 | LPT380_item_tag EQU 18H ;AN000; | ||
| 385 | last_lpt_special_case_item_tag EQU 18H ;;AN000;this value must be the same as the previous | ||
| 386 | |||
| 387 | P_item_tag EQU 19H ;AN000; | ||
| 388 | RETRY_item_tag EQU 1AH ;AN000; | ||
| 389 | B_item_tag EQU 1BH ;AN000; | ||
| 390 | E_item_tag EQU 1CH ;AN000; | ||
| 391 | R_item_tag EQU 1DH ;AN000; | ||
| 392 | |||
| 393 | codepage_item_tag EQU 1EH ;;AN000;for the range defining codepage possibilities | ||
| 394 | PREPARE_item_tag EQU 1FH ;AN000; | ||
| 395 | SELECT_item_tag EQU 20H ;AN000; | ||
| 396 | REFRESH_item_tag EQU 21H ;AN000; | ||
| 397 | |||
| 398 | COLUMNS_item_tag EQU 23H ;AN000; | ||
| 399 | DELAY_item_tag EQU 24H ;AN000; | ||
| 400 | LINES_item_tag EQU 25H ;AN000; | ||
| 401 | RATE_item_tag EQU 26H ;AN000; | ||
| 402 | |||
| 403 | COM_item_tag EQU 27H ;AN000; | ||
| 404 | |||
| 405 | ON_item_tag EQU 28H ;AN000; | ||
| 406 | OFF_item_tag EQU 29H ;AN000; | ||
| 407 | |||
| 408 | L_item_tag EQU 2AH ;AN000; | ||
| 409 | T_item_tag EQU 2BH ;AN000; | ||
| 410 | |||
| 411 | ;item tags for numbers not in other lists | ||
| 412 | |||
| 413 | zero_item_tag EQU 2CH ;AN000; | ||
| 414 | first_stopbit_item_tag EQU 2DH ;AN000; | ||
| 415 | one_item_tag EQU 2EH ;AN000; | ||
| 416 | one_point_five_item_tag EQU 2FH ;AN000; | ||
| 417 | two_item_tag EQU 30H ;AN000; | ||
| 418 | last_stopbit_item_tag EQU 31H ;AN000; | ||
| 419 | three_item_tag EQU 32H ;AN000; | ||
| 420 | four_item_tag EQU 33H ;AN000; | ||
| 421 | first_databit_item_tag EQU 34H ;AN000; | ||
| 422 | five_item_tag EQU 35H ;AN000; ;data bit, typamatic rate | ||
| 423 | six_item_tag EQU 36H ;AN000; | ||
| 424 | seven_item_tag EQU 37H ;AN000; | ||
| 425 | eight_item_tag EQU 38H ;AN000; | ||
| 426 | last_databit_item_tag EQU 39H ;AN000; | ||
| 427 | nine_item_tag EQU 3AH ;AN000; | ||
| 428 | ten_item_tag EQU 3BH ;AN000; | ||
| 429 | eleven_item_tag EQU 3CH ;AN000;;first two chars of 110 | ||
| 430 | twelve_item_tag EQU 3DH ;AN000; | ||
| 431 | thirteen_item_tag EQU 3EH ;AN000; | ||
| 432 | fourteen_item_tag EQU 3FH ;AN000; | ||
| 433 | fifteen_item_tag EQU 40H ;AN000;;abbreviated form of 150, 15 is also a RATE= candidate | ||
| 434 | sixteen_item_tag EQU 41H ;AN000; | ||
| 435 | seventeen_item_tag EQU 42H ;AN000; | ||
| 436 | eighteen_item_tag EQU 43H ;AN000; | ||
| 437 | nineteen_item_tag EQU 44H ;AN000;;used for baud rates and RATE= | ||
| 438 | twenty_item_tag EQU 45H ;AN000; | ||
| 439 | twentyone_item_tag EQU 46H ;AN000; | ||
| 440 | twentytwo_item_tag EQU 47H ;AN000; | ||
| 441 | twentythree_item_tag EQU 48H ;AN000; | ||
| 442 | twentyfour_item_tag EQU 49H ;AN000; ;24 is also a typamatic rate | ||
| 443 | twentyfive_item_tag EQU 4AH ;AN000; | ||
| 444 | twentysix_item_tag EQU 4BH ;AN000; | ||
| 445 | twentyseven_item_tag EQU 4CH ;AN000; | ||
| 446 | twentyeight_item_tag EQU 4DH ;AN000; | ||
| 447 | twentynine_item_tag EQU 4EH ;AN000; | ||
| 448 | thirty_item_tag EQU 4FH ;AN000; | ||
| 449 | thirtyone_item_tag EQU 50H ;AN000; | ||
| 450 | thirtytwo_item_tag EQU 51H ;AN000; | ||
| 451 | fourtythree_item_tag EQU 52H ;AN000; | ||
| 452 | fifty_item_tag EQU 53H ;AN000; | ||
| 453 | sixty_item_tag EQU 54H ;AN000; | ||
| 454 | oneten_item_tag EQU 55H ;AN000; | ||
| 455 | onethirtytwo_item_tag EQU 56H ;AN000; | ||
| 456 | onefifty_item_tag EQU 57H ;AN000; | ||
| 457 | threehundred_item_tag EQU 58H ;AN000; | ||
| 458 | sixhundred_item_tag EQU 59H ;AN000; | ||
| 459 | twelvehundred_item_tag EQU 5AH ;AN000; | ||
| 460 | twentyfourhundred_item_tag EQU 5BH ;AN000; | ||
| 461 | fourtyeighthundred_item_tag EQU 5CH ;AN000; | ||
| 462 | ninetysixhundred_item_tag EQU 5DH ;AN000; | ||
| 463 | nineteentwohundred_item_tag EQU 5EH ;AN000; | ||
| 464 | |||
| 465 | |||
| 466 | ;mask values for function_flags | ||
| 467 | |||
| 468 | capitalize EQU 0001H ;AN000;capitalize by file table | ||
| 469 | |||
| 470 | |||
| 471 | ;mask values for match flags | ||
| 472 | |||
| 473 | numeric EQU 8000H ;AN000; | ||
| 474 | simple_string EQU 2000H ;AN000; | ||
| 475 | complex EQU 0400H ;AN000; | ||
| 476 | filespec EQU 0200H ;AN000; | ||
| 477 | ignore_colon EQU 0010H ;AN000; | ||
| 478 | optional EQU 0001H ;AN000; | ||
| 479 | clear_all EQU 0000H ;AN000; | ||
| 480 | |||
| 481 | ;delete_simple_string EQU 0CFFFH ;AN000;;NOT (simple_string), to turn off simple_string bit in the match_flags | ||
| 482 | |||
| 483 | |||
| 484 | |||
| 485 | |||
| 486 | ;º º | ||
| 487 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 488 | |||
| 489 | |||
| 490 | |||
| 491 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 492 | ;º º | ||
| 493 | |||
| 494 | |||
| 495 | des_strt_packet STRUC | ||
| 496 | des_strt_pkfl DW 0000 ;assume a filename specified | ||
| 497 | des_strt_pklen DW 02 ;start with size of 'des_strt_pknum' | ||
| 498 | des_strt_pknum DW 0 ;number of cp numbers in the packet | ||
| 499 | des_strt_pkcp1 DW -1 ;code page number for 1st slot | ||
| 500 | des_strt_pkcp2 DW -1 | ||
| 501 | des_strt_pkcp3 DW -1 | ||
| 502 | des_strt_pkcp4 DW -1 | ||
| 503 | des_strt_pkcp5 DW -1 | ||
| 504 | des_strt_pkcp6 DW -1 | ||
| 505 | des_strt_pkcp7 DW -1 | ||
| 506 | des_strt_pkcp8 DW -1 | ||
| 507 | des_strt_pkcp9 DW -1 | ||
| 508 | des_strt_pkcpA DW -1 | ||
| 509 | des_strt_pkcpB DW -1 | ||
| 510 | des_strt_pkcpC DW -1 ;code page number for 12th slot | ||
| 511 | des_strt_packet ENDS | ||
| 512 | |||
| 513 | |||
| 514 | INCLUDE COMMON.STC ;contains the following strucs, needed in invoke also | ||
| 515 | |||
| 516 | |||
| 517 | ;parm_list_entry STRUC | ||
| 518 | ; | ||
| 519 | ;parm_type DB bogus | ||
| 520 | ;item_tag DB 0FFH | ||
| 521 | ;value1 DW bogus | ||
| 522 | ;value2 DW bogus | ||
| 523 | ;keyword_switch_ptr DW 0 | ||
| 524 | ; | ||
| 525 | ;parm_list_entry ENDS | ||
| 526 | |||
| 527 | |||
| 528 | ;codepage_parms STRUC | ||
| 529 | ; cp_device DW ? | ||
| 530 | ; des_pack_ptr DW ? | ||
| 531 | ; font_filespec DW ? | ||
| 532 | ; request_typ DW ? | ||
| 533 | ;codepage_parms ENDS | ||
| 534 | |||
| 535 | |||
| 536 | parms_def STRUC ;AN000; | ||
| 537 | |||
| 538 | parmsx_ptr DW bogus ;AN000;changed as the possibilities for parms following are determined | ||
| 539 | DB 1 ;AN000;have extra delimiter list | ||
| 540 | seperators_len DB 1 ;AN000;length of extra delimiter list | ||
| 541 | seperators DB ";" ;AC003;EXTRA DELIMITER LIST | ||
| 542 | DB 8 DUP (" ") ;AC003; extra blanks for adding more delimeters (. " \ [ ] : + =) | ||
| 543 | |||
| 544 | parms_def ENDS ;AN000; | ||
| 545 | |||
| 546 | |||
| 547 | |||
| 548 | result_def STRUC ;AN000; | ||
| 549 | |||
| 550 | ret_type DB 0 ;AN000; | ||
| 551 | ret_tag DB 0FFH ;AN000; | ||
| 552 | synonym DW 0 ;AN000; | ||
| 553 | ret_value1 DW bogus ;AN000; | ||
| 554 | ret_value2 DW bogus ;AN000; | ||
| 555 | |||
| 556 | result_def ENDS ;AN000; | ||
| 557 | |||
| 558 | |||
| 559 | |||
| 560 | |||
| 561 | |||
| 562 | |||
| 563 | |||
| 564 | ;º º | ||
| 565 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 566 | |||
| 567 | |||
| 568 | |||
| 569 | PAGE ;AN000; | ||
| 570 | PRINTF_CODE SEGMENT PUBLIC ;AN000; | ||
| 571 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000; | ||
| 572 | |||
| 573 | |||
| 574 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 575 | ;º º | ||
| 576 | |||
| 577 | PUBLIC all_con_status ;AN000; | ||
| 578 | PUBLIC baud_equal ;AN000; | ||
| 579 | PUBLIC B_item_tag ;needed by modecom ;AN000; | ||
| 580 | PUBLIC B_str ;AN000; | ||
| 581 | PUBLIC BW40_item_tag ;AN000; | ||
| 582 | PUBLIC BW80_item_tag ;AN000; | ||
| 583 | PUBLIC codepage_index_holder ;make available to invoke ;AN000; | ||
| 584 | PUBLIC codepage_item_tag ;AN000; | ||
| 585 | PUBLIC codepage_prepare ;AN000; | ||
| 586 | PUBLIC codepage_prepared_status ;AN000; | ||
| 587 | PUBLIC codepage_refresh ;AN000; | ||
| 588 | PUBLIC codepage_selected_status ;AN000; | ||
| 589 | PUBLIC COM_status ;AN000; | ||
| 590 | PUBLIC COMX ;make available to rescode ;AN000; | ||
| 591 | PUBLIC CON_str ;AN000;make available to invoke for messages | ||
| 592 | PUBLIC CO40_item_tag ;AN000; | ||
| 593 | PUBLIC CO80_item_tag ;AN000; | ||
| 594 | PUBLIC codepage_item_tag ;AN000; | ||
| 595 | PUBLIC codepage_select ;AN000; | ||
| 596 | PUBLIC codepage_status ;AN000; | ||
| 597 | PUBLIC columns_equal ;AN000; | ||
| 598 | PUBLIC COLS_equal ;AN000; | ||
| 599 | PUBLIC columns_item_tag ;AN000; | ||
| 600 | PUBLIC COM1_str ;AN000; | ||
| 601 | PUBLIC COM2_str ;AN000; | ||
| 602 | PUBLIC COM3_str ;AN000; | ||
| 603 | PUBLIC COM4_str ;AN000; | ||
| 604 | PUBLIC data_equal ;AN000;used by invoke | ||
| 605 | PUBLIC delay_equal ;AN000; | ||
| 606 | PUBLIC del_equal ;AN000; | ||
| 607 | PUBLIC des_start_packet ;AN000; | ||
| 608 | PUBLIC device_name ;AN000; | ||
| 609 | PUBLIC device_type ;AN000;make available to rescode | ||
| 610 | PUBLIC E_item_tag ;needed by modecom ;AN000; | ||
| 611 | PUBLIC E_str ;AN000; | ||
| 612 | PUBLIC eight_item_tag ;AN000;used by setcom | ||
| 613 | PUBLIC eighty_item_tag ;AN000; | ||
| 614 | PUBLIC eighty_str ;AN000; | ||
| 615 | PUBLIC even_item_tag ;AN000;used by setcom | ||
| 616 | PUBLIC five_item_tag ;AN000;used in setcom | ||
| 617 | PUBLIC fourtyeighthundred_item_tag ;used by setcom;AN000; | ||
| 618 | PUBLIC fourtyeighthundred_str ;used by setcom;AN000; | ||
| 619 | PUBLIC fourty_item_tag ;AN000; | ||
| 620 | PUBLIC fourty_str ;AN000; | ||
| 621 | PUBLIC initialize_com_port ;AN000; | ||
| 622 | PUBLIC initialize_printer_port ;AN000; | ||
| 623 | PUBLIC keyword ;AN000;make available to invoke.asm | ||
| 624 | PUBLIC len_COMX_str ;AN000;make available to invoke.asm | ||
| 625 | PUBLIC len_CON_str ;AN000;make available to invoke.asm for message service | ||
| 626 | PUBLIC len_LPTX_str ;AN000;make available to invoke.asm | ||
| 627 | PUBLIC lines_equal ;AN000; | ||
| 628 | PUBLIC lines_item_tag ;AN000; | ||
| 629 | PUBLIC L_item_tag ;AN000; | ||
| 630 | PUBLIC LPTX ;AN000;make available to rescode | ||
| 631 | PUBLIC LPT1_str ;AN000; | ||
| 632 | PUBLIC LPT2_str ;AN000; | ||
| 633 | PUBLIC LPT3_str ;AN000; | ||
| 634 | PUBLIC mark_item_tag ;AN000;used in setcom | ||
| 635 | PUBLIC max_request_type ;AN000; | ||
| 636 | PUBLIC mono_item_tag ;AN000; | ||
| 637 | PUBLIC new_com_initialize ;AC002;make available for modecom | ||
| 638 | PUBLIC nineteentwohundred_item_tag ;AN000;used by modecom | ||
| 639 | PUBLIC nineteentwohundred_str ;AN000;used by modecom | ||
| 640 | PUBLIC ninetysixhundred_item_tag ;AN000; | ||
| 641 | PUBLIC ninetysixhundred_str ;AN000; | ||
| 642 | PUBLIC none_item_tag ;AN000;used in invoke | ||
| 643 | PUBLIC NONE_str ;AN000; | ||
| 644 | PUBLIC OFF_item_tag ;AN000; | ||
| 645 | PUBLIC OFF_str ;AN000; | ||
| 646 | PUBLIC odd_item_tag ;AN000; ;used by setcom | ||
| 647 | PUBLIC old_initialize_printer_port ;AN000; | ||
| 648 | PUBLIC old_video_mode_set ;AN000; | ||
| 649 | PUBLIC one_item_tag ;used in setcom ;AN000; | ||
| 650 | PUBLIC one_point_five_item_tag ;used in setcom ;AN000; | ||
| 651 | PUBLIC one_point_five_str ;used in setcom ;AN000; | ||
| 652 | PUBLIC onefifty_item_tag ;used in setcom ;AN000; | ||
| 653 | PUBLIC onefifty_str ;used in setcom ;AN000; | ||
| 654 | PUBLIC oneten_item_tag ;used in modecom ;AN000; | ||
| 655 | PUBLIC oneten_str ;used in modecom ;AN000; | ||
| 656 | PUBLIC onethirtytwo_item_tag ;AN000; | ||
| 657 | PUBLIC ON_item_tag ;AN000; | ||
| 658 | PUBLIC ON_str ;AN000; | ||
| 659 | PUBLIC P_item_tag ;make available to modecom ;AN000; | ||
| 660 | PUBLIC parity_equal ;used in analyze_and_invoke ;AN000; | ||
| 661 | PUBLIC parm_lst ;used in modecom.asm ;AN000; | ||
| 662 | PUBLIC parms_form ;make available to invoke ;AN000; | ||
| 663 | PUBLIC parse_parameters ;AN000; | ||
| 664 | PUBLIC prepare ;AN000; | ||
| 665 | PUBLIC prepare_item_tag ;AN000; | ||
| 666 | PUBLIC printer_reroute ;AN000; | ||
| 667 | PUBLIC printer_status ;AN000; | ||
| 668 | PUBLIC R_item_tag ;AN000; | ||
| 669 | PUBLIC R_str ;AN000; | ||
| 670 | PUBLIC rate_equal ;AN000; | ||
| 671 | PUBLIC refresh ;AN000; | ||
| 672 | PUBLIC request_type ;AN000; | ||
| 673 | PUBLIC reroute_requested ;make available to rescode;AN000; | ||
| 674 | PUBLIC retry_equal_str ;make available to invoke;AN000; | ||
| 675 | PUBLIC retry_item_tag ;AN000; | ||
| 676 | PUBLIC retry_requested ;make available to rescode ;AN000; | ||
| 677 | PUBLIC select ;AN000; | ||
| 678 | PUBLIC select_item_tag ;AN000; | ||
| 679 | PUBLIC set_con_features ;AN000; | ||
| 680 | PUBLIC seven_item_tag ;used by setcom ;AN000; | ||
| 681 | PUBLIC sixhundred_item_tag ;used by setcom ;AN000; | ||
| 682 | PUBLIC sixhundred_str ;used by setcom ;AN000; | ||
| 683 | PUBLIC six_item_tag ;used by setcom ;AN000; | ||
| 684 | PUBLIC space_item_tag ;used by setcom ;AN000; | ||
| 685 | PUBLIC status_for_everything ;AN000; | ||
| 686 | PUBLIC stop_equal ;AN000; | ||
| 687 | PUBLIC T_item_tag ;AN000; | ||
| 688 | PUBLIC threehundred_item_tag ;used by setcom ;AN000; | ||
| 689 | PUBLIC threehundred_str ;used by setcom ;AN000; | ||
| 690 | PUBLIC turn_off_reroute ;AN000; | ||
| 691 | PUBLIC twelvehundred_item_tag ;used by setcom ;AN000; | ||
| 692 | PUBLIC twelvehundred_str ;used by setcom ;AN000; | ||
| 693 | PUBLIC twentyfourhundred_item_tag ;used by setcom ;AN000; | ||
| 694 | PUBLIC twentyfourhundred_str ;used by setcom ;AN000; | ||
| 695 | PUBLIC two_item_tag ;used by setcom ;AN000; | ||
| 696 | |||
| 697 | ;º º | ||
| 698 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 699 | |||
| 700 | |||
| 701 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 702 | ;º º | ||
| 703 | |||
| 704 | ;EXTRN command_line:BYTE ;AN000;PARM AREA | ||
| 705 | ;EXTRN command_line_length:BYTE ;AN000;NUMBER OF BYTES OF PARM AREA | ||
| 706 | EXTRN com1_or_com2:BYTE ;AN000;see modedefs.inc | ||
| 707 | EXTRN cp_cb:WORD ;AN000;codepage_parms <> ;codepage subroutine parameter block | ||
| 708 | EXTRN CRLF:WORD ;displayed before "Invalid parameter - " for consistent spacing ;AN000; | ||
| 709 | EXTRN DES_STRT_FL_CART:ABS ;AN000;;CARTRIDGE prepare | ||
| 710 | EXTRN device:BYTE ;AN000;holder for com number, used in setcom | ||
| 711 | EXTRN first_char_in_command_line:BYTE ;AN000;location of the command line parameters | ||
| 712 | EXTRN function_not_supported:BYTE ;AN000;see modedefs.inc | ||
| 713 | EXTRN get_machine_type:NEAR ;AN000;get model and sub-model bytes | ||
| 714 | EXTRN invalid_parameter:BYTE ;AN000;CR,LF,"Invalid parameter - '????'"CR,LF,BEEP | ||
| 715 | EXTRN LPTNO:BYTE ;AN000;holder of ASCII version of printer number, see first_parm_case and modeprin | ||
| 716 | EXTRN machine_type:BYTE ;AN000;see get_machine_type | ||
| 717 | EXTRN modecp:NEAR ;AN000; | ||
| 718 | EXTRN move_destination:ABS ;AN000;location of res code after it has been moved | ||
| 719 | EXTRN noerror:BYTE ;AN000; | ||
| 720 | EXTRN not_supported_ptr:WORD ;AN000;holder of address of string that describes what is not supported, see modedefs.inc | ||
| 721 | EXTRN offending_parameter:BYTE ;AC006;the holder of the text string that was wrong. | ||
| 722 | EXTRN offending_parameter_ptr:WORD ;AN000;;see MODEMES | ||
| 723 | EXTRN printer_no:BYTE ;AN000;;see modeprin | ||
| 724 | EXTRN PRINTF:NEAR ;AN000; | ||
| 725 | EXTRN rate_and_delay_together:BYTE ;AN000;RATE and DELAY must be specified together | ||
| 726 | EXTRN syntax_error_ptr:WORD ;AN000;pointer to parameter with bad format | ||
| 727 | |||
| 728 | ;possible values of "message" | ||
| 729 | |||
| 730 | EXTRN baud_rate_required:BYTE ;AN000; | ||
| 731 | EXTRN invalid_number_of_parameters:WORD ;AN000; | ||
| 732 | EXTRN Invalid_switch:BYTE | ||
| 733 | EXTRN syntax_error:BYTE | ||
| 734 | |||
| 735 | |||
| 736 | ;º º | ||
| 737 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 738 | |||
| 739 | |||
| 740 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 741 | ;º º | ||
| 742 | |||
| 743 | code_page_numbers_encountered DB 0 | ||
| 744 | current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet' | ||
| 745 | EOL_found DB false | ||
| 746 | looking_for DB bogus ;semantic analysis state, can be one of: | ||
| 747 | match_not_found DB true ;indication that a token was found in the list of keywords | ||
| 748 | |||
| 749 | |||
| 750 | |||
| 751 | des_start_packet des_strt_packet <> | ||
| 752 | |||
| 753 | ;---------------------------- NEW DATA --------------------------------- | ||
| 754 | |||
| 755 | |||
| 756 | |||
| 757 | baud_specified DB false ;AN000; | ||
| 758 | codepage_index_holder DW bogus ;AN000;;holder for index in parm_list of the selected code page | ||
| 759 | colon DB ":" ;AN000; | ||
| 760 | command_line DW 0081H ;AN000; ;holder for pointer to unparsed part of the command line, see "parse_parm" | ||
| 761 | device_name DW 0 ;AN000;;OFFSET device name string, see "analyze_and_invoke" in invoke.asm | ||
| 762 | device_type DB bogus ;AN000; | ||
| 763 | end_of_seperator_list DW bogus ;AN000;;loop terminator,word because compared with DI | ||
| 764 | match_found DB false ;AN000; ;boolean loop terminator | ||
| 765 | message DW no_message ;AN000; | ||
| 766 | new_com_initialize DB false ;AC002;flag for modecom to indicate PS/2 only parm specified | ||
| 767 | number_of_keywords DB 0 ;AN000;;input for check_for_keyword | ||
| 768 | parms_form DB 0 ;AN000;;holder for indicator of whether the parms were in keyword or positonal form | ||
| 769 | ordinal DW 0 ;AN000; | ||
| 770 | rate_and_delay_found DB false ;AN000;need to have both, this byte keeps track of what has been found | ||
| 771 | request_type DB bogus ;AN000; | ||
| 772 | reroute_requested DB false ;AN000; | ||
| 773 | retry_requested DB false ;AN000; | ||
| 774 | search_stop DB 0 ;AN000;;loop stopper for search_item_tags | ||
| 775 | status_found DB false ;AN000;;boolean indicator that /status has been found | ||
| 776 | status_request DB bogus ;AN000;;furthur clarification. possible values are: bogus, true, and false | ||
| 777 | terminating_delimeter DB bogus ;AN000;;save return from sysparse | ||
| 778 | type_of_machine DB bogus ;AC000;"get_machine_type" determines "machine_type", this byte is general flag for PS/2s | ||
| 779 | |||
| 780 | |||
| 781 | ; PARSER interface data | ||
| 782 | ;--------------------------------------- | ||
| 783 | |||
| 784 | start_com_keyword_ptrs LABEL WORD ;AN000; | ||
| 785 | first_com_keyword_ptr DW OFFSET baud_equal ;AN000; | ||
| 786 | DW OFFSET parity_equal ;AN000; | ||
| 787 | DW OFFSET data_equal ;AN000; | ||
| 788 | DW OFFSET stop_equal ;AN000; | ||
| 789 | last_com_keyword_ptr DW OFFSET retry_equal_str ;AN000; | ||
| 790 | number_of_com_keywords EQU ($ - start_com_keyword_ptrs)/2 ;AN000; | ||
| 791 | |||
| 792 | |||
| 793 | start_LPT_keyword_ptrs LABEL WORD ;AN000; | ||
| 794 | first_LPT_keyword_ptr DW OFFSET retry_equal_str ;AN000; | ||
| 795 | DW OFFSET COLUMNS_equal ;AN000; | ||
| 796 | DW OFFSET COLS_equal ;AN000; | ||
| 797 | last_LPT_keyword_ptr DW OFFSET LINES_equal ;AN000; | ||
| 798 | number_of_LPT_keywords EQU ($ - start_LPT_keyword_ptrs)/2 ;AN000; | ||
| 799 | |||
| 800 | |||
| 801 | start_CON_keyword_ptrs LABEL WORD ;AN000; | ||
| 802 | first_CON_keyword_ptr DW OFFSET COLUMNS_equal ;AN000; | ||
| 803 | DW OFFSET COLS_equal ;AN000; | ||
| 804 | DW OFFSET LINES_equal ;AN000; | ||
| 805 | DW OFFSET RATE_equal ;AN000; | ||
| 806 | DW OFFSET DELAY_equal ;AN000; | ||
| 807 | last_CON_keyword_ptr DW OFFSET DEL_equal ;AN000; | ||
| 808 | number_of_CON_keywords EQU ($ - start_CON_keyword_ptrs)/2 ;AN000; | ||
| 809 | |||
| 810 | |||
| 811 | |||
| 812 | parms parms_def<> ;AN000;set up for first_parm_case, except parmsx_ptr needs to be set | ||
| 813 | |||
| 814 | |||
| 815 | parmsx LABEL BYTE ;AN000; | ||
| 816 | |||
| 817 | DB 0 ;AN000;how many non-switch/non-keyword parms are required | ||
| 818 | DB 3 ;AN000;max pos parms for this parmsx, use others for further parms | ||
| 819 | DW first_pos_control ;AN000;control block for every possible (non-mutatant) first positional parm | ||
| 820 | DW second_pos_control ;AN000; | ||
| 821 | DW third_pos_control ;AN000; | ||
| 822 | |||
| 823 | DB max_switches ;AN000; | ||
| 824 | DW max_switches DUP (Sw_control) ;AN000; | ||
| 825 | |||
| 826 | DB max_keywords ;AN000;number of unique keywords for all options | ||
| 827 | |||
| 828 | start_keyword_list LABEL BYTE ;AN000; | ||
| 829 | |||
| 830 | DW LPT1_colon_equal_control ;AN000; | ||
| 831 | DW LPT1_equal_control ;AN000; | ||
| 832 | DW LPT2_colon_equal_control ;AN000; | ||
| 833 | DW LPT2_equal_control ;AN000; | ||
| 834 | DW LPT3_colon_equal_control ;AN000; | ||
| 835 | DW LPT3_equal_control ;AN000; | ||
| 836 | |||
| 837 | DW RETRY_equal_control ;AN000;for parallel and serial printers | ||
| 838 | |||
| 839 | DW COLUMNS_equal_control ;AN000; | ||
| 840 | DW LINES_equal_control ;AN000;;this and previous MUST OCCUR IN THIS ORDER | ||
| 841 | DW PREPARE_equal_control ;AN000; | ||
| 842 | DW SELECT_equal_control ;AN000; | ||
| 843 | |||
| 844 | max_keywords EQU ($ - start_keyword_list) / 2 ;AN000;two bytes per entry | ||
| 845 | |||
| 846 | |||
| 847 | |||
| 848 | con_parmsx LABEL BYTE ;AN000;for keyword form of con support | ||
| 849 | |||
| 850 | DB 0 ;AN000;no positional parms required after CON | ||
| 851 | DB 2 ;AN000;CP and REFRESH allowed | ||
| 852 | DW first_CON_pos_control ;AN000;control block for CP | ||
| 853 | DW second_CON_pos_control ;AN000;control block for REFRESH | ||
| 854 | |||
| 855 | DB max_switches ;AN000; | ||
| 856 | DW max_switches DUP (Sw_control) ;AN000; | ||
| 857 | |||
| 858 | DB number_of_CON_keywords ;AN000;number of unique keywords for CON | ||
| 859 | |||
| 860 | start_con_keyword_list LABEL BYTE ;AN000; | ||
| 861 | |||
| 862 | DW COLUMNS_equal_control ;AN000; | ||
| 863 | DW LINES_equal_control ;AN000; | ||
| 864 | DW PREPARE_equal_control ;AN000; | ||
| 865 | DW SELECT_equal_control ;AN000; | ||
| 866 | |||
| 867 | DW DELAY_equal_control ;AN000; | ||
| 868 | DW RATE_equal_control ;AN000; | ||
| 869 | |||
| 870 | number_of_con_keywords EQU ($ - start_con_keyword_list) / 2 ;AN000;two bytes per entry | ||
| 871 | |||
| 872 | |||
| 873 | old_con_parmsx LABEL BYTE ;AN000; | ||
| 874 | |||
| 875 | DB 0 ;AN000;no positional parms required after 80, co40 etc. | ||
| 876 | DB 2 ;AN000;shift direction and "T" allowed | ||
| 877 | DW first_old_CON_pos_control ;AN000;shift direction and display lines | ||
| 878 | DW second_old_CON_pos_control ;AN000;control block for T | ||
| 879 | |||
| 880 | DB 0 ;AN000;no switches | ||
| 881 | |||
| 882 | DB 0 ;AN000;no keywords for old CON | ||
| 883 | |||
| 884 | |||
| 885 | lpt_parmsx LABEL BYTE ;AN664;for the second thru 4th parms, [[chars/line][[,lines/inch][[,P]]]] | ||
| 886 | |||
| 887 | DB 0 ;AN000;how many non-switch/non-keyword parms are required | ||
| 888 | DB 3 ;AN000;max pos parms for this parmsx, use others for further parms | ||
| 889 | DW first_lpt_pos_control ;AN000;control block for every possible chars per line value | ||
| 890 | DW second_lpt_pos_control ;AN000; | ||
| 891 | DW third_lpt_pos_control ;AN000; | ||
| 892 | |||
| 893 | DB max_switches ;AN000; | ||
| 894 | DW max_switches DUP (Sw_control) ;AN000; | ||
| 895 | |||
| 896 | DB max_lpt_keywords ;AN000;number of unique keywords for all options | ||
| 897 | |||
| 898 | start_lpt_keyword_list LABEL BYTE ;AN000; | ||
| 899 | |||
| 900 | DW RETRY_equal_control ;AN000;for parallel printers | ||
| 901 | |||
| 902 | DW COLUMNS_equal_control ;AN000; | ||
| 903 | DW LINES_equal_control ;AN000;;this and previous MUST OCCUR IN THIS ORDER | ||
| 904 | DW PREPARE_equal_control ;AN000; | ||
| 905 | DW SELECT_equal_control ;AN000; | ||
| 906 | |||
| 907 | max_lpt_keywords EQU ($ - start_keyword_list) / 2 ;AN000;two bytes per entry | ||
| 908 | |||
| 909 | |||
| 910 | prepare_equal_parmsx LABEL BYTE ;AN000; | ||
| 911 | |||
| 912 | prepare_min_parms LABEL BYTE ;AN000;changed by hardware cp code to allow no filename | ||
| 913 | DB min_number_of_codepages ;AN000; | ||
| 914 | DB max_number_of_codepages ;AN000; | ||
| 915 | DW max_number_of_codepages DUP (prepare_equal_control) ;AN000; | ||
| 916 | DB max_switches ;AN000; | ||
| 917 | DW max_switches DUP (Sw_control) ;AN000; | ||
| 918 | DB 0 ;AN000;no more keywords allowed | ||
| 919 | |||
| 920 | com_parmsx LABEL BYTE ;AN000; | ||
| 921 | |||
| 922 | DB min_old_com_pos_parms ;AN000;nothing or /STATUS | ||
| 923 | DB max_old_com_pos_parms ;AN000;baud, parity, data, stop, p | ||
| 924 | DW baud_control ;AN000; | ||
| 925 | DW old_com_parity_control ;AN000; | ||
| 926 | DW old_com_databits_control ;AN000;control block for old com data bits | ||
| 927 | DW old_com_stopbits_control ;AN000; | ||
| 928 | retry_control_ptr DW old_com_retry_control ;AN000; | ||
| 929 | |||
| 930 | DB max_switches ;AN000; | ||
| 931 | DW max_switches DUP (Sw_control) ;AN000; | ||
| 932 | |||
| 933 | DB number_of_com_keywords ;AN000; | ||
| 934 | |||
| 935 | start_com_keyword_list LABEL BYTE ;AN000; | ||
| 936 | |||
| 937 | DW BAUD_control ;AN000; | ||
| 938 | DW PARITY_equal_control ;AN000; | ||
| 939 | DW DATA_equal_control ;AN000; | ||
| 940 | DW STOP_equal_control ;AN000; | ||
| 941 | DW RETRY_equal_control ;AN000;same as for printers | ||
| 942 | |||
| 943 | number_of_com_keywords EQU ($ - start_com_keyword_list) / 2 ;AN000;two bytes per entry | ||
| 944 | |||
| 945 | |||
| 946 | com_keywords_parmsx LABEL BYTE ;AC663; | ||
| 947 | |||
| 948 | DB 0 ;AC663;no positional parms valid | ||
| 949 | DB 0 ;AC663; | ||
| 950 | |||
| 951 | DB 0 ;AC663; | ||
| 952 | |||
| 953 | DB number_of_com_keywords ;AC663; | ||
| 954 | |||
| 955 | DW BAUD_control ;AC663; | ||
| 956 | DW PARITY_equal_control ;AC663; | ||
| 957 | DW DATA_equal_control ;AC663; | ||
| 958 | DW STOP_equal_control ;AC663; | ||
| 959 | DW RETRY_equal_control ;AC663;same as for printers | ||
| 960 | |||
| 961 | |||
| 962 | |||
| 963 | mutant_com_parmsx LABEL BYTE ;AN000;for trash like COM19600 | ||
| 964 | |||
| 965 | DB 2 ;AN000;;must find "COM" and a baud rate | ||
| 966 | DB 2 ;AN000;;"COM", baud | ||
| 967 | DW COM_control ;AN000; | ||
| 968 | DW baud_control ;AN000;use same as other com parmsx | ||
| 969 | |||
| 970 | DB 0 ;AN000;no switches | ||
| 971 | |||
| 972 | DB 0 ;AN000;no keywords | ||
| 973 | |||
| 974 | com_control LABEL BYTE ;AN000;for mutant_com_parmsx | ||
| 975 | |||
| 976 | DW simple_string ;AN000;"COM", not optional | ||
| 977 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 978 | DW result ;AN000; | ||
| 979 | DW com_value ;AN000; | ||
| 980 | DB 0 ;AN000;no synonyms | ||
| 981 | |||
| 982 | |||
| 983 | |||
| 984 | old_com_parity_control LABEL BYTE ;AC000; | ||
| 985 | |||
| 986 | DW simple_string+optional ;AC000;n, o, e are strings | ||
| 987 | DW 0 ;AC000;don't capitalize, leave colon | ||
| 988 | DW result ;AC000; | ||
| 989 | DW PARITY_values ;AC000; | ||
| 990 | DB 0 ;AC000;;no synonyms | ||
| 991 | |||
| 992 | |||
| 993 | old_com_DATAbits_control LABEL BYTE ;AC000; | ||
| 994 | |||
| 995 | DW simple_string+optional ;AC000; | ||
| 996 | DW 0 ;AC000;;don't capitalize, leave colon | ||
| 997 | DW result ;AC000; | ||
| 998 | DW DATA_values ;AC000; | ||
| 999 | DB 0 ;AC000; | ||
| 1000 | |||
| 1001 | |||
| 1002 | |||
| 1003 | old_com_STOPbits_control LABEL BYTE ;AC000; | ||
| 1004 | |||
| 1005 | DW simple_string+optional ;AC000; | ||
| 1006 | DW 0 ;AC000;;don't capitalize, leave colon | ||
| 1007 | DW result ;AC000; | ||
| 1008 | DW STOP_values ;AC000; | ||
| 1009 | DB 0 ;AC000; | ||
| 1010 | |||
| 1011 | |||
| 1012 | |||
| 1013 | old_com_RETRY_control LABEL BYTE ;AC000; | ||
| 1014 | |||
| 1015 | DW simple_string+optional ;AC000;;all that is legal for RETRY is P for old com format | ||
| 1016 | DW 0 ;AC000;;don't capitalize, never need to display to user | ||
| 1017 | DW result ;AC000; | ||
| 1018 | DW RETRY_values ;AC000; | ||
| 1019 | DB 0 ;AC000; | ||
| 1020 | |||
| 1021 | |||
| 1022 | com_value LABEL BYTE ;AC000;"COM" for mutant_com_parmsx | ||
| 1023 | |||
| 1024 | DB include_string_list ;AC000;have list of strings | ||
| 1025 | |||
| 1026 | DB 0 ;AC000; | ||
| 1027 | |||
| 1028 | DB 0 ;AC000;no number choices | ||
| 1029 | |||
| 1030 | DB 1 ;AC000;just "COM" | ||
| 1031 | |||
| 1032 | DB COM_item_tag ;AC000; | ||
| 1033 | DW OFFSET COM_str ;AC000; | ||
| 1034 | |||
| 1035 | |||
| 1036 | first_pos_control LABEL BYTE ;AN000;initialized for first_parm_case | ||
| 1037 | |||
| 1038 | match_flags DW simple_string+optional ;*** +ignore_colon *** ;AN000;2011, all that is legal for non-/status first parm | ||
| 1039 | function_flags DW 0010H ;AN000;don't capitalize, remove colon at end | ||
| 1040 | DW result ;AN000; | ||
| 1041 | values_ptr DW first_pos_values ;AN000; | ||
| 1042 | DB 0 ;AN000;no keywords as positionals | ||
| 1043 | |||
| 1044 | |||
| 1045 | second_pos_control LABEL BYTE ;AN000;initialized for first_parm_case | ||
| 1046 | |||
| 1047 | match_flags2 DW simple_string+optional+ignore_colon ;AN000;2011, all that is legal for non-/status first parm | ||
| 1048 | function_flags2 DW 0010H ;AN000;don't capitalize, remove colon at end | ||
| 1049 | DW result ;AN000; | ||
| 1050 | values_ptr2 DW second_pos_values ;AN000; | ||
| 1051 | DB 0 ;AN000;;no keywords as positionals | ||
| 1052 | |||
| 1053 | third_pos_control LABEL BYTE ;AN000;initialized for first_parm_case | ||
| 1054 | |||
| 1055 | match_flags3 DW simple_string+optional+ignore_colon ;AN000;2011, all that is legal for non-/status first parm | ||
| 1056 | function_flags3 DW 0010H ;AN000;don't capitalize, remove colon at end | ||
| 1057 | DW result ;AN000; | ||
| 1058 | values_ptr3 DW third_pos_values ;AN000; | ||
| 1059 | DB 0 ;AN000;;no keywords as positionals | ||
| 1060 | |||
| 1061 | first_lpt_pos_control LABEL BYTE ;AN000;chars per line | ||
| 1062 | |||
| 1063 | DW simple_string+optional ;AN000;2001, all that is legal for chars per line | ||
| 1064 | DW 0000H ;AN000;don't capitalize | ||
| 1065 | DW result ;AN000; | ||
| 1066 | DW first_lpt_pos_values ;AN000; | ||
| 1067 | DB 0 ;AN000;no keywords as positionals | ||
| 1068 | |||
| 1069 | |||
| 1070 | second_lpt_pos_control LABEL BYTE ;AN000;lines per inch | ||
| 1071 | |||
| 1072 | DW simple_string+optional ;AN000;2001, all that is legal for chars per line | ||
| 1073 | DW 0000H ;AN000;don't capitalize | ||
| 1074 | DW result ;AN000; | ||
| 1075 | DW second_lpt_pos_values ;AN000; | ||
| 1076 | DB 0 ;AN000;;no keywords as positionals | ||
| 1077 | |||
| 1078 | third_lpt_pos_control LABEL BYTE ;AN000;P | ||
| 1079 | |||
| 1080 | DW simple_string+optional ;AN000;2001, all that is legal for retry settings | ||
| 1081 | DW 0000H ;AN000;don't capitalize | ||
| 1082 | DW result ;AN000; | ||
| 1083 | DW third_lpt_pos_values ;AN000; | ||
| 1084 | DB 0 ;AN000;;no keywords as positionals | ||
| 1085 | |||
| 1086 | |||
| 1087 | |||
| 1088 | BAUD_control LABEL BYTE ;AN000;used for positional and keyword form | ||
| 1089 | |||
| 1090 | DW simple_string ;AN000;required | ||
| 1091 | DW 0 ;AN000;don't capitalize | ||
| 1092 | DW result ;AN000; | ||
| 1093 | DW BAUD_values ;AN000; | ||
| 1094 | DB 1 ;AN000;;only one form of the keyword | ||
| 1095 | |||
| 1096 | BAUD_equal DB "BAUD=",0 ;AN000; | ||
| 1097 | |||
| 1098 | |||
| 1099 | parity_equal_control LABEL BYTE ;AN000;initialized for first_parm_case | ||
| 1100 | |||
| 1101 | DW simple_string ;AN000;n, o, even, m, space etc are strings | ||
| 1102 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1103 | DW result ;AN000; | ||
| 1104 | DW PARITY_values ;AN000; | ||
| 1105 | DB 2 ;two ways to specify it | ||
| 1106 | |||
| 1107 | parity_equal DB "PARITY=",0 ;AN000; | ||
| 1108 | par_equal DB "PAR=",0 ;AN000; | ||
| 1109 | |||
| 1110 | |||
| 1111 | |||
| 1112 | DATA_equal_control LABEL BYTE ;AN000; | ||
| 1113 | |||
| 1114 | DW simple_string | ||
| 1115 | DW 0 ;AN000;;don't capitalize, leave colon | ||
| 1116 | DW result ;AN000; | ||
| 1117 | DW DATA_values ;AN000; | ||
| 1118 | DB 1 ;AN000; | ||
| 1119 | |||
| 1120 | data_equal DB "DATA=",0 ;AN000; | ||
| 1121 | |||
| 1122 | |||
| 1123 | |||
| 1124 | STOP_equal_control LABEL BYTE ;AN000; | ||
| 1125 | |||
| 1126 | DW simple_string ;AN000; | ||
| 1127 | DW 0 ;AN000;;don't capitalize, leave colon | ||
| 1128 | DW result ;AN000; | ||
| 1129 | DW STOP_values ;AN000; | ||
| 1130 | DB 1 ;AN000; | ||
| 1131 | |||
| 1132 | stop_equal DB "STOP=",0 ;AN000; | ||
| 1133 | |||
| 1134 | |||
| 1135 | |||
| 1136 | RETRY_equal_control LABEL BYTE ;AN000; | ||
| 1137 | |||
| 1138 | DW simple_string ;AN000;;all that is legal for RETRY is on and off | ||
| 1139 | DW 0 ;AN000;;don't capitalize, never need to display to user | ||
| 1140 | DW result ;AN000; | ||
| 1141 | DW RETRY_values ;AN000; | ||
| 1142 | DB 1 ;AN000; | ||
| 1143 | |||
| 1144 | retry_equal_str DB "RETRY=",0 ;AN000; | ||
| 1145 | |||
| 1146 | |||
| 1147 | |||
| 1148 | PREPARE_equal_control LABEL BYTE ;AN000; | ||
| 1149 | |||
| 1150 | prepare_equal_match_flags LABEL WORD ;AN000; | ||
| 1151 | DW numeric+complex+filespec ;AN000;has to be complex at first, then numbers and filespec inside the parens | ||
| 1152 | DW capitalize ;AN000;capitalize the filespec | ||
| 1153 | DW result ;AN000; | ||
| 1154 | DW prepare_values ;AN000; | ||
| 1155 | DB 2 ;AN000; | ||
| 1156 | |||
| 1157 | prepare_equal DB "PREPARE=",0 ;AN000; | ||
| 1158 | prep_equal DB "PREP=",0 ;AN000; | ||
| 1159 | |||
| 1160 | |||
| 1161 | SELECT_equal_control LABEL BYTE ;AN000; | ||
| 1162 | |||
| 1163 | DW numeric ;AN000;range of codepage numbers | ||
| 1164 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1165 | DW result ;AN000; | ||
| 1166 | DW SELECT_values ;AN000; | ||
| 1167 | DB 2 ;AN000;no keywords as positionals | ||
| 1168 | |||
| 1169 | select_equal DB "SELECT=",0 ;AN000; | ||
| 1170 | sel_equal DB "SEL=",0 ;AN000; | ||
| 1171 | |||
| 1172 | |||
| 1173 | DELAY_equal_control LABEL BYTE ;AN000; | ||
| 1174 | |||
| 1175 | DW numeric ;AN000; ;takes less space than number definitions | ||
| 1176 | DW 0 ;AN000; ;don't capitalize, leave colon | ||
| 1177 | DW result ;AN000; | ||
| 1178 | DW DELAY_values ;AN000; | ||
| 1179 | DB 2 ;AN000; | ||
| 1180 | |||
| 1181 | del_equal DB "DEL=",0 ;AN000; | ||
| 1182 | delay_equal DB "DELAY=",0 ;AN000; | ||
| 1183 | |||
| 1184 | |||
| 1185 | RATE_equal_control LABEL BYTE ;AN000; | ||
| 1186 | |||
| 1187 | DW numeric ;AN000; | ||
| 1188 | DW 0 ;AN000; ;don't capitalize, leave colon | ||
| 1189 | DW result ;AN000; | ||
| 1190 | DW RATE_values ;AN000; | ||
| 1191 | DB 1 ;AN000; | ||
| 1192 | |||
| 1193 | rate_equal DB "RATE=",0 ;AN000; | ||
| 1194 | |||
| 1195 | |||
| 1196 | |||
| 1197 | LINES_equal_control LABEL BYTE ;AN000; | ||
| 1198 | |||
| 1199 | LINES_match_flag DW numeric ;AN000; ;setup for CON, changed if find LPTX | ||
| 1200 | DW 0 ;AN000; ;don't capitalize, leave colon | ||
| 1201 | DW result ;AN000; | ||
| 1202 | LINES_value_ptr DW CON_LINES_values ;AN000; | ||
| 1203 | DB 1 ;AN000; | ||
| 1204 | |||
| 1205 | lines_equal DB "LINES=",0 ;AN000; | ||
| 1206 | |||
| 1207 | |||
| 1208 | |||
| 1209 | COLUMNS_equal_control LABEL BYTE ;AN000; | ||
| 1210 | |||
| 1211 | COLUMNS_match_flag DW numeric ;AN000; ;setup for CON changed when find LPTX | ||
| 1212 | DW 0 ;AN000; ;don't capitalize, leave colon | ||
| 1213 | DW result ;AN000; | ||
| 1214 | COLUMNS_value_ptr DW CON_COLUMNS_values ;AN000;setup for CON, changed if find LPTX | ||
| 1215 | DB 2 ;AN000; | ||
| 1216 | |||
| 1217 | COLUMNS_equal DB "COLUMNS=",0 ;AN000;printer keyword | ||
| 1218 | COLS_equal DB "COLS=",0 ;AN000; | ||
| 1219 | |||
| 1220 | |||
| 1221 | LPT1_colon_equal_control LABEL BYTE ;AN000; | ||
| 1222 | |||
| 1223 | DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid | ||
| 1224 | DW 0 ;AN000;;don't capitalize, leave colon | ||
| 1225 | DW result ;AN000; | ||
| 1226 | DW reroute_values ;AN000; | ||
| 1227 | DB 1 ;AN000; | ||
| 1228 | |||
| 1229 | LPT1_colon_equal DB "LPT1:=",0 ;AN000; | ||
| 1230 | |||
| 1231 | |||
| 1232 | |||
| 1233 | LPT1_equal_control LABEL BYTE ;AN000; | ||
| 1234 | |||
| 1235 | DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid | ||
| 1236 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1237 | DW result ;AN000; | ||
| 1238 | DW reroute_values ;AN000; | ||
| 1239 | DB 1 ;AN000; | ||
| 1240 | |||
| 1241 | LPT1_equal DB "LPT1=",0 ;AN000; | ||
| 1242 | |||
| 1243 | |||
| 1244 | |||
| 1245 | LPT2_colon_equal_control LABEL BYTE ;AN000; | ||
| 1246 | |||
| 1247 | DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid | ||
| 1248 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1249 | DW result ;AN000; | ||
| 1250 | DW reroute_values ;AN000; | ||
| 1251 | DB 1 ;AN000; | ||
| 1252 | |||
| 1253 | LPT2_colon_equal DB "LPT2:=",0 ;AN000; | ||
| 1254 | |||
| 1255 | |||
| 1256 | |||
| 1257 | LPT2_equal_control LABEL BYTE ;AN000; | ||
| 1258 | |||
| 1259 | DW simple_string+ignore_colon ;AN000;;COM?[:] is all that is valid | ||
| 1260 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1261 | DW result ;AN000; | ||
| 1262 | DW reroute_values ;AN000; | ||
| 1263 | DB 1 ;AN000; | ||
| 1264 | |||
| 1265 | LPT2_equal DB "LPT2=",0 ;AN000; | ||
| 1266 | |||
| 1267 | |||
| 1268 | |||
| 1269 | LPT3_colon_equal_control LABEL BYTE ;AN000; | ||
| 1270 | |||
| 1271 | DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid | ||
| 1272 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1273 | DW result ;AN000; | ||
| 1274 | DW reroute_values ;AN000; | ||
| 1275 | DB 1 ;AN000; | ||
| 1276 | |||
| 1277 | LPT3_colon_equal DB "LPT3:=",0 ;AN000; | ||
| 1278 | |||
| 1279 | |||
| 1280 | |||
| 1281 | LPT3_equal_control LABEL BYTE ;AN000; | ||
| 1282 | |||
| 1283 | DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid | ||
| 1284 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1285 | DW result ;AN000; | ||
| 1286 | DW reroute_values ;AN000; | ||
| 1287 | DB 1 ;AN000; | ||
| 1288 | |||
| 1289 | LPT3_equal DB "LPT3=",0 ;AN000; | ||
| 1290 | |||
| 1291 | first_con_pos_control LABEL BYTE ;AN000; | ||
| 1292 | |||
| 1293 | DW simple_string ;AN000;CP, code, codepage | ||
| 1294 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1295 | DW result ;AN000; | ||
| 1296 | DW OFFSET first_CON_pos_values ;AN000; | ||
| 1297 | DB 0 ;AN000;no synonyms | ||
| 1298 | |||
| 1299 | |||
| 1300 | second_con_pos_control LABEL BYTE ;AN000; | ||
| 1301 | |||
| 1302 | DW simple_string ;AN000;REFRESH | ||
| 1303 | DW 0 ;AN000;don't capitalize, leave colon | ||
| 1304 | DW result ;AN000; | ||
| 1305 | DW OFFSET second_CON_pos_values ;AN000; | ||
| 1306 | DB 0 ;AN000;no synonyms | ||
| 1307 | |||
| 1308 | first_old_con_pos_control LABEL BYTE ;AN000; | ||
| 1309 | |||
| 1310 | DW simple_string+numeric ;AN000;r, l or screen lines request | ||
| 1311 | DW 0 ;AN000;don't capitalize | ||
| 1312 | DW result ;AN000; | ||
| 1313 | DW OFFSET first_old_CON_pos_values ;AN000; | ||
| 1314 | DB 0 ;AN000;no synonyms | ||
| 1315 | |||
| 1316 | |||
| 1317 | second_old_con_pos_control LABEL BYTE ;AN000; | ||
| 1318 | |||
| 1319 | DW simple_string+optional ;AN000;T | ||
| 1320 | DW 0 ;AN000;don't capitalize | ||
| 1321 | DW result ;AN000; | ||
| 1322 | DW OFFSET second_old_CON_pos_values ;AN000; | ||
| 1323 | DB 0 ;AN000;no synonyms | ||
| 1324 | |||
| 1325 | first_old_CON_pos_values LABEL BYTE ;all valid forms of shift direction, and screen line values ;AN000; | ||
| 1326 | |||
| 1327 | DB include_string_list ;AN000;have list of strings | ||
| 1328 | |||
| 1329 | DB 0 ;no number ranges ;AN000; | ||
| 1330 | |||
| 1331 | DB number_of_CON_lines_numbers ;number of rows choices;AN000; | ||
| 1332 | |||
| 1333 | DB twentyfive_item_tag ;AN000; | ||
| 1334 | DD 25 ;AN000; | ||
| 1335 | DB fourtythree_item_tag ;AN000; | ||
| 1336 | DD 43 ;AN000; | ||
| 1337 | DB fifty_item_tag ;AN000; | ||
| 1338 | DD 50 ;AN000; | ||
| 1339 | |||
| 1340 | DB number_of_shift_forms ;number of shift strings AN000; | ||
| 1341 | |||
| 1342 | start_shift_forms LABEL BYTE ;AN000; | ||
| 1343 | |||
| 1344 | |||
| 1345 | DB R_item_tag ;AN000; | ||
| 1346 | DW OFFSET R_str ;AN000; | ||
| 1347 | DB L_item_tag ;AN000; | ||
| 1348 | DW OFFSET L_str ;AN000; | ||
| 1349 | |||
| 1350 | |||
| 1351 | number_of_shift_forms EQU ($ - start_shift_forms)/3 ;3 bytes per entry;AN000; | ||
| 1352 | |||
| 1353 | |||
| 1354 | second_old_CON_pos_values LABEL BYTE ;all valid forms of T ;AN000; | ||
| 1355 | |||
| 1356 | DB include_string_list ;AN000;have list of strings | ||
| 1357 | |||
| 1358 | DB 0 ;no number ranges ;AN000; | ||
| 1359 | |||
| 1360 | DB 0 ;no number list ;AN000; | ||
| 1361 | |||
| 1362 | DB number_of_T_forms ;number of T strings AN000; | ||
| 1363 | |||
| 1364 | start_T_forms LABEL BYTE ;AN000; | ||
| 1365 | |||
| 1366 | |||
| 1367 | DB T_item_tag ;AN000; | ||
| 1368 | DW OFFSET T_str ;AN000; | ||
| 1369 | |||
| 1370 | |||
| 1371 | number_of_T_forms EQU ($ - start_T_forms)/3 ;3 bytes per entry;AN000; | ||
| 1372 | |||
| 1373 | |||
| 1374 | first_CON_pos_values LABEL BYTE ;all valid forms of codepage;AN000; | ||
| 1375 | |||
| 1376 | DB include_string_list ;AN000;have list of strings | ||
| 1377 | |||
| 1378 | DB 0 ;no number ranges ;AN000; | ||
| 1379 | |||
| 1380 | DB 0 ;no number list ;AN000; | ||
| 1381 | |||
| 1382 | DB number_of_CP_forms ;number of cp strings AN000; | ||
| 1383 | |||
| 1384 | start_CP_forms LABEL BYTE ;AN000; | ||
| 1385 | |||
| 1386 | |||
| 1387 | ;codepage strings | ||
| 1388 | |||
| 1389 | DB CODEPAGE_item_tag ;AN000; | ||
| 1390 | DW OFFSET CODE_str ;AN000; | ||
| 1391 | DB CODEPAGE_item_tag ;AN000; | ||
| 1392 | DW OFFSET CODEPAGE_str ;AN000; | ||
| 1393 | DB CODEPAGE_item_tag ;AN000; | ||
| 1394 | DW OFFSET CP_str ;AN000; | ||
| 1395 | |||
| 1396 | ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms | ||
| 1397 | |||
| 1398 | DB REFRESH_item_tag ;AC007; | ||
| 1399 | DW OFFSET REF_str ;AC007; | ||
| 1400 | DB REFRESH_item_tag ;AC007; | ||
| 1401 | DW OFFSET REFRESH_str ;AC007; | ||
| 1402 | |||
| 1403 | number_of_CP_forms EQU ($ - start_CP_forms)/3 ;3 bytes per entry;AN000; | ||
| 1404 | |||
| 1405 | |||
| 1406 | second_CON_pos_values LABEL BYTE ;all valid forms of REFRESH;AN000; | ||
| 1407 | |||
| 1408 | DB include_string_list ;AN000;have list of strings | ||
| 1409 | |||
| 1410 | DB 0 ;no number ranges ;AN000; | ||
| 1411 | |||
| 1412 | DB 0 ;no number list ;AN000; | ||
| 1413 | |||
| 1414 | DB number_of_REFRESH_forms ;number of REFRESH strings AN000; | ||
| 1415 | |||
| 1416 | start_REFRESH_forms LABEL BYTE ;AN000; | ||
| 1417 | |||
| 1418 | DB REFRESH_item_tag ;AN000; | ||
| 1419 | DW OFFSET REF_str ;AN000; | ||
| 1420 | DB REFRESH_item_tag ;AN000; | ||
| 1421 | DW OFFSET REFRESH_str ;AN000; | ||
| 1422 | |||
| 1423 | number_of_REFRESH_forms EQU ($ - start_REFRESH_forms)/3 ;3 bytes per entry;AN000; | ||
| 1424 | |||
| 1425 | |||
| 1426 | BAUD_values LABEL BYTE ;AN000;;all valid baud rates | ||
| 1427 | |||
| 1428 | DB include_string_list ;AN000;have list of numbers and two strings | ||
| 1429 | |||
| 1430 | DB 0 ;AN000; | ||
| 1431 | |||
| 1432 | DB 0 ;AN000;no numeric representations | ||
| 1433 | |||
| 1434 | DB number_of_baud_strings ;AN000;number of baud rates that are being used for other parameters also | ||
| 1435 | |||
| 1436 | start_baud_strings LABEL BYTE ;AN000; | ||
| 1437 | |||
| 1438 | DB oneten_item_tag ;AN000; | ||
| 1439 | DW OFFSET oneten_str ;AN000; | ||
| 1440 | DB oneten_item_tag ;AN000; | ||
| 1441 | DW OFFSET eleven_str ;AN000;;"11" first two chars of 110 | ||
| 1442 | DB onefifty_item_tag ;AN000; | ||
| 1443 | DW OFFSET fifteen_str ;AN000; | ||
| 1444 | DB onefifty_item_tag ;AN000; | ||
| 1445 | DW OFFSET onefifty_str ;AN000; | ||
| 1446 | DB threehundred_item_tag ;AN000; | ||
| 1447 | DW OFFSET thirty_str ;AN000; | ||
| 1448 | DB threehundred_item_tag ;AN000; | ||
| 1449 | DW OFFSET threehundred_str ;AN000; | ||
| 1450 | DB sixhundred_item_tag ;AN000; | ||
| 1451 | DW OFFSET sixty_str ;AN000; | ||
| 1452 | DB sixhundred_item_tag ;AN000; | ||
| 1453 | DW OFFSET sixhundred_str ;AN000; | ||
| 1454 | DB twelvehundred_item_tag ;AN000; | ||
| 1455 | DW OFFSET twelve_str ;AN000; | ||
| 1456 | DB twelvehundred_item_tag ;AN000; | ||
| 1457 | DW OFFSET twelvehundred_str ;AN000; | ||
| 1458 | DB twentyfourhundred_item_tag ;AN000; | ||
| 1459 | DW OFFSET twentyfour_str ;AN000;24 is also a typamatic rate | ||
| 1460 | DB twentyfourhundred_item_tag ;AN000; | ||
| 1461 | DW OFFSET twentyfourhundred_str ;AN000; | ||
| 1462 | DB fourtyeighthundred_item_tag ;AN000; | ||
| 1463 | DW OFFSET fourtyeight_str ;AN000; | ||
| 1464 | DB fourtyeighthundred_item_tag ;AN000; | ||
| 1465 | DW OFFSET fourtyeighthundred_str ;AN000; | ||
| 1466 | DB ninetysixhundred_item_tag ;AN000; | ||
| 1467 | DW OFFSET ninetysix_str ;AN000; | ||
| 1468 | DB ninetysixhundred_item_tag ;AN000; | ||
| 1469 | DW OFFSET ninetysixhundred_str ;AN000; | ||
| 1470 | DB nineteentwohundred_item_tag ;AN000;;item tag | ||
| 1471 | DW OFFSET nineteentwohundred_str ;AN000;;pointer to string | ||
| 1472 | DB nineteentwohundred_item_tag ;AN000;;item tag | ||
| 1473 | DW OFFSET nineteen_point_two_str ;AN000; | ||
| 1474 | DB nineteentwohundred_item_tag ;AN000; ;item tag | ||
| 1475 | DW OFFSET nineteen_str ;AN000; ;used for RATE= also | ||
| 1476 | DB nineteentwohundred_item_tag ;AN000; ;item tag | ||
| 1477 | DW OFFSET nineteen_point_two_K_str ;AN000;pointer to string "19.2K" | ||
| 1478 | |||
| 1479 | number_of_baud_strings EQU ($ - start_baud_strings)/3 ;AN000;3 bytes per entry | ||
| 1480 | |||
| 1481 | |||
| 1482 | |||
| 1483 | PARITY_values LABEL BYTE ;AN000;all valid paritys | ||
| 1484 | |||
| 1485 | DB include_string_list ;AN000;have list of strings | ||
| 1486 | |||
| 1487 | DB 0 ;AN000; | ||
| 1488 | |||
| 1489 | DB 0 ;AN000;;no number choices | ||
| 1490 | |||
| 1491 | DB number_of_paritys ;AN000;;number of valid paritys | ||
| 1492 | |||
| 1493 | start_paritys LABEL BYTE ;AN000; | ||
| 1494 | |||
| 1495 | DB none_item_tag ;AN000; | ||
| 1496 | DW OFFSET N_str ;AN000; | ||
| 1497 | DB none_item_tag ;AN000; | ||
| 1498 | DW OFFSET NONE_str ;AN000; | ||
| 1499 | DB even_item_tag ;AN000; | ||
| 1500 | DW OFFSET EVEN_str ;AN000; | ||
| 1501 | DB even_item_tag ;AN000; | ||
| 1502 | DW OFFSET E_str ;AN000; | ||
| 1503 | DB odd_item_tag ;AN663; | ||
| 1504 | DW OFFSET O_str ;AN663; | ||
| 1505 | DB odd_item_tag ;AN000; | ||
| 1506 | DW OFFSET ODD_str ;AN000; | ||
| 1507 | DB MARK_item_tag ;AN663; | ||
| 1508 | DW OFFSET m_str ;AN663; | ||
| 1509 | DB MARK_item_tag ;AN000; | ||
| 1510 | DW OFFSET mark_str ;AN000; | ||
| 1511 | DB SPACE_item_tag ;AN663; | ||
| 1512 | DW OFFSET s_str ;AN663; | ||
| 1513 | DB SPACE_item_tag ;AN000; | ||
| 1514 | DW OFFSET space_str ;AN000; | ||
| 1515 | |||
| 1516 | number_of_paritys EQU ($ - start_paritys)/3 ;AN000;3 bytes per entry | ||
| 1517 | |||
| 1518 | |||
| 1519 | DATA_values LABEL BYTE ;AN000;all valid DATA values | ||
| 1520 | |||
| 1521 | DB include_string_list ;AC663;have list of numbers | ||
| 1522 | |||
| 1523 | DB 0 ;AN000;no number ranges | ||
| 1524 | |||
| 1525 | DB 0 ;AN000;no number choices | ||
| 1526 | |||
| 1527 | DB number_of_databits ;AN000;string choices | ||
| 1528 | |||
| 1529 | start_databits LABEL BYTE ;AN000; | ||
| 1530 | |||
| 1531 | DB five_item_tag ;AN000; | ||
| 1532 | DW OFFSET five_str ;AN000; | ||
| 1533 | DB six_item_tag ;AN000; | ||
| 1534 | DW OFFSET six_str ;AN000; | ||
| 1535 | DB seven_item_tag ;AN000; | ||
| 1536 | DW OFFSET seven_str ;AN000; | ||
| 1537 | DB eight_item_tag ;AN000; | ||
| 1538 | DW OFFSET eight_str ;AN000; | ||
| 1539 | |||
| 1540 | number_of_databits EQU ($ - start_databits)/3 ;AN000;3 bytes per entry | ||
| 1541 | |||
| 1542 | |||
| 1543 | STOP_values LABEL BYTE ;AN000;;all valid stop bits | ||
| 1544 | |||
| 1545 | DB include_string_list ;AN000;have list of numbers and list of strings | ||
| 1546 | |||
| 1547 | DB 0 ;AN000; | ||
| 1548 | |||
| 1549 | DB 0 ;AN000; ;no number choices | ||
| 1550 | |||
| 1551 | DB number_of_stopbit_strings ;AN000;;choices in string form | ||
| 1552 | |||
| 1553 | start_stopbit_strings LABEL BYTE ;AN000; | ||
| 1554 | |||
| 1555 | DB one_item_tag ;AN000; | ||
| 1556 | DW OFFSET one_str ;AN000; | ||
| 1557 | DB one_point_five_item_tag ;AN000; | ||
| 1558 | DW OFFSET one_point_five_str ;AN000; | ||
| 1559 | DB two_item_tag ;AN000; | ||
| 1560 | DW OFFSET two_str ;AN000; | ||
| 1561 | |||
| 1562 | number_of_stopbit_strings EQU ($ - start_stopbit_strings)/3 ;AN000;3 bytes per entry | ||
| 1563 | |||
| 1564 | |||
| 1565 | |||
| 1566 | RETRY_values LABEL BYTE ;AN000;;all valid RETRY settings | ||
| 1567 | |||
| 1568 | DB include_string_list ;AN000;have list of strings | ||
| 1569 | |||
| 1570 | DB 0 ;AN000; | ||
| 1571 | |||
| 1572 | DB 0 ;AN000;;no number choices | ||
| 1573 | |||
| 1574 | DB number_of_retry_settings ;AN000; | ||
| 1575 | |||
| 1576 | start_retry_settings LABEL BYTE ;AN000; | ||
| 1577 | |||
| 1578 | DB B_item_tag ;AN000; | ||
| 1579 | DW OFFSET B_str ;AN000; | ||
| 1580 | DB E_item_tag ;AN000; | ||
| 1581 | DW OFFSET E_str ;AN000; | ||
| 1582 | DB R_item_tag ;AN000; | ||
| 1583 | DW OFFSET R_str ;AN000; | ||
| 1584 | DB NONE_item_tag ;AN663; | ||
| 1585 | DW OFFSET N_str ;AN663; | ||
| 1586 | DB NONE_item_tag ;AN000; | ||
| 1587 | DW OFFSET NONE_str ;AN000; | ||
| 1588 | DB P_item_tag ;AN000; | ||
| 1589 | DW OFFSET P_str ;AN000; | ||
| 1590 | |||
| 1591 | number_of_retry_settings EQU ($ - start_retry_settings)/3 ;AN000;3 bytes per entry | ||
| 1592 | |||
| 1593 | |||
| 1594 | |||
| 1595 | PREPARE_values LABEL BYTE ;AN000;almost any numeric value is valid | ||
| 1596 | |||
| 1597 | DB ranges_only ;AN000;;have range of numbers | ||
| 1598 | |||
| 1599 | DB 1 ;AN000;;one range | ||
| 1600 | |||
| 1601 | DB codepage_item_tag ;AN000; | ||
| 1602 | DD min_codepage_value ;AN000; | ||
| 1603 | DD max_codepage_value ;AN000; | ||
| 1604 | |||
| 1605 | |||
| 1606 | |||
| 1607 | |||
| 1608 | SELECT_values LABEL BYTE ;AN000;all valid baud rates | ||
| 1609 | |||
| 1610 | DB ranges_only ;AN000;;have range of numbers | ||
| 1611 | |||
| 1612 | DB 1 ;AN000; | ||
| 1613 | |||
| 1614 | DB codepage_item_tag ;AN000;;item tag for the range | ||
| 1615 | DD min_codepage_value ;AN000; | ||
| 1616 | DD max_codepage_value ;AN000; | ||
| 1617 | |||
| 1618 | |||
| 1619 | DELAY_values LABEL BYTE ;AN000;;all valid delay rates | ||
| 1620 | |||
| 1621 | DB ranges_only ;AN000;;have range of numbers | ||
| 1622 | |||
| 1623 | DB 1 ;AN000;;1 range | ||
| 1624 | DB range_item_tag ;AN000;;don't ever need this item tag | ||
| 1625 | DD 1 ;AN000;;smallest valid delay value | ||
| 1626 | DD 4 ;AN000;;largest valid delay value | ||
| 1627 | |||
| 1628 | |||
| 1629 | |||
| 1630 | RATE_values LABEL BYTE ;AN000;;all valid typamatic rates | ||
| 1631 | |||
| 1632 | DB ranges_only ;AN000;;have range of numbers | ||
| 1633 | |||
| 1634 | DB 1 ;AN000;;1 range | ||
| 1635 | DB range_item_tag ;AN000;;never used | ||
| 1636 | DD 1 ;AN000;;smallest valid rate | ||
| 1637 | DD 32 ;AN000;;largest valid rate | ||
| 1638 | |||
| 1639 | |||
| 1640 | |||
| 1641 | |||
| 1642 | CON_COLUMNS_values LABEL BYTE ;AN000;all valid columns values for the screen | ||
| 1643 | |||
| 1644 | DB include_number_list ;AN000; ;have list of numbers | ||
| 1645 | |||
| 1646 | DB 0 ;AN000;only numeric representations | ||
| 1647 | |||
| 1648 | DB number_of_CON_columns_numbers ;AN000;choices represented as numbers | ||
| 1649 | |||
| 1650 | start_CON_columns_numbers LABEL BYTE ;AN000; | ||
| 1651 | |||
| 1652 | DB fourty_item_tag ;AN000; | ||
| 1653 | DD 40 ;AN000; | ||
| 1654 | DB eighty_item_tag ; ;AN000; | ||
| 1655 | DD 80 ;AN000;numbers because used in call to IOCTL | ||
| 1656 | |||
| 1657 | number_of_CON_columns_numbers EQU ($ - start_CON_columns_numbers)/5 ;5 bytes per entry;AN000; | ||
| 1658 | |||
| 1659 | |||
| 1660 | |||
| 1661 | CON_LINES_values LABEL BYTE ;all valid LINES= values for the screen;AN000; | ||
| 1662 | |||
| 1663 | DB include_number_list ;have list of numbers;AN000; | ||
| 1664 | |||
| 1665 | DB 0 ;AN000; | ||
| 1666 | |||
| 1667 | DB number_of_CON_lines_numbers ; number ch;AN000; | ||
| 1668 | |||
| 1669 | start_CON_lines_numbers LABEL BYTE ;AN000; | ||
| 1670 | |||
| 1671 | DB twentyfive_item_tag ;AN000; | ||
| 1672 | DD 25 ;AN000; | ||
| 1673 | DB fourtythree_item_tag ;AN000; | ||
| 1674 | DD 43 ;AN000; | ||
| 1675 | DB fifty_item_tag ;AN000; | ||
| 1676 | DD 50 ;AN000; | ||
| 1677 | |||
| 1678 | number_of_CON_lines_numbers EQU ($ - start_CON_lines_numbers)/5 ;5 bytes per entry;AN000; | ||
| 1679 | |||
| 1680 | |||
| 1681 | |||
| 1682 | |||
| 1683 | LPT_COLUMNS_values LABEL BYTE ;AN000;all valid columns values for parallel printers | ||
| 1684 | |||
| 1685 | DB include_string_list ;AN000;;have list of strings | ||
| 1686 | |||
| 1687 | DB 0 ;AN000; | ||
| 1688 | |||
| 1689 | DB 0 ;AN000;no numeric representations | ||
| 1690 | |||
| 1691 | DB number_of_lpt_columns_strings ;AN000;;choices represented as strings | ||
| 1692 | |||
| 1693 | start_LPT_columns_strings LABEL BYTE ;AN000; | ||
| 1694 | |||
| 1695 | DB eighty_item_tag ; ;AN000; | ||
| 1696 | DW OFFSET eighty_str ;AN000;;strings because values also used as positional parms | ||
| 1697 | DB onethirtytwo_item_tag ;AN000; | ||
| 1698 | DW OFFSET onethirtytwo_str ;AN000; | ||
| 1699 | |||
| 1700 | number_of_LPT_columns_strings EQU ($ - start_LPT_columns_strings)/3 ;3 bytes per entry;AN000; | ||
| 1701 | |||
| 1702 | |||
| 1703 | |||
| 1704 | LPT_LINES_values LABEL BYTE ;AN000;all valid LINES= values for the screen | ||
| 1705 | |||
| 1706 | DB include_string_list ;AN000;have list of strings | ||
| 1707 | |||
| 1708 | DB 0 ;AN000; | ||
| 1709 | |||
| 1710 | DB 0 ;AN000; ;no number choices | ||
| 1711 | |||
| 1712 | DB number_of_LPT_lines_strings ;AN000; | ||
| 1713 | |||
| 1714 | start_LPT_lines_strings LABEL BYTE ;AN000; | ||
| 1715 | |||
| 1716 | DB six_item_tag ;AN000;;for printer | ||
| 1717 | DW OFFSET six_str ;AN000; | ||
| 1718 | DB eight_item_tag ;AN000;;for printer | ||
| 1719 | DW OFFSET eight_str ;AN000; | ||
| 1720 | |||
| 1721 | number_of_LPT_lines_strings EQU ($ - start_LPT_lines_strings)/3 ;AN000;3 bytes per entry | ||
| 1722 | |||
| 1723 | |||
| 1724 | reroute_values LABEL BYTE ;AN000;;all valid destination devices for parallel printer reroute | ||
| 1725 | |||
| 1726 | DB include_string_list ;AN000; ;have list of numbers and one string | ||
| 1727 | |||
| 1728 | DB 0 ;AN000; | ||
| 1729 | |||
| 1730 | DB 0 ;AN000;;no number choices | ||
| 1731 | |||
| 1732 | DB number_of_reroute_strings ;AN000; | ||
| 1733 | |||
| 1734 | start_reroute_strings LABEL BYTE ;AN000; | ||
| 1735 | |||
| 1736 | DB COM1_item_tag ;AN000; | ||
| 1737 | DW OFFSET COM1_str ;AN000; | ||
| 1738 | DB COM2_item_tag ;AN000; | ||
| 1739 | DW OFFSET COM2_str ;AN000; | ||
| 1740 | DB COM3_item_tag ;AN000; | ||
| 1741 | DW OFFSET COM3_str ;AN000; | ||
| 1742 | DB COM4_item_tag ;AN000; | ||
| 1743 | DW OFFSET COM4_str ;AN000; | ||
| 1744 | |||
| 1745 | number_of_reroute_strings EQU ($ - start_reroute_strings)/3 ;AN000;3 bytes per entry | ||
| 1746 | |||
| 1747 | |||
| 1748 | |||
| 1749 | |||
| 1750 | Sw_control LABEL BYTE ;AN000; | ||
| 1751 | |||
| 1752 | DW 0 ;AN000;no values allowed on /STATUS | ||
| 1753 | function_flag DW 0 ;AN000;no values allowed on /STATUS | ||
| 1754 | DW result ;AN000;same buffer as for other parms | ||
| 1755 | DW Sw_values ;AN000; | ||
| 1756 | num_synonyms DB 3 ;AN000;3 ways to specify /STATUS | ||
| 1757 | slash_sta DB "/STA",0 ;AN000; | ||
| 1758 | slash_stat DB "/STAT",0 ;AN000; | ||
| 1759 | slash_status DB "/STATUS",0 ;AN000; | ||
| 1760 | |||
| 1761 | |||
| 1762 | |||
| 1763 | |||
| 1764 | |||
| 1765 | |||
| 1766 | Sw_values LABEL BYTE ;AN000; | ||
| 1767 | |||
| 1768 | DB 0 ;AN000;no values allowed on /STATUS | ||
| 1769 | |||
| 1770 | |||
| 1771 | first_pos_values LABEL BYTE ;AN000;value list for all positional parameters that appear first | ||
| 1772 | |||
| 1773 | DB include_string_list ;AN000; ;have string values | ||
| 1774 | |||
| 1775 | DB 0 ;AN000;numerics treated as strings | ||
| 1776 | |||
| 1777 | DB 0 ;AN000;no number choices | ||
| 1778 | |||
| 1779 | DB number_of_first_positional_strings ;AN000; | ||
| 1780 | |||
| 1781 | start_first_positional_strings LABEL BYTE ;used to calculate previous field;AN000; | ||
| 1782 | |||
| 1783 | ;screen modes | ||
| 1784 | |||
| 1785 | DB BW40_item_tag ;AC000; | ||
| 1786 | DW OFFSET BW40_str ;AC000; | ||
| 1787 | DB BW80_item_tag ;AC000; | ||
| 1788 | DW OFFSET BW80_str ;AC000; | ||
| 1789 | DB CO40_item_tag ;AC000; | ||
| 1790 | DW OFFSET CO40_str ;AC000; | ||
| 1791 | DB CO80_item_tag ;AC000; | ||
| 1792 | DW OFFSET CO80_str ;AC000; | ||
| 1793 | DB MONO_item_tag ;AC000; | ||
| 1794 | DW OFFSET MONO_str ;AC000; | ||
| 1795 | DB fourty_item_tag ;AC000; | ||
| 1796 | DW OFFSET fourty_str ;AC000; | ||
| 1797 | DB eighty_item_tag ;AC000; | ||
| 1798 | DW OFFSET eighty_str ;AC000; | ||
| 1799 | |||
| 1800 | |||
| 1801 | DB con_item_tag ;AN000; | ||
| 1802 | DW OFFSET con_str ;AN000; | ||
| 1803 | |||
| 1804 | ;com port names | ||
| 1805 | |||
| 1806 | DB COM1_item_tag ;AN000; | ||
| 1807 | DW OFFSET COM1_str ;AN000; | ||
| 1808 | DB COM2_item_tag ;AN000; | ||
| 1809 | DW OFFSET COM2_str ;AN000; | ||
| 1810 | DB COM3_item_tag ;AN000; | ||
| 1811 | DW OFFSET COM3_str ;AN000; | ||
| 1812 | DB COM4_item_tag ;AN000; | ||
| 1813 | DW OFFSET COM4_str ;AN000; | ||
| 1814 | |||
| 1815 | ;printer port names | ||
| 1816 | |||
| 1817 | DB PRN_item_tag ;AN000; | ||
| 1818 | DW OFFSET PRN_str ;AN000; | ||
| 1819 | DB LPT1_item_tag ;AN000; | ||
| 1820 | DW OFFSET LPT1_str ;AN000; | ||
| 1821 | DB LPT2_item_tag ;AN000; | ||
| 1822 | DW OFFSET LPT2_str ;AN000; | ||
| 1823 | DB LPT3_item_tag ;AN000; | ||
| 1824 | DW OFFSET LPT3_str ;AN000; | ||
| 1825 | |||
| 1826 | ;LPT special cases | ||
| 1827 | |||
| 1828 | DB LPT1132_item_tag ;AN000; | ||
| 1829 | DW OFFSET LPT1132_str;AN000; | ||
| 1830 | DB LPT2132_item_tag ;AN000; | ||
| 1831 | DW OFFSET LPT2132_str;AN000; | ||
| 1832 | DB LPT3132_item_tag ;AN000; | ||
| 1833 | DW OFFSET LPT3132_str;AN000; | ||
| 1834 | DB LPT180_item_tag ;AN000; | ||
| 1835 | DW OFFSET LPT180_str ;AN000; | ||
| 1836 | DB LPT280_item_tag ;AN000; | ||
| 1837 | DW OFFSET LPT280_str ;AN000; | ||
| 1838 | DB LPT380_item_tag ;AN000; | ||
| 1839 | DW OFFSET LPT380_str ;AN000; | ||
| 1840 | |||
| 1841 | |||
| 1842 | number_of_first_positional_strings EQU ($ - start_first_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000; | ||
| 1843 | |||
| 1844 | |||
| 1845 | |||
| 1846 | second_pos_values LABEL BYTE ;AN000;;value list for all positional parameters that appear second | ||
| 1847 | |||
| 1848 | DB include_string_list ;AN000; ;have string values | ||
| 1849 | |||
| 1850 | DB 0 ;AN000;numerics treated as strings | ||
| 1851 | |||
| 1852 | DB 0 ;AN000;no number choices | ||
| 1853 | |||
| 1854 | DB number_of_second_positional_strings ;AN000; | ||
| 1855 | |||
| 1856 | start_second_positional_strings LABEL BYTE ;used to calculate previous field;AN000; | ||
| 1857 | |||
| 1858 | |||
| 1859 | ;codepage strings | ||
| 1860 | |||
| 1861 | DB CODEPAGE_item_tag ;AN000; | ||
| 1862 | DW OFFSET CODE_str ;AN000; | ||
| 1863 | DB CODEPAGE_item_tag ;AN000; | ||
| 1864 | DW OFFSET CODEPAGE_str ;AN000; | ||
| 1865 | DB CODEPAGE_item_tag ;AN000; | ||
| 1866 | DW OFFSET CP_str ;AN000; | ||
| 1867 | |||
| 1868 | ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms | ||
| 1869 | |||
| 1870 | DB REFRESH_item_tag ;AC007; | ||
| 1871 | DW OFFSET REF_str ;AC007; | ||
| 1872 | DB REFRESH_item_tag ;AC007; | ||
| 1873 | DW OFFSET REFRESH_str ;AC007; | ||
| 1874 | |||
| 1875 | ;shift directions | ||
| 1876 | |||
| 1877 | DB L_item_tag ;AN000; | ||
| 1878 | DW OFFSET L_str ;AN000; | ||
| 1879 | DB R_item_tag ;AN000; | ||
| 1880 | DW OFFSET R_str ;AN000; | ||
| 1881 | |||
| 1882 | |||
| 1883 | ;columns values | ||
| 1884 | |||
| 1885 | ; DB eighty_item_tag ;AN000; | ||
| 1886 | ; DW OFFSET eighty_str ;AN000; ;strings because values also used as positional parms | ||
| 1887 | DB onethirtytwo_item_tag;AN000; | ||
| 1888 | DW OFFSET onethirtytwo_str ;AN000; | ||
| 1889 | |||
| 1890 | number_of_second_positional_strings EQU ($ - start_second_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000; | ||
| 1891 | |||
| 1892 | |||
| 1893 | third_pos_values LABEL BYTE ;AN000;value list for all positional parameters that appear third | ||
| 1894 | |||
| 1895 | DB include_string_list ;AN000; ;have string values | ||
| 1896 | |||
| 1897 | DB 0 ;AN000;numerics treated as strings | ||
| 1898 | |||
| 1899 | DB 0 ;AN000;no number choices | ||
| 1900 | |||
| 1901 | DB number_of_third_positional_strings ;AN000; | ||
| 1902 | |||
| 1903 | start_third_positional_strings LABEL BYTE ;used to calculate previous field;AN000; | ||
| 1904 | |||
| 1905 | number_of_third_positional_strings EQU ($ - start_third_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000; | ||
| 1906 | |||
| 1907 | |||
| 1908 | first_lpt_pos_values LABEL BYTE ;AN000;value list for all possible chars per line | ||
| 1909 | |||
| 1910 | DB include_string_list ;AN000; ;have string values | ||
| 1911 | |||
| 1912 | DB 0 ;AN000;numerics treated as strings | ||
| 1913 | |||
| 1914 | DB 0 ;AN000;no number choices | ||
| 1915 | |||
| 1916 | DB number_of_first_lpt_positional_strings ;AN000; | ||
| 1917 | |||
| 1918 | start_first_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000; | ||
| 1919 | |||
| 1920 | DB eighty_item_tag | ||
| 1921 | DW OFFSET eighty_str | ||
| 1922 | DB onethirtytwo_item_tag | ||
| 1923 | DW OFFSET onethirtytwo_str ;AN000; | ||
| 1924 | DB CODEPAGE_item_tag | ||
| 1925 | DW OFFSET CODE_str ;AN000; | ||
| 1926 | DB CODEPAGE_item_tag ;AN000; | ||
| 1927 | DW OFFSET CODEPAGE_str ;AN000; | ||
| 1928 | DB CODEPAGE_item_tag ;AN000; | ||
| 1929 | DW OFFSET CP_str ;AN000; | ||
| 1930 | |||
| 1931 | ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms | ||
| 1932 | |||
| 1933 | DB REFRESH_item_tag ;AC007; | ||
| 1934 | DW OFFSET REF_str ;AC007; | ||
| 1935 | DB REFRESH_item_tag ;AC007; | ||
| 1936 | DW OFFSET REFRESH_str ;AC007; | ||
| 1937 | |||
| 1938 | number_of_first_lpt_positional_strings EQU ($ - start_first_lpt_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000; | ||
| 1939 | |||
| 1940 | |||
| 1941 | second_lpt_pos_values LABEL BYTE ;AN000;value list for all possible lines per inch | ||
| 1942 | |||
| 1943 | DB include_string_list ;AN000; ;have string values | ||
| 1944 | |||
| 1945 | DB 0 ;AN000;numerics treated as strings | ||
| 1946 | |||
| 1947 | DB 0 ;AN000;no number choices | ||
| 1948 | |||
| 1949 | DB number_of_second_lpt_positional_strings ;AN000; | ||
| 1950 | |||
| 1951 | start_second_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000; | ||
| 1952 | |||
| 1953 | DB eight_item_tag ;AN000; | ||
| 1954 | DW OFFSET eight_str ;AN000; | ||
| 1955 | DB six_item_tag ;AN000; | ||
| 1956 | DW OFFSET six_str ;AN000; | ||
| 1957 | DB REFRESH_item_tag ;AN000; | ||
| 1958 | DW OFFSET REF_str ;AN000; | ||
| 1959 | DB REFRESH_item_tag ;AN000; | ||
| 1960 | DW OFFSET REFRESH_str ;AN000; | ||
| 1961 | |||
| 1962 | number_of_second_lpt_positional_strings EQU ($ - start_second_lpt_positional_strings)/3 ;3 bytes per entry (byte,word);AN000; | ||
| 1963 | |||
| 1964 | |||
| 1965 | third_lpt_pos_values LABEL BYTE ;AN000;value list for all possible retry settings | ||
| 1966 | |||
| 1967 | DB include_string_list ;AN000; ;have string values | ||
| 1968 | |||
| 1969 | DB 0 ;AN000;no numeric ranges | ||
| 1970 | |||
| 1971 | DB 0 ;AN000;no number choices | ||
| 1972 | |||
| 1973 | DB number_of_third_lpt_positional_strings ;AN000; | ||
| 1974 | |||
| 1975 | start_third_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000; | ||
| 1976 | |||
| 1977 | DB B_item_tag ;AN000; | ||
| 1978 | DW OFFSET B_str ;AN000; | ||
| 1979 | DB E_item_tag ;AN000; | ||
| 1980 | DW OFFSET E_str ;AN000; | ||
| 1981 | DB R_item_tag ;AN000; | ||
| 1982 | DW OFFSET R_str ;AN000; | ||
| 1983 | DB NONE_item_tag ;AN663; | ||
| 1984 | DW OFFSET N_str ;AN663; | ||
| 1985 | DB NONE_item_tag ;AN000; | ||
| 1986 | DW OFFSET NONE_str ;AN000; | ||
| 1987 | DB OFF_item_tag ;AN000; | ||
| 1988 | DW OFFSET OFF_str ;AN000; | ||
| 1989 | DB P_item_tag | ||
| 1990 | DW OFFSET P_str | ||
| 1991 | |||
| 1992 | number_of_third_lpt_positional_strings EQU ($ - start_third_lpt_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000; | ||
| 1993 | |||
| 1994 | |||
| 1995 | |||
| 1996 | ;strings | ||
| 1997 | |||
| 1998 | ;AN000; | ||
| 1999 | zero_str DB "0",0 ;AN000; | ||
| 2000 | one_str DB "1",0 ;AN000; | ||
| 2001 | one_point_five_str DB "1.5",0 ;AN000; | ||
| 2002 | two_str DB "2",0 ;AN000; | ||
| 2003 | three_str DB "3",0 ;AN000; | ||
| 2004 | four_str DB "4",0 ;AN000; | ||
| 2005 | five_str DB "5",0 ;AN000; ;data bit, typamatic rate | ||
| 2006 | six_str DB "6",0 ;AN000; | ||
| 2007 | seven_str DB "7",0 ;AN000; | ||
| 2008 | eight_str DB "8",0 ;AN000; | ||
| 2009 | nine_str DB "9",0 ;AN000; | ||
| 2010 | eleven_str DB "11",0 ;AN000; ;first two chars of 110 | ||
| 2011 | twelve_str DB "12",0 ;AN000; | ||
| 2012 | fifteen_str DB "15",0 ;AN000; ;abbreviated form of 150, 15 is also a RATE= candidate | ||
| 2013 | nineteen_str DB "19",0 ;AN000; ;used for baud rates and RATE= | ||
| 2014 | nineteen_point_two_str DB "19.2",0 ;AN000; | ||
| 2015 | nineteen_point_two_K_str DB "19.2K",0 ;AN000; ;mutant baud rate | ||
| 2016 | twentyfour_str DB "24",0 ;AN000; ;24 is also a typamatic rate | ||
| 2017 | thirty_str DB "30",0 ;AN000; | ||
| 2018 | fourty_str DB "40",0 ;AN000; | ||
| 2019 | fourtyeight_str DB "48",0 ;AN000; | ||
| 2020 | sixty_str DB "60",0 ;AN000; | ||
| 2021 | eighty_str DB "80",0 ;AN000; | ||
| 2022 | ninetysix_str DB "96",0 ;AN000; | ||
| 2023 | oneten_str DB "110",0 ;AN000; | ||
| 2024 | onethirtytwo_str DB "132",0 ;AN000; | ||
| 2025 | onefifty_str DB "150",0 ;AN000; | ||
| 2026 | threehundred_str DB "300",0 ;AN000; | ||
| 2027 | sixhundred_str DB "600",0 ;AN000; | ||
| 2028 | twelvehundred_str DB "1200",0 ;AN000; | ||
| 2029 | twentyfourhundred_str DB "2400",0 ;AN000; | ||
| 2030 | fourtyeighthundred_str DB "4800",0 ;AN000; | ||
| 2031 | ninetysixhundred_str DB "9600",0 ;AN000; | ||
| 2032 | nineteentwohundred_str DB "19200",0 ;AN000; | ||
| 2033 | B_str DB "B",0 ;AN000; | ||
| 2034 | BW40_str DB "BW40",0 ;AN000; | ||
| 2035 | BW80_str DB "BW80",0 ;AN000; | ||
| 2036 | CO40_str DB "CO40",0 ;AN000; | ||
| 2037 | CO80_str DB "CO80",0 ;AN000; | ||
| 2038 | CODE_str DB "CODE",0 ;AN000; | ||
| 2039 | CODEPAGE_str DB "CODEPAGE",0;AN000; | ||
| 2040 | COM_str DB "COM",0 ;AN000; | ||
| 2041 | start_COM1_str LABEL BYTE ;AN000; ;used to calculate len_COMX_str, see invoke | ||
| 2042 | COM1_str DB "COM1",0 ;AN000; | ||
| 2043 | len_COMX_str EQU $ - start_COM1_str;AN000; ;all COMX strings are the same length | ||
| 2044 | COM2_str DB "COM2",0 ;AN000; | ||
| 2045 | COM3_str DB "COM3",0 ;AN000; | ||
| 2046 | COM4_str DB "COM4",0 ;AN000; | ||
| 2047 | CON_str DB "CON",0 | ||
| 2048 | len_CON_str EQU ($ - (OFFSET CON_str)) ;AN000; | ||
| 2049 | CP_str DB "CP",0 ;AN000; | ||
| 2050 | E_str DB "E",0 ;RETRY=setting ;AN000; | ||
| 2051 | EVEN_str DB "EVEN",0 ;AN000; | ||
| 2052 | L_str DB "L",0 ;AN000; | ||
| 2053 | start_LPT1_str LABEL BYTE ;used to calculate len_LPTX_str, see invoke ;AN000; | ||
| 2054 | LPT1_str DB "LPT1",0 ;AN000; | ||
| 2055 | len_LPTX_str EQU $ - start_LPT1_str ;all LPTX strings are the same length ;AN000; | ||
| 2056 | LPT2_str DB "LPT2",0 ;AN000; | ||
| 2057 | LPT3_str DB "LPT3",0 ;AN000; | ||
| 2058 | LPT1132_str DB "LPT1132",0 ;AN000; | ||
| 2059 | LPT2132_str DB "LPT2132",0 ;AN000; | ||
| 2060 | LPT3132_str DB "LPT3132",0 ;AN000; | ||
| 2061 | LPT180_str DB "LPT180",0 ;AN000; | ||
| 2062 | LPT280_str DB "LPT280",0 ;AN000; | ||
| 2063 | LPT380_str DB "LPT380",0 ;AN000; | ||
| 2064 | M_str DB "M",0 | ||
| 2065 | MARK_str DB "MARK",0 ;AN000; | ||
| 2066 | MONO_str DB "MONO",0 ;AN000; | ||
| 2067 | N_str DB "N",0 ;AN000; | ||
| 2068 | NONE_str DB "NONE",0 ;AN000; | ||
| 2069 | O_str DB "O",0 ;AN000; | ||
| 2070 | ODD_str DB "ODD",0 ;AN000; | ||
| 2071 | OFF_str DB "OFF",0 ;AN000; | ||
| 2072 | ON_str DB "ON",0 ;AN000; | ||
| 2073 | P_str DB "P",0 ;AN000; | ||
| 2074 | PRN_str DB "PRN",0 ;AN000; | ||
| 2075 | R_str DB "R",0 ;AN000; | ||
| 2076 | REF_str DB "REF",0 ;AN000; | ||
| 2077 | REFRESH_str DB "REFRESH",0 ;AN000; | ||
| 2078 | S_str DB "S",0 | ||
| 2079 | SPACE_str DB "SPACE",0 ;AN000; | ||
| 2080 | T_str DB "T",0 ;AN000; | ||
| 2081 | |||
| 2082 | |||
| 2083 | result result_def<> ;AN000; | ||
| 2084 | |||
| 2085 | parm_lst parm_list_entry max_parms DUP (<>) ;AN000; | ||
| 2086 | |||
| 2087 | |||
| 2088 | |||
| 2089 | ;º º | ||
| 2090 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 2091 | |||
| 2092 | |||
| 2093 | ; | ||
| 2094 | ;****************************************************************************************** | ||
| 2095 | |||
| 2096 | ;------------------------------------------------------------------------------- | ||
| 2097 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 2098 | ;³ | ||
| 2099 | ;³ SEARCH_ITEM_TAGS | ||
| 2100 | ;³ ---------------- | ||
| 2101 | ;³ Search the item tags in input value list for the input item tag. | ||
| 2102 | ;³ | ||
| 2103 | ;³ | ||
| 2104 | ;³ | ||
| 2105 | ;³ | ||
| 2106 | ;³ | ||
| 2107 | ;³ | ||
| 2108 | ;³ INPUT: i_CL - first item tag in the group | ||
| 2109 | ;³ search_stop - last item_tag in the group, the sentinal for the REPEAT | ||
| 2110 | ;³ loop. | ||
| 2111 | ;³ | ||
| 2112 | ;³ | ||
| 2113 | ;³ RETURN: match_found indicates that the item tag returned by the parser was | ||
| 2114 | ;³ found in the group passed in. | ||
| 2115 | ;³ | ||
| 2116 | ;³ | ||
| 2117 | ;³ MESSAGES: none | ||
| 2118 | ;³ | ||
| 2119 | ;³ | ||
| 2120 | ;³ | ||
| 2121 | ;³ | ||
| 2122 | ;³ REGISTER | ||
| 2123 | ;³ USAGE: To be determined at I2 time. | ||
| 2124 | ;³ | ||
| 2125 | ;³ | ||
| 2126 | ;³ CONVENTIONS: | ||
| 2127 | ;³ | ||
| 2128 | ;³ | ||
| 2129 | ;³ | ||
| 2130 | ;³ | ||
| 2131 | ;³ ASSUMPTIONS: | ||
| 2132 | ;³ | ||
| 2133 | ;³ | ||
| 2134 | ;³ SIDE EFFECT: | ||
| 2135 | ;³ | ||
| 2136 | ;³ | ||
| 2137 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 2138 | |||
| 2139 | search_item_tags PROC NEAR ;AN000; | ||
| 2140 | |||
| 2141 | |||
| 2142 | MOV match_found,false ;AN000; | ||
| 2143 | .REPEAT | ||
| 2144 | .IF <parm_list[current_parm_DI].item_tag EQ i_CL> THEN ;AN000; | ||
| 2145 | MOV match_found,true ;AN000; | ||
| 2146 | MOV i_CL,last_databit_item_tag ;AN000;set end of loop trigger | ||
| 2147 | .ENDIF ;AN000; | ||
| 2148 | INC i_CL ;AN000; | ||
| 2149 | .UNTIL <i_CL GT search_stop> ;AN000; | ||
| 2150 | |||
| 2151 | RET | ||
| 2152 | |||
| 2153 | search_item_tags ENDP ;AN000; | ||
| 2154 | |||
| 2155 | ;------------------------------------------------------------------------------- | ||
| 2156 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 2157 | ;³ | ||
| 2158 | ;³ CHECK_FOR_KEYWORD | ||
| 2159 | ;³ --------------------- | ||
| 2160 | ;³ | ||
| 2161 | ;³ Scan the list of keywords (OFFSETS) looking for a match with | ||
| 2162 | ;³ parm_list[current_parm_DI].keyword_switch_ptr. | ||
| 2163 | ;³ | ||
| 2164 | ;³ | ||
| 2165 | ;³ | ||
| 2166 | ;³ INPUT: uses global variables. | ||
| 2167 | ;³ | ||
| 2168 | ;³ | ||
| 2169 | ;³ RETURN: match_found is set to true if a match is found. | ||
| 2170 | ;³ | ||
| 2171 | ;³ | ||
| 2172 | ;³ MESSAGES: none | ||
| 2173 | ;³ | ||
| 2174 | ;³ | ||
| 2175 | ;³ | ||
| 2176 | ;³ REGISTER | ||
| 2177 | ;³ USAGE: DX - loop index | ||
| 2178 | ;³ SI - displacement into the list of pointers | ||
| 2179 | ;³ CX - holder of pointer to keywords for compare | ||
| 2180 | ;³ | ||
| 2181 | ;³ | ||
| 2182 | ;³ | ||
| 2183 | ;³ CONVENTIONS: | ||
| 2184 | ;³ | ||
| 2185 | ;³ | ||
| 2186 | ;³ | ||
| 2187 | ;³ | ||
| 2188 | ;³ | ||
| 2189 | ;³ | ||
| 2190 | ;³ ASSUMPTIONS: The list of con_keyword pointers is consecutive words. | ||
| 2191 | ;³ number_of_keywords has the number of OFFSETS in the list | ||
| 2192 | ;³ start_of_keyword_ptrs has the first OFFSET in the list and can | ||
| 2193 | ;³ be addressed off of. | ||
| 2194 | ;³ | ||
| 2195 | ;³ | ||
| 2196 | ;³ | ||
| 2197 | ;³ SIDE EFFECT: DL - lost | ||
| 2198 | ;³ SI - lost | ||
| 2199 | ;³ CX - lost | ||
| 2200 | ;³ match_found - lost | ||
| 2201 | ;³ | ||
| 2202 | ;³ | ||
| 2203 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 2204 | |||
| 2205 | check_for_keyword PROC NEAR ;AN000; | ||
| 2206 | |||
| 2207 | MOV match_found,false ;AN000; | ||
| 2208 | MOV SI,0 ;AN000; | ||
| 2209 | MOV DL,0 ;AN000;;index for the loop | ||
| 2210 | .WHILE <DL LT number_of_keywords> AND ;AN000;;check each pointer in the list | ||
| 2211 | .WHILE <match_found EQ false> DO ;AN000; | ||
| 2212 | MOV CX,start_of_keyword_ptrs[SI] ;AN000; | ||
| 2213 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ CX> THEN ;AN000;IF synonym ptr=CON keyword ptr THEN | ||
| 2214 | MOV match_found,true ;AN000; | ||
| 2215 | .ENDIF ;AN000; | ||
| 2216 | INC SI ;AN000; ;AN000; | ||
| 2217 | INC SI ;AN000; ;AN000; | ||
| 2218 | INC DL ;AN000;;increment loop counter | ||
| 2219 | .ENDWHILE ;AN000; | ||
| 2220 | |||
| 2221 | RET ;AN000; | ||
| 2222 | |||
| 2223 | check_for_keyword ENDP ;AN000; | ||
| 2224 | |||
| 2225 | ;------------------------------------------------------------------------------- | ||
| 2226 | |||
| 2227 | setup_invalid_parameter PROC NEAR ;AN000; | ||
| 2228 | |||
| 2229 | PUBLIC setup_invalid_parameter | ||
| 2230 | |||
| 2231 | MOV message,OFFSET CRLF ;AN000;the common message doesn't have a CR,LF in it and all my other messages do | ||
| 2232 | PUSH parser_return_code_AX ;AC006;AX destroyed by sysdispmsg | ||
| 2233 | display message ;AN000; | ||
| 2234 | POP parser_return_code_AX | ||
| 2235 | |||
| 2236 | |||
| 2237 | MOV BP,command_line ;AN000;BP points to end of current (invalid) parm | ||
| 2238 | .IF <<BYTE PTR [BP]> NE end_of_line_char_0D> AND ;AN000;IF a whitespace char or comma in the string | ||
| 2239 | .IF <<BYTE PTR [BP]> NE end_of_line_char_00> THEN ;AN000;THEN | ||
| 2240 | DEC BP ;AN000;don't include the delimeter in the display of the invalid parm | ||
| 2241 | .ENDIF | ||
| 2242 | MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ | ||
| 2243 | |||
| 2244 | ;offending_parameter is where the text of the bad parm is, | ||
| 2245 | ;offending_parameter_ptr is the address of offending_parameter By incrementing | ||
| 2246 | ;offending_parameter_ptr the first characters of the text string are skipped. | ||
| 2247 | ;This is done to skip leading whitespace. | ||
| 2248 | |||
| 2249 | |||
| 2250 | MOV BP,offending_parameter_ptr ;AC006;BP=>first char in the text string | ||
| 2251 | .WHILE <<BYTE PTR [BP]> EQ tab> OR ;AC006;WHILE the char in the text string | ||
| 2252 | .WHILE <<BYTE PTR [BP]> EQ " "> DO ;AC006; is white space DO | ||
| 2253 | INC offending_parameter_ptr ;AC006;point past the whitespace char | ||
| 2254 | INC BP ;AC006;index next char in the string | ||
| 2255 | .ENDWHILE ;AC006; | ||
| 2256 | |||
| 2257 | .IF <parser_return_code_AX EQ syntax_error_rc> THEN ;AN000;syntax error, like "RETRY= E" | ||
| 2258 | MOV message,OFFSET syntax_error ;AN000; | ||
| 2259 | PUSH offending_parameter_ptr ;AN000; | ||
| 2260 | POP syntax_error_ptr ;AN000;point to the offending parameter | ||
| 2261 | .ELSEIF <parser_return_code_AX EQ not_in_switch_list> THEN ;AN000; | ||
| 2262 | MOV message,OFFSET Invalid_switch | ||
| 2263 | .ELSE | ||
| 2264 | MOV message,OFFSET Invalid_parameter ;AN000;user mispelled, misordered etc. | ||
| 2265 | .ENDIF ;AN000; | ||
| 2266 | MOV noerror,false ;AN000; | ||
| 2267 | |||
| 2268 | RET | ||
| 2269 | |||
| 2270 | setup_invalid_parameter ENDP ;AN000; | ||
| 2271 | |||
| 2272 | ;------------------------------------------------------------------------------- | ||
| 2273 | |||
| 2274 | setup_for_not_supported PROC NEAR ;AC002;prepare replacable parm for "Function not supported on this machine - ????". | ||
| 2275 | |||
| 2276 | MOV CX,offending_parameter_ptr;AN000; | ||
| 2277 | MOV not_supported_ptr,CX ;AN000;point to string describing what is not supported for message | ||
| 2278 | MOV BP,command_line ;AN000;BP points to end of current (invalid) parm | ||
| 2279 | .IF <<BYTE PTR [BP]> NE end_of_line_char_0D> AND ;AN000;IF a whitespace char or comma in the string | ||
| 2280 | .IF <<BYTE PTR [BP]> NE end_of_line_char_00> THEN ;AN000;THEN | ||
| 2281 | DEC BP ;AN000;don't include the delimeter in the display of the invalid parm | ||
| 2282 | .ENDIF | ||
| 2283 | MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ | ||
| 2284 | MOV message,OFFSET function_not_supported ;AN000;"Function not supported on the computer - mark" | ||
| 2285 | MOV noerror,false ;AN000; | ||
| 2286 | MOV looking_for,eol | ||
| 2287 | |||
| 2288 | RET | ||
| 2289 | |||
| 2290 | setup_for_not_supported ENDP ;AC002; | ||
| 2291 | |||
| 2292 | |||
| 2293 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 2294 | ;³ | ||
| 2295 | ;³ PARSE_PARAMETERS | ||
| 2296 | ;³ ---------------- | ||
| 2297 | ;³ | ||
| 2298 | ;³ All parameters entered on the command line are reduced to a list of values | ||
| 2299 | ;³ which completely describes the parms. The syntactic and semantic correctness | ||
| 2300 | ;³ will be checked. The routines that use the lists created by this routine | ||
| 2301 | ;³ can have complete trust in the validity of the parms. | ||
| 2302 | ;³ | ||
| 2303 | ;³ Most of the states of looking_for allow null, even if it is not mentioned in | ||
| 2304 | ;³ the name of the value looking_for is assigned. | ||
| 2305 | ;³ | ||
| 2306 | ;³ | ||
| 2307 | ;³ | ||
| 2308 | ;³ | ||
| 2309 | ;³ | ||
| 2310 | ;³ | ||
| 2311 | ;³ | ||
| 2312 | ;³ | ||
| 2313 | ;³ | ||
| 2314 | ;³ | ||
| 2315 | ;³ INPUT: none, uses global variables. | ||
| 2316 | ;³ | ||
| 2317 | ;³ | ||
| 2318 | ;³ RETURN: noerror is set to false if an error is encountered. | ||
| 2319 | ;³ | ||
| 2320 | ;³ | ||
| 2321 | ;³ MESSAGES: "Invalid parameter 'bdprm'", where "bdprm" is the first 5 or less | ||
| 2322 | ;³ characters of the parameter that is incorrect or unexpected. | ||
| 2323 | ;³ | ||
| 2324 | ;³ "Must specify COM1, COM2, COM3 or COM4" | ||
| 2325 | ;³ | ||
| 2326 | ;³ "Illegal device name" | ||
| 2327 | ;³ | ||
| 2328 | ;³ "Invalid baud rate specified" | ||
| 2329 | ;³ | ||
| 2330 | ;³ | ||
| 2331 | ;³ | ||
| 2332 | ;³ | ||
| 2333 | ;³ REGISTER | ||
| 2334 | ;³ USAGE: To be determined at I2 time. | ||
| 2335 | ;³ | ||
| 2336 | ;³ | ||
| 2337 | ;³ CONVENTIONS: "looking_for" indicates the valid possibilities for the next parm. | ||
| 2338 | ;³ | ||
| 2339 | ;³ "current_parm" refers to the parm just returned. It can be an | ||
| 2340 | ;³ item tag, a type. | ||
| 2341 | ;³ | ||
| 2342 | ;³ When "/STATUS" is a valid possibility it is checked for even | ||
| 2343 | ;³ though the value of "looking_for" may not indicate it as a | ||
| 2344 | ;³ choice. | ||
| 2345 | ;³ | ||
| 2346 | ;³ When possible the parser control blocks will be modified at | ||
| 2347 | ;³ the case where looking_for is being checked for rather than | ||
| 2348 | ;³ where looking_for was set. This will save code when more than | ||
| 2349 | ;³ one place sets looking_for to the same state. | ||
| 2350 | ;³ | ||
| 2351 | ;³ | ||
| 2352 | ;³ | ||
| 2353 | ;³ | ||
| 2354 | ;³ ASSUMPTIONS: The parser control blocks are setup to be the following: | ||
| 2355 | ;³ seperators are defaults and colon (:) | ||
| 2356 | ;³ match_flags=2011 (simple string, ignore colon, optional) | ||
| 2357 | ;³ function_flags=0 | ||
| 2358 | ;³ keyword/switch list has only /STATUS | ||
| 2359 | ;³ nval (number of value definitions) is 3 | ||
| 2360 | ;³ Initially no number choices. Most numeric values will treated as strings. | ||
| 2361 | ;³ This is because for most of them the numeric value doesn't | ||
| 2362 | ;³ mean anything. Since we do not want to restrict the choices | ||
| 2363 | ;³ code pages they cannot be enumerated, so a range will be used. | ||
| 2364 | ;³ The list of strings in the values block contains all the | ||
| 2365 | ;³ device names, all the screen modes, all the status qualifiers, | ||
| 2366 | ;³ and all numeric values that have no meaning in binary form, | ||
| 2367 | ;³ can be enumerated, or are non-integer. | ||
| 2368 | ;³ | ||
| 2369 | ;³ | ||
| 2370 | ;³ SIDE EFFECT: | ||
| 2371 | ;³ | ||
| 2372 | ;³ | ||
| 2373 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 2374 | |||
| 2375 | parse_parameters PROC ;AN000; | ||
| 2376 | |||
| 2377 | ;determine if on a PS/2 for checking COMx parameters | ||
| 2378 | |||
| 2379 | .IF <machine_type EQ PS2Model30> OR ;AC002; | ||
| 2380 | .IF <machine_type EQ PS2Model50> OR ;AC002; | ||
| 2381 | .IF <machine_type EQ PS2Model60> OR ;AC002; | ||
| 2382 | .IF <machine_type EQ PS2Model80> THEN ;AC002;IF the machine is a PS/2 THEN | ||
| 2383 | MOV type_of_machine,PS2 ;AC002;set flag | ||
| 2384 | .ENDIF | ||
| 2385 | |||
| 2386 | |||
| 2387 | MOV looking_for,first_parm ;AN000;looking_for:=first_parm | ||
| 2388 | |||
| 2389 | .WHILE <eol_found NE true> AND NEAR ;AN000; | ||
| 2390 | .WHILE <noerror EQ true> NEAR DO ;AN000;WHILE (NOT EOL) AND noerror=true DO | ||
| 2391 | |||
| 2392 | ; CASE looking_for= | ||
| 2393 | |||
| 2394 | ;calculate the displacement for the jump to appropriate case | ||
| 2395 | XOR AX,AX ;AN000; | ||
| 2396 | MOV AL,max_looking_for ;AN000;see the list of equates for looking_for | ||
| 2397 | SUB AL,looking_for ;AN000;AX=byte displacement into table of OFFSETS | ||
| 2398 | SHL AX,1 ;AN000;each displacement is 2 bytes | ||
| 2399 | MOV SI,AX ;AN000;SI=appropriate displacement into table of offsets | ||
| 2400 | JMP jump_table1[SI] ;AN000;jump to case | ||
| 2401 | |||
| 2402 | jump_table1 LABEL WORD ;AN000; ;these entries must be in same order as the values in list of equates for looking_for | ||
| 2403 | |||
| 2404 | DW OFFSET codepage_case ;AN000; | ||
| 2405 | DW OFFSET codepage_prms_case ;AN000; | ||
| 2406 | DW OFFSET COM_keyword_case ;AN000; | ||
| 2407 | DW OFFSET com_keyword_or_baud_case ;AN000; | ||
| 2408 | DW OFFSET CON_keyword_case ;AN000; | ||
| 2409 | DW OFFSET con_kwrd_status_or_cp_case ;AN000; | ||
| 2410 | DW OFFSET databits_or_null_case ;AN000; | ||
| 2411 | DW OFFSET device_name_or_eol_case ;AN000; | ||
| 2412 | DW OFFSET eol_case ;AN000; | ||
| 2413 | DW OFFSET first_parm_case ;AN000; | ||
| 2414 | DW OFFSET li_or_null_case ;AN000; | ||
| 2415 | DW OFFSET P_case ;AN000; | ||
| 2416 | DW OFFSET parity_or_null_case ;AN000; | ||
| 2417 | DW OFFSET prn_kw_status_cp_cl_null_case ;AN000; | ||
| 2418 | DW OFFSET sd_or_dl_case ;AN000; | ||
| 2419 | DW OFFSET sd_or_dl_or_eol_case ;AN000; | ||
| 2420 | DW OFFSET status_or_eol_case ;AN000; | ||
| 2421 | DW OFFSET stopbits_or_null_case ;AN000; | ||
| 2422 | DW OFFSET T_or_eol_case ;AN000; | ||
| 2423 | |||
| 2424 | |||
| 2425 | com_keyword_or_baud_case: ;AN000; | ||
| 2426 | |||
| 2427 | PUBLIC com_keyword_or_baud_case | ||
| 2428 | |||
| 2429 | ;The com keywords are in "com_parmsx", as well as the values for the | ||
| 2430 | ;positional and keyword forms of the com parameters. If | ||
| 2431 | ;keyword_switch_ptr comes back from parse_parm nonzero then a valid | ||
| 2432 | ;com keyword or /STATUS was found. | ||
| 2433 | |||
| 2434 | CALL parse_parm ;AN000;/status allowed | ||
| 2435 | |||
| 2436 | ;CASE current_parm= | ||
| 2437 | |||
| 2438 | |||
| 2439 | ; /status: | ||
| 2440 | |||
| 2441 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 2442 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000; | ||
| 2443 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004; | ||
| 2444 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000; | ||
| 2445 | |||
| 2446 | ; MOV slash_status,deleted ;AN000;make it so /status again is an error,also deletes /STA | ||
| 2447 | ; MOV slash_stat,deleted ;AN000; | ||
| 2448 | ; MOV slash_sta,deleted ;AN000; | ||
| 2449 | MOV looking_for,eol ;AN000;eol only valid | ||
| 2450 | MOV request_type,com_status ;AN000; | ||
| 2451 | |||
| 2452 | BREAK 1 ;AN000; | ||
| 2453 | |||
| 2454 | .ENDIF ;AN000; | ||
| 2455 | |||
| 2456 | |||
| 2457 | ; eol: | ||
| 2458 | |||
| 2459 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 2460 | |||
| 2461 | MOV request_type,com_status ;AN000; | ||
| 2462 | MOV eol_found,true ;AN000; | ||
| 2463 | BREAK 1 ;AN000; | ||
| 2464 | |||
| 2465 | .ENDIF ;AN000; | ||
| 2466 | |||
| 2467 | |||
| 2468 | ; com_keyword: | ||
| 2469 | |||
| 2470 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 2471 | .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;AN000;wasn't /STATUS so must be a keyword | ||
| 2472 | |||
| 2473 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AN000;IF synonym ptr=> BAUD= THEN | ||
| 2474 | MOV baud_specified,true ;AN000; | ||
| 2475 | .ENDIF ;AN000; | ||
| 2476 | delete_parser_value_list_entry keywords,current_parm ;AN000; | ||
| 2477 | MOV looking_for,com_keyword ;AN000; | ||
| 2478 | MOV parms_form,keyword ;AN000;tell analyze_and_invoke how to look at the parms | ||
| 2479 | BREAK 1 ;AN000; | ||
| 2480 | |||
| 2481 | .ENDIF ;AN000; | ||
| 2482 | |||
| 2483 | |||
| 2484 | ; baud: ;found a number that is a valid baud, know that have old com style com request | ||
| 2485 | |||
| 2486 | |||
| 2487 | |||
| 2488 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a baud rate THEN (none of above, must be baud rate) | ||
| 2489 | |||
| 2490 | .IF <parm_list[current_parm_DI].item_tag EQ nineteentwohundred_item_tag> THEN ;AC002;IF PS2 only baud rate AND | ||
| 2491 | MOV new_com_initialize,true | ||
| 2492 | .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2 | ||
| 2493 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2494 | .ENDIF ;AN000; | ||
| 2495 | .ENDIF ;AN008; | ||
| 2496 | ;AD008; .ELSE | ||
| 2497 | MOV looking_for,parity_or_null ;AN000; | ||
| 2498 | MOV request_type,initialize_com_port ;AN000; | ||
| 2499 | ;AD008; .ENDIF | ||
| 2500 | BREAK 1 ;AN000; | ||
| 2501 | |||
| 2502 | .ELSE ;AN000; | ||
| 2503 | |||
| 2504 | |||
| 2505 | ; otherwise: | ||
| 2506 | |||
| 2507 | CALL setup_invalid_parameter ;AN000; | ||
| 2508 | ; BREAK 1 | ||
| 2509 | |||
| 2510 | .ENDIF | ||
| 2511 | |||
| 2512 | ENDCASE_1: | ||
| 2513 | |||
| 2514 | BREAK 0 ;AN000; | ||
| 2515 | |||
| 2516 | |||
| 2517 | |||
| 2518 | com_keyword_case: | ||
| 2519 | |||
| 2520 | ;At this point the com keywords are in the keyword list, the only valid | ||
| 2521 | ;parms that can follow are com keywords. Assume that one and only one | ||
| 2522 | ;com keyword has been found and removed from the list of keywords. | ||
| 2523 | |||
| 2524 | PUBLIC com_keyword_case | ||
| 2525 | |||
| 2526 | MOV parms.parmsx_ptr,OFFSET com_keywords_parmsx ;AN000;only com keywords are in the control blocks | ||
| 2527 | MOV i_CL,1 ;AN000; | ||
| 2528 | .WHILE <i_CL LE number_of_com_keywords> AND NEAR ;AN000;one iteration more than number of parms left so will find eol | ||
| 2529 | .WHILE <eol_found EQ false> AND NEAR ;AN000; | ||
| 2530 | .WHILE <noerror EQ true> DO NEAR ;AN000; | ||
| 2531 | |||
| 2532 | .SELECT ;AC002;check for PS/2 specific parms | ||
| 2533 | .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AC002;IF synonym ptr=> BAUD= THEN | ||
| 2534 | .IF <parm_list[current_parm_DI].item_tag EQ nineteentwohundred_item_tag> THEN ;AC002;IF PS2 only baud rate AND | ||
| 2535 | MOV new_com_initialize,true | ||
| 2536 | .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2 | ||
| 2537 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2538 | .ENDIF | ||
| 2539 | .ENDIF | ||
| 2540 | .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET parity_equal>> THEN ;AC002;IF parity= THEN | ||
| 2541 | .IF <parm_list[current_parm_DI].item_tag EQ mark_item_tag> OR ;AC002;IF PS2 only parity | ||
| 2542 | .IF <parm_list[current_parm_DI].item_tag EQ space_item_tag> THEN ;AC002;IF PS2 only parity AND | ||
| 2543 | MOV new_com_initialize,true | ||
| 2544 | .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2 | ||
| 2545 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2546 | .ENDIF | ||
| 2547 | .ENDIF | ||
| 2548 | .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET data_equal>> THEN ;AC002;IF data= THEN | ||
| 2549 | .IF <parm_list[current_parm_DI].item_tag EQ five_item_tag> OR ;AC002;IF PS2 only data bits | ||
| 2550 | .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> THEN ;AC002;IF PS2 only data bits AND | ||
| 2551 | MOV new_com_initialize,true | ||
| 2552 | .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2 | ||
| 2553 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2554 | .ENDIF | ||
| 2555 | .ENDIF | ||
| 2556 | .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET stop_equal>> THEN ;AC002;IF stop= THEN | ||
| 2557 | .IF <parm_list[current_parm_DI].item_tag EQ one_point_five_item_tag> THEN ;AC002;IF PS2 only stop bits AND | ||
| 2558 | MOV new_com_initialize,true | ||
| 2559 | .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2 | ||
| 2560 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2561 | .ENDIF | ||
| 2562 | .ENDIF | ||
| 2563 | .ENDSELECT | ||
| 2564 | |||
| 2565 | PUSH CX ;save the loop index | ||
| 2566 | CALL parse_parm ;AN000; | ||
| 2567 | POP CX | ||
| 2568 | |||
| 2569 | .IF <noerror EQ true> AND | ||
| 2570 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000; | ||
| 2571 | |||
| 2572 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AN000;IF synonym ptr=> BAUD= THEN | ||
| 2573 | MOV baud_specified,true ;AN000; | ||
| 2574 | .ENDIF ;AN000; | ||
| 2575 | delete_parser_value_list_entry keywords,current_parm ;AN000; | ||
| 2576 | INC i_CL ;AN000; | ||
| 2577 | |||
| 2578 | .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 2579 | |||
| 2580 | .IF <baud_specified EQ true> THEN ;AN000; | ||
| 2581 | MOV request_type,initialize_com_port ;AN000; | ||
| 2582 | .ELSE ;AN000; | ||
| 2583 | MOV message,OFFSET baud_rate_required ;AN000; | ||
| 2584 | MOV noerror,false | ||
| 2585 | .ENDIF ;AN000; | ||
| 2586 | MOV eol_found,true ;AN000; | ||
| 2587 | |||
| 2588 | .ELSE NEAR ;AN000; | ||
| 2589 | |||
| 2590 | CALL setup_invalid_parameter ;AN000; | ||
| 2591 | |||
| 2592 | .ENDIF ;AN000; | ||
| 2593 | |||
| 2594 | .ENDWHILE ;AN000; | ||
| 2595 | |||
| 2596 | MOV looking_for,eol ;AN000;if haven't already encountered an error then check for extraneous parms | ||
| 2597 | |||
| 2598 | BREAK 0 ;AN000;com_keyword | ||
| 2599 | |||
| 2600 | |||
| 2601 | status_or_eol_case: | ||
| 2602 | |||
| 2603 | ; status_or_eol: ;Have found the only or the last status qualifier, must find /STATUS or eol_found NExt | ||
| 2604 | ;Assume that /STATUS is the only switch in the appropriate parser control block | ||
| 2605 | ;Assume that request_type has already been set | ||
| 2606 | |||
| 2607 | CALL parse_parm ;AN000; | ||
| 2608 | |||
| 2609 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000; | ||
| 2610 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004; | ||
| 2611 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;found /status | ||
| 2612 | |||
| 2613 | MOV looking_for,eol ;AN000; | ||
| 2614 | |||
| 2615 | .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;encountered EOL | ||
| 2616 | |||
| 2617 | MOV eol_found,true ;AN000; | ||
| 2618 | |||
| 2619 | .ELSE ;AN000; | ||
| 2620 | |||
| 2621 | CALL setup_invalid_parameter ;AN000; | ||
| 2622 | |||
| 2623 | .ENDIF | ||
| 2624 | |||
| 2625 | BREAK 0 ;status_or_eol ;AN000; | ||
| 2626 | |||
| 2627 | |||
| 2628 | |||
| 2629 | parity_or_null_case: | ||
| 2630 | |||
| 2631 | PUBLIC parity_or_null_case | ||
| 2632 | |||
| 2633 | ;the parser control blocks have paritys as strings | ||
| 2634 | ;modify parser control blocks list of valid paritys based on the | ||
| 2635 | ;machine type. | ||
| 2636 | |||
| 2637 | |||
| 2638 | CALL parse_parm ;AN000; | ||
| 2639 | .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null | ||
| 2640 | MOV looking_for,databits_or_null ;AN000;can't have baud,,eol | ||
| 2641 | .ELSE ;AN000; | ||
| 2642 | ; CASE current_parm= | ||
| 2643 | |||
| 2644 | |||
| 2645 | ; eol: | ||
| 2646 | |||
| 2647 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 2648 | |||
| 2649 | MOV request_type,initialize_com_port | ||
| 2650 | MOV eol_found,true ;AN000; | ||
| 2651 | BREAK 5 ;AN000; | ||
| 2652 | |||
| 2653 | .ENDIF | ||
| 2654 | |||
| 2655 | ; parity: | ||
| 2656 | |||
| 2657 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity) | ||
| 2658 | |||
| 2659 | MOV looking_for,databits_or_null ;AN000; | ||
| 2660 | .IF <parm_list[current_parm_DI].item_tag EQ mark_item_tag> OR ;AN000; | ||
| 2661 | .IF <parm_list[current_parm_DI].item_tag EQ space_item_tag> THEN ;AN000; | ||
| 2662 | MOV new_com_initialize,true | ||
| 2663 | .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later | ||
| 2664 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2665 | .ENDIF ;AN000; ;AN000; | ||
| 2666 | .ENDIF ;AN000; | ||
| 2667 | |||
| 2668 | .ELSE | ||
| 2669 | |||
| 2670 | ; otherwise: | ||
| 2671 | |||
| 2672 | CALL setup_invalid_parameter ;AN000; | ||
| 2673 | ; BREAK | ||
| 2674 | |||
| 2675 | .ENDIF ;AN000; | ||
| 2676 | |||
| 2677 | ENDCASE_5: ;current_parm | ||
| 2678 | |||
| 2679 | .ENDIF ;AN000; | ||
| 2680 | BREAK 0 ;AN000;parity_or_null | ||
| 2681 | |||
| 2682 | |||
| 2683 | |||
| 2684 | |||
| 2685 | databits_or_null_case: | ||
| 2686 | |||
| 2687 | |||
| 2688 | PUBLIC databits_or_null_case | ||
| 2689 | |||
| 2690 | ;parser control blocks have all databits (as strings). | ||
| 2691 | ;modify parser control blocks to handle list of valid databits | ||
| 2692 | ;based on the machine type. | ||
| 2693 | |||
| 2694 | ;AC002; .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later | ||
| 2695 | ;AC002; MOV five_str,deleted ;delete parser value list entry ;AN000; | ||
| 2696 | ;AC002; MOV six_str,deleted ;delete_parser_value_list_entry ;AN000; | ||
| 2697 | ;AC002; .ENDIF ;AN000; | ||
| 2698 | |||
| 2699 | ;the parser control blocks have data bits valid for this machine | ||
| 2700 | CALL parse_parm ;AN000; | ||
| 2701 | .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null | ||
| 2702 | MOV looking_for,stopbits_or_null ;can't have databits,,eol | ||
| 2703 | .ELSE ;AN000; | ||
| 2704 | ; CASE current_parm= | ||
| 2705 | |||
| 2706 | |||
| 2707 | ; eol: | ||
| 2708 | |||
| 2709 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 2710 | |||
| 2711 | MOV request_type,initialize_com_port ;AN000; | ||
| 2712 | MOV eol_found,true ;AN000; | ||
| 2713 | BREAK 6 ;AN000; | ||
| 2714 | |||
| 2715 | .ENDIF ;AN000; | ||
| 2716 | |||
| 2717 | |||
| 2718 | ; databits: | ||
| 2719 | |||
| 2720 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity) | ||
| 2721 | |||
| 2722 | MOV looking_for,stopbits_or_null ;AN000; | ||
| 2723 | .IF <parm_list[current_parm_DI].item_tag EQ five_item_tag> OR ;AC002; | ||
| 2724 | .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> THEN ;AC002; | ||
| 2725 | MOV new_com_initialize,true | ||
| 2726 | .IF <type_of_machine NE PS2> THEN ;AC002;IF not Roundup or later | ||
| 2727 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2728 | .ENDIF ;AC002; ;AN000; | ||
| 2729 | .ENDIF ;AC002; | ||
| 2730 | ; BREAK 6 ;AN000; | ||
| 2731 | |||
| 2732 | .ELSE ;AN000; | ||
| 2733 | |||
| 2734 | |||
| 2735 | ; otherwise: | ||
| 2736 | |||
| 2737 | CALL setup_invalid_parameter ;AN000; | ||
| 2738 | ; BREAK | ||
| 2739 | |||
| 2740 | .ENDIF | ||
| 2741 | |||
| 2742 | ENDCASE_6: ;current_parm | ||
| 2743 | |||
| 2744 | .ENDIF ;AN000; | ||
| 2745 | BREAK 0 ;AN000;databits_or_null | ||
| 2746 | |||
| 2747 | |||
| 2748 | |||
| 2749 | stopbits_or_null_case: | ||
| 2750 | |||
| 2751 | |||
| 2752 | PUBLIC stopbits_or_null_case | ||
| 2753 | |||
| 2754 | ;parser control blocks have all stopbits (as strings). | ||
| 2755 | ;modify parser control blocks to handle list of valid stopbits | ||
| 2756 | ;based on the machine type. | ||
| 2757 | |||
| 2758 | ;AC002; .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later | ||
| 2759 | ;AC002; MOV one_point_five_str,deleted ;delete_parser_value_list_entry ;AN000; | ||
| 2760 | ;AC002; .ENDIF ;AN000; | ||
| 2761 | |||
| 2762 | |||
| 2763 | CALL parse_parm ;AN000; | ||
| 2764 | .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null | ||
| 2765 | MOV looking_for,P ;AN000;no null just before eol | ||
| 2766 | .ELSE ;AN000; | ||
| 2767 | ; CASE current_parm= | ||
| 2768 | |||
| 2769 | |||
| 2770 | ; eol: | ||
| 2771 | |||
| 2772 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 2773 | |||
| 2774 | MOV BYTE PTR request_type,initialize_com_port ;AN000; | ||
| 2775 | MOV eol_found,true ;AN000; | ||
| 2776 | BREAK 7 ;AN000; | ||
| 2777 | |||
| 2778 | .ENDIF | ||
| 2779 | |||
| 2780 | |||
| 2781 | ; stopbits: | ||
| 2782 | |||
| 2783 | |||
| 2784 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity) | ||
| 2785 | |||
| 2786 | MOV looking_for,P ;AN000;P or eol valid next | ||
| 2787 | .IF <parm_list[current_parm_DI].item_tag EQ one_point_five_item_tag> THEN ;AC002; | ||
| 2788 | MOV new_com_initialize,true | ||
| 2789 | .IF <type_of_machine NE PS2> THEN ;AC002;IF not Roundup or later | ||
| 2790 | CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message | ||
| 2791 | .ENDIF ;AC002; ;AN000; | ||
| 2792 | .ENDIF ;AC002; | ||
| 2793 | |||
| 2794 | .ELSE | ||
| 2795 | |||
| 2796 | |||
| 2797 | ; otherwise: | ||
| 2798 | |||
| 2799 | CALL setup_invalid_parameter ;AN000; | ||
| 2800 | ; BREAK | ||
| 2801 | |||
| 2802 | .ENDIF | ||
| 2803 | |||
| 2804 | ENDCASE_7: ;current_parm | ||
| 2805 | |||
| 2806 | .ENDIF ;AN000; | ||
| 2807 | BREAK 0 ;AN000;stopbits_or_null | ||
| 2808 | |||
| 2809 | |||
| 2810 | |||
| 2811 | |||
| 2812 | P_case: ;P or eol valid | ||
| 2813 | |||
| 2814 | |||
| 2815 | PUBLIC P_case | ||
| 2816 | |||
| 2817 | ;P is in the parser control blocks' list of strings. | ||
| 2818 | |||
| 2819 | CALL parse_parm ;AN000; | ||
| 2820 | ; CASE current_parm= | ||
| 2821 | |||
| 2822 | |||
| 2823 | |||
| 2824 | |||
| 2825 | |||
| 2826 | ; eol: | ||
| 2827 | |||
| 2828 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 2829 | |||
| 2830 | MOV eol_found,true ;AN000; | ||
| 2831 | BREAK 8 ;AN000; | ||
| 2832 | |||
| 2833 | .ENDIF | ||
| 2834 | |||
| 2835 | |||
| 2836 | |||
| 2837 | ; P: | ||
| 2838 | |||
| 2839 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000;found one of: p,e,b,r,n,none,off | ||
| 2840 | |||
| 2841 | MOV looking_for,eol ;AN000;found last positional | ||
| 2842 | MOV retry_requested,true | ||
| 2843 | |||
| 2844 | .ELSE | ||
| 2845 | |||
| 2846 | |||
| 2847 | ; otherwise: | ||
| 2848 | |||
| 2849 | CALL setup_invalid_parameter ;AN000; | ||
| 2850 | |||
| 2851 | .ENDIF | ||
| 2852 | |||
| 2853 | |||
| 2854 | ENDCASE_8: ;current_parm | ||
| 2855 | |||
| 2856 | BREAK 0 ;AN000;P | ||
| 2857 | |||
| 2858 | |||
| 2859 | |||
| 2860 | ;m | ||
| 2861 | prn_kw_status_cp_cl_null_case: | ||
| 2862 | |||
| 2863 | PUBLIC prn_kw_status_cp_cl_null_case | ||
| 2864 | |||
| 2865 | ;Have encountered only LPTX so far, so any printer stuff including codepage | ||
| 2866 | ;requests can follow. All necessary keywords and switches are in the control blocks. | ||
| 2867 | |||
| 2868 | |||
| 2869 | CALL parse_parm ;AN000; | ||
| 2870 | |||
| 2871 | ; CASE current_parm= | ||
| 2872 | |||
| 2873 | ; LPT_mode_keyword: ;nothing but printer keywords allowed | ||
| 2874 | |||
| 2875 | |||
| 2876 | .IF <parser_return_code_AX EQ no_error> AND NEAR ;AN000; | ||
| 2877 | ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000; | ||
| 2878 | ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> OR ;AN000; | ||
| 2879 | ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET lines_equal>> OR ;AN000; | ||
| 2880 | ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET retry_equal_str>> THEN ;AN000;found a printer keyword | ||
| 2881 | |||
| 2882 | |||
| 2883 | check_for_lpt_keyword ;check for COLS= or LINES= or RETRY=, return results in match_found | ||
| 2884 | .IF <match_found EQ true> THEN NEAR | ||
| 2885 | |||
| 2886 | delete_parser_value_list_entry keywords,current_parm ;AN000; | ||
| 2887 | MOV parms_form,keyword ;AN000;indicate to modeprin how to deal with retry | ||
| 2888 | CALL parse_parm ;AN000; | ||
| 2889 | MOV DL,1 ;AN000;one keyword found so far | ||
| 2890 | |||
| 2891 | .REPEAT | ||
| 2892 | |||
| 2893 | ; CASE return_code= | ||
| 2894 | |||
| 2895 | ; LPT_keyword: | ||
| 2896 | |||
| 2897 | |||
| 2898 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 2899 | PUSH DX ;save loop index | ||
| 2900 | check_for_lpt_keyword ;return results in match_found | ||
| 2901 | POP DX | ||
| 2902 | .IF <match_found EQ true> THEN | ||
| 2903 | |||
| 2904 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET retry_equal_str>> AND | ||
| 2905 | .IF <parm_list[current_parm_DI].item_tag NE NONE_item_tag> THEN | ||
| 2906 | MOV retry_requested,true ;set up for rescode | ||
| 2907 | .ENDIF | ||
| 2908 | delete_parser_value_list_entry keywords,current_parm ;AN000; | ||
| 2909 | INC DL ;AN000;found another keyword | ||
| 2910 | BREAK 9 ;AN000; | ||
| 2911 | |||
| 2912 | .ENDIF | ||
| 2913 | |||
| 2914 | |||
| 2915 | ; eol: | ||
| 2916 | |||
| 2917 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 2918 | |||
| 2919 | ;had at least one keyword | ||
| 2920 | MOV request_type,initialize_printer_port ;AN000; | ||
| 2921 | MOV eol_found,true ;AN000; | ||
| 2922 | BREAK 9 ;AN000; | ||
| 2923 | |||
| 2924 | .ENDIF | ||
| 2925 | |||
| 2926 | |||
| 2927 | ; otherwise: ;wrong type of keywords, /STATUS etc. | ||
| 2928 | |||
| 2929 | CALL setup_invalid_parameter ;AN000; | ||
| 2930 | ; BREAK | ||
| 2931 | |||
| 2932 | ENDCASE_9: | ||
| 2933 | |||
| 2934 | PUSH DX | ||
| 2935 | CALL parse_parm ;AN000; | ||
| 2936 | POP DX | ||
| 2937 | |||
| 2938 | .UNTIL <DL EQ number_of_LPT_keywords> OR ;AN000; | ||
| 2939 | .UNTIL <eol_found EQ true> OR ;AN000; | ||
| 2940 | .UNTIL <noerror EQ false> ;AN000; | ||
| 2941 | |||
| 2942 | ; .IF <eol_found NE true> AND | ||
| 2943 | .IF <noerror EQ true> AND ;AN000; | ||
| 2944 | .IF <DL EQ number_of_LPT_keywords> THEN ;AN000; | ||
| 2945 | MOV looking_for,eol ;AN000;check for extraneous parms | ||
| 2946 | .ENDIF ;AN000; | ||
| 2947 | |||
| 2948 | BREAK 10 | ||
| 2949 | |||
| 2950 | .ENDIF ;AN000;LPT_keyword | ||
| 2951 | |||
| 2952 | |||
| 2953 | ; /STATUS: | ||
| 2954 | |||
| 2955 | .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000; | ||
| 2956 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000; | ||
| 2957 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004; | ||
| 2958 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;found /STATUS | ||
| 2959 | |||
| 2960 | MOV looking_for,eol ;AN000;look for RETRY or codepage | ||
| 2961 | MOV slash_status,deleted ;AN000; | ||
| 2962 | MOV slash_stat,deleted ;AN000; | ||
| 2963 | MOV slash_sta,deleted ;AN000; | ||
| 2964 | MOV request_type,printer_status ;AN000; | ||
| 2965 | BREAK 10 ;AN000;keyword | ||
| 2966 | |||
| 2967 | .ENDIF ;/STATUS found ;AN000; | ||
| 2968 | |||
| 2969 | |||
| 2970 | ; codepage: | ||
| 2971 | |||
| 2972 | |||
| 2973 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum | ||
| 2974 | .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN | ||
| 2975 | |||
| 2976 | MOV looking_for,codepage_prms ;AN000; | ||
| 2977 | MOV codepage_str,deleted ;AN000; | ||
| 2978 | MOV code_str,deleted ;AN000; | ||
| 2979 | MOV cp_str,deleted ;AC007; | ||
| 2980 | BREAK 10 ;AN000; | ||
| 2981 | |||
| 2982 | .ENDIF ;AN000; | ||
| 2983 | |||
| 2984 | |||
| 2985 | |||
| 2986 | ; cl: | ||
| 2987 | |||
| 2988 | .IF <parm_list[current_parm_DI].item_tag EQ onethirtytwo_item_tag> OR ;AN000; | ||
| 2989 | .IF <parm_list[current_parm_DI].item_tag EQ eighty_item_tag> THEN ;AN000; | ||
| 2990 | |||
| 2991 | MOV REFRESH_str,deleted ;AC007;no codepage stuff legal | ||
| 2992 | MOV REF_str,deleted ;AC007; | ||
| 2993 | MOV SEL_equal,deleted ;AN007; | ||
| 2994 | MOV SELECT_equal,deleted ;AN007; | ||
| 2995 | MOV PREP_equal,deleted ;AN007; | ||
| 2996 | MOV PREPARE_equal,deleted ;AN007; | ||
| 2997 | MOV slash_status,deleted ;AN007; | ||
| 2998 | MOV slash_stat,deleted ;AN007; | ||
| 2999 | MOV slash_sta,deleted ;AN007; | ||
| 3000 | MOV looking_for,li_or_null ;AN000; | ||
| 3001 | MOV request_type,old_initialize_printer_port ;AN000;found enough to know that it isn't status or keyword | ||
| 3002 | BREAK 10 ;AN000; | ||
| 3003 | |||
| 3004 | .ENDIF ;AN000; | ||
| 3005 | |||
| 3006 | |||
| 3007 | |||
| 3008 | ; eol: | ||
| 3009 | |||
| 3010 | |||
| 3011 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 3012 | |||
| 3013 | MOV request_type,turn_off_reroute ;compatible with previous MODE ;AN000; | ||
| 3014 | MOV eol_found,true ;AN000; | ||
| 3015 | BREAK 10 ;AN000; | ||
| 3016 | |||
| 3017 | .ENDIF ;AN000; | ||
| 3018 | |||
| 3019 | |||
| 3020 | |||
| 3021 | ; codepage_keyword_out_of_order: | ||
| 3022 | |||
| 3023 | |||
| 3024 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have | ||
| 3025 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage | ||
| 3026 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user | ||
| 3027 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP" | ||
| 3028 | |||
| 3029 | MOV message,OFFSET Invalid_number_of_parameters ;AC007; | ||
| 3030 | MOV noerror,false ;AC007; | ||
| 3031 | BREAK 10 ;AN000;CON_keyword | ||
| 3032 | |||
| 3033 | .ENDIF | ||
| 3034 | |||
| 3035 | |||
| 3036 | |||
| 3037 | ; REFRESH_out_of_order: ;AC007;forgot to include "CP" | ||
| 3038 | |||
| 3039 | |||
| 3040 | .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007; | ||
| 3041 | |||
| 3042 | MOV message,OFFSET Invalid_number_of_parameters ;AC007; | ||
| 3043 | MOV noerror,false ;AC007; | ||
| 3044 | BREAK 10 | ||
| 3045 | |||
| 3046 | .ENDIF ;AC007; | ||
| 3047 | |||
| 3048 | |||
| 3049 | |||
| 3050 | ; null: | ||
| 3051 | |||
| 3052 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 3053 | .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN007;valid null | ||
| 3054 | |||
| 3055 | MOV REFRESH_str,deleted ;AC007;no codepage stuff legal | ||
| 3056 | MOV REF_str,deleted ;AC007; | ||
| 3057 | MOV SEL_equal,deleted ;AN007; | ||
| 3058 | MOV SELECT_equal,deleted ;AN007; | ||
| 3059 | MOV PREP_equal,deleted ;AN007; | ||
| 3060 | MOV PREPARE_equal,deleted ;AN007; | ||
| 3061 | MOV slash_status,deleted ;AN007; | ||
| 3062 | MOV slash_stat,deleted ;AN007; | ||
| 3063 | MOV slash_sta,deleted ;AN007; | ||
| 3064 | MOV looking_for,li_or_null ;AN000; | ||
| 3065 | MOV request_type,old_initialize_printer_port ;AN000;found enough to know that it isn't status or keyword | ||
| 3066 | |||
| 3067 | |||
| 3068 | |||
| 3069 | ; otherwise: | ||
| 3070 | |||
| 3071 | .ELSE ;AN000; | ||
| 3072 | |||
| 3073 | CALL setup_invalid_parameter ;AN000; | ||
| 3074 | ; BREAK ;AN000; | ||
| 3075 | |||
| 3076 | .ENDIF ;AN000; | ||
| 3077 | |||
| 3078 | |||
| 3079 | ENDCASE_10: ;current_parm= ;AN000; | ||
| 3080 | BREAK 0 ;AN000;prn_kw_status_cp_cl_null_case: | ||
| 3081 | |||
| 3082 | |||
| 3083 | |||
| 3084 | |||
| 3085 | li_or_null_case: ;look for lines per inch or null, eol valid | ||
| 3086 | |||
| 3087 | PUBLIC li_or_null_case | ||
| 3088 | |||
| 3089 | |||
| 3090 | CALL parse_parm ;AN000; | ||
| 3091 | ; CASE current_parm= | ||
| 3092 | |||
| 3093 | ; li: | ||
| 3094 | |||
| 3095 | .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> OR ;AN000; | ||
| 3096 | .IF <parm_list[current_parm_DI].item_tag EQ eight_item_tag> THEN ;AN000;IF found 6 or 8 THEN | ||
| 3097 | |||
| 3098 | MOV looking_for,P ;AN000; | ||
| 3099 | BREAK 11 | ||
| 3100 | |||
| 3101 | .ENDIF | ||
| 3102 | |||
| 3103 | |||
| 3104 | ; eol: | ||
| 3105 | |||
| 3106 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid | ||
| 3107 | |||
| 3108 | MOV request_type,old_initialize_printer_port ;AN000; | ||
| 3109 | MOV eol_found,true ;AN000; | ||
| 3110 | BREAK 11 ;AN000; | ||
| 3111 | |||
| 3112 | .ENDIF | ||
| 3113 | |||
| 3114 | |||
| 3115 | ; null: | ||
| 3116 | |||
| 3117 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 3118 | .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN007;valid null | ||
| 3119 | |||
| 3120 | MOV looking_for,P ;AN000; | ||
| 3121 | BREAK 11 ;AN000; | ||
| 3122 | |||
| 3123 | .ENDIF | ||
| 3124 | |||
| 3125 | |||
| 3126 | ; otherwise: | ||
| 3127 | |||
| 3128 | CALL setup_invalid_parameter ;AN000; | ||
| 3129 | ; BREAK | ||
| 3130 | |||
| 3131 | |||
| 3132 | ENDCASE_11: ;current_parm ;AN000; | ||
| 3133 | BREAK 0 ;AN000;li_or_null | ||
| 3134 | |||
| 3135 | |||
| 3136 | ;m | ||
| 3137 | codepage_prms_case: | ||
| 3138 | |||
| 3139 | |||
| 3140 | ;The desired codepage parameters are in the parser control blocks, such | ||
| 3141 | ;as: the keywords, PREPARE, REFRESH, and /STATUS. | ||
| 3142 | CALL parse_parm ;AN000; | ||
| 3143 | ; CASE current_parm= | ||
| 3144 | |||
| 3145 | |||
| 3146 | ; REFRESH: | ||
| 3147 | |||
| 3148 | .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AN000; | ||
| 3149 | |||
| 3150 | MOV request_type,codepage_refresh ;AN000; | ||
| 3151 | MOV looking_for,eol | ||
| 3152 | BREAK 12 | ||
| 3153 | |||
| 3154 | .ENDIF | ||
| 3155 | |||
| 3156 | |||
| 3157 | ; PREPARE=: | ||
| 3158 | |||
| 3159 | |||
| 3160 | ;Have to parse ((cplist) [filename]) | ||
| 3161 | |||
| 3162 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AN000; | ||
| 3163 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> THEN NEAR ;AN000;IF PREPARE= THEN | ||
| 3164 | |||
| 3165 | .IF <parm_list[current_parm_DI].parm_type EQ complx> THEN NEAR ;AN000;should have found ((cplist) filename) | ||
| 3166 | PUSH SI ;AN000;save pointer to first char past the closing right paren | ||
| 3167 | MOV AX,parm_list[current_parm_DI].value1 ;AN000; | ||
| 3168 | MOV command_line,AX ;AN000;point at first char past the left paren | ||
| 3169 | SUB DI,TYPE parm_list_entry ;AN000;not parm, just indication of complex, delete from parm list | ||
| 3170 | MOV parms.parmsx_ptr,OFFSET prepare_equal_parmsx | ||
| 3171 | MOV prepare_equal_match_flags,complex ;AN000;only thing valid next | ||
| 3172 | CALL parse_parm ;AN000; | ||
| 3173 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 3174 | .IF <parm_list[current_parm_DI].parm_type EQ complx> THEN ;AN000;assume have ((cplist) filename) | ||
| 3175 | PUSH SI ;AN000;save pointer to first char past the closing right paren | ||
| 3176 | MOV AX,parm_list[current_parm_DI].value1 ;AN000; | ||
| 3177 | MOV command_line,AX ;AN000;point at first char past the left paren | ||
| 3178 | SUB DI,TYPE parm_list_entry ;AN000;not parm, just indication of complex, delete from parm list | ||
| 3179 | MOV prepare_equal_match_flags,numeric+optional ;AN000;number or delimeter only things valid next | ||
| 3180 | MOV ordinal,0 ;AN000;zap parms count,make parser count codepage numbers | ||
| 3181 | .REPEAT ;AN000; | ||
| 3182 | CALL parse_parm ;AN000; | ||
| 3183 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000; ;AN000; | ||
| 3184 | ADD des_start_packet.des_strt_pklen,2 ;increment size of parm block for another cp number | ||
| 3185 | INC des_start_packet.des_strt_pknum ;increment number of cp numbers | ||
| 3186 | ADD current_packet_cp_number,2 ;address next code page number slot | ||
| 3187 | MOV SI,current_packet_cp_number | ||
| 3188 | MOV BP,OFFSET des_start_packet | ||
| 3189 | .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF not skipped slot THEN | ||
| 3190 | MOV DX,parm_list[current_parm_DI].value1 ;AN000;store the number if one specified for this slot | ||
| 3191 | MOV [SI][BP].des_strt_pkcp1,DX ;put the number in the slot for the cp number | ||
| 3192 | .ENDIF ;AN000;not valid skipped codepage number, i.e. not (,850,,865) for example | ||
| 3193 | .ELSEIF <parser_return_code_AX EQ end_of_complex> THEN ;AN000; | ||
| 3194 | SUB DI,TYPE parm_list_entry ;don't want an entry in the parm list for the zeroed out ")" | ||
| 3195 | .ELSE | ||
| 3196 | CALL setup_invalid_parameter ;AN000; | ||
| 3197 | .ENDIF ;AN000; | ||
| 3198 | .UNTIL <parser_return_code_AX EQ end_of_complex> OR ;AN000;came to end of the cplist | ||
| 3199 | .UNTIL <noerror EQ false> | ||
| 3200 | POP command_line ;AN000;resume just after the closing paren of (cplist), should be at ) or filename | ||
| 3201 | .ELSE ;AN000;must be an error | ||
| 3202 | MOV message,OFFSET invalid_number_of_parameters ;AN000; | ||
| 3203 | MOV noerror,false ;AN000; | ||
| 3204 | .ENDIF | ||
| 3205 | .IF <noerror EQ true> THEN ;AN000;IF successfully broke down cplist and file name THEN | ||
| 3206 | MOV prepare_equal_match_flags,filespec+optional ;AN000;only thing valid is filespec | ||
| 3207 | MOV ordinal,0 ;AN000;don't need parser to count the parms anymore | ||
| 3208 | MOV prepare_min_parms,0 ;AN000;filename is optional | ||
| 3209 | ; A filespec may be next so colon cannot be a delimeter. | ||
| 3210 | modify_parser_control_block seperator_list,delete,colon ;AN000;want to find a keyword so don't stop on colons | ||
| 3211 | CALL parse_parm ;AN000; | ||
| 3212 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000; | ||
| 3213 | MOV AX,parm_list[current_parm_DI].value1 ;AN000;AX=OFFSET of filespec just encountered | ||
| 3214 | MOV cp_cb.font_filespec,AX ;AN000;set up pointer to filespec for modecp | ||
| 3215 | .ELSEIF <parser_return_code_AX EQ end_of_complex> THEN ;AN000;cartridge prepare, no filename | ||
| 3216 | MOV des_start_packet.des_strt_pkfl,DES_STRT_FL_CART ; 0001H=CARTRIDGE PREPARE, | ||
| 3217 | .ELSE ;AN000; | ||
| 3218 | CALL setup_invalid_parameter ;AN000; | ||
| 3219 | .ENDIF ;AN000; | ||
| 3220 | MOV request_type,codepage_prepare ;AN000;if encountered an error won't continue anyways | ||
| 3221 | .ENDIF ;AN000; | ||
| 3222 | POP command_line ;AN000;continue parsing after the origional complex, should be eol | ||
| 3223 | .ELSE ;AN000; | ||
| 3224 | MOV message,OFFSET invalid_number_of_parameters ;AN000;should have found a complex | ||
| 3225 | MOV noerror,false ;AN000; | ||
| 3226 | .ENDIF | ||
| 3227 | |||
| 3228 | MOV looking_for,eol ;AN000; | ||
| 3229 | |||
| 3230 | BREAK 12 ;AN000; | ||
| 3231 | |||
| 3232 | .ENDIF | ||
| 3233 | |||
| 3234 | |||
| 3235 | ; SELECT=: | ||
| 3236 | |||
| 3237 | |||
| 3238 | dummy1: | ||
| 3239 | PUBLIC DUMMY1 | ||
| 3240 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AN000; | ||
| 3241 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AN000; | ||
| 3242 | |||
| 3243 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000; | ||
| 3244 | MOV codepage_index_holder,current_parm_DI ;AN000;save index of the codepage parm list entry for invoke | ||
| 3245 | MOV request_type,codepage_select ;AN000; | ||
| 3246 | MOV looking_for,eol ;AN000; | ||
| 3247 | .ELSE ;AN000; | ||
| 3248 | CALL setup_invalid_parameter ;AN000; | ||
| 3249 | .ENDIF | ||
| 3250 | |||
| 3251 | BREAK 12 ;AN000; | ||
| 3252 | |||
| 3253 | .ENDIF | ||
| 3254 | |||
| 3255 | |||
| 3256 | |||
| 3257 | ; /STATUS: | ||
| 3258 | |||
| 3259 | |||
| 3260 | .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000; | ||
| 3261 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000; | ||
| 3262 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC002; | ||
| 3263 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000; | ||
| 3264 | |||
| 3265 | MOV request_type,codepage_status ;AN000; | ||
| 3266 | ;AX322; .IF <device_name EQ <OFFSET CON_str>> THEN | ||
| 3267 | MOV looking_for,eol ;AC322; | ||
| 3268 | ;AX322; .ELSE | ||
| 3269 | ;AX322; MOV looking_for,eol ;AN000; | ||
| 3270 | ;AX322; .ENDIF | ||
| 3271 | BREAK 12 ;AN000; | ||
| 3272 | |||
| 3273 | .ENDIF | ||
| 3274 | |||
| 3275 | |||
| 3276 | ; eol: | ||
| 3277 | |||
| 3278 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3279 | |||
| 3280 | MOV request_type,codepage_status ;AN000; | ||
| 3281 | MOV eol_found,true ;AN000; | ||
| 3282 | BREAK 12 ;AN000; | ||
| 3283 | |||
| 3284 | .ENDIF | ||
| 3285 | |||
| 3286 | |||
| 3287 | ; otherwise: | ||
| 3288 | |||
| 3289 | CALL setup_invalid_parameter ;AN000; | ||
| 3290 | ; BREAK | ||
| 3291 | |||
| 3292 | |||
| 3293 | ENDCASE_12: ;current_parm= | ||
| 3294 | |||
| 3295 | |||
| 3296 | BREAK 0 ;AN000; | ||
| 3297 | |||
| 3298 | |||
| 3299 | |||
| 3300 | |||
| 3301 | codepage_case: ;found PRN, only valid parms are CODEPAGE, and /STATUS | ||
| 3302 | ;/STATUS is in the the parser control blocks | ||
| 3303 | |||
| 3304 | CALL parse_parm ;AN000; | ||
| 3305 | ; CASE current_parm= | ||
| 3306 | |||
| 3307 | ; CODEPAGE: | ||
| 3308 | |||
| 3309 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum | ||
| 3310 | .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN | ||
| 3311 | |||
| 3312 | ;set up for codepage_prms_case | ||
| 3313 | ; modify_parser_control_block keywords,addd,codepage_keywords ;AN000;codepage parms handler assumes keywords setup | ||
| 3314 | MOV looking_for,codepage_prms ;AN000; | ||
| 3315 | BREAK 13 ;AN000; | ||
| 3316 | |||
| 3317 | .ENDIF | ||
| 3318 | |||
| 3319 | |||
| 3320 | ; /STATUS: ;only CODEPAGE or end of line valid next | ||
| 3321 | |||
| 3322 | .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000; | ||
| 3323 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000; | ||
| 3324 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004; | ||
| 3325 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000; | ||
| 3326 | |||
| 3327 | CALL parse_parm ;AN000; | ||
| 3328 | .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000; | ||
| 3329 | MOV looking_for,eol ;AN000; | ||
| 3330 | MOV status_request,true | ||
| 3331 | MOV request_type,codepage_status ;AN000; | ||
| 3332 | .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3333 | MOV eol_found,true ;AC005; | ||
| 3334 | MOV status_request,true ;AC005; | ||
| 3335 | MOV request_type,codepage_status ;AC005; | ||
| 3336 | .ELSE ;AN000; | ||
| 3337 | CALL setup_invalid_parameter ;AN000; | ||
| 3338 | .ENDIF | ||
| 3339 | BREAK 13 ;AN000; | ||
| 3340 | |||
| 3341 | .ENDIF | ||
| 3342 | |||
| 3343 | |||
| 3344 | ; eol: | ||
| 3345 | |||
| 3346 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3347 | |||
| 3348 | MOV request_type,codepage_status ;AN000; | ||
| 3349 | MOV eol_found,true ;AN000; | ||
| 3350 | BREAK 13 ;AN000; | ||
| 3351 | |||
| 3352 | .ENDIF | ||
| 3353 | |||
| 3354 | |||
| 3355 | |||
| 3356 | ; codepage_keyword_out_of_order: | ||
| 3357 | |||
| 3358 | |||
| 3359 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have | ||
| 3360 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage | ||
| 3361 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user | ||
| 3362 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP" | ||
| 3363 | |||
| 3364 | MOV message,OFFSET Invalid_number_of_parameters ;AC007; | ||
| 3365 | MOV noerror,false ;AC007; | ||
| 3366 | BREAK 13 ;AN000;CON_keyword | ||
| 3367 | |||
| 3368 | .ENDIF | ||
| 3369 | |||
| 3370 | |||
| 3371 | |||
| 3372 | ; REFRESH_out_of_order: ;AC007;forgot to include "CP" | ||
| 3373 | |||
| 3374 | |||
| 3375 | .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007; | ||
| 3376 | |||
| 3377 | MOV message,OFFSET Invalid_number_of_parameters ;AC007; | ||
| 3378 | MOV noerror,false ;AC007; | ||
| 3379 | ; BREAK 13 | ||
| 3380 | |||
| 3381 | .ELSE ;AC007; | ||
| 3382 | |||
| 3383 | |||
| 3384 | |||
| 3385 | ; otherwise: | ||
| 3386 | |||
| 3387 | CALL setup_invalid_parameter ;AN000; | ||
| 3388 | ; BREAK | ||
| 3389 | |||
| 3390 | .ENDIF ;AC007; | ||
| 3391 | |||
| 3392 | ENDCASE_13: | ||
| 3393 | |||
| 3394 | BREAK 0 ;AN000; | ||
| 3395 | |||
| 3396 | |||
| 3397 | |||
| 3398 | con_kwrd_status_or_cp_case: | ||
| 3399 | |||
| 3400 | PUBLIC con_kwrd_status_or_cp_case | ||
| 3401 | |||
| 3402 | MOV parms.parmsx_ptr,OFFSET con_parmsx | ||
| 3403 | CALL parse_parm ;AN000; | ||
| 3404 | |||
| 3405 | ; CASE current_parm= | ||
| 3406 | |||
| 3407 | |||
| 3408 | |||
| 3409 | ; codepage: | ||
| 3410 | |||
| 3411 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum | ||
| 3412 | .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN | ||
| 3413 | |||
| 3414 | MOV looking_for,codepage_prms ;AN000; | ||
| 3415 | BREAK 14 ;AN000; | ||
| 3416 | |||
| 3417 | .ENDIF | ||
| 3418 | |||
| 3419 | |||
| 3420 | ; eol: | ||
| 3421 | |||
| 3422 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3423 | |||
| 3424 | MOV request_type,all_con_status ;AN000;found only CON on the command line | ||
| 3425 | MOV eol_found,true ;AN000; | ||
| 3426 | BREAK 14 ;AN000; | ||
| 3427 | |||
| 3428 | .ENDIF | ||
| 3429 | |||
| 3430 | |||
| 3431 | |||
| 3432 | ; /STATUS: | ||
| 3433 | |||
| 3434 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000; | ||
| 3435 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004; | ||
| 3436 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000; | ||
| 3437 | |||
| 3438 | MOV slash_status,deleted ;AN000; | ||
| 3439 | MOV slash_stat,deleted ;AN000; | ||
| 3440 | MOV slash_sta,deleted ;AN000; | ||
| 3441 | MOV request_type,all_con_status ;AN000;found only CON on the command line | ||
| 3442 | MOV looking_for,eol ;AC665;have MODE CON /STATUS, must find eol now | ||
| 3443 | BREAK 14 ;AN000; | ||
| 3444 | |||
| 3445 | .ENDIF | ||
| 3446 | |||
| 3447 | |||
| 3448 | |||
| 3449 | ; con_keyword: | ||
| 3450 | |||
| 3451 | |||
| 3452 | .IF <parser_return_code_AX EQ no_error> AND ;make sure invalid value not specified ;AN000; | ||
| 3453 | .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;not pointing to /sta, not 0, must be a keyword | ||
| 3454 | |||
| 3455 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET rate_equal>> OR ;AN000; | ||
| 3456 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET del_equal>> OR ;AN000; | ||
| 3457 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET delay_equal>> THEN ;AN000; | ||
| 3458 | INC rate_and_delay_found ;found one, needs to be 2 before valid;AN000; | ||
| 3459 | .ELSEIF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have | ||
| 3460 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage | ||
| 3461 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user | ||
| 3462 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP" | ||
| 3463 | MOV message,OFFSET Invalid_number_of_parameters ;AC007; | ||
| 3464 | MOV noerror,false ;AC007; | ||
| 3465 | .ELSE | ||
| 3466 | .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET COLUMNS_equal>> AND ;AC007; | ||
| 3467 | .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET COLS_equal>> AND ;AC007; | ||
| 3468 | .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET lines_equal>> THEN ;AC007; | ||
| 3469 | CALL setup_invalid_parameter ;AC007;keyword other than LINES=, COLS=, RATE= or DELAY= would require CP | ||
| 3470 | .ENDIF ;AC007;and be handled above | ||
| 3471 | .ENDIF ;AN000; | ||
| 3472 | delete_parser_value_list_entry keywords,current_parm ;AN000;doesn't affect anything if invalid parm | ||
| 3473 | MOV looking_for,CON_keyword ;AN000;doesn't affect anything if invalid parm | ||
| 3474 | BREAK 14 ;AN000;CON_keyword | ||
| 3475 | |||
| 3476 | .ENDIF | ||
| 3477 | |||
| 3478 | |||
| 3479 | |||
| 3480 | ; REFRESH: ;AC007;forgot to include "CP" | ||
| 3481 | |||
| 3482 | |||
| 3483 | .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007; | ||
| 3484 | |||
| 3485 | MOV message,OFFSET Invalid_number_of_parameters ;AC007; | ||
| 3486 | MOV noerror,false ;AC007; | ||
| 3487 | ; BREAK | ||
| 3488 | |||
| 3489 | .ELSE ;AC007; | ||
| 3490 | |||
| 3491 | |||
| 3492 | |||
| 3493 | ; otherwise: | ||
| 3494 | |||
| 3495 | CALL setup_invalid_parameter ;AN000; | ||
| 3496 | ; BREAK | ||
| 3497 | |||
| 3498 | .ENDIF ;AC007; | ||
| 3499 | |||
| 3500 | |||
| 3501 | |||
| 3502 | ENDCASE_14: | ||
| 3503 | BREAK 0 ;AN000;con_kwrd_status_or_cp_case: | ||
| 3504 | |||
| 3505 | |||
| 3506 | |||
| 3507 | |||
| 3508 | con_keyword_case: ;found one, it has been deleted from the parser control blocks | ||
| 3509 | PUBLIC con_keyword_case | ||
| 3510 | |||
| 3511 | MOV slash_status,deleted ;AN000;remove /STA /STAT and STATUS | ||
| 3512 | MOV slash_stat,deleted ;AN000; | ||
| 3513 | MOV slash_sta,deleted ;AN000; | ||
| 3514 | |||
| 3515 | MOV i_CL,1 ;AN000; | ||
| 3516 | .WHILE <i_CL LT number_of_con_keywords> AND ;AN000; | ||
| 3517 | .WHILE <eol_found EQ false> AND ;AN000; | ||
| 3518 | .WHILE <noerror EQ true> DO ;AN000; | ||
| 3519 | PUSH CX | ||
| 3520 | |||
| 3521 | CALL parse_parm ;AN000; | ||
| 3522 | |||
| 3523 | ; CASE return_code= | ||
| 3524 | |||
| 3525 | ; con_keyword: | ||
| 3526 | |||
| 3527 | .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000; | ||
| 3528 | .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;not 0, must be a keyword ;AN000; | ||
| 3529 | |||
| 3530 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET rate_equal>> OR ;AN000; | ||
| 3531 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET del_equal>> OR ;AN000; | ||
| 3532 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET delay_equal>> THEN ;AN000; | ||
| 3533 | INC rate_and_delay_found ;found one, needs to be 2 before valid;AN000; | ||
| 3534 | .ENDIF | ||
| 3535 | delete_parser_value_list_entry keywords,current_parm ;AN000; | ||
| 3536 | INC i_CL ;AN000; | ||
| 3537 | BREAK 15 ;AN000; | ||
| 3538 | |||
| 3539 | .ENDIF ;AN000; | ||
| 3540 | |||
| 3541 | |||
| 3542 | ; eol: | ||
| 3543 | |||
| 3544 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3545 | |||
| 3546 | .IF <rate_and_delay_found EQ both> OR ;IF both OR neither found THEN | ||
| 3547 | .IF <rate_and_delay_found EQ false> THEN | ||
| 3548 | MOV request_type,set_con_features ;AN000; | ||
| 3549 | MOV eol_found,true ;AN000; | ||
| 3550 | .ELSE | ||
| 3551 | MOV message,OFFSET rate_and_delay_together ;RATE and DELAY must be specified together | ||
| 3552 | MOV noerror,false | ||
| 3553 | .ENDIF | ||
| 3554 | BREAK 15 ;AN000; | ||
| 3555 | |||
| 3556 | .ENDIF | ||
| 3557 | |||
| 3558 | |||
| 3559 | ; otherwise: | ||
| 3560 | |||
| 3561 | CALL setup_invalid_parameter ;AN000; | ||
| 3562 | ; BREAK | ||
| 3563 | |||
| 3564 | ENDCASE_15: | ||
| 3565 | |||
| 3566 | POP CX | ||
| 3567 | |||
| 3568 | .ENDWHILE ;AN000; | ||
| 3569 | |||
| 3570 | MOV looking_for,eol ;AN000;check for extraneous parms | ||
| 3571 | |||
| 3572 | BREAK 0 ;AN000;CON_keyword | ||
| 3573 | |||
| 3574 | |||
| 3575 | |||
| 3576 | |||
| 3577 | sd_or_dl_or_eol_case: | ||
| 3578 | |||
| 3579 | PUBLIC sd_or_dl_or_eol_case | ||
| 3580 | |||
| 3581 | ;have found a screen mode, now may find sd, dl, or eol | ||
| 3582 | |||
| 3583 | CALL parse_parm ;AN000; | ||
| 3584 | ; CASE current_parm= | ||
| 3585 | |||
| 3586 | ; sd: ;found R or L | ||
| 3587 | |||
| 3588 | .IF <parm_list[current_parm_DI].item_tag EQ L_item_tag> OR ;AN000; | ||
| 3589 | .IF <parm_list[current_parm_DI].item_tag EQ R_item_tag> THEN ;AN000; | ||
| 3590 | |||
| 3591 | MOV looking_for,T_or_EOL ;AN000;request_type already set | ||
| 3592 | BREAK 17 ;AN000; | ||
| 3593 | |||
| 3594 | .ENDIF | ||
| 3595 | |||
| 3596 | ; dl: | ||
| 3597 | |||
| 3598 | .IF <parm_list[current_parm_DI].item_tag EQ fourtythree_item_tag> OR ;AN000; | ||
| 3599 | .IF <parm_list[current_parm_DI].item_tag EQ fifty_item_tag> OR ;AN000; | ||
| 3600 | .IF <parm_list[current_parm_DI].item_tag EQ twentyfive_item_tag> THEN ;AN000; | ||
| 3601 | |||
| 3602 | MOV looking_for,eol ;AN000;request_type already set | ||
| 3603 | BREAK 17 ;AN000; | ||
| 3604 | |||
| 3605 | .ENDIF | ||
| 3606 | |||
| 3607 | |||
| 3608 | |||
| 3609 | ; eol: | ||
| 3610 | |||
| 3611 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3612 | |||
| 3613 | MOV eol_found,true ;AN000;request_type already set | ||
| 3614 | BREAK 17 ;AN000; | ||
| 3615 | |||
| 3616 | .ENDIF | ||
| 3617 | |||
| 3618 | |||
| 3619 | ; otherwise: regardless of what follows must have a parm here, didn't so yell | ||
| 3620 | |||
| 3621 | .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;two commas with nothing in between | ||
| 3622 | MOV message,OFFSET Invalid_number_of_parameters ;AN000; | ||
| 3623 | MOV noerror,false ;AN000; | ||
| 3624 | .ELSE ;AN000; | ||
| 3625 | CALL setup_invalid_parameter ;AN000;some bogus value or string | ||
| 3626 | .ENDIF ;AN000; | ||
| 3627 | |||
| 3628 | ; BREAK | ||
| 3629 | |||
| 3630 | |||
| 3631 | ENDCASE_17: | ||
| 3632 | BREAK 0 ;AN000;sd_or_dl_or_null | ||
| 3633 | |||
| 3634 | |||
| 3635 | |||
| 3636 | sd_or_dl_case: | ||
| 3637 | |||
| 3638 | PUBLIC sd_or_dl_case | ||
| 3639 | |||
| 3640 | ;have no first parm, now must find shift direction or screen lines | ||
| 3641 | |||
| 3642 | |||
| 3643 | CALL parse_parm ;AN000; | ||
| 3644 | ; CASE current_parm= | ||
| 3645 | |||
| 3646 | ; sd: | ||
| 3647 | |||
| 3648 | .IF <parm_list[current_parm_DI].item_tag EQ L_item_tag> OR ;AN000; | ||
| 3649 | .IF <parm_list[current_parm_DI].item_tag EQ R_item_tag> THEN ;AN000; | ||
| 3650 | |||
| 3651 | MOV looking_for,T_or_EOL ;AN000; | ||
| 3652 | MOV request_type,old_video_mode_set ;AN000; | ||
| 3653 | BREAK 18 ;AN000; | ||
| 3654 | |||
| 3655 | .ENDIF | ||
| 3656 | |||
| 3657 | |||
| 3658 | ; dl: | ||
| 3659 | |||
| 3660 | .IF <parm_list[current_parm_DI].item_tag EQ fourtythree_item_tag> OR ;AN000; | ||
| 3661 | .IF <parm_list[current_parm_DI].item_tag EQ fifty_item_tag> OR ;AN000; | ||
| 3662 | .IF <parm_list[current_parm_DI].item_tag EQ twentyfive_item_tag> THEN ;AN000; | ||
| 3663 | |||
| 3664 | MOV request_type,old_video_mode_set ;AN000; | ||
| 3665 | MOV looking_for,eol ;AN000; | ||
| 3666 | BREAK 18 ;AN000; | ||
| 3667 | |||
| 3668 | .ENDIF | ||
| 3669 | |||
| 3670 | |||
| 3671 | |||
| 3672 | ; eol: | ||
| 3673 | |||
| 3674 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3675 | |||
| 3676 | MOV message,OFFSET invalid_number_of_parameters ;AN000; | ||
| 3677 | MOV noerror,false ;AN000; | ||
| 3678 | MOV eol_found,true ;AN000; | ||
| 3679 | BREAK 18 ;AN000; | ||
| 3680 | |||
| 3681 | .ENDIF | ||
| 3682 | |||
| 3683 | |||
| 3684 | ; otherwise: | ||
| 3685 | |||
| 3686 | .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;two commas with nothing in between | ||
| 3687 | MOV message,OFFSET Invalid_number_of_parameters ;AN000; | ||
| 3688 | MOV noerror,false ;AN000; | ||
| 3689 | .ELSE ;AN000; | ||
| 3690 | CALL setup_invalid_parameter ;AN000;some bogus value or string | ||
| 3691 | .ENDIF ;AN000; | ||
| 3692 | ; BREAK | ||
| 3693 | |||
| 3694 | ENDCASE_18: | ||
| 3695 | BREAK 0 ;AN000;sd_or_dl | ||
| 3696 | |||
| 3697 | |||
| 3698 | |||
| 3699 | T_or_EOL_case: | ||
| 3700 | |||
| 3701 | |||
| 3702 | CALL parse_parm ;AN000; | ||
| 3703 | |||
| 3704 | ; CASE current_parm= | ||
| 3705 | |||
| 3706 | ; T: | ||
| 3707 | |||
| 3708 | .IF <parm_list[current_parm_DI].item_tag EQ T_item_tag> THEN ;AN000; | ||
| 3709 | |||
| 3710 | MOV looking_for,eol ;AN000;request_type already set | ||
| 3711 | BREAK 19 ;AN000; | ||
| 3712 | |||
| 3713 | .ENDIF | ||
| 3714 | |||
| 3715 | ; eol: | ||
| 3716 | |||
| 3717 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3718 | |||
| 3719 | MOV eol_found,true ;AN000;request_type already set | ||
| 3720 | BREAK 19 ;AN000; | ||
| 3721 | |||
| 3722 | .ENDIF | ||
| 3723 | |||
| 3724 | |||
| 3725 | ; otherwise: | ||
| 3726 | |||
| 3727 | CALL setup_invalid_parameter ;AN000; | ||
| 3728 | ; BREAK | ||
| 3729 | |||
| 3730 | ENDCASE_19: | ||
| 3731 | BREAK 0 ;AN000; | ||
| 3732 | |||
| 3733 | |||
| 3734 | |||
| 3735 | device_name_or_eol_case: ;have only /status so far | ||
| 3736 | |||
| 3737 | ;The device names are in the parser control blocks | ||
| 3738 | |||
| 3739 | CALL parse_parm | ||
| 3740 | ; CASE current_parm= | ||
| 3741 | |||
| 3742 | ; COM?: | ||
| 3743 | |||
| 3744 | MOV device_name,OFFSET COM1_str ;AC001; | ||
| 3745 | .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000; | ||
| 3746 | MOV device_name,OFFSET COM2_str ;AC001; | ||
| 3747 | .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000; | ||
| 3748 | MOV device_name,OFFSET COM3_str ;AC001; | ||
| 3749 | .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000; | ||
| 3750 | MOV device_name,OFFSET COM4_str ;AC001; | ||
| 3751 | .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000; | ||
| 3752 | |||
| 3753 | MOV looking_for,eol ;AN000; | ||
| 3754 | MOV request_type,com_status ;AN000; | ||
| 3755 | |||
| 3756 | BREAK 20 ;AN000; | ||
| 3757 | |||
| 3758 | .ENDIF | ||
| 3759 | |||
| 3760 | |||
| 3761 | ; LPT?, | ||
| 3762 | PRN: | ||
| 3763 | |||
| 3764 | MOV device_name,OFFSET LPT1_str ;AC001; | ||
| 3765 | .IF <parm_list[current_parm_DI].item_tag EQ PRN_item_tag> OR ;AN000; | ||
| 3766 | .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000; | ||
| 3767 | MOV device_name,OFFSET LPT2_str ;AC001; | ||
| 3768 | .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000; | ||
| 3769 | MOV device_name,OFFSET LPT3_str ;AC001; | ||
| 3770 | .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000; | ||
| 3771 | |||
| 3772 | MOV looking_for,eol ;AN000; | ||
| 3773 | MOV request_type,printer_status ;AN000; | ||
| 3774 | BREAK 20 ;AN000; | ||
| 3775 | |||
| 3776 | .ENDIF | ||
| 3777 | |||
| 3778 | |||
| 3779 | |||
| 3780 | ; CON: | ||
| 3781 | |||
| 3782 | .IF <parm_list[current_parm_DI].item_tag EQ CON_item_tag> THEN ;AN000; | ||
| 3783 | |||
| 3784 | MOV looking_for,eol ;AN000; | ||
| 3785 | MOV request_type,all_con_status ;AN000; | ||
| 3786 | BREAK 20 ;AN000; | ||
| 3787 | |||
| 3788 | .ENDIF | ||
| 3789 | |||
| 3790 | |||
| 3791 | ; eol: | ||
| 3792 | |||
| 3793 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 3794 | |||
| 3795 | MOV request_type,status_for_everything ;AN000; | ||
| 3796 | MOV eol_found,true ;AN000; | ||
| 3797 | BREAK 20 ;AN000; | ||
| 3798 | |||
| 3799 | .ENDIF | ||
| 3800 | |||
| 3801 | |||
| 3802 | ; otherwise: | ||
| 3803 | |||
| 3804 | CALL setup_invalid_parameter ;AN000; | ||
| 3805 | ; BREAK | ||
| 3806 | |||
| 3807 | ENDCASE_20: | ||
| 3808 | BREAK 0 ;AN000;device_name_or_eol | ||
| 3809 | |||
| 3810 | |||
| 3811 | first_parm_case: ;AN000; | ||
| 3812 | |||
| 3813 | |||
| 3814 | PUBLIC first_parm_case | ||
| 3815 | |||
| 3816 | ;set up for calls to system parser | ||
| 3817 | |||
| 3818 | MOV command_line,OFFSET first_char_in_command_line ;AN000;start parser at beginning of the command line | ||
| 3819 | MOV BX,OFFSET parm_lst ;set up parm_list ;AN000; | ||
| 3820 | XOR DI,DI ;AN000; | ||
| 3821 | SUB DI,TYPE parm_list_entry ;AN000;DI is negative, set up for first call to parse_parm | ||
| 3822 | |||
| 3823 | MOV parms.parmsx_ptr,OFFSET parmsx ;AN000;set up parms block for parser input | ||
| 3824 | |||
| 3825 | CALL parse_parm ;AN000;parse first parm, fill in "parm_list[current_parm_DI]" with the results | ||
| 3826 | |||
| 3827 | ; CASE current_parm= | ||
| 3828 | |||
| 3829 | dummy5: | ||
| 3830 | PUBLIC dummy5 | ||
| 3831 | |||
| 3832 | ; /status: | ||
| 3833 | |||
| 3834 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000; | ||
| 3835 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004; | ||
| 3836 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000; | ||
| 3837 | |||
| 3838 | MOV slash_status,deleted ;AN000;make it so /status again is an error | ||
| 3839 | MOV slash_stat,deleted ;AN000; | ||
| 3840 | MOV slash_sta,deleted | ||
| 3841 | MOV looking_for,device_name_or_eol ;AN000; | ||
| 3842 | BREAK 21 ;AN000; | ||
| 3843 | |||
| 3844 | .ENDIF | ||
| 3845 | |||
| 3846 | |||
| 3847 | ; null: ;no first parm | ||
| 3848 | |||
| 3849 | .IF <parser_return_code_AX EQ no_error> AND ;AN000; | ||
| 3850 | .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN000;valid null | ||
| 3851 | |||
| 3852 | MOV looking_for,sd_or_dl ;AN000; | ||
| 3853 | MOV parms.parmsx_ptr,OFFSET old_con_parmsx | ||
| 3854 | MOV ordinal,0 ;AN000;start over with new parmsx block | ||
| 3855 | MOV device_name,OFFSET CON_str | ||
| 3856 | MOV request_type,old_video_mode_set ;AN000; | ||
| 3857 | BREAK 21 ;AN000; | ||
| 3858 | |||
| 3859 | .ENDIF | ||
| 3860 | |||
| 3861 | |||
| 3862 | screen_modes: ;first parm is 80, BW80, MONO etc. | ||
| 3863 | |||
| 3864 | PUBLIC screen_modes | ||
| 3865 | |||
| 3866 | .IF <parm_list[current_parm_DI].item_tag GE first_screen_mode_item_tag> AND ;AN000; | ||
| 3867 | .IF <parm_list[current_parm_DI].item_tag LE last_screen_mode_item_tag> THEN ;AN000; | ||
| 3868 | |||
| 3869 | MOV parms.parmsx_ptr,OFFSET old_con_parmsx | ||
| 3870 | MOV ordinal,0 ;AN000;start over with new parmsx block | ||
| 3871 | MOV device_name,OFFSET CON_str | ||
| 3872 | MOV looking_for,sd_or_dl_or_eol ;AN000; | ||
| 3873 | MOV request_type,old_video_mode_set ;AN000; | ||
| 3874 | BREAK 21 ;AN000; | ||
| 3875 | |||
| 3876 | .ENDIF | ||
| 3877 | |||
| 3878 | |||
| 3879 | |||
| 3880 | ; LPT?132, | ||
| 3881 | ; LPT?80: | ||
| 3882 | |||
| 3883 | MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1 | ||
| 3884 | MOV device,"1" ;AC664;set up message | ||
| 3885 | MOV LPTNO,"1" ;see modeprin | ||
| 3886 | MOV parm_list[current_parm_DI+TYPE parm_list_entry].item_tag,onethirtytwo_item_tag ;AN000;save chars/line | ||
| 3887 | .IF <parm_list[current_parm_DI].item_tag EQ LPT1132_item_tag> OR ;AN000; | ||
| 3888 | MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2 | ||
| 3889 | MOV LPTNO,"2" ;see modeprin | ||
| 3890 | MOV device,"2" ;AC664;set up message | ||
| 3891 | .IF <parm_list[current_parm_DI].item_tag EQ LPT2132_item_tag> OR ;AN000; | ||
| 3892 | MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3 | ||
| 3893 | MOV LPTNO,"3" ;see modeprin | ||
| 3894 | MOV device,"3" ;AC664;set up message | ||
| 3895 | .IF <parm_list[current_parm_DI].item_tag EQ LPT3132_item_tag> OR ;AN000; | ||
| 3896 | MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1 | ||
| 3897 | MOV device,"1" ;AC664;set up message | ||
| 3898 | MOV LPTNO,"1" ;see modeprin | ||
| 3899 | MOV parm_list[current_parm_DI+TYPE parm_list_entry].item_tag,eighty_item_tag ;AN000;save chars/line | ||
| 3900 | .IF <parm_list[current_parm_DI].item_tag EQ LPT180_item_tag > OR ;AN000; | ||
| 3901 | MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2 | ||
| 3902 | MOV LPTNO,"2" ;see modeprin | ||
| 3903 | MOV device,"2" ;AC664;set up message | ||
| 3904 | .IF <parm_list[current_parm_DI].item_tag EQ LPT280_item_tag > OR ;AN000; | ||
| 3905 | MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3 | ||
| 3906 | MOV LPTNO,"3" ;see modeprin | ||
| 3907 | MOV device,"3" ;AC664;set up message | ||
| 3908 | .IF <parm_list[current_parm_DI].item_tag EQ LPT380_item_tag > THEN ;AN000; | ||
| 3909 | |||
| 3910 | |||
| 3911 | ADD DI,TYPE parm_list_entry ;AN000;already have chars per line so skip to next element in list | ||
| 3912 | MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000; | ||
| 3913 | MOV REFRESH_str,deleted ;AN007;no codepage stuff legal | ||
| 3914 | MOV REF_str,deleted ;AN007; | ||
| 3915 | MOV SEL_equal,deleted ;AN007; | ||
| 3916 | MOV SELECT_equal,deleted ;AN007; | ||
| 3917 | MOV PREP_equal,deleted ;AN007; | ||
| 3918 | MOV PREPARE_equal,deleted ;AN007; | ||
| 3919 | MOV ordinal,1 ;AN000;already found chars per line (cl) | ||
| 3920 | MOV looking_for,li_or_null ;AN000; | ||
| 3921 | MOV device_type,LPTX ;AN000; | ||
| 3922 | MOV request_type,old_initialize_printer_port ;AN000; | ||
| 3923 | BREAK 21 ;AN000; | ||
| 3924 | |||
| 3925 | .ELSE ;AN000;clean up after dorking the next parameter | ||
| 3926 | ADD DI,TYPE parm_list_entry ;AN000;point to next entry, the one that needs to be reinitialized | ||
| 3927 | CALL reset_parm_pointer ;AN000;reinitialize the second parm entry, DEC DI | ||
| 3928 | .ENDIF | ||
| 3929 | |||
| 3930 | |||
| 3931 | |||
| 3932 | ; LPT1:=, | ||
| 3933 | ; LPT1=, | ||
| 3934 | ; LPT2:=, | ||
| 3935 | ; LPT2=, | ||
| 3936 | ; LPT3:=, | ||
| 3937 | ; LPT3=: | ||
| 3938 | |||
| 3939 | |||
| 3940 | ;have control blocks set up to find COM strings as value of keyword | ||
| 3941 | |||
| 3942 | MOV lptno,0 ;lptno=BIOS digestable printer number for LPT1 set up for modeecho | ||
| 3943 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT1_colon_equal>> OR ;AN000; | ||
| 3944 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT1_equal>> OR ;AN000; | ||
| 3945 | MOV lptno,1 ;set up for modeecho | ||
| 3946 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT2_colon_equal>> OR ;AN000; | ||
| 3947 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT2_equal>> OR ;AN000; | ||
| 3948 | MOV lptno,2 ;set up for modeecho | ||
| 3949 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT3_colon_equal>> OR ;AN000; | ||
| 3950 | .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT3_equal>> THEN ;AN000; | ||
| 3951 | MOV device,"1" ;set up for call to modeecho | ||
| 3952 | .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000; | ||
| 3953 | MOV device,"2" ;set up for call to modeecho | ||
| 3954 | .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000; | ||
| 3955 | MOV device,"3" ;set up for call to modeecho | ||
| 3956 | .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000; | ||
| 3957 | MOV device,"4" ;set up for call to modeecho | ||
| 3958 | .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000; | ||
| 3959 | |||
| 3960 | MOV looking_for,eol ;AN000; | ||
| 3961 | MOV request_type,printer_reroute ;AN000; | ||
| 3962 | MOV reroute_requested,true ;AN000; | ||
| 3963 | MOV device_type,LPTX | ||
| 3964 | BREAK 21 ;AN000; | ||
| 3965 | |||
| 3966 | .ELSE ;AN000; | ||
| 3967 | MOV message,OFFSET com1_or_com2 ;AN000;"Must specify COM1, COM2, COM3 or COM4" | ||
| 3968 | .ENDIF | ||
| 3969 | .ENDIF | ||
| 3970 | |||
| 3971 | |||
| 3972 | |||
| 3973 | ; LPTX,: found "LPTX," so chars per line has been skipped | ||
| 3974 | |||
| 3975 | .IF <terminating_delimeter EQ comma> AND NEAR ;AC007;handle other cases later, looking only for "LPTX," now | ||
| 3976 | MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1 | ||
| 3977 | MOV device,"1" ;AC664;set up message | ||
| 3978 | MOV LPTNO,"1" ;see modeprin | ||
| 3979 | .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000; | ||
| 3980 | MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2 | ||
| 3981 | MOV LPTNO,"2" ;see modeprin | ||
| 3982 | MOV device,"2" ;AC664;set up message | ||
| 3983 | .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000; | ||
| 3984 | MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3 | ||
| 3985 | MOV LPTNO,"3" ;see modeprin | ||
| 3986 | MOV device,"3" ;AC664;set up message | ||
| 3987 | .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000; | ||
| 3988 | |||
| 3989 | MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000; | ||
| 3990 | MOV lines_value_ptr,OFFSET LPT_lines_values ;AN000; | ||
| 3991 | MOV lines_match_flag,simple_string ;AN000;printer lines values are strings | ||
| 3992 | MOV REFRESH_str,deleted ;AN007;no codepage stuff legal | ||
| 3993 | MOV REF_str,deleted ;AN007; | ||
| 3994 | MOV SEL_equal,deleted ;AN007; | ||
| 3995 | MOV SELECT_equal,deleted ;AN007; | ||
| 3996 | MOV PREP_equal,deleted ;AN007; | ||
| 3997 | MOV PREPARE_equal,deleted ;AN007; | ||
| 3998 | MOV ordinal,1 ;AN000;new parmsx, skip chars per line positional | ||
| 3999 | ADD DI,TYPE parm_list_entry ;create entry for skipped chars per line ;AN000; | ||
| 4000 | MOV looking_for,li_or_null ;AN000; | ||
| 4001 | MOV device_type,LPTX ;for rescode | ||
| 4002 | MOV request_type,old_initialize_printer_port ;AN000; | ||
| 4003 | BREAK 21 ;AN000; | ||
| 4004 | |||
| 4005 | .ENDIF | ||
| 4006 | |||
| 4007 | |||
| 4008 | |||
| 4009 | |||
| 4010 | ; need to use colon as a delimeter in following cases | ||
| 4011 | |||
| 4012 | modify_parser_control_block seperator_list,addd,colon ;AN000;want to stop on colons | ||
| 4013 | |||
| 4014 | CALL reset_parm_pointer ;reset to first entry in the parm list | ||
| 4015 | MOV ordinal,0 ;start with the first parm again | ||
| 4016 | MOV command_line,OFFSET first_char_in_command_line ;look at first part of command line again | ||
| 4017 | CALL parse_parm ;AN000;parse the first parm again | ||
| 4018 | |||
| 4019 | |||
| 4020 | ; COM?: | ||
| 4021 | |||
| 4022 | |||
| 4023 | MOV device_name,OFFSET COM1_str ;AN000;assume COM1 | ||
| 4024 | MOV device,"1" ;AN000;set up message | ||
| 4025 | .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000; | ||
| 4026 | MOV device_name,OFFSET COM2_str ;AN000;assume COM2 | ||
| 4027 | MOV device,"2" ;AN000;set up message | ||
| 4028 | .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000; | ||
| 4029 | MOV device_name,OFFSET COM3_str ;AN000;assume COM3 | ||
| 4030 | MOV device,"3" ;AN000;;set up message | ||
| 4031 | .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000; | ||
| 4032 | MOV device_name,OFFSET COM4_str ;AN000;assume COM4 | ||
| 4033 | MOV device,"4" ;AN000;;set up message | ||
| 4034 | .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000; | ||
| 4035 | |||
| 4036 | MOV parms.parmsx_ptr,OFFSET com_parmsx ;AN000; | ||
| 4037 | MOV ordinal,0 ;AN000;new parmsx, start with new number of positionals, start at first one | ||
| 4038 | MOV looking_for,com_keyword_or_baud ;AN000; | ||
| 4039 | MOV device_type,COMX ;AN000;;set up for rescode | ||
| 4040 | BREAK 21 ;AN000; | ||
| 4041 | |||
| 4042 | .ENDIF | ||
| 4043 | |||
| 4044 | |||
| 4045 | |||
| 4046 | ; LPT?: | ||
| 4047 | |||
| 4048 | MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1 | ||
| 4049 | MOV device,"1" ;AC664;set up message | ||
| 4050 | MOV LPTNO,"1" ;see modeprin | ||
| 4051 | .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000; | ||
| 4052 | MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2 | ||
| 4053 | MOV LPTNO,"2" ;see modeprin | ||
| 4054 | MOV device,"2" ;AC664;set up message | ||
| 4055 | .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000; | ||
| 4056 | MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3 | ||
| 4057 | MOV LPTNO,"3" ;see modeprin | ||
| 4058 | MOV device,"3" ;AC664;set up message | ||
| 4059 | .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000; | ||
| 4060 | |||
| 4061 | MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000; | ||
| 4062 | MOV columns_value_ptr,OFFSET LPT_columns_values ;AN000; | ||
| 4063 | MOV lines_value_ptr,OFFSET LPT_lines_values ;AN000; | ||
| 4064 | MOV columns_match_flag,simple_string ;AN000;printer columns values are strings | ||
| 4065 | MOV lines_match_flag,simple_string ;AN000;printer lines values are strings | ||
| 4066 | MOV ordinal,0 ;AN000;new parmsx so start over counting positionals | ||
| 4067 | MOV looking_for,prn_kw_status_cp_cl_null ;AN000; | ||
| 4068 | MOV device_type,LPTX ;for rescode | ||
| 4069 | BREAK 21 ;AN000; | ||
| 4070 | |||
| 4071 | .ENDIF | ||
| 4072 | |||
| 4073 | |||
| 4074 | ; PRN: | ||
| 4075 | |||
| 4076 | .IF <parm_list[current_parm_DI].item_tag EQ PRN_item_tag> THEN ;AN000; | ||
| 4077 | |||
| 4078 | MOV looking_for,codepage ;AN000; | ||
| 4079 | MOV device_name,OFFSET LPT1_str ;AN000; | ||
| 4080 | BREAK 21 ;AN000; | ||
| 4081 | |||
| 4082 | .ENDIF | ||
| 4083 | |||
| 4084 | |||
| 4085 | ; CON: | ||
| 4086 | |||
| 4087 | .IF <parm_list[current_parm_DI].item_tag EQ CON_item_tag> THEN ;AN000; | ||
| 4088 | |||
| 4089 | MOV parms.parmsx_ptr,OFFSET con_parmsx ;AN000;set up for con parms | ||
| 4090 | MOV ordinal,0 ;AN000;start over with new parmsx block | ||
| 4091 | MOV looking_for,BYTE PTR con_kwrd_status_or_cp ;AN000; | ||
| 4092 | MOV device_name,OFFSET CON_str | ||
| 4093 | BREAK 21 | ||
| 4094 | |||
| 4095 | .ENDIF | ||
| 4096 | |||
| 4097 | |||
| 4098 | |||
| 4099 | ; eol: ;no parms specified | ||
| 4100 | |||
| 4101 | .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000; | ||
| 4102 | |||
| 4103 | MOV request_type,status_for_everything ;AN000; | ||
| 4104 | MOV eol_found,true ;AN000; | ||
| 4105 | BREAK 21 ;AN000; | ||
| 4106 | |||
| 4107 | .ENDIF | ||
| 4108 | |||
| 4109 | |||
| 4110 | |||
| 4111 | ; COM?baud: | ||
| 4112 | |||
| 4113 | |||
| 4114 | MOV parms.parmsx_ptr, OFFSET mutant_COM_parmsx | ||
| 4115 | ;for i in 1 through 4 see if the parm is COMi | ||
| 4116 | MOV match_found,false ;AN000; | ||
| 4117 | MOV i_CL,0 ;AN000;CL:="1" | ||
| 4118 | .WHILE <i_CL LT 4> AND ;AN000; | ||
| 4119 | .WHILE <match_found EQ false> DO ;AN000; | ||
| 4120 | CALL reset_parm_pointer ;AN000;prepare to reparse the parm | ||
| 4121 | INC i_CL ;AN000;use next number as a delimeter | ||
| 4122 | MOV parm_list[current_parm_DI].item_tag,i_CL ;AN000;depends on COM1 thru 4 item tags being 1 thru 4 | ||
| 4123 | PUSH CX ;AN000;save the loop counter (the binary form) | ||
| 4124 | ADD i_CL,binary_to_ASCII ;CL=ASCII representation of the index | ||
| 4125 | modify_parser_control_block seperator_list,addd,i_CL ;AN000;make the number (1 to 4)a seperator | ||
| 4126 | MOV ordinal,0 ;AN000;look at first parm each time | ||
| 4127 | MOV command_line,OFFSET first_char_in_command_line ;set parser up at start of the command line each time | ||
| 4128 | PUSH CX ;AN000;save the delimeter (ASCII form) | ||
| 4129 | CALL parse_parm ;AN000; | ||
| 4130 | ; .IF <parm_list[current_parm_DI].item_tag EQ COM_item_tag> THEN ;AN000;isloated "COM" so found "COM?" | ||
| 4131 | .IF <parser_return_code_AX EQ no_error> THEN ;AN000;isloated "COM" so found "COMx" | ||
| 4132 | MOV match_found,true ;AN000; | ||
| 4133 | .ENDIF | ||
| 4134 | POP CX ;AN000;restore the ASCII delimeter | ||
| 4135 | modify_parser_control_block seperator_list,delete,i_CL ;AN000;fix parser control blocks | ||
| 4136 | POP CX ;restore the loop counter | ||
| 4137 | .ENDWHILE ;AN000; | ||
| 4138 | .IF <match_found EQ true> THEN ;AN000;IF have COMX THEN look for valid baud | ||
| 4139 | .IF <i_CL EQ 1> THEN ;AN000; | ||
| 4140 | MOV device_name,OFFSET COM1_str ;AN000; | ||
| 4141 | MOV parm_list[current_parm_DI].value1,OFFSET COM1_str ;AN000;setup for modecom existence check | ||
| 4142 | MOV device,"1" ;AN000;set up message | ||
| 4143 | .ELSEIF <i_CL EQ 2> THEN ;AN000; | ||
| 4144 | MOV device_name,OFFSET COM2_str ;AN000; | ||
| 4145 | MOV parm_list[current_parm_DI].value1,OFFSET COM2_str ;AN000;setup for modecom existence check | ||
| 4146 | MOV device,"2" ;AN000;set up message | ||
| 4147 | .ELSEIF <i_CL EQ 3> THEN ;AN000; | ||
| 4148 | MOV device_name,OFFSET COM3_str ;AN000; | ||
| 4149 | MOV parm_list[current_parm_DI].value1,OFFSET COM3_str ;AN000;setup for modecom existence check | ||
| 4150 | MOV device,"3" ;AN000;set up message | ||
| 4151 | .ELSE;IF <i_CL EQ 4> THEN ;AN000; | ||
| 4152 | MOV device_name,OFFSET COM4_str ;AN000; | ||
| 4153 | MOV parm_list[current_parm_DI].value1,OFFSET COM4_str ;AN000;setup for modecom existence check | ||
| 4154 | MOV device,"4" ;AN000;set up message | ||
| 4155 | .ENDIF ;AN000; | ||
| 4156 | |||
| 4157 | MOV parms.parmsx_ptr,OFFSET com_parmsx ;AN000; | ||
| 4158 | MOV ordinal,0 ;AN000;start with baud in new parmsx | ||
| 4159 | MOV looking_for,com_keyword_or_baud ;AN000; | ||
| 4160 | MOV device_type,COMX ;set up for rescode | ||
| 4161 | BREAK 21 ;AN000; | ||
| 4162 | |||
| 4163 | |||
| 4164 | ; otherwise: ;first parm was nothing recognizable | ||
| 4165 | |||
| 4166 | .ELSE | ||
| 4167 | |||
| 4168 | dummy4: | ||
| 4169 | PUBLIC dummy4 | ||
| 4170 | |||
| 4171 | MOV ordinal,0 ;AN000;parse first parm again | ||
| 4172 | MOV command_line,OFFSET first_char_in_command_line ;set parser up at start of the command line one more time | ||
| 4173 | modify_parser_control_block seperator_list,addd,"." ;AN000;want to stop on periods | ||
| 4174 | modify_parser_control_block seperator_list,addd,'"' ;AN000;want to stop on quotes | ||
| 4175 | modify_parser_control_block seperator_list,addd,'\' ;AN000;want to stop on back slashes | ||
| 4176 | modify_parser_control_block seperator_list,addd,'[' ;AN000;want to stop on left brackets | ||
| 4177 | modify_parser_control_block seperator_list,addd,']' ;AN000;want to stop on right brackets | ||
| 4178 | modify_parser_control_block seperator_list,addd,'+' ;AN000;want to stop on plus signs | ||
| 4179 | ;AC003; modify_parser_control_block seperator_list,addd,';' ;AN000;want to stop on semicolons | ||
| 4180 | |||
| 4181 | CALL parse_parm | ||
| 4182 | CALL setup_invalid_parameter ;AN000; | ||
| 4183 | ; BREAK | ||
| 4184 | |||
| 4185 | .ENDIF | ||
| 4186 | |||
| 4187 | ENDCASE_21: | ||
| 4188 | |||
| 4189 | BREAK 0 ;AN000;first_parm | ||
| 4190 | |||
| 4191 | |||
| 4192 | |||
| 4193 | eol_case: | ||
| 4194 | |||
| 4195 | CALL parse_parm ;AN000; | ||
| 4196 | .IF <parser_return_code_AX NE end_of_command_line> THEN ;AN000; | ||
| 4197 | MOV message,OFFSET invalid_number_of_parameters ;AN000; | ||
| 4198 | MOV noerror,false ;AN000; | ||
| 4199 | .ELSE NEAR ;AN000; | ||
| 4200 | MOV eol_found,true ;AN000; | ||
| 4201 | .ENDIF | ||
| 4202 | ; BREAK | ||
| 4203 | |||
| 4204 | |||
| 4205 | |||
| 4206 | ENDCASE_0: ;AN000;looking_for= | ||
| 4207 | |||
| 4208 | .ENDWHILE ;AN000; | ||
| 4209 | |||
| 4210 | .IF <message NE no_message> THEN | ||
| 4211 | display message | ||
| 4212 | .ENDIF | ||
| 4213 | |||
| 4214 | RET | ||
| 4215 | |||
| 4216 | parse_parameters ENDP | ||
| 4217 | |||
| 4218 | |||
| 4219 | |||
| 4220 | |||
| 4221 | |||
| 4222 | |||
| 4223 | |||
| 4224 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4225 | ;³ | ||
| 4226 | ;³ SEPERATOR_LIST | ||
| 4227 | ;³ -------------- | ||
| 4228 | ;³ | ||
| 4229 | ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm | ||
| 4230 | ;³ become apparent and the parser control blocks need to be changed to correctly | ||
| 4231 | ;³ parse the next parm. This procedure is responsible for manipulating the | ||
| 4232 | ;³ list of seperators as requested. | ||
| 4233 | ;³ | ||
| 4234 | ;³ | ||
| 4235 | ;³ | ||
| 4236 | ;³ | ||
| 4237 | ;³ INPUT: action (in BX) - A scalar immediate indicating whether the seperator | ||
| 4238 | ;³ is to be added or deleted. | ||
| 4239 | ;³ | ||
| 4240 | ;³ seperator_charactor (in AL) - The seperator character to be added or | ||
| 4241 | ;³ deleted from the seperator list | ||
| 4242 | ;³ | ||
| 4243 | ;³ | ||
| 4244 | ;³ RETURN: none | ||
| 4245 | ;³ | ||
| 4246 | ;³ | ||
| 4247 | ;³ MESSAGES: none | ||
| 4248 | ;³ | ||
| 4249 | ;³ | ||
| 4250 | ;³ | ||
| 4251 | ;³ REGISTER | ||
| 4252 | ;³ USAGE: | ||
| 4253 | ;³ | ||
| 4254 | ;³ | ||
| 4255 | ;³ | ||
| 4256 | ;³ CONVENTIONS: | ||
| 4257 | ;³ | ||
| 4258 | ;³ | ||
| 4259 | ;³ ASSUMPTIONS: The character exists in the list before it is deleted. | ||
| 4260 | ;³ A character being added is not already in the list. | ||
| 4261 | ;³ There is no "extra end of line list". | ||
| 4262 | ;³ Direction flag is cleared so REPs will increment index reg | ||
| 4263 | ;³ ES and DS are the same and address data | ||
| 4264 | ;³ | ||
| 4265 | ;³ | ||
| 4266 | ;³ | ||
| 4267 | ;³ | ||
| 4268 | ;³ | ||
| 4269 | ;³ | ||
| 4270 | ;³ SIDE EFFECT: | ||
| 4271 | ;³ | ||
| 4272 | ;³ | ||
| 4273 | ;³ | ||
| 4274 | ;³ | ||
| 4275 | ;³ | ||
| 4276 | ;³ LOGIC: | ||
| 4277 | ;³ | ||
| 4278 | ;³ | ||
| 4279 | ;³ CASE action= | ||
| 4280 | ;³ | ||
| 4281 | ;³ add: | ||
| 4282 | ;³ | ||
| 4283 | ;³ skip to end of seperators list ;use parms.seperators_len to find end | ||
| 4284 | ;³ overwrite zero with AL | ||
| 4285 | ;³ overwrite blank space holder in the delimeter list with AL | ||
| 4286 | ;³ INC parms.seperators_len | ||
| 4287 | ;³ BREAK | ||
| 4288 | ;³ | ||
| 4289 | ;³ | ||
| 4290 | ;³ delete: | ||
| 4291 | ;³ | ||
| 4292 | ;³ DEC parms.seperators_len | ||
| 4293 | ;³ scan to seperator char to be deleted | ||
| 4294 | ;³ shift remaining chars to left | ||
| 4295 | ;³ put zero at end for length of the extra EOL list | ||
| 4296 | ;³ BREAK | ||
| 4297 | ;³ | ||
| 4298 | ;³ ENDCASE | ||
| 4299 | ;³ | ||
| 4300 | ;³ | ||
| 4301 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4302 | |||
| 4303 | |||
| 4304 | seperator_list PROC NEAR | ||
| 4305 | |||
| 4306 | ;CASE modifier= | ||
| 4307 | |||
| 4308 | SHL BX,1 ;AN000;BX=word displacement into jump table | ||
| 4309 | JMP jump_table2[BX] ;AN000;jump to appropriate jump | ||
| 4310 | |||
| 4311 | jump_table2 LABEL WORD | ||
| 4312 | |||
| 4313 | DW OFFSET add_case ;AN000; | ||
| 4314 | DW OFFSET delete_case ;AN000; | ||
| 4315 | |||
| 4316 | |||
| 4317 | add_case: | ||
| 4318 | |||
| 4319 | |||
| 4320 | XOR BX,BX | ||
| 4321 | MOV BL,parms.seperators_len ;AN000;BX=length of seperators list | ||
| 4322 | ADD BX,OFFSET parms | ||
| 4323 | MOV [BX].seperators,AL ;AN000;overwrite blank with AL | ||
| 4324 | INC parms.seperators_len ;AN000;adjust for added seperator | ||
| 4325 | BREAK 22 ;AN000; | ||
| 4326 | |||
| 4327 | |||
| 4328 | delete_case: | ||
| 4329 | |||
| 4330 | ;scan to seperator char to be deleted | ||
| 4331 | |||
| 4332 | PUSH DI | ||
| 4333 | |||
| 4334 | MOV DI,OFFSET parms | ||
| 4335 | ADD DI,OFFSET seperators ;ES:DI=>seperator list | ||
| 4336 | REPNE SCASB | ||
| 4337 | DEC DI ;AN000;DI=>char to be deleted | ||
| 4338 | MOV ES:[DI],BYTE PTR blank ;duplicate but harmless blank | ||
| 4339 | |||
| 4340 | POP DI | ||
| 4341 | |||
| 4342 | BREAK 22 ;AN000; | ||
| 4343 | |||
| 4344 | ENDCASE_22: | ||
| 4345 | |||
| 4346 | RET | ||
| 4347 | |||
| 4348 | seperator_list ENDP | ||
| 4349 | |||
| 4350 | |||
| 4351 | ;------------------------------------------------------------------------------- | ||
| 4352 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4353 | ;³ | ||
| 4354 | ;³ KEYWORDS | ||
| 4355 | ;³ -------- | ||
| 4356 | ;³ | ||
| 4357 | ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm | ||
| 4358 | ;³ become apparent and the parser control blocks need to be changed to correctly | ||
| 4359 | ;³ parse the next parm. This procedure is responsible for manipulating the | ||
| 4360 | ;³ list of keywords as requested. | ||
| 4361 | ;³ | ||
| 4362 | ;³ | ||
| 4363 | ;³ | ||
| 4364 | ;³ | ||
| 4365 | ;³# INPUT: action (in BX) - A scalar immediate indicating whether the keyword | ||
| 4366 | ;³# is to be added or deleted. | ||
| 4367 | ;³# | ||
| 4368 | ;³# | ||
| 4369 | ;³# string (in RL) - A scalar immediate or OFFSET, indicating/pointing | ||
| 4370 | ;³# to the keyword or set of keywords to be added | ||
| 4371 | ;³# or deleted. | ||
| 4372 | ;³ | ||
| 4373 | ;³ | ||
| 4374 | ;³ | ||
| 4375 | ;³ RETURN: none | ||
| 4376 | ;³ | ||
| 4377 | ;³ | ||
| 4378 | ;³ MESSAGES: none | ||
| 4379 | ;³ | ||
| 4380 | ;³ | ||
| 4381 | ;³ | ||
| 4382 | ;³ | ||
| 4383 | ;³ REGISTER | ||
| 4384 | ;³ USAGE: | ||
| 4385 | ;³ | ||
| 4386 | ;³ | ||
| 4387 | ;³ | ||
| 4388 | ;³ CONVENTIONS: | ||
| 4389 | ;³ | ||
| 4390 | ;³ | ||
| 4391 | ;³ | ||
| 4392 | ;³ | ||
| 4393 | ;³ ASSUMPTIONS: | ||
| 4394 | ;³ | ||
| 4395 | ;³ | ||
| 4396 | ;³ | ||
| 4397 | ;³ | ||
| 4398 | ;³ SIDE EFFECT: | ||
| 4399 | ;³ | ||
| 4400 | ;³ | ||
| 4401 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4402 | |||
| 4403 | |||
| 4404 | keywords PROC NEAR | ||
| 4405 | |||
| 4406 | ; use result.synonym to find the the keyword to delete | ||
| 4407 | |||
| 4408 | MOV SI,parm_list[current_parm_DI].keyword_switch_ptr ;SI=>the keyword string to be deleted | ||
| 4409 | MOV BYTE PTR ES:[SI],deleted ;AN000;zilch out first byte of the keyword string | ||
| 4410 | |||
| 4411 | |||
| 4412 | RET | ||
| 4413 | |||
| 4414 | keywords ENDP | ||
| 4415 | |||
| 4416 | ;------------------------------------------------------------------------------- | ||
| 4417 | |||
| 4418 | |||
| 4419 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4420 | ;³ | ||
| 4421 | ;³ PARSE_PARM | ||
| 4422 | ;³ ---------- | ||
| 4423 | ;³ | ||
| 4424 | ;³ Add the parm found to the parm_list. Save the pointer to the current parm | ||
| 4425 | ;³ for use by CALL reset_parm_pointer. When a reset call from reset_parm | ||
| 4426 | ;³ happens the pointer to the last entry in the parm list is decremented, which | ||
| 4427 | ;³ will put the results of the next parse over that entry. | ||
| 4428 | ;³ | ||
| 4429 | ;³ | ||
| 4430 | ;³ | ||
| 4431 | ;³ | ||
| 4432 | ;³ | ||
| 4433 | ;³ | ||
| 4434 | ;³ | ||
| 4435 | ;³ | ||
| 4436 | ;³ | ||
| 4437 | ;³ | ||
| 4438 | ;³ | ||
| 4439 | ;³ INPUT: | ||
| 4440 | ;³ | ||
| 4441 | ;³ | ||
| 4442 | ;³ RETURN: The next parm list entry is filled with the results of the call to | ||
| 4443 | ;³ the parser. If the parser returns an error other than "end of | ||
| 4444 | ;³ command line" the entry is not filled in. If the parser returns | ||
| 4445 | ;³ "end of command line" the .type field is set to end_of_command_line. | ||
| 4446 | ;³ | ||
| 4447 | ;³ | ||
| 4448 | ;³ MESSAGES: none | ||
| 4449 | ;³ | ||
| 4450 | ;³ | ||
| 4451 | ;³ | ||
| 4452 | ;³ | ||
| 4453 | ;³ | ||
| 4454 | ;³ | ||
| 4455 | ;³ | ||
| 4456 | ;³ | ||
| 4457 | ;³ | ||
| 4458 | ;³ | ||
| 4459 | ;³ | ||
| 4460 | ;³ REGISTER | ||
| 4461 | ;³ USAGE: | ||
| 4462 | ;³ | ||
| 4463 | ;³ | ||
| 4464 | ;³ | ||
| 4465 | ;³ CONVENTIONS: | ||
| 4466 | ;³ | ||
| 4467 | ;³ | ||
| 4468 | ;³ | ||
| 4469 | ;³ | ||
| 4470 | ;³ | ||
| 4471 | ;³ | ||
| 4472 | ;³ | ||
| 4473 | ;³ ASSUMPTIONS: | ||
| 4474 | ;³ | ||
| 4475 | ;³ | ||
| 4476 | ;³ | ||
| 4477 | ;³ | ||
| 4478 | ;³ | ||
| 4479 | ;³ | ||
| 4480 | ;³ | ||
| 4481 | ;³ | ||
| 4482 | ;³ SIDE EFFECT: | ||
| 4483 | ;³ | ||
| 4484 | ;³ | ||
| 4485 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4486 | |||
| 4487 | parse_parm PROC | ||
| 4488 | |||
| 4489 | PUBLIC PARSE_PARM | ||
| 4490 | |||
| 4491 | ADD current_parm_DI, TYPE parm_list_entry | ||
| 4492 | |||
| 4493 | PUSH current_parm_DI ;save index into parsed parms list | ||
| 4494 | PUSH BX ;save the address of the parsed parms list | ||
| 4495 | |||
| 4496 | MOV DI,OFFSET PARMS ; ES:DI=>PARSE CONTROL DEFINITON | ||
| 4497 | MOV SI,COMMAND_line ; DS:SI=>unparsed portion of the command line | ||
| 4498 | MOV DX,0 ; RESERVED | ||
| 4499 | MOV CX,ordinal ; OPERAND ORDINAL | ||
| 4500 | EXTRN SYSPARSE:NEAR | ||
| 4501 | CALL SYSPARSE ;AX=return code, DX=>result buffer | ||
| 4502 | MOV ordinal,CX ;save for next call | ||
| 4503 | MOV terminating_delimeter,BL ;save the character that delimited the parm | ||
| 4504 | |||
| 4505 | POP BX ;restore parm_list | ||
| 4506 | POP current_parm_DI ;nothing returned in DI anyway | ||
| 4507 | |||
| 4508 | MOV CX,command_line ;AN000;CX=>first char of the bad parm | ||
| 4509 | MOV offending_parameter_ptr,CX ;AN000;set pointer in message | ||
| 4510 | |||
| 4511 | ; .IF <parser_return_code_AX EQ no_error> THEN | ||
| 4512 | MOV command_line,SI ;save pointer to remainder of the command line | ||
| 4513 | .IF <parser_return_code_AX NE end_of_command_line> THEN | ||
| 4514 | MOV DL,result.ret_type | ||
| 4515 | MOV parm_list[current_parm_DI].parm_type,DL | ||
| 4516 | MOV DL,result.item_tag | ||
| 4517 | MOV parm_list[current_parm_DI].item_tag,DL | ||
| 4518 | MOV DX,result.ret_value1 | ||
| 4519 | MOV parm_list[current_parm_DI].value1,DX | ||
| 4520 | MOV DX,result.ret_value2 | ||
| 4521 | MOV parm_list[current_parm_DI].value2,DX | ||
| 4522 | MOV DX,result.synonym | ||
| 4523 | MOV parm_list[current_parm_DI].keyword_switch_ptr,DX | ||
| 4524 | .ENDIF | ||
| 4525 | ; .ELSE ;AN000;encountered an error | ||
| 4526 | ; MOV CX,command_line ;AN000;CX=>first char of the bad parm | ||
| 4527 | ; MOV offending_parameter_ptr,CX ;AN000;set pointer in message | ||
| 4528 | ; MOV BYTE PTR [SI],0 ;AN000;make the offending parm an ASCIIZ string | ||
| 4529 | ; .ENDIF ;AN000;leave the call to msg services to the calling routine | ||
| 4530 | |||
| 4531 | RET | ||
| 4532 | |||
| 4533 | parse_parm ENDP | ||
| 4534 | |||
| 4535 | |||
| 4536 | |||
| 4537 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4538 | ;³ | ||
| 4539 | ;³ RESET_PARM_POINTER | ||
| 4540 | ;³ ------------------ | ||
| 4541 | ;³ | ||
| 4542 | ;³ | ||
| 4543 | ;³ | ||
| 4544 | ;³ The last entry in the parm list is decremented, which | ||
| 4545 | ;³ will put the results of the next parse over that entry. | ||
| 4546 | ;³ | ||
| 4547 | ;³ | ||
| 4548 | ;³ | ||
| 4549 | ;³ | ||
| 4550 | ;³ | ||
| 4551 | ;³ | ||
| 4552 | ;³ | ||
| 4553 | ;³ | ||
| 4554 | ;³ | ||
| 4555 | ;³ | ||
| 4556 | ;³ | ||
| 4557 | ;³ INPUT: | ||
| 4558 | ;³ | ||
| 4559 | ;³ | ||
| 4560 | ;³ RETURN: The current parm list entry is filled with recognizable trash | ||
| 4561 | ;³ | ||
| 4562 | ;³ | ||
| 4563 | ;³ | ||
| 4564 | ;³ | ||
| 4565 | ;³ MESSAGES: none | ||
| 4566 | ;³ | ||
| 4567 | ;³ | ||
| 4568 | ;³ | ||
| 4569 | ;³ | ||
| 4570 | ;³ | ||
| 4571 | ;³ | ||
| 4572 | ;³ | ||
| 4573 | ;³ | ||
| 4574 | ;³ | ||
| 4575 | ;³ | ||
| 4576 | ;³ | ||
| 4577 | ;³ REGISTER | ||
| 4578 | ;³ USAGE: | ||
| 4579 | ;³ | ||
| 4580 | ;³ | ||
| 4581 | ;³ | ||
| 4582 | ;³ CONVENTIONS: | ||
| 4583 | ;³ | ||
| 4584 | ;³ | ||
| 4585 | ;³ | ||
| 4586 | ;³ | ||
| 4587 | ;³ | ||
| 4588 | ;³ | ||
| 4589 | ;³ | ||
| 4590 | ;³ ASSUMPTIONS: | ||
| 4591 | ;³ | ||
| 4592 | ;³ | ||
| 4593 | ;³ | ||
| 4594 | ;³ | ||
| 4595 | ;³ | ||
| 4596 | ;³ | ||
| 4597 | ;³ | ||
| 4598 | ;³ | ||
| 4599 | ;³ SIDE EFFECT: | ||
| 4600 | ;³ | ||
| 4601 | ;³ | ||
| 4602 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 4603 | ;AN000; | ||
| 4604 | reset_parm_pointer PROC | ||
| 4605 | |||
| 4606 | |||
| 4607 | |||
| 4608 | MOV parm_list[current_parm_DI].parm_type,bogus ;AN000; | ||
| 4609 | MOV parm_list[current_parm_DI].item_tag,0FFH ;AN000; | ||
| 4610 | MOV parm_list[current_parm_DI].synonym,bogus ;AN000; | ||
| 4611 | MOV parm_list[current_parm_DI].value1,bogus ;AN000; | ||
| 4612 | MOV parm_list[current_parm_DI].value2,bogus ;AN000; | ||
| 4613 | MOV parm_list[current_parm_DI].keyword_switch_ptr,0 ;AN000; | ||
| 4614 | SUB current_parm_DI,TYPE parm_list_entry ;AN000; | ||
| 4615 | DEC ordinal ;AN000; | ||
| 4616 | |||
| 4617 | |||
| 4618 | RET | ||
| 4619 | |||
| 4620 | reset_parm_pointer ENDP ;AN000; | ||
| 4621 | |||
| 4622 | |||
| 4623 | PRINTF_CODE ENDS ;AN000; | ||
| 4624 | END ;AN000; | ||
| 4625 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/MODEPRIN.ASM b/v4.0/src/CMD/MODE/MODEPRIN.ASM new file mode 100644 index 0000000..60ffebd --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEPRIN.ASM | |||
| @@ -0,0 +1,1096 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODEPRIN.SAL - PRINTER SUPPORT FOR THE MODE COMMAND | ||
| 3 | .XLIST | ||
| 4 | INCLUDE STRUC.INC | ||
| 5 | .LIST | ||
| 6 | .SALL | ||
| 7 | |||
| 8 | |||
| 9 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 10 | ;º º ;AN000; | ||
| 11 | ;AN000; | ||
| 12 | ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 13 | ; implement the SYSGETMSG method of getting addressability to | ||
| 14 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 15 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 16 | ; address is then put in the sublist block for the message | ||
| 17 | ; being issued. | ||
| 18 | ;º º ;AN000; | ||
| 19 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 20 | |||
| 21 | |||
| 22 | |||
| 23 | DISPLAY MACRO MSG | ||
| 24 | MOV DX,OFFSET MSG | ||
| 25 | CALL PRINTF | ||
| 26 | ENDM | ||
| 27 | |||
| 28 | PRINT MACRO | ||
| 29 | MOV DX,WORD PTR PT17 ;PASS PRINTER NUMBER | ||
| 30 | INT 17H ;OUTPUT TO PRINTER | ||
| 31 | ENDM | ||
| 32 | |||
| 33 | COMPARE MACRO STRING, CHAR1, CHAR2, CHAR3 | ||
| 34 | LOCAL END_COMPARE | ||
| 35 | |||
| 36 | ;------------------------------------------------------------------------------------------------ | ||
| 37 | ; | ||
| 38 | ; Compare first 3 characters of STRING with CHAR1, CHAR2, and CHAR3 | ||
| 39 | ; | ||
| 40 | ;------------------------------------------------------------------------------------------------ | ||
| 41 | |||
| 42 | PUSH SI | ||
| 43 | MOV SI,0 ;INITIALIZE INDEX | ||
| 44 | CMP STRING[SI],CHAR1 ;IF first char is a match THEN | ||
| 45 | JNE END_COMPARE | ||
| 46 | INC SI ; GET TO NEXT CHAR OF STRING | ||
| 47 | CMP STRING[SI],CHAR2 ; IF 2nd char is a match THEN | ||
| 48 | JNE END_COMPARE | ||
| 49 | INC SI | ||
| 50 | CMP STRING[SI],CHAR3 ; IF all three match then ZR is not set | ||
| 51 | END_COMPARE: | ||
| 52 | POP SI | ||
| 53 | ENDM | ||
| 54 | ; | ||
| 55 | IF_NO_PRINTER_ERROR_THEN MACRO | ||
| 56 | CMP PRINTER_ERROR,TRUE | ||
| 57 | JE CHK_FOR_P | ||
| 58 | ENDM | ||
| 59 | ; | ||
| 60 | JUMP_EQUAL_TO_CHK_FOR_P MACRO | ||
| 61 | LOCAL SKIP_JUMP | ||
| 62 | ; | ||
| 63 | JNE SKIP_JUMP | ||
| 64 | JMP CHK_FOR_P | ||
| 65 | SKIP_JUMP: | ||
| 66 | ENDM | ||
| 67 | |||
| 68 | |||
| 69 | SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG | ||
| 70 | |||
| 71 | PUSH AX | ||
| 72 | MOV AX,VALUE | ||
| 73 | MOV REG,AX | ||
| 74 | POP AX | ||
| 75 | |||
| 76 | ENDM | ||
| 77 | |||
| 78 | |||
| 79 | set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message". | ||
| 80 | |||
| 81 | MOV AX,submessage ;AX=message number ;AN001; | ||
| 82 | MOV DH,utility_msg_class ;DH=message class=utility class ;AN001; | ||
| 83 | CALL SYSGETMSG ;DS:SI=>message piece ;AN001; | ||
| 84 | MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001; | ||
| 85 | MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001; | ||
| 86 | ENDM ;AN001; | ||
| 87 | |||
| 88 | |||
| 89 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 90 | ;º º | ||
| 91 | |||
| 92 | INCLUDE common.stc ;contains the following structure | ||
| 93 | |||
| 94 | |||
| 95 | ;parm_list_entry STRUC ;used by parse_parameters and invoke | ||
| 96 | ; | ||
| 97 | ;parm_type DB bogus | ||
| 98 | ;item_tag DB 0FFH | ||
| 99 | ;value1 DW bogus ;used only for filespecs and code page numbers | ||
| 100 | ;value2 DW bogus ;used only for filespecs and code page numbers | ||
| 101 | ;keyword_switch_ptr DW 0 | ||
| 102 | ; | ||
| 103 | ;parm_list_entry ENDS | ||
| 104 | |||
| 105 | |||
| 106 | ;printer_settings STRUC ;map of the setting holders in resident code | ||
| 107 | |||
| 108 | ; chars_per_line DB ? | ||
| 109 | ; lines_per_inch DB ? | ||
| 110 | |||
| 111 | ;printer_settings ENDS | ||
| 112 | |||
| 113 | ;º º | ||
| 114 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 115 | |||
| 116 | |||
| 117 | ; | ||
| 118 | ROM SEGMENT AT 0 | ||
| 119 | ORG 530H | ||
| 120 | RESSEG LABEL DWORD ;VECTOR POINTING TO MODETO IF RESIDENT | ||
| 121 | ROM ENDS | ||
| 122 | |||
| 123 | ;********************************************************************** | ||
| 124 | PRINTF_CODE SEGMENT PUBLIC | ||
| 125 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE | ||
| 126 | ; | ||
| 127 | |||
| 128 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 129 | ;º º | ||
| 130 | |||
| 131 | EXTRN B_item_tag:ABS ;see modepars | ||
| 132 | EXTRN COM1_or_COM2:WORD ;=>"Must specify COM1 or COM2" message | ||
| 133 | EXTRN CTRL_ST:BYTE ;CONTROL STRING SET UP FROM CONFIGURATION PARAMETERS INPUT | ||
| 134 | EXTRN E_item_tag:ABS ;see modepars | ||
| 135 | EXTRN invalid_number_of_parameters:WORD ;=>"Invalid number of parameters" | ||
| 136 | EXTRN noerror:BYTE ;AN000; | ||
| 137 | EXTRN OFFRETRY:ABS ;OFFSET TO TEST INSTR IN RETRY CODE | ||
| 138 | EXTRN not_supported:WORD ;message telling user he specified "P" on a net printer | ||
| 139 | EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS | ||
| 140 | EXTRN ERR1:BYTE ;POINTER TO "Invalid parameters" | ||
| 141 | EXTRN Illegal_device_ptr:WORD ;pointer to device name that does not exist | ||
| 142 | ;AC001; EXTRN INF_OR_NO_PTR:WORD ;PART OF "... retry on parallel printer time-out" message | ||
| 143 | EXTRN INDEX:WORD ;INDEX OF REDIRECTED PRINTER IN NETWORK REDIRECTION LIST | ||
| 144 | EXTRN IS_LOCAL:BYTE ;BOOLEAN. INDICATES IF A PRINTER IS LOCAL. INITIALLY TRUE | ||
| 145 | EXTRN keyword:ABS | ||
| 146 | EXTRN LOCAL_NAME:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL | ||
| 147 | EXTRN lpt1_retry_type:BYTE ;byte in resident code for retry mask, see rescode | ||
| 148 | EXTRN LPTNO:BYTE ;see modeecho | ||
| 149 | EXTRN machine_type:BYTE ;see "rescode" | ||
| 150 | EXTRN MODEECHO:NEAR ;SET UP REDIRECTION OF PARALLEL TO SERIAL | ||
| 151 | EXTRN MODELENG:NEAR | ||
| 152 | EXTRN MODELOAD:NEAR ;MOVES THE CODE AT MODETO TO 60 AND MAKES IT RESIDENT ;AN000; | ||
| 153 | EXTRN NET_ERROR:WORD ;"NET 042: Unable to do requested comand" ;AN000; | ||
| 154 | EXTRN NONE_item_tag:ABS ;AN000;see modepars ;AN000; | ||
| 155 | ;EXTRN no_retry_active:ABS ;see invoke.asm ;AN000; | ||
| 156 | EXTRN parm_lst:BYTE ;see modepars.asm ;AN000; | ||
| 157 | EXTRN P_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 158 | ;EXTRN parallel_printer_settings:WORD ;see "rescode" ;AN000; | ||
| 159 | EXTRN P14_model_byte:ABS ;see "rescode" ;AN000; | ||
| 160 | EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE ;AN000; | ||
| 161 | EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE | ||
| 162 | EXTRN parm_list_holder:WORD ;address of parsed parameter list ;AN663; | ||
| 163 | EXTRN parms_form:BYTE ;AN000; | ||
| 164 | EXTRN DEVICE:BYTE,PPARM:BYTE ;AN000; | ||
| 165 | EXTRN R_item_tag:ABS ;AN000; | ||
| 166 | ;EXTRN res_lpt_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is res, see rescode | ||
| 167 | EXTRN retry_index:WORD ;see modecom.asm ;AN000; | ||
| 168 | |||
| 169 | EXTRN ERR2:WORD ;CR,LF,"Printer error",BEEP,CR,LF,"$" | ||
| 170 | EXTRN PT80:WORD ;CR,LF,"LPT" | ||
| 171 | EXTRN PT80N:BYTE ;DB " " | ||
| 172 | ; ": set for 80",CR,LF,"$" | ||
| 173 | EXTRN PT132:WORD ;CR,LF,"LPT" | ||
| 174 | EXTRN PT132N:BYTE ;" " | ||
| 175 | ; ": set for 132",CR,LF,"$" | ||
| 176 | EXTRN PTLINES:WORD ;CR,LF,"Printer lines per inch set",CR,LF,"$" | ||
| 177 | EXTRN NORETRY:WORD ;message number for CR,LF,'No','$' ;AC001; | ||
| 178 | EXTRN INFINITE:WORD ;message number for CR,LF,'Infinite' ;AC001; | ||
| 179 | EXTRN REMOTE_DEV:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL | ||
| 180 | EXTRN RETPARTO:WORD ;message number for '%1 retry on parallel printer timeout',CR,LF,'$' | ||
| 181 | ;EXTRN ROOM_FOR_COLON:WORD ;INITIALLY 0, CHANGED TO 1 IF COLON IS INCLUDED | ||
| 182 | EXTRN sublist_retparto:BYTE ; control block for "%1 retry on parallel printer timeout" ;AC001; | ||
| 183 | EXTRN SYSGETMSG:NEAR ;AC001; | ||
| 184 | EXTRN utility_msg_class:ABS ;used for input to sysgetmsg | ||
| 185 | EXTRN VERIFY:NEAR ;FINDS IF n OF LPTn IS LEGAL | ||
| 186 | |||
| 187 | ;º º | ||
| 188 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 189 | |||
| 190 | |||
| 191 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 192 | ;º º | ||
| 193 | |||
| 194 | ;CR EQU 13 ;CARRIAGE RETURN | ||
| 195 | ;LF EQU 10 ;LINE FEED | ||
| 196 | ;BEEP EQU 7 ;SOUND THE AUDIBLE ALARM | ||
| 197 | ;EQUALSIGN EQU "=" ;CHAR IN LPTn:=COMm | ||
| 198 | busy_status EQU 080H ;flag telling resident code to not change anything | ||
| 199 | COLON EQU ":" ;CHAR IN "LPT1:" | ||
| 200 | error_status EQU 029H ;status byte indicating the printer is on fire(busy, no paper, I/O error, timeout) | ||
| 201 | FALSE EQU 00H | ||
| 202 | SPACE EQU " " ;THE BLANK CHARACTER | ||
| 203 | TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN | ||
| 204 | INTCONV EQU 48 ;CONVERTS ASCII TO NUMERIC | ||
| 205 | EIGHTY EQU 80 ;80 COL PRINTER WIDTH | ||
| 206 | no_retry_flag EQU 0 ;no retry active, stored in lptx_retry_type, see rescode.sal | ||
| 207 | ONE_THIRTY_TWO EQU 132 ;132 COL PRINTER WIDTH | ||
| 208 | PRTDC2 EQU 18 ;PRINTER CONTROL CHAR FOR 80 COL | ||
| 209 | PRTSI EQU 15 ;PRINTER CONTROL CHAR FOR 132 CHAR | ||
| 210 | PRTCANCEL EQU 24 ;PRINTER CONTROL CHAR FOR CANCEL | ||
| 211 | CHAR6 EQU "6" ;REQUEST FOR 6 LINES PER INCH | ||
| 212 | CHAR8 EQU "8" ;REQUEST FOR 8 LINES PER INCH | ||
| 213 | L EQU "L" | ||
| 214 | P EQU "P" | ||
| 215 | T EQU "T" | ||
| 216 | R EQU "R" | ||
| 217 | N EQU "N" | ||
| 218 | NULL EQU 0 ;NULL CHAR | ||
| 219 | ASC0 EQU "0" ;ASCII 0, REQUEST 8 LINES PER INCH | ||
| 220 | ASC2 EQU "2" ;ASCII 2, REQUEST 6 LINES PER INCH | ||
| 221 | escape EQU 27 ;ESCAPE PRINTER CONTROL CHAR | ||
| 222 | PRINTERSETUP EQU 5E02H ;FUNCTION CODE FOR PRINTER SET UP DOS CALL | ||
| 223 | GET_LIST_ENTRY EQU 5F02H ;FUNCTION CODE FOR GET ASSIGN LIST ENTRY FROM NETWORK REDIR. LIST | ||
| 224 | CHAR_DEVICE EQU 3 ;CHARACTER DEVICE "MACRO" TYPE (IN NETWORK LINGO). | ||
| 225 | PRN_NO EQU 3 ;CHARACTER POSITION OF THE PRINTER NUMBER IN LPTn, (ZERO BASED) | ||
| 226 | ready_status EQU 90H ;flag telling resident code to set status indicating printer is ready for another character | ||
| 227 | UNCHANGED EQU -1 ;-1 INDICATES TO SERVER THAT PARAMTER IS UNCHANGED (NOT SPECIFIED) | ||
| 228 | unspecified EQU 0FFH ;AN000;value of parm2 if no lines per inch was specified | ||
| 229 | TRUE EQU 0FFH | ||
| 230 | ENDPARM EQU MODE | ||
| 231 | ;PARMNO EQU PARM1+3 ;LOCATION OF DEVICE NUMBER | ||
| 232 | ;PARMCOL EQU PARM1+4 ;LOCATION OF COLON IN LPTn: | ||
| 233 | ;PARMEQ EQU PARM1+4 ;LOCATION OF = IN LPTn= ,(NO COLON SPECIFIED) | ||
| 234 | parm_list EQU [BP] | ||
| 235 | |||
| 236 | ;º º | ||
| 237 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 238 | |||
| 239 | |||
| 240 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 241 | ;º º | ||
| 242 | |||
| 243 | ;PARM1 DB 10 DUP(0) | ||
| 244 | ;PARM2 DB -1 ;HOLDS LINES PER INCH IN CHARACTER FORM | ||
| 245 | ;PARM3 DB 0 | ||
| 246 | ;MODE DB 0 | ||
| 247 | ;FLAG DB 0 | ||
| 248 | ;CTRL_ST DB 5 DUP(PRTCANCEL) | ||
| 249 | ;INDEX DW 0 | ||
| 250 | columns_holder DB bogus | ||
| 251 | i DB 0 ;loop index for retry index calculation | ||
| 252 | PT17 DW 0 ;SAVES PRINTER NUMBER FOR DX AND INT 17H | ||
| 253 | LPTN DB 0 ;SAVES ID OF WHICH LPTn IS REFERENCED | ||
| 254 | PRINTER_NO DB 0 ;SAVES LPT NUMBER IN ZERO BASED NUMERICAL FORM | ||
| 255 | CTRL_ST_LEN DW 0000 ;HOLDER FOR LENGTH OF THE CONTROL STRING | ||
| 256 | REDIRECTED DB 00 ;FLAG TO INDICATE A PRINTER IS ON THE NETWORK | ||
| 257 | CHARS_LINE DB -1 ;HOLDS CHARACTERS PER LINE IN NUMERIC FORM | ||
| 258 | NO_COLON DW 00 ;CHAR POSITIONS TO MOVE IF NO COLON INCLUDED IN DEVICE NAME | ||
| 259 | ;nothing_past_LPTn_colon_equal DB ":","=",0,0,0,0 ;just "LPTn:=" as parameters | ||
| 260 | ;len_nothing_past_LPTn_colon_equal EQU $-nothing_past_LPTn_colon_equal | ||
| 261 | ;nothing_past_LPTn_equal DB "=",0,0,0,0,0 ;just "LPTn=" as parameters | ||
| 262 | ;len_nothing_past_LPTn_equal EQU $-nothing_past_LPTn_equal | ||
| 263 | ;nothing_past_LPTn_colon DB ":",0,0,0,0,0 ;just "LPTn:" as parameters | ||
| 264 | ;len_nothing_past_LPTn_colon EQU $-nothing_past_LPTn_colon | ||
| 265 | ;nothing_past_LPTn DB 0,0,0,0,0,0 ;just "LPTn" as parameters | ||
| 266 | ;len_nothing_past_LPTn EQU $-nothing_past_LPTn | ||
| 267 | PTLINES_REQ DB 00 ;BOOLEAN INDICATOR OF LINES PER INCH REQUESTED | ||
| 268 | PRINTER_ERROR DB 00 ;BOOLEAN INDICATOR OF PRINTER NOT THERE OR OFF OR OFFLINE | ||
| 269 | EIGHTY_CHARS_LINE_REQ DB 00 ;BOOLEAN, INDICATES IF 80 CHARS/LINE REQUESTED | ||
| 270 | REQ_132_CHARS_LINE DB 00 ;BOOLEAN, INDICATES IF 132 CHARS/LINE REQUESTED | ||
| 271 | |||
| 272 | ;º º | ||
| 273 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 274 | |||
| 275 | |||
| 276 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 277 | ;º º | ||
| 278 | |||
| 279 | PUBLIC busy_status ;used by rescode in parallel retry code | ||
| 280 | PUBLIC columns_holder ;AN000; | ||
| 281 | PUBLIC error_status ;used by analyze_and_invoke and rescode | ||
| 282 | PUBLIC modify_resident_code ;used by invoke ;AN000; | ||
| 283 | PUBLIC MODEPRIN | ||
| 284 | PUBLIC no_retry_flag ;used by analyze_and_invoke | ||
| 285 | PUBLIC printer_no ;needed by modepars | ||
| 286 | PUBLIC ready_status ;used by analyze_and_invoke | ||
| 287 | ;PUBLIC set_retry_flag ;used by invoke in turn_off_retry_case | ||
| 288 | PUBLIC set_retry_type ;used by invoke in turn_off_retry_case | ||
| 289 | |||
| 290 | ;º º | ||
| 291 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 292 | |||
| 293 | |||
| 294 | ;******************************************************************* | ||
| 295 | MODEPRIN PROC NEAR | ||
| 296 | |||
| 297 | |||
| 298 | ;On entry: "columns_holder" contains 132,80 or 88H. | ||
| 299 | ; "parm2" contains "[6³8]" (FFH if not specified). | ||
| 300 | ; "parm_list[retry_index]" contains "X_item_tag" where X is e, b, r, or p | ||
| 301 | |||
| 302 | MOV AL,LPTNO ;AN000;LPTNO set up by modepars in first_parm_case | ||
| 303 | MOV PT80N,AL ;PUT ASCII PRINTER NUMBER INTO BOTH | ||
| 304 | MOV PT132N,AL ; MESSAGES | ||
| 305 | SUB AL,INTCONV+1 ;CONVERT TO INTEGER, MINUS ONE | ||
| 306 | MOV PRINTER_NO,AL ;SAVE ZERO BASED PRINTER NUMBER | ||
| 307 | MOV AH,0 ;CLEAR AH | ||
| 308 | MOV WORD PTR PT17,AX ;SET UP PRINTER NUMBER FOR INTERRUPT 17H | ||
| 309 | |||
| 310 | |||
| 311 | MOV DI,0 ;INITIALIZE LENGTH OF CONTROL STRING | ||
| 312 | MOV BL,columns_holder ;BL=binary form of requested chars per line | ||
| 313 | ; : : : IF REQUEST IS FOR 80 COL | ||
| 314 | CMP BL,EIGHTY | ||
| 315 | JNE ELSEIF03 | ||
| 316 | ; | ||
| 317 | MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE | ||
| 318 | MOV EIGHTY_CHARS_LINE_REQ,TRUE | ||
| 319 | MOV BL,PRTDC2 ;SEND A DC2 CHAR TO SELECT 80 COL | ||
| 320 | ; : : : ELSEIF SINCE NOT 80, IS REQUEST FOR 132? | ||
| 321 | JMP SHORT ENDIF03 | ||
| 322 | ELSEIF03: | ||
| 323 | CMP BL,ONE_THIRTY_TWO ;132? | ||
| 324 | JNE ENDIF03 ;AC000; | ||
| 325 | ; | ||
| 326 | MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE | ||
| 327 | MOV REQ_132_CHARS_LINE,TRUE | ||
| 328 | MOV BL,PRTSI ;SEND 'SI', CONDENSED PRINT | ||
| 329 | ; : : : ENDIF ,END IS REQUEST FOR 80 COL | ||
| 330 | ENDIF03: | ||
| 331 | |||
| 332 | ; : : : IF ANYTHING TO PRINT, | ||
| 333 | CMP BL,bogus ;AC000; | ||
| 334 | JE ENDIF04 | ||
| 335 | |||
| 336 | MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR COLS/LINE IN CONTROL STRING | ||
| 337 | INC DI ;GET TO NEXT CHAR POSITION IN CONTROL STRING | ||
| 338 | |||
| 339 | |||
| 340 | ; : : : ENDIF END IF ANYTHING TO PRINT? TEST | ||
| 341 | ENDIF04: | ||
| 342 | |||
| 343 | PUBLIC ENDIF04 | ||
| 344 | |||
| 345 | ;***************************************************************** | ||
| 346 | ; LOOK AT THE SECOND PARM, CHECKING FOR 6 OR 8 LINES PER INCH | ||
| 347 | ;***************************************************************** | ||
| 348 | MOV BL,NULL ;NULL CHAR, TO BE REPLACED MAYBE | ||
| 349 | ; : : : IF THERE IS A SECOND PARM, | ||
| 350 | CMP DS:PARM2,unspecified ;AC000; | ||
| 351 | JE ENDIF05 | ||
| 352 | ; | ||
| 353 | ; : : : : IF THE REQUEST FOR 6 LINES PER INCH? | ||
| 354 | CMP DS:PARM2,CHAR6 | ||
| 355 | JNE ELSEIF06 | ||
| 356 | ; | ||
| 357 | MOV BL,ASC2 ;REQUEST 6 LPI | ||
| 358 | ; : : : : ELSEIF REQUEST IS FOR 8 LINES PER INCH | ||
| 359 | JMP SHORT ENDIF06 | ||
| 360 | ELSEIF06: | ||
| 361 | CMP DS:PARM2,CHAR8 | ||
| 362 | JNE ENDIF06 | ||
| 363 | MOV BL,ASC0 ;REQUEST 8 LINES PER INCH | ||
| 364 | ; : : : : ENDIF ,END IS REQUEST FOR 6 LPI? TEST | ||
| 365 | ENDIF06: | ||
| 366 | ; : : : ENDIF END IS THERE A SECOND PARM? TEST | ||
| 367 | ENDIF05: | ||
| 368 | ; : : : IF 6 OR 8 LINES PER INCH REQUESTED | ||
| 369 | CMP BL,0 | ||
| 370 | JE ENDIF07 | ||
| 371 | MOV CTRL_ST[DI],escape ;PUT AN ESCAPE CHAR IN THE CONTROL STRING | ||
| 372 | INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING | ||
| 373 | ; | ||
| 374 | MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR LINES/INCH IN CONTROL STRING | ||
| 375 | INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING | ||
| 376 | ; | ||
| 377 | MOV PTLINES_REQ,TRUE ;INDICATE LINES PER INCH SET IF NO PRINTER ERROR | ||
| 378 | ; : : : ENDIF END IS 6 OR 8 LPI REQUESTED? TEST | ||
| 379 | ENDIF07: | ||
| 380 | CALL VERIFY ;SEE IF n OF LPTn WAS LEGAL | ||
| 381 | MOV BYTE PTR LPTN,AH ;SAVE THE n OF LPTn | ||
| 382 | ; | ||
| 383 | MOV BX,0 | ||
| 384 | PUSH BX | ||
| 385 | POP ES ;GET ADDRESSABILITY TO PRINTER BASE | ||
| 386 | MOV BL,PRINTER_NO ;PUT ZERO BASED PRINTER NUMBER INTO BL | ||
| 387 | SAL BL,1 ;CHANGE TO WORD OFFSET FROM PRINTER BASE (40:8) | ||
| 388 | CMP ES:PRINTR[BX],0 ;SEE IF THERE IS NO PORT ADDRESS FOR THE SPECIFIED PRINTER THEN | ||
| 389 | JNE PRINTER_EXISTS | ||
| 390 | MOV IS_LOCAL,FALSE ;NOT A LOCAL PRINTER | ||
| 391 | PRINTER_EXISTS: | ||
| 392 | ; | ||
| 393 | ;************************************************************************************************** | ||
| 394 | ; SEARCH THE NETWORK REDIRECTION LIST | ||
| 395 | ; | ||
| 396 | ; IF THE PRINTER IS FOUND IN THE LIST THEN THE CONTROL STRING HAS TO BE SENT TO THE REDIRECTOR, | ||
| 397 | ; OTHERWISE THE CONTROL STRING WILL BE SENT DIRECTLY TO THE LOCAL PRINTER. | ||
| 398 | ; AN INDEX WILL BE INITIALIZED TO ZERO. A GET ASSIGN LIST ENTRY CALL WILL BE MADE, THE DEVICE | ||
| 399 | ; TYPE IS CHECKED FOR CHARACTER DEVICE TYPE. IF THE ENTRY IS A CHARACTER DEVICE THEN THE NAME IS | ||
| 400 | ; COMPARED WITH THE NAME OF THE PRINTER TO BE CONFIGURED. IF THE NAMES MATCH THEN WE KNOW THAT | ||
| 401 | ; THE PRINTER HAS BEEN PUT ON THE NETWORK, ELSE WE CONTINUE DOWN THE LIST BY INCREMENTING THE | ||
| 402 | ; INDEX AND MAKING ANOTHER GET ASSIGN LIST ENTRY CALL. THIS CONTINUES UNTIL THE END OF THE NRL | ||
| 403 | ; IS REACHED OR THE PRINTER IS FOUND. | ||
| 404 | ; GET ASSIGN LIST ENTRY CALL WORKS AS FOLLOWS: 5F02H IS PUT IN AX, THE INDEX IS PUT IN BX. ON | ||
| 405 | ; RETURN DS:SI POINTS TO THE LOCAL NAME, ES:DI POINTS TO REMOTE NAME, CX HAS THE DEVICE TYPE. IF | ||
| 406 | ; CARRY IS SET AX HAS ERROR CODE: INVALID FUNCTION (NETWORK SUPPORT IS NOT PRESENT) OR, NO MORE | ||
| 407 | ; FILES (THE INDEX IS GREATER THAN THE NUMBER OF NETWORK ASSIGNMENTS). | ||
| 408 | ; | ||
| 409 | ;************************************************************************************************** | ||
| 410 | ; | ||
| 411 | SEE_IF_REDIRECTED: | ||
| 412 | |||
| 413 | PUBLIC SEE_IF_REDIRECTED | ||
| 414 | |||
| 415 | MOV CTRL_ST_LEN,DI ;SAVE LENGTH OF CONTROL STRING | ||
| 416 | DEC INDEX ;SET INDEX TO -1 SO IT WILL BEGIN AT ZERO | ||
| 417 | SRCH_NRL: | ||
| 418 | MOV AX,GET_LIST_ENTRY ;SET UP FOR GET ASSIGN LIST ENTRY FUNCTION CALL | ||
| 419 | INC INDEX | ||
| 420 | MOV BX,INDEX ;BX GETS THE INDEX OF THE ENTRY TO BE FECTHED | ||
| 421 | MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO HOLDING AREA FOR LOCAL DEVICE NAME | ||
| 422 | PUSH DS | ||
| 423 | POP ES ;ES GETS THE SEGMENT OF REMOTE DEVICE NAME HOLDING AREA | ||
| 424 | MOV DI,OFFSET REMOTE_DEV ;ES:DI POINTS TO (USELESS) REMOTE DEVICE NAME HOLDING AREA | ||
| 425 | INT 21H | ||
| 426 | JNC CHK_DEV_TYPE | ||
| 427 | JMP NOT_RED ;IF CARRY IS SET THEN THE PRINTER IS NOT REDIRECTED | ||
| 428 | CHK_DEV_TYPE: | ||
| 429 | CMP BL,CHAR_DEVICE ;ELSE CHECK THE DEVICE TYPE | ||
| 430 | JE CHECK_NAME ;IF THE DEVICE TYPE IS CHAR DEVICE THEN COMPARE NAMES | ||
| 431 | JMP SRCH_NRL ;ELSE CONTINUE SEARCH | ||
| 432 | CHECK_NAME: ;SEE IF THE LOCAL NAME IS THE PRINTER TO BE CONFIGURED | ||
| 433 | ; Count the number of characters in the local name | ||
| 434 | MOV SI,00 ;INITIALIZE THE CHARACTER COUNTER | ||
| 435 | COUNT: | ||
| 436 | CMP LOCAL_NAME[SI],NULL ;WHILE (char<>null) AND (char<>space) DO | ||
| 437 | JE CHECK_1st_3 ;END OF NAME | ||
| 438 | CMP LOCAL_NAME[SI],SPACE | ||
| 439 | JE CHECK_1st_3 ; END OF NAME | ||
| 440 | INC SI ; INCREMENT NUMBER OF CHARS IN THE NAME | ||
| 441 | JMP COUNT ;END WHILE non-termination char | ||
| 442 | CHECK_1st_3: ;SEE IF 1st 3 CHARS ARE LPT OR PRN | ||
| 443 | CMP SI,4 ;IF the name is 4 or less chars THEN | ||
| 444 | JG CONTINUE_SEARCH ;NAME IS TOO LONG | ||
| 445 | COMPARE LOCAL_NAME, L, P, T | ||
| 446 | JNE CHECK_FOR_PRN | ||
| 447 | MOV AL,PT80N ;PUT PRINTER NUMBER IN AL | ||
| 448 | CMP LOCAL_NAME[PRN_NO],AL ;CHECK PRINTER NUMBER | ||
| 449 | JE END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST | ||
| 450 | CHECK_FOR_PRN: | ||
| 451 | COMPARE LOCAL_NAME, P, R, N | ||
| 452 | JNE CONTINUE_SEARCH ;NOT REDIRECTED AS PRN EITHER | ||
| 453 | CMP PT80N,1 ;IF printer to be configured is lpt1 THEN | ||
| 454 | JNE CONTINUE_SEARCH | ||
| 455 | JMP SHORT END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST | ||
| 456 | CONTINUE_SEARCH: | ||
| 457 | JMP SRCH_NRL | ||
| 458 | END_CHECK_NAME: | ||
| 459 | |||
| 460 | PUBLIC END_CHECK_NAME | ||
| 461 | |||
| 462 | MOV REDIRECTED,TRUE ;REDIRECTED:=TRUE. THE PRINTER WAS FOUND IN NRL | ||
| 463 | ; | ||
| 464 | ;************************************************************************************************** | ||
| 465 | ; INDICATE TO SERVER THAT THE CONFIGURATION OF A NETWORK PRINTER HAS CHANGED. | ||
| 466 | ; | ||
| 467 | ; SET DS:SI TO POINT TO THE PRINTER NAME, CHARS_LINE HAS THE CHARACTERS PER LINE, PARM2 HAS THE | ||
| 468 | ; LINES PER INCH IN CHARACTER FORM. | ||
| 469 | ;************************************************************************************************** | ||
| 470 | ; | ||
| 471 | CMP CTRL_ST_LEN,0 ;IF printer configuration has changed THEN | ||
| 472 | JUMP_EQUAL_TO_CHK_FOR_P | ||
| 473 | MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO PRINTER NAME | ||
| 474 | MOV AH,02 | ||
| 475 | XOR AL,AL ;AL=0 | ||
| 476 | MOV CL,8 ;CL HOLDS SHIFT COUNT. 8 IS NUMBER OF BITS NEEDED FOR 132. | ||
| 477 | MOV DL,CHARS_LINE ;MOV 80 or 132 or FF INTO ACCUMULATOR REGISTER | ||
| 478 | ROR DL,1 ;IF (DL=50H) OR (DL=84H) THEN DL[7]=0 ELSE DL=FFH | ||
| 479 | SAR DL,CL ;IF (CHARS_LINE = 80) OR (CHARS_LINE = 132) THEN | ||
| 480 | MOV BH,DL ;BH=0 ELSE BH=BL=FFH | ||
| 481 | MOV BL,CHARS_LINE ;BX= -1 or 80 or 132 | ||
| 482 | MOV CL,PARM2 | ||
| 483 | CMP PARM2,bogus ;IF THE LINES PER INCH WASN'T SPECIFIED THEN DON'T CONVERT | ||
| 484 | JNE CONVERT | ||
| 485 | MOV CH,UNCHANGED ;CX=-1 (FFFF) | ||
| 486 | JMP CALL_SERVER | ||
| 487 | CONVERT: ;ELSE | ||
| 488 | XOR CH,CH ;CLEAR CH | ||
| 489 | SUB CX,INTCONV ;CHANGE LINES PER INCH TO NUMERIC FORM | ||
| 490 | CALL_SERVER: ;ENDIF | ||
| 491 | INT 2AH ;CALL SERVER | ||
| 492 | ; | ||
| 493 | ;************************************************************************************************** | ||
| 494 | ; SET UP REDIRECTOR WITH CONTROL STRING BUFFER VIA A PRINTER SET UP CALL. | ||
| 495 | ; | ||
| 496 | ; DI HAS LENGTH OF THE CONTROL STRING. NEED TO SET DS:SI TO THE POINT TO THE CONTROL STRING | ||
| 497 | ; BUFFER, PUT THE LENGTH IN CX, AND THE NETWORK REDIRECTION LIST INDEX FOR THE PRINTER IN BX. | ||
| 498 | ;************************************************************************************************** | ||
| 499 | ; | ||
| 500 | CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN | ||
| 501 | JUMP_EQUAL_TO_CHK_FOR_P | ||
| 502 | MOV AX,PRINTERSETUP ;SET UP FOR PRINTER SET UP FUNCTION CALL. | ||
| 503 | MOV SI,OFFSET CTRL_ST ;DS HAS SEG OF CONTROL ST. BUFFER, DS:SI POINTS TO BUFFER | ||
| 504 | MOV CX,CTRL_ST_LEN ;CX GETS LENGTH OF CONTROL STRING BUFFER. | ||
| 505 | MOV BX,INDEX ;BX GETS NRL INDEX OF REDIRECTED PRINTER. | ||
| 506 | INT 21H ;PERFORM PRINTER SET UP. | ||
| 507 | ; $IF C ;IF CARRY THERE IS A DESCREPENCY BETWEEN | ||
| 508 | JNC $$IF1 | ||
| 509 | DISPLAY NET_ERROR ;GET ASS LIST ENTRY AND PRINTER SET UP | ||
| 510 | ; $ELSE ;REDIRECTOR IS RESIDENT AND PRINTER SETUP | ||
| 511 | JMP SHORT $$EN1 | ||
| 512 | $$IF1: | ||
| 513 | ;CALL WAS SUCCESSFUL SO TELL USER WHAT | ||
| 514 | CMP EIGHTY_CHARS_LINE_REQ,TRUE ;HAPPENED | ||
| 515 | ; $IF E ;IF 80 chars/line requested THEN | ||
| 516 | JNE $$IF3 | ||
| 517 | DISPLAY PT80 ; WRITELN("LPT? set for 80") | ||
| 518 | ; $ELSE ;ELSE | ||
| 519 | JMP SHORT $$EN3 | ||
| 520 | $$IF3: | ||
| 521 | CMP REQ_132_CHARS_LINE,TRUE | ||
| 522 | ; $IF E ; IF 132 chars/line requested THEN | ||
| 523 | JNE $$IF5 | ||
| 524 | DISPLAY PT132 ; WRITELN("LPT? set for 132") | ||
| 525 | ; $ENDIF ; ENDIF | ||
| 526 | $$IF5: | ||
| 527 | ; $ENDIF ;ENDIF | ||
| 528 | $$EN3: | ||
| 529 | CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN | ||
| 530 | ; $IF E | ||
| 531 | JNE $$IF8 | ||
| 532 | DISPLAY PTLINES ; WRITELN("Printer lines per inch set") | ||
| 533 | ; $ENDIF ;ENDIF | ||
| 534 | $$IF8: | ||
| 535 | ; $ENDIF ;ENDIF | ||
| 536 | $$EN1: | ||
| 537 | JMP CHK_FOR_P | ||
| 538 | ;****************************************************************************************** | ||
| 539 | ; SEND THE CONTROL STRING TO THE LOCAL PRINTER | ||
| 540 | |||
| 541 | ; EACH CHARACTER OF THE CONTROL STRING IS TAKEN OUT OF THE BUFFER "CTRL_ST" AND SENT TO THE | ||
| 542 | ; PRINTER STARTING WITH THE FIRST CHARACTER. ON ENTRY DI HAS THE NUMBER OF CHARACTERS IN | ||
| 543 | ; THE CONTROL STRING. SI IS USED TO INDEX INTO THE CONTROL STRING. | ||
| 544 | ;****************************************************************************************** | ||
| 545 | ; | ||
| 546 | NOT_RED: | ||
| 547 | CMP IS_LOCAL,TRUE ;IF the device is local THEN | ||
| 548 | JE ELSE02 | ||
| 549 | JMP SHORT ELSE01 ;or on the network | ||
| 550 | ELSE02: | ||
| 551 | CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN | ||
| 552 | JE CHK_FOR_P | ||
| 553 | MOV SI,0 ;INITIALIZE CHARACTER POSITION INDEX FOR CONTROL STRING | ||
| 554 | FOR: ;FOR each_char_in_control_string DO. FOR DI=no_chars DOWN TO 0 DO | ||
| 555 | DEC CTRL_ST_LEN ;DECREMENT LOOP COUNTER | ||
| 556 | MOV AH,NULL ;CLEAR ERROR CODE FROM AH | ||
| 557 | MOV AL,BYTE PTR CTRL_ST[SI] ;MOVE NEXT CONTROL CHAR TO AL | ||
| 558 | CALL OUTCHR ;SEND THE CHARACTER TO THE PRINTER, HANDLING ERRORS | ||
| 559 | INC SI ;GET TO NEXT CHAR POSITION IN CONTROL STRING | ||
| 560 | CMP CTRL_ST_LEN,0 ;CHECK IF ALL CHARACTERS HAVE BEEN SENT | ||
| 561 | JNE FOR ;LOOP UNTIL ALL CONTROL CHARACTERS HAVE BEEN SENT | ||
| 562 | ; | ||
| 563 | IF_NO_PRINTER_ERROR_THEN | ||
| 564 | CMP EIGHTY_CHARS_LINE_REQ,TRUE ;IF 80 chars/line requested THEN | ||
| 565 | JNE WAS_132_CHARS_LINE_REQ | ||
| 566 | DISPLAY PT80 ; WRITELN("LPT? set for 80") | ||
| 567 | JMP SHORT WAS_LINES_INCH_SPEC | ||
| 568 | WAS_132_CHARS_LINE_REQ: ;ELSE | ||
| 569 | CMP REQ_132_CHARS_LINE,TRUE ; IF 132 chars/line requested THEN | ||
| 570 | JNE WAS_LINES_INCH_SPEC | ||
| 571 | DISPLAY PT132 ; WRITELN("LPT? set for 132") ENDIF | ||
| 572 | WAS_LINES_INCH_SPEC: ;ENDIF | ||
| 573 | CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN | ||
| 574 | JNE LINES_NOT_REQ | ||
| 575 | DISPLAY PTLINES ; WRITELN("Printer lines per inch set") | ||
| 576 | LINES_NOT_REQ: ;ENDIF | ||
| 577 | ; | ||
| 578 | ;**************************************************************** | ||
| 579 | ; CALL PROCEDURE TO SET THE RETRY FLAG | ||
| 580 | ;**************************************************************** | ||
| 581 | ; | ||
| 582 | CHK_FOR_P: | ||
| 583 | |||
| 584 | public CHK_FOR_P | ||
| 585 | |||
| 586 | CALL set_retry_type | ||
| 587 | CALL modify_resident_code | ||
| 588 | |||
| 589 | |||
| 590 | JMP SHORT ENDIF01 | ||
| 591 | ELSE01: | ||
| 592 | |||
| 593 | PUBLIC ELSE01 | ||
| 594 | |||
| 595 | MOV DI,0 ;the device name is always the first parm ;AN000; | ||
| 596 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000; | ||
| 597 | MOV BX,parm_list[DI].value1 ;AN000; | ||
| 598 | MOV illegal_device_ptr,BX | ||
| 599 | MOV BYTE PTR [BX][4],0 ;AN000;chop off the string at 4, so "LPT1132" will be displayed as "LPT1" | ||
| 600 | DISPLAY err1 ;AN000;"Illegal device name - LPTX" | ||
| 601 | MOV noerror,false ;AN000; | ||
| 602 | ; ENDIF COLON IS MISSING | ||
| 603 | ENDIF01: | ||
| 604 | ; $ENDIF ;there was a chance that the parameters were valid | ||
| 605 | ; $ENDIF ;there were enough paramters specified | ||
| 606 | |||
| 607 | RET ;RETURN TO MODE MAIN ROUTINE | ||
| 608 | |||
| 609 | MODEPRIN ENDP | ||
| 610 | |||
| 611 | ;****************************************************************************** | ||
| 612 | |||
| 613 | modify_resident_code PROC NEAR ;AN000; | ||
| 614 | |||
| 615 | |||
| 616 | CALL LOADED_YET ;on return ES:DI points to res copy of "modeto" if loaded | ||
| 617 | ; : :IF RESIDENT CODE IS ALREADY LOADED | ||
| 618 | .IF Z THEN NEAR | ||
| 619 | ; MODIFY LOADED CODE TO REFLECT WHO GETS RETRIED NOW | ||
| 620 | MOV BX,OFFSET lpt1_retry_type ;BX=> first of 3 retry mask bytes ;AC000; | ||
| 621 | XOR SI,SI ;clear code modification index ;AN000; | ||
| 622 | .FOR DI = 0 TO 2 ;FOR LPT1 TO LPT3 check the retry mask byte ;AN000; | ||
| 623 | .IF <<BYTE PTR ES:[BX][DI]> NE no_retry_flag> THEN ;IF at least one type of retry on THEN ;AN000; | ||
| 624 | OR SI,8 ;OR in 00001000 which shifts into proper position ;AN000; | ||
| 625 | .ENDIF ;AN000; | ||
| 626 | SHR SI,1 ;AN000; | ||
| 627 | .NEXT DI ;DI=1 or 2, SI=0,1 ,2 ,3 ,4 ,5 ,6 or 7 ;AN000; | ||
| 628 | SHL SI,1 ;SI=0, 2, 4, ... , 14, INDEX TO SHOW WHICH LPTns to be retried ;AC000; | ||
| 629 | MOV BX,OFFRETRY ;OFFSET TO TEST INSTR IN RETRY CODE | ||
| 630 | CLI ;DISABLE INTERRUPTS | ||
| 631 | MOV BYTE PTR ES:[BX]+4,5 ;SET JMP TARGET TO +5 | ||
| 632 | JMP CASE[SI] ;CALL BRANCH TABLE | ||
| 633 | ; | ||
| 634 | CASE DW P0 | ||
| 635 | DW P1 | ||
| 636 | DW P2 | ||
| 637 | DW P3 | ||
| 638 | DW P4 | ||
| 639 | DW P5 | ||
| 640 | DW P6 | ||
| 641 | DW P7 | ||
| 642 | ; | ||
| 643 | P0: | ||
| 644 | ; SINCE NO PRINTER IS TO BE RETRIED | ||
| 645 | MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NOP | ||
| 646 | ; TO CAUSE FALL THRU TO JMP PRINTER_IO INSTR | ||
| 647 | JMP SHORT ENDC | ||
| 648 | ; | ||
| 649 | P1: | ||
| 650 | ; RETRY LPT1 ONLY | ||
| 651 | MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ RT | ||
| 652 | JMP SHORT ENDC | ||
| 653 | ; | ||
| 654 | P2: | ||
| 655 | ; RETRY LPT2 ONLY | ||
| 656 | MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ RT | ||
| 657 | JMP SHORT ENDC | ||
| 658 | ; | ||
| 659 | P3: | ||
| 660 | ; RETRY LPT1 AND LPT2 ONLY | ||
| 661 | MOV WORD PTR ES:[BX]+2,7402H ;TEST 2 : JZ RT | ||
| 662 | JMP SHORT ENDC | ||
| 663 | ; | ||
| 664 | P4: | ||
| 665 | ; REDIRECT LPT3 ONLY | ||
| 666 | MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 : JNZ RT | ||
| 667 | JMP SHORT ENDC | ||
| 668 | ; | ||
| 669 | P5: | ||
| 670 | ; REDIRECT LPT1 AND LPT3 ONLY | ||
| 671 | MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ RT | ||
| 672 | JMP SHORT ENDC | ||
| 673 | ; | ||
| 674 | P6: | ||
| 675 | ; REDIRECT LPT2 AND LPT3 ONLY | ||
| 676 | MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ RT | ||
| 677 | JMP SHORT ENDC | ||
| 678 | ; | ||
| 679 | P7: | ||
| 680 | ; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3 | ||
| 681 | MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP SHORT RT | ||
| 682 | ; | ||
| 683 | ENDC: | ||
| 684 | STI ;REENABLE INTERRUPTS | ||
| 685 | ; : : : ENDIF RESIDENT CODE IS ALREADY LOADED | ||
| 686 | .ENDIF | ||
| 687 | |||
| 688 | RET ;AN000; | ||
| 689 | |||
| 690 | modify_resident_code ENDP ;AN000; | ||
| 691 | |||
| 692 | |||
| 693 | ;********************************************************** | ||
| 694 | ;FIRST_INSTR EQU 0C2F6H ;THE FIRST INSTRUCTION OF THE LOADED CODE | ||
| 695 | ; SEE THE RESIDENT CODE MODULE FOR ENTRY SYMBOL MODETO | ||
| 696 | ; THE FIRST INSTRUCTION THERE IS: | ||
| 697 | ; TEST DL,1 | ||
| 698 | ; WHICH ASSEMBLES AS: | ||
| 699 | ; F6 C2 01 | ||
| 700 | |||
| 701 | |||
| 702 | LOADED_YET PROC NEAR | ||
| 703 | |||
| 704 | |||
| 705 | ; ON EXIT, THE ZERO FLAG REFLECTS THE LOADED STATE | ||
| 706 | ; ES:DI=ADDR OF MODETO, OR ZERO | ||
| 707 | ; Z=ON, LOADED | ||
| 708 | ; Z=OFF,NOT LOADED YET | ||
| 709 | ; | ||
| 710 | PUSH AX ;SAVE REG | ||
| 711 | ; | ||
| 712 | SUB AX,AX ;ZERO A REG | ||
| 713 | MOV ES,AX ;SET SEGREG TO VECTORS AT 0 | ||
| 714 | LES DI,ES:RESSEG ;GET ADDR OF RESIDENT CODE, IF THERE, ES:DI points to 'modeto' or is 0 | ||
| 715 | CMP DI,0 ;see if something at 50:30 | ||
| 716 | ; $IF NE ;IF code loaded THEN | ||
| 717 | JE $$IF11 | ||
| 718 | CMP AX,AX ;SET THE ZERO FLAG TO RELFECT IT IS LOADED | ||
| 719 | ; $ELSE | ||
| 720 | JMP SHORT $$EN11 | ||
| 721 | $$IF11: | ||
| 722 | CMP AX,0FFH ;RESET THE ZERO FLAG TO REFLECT IT IS NOT LOADED | ||
| 723 | ; $ENDIF | ||
| 724 | $$EN11: | ||
| 725 | ; | ||
| 726 | POP AX ;RESTORE CALLER'S REGS | ||
| 727 | RET | ||
| 728 | LOADED_YET ENDP | ||
| 729 | |||
| 730 | |||
| 731 | ;******************************************************************* | ||
| 732 | OUTCHR PROC NEAR | ||
| 733 | PRINT ;OUTPUT CHARACTER TO PRINTER | ||
| 734 | AND AH,0A9H ;MASK OFF ERROR BITS | ||
| 735 | ; IF WE GOT AN ERROR RETURN CODE | ||
| 736 | CMP AH,NULL | ||
| 737 | JE ENDIF02 | ||
| 738 | ; | ||
| 739 | CMP PRINTER_ERROR,TRUE | ||
| 740 | JE ALREADY_YELLED | ||
| 741 | DISPLAY ERR2 ;DISPLAY ERROR MESSAGE | ||
| 742 | MOV PRINTER_ERROR,TRUE | ||
| 743 | ALREADY_YELLED: | ||
| 744 | ; ENDIF ,END GOT AN ERROR RETURN CODE? TEST | ||
| 745 | ENDIF02: | ||
| 746 | RET ;RETURN TO MAIN PROC | ||
| 747 | OUTCHR ENDP | ||
| 748 | ; | ||
| 749 | ; | ||
| 750 | ; | ||
| 751 | ;------------------------------------------------------------------------------- | ||
| 752 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 753 | ;³ ³ | ||
| 754 | ;³ SET_RETRY_FLAG ³ | ||
| 755 | ;³ -------------- ³ | ||
| 756 | ;³ ³ | ||
| 757 | ;³ Set the resident retry flag to type of retry active for lptX. ³ | ||
| 758 | ;³ ³ | ||
| 759 | ;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³ | ||
| 760 | ;³ retry_index - holds index value for the parsed retry parameter. ³ | ||
| 761 | ;³ redirected - holds true/false value for redirected status of lptx. ³ | ||
| 762 | ;³ parm_list_holder - holds offset of parameter list. ³ | ||
| 763 | ;³ resseg - holds offset of resident code in memory ³ | ||
| 764 | ;³ res_lpt_retry_type - holds offset of lpt retry flag in resident ³ | ||
| 765 | ;³ code. ³ | ||
| 766 | ;³ ³ | ||
| 767 | ;³ ³ | ||
| 768 | ;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³ | ||
| 769 | ;³ flag in resident code set ³ | ||
| 770 | ;³ ³ | ||
| 771 | ;³ ³ | ||
| 772 | ;³ MESSAGES: Infinite retry not supported on network printer. ³ | ||
| 773 | ;³ ³ | ||
| 774 | ;³ ³ | ||
| 775 | ;³ REGISTER ³ | ||
| 776 | ;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³ | ||
| 777 | ;³ format) ³ | ||
| 778 | ;³ CL - shift bit count ³ | ||
| 779 | ;³ ES - holds segment of resident code ³ | ||
| 780 | ;³ BP - offset of parameter list ³ | ||
| 781 | ;³ DI - offset of retry index within parameter list ³ | ||
| 782 | ;³ DL - current resident flag setting ³ | ||
| 783 | ;³ ³ | ||
| 784 | ;³ ³ | ||
| 785 | ;³ PSUEDO CODE: ³ | ||
| 786 | ;³ ³ | ||
| 787 | ;³ SAVE REGISTERS ³ | ||
| 788 | ;³ SET UP SEGMENT REGISTER AND BIT MASKS ³ | ||
| 789 | ;³ IF <RETRY REQUESTED> ³ | ||
| 790 | ;³ IF <PRINTER IS REDIRECTED> ³ | ||
| 791 | ;³ PRINT ERROR MESSAGE - not supported on network printer. ³ | ||
| 792 | ;³ ELSE ³ | ||
| 793 | ;³ SET UP PARAMETER LIST STRUCTURE ³ | ||
| 794 | ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³ | ||
| 795 | ;³ IF <RESIDENT CODE IS NOT LOADED> ³ | ||
| 796 | ;³ LOAD RESIDENT CODE ³ | ||
| 797 | ;³ ENDIF ³ | ||
| 798 | ;³ GET CURRENT res_lpt_retry_type ³ | ||
| 799 | ;³ SET AND STORE NEW res_lpt_retry_type ³ | ||
| 800 | ;³ ENDIF ³ | ||
| 801 | ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³ | ||
| 802 | ;³ GET CURRENT res_lpt_retry_type ³ | ||
| 803 | ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³ | ||
| 804 | ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³ | ||
| 805 | ;³ ELSE ³ | ||
| 806 | ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³ | ||
| 807 | ;³ ENDIF ³ | ||
| 808 | ;³ ELSE ³ | ||
| 809 | ;³ SET pparm TO '-' ³ | ||
| 810 | ;³ ENDIF ³ | ||
| 811 | ;³ RESTORE REGISTERS ³ | ||
| 812 | ;³ RETURN ³ | ||
| 813 | ;³ ³ | ||
| 814 | ;³ ³ | ||
| 815 | ;³ ³ | ||
| 816 | ;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³ | ||
| 817 | ;³ ³ | ||
| 818 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 819 | ; | ||
| 820 | ;set_retry_flag PROC NEAR ;AN663; | ||
| 821 | ; ;AN663; | ||
| 822 | ; PUSH ES ;save registers ;AN663; | ||
| 823 | ; PUSH DI ;AN663; | ||
| 824 | ; PUSH AX ;AN663; | ||
| 825 | ; PUSH DX ;AN663; | ||
| 826 | ; ;AN663; | ||
| 827 | ; XOR AX,AX ;clear a reg ;AN663; | ||
| 828 | ; MOV ES,AX ;set to segment at 0 ;AN663; | ||
| 829 | ; MOV CL,device ;AN663; | ||
| 830 | ; AND CL,07H ;AN663; | ||
| 831 | ; DEC CL ;AN663; | ||
| 832 | ; SHL CL,1 ;AN663; | ||
| 833 | ; MOV DH,11111100B ;set bit mask to get rid of old setting ;AN663; | ||
| 834 | ; ROL DH,CL ;rotate bits into position ;AN663; | ||
| 835 | ; ;AN663; | ||
| 836 | ; .IF <retry_index NE 0> THEN ;AN663; | ||
| 837 | ; ;AN663; | ||
| 838 | ; .IF <redirected EQ true> THEN ;AN663; | ||
| 839 | ; ;AN663; | ||
| 840 | ; display not_supported ;infinite retry not supported on network printer ;AN663; | ||
| 841 | ; ;AN663; | ||
| 842 | ; .ELSE NEAR ;not a network printer ;AN663; | ||
| 843 | ; ;AN663; | ||
| 844 | ; MOV DI,retry_index ;AN663; | ||
| 845 | ; MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663; | ||
| 846 | ; | ||
| 847 | ; .SELECT ;AN663; | ||
| 848 | ; | ||
| 849 | ; .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663; | ||
| 850 | ; .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663; | ||
| 851 | ; MOV AL,error_retry_active ;AN663; | ||
| 852 | ; | ||
| 853 | ; .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663; | ||
| 854 | ; MOV AL,busy_retry_active ;AN663; | ||
| 855 | ; | ||
| 856 | ; .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663; | ||
| 857 | ; MOV AL,ready_retry_active ;AN663; | ||
| 858 | ; | ||
| 859 | ; .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663; | ||
| 860 | ; MOV AL,no_retry_active ;AN663; | ||
| 861 | ; | ||
| 862 | ; .ENDSELECT | ||
| 863 | ; | ||
| 864 | ; .IF <AL EQ no_retry_active> THEN | ||
| 865 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry | ||
| 866 | ; .ELSE ;AN663; | ||
| 867 | ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 868 | ; .ENDIF ;AN663; | ||
| 869 | ; ;AN663; | ||
| 870 | ; .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663; | ||
| 871 | ; CALL modeload ;load resident code ;AN663; | ||
| 872 | ; .ENDIF ;AN663; | ||
| 873 | ; ;AN663; | ||
| 874 | ; MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 875 | ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;get old setting ;AN663; | ||
| 876 | ; ;AN663; | ||
| 877 | ; ROL AL,CL ;AN663; | ||
| 878 | ; AND DL,DH ;AN663; | ||
| 879 | ; OR DL,AL ;AN663; | ||
| 880 | ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;store new setting ;AN663; | ||
| 881 | ; ;AN663; | ||
| 882 | ; .ENDIF ;AN663; | ||
| 883 | ; ;AN663; | ||
| 884 | ; .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663; | ||
| 885 | ; ; retry is specified then ;AN663; | ||
| 886 | ; MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 887 | ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;AN663; | ||
| 888 | ; ;AN663; | ||
| 889 | ; .IF <parms_form NE keyword> ;no retry specified with ;AN663; | ||
| 890 | ; ;positional parameters ;AN663; | ||
| 891 | ; AND DL,DH ; set bits to zero ;AN663; | ||
| 892 | ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;AN663; | ||
| 893 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 894 | ; ;AN663; | ||
| 895 | ; .ELSE ;else, no retry specified with keywords | ||
| 896 | ; ; update pparm with current retry type ;AN663; | ||
| 897 | ; NOT DH ;AN663; | ||
| 898 | ; AND DL,DH ;AN663; | ||
| 899 | ; SHR DL,CL ;AN663; | ||
| 900 | ; ;AN663; | ||
| 901 | ; .IF <DL EQ no_retry_active> THEN ;AN663; | ||
| 902 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 903 | ; .ELSE ;AN663; | ||
| 904 | ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 905 | ; .ENDIF ;AN663; | ||
| 906 | ; ;AN663; | ||
| 907 | ; .ENDIF ;AN663; | ||
| 908 | ; ;AN663; | ||
| 909 | ; .ELSE ;no retry, no code resident ;AN663; | ||
| 910 | ; ;AN663; | ||
| 911 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 912 | ; ;AN663; | ||
| 913 | ; .ENDIF ;AN663; | ||
| 914 | ; ;'Infinite retry on parallel printer timeout' OR ;AN663; | ||
| 915 | ; DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663; | ||
| 916 | ; ;AN663; | ||
| 917 | ; POP DX ;restore registers ;AN663; | ||
| 918 | ; POP AX ;AN663; | ||
| 919 | ; POP DI ;AN663; | ||
| 920 | ; POP ES ;AN663; | ||
| 921 | ; RET ;AN663; | ||
| 922 | ; ;AN663; | ||
| 923 | ;set_retry_flag ENDP ;AN663; | ||
| 924 | ;------------------------------------------------------------------------------- | ||
| 925 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 926 | ;³ ³ | ||
| 927 | ;³ SET_retry_type ³ | ||
| 928 | ;³ -------------- ³ | ||
| 929 | ;³ ³ | ||
| 930 | ;³ Set the resident retry mask to for all LPTs | ||
| 931 | ;³ ³ | ||
| 932 | ;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³ | ||
| 933 | ;³ retry_index - holds index value for the parsed retry parameter. ³ | ||
| 934 | ;³ redirected - holds true/false value for redirected status of lptx. ³ | ||
| 935 | ;³ parm_list_holder - holds offset of parameter list. ³ | ||
| 936 | ;³ resseg - holds offset of resident code in memory ³ | ||
| 937 | ;³ ³ | ||
| 938 | ;³ ³ | ||
| 939 | ;³ RETURN: | ||
| 940 | ;³ | ||
| 941 | ;³ ³ | ||
| 942 | ;³ ³ | ||
| 943 | ;³ MESSAGES: none | ||
| 944 | ;³ ³ | ||
| 945 | ;³ ³ | ||
| 946 | ;³ REGISTER ³ | ||
| 947 | ;³ USAGE: AL - | ||
| 948 | ;³ | ||
| 949 | ;³ CL - | ||
| 950 | ;³ ES - | ||
| 951 | ;³ BP - | ||
| 952 | ;³ DI - | ||
| 953 | ;³ DL - | ||
| 954 | ;³ ³ | ||
| 955 | ;³ ³ | ||
| 956 | ;³ PSUEDO CODE: ³ | ||
| 957 | ;³ | ||
| 958 | ;³ ³ | ||
| 959 | ;³ SAVE REGISTERS ³ | ||
| 960 | ;³ SET UP SEGMENT REGISTER | ||
| 961 | ;³ IF <RETRY REQUESTED> ³ | ||
| 962 | ;³ IF <PRINTER IS REDIRECTED> ³ | ||
| 963 | ;³ PRINT ERROR MESSAGE - not supported on network printer. ³ | ||
| 964 | ;³ ELSE ³ | ||
| 965 | ;³ SET UP PARAMETER LIST STRUCTURE ³ | ||
| 966 | ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³ | ||
| 967 | ;³ LOAD RESIDENT CODE IF NEEDED ³ | ||
| 968 | ;³ SET AND STORE NEW lpt retry mask | ||
| 969 | ;³ ENDIF ³ | ||
| 970 | ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³ | ||
| 971 | ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³ | ||
| 972 | ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³ | ||
| 973 | ;³ ELSE ³ | ||
| 974 | ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³ | ||
| 975 | ;³ ENDIF ³ | ||
| 976 | ;³ ELSE ³ | ||
| 977 | ;³ SET pparm TO '-' ³ | ||
| 978 | ;³ ENDIF ³ | ||
| 979 | ;³ RESTORE REGISTERS ³ | ||
| 980 | ;³ RETURN ³ | ||
| 981 | ;³ ³ | ||
| 982 | ;³ ³ | ||
| 983 | ;³ SIDE EFFECT: | ||
| 984 | ;³ ³ | ||
| 985 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 986 | ; | ||
| 987 | set_retry_type PROC NEAR ;AN663; | ||
| 988 | ;AN663; | ||
| 989 | |||
| 990 | PUSH ES ;save registers ;AN663; | ||
| 991 | PUSH DI ;AN663; | ||
| 992 | PUSH AX ;AN663; | ||
| 993 | PUSH BX | ||
| 994 | PUSH DX ;AN663; | ||
| 995 | ;AN663; | ||
| 996 | XOR BX,BX ;clear a reg ;AN663; | ||
| 997 | MOV ES,BX ;set to segment at 0 ;AN663; | ||
| 998 | MOV BL,device ;AN663; | ||
| 999 | AND BL,07H ;AN663; | ||
| 1000 | DEC BL ;BX=zero based binary printer number ;AN663; | ||
| 1001 | ;AN663; | ||
| 1002 | .IF <retry_index NE 0> THEN NEAR ;IF retry requested on this invokation THEN ;AN663; | ||
| 1003 | ;AN663; | ||
| 1004 | .IF <redirected EQ true> THEN ;AN663; | ||
| 1005 | ;AN663; | ||
| 1006 | display not_supported ;infinite retry not supported on network printer ;AN663; | ||
| 1007 | ;AN663; | ||
| 1008 | .ELSE NEAR ;not a network printer ;AN663; | ||
| 1009 | ;AN663; | ||
| 1010 | MOV DI,retry_index ;AN663; | ||
| 1011 | MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663; | ||
| 1012 | |||
| 1013 | .SELECT ;AN663; | ||
| 1014 | |||
| 1015 | .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663; | ||
| 1016 | MOV AL,error_status ;set mask byte to horrible status ;AN663; | ||
| 1017 | |||
| 1018 | .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663; | ||
| 1019 | .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663; | ||
| 1020 | MOV AL,busy_status ;set mask byte to actual status ;AN663; | ||
| 1021 | |||
| 1022 | .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663; | ||
| 1023 | MOV AL,ready_status ;set mask byte to rosy status ;AN663; | ||
| 1024 | |||
| 1025 | .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;;AN000; | ||
| 1026 | MOV AL,no_retry_flag ;when there is no retry the mask will not be used, so this is just a flag | ||
| 1027 | |||
| 1028 | .ENDSELECT | ||
| 1029 | |||
| 1030 | PUSH AX ;save the retry setting ;AN001; | ||
| 1031 | .IF <AL EQ no_retry_flag> THEN | ||
| 1032 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry | ||
| 1033 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1034 | .ELSE ;AN663; | ||
| 1035 | ;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 1036 | set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001; | ||
| 1037 | .ENDIF ;AN663; | ||
| 1038 | POP AX ;restore the retry setting ;AN001; | ||
| 1039 | |||
| 1040 | .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;IF code not resident THEN ;AN663; | ||
| 1041 | .IF <AL NE no_retry_flag> THEN ;need to turn on retry | ||
| 1042 | CALL modeload ;load resident code ;AN663; | ||
| 1043 | MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 1044 | MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663; | ||
| 1045 | .ENDIF | ||
| 1046 | .ELSE ;ELSE code is already resident | ||
| 1047 | MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 1048 | MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663; | ||
| 1049 | .ENDIF ;AN663; | ||
| 1050 | ;AN663; | ||
| 1051 | .ENDIF ;AN663; | ||
| 1052 | ;AN663; | ||
| 1053 | .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663; | ||
| 1054 | ; retry is specified then ;AN663; | ||
| 1055 | MOV ES,ES:WORD PTR resseg[2] ;ES=segment of the resident code ;AN663; | ||
| 1056 | ;AN663; | ||
| 1057 | .IF <parms_form NE keyword> ;no retry specified with ;AN663; | ||
| 1058 | ;positional parameters, so turn off retry ;AN663; | ||
| 1059 | MOV BYTE PTR ES:lpt1_retry_type[BX],no_retry_flag ;set flag for get retry routine;AN663; | ||
| 1060 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 1061 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1062 | ;AN663; | ||
| 1063 | .ELSE ;else, no retry specified with keywords | ||
| 1064 | ; update pparm with current retry type ;AN663; | ||
| 1065 | .IF <<BYTE PTR ES:lpt1_retry_type[BX]> EQ no_retry_flag> THEN ;AN663; | ||
| 1066 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 1067 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1068 | .ELSE ;AN663; | ||
| 1069 | ;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 1070 | set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001; | ||
| 1071 | .ENDIF ;AN663; | ||
| 1072 | ;AN663; | ||
| 1073 | .ENDIF ;AN663; | ||
| 1074 | ;AN663; | ||
| 1075 | .ELSE ;no retry, no code resident ;AN663; | ||
| 1076 | ;AN663; | ||
| 1077 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 1078 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1079 | ;AN663; | ||
| 1080 | .ENDIF ;AN663; | ||
| 1081 | ;'Infinite retry on parallel printer timeout' OR ;AN663; | ||
| 1082 | DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663; | ||
| 1083 | ;AN663; | ||
| 1084 | POP DX ;restore registers ;AN663; | ||
| 1085 | POP BX | ||
| 1086 | POP AX ;AN663; | ||
| 1087 | POP DI ;AN663; | ||
| 1088 | POP ES ;AN663; | ||
| 1089 | ;AN663; | ||
| 1090 | RET ;AN663; | ||
| 1091 | ;AN663; | ||
| 1092 | set_retry_type ENDP ;AN663; | ||
| 1093 | |||
| 1094 | PRINTF_CODE ENDS | ||
| 1095 | END | ||
| 1096 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/MODEQUAT.INC b/v4.0/src/CMD/MODE/MODEQUAT.INC new file mode 100644 index 0000000..bf79f45 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEQUAT.INC | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | ;---------------------- POSSIBLE VALUES FOR "machine_type" ------------------- | ||
| 2 | |||
| 3 | ;See "get_machine_type" for details on how "machine_type" is used | ||
| 4 | |||
| 5 | |||
| 6 | PC1 EQU 0FFH ;scalar value and model byte for PC1 | ||
| 7 | PCXT EQU 0FEH ;scalar value for XT, only one because each release is same to MODE | ||
| 8 | PCJr EQU 0FDH ;scalar value for PCJr | ||
| 9 | AT1 EQU 0FCH ;scalar value for first release of AT and VAIL | ||
| 10 | AT2 EQU 000H ;scalar value and submodel byte for second release of AT | ||
| 11 | AT3 EQU 001H ;scalar value and submodel byte for internal release of third version of AT | ||
| 12 | AT4 EQU 006H ;scalar value and submodel byte for AT on or later than 11/15/85 | ||
| 13 | XT286 EQU 002H ;scalar value and submodel byte for XT 286 | ||
| 14 | Convertible EQU 0F9H ;scalar value and model byte for PC Convertible | ||
| 15 | PS2Model30 EQU 0FAH ;scalar value and model byte for Personal System/2 Model 30 | ||
| 16 | PS2Model50 EQU 004H ;scalar value and submodel byte for Personal System/2 Model 50 | ||
| 17 | PS2Model60 EQU 005H ;scalar value and model byte for Personal System/2 Model 60 | ||
| 18 | PS2Model80 EQU 0F8H ;scalar value and model byte for Personal System/2 Model 80 and SNOWMASS | ||
| 19 | Vail EQU 009H ;AN001;scalar value and submodel byte for VAIL | ||
| 20 | |||
| 21 | |||
| 22 | bogus EQU 88H ;completely invalid value | ||
| 23 | COM1 EQU 0C1H ;used by invoke | ||
| 24 | COM2 EQU 0C2H ;used by invoke | ||
| 25 | COM3 EQU 0C3H ;used by invoke | ||
| 26 | COM4 EQU 0C4H ;used by invoke | ||
| 27 | false EQU 00H | ||
| 28 | true EQU 0FFH | ||
| 29 | |||
| 30 | |||
| 31 | ;FLAGS field bit(s) values | ||
| 32 | |||
| 33 | Left_Align equ 0 ;00xxxxxx | ||
| 34 | Right_Align equ 80h ;10xxxxxx | ||
| 35 | |||
| 36 | Unsgn_Bin_Byte equ 11h ;a0010001 | ||
| 37 | |||
| 38 | |||
| 39 | PUBLIC bogus | ||
| 40 | |||
| 41 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 42 | ;º º | ||
| 43 | |||
| 44 | ; AX001 - P4543: Add VAIL and SNOWMASS to legal choices for 19200 baud | ||
| 45 | |||
| 46 | ;º º | ||
| 47 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 48 | |||
diff --git a/v4.0/src/CMD/MODE/MODESCRN.ASM b/v4.0/src/CMD/MODE/MODESCRN.ASM new file mode 100644 index 0000000..3c529b3 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODESCRN.ASM | |||
| @@ -0,0 +1,564 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODESCRN.ASM - SCREEN SUPPORT FOR THE MODE COMMAND | ||
| 3 | |||
| 4 | .XLIST | ||
| 5 | INCLUDE STRUC.INC | ||
| 6 | .LIST | ||
| 7 | |||
| 8 | INCLUDE COMMON.STC ;definitions of message sublist blocks ;AC001; | ||
| 9 | |||
| 10 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 11 | ;º º ;AN000; | ||
| 12 | ;AN000; | ||
| 13 | ; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the | ||
| 14 | ; USA.MSG file because it looked like a common message. Now | ||
| 15 | ; I use a different (better) message. It was "Invalid paramters", | ||
| 16 | ; is now "Function not supported - ????". | ||
| 17 | |||
| 18 | ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 19 | ; implement the SYSGETMSG method of getting addressability to | ||
| 20 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 21 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 22 | ; address is then put in the sublist block for the message | ||
| 23 | ; being issued. | ||
| 24 | |||
| 25 | ; AX002 - P5159: Need to use get extended country call (6523) to get the yes | ||
| 26 | ; 7-14-88 no answer | ||
| 27 | |||
| 28 | ;º º ;AN000; | ||
| 29 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 30 | |||
| 31 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 32 | ;º º | ||
| 33 | |||
| 34 | BREAK MACRO X | ||
| 35 | JMP endcase_&X | ||
| 36 | ENDM | ||
| 37 | |||
| 38 | |||
| 39 | SCRN MACRO COMMAND,MOD | ||
| 40 | MOV AH,COMMAND ;REQUEST FUNCTION OF SCREEN BIOS | ||
| 41 | IFNB <MOD> | ||
| 42 | MOV AL,MOD ;SET MODE TO SCREEN | ||
| 43 | ENDIF | ||
| 44 | INT 10H ;CALL BIOS SCREEN HANDLER | ||
| 45 | ; | ||
| 46 | ENDM | ||
| 47 | ; | ||
| 48 | DISPLAY MACRO MSG | ||
| 49 | IFNB <MSG> | ||
| 50 | MOV DX,OFFSET MSG | ||
| 51 | ENDIF | ||
| 52 | CALL PRINTF | ||
| 53 | ENDM | ||
| 54 | |||
| 55 | |||
| 56 | SET_LEFT_SHIFT_LIMIT MACRO | ||
| 57 | LOCAL LIMIT_SET | ||
| 58 | ASSUME DS:ROM_BIOS | ||
| 59 | ; | ||
| 60 | PUSH DS | ||
| 61 | PUSH AX | ||
| 62 | MOV AX,ROM_BIOS_SEG | ||
| 63 | MOV DS,AX | ||
| 64 | CMP DS:MACHINE_TYPE,JUNIOR ;IF this machine is a Junior THEN | ||
| 65 | JNE LIMIT_SET | ||
| 66 | MOV BYTE PTR CS:LEFT_LIMIT,JR_LEFT_LIMIT ;USE THE JUNIOR'S LEFT LIMIT | ||
| 67 | LIMIT_SET: | ||
| 68 | POP AX | ||
| 69 | POP DS | ||
| 70 | ; | ||
| 71 | ASSUME DS:PRINTF_CODE | ||
| 72 | ; | ||
| 73 | ENDM | ||
| 74 | |||
| 75 | set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message". | ||
| 76 | |||
| 77 | MOV AX,submessage ;AX=message number ;AN001; | ||
| 78 | MOV DH,utility_msg_class ;DH=message class=utility class ;AN001; | ||
| 79 | CALL SYSGETMSG ;DS:SI=>message piece ;AN001; | ||
| 80 | MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001; | ||
| 81 | MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001; | ||
| 82 | ENDM ;AN001; | ||
| 83 | |||
| 84 | |||
| 85 | ;--------------------------------------------------------------------------- | ||
| 86 | ; SET_UP_FOR_PRINTF | ||
| 87 | ;PRINTF depends on DS containing the segment that the messages are in, so if | ||
| 88 | ;DS is being used to address data areas elsewhere it needs to be temporarily | ||
| 89 | ;set to the message file segment. | ||
| 90 | ;--------------------------------------------------------------------------- | ||
| 91 | ; | ||
| 92 | SET_UP_FOR_PRINTF MACRO | ||
| 93 | |||
| 94 | PUSH DS ;SAVE DS | ||
| 95 | PUSH CS | ||
| 96 | POP DS ;DS NOW HAS MESSAGE SEGMENT | ||
| 97 | ; | ||
| 98 | ENDM | ||
| 99 | |||
| 100 | ;---------------------------------------------------------------------------- | ||
| 101 | ; REPLACE_DS | ||
| 102 | ;Replace the contents DS had before the PRINTF call. Assume that DS was pushed. | ||
| 103 | ;----------------------------------------------------------------------------- | ||
| 104 | |||
| 105 | REPLACE_DS MACRO | ||
| 106 | |||
| 107 | POP DS | ||
| 108 | ; | ||
| 109 | ENDM | ||
| 110 | |||
| 111 | ;º º | ||
| 112 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 113 | |||
| 114 | CURRENT_VIDEO_STATE EQU 15 ;REQUEST TO BIOS SCREEN TO RETURN SCREEN STATE | ||
| 115 | SET_SCREEN_MODE EQU 0 ;REQUEST TO BIOS SCREEN TO SET SCREEN MODE | ||
| 116 | COL40 EQU 1 ;FLAG BIT TO REQUEST 40 COL | ||
| 117 | COL80 EQU 2 ;FLAG BIT TO REQUEST 80 COL | ||
| 118 | CNT4 EQU 4 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 40COL | ||
| 119 | CNT8 EQU 8 ;COUNT NO. TIMES TO DISPLAY "NUMBERS" FOR 80COL | ||
| 120 | FORTY EQU 40 ;SCREEN WIDTH | ||
| 121 | MONO_MODE EQU 7 ;MONOCHROME SCREEN MODE | ||
| 122 | no EQU 0 ;AC002;value to compare with when user responds with no character | ||
| 123 | NOEXIT EQU 0 ;EXIT SWITCH VALUE TO REPEAT LOOP | ||
| 124 | EXIT EQU 1 ;EXIT SWITCH VALUE TO LEAVE LOOP | ||
| 125 | YES EQU 1 ;AC002;value AX will be if user types yes character ("y", "s", "j" etc) | ||
| 126 | ; | ||
| 127 | |||
| 128 | |||
| 129 | |||
| 130 | |||
| 131 | |||
| 132 | ; OFFSETS INTO VIDEO TABLE, AT 40:90 | ||
| 133 | SHIFCT40 EQU 02H ;SHIFT COUNT FOR 40 COL | ||
| 134 | SHIFCT80 EQU 012H ;SHIFT COUNT FOR 80 COL | ||
| 135 | SHIFCTGR EQU 022H ;SHIFT COUNT FOR GRAPHICS | ||
| 136 | CR EQU 13 ;CARRIAGE RETURN | ||
| 137 | LF EQU 10 ;LINE FEED | ||
| 138 | BEEP EQU 7 ;SOUND THE AUDIBLE ALARM | ||
| 139 | LOWERCASE EQU 20H ;ADD THIS TO UPPER, GET LOWER CASE | ||
| 140 | TRUE EQU 0FFH | ||
| 141 | |||
| 142 | RIGHT_LIMIT EQU 01 ;SAME FOR ALL TYPES OF MACHINES | ||
| 143 | JUNIOR EQU 0FDH ;MACHINE TYPE SIGNITURE FOR PC JUNIOR | ||
| 144 | JR_LEFT_LIMIT EQU 031H ;LEFT LIMIT FOR SCREEN SHIFT ON PC JUNIOR | ||
| 145 | ; | ||
| 146 | EGA_SIG EQU 0AA55H ;SIGNITURE FOR THE EGA CARD | ||
| 147 | ; | ||
| 148 | ROM_BIOS SEGMENT AT 0F000H | ||
| 149 | ORG 0FFFEH | ||
| 150 | ; | ||
| 151 | MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM | ||
| 152 | ; | ||
| 153 | ROM_BIOS ENDS | ||
| 154 | |||
| 155 | ROM_BIOS_SEG EQU 0F000H | ||
| 156 | ; | ||
| 157 | SIGNITURE SEGMENT AT 0C000H ;SEGMENT OF EGA AREA | ||
| 158 | ORG 0 | ||
| 159 | SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT | ||
| 160 | SIGNITURE ENDS | ||
| 161 | ; | ||
| 162 | PRINTF_CODE SEGMENT PUBLIC | ||
| 163 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE | ||
| 164 | ; | ||
| 165 | |||
| 166 | |||
| 167 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 168 | ;º º | ||
| 169 | |||
| 170 | PUBLIC HANDLE_40_OR_80 ;make available to "ANALYZE_AND_INVOKE" | ||
| 171 | PUBLIC SHIFT_SCREEN ;make available to "ANALYZE_AND_INVOKE" | ||
| 172 | |||
| 173 | |||
| 174 | ;º º | ||
| 175 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 176 | |||
| 177 | |||
| 178 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 179 | ;º º | ||
| 180 | |||
| 181 | EXTRN CANT_SHIFT:WORD ;CR,LF,"Unable to shift screen",BEEP,EOM | ||
| 182 | EXTRN PRINTF:NEAR ;interface to message service ROUTINE | ||
| 183 | EXTRN SCRNTAB:NEAR ;LOADS VIDEO INIT TABLE RETURNING POINTER TO IT | ||
| 184 | ; | ||
| 185 | EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE | ||
| 186 | ;PARM1 DB 10 DUP(0) | ||
| 187 | ;PARM2 DB 0 | ||
| 188 | ;PARM3 DB 0 | ||
| 189 | ;MODE DB 0 | ||
| 190 | ;FLAG DB 0 | ||
| 191 | EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD | ||
| 192 | EXTRN NOERROR:BYTE ;INDICATE IF AN ERROR OCCURED YET | ||
| 193 | ENDPARM EQU MODE | ||
| 194 | EXTRN ALT_SELECT:ABS ;INT 10 FUNCTION GET MONITOR TYPE | ||
| 195 | EXTRN EGA_INFO:ABS ;INT 10 FUNCTION GET INFO | ||
| 196 | EXTRN COLOR_ON_IT:ABS ;INT 10 RETURN FOR COLOR MONITOR HOOKED TO EGA | ||
| 197 | ; | ||
| 198 | LEFT_LIMIT DB 02EH ;SCREEN SHIFT LEFT LIMIT, MAY BE Revised | ||
| 199 | ; | ||
| 200 | SWITCH DB 0 ;LOOP CONTROLLER | ||
| 201 | ;AC000;OK DB 1 ;INDICATOR OF VALID REQUEST: | ||
| 202 | ; 1=BAD, 0=GOOD | ||
| 203 | ; | ||
| 204 | EXTRN L_item_tag:ABS ;see MODEpars.asm ;AN000; | ||
| 205 | EXTRN R_item_tag:ABS ;see MODEpars.asm ;AN000; | ||
| 206 | EXTRN T_item_tag:ABS ;see MODEpars.asm ;AN000; | ||
| 207 | |||
| 208 | EXTRN RIGHTMOST:WORD ;message number for "rightmost 9",EOM ;AC001; | ||
| 209 | EXTRN LEFTMOST:WORD ;message number for "leftmost 0",EOM ;AC001; | ||
| 210 | ;AC001;EXTRN LFTM_OR_RGHTM_PTR:WORD | ||
| 211 | EXTRN SHIFT_MSG:WORD ;CR,LF,"Do you see the ...",CR,LF,EOM ;AX000; | ||
| 212 | ;AC000;EXTRN MSGI:WORD ;CR,LF,"Invalid parameters",BEEP,CR,LF,"$" ;AX000; | ||
| 213 | EXTRN NUMBERS:WORD ;"0123456789" ;AX000; | ||
| 214 | EXTRN LEFT:WORD ;message number for "left",EOM ;AC001; | ||
| 215 | EXTRN RIGHT:WORD ;message number for "right",EOM ;AC001; | ||
| 216 | ;AC001;EXTRN LEFT_OR_RIGHT_PTR:WORD ;PART OF MESSAGE "Unable to shift screen ..." | ||
| 217 | EXTRN sublist_cant_shift:BYTE ;definition of submessage ;AC001; | ||
| 218 | EXTRN sublist_shift_msg:BYTE ;definition of submessage ;AC001; | ||
| 219 | EXTRN SYSGETMSG:NEAR ;used to get the address of a message part ;AC001; | ||
| 220 | EXTRN utility_msg_class:ABS ;input for sysgetmsg ;AC001; | ||
| 221 | |||
| 222 | |||
| 223 | ;º º | ||
| 224 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 225 | |||
| 226 | |||
| 227 | |||
| 228 | ;---------------------------------------------------------------------------- | ||
| 229 | |||
| 230 | |||
| 231 | HANDLE_40_OR_80 PROC NEAR ;AN000; | ||
| 232 | |||
| 233 | ; SCREEN WIDTH IN BL | ||
| 234 | ; | ||
| 235 | SCRN CURRENT_VIDEO_STATE,0 ;GET CURRENT SCREEN MODE | ||
| 236 | MOV DS:MODE,AL ;STORE CURRENT MODE | ||
| 237 | ; IF THE REQUEST WAS FOR 40 COL, | ||
| 238 | CMP BL,FORTY ;COMPARE WITH BL, OUTPUT FROM 'MODELENG' | ||
| 239 | JNE ELSE01 | ||
| 240 | ; | ||
| 241 | ;AC000; MOV OK,0 ;INDICATE A LEGAL FUNCTION DONE | ||
| 242 | ; CASE current mode = | ||
| 243 | |||
| 244 | ; 0, | ||
| 245 | ; 2, | ||
| 246 | ; 5, | ||
| 247 | ; 6, | ||
| 248 | ; 7, | ||
| 249 | ; 11: | ||
| 250 | |||
| 251 | .IF <DS:mode EQ 0> OR | ||
| 252 | .IF <DS:mode EQ 2> OR | ||
| 253 | .IF <DS:mode EQ 5> OR | ||
| 254 | .IF <DS:mode EQ 6> OR | ||
| 255 | .IF <DS:mode EQ 7> OR | ||
| 256 | .IF <DS:mode EQ 011H> THEN | ||
| 257 | MOV DS:MODE,0 ;SWITCH TO 40 COL, BW | ||
| 258 | BREAK 0 | ||
| 259 | .ENDIF | ||
| 260 | |||
| 261 | ; 1, | ||
| 262 | ; 3, | ||
| 263 | ; 4, | ||
| 264 | ; 12, | ||
| 265 | ; 13: | ||
| 266 | |||
| 267 | .IF <DS:mode EQ 1> OR | ||
| 268 | .IF <DS:mode EQ 3> OR | ||
| 269 | .IF <DS:mode EQ 4> OR | ||
| 270 | .IF <DS:mode EQ 012H> OR | ||
| 271 | .IF <DS:mode EQ 013H> THEN | ||
| 272 | MOV DS:MODE,1 ;SWITCH TO 40 COL, COLOR | ||
| 273 | BREAK 0 | ||
| 274 | .ENDIF | ||
| 275 | |||
| 276 | |||
| 277 | ENDCASE_0: | ||
| 278 | |||
| 279 | |||
| 280 | SCRN SET_SCREEN_MODE,DS:MODE ;SWITCH TO 40 COL | ||
| 281 | ; ELSE ,SINCE REQUEST NOT FOR 40 COL, | ||
| 282 | JMP SHORT ENDIF01 | ||
| 283 | ELSE01: | ||
| 284 | ; : : IF REQUEST FOR 80 COL | ||
| 285 | CMP BL,80 | ||
| 286 | JNE ENDIF02 | ||
| 287 | ; | ||
| 288 | ;AC000; MOV OK,0 ;INDICATE A LEGAL FUNCTION DONE | ||
| 289 | ; CASE current mode = | ||
| 290 | |||
| 291 | ; 0, | ||
| 292 | ; 2, | ||
| 293 | ; 5, | ||
| 294 | ; 6, | ||
| 295 | ; 7, | ||
| 296 | ; 11: | ||
| 297 | |||
| 298 | .IF <DS:mode EQ 0> OR | ||
| 299 | .IF <DS:mode EQ 2> OR | ||
| 300 | .IF <DS:mode EQ 5> OR | ||
| 301 | .IF <DS:mode EQ 6> OR | ||
| 302 | .IF <DS:mode EQ 7> OR | ||
| 303 | .IF <DS:mode EQ 011H> THEN | ||
| 304 | MOV DS:MODE,2 ;SWITCH TO 80 COL, BW | ||
| 305 | BREAK 1 | ||
| 306 | .ENDIF | ||
| 307 | |||
| 308 | ; 1, | ||
| 309 | ; 3, | ||
| 310 | ; 4, | ||
| 311 | ; 12, | ||
| 312 | ; 13: | ||
| 313 | |||
| 314 | .IF <DS:mode EQ 1> OR | ||
| 315 | .IF <DS:mode EQ 3> OR | ||
| 316 | .IF <DS:mode EQ 4> OR | ||
| 317 | .IF <DS:mode EQ 012H> OR | ||
| 318 | .IF <DS:mode EQ 013H> THEN | ||
| 319 | MOV DS:MODE,3 ;SWITCH TO 80 COL, COLOR | ||
| 320 | BREAK 1 | ||
| 321 | .ENDIF | ||
| 322 | |||
| 323 | |||
| 324 | ENDCASE_1: | ||
| 325 | |||
| 326 | SCRN SET_SCREEN_MODE,DS:MODE | ||
| 327 | ; : : ENDIF ,END REQUEST FOR 80 COL | ||
| 328 | ENDIF02: | ||
| 329 | ; : ENDIF ,END REQUEST FOR 40 COL | ||
| 330 | ENDIF01: | ||
| 331 | |||
| 332 | |||
| 333 | RET ;AN000; | ||
| 334 | |||
| 335 | HANDLE_40_OR_80 ENDP ;AN000; | ||
| 336 | |||
| 337 | |||
| 338 | ;------------------------------------------------------------------------------ | ||
| 339 | |||
| 340 | |||
| 341 | SHIFT_SCREEN PROC NEAR ;AN000;shift the screen | ||
| 342 | |||
| 343 | ; DO SHIFT UNTIL HE CAN SEE END CHAR | ||
| 344 | MOV SWITCH,NOEXIT ;SET TO REPEAT NEXT LOOP | ||
| 345 | DO01: | ||
| 346 | ; : IF second PARM (sd) IS AN "R"? | ||
| 347 | CMP DS:PARM2,R_item_tag ;AC000; | ||
| 348 | JE SKIP03 ;IT'S AN R SO TRY TO SHIFT RIGHT | ||
| 349 | JMP ELSE03 ;NOT AN R SO CHECK FOR L | ||
| 350 | ; | ||
| 351 | SKIP03: | ||
| 352 | ;AC000; MOV CS:OK,0 ;INDICATE A LEGAL FUNCTION DONE | ||
| 353 | SCRN CURRENT_VIDEO_STATE,0 ;CHECK CURRENT VIDEO MODE | ||
| 354 | CMP AL,MONO_MODE ;IF mode >= mono THEN must be EGA mono so ... | ||
| 355 | ; $IF GE | ||
| 356 | JNGE $$IF1 | ||
| 357 | ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT ;YELL BECAUSE CAN'T SHIFT AN EGA OR MONO | ||
| 358 | set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right" | ||
| 359 | DISPLAY CANT_SHIFT ;YELL BECAUSE CAN'T SHIFT AN EGA OR MONO | ||
| 360 | ; $ELSE LONG ;JUMP PAST SHIFT LOOP | ||
| 361 | JMP $$EN1 | ||
| 362 | $$IF1: | ||
| 363 | ; | ||
| 364 | CHECK_FOR_EGA: ;SEE IF SCREEN IS HOOKED TO EGA | ||
| 365 | MOV AX,SIGNITURE ;GET TO SEGMENT OF SIGNITURE WORD | ||
| 366 | MOV ES,AX ;ADDRESS THROUGH ES | ||
| 367 | CMP WORD PTR ES:SIGWORD,EGA_SIG ;IF EGA card being used THEN | ||
| 368 | JNE TRY_TO_SHIFT | ||
| 369 | MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER | ||
| 370 | MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE | ||
| 371 | MOV BH, COLOR_ON_IT ;protect against RT PC problem | ||
| 372 | not bh ; masm 5.0 won't allow "not color_on_it" | ||
| 373 | INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH | ||
| 374 | CMP BH,COLOR_ON_IT ;IF COLOR HOOKED TO EGA THEN | ||
| 375 | JNE TRY_TO_SHIFT | ||
| 376 | ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT ; YELL BECAUSE CAN'T SHIFT AN EGA | ||
| 377 | set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right" | ||
| 378 | DISPLAY CANT_SHIFT | ||
| 379 | JMP ELSE05 ; JUMP PAST SHIFT LOOP | ||
| 380 | ; | ||
| 381 | TRY_TO_SHIFT: | ||
| 382 | CALL SCRNTAB ;LOAD VIDEO TABLE IN WORK AREA | ||
| 383 | ; DS NOW POINTS TO THE SEGMENT WHERE THE VIDEO TABLE WAS MOVED TO. | ||
| 384 | ; BX HAS THE NEW OFFSET OF THE VIDEO TABLE | ||
| 385 | |||
| 386 | CMP BYTE PTR DS:[BX][SHIFCT40],RIGHT_LIMIT ;IF haven't shifted max right THEN | ||
| 387 | JG SHIFT_RIGHT | ||
| 388 | SET_UP_FOR_PRINTF | ||
| 389 | ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET RIGHT | ||
| 390 | set_submessage_ptr right,cant_shift ;set up message sublist with pointer to "right" | ||
| 391 | DISPLAY CANT_SHIFT ;"Unable to shift screen right" | ||
| 392 | REPLACE_DS | ||
| 393 | JMP ELSE05 | ||
| 394 | SHIFT_RIGHT: | ||
| 395 | MOV AL,DS:[BX][SHIFCT40] ;GET SHIFT COUNT FOR 40COL | ||
| 396 | SUB AL,1 ;SHIFT IT LEFT 1 | ||
| 397 | MOV DS:[BX][SHIFCT40],AL ;STORE IT BACK | ||
| 398 | MOV AL,DS:[BX][SHIFCT80] ;GET SHIFT COUNT FOR 80COL | ||
| 399 | SUB AL,2 ;SHIFT LEFT 2 | ||
| 400 | MOV DS:[BX][SHIFCT80],AL ;STORE IT BACK | ||
| 401 | MOV AL,DS:[BX][SHIFCTGR] ;GET GRAPHICS SHIFT COUNT | ||
| 402 | SUB AL,1 ;SHIFT LEFT 1 | ||
| 403 | MOV DS:[BX][SHIFCTGR],AL ;STORE IT BACK | ||
| 404 | ; : ELSE ,SINCE PARM2 IS NOT AN "R" | ||
| 405 | JMP ENDIF03 | ||
| 406 | ELSE03: | ||
| 407 | ; : : IF THIS CHAR IS AN "L"? | ||
| 408 | CMP DS:PARM2,L_item_tag ;AC000; | ||
| 409 | JE SKIP05 ;L WAS SPECIFIED SO TRY TO SHIFT LEFT | ||
| 410 | JMP ELSE05 ;WASN'T "L" OR "R" SO DONT'T TRY TO SHIFT | ||
| 411 | ; SINCE IT IS "L", | ||
| 412 | ; | ||
| 413 | SKIP05: | ||
| 414 | ;AC000; MOV CS:OK,0 ;INDICATE A LEGAL FUNCTION DONE | ||
| 415 | SCRN CURRENT_VIDEO_STATE,0 ;CHECK CURRENT VIDEO MODE | ||
| 416 | CMP AL,MONO_MODE ;IF mode >= mono THEN must be EGA or mono so ... | ||
| 417 | JB CHK_FOR_EGA | ||
| 418 | ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT ;YELL BECAUSE CAN'T SHIFT AN EGA | ||
| 419 | set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001; | ||
| 420 | DISPLAY CANT_SHIFT | ||
| 421 | JMP ELSE05 ;JUMP PAST SHIFT LOOP | ||
| 422 | ; | ||
| 423 | CHK_FOR_EGA: ;SEE IF SCREEN IS HOOKED TO EGA | ||
| 424 | MOV AX,SIGNITURE ;GET TO SEGMENT OF SIGNITURE WORD | ||
| 425 | MOV ES,AX ;ADDRESS THROUGH ES | ||
| 426 | CMP WORD PTR ES:SIGWORD,EGA_SIG ;IF EGA card being used THEN | ||
| 427 | JNE TRY_TO_SHIFT_LEFT | ||
| 428 | MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER | ||
| 429 | MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE | ||
| 430 | INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH | ||
| 431 | CMP BH,COLOR_ON_IT ;IF COLOR HOOKED TO EGA THEN | ||
| 432 | JNE TRY_TO_SHIFT_LEFT | ||
| 433 | ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT ; YELL BECAUSE CAN'T SHIFT AN EGA | ||
| 434 | set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001; | ||
| 435 | DISPLAY CANT_SHIFT | ||
| 436 | JMP ELSE05 ; JUMP PAST SHIFT LOOP | ||
| 437 | ; | ||
| 438 | TRY_TO_SHIFT_LEFT: | ||
| 439 | CALL SCRNTAB ;LOAD VIDEO TABLE IN WORK AREA | ||
| 440 | ; DS NOW POINTS TO THE SEGMENT OF THE RESIDENT CODE, | ||
| 441 | ; WHERE THE VIDEO TABLE WAS MOVED TO. | ||
| 442 | ; | ||
| 443 | SET_LEFT_SHIFT_LIMIT ;SET LIMIT TO SUIT MACHINE TYPE | ||
| 444 | ; | ||
| 445 | MOV AL,BYTE PTR DS:[BX][SHIFCT40] ;AL=current horizontal sync position | ||
| 446 | CMP AL,CS:LEFT_LIMIT ;IF haven't shifted max left THEN | ||
| 447 | JL SHIFT_LEFT | ||
| 448 | SET_UP_FOR_PRINTF | ||
| 449 | ;AC001; MOV LEFT_OR_RIGHT_PTR,OFFSET LEFT | ||
| 450 | set_submessage_ptr left,cant_shift ;set up message sublist with pointer to "left" ;AC001; | ||
| 451 | DISPLAY CANT_SHIFT | ||
| 452 | REPLACE_DS | ||
| 453 | JMP ELSE05 | ||
| 454 | SHIFT_LEFT: | ||
| 455 | MOV AL,DS:[BX][SHIFCT40] ;GET SHIFT COUNT 40COL | ||
| 456 | ADD AL,1 ;SHIFT RIGHT ONE | ||
| 457 | MOV DS:[BX][SHIFCT40],AL ;STORE IT BACK | ||
| 458 | MOV AL,DS:[BX][SHIFCT80] ;GET SHIFT COUNT 80COL | ||
| 459 | ADD AL,2 ;SHIFT RIGHT 2 | ||
| 460 | MOV DS:[BX][SHIFCT80],AL ;STORE IT BACK | ||
| 461 | MOV AL,DS:[BX][SHIFCTGR] ;GET GRAPHICS COUNT | ||
| 462 | ADD AL,1 ;SHIFT RIGHT 8 PIXELS | ||
| 463 | MOV DS:[BX][SHIFCTGR],AL ;STORE IT BACK | ||
| 464 | ; : : ELSE ,SINCE CHAR IS NEITHER "R" NOR "L", QUIT | ||
| 465 | JMP SHORT ENDIF05 | ||
| 466 | ; $ENDIF ;EGA or MONO | ||
| 467 | $$EN1: | ||
| 468 | ELSE05: | ||
| 469 | MOV CS:SWITCH,EXIT ;REQUEST LOOP BE TERMINATED | ||
| 470 | ; : : ENDIF ,END IS THIS CHAR AN "L"? TEST | ||
| 471 | ENDIF05: | ||
| 472 | ; : ENDIF END, IS PARM2 AN "R"? TEST | ||
| 473 | ENDIF03: | ||
| 474 | |||
| 475 | PUBLIC ENDIF03 | ||
| 476 | |||
| 477 | MOV AX,CS ;RESTORE THIS SEG | ||
| 478 | MOV DS,AX ; TO DS | ||
| 479 | ; LEAVE IF THE EXIT SWITCH IS SET | ||
| 480 | ;AC001; CMP SWITCH,EXIT | ||
| 481 | ;AC001; JE ENDDO01 | ||
| 482 | .IF <switch NE exit> THEN NEAR | ||
| 483 | ; | ||
| 484 | SCRN CURRENT_VIDEO_STATE,0 | ||
| 485 | MOV DS:MODE,AL ;SAVE CURRENT MODE | ||
| 486 | ; LEAVING CURRENT MODE IN AL, | ||
| 487 | SCRN SET_SCREEN_MODE ;RESET IN CURRENT MODE | ||
| 488 | ; : IF THIS IS "T" | ||
| 489 | CMP DS:PARM3,T_item_tag ;AC000; | ||
| 490 | JNE ELSE06 | ||
| 491 | ; | ||
| 492 | ; DECIDE WHICH QUESTION TO DISPLAY... | ||
| 493 | ; : : IF REQUESTED FUNCTION IS "R" | ||
| 494 | CMP DS:PARM2,R_item_tag ;AC000; | ||
| 495 | JNE ELSE08 | ||
| 496 | |||
| 497 | ;AC001; MOV LFTM_OR_RGHTM_PTR,OFFSET LEFTMOST | ||
| 498 | set_submessage_ptr leftmost,shift_msg ;set up message sublist with pointer to "leftmost" ;AC001; | ||
| 499 | ; : : ELSE ,SINCE WAS NOT "R" | ||
| 500 | JMP SHORT ENDIF08 | ||
| 501 | ELSE08: | ||
| 502 | ;AC001; MOV LFTM_OR_RGHTM_PTR,OFFSET RIGHTMOST | ||
| 503 | set_submessage_ptr rightmost,shift_msg ;set up message sublist with pointer to "rightmost" ;AC001; | ||
| 504 | ; : : ENDIF END FUNCTION IS "R"? TEST | ||
| 505 | ENDIF08: | ||
| 506 | |||
| 507 | ; decide how many times to display "0123456789" | ||
| 508 | OR DS:MODE,01H ;SET UP TO TEST FOR COLOR OR B/W | ||
| 509 | MOV CX,CNT8 ;(GUESS IT IS 80COL) SET LOOP CTR TO 8 | ||
| 510 | ; : : IF 40 COL? | ||
| 511 | CMP DS:MODE,COL40 | ||
| 512 | JNE ENDIF07 | ||
| 513 | ; | ||
| 514 | MOV CX,CNT4 ;(FIX ABOVE GUESS) SET LOOP CTR TO 4 | ||
| 515 | ; : : ENDIF ,END IS IT 40 COL? TEST | ||
| 516 | ENDIF07: | ||
| 517 | ; | ||
| 518 | .REPEAT | ||
| 519 | SCRN SET_SCREEN_MODE,DS:MODE ;clear the screen | ||
| 520 | PUSH CX ;save loop counter | ||
| 521 | DO02: ;DO UNTIL LINE IS DISPLAYED across entire screen | ||
| 522 | DISPLAY NUMBERS ;DISPLAY 0123456789 | ||
| 523 | ; ENDDO WHEN CNT IN CX = 0 | ||
| 524 | LOOP DO02 | ||
| 525 | DISPLAY SHIFT_MSG ;AN000;DISPLAY QUESTION, msg services will do the keyboard input, see modedefs.inc | ||
| 526 | MOV DL,AL ;AC002;DL=character user entered | ||
| 527 | MOV AX,6523H ;AN002;yes no check get extended error | ||
| 528 | INT 21H ;AN002;AX returned with indication of yes or no | ||
| 529 | POP CX ;restore loop counter | ||
| 530 | .UNTIL <AX EQ yes> OR | ||
| 531 | .UNTIL <AX EQ no> | ||
| 532 | ; : : IF RESPONSE IS "Y" | ||
| 533 | CMP AL,YES | ||
| 534 | JNE ENDIF09 | ||
| 535 | MOV SWITCH,EXIT ;TERMINATE THE LOOP | ||
| 536 | ; : : ENDIF ,END IS RESPONSE "N"? TEST | ||
| 537 | ENDIF09: | ||
| 538 | ; : ELSE ,SINCE "T" NOT SPECIFIED | ||
| 539 | JMP SHORT ENDIF06 | ||
| 540 | ELSE06: | ||
| 541 | MOV SWITCH,EXIT ;TERMINATE THE LOOP | ||
| 542 | ; : ENDIF ,END IS THIS "T"? TEST | ||
| 543 | ENDIF06: | ||
| 544 | ; LEAVE IF EXIT SWITCH IS SET | ||
| 545 | CMP SWITCH,EXIT | ||
| 546 | JE ENDDO01 | ||
| 547 | ; | ||
| 548 | ; ENDDO GO BACK AND SHIFT MORE | ||
| 549 | JMP DO01 | ||
| 550 | .ENDIF | ||
| 551 | ENDDO01: | ||
| 552 | ; | ||
| 553 | ; IF NO LEGAL FUNCTIONS DONE, | ||
| 554 | ;AC000;; CMP OK,0 | ||
| 555 | ;AC000; JZ ENDIF10 | ||
| 556 | |||
| 557 | ;AC000; DISPLAY MSGI ;FUSS ABOUT ILLEGAL PARAMETERS | ||
| 558 | ; ENDIF ,END ARE NO LEGAL FUNCTIONS DONE? TEST | ||
| 559 | ;AC000;ENDIF10: | ||
| 560 | RET ;RETURN TO MODE MAIN ROUTINE | ||
| 561 | SHIFT_SCREEN ENDP ;AN000; | ||
| 562 | PRINTF_CODE ENDS | ||
| 563 | END | ||
| 564 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/MODESUBS.INC b/v4.0/src/CMD/MODE/MODESUBS.INC new file mode 100644 index 0000000..eb0c0a8 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODESUBS.INC | |||
| @@ -0,0 +1,598 @@ | |||
| 1 | |||
| 2 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 3 | ;º º | ||
| 4 | |||
| 5 | ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 6 | ; implement the SYSGETMSG method of getting addressability to | ||
| 7 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 8 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 9 | ; address is then put in the sublist block for the message | ||
| 10 | ; being issued. | ||
| 11 | |||
| 12 | ; AC002 - P3258: PS/2 only COM parameters were being allowed on non-PS/2 | ||
| 13 | ; machines. Added checks for baud=19200, parity=mark or space, | ||
| 14 | ; data=5 or 6, stop=1.5 for both keyword and positional forms | ||
| 15 | ; in MODEPARSE.ASM. Had to enlarge the possible parm size for | ||
| 16 | ; "Function not supported on this computer - ?????????????" | ||
| 17 | |||
| 18 | ;º º | ||
| 19 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 20 | |||
| 21 | |||
| 22 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 23 | ;º º | ||
| 24 | |||
| 25 | ;PUBLICs for the sublists are handled in modemes.asm | ||
| 26 | PUBLIC Utility_Msg_Class ;AN001; | ||
| 27 | |||
| 28 | ;º º | ||
| 29 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 30 | |||
| 31 | |||
| 32 | ; | ||
| 33 | ;***************************************************************************** | ||
| 34 | ; External data declarations | ||
| 35 | ;***************************************************************************** | ||
| 36 | |||
| 37 | |||
| 38 | |||
| 39 | ; | ||
| 40 | ;***************************************************************************** | ||
| 41 | ; Message Retriever equates | ||
| 42 | ;***************************************************************************** | ||
| 43 | ; | ||
| 44 | |||
| 45 | INCLUDE common.stc ;contains the following structure | ||
| 46 | |||
| 47 | ;sublist_def STRUC | ||
| 48 | |||
| 49 | ; db ? ;Sublist Length, fixed | ||
| 50 | ; db ? ;Reserved, not used yet ;AN000; | ||
| 51 | ; dw ? ;offset | ||
| 52 | ;sublist_seg dw ? ;segment part of pointer to piece of message | ||
| 53 | ; db ? ;number of this piece of the message,0 indicates special end of message format ;AN000; | ||
| 54 | ; db ? ;flags | ||
| 55 | ; db ? ;maximum field width | ||
| 56 | ; db ? ;minimum field width | ||
| 57 | ; db ? ;character to use for padding | ||
| 58 | |||
| 59 | ;sublist_def ENDS | ||
| 60 | |||
| 61 | |||
| 62 | |||
| 63 | INCLUDE modequat.inc ;contains the following two equates for this file | ||
| 64 | |||
| 65 | ;FLAGS field bit(s) values | ||
| 66 | |||
| 67 | ;Left_Align equ 0 ;00xxxxxx | ||
| 68 | ;Right_Align equ 80h ;10xxxxxx | ||
| 69 | |||
| 70 | Char_Field_Char equ 0 ;a0000000 | ||
| 71 | Char_Field_ASCIIZ equ 00010000B ;a0010000 | ||
| 72 | |||
| 73 | ;Unsgn_Bin_Byte equ 11h ;a0010001 | ||
| 74 | Unsgn_Bin_Word equ 21h ;a0100001 | ||
| 75 | Unsgn_Bin_DWord equ 31h ;a0110001 | ||
| 76 | |||
| 77 | Sgn_Bin_Byte equ 12h ;a0010010 | ||
| 78 | Sgn_Bin_Word equ 22h ;a0100010 | ||
| 79 | Sgn_Bin_DWord equ 32h ;a0110010 | ||
| 80 | |||
| 81 | Bin_Hex_Byte equ 13h ;a0010011 | ||
| 82 | Bin_Hex_Word equ 23h ;a0100011 | ||
| 83 | Bin_Hex_DWord equ 33h ;a0110011 | ||
| 84 | |||
| 85 | |||
| 86 | |||
| 87 | Blank equ " " | ||
| 88 | No_Function equ 0 | ||
| 89 | No_Replace equ 0 | ||
| 90 | |||
| 91 | Msg_Ser_Class equ 0 | ||
| 92 | Ext_Err_Class equ 1 | ||
| 93 | Parse_Error_Class equ 2 | ||
| 94 | Utility_Msg_Class equ 0FFh | ||
| 95 | |||
| 96 | Reserved equ 0 | ||
| 97 | |||
| 98 | Sublist_Length equ TYPE sublist_def | ||
| 99 | |||
| 100 | to_be_filled_in EQU 77H ;conspicious number | ||
| 101 | |||
| 102 | |||
| 103 | |||
| 104 | ; | ||
| 105 | ;***************************************************************************** | ||
| 106 | ; Message Sublist Tables | ||
| 107 | ;***************************************************************************** | ||
| 108 | ; | ||
| 109 | ;The following control blocks are used for messages with | ||
| 110 | ;replaceable paramters. These control blocks are used by the | ||
| 111 | ;SysDispMsg routine. | ||
| 112 | ; | ||
| 113 | |||
| 114 | ;--------------------------- ; | ||
| 115 | first_sublist LABEL BYTE | ||
| 116 | |||
| 117 | sublist_invalid_switch label byte ;AN000;description of %0 | ||
| 118 | sublist_invalid_parameter label byte ;AN000;description of %0 | ||
| 119 | ; | ||
| 120 | db Sublist_Length ;fixed ;AN000; | ||
| 121 | db Reserved ;not used yet ;AN000; | ||
| 122 | offending_parameter_ptr LABEL WORD | ||
| 123 | dw offset offending_parameter ;pointer to string or binary value ;AN000; | ||
| 124 | dw to_be_filled_in ; | ||
| 125 | db 0 ;ID, special end of message format ;AN000; | ||
| 126 | sub_typ db Left_Align+char_field_ASCIIZ ;maybe changed ;AN000; | ||
| 127 | db 0 ;Max width 123, 128-"MODE " ;AN000; | ||
| 128 | db 1 ;May be one char long ;AN000; | ||
| 129 | db Blank ; ;AN000; | ||
| 130 | ;--------------------------- ; | ||
| 131 | |||
| 132 | sublist_err1 label byte ;AN000;description of %0 | ||
| 133 | ; | ||
| 134 | db Sublist_Length ;fixed ;AN000; | ||
| 135 | db Reserved ;not used yet ;AN000; | ||
| 136 | illegal_device_ptr LABEL WORD | ||
| 137 | dw ? ;pointer to device name string filled in by modecom;AN000; | ||
| 138 | dw to_be_filled_in ; | ||
| 139 | db 0 ;ID, special end of message format ;AN000; | ||
| 140 | db Left_Align+char_field_ASCIIZ ; ;AN000; | ||
| 141 | db 5 ;Max width, "LPT1:" ;AN000; | ||
| 142 | db 4 ;"COM3" ;AN000; | ||
| 143 | db Blank ; ;AN000; | ||
| 144 | ;--------------------------- ; | ||
| 145 | Sublist_PT80 label byte ; ;AN000; | ||
| 146 | ; | ||
| 147 | db Sublist_Length ; ;AN000; | ||
| 148 | db Reserved ; ;AN000; | ||
| 149 | dw offset PT80N ;where the printer number is stashed ;AN000; | ||
| 150 | dw to_be_filled_in ; ;AN000; | ||
| 151 | db 1 ;ID, only one sublist ;AN000; | ||
| 152 | db Left_Align+Char_Field_Char ; ;AN000; | ||
| 153 | db 1 ; ;AN000; | ||
| 154 | db 1 ; ;AN000; | ||
| 155 | db Blank ;no filler needed but still have this field to fill | ||
| 156 | ;--------------------------- ; | ||
| 157 | Sublist_PT132 label byte ; ;AN000; | ||
| 158 | ; | ||
| 159 | db Sublist_Length ; ;AN000; | ||
| 160 | db Reserved ; ;AN000; | ||
| 161 | dw offset PT132N ; ;AN000; | ||
| 162 | dw to_be_filled_in ; ;AN000; | ||
| 163 | db 1 ; ;AN000; | ||
| 164 | db Left_Align+Char_Field_Char ; ;AN000; | ||
| 165 | db 1 ; ;AN000; | ||
| 166 | db 1 ; ;AN000; | ||
| 167 | db Blank ; ;AN000; | ||
| 168 | ;--------------------------- ; | ||
| 169 | Sublist_initmsg label byte ;CR,LF,"COM%c: %3s,%c,%c,%c,%c",CR,LF,EOM | ||
| 170 | ; | ||
| 171 | db Sublist_Length ; ;AN000; | ||
| 172 | db Reserved ; ;AN000; | ||
| 173 | dw offset device ; ;AN000; | ||
| 174 | dw to_be_filled_in ; ;AN000; | ||
| 175 | db 1 ;first of 6 ;AN000; | ||
| 176 | db Left_Align+char_field_char ;AN000; | ||
| 177 | db 1 ; ;AN000; | ||
| 178 | db 1 ;one char number between 1 and 4;AN000; | ||
| 179 | db Blank ; ;AN000; | ||
| 180 | |||
| 181 | db Sublist_Length ; ;AN000; | ||
| 182 | db Reserved ; ;AN000; | ||
| 183 | pbaud_ptr label byte | ||
| 184 | dw offset pbaud ; ;AN000; | ||
| 185 | dw to_be_filled_in ; ;AN000; | ||
| 186 | db 2 ;second of 6 ;AN000; | ||
| 187 | db Left_Align+char_field_ASCIIZ ;AN000; | ||
| 188 | db 0;RPS ;19200 ;AN000; | ||
| 189 | db 3 ;110, 300 etc the shortest | ||
| 190 | db Blank ; ;AN000; | ||
| 191 | |||
| 192 | db Sublist_Length ; ;AN000; | ||
| 193 | db Reserved ; ;AN000; | ||
| 194 | pparity_ptr LABEL BYTE ;allow access from invoke | ||
| 195 | dw offset pparity ; ;AN000; | ||
| 196 | dw to_be_filled_in ; ;AN000; | ||
| 197 | db 3 ;third of 6 ;AN000; | ||
| 198 | db Left_Align+char_field_char ;AN000; | ||
| 199 | db 1 ; ;AN000; | ||
| 200 | db 1 ;one char, n, o, e. | ||
| 201 | db Blank ; ;AN000; | ||
| 202 | |||
| 203 | db Sublist_Length ; ;AN000; | ||
| 204 | db Reserved ; ;AN000; | ||
| 205 | dw offset pdata ; ;AN000; | ||
| 206 | dw to_be_filled_in ; ;AN000; | ||
| 207 | db 4 ;fourth of 6 ;AN000; | ||
| 208 | db Left_Align+char_field_char ;AN000; | ||
| 209 | db 1 ; ;AN000; | ||
| 210 | db 1 ;one char number between 6 and 8;AN000; | ||
| 211 | db blank ;never used, will display at least the default data bits | ||
| 212 | |||
| 213 | db Sublist_Length ; ;AN000; | ||
| 214 | db Reserved ; ;AN000; | ||
| 215 | pstop_ptr LABEL BYTE | ||
| 216 | dw offset pstop ; ;AN000; | ||
| 217 | dw to_be_filled_in ; ;AN000; | ||
| 218 | db 5 ;fifth of 6 ;AN000; | ||
| 219 | db Left_Align+char_field_ASCIIZ ;AN000; | ||
| 220 | db 0 ;big enough for "1.5" ;AN000; | ||
| 221 | db 1 ;one char number between 1 and 2;AN000; | ||
| 222 | db Blank ; ;AN000; | ||
| 223 | |||
| 224 | db Sublist_Length ; ;AN000; | ||
| 225 | db Reserved ; ;AN000; | ||
| 226 | dw offset pparm ; ;AN000; | ||
| 227 | dw to_be_filled_in ; ;AN000; | ||
| 228 | db 6 ;last of 6 ;AN000; | ||
| 229 | db Left_Align+char_field_char ;AN000; | ||
| 230 | db 1 ; ;AN000; | ||
| 231 | db 1 ;one char "P" or "-" | ||
| 232 | db Blank ; ;AN000; | ||
| 233 | ;--------------------------- ; | ||
| 234 | Sublist_shift_msg label byte ; ;AN000; | ||
| 235 | ; | ||
| 236 | db Sublist_Length ; ;AN000; | ||
| 237 | db Reserved ; ;AN000; | ||
| 238 | lftm_or_rghtm_ptr label word | ||
| 239 | ;AC001; dw offset leftmost ;filled in with pointer to "leftmost 0?" or "rightmost 9?" | ||
| 240 | dw ? ;AC001;filled in with pointer to "leftmost 0?" or "rightmost 9?" | ||
| 241 | dw to_be_filled_in ; ;AN000; | ||
| 242 | db 1 ;only 1 sub list ;AN000; | ||
| 243 | db Left_Align+char_field_ASCIIZ ;AN000; | ||
| 244 | db 0;RPS ;rightmost 9? ;AN000; | ||
| 245 | db 10 ;leftmost 0? ;AN000; | ||
| 246 | db Blank ; ;AN000; | ||
| 247 | ;--------------------------- ; | ||
| 248 | Sublist_redirmsg label byte ;AN000; CR,LF,"LPT%1: rerouted to COM%2:",CR,LF,EOM | ||
| 249 | ; | ||
| 250 | db Sublist_Length ; ;AN000; | ||
| 251 | db Reserved ; ;AN000; | ||
| 252 | dw Offset REDPT ;filled with printer number | ||
| 253 | dw to_be_filled_in | ||
| 254 | db 1 ;first of 2 ;AN000; | ||
| 255 | db Left_Align+char_field_char ; ;AN000; | ||
| 256 | db 1 ; ;AN000; | ||
| 257 | db 1 | ||
| 258 | db Blank ; ;AN000; | ||
| 259 | |||
| 260 | db Sublist_Length ; ;AN000; | ||
| 261 | db Reserved ; ;AN000; | ||
| 262 | dw Offset REDCOM ;filled with COM port number | ||
| 263 | dw to_be_filled_in | ||
| 264 | db 2 ;second of 2 ;AN000; | ||
| 265 | db Left_Align+char_field_char ; ;AN000; | ||
| 266 | db 1 ; ;AN000; | ||
| 267 | db 1 | ||
| 268 | db Blank ; ;AN000; | ||
| 269 | |||
| 270 | ;--------------------------- ; | ||
| 271 | Sublist_notremsg label byte ;AN000; CR,LF,"LPT%1: not rerouted",CR,LF,EOM | ||
| 272 | ; | ||
| 273 | db Sublist_Length ; ;AN000; | ||
| 274 | db Reserved ; ;AN000; | ||
| 275 | dw Offset NOTREDPT ;filled with printer number | ||
| 276 | dw to_be_filled_in | ||
| 277 | db 1 ;only one | ||
| 278 | db Left_Align+char_field_char ; ;AN000; | ||
| 279 | db 1 ; ;AN000; | ||
| 280 | db 1 | ||
| 281 | db Blank ; ;AN000; | ||
| 282 | |||
| 283 | ;--------------------------- ; | ||
| 284 | Sublist_retparto label byte ; ;AN000; | ||
| 285 | ; | ||
| 286 | db Sublist_Length ; ;AN000; | ||
| 287 | db Reserved ; ;AN000; | ||
| 288 | ;AC001;inf_or_no_ptr LABEL WORD ;filled in with pointer to "No" or "infinit" | ||
| 289 | ;AC001; dw offset infinite ; ;AN000; | ||
| 290 | dw ? ;AC001;filled in with pointer to "No" or "infinit" | ||
| 291 | dw to_be_filled_in ; ;AN000; | ||
| 292 | db 1 ; ;AN000; | ||
| 293 | db Left_Align+Char_Field_ASCIIZ ;AN000; | ||
| 294 | db 0;RPS ; ;AN000; | ||
| 295 | db 2 ; ;AN000; | ||
| 296 | db Blank ; ;AN000; | ||
| 297 | ;--------------------------- ; | ||
| 298 | Sublist_cant_shift label byte ;"Unable to shift screen ...." ;AN000; | ||
| 299 | ; | ||
| 300 | db Sublist_Length ; ;AN000; | ||
| 301 | db Reserved ; ;AN000; | ||
| 302 | LEFT_OR_RIGHT_PTR LABEL WORD ;AN000; | ||
| 303 | ;AC001; dw offset left ;FILLED WITH OFFSET OF 'left' or 'right' | ||
| 304 | dw ? ;AC001;FILLED WITH OFFSET OF 'left' or 'right' | ||
| 305 | dw to_be_filled_in ; ;AN000; | ||
| 306 | db 1 ; ;AN000; | ||
| 307 | db Left_Align+Char_Field_ASCIIZ ;AN000; | ||
| 308 | db 0;RPS ; ;AN000; | ||
| 309 | db 4 ; ;AN000; | ||
| 310 | db Blank ; ;AN000; | ||
| 311 | ;--------------------------- ; | ||
| 312 | Sublist_CPMSG2 label byte ; ;AN000; | ||
| 313 | ; | ||
| 314 | db Sublist_Length ; ;AN000; | ||
| 315 | db Reserved ; ;AN000; | ||
| 316 | CPMSGLST2DEV LABEL WORD ;filled with pointer to device name | ||
| 317 | dw ? | ||
| 318 | dw to_be_filled_in ; ;AN000; | ||
| 319 | db 1 ; ;AN000; | ||
| 320 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 321 | db 0 ; ;AN000; | ||
| 322 | db 3 ; ;AN000; | ||
| 323 | db Blank ; ;AN000; | ||
| 324 | |||
| 325 | ;--------------------------- ; | ||
| 326 | Sublist_CPMSG6 label byte ;"Active codepage for device %S is %D",CR,LF,EOM | ||
| 327 | ; | ||
| 328 | db Sublist_Length ; ;AN000; | ||
| 329 | db Reserved ; ;AN000; | ||
| 330 | CPMSGLST6DEV LABEL WORD ;filled with pointer to device name | ||
| 331 | dw ? | ||
| 332 | dw to_be_filled_in ; ;AN000; | ||
| 333 | db 1 ; ;AN000; | ||
| 334 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 335 | db 0 ; ;AN000; | ||
| 336 | db 3 ; ;AN000; | ||
| 337 | db Blank ; ;AN000; | ||
| 338 | |||
| 339 | db Sublist_Length ; ;AN000; | ||
| 340 | db Reserved ; ;AN000; | ||
| 341 | dw OFFSET CPMSGLST6CP ;pointer to area FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 342 | dw to_be_filled_in ; ;AN000; | ||
| 343 | db 2 ;2nd of 2 ;AN000; | ||
| 344 | db Left_Align+Unsgn_Bin_Word ;AN000;00100001B | ||
| 345 | db 5 ;codepage numbers could be 5 digits long | ||
| 346 | db 1 ;theoretically could be 1 digit ;AN000; | ||
| 347 | db Blank ; ;AN000; | ||
| 348 | |||
| 349 | ;--------------------------- ; | ||
| 350 | Sublist_CPMSG7 label byte ;"Device %1 not prepared",CR,LF,EOM | ||
| 351 | ; | ||
| 352 | db Sublist_Length ; ;AN000; | ||
| 353 | db Reserved ; ;AN000; | ||
| 354 | CPMSGLST7DEV LABEL WORD ;FILLED IN BY "QUERY" ROUTINE WITH PTR TO DEVICE NAME | ||
| 355 | dw ? | ||
| 356 | dw to_be_filled_in ; ;AN000; | ||
| 357 | db 1 ; ;AN000; | ||
| 358 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 359 | db 0 ;don't know how long the device name | ||
| 360 | db 3 ; ;AN000; | ||
| 361 | db Blank ; ;AN000; | ||
| 362 | |||
| 363 | ;--------------------------- ; | ||
| 364 | Sublist_CPMSG8 label byte ;"%1 codepages:",CR,LF,EOM | ||
| 365 | ; | ||
| 366 | db Sublist_Length ; ;AN000; | ||
| 367 | db Reserved ; ;AN000; | ||
| 368 | dw ? ;filled in with OFFSET TO "HARDWARE" OR "PREPARED" | ||
| 369 | dw to_be_filled_in ; ;AN000; | ||
| 370 | db 1 ; ;AN000; | ||
| 371 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 372 | db 0;RPS ; both "Hardware" and ;AC001; | ||
| 373 | db 8 ; "Prepared" are 8 chars long ;AC001; | ||
| 374 | db Blank ; ;AN000; | ||
| 375 | |||
| 376 | |||
| 377 | ;--------------------------- ; | ||
| 378 | Sublist_CPMSG9 label byte ;" Codepage %d",CR,LF,EOM | ||
| 379 | |||
| 380 | db Sublist_Length ; ;AN000; | ||
| 381 | db Reserved ; ;AN000; | ||
| 382 | dw OFFSET CPMSGLST9CP ;pointer to area filled in by "DISPLAY_CPID" in modecp.sal | ||
| 383 | dw to_be_filled_in ; ;AN000; | ||
| 384 | db 1 ; ;AN000; | ||
| 385 | db Left_Align+Unsgn_Bin_Word ;00100001B | ||
| 386 | db 3 | ||
| 387 | db 3 ; ;AN000; | ||
| 388 | db Blank ; ;AN000; | ||
| 389 | |||
| 390 | ;--------------------------- ; | ||
| 391 | Sublist_CPMSG10 label byte ;"MODE %1 Codepage function completed",CR,LF,EOM | ||
| 392 | db Sublist_Length ; ;AN000; | ||
| 393 | db Reserved ; ;AN000; | ||
| 394 | dw ? ;;FILLED IN TO POINT TO: | ||
| 395 | ; "Status",EOM | ||
| 396 | ; "Prepare",EOM | ||
| 397 | ; "Select",EOM | ||
| 398 | ; "Refresh",EOM | ||
| 399 | ; "Global",EOM | ||
| 400 | dw to_be_filled_in ; ;AN000; | ||
| 401 | db 1 ; ;AN000; | ||
| 402 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 403 | db 0;RPS | ||
| 404 | db 5 ; ;AN000; | ||
| 405 | db Blank ; ;AN000; | ||
| 406 | |||
| 407 | ;--------------------------- ; | ||
| 408 | Sublist_CPMSG13 label byte ;" %D - %S Codepage",CR,LF,EOM | ||
| 409 | ; | ||
| 410 | db Sublist_Length ; ;AN000; | ||
| 411 | db Reserved ; ;AN000; | ||
| 412 | CPMSGLST13CP LABEL WORD ;FILLED IN WITH CODEPAGE ID | ||
| 413 | dw ? | ||
| 414 | dw to_be_filled_in ; ;AN000; | ||
| 415 | db 1 ; ;AN000; | ||
| 416 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 417 | db 0;RPS ; ;AN000; | ||
| 418 | db 3 ; ;AN000; | ||
| 419 | db Blank ; ;AN000; | ||
| 420 | |||
| 421 | db Sublist_Length ; ;AN000; | ||
| 422 | db Reserved ; ;AN000; | ||
| 423 | CPMSGLST13TYP LABEL WORD ;FILLED IN TO POINT TO: | ||
| 424 | ; "Selected",EOM | ||
| 425 | ; "System",EOM | ||
| 426 | dw ? | ||
| 427 | dw to_be_filled_in ; ;AN000; | ||
| 428 | db 2 ;2nd of 2 ;AN000; | ||
| 429 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 430 | db 0;RPS ;all codepage numbers are 3 chars long | ||
| 431 | db 6 ; ;AN000; | ||
| 432 | db Blank ; ;AN000; | ||
| 433 | |||
| 434 | |||
| 435 | ;--------------------------- ; | ||
| 436 | Sublist_CPMSG17 label byte ;"Device error during %1",BEEP,CR,LF,EOM | ||
| 437 | db Sublist_Length ; ;AN000; | ||
| 438 | db Reserved ; ;AN000; | ||
| 439 | dw ? ;;FILLED IN TO POINT TO: | ||
| 440 | ; "Status",EOM | ||
| 441 | ; "Prepare",EOM | ||
| 442 | ; "Select",EOM | ||
| 443 | ; "Refresh",EOM | ||
| 444 | ; "write of font file to device",EOM | ||
| 445 | dw to_be_filled_in | ||
| 446 | db 1 ; ;AN000; | ||
| 447 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 448 | db 0;RPS ;"write of font file to device",EOM | ||
| 449 | db 6 ;"Status",EOM | ||
| 450 | db Blank ; ;AN000; | ||
| 451 | |||
| 452 | |||
| 453 | ;--------------------------- ; | ||
| 454 | Sublist_LINES_equal label byte ;"LINES=%1",CR,LF,EOM | ||
| 455 | db Sublist_Length ; ;AN000; | ||
| 456 | db Reserved ; ;AN000; | ||
| 457 | ROW_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a row value | ||
| 458 | dw ? ; | ||
| 459 | dw to_be_filled_in ;filled in at initialization time with PRINTF_CODE | ||
| 460 | db 1 ; ;AN000; | ||
| 461 | row_type db Right_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 462 | db 0;RPS ;"NONE" | ||
| 463 | db 2 ;25, 43, 50 ;AN000; | ||
| 464 | DB blank | ||
| 465 | |||
| 466 | ;--------------------------- ; | ||
| 467 | Sublist_COLUMNS_equal label byte ;"COLUMNS=%1",CR,LF,EOM | ||
| 468 | db Sublist_Length ; ;AN000; | ||
| 469 | db Reserved ; ;AN000; | ||
| 470 | COLUMNS_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a columns value | ||
| 471 | dw ? ; | ||
| 472 | dw to_be_filled_in ; ;AN000; | ||
| 473 | db 1 ; ;AN000; | ||
| 474 | COLUMNS_type db Right_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 475 | db 0;RPS | ||
| 476 | db 2 ; ;AN000; | ||
| 477 | DB blank | ||
| 478 | ;--------------------------- ; | ||
| 479 | Sublist_RATE_equal label byte ;"RATE=%1",CR,LF,EOM | ||
| 480 | db Sublist_Length ; ;AN000; | ||
| 481 | db Reserved ; ;AN000; | ||
| 482 | RATE_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a rate value | ||
| 483 | dw ? ; | ||
| 484 | dw to_be_filled_in ; ;AN000; | ||
| 485 | db 1 ; ;AN000; | ||
| 486 | RATE_type db Right_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 487 | db 0;RPS | ||
| 488 | db 2 ; ;AN000; | ||
| 489 | DB blank | ||
| 490 | ;--------------------------- ; | ||
| 491 | Sublist_DELAY_equal label byte ;"DELAY=%1",CR,LF,EOM | ||
| 492 | db Sublist_Length ; ;AN000; | ||
| 493 | db Reserved ; ;AN000; | ||
| 494 | DELAY_PTR LABEL WORD ;FILLED IN TO POINT TO: "NONE", or a delay value | ||
| 495 | dw ? ; | ||
| 496 | dw to_be_filled_in ; ;AN000; | ||
| 497 | db 1 ; ;AN000; | ||
| 498 | DELAY_type db Right_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 499 | db 0;RPS | ||
| 500 | db 1 ; ;AN000; | ||
| 501 | DB blank | ||
| 502 | ;--------------------------- ; | ||
| 503 | Sublist_not_supported label byte ;"Function not supported on this computer -%1" | ||
| 504 | db Sublist_Length ; ;AN000; | ||
| 505 | db Reserved ; ;AN000; | ||
| 506 | not_supported_PTR LABEL WORD ;FILLED IN TO POINT TO: the parameter that is not supported | ||
| 507 | dw OFFSET nada ; | ||
| 508 | dw to_be_filled_in ;filled with segment of the .COM file ;AN000; | ||
| 509 | db 1 ; ;AN000; | ||
| 510 | db Left_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 511 | db 0;RPS ;AC002;maximum length of the string | ||
| 512 | db 1 ; ;AN000; | ||
| 513 | DB blank | ||
| 514 | ;--------------------------- ; | ||
| 515 | Sublist_status_for_device label byte ;"Status for device %1:" | ||
| 516 | db Sublist_Length ; ;AN000; | ||
| 517 | db Reserved ; ;AN000; | ||
| 518 | stat_dev_ptr LABEL WORD ;FILLED IN TO POINT TO ONE of the device names in parse.asm | ||
| 519 | dw ? ; | ||
| 520 | dw to_be_filled_in ; ;AN000; | ||
| 521 | db 1 ; ;AN000; | ||
| 522 | db Right_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 523 | dev_name_size db 4 ;changed by invoke: 3 for CON, 4 for others | ||
| 524 | db 3 ; ;AN000; | ||
| 525 | db Blank ; ;AN000; | ||
| 526 | |||
| 527 | ;--------------------------- ; | ||
| 528 | |||
| 529 | Sublist_retry_equal label byte ;"RETRY=%1" | ||
| 530 | db Sublist_Length ; ;AN000; | ||
| 531 | db Reserved ; ;AN000; | ||
| 532 | retry_type_ptr LABEL BYTE | ||
| 533 | dw ? ; | ||
| 534 | dw to_be_filled_in ; ;AN000; | ||
| 535 | db 1 ; ;AN000; | ||
| 536 | db Right_Align+Char_Field_ASCIIZ ; ;AN000; | ||
| 537 | db 0;RPS ;max size, "NONE" | ||
| 538 | db 1 ;min size, "E" ;AN000; | ||
| 539 | db Blank ; ;AN000; | ||
| 540 | |||
| 541 | ;--------------------------- ; | ||
| 542 | sublist_syntax_error label byte ;AN000;description of %0 | ||
| 543 | ; | ||
| 544 | db Sublist_Length ;fixed ;AN000; | ||
| 545 | db Reserved ;not used yet ;AN000; | ||
| 546 | syntax_error_ptr LABEL WORD | ||
| 547 | dw offset offending_parameter ;pointer to string or binary value ;AN000; | ||
| 548 | dw to_be_filled_in ; | ||
| 549 | db 0 ;ID, special end of message format ;AN000; | ||
| 550 | db Left_Align+char_field_ASCIIZ ;AN000; | ||
| 551 | db 0 ;Max width 123, 128-"MODE " ;AN000; | ||
| 552 | db 1 ;May be one char long ;AN000; | ||
| 553 | db Blank ; ;AN000; | ||
| 554 | |||
| 555 | |||
| 556 | |||
| 557 | |||
| 558 | |||
| 559 | |||
| 560 | |||
| 561 | Number_of_sublists EQU (($ - first_sublist) / (TYPE sublist_def)) | ||
| 562 | |||
| 563 | |||
| 564 | |||
| 565 | ; MESSAGE PIECES | ||
| 566 | ;------------------------------------------------------- | ||
| 567 | |||
| 568 | PT80N DB " " ;PT80 - CR,LF,"LPT%c: set for 80",CR,LF,EOM | ||
| 569 | |||
| 570 | PT132N DB " " ;PT132 - CR,LF,"LPT%c: set for 132",CR,LF,EOM | ||
| 571 | |||
| 572 | ;INITMSG - CR,LF,"COM%c: %3s,%c,%c,%c,%c",CR,LF,EOM | ||
| 573 | DEVICE DB " " | ||
| 574 | pBAUD DB 5 DUP(" "),EOM | ||
| 575 | pPARITY DB "e" ;DEFAULT IS EVEN PARITY | ||
| 576 | pDATA DB "7" ;DEFAULT IS 7 DATA BITS PER BYTE | ||
| 577 | pSTOP DB "1",EOM ;DEFAULT FOR BAUD > 110, CHANGED TO 2 FOR 110 | ||
| 578 | Pparm DB " " | ||
| 579 | baud_19200 DB "19200",EOM | ||
| 580 | |||
| 581 | ;REDIRMSG - CR,LF,"LPT%c: rerouted to COM%c:",CR,LF,EOM | ||
| 582 | REDPT DB " " | ||
| 583 | REDCOM DB " " | ||
| 584 | |||
| 585 | ;NOTREMSG - CR,LF,"LPT%c: not rerouted",CR,LF,EOM | ||
| 586 | NOTREDPT DB " " | ||
| 587 | |||
| 588 | OFFENDING_PARAMETER DB 123 DUP (EOM) | ||
| 589 | |||
| 590 | nada DB 8,8,8," ",0 ;backspace over the " - " | ||
| 591 | |||
| 592 | CPMSGLST6CP DW 44H ;AC665;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 593 | |||
| 594 | |||
| 595 | CPMSGLST9CP DW 99H ;FILLED IN BY "QUERY" ROUTINE WITH CODEPAGE ID | ||
| 596 | |||
| 597 | |||
| 598 | row_value DB ? ;filled in by invoke.asm with screen lines requested or current setting | ||
diff --git a/v4.0/src/CMD/MODE/MODEVID.ASM b/v4.0/src/CMD/MODE/MODEVID.ASM new file mode 100644 index 0000000..360a110 --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEVID.ASM | |||
| @@ -0,0 +1,614 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODEVID.SAL | ||
| 3 | |||
| 4 | .XLIST | ||
| 5 | INCLUDE STRUC.INC ;macro library for 'struc' | ||
| 6 | .LIST | ||
| 7 | |||
| 8 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 9 | ;º º ;AN000; | ||
| 10 | ;AN000; | ||
| 11 | ; AC000 - P3200: Was displaying a message that Sam Nunn had deleted from the | ||
| 12 | ; USA.MSG file because it looked like a common message. Now | ||
| 13 | ; I use a different (better) message. It was "Invalid paramters", | ||
| 14 | ; is now "Function not supported - ????". | ||
| 15 | |||
| 16 | ;º º ;AN000; | ||
| 17 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 18 | ;AN000; | ||
| 19 | SIGNITURE SEGMENT AT 0C000H | ||
| 20 | ORG 0 | ||
| 21 | SIGWORD DW ? ;SIGNITURE OF THE EGA IS STORED HERE IF THE CARD IS PRESENT | ||
| 22 | SIGNITURE ENDS | ||
| 23 | |||
| 24 | |||
| 25 | LOW_MEM SEGMENT AT 0 | ||
| 26 | ORG 410H | ||
| 27 | EQUIP_FLAG EQU THIS WORD | ||
| 28 | LOW_MEM ENDS | ||
| 29 | |||
| 30 | |||
| 31 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 32 | ;º º | ||
| 33 | |||
| 34 | |||
| 35 | DISPLAY MACRO MSG | ||
| 36 | MOV DX,OFFSET MSG | ||
| 37 | CALL PRINTF | ||
| 38 | ENDM | ||
| 39 | |||
| 40 | |||
| 41 | ;------------------------------------------------------------------------------- | ||
| 42 | |||
| 43 | |||
| 44 | find_number MACRO num, list | ||
| 45 | |||
| 46 | ;Purpose: See if num is in the list of numbers. | ||
| 47 | |||
| 48 | ;Input: num - number to be checked | ||
| 49 | ; list - label of list to scan | ||
| 50 | ; list_len - length of the list to scan. This name is built from the | ||
| 51 | ; label 'list' that is input. | ||
| 52 | |||
| 53 | ;Output: zero flag set if the number is found in 'list' | ||
| 54 | |||
| 55 | ;Assumption: A label of the name list_len exists and is in segment addressed by | ||
| 56 | ; DS, where 'list' is the label passed in. ES and DS are the same. | ||
| 57 | |||
| 58 | ;Side effects: The direction flag is cleared. | ||
| 59 | |||
| 60 | PUSH DI | ||
| 61 | PUSH CX | ||
| 62 | |||
| 63 | MOV AL,num | ||
| 64 | MOV DI,OFFSET list | ||
| 65 | CLD ;want to increment DI | ||
| 66 | MOV CX,list&_len ;CX=number of nums in the list | ||
| 67 | REPNE SCASB | ||
| 68 | |||
| 69 | POP CX | ||
| 70 | POP DI | ||
| 71 | |||
| 72 | ENDM | ||
| 73 | |||
| 74 | ;------------------------------------------------------------------------------- | ||
| 75 | |||
| 76 | |||
| 77 | SET_CURSOR_POS MACRO | ||
| 78 | MOV AH,2 ;SET CURSOR | ||
| 79 | MOV DX,0 ;ROW=0,COL=0 | ||
| 80 | MOV BH,0 ;SELECT SCREEN 0 | ||
| 81 | INT 10H | ||
| 82 | |||
| 83 | ENDM | ||
| 84 | |||
| 85 | MODE_VIDEO MACRO OPTION | ||
| 86 | MOV AH,0 ;SET MODE | ||
| 87 | MOV AL,OPTION | ||
| 88 | INT 10H | ||
| 89 | |||
| 90 | ENDM | ||
| 91 | |||
| 92 | SET_CURSOR_TYPE MACRO | ||
| 93 | MOV AH,1 ;SET CURSOR TYPE | ||
| 94 | MOV CX,CURSOR_TYPE ;ROW=0,COL=0 | ||
| 95 | INT 10H | ||
| 96 | |||
| 97 | ENDM | ||
| 98 | |||
| 99 | ;º º | ||
| 100 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 101 | |||
| 102 | |||
| 103 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 104 | ;º º | ||
| 105 | |||
| 106 | B EQU 0 ;POSITION OF "B" IN PARM1 FOR BW?0 | ||
| 107 | W EQU 1 ;POSITION OF "W" IN PARM1 FOR BW?0 | ||
| 108 | C EQU 0 ;POSITION OF "C" IN PARM1 FOR CO?0 | ||
| 109 | O EQU 1 ;POSITION OF "O" IN PARM1 FOR CO?0 | ||
| 110 | M EQU 0 ;POSITION OF "M" IN PARM1 FOR MONO | ||
| 111 | N EQU 2 ;POSITION OF "N" IN PARM1 FOR MONO | ||
| 112 | OH EQU 3 ;POSITION OF SECOND "O" IN PARM1 FOR MONO | ||
| 113 | |||
| 114 | all EQU 0FEH ;descreet value representing adapter/monitor that can be in mono and color | ||
| 115 | ALT_SELECT EQU 12H ;ALTERNATE SELECT FUNCTION OF INT10 | ||
| 116 | AMOAMA EQU 01 ;map to check 'all modes on all monitors active' bit of misc state info byte | ||
| 117 | bw7 EQU 7 ;another mono (emulation) mode (VGA with analog monochrome) | ||
| 118 | bw0B EQU 0BH ;analog black and white on a PALACE | ||
| 119 | cga EQU 02 ;plain color card | ||
| 120 | COLOR_CURSOR_TYPE EQU 0607H ;CURSOR TYPE FOR ALL COLOR AND BW MODES | ||
| 121 | color6 EQU 6 ;another color supporting combination (PGA with color display) | ||
| 122 | color8 EQU 8 ;another color supporting combination | ||
| 123 | colorA EQU 0AH ;yet another color combo (color display or ehnanced color display on PALACE) | ||
| 124 | colorC EQU 0CH ;even another color combo (PALACE with analog color) | ||
| 125 | ega_color EQU 4 ;value for color support of EGA | ||
| 126 | EGA_INFO EQU 10H ;RETURN EGA INFORMATION OPTION OF ALT. SELECT FUNCTION OF INT10 | ||
| 127 | EGA_MONO EQU 05H | ||
| 128 | EGA_SIG EQU 0AA55H ;SIGNITURE FOR EGA CARD | ||
| 129 | EMPTY EQU 0 ;THE REMAINING 6 CHARACTERS OF PARM1 SHOULD BE 0 | ||
| 130 | FALSE EQU 0 | ||
| 131 | get_sys_stat EQU 43H ;get system status function of INT 15H | ||
| 132 | LCD_attached EQU 00000000B ;bit 0=0 if the LCD is attached | ||
| 133 | LCD_bit EQU 00000001B ;mask to check the LCD attached bit of status byte | ||
| 134 | LOWERCASE EQU 20H ;OR THIS TO UPPER/LOWER CASE TO ASSURE LOWERCASE | ||
| 135 | mono_card EQU 1 ;BIOS INT 10 AH=1B representation of plain mono card | ||
| 136 | MONO_CURSOR_TYPE EQU 0B0CH | ||
| 137 | MONO_ON_IT EQU 1 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF MONO IN EFFECT | ||
| 138 | OPTION_BW4025 EQU 0 ;40 X 25 BW | ||
| 139 | OPTION_CO4025 EQU 1 ;40 X 25 COLOR | ||
| 140 | OPTION_BW8025 EQU 2 ;80 X 25 BW | ||
| 141 | OPTION_CO8025 EQU 3 ;80 X 25 COLOR | ||
| 142 | OPTION_MONO EQU 7 ;monochrome | ||
| 143 | parm_list EQU [BP] ;addressing for array of parsed parameters in form "parm_list_entry" | ||
| 144 | |||
| 145 | COLOR_ON_IT EQU 0 ;VALUE RETURNED FROM EGA INFORMATION IN BH IF COLOR IN EFFECT | ||
| 146 | BITBW40 EQU 10H ;40X25 BW USING COLOR CARD | ||
| 147 | BITBW80 EQU 20H ;80X25 BW USING COLOR CARD | ||
| 148 | BITMONO EQU 30H ;80X25 BW CARD | ||
| 149 | video_info_DI EQU [DI] | ||
| 150 | |||
| 151 | ;º º | ||
| 152 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 153 | |||
| 154 | |||
| 155 | |||
| 156 | |||
| 157 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 158 | ;º º | ||
| 159 | |||
| 160 | PUBLIC ALT_SELECT | ||
| 161 | PUBLIC BW40 | ||
| 162 | PUBLIC BW80 | ||
| 163 | PUBLIC CHECK_BUFF | ||
| 164 | PUBLIC CO40 | ||
| 165 | PUBLIC CO80 | ||
| 166 | PUBLIC COLOR_ON_IT | ||
| 167 | PUBLIC EGA_INFO | ||
| 168 | PUBLIC GET_VIDEO_INFO | ||
| 169 | PUBLIC MONO | ||
| 170 | |||
| 171 | ;º º | ||
| 172 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 173 | |||
| 174 | |||
| 175 | |||
| 176 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 177 | ;º º | ||
| 178 | |||
| 179 | INCLUDE common.stc ;definition of the following struc | ||
| 180 | |||
| 181 | ;parm_list_entry STRUC ;used by parse_parameters and invoke | ||
| 182 | ; | ||
| 183 | ;parm_type DB bogus | ||
| 184 | ;item_tag DB 0FFH | ||
| 185 | ;value1 DW bogus ;used only for filespecs and code page numbers | ||
| 186 | ;value2 DW bogus ;used only for filespecs and code page numbers | ||
| 187 | ;keyword_switch_ptr DW 0 | ||
| 188 | ; | ||
| 189 | ;parm_list_entry ENDS | ||
| 190 | |||
| 191 | |||
| 192 | info_block STRUC ;layout of info returned by INT 10 AH=1B | ||
| 193 | who_cares1 DB 025H DUP ("V") | ||
| 194 | active_display DB "V" | ||
| 195 | alternate_display DB "V" | ||
| 196 | who_cares2 DB 6 DUP ("V") | ||
| 197 | misc_state_info DB "V" | ||
| 198 | who_cares3 DB 12H DUP ("V") | ||
| 199 | info_block ENDS | ||
| 200 | |||
| 201 | |||
| 202 | ;º º | ||
| 203 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 204 | |||
| 205 | |||
| 206 | |||
| 207 | |||
| 208 | ;THE FOLLOWING 'RECORD' STATEMENT DEFINES THE BITS BITS OF THE EQUIPMENT FLAG: | ||
| 209 | ;BIT 15,14 = NUMBER OF PRINTERS ATTACHED | ||
| 210 | ;BIT 13 = NOT USED | ||
| 211 | ;BIT 12 = GAME I/O ATTACHED | ||
| 212 | ;BIT 11-9 = NUMBER OF RS232 CARDS ATTACHED | ||
| 213 | ;BIT 8 = UNUSED | ||
| 214 | ;BIT 7,6 = NUMBER OF DISKETTE DRIVES | ||
| 215 | ;BIT 5,4 = INITIAL VIDEO MODE: | ||
| 216 | ; 00-UNUSED | ||
| 217 | ; 01-40X25 BW USING COLOR CARD | ||
| 218 | ; 10-80X25 BW USING COLOR CARD | ||
| 219 | ; 11-80X25 BW USING BW CARD | ||
| 220 | ;BIT 3,2 = PLANAR RAM SIZE (00=16K, 01=32K, 10=48K, 11=64K) | ||
| 221 | ;BIT 1 = NOT USED | ||
| 222 | ;BIT 0 = IPL FROM DISKETTE | ||
| 223 | FLAG RECORD PR:2,NA1:1,GAME:1,COMN:3,NA2:1,DISKD:2,VIDEO:2,RAM:2,NA3:1,IPL:1 | ||
| 224 | ;DEFINITION OF ABOVE VIDEO BITS: | ||
| 225 | |||
| 226 | |||
| 227 | |||
| 228 | PAGE | ||
| 229 | PRINTF_CODE SEGMENT PUBLIC | ||
| 230 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE | ||
| 231 | |||
| 232 | |||
| 233 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 234 | ;º º | ||
| 235 | |||
| 236 | color_combos label byte ;list of adapter/display combinations supporting color modes | ||
| 237 | DB bw0B | ||
| 238 | DB color6 | ||
| 239 | DB color8 | ||
| 240 | DB colorA | ||
| 241 | DB colorC | ||
| 242 | DB cga | ||
| 243 | DB ega_color | ||
| 244 | color_combos_len EQU $ - color_combos | ||
| 245 | |||
| 246 | CURSOR_TYPE DW 0607H ;HOLDER OF APPROPRIATE CURSOR TYPE | ||
| 247 | information_block info_block <> ;area to hold info returned from INT 10 AH=1B | ||
| 248 | |||
| 249 | mono_combos label byte | ||
| 250 | DB mono_card | ||
| 251 | DB ega_mono | ||
| 252 | DB bw7 | ||
| 253 | mono_combos_len EQU $ - mono_combos | ||
| 254 | |||
| 255 | ;º º | ||
| 256 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 257 | |||
| 258 | |||
| 259 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 260 | ;º º | ||
| 261 | |||
| 262 | EXTRN Function_not_supported:WORD ;'INVALID PARAMETERS' | ||
| 263 | EXTRN NOERROR:BYTE ;INDICATE THAT NO ERROR MESSAGES HAVE BEEN ISSUED YET | ||
| 264 | EXTRN not_supported_ptr:WORD ;pointer to the screen mode that the configuration can't do. | ||
| 265 | EXTRN machine_type:BYTE ;holder of model byte | ||
| 266 | EXTRN parm_lst:BYTE ;the array of the structure parm_list_entry max_pos_parms DUP (<>) | ||
| 267 | EXTRN PRINTF:NEAR ;"C" LIKE FORMATTED SCREEN OUTPUT ROUTINE | ||
| 268 | EXTRN PARM1:BYTE ;PARAMETER HOLDING AREA, SEE "RESCODE" | ||
| 269 | EXTRN P14_model_byte:ABS | ||
| 270 | |||
| 271 | ;º º | ||
| 272 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 273 | |||
| 274 | |||
| 275 | |||
| 276 | ;*********************************************************** | ||
| 277 | ;SET VIDEO TO 40 X 25, BLACK AND WHITE | ||
| 278 | BW40 PROC NEAR | ||
| 279 | |||
| 280 | CALL get_video_info | ||
| 281 | .IF <video_info_DI.active_display EQ all> OR | ||
| 282 | find_number <video_info_DI.active_display>,color_combos | ||
| 283 | .IF Z OR | ||
| 284 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 285 | .IF Z THEN | ||
| 286 | |||
| 287 | MOV DL,BITBW40 ;SET FOR BW 40 X 80 | ||
| 288 | MOV DH,OPTION_BW4025 | ||
| 289 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 290 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 291 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 292 | CALL setup | ||
| 293 | |||
| 294 | .ELSE | ||
| 295 | |||
| 296 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 297 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 298 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 299 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 300 | DISPLAY Function_not_supported ;'Function not supported - BW40" | ||
| 301 | MOV NOERROR,FALSE | ||
| 302 | |||
| 303 | .ENDIF | ||
| 304 | |||
| 305 | RET ;RETURN TO MAIN ROUTINE | ||
| 306 | BW40 ENDP | ||
| 307 | ;****************************************************** | ||
| 308 | ;SET VIDEO TO 80 X 25, BLACK AND WHITE | ||
| 309 | BW80 PROC NEAR | ||
| 310 | |||
| 311 | CALL get_video_info | ||
| 312 | .IF <video_info_DI.active_display EQ all> OR | ||
| 313 | find_number <video_info_DI.active_display>,color_combos | ||
| 314 | .IF Z OR | ||
| 315 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 316 | .IF Z THEN | ||
| 317 | |||
| 318 | MOV DL,BITBW80 ;80 X 25 BW USING GRAPHICS CARD | ||
| 319 | MOV DH,OPTION_BW8025 | ||
| 320 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 321 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 322 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 323 | CALL setup | ||
| 324 | |||
| 325 | .ELSE | ||
| 326 | |||
| 327 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 328 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 329 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 330 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 331 | DISPLAY Function_not_supported ;'Function not supported - BW80" | ||
| 332 | MOV NOERROR,FALSE | ||
| 333 | |||
| 334 | .ENDIF | ||
| 335 | |||
| 336 | RET | ||
| 337 | BW80 ENDP | ||
| 338 | ;****************************************************** | ||
| 339 | ;SET VIDEO TO 80 X 25, MONOCHROME | ||
| 340 | MONO PROC NEAR | ||
| 341 | |||
| 342 | CALL get_video_info | ||
| 343 | .IF <video_info_DI.active_display EQ all> OR | ||
| 344 | find_number <video_info_DI.active_display>,mono_combos | ||
| 345 | .IF Z OR | ||
| 346 | find_number <video_info_DI.alternate_display>,mono_combos | ||
| 347 | .IF Z THEN | ||
| 348 | |||
| 349 | MOV DL,BITMONO ;EQUIP FLAG INDICATING 80 X 25 BW USING MONO CARD | ||
| 350 | MOV DH,OPTION_MONO ;MONOCHROME MODE | ||
| 351 | MOV CURSOR_TYPE,MONO_CURSOR_TYPE | ||
| 352 | |||
| 353 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 354 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 355 | CALL SETUP | ||
| 356 | |||
| 357 | .ELSE | ||
| 358 | |||
| 359 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 360 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 361 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 362 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 363 | DISPLAY Function_not_supported ;'Function not supported - MONO" | ||
| 364 | MOV NOERROR,FALSE | ||
| 365 | |||
| 366 | .ENDIF | ||
| 367 | |||
| 368 | RET ;RETURN TO MAIN ROUTINE | ||
| 369 | MONO ENDP | ||
| 370 | ;******************************************************* | ||
| 371 | CO40 PROC NEAR | ||
| 372 | |||
| 373 | CALL get_video_info | ||
| 374 | .IF <video_info_DI.active_display EQ all> OR | ||
| 375 | find_number <video_info_DI.active_display>,color_combos | ||
| 376 | .IF Z OR | ||
| 377 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 378 | .IF Z THEN | ||
| 379 | |||
| 380 | MOV DL,BITBW40 ;40 X 25 USING COLOR CARD | ||
| 381 | MOV DH,OPTION_CO4025 ; REQUEST COLOR | ||
| 382 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 383 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 384 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 385 | CALL setup | ||
| 386 | |||
| 387 | .ELSE | ||
| 388 | |||
| 389 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 390 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 391 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 392 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 393 | DISPLAY Function_not_supported ;'Function not supported - CO40" | ||
| 394 | MOV NOERROR,FALSE | ||
| 395 | |||
| 396 | .ENDIF | ||
| 397 | |||
| 398 | RET ;RETURN TO MAIN ROUTINE | ||
| 399 | CO40 ENDP | ||
| 400 | ;****************************************************** | ||
| 401 | CO80 PROC NEAR | ||
| 402 | |||
| 403 | CALL get_video_info | ||
| 404 | .IF <video_info_DI.active_display EQ all> OR | ||
| 405 | find_number <video_info_DI.active_display>,color_combos | ||
| 406 | .IF Z OR | ||
| 407 | find_number <video_info_DI.alternate_display>,color_combos | ||
| 408 | .IF Z THEN | ||
| 409 | |||
| 410 | MOV DL,BITBW80 ;80 X 25 USING COLOR CARD | ||
| 411 | MOV DH,OPTION_CO8025 ; REQUEST COLOR | ||
| 412 | MOV CURSOR_TYPE,COLOR_CURSOR_TYPE | ||
| 413 | |||
| 414 | ;DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 415 | ;DH HAS BYTE OF VIDEO OPTION | ||
| 416 | CALL setup | ||
| 417 | |||
| 418 | .ELSE | ||
| 419 | |||
| 420 | MOV DI,0 ;the screen mode is always the first parm ;AC000; | ||
| 421 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AC000; | ||
| 422 | MOV CX,parm_list[DI].value1 ;AC000; | ||
| 423 | MOV not_supported_ptr,CX ;FILL IN pointer to the parameter that is not supported ;AC000; | ||
| 424 | DISPLAY Function_not_supported ;'Function not supported - CO80" | ||
| 425 | MOV NOERROR,FALSE | ||
| 426 | |||
| 427 | .ENDIF | ||
| 428 | |||
| 429 | RET ;RETURN TO MAIN ROUTINE | ||
| 430 | CO80 ENDP | ||
| 431 | ;****************************************************** | ||
| 432 | SETUP PROC NEAR | ||
| 433 | ;INPUT: DL HAS BYTE TO BE OR'ED INTO EQUIP_FLAG | ||
| 434 | ; DH HAS BYTE OF VIDEO OPTION | ||
| 435 | |||
| 436 | XOR AX,AX ;ZERO A REG | ||
| 437 | MOV ES,AX ;POINT TO SEGMENT AT ZERO | ||
| 438 | MOV AX,ES:EQUIP_FLAG ;GET CURRENT STATUS FLAG BYTE | ||
| 439 | AND AL,0FFH-MASK VIDEO ;CLEAR VIDEO DEFINITION BITS | ||
| 440 | OR AL,DL ;TURN ON REQUESTED VIDEO BITS | ||
| 441 | MOV ES:EQUIP_FLAG,AX ;RESTORE UPDATED FLAG BYTE | ||
| 442 | |||
| 443 | MODE_VIDEO DH ;SET MODE TO DESIRED OPTION | ||
| 444 | |||
| 445 | SET_CURSOR_POS ;TO ROW=0, COL=0 | ||
| 446 | |||
| 447 | SET_CURSOR_TYPE ;TO 6,7 FOR COLOR MODES, B,C FOR MONO | ||
| 448 | |||
| 449 | RET ;RETURN TO CALLER | ||
| 450 | SETUP ENDP | ||
| 451 | ;****************************************************** | ||
| 452 | GET_VIDEO_INFO PROC NEAR | ||
| 453 | |||
| 454 | ;Determine what display adapters are in the machine. | ||
| 455 | |||
| 456 | |||
| 457 | ;Assumption: | ||
| 458 | ; | ||
| 459 | ; | ||
| 460 | |||
| 461 | ;Notes: I assume that if an EGA is present then it is the active display. This | ||
| 462 | ; is not always the case, but the routines that call for that kind of | ||
| 463 | ; information do not care which is active, or already know. | ||
| 464 | |||
| 465 | ;Conventions: 'video_info_DI'([DI]) is used to address the info table returned | ||
| 466 | ; by INT 10 AH=1B as defined by the structure 'info_block' and | ||
| 467 | ; stored in 'information_block'. If the INT 10 AH=1A was | ||
| 468 | ; successfull then the result is stored here. | ||
| 469 | |||
| 470 | |||
| 471 | |||
| 472 | |||
| 473 | |||
| 474 | |||
| 475 | |||
| 476 | |||
| 477 | PUSH ES | ||
| 478 | |||
| 479 | XOR AX,AX ;ZAP previous contents | ||
| 480 | MOV AH,01BH ;functionality/state information | ||
| 481 | PUSH CS | ||
| 482 | POP ES | ||
| 483 | MOV DI,OFFSET information_block ;initialize 'video_info_DI' | ||
| 484 | MOV BX,0 ;parm to allow for future expansion | ||
| 485 | INT 010H | ||
| 486 | .IF <AL EQ 01BH> THEN NEAR ;IF the call is supported THEN | ||
| 487 | ;ES:DI=>info returned from BIOS | ||
| 488 | .IF <video_info_DI.alternate_display EQ 0> THEN NEAR ;only 1 display, so see if it can handle all modes | ||
| 489 | |||
| 490 | TEST video_info_DI.misc_state_info,AMOAMA ;check the 'all modes on all monitors active' bit | ||
| 491 | .IF NZ ;IF all modes are supported THEN | ||
| 492 | MOV video_info_DI.active_display,all ;return the active display type as everything | ||
| 493 | .ENDIF | ||
| 494 | |||
| 495 | .ENDIF | ||
| 496 | |||
| 497 | .ELSE ;display code call not supported, look for EGA | ||
| 498 | ;SINCE the display type call was not supported SEE IF IN AN EGA ADVANCED MODE | ||
| 499 | |||
| 500 | MOV AX,SIGNITURE | ||
| 501 | MOV ES,AX ;PUT SEGMENT OF SIGNITURE OF EGA IN ES | ||
| 502 | .IF <ES:SIGWORD EQ EGA_SIG> AND ;IF maybe an EGA IN THE MACHINE THEN | ||
| 503 | MOV AH,ALT_SELECT ;AH GETS INT FUNCTION SPECIFIER | ||
| 504 | MOV BL,EGA_INFO ;SPECIFY IN BL THE OPTION OF THE FUNCTION OF INT 10 WE | ||
| 505 | INT 10H ;RETURN MONITOR TYPE HOOKED TO EGA IN BH | ||
| 506 | .IF <BL NE 010H> THEN ;EGA support available | ||
| 507 | .IF <BH EQ COLOR_ON_IT> THEN ;IF COLOR HOOKED TO EGA THEN | ||
| 508 | MOV video_info_DI.active_display,ega_color | ||
| 509 | |||
| 510 | MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER | ||
| 511 | CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT | ||
| 512 | .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN | ||
| 513 | MOV video_info_DI.alternate_display,mono_card | ||
| 514 | .ENDIF | ||
| 515 | |||
| 516 | .ELSE | ||
| 517 | MOV video_info_DI.active_display,ega_mono | ||
| 518 | |||
| 519 | MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER | ||
| 520 | CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH | ||
| 521 | .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT | ||
| 522 | MOV video_info_DI.alternate_display,cga | ||
| 523 | .ENDIF | ||
| 524 | .ENDIF | ||
| 525 | .ELSE ;no display type call, no EGA | ||
| 526 | ;check for convertible | ||
| 527 | .IF <machine_type EQ P14_model_byte> AND | ||
| 528 | MOV AH,get_sys_stat | ||
| 529 | INT 15H ;AL=system status | ||
| 530 | AND AL,LCD_bit ;check bit 0 | ||
| 531 | .IF <AL EQ LCD_attached> THEN | ||
| 532 | MOV video_info_DI.active_display,all ;LCD supports mono and color | ||
| 533 | .ELSE ;no analog displays, no EGA, no LCD | ||
| 534 | |||
| 535 | MOV AX,0B000H ;GET BASE OF MONO SCREEN BUFFER | ||
| 536 | CALL check_buff ;IF THERE IS MEMORY WHERE THE MONO CARD HAS IT | ||
| 537 | .IF <AH EQ AL> THEN ;IF there is a monchrome card buffer present THEN | ||
| 538 | MOV video_info_DI.active_display,mono_card | ||
| 539 | .ENDIF | ||
| 540 | |||
| 541 | MOV AX,0B800H ;AX= BASE OF GRAPHICS SCREEN BUFFER | ||
| 542 | CALL CHECK_BUFF ;DATA PUT OUT IN AL, DATA RETURNED IN AH | ||
| 543 | .IF <AH EQ AL> THEN ;IF WHAT I GOT BACK IS SAME AS I PUT OUT, THEN BUFFER IS PRESENT | ||
| 544 | MOV video_info_DI.alternate_display,cga | ||
| 545 | .ENDIF | ||
| 546 | |||
| 547 | .ENDIF | ||
| 548 | |||
| 549 | .ENDIF | ||
| 550 | |||
| 551 | .ENDIF | ||
| 552 | |||
| 553 | POP ES | ||
| 554 | |||
| 555 | RET ;RETURN TO CALLER | ||
| 556 | |||
| 557 | |||
| 558 | GET_VIDEO_INFO ENDP | ||
| 559 | ;****************************************************** | ||
| 560 | ;VMONO PROC NEAR | ||
| 561 | ;;VERIFY THAT A MONOCHROME CARD EXISTS OR LCD IS ATTACHED | ||
| 562 | ;;Input: - AX=base of monochrome screen buffer | ||
| 563 | ;;Output: - AH=AL if have monochrome card or LCD attached | ||
| 564 | ;; AH<>AL if don't have mono card and LCD is not attached | ||
| 565 | ; | ||
| 566 | ;;One way to have a valid MONO setting on a P1X is to have the LCD attached. Another is | ||
| 567 | ;;to have the LCD detached and have a MONO card attached. | ||
| 568 | ;;The logic is as follows: | ||
| 569 | ;; | ||
| 570 | ;;BEGIN | ||
| 571 | ;; ok_to_put_in_MONO_mode:=false | ||
| 572 | ;; IF on a P1X AND LCD is attached THEN | ||
| 573 | ;; ok_to_put_in_MONO_mode:=true | ||
| 574 | ;; ELSE | ||
| 575 | ;; verify_the_buffer_exists | ||
| 576 | ;; ENDIF | ||
| 577 | ;;END | ||
| 578 | ; | ||
| 579 | ; PUSH AX | ||
| 580 | ; CMP machine_type,P14_model_byte | ||
| 581 | ; $IF E,AND | ||
| 582 | ; MOV AH,get_sys_stat | ||
| 583 | ; INT 15H ;AL=system status | ||
| 584 | ; AND AL,LCD_bit ;check bit 0 | ||
| 585 | ; CMP AL,LCD_attached | ||
| 586 | ; $IF E ;IF on a P1X AND LCD is attached THEN | ||
| 587 | ; POP AX ; clean the stack | ||
| 588 | ; MOV AX,0000H ; AH=ALðOK to put in MONO mode | ||
| 589 | ; $ELSE ;ELSE | ||
| 590 | ; POP AX ; AX=mono buffer base | ||
| 591 | ; CALL check_buff ; see if the MONO card exists | ||
| 592 | ; $ENDIF ;ENDIF | ||
| 593 | ;RET ;RETURN TO MAIN ROUTINE | ||
| 594 | ;VMONO ENDP | ||
| 595 | ;****************************************************** | ||
| 596 | CHECK_BUFF PROC NEAR | ||
| 597 | ;SEE IF MEMORY EXISTS AT THE SEGMENT PASSED IN AX | ||
| 598 | |||
| 599 | PUSH DS ;SAVE DATA SEGMENT REGISTER | ||
| 600 | ; MOVE SEG ID OF VIDEO BUFFER | ||
| 601 | MOV DS,AX ; TO THE DATA SEGMENT REG | ||
| 602 | MOV CH,DS:0 ;GET A BYTE FROM THAT BUFFER | ||
| 603 | MOV AL,55H ;GET A SAMPLE DATA BYTE | ||
| 604 | MOV DS:0,AL ; TO THE SCREEN BUFFER, IF THERE | ||
| 605 | PUSH BX ;TERMINATE THE BUS SO WE DON'T GET THE SAME THING | ||
| 606 | POP BX ;BACK BECAUSE IT WAS STILL ON THE BUS | ||
| 607 | MOV AH,DS:0 ;FETCH IT BACK | ||
| 608 | MOV DS:0,CH ;REPAIR THE DAMAGE IN THE BUFFER | ||
| 609 | POP DS ;RESTORE DATA SEGMENT REGISTER | ||
| 610 | RET | ||
| 611 | CHECK_BUFF ENDP | ||
| 612 | ;******************************************************** | ||
| 613 | PRINTF_CODE ENDS | ||
| 614 | END | ||
diff --git a/v4.0/src/CMD/MODE/PARSHELL.ASM b/v4.0/src/CMD/MODE/PARSHELL.ASM new file mode 100644 index 0000000..ed63d1a --- /dev/null +++ b/v4.0/src/CMD/MODE/PARSHELL.ASM | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | |||
| 2 | PRINTF_CODE SEGMENT PUBLIC | ||
| 3 | |||
| 4 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,ES:PRINTF_CODE,SS:PRINTF_CODE | ||
| 5 | |||
| 6 | FARSW EQU 0 ;CALL parser by near call | ||
| 7 | DATESW EQU 0 ;NO date checking code | ||
| 8 | TIMESW EQU 0 ;NO time checking code | ||
| 9 | FILESW EQU 1 ;have to check for font file name | ||
| 10 | CAPSW EQU 0 ;don't have to display file names | ||
| 11 | CMPXSW EQU 1 ;have complex list in codepage syntax | ||
| 12 | DRVSW EQU 0 ;just a drive is never legal | ||
| 13 | QUSSW EQU 0 ;quoted string is not legal | ||
| 14 | NUMSW EQU 1 ;need to check a numeric value occaisionally | ||
| 15 | KEYSW EQU 1 ;oodles of keywords to check | ||
| 16 | SWSW EQU 1 ;/status | ||
| 17 | VAL1SW EQU 1 ;handle numeric ranges | ||
| 18 | VAL2SW EQU 1 ;handle list of numbers | ||
| 19 | VAL3SW EQU 1 ;handle list of strings | ||
| 20 | BASESW EQU 1 ;use DS addressability for PSDATA.INC variables | ||
| 21 | ;INCSW EQU 1 | ||
| 22 | |||
| 23 | INCLUDE PARSE.ASM | ||
| 24 | |||
| 25 | PUBLIC SYSPARSE | ||
| 26 | |||
| 27 | PRINTF_CODE ENDS | ||
| 28 | |||
| 29 | END | ||
| 30 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/RESCODE.ASM b/v4.0/src/CMD/MODE/RESCODE.ASM new file mode 100644 index 0000000..ff55772 --- /dev/null +++ b/v4.0/src/CMD/MODE/RESCODE.ASM | |||
| @@ -0,0 +1,719 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | |||
| 3 | TITLE CODE TO BE MADE RESIDENT BY MODE | ||
| 4 | |||
| 5 | .XLIST | ||
| 6 | INCLUDE STRUC.INC | ||
| 7 | .LIST | ||
| 8 | ;.SALL | ||
| 9 | |||
| 10 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 11 | ;º º ;AN000; | ||
| 12 | ;AN000; | ||
| 13 | ; AC000 - P2852: Infinite retry check at beginning of INT 14 handler was using | ||
| 14 | ; wrong bit pattern. | ||
| 15 | |||
| 16 | ; AC001 - P5148: retry_flag was addressing the wrong segment | ||
| 17 | |||
| 18 | ;º º ;AN000; | ||
| 19 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 20 | ;AN000; | ||
| 21 | |||
| 22 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 23 | ;º º | ||
| 24 | |||
| 25 | DISPLAY MACRO MSG | ||
| 26 | MOV DX,OFFSET MSG | ||
| 27 | CALL PRINTF | ||
| 28 | ENDM | ||
| 29 | |||
| 30 | GET_INT_VECT MACRO INT_NO ;Input: "INT_NO" - the interrupt to be gotten | ||
| 31 | PUSH AX | ||
| 32 | MOV AL,INT_NO ; | ||
| 33 | MOV AH,35H ;FUNCTION CALL "GET VECTOR" | ||
| 34 | INT 21H ;Output: ES:BX = the address in the vector | ||
| 35 | POP AX | ||
| 36 | ENDM | ||
| 37 | |||
| 38 | SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG | ||
| 39 | |||
| 40 | PUSH AX | ||
| 41 | MOV AX,VALUE | ||
| 42 | MOV REG,AX | ||
| 43 | POP AX | ||
| 44 | |||
| 45 | ENDM | ||
| 46 | |||
| 47 | SET_INT_VECT MACRO INT_NO ;Input: "INT_NO" - the interrupt to be set | ||
| 48 | PUSH AX ; DS:DX = CS:IP value to set the interrupt to | ||
| 49 | MOV AL,INT_NO ;Output: the vector "INT_NO" contains DS:DX | ||
| 50 | MOV AH,25H ;function call "SET VECTOR" | ||
| 51 | INT 21H | ||
| 52 | POP AX | ||
| 53 | ENDM | ||
| 54 | |||
| 55 | store_vector MACRO dword_holder ;Input: "dword_holder" - where to store it | ||
| 56 | ; ES:BX - the address (vector) to be stored | ||
| 57 | MOV WORD PTR dword_holder,BX ;Output: "dword_holder"=the value passed in ES:BX | ||
| 58 | MOV WORD PTR dword_holder[2],ES | ||
| 59 | |||
| 60 | ENDM | ||
| 61 | |||
| 62 | ;º º | ||
| 63 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 64 | |||
| 65 | |||
| 66 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 67 | ;º º | ||
| 68 | |||
| 69 | ADJUSTMENT EQU (entpt - move_destination) ;# of bytes the resident code is moved | ||
| 70 | adjustment_in_paragraphs EQU (adjustment / 10H) ;# paragraphs the code moved | ||
| 71 | COM_status EQU 03 ;BIOS input for com status request ;AN001; | ||
| 72 | E EQU 1 ;value of "res_com_retry_type" for E retry requested ;AN001; | ||
| 73 | false EQU 0 | ||
| 74 | framing_error EQU 0000100000000000B ;bit returned in AX from com status ;AN001; | ||
| 75 | holding_empty EQU 0010000000000000B ;bit returned in AX from com status ;AN001; | ||
| 76 | INT14 EQU 014H | ||
| 77 | INT17 EQU 017H | ||
| 78 | LPT_status EQU 02 ;value of AH for printer status checks ;AN000; | ||
| 79 | not_busy EQU 80H ;just the not busy bit on | ||
| 80 | overrun_error EQU 0000001000000000B ;bit returned in AX from com status ;AN001; | ||
| 81 | parity_error EQU 0000010000000000B ;bit returned in AX from com status ;AN001; | ||
| 82 | P14_model_byte EQU 0F9H ;P14's have a F9 at F000:FFFE | ||
| 83 | R EQU 3 ;value of "res_com_retry_type" for R retry requested ;AN001; | ||
| 84 | shift_empty EQU 0100000000000000B ;bit returned in AX from com status ;AN001; | ||
| 85 | time_out EQU 1000000000000000B ;time out bit returned in AX from com status ;AN001; | ||
| 86 | TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN | ||
| 87 | TRUE EQU 0FFH | ||
| 88 | USER_ABORT EQU 00H | ||
| 89 | |||
| 90 | ;º º | ||
| 91 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 92 | |||
| 93 | |||
| 94 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 95 | ;º º | ||
| 96 | |||
| 97 | |||
| 98 | ;º º | ||
| 99 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 100 | |||
| 101 | |||
| 102 | ROM SEGMENT AT 0F000H | ||
| 103 | ORG 0E739H | ||
| 104 | RS232 LABEL FAR | ||
| 105 | ORG 0EFD2H | ||
| 106 | PRINTER_IO LABEL FAR | ||
| 107 | ;NOTE: THE VALUES REPRESENTED BY THIS SEGMENT ARE NOT NECESSARILY | ||
| 108 | ; THE ONES USED BY THE SUBSEQUENT PROCEDURES. THESE HERE MERELY | ||
| 109 | ; SERVE AS SAMPLES. THE ACTUAL VALUES IN THE INSTRUCTIONS: | ||
| 110 | ; JMP RS232 | ||
| 111 | ; JMP PRINTER_IO | ||
| 112 | ; WILL BE MOVED INTO THESE INSTRUCTIONS FROM THE VECTOR TABLE USING | ||
| 113 | ; THE THEN CURRENT VALUES OF INT 14H FOR RS232 AND OF INT 17H FOR | ||
| 114 | ; THE PRINTER_IO JUMP TARGETS. THIS IS TO ALLOW FOR SOME USER | ||
| 115 | ; TO HAVE INTERCEPTED THESE VECTORS AND DIRECTED THEIR REQUESTS TO | ||
| 116 | ; HIMSELF INSTEAD OF TO THE ROM. | ||
| 117 | |||
| 118 | ORG 0FFFEH | ||
| 119 | ;model_byte LABEL BYTE | ||
| 120 | ROM ENDS | ||
| 121 | |||
| 122 | VECT SEGMENT AT 0 | ||
| 123 | ORG 50H | ||
| 124 | VECT14H LABEL DWORD ;RS232 CALL | ||
| 125 | ORG 5CH | ||
| 126 | VECT17H LABEL DWORD ;PRINTER I/O CALL | ||
| 127 | ORG 471H | ||
| 128 | BREAK_FLAG LABEL BYTE ;BREAK FLAG | ||
| 129 | BREAK_BIT EQU 80H ;ON=BREAK | ||
| 130 | ORG 530H | ||
| 131 | RESSEG LABEL DWORD ;VECTOR OF MODETO, INIT TO ZERO | ||
| 132 | VECT ENDS | ||
| 133 | |||
| 134 | |||
| 135 | ;**************************************************************** | ||
| 136 | PRINTF_CODE SEGMENT PUBLIC | ||
| 137 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE | ||
| 138 | |||
| 139 | |||
| 140 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 141 | ;º º | ||
| 142 | |||
| 143 | EXTRN device_type:BYTE ;see parse.asm | ||
| 144 | EXTRN COMX:ABS ;see parse.asm | ||
| 145 | EXTRN LPTX:ABS ;see parse.asm | ||
| 146 | EXTRN MAIN:NEAR | ||
| 147 | EXTRN MOVED_MSG:WORD ;CR,LF,"Resident portion of MODE loaded",CR,LF,"$" | ||
| 148 | EXTRN busy_status:ABS ;value of lpt1_retry_type[BX] when user wants actual status, see modeprin | ||
| 149 | EXTRN PRINTF:NEAR ;interface to message retriever, see display.asm | ||
| 150 | EXTRN reroute_requested:BYTE ;see parse.asm | ||
| 151 | EXTRN retry_requested:BYTE ;see parse.asm | ||
| 152 | |||
| 153 | ;º º | ||
| 154 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 155 | |||
| 156 | |||
| 157 | |||
| 158 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 159 | ;º º | ||
| 160 | |||
| 161 | PUBLIC first_char_in_command_line ;location of the command line parameters | ||
| 162 | PUBLIC FIXUP | ||
| 163 | PUBLIC lpt1_retry_type ;filled in and used to get at other two lpt retry masks in modeprin | ||
| 164 | PUBLIC rescode_length ;REFERENCED IN MAIN PROCEDURE | ||
| 165 | PUBLIC MODETO | ||
| 166 | PUBLIC move_destination ;location of the resident code after it has been moved | ||
| 167 | PUBLIC NEW_PTSFLAG ;RESIDENT THE FLAG WILL BE ACCESSABLE TO | ||
| 168 | PUBLIC NEW_SCRNTABL ;MODESCRN NEEDS TO KNOW WHERE IT WENT | ||
| 169 | PUBLIC OFFPTS ;USED IN MODEECHO TO ADDRESS MODEPTS | ||
| 170 | PUBLIC OFFRETRY | ||
| 171 | PUBLIC ptsflag1 ;make available to display_printer_reroute_status | ||
| 172 | PUBLIC P14_model_byte | ||
| 173 | PUBLIC res_com_retry_type | ||
| 174 | ;PUBLIC res_lpt_retry_type | ||
| 175 | PUBLIC resflag2 ;make available to display_printer_reroute_status | ||
| 176 | PUBLIC RES_MODEFLAG ; RESIDENT THE FLAG WILL BE ACCESSABLE | ||
| 177 | PUBLIC RESSEG ;SCRNTABL NEEDS TO FOLLOW THIS VECTOR TO ADDRESS VIDEO PARMS | ||
| 178 | PUBLIC SCRNTABL | ||
| 179 | PUBLIC submodel_byte ;holder for machine's secondary model byte | ||
| 180 | PUBLIC VECTOR14 | ||
| 181 | PUBLIC VECTOR17 | ||
| 182 | |||
| 183 | ;º º | ||
| 184 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 185 | |||
| 186 | ORG 2CH | ||
| 187 | environ_seg DW ? ;segment address of the environment, used as the block of memory to free so ;AN000; | ||
| 188 | ;environment is not part of resident code. | ||
| 189 | |||
| 190 | ORG 60H ;first usable byte of PSP. If you change this check the | ||
| 191 | ;calculation of paragraphs in 'main' | ||
| 192 | |||
| 193 | move_destination LABEL WORD ;where the resident will be moved to | ||
| 194 | |||
| 195 | ; THIS STRUCTURE DEFINES THE PROGRAM SEGMENT PREFIX AREA | ||
| 196 | ; POINTED TO BY THE ES REGISTER. THIS MUST BE DEFINED HERE, IT REPLACES THE | ||
| 197 | ; 'ORG 100' | ||
| 198 | |||
| 199 | ORG 80H | ||
| 200 | command_line_length DB ? ;not used, just place holder to allign next field | ||
| 201 | first_char_in_command_line LABEL BYTE ;location of the command line parameters | ||
| 202 | ;command_line DB 7FH DUP(?) ;PARM AREA | ||
| 203 | |||
| 204 | ORG 100H | ||
| 205 | ENTPT: JMP MAIN ;ENTRY POINT, START AT THE MAIN PROCEDURE | ||
| 206 | SUBTTL SERIAL RETRY | ||
| 207 | PAGE | ||
| 208 | ;THIS PROC WILL BE POINTED TO BY INT VECTOR 14H | ||
| 209 | |||
| 210 | |||
| 211 | MODETO PROC NEAR | ||
| 212 | |||
| 213 | |||
| 214 | |||
| 215 | |||
| 216 | PUSH CX | ||
| 217 | MOV CL,DL ;CL=DL=0,1,2 or 3 | ||
| 218 | SHL CL,1 ;CL= 0, 2, 4 or 6 for COM 1,2,3 or 4 respectively ;AC000; | ||
| 219 | XOR CH,CH ;CH=0 ready for ANDing in the mask ;AC000; | ||
| 220 | OR CH,00000011B ;CH=00000011, mask for any type of retry, to be shifted into proper position ;AC000; | ||
| 221 | SHL CH,CL ;CH=00000011, 00001100, 00110000 or 11000000 for COM 1,2,3 or 4 respectively | ||
| 222 | AND CH,BYTE PTR CS:res_modeflag ;see if any bit is on for this COM port ;AC001; | ||
| 223 | MOV CS:retry_type,CX ;AC001; save for check after call to old INT 14 ;AN001; | ||
| 224 | POP CX | ||
| 225 | JNZ pushax | ||
| 226 | |||
| 227 | |||
| 228 | |||
| 229 | |||
| 230 | |||
| 231 | VECTOR14 LABEL WORD ;THE NEXT JMP INSTRUCTION HAS 5 BYTES, | ||
| 232 | ; THE LAST 4 ARE THE CONTENTS OF INT 14H, | ||
| 233 | ; WHICH NORMALLY POINTS TO THE ROM RS232 | ||
| 234 | ; HANDLER. THE CODE GENERATED HERE BY THE | ||
| 235 | ; ASSEMBLER IS REPLACED BY THE ACTUAL | ||
| 236 | ; CONTENTS OF INT 14H. | ||
| 237 | |||
| 238 | TOROM: | ||
| 239 | JMP RS232 ;NO RETRY, GO DIRECTLY TO ROM ENTRY IRET from there | ||
| 240 | PUSHAX: | ||
| 241 | MOV CS:request,AH ;save request type | ||
| 242 | PUSH AX ;SAVE ENTRY PARAMETERS FOR LATER RETRY | ||
| 243 | PUSH DS ;SAVE REGS | ||
| 244 | PUSH AX ;SAVE REGS | ||
| 245 | SUB AX,AX ;POINT TO | ||
| 246 | MOV DS,AX ; PAGE ZERO | ||
| 247 | AND DS:BREAK_FLAG,0FFH-BREAK_BIT ;RESET BREAK FLAG | ||
| 248 | POP AX ;RESTORE | ||
| 249 | POP DS ; REGS | ||
| 250 | PUSHF ;SAVE FLAGS TO SIMULATE INT INSTRUCTION | ||
| 251 | |||
| 252 | VEC EQU (VECTOR14 +1) ;OFFSET TO IMMEDIATE FIELD OF PREVIOUSLY SET | ||
| 253 | ; FAR JMP INSTRUCTION, FILLED WITH THE | ||
| 254 | ; ORIGINAL CONTENTS OF THE INTERRUPT VECTOR | ||
| 255 | CALL DWORD PTR CS:VEC ;CALL PREVIOUS RS232 HANDLER | ||
| 256 | .IF <CS:request EQ COM_status> THEN ;IF a status request THEN ;AN001; | ||
| 257 | PUSH CX ;need CX for shift count in CL ;AN001; | ||
| 258 | MOV CX,CS:retry_type ;AC001; get back retry type for this port ;AN001; | ||
| 259 | SHR CH,CL ;put back in first two bits for retry type check below ;AN001; | ||
| 260 | .IF <CH EQ E> THEN ;AN001; | ||
| 261 | MOV AX,time_out+framing_error+parity_error+overrun_error ;indicate the port is on fire ;AN001; | ||
| 262 | .ELSEIF <CH EQ R> THEN ;AN001; | ||
| 263 | MOV AX,shift_empty+holding_empty+clear_to_send+data_set_ready ;indicate the port is ready ;AN001; | ||
| 264 | .ENDIF ;otherwise assume B retry and pass actual status ;AN001; | ||
| 265 | POP CX ;restore reg ;AN001; | ||
| 266 | .ELSE ;continue as if a send request ;AN001; | ||
| 267 | PUSH AX ;SAVE REGS | ||
| 268 | PUSH DS ; REGS | ||
| 269 | SUB AX,AX ;POINT TO | ||
| 270 | MOV DS,AX ; PAGE ZERO | ||
| 271 | TEST DS:BREAK_FLAG,BREAK_BIT ;TEST BREAK FLAG | ||
| 272 | POP DS ;RESTORE | ||
| 273 | POP AX ; REGS | ||
| 274 | JZ TESTER ;BRANCH IF NO BREAK | ||
| 275 | OR AH,80H ;SIMULATE TIMEOUT ERROR ON BREAK | ||
| 276 | .ENDIF ;ENDIF status request ;AN001; | ||
| 277 | FLUSH: | ||
| 278 | INC SP ;FLUSH THE | ||
| 279 | INC SP ; STACK | ||
| 280 | IRET ;RETURN | ||
| 281 | ; | ||
| 282 | TESTER: | ||
| 283 | TEST AH,80H ;TEST IF A REAL TIMEOUT | ||
| 284 | JZ FLUSH ;IF NOT, RETURN | ||
| 285 | POP AX ;RETRIEVE ORIGINAL ENTRY PARAMETERS | ||
| 286 | JMP PUSHAX ;DO RETRY | ||
| 287 | ;********************************************************************** | ||
| 288 | RES_MODEFLAG EQU $ ;WHEN THIS CODE IS RESIDENT THE FLAG WILL BE | ||
| 289 | ; ACCESSABLE BY MODECOM AS AN OFFSET FROM ADDRESS | ||
| 290 | ; POINTED TO BY VECT14H AND RESSEG | ||
| 291 | res_com_retry_type equ $ | ||
| 292 | |||
| 293 | DB 0 ;AN665;no retry of any type active for any port | ||
| 294 | ; | ||
| 295 | ; bits comx 00=>no retry for any port | ||
| 296 | ; ---- ---- 01=>E for COM1, no retry for 2, 3 and 4 | ||
| 297 | ; 0-1 com1 02=>B for COM1, no retry for 2, 3 and 4 | ||
| 298 | ; 2-3 com2 03=>R for COM1, no retry for 2, 3 and 4 | ||
| 299 | ; 4-5 com3 04=>E for COM2, no retry for 1, 3 and 4 | ||
| 300 | ; 6-7 com4 05=>E for COM2, E for COM1, none for 3 and 4 | ||
| 301 | ; 06=>E for COM2, B for COM1, none for 3 and 4 | ||
| 302 | ; bit 07=>E for COM2, R for COM1, none for 3 and 4 | ||
| 303 | ; pair 08=>B for COM2, none for 1, 3 and 4 | ||
| 304 | ; value active 09=>B for COM2, E for COM1, none for 3 and 4 | ||
| 305 | ; ----- ------ 0A=>B for COM2, B for COM1, none for 3 and 4 | ||
| 306 | ; 0 unknown 0B=>B for COM2, R for COM1, none for 3 and 4 | ||
| 307 | ; 1 E 0C=>R for COM2, no retry for 1, 3 and 4 | ||
| 308 | ; 2 B 0D=>R for COM2, E for COM1, none for 3 and 4 | ||
| 309 | ; 3 R 0E=>R for COM2, B for COM1, none for 3 and 4 | ||
| 310 | ; 0F=>R for COM2, R for COM1, none for 3 and 4 | ||
| 311 | ; 10=>E for COM3, none for 1, 2 and 4 | ||
| 312 | ; etc. | ||
| 313 | MODETO ENDP | ||
| 314 | ;************************************************************** | ||
| 315 | SUBTTL DETERMINE PARALLEL TO SERIAL, OR PARALLEL TIMEOUT | ||
| 316 | PAGE | ||
| 317 | ;THIS PROC MAY BE POINTED TO BY INT VECTOR 17H | ||
| 318 | MODEPTS PROC NEAR | ||
| 319 | OFFPTS EQU MODEPTS - MODETO | ||
| 320 | TEST DL,1 ;DETERMINE IF REDIRECTION APPLIES | ||
| 321 | ; NOTE: THIS IMMEDIATE FIELD IS Revised BY MODE | ||
| 322 | ; | ||
| 323 | ;THIS NEXT JUMP INSTRUCTION IS Revised BY MODEECHO TO REFLECT WHICH | ||
| 324 | ;LPTN IS TO BE REDIRECTED TO WHICH COMM. | ||
| 325 | JNZ CK ;THIS JNZ IS Revised BY MODE | ||
| 326 | ; | ||
| 327 | ORG $-2 | ||
| 328 | JZ CK ;IT MAY BE CHANGED TO THIS | ||
| 329 | ; | ||
| 330 | ORG $-2 | ||
| 331 | JMP SHORT NOREDIRECT ; OR THIS... | ||
| 332 | ; | ||
| 333 | NOREDIRECT: | ||
| 334 | OFFRETRY EQU $ ;disp into resident code of retry flgs | ||
| 335 | ;THIS NEXT SECTION WILL TEST FOR THE OPTIONAL RETRY ON PARALLEL TIMEOUT. | ||
| 336 | TEST DL,1 ;TEST TO SEE IF PARALLEL RETRY IS ACTIVE | ||
| 337 | ;THIS NEXT JUMP INSTRUCTION IS Revised BY MODEPRIN TO REFLECT WHICH | ||
| 338 | ;LPT1n DEFICE IS TO BE RETRIED. IT WILL APPEAR IN SEVERAL FORMS: | ||
| 339 | JNZ PAR_RETRY ;THIS INSTRUCTION MAY BE Revised | ||
| 340 | ; | ||
| 341 | ORG $-2 | ||
| 342 | JZ PAR_RETRY | ||
| 343 | ; | ||
| 344 | ORG $-2 | ||
| 345 | JMP SHORT ASIS | ||
| 346 | ; | ||
| 347 | VECTOR17 LABEL WORD | ||
| 348 | ASIS: JMP PRINTER_IO ;NO REDIRECTION, GO DIRECTLY TO PREVIOUS INT 17H | ||
| 349 | ;************************************************************** | ||
| 350 | SUBTTL RETRY PARALLEL ON TIMEOUT. | ||
| 351 | PAGE | ||
| 352 | PAR_RETRY: | ||
| 353 | RT: | ||
| 354 | MOV CS:request,AH ;save the function requested for check after return from call to INT 17 ;AN000; | ||
| 355 | PUSH AX ;SAVE ENTRY PARAMETERS FOR LATER USE | ||
| 356 | PUSH DS ;SAVE CALLER'S REGS | ||
| 357 | PUSH AX ;SAVE REGS | ||
| 358 | ; | ||
| 359 | SUB AX,AX ;POINT TO PAGE ZERO | ||
| 360 | MOV DS,AX ; USING THE DATA SEG REG | ||
| 361 | ; | ||
| 362 | AND DS:BREAK_FLAG,0FFH-BREAK_BIT ;RESET BREAK FLAG | ||
| 363 | ; | ||
| 364 | POP AX ;RESTORE CALLER'S REGS | ||
| 365 | POP DS ;RESTORE REGS | ||
| 366 | PUSHF ;SAVE FLAGS TO SIMULATE INT INSTRUCTION | ||
| 367 | PVEC EQU VECTOR17+1 ;OFFSET TO IMMEDIATE FIELD OF PREVIOUSLY SET | ||
| 368 | ; FAR JUMP INSTRUCTION, FILLED WITH THE | ||
| 369 | ; ORIGINAL CONTENTS OF THE INT 17H VECTOR. | ||
| 370 | CALL DWORD PTR CS:PVEC ;CALL PREVIOUS PARALLEL PORT HANDLER | ||
| 371 | CMP CS:request,LPT_status ;AN000; | ||
| 372 | JNE init_or_write ;AN000; | ||
| 373 | TEST AH,not_busy ;see if the printer was busy (not busy bit off) ;AN000; | ||
| 374 | JNZ pflush ;IF busy dork the status byte ;AN000; | ||
| 375 | PUSH BX ;AN000; | ||
| 376 | MOV BX,DX ;BX=zero based printer number ;AN000; | ||
| 377 | CMP BYTE PTR CS:lpt1_retry_type[BX],busy_status ;IF status should be changed THEN ;AN000; | ||
| 378 | JZ dont_modify ;busy setting means user wants actual status ;AN000; | ||
| 379 | MOV AH,BYTE PTR CS:lpt1_retry_type[BX] ;change to status set by prior retry setting request for this LPT ;AN000; | ||
| 380 | dont_modify: ;AN000; | ||
| 381 | POP BX ;AN000; | ||
| 382 | JMP pflush ;return to caller ;AN000; | ||
| 383 | init_or_write: ;AN000; | ||
| 384 | PUSH AX ;SAVE RETURN CODE IN AH | ||
| 385 | PUSH DS ;SAVE DATA SEGMENT REG | ||
| 386 | ; | ||
| 387 | SUB AX,AX ;POINT TO | ||
| 388 | MOV DS,AX ; SEGMENT AT ZERO | ||
| 389 | ; | ||
| 390 | TEST DS:BREAK_FLAG,BREAK_BIT ;TEST BREAK FLAG BIT | ||
| 391 | POP DS ;RESTORE SEG REG | ||
| 392 | POP AX ;RESTORE RETURN CODE TO AH | ||
| 393 | JZ PTEST ;BRANCH IF NO BREAK REQUESTED | ||
| 394 | ; | ||
| 395 | OR AH,USER_ABORT ;SIMULATE TIMEOUT | ||
| 396 | PFLUSH: | ||
| 397 | INC SP ;FLUSH THE | ||
| 398 | INC SP ; STACK | ||
| 399 | IRET ;RETURN TO CALLER | ||
| 400 | ; | ||
| 401 | PTEST: | ||
| 402 | TEST AH,01H ;TEST IF A REAL PARALLEL TIMEOUT | ||
| 403 | JZ PFLUSH ;IF NOT, RETURN | ||
| 404 | POP AX ;RETRIEVE ORIGINAL ENTRY PARAMETERS | ||
| 405 | JMP RT ;DO RETRY | ||
| 406 | ;************************************************************** | ||
| 407 | SUBTTL REDIRECT PARALLEL I/O TO SERIAL | ||
| 408 | PAGE | ||
| 409 | CK: | ||
| 410 | FIXUP EQU CK - NOREDIRECT | ||
| 411 | CMP AH,1 ;CHECK FOR 'INITIALIZE' CODE | ||
| 412 | ; AH=0, PRINT THE CHAR IN AL | ||
| 413 | ; AH=1, INITIALIZE | ||
| 414 | ; AH=2, READ STATUS | ||
| 415 | JNZ PTCHR ;IT IS PRINT CHARACTER OR READ STATUS | ||
| 416 | ; SINCE IT IS 'INITIALIZE' | ||
| 417 | MOV AH,80H ;PASS BACK 'NOT BUSY' RETURN CODE FROM | ||
| 418 | ; AH=1, (INITIALIZE) | ||
| 419 | IRET | ||
| 420 | ; | ||
| 421 | PTCHR: | ||
| 422 | ; IT IS PRINT CHARACTER OR READ STATUS | ||
| 423 | PUSH BX ;SAVE THE | ||
| 424 | PUSH AX ; REGS | ||
| 425 | PUSH DX ;SAVE MORE REGS | ||
| 426 | MOV BX,OFFSET RESFLAG2 ;POINT AT PARALLEL TO SERIAL | ||
| 427 | ; CORRESPONDENCE TABLE IN RESIDENT CODE | ||
| 428 | ADD BX,DX ;INDEX USING PRINTER SELECTION (0,1,OR 2) | ||
| 429 | MOV DL,CS:[BX] ;GET CORRESPONDING SERIAL PORT SELECT | ||
| 430 | CMP AH,0 ;CHECK FOR 'PRINT CHAR' CODE | ||
| 431 | JZ SENDCHAR ; YES, PRINT CHAR | ||
| 432 | ; NO, MUST BE READ STATUS | ||
| 433 | MOV AH,3 ;SET TO INT 14 'READ STAT' ENTRY PT | ||
| 434 | INT 14H ;GO RS232 AND READ STATUS INTO AX | ||
| 435 | ; | ||
| 436 | ; AH HAS LINE STATUS: | ||
| 437 | ; IF TRANSFER HOLDING REG EMPTY, AND | ||
| 438 | ; IF TRANSMIT SHIFT REGISTER READY, THEN SERIAL PORT | ||
| 439 | ; NOT BUSY | ||
| 440 | CLEAR_TO_SEND EQU 10H | ||
| 441 | DATA_SET_READY EQU 20H ;DATA SET READY LINE HIGH | ||
| 442 | AND AL,CLEAR_TO_SEND+DATA_SET_READY ;SEE IF PRINTER HAS A CHANCE | ||
| 443 | ; $IF Z ;DSR and CTS low, so probably off or out of paper | ||
| 444 | JNZ $$IF1 | ||
| 445 | MOV AH,29H ;PAR 'BUSY' 'OUT OF PAPER' 'I/O ERROR' 'TIME OUT' | ||
| 446 | ; $ELSE | ||
| 447 | JMP SHORT $$EN1 | ||
| 448 | $$IF1: | ||
| 449 | CMP AL,CLEAR_TO_SEND+DATA_SET_READY | ||
| 450 | ; $IF E ;IF clear to send and dsta set ready THEN | ||
| 451 | JNE $$IF3 | ||
| 452 | MOV AH,90H ;'NOT BUSY' 'SELECTED' | ||
| 453 | ; $ELSE ;ELSE clear to send high OR data set ready high | ||
| 454 | JMP SHORT $$EN3 | ||
| 455 | $$IF3: | ||
| 456 | MOV AH,10H ;SET TO PARALLEL 'BUSY' 'SELECTED' | ||
| 457 | ; $ENDIF | ||
| 458 | $$EN3: | ||
| 459 | ; $ENDIF | ||
| 460 | $$EN1: | ||
| 461 | POP DX ;RESTORE REG | ||
| 462 | JMP SHORT POPPER ;RESTORE REGS AND EXIT | ||
| 463 | ; | ||
| 464 | SENDCHAR: | ||
| 465 | MOV AH,1 ;SET TO INT 14 'SEND CHAR' ENTRY PT | ||
| 466 | INT 14H ;GO RS232 SEND CHAR | ||
| 467 | ; | ||
| 468 | POP DX ;RESTORE REG | ||
| 469 | TEST AH,80H ;TEST IF TIMEOUT RS232 ERROR | ||
| 470 | MOV AH,90H ;SET UP NORMAL RETURN AS IF FROM PRINTER | ||
| 471 | ; THAT IS: PARALLEL 'NOT BUSY' 'SELECTED' | ||
| 472 | JZ POPPER ;IF NO ERROR | ||
| 473 | MOV AH,09H ;RESET AH TO PARALLEL TIMEOUT ERROR CODE | ||
| 474 | ; RET CODE='BUSY', 'I/O ERROR', 'TIMEOUT' | ||
| 475 | ; THE USUAL RETURN FROM A WRITE DATA | ||
| 476 | ; TO A PARALLEL PRINTER THAT IS OFFLINE | ||
| 477 | POPPER: | ||
| 478 | POP BX ;RETRIEVE ORIGINAL AX | ||
| 479 | MOV AL,BL ;RESTORE ORIGINAL AL VALUE LEAVING NEW AH | ||
| 480 | POP BX ;RESTORE BX | ||
| 481 | IRET ;RETURN | ||
| 482 | |||
| 483 | ;********************************************************************** | ||
| 484 | PAGE | ||
| 485 | |||
| 486 | PTSFLAG1 DB 0 ;FLAG FOR MODE COMMAND: | ||
| 487 | |||
| 488 | NEW_PTSFLAG EQU PTSFLAG1 - MODETO ;WHEN THIS CODE IS | ||
| 489 | ; RESIDENT THE FLAG WILL BE ACCESSABLE TO | ||
| 490 | ; MODEECHO AS AN OFFSET FROM ADDRESS | ||
| 491 | ; POINTED TO BY VECT14H AND RESSEG | ||
| 492 | ; 0=NO INTERCEPT | ||
| 493 | ; 1=INTERCEPT LPT1 | ||
| 494 | ; 2=INTERCEPT LPT2 | ||
| 495 | ; 3=INTERCEPT LPT1 AND LPT2 | ||
| 496 | ; 4=INTERCEPT LPT3 | ||
| 497 | ; 5=INTERCEPT LPT1 AND LPT3 | ||
| 498 | ; 6=INTERCEPT LPT2 AND LPT3 | ||
| 499 | ; 7=INTERCEPT LPT1, LPT2, AND LPT3 | ||
| 500 | RESFLAG2 EQU $ ;WHERE PTSFLAG2 IS IN THE RESIDENT CODE | ||
| 501 | PTSFLAG2 DB 0 ;FLAG FOR MODE COMMAND: | ||
| 502 | ; LPT1 CORRESPONDENCE VALUE: | ||
| 503 | ; 0=COM1 | ||
| 504 | ; 1=COM2 | ||
| 505 | ; 2=COM3 | ||
| 506 | ; 3=COM4 | ||
| 507 | ;RESFLAG2 EQU (PTSFLAG2 - MODETO)+BASE ;WHERE PTSFLAG2 | ||
| 508 | ; IS IN THE RESIDENT CODE | ||
| 509 | PTSFLAG3 DB 0 ;FLAG FOR MODE COMMAND: | ||
| 510 | ; LPT2 CORRESPONDENCE VALUE: | ||
| 511 | ; 0=COM1 | ||
| 512 | ; 1=COM2 | ||
| 513 | ; 2=COM3 | ||
| 514 | ; 3=COM4 | ||
| 515 | PTSFLAG4 DB 0 ;FLAG FORMODE COMMAND: | ||
| 516 | ; LPT3 CORRESPONDENCE VALUE: | ||
| 517 | ; 0=COM1 | ||
| 518 | ; 1=COM2 | ||
| 519 | ; 2=COM3 | ||
| 520 | ; 3=COM4 | ||
| 521 | |||
| 522 | |||
| 523 | lpt1_retry_type DB 0 ;holder of mask for status return byte ;AN000; | ||
| 524 | lpt2_retry_type DB 0 ;can be one of no_retry_flag, error_status, ;AN000; | ||
| 525 | lpt3_retry_type DB 0 ;busy_status or ready_status, see MODEPRIN ;AN000; | ||
| 526 | |||
| 527 | PUBLIC lpt1_retry_type | ||
| 528 | |||
| 529 | |||
| 530 | ;THE FOLLOWING AREA IS USED BY MODESCRN TO STORE THE VIDEO PARMS THAT | ||
| 531 | ;ALLOW FOR THE SHIFTING RIGHT OR LEFT OF THE SCREEN IMAGE. | ||
| 532 | SCRNTABL DB 16 DUP("PARM") ;64 BYTES OF SPACE | ||
| 533 | NEW_SCRNTABL EQU SCRNTABL - MODETO ;OFFSET INTO RESIDENT | ||
| 534 | ; CODE OF THE 64 BYTE SCREEN TABLE | ||
| 535 | |||
| 536 | request DB 0 ;holder for INT 14 or INT 17 request passed in AH | ||
| 537 | retry_type DW 0 ;holder for INT 14 retry type and shift count | ||
| 538 | |||
| 539 | MODEPTS ENDP | ||
| 540 | |||
| 541 | rescode_length equ (($ - entpt) / 16) + 1 ;length of resident code in paragraphs | ||
| 542 | |||
| 543 | MOVELEN EQU $ - entpt ;length of resident code in bytes | ||
| 544 | |||
| 545 | |||
| 546 | ;******************************************************************************* | ||
| 547 | |||
| 548 | SUBTTL LOAD THE RESIDENT PORTION OF MODE | ||
| 549 | |||
| 550 | PAGE | ||
| 551 | |||
| 552 | |||
| 553 | MODELOAD PROC NEAR | ||
| 554 | PUBLIC MODELOAD | ||
| 555 | ; GET THE CONTENTS OF INT VECTOR 14H | ||
| 556 | ; TO SEE IF THE RESIDENT CODE IS | ||
| 557 | ; ALREADY LOADED | ||
| 558 | ; SET UP REGS TO MOVE IT INTO PLACE | ||
| 559 | PUSH DS ;SAVE SEG REG | ||
| 560 | PUSH ES ;SAVE SEG REG | ||
| 561 | PUSH DI | ||
| 562 | PUSH SI ;SAVE FOR CALLING PROCEDURE | ||
| 563 | PUSH DX ;SAVE FOR CALLING PROCEDURE | ||
| 564 | PUSH AX ;SAVE FOR CALLING PROCEDURE | ||
| 565 | PUSH BX | ||
| 566 | MOV AX,0 ;GET THE PARAGRAPH NUMBER OF DESTINATION | ||
| 567 | MOV ES,AX ; TO THE EXTRA SEGMENT BASE | ||
| 568 | LES DI,ES:RESSEG ;GET POINTER TO RETRY CODE | ||
| 569 | ; IF THE CODE IS NOT ALREADY MOVED, | ||
| 570 | .IF <DI EQ 0> THEN NEAR ;AC000;IF nothing at 50:30 THEN code is not loaded | ||
| 571 | ; | ||
| 572 | ; SINCE CODE HAS NOT YET BEEN MOVED, | ||
| 573 | ; PATCH PROPER ADDRESSES INTO IT | ||
| 574 | |||
| 575 | ; .IF <retry_requested EQ true> AND ;AN000; | ||
| 576 | ; .IF <device_type EQ COMX> THEN ;AN000; | ||
| 577 | ; | ||
| 578 | ; XOR AX,AX | ||
| 579 | ; MOV ES,AX ;BACK TO THE VECTOR AT ZERO | ||
| 580 | ; MOV AX,WORD PTR ES:VECT14H ;GET THE VECTOR OF INT 14H | ||
| 581 | ; MOV VECTOR14+1,AX ; INTO CODE TO BE MOVED | ||
| 582 | ; | ||
| 583 | ; MOV AX,WORD PTR ES:VECT14H[2] ;MOVE REST OF VECTOR | ||
| 584 | ; MOV VECTOR14+3,AX | ||
| 585 | ; | ||
| 586 | ; .ENDIF ;AN000; | ||
| 587 | ; | ||
| 588 | ; .IF <device_type EQ LPTX> AND ;AN000; | ||
| 589 | ; .IF <retry_requested EQ true> OR ;AN000; | ||
| 590 | ; .IF <reroute_requested EQ true> THEN ;AN000; | ||
| 591 | ; | ||
| 592 | ; MOV AX,WORD PTR ES:VECT17H ;GET VECTOR OF INT 17H | ||
| 593 | ; MOV VECTOR17+1,AX ; INTO CODE TO BE MOVED | ||
| 594 | ; | ||
| 595 | ; MOV AX,WORD PTR ES:VECT17H[2] ;MOVE REST OF VECTOR | ||
| 596 | ; MOV VECTOR17+3,AX | ||
| 597 | ; | ||
| 598 | ; .ENDIF ;AN000; | ||
| 599 | |||
| 600 | |||
| 601 | PUSH ES ;SAVE POINTER TO VECTOR ZERO | ||
| 602 | |||
| 603 | ;Get and save previous interrupt handlers | ||
| 604 | |||
| 605 | get_int_vect 14H ;get vector of INT 17H, ES:BX=vector | ||
| 606 | MOV VECTOR14+1,BX ;put offset INTO CODE TO BE MOVED | ||
| 607 | MOV VECTOR14+3,ES ;save segment | ||
| 608 | |||
| 609 | get_int_vect 17H ;get vector of INT 17H, ES:BX=vector | ||
| 610 | MOV VECTOR17+1,BX ;put offset INTO CODE TO BE MOVED | ||
| 611 | MOV VECTOR17+3,ES ;save segment | ||
| 612 | |||
| 613 | |||
| 614 | MOV SI,OFFSET entpt ;WILL BE MOVED FROM HERE | ||
| 615 | MOV DI,OFFSET move_destination ;WILL BE MOVED TO HERE | ||
| 616 | MOV CX,MOVELEN ;NUMBER OF BYTES TO BE MOVED | ||
| 617 | PUSH CS ;GET SEGMENT OF PROGRAM HEADER | ||
| 618 | POP ES ; INTO ES, THE DESTINATION SEGMENT | ||
| 619 | CLD ;INCREMENT SI AND DI AFTER EACH BYTE IS MOVED | ||
| 620 | REP MOVSB ;MOVE CX BYTES FROM DS:SI TO ES:DI | ||
| 621 | POP ES | ||
| 622 | |||
| 623 | |||
| 624 | ;Put a pointer to the resident code 50:30 (0:530) | ||
| 625 | |||
| 626 | CLI ;DISABLE UNTIL VECTOR SET | ||
| 627 | |||
| 628 | MOV ES:WORD PTR resseg,OFFSET modeto ;offset of "modeto" in res code pointer | ||
| 629 | MOV AX,CS | ||
| 630 | SUB AX,adjustment_in_paragraphs ;adjust res CS by amount the code moved | ||
| 631 | MOV ES:WORD PTR resseg[2],AX ;store segment of res code in pointer | ||
| 632 | |||
| 633 | STI ;allow some interrupts | ||
| 634 | |||
| 635 | ;Set interrupts 14 and 17 to point to their respective handlers. AX has correct segment. | ||
| 636 | |||
| 637 | MOV DS,AX ;DS=resident code segment | ||
| 638 | MOV DX,OFFSET modeto ;DS:DX=> INT14 handler "modeto" | ||
| 639 | set_int_vect INT14 | ||
| 640 | |||
| 641 | MOV DX,OFFSET modepts ;DS:DX=> INT17 handler "modepts" | ||
| 642 | set_int_vect INT17 | ||
| 643 | |||
| 644 | MOV ES,CS:environ_seg ;ES=segment of the block to be returned | ||
| 645 | MOV AH,49H ;49 is the Free Allocated Memory function call | ||
| 646 | INT 21H ;free the environment | ||
| 647 | |||
| 648 | MOV BYTE PTR CS:1,27H ;SET EXIT TO REMAIN RESIDENT by dorking opcode in the PSP | ||
| 649 | ; | ||
| 650 | PUSH CS | ||
| 651 | POP DS ;"PRINTF" requires that DS be the segment containing the messages | ||
| 652 | |||
| 653 | DISPLAY MOVED_MSG ;"Resident portion of MODE loaded" | ||
| 654 | MOV BYTE PTR CS:LOADED_YET,1 ;SET FLAG TO INDICATE ABOVE MSG | ||
| 655 | ; HAS BEEN DISPLAYED | ||
| 656 | ; MODESCRN MAY NEED TO REPEAT MESSAGE | ||
| 657 | MOV stay_resident,true | ||
| 658 | .ENDIF ;AC000;END IS CODE ALREADY LOADED? TEST | ||
| 659 | |||
| 660 | POP BX | ||
| 661 | POP AX ;RESTORE FOR CALLING PROCEDURE | ||
| 662 | POP DX ;RESTORE FOR CALLING PROCEDURE | ||
| 663 | POP SI ;RESTORE FOR CALLING PROCEDURE | ||
| 664 | POP DI | ||
| 665 | POP ES ;RESTORE SEG REG | ||
| 666 | POP DS ;RESTORE SEG REG | ||
| 667 | RET | ||
| 668 | MODELOAD ENDP | ||
| 669 | |||
| 670 | ;************************************************************ | ||
| 671 | SUBTTL COMMON PARMAMETER LIST AND WORKAREA | ||
| 672 | PAGE | ||
| 673 | ; THE FOLLOWING AREA IS USED TO STORE PARSED PARAMETER LIST, AND WORK STORAGE | ||
| 674 | ; USED BY OTHER MODULES | ||
| 675 | |||
| 676 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ N O N R E S I D E N T D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 677 | ;º º | ||
| 678 | |||
| 679 | CTRL_ST DB 5 DUP(24) ;PRINTER CONFIGURATION CONTROL STRING | ||
| 680 | PARM1 DB 10 DUP(0) | ||
| 681 | PARM2 DB -1 ;-1 INDICATES TO SERVER THAT THIS PARM IS UNCHANGED | ||
| 682 | PARM3 DB 0 | ||
| 683 | MODE DB 0 | ||
| 684 | FLAG DB 0 | ||
| 685 | INDEX DW 00 ;REDIRECTED PRINTER NETWORK REDIRECTION LIST INDEX | ||
| 686 | IS_LOCAL DB TRUE ;INITIALIZE for MODEPRIN | ||
| 687 | LOADED_YET DB false | ||
| 688 | LOCAL_NAME DB 16 DUP(0) ;HOLDING AREA FOR GET ASSIGN LIST ENTRY CALL USE | ||
| 689 | machine_type DB 0FFH ;holder for the machine type | ||
| 690 | NOERROR DB TRUE ;INDICATE NO ERROR MESSAGES HAVE BEEN ISSUED YET | ||
| 691 | NEW_VIDEO_PARMS_OFFSET DW 090H ;OFFSET OF INIT TABLE FOR SCREEN SHIFTING | ||
| 692 | NEW_VIDEO_PARMS_SEGMENT DW 040H ;SEGMENT OF INIT TABLE FOR SCREEN SHIFTING | ||
| 693 | REMOTE_DEV DB 50 DUP(0) ;HOLDING AREA FOR GET ASSIGN LIST ENTRY CALL USE | ||
| 694 | stay_resident DB false ;boolean indicating should stay resident when terminate | ||
| 695 | submodel_byte DB 0FFH ;secondary model byte | ||
| 696 | |||
| 697 | |||
| 698 | ;º º | ||
| 699 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ N O N R E S I D E N T D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 700 | |||
| 701 | |||
| 702 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 703 | ;º º | ||
| 704 | |||
| 705 | PUBLIC PARM1,PARM2,PARM3,MODE,FLAG,CTRL_ST,INDEX,LOCAL_NAME,REMOTE_DEV ;AC000; | ||
| 706 | PUBLIC IS_LOCAL | ||
| 707 | PUBLIC LOADED_YET | ||
| 708 | PUBLIC machine_type ;holder for machine type, found in "main" | ||
| 709 | PUBLIC NOERROR | ||
| 710 | PUBLIC NEW_VIDEO_PARMS_OFFSET | ||
| 711 | PUBLIC NEW_VIDEO_PARMS_SEGMENT | ||
| 712 | PUBLIC stay_resident | ||
| 713 | |||
| 714 | ;º º | ||
| 715 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 716 | |||
| 717 | PRINTF_CODE ENDS | ||
| 718 | END ENTPT | ||
| 719 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/SCRNTAB.ASM b/v4.0/src/CMD/MODE/SCRNTAB.ASM new file mode 100644 index 0000000..50de85b --- /dev/null +++ b/v4.0/src/CMD/MODE/SCRNTAB.ASM | |||
| @@ -0,0 +1,121 @@ | |||
| 1 | .SALL | ||
| 2 | PAGE ,132 ; | ||
| 3 | TITLE SCRNTABL.ASM - SCREEN SHIFT TABLE CONTROL FOR MODE COMMAND | ||
| 4 | |||
| 5 | |||
| 6 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 7 | ;º º | ||
| 8 | |||
| 9 | SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG | ||
| 10 | |||
| 11 | PUSH AX | ||
| 12 | MOV AX,VALUE | ||
| 13 | MOV REG,AX | ||
| 14 | POP AX | ||
| 15 | |||
| 16 | ENDM | ||
| 17 | |||
| 18 | ;º º | ||
| 19 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 20 | |||
| 21 | |||
| 22 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 23 | ;º º | ||
| 24 | |||
| 25 | ROM_BIOS_SEG EQU 0F000H ;USED TO ADDRESS INIT TABLE IN ROM | ||
| 26 | VIDEO_VECTOR EQU 74H ;OFFSET INTO VECTOR TABLE (SEG=0) | ||
| 27 | ;TO DOUBLE WORD POINTER TO VIDEO PARMS | ||
| 28 | VIDEO_PARMS_WORD_LEN EQU 32 ;NO. WORDS IN VIDEO PARM AREA | ||
| 29 | |||
| 30 | ;º º | ||
| 31 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 32 | |||
| 33 | |||
| 34 | PRINTF_CODE SEGMENT PUBLIC | ||
| 35 | ASSUME DS:NOTHING, CS:PRINTF_CODE | ||
| 36 | |||
| 37 | |||
| 38 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 39 | ;º º | ||
| 40 | |||
| 41 | EXTRN MODELOAD:NEAR | ||
| 42 | EXTRN RESSEG:DWORD ;ADD OF POINTER TO RESIDENT CODE | ||
| 43 | EXTRN NEW_SCRNTABL:ABS ;OFFSET OF INIT TABLE WITHIN THE RESIDENT CODE | ||
| 44 | EXTRN NEW_VIDEO_PARMS_OFFSET:WORD | ||
| 45 | EXTRN NEW_VIDEO_PARMS_SEGMENT:WORD | ||
| 46 | |||
| 47 | ;º º | ||
| 48 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 49 | |||
| 50 | |||
| 51 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 52 | ;º º | ||
| 53 | ;º º | ||
| 54 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 55 | |||
| 56 | |||
| 57 | |||
| 58 | ROM_BIOS SEGMENT AT 0F000H | ||
| 59 | |||
| 60 | ORG 0FFFEH | ||
| 61 | |||
| 62 | MACHINE_TYPE LABEL BYTE ;MACHINE TYPE BURNED IN ROM | ||
| 63 | |||
| 64 | ROM_BIOS ENDS | ||
| 65 | |||
| 66 | PAGE | ||
| 67 | ;********************************************************************************************* | ||
| 68 | |||
| 69 | SCRNTAB PROC NEAR | ||
| 70 | PUBLIC SCRNTAB | ||
| 71 | ; GO TO THE 64 BYTES POINTED TO BY THE VECTOR AT 0:74H AND MOVE A COPY | ||
| 72 | ; OF THESE BYTES TO THE MODE COMMAND RESIDENT AREA LEAVING DS POINTING TO | ||
| 73 | ; THE SEGMENT OF THE TABLE, AND BX CONTAINING THE OFFSET OF THE TABLE. | ||
| 74 | ; BIGTOP BIOS OVERWRITES AREA AT 40:90, AS DO OTHER APPS SO MUST LOAD THE | ||
| 75 | ; TABLE INTO MODE'S RESIDENT CODE. | ||
| 76 | |||
| 77 | PUSH ES ;SAVE ADDR OF PROGRAM HEADER PREFIX AREA | ||
| 78 | MOV AX,0 ;ADDR OF VECTOR TABLE | ||
| 79 | MOV DS,AX ;SET DATA SEGMENT TO 0 MEMORY | ||
| 80 | MOV BX,DS:VIDEO_VECTOR+2 ;SEGMENT OF VIDEO PARMS | ||
| 81 | CMP BX,ROM_BIOS_SEG | ||
| 82 | ;$IF E ;IF haven't moved the table THEN | ||
| 83 | JNE $$IF1 | ||
| 84 | ;load the resident code | ||
| 85 | PUSH DS | ||
| 86 | SET DS,CS ;MODELOAD DEPENDS ON DS BEING SEG OF TO BE RES CODE | ||
| 87 | CALL MODELOAD ;LOAD RESIDENT CODE OVERLAYING PSP | ||
| 88 | POP DS ;RESTORE TO SEGMENT 0 | ||
| 89 | ;Save address of resident code | ||
| 90 | SET CS:NEW_VIDEO_PARMS_SEGMENT,< WORD PTR DS:RESSEG+2 > | ||
| 91 | MOV AX,WORD PTR DS:RESSEG ;AX=offset of MODETO within resident code | ||
| 92 | ADD AX,NEW_SCRNTABL ;AX=OFFSET OF VIDEO PARMS FROM RES CODE SEG | ||
| 93 | MOV WORD PTR CS:NEW_VIDEO_PARMS_OFFSET,AX ;SEE "RESCODE" | ||
| 94 | |||
| 95 | MOV DI,AX ;DI=NEW_VIDEO_PARMS_OFFSET, SET UP ES:DI FOR MOVSW INSTRUCTION | ||
| 96 | MOV AX,CS:NEW_VIDEO_PARMS_SEGMENT | ||
| 97 | MOV ES,AX ;ES=RESIDENT CODE SEGMENT | ||
| 98 | MOV SI,DS:VIDEO_VECTOR ;GET SEGMENT OF VIDEO PARMS | ||
| 99 | MOV DS:VIDEO_VECTOR,DI ;CHANGE VIDEO OFFSET | ||
| 100 | MOV DS:VIDEO_VECTOR+2,ES ;CHANGE VIDEO SEGMENT | ||
| 101 | MOV DS,BX ;CHANGE DS TO ROM SEGMENT | ||
| 102 | MOV CX,VIDEO_PARMS_WORD_LEN ;COUNT TO MOVE 32 WORDS | ||
| 103 | CLD ;INCREMENT SI AND DI WHILE MOVING THE TABLE | ||
| 104 | REP MOVSW ;MOVE 64 BYTES VIDEO PARMS TO RES AREA | ||
| 105 | |||
| 106 | ;$ENDIF ;I HAVE MOVED IT YET | ||
| 107 | $$IF1: | ||
| 108 | |||
| 109 | SET DS,0 | ||
| 110 | LDS BX,DS:RESSEG ;DS:BX POINTS TO RESIDENT CODE | ||
| 111 | ADD BX,NEW_SCRNTABL ;DS:BX POINTS TO NEW VIDEO TABLE | ||
| 112 | |||
| 113 | POP ES ;RESTORE ADDR OF PROGRAM HEADER PREFIX | ||
| 114 | RET ;RETURN TO MODESCRN PROC | ||
| 115 | |||
| 116 | SCRNTAB ENDP | ||
| 117 | |||
| 118 | |||
| 119 | PRINTF_CODE ENDS | ||
| 120 | END | ||
| 121 | \ No newline at end of file | ||
diff --git a/v4.0/src/CMD/MODE/TYPAMAT.ASM b/v4.0/src/CMD/MODE/TYPAMAT.ASM new file mode 100644 index 0000000..a2447ae --- /dev/null +++ b/v4.0/src/CMD/MODE/TYPAMAT.ASM | |||
| @@ -0,0 +1,263 @@ | |||
| 1 | .XLIST | ||
| 2 | INCLUDE STRUC.INC | ||
| 3 | .LIST | ||
| 4 | .SALL | ||
| 5 | PAGE ,132 ; | ||
| 6 | TITLE TYPAMAT.SAL - TYPAMATIC RATE AND DELAY CONTROL FOR MODE COMMAND | ||
| 7 | |||
| 8 | |||
| 9 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 10 | ;³ | ||
| 11 | ;³ SET_TYPAMATIC | ||
| 12 | ;³ ------------- | ||
| 13 | ;³ Translate the input parameters into BIOS digestable values and make the | ||
| 14 | ;³ required calls. Typamatic support in BIOS exists only in machines with | ||
| 15 | ;³ BIOS dated 11/15/85 or later, XT286 and all PS/2 products. | ||
| 16 | ;³ | ||
| 17 | ;³ | ||
| 18 | ;³; INPUT: A binary value from 1 to 32 indicating the typamatic rate | ||
| 19 | ;³ desired and a binary value from 1 to 4 indicating the delay. | ||
| 20 | ;³ Status is not supported on machines known today. | ||
| 21 | ;³ The translation of the typamatic value to BIOS | ||
| 22 | ;³ input is 32 - r where 'r' is the input value. The translation | ||
| 23 | ;³ from 'd' the input delay value to the BIOS is d - 1. 'r' | ||
| 24 | ;³ is passed in BL, 'd' is passed in BH. | ||
| 25 | ;³ | ||
| 26 | ;³ RETURN: none | ||
| 27 | ;³ | ||
| 28 | ;³ | ||
| 29 | ;³ MESSAGES: none | ||
| 30 | ;³ | ||
| 31 | ;³ | ||
| 32 | ;³ | ||
| 33 | ;³ REGISTER | ||
| 34 | ;³ USAGE AND | ||
| 35 | ;³ COMVENTIONS: BX is used to pass parameters to BIOS | ||
| 36 | ;³ The names used to represent the valid machines are: AT3, XT286, | ||
| 37 | ;³ PS2Model30, PS2Model50, PS2Model60 and PS2Model80. | ||
| 38 | ;³ | ||
| 39 | ;³ ASSUMPTIONS: Input values are valid. | ||
| 40 | ;³ | ||
| 41 | ;³ | ||
| 42 | ;³ SIDE EFFECT: | ||
| 43 | ;³ | ||
| 44 | ;³ | ||
| 45 | ;³ ùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùù | ||
| 46 | ;³ | ||
| 47 | ;³ BEGIN | ||
| 48 | ;³ | ||
| 49 | ;³ IF (machine_type>AT) OR ((machine_type=AT) AND (BIOS_date >= 11/15/85)) OR | ||
| 50 | ;³ (machine_type=XT286) THEN | ||
| 51 | ;³ IF typamatic_rate <> 0 THEN ³ | ||
| 52 | ;³ MOV BL,32-BL ;translate typamatic rate ³ | ||
| 53 | ;³ ELSE ³ | ||
| 54 | ;³ MOV BL,previous_typamatic_rate ;not specified so no change ³ | ||
| 55 | ;³ ENDIF ³ | ||
| 56 | ;³ IF delay <> 0 THEN ³ | ||
| 57 | ;³ SUB BH,1 ;translate delay ³ | ||
| 58 | ;³ ELSE ³ | ||
| 59 | ;³ MOV BH,previous_delay_rate ³ | ||
| 60 | ;³ ENDIF ³ | ||
| 61 | ;³ MOV AH,set_typamatic_rate_and_delay ;INT 16 set typamatic function ³ | ||
| 62 | ;³ MOV AL,typamatic_function ;set typamatic subfunction ³ | ||
| 63 | ;³ INT 16H ³ | ||
| 64 | ;³ ELSE ³ | ||
| 65 | ;³ queue Function_not_supported ³ | ||
| 66 | ;³ ENDIF ³ | ||
| 67 | ;³ ³ | ||
| 68 | ;³ END ³ | ||
| 69 | ;³ | ||
| 70 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ | ||
| 71 | |||
| 72 | |||
| 73 | |||
| 74 | |||
| 75 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 76 | ;º º | ||
| 77 | |||
| 78 | |||
| 79 | |||
| 80 | DISPLAY MACRO MESSAGE | ||
| 81 | MOV DX,OFFSET MESSAGE | ||
| 82 | CALL PRINTF | ||
| 83 | ENDM | ||
| 84 | |||
| 85 | SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG | ||
| 86 | |||
| 87 | PUSH AX | ||
| 88 | MOV AX,VALUE | ||
| 89 | MOV REG,AX | ||
| 90 | POP AX | ||
| 91 | |||
| 92 | ENDM | ||
| 93 | |||
| 94 | ;º º | ||
| 95 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 96 | |||
| 97 | |||
| 98 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 99 | ;º º | ||
| 100 | |||
| 101 | get_installed_state EQU 0 ;function of MODE INT 2FH handler | ||
| 102 | get_typamatic_delay EQU 04 ;function of MODE INT 2FH handler | ||
| 103 | get_typamatic_rate EQU 03 ;function of MODE INT 2FH handler | ||
| 104 | installed EQU 0FFH ;return from MODE INT 2FH handler | ||
| 105 | no_previous_setting EQU 0FFH ;return from MODE INT 2FH handler get setting call | ||
| 106 | one_half_second EQU 01 ;value for BIOS INT 16H | ||
| 107 | resident_MODE EQU 0AFH ;INT 2F multiplex number for resident part of MODE | ||
| 108 | save_typamatic_delay EQU 02 ;function of MODE INT 2FH handler | ||
| 109 | save_typamatic_rate EQU 01 ;function of MODE INT 2FH handler | ||
| 110 | set_typamatic_rate_and_delay EQU 3 | ||
| 111 | typamatic_function EQU 5 | ||
| 112 | ten_chars_per_second EQU 0CH ;value for BIOS INT 16H | ||
| 113 | |||
| 114 | INCLUDE modequat.inc ;definitions of machine types | ||
| 115 | include version.inc ; defines version of DOS to be built | ||
| 116 | |||
| 117 | ;º º | ||
| 118 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 119 | |||
| 120 | |||
| 121 | PRINTF_CODE SEGMENT PUBLIC | ||
| 122 | ASSUME DS:NOTHING, CS:PRINTF_CODE | ||
| 123 | |||
| 124 | |||
| 125 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 126 | ;º º | ||
| 127 | |||
| 128 | EXTRN PRINTF:NEAR | ||
| 129 | EXTRN MACHINE_TYPE:BYTE ;MACHINE TYPE as determined by "modeleng" | ||
| 130 | ;EXTRN typamatic_rate_set_to:WORD | ||
| 131 | ;EXTRN chars_per_second:WORD | ||
| 132 | EXTRN noerror:BYTE | ||
| 133 | ;EXTRN no_previous_typamatic_rate:WORD | ||
| 134 | EXTRN Function_not_supported:BYTE ;see modedefs.inc | ||
| 135 | ;EXTRN delay_set_to:WORD | ||
| 136 | ;EXTRN second:WORD | ||
| 137 | ;EXTRN no_previous_delay_setting:WORD | ||
| 138 | ;EXTRN delay_set_to_one_half_second:WORD | ||
| 139 | |||
| 140 | ;º º | ||
| 141 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 142 | |||
| 143 | |||
| 144 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 145 | ;º º | ||
| 146 | |||
| 147 | thirty_two DB 20H ;adjustment and work area for typamatic rate | ||
| 148 | |||
| 149 | ;º º | ||
| 150 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 151 | |||
| 152 | |||
| 153 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 154 | ;º º | ||
| 155 | ;º º | ||
| 156 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 157 | |||
| 158 | |||
| 159 | |||
| 160 | |||
| 161 | PAGE | ||
| 162 | ;********************************************************************************************* | ||
| 163 | |||
| 164 | TYPAMAT PROC NEAR | ||
| 165 | PUBLIC TYPAMAT | ||
| 166 | |||
| 167 | if IBMCOPYRIGHT | ||
| 168 | .IF <machine_type EQ AT4> OR | ||
| 169 | .IF <machine_type EQ XT286> OR | ||
| 170 | ;.IF <machine_type EQ AT> OR | ||
| 171 | .IF <machine_type EQ PS2Model30> OR | ||
| 172 | .IF <machine_type EQ PS2Model50> OR | ||
| 173 | .IF <machine_type EQ PS2Model60> OR | ||
| 174 | .IF <machine_type EQ PS2Model80> THEN | ||
| 175 | endif | ||
| 176 | ; MOV AH,resident_MODE | ||
| 177 | ; MOV AL,get_installed_state | ||
| 178 | ; INT 2FH | ||
| 179 | ; CMP AL,installed | ||
| 180 | ; .IF NE ;IF the code is not resident THEN | ||
| 181 | ; CALL modeload ;make it resident | ||
| 182 | ; .ENDIF ;ENDIF | ||
| 183 | ; CMP BL,0 ;CASE typamatic_rate OF | ||
| 184 | ; .IF GT greater than zero: | ||
| 185 | SUB thirty_two,BL ; MOV BL,32-BL ;translate typamatic rate | ||
| 186 | MOV BL,thirty_two | ||
| 187 | |||
| 188 | ; DISPLAY typamatic_rate_set_to,BL | ||
| 189 | ; DISPLAY chars_per_second | ||
| 190 | |||
| 191 | ; .ELSEIF EQ ; zero: | ||
| 192 | ; MOV AH,resident_MODE | ||
| 193 | ; MOV AL,get_typamatic_rate ; MOV BL,previous_typamatic_rate ;not specified so no change | ||
| 194 | ; INT 2FH | ||
| 195 | ; CMP BL,no_previous_setting | ||
| 196 | ; .IF E | ||
| 197 | ; DISPLAY no_previous_typamatic_rate | ||
| 198 | ; DISPLAY typamatic_set_to_ten_chars_per_second | ||
| 199 | ; MOV BL,ten_chars_per_second | ||
| 200 | ; .ENDIF | ||
| 201 | ; .ELSE ; less than zero: | ||
| 202 | ; MOV AH,resident_MODE | ||
| 203 | ; MOV AL,get_typamatic_rate ; return setting in BL | ||
| 204 | ; INT 2FH | ||
| 205 | ; .IF <BL EQ no_previous_setting> THEN | ||
| 206 | ; DISPLAY no_previous_typamatic_rate | ||
| 207 | ; .ELSE | ||
| 208 | ; SUB thirty_two,BL | ||
| 209 | ; MOV BL,thirty_two ; translate to humanese | ||
| 210 | ; .ENDIF | ||
| 211 | ; .ENDIF ;ENDCASE | ||
| 212 | ; CMP BH,0 ;CASE delay OF | ||
| 213 | ; .IF GT >zero: | ||
| 214 | DEC BH ; SUB BH,1 ;translate delay | ||
| 215 | |||
| 216 | |||
| 217 | ; DISPLAY delay_set_to_?_second | ||
| 218 | |||
| 219 | |||
| 220 | ; .ELSEIF EQ ; zero: | ||
| 221 | ; MOV AH,resident_MODE | ||
| 222 | ; MOV AL,get_typamatic_delay ; MOV BH,previous_delay_rate | ||
| 223 | ; INT 2FH | ||
| 224 | ; CMP BH,no_previous_setting | ||
| 225 | ; .IF E | ||
| 226 | ; DISPLAY no_previous_delay_setting | ||
| 227 | ; DISPLAY delay_set_to_one_half_second | ||
| 228 | ; MOV BH,one_half_second | ||
| 229 | ; .ENDIF | ||
| 230 | ; .ELSE ; <zero: | ||
| 231 | ; MOV AH,resident_MODE | ||
| 232 | ; MOV AL,get_typamatic_rate ; return setting in BH | ||
| 233 | ; INT 2FH | ||
| 234 | ; .IF <BH EQ no_previous_setting> THEN | ||
| 235 | ; DISPLAY no_previous_delay_setting | ||
| 236 | ; .ELSE | ||
| 237 | ; INC BH | ||
| 238 | ; .ENDIF | ||
| 239 | ; .ENDIF ;ENDCASE | ||
| 240 | ; MOV AH,resident_MODE | ||
| 241 | ; MOV AL,save_typamatic_rate | ||
| 242 | ; INT 2FH | ||
| 243 | ; MOV AH,resident_MODE | ||
| 244 | ; MOV AL,save_typamatic_delay | ||
| 245 | ; INT 2FH | ||
| 246 | MOV AH,set_typamatic_rate_and_delay ;MOV AH,set_typamatic_rate_and_delay ;INT 16 set typamatic function | ||
| 247 | MOV AL,typamatic_function ;MOV AL,typamatic_function ;set typamatic subfunction | ||
| 248 | INT 16H ;INT 16H | ||
| 249 | if IBMCOPYRIGHT | ||
| 250 | .ELSE | ||
| 251 | DISPLAY Function_not_supported | ||
| 252 | MOV noerror,false | ||
| 253 | .ENDIF | ||
| 254 | endif | ||
| 255 | |||
| 256 | RET | ||
| 257 | |||
| 258 | TYPAMAT ENDP | ||
| 259 | |||
| 260 | |||
| 261 | PRINTF_CODE ENDS | ||
| 262 | END | ||
| 263 | \ No newline at end of file | ||