mirror of
https://github.com/cc65/cc65.git
synced 2024-12-27 00:29:31 +00:00
Added Atari Lynx versions of three sample programs.
The Lynx target can't build the usual versions because its library doesn't have conio output and stdio.
This commit is contained in:
parent
266f35ee37
commit
9f2d27d9c1
@ -154,7 +154,7 @@ endif
|
|||||||
# Lists of subdirectories
|
# Lists of subdirectories
|
||||||
|
|
||||||
# disasm depends on cpp
|
# disasm depends on cpp
|
||||||
DIRLIST = tutorial geos atari2600 atari5200 apple2 gamate supervision sym1 cbm
|
DIRLIST = tutorial geos atari2600 atari5200 apple2 gamate lynx supervision sym1 cbm
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# Lists of executables
|
# Lists of executables
|
||||||
|
59
samples/lynx/Makefile
Normal file
59
samples/lynx/Makefile
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
|
||||||
|
# Run 'make SYS=<target>'; or, set a SYS env.
|
||||||
|
# var. to build for another target system.
|
||||||
|
SYS ?= lynx
|
||||||
|
|
||||||
|
# Just the usual way to find out if we're
|
||||||
|
# using cmd.exe to execute make rules.
|
||||||
|
ifneq ($(shell echo),)
|
||||||
|
CMD_EXE = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef CMD_EXE
|
||||||
|
NULLDEV = nul:
|
||||||
|
DEL = -del /f
|
||||||
|
else
|
||||||
|
NULLDEV = /dev/null
|
||||||
|
DEL = $(RM)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef CC65_HOME
|
||||||
|
AS = $(CC65_HOME)/bin/ca65
|
||||||
|
CC = $(CC65_HOME)/bin/cc65
|
||||||
|
CL = $(CC65_HOME)/bin/cl65
|
||||||
|
LD = $(CC65_HOME)/bin/ld65
|
||||||
|
else
|
||||||
|
AS := $(if $(wildcard ../../bin/ca65*),../../bin/ca65,ca65)
|
||||||
|
CC := $(if $(wildcard ../../bin/cc65*),../../bin/cc65,cc65)
|
||||||
|
CL := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65)
|
||||||
|
LD := $(if $(wildcard ../../bin/ld65*),../../bin/ld65,ld65)
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXELIST_lynx = \
|
||||||
|
hello.lnx \
|
||||||
|
mandelbrot.lnx \
|
||||||
|
tgidemo.lnx
|
||||||
|
|
||||||
|
.PHONY: samples clean
|
||||||
|
|
||||||
|
ifneq ($(EXELIST_$(SYS)),)
|
||||||
|
samples: $(EXELIST_$(SYS))
|
||||||
|
else
|
||||||
|
samples:
|
||||||
|
# recipe used to skip systems that will not work with any program in this dir
|
||||||
|
ifeq ($(MAKELEVEL),0)
|
||||||
|
@echo "info: Lynx tests not available for" $(SYS)
|
||||||
|
else
|
||||||
|
# Suppress the "nothing to be done for 'samples' message.
|
||||||
|
@echo "" > $(NULLDEV)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .lnx
|
||||||
|
|
||||||
|
%.lnx : %.c
|
||||||
|
$(CL) -t $(SYS) -Oris -m $*.map -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@$(DEL) *.o *.map *.lnx 2>$(NULLDEV)
|
43
samples/lynx/hello.c
Normal file
43
samples/lynx/hello.c
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/* Atari Lynx version of samples/hello.c, using TGI instead of conio */
|
||||||
|
|
||||||
|
#include <tgi.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static const char Text[] = "Hello world!";
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
{
|
||||||
|
unsigned int XMax, YMax;
|
||||||
|
|
||||||
|
tgi_install (tgi_static_stddrv);
|
||||||
|
tgi_init ();
|
||||||
|
|
||||||
|
/* Set screen color. */
|
||||||
|
tgi_setcolor (TGI_COLOR_WHITE);
|
||||||
|
|
||||||
|
/* Clear the screen. */
|
||||||
|
tgi_clear();
|
||||||
|
|
||||||
|
/* Ask for the screen size. */
|
||||||
|
XMax = tgi_getmaxx ();
|
||||||
|
YMax = tgi_getmaxy ();
|
||||||
|
|
||||||
|
/* Draw a frame around the screen. */
|
||||||
|
tgi_line (0, 0, XMax, 0);
|
||||||
|
tgi_lineto (XMax, YMax);
|
||||||
|
tgi_lineto (0, YMax);
|
||||||
|
tgi_lineto (0, 0);
|
||||||
|
|
||||||
|
/* Write the greeting in the middle of the screen. */
|
||||||
|
tgi_outtextxy ((tgi_getxres () - tgi_gettextwidth (Text)) / 2,
|
||||||
|
(tgi_getyres () - tgi_gettextheight (Text)) / 2, Text);
|
||||||
|
}
|
86
samples/lynx/mandelbrot.c
Normal file
86
samples/lynx/mandelbrot.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*****************************************************************************\
|
||||||
|
** mandelbrot sample program for Atari Lynx **
|
||||||
|
** **
|
||||||
|
** (w) 2002 by groepaz/hitmen, TGI support by Stefan Haubenthal **
|
||||||
|
\*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <tgi.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Graphics definitions */
|
||||||
|
#define SCREEN_X (tgi_getxres())
|
||||||
|
#define SCREEN_Y (tgi_getyres())
|
||||||
|
#define MAXCOL (tgi_getcolorcount())
|
||||||
|
|
||||||
|
#define maxiterations 32
|
||||||
|
#define fpshift (10)
|
||||||
|
#define tofp(_x) ((_x)<<fpshift)
|
||||||
|
#define fromfp(_x) ((_x)>>fpshift)
|
||||||
|
#define fpabs(_x) (abs(_x))
|
||||||
|
|
||||||
|
#define mulfp(_a,_b) ((((signed long)_a)*(_b))>>fpshift)
|
||||||
|
#define divfp(_a,_b) ((((signed long)_a)<<fpshift)/(_b))
|
||||||
|
|
||||||
|
/* Use static local variables for speed */
|
||||||
|
#pragma static-locals (1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void mandelbrot (signed short x1, signed short y1, signed short x2,
|
||||||
|
signed short y2)
|
||||||
|
{
|
||||||
|
/* */
|
||||||
|
register signed short r, r1, i;
|
||||||
|
register signed short xs, ys, xx, yy;
|
||||||
|
register signed short x, y;
|
||||||
|
register unsigned char count;
|
||||||
|
register unsigned char maxcol = MAXCOL;
|
||||||
|
|
||||||
|
/* Calc stepwidth */
|
||||||
|
xs = ((x2 - x1) / (SCREEN_X));
|
||||||
|
ys = ((y2 - y1) / (SCREEN_Y));
|
||||||
|
|
||||||
|
yy = y1;
|
||||||
|
for (y = 0; y < (SCREEN_Y); y++) {
|
||||||
|
yy += ys;
|
||||||
|
xx = x1;
|
||||||
|
for (x = 0; x < (SCREEN_X); x++) {
|
||||||
|
xx += xs;
|
||||||
|
/* Do iterations */
|
||||||
|
r = 0;
|
||||||
|
i = 0;
|
||||||
|
for (count = 0; (count < maxiterations) &&
|
||||||
|
(fpabs (r) < tofp (2)) && (fpabs (i) < tofp (2));
|
||||||
|
++count) {
|
||||||
|
r1 = (mulfp (r, r) - mulfp (i, i)) + xx;
|
||||||
|
/* i = (mulfp(mulfp(r,i),tofp(2)))+yy; */
|
||||||
|
i = (((signed long) r * i) >> (fpshift - 1)) + yy;
|
||||||
|
r = r1;
|
||||||
|
}
|
||||||
|
if (count == maxiterations) {
|
||||||
|
tgi_setcolor (0);
|
||||||
|
} else {
|
||||||
|
tgi_setcolor (count % maxcol);
|
||||||
|
}
|
||||||
|
/* Set pixel */
|
||||||
|
tgi_setpixel (x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
{
|
||||||
|
/* Install the graphics driver */
|
||||||
|
tgi_install (tgi_static_stddrv);
|
||||||
|
|
||||||
|
/* Initialize graphics */
|
||||||
|
tgi_init ();
|
||||||
|
tgi_clear ();
|
||||||
|
|
||||||
|
/* Calc mandelbrot set */
|
||||||
|
mandelbrot (tofp (-2), tofp (-2), tofp (2), tofp (2));
|
||||||
|
}
|
179
samples/lynx/tgidemo.c
Normal file
179
samples/lynx/tgidemo.c
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/* Tgidemo modified for the Atari Lynx.
|
||||||
|
**
|
||||||
|
** Press any of the Lynx's option buttons to go to the next screen.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cc65.h>
|
||||||
|
#include <conio.h>
|
||||||
|
#include <tgi.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define COLOR_BACK TGI_COLOR_BLACK
|
||||||
|
#define COLOR_FORE TGI_COLOR_WHITE
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Driver stuff */
|
||||||
|
static unsigned MaxX;
|
||||||
|
static unsigned MaxY;
|
||||||
|
static unsigned AspectRatio;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* The Lynx draws too fast. This function delays
|
||||||
|
** the drawing so that we can watch it.
|
||||||
|
*/
|
||||||
|
static void wait (unsigned char ticks)
|
||||||
|
{
|
||||||
|
clock_t T = clock () + ticks;
|
||||||
|
|
||||||
|
while (clock () < T) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void DoCircles (void)
|
||||||
|
{
|
||||||
|
unsigned char I;
|
||||||
|
unsigned char Color = COLOR_BACK;
|
||||||
|
const unsigned X = MaxX / 2;
|
||||||
|
const unsigned Y = MaxY / 2;
|
||||||
|
const unsigned Limit = (X < Y) ? Y : X;
|
||||||
|
|
||||||
|
tgi_setcolor (COLOR_FORE);
|
||||||
|
tgi_clear ();
|
||||||
|
|
||||||
|
tgi_line (0, 0, MaxX, MaxY);
|
||||||
|
tgi_line (0, MaxY, MaxX, 0);
|
||||||
|
while (!kbhit ()) {
|
||||||
|
Color = (Color == COLOR_FORE) ? COLOR_BACK : COLOR_FORE;
|
||||||
|
tgi_setcolor (Color);
|
||||||
|
for (I = 10; I <= Limit; I += 10) {
|
||||||
|
tgi_ellipse (X, Y, I, tgi_imulround (I, AspectRatio));
|
||||||
|
wait (9);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cgetc ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void DoCheckerboard (void)
|
||||||
|
{
|
||||||
|
unsigned X, Y;
|
||||||
|
unsigned char Color = COLOR_BACK;
|
||||||
|
|
||||||
|
tgi_clear ();
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
for (Y = 0; Y <= MaxY - 2; Y += 10) {
|
||||||
|
for (X = 0; X <= MaxX; X += 10) {
|
||||||
|
Color = (Color == COLOR_FORE) ? COLOR_BACK : COLOR_FORE;
|
||||||
|
tgi_setcolor (Color);
|
||||||
|
tgi_bar (X, Y, X+9, Y+9);
|
||||||
|
if (kbhit ()) {
|
||||||
|
cgetc ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wait (1);
|
||||||
|
}
|
||||||
|
Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
|
||||||
|
}
|
||||||
|
Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void DoDiagram (void)
|
||||||
|
{
|
||||||
|
int XOrigin, YOrigin;
|
||||||
|
int Amp;
|
||||||
|
int X, Y;
|
||||||
|
unsigned I;
|
||||||
|
|
||||||
|
tgi_setcolor (COLOR_FORE);
|
||||||
|
tgi_clear ();
|
||||||
|
|
||||||
|
/* Determine zero and amplitude */
|
||||||
|
YOrigin = MaxY / 2;
|
||||||
|
XOrigin = 10;
|
||||||
|
Amp = (MaxY - 19) / 2;
|
||||||
|
|
||||||
|
/* Y axis */
|
||||||
|
tgi_line (XOrigin, 10, XOrigin, MaxY-10);
|
||||||
|
tgi_line (XOrigin-2, 12, XOrigin, 10);
|
||||||
|
tgi_lineto (XOrigin+2, 12);
|
||||||
|
|
||||||
|
/* X axis */
|
||||||
|
tgi_line (XOrigin, YOrigin, MaxX-10, YOrigin);
|
||||||
|
tgi_line (MaxX-12, YOrigin-2, MaxX-10, YOrigin);
|
||||||
|
tgi_lineto (MaxX-12, YOrigin+2);
|
||||||
|
|
||||||
|
/* Sine */
|
||||||
|
tgi_gotoxy (XOrigin, YOrigin);
|
||||||
|
for (I = 0; I <= 360; ++I) {
|
||||||
|
/* Calculate the next points */
|
||||||
|
X = (int)(((long)(MaxX - 19) * I) / 360);
|
||||||
|
Y = (int)(((long)Amp * -_sin (I)) / 256);
|
||||||
|
|
||||||
|
/* Draw the line */
|
||||||
|
tgi_lineto (XOrigin + X, YOrigin + Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
cgetc ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void DoLines (void)
|
||||||
|
{
|
||||||
|
unsigned X;
|
||||||
|
const unsigned Min = (MaxX < MaxY) ? MaxX : MaxY;
|
||||||
|
|
||||||
|
tgi_setcolor (COLOR_FORE);
|
||||||
|
tgi_clear ();
|
||||||
|
|
||||||
|
for (X = 0; X <= Min; X += 10) {
|
||||||
|
tgi_line (0, 0, Min, X);
|
||||||
|
tgi_line (0, 0, X, Min);
|
||||||
|
tgi_line (Min, Min, 0, Min-X);
|
||||||
|
tgi_line (Min, Min, Min-X, 0);
|
||||||
|
wait (9);
|
||||||
|
}
|
||||||
|
|
||||||
|
cgetc ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
{
|
||||||
|
/* Install the driver */
|
||||||
|
tgi_install (tgi_static_stddrv);
|
||||||
|
tgi_init ();
|
||||||
|
|
||||||
|
/* Get stuff from the driver */
|
||||||
|
MaxX = tgi_getmaxx ();
|
||||||
|
MaxY = tgi_getmaxy ();
|
||||||
|
AspectRatio = tgi_getaspectratio ();
|
||||||
|
|
||||||
|
/* Do graphics stuff */
|
||||||
|
DoCircles ();
|
||||||
|
DoCheckerboard ();
|
||||||
|
DoDiagram ();
|
||||||
|
DoLines ();
|
||||||
|
}
|
@ -128,7 +128,7 @@ Platforms: Runs on all platforms that have TGI support:
|
|||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
|
||||||
Platform specific samples follow:
|
Platform-specific samples follow:
|
||||||
|
|
||||||
atari 2600:
|
atari 2600:
|
||||||
-----------
|
-----------
|
||||||
@ -198,6 +198,27 @@ Name: nachtm
|
|||||||
Description: Plays "Eine kleine Nachtmusik" by Wolfgang Amadeus Mozart.
|
Description: Plays "Eine kleine Nachtmusik" by Wolfgang Amadeus Mozart.
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
lynx:
|
||||||
|
-----
|
||||||
|
|
||||||
|
These programs are adapted for the Atari Lynx because its library has no conio
|
||||||
|
output or stdio.
|
||||||
|
|
||||||
|
Name: hello
|
||||||
|
Description: A nice "Hello world" type program that uses the TGI graphics
|
||||||
|
library for output.
|
||||||
|
|
||||||
|
Name: mandelbrot
|
||||||
|
Description: A mandelbrot demo using integer arithmetic. The demo was
|
||||||
|
written by groepaz, and converted to cc65 using TGI graphics
|
||||||
|
by Stefan Haubenthal.
|
||||||
|
|
||||||
|
Name: tgidemo
|
||||||
|
Description: Shows some of the graphics capabilities of the "Tiny Graphics
|
||||||
|
Interface".
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
sym1:
|
sym1:
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user