;==============================================================================
; Registers usage:
; a2 callback
; a3 switchlist (current)
; d3 #opt / misc
;
; Offset of args in the stack :
FRAME_BASE equ 4+4*4 ; 4 registers saved + return address
CMDLINE equ 0+FRAME_BASE
DATA_PTR equ 4+FRAME_BASE
SWITCHLIST equ 8+FRAME_BASE
CALLBACK equ 12+FRAME_BASE
SWITCHFUNC equ 16+FRAME_BASE
;==============================================================================
pdtlib@0002:
;-----------------------------------------------
; Check if an arg remains
;-----------------------------------------------
movem.l d3-d4/a2-a3,-(sp)
movea.l CALLBACK(sp),a2 ; Callback : a2
\Loop: movea.l CMDLINE(sp),a0 ; CMDLINE*
bsr.s pdtlib@000A ; Get next arg
move.l a0,d0
bne.s \StillArgs
moveq.l #PDTLIB_END_OF_PARSING,d0 ; No more arg, quit
\Quit: movem.l (sp)+,d3-d4/a2-a3
rts
;-----------------------------------------------
; Check if it is a long or a short switch
;-----------------------------------------------
\StillArgs:
movea.l SWITCHLIST(sp),a3
moveq.l #-4,d3
cmpi.b #'-',(a0)
bne.s \NoMinus
cmpi.b #'-',1(a0)
beq.s \LongSwitch
bra.s \ShortSwitch
\NoMinus:
cmpi.b #'+',(a0)
beq.s \Plus
;-----------------------------------------------
; Not a switch, inform the program
;-----------------------------------------------
moveq.l #PDTLIB_NOT_A_SWITCH,d0
movea.l DATA_PTR(sp),a0
jsr (a2)
moveq.l #PDTLIB_NOT_A_SWITCH,d1
\TestCallbackReturn:
subq.w #PDTLIB_STOP,d0 ; Continue or stop, depending on
bne.s \Loop ; callback result
move.w d1,d0
bra.s \Quit
\Plus: cmpi.b #'+',1(a0)
beq.s \LongSwitch
;-----------------------------------------------
; Handle short switch
;-----------------------------------------------
\ShortSwitch:
move.b (a0)+,d0 ; d0.b: sign
\ShortSwitchLoop:
addq.w #4,d3
move.b (a3)+,d1
beq.s \NoShortSwitch
cmp.b (a0),d1
beq.s \SwitchFoundNoPop
\NoShortSwitch:
tst.b (a3)+ ; CHECK THAT FOR #0 AT END OF TABLE !
bne.s \NoShortSwitch
tst.b (a3)
bne.s \ShortSwitchLoop
tst.b 1(a3)
bne.s \ShortSwitchLoop
;-----------------------------------------------
; Switch doesn't exist
;-----------------------------------------------
\InvalidSwitch:
moveq.l #PDTLIB_INVALID_SWITCH,d0
movea.l DATA_PTR(sp),a0
jsr (a2)
moveq.l #PDTLIB_INVALID_SWITCH,d1
bra.s \TestCallbackReturn
;-----------------------------------------------
; Handle long switch
;-----------------------------------------------
\LongSwitch:
move.b (a0),d4 ; d4.b: sign
pea 2(a0)
\LongSwitchLoop:
addq.l #1,a3 ; Skip short switch
addq.w #4,d3
move.l (sp),-(sp)
pea (a3)
ROMC strcmp
addq.l #8,sp
tst.w d0
beq.s \SwitchFound
\SkipSwitch:
tst.b (a3)+
bne.s \SkipSwitch
tst.b (a3)
bne.s \LongSwitchLoop
tst.b 1(a3)
beq.s \InvalidSwitch
bra.s \LongSwitchLoop
;-----------------------------------------------
; Switch is found, execute its routine
;-----------------------------------------------
\SwitchFound:
movea.l (sp)+,a0
move.b d4,d0
\SwitchFoundNoPop:
movea.l SWITCHFUNC(sp,d3.w),a1
move.l DATA_PTR(sp),a0
jsr (a1)
moveq.l #PDTLIB_SWITCH_OK,d0
move.l DATA_PTR(sp),a0
jsr (a2)
moveq.l #PDTLIB_SWITCH_OK,d1
bra.s \TestCallbackReturn