home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Boot Disc 8
/
boot-disc-1997-04.iso
/
PDA_Soft
/
Pilot
/
Apps
/
Scribble
/
SCRIBBLE.ASM
< prev
next >
Wrap
Assembly Source File
|
1997-01-05
|
20KB
|
475 lines
; *******************************************************************
; * *
; * scribble_16.asm *
; * *
; * This aplet is based on Darrin Massena's PILA sample code. *
; * It requires Darrin's PILOT.INC and STARTUP.INC include files. *
; * For info on how to write apps for the world's best palmtop, *
; * aim your browser at *
; * http://www.massena.com/darrin/pilot *
; * *
; * If you have any questions about this source code, *
; * please send them to howlett@iosphere.net *
; * *
; * This code is freeware and you are free to modify it as you *
; * wish, however you must register your own Creator ID before *
; * you distribute any modifications. *
; * *
; * *
; * Andrew Howlett *
; * howlett@iosphere.net *
; * 2 Jan 97 *
; * *
; *******************************************************************
Appl "Scribble", 'Scrb' ; define name and creator ID
; creator ID is sometimes called AppType
; creator type is #$53637262
include "Pilot.inc" ; structs, constants
include "Startup.inc" ; common startup code
kidbAIB equ $7FFE ; Application-defined resource ids
kidrPREF equ 1 ; don't know who made up these names
kidrTVER equ 1
kidrTAIB equ 1000
kidfMain equ 1000
kidmMain equ 1000
kidmClear equ 1001
kidmAbout equ 1002
kidmNewPage equ 1003
kidmRemovePage equ 1004
kidmForwardPage equ 1005
kidmBackwardPage equ 1006
kidrAboutAlert equ 1000
ScribbleAppType equ $53637262 ; 'Scrb'
ScribbleDBType equ $44617461 ; 'Data'
data ; global variables
global lastX.w ; globals are offsets from a5
global lastY.w
global lastX1.w
global lastY1.w
global SkipNextEvent.w
global dbR.l
global CurrentIndex.w
global dbNumRecords.w
ScribbleDBName
dc.b 'ScribbleDB',0
NumString
dc.b '00',0
code
; *******************************************************************
; * *
; * DWord PilotMain(Word cmd, void *cmdPBP, Word launchflags) *
; * *
; * PilotMain is called by the startup code and implements *
; * a simple event handling loop. *
; * *
; *******************************************************************
proc PilotMain(cmd.w, cmdPBP.l, launchFlags.w)
local err.w
local evt.EventType
beginproc
tst.w cmd(a6) ;sysAppLaunchCmdNormalLaunch is 0
bne PmReturn ;not a normal launch, bag out
systrap FrmGotoForm(#kidfMain.w)
PmEventLoop ; Doze until an event arrives
systrap EvtGetEvent(&evt(a6), #evtWaitForever.w)
systrap SysHandleEvent(&evt(a6)) ; First handler is system
tst.b d0 ; handled?
bne.s PmEventDone ; yep
; Second is menu handler
systrap MenuHandleEvent(&0, &evt(a6), &err(a6))
tst.b d0 ; handled?
bne.s PmEventDone ; yep
; Third is application handler
call ApplicationHandleEvent(&evt(a6))
tst.b d0 ; handled?
bne.s PmEventDone ; yep
; Fourth is form handler.
; Form handler is where our
; custom code is located
call MainFormHandleEvent(&evt(a6))
tst.b d0 ; handled?
bne.s PmEventDone ; yep
; Still not handled.
; We're not interested
; in it anymore so let the
systrap FrmGetActiveForm() ; default form handler take it.
systrap FrmHandleEvent(a0.l, &evt(a6))
; Return from PilotMain when an
PmEventDone ; appStopEvent is received
cmpi.w #appStopEvent,evt+EventType.eType(a6) ; time to stop?
bne.s PmEventLoop ; nope, loop until it is
PmReturn
moveq #0, d0
endproc
; *******************************************************************
; * *
; * Boolean ApplicationHandleEvent(EventType *pevt) *
; * *
; * Handles these events: frmLoadEvent *
; * *
; *******************************************************************
proc ApplicationHandleEvent(pevt.l)
beginproc
movea.l pevt(a6),a0 ;a0 = pevt
cmp.w #frmLoadEvent,EventType.eType(a0)
beq FormLoadHandler
cmpi.w #appStopEvent,EventType.eType(a0)
beq ApplicationStopHandler
bra ApplicationEventNotHandled
FormLoadHandler ; Initialize the form and make it active
systrap FrmInitForm(EventType.data+frmLoad.formID(a0).w)
systrap FrmSetActiveForm(a0.l)
OpenDatabase ; try to open the database
systrap DmOpenDatabaseByTypeCreator (#ScribbleDBType.l, #ScribbleAppType.l, #dmModeReadWrite.w)
move.l a0, dbR(a5)
cmpa #0, a0
bne DrawForm ; if the database exists, goto DrawForm
CreateDatabase ; if the database doesn't exist, create it
systrap DmCreateDatabase(#0.w, &ScribbleDBName(a5), #ScribbleAppType.l, #ScribbleDBType.l, #false.w)
systrap DmOpenDatabaseByTypeCreator (#ScribbleDBType.l, #ScribbleAppType.l, #dmModeReadWrite.w)
move.l a0, dbR(a5)
clr.w CurrentIndex(a5) ; create a first record
clr.w dbNumRecords(a5)
systrap DmNewRecord (dbR(a5).l, &CurrentIndex(a5), #2840.l)
systrap DmReleaseRecord (dbR(a5).l, CurrentIndex(a5).w, #true.w)
call ClearScreen()
bra ApplicationEventNotHandled
DrawForm
clr.w CurrentIndex(a5)
systrap PrefGetAppPreferences(#ScribbleAppType.l, #15.w, &CurrentIndex(a5), #2.w)
DrawForm1
systrap DmNumRecords(dbR(a5).l)
subq.w #$0001, d0
move.w d0, dbNumRecords(a5)
call LoadScreen()
bra ApplicationEventNotHandled
ApplicationStopHandler ; Application Stop Handler
call SaveScreen()
systrap PrefSetAppPreferences(#ScribbleAppType.l, #15.w, &CurrentIndex(a5), #2.w)
ApplicationEventNotHandled
clr.b d0
ApplicationEventReturn
endproc
; *******************************************************************
; * *
; * Boolean MainFormHandleEvent(EventType *pevt) *
; * *
; * Handles these events: frmOpenEvent *
; * frmMenuEvent *
; * penDownEvent *
; * *
; *******************************************************************
proc MainFormHandleEvent(pevt.l)
beginproc
movea.l pevt(a6),a0 ; a0 = pevt
move.w EventType.eType(a0),d0 ; d0 = event type
cmp.w #menuEvent,d0 ; Handle Menu Events
beq MenuHandler
cmp.w #keyDownEvent,d0 ; Handle key down Events
beq KeyboardHandler
PenHandler
cmp.w #penDownEvent, d0 ; Handle pen Down Events
beq PenDownEventHandler
cmp.w #penUpEvent, d0 ; Handle pen Up Events
beq PenEventHandler
cmp.w #penMoveEvent, d0 ; Handle pen Move Events
beq PenEventHandler
clr.b d0 ; Not handled, d0=0
bra MFHReturn
MenuHandler ; Show "About" info box
move.w EventType.data+menu.itemID(a0), d0
cmp.w #kidmAbout, d0
beq MenuAboutHandler
cmp.w #kidmClear, d0
beq MenuClearHandler
cmp.w #kidmNewPage, d0
beq MenuNewPageHandler
cmp.w #kidmRemovePage, d0
beq MenuRemovePageHandler
cmp.w #kidmForwardPage, d0
beq MenuForwardPageHandler
cmp.w #kidmBackwardPage, d0
beq MenuBackwardPageHandler
bra MFHHandled
MenuAboutHandler
systrap FrmAlert(#kidrAboutAlert.w)
bra MFHHandled
MenuClearHandler ; Clear menu chosen
call ClearScreen ()
bra MFHHandled
MenuNewPageHandler
call SaveScreen()
addq.w #$0001, CurrentIndex(a5)
systrap DmNewRecord (dbR(a5).l, &CurrentIndex(a5), #2840.l)
cmpa #0, a0
bne MenuNewPageHandler1
subq.w #$0001, CurrentIndex(a5)
bra MFHHandled
MenuNewPageHandler1
systrap DmReleaseRecord (dbR(a5).l, CurrentIndex(a5).w, #true.w)
call ClearScreen()
addq.w #$0001, dbNumRecords(a5)
bra MFHHandled
MenuRemovePageHandler
tst.w dbNumRecords(a5)
beq MFHHandled
MenuRemovePageHandler1
subq.w #$0001, dbNumRecords(a5)
systrap DmRemoveRecord (dbR(a5).l, CurrentIndex(a5).w)
subq.w #$0001, CurrentIndex(a5)
bpl MenuRemovePageHandler2
clr CurrentIndex(a5)
MenuRemovePageHandler2
call LoadScreen()
bra MFHHandled
MenuForwardPageHandler
move.w CurrentIndex(a5),d0
cmp.w dbNumRecords(a5), d0
beq MFHHandled
call SaveScreen()
addq.w #$0001, CurrentIndex(a5)
call LoadScreen()
bra MFHHandled
MenuBackwardPageHandler
tst.w CurrentIndex(a5)
beq MFHHandled
call SaveScreen()
subq.w #$0001, CurrentIndex(a5)
call LoadScreen()
bra MFHHandled
PenDownEventHandler
move.w EventType.screenX(a0), lastX(a5) ; move x into lastX
move.w EventType.screenY(a0), lastY(a5) ; move y into lastY
move.w #1,SkipNextEvent(a5)
bra MFHHandled
PenEventHandler
tst.w SkipNextEvent(a5) ; skip first event
beq MFHReturn
clr.l d3
clr.l d4
move.w EventType.screenX(a0), d3 ; move x into d1
move.w EventType.screenY(a0), d4 ; move y into d2
cmp.w #159, d4
blt CheckPenUpEvent
move.w #159, d4
CheckPenUpEvent
cmp.w #penUpEvent, d0
bne DrawLineHandler
clr.w SkipNextEvent(a5)
DrawLineHandler
systrap WinDrawLine(lastX(a5).w, lastY(a5).w, d3.w, d4.w)
move.w d3, lastX(a5)
move.w d4, lastY(a5)
bra MFHHandled
KeyboardHandler
move.w EventType.data+keyDown.chr(a0), d0
andi.w #$1f, d0 ; mask #$1f for case-insensitive
cmp.w #01, d0 ; a is 1
beq MenuAboutHandler
cmp.w #03, d0 ; c is 3
beq MenuClearHandler
cmp.w #06, d0 ; f is 6
beq MenuForwardPageHandler
cmp.w #02, d0 ; b is 2
beq MenuBackwardPageHandler
cmp.w #14, d0 ; e is 14
beq MenuNewPageHandler
cmp.w #18, d0 ; r is 18
beq MenuRemovePageHandler
cmp.w #00, d0 ; space is 0
beq MenuForwardPageHandler
cmp.w #08, d0 ; backspace is 8
beq MenuBackwardPageHandler
MFHHandled
moveq.l #1,d0
MFHReturn
endproc
; *******************************************************************
; * *
; * Void ClearScreen (void) *
; * *
; *******************************************************************
proc ClearScreen()
systrap WinEraseWindow() ; Erase the window
systrap FrmGetActiveForm() ; Get form point a0
systrap FrmDrawForm(a0.l) ; Draw the form
call ShowCurrentIndex()
beginproc
endproc
; *******************************************************************
; * *
; * Void SaveScreen (void) *
; * *
; *******************************************************************
proc SaveScreen()
beginproc
systrap DmGetRecord (dbR(a5).l, CurrentIndex(a5).w)
move.l a0, a3 ; a3=RecordHandle
systrap MemHandleLock (a3.l)
systrap DmWrite (a0.l, #$00000000.l, #$00006518.l, #2840.l)
systrap MemHandleUnlock (a3.l)
systrap DmReleaseRecord (dbR(a5).l, CurrentIndex(a5).w, #true.w)
endproc
; *******************************************************************
; * *
; * Void LoadScreen (void) *
; * *
; *******************************************************************
proc LoadScreen()
beginproc
call ClearScreen()
systrap DmQueryRecord (dbR(a5).l, CurrentIndex(a5).w)
move.l a0, a2 ; a2=RecordHandle
systrap MemHandleLock (a0.l)
move.l #$00006518, a3 ; copy screen from record
MoveLoop
move.l (a0)+, (a3)+
cmpa #$00007030, a3 ; $6518 + 2840 = $7030
blt MoveLoop
systrap MemHandleUnlock (a2.l) ; unlock record
; record doesn't have to be released
; because it was only queried
call ShowCurrentIndex()
endproc
; *******************************************************************
; * *
; * Void ShowCurrentIndex (void) *
; * *
; *******************************************************************
proc ShowCurrentIndex()
beginproc
move.w CurrentIndex(a5),d0 ; show page number
addq.l #1, d0
move.l d0,-(a7)
pea.l NumString(a5)
trap #15
dc.w sysTrapStrIToA
addq.l #8,a7
systrap StrLen(&NumString(a5))
systrap WinDrawChars (&NumString(a5),d0.w, #150.w, #150.w)
endproc
; *******************************************************************
; * *
; * Resources *
; * *
; * WBMP - Application Icon Bitmap resource. Automatically *
; * converted from Windows format to Pilot format and *
; * written as a 'tAIB' rather than 'Tbmp' because kidbAIB *
; * is a special value ($7ffe). *
; * pref - Preference resource. Defines app launch flags, *
; * stack and heap size. *
; * tFRM - Form resource. Defined in scribble.rcp *
; * tver - Version resource * *
; * MBAR - Menu resource. Defined in scribble.rcp *
; * Talt - Alert resource. Defined in scribble.rcp *
; * *
; * Filenames for scribble.rcp generated binaries are the *
; * resource type, followed by the ID in hexadecimal. *
; * E.g. MBAR ID 1000 ==> mbar03e8.bin *
; * *
; *******************************************************************
res 'WBMP', kidbAIB, "Scribble.bmp"
res 'pref', kidrPREF
dc.w sysAppLaunchFlagNewStack|sysAppLaunchFlagNewGlobals|sysAppLaunchFlagUIApp|sysAppLaunchFlagSubCall
dc.l $1000 ; stack size
dc.l $1000 ; heap size
res 'tFRM', kidfMain, "tfrm03e8.bin"
res 'tver', kidrTVER
dc.b '1.5', 0
res 'MBAR', kidmMain, "mbar03e8.bin"
res 'Talt', kidrAboutAlert, "talt03e8.bin"
; ******************** debug code
;
; this line can be used to insert a breakpoint
;
; systrap ErrDisplayFileLineMsg (&ErrorString(a5), #163.w, &ErrorString(a5))
;