#include "opt_adb.h"
#include "assym.h"
#include <machine/asm.h>
#include <machine/trap.h>
#define loglob(g, v) \
.global _C_LABEL(g) ;\
.set _C_LABEL(g), v
#ifdef __STDC__
#define IMMEDIATE #
#define pascalret(pbytes) \
movl %sp@+,%a1 ; \
addl IMMEDIATE pbytes,%sp ; \
jra %a1@
#else
#define pascalret(pbytes) \
movl %sp@+,%a1 ; \
addl #pbytes,%sp ; \
jra %a1@
#endif
loglob(ADBBase, 0xcf8)
loglob(ADBYMM, 0xd18)
loglob(ADBDelay, 0xcea)
loglob(ROMBase, 0x2ae)
loglob(Lvl1DT, 0x192)
loglob(Lvl2DT, 0x1b2)
loglob(JADBProc, 0x6b8)
loglob(jADBOp, 0x5f0)
loglob(DeviceList, 0x8a8)
loglob(KbdLast, 0x218)
loglob(KbdType, 0x21E)
loglob(JKybdTask, 0x21A)
loglob(Lo3Bytes, 0x31a)
loglob(MinusOne, 0xa06)
loglob(MMU32Bit, 0xcb2)
loglob(CPUFlag, 0x12f)
loglob(MacJmp, 0x120)
loglob(Scratch8, 0x9fa)
loglob(Scratch20, 0x1e4)
loglob(Ticks, 0x16a)
loglob(Time, 0x20c)
loglob(TimeDBRA, 0xd00)
loglob(ToolScratch, 0x9ce)
loglob(VIA, 0x1d4)
loglob(mrg_VIA2, 0xcec)
loglob(SCCRd, 0x1d8)
loglob(FinderName, 0x2e0)
loglob(jSwapMMU, 0xdbc)
loglob(ADBState, 0xde0)
loglob(jUnimplTrap, 0x61c)
loglob(jEgret, 0x648)
loglob(HwCfgFlags, 0xb22)
loglob(HwCfgFlags2, 0xdd0)
loglob(HwCfgFlags3, 0xdd4)
loglob(ADBReInit_JTBL, 0xdd8)
loglob(jClkNoMem, 0x54c)
loglob(PramTransfer, 0x1e4)
loglob(SysParam, 0x1f8)
loglob(ExpandMem, 0x2b6)
loglob(VBLQueue, 0x160)
loglob(VBLQueue_head, 0x162)
loglob(VBLQueue_tail, 0x166)
loglob(jDTInstall, 0xd9c)
loglob(InitEgretJTVec, 0x2010)
#if 0
loglob(MMUFlags, 0xcb0)
loglob(MMUFluff, 0xcb3)
loglob(MMUTbl, 0xcb4)
loglob(MMUTblSize, 0xcb8)
loglob(MMUType, 0xcb1)
#endif
.text
.even
.global _C_LABEL(panic)
.global _C_LABEL(printf)
#ifdef MRG_ADB
ENTRY(InitUtil)
.word 0xa03f
rts
ENTRY(ADBReInit)
.word 0xa07b
rts
ENTRY(SetADBInfo)
movl %sp@(4),%a0
movl %sp@(8),%d0
.word 0xa07a
rts
ENTRY(CountADBs)
.word 0xa077
rts
ENTRY(GetIndADB)
movl %sp@(4),%a0
movl %sp@(8),%d0
.word 0xa078
rts
ENTRY(GetADBInfo)
movl %sp@(4),%a0
movl %sp@(8),%d0
.word 0xa079
rts
ENTRY(ADBOp)
lea %sp@(4),%a0
movl %sp@(16),%d0
.word 0xa07c
rts
#endif
#if 0
.global _MyOwnTrap
_MyOwnTrap:
.word 0xa000
rts
.global _KnownRTS
_KnownRTS:
.word 0xa001
rts
#endif
ENTRY(NewPtr)
movl %sp@(4),%d0
.word 0xa71e
rts
ENTRY(DisposPtr)
movl %sp@(4),%a0
.word 0xa01f
rts
ENTRY(GetPtrSize)
movl %sp@(4),%a0
.word 0xa021
rts
ENTRY(SetPtrSize)
movl %sp@(4),%a0
movl %sp@(8),%d0
.word 0xa020
rts
.data
GLOBAL(mrg_ResErr)
.word 0
.text
ENTRY(ResError)
movl %d2,%sp@- | Toolbox trap may alter %d0-%d2,%a0,%a1
| but C caller would save %d1,%a0,%a1
clrw %sp@- | space for return arg (ugh)
.word 0xa9af | ResError
movw %sp@+,%d0
movl %sp@+,%d2 | restore %d2
rts
ENTRY(mrg_ResError)
#if defined(MRG_SHOWTRAPS)
movml #0xc0c0,%sp@-
pea LRE_enter
jbsr _C_LABEL(printf)
addql #4,%sp
movml %sp@+,#0x0303
#endif
movw _C_LABEL(mrg_ResErr),%sp@(4)
| movw %d0,%sp@(4)
pascalret(0)
LRE_enter:
.asciz "mrg: ResError()\n"
.even
ENTRY(GetResource)
movl %sp@(8),%a1
movl %sp@(4),%a0
movl %d2,%sp@- | Toolbox trap may alter %d0-%d2,%a0,%a1
| but C caller would save %d1,%a0,%a1
clrl %sp@- | space for :Handle
movl %a0,%sp@-
movw %a1,%sp@- | pascal parameters upside down
.word 0xa9a0 | GetResource
movl %sp@+,%d0 | return Handle
movl %sp@+,%d2 | restore registers
rts
ENTRY(mrg_GetResource)
#if defined(MRG_SHOWTRAPS)
movml #0xc0c0,%sp@-
movw %sp@(20),%d0
movl %sp@(22),%d1
movl %d0,%sp@-
movl %d1,%sp@-
pea LGR_enter
jbsr _C_LABEL(printf)
addl #12,%sp
movml %sp@+,#0x0303
#endif
clrl %d0 | okay to change %d0 ?
movl %d0,%sp@(10) | return value is NIL
movl #-192,%d0 | resNotFound; that's pretty accurate.
movw %d0,_C_LABEL(mrg_ResErr)| set current ResMan error
pascalret(6) | I hate Pascal.
ENTRY(mrg_CountResources)
movl %sp@(4),%d0
movl %d0,%sp@-
jbsr _C_LABEL(Count_Resources)
addl #4,%sp | pop C params
movw %d0,%sp@(8) | store result
pascalret(4)
ENTRY(mrg_GetIndResource)
movl %sp@(6),%a0
clrl %d0
movw %sp@(4),%d0
movl %d0,%sp@-
movl %a0,%sp@-
jbsr _C_LABEL(Get_Ind_Resource)
addl #8,%sp | pop C params
movl %d0,%sp@(10) | store result
pascalret(6)
LGR_enter:
.asciz "GetResource('0x%x', %d)\n"
.even
.global _C_LABEL(mrg_aline_super)
.global _C_LABEL(mrg_ToolBoxtraps)
ENTRY_NOPROFILE(alinetrap)
clrl %sp@- | pad %SR to longword (I still don't know
| why we do this.)
moveml #0xffff,%sp@- | save registers
movl %sp,%sp@- | save pointer to frame
movw %sp@(FR_HW + 4),%d0 | retrieve status register
andw #PSL_S,%d0 | supervisor state?
bne Lalnosup | branch if supervisor
addql #4,%sp | pop frame ptr
movql #T_ILLINST,%d0 | user-mode fault
jra _ASM_LABEL(fault)
Lalnosup:
movl %sp@(FR_PC + 4),%a0 | retrieve PC
movw %a0@,%d0 | retrieve trap word
btst #11,%d0 | ToolBox trap?
bne Laltoolbox | branch if ToolBox
jbsr _C_LABEL(mrg_aline_super) | supervisor a-line trap
Lalrts:
addql #4,%sp | pop frame ptr
movw %sp@(FR_HW),%sr | restore status register (I hate MacOS traps)
movl %sp@(FR_PC),%a0 | move PC to correct location
movl %a0,%sp@(FR_PC+2)
moveml %sp@+,#0xffff | restore registers (some of which may have
| been magically changed)
addql #8,%sp | pop alignment long, make stack look like
| ordinary jbsr
tstw %d0 | Gotta do this because call might depend on it
rts | Go home (God, this is ugly.)
Laltoolbox:
addql #4,%sp | pop frame ptr
#if defined(MRG_DEBUG)
movml #0xC0C0,%sp@- | better save
pea LalP1
jbsr _C_LABEL(printf)
| printf ("Toolbox trap\n");
lea %sp@(4),%sp | pop
movml %sp@+,#0x0303 | restore
#endif
movl %a0,%a1 | save PC
movw %sp@(FR_HW),%sr | restore status register
#if defined(MRG_DEBUG)
movml #0xC0C0,%sp@- | better save
movw %sr,%sp@-
clrw %sp@- | coerce to int
pea LalP2
jbsr _C_LABEL(printf)
| printf ("Status register 0x%x\n", sr);
lea %sp@(8),%sp | pop
movml %sp@+,#0x0303 | restore
#endif
btst #10,%d0 | auto-pop the jump address?
beq Lalnoauto | branch if no auto-pop
pea Lalautopanic | I really don't know how to handle this
jbsr _C_LABEL(panic)
Lalnoauto:
addl #2,%a1 | add 2 to PC
#if defined(MRG_DEBUG)
movml #0xC0C0,%sp@- | better save
movl %a1,%sp@-
pea LalP4
jbsr _C_LABEL(printf)
| printf ("return address is 0x%x\n", new pc);
lea %sp@(8),%sp | pop
movml %sp@+,#0x0303 | restore
#endif
movl %a1,%sp@(FR_PC+2) | push new return address
movl %d0,%d1 | just in case of panic
andl #0x3ff,%d0 | %d0 = trap number
#if defined(MRG_DEBUG)
movml #0xC0C0,%sp@- | better save
movl %d0,%sp@-
pea LalP5
jbsr _C_LABEL(printf)
| printf ("trap number is 0x%x\n", trapnum);
lea %sp@(8),%sp | pop
movml %sp@+,#0x0303 | restore
#endif
lsll #2,%d0 | ptr = 4 bytes
lea _C_LABEL(mrg_ToolBoxtraps),%a0
addl %d0,%a0 | get trap address
movl %a0@,%a0
bne Laltbok | branch on trap addr non-zero
movl %d1,%sp@+ | trap word
pea Laltbnotrap
jbsr _C_LABEL(printf)
pea Laltbnogo
jbsr _C_LABEL(panic)
Laltbok:
#if defined(MRG_DEBUG)
movml #0xC0C0,%sp@- | better save
movl %a0,%sp@-
pea LalP6
jbsr _C_LABEL(printf)
| printf ("trap address is 0x%x\n", trapaddr);
lea %sp@(8),%sp | pop
movml %sp@+,#0x0303 | restore
#endif
movl %a0,%sp@(FR_HW) | we will RTS to trap routine (ick)
moveml %sp@+,#0xffff | restore registers
addql #4,%sp | pop alignment long
rts | go for it
Lalautopanic:
.asciz "mrg: A-line ToolBox trap wanted auto-pop; I don't know how"
Laltbnotrap:
.asciz "mrg: Don't know how to handle this trap: 0x%x\n"
Laltbnogo:
.asciz "mrg: can't go on"
LalP1:
.asciz "mrg: TB!"
LalP2:
.asciz " sr 0x%x"
LalP4:
.asciz " ret 0x%x"
LalP5:
.asciz " #%d"
LalP6:
.asciz " addr 0x%x\n"
.even
.data
GLOBAL(traceloopstart)
.space 20 * 4 | save last 20 program counters on trace trap
GLOBAL(traceloopend)
GLOBAL(traceloopptr)
.long _C_LABEL(traceloopstart)
.text
ENTRY_NOPROFILE(mrg_tracetrap)
movl %d0,%sp@- | save %d0
movl %a0,%sp@- | save %a0
movl %sp@(0x10),%d0 | address of instruction
|%sp@ old %a0
|%sp@(4) old %d0
|%sp@(8) old %sr
|%sp@(10) old %PC
|%sp@(14) exception vector
|%sp@(16) address of instruction
#if defined(MRG_FOLLOW)
movml #0xc0c0,%sp@-
movl %d0,%sp@-
pea Ltraceprint
jbsr _C_LABEL(printf) | printf("PC is %x\n", pc);
addql #8,%sp
movml %sp@+,#0x0303
tstl %d0
#endif
beq LPCiszero | if PC goes to zero, freak!
movl _C_LABEL(traceloopptr),%a0 | ptr = traceloopptr;
movl %d0,%a0@+ | *ptr++ = PC;
cmpl #_C_LABEL(traceloopend),%a0 | if(ptr == traceloopend)
bne Lnotpast | {
movl #_C_LABEL(traceloopstart),%a0 | ptr = traceloopstart;
Lnotpast: | }
movl %a0,_C_LABEL(traceloopptr) | traceloopptr = ptr;
movl %sp@+,%a0 | restore %a0
movl %sp@+,%d0 | restore %d0
rte | everything cool, return.
LPCiszero:
movl %sp@+,%a0 | restore %a0
movl %sp@+,%d0 | restore %d0
movml #0xc0c0,%sp@-
pea LtracePCzero
jbsr _C_LABEL(panic) | panic("PC is zero!", pc);
addql #4,%sp
movml %sp@+,#0x0303
Ltraceprint:
.asciz "tracing, pc at 0x%08x\n"
LtracePCzero:
.asciz "PC went to zero!\n"
.even