gno/bin/gsh/gsh.mac

1987 lines
25 KiB
Plaintext
Raw Normal View History

**************************************************************************
* 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
********************
Changes for gsh version 2.0d5: Add quotes around null parameters from the command line so they will be parsed properly (resolves PR#84). Output piped to an unfound command caused gsh to terminate, due to an interface change to the GNO 2.0.6 version of getpgrp(2): it now returns the process group of the caller. To get the process group number for the pid passed as a parameter pid, the call has to be made to _getpgrp(2). In addition to fixing invoke.asm, updates were also made in jobs.asm. When directory stack is full, pushd, reports a new error message: 'pushd: Directory stack full'. (Previously, 50 pushds would cause a crash.) When parameter passed to "pushd +n" is <= 0, report a new error message: 'pushd: Invalid number'. (Previously, tried to chdir to the parameter.) When a command appends to stderr (e.g., echo test >>&/tmp/err), stdin was closed, due to errappend being defined as pipefds+2 rather than pipefds+4 in cmd.asm. When there was an error reading stdin, gsh went into an infinite loop of beeping and requesting more input. Changed getchar (in stdio.asm) and GetCmdLine (in edit.asm) to report the error and terminate. Code in cmd.asm set and reset handler for signal SIGSTOP (17). This makes no sense, since there cannot be a handler for SIGSTOP. This was changed to set and reset signal SIGTSTP (18) since that handler is used by gsh. The error message "specify a command before redirecting" was never caught by the invoke() subroutine because the next higher routine, command(), checked for argv==0 before calling invoke(). The error message was moved into command().
1998-10-26 17:04:51 +00:00
* _getpgrp
********************
MACRO
Changes for gsh version 2.0d5: Add quotes around null parameters from the command line so they will be parsed properly (resolves PR#84). Output piped to an unfound command caused gsh to terminate, due to an interface change to the GNO 2.0.6 version of getpgrp(2): it now returns the process group of the caller. To get the process group number for the pid passed as a parameter pid, the call has to be made to _getpgrp(2). In addition to fixing invoke.asm, updates were also made in jobs.asm. When directory stack is full, pushd, reports a new error message: 'pushd: Directory stack full'. (Previously, 50 pushds would cause a crash.) When parameter passed to "pushd +n" is <= 0, report a new error message: 'pushd: Invalid number'. (Previously, tried to chdir to the parameter.) When a command appends to stderr (e.g., echo test >>&/tmp/err), stdin was closed, due to errappend being defined as pipefds+2 rather than pipefds+4 in cmd.asm. When there was an error reading stdin, gsh went into an infinite loop of beeping and requesting more input. Changed getchar (in stdio.asm) and GetCmdLine (in edit.asm) to report the error and terminate. Code in cmd.asm set and reset handler for signal SIGSTOP (17). This makes no sense, since there cannot be a handler for SIGSTOP. This was changed to set and reset signal SIGTSTP (18) since that handler is used by gsh. The error message "specify a command before redirecting" was never caught by the invoke() subroutine because the next higher routine, command(), checked for argv==0 before calling invoke(). The error message was moved into command().
1998-10-26 17:04:51 +00:00
&lab _getpgrp &a1
&lab ph2 &a1
case on
Changes for gsh version 2.0d5: Add quotes around null parameters from the command line so they will be parsed properly (resolves PR#84). Output piped to an unfound command caused gsh to terminate, due to an interface change to the GNO 2.0.6 version of getpgrp(2): it now returns the process group of the caller. To get the process group number for the pid passed as a parameter pid, the call has to be made to _getpgrp(2). In addition to fixing invoke.asm, updates were also made in jobs.asm. When directory stack is full, pushd, reports a new error message: 'pushd: Directory stack full'. (Previously, 50 pushds would cause a crash.) When parameter passed to "pushd +n" is <= 0, report a new error message: 'pushd: Invalid number'. (Previously, tried to chdir to the parameter.) When a command appends to stderr (e.g., echo test >>&/tmp/err), stdin was closed, due to errappend being defined as pipefds+2 rather than pipefds+4 in cmd.asm. When there was an error reading stdin, gsh went into an infinite loop of beeping and requesting more input. Changed getchar (in stdio.asm) and GetCmdLine (in edit.asm) to report the error and terminate. Code in cmd.asm set and reset handler for signal SIGSTOP (17). This makes no sense, since there cannot be a handler for SIGSTOP. This was changed to set and reset signal SIGTSTP (18) since that handler is used by gsh. The error message "specify a command before redirecting" was never caught by the invoke() subroutine because the next higher routine, command(), checked for argv==0 before calling invoke(). The error message was moved into command().
1998-10-26 17:04:51 +00:00
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