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