mirror of
https://github.com/mgcaret/davex-mg-utils.git
synced 2024-10-08 06:58:08 +00:00
582 lines
8.5 KiB
ArmAsm
582 lines
8.5 KiB
ArmAsm
;*************************************************
|
|
;*************************************************
|
|
;
|
|
; 'alias' -- external command for Davex
|
|
;
|
|
; alias -- view and modify Davex aliases
|
|
;
|
|
; alias [-s] [-l] [-r] <str1> <str2>
|
|
;
|
|
; alias displays all aliases
|
|
; alias <a> <b> adds alias
|
|
; alias -r <a> removes alias <a>
|
|
; alias -s saves aliases to %aliases
|
|
; alias -l loads aliases from %aliases
|
|
;
|
|
;*************************************************
|
|
;
|
|
; Converted to MPW IIgs 20-Sep-92 DAL
|
|
;
|
|
; Fixed from the 1.30P version on SourceForge 26-Jul-17 MG
|
|
;
|
|
;*************************************************
|
|
|
|
;.segment "CODE_A000"
|
|
|
|
OrgAdr = $A000 ;change as necessary (end below $B000)
|
|
.org OrgAdr ; Makes the listing more readable, though it doesn't really org the code - the linker does that.
|
|
.include "Common/2/Globals2.asm"
|
|
.include "Common/2/Apple.Globals2.asm"
|
|
.include "Common/2/Mli.Globals2.asm"
|
|
.include "Common/Macros.asm"
|
|
;include 'm16.util2'
|
|
low_cr = $0D
|
|
;
|
|
MyVersion = $09
|
|
MinVersion = $12
|
|
MinVerAux = $05
|
|
;*************************************************
|
|
rts
|
|
.byte $ee,$ee
|
|
.byte MyVersion,MinVersion
|
|
.byte %00000000 ;hardware req
|
|
.addr descr
|
|
.addr OrgAdr
|
|
.addr start
|
|
.byte MinVerAux,0,0,0
|
|
; parameters here
|
|
.byte 0,t_string
|
|
.byte 0,t_string
|
|
.byte $80+'r',t_nil
|
|
.byte $80+'s',t_nil
|
|
.byte $80+'l',t_nil
|
|
.byte 0,0
|
|
descr:
|
|
pstr "display or modify command aliases"
|
|
;*************************************************
|
|
; dum xczpage ;32 locations
|
|
AliasPages = xczpage
|
|
AliasP = AliasPages+1
|
|
AliasEnd = AliasP+2
|
|
myP = AliasEnd+2
|
|
str1 = myP+2
|
|
str2 = str1+2
|
|
char = str2+2
|
|
count = char+1 ;.res 2
|
|
; dend
|
|
;
|
|
start = *
|
|
sta str1+1
|
|
sty str1
|
|
|
|
lda #1
|
|
jsr xgetparm_n
|
|
sta str2+1
|
|
sty str2
|
|
|
|
ldx #1
|
|
jsr xshell_info
|
|
sta AliasP+1
|
|
sty AliasP
|
|
sty AliasEnd
|
|
stx AliasPages
|
|
txa
|
|
clc
|
|
adc AliasP+1
|
|
sta AliasEnd+1
|
|
|
|
lda #$80+'l'
|
|
jsr xgetparm_ch
|
|
bcs noLoad
|
|
jsr load_aliases
|
|
noLoad:
|
|
|
|
jsr DoAlias
|
|
|
|
lda #$80+'s'
|
|
jsr xgetparm_ch
|
|
bcs noSave
|
|
jsr save_aliases
|
|
noSave:
|
|
rts
|
|
|
|
;*************************************************
|
|
;
|
|
; handle adding, removing, or showing aliases
|
|
;
|
|
DoAlias:
|
|
lda #$80+'r'
|
|
jsr xgetparm_ch
|
|
bcs noRmv
|
|
jmp remove_alias
|
|
|
|
noRmv:
|
|
ldy #0
|
|
lda (str1),y
|
|
bne doAdd
|
|
lda (str2),y
|
|
bne doAdd
|
|
jsr xgetnump
|
|
cmp #2
|
|
beq show_aliases
|
|
rts
|
|
|
|
doAdd: jmp add_alias
|
|
|
|
;*************************************************
|
|
;
|
|
; Display all the aliases
|
|
;
|
|
show_aliases:
|
|
jsr CalcUsedSize
|
|
jsr xprdec_2
|
|
jsr xmess
|
|
asc_hi " bytes used (of "
|
|
.byte 0
|
|
lda AliasPages
|
|
ldy #0
|
|
jsr xprdec_2
|
|
jsr xmess
|
|
asc_hi ") to store these aliases:"
|
|
.byte low_cr
|
|
asc_hi " "
|
|
.byte 0
|
|
;
|
|
lda AliasP+1
|
|
ldy AliasP
|
|
sta myP+1
|
|
sty myP
|
|
ShowA1: lda (myP),y
|
|
beq ShowedA
|
|
jsr NeatCout
|
|
bcs ShowedA
|
|
iny
|
|
bne ShowA1
|
|
inc myP+1
|
|
bne ShowA1
|
|
ShowedA: rts
|
|
|
|
NeatCout: ora #$80
|
|
cmp #$8d
|
|
beq isCR
|
|
jsr cout
|
|
clc
|
|
rts
|
|
isCR: jsr xcheck_wait
|
|
bcs isCR2
|
|
jsr crout
|
|
lda #$80+' '
|
|
jsr cout
|
|
jsr cout
|
|
clc
|
|
isCR2: rts
|
|
|
|
;*************************************************
|
|
;
|
|
; Save aliases to %aliases file
|
|
;
|
|
save_aliases:
|
|
lda #>AliasName
|
|
ldy #<AliasName
|
|
jsr xbuild_local
|
|
sta aPath+1
|
|
sty aPath
|
|
sta acPath+1
|
|
sty acPath
|
|
|
|
jsr mli
|
|
.byte mli_create
|
|
.addr CreateA
|
|
bcc CreateOK
|
|
cmp #err_dupfil
|
|
bne DiskError
|
|
CreateOK:
|
|
|
|
jsr mli
|
|
.byte mli_open
|
|
.addr OpenA
|
|
bcs DiskError
|
|
|
|
lda aRef
|
|
sta aRef2
|
|
sta aRef3
|
|
sta aRef4
|
|
|
|
jsr CalcUsedSize
|
|
sta WriteA+5
|
|
sty WriteA+4
|
|
jsr mli
|
|
.byte mli_write
|
|
.addr WriteA
|
|
bcs DiskError
|
|
|
|
jsr mli
|
|
.byte mli_getmark
|
|
.addr MarkA
|
|
jsr mli
|
|
.byte mli_seteof
|
|
.addr MarkA
|
|
|
|
jsr mli
|
|
.byte mli_close
|
|
.addr CloseA
|
|
bcs DiskError
|
|
rts
|
|
|
|
;*************************************************
|
|
;
|
|
; Load aliases from %aliases file
|
|
;
|
|
load_aliases:
|
|
lda #>AliasName
|
|
ldy #<AliasName
|
|
jsr xbuild_local
|
|
sta aPath+1
|
|
sty aPath
|
|
|
|
jsr mli
|
|
.byte mli_open
|
|
.addr OpenA
|
|
bcs DiskError
|
|
|
|
lda aRef
|
|
sta aRef2
|
|
sta aRef3
|
|
|
|
lda AliasPages
|
|
ldy #0
|
|
sta ReadA+5
|
|
sty ReadA+4
|
|
jsr mli
|
|
.byte mli_read
|
|
.addr WriteA
|
|
php
|
|
pha
|
|
jsr strip7
|
|
pla
|
|
plp
|
|
bcs DiskError
|
|
|
|
jsr mli
|
|
.byte mli_close
|
|
.addr CloseA
|
|
bcs DiskError
|
|
rts
|
|
|
|
DiskError: jmp xProDOS_err
|
|
|
|
CreateA: .byte 7
|
|
acPath: .addr 0
|
|
.byte $C3 ;access
|
|
.byte tTXT ;filetype
|
|
.addr 0 ;auxtype
|
|
.byte 1 ;storage type
|
|
.addr 0,0 ;create date/time
|
|
|
|
OpenA: .byte 3
|
|
aPath: .addr 0
|
|
.addr filebuff
|
|
aRef: .byte 0
|
|
|
|
ReadA:
|
|
WriteA: .byte 4
|
|
aRef2: .byte 0
|
|
.addr Aliases,$0000,0
|
|
|
|
MarkA: .byte 2
|
|
aRef4: .byte 0
|
|
.byte 0,0,0
|
|
CloseA: .byte 1
|
|
aRef3: .byte 0
|
|
|
|
AliasName:
|
|
.byte 7,"ALIASES"
|
|
|
|
strip7: lda AliasPages
|
|
sta count
|
|
lda AliasP+1
|
|
ldy AliasP
|
|
sta myP+1
|
|
sty myP
|
|
ldy #0
|
|
strip1: lda (myP),y
|
|
and #%01111111
|
|
sta (myP),y
|
|
dey
|
|
bne strip1
|
|
dec count
|
|
bne strip1
|
|
rts
|
|
|
|
;*************************************************
|
|
;
|
|
; remove an alias
|
|
;
|
|
remove_alias:
|
|
ldy #0
|
|
lda (str2),y
|
|
beq rmv2ok
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "*** too many parameters for removing an alias"
|
|
.byte low_cr,0
|
|
jmp xerr
|
|
rmv2ok:
|
|
jsr FindAlias
|
|
bcc rmvFound
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "*** no such alias found"
|
|
.byte low_cr,0
|
|
jmp xerr
|
|
rmvFound: jsr remove_it
|
|
rts
|
|
;
|
|
; Add an alias, possibly replacing an existing one
|
|
;
|
|
add_alias:
|
|
jsr FindAlias
|
|
bcs addMissing
|
|
|
|
lda #1
|
|
jsr xredirect
|
|
jsr xmess
|
|
asc_hi "Okay to replace existing alias "
|
|
.byte $A2,0
|
|
lda str1+1
|
|
ldy str1
|
|
jsr xprint_path
|
|
lda #$A2
|
|
jsr cout
|
|
lda #$80+'n'
|
|
jsr xyesno2
|
|
php
|
|
lda #<-1
|
|
jsr xredirect
|
|
plp
|
|
bne ReplacIt
|
|
rts
|
|
ReplacIt: jsr remove_it
|
|
addMissing:
|
|
jsr CalcUsedSize
|
|
ldy #0
|
|
clc
|
|
lda (str1),y
|
|
adc (str2),y
|
|
adc #3
|
|
adc count
|
|
lda count+1
|
|
adc #0
|
|
cmp AliasPages
|
|
bcc haveRoom
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "*** no room for that alias"
|
|
.byte low_cr,0
|
|
jmp xerr
|
|
|
|
haveRoom:
|
|
ldy #0
|
|
lda (str1),y
|
|
tax
|
|
bne aNameOK
|
|
jsr xmess
|
|
.byte cr
|
|
asc_hi "*** empty string is not a legal alias"
|
|
.byte low_cr,0
|
|
jmp xerr
|
|
aNameOK: iny
|
|
lda (str1),y
|
|
jsr CramChar
|
|
dex
|
|
bne aNameOK
|
|
|
|
lda #$80+' '
|
|
jsr CramChar
|
|
|
|
ldy #0
|
|
lda (str2),y
|
|
tax
|
|
beq aDefDone
|
|
AddDef: iny
|
|
lda (str2),y
|
|
jsr CramChar
|
|
dex
|
|
bne AddDef
|
|
aDefDone: lda #$0d
|
|
jsr CramChar
|
|
lda #0
|
|
jmp CramChar
|
|
|
|
;
|
|
; CramChar -- append A to (myP)
|
|
;
|
|
CramChar: sty cramY
|
|
ldy #0
|
|
sta (myP),y
|
|
ldy cramY
|
|
inc myP
|
|
bne cram_ok
|
|
inc myP+1
|
|
cram_ok: rts
|
|
cramY: .byte 0
|
|
|
|
;
|
|
; FindAlias -- return CLC if found, myP points to it
|
|
;
|
|
FindAlias:
|
|
lda AliasP+1
|
|
ldy AliasP
|
|
sta myP+1
|
|
sty myP
|
|
FindA1:
|
|
jsr compare
|
|
bcc FoundIt
|
|
jsr NextAlias
|
|
ldy #0
|
|
lda (myP),y
|
|
bne FindA1
|
|
sec
|
|
FoundIt: rts
|
|
;
|
|
; compare--check if alias at myP matches str1, returning
|
|
; CLC if they do (and preserving myP)
|
|
;
|
|
compare:
|
|
lda myP+1
|
|
pha
|
|
lda myP
|
|
pha
|
|
|
|
ldy #0
|
|
lda (str1),y
|
|
tax
|
|
beq NoMatch
|
|
iny ;Y=1
|
|
jsr decP
|
|
cmp1:
|
|
lda (str1),y
|
|
jsr xdowncase
|
|
sta char
|
|
jsr FetchChar
|
|
and #%01111111
|
|
beq NoMatch
|
|
jsr xdowncase
|
|
cmp char
|
|
bne NoMatch
|
|
iny
|
|
dex
|
|
bne cmp1
|
|
jsr FetchChar
|
|
cmp #$80+' '
|
|
bne NoMatch
|
|
matches: clc
|
|
compared:
|
|
pla
|
|
sta myP
|
|
pla
|
|
sta myP+1
|
|
rts
|
|
NoMatch:
|
|
sec
|
|
bcs compared
|
|
;
|
|
; increment myP and return the character it points at
|
|
;
|
|
FetchChar: inc myP
|
|
bne P2ok
|
|
inc myP+1
|
|
P2ok = *
|
|
sty ytemp
|
|
ldy #0
|
|
lda (myP),y
|
|
ldy ytemp
|
|
ora #%10000000
|
|
rts
|
|
ytemp: .res 1
|
|
;
|
|
; advance myP to next alias
|
|
;
|
|
NextAlias: jsr FetchChar
|
|
cmp #$8d
|
|
beq FetchChar
|
|
and #%01111111
|
|
bne NextAlias
|
|
rts
|
|
|
|
;*************************************************
|
|
;
|
|
; Remove the alias that myP is pointing at
|
|
;
|
|
remove_it:
|
|
ldy #0
|
|
lda (myP),y
|
|
beq removed
|
|
pha
|
|
jsr KillCharP
|
|
pla
|
|
and #$7f
|
|
cmp #$0d
|
|
bne remove_it
|
|
removed: rts
|
|
;
|
|
; Kill a character at myP, shifting forward all the
|
|
; characters after myP until AliasEnd
|
|
;
|
|
KillCharP:
|
|
lda myP+1
|
|
pha
|
|
lda myP
|
|
pha
|
|
KillLoop:
|
|
ldy #1
|
|
lda (myP),y
|
|
dey
|
|
sta (myP),y
|
|
inc myP
|
|
bne p_ok
|
|
inc myP+1
|
|
p_ok: lda myP+1
|
|
cmp AliasEnd+1
|
|
bne KillLoop
|
|
lda myP
|
|
cmp AliasEnd
|
|
bne KillLoop
|
|
pla
|
|
sta myP
|
|
pla
|
|
sta myP+1
|
|
rts
|
|
;
|
|
; CalcUsedSize--return used bytes in AY,
|
|
; myP pointing at the $00 marker at the end
|
|
; of the alias data
|
|
;
|
|
CalcUsedSize:
|
|
lda #0
|
|
sta count
|
|
sta count+1
|
|
lda AliasP+1
|
|
ldy AliasP
|
|
sta myP+1
|
|
sty myP
|
|
ldy #0
|
|
cus1: lda (myP),y
|
|
beq cus_done
|
|
inc count
|
|
bne count_ok
|
|
inc count+1
|
|
count_ok: inc myP
|
|
bne cus1
|
|
inc myP+1
|
|
bne cus1
|
|
cus_done: lda count+1
|
|
ldy count
|
|
rts
|
|
;
|
|
decP: lda myP
|
|
bne decP1
|
|
dec myP+1
|
|
decP1: dec myP
|
|
rts
|