mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 19:29:37 +00:00
208 lines
7.5 KiB
C
208 lines
7.5 KiB
C
/*****************************************************************************/
|
|
/* */
|
|
/* 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:
|
|
*/
|
|
|
|
/* 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
|
|
|
|
#define JOY_DATA 0x4400 /* hw register to read the pad bits from */
|
|
|
|
/* Masks for joy_read */
|
|
#define JOY_UP_MASK 0x01
|
|
#define JOY_DOWN_MASK 0x02
|
|
#define JOY_LEFT_MASK 0x04
|
|
#define JOY_RIGHT_MASK 0x08
|
|
#define JOY_BTN_1_MASK 0x10
|
|
#define JOY_BTN_2_MASK 0x20
|
|
#define JOY_BTN_3_MASK 0x40
|
|
#define JOY_BTN_4_MASK 0x80
|
|
|
|
#define JOY_BTN_A_MASK JOY_BTN_1_MASK
|
|
#define JOY_BTN_B_MASk JOY_BTN_2_MASK
|
|
#define JOY_START_MASK JOY_BTN_3_MASK
|
|
#define JOY_SELECT_MASK JOY_BTN_4_MASK
|
|
|
|
#define JOY_BTN_A(v) ((v) & JOY_BTN_A_MASK)
|
|
#define JOY_BTN_B(v) ((v) & JOY_BTN_B_MASK)
|
|
#define JOY_START(v) ((v) & JOY_START_MASK)
|
|
#define JOY_SELECT(v) ((v) & JOY_SELECT_MASK)
|
|
|
|
/* The addresses of the static drivers */
|
|
extern void gamate_stdjoy_joy[]; /* Referred to by joy_static_stddrv[] */
|
|
|
|
void waitvsync (void);
|
|
/* Wait for start of next frame */
|
|
|
|
/* NOTE: all Gamate are "NTSC" */
|
|
#define get_tv() TV_NTSC
|
|
/* Return the video mode the machine is using. */
|
|
|
|
/* End of gamate.h */
|
|
#endif
|
|
|