Revision 183
Added by markw almost 11 years ago
firmware/Makefile | ||
---|---|---|
CP = $(BASE)-objcopy
|
||
DUMP = $(BASE)-objdump
|
||
|
||
HOST_CC = gcc
|
||
HOST_LD = gcc
|
||
|
||
HOST_CFLAGS = -g -DLINUX_BUILD -DLITTLE_ENDIAN -fno-builtin
|
||
HOST_CFLAGS += -W -Wall
|
||
HOST_LDFLAGS = -g
|
||
|
||
#HOST_CFLAGS += -m32
|
||
#HOST_LDFLAGS += -m32
|
||
|
||
HOST_CFLAGS += $(shell pkg-config --cflags ncurses)
|
||
HOST_LDFLAGS += $(shell pkg-config --libs ncurses)
|
||
|
||
# we use mincrt0.s from here
|
||
STARTUP_DIR = .
|
||
|
||
... | ... | |
CHAMELEON_DIR = chameleon
|
||
MCC_DIR = mcc
|
||
MIST_DIR = mist
|
||
LINUXSIM_DIR = linux
|
||
|
||
AEON_LITE_BUILD_DIR = $(BUILD_DIR)/$(AEON_LITE_DIR)
|
||
DE1_BUILD_DIR = $(BUILD_DIR)/$(DE1_DIR)
|
||
CHAMELEON_BUILD_DIR = $(BUILD_DIR)/$(CHAMELEON_DIR)
|
||
MCC_BUILD_DIR = $(BUILD_DIR)/$(MCC_DIR)
|
||
MIST_BUILD_DIR = $(BUILD_DIR)/$(MIST_DIR)
|
||
LINUXSIM_BUILD_DIR = $(BUILD_DIR)/$(LINUXSIM_DIR)
|
||
|
||
#MINSTARTUP_SRC = mincrt0.s
|
||
MINSTARTUP_SRC = mycrt0.s
|
||
MINSTARTUP_OBJ = $(patsubst $(STARTUP_DIR)/%.s,$(BUILD_DIR)/%.o,$(MINSTARTUP_SRC))
|
||
|
||
COMMON_SRC = main.c regs.c freeze.c joystick.c fileutils.c fileselector.c atari_drive_emulator.c pokey/uart.c hexdump.c printf/printf.c fat/pff_file.c fat/pff.c common/utils.c
|
||
COMMON_SRC = main.c freeze.c fileutils.c fileselector.c atari_drive_emulator.c pokey/uart.c hexdump.c printf/printf.c fat/pff_file.c fat/pff.c common/utils.c
|
||
ZPU_SRC = regs.c joystick.c
|
||
SDCARD_SRC = sd_direct/diskio_mmc.c sd_direct/spi.c sd_direct/mmc2.c
|
||
|
||
AEON_LITE_PRJ = AEON_LITE
|
||
AEON_LITE_SRC = $(COMMON_SRC) $(SDCARD_SRC) de1/dirs.c
|
||
AEON_LITE_SRC = $(COMMON_SRC) $(SDCARD_SRC) $(ZPU_SRC) de1/dirs.c
|
||
AEON_LITE_OBJ = $(patsubst %.c,$(AEON_LITE_BUILD_DIR)/%.o,$(AEON_LITE_SRC))
|
||
|
||
DE1_PRJ = DE1
|
||
DE1_SRC = $(COMMON_SRC) $(SDCARD_SRC) de1/dirs.c
|
||
DE1_SRC = $(COMMON_SRC) $(SDCARD_SRC) $(ZPU_SRC) de1/dirs.c
|
||
DE1_OBJ = $(patsubst %.c,$(DE1_BUILD_DIR)/%.o,$(DE1_SRC))
|
||
|
||
CHAMELEON_PRJ = CHAMELEON
|
||
CHAMELEON_SRC = $(COMMON_SRC) $(SDCARD_SRC) chameleon/dirs.c
|
||
CHAMELEON_SRC = $(COMMON_SRC) $(SDCARD_SRC) $(ZPU_SRC) chameleon/dirs.c
|
||
CHAMELEON_OBJ = $(patsubst %.c,$(CHAMELEON_BUILD_DIR)/%.o,$(CHAMELEON_SRC))
|
||
|
||
MCC_PRJ = MCC216
|
||
MCC_SRC = $(COMMON_SRC) $(SDCARD_SRC) mcc/dirs.c
|
||
MCC_SRC = $(COMMON_SRC) $(SDCARD_SRC) $(ZPU_SRC) mcc/dirs.c
|
||
MCC_OBJ = $(patsubst %.c,$(MCC_BUILD_DIR)/%.o,$(MCC_SRC))
|
||
|
||
MIST_PRJ = MIST
|
||
MIST_SRC = $(COMMON_SRC) mist/diskio_sectorrequest.c mist/dirs.c
|
||
MIST_SRC = $(COMMON_SRC) $(ZPU_SRC) mist/diskio_sectorrequest.c mist/dirs.c
|
||
MIST_OBJ = $(patsubst %.c,$(MIST_BUILD_DIR)/%.o,$(MIST_SRC))
|
||
|
||
LINKMAP = ./standalone_simple.ld
|
||
|
||
LINUXSIM_EXE = linuxsim
|
||
LINUXSIM_SRC = $(COMMON_SRC) linux/main.c linux/mmc.c \
|
||
sd_direct/diskio_mmc.c linux/dirs.c linux/linux_memory.c linux/curses_screen.c \
|
||
linux/linux_helper.c
|
||
|
||
LINUXSIM_OBJ = $(patsubst %.c,$(LINUXSIM_BUILD_DIR)/%.o,$(LINUXSIM_SRC))
|
||
|
||
# Commandline options for each tool.
|
||
|
||
#ZPUOPTS= -mno-poppcrel -mno-pushspadd -mno-callpcrel -mno-shortop -mno-neg # No-neg requires bugfixed toolchain
|
||
... | ... | |
ZPUOPTS =
|
||
CFLAGS = -I. -Isd_direct -Iprintf -Ifat -Icommon -Isdram_common -c -g -Os $(ZPUOPTS) -DDISABLE_UART_RX
|
||
|
||
HOST_CFLAGS += -I. -Isd_direct -Iprintf -Ifat -Icommon -Isdram_common -DDISABLE_UART_RX
|
||
|
||
LFLAGS = -nostartfiles -Wl,--relax -g -Os
|
||
#LFLAGS = -nostartfiles -Os
|
||
|
||
... | ... | |
|
||
mist: $(BUILD_DIR) $(MIST_PRJ).bin $(MIST_PRJ).rpt
|
||
|
||
.PHONY: linux
|
||
linux: $(BUILD_DIR) $(LINUXSIM_EXE)
|
||
|
||
clean:
|
||
rm -rf $(BUILD_DIR)/* *.hex *.elf *.map *.lst *.srec *.bin *.rpt
|
||
rm -rf $(BUILD_DIR)/* *.hex *.elf *.map *.lst *.srec *.bin *.rpt $(LINUXSIM_EXE)
|
||
|
||
|
||
# Convert ELF binary to bin file.
|
||
... | ... | |
$(MIST_PRJ).elf: $(MINSTARTUP_OBJ) $(MIST_OBJ)
|
||
$(LD) $(LFLAGS) -T $(LINKMAP) -o $@ $+ $(LIBS)
|
||
|
||
$(LINUXSIM_EXE): $(LINUXSIM_OBJ)
|
||
$(HOST_LD) $(HOST_LDFLAGS) -o $@ $+
|
||
|
||
$(AEON_LITE_BUILD_DIR)/%.o: %.c Makefile
|
||
mkdir -p `dirname $@`
|
||
$(CC) -I$(AEON_LITE_DIR) $(CFLAGS) -o $@ -c $<
|
||
... | ... | |
mkdir -p `dirname $@`
|
||
$(CC) -I$(MIST_DIR) $(CFLAGS) -o $@ -c $<
|
||
|
||
$(LINUXSIM_BUILD_DIR)/%.o: %.c Makefile
|
||
@mkdir -p `dirname $@`
|
||
$(HOST_CC) -I$(LINUXSIM_DIR) $(HOST_CFLAGS) -o $@ -c $<
|
||
|
||
$(BUILD_DIR)/%.o: %.s
|
||
$(AS) -o $@ $<
|
||
|
firmware/joystick.h | ||
---|---|---|
#pragma once
|
||
#ifndef JOYSTICK_H
|
||
#define JOYSTICK_H
|
||
|
||
struct joystick_status
|
||
{
|
||
... | ... | |
void joystick_poll(struct joystick_status * status);
|
||
void joystick_wait(struct joystick_status * status, enum JoyWait waitFor);
|
||
|
||
#endif
|
firmware/linux/curses_screen.c | ||
---|---|---|
#include <stdarg.h>
|
||
#include <stdio.h>
|
||
#include <stdint.h>
|
||
#include <curses.h>
|
||
#include "curses_screen.h"
|
||
#include "linux_helper.h"
|
||
#include "regs.h"
|
||
|
||
static WINDOW* atari_window;
|
||
static WINDOW* status_window;
|
||
static WINDOW* log_window;
|
||
|
||
static attr_t atari_color;
|
||
static attr_t atari_inverse_color;
|
||
static attr_t status_color;
|
||
static attr_t log_color;
|
||
|
||
int init_curses_screen(void)
|
||
{
|
||
int height;
|
||
int width;
|
||
|
||
initscr();
|
||
|
||
getmaxyx(stdscr, height, width);
|
||
|
||
if (height < 24 || width < 80) {
|
||
fprintf(stderr, "screen is too small (must be 80x24)\n");
|
||
return 1;
|
||
}
|
||
|
||
nonl();
|
||
cbreak();
|
||
noecho();
|
||
|
||
atari_window = newwin(24, 40, 0, 0);
|
||
status_window = newwin(4, width - 40, 0, 40);
|
||
log_window = newwin(height - 4, width - 40, 4, 40);
|
||
|
||
atari_color = 0;
|
||
atari_inverse_color = A_REVERSE;
|
||
if (has_colors()) {
|
||
start_color();
|
||
init_pair(1, COLOR_YELLOW, COLOR_BLUE);
|
||
init_pair(2, COLOR_YELLOW, COLOR_BLACK);
|
||
status_color = COLOR_PAIR(1);
|
||
log_color = COLOR_PAIR(2);
|
||
} else {
|
||
status_color = A_REVERSE;
|
||
log_color = 0;
|
||
}
|
||
wbkgdset(atari_window, atari_color | ' ');
|
||
wbkgdset(log_window, log_color | ' ');
|
||
wbkgdset(status_window, status_color | ' ');
|
||
wbkgdset(log_window, log_color | ' ');
|
||
|
||
keypad(stdscr, TRUE);
|
||
scrollok(log_window, TRUE);
|
||
|
||
werase(atari_window);
|
||
werase(status_window);
|
||
werase(log_window);
|
||
|
||
curs_set(0);
|
||
|
||
refresh();
|
||
return 0;
|
||
}
|
||
|
||
void deinit_curses_screen(void)
|
||
{
|
||
endwin();
|
||
}
|
||
|
||
#define MAXSTR 256
|
||
static char tmpstr[MAXSTR];
|
||
|
||
void display_out_regs(void)
|
||
{
|
||
uint32_t out1 = *zpu_out1;
|
||
|
||
werase(status_window);
|
||
snprintf(tmpstr, MAXSTR, "out1: %08x", out1);
|
||
mvwaddstr(status_window, 0, 1, tmpstr);
|
||
|
||
snprintf(tmpstr, MAXSTR, "- - tur %02x ram %02x rom %02x",
|
||
(out1 >> 2) & 0x3f,
|
||
(out1 >> 8) & 0x07,
|
||
(out1 >> 11) & 0x3f);
|
||
if (out1 & 1) {
|
||
tmpstr[0] = 'P';
|
||
}
|
||
if (out1 & 2) {
|
||
tmpstr[2] = 'R';
|
||
}
|
||
mvwaddstr(status_window, 1, 1, tmpstr);
|
||
|
||
wrefresh(status_window);
|
||
}
|
||
|
||
void display_char(int x, int y, char c, int inverse)
|
||
{
|
||
if (inverse) {
|
||
wattrset(atari_window, atari_inverse_color);
|
||
}
|
||
mvwaddch(atari_window, y, x, c);
|
||
wattrset(atari_window, atari_color);
|
||
|
||
wrefresh(atari_window);
|
||
}
|
||
|
||
void clearscreen(void)
|
||
{
|
||
wattrset(atari_window, atari_color);
|
||
werase(atari_window);
|
||
wrefresh(atari_window);
|
||
}
|
||
|
||
void check_keys(void)
|
||
{
|
||
int ch;
|
||
*zpu_in1 = 0;
|
||
|
||
while (1) {
|
||
ch = wgetch(stdscr);
|
||
|
||
switch (ch) {
|
||
case KEY_F(12):
|
||
*zpu_in1 = 1<<11; return;
|
||
case 27: // ESCAPE:
|
||
longjmp(exit_jmp_buf, 1);
|
||
}
|
||
}
|
||
}
|
||
|
||
void joystick_poll(struct joystick_status * status)
|
||
{
|
||
// we are blocking instead of polling
|
||
int ch = wgetch(stdscr);
|
||
|
||
status->x_ = 0;
|
||
status->y_ = 0;
|
||
status->fire_ = 0;
|
||
|
||
|
||
switch (ch) {
|
||
case KEY_UP: status->y_ = -1; break;
|
||
case KEY_DOWN: status->y_ = 1; break;
|
||
case KEY_LEFT: status->x_ = -1; break;
|
||
case KEY_RIGHT: status->x_ = 1; break;
|
||
case KEY_ENTER:
|
||
case 13:
|
||
status->fire_ = 1; break;
|
||
case 27: // ESCAPE:
|
||
longjmp(exit_jmp_buf, 1);
|
||
default: break;
|
||
}
|
||
}
|
||
|
||
void joystick_wait(struct joystick_status * status, enum JoyWait waitFor)
|
||
{
|
||
if (waitFor == WAIT_QUIET)
|
||
{
|
||
status->x_ = 0;
|
||
status->y_ = 0;
|
||
status->fire_ = 0;
|
||
return;
|
||
}
|
||
while (1)
|
||
{
|
||
joystick_poll(status);
|
||
switch (waitFor)
|
||
{
|
||
case WAIT_QUIET:
|
||
break;
|
||
case WAIT_FIRE:
|
||
if (status->fire_ == 1) return;
|
||
break;
|
||
case WAIT_EITHER:
|
||
if (status->fire_ == 1) return;
|
||
// fall through
|
||
case WAIT_MOVE:
|
||
if (status->x_ !=0 || status->y_ != 0) return;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void print_log(const char* format, ...)
|
||
{
|
||
va_list arg;
|
||
va_start(arg, format);
|
||
vw_printw(log_window, format, arg);
|
||
va_end(arg);
|
||
wrefresh(log_window);
|
||
}
|
||
|
firmware/linux/curses_screen.h | ||
---|---|---|
#ifndef CURSES_SCREEN_H
|
||
#define CURSES_SCREEN_H
|
||
#include "joystick.h"
|
||
|
||
int init_curses_screen(void);
|
||
|
||
void deinit_curses_screen(void);
|
||
|
||
void display_out_regs(void);
|
||
|
||
void display_char(int x, int y, char c, int inverse);
|
||
|
||
void clearscreen(void);
|
||
|
||
void check_keys(void);
|
||
|
||
void print_log(const char* format, ...) __attribute__ ((format (printf, 1, 2))) ;
|
||
|
||
#endif
|
firmware/linux/dirs.c | ||
---|---|---|
char USER_DIR[]="/atari800/user";
|
||
char ROM_DIR[]="/atari800/rom";
|
firmware/linux/linux_helper.c | ||
---|---|---|
#include "linux_helper.h"
|
||
|
||
jmp_buf exit_jmp_buf;
|
||
|
||
char* sdcard_filename = 0;
|
firmware/linux/linux_helper.h | ||
---|---|---|
#ifndef LINUX_HELPER_H
|
||
#define LINUX_HELPER_H
|
||
#include <setjmp.h>
|
||
|
||
extern jmp_buf exit_jmp_buf;
|
||
|
||
extern char* sdcard_filename;
|
||
|
||
#endif
|
firmware/linux/linux_memory.c | ||
---|---|---|
#include <stdint.h>
|
||
#include <string.h>
|
||
#include "regs.h"
|
||
#include "memory.h"
|
||
#include "linux_memory.h"
|
||
|
||
int volatile * zpu_in1;
|
||
int volatile * zpu_in2;
|
||
int volatile * zpu_in3;
|
||
int volatile * zpu_in4;
|
||
|
||
int volatile * zpu_out1;
|
||
int volatile * zpu_out2;
|
||
int volatile * zpu_out3;
|
||
int volatile * zpu_out4;
|
||
|
||
int volatile * zpu_pause;
|
||
|
||
int volatile * zpu_spi_data;
|
||
int volatile * zpu_spi_state;
|
||
|
||
int volatile * zpu_sio;
|
||
|
||
int volatile * zpu_board;
|
||
|
||
int volatile * zpu_spi_dma;
|
||
|
||
unsigned char volatile * zpu_pokey_audf0;
|
||
unsigned char volatile * zpu_pokey_audc0;
|
||
unsigned char volatile * zpu_pokey_audf1;
|
||
unsigned char volatile * zpu_pokey_audc1;
|
||
unsigned char volatile * zpu_pokey_audf2;
|
||
unsigned char volatile * zpu_pokey_audc2;
|
||
unsigned char volatile * zpu_pokey_audf3;
|
||
unsigned char volatile * zpu_pokey_audc3;
|
||
|
||
unsigned char volatile * zpu_pokey_audctl;
|
||
|
||
unsigned char volatile * zpu_pokey_skrest;
|
||
unsigned char volatile * zpu_pokey_serout;
|
||
unsigned char volatile * zpu_pokey_irqen;
|
||
unsigned char volatile * zpu_pokey_skctl;
|
||
|
||
unsigned char volatile * atari_nmien;
|
||
unsigned char volatile * atari_dlistl;
|
||
unsigned char volatile * atari_dlisth;
|
||
unsigned char volatile * atari_colbk;
|
||
unsigned char volatile * atari_colpf1;
|
||
unsigned char volatile * atari_colpf2;
|
||
unsigned char volatile * atari_colpf3;
|
||
unsigned char volatile * atari_colpf0;
|
||
unsigned char volatile * atari_prior;
|
||
unsigned char volatile * atari_random;
|
||
unsigned char volatile * atari_porta;
|
||
unsigned char volatile * atari_portb;
|
||
unsigned char volatile * atari_trig0;
|
||
unsigned char volatile * atari_chbase;
|
||
unsigned char volatile * atari_chactl;
|
||
unsigned char volatile * atari_dmactl;
|
||
unsigned char volatile * atari_skctl;
|
||
|
||
void* SRAM_BASE;
|
||
void* SDRAM_BASE;
|
||
void* atari_regbase;
|
||
void* atari_regmirror;
|
||
void* config_regbase;
|
||
|
||
#define SRAM_SIZE (512*1024)
|
||
#define SDRAM_SIZE (8*1024*1024)
|
||
#define ATARI_SIZE (64*1024)
|
||
#define CONFIG_SIZE (256)
|
||
|
||
uint8_t sram_memory[SRAM_SIZE];
|
||
uint32_t sdram_memory[SDRAM_SIZE / 4];
|
||
uint8_t atari_memory[ATARI_SIZE];
|
||
uint8_t atari_mirror_memory[ATARI_SIZE];
|
||
uint32_t config_memory[CONFIG_SIZE/4];
|
||
|
||
void init_memory(void)
|
||
{
|
||
memset(sram_memory, SRAM_SIZE, 0);
|
||
memset(sdram_memory, SDRAM_SIZE, 0);
|
||
memset(atari_memory, ATARI_SIZE, 0);
|
||
memset(atari_mirror_memory, ATARI_SIZE, 0);
|
||
memset(config_memory, CONFIG_SIZE, 0);
|
||
|
||
SRAM_BASE = sram_memory;
|
||
SDRAM_BASE = sdram_memory;
|
||
atari_regbase = atari_memory;
|
||
atari_regmirror = atari_mirror_memory;
|
||
config_regbase = config_memory;
|
||
|
||
zpu_in1 = (int *)(0*4+config_regbase);
|
||
zpu_in2 = (int *)(1*4+config_regbase);
|
||
zpu_in3 = (int *)(2*4+config_regbase);
|
||
zpu_in4 = (int *)(3*4+config_regbase);
|
||
|
||
zpu_out1 = (int *)(4*4+config_regbase);
|
||
zpu_out2 = (int *)(5*4+config_regbase);
|
||
zpu_out3 = (int *)(6*4+config_regbase);
|
||
zpu_out4 = (int *)(7*4+config_regbase);
|
||
|
||
zpu_pause = (int *)(8*4+config_regbase);
|
||
|
||
zpu_spi_data = (int *)(9*4+config_regbase);
|
||
zpu_spi_state = (int *)(10*4+config_regbase);
|
||
|
||
zpu_sio = (int *)(11*4+config_regbase);
|
||
|
||
zpu_board = (int *)(12*4+config_regbase);
|
||
|
||
zpu_spi_dma = (int *)(13*4+config_regbase);
|
||
|
||
zpu_pokey_audf0 = (unsigned char *)(0x10*4+config_regbase);
|
||
zpu_pokey_audc0 = (unsigned char *)(0x11*4+config_regbase);
|
||
zpu_pokey_audf1 = (unsigned char *)(0x12*4+config_regbase);
|
||
zpu_pokey_audc1 = (unsigned char *)(0x13*4+config_regbase);
|
||
zpu_pokey_audf2 = (unsigned char *)(0x14*4+config_regbase);
|
||
zpu_pokey_audc2 = (unsigned char *)(0x15*4+config_regbase);
|
||
zpu_pokey_audf3 = (unsigned char *)(0x16*4+config_regbase);
|
||
zpu_pokey_audc3 = (unsigned char *)(0x17*4+config_regbase);
|
||
|
||
zpu_pokey_audctl = (unsigned char *)(0x18*4+config_regbase);
|
||
|
||
zpu_pokey_skrest = (unsigned char *)(0x1a*4+config_regbase);
|
||
zpu_pokey_serout = (unsigned char *)(0x1d*4+config_regbase);
|
||
zpu_pokey_irqen = (unsigned char *)(0x1e*4+config_regbase);
|
||
zpu_pokey_skctl = (unsigned char *)(0x1f*4+config_regbase);
|
||
|
||
atari_nmien = (unsigned char *)(0xd40e + atari_regbase);
|
||
atari_dlistl = (unsigned char *)(0xd402 + atari_regbase);
|
||
atari_dlisth = (unsigned char *)(0xd403 + atari_regbase);
|
||
atari_colbk = (unsigned char *)(0xd01a + atari_regbase);
|
||
atari_colpf1 = (unsigned char *)(0xd017 + atari_regbase);
|
||
atari_colpf2 = (unsigned char *)(0xd018 + atari_regbase);
|
||
atari_colpf3 = (unsigned char *)(0xd019 + atari_regbase);
|
||
atari_colpf0 = (unsigned char *)(0xd016 + atari_regbase);
|
||
atari_prior = (unsigned char *)(0xd01b + atari_regbase);
|
||
atari_random = (unsigned char *)(0xd20a + atari_regbase);
|
||
atari_porta = (unsigned char *)(0xd300 + atari_regbase);
|
||
atari_portb = (unsigned char *)(0xd301 + atari_regbase);
|
||
atari_trig0 = (unsigned char *)(0xd010 + atari_regbase);
|
||
atari_chbase = (unsigned char *)(0xd409 + atari_regbase);
|
||
atari_chactl = (unsigned char *)(0xd401 + atari_regbase);
|
||
atari_dmactl = (unsigned char *)(0xd400 + atari_regbase);
|
||
atari_skctl = (unsigned char *)(0xd20f + atari_regbase);
|
||
|
||
// command line is high
|
||
*zpu_sio = 1;
|
||
// no trigger pressed
|
||
*atari_trig0 = 1;
|
||
}
|
||
|
firmware/linux/linux_memory.h | ||
---|---|---|
#ifndef LINUX_MEMORY_H
|
||
#define LINUX_MEMORY_H
|
||
|
||
void init_memory();
|
||
|
||
#endif
|
firmware/linux/main.c | ||
---|---|---|
#include <stdio.h>
|
||
|
||
#include "curses_screen.h"
|
||
#include "linux_helper.h"
|
||
#include "linux_memory.h"
|
||
|
||
int zpu_main(void);
|
||
|
||
extern char* sdcard_filename;
|
||
|
||
int main(int argc, char** argv)
|
||
{
|
||
if (argc > 1) {
|
||
sdcard_filename = argv[1];
|
||
}
|
||
|
||
if (init_curses_screen()) {
|
||
return 1;
|
||
}
|
||
|
||
init_memory();
|
||
|
||
if (setjmp(exit_jmp_buf) == 0) {
|
||
print_log("starting zpu_main\n");
|
||
zpu_main();
|
||
}
|
||
|
||
deinit_curses_screen();
|
||
return 0;
|
||
}
|
firmware/linux/memory.h | ||
---|---|---|
#ifndef MEMORY_H
|
||
#define MEMORY_H
|
||
|
||
extern void* SDRAM_BASE;
|
||
extern void* SRAM_BASE;
|
||
|
||
// Memory usage...
|
||
// 0x410000-0x44FFFF (0xc10000 in zpu space) = directory cache - 256k
|
||
// 0x450000-0x46FFFF (0xc50000 in zpu space) = freeze backup
|
||
// 0x700000-0x77FFFF (0xf00000 in zpu space) = os rom/basic rom
|
||
|
||
#define DIR_INIT_MEM (SDRAM_BASE + 0x410000)
|
||
#define DIR_INIT_MEMSIZE 262144
|
||
#define FREEZE_MEM (SDRAM_BASE + 0x450000)
|
||
|
||
// offset into SDRAM
|
||
#define ROM_OFS 0x700000
|
||
|
||
extern void* atari_regbase;
|
||
extern void* atari_regmirror;
|
||
extern void* config_regbase;
|
||
|
||
void init_memory(void);
|
||
|
||
#endif
|
firmware/linux/mmc.c | ||
---|---|---|
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <sys/types.h>
|
||
#include "mmc.h"
|
||
#include "curses_screen.h"
|
||
#include "linux_helper.h"
|
||
|
||
#define LOG(x...) print_log(x)
|
||
|
||
FILE * disk_image = NULL;
|
||
|
||
char mmc_sector_buffer[512];
|
||
|
||
void set_spi_clock_freq()
|
||
{
|
||
}
|
||
|
||
//! Initialize AVR<->MMC hardware interface.
|
||
/// Prepares hardware for MMC access.
|
||
|
||
void mmcInit(void)
|
||
{
|
||
if (!sdcard_filename) {
|
||
LOG("no sdcard\n");
|
||
return;
|
||
}
|
||
disk_image = fopen(sdcard_filename,"r+");
|
||
if (!disk_image) {
|
||
LOG("cannot open %s\n", sdcard_filename);
|
||
} else {
|
||
LOG("opened sdcard %s\n", sdcard_filename);
|
||
}
|
||
}
|
||
|
||
void mmc_init()
|
||
{
|
||
mmcInit();
|
||
}
|
||
|
||
|
||
//! Initialize the card and prepare it for use.
|
||
/// Returns zero if successful.
|
||
u08 mmcReset(void){ return 0;}
|
||
|
||
//! Read 512-byte sector from card to buffer
|
||
/// Returns zero if successful.
|
||
u08 mmcRead(u32 sector)
|
||
{
|
||
if (!disk_image) {
|
||
goto no_data;
|
||
}
|
||
//fprintf(stderr,"mmcRead:%x\n",sector);
|
||
|
||
if (fseek(disk_image, sector*512, SEEK_SET)) {
|
||
LOG("seek to sector %d failed\n", sector);
|
||
goto no_data;
|
||
}
|
||
if (fread(&mmc_sector_buffer,512,1,disk_image) != 1) {
|
||
LOG("reading sector %d failed\n", sector);
|
||
goto no_data;
|
||
}
|
||
|
||
return 0;
|
||
no_data:
|
||
memset(&mmc_sector_buffer, 0, 512);
|
||
return 0;
|
||
}
|
||
|
||
//! Write 512-byte sector from buffer to card
|
||
/// Returns zero if successful.
|
||
u08 mmcWrite(u32 sector)
|
||
{
|
||
if (!disk_image) {
|
||
goto no_data;
|
||
}
|
||
//fprintf(stderr,"mmcWrite:%x\n",sector);
|
||
|
||
if (fseek(disk_image, sector*512, SEEK_SET)) {
|
||
LOG("seek to sector %d failed\n", sector);
|
||
goto no_data;
|
||
}
|
||
if (fwrite(&mmc_sector_buffer,512,1,disk_image) != 1) {
|
||
LOG("reading sector %d failed\n", sector);
|
||
goto no_data;
|
||
}
|
||
return 0;
|
||
no_data:
|
||
return 0;
|
||
}
|
||
|
firmware/main.c | ||
---|---|---|
#include <alloca.h>
|
||
#include <sys/types.h>
|
||
#include "integer.h"
|
||
#include "regs.h"
|
||
... | ... | |
#include "simplefile.h"
|
||
#include "fileselector.h"
|
||
|
||
#ifdef LINUX_BUILD
|
||
#include "curses_screen.h"
|
||
#define after_set_reg_hook() display_out_regs()
|
||
#else
|
||
#define after_set_reg_hook() do { } while(0)
|
||
#endif
|
||
|
||
#include "atari_drive_emulator.h"
|
||
#include "memory.h"
|
||
|
||
... | ... | |
val |= op(param)<<shift; \
|
||
\
|
||
*reg = val; \
|
||
after_set_reg_hook(); \
|
||
}
|
||
|
||
#define BIT_REG_RO(op,mask,shift,name,reg) \
|
||
... | ... | |
int debug_adjust;
|
||
unsigned char volatile * baseaddr;
|
||
|
||
#ifdef LINUX_BUILD
|
||
void char_out(void* p, char c)
|
||
{
|
||
// get rid of unused parameter p warning
|
||
(void)(p);
|
||
int x, y;
|
||
x = debug_pos % 40;
|
||
y = debug_pos / 40;
|
||
display_char(x, y, c, debug_adjust == 128);
|
||
debug_pos++;
|
||
}
|
||
|
||
#else
|
||
void clearscreen()
|
||
{
|
||
unsigned volatile char * screen;
|
||
... | ... | |
++debug_pos;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
struct SimpleFile * files[6];
|
||
void loadromfile(struct SimpleFile * file, int size, size_t ram_address)
|
||
... | ... | |
}
|
||
}
|
||
|
||
#ifdef LINUX_BUILD
|
||
int zpu_main(void)
|
||
#else
|
||
int main(void)
|
||
#endif
|
||
{
|
||
/* disk_initialize();
|
||
{
|
||
... | ... | |
|
||
void actions()
|
||
{
|
||
#ifdef LINUX_BUILD
|
||
check_keys();
|
||
#endif
|
||
// Show some activity!
|
||
//*atari_colbk = *atari_random;
|
||
|
firmware/printf/printf.h | ||
---|---|---|
|
||
void tfp_format(void* putp,void (*putf) (void*,char),char *fmt, va_list va);
|
||
|
||
#define printf tfp_printf
|
||
#define sprintf tfp_sprintf
|
||
#define printf(x...) tfp_printf(x)
|
||
#define sprintf(x...) tfp_sprintf(x)
|
||
|
||
#endif
|
||
|
Also available in: Unified diff
Patch from Hias for local ncurses output. 0001-initial-version-of-linux-firmware-simulator.patch