|
15 | 15 |
|
16 | 16 | ; vasmm68k_mot -Fhunkexe -kick1hunks addmem.asm -L addmem.list -nosym -m68000 -o AddReplayMem -I ~/Documents/amiga-root/SYS/Code/NDK_3.9/Include/include_i
|
17 | 17 |
|
| 18 | +;ENABLE_KPRINTF |
| 19 | + |
| 20 | + include exec/memory.i |
18 | 21 | include exec/nodes.i
|
19 | 22 | include exec/resident.i
|
| 23 | + include exec/exec.i |
| 24 | + include lvo/exec_lib.i |
| 25 | + include kprintf.i |
20 | 26 |
|
21 |
| -_LVOAllocMem equ -198 |
22 |
| -_LVOFreeMem equ -210 |
23 |
| -_LVOTypeOfMem equ -534 |
24 |
| -_LVOAddMemList equ -618 |
25 |
| -_LVOOpenLibrary equ -552 |
26 |
| -_LVOCloseLibrary equ -414 |
27 | 27 | _LVOPutStr equ -948
|
28 |
| -MEMF_PUBLIC equ (1<<0) |
29 |
| -MEMF_CHIP equ (1<<1) |
30 |
| -MEMF_FAST equ (1<<2) |
31 | 28 | MEMF_REPLAY equ (1<<14)
|
32 | 29 |
|
33 | 30 | jmp S
|
34 | 31 | moveq.l #-1,d0
|
35 | 32 | rts
|
36 | 33 |
|
37 | 34 | VERSION = 1
|
38 |
| -REVISION= 5 |
39 | 35 |
|
40 |
| - dc.b 0,'$VER: AddReplayMem 1.5 (20.9.2018) Replay XRAM',0 |
41 |
| -VERSTRING dc.b 'AddReplayMem 1.5 (20.9.2018) Replay XRAM',13,10,0 |
| 36 | + dc.b 0,'$VER: AddReplayMem 1.7 (19.2.2020) Replay XRAM',0 |
42 | 37 | even
|
43 |
| - |
| 38 | +VERSTRING dc.b 'AddReplayMem 1.7 (19.2.2020) Replay XRAM',13,10,0 |
| 39 | + even |
| 40 | + |
| 41 | + cnop 0,4 |
44 | 42 | romtag: dc.w RTC_MATCHWORD
|
45 | 43 | dc.l romtag
|
46 | 44 | dc.l end
|
47 |
| - dc.b RTF_COLDSTART |
| 45 | + dc.b RTF_SINGLETASK |
48 | 46 | dc.b VERSION
|
49 | 47 | dc.b NT_UNKNOWN
|
50 |
| - dc.b 0 |
| 48 | + dc.b 108 |
51 | 49 | dc.l tagname
|
52 | 50 | dc.l VERSTRING
|
53 | 51 | dc.l S
|
54 | 52 |
|
55 | 53 | tagname: dc.b 'AddReplayMem',0
|
56 | 54 | even
|
57 |
| - |
| 55 | + |
| 56 | +MIN_ROM_SIZE = (4*1024) |
| 57 | +MAX_ROM_SIZE = (1024*1024) |
| 58 | + |
| 59 | + cnop 0,4 |
58 | 60 | S:
|
| 61 | + kprintf "INIT: %s",#VERSTRING |
| 62 | + |
59 | 63 | movem.l d2-d6/a2-a6,-(sp)
|
60 | 64 |
|
| 65 | +; 1.7 - Add a dummy memory node for the $00F0.0000 replay.rom memory region (to prevent mmu.library cache-inhibit state) |
| 66 | +; 1.6 - Fix memory trashing when probing; Change to RTF_SINGLETASK (before Exec); Add logging |
61 | 67 | ; 1.5 - Make ROMable
|
62 | 68 | ; 1.4 - Add console logging; Fix building with vasm.
|
63 | 69 | ; 1.3 - Label the memory region as REPLAY memory (unused bit 14)
|
64 | 70 | ; 1.2 - Probe the memory region to see if it's already been added (using exec.library/TypeOfMem())
|
65 | 71 | ; 1.1 - Detect 24 bit (000/010/EC020) memory space (by detecting mirroring of CHIP above the 16M barrier)
|
66 | 72 | ; 1.0 - Probe memory to make sure it's actually present
|
67 | 73 |
|
68 |
| - ; Check if already registered |
| 74 | + ; Check if ROM is mapped as RAM |
69 | 75 | movea.l $4.w,a6
|
| 76 | + lea $00f01000,a1 |
| 77 | + jsr _LVOTypeOfMem(a6) |
| 78 | + tst.l d0 |
| 79 | + bne .already_mapped |
| 80 | + |
| 81 | + bsr MapROMasRAM |
| 82 | + tst.l d0 |
| 83 | + bmi .quit_checksum |
| 84 | + |
| 85 | + kprintf <" rom is %ld bytes",10>,d0 |
| 86 | + |
| 87 | +.already_mapped |
| 88 | + |
| 89 | + ; Check if already registered |
70 | 90 | lea $01001000,a1
|
71 | 91 | jsr _LVOTypeOfMem(a6)
|
72 | 92 | tst.l d0
|
|
124 | 144 |
|
125 | 145 | neg.b d4
|
126 | 146 | cmp.b #32,d4
|
127 |
| - bne.b .quit_24bit |
| 147 | + bne .quit_24bit |
128 | 148 |
|
129 | 149 | ; Probe the memory to see if it's there
|
| 150 | + jsr _LVODisable(a6) |
| 151 | + |
130 | 152 | lea $01000000,a0
|
131 | 153 | moveq.l #$30-1,d7
|
132 |
| -.probe movem.l d0-d3,(a0) |
| 154 | +.probe |
| 155 | + ; save memory contents |
| 156 | + movem.l (a0),d4/d5/a4/a5 |
| 157 | + movem.l d4/d5/a4/a5,-(sp) |
| 158 | + movem.l $4000(a0),d4/d5/a4/a5 |
| 159 | + movem.l d4/d5/a4/a5,-(sp) |
| 160 | + |
| 161 | + ; write known values |
| 162 | + movem.l d0-d3,(a0) |
| 163 | + |
| 164 | + ; write noise at 16KB ahead |
133 | 165 | lea $4000(a0),a1
|
134 | 166 | movem.l $4.w,a2-a5
|
135 | 167 | movem.l a2-a5,(a1)
|
| 168 | + |
| 169 | + ; make sure the original write is valid |
136 | 170 | move.l a0,a1
|
137 | 171 | cmp.l (a1)+,d0
|
138 |
| - bne.b .quit_probing |
| 172 | + bne.b .probe_failed |
139 | 173 | cmp.l (a1)+,d1
|
140 |
| - bne.b .quit_probing |
| 174 | + bne.b .probe_failed |
141 | 175 | cmp.l (a1)+,d2
|
142 |
| - bne.b .quit_probing |
| 176 | + bne.b .probe_failed |
143 | 177 | cmp.l (a1)+,d3
|
144 |
| - bne.b .quit_probing |
| 178 | + |
| 179 | +.probe_failed |
| 180 | + ; restore memory contents |
| 181 | + movem.l (sp)+,d4/d5/a4/a5 |
| 182 | + movem.l d4/d5/a4/a5,$4000(a0) |
| 183 | + movem.l (sp)+,d4/d5/a4/a5 |
| 184 | + movem.l d4/d5/a4/a5,(a0) |
| 185 | + |
145 | 186 | add.l #$00100000,a0
|
146 |
| - dbf d7,.probe |
| 187 | + dbne d7,.probe |
| 188 | + |
| 189 | + jsr _LVOEnable(a6) |
| 190 | + |
| 191 | + tst.b d7 |
| 192 | + bpl.b .quit_probing |
147 | 193 |
|
148 | 194 | moveq.l #name_end-name,d0
|
149 | 195 | moveq.l #0,d1
|
|
167 | 213 | lea memory_added(pc),a5
|
168 | 214 | bra.b .quit
|
169 | 215 |
|
| 216 | +.quit_checksum lea checksum_failed(pc),a5 |
| 217 | + bra.b .quit |
170 | 218 | .quit_present lea already_there(pc),a5
|
171 | 219 | bra.b .quit
|
172 | 220 | .quit_24bit lea cpu_is_24bit(pc),a5
|
|
175 | 223 | bra.b .quit
|
176 | 224 | .quit_alloc lea alloc_failed(pc),a5
|
177 | 225 |
|
178 |
| -.quit lea dos(pc),a1 |
| 226 | +.quit |
| 227 | + kprintf " %s",a5 |
| 228 | + lea dos(pc),a1 |
179 | 229 | moveq.l #36,d0 ; putstr is kick 2.x+
|
180 | 230 | movea.l $4.w,a6
|
181 | 231 | jsr _LVOOpenLibrary(a6)
|
|
197 | 247 |
|
198 | 248 | name dc.b 'replay xram memory',0
|
199 | 249 | name_end
|
| 250 | +romname dc.b 'replay.rom memory',0 |
| 251 | +romname_end |
200 | 252 | dos dc.b 'dos.library',0
|
| 253 | +checksum_failed dc.b 'rom checksum failed',10,0 |
201 | 254 | already_there dc.b 'memory is already available',10,0
|
202 | 255 | cpu_is_24bit dc.b 'cpu uses a 24bit address bus (68000/010/EC020)',10,0
|
203 | 256 | probing_failed dc.b 'memory probing failed',10,0
|
204 | 257 | alloc_failed dc.b 'memory allocation failed',10,0
|
205 | 258 | memory_added dc.b 'memory region added',10,0
|
206 | 259 |
|
| 260 | + cnop 0,4 |
| 261 | + |
| 262 | +MapROMasRAM: |
| 263 | + ; Find replay ROM size |
| 264 | + lea $00f00000,a0 |
| 265 | + move.l #MIN_ROM_SIZE,d0 |
| 266 | + move.l #MAX_ROM_SIZE,d1 |
| 267 | + |
| 268 | + ; a0.l = ROM start |
| 269 | + ; d0.l = start ROM size (16 bytes min) |
| 270 | + ; d1.l = end ROM size (1MB max) |
| 271 | + |
| 272 | + move.l d0,d7 |
| 273 | + moveq #0,d5 |
| 274 | + moveq #0,d6 |
| 275 | +.cont lsr.l #4,d7 |
| 276 | + bra.b .start |
| 277 | +.loop: rept 4 |
| 278 | + add.l (a0)+,d5 |
| 279 | + addx.l d6,d5 |
| 280 | + endr |
| 281 | +.start dbf d7,.loop |
| 282 | + |
| 283 | + not.l d5 |
| 284 | + beq.b .sumok |
| 285 | + not.l d5 |
| 286 | + |
| 287 | + move.l d0,d7 |
| 288 | + add.l d0,d0 |
| 289 | + cmp.l d1,d0 |
| 290 | + bne.b .cont |
| 291 | +.error moveq.l #-1,d0 |
| 292 | + rts |
| 293 | +.sumok move.l d0,d2 |
| 294 | + |
| 295 | + ; Allocate a dummy memlist header + memlist name + 'free'list |
| 296 | + moveq.l #MH_SIZE+MC_SIZE+(romname_end-romname),d0 |
| 297 | + moveq.l #0,d1 |
| 298 | + jsr _LVOAllocMem(a6) |
| 299 | + tst.l d0 |
| 300 | + beq .error |
| 301 | + |
| 302 | + ; Fill out the memlist header based on the ROM details |
| 303 | + move.l d0,a0 |
| 304 | + clr.l LN_SUCC(a0) |
| 305 | + clr.l LN_PRED(a0) |
| 306 | + move.b #NT_MEMORY,LN_TYPE(a0) |
| 307 | + move.b #-128,LN_PRI(a0) |
| 308 | + move.w #0,MH_ATTRIBUTES(a0) |
| 309 | + |
| 310 | + ; This is the 'empty' freelist node |
| 311 | + lea MH_SIZE(a0),a1 |
| 312 | + move.l a1,MH_FIRST(a0) |
| 313 | + clr.l (a1)+ ; MC_NEXT |
| 314 | + clr.l (a1)+ ; MC_BYTES |
| 315 | + |
| 316 | + ; Set the ROM memory name |
| 317 | + move.l a1,LN_NAME(a0) |
| 318 | + lea romname(pc),a2 |
| 319 | + moveq.l #romname_end-romname,d1 |
| 320 | +.name move.b (a2)+,(a1)+ |
| 321 | + dbf d1,.name |
| 322 | + |
| 323 | + ; Set the memlist lower and upper bound (matching ROM) |
| 324 | + lea $00f00000,a1 |
| 325 | + move.l a1,MH_LOWER(a0) |
| 326 | + move.l a1,MH_UPPER(a0) |
| 327 | + add.l d2,MH_UPPER(a0) |
| 328 | + clr.l MH_FREE(a0) |
| 329 | + |
| 330 | + ; Use the *private* execbase member 'MemList' to enqueue the ROM memlist |
| 331 | + move.l a0,a1 |
| 332 | + lea.l MemList(a6),a0 |
| 333 | + jsr _LVOForbid(a6) |
| 334 | + jsr _LVOEnqueue(a6) |
| 335 | + jsr _LVOPermit(a6) |
| 336 | + |
| 337 | + move.l d2,d0 ; ROM size |
| 338 | + rts |
207 | 339 | end
|
208 | 340 |
|
0 commit comments