1*34815acdSphx .text 2*34815acdSphx 3*34815acdSphx .globl _startit 4*34815acdSphx_startit: 5*34815acdSphx move.l sp,a3 6*34815acdSphx move.l 4,a6 7*34815acdSphx lea (start_super,pc),a5 8*34815acdSphx jmp (-0x1e,a6) | supervisor-call 9*34815acdSphx 10*34815acdSphxstart_super: 11*34815acdSphx move.w #0x2700,sr 12*34815acdSphx 13*34815acdSphx | the BSD kernel wants values into the following registers: 14*34815acdSphx | a0: fastmem-start 15*34815acdSphx | d0: fastmem-size 16*34815acdSphx | d1: chipmem-size 17*34815acdSphx | d3: Amiga specific flags 18*34815acdSphx | d4: E clock frequency 19*34815acdSphx | d5: AttnFlags (cpuid) 20*34815acdSphx | d7: boothowto 21*34815acdSphx | a4: esym location 22*34815acdSphx | a2: Inhibit sync flags 23*34815acdSphx | All other registers zeroed for possible future requirements. 24*34815acdSphx 25*34815acdSphx lea (_startit,pc),sp | make sure we have a good stack *** 26*34815acdSphx 27*34815acdSphx move.l (4,a3),a1 | loaded kernel 28*34815acdSphx move.l (8,a3),d2 | length of loaded kernel 29*34815acdSphx| move.l (12,a3),sp | entry point in stack pointer 30*34815acdSphx move.l (12,a3),a6 | push entry point *** 31*34815acdSphx move.l (16,a3),a0 | fastmem-start 32*34815acdSphx move.l (20,a3),d0 | fastmem-size 33*34815acdSphx move.l (24,a3),d1 | chipmem-size 34*34815acdSphx move.l (28,a3),d7 | boothowto 35*34815acdSphx move.l (32,a3),a4 | esym 36*34815acdSphx move.l (36,a3),d5 | cpuid 37*34815acdSphx move.l (40,a3),d4 | E clock frequency 38*34815acdSphx move.l (44,a3),d3 | Amiga flags 39*34815acdSphx move.l (48,a3),a2 | Inhibit sync flags 40*34815acdSphx move.l (52,a3),d6 | Load to fastmem flag 41*34815acdSphx sub.l a5,a5 | target, load to 0 42*34815acdSphx 43*34815acdSphx cmp.b #0x7D,(36,a3) | is it DraCo? 44*34815acdSphx beq nott | yes, switch off MMU later 45*34815acdSphx 46*34815acdSphx | no, it is an Amiga: 47*34815acdSphx 48*34815acdSphx| move.w #0xf00,0xdff180 |red 49*34815acdSphx| move.b #0,0x200003c8 50*34815acdSphx| move.b #63,0x200003c9 51*34815acdSphx| move.b #0,0x200003c9 52*34815acdSphx| move.b #0,0x200003c9 53*34815acdSphx 54*34815acdSphx move.w #(1<<9),0xdff096 | disable DMA on Amigas. 55*34815acdSphx 56*34815acdSphx| ------ mmu off start ----- 57*34815acdSphx 58*34815acdSphx btst #3,d5 | AFB_68040,SysBase->AttnFlags 59*34815acdSphx beq not040 60*34815acdSphx 61*34815acdSphx| Turn off 68040/060 MMU 62*34815acdSphx 63*34815acdSphx sub.l a3,a3 64*34815acdSphx .word 0x4e7b,0xb003 | movec a3,tc 65*34815acdSphx .word 0x4e7b,0xb806 | movec a3,urp 66*34815acdSphx .word 0x4e7b,0xb807 | movec a3,srp 67*34815acdSphx .word 0x4e7b,0xb004 | movec a3,itt0 68*34815acdSphx .word 0x4e7b,0xb005 | movec a3,itt1 69*34815acdSphx .word 0x4e7b,0xb006 | movec a3,dtt0 70*34815acdSphx .word 0x4e7b,0xb007 | movec a3,dtt1 71*34815acdSphx bra nott 72*34815acdSphx 73*34815acdSphxnot040: 74*34815acdSphx lea (zero,pc),a3 75*34815acdSphx pmove (a3),tc | Turn off MMU 76*34815acdSphx lea (nullrp,pc),a3 77*34815acdSphx pmove (a3),crp | Turn off MMU some more 78*34815acdSphx pmove (a3),srp | Really, really, turn off MMU 79*34815acdSphx 80*34815acdSphx| Turn off 68030 TT registers 81*34815acdSphx 82*34815acdSphx btst #2,d5 | AFB_68030,SysBase->AttnFlags 83*34815acdSphx beq nott | Skip TT registers if not 68030 84*34815acdSphx lea (zero,pc),a3 85*34815acdSphx .word 0xf013,0x0800 | pmove a3@,tt0 (gas only knows about 68851 ops..) 86*34815acdSphx .word 0xf013,0x0c00 | pmove a3@,tt1 (gas only knows about 68851 ops..) 87*34815acdSphx 88*34815acdSphxnott: 89*34815acdSphx| ---- mmu off end ---- 90*34815acdSphx| move.w #0xf60,0xdff180 | orange 91*34815acdSphx| move.b #0,0x200003c8 92*34815acdSphx| move.b #63,0x200003c9 93*34815acdSphx| move.b #24,0x200003c9 94*34815acdSphx| move.b #0,0x200003c9 95*34815acdSphx 96*34815acdSphx| ---- copy kernel start ---- 97*34815acdSphx 98*34815acdSphx tst.l d6 | Can we load to fastmem? 99*34815acdSphx beq L0 | No, leave destination at 0 100*34815acdSphx move.l a0,a5 | Move to start of fastmem chunk 101*34815acdSphx add.l a0,a6 | relocate kernel entry point 102*34815acdSphxL0: 103*34815acdSphx move.l (a1)+,(a5)+ 104*34815acdSphx sub.l #4,d2 105*34815acdSphx bcc L0 106*34815acdSphx 107*34815acdSphx lea (ckend,pc),a1 108*34815acdSphx move.l a5,-(sp) 109*34815acdSphx move.l #_startit_end-ckend,d2 110*34815acdSphxL2: 111*34815acdSphx move.l (a1)+,(a5)+ 112*34815acdSphx sub.l #4,d2 113*34815acdSphx bcc L2 114*34815acdSphx 115*34815acdSphx btst #3,d5 116*34815acdSphx jeq L1 117*34815acdSphx .word 0xf4f8 118*34815acdSphxL1: 119*34815acdSphx moveq.l #0,d2 | switch off cache to ensure we use 120*34815acdSphx movec d2,cacr | valid kernel data 121*34815acdSphx 122*34815acdSphx| move.w #0xFF0,0xdff180 | yellow 123*34815acdSphx| move.b #0,0x200003c8 124*34815acdSphx| move.b #63,0x200003c9 125*34815acdSphx| move.b #0,0x200003c9 126*34815acdSphx| move.b #0,0x200003c9 127*34815acdSphx rts 128*34815acdSphx 129*34815acdSphx| ---- copy kernel end ---- 130*34815acdSphx 131*34815acdSphxckend: 132*34815acdSphx| move.w #0x0ff,0xdff180 | petrol 133*34815acdSphx| move.b #0,0x200003c8 134*34815acdSphx| move.b #0,0x200003c9 135*34815acdSphx| move.b #63,0x200003c9 136*34815acdSphx| move.b #63,0x200003c9 137*34815acdSphx 138*34815acdSphx move.l d5,d2 139*34815acdSphx rol.l #8,d2 140*34815acdSphx cmp.b #0x7D,d2 141*34815acdSphx jne noDraCo 142*34815acdSphx 143*34815acdSphx| DraCo: switch off MMU now: 144*34815acdSphx 145*34815acdSphx sub.l a3,a3 146*34815acdSphx .word 0x4e7b,0xb003 | movec a3,tc 147*34815acdSphx .word 0x4e7b,0xb806 | movec a3,urp 148*34815acdSphx .word 0x4e7b,0xb807 | movec a3,srp 149*34815acdSphx .word 0x4e7b,0xb004 | movec a3,itt0 150*34815acdSphx .word 0x4e7b,0xb005 | movec a3,itt1 151*34815acdSphx .word 0x4e7b,0xb006 | movec a3,dtt0 152*34815acdSphx .word 0x4e7b,0xb007 | movec a3,dtt1 153*34815acdSphx 154*34815acdSphxnoDraCo: 155*34815acdSphx moveq #0,d2 | zero out unused registers 156*34815acdSphx moveq #0,d6 | (might make future compatibility 157*34815acdSphx move.l d6,a1 | would have known contents) 158*34815acdSphx move.l d6,a3 159*34815acdSphx move.l d6,a5 160*34815acdSphx move.l a6,sp | entry point into stack pointer 161*34815acdSphx move.l d6,a6 162*34815acdSphx 163*34815acdSphx| move.w #0x0F0,0xdff180 | green 164*34815acdSphx| move.b #0,0x200003c8 165*34815acdSphx| move.b #0,0x200003c9 166*34815acdSphx| move.b #63,0x200003c9 167*34815acdSphx| move.b #0,0x200003c9 168*34815acdSphx 169*34815acdSphx jmp (sp) | jump to kernel entry point 170*34815acdSphx 171*34815acdSphx| A do-nothing MMU root pointer (includes the following long as well) 172*34815acdSphx 173*34815acdSphxnullrp: .long 0x7fff0001 174*34815acdSphxzero: .long 0 175*34815acdSphx 176*34815acdSphx_startit_end: 177*34815acdSphx 178*34815acdSphx .data 179*34815acdSphx .globl _startit_sz 180*34815acdSphx_startit_sz: .long _startit_end-_startit 181