====== sp0036 ====== ---- dataentry compaq_softpaq ---- Extensie : zip Grootte : 26 kB Titel : This program fixes problems with the COMPAQ Plasma Display under which the cursor may disappear without warning. Versie : Taal : Producten : OS : Vervangt : ---- ===== Uitgepakte bestanden ===== ^ Bestand ^ | ASMSHELL.ASM | | INSTALL.ASM | | LASTBYTE.ASM | | MAKE.EXE | | MAKEFILE | | NEW10.ASM | | PLASMDA.COM | ===== Tekst-bestanden ===== page 58,132 title ASMSHELL Copyright (c) 198x COMPAQ Computer Corp. ;****************************************************************************** ; ; Name: ASMSHELL ; ; Group: DUMMY ; ; Revision: 1.00 ; ; Date: ; ; Author: M P Vaughan, used by S M Dawson ; ;****************************************************************************** ; ; Changes: ; ; DATE REVISION DESCRIPTION ; -------- -------- ------------------------------------------------------ ; 08/31/87 1.00 Original. ; ;****************************************************************************** ; ; Functional Description: ; ; RETURNS: ; ;****************************************************************************** ; ;****************************************************************************** ; ; Equates ; ;****************************************************************************** ; STANDARDOUT equ 01h CR equ 0Dh LF equ 0Ah DOS equ 21h ; dummy segment byte public 'DUMMY' assume cs:DUMMY,ds:NOTHING,es:NOTHING ; ;****************************************************************************** ; ; Externals ; ;****************************************************************************** ; ; DECLARE ENTRY POINTS TO REPLACED INTERRUPTS HERE (IF NEEDED) ; ; ; External routines ; ; page ;****************************************************************************** ; Data area for procedure ;****************************************************************************** ; ; page ;****************************************************************************** ; Dummy routine ;****************************************************************************** ; public _dummy ; _dummy proc near ; ret ; Return to calling procedure ; _dummy endp dummy ends end _dummy page 58,132 title INSTALL Copyright (c) 1986 COMPAQ Computer Corp. ;****************************************************************************** ; ; Name: INSTALL ; ; Group: PATCH ; ; Revision: 1.00 ; ; Date: June 26, 1986 ; ; Author: M P Vaughan ; S M Dawson 8/31/87 ; ;****************************************************************************** ; ; Changes: ; ; DATE REVISION DESCRIPTION ; -------- -------- ------------------------------------------------------ ; 06/26/86 1.00 Original. ; 8/31/87 1.1 Changed to fix up Int 10 Plasma ROM bug ; ;****************************************************************************** ; ; Functional Description: ; ; This module installs a terminate and stay resident routine for INT 9 ; to enable the featuere of toggling the underline feature for dual ; scan monitors and COMPAQ vdu controllers. ; ; ; RETURNS: ; AL = 00h Installation successful ; AL = 01h Installation failed ; ;****************************************************************************** ; ;****************************************************************************** ; ; Equates ; ;****************************************************************************** ; STANDARDOUT equ 01h CR equ 0Dh LF equ 0Ah DOS equ 21h ; page patch segment byte public 'PATCH' assume cs:patch,ds:patch ; ;****************************************************************************** ; ; Externals ; ;****************************************************************************** ; ; External routines ; extrn _new10:near ; New INT 10h entry point. ; ; External data ; extrn oldint:dword ; Old INT 10h interrupt vector ; page ;****************************************************************************** ; Install - install new INT10 routine ;****************************************************************************** ; public install ; install proc ; push ds push cs pop ds ; Save initial value of DS ; mov ax,3510h ; Get old interrupt vector int DOS ; mov word ptr [oldint],bx ; Save old offset, segment mov word ptr [oldint+2],es ; mov dx,offset _new10 ; Set new INT 15h interrupt mov ax,2510h int DOS pop ds ret ; Return to calling procedure install endp patch ends end install  page 58,132 title LASTBYTE Copyright (c) 1986 COMPAQ Computer Corp. ;****************************************************************************** ; ; Name: LASTBYTE ; ; Group: ROM ; ; Revision: 1.00 ; ; Date: June 20, 1986 ; ; Author: M P Vaughan, used by S M Dason ; ;****************************************************************************** ; ; Changes: ; ; DATE REVISION DESCRIPTION ; -------- -------- ------------------------------------------------------ ; 06/20/86 1.00 Original. ;****************************************************************************** ; ; Functional Description: ; ; This module is used for the last byte in a terminate and stay resident ; program. ; ;****************************************************************************** ; patch segment byte public 'PATCH' assume cs:patch, ds:patch ; public last ; last label byte ; patch ends end  new10.com ! start.obj new10.obj lastbyte.obj install.obj link @new10.lnk exe2bin new10.exe new10.com del new10.exe ren new10.com plasmda.com start.obj ! start.asm masm start.asm new10.obj ! new10.asm masm new10.asm lastbyte.obj ! lastbyte.asm masm lastbyte.asm install.obj ! install.asm masm install.asm  page 58,132 title INT_10P Copyright (c) 198x COMPAQ Computer Corp. ;****************************************************************************** ; ; Name: INT_10P ; ; Group: PATCH ; ; Revision: 1.10 ; ; Date: 10 Sept., 1987 ; ; Author: S M Dawson ; original module by M P Vaughan ; ;****************************************************************************** ; ; Changes: ; ; DATE REVISION DESCRIPTION ; -------- -------- ------------------------------------------------------ ; 8/31/87 1.00 Original - fixed Plasma ROM INT 10 fcn 1 in MDA mode ; 9/10/87 1.10 Added IDC-2 workaround in Fcn 2 ; ;****************************************************************************** ; ; Functional Description: ; ; *** This patch fixes TWO bugs in the Plasma display in MDA mode. *** ; ;A) Grabs INT 10 func 01 (set cursor) and fixes bug in Plasma ROM. ; If AH <>1 or default adapter address not= 3b4 (MDA mode) then the ; original INT 10 is called. ; IF AH = 1 and 40:63 = B4h, then the patch handles setting the ; cursor and returns. ; ; ; Notes on Monochrome cursor handling with Plasma Display: ; ; 1) Character Boxes: ; CGA = 8 x 8 ; MDA = 9 x 14 ; Plasma = 8 x 16 (lines 1 & 2 @ top of box are blank, lines 3 ; thru 16 same as MDA's 1 to 14 ) ; ; 2) The Fakeout PROM on the Plasma Display controller (port 23c6, ; bit 1) must be disabled. Otherwise, it multiplies the ; cursor line numbers by 2 for emulation of CGA cursor. ; ; 3) The cursor lines values in CL & CH must be incremented by 2 ; in order to bypass the 2 blank lines at the top of the ; Plasma character box. ; ; ;B) Grabs func 2 and works around a bug in the IDC-1 & -2 gate arrays ; in MDA mode: ; IDC gate array is blanking the cursor if the attribute byte at ; the cursor location is 00. ; *** That is correct for CGA operation but not for MDA. *** ; ; The patch intercepts func 2 calls and does the following: ; 1) Calculates the desired cursor position in screen memory ; using the number of columns onscreen from 40:4A and the ; starting address in region buffer from 40:4E ; 2) Examine the Character Attribute byte at the calculated ; address. If it is 00, write a 03h at that location to make ; the cursor visible when it gets there. ; 3) Call the original INT 10 to do the actual cursor movement. ; ;****************************************************************************** page ;****************************************************************************** ; Equates ;****************************************************************************** ; MONO_ADDR equ 0B4h MONO_MEM equ 0B000h ; patch segment byte public 'patch' assume cs:patch,ds:patch,es:NOTHING ; ;****************************************************************************** ; Data area for procedure ;****************************************************************************** ; public oldint oldint dd ? ;Old Int 10h vector my_flags db ? ; ;****************************************************************************** ; New INT 10h 01h routine ;****************************************************************************** ; public _new10 _new10 proc near push ax push es push si mov ax,40h ;Look for mono adapter i/o address mov es,ax mov si,63h mov al,es:[si] cmp al,MONO_ADDR pop si pop es pop ax jne go_old ; Not in MDA mode, use old INT 10 cmp ah,02h ; Test for fcn 02 (move cursor) je idc_fix cmp ah,01h ; Test for fcn 01 (set cursor) je fix01 go_old: jmp old_10 ;------------------- fix01: push ax ; New fcn 01 cursor routine starts here push si ; Save registers push ds push es push dx push cx mov ax,40h ; Store cursor stop/start @ 40:60 mov ds,ax mov si,60h mov al,cl mov [ds:si],al mov al,ch inc si mov [ds:si],al add ch,2 ; fudge CL & CH for plasma disp add cl,2 mov dx,23c6h ; Master Mode port mov al,02 ; disable Fakeout PROM out dx,al mov dx,3b4h ; send cursor info to CRTC mov al,0ah ; index out dx,al inc dx mov al,ch ; "start" line data out dx,al dec dx mov al,0bh ; index out dx,al inc dx mov al,cl ; "stop" line data out dx,al mov dx,23c6h ; re-enable Fakeout PROM mov al,0 out dx,al _done: pop cx pop dx pop es pop ds ; Restore registers pop si pop ax iret idc_fix: ; Mask error in IDC Gate array push ax ; by intercepting func 2 calls push bx push cx push dx push ds push si mov ax,40h mov ds,ax xor ax,ax ; Calc cursor position mov cx,dx ; use cx xchg al,ch ; get row from CH mov si,4ah ; number of columns per row [40:4A] mov bx,[si] mul bx ; mul rows by number of columns add cx,ax ; and add to leftover column info mov si,4eh mov ax,[ds:si] ; get offset in region buffer add cx,ax ; and add it to the position info shl cx,1 ; create offset from B000 inc cx ; add 1 to look at attribute byte mov ax,MONO_MEM mov ds,ax mov si,cx mov al,[ds:si] ; Get attribute @ new cursor location cmp al,0 jne no_fix ; leave it alone if not zero mov al,03 ; otherwise, mov [ds:si],al ; put a usable value in char attrib no_fix: pop si ; restore registers and pop ds ; and call old INT 10 to do pop dx ; the actual cursor movement pop cx pop bx pop ax old_10: jmp cs:[oldint] ; use the original INT 10 _new10 endp patch ends end _new10