mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
158 lines
4.8 KiB
Plaintext
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: <09> 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.
|