initial import of the gamate stuff

This commit is contained in:
mrdudz 2015-11-14 13:15:29 +01:00
parent b6f429f934
commit 60285097e3
18 changed files with 1112 additions and 0 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 Supervision console.

43
asminc/gamate.inc Normal file
View File

@ -0,0 +1,43 @@
; gamate symbols
.p02
LCD_WIDTH = 160
LCD_HEIGHT = 152
lcd_base = $5000
lcd_mode = $5001
lcd_mode_y_increment = $40
lcd_x_pos = $5002
lcd_x_pos_plane2_flag =$80
lcd_y_pos = $5003
lcd_x = $5004
lcd_y = $5005
lcd_read = $5006
lcd_data = $5007
audio_base =$4000
controls = $4400
; active low
up=1
down=2
left=4
right=8
button_a=$10
button_b=$20
start=$40
select=$80
cart_main = $6020
;cart_nmi = $6023
cart_irq = $6026 ; 135 hz
cart_font = $6029
nmi_enable = $c
nmi_4800 = $a
_f009 = $f009 ; wait 1/60s
_f00c = $f00c ; install font
_f012 = $f012 ; write screen

32
cfg/gamate.cfg Normal file
View File

@ -0,0 +1,32 @@
# c version of 32kbyte config file
# .data located in rom
# ld65 config file
# ld65 --config gamate.cfg -o <prog>.bin <prog>.o
MEMORY {
ZP: start = $0000, size = $100;
CPUSTACK: start = $0100, size =$100;
RAM: start = $0200, size = $200, define = yes;
# ROM: start = $6000, size = $8000, fill = yes, fillval = $ff, file = %O, define = yes;
ROM: start = $6000, size = $8000, fill = yes, fillval = $00, file = %O, define = yes;
}
SEGMENTS {
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;
ZEROPAGE: load = ZP, type = zp, 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__;
}

154
doc/gamate.sgml Normal file
View File

@ -0,0 +1,154 @@
<!doctype linuxdoc system>
<article>
<title>Gamate System specific information for cc65
<author>
<url url="mailto:groepaz@gmx.net" name="Groepaz/Hitmen">
<date>2015-11-14
<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.
<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>interruptor support in crt0 (and cfg) is missing
</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>a good emulator to use for Gamate is "MESS/MAME" (<url url="http://www.mess.org/">)
</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

@ -140,6 +140,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__)

43
include/gamate.h Normal file
View File

@ -0,0 +1,43 @@
/*****************************************************************************/
/* */
/* gamate.h */
/* */
/* Gamate system specific definitions */
/* */
/* */
/* */
/* (C) 2015 Groepaz/Hitmen */
/* */
/* */
/* 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
/* 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 60 /* POSIX */ /* FIXME */
# define CLOCKS_PER_SEC 60 /* 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 \

1
libsrc/gamate/crt0.s Normal file
View File

@ -0,0 +1 @@

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

@ -0,0 +1 @@

View File

@ -0,0 +1,434 @@
.include "gamate.inc"
.zeropage
addr: .word 0
psa: .word 0
.word 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0 ; get out of sensitiv area
readaddr: .word 0
editbuffer1: .byte 0,0,0,0, 0,0,0,0 ;0,1,2,3,4,5,6,7
writeaddr: .word 0
editbuffer2: .byte 0,0,0,0, 0,0,0,0 ;8,9,$a,$b,$c,$d,$e,$f
cursor: .byte 0
controlslast: .byte 0
controlsedge: .byte 0
.data
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
.code
checksum: .word 0
.byte 1,0,1
.byte "COPYRIGHT BIT CORPORATION", 0, $ff
jmp reset
jmp nmi
jmp irq
chars:
.incbin "cga2.chr"
hex2asc: .byte "0123456789abcdef"
.proc nmi
inc nmi_count
rts
.endproc
.proc irq
inc irq_count
rts
.endproc
.proc reset
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_x_pos
sta lcd_y_pos
sta irq_count
sta cursor
lda #1
sta nmi_count
cli
lda #lcd_mode_y_increment
sta lcd_mode
jsr printy
lda #1
sta nmi_enable
loop:
lda irq_count
loop1:
cmp irq_count
beq loop1
lda irq_count
and #7
bne loop1
lda #lcd_mode_y_increment
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_y_increment
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 controls
and controlslast
eor #$ff
sta controlsedge
and #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 #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 #left
bne notleft
lda cursor
beq notleft
dec cursor
notleft:lda controlsedge
and #right
bne notright
lda cursor
cmp #40
beq notright
inc cursor
notright:lda controlsedge
and #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 #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 #button_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 #button_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 controls
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,383 @@
.include "gamate.inc"
.zeropage
addr: .word 0
psa: .word 0
.data
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
.code
checksum: .word 0
.byte 1,0,1
.byte "COPYRIGHT BIT CORPORATION", 0, $ff
jmp reset
jmp nmi
jmp irq
chars:
.incbin "cga2.chr"
hex2asc: .byte "0123456789abcdef"
format: .byte "IrqNmiCountXposYpos", 0
xdesc: .byte "0123456789abcdefghijklmnopqrstuv", 0
ydesc: .byte "0123456789ABCDEFGHIJKLMNOPQRSTUV", 0
.proc nmi
inc nmi_count
rts
.endproc
.proc irq
inc irq_count
lda count
sta counted
lda count+1
sta counted+1
lda #0
sta count
sta count+1
rts
.endproc
.proc reset
lda #0
sta lcd_x_pos
sta lcd_y_pos
cli
lda #lcd_mode_y_increment
sta lcd_mode
lda #0
sta lcd_x
lda #<xdesc
ldx #>xdesc
ldy #0
jsr printstring
lda #lcd_x_pos_plane2_flag
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 #$90;(lcd_x_pos_plane2_flag|(128/8))
lda #(lcd_x_pos_plane2_flag|(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_x_pos_plane2_flag|(48/8)
sta lcd_x
lda #48
sta lcd_y
lda #'x'
jsr printsign
lda #$80
sta lcd_mode
lda #(lcd_x_pos_plane2_flag|(56/8))
sta lcd_x
lda #56
sta lcd_y
lda #'y'
jsr printsign
lda #$c0
sta lcd_mode
lda #(lcd_x_pos_plane2_flag|(64/8))
sta lcd_x
lda #64
sta lcd_y
lda #'z'
jsr printsign
lda #lcd_mode_y_increment|1
sta lcd_mode
lda #16/8
sta lcd_x
lda #72
sta lcd_y
lda #'V'
jsr printsign
lda #lcd_mode_y_increment|2
sta lcd_mode
lda #24/8
sta lcd_x
lda #72
sta lcd_y
lda #'V'
jsr printsign
lda #lcd_mode_y_increment|4
sta lcd_mode
lda #32/8
sta lcd_x
lda #72
sta lcd_y
lda #'V'
jsr printsign
lda #lcd_mode_y_increment|8
sta lcd_mode
lda #40/8
sta lcd_x
lda #72
sta lcd_y
lda #'V'
jsr printsign
lda #1
sta nmi_enable
loop: lda count
clc
adc #1
sta count
lda count+1
adc #1
sta count+1
lda irq_count
cmp irq_count
beq loop
jsr inputs
lda #lcd_mode_y_increment
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 controls
and #up
bne notup
dec ypos
lda ypos
sta lcd_y_pos
notup:lda controls
and #down
bne notdown
inc ypos
lda ypos
sta lcd_y_pos
notdown:lda controls
and #left
bne notleft
dec xpos
lda xpos
sta lcd_x_pos
notleft:lda controls
and #right
bne notright
inc xpos
lda xpos
sta lcd_x_pos
notright:lda controls
and #start
bne notstart
notstart:lda controls
and #select
bne notselect
notselect:lda controls
and #button_a
bne notbuttona
notbuttona:lda controls
and #button_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