Code reorganization
This commit is contained in:
parent
635a7f58a7
commit
87534ab708
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Linux",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"defines": [],
|
||||||
|
"compilerPath": "/usr/local/bin/cc65816",
|
||||||
|
"cStandard": "c17",
|
||||||
|
"cppStandard": "gnu++17",
|
||||||
|
"intelliSenseMode": "linux-gcc-x64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Calypsi",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**",
|
||||||
|
"/usr/local/lib/calypsi-65816/include/"
|
||||||
|
],
|
||||||
|
"defines": [],
|
||||||
|
"compilerPath": "/usr/local/bin/cc65816",
|
||||||
|
"cStandard": "c11",
|
||||||
|
"cppStandard": "gnu++17",
|
||||||
|
"intelliSenseMode": "linux-clang-x64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"C_Cpp.errorSquiggles": "disabled"
|
||||||
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
//*****************************************************************************
|
// SPDX-License-Identifier: MIT
|
||||||
// 65X-DOS
|
|
||||||
//
|
//
|
||||||
// include/config.h
|
// include/kernel/config.h
|
||||||
//*****************************************************************************
|
// Global configuration header for 65X-DOS kernel
|
||||||
|
//
|
||||||
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
|
|
@ -1,113 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
//
|
|
||||||
// kernel/device.h
|
|
||||||
// Driver declarations.
|
|
||||||
//
|
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#ifdef __CALYPSI_CC__
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
// This symbol determines the maximum number of device drivers which
|
|
||||||
// can be in memory.
|
|
||||||
#ifndef DEVICE_MAX
|
|
||||||
#define DEVICE_MAX 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This symbol determines the maximum number of device map entries which
|
|
||||||
// ca be in memory.
|
|
||||||
#ifndef DEVICE_MAP_MAX
|
|
||||||
#define DEVICE_MAP_MAX 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Forward declaration.
|
|
||||||
struct file;
|
|
||||||
|
|
||||||
// A device, in this context, is a code module which exposes a defined set
|
|
||||||
// of functions for interacting with files and file-like data. It is not specific
|
|
||||||
// as to the nature of the underlying data storage. It is equally valid for a
|
|
||||||
// device to use a block of RAM or a serial device as it is a hard drive
|
|
||||||
// or SD card.
|
|
||||||
//
|
|
||||||
// None of these functions are required to actually do anyting if it is not
|
|
||||||
// sensible for the kind of device being used; for example, it is not
|
|
||||||
// sensible for an inherently read-only device to support moving or
|
|
||||||
// renaming files.
|
|
||||||
typedef struct {
|
|
||||||
// Initialize the device.
|
|
||||||
int (*init)(void);
|
|
||||||
|
|
||||||
// Opens a file, given a pathname.
|
|
||||||
int (*open)(struct file *file);
|
|
||||||
|
|
||||||
// Closes an open file, given a unique ID.
|
|
||||||
int (*close)(struct file *file);
|
|
||||||
|
|
||||||
// Seeks within an open file, given a unique ID and a length.
|
|
||||||
int (*seek)(struct file *file, long length);
|
|
||||||
|
|
||||||
// Reads data from the specified file.
|
|
||||||
int (*read)(struct file *file, void *dest, size_t length);
|
|
||||||
|
|
||||||
// Writes data to the specified file.
|
|
||||||
int (*write)(struct file *file, void *src, size_t length);
|
|
||||||
|
|
||||||
// Perform driver-specific operations.
|
|
||||||
int (*ioctl)(struct file *file,
|
|
||||||
unsigned short operation,
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
// Creates the specified file given a pathname.
|
|
||||||
int (*create)(struct file *file);
|
|
||||||
|
|
||||||
// Copies the specified file using the specified names.
|
|
||||||
int (*copy)(struct file *src,
|
|
||||||
struct file *dest);
|
|
||||||
|
|
||||||
// Moves the specified file using the specified names.
|
|
||||||
int (*move)(struct file *src,
|
|
||||||
struct file *dest);
|
|
||||||
|
|
||||||
// Gets the size of the file.
|
|
||||||
int (*get_file_size)(struct file *file, size_t *size);
|
|
||||||
|
|
||||||
// Fills out the metadata in the specified file from the pathname
|
|
||||||
// in the provided file.
|
|
||||||
int (*init_file)(struct file *file);
|
|
||||||
} Device;
|
|
||||||
|
|
||||||
// The device map is a table that maps device names, such as SD0: or
|
|
||||||
// TTY2: to the device driver that manages the device.
|
|
||||||
struct device_map {
|
|
||||||
char *name;
|
|
||||||
unsigned short major_number;
|
|
||||||
unsigned short minor_number;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The global table of device drivers.
|
|
||||||
extern Device *device[DEVICE_MAX];
|
|
||||||
|
|
||||||
// The global map of device names to device modules.
|
|
||||||
extern struct device_map *device_map[DEVICE_MAP_MAX];
|
|
||||||
|
|
||||||
// Initialize all the device drivers. This is called once, at boot.
|
|
||||||
// It protects itself against being called again without a reset.
|
|
||||||
void device_init_all(void);
|
|
||||||
|
|
||||||
// Binds a device name to a device.
|
|
||||||
int device_bind_name(char *name,
|
|
||||||
unsigned short major_number,
|
|
||||||
unsigned short minor_number);
|
|
||||||
|
|
||||||
// Unbinds a bound device name.
|
|
||||||
int device_unbind_name(char *name);
|
|
||||||
|
|
||||||
// Get a bound device by its name.
|
|
||||||
int device_get_by_name(char *name, Device **device);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,79 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
//
|
|
||||||
// kernel/file.h
|
|
||||||
// File related declarations
|
|
||||||
//
|
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "kernel/device.h"
|
|
||||||
|
|
||||||
enum file_type {
|
|
||||||
FILE_TYPE_NORMAL,
|
|
||||||
FILE_TYPE_DIRECTORY,
|
|
||||||
FILE_TYPE_DEVICE
|
|
||||||
};
|
|
||||||
|
|
||||||
struct file {
|
|
||||||
// The full path of the file, including its volume and basename.
|
|
||||||
char *pathname;
|
|
||||||
|
|
||||||
// The basename of the file. This usually points to
|
|
||||||
// the begining of the basename of the file in the
|
|
||||||
// pathname string.
|
|
||||||
char *basename;
|
|
||||||
|
|
||||||
// The type of the file.
|
|
||||||
enum file_type type;
|
|
||||||
|
|
||||||
bool open;
|
|
||||||
|
|
||||||
// Generic driver-specific data pointer
|
|
||||||
void *userdata;
|
|
||||||
|
|
||||||
// The major number identifies the device driver responsible for
|
|
||||||
// the file.
|
|
||||||
uint8_t major_number;
|
|
||||||
|
|
||||||
// The minor number identifies the device, among those the driver
|
|
||||||
// controls, which this file represents or is associated with.
|
|
||||||
uint8_t minor_number;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Using the pathname in the provided file stucture, identify the device which manages
|
|
||||||
// the file and have that device populate the file structure.
|
|
||||||
int file_init(char *pathname, struct file *file);
|
|
||||||
|
|
||||||
int file_open(struct file *file);
|
|
||||||
|
|
||||||
int file_ioctl(struct file *file,
|
|
||||||
unsigned short operation,
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
// Closes an open file, given a unique ID.
|
|
||||||
int file_close(struct file *file);
|
|
||||||
|
|
||||||
// Seeks within an open file, given a unique ID and a length.
|
|
||||||
int file_seek(struct file *file, int32_t length);
|
|
||||||
|
|
||||||
// Reads data from the specified file.
|
|
||||||
int file_read(struct file *file, void *dest, size_t length);
|
|
||||||
|
|
||||||
// Writes data to the specified file.
|
|
||||||
int file_write(struct file *file, void *src, size_t length);
|
|
||||||
|
|
||||||
// Creates the specified file given a pathname.
|
|
||||||
int file_create(struct file *file);
|
|
||||||
|
|
||||||
// Copies the specified file using the specified names.
|
|
||||||
int file_copy(struct file *src, struct file *dest);
|
|
||||||
|
|
||||||
// Moves the specified file using the specified names.
|
|
||||||
int file_move(struct file *src, struct file *dest);
|
|
||||||
|
|
||||||
// Gets the size of the file.
|
|
||||||
int file_get_file_size(struct file *file, size_t *size);
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
// bios/main.c
|
||||||
|
// Sentinel 65X BIOS: main() function
|
||||||
|
//
|
||||||
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
void led_init(void);
|
||||||
|
|
||||||
|
void led_red_off(void);
|
||||||
|
|
||||||
|
void led_red_on(void);
|
||||||
|
|
||||||
|
void led_green_off(void);
|
||||||
|
|
||||||
|
void led_green_on(void);
|
||||||
|
|
||||||
|
void led_blue_off(void);
|
||||||
|
|
||||||
|
void led_blue_on(void);
|
|
@ -1,12 +1,10 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
// kernel/device/null.h
|
// include/kernel/util/delay.k
|
||||||
// NULL driver declaration.
|
// 65X-DOS Kernel: delay() function
|
||||||
//
|
//
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "kernel/device.h"
|
void delay(uint16_t count);
|
||||||
|
|
||||||
extern Device NullDevice;
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
// include/macros.h
|
||||||
|
// Utility macros for Calypsi compiler and assembler
|
||||||
|
|
||||||
#ifndef __MACROS_H
|
#ifndef __MACROS_H
|
||||||
#define __MACROS_H
|
#define __MACROS_H
|
||||||
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
//
|
|
||||||
// boot/sentinel65x.h
|
|
||||||
// Toplevel header for Sentinel 65X ROM firmware boot module
|
|
||||||
//
|
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define CPU_SPEED_HZ 8000000
|
|
||||||
#define UART3_BAUD_RATE 9600
|
|
||||||
#define UART3_TIMER_VALUE (CPU_SPEED_HZ / (16 * UART3_BAUD_RATE) - 1)
|
|
||||||
|
|
||||||
#include "65c816.h"
|
|
||||||
#include "w65c265s.h"
|
|
||||||
#include "vera.h"
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
; SPDX-License-Identifier: MIT
|
||||||
|
;
|
||||||
|
; src/kernel/cop_trampoline.s
|
||||||
|
; Trampoline function for COP interrupt handler
|
||||||
|
;
|
||||||
|
; Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
.section znear,bss
|
.section znear,bss
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
; SPDX-License-Identifier: MIT
|
||||||
|
;
|
||||||
|
; src/kernel/cstartup.s
|
||||||
|
; Critical boot and init code before calling main()
|
||||||
|
;
|
||||||
|
; Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
;;; Startup variant, change attribute value if you make your own
|
;;; Startup variant, change attribute value if you make your own
|
||||||
.rtmodel cstartup,"sentinel65x"
|
.rtmodel cstartup,"sentinel65x"
|
||||||
|
|
||||||
|
@ -18,9 +25,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "65c816.h"
|
#include "kernel/hardware/65c816.h"
|
||||||
#include "w65c265s.h"
|
#include "kernel/hardware/w65c265s.h"
|
||||||
#include "65c816.h"
|
|
||||||
|
|
||||||
.section boot, noreorder
|
.section boot, noreorder
|
||||||
.pubweak __program_root_section
|
.pubweak __program_root_section
|
||||||
|
@ -45,6 +51,10 @@ w65c265s_init:
|
||||||
trb PD4
|
trb PD4
|
||||||
tsb PDD4
|
tsb PDD4
|
||||||
|
|
||||||
|
fclk_start
|
||||||
|
|
||||||
|
fclk_select
|
||||||
|
|
||||||
; Now we delay a while.
|
; Now we delay a while.
|
||||||
ldy ##0x0FFF
|
ldy ##0x0FFF
|
||||||
delay_y
|
delay_y
|
||||||
|
@ -61,18 +71,6 @@ delay_y
|
||||||
; Disable the on-CPU RAM
|
; Disable the on-CPU RAM
|
||||||
w65c265s_sram_off
|
w65c265s_sram_off
|
||||||
|
|
||||||
; Set P5.4 and P5.5 as output
|
|
||||||
lda #0b00110000
|
|
||||||
trb PDD5
|
|
||||||
tsb PDD5
|
|
||||||
trb PD5
|
|
||||||
|
|
||||||
; Set P6.1 as output
|
|
||||||
lda #0b00000010
|
|
||||||
trb PDD6
|
|
||||||
tsb PDD6
|
|
||||||
trb PD6
|
|
||||||
|
|
||||||
clc
|
clc
|
||||||
xce ; native 16-bit mode
|
xce ; native 16-bit mode
|
||||||
rep #0x38 ; 16-bit registers, no decimal mode
|
rep #0x38 ; 16-bit registers, no decimal mode
|
||||||
|
|
|
@ -1,123 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
//
|
|
||||||
// kernel/device.c
|
|
||||||
// Device drivers.
|
|
||||||
//
|
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "kernel/device.h"
|
|
||||||
#include "kernel/file.h"
|
|
||||||
#include "kernel/device/null.h"
|
|
||||||
|
|
||||||
static bool device_init_all_run = false;
|
|
||||||
|
|
||||||
Device *device[DEVICE_MAX] = {
|
|
||||||
&NullDevice
|
|
||||||
};
|
|
||||||
|
|
||||||
struct device_map *device_map[DEVICE_MAP_MAX] = {0};
|
|
||||||
|
|
||||||
static short get_lowest_free_device(void);
|
|
||||||
|
|
||||||
void device_init_all(void)
|
|
||||||
{
|
|
||||||
if (device_init_all_run == true) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < DEVICE_MAX; i += 1) {
|
|
||||||
if (device[i] != NULL) {
|
|
||||||
if (device[i]->init != NULL) {
|
|
||||||
device[i]->init();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
device_init_all_run = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int device_bind_name(char *name,
|
|
||||||
unsigned short major_number,
|
|
||||||
unsigned short minor_number)
|
|
||||||
{
|
|
||||||
if (name == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// It is not permissible to have the same name attached to two
|
|
||||||
// devices.
|
|
||||||
for (int i = 0; i < DEVICE_MAP_MAX; i += 1) {
|
|
||||||
if (strcmp(device_map[i]->name, name) == 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
short device_index = get_lowest_free_device();
|
|
||||||
if (device_index == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *device_name = strdup(name);
|
|
||||||
if (name == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
device_map[device_index] = calloc(1, sizeof(struct device_map));
|
|
||||||
if (device_map[device_index] == NULL) {
|
|
||||||
free(device_name);
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
device_map[device_index]->major_number = major_number;
|
|
||||||
device_map[device_index]->minor_number = minor_number;
|
|
||||||
device_map[device_index]->name = device_name;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int device_unbind_name(char *name)
|
|
||||||
{
|
|
||||||
if (name == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < DEVICE_MAP_MAX; i += 1) {
|
|
||||||
if (strcmp(device_map[i]->name, name) == 0) {
|
|
||||||
free(device_map[i]->name);
|
|
||||||
free(device_map[i]);
|
|
||||||
device_map[i] = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int device_get_by_name(char *name, Device **device)
|
|
||||||
{
|
|
||||||
if (name == NULL || device == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < DEVICE_MAP_MAX; i += 1) {
|
|
||||||
if (strcmp(device_map[i]->name, name) == 0) {
|
|
||||||
unsigned short major_number = device_map[i]->major_number;
|
|
||||||
*device = device[major_number];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static short get_lowest_free_device(void)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < DEVICE_MAP_MAX; i += 1) {
|
|
||||||
if (device_map[i] == NULL) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
|
@ -1,126 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
//
|
|
||||||
// kernel/device/null.c
|
|
||||||
// NULL device implementation.
|
|
||||||
//
|
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "kernel/device/null.h"
|
|
||||||
#include "kernel/device.h"
|
|
||||||
#include "kernel/file.h"
|
|
||||||
|
|
||||||
static int null_init(void);
|
|
||||||
|
|
||||||
static int null_open(struct file *file);
|
|
||||||
|
|
||||||
static int null_close(struct file *file);
|
|
||||||
|
|
||||||
static int null_read(struct file *file, void *dest, size_t length);
|
|
||||||
|
|
||||||
static int null_write(struct file *file, void *src, size_t length);
|
|
||||||
|
|
||||||
static int null_get_file_size(struct file *file, size_t *size);
|
|
||||||
|
|
||||||
static int null_init_file(struct file *file);
|
|
||||||
|
|
||||||
Device NullDevice = {
|
|
||||||
.init = null_init,
|
|
||||||
.open = null_open,
|
|
||||||
.close = null_close,
|
|
||||||
.read = null_read,
|
|
||||||
.write = null_write,
|
|
||||||
.get_file_size = null_get_file_size,
|
|
||||||
.init_file = null_init_file
|
|
||||||
};
|
|
||||||
|
|
||||||
static int null_init(void)
|
|
||||||
{
|
|
||||||
device_bind_name("zero", 0, 0);
|
|
||||||
device_bind_name("null", 0, 1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_open(struct file *file)
|
|
||||||
{
|
|
||||||
switch (file->minor_number) {
|
|
||||||
case 0 ... 1:
|
|
||||||
file->open = true;
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_close(struct file *file)
|
|
||||||
{
|
|
||||||
switch (file->minor_number) {
|
|
||||||
case 0 ... 1:
|
|
||||||
file->open = false;
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_read(struct file *file,
|
|
||||||
void *dest,
|
|
||||||
size_t length)
|
|
||||||
{
|
|
||||||
if (file->open == false) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (file->minor_number) {
|
|
||||||
case 0:
|
|
||||||
memset(dest, 0x00, length);
|
|
||||||
return length;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_write(struct file *file,
|
|
||||||
void *src,
|
|
||||||
size_t length)
|
|
||||||
{
|
|
||||||
if (file->open == false) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) src;
|
|
||||||
if (file->minor_number != 1) {
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_get_file_size(struct file *file,
|
|
||||||
size_t *size)
|
|
||||||
{
|
|
||||||
switch (file->minor_number) {
|
|
||||||
case 0 ... 1:
|
|
||||||
*size = 0;
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int null_init_file(struct file *file)
|
|
||||||
{
|
|
||||||
if (file->major_number != 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (file->minor_number) {
|
|
||||||
case 0 ... 1:
|
|
||||||
file->open = false;
|
|
||||||
file->type = FILE_TYPE_DEVICE;
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
// SPDX-License-Identifier: MIT
|
|
||||||
//
|
|
||||||
// kernel/file.c
|
|
||||||
// File definitions.
|
|
||||||
//
|
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "kernel/file.h"
|
|
||||||
#include "kernel/device.h"
|
|
||||||
|
|
||||||
// Using the pathname string, identify the major/minor device for
|
|
||||||
// the file, and have that device initialize the file control
|
|
||||||
// block.
|
|
||||||
int file_init(char *pathname, struct file *file)
|
|
||||||
{
|
|
||||||
// First thing, we need to identify the device. The pathname
|
|
||||||
// is to be fully-qualified; this means it must have the
|
|
||||||
// device name, followed by a colon, followed by an optional
|
|
||||||
// file path. If the file path part is empty, then the file
|
|
||||||
// refers to the device itself. We perform the identification
|
|
||||||
// by first copying the pathname, then tokenizing the copy on
|
|
||||||
// the ":" character. The first token must be a string which
|
|
||||||
// matches a registered device in the device map.
|
|
||||||
// Then we populate the located major and minor numbers and copy
|
|
||||||
// the pathname into the FCB, and pass it along to the device
|
|
||||||
// driver for more initialization.
|
|
||||||
|
|
||||||
char *path = strdup(pathname);
|
|
||||||
if (path == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *dev = strtok(path, ":");
|
|
||||||
|
|
||||||
for (unsigned short i = 0; i < DEVICE_MAP_MAX; i += 1) {
|
|
||||||
if (strcmp(dev, device_map[i]->name) == 0) {
|
|
||||||
file->pathname = strdup(pathname);
|
|
||||||
free(path);
|
|
||||||
|
|
||||||
if (file->pathname == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
file->major_number = device_map[i]->major_number;
|
|
||||||
file->minor_number = device_map[i]->minor_number;
|
|
||||||
|
|
||||||
return device[file->major_number]->init_file(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(path);
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
; SPDX-License-Identifier: MIT
|
||||||
|
;
|
||||||
|
; src/kernel/hardware/led.s
|
||||||
|
; Defines for the VERA chip
|
||||||
|
;
|
||||||
|
; Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
#include "kernel/hardware/65c816.h"
|
||||||
|
#include "kernel/hardware/w65c265s.h"
|
||||||
|
|
||||||
|
.section code
|
||||||
|
.public led_init
|
||||||
|
.public led_red_off
|
||||||
|
.public led_red_on
|
||||||
|
.public led_green_off
|
||||||
|
.public led_green_on
|
||||||
|
.public led_blue_off
|
||||||
|
.public led_blue_on
|
||||||
|
|
||||||
|
led_init:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
; Set P5.4 and P5.5 as output
|
||||||
|
lda #0b00110000
|
||||||
|
trb PDD5
|
||||||
|
tsb PDD5
|
||||||
|
trb PD5
|
||||||
|
|
||||||
|
; Set P6.1 as output
|
||||||
|
lda #0b00000010
|
||||||
|
trb PDD6
|
||||||
|
tsb PDD6
|
||||||
|
trb PD6
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
led_red_off:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda #(1 << 4)
|
||||||
|
trb PD5
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
led_red_on:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda #(1 << 4)
|
||||||
|
tsb PD5
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
led_green_off:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda #(1 << 5)
|
||||||
|
trb PD5
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
led_green_on:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda #(1 << 5)
|
||||||
|
tsb PD5
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
led_blue_off:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda #(1 << 1)
|
||||||
|
trb PD6
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
led_blue_on:
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pha
|
||||||
|
short_a
|
||||||
|
|
||||||
|
lda #(1 << 1)
|
||||||
|
tsb PD6
|
||||||
|
|
||||||
|
long_a
|
||||||
|
long_i
|
||||||
|
pla
|
||||||
|
rtl
|
|
@ -1,7 +1,7 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
// bios/stubs.c
|
// src/kernel/irq.c
|
||||||
// Stub functions for Calypsi's C library
|
// IRQ handlers
|
||||||
//
|
//
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,35 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
// bios/main.c
|
// src/kernel/main.c
|
||||||
// Sentinel 65X BIOS: main() function
|
// Sentinel 65X BIOS: main() function
|
||||||
//
|
//
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "kernel/util/delay.h"
|
||||||
|
#include "kernel/hardware/led.h"
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
|
|
||||||
// Light Red LED
|
led_init();
|
||||||
__asm(
|
|
||||||
" sep #0x20\n"
|
|
||||||
" lda #0b00010000\n"
|
|
||||||
" tsb 0x00DF21\n"
|
|
||||||
" rep #0x20\n"
|
|
||||||
);
|
|
||||||
|
|
||||||
for (;;) {}
|
for (;;) {
|
||||||
|
|
||||||
|
led_red_on();
|
||||||
|
delay(1);
|
||||||
|
led_red_off();
|
||||||
|
|
||||||
|
led_green_on();
|
||||||
|
delay(1);
|
||||||
|
led_green_off();
|
||||||
|
|
||||||
|
led_blue_on();
|
||||||
|
delay(1);
|
||||||
|
led_blue_off();
|
||||||
|
|
||||||
|
delay(1);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
//
|
//
|
||||||
// bios/stubs.c
|
// src/kernel/stubs.c
|
||||||
// Stub functions for Calypsi's C library
|
// Stub functions for Calypsi's C library
|
||||||
//
|
//
|
||||||
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
// src/kernel/util/delay.c
|
||||||
|
// 65X-DOS Kernel: delay() function
|
||||||
|
//
|
||||||
|
// Copyright © 2024 Kyle J Cardoza <Kyle.Cardoza@icloud.com>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void delay(uint16_t count) {
|
||||||
|
for (uint16_t i = 0; i < count; i += 1) {
|
||||||
|
for (uint16_t j = 0; j < 0xFFFF; j += 1) {}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue