From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/DEV/ANSI/ANSI.ASM | 1169 ++++++++++++++++++++++++++++++++++++++++ v4.0/src/DEV/ANSI/ANSI.INC | 312 +++++++++++ v4.0/src/DEV/ANSI/ANSI.LNK | 8 + v4.0/src/DEV/ANSI/ANSI.SKL | 16 + v4.0/src/DEV/ANSI/ANSIINIT.ASM | 413 ++++++++++++++ v4.0/src/DEV/ANSI/ANSIVID.INC | 54 ++ v4.0/src/DEV/ANSI/IOCTL.ASM | 1126 ++++++++++++++++++++++++++++++++++++++ v4.0/src/DEV/ANSI/MAKEFILE | 33 ++ v4.0/src/DEV/ANSI/PARSER.ASM | 325 +++++++++++ 9 files changed, 3456 insertions(+) create mode 100644 v4.0/src/DEV/ANSI/ANSI.ASM create mode 100644 v4.0/src/DEV/ANSI/ANSI.INC create mode 100644 v4.0/src/DEV/ANSI/ANSI.LNK create mode 100644 v4.0/src/DEV/ANSI/ANSI.SKL create mode 100644 v4.0/src/DEV/ANSI/ANSIINIT.ASM create mode 100644 v4.0/src/DEV/ANSI/ANSIVID.INC create mode 100644 v4.0/src/DEV/ANSI/IOCTL.ASM create mode 100644 v4.0/src/DEV/ANSI/MAKEFILE create mode 100644 v4.0/src/DEV/ANSI/PARSER.ASM (limited to 'v4.0/src/DEV/ANSI') diff --git a/v4.0/src/DEV/ANSI/ANSI.ASM b/v4.0/src/DEV/ANSI/ANSI.ASM new file mode 100644 index 0000000..a1d59c6 --- /dev/null +++ b/v4.0/src/DEV/ANSI/ANSI.ASM @@ -0,0 +1,1169 @@ +PAGE ,132 +TITLE CONDEV FANCY CONSOLE DRIVER + +;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; +; ADDRESSES FOR I/O +; +;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +;------------------------------------------------------------------------------ +;AN000; New functionality in DOS 4.00 +;AN001; GHG fix scrolling flashes on Mod 25/30's +;AN002; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K. +;AN003; D375 /X needs to be supported by ANSI sequence also 12/14/87 J.K. +;AN004; D397 /L option for Enforcing number of lines 12/17/87 J.K. +;AN005; D479 An option to disable the extended keyboard functions 02/12/88 J.K. +;AN006; P4241 AN001 fix be Revised to fix this problem 04/20/88 J.K. +;AN007; P4532 Scrolling has a snow for CGA adapter 04/27/88 J.K. +;AN008; P4533 In mode Dh, Eh, Fh, 10h and 13h, Scrolling not working 04/27/88 J.K. +;AN009; P4766 In mode 11h, and 12h erase display leaves bottom 5 05/24/88 F.G. +;------------------------------------------------------------------------------ + +TRUE EQU 0FFFFh +FALSE EQU 0 + +BREAK MACRO subtitle + SUBTTL subtitle + PAGE ,132 +ENDM + +AsmVars Macro varlist +IRP var, +AsmVar var +ENDM +ENDM + +AsmVar Macro var +IFNDEF var +var = FALSE +ENDIF +ENDM + +INCLUDE VECTOR.INC +INCLUDE MULT.INC +INCLUDE ANSI.INC ; WGR equates and structures ;AN000; +.xlist +INCLUDE STRUC.INC ; WGR include STRUC macros ;AN000; +.list + +BREAK + + CR=13 ;CARRIAGE RETURN + BACKSP=8 ;BACKSPACE + ESC_CHAR=1BH + BRKADR=6CH ;006C BREAK VECTOR ADDRESS + ASNMAX=400 ;WGR (increased) SIZE OF KEY ASSIGNMENT BUFFER + +PUBLIC SWITCH_X ; WGR/X option for extended keyboard redefinition support;AN000; +PUBLIC SCAN_LINES ; WGR ;AN000; +PUBLIC VIDEO_MODE_TABLE ; WGR ;AN000; +PUBLIC VIDEO_TABLE_MAX ; WGR ;AN000; +public MAX_VIDEO_TAB_NUM ;P1767 +PUBLIC PTRSAV ; WGR ;AN000; +PUBLIC ERR1 ; WGR ;AN000; +PUBLIC ERR2 ; WGR ;AN000; +PUBLIC EXT_16 ; WGR ;AN000; +PUBLIC BRKADR ; WGR ;AN000; +PUBLIC BRKKY ; WGR ;AN000; +PUBLIC COUT ; WGR ;AN000; +PUBLIC BASE ; WGR ;AN000; +PUBLIC MODE ; WGR ;AN000; +PUBLIC MAXCOL ; WGR ;AN000; +PUBLIC TRANS ; WGR ;AN000; +PUBLIC STATUS ; WGR ;AN000; +PUBLIC EXIT ; WGR ;AN000; +PUBLIC NO_OPERATION ; WGR ;AN000; +PUBLIC HDWR_FLAG ; WGR ;AN000; +public Switch_L ;AN004; +public Switch_K ;AN005; + ;AN000; +CODE SEGMENT PUBLIC BYTE + + ASSUME CS:CODE,DS:NOTHING,ES:NOTHING +;----------------------------------------------- +; +; C O N - CONSOLE DEVICE DRIVER +; + +EXTRN CON$INIT:NEAR ; WGR ANSI initialization code +EXTRN GENERIC_IOCTL:NEAR ; WGR Generic IOCTL code +EXTRN REQ_TXT_LENGTH:WORD ; WGR current text length +EXTRN GRAPHICS_FLAG:BYTE ; WGR graphics flag + +CONDEV: ;HEADER FOR DEVICE "CON" + DW -1,-1 + DW 1100000001010011B ;WGR changed to match CON ;AC000; + DW STRATEGY + DW ENTRY + DB 'CON ' + +;-------------------------------------------------------------- +; +; COMMAND JUMP TABLES +CONTBL: + DW CON$INIT + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW CON$READ + DW CON$RDND + DW NO_OPERATION ; WGR ;AC000; + DW CON$FLSH + DW CON$WRIT + DW CON$WRIT + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AC000; + DW NO_OPERATION ; WGR ;AN000; + DW NO_OPERATION ; WGR ;AN000; + DW NO_OPERATION ; WGR ;AN000; + DW GENERIC_IOCTL ; WGR generic IOCTL routine offset ;AN000; +MAX_CMD EQU ($ - CONTBL)/2 ; WGR size of CONTBL ;AN000; + +CMDTABL DB 'A' + DW CUU ;cursor up + DB 'B' + DW CUD ;cursor down + DB 'C' + DW CUF ;cursor forward + DB 'D' + DW CUB ;cursor back + DB 'H' + DW CUP ;cursor position + DB 'J' + DW ED ;erase display + DB 'K' + DW EL ;erase line + DB 'R' + DW CPR ;cursor postion report + DB 'f' + DW CUP ;cursor position + DB 'h' + DW SM ;set mode + DB 'l' + DW RM ;reset mode + DB 'm' + DW SGR ;select graphics rendition + DB 'n' + DW DSR ;device status report + DB 'p' + DW KEYASN ;key assignment + db 'q' ;AN003; dynamic support of /X option through ansi sequence + dw ExtKey ;AN003; esc[0q = reset it. esc[1q = set it + DB 's' + DW PSCP ;save cursor postion + DB 'u' + DW PRCP ;restore cursor position + DB 00 + +GRMODE DB 00,00000000B,00000111B + DB 01,11111111B,00001000B + DB 04,11111000B,00000001B + DB 05,11111111B,10000000B + DB 07,11111000B,01110000B + DB 08,10001000B,00000000B + DB 30,11111000B,00000000B + DB 31,11111000B,00000100B + DB 32,11111000B,00000010B + DB 33,11111000B,00000110B + DB 34,11111000B,00000001B + DB 35,11111000B,00000101B + DB 36,11111000B,00000011B + DB 37,11111000B,00000111B + DB 40,10001111B,00000000B + DB 41,10001111B,01000000B + DB 42,10001111B,00100000B + DB 43,10001111B,01100000B + DB 44,10001111B,00010000B + DB 45,10001111B,01010000B + DB 46,10001111B,00110000B + DB 47,10001111B,01110000B + DB 0FFH + +;--------------------------------------------------- +; +; Device entry point +; +CMDLEN = 0 ;LENGTH OF THIS COMMAND +UNIT = 1 ;SUB UNIT SPECIFIER +CMD = 2 ;COMMAND CODE +STATUS = 3 ;STATUS +MEDIA = 13 ;MEDIA DESCRIPTOR +TRANS = 14 ;TRANSFER ADDRESS +COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS +START = 20 ;FIRST BLOCK TO TRANSFER + +PTRSAV DD 0 + +BUF1: BUF_DATA <> ; WGR Next CON Buffer area ;AN000; + +STRATP PROC FAR + +STRATEGY: + MOV WORD PTR CS:[PTRSAV],BX + MOV WORD PTR CS:[PTRSAV+2],ES + RET + +STRATP ENDP + +ENTRY: + PUSH SI + PUSH AX + PUSH CX + PUSH DX + PUSH DI + PUSH BP + PUSH DS + PUSH ES + PUSH BX +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGR ;AN000; +; Check if header link has to be set WGR (Code ported from ;AN000; +; WGR DISPLAY.SYS) ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000; + LEA BX, BUF1 ; WGR ;AN000; + MOV DI,OFFSET CONDEV ; WGR CON Device header ;AN000; + ; WGR ;AN000; + MOV CONPTR.DEV_HDRO,DI ; WGR ;AN000; + MOV CONPTR.DEV_HDRS,CS ; WGR ;AN000; + CLD ; WGR all moves forward ;AN000; + ; WGR ;AN000; + CMP CONPTR.CON_STRAO, -1 ; WGR ;AN000; + JNE L4 ; WGR has been linked to DOS CON ;AN000; + CMP CONPTR.CON_STRAS, -1 ; WGR ;AN000; + JNE L4 ; WGR has been linked to DOS CON ;AN000; + ; WGR next device header : ES:[DI] ;AN000; + LDS SI,DWORD PTR CONPTR.DEV_HDRO;WGR ;AN000; + LES DI,DWORD PTR HP.DH_NEXTO; WGR ;AN000; + ; WGR ;AN000; +;$SEARCH WHILE ; WGR pointer to next device header is NOT ;AN000; +L1: ; WGR ;AN000; + PUSH ES ; WGR -1 ;AN000; + POP AX ; WGR ;AN000; + CMP AX,-1 ; WGR ;AN000; +;$LEAVE E, AND ; WGR leave if both offset and segment are ;AN000; + JNE NOT0FFFF ; WGR ;AN000; + ; WGR ;AN000; + CMP DI,-1 ; WGR 0FFFFH ;AN000; +;$LEAVE E ; WGR ;AN000; + JE L4 ; WGR ;AN000; +NOT0FFFF: ; WGR ;AN000; + PUSH DI ; WGR ;AN000; + PUSH SI ; WGR ;AN000; + MOV CX,NAME_LEN ; WGR ;AN000; + LEA DI,NHD.DH_NAME ; WGR ;AN000; + LEA SI,HP.DH_NAME ; WGR ;AN000; + REPE CMPSB ; WGR ;AN000; + POP SI ; WGR ;AN000; + POP DI ; WGR ;AN000; + AND CX,CX ; WGR ;AN000; +;$EXITIF Z ; WGR Exit if name is found in linked hd. ;AN000; + JNZ L3 ; WGR Name is not found ;AN000; + ; WGR Name is found in the linked header ;AN000; + MOV AX,NHD.DH_STRAO ; WGR Get the STRATEGY address ;AN000; + MOV CONPTR.CON_STRAO,AX ; WGR ;AN000; + MOV AX,ES ; WGR ;AN000; +X1: MOV CONPTR.CON_STRAS,AX ; WGR ;AN000; + ; WGR ;AN000; + MOV AX,NHD.DH_INTRO ; WGR Get the INTERRUPT address ;AN000; + MOV CONPTR.CON_INTRO,AX ; WGR ;AN000; + MOV AX,ES ; WGR ;AN000; +X2: MOV CONPTR.CON_INTRS,AX ; WGR ;AN000; + ; WGR ;AN000; +;$ORELSE ; WGR FInd next header to have the same ;AN000; + JMP L4 ; WGR Device Name ;AN000; +L3: ; WGR ;AN000; + LES DI,DWORD PTR NHD.DH_NEXTO;WGR ;AN000; +;$ENDLOOP ; WGR ;AN000; + JMP L1 ; WGR ;AN000; +L4: ; WGR ;AN000; + + LDS BX,CS:[PTRSAV] ;GET PONTER TO I/O PACKET + + MOV CX,WORD PTR DS:[BX].COUNT ;CX = COUNT + + MOV AL,BYTE PTR DS:[BX].CMD + CBW + MOV SI,OFFSET CONTBL + ADD SI,AX + ADD SI,AX + CMP AL,MAX_CMD ; WGR not a call for ANSI...chain to lower device;AC000; + JA NO_OPERATION + + LES DI,DWORD PTR DS:[BX].TRANS + + PUSH CS + POP DS + + ASSUME DS:CODE + + JMP WORD PTR [SI] ;GO DO COMMAND + +;===================================================== +;= +;= SUBROUTINES SHARED BY MULTIPLE DEVICES +;= +;===================================================== +;---------------------------------------------------------- +; +; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH +; +BUS$EXIT: ;DEVICE BUSY EXIT + MOV AH,00000011B + JMP SHORT ERR1 + +NO_OPERATION: ; WGR ;AN000; + CALL PASS_CONTROL ; WGR Pass control to lower CON ;AN000; + JMP SHORT ERR2 ; WGR ;AN000; + +ERR$EXIT: + MOV AH,10000001B ;MARK ERROR RETURN + JMP SHORT ERR1 + +EXITP PROC FAR + +EXIT: MOV AH,00000001B +ERR1: LDS BX,CS:[PTRSAV] + MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE +ERR2: + POP BX ; WGR ;AN000; + POP ES + POP DS + POP BP + POP DI + POP DX + POP CX + POP AX + POP SI + RET ;RESTORE REGS AND RETURN +EXITP ENDP +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; WGR ;AN000; +; PASS CONTROL WGR ;AN000; +; WGR ;AN000; +; This calls the attached device to perform any further ;AN000; +; action on the call! WGR ;AN000; +; WGR ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000; +PASS_CONTROL PROC ; WGR ;AN000; + LEA SI,BUF1 ; WGR ;AN000; + LES BX,CS:[PTRSAV] ; WGR pass the request header to the ;AN000; + CALL DWORD PTR CS:[SI].CON_STRAO ; CON strategy routine. ;AN000; + CALL DWORD PTR CS:[SI].CON_INTRO ; WGR interrupt the CON ;AN000; + RET ; WGR ;AN000; +PASS_CONTROL ENDP ; WGR ;AN000; +;----------------------------------------------- ;AN000; +; +; BREAK KEY HANDLING +; +BRKKY: + MOV CS:ALTAH,3 ;INDICATE BREAK KEY SET +INTRET: IRET + +; +; WARNING - Variables are very order dependent, be careful +; when adding new ones! - c.p. +; +WRAP DB 0 ; 0 = WRAP, 1 = NO WRAP +ASNPTR DW 4 +STATE DW S1 +MODE DB 3 ;* +MAXCOL DB 79 ;* +COL DB 0 +ROW DB 0 +SAVCR DW 0 +INQ DB 0 +PRMCNT LABEL BYTE +PRMCNTW DW 0 +KEYCNT DB 0 +KEYPTR DW BUF +REPORT DB ESC_CHAR,'[00;00R',CR ;CURSOR POSTION REPORT BUFFER +ALTAH DB 0 ;Special key handling + +EXT_16 DB 0 ; WGR Extended INT 16h flag ;AN000; +Switch_X DB OFF ; WGR /X flag ;AN000; +Switch_L db OFF ;DCR397; 1= /L flag entered. +Switch_K db OFF ;AN005; To control EXT_16 +SCAN_LINES DB ? ; WGR flag for available scan lines (VGA) ;AN000; +HDWR_FLAG DW 0 ; WGR byte of flags indicating video support ;AN000; + +VIDEO_MODE_TABLE LABEL BYTE ; WGR table containing applicable ;AN000; +MODE_TABLE <> ; WGR video modes and corresponding ;AN000; +MODE_TABLE <> ; WGR data. ;AN000; +MODE_TABLE <> ; WGR this table is initialized at ;AN000; +MODE_TABLE <> ; WGR INIT time ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +MODE_TABLE <> ; WGR ;AN000; +VIDEO_TABLE_MAX EQU $ ; WGR maximum address for video table ;AN000; +MAX_VIDEO_TAB_NUM EQU ($-VIDEO_MODE_TABLE)/TYPE MODE_TABLE ;P1767 Max number of table + ;AN000; +;------------------------------------------------------------- +; +; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE +; +ATTRW LABEL WORD +ATTR DB 00000111B ;CHARACTER ATTRIBUTE +BPAGE DB 0 ;BASE PAGE +base dw 0b800h +screen_seg dw 00000h + +chrout: cmp al,13 + jnz trylf + mov [col],0 + jmp short setit + +trylf: cmp al,10 + jz lf + cmp al,7 + jnz tryback +torom: + mov bx,[attrw] + and bl,7 + mov ah,14 + int 10h +ret5: ret + +tryback: + cmp al,8 + jnz outchr + cmp [col],0 + jz ret5 + dec [col] + jmp short setit + +outchr: + mov bx,[attrw] + mov cx,1 + mov ah,9 + int 10h + inc [col] + mov al,[col] + cmp al,[maxcol] + jbe setit + cmp [wrap],0 + jz outchr1 + dec [col] + ret +outchr1: + mov [col],0 +lf: inc [row] + MOV AH,30 ; GHG Fix for ROUNDUP/PALACE + MOV AL,MODE ; GHG Fix for ROUNDUP/PALACE + CMP AL,11H ; GHG Fix for ROUNDUP/PALACE + JE LF2 ; GHG Fix for ROUNDUP/PALACE + CMP AL,12H ; GHG Fix for ROUNDUP/PALACE + JE LF2 ; GHG Fix for ROUNDUP/PALACE + .IF ; WGR ;AN000; + MOV AH,DEFAULT_LENGTH ; WGR ;AN000; + .ELSE ; WGR ;AN000; + MOV AH,BYTE PTR [REQ_TXT_LENGTH] ; GHG Fix for ROUNDUP/PALACE + .ENDIF ; WGR ;AN000; +LF2: ; GHG Fix for ROUNDUP/PALACE + cmp [row],AH ; GHG Fix for ROUNDUP/PALACE + jb setit + DEC AH ; GHG Fix for ROUNDUP/PALACE + mov [row],AH ; GHG Fix for ROUNDUP/PALACE + call scroll + +setit: mov dh,row + mov dl,col + mov bh,[bpage] + mov ah,2 + int 10h + ret + +;AN006;Writing a LF char through Teletype function to scroll the screen +;has a side effect of changing the color of the cursor when the PROMPT +;setting in PTM P4241 is used. AN001 uses this method to fix the strobing +;problem of the palace machine. The old method of scrolling used to directly +;write into video buffer. The old method has been used by AN001 for +;CGA adater of mode 2 or 3 only. +;To solve P4241, but to maintain the fix of the strobing problem of palace +;machine, we return back to the old logic but the old logic has to be +;Revised for the displays above CGA level. For the adapters above +;CGA display, we don't need to turn off/on the video - this will causes +;a strobing, if you use do this, for Palace machine. +;This logic will be only applied to mode 2 and 3 only. + +scroll: +;AN006;AN008; Myscroll is only for Mode 2 and 3 of all display unit. +; .IF ; GHG is this the CGA? ;AN000; + .IF < MODE eq 2 > or + .IF < MODE eq 3 > + jmp myscroll + .ENDIF +; .ENDIF +;AN006;AN008; Other modes (=APA mode) use TeleType function of +; writing LF to scroll the screen!. + mov al,10 ; GHG + jmp torom ; GHG + +myscroll: + mov bh,[attr] + mov bl,' ' + MOV AL,[MAXCOL] ; WGR ;AN000; + CBW ; WGR ;AN000; + INC AX ; WGR ;AN000; + MOV BP,AX ; WGR ;AN000; + MOV SI,BP ; WGR ;AN000; + ADD SI,BP ; WGR ;AN000; + .IF ; WGR ;AN000; + MOV AX,DEFAULT_LENGTH ; WGR ;AN000; + .ELSE ; WGR ;AN000; + MOV AX,[REQ_TXT_LENGTH] ; WGR ;AN000; + .ENDIF ; WGR ;AN000; + DEC AX ; WGR ;AN000; + MUL BP ; WGR ;AN000; + MOV CX,AX ; WGR ;AN000; + mov ax,[base] + add ax,[screen_seg] + mov es,ax + mov ds,ax + xor di,di + cld + cmp cs:[base],0b800h + jz colorcard + + rep movsw + mov ax,bx + mov cx,bp + rep stosw +sret: push cs + pop ds + ret + +colorcard: +; We must protect this with a critical section +; +; INT 29H calls to device drivers do not enter CritDevice +; The user MIGHT hit Ctrl-NumLock in the middle of this +; which will leave the screen blanked. + mov ax,8000H + CritDevice ; Enter Device critical section + int int_IBM + + cmp cs:[Hdwr_Flag], MCGA_ACTIVE ;AN006;AN007;above CGA level? + jae Skip_Video_Off ;AN006;AN007; + + mov dx,3dah +wait2: in al,dx + test al,8 + jz wait2 + mov al,25h + mov dx,3d8h + out dx,al ;turn off video +Skip_Video_Off: ;AN006; + rep movsw + mov ax,bx + mov cx,bp + rep stosw + cmp cs:[Hdwr_Flag], MCGA_ACTIVE ;AN006;AN007; + jae Skip_Video_On ;AN006;AN007; + mov al,29h + mov dx,3d8h + out dx,al ;turn on video + +Skip_Video_On: ;AN006; + mov ax,8100H + CritDevice ; Leave Device critical section + int int_IBM + + jmp sret + +;------------------------------------------------------ +; +; CONSOLE READ ROUTINE +; +CON$READ: + JCXZ CON$EXIT +CON$LOOP: + PUSH CX ;SAVE COUNT + CALL CHRIN ;GET CHAR IN AL + POP CX + STOSB ;STORE CHAR AT ES:DI + LOOP CON$LOOP +CON$EXIT: + JMP EXIT +;--------------------------------------------------------- +; +; INPUT SINGLE CHAR INTO AL +; +CHRIN: XOR AX,AX + XCHG AL,ALTAH ;GET CHARACTER & ZERO ALTAH + OR AL,AL + JNZ KEYRET + +INAGN: CMP KEYCNT,0 + JNZ KEY5A + + XOR AH,AH + .IF ; WGR extended interrupt available? ;AN000; + MOV AH,10h ; WGR yes..perform extended call ;AN000; + INT 16H ; WGR ;AN000; + .IF ; WGR /X switch used? ;AN000; + CALL CHECK_FOR_REMAP ; WGR no....map to normal call ;AN000; + .ENDIF ; WGR ;AN000; + CALL SCAN ; WGR check for redefinition ;AN000; + .IF NZ AND ; WGR no redefinition?...and ;AN000; + .IF ; WGR /X switch used? ;AN000; + CALL CHECK_FOR_REMAP ; WGR then remap.. ;AN000; + OR BX,BX ; WGR reset zero flag for jump test in old code ;AN000; + .ENDIF ; WGR ;AN000; + .ELSE ; WGR extended interrupt not available ;AN000; + INT 16H ; WGR ;AN000; + CALL SCAN ; WGR check for redefinition ;AN000; + .ENDIF ; WGR ;AN000; + JNZ ALT10 ;IF NO MATCH JUST RETURN IT + + DEC CX + DEC CX + INC BX + INC BX + .IF OR ; WGR check whether the ;AN000; + .IF AND ; WGR keypacket is an extended one? ;AN000; + .IF ; WGR switch must be set for 0E0h extended ;AN000; + DEC CX ; WGR adjust pointers ;AN000; + INC BX ; WGR appropiately ;AN000; + .ENDIF + MOV KEYCNT,CL + MOV KEYPTR,BX +KEY5A: ; Jmp here to get rest of translation + CALL KEY5 ;GET FIRST KEY FROM TRANSLATION +ALT10: + OR AX,AX ;Check for non-key after BREAK + JZ INAGN + OR AL,AL ;SPECIAL CASE? + JNZ KEYRET + MOV ALTAH,AH ;STORE SPECIAL KEY +KEYRET: RET + +KEY5: MOV BX,KEYPTR ;GET A KEY FROM TRANSLATION TABLE + MOV AX,WORD PTR [BX] + DEC KEYCNT + INC BX + OR AL,AL + JNZ KEY6 + INC BX + DEC KEYCNT +KEY6: MOV KEYPTR,BX + RET + +SCAN: MOV BX,OFFSET BUF +KEYLP: MOV CL,BYTE PTR [BX] + XOR CH,CH + OR CX,CX + JZ NOTFND + .IF OR ; WGR check whether the ;AN000; + .IF AND ; WGR keypacket is an extended one. ;AN000; + .IF ; WGR switch must be set for 0E0h extended ;AN000; + CMP AX,WORD PTR [BX+1] ; WGR yes...compare the word ;AN000; + .ELSE ; WGR ;AN000; + CMP AL,BYTE PTR [BX+1] ; WGR no...compare the byte ;AN000; + .ENDIF ; WGR ;AN000; + JZ MATCH + ADD BX,CX + JMP KEYLP +NOTFND: OR BX,BX +MATCH: RET +;-------------------------------------------------------------- +; +; KEYBOARD NON DESTRUCTIVE READ, NO WAIT +; +CON$RDND: + MOV AL,[ALTAH] + OR AL,AL + JNZ RDEXIT + + CMP [KEYCNT],0 + JZ RD1 + MOV BX,[KEYPTR] + MOV AL,BYTE PTR [BX] + JMP SHORT RDEXIT + +RD1: MOV AH,1 + .IF ; WGR extended INT16 available? ;AN000; + ADD AH,10H ; WGR yes....adjust to extended call ;AN000; + .ENDIF + INT 16H + JZ CONBUS + OR AX,AX + JNZ RD2 + MOV AH,0 + .IF ; WGR extended interrupt available? ;AN000; + MOV AH,10h ; WGR yes..perform extended call ;AN000; + INT 16H ; WGR ;AN000; + .IF ; WGR /X switch used? ;AN000; + CALL CHECK_FOR_REMAP ; WGR no....map to normal call ;AN000; + .ENDIF ; WGR ;AN000; + .ELSE ; WGR ;AN000; + INT 16H ; WGR ;AN000; + .ENDIF ; WGR ;AN000; + JMP CON$RDND + +RD2: CALL SCAN + .IF NZ AND ; WGR if no redefinition ;AN000; + .IF AND ; WGR and extended INT16 used ;AN000; + .IF ; WGR and /x used ....then ;AN000; + CALL CHECK_FOR_REMAP ; WGR remap to standard call ;AN000; + OR BX,BX ; WGR reset zero flag for jump test in old code ;AN000; + .ENDIF + JNZ RDEXIT + + MOV AL,BYTE PTR [BX+2] + CMP BYTE PTR [BX+1],0 + JNZ RDEXIT + MOV AL,BYTE PTR [BX+3] +RDEXIT: LDS BX,[PTRSAV] + MOV [BX].MEDIA,AL +EXVEC: JMP EXIT +CONBUS: JMP BUS$EXIT +;-------------------------------------------------------------- +; +; KEYBOARD FLUSH ROUTINE +; +CON$FLSH: + MOV [ALTAH],0 ;Clear out holding buffer + MOV [KEYCNT],0 + +; PUSH DS +; XOR BP,BP +; MOV DS,BP ;Select segment 0 +; MOV DS:BYTE PTR 41AH,1EH ; Reset KB queue head pointer +; MOV DS:BYTE PTR 41CH,1EH ;Reset tail pointer +; POP DS + +Flush: mov ah,1 + .IF ; WGR is extended call available? ;AN000; + ADD AH,10H ; WGR yes....adjust for extended ;AN000; + .ENDIF ; WGR ;AN000; + int 16h + jz FlushDone + mov ah,0 + .IF ; WGR is extended call available? ;AN000; + ADD AH,10H ; WGR yes....adjust for extended ;AN000; + .ENDIF ; WGR ;AN000; + int 16h + jmp Flush +FlushDone: + + JMP EXVEC +;---------------------------------------------------------- +; +; CONSOLE WRITE ROUTINE +; +CON$WRIT: + JCXZ EXVEC + +CON$LP: MOV AL,ES:[DI] ;GET CHAR + INC DI + CALL OUTC ;OUTPUT CHAR + LOOP CON$LP ;REPEAT UNTIL ALL THROUGH + JMP EXVEC + +COUT: STI + PUSH DS + PUSH CS + POP DS + CALL OUTC + POP DS + IRET + +OUTC: PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH SI + PUSH DI + PUSH ES + PUSH BP + + MOV [BASE],0B800H + XCHG AX,SI ; SAVE CHARACTER TO STUFF + MOV AX,40H ; POINT TO ROS BIOS + MOV DS,AX + MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL + DEC AH ; ANSI NEEDS 0-79 OR 0-39 + MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL + CMP AL,7 + JNZ NOT_BW + MOV WORD PTR CS:[BASE],0B000H +NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE + MOV CS:[BPAGE],AL + CBW + ADD AX,AX + MOV BX,AX + MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW + MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN + MOV AX,DS:[4EH] ; GET START OF SCREEN SEG + MOV CL,4 + SHR AX,CL ; CONVERT TO A SEGMENT + PUSH CS + POP DS + MOV [SCREEN_SEG],AX + XCHG AX,SI ; GET BACK CHARACTER IN AL + + CALL VIDEO + POP BP + POP ES + POP DI + POP SI + POP DX + POP CX + POP BX + POP AX + RET + + +;---------------------------------------------------------- +; +; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE +; +VIDEO: MOV SI,OFFSET STATE + JMP [SI] + +S2: CMP AL,'[' + JZ S22 + JMP S1 +S22: MOV WORD PTR [SI],OFFSET S3 + XOR BX,BX + MOV WORD PTR INQ,BX + JMP SHORT S3B + +S3: CMP AL,';' + JNZ S3C +S3A: INC PRMCNT +S3B: CALL GETPTR + XOR AX,AX + MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO + RET + +S3C: CMP AL,'0' + JB S3D + CMP AL,'9' + JA S3D + CALL GETPTR + SUB AL,'0' + XCHG AL,BYTE PTR [BX] + MOV AH,10 + MUL AH ;*10 + ADD BYTE PTR [BX],AL ;MOVE IN DIGIT + RET + +S3D: CMP AL,'=' + JZ S3RET + CMP AL,'?' + JZ S3RET + CMP AL,'"' ;BEGIN QUOTED STRING + JZ S3E + CMP AL,"'" + JNZ S7 +S3E: MOV WORD PTR [SI],OFFSET S4 + MOV [INQ],AL +S3RET: RET + +; +; ENTER QUOTED STRINGS +; + +S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR + JNZ S4A + DEC PRMCNT ;TERMINATE STRING + MOV WORD PTR [SI],OFFSET S3 + RET + +S4A: CALL GETPTR + MOV BYTE PTR [BX],AL + MOV WORD PTR [SI],OFFSET S4 + JMP S3A +; +; LOOK FOR ANSI COMMAND SPECIFIED IN AL +; + +S7: MOV BX,OFFSET CMDTABL-3 +; +S7A: ADD BX,3 + CMP BYTE PTR [BX],0 + JZ S1B + CMP BYTE PTR [BX],AL + JNZ S7A +; +S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS + MOV BX,OFFSET BUF + INC BX + ADD BX,ASNPTR ;BX = PTR TO PARM LIST + MOV DL,BYTE PTR [BX] + XOR DH,DH ;DX = FIRST PARAMETER + MOV CX,DX + OR CX,CX + JNZ S7C + INC CX ;CX = DX, CX=1 IF DX=0 +S7C: JMP AX ;AL = COMMAND + +S1: CMP AL,ESC_CHAR ;ESCAPE SEQUENCE? + JNZ S1B + MOV WORD PTR [SI],OFFSET S2 + RET + +S1B: CALL CHROUT +S1A: MOV WORD PTR [STATE],OFFSET S1 + RET + +MOVCUR: CMP BYTE PTR [BX],AH + JZ SETCUR + ADD BYTE PTR [BX],AL + LOOP MOVCUR +SETCUR: MOV DX,WORD PTR COL + XOR BX,BX + MOV AH,2 + INT 16 + JMP S1A + +CUP: .IF ; WGR ;AN000; + CMP CL,DEFAULT_LENGTH ; WGR ;AN000; + .ELSE ; WGR ;AN000; + CMP CL,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000; + .ENDIF ; WGR ;AN000; + JA SETCUR + MOV AL,MAXCOL + MOV CH,BYTE PTR [BX+1] + OR CH,CH + JZ CUP1 + DEC CH +CUP1: CMP AL,CH + JA CUP2 + MOV CH,AL +CUP2: XCHG CL,CH + DEC CH + MOV WORD PTR COL,CX + JMP SETCUR + +CUF: MOV AH,MAXCOL + MOV AL,1 +CUF1: MOV BX,OFFSET COL + JMP MOVCUR + +CUB: MOV AX,00FFH + JMP CUF1 + +CUU: MOV AX,00FFH +CUU1: MOV BX,OFFSET ROW + JMP MOVCUR + +CUD: .IF ; WGR ;AN000; + MOV AH,DEFAULT_LENGTH ; WGR ;AN000; + .ELSE ; WGR ;AN000; + MOV AH,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000; + .ENDIF ; WGR ;AN000; + MOV AL,1 ; WGR ;AN000; + JMP CUU1 + +ExtKey: ;AN003; + cmp dl, 0 ;AN003; DL = previous parameter + jne ExtKey_1 ;AN003; + mov Switch_X, OFF ;AN003; reset it if 0. + jmp S1A ;AN003; +ExtKey_1: ;AN003; + cmp dl, 1 ;AN003; 1 ? + je SetExtKey ;AN003; + jmp S1A ;AN003; ignore it +SetExtKey: ;AN003; + mov Switch_X, ON ;AN003; set it if 1. + jmp S1A ;AN003; + +PSCP: MOV AX,WORD PTR COL + MOV SAVCR,AX + JMP SETCUR + +PRCP: MOV AX,SAVCR + MOV WORD PTR COL,AX + JMP SETCUR + +SGR: XOR CX,CX + XCHG CL,PRMCNT + CALL GETPTR + INC CX +SGR1: MOV AL,BYTE PTR [BX] + PUSH BX + MOV BX,OFFSET GRMODE +SGR2: MOV AH,BYTE PTR [BX] + ADD BX,3 + CMP AH,0FFH + JZ SGR3 + CMP AH,AL + JNZ SGR2 + MOV AX,WORD PTR [BX-2] + AND ATTR,AL + OR ATTR,AH +SGR3: POP BX + INC BX + LOOP SGR1 + JMP SETCUR + +ED: XOR CX,CX + MOV WORD PTR COL,CX + MOV DH,30 ; ;AN009; + MOV AL,MODE ; ;AN009; + CMP AL,11H ; ;AN009; + JE ERASE ; ;AN009; + CMP AL,12H ; ;AN009; + JE ERASE ; ;AN009; + .IF ; WGR ;AN000; + MOV DH,DEFAULT_LENGTH ; WGR ;AN000; + .ELSE ; WGR ;AN000; + MOV DH,BYTE PTR [REQ_TXT_LENGTH] ; WGR ;AN000; + .ENDIF ; WGR ;AN000; +ERASE: MOV DL,MAXCOL + .IF ; WGR if we are in a graphics mode.. ;AN000; + XOR BH,BH ; WGR then use 0 as attribute... ;AN000; + .ELSE ; WGR else... ;AN000; + MOV BH,ATTR ; WGR ...use active attribute ;AC000; + .ENDIF ; WGR ;AN000; + MOV AX,0600H + INT 16 +ED3: JMP SETCUR + +EL: MOV CX,WORD PTR COL + MOV DH,CH + JMP ERASE + +BIN2ASC:MOV DL,10 + INC AL + XOR AH,AH + DIV DL + ADD AX,'00' + RET +DSR: MOV AH,REQ_CRSR_POS ; WGR ;AN000; + PUSH BX ; WGR ;AN000; + XOR BH,BH ; WGR ;AN000; + INT 10H ; WGR ;AN000; + POP BX ; WGR ;AN000; + PUSH DX ; WGR ;AN000; + MOV AL,DH ;REPORT CURRENT CURSOR POSITION + CALL BIN2ASC + MOV WORD PTR REPORT+2,AX + POP DX ; WGR ;AN000; + MOV AL,DL ; WGR ;AN000; + CALL BIN2ASC + MOV WORD PTR REPORT+5,AX + MOV [KEYCNT],9 + MOV [KEYPTR],OFFSET REPORT +CPR: JMP S1A + +RM: MOV CL,1 + JMP SHORT SM1 + +SM: XOR CX,CX +SM1: MOV AL,DL + .IF OR ;; WGR check to see if valid mode.. ;AN000; + .IF AND ;; WGR (0-6,13-19) ;AN000; + .IF ;; WGR ;AN000; + .IF ;; WGR is this the LCD? ;AN000; + PUSH DS ;; WGR yes... ;AN000; + PUSH AX ;; WGR save mode ;AN000; + MOV AX,ROM_BIOS ;; WGR ;AN000; + MOV DS,AX ;; WGR get equipment status flag.. ;AN000; + MOV AX,DS:[EQUIP_FLAG] ;; WGR ;AN000; + AND AX,INIT_VID_MASK ;; WGR clear initial video bits.. ;AN000; + OR AX,LCD_COLOR_MODE ;; WGR .....set bits as color ;AN000; + MOV DS:[EQUIP_FLAG],AX ;; WGR replace updated flag. ;AN000; + POP AX ;; WGR restore mode. ;AN000; + POP DS ;; WGR ;AN000; + .ENDIF ;; WGR ;AN000; + MOV AH,SET_MODE ;; WGR yes....set mode.. ;AN000; + INT 10H ;; WGR ;AN000; + .ELSE ;; WGR no...check for 7 (wrap at EOL) ;AN000; + .IF ;; WGR ;AN000; + MOV [WRAP],CL ;; WGR yes....wrap... ;AN000; + .ENDIF ;; WGR ;AN000; + .ENDIF ;; WGR ;AN000; + JMP CPR + +KEYASN: XOR DX,DX + XCHG DL,PRMCNT ;GET CHARACTER COUNT + INC DX + INC DX + + CALL GETPTR + MOV AX,WORD PTR [BX] ;GET CHARACTER TO BE ASSIGNED + CALL SCAN ;LOOK IT UP + JNZ KEYAS1 + + MOV DI,BX ;DELETE OLD DEFINITION + SUB ASNPTR,CX + MOV KEYCNT,0 ; This delete code shuffles the + ; key definition table all around. + ; This will cause all sorts of trouble + ; if we are in the middle of expanding + ; one of the definitions being shuffled. + ; So shut off the expansion. + MOV SI,DI + ADD SI,CX + MOV CX,OFFSET BUF+ASNMAX + SUB CX,SI + CLD + PUSH ES ;SAVE USER'S ES + PUSH CS + POP ES ;SET UP ES ADDRESSABILITY + REP MOVSB + POP ES ;RESTORE ES + +KEYAS1: CALL GETPTR + CMP DL,3 + JB KEYAS3 + MOV BYTE PTR [BX-1],DL ;SET LENGTH + ADD ASNPTR,DX ;REMEMBER END OF LIST + ADD BX,DX + CMP ASNPTR,ASNMAX ; Too much??? + JB KEYAS3 ; No + SUB BX,DX ; Next three instructions undo the above + SUB ASNPTR,DX +KEYAS3: MOV BYTE PTR [BX-1],00 + MOV STATE,OFFSET S1 ;RETURN + RET + +GETPTR: MOV BX,ASNPTR + INC BX + ADD BX,PRMCNTW + CMP BX,ASNMAX + 8 + JB GET1 + DEC PRMCNT + JMP GETPTR +GET1: ADD BX,OFFSET BUF + RET + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000; +; WGR ;AN000; +; CHECK_FOR_REMAP: WGR ;AN000; +; WGR ;AN000; +; This function esnures that the keypacket WGR ;AN000; +; passed to it in AX is mapped to a standard INT16h call WGR ;AN000; +; WGR ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR ;AN000; + ;AN000; +CHECK_FOR_REMAP PROC NEAR ; WGR ;AN000; + .IF ; WGR is this an extended key? ;AN000; + OR AH,AH ; WGR probably...but check for alpha character ;AN000; + .IF NZ ; WGR if it's not an alpha character ....then ;AN000; + XOR AL,AL ; WGR map extended to standard ;AN000; + .ENDIF ; WGR ;AN000; + .ENDIF ; WGR ;AN000; + RET ; WGR ;AN000; +CHECK_FOR_REMAP ENDP ; WGR ;AN000; + + +BUF DB 4,00,72H,16,0 + DB ASNMAX+8-5 DUP (?) + +CODE ENDS + END diff --git a/v4.0/src/DEV/ANSI/ANSI.INC b/v4.0/src/DEV/ANSI/ANSI.INC new file mode 100644 index 0000000..ff0a217 --- /dev/null +++ b/v4.0/src/DEV/ANSI/ANSI.INC @@ -0,0 +1,312 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Equates and Strucs. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;------------------------------------------------------------------------------ +;AN001; D425 For OS2 compatibiltiy box, /L option status query 01/14/88 J.K. +;AN002; D493 New INIT request structure for error message 02/25/88 J.K. +;AN003; P4934 Change ANSI 2F function number t0 1Ah 05/20/88 F.G. +;------------------------------------------------------------------------------ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; DEVICE Header DS:[SI] -- to locate the next CON header +; NEXT device header ES:[DI] +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +HP EQU DS:[SI] ; ;AN000; +NHD EQU ES:[DI] ; ;AN000; + ; +NAME_LEN EQU 8 ; ;AN000; + ; +DHS STRUC ; ;AN000; +DH_NEXTO DW ? ; offset of pointer to next header ;AN000; +DH_NEXTS DW ? ; segment of pointer to next header ;AN000; + DW ? ; attribute ;AN000; +DH_STRAO DW ? ; offset to strategy routine ;AN000; +DH_INTRO DW ? ; offset to interrupt routine ;AN000; +DH_NAME DB NAME_LEN DUP(0) ; device name in this header ;AN000; +DHS ENDS ; end of common portion ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; CON data structure CS:[BX] +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +CONPTR EQU CS:[BX] ; ;AN000; + ; STATES ;AN000; +BUF_DATA STRUC ; ;AN000; +DEV_HDRO DW -1 ; device driver header offset ;AN000; +DEV_HDRS DW -1 ; ;AN000; +CON_STRAO DW -1 ; dos CON strategy offset ;AN000; +CON_STRAS DW -1 ; ;AN000; +CON_INTRO DW -1 ; dos CON strategy offset ;AN000; +CON_INTRS DW -1 ; ;AN000; +BUF_DATA ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; +; +; INIT Structures and equates +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ROM_BIOS EQU 40h ; Segment of ROM_BIOS data area ;AN000; +EQUIP_FLAG EQU 10h ; equipment flag. (for LCD) ;AN000; +KBD_FLAG_3 EQU 96h ; offset of KBD_FLAG_3 in data area ;AN000; +NUM_ROWS EQU 84h ; offset of number of rows in data area;AN000; +EXT16_FLAG EQU 00010000b ; mask for Extended INT16 bit ;AN000; +INIT_VID_MASK EQU 0FFCFh ; mask for equipment list ;AN000; +LCD_COLOR_MODE EQU 20h ; LCD as color ;AN000; +LCD_MONO_MODE EQU 30h ; LCD as MONOchrome ;AN000; +UNKNOWN_CMD EQU 8103H ; unknown command status byte ;AN000; +RC_EOL EQU -1 ; parser return code for EOL ;AN000; +RC_NO_ERROR EQU 0 ; parser return code for not in switch list ;AN000; +INVALID_PARM EQU 10 ; PARSE Invalid parameter message number ;AN000; +SSTRING EQU 3 ; PARSE Too many parameters message ;AN000; +FUNC_CALL EQU 1BH ; VGA functionality call ;AN000; +ALT_SELECT EQU 12H ; EGA alternate select call ;AN000; +EGA_INFO EQU 10H ; EGA return information subcall ;AN000; +ALT_PRT_SC EQU 20H ; select alternate print screen subcall;AN000; +MONOCHROME EQU 1 ; monochrome attached to EGA ;AN000; +COLOR EQU 0 ; some color attached to EGA ;AN000; +PS2_MONO EQU 7 ; display adapter types... ;AN000; +PS2_COLOR EQU 8 ; ;AN000; +MOD30_MONO EQU 0BH ; ;AN000; +MOD30_COLOR EQU 0CH ; ;AN000; +LCD_MODEL EQU 0F9H ; Convertible model byte value ;AN000; +GET_SYS_ID EQU 0C0H ; INT15H call for system identification;AN000; +GET_STATUS EQU 43H ; read system status (Convertible) ;AN000; +MONO_ADDRESS EQU 0B000H ; base address for monochrome ;AN000; +COLOR_ADDRESS EQU 0B800H ; base address for CGA ;AN000; +UNOCCUPIED EQU -1 ; value in VIDEO_MODE_TABLE if space unused ;AN000; +LCD_ACTIVE EQU 00000001B ; LCD adapter is present ;AN000; +MONO_ACTIVE EQU 00000010B ; monochrome adapter is present ;AN000; +CGA_ACTIVE EQU 00000100B ; CGA adapter is present ;AN000; +MCGA_ACTIVE EQU 00001000B ; MCGA is present ;AN000; +E5151_ACTIVE EQU 00010000B ; EGA with monochrome is present ;AN000; +E5153_ACTIVE EQU 00100000B ; EGA with color display is present ;AN000; +E5154_ACTIVE EQU 01000000B ; EGA with enhanced color display is present ;AN000; +VGA_ACTIVE EQU 10000000B ; VGA is present ;AN000; +INT10_LOW EQU (4*10H) ; interrupt 10 vector location ;AN000; +INT10_HI EQU (4*10H)+2 ; ;AN000; +INT2F_LOW EQU (4*2FH) ; interrupt 2F vector location ;AN000; +INT2F_HI EQU (4*2FH)+2 ; ;AN000; +ONE EQU 1 ; ;AN000; +THREE EQU 3 ; ;AN000; +EIGHT EQU 8 ; ;AN000; +NINE EQU 9 ; ;AN000; +FOURTEEN EQU 14 ; ;AN000; +REQ_CRSR_POS EQU 3 ; function call to return cursor position ;AN000; +MODE7 EQU 7 ; ;AN000; +MODE13 EQU 13 ; ;AN000; +MODE15 EQU 15 ; ;AN000; +MODE19 EQU 19 ; ;AN000; + ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AN000; +; +; Request Header Structure (INIT) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +INIT_REQ_HDR STRUC ; INIT Request header structure ;AN000; + DB 13 DUP(?) ; standard request header ;AN000; +NUM_UNITS DB ? ; number of units (N/A) ;AN000; +END_ADDRESS_O DW ? ; ending address of resident code ;AN000; +END_ADDRESS_S DW ? ; ;AN000; +ARG_PTR DD ? ; ptr. to remaining arguments ;AN000; +DRIVE_NUM DB ? ; drive number (N/A) ;AN000; +CONFIG_ERRMSG dw 0 ;Flag to control "Error in CONFIG.SYS.." msg.;AN002; +INIT_REQ_HDR ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Information Block Structure +; (for functionality call) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +INFO_BLOCK STRUC ; information block for functionality call ;AN000; +STATIC_ADDRESS DD ? ; address of static functionality table ;AN000; + DB 33 DUP(?) ; don't care ;AN000; +ACTIVE_DISPLAY DB ? ; active display code ;AN000; +ALT_DISPLAY DB ? ; alternate display code ;AN000; + DB 3 DUP(?) ; don't care ;AN000; +CURRENT_SCANS DB ? ; current number of scan lines ;AN000; + DB 2 DUP(?) ; don't care ;AN000; +MISC_INFO DB ? ; miscellaneous state information ;AN000; + DB 18 DUP(?) ; don't care ;AN000; +INFO_BLOCK ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Video table entry structure +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +MODE_TABLE STRUC ; ;AN000; +V_MODE DB -1 ; video mode ;AN000; +D_MODE DB -1 ; display mode ;AN000; +RESERVED_BYTE DB 0 ; reserved ;AN000; +COLORS DW -1 ; colors ;AN000; +SCR_WIDTH DW -1 ; screen width (pels) ;AN000; +SCR_LENGTH DW -1 ; screen length (pels) ;AN000; +SCR_COLS DW -1 ; number columns ;AN000; +SCR_ROWS DW -1 ; number rows ;AN000; +MODE_TABLE ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Structure of Static Block +; (for functionality call +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +STATIC_BLOCK STRUC ; format of static functionality table ;AN000; + DB 7 DUP(?) ; don't care ;AN000; +SCAN_TEXT DB ? ; available scan lines in text modes ;AN000; +STATIC_BLOCK ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Structure of System ID call return block +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SYS_ID STRUC ; format of return system config data ;AN000; + DW ? ; don't care ;AN000; +MODEL_BYTE DB ? ; model byte ;AN000; +SYS_ID ENDS ; ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; INT2f Strucs and Equates +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +MULT_ANSI EQU 1Ah ; ANSI multiplex number ;AC003; +;Catagory code +INSTALL_CHECK EQU 0 ; install check for ANSI ;AN000; +IOCTL_2F EQU 1 ; 2F interface to IOCTL ;AN000; +DA_INFO_2F EQU 2h ;J.K. Information passing to ANSI. +;Subfunction code for IOCTL_2F +GET_SUBFUNC EQU 7FH ; WGR Same structure as GET_IOCTL(ANSI);AN000; + +;Info Struture for DA_INFO_2F. (DS:DX point to this packet) +;J.K. Note: For DOS 4.00, DA_INFO_PACKET is used by DISPLAY.SYS to signal ANSI.SYS that +;DISPLAY.SYS is calling/finishing INT 10h SET MODE call. ANSI.SYS needs this +;infomration since it also hooks INT 10h vector. +;For this DA_SETMODE_FLAG purpose, DA_INFO_LEVEL and DA_INFO_DIRECTION should always be +;set to 0. This can be extended for another information passing scheme between +;DISPLAY.SYS and ANSI.SYS in the future version. +;For DA_SETMODE_FLAG, DISPLAY.SYS should be extremely careful that when it calls +;with DA_SETMODE_FLAG =1, then it should calls with DA_SETMODE_FLAG=0 +;when it finished INT 10h function call. Otherwise, the system goes ..... +; +;D425. At the request of OS2 compatibility box, when the user ask to ANSI +; with DA_INFO_LEVEL=1, then ANSI sets DA_OPTION_L_STATE based on /L option +; status. + +DA_INFO_PACKET struc +DA_INFO_LEVEL db 0 ; 0=used for SET_MODE_FLAG 1=for OPTION_L_STATE +DA_SETMODE_FLAG db 0 ; 1: DISPLAY.SYS is calling INT 10h call, SET MODE. 0=finished. +DA_OPTION_L_STATE db 0 ; 1 = /L active, 0 = /L inactive +DA_INFO_PACKET ends + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; GENERIC IOCTL Strucs and Equates +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; ;AN000; +DISPLAY_TYPE EQU 3 ; MAJ_FUNC type for display ;AN000; +GET_FUNC EQU 7FH ; MIN_FUNC for get subfunction ;AN000; +SET_FUNC EQU 5FH ; MIN_FUNC for set subfunction ;AN000; +REQ_VID_MODE EQU 0FH ; request video mode INT10h function call ;AN000; +DONE EQU 0100H ; set done bit for IOCTL status ;AN000; +CMD_ERROR EQU 8000H ; set error bit for IOCTL status ;AN000; +INVALID_FUNC EQU 1 ; invalid function ;AN000; +NOT_SUPPORTED EQU 10 ; return code non-supported ioctl function ;AN000; +NOT_AVAILABLE EQU 12 ; return code for font not available ;AN000; +TEXT_MODE EQU 1 ; text mode = 1 in request packet ;AN000; +GRAPHICS_MODE EQU 2 ; graphics mode = 2 ;AN000; +DEFAULT_LENGTH EQU 25 ; normal screen length ;AN000; +OFF EQU 0000H ; ;AN000; +ON EQU 0001H ; ;AN000; +INT_BIT EQU 00100000b ; mask for int. bit from functionality call ;AN000; +FOUND EQU 1 ; flag value for FOUND ;AN000; +NOT_FOUND EQU 0 ; flag value for not FOUND ;AN000; +SET_MODE EQU 0 ; set mode INT10H function number ;AN000; +DISPLAY_CHECK EQU 0AD00H ; install check for DISPLAY.SYS ;AN000; +CHECK_ACTIVE EQU 0AD02H ; active code page check for DISPLAY.SY;AN000; +INSTALLED EQU 0FFH ; present in AL if installed ;AN000; +LOAD_8X8 EQU 1112H ; register value for 8x8 ROM load ;AN000; +SET_BLOCK_0 EQU 1103H ; activate block = 0. ;AN000; +CHECK_FOR_FONT EQU 0AD10H ; check for 8x8 RAM font - DISPLAY.SYS ;AN000; +SELECT_SCAN EQU 30H ; subfunction to set scan lines (VGA) ;AN000; +SET_INTENSIFY EQU 0 ; value to enable intensify. ;AN000; +SET_BLINK EQU 1 ; value to enable blink. ;AN000; +BLINK_TOGGLE EQU 1003H ; INT10 call to toggle int/blink bit. ;AN000; +CURSOR_FLAG EQU 87H ; cursor flag byte in ROM_BIOS ;AN000; +SET_CURSOR_CALL EQU 1 ; INT10 function call to set cursor typ;AN000; +VIDEO_MASK EQU 7FH ; turn of clear buffer bit of mode value ;AN000; +MULT_ANSI EQU 1Ah ; ANSI multiplex number ;AC003; +INSTALL_CHECK EQU 0 ; install check for ANSI ;AN000; +IOCTL_2F EQU 1 ; 2F interface to IOCTL ;AN000; +NOT_CY EQU 0FFFEH ; turn carry bit off ;AN000; +CY EQU 1 ; turn carry bit off ;AN000; +INVALID_FLAGS EQU 0FFFEH ; test for invalid flags in control word ;AN000; +TURN_OFF EQU 0FEH ; values to turn off and on cursor.. ;AN000; +TURN_ON EQU NOT TURN_OFF ; emulation ;AN000; +SUB_SIZE EQU 11 ; sublist size ;AN000; +LEFT_ASCIIZ EQU 00010000B ; left-aligned asciiz string ;AN000; +UNLIMITED EQU 0 ; unlimited message size. ;AN000; + ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Request Header Structure (Generic IOCTL) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +INIT_REQ_HDR STRUC ; ;AN000; + DB 13 DUP(?) ; standard request header ;AN000; +MAJ_FUNC DB ? ; major function ;AN000; +MIN_FUNC DB ? ; minor function ;AN000; +IOCTL_SI DW ? ; contents of SI ;AN000; +IOCTL_DI DW ? ; contents of DI ;AN000; +REQ_PCKT_PTR DD ? ; pointer to request packet ;AN000; +INIT_REQ_HDR ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; REQUEST PACKET STRUCTURE (Generic IOCTL) +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +REQ_PCKT STRUC ; ;AN000; +INFO_LEVEL DB ? ; information level (should be 0) ;AN000; + DB ? ; reserved ;AN000; +DATA_LENGTH DW ? ; length of remaining data ;AN000; +RP_FLAGS DW ? ; control flags ;AN000; +RP_MODE DB ? ; display mode ;AN000; +RESERVED2 DB ? ; reserved ;AN000; +RP_COLORS DW ? ; # of colors ;AN000; +RP_WIDTH DW ? ; screen width ;AN000; +RP_LENGTH DW ? ; screen length ;AN000; +RP_COLS DW ? ; columns ;AN000; +RP_ROWS DW ? ; rows ;AN000; +REQ_PCKT ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Scan Lines available structure +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SCAN_LINE_STR STRUC ; ;AN000; +NUM_LINES DW ? ; number of scan lines ;AN000; +REP_1BH DB ? ; representation in 1Bh call ;AN000; +REP_12H DB ? ; representation in 12h call ;AN000; +SCAN_LINE_STR ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; SUBLIST struc +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SUB_STRUC STRUC ; ;AN000; + DB 2 DUP(?) ; ;AN000; +SUB_PTR_O DW ? ; ;AN000; +SUB_PTR_S DW ? ; ;AN000; +SUB_STRUC ENDS ; ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; RESULT BUFFER struc +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +RESULT_STRUC STRUC ; ;AN000; +RESULT_TYPE DB ? ; ;AN000; + DB ? ; ;AN000; +RES_SYN_PTR DW ? ; ;AN000; +RES_PTR DD ? ; ;AN000; +RESULT_STRUC ENDS ; ;AN000; diff --git a/v4.0/src/DEV/ANSI/ANSI.LNK b/v4.0/src/DEV/ANSI/ANSI.LNK new file mode 100644 index 0000000..1099d81 --- /dev/null +++ b/v4.0/src/DEV/ANSI/ANSI.LNK @@ -0,0 +1,8 @@ +ANSI.OBJ+ + IOCTL.OBJ+ + ANSIINIT.OBJ+ + PARSER.OBJ +ANSI.EXE +ANSI.MAP /M +; + \ No newline at end of file diff --git a/v4.0/src/DEV/ANSI/ANSI.SKL b/v4.0/src/DEV/ANSI/ANSI.SKL new file mode 100644 index 0000000..d797678 --- /dev/null +++ b/v4.0/src/DEV/ANSI/ANSI.SKL @@ -0,0 +1,16 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Message Skeleton file for ANSI.SYS +; +; Author: WGR +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +:util ANSI ; utility name + +:class A +:use 1 COMMON1 ; 'Incorrect DOS version' +:def 10 "Invalid parameter - %1",CR,LF ; 'Invalid parameter' + +:end + \ No newline at end of file diff --git a/v4.0/src/DEV/ANSI/ANSIINIT.ASM b/v4.0/src/DEV/ANSI/ANSIINIT.ASM new file mode 100644 index 0000000..352150e --- /dev/null +++ b/v4.0/src/DEV/ANSI/ANSIINIT.ASM @@ -0,0 +1,413 @@ +PAGE ,132 +TITLE ANSI Console device CON$INIT routine + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; MODULE_NAME: CON$INIT +; +; FUNCTION: +; THIS PROCEDURE PERFORMS ALL NECESSARY INITIALIZATION ROUTINES +; FOR ANSI.SYS. +; +; THIS ROUTINE WAS SPLIT FROM THE ORIGINAL ANSI.ASM SOURCE FILE +; FOR RELEASE 4.00 OF DOS. ALL CHANGED LINES HAVE BEEN MARKED WITH +; WGR. NEW PROCS HAVE BEEN MARKED AS SUCH. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;AN001; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K. +;AN002; P2617 Order dependecy problem with Display.sys 11/23/87 J.K. +;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K. +;AN004; D493 New INIT request structure for error message 02/25/88 J.K. +;------------------------------------------------------------------------------- + +INCLUDE ANSI.INC ; WGR equates and strucs ;AN000; +.XLIST +INCLUDE STRUC.INC ; WGR structured macros ;AN000; +.LIST + +PUBLIC CON$INIT ; WGR ;AN000; + + +CODE SEGMENT PUBLIC BYTE + ASSUME CS:CODE,DS:CODE + +EXTRN VIDEO_MODE_TABLE:BYTE ; WGR ;AN000; +EXTRN FUNC_INFO:BYTE ; WGR ;AN000; +EXTRN HDWR_FLAG:WORD ; WGR ;AN000; +EXTRN VIDEO_TABLE_MAX:ABS ; WGR ;AN000; +EXTRN SCAN_LINES:BYTE ; WGR ;AN000; +EXTRN PTRSAV:DWORD ; WGR ;AN000; +EXTRN PARSE_PARM:NEAR ; WGR ;AN000; +EXTRN ERR2:NEAR ; WGR ;AN000; +EXTRN EXT_16:BYTE ; WGR ;AN000; +EXTRN BRKADR:ABS ; WGR ;AN000; +EXTRN BRKKY:NEAR ; WGR ;AN000; +EXTRN COUT:NEAR ; WGR ;AN000; +EXTRN BASE:WORD ; WGR ;AN000; +EXTRN MODE:BYTE ; WGR ;AN000; +EXTRN MAXCOL:BYTE ; WGR ;AN000; +EXTRN TRANS:ABS ; WGR ;AN000; +EXTRN STATUS:ABS ; WGR ;AN000; +EXTRN EXIT:NEAR ; WGR ;AN000; +EXTRN MAX_SCANS:BYTE ; WGR ;AN000; +EXTRN ROM_INT10:WORD ; WGR ;AN000; +EXTRN INT10_COM:NEAR ; WGR ;AN000; +EXTRN ROM_INT2F:WORD ; WGR ;AN000; +EXTRN INT2F_COM:NEAR ; WGR ;AN000; +EXTRN ABORT:BYTE ; WGR ;AN000; +extrn Display_Loaded_Before_me:byte ;AN002;Defined in IOCTL.ASM +extrn Switch_K:Byte ;AN003; + +INCLUDE ANSIVID.INC ; WGR video tables data ;AN000; + +CON$INIT: + LDS BX,CS:[PTRSAV] ; WGR establish addressability to request header ;AC000; + LDS SI,[BX].ARG_PTR ; WGR DS:SI now points to rest of DEVICE=statement;AN000; + CALL PARSE_PARM ; WGR parse DEVICE= command line ;AN000; + JNC CONT_INIT ; WGR no error in parse...continue install ;AN000; + LDS BX,CS:[PTRSAV] ; WGR prepare to abort install ;AC000; + XOR AX,AX ; WGR ;AC000; + MOV [BX].NUM_UNITS,AL ; WGR set number of units to zero ;AC000; + MOV [BX].END_ADDRESS_O,AX ; WGR set ending address offset to 0 ;AC000; + MOV [BX].END_ADDRESS_S,CS ; WGR set ending address segment to CS ;AC000; + mov word ptr [bx].CONFIG_ERRMSG, -1 ;AN004; Let IBMBIO display "Error in CONFIG.SYS..". + MOV AX,UNKNOWN_CMD ; WGR set error in status ;AC000; + MOV WORD PTR [BX].STATUS,AX ; WGR set error status ;AC000; + JMP ERR2 ; WGR prepare to exit ;AN000; + +CONT_INIT: ; WGR ;AN000; + PUSH CS ; WGR ;AN000; + POP DS ; WGR restore DS to ANSI segment ;AN000; + MOV AX,ROM_BIOS ; WGR ;AN000; + MOV ES,AX ; WGR DS now points to BIOS data area ;AN000; + MOV AH,ES:[KBD_FLAG_3] ; WGR load AH with KBD_FLAG_3 ;AN000; + .IF AND ; WGR see if extended INT16 is loaded ;AN000; + .IF ;The user does not want to disable the extended INT 16h ;AN003; + MOV EXT_16,ON ; WGR extended INT16 available, set flag ;AN000; + .ENDIF ; WGR ;AN000; + CALL DET_HDWR ; WGR procedure to determine video hardware status;AN000; + .IF ; WGR if we have EGA or better then.. ;AN000; + MOV AH,ALT_SELECT ; WGR issue select alternate print.. ;AN000; + MOV BL,ALT_PRT_SC ; WGR screen routine call.. ;AN000; + INT 10H ; WGR ;AN000; + .ENDIF + CALL LOAD_INT10 ; WGR load interrupt 10h handler ;AN000; + CALL LOAD_INT2F ; WGR load interrupt 2Fh handler ;AN000; + int 11h + and al,00110000b + cmp al,00110000b + jnz iscolor + mov [base],0b000h ;look for bw card +iscolor: + cmp al,00010000b ;look for 40 col mode + ja setbrk + mov [mode],0 + mov [maxcol],39 + +setbrk: + XOR BX,BX + MOV DS,BX + MOV BX,BRKADR + MOV WORD PTR [BX],OFFSET BRKKY + MOV WORD PTR [BX+2],CS + + MOV BX,29H*4 + MOV WORD PTR [BX],OFFSET COUT + MOV WORD PTR [BX+2],CS + + LDS BX,CS:[PTRSAV] + MOV WORD PTR [BX].TRANS,OFFSET CON$INIT ;SET BREAK ADDRESS + MOV [BX].TRANS+2,CS + JMP EXIT + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: DET_HDWR +; +; FUNCTION: +; THIS CODE DETERMINES WHAT VIDEO HARDWARE IS AVAILABLE. THIS INFORMATION +; IS USED TO LOAD APPROPRIATE VIDEO TABLES INTO MEMORY FOR USE IN THE +; GENERIC IOCTL. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: FLAG WORD WILL CONTAIN BITS SET FOR THE APPROPRIATE +; TABLES. IN ADDITION, FOR VGA SUPPORT, A FLAG BYTE +; WILL CONTAIN THE AVAILABLE SCAN LINE SETTINGS FOR THE +; INSTALLED ADAPTER. +; VIDEO TABLES WILL BE LOADED INTO MEMORY REFLECTING +; APPLICABLE MODE SETTINGS AND SCREEN LINE LENGTHS. +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +DET_HDWR PROC NEAR ;AN000; + MOV AH,GET_SYS_ID ; see if this is a Convertible ;AN000; + INT 15H ; ;AN000; + .IF AND ; yes...check for LCD attached? ;AN000; + MOV AH,GET_STATUS ; system status will tell us ;AN000; + INT 15H ; ;AN000; + .IF ; if bit 0 = 0 then LCD.. ;AN000; + OR HDWR_FLAG,LCD_ACTIVE ; so ...set hdwr flag and... ;AN000; + LEA SI,COLOR_TABLE ; ;AN000; + MOV CX,COLOR_NUM ; load color table (for LCD) ;AN000; + CALL LOAD_TABLE ; ;AN000; + LEA SI,MONO_TABLE ; and mono table ;AN000; + MOV CX,MONO_NUM ; ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ELSE ; not LCD...check for CGA and mono ;AN000; + MOV AX,MONO_ADDRESS ; write to mono buffer to see if present ;AN000; + CALL CHECK_BUF ; ;AN000; + .IF ; if present then... ;AN000; + OR HDWR_FLAG,MONO_ACTIVE ; set hdwr flag and.. ;AN000; + LEA SI,MONO_TABLE ; ;AN000; + MOV CX,MONO_NUM ; load mono table ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ENDIF ; ;AN000; + MOV AX,COLOR_ADDRESS ; write to CGA buffer to see if present ;AN000; + CALL CHECK_BUF ; ;AN000; + .IF ; if present then.. ;AN000; + OR HDWR_FLAG,CGA_ACTIVE ; set hdwr flag and... ;AN000; + LEA SI,COLOR_TABLE ; ;AN000; + MOV CX,COLOR_NUM ; load color table ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + PUSH CS ; setup addressiblity for ;AN000; + POP ES ; functionality call ;AN000; + XOR AX,AX ; ;AN000; + MOV AH,FUNC_CALL ; functionality call ;AN000; + XOR BX,BX ; implementation type 0 ;AN000; + LEA DI,FUNC_INFO ; block to hold data ;AN000; + INT 10H ; ;AN000; + .IF ; if call supported then.. ;AN000; + .IF ; test bit to see if VGA ;AN000; + OR HDWR_FLAG,VGA_ACTIVE ; yes ....so ;AN000; + LEA SI,COLOR_TABLE ; set hdwr flag and... ;AN000; + MOV CX,COLOR_NUM ; load color table +.. ;AN000; + CALL LOAD_TABLE ; ;AN000; + LEA SI,VGA_TABLE ; load VGA table ;AN000; + MOV CX,VGA_NUM ; ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ELSE ; not VGA...then must be MCGA ;AN000; + .IF <[DI].ACTIVE_DISPLAY EQ MOD30_MONO> OR ;AN000; + .IF <[DI].ACTIVE_DISPLAY EQ MOD30_COLOR> OR ;AN000; + .IF <[DI].ALT_DISPLAY EQ MOD30_MONO> OR ;AN000; + .IF <[DI].ALT_DISPLAY EQ MOD30_COLOR> ;AN000; + OR HDWR_FLAG,MCGA_ACTIVE ; so...set hdwr flag and... ;AN000; + LEA SI,COLOR_TABLE ; ;AN000; + MOV CX,COLOR_NUM ; load color table +.. ;AN000; + CALL LOAD_TABLE ; ;AN000; + LEA SI,MCGA_TABLE ; load MCGA table ;AN000; + MOV CX,MCGA_NUM ; ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + MOV AL,[DI].CURRENT_SCANS ; copy current scan line setting.. ;AN000; + MOV MAX_SCANS,AL ; as maximum text mode scan setting. ;AN000; + LES DI,[DI].STATIC_ADDRESS ; point to static functionality table ;AN000; + MOV AL,ES:[DI].SCAN_TEXT ; load available scan line flag byte.. ;AN000; + MOV SCAN_LINES,AL ; and store it in resident data. ;AN000; + .ELSE ; call not supported..try EGA ;AN000; + MOV AH,ALT_SELECT ; alternate select call ;AN000; + MOV BL,EGA_INFO ; get EGA information subcall ;AN000; + INT 10H ; ;AN000; + .IF ; check if call was valid ;AN000; + .IF ; yes...check for monochrome ;AN000; + OR HDWR_FLAG,E5151_ACTIVE ; ..5151 found so set hdwr flag and.. ;AN000; + LEA SI,EGA_5151_TABLE ; ;AN000; + MOV CX,EGA_5151_NUM ; load 5151 table. ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ELSE ; ;AN000; + AND CL,0FH ; clear upper nibble of switch setting byte ;AN000; + .IF OR ; test for switch settings of 5154 ;AN000; + .IF ; ..5154 found.. ;AN000; + OR HDWR_FLAG,E5154_ACTIVE ; so..set hdwr flag and... ;AN000; + LEA SI,COLOR_TABLE ; ;AN000; + MOV CX,COLOR_NUM ; load color table +.. ;AN000; + CALL LOAD_TABLE ; ;AN000; + LEA SI,EGA_5154_TABLE ; load 5154 table ;AN000; + MOV CX,EGA_5154_NUM ; ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ELSE ; 5154 not found...must be 5153... ;AN000; + OR HDWR_FLAG,E5153_ACTIVE ; so..set hdwr flag and... ;AN000; + LEA SI,COLOR_TABLE ; ;AN000; + MOV CX,COLOR_NUM ; load color table +.. ;AN000; + CALL LOAD_TABLE ; ;AN000; + LEA SI,EGA_5153_TABLE ; load 5153 table ;AN000; + MOV CX,EGA_5153_NUM ; ;AN000; + CALL LOAD_TABLE ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + RET +DET_HDWR ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: CHECK_BUF +; +; FUNCTION: +; THIS PROCEDURE WRITES TO THE VIDEO BUFFER AND READS THE DATA BACK +; AGAIN TO DETERMINE THE EXISTANCE OF THE VIDEO CARD. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: AH EQ AL IF BUFFER PRESENT +; AH NE AL IF NO BUFFER +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +CHECK_BUF PROC NEAR ; write to video buffer to see if it is present ;AN000; + PUSH DS ; ;AN000; + MOV DS,AX ; load DS with address of buffer ;AN000; + MOV CH,DS:0 ; save buffer information (if present) ;AN000; + MOV AL,55H ; prepare to write sample data ;AN000; + MOV DS:0,AL ; write to buffer ;AN000; + PUSH BX ; terminate the bus so that lines.. ;AN000; + POP BX ; are reset ;AN000; + MOV AH,DS:0 ; bring sample data back... ;AN000; + MOV DS:0,CH ; repair damage to buffer ;AN000; + POP DS ; ;AN000; + RET ;AN000; +CHECK_BUF ENDP + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: LOAD_TABLE +; +; FUNCTION: +; THIS PROCEDURE COPIES ONE OF THE VIDEO TABLES INTO RESIDENT DATA. +; IT MAY BE REPEATED TO LOAD SEVERAL TABLES INTO THE SAME DATA SPACE. +; MATCHING MODES WILL BE OVERWRITTEN...THEREFORE..CARE MUST BE TAKEN +; IN LOAD ORDERING. +; +; AT ENTRY: +; SI: POINTS TO TOP OF TABLE TO COPY +; CX: NUMBER OF RECORDS TO COPY +; +; AT EXIT: +; NORMAL: TABLE POINTED TO BY SI IS COPIED INTO RESIDENT DATA AREA +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +LOAD_TABLE PROC NEAR ;AN000; + PUSH DI ; save DI ;AN000; + PUSH ES ; and ES ;AN000; + PUSH CS ; setup ES to code segment ;AN000; + POP ES ; ;AN000; + LEA DI,VIDEO_MODE_TABLE ; point DI to resident video table ;AN000; + .WHILE AND ; do for as many records as there are ;AN000; + .WHILE ; check to ensure other data not overwritten ;AN000; + MOV AL,[DI].V_MODE ; prepare to check resident table ;AN000; + .IF AND ; if this spot is occupied...and ;AN000; + .IF ; ...is not the same mode then... ;AN000; + ADD DI,TYPE MODE_TABLE ; do not touch...go to next mode ;AN000; + .ELSE ; can write at this location ;AN000; + PUSH CX ; save record count ;AN000; + MOV CX,TYPE MODE_TABLE ; load record length ;AN000; + REP MOVSB ; copy record to resident data ;AN000; + lea DI,VIDEO_MODE_TABLE ;AN001; Set DI to the top of the target again. + POP CX ; restore record count and.. ;AN000; + DEC CX ; decrement ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + POP ES ; restore.. ;AN000; + POP DI ; registers ;AN000; + RET ; ;AN000; +LOAD_TABLE ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: LOAD_INT10 +; +; FUNCTION: +; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT10H +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: INTERRUPT 10H VECTOR POINTS TO INT10_COM. OLD INT 10H +; VECTOR STORED. +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +LOAD_INT10 PROC NEAR ;AN000; + PUSH ES ;AN000; + XOR AX,AX ; point ES to low.. ;AN000; + MOV ES,AX ; memory. ;AN000; + MOV CX,ES:WORD PTR INT10_LOW ; store original.. ;AN000; + MOV CS:ROM_INT10,CX ; interrupt 10h.. ;AN000; + MOV CX,ES:WORD PTR INT10_HI ; location.. ;AN000; + MOV CS:ROM_INT10+2,CX ; ;AN000; + CLI ; ;AN000; + MOV ES:WORD PTR INT10_LOW,OFFSET INT10_COM ; replace vector.. ;AN000; + MOV ES:WORD PTR INT10_HI,CS ; with our own.. ;AN000; + STI ; ;AN000; + mov ax, DISPLAY_CHECK ;AN002;DISPLAY.SYS already loaded? + int 2fh ;AN002; + cmp al, INSTALLED ;AN002; + jne L_INT10_Ret ;AN002; + mov cs:Display_Loaded_Before_Me,1 ;AN002; +L_INT10_Ret: ;AN002; + POP ES ; ;AN000; + RET ; ;AN000; +LOAD_INT10 ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: LOAD_INT2F +; +; FUNCTION: +; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH +; VECTOR STORED. +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +LOAD_INT2F PROC NEAR ;AN000; + PUSH ES ;AN000; + XOR AX,AX ; point ES to low.. ;AN000; + MOV ES,AX ; memory. ;AN000; + MOV AX,ES:WORD PTR INT2F_LOW ; store original.. ;AN000; + MOV CS:ROM_INT2F,AX ; interrupt 2Fh.. ;AN000; + MOV CX,ES:WORD PTR INT2F_HI ; location.. ;AN000; + MOV CS:ROM_INT2F+2,CX ; ;AN000; + OR AX,CX ; check if old int2F.. ;AN000; + .IF Z ; is 0. ;AN000; + MOV AX,OFFSET ABORT ; yes....point to.. ;AN000; + MOV CS:ROM_INT2F,AX ; IRET. ;AN000; + MOV AX,CS ; ;AN000; + MOV CS:ROM_INT2F+2,AX ; ;AN000; + .ENDIF ; ;AN000; + CLI ; ;AN000; + MOV ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector.. ;AN000; + MOV ES:WORD PTR INT2F_HI,CS ; with our own.. ;AN000; + STI ; ;AN000; + POP ES ; ;AN000; + RET ; ;AN000; +LOAD_INT2F ENDP ;AN000; + + +CODE ENDS + END diff --git a/v4.0/src/DEV/ANSI/ANSIVID.INC b/v4.0/src/DEV/ANSI/ANSIVID.INC new file mode 100644 index 0000000..77adb52 --- /dev/null +++ b/v4.0/src/DEV/ANSI/ANSIVID.INC @@ -0,0 +1,54 @@ +VGA_TABLE LABEL BYTE ;AN000; + MODE_TABLE < 1, 1,, 16, -1, -1, 40, -1> ; mode 1 Ä¿ To give preference;AN000; + MODE_TABLE < 0, 1,, 16, -1, -1, 40, -1> ; mode 0 ³ of COxx over ;AN000; + MODE_TABLE < 3, 1,, 16, -1, -1, 80, -1> ; mode 3 ³ BWxx. ;AN000; + MODE_TABLE < 2, 1,, 16, -1, -1, 80, -1> ; mode 2 ÄÙ (see text) ;AN000; + MODE_TABLE < 7, 1,, 0, -1, -1, 80, -1> ; mode 7 ;AN000; + MODE_TABLE <13, 2,, 16, 320, 200, 40, 25> ; mode 13 ;AN000; + MODE_TABLE <14, 2,, 16, 640, 200, 80, 25> ; mode 14 ;AN000; + MODE_TABLE <15, 2,, 0, 640, 350, 80, 25> ; mode 15 ;AN000; + MODE_TABLE <16, 2,, 16, 640, 350, 80, 25> ; mode 16 ;AN000; + MODE_TABLE <17, 2,, 2, 640, 480, 80, 30> ; mode 17 ;AN000; + MODE_TABLE <18, 2,, 16, 640, 480, 80, 30> ; mode 18 ;AN000; + MODE_TABLE <19, 2,,256, 320, 200, 40, 25> ; mode 19 ;AN000; +VGA_NUM EQU ($ - VGA_TABLE)/(TYPE MODE_TABLE) ;AN000; + +MCGA_TABLE LABEL BYTE ;AN000; + MODE_TABLE <17, 2,, 2, 640, 480, 80, 30> ; mode 17 ;AN000; + MODE_TABLE <19, 2,,256, 320, 200, 40, 25> ; mode 19 ;AN000; +MCGA_NUM EQU ($ - MCGA_TABLE)/(TYPE MODE_TABLE) ;AN000; + +EGA_5154_TABLE LABEL BYTE ;AN000; + MODE_TABLE < 1, 1,, 16, -1, -1, 40, 43> ; mode 1 Ä¿ To give preference;AN000; + MODE_TABLE < 0, 1,, 16, -1, -1, 40, 43> ; mode 0 ³ of COxx over ;AN000; + MODE_TABLE < 3, 1,, 16, -1, -1, 80, 43> ; mode 3 ³ BWxx. ;AN000; + MODE_TABLE < 2, 1,, 16, -1, -1, 80, 43> ; mode 2 ÄÙ (see text) ;AN000; + MODE_TABLE <13, 2,, 16, 320, 200, 40, 25> ; mode 13 ;AN000; + MODE_TABLE <14, 2,, 16, 640, 200, 80, 25> ; mode 14 ;AN000; + MODE_TABLE <16, 2,, 16, 640, 350, 80, 25> ; mode 16 ;AN000; +EGA_5154_NUM EQU ($ - EGA_5154_TABLE)/(TYPE MODE_TABLE) ;AN000; + +EGA_5153_TABLE LABEL BYTE ;AN000; + MODE_TABLE <13, 2,, 16, 320, 200, 40, 25> ; mode 13 ;AN000; + MODE_TABLE <14, 2,, 16, 640, 200, 80, 25> ; mode 14 ;AN000; +EGA_5153_NUM EQU ($ - EGA_5153_TABLE)/(TYPE MODE_TABLE) ;AN000; + +EGA_5151_TABLE LABEL BYTE ;AN000; + MODE_TABLE < 7, 1,, 0, -1, -1, 80, 43> ; mode 7 ;AN000; + MODE_TABLE <15, 2,, 0, 640, 350, 80, 25> ; mode 15 ;AN000; +EGA_5151_NUM EQU ($ - EGA_5151_TABLE)/(TYPE MODE_TABLE) ;AN000; + +MONO_TABLE LABEL BYTE ;AN000; + MODE_TABLE < 7, 1,, 0, -1, -1, 80, 25> ; mode 7 ;AN000; +MONO_NUM EQU ($ - MONO_TABLE)/(TYPE MODE_TABLE) ;AN000; + +COLOR_TABLE LABEL BYTE ;AN000; + MODE_TABLE < 1, 1,, 16, -1, -1, 40, 25> ; mode 1 Ä¿ To give preference;AN000; + MODE_TABLE < 0, 1,, 16, -1, -1, 40, 25> ; mode 0 ³ of COxx over ;AN000; + MODE_TABLE < 3, 1,, 16, -1, -1, 80, 25> ; mode 3 ³ BWxx. ;AN000; + MODE_TABLE < 2, 1,, 16, -1, -1, 80, 25> ; mode 2 ÄÙ (see text) ;AN000; + MODE_TABLE < 4, 2,, 4, 320, 200, 40, 25> ; mode 4 ;AN000; + MODE_TABLE < 5, 2,, 2, 320, 200, 40, 25> ; mode 5 ;AN000; + MODE_TABLE < 6, 2,, 2, 640, 200, 80, 25> ; mode 6 ;AN000; +COLOR_NUM EQU ($ - COLOR_TABLE)/(TYPE MODE_TABLE) ;AN000; + \ No newline at end of file diff --git a/v4.0/src/DEV/ANSI/IOCTL.ASM b/v4.0/src/DEV/ANSI/IOCTL.ASM new file mode 100644 index 0000000..506e06c --- /dev/null +++ b/v4.0/src/DEV/ANSI/IOCTL.ASM @@ -0,0 +1,1126 @@ +PAGE ,132 +TITLE ANSI Generic IOCTL Code + +;****************** START OF SPECIFICATIONS ************************** +; +; MODULE NAME: IOCTL.ASM +; +; DESCRIPTIVE NAME: PERFORM THE GENERIC IOCTL CALL IN ANSI.SYS +; +; FUNCTION: THE GENERIC DEVICE IOCTL IS USED TO SET AND GET THE +; MODE OF THE DISPLAY DEVICE ACCORDING TO PARAMETERS PASSED +; IN A BUFFER. ADDITIONALLY, THE CALL CAN TOGGLE THE +; USE OF THE INTENSITY BIT, AND CAN LOAD THE 8X8 CHARACTER +; SET, EFFECTIVELY GIVING MORE LINES PER SCREEN. THE +; AVAILABILITY OF THIS FUNCTION VARIES STRONGLY WITH HARDWARE +; ATTACHED. +; +; ENTRY POINT: GENERIC_IOCTL +; +; INPUT: LOCATION OF REQUEST PACKET STORED DURING STRATEGY CALL. +; +; AT EXIT: +; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET +; +; ERROR: CARRY SET - ERROR CODE IN AX. +; AX = 1 - INVALID FUNCTION. EXTENDED ERROR = 20 +; AX = 10 - UNSUPPORTED FUNCTION ON CURRENT HARDWARE. +; EXTENDED ERROR = 29 +; AX = 12 - DISPLAY.SYS DOES NOT HAVE 8X8 RAM CHARACTER SET. +; EXTENDED ERROR = 31 +; +; INTERNAL REFERENCES: +; +; ROUTINES: GET_IOCTL - PERFORMS THE GET DEVICE CHARACTERISTICS +; SET_IOCTL - PERFORMS THE SET DEVICE CHARACTERISTICS +; TEST_LENGTH - TESTS FOR VALIDITY OF A SCREEN SIZE VALUE +; CTL_FLAG - READS THE CURRENT USE FOR THE INT/BLINK BIT +; SET_CTL_FLAG - SETS THE USE FOR THE INT/BLINK BIT +; GET_SEARCH - SEARCHES THE INTERNAL VIDEO TABLE FOR THE +; CURRENT MODE MATCH +; SET_SEARCH - SEARCHES THE INTERNAL VIDEO TABEL FOR THE +; CURRENT MODE MATCH +; SET_CURSOR_EMUL - SETS THE BIT THAT CONTROLS CURSOR EMULATION +; INT10_COM - INTERRUPT 10H HANDLER TO KEEP CURRENT SCREEN SIZE +; INT2F_COM - INTERRUPT 2FH INTERFACE TO GENERIC IOCTL +; MAP_DOWN - PERFORMS CURSOR TYPE MAPPING FOR EGA WITH MONOCHROME +; SET_VIDEO_MODE - SETS THE VIDEO MODE +; ROM_LOAD_8X8 - LOADS THE 8X8 CHARACTER SET. +; PROCESS_NORMAL - DOES THE SET PROCESS FOR ADAPTERS OTHER THAN +; THE VGA +; PROCESS_VGA - DOES THE SET PROCESS FOR THE VGA ADAPTER +; CHECK_FOR_DISPLAY - CHECKS FOR DISPLAY.SYS SUPPORT +; +; DATA AREAS: SCAN_LINE_TABLE - HOLDS SCAN LINE INFORMATION FOR PS/2 +; FUNC_INFO - BUFFER FOR PS/2 FUNCTIONALITY CALL. +; +; +; EXTERNAL REFERENCES: +; +; ROUTINES: INT 10H SERVICES +; +; DATA AREAS: VIDEO_MODE_TABLE - INTERNAL TABLE FOR CHARACTERISTICS TO MODE +; MATCH-UPS +; +; NOTES: +; +; REVISION HISTORY: +; +; Label: "DOS ANSI.SYS Device Driver" +; "Version 4.00 (C) Copyright 1988 Microsoft" +; "Licensed Material - Program Property of Microsoft" +; +;****************** END OF SPECIFICATIONS **************************** +;Modification history ********************************************************* +;AN001; P1350 Codepage switching not working on EGA 10/10/87 J.K. +;AN002; P1626 ANSI does not allow lines=43 with PS2,Monochrome 10/15/87 J.K. +;AN003; p1774 Lines=43 after selecting cp 850 does not work 10/20/87 J.K. +;AN004; p1740 MODE CON LINES command causes problem with PE2 w PS/210/24/87 J.K. +;AN005; p2167 Does'nt say EGA in medium resol. cannot do 43 lines 10/30/87 J.K. +;AN006; p2236 After esc [=0h, issuing INT10h,AH=fh returns mode=1. 11/3/87 J.K. +;AN007; p2305 With ANSI loaded, loading RDTE hangs the system 11/06/87 J.K. +;AN008; P2617 Order dependecy problem with Display.sys 11/23/87 J.K. +;AN009; p2716 HOT key of VITTORIA does not work properly 12/03/87 J.K. +;AN010; d398 /L option for Enforcing the number of lines 12/17/87 J.K. +;AN011; D425 For OS2 compatibiltiy box, /L option status query 01/14/88 J.K. +;****************************************************************************** + +INCLUDE ANSI.INC ;AN000; +.XLIST ;AN000; +INCLUDE STRUC.INC ;AN000; +.LIST ;AN000; + ;AN000; +PUBLIC GENERIC_IOCTL ;AN000; +PUBLIC FUNC_INFO ;AN000; +PUBLIC MAX_SCANS ;AN000; +PUBLIC INT10_COM ;AN000; +PUBLIC ROM_INT10 ;AN000; +PUBLIC INT2F_COM ;AN000; +PUBLIC ROM_INT2F ;AN000; +PUBLIC ABORT ;AN000; +PUBLIC REQ_TXT_LENGTH ;AN000; +PUBLIC GRAPHICS_FLAG ;AN000; +public Display_Loaded_Before_Me ;AN008; + ;AN000; +CODE SEGMENT PUBLIC BYTE ;AN000; + ASSUME CS:CODE,DS:CODE ;AN000; + ;AN000; +EXTRN PTRSAV:DWORD ;AN000; +EXTRN NO_OPERATION:NEAR ;AN000; +EXTRN ERR1:NEAR ;AN000; +EXTRN VIDEO_MODE_TABLE:BYTE ;AN000; +extrn MAX_VIDEO_TAB_NUM:ABS +EXTRN HDWR_FLAG:WORD ;AN000; +EXTRN SCAN_LINES:BYTE ;AN000; +extrn Switch_L:Byte ;AN010;Defined in ANSI.ASM + ;AN000; + ;AN000; +SCAN_LINE_TABLE LABEL BYTE ;AN000; + SCAN_LINE_STR <200,000000001B,0> ; 200 scan lines ;AN000; + SCAN_LINE_STR <344,000000010B,1> ; 350 scan lines ;AN000; + SCAN_LINE_STR <400,000000100B,2> ; 400 scan lines ;AN000; +SCANS_AVAILABLE EQU ($ - SCAN_LINE_TABLE)/TYPE SCAN_LINE_STR ;AN000; + ;AN000; +;This is used when ANSI calls Get_IOCTL, Set_IOCTL by itself. +In_Generic_IOCTL_flag db 0 ;AN004; +I_AM_IN_NOW EQU 00000001b ;AN004; +SET_MODE_BY_DISPLAY EQU 00000010b ;AN004;Display.sys calls Set mode INT 10h. +CALLED_BY_INT10COM EQU 00000100b ;AN009;To prevent from calling set mode int 10h again. + +INT10_V_Mode db 0ffh ;AN006;Used by INT10_COM + +My_IOCTL_Req_Packet REQ_PCKT <0,0,0Eh,0,?,0,?,?,?,?,?> ;AN004; + ;AN000; +FUNC_INFO INFO_BLOCK <> ; data block for functionality call ;AN000; +ROM_INT10 DW ? ; segment and offset of original.. ;AN000; + DW ? ; interrupt 10h vector. ;AN000; +ROM_INT2F DW ? ; segment and offset of original.. ;AN000; + DW ? ; interrupt 2Fh vector. ;AN000; +INTENSITY_FLAG DW OFF ; intensity flag initially off ;AN000; +REQ_TXT_LENGTH DW DEFAULT_LENGTH ; requested text screen length ;AN000; +SCAN_DESIRED DB 0 ; scan lines desired ;AN000; +MAX_SCANS DB 0 ; maximum scan line setting ;AN000; +GRAPHICS_FLAG DB TEXT_MODE ; flag for graphics mode ;AN000; +ERROR_FLAG DB OFF ; flag for error conditions ;AN000; +Display_Loaded_Before_Me db 0 ;AN008;flag +ANSI_SetMode_Call_Flag db 0 ;AN008;Ansi is issuing INT10,AH=0. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: GENERIC_IOCTL +; +; FUNCTION: +; TO GET OR SET DEVICE CHARACTERISTICS ACCORDING TO THE BUFFER PASSED +; IN THE REQUEST PACKET. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET +; +; ERROR: CARRY SET - ERROR CODE IN AL. (SEE MODULE DESCRIPTION ABOVE). +; +; NOTE: THIS PROC IS PERFORMED AS A JMP AS WITH THE OLD ANSI CALLS. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +GENERIC_IOCTL: ; ;AN000; + LES BX,[PTRSAV] ; establish addressability to request header ;AN000; + .SELECT ; check for get or set subfunction ;AN000; + .WHEN ; is this the get subfunction? ;AN000; + LES DI,ES:[BX].REQ_PCKT_PTR ; point to request packet ;AN000; + CALL GET_IOCTL ; yes...execute routine ;AN000; + .WHEN ; is this the set subfunction? ;AN000; + LES DI,ES:[BX].REQ_PCKT_PTR ; point to request packet ;AN000; + CALL SET_IOCTL ; yes....execute routine ;AN000; + .OTHERWISE ; not for us....so.. ;AN000; + JMP NO_OPERATION ; call lower CON device ;AN000; + .ENDSELECT ; ;AN000; + .IF C ; error?.... ;AN000; + OR AX,CMD_ERROR ; yes...set error bit in status ;AN000; + .ENDIF ; ;AN000; + OR AX,DONE ; add done bit to status ;AN000; + JMP ERR1 ; return with status in AX ;AN000; + ;AN000; + ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: GET_IOCTL +; +; FUNCTION: +; THIS PROCEDURE RETURNS DEVICE CHARACTERISTICS. +; +; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER +; +; AT EXIT: +; NORMAL: CARRY CLEAR - REQUEST BUFFER CONTAINS DEVICE CHARACTERISTICS +; +; ERROR: CARRY SET - ERROR CONDITION IN AX +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +GET_IOCTL PROC NEAR ;AN000; + .IF OR ; check for valid info level ;AN000; + .IF > ; and buffer size. ;AN000; + MOV AX,INVALID_FUNC ; not valid...unsupported ;AN000; + STC ; function..set error flag and ;AN000; + .ELSE ; ;AN000; + MOV ES:[DI].INFO_LEVEL+1,0 ; set reserved byte to 0. ;AN000; + MOV AH,REQ_VID_MODE ; request current video mode ;AN000; + INT 10H ; ;AN000; + AND AL,VIDEO_MASK ; ;AN000; + LEA SI,VIDEO_MODE_TABLE ; point to resident video table ;AN000; + CALL GET_SEARCH ; perform search ;AN000; + .IF C ; found? ;AN000; + MOV AX,NOT_SUPPORTED ; no....load unsupported function ;AN000; + .ELSE ; ;AN000; + push di ;AN001;AN003;Save Request Buffer pointer + MOV WORD PTR ES:[DI].DATA_LENGTH,(TYPE MODE_TABLE)+1 ;length of data is struc size ;AN000; + INC SI ; skip mode value ;AN000; + ADD DI,RP_FLAGS ; point to flag word ;AN000; + .IF ; if we have an EGA or better ;AN000; + CALL CTL_FLAG ; then ..process control flag ;AN000; + .ELSE ; else... ;AN000; + MOV WORD PTR ES:[DI],OFF ; we always have blink. ;AN000; + .ENDIF ; ;AN000; + INC DI ; point to next field.. ;AN000; + INC DI ; ..(display mode) ;AN000; + MOV CX,(TYPE MODE_TABLE)-1 ; load count ;AN000; + REP MOVSB ; transfer data from video table to request packet;AN000; + SUB SI,TYPE MODE_TABLE ; point back to start of mode data ;AN000; + .IF <[SI].D_MODE EQ TEXT_MODE> AND ; if we are in text mode and.. ;AN000; + .IF <[SI].SCR_ROWS NE DEFAULT_LENGTH> ; length <> 25 then we have an EGA or VGA ;AN000; + DEC DI ; point back to length entry in req packet ;AN000; + DEC DI ; ;AN000; + PUSH DS ; ;AN000; + MOV AX,ROM_BIOS ; load ROM BIOS data area segment ;AN000; + MOV DS,AX ; ;AN000; + MOV AL,BYTE PTR DS:[NUM_ROWS] ; load current number of rows ;AN000; + CBW ; ;AN000; + INC AX ; add 1 to row count ;AN000; + MOV WORD PTR ES:[DI],AX ; and copy to request packet ;AN000; + POP DS ; ;AN000; + .ENDIF ; ;AN000; + XOR AX,AX ; no errors ;AN000; + CLC ; clear error flag ;AN000; + pop di ;AN001; AN003;Restore Request Buffer pointer + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + RET ; return to calling module ;AN000; +GET_IOCTL ENDP ;AN000; + ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: SET_IOCTL +; +; FUNCTION: +; THIS PROCEDURE SETS THE VIDEO MODE AND CHARACTER SET ACCORDING +; TO THE CHARACTERSTICS PROVIDED. +; +; AT ENTRY: +; ES:[DI] POINTS TO REQUEST BUFFER +; +; AT EXIT: +; NORMAL: CLEAR CARRY - VIDEO MODE SET +; +; ERROR: CARRY SET - ERROR CONDITION IN AX +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SET_IOCTL PROC NEAR ;AN000; + or cs:In_Generic_IOCTL_Flag, I_AM_IN_NOW ;AN004; Signal GENERIC_IOCTL request being processed + MOV ERROR_FLAG,OFF ; clear any errors ;AN000; + .IF OR ; check for valid info level ;AN000; + .IF > OR ; and buffer size. ;AN000; + MOV AX,ES:[DI].RP_FLAGS ; test for invalid flags. ;AN000; + .IF OR ; ;AN000; + .IF AND ; if intensity is requested and.. ;AN000; + .IF ; hardware does not support it then.. ;AN000; + MOV AX,INVALID_FUNC ; not valid...unsupported.. ;AN000; + MOV ERROR_FLAG,ON ; function..set error and.. ;AN000; + .ELSE ; ;AN000; + CALL SET_SEARCH ; search table for match ;AN000; + .IF C ; if match not found then.. ;AN000; + MOV AX,NOT_SUPPORTED ; not supported.... ;AN000; + MOV ERROR_FLAG,ON ; ;AN000; + .ELSE ; ;AN000; + .IF <[SI].D_MODE EQ TEXT_MODE> ; is a text mode being requested? ;AN000; + PUSH REQ_TXT_LENGTH ; save old value in case of error ;AN000; + MOV AX,ES:[DI].RP_ROWS ; save new requested value. ;AN000; + MOV REQ_TXT_LENGTH,AX ; ;AN000; +; .IF <[SI].SCR_ROWS NE UNOCCUPIED> ; yes...check for VGA support.. ;AN000; +; CALL PROCESS_NORMAL ; no..process other adapters.. ;AN000; +; .ELSE ; VGA support available.. ;AN000; +; CALL PROCESS_VGA ; process the VGA support code. ;AN000; +; .ENDIF ; ;AN000; + .IF <[SI].SCR_ROWS E UNOCCUPIED> OR ;AN002; + .IF ;AN002; + call process_VGA ;AN002; + .ELSE ;AN002; + call process_Normal ;AN002; + .ENDIF ;AN002; + .IF ; if we had no errors then.. ;AN000; + POP AX ; discard saved text length ;AN000; + call DO_ROWS ;AN004; + .IF ; does hardware support gt 25 lines? ;AN000; + CALL SET_CURSOR_EMUL ; yes..ensure cursor emulation is.. ;AN000; + .ENDIF ; set accordingly. ;AN000; + .ELSE ; ;AN000; + POP REQ_TXT_LENGTH ; error...so restore old value. ;AN000; + .ENDIF ; ;AN000; + .ELSE ; request is for graphics mode ;AN000; + CALL SET_VIDEO_MODE ; so set video mode. ;AN000; + .ENDIF ; ;AN000; + .IF AND ; no errors? then.. ;AN000; + .IF AND ; for the EGA and better .... ;AN000; + .IF <[SI].V_MODE EQ TEXT_MODE> ; and in text mode do... ;AN000; + CALL SET_CTL_FLAG ; set intensity bit to control value ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + and cs:In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ;AN004; Turn the flag off + .IF ; no errors? ;AN000; + XOR AX,AX ; clear error register ;AN000; + CLC ; clear error flag ;AN000; + .ELSE ; ;AN000; + STC ; ;AN000; + .ENDIF ; yes...set error flag ;AN000; + RET ; ;AN000; +SET_IOCTL ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PROCESS_NORMAL +; +; FUNCTION: +; THIS PROCEDURE PROCESSES THE SET IOCTL FOR ADAPTERS OTHER THAN +; THE VGA. +; +; AT ENTRY: AX - SCREEN LENGTH DESIRED +; DS:SI - POINTS TO MODE RECORD IN VIDEO TABLE. +; +; AT EXIT: +; NORMAL: MODE SET +; +; ERROR: ERROR_FLAG IS ON. ERROR CODE IN AX. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PROCESS_NORMAL PROC NEAR ;AN000; + .IF AND ; no..see if length requested.. ;AN000; + .IF ; is valid.... ;AN000; + MOV AX,NOT_SUPPORTED ; not valid....so ;AN000; + MOV ERROR_FLAG,ON ; set error flag and.. ;AN000; + .ELSE ; length is valid so.. ;AN000; + CALL CHECK_FOR_DISPLAY ; see if we need and have DISPLAY.SYS.. ;AN000; + .IF NC ; support...if no problems then.. ;AN000; + .IF ; yes...check for cursor emulation ;AN000; + CALL SET_CURSOR_EMUL ; ;AN000; + .ENDIF ; ;AN000; + CALL SET_VIDEO_MODE ; ..and set the mode. ;AN000; + .ELSE ; no.. ;AN000; + MOV AX,NOT_AVAILABLE ; font not available.. ;AN000; + MOV ERROR_FLAG,ON ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + RET +PROCESS_NORMAL ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PROCESS_VGA +; +; FUNCTION: +; THIS PROCEDURE PROCESSES THE SET IOCTL FOR THE VGA ADAPTER +; +; AT ENTRY: AX - SCREEN LENGTH DESIRED +; DS:SI - POINTS TO MODE RECORD IN VIDEO TABLE. +; +; AT EXIT: +; NORMAL: MODE SET +; +; ERROR: ERROR_FLAG IS ON. ERROR CODE IN AX. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PROCESS_VGA PROC NEAR ;AN000; + CALL TEST_LENGTH ; check to see if screen length ;AN000; + .IF C ; is applicable.... ;AN000; + MOV AX,NOT_SUPPORTED ; no..so set error condition ;AN000; + MOV ERROR_FLAG,ON ; ;AN000; + .ELSE ; ;AN000; + CALL CHECK_FOR_DISPLAY ; see if we need and have DISPLAY.SYS.. ;AN000; + .IF NC ; support.....yes so.. ;AN000; + .IF ; 25 lines requested? ;AN000; + MOV AL,MAX_SCANS ; desired scan setting should be.. ;AN000; + MOV SCAN_DESIRED,AL ; the maximum. ;AN000; + .ENDIF ; ;AN000; + MOV AH,ALT_SELECT ; set the appropriate number.. ;AN000; + MOV BL,SELECT_SCAN ; of scan lines.. ;AN000; + MOV AL,SCAN_DESIRED ; ;AN000; + INT 10H ; ;AN000; + CALL SET_VIDEO_MODE ; and set the mode. ;AN000; + .ELSE ; DISPLAY.SYS does not have the font. ;AN000; + MOV AX,NOT_AVAILABLE ; so...load error code.. ;AN000; + MOV ERROR_FLAG,ON ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + RET ;AN000; +PROCESS_VGA ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Procedure name: DO_ROWS +; Function: +; Only called for TEXT_MODE. +; If (REQ_TXT_LENGTH <> DEFAULT_LENGTH) & +; (DISPLAY.SYS not loaded or CODEPAGE not active) +; then +; LOAD ROM 8X8 charater. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +DO_ROWS proc near ;AN004; + .IF ;AN004; + push ds ;AN004; + push es ;AN004; + push di ;AN004; + push si ;AN004; + mov ax, DISPLAY_CHECK ;AN004; + int 2fh ;AN004; + .IF OR ;AN004; + mov ax, CHECK_ACTIVE ;AN004; + int 2fh ;AN004; + .IF C ;AN004; + call ROM_LOAD_8X8 ;AN004; + .ENDIF ;AN004; + pop si ;AN004; + pop di ;AN004; + pop es ;AN004; + pop ds ;AN004; + .ENDIF ;AN004; + ret ;AN004; +DO_ROWS endp ;AN004; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: TEST_LENGTH +; +; FUNCTION: +; THIS PROCEDURE ENSURES THAT THE SCREEN LENGTH REQUESTED CAN BE +; OBTAINED USING THE AVAILABLE SCAN LINE SETTINGS. (VGA ONLY!) +; +; AT ENTRY: +; +; +; AT EXIT: +; NORMAL: CARRY CLEAR - SCAN_DESIRED CONTAINS SETTING REQUIRED +; +; ERROR: CARRY SET +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +TEST_LENGTH PROC NEAR ;AN000; + push bp ;AN007; + MOV AX,REQ_TXT_LENGTH ; load AX with length requested ;AN000; + MOV BP,EIGHT ; ;AN000; + MUL BP ; mulitply by 8 to get scan lines ;AN000; + LEA BX,SCAN_LINE_TABLE ; load BX with scan line table start ;AN000; + MOV CX,SCANS_AVAILABLE ; total number of scan lines settings ;AN000; + MOV BP,NOT_FOUND ; set flag ;AN000; + .WHILE AND ; while not found and still valid.. ;AN000; + .WHILE ; settings left..do.. ;AN000; + .IF ; pointing at the right setting.. ;AN000; + MOV DL,[BX].REP_1BH ; ;AN000; + .IF ; does the hardware have it?.. ;AN000; + MOV BP,FOUND ; yes....found!! ;AN000; + .ELSE ; ;AN000; + XOR CX,CX ; no...set CX to exit loop. ;AN000; + .ENDIF ; ;AN000; + .ELSE ; ;AN000; + ADD BX,TYPE SCAN_LINE_STR ; not this setting..point to next ;AN000; + DEC CX ; record and decrement count ;AN000; + .ENDIF ; ;AN000; + .ENDWHILE ; ;AN000; + .IF ; was it found and available? ;AN000; + STC ; no....set error flag ;AN000; + .ELSE ; yes so..... ;AN000; + MOV CL,[BX].REP_12H ; store value to set it. ;AN000; + MOV SCAN_DESIRED,CL ; ;AN000; + CLC ; clear error flag ;AN000; + .ENDIF ; ;AN000; + pop bp ;AN007; + RET ; return to calling module ;AN000; +TEST_LENGTH ENDP ;AN000; + ;AN000; + ;AN000; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: CTL_FLAG +; +; FUNCTION: +; THIS PROCEDURE RETURNS THE CURRENT USE FOR THE INTENSITY/BLINKING +; BIT. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: +; VGA,MCGA: VALUE RETURNED FROM FUNCTIONALITY CALL +; EGA: VALUE LAST SET THROUGH IOCTL. DEFAULT IS BLINKING. +; CGA,MONO: BLINKING +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;AN000; +CTL_FLAG PROC NEAR ;AN000; + .IF ; VGA supported? ;AN000; + PUSH ES ; yes...prepare for ;AN000; + PUSH DI ; functionality call ;AN000; + PUSH DS ; ;AN000; + POP ES ; ;AN000; + LEA DI,FUNC_INFO ; point to data block ;AN000; + MOV AH,FUNC_CALL ; load function number ;AN000; + XOR BX,BX ; implementation type 0 ;AN000; + INT 10H ; ;AN000; + MOV AL,ES:[DI].MISC_INFO ; load misc info byte ;AN000; + .IF ; is blink bit set? ;AN000; + AND INTENSITY_FLAG,NOT ON ; yes....turn off intensity flag ;AN000; + .ELSE ; no... ;AN000; + OR INTENSITY_FLAG,ON ; ensure that intensity is set ;AN000; + .ENDIF ; ;AN000; + POP DI ; restore registers ;AN000; + POP ES ; ;AN000; + .ENDIF ; ;AN000; + MOV AX,INTENSITY_FLAG ; write the control flag.. ;AN000; + MOV ES:[DI],AX ; to the request packet ;AN000; + RET ; ;AN000; +CTL_FLAG ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: SET_CTL_FLAG +; +; FUNCTION: +; THIS PROCEDURE SET THE TOGGLE/INTENSITY BIT AS SPECIFIED IN THE +; CONTROL FLAG IOCTL SET SUBFUNCTION. THIS ROUTINE IS ONLY CALLED FOR +; AN EGA, MCGA, OR VGA. +; +; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER +; +; AT EXIT: +; NORMAL: INTENSITY_FLAG SET APPROPRIATELY AND SYSTEM BIT SET +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SET_CTL_FLAG PROC NEAR ;AN000; + .IF ;AN000; + OR INTENSITY_FLAG,ON ;AN000; + MOV BL,SET_INTENSIFY ;AN000; + .ELSE ;AN000; + AND INTENSITY_FLAG,NOT ON ;AN000; + MOV BL,SET_BLINK ;AN000; + .ENDIF ;AN000; + MOV AX,BLINK_TOGGLE ;AN000; + INT 10H ;AN000; + RET ;AN000; +SET_CTL_FLAG ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: SET_SEARCH +; +; FUNCTION: +; THIS PROCEDURE SEARCHES THE RESIDENT VIDEO TABLE IN ATTEMPT TO +; FIND A MODE THAT MATHCES THE CHARACTERISTICS REQUESTED. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: CARRY CLEAR - SI POINTS TO APPLICABLE RECORD +; +; ERROR: CARRY SET +; +;AN006; When INT10_V_Mode <> 0FFH, then assumes that the user +; issuing INT10h, Set mode function call. Unlike Generic IOCTL +; set mode call, the user already has taken care of the video mode. +; So, we also find the matching V_MODE. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;AN000; +SET_SEARCH PROC NEAR ;AN000; + push bp ;AN007; + LEA SI,VIDEO_MODE_TABLE ; point to video table ;AN000; + MOV BP,NOT_FOUND ; set flag indicating not found ;AN000; + MOV CX,MAX_VIDEO_TAB_NUM ; load counter, # of tables ;AN000; + .WHILE AND ; while not found and we still.. ;AN000; + .WHILE <[SI].V_MODE NE UNOCCUPIED> AND ; have valid entries.. ;AN000; + .WHILE ; do... ;AN000; + mov al, cs:INT10_V_Mode ;AN006; + .if AND ;AN006;if issued by INT10h Set Mode call, + .if <[SI].V_MODE NE AL> ;AN006; and V_MODE <> AL + add si, type MODE_TABLE ;AN006; then, this is not the correct entry. + dec cx ;AN006;Let's find the next entry. + .else ;AN006; Else, continue... + MOV AL,ES:[DI].RP_MODE ; load register for compare. ;AN000; + .IF <[SI].D_MODE EQ AL> ; match?...... ;AN000; + MOV AX,ES:[DI].RP_COLORS ; yes...prepare next field ;AN000; + .IF <[SI].COLORS EQ AX> ; match?... ;AN000; + .IF ; yes...ensure reserved byte is 0 ;AN000; + .IF ; for graphics mode..check the following;AN000;. + MOV AX,ES:[DI].RP_WIDTH ; screen width. ;AN000; + .IF <[SI].SCR_WIDTH EQ AX> ; ;AN000; + MOV AX,ES:[DI].RP_LENGTH ; screen length ;AN000; + .IF <[SI].SCR_LENGTH EQ AX> ; (ignore #rows and #columns ;AN000; + MOV BP,FOUND ; found...set flag ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ELSE ; and for text check the columns.. ;AN000; + MOV AX,ES:[DI].RP_COLS ; the rows are matched in the main routine. ;AN000; + .IF <[SI].SCR_COLS EQ AX> ; ;AN000; + MOV BP,FOUND ; found...set flag ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + ADD SI,TYPE MODE_TABLE ; point to next record and.. ;AN000; + DEC CX ; decrement count ;AN000; + .endif ;AN006; + .ENDWHILE ; ;AN000; + .IF ; if we never found it then.. ;AN000; + STC ; set error flag and.. ;AN000; + .ELSE ; ;AN000; + SUB SI,TYPE MODE_TABLE ; position us at the appropriate record ;AN000; + CLC ; clear error flag ;AN000; + .ENDIF ; ;AN000; + mov cs:INT10_V_Mode, 0FFh ;AN006; Done. Reset the value + pop bp ;AN007; + RET ; return to calling module ;AN000; +SET_SEARCH ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: GET_SEARCH +; +; FUNCTION: +; THIS PROCEDURE SEARCHES THE VIDEO TABLE LOOKING FOR A MATCHING +; VIDEO MODE. +; +; AT ENTRY: DS:SI POINTS TO VIDEO TABLE +; AL CONTAINS THE MODE REQUESTED +; +; AT EXIT: +; NORMAL: CARRY CLEAR, DS:SI POINTS TO MATCHING RECORD +; +; ERROR: CARRY SET +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +GET_SEARCH PROC NEAR ;AN000; + MOV CX,MAX_VIDEO_TAB_NUM ; # of total tables ;AN000; + .WHILE <[SI].V_MODE NE AL> AND ; while we are not pointing to ;AN000; + .WHILE <[SI].V_MODE NE UNOCCUPIED> AND ; the right mode and we are still ;AN000; + .WHILE ; looking at valid data..do.. ;AN000; + ADD SI,TYPE MODE_TABLE ; point to the next mode ;AN000; + DEC CX ; decrement counter ;AN000; + .ENDWHILE ; ;AN000; + .IF OR ; did we find the mode? ;AN000; + .IF <[SI].V_MODE EQ UNOCCUPIED> ; ;AN000; + STC ; no ...so set error flag ;AN000; + .ELSE ; ;AN000; + CLC ; yes...clear error flag ;AN000; + .ENDIF ; ;AN000; + RET ; ;AN000; +GET_SEARCH ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: SET_CURSOR_EMUL +; +; FUNCTION: +; THIS PROCEDURE SETS THE CURSOR EMULATION BIT OFF IN ROM BIOS. THIS +; IS TO PROVIDE A CURSOR ON THE EGA WITH THE 5154 LOADED WITH AN 8X8 +; CHARACTER SET. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: CURSOR EMULATION BIT SET FOR APPLICABLE HARDWARE +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SET_CURSOR_EMUL PROC NEAR ;AN000; + .IF ; EGA with 5154?.. ;AN000; + PUSH SI ; ;AN000; + PUSH DS ; yes..so.. ;AN000; + MOV AX,ROM_BIOS ; check cursor emulation.. ;AN000; + MOV DS,AX ; ;AN000; + MOV SI,CURSOR_FLAG ; ;AN000; + MOV AL,BYTE PTR [SI] ; ;AN000; + .IF gt 25 lines requested? ;AN000; + AND AL,TURN_OFF ; no....set it OFF ;AN000; + .ELSE ; ;AN000; + OR AL,TURN_ON ; yes...set it ON ;AN000; + .ENDIF ; ;AN000; + MOV BYTE PTR [SI],AL ; ;AN000; + POP DS ; ;AN000; + POP SI ; ;AN000; + .ENDIF ; ;AN000; + RET ; return to calling module ;AN000; +SET_CURSOR_EMUL ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: INT10_COM +; +; FUNCTION: +; THIS IS THE INTERRUPT 10H HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS: +; +; AH=1H (SET CURSOR TYPE). CURSOR EMULATION IS PERFORMED IF WE HAVE +; AND EGA WITH A 5151 MONITOR, AND 43 LINES IS REQUESTED. +; +; AH=0H (SET MODE) SCREEN LENGTH IS MAINTAINED WHEN POSSIBLE. (IE. IN +; TEXT MODES ONLY.) +; AN004; Capturing Set Mode call and enforcing the # of Rows based on the +; previous Set_IOCTL request lines was a design mistake. ANSI cannot +; covers the all the application program out there which use INT 10h +; directly to make a full screen interface by their own way. +; This part of logic has been taken out by the management decision. +; Instead, for each set mdoe INT 10h function call, if it were not +; issued by SET_IOCTL procedures itself, or by DISPLAY.SYS program, +; then we assume that it was issued by an APPS, that usually does not +; know the new ANSI GET_IOCTL/SET_IOCTL interfaces. +; In this case, ANSI is going to call GET_IOCTL and SET_IOCTL function +; call - This is not to lose the local data consistency in ANSI. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: +; +; ERROR: +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +INT10_COM PROC NEAR ;AN000; + STI ; restore interrupts ;AN000; + .IF AND ; ;AN000; + .IF ;AN000; + JMP DWORD PTR CS:ROM_INT10 ; no...pass it on. ;AN000; + .ENDIF ;AN000; + .IF ;Set cursor call? ;AN000; + PUSH AX ; ;AN000; + .IF AND ; yes...check if we have an ega.. ;AN000; + .IF AND ; ;AN000; + .IF AND ; with 5151..so perform cursor mapping ;AN000; + .IF ; ;AN000; + MOV AL,CH ; check for cursor.. ;AN000; +; AND AL,06H ; off emulation.!!!!!Wrong!!! TypeO error ;AN000; + and al, 60h ; off emulation. J.K. + .IF ; ;AN000; + MOV AL,CH ; start position for cursor ;AN000; + CALL MAP_DOWN ; ;AN000; + MOV CH,AL ; ;AN000; + MOV AL,CL ; end position for cursor ;AN000; + CALL MAP_DOWN ; ;AN000; + MOV CL,AL ; ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + POP AX ; ;AN000; + JMP DWORD PTR CS:ROM_INT10 ; continue interrupt processing ;AN000; + .ELSE NEAR ; must be set mode call.. ;AN000; + PUSHF ; prepare for IRET ;AN000; + mov cs:ANSI_SetMode_Call_Flag, 1 ;AN008; Used by INT2F_COM + CALL DWORD PTR CS:ROM_INT10 ; call INT10 routine ;AN000; + mov cs:ANSI_SetMode_Call_Flag, 0 ;AN008; Reset it + push bp ;AN007; + push es ;AN007; + PUSH DS ; ;AN000; + PUSH SI ; ;AN000; + PUSH DI ; ;AN000; + PUSH DX ; ;AN000; + PUSH CX ; ;AN000; + PUSH BX ; ;AN000; + PUSH AX ; ;AN000; + PUSH CS ; ;AN000; + POP DS ; ;AN000; + MOV AH,REQ_VID_MODE ; get current mode.. ;AN000; + PUSHF ; ;AN000; + CALL DWORD PTR CS:ROM_INT10 ; ;AN000; + AND AL,VIDEO_MASK ; mask bit 7 (refresh) ;AN000; + test In_Generic_IOCTL_Flag, (I_AM_IN_NOW + SET_MODE_BY_DISPLAY) ;AN004; Flag is on? + .IF Z AND ;AN010;AN004;If not (I_AM_IN_NOW or SET_MODE_BY_DISPLAY), + .if ;AN010; + push ax ;AN004;Save mode + push es ;AN004; + push cs ;AN004; + pop es ;AN004; + mov di, offset My_IOCTL_Req_Packet ;AN004; + mov INT10_V_Mode, al ;AN006;Save current mode for SET_SEARCH + call Get_IOCTL ;AN004; + .IF NC ;AN004; + mov di, offset MY_IOCTL_Req_Packet ;AN004; + or In_Generic_IOCTL_Flag, CALLED_BY_INT10COM ;AN009;Do not set mode INT 10h again. Already done. + call Set_IOCTL ;AN004; + and In_Generic_IOCTL_Flag, not CALLED_BY_INT10COM ;AN009; + .ENDIF ;AN004; + pop es ;AN004; + pop ax ;AN004;Restore mode + mov INT10_V_Mode, 0FFh ;AN006; + .ENDIF ;AN004; + LEA SI,VIDEO_MODE_TABLE ; ;AN000; + CALL GET_SEARCH ; look through table for mode selected. ;AN000; + .IF NC ; if found then.. ;AN000; + .IF <[SI].D_MODE NE TEXT_MODE> ; text mode?.... ;AN000; + MOV GRAPHICS_FLAG,GRAPHICS_MODE ; no...set graphics flag. ;AN000; + .ELSE ; ;AN000; + MOV GRAPHICS_FLAG,TEXT_MODE ; yes...set text flag.. ;AN000; + .ENDIF ; ;AN000; + .ENDIF ; ;AN000; + + test In_Generic_IOCTL_Flag, I_AM_IN_NOW ;AN010; + .if z AND ;AN010; + .if AND ; + .if ;AN010; + call DO_ROWS ;AN010; + .endif ;AN010; + +;AN004;The following has been taken out! +;AN004; .IF ; 25 lines active? ;AN000; +;AN004; MOV AX,DISPLAY_CHECK ; is DISPLAY.SYS there? ;AN000; +;AN004; INT 2FH ; ;AN000; +;AN004; .IF OR ; if not installed or.. ;AN000; +;AN004; MOV AX,CHECK_ACTIVE ; if a code page has not.. ;AN000; +;AN004; INT 2FH ; been selected then.. ;AN000; +;AN004; .IF C ; ;AN000; +;AN004; .IF ; is this a text mode? ;AN000; +;AN004; CALL ROM_LOAD_8X8 ; yes..load ROM 8x8 character set. ;AN000; +;AN004; .ENDIF ; ;AN000; +;AN004; .ENDIF ; ;AN000; +;AN004; .ENDIF ; ;AN000; +;AN004;Instead, for each SET mode function int 10h function call, if it is not +;AN004;issued by ANSI GET_IOCTL and SET_IOCTL procedure themselves, we assume +;AN004;that the APPS, which usually does not know the ANSI GET_IOCTL/SET_IOCTL +;AN004;interfaces, intend to change the screen mode. In this case, ANSI is +;AN004;kind enough to call GET_IOCTL and SET_IOCTL function call for themselves. + + POP AX ; ;AN000; + POP BX ; ;AN000; + POP CX ; ;AN000; + POP DX ; ;AN000; + POP DI ; ;AN000; + POP SI ; ;AN000; + POP DS ; ;AN000; + pop es ;AN007; + pop bp ;AN007; + .ENDIF ; ;AN000; + IRET ; ;AN000; +INT10_COM ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: INT2F_COM +; +; FUNCTION: +; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS: +; +; AX=1A00H INSTALL REQUEST. ANSI WILL RETURN AL=FFH IF LOADED. +; +; AH=1A01H THIS IS THE INT2FH INTERFACE TO THE GENERIC IOCTL. +; NOTE: THE GET CHARACTERISTICS FUNCTION CALL WILL RETURN +; THE REQ_TXT_LENGTH IN THE BUFFER AS OPPOSED TO +; THE ACTUAL HARDWARE SCREEN_LENGTH +; Ax=1A02h This is an information passing from DISPLAY.SYS about +; the INT 10h, SET MODE call. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: +; +; ERROR: +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +INT2F_COM PROC NEAR ;AN000; + STI ; ;AN000; + .IF OR ; is this for ANSI? ;AN000; +; .IF ; ;AN000; + .IF ;AN004;=2h + JMP DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F ;AN000; + .ENDIF ; ;AN000; + .SELECT ; ;AN000; + .WHEN NEAR ; if install check then.. ;AN000; + MOV AL,INSTALLED ; load value to indicate installed ;AN000; + CLC ; clear error flag. ;AN000; +; .WHEN ; request for IOCTL? ;AN000; + .WHEN NEAR ;AN004;IOCTL or INFO passing? + PUSH BP ; ;AN000; + PUSH AX ; s ;AN000; + PUSH CX ; a ;AN000; + PUSH DX ; v ;AN000; + PUSH DS ; e r ;AN000; + PUSH ES ; e ;AN000; + PUSH DI ; g ;AN000; + PUSH SI ; s. ;AN000; + PUSH BX ; ;AN000; + PUSH DS ; load ES with DS (for call) ;AN000; + POP ES ; ;AN000; + MOV DI,DX ; load DI with DX (for call) ;AN000; + PUSH CS ; setup local addressability ;AN000; + POP DS ; ;AN000; + .IF ;IOCTL request + .IF ; get function requested. ;AN000; + CALL GET_IOCTL ; ;AN000; + .IF NC AND ; if no error and... ;AN000; + .IF AND ; gt 25 lines supported and.. ;AN000; + .IF <[SI].D_MODE EQ TEXT_MODE> ; this is a text mode then.. ;AN000; + .if OR ;AN010; + .if OR ;AN008; if not originated by ANSI thru. AH=0, INT10, + .if ;AN008; or Display.sys not loaded before ANSI, + MOV BX,REQ_TXT_LENGTH ; then use REQ_TXT_LENGTH instead.. ;AN000; + MOV ES:[DI].RP_ROWS,BX ; + .endif + CLC ; ;AN000; + .ENDIF ; ;AN000; + .ELSEIF ; ;AN000; + CALL SET_IOCTL ; set function requested. ;AN000; + .ELSE ; invalid function... ;AN000; + MOV AX,INVALID_FUNC ; load error and... ;AN000; + STC ; set error flag. ;AN000; + .ENDIF ; ;AN000; + .ELSE ;AN004;Info. passing + .IF ;AN004; 0 = DA_SETMODE_FLAG request. + .IF ;AN004; + or cs:In_Generic_IOCTL_Flag, SET_MODE_BY_DISPLAY ;AN004;Turn the flag on + .ELSE ;AN004; + and cs:In_Generic_IOCTL_Flag, not SET_MODE_BY_DISPLAY ;AN004;Turn the flag off + .ENDIF ;AN004; + .ELSE + .IF ;AN011; 1 = DA_OPTION_L_STATE query + mov al, cs:[Switch_L] ;AN011; + mov es:[di].DA_OPTION_L_STATE, al ;AN011; + .ENDIF + .ENDIF ;AN004; + clc ;AN004;clear carry. There is no Error in DOS 4.00 for this call. + .ENDIF + POP BX ; restore all.. ;AN000; + POP SI ; ;AN000; + POP DI ; registers except.. ;AN000; + POP ES ; ;AN000; + POP DS ; BP. ;AN000; + POP DX ; ;AN000; + POP CX ; ;AN000; + PUSH AX ; save error condition ;AN000; + MOV BP,SP ; setup frame pointer ;AN000; + MOV AX,[BP+10] ; load stack flags ;AN000; + .IF NC ; carry set?.. ;AN000; + AND AX,NOT_CY ; no.. set carry off. ;AN000; + MOV [BP+10],AX ; put back on stack. ;AN000; + POP AX ; remove error flag from stack ;AN000; + POP AX ; no error so bring back function call ;AN000; + XCHG AH,AL ; exchange to show that ANSI present ;AN000; + .ELSE ; ;AN000; + OR AX,CY ; yes...set carry on. ;AN000; + MOV [BP+10],AX ; put back on stack. ;AN000; + POP AX ; restore error flag ;AN000; + POP BP ; pop off saved value of AX (destroyed) ;AN000; + .ENDIF ; ;AN000; + POP BP ; restore final register. ;AN000; + .ENDSELECT ; ;AN000; +ABORT: IRET ; ;AN000; +INT2F_COM ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: MAP_DOWN +; +; FUNCTION: +; THIS PROCEDURE MAPS THE CURSOR START (END) POSITION FROM A 14 PEL +; BOX SIZE TO AN 8 PEL BOX SIZE. +; +; AT ENTRY: AL HAS THE CURSOR START (END) TO BE MAPPED. +; +; AT EXIT: +; NORMAL: AL CONTAINS THE MAPPED POSITION FOR CURSOR START (END) +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +MAP_DOWN PROC NEAR ;AN000; + PUSH BX ; ;AN000; + XOR AH,AH ; clear upper byte of cursor position ;AN000; + MOV BL,EIGHT ; multiply by current box size. ;AN000; + PUSH DX ; al x ;AN000; + MUL BL ; ---- = --- ;AN000; + POP DX ; 14 8 ;AN000; + MOV BL,FOURTEEN ; ;AN000; + DIV BL ; divide by box size expected. ;AN000; + POP BX ; ;AN000; + RET ; ;AN000; +MAP_DOWN ENDP + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: SET_VIDEO_MODE +; +; FUNCTION: +; THIS PROCEDURE SETS THE VIDEO MODE SPECIFIED IN DS:[SI].V_MODE. +; +; AT ENTRY: DS:SI.V_MODE CONTAINS MODE NUMBER +; +; AT EXIT: +; NORMAL: MODE SET +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +SET_VIDEO_MODE PROC NEAR ;AN000; + .if ;AN009; + MOV AL,[SI].V_MODE ; ..issue set mode ;AN000; + .IF OR ; is this the LCD? ;AN000; + .IF ; or VGA (done for BRECON card) ;AN000; + PUSH DS ; yes... ;AN000; + MOV BL,AL ; save mode ;AN000; + MOV AX,ROM_BIOS ; ;AN000; + MOV DS,AX ; get equipment status flag.. ;AN000; + MOV AX,DS:[EQUIP_FLAG] ; ;AN000; + AND AX,INIT_VID_MASK ; clear initial video bits.. ;AN000; + .IF OR ; are we setting mono? ;AN000; + .IF ; ;AN000; + OR AX,LCD_MONO_MODE ; yes...set bits as mono ;AN000; + .ELSE ; ;AN000; + OR AX,LCD_COLOR_MODE ; no...set bits as color ;AN000; + .ENDIF ; ;AN000; + MOV DS:[EQUIP_FLAG],AX ; replace updated flag. ;AN000; + MOV AL,BL ; restore mode. ;AN000; + POP DS ; ;AN000; + .ENDIF ; ;AN000; + MOV AH,SET_MODE ; set mode ;AN000; + INT 10H ;AN000; + .endif ;AN009; + RET ;AN000; +SET_VIDEO_MODE ENDP ;AN000; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: ROM_LOAD_8X8 +; +; FUNCTION: +; THIS PROCEDURE LOADS THE ROM 8X8 CHARACTER SET AND ACTIVATES BLOCK=0 +; FONT. +; +; AT ENTRY: +; +; AT EXIT: +; NORMAL: 8X8 ROM CHARACTER SET LOADED +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +ROM_LOAD_8X8 PROC NEAR ;AN000; + MOV AX,LOAD_8X8 ; load 8x8 ROM font ;AN000; + XOR BL,BL ; ;AN000; + PUSHF ;AN000; + CALL DWORD PTR CS:ROM_INT10 ;AN000; + MOV AX,SET_BLOCK_0 ; activate block = 0 ;AN000; + XOR BL,BL ;AN000; + PUSHF ;AN000; + CALL DWORD PTR CS:ROM_INT10 ;AN000; + RET ;AN000; +ROM_LOAD_8X8 ENDP ;AN000; + ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: CHECK_FOR_DISPLAY +; +; FUNCTION: +; THIS PROCEDURE CHECKS TO SEE IF WE DISPLAY.SYS IS THERE, AND IF +; IT IS..IT HAS THE REQUIRED FONT. +; +; AT ENTRY: AX - DESIRED SCREEN LENGTH +; +; AT EXIT: +; NORMAL: CARRY CLEAR IF ALL OKAY +; +; ERROR: CARRY SET IF FONT NOT AVAILABLE. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +CHECK_FOR_DISPLAY PROC NEAR ;AN000; + .IF OR ; is it just 25 lines needed? ;AN000; + MOV AX,DISPLAY_CHECK ; ;AN000; + INT 2FH ; ;AN000; + .IF OR ; or is DISPLAY.SYS not there? ;AN000; + MOV AX,CHECK_FOR_FONT ; ;AN000; + INT 2FH ; or if it is does it have the.. ;AN000; + .IF NC ; 8X8 font then. ;AN000; + CLC ; clear carry ;AN000; + .ELSE ; ;AN000; + STC ; no font...set carry ;AN000; + .ENDIF ; ;AN000; + RET ; ;AN000; +CHECK_FOR_DISPLAY ENDP + +CODE ENDS + END diff --git a/v4.0/src/DEV/ANSI/MAKEFILE b/v4.0/src/DEV/ANSI/MAKEFILE new file mode 100644 index 0000000..f249f75 --- /dev/null +++ b/v4.0/src/DEV/ANSI/MAKEFILE @@ -0,0 +1,33 @@ +#*********************** Makefile for ansi.sys **************************** + +dos =..\..\dos +inc =..\..\inc +msg =..\..\messages + +# +####################### Dependencies Begin Here ########################## +# + +all: ansi.sys + +ansi.ctl: ansi.skl $(msg)\$(COUNTRY).msg + +ansi.obj: ansi.asm ansi.inc \ + $(inc)\vector.inc \ + $(inc)\mult.inc \ + $(inc)\struc.inc + +ioctl.obj: ioctl.asm ansi.inc \ + $(inc)\struc.inc + +ansiinit.obj: ansiinit.asm ansi.inc ansivid.inc \ + $(inc)\struc.inc + +parser.obj: parser.asm ansi.inc $(inc)\sysmsg.inc $(inc)\parse.asm \ + $(inc)\struc.inc ansi.ctl $(inc)\versiona.inc + +ansi.sys: ansi.obj ioctl.obj ansiinit.obj parser.obj ansi.lnk makefile + link @ansi.lnk + exe2bin ansi.exe ansi.sys + del ansi.exe + diff --git a/v4.0/src/DEV/ANSI/PARSER.ASM b/v4.0/src/DEV/ANSI/PARSER.ASM new file mode 100644 index 0000000..8136db6 --- /dev/null +++ b/v4.0/src/DEV/ANSI/PARSER.ASM @@ -0,0 +1,325 @@ +PAGE ,132 +TITLE PARSE CODE AND CONTROL BLOCKS FOR ANSI.SYS + +;****************** START OF SPECIFICATIONS ************************** +; +; MODULE NAME: PARSER.ASM +; +; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR +; ANSI.SYS +; +; FUNCTION: THE COMMAND LINE PASSED TO ANSI.SYS IN THE CONFIG.SYS +; STATEMENT IS PARSED TO CHECK FOR THE /X SWITCH. A FLAG +; IS CLEARED IF NOT FOUND. +; +; ENTRY POINT: PARSE_PARM +; +; INPUT: DS:SI POINTS TO EVERYTHING AFTER DEVICE= +; +; AT EXIT: +; NORMAL: SWITCH FLAGS WILL BE SET IF /X or /L IS FOUND +; +; ERROR: CARRY SET +; +; INTERNAL REFERENCES: +; +; ROUTINES: SYSLOADMSG - MESSAGE RETRIEVER LOADING CODE +; SYSDISPMSG - MESSAGE RETRIEVER DISPLAYING CODE +; PARM_ERROR - DISPLAYS ERROR MESSAGE +; SYSPARSE - PARSING CODE +; +; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE +; +; EXTERNAL REFERENCES: +; +; ROUTINES: N/A +; +; DATA AREAS: SWITCH - BYTE FLAG FOR EXISTENCE OF SWITCH PARAMETER +; +; NOTES: +; +; REVISION HISTORY: +; A000 - DOS Version 4.00 +; +; Label: "DOS ANSI.SYS Device Driver" +; "Version 4.00 (C) Copyright 1988 Microsoft" +; "Licensed Material - Program Property of Microsoft" +; +;****************** END OF SPECIFICATIONS **************************** +;Modification history********************************************************** +;AN001; P1529 ANSI /x /y gives wrong error message 10/8/87 J.K. +;AN002; D397 /L option for "Enforcing" the line number 12/17/87 J.K. +;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K. +;****************************************************************************** + + +INCLUDE ANSI.INC ; ANSI equates and structures ;AN000; +.XLIST +INCLUDE STRUC.INC ; Structured macros ;AN000; + +INCLUDE SYSMSG.INC ; Message retriever code ;AN000; +MSG_UTILNAME ; Let message retriever know its ANSI.SYS ;AN000; +.LIST + +PUBLIC PARSE_PARM ; near procedure for parsing DEVICE= statement ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Set assemble switches for parse code that is not required!! +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +DateSW EQU 0 ;AN000; +TimeSW EQU 0 ;AN000; +CmpxSW EQU 0 ;AN000; +DrvSW EQU 0 ;AN000; +QusSW EQU 0 ;AN000; +NumSW EQU 0 ;AN000; +KeySW EQU 0 ;AN000; +Val1SW EQU 0 ;AN000; +Val2SW EQU 0 ;AN000; +Val3SW EQU 0 ;AN000; + + +CODE SEGMENT PUBLIC BYTE + ASSUME CS:CODE + +.XLIST +MSG_SERVICES ;AN000; +MSG_SERVICES ;AN000; +MSG_SERVICES ;AN000; +MSG_SERVICES ;AN000; +MSG_SERVICES ;AN000; + +INCLUDE PARSE.ASM ; Parsing code ;AN000; +.LIST + + +EXTRN SWITCH_X:BYTE ; /X switch flag ;AN000; +extrn Switch_L:Byte ;AN002; /L switch flag +extrn Switch_K:Byte ;AN003; /K switch + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PARM control blocks for ANSI +; Parsing DEVICE= statment from CONFIG.SYS +; +; DEVICE=[d:][path]ANSI.SYS [/X] +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;AN000; +PARMS LABEL WORD ;AN000; + DW PARMSX ;AN000; + DB 0 ; no extra delimeters or EOLs. ;AN000; + ;AN000; +PARMSX LABEL BYTE ;AN000; + DB 1,1 ;AN001; 1 valid positional operand + DW FILENAME ;AN001; filename + DB 1 ;AN002; 1 switche definition in the following + DW Switches ;AN002; + DB 0 ;AN001; no keywords + ;AN000; +FILENAME LABEL WORD ;AN000; + DW 0200H ; file spec ;AN000; + DW 0001H ; cap by file table ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; no value checking done ;AN000; + DB 0 ; no switch/keyword synonyms ;AN000; + ;AN000; +Switches LABEL WORD ;AN000; + DW 0 ; switch with no value ;AN000; + DW 0 ; no functions ;AN000; + DW RESULT_BUF ; result ;AN000; + DW NOVALS ; no value checking done ;AN000; + DB 3 ;AN002;AN003; 3 switch synonym +X_SWITCH DB "/X",0 ;AN002; /X name +L_SWITCH DB "/L",0 ;AN002; /L +K_SWITCH DB "/K",0 ;AN003; /K + +NOVALS LABEL BYTE ;AN000; + DB 0 ; no value checking done ;AN000; + +RESULT_BUF LABEL BYTE ;AN000; + DB ? ; type returned (number, string, etc.) ;AN000; + DB ? ; matched item tag (if applicable) ;AN000; +SYNONYM_PTR DW 0 ; synonym ptr (if applicable) ;AN000; + DD ? ; value ;AN000; + ;AN000; +SUBLIST LABEL DWORD ; list for substitution ;AN000; + DB SUB_SIZE ;AN000; + DB 0 ;AN000; + DD ? ;AN000; + DB 1 ;AN000; + DB LEFT_ASCIIZ ;AN000; + DB UNLIMITED ;AN000; + DB 1 ;AN000; + DB " " ;AN000; + +Old_SI dw ? ;AN001; +Saved_Chr db 0 ;AN001; +Continue_Flag db ON ;AN002; +Parse_Err_Flag db OFF ;AN002; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PARSE_PARM +; +; FUNCTION: +; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST +; BLOCK. ERROR MESSAGES ARE DISPLAYED ACCORDINGLY. +; +; AT ENTRY: DS:SI POINTS TO EVERYTHING AFTER THE DEVICE= STATEMENT +; +; AT EXIT: +; NORMAL: CARRY CLEAR - SWITCH FLAG BYTE SET TO 1 IF /X FOUND +; +; ERROR: CARRY SET +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARSE_PARM PROC NEAR ;AN000; + CALL SYSLOADMSG ; load message ;AN000; + .IF C NEAR ;AN000; + CALL SYSDISPMSG ; display error message ;AN000; + STC ; ensure carry still set ;AN000; + .ELSE NEAR ;AN000; + PUSH CS ; establish ES .. ;AN000; + POP ES ; addressability to data ;AN000; + LEA DI,PARMS ; point to PARMS control block ;AN000; + XOR CX,CX ; clear both CX and DX for ;AN000; + XOR DX,DX ; SYSPARSE ;AN000; + CALL SYSPARSE ; move pointer past file spec ;AN000; + mov Switch_L, OFF ;AN002; + mov Switch_X, OFF ;AN002; + .WHILE ;AN002; + mov Old_SI, SI ;AN001;to be use by PARM_ERROR + call SysParse ;AN002; + .IF ;AN002; + mov Continue_Flag, OFF ;AN002; + .ELSE ;AN002; + .IF ;AN002; + mov Continue_Flag, OFF ;AN002; + mov Switch_X, OFF ;AN002; + mov Switch_L, OFF ;AN002; + mov Switch_K, OFF ;AN003; + call Parm_Error ;AN002; + mov Parse_Err_Flag,ON;AN002; + .ELSE ;AN002; + .IF > ;AN002; + mov Switch_X, ON ;AN002; + .ELSE ;AN002; + .IF > ;AN003; + mov Switch_L, ON ;AN002; + .ELSE ;AN003;Must be /K option. + mov Switch_K, ON ;AN003;/K entered. + .ENDIF ;AN003; + .ENDIF ;AN002; + clc ;AN002; + .ENDIF ;AN002; + .ENDIF ;AN002; + .ENDWHILE ;AN002; + .IF ;AN002; + stc ;AN002; + .ELSE ;AN002; + clc ;AN002; + .ENDIF ;AN002; + .ENDIF ;AN002; + +; mov cs:Old_SI, SI ;AN001; Save pointer to parm +; CALL SYSPARSE ; look for /X switch ;AN000; +; .IF ; if EOL then.. ;AN000; +; MOV ES:SWITCH_X,0 ; no switch...clear flag ;AN000; +; CLC ; clear carry ;AN000; +; .ELSE ; else.. ;AN000; +; .IF ;AN001;If any error +; call parm_error ;AN001; the show the error msg +; stc ;AN001; +; .ELSE ; else..leave flag set.. ;AN000; +; mov cs:Old_SI, SI ;AN001; +; CALL SYSPARSE ; check for further parms ;AN000; +; .IF ; if other parms then... ;AN000; +; CALL PARM_ERROR ; display 'Invalid parameter' message ;AN000; +; STC ; error! ;AN000; +; .ELSE ; no other parms so.. ;AN000; +; CLC ; clear carry ;AN000; +; .ENDIF ; ;AN000; +; .ENDIF ; ;AN000; +; .ENDIF ; ;AN000; +; .ENDIF ; ;AN000; + + RET ;AN000; +PARSE_PARM ENDP ;AN000; + ;AN000; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; PROCEDURE_NAME: PARM_ERROR +; +; FUNCTION: +; LOADS AND DISPLAYS "Invalid parameter" MESSAGE +; +; AT ENTRY: +; DS:Old_SI -> parms that is invalid +; +; AT EXIT: +; NORMAL: ERROR MESSAGE DISPLAYED +; +; ERROR: N/A +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +PARM_ERROR PROC NEAR ;AN000; + PUSH CX ;AN000; + PUSH SI ;AN000; + PUSH ES ; ;AN000; + PUSH DS ; ;AN000; + +; PUSH CS ; ;AN000; +; POP DS ; establish addressability ;AN000; +; MOV BX,DX ; ;AN000; +; LES DX,[BX].RES_PTR ; find offending parameter ;AN000; + push ds ;AN001; + pop es ;AN001; + mov si, cs:Old_SI ;AN001;Now es:dx -> offending parms + push si ;AN001;Save it +Get_CR: + cmp byte ptr es:[si], 13 ;AN001;CR? + je Got_CR ;AN001; + inc si ;AN001; + jmp Get_CR ;AN001; +Got_CR: ;AN001; + inc si ;AN001; The next char. + mov al, byte ptr es:[si] ;AN001; + mov cs:Saved_Chr, al ;AN001; Save the next char + + mov byte ptr es:[si], 0 ;AN001; and make it an ASCIIZ + mov cs:Old_SI, si ;AN001; Set it again + pop dx ;AN001; saved SI -> DX + + push cs ;AN001; + pop ds ;AN001;for addressability + + LEA SI,SUBLIST ; ..and place the offset.. ;AN000; + MOV [SI].SUB_PTR_O,DX ; ..in the SUBLIST.. ;AN000; + MOV [SI].SUB_PTR_S,ES ; ;AN000; + MOV AX,INVALID_PARM ; load 'Invalid parameter' message number ;AN000; + MOV BX,STDERR ; to standard error ;AN000; + MOV CX,ONE ; 1 substitution ;AN000; + XOR DL,DL ; no input ;AN000; + MOV DH,UTILITY_MSG_CLASS ; parse error ;AN000; + CALL SYSDISPMSG ; display error message ;AN000; + mov si, cs:Old_SI ;AN001;restore the original char. + mov cl, cs:Saved_Chr ;AN001; + mov byte ptr es:[si], cl ;AN001; + + POP DS ;AN000; + POP ES ;AN000; + POP SI ;AN000; + POP CX ;AN000; + RET ;AN000; +PARM_ERROR ENDP + +include msgdcl.inc + +CODE ENDS + END -- cgit v1.2.3