From 0248da5e2c262d6934fd48c23212d866e250b9ed Mon Sep 17 00:00:00 2001 From: Duncan Smith Date: Sat, 26 Jun 2010 21:28:22 -0700 Subject: Rewrote loader routine in C --- asm_vars.h | 17 +++++++++++++++++ loader.c | 42 ++++++++++++++++++++++++++++++++++++++++++ main.asm | 35 ++++++++++------------------------- 3 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 asm_vars.h create mode 100644 loader.c diff --git a/asm_vars.h b/asm_vars.h new file mode 100644 index 0000000..1783bfa --- /dev/null +++ b/asm_vars.h @@ -0,0 +1,17 @@ +#ifndef ASM_VARS_H +#define ASM_VARS_H + +extern void* mem_page_0; +extern void* mem_page_1; +extern void* mem_page_2; +extern void* mem_page_3; +extern void* mem_page_loc_0; +extern void* mem_page_loc_1; +extern void* mem_page_loc_2; +extern void* mem_page_loc_3; + +extern void* pages[]; + + + +#endif diff --git a/loader.c b/loader.c new file mode 100644 index 0000000..9808b34 --- /dev/null +++ b/loader.c @@ -0,0 +1,42 @@ +/* Loading routines for 680 project. + * + * Includes splash screen, choose-an-image, etc. + * + * Copyright 2010, Duncan Smith + * GPL + */ +#include +#include "asm_vars.h" + +void init_load(void) +{ + pages = malloc(256 * sizeof(void*)); + + /* Page layout: + * 0x40 RAM + * 0x41 RAM + + * 0x00 ROM + * ... all the way to ... + * 0x1f ROM + */ + + pages[0x40] = malloc(PAGE_SIZE * sizeof(char)); + pages[0x41] = malloc(PAGE_SIZE * sizeof(char)); + + for (int i = 0; i++; i <= 0x1f) { + pages[i] = pages[0x40]; + } + + mem_page_0 = pages[0]; + mem_page_loc_0 = 0; + mem_page_1 = pages[0x40]; + mem_page_loc_1 = 0x40; + mem_page_2 = pages[0]; + mem_page_loc_2 = 0; + mem_page_3 = pages[0x40]; + mem_page_loc_3 = 0x40; + + return; + +} diff --git a/main.asm b/main.asm index d2727ea..05235f5 100644 --- a/main.asm +++ b/main.asm @@ -51,6 +51,7 @@ __main: movem.l d0-d7/a0-a6,-(sp) + bsr init_load bsr emu_setup lea emu_plain_op,a5 bsr emu_run @@ -63,27 +64,6 @@ __main: include "alu.asm" emu_setup: - ;; Allocate memory pages; for now I assume this succeeds - move.l #$4000,-(a7) - ROM_CALL malloc - addq #4,a7 - move.l a0,ref_0 - - move.l #$4000,-(a7) - ROM_CALL malloc - addq #4,a7 - move.l a0,ref_1 - - move.l #$4000,-(a7) - ROM_CALL malloc - addq #4,a7 - move.l a0,ref_2 - - move.l #$4000,-(a7) - ROM_CALL malloc - addq #4,a7 - move.l a0,ref_3 - movea emu_plain_op,a5 lea emu_run,a2 @@ -111,10 +91,15 @@ deref: rts deref_table: -ref_0: dc.l 0 ; bank 0 -ref_1: dc.l 0 ; bank 1 -ref_2: dc.l 0 ; bank 2 -ref_3: dc.l 0 ; bank 3 +mem_page_0: dc.l 0 ; bank 0 +mem_page_1: dc.l 0 ; bank 1 +mem_page_2: dc.l 0 ; bank 2 +mem_page_3: dc.l 0 ; bank 3 + +mem_page_loc_0: dc.b 0 +mem_page_loc_1: dc.b 0 +mem_page_loc_2: dc.b 0 +mem_page_loc_3: dc.b 0 ;; Take a physical address in a0 and turn it into a virtual ;; address in d0 -- cgit v1.2.3