; s.UpCalls
;

                GET             <Asm$LibRoot>regs
                GET             <Asm$LibRoot>swis
                GET             <Asm$LibRoot>vectors
                GET             <Asm$LibRoot>general
                GET             <Asm$LibRoot>services
                GET             <Asm$LibRoot>Date

                ^               &CF000
Tracker_Open    #               1
Tracker_Close   #               1
Tracker_SetPos  #               1
Tracker_WriteS  #               1
Tracker_CLS     #               1

ws              RN              12

                ^               0, ws

Byte            *               1
Word            *               4

TraceHandle     #               Word
Buffer          #               256

WSSize          *               :INDEX: {VAR}

; Start of code

ModuleBase      &               0
                &               Initialise      - ModuleBase
                &               Finalise        - ModuleBase
                &               Service         - ModuleBase
                &               Title           - ModuleBase
                &               Help            - ModuleBase
                &               0
                &               0
                &               0
                &               0
                &               0

Title           =               "UpCalls", 0

Help            =               "UpCall Tracer", 9, "1.00", " ($MakeDate)", 0
                ALIGN

Initialise      STMFD           sp!, {lr}
                LDR             r2, [ws]
                TEQ             r2, #0
                BNE             Init1
                MOV             r0, #6
                LDR             r3, = WSSize
                SWIX            OS_Module
                LDMVSFD         sp!, {pc}
                STR             r2, [ws]
Init1           MOV             ws, r2
                MOV             r0, #0
                STR             r0, TraceHandle
                ADR             r0, WTitle
                MOV             r1, #80
                MOV             r2, #50
                MOV             r3, #1
                SWIX            Tracker_Open
                STRVC           r0, TraceHandle
                BL              Claim
                LDMFD           sp!, {pc}

WTitle          =               "File UpCalls", 0
                ALIGN

Finalise        TEQ             r10, #0
                MOVEQS          pc, lr

                STMFD           sp!, {lr}
                LDR             ws, [ws]
                BL              Release
                LDR             r0, TraceHandle
                TEQ             r0, #0
                SWIX            Tracker_Close, NE
                LDMFD           sp!, {pc}

Service         TEQ             r1, #Service_Reset
                MOVNES          pc, lr

Claim           STMFD           sp!, {lr}
                MOV             r0, #UpCallV
                ADR             r1, DecodeUpCall
                MOV             r2, ws
                SWIX            OS_Claim
                LDMFD           sp!, {pc}^

Release         STMFD           sp!, {lr}
                MOV             r0, #UpCallV
                ADR             r1, DecodeUpCall
                MOV             r2, ws
                SWIX            OS_Release
                LDMFD           sp!, {pc}^

; printf type of function, works on string addressed by lr.
; % introduces an argument, with the following syntax
;
;   %<format character><register number>
;

OutF            STMFD           sp!, {r0-r9, lr}
                BIC             r0, lr, #&FC000003
                ADR             r1, Buffer
OutF1           LDRB            r2, [r0], #1
                TEQ             r2, #"%"
                BNE             OutF5
                LDRB            r2, [r0], #1
                TEQ             r2, #"%"
                BEQ             OutF5
                LDRB            r3, [r0], #1
                SUB             r3, r3, #"0"
                LDR             r3, [sp, r3, LSL #2]
                TEQ             r2, #"s"
                BNE             OutF3

                TEQ             r3, #0
                ADREQ           r3, NullString

OutF2           LDRB            r2, [r3], #1
                CMP             r2, #" "
                STRHSB          r2, [r1], #1
                BHS             OutF2
                B               OutF1

OutF3           TEQ             r2, #"x"
                BNE             OutF1
                MOV             r2, #8
OutF4           MOV             r3, r3, ROR #32-4
                AND             lr, r3, #15
                CMP             lr, #10
                ADDCC           lr, lr, #"0"
                ADDCS           lr, lr, #"a"-10
                STRB            lr, [r1], #1
                SUBS            r2, r2, #1
                BNE             OutF4
                B               OutF1

OutF5           STRB            r2, [r1], #1
                TEQ             r2, #0
                BNE             OutF1
                ADD             lr, r0, #3
                BIC             lr, lr, #3
                STR             lr, [sp, #Word * 10]

                LDR             r0, TraceHandle
                ADR             r1, Buffer
                SWIX            Tracker_WriteS

                LDMFD           sp!, {r0-r9, pc}

NullString      =               "<null>", 0

Up0000          BL              OutF
                =               "Save %s1 (%s6)", 10
                =               "   %x2 %x3 %x4 %x5", 10, 0
                LDMFD           sp!, {pc}^

Up0001          BL              OutF
                =               "Write catalogue info for %s1 (%s6)", 10
                =               "   %x2 %x3 %x5", 10, 0
                LDMFD           sp!, {pc}^

Up0002          BL              OutF
                =               "Write load address for %s1 (%s6)", 10
                =               "   %x5", 10, 0
                LDMFD           sp!, {pc}^

Up0003          BL              OutF
                =               "Write exec address for %s1 (%s6)", 10
                =               "   %x3", 10, 0
                LDMFD           sp!, {pc}^

Up0004          BL              OutF
                =               "Write attributes for %s1 (%s6)", 10
                =               "   %x5", 10, 0
                LDMFD           sp!, {pc}^

Up0006          BL              OutF
                =               "Delete %s1 (%s6)", 10, 0
                LDMFD           sp!, {pc}^

Up0007          BL              OutF
                =               "Create %s1 (%s6)", 10
                =               "   %x2 %x3 %x4 %x5", 10, 0
                LDMFD           sp!, {pc}^

Up0008          BL              OutF
                =               "Create directory %s1 (%s6)", 10
                =               "   %x2 %x3", 10, 0
                LDMFD           sp!, {pc}^

Up0101          BL              OutF
                =               "Creating and opening %s1 (%s6)", 10
                =               "   %x2", 10, 0
                LDMFD           sp!, {pc}^

Up0103          BL              OutF
                =               "Closing %x1", 10, 0
                LDMFD           sp!, {pc}^

Up0208          BL              OutF
                =               "Renaming %s1 (%s6) as %s2 (%s7)", 10
                =               "   %x3", 10, 0
                LDMFD           sp!, {pc}^

Up0209          BL              OutF
                =               "Access %s1 %s2", 10, 0
                LDMFD           sp!, {pc}^

Upxxxx          BL              OutF
                =               "Unknown UpCall %x9", 10
                =               "   %x1 %x2 %x3 %x4", 10
                =               "   %x5 %x6 %x7 %x8", 10, 0

                MACRO
$label          UPCALL          $number
$label          &               &$number
                B               Up$number
                MEND

UpCalls         UPCALL          0000
                UPCALL          0001
                UPCALL          0002
                UPCALL          0003
                UPCALL          0004
                UPCALL          0006
                UPCALL          0007
                UPCALL          0008
                UPCALL          0101
                UPCALL          0103
                UPCALL          0208
                UPCALL          0209
                &               -1

DecodeUpCall    TEQ             r0, #3
                MOVNES          pc, lr

                STMFD           sp!, {r0, lr}
                ADR             lr, UpCalls
DecodeUpCall1   LDR             r0, [lr], #8
                CMP             r0, #-1
                LDMEQFD         sp!, {r0}
                BEQ             Upxxxx
                TEQ             r0, r9
                LDMEQFD         sp!, {r0}
                SUBEQ           pc, lr, #4
                B               DecodeUpCall1

                =               "Andy"

                END
