gslaplay/asm/shell.s

1166 lines
24 KiB
ArmAsm

lst off
*
* DreamWorld Software Generic Shell
*
* v .02 10/8/90
*
* OA-F "damnmenu" to find menu definitions
*
rel
dsk shell.l
use drm.macs
vidmode = $8080 ;Video mode for QD II (320) ($8000)
;640 mode ($8080)
* startup tools, begin program
tool equ $e10000
iobuff equ $80
textlength equ 38 ;max length of text
startup ent
phk
plb ;make the program bank = data bank
SetRes sep $30 ; 8-bit mode
lda #$5C ; jml
stal $3F8 ; ctrl-y vector
rep $30 ; 16-bit mode
lda #Resume
stal $3F9 ; $3f9,3fa
lda #^Resume ; bank byte
stal $3FB ; $3fb,3fc
_TLStartUp ;Gotta start this baby
~MMStartUp ;start the Memory manager
; CheckToolError
pla ;retrieve our program ID
sta ProgID
PushLong #0 ;result space
lda ProgID ;user ID
pha
pea #$0 ;reference by handle
PushLong #startref
ldx #$1801 ;startuptools
jsl $e10000
PullLong stref
jmp DoMenu
:trouble
pha
PushLong #0
ldx #$1503
jsl $e10000
rtl
backhandle dw 0,0
*
* Draw the desktop
*
DoMenu
ldx #$0001
lda #$0000
jsr getmem
bcc :ov3
brl ShutDown
:ov3 ;handle in a and x
jsl dereference
sta p:rbuf ; set up Disk I/O buffer
sta iobuff
txa
sta p:rbuf+2
sta iobuff+2
* PushLong #0
* PushPtr ExampleM
* _NewMenu
* PushWord #0
* _InsertMenu
PushLong #0
PushPtr EditM
_NewMenu
PushWord #0
_InsertMenu
PushLong #0
PushPtr FileM
_NewMenu
PushWord #0
_InsertMenu
PushLong #0
PushPtr AppleM
_NewMenu
PushWord #0
_InsertMenu
PushLong #1
_FixAppleMenu
PHA
_FixMenuBar
PLA
_DrawMenuBar
_InitCursor
JSR DoAbout ; Show this to the user before we get going...
* Command Processor
*
* Use TaskMaster to handle any and all events.
* We only check for events within the menus
* currently. The 'wInSpecial' ensures that we
* get events 250-255.
*
GetEvent
pha
PushWord #$FFFF
PushPtr TaskRecord
_TaskMaster
pla
cmp #25 ;wInSpecial
beq :DoEvent
cmp #17 ;wInMenuBar
bne GetEvent
:DoEvent
sec
lda TaskData
sbc #250 ;Reduce to 0 and
asl ; double to find
tax ; index into table.
jsr (Cmds,X)
PushWord #0
PushWord TaskData+2
_HiliteMenu
bra GetEvent
* damnmenu
*
* Menu definitions
*
]mnum = 0 ; "1" - 1 = 0
AppleM Menu '@';'X'
]inum = 255
Item 'About...';Divide;'';Kybd;'?/'
FileM Menu ' File '
; Item 'New';Kybd;'Nn'
Item 'Open...';Divide;'';Kybd;'Oo'
Item 'Automatic';Divide;'';Kybd;'Aa'
OpenItem = ]inum
]inum = 254
Item 'Close';Divide;'' ; (#255)
]inum = OpenItem
Item 'Quit';Kybd;'Qq'
QuitItem = ]inum
EditM Menu ' Edit '
]inum = 249
Item 'Undo';Divide;'';Kybd;'Zz' ; (#250)
Item 'Cut';Kybd;'Xx' ; (#251)
Item 'Copy';Kybd;'Cc' ; (#252)
Item 'Paste';Divide;'';Kybd;'Vv' ; (#253)
Item 'Clear' ; (#254)
*ExampleM Menu ' Example '
*]inum = QuitItem
* Item 'Bold';Disable;''
* Item 'Disable';Disable;''
* Item 'Italic';Disable;''
* Item 'Underline';Disable;''
* Item 'Divide';Disable;''
* Item 'Check';Disable;''
* Item 'Blank';Disable;''
asc '.' ;End of menu.
TaskRecord
tType ds 2 ;Event code
tMessage ds 4 ;Type of Event
tWhen ds 4 ;Time since startup
tWhere ds 4 ;Mouse Location
tMod ds 2 ;Event modifier
TaskData ds 4 ;Taskmaster Data
TaskMask adrl $00001FFF ;Taskmaster Handle All
Fileinfo ;place for file info
Fopen dw 0 ;good info?
Ftype dw 0 ;file type
Atype adrl 0 ;aux type
Nref dw 0 ;Name reference type
Name adrl name ;Where is the name? (pointer)
Pref dw 0 ;Path reference type
Path adrl path ;Where is the path? (pointer)
name ds 256 ;space for filename
path ds 512 ;space for pathname
fullp ds 768
ProgID dw 0
* ShutDown Routine
ShutDown ent ;a global label so other modules can die here.:)
pea #$0 ;ref is pointer
PushLong stref ;Reference to startstop record
ldx #$1901
jsl $e10000 ;Shut Down Tools
MMout ~MMShutDown ProgID
TLout _TLShutDown
:1 _QUIT QuitParms
bra :1 ;keep quitting if GS/OS is busy
QuitParms adrl $0
ds 2
getmem ent
sta :sizelo+1
stx :sizehi+1
lda #0
pha
pha ; Space for Results
:sizehi pea #$0000
:sizelo pea #$ffff ; Size in Bytes of Block 64k
lda ProgID
pha
pea #%1100000000011100 ; Attributes
lda #0
pha
pha ; Ptr to where Block is to begin
ldx #$0902
jsl tool ; NewHandle
pla
plx
rts
dereference ent
pei 0
pei 2
sta 0
stx 2
lda [0]
pha
ldy #2
lda [0],y
tax
ply
pla
sta 2
pla
sta 0
tya
rtl
* Resume routine for Control-Y vector...
Resume phk
plb
clc
xce ; set native mode
rep $30 ; 16-bit mode
jmp ShutDown ; Let's get outta here!!
startref ;tool startup record
dw $0000 ;flags
dw vidmode ;videoMode
ds 6 ;resFileID & dPageHandle are set by the StartUpTools call
dw 19 ;# of tools
;tool number, version number
dw 1,$0300 ;Tool Locator
dw 2,$0300 ;Memory Manager
dw 3,$0300 ;Miscellaneous Tools
dw 4,$0301 ;QuickDraw II
dw 5,$0302 ;Desk Manager
dw 6,$0300 ;Event Manager
dw 11,$0200 ;Integer Math
dw 14,$0301 ;Window Manager
dw 15,$0301 ;Menu Manager
dw 16,$0301 ;Control Manager
dw 18,$0301 ;QuickDraw II Aux.
dw 19,$0300 ;Print Manager
dw 20,$0301 ;LineEdit Tools
dw 21,$0301 ;Dialog Manager
dw 22,$0300 ;Scrap Manager
dw 23,$0301 ;Standard File Tools
dw 27,$0301 ;Font Manager
dw 28,$0301 ;List Manager
dw 34,$0101 ;TextEdit Manager
stref adrl 0 ;reference to the startstop record
*
* Look up table for event processor
*
Cmds
da DoUndo ; These menu items are set as
da DoCut ; required by Apple for
da DoCopy ; NDA compatibility.
da DoPaste
da DoClear
da DoClose
da DoAbout ;This starts OUR items. (#256)
da DoOpen
da DoAutomatic
da ShutDown
*
* Main code goes here...
*
DoAbout
~NoteAlert #AboutTemplate;#0
pla
rts
AboutTemplate
dw 62,128,151,512 ;position
dw 1
dfb 128,128,128,128
adrl :Item1
adrl :Item2
adrl :Item3
adrl 0
:Item3 da 3
dw 33,76,43,291 ;rect
da StatTextItem+ItemDisable
adrl :Item3Txt
da 0
da 0
adrl 0
:Item3Txt
str '(C) DreamWorld Software 1991'
:Item2 dw 2
dw 13,122,22,251 ;rect
da StatTextItem+ItemDisable
adrl :Item2Txt
da 0
da 0
adrl 0
:Item2Txt str 'DreamStamp v0.8'
:Item1 da 1
dw 66,272,78,350 ;rect
da ButtonItem
adrl :Item1Txt
da 0
da 1
adrl 0
:Item1Txt str ' Ok '
DoOpen
pea #30 ;x of upper left corner
pea #40 ;y of upper left corner
pea #0 ;type of reference
PushLong #:message ;location of pascal string
PushLong #0 ;Filter... none for now
PushLong #:filter ;Pointer to type list record
PushLong #Fileinfo ;Pointer to reply record
ldx #$0e17 ;SF Get File 2
jsl $e10000
bcc :cont
brl :trouble
:cont
lda Fopen ;good?
bne :keepitup
:bye rts
:keepitup
lda path+2 ;length of pathname
sta fullp
ldx #0
:lup
lda path+4,x ;make this class 1 string a prodos string
sta fullp+1,x
inx
inx
cpx path+2
bcc :lup
_Open p:open
bcs :trouble
lda p:open
sta p:read
sta p:setmark
_SetMark p:setmark
bcs :trouble
_Read p:read
bcs :trouble
_Close p:close
bcs :trouble
brl changestats
:temp dw 0
:trouble
pha
PushLong #0
ldx #$1503
jsl $e10000
rtl
:message str 'Select File to Open:'
:filter dw 1 ;only show s16 files
dw 0,$b3,0,0 ;flags, filetype, auxtype
p:close
p:open dw 1 ;ref number
adrl fullp ;pathname
adrl 0 ;io buffer, doesn't reallymatter
p:write
p:read dw 0
p:rbuf adrl 0
adrl $8000 ;number requested 32k
adrl 0 ;number transfered
p:setmark
dw 0 ;ref number
p:where adrl $1c000 ;about 108k into file
DoSave
_Open p:open
bcs :trouble
lda p:open
sta p:read
sta p:setmark
_SetMark p:setmark
bcs :trouble
_Write p:write
bcs :trouble
_Close p:close
bcs :trouble
rts
:trouble
pha
PushLong #0
ldx #$1503
jsl $e10000
rtl
changestats
lda iobuff
sta :modify+1
lda iobuff+1
sta :modify+2
ldx #0
:modify ldal $030000,x
cmp text+1
beq :cont
cpx #$ffff
beq :nope
inx
bra :modify
:nope
rts
:cont
lda text
and #$00ff
; dec
sta :temp
stx offset
txy
iny
ldx #0
:lup lda [iobuff],y
inx
iny
cmp text+1,x
bne :goback
cpx :temp
cpx #6
bcc :lup
bra :dodialog
:temp dw 0
:goback
ldx offset
inx
brl :modify
:dodialog
PushLong #0
PushLong #:getinfo
Tool $3215 ;new dialog
PullLong :pointer
brl :initialize
]lp
pea #0
PushLong #0
Tool $0f15 ;modal dialog
pla
beq ]lp
cmp #1
beq :okay
cmp #2
beq :cancel
cmp #7
bcs ]lp
brl :toggle
:cancel
PushLong :pointer
Tool $0c15 ;close dialog
rts
:initnew
ldx #0
sep #$20
lda #' '
]dup sta newname,x
inx
cpx #textlength+1
bcc ]dup
rep #$30
rts
:okay
jsr :initnew ;initialize newname area
PushLong :pointer
pea #8 ;name of user
PushLong #newname ;place to put the name
Tool $1f15 ;GetIText
PushLong :pointer
pea #9 ;new serial number
PushLong #newser ;place to put the name
Tool $1f15 ;GetIText
jsr :putser
bcs ]lp
lda vernum
asl
tax
jsr (:encode,x)
PushLong :pointer
Tool $0c15 ;close dialog
jmp DoSave ;it's over
:putser ;low word
sep #$20
ldy #0
:lloop
lda rserial,y ;location of serial string
ldx #0
:bloop cmp :ascii,x
beq :okay2
inx
cpx #17
bcc :bloop
rep #$30
sec
rts
sep #$20
:okay2
txa
sta :teeem,y
iny
cpy #8
bcc :lloop
lda :teeem
asl
asl
asl
asl
ora :teeem+1
sta :value+3
lda :teeem+2
asl
asl
asl
asl
ora :teeem+3
sta :value+2
lda :teeem+4
asl
asl
asl
asl
ora :teeem+5
sta :value+1
lda :teeem+6
asl
asl
asl
asl
ora :teeem+7
sta :value
rep #$30
ldy serloc
lda :value
sta [iobuff],y
lda :value+2
iny
iny
sta [iobuff],y
clc
rts
:teeem dw 0,0,0,0 ;8 bit mode
asc 'shit'
:value dw 0,0
:encode
da :sc1
da :sc2
da :sc3
da :sc4
:sc1
sep #$20
ldx #0
ldy texloc
:her0
lda newname+1,x
sec
sbc maskval
sta [iobuff],y
inx
dey
cpx #textlength+1
bcc :her0
rep #$30
rts
:sc2
sep #$20
ldx #0
ldy texloc
:her1
lda newname+1,x
sec
sbc maskval
sta [iobuff],y
inx
dey
cpx #textlength+1
bcc :her1
rep #$30
rts
:sc3
:sc4
rts
:toggle
sec
sbc #3 ;make value 0-3
sta vernum ;version number
asl
asl
asl
tax
phx
lda :val,x
pha
PushLong :pointer
pea #3 ;item number
Tool $2f15 ;setditemvalue
plx
phx
lda :val+2,x
pha
PushLong :pointer
pea #4 ;item number
Tool $2f15 ;setditemvalue
plx
phx
lda :val+4,x
pha
PushLong :pointer
pea #5 ;item number
Tool $2f15 ;setditemvalue
plx
lda :val+6,x
pha
PushLong :pointer
pea #6 ;item number
Tool $2f15 ;setditemvalue
lda vernum
asl
tax
lda :maskval,x
sta maskval
and #$f000
xba
lsr
lsr
lsr
lsr
tax
sep #$20
lda :ascii,x
sta maskstr+2
rep #$30
lda maskval
and #$0f00
xba
tax
sep #$20
lda :ascii,x
sta maskstr+3
rep #$30
lda maskval
and #$00f0
lsr
lsr
lsr
lsr
tax
sep #$20
lda :ascii,x
sta maskstr+4
rep #$30
lda maskval
and #$000f
tax
sep #$20
lda :ascii,x
sta maskstr+5
rep #$30
PushLong :pointer
pea #10 ;mask value
PushLong #maskstr
Tool $2015 ;setItext
ldy serloc
lda [iobuff],y
sta serval
iny
iny
lda [iobuff],y
sta serval+2
and #$f000
xba
lsr
lsr
lsr
lsr
tax
sep #$20
lda :ascii,x
sta serstr+2
rep #$30
lda serval+2
and #$0f00
xba
tax
sep #$20
lda :ascii,x
sta serstr+3
rep #$30
lda serval+2
and #$00f0
lsr
lsr
lsr
lsr
tax
sep #$20
lda :ascii,x
sta serstr+4
rep #$30
lda serval+2
and #$000f
tax
sep #$20
lda :ascii,x
sta serstr+5
rep #$30
lda serval
and #$f000
xba
lsr
lsr
lsr
lsr
tax
sep #$20
lda :ascii,x
sta serstr+6
rep #$30
lda serval
and #$0f00
xba
tax
sep #$20
lda :ascii,x
sta serstr+7
rep #$30
lda serval
and #$00f0
lsr
lsr
lsr
lsr
tax
sep #$20
lda :ascii,x
sta serstr+8
rep #$30
lda serval
and #$000f
tax
sep #$20
lda :ascii,x
sta serstr+9
rep #$30
PushLong :pointer
pea #9 ;serial number
PushLong #serstr
Tool $2015 ;setItext
lda vernum
asl
tax
lda offset
clc
adc :wheret,x
sta texloc
jsr (:decode,x)
PushLong :pointer
pea #7 ;serial number
PushLong #oldname
Tool $2015 ;setItext
brl ]lp
:decode
da :scheme1
da :scheme2
da :scheme3
da :scheme4
:scheme1
sep #$20
ldx #0
ldy texloc
:here
lda [iobuff],y
clc
adc maskval
sta oldname+1,x
inx
dey
cpx #textlength+1
bcc :here
rep #$30
rts
:scheme2
sep #$20
ldx #0
ldy texloc
:here2
lda [iobuff],y
clc
adc maskval
sta oldname+1,x
inx
dey
cpx #textlength+1
bcc :here2
rep #$30
rts
:scheme3
rts
:scheme4
rts
:ascii asc '0123456789abcdef'
:val
dw 1,0,0,0
dw 0,1,0,0
dw 0,0,1,0
dw 0,0,0,1
:maskval dw $30,$28,0,0 ;different encoding values for each ver number
:wheret dw $128,$128,0,0 ;offset to text from end of 'Written by'
:initialize
lda text
and #$00ff
clc
adc offset
sta offset
sta serloc
lda #3 ;version 1
brl :toggle
:pointer adrl 0
:getinfo
dw 27,82,185,558 ;position
dw -1 ;visible
adrl 0 ;reserved
adrl :item1
adrl :item2
adrl :item3
adrl :item4
adrl :item5
adrl :item6
adrl :item7
adrl :item10
adrl :item9
adrl :item8
adrl :item11
adrl :item12
adrl :item13
adrl :item14
adrl :item15
adrl 0 ;terminator
:item1 DA 1
dw 137,340,150,430 ;rect
DA ButtonItem
adrl :Item1Txt
da 0
da 1
adrl 0
:Item1Txt str 'Save'
:item2 DA 2
dw 137,210,150,300 ;rect
DA ButtonItem
ADRL :Item2Txt
DA 0
DA 0
ADRL 0
:Item2Txt STR 'Cancel'
:item3 dw 3
dw 23,52,32,160 ;rect
dw CheckItem
adrl :i3text
:i3val dw 0,0,0,0
:i3text str ' Version 1'
:item4 dw 4
dw 34,52,43,162 ;rect
dw CheckItem
adrl :i5text
:i5val dw 0,0,0,0
:i5text str ' Version 2'
:item5 dw 5
dw 23,210,32,320 ;rect
dw CheckItem
adrl :i4text
:i4val dw 0,0,0,0
:i4text str ' Version 3'
:item6 DA 6
dw 34,210,43,322 ;rect
dw CheckItem
adrl :i6text
:i6val dw 0,0,0,0
:i6text str ' Version 4'
:item7 dw 7
dw 59,125,72,503 ;rect
dw StatTextItem+ItemDisable
adrl oldname
dw 0,0
adrl 0
:item8 dw 8
dw 90,50,103,426 ;rect
DA EditLine+ItemDisable
adrl defname
dw textlength
dw 0
adrl 0
:item9 dw 9
dw 119,52,131,150 ;rect
DA EditLine+ItemDisable
adrl serstr
dw 9
dw 0
adrl 0
:item10 dw 10
dw 119,200,131,264 ;rect
DA EditLine+ItemDisable
adrl maskstr
dw 5
dw 0
adrl 0
:item11 dw 11
dw 8,180,17,287 ;rect
dw StatTextItem+ItemDisable
adrl :item11txt
dw 0,0
adrl 0
:item11txt
dfb 11
asc 'DreamStamp'
dfb $AA
:item12 dw 12
dw 48,50,57,125 ;rect
dw StatTextItem+ItemDisable
adrl :item12txt
dw 0,0
adrl 0
:item12txt
str 'Current:'
:item13 dw 13
dw 79,50,88,91 ;rect
dw StatTextItem+ItemDisable
adrl :item13txt
dw 0,0
adrl 0
:item13txt
str 'New:'
:item14 dw 14
dw 108,50,117,161 ;rect
dw StatTextItem+ItemDisable
adrl :item14txt
dw 0,0
adrl 0
:item14txt
str 'Serial Number:'
:item15 dw 15
dw 108,200,117,275 ;rect
dw StatTextItem+ItemDisable
adrl :item15txt
dw 0,0
adrl 0
:item15txt
str 'Mask:'
vernum dw 0 ;version number 0 - 3
DoAutomatic
DoUndo
DoCut
DoCopy
DoPaste
DoClear
DoClose
RTS
oldname ;name in the program
dfb textlength
ds textlength
dw 0
defname
str 'Joe Hack and The Mercenary'
newser dfb 0
dfb 0
rserial ds 8
newname ds textlength+1
dw 0
maskloc dw 0 ;offset to mask
maskval dw 0
maskstr str '$0000'
offset dw 0
serloc dw 0 ;offset to serial number
serstr str '$00000000'
serval adrl 0
texloc dw 0 ;offset to beginning of text
text
str "Written By: Jason Andersen and Steven Chiang"