commit
4cf7db1ef5
22 changed files with 634 additions and 0 deletions
|
@ -27,6 +27,7 @@ including
|
||||||
- the Atari 8-bit machines.
|
- the Atari 8-bit machines.
|
||||||
- the Atari 2600 console.
|
- the Atari 2600 console.
|
||||||
- the Atari 5200 console.
|
- the Atari 5200 console.
|
||||||
|
- the Atari 7800 console.
|
||||||
- GEOS for the C64, C128 and Apple //e.
|
- GEOS for the C64, C128 and Apple //e.
|
||||||
- the Bit Corporation Gamate console.
|
- the Bit Corporation Gamate console.
|
||||||
- the NEC PC-Engine (aka TurboGrafx-16) console.
|
- the NEC PC-Engine (aka TurboGrafx-16) console.
|
||||||
|
|
8
asminc/atari7800.inc
Normal file
8
asminc/atari7800.inc
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
; Atari 7800 TIA & RIOT read / write registers
|
||||||
|
;
|
||||||
|
; Karri Kaksonen (karri@sipo.fi), 2022
|
||||||
|
|
||||||
|
; TIA, RIOT & MARIA registers mapping
|
||||||
|
.include "atari7800_tia.inc"
|
||||||
|
.include "atari7800_riot.inc"
|
||||||
|
.include "atari7800_maria.inc"
|
39
asminc/atari7800_maria.inc
Normal file
39
asminc/atari7800_maria.inc
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
; Atari 7800 MARIA read / write registers
|
||||||
|
;
|
||||||
|
|
||||||
|
; Read registers
|
||||||
|
BKGRND := $20
|
||||||
|
P0C1 := $21
|
||||||
|
P0C2 := $22
|
||||||
|
P0C3 := $23
|
||||||
|
MWSYNC := $24
|
||||||
|
P1C1 := $25
|
||||||
|
P1C2 := $26
|
||||||
|
P1C3 := $27
|
||||||
|
MSTAT := $28
|
||||||
|
P2C1 := $29
|
||||||
|
P2C2 := $2A
|
||||||
|
P2C3 := $2B
|
||||||
|
DPPH := $2C
|
||||||
|
P3C1 := $2D
|
||||||
|
P3C2 := $2E
|
||||||
|
P3C3 := $2F
|
||||||
|
DPPL := $30
|
||||||
|
P4C1 := $31
|
||||||
|
P4C2 := $32
|
||||||
|
P4C3 := $33
|
||||||
|
CHBASE := $34
|
||||||
|
P5C1 := $35
|
||||||
|
P5C2 := $36
|
||||||
|
P5C3 := $37
|
||||||
|
OFFSET := $38
|
||||||
|
P6C1 := $39
|
||||||
|
P6C2 := $3A
|
||||||
|
P6C3 := $3B
|
||||||
|
CTRL := $3C
|
||||||
|
P7C1 := $3D
|
||||||
|
P7C2 := $3E
|
||||||
|
P7C3 := $3F
|
||||||
|
|
||||||
|
; Write registers
|
||||||
|
|
20
asminc/atari7800_riot.inc
Normal file
20
asminc/atari7800_riot.inc
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
; Atari 7800 RIOT read / write registers
|
||||||
|
;
|
||||||
|
; Source: DASM - vcs.h
|
||||||
|
; Details available in: Stella Programmer's Guide by Steve Wright
|
||||||
|
;
|
||||||
|
; Florent Flament (contact@florentflament.com), 2017
|
||||||
|
|
||||||
|
; Read registers
|
||||||
|
SWCHA := $0280
|
||||||
|
CTLSWA := $0281
|
||||||
|
SWCHB := $0282
|
||||||
|
CTLSWB := $0283
|
||||||
|
INTIM := $0284
|
||||||
|
TIMINT := $0285
|
||||||
|
|
||||||
|
; Write registers
|
||||||
|
TIM1T := $0294
|
||||||
|
TIM8T := $0295
|
||||||
|
TIM64T := $0296
|
||||||
|
T1024T := $0297
|
69
asminc/atari7800_tia.inc
Normal file
69
asminc/atari7800_tia.inc
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
; Atari 7800 TIA read / write registers
|
||||||
|
;
|
||||||
|
; Source: DASM - vcs.h
|
||||||
|
; Details available in: Stella Programmer's Guide by Steve Wright
|
||||||
|
;
|
||||||
|
; Florent Flament (contact@florentflament.com), 2017
|
||||||
|
|
||||||
|
; Read registers
|
||||||
|
VSYNC := $00
|
||||||
|
VBLANK := $01
|
||||||
|
WSYNC := $02
|
||||||
|
RSYNC := $03
|
||||||
|
NUSIZ0 := $04
|
||||||
|
NUSIZ1 := $05
|
||||||
|
COLUP0 := $06
|
||||||
|
COLUP1 := $07
|
||||||
|
COLUPF := $08
|
||||||
|
COLUBK := $09
|
||||||
|
CTRLPF := $0A
|
||||||
|
REFP0 := $0B
|
||||||
|
REFP1 := $0C
|
||||||
|
PF0 := $0D
|
||||||
|
PF1 := $0E
|
||||||
|
PF2 := $0F
|
||||||
|
RESP0 := $10
|
||||||
|
RESP1 := $11
|
||||||
|
RESM0 := $12
|
||||||
|
RESM1 := $13
|
||||||
|
RESBL := $14
|
||||||
|
AUDC0 := $15
|
||||||
|
AUDC1 := $16
|
||||||
|
AUDF0 := $17
|
||||||
|
AUDF1 := $18
|
||||||
|
AUDV0 := $19
|
||||||
|
AUDV1 := $1A
|
||||||
|
GRP0 := $1B
|
||||||
|
GRP1 := $1C
|
||||||
|
ENAM0 := $1D
|
||||||
|
ENAM1 := $1E
|
||||||
|
ENABL := $1F
|
||||||
|
HMP0 := $20
|
||||||
|
HMP1 := $21
|
||||||
|
HMM0 := $22
|
||||||
|
HMM1 := $23
|
||||||
|
HMBL := $24
|
||||||
|
VDELP0 := $25
|
||||||
|
VDELP1 := $26
|
||||||
|
VDELBL := $27
|
||||||
|
RESMP0 := $28
|
||||||
|
RESMP1 := $29
|
||||||
|
HMOVE := $2A
|
||||||
|
HMCLR := $2B
|
||||||
|
CXCLR := $2C
|
||||||
|
|
||||||
|
; Write registers
|
||||||
|
CXM0P := $00
|
||||||
|
CXM1P := $01
|
||||||
|
CXP0FB := $02
|
||||||
|
CXP1FB := $03
|
||||||
|
CXM0FB := $04
|
||||||
|
CXM1FB := $05
|
||||||
|
CXBLPF := $06
|
||||||
|
CXPPMM := $07
|
||||||
|
INPT0 := $08
|
||||||
|
INPT1 := $09
|
||||||
|
INPT2 := $0A
|
||||||
|
INPT3 := $0B
|
||||||
|
INPT4 := $0C
|
||||||
|
INPT5 := $0D
|
67
cfg/atari7800.cfg
Normal file
67
cfg/atari7800.cfg
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
# Atari VCS 7800 linker configuration file for cc65
|
||||||
|
# In order to add the a78 header to the build you can add
|
||||||
|
# "--force-import __EXEHDR__" to the command line
|
||||||
|
|
||||||
|
SYMBOLS {
|
||||||
|
__STACKSIZE__: type = weak, value = $0600; # C stack
|
||||||
|
__CARTSIZE__: type = weak, value = $8000;
|
||||||
|
__VEC_BOTTOM__: value = $fffa, type = export;
|
||||||
|
__VEC_SIZE__: value = $6, type = export;
|
||||||
|
__ENCRYPT_BOTTOM__: value = $ff7a, type = export;
|
||||||
|
__ENCRYPT_SIZE__: value = $80, type = export;
|
||||||
|
__MEMORY_TOP__: value = __ENCRYPT_BOTTOM__, type = export;
|
||||||
|
__INIT_SIZE__: value = 69, type = export;
|
||||||
|
__MEMORY_INIT__: value = __MEMORY_TOP__ - __INIT_SIZE__, type = export;
|
||||||
|
__MEMORY_BOTTOM__: value = $10000 - __CARTSIZE__, type = weak;
|
||||||
|
__FREE_ROM_SIZE__: value = __MEMORY_INIT__ - __MEMORY_BOTTOM__, type = export;
|
||||||
|
}
|
||||||
|
|
||||||
|
MEMORY {
|
||||||
|
ZP: file = "", define = yes, start = $0040, size = $00C0, type = rw;
|
||||||
|
SP: file = "", define = yes, start = $0140, size = $00C0, type = rw;
|
||||||
|
RAM1: file = "", define = yes, start = $1800, size = $0840, type = rw;
|
||||||
|
RAM2: file = "", define = yes, start = $2100, size = $0040, type = rw;
|
||||||
|
RAM3: file = "", define = yes, start = $2200, size = $0600, type = rw;
|
||||||
|
# For emulators you also need a header file
|
||||||
|
HEADER: file = %O, start = $0000, size = 128;
|
||||||
|
# "Normal" cartridge rom. Multiple banks arent supported
|
||||||
|
# by this script. You may change the rom size, but keep
|
||||||
|
# two things in mind:
|
||||||
|
# - start must be a multiple of $1000
|
||||||
|
# - ROM must end at $ff79
|
||||||
|
ROM: file = %O, define = yes, start = __MEMORY_BOTTOM__, size = __FREE_ROM_SIZE__, type = ro, fill = yes, fillval = $ff;
|
||||||
|
ROMS: file = %O, define = yes, start = __MEMORY_INIT__, size = __INIT_SIZE__, type = ro, fill = yes, fillval = $ff;
|
||||||
|
# Encryption stuff
|
||||||
|
ROME: file = %O, start = __ENCRYPT_BOTTOM__, size = __ENCRYPT_SIZE__, type = ro, fill = yes, fillval = $ff;
|
||||||
|
# Interrupt vectors
|
||||||
|
ROMV: file = %O, start = __VEC_BOTTOM__, size = __VEC_SIZE__, type = ro, fill = yes, fillval = $ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEGMENTS {
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
EXEHDR: load = HEADER, type = ro, optional = yes;
|
||||||
|
STARTUP: load = ROMS, type = ro, define = yes;
|
||||||
|
ONCE: load = ROMS, type = ro, define = yes;
|
||||||
|
CODE: load = ROM, type = ro, define = yes;
|
||||||
|
RODATA: load = ROM, type = ro, define = yes, align = 256;
|
||||||
|
DATA: load = ROM, run = RAM1, type = rw, define = yes;
|
||||||
|
BSS: load = RAM1, type = bss, define = yes;
|
||||||
|
VECTORS: load = ROMV, type = ro, define = yes;
|
||||||
|
ENCRYPTION: load = ROME, type = ro define = yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
FEATURES {
|
||||||
|
CONDES: type = constructor,
|
||||||
|
label = __CONSTRUCTOR_TABLE__,
|
||||||
|
count = __CONSTRUCTOR_COUNT__,
|
||||||
|
segment = ONCE;
|
||||||
|
CONDES: type = destructor,
|
||||||
|
label = __DESTRUCTOR_TABLE__,
|
||||||
|
count = __DESTRUCTOR_COUNT__,
|
||||||
|
segment = RODATA;
|
||||||
|
CONDES: type = interruptor,
|
||||||
|
label = __INTERRUPTOR_TABLE__,
|
||||||
|
count = __INTERRUPTOR_COUNT__,
|
||||||
|
segment = RODATA,
|
||||||
|
import = __CALLIRQ__;
|
||||||
|
}
|
157
doc/atari7800.sgml
Normal file
157
doc/atari7800.sgml
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
<!doctype linuxdoc system>
|
||||||
|
|
||||||
|
<article>
|
||||||
|
<title>Atari 7800 specific information for cc65
|
||||||
|
<author>
|
||||||
|
<url url="mailto:karri@sipo.fi" name="Karri Kaksonen"><newline>
|
||||||
|
|
||||||
|
<abstract>
|
||||||
|
An overview over the Atari 7800 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 Atari 7800 runtime system as it
|
||||||
|
comes with the cc65 C compiler. It describes the memory layout, Atari
|
||||||
|
7800 specific header files and any pitfalls specific to that platform.
|
||||||
|
|
||||||
|
<sect>Binary format<p>
|
||||||
|
|
||||||
|
The default binary output format generated by the linker for the Atari
|
||||||
|
7800 target is a 48K cartridge image.
|
||||||
|
|
||||||
|
<sect>A78 header<p>
|
||||||
|
|
||||||
|
There is lots of different cart hardware available for the atari7800.
|
||||||
|
Some carts have ROM, RAM, sound hardware, non-volatile high score chips.
|
||||||
|
In order to know what kind of hardware the cart build requires there is
|
||||||
|
a header file of 128 bytes in front of the binary.
|
||||||
|
|
||||||
|
The default build creates a cart file for a 48K rom cart without any
|
||||||
|
extra features like the pokey audio chip or extra RAM.
|
||||||
|
|
||||||
|
In order to make cc65 more user friendly the build will add the a78
|
||||||
|
header automatically. This allows you to run the binary on emulators
|
||||||
|
and flash carts on the real console.
|
||||||
|
|
||||||
|
<sect>Encryption<p>
|
||||||
|
|
||||||
|
In order to boot the game in a mode that supports atari7800 functions
|
||||||
|
the cart must be encrypted after the linking phase.
|
||||||
|
There is a program called sign7800 that can be used to sign the cart.
|
||||||
|
The encryption is not required for running the cart on emulators.
|
||||||
|
You can also run atari2600 games without encryption.
|
||||||
|
|
||||||
|
<sect>Memory layout<p>
|
||||||
|
|
||||||
|
cc65 generated programs with the default setup can use RAM from
|
||||||
|
from $1800 to $203f.
|
||||||
|
The 4k RAM is then mapped to zero page area.
|
||||||
|
$2040 to $20ff is visible as zero page.
|
||||||
|
After that we have a vero small RAM area that is unused.
|
||||||
|
$2100 to $213f.
|
||||||
|
Then we mirror a second block from the RAM to become the hardware stack.
|
||||||
|
This would be from $2140 to $21ff.
|
||||||
|
|
||||||
|
The C-stack starts at $2800 and it can grow down to $2200.
|
||||||
|
|
||||||
|
size of the system stack can be customized by defining the
|
||||||
|
__STACKSIZE__ linker variable.
|
||||||
|
|
||||||
|
Special locations:
|
||||||
|
|
||||||
|
<descrip>
|
||||||
|
<tag/Stack/ The C runtime stack is located at $2800 -
|
||||||
|
__STACKSIZE__ and growing downwards.
|
||||||
|
|
||||||
|
<tag/Heap/ The C heap is located at $2200 and grows upwards.
|
||||||
|
|
||||||
|
</descrip><p>
|
||||||
|
|
||||||
|
<sect>Start-up condition<p>
|
||||||
|
|
||||||
|
When powered-up, the Atari 7800 TIA registers contain random
|
||||||
|
values. During the initialization phase, the start-up code needs to
|
||||||
|
initialize the TIA registers to sound values (or else the console has
|
||||||
|
an unpredictable behavior). In this implementation, zeros are written
|
||||||
|
to all of TIA registers during the start-up phase.
|
||||||
|
|
||||||
|
Note that RIOT registers (mostly timers) are left uninitialized, as
|
||||||
|
they don't have any consequence on the console behavior.
|
||||||
|
|
||||||
|
<sect>Platform specific header files<p>
|
||||||
|
|
||||||
|
Programs containing Atari 7800 specific code may use the
|
||||||
|
<tt/atari7800.h/ header file.
|
||||||
|
|
||||||
|
The following pseudo variables declared in the <tt/atari7800.h/ header
|
||||||
|
file allow access to the Atari 7800 TIA, MARIA & RIOT chips registers.
|
||||||
|
|
||||||
|
<descrip>
|
||||||
|
|
||||||
|
<tag><tt/TIA/</tag> The <tt/TIA/ structure allows read/write access
|
||||||
|
to the Atari 7800 TIA chip registers. See the <tt/_tia.h/ header
|
||||||
|
file located in the include directory for the declaration of the
|
||||||
|
structure. Also refer to the Stella Programmer's Guide by Steve
|
||||||
|
Wright for a detailed description of the chip and its registers.
|
||||||
|
|
||||||
|
<tag><tt/RIOT/</tag> The <tt/RIOT/ structure allows read/write
|
||||||
|
access to the Atari 7800 RIOT chip registers. See the
|
||||||
|
<tt/_riot.h/ header file located in the include directory for the
|
||||||
|
declaration of the structure. Also refer to the Stella Programmer's
|
||||||
|
Guide by Steve Wright for a detailed description of the chip and its
|
||||||
|
registers.
|
||||||
|
|
||||||
|
<tag><tt/MARIA/</tag> The <tt/MARIA/ structure allows read/write
|
||||||
|
access to the Atari 7800 MARIA chip registers. See the
|
||||||
|
<tt/_maria.h/ header file located in the include directory for the
|
||||||
|
declaration of the structure.
|
||||||
|
|
||||||
|
</descrip><p>
|
||||||
|
|
||||||
|
|
||||||
|
<sect>Loadable drivers<p>
|
||||||
|
|
||||||
|
There are no drivers for the Atari 7800.
|
||||||
|
|
||||||
|
|
||||||
|
<sect>Limitations<p>
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
|
||||||
|
<sect>Other hints<p>
|
||||||
|
|
||||||
|
One may write a custom linker configuration file to tune the memory
|
||||||
|
layout of a program. See the <tt/atari7800.cfg/ file in the cfg
|
||||||
|
directory as a starting point.
|
||||||
|
|
||||||
|
|
||||||
|
<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>
|
|
@ -4763,6 +4763,7 @@ compiler, depending on the target system selected:
|
||||||
<item><tt/__APPLE2ENH__/ - Target system is <tt/apple2enh/
|
<item><tt/__APPLE2ENH__/ - Target system is <tt/apple2enh/
|
||||||
<item><tt/__ATARI2600__/ - Target system is <tt/atari2600/
|
<item><tt/__ATARI2600__/ - Target system is <tt/atari2600/
|
||||||
<item><tt/__ATARI5200__/ - Target system is <tt/atari5200/
|
<item><tt/__ATARI5200__/ - Target system is <tt/atari5200/
|
||||||
|
<item><tt/__ATARI7800__/ - Target system is <tt/atari7800/
|
||||||
<item><tt/__ATARI__/ - Target system is <tt/atari/ or <tt/atarixl/
|
<item><tt/__ATARI__/ - Target system is <tt/atari/ or <tt/atarixl/
|
||||||
<item><tt/__ATARIXL__/ - Target system is <tt/atarixl/
|
<item><tt/__ATARIXL__/ - Target system is <tt/atarixl/
|
||||||
<item><tt/__ATMOS__/ - Target system is <tt/atmos/
|
<item><tt/__ATMOS__/ - Target system is <tt/atmos/
|
||||||
|
|
|
@ -124,6 +124,9 @@
|
||||||
<tag><htmlurl url="atari5200.html" name="atari5200.html"></tag>
|
<tag><htmlurl url="atari5200.html" name="atari5200.html"></tag>
|
||||||
Topics specific to the Atari 5200 Game Console.
|
Topics specific to the Atari 5200 Game Console.
|
||||||
|
|
||||||
|
<tag><htmlurl url="atari7800.html" name="atari7800.html"></tag>
|
||||||
|
Topics specific to the Atari 7800 Game Console.
|
||||||
|
|
||||||
<tag><htmlurl url="atmos.html" name="atmos.html"></tag>
|
<tag><htmlurl url="atmos.html" name="atmos.html"></tag>
|
||||||
Topics specific to the Oric Atmos.
|
Topics specific to the Oric Atmos.
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,7 @@ Here is a description of all of the command-line options:
|
||||||
<item>apple2
|
<item>apple2
|
||||||
<item>apple2enh
|
<item>apple2enh
|
||||||
<item>atari2600
|
<item>atari2600
|
||||||
|
<item>atari7800
|
||||||
<item>atari
|
<item>atari
|
||||||
<item>atarixl
|
<item>atarixl
|
||||||
<item>atmos
|
<item>atmos
|
||||||
|
|
63
include/_maria.h
Normal file
63
include/_maria.h
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* _maria.h */
|
||||||
|
/* */
|
||||||
|
/* Atari 7800, Maria chip register hardware structures */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* 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. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MARIA registers
|
||||||
|
*/
|
||||||
|
struct __maria {
|
||||||
|
unsigned char bkgrnd;
|
||||||
|
unsigned char p0c1;
|
||||||
|
unsigned char p0c2;
|
||||||
|
unsigned char p0c3;
|
||||||
|
unsigned char wsync;
|
||||||
|
unsigned char p1c1;
|
||||||
|
unsigned char p1c2;
|
||||||
|
unsigned char p1c3;
|
||||||
|
unsigned char mstat;
|
||||||
|
unsigned char p2c1;
|
||||||
|
unsigned char p2c2;
|
||||||
|
unsigned char p2c3;
|
||||||
|
unsigned char dpph;
|
||||||
|
unsigned char p3c1;
|
||||||
|
unsigned char p3c2;
|
||||||
|
unsigned char p3c3;
|
||||||
|
unsigned char dppl;
|
||||||
|
unsigned char p4c1;
|
||||||
|
unsigned char p4c2;
|
||||||
|
unsigned char p4c3;
|
||||||
|
unsigned char chbase;
|
||||||
|
unsigned char p5c1;
|
||||||
|
unsigned char p5c2;
|
||||||
|
unsigned char p5c3;
|
||||||
|
unsigned char offset;
|
||||||
|
unsigned char p6c1;
|
||||||
|
unsigned char p6c2;
|
||||||
|
unsigned char p6c3;
|
||||||
|
unsigned char ctrl;
|
||||||
|
unsigned char p7c1;
|
||||||
|
unsigned char p7c2;
|
||||||
|
unsigned char p7c3;
|
||||||
|
};
|
65
include/atari7800.h
Normal file
65
include/atari7800.h
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Atari VCS 7800 TIA & RIOT registers addresses */
|
||||||
|
/* */
|
||||||
|
/* Karri Kaksonen (karri@sipo.fi), 2022 */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _ATARI7800_H
|
||||||
|
#define _ATARI7800_H
|
||||||
|
|
||||||
|
/* Check for errors */
|
||||||
|
#if !defined(__ATARI7800__)
|
||||||
|
# error This module may only be used when compiling for the Atari 7800!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Color defines */
|
||||||
|
#define COLOR_BLACK 0x00
|
||||||
|
#define COLOR_GREY 0x01
|
||||||
|
#define COLOR_LIGHTGREY 0x02
|
||||||
|
#define COLOR_WHITE 0x03
|
||||||
|
|
||||||
|
/* TGI color defines (default palette) */
|
||||||
|
#define TGI_COLOR_BLACK COLOR_BLACK
|
||||||
|
#define TGI_COLOR_GREY COLOR_GREY
|
||||||
|
#define TGI_COLOR_LIGHTGREY COLOR_LIGHTGREY
|
||||||
|
#define TGI_COLOR_WHITE COLOR_WHITE
|
||||||
|
|
||||||
|
/* Masks for joy_read */
|
||||||
|
#define JOY_RIGHT_MASK 0x80
|
||||||
|
#define JOY_LEFT_MASK 0x40
|
||||||
|
#define JOY_DOWN_MASK 0x20
|
||||||
|
#define JOY_UP_MASK 0x10
|
||||||
|
#define JOY_BTN_1_MASK 0x01
|
||||||
|
#define JOY_BTN_2_MASK 0x02
|
||||||
|
|
||||||
|
#define JOY_BTN_A_MASK JOY_BTN_1_MASK
|
||||||
|
#define JOY_BTN_B_MASK JOY_BTN_2_MASK
|
||||||
|
|
||||||
|
#define JOY_BTN_A(v) ((v) & JOY_BTN_A_MASK)
|
||||||
|
#define JOY_BTN_B(v) ((v) & JOY_BTN_B_MASK)
|
||||||
|
|
||||||
|
/* No support for dynamically loadable drivers */
|
||||||
|
#define DYN_DRV 0
|
||||||
|
|
||||||
|
#include <_tia.h>
|
||||||
|
#define TIA (*(struct __tia*)0x0000)
|
||||||
|
|
||||||
|
#include <_riot.h>
|
||||||
|
#define RIOT (*(struct __riot*)0x0280)
|
||||||
|
|
||||||
|
#include <_maria.h>
|
||||||
|
#define MARIA (*(struct __maria*)0x0020)
|
||||||
|
|
||||||
|
/* End of atari7800.h */
|
||||||
|
#endif
|
|
@ -43,6 +43,8 @@
|
||||||
# include <atari2600.h>
|
# include <atari2600.h>
|
||||||
#elif defined(__ATARI5200__)
|
#elif defined(__ATARI5200__)
|
||||||
# include <atari5200.h>
|
# include <atari5200.h>
|
||||||
|
#elif defined(__ATARI7800__)
|
||||||
|
# include <atari7800.h>
|
||||||
#elif defined(__ATMOS__)
|
#elif defined(__ATMOS__)
|
||||||
# include <atmos.h>
|
# include <atmos.h>
|
||||||
#elif defined(__CBM__)
|
#elif defined(__CBM__)
|
||||||
|
|
|
@ -21,6 +21,7 @@ TARGETS = apple2 \
|
||||||
atarixl \
|
atarixl \
|
||||||
atari2600 \
|
atari2600 \
|
||||||
atari5200 \
|
atari5200 \
|
||||||
|
atari7800 \
|
||||||
atmos \
|
atmos \
|
||||||
creativision \
|
creativision \
|
||||||
$(CBMS) \
|
$(CBMS) \
|
||||||
|
|
71
libsrc/atari7800/crt0.s
Normal file
71
libsrc/atari7800/crt0.s
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
.export _zonecounter
|
||||||
|
.export __STARTUP__ : absolute = 1
|
||||||
|
.export _exit
|
||||||
|
.import __ROM_START__
|
||||||
|
.import __RAM3_START__, __RAM3_SIZE__
|
||||||
|
.import initlib, donelib
|
||||||
|
.import zerobss, copydata
|
||||||
|
.import push0, _main
|
||||||
|
.include "zeropage.inc"
|
||||||
|
|
||||||
|
INPTCTRL = $01
|
||||||
|
OFFSET = $38
|
||||||
|
CTRL = $3c
|
||||||
|
|
||||||
|
.segment "STARTUP"
|
||||||
|
start:
|
||||||
|
; Startup sequence recommended by Atari.
|
||||||
|
; See the 7800 standards document.
|
||||||
|
sei ; Initialize 6502
|
||||||
|
cld
|
||||||
|
lda #$07 ; Lock machine in 7800 mode
|
||||||
|
sta INPTCTRL
|
||||||
|
lda #$7f ; DMA off
|
||||||
|
sta CTRL
|
||||||
|
ldx #0 ; OFFSET must always be 0
|
||||||
|
stx OFFSET
|
||||||
|
stx INPTCTRL ; Make sure joysticks don't freeze
|
||||||
|
dex ; Stack pointer = $ff
|
||||||
|
txs
|
||||||
|
|
||||||
|
; Set up parameter stack
|
||||||
|
lda #<(__RAM3_START__ + __RAM3_SIZE__)
|
||||||
|
sta sp
|
||||||
|
lda #>(__RAM3_START__ + __RAM3_SIZE__)
|
||||||
|
sta sp+1
|
||||||
|
|
||||||
|
jsr copydata
|
||||||
|
jsr zerobss
|
||||||
|
jsr initlib
|
||||||
|
|
||||||
|
; Call main program (pass empty command line)
|
||||||
|
jsr push0 ; argc
|
||||||
|
jsr push0 ; argv
|
||||||
|
ldy #4 ; Argument size
|
||||||
|
jsr _main
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
jsr donelib
|
||||||
|
jmp start
|
||||||
|
|
||||||
|
NMIHandler:
|
||||||
|
inc _zonecounter
|
||||||
|
rti
|
||||||
|
|
||||||
|
IRQHandler:
|
||||||
|
rti
|
||||||
|
|
||||||
|
.segment "DATA"
|
||||||
|
_zonecounter:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
.segment "ENCRYPTION"
|
||||||
|
.res 126, $ff ; Reserved for encryption
|
||||||
|
Lfff8: .byte $ff ; Region verification (always $ff)
|
||||||
|
Lfff9: .byte $f7 ; Use last 4096 bytes only for encryption
|
||||||
|
;;;Lfff9: .byte <(((__ROM_START__/4096)<<4) | 7)
|
||||||
|
|
||||||
|
.segment "VECTORS"
|
||||||
|
.word NMIHandler
|
||||||
|
.word start
|
||||||
|
.word IRQHandler
|
5
libsrc/atari7800/ctype.s
Normal file
5
libsrc/atari7800/ctype.s
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
; Character specification table.
|
||||||
|
;
|
||||||
|
; uses the "common" definition
|
||||||
|
|
||||||
|
.include "ctype_common.inc"
|
46
libsrc/atari7800/exehdr.s
Normal file
46
libsrc/atari7800/exehdr.s
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
;
|
||||||
|
; Karri Kaksonen, 2022
|
||||||
|
;
|
||||||
|
; This header contains data for emulators
|
||||||
|
;
|
||||||
|
.export __EXEHDR__: absolute = 1
|
||||||
|
.import __CARTSIZE__
|
||||||
|
; ------------------------------------------------------------------------
|
||||||
|
; EXE header
|
||||||
|
.segment "EXEHDR"
|
||||||
|
.byte 3 ; version
|
||||||
|
.byte 'A','T','A','R','I','7','8','0','0',' ',' ',' ',' ',' ',' ',' '
|
||||||
|
.byte 'G','a','m','e',' ','n','a','m','e',0,0,0,0,0,0,0
|
||||||
|
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
.byte 0,0,>__CARTSIZE__,0 ; Set the cart size in the cfg file
|
||||||
|
; bit 0 - pokey at 4000
|
||||||
|
; bit 1 - supergame bank switched
|
||||||
|
; bit 2 - supergame ram at $4000
|
||||||
|
; bit 3 - rom at $4000
|
||||||
|
; bit 4 - bank 6 at $4000
|
||||||
|
; bit 5 - supergame banked ram
|
||||||
|
; bit 6 - pokey at $450
|
||||||
|
; bit 7 - mirror ram at $4000
|
||||||
|
; bit 8 - activision banking
|
||||||
|
; bit 9 - absolute banking
|
||||||
|
; bit 10 - pokey at $440
|
||||||
|
; bit 11 - ym2151 at $461/462
|
||||||
|
; bit 12 - souper
|
||||||
|
; bit 13-15 - Special
|
||||||
|
; 0 = Normal cart
|
||||||
|
.byte 0,0 ; 0 = Normal cart
|
||||||
|
.byte 1 ; 1 = Joystick, 2 = lightgun
|
||||||
|
.byte 0 ; No joystick 2
|
||||||
|
.byte 0 ; bit0 = 0:NTSC,1:PAL bit1 = 0:component,1:composite
|
||||||
|
.byte 0 ; Save data peripheral - 1 byte (version 2)
|
||||||
|
; 0 = None / unknown (default)
|
||||||
|
; 1 = High Score Cart (HSC)
|
||||||
|
; 2 = SaveKey
|
||||||
|
|
||||||
|
.byte 0 ; 63 Expansion module
|
||||||
|
; 0 = No expansion module (default on all currently released games)
|
||||||
|
; 1 = Expansion module required
|
||||||
|
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
.byte 0,0,0,0,0,0,0,0
|
||||||
|
.byte 'A','C','T','U','A','L',' ','C','A','R','T',' ','D','A','T','A',' ','S','T','A','R','T','S',' ','H','E','R','E'
|
|
@ -212,6 +212,10 @@ static void SetSys (const char* Sys)
|
||||||
NewSymbol ("__ATARI5200__", 1);
|
NewSymbol ("__ATARI5200__", 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TGT_ATARI7800:
|
||||||
|
NewSymbol ("__ATARI7800__", 1);
|
||||||
|
break;
|
||||||
|
|
||||||
case TGT_ATARI:
|
case TGT_ATARI:
|
||||||
NewSymbol ("__ATARI__", 1);
|
NewSymbol ("__ATARI__", 1);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -173,6 +173,10 @@ static void SetSys (const char* Sys)
|
||||||
DefineNumericMacro ("__ATARI5200__", 1);
|
DefineNumericMacro ("__ATARI5200__", 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TGT_ATARI7800:
|
||||||
|
DefineNumericMacro ("__ATARI7800__", 1);
|
||||||
|
break;
|
||||||
|
|
||||||
case TGT_ATARI:
|
case TGT_ATARI:
|
||||||
DefineNumericMacro ("__ATARI__", 1);
|
DefineNumericMacro ("__ATARI__", 1);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -147,6 +147,7 @@ static const TargetEntry TargetMap[] = {
|
||||||
{ "atari", TGT_ATARI },
|
{ "atari", TGT_ATARI },
|
||||||
{ "atari2600", TGT_ATARI2600 },
|
{ "atari2600", TGT_ATARI2600 },
|
||||||
{ "atari5200", TGT_ATARI5200 },
|
{ "atari5200", TGT_ATARI5200 },
|
||||||
|
{ "atari7800", TGT_ATARI7800 },
|
||||||
{ "atarixl", TGT_ATARIXL },
|
{ "atarixl", TGT_ATARIXL },
|
||||||
{ "atmos", TGT_ATMOS },
|
{ "atmos", TGT_ATMOS },
|
||||||
{ "bbc", TGT_BBC },
|
{ "bbc", TGT_BBC },
|
||||||
|
@ -188,6 +189,7 @@ static const TargetProperties PropertyTable[TGT_COUNT] = {
|
||||||
{ "atari", CPU_6502, BINFMT_BINARY, CTAtari },
|
{ "atari", CPU_6502, BINFMT_BINARY, CTAtari },
|
||||||
{ "atari2600", CPU_6502, BINFMT_BINARY, CTNone },
|
{ "atari2600", CPU_6502, BINFMT_BINARY, CTNone },
|
||||||
{ "atari5200", CPU_6502, BINFMT_BINARY, CTAtari },
|
{ "atari5200", CPU_6502, BINFMT_BINARY, CTAtari },
|
||||||
|
{ "atari7800", CPU_6502, BINFMT_BINARY, CTNone },
|
||||||
{ "atarixl", CPU_6502, BINFMT_BINARY, CTAtari },
|
{ "atarixl", CPU_6502, BINFMT_BINARY, CTAtari },
|
||||||
{ "vic20", CPU_6502, BINFMT_BINARY, CTPET },
|
{ "vic20", CPU_6502, BINFMT_BINARY, CTPET },
|
||||||
{ "c16", CPU_6502, BINFMT_BINARY, CTPET },
|
{ "c16", CPU_6502, BINFMT_BINARY, CTPET },
|
||||||
|
|
|
@ -57,6 +57,7 @@ typedef enum {
|
||||||
TGT_ATARI,
|
TGT_ATARI,
|
||||||
TGT_ATARI2600,
|
TGT_ATARI2600,
|
||||||
TGT_ATARI5200,
|
TGT_ATARI5200,
|
||||||
|
TGT_ATARI7800,
|
||||||
TGT_ATARIXL,
|
TGT_ATARIXL,
|
||||||
TGT_VIC20,
|
TGT_VIC20,
|
||||||
TGT_C16,
|
TGT_C16,
|
||||||
|
|
|
@ -673,6 +673,9 @@ EXELIST_atari2600 = \
|
||||||
EXELIST_atari5200 = \
|
EXELIST_atari5200 = \
|
||||||
minimal
|
minimal
|
||||||
|
|
||||||
|
EXELIST_atari7800 = \
|
||||||
|
minimal
|
||||||
|
|
||||||
EXELIST_gamate = \
|
EXELIST_gamate = \
|
||||||
minimal
|
minimal
|
||||||
|
|
||||||
|
@ -728,6 +731,7 @@ TARGETS := \
|
||||||
atarixl \
|
atarixl \
|
||||||
atari2600 \
|
atari2600 \
|
||||||
atari5200 \
|
atari5200 \
|
||||||
|
atari7800 \
|
||||||
atmos \
|
atmos \
|
||||||
bbc \
|
bbc \
|
||||||
c128 \
|
c128 \
|
||||||
|
|
Loading…
Add table
Reference in a new issue