Davex/src/xtn/2/sysalias.asm

670 lines
14 KiB
NASM

;*********************************************
;
; External command for Davex
;
; sysalias -- create an alias for a SYS file
; or S16 file
;
; The alias will be an executable file whose
; only function is to launch the original
; file, after possibly setting the prefix
; and passing startup-file information to
; the target.
;
; This permits SYS and S16 files to appear
; to be in several places at once without
; actually taking up much disk space, and
; it also makes it easy to launch apps with
; convenient prefixes and startup pathnames.
;
;*********************************************
;
; Modified 7-Jul-87 DL ==> v1.1
; -p allowed; specifies prefix
;
; Modified 12-Dec-87 DL ==> v1.2
; -s allowed; specifies startup path
;
; Modified 15-Oct-89 DL ==> Merlin source
;
; Modified 16-Oct-89 DL ==> v1.3
; "Catalyst buffer" changed to "startup buffer"
; If startup buffer is large, creates a
; smaller one instead of giving up
; Creates aliases for S16 files, which
; can set prefix, send Open message,
; and Quit to original app
;
;*********************************************
;
; Converted to MPW IIgs 21-Sep-92 DAL
;
;*********************************************
;
; Known bugs:
; The created Alias file should probably check
; to make sure the file it's running is STILL
; a SYS file & STILL has a Startup buffer
;
;*********************************************
.include "Common/2/Globals2.asm"
.include "Common/2/Apple.Globals2.asm"
.include "Common/2/Mli.globals2.asm"
.include "Common/Macros.asm"
.segment "CODE_A000"
orgadr = $A000
; org orgadr
;
; Hard-coded offsets into TheImage
;
S16ImageOffset = $0167
S16OpenOffset = $02DB
thePathOffset = $00E5
thePrefixOffset = $0126
S16QuitToOffset = $0251
S16PrefixOffset = $0292
myVersion = $13
minVersion = $10
;*********************************************
rts
.byte $ee,$ee
.byte myVersion,minVersion
.byte %00000000 ;hardware req
.addr descr
.addr orgadr
.addr start
.byte 0,0,0,0
; parameters here
.byte 0,t_path
.byte 0,t_path
.byte $80+'p',t_path
.byte $80+'s',t_path
.byte 0,0
descr: pstr "create alias for SYS or S16 file"
;*********************************************
; dum xczpage
path1 = xczpage ;ds 2
path2 = path1+2 ;ds 2
stpath = path2+2 ;ds 2
pfxptr = stpath+2 ;ds 2
s16_flag = pfxptr+2 ;ds 1
; dend
;*********************************************
myerror: jmp xProDOS_err
start:
;
; get info on 1st file to make sure it
; exists and is SYS or S16
;
lda #0
jsr xgetparm_n
sta path1+1
sty path1
sta info_path+1
sty info_path
lda #10
sta info_parms
jsr mli
.byte mli_gfinfo
.addr info_parms
bcs myerror
;
lsr s16_flag
lda info_ftype
cmp #$FF
beq is_sys
cmp #$B3
bne not_s16
ror s16_flag
bmi is_sys ;always
;
not_s16: jsr xmess
.byte cr
asc "*** not a SYS or S16 file"
.byte cr,0
jmp xerr
;
; create a SYS sysalias file
;
is_sys:
lda #1
jsr xgetparm_n
sta path2+1
sty path2
sta cr_path+1
sty cr_path
jsr mli
.byte mli_create
.addr create_parms
bcc createdok
jmp xProDOS_err
createdok:
;
bit s16_flag
bmi skip_sysbuff
lda #$ef
sta TheImage+4
jsr startup_sz
cmp #69
bcc sysb_ok
;
jsr xmess
asc "(note: creating smaller startup buffer)"
.byte cr,0
lda #68
;
sysb_ok:
sta TheImage+5
cmp #0
beq no_sysbuff
dec TheImage+4 ;make $EE!
no_sysbuff:
skip_sysbuff:
;
; If -s given, copy path into startup buffer
;
lda #'s'+$80
jsr xgetparm_ch
bcs no_stpath
sta stpath+1
sty stpath
; copy startup path into one of the images
bit s16_flag
bmi stuff_s16st
; stuff SYS startup buffer
ldy #0
lda (stpath),y
cmp TheImage+5
bcs StPathBig
tay
copystp: lda (stpath),y
sta TheImage+6,y
dey
bpl copystp
jmp no_stpath
StPathBig: jsr xmess
.byte cr
asc "*** startup path too big for buffer"
.byte cr,0
jmp xerr
stuff_s16st = *
ldy #0
lda (stpath),y
cmp #64
bcs StPathBig
tay
stuff16a: lda (stpath),y
sta TheImage+S16OpenOffset,y
dey
bpl stuff16a
no_stpath = *
;
; copy name of 1st file into thePath
; in code image
;
ldy #0
lda (path1),y
tay
copyname: lda (path1),y
sta TheImage+thePathOffset,y
sta TheImage+S16QuitToOffset,y
dey
cpy #<-1
bne copyname
;
; copy prefix into buffer if -p given
;
lda #'p'+$80
jsr xgetparm_ch
bcs nopfx
sta pfxptr+1
sty pfxptr
ldy #0
lda (pfxptr),y
cmp #64
bcc pfxShort
jsr xmess
.byte cr
asc "*** prefix too long"
.byte cr,0
jmp xerr
pfxShort = *
tay
copyPfx: lda (pfxptr),y
sta TheImage+thePrefixOffset,y
sta TheImage+S16PrefixOffset,y
dey
cpy #<-1
bne copyPfx
nopfx = *
;
; open 2nd file & write it
;
lda path2+1
ldy path2
jsr open
sta write_ref
sta write_ref2
bit s16_flag
bmi write16
jsr mli
.byte mli_write
.addr write_parms
bcc writ
err0: jmp xProDOS_err
write16: jsr mli
.byte mli_write
.addr write_s16
bcs err0
writ: lda write_ref
jsr close
lda path2+1
ldy path2
sta info_path+1
sty info_path
lda #7
sta info_parms
jsr mli
.byte mli_sfinfo
.addr info_parms
bcc set
jmp xProDOS_err
set = *
rts
;
write_parms: .byte 4
write_ref: .res 1
.addr TheImage
.addr image_end-image
.addr 0
write_s16: .byte 4
write_ref2: .res 1
.addr TheImage+S16ImageOffset
.addr s16image_end-s16image
.addr 0
;***********************************************
create_parms: .byte 7
cr_path: .res 2
.byte %11000011 ;unlocked
.byte $00 ;type $00 initially
.addr 0 ;auxtype
.byte 1 ;sttype
.addr 0,0 ;date/time
;
info_parms: .res 1
info_path: .res 2
.res 1 ;access
info_ftype: .res 1
.res 2 ;aux
.res 1 ;sttype
.res 2 ;blocks
.addr 0,0,0,0 ;date/time
;***********************************************
open: sta open_path+1
sty open_path
jsr mli
.byte mli_open
.addr open_parms
bcc opened
proerr: jmp xProDOS_err
opened: lda open_ref
rts
;
open_parms: .byte 3
open_path: .res 2
.addr filebuff
open_ref: .res 1
;
; close (a)
;
close: sta close_ref
jsr mli
.byte mli_close
.addr close_parms
rts
close_parms: .byte 1
close_ref: .res 1
;
; get size of SYS startup buffer
;
startup_sz = *
lda path1+1
ldy path1
jsr open
sta read_ref
jsr mli
.byte mli_read
.addr read_parms
bcc read_ok
jmp xProDOS_err
read_ok: lda read_ref
jsr close
lda pagebuff
cmp #$4c
bne sysb_0
lda #$ee
cmp pagebuff+3
bne sysb_0
cmp pagebuff+4
bne sysb_0
lda pagebuff+5
rts
sysb_0: lda #0
rts
;
read_parms: .byte 4
read_ref: .byte 1
.addr pagebuff
.addr 10
.addr 0
;***********************************************
;***********************************************
;
; IMAGE -- this code is written to the alias
; file, with or without a valid startup buffer
; and with the name of the original file
; inserted at the end.
;
; The code will copy itself to $1000 and execute
; there.
;
;***********************************************
TheImage: ; proc export
.org $1000
image: ; proc export, temporg $1000
;diff1 = $1000-image
;diff2 = $2000-image
jmp image2+$1000 ;+diff2
.byte $ee,$00 ;maybe made into $ee
.byte 0 ;cb size
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
.byte 0,0,0,0,0,0,0,0,0,0 ;10 zeroes
image2 = *
ldx #0
copyme: lda $2000,x
sta $1000,x
lda $2100,x
sta $1100,x
dex
bne copyme
jmp continue ; +diff1
i_error: pha
jsr $fc58
pla
jsr $fdda
jsr $fbdd
jsr $fbdd
jsr $fd0c
jsr mli
.byte mli_bye
.addr bye_parms ; +diff1
;;; brk
.byte 0
bye_parms: .byte 4,0,0,0,0,0,0
continue = *
lda thePrefix ; +diff1
beq noSetP
jsr mli
.byte mli_setpfx
.addr i_setp ; +diff1
bcs i_error
noSetP = *
;
jsr mli
.byte mli_open
.addr i_openp ; +diff1
bcs i_error
;
lda i_ref ; +diff1
sta i_ref2 ; +diff1
sta i_ref3 ; +diff1
;
jsr mli
.byte mli_read
.addr i_readp ; +diff1
bcs i_error
;
jsr mli
.byte mli_close
.addr i_closep ; +diff1
;
lda $1005 ;startup buff sz
beq i_nocopy
lda $1006
beq i_nocopy
tay
i_copycb: lda $1006,y
sta $2006,y
dey
cpy #<-1
bne i_copycb
i_nocopy = *
;
ldy thePath ; +diff1
cppath280: lda thePath,y ; +diff1
sta $280,y
dey
cpy #<-1
bne cppath280
jmp $2000
;
i_openp: .byte 3
.addr thePath ; +diff1
.addr $C00
i_ref: .byte 0
;
i_readp: .byte 4
i_ref2: .byte 0
.addr $2000
.addr $ffff
.addr 0
;
i_closep: .byte 1
i_ref3: .byte 0
;
i_setp: .byte 1
.addr thePrefix ; +diff1
;
thePath: .byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0
thePrefix:
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0
image_end:
;********************************************
; export s16image
s16image:
.byte $ED,$01,$00,$00,$00,$00,$00,$00,$70,$01,$00,$00,$FF,$0A,$04,$02
.byte $00,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$01,$00,$00,$00,$00,$00,$2C,$00,$40,$00,$20,$20,$20,$20
.byte $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
.byte $F2,$70,$01,$00,$00,$4B,$AB,$AD,$E6,$00,$F0,$0A,$22,$A8,$00,$E1
.byte $09,$00,$98,$00,$00,$00,$AD,$2F,$01,$29,$FF,$00,$F0,$6B,$48,$48
.byte $F4,$00,$00,$18,$69,$0A,$00,$48,$8D,$9E,$00,$48,$A2,$02,$02,$22
.byte $00,$00,$E1,$F4,$00,$C0,$48,$48,$A2,$02,$09,$22,$00,$00,$E1,$68
.byte $8D,$A0,$00,$68,$8D,$A2,$00,$B0,$40,$F4,$00,$00,$F4,$27,$01,$AD
.byte $A2,$00,$48,$AD,$A0,$00,$48,$F4,$00,$00,$AD,$9E,$00,$48,$A2,$02
.byte $28,$22,$00,$00,$E1,$F4,$01,$00,$F4,$01,$00,$AD,$A2,$00,$48,$AD
.byte $A0,$00,$48,$A2,$01,$15,$22,$00,$00,$E1,$AD,$A2,$00,$48,$AD,$A0
.byte $00,$48,$A2,$02,$10,$22,$00,$00,$E1,$22,$A8,$00,$E1,$29,$00,$90
.byte $00,$00,$00,$00,$00,$A5,$00,$00,$00,$00,$00,$00,$00,$00,$00,$E6
.byte $00,$00,$00,$00,$00,$00,$00,$00,$00
.byte $51
; export S16QuitTo
S16QuitTo:
.byte $00,$00,$33,$34,$35,$36
.byte $37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34,$35,$36
.byte $37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34,$35,$36
.byte $37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34,$35,$36
.byte $37,$38,$31,$32,$33,$34,$35,$36,$37,$38
.byte $50
; Export S16Prefix
S16Prefix:
.byte $00,$00,$33,$34,$35
.byte $36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34,$35
.byte $36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34,$35
.byte $36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34,$35
.byte $36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38
.byte $4F
.byte $00,$00,$00,$00,$01,$00,$00,$00
; export S16Open
S16Open: .byte $00,$00,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34
.byte $35,$36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34
.byte $35,$36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34
.byte $35,$36,$37,$38,$31,$32,$33,$34,$35,$36,$37,$38,$31,$32,$33,$34
.byte $35,$36,$37,$38,$00,$F5,$04,$00,$0D,$00,$98,$00,$F5,$02,$F0,$45
.byte $00,$27,$01,$F5,$04,$00,$8A,$00,$90,$00,$F5,$04,$00,$90,$00,$A5
.byte $00,$F5,$04,$00,$9A,$00,$E6,$00,$F7,$0F,$00,$00,$00,$00,$0C,$03
.byte $12,$24,$3C,$40,$48,$4B,$4F,$56,$67,$6B,$76,$7A,$00
; export s16image_end
s16image_end:
;****************************************************
;****************************************************
; keep s16image
;****************************************************
;*
;* S16 launcher image for Davex 8 sysalias command
;*
;* Dave Lyons, 15-Oct-89
;*
;* Optionally does a SET_PREFIX(0,...)
;* Optionally does a MessageCenter(Add,1,...)
;* Does a QUIT
;*
;****************************************************
;Kool start
;
;tool = $e10000
;P16 = $e100a8
;
; phk
; plb
;
;* set prefix 0
; lda PrefixPath
; beq noSetPfx
; jsl p16
; dc i'$0009'
; dc i4'PfxParms'
;noSetPfx anop
;
;* add message 1 to MessageCenter
; lda OpenPath
; and #$00ff
; beq noMessage
;
; pha
; pha ;space for result
; pea 0
; clc
; adc #10
; pha ;size = pathlen + 10
; sta theLength
; pha ;space for user id
; ldx #$0202 ;MMStartUp()
; jsl tool
; pea $C000 ;locked+fixed
; pha
; pha
; ldx #$0902 ;NewHandle
; jsl tool
; pla
; sta theHand
; pla
; sta theHand+2
; bcs noMessage
;
; pea OpenBlock|-16
; pea OpenBlock
; lda theHand+2
; pha
; lda theHand
; pha
; pea 0
; lda theLength
; pha
; ldx #$2802 ;PtrToHand
; jsl tool
;
; pea 1 ;add message
; pea 1 ;type 1
; lda theHand+2
; pha
; lda theHand
; pha
; ldx #$1501 ;MessageCenter act type msg
; jsl tool
;
; lda theHand+2
; pha
; lda theHand
; pha
; ldx #$1002 ;DisposeHandle
; jsl tool
;
;noMessage anop
;
;* quit to the destination S16 (or EXE?) file
; jsl p16
; dc i'$0029'
; dc i4'QuitParms'
; brk 0
;
;QuitParms dc i4'QuitPath'
; dc i'0,0'
;
;PfxParms dc i'0'
; dc i4'PrefixPath'
;
;theLength dc i'0'
;theHand dc i4'0'
;
; dc c'Q'
;QuitPath dc i1'0,0'
; dc c'345678123456781234567812345678'
; dc c'12345678123456781234567812345678'
;
; dc c'P'
;PrefixPath dc i1'0,0'
; dc c'345678123456781234567812345678'
; dc c'12345678123456781234567812345678'
;
; dc c'O'
;OpenBlock dc i4'0'
; dc i'1' ;msg type 1
; dc i'0' ;Open (not Print)
;OpenPath dc i1'0,0'
; dc c'345678123456781234567812345678'
; dc c'12345678123456781234567812345678'
; dc i1'0'
;
; end
;***************************************************