commit
047a7a96d9
@ -0,0 +1,3 @@
|
||||
.DS_Store
|
||||
*.o
|
||||
*.img
|
@ -0,0 +1,15 @@
|
||||
CC = bin/cc65
|
||||
AS = bin/ca65
|
||||
LD = bin/ld65
|
||||
export CPU = 65c02
|
||||
|
||||
.PHONY: all
|
||||
all: lib test
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
make -C test/
|
||||
|
||||
.PHONY: lib
|
||||
lib:
|
||||
make -C lib/
|
@ -0,0 +1,3 @@
|
||||
Nothing to see here.
|
||||
|
||||
Find me on #redpower at espernet IRC.
|
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
BS=128
|
||||
COUNT=`wc -c $1`
|
||||
BYTES=${COUNT//[^0-9]/}
|
||||
BLOCKS=$(( BYTES / BS ))
|
||||
SECTORS=$(( BLOCKS + 1 ))
|
||||
echo "Code size = " $BYTES
|
||||
echo "Image size = " $SECTORS " * " $BS " = " $(( SECTORS * BS ))
|
||||
dd if=/dev/zero of=$1.pad bs=$BS count=$SECTORS > /dev/null 2>&1
|
||||
dd if=$1 of=$1.pad conv=notrunc > /dev/null 2>&1
|
||||
rm $1
|
||||
mv $1.pad $1
|
||||
#echo $BLOCKS " bytes aligned to " $NEWBLOCKS " blocks"
|
||||
#dd if=/dev/zero oflag=seek_bytes seek=$BLOCKS of=$1 bs=16 count=$NEWBLOCKS conv=notrunc
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
cp test/$1.img /Applications/MultiMC.app/Contents/Resources/instances/1.2.5\ ftb/minecraft/saves/cpu\ test/redpower/disk_1b63bbbd8ce6001f.img
|
@ -0,0 +1,48 @@
|
||||
//console.h
|
||||
|
||||
// 0x00 Memory access row. Used to set which line of characters appears in the display memory window.
|
||||
|
||||
// 0x01 cursor x
|
||||
// 0x02 cursor y
|
||||
// 0x03 cursor mode (0: hidden, 1: solid, 2: blink)
|
||||
|
||||
// 0x04 key buffer start (16 byte buffer)
|
||||
// 0x05 key buffer position
|
||||
// 0x06 key value at buffer start
|
||||
|
||||
// 0x07 blit mode (1: fill, 2: invert; 3: shift)
|
||||
// 0x08 blit x start / fill value
|
||||
// 0x09 blit y start
|
||||
// 0x0A blit x offset
|
||||
// 0x0B blit y offset
|
||||
// 0x0C blit width
|
||||
// 0x0D blit height
|
||||
|
||||
// 0x10 -> 0x60 display memory window
|
||||
|
||||
typedef struct Console {
|
||||
char line;
|
||||
char cursor_x;
|
||||
char cursor_y;
|
||||
char cursor_mode;
|
||||
|
||||
char kb_start;
|
||||
char kb_pos;
|
||||
char kb_key;
|
||||
|
||||
char blit_mode;
|
||||
char blit_start_x;
|
||||
char blit_start_y;
|
||||
char blit_offset_x;
|
||||
char blit_offset_y;
|
||||
char blit_width;
|
||||
char blit_height;
|
||||
|
||||
unsigned int padding;
|
||||
|
||||
char display[0x50];
|
||||
} Console;
|
||||
|
||||
//character with inverted colors
|
||||
#define inv(c) ((c) | 0x80)
|
||||
|
@ -0,0 +1,29 @@
|
||||
//disk.h
|
||||
|
||||
// 0x00-0x7F: Disk sector buffer
|
||||
// 0x80-0x81: Sector number
|
||||
// 0x82: Disk command:
|
||||
// 0: Idle/success
|
||||
// 1: Read Disk Name
|
||||
// 2: Write Disk Name
|
||||
// 3: Read Disk Serial
|
||||
// 4: Read Disk Sector
|
||||
// 5: Write Disk Sector
|
||||
// 0xFF: Command failure
|
||||
|
||||
typedef enum {
|
||||
IDLE = 0,
|
||||
READ_NAME = 1,
|
||||
WRITE_NAME = 2,
|
||||
READ_SERIAL = 3,
|
||||
READ = 4,
|
||||
WRITE = 5,
|
||||
FAIL = 0xFF
|
||||
} DiskCommand;
|
||||
|
||||
typedef struct Disk {
|
||||
char sector[0x80];
|
||||
unsigned int sector_num;
|
||||
DiskCommand command;
|
||||
} Disk;
|
||||
|
@ -0,0 +1,46 @@
|
||||
// iox.h
|
||||
|
||||
|
||||
// device struct
|
||||
|
||||
typedef struct Iox {
|
||||
unsigned int in;
|
||||
unsigned int out;
|
||||
} Iox;
|
||||
|
||||
// Bit Dec Hex Color
|
||||
// 0 1 0x1 White
|
||||
// 1 2 0x2 Orange
|
||||
// 2 4 0x4 Magenta
|
||||
// 3 8 0x8 Light Blue
|
||||
// 4 16 0x10 Yellow
|
||||
// 5 32 0x20 Lime
|
||||
// 6 64 0x40 Pink
|
||||
// 7 128 0x80 Gray
|
||||
// 8 256 0x100 Light Gray
|
||||
// 9 512 0x200 Cyan
|
||||
// 10 1024 0x400 Purple
|
||||
// 11 2048 0x800 Blue
|
||||
// 12 4096 0x1000 Brown
|
||||
// 13 8192 0x2000 Green
|
||||
// 14 16384 0x4000 Red
|
||||
// 15 32768 0x8000 Black
|
||||
|
||||
typedef enum {
|
||||
WHITE = 0x0001,
|
||||
ORANGE = 0x0002,
|
||||
MAGENTA = 0x0004,
|
||||
LBLUE = 0x0008,
|
||||
YELLOW = 0x0010,
|
||||
LIME = 0x0020,
|
||||
PINK = 0x0040,
|
||||
GRAY = 0x0080,
|
||||
LGRAY = 0x0100,
|
||||
CYAN = 0x0200,
|
||||
PURPLE = 0x0400,
|
||||
BLUE = 0x0800,
|
||||
BROWN = 0x1000,
|
||||
GREEN = 0x2000,
|
||||
RED = 0x4000,
|
||||
BLACK = 0x8000
|
||||
} WireColor;
|
@ -0,0 +1,33 @@
|
||||
// redbus.h
|
||||
|
||||
void rb_enable(void);
|
||||
void rb_disable(void);
|
||||
|
||||
void __fastcall__ rb_set_window(void* address);
|
||||
|
||||
void __fastcall__ rb_map_device(unsigned char id);
|
||||
|
||||
|
||||
|
||||
// 0x00 Map device in Reg A to redbus window.
|
||||
// 0x80 Get mapped device to A.
|
||||
|
||||
// 0x01 Redbus Window offset to A
|
||||
// 0x81 Get RB window offset to A.
|
||||
|
||||
// 0x02 Enable redbus
|
||||
// 0x82 Disable redbus
|
||||
|
||||
// 0x03 Set external memory mapped window to A.
|
||||
// 0x83 Get memory mapped window to A.
|
||||
|
||||
// 0x04 Enable external memory mapped window.
|
||||
// 0x84 Disable external memory mapped window.
|
||||
|
||||
// 0x05 Set BRK address to A
|
||||
// 0x85 Get BRK address to A
|
||||
|
||||
// 0x06 Set POR address to A
|
||||
// 0x86 Get POR address to A
|
||||
|
||||
// 0xFF Output A register to MC logfile.
|
@ -0,0 +1,21 @@
|
||||
AR = ../bin/ar65
|
||||
export CPU = 65c02
|
||||
|
||||
|
||||
#.PHONY: all
|
||||
all: rpc8e.lib
|
||||
|
||||
rpc8e.lib: runtime common rpc8e
|
||||
rm -f rpc8e.lib
|
||||
$(AR) a rpc8e.lib runtime/*.o rpc8e/*.o common/*.o
|
||||
|
||||
.PHONY: runtime rpc8e common
|
||||
|
||||
rpc8e:
|
||||
make -C rpc8e/
|
||||
|
||||
runtime:
|
||||
make -C runtime/
|
||||
|
||||
common:
|
||||
make -C common/
|
@ -0,0 +1,4 @@
|
||||
.macro mmu command
|
||||
.byte $EF
|
||||
.byte command
|
||||
.endmacro
|
@ -0,0 +1,21 @@
|
||||
;
|
||||
; zeropage.inc
|
||||
;
|
||||
; (C) Copyright 2002 Ullrich von Bassewitz (uz@cc65.org)
|
||||
;
|
||||
|
||||
; Assembler include file that imports the runtime zero page locations used
|
||||
; by the compiler, ready for usage in asm code.
|
||||
|
||||
.importzp sp, sreg, regsave
|
||||
.importzp ptr1, ptr2, ptr3, ptr4
|
||||
.importzp tmp1, tmp2, tmp3, tmp4
|
||||
.importzp regbank
|
||||
|
||||
; The total amount of zero page space used
|
||||
|
||||
zpspace = 26
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,217 @@
|
||||
#
|
||||
# makefile for CC65 runtime library
|
||||
#
|
||||
|
||||
.SUFFIXES: .o .s .c
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Programs and flags
|
||||
|
||||
SYS = none
|
||||
|
||||
AS = ../../bin/ca65
|
||||
CC = ../../bin/cc65
|
||||
LD = ../../bin/ld65
|
||||
|
||||
AFLAGS = -t $(SYS) --forget-inc-paths -I../asminc --cpu $(CPU)
|
||||
CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include --cpu $(CPU)
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Rules
|
||||
|
||||
%.o: %.c
|
||||
@$(CC) $(CFLAGS) $<
|
||||
@$(AS) -g -o $@ $(AFLAGS) $(*).s
|
||||
|
||||
%.o: %.s
|
||||
@$(AS) -g -o $@ $(AFLAGS) $<
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Rules to help us see what code the compiler and assembler make.
|
||||
|
||||
%.s : %.c
|
||||
@$(CC) $(CFLAGS) -S $<
|
||||
|
||||
%.lst : %.s
|
||||
@$(AS) $(AFLAGS) -l -o /dev/null $<
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Object files
|
||||
|
||||
# From C source-files
|
||||
# C_OBJS = _afailed.o \
|
||||
# _hextab.o \
|
||||
# _poserror.o \
|
||||
# _scanf.o \
|
||||
# abort.o \
|
||||
# asctime.o \
|
||||
# bsearch.o \
|
||||
# errormsg.o \
|
||||
# fdopen.o \
|
||||
# fgetc.o \
|
||||
# fgetpos.o \
|
||||
# fgets.o \
|
||||
# fputc.o \
|
||||
# fputs.o \
|
||||
# freopen.o \
|
||||
# fseek.o \
|
||||
# fsetpos.o \
|
||||
# ftell.o \
|
||||
# getchar.o \
|
||||
# gets.o \
|
||||
# gmtime.o \
|
||||
# locale.o \
|
||||
# localtime.o \
|
||||
# mktime.o \
|
||||
# perror.o \
|
||||
# pmemalign.o \
|
||||
# puts.o \
|
||||
# qsort.o \
|
||||
# realloc.o \
|
||||
# rewind.o \
|
||||
# sleep.o \
|
||||
# strftime.o \
|
||||
# strtok.o \
|
||||
# strtol.o \
|
||||
# strtoul.o \
|
||||
# strxfrm.o \
|
||||
# system.o \
|
||||
# timezone.o
|
||||
|
||||
# From assembly source-files
|
||||
S_OBJS = zerobss.o copydata.o
|
||||
#_cwd.o \
|
||||
# _environ.o \
|
||||
# _fdesc.o \
|
||||
# _file.o \
|
||||
# _fopen.o \
|
||||
# _heap.o \
|
||||
# _heapadd.o \
|
||||
# _heapblocksize.o\
|
||||
# _heapmaxavail.o \
|
||||
# _heapmemavail.o \
|
||||
# _oserror.o \
|
||||
# _printf.o \
|
||||
# _seterrno.o \
|
||||
# _swap.o \
|
||||
# _sys.o \
|
||||
# abs.o \
|
||||
# atexit.o \
|
||||
# atoi.o \
|
||||
# calloc.o \
|
||||
# chdir.o \
|
||||
# copydata.o \
|
||||
# creat.o \
|
||||
# ctime.o \
|
||||
# divt.o \
|
||||
# errno.o \
|
||||
# fclose.o \
|
||||
# fmisc.o \
|
||||
# fopen.o \
|
||||
# fprintf.o \
|
||||
# fread.o \
|
||||
# free.o \
|
||||
# fscanf.o \
|
||||
# fwrite.o \
|
||||
# getcpu.o \
|
||||
# getcwd.o \
|
||||
# getenv.o \
|
||||
# interrupt.o \
|
||||
# isalnum.o \
|
||||
# isalpha.o \
|
||||
# isblank.o \
|
||||
# iscntrl.o \
|
||||
# isdigit.o \
|
||||
# isgraph.o \
|
||||
# islower.o \
|
||||
# isprint.o \
|
||||
# ispunct.o \
|
||||
# isspace.o \
|
||||
# isupper.o \
|
||||
# isxdigit.o \
|
||||
# itoa.o \
|
||||
# labs.o \
|
||||
# longjmp.o \
|
||||
# ltoa.o \
|
||||
# malloc.o \
|
||||
# maperrno.o \
|
||||
# memchr.o \
|
||||
# memcmp.o \
|
||||
# memcpy.o \
|
||||
# memmove.o \
|
||||
# memset.o \
|
||||
# mkdir.o \
|
||||
# modfree.o \
|
||||
# modload.o \
|
||||
# oserrcheck.o \
|
||||
# printf.o \
|
||||
# putchar.o \
|
||||
# putenv.o \
|
||||
# rand.o \
|
||||
# raise.o \
|
||||
# remove.o \
|
||||
# rename.o \
|
||||
# rmdir.o \
|
||||
# scanf.o \
|
||||
# searchenv.o \
|
||||
# setjmp.o \
|
||||
# signal.o \
|
||||
# sigtable.o \
|
||||
# snprintf.o \
|
||||
# sprintf.o \
|
||||
# sscanf.o \
|
||||
# strcat.o \
|
||||
# strchr.o \
|
||||
# strcmp.o \
|
||||
# strcoll.o \
|
||||
# strcpy.o \
|
||||
# strcspn.o \
|
||||
# strdup.o \
|
||||
# strerror.o \
|
||||
# stricmp.o \
|
||||
# strlen.o \
|
||||
# strlower.o \
|
||||
# strncat.o \
|
||||
# strncmp.o \
|
||||
# strncpy.o \
|
||||
# strnicmp.o \
|
||||
# stroserr.o \
|
||||
# strpbrk.o \
|
||||
# strrchr.o \
|
||||
# strspn.o \
|
||||
# strstr.o \
|
||||
# strtoimax.o \
|
||||
# strtoumax.o \
|
||||
# strupper.o \
|
||||
# time.o \
|
||||
# tolower.o \
|
||||
# toupper.o \
|
||||
# uname.o \
|
||||
# ungetc.o \
|
||||
# unlink.o \
|
||||
# utscopy.o \
|
||||
# vfprintf.o \
|
||||
# vfscanf.o \
|
||||
# vprintf.o \
|
||||
# vscanf.o \
|
||||
# vsnprintf.o \
|
||||
# vsprintf.o \
|
||||
# vsscanf.o \
|
||||
# zerobss.o
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Targets
|
||||
|
||||
.PHONY: all clean zap
|
||||
|
||||
all: $(C_OBJS) $(S_OBJS)
|
||||
|
||||
clean:
|
||||
@$(RM) *~ *.lst
|
||||
@$(RM) $(C_OBJS:.o=.s)
|
||||
@$(RM) $(C_OBJS)
|
||||
@$(RM) $(S_OBJS)
|
||||
|
||||
zap: clean
|
||||
|
@ -0,0 +1,49 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 1998-12-07, 2004-12-01
|
||||
;
|
||||
; Copy the data segment from the LOAD to the RUN location
|
||||
;
|
||||
|
||||
.export copydata
|
||||
.import __DATA_LOAD__, __DATA_RUN__, __DATA_SIZE__
|
||||
.importzp ptr1, ptr2, tmp1
|
||||
|
||||
|
||||
copydata:
|
||||
lda #<__DATA_LOAD__ ; Source pointer
|
||||
sta ptr1
|
||||
lda #>__DATA_LOAD__
|
||||
sta ptr1+1
|
||||
|
||||
lda #<__DATA_RUN__ ; Target pointer
|
||||
sta ptr2
|
||||
lda #>__DATA_RUN__
|
||||
sta ptr2+1
|
||||
|
||||
ldx #<~__DATA_SIZE__
|
||||
lda #>~__DATA_SIZE__ ; Use -(__DATASIZE__+1)
|
||||
sta tmp1
|
||||
ldy #$00
|
||||
|
||||
; Copy loop
|
||||
|
||||
@L1: inx
|
||||
beq @L3
|
||||
|
||||
@L2: lda (ptr1),y
|
||||
sta (ptr2),y
|
||||
iny
|
||||
bne @L1
|
||||
inc ptr1+1
|
||||
inc ptr2+1 ; Bump pointers
|
||||
bne @L1 ; Branch always (hopefully)
|
||||
|
||||
; Bump the high counter byte
|
||||
|
||||
@L3: inc tmp1
|
||||
bne @L2
|
||||
|
||||
; Done
|
||||
|
||||
rts
|
||||
|
@ -0,0 +1,46 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 1998-09-17, 2005-02-26.
|
||||
;
|
||||
; Zero the bss segment.
|
||||
;
|
||||
|
||||
.export zerobss
|
||||
.import __BSS_RUN__, __BSS_SIZE__
|
||||
.importzp ptr1
|
||||
|
||||
|
||||
.segment "INIT"
|
||||
|
||||
zerobss:
|
||||
lda #<__BSS_RUN__
|
||||
sta ptr1
|
||||
lda #>__BSS_RUN__
|
||||
sta ptr1+1
|
||||
lda #0
|
||||
tay
|
||||
|
||||
; Clear full pages
|
||||
|
||||
L1: ldx #>__BSS_SIZE__
|
||||
beq L3
|
||||
L2: sta (ptr1),y
|
||||
iny
|
||||
bne L2
|
||||
inc ptr1+1
|
||||
dex
|
||||
bne L2
|
||||
|
||||
; Clear remaining page (y is zero on entry)
|
||||
|
||||
L3: cpy #<__BSS_SIZE__
|
||||
beq L4
|
||||
sta (ptr1),y
|
||||
iny
|
||||
bne L3
|
||||
|
||||
; Done
|
||||
|
||||
L4: rts
|
||||
|
||||
|
||||
|
@ -0,0 +1,40 @@
|
||||
MEMORY {
|
||||
ZEROPAGE: start = $0006, size = $00FA;
|
||||
STACK: start = $0100, size = $0100, define = yes;
|
||||
RAM: start = $0500, size = $FAFF, define = yes;
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZEROPAGE, type = zp, define = yes;
|
||||
STARTUP: load = RAM, type = ro;
|
||||
CODE: load = RAM, type = ro;
|
||||
INIT: load = RAM, type = ro;
|
||||
DATA: load = RAM, type = rw, define = yes, run = RAM;
|
||||
RODATA: load = RAM, type = ro;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
HEAP: load = RAM, type = bss, optional = yes;
|
||||
# VECTOR: load = RAM, type = ro, start = $C000;
|
||||
}
|
||||
|
||||
FEATURES {
|
||||
CONDES: segment = STARTUP,
|
||||
type = constructor,
|
||||
label = __CONSTRUCTOR_TABLE__,
|
||||
count = __CONSTRUCTOR_COUNT__;
|
||||
CONDES: segment = STARTUP,
|
||||
type = destructor,
|
||||
label = __DESTRUCTOR_TABLE__,
|
||||
count = __DESTRUCTOR_COUNT__;
|
||||
}
|
||||
|
||||
SYMBOLS {
|
||||
# Define the stack size for the application
|
||||
__STACKSIZE__: value = $0200, weak = yes;
|
||||
}
|
||||
|
||||
# 0x0000 Zero page
|
||||
# 0x0100 P-stack
|
||||
# 0x0200 R-stack
|
||||
# 0x0300 bus output
|
||||
# 0x0400 bus input (also Bootloader space)
|
||||
# 0x0500 Ram (the bootloader loads the disk image here)
|
Binary file not shown.
@ -0,0 +1,45 @@
|
||||
#
|
||||
# makefile for CC65 runtime library
|
||||
#
|
||||
|
||||
.SUFFIXES: .o .s .c
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Programs and flags
|
||||
|
||||
SYS = none
|
||||
|
||||
AS = ../../bin/ca65
|
||||
CC = ../../bin/cc65
|
||||
LD = ../../bin/ld65
|
||||
|
||||
AFLAGS = -t $(SYS) --forget-inc-paths -I../asminc --cpu $(CPU)
|
||||
CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include --cpu $(CPU)
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Rules
|
||||
|
||||
.c.s:
|
||||
@$(CC) $(CFLAGS) $<
|
||||
|
||||
.s.o:
|
||||
@$(AS) -g -o $@ $(AFLAGS) $<
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Object files
|
||||
|
||||
OBJS = crt0.o \
|
||||
redbus.o
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Targets
|
||||
|
||||
.PHONY: all clean zap
|
||||
|
||||
all: $(OBJS)
|
||||
|
||||
clean:
|
||||
@$(RM) *~ $(COBJS:.o=.s) $(OBJS)
|
||||
|
||||
zap: clean
|
||||
|
@ -0,0 +1,95 @@
|
||||
; ---------------------------------------------------------------------------
|
||||
; crt0.s
|
||||
; ---------------------------------------------------------------------------
|
||||
;
|
||||
; Startup code for c65el02
|
||||
|
||||
.export _init, _exit
|
||||
.import _main
|
||||
|
||||
.export __STARTUP__ : absolute = 1 ; Mark as startup
|
||||
.import __STACK_START__, __STACK_SIZE__ ; Linker generated
|
||||
|
||||
.import copydata, zerobss, initlib, donelib
|
||||
|
||||
.include "zeropage.inc"
|
||||
|
||||
.macro MMU command
|
||||
.byte $EF
|
||||
.byte command
|
||||
.endmacro
|
||||
|
||||
.macro XCE
|
||||
.byte $FB
|
||||
.endmacro
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Place the startup code in a special segment
|
||||
|
||||
.segment "STARTUP"
|
||||
|
||||
;.byte $DB
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; A little light 6502 housekeeping
|
||||
|
||||
_init: LDX #$FF ; Initialize stack pointer to $01FF
|
||||
TXS
|
||||
CLD ; Clear decimal mode
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Set cc65 argument stack pointer
|
||||
|
||||
LDA #<(__STACK_START__ + __STACK_SIZE__ - 1)
|
||||
STA sp
|
||||
LDA #>(__STACK_START__ + __STACK_SIZE__ - 1)
|
||||
STA sp+1
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Initialize memory storage
|
||||
|
||||
JSR zerobss ; Clear BSS segment
|
||||
JSR copydata ; Initialize DATA segment
|
||||
JSR initlib ; Run constructors
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Initialize redbus
|
||||
|
||||
; from foth boot disk
|
||||
;000500 18 CLC
|
||||
;000501 FB XCE
|
||||
;000502 C2 30 REP #$30
|
||||
;000504 A9 00 03 LDA #$0300
|
||||
;000507 EF 01 MMU $01
|
||||
;000509 EF 02 MMU $02
|
||||
;00050B A9 00 04 LDA #$0400
|
||||
;00050E EF 03 MMU $03
|
||||
;000510 EF 04 MMU $04
|
||||
;000512 A9 00 05 LDA #$0500
|
||||
;000515 EF 06 MMU $06
|
||||
;000517 4C 56 1D JMP $1D56
|
||||
|
||||
;LDA $01 ; Get the main console ID
|
||||
;MMU $00
|
||||
|
||||
;LDA #$00 ; Select first line
|
||||
;STA $0300
|
||||
|
||||
;LDA #$42 ; Seems to work
|
||||
;STA $0310
|
||||
|
||||
;.byte $DB
|
||||
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Call main()
|
||||
|
||||
JSR _main
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Back from main (this is also the _exit entry): force a software break
|
||||
|
||||
_exit: JSR donelib ; Run destructors
|
||||
BRK
|
@ -0,0 +1,55 @@
|
||||
.include "mmu.inc"
|
||||
|
||||
.export _rb_enable, _rb_disable, _rb_map_device, _rb_set_window
|
||||
|
||||
|
||||
.segment "CODE"
|
||||
|
||||
;------------------------------------------
|
||||
; void __inline__ rb_enable(void);
|
||||
;------------------------------------------
|
||||
_rb_enable:
|
||||
mmu $02
|
||||
rts
|
||||
|
||||
|
||||
;------------------------------------------
|
||||
; void __inline__ rb_disable(void);
|
||||
;------------------------------------------
|
||||
_rb_disable:
|
||||
mmu $82
|
||||
rts
|
||||
|
||||
|
||||
;------------------------------------------
|
||||
; void __fastcall__ rb_set_window(void* address);
|
||||
;------------------------------------------
|
||||
_rb_set_window:
|
||||
;switch to native 16bit
|
||||
clc
|
||||
.byte $FB ; XCE
|
||||
.byte $C2, $30 ; REP #$30
|
||||
|
||||
; init redstone window at $0300
|
||||
;.byte $A9, $00, $03 ; LDA #$0300
|
||||
.byte $EB ; XBA
|
||||
stx $55
|
||||
ora $55
|
||||
.byte $EB ; XBA
|
||||
mmu $01
|
||||
|
||||
;switch to emulated 8bit
|
||||
.byte $E2, $30 ; SEP #$30
|
||||
sec
|
||||
.byte $FB ; XCE
|
||||
rts
|
||||
|
||||
|
||||
;------------------------------------------
|
||||
; void __fastcall__ rb_map_device(unsigned char id);
|
||||
;------------------------------------------
|
||||
_rb_map_device:
|
||||
mmu $00
|
||||
rts
|
||||
|
||||
|
@ -0,0 +1,234 @@
|
||||
#
|
||||
# makefile for CC65 runtime library
|
||||
#
|
||||
|
||||
.SUFFIXES: .o .s .c
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Programs and flags
|
||||
|
||||
SYS = none
|
||||
|
||||
AS = ../../bin/ca65
|
||||
CC = ../../bin/cc65
|
||||
LD = ../../bin/ld65
|
||||
|
||||
AFLAGS = -t $(SYS) --forget-inc-paths -I../asminc --cpu $(CPU)
|
||||
CFLAGS = -Osir -g -T -t $(SYS) --forget-inc-paths -I . -I ../../include --cpu $(CPU)
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Rules
|
||||
|
||||
.c.s:
|
||||
@$(CC) $(CFLAGS) $<
|
||||
|
||||
.s.o:
|
||||
@$(AS) -g -o $@ $(AFLAGS) $<
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Object files
|
||||
|
||||
OBJS = add.o \
|
||||
addeqsp.o \
|
||||
addysp.o \
|
||||
along.o \
|
||||
and.o \
|
||||
aslax1.o \
|
||||
aslax2.o \
|
||||
aslax3.o \
|
||||
aslax4.o \
|
||||
asleax1.o \
|
||||
asleax2.o \
|
||||
asleax3.o \
|
||||
asleax4.o \
|
||||
asr.o \
|
||||
asrax1.o \
|
||||
asrax2.o \
|
||||
asrax3.o \
|
||||
asrax4.o \
|
||||
asreax1.o \
|
||||
asreax2.o \
|
||||
asreax3.o \
|
||||
asreax4.o \
|
||||
axlong.o \
|
||||
bneg.o \
|
||||
bpushbsp.o \
|
||||
call.o \
|
||||
callirq.o \
|
||||
callmain.o \
|
||||
compl.o \
|
||||
condes.o \
|
||||
decax1.o \
|
||||
decax2.o \
|
||||
decax3.o \
|
||||
decax4.o \
|
||||
decax5.o \
|
||||
decax6.o \
|
||||
decax7.o \
|
||||
decax8.o \
|
||||
decaxy.o \
|
||||
decsp1.o \
|
||||
decsp2.o \
|
||||
decsp3.o \
|
||||
decsp4.o \
|
||||
decsp5.o \
|
||||
decsp6.o \
|
||||
decsp7.o \
|
||||
decsp8.o \
|
||||
div.o \
|
||||
enter.o \
|
||||
eq.o \
|
||||
ge.o \
|
||||
gt.o \
|
||||
icmp.o \
|
||||
incax1.o \
|
||||
incax2.o \
|
||||
incax3.o \
|
||||
incax5.o \
|
||||
incax6.o \
|
||||
incax7.o \
|
||||
incax8.o \
|
||||
incaxy.o \
|
||||
incsp1.o \
|
||||
incsp2.o \
|
||||
incsp3.o \
|
||||
incsp4.o \
|
||||
incsp5.o \
|
||||
incsp6.o \
|
||||
incsp7.o \
|
||||
incsp8.o \
|
||||
jmpvec.o \
|
||||
ladd.o \
|
||||
laddeq.o \
|
||||
laddeqsp.o \
|
||||
land.o \
|
||||
lasr.o \
|
||||
lbneg.o \
|
||||
lcmp.o \
|
||||
lcompl.o \
|
||||
ldai.o \
|
||||
ldau0sp.o \
|
||||
ldaui.o \
|
||||
ldauisp.o \
|
||||
ldaxi.o \
|
||||
ldaxsp.o \
|
||||
ldeaxi.o \
|
||||
ldeaxysp.o \
|
||||
ldec.o \
|
||||
ldiv.o \
|
||||
le.o \
|
||||
leaaxsp.o \
|
||||
leave.o \
|
||||
leq.o \
|
||||
lge.o \
|
||||
lgt.o \
|
||||
linc.o \
|
||||
lle.o \
|
||||
llt.o \
|
||||
lmod.o \
|
||||
lmul.o \
|
||||
lne.o \
|
||||
lneg.o \
|
||||
lor.o \
|
||||
lpop.o \
|
||||
lpush.o \
|
||||
lrsub.o \
|
||||
lsave.o \
|
||||
lshelp.o \
|
||||
lshl.o \
|
||||
lshr.o \
|
||||
lsub.o \
|
||||
lsubeq.o \
|
||||
lsubeqsp.o \
|
||||
lt.o \
|
||||
ltest.o \
|
||||
ludiv.o \
|
||||
luge.o \
|
||||
lugt.o \
|
||||
lule.o \
|
||||
lult.o \
|
||||
lumod.o \
|
||||
lxor.o \
|
||||
makebool.o \
|
||||
mod.o \
|
||||
mul.o \
|
||||
mul8.o \
|
||||
mulax3.o \
|
||||
mulax5.o \
|
||||
mulax6.o \
|
||||
mulax7.o \
|
||||
mulax9.o \
|
||||
mulax10.o \
|
||||
ne.o \
|
||||
neg.o \
|
||||
or.o \
|
||||
popa.o \
|
||||
popsreg.o \
|
||||
push1.o \
|
||||
push2.o \
|
||||
push3.o \
|
||||
push4.o \
|
||||
push5.o \
|
||||
push6.o \
|
||||
push7.o \
|
||||
pusha.o \
|
||||
pushaff.o \
|
||||
pushax.o \
|
||||
pushb.o \
|
||||
pushbsp.o \
|
||||
pushc0.o \
|
||||
pushc1.o \
|
||||
pushc2.o \
|
||||
pushlysp.o \
|
||||
pushw.o \
|
||||
pushwsp.o \
|
||||
regswap.o \
|
||||
regswap1.o \
|
||||
regswap2.o \
|
||||
return0.o \
|
||||
return1.o \
|
||||
rsub.o \
|
||||
shelp.o \
|
||||
shl.o \
|
||||
shr.o \
|
||||
shrax1.o \
|
||||
shrax2.o \
|
||||
shrax3.o \
|
||||
shrax4.o \
|
||||
shreax1.o \
|
||||
shreax2.o \
|
||||
shreax3.o \
|
||||
shreax4.o \
|
||||
staspidx.o \
|
||||
staxsp.o \
|
||||
staxspi.o \
|
||||
steaxsp.o \
|
||||
steaxspi.o \
|
||||
stkchk.o \
|
||||
sub.o \
|
||||
subeqsp.o \
|
||||
subysp.o \
|
||||
swap.o \
|
||||
tosint.o \
|
||||
toslong.o \
|
||||
udiv.o \
|
||||
uge.o \
|
||||
ugt.o \
|
||||
ule.o \
|
||||
ult.o \
|
||||
umod.o \
|
||||
xor.o \
|
||||
zeropage.o
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Targets
|
||||
|
||||
.PHONY: all clean zap
|
||||
|
||||
all: $(OBJS)
|
||||
|
||||
clean:
|
||||
@$(RM) *~ $(COBJS:.o=.s) $(OBJS)
|
||||
|
||||
zap: clean
|
||||
|
@ -0,0 +1,39 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: add ints
|
||||
;
|
||||
|
||||
; Make this as fast as possible, even if it needs more space since it's
|
||||
; called a lot!
|
||||
|
||||
.export tosadda0, tosaddax
|
||||
.importzp sp
|
||||
|
||||
.macpack cpu
|
||||
|
||||
tosadda0:
|
||||
ldx #0
|
||||
tosaddax:
|
||||
clc
|
||||
.if (.cpu .bitand CPU_ISET_65SC02)
|
||||
adc (sp) ; 65SC02 version - saves 2 cycles
|
||||
ldy #1
|
||||
.else
|
||||
ldy #0
|
||||
adc (sp),y ; lo byte
|
||||
iny
|
||||
.endif
|
||||
pha ; save it
|
||||
txa
|
||||
adc (sp),y ; hi byte
|
||||
tax
|
||||
clc
|
||||
lda sp
|
||||
adc #2
|
||||
sta sp
|
||||
bcc L1
|
||||
inc sp+1
|
||||
L1: pla ; Restore low byte
|
||||
rts
|
||||
|
@ -0,0 +1,24 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 08.10.1998
|
||||
;
|
||||
; CC65 runtime: += operator for ints on the stack
|
||||
;
|
||||
|
||||
.export addeq0sp, addeqysp
|
||||
.importzp sp
|
||||
|
||||
addeq0sp:
|
||||
ldy #0
|
||||
addeqysp:
|
||||
clc
|
||||
adc (sp),y
|
||||
sta (sp),y
|
||||
pha
|
||||
iny
|
||||
txa
|
||||
adc (sp),y
|
||||
sta (sp),y
|
||||
tax
|
||||
pla
|
||||
rts
|
||||
|
@ -0,0 +1,21 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by value in y
|
||||
;
|
||||
|
||||
.export addysp1, addysp
|
||||
.importzp sp
|
||||
|
||||
addysp1:
|
||||
iny
|
||||
addysp: pha ; Save A
|
||||
clc
|
||||
tya ; Get the value
|
||||
adc sp ; Add low byte
|
||||
sta sp ; Put it back
|
||||
bcc @L1 ; If no carry, we're done
|
||||
inc sp+1 ; Inc high byte
|
||||
@L1: pla ; Restore A
|
||||
rts
|
||||
|
@ -0,0 +1,24 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 23.11.2002
|
||||
;
|
||||
; CC65 runtime: Convert char in ax into a long
|
||||
;
|
||||
|
||||
.export aulong, along
|
||||
.importzp sreg
|
||||
|
||||
; Convert A from char to long in EAX
|
||||
|
||||
aulong: ldx #0
|
||||
stx sreg
|
||||
stx sreg+1
|
||||
rts
|
||||
|
||||
along: cmp #$80 ; Positive?
|
||||
bcc aulong ; Yes, handle like unsigned type
|
||||
ldx #$ff
|
||||
stx sreg
|
||||
stx sreg+1
|
||||
rts
|
||||
|
||||
|
@ -0,0 +1,30 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: and on ints
|
||||
;
|
||||
|
||||
.export tosanda0, tosandax
|
||||
.import addysp1
|
||||
.importzp sp, ptr4
|
||||
|
||||
.macpack cpu
|
||||
|
||||
tosanda0:
|
||||
ldx #$00
|
||||
tosandax:
|
||||
.if (.cpu .bitand CPU_ISET_65SC02)
|
||||
and (sp) ; 65SC02 version, saves 2 cycles and 1 byte
|
||||
ldy #1
|
||||
.else
|
||||
ldy #0
|
||||
and (sp),y
|
||||
iny
|
||||
.endif
|
||||
pha
|
||||
txa
|
||||
and (sp),y
|
||||
tax
|
||||
pla
|
||||
jmp addysp1 ; drop TOS, set condition codes
|
||||
|
@ -0,0 +1,17 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the primary register
|
||||
;
|
||||
|
||||
.export aslax1, shlax1
|
||||
.importzp tmp1
|
||||
|
||||
aslax1:
|
||||
shlax1: stx tmp1
|
||||
asl A
|
||||
rol tmp1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
||||
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the primary register by 4
|
||||
;
|
||||
|
||||
.export aslax2, shlax2
|
||||
.importzp tmp1
|
||||
|
||||
aslax2:
|
||||
shlax2: stx tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the primary register by 8
|
||||
;
|
||||
|
||||
.export aslax3, shlax3
|
||||
.importzp tmp1
|
||||
|
||||
aslax3:
|
||||
shlax3: stx tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,22 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.07.2001
|
||||
;
|
||||
; CC65 runtime: Scale the primary register by 16
|
||||
;
|
||||
|
||||
.export aslax4, shlax4
|
||||
.importzp tmp1
|
||||
|
||||
aslax4:
|
||||
shlax4: stx tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,19 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 2
|
||||
;
|
||||
|
||||
.export asleax1, shleax1
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asleax1:
|
||||
shleax1:
|
||||
stx tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,23 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 4
|
||||
;
|
||||
|
||||
.export asleax2, shleax2
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asleax2:
|
||||
shleax2:
|
||||
stx tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 8
|
||||
;
|
||||
|
||||
.export asleax3, shleax3
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asleax3:
|
||||
shleax3:
|
||||
stx tmp1
|
||||
asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,22 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.07.2001
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 16
|
||||
;
|
||||
|
||||
.export asleax4, shleax4
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asleax4:
|
||||
shleax4:
|
||||
stx tmp1
|
||||
ldx #4
|
||||
@L1: asl a
|
||||
rol tmp1
|
||||
rol sreg
|
||||
rol sreg+1
|
||||
dex
|
||||
bne @L1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,60 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-06-30
|
||||
;
|
||||
; CC65 runtime: right shift support for ints
|
||||
;
|
||||
; Note: The standard declares a shift count that is negative or >= the
|
||||
; bitcount of the shifted type for undefined behaviour.
|
||||
;
|
||||
; Note^2: The compiler knowns about the register/zero page usage of this
|
||||
; function, so you need to change the compiler source if you change it!
|
||||
;
|
||||
|
||||
|
||||
.export tosasrax
|
||||
.import popax
|
||||
.importzp tmp1
|
||||
|
||||
tosasrax:
|
||||
and #$0F ; Bring the shift count into a valid range
|
||||
sta tmp1 ; Save it
|
||||
|
||||
jsr popax ; Get the left hand operand
|
||||
|
||||
ldy tmp1 ; Get shift count
|
||||
beq L9 ; Bail out if shift count zero
|
||||
|
||||
cpy #8 ; Shift count 8 or greater?
|
||||
bcc L1 ; Jump if not
|
||||
|
||||
; Shift count is greater 8. The carry is set when we enter here.
|
||||
|
||||
tya
|
||||
sbc #8
|
||||
tay ; Adjust shift count
|
||||
txa
|
||||
ldx #$00 ; Shift by 8 bits
|
||||
cmp #$00 ; Test sign bit
|
||||
bpl L1
|
||||
dex ; Make X the correct sign extended value
|
||||
|
||||
; Save the high byte so we can shift it
|
||||
|
||||
L1: stx tmp1 ; Save high byte
|
||||
jmp L3
|
||||
|
||||
; Do the actual shift
|
||||
|
||||
L2: cpx #$80 ; Copy bit 15 into the carry
|
||||
ror tmp1
|
||||
ror a
|
||||
L3: dey
|
||||
bpl L2
|
||||
|
||||
; Done with shift
|
||||
|
||||
ldx tmp1
|
||||
L9: rts
|
||||
|
||||
|
||||
|
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the primary register
|
||||
;
|
||||
|
||||
.export asrax1
|
||||
.importzp tmp1
|
||||
|
||||
asrax1: stx tmp1
|
||||
cpx #$80 ; Put bit 7 into carry
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,19 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the primary register by 4
|
||||
;
|
||||
|
||||
.export asrax2
|
||||
.importzp tmp1
|
||||
|
||||
asrax2: stx tmp1
|
||||
cpx #$80 ; Put bit 7 into carry
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,23 @@
|
||||
;
|
||||
; Piotr Fusik, 24.10.2003
|
||||
; originally by Ullrich von Bassewitz
|
||||
;
|
||||
; CC65 runtime: Scale the primary register by 8
|
||||
;
|
||||
|
||||
.export asrax3
|
||||
.importzp tmp1
|
||||
|
||||
asrax3: stx tmp1
|
||||
cpx #$80 ; Put bit 7 into carry
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,26 @@
|
||||
;
|
||||
; Piotr Fusik, 24.10.2003
|
||||
; originally by Ullrich von Bassewitz
|
||||
;
|
||||
; CC65 runtime: Scale the primary register by 16
|
||||
;
|
||||
|
||||
.export asrax4
|
||||
.importzp tmp1
|
||||
|
||||
asrax4: stx tmp1
|
||||
cpx #$80 ; Put bit 7 into carry
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the primary register
|
||||
;
|
||||
|
||||
.export asreax1
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asreax1:
|
||||
stx tmp1
|
||||
ldx sreg+1
|
||||
cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,25 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 4
|
||||
;
|
||||
|
||||
.export asreax2
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asreax2:
|
||||
stx tmp1
|
||||
ldx sreg+1
|
||||
cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,30 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 8
|
||||
;
|
||||
|
||||
.export asreax3
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asreax3:
|
||||
stx tmp1
|
||||
ldx sreg+1
|
||||
cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,23 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.07.2001
|
||||
;
|
||||
; CC65 runtime: Scale the 32 bit primary register by 16
|
||||
;
|
||||
|
||||
.export asreax4
|
||||
.importzp sreg, tmp1
|
||||
|
||||
asreax4:
|
||||
stx tmp1
|
||||
ldx sreg+1
|
||||
ldy #4
|
||||
@L1: cpx #$80 ; Get bit 7 into carry
|
||||
ror sreg+1
|
||||
ror sreg
|
||||
ror tmp1
|
||||
ror a
|
||||
dey
|
||||
bne @L1
|
||||
ldx tmp1
|
||||
rts
|
||||
|
@ -0,0 +1,26 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Convert int in ax into a long
|
||||
;
|
||||
|
||||
.export axulong, axlong
|
||||
.importzp sreg
|
||||
|
||||
; Convert AX from int to long in EAX
|
||||
|
||||
axulong:
|
||||
ldy #0
|
||||
sty sreg
|
||||
sty sreg+1
|
||||
rts
|
||||
|
||||
axlong: cpx #$80 ; Positive?
|
||||
bcc axulong ; Yes, handle like unsigned type
|
||||
ldy #$ff
|
||||
sty sreg
|
||||
sty sreg+1
|
||||
rts
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: boolean negation
|
||||
;
|
||||
|
||||
.export bnega, bnegax
|
||||
.import return0, return1
|
||||
|
||||
bnegax: cpx #0
|
||||
bne L0
|
||||
bnega: tax
|
||||
bne L0
|
||||
L1: lda #1 ; Zero already in X
|
||||
rts
|
||||
|
||||
L0: ldx #0
|
||||
txa
|
||||
rts
|
||||
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 31.08.1998
|
||||
;
|
||||
; CC65 runtime: Load a from stack slot and push as byte
|
||||
;
|
||||
|
||||
.export bpushbsp, bpushbysp
|
||||
.import pusha
|
||||
.importzp sp
|
||||
|
||||
bpushbsp:
|
||||
ldy #0
|
||||
bpushbysp:
|
||||
lda (sp),y
|
||||
jmp pusha
|
||||
|
||||
|
||||
|
@ -0,0 +1,13 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: call function via pointer in ax
|
||||
;
|
||||
|
||||
.export callax
|
||||
.importzp ptr1
|
||||
|
||||
callax: sta ptr1
|
||||
stx ptr1+1
|
||||
jmp (ptr1) ; jump there
|
||||
|
@ -0,0 +1,63 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-04-04
|
||||
;
|
||||
; CC65 runtime: Support for calling special irq routines declared as condes
|
||||
; type 2.
|
||||
;
|
||||
; There are two reasons, why this is a separate routine, and the generic
|
||||
; condes routine in condes.s is not used:
|
||||
;
|
||||
; 1. Speed. Having several things hardcoded makes it faster. This is
|
||||
; important if it is called in each interrupt.
|
||||
;
|
||||
; 2. Reentrancy. The condes routines must use self modyfiying code, which
|
||||
; means it is not reentrant. An IRQ using condes, that interrupts
|
||||
; another use of condes will cause unpredicatble behaviour. The current
|
||||
; code avoids this by using locking mechanisms, but it's complex and
|
||||
; has a size and performance penalty.
|
||||
;
|
||||
; 3. Special semantics: An interruptor called by callirq must tell by
|
||||
; setting or resetting the carry flag if the interrupt has been handled
|
||||
; (which means that the interrupt is no longer active at the interrupt
|
||||
; source). callirq will call no other interruptors if this happens. To
|
||||
; simplify code, all interrupt routines will be called with carry clear
|
||||
; on entry.
|
||||
;
|
||||
; As the normal condes routine, this one has the limitation of 127 table
|
||||
; entries.
|
||||
;
|
||||
|
||||
.export callirq
|
||||
.export callirq_y ; Same but with Y preloaded
|
||||
|
||||
.import __INTERRUPTOR_TABLE__, __INTERRUPTOR_COUNT__
|
||||
|
||||
.code
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Call all IRQ routines. The function needs to use self modifying code and
|
||||
; is thereforce placed in the data segment. It will return carry set if the
|
||||
; interrupt was handled and carry clear if not. The caller may choose to
|
||||
; ignore this at will.
|
||||
; NOTE: The routine must not be called if the table is empty!
|
||||
|
||||
.data
|
||||
|
||||
callirq:
|
||||
ldy #.lobyte(__INTERRUPTOR_COUNT__*2)
|
||||
callirq_y:
|
||||
clc ; Preset carry flag
|
||||
loop: dey
|
||||
lda __INTERRUPTOR_TABLE__,y
|
||||
sta jmpvec+2 ; Modify code below
|
||||
dey
|
||||
lda __INTERRUPTOR_TABLE__,y
|
||||
sta jmpvec+1 ; Modify code below
|
||||
sty index+1 ; Modify code below
|
||||
jmpvec: jsr $FFFF ; Patched at runtime
|
||||
bcs done ; Bail out if interrupt handled
|
||||
index: ldy #$FF ; Patched at runtime
|
||||
bne loop
|
||||
done: rts
|
||||
|
||||
|
@ -0,0 +1,40 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2003-03-07
|
||||
;
|
||||
; Push arguments and call main()
|
||||
;
|
||||
|
||||
|
||||
.export callmain
|
||||
.export __argc, __argv
|
||||
|
||||
.import _main, pushax
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
; Setup the stack for main(), then jump to it
|
||||
|
||||
.proc callmain
|
||||
|
||||
lda __argc
|
||||
ldx __argc+1
|
||||
jsr pushax ; Push argc
|
||||
|
||||
lda __argv
|
||||
ldx __argv+1
|
||||
jsr pushax ; Push argv
|
||||
|
||||
ldy #4 ; Argument size
|
||||
jmp _main
|
||||
|
||||
.endproc
|
||||
|
||||
;---------------------------------------------------------------------------
|
||||
; Data
|
||||
|
||||
.bss
|
||||
__argc: .res 2
|
||||
__argv: .res 2
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,17 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: integer complement
|
||||
;
|
||||
|
||||
.export complax
|
||||
|
||||
complax:
|
||||
eor #$FF ; Not A
|
||||
pha
|
||||
txa
|
||||
eor #$FF ; Not X
|
||||
tax
|
||||
pla
|
||||
rts
|
||||
|
@ -0,0 +1,84 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 20.11.2000
|
||||
;
|
||||
; CC65 runtime: Support for calling module constructors/destructors
|
||||
;
|
||||
; The condes routine must be called with the table address in a/x and the
|
||||
; size of the table (which must not be zero!) in y. The current implementation
|
||||
; limits the table size to 254 bytes (127 vectors) but this shouldn't be
|
||||
; problem for now and may be changed later.
|
||||
;
|
||||
; libinit and libdone call condes with the predefined module constructor and
|
||||
; destructor tables, they must be called from the platform specific startup
|
||||
; code.
|
||||
|
||||
|
||||
.export initlib, donelib, condes
|
||||
|
||||
.import __CONSTRUCTOR_TABLE__, __CONSTRUCTOR_COUNT__
|
||||
.import __DESTRUCTOR_TABLE__, __DESTRUCTOR_COUNT__
|
||||
|
||||
.macpack cpu
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Initialize library modules
|
||||
|
||||
.segment "INIT"
|
||||
|
||||
.proc initlib
|
||||
|
||||
ldy #<(__CONSTRUCTOR_COUNT__*2)
|
||||
beq exit
|
||||
lda #<__CONSTRUCTOR_TABLE__
|
||||
ldx #>__CONSTRUCTOR_TABLE__
|
||||
jmp condes
|
||||
exit: rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Cleanup library modules
|
||||
|
||||
.code
|
||||
|
||||
.proc donelib
|
||||
|
||||
ldy #<(__DESTRUCTOR_COUNT__*2)
|
||||
beq exit
|
||||
lda #<__DESTRUCTOR_TABLE__
|
||||
ldx #>__DESTRUCTOR_TABLE__
|
||||
jmp condes
|
||||
exit: rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Generic table call handler. The code uses self modifying code and goes
|
||||
; into the data segment for this reason.
|
||||
; NOTE: The routine must not be called if the table is empty!
|
||||
|
||||
.data
|
||||
|
||||
.proc condes
|
||||
|
||||
sta fetch1+1
|
||||
stx fetch1+2
|
||||
sta fetch2+1
|
||||
stx fetch2+2
|
||||
loop: dey
|
||||
fetch1: lda $FFFF,y ; Patched at runtime
|
||||
sta jmpvec+2
|
||||
dey
|
||||
fetch2: lda $FFFF,y ; Patched at runtime
|
||||
sta jmpvec+1
|
||||
sty index+1
|
||||
jmpvec: jsr $FFFF ; Patched at runtime
|
||||
index: ldy #$FF ; Patched at runtime
|
||||
bne loop
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 29.12.1999
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 1
|
||||
;
|
||||
|
||||
.export decax1
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax1
|
||||
|
||||
sub #1
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 29.12.1999
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 2
|
||||
;
|
||||
|
||||
.export decax2
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax2
|
||||
|
||||
sub #2
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 26.03.2001
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 3
|
||||
;
|
||||
|
||||
.export decax3
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax3
|
||||
|
||||
sub #3
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 26.03.2001
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 4
|
||||
;
|
||||
|
||||
.export decax4
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax4
|
||||
|
||||
sub #4
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 26.03.2001
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 5
|
||||
;
|
||||
|
||||
.export decax5
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax5
|
||||
|
||||
sub #5
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 26.03.2001
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 6
|
||||
;
|
||||
|
||||
.export decax6
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax6
|
||||
|
||||
sub #6
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 26.03.2001
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 7
|
||||
;
|
||||
|
||||
.export decax7
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax7
|
||||
|
||||
sub #7
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 26.03.2001
|
||||
;
|
||||
; CC65 runtime: Decrement ax by 8
|
||||
;
|
||||
|
||||
.export decax8
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decax8
|
||||
|
||||
sub #8
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,21 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 29.12.1999
|
||||
;
|
||||
; CC65 runtime: Decrement ax by value in Y
|
||||
;
|
||||
|
||||
.export decaxy
|
||||
.importzp tmp1
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc decaxy
|
||||
|
||||
sty tmp1
|
||||
sub tmp1
|
||||
bcs @L9
|
||||
dex
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
||||
|
@ -0,0 +1,23 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 1
|
||||
;
|
||||
|
||||
.export decsp1
|
||||
.importzp sp
|
||||
|
||||
.proc decsp1
|
||||
|
||||
ldy sp
|
||||
bne @L1
|
||||
dec sp+1
|
||||
@L1: dec sp
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 2
|
||||
;
|
||||
|
||||
.export decsp2
|
||||
.importzp sp
|
||||
|
||||
.proc decsp2
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #2
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 3
|
||||
;
|
||||
|
||||
.export decsp3
|
||||
.importzp sp
|
||||
|
||||
.proc decsp3
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #3
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 4
|
||||
;
|
||||
|
||||
.export decsp4
|
||||
.importzp sp
|
||||
|
||||
.proc decsp4
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #4
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 5
|
||||
;
|
||||
|
||||
.export decsp5
|
||||
.importzp sp
|
||||
|
||||
.proc decsp5
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #5
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 6
|
||||
;
|
||||
|
||||
.export decsp6
|
||||
.importzp sp
|
||||
|
||||
.proc decsp6
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #6
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,25 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 7
|
||||
;
|
||||
|
||||
.export decsp7
|
||||
.importzp sp
|
||||
|
||||
.proc decsp7
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #7
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Decrement the stackpointer by 8
|
||||
;
|
||||
|
||||
.export decsp8
|
||||
.importzp sp
|
||||
|
||||
.proc decsp8
|
||||
|
||||
lda sp
|
||||
sec
|
||||
sbc #8
|
||||
sta sp
|
||||
bcc @L1
|
||||
rts
|
||||
|
||||
@L1: dec sp+1
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,37 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 07.08.1998
|
||||
;
|
||||
; CC65 runtime: division for signed ints
|
||||
;
|
||||
|
||||
; When negating values, we will ignore the possibility here, that one of the
|
||||
; values if $8000, in which case the negate will fail.
|
||||
|
||||
.export tosdiva0, tosdivax
|
||||
.import popsargs, udiv16, negax
|
||||
.importzp sreg, tmp1, tmp2
|
||||
|
||||
tosdiva0:
|
||||
ldx #0
|
||||
tosdivax:
|
||||
jsr popsargs ; Get arguments from stack, adjust sign
|
||||
jsr udiv16 ; Do the division
|
||||
ldx sreg+1 ; Load high byte of result
|
||||
|
||||
; Adjust the sign of the result. tmp1 contains the high byte of the left
|
||||
; operand, tmp2 contains the high byte of the right operand.
|
||||
|
||||
lda tmp1
|
||||
eor tmp2
|
||||
bpl Pos ; Jump if sign of result positive
|
||||
|
||||
; Result is negative
|
||||
|
||||
lda sreg ; Load low byte of result
|
||||
jmp negax ; Adjust the sign
|
||||
|
||||
; Result is positive
|
||||
|
||||
Pos: lda sreg
|
||||
rts
|
||||
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: function prologue
|
||||
;
|
||||
|
||||
.export enter
|
||||
.importzp sp
|
||||
|
||||
enter: tya ; get arg size
|
||||
ldy sp
|
||||
bne L1
|
||||
dec sp+1
|
||||
L1: dec sp
|
||||
ldy #0
|
||||
sta (sp),y ; Store the arg count
|
||||
rts
|
||||
|
@ -0,0 +1,17 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Compare == for ints
|
||||
;
|
||||
|
||||
.export toseq00, toseqa0, toseqax
|
||||
.import tosicmp, booleq
|
||||
.importzp sp, tmp1
|
||||
|
||||
toseq00:
|
||||
lda #$00
|
||||
toseqa0:
|
||||
ldx #$00
|
||||
toseqax:
|
||||
jsr tosicmp ; Set flags
|
||||
jmp booleq ; Convert to boolean
|
@ -0,0 +1,17 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Compare >= for signed ints
|
||||
;
|
||||
|
||||
.export tosge00, tosgea0, tosgeax
|
||||
.import tosicmp, boolge
|
||||
|
||||
|
||||
tosge00:
|
||||
lda #$00
|
||||
tosgea0:
|
||||
ldx #$00
|
||||
tosgeax:
|
||||
jsr tosicmp ; Set flags
|
||||
jmp boolge ; Convert to boolean
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 06.08.1998
|
||||
;
|
||||
; CC65 runtime: Compare > for signed ints
|
||||
;
|
||||
|
||||
.export tosgt00, tosgta0, tosgtax
|
||||
.import tosicmp, boolgt
|
||||
|
||||
|
||||
tosgt00:
|
||||
lda #$00
|
||||
tosgta0:
|
||||
ldx #$00
|
||||
tosgtax:
|
||||
jsr tosicmp ; Set the flags
|
||||
jmp boolgt ; Convert to boolean
|
||||
|
@ -0,0 +1,47 @@
|
||||
;
|
||||
; Piotr Fusik, 15.04.2002
|
||||
; originally by Ullrich von Bassewitz
|
||||
;
|
||||
; Integer compare function - used by the compare operators
|
||||
;
|
||||
|
||||
.export tosicmp, tosicmp0
|
||||
.importzp sp, sreg
|
||||
|
||||
|
||||
tosicmp0:
|
||||
ldx #$00
|
||||
|
||||
tosicmp:
|
||||
sta sreg
|
||||
stx sreg+1 ; Save ax
|
||||
|
||||
ldy #$00
|
||||
lda (sp),y ; Get low byte
|
||||
tax
|
||||
inc sp ; 5
|
||||
bne @L1 ; 3
|
||||
inc sp+1 ; (5)
|
||||
@L1:
|
||||
lda (sp),y ; Get high byte
|
||||
inc sp ; 5
|
||||
bne @L2 ; 3
|
||||
inc sp+1 ; (5)
|
||||
|
||||
; Do the compare.
|
||||
|
||||
@L2: sec
|
||||
sbc sreg+1 ; Compare high byte
|
||||
bne @L4
|
||||
cpx sreg ; Compare low byte
|
||||
beq @L3
|
||||
adc #$FF ; If the C flag is set then clear the N flag
|
||||
ora #$01 ; else set the N flag
|
||||
@L3: rts
|
||||
|
||||
@L4: bvc @L3
|
||||
eor #$FF ; Fix the N flag if overflow
|
||||
ora #$01 ; Clear the Z flag
|
||||
rts
|
||||
|
||||
|
@ -0,0 +1,24 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 1
|
||||
;
|
||||
|
||||
.export incax1
|
||||
|
||||
.macpack generic
|
||||
.macpack cpu
|
||||
|
||||
.proc incax1
|
||||
|
||||
.if (.cpu .bitand ::CPU_ISET_65SC02)
|
||||
ina ; 65C02 version
|
||||
bne @L9
|
||||
.else
|
||||
add #1
|
||||
bcc @L9
|
||||
.endif
|
||||
inx
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,18 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 2
|
||||
;
|
||||
|
||||
.export incax2
|
||||
|
||||
.macpack generic
|
||||
|
||||
.proc incax2
|
||||
|
||||
add #2
|
||||
bcc @L9
|
||||
inx
|
||||
@L9: rts
|
||||
|
||||
.endproc
|
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 3
|
||||
;
|
||||
|
||||
.export incax3
|
||||
.import incaxy
|
||||
|
||||
.proc incax3
|
||||
|
||||
ldy #3
|
||||
jmp incaxy
|
||||
|
||||
.endproc
|
||||
|
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 5
|
||||
;
|
||||
|
||||
.export incax5
|
||||
.import incaxy
|
||||
|
||||
.proc incax5
|
||||
|
||||
ldy #5
|
||||
jmp incaxy
|
||||
|
||||
.endproc
|
||||
|
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 6
|
||||
;
|
||||
|
||||
.export incax6
|
||||
.import incaxy
|
||||
|
||||
.proc incax6
|
||||
|
||||
ldy #6
|
||||
jmp incaxy
|
||||
|
||||
.endproc
|
||||
|
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 7
|
||||
;
|
||||
|
||||
.export incax7
|
||||
.import incaxy
|
||||
|
||||
.proc incax7
|
||||
|
||||
ldy #7
|
||||
jmp incaxy
|
||||
|
||||
.endproc
|
||||
|
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by 8
|
||||
;
|
||||
|
||||
.export incax8
|
||||
.import incaxy
|
||||
|
||||
.proc incax8
|
||||
|
||||
ldy #8
|
||||
jmp incaxy
|
||||
|
||||
.endproc
|
||||
|
@ -0,0 +1,17 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 05.08.1998
|
||||
;
|
||||
; CC65 runtime: Increment ax by valie in y
|
||||
;
|
||||
|
||||
.export incaxy, incax4
|
||||
.importzp tmp1
|
||||
.macpack generic
|
||||
|
||||
incax4: ldy #4
|
||||
incaxy: sty tmp1
|
||||
add tmp1
|
||||
bcc @L9
|
||||
inx
|
||||
@L9: rts
|
||||
|
@ -0,0 +1,22 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 1
|
||||
;
|
||||
|
||||
.export incsp1
|
||||
.importzp sp
|
||||
|
||||
.proc incsp1
|
||||
|
||||
inc sp
|
||||
bne @L1
|
||||
inc sp+1
|
||||
@L1: rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,47 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 2. For performance reasons,
|
||||
; this modules does also contain the popax function.
|
||||
|
||||
.export popax, incsp2
|
||||
.importzp sp
|
||||
|
||||
.macpack cpu
|
||||
|
||||
; Pop a/x from stack. This function will run directly into incsp2
|
||||
|
||||
.proc popax
|
||||
|
||||
ldy #1
|
||||
lda (sp),y ; get hi byte
|
||||
tax ; into x
|
||||
.if (.cpu .bitand ::CPU_ISET_65SC02)
|
||||
lda (sp) ; get lo byte
|
||||
.else
|
||||
dey
|
||||
lda (sp),y ; get lo byte
|
||||
.endif
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
.proc incsp2
|
||||
|
||||
inc sp ; 5
|
||||
beq @L1 ; 2
|
||||
inc sp ; 5
|
||||
beq @L2 ; 2
|
||||
rts
|
||||
|
||||
@L1: inc sp ; 5
|
||||
@L2: inc sp+1 ; 5
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 3
|
||||
;
|
||||
|
||||
.export incsp3
|
||||
.import addysp
|
||||
|
||||
.proc incsp3
|
||||
|
||||
ldy #3
|
||||
jmp addysp
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 4
|
||||
;
|
||||
|
||||
.export incsp4
|
||||
.import addysp
|
||||
|
||||
.proc incsp4
|
||||
|
||||
ldy #4
|
||||
jmp addysp
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 5
|
||||
;
|
||||
|
||||
.export incsp5
|
||||
.import addysp
|
||||
|
||||
.proc incsp5
|
||||
|
||||
ldy #5
|
||||
jmp addysp
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 6
|
||||
;
|
||||
|
||||
.export incsp6
|
||||
.import addysp
|
||||
|
||||
.proc incsp6
|
||||
|
||||
ldy #6
|
||||
jmp addysp
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 7
|
||||
;
|
||||
|
||||
.export incsp7
|
||||
.import addysp
|
||||
|
||||
.proc incsp7
|
||||
|
||||
ldy #7
|
||||
jmp addysp
|
||||
|
||||
.endproc
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,17 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 25.10.2000
|
||||
;
|
||||
; CC65 runtime: Increment the stackpointer by 8
|
||||
;
|
||||
|
||||
.export incsp8
|
||||
.import addysp
|
||||
|
||||
.proc incsp8
|
||||
|
||||
ldy #8
|
||||
jmp addysp
|
||||
|
||||
.endproc
|
||||
|
||||
|
@ -0,0 +1,14 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2002-12-26
|
||||
;
|
||||
; CC65 runtime: Jump vector that resides in the data segment so it's address
|
||||
; may be patched at runtime.
|
||||
;
|
||||
|
||||
.export jmpvec
|
||||
|
||||
.data
|
||||
|
||||
jmpvec: jmp $FFFF
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue