mirror of
https://github.com/cc65/cc65.git
synced 2025-04-09 10:39:40 +00:00
style update and add rp6502 doc
This commit is contained in:
parent
b17c4d3434
commit
564c85235f
@ -1,8 +1,4 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
; Picocomputer 6502 general defines
|
||||
|
||||
; RIA UART
|
||||
RIA_READY := $FFE0 ; TX=$80 RX=$40
|
||||
|
@ -1,11 +1,3 @@
|
||||
#
|
||||
# Copyright (c) 2023 Rumbledethumps
|
||||
#
|
||||
# SPDX-License-Identifier: Zlib
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
#
|
||||
|
||||
SYMBOLS {
|
||||
__STARTUP__: type = import;
|
||||
__STACKSIZE__: type = weak, value = $0800;
|
||||
|
@ -175,6 +175,9 @@
|
||||
<tag><htmlurl url="plus4.html" name="plus4.html"></tag>
|
||||
Topics specific to the Commodore Plus/4.
|
||||
|
||||
<tag><htmlurl url="rp6502.html" name="rp6502.html"></tag>
|
||||
Topics specific to the Picocomputer 6502.
|
||||
|
||||
<tag><htmlurl url="supervision.html" name="supervision.html"></tag>
|
||||
Topics specific to the Watara Supervision Console.
|
||||
|
||||
|
96
doc/rp6502.sgml
Normal file
96
doc/rp6502.sgml
Normal file
@ -0,0 +1,96 @@
|
||||
<!doctype linuxdoc system>
|
||||
|
||||
<article>
|
||||
<title>Picocomputer 6502 - specific information for cc65
|
||||
<author><url url="mailto:uz@cc65.org" name="Ullrich von Bassewitz">
|
||||
|
||||
<abstract>
|
||||
An overview over the Picocomputer 6502 and its interfaces to the cc65 C
|
||||
compiler.
|
||||
</abstract>
|
||||
|
||||
<!-- Table of contents -->
|
||||
<toc>
|
||||
|
||||
<!-- Begin the document -->
|
||||
|
||||
<sect>Overview<p>
|
||||
|
||||
The Picocomputer 6502 is a modern W65C02S computer with a custom operating
|
||||
system designed to be POSIX-like. The reference design includes a W65C02S,
|
||||
W65C22S, RP6502-RIA, and optionally a RP6502-VGA. Peripheral devices like
|
||||
keyboards, mice, and flash storage are connected by USB to the RP6502-RIA.
|
||||
Audio is generated by the RP6502-RIA. Video is generated by the RP6502-VGA.
|
||||
|
||||
|
||||
|
||||
<sect>Binary format<p>
|
||||
|
||||
The standard binary output format generated by the linker for the RP6502 target
|
||||
is a plain machine language program without any prefix or postfix.
|
||||
|
||||
The RP6502 Integrated Development Environment, based on Visual Studio Code,
|
||||
will convert the cc65 binary output into RP6502 ROM files that can be loaded
|
||||
directly from the RP6502 monitor or installed on the RIA to be loaded at boot.
|
||||
|
||||
|
||||
|
||||
<sect>Memory layout<p>
|
||||
|
||||
<descrip>
|
||||
<tag/Stack/
|
||||
The C run-time stack is located at $FEFF, and grows downward.
|
||||
|
||||
<tag/Heap/
|
||||
The C heap is located at the end of the program, and grows toward the C
|
||||
run-time stack.
|
||||
|
||||
<tag/RAM/
|
||||
RAM is located at $0000 - $FEFF. Default binaries load and
|
||||
start at $0200.
|
||||
|
||||
<tag/ROM/
|
||||
The RP6502 is designed with no ROM in the 6502 address space.
|
||||
|
||||
<tag/VIA/
|
||||
A Versatile Interface Adapter (6522) is 16 registers located
|
||||
at $FFD0.
|
||||
|
||||
<tag/RIA/
|
||||
The RP6502 Interface Adapter is 32 registers located at $FFE0.
|
||||
|
||||
<tag/User/
|
||||
User I/O expansion is from $FF00 to $FFCF.
|
||||
|
||||
</descrip><p>
|
||||
|
||||
|
||||
|
||||
<sect>Platform-specific header files<p>
|
||||
|
||||
Programs containing RP6502-specific code may use the <tt/rp6502.h/ or
|
||||
<tt/rp6502.inc/ include files.
|
||||
|
||||
|
||||
|
||||
<sect>License<p>
|
||||
|
||||
This software is provided "as-is", without any expressed or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
<enum>
|
||||
<item> The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated, but is not required.
|
||||
<item> Altered source versions must be plainly marked as such, and must not
|
||||
be misrepresented as being the original software.
|
||||
<item> This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
</enum>
|
||||
|
||||
</article>
|
@ -1,10 +1,28 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
/* */
|
||||
/* rp6502.h */
|
||||
/* */
|
||||
/* Picocomputer 6502 */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
/* warranty. In no event will the authors be held liable for any damages */
|
||||
/* arising from the use of this software. */
|
||||
/* */
|
||||
/* Permission is granted to anyone to use this software for any purpose, */
|
||||
/* including commercial applications, and to alter it and redistribute it */
|
||||
/* freely, subject to the following restrictions: */
|
||||
/* */
|
||||
/* 1. The origin of this software must not be misrepresented; you must not */
|
||||
/* claim that you wrote the original software. If you use this software */
|
||||
/* in a product, an acknowledgment in the product documentation would be */
|
||||
/* appreciated but is not required. */
|
||||
/* 2. Altered source versions must be plainly marked as such, and must not */
|
||||
/* be misrepresented as being the original software. */
|
||||
/* 3. This notice may not be removed or altered from any source */
|
||||
/* distribution. */
|
||||
/* */
|
||||
/*****************************************************************************/
|
||||
|
||||
#ifndef _RP6502_H
|
||||
#define _RP6502_H
|
||||
@ -50,29 +68,29 @@ struct __RP6502
|
||||
|
||||
/* XSTACK helpers */
|
||||
|
||||
void __fastcall__ ria_push_long(unsigned long val);
|
||||
void __fastcall__ ria_push_int(unsigned int val);
|
||||
void __fastcall__ ria_push_long (unsigned long val);
|
||||
void __fastcall__ ria_push_int (unsigned int val);
|
||||
#define ria_push_char(v) RIA.xstack = v
|
||||
|
||||
long __fastcall__ ria_pop_long(void);
|
||||
int __fastcall__ ria_pop_int(void);
|
||||
long __fastcall__ ria_pop_long (void);
|
||||
int __fastcall__ ria_pop_int (void);
|
||||
#define ria_pop_char() RIA.xstack
|
||||
|
||||
/* Set the RIA fastcall register */
|
||||
|
||||
void __fastcall__ ria_set_axsreg(unsigned long axsreg);
|
||||
void __fastcall__ ria_set_ax(unsigned int ax);
|
||||
void __fastcall__ ria_set_axsreg (unsigned long axsreg);
|
||||
void __fastcall__ ria_set_ax (unsigned int ax);
|
||||
#define ria_set_a(v) RIA.a = v
|
||||
|
||||
/* Run an OS operation */
|
||||
|
||||
int __fastcall__ ria_call_int(unsigned char op);
|
||||
long __fastcall__ ria_call_long(unsigned char op);
|
||||
int __fastcall__ ria_call_int (unsigned char op);
|
||||
long __fastcall__ ria_call_long (unsigned char op);
|
||||
|
||||
/* These run _mappederrno() on error */
|
||||
|
||||
int __fastcall__ ria_call_int_errno(unsigned char op);
|
||||
long __fastcall__ ria_call_long_errno(unsigned char op);
|
||||
int __fastcall__ ria_call_int_errno (unsigned char op);
|
||||
long __fastcall__ ria_call_long_errno (unsigned char op);
|
||||
|
||||
/* OS operation numbers */
|
||||
|
||||
@ -99,15 +117,15 @@ long __fastcall__ ria_call_long_errno(unsigned char op);
|
||||
|
||||
/* C API for the operating system. */
|
||||
|
||||
int __cdecl__ xreg(char device, char channel, unsigned char address, ...);
|
||||
int __fastcall__ phi2(void);
|
||||
int __fastcall__ codepage(void);
|
||||
long __fastcall__ lrand(void);
|
||||
int __fastcall__ stdin_opt(unsigned long ctrl_bits, unsigned char str_length);
|
||||
int __fastcall__ read_xstack(void *buf, unsigned count, int fildes);
|
||||
int __fastcall__ read_xram(unsigned buf, unsigned count, int fildes);
|
||||
int __fastcall__ write_xstack(const void *buf, unsigned count, int fildes);
|
||||
int __fastcall__ write_xram(unsigned buf, unsigned count, int fildes);
|
||||
int __cdecl__ xreg (char device, char channel, unsigned char address, ...);
|
||||
int __fastcall__ phi2 (void);
|
||||
int __fastcall__ codepage (void);
|
||||
long __fastcall__ lrand (void);
|
||||
int __fastcall__ stdin_opt (unsigned long ctrl_bits, unsigned char str_length);
|
||||
int __fastcall__ read_xstack (void* buf, unsigned count, int fildes);
|
||||
int __fastcall__ read_xram (unsigned buf, unsigned count, int fildes);
|
||||
int __fastcall__ write_xstack (const void* buf, unsigned count, int fildes);
|
||||
int __fastcall__ write_xram (unsigned buf, unsigned count, int fildes);
|
||||
|
||||
/* XREG location helpers */
|
||||
|
||||
|
@ -1,16 +1,8 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <errno.h>
|
||||
|
||||
int __fastcall__ close(int fd)
|
||||
int __fastcall__ close (int fd)
|
||||
{
|
||||
ria_set_ax(fd);
|
||||
return ria_call_int_errno(RIA_OP_CLOSE);
|
||||
ria_set_ax (fd);
|
||||
return ria_call_int_errno (RIA_OP_CLOSE);
|
||||
}
|
||||
|
@ -1,14 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ codepage(void)
|
||||
int __fastcall__ codepage (void)
|
||||
{
|
||||
return ria_call_int(RIA_OP_CODEPAGE);
|
||||
return ria_call_int (RIA_OP_CODEPAGE);
|
||||
}
|
||||
|
@ -1,10 +1,7 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
|
||||
; Boilerplate crt0.s
|
||||
; 2023, Rumbledethumps
|
||||
;
|
||||
; crt0.s
|
||||
|
||||
.export _init, _exit
|
||||
.import _main
|
||||
|
@ -1,18 +1,10 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <time.h>
|
||||
|
||||
extern int __clock_gettimespec(struct timespec *ts, unsigned char op);
|
||||
extern int __clock_gettimespec (struct timespec* ts, unsigned char op);
|
||||
|
||||
int clock_getres(clockid_t clock_id, struct timespec *res)
|
||||
int clock_getres (clockid_t clock_id, struct timespec* res)
|
||||
{
|
||||
ria_set_ax(clock_id);
|
||||
return __clock_gettimespec(res, RIA_OP_CLOCK_GETRES);
|
||||
ria_set_ax (clock_id);
|
||||
return __clock_gettimespec (res, RIA_OP_CLOCK_GETRES);
|
||||
}
|
||||
|
@ -1,20 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <time.h>
|
||||
|
||||
extern int __clock_gettimespec(struct timespec *ts, unsigned char op);
|
||||
extern int __clock_gettimespec (struct timespec* ts, unsigned char op);
|
||||
|
||||
int clock_gettime(clockid_t clock_id, struct timespec *tp)
|
||||
int clock_gettime (clockid_t clock_id, struct timespec* tp)
|
||||
{
|
||||
(void)clock_id;
|
||||
/* time.s doesn't set the stack value for clock_id (bug?) */
|
||||
ria_set_ax(CLOCK_REALTIME);
|
||||
return __clock_gettimespec(tp, RIA_OP_CLOCK_GETTIME);
|
||||
ria_set_ax (CLOCK_REALTIME);
|
||||
return __clock_gettimespec (tp, RIA_OP_CLOCK_GETTIME);
|
||||
}
|
||||
|
@ -1,22 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <time.h>
|
||||
|
||||
int __clock_gettimespec(struct timespec *ts, unsigned char op)
|
||||
int __clock_gettimespec (struct timespec* ts, unsigned char op)
|
||||
/* Internal method shared by clock_getres and clock_gettime. */
|
||||
{
|
||||
int ax = ria_call_int_errno(op);
|
||||
if (ax >= 0)
|
||||
{
|
||||
ts->tv_sec = ria_pop_long();
|
||||
ts->tv_nsec = ria_pop_long();
|
||||
int ax = ria_call_int_errno (op);
|
||||
if (ax >= 0) {
|
||||
ts->tv_sec = ria_pop_long ();
|
||||
ts->tv_nsec = ria_pop_long ();
|
||||
}
|
||||
return ax;
|
||||
}
|
||||
|
@ -1,24 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <time.h>
|
||||
|
||||
int clock_gettimezone(clockid_t clock_id, struct _timezone *tz)
|
||||
int clock_gettimezone (clockid_t clock_id, struct _timezone* tz)
|
||||
{
|
||||
int ax;
|
||||
ria_set_ax(clock_id);
|
||||
ax = ria_call_int_errno(RIA_OP_CLOCK_GETTIMEZONE);
|
||||
if (ax >= 0)
|
||||
{
|
||||
ria_set_ax (clock_id);
|
||||
ax = ria_call_int_errno (RIA_OP_CLOCK_GETTIMEZONE);
|
||||
if (ax >= 0) {
|
||||
char i;
|
||||
for (i = 0; i < sizeof(struct _timezone); i++)
|
||||
((char *)tz)[i] = ria_pop_char();
|
||||
for (i = 0; i < sizeof (struct _timezone); i++)
|
||||
((char*)tz)[i] = ria_pop_char ();
|
||||
}
|
||||
return ax;
|
||||
}
|
||||
|
@ -1,8 +1,6 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
; 2023, Rumbledethumps
|
||||
;
|
||||
|
||||
.constructor initenv, 24
|
||||
.import __environ, __envcount, __envsize
|
||||
|
@ -1,8 +1,7 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
; 2023, Rumbledethumps
|
||||
;
|
||||
; Enables the C IRQ tools
|
||||
|
||||
.export initirq, doneirq
|
||||
.import callirq, _exit
|
||||
|
@ -1,14 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
long __fastcall__ lrand(void)
|
||||
long __fastcall__ lrand (void)
|
||||
{
|
||||
return ria_call_long(RIA_OP_LRAND);
|
||||
return ria_call_long (RIA_OP_LRAND);
|
||||
}
|
||||
|
@ -1,19 +1,11 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <unistd.h>
|
||||
|
||||
off_t __fastcall__ lseek(int fd, off_t offset, int whence)
|
||||
off_t __fastcall__ lseek (int fd, off_t offset, int whence)
|
||||
{
|
||||
/* Modified argument order for short stacking offset */
|
||||
ria_push_long(offset);
|
||||
ria_push_char(whence);
|
||||
ria_set_ax(fd);
|
||||
return ria_call_long_errno(RIA_OP_LSEEK);
|
||||
ria_push_long (offset);
|
||||
ria_push_char (whence);
|
||||
ria_set_ax (fd);
|
||||
return ria_call_long_errno (RIA_OP_LSEEK);
|
||||
}
|
||||
|
@ -1,8 +1,7 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
; 2023, Rumbledethumps
|
||||
;
|
||||
; No arguments
|
||||
|
||||
.constructor initmainargs, 24
|
||||
.import __argc, __argv
|
||||
|
@ -1,26 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
int __cdecl__ open(const char *name, int flags, ...)
|
||||
int __cdecl__ open (const char* name, int flags, ...)
|
||||
{
|
||||
size_t namelen = strlen(name);
|
||||
if (namelen > 255)
|
||||
{
|
||||
return _mappederrno(EINVAL);
|
||||
size_t namelen = strlen (name);
|
||||
if (namelen > 255) {
|
||||
return _mappederrno (EINVAL);
|
||||
}
|
||||
while (namelen)
|
||||
{
|
||||
ria_push_char(name[--namelen]);
|
||||
while (namelen) {
|
||||
ria_push_char (name[--namelen]);
|
||||
}
|
||||
ria_set_ax(flags);
|
||||
return ria_call_int_errno(RIA_OP_OPEN);
|
||||
ria_set_ax (flags);
|
||||
return ria_call_int_errno (RIA_OP_OPEN);
|
||||
}
|
||||
|
@ -1,14 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ phi2(void)
|
||||
int __fastcall__ phi2 (void)
|
||||
{
|
||||
return ria_call_int(RIA_OP_PHI2);
|
||||
return ria_call_int (RIA_OP_PHI2);
|
||||
}
|
||||
|
@ -1,16 +1,8 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Non-standard cc65
|
||||
void _randomize(void)
|
||||
void _randomize (void)
|
||||
{
|
||||
srand(ria_call_int(RIA_OP_LRAND));
|
||||
srand (ria_call_int (RIA_OP_LRAND));
|
||||
}
|
||||
|
@ -1,29 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int __fastcall__ read(int fildes, void *buf, unsigned count)
|
||||
int __fastcall__ read (int fildes, void* buf, unsigned count)
|
||||
{
|
||||
int total = 0;
|
||||
while (count)
|
||||
{
|
||||
while (count) {
|
||||
unsigned blockcount = (count > 256) ? 256 : count;
|
||||
int bytes_read = read_xstack(&((char *)buf)[total], blockcount, fildes);
|
||||
if (bytes_read < 0)
|
||||
{
|
||||
int bytes_read = read_xstack (&((char*)buf)[total], blockcount, fildes);
|
||||
if (bytes_read < 0) {
|
||||
return bytes_read;
|
||||
}
|
||||
total += bytes_read;
|
||||
count -= bytes_read;
|
||||
if (bytes_read < blockcount)
|
||||
{
|
||||
if (bytes_read < blockcount) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ read_xram(unsigned buf, unsigned count, int fildes)
|
||||
int __fastcall__ read_xram (unsigned buf, unsigned count, int fildes)
|
||||
{
|
||||
ria_push_int(buf);
|
||||
ria_push_int(count);
|
||||
ria_set_ax(fildes);
|
||||
return ria_call_int_errno(RIA_OP_READ_XRAM);
|
||||
ria_push_int (buf);
|
||||
ria_push_int (count);
|
||||
ria_set_ax (fildes);
|
||||
return ria_call_int_errno (RIA_OP_READ_XRAM);
|
||||
}
|
||||
|
@ -1,22 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ read_xstack(void *buf, unsigned count, int fildes)
|
||||
int __fastcall__ read_xstack (void* buf, unsigned count, int fildes)
|
||||
{
|
||||
int i, ax;
|
||||
ria_push_int(count);
|
||||
ria_set_ax(fildes);
|
||||
ax = ria_call_int_errno(RIA_OP_READ_XSTACK);
|
||||
for (i = 0; i < ax; i++)
|
||||
{
|
||||
((char *)buf)[i] = ria_pop_char();
|
||||
ria_push_int (count);
|
||||
ria_set_ax (fildes);
|
||||
ax = ria_call_int_errno (RIA_OP_READ_XSTACK);
|
||||
for (i = 0; i < ax; i++) {
|
||||
((char*)buf)[i] = ria_pop_char ();
|
||||
}
|
||||
return ax;
|
||||
}
|
||||
|
@ -1,8 +1,7 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
; 2023, Rumbledethumps
|
||||
;
|
||||
; Helpers for building API shims
|
||||
|
||||
.include "rp6502.inc"
|
||||
|
||||
|
@ -1,18 +1,10 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <time.h>
|
||||
|
||||
int clock_settime(clockid_t clock_id, const struct timespec *tp)
|
||||
int clock_settime (clockid_t clock_id, const struct timespec* tp)
|
||||
{
|
||||
ria_set_ax(clock_id);
|
||||
ria_push_long(tp->tv_nsec);
|
||||
ria_push_long(tp->tv_sec);
|
||||
return ria_call_int_errno(RIA_OP_CLOCK_SETTIME);
|
||||
ria_set_ax (clock_id);
|
||||
ria_push_long (tp->tv_nsec);
|
||||
ria_push_long (tp->tv_sec);
|
||||
return ria_call_int_errno (RIA_OP_CLOCK_SETTIME);
|
||||
}
|
||||
|
@ -1,16 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ stdin_opt(unsigned long ctrl_bits, unsigned char str_length)
|
||||
int __fastcall__ stdin_opt (unsigned long ctrl_bits, unsigned char str_length)
|
||||
{
|
||||
ria_push_long(ctrl_bits);
|
||||
ria_set_a(str_length);
|
||||
return ria_call_int_errno(RIA_OP_STDIN_OPT);
|
||||
ria_push_long (ctrl_bits);
|
||||
ria_set_a (str_length);
|
||||
return ria_call_int_errno (RIA_OP_STDIN_OPT);
|
||||
}
|
||||
|
@ -1,26 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
unsigned char __fastcall__ _sysremove(const char *name)
|
||||
unsigned char __fastcall__ _sysremove (const char* name)
|
||||
{
|
||||
size_t namelen;
|
||||
namelen = strlen(name);
|
||||
if (namelen > 255)
|
||||
{
|
||||
return _mappederrno(EINVAL);
|
||||
namelen = strlen (name);
|
||||
if (namelen > 255) {
|
||||
return _mappederrno (EINVAL);
|
||||
}
|
||||
while (namelen)
|
||||
{
|
||||
ria_push_char(name[--namelen]);
|
||||
while (namelen) {
|
||||
ria_push_char (name[--namelen]);
|
||||
}
|
||||
return ria_call_int_errno(RIA_OP_UNLINK);
|
||||
return ria_call_int_errno (RIA_OP_UNLINK);
|
||||
}
|
||||
|
@ -1,32 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
unsigned char __fastcall__ _sysrename(const char *oldpath, const char *newpath)
|
||||
unsigned char __fastcall__ _sysrename (const char* oldpath, const char* newpath)
|
||||
{
|
||||
size_t oldpathlen, newpathlen;
|
||||
oldpathlen = strlen(oldpath);
|
||||
newpathlen = strlen(newpath);
|
||||
if (oldpathlen + newpathlen > 254)
|
||||
{
|
||||
return _mappederrno(EINVAL);
|
||||
oldpathlen = strlen (oldpath);
|
||||
newpathlen = strlen (newpath);
|
||||
if (oldpathlen + newpathlen > 254) {
|
||||
return _mappederrno (EINVAL);
|
||||
}
|
||||
while (oldpathlen)
|
||||
{
|
||||
ria_push_char(oldpath[--oldpathlen]);
|
||||
while (oldpathlen) {
|
||||
ria_push_char (oldpath[--oldpathlen]);
|
||||
}
|
||||
ria_push_char(0);
|
||||
while (newpathlen)
|
||||
{
|
||||
ria_push_char(newpath[--newpathlen]);
|
||||
ria_push_char (0);
|
||||
while (newpathlen) {
|
||||
ria_push_char (newpath[--newpathlen]);
|
||||
}
|
||||
return ria_call_int_errno(RIA_OP_RENAME);
|
||||
return ria_call_int_errno (RIA_OP_RENAME);
|
||||
}
|
||||
|
@ -1,29 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int __fastcall__ write(int fildes, const void *buf, unsigned count)
|
||||
int __fastcall__ write (int fildes, const void* buf, unsigned count)
|
||||
{
|
||||
int ax, total = 0;
|
||||
while (count)
|
||||
{
|
||||
while (count) {
|
||||
int blockcount = (count > 256) ? 256 : count;
|
||||
ax = write_xstack(&((char *)buf)[total], blockcount, fildes);
|
||||
if (ax < 0)
|
||||
{
|
||||
ax = write_xstack (&((char*)buf)[total], blockcount, fildes);
|
||||
if (ax < 0) {
|
||||
return ax;
|
||||
}
|
||||
total += ax;
|
||||
count -= ax;
|
||||
if (ax < blockcount)
|
||||
{
|
||||
if (ax < blockcount) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ write_xram(unsigned buf, unsigned count, int fildes)
|
||||
int __fastcall__ write_xram (unsigned buf, unsigned count, int fildes)
|
||||
{
|
||||
ria_push_int(buf);
|
||||
ria_push_int(count);
|
||||
ria_set_ax(fildes);
|
||||
return ria_call_int_errno(RIA_OP_WRITE_XRAM);
|
||||
ria_push_int (buf);
|
||||
ria_push_int (count);
|
||||
ria_set_ax (fildes);
|
||||
return ria_call_int_errno (RIA_OP_WRITE_XRAM);
|
||||
}
|
||||
|
@ -1,20 +1,11 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Rumbledethumps
|
||||
*
|
||||
* SPDX-License-Identifier: Zlib
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
* SPDX-License-Identifier: Unlicense
|
||||
*/
|
||||
|
||||
#include <rp6502.h>
|
||||
|
||||
int __fastcall__ write_xstack(const void *buf, unsigned count, int fildes)
|
||||
int __fastcall__ write_xstack (const void* buf, unsigned count, int fildes)
|
||||
{
|
||||
unsigned i;
|
||||
for (i = count; i;)
|
||||
{
|
||||
ria_push_char(((char *)buf)[--i]);
|
||||
for (i = count; i;) {
|
||||
ria_push_char (((char*)buf)[--i]);
|
||||
}
|
||||
ria_set_ax(fildes);
|
||||
return ria_call_int_errno(RIA_OP_WRITE_XSTACK);
|
||||
ria_set_ax (fildes);
|
||||
return ria_call_int_errno (RIA_OP_WRITE_XSTACK);
|
||||
}
|
||||
|
@ -1,9 +1,6 @@
|
||||
; Copyright (c) 2023 Rumbledethumps
|
||||
;
|
||||
; SPDX-License-Identifier: Zlib
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
; SPDX-License-Identifier: Unlicense
|
||||
|
||||
; 2023, Rumbledethumps
|
||||
;
|
||||
; CC65 will promote variadic char arguments to int. It will not demote longs.
|
||||
; int __cdecl__ xreg(char device, char channel, unsigned char address, ...);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user