Merge pull request #238 from mrdudz/gamate

Bit Corporation 'Gamate' support
This commit is contained in:
Bob Andrews 2016-02-27 18:44:26 +01:00
commit 25f4482641
49 changed files with 3897 additions and 17 deletions

View File

@ -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.

64
asminc/gamate.inc Normal file
View 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

41
cfg/gamate.cfg Normal file
View 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__;
}

159
doc/gamate.sgml Normal file
View 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>

View File

@ -146,6 +146,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.

View File

@ -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
View 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

View File

@ -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 */

View File

@ -22,6 +22,7 @@ TARGETS = apple2 \
atmos \
$(CBMS) \
$(GEOS) \
gamate \
lynx \
nes \
osic1p \

16
libsrc/gamate/_scrsize.s Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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

View 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

View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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
View 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
View 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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -79,6 +79,7 @@ typedef enum {
TGT_SIM6502,
TGT_SIM65C02,
TGT_PCENGINE,
TGT_GAMATE,
TGT_COUNT /* Number of target systems */
} target_t;

View File

@ -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;
}
}

View 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

View 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

Binary file not shown.

View 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;
}

View 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

File diff suppressed because it is too large Load Diff

View 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);
}