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/DEV/DISPLAY/INT2FCOM.INC | |
| 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/DEV/DISPLAY/INT2FCOM.INC')
| -rw-r--r-- | v4.0/src/DEV/DISPLAY/INT2FCOM.INC | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/INT2FCOM.INC b/v4.0/src/DEV/DISPLAY/INT2FCOM.INC new file mode 100644 index 0000000..c6007a6 --- /dev/null +++ b/v4.0/src/DEV/DISPLAY/INT2FCOM.INC | |||
| @@ -0,0 +1,323 @@ | |||
| 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2 | ; INTERRUPT 2F HEX COMMUNICATION ROUTINE | ||
| 3 | ; | ||
| 4 | ; This routine is used to communicate between the CON driver | ||
| 5 | ; and the Keyboard routine. The various calls are as follows: | ||
| 6 | ; | ||
| 7 | ; 1) not yet defined | ||
| 8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 9 | IF1 ; | ||
| 10 | %OUT . ŽINT2FCOM.INC¯ | ||
| 11 | ENDIF ; | ||
| 12 | PUBLIC ROM_INT_2F ; | ||
| 13 | PUBLIC INT_2F_COM ; | ||
| 14 | PUBLIC ABORT ; | ||
| 15 | ; | ||
| 16 | CON_REQ LABEL WORD ; THESE CALLS START AT '00H' | ||
| 17 | DW OFFSET CON_INSTALL ; | ||
| 18 | DW OFFSET CON_INVOKE ; | ||
| 19 | DW OFFSET CON_QUERY_CP ; | ||
| 20 | DW OFFSET CON_QUERY_PARAMETER ; | ||
| 21 | CON_MAX EQU ($-CON_REQ)/2 ; | ||
| 22 | ; | ||
| 23 | QPARM_TABLE LABEL WORD ; | ||
| 24 | DW OFFSET CPD_DESG_N ; | ||
| 25 | DW OFFSET CPD_FONTS_N ; | ||
| 26 | DW OFFSET CPD_HDWR_N ; | ||
| 27 | QPARM_ENTRY EQU ($-QPARM_TABLE)/2 ; | ||
| 28 | ; | ||
| 29 | ROM_INT_2F DW ? ; Int 2FH vector offset | ||
| 30 | DW ? ; Int 2FH vector segment | ||
| 31 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 32 | ; | ||
| 33 | ; INTERRUPT 2F HEX | ||
| 34 | ; | ||
| 35 | ; Communication between the KEYBOARD (KEYB.COM) and the | ||
| 36 | ; CON Device Driver. | ||
| 37 | ; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | INT_2F_COM PROC FAR ; | ||
| 40 | STI ; | ||
| 41 | CMP AH,0ADH ; TEST THE SUBFUNCTION CALL | ||
| 42 | JNE I2C_6 ; RESERVED FOR THE COM PATH! | ||
| 43 | ; | ||
| 44 | CMP AL,10H ; WGR ;AN000; | ||
| 45 | JNE I2C_0 ; WGR ;AN000; | ||
| 46 | CALL CHECK_VALID ; WGR ;AN000; | ||
| 47 | PUSH SI ; WGR ;AN000; | ||
| 48 | JMP I2C_1 ; WGR ;AN000; | ||
| 49 | I2C_0: ; WGR | ||
| 50 | CMP AL,CON_MAX ; TEST IF IT IS ABOVE HIGH | ||
| 51 | JAE I2C_6 ; CON CALL? | ||
| 52 | ; | ||
| 53 | PUSH SI ; FORMULATE THE JUMP POINTER | ||
| 54 | PUSH AX ; | ||
| 55 | XOR AH,AH ; | ||
| 56 | MOV SI,AX ; | ||
| 57 | POP AX ; | ||
| 58 | ADD SI,SI ; | ||
| 59 | CALL CS:CON_REQ[SI] ; call routine to handle the command | ||
| 60 | I2C_1: ; | ||
| 61 | PUSH AX ; SAVE AX REGISTER TO PLAY WITH STACK | ||
| 62 | MOV SI,SP ; | ||
| 63 | MOV AX,SS:[SI+8] ; ACCOUNT FOR SI & AX ON STACK | ||
| 64 | JC I2C_2 ; | ||
| 65 | AND AX,NOT_CY ; | ||
| 66 | JUMP I2C_3 ; | ||
| 67 | I2C_2: OR AX,CY ; | ||
| 68 | I2C_3: MOV SS:[SI+8],AX ; | ||
| 69 | POP AX ; | ||
| 70 | POP SI ; | ||
| 71 | ABORT: IRET ; | ||
| 72 | I2C_6: JMP DWORD PTR CS:ROM_INT_2F ; | ||
| 73 | INT_2F_COM ENDP ; | ||
| 74 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 75 | ; | ||
| 76 | ; CON_INSTALL | ||
| 77 | ; | ||
| 78 | ; A STRAIGHT FORWARD ROUTINE WHICH INDICATES WHETHER OR NOT | ||
| 79 | ; ANY PC DOS CPS-CON SUPPORT WAS LOADED DURING BOOTSTRAP. | ||
| 80 | ; THE INTERFACE IS AS PER 'DOS FUNCTIONAL SPEC' | ||
| 81 | ; (Program Interfaces). | ||
| 82 | ; | ||
| 83 | ; INPUT: | ||
| 84 | ; none | ||
| 85 | ; | ||
| 86 | ; OUTPUT: | ||
| 87 | ; AX = (-1) if loaded | ||
| 88 | ; no change if not....since this is not even loaded! | ||
| 89 | ; BX = [upper nibble][lower nibble] = MAJOR - MINOR | ||
| 90 | ; release number. | ||
| 91 | ; | ||
| 92 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 93 | CON_INSTALL PROC ; | ||
| 94 | MOV AX,-1 ; CHANGE AX TO '0FFFFH' AND BX TO | ||
| 95 | MOV BX,0100H ; MAJOR - MINOR VERSION # | ||
| 96 | CLC ; NO ERROR TO INDICATE.... | ||
| 97 | RET ; | ||
| 98 | CON_INSTALL ENDP ; | ||
| 99 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 100 | ; | ||
| 101 | ; CHECK_VALID | ||
| 102 | ; | ||
| 103 | ; THIS ROUTINE CHECKS TO SEE IF THE CURRENT CODE PAGE HAS BEEN | ||
| 104 | ; PREPARED FOR AN 8X8 RAM FONT. THIS IS AN INTERFACE TO ANSI.SYS | ||
| 105 | ; TO ENSURE THAT A REQUEST FOR > 25 LINES IS VALID. | ||
| 106 | ; | ||
| 107 | ; INPUT: | ||
| 108 | ; none | ||
| 109 | ; | ||
| 110 | ; OUTPUT: | ||
| 111 | ; CF = 1 IF NOT FONT NOT AVAILABLE | ||
| 112 | ; = 0 IF FONT IS AVAILABLE. | ||
| 113 | ; | ||
| 114 | ; AUTHOR: WGR | ||
| 115 | ; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | CHECK_VALID PROC ; ;AN000; | ||
| 118 | CMP CS:CPD_ACTIVE,-1 ; see if a code page has been.. ;AN000; | ||
| 119 | JNE CV_1 ; selected? ;AN000; | ||
| 120 | CLC ; no..therefore hardware code page.. ;AN000; | ||
| 121 | JMP CV_4 ; okay...exit with carry clear. ;AN000; | ||
| 122 | CV_1: ; ;AN000; | ||
| 123 | PUSH BX ; s ;AN000; | ||
| 124 | PUSH CX ; a ;AN000; | ||
| 125 | PUSH DX ; v ;AN000; | ||
| 126 | PUSH DI ; e ;AN000; | ||
| 127 | PUSH SI ; r ;AN000; | ||
| 128 | PUSH DS ; e ;AN000; | ||
| 129 | PUSH ES ; g ;AN000; | ||
| 130 | PUSH CS ; s. ;AN000; | ||
| 131 | POP DS ; establish addressibility to data ;AN000; | ||
| 132 | MOV CX,CPD_ACTIVE ; use active code page... ;AN000; | ||
| 133 | CALL FIND_CP ; is the code page prepared? ;AN000; | ||
| 134 | JC CV_3 ; no....problem..exit with carry set. ;AN000; | ||
| 135 | CMP CX,0 ; okay...check if hardware code page? ;AN000; | ||
| 136 | JNE CV_2 ; ;AN000; | ||
| 137 | CLC ; yes...so okay...exit with carry clear;AN000; | ||
| 138 | JMP CV_3 ; ;AN000; | ||
| 139 | CV_2: ; ;AN000; | ||
| 140 | MOV DL,CS:BYTES_PER_CHAR ; save current box size.. ;AN000; | ||
| 141 | PUSH DX ; ;AN000; | ||
| 142 | MOV CS:BYTES_PER_CHAR,8 ; check for 8x8 box (>25 line support) ;AN000; | ||
| 143 | CALL FIND_FONT ; is font size there?? ;AN000; | ||
| 144 | POP DX ; ;AN000; | ||
| 145 | MOV CS:BYTES_PER_CHAR,DL ; restore old box size...FIND_FONT... ;AN000; | ||
| 146 | CV_3: ; will have returned.. ;AN000; | ||
| 147 | POP ES ; with carry set appropriately ;AN000; | ||
| 148 | POP DS ; ;AN000; | ||
| 149 | POP SI ; restore ;AN000; | ||
| 150 | POP DI ; ;AN000; | ||
| 151 | POP DX ; registers. ;AN000; | ||
| 152 | POP CX ; ;AN000; | ||
| 153 | POP BX ; ;AN000; | ||
| 154 | CV_4: ; ;AN000; | ||
| 155 | RET ; return. ;AN000; | ||
| 156 | CHECK_VALID ENDP ; ;AN000; | ||
| 157 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 158 | ; | ||
| 159 | ; CON_INVOKE | ||
| 160 | ; | ||
| 161 | ; THIS ROUTINE IS A SECOND INTERFACE TO THE CPS CON DEVICE | ||
| 162 | ; TO ACTIVATE A PARTICULAR CODE PAGE. THIS MAKE USE OF THE | ||
| 163 | ; SAME ROUTINES AS THE GENERIC IOCTL CALLS (via INT 21H). | ||
| 164 | ; A SEMAPHORE IS PROVIDED BY THE IOCTL CALLS TO PREVENT | ||
| 165 | ; RE-ENTRANCY....WHICH MAY CAUSE INTERESTING RESULTS!! | ||
| 166 | ; | ||
| 167 | ; INPUT: | ||
| 168 | ; BX = code page to activate | ||
| 169 | ; | ||
| 170 | ; OUTPUT: | ||
| 171 | ; CY = 0 if CP was activated | ||
| 172 | ; 1 if an error occurred during activation | ||
| 173 | ; | ||
| 174 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 175 | CON_INVOKE PROC ; | ||
| 176 | PUSH DS ; | ||
| 177 | PUSH ES ; | ||
| 178 | CMP CS:G_IOCTL_SEMA,ONE ; ARE GENERIC IOCTL ROUTINES ACTIVE??? | ||
| 179 | JE CI_3 ; IF SO, THEN EXIT WITH ERROR... | ||
| 180 | ; | ||
| 181 | PUSH CS ; | ||
| 182 | POP DS ; | ||
| 183 | PUSH CS ; | ||
| 184 | POP ES ; | ||
| 185 | PUSH CPD_ACTIVE ; | ||
| 186 | MOV CPD_ACTIVE,BX ; SET THE ACTIVE CP = REQUESTED | ||
| 187 | CALL TEST_CP ; FIND OUT IF CP IS THERE.... | ||
| 188 | POP CPD_ACTIVE ; | ||
| 189 | JC CI_3 ; IF CY=1, THEN LEAVE OLD CP ALONE! | ||
| 190 | CALL INVOKE_DATA ; LOAD THE DATA.... | ||
| 191 | JC CI_3 ; IF ERROR, THEN FONT NOT AVAILABLE | ||
| 192 | MOV CPD_ACTIVE,BX ; | ||
| 193 | PUSH DX ; | ||
| 194 | MOV DX,BX ; | ||
| 195 | CALL SIGNAL_KBD_INVK ; | ||
| 196 | POP DX ; | ||
| 197 | JC CI_3 ; SET CARRY IF KEYBOARD ERROR OCCURRED. | ||
| 198 | CLC ; NO ERROR TO INDICATE.... | ||
| 199 | POP ES ; | ||
| 200 | POP DS ; | ||
| 201 | RET ; | ||
| 202 | CI_3: STC ; | ||
| 203 | POP ES ; | ||
| 204 | POP DS ; | ||
| 205 | RET ; | ||
| 206 | CON_INVOKE ENDP ; | ||
| 207 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 208 | ; | ||
| 209 | ; CON_QUERY_CP | ||
| 210 | ; | ||
| 211 | ; RETURNS THE ACTIVE CODE PAGE VALUE....CPD_ACTIVE VALUE | ||
| 212 | ; CHECKED FOR INVALID. | ||
| 213 | ; | ||
| 214 | ; INPUT: | ||
| 215 | ; none | ||
| 216 | ; OUTPUT: | ||
| 217 | ; BX = CODE PAGE ACTIVATED <-1 IF NONE ACTIVE> | ||
| 218 | ; CY = 1 IF CP INVALID (BX = -1) | ||
| 219 | ; 0 IF CP VALID | ||
| 220 | ; | ||
| 221 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 222 | CON_QUERY_CP PROC ; | ||
| 223 | MOV BX,CS:CPD_ACTIVE ; | ||
| 224 | CMP BX,-1 ; | ||
| 225 | JNE CQCP_0 ; | ||
| 226 | MOV AX,ONE ; SET ERROR CONDITION TO (non-active) | ||
| 227 | STC ; | ||
| 228 | RET ; | ||
| 229 | CQCP_0: CLC ; | ||
| 230 | RET ; | ||
| 231 | CON_QUERY_CP ENDP ; | ||
| 232 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 233 | ; | ||
| 234 | ; QUERY PARAMETER INFORMATION | ||
| 235 | ; | ||
| 236 | ; ENTRY: ES:DI points to data table | ||
| 237 | ; CX = max size of table to fill (in bytes) | ||
| 238 | ; EXIT: ES:DI filled with formatted data; DW #DESG,#FONTS,#HDWR,CPx's | ||
| 239 | ; CY = 1 if problem with table creation | ||
| 240 | ; | ||
| 241 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 242 | CON_QUERY_PARAMETER PROC ; | ||
| 243 | PUSH DS ; | ||
| 244 | PUSH AX ; | ||
| 245 | PUSH BX ; | ||
| 246 | PUSH CX ; | ||
| 247 | PUSH DI ; | ||
| 248 | ; | ||
| 249 | PUSH CS ; | ||
| 250 | POP DS ; | ||
| 251 | ; PERFORM CHECK ON LGTH OF BUFFER | ||
| 252 | MOV BX,THREE ; MANDATORY THREE WORD-STARTER | ||
| 253 | ADD BX,CPD_HDWR_N ; ADD # CP's IN HARDWARE | ||
| 254 | ADD BX,CPD_DESG_N ; ADD # CP's IN DESIGNATION | ||
| 255 | SHL BX,1 ; CONVERT TO BYTES | ||
| 256 | CMP BX,CX ; VERIFY THAT TABLE WILL FIT... | ||
| 257 | JG CQP_3 ; SET ERROR CONDITION! | ||
| 258 | ; | ||
| 259 | LEA BX,QPARM_TABLE ; | ||
| 260 | MOV CX,QPARM_ENTRY ; | ||
| 261 | CQP_0: MOV SI,[BX] ; | ||
| 262 | MOV AX,[SI] ; | ||
| 263 | MOV ES:[DI],AX ; | ||
| 264 | INC BX ; | ||
| 265 | INC BX ; | ||
| 266 | INC DI ; | ||
| 267 | INC DI ; | ||
| 268 | LOOP CQP_0 ; | ||
| 269 | ; | ||
| 270 | CALL GET_HDWR_CP ; | ||
| 271 | MOV CX,[SI] ; | ||
| 272 | OR CX,CX ; | ||
| 273 | JZ CQP_1 ; | ||
| 274 | INC SI ; | ||
| 275 | INC SI ; | ||
| 276 | REP MOVSW ; | ||
| 277 | ; | ||
| 278 | CQP_1: CALL GET_DESG_CP ; | ||
| 279 | MOV CX,[SI] ; | ||
| 280 | OR CX,CX ; | ||
| 281 | JE CQP_2 ; | ||
| 282 | INC SI ; | ||
| 283 | INC SI ; | ||
| 284 | REP MOVSW ; | ||
| 285 | ; | ||
| 286 | CQP_2: POP DI ; | ||
| 287 | POP CX ; | ||
| 288 | POP BX ; | ||
| 289 | POP AX ; | ||
| 290 | POP DS ; | ||
| 291 | CLC ; CLEAR ERROR CONDITION! | ||
| 292 | RET ; | ||
| 293 | ; | ||
| 294 | CQP_3: POP DI ; | ||
| 295 | POP CX ; | ||
| 296 | POP BX ; | ||
| 297 | POP AX ; | ||
| 298 | POP DS ; | ||
| 299 | STC ; TELL CALLER THAT ERROR OCCURRED! | ||
| 300 | RET ; | ||
| 301 | CON_QUERY_PARAMETER ENDP ; | ||
| 302 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 303 | ; | ||
| 304 | ; SIGNAL KEYBOARD THAT INVOKE JUST OCCURRED! | ||
| 305 | ; | ||
| 306 | ; INPUT: | ||
| 307 | ; DX = code page just invoked! | ||
| 308 | ; OUTPUT: | ||
| 309 | ; none | ||
| 310 | ; | ||
| 311 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 312 | SIGNAL_KBD_INVK PROC ; | ||
| 313 | PUSH AX ; | ||
| 314 | PUSH BX ; | ||
| 315 | MOV AX,0AD81H ; | ||
| 316 | MOV BX,DX ; | ||
| 317 | CLC ; CLEAR THE CARRY IN CASE NOT THERE | ||
| 318 | INT 2FH ; | ||
| 319 | POP BX ; | ||
| 320 | POP AX ; | ||
| 321 | RET ; | ||
| 322 | SIGNAL_KBD_INVK ENDP ; | ||
| 323 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||