mirror of
https://github.com/cc65/cc65.git
synced 2025-01-10 03:30:05 +00:00
Merge remote-tracking branch 'refs/remotes/cc65/master' into doc-cc65-intern
This commit is contained in:
commit
fa5b0d88c5
@ -25,6 +25,7 @@ including
|
||||
- the Atari 8 bit machines.
|
||||
- the Atari 5200 console.
|
||||
- GEOS for the C64, C128 and Apple //e.
|
||||
- the Bit Corporation Gamate console.
|
||||
- the NEC PC-Engine (aka TurboGrafx-16).
|
||||
- the Nintendo Entertainment System (NES) console.
|
||||
- the Watara Supervision console.
|
||||
|
@ -204,6 +204,8 @@ MMU_CFG_RAM0 := %00111111 ; Bank 0 full RAM
|
||||
MMU_CFG_RAM1 := %01111111 ; Bank 1 full RAM
|
||||
MMU_CFG_RAM2 := %10111111 ; Bank 2 full RAM
|
||||
MMU_CFG_RAM3 := %11111111 ; Bank 3 full RAM
|
||||
MMU_CFG_IFROM := %01010111 ; Bank 1 with Internal Function RAM/ROM
|
||||
MMU_CFG_EFROM := %01101011 ; Bank 1 with External Function RAM/ROM
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; Super CPU
|
||||
|
64
asminc/gamate.inc
Normal file
64
asminc/gamate.inc
Normal file
@ -0,0 +1,64 @@
|
||||
;-------------------------------------------------------------------------------
|
||||
; gamate.inc
|
||||
;
|
||||
; Gamate system specific definitions
|
||||
;
|
||||
; (w) 2015 Groepaz/Hitmen (groepaz@gmx.net)
|
||||
; based on technical reference by PeT (mess@utanet.at)
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
; look at gamate.h for comments, they are not duplicated here
|
||||
|
||||
AUDIO_BASE = $4000
|
||||
|
||||
JOY_DATA = $4400
|
||||
|
||||
JOY_DATA_UP = $01
|
||||
JOY_DATA_DOWN = $02
|
||||
JOY_DATA_LEFT = $04
|
||||
JOY_DATA_RIGHT = $08
|
||||
JOY_DATA_FIRE_A = $10
|
||||
JOY_DATA_FIRE_B = $20
|
||||
JOY_DATA_START = $40
|
||||
JOY_DATA_SELECT = $80
|
||||
|
||||
LCD_WIDTH = 160
|
||||
LCD_HEIGHT = 152
|
||||
|
||||
LCD_BASE = $5000
|
||||
LCD_MODE = $5001
|
||||
LCD_XPOS = $5002
|
||||
LCD_YPOS = $5003
|
||||
LCD_X = $5004
|
||||
LCD_Y = $5005
|
||||
LCD_READ = $5006
|
||||
LCD_DATA = $5007
|
||||
|
||||
LCD_MODE_INC_X = $00
|
||||
LCD_MODE_INC_Y = $40
|
||||
LCD_XPOS_PLANE1 = $00
|
||||
LCD_XPOS_PLANE2 = $80
|
||||
|
||||
; constants for the conio implementation
|
||||
charsperline = (LCD_WIDTH / 8)
|
||||
screenrows = (LCD_HEIGHT / 8)
|
||||
|
||||
CH_HLINE = 1
|
||||
CH_VLINE = 2
|
||||
|
||||
COLOR_WHITE = 0
|
||||
COLOR_GREY2 = 1
|
||||
COLOR_GREY1 = 2
|
||||
COLOR_BLACK = 3
|
||||
|
||||
; bios zp usage:
|
||||
ZP_NMI_4800 = $0a
|
||||
ZP_IRQ_COUNT = $0b
|
||||
ZP_IRQ_CTRL = $0c
|
||||
|
||||
ZP_IRQ_CNT1 = $0e
|
||||
ZP_IRQ_CNT2 = $0f
|
||||
ZP_IRQ_CNT3 = $10
|
||||
ZP_IRQ_CNT4 = $11
|
||||
|
||||
ZP_NMI_FLAG = $e8
|
@ -15,8 +15,7 @@ MEMORY {
|
||||
LOADADDR: file = %O, start = %S - 2, size = $0002;
|
||||
HEADER: file = %O, define = yes, start = %S, size = $000D;
|
||||
MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __OVERLAYSTART__ - __STACKSIZE__ - __HEADER_LAST__;
|
||||
MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__;
|
||||
INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
|
||||
INIT: file = %O, start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
|
||||
OVL1ADDR: file = "%O.1", start = __OVERLAYSTART__ - 2, size = $0002;
|
||||
OVL1: file = "%O.1", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
|
||||
OVL2ADDR: file = "%O.2", start = __OVERLAYSTART__ - 2, size = $0002;
|
||||
@ -37,35 +36,35 @@ MEMORY {
|
||||
OVL9: file = "%O.9", start = __OVERLAYSTART__, size = __OVERLAYSIZE__;
|
||||
}
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
LOADADDR: load = LOADADDR, type = ro;
|
||||
EXEHDR: load = HEADER, type = ro;
|
||||
STARTUP: load = MAIN, type = ro;
|
||||
LOWCODE: load = MAIN, type = ro, optional = yes;
|
||||
CODE: load = MAIN, type = ro;
|
||||
RODATA: load = MAIN, type = ro;
|
||||
DATA: load = MAIN, type = rw;
|
||||
INITBSS: load = MAIN, type = bss, define = yes;
|
||||
BSS: load = MAIN, type = bss, define = yes;
|
||||
INIT: load = MOVE, run = INIT, type = ro, define = yes;
|
||||
OVL1ADDR: load = OVL1ADDR, type = ro;
|
||||
OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes;
|
||||
OVL2ADDR: load = OVL2ADDR, type = ro;
|
||||
OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes;
|
||||
OVL3ADDR: load = OVL3ADDR, type = ro;
|
||||
OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes;
|
||||
OVL4ADDR: load = OVL4ADDR, type = ro;
|
||||
OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes;
|
||||
OVL5ADDR: load = OVL5ADDR, type = ro;
|
||||
OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes;
|
||||
OVL6ADDR: load = OVL6ADDR, type = ro;
|
||||
OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes;
|
||||
OVL7ADDR: load = OVL7ADDR, type = ro;
|
||||
OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes;
|
||||
OVL8ADDR: load = OVL8ADDR, type = ro;
|
||||
OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes;
|
||||
OVL9ADDR: load = OVL9ADDR, type = ro;
|
||||
OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes;
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
LOADADDR: load = LOADADDR, type = ro;
|
||||
EXEHDR: load = HEADER, type = ro;
|
||||
STARTUP: load = MAIN, type = ro;
|
||||
LOWCODE: load = MAIN, type = ro, optional = yes;
|
||||
CODE: load = MAIN, type = ro;
|
||||
RODATA: load = MAIN, type = ro;
|
||||
DATA: load = MAIN, type = rw;
|
||||
INITBSS: load = MAIN, type = rw;
|
||||
BSS: load = MAIN, type = bss, define = yes;
|
||||
INIT: load = INIT, type = ro;
|
||||
OVL1ADDR: load = OVL1ADDR, type = ro;
|
||||
OVERLAY1: load = OVL1, type = ro, define = yes, optional = yes;
|
||||
OVL2ADDR: load = OVL2ADDR, type = ro;
|
||||
OVERLAY2: load = OVL2, type = ro, define = yes, optional = yes;
|
||||
OVL3ADDR: load = OVL3ADDR, type = ro;
|
||||
OVERLAY3: load = OVL3, type = ro, define = yes, optional = yes;
|
||||
OVL4ADDR: load = OVL4ADDR, type = ro;
|
||||
OVERLAY4: load = OVL4, type = ro, define = yes, optional = yes;
|
||||
OVL5ADDR: load = OVL5ADDR, type = ro;
|
||||
OVERLAY5: load = OVL5, type = ro, define = yes, optional = yes;
|
||||
OVL6ADDR: load = OVL6ADDR, type = ro;
|
||||
OVERLAY6: load = OVL6, type = ro, define = yes, optional = yes;
|
||||
OVL7ADDR: load = OVL7ADDR, type = ro;
|
||||
OVERLAY7: load = OVL7, type = ro, define = yes, optional = yes;
|
||||
OVL8ADDR: load = OVL8ADDR, type = ro;
|
||||
OVERLAY8: load = OVL8, type = ro, define = yes, optional = yes;
|
||||
OVL9ADDR: load = OVL9ADDR, type = ro;
|
||||
OVERLAY9: load = OVL9, type = ro, define = yes, optional = yes;
|
||||
}
|
||||
FEATURES {
|
||||
CONDES: type = constructor,
|
||||
|
25
cfg/c64.cfg
25
cfg/c64.cfg
@ -12,21 +12,20 @@ MEMORY {
|
||||
LOADADDR: file = %O, start = %S - 2, size = $0002;
|
||||
HEADER: file = %O, define = yes, start = %S, size = $000D;
|
||||
MAIN: file = %O, define = yes, start = __HEADER_LAST__, size = __HIMEM__ - __STACKSIZE__ - __HEADER_LAST__;
|
||||
MOVE: file = %O, start = __INITBSS_LOAD__, size = __HIMEM__ - __BSS_RUN__;
|
||||
INIT: file = "", start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
|
||||
INIT: file = %O, start = __BSS_RUN__, size = __HIMEM__ - __BSS_RUN__;
|
||||
}
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
LOADADDR: load = LOADADDR, type = ro;
|
||||
EXEHDR: load = HEADER, type = ro;
|
||||
STARTUP: load = MAIN, type = ro;
|
||||
LOWCODE: load = MAIN, type = ro, optional = yes;
|
||||
CODE: load = MAIN, type = ro;
|
||||
RODATA: load = MAIN, type = ro;
|
||||
DATA: load = MAIN, type = rw;
|
||||
INITBSS: load = MAIN, type = bss, define = yes;
|
||||
BSS: load = MAIN, type = bss, define = yes;
|
||||
INIT: load = MOVE, run = INIT, type = ro, define = yes;
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
LOADADDR: load = LOADADDR, type = ro;
|
||||
EXEHDR: load = HEADER, type = ro;
|
||||
STARTUP: load = MAIN, type = ro;
|
||||
LOWCODE: load = MAIN, type = ro, optional = yes;
|
||||
CODE: load = MAIN, type = ro;
|
||||
RODATA: load = MAIN, type = ro;
|
||||
DATA: load = MAIN, type = rw;
|
||||
INITBSS: load = MAIN, type = rw;
|
||||
BSS: load = MAIN, type = bss, define = yes;
|
||||
INIT: load = INIT, type = ro, define = yes;
|
||||
}
|
||||
FEATURES {
|
||||
CONDES: type = constructor,
|
||||
|
41
cfg/gamate.cfg
Normal file
41
cfg/gamate.cfg
Normal file
@ -0,0 +1,41 @@
|
||||
# linker config to produce simple Gamate cartridge (.bin)
|
||||
|
||||
SYMBOLS {
|
||||
__STARTUP__: type = import;
|
||||
__STACKSIZE__: type = weak, value = $0080; # 1 page stack
|
||||
}
|
||||
|
||||
MEMORY {
|
||||
# 0000-03ff is RAM
|
||||
# FIXME: what zp range can we actually use?
|
||||
# $0a-$11 is used by IRQ/NMI, $e8 is used by NMI
|
||||
ZP: start = $0012, size = $e8 - $12;
|
||||
CPUSTACK: start = $0100, size =$100;
|
||||
RAM: start = $0200, size = $200 - __STACKSIZE__, define = yes;
|
||||
|
||||
CARTHEADER: file = %O, define = yes, start = %S, size = $0029;
|
||||
# 6000-e000 can be (Cartridge) ROM
|
||||
# WARNING: fill value must be $00 else it will no more work
|
||||
#ROM: start = $6000, size = $1000, fill = yes, fillval = $00, file = %O, define = yes;
|
||||
#ROMFILL: start = $7000, size = $7000, fill = yes, fillval = $00, file = %O, define = yes;
|
||||
# for images that have code >$6fff we must calculate the checksum!
|
||||
ROM: start = $6000 + $29, size = $8000 - $29, fill = yes, fillval = $00, file = %O, define = yes;
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
ZEROPAGE: load = ZP, type = zp, define = yes;
|
||||
EXTZP: load = ZP, type = zp, define = yes, optional = yes;
|
||||
APPZP: load = ZP, type = zp, define = yes, optional = yes;
|
||||
STARTUP: load = CARTHEADER, type = ro, define=yes;
|
||||
INIT: load = ROM, type = ro, define = yes, optional = yes;
|
||||
CODE: load = ROM, type = ro, define=yes;
|
||||
RODATA: load = ROM, type = ro, define=yes;
|
||||
DATA: load = ROM, run=RAM, type = rw, define = yes;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
}
|
||||
|
||||
FEATURES {
|
||||
CONDES: segment = RODATA, type = constructor, label = __CONSTRUCTOR_TABLE__, count = __CONSTRUCTOR_COUNT__;
|
||||
CONDES: segment = RODATA, type = destructor, label = __DESTRUCTOR_TABLE__, count = __DESTRUCTOR_COUNT__;
|
||||
CONDES: segment = RODATA, type = interruptor, label = __INTERRUPTOR_TABLE__, count = __INTERRUPTOR_COUNT__, import = __CALLIRQ__;
|
||||
}
|
@ -191,11 +191,19 @@ missing on VDC, and are translated to the two colors missing from the VIC palett
|
||||
|
||||
<descrip>
|
||||
|
||||
<tag><tt/c128-efnram.emd (c128_efnram_emd)/</tag>
|
||||
Extended memory driver for the C128 External Function RAM.
|
||||
Written and contributed by Marco van den Heuvel.
|
||||
|
||||
<tag><tt/c128-georam.emd (c128_georam_emd)/</tag>
|
||||
A driver for the GeoRam cartridge. The driver will always assume 2048 pages
|
||||
of 256 bytes each. There are no checks, so if your program knows better,
|
||||
just go ahead.
|
||||
|
||||
<tag><tt/c128-ifnram.emd (c128_ifnram_emd)/</tag>
|
||||
Extended memory driver for the C128 Internal Function RAM.
|
||||
Written and contributed by Marco van den Heuvel.
|
||||
|
||||
<tag><tt/c128-ram.emd (c128_ram_emd)/</tag>
|
||||
An extended memory driver for the RAM in page 1. The common memory area is
|
||||
excluded, so this driver supports 251 pages of 256 bytes each.
|
||||
|
@ -257,6 +257,10 @@ Note that the graphics drivers are incompatible with the
|
||||
|
||||
<descrip>
|
||||
|
||||
<tag><tt/c64-65816.emd (c64_65816_emd)/</tag>
|
||||
Extended memory driver for 65816 (eg SCPU) based extra RAM.
|
||||
Written and contributed by Marco van den Heuvel.
|
||||
|
||||
<tag><tt/c64-c256k.emd (c64_c256k_emd)/</tag>
|
||||
A driver for the C64 256K memory expansion. This driver offers 768 pages of
|
||||
256 bytes each. Written and contributed by Marco van den Heuvel.
|
||||
|
159
doc/gamate.sgml
Normal file
159
doc/gamate.sgml
Normal file
@ -0,0 +1,159 @@
|
||||
<!doctype linuxdoc system>
|
||||
|
||||
<article>
|
||||
|
||||
<title>Gamate System specific information for cc65
|
||||
<author>
|
||||
<url url="mailto:groepaz@gmx.net" name="Groepaz/Hitmen">
|
||||
<date>2015-11-29
|
||||
|
||||
<abstract>
|
||||
An overview over the Gamate runtime system as it is implemented for the
|
||||
cc65 C compiler.
|
||||
</abstract>
|
||||
|
||||
<!-- Table of contents -->
|
||||
<toc>
|
||||
|
||||
<!-- Begin the document -->
|
||||
|
||||
<sect>Overview<p>
|
||||
|
||||
This file contains an overview of the Gamate runtime system as it comes
|
||||
with the cc65 C compiler. It describes the memory layout, Gamate specific header
|
||||
files, available drivers, and any pitfalls specific to that platform.
|
||||
|
||||
Please note that Gamate specific functions are just mentioned here, they are
|
||||
described in detail in the separate <url url="funcref.html" name="function
|
||||
reference">. Even functions marked as "platform dependent" may be available on
|
||||
more than one platform. Please see the function reference for more
|
||||
information.
|
||||
|
||||
|
||||
<sect>Binary format<p>
|
||||
|
||||
The standard binary output format generated by the linker for the Gamate target
|
||||
is a cartridge image with header. It is of course possible to change this
|
||||
behaviour by using a modified startup file and linker config.
|
||||
|
||||
Note: the first two bytes of the header contain a checksum that must be inserted
|
||||
by an external program. Such an utility is provided in util/gamate/gamate-fixcart.c
|
||||
|
||||
<sect>Platform specific header files<p>
|
||||
|
||||
Programs containing Gamate specific code may use the <tt/gamate.h/ header file.
|
||||
|
||||
|
||||
<sect1>Hardware access<p>
|
||||
|
||||
The following pseudo variables declared in the <tt/gamate.inc/ include file do
|
||||
allow access to hardware located in the address space.
|
||||
|
||||
<descrip>
|
||||
|
||||
</descrip><p>
|
||||
|
||||
|
||||
|
||||
<sect>Loadable drivers<p>
|
||||
|
||||
All drivers must be statically linked because no file I/O is available.
|
||||
The names in the parentheses denote the symbols to be used for static linking of the drivers.
|
||||
|
||||
|
||||
<sect1>Graphics drivers<p>
|
||||
|
||||
No TGI graphics drivers are currently available for the Gamate.
|
||||
|
||||
|
||||
<sect1>Extended memory drivers<p>
|
||||
|
||||
No extended memory drivers are currently available for the Gamate.
|
||||
|
||||
|
||||
<sect1>Joystick drivers<p>
|
||||
|
||||
<descrip>
|
||||
|
||||
<tag><tt/gamate-stdjoy.joy (gamate_stdjoy)/</tag>
|
||||
A joystick driver for the standard two buttons joypad is available.
|
||||
|
||||
</descrip><p>
|
||||
|
||||
|
||||
<sect1>Mouse drivers<p>
|
||||
|
||||
No mouse drivers are currently available for the Gamate.
|
||||
|
||||
|
||||
<sect1>RS232 device drivers<p>
|
||||
|
||||
No serial drivers are currently available for the Gamate.
|
||||
|
||||
|
||||
|
||||
<sect>Limitations<p>
|
||||
|
||||
<itemize>
|
||||
<item>When using the C-compiler, keep in mind that only 0x200 bytes RAM in total
|
||||
can be used for variables and the runtime stack.
|
||||
</itemize>
|
||||
|
||||
<sect1>Disk I/O<p>
|
||||
|
||||
The existing library for the Gamate doesn't implement C file
|
||||
I/O. There are no hacks for the <tt/read()/ and <tt/write()/ routines.
|
||||
|
||||
To be more concrete, this limitation means that you cannot use any of the
|
||||
following functions (and a few others):
|
||||
|
||||
<itemize>
|
||||
<item>printf
|
||||
<item>fclose
|
||||
<item>fopen
|
||||
<item>fread
|
||||
<item>fprintf
|
||||
<item>fputc
|
||||
<item>fscanf
|
||||
<item>fwrite
|
||||
<item>...
|
||||
</itemize>
|
||||
|
||||
<sect>Other hints<p>
|
||||
|
||||
<itemize>
|
||||
<item>The Gamate is emulated by MESS (<url url="http://www.mess.org/">),
|
||||
run like this: <tt>mess gamate -debug -window -skip_gameinfo -cart test.bin</tt>
|
||||
</itemize>
|
||||
|
||||
some resources on the Gamate:
|
||||
|
||||
<itemize>
|
||||
<item><url url="http://en.wikipedia.org/wiki/Gamate">
|
||||
</itemize>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
|
@ -149,6 +149,9 @@
|
||||
<tag><htmlurl url="pce.html" name="pce.html"></tag>
|
||||
Topics specific to NEC PC-Engine (TurboGrafx) Console.
|
||||
|
||||
<tag><htmlurl url="gamate.html" name="gamate.html"></tag>
|
||||
Topics specific to Bit Corporation Gamate Console.
|
||||
|
||||
<tag><htmlurl url="pet.html" name="pet.html"></tag>
|
||||
Topics specific to the Commodore PET machines.
|
||||
|
||||
|
@ -69,6 +69,8 @@
|
||||
# include <atmos.h>
|
||||
#elif defined(__CBM__)
|
||||
# include <cbm.h>
|
||||
#elif defined(__GAMATE__)
|
||||
# include <gamate.h>
|
||||
#elif defined(__GEOS__)
|
||||
# include <geos.h>
|
||||
#elif defined(__LUNIX__)
|
||||
|
200
include/gamate.h
Normal file
200
include/gamate.h
Normal file
@ -0,0 +1,200 @@
|
||||
/*****************************************************************************/
|
||||
/* */
|
||||
/* gamate.h */
|
||||
/* */
|
||||
/* Gamate system specific definitions */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (w) 2015 Groepaz/Hitmen (groepaz@gmx.net) */
|
||||
/* based on technical reference by PeT (mess@utanet.at) */
|
||||
/* */
|
||||
/* 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 _GAMATE_H
|
||||
#define _GAMATE_H
|
||||
|
||||
/* Check for errors */
|
||||
#if !defined(__GAMATE__)
|
||||
# error This module may only be used when compiling for the Gamate!
|
||||
#endif
|
||||
|
||||
#define AUDIO_BASE 0x4000
|
||||
|
||||
/*
|
||||
base clock cpu clock/32 ?
|
||||
|
||||
0/1: 1. channel(right): 12 bit frequency: right frequency 0 nothing, 1 high;
|
||||
3 23khz; 4 17,3; 10 6,9; 15 4.6; $60 720hz; $eff 18,0; $fff 16,9 hz)
|
||||
(delay clock/32)
|
||||
2/3: 2. channel(left): 12 bit frequency
|
||||
4/5: 3. channel(both): 12 bit frequency
|
||||
6: 0..5 noise frequency 0 fast 1f slow (about 500us) 15.6ns--> clock/32 counts
|
||||
7 control (hinibble right)
|
||||
bit 0: right channel high (full cycle, else square pulse/tone)
|
||||
bit 1: left channel high
|
||||
bit 2: both channel high
|
||||
bit 3: set right tone (else noise)
|
||||
bit 4: set left channel normal
|
||||
bit 5: set both normal
|
||||
bits 30: 11 high, 10 square, 01 noise, 00 noise only when square high
|
||||
noise means switches channel to ad converter based noise algorithmen
|
||||
(white noise shift register 17bit wide, repeats after about 130000 cycles)
|
||||
probably out=!bit16, bit0=bit16 xor bit13; runs through, so start value anything than 0
|
||||
8: 1st volume: 0..3 square volume; bit 4 envelope (higher priority)
|
||||
9: 2nd volume
|
||||
10: 3rd volume
|
||||
11/12: envelope delay time 0 fast, 0xffff slow/nearly no effect (2 22us, 4 56us)
|
||||
frequency $800, envelope $10 2 times in pulse high time (4*16*16)
|
||||
13: envelope control
|
||||
0-3 one time falling
|
||||
4-7 one time rising
|
||||
8 falling
|
||||
9 one time falling
|
||||
a starts with down falling, rising; same falling time, but double/longer cycle
|
||||
b one time falling, on
|
||||
c rising
|
||||
d one time rising, on
|
||||
e rising, falling (double cycle before restart)
|
||||
f one time rising
|
||||
bit 0: once only
|
||||
bit 1: full tone
|
||||
bit 2: start rising (else falling)
|
||||
bit 3:
|
||||
*/
|
||||
|
||||
#define JOY_DATA 0x4400
|
||||
|
||||
#define JOY_DATA_UP 0x01
|
||||
#define JOY_DATA_DOWN 0x02
|
||||
#define JOY_DATA_LEFT 0x04
|
||||
#define JOY_DATA_RIGHT 0x08
|
||||
#define JOY_DATA_FIRE_A 0x10
|
||||
#define JOY_DATA_FIRE_B 0x20
|
||||
#define JOY_DATA_START 0x40
|
||||
#define JOY_DATA_SELECT 0x80
|
||||
|
||||
/* LCD
|
||||
|
||||
resolution 160x152 in 4 greys/greens
|
||||
2 256x256 sized bitplanes (2x 8kbyte ram)
|
||||
*/
|
||||
#define LCD_BASE 0x5000
|
||||
|
||||
#define LCD_MODE 0x5001
|
||||
/*
|
||||
bit 3..0 (from zeropage 15)
|
||||
bit 0 set no normal screen display, seldom scrolling effects on screen;
|
||||
bytes written to somewhat actual display refresh position!?
|
||||
bytes read "random"
|
||||
bit 1,2,3 no effect
|
||||
bit 4 swaps plane intensity
|
||||
bit 5 ? display effect
|
||||
bit 6 on y auto increment (else auto x increment), reading
|
||||
bit 7 ? lcd flickering
|
||||
*/
|
||||
#define LCD_MODE_INC_Y 0x40
|
||||
|
||||
#define LCD_XPOS 0x5002 /* smooth scrolling X */
|
||||
#define LCD_YPOS 0x5003 /* smooth scrolling Y */
|
||||
/*
|
||||
smooth scrolling until $c8 with 200 limit
|
||||
after 200 display if ((value & 0xf) < 8) display of (value & 0xf) - 8
|
||||
chaos lines from value + current line from plane 2 only then lines starting
|
||||
with zero (problematic 200 limit/overrun implementation!?)
|
||||
*/
|
||||
#define LCD_X 0x5004 /* x-addr */
|
||||
/*
|
||||
bit 5,6 no effect
|
||||
bit 7 0 1st/1 2nd bitplane
|
||||
*/
|
||||
#define LCD_XPOS_PLANE1 0x00
|
||||
#define LCD_XPOS_PLANE2 0x80
|
||||
|
||||
#define LCD_Y 0x5005 /* y-addr */
|
||||
|
||||
#define LCD_READ 0x5006 /* read from RAM (no auto inc?) */
|
||||
#define LCD_DATA 0x5007 /* write to RAM */
|
||||
|
||||
/* BIOS zeropage usage */
|
||||
|
||||
/* locations 0x0a-0x0c, 0x0e-0x11 and 0xe8 are in use by the BIOS IRQ/NMI handlers */
|
||||
#define ZP_NMI_4800 0x0a /* content of I/O reg 4800 gets copied here each NMI */
|
||||
|
||||
#define ZP_IRQ_COUNT 0x0b /* increments once per IRQ, used elsewhere in the
|
||||
BIOS for synchronisation purposes */
|
||||
#define ZP_IRQ_CTRL 0x0c /* if 0 then cartridge irq stubs will not get called */
|
||||
|
||||
/* each of the following 4 increments by 1 per IRQ - it is _not_ a 32bit
|
||||
counter (see code at $ffa6 in BIOS)
|
||||
these are not used elsewhere in the bios and can be (re)set as needed by
|
||||
the user.
|
||||
*/
|
||||
#define ZP_IRQ_CNT1 0x0e
|
||||
#define ZP_IRQ_CNT2 0x0f
|
||||
#define ZP_IRQ_CNT3 0x10
|
||||
#define ZP_IRQ_CNT4 0x11
|
||||
|
||||
#define ZP_NMI_FLAG 0xe8 /* set to 0xff each NMI */
|
||||
|
||||
/* constants for the conio implementation */
|
||||
#define COLOR_BLACK 0x03
|
||||
#define COLOR_WHITE 0x00
|
||||
|
||||
#define CH_HLINE 1
|
||||
#define CH_VLINE 2
|
||||
#define CH_CROSS 3
|
||||
#define CH_ULCORNER 4
|
||||
#define CH_URCORNER 5
|
||||
#define CH_LLCORNER 6
|
||||
#define CH_LRCORNER 7
|
||||
#define CH_TTEE 8
|
||||
#define CH_BTEE 9
|
||||
|
||||
#define CH_RTEE 11
|
||||
#define CH_LTEE 12
|
||||
|
||||
#define CH_ENTER 13
|
||||
#define CH_PI 18
|
||||
|
||||
#define TV_NTSC 0
|
||||
#define TV_PAL 1
|
||||
#define TV_OTHER 2
|
||||
|
||||
/* No support for dynamically loadable drivers */
|
||||
#define DYN_DRV 0
|
||||
|
||||
/* The addresses of the static drivers */
|
||||
extern void gamate_stdjoy_joy[]; /* Referred to by joy_static_stddrv[] */
|
||||
|
||||
#define JOY_FIRE_B 5
|
||||
#define JOY_START 6
|
||||
#define JOY_SELECT 7
|
||||
|
||||
void waitvblank (void);
|
||||
/* Wait for the vertical blanking */
|
||||
|
||||
/* NOTE: all Gamate are "NTSC" */
|
||||
#define get_tv() TV_NTSC
|
||||
/* Return the video mode the machine is using. */
|
||||
|
||||
/* End of gamate.h */
|
||||
#endif
|
||||
|
@ -102,6 +102,9 @@ unsigned _clocks_per_sec (void);
|
||||
#elif defined(__PCE__)
|
||||
# define CLK_TCK 60 /* POSIX */
|
||||
# define CLOCKS_PER_SEC 60 /* ANSI */
|
||||
#elif defined(__GAMATE__)
|
||||
# define CLK_TCK 135 /* POSIX */ /* FIXME */
|
||||
# define CLOCKS_PER_SEC 135 /* ANSI */ /* FIXME */
|
||||
#elif defined(__GEOS__)
|
||||
# define CLK_TCK 1 /* POSIX */
|
||||
# define CLOCKS_PER_SEC 1 /* ANSI */
|
||||
|
@ -22,6 +22,7 @@ TARGETS = apple2 \
|
||||
atmos \
|
||||
$(CBMS) \
|
||||
$(GEOS) \
|
||||
gamate \
|
||||
lynx \
|
||||
nes \
|
||||
osic1p \
|
||||
|
325
libsrc/c128/emd/c128-efnram.s
Executable file
325
libsrc/c128/emd/c128-efnram.s
Executable file
@ -0,0 +1,325 @@
|
||||
;
|
||||
; Extended memory driver for the C128 External Function RAM. Driver works
|
||||
; without problems when statically linked.
|
||||
;
|
||||
; Marco van den Heuvel, 2015-11-30
|
||||
;
|
||||
|
||||
.include "zeropage.inc"
|
||||
|
||||
.include "em-kernel.inc"
|
||||
.include "em-error.inc"
|
||||
.include "c128.inc"
|
||||
|
||||
.macpack generic
|
||||
.macpack module
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Header. Includes jump table
|
||||
|
||||
module_header _c128_efnram_emd
|
||||
|
||||
; Driver signature
|
||||
|
||||
.byte $65, $6d, $64 ; "emd"
|
||||
.byte EMD_API_VERSION ; EM API version number
|
||||
|
||||
; Library reference
|
||||
|
||||
.addr $0000
|
||||
|
||||
; Jump table
|
||||
|
||||
.addr INSTALL
|
||||
.addr UNINSTALL
|
||||
.addr PAGECOUNT
|
||||
.addr MAP
|
||||
.addr USE
|
||||
.addr COMMIT
|
||||
.addr COPYFROM
|
||||
.addr COPYTO
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Constants
|
||||
|
||||
BASE = $8000
|
||||
PAGES = 127 ; Do not touch MMU
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Data.
|
||||
|
||||
.bss
|
||||
curpage: .res 2 ; Current page number
|
||||
|
||||
window: .res 256 ; Memory "window"
|
||||
|
||||
.code
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; INSTALL routine. Is called after the driver is loaded into memory. If
|
||||
; possible, check if the hardware is present and determine the amount of
|
||||
; memory available.
|
||||
; Must return an EM_ERR_xx code in a/x.
|
||||
;
|
||||
|
||||
INSTALL:
|
||||
ldx #0
|
||||
stx ptr1
|
||||
ldx #$80
|
||||
stx ptr1+1
|
||||
ldx #<ptr1
|
||||
stx FETVEC
|
||||
stx STAVEC
|
||||
ldy #0
|
||||
ldx #MMU_CFG_EFROM
|
||||
sei
|
||||
jsr FETCH
|
||||
tax
|
||||
inx
|
||||
txa
|
||||
sta tmp1
|
||||
ldx #MMU_CFG_EFROM
|
||||
sei
|
||||
jsr STASH
|
||||
ldx #MMU_CFG_EFROM
|
||||
jsr FETCH
|
||||
cli
|
||||
cmp tmp1
|
||||
beq @ram_present
|
||||
lda #<EM_ERR_NO_DEVICE
|
||||
ldx #>EM_ERR_NO_DEVICE
|
||||
rts
|
||||
|
||||
@ram_present:
|
||||
ldx #$FF
|
||||
stx curpage
|
||||
stx curpage+1 ; Invalidate the current page
|
||||
inx
|
||||
txa ; A = X = EM_ERR_OK
|
||||
; rts ; Run into UNINSTALL instead
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; UNINSTALL routine. Is called before the driver is removed from memory.
|
||||
; Can do cleanup or whatever. Must not return anything.
|
||||
;
|
||||
|
||||
UNINSTALL:
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; PAGECOUNT: Return the total number of available pages in a/x.
|
||||
;
|
||||
|
||||
PAGECOUNT:
|
||||
lda #<PAGES
|
||||
ldx #>PAGES
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; MAP: Map the page in a/x into memory and return a pointer to the page in
|
||||
; a/x. The contents of the currently mapped page (if any) may be discarded
|
||||
; by the driver.
|
||||
;
|
||||
|
||||
MAP: sta curpage
|
||||
stx curpage+1 ; Remember the new page
|
||||
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1
|
||||
ldy #$00
|
||||
sty ptr1
|
||||
|
||||
lda #<ptr1
|
||||
sta FETVEC
|
||||
sei
|
||||
|
||||
; Transfer one page
|
||||
|
||||
@L1: ldx #MMU_CFG_EFROM
|
||||
jsr FETCH
|
||||
sta window,y
|
||||
iny
|
||||
bne @L1
|
||||
|
||||
; Return the memory window
|
||||
|
||||
cli
|
||||
lda #<window
|
||||
ldx #>window ; Return the window address
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; USE: Tell the driver that the window is now associated with a given page.
|
||||
|
||||
USE: sta curpage
|
||||
stx curpage+1 ; Remember the page
|
||||
lda #<window
|
||||
ldx #>window ; Return the window
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COMMIT: Commit changes in the memory window to extended storage.
|
||||
|
||||
COMMIT: lda curpage ; Get the current page
|
||||
ldx curpage+1
|
||||
bmi done ; Jump if no page mapped
|
||||
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1
|
||||
ldy #$00
|
||||
sty ptr1
|
||||
|
||||
lda #<ptr1
|
||||
sta STAVEC
|
||||
sei
|
||||
|
||||
; Transfer one page. Y must be zero on entry
|
||||
|
||||
@L1: lda window,y
|
||||
ldx #MMU_CFG_EFROM
|
||||
jsr STASH
|
||||
iny
|
||||
bne @L1
|
||||
cli
|
||||
|
||||
; Done
|
||||
|
||||
done: rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COPYFROM: Copy from extended into linear memory. A pointer to a structure
|
||||
; describing the request is passed in a/x.
|
||||
; The function must not return anything.
|
||||
;
|
||||
|
||||
COPYFROM:
|
||||
sta ptr3
|
||||
stx ptr3+1 ; Save the passed em_copy pointer
|
||||
|
||||
ldy #EM_COPY::OFFS
|
||||
lda (ptr3),y
|
||||
sta ptr1
|
||||
ldy #EM_COPY::PAGE
|
||||
lda (ptr3),y
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1 ; From
|
||||
|
||||
ldy #EM_COPY::BUF
|
||||
lda (ptr3),y
|
||||
sta ptr2
|
||||
iny
|
||||
lda (ptr3),y
|
||||
sta ptr2+1 ; To
|
||||
|
||||
lda #<ptr1
|
||||
sta FETVEC
|
||||
|
||||
ldy #EM_COPY::COUNT+1
|
||||
lda (ptr3),y ; Get number of pages
|
||||
beq @L2 ; Skip if no full pages
|
||||
sta tmp1
|
||||
|
||||
; Copy full pages
|
||||
|
||||
ldy #$00
|
||||
sei
|
||||
@L1: ldx #MMU_CFG_EFROM
|
||||
jsr FETCH
|
||||
sta (ptr2),y
|
||||
iny
|
||||
bne @L1
|
||||
inc ptr1+1
|
||||
inc ptr2+1
|
||||
dec tmp1
|
||||
bne @L1
|
||||
|
||||
; Copy the remainder of the page
|
||||
|
||||
@L2: ldy #EM_COPY::COUNT
|
||||
lda (ptr3),y ; Get bytes in last page
|
||||
beq @L4
|
||||
sta tmp1
|
||||
|
||||
ldy #$00
|
||||
@L3: ldx #MMU_CFG_EFROM
|
||||
jsr FETCH
|
||||
sta (ptr2),y
|
||||
iny
|
||||
dec tmp1
|
||||
bne @L3
|
||||
; Done
|
||||
|
||||
@L4: cli
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COPYTO: Copy from linear into extended memory. A pointer to a structure
|
||||
; describing the request is passed in a/x.
|
||||
; The function must not return anything.
|
||||
;
|
||||
|
||||
COPYTO: sta ptr3
|
||||
stx ptr3+1 ; Save the passed em_copy pointer
|
||||
|
||||
ldy #EM_COPY::OFFS
|
||||
lda (ptr3),y
|
||||
sta ptr1
|
||||
ldy #EM_COPY::PAGE
|
||||
lda (ptr3),y
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1 ; To
|
||||
|
||||
ldy #EM_COPY::BUF
|
||||
lda (ptr3),y
|
||||
sta ptr2
|
||||
iny
|
||||
lda (ptr3),y
|
||||
sta ptr2+1 ; From
|
||||
|
||||
lda #<ptr1
|
||||
sta STAVEC
|
||||
|
||||
ldy #EM_COPY::COUNT+1
|
||||
lda (ptr3),y ; Get number of pages
|
||||
beq @L2 ; Skip if no full pages
|
||||
sta tmp1
|
||||
|
||||
; Copy full pages
|
||||
|
||||
sei
|
||||
ldy #$00
|
||||
@L1: lda (ptr2),y
|
||||
ldx #MMU_CFG_EFROM
|
||||
jsr STASH
|
||||
iny
|
||||
bne @L1
|
||||
inc ptr1+1
|
||||
inc ptr2+1
|
||||
dec tmp1
|
||||
bne @L1
|
||||
|
||||
; Copy the remainder of the page
|
||||
|
||||
@L2: ldy #EM_COPY::COUNT
|
||||
lda (ptr3),y ; Get bytes in last page
|
||||
beq @L4
|
||||
sta tmp1
|
||||
|
||||
ldy #$00
|
||||
@L3: lda (ptr2),y
|
||||
ldx #MMU_CFG_EFROM
|
||||
jsr STASH
|
||||
iny
|
||||
dec tmp1
|
||||
bne @L3
|
||||
|
||||
; Done
|
||||
|
||||
@L4: cli
|
||||
rts
|
325
libsrc/c128/emd/c128-ifnram.s
Executable file
325
libsrc/c128/emd/c128-ifnram.s
Executable file
@ -0,0 +1,325 @@
|
||||
;
|
||||
; Extended memory driver for the C128 Internal Function RAM. Driver works
|
||||
; without problems when statically linked.
|
||||
;
|
||||
; Marco van den Heuvel, 2015-11-30
|
||||
;
|
||||
|
||||
.include "zeropage.inc"
|
||||
|
||||
.include "em-kernel.inc"
|
||||
.include "em-error.inc"
|
||||
.include "c128.inc"
|
||||
|
||||
.macpack generic
|
||||
.macpack module
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Header. Includes jump table
|
||||
|
||||
module_header _c128_ifnram_emd
|
||||
|
||||
; Driver signature
|
||||
|
||||
.byte $65, $6d, $64 ; "emd"
|
||||
.byte EMD_API_VERSION ; EM API version number
|
||||
|
||||
; Library reference
|
||||
|
||||
.addr $0000
|
||||
|
||||
; Jump table
|
||||
|
||||
.addr INSTALL
|
||||
.addr UNINSTALL
|
||||
.addr PAGECOUNT
|
||||
.addr MAP
|
||||
.addr USE
|
||||
.addr COMMIT
|
||||
.addr COPYFROM
|
||||
.addr COPYTO
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Constants
|
||||
|
||||
BASE = $8000
|
||||
PAGES = 127 ; Do not touch MMU
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Data.
|
||||
|
||||
.bss
|
||||
curpage: .res 2 ; Current page number
|
||||
|
||||
window: .res 256 ; Memory "window"
|
||||
|
||||
.code
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; INSTALL routine. Is called after the driver is loaded into memory. If
|
||||
; possible, check if the hardware is present and determine the amount of
|
||||
; memory available.
|
||||
; Must return an EM_ERR_xx code in a/x.
|
||||
;
|
||||
|
||||
INSTALL:
|
||||
ldx #0
|
||||
stx ptr1
|
||||
ldx #$80
|
||||
stx ptr1+1
|
||||
ldx #<ptr1
|
||||
stx FETVEC
|
||||
stx STAVEC
|
||||
ldy #0
|
||||
ldx #MMU_CFG_IFROM
|
||||
sei
|
||||
jsr FETCH
|
||||
tax
|
||||
inx
|
||||
txa
|
||||
sta tmp1
|
||||
ldx #MMU_CFG_IFROM
|
||||
sei
|
||||
jsr STASH
|
||||
ldx #MMU_CFG_IFROM
|
||||
jsr FETCH
|
||||
cli
|
||||
cmp tmp1
|
||||
beq @ram_present
|
||||
lda #<EM_ERR_NO_DEVICE
|
||||
ldx #>EM_ERR_NO_DEVICE
|
||||
rts
|
||||
|
||||
@ram_present:
|
||||
ldx #$FF
|
||||
stx curpage
|
||||
stx curpage+1 ; Invalidate the current page
|
||||
inx
|
||||
txa ; A = X = EM_ERR_OK
|
||||
; rts ; Run into UNINSTALL instead
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; UNINSTALL routine. Is called before the driver is removed from memory.
|
||||
; Can do cleanup or whatever. Must not return anything.
|
||||
;
|
||||
|
||||
UNINSTALL:
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; PAGECOUNT: Return the total number of available pages in a/x.
|
||||
;
|
||||
|
||||
PAGECOUNT:
|
||||
lda #<PAGES
|
||||
ldx #>PAGES
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; MAP: Map the page in a/x into memory and return a pointer to the page in
|
||||
; a/x. The contents of the currently mapped page (if any) may be discarded
|
||||
; by the driver.
|
||||
;
|
||||
|
||||
MAP: sta curpage
|
||||
stx curpage+1 ; Remember the new page
|
||||
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1
|
||||
ldy #$00
|
||||
sty ptr1
|
||||
|
||||
lda #<ptr1
|
||||
sta FETVEC
|
||||
sei
|
||||
|
||||
; Transfer one page
|
||||
|
||||
@L1: ldx #MMU_CFG_IFROM
|
||||
jsr FETCH
|
||||
sta window,y
|
||||
iny
|
||||
bne @L1
|
||||
|
||||
; Return the memory window
|
||||
|
||||
cli
|
||||
lda #<window
|
||||
ldx #>window ; Return the window address
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; USE: Tell the driver that the window is now associated with a given page.
|
||||
|
||||
USE: sta curpage
|
||||
stx curpage+1 ; Remember the page
|
||||
lda #<window
|
||||
ldx #>window ; Return the window
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COMMIT: Commit changes in the memory window to extended storage.
|
||||
|
||||
COMMIT: lda curpage ; Get the current page
|
||||
ldx curpage+1
|
||||
bmi done ; Jump if no page mapped
|
||||
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1
|
||||
ldy #$00
|
||||
sty ptr1
|
||||
|
||||
lda #<ptr1
|
||||
sta STAVEC
|
||||
sei
|
||||
|
||||
; Transfer one page. Y must be zero on entry
|
||||
|
||||
@L1: lda window,y
|
||||
ldx #MMU_CFG_IFROM
|
||||
jsr STASH
|
||||
iny
|
||||
bne @L1
|
||||
cli
|
||||
|
||||
; Done
|
||||
|
||||
done: rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COPYFROM: Copy from extended into linear memory. A pointer to a structure
|
||||
; describing the request is passed in a/x.
|
||||
; The function must not return anything.
|
||||
;
|
||||
|
||||
COPYFROM:
|
||||
sta ptr3
|
||||
stx ptr3+1 ; Save the passed em_copy pointer
|
||||
|
||||
ldy #EM_COPY::OFFS
|
||||
lda (ptr3),y
|
||||
sta ptr1
|
||||
ldy #EM_COPY::PAGE
|
||||
lda (ptr3),y
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1 ; From
|
||||
|
||||
ldy #EM_COPY::BUF
|
||||
lda (ptr3),y
|
||||
sta ptr2
|
||||
iny
|
||||
lda (ptr3),y
|
||||
sta ptr2+1 ; To
|
||||
|
||||
lda #<ptr1
|
||||
sta FETVEC
|
||||
|
||||
ldy #EM_COPY::COUNT+1
|
||||
lda (ptr3),y ; Get number of pages
|
||||
beq @L2 ; Skip if no full pages
|
||||
sta tmp1
|
||||
|
||||
; Copy full pages
|
||||
|
||||
ldy #$00
|
||||
sei
|
||||
@L1: ldx #MMU_CFG_IFROM
|
||||
jsr FETCH
|
||||
sta (ptr2),y
|
||||
iny
|
||||
bne @L1
|
||||
inc ptr1+1
|
||||
inc ptr2+1
|
||||
dec tmp1
|
||||
bne @L1
|
||||
|
||||
; Copy the remainder of the page
|
||||
|
||||
@L2: ldy #EM_COPY::COUNT
|
||||
lda (ptr3),y ; Get bytes in last page
|
||||
beq @L4
|
||||
sta tmp1
|
||||
|
||||
ldy #$00
|
||||
@L3: ldx #MMU_CFG_IFROM
|
||||
jsr FETCH
|
||||
sta (ptr2),y
|
||||
iny
|
||||
dec tmp1
|
||||
bne @L3
|
||||
; Done
|
||||
|
||||
@L4: cli
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COPYTO: Copy from linear into extended memory. A pointer to a structure
|
||||
; describing the request is passed in a/x.
|
||||
; The function must not return anything.
|
||||
;
|
||||
|
||||
COPYTO: sta ptr3
|
||||
stx ptr3+1 ; Save the passed em_copy pointer
|
||||
|
||||
ldy #EM_COPY::OFFS
|
||||
lda (ptr3),y
|
||||
sta ptr1
|
||||
ldy #EM_COPY::PAGE
|
||||
lda (ptr3),y
|
||||
clc
|
||||
adc #>BASE
|
||||
sta ptr1+1 ; To
|
||||
|
||||
ldy #EM_COPY::BUF
|
||||
lda (ptr3),y
|
||||
sta ptr2
|
||||
iny
|
||||
lda (ptr3),y
|
||||
sta ptr2+1 ; From
|
||||
|
||||
lda #<ptr1
|
||||
sta STAVEC
|
||||
|
||||
ldy #EM_COPY::COUNT+1
|
||||
lda (ptr3),y ; Get number of pages
|
||||
beq @L2 ; Skip if no full pages
|
||||
sta tmp1
|
||||
|
||||
; Copy full pages
|
||||
|
||||
sei
|
||||
ldy #$00
|
||||
@L1: lda (ptr2),y
|
||||
ldx #MMU_CFG_IFROM
|
||||
jsr STASH
|
||||
iny
|
||||
bne @L1
|
||||
inc ptr1+1
|
||||
inc ptr2+1
|
||||
dec tmp1
|
||||
bne @L1
|
||||
|
||||
; Copy the remainder of the page
|
||||
|
||||
@L2: ldy #EM_COPY::COUNT
|
||||
lda (ptr3),y ; Get bytes in last page
|
||||
beq @L4
|
||||
sta tmp1
|
||||
|
||||
ldy #$00
|
||||
@L3: lda (ptr2),y
|
||||
ldx #MMU_CFG_IFROM
|
||||
jsr STASH
|
||||
iny
|
||||
dec tmp1
|
||||
bne @L3
|
||||
|
||||
; Done
|
||||
|
||||
@L4: cli
|
||||
rts
|
@ -6,7 +6,7 @@
|
||||
.export __STARTUP__ : absolute = 1 ; Mark as startup
|
||||
|
||||
.import initlib, donelib
|
||||
.import moveinit, zerobss, callmain
|
||||
.import zerobss, callmain
|
||||
.import BSOUT
|
||||
.import __MAIN_START__, __MAIN_SIZE__ ; Linker generated
|
||||
.import __STACKSIZE__ ; from configure file
|
||||
@ -23,11 +23,6 @@
|
||||
|
||||
Start:
|
||||
|
||||
; Switch to the second charset.
|
||||
|
||||
lda #14
|
||||
jsr BSOUT
|
||||
|
||||
; Switch off the BASIC ROM.
|
||||
|
||||
lda $01
|
||||
@ -39,22 +34,10 @@ Start:
|
||||
tsx
|
||||
stx spsave ; Save the system stack ptr
|
||||
|
||||
; Allow some re-entrancy by skipping the next task if it already was done.
|
||||
; This sometimes can let us rerun the program without reloading it.
|
||||
|
||||
ldx move_init
|
||||
beq L0
|
||||
|
||||
; Move the INIT segment from where it was loaded (over the bss segments)
|
||||
; into where it must be run (over the BSS segment).
|
||||
|
||||
jsr moveinit
|
||||
dec move_init ; Set to false
|
||||
|
||||
; Save space by putting some of the start-up code in the INIT segment,
|
||||
; which can be re-used by the BSS segment, the heap and the C stack.
|
||||
|
||||
L0: jsr runinit
|
||||
jsr init
|
||||
|
||||
; Clear the BSS data.
|
||||
|
||||
@ -98,7 +81,7 @@ L2: lda zpsave,x
|
||||
|
||||
.segment "INIT"
|
||||
|
||||
runinit:
|
||||
init:
|
||||
|
||||
; Save the zero-page locations that we need.
|
||||
|
||||
@ -115,6 +98,11 @@ L1: lda sp,x
|
||||
sta sp
|
||||
stx sp+1 ; Set argument stack ptr
|
||||
|
||||
; Switch to the second charset.
|
||||
|
||||
lda #14
|
||||
jsr BSOUT
|
||||
|
||||
; Call the module constructors.
|
||||
|
||||
jmp initlib
|
||||
@ -123,17 +111,8 @@ L1: lda sp,x
|
||||
; ------------------------------------------------------------------------
|
||||
; Data
|
||||
|
||||
.data
|
||||
|
||||
; These two variables were moved out of the BSS segment, and into DATA, because
|
||||
; we need to use them before INIT is moved off of BSS, and before BSS is zeroed.
|
||||
.segment "INITBSS"
|
||||
|
||||
mmusave:.res 1
|
||||
spsave: .res 1
|
||||
|
||||
move_init:
|
||||
.byte 1
|
||||
|
||||
.segment "INITBSS"
|
||||
|
||||
zpsave: .res zpspace
|
||||
|
376
libsrc/c64/emd/c64-65816.s
Normal file
376
libsrc/c64/emd/c64-65816.s
Normal file
@ -0,0 +1,376 @@
|
||||
;
|
||||
; Extended memory driver for 65816 based extra RAM. Driver works without
|
||||
; problems when statically linked.
|
||||
;
|
||||
; Marco van den Heuvel, 2015-12-01
|
||||
;
|
||||
|
||||
.include "zeropage.inc"
|
||||
|
||||
.include "em-kernel.inc"
|
||||
.include "em-error.inc"
|
||||
|
||||
|
||||
.macpack generic
|
||||
.macpack module
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Header. Includes jump table
|
||||
|
||||
module_header _c64_65816_emd
|
||||
|
||||
; Driver signature
|
||||
|
||||
.byte $65, $6d, $64 ; "emd"
|
||||
.byte EMD_API_VERSION ; EM API version number
|
||||
|
||||
; Library reference
|
||||
|
||||
.addr $0000
|
||||
|
||||
; Jump table
|
||||
|
||||
.addr INSTALL
|
||||
.addr UNINSTALL
|
||||
.addr PAGECOUNT
|
||||
.addr MAP
|
||||
.addr USE
|
||||
.addr COMMIT
|
||||
.addr COPYFROM
|
||||
.addr COPYTO
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Data.
|
||||
|
||||
.bss
|
||||
isnotscpu: .res 1 ; SuperCPU not present
|
||||
curpage: .res 1 ; Current page number
|
||||
curbank: .res 1 ; Current bank number (+1)
|
||||
bankcount: .res 1 ; Number of available banks (pages = banks * 256)
|
||||
window: .res 256 ; Memory "window"
|
||||
|
||||
.code
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; INSTALL routine. Is called after the driver is loaded into memory. If
|
||||
; possible, check if the hardware is present and determine the amount of
|
||||
; memory available.
|
||||
; Must return an EM_ERR_xx code in a/x.
|
||||
;
|
||||
|
||||
INSTALL:
|
||||
sei
|
||||
clc
|
||||
sed
|
||||
lda #$99
|
||||
adc #$01 ; on 65C02, 65SC02, 65CE02, 65802 and 65816 sets the zero flag correctly
|
||||
cld
|
||||
bne @not_present
|
||||
clc
|
||||
.P816
|
||||
sep #$01 ; nop #$01 on 65C02/65SC02 and lda ($01,s),y on 65CE02
|
||||
.P02
|
||||
bcc @not_present
|
||||
lda $d0bc
|
||||
and #$80
|
||||
sta isnotscpu
|
||||
lda $07e8
|
||||
pha ; save value incase it was used somewhere else
|
||||
ldx #$ff
|
||||
@fillloop: ; fill from top (bank 255) to bottom
|
||||
txa
|
||||
pha
|
||||
.P816
|
||||
plb ; pull dbr
|
||||
.P02
|
||||
stx $07e8
|
||||
dex
|
||||
cpx #$ff
|
||||
bne @fillloop
|
||||
inx
|
||||
@compareloop: ; check from bottom to top
|
||||
txa
|
||||
pha
|
||||
.P816
|
||||
plb
|
||||
.P02
|
||||
cmp $07e8
|
||||
bne @found_pages
|
||||
.P816
|
||||
inc
|
||||
.P02
|
||||
sta $07e8
|
||||
cmp $07e8
|
||||
bne @found_pages
|
||||
inx
|
||||
bne @compareloop
|
||||
@found_pages:
|
||||
dex
|
||||
lda #$00
|
||||
pha
|
||||
.P816
|
||||
plb
|
||||
.P02
|
||||
pla
|
||||
sta $07e8
|
||||
cli
|
||||
lda isnotscpu
|
||||
bne @noextradex
|
||||
dex
|
||||
@noextradex:
|
||||
stx bankcount
|
||||
lda #<EM_ERR_OK
|
||||
ldx #>EM_ERR_OK
|
||||
rts
|
||||
@not_present:
|
||||
cli
|
||||
lda #<EM_ERR_NO_DEVICE
|
||||
ldx #>EM_ERR_NO_DEVICE
|
||||
; rts ; Run into UNINSTALL instead
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; UNINSTALL routine. Is called before the driver is removed from memory.
|
||||
; Can do cleanup or whatever. Must not return anything.
|
||||
;
|
||||
|
||||
UNINSTALL:
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; PAGECOUNT: Return the total number of available pages in a/x.
|
||||
;
|
||||
|
||||
PAGECOUNT:
|
||||
lda #$00 ; a whole bank is either usable or not
|
||||
ldx bankcount
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; MAP: Map the page in a/x into memory and return a pointer to the page in
|
||||
; a/x. The contents of the currently mapped page (if any) may be discarded
|
||||
; by the driver.
|
||||
;
|
||||
|
||||
MAP: sta curpage ; Remember the new page
|
||||
stx curbank ; Remember the new bank
|
||||
|
||||
sta ptr2+1 ; src address low
|
||||
lda #$00
|
||||
sta ptr2 ; src address high
|
||||
inx
|
||||
ldy isnotscpu ; check if not scpu
|
||||
bne @notscpu
|
||||
inx
|
||||
@notscpu:
|
||||
stx tmp2 ; src bank
|
||||
|
||||
sta tmp1 ; dst bank
|
||||
|
||||
sta ptr3+1 ; length high
|
||||
lda #$ff
|
||||
sta ptr3 ; length low
|
||||
|
||||
lda #<window
|
||||
sta ptr1 ; dst address low
|
||||
ldx #>window
|
||||
stx ptr1+1 ; dst address high
|
||||
|
||||
jsr transfer
|
||||
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; USE: Tell the driver that the window is now associated with a given page.
|
||||
|
||||
USE: sta curpage ; Remember the page
|
||||
stx curbank ; Remember the bank
|
||||
lda #<window
|
||||
ldx #>window ; Return the window
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COMMIT: Commit changes in the memory window to extended storage.
|
||||
|
||||
COMMIT: lda curpage ; Get the current page
|
||||
sta ptr1+1 ; dst high
|
||||
ldx #$00
|
||||
stx ptr1 ; dst low
|
||||
|
||||
lda #<window
|
||||
sta ptr2 ; src low
|
||||
lda #>window
|
||||
sta ptr2+1 ; src high
|
||||
|
||||
stx ptr3+1 ; length high
|
||||
lda #$ff
|
||||
sta ptr3 ; length low
|
||||
|
||||
stx tmp2 ; src bank
|
||||
ldy curbank ; Get the current bank
|
||||
iny
|
||||
ldx isnotscpu
|
||||
bne @notascpu
|
||||
iny
|
||||
@notascpu:
|
||||
sty tmp1 ; dst bank
|
||||
|
||||
jsr transfer
|
||||
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COPYFROM: Copy from extended into linear memory. A pointer to a structure
|
||||
; describing the request is passed in a/x.
|
||||
; The function must not return anything.
|
||||
;
|
||||
|
||||
COPYFROM:
|
||||
sta ptr4
|
||||
stx ptr4+1 ; Save the passed em_copy pointer
|
||||
|
||||
ldy #EM_COPY::COUNT+1 ; start at the end of the struct
|
||||
lda (ptr4),y ; get high byte of count
|
||||
tax
|
||||
dey
|
||||
lda (ptr4),y ; get low byte of count
|
||||
bne @nodex
|
||||
dex
|
||||
@nodex:
|
||||
.P816
|
||||
dec
|
||||
.P02
|
||||
sta ptr3 ; length low
|
||||
stx ptr3+1 ; length high
|
||||
dey
|
||||
lda (ptr4),y ; get bank
|
||||
.P816
|
||||
inc
|
||||
.P02
|
||||
ldx isnotscpu
|
||||
bne @notscpu64
|
||||
.P816
|
||||
inc
|
||||
.P02
|
||||
@notscpu64:
|
||||
sta tmp2 ; src bank
|
||||
dey
|
||||
lda (ptr4),y ; get page
|
||||
sta ptr2+1 ; src high
|
||||
dey
|
||||
lda (ptr4),y ; get offset in page
|
||||
sta ptr2 ; src low
|
||||
dey
|
||||
lda (ptr4),y ; get memory buffer high
|
||||
sta ptr1+1 ; dst high
|
||||
dey
|
||||
lda (ptr4),y ; get memory buffer low
|
||||
sta ptr1 ; dst low
|
||||
lda #$00
|
||||
sta tmp1 ; dst bank
|
||||
|
||||
jsr transfer
|
||||
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COPYTO: Copy from linear into extended memory. A pointer to a structure
|
||||
; describing the request is passed in a/x.
|
||||
; The function must not return anything.
|
||||
;
|
||||
|
||||
COPYTO: sta ptr4
|
||||
stx ptr4+1 ; Save the passed em_copy pointer
|
||||
|
||||
ldy #EM_COPY::COUNT+1 ; start at the end of the struct
|
||||
lda (ptr4),y ; get high byte of count
|
||||
tax
|
||||
dey
|
||||
lda (ptr4),y ; get low byte of count
|
||||
bne @nodex2
|
||||
dex
|
||||
@nodex2:
|
||||
.P816
|
||||
dec
|
||||
.P02
|
||||
sta ptr3 ; length low
|
||||
txa
|
||||
sta ptr3+1 ; length high
|
||||
dey
|
||||
lda (ptr4),y ; get bank
|
||||
.P816
|
||||
inc
|
||||
.P02
|
||||
ldx isnotscpu
|
||||
bne @notascpu64
|
||||
.P816
|
||||
inc
|
||||
.P02
|
||||
@notascpu64:
|
||||
sta tmp1 ; dst bank
|
||||
dey
|
||||
lda (ptr4),y ; get page
|
||||
sta ptr1+1 ; dst high
|
||||
dey
|
||||
lda (ptr4),y ; get page offset
|
||||
sta ptr1 ; dst low
|
||||
dey
|
||||
lda (ptr4),y ; get memory buffer high
|
||||
sta ptr2+1 ; src low
|
||||
dey
|
||||
lda (ptr4),y ; get memory buffer low
|
||||
sta ptr2 ; src high
|
||||
lda #$00
|
||||
sta tmp2 ; src bank
|
||||
|
||||
jsr transfer
|
||||
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Helper function for moving a block, the following is used:
|
||||
; ptr1: dst
|
||||
; ptr2: src
|
||||
; ptr3: length
|
||||
; tmp1: dst bank
|
||||
; tmp2: src bank
|
||||
|
||||
transfer:
|
||||
.P816
|
||||
.A8
|
||||
.I8
|
||||
sei
|
||||
pha
|
||||
phx
|
||||
phy
|
||||
ldx tmp1 ; load srcbank
|
||||
stx @move+1 ; store srcbank in move + 1
|
||||
ldy tmp2 ; load dstbank
|
||||
sty @move+2 ; store dstbank in move + 2
|
||||
clc ; switch to native mode
|
||||
xce
|
||||
php ; save status bits
|
||||
rep #%00110000 ; set A and index to 16bit
|
||||
.A16
|
||||
.I16
|
||||
ldy ptr1
|
||||
ldx ptr2
|
||||
lda ptr3
|
||||
@move:
|
||||
mvn 0,0
|
||||
plp ; restore status bits
|
||||
.A8
|
||||
.I8
|
||||
lda #$00
|
||||
pha
|
||||
plb ; restore dbr
|
||||
sec
|
||||
xce ; switch to emul mode
|
||||
ply
|
||||
plx
|
||||
pla
|
||||
cli
|
||||
rts
|
||||
.P02
|
@ -1,45 +0,0 @@
|
||||
;
|
||||
; 2015-10-07, Greg King
|
||||
;
|
||||
|
||||
.export moveinit
|
||||
|
||||
.import __INIT_LOAD__, __INIT_RUN__, __INIT_SIZE__ ; Linker-generated
|
||||
|
||||
.macpack cpu
|
||||
.macpack generic
|
||||
|
||||
|
||||
; Put this in the DATA segment because it is self-modifying code.
|
||||
|
||||
.data
|
||||
|
||||
; Move the INIT segment from where it was loaded (over the bss segments)
|
||||
; into where it must be run (over the BSS segment). The two areas might overlap;
|
||||
; and, the segment is moved upwards. Therefore, this code starts at the highest
|
||||
; address, and decrements to the lowest address. The low bytes of the starting
|
||||
; pointers are not sums. The high bytes are sums; but, they do not include the
|
||||
; carry. Both the low-byte sums and the carries will be done when the pointers
|
||||
; are indexed by the .Y register.
|
||||
|
||||
moveinit:
|
||||
|
||||
; First, move the last, partial page.
|
||||
; Then, move all of the full pages.
|
||||
|
||||
ldy #<__INIT_SIZE__ ; size of partial page
|
||||
ldx #>__INIT_SIZE__ + (<__INIT_SIZE__ <> 0) ; number of pages, including partial
|
||||
|
||||
L1: dey
|
||||
init_load:
|
||||
lda __INIT_LOAD__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
|
||||
init_run:
|
||||
sta __INIT_RUN__ + (__INIT_SIZE__ & $FF00) - $0100 * (<__INIT_SIZE__ = 0),y
|
||||
tya
|
||||
bnz L1 ; page not finished
|
||||
|
||||
dec init_load+2
|
||||
dec init_run+2
|
||||
dex
|
||||
bnz L1 ; move next page
|
||||
rts
|
16
libsrc/gamate/_scrsize.s
Normal file
16
libsrc/gamate/_scrsize.s
Normal file
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Screen size variables
|
||||
;
|
||||
.include "gamate.inc"
|
||||
|
||||
.export screensize
|
||||
screensize:
|
||||
ldx xsize
|
||||
ldy ysize
|
||||
rts
|
||||
|
||||
.rodata
|
||||
.export xsize, ysize
|
||||
|
||||
xsize: .byte charsperline
|
||||
ysize: .byte screenrows
|
32
libsrc/gamate/chline.s
Normal file
32
libsrc/gamate/chline.s
Normal file
@ -0,0 +1,32 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 08.08.1998
|
||||
;
|
||||
; void chlinexy (unsigned char x, unsigned char y, unsigned char length);
|
||||
; void chline (unsigned char length);
|
||||
;
|
||||
|
||||
.export _chlinexy, _chline
|
||||
.import popa, _gotoxy, cputdirect
|
||||
.importzp tmp1
|
||||
|
||||
.include "gamate.inc"
|
||||
|
||||
_chlinexy:
|
||||
pha ; Save the length
|
||||
jsr popa ; Get y
|
||||
jsr _gotoxy ; Call this one, will pop params
|
||||
pla ; Restore the length
|
||||
|
||||
_chline:
|
||||
cmp #0 ; Is the length zero?
|
||||
beq L9 ; Jump if done
|
||||
sta tmp1
|
||||
L1: lda #CH_HLINE ; Horizontal line, screen code
|
||||
jsr cputdirect ; Direct output
|
||||
dec tmp1
|
||||
bne L1
|
||||
L9: rts
|
||||
|
||||
|
||||
|
||||
|
33
libsrc/gamate/clock.s
Normal file
33
libsrc/gamate/clock.s
Normal file
@ -0,0 +1,33 @@
|
||||
;
|
||||
; clock_t clock (void);
|
||||
;
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.export _clock
|
||||
.forceimport ticktock
|
||||
.importzp sreg
|
||||
.constructor initclock
|
||||
|
||||
|
||||
.proc _clock
|
||||
|
||||
lda tickcount+3
|
||||
sta sreg+1
|
||||
lda tickcount+2
|
||||
sta sreg
|
||||
ldx tickcount+1
|
||||
lda tickcount
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
.segment "INIT"
|
||||
initclock:
|
||||
lda #0
|
||||
ldx #3
|
||||
@lp: sta tickcount,x
|
||||
dex
|
||||
bpl @lp
|
||||
rts
|
35
libsrc/gamate/clrscr.s
Normal file
35
libsrc/gamate/clrscr.s
Normal file
@ -0,0 +1,35 @@
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.import plot
|
||||
.export _clrscr
|
||||
_clrscr:
|
||||
ldy #$0
|
||||
tya
|
||||
rowloop:
|
||||
sty LCD_X
|
||||
|
||||
sta LCD_Y
|
||||
|
||||
ldx #$0
|
||||
colloop:
|
||||
sta LCD_DATA
|
||||
|
||||
inx
|
||||
bne colloop
|
||||
|
||||
iny
|
||||
bne rowloop
|
||||
|
||||
; Go to the home position.
|
||||
|
||||
sta CURS_X
|
||||
sta CURS_Y
|
||||
jmp plot
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; force the init constructor to be imported
|
||||
|
||||
.import initconio
|
||||
conio_init = initconio
|
34
libsrc/gamate/color.s
Normal file
34
libsrc/gamate/color.s
Normal file
@ -0,0 +1,34 @@
|
||||
;
|
||||
; unsigned char __fastcall__ textcolor (unsigned char color);
|
||||
; unsigned char __fastcall__ bgcolor (unsigned char color);
|
||||
; unsigned char __fastcall__ bordercolor (unsigned char color);
|
||||
;
|
||||
|
||||
|
||||
.export _textcolor, _bgcolor, _bordercolor
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
_textcolor:
|
||||
ldx CHARCOLOR ; get old value
|
||||
sta CHARCOLOR ; set new value
|
||||
txa
|
||||
rts
|
||||
|
||||
_bgcolor:
|
||||
ldx BGCOLOR ; get old value
|
||||
sta BGCOLOR ; set new value
|
||||
txa
|
||||
rts
|
||||
|
||||
_bordercolor:
|
||||
lda #0
|
||||
tax
|
||||
rts
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; force the init constructor to be imported
|
||||
|
||||
.import initconio
|
||||
conio_init = initconio
|
30
libsrc/gamate/conio.s
Normal file
30
libsrc/gamate/conio.s
Normal file
@ -0,0 +1,30 @@
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.import colors
|
||||
.importzp ptr1, tmp1
|
||||
|
||||
.constructor initconio
|
||||
|
||||
.macpack longbranch
|
||||
|
||||
.segment "INIT"
|
||||
initconio:
|
||||
lda #0
|
||||
sta LCD_XPOS
|
||||
sta LCD_YPOS
|
||||
|
||||
lda #LCD_MODE_INC_Y
|
||||
sta LCD_MODE
|
||||
|
||||
lda #COLOR_BLACK
|
||||
sta CHARCOLOR
|
||||
lda #COLOR_WHITE
|
||||
sta BGCOLOR
|
||||
rts
|
||||
|
||||
.segment "RODATA"
|
||||
|
||||
.export fontdata
|
||||
fontdata:
|
||||
.include "vga.inc"
|
143
libsrc/gamate/cputc.s
Normal file
143
libsrc/gamate/cputc.s
Normal file
@ -0,0 +1,143 @@
|
||||
;
|
||||
; void cputcxy (unsigned char x, unsigned char y, char c);
|
||||
; void cputc (char c);
|
||||
;
|
||||
|
||||
.export _cputcxy, _cputc, cputdirect, putchar
|
||||
.export newline, plot
|
||||
.import popa, _gotoxy
|
||||
.import PLOT
|
||||
.import xsize
|
||||
.import fontdata
|
||||
.import _plotlo
|
||||
|
||||
.importzp tmp3,tmp4
|
||||
.importzp ptr3
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
_cputcxy:
|
||||
pha ; Save C
|
||||
jsr popa ; Get Y
|
||||
jsr _gotoxy ; Set cursor, drop x
|
||||
pla ; Restore C
|
||||
|
||||
; Plot a character - also used as internal function
|
||||
|
||||
_cputc: cmp #$0d ; CR?
|
||||
bne L1
|
||||
lda #0
|
||||
sta CURS_X
|
||||
beq plot ; Recalculate pointers
|
||||
|
||||
L1: cmp #$0a ; LF?
|
||||
beq newline ; Recalculate pointers
|
||||
|
||||
; Printable char of some sort
|
||||
|
||||
cputdirect:
|
||||
jsr putchar ; Write the character to the screen
|
||||
|
||||
; Advance cursor position
|
||||
|
||||
advance:
|
||||
ldy CURS_X
|
||||
iny
|
||||
cpy xsize
|
||||
bne L3
|
||||
jsr newline ; new line
|
||||
ldy #0 ; + cr
|
||||
L3: sty CURS_X
|
||||
jmp plot
|
||||
|
||||
newline:
|
||||
inc CURS_Y
|
||||
|
||||
; Set cursor position, calculate RAM pointers
|
||||
|
||||
plot: ldy CURS_X
|
||||
ldx CURS_Y
|
||||
clc
|
||||
jmp PLOT ; Set the new cursor
|
||||
|
||||
; Write one character to the screen without doing anything else, return X
|
||||
; position in Y
|
||||
|
||||
putchar:
|
||||
sta ptr3
|
||||
|
||||
txa
|
||||
pha
|
||||
|
||||
lda #0
|
||||
sta ptr3+1
|
||||
|
||||
; char index * 8
|
||||
asl ptr3
|
||||
rol ptr3+1
|
||||
asl ptr3
|
||||
rol ptr3+1
|
||||
asl ptr3
|
||||
rol ptr3+1
|
||||
|
||||
; plus fontdata base address
|
||||
lda ptr3
|
||||
clc
|
||||
adc #<(fontdata-$f8)
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #>(fontdata-$f8)
|
||||
sta ptr3+1
|
||||
|
||||
lda CHARCOLOR
|
||||
and #1
|
||||
beq @skip_plane1
|
||||
|
||||
lda #LCD_XPOS_PLANE1
|
||||
clc
|
||||
adc CURS_X
|
||||
sta LCD_X
|
||||
|
||||
ldy #$f8
|
||||
@copylp1:
|
||||
lda (ptr3),y
|
||||
eor RVS
|
||||
sta LCD_DATA
|
||||
iny
|
||||
bne @copylp1
|
||||
|
||||
@skip_plane1:
|
||||
|
||||
lda CHARCOLOR
|
||||
and #2
|
||||
beq @skip_plane2
|
||||
|
||||
lda #LCD_XPOS_PLANE2
|
||||
clc
|
||||
adc CURS_X
|
||||
sta LCD_X
|
||||
|
||||
ldx CURS_Y
|
||||
lda _plotlo,x
|
||||
sta LCD_Y
|
||||
|
||||
ldy #$f8
|
||||
@copylp2:
|
||||
lda (ptr3),y
|
||||
eor RVS
|
||||
sta LCD_DATA
|
||||
iny
|
||||
bne @copylp2
|
||||
|
||||
@skip_plane2:
|
||||
pla
|
||||
tax
|
||||
ldy CURS_X
|
||||
rts
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; force the init constructor to be imported
|
||||
|
||||
.import initconio
|
||||
conio_init = initconio
|
63
libsrc/gamate/crt0.s
Normal file
63
libsrc/gamate/crt0.s
Normal file
@ -0,0 +1,63 @@
|
||||
|
||||
.export Start, _exit
|
||||
|
||||
.import initlib, donelib, callmain
|
||||
.import push0, _main, zerobss, copydata
|
||||
|
||||
; Linker generated symbols
|
||||
.import __RAM_START__, __RAM_SIZE__
|
||||
|
||||
.include "zeropage.inc"
|
||||
.include "gamate.inc"
|
||||
|
||||
Start:
|
||||
; setup the CPU and System-IRQ
|
||||
|
||||
; Initialize CPU
|
||||
sei
|
||||
cld
|
||||
|
||||
ldx #0
|
||||
stx ZP_IRQ_CTRL ; disable calling cartridge IRQ/NMI handler
|
||||
|
||||
; Setup stack and memory mapping
|
||||
;ldx #$FF ; Stack top ($01FF)
|
||||
dex
|
||||
txs
|
||||
|
||||
; Clear the BSS data
|
||||
jsr zerobss
|
||||
|
||||
; Copy the .data segment to RAM
|
||||
jsr copydata
|
||||
|
||||
; setup the stack
|
||||
lda #<(__RAM_START__+__RAM_SIZE__)
|
||||
sta sp
|
||||
lda #>(__RAM_START__+__RAM_SIZE__)
|
||||
sta sp + 1
|
||||
|
||||
; Call module constructors
|
||||
jsr initlib
|
||||
|
||||
lda #1
|
||||
sta ZP_IRQ_CTRL ; enable calling cartridge IRQ/NMI handler
|
||||
cli ; allow IRQ only after constructors have run
|
||||
|
||||
; Pass an empty command line
|
||||
jsr push0 ; argc
|
||||
jsr push0 ; argv
|
||||
|
||||
ldy #4 ; Argument size
|
||||
jsr _main ; call the users code
|
||||
|
||||
; Call module destructors. This is also the _exit entry.
|
||||
_exit:
|
||||
jsr donelib ; Run module destructors
|
||||
|
||||
; reset (start over)
|
||||
jmp Start
|
||||
|
||||
.export initmainargs
|
||||
initmainargs:
|
||||
rts
|
161
libsrc/gamate/ctype.s
Normal file
161
libsrc/gamate/ctype.s
Normal file
@ -0,0 +1,161 @@
|
||||
;
|
||||
; Stefan Haubenthal with minor changes from Ullrich von Bassewitz, 2003-05-02
|
||||
;
|
||||
; Character specification table.
|
||||
;
|
||||
|
||||
.include "ctype.inc"
|
||||
|
||||
; The tables are readonly, put them into the rodata segment
|
||||
|
||||
.rodata
|
||||
|
||||
; The following 256 byte wide table specifies attributes for the isxxx type
|
||||
; of functions. Doing it by a table means some overhead in space, but it
|
||||
; has major advantages:
|
||||
;
|
||||
; * It is fast. If it were'nt for the slow parameter passing of cc65, one
|
||||
; could even define macros for the isxxx functions (this is usually
|
||||
; done on other platforms).
|
||||
;
|
||||
; * It is highly portable. The only unportable part is the table itself,
|
||||
; all real code goes into the common library.
|
||||
;
|
||||
; * We save some code in the isxxx functions.
|
||||
|
||||
|
||||
__ctype:
|
||||
.repeat 2
|
||||
.byte CT_CTRL ; 0/00 ___ctrl_@___
|
||||
.byte CT_CTRL ; 1/01 ___ctrl_A___
|
||||
.byte CT_CTRL ; 2/02 ___ctrl_B___
|
||||
.byte CT_CTRL ; 3/03 ___ctrl_C___
|
||||
.byte CT_CTRL ; 4/04 ___ctrl_D___
|
||||
.byte CT_CTRL ; 5/05 ___ctrl_E___
|
||||
.byte CT_CTRL ; 6/06 ___ctrl_F___
|
||||
.byte CT_CTRL ; 7/07 ___ctrl_G___
|
||||
.byte CT_CTRL ; 8/08 ___ctrl_H___
|
||||
.byte CT_CTRL | CT_OTHER_WS | CT_SPACE_TAB
|
||||
; 9/09 ___ctrl_I___
|
||||
.byte CT_CTRL | CT_OTHER_WS ; 10/0a ___ctrl_J___
|
||||
.byte CT_CTRL | CT_OTHER_WS ; 11/0b ___ctrl_K___
|
||||
.byte CT_CTRL | CT_OTHER_WS ; 12/0c ___ctrl_L___
|
||||
.byte CT_CTRL | CT_OTHER_WS ; 13/0d ___ctrl_M___
|
||||
.byte CT_CTRL ; 14/0e ___ctrl_N___
|
||||
.byte CT_CTRL ; 15/0f ___ctrl_O___
|
||||
.byte CT_CTRL ; 16/10 ___ctrl_P___
|
||||
.byte CT_CTRL ; 17/11 ___ctrl_Q___
|
||||
.byte CT_CTRL ; 18/12 ___ctrl_R___
|
||||
.byte CT_CTRL ; 19/13 ___ctrl_S___
|
||||
.byte CT_CTRL ; 20/14 ___ctrl_T___
|
||||
.byte CT_CTRL ; 21/15 ___ctrl_U___
|
||||
.byte CT_CTRL ; 22/16 ___ctrl_V___
|
||||
.byte CT_CTRL ; 23/17 ___ctrl_W___
|
||||
.byte CT_CTRL ; 24/18 ___ctrl_X___
|
||||
.byte CT_CTRL ; 25/19 ___ctrl_Y___
|
||||
.byte CT_CTRL ; 26/1a ___ctrl_Z___
|
||||
.byte CT_CTRL ; 27/1b ___ctrl_[___
|
||||
.byte CT_CTRL ; 28/1c ___ctrl_\___
|
||||
.byte CT_CTRL ; 29/1d ___ctrl_]___
|
||||
.byte CT_CTRL ; 30/1e ___ctrl_^___
|
||||
.byte CT_CTRL ; 31/1f ___ctrl_____
|
||||
.byte CT_SPACE | CT_SPACE_TAB ; 32/20 ___SPACE___
|
||||
.byte CT_NONE ; 33/21 _____!_____
|
||||
.byte CT_NONE ; 34/22 _____"_____
|
||||
.byte CT_NONE ; 35/23 _____#_____
|
||||
.byte CT_NONE ; 36/24 _____$_____
|
||||
.byte CT_NONE ; 37/25 _____%_____
|
||||
.byte CT_NONE ; 38/26 _____&_____
|
||||
.byte CT_NONE ; 39/27 _____'_____
|
||||
.byte CT_NONE ; 40/28 _____(_____
|
||||
.byte CT_NONE ; 41/29 _____)_____
|
||||
.byte CT_NONE ; 42/2a _____*_____
|
||||
.byte CT_NONE ; 43/2b _____+_____
|
||||
.byte CT_NONE ; 44/2c _____,_____
|
||||
.byte CT_NONE ; 45/2d _____-_____
|
||||
.byte CT_NONE ; 46/2e _____._____
|
||||
.byte CT_NONE ; 47/2f _____/_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 48/30 _____0_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 49/31 _____1_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 50/32 _____2_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 51/33 _____3_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 52/34 _____4_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 53/35 _____5_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 54/36 _____6_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 55/37 _____7_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 56/38 _____8_____
|
||||
.byte CT_DIGIT | CT_XDIGIT ; 57/39 _____9_____
|
||||
.byte CT_NONE ; 58/3a _____:_____
|
||||
.byte CT_NONE ; 59/3b _____;_____
|
||||
.byte CT_NONE ; 60/3c _____<_____
|
||||
.byte CT_NONE ; 61/3d _____=_____
|
||||
.byte CT_NONE ; 62/3e _____>_____
|
||||
.byte CT_NONE ; 63/3f _____?_____
|
||||
|
||||
.byte CT_NONE ; 64/40 _____@_____
|
||||
.byte CT_UPPER | CT_XDIGIT ; 65/41 _____A_____
|
||||
.byte CT_UPPER | CT_XDIGIT ; 66/42 _____B_____
|
||||
.byte CT_UPPER | CT_XDIGIT ; 67/43 _____C_____
|
||||
.byte CT_UPPER | CT_XDIGIT ; 68/44 _____D_____
|
||||
.byte CT_UPPER | CT_XDIGIT ; 69/45 _____E_____
|
||||
.byte CT_UPPER | CT_XDIGIT ; 70/46 _____F_____
|
||||
.byte CT_UPPER ; 71/47 _____G_____
|
||||
.byte CT_UPPER ; 72/48 _____H_____
|
||||
.byte CT_UPPER ; 73/49 _____I_____
|
||||
.byte CT_UPPER ; 74/4a _____J_____
|
||||
.byte CT_UPPER ; 75/4b _____K_____
|
||||
.byte CT_UPPER ; 76/4c _____L_____
|
||||
.byte CT_UPPER ; 77/4d _____M_____
|
||||
.byte CT_UPPER ; 78/4e _____N_____
|
||||
.byte CT_UPPER ; 79/4f _____O_____
|
||||
.byte CT_UPPER ; 80/50 _____P_____
|
||||
.byte CT_UPPER ; 81/51 _____Q_____
|
||||
.byte CT_UPPER ; 82/52 _____R_____
|
||||
.byte CT_UPPER ; 83/53 _____S_____
|
||||
.byte CT_UPPER ; 84/54 _____T_____
|
||||
.byte CT_UPPER ; 85/55 _____U_____
|
||||
.byte CT_UPPER ; 86/56 _____V_____
|
||||
.byte CT_UPPER ; 87/57 _____W_____
|
||||
.byte CT_UPPER ; 88/58 _____X_____
|
||||
.byte CT_UPPER ; 89/59 _____Y_____
|
||||
.byte CT_UPPER ; 90/5a _____Z_____
|
||||
.byte CT_NONE ; 91/5b _____[_____
|
||||
.byte CT_NONE ; 92/5c _____\_____
|
||||
.byte CT_NONE ; 93/5d _____]_____
|
||||
.byte CT_NONE ; 94/5e _____^_____
|
||||
.byte CT_NONE ; 95/5f _UNDERLINE_
|
||||
.byte CT_NONE ; 96/60 ___grave___
|
||||
.byte CT_LOWER | CT_XDIGIT ; 97/61 _____a_____
|
||||
.byte CT_LOWER | CT_XDIGIT ; 98/62 _____b_____
|
||||
.byte CT_LOWER | CT_XDIGIT ; 99/63 _____c_____
|
||||
.byte CT_LOWER | CT_XDIGIT ; 100/64 _____d_____
|
||||
.byte CT_LOWER | CT_XDIGIT ; 101/65 _____e_____
|
||||
.byte CT_LOWER | CT_XDIGIT ; 102/66 _____f_____
|
||||
.byte CT_LOWER ; 103/67 _____g_____
|
||||
.byte CT_LOWER ; 104/68 _____h_____
|
||||
.byte CT_LOWER ; 105/69 _____i_____
|
||||
.byte CT_LOWER ; 106/6a _____j_____
|
||||
.byte CT_LOWER ; 107/6b _____k_____
|
||||
.byte CT_LOWER ; 108/6c _____l_____
|
||||
.byte CT_LOWER ; 109/6d _____m_____
|
||||
.byte CT_LOWER ; 110/6e _____n_____
|
||||
.byte CT_LOWER ; 111/6f _____o_____
|
||||
.byte CT_LOWER ; 112/70 _____p_____
|
||||
.byte CT_LOWER ; 113/71 _____q_____
|
||||
.byte CT_LOWER ; 114/72 _____r_____
|
||||
.byte CT_LOWER ; 115/73 _____s_____
|
||||
.byte CT_LOWER ; 116/74 _____t_____
|
||||
.byte CT_LOWER ; 117/75 _____u_____
|
||||
.byte CT_LOWER ; 118/76 _____v_____
|
||||
.byte CT_LOWER ; 119/77 _____w_____
|
||||
.byte CT_LOWER ; 120/78 _____x_____
|
||||
.byte CT_LOWER ; 121/79 _____y_____
|
||||
.byte CT_LOWER ; 122/7a _____z_____
|
||||
.byte CT_NONE ; 123/7b _____{_____
|
||||
.byte CT_NONE ; 124/7c _____|_____
|
||||
.byte CT_NONE ; 125/7d _____}_____
|
||||
.byte CT_NONE ; 126/7e _____~_____
|
||||
.byte CT_OTHER_WS ; 127/7f ____DEL____
|
||||
.endrepeat
|
||||
|
||||
|
32
libsrc/gamate/cvline.s
Normal file
32
libsrc/gamate/cvline.s
Normal file
@ -0,0 +1,32 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 08.08.1998
|
||||
;
|
||||
; void cvlinexy (unsigned char x, unsigned char y, unsigned char length);
|
||||
; void cvline (unsigned char length);
|
||||
;
|
||||
|
||||
.export _cvlinexy, _cvline
|
||||
.import popa, _gotoxy, putchar, newline
|
||||
.importzp tmp1
|
||||
|
||||
.include "gamate.inc"
|
||||
|
||||
_cvlinexy:
|
||||
pha ; Save the length
|
||||
jsr popa ; Get y
|
||||
jsr _gotoxy ; Call this one, will pop params
|
||||
pla ; Restore the length and run into _cvline
|
||||
|
||||
_cvline:
|
||||
cmp #0 ; Is the length zero?
|
||||
beq L9 ; Jump if done
|
||||
sta tmp1
|
||||
L1: lda #CH_VLINE ; Vertical bar
|
||||
jsr putchar ; Write, no cursor advance
|
||||
jsr newline ; Advance cursor to next line
|
||||
dec tmp1
|
||||
bne L1
|
||||
L9: rts
|
||||
|
||||
|
||||
|
16
libsrc/gamate/extzp.inc
Normal file
16
libsrc/gamate/extzp.inc
Normal file
@ -0,0 +1,16 @@
|
||||
;
|
||||
; extzp.inc for the Gamate
|
||||
;
|
||||
; Groepaz/Hitmen, 2015-11-27
|
||||
;
|
||||
; Assembler include file that imports the runtime zero page locations used
|
||||
; by the Gamate runtime, ready for usage in asm code.
|
||||
;
|
||||
|
||||
.global CURS_X: zp
|
||||
.global CURS_Y: zp
|
||||
.global CHARCOLOR: zp
|
||||
.global RVS: zp
|
||||
.global BGCOLOR: zp
|
||||
.global tickcount: zp
|
||||
|
16
libsrc/gamate/extzp.s
Normal file
16
libsrc/gamate/extzp.s
Normal file
@ -0,0 +1,16 @@
|
||||
;
|
||||
; Groepaz/Hitmen, 2015-11-27
|
||||
;
|
||||
; zeropage locations for exclusive use by the library
|
||||
;
|
||||
|
||||
.include "extzp.inc"
|
||||
|
||||
.segment "EXTZP" : zeropage
|
||||
|
||||
CURS_X: .res 1
|
||||
CURS_Y: .res 1
|
||||
CHARCOLOR: .res 1
|
||||
RVS: .res 1
|
||||
BGCOLOR: .res 1
|
||||
tickcount: .res 4
|
22
libsrc/gamate/gotoxy.s
Normal file
22
libsrc/gamate/gotoxy.s
Normal file
@ -0,0 +1,22 @@
|
||||
;
|
||||
; void gotoxy (unsigned char x, unsigned char y);
|
||||
;
|
||||
|
||||
.export _gotoxy
|
||||
.import popa, plot
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
_gotoxy:
|
||||
sta CURS_Y ; Set Y
|
||||
jsr popa ; Get X
|
||||
sta CURS_X ; Set X
|
||||
jmp plot ; Set the cursor position
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; force the init constructor to be imported
|
||||
|
||||
.import initconio
|
||||
conio_init = initconio
|
||||
|
16
libsrc/gamate/header.s
Normal file
16
libsrc/gamate/header.s
Normal file
@ -0,0 +1,16 @@
|
||||
; The following symbol is used by linker config to force the module
|
||||
; to get included into the output file
|
||||
.export __STARTUP__: absolute = 1
|
||||
|
||||
.import Start, IRQStub, NMIStub
|
||||
|
||||
|
||||
.segment "STARTUP"
|
||||
|
||||
.word 0 ; +00 checksum from 7000-7fff (simple 8bit adds)
|
||||
.byte 1, 0, 1 ; +02 flags
|
||||
.byte "COPYRIGHT BIT CORPORATION", 0, $ff ; +05 copyright
|
||||
; system vectors
|
||||
jmp Start ; +20 reset entry
|
||||
jmp NMIStub ; +23 nmi entry
|
||||
jmp IRQStub ; +26 irq entry (135 hz)
|
52
libsrc/gamate/irq.s
Normal file
52
libsrc/gamate/irq.s
Normal file
@ -0,0 +1,52 @@
|
||||
;
|
||||
; IRQ handling (Gamate version)
|
||||
;
|
||||
|
||||
.export initirq, doneirq, IRQStub
|
||||
|
||||
.import __INTERRUPTOR_COUNT__, callirq_y
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
.segment "INIT"
|
||||
|
||||
; a constructor
|
||||
;
|
||||
initirq:
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
.code
|
||||
|
||||
; a destructor
|
||||
;
|
||||
doneirq:
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; 256*32 interrupts in about 1minute 60s = 136hz
|
||||
; -> guess 16384 clock cycles = 135,28hz (might be audio signal 1/512?)
|
||||
|
||||
IRQStub:
|
||||
; A and Y are saved by the BIOS
|
||||
;pha
|
||||
;tya
|
||||
;pha
|
||||
|
||||
ldy #<(__INTERRUPTOR_COUNT__ * 2)
|
||||
beq @L1
|
||||
|
||||
txa
|
||||
pha
|
||||
|
||||
jsr callirq_y
|
||||
|
||||
pla
|
||||
tax
|
||||
|
||||
@L1: ;pla
|
||||
;tay
|
||||
;pla
|
||||
rts
|
95
libsrc/gamate/joy/gamate-stdjoy.s
Normal file
95
libsrc/gamate/joy/gamate-stdjoy.s
Normal file
@ -0,0 +1,95 @@
|
||||
|
||||
;
|
||||
; Standard joystick driver for the Gamate
|
||||
;
|
||||
|
||||
.include "joy-kernel.inc"
|
||||
.include "joy-error.inc"
|
||||
.include "gamate.inc"
|
||||
|
||||
.macpack module
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Header. Includes jump table
|
||||
|
||||
module_header _gamate_stdjoy_joy
|
||||
|
||||
; Driver signature
|
||||
|
||||
.byte $6A, $6F, $79 ; "joy"
|
||||
.byte JOY_API_VERSION ; Driver API version number
|
||||
|
||||
; Library reference
|
||||
|
||||
.addr $0000
|
||||
|
||||
; Button state masks (8 values)
|
||||
|
||||
.byte $01 ; JOY_UP
|
||||
.byte $02 ; JOY_DOWN
|
||||
.byte $04 ; JOY_LEFT
|
||||
.byte $08 ; JOY_RIGHT
|
||||
.byte $10 ; JOY_FIRE_A
|
||||
.byte $20 ; JOY_FIRE_B
|
||||
.byte $80 ; JOY_SELECT
|
||||
.byte $40 ; JOY_START
|
||||
|
||||
; Jump table.
|
||||
|
||||
.addr INSTALL
|
||||
.addr UNINSTALL
|
||||
.addr COUNT
|
||||
.addr READJOY
|
||||
.addr 0 ; IRQ entry unused
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Constants
|
||||
|
||||
JOY_COUNT = 1 ; Number of joysticks we support
|
||||
|
||||
|
||||
.code
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; INSTALL routine. Is called after the driver is loaded into memory. If
|
||||
; possible, check if the hardware is present and determine the amount of
|
||||
; memory available.
|
||||
; Must return an JOY_ERR_xx code in a/x.
|
||||
;
|
||||
|
||||
INSTALL:
|
||||
lda #<JOY_ERR_OK
|
||||
ldx #>JOY_ERR_OK
|
||||
|
||||
; rts ; Run into UNINSTALL instead
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; DEINSTALL routine. Is called before the driver is removed from memory.
|
||||
; Can do cleanup or whatever. Must not return anything.
|
||||
;
|
||||
|
||||
UNINSTALL:
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; COUNT: Return the total number of available joysticks in a/x.
|
||||
;
|
||||
;unsigned char __fastcall__ joy_count (void);
|
||||
|
||||
COUNT:
|
||||
lda #<JOY_COUNT
|
||||
ldx #>JOY_COUNT
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; READ: Read a particular joystick passed in A.
|
||||
;
|
||||
;unsigned char __fastcall__ joy_read (unsigned char joystick);
|
||||
|
||||
READJOY:
|
||||
lda JOY_DATA
|
||||
ldx #0
|
||||
rts
|
||||
|
14
libsrc/gamate/joy_stat_stddrv.s
Normal file
14
libsrc/gamate/joy_stat_stddrv.s
Normal file
@ -0,0 +1,14 @@
|
||||
;
|
||||
; Address of the static standard joystick driver
|
||||
;
|
||||
; Oliver Schmidt, 2012-11-01
|
||||
;
|
||||
; const void joy_static_stddrv[];
|
||||
;
|
||||
|
||||
.export _joy_static_stddrv
|
||||
.import _gamate_stdjoy_joy
|
||||
|
||||
.rodata
|
||||
|
||||
_joy_static_stddrv := _gamate_stdjoy_joy
|
13
libsrc/gamate/joy_stddrv.s
Normal file
13
libsrc/gamate/joy_stddrv.s
Normal file
@ -0,0 +1,13 @@
|
||||
;
|
||||
; Name of the standard joystick driver
|
||||
;
|
||||
; Oliver Schmidt, 2012-11-01
|
||||
;
|
||||
; const char joy_stddrv[];
|
||||
;
|
||||
|
||||
.export _joy_stddrv
|
||||
|
||||
.rodata
|
||||
|
||||
_joy_stddrv: .asciiz "gamate-stdjoy.joy"
|
32
libsrc/gamate/kplot.s
Normal file
32
libsrc/gamate/kplot.s
Normal file
@ -0,0 +1,32 @@
|
||||
|
||||
.export PLOT
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
PLOT:
|
||||
bcs @getpos
|
||||
|
||||
sty LCD_X
|
||||
;clc ; already cleared
|
||||
lda _plotlo,x
|
||||
sta LCD_Y
|
||||
|
||||
@getpos:
|
||||
ldx CURS_Y
|
||||
ldy CURS_X
|
||||
rts
|
||||
|
||||
.export _plotlo
|
||||
.rodata
|
||||
|
||||
_plotlo:
|
||||
.repeat screenrows,line
|
||||
.byte <($0000+(line*$8))
|
||||
.endrepeat
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; force the init constructor to be imported
|
||||
|
||||
.import initconio
|
||||
conio_init = initconio
|
8
libsrc/gamate/libref.s
Normal file
8
libsrc/gamate/libref.s
Normal file
@ -0,0 +1,8 @@
|
||||
;
|
||||
; Oliver Schmidt, 2013-05-31
|
||||
;
|
||||
|
||||
.export joy_libref
|
||||
.import _exit
|
||||
|
||||
joy_libref := _exit
|
21
libsrc/gamate/nmi.s
Normal file
21
libsrc/gamate/nmi.s
Normal file
@ -0,0 +1,21 @@
|
||||
;
|
||||
; NMI handling (Gamate version)
|
||||
;
|
||||
.export NMIStub
|
||||
|
||||
.segment "INIT"
|
||||
|
||||
NMIStub:
|
||||
; A is saved by the BIOS
|
||||
;pha
|
||||
;txa
|
||||
;pha
|
||||
;tya
|
||||
;pha
|
||||
|
||||
;pla
|
||||
;tay
|
||||
;pla
|
||||
;tax
|
||||
;pla
|
||||
rts
|
28
libsrc/gamate/revers.s
Normal file
28
libsrc/gamate/revers.s
Normal file
@ -0,0 +1,28 @@
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.export _revers
|
||||
|
||||
.proc _revers
|
||||
|
||||
ldx #$00 ; Assume revers off
|
||||
tay ; Test onoff
|
||||
beq L1 ; Jump if off
|
||||
ldx #$ff ; Load on value
|
||||
ldy #$00 ; Assume old value is zero
|
||||
L1: lda RVS ; Load old value
|
||||
stx RVS ; Set new value
|
||||
beq L2 ; Jump if old value zero
|
||||
iny ; Make old value = 1
|
||||
L2: ldx #$00 ; Load high byte of result
|
||||
tya ; Load low byte, set CC
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; force the init constructor to be imported
|
||||
|
||||
.import initconio
|
||||
conio_init = initconio
|
17
libsrc/gamate/ticktock.s
Normal file
17
libsrc/gamate/ticktock.s
Normal file
@ -0,0 +1,17 @@
|
||||
.interruptor ticktock, 24
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
ticktock:
|
||||
|
||||
; Increment the system tick counter.
|
||||
inc tickcount
|
||||
bne @s1
|
||||
inc tickcount+1
|
||||
bne @s1
|
||||
inc tickcount+2
|
||||
bne @s1
|
||||
inc tickcount+3
|
||||
@s1:
|
||||
rts
|
240
libsrc/gamate/vga.inc
Normal file
240
libsrc/gamate/vga.inc
Normal file
@ -0,0 +1,240 @@
|
||||
|
||||
; VGA charset for the Gamate conio implementation
|
||||
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $00
|
||||
|
||||
; 1
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %11111111
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
|
||||
; 2
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
; 3
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %11111111
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
; 4
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00011111
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
; 5
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %11110000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
; 6
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00011111
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
|
||||
; 7
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %11110000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
|
||||
; 8
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %11111111
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
; 9
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %11111111
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
|
||||
; 10 (LF)
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
.byte %00000000
|
||||
|
||||
; 11
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %11110000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
; 12
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00011111
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
.byte %00010000
|
||||
|
||||
.byte $3F, $33, $3F, $30, $30, $70, $F0, $E0
|
||||
.byte $7F, $63, $7F, $63, $63, $67, $E6, $C0
|
||||
.byte $99, $5A, $3C, $E7, $E7, $3C, $5A, $99
|
||||
.byte $80, $E0, $F8, $FE, $F8, $E0, $80, $00
|
||||
.byte $02, $0E, $3E, $FE, $3E, $0E, $02, $00
|
||||
.byte $18, $3C, $7E, $18, $18, $7E, $3C, $18
|
||||
.byte $66, $66, $66, $66, $66, $00, $66, $00
|
||||
.byte $7F, $DB, $DB, $7B, $1B, $1B, $1B, $00
|
||||
.byte $3E, $63, $38, $6C, $6C, $38, $CC, $78
|
||||
.byte $00, $00, $00, $00, $7E, $7E, $7E, $00
|
||||
.byte $18, $3C, $7E, $18, $7E, $3C, $18, $FF
|
||||
.byte $18, $3C, $7E, $18, $18, $18, $18, $00
|
||||
.byte $18, $18, $18, $18, $7E, $3C, $18, $00
|
||||
.byte $00, $18, $0C, $FE, $0C, $18, $00, $00
|
||||
.byte $00, $30, $60, $FE, $60, $30, $00, $00
|
||||
.byte $00, $00, $C0, $C0, $C0, $FE, $00, $00
|
||||
.byte $00, $24, $66, $FF, $66, $24, $00, $00
|
||||
.byte $00, $18, $3C, $7E, $FF, $FF, $00, $00
|
||||
.byte $00, $FF, $FF, $7E, $3C, $18, $00, $00
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $00
|
||||
.byte $30, $78, $78, $78, $30, $00, $30, $00
|
||||
.byte $6C, $6C, $6C, $00, $00, $00, $00, $00
|
||||
.byte $6C, $6C, $FE, $6C, $FE, $6C, $6C, $00
|
||||
.byte $30, $7C, $C0, $78, $0C, $F8, $30, $00
|
||||
.byte $00, $C6, $CC, $18, $30, $66, $C6, $00
|
||||
.byte $38, $6C, $38, $76, $DC, $CC, $76, $00
|
||||
.byte $60, $60, $C0, $00, $00, $00, $00, $00
|
||||
.byte $18, $30, $60, $60, $60, $30, $18, $00
|
||||
.byte $60, $30, $18, $18, $18, $30, $60, $00
|
||||
.byte $00, $66, $3C, $FF, $3C, $66, $00, $00
|
||||
.byte $00, $30, $30, $FC, $30, $30, $00, $00
|
||||
.byte $00, $00, $00, $00, $00, $30, $30, $60
|
||||
.byte $00, $00, $00, $FC, $00, $00, $00, $00
|
||||
.byte $00, $00, $00, $00, $00, $30, $30, $00
|
||||
.byte $06, $0C, $18, $30, $60, $C0, $80, $00
|
||||
.byte $7C, $C6, $CE, $DE, $F6, $E6, $7C, $00
|
||||
.byte $30, $70, $30, $30, $30, $30, $FC, $00
|
||||
.byte $78, $CC, $0C, $38, $60, $CC, $FC, $00
|
||||
.byte $78, $CC, $0C, $38, $0C, $CC, $78, $00
|
||||
.byte $1C, $3C, $6C, $CC, $FE, $0C, $1E, $00
|
||||
.byte $FC, $C0, $F8, $0C, $0C, $CC, $78, $00
|
||||
.byte $38, $60, $C0, $F8, $CC, $CC, $78, $00
|
||||
.byte $FC, $CC, $0C, $18, $30, $30, $30, $00
|
||||
.byte $78, $CC, $CC, $78, $CC, $CC, $78, $00
|
||||
.byte $78, $CC, $CC, $7C, $0C, $18, $70, $00
|
||||
.byte $00, $30, $30, $00, $00, $30, $30, $00
|
||||
.byte $00, $30, $30, $00, $00, $30, $30, $60
|
||||
.byte $18, $30, $60, $C0, $60, $30, $18, $00
|
||||
.byte $00, $00, $FC, $00, $00, $FC, $00, $00
|
||||
.byte $60, $30, $18, $0C, $18, $30, $60, $00
|
||||
.byte $78, $CC, $0C, $18, $30, $00, $30, $00
|
||||
.byte $7C, $C6, $DE, $DE, $DE, $C0, $78, $00
|
||||
.byte $30, $78, $CC, $CC, $FC, $CC, $CC, $00
|
||||
.byte $FC, $66, $66, $7C, $66, $66, $FC, $00
|
||||
.byte $3C, $66, $C0, $C0, $C0, $66, $3C, $00
|
||||
.byte $F8, $6C, $66, $66, $66, $6C, $F8, $00
|
||||
.byte $7E, $60, $60, $78, $60, $60, $7E, $00
|
||||
.byte $7E, $60, $60, $78, $60, $60, $60, $00
|
||||
.byte $3C, $66, $C0, $C0, $CE, $66, $3E, $00
|
||||
.byte $CC, $CC, $CC, $FC, $CC, $CC, $CC, $00
|
||||
.byte $78, $30, $30, $30, $30, $30, $78, $00
|
||||
.byte $1E, $0C, $0C, $0C, $CC, $CC, $78, $00
|
||||
.byte $E6, $66, $6C, $78, $6C, $66, $E6, $00
|
||||
.byte $60, $60, $60, $60, $60, $60, $7E, $00
|
||||
.byte $C6, $EE, $FE, $FE, $D6, $C6, $C6, $00
|
||||
.byte $C6, $E6, $F6, $DE, $CE, $C6, $C6, $00
|
||||
.byte $38, $6C, $C6, $C6, $C6, $6C, $38, $00
|
||||
.byte $FC, $66, $66, $7C, $60, $60, $F0, $00
|
||||
.byte $78, $CC, $CC, $CC, $DC, $78, $1C, $00
|
||||
.byte $FC, $66, $66, $7C, $6C, $66, $E6, $00
|
||||
.byte $78, $CC, $E0, $70, $1C, $CC, $78, $00
|
||||
.byte $FC, $30, $30, $30, $30, $30, $30, $00
|
||||
.byte $CC, $CC, $CC, $CC, $CC, $CC, $FC, $00
|
||||
.byte $CC, $CC, $CC, $CC, $CC, $78, $30, $00
|
||||
.byte $C6, $C6, $C6, $D6, $FE, $EE, $C6, $00
|
||||
.byte $C6, $C6, $6C, $38, $38, $6C, $C6, $00
|
||||
.byte $CC, $CC, $CC, $78, $30, $30, $78, $00
|
||||
.byte $FE, $06, $0C, $18, $30, $60, $FE, $00
|
||||
.byte $78, $60, $60, $60, $60, $60, $78, $00
|
||||
.byte $C0, $60, $30, $18, $0C, $06, $02, $00
|
||||
.byte $78, $18, $18, $18, $18, $18, $78, $00
|
||||
.byte $10, $38, $6C, $C6, $00, $00, $00, $00
|
||||
.byte $00, $00, $00, $00, $00, $00, $00, $FF
|
||||
.byte $30, $30, $18, $00, $00, $00, $00, $00
|
||||
.byte $00, $00, $78, $0C, $7C, $CC, $76, $00
|
||||
.byte $E0, $60, $60, $7C, $66, $66, $DC, $00
|
||||
.byte $00, $00, $78, $CC, $C0, $CC, $78, $00
|
||||
.byte $1C, $0C, $0C, $7C, $CC, $CC, $76, $00
|
||||
.byte $00, $00, $78, $CC, $FC, $C0, $78, $00
|
||||
.byte $38, $6C, $60, $F0, $60, $60, $F0, $00
|
||||
.byte $00, $00, $76, $CC, $CC, $7C, $0C, $F8
|
||||
.byte $E0, $60, $6C, $76, $66, $66, $E6, $00
|
||||
.byte $30, $00, $70, $30, $30, $30, $78, $00
|
||||
.byte $0C, $00, $0C, $0C, $0C, $CC, $CC, $78
|
||||
.byte $E0, $60, $66, $6C, $78, $6C, $E6, $00
|
||||
.byte $70, $30, $30, $30, $30, $30, $78, $00
|
||||
.byte $00, $00, $CC, $FE, $FE, $D6, $C6, $00
|
||||
.byte $00, $00, $F8, $CC, $CC, $CC, $CC, $00
|
||||
.byte $00, $00, $78, $CC, $CC, $CC, $78, $00
|
||||
.byte $00, $00, $DC, $66, $66, $7C, $60, $F0
|
||||
.byte $00, $00, $76, $CC, $CC, $7C, $0C, $1E
|
||||
.byte $00, $00, $DC, $76, $66, $60, $F0, $00
|
||||
.byte $00, $00, $7C, $C0, $78, $0C, $F8, $00
|
||||
.byte $10, $30, $7C, $30, $30, $34, $18, $00
|
||||
.byte $00, $00, $CC, $CC, $CC, $CC, $76, $00
|
||||
.byte $00, $00, $CC, $CC, $CC, $78, $30, $00
|
||||
.byte $00, $00, $C6, $D6, $FE, $FE, $6C, $00
|
||||
.byte $00, $00, $C6, $6C, $38, $6C, $C6, $00
|
||||
.byte $00, $00, $CC, $CC, $CC, $7C, $0C, $F8
|
||||
.byte $00, $00, $FC, $98, $30, $64, $FC, $00
|
||||
.byte $1C, $30, $30, $E0, $30, $30, $1C, $00
|
||||
.byte $18, $18, $18, $00, $18, $18, $18, $00
|
||||
.byte $E0, $30, $30, $1C, $30, $30, $E0, $00
|
||||
.byte $76, $DC, $00, $00, $00, $00, $00, $00
|
||||
.byte $00, $10, $38, $6C, $C6, $C6, $FE, $00
|
20
libsrc/gamate/waitvblank.s
Normal file
20
libsrc/gamate/waitvblank.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; void waitvblank (void);
|
||||
;
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.forceimport ticktock
|
||||
.export _waitvblank
|
||||
|
||||
; FIXME: is this actually correct?
|
||||
|
||||
.proc _waitvblank
|
||||
|
||||
lda tickcount
|
||||
@lp: cmp tickcount
|
||||
beq @lp
|
||||
rts
|
||||
|
||||
.endproc
|
20
libsrc/gamate/wherex.s
Normal file
20
libsrc/gamate/wherex.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2003-05-02
|
||||
;
|
||||
; unsigned char wherex (void);
|
||||
;
|
||||
|
||||
.export _wherex
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.proc _wherex
|
||||
|
||||
lda CURS_X
|
||||
ldx #$00
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
20
libsrc/gamate/wherey.s
Normal file
20
libsrc/gamate/wherey.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2003-05-02
|
||||
;
|
||||
; unsigned char wherey (void);
|
||||
;
|
||||
|
||||
.export _wherey
|
||||
|
||||
.include "gamate.inc"
|
||||
.include "extzp.inc"
|
||||
|
||||
.proc _wherey
|
||||
|
||||
lda CURS_Y
|
||||
ldx #$00
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
|
@ -68,7 +68,7 @@ int main (void)
|
||||
gotoxy ((XSize - strlen (Text)) / 2, YSize / 2);
|
||||
cprintf ("%s", Text);
|
||||
|
||||
#if defined(__NES__) || defined(__PCE__)
|
||||
#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
|
||||
|
||||
/* Wait for the user to press a button */
|
||||
joy_install (joy_static_stddrv);
|
||||
|
@ -264,6 +264,10 @@ static void SetSys (const char* Sys)
|
||||
NewSymbol ("__APPLE2ENH__", 1);
|
||||
break;
|
||||
|
||||
case TGT_GAMATE:
|
||||
NewSymbol ("__GAMATE__", 1);
|
||||
break;
|
||||
|
||||
case TGT_GEOS_CBM:
|
||||
/* Do not handle as a CBM system */
|
||||
NewSymbol ("__GEOS__", 1);
|
||||
|
@ -220,6 +220,10 @@ static void SetSys (const char* Sys)
|
||||
DefineNumericMacro ("__APPLE2ENH__", 1);
|
||||
break;
|
||||
|
||||
case TGT_GAMATE:
|
||||
DefineNumericMacro ("__GAMATE__", 1);
|
||||
break;
|
||||
|
||||
case TGT_GEOS_CBM:
|
||||
/* Do not handle as a CBM system */
|
||||
DefineNumericMacro ("__GEOS__", 1);
|
||||
|
@ -154,6 +154,7 @@ static const TargetEntry TargetMap[] = {
|
||||
{ "c64", TGT_C64 },
|
||||
{ "cbm510", TGT_CBM510 },
|
||||
{ "cbm610", TGT_CBM610 },
|
||||
{ "gamate", TGT_GAMATE },
|
||||
{ "geos", TGT_GEOS_CBM },
|
||||
{ "geos-apple", TGT_GEOS_APPLE },
|
||||
{ "geos-cbm", TGT_GEOS_CBM },
|
||||
@ -204,6 +205,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
|
||||
{ "sim6502", CPU_6502, BINFMT_BINARY, CTNone },
|
||||
{ "sim65c02", CPU_65C02, BINFMT_BINARY, CTNone },
|
||||
{ "pce", CPU_HUC6280, BINFMT_BINARY, CTNone },
|
||||
{ "gamate", CPU_6502, BINFMT_BINARY, CTNone },
|
||||
};
|
||||
|
||||
/* Target system */
|
||||
|
@ -79,6 +79,7 @@ typedef enum {
|
||||
TGT_SIM6502,
|
||||
TGT_SIM65C02,
|
||||
TGT_PCENGINE,
|
||||
TGT_GAMATE,
|
||||
TGT_COUNT /* Number of target systems */
|
||||
} target_t;
|
||||
|
||||
|
@ -15,6 +15,15 @@
|
||||
#include <stdlib.h>
|
||||
#include <joystick.h>
|
||||
|
||||
#if defined(__GAMATE__)
|
||||
/* there is not enough screen space to show all 256 characters at the bottom */
|
||||
#define NUMCHARS 128
|
||||
#define NUMCOLS 4
|
||||
#else
|
||||
#define NUMCHARS 256
|
||||
#define NUMCOLS 16
|
||||
#endif
|
||||
|
||||
static char grid[5][5] = {
|
||||
{ CH_ULCORNER, CH_HLINE, CH_TTEE, CH_HLINE, CH_URCORNER },
|
||||
{ CH_VLINE, ' ', CH_VLINE, ' ', CH_VLINE },
|
||||
@ -27,10 +36,15 @@ void main(void)
|
||||
{
|
||||
int i, j, n;
|
||||
unsigned char xsize, ysize, tcol, bgcol, bcol, inpos = 0;
|
||||
#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
|
||||
unsigned char joy;
|
||||
|
||||
joy_install(joy_static_stddrv);
|
||||
#endif
|
||||
clrscr();
|
||||
screensize(&xsize, &ysize);
|
||||
cputs("cc65 conio test\n\rInput: [ ]");
|
||||
cputs("cc65 conio test\n\r");
|
||||
cputs("Input:[ ]");
|
||||
|
||||
cputsxy(0, 2, "Colors:" );
|
||||
tcol = textcolor(0); /* remember original textcolor */
|
||||
@ -39,14 +53,14 @@ void main(void)
|
||||
bgcolor(bgcol);bordercolor(bcol);
|
||||
for (i = 0; i < 3; ++i) {
|
||||
gotoxy(i,3 + i);
|
||||
for (j = 0; j < 16; ++j) {
|
||||
for (j = 0; j < NUMCOLS; ++j) {
|
||||
textcolor(j);
|
||||
cputc('X');
|
||||
}
|
||||
}
|
||||
textcolor(tcol);
|
||||
|
||||
cprintf("\n\n\r Screensize is: %dx%d", xsize, ysize);
|
||||
cprintf("\n\n\r Screensize: %dx%d", xsize, ysize );
|
||||
|
||||
chlinexy(0,6,xsize);
|
||||
cvlinexy(0,6,3);
|
||||
@ -64,13 +78,13 @@ void main(void)
|
||||
}
|
||||
}
|
||||
|
||||
gotoxy(0,ysize - 2 - ((256 + xsize) / xsize));
|
||||
gotoxy(0,ysize - 2 - ((NUMCHARS + xsize) / xsize));
|
||||
revers(1);
|
||||
for (i = 0; i < xsize; ++i) {
|
||||
cputc('0' + i % 10);
|
||||
}
|
||||
revers(0);
|
||||
for (i = 0; i < 256; ++i) {
|
||||
for (i = 0; i < NUMCHARS; ++i) {
|
||||
if ((i != '\n') && (i != '\r')) {
|
||||
cputc(i);
|
||||
} else {
|
||||
@ -89,23 +103,27 @@ void main(void)
|
||||
cursor(1);
|
||||
for (;;) {
|
||||
|
||||
/* do the "rvs" blinking */
|
||||
i = textcolor(COLOR_BLACK);
|
||||
gotoxy(8, 2);
|
||||
j = n & 1;
|
||||
j = n >> 4 & 1;
|
||||
revers(j);
|
||||
cputc(j ? 'R' : ' ');
|
||||
revers(j ^ 1);
|
||||
cputs(" revers");
|
||||
cputs(" rvs");
|
||||
revers(0);
|
||||
textcolor(i);
|
||||
|
||||
#if defined(__NES__) || defined(__PCE__)
|
||||
|
||||
joy_install(joy_static_stddrv);
|
||||
while (!joy_read(JOY_1)) ;
|
||||
joy_uninstall();
|
||||
gotoxy(7 + inpos,1);
|
||||
|
||||
#if defined(__NES__) || defined(__PCE__) || defined(__GAMATE__)
|
||||
/* not all targets have waitvblank */
|
||||
waitvblank();
|
||||
/* for targets that do not have a keyboard, read the first
|
||||
joystick */
|
||||
joy = joy_read(JOY_1);
|
||||
cprintf("%02x", joy);
|
||||
#else
|
||||
|
||||
gotoxy(8 + inpos,1);
|
||||
i = cgetc();
|
||||
if ((i >= '0') && (i<='9')) {
|
||||
textcolor(i - '0');
|
||||
@ -129,9 +147,7 @@ void main(void)
|
||||
cputc(i);
|
||||
inpos = (inpos + 1) & 7;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
++n;
|
||||
}
|
||||
}
|
||||
|
@ -87,6 +87,7 @@ static emd_test_t drivers[] = {
|
||||
{ '6', "REU", "c64-reu.emd" },
|
||||
{ '7', "C128 VDC (in C64 mode)", "c64-vdc.emd" },
|
||||
{ '8', "C64DTV himem", "dtv-himem.emd" },
|
||||
{ '9', "65816 extra banks", "c64-65816.emd" },
|
||||
#endif
|
||||
|
||||
#if defined(__C128__)
|
||||
@ -96,6 +97,8 @@ static emd_test_t drivers[] = {
|
||||
{ '3', "RamCart", "c128-ramcart.emd" },
|
||||
{ '4', "REU", "c128-reu.emd" },
|
||||
{ '5', "VDC", "c128-vdc.emd" },
|
||||
{ '6', "Internal Function RAM", "c128-ifnram.emd" },
|
||||
{ '7', "External Function RAM", "c128-efnram.emd" },
|
||||
#endif
|
||||
|
||||
#if defined(__CBM510__)
|
||||
|
25
testcode/lib/gamate/Makefile
Normal file
25
testcode/lib/gamate/Makefile
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
all: audiotest.bin lcdtest.bin ctest.bin
|
||||
|
||||
audiotest.bin: audiotest.s
|
||||
../../../bin/cl65 -l audiotest.lst -t gamate -o audiotest.bin audiotest.s
|
||||
lcdtest.bin: lcdtest.s
|
||||
../../../bin/cl65 -l lcdtest.lst -t gamate -o lcdtest.bin lcdtest.s
|
||||
ctest.bin: ctest.c
|
||||
../../../bin/cl65 -l ctest.lst -t gamate -o ctest.bin ctest.c
|
||||
nachtm.bin: nachtm.c
|
||||
../../../bin/cl65 -Os -l nachtm.lst -t gamate -o nachtm.bin nachtm.c
|
||||
gamate-fixcart nachtm.bin
|
||||
|
||||
test1: lcdtest.bin
|
||||
cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/lcdtest.bin
|
||||
test2: audiotest.bin
|
||||
cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/audiotest.bin
|
||||
testc: ctest.bin
|
||||
cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/ctest.bin
|
||||
testn: nachtm.bin
|
||||
cd ~/Desktop/mame/winmess/ && wine mess.exe gamate -window -skip_gameinfo -cart ~/Desktop/cc65/github/cc65/testcode/lib/gamate/nachtm.bin
|
||||
|
||||
clean:
|
||||
rm -f lcdtest.o audiotest.o ctest.o
|
||||
rm -f lcdtest.bin audiotest.bin ctest.bin nachtm.bin
|
457
testcode/lib/gamate/audiotest.s
Normal file
457
testcode/lib/gamate/audiotest.s
Normal file
@ -0,0 +1,457 @@
|
||||
;
|
||||
; original audiotest.s by PeT (mess@utanet.at)
|
||||
;
|
||||
; cl65 -t gamate -o audiotest.bin audiotest.s
|
||||
;
|
||||
|
||||
.include "gamate.inc"
|
||||
|
||||
.zeropage
|
||||
addr: .word 0
|
||||
psa: .word 0
|
||||
readaddr: .word 0
|
||||
editbuffer1: .byte 0,0,0,0, 0,0,0,0
|
||||
writeaddr: .word 0
|
||||
editbuffer2: .byte 0,0,0,0, 0,0,0,0
|
||||
cursor: .byte 0
|
||||
controlslast: .byte 0
|
||||
controlsedge: .byte 0
|
||||
|
||||
.bss
|
||||
temp_x: .byte 0
|
||||
temp_y: .byte 0
|
||||
temp_a: .byte 0
|
||||
irq_count: .byte 0
|
||||
nmi_count: .byte 0
|
||||
psx: .byte 0
|
||||
psy: .byte 0
|
||||
xpos: .byte 0
|
||||
ypos: .byte 0
|
||||
|
||||
.rodata
|
||||
|
||||
chars: .incbin "cga2.chr"
|
||||
hex2asc: .byte "0123456789abcdef"
|
||||
|
||||
.code
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
.export IRQStub, NMIStub
|
||||
|
||||
.proc NMIStub
|
||||
inc nmi_count
|
||||
rts
|
||||
.endproc
|
||||
|
||||
.proc IRQStub
|
||||
inc irq_count
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
.export Start
|
||||
|
||||
.proc Start
|
||||
sei
|
||||
lda #0
|
||||
sta ZP_IRQ_CTRL
|
||||
|
||||
lda #>AUDIO_BASE
|
||||
sta writeaddr+1
|
||||
sta readaddr+1
|
||||
lda #<AUDIO_BASE
|
||||
sta writeaddr
|
||||
sta readaddr
|
||||
|
||||
lda #$10
|
||||
sta editbuffer1+6
|
||||
lda #$e
|
||||
sta editbuffer2+5
|
||||
lda #$ff
|
||||
sta editbuffer2+3
|
||||
lda #$ff
|
||||
sta editbuffer2+4
|
||||
lda #$0f
|
||||
sta editbuffer2
|
||||
lda #$0f
|
||||
sta editbuffer2+1
|
||||
lda #$0e
|
||||
sta editbuffer2+2
|
||||
lda #$38
|
||||
sta editbuffer1+7
|
||||
|
||||
lda #0
|
||||
sta LCD_XPOS
|
||||
sta LCD_YPOS
|
||||
sta irq_count
|
||||
sta cursor
|
||||
lda #1
|
||||
sta nmi_count
|
||||
cli
|
||||
lda #LCD_MODE_INC_Y
|
||||
sta LCD_MODE
|
||||
|
||||
jsr printy
|
||||
|
||||
lda #1
|
||||
sta ZP_IRQ_CTRL
|
||||
|
||||
loop:
|
||||
lda irq_count
|
||||
loop1:
|
||||
cmp irq_count
|
||||
beq loop1
|
||||
lda irq_count
|
||||
and #7
|
||||
bne loop1
|
||||
|
||||
lda #LCD_MODE_INC_Y
|
||||
sta LCD_MODE
|
||||
|
||||
ldx #3
|
||||
ldy #32
|
||||
lda irq_count
|
||||
jsr printhex
|
||||
|
||||
lda cursor
|
||||
ldy #0
|
||||
cmp #20
|
||||
bcc firstline
|
||||
sec
|
||||
sbc #20
|
||||
ldy #24
|
||||
firstline:
|
||||
sta LCD_X
|
||||
sty LCD_Y
|
||||
lda #' '
|
||||
jsr printsign
|
||||
norclearcursor:
|
||||
|
||||
jsr inputs
|
||||
|
||||
lda irq_count
|
||||
and #8
|
||||
bne nocursor
|
||||
lda cursor
|
||||
ldy #0
|
||||
cmp #20
|
||||
bcc firstline2
|
||||
sec
|
||||
sbc #20
|
||||
ldy #24
|
||||
firstline2:
|
||||
sta LCD_X
|
||||
sty LCD_Y
|
||||
lda #'x'
|
||||
jsr printsign
|
||||
nocursor:
|
||||
|
||||
lda #LCD_MODE_INC_Y
|
||||
sta LCD_MODE
|
||||
jsr printy
|
||||
jmp loop
|
||||
.endproc
|
||||
|
||||
.proc printy
|
||||
|
||||
ldy #0
|
||||
loop1:
|
||||
tya
|
||||
pha
|
||||
asl
|
||||
tax
|
||||
lda readaddr,y
|
||||
ldy #8
|
||||
jsr printhex
|
||||
pla
|
||||
tay
|
||||
iny
|
||||
cpy #10
|
||||
bne loop1
|
||||
|
||||
loop2:
|
||||
tya
|
||||
pha
|
||||
tya
|
||||
sec
|
||||
sbc #10
|
||||
asl
|
||||
tax
|
||||
lda readaddr,y
|
||||
ldy #16
|
||||
jsr printhex
|
||||
pla
|
||||
tay
|
||||
iny
|
||||
cpy #20
|
||||
bne loop2
|
||||
|
||||
ldx #0
|
||||
ldy #32
|
||||
lda nmi_count
|
||||
jsr printhex
|
||||
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
.proc inputs
|
||||
lda controlslast
|
||||
eor JOY_DATA
|
||||
and controlslast
|
||||
eor #$ff
|
||||
sta controlsedge
|
||||
and #JOY_DATA_UP
|
||||
bne notup
|
||||
|
||||
lda cursor
|
||||
lsr
|
||||
tay
|
||||
bcs uplow
|
||||
lda readaddr,y
|
||||
clc
|
||||
adc #$10
|
||||
sta readaddr,y
|
||||
jmp notup
|
||||
uplow:
|
||||
lda readaddr,y
|
||||
clc
|
||||
adc #1
|
||||
sta readaddr,y
|
||||
notup:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_DOWN
|
||||
bne notdown
|
||||
lda cursor
|
||||
lsr
|
||||
tay
|
||||
bcs downlow
|
||||
lda readaddr,y
|
||||
sec
|
||||
sbc #$10
|
||||
sta readaddr,y
|
||||
jmp notdown
|
||||
downlow:
|
||||
lda readaddr,y
|
||||
sec
|
||||
sbc #1
|
||||
sta readaddr,y
|
||||
notdown:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_LEFT
|
||||
bne notleft
|
||||
lda cursor
|
||||
beq notleft
|
||||
dec cursor
|
||||
notleft:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_RIGHT
|
||||
bne notright
|
||||
lda cursor
|
||||
cmp #40
|
||||
beq notright
|
||||
inc cursor
|
||||
notright:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_START
|
||||
bne notstart
|
||||
lda #0
|
||||
sta AUDIO_BASE
|
||||
sta AUDIO_BASE+1
|
||||
sta AUDIO_BASE+2
|
||||
sta AUDIO_BASE+3
|
||||
sta AUDIO_BASE+4
|
||||
sta AUDIO_BASE+5
|
||||
sta AUDIO_BASE+6
|
||||
sta AUDIO_BASE+8
|
||||
sta AUDIO_BASE+9
|
||||
sta AUDIO_BASE+10
|
||||
sta AUDIO_BASE+11
|
||||
sta AUDIO_BASE+12
|
||||
sta AUDIO_BASE+13
|
||||
sta AUDIO_BASE+7
|
||||
notstart:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_SELECT
|
||||
bne notselect
|
||||
|
||||
lda editbuffer1
|
||||
sta AUDIO_BASE
|
||||
lda editbuffer1+1
|
||||
sta AUDIO_BASE+1
|
||||
lda editbuffer1+2
|
||||
sta AUDIO_BASE+2
|
||||
lda editbuffer1+3
|
||||
sta AUDIO_BASE+3
|
||||
lda editbuffer1+4
|
||||
sta AUDIO_BASE+4
|
||||
lda editbuffer1+5
|
||||
sta AUDIO_BASE+5
|
||||
lda editbuffer1+6
|
||||
sta AUDIO_BASE+6
|
||||
lda editbuffer2
|
||||
sta AUDIO_BASE+8
|
||||
lda editbuffer2+1
|
||||
sta AUDIO_BASE+9
|
||||
lda editbuffer2+2
|
||||
sta AUDIO_BASE+10
|
||||
lda editbuffer2+3
|
||||
sta AUDIO_BASE+11
|
||||
lda editbuffer2+4
|
||||
sta AUDIO_BASE+12
|
||||
lda editbuffer2+5
|
||||
sta AUDIO_BASE+13
|
||||
lda editbuffer1+7
|
||||
sta AUDIO_BASE+7
|
||||
notselect:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_FIRE_A
|
||||
bne notbuttona
|
||||
ldy #0
|
||||
ldy #0
|
||||
writea:
|
||||
lda editbuffer1,y
|
||||
sta (writeaddr),y
|
||||
iny
|
||||
cpy #8
|
||||
bne writea
|
||||
writeb:
|
||||
lda editbuffer2-8,y
|
||||
sta (writeaddr),y
|
||||
iny
|
||||
cpy #16
|
||||
bne writeb
|
||||
notbuttona:
|
||||
lda controlsedge
|
||||
and #JOY_DATA_FIRE_B
|
||||
bne notbuttonb
|
||||
ldy #0
|
||||
reada:
|
||||
lda (readaddr),y
|
||||
sta editbuffer1,y
|
||||
iny
|
||||
cpy #8
|
||||
bne reada
|
||||
|
||||
readb: lda (readaddr),y
|
||||
sta editbuffer2-8,y
|
||||
iny
|
||||
cpy #16
|
||||
bne readb
|
||||
notbuttonb:
|
||||
lda JOY_DATA
|
||||
sta controlslast
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
.proc printstring
|
||||
sta psa
|
||||
stx psa+1
|
||||
ldx #0
|
||||
stx psx
|
||||
sty psy
|
||||
printstring2:
|
||||
ldy #0
|
||||
lda (psa),y
|
||||
beq printstring1
|
||||
ldx psx
|
||||
stx LCD_X
|
||||
ldy psy
|
||||
sty LCD_Y
|
||||
jsr printsign
|
||||
inc psx
|
||||
lda psa
|
||||
clc
|
||||
adc #1
|
||||
sta psa
|
||||
lda psa+1
|
||||
adc #0
|
||||
sta psa+1
|
||||
jmp printstring2
|
||||
printstring1:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
.proc printstringy
|
||||
sta psa
|
||||
stx psa+1
|
||||
printstring2:
|
||||
ldy #0
|
||||
lda (psa),y
|
||||
beq printstring1
|
||||
jsr printsign
|
||||
lda psa
|
||||
clc
|
||||
adc #1
|
||||
sta psa
|
||||
lda psa+1
|
||||
adc #0
|
||||
sta psa+1
|
||||
jmp printstring2
|
||||
printstring1:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
|
||||
.proc printhex
|
||||
pha
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
and #$0f
|
||||
stx temp_x
|
||||
tax
|
||||
lda hex2asc,x
|
||||
ldx temp_x
|
||||
stx LCD_X
|
||||
sty LCD_Y
|
||||
jsr printsign
|
||||
pla
|
||||
and #$0f
|
||||
inx
|
||||
stx temp_x
|
||||
tax
|
||||
lda hex2asc,x
|
||||
ldx temp_x
|
||||
stx LCD_X
|
||||
sty LCD_Y
|
||||
jmp printsign
|
||||
.endproc
|
||||
|
||||
.proc printsign
|
||||
sty temp_y
|
||||
stx temp_x
|
||||
sta temp_a
|
||||
lda temp_a
|
||||
sta addr
|
||||
lda #0
|
||||
sta addr+1
|
||||
asl addr
|
||||
rol addr+1
|
||||
asl addr
|
||||
rol addr+1
|
||||
asl addr
|
||||
rol addr+1
|
||||
lda addr
|
||||
clc
|
||||
adc #<chars
|
||||
sta addr
|
||||
lda addr+1
|
||||
adc #>chars
|
||||
sta addr+1
|
||||
ldx #8
|
||||
ldy #0
|
||||
printsign1:
|
||||
lda (addr),y
|
||||
sta LCD_DATA
|
||||
iny
|
||||
dex
|
||||
bne printsign1
|
||||
ldx temp_x
|
||||
ldy temp_y
|
||||
rts
|
||||
.endproc
|
BIN
testcode/lib/gamate/cga2.chr
Normal file
BIN
testcode/lib/gamate/cga2.chr
Normal file
Binary file not shown.
52
testcode/lib/gamate/ctest.c
Normal file
52
testcode/lib/gamate/ctest.c
Normal file
@ -0,0 +1,52 @@
|
||||
|
||||
#include <gamate.h>
|
||||
#include <time.h>
|
||||
#include <conio.h>
|
||||
|
||||
unsigned char y = 0;
|
||||
unsigned char x = 0;
|
||||
unsigned short n;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
clrscr();
|
||||
gotoxy(0,0);cputs("Gamate C-Test");
|
||||
|
||||
textcolor(0);gotoxy(0,5);cputs("abcdABCD 0");
|
||||
textcolor(1);gotoxy(0,6);cputs("abcdABCD 1");
|
||||
textcolor(2);gotoxy(0,7);cputs("abcdABCD 2");
|
||||
textcolor(3);gotoxy(0,8);cputs("abcdABCD 3");
|
||||
|
||||
while(1) {
|
||||
textcolor(COLOR_BLACK);
|
||||
|
||||
n = clock();
|
||||
|
||||
gotoxy(0,2);cprintf("%04x %02x %02x %02x", n, x, y, *((unsigned char*)JOY_DATA));
|
||||
|
||||
switch((*((unsigned char*)JOY_DATA))) {
|
||||
case 0xff ^ JOY_DATA_UP:
|
||||
++y; if (y == 0xc8) y = 0;
|
||||
break;
|
||||
case 0xff ^ JOY_DATA_DOWN:
|
||||
--y; if (y == 0xff) y = 0xc7;
|
||||
break;
|
||||
case 0xff ^ JOY_DATA_LEFT:
|
||||
++x;
|
||||
break;
|
||||
case 0xff ^ JOY_DATA_RIGHT:
|
||||
--x;
|
||||
break;
|
||||
case 0xff ^ JOY_DATA_FIRE_A:
|
||||
break;
|
||||
}
|
||||
|
||||
waitvblank();
|
||||
|
||||
(*((unsigned char*)LCD_XPOS)) = x;
|
||||
(*((unsigned char*)LCD_YPOS)) = y;
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
422
testcode/lib/gamate/lcdtest.s
Normal file
422
testcode/lib/gamate/lcdtest.s
Normal file
@ -0,0 +1,422 @@
|
||||
;
|
||||
; original lcdtest.s by PeT (mess@utanet.at)
|
||||
;
|
||||
; cl65 -t gamate -o lcdtest.bin lcdtest.s
|
||||
;
|
||||
|
||||
.include "gamate.inc"
|
||||
|
||||
.zeropage
|
||||
addr: .word 0
|
||||
psa: .word 0
|
||||
|
||||
.bss
|
||||
temp_x: .byte 0
|
||||
temp_y: .byte 0
|
||||
temp_a: .byte 0
|
||||
irq_count: .byte 0
|
||||
nmi_count: .byte 0
|
||||
psx: .byte 0
|
||||
psy: .byte 0
|
||||
count: .word 0
|
||||
counted: .word 0
|
||||
xpos: .byte 0
|
||||
ypos: .byte 0
|
||||
|
||||
.rodata
|
||||
|
||||
chars: .incbin "cga2.chr"
|
||||
|
||||
hex2asc: .byte "0123456789abcdef"
|
||||
format: .byte "IrqNmiCountXposYpos", 0
|
||||
xdesc: .byte "0123456789abcdefghijklmnopqrstuv", 0
|
||||
ydesc: .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
|
||||
|
||||
.code
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
.export IRQStub, NMIStub
|
||||
|
||||
|
||||
.proc NMIStub
|
||||
|
||||
inc nmi_count
|
||||
rts
|
||||
.endproc
|
||||
|
||||
.proc IRQStub
|
||||
|
||||
inc irq_count
|
||||
lda count
|
||||
sta counted
|
||||
lda count+1
|
||||
sta counted+1
|
||||
lda #0
|
||||
sta count
|
||||
sta count+1
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
.export Start
|
||||
|
||||
.proc Start
|
||||
sei
|
||||
lda #0
|
||||
sta ZP_IRQ_CTRL
|
||||
|
||||
lda #0
|
||||
sta LCD_XPOS
|
||||
sta LCD_YPOS
|
||||
cli
|
||||
lda #LCD_MODE_INC_Y
|
||||
sta LCD_MODE
|
||||
|
||||
lda #0
|
||||
sta LCD_X
|
||||
lda #<xdesc
|
||||
ldx #>xdesc
|
||||
ldy #0
|
||||
jsr printstring
|
||||
|
||||
lda #LCD_XPOS_PLANE2
|
||||
sta LCD_X
|
||||
lda #<xdesc
|
||||
ldx #>xdesc
|
||||
ldy #128
|
||||
jsr printstring
|
||||
|
||||
lda #0
|
||||
sta LCD_X
|
||||
lda #<ydesc
|
||||
ldx #>ydesc
|
||||
ldy #0
|
||||
sty LCD_Y
|
||||
jsr printstringy
|
||||
|
||||
lda #(LCD_XPOS_PLANE2|(128/8)) ; ???
|
||||
sta LCD_X
|
||||
lda #<ydesc
|
||||
ldx #>ydesc
|
||||
ldy #0
|
||||
sty LCD_Y
|
||||
jsr printstringy
|
||||
|
||||
lda #<format
|
||||
ldx #>format
|
||||
ldy #8
|
||||
jsr printstring
|
||||
|
||||
lda #0
|
||||
sta LCD_MODE
|
||||
lda #24/8
|
||||
sta LCD_X
|
||||
lda #24
|
||||
sta LCD_Y
|
||||
lda #'X'
|
||||
jsr printsign
|
||||
|
||||
lda #$80
|
||||
sta LCD_MODE
|
||||
lda #32/8
|
||||
sta LCD_X
|
||||
lda #32
|
||||
sta LCD_Y
|
||||
lda #'Y'
|
||||
jsr printsign
|
||||
|
||||
lda #$c0
|
||||
sta LCD_MODE
|
||||
lda #40/8
|
||||
sta LCD_X
|
||||
lda #40
|
||||
sta LCD_Y
|
||||
lda #'Z'
|
||||
jsr printsign
|
||||
|
||||
lda #0
|
||||
sta LCD_MODE
|
||||
lda #LCD_XPOS_PLANE2|(48/8)
|
||||
sta LCD_X
|
||||
lda #48
|
||||
sta LCD_Y
|
||||
lda #'x'
|
||||
jsr printsign
|
||||
|
||||
lda #$80
|
||||
sta LCD_MODE
|
||||
lda #(LCD_XPOS_PLANE2|(56/8))
|
||||
sta LCD_X
|
||||
lda #56
|
||||
sta LCD_Y
|
||||
lda #'y'
|
||||
jsr printsign
|
||||
|
||||
lda #$c0
|
||||
sta LCD_MODE
|
||||
lda #(LCD_XPOS_PLANE2|(64/8))
|
||||
sta LCD_X
|
||||
lda #64
|
||||
sta LCD_Y
|
||||
lda #'z'
|
||||
jsr printsign
|
||||
|
||||
lda #LCD_MODE_INC_Y|1
|
||||
sta LCD_MODE
|
||||
lda #16/8
|
||||
sta LCD_X
|
||||
lda #72
|
||||
sta LCD_Y
|
||||
lda #'V'
|
||||
jsr printsign
|
||||
|
||||
lda #LCD_MODE_INC_Y|2
|
||||
sta LCD_MODE
|
||||
lda #24/8
|
||||
sta LCD_X
|
||||
lda #72
|
||||
sta LCD_Y
|
||||
lda #'V'
|
||||
jsr printsign
|
||||
|
||||
lda #LCD_MODE_INC_Y|4
|
||||
sta LCD_MODE
|
||||
lda #32/8
|
||||
sta LCD_X
|
||||
lda #72
|
||||
sta LCD_Y
|
||||
lda #'V'
|
||||
jsr printsign
|
||||
|
||||
lda #LCD_MODE_INC_Y|8
|
||||
sta LCD_MODE
|
||||
lda #40/8
|
||||
sta LCD_X
|
||||
lda #72
|
||||
sta LCD_Y
|
||||
lda #'V'
|
||||
jsr printsign
|
||||
|
||||
lda #1
|
||||
sta ZP_IRQ_CTRL
|
||||
|
||||
loop:
|
||||
lda count
|
||||
clc
|
||||
adc #1
|
||||
sta count
|
||||
lda count+1
|
||||
adc #0
|
||||
sta count+1
|
||||
|
||||
lda irq_count
|
||||
cmp irq_count
|
||||
beq loop
|
||||
|
||||
jsr inputs
|
||||
|
||||
lda #LCD_MODE_INC_Y
|
||||
sta LCD_MODE
|
||||
jsr printy
|
||||
|
||||
jmp loop
|
||||
.endproc
|
||||
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
.proc printy
|
||||
ldx #0
|
||||
ldy #16
|
||||
lda irq_count
|
||||
jsr printhex
|
||||
|
||||
ldx #3
|
||||
ldy #16
|
||||
lda nmi_count
|
||||
jsr printhex
|
||||
|
||||
ldx #6
|
||||
ldy #16
|
||||
lda counted+1
|
||||
jsr printhex
|
||||
ldx #8
|
||||
ldy #16
|
||||
lda counted
|
||||
jsr printhex
|
||||
|
||||
ldx #11
|
||||
ldy #16
|
||||
lda xpos
|
||||
jsr printhex
|
||||
ldx #14
|
||||
ldy #16
|
||||
lda ypos
|
||||
jsr printhex
|
||||
rts
|
||||
.endproc
|
||||
|
||||
.proc inputs
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_UP
|
||||
bne notup
|
||||
dec ypos
|
||||
lda ypos
|
||||
sta LCD_YPOS
|
||||
notup:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_DOWN
|
||||
bne notdown
|
||||
inc ypos
|
||||
lda ypos
|
||||
sta LCD_YPOS
|
||||
notdown:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_LEFT
|
||||
bne notleft
|
||||
dec xpos
|
||||
lda xpos
|
||||
sta LCD_XPOS
|
||||
notleft:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_RIGHT
|
||||
bne notright
|
||||
inc xpos
|
||||
lda xpos
|
||||
sta LCD_XPOS
|
||||
notright:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_START
|
||||
bne notstart
|
||||
notstart:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_SELECT
|
||||
bne notselect
|
||||
notselect:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_FIRE_A
|
||||
bne notbuttona
|
||||
notbuttona:
|
||||
lda JOY_DATA
|
||||
and #JOY_DATA_FIRE_B
|
||||
bne notbuttonb
|
||||
notbuttonb:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
.proc printstring
|
||||
sta psa
|
||||
stx psa+1
|
||||
ldx #0
|
||||
stx psx
|
||||
sty psy
|
||||
printstring2:
|
||||
ldy #0
|
||||
lda (psa),y
|
||||
beq printstring1
|
||||
ldx psx
|
||||
stx LCD_X
|
||||
ldy psy
|
||||
sty LCD_Y
|
||||
jsr printsign
|
||||
inc psx
|
||||
lda psa
|
||||
clc
|
||||
adc #1
|
||||
sta psa
|
||||
lda psa+1
|
||||
adc #0
|
||||
sta psa+1
|
||||
jmp printstring2
|
||||
printstring1:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
.proc printstringy
|
||||
sta psa
|
||||
stx psa+1
|
||||
printstring2:
|
||||
ldy #0
|
||||
lda (psa),y
|
||||
beq printstring1
|
||||
jsr printsign
|
||||
lda psa
|
||||
clc
|
||||
adc #1
|
||||
sta psa
|
||||
lda psa+1
|
||||
adc #0
|
||||
sta psa+1
|
||||
jmp printstring2
|
||||
printstring1:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
|
||||
.proc printhex
|
||||
pha
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
and #$0f
|
||||
stx temp_x
|
||||
tax
|
||||
lda hex2asc,x
|
||||
ldx temp_x
|
||||
stx LCD_X
|
||||
sty LCD_Y
|
||||
jsr printsign
|
||||
pla
|
||||
and #$0f
|
||||
inx
|
||||
stx temp_x
|
||||
tax
|
||||
lda hex2asc,x
|
||||
ldx temp_x
|
||||
stx LCD_X
|
||||
sty LCD_Y
|
||||
jmp printsign
|
||||
.endproc
|
||||
|
||||
.proc printsign
|
||||
sty temp_y
|
||||
stx temp_x
|
||||
sta temp_a
|
||||
|
||||
lda temp_a
|
||||
sta addr
|
||||
|
||||
lda #0
|
||||
sta addr+1
|
||||
asl addr
|
||||
rol addr+1
|
||||
asl addr
|
||||
rol addr+1
|
||||
asl addr
|
||||
rol addr+1
|
||||
|
||||
lda addr
|
||||
clc
|
||||
adc #<chars
|
||||
sta addr
|
||||
lda addr+1
|
||||
adc #>chars
|
||||
sta addr+1
|
||||
|
||||
ldx #8
|
||||
ldy #0
|
||||
printsign1:
|
||||
lda (addr),y
|
||||
sta LCD_DATA
|
||||
iny
|
||||
dex
|
||||
bne printsign1
|
||||
|
||||
ldx temp_x
|
||||
ldy temp_y
|
||||
rts
|
||||
.endproc
|
||||
|
1157
testcode/lib/gamate/nachtm.c
Normal file
1157
testcode/lib/gamate/nachtm.c
Normal file
File diff suppressed because it is too large
Load Diff
37
util/gamate/gamate-fixcart.c
Normal file
37
util/gamate/gamate-fixcart.c
Normal file
@ -0,0 +1,37 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
FILE *in;
|
||||
unsigned int n, i, c;
|
||||
|
||||
void usage(char *arg)
|
||||
{
|
||||
printf("usage: %s [file]\n", arg);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2) {
|
||||
usage(argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (!(in = fopen(argv[1], "r+b"))) {
|
||||
fprintf(stderr, "couldnt open: '%s'\n", argv[1]);
|
||||
exit(-1);
|
||||
}
|
||||
/* read 0x1000 bytes from 0x7000-0x7fff (offset 0x1000) */
|
||||
fseek(in, 0x1000, SEEK_SET);
|
||||
n = 0; for (i = 0; i < 0x1000; i++) {
|
||||
c = fgetc(in);
|
||||
n += c;
|
||||
}
|
||||
/* write checksum to header */
|
||||
fseek(in, 0, SEEK_SET);
|
||||
fputc(n & 0xff, in);
|
||||
fputc((n >> 8) & 0xff, in);
|
||||
|
||||
fclose(in);
|
||||
return (0);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user