Integrated filesystem.c into the gui and cleaned up mem.c

This commit is contained in:
Peter Rutenbar 2014-04-11 20:33:35 -04:00
parent e82172884e
commit ba8b9e80d1
10 changed files with 230 additions and 276 deletions

View File

@ -1,17 +1,10 @@
CC = clang
CFLAGS = -O3 -arch i386 -arch x86_64 -Wno-deprecated-declarations
LFLAGS = -framework OpenGL -framework GLUT
all: shoebill
shoebill: make_core
# shoebill: make_core test.c
# $(CC) $(LFLAGS) $(CFLAGS) -L intermediates -l shoebill_core test.c -o shoebill
make_core:
$(MAKE) -C core -j 4
clean:
rm -rf intermediates
rm -f shoebill

View File

@ -28,6 +28,7 @@
#include <string.h>
#include <time.h>
#include <stdint.h>
#include <assert.h>
#include "shoebill.h"
#include "coff.h"
@ -40,25 +41,37 @@ void symb_inorder(rb_node *cur) {
symb_inorder(cur->right);
}
#define _coff_buf_seek(__len) ({ \
uint32_t _result = 1, _len=(__len); \
if (_len > buflen) _result = 0; \
else bufptr = _len; \
_result; \
})
#define _coff_buf_read(_dst, __len) ({\
uint32_t _result = 1, _len=(__len); \
if ((bufptr + _len) > buflen) \
_result = 0; \
else {\
memcpy((_dst), buf+bufptr, _len); \
bufptr += _len; \
} \
_result; \
})
// Given a path to a COFF binary, create a coff_file structure and return a pointer.
// God help you if you want to free it.
coff_file* coff_parser(const char *path)
coff_file* coff_parse(uint8_t *buf, uint32_t buflen)
{
FILE *f;
uint8_t rawhead[20], *ptr;
uint32_t i;
coff_file *cf = NULL;
// Open the file
f = fopen(path, "r");
if (!f) {
printf("coff_parser: I couldn't open that binary for reading (%s)\n", path);
goto fail;
}
uint32_t bufptr = 0;
// Pull out 20 bytes (the file header)
if (fread(rawhead, 20, 1, f) != 1) {
printf("coff_parser: error: this binary is missing its file header\n");
if (!_coff_buf_read(rawhead, 20)) {
printf("coff_parse: error: this binary is missing its file header\n");
goto fail;
}
@ -86,7 +99,7 @@ coff_file* coff_parser(const char *path)
// pull out cf->opt_header bytes (a.out-format header, I guess?)
if (cf->opt_header_len > 0) {
uint8_t *opt = malloc(cf->opt_header_len);
if (fread(opt, cf->opt_header_len, 1, f) != 1) {
if (!_coff_buf_read(opt, cf->opt_header_len)) {
printf("coff_parse: I ran out of data pulling the optional header (%u bytes)\n", cf->opt_header_len);
free(opt);
goto fail;
@ -99,7 +112,7 @@ coff_file* coff_parser(const char *path)
for (i=0; i<cf->num_sections; i++) {
// read the header
uint8_t rawsec[40];
if (fread(rawsec, 40, 1, f) != 1) {
if (!_coff_buf_read(rawsec, 40)) {
printf("coff_parse: I ran out of data pulling section #%u\n", i+1);
goto fail;
}
@ -139,14 +152,14 @@ coff_file* coff_parser(const char *path)
}
// seek to the position in the binary that holds this section's raw data
if (fseek(f, cf->sections[i].data_ptr, SEEK_SET) != 0) {
if (!_coff_buf_seek(cf->sections[i].data_ptr)) {
printf("coff_parse: I couldn't seek to 0x%x in section %u\n", cf->sections[i].data_ptr, i+1);
goto fail;
}
// load the data and attach it to the section struct
data = malloc(cf->sections[i].sz); // FIXME: sz might not be a sane value
if (fread(data, cf->sections[i].sz, 1, f) != 1) {
if (!_coff_buf_read(data, cf->sections[i].sz)) {
printf("coff_parse: I couldn't fread section %u (%s)'s data (%u bytes)\n", i+1, cf->sections[i].name, cf->sections[i].sz);
free(data);
goto fail;
@ -164,14 +177,14 @@ coff_file* coff_parser(const char *path)
cf->symbols = (coff_symbol*)calloc(sizeof(coff_symbol), cf->num_symbols);
// Seek to the symbol table
if (fseek(f, cf->symtab_offset, SEEK_SET) != 0) {
if (!_coff_buf_seek(cf->symtab_offset)) {
printf("coff_parse: I couldn't seek to symtab_offset, 0x%x\n", cf->symtab_offset);
goto fail;
}
for (i=0; i < cf->num_symbols; i++) {
uint8_t raw_symb[18];
if (fread(raw_symb, 18, 1, f) != 1) {
if (!_coff_buf_read(raw_symb, 18)) {
printf("coff_parse: I ran out of data pulling symbol #%u\n", i+1);
goto fail;
}
@ -185,11 +198,11 @@ coff_file* coff_parser(const char *path)
// printf("Loading from external: base idx=0x%x, offset=%u, addr=0x%x\n", idx-offset, offset, idx);
if (fseek(f, idx, SEEK_SET) != 0) {
if (!_coff_buf_seek(idx)) {
printf("coff_parse: I ran out of data pulling symbol %u's name (idx=0x%x)\n", i+1, idx);
goto fail;
}
for (j=0; (fread(&tmp_name[j], 1, 1, f)==1) && tmp_name[j]; j++) {
for (j=0; (_coff_buf_read(&tmp_name[j], 1)) && tmp_name[j]; j++) {
if (j >= 255) {
// printf("coff_parse: this symbol's name is too long: %u\n", i+1);
goto fail;
@ -198,10 +211,7 @@ coff_file* coff_parser(const char *path)
cf->symbols[i].name = malloc(j+1);
memcpy(cf->symbols[i].name, tmp_name, j);
cf->symbols[i].name[j] = 0;
fseek(f, cf->symtab_offset + (i+1)*18, SEEK_SET);
//printf("cf->symtab_offset = 0x%x, i=%u, (i+1)*18 = %u\n",
//cf->symtab_offset, i, (i+1)*18);
//printf("seeking back to 0x%x\n", cf->symtab_offset + (i+1)*18);
_coff_buf_seek(cf->symtab_offset + (i+1)*18);
}
else {
uint8_t tmp_name[9];
@ -257,6 +267,28 @@ fail:
return NULL;
}
coff_file* coff_parse_from_path(const char *path)
{
FILE *f = fopen(path, "r");
uint8_t *buf = malloc(1);
uint32_t i=0, tmp;
coff_file *coff;
do {
buf = realloc(buf, i + 128*1024);
assert(buf);
tmp = fread(buf+i, 1, 128*1024, f);
i += tmp;
// don't load more than 64mb - there are surely no 64MB A/UX kernels
} while ((tmp > 0) && (i < 64*1024*1024));
coff = coff_parse(buf, i);
free(buf);
return coff;
}
// dump some data about a coff_file structure
void print_coff_info(coff_file *coff)
{

View File

@ -76,7 +76,8 @@ typedef struct {
coff_symbol* coff_find_func(coff_file *coff, uint32_t addr);
coff_symbol* coff_find_symbol(coff_file *coff, const char *name);
coff_file* coff_parser(const char *path);
coff_file* coff_parse(uint8_t *buf, uint32_t buflen);
coff_file* coff_parse_from_path(const char *path);
uint32_t be2native (uint8_t **dat, uint32_t bytes);
void print_coff_info(coff_file *coff);

View File

@ -641,8 +641,8 @@ uint32_t shoebill_initialize(shoebill_control_t *control)
uint32_t i, j, pc = 0xffffffff;
coff_file *coff = NULL;
scsi_device_t disks[8];
uint8_t *rom_data = NULL;
uint32_t rom_size = 0;
uint8_t *rom_data = NULL, *kernel_data = NULL;
uint32_t rom_size = 0, kernel_size;
memset(&disks[0], 0, 8 * sizeof(scsi_device_t));
memset(&shoe, 0, sizeof(global_shoebill_context_t));
@ -657,16 +657,26 @@ uint32_t shoebill_initialize(shoebill_control_t *control)
else if (!_load_rom(control, &rom_data, &rom_size))
goto fail;
// Try to open the disk images
if (!_open_disk_images(control, disks))
goto fail;
// Try to load the A/UX kernel
if (control->aux_kernel_path == NULL) {
sprintf(control->error_msg, "No A/UX kernel specified\n");
goto fail;
}
coff = coff_parser(control->aux_kernel_path);
else if (!control->scsi_devices[0].path || strlen((char*)control->scsi_devices[0].path)==0) {
sprintf(control->error_msg, "The root A/UX disk needs to be at scsi ID 0\n");
goto fail;
}
// Load the kernel from the disk at scsi id #0
kernel_data = shoebill_extract_kernel((char*)control->scsi_devices[0].path,
control->aux_kernel_path,
control->error_msg,
&kernel_size);
if (!kernel_data)
goto fail;
coff = coff_parse(kernel_data, kernel_size);
free(kernel_data);
if (coff == NULL) {
sprintf(control->error_msg, "Can't open that A/UX kernel [%s]\n",
@ -675,15 +685,13 @@ uint32_t shoebill_initialize(shoebill_control_t *control)
}
shoe.coff = coff;
// Try to open the disk images
if (!_open_disk_images(control, disks))
goto fail;
// Allocate and configure the rom and memory space
/*if (control->ram_size > (256 * 1024 * 1024)) {
// I think A/UX will go insane if you give it >256MB of memory
sprintf(control->error_msg, "%u bytes is too much memory\n", control->ram_size);
goto fail;
}
else */if (control->ram_size < (1024*1024)) {
if (control->ram_size < (1024*1024)) {
sprintf(control->error_msg, "%u bytes is too little ram\n", control->ram_size);
goto fail;
}
@ -712,12 +720,6 @@ uint32_t shoebill_initialize(shoebill_control_t *control)
if (!_load_aux_kernel(control, coff, &pc))
goto fail;
// HACK:
// for (i=0; i<0x4000; i++) {
// uint8_t c = pget(AUX_LOMEM_OFFSET + i, 1);
// pset(i, 1, c);
// }
/*
* Load it all into the internal global shoebill state
* (Can't fail after this point)

View File

@ -919,7 +919,7 @@ static uint8_t ufs_load_cylinder_group(ufs_t *mount, uint32_t frag_offset, ufs_c
uint32_t numfrags = sizeof(ufs_cylinder_group_t) / mount->frag_size;
numfrags += ((sizeof(ufs_cylinder_group_t) % mount->frag_size) != 0);
uint8_t *buf = p_alloc(mount->pool, numfrags * mount->frag_size);
uint8_t *buf = p_alloc(mount->pool, (numfrags+1) * mount->frag_size);
uint32_t i;
for (i=0; i <= numfrags; i++)

View File

@ -32,23 +32,19 @@
static void translate_logical_addr();
void _logical_get (void);
void logical_get (void) {
const uint32_t addr = shoe.logical_addr;
// uint8_t super = sr_s();
_logical_get();
// if ((addr >= 0x100) && (addr < 0x2000)) {
// printf("LOMEM READ: 0x%08x = 0x%llx\n", addr, shoe.logical_dat);
// }
}
void physical_get (void) {
switch (shoe.physical_addr) {
case 0 ... 0x3FFFFFFF: {
void *addr = &shoe.physical_mem_base[shoe.physical_addr & (shoe.physical_mem_size-1)];
switch (shoe.physical_addr >> 28) {
case 0:
case 1:
case 2:
case 3: { // RAM
void *addr;
if (shoe.physical_addr >= shoe.physical_mem_size)
addr = &shoe.physical_mem_base[shoe.physical_addr % shoe.physical_mem_size];
else
addr = &shoe.physical_mem_base[shoe.physical_addr];
switch (shoe.physical_size) {
case 4:
shoe.physical_dat = ntohl(*(uint32_t*)addr);
@ -72,7 +68,7 @@ void physical_get (void) {
}
assert(!"never get here");
}
case 0x40000000 ... 0x4FFFFFFF: { // ROM
case 4: { // ROM
void *addr = &shoe.physical_rom_base[shoe.physical_addr & (shoe.physical_rom_size-1)];
switch (shoe.physical_size) {
case 4:
@ -96,7 +92,7 @@ void physical_get (void) {
}
assert(!"never get here");
}
case 0x50000000 ... 0x50ffffff: { // IO
case 5: { // IO
switch (shoe.physical_addr & 0x5003ffff) {
case 0x50000000 ... 0x50001fff: // VIA1
via_reg_read();
@ -129,18 +125,28 @@ void physical_get (void) {
// assert(!"physical_get: got read to SCSI hi\n");
return ;
case 0x50014000 ... 0x50015fff: // Sound
printf("physical_get: got read to sound\n");
//printf("physical_get: got read to sound\n");
return ;
case 0x50016000 ... 0x50017fff: // SWIM (IWM?)
// printf("physical_get: got read to IWM\n");
shoe.physical_dat = iwm_dma_read();
return ;
default:
printf("physical_get: got read to UNKNOWN IO ADDR %x\n", shoe.physical_addr);
//printf("physical_get: got read to UNKNOWN IO ADDR %x\n", shoe.physical_addr);
return ;
}
}
case 0x60000000 ... 0xefffffff: { // Nubus super slot space
case 0xf: { // Nubus standard slot space
const uint32_t slot = (shoe.physical_addr >> 24) & 0xf;
if (shoe.slots[slot].connected)
shoe.physical_dat = shoe.slots[slot].read_func(shoe.physical_addr,
shoe.physical_size,
slot);
else
shoe.abort = 1; // throw a bus error for reads to disconnected slots
return ;
}
default: { // Nubus super slot space
const uint32_t slot = shoe.physical_addr >> 28;
if (shoe.slots[slot].connected)
shoe.physical_dat = shoe.slots[slot].read_func(shoe.physical_addr,
@ -151,32 +157,22 @@ void physical_get (void) {
// XXX: Do super slot accesses raise bus errors?
return ;
}
case 0xf0000000 ... 0xffffffff: {
const uint32_t slot = (shoe.physical_addr >> 24) & 0xf;
if (shoe.slots[slot].connected)
shoe.physical_dat = shoe.slots[slot].read_func(shoe.physical_addr,
shoe.physical_size,
slot);
else
shoe.abort = 1; // throw a bus error for reads to disconnected slots
return ;
}
default: {
printf("physical_get: I got an access to 0x%x (sz=%u), but I don't know how to handle it...\n",
shoe.physical_addr, shoe.physical_size);
shoe.physical_dat = 0;
return ;
}
}
}
void physical_set (void)
{
switch (shoe.physical_addr) {
case 0 ... 0x3FFFFFFF: { // The first RAM bank (64MB)
switch (shoe.physical_addr >> 28) {
case 0:
case 1:
case 2:
case 3: { // RAM
const uint32_t dat = htonl(shoe.physical_dat) >> ((4-shoe.physical_size)*8);
void *addr = &shoe.physical_mem_base[shoe.physical_addr & (shoe.physical_mem_size-1)];
void *addr;
if (shoe.physical_addr >= shoe.physical_mem_size)
addr = &shoe.physical_mem_base[shoe.physical_addr % shoe.physical_mem_size];
else
addr = &shoe.physical_mem_base[shoe.physical_addr];
switch (shoe.physical_size) {
case 4:
*((uint32_t*)addr) = dat;
@ -201,11 +197,11 @@ void physical_set (void)
}
assert(!"never get here");
}
case 0x40000000 ... 0x4FFFFFFF: { // ROM
case 4: { // ROM
// Nothing happens when you try to modify ROM
return ;
}
case 0x50000000 ... 0x50ffffff: { // IO
case 5: { // IO
switch (shoe.physical_addr & 0x5003ffff) {
case 0x50000000 ... 0x50001fff: // VIA1
via_reg_write();
@ -239,20 +235,11 @@ void physical_set (void)
iwm_dma_write();
return ;
default:
printf("physical_set: got write to UNKNOWN IO ADDR %x\n", shoe.physical_addr);
//printf("physical_set: got write to UNKNOWN IO ADDR %x\n", shoe.physical_addr);
return ;
}
}
case 0x60000000 ... 0xefffffff: { // Nubus super slot space
const uint32_t slot = shoe.physical_addr >> 28;
if (shoe.slots[slot].connected)
shoe.slots[slot].write_func(shoe.physical_addr,
shoe.physical_size,
shoe.physical_dat,
slot);
return ;
}
case 0xf0000000 ... 0xffffffff: { // Nubus standard slot space
case 0xf: { // Nubus standard slot space
const uint32_t slot = (shoe.physical_addr >> 24) & 0xf;
if (shoe.slots[slot].connected)
shoe.slots[slot].write_func(shoe.physical_addr,
@ -262,16 +249,19 @@ void physical_set (void)
return ;
// Writing to a disconnected slot won't cause a bus error on macii
}
default: {
printf("physical_set: I got a write (addr=0x%x) (val=0x%llx) (sz=%u), but I don't know how to handle it...\n",
shoe.physical_addr, shoe.physical_dat, shoe.physical_size);
default: { // Nubus super slot space
const uint32_t slot = shoe.physical_addr >> 28;
if (shoe.slots[slot].connected)
shoe.slots[slot].write_func(shoe.physical_addr,
shoe.physical_size,
shoe.physical_dat,
slot);
return ;
}
}
}
void _logical_get (void)
void logical_get (void)
{
// If address translation isn't enabled, this is a physical address
@ -298,15 +288,15 @@ void _logical_get (void)
shoe.logical_is_write = 0;
// If the the data access will wrap across multiple pages, then fuck
// This read crosses a page boundary
if ((pageoffset + logical_size - 1) >> ps) {
const uint32_t addr_a = shoe.logical_addr;
const uint32_t size_b = (pageoffset + logical_size) & pagemask;
const uint32_t size_a = shoe.logical_size - size_b;
const uint32_t addr_b = addr_a + size_a;
printf("ps = %u, pagesize=%u, pagemask=%x, pageoffset=%x\n", ps, pagesize, pagemask, pageoffset);
printf("multiple page get: addr_a=0x%08x size_a=%u addr_b=0x%08x size_b=%u\n", addr_a, size_a, addr_b, size_b);
// printf("ps = %u, pagesize=%u, pagemask=%x, pageoffset=%x\n", ps, pagesize, pagemask, pageoffset);
// printf("multiple page get: addr_a=0x%08x size_a=%u addr_b=0x%08x size_b=%u\n", addr_a, size_a, addr_b, size_b);
shoe.logical_addr = addr_a;
shoe.logical_size = size_a;
translate_logical_addr();
@ -338,11 +328,11 @@ void _logical_get (void)
return ;
}
printf("multiple_page_get: p_addr_a = 0x%08x, p_addr_b = 0x%08x\n", p_addr_a, p_addr_b);
// printf("multiple_page_get: p_addr_a = 0x%08x, p_addr_b = 0x%08x\n", p_addr_a, p_addr_b);
shoe.logical_dat = (fetch_a << (size_b*8)) | shoe.physical_dat;
printf("multiple_page_get: logical_dat = (%llx | %llx) = %llx\n", fetch_a, shoe.physical_dat, shoe.logical_dat);
// printf("multiple_page_get: logical_dat = (%llx | %llx) = %llx\n", fetch_a, shoe.physical_dat, shoe.logical_dat);
return ;
}
@ -365,16 +355,6 @@ void _logical_get (void)
void logical_set (void)
{
if ((shoe.logical_addr >= 0xaf2) && (shoe.logical_addr < 0xaf6) && (shoe.logical_size == 1) && ((shoe.logical_dat&0xff) == 0xff)) {
shoe.logical_dat = 0;
}
// if ((shoe.logical_addr >= 0x12fffff6) && (shoe.logical_addr <= 0x12ffffff))
// printf("aux3: setting 0x%08x = 0x%x\n", shoe.logical_addr, (uint32_t)shoe.logical_dat);
//
// if ((shoe.logical_addr >= 0x100) && (shoe.logical_addr < 0x2000)) {
// printf("LOMEM WRITE: 0x%08x = 0x%x\n", shoe.logical_addr, (uint32_t) shoe.logical_dat);
// }
// If address translation isn't enabled, this is a physical address
if (!tc_enable()) {
shoe.physical_addr = shoe.logical_addr;
@ -395,7 +375,7 @@ void logical_set (void)
// Make the translate function fail if the page is write-protected
shoe.logical_is_write = 1;
// If the the data access will wrap across multiple pages, then fuck
// This write crosses a page boundary
if ((pageoffset + logical_size - 1) >> ps) {
const uint32_t addr_a = shoe.logical_addr;
const uint32_t size_b = (pageoffset + logical_size) & pagemask;
@ -404,8 +384,8 @@ void logical_set (void)
const uint64_t data_a = shoe.logical_dat >> (size_b*8);
const uint64_t data_b = bitchop_64(shoe.logical_dat, size_b*8);
printf("ps = %u, pagesize=%u, pagemask=%x, pageoffset=%x\n", ps, pagesize, pagemask, pageoffset);
printf("multiple page set: addr_a=0x%08x size_a=%u addr_b=0x%08x size_b=%u\n", addr_a, size_a, addr_b, size_b);
// printf("ps = %u, pagesize=%u, pagemask=%x, pageoffset=%x\n", ps, pagesize, pagemask, pageoffset);
// printf("multiple page set: addr_a=0x%08x size_a=%u addr_b=0x%08x size_b=%u\n", addr_a, size_a, addr_b, size_b);
shoe.logical_addr = addr_a;
shoe.logical_size = size_a;
@ -421,7 +401,7 @@ void logical_set (void)
return ;
const uint32_t p_addr_b = shoe.physical_addr;
printf("multiple page set: paddr_a=0x%08x (data_a=0x%llx) paddr_b=0x%08x (data_b=0x%llx) (orig_dat=0x%llx)\n", p_addr_a, data_a, p_addr_b, data_b, shoe.logical_dat);
// printf("multiple page set: paddr_a=0x%08x (data_a=0x%llx) paddr_b=0x%08x (data_b=0x%llx) (orig_dat=0x%llx)\n", p_addr_a, data_a, p_addr_b, data_b, shoe.logical_dat);
shoe.physical_addr = p_addr_a;
shoe.physical_size = size_a;
@ -483,9 +463,8 @@ struct {
static void translate_logical_addr()
{
const uint8_t use_srp = (tc_sre() && (shoe.logical_fc >= 4));
uint32_t debug_predicted = 0;
// First check for an entry in pmmu_cache
/* --- First check for an entry in pmmu_cache --- */
// logical addr [is]xxxxxxxxxxxx[ps] -> value xxxxxxxxxxxx
const uint32_t value = (shoe.logical_addr << tc_is()) >> (tc_is() + tc_ps());
@ -507,7 +486,6 @@ static void translate_logical_addr()
const uint32_t ps_mask = 0xffffffff >> entry.used_bits;
const uint32_t v_mask = ~~ps_mask;
shoe.physical_addr = ((entry.physical_addr<<8) & v_mask) + (shoe.logical_addr & ps_mask);
// debug_predicted = ((entry.physical_addr<<8) & v_mask) + (shoe.logical_addr & ps_mask);
return ;
}
// This should be rare, just let the lookup handle it
@ -517,6 +495,7 @@ static void translate_logical_addr()
// Values don't match, this is a different address
}
/* --- pmmu_cache miss, manually traverse the page tables to do the translation */
uint64_t *rootp_ptr = (use_srp ? (&shoe.srp) : (&shoe.crp));
const uint64_t rootp = *rootp_ptr;
@ -549,7 +528,8 @@ static void translate_logical_addr()
if (rp_dt(rootp) == 1)
goto search_done;
for (i=0; i < 4; i++) { // (the condition is unnecessary - just leaving it in for clarity)
// for (i=0; i < 4; i++) { // (the condition is unnecessary - just leaving it in for clarity)
for (i=0; 1; i++) {
// desc must be a table descriptor here
const uint8_t ti = tc_ti(i);
@ -562,8 +542,6 @@ static void translate_logical_addr()
logical_addr <<= ti;
// load the child descriptor
if (shoe.logical_addr == 0)
printf("Loading descriptor s=%llu from addr=0x%08x\n", desc_dt(desc, desc_size) & 1, (uint32_t)desc_table_addr(desc));
const uint32_t table_base_addr = desc_table_addr(desc);
const uint8_t s = desc_dt(desc, desc_size) & 1;
@ -571,11 +549,9 @@ static void translate_logical_addr()
get_desc(table_base_addr + (4 << s)*index, (4 << s));
desc_size = s;
// Desc may be a table descriptor, page descriptor, or indirect descriptor
// Desc may be a table descriptor, page descriptor, indirect descriptor, or invalid descriptor
const uint8_t dt = desc_dt(desc, desc_size);
if (shoe.logical_addr == 0)
printf("i=%u desc = 0x%llx dt=%u\n", i, desc, dt);
// If this descriptor is invalid, throw a bus error
if (dt == 0) {
@ -620,6 +596,7 @@ search_done:
// Desc must be a page descriptor
// NOTE: The limit checks have been done already
// (or would be, if they were implemented yet)
// TODO: update U (used) bit
@ -643,11 +620,11 @@ search_done:
const uint32_t paddr = (desc_page_addr(desc) & v_mask) + (shoe.logical_addr & ps_mask);
shoe.physical_addr = paddr;
if (shoe.logical_addr == 0) {
/*if (shoe.logical_addr == 0) {
printf("Success! desc = 0x%llx sz=%u bytes\n", desc, 4<<desc_size);
printf("OLD: desc_page_addr() = 0x%08x, physical addr = 0x%08x\n", desc_page_addr(desc), (desc_page_addr(desc) & v_mask) + (shoe.logical_addr & ps_mask));
printf("CUR: desc_page_addr() = 0x%08x, physical addr = 0x%08x\n", desc_page_addr(desc), shoe.physical_addr);
}
}*/
// Insert this translation into the cache
@ -816,7 +793,7 @@ static void ea_decode_extended()
return ;
}
default:
printf("ea_decode_extended: oh noes! invalid I/IS!\n");
assert(!"ea_decode_extended: oh noes! invalid I/IS!\n");
// I think that 68040 *doesn't* throw an exception here...
// FIXME: figure out what actually happens here
break;
@ -916,10 +893,9 @@ void ea_read()
}
return ;
}
case 5 ... 7: {
default:
throw_illegal_instruction();
return ;
}
}
}
}
@ -929,15 +905,11 @@ void ea_read_commit()
{
const uint8_t mode = (shoe.mr>>3)&7, reg = (shoe.mr&7);
switch (mode) {
case 0: { // Data register direct mode
case 0: // Data register direct mode
case 1: // address register direct mode
case 2: // address register indirect mode
return ; // nothing to do
}
case 1: { // address register direct mode
return ; // nothing to do
}
case 2: { // address register indirect mode
return ; // nothing to do
}
case 3: { // address register indirect with postincrement mode
const uint8_t delta = ((reg==7) && (shoe.sz==1))?2:shoe.sz;
shoe.a[reg] += delta;
@ -954,9 +926,7 @@ void ea_read_commit()
return ;
}
case 6: {
//printf("ea_read_commit(): %u %u not implemented\n", mode, reg);
ea_decode_extended();
if (shoe.abort) return ;
// shoe.extended_len was set in the previous ea_read() call.
shoe.pc += shoe.extended_len;
return ;
}
@ -985,10 +955,9 @@ void ea_read_commit()
else shoe.pc += shoe.sz;
return ;
}
case 5 ... 7: {
default:
throw_illegal_instruction();
return ;
}
}
}
}
@ -1004,7 +973,6 @@ void ea_write()
}
case 1: { // address register direct mode
assert(shoe.sz==4);
//set_a(reg, shoe.dat, shoe.sz);
shoe.a[reg] = shoe.dat;
return ;
}
@ -1034,13 +1002,13 @@ void ea_write()
return ;
}
case 6: {
//printf("ea_write(): %u %u not implemented\n", mode, reg);
ea_decode_extended();
if (shoe.abort) return ;
lset(shoe.extended_addr, shoe.sz, shoe.dat);
if (shoe.abort) return ;
shoe.pc += shoe.extended_len;
//printf("write(0x%x) = 0x%x\n", shoe.extended_addr, shoe.dat);
return ;
}
case 7: {
@ -1057,27 +1025,12 @@ void ea_write()
// printf("ea_write(): %u %u not implemented\n", mode, reg);
return ;
}
case 2: { // program counter indirect with displacement mode
printf("ea_write(): %u %u not implemented\n", mode, reg);
throw_illegal_instruction();
return ;
}
case 3: { // (program counter ...)
printf("ea_write(): %u %u not implemented\n", mode, reg);
throw_illegal_instruction();
return ;
}
case 4: { // immediate data
printf("ea_write(): %u %u not implemented\n", mode, reg);
throw_illegal_instruction();
return ;
}
case 5 ... 7: {
throw_illegal_instruction();
return ;
}
}
}
// fall through
default:
throw_illegal_instruction();
return ;
}
}
@ -1085,35 +1038,16 @@ void ea_addr()
{
const uint8_t mode = (shoe.mr>>3)&7, reg = (shoe.mr&7);
switch (mode) {
case 0: { // Data register direct mode
// this must be invalid. Figure out which exception this throws.
printf("ea_addr(): %u %u not implemented, pc = 0x%08x\n", mode, reg, shoe.orig_pc);
return ;
}
case 1: { // address register direct mode
printf("ea_addr(): %u %u not implemented\n", mode, reg);
// this must be invalid. Figure out which exception this throws.
return ;
}
case 2: { // address register indirect mode
shoe.dat = shoe.a[reg];
return ;
}
case 3: { // address register indirect with postincrement mode
printf("ea_addr(): %u %u not implemented\n", mode, reg);
return ;
}
case 4: { // address register indirect with predecrement mode
printf("ea_addr(): %u %u not implemented\n", mode, reg);
return ;
}
case 5: { // address register indirect with displacement mode
int16_t disp = nextword(shoe.pc);
shoe.dat = shoe.a[reg] + disp;
return ;
}
case 6: {
// printf("ea_addr(): %u %u not implemented\n", mode, reg);
ea_decode_extended();
if (shoe.abort) return ;
shoe.dat = shoe.extended_addr;
@ -1146,16 +1080,11 @@ void ea_addr()
shoe.pc += shoe.extended_len;
return ;
}
case 4: { // immediate data
printf("ea_addr(): %u %u not implemented, pc = 0x%08x\n", mode, reg, shoe.orig_pc);
return ;
}
case 5 ... 7: {
throw_illegal_instruction();
return ;
}
}
}
default:
throw_illegal_instruction();
return ;
}
}
@ -1169,7 +1098,3 @@ void ea_addr()

View File

@ -33,9 +33,9 @@
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
uint32_t i;
[defaults setObject:@"" forKey:@"kernelPath"];
[defaults setObject:@"/unix" forKey:@"rootKernelPath"];
[defaults setObject:@"" forKey:@"romPath"];
[defaults setInteger:NSOffState forKey:@"verboseState"];
[defaults setInteger:NSOnState forKey:@"verboseState"];
[defaults setInteger:16 forKey:@"memorySize"];
[defaults setInteger:640 forKey:@"screenWidth"];
@ -55,6 +55,10 @@
if (!isInitialized)
[self createFirstTimeUserDefaults];
// Going from 0.0.1 to 0.0.2 leaves rootKernelPath uninitialized
if ([defaults objectForKey:@"rootKernelPath"] == nil)
[defaults setObject:@"/unix" forKey:@"rootKernelPath"];
}

View File

@ -219,12 +219,12 @@
uint32_t i;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *kernelPathStr = [defaults objectForKey:@"kernelPath"];
NSString *rootKernelPathStr = [defaults objectForKey:@"rootKernelPath"];
NSString *romPathStr = [defaults objectForKey:@"romPath"];
NSInteger verboseState = [defaults integerForKey:@"verboseState"];
NSInteger memsize = [defaults integerForKey:@"memorySize"];
if (kernelPathStr == Nil || [kernelPathStr length]==0) {
if (rootKernelPathStr == Nil || [rootKernelPathStr length]==0) {
[self complain:@"Kernel path invalid!"];
return NO;
}
@ -256,14 +256,14 @@
}
char *kernelPathCString = strdup([kernelPathStr UTF8String]);
char *rootKernelPathCString = strdup([rootKernelPathStr UTF8String]);
char *romPathCString = strdup([romPathStr UTF8String]);
// FIXME: I'm leaking these strings. Stop leaking stuff when the UI is more finalized
control.aux_verbose = (verboseState == NSOnState);
control.ram_size = (uint32_t)memsize * 1024 * 1024;
control.aux_kernel_path = kernelPathCString;
control.aux_kernel_path = rootKernelPathCString;
control.rom_path = romPathCString;
*width = screenWidthValue;

View File

@ -37,7 +37,7 @@
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *kernelPathStr = [defaults objectForKey:@"kernelPath"];
NSString *rootKernelPathStr = [defaults objectForKey:@"rootKernelPath"];
NSString *romPathStr = [defaults objectForKey:@"romPath"];
NSInteger verboseState = [defaults integerForKey:@"verboseState"];
NSInteger memsize = [defaults integerForKey:@"memorySize"];
@ -59,7 +59,7 @@
NSString *scsiPath6Str = [defaults objectForKey:@"scsiPath6"];
if (romPath) [romPath setStringValue:romPathStr];
if (kernelPath) [kernelPath setStringValue:kernelPathStr];
if (kernelPath) [kernelPath setStringValue:rootKernelPathStr];
[verbose setState:verboseState];
[memorySize setStringValue:[NSString stringWithFormat:@"%u", (uint32_t)memsize]];
@ -112,9 +112,7 @@
NSString *buttonID = [sender identifier];
NSTextField *field;
if ([buttonID isEqualToString:@"kernelPathBrowse"])
field = kernelPath;
else if ([buttonID isEqualToString:@"romPathBrowse"])
if ([buttonID isEqualToString:@"romPathBrowse"])
field = romPath;
else if ([buttonID isEqualToString:@"scsiPath0Browse"])
field = scsiPath0;
@ -139,7 +137,7 @@
- (IBAction)applyPressed:(id)sender
{
NSString *kernelPathStr = [kernelPath stringValue];
NSString *rootKernelPathStr = [kernelPath stringValue];
NSString *romPathStr = [romPath stringValue];
NSInteger verboseState = [verbose state];
NSInteger memsize = [memorySize integerValue];
@ -157,7 +155,7 @@
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:kernelPathStr forKey:@"kernelPath"];
[defaults setObject:rootKernelPathStr forKey:@"rootKernelPath"];
[defaults setObject:romPathStr forKey:@"romPath"];
[defaults setInteger:verboseState forKey:@"verboseState"];
[defaults setInteger:memsize forKey:@"memorySize"];

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4514" systemVersion="13B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5053" systemVersion="13C64" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment defaultVersion="1080" identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4514"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5053"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="shoePreferencesWindowController">
<connections>
<outlet property="kernelPath" destination="ZXf-9X-ulR" id="fFe-5B-6dc"/>
<outlet property="kernelPath" destination="zU0-5O-afD" id="Q3V-Ly-Y6B"/>
<outlet property="memorySize" destination="uvm-gd-pCd" id="zzI-jI-ZUW"/>
<outlet property="romPath" destination="LoN-Nd-9cy" id="R3k-vY-TPo"/>
<outlet property="screenHeight" destination="Wyt-jg-xmk" id="Sq6-IJ-xbQ"/>
@ -19,13 +19,13 @@
<outlet property="scsiPath4" destination="Biz-iI-IiP" id="gbh-Jl-dxV"/>
<outlet property="scsiPath5" destination="GE2-3P-G1I" id="ohD-Fj-EX9"/>
<outlet property="scsiPath6" destination="cy8-jg-woV" id="QoH-Z0-e8d"/>
<outlet property="verbose" destination="RnS-Yp-G7M" id="VjB-1f-ejM"/>
<outlet property="verbose" destination="fkL-RE-iRz" id="uba-U2-Zkh"/>
<outlet property="window" destination="rKy-wc-8AE" id="sYz-fH-ohd"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<window title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" wantsToBeColor="NO" visibleAtLaunch="NO" animationBehavior="default" id="rKy-wc-8AE">
<window title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="rKy-wc-8AE">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="498" height="433"/>
@ -40,21 +40,12 @@
<font key="font" metaFont="system"/>
<tabViewItems>
<tabViewItem label="General" identifier="1" id="Ffn-1Z-2rp">
<view key="view" ambiguous="YES" id="BF8-Dm-rF5">
<view key="view" id="BF8-Dm-rF5">
<rect key="frame" x="10" y="33" width="452" height="348"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Nqd-aN-fI5">
<rect key="frame" x="12" y="311" width="81" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" alignment="right" title="Kernel Path:" usesSingleLineMode="YES" id="i7G-KP-OrH">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oVj-nA-5GP">
<rect key="frame" x="12" y="264" width="81" height="17"/>
<rect key="frame" x="11" y="314" width="81" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" alignment="right" title="Rom Path:" usesSingleLineMode="YES" id="7qD-i1-FXI">
<font key="font" metaFont="system"/>
@ -62,28 +53,8 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</textFieldCell>
</textField>
<button identifier="kernelPathBrowse" verticalHuggingPriority="750" fixedFrame="YES" tag="9" translatesAutoresizingMaskIntoConstraints="NO" id="Dep-2G-fPK">
<rect key="frame" x="359" y="300" width="97" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Browse..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Dnb-hA-OHJ">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="browsePressed:" target="-2" id="hW9-m5-Ovo"/>
</connections>
</button>
<textField identifier="kernelPath" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZXf-9X-ulR">
<rect key="frame" x="99" y="289" width="258" height="39"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="unix" drawsBackground="YES" id="gUb-0H-eoA">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button identifier="romPathBrowse" verticalHuggingPriority="750" fixedFrame="YES" tag="9" translatesAutoresizingMaskIntoConstraints="NO" id="fjl-Jg-nIF">
<rect key="frame" x="359" y="253" width="97" height="32"/>
<rect key="frame" x="358" y="303" width="97" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="push" title="Browse..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ITb-nX-hmP">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -94,7 +65,7 @@
</connections>
</button>
<textField identifier="romPath" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LoN-Nd-9cy">
<rect key="frame" x="99" y="242" width="258" height="39"/>
<rect key="frame" x="98" y="292" width="258" height="39"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="macii.rom" drawsBackground="YES" id="IvC-yQ-qdn">
<font key="font" metaFont="system"/>
@ -103,7 +74,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RDI-wU-bdg">
<rect key="frame" x="3" y="217" width="90" height="17"/>
<rect key="frame" x="2" y="267" width="90" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" alignment="right" title="Memory (MB):" usesSingleLineMode="YES" id="8mu-le-9YC">
<font key="font" metaFont="system"/>
@ -112,7 +83,7 @@
</textFieldCell>
</textField>
<textField identifier="memorySize" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uvm-gd-pCd">
<rect key="frame" x="99" y="212" width="42" height="22"/>
<rect key="frame" x="98" y="262" width="42" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" title="8" placeholderString="8" drawsBackground="YES" id="I5v-kb-eCo">
<font key="font" metaFont="system"/>
@ -121,7 +92,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tgt-1x-QT0">
<rect key="frame" x="3" y="160" width="90" height="42"/>
<rect key="frame" x="2" y="210" width="90" height="42"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" allowsUndo="NO" alignment="right" title="Screen Resolution:" id="9bl-WA-bhb">
<font key="font" metaFont="system"/>
@ -130,7 +101,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JNe-0k-g4e">
<rect key="frame" x="147" y="174" width="14" height="17"/>
<rect key="frame" x="146" y="224" width="14" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" allowsUndo="NO" alignment="center" title="x" id="9cf-Xq-tuu">
<font key="font" metaFont="system"/>
@ -139,7 +110,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aSg-xG-o1t">
<rect key="frame" x="224" y="173" width="59" height="17"/>
<rect key="frame" x="223" y="223" width="59" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" allowsUndo="NO" alignment="left" title="pixels" id="D5V-Zm-Grd">
<font key="font" metaFont="system"/>
@ -148,7 +119,7 @@
</textFieldCell>
</textField>
<textField identifier="memorySize" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EMf-gC-m9T">
<rect key="frame" x="99" y="170" width="43" height="22"/>
<rect key="frame" x="98" y="220" width="43" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" title="width" placeholderString="width" drawsBackground="YES" id="sbq-WW-C05">
<font key="font" metaFont="system"/>
@ -157,7 +128,7 @@
</textFieldCell>
</textField>
<textField identifier="memorySize" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Wyt-jg-xmk">
<rect key="frame" x="169" y="170" width="49" height="22"/>
<rect key="frame" x="168" y="220" width="49" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" title="height" placeholderString="height" drawsBackground="YES" id="qvE-Bk-NDl">
<font key="font" metaFont="system"/>
@ -165,14 +136,6 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button identifier="verbose" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RnS-Yp-G7M">
<rect key="frame" x="295" y="210" width="142" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="A/UX Verbose Boot" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Ww6-qg-dn1">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews>
</view>
</tabViewItem>
@ -387,6 +350,42 @@
</subviews>
</view>
</tabViewItem>
<tabViewItem label="Booting" identifier="" id="3o8-Ma-LAk">
<view key="view" ambiguous="YES" id="Zdy-ik-svz">
<rect key="frame" x="10" y="33" width="452" height="348"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0nJ-ho-P1P">
<rect key="frame" x="6" y="315" width="81" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" alignment="right" title="Kernel Path:" usesSingleLineMode="YES" id="Wdx-2C-yGA">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</textFieldCell>
</textField>
<textField identifier="kernelPath" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zU0-5O-afD">
<rect key="frame" x="93" y="310" width="342" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<string key="toolTip">The path to the kernel on the root image. If you don't know what this is, just use "/unix" (Note: the root image needs to be at SCSI ID 0)</string>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="/unix" drawsBackground="YES" id="0MQ-1P-9gJ">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button identifier="verbose" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fkL-RE-iRz">
<rect key="frame" x="6" y="271" width="142" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<string key="toolTip">Verbose mode causes A/UX to print diagnostic info during boot, and it will also run fsck to repair the root filesystem if necessary.</string>
<buttonCell key="cell" type="check" title="A/UX Verbose Boot" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="htQ-zH-VRv">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
<button identifier="applyAndRun" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="r8k-B7-iXM">
@ -435,4 +434,4 @@ Gw
</connections>
</window>
</objects>
</document>
</document>