supermario/base/SuperMarioProj.1994-02-09/Patches/BrightnessPatches.a
2019-06-29 23:17:50 +08:00

158 lines
4.8 KiB
Plaintext

;__________________________________________________________________________________________________
;
; File: BrightnessPatches.a
;
; Contains: This routine will patch the .Screen driver on the Classic to return an
; error to the caller when a status "GetScreenState" call is made. These
; codes were supposed to return the state of the video. See XOScreenDriver.a
; ON or OFF. This hardware feature was never implemented on the Classic.
; The Backlight driver issues this call and since the driver does not return
; an error, the Backlit driver makes assumptions based on the call succeeding.
;
; Written by: Gus Andrade & Gayle Wiesner
;
; Copyright: © 1991 by Apple Computer, Inc., All rights reserved.
;
; Change History (most recent first):
;
; <1> 10/24/91 SAM Rolled in Regatta file.
; <0> 7/17/91 SAM (GAA & GW) First checked in..
; To Do:
;__________________________________________________________________________________________________
STRING PASCAL
print OFF, NOGEN
load 'StandardEqu.d'
include 'LinkedPatchMacros.a'
include 'HardwarePrivateEqu.a'
include 'ATalkEqu.a'
include 'Traps.a'
print ON
;----------------------------
; Entry: None
; Exit: Patches the Status calls to return an error on "GetScreenState" call.
; Uses: A0-A2, D0-D1.
;
JMPInst equ $4ef9 ; jmp.abs.l instruction
StatScrnOnOff equ $5302 ; Status code to return screen on/off state
Regs reg A0-A2/D1
ClassicBrightPatch InstallProc (SE)
IMPORT csCodeCheck
IMPORT OldStatusPatch
;
; The following record is taken from the ScreenDriverEqu.a file.
; Any changes to the record need to be reflected in both locations.
;
ScreenDrvrGlobs RECORD 0,increment
setValue ds.w 1 ; current brightness value
StatusPatch ds.w 3 ; allow patching Status here
ControlPatch ds.w 3 ; allow patching Control here
ScreenGlobSize EQU *
ENDR
WITH ScreenDrvrGlobs
;
; Open the .Screen driver
;
@openDrvr
movem.l Regs,-(SP) ; Save work registers
sub.w #ioQElSize,SP ; Allocate IO stack frame
lea #'.Screen',A1 ; load pointer to driver name
move.l sp,a0 ; set a0 to point to the pb
move.l a1,ioVNPtr(A0) ; load pointer to name
move.b #fsCurPerm,ioPermssn(A0) ; set permission (not used)
_Open
tst.w ioResult(a0) ; check for Open Success
bne.s @OpenFailed
;
; Point to device control entry for the .Screen driver
;
move.w ioRefNum(a0),d1 ; form the unit table entry number
addq.w #1,d1
neg.w d1
lsl.w #2,d1 ; calculate index into unit table
movea.l utablebase,a1 ; get unit table address
move.l (a1,d1.w),a1 ; point to dce for screen driver
movea.l (a1),a1 ; dereference handle
;
; Install the patch into the Screen driver's StatusPatch area
; (save the old StatusPatch into our code)
;
movea.l dctlStorage(a1),a1 ; point to driver's private storage
lea OldStatusPatch, a2 ; point to patch save area <7/17/91 GW>
move.w StatusPatch(a1),(a2)+ ; save the first word <7/17/91 GW>
move.l StatusPatch+2(a1),(a2) ; save the next longword <7/17/91 GW>
move.w #JMPInst,StatusPatch(a1) ; put a jmp instruction in first wd of patch area
leaResident csCodeCheck,a2 ; get the address of our patch routine
move.l a2,StatusPatch+2(a1) ; put it into the patch area
@OpenFailed
add.w #ioQElSize,SP ; Release stack frame
movem.l (SP)+,Regs
rts ; Sucess returned in status
ENDWITH
ENDP
;_______________________________________________________________________
;
; Routine: csCodeCheck
; Inputs: a0 - pointer to I/O ParamBlock
; a1 - pointer to Device Control Entry (DCE)
;
; Outputs: d0 - Result Code
;
; Destroys: none
;
; Called by: Screen Driver ScreenStatus routine
;
; Function: Checks for csCode of StatScrnOnOff.
;
; If equal, returns StatusErr and exits through jIODone.
; This removes support for Brightness Driver
; status call to get state (on/off) of the screen, which is not
; supported in the Classic hardware platform.
;
; If not equal, executes whatever code was copied by our InstallProc
; from the Screen Driver's StatusPatch area. This will either
; link to the next patch, or rts (the default).
;_______________________________________________________________________
csCodeCheck PROC EXPORT
EXPORT OldStatusPatch
cmpi.w #StatScrnOnOff,csCode(a0) ; if StatScrnOnOff, return an error
beq errReturn
OldStatusPatch nop ; our installproc saved the old patch <7/17/91 GW>
nop ; here; if everyone plays by the <7/17/91 GW>
nop ; rules, this should be either rts or <7/17/91 GW>
; a jmp to the next patch <7/17/91 GW>
rts ; Just in case the previous patch JSRed instead of JMP
errReturn
move.w #StatusErr,d0
move.l jIODone,(sp) ; replace jsr return with IODone routine address
rts
ENDP
END.