gno/bin/gsh/gsh.mac
tribby 05d82736bc Changes for gsh version 2.0d10:
Add check for buffer overflow when globbing, expanding variables, or
inserting aliases (PR#110).  Increase buffer size from 1024 to 4096.

Increase buffer for reading commands from 256 to 1024 bytes in order
to match the maximum length used when reading.
1999-02-08 17:26:51 +00:00

1987 lines
25 KiB
Plaintext

**************************************************************************
* Macros used by gsh, the GNO shell.
*
* Note: text set up for tabs at col 16, 22, 41, 49, 57, 65
* | | | | | |
* ^ ^ ^ ^ ^ ^
**************************************************************************
; ------------------
; GNO/ME subroutine calls
; ------------------
********************
* dup2
********************
MACRO
&lab dup2 &a1
&lab ph2 &a1(2)
ph2 &a1(1)
case on
jsl dup2
case off
MEND
********************
* fork
********************
MACRO
&lab fork &a1
&lab ph4 &a1
case on
jsl fork
case off
MEND
********************
* _getpgrp
********************
MACRO
&lab _getpgrp &a1
&lab ph2 &a1
case on
jsl _getpgrp
case off
MEND
********************
* getpid
********************
MACRO
&lab getpid
&lab case on
jsl getpid
case off
MEND
********************
* getuid
********************
MACRO
&lab getuid
&lab case on
jsl getuid
case off
MEND
********************
* ioctl
********************
MACRO
&lab ioctl &a1
&lab ph4 &a1(3)
ph4 &a1(2)
ph2 &a1(1)
case on
jsl ioctl
case off
MEND
********************
* kernstatus
********************
MACRO
&lab kernStatus &a1
&lab pha
ldx #$603
jsl $E10008
pl2 &a1
MEND
********************
* kill
********************
MACRO
&lab kill &a1
&lab ph2 &a1(2)
ph2 &a1(1)
case on
jsl kill
case off
MEND
********************
* kvm_close
********************
MACRO
&lab kvm_close &a1
&lab ph4 &a1
case on
jsl kvm_close
case off
MEND
********************
* kvm_open
********************
MACRO
&lab kvm_open
&lab case on
jsl kvm_open
case off
MEND
********************
* kvmgetproc
********************
MACRO
&lab kvmgetproc &a1
&lab ph2 &a1(2)
ph4 &a1(1)
case on
jsl kvmgetproc
case off
MEND
********************
* kvmnextproc
********************
MACRO
&lab kvmnextproc &a1
&lab ph4 &a1
case on
jsl kvmnextproc
case off
MEND
********************
* pipe
********************
MACRO
&lab pipe &a1
&lab ph4 &a1
case on
jsl pipe
case off
MEND
********************
* screate
********************
MACRO
&lab screate &a1
&lab ph2 &a1
case on
jsl screate
case off
MEND
********************
* sdelete
********************
MACRO
&lab sdelete &a1
&lab ph2 &a1
case on
jsl sdelete
case off
MEND
********************
* screate
********************
MACRO
&lab screate &a1
&lab ph2 &a1
case on
jsl screate
case off
MEND
********************
* sdelete
********************
MACRO
&lab sdelete &a1
&lab ph2 &a1
case on
jsl sdelete
case off
MEND
********************
* setsystemvector
********************
MACRO
&lab setsystemvector &a1
&lab ph4 &a1
case on
jsl setsystemvector
case off
MEND
********************
* settpgrp
********************
MACRO
&lab settpgrp &a1
&lab ph2 &a1
case on
jsl settpgrp
case off
MEND
********************
* sigblock
********************
MACRO
&lab sigblock &a1
&lab ph4 &a1
case on
jsl sigblock
case off
MEND
********************
* signal
********************
MACRO
&lab signal &a1
&lab ph4 &a1(2)
ph2 &a1(1)
case on
jsl signal
case off
MEND
********************
* sigpause
********************
MACRO
&lab sigpause &a1
&lab ph4 &a1
case on
jsl sigpause
case off
MEND
********************
* sigsetmask
********************
MACRO
&lab sigsetmask &a1
&lab ph4 &a1
case on
jsl sigsetmask
case off
MEND
********************
* ssignal
********************
MACRO
&lab ssignal &a1
&lab ph2 &a1
case on
jsl ssignal
case off
MEND
********************
* swait
********************
MACRO
&lab swait &a1
&lab ph2 &a1
case on
jsl swait
case off
MEND
********************
* tcnewpgrp
********************
MACRO
&lab tcnewpgrp &a1
&lab ph2 &a1
case on
jsl tcnewpgrp
case off
MEND
********************
* tctpgrp
********************
MACRO
&lab tctpgrp &a1
&lab ph2 &a1(2)
ph2 &a1(1)
case on
jsl tctpgrp
case off
MEND
********************
* tgetent
********************
MACRO
&lab tgetent &a1
&lab ph4 &a1(2)
ph4 &a1(1)
case on
jsl tgetent
case off
MEND
********************
* tgetstr
********************
MACRO
&lab tgetstr &a1
&lab ph4 &a1(2)
ph4 &a1(1)
case on
jsl tgetstr
case off
MEND
********************
* tputs
********************
MACRO
&lab tputs &a1
&lab ph4 &a1(3)
ph2 &a1(2)
ph4 &a1(1)
case on
jsl tputs
case off
MEND
********************
* wait
********************
MACRO
&lab wait &a1
&lab ph4 &a1
case on
jsl wait
case off
MEND
; ------------------
; GS/OS calls
; ------------------
********************
* Close
********************
MACRO
&lab Close &a1
&lab gsos $2014,&a1
mend
********************
* Create
********************
MACRO
&lab Create &a1
&lab gsos $2001,&a1
mend
********************
* Destroy
********************
MACRO
&lab Destroy &a1
&lab gsos $2002,&a1
mend
********************
* DInfo
********************
macro
&lab DInfo &a1
&lab gsos $202C,&a1
mend
********************
* ExpandPath
********************
macro
&lab ExpandPath &a1
&lab gsos $200E,&a1
mend
********************
* Flush
********************
macro
&lab Flush &a1
&lab gsos $2015,&a1
mend
********************
* GetBootVol
********************
macro
&lab GetBootVol &a1
&lab gsos $2028,&a1
mend
********************
* GetDirEntry
********************
MACRO
&lab GetDirEntry &a1
&lab gsos $201C,&a1
mend
********************
* GetFileInfo
********************
MACRO
&lab GetFileInfo &a1
&lab gsos $2006,&a1
mend
********************
* GetPrefix
********************
MACRO
&lab GetPrefix &a1
&lab gsos $200A,&a1
mend
********************
* NewLine
********************
MACRO
&lab NewLine &a1
&lab gsos $2011,&a1
mend
********************
* Open
********************
MACRO
&lab Open &a1
&lab gsos $2010,&a1
mend
********************
* Quit
********************
MACRO
&lab Quit &a1
&lab gsos $2029,&a1
mend
********************
* Read
********************
MACRO
&lab Read &a1
&lab gsos $2012,&a1
mend
********************
* SetPrefix
********************
MACRO
&lab SetPrefix &a1
&lab gsos $2009,&a1
mend
********************
* Volume
********************
macro
&lab Volume &a1
&lab gsos $2008,&a1
mend
********************
* Write
********************
MACRO
&lab Write &a1
&lab gsos $2013,&a1
mend
********************
* gsos
********************
MACRO
&lab gsos &a1,&a2
&lab jsl $E100A8
dc i2'&a1'
dc i4'&a2'
mend
; ------------------
; Shell calls
; ------------------
********************
* ErrorGS
********************
macro
&l ErrorGS &p
&l ShellGS $0145,&p
mend
********************
* ExportGS
********************
macro
&l ExportGS &p
&l ShellGS $0156,&p
mend
********************
* InitWildcardGS
********************
macro
&l InitWildcardGS &p
&l ShellGS $0149,&p
mend
********************
* NextWildcardGS
********************
macro
&l NextWildcardGS &p
&l ShellGS $014A,&p
mend
********************
* PopVariablesGS
********************
macro
&l PopVariablesGS &p
&l ShellGS $0157,&p
mend
********************
* PushVariablesGS
********************
macro
&l PushVariablesGS &p
&l ShellGS $0158,&p
mend
********************
* ReadIndexedGS
********************
macro
&l ReadIndexedGS &p
&l ShellGS $0148,&p
mend
********************
* ReadVariableGS
********************
macro
&l ReadVariableGS &p
&l ShellGS $014B,&p
mend
********************
* RedirectGS
********************
macro
&l RedirectGS &p
&l ShellGS $0150,&p
mend
********************
* SetLInfoGS
********************
macro
&l SetLInfoGS &p
&l ShellGS $0142,&p
mend
********************
* SetGS
********************
macro
&l SetGS &p
&l ShellGS $0146,&p
mend
********************
* UnsetVariableGS
********************
macro
&l UnsetVariableGS &p
&l ShellGS $0155,&p
mend
***********************************************
* ShellGS: Jump into OS for a shell call
***********************************************
MACRO
&lab ShellGS &a1,&a2
&lab jsl $E100A8
dc i2'&a1'
dc i4'&a2'
mend
; ------------------
; Debugging
; ------------------
********************
* setdebug
********************
MACRO
&lab setdebug &a1
&lab ph2 &a1
case on
jsl setdebug
case off
MEND
********************
* name
********************
MACRO
&lab name
&lab anop
aif DebugSymbols=0,.pastName
brl pastName&SYSCNT
dc i'$7771'
dc i1'L:&lab',c'&lab'
pastName&SYSCNT anop
.pastName
MEND
; ------------------
; Data Structures
; ------------------
*****************************
* GSStr: GS/OS output string
*****************************
MACRO
&lab GSStr &string
&lab dc i2'L:&string'
dc c"&string"
mend
; ------------------
; Branch
; ------------------
********************
* if2
********************
MACRO
&lab if2 &var,&rel,&val,&label
&lab ago .skip
ble
bgt
.skip
lclc &char1
lclc &char2
&char1 amid &var,1,1
&char2 amid &var,2,1
aif "&char1"="@",.index
lda &var
.cmp
cmp &val
ago .branch
.index
aif "&char2"="x",.x1
aif "&char2"="X",.x1
aif "&char2"="y",.y1
aif "&char2"="Y",.y1
ago ^cmp
.x1
cpx &val
ago .branch
.y1
cpy &val
.branch
&char1 amid &rel,1,1
aif "&char1"="@",.done
b&rel &label
.done
mend
********************
* bgt
********************
MACRO
&lab bgt &loc
&lab beq *+4
bcs &loc
mend
********************
* ble
********************
MACRO
&lab ble &loc
&lab bcc &loc
beq &loc
mend
********************
* jcc
********************
MACRO
&lab jcc &loc
&lab bcs *+5
jmp &loc
mend
********************
* jcs
********************
macro
&lab jcs &loc
&lab bcc *+5
jmp &loc
mend
********************
* jeq
********************
MACRO
&lab jeq &loc
&lab bne *+5
jmp &loc
mend
********************
* jge
********************
MACRO
&lab jge &loc
&lab bcc *+5
jmp &loc
mend
********************
* jmi
********************
macro
&lab jmi &loc
&lab bpl *+5
jmp &loc
mend
********************
* jne
********************
MACRO
&lab jne &loc
&lab beq *+5
jmp &loc
mend
; ------------------
; Enter and exit subroutine
; ------------------
********************
* subroutine
********************
MACRO
&lab subroutine &parms,&work
&lab anop
aif c:&work,.a
lclc &work
&work setc 0
.a
gbla &totallen
gbla &worklen
&worklen seta &work
&totallen seta 0
aif c:&parms=0,.e
lclc &len
lclc &p
lcla &i
&i seta c:&parms
.b
&p setc &parms(&i)
&len amid &p,2,1
aif "&len"=":",.c
&len amid &p,1,2
&p amid &p,4,l:&p-3
ago .d
.c
&len amid &p,1,1
&p amid &p,3,l:&p-2
.d
&p equ &totallen+3+&work
&totallen seta &totallen+&len
&i seta &i-1
aif &i,^b
.e
tsc
sec
sbc #&work
tcs
inc a
phd
tcd
phb
phk
plb
mend
********************
* return
********************
MACRO
&lab return &r
&lab anop
lclc &len
aif c:&r,.a
lclc &r
&r setc 0
&len setc 0
ago .h
.a
&len amid &r,2,1
aif "&len"=":",.b
&len amid &r,1,2
&r amid &r,4,l:&r-3
ago .c
.b
&len amid &r,1,1
&r amid &r,3,l:&r-2
.c
aif &len<>2,.d
ldy &r
ago .h
.d
aif &len<>4,.e
ldx &r+2
ldy &r
ago .h
.e
aif &len<>10,.g
ldy #&r
ldx #^&r
ago .h
.g
mnote 'Not a valid return length',16
mexit
.h
aif &totallen=0,.i
lda &worklen+1
sta &worklen+&totallen+1
lda &worklen
sta &worklen+&totallen
.i
plb
pld
tsc
clc
adc #&worklen+&totallen
tcs
aif &len=0,.j
tya
.j
rtl
mend
; ------------------
; Change size of memory or index register access
; ------------------
********************
* long
********************
MACRO
&lab long &stat
&lab anop
lcla &t
lcla &len
lclc &ch
&t seta 0
&len seta l:&stat
.a
aif &len=0,.b
&ch amid &stat,&len,1
aif ("&ch"="x").or.("&ch"="y").or.("&ch"="i"),.i
aif ("&ch"="a").or.("&ch"="m"),.m
.c
&len seta &len-1
ago ^a
.i
longi on
&t seta &t+16
ago ^c
.m
longa on
&t seta &t+32
ago ^c
.b
aif &t=0,.d
rep #&t
.d
mend
********************
* short
********************
MACRO
&lab short &stat
&lab anop
lcla &t
lcla &len
lclc &ch
&t seta 0
&len seta l:&stat
.a
aif &len=0,.b
&ch amid &stat,&len,1
aif ("&ch"="x").or.("&ch"="y").or.("&ch"="i"),.i
aif ("&ch"="a").or.("&ch"="m"),.m
.c
&len seta &len-1
ago ^a
.i
longi off
&t seta &t+16
ago ^c
.m
longa off
&t seta &t+32
ago ^c
.b
aif &t=0,.d
sep #&t
.d
mend
; ------------------
; Math toolbox calls
; ------------------
********************
* Dec2Int
********************
MACRO
&lab Dec2Int &a1,&a2
&lab pha
ph4 &a1(1)
ph2 &a1(2)
ph2 &a1(3)
Tool $280b
pl2 &a2
mend
********************
* Int2Dec
********************
MACRO
&lab Int2Dec &a1
&lab ph2 &a1(1)
ph4 &a1(2)
ph2 &a1(3)
ph2 &a1(4)
Tool $260b
mend
********************
* Int2Hex
********************
macro
&lab Int2Hex &a1
&lab ph2 &a1(1)
ph4 &a1(2)
ph2 &a1(3)
Tool $220b
mend
********************
* Long2Dec
********************
macro
&lab Long2Dec &a1
&lab ph4 &a1(1)
ph4 &a1(2)
ph2 &a1(3)
ph2 &a1(4)
Tool $270b
mend
********************
* LongDivide
********************
macro
&lab LongDivide &a1,&a2
&lab pha
pha
pha
pha
ph4 &a1(1)
ph4 &a1(2)
Tool $0d0b
pl4 &a2(1)
pl4 &a2(2)
mend
********************
* LongMul
********************
macro
&lab LongMul &a1,&a2
&lab pha
pha
pha
pha
ph4 &a1(1)
ph4 &a1(2)
Tool $0c0b
pl4 &a2(1)
pl4 &a2(2)
mend
********************
* UDivide
********************
MACRO
&lab UDivide &a1,&a2
&lab pha
pha
ph2 &a1(1)
ph2 &a1(2)
Tool $0b0b
pl2 &a2(1)
pl2 &a2(2)
mend
; ------------------
; Memory manager toolbox calls
; ------------------
********************
* DisposeHandle
********************
macro
&lab DisposeHandle &a1
&lab ph4 &a1
tool $1002
mend
********************
* FindHandle
********************
macro
&lab FindHandle &a1,&a2
&lab pha
pha
ph4 &a1
tool $1a02
pl4 &a2
mend
********************
* NewHandle
********************
macro
&lab NewHandle &a1,&a2
&lab pha
pha
ph4 &a1(1)
ph2 &a1(2)
ph2 &a1(3)
ph4 &a1(4)
tool $0902
pl4 &a2
mend
********************
* PtrToHand
********************
macro
&lab PtrToHand &a1
&lab ph4 &a1(1)
ph4 &a1(2)
ph4 &a1(3)
tool $2802
mend
; ------------------
; Text toolbox calls
; ------------------
********************
* ErrWriteCString
********************
macro
&lab ErrWriteCString &a1
&lab ph4 &a1
Tool $210c
mend
********************
* ErrWriteLine
********************
macro
&lab ErrWriteLine &a1
&lab ph4 &a1
Tool $1b0c
mend
********************
* ReadLine
********************
macro
&lab ReadLine &a1,&a2
&lab pha
ph4 &a1(1)
ph2 &a1(2)
ph2 &a1(3)
ph2 &a1(4)
Tool $240c
pl2 &a2
mend
********************
* SetInGlobals
********************
MACRO
&lab SetInGlobals &a1
&lab ph2 &a1(1)
ph2 &a1(2)
Tool $090c
mend
********************
* SetInputDevice
********************
macro
&lab SetInputDevice &a1
&lab ph2 &a1(1)
ph4 &a1(2)
Tool $0f0c
mend
********************
* SetOutputDevice
********************
macro
&lab SetOutputDevice &a1
&lab ph2 &a1(1)
ph4 &a1(2)
Tool $100c
mend
********************
* WriteChar
********************
MACRO
&lab WriteChar &a1
&lab ph2 &a1
Tool $180c
mend
********************
* WriteCString
********************
MACRO
&lab WriteCString &a1
&lab ph4 &a1
Tool $200c
mend
********************
* WriteString
********************
MACRO
&lab WriteString &a1
&lab ph4 &a1
Tool $1c0c
mend
; ------------------
; Miscellaneous toolbox calls
; ------------------
********************
* ReadTimeHex
********************
MACRO
&lab ReadTimeHex &a1
&lab pha
pha
pha
pha
tool $0d03
pl2 &a1(1)
pl2 &a1(2)
pl2 &a1(3)
pl2 &a1(4)
mend
********************
* tool
********************
MACRO
&lab tool &a1
&lab ldx #&a1
jsl $e10000
mend
; ------------------
; Math & bit manipulation instructions
; ------------------
********************
* add2
********************
MACRO
&lab add2 &arg1,&arg2,&dest
lclc &char
&lab clc
&char amid &arg1,1,1
aif "&char"="@",.at1
lda &arg1
ago .add
.at1
&char amid &arg1,2,1
aif "&char"="x",.x1
aif "&char"="X",.x1
aif "&char"="y",.y1
aif "&char"="Y",.y1
ago .add
.x1
txa
ago .add
.y1
tya
.add
adc &arg2
&char amid &dest,1,1
aif "&char"="@",.at2
sta &dest
ago .b
.at2
&char amid &dest,2,1
aif "&char"="x",.x2
aif "&char"="X",.x2
aif "&char"="y",.y2
aif "&char"="Y",.y2
ago .b
.x2
tax
ago .b
.y2
tay
.b
mend
********************
* add4
********************
MACRO
&lab add4 &arg1,&arg2,&dest
&lab anop
lclc &ch
&ch amid &arg2,1,1
clc
lda &arg1
adc &arg2
sta &dest
lda &arg1+2
aif "&ch"="#",.a
adc &arg2+2
ago .b
.a
adc &arg2|-16
.b
sta &dest+2
mend
********************
* and2
********************
MACRO
&lab and2 &arg1,&arg2,&dest
&lab anop
lclc &char
&char amid &arg1,1,1
aif "&char"="@",.at1
lda &arg1
ago .add
.at1
&char amid &arg1,2,1
aif "&char"="x",.x1
aif "&char"="X",.x1
aif "&char"="y",.y1
aif "&char"="Y",.y1
ago .add
.x1
txa
ago .add
.y1
tya
.add
and &arg2
&char amid &dest,1,1
aif "&char"="@",.at2
sta &dest
ago .b
.at2
&char amid &dest,2,1
aif "&char"="x",.x2
aif "&char"="X",.x2
aif "&char"="y",.y2
aif "&char"="Y",.y2
ago .b
.x2
tax
ago .b
.y2
tay
.b
mend
********************
* asl2
********************
MACRO
&lab asl2 &a
&lab asl &a
asl &a
mend
********************
* asl3
********************
MACRO
&lab asl3 &a
&lab asl &a
asl &a
asl &a
mend
********************
* asl4
********************
MACRO
&lab asl4 &a
&lab asl &a
asl &a
asl &a
asl &a
mend
********************
* dec2
********************
MACRO
&lab dec2 &a
&lab dec &a
dec &a
mend
********************
* dey2
********************
MACRO
&lab dey2
&lab dey
dey
mend
********************
* dey4
********************
MACRO
&lab dey4
&lab dey
dey
dey
dey
MEND
********************
* eor2
********************
MACRO
&lab eor2 &arg1,&arg2,&dest
&lab anop
lclc &char
&char amid &arg1,1,1
aif "&char"="@",.at1
lda &arg1
ago .add
.at1
&char amid &arg1,2,1
aif "&char"="x",.x1
aif "&char"="X",.x1
aif "&char"="y",.y1
aif "&char"="Y",.y1
ago .add
.x1
txa
ago .add
.y1
tya
.add
eor &arg2
&char amid &dest,1,1
aif "&char"="@",.at2
sta &dest
ago .b
.at2
&char amid &dest,2,1
aif "&char"="x",.x2
aif "&char"="X",.x2
aif "&char"="y",.y2
aif "&char"="Y",.y2
ago .b
.x2
tax
ago .b
.y2
tay
.b
mend
********************
* inc2
********************
macro
&lab inc2 &a
&lab inc &a
inc &a
mend
********************
* inx2
********************
MACRO
&lab inx2
&lab inx
inx
mend
********************
* inx4
********************
macro
&lab inx4
&lab inx
inx
inx
inx
mend
********************
* iny2
********************
MACRO
&lab iny2
&lab iny
iny
mend
********************
* iny4
********************
MACRO
&lab iny4
&lab iny
iny
iny
iny
mend
********************
* LD2
********************
MACRO
&lab LD2 &val,&adr
&lab lcla &count
lda #&val
&count seta 1
.loop
sta &adr(&count)
&count seta &count+1
aif &count>c:&adr,.done
ago ^loop
.done
mend
********************
* LD4
********************
MACRO
&lab LD4 &val,&adr
&lab lcla &count
lda #<&val
&count seta 1
.loop1
sta &adr(&count)
&count seta &count+1
aif &count>c:&adr,.part2
ago ^loop1
.part2
lda #+(&val)|-16
&count seta 1
.loop2
sta &adr(&count)+2
&count seta &count+1
aif &count>c:&adr,.done
ago ^loop2
.done
mend
********************
* lsr2
********************
MACRO
&lab lsr2 &a
&lab lsr &a
lsr &a
mend
********************
* MV2
********************
MACRO
&lab MV2 &src,&adr
&lab lcla &count
lda &src
&count seta 1
.loop
sta &adr(&count)
&count seta &count+1
aif &count>c:&adr,.done
ago ^loop
.done
mend
********************
* MV4
********************
macro
&lab MV4 &src,&adr
&lab lcla &count
lda &src
&count seta 1
.loop1
sta &adr(&count)
&count seta &count+1
aif &count>c:&adr,.part2
ago ^loop1
.part2
lda &src+2
&count seta 1
.loop2
sta &adr(&count)+2
&count seta &count+1
aif &count>c:&adr,.done
ago ^loop2
.done
mend
********************
* ora2
********************
MACRO
&lab ora2 &arg1,&arg2,&dest
&lab anop
lclc &char
&char amid &arg1,1,1
aif "&char"="@",.at1
lda &arg1
ago .add
.at1
&char amid &arg1,2,1
aif "&char"="x",.x1
aif "&char"="X",.x1
aif "&char"="y",.y1
aif "&char"="Y",.y1
ago .add
.x1
txa
ago .add
.y1
tya
.add
ora &arg2
&char amid &dest,1,1
aif "&char"="@",.at2
sta &dest
ago .b
.at2
&char amid &dest,2,1
aif "&char"="x",.x2
aif "&char"="X",.x2
aif "&char"="y",.y2
aif "&char"="Y",.y2
ago .b
.x2
tax
ago .b
.y2
tay
.b
mend
********************
* ph2
********************
MACRO
&lab ph2 &parm
lclc &char
&lab anop
aif c:&parm=0,.done
&char amid &parm,1,1
aif "&char"="#",.immediate
aif "&char"="@",.at
aif s:longa=1,.chk
rep #%00100000
.chk
aif "&char"<>"{",.absolute
&char amid &parm,l:&parm,1
aif "&char"<>"}",.error
&parm amid &parm,2,l:&parm-2
lda (&parm)
pha
ago .shorten
.absolute
lda &parm
pha
ago .shorten
.immediate
&parm amid &parm,2,l:&parm-1
pea &parm
ago .done
.at
&char amid &parm,2,1
ph&char
.shorten
aif s:longa=1,.done
sep #%00100000
.done
mexit
.error
mnote "Missing closing '}'",16
mend
********************
* ph4
********************
MACRO
&lab ph4 &parm
lclc &char
lclc &char1
lclc &char2
&lab anop
&char amid &parm,1,1
aif "&char"="#",.immediate
aif "&char"="@",.at
aif s:longa=1,.chk1
rep #%00100000
.chk1
aif "&char"<>"{",.chk2
&char amid &parm,l:&parm,1
aif "&char"<>"}",.error
&parm amid &parm,2,l:&parm-2
ldy #2
lda (&parm),y
pha
lda (&parm)
pha
ago .shorten
.chk2
aif "&char"<>"[",.absolute
ldy #2
lda &parm,y
pha
lda &parm
pha
ago .shorten
.absolute
lda &parm+2
pha
lda &parm
pha
ago .shorten
.at
&char1 amid &parm,2,1
&char2 setc &char1
ph&char1
aif l:&parm<3,.chk2a
&char2 amid &parm,3,1
.chk2a
ph&char2
ago .shorten
.immediate
&parm amid &parm,2,l:&parm-1
pea +(&parm)|-16
pea &parm
ago .done
.shorten
aif s:longa=1,.done
sep #%00100000
.done
mexit
.error
mnote "Missing closing '}'",16
mend
********************
* pl2
********************
MACRO
&lab pl2 &parm
lclc &char
&lab anop
aif s:longa=1,.start
rep #%00100000
.start
&char amid &parm,1,1
aif "&char"="@",.at
aif "&char"<>"{",.absolute
&char amid &parm,l:&parm,1
aif "&char"<>"}",.error
&parm amid &parm,2,l:&parm-2
pla
sta (&parm)
ago .shorten
.absolute
pla
sta &parm
ago .shorten
.at
&char amid &parm,2,1
pl&char
.shorten
aif s:longa=1,.done
sep #%00100000
.done
mexit
.error
mnote "Missing Closing '}'",16
mend
********************
* pl4
********************
macro
&lab pl4 &parm
lclc &char
lclc &char1
lclc &char2
&lab anop
aif s:longa=1,.start
rep #%00100000
.start
&char amid &parm,1,1
aif "&char"<>"{",.chk
&char amid &parm,l:&parm,1
aif "&char"<>"}",.error
&parm amid &parm,2,l:&parm-2
pla
sta (&parm)
ldy #2
pla
sta (&parm),y
ago .shorten
.chk
aif "&char"<>"[",.chk2
pla
sta &parm
ldy #2
pla
sta &parm,y
ago .shorten
.chk2
aif "&char"<>"@",.absolute
&char1 amid &parm,2,1
&char2 setc &char1
pl&char1
aif l:&parm<3,.chk2a
&char2 amid &parm,3,1
.chk2a
pl&char2
ago .shorten
.absolute
pla
sta &parm
pla
sta &parm+2
.shorten
aif s:longa=1,.done
sep #%00100000
.done
mexit
.error
mnote "Missing closing '}'",16
mend
********************
* sub2
********************
MACRO
&lab sub2 &arg1,&arg2,&dest
lclc &char
&lab sec
&char amid &arg1,1,1
aif "&char"="@",.at1
lda &arg1
ago .sub
.at1
&char amid &arg1,2,1
aif "&char"="x",.x1
aif "&char"="X",.x1
aif "&char"="y",.y1
aif "&char"="Y",.y1
ago .sub
.x1
txa
ago .sub
.y1
tya
.sub
sbc &arg2
&char amid &dest,1,1
aif "&char"="@",.at2
sta &dest
ago .b
.at2
&char amid &dest,2,1
aif "&char"="x",.x2
aif "&char"="X",.x2
aif "&char"="y",.y2
aif "&char"="Y",.y2
ago .b
.x2
tax
ago .b
.y2
tay
.b
mend
********************
* sub4
********************
macro
&lab sub4 &arg1,&arg2,&dest
&lab anop
lclc &ch
&ch amid &arg2,1,1
sec
lda &arg1
sbc &arg2
sta &dest
lda &arg1+2
aif "&ch"="#",.a
sbc &arg2+2
ago .b
.a
sbc &arg2|-16
.b
sta &dest+2
mend
; ------------------
; New, experimental macros
; ------------------
********************
* breakpoint
********************
MACRO
&lab breakpoint &flag
&lab lda check4debug
and #$80
beq *+4
brk &flag
MEND
*****************************************
* incad: Increment a 4-byte address
*****************************************
MACRO
&lab incad &ptr
aif "&ptr"="@xa",.at1
&lab inc &ptr Increment low-order word.
bne skip&syscnt If rollover,
inc &ptr+2 increment high-order word.
ago .done
.at1 Same for address in X/A registers.
&lab inc a
bne skip&syscnt
inx
.done
skip&syscnt anop
MEND
********************************************************************
* ~NEW: call ~NEW or DB~NEW, depending upon whether debug is wanted
********************************************************************
MACRO
&lab ~NEW
&lab anop
using memglobal
lock memmutex
* jsl DB~NEW ; DEBUG VERSION
jsl ~NEW ; NON-DEBUG VERSION
unlock memmutex
MEND
***************************************************************************
* ~DISPOSE: call ~DISPOSE or DB~DISPOSE, depending upon if debug is wanted
***************************************************************************
MACRO
&lab ~DISPOSE
&lab anop
using memglobal
lock memmutex
* jsl DB~DISPOSE ; DEBUG VERSION
jsl ~DISPOSE ; NON-DEBUG VERSION
unlock memmutex
MEND
; ------------------
; Mutual Exclusion
; ------------------
********************
* key
********************
MACRO
&lab key
&lab dc i2'0'
MEND
********************
* lock
********************
MACRO
&lab lock &key
&lab anop
* jsr DB~CHKBNK ; TEMPORARY DEBUG CODE
lda #1
tsb &key
beq *+6
cop $7F
bra *-7
MEND
********************
* unlock
********************
MACRO
&lab unlock &key
&lab anop
* jsr DB~CHKBNK ; TEMPORARY DEBUG CODE
stz &key
MEND