Inhoud

sp0036

Extensie:
zip
Grootte:
26 kB
Titel:
This program fixes problems with the COMPAQ Plasma Display under which the cursor may disappear without warning.

Uitgepakte bestanden

Bestand
ASMSHELL.ASM
INSTALL.ASM
LASTBYTE.ASM
MAKE.EXE
MAKEFILE
NEW10.ASM
PLASMDA.COM

Tekst-bestanden

ASMSHELL.ASM
 
 
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
INSTALL.ASM
 
 
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
 
LASTBYTE.ASM
 
 
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
 
MAKEFILE
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
 
 
 
NEW10.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