mjohnson@APPLE.COM (Mark B. Johnson) (12/02/89)
This message was originally submitted by mjohnson@APPLE.COM to the APPLE2-L
list at BROWNVM. If you simply forward it back to the list, it will be
distributed with the paragraph you are now reading being automatically removed.
If you edit the contributions you receive into a digest, you will need to
remove this paragraph before mailing the result to the list. Finally, if you
need more information from the author of this message, you should be able to do
so by simply replying to this note.
----------------- Message requiring your approval (145 lines) -----------------
Apple II
Technical Notes
_____________________________________________________________________________
Developer Technical Support
Apple IIGS
#71: CDA Tips and Techniques
Written by: Dave Lyons November 1989
This Technical Note presents tips and techniques for writing Classic Desk
Accessories.
_____________________________________________________________________________
Reading the Keyboard
For a CDA that runs only under GS/OS, the Console Driver is the best choice
for reading from the keyboard. Other CDAs have two cases to deal with: the
Event Manager may or may not be started. The Text Tools can read the keyboard
in either case, but you should avoid using the Text Tools whenever possible
(see Apple IIGS Technical Note #69, The Ins and Outs of Slot Arbitration).
You can call EMStatus to determine whether the Event Manager is started. When
it is, you can read keypresses by calling GetNextEvent. When the Event
Manager is not started, you can read keys directly from the keyboard hardware
by waiting for bit 7 of location $E0C000 to turn on. When it does, the lower
seven bits represent the key pressed. Once you've detected a keypress, you
need to write to location $E0C010 to remove the keypress from the buffer.
Alternatively, you can use IntSource (in the Miscellaneous Tools) to
temporarily disable keyboard interrupts and then read the keyboard hardware
directly. Be sure to reactivate keyboard interrupts if, and only if, they
were previously enabled.
Just One Page of Stack Space
CDAs normally have only a single page of stack space available to them (256
bytes at $00/01xx). Your CDA may or may not be able to allocate additional
stack space from bank 0 during execution. The following code (written for the
MPW IIGS cross-assembler) shows a safe way to try to allocate more stack space
and to switch between stacks when the space is available.
If ProDOS 8 is active, your CDA will not be able to allocate additional space
(and there is no completely safe way to "borrow" bank 0 space from the ProDOS
8 application).
HowMuchStack gequ $1000 ;try for 4K of stack space
start phd
phb
phk
plb
pla ;Space for result
pha
PushLong #HowMuchStack
pha
_MMStartUp
pla
ora #$0f00 ;OR in an arbitrary auxiliary ID
pha
PushWord #$C001 ;fixed, locked, use specified bank
PushLong #0 ;(specify bank 0)
_NewHandle
tsc
sta theOldStack
bcs NoStackSpace ;still set from _NewHandle
tcd
lda [1]
tcd
; clc ;carry is already clear
adc #HowMuchStack-1
NoStackSpace pha
ldx #$fe
keepStack lda >$000100,x
sta stackImage,x
dex
dex
bpl keepStack
pla
tcs
jsl RealCDAentry ;carry is clear if large stack available
php
php
pla
sta pRegister
sei
ldx #$fe
restoreStack lda stackImage,x
sta >$000100,x
dex
dex
bpl restoreStack
lda theOldStack
tcs
lda pRegister
pha
plp
plp
lda 1,s
ora 3,s
beq noDispose
_DisposeHandle
bra Exit
noDispose pla
pla
Exit plb
pld
rtl
pRegister ds 2
theOldStack ds 2
stackImage ds.b 256
When this routine calls RealCDAentry, the carry flag is set if no extra stack
space is available. If the carry is clear, the additional stack space was
available and the direct-page register points to the bottom of that space.
RealCDAentry bcs smallStack ;if c set, only 1 page of stack is
;available
; put something interesting here
rtl
smallStack _SysBeep
rtl
Note that interrupts are disabled while the page-one stack is being restored;
they are re-enabled (if they were originally enabled) only after the stack
pointer is safely back in page one.
Further Reference
_____________________________________________________________________________
o Apple IIGS Toolbox Reference, Volume 1
o GS/OS Reference
o Apple IIGS Hardware Reference
o Apple IIGS Technical Note #69, The Ins and Outs of Slot Arbitration