mirror of
https://github.com/cc65/cc65.git
synced 2025-01-10 19:29:45 +00:00
Oliver Schmidt updated the graphics drivers and part of the C library for the
Apple machines. git-svn-id: svn://svn.cc65.org/cc65/trunk@3816 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
c7ddd12bba
commit
feae688346
@ -74,6 +74,7 @@ JOY_API_VERSION = $01
|
||||
;------------------------------------------------------------------------------
|
||||
; C callable functions
|
||||
|
||||
.global _joy_load_driver
|
||||
.global _joy_unload
|
||||
.global _joy_install
|
||||
.global _joy_uninstall
|
||||
|
@ -40,9 +40,8 @@
|
||||
TGI_MODE_160_200_4 ; 160x200, 4 colors
|
||||
TGI_MODE_640_200_2 ; 640x200, 2 colors (b/w)
|
||||
TGI_MODE_640_480_2 ; 640x480, 2 colors (b/w)
|
||||
TGI_MODE_280_192_6 ; 280x192, 6 colors
|
||||
TGI_MODE_560_192_2 ; 560x192, 2 colors
|
||||
TGI_MODE_40_40_16 ; 40x40, 16 colors
|
||||
TGI_MODE_280_192_8 ; 280x192, 8 colors
|
||||
TGI_MODE_40_48_16 ; 40x48, 16 colors
|
||||
.endenum
|
||||
|
||||
|
||||
|
@ -35,25 +35,25 @@ more information.
|
||||
|
||||
The standard binary output format generated by the linker for the
|
||||
Apple ][ target is a machine language program with a 4 byte DOS
|
||||
3.3 header. The standard load address is $800.
|
||||
3.3 header. The standard load address is $803.
|
||||
|
||||
The DOS header is in its own segment named <tt/EXEHDR/. If you don't want the
|
||||
header for some reason, you can change
|
||||
|
||||
<verb>
|
||||
HEADER: start = $0000, size = $4, file = %O;
|
||||
HEADER: start = $0000, size = $0004, file = %O;
|
||||
</verb>
|
||||
|
||||
to
|
||||
|
||||
<verb>
|
||||
HEADER: start = $0000, size = $4, file = "";
|
||||
HEADER: start = $0000, size = $0004, file = "";
|
||||
</verb>
|
||||
|
||||
in the linker configuration to have the linker remove it.
|
||||
|
||||
Please note that there is a "Apple ][ ProDOS 8 system program
|
||||
for loading binary programs" available in the cc65 User Contributions section.
|
||||
Please note that there is an 'Apple ][ ProDOS 8 system program
|
||||
for loading binary programs' available in the cc65 User Contributions section.
|
||||
It adds all benefits of a ProDOS 8 system program to the standard binary
|
||||
program generated by the linker for the Apple ][ target.
|
||||
|
||||
@ -62,8 +62,9 @@ program generated by the linker for the Apple ][ target.
|
||||
<sect>Memory layout<p>
|
||||
|
||||
In the standard setup, cc65 generated programs use the memory from
|
||||
$800 to $95FF, so 35.5K of memory are available. ROM calls are
|
||||
possible without further precautions.
|
||||
$803 to $95FF, so 35.5KB of RAM are available. While running
|
||||
<tt/main()/ the Language Card bank 2 is enabled for read access. However while
|
||||
running module constructors/destructors the Language Card is disabled.
|
||||
|
||||
Special locations:
|
||||
|
||||
@ -77,6 +78,32 @@ Special locations:
|
||||
runtime stack.
|
||||
</descrip><p>
|
||||
|
||||
Enabling the Language Card allows to use it as additional memory for executable
|
||||
code. Actually doing so requires either to compile code with the option
|
||||
<tt/--code-name HIGHCODE/ or to use <tt/#pragma codeseg ("HIGHCODE")/.
|
||||
|
||||
The amount of memory available in the Language Card for executable code depends
|
||||
on the chosen program environment. A plain vanilla ProDOS 8 doesn't actually
|
||||
use the Language Card bank 2 memory from $D400 to $DFFF.
|
||||
Therefore the builtin linker configuration defines these 3KB as <tt/LC/ memory
|
||||
area for executable code.
|
||||
|
||||
A plain vanilla DOS 3.3 doesn't make use of the Language Card at all. So you
|
||||
can change
|
||||
|
||||
<verb>
|
||||
LC: start = $D400, size = $0C00, define = yes;
|
||||
</verb>
|
||||
|
||||
to
|
||||
|
||||
<verb>
|
||||
LC: start = $D000, size = $3000, define = yes;
|
||||
</verb>
|
||||
|
||||
in the linker configuration to define the whole 12KB Language Card address
|
||||
space as memory area for executable code.
|
||||
|
||||
|
||||
|
||||
<sect>Platform specific header files<p>
|
||||
@ -112,14 +139,19 @@ you cannot do it, it just means that there's no help.
|
||||
<descrip>
|
||||
|
||||
<tag><tt/a2.lo.tgi/</tag>
|
||||
This driver was written by Stefan Haubenthal. It features a resolution of
|
||||
40×40 with 16 colors. At the bottom of the screen, 4 additional text
|
||||
lines are available.
|
||||
This driver features a resolution of 40×48 with 16 colors.
|
||||
|
||||
<tag><tt/a2.hi.tgi/</tag>
|
||||
This driver was written by Stefan Haubenthal. It features a resolution of
|
||||
280×192 with 6 colors. Note that programs using this driver will have
|
||||
to be linked with <tt/--start-addr $4000/ to reserve the first hires page.
|
||||
This driver features a resolution of 280×192 with 8 colors and two
|
||||
hires pages. Note that programs using this driver will have to be linked
|
||||
with <tt/--start-addr $4000/ to reserve the first hires page or with
|
||||
<tt/--start-addr $6000/ to reserve both hires pages.
|
||||
|
||||
In memory constrained situations the memory from $803 to $1FFF
|
||||
can be made available to a program by executing <tt/_heapadd ((void *) 0x0803, 0x17FD);/
|
||||
at the beginning of <tt/main()/. Doing so is beneficial even if the program
|
||||
doesn't use the the heap explicitly because loading the driver (and in fact
|
||||
already opening the driver file) uses the heap implicitly.
|
||||
|
||||
</descrip><p>
|
||||
|
||||
@ -128,11 +160,12 @@ you cannot do it, it just means that there's no help.
|
||||
|
||||
<descrip>
|
||||
|
||||
<tag><tt/a2.lc.emd/</tag>
|
||||
Gives access to 12KB RAM (48 pages of 256 bytes each) on the
|
||||
Apple II Language Card. The driver was contributed by Stefan Haubenthal.
|
||||
Note that this driver is incompatible with any DOS using the Language
|
||||
Card memory!
|
||||
<tag><tt/a2.auxmem.emd/</tag>
|
||||
Gives access to 47,5 KB RAM (190 pages of 256 bytes each) on an Extended
|
||||
80-Column Text Card.
|
||||
|
||||
Note that this driver doesn't check for the actual existence of the memory
|
||||
and that it doesn't check for ProDOS 8 RAM disk content!
|
||||
|
||||
</descrip><p>
|
||||
|
||||
@ -155,10 +188,13 @@ you cannot do it, it just means that there's no help.
|
||||
<tag><tt/a2.stdmou.mou/</tag>
|
||||
Driver for the AppleMouse II Card. Searches all Apple II slots
|
||||
for an AppleMouse II Card compatible firmware. The default bounding
|
||||
box is [0..279,0..191]. Programs using this driver will have
|
||||
to be linked with <tt/--start-addr $4000/ to reserve the first hires page
|
||||
if they are intended to run on an Apple ][ (in contrast to
|
||||
an Apple //e).
|
||||
box is [0..279,0..191].
|
||||
|
||||
Programs using this driver will have to be linked with <tt/--start-addr $4000/
|
||||
to reserve the first hires page if they are intended to run on an
|
||||
Apple ][ (in contrast to an Apple //e) because the
|
||||
AppleMouse II Card firmware writes to the hires page when initializing
|
||||
on that machine.
|
||||
|
||||
Note that the Apple ][ default mouse callbacks support text
|
||||
mode only.
|
||||
@ -178,8 +214,8 @@ you cannot do it, it just means that there's no help.
|
||||
flow control because of a full buffer.
|
||||
|
||||
The driver defaults to slot 2. Call <tt/ser_ioctl(0, <slot>)/ prior to
|
||||
<tt/ser_open/ in order to select a different slot. <tt/ser_ioctl/ succeeds
|
||||
for all Apple II slots, but <tt/ser_open/ fails with
|
||||
<tt/ser_open()/ in order to select a different slot. <tt/ser_ioctl()/
|
||||
succeeds for all Apple II slots, but <tt/ser_open()/ fails with
|
||||
<tt/SER_ERR_NO_DEVICE/ if there's no SSC firmware found in the selected slot.
|
||||
|
||||
</descrip><p>
|
||||
@ -199,7 +235,7 @@ Command line arguments can be passed to <tt/main()/ after BLOAD. Since this is n
|
||||
supported by BASIC, the following syntax was chosen:
|
||||
|
||||
<tscreen><verb>
|
||||
]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
|
||||
]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
|
||||
</verb></tscreen>
|
||||
|
||||
<enum>
|
||||
@ -216,10 +252,11 @@ supported by BASIC, the following syntax was chosen:
|
||||
<sect1>Interrupts<p>
|
||||
|
||||
The runtime for the Apple ][ uses routines marked as <tt/.CONDES/
|
||||
type 2 for ProDOS interrupt handlers. Such routines must be written as simple
|
||||
machine language subroutines and will be called automatically by the interrupt
|
||||
handler code when they are linked into a program. See the discussion of the
|
||||
<tt/.CONDES/ feature in the <htmlurl url="ca65.html" name="assembler manual">.
|
||||
type <tt/interruptor/ for ProDOS 8 interrupt handlers. Such routines must be
|
||||
written as simple machine language subroutines and will be called automatically
|
||||
by the interrupt handler code when they are linked into a program. See the
|
||||
discussion of the <tt/.CONDES/ feature in the <htmlurl url="ca65.html"
|
||||
name="assembler manual">.
|
||||
|
||||
|
||||
|
||||
@ -235,7 +272,7 @@ name="uz@cc65.org">).
|
||||
<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
|
||||
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,
|
||||
|
@ -35,25 +35,25 @@ more information.
|
||||
|
||||
The standard binary output format generated by the linker for the
|
||||
enhanced Apple //e target is a machine language program with a 4 byte DOS
|
||||
3.3 header. The standard load address is $800.
|
||||
3.3 header. The standard load address is $803.
|
||||
|
||||
The DOS header is in its own segment named <tt/EXEHDR/. If you don't want the
|
||||
header for some reason, you can change
|
||||
|
||||
<verb>
|
||||
HEADER: start = $0000, size = $4, file = %O;
|
||||
HEADER: start = $0000, size = $0004, file = %O;
|
||||
</verb>
|
||||
|
||||
to
|
||||
|
||||
<verb>
|
||||
HEADER: start = $0000, size = $4, file = "";
|
||||
HEADER: start = $0000, size = $0004, file = "";
|
||||
</verb>
|
||||
|
||||
in the linker configuration to have the linker remove it.
|
||||
|
||||
Please note that there is a "Apple ][ ProDOS 8 system program
|
||||
for loading binary programs" available in the cc65 User Contributions section.
|
||||
Please note that there is an 'Apple ][ ProDOS 8 system program
|
||||
for loading binary programs' available in the cc65 User Contributions section.
|
||||
It adds all benefits of a ProDOS 8 system program to the standard binary
|
||||
program generated by the linker for the enhanced Apple //e target.
|
||||
|
||||
@ -62,8 +62,9 @@ program generated by the linker for the enhanced Apple //e target.
|
||||
<sect>Memory layout<p>
|
||||
|
||||
In the standard setup, cc65 generated programs use the memory from
|
||||
$800 to $95FF, so 35.5K of memory are available. ROM calls are
|
||||
possible without further precautions.
|
||||
$803 to $95FF, so 35.5KB of RAM are available. While running
|
||||
<tt/main()/ the Language Card bank 2 is enabled for read access. However while
|
||||
running module constructors/destructors the Language Card is disabled.
|
||||
|
||||
Special locations:
|
||||
|
||||
@ -77,6 +78,32 @@ Special locations:
|
||||
runtime stack.
|
||||
</descrip><p>
|
||||
|
||||
Enabling the Language Card allows to use it as additional memory for executable
|
||||
code. Actually doing so requires either to compile code with the option
|
||||
<tt/--code-name HIGHCODE/ or to use <tt/#pragma codeseg ("HIGHCODE")/.
|
||||
|
||||
The amount of memory available in the Language Card for executable code depends
|
||||
on the chosen program environment. A plain vanilla ProDOS 8 doesn't actually
|
||||
use the Language Card bank 2 memory from $D400 to $DFFF.
|
||||
Therefore the builtin linker configuration defines these 3KB as <tt/LC/ memory
|
||||
area for executable code.
|
||||
|
||||
A plain vanilla DOS 3.3 doesn't make use of the Language Card at all. So you
|
||||
can change
|
||||
|
||||
<verb>
|
||||
LC: start = $D400, size = $0C00, define = yes;
|
||||
</verb>
|
||||
|
||||
to
|
||||
|
||||
<verb>
|
||||
LC: start = $D000, size = $3000, define = yes;
|
||||
</verb>
|
||||
|
||||
in the linker configuration to define the whole 12KB Language Card address
|
||||
space as memory area for executable code.
|
||||
|
||||
|
||||
|
||||
<sect>Platform specific header files<p>
|
||||
@ -114,14 +141,19 @@ you cannot do it, it just means that there's no help.
|
||||
<descrip>
|
||||
|
||||
<tag><tt/a2e.lo.tgi/</tag>
|
||||
This driver was written by Stefan Haubenthal. It features a resolution of
|
||||
40×40 with 16 colors. At the bottom of the screen, 4 additional text
|
||||
lines are available.
|
||||
This driver features a resolution of 40×48 with 16 colors.
|
||||
|
||||
<tag><tt/a2e.hi.tgi/</tag>
|
||||
This driver was written by Stefan Haubenthal. It features a resolution of
|
||||
280×192 with 6 colors. Note that programs using this driver will have
|
||||
to be linked with <tt/--start-addr $4000/ to reserve the first hires page.
|
||||
This driver features a resolution of 280×192 with 8 colors and two
|
||||
hires pages. Note that programs using this driver will have to be linked
|
||||
with <tt/--start-addr $4000/ to reserve the first hires page or with
|
||||
<tt/--start-addr $6000/ to reserve both hires pages.
|
||||
|
||||
In memory constrained situations the memory from $803 to $1FFF
|
||||
can be made available to a program by executing <tt/_heapadd ((void *) 0x0803, 0x17FD);/
|
||||
at the beginning of <tt/main()/. Doing so is beneficial even if the program
|
||||
doesn't use the the heap explicitly because loading the driver (and in fact
|
||||
already opening the driver file) uses the heap implicitly.
|
||||
|
||||
</descrip><p>
|
||||
|
||||
@ -130,11 +162,12 @@ you cannot do it, it just means that there's no help.
|
||||
|
||||
<descrip>
|
||||
|
||||
<tag><tt/a2e.lc.emd/</tag>
|
||||
Gives access to 12KB RAM (48 pages of 256 bytes each) on the
|
||||
Apple II Language Card. The driver was contributed by Stefan Haubenthal.
|
||||
Note that this driver is incompatible with any DOS using the Language
|
||||
Card memory!
|
||||
<tag><tt/a2e.auxmem.emd/</tag>
|
||||
Gives access to 47,5 KB RAM (190 pages of 256 bytes each) on an Extended
|
||||
80-Column Text Card.
|
||||
|
||||
Note that this driver doesn't check for the actual existence of the memory
|
||||
and that it doesn't check for ProDOS 8 RAM disk content!
|
||||
|
||||
</descrip><p>
|
||||
|
||||
@ -177,8 +210,8 @@ you cannot do it, it just means that there's no help.
|
||||
flow control because of a full buffer.
|
||||
|
||||
The driver defaults to slot 2. Call <tt/ser_ioctl(0, <slot>)/ prior to
|
||||
<tt/ser_open/ in order to select a different slot. <tt/ser_ioctl/ succeeds
|
||||
for all Apple II slots, but <tt/ser_open/ fails with
|
||||
<tt/ser_open()/ in order to select a different slot. <tt/ser_ioctl()/
|
||||
succeeds for all Apple II slots, but <tt/ser_open()/ fails with
|
||||
<tt/SER_ERR_NO_DEVICE/ if there's no SSC firmware found in the selected slot.
|
||||
|
||||
</descrip><p>
|
||||
@ -198,7 +231,7 @@ Command line arguments can be passed to <tt/main()/ after BLOAD. Since this is n
|
||||
supported by BASIC, the following syntax was chosen:
|
||||
|
||||
<tscreen><verb>
|
||||
]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
|
||||
]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
|
||||
</verb></tscreen>
|
||||
|
||||
<enum>
|
||||
@ -220,10 +253,11 @@ These are defined to be OpenApple + number key.
|
||||
<sect1>Interrupts<p>
|
||||
|
||||
The runtime for the enhanced Apple //e uses routines marked as <tt/.CONDES/
|
||||
type 2 for ProDOS interrupt handlers. Such routines must be written as simple
|
||||
machine language subroutines and will be called automatically by the interrupt
|
||||
handler code when they are linked into a program. See the discussion of the
|
||||
<tt/.CONDES/ feature in the <htmlurl url="ca65.html" name="assembler manual">.
|
||||
type <tt/interruptor/ for ProDOS 8 interrupt handlers. Such routines must be
|
||||
written as simple machine language subroutines and will be called automatically
|
||||
by the interrupt handler code when they are linked into a program. See the
|
||||
discussion of the <tt/.CONDES/ feature in the <htmlurl url="ca65.html"
|
||||
name="assembler manual">.
|
||||
|
||||
|
||||
|
||||
@ -239,7 +273,7 @@ name="uz@cc65.org">).
|
||||
<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
|
||||
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,
|
||||
|
@ -231,8 +231,8 @@ Here is a description of all the command line options:
|
||||
|
||||
Using -S you may define the default starting address. If and how this
|
||||
address is used depends on the config file in use. For the builtin
|
||||
configurations, only the "none" system honors an explicit start address,
|
||||
all other builtin config provide their own.
|
||||
configurations, only the "none", "apple2" and "apple2enh" systems honor an
|
||||
explicit start address, all other builtin config provide their own.
|
||||
|
||||
|
||||
<tag><tt>-V, --version</tt></tag>
|
||||
@ -935,7 +935,7 @@ distributed together with the machine specific binary packages (usually in the
|
||||
doc directory) and don't have a special format. So if you need a special
|
||||
configuration, it's a good idea to start with the builtin configuration for
|
||||
your system. In a first step, just replace <tt/-t target/ by <tt/-C
|
||||
configfile/. The go on and modify the config file to suit your needs.
|
||||
configfile/. Then go on and modify the config file to suit your needs.
|
||||
|
||||
|
||||
|
||||
|
@ -49,13 +49,32 @@
|
||||
|
||||
|
||||
|
||||
/* Color Defines
|
||||
* Since Apple2 does not support color text these defines are only
|
||||
* used to get the library to compile correctly. They should not be used
|
||||
* in user code
|
||||
*/
|
||||
/* Color Defines */
|
||||
#define COLOR_BLACK 0x00
|
||||
#define COLOR_WHITE 0x01
|
||||
#define COLOR_GREEN 0x01
|
||||
#define COLOR_VIOLET 0x02
|
||||
#define COLOR_WHITE 0x03
|
||||
#define COLOR_BLACK2 0x04
|
||||
#define COLOR_ORANGE 0x05
|
||||
#define COLOR_BLUE 0x06
|
||||
#define COLOR_WHITE2 0x07
|
||||
|
||||
#define LORES_BLACK 0x00
|
||||
#define LORES_MAGENTA 0x01
|
||||
#define LORES_DARKBLUE 0x02
|
||||
#define LORES_VIOLET 0x03
|
||||
#define LORES_DARKGREEN 0x04
|
||||
#define LORES_GRAY 0x05
|
||||
#define LORES_BLUE 0x06
|
||||
#define LORES_CYAN 0x07
|
||||
#define LORES_BROWN 0x08
|
||||
#define LORES_ORANGE 0x09
|
||||
#define LORES_GRAY2 0x0A
|
||||
#define LORES_PINK 0x0B
|
||||
#define LORES_GREEN 0x0C
|
||||
#define LORES_YELLOW 0x0D
|
||||
#define LORES_AQUA 0x0E
|
||||
#define LORES_WHITE 0x0F
|
||||
|
||||
/* Characters codes */
|
||||
#define CH_ENTER 0x0D
|
||||
@ -104,7 +123,7 @@ extern unsigned char _dos_type;
|
||||
* ProDOS 8 1.6 - 0x16
|
||||
* ProDOS 8 1.7 - 0x17
|
||||
* ProDOS 8 1.8 - 0x18
|
||||
* ProDOS 8 1.9 - 0x18
|
||||
* ProDOS 8 1.9 - 0x18 (!)
|
||||
* ProDOS 8 2.0.1 - 0x21
|
||||
* ProDOS 8 2.0.2 - 0x22
|
||||
* ProDOS 8 2.0.3 - 0x23
|
||||
|
@ -49,7 +49,8 @@
|
||||
#define TGI_MODE_160_200_4 2U /* 160x200, 4 colors */
|
||||
#define TGI_MODE_640_200_2 3U /* 640x200, 2 colors (b/w) */
|
||||
#define TGI_MODE_640_480_2 4U /* 640x480, 2 colors (b/w) */
|
||||
#define TGI_MODE_280_192_6 5U /* 280x192, 6 colors */
|
||||
#define TGI_MODE_280_192_8 5U /* 280x192, 8 colors */
|
||||
#define TGI_MODE_40_48_16 6U /* 40x48, 16 colors */
|
||||
|
||||
|
||||
|
||||
|
@ -48,12 +48,11 @@ apple2lib:
|
||||
done
|
||||
mv apple2/crt0.o apple2.o
|
||||
cp apple2/apple2-auxmem.emd a2.auxmem.emd
|
||||
cp apple2/apple2-lc.emd a2.lc.emd
|
||||
cp apple2/apple2-stdjoy.joy a2.stdjoy.joy
|
||||
cp apple2/apple2-stdmou.mou a2.stdmou.mou
|
||||
cp apple2/apple2-ssc.ser a2.ssc.ser
|
||||
cp apple2/apple2-40-40-16.tgi a2.lo.tgi
|
||||
cp apple2/apple2-280-192-6.tgi a2.hi.tgi
|
||||
cp apple2/apple2-280-192-8.tgi a2.hi.tgi
|
||||
cp apple2/apple2-40-48-16.tgi a2.lo.tgi
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Apple //e
|
||||
@ -65,12 +64,11 @@ apple2enhlib:
|
||||
done
|
||||
mv apple2enh/crt0.o apple2enh.o
|
||||
cp apple2enh/apple2-auxmem.emd a2e.auxmem.emd
|
||||
cp apple2enh/apple2-lc.emd a2e.lc.emd
|
||||
cp apple2enh/apple2-stdjoy.joy a2e.stdjoy.joy
|
||||
cp apple2enh/apple2-stdmou.mou a2e.stdmou.mou
|
||||
cp apple2enh/apple2-ssc.ser a2e.ssc.ser
|
||||
cp apple2enh/apple2-40-40-16.tgi a2e.lo.tgi
|
||||
cp apple2enh/apple2-280-192-6.tgi a2e.hi.tgi
|
||||
cp apple2enh/apple2-280-192-8.tgi a2e.hi.tgi
|
||||
cp apple2enh/apple2-40-48-16.tgi a2e.lo.tgi
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Atari
|
||||
|
@ -57,6 +57,7 @@ S_OBJS= _scrsize.o \
|
||||
close.o \
|
||||
clrscr.o \
|
||||
color.o \
|
||||
cout.o \
|
||||
cputc.o \
|
||||
crt0.o \
|
||||
ctype.o \
|
||||
@ -75,6 +76,7 @@ S_OBJS= _scrsize.o \
|
||||
get_ostype.o \
|
||||
gotoxy.o \
|
||||
gotoy.o \
|
||||
home.o \
|
||||
initcwd.o \
|
||||
joy_stddrv.o \
|
||||
kbhit.o \
|
||||
@ -85,14 +87,9 @@ S_OBJS= _scrsize.o \
|
||||
oserrlist.o \
|
||||
oserror.o \
|
||||
randomize.o \
|
||||
rcout.o \
|
||||
rdkey.o \
|
||||
read.o \
|
||||
revers.o \
|
||||
rhome.o \
|
||||
rom.o \
|
||||
rpread.o \
|
||||
rrdkey.o \
|
||||
rvtabz.o \
|
||||
rwcommon.o \
|
||||
syschdir.o \
|
||||
sysmkdir.o \
|
||||
@ -102,6 +99,7 @@ S_OBJS= _scrsize.o \
|
||||
systime.o \
|
||||
sysuname.o \
|
||||
tgi_mode_table.o\
|
||||
vtabz.o \
|
||||
wherex.o \
|
||||
wherey.o \
|
||||
write.o
|
||||
@ -109,7 +107,7 @@ S_OBJS= _scrsize.o \
|
||||
#--------------------------------------------------------------------------
|
||||
# Drivers
|
||||
|
||||
EMDS = apple2-auxmem.emd apple2-lc.emd
|
||||
EMDS = apple2-auxmem.emd
|
||||
|
||||
JOYS = apple2-stdjoy.joy
|
||||
|
||||
@ -117,7 +115,7 @@ MOUS = apple2-stdmou.mou
|
||||
|
||||
SERS = apple2-ssc.ser
|
||||
|
||||
TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
|
||||
TGIS = apple2-280-192-8.tgi apple2-40-48-16.tgi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Targets
|
||||
|
@ -1,7 +1,8 @@
|
||||
;
|
||||
; Graphics driver for the 280x192x6 mode on the Apple II
|
||||
; Graphics driver for the 280x192x8 mode on the Apple II
|
||||
;
|
||||
; Stefan Haubenthal <polluks@sdf.lonestar.org>
|
||||
; Oliver Schmidt <ol.sc@web.de>
|
||||
; Based on Maciej Witkowiak's circle routine
|
||||
;
|
||||
|
||||
@ -15,11 +16,23 @@
|
||||
.macpack generic
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; ROM entry points
|
||||
|
||||
; Zero page stuff
|
||||
|
||||
HBASL := $26
|
||||
HMASK := $30
|
||||
PAGE := $E6
|
||||
SCALE := $E7
|
||||
ROT := $F9
|
||||
|
||||
; Graphics entry points, by cbmnut (applenut??) cbmnut@hushmail.com
|
||||
|
||||
TEXT := $F399 ; Return to text screen
|
||||
HGR2 := $F3D8 ; Initialize and clear hi-res page 2.
|
||||
HGR := $F3E2 ; Initialize and clear hi-res page 1.
|
||||
HCLR := $F3F2 ; Clear the current hi-res screen to black.
|
||||
BKGND := $F3F6 ; Clear the current hi-res screen to the
|
||||
; last plotted color (from ($1C).
|
||||
HPOSN := $F411 ; Positions the hi-res cursor without
|
||||
; plotting a point.
|
||||
; Enter with (A) = Y-coordinate, and
|
||||
@ -33,30 +46,60 @@ HLIN := $F53A ; Draws a line from the last plotted
|
||||
; point or line destination to:
|
||||
; (X,A) = X-coordinate, and
|
||||
; (Y) = Y-coordinate.
|
||||
HFIND := $F5CB ; Converts the hi-res coursor's position
|
||||
; back to X- and Y-coordinates; stores
|
||||
; X-coordinate at $E0,E1 and Y-coordinate
|
||||
; at $E2.
|
||||
DRAW := $F601 ; Draws a shape. Enter with (Y,X) = the
|
||||
; address of the shape table, and (A) =
|
||||
; the rotation factor. Uses the current
|
||||
; color.
|
||||
XDRAW := $F65D ; Draws a shape by inverting the existing
|
||||
; color of the dots the shape draws over.
|
||||
; Same entry parameters as DRAW.
|
||||
SETHCOL := $F6EC ; Set the hi-res color to (X), where (X)
|
||||
; must be between 0 and 7.
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Header. Includes jump table and constants.
|
||||
|
||||
.segment "JUMPTABLE"
|
||||
; Variables mapped to the zero page segment variables. Some of these are
|
||||
; used for passing parameters to the driver.
|
||||
|
||||
X1 := ptr1
|
||||
Y1 := ptr2
|
||||
X2 := ptr3
|
||||
Y2 := ptr4
|
||||
RADIUS := tmp1
|
||||
|
||||
ADDR := tmp1 ; (2) SETPIXELCLIP
|
||||
TEMP := tmp3 ; icmp
|
||||
TEMP2 := tmp4 ; icmp
|
||||
XX := ptr3 ; (2) CIRCLE
|
||||
YY := ptr4 ; (2) CIRCLE
|
||||
TEMP3 := sreg ; CIRCLE
|
||||
TEMP4 := sreg+1 ; CIRCLE
|
||||
MaxO := sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway)
|
||||
XS := regsave ; (2) CIRCLE
|
||||
YS := regsave+2 ; (2) CIRCLE
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.segment "JUMPTABLE"
|
||||
|
||||
; Header. Includes jump table and constants.
|
||||
|
||||
; First part of the header is a structure that has a magic and defines the
|
||||
; capabilities of the driver
|
||||
|
||||
.byte $74, $67, $69 ; "tgi"
|
||||
.byte TGI_API_VERSION ; TGI API version number
|
||||
xres: .word 280 ; X resolution
|
||||
yres: .word 192 ; Y resolution
|
||||
.byte 8 ; Number of drawing colors
|
||||
.byte 2 ; Number of screens available
|
||||
.byte 8 ; System font X size
|
||||
.byte 8 ; System font Y size
|
||||
.res 4, $00 ; Reserved for future extensions
|
||||
.byte $74, $67, $69 ; "tgi"
|
||||
.byte TGI_API_VERSION ; TGI API version number
|
||||
xres: .word 280 ; X resolution
|
||||
yres: .word 192 ; Y resolution
|
||||
.byte 8 ; Number of drawing colors
|
||||
.byte 2 ; Number of screens available
|
||||
.byte 8 ; System font X size
|
||||
.byte 8 ; System font Y size
|
||||
.res 4, $00 ; Reserved for future extensions
|
||||
|
||||
; Next comes the jump table. Currently all entries must be valid and may point
|
||||
; to an RTS for test versions (function not implemented).
|
||||
@ -81,55 +124,33 @@ yres: .word 192 ; Y resolution
|
||||
.addr CIRCLE
|
||||
.addr TEXTSTYLE
|
||||
.addr OUTTEXT
|
||||
.addr 0 ; IRQ entry is unused
|
||||
.addr 0 ; IRQ entry is unused
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Data.
|
||||
|
||||
; Variables mapped to the zero page segment variables. Some of these are
|
||||
; used for passing parameters to the driver.
|
||||
|
||||
X1 = ptr1
|
||||
Y1 = ptr2
|
||||
X2 = ptr3
|
||||
Y2 = ptr4
|
||||
RADIUS = tmp1
|
||||
|
||||
ADDR = tmp1
|
||||
TEMP = tmp3
|
||||
TEMP2 = tmp4
|
||||
TEMP3 = sreg
|
||||
TEMP4 = sreg+1
|
||||
|
||||
; Circle stuff
|
||||
XX = ptr3 ; (2) CIRCLE
|
||||
YY = ptr4 ; (2) CIRCLE
|
||||
MaxO = sreg ; (overwritten by TEMP3+TEMP4, but restored from OG/OU anyway)
|
||||
XS = regsave ; (2) CIRCLE
|
||||
YS = regsave+2 ; (2) CIRCLE
|
||||
.bss
|
||||
|
||||
; Absolute variables used in the code
|
||||
|
||||
.bss
|
||||
ERROR: .res 1 ; Error code
|
||||
|
||||
ERROR: .res 1 ; Error code
|
||||
.ifdef __APPLE2ENH__
|
||||
Set80: .res 1 ; Set 80 column store
|
||||
.endif
|
||||
|
||||
; Line routine stuff (combined with CIRCLE to save space)
|
||||
; Circle stuff
|
||||
|
||||
OGora: .res 2
|
||||
OUkos: .res 2
|
||||
Y3: .res 2
|
||||
OGora: .res 2
|
||||
OUkos: .res 2
|
||||
Y3: .res 2
|
||||
|
||||
; Text output stuff
|
||||
TEXTMAGX = $E7
|
||||
TEXTMAGY = $E7
|
||||
TEXTDIR = $F9
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.rodata
|
||||
|
||||
; Constants and tables
|
||||
|
||||
.rodata
|
||||
|
||||
DEFPALETTE: .byte $00, $05, $04, $01, $00, $08, $06, $01; 6 unique colors
|
||||
DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07
|
||||
|
||||
SHAPE: .byte $64,$01,$D0,$00,$D5,$00,$DA,$00,$E0,$00,$EF,$00,$FE,$00,$0C,$01
|
||||
.byte $19,$01,$1D,$01,$25,$01,$2D,$01,$3D,$01,$46,$01,$4B,$01,$52,$01
|
||||
@ -215,33 +236,11 @@ SHAPE: .byte $64,$01,$D0,$00,$D5,$00,$DA,$00,$E0,$00,$EF,$00,$FE,$00,$0C,$01
|
||||
.byte $2D,$2D,$35,$3F,$3F,$37,$2D,$2D,$75,$00,$40,$C0,$40,$18,$00,$40
|
||||
.byte $C0,$40,$43,$00,$40,$C0,$40,$08,$00,$19,$00,$00
|
||||
|
||||
.code
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; INSTALL routine. Is called after the driver is loaded into memory. May
|
||||
; initialize anything that has to be done just once. Is probably empty
|
||||
; most of the time.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
INSTALL:
|
||||
.code
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; UNINSTALL routine. Is called before the driver is removed from memory. May
|
||||
; clean up anything done by INSTALL but is probably empty most of the time.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
UNINSTALL:
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; INIT: Changes an already installed device from text mode to graphics
|
||||
; mode.
|
||||
; INIT: Changes an already installed device from text mode to graphics mode.
|
||||
; Note that INIT/DONE may be called multiple times while the driver
|
||||
; is loaded, while INSTALL is only called once, so any code that is needed
|
||||
; to initializes variables and so on must go here. Setting palette and
|
||||
@ -249,153 +248,152 @@ UNINSTALL:
|
||||
; kernel later.
|
||||
; The graphics kernel will never call INIT when a graphics mode is already
|
||||
; active, so there is no need to protect against that.
|
||||
;
|
||||
; Must set an error code: YES
|
||||
;
|
||||
|
||||
INIT:
|
||||
.ifdef __APPLE2ENH__
|
||||
; Save and clear 80 column store
|
||||
lda RD80COL
|
||||
sta Set80
|
||||
sta CLR80COL
|
||||
.endif
|
||||
|
||||
; Switch into graphics mode
|
||||
|
||||
jsr HGR
|
||||
; Switch into graphics mode
|
||||
bit HIRES
|
||||
bit MIXCLR
|
||||
bit TXTCLR
|
||||
|
||||
; Done, reset the error code
|
||||
|
||||
; Done, reset the error code
|
||||
lda #TGI_ERR_OK
|
||||
sta ERROR
|
||||
|
||||
; Fall through
|
||||
|
||||
; INSTALL routine. Is called after the driver is loaded into memory. May
|
||||
; initialize anything that has to be done just once. Is probably empty
|
||||
; most of the time.
|
||||
; Must set an error code: NO
|
||||
INSTALL:
|
||||
; Fall through
|
||||
|
||||
; UNINSTALL routine. Is called before the driver is removed from memory. May
|
||||
; clean up anything done by INSTALL but is probably empty most of the time.
|
||||
; Must set an error code: NO
|
||||
UNINSTALL:
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; DONE: Will be called to switch the graphics device back into text mode.
|
||||
; The graphics kernel will never call DONE when no graphics mode is active,
|
||||
; so there is no need to protect against that.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
DONE:
|
||||
; Switch into text mode
|
||||
bit TXTSET
|
||||
bit LOWSCR
|
||||
|
||||
DONE = TEXT
|
||||
.ifdef __APPLE2ENH__
|
||||
; Restore 80 column store
|
||||
lda Set80
|
||||
bpl :+
|
||||
sta SET80COL
|
||||
: bit LORES ; Limit SET80COL-HISCR to text
|
||||
.endif
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; GETERROR: Return the error code in A and clear it.
|
||||
|
||||
GETERROR:
|
||||
ldx #TGI_ERR_OK
|
||||
lda ERROR
|
||||
ldx #TGI_ERR_OK
|
||||
stx ERROR
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; CONTROL: Platform/driver specific entry point.
|
||||
;
|
||||
; Must set an error code: YES
|
||||
;
|
||||
|
||||
CONTROL:
|
||||
lda #TGI_ERR_INV_FUNC
|
||||
sta ERROR
|
||||
; CLEAR: Clears the screen.
|
||||
; Must set an error code: NO
|
||||
CLEAR:
|
||||
bit $C082 ; Switch in ROM
|
||||
jsr HCLR
|
||||
bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; CLEAR: Clears the screen.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
CLEAR = HCLR
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; SETVIEWPAGE: Set the visible page. Called with the new page in A (0..n).
|
||||
; The page number is already checked to be valid by the graphics kernel.
|
||||
;
|
||||
; Must set an error code: NO (will only be called if page ok)
|
||||
;
|
||||
|
||||
SETVIEWPAGE:
|
||||
tax
|
||||
beq @L1
|
||||
bit HISCR
|
||||
rts
|
||||
@L1: bit LOWSCR
|
||||
.assert LOWSCR + 1 = HISCR, error
|
||||
lda LOWSCR,x ; No BIT absolute,X available
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n).
|
||||
; The page number is already checked to be valid by the graphics kernel.
|
||||
;
|
||||
; Must set an error code: NO (will only be called if page ok)
|
||||
;
|
||||
|
||||
SETDRAWPAGE:
|
||||
tax
|
||||
beq @L1
|
||||
lda #>$4000 ; Page 2
|
||||
.byte $2C
|
||||
@L1: lda #>$2000 ; Page 1
|
||||
sta $E6
|
||||
beq :+
|
||||
lda #>$4000 ; Page 2
|
||||
.byte $2C ; BIT absolute
|
||||
: lda #>$2000 ; Page 1
|
||||
sta PAGE
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; SETCOLOR: Set the drawing color (in A). The new color is already checked
|
||||
; to be in a valid range (0..maxcolor-1).
|
||||
;
|
||||
; Must set an error code: NO (will only be called if color ok)
|
||||
;
|
||||
|
||||
SETCOLOR:
|
||||
bit $C082 ; Switch in ROM
|
||||
tax
|
||||
jmp SETHCOL
|
||||
jsr SETHCOL
|
||||
bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
; CONTROL: Platform/driver specific entry point.
|
||||
; Must set an error code: YES
|
||||
CONTROL:
|
||||
; Fall through
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; SETPALETTE: Set the palette (not available with all drivers/hardware).
|
||||
; A pointer to the palette is passed in ptr1. Must set an error if palettes
|
||||
; are not supported
|
||||
;
|
||||
; Must set an error code: YES
|
||||
;
|
||||
|
||||
SETPALETTE:
|
||||
lda #TGI_ERR_INV_FUNC
|
||||
sta ERROR
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; GETPALETTE: Return the current palette in A/X. Even drivers that cannot
|
||||
; set the palette should return the default palette here, so there's no
|
||||
; way for this function to fail.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
GETPALETTE:
|
||||
; Fall through
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; GETDEFPALETTE: Return the default palette for the driver in A/X. All
|
||||
; drivers should return something reasonable here, even drivers that don't
|
||||
; support palettes, otherwise the caller has no way to determine the colors
|
||||
; of the (not changeable) palette.
|
||||
;
|
||||
; Must set an error code: NO (all drivers must have a default palette)
|
||||
;
|
||||
|
||||
GETDEFPALETTE:
|
||||
lda #<DEFPALETTE
|
||||
ldx #>DEFPALETTE
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; SETPIXEL: Draw one pixel at X1/Y1 = ptr1/ptr2 with the current drawing
|
||||
; color. The coordinates passed to this function are never outside the
|
||||
; visible screen area, so there is no need for clipping inside this function.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
SETPIXEL:
|
||||
bit $C082 ; Switch in ROM
|
||||
ldx X1
|
||||
ldy X1+1
|
||||
lda Y1
|
||||
jsr HPLOT
|
||||
bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
SETPIXELCLIP:
|
||||
lda Y1+1
|
||||
bmi @finito ; y<0
|
||||
bmi :+ ; y < 0
|
||||
lda X1+1
|
||||
bmi @finito ; x<0
|
||||
bmi :+ ; x < 0
|
||||
lda X1
|
||||
ldx X1+1
|
||||
sta ADDR
|
||||
@ -404,7 +402,7 @@ SETPIXELCLIP:
|
||||
lda xres
|
||||
ldy xres+1
|
||||
jsr icmp ; ( x < xres ) ...
|
||||
bcs @finito
|
||||
bcs :+
|
||||
lda Y1
|
||||
ldx Y1+1
|
||||
sta ADDR
|
||||
@ -414,64 +412,33 @@ SETPIXELCLIP:
|
||||
ldy yres+1
|
||||
jsr icmp ; ... && ( y < yres )
|
||||
bcc SETPIXEL
|
||||
@finito:rts
|
||||
: rts
|
||||
|
||||
SETPIXEL:
|
||||
ldx X1
|
||||
ldy X1+1
|
||||
lda Y1
|
||||
jmp HPLOT
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; GETPIXEL: Read the color value of a pixel and return it in A/X. The
|
||||
; coordinates passed to this function are never outside the visible screen
|
||||
; area, so there is no need for clipping inside this function.
|
||||
|
||||
|
||||
GETPIXEL:
|
||||
bit $C082 ; Switch in ROM
|
||||
ldx X1
|
||||
ldy X1+1
|
||||
lda Y1
|
||||
jsr HPOSN ; 1st pixel
|
||||
HBASL = $26
|
||||
HMASK = $30
|
||||
ldx #$00
|
||||
jsr HPOSN
|
||||
lda (HBASL),y
|
||||
and HMASK
|
||||
beq @L1
|
||||
inx
|
||||
@L1: stx tmp1
|
||||
|
||||
lda $E0 ; which neighbour
|
||||
tax
|
||||
and #$01
|
||||
bne @odd
|
||||
asl tmp1
|
||||
inx
|
||||
.byte $24
|
||||
@odd: dex
|
||||
|
||||
ldy $E1
|
||||
lda $E2
|
||||
jsr HPOSN ; 2nd pixel
|
||||
ldx #$00
|
||||
lda (HBASL),y
|
||||
and HMASK
|
||||
beq @L2
|
||||
inx
|
||||
@L2: txa
|
||||
ora tmp1
|
||||
ldx #$00
|
||||
asl
|
||||
beq :+ ; 0 (black)
|
||||
lda #$03 ; 3 (white)
|
||||
: bcc :+
|
||||
adc #$03 ; += 4 (black -> black2, white -> white2)
|
||||
: ldx #$00
|
||||
bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and
|
||||
; X2/Y2 = ptr3/ptr4 using the current drawing color.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
LINE:
|
||||
bit $C082 ; Switch in ROM
|
||||
ldx X1
|
||||
ldy X1+1
|
||||
lda Y1
|
||||
@ -479,9 +446,10 @@ LINE:
|
||||
lda X2
|
||||
ldx X2+1
|
||||
ldy Y2
|
||||
jmp HLIN
|
||||
jsr HLIN
|
||||
bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; BAR: Draw a filled rectangle with the corners X1/Y1, X2/Y2, where
|
||||
; X1/Y1 = ptr1/ptr2 and X2/Y2 = ptr3/ptr4 using the current drawing color.
|
||||
; Contrary to most other functions, the graphics kernel will sort and clip
|
||||
@ -493,13 +461,10 @@ LINE:
|
||||
; (X2 >= 0) && (X2 < XRES)
|
||||
; (Y1 >= 0) && (Y1 < YRES)
|
||||
; (Y2 >= 0) && (Y2 < YRES)
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
BAR:
|
||||
inc Y2
|
||||
@L1: lda Y2
|
||||
: lda Y2
|
||||
pha
|
||||
lda Y1
|
||||
sta Y2
|
||||
@ -508,30 +473,27 @@ BAR:
|
||||
sta Y2
|
||||
inc Y1
|
||||
cmp Y1
|
||||
bne @L1
|
||||
bne :-
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the
|
||||
; radius in tmp1 and the current drawing color.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
CIRCLE:
|
||||
lda RADIUS
|
||||
bne @L1
|
||||
bne :+
|
||||
jmp SETPIXELCLIP ; Plot as a point
|
||||
: sta XX
|
||||
|
||||
@L1: sta XX
|
||||
; x = r;
|
||||
; x = r
|
||||
lda #$00
|
||||
sta XX+1
|
||||
sta YY
|
||||
sta YY+1
|
||||
sta MaxO
|
||||
sta MaxO+1
|
||||
; y =0; mo=0;
|
||||
|
||||
; y = 0, mo = 0
|
||||
lda X1
|
||||
ldx X1+1
|
||||
sta XS
|
||||
@ -541,97 +503,98 @@ CIRCLE:
|
||||
sta YS
|
||||
stx YS+1 ; XS/YS to remember the center
|
||||
|
||||
; while (y<x) {
|
||||
@L013B: ldx #YY
|
||||
; while (y < x) {
|
||||
while: ldx #YY
|
||||
lda XX
|
||||
ldy XX+1
|
||||
jsr icmp
|
||||
bcc @L12
|
||||
bcc :+
|
||||
rts
|
||||
@L12: ; plot points in 8 slices...
|
||||
lda XS
|
||||
|
||||
; Plot points in 8 slices...
|
||||
: lda XS
|
||||
add XX
|
||||
sta X1
|
||||
lda XS+1
|
||||
adc XX+1
|
||||
sta X1+1 ; x1 = xs+x
|
||||
sta X1+1 ; x1 = xs + x
|
||||
lda YS
|
||||
add YY
|
||||
sta Y1
|
||||
pha
|
||||
lda YS+1
|
||||
adc YY+1
|
||||
sta Y1+1 ; (stack)=ys+y, y1=(stack)
|
||||
sta Y1+1 ; (stack) = ys + y, y1 = (stack)
|
||||
pha
|
||||
jsr SETPIXELCLIP ; plot(xs+x,ys+y)
|
||||
jsr SETPIXELCLIP ; plot (xs + x, ys + y)
|
||||
lda YS
|
||||
sub YY
|
||||
sta Y1
|
||||
sta Y3
|
||||
lda YS+1
|
||||
sbc YY+1
|
||||
sta Y1+1 ; y3 = y1 = ys-y
|
||||
sta Y1+1 ; y3 = y1 = ys - y
|
||||
sta Y3+1
|
||||
jsr SETPIXELCLIP ; plot(xs+x,ys-y)
|
||||
jsr SETPIXELCLIP ; plot (xs + x, ys - y)
|
||||
pla
|
||||
sta Y1+1
|
||||
pla
|
||||
sta Y1 ; y1 = ys+y
|
||||
sta Y1 ; y1 = ys + y
|
||||
lda XS
|
||||
sub XX
|
||||
sta X1
|
||||
lda XS+1
|
||||
sbc XX+1
|
||||
sta X1+1
|
||||
jsr SETPIXELCLIP ; plot (xs-x,ys+y)
|
||||
jsr SETPIXELCLIP ; plot (xs - x, ys + y)
|
||||
lda Y3
|
||||
sta Y1
|
||||
lda Y3+1
|
||||
sta Y1+1
|
||||
jsr SETPIXELCLIP ; plot (xs-x,ys-y)
|
||||
jsr SETPIXELCLIP ; plot (xs - x, ys - y)
|
||||
|
||||
lda XS
|
||||
add YY
|
||||
sta X1
|
||||
lda XS+1
|
||||
adc YY+1
|
||||
sta X1+1 ; x1 = xs+y
|
||||
sta X1+1 ; x1 = xs + y
|
||||
lda YS
|
||||
add XX
|
||||
sta Y1
|
||||
pha
|
||||
lda YS+1
|
||||
adc XX+1
|
||||
sta Y1+1 ; (stack)=ys+x, y1=(stack)
|
||||
sta Y1+1 ; (stack) = ys + x, y1 = (stack)
|
||||
pha
|
||||
jsr SETPIXELCLIP ; plot(xs+y,ys+x)
|
||||
jsr SETPIXELCLIP ; plot (xs + y, ys + x)
|
||||
lda YS
|
||||
sub XX
|
||||
sta Y1
|
||||
sta Y3
|
||||
lda YS+1
|
||||
sbc XX+1
|
||||
sta Y1+1 ; y3 = y1 = ys-x
|
||||
sta Y1+1 ; y3 = y1 = ys - x
|
||||
sta Y3+1
|
||||
jsr SETPIXELCLIP ; plot(xs+y,ys-x)
|
||||
jsr SETPIXELCLIP ; plot (xs + y, ys - x)
|
||||
pla
|
||||
sta Y1+1
|
||||
pla
|
||||
sta Y1 ; y1 = ys+x(stack)
|
||||
sta Y1 ; y1 = ys + x(stack)
|
||||
lda XS
|
||||
sub YY
|
||||
sta X1
|
||||
lda XS+1
|
||||
sbc YY+1
|
||||
sta X1+1
|
||||
jsr SETPIXELCLIP ; plot (xs-y,ys+x)
|
||||
jsr SETPIXELCLIP ; plot (xs - y, ys + x)
|
||||
lda Y3
|
||||
sta Y1
|
||||
lda Y3+1
|
||||
sta Y1+1
|
||||
jsr SETPIXELCLIP ; plot (xs-y,ys-x)
|
||||
jsr SETPIXELCLIP ; plot (xs - y, ys - x)
|
||||
|
||||
; og = mo+y+y+1
|
||||
; og = mo + y + y + 1
|
||||
lda MaxO
|
||||
ldx MaxO+1
|
||||
add YY
|
||||
@ -647,11 +610,12 @@ CIRCLE:
|
||||
tax
|
||||
tya
|
||||
add #$01
|
||||
bcc @L0143
|
||||
bcc :+
|
||||
inx
|
||||
@L0143: sta OGora
|
||||
: sta OGora
|
||||
stx OGora+1
|
||||
; ou = og-x-x+1
|
||||
|
||||
; ou = og - x - x + 1
|
||||
sub XX
|
||||
tay
|
||||
txa
|
||||
@ -665,16 +629,18 @@ CIRCLE:
|
||||
tax
|
||||
tya
|
||||
add #$01
|
||||
bcc @L0146
|
||||
bcc :+
|
||||
inx
|
||||
@L0146: sta OUkos
|
||||
: sta OUkos
|
||||
stx OUkos+1
|
||||
; ++y
|
||||
|
||||
; ++y
|
||||
inc YY
|
||||
bne @L0148
|
||||
bne :+
|
||||
inc YY+1
|
||||
@L0148: ; if (abs(ou)<abs(og))
|
||||
lda OUkos
|
||||
|
||||
; if (abs (ou) < abs (og)) {
|
||||
: lda OUkos
|
||||
ldy OUkos+1
|
||||
jsr abs
|
||||
sta TEMP3
|
||||
@ -684,52 +650,47 @@ CIRCLE:
|
||||
jsr abs
|
||||
ldx #TEMP3
|
||||
jsr icmp
|
||||
bpl @L0149
|
||||
; { --x;
|
||||
bpl :++
|
||||
|
||||
; --x
|
||||
lda XX
|
||||
sub #$01
|
||||
sta XX
|
||||
bcs @L014E
|
||||
bcs :+
|
||||
dec XX+1
|
||||
@L014E: ; mo = ou; }
|
||||
lda OUkos
|
||||
ldx OUkos+1
|
||||
jmp @L014G
|
||||
; else { mo = og }
|
||||
@L0149: lda OGora
|
||||
ldx OGora+1
|
||||
@L014G: sta MaxO
|
||||
stx MaxO+1
|
||||
; }
|
||||
jmp @L013B
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; mo = ou }
|
||||
: lda OUkos
|
||||
ldx OUkos+1
|
||||
jmp :++
|
||||
|
||||
; else mo = og
|
||||
: lda OGora
|
||||
ldx OGora+1
|
||||
: sta MaxO
|
||||
stx MaxO+1
|
||||
|
||||
; }
|
||||
jmp while
|
||||
|
||||
; TEXTSTYLE: Set the style used when calling OUTTEXT. Text scaling in X and Y
|
||||
; direction is passend in X/Y, the text direction is passed in A.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
TEXTSTYLE:
|
||||
stx TEXTMAGX
|
||||
sty TEXTMAGY
|
||||
asl ; 16 <=> 90þ
|
||||
stx SCALE
|
||||
asl ; 16 <=> 90þ
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta TEXTDIR
|
||||
sta ROT
|
||||
rts
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the
|
||||
; current text style. The text to output is given as a zero terminated
|
||||
; string with address in ptr3.
|
||||
;
|
||||
; Must set an error code: NO
|
||||
;
|
||||
|
||||
OUTTEXT:
|
||||
bit $C082 ; Switch in ROM
|
||||
ldx X1
|
||||
ldy X1+1
|
||||
lda Y1
|
||||
@ -742,10 +703,10 @@ OUTTEXT:
|
||||
sta tmp3+1
|
||||
|
||||
ldy #$00
|
||||
@L1: lda (ptr3),y
|
||||
beq @end
|
||||
sub #$1F ; no controls
|
||||
asl ; offset*2
|
||||
: lda (ptr3),y
|
||||
beq :+
|
||||
sub #$1F ; No controls
|
||||
asl ; Offset * 2
|
||||
tax
|
||||
lda SHAPE,x
|
||||
add #<SHAPE
|
||||
@ -757,26 +718,25 @@ OUTTEXT:
|
||||
pha
|
||||
ldx tmp1
|
||||
ldy tmp1+1
|
||||
lda TEXTDIR
|
||||
lda ROT
|
||||
jsr DRAW
|
||||
ldx tmp3
|
||||
ldy tmp3+1
|
||||
lda TEXTDIR
|
||||
lda ROT
|
||||
jsr DRAW
|
||||
pla
|
||||
tay
|
||||
iny
|
||||
bne @L1
|
||||
@end: rts
|
||||
bne :-
|
||||
: bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
;-------------
|
||||
; copies of some runtime routines
|
||||
; Copies of some runtime routines
|
||||
|
||||
abs:
|
||||
; a/y := abs(a/y)
|
||||
; A/Y := abs (A/Y)
|
||||
cpy #$00
|
||||
bpl @L1
|
||||
; negay
|
||||
bpl :+
|
||||
clc
|
||||
eor #$FF
|
||||
adc #$01
|
||||
@ -786,10 +746,10 @@ abs:
|
||||
adc #$00
|
||||
tay
|
||||
pla
|
||||
@L1: rts
|
||||
: rts
|
||||
|
||||
icmp:
|
||||
; compare a/y to zp,x
|
||||
; Compare A/Y to zp,X
|
||||
sta TEMP ; TEMP/TEMP2 - arg2
|
||||
sty TEMP2
|
||||
lda $00,x
|
||||
@ -798,16 +758,16 @@ icmp:
|
||||
tay
|
||||
pla
|
||||
tax
|
||||
tya ; x/a - arg1 (a=high)
|
||||
tya ; X/A - arg1 (a = high)
|
||||
|
||||
sub TEMP2
|
||||
bne @L4
|
||||
bne :++
|
||||
cpx TEMP
|
||||
beq @L3
|
||||
beq :+
|
||||
adc #$FF
|
||||
ora #$01
|
||||
@L3: rts
|
||||
@L4: bvc @L3
|
||||
: rts
|
||||
: bvc :+
|
||||
eor #$FF
|
||||
ora #$01
|
||||
rts
|
||||
: rts
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,9 @@
|
||||
;
|
||||
; Standard joystick driver for the Apple ][. May be used multiple times when
|
||||
; linked to the statically application.
|
||||
; Standard joystick driver for the Apple ][. May be used multiple times
|
||||
; when statically linked to the application.
|
||||
;
|
||||
; Ullrich von Bassewitz, 2003-05-02
|
||||
; Oliver Schmidt, 2008-02-25
|
||||
; Using the readjoy code from Stefan Haubenthal
|
||||
;
|
||||
|
||||
@ -14,121 +15,117 @@
|
||||
|
||||
.macpack generic
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
; Constants
|
||||
|
||||
OFFS = 10
|
||||
THRESHOLD = 20 ; Deviation from center triggering movement
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
; ROM entry points
|
||||
|
||||
PREAD := $FB1E ; Read paddle in X, return AD conv. value in Y
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Header. Includes jump table
|
||||
|
||||
.segment "JUMPTABLE"
|
||||
; Header. Includes jump table.
|
||||
|
||||
.segment "JUMPTABLE"
|
||||
|
||||
; Driver signature
|
||||
|
||||
.byte $6A, $6F, $79 ; "joy"
|
||||
.byte JOY_API_VERSION ; Driver API version number
|
||||
.byte $6A, $6F, $79 ; "joy"
|
||||
.byte JOY_API_VERSION ; Driver API version number
|
||||
|
||||
; Button state masks (8 values)
|
||||
|
||||
.byte $40
|
||||
.byte $80
|
||||
.byte $10
|
||||
.byte $20
|
||||
.byte $04
|
||||
.byte $08
|
||||
.byte $00 ; FIRE2 not available
|
||||
.byte $00 ; Future expansion
|
||||
.byte $00 ; Future expansion
|
||||
.byte $40
|
||||
.byte $80
|
||||
.byte $00 ; Future expansion
|
||||
.byte $00 ; Future expansion
|
||||
|
||||
; Jump table.
|
||||
; Jump table
|
||||
|
||||
.addr INSTALL
|
||||
.addr UNINSTALL
|
||||
.addr COUNT
|
||||
.addr READJOY
|
||||
.addr 0 ; IRQ not used
|
||||
.addr 0 ; IRQ not used
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Constants
|
||||
|
||||
JOY_COUNT = 2 ; Number of joysticks we support
|
||||
.code
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; Data.
|
||||
|
||||
|
||||
.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
|
||||
; Fall through
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; UNINSTALL 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.
|
||||
;
|
||||
|
||||
COUNT:
|
||||
lda #<JOY_COUNT
|
||||
ldx #>JOY_COUNT
|
||||
lda #$02 ; Number of joysticks we support
|
||||
ldx #$00
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; READ: Read a particular joystick passed in A.
|
||||
;
|
||||
|
||||
READJOY:
|
||||
and #$01 ; Fix joystick number
|
||||
asl a ;
|
||||
tax ; Joystick number (0,2) into X
|
||||
bit $C082 ; Switch in ROM
|
||||
and #$01 ; Restrict joystick number
|
||||
|
||||
; Read joystick
|
||||
|
||||
lda BUTN0,x ; Check fire button
|
||||
and #$80 ; BTN 0 0 0 0 0 0 0
|
||||
; Read horizontal paddle
|
||||
asl ; Joystick number -> paddle number
|
||||
tax ; Set paddle number (0, 2)
|
||||
jsr PREAD ; Read paddle value
|
||||
lda #$00 ; 0 0 0 0 0 0 0 0
|
||||
cpy #127 - THRESHOLD
|
||||
ror ; !LEFT 0 0 0 0 0 0 0
|
||||
cpy #127 + THRESHOLD
|
||||
ror ; RIGHT !LEFT 0 0 0 0 0 0
|
||||
|
||||
; Read vertical paddle
|
||||
pha
|
||||
jsr PREAD ; Read first paddle value
|
||||
inx ; Set paddle number (1, 3)
|
||||
jsr PREAD ; Read paddle value
|
||||
pla
|
||||
cpy #127-OFFS
|
||||
ror a ; /LEFT BTN 0 0 0 0 0 0
|
||||
cpy #127+OFFS
|
||||
ror a ; RIGHT /LEFT BTN 0 0 0 0 0
|
||||
cpy #127 - THRESHOLD
|
||||
ror ; !UP RIGHT !LEFT 0 0 0 0 0
|
||||
cpy #127 + THRESHOLD
|
||||
ror ; DOWN !UP RIGHT !LEFT 0 0 0 0
|
||||
|
||||
inx
|
||||
pha
|
||||
jsr PREAD ; Read second paddle
|
||||
pla
|
||||
cpy #127-OFFS
|
||||
ror a ; /UP RIGHT /LEFT BTN 0 0 0 0
|
||||
cpy #127+OFFS
|
||||
ror a ; DOWN /UP RIGHT /LEFT BTN 0 0 0
|
||||
eor #%01010000 ; DOWN UP RIGHT LEFT BTN 0 0 0
|
||||
; Read primary button
|
||||
tay
|
||||
lda BUTN0-1,x ; Check button (1, 3)
|
||||
asl
|
||||
tya
|
||||
ror ; FIRE DOWN !UP RIGHT !LEFT 0 0 0
|
||||
|
||||
ldx #$00 ; fix X
|
||||
; Read secondary button
|
||||
tay
|
||||
inx
|
||||
txa
|
||||
and #$03 ; IIgs has fourth button at TAPEIN
|
||||
tax
|
||||
lda BUTN0-1,x ; Check button (2, 0)
|
||||
asl
|
||||
tya
|
||||
ror ; FIRE2 FIRE DOWN !UP RIGHT !LEFT 0 0
|
||||
|
||||
; Finalize
|
||||
eor #%00010100 ; FIRE2 FIRE DOWN UP RIGHT LEFT 0 0
|
||||
ldx #$00
|
||||
bit $C080 ; Switch in LC bank 2 for R/O
|
||||
rts
|
||||
|
||||
|
||||
|
@ -147,31 +147,16 @@ next: inc ptr1+1
|
||||
asl
|
||||
sta yparam+1
|
||||
|
||||
.ifdef __APPLE2ENH__
|
||||
; Save LC read state
|
||||
ldx #<ROMIN
|
||||
bit RDLCRAM
|
||||
bpl :+
|
||||
ldx #<LCBANK1
|
||||
bit RDLCBNK2
|
||||
bpl :+
|
||||
ldx #<LCBANK2
|
||||
: phx
|
||||
|
||||
; The AppleMouse II Card needs the ROM swapped in
|
||||
; The AppleMouse II Card needs the ROM switched in
|
||||
; to be able to detect an Apple //e and use RDVBL
|
||||
sta ROMIN ; STA keeps LC write state
|
||||
.endif
|
||||
bit $C082
|
||||
|
||||
; Reset mouse hardware
|
||||
ldx #INITMOUSE
|
||||
jsr firmware
|
||||
|
||||
.ifdef __APPLE2ENH__
|
||||
; Restore LC read state
|
||||
plx
|
||||
sta $C000,x ; STA keeps LC write state
|
||||
.endif
|
||||
; Switch in LC bank 2 for R/O
|
||||
bit $C080
|
||||
|
||||
; Turn mouse on
|
||||
lda #%00000001
|
||||
|
@ -34,6 +34,7 @@ KBDSTRB := $C010 ; Clear keyboard strobe
|
||||
; 80 column video switches
|
||||
CLR80COL:= $C000 ; Disable 80 column store
|
||||
SET80COL:= $C001 ; Enable 80 column store
|
||||
RD80COL := $C018 ; >127 if 80 column store enabled
|
||||
RD80VID := $C01F ; >127 if 80 column video enabled
|
||||
|
||||
; Character set switches
|
||||
@ -49,6 +50,8 @@ LCBANK2 := $C083 ; Swap in LC bank 2
|
||||
LCBANK1 := $C08B ; Swap in LC bank 1
|
||||
|
||||
; Video mode switches
|
||||
TXTCLR := $C050 ; Display graphics
|
||||
TXTSET := $C051 ; Display text
|
||||
MIXCLR := $C052 ; Disable 4 lines of text
|
||||
MIXSET := $C053 ; Enable 4 lines of text
|
||||
LOWSCR := $C054 ; Page 1
|
||||
|
20
libsrc/apple2/cout.s
Normal file
20
libsrc/apple2/cout.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Oliver Schmidt, 03.03.2007
|
||||
;
|
||||
; COUT routine
|
||||
;
|
||||
|
||||
.export COUT
|
||||
|
||||
.include "apple2.inc"
|
||||
|
||||
.segment "LOWCODE"
|
||||
|
||||
COUT:
|
||||
; Switch in ROM and call COUT
|
||||
bit $C082
|
||||
jsr $FDED ; Vector to user output routine
|
||||
|
||||
; Switch in LC bank 2 for R/O and return
|
||||
bit $C080
|
||||
rts
|
@ -8,20 +8,24 @@
|
||||
.import zerobss
|
||||
.import initlib, donelib
|
||||
.import callmain, callirq
|
||||
.import COUT
|
||||
.import __STARTUP_LOAD__, __BSS_LOAD__ ; Linker generated
|
||||
.import __RAM_START__ , __RAM_LAST__ ; Linker generated
|
||||
.import __MOVE_START__, __MOVE_LAST__ ; Linker generated
|
||||
.import __LC_START__ , __LC_LAST__ ; Linker generated
|
||||
.import __BSS_RUN__ , __INIT_SIZE__ ; Linker generated
|
||||
.import __INTERRUPTOR_COUNT__ ; Linker generated
|
||||
|
||||
.include "zeropage.inc"
|
||||
.include "apple2.inc"
|
||||
.include "mli.inc"
|
||||
|
||||
.linecont +
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.segment "EXEHDR"
|
||||
|
||||
.addr __STARTUP_LOAD__ ; Start address
|
||||
.word __BSS_LOAD__ - __STARTUP_LOAD__ ; Size
|
||||
.addr __RAM_START__ ; Start address
|
||||
.word __BSS_RUN__ - __RAM_START__ + \
|
||||
__MOVE_LAST__ - __MOVE_START__ ; Size
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
@ -33,13 +37,64 @@
|
||||
ldx #$FF
|
||||
txs ; Init stack pointer
|
||||
|
||||
; Delegate all further processing to keep STARTUP small
|
||||
; Switch in LC bank 2 for W/O
|
||||
bit $C081
|
||||
bit $C081
|
||||
|
||||
; Set source start address
|
||||
lda #<(__BSS_RUN__ + __INIT_SIZE__)
|
||||
ldy #>(__BSS_RUN__ + __INIT_SIZE__)
|
||||
sta $9B
|
||||
sty $9C
|
||||
|
||||
; Set source last address
|
||||
lda #<(__BSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__)
|
||||
ldy #>(__BSS_RUN__ + __INIT_SIZE__ + __LC_LAST__ - __LC_START__)
|
||||
sta $96
|
||||
sty $97
|
||||
|
||||
; Set destination last address
|
||||
lda #<__LC_LAST__
|
||||
ldy #>__LC_LAST__
|
||||
sta $94
|
||||
sty $95
|
||||
|
||||
; Call into Applesoft Block Transfer Utility - which handles zero
|
||||
; sized blocks well - to move content of the LC memory area
|
||||
jsr $D396 ; BLTU + 3
|
||||
|
||||
; Set source start address
|
||||
lda #<__BSS_RUN__
|
||||
ldy #>__BSS_RUN__
|
||||
sta $9B
|
||||
sty $9C
|
||||
|
||||
; Set source last address
|
||||
lda #<(__BSS_RUN__ + __INIT_SIZE__)
|
||||
ldy #>(__BSS_RUN__ + __INIT_SIZE__)
|
||||
sta $96
|
||||
sty $97
|
||||
|
||||
; Set destination last address
|
||||
lda #<__RAM_LAST__
|
||||
ldy #>__RAM_LAST__
|
||||
sta $94
|
||||
sty $95
|
||||
|
||||
; Call into Applesoft Block Transfer Utility - which handles moving
|
||||
; overlapping blocks upwards well - to move the INIT segment
|
||||
jsr $D396 ; BLTU + 3
|
||||
|
||||
; Delegate all further processing to keep the STARTUP segment small
|
||||
jsr init
|
||||
|
||||
; Avoid re-entrance of donelib. This is also the _exit entry
|
||||
_exit: ldx #<exit
|
||||
lda #>exit
|
||||
jsr reset ; Setup RESET vector
|
||||
|
||||
; Switch in ROM in case it wasn't already switched in by a RESET
|
||||
bit $C082
|
||||
|
||||
; Call module destructors
|
||||
jsr donelib
|
||||
@ -50,7 +105,7 @@ _exit: ldx #<exit
|
||||
|
||||
; Deallocate interrupt vector table entry
|
||||
dec params ; Adjust parameter count
|
||||
jsr ENTRY
|
||||
jsr $BF00 ; MLI call entry point
|
||||
.byte $41 ; Dealloc interrupt
|
||||
.addr params
|
||||
|
||||
@ -88,6 +143,9 @@ init: ldx #zpspace-1
|
||||
dex
|
||||
bpl :-
|
||||
|
||||
; Clear the BSS data
|
||||
jsr zerobss
|
||||
|
||||
; Save the original RESET vector
|
||||
ldx #$02
|
||||
: lda SOFTEV,x
|
||||
@ -102,9 +160,6 @@ init: ldx #zpspace-1
|
||||
lda #>_exit
|
||||
jsr reset ; Setup RESET vector
|
||||
|
||||
; Clear the BSS data
|
||||
jsr zerobss
|
||||
|
||||
; Setup the stack
|
||||
lda HIMEM
|
||||
sta sp
|
||||
@ -116,12 +171,12 @@ init: ldx #zpspace-1
|
||||
beq :+
|
||||
|
||||
; Check for ProDOS
|
||||
lda ENTRY
|
||||
lda $BF00 ; MLI call entry point
|
||||
cmp #$4C ; Is MLI present? (JMP opcode)
|
||||
bne prterr
|
||||
|
||||
; Allocate interrupt vector table entry
|
||||
jsr ENTRY
|
||||
jsr $BF00 ; MLI call entry point
|
||||
.byte $40 ; Alloc interrupt
|
||||
.addr params
|
||||
bcs prterr
|
||||
@ -133,13 +188,16 @@ init: ldx #zpspace-1
|
||||
; Call module constructors
|
||||
: jsr initlib
|
||||
|
||||
; Switch in LC bank 2 for R/O
|
||||
bit $C080
|
||||
|
||||
; Push arguments and call main()
|
||||
jmp callmain
|
||||
|
||||
; Print error message and return
|
||||
prterr: ldx #msglen-1
|
||||
: lda errmsg,x
|
||||
jsr COUT
|
||||
jsr $FDED ; COUT
|
||||
dex
|
||||
bpl :-
|
||||
rts
|
||||
@ -184,10 +242,6 @@ intrpt: cld
|
||||
: sec
|
||||
rts
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.code
|
||||
|
||||
; Setup RESET vector
|
||||
reset: stx SOFTEV
|
||||
sta SOFTEV+1
|
||||
@ -201,8 +255,12 @@ reset: stx SOFTEV
|
||||
|
||||
zpsave: .res zpspace
|
||||
|
||||
rvsave: .res 3
|
||||
|
||||
params: .byte $02 ; Parameter count
|
||||
intnum: .byte $00 ; Interrupt number
|
||||
.addr intrpt ; Interrupt handler
|
||||
.addr intrpt ; Interrupt handler
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.bss
|
||||
|
||||
rvsave: .res 3
|
||||
|
@ -17,7 +17,6 @@ getfd:
|
||||
cmp #MAX_FDS
|
||||
bcs error
|
||||
|
||||
|
||||
; Convert handle to fdtab slot
|
||||
.assert .sizeof(FD) = 4, error
|
||||
asl
|
||||
|
@ -6,7 +6,6 @@
|
||||
;
|
||||
|
||||
.export _gotoxy, _gotox
|
||||
|
||||
.import popa, VTABZ
|
||||
|
||||
.include "apple2.inc"
|
||||
|
@ -5,7 +5,6 @@
|
||||
;
|
||||
|
||||
.export _gotoy
|
||||
|
||||
.import VTABZ
|
||||
|
||||
.include "apple2.inc"
|
||||
|
20
libsrc/apple2/home.s
Normal file
20
libsrc/apple2/home.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Oliver Schmidt, 03.03.2007
|
||||
;
|
||||
; HOME routine
|
||||
;
|
||||
|
||||
.export HOME
|
||||
|
||||
.include "apple2.inc"
|
||||
|
||||
.segment "LOWCODE"
|
||||
|
||||
HOME:
|
||||
; Switch in ROM and call HOME
|
||||
bit $C082
|
||||
jsr $FC58 ; Clear current text screen
|
||||
|
||||
; Switch in LC bank 2 for R/O and return
|
||||
bit $C080
|
||||
rts
|
@ -57,9 +57,9 @@ extern char _cwd[FILENAME_MAX];
|
||||
|
||||
|
||||
|
||||
DIR* __fastcall__ opendir (const char* name)
|
||||
DIR* __fastcall__ opendir (register const char* name)
|
||||
{
|
||||
DIR* dir;
|
||||
register DIR* dir;
|
||||
|
||||
/* Alloc DIR */
|
||||
if ((dir = malloc (sizeof (*dir))) == NULL) {
|
||||
|
@ -1,10 +0,0 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-06-03
|
||||
;
|
||||
; Rom COUT routine
|
||||
;
|
||||
|
||||
.export COUT
|
||||
|
||||
COUT := $FDED ; Vector to user output routine
|
||||
|
20
libsrc/apple2/rdkey.s
Normal file
20
libsrc/apple2/rdkey.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Oliver Schmidt, 03.03.2007
|
||||
;
|
||||
; RDKEY routine
|
||||
;
|
||||
|
||||
.export RDKEY
|
||||
|
||||
.include "apple2.inc"
|
||||
|
||||
.segment "LOWCODE"
|
||||
|
||||
RDKEY:
|
||||
; Switch in ROM and call RDKEY
|
||||
bit $C082
|
||||
jsr $FD0C ; Display prompt and read key from user input routine
|
||||
|
||||
; Switch in LC bank 2 for R/O and return
|
||||
bit $C080
|
||||
rts
|
@ -43,9 +43,9 @@
|
||||
|
||||
|
||||
|
||||
struct dirent* __fastcall__ readdir (DIR* dir)
|
||||
struct dirent* __fastcall__ readdir (register DIR* dir)
|
||||
{
|
||||
unsigned char* entry;
|
||||
register unsigned char* entry;
|
||||
|
||||
/* Search for the next active directory entry */
|
||||
do {
|
||||
|
@ -44,7 +44,7 @@
|
||||
|
||||
|
||||
|
||||
void __fastcall__ rewinddir (DIR* dir)
|
||||
void __fastcall__ rewinddir (register DIR* dir)
|
||||
{
|
||||
/* Rewind directory file */
|
||||
if (lseek (dir->fd, 0, SEEK_SET)) {
|
||||
|
@ -1,53 +0,0 @@
|
||||
;
|
||||
; Oliver Schmidt, 30.05.2004
|
||||
;
|
||||
; Apple2 ROM routines
|
||||
;
|
||||
|
||||
.export TEXT
|
||||
.export HGR2
|
||||
.export HGR
|
||||
.export HCLR
|
||||
.export BKGND
|
||||
.export HPOSN
|
||||
.export HPLOT
|
||||
.export HLIN
|
||||
.export HFIND
|
||||
.export DRAW
|
||||
.export XDRAW
|
||||
.export SETHCOL
|
||||
|
||||
; Graphics entry points, by cbmnut (applenut??) cbmnut@hushmail.com
|
||||
TEXT := $F399 ; Return to text screen
|
||||
HGR2 := $F3D8 ; Initialize and clear hi-res page 2.
|
||||
HGR := $F3E2 ; Initialize and clear hi-res page 1.
|
||||
HCLR := $F3F2 ; Clear the current hi-res screen to black.
|
||||
BKGND := $F3F6 ; Clear the current hi-res screen to the
|
||||
; last plotted color (from ($1C).
|
||||
HPOSN := $F411 ; Positions the hi-res cursor without
|
||||
; plotting a point.
|
||||
; Enter with (A) = Y-coordinate, and
|
||||
; (Y,X) = X-coordinate.
|
||||
HPLOT := $F457 ; Calls HPOSN and tries to plot a dot at
|
||||
; the cursor's position. If you are
|
||||
; trying to plot a non-white color at
|
||||
; a complementary color position, no
|
||||
; dot will be plotted.
|
||||
HLIN := $F53A ; Draws a line from the last plotted
|
||||
; point or line destination to:
|
||||
; (X,A) = X-coordinate, and
|
||||
; (Y) = Y-coordinate.
|
||||
HFIND := $F5CB ; Converts the hi-res coursor's position
|
||||
; back to X- and Y-coordinates; stores
|
||||
; X-coordinate at $E0,E1 and Y-coordinate
|
||||
; at $E2.
|
||||
DRAW := $F601 ; Draws a shape. Enter with (Y,X) = the
|
||||
; address of the shape table, and (A) =
|
||||
; the rotation factor. Uses the current
|
||||
; color.
|
||||
XDRAW := $F65D ; Draws a shape by inverting the existing
|
||||
; color of the dots the shape draws over.
|
||||
; Same entry parameters as DRAW.
|
||||
SETHCOL := $F6EC ; Set the hi-res color to (X), where (X)
|
||||
; must be between 0 and 7.
|
||||
|
@ -1,10 +0,0 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-06-03
|
||||
;
|
||||
; Rom PREAD routine
|
||||
;
|
||||
|
||||
.export PREAD
|
||||
|
||||
PREAD := $FB1E ; Read paddle in X, return AD conv. value in Y
|
||||
|
@ -1,10 +0,0 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-06-03
|
||||
;
|
||||
; Rom RDKEY routine
|
||||
;
|
||||
|
||||
.export RDKEY
|
||||
|
||||
RDKEY := $FD0C ; Display prompt and read key from user input routine
|
||||
|
@ -1,9 +0,0 @@
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-06-03
|
||||
;
|
||||
; Rom VTABZ routine
|
||||
;
|
||||
|
||||
.export VTABZ
|
||||
|
||||
VTABZ := $FC24 ; Generate text base address
|
@ -14,16 +14,14 @@
|
||||
; BEWARE: The current implementation of tgi_map_mode does not work with tables
|
||||
; larger that 255 bytes!
|
||||
|
||||
.rodata
|
||||
.rodata
|
||||
|
||||
_tgi_mode_table:
|
||||
.ifdef __APPLE2ENH__
|
||||
.byte TGI_MODE_280_192_6, "A2E.HI.TGI", 0
|
||||
.byte TGI_MODE_40_40_16, "A2E.LO.TGI", 0
|
||||
; .byte TGI_MODE_560_192_2, "A2E.DHI.TGI", 0
|
||||
.byte TGI_MODE_280_192_8, "A2E.HI.TGI", 0
|
||||
.byte TGI_MODE_40_48_16, "A2E.LO.TGI", 0
|
||||
.else
|
||||
.byte TGI_MODE_280_192_6, "A2.HI.TGI", 0
|
||||
.byte TGI_MODE_40_40_16, "A2.LO.TGI", 0
|
||||
; .byte TGI_MODE_560_192_2, "A2.DHI.TGI", 0
|
||||
.byte TGI_MODE_280_192_8, "A2.HI.TGI", 0
|
||||
.byte TGI_MODE_40_48_16, "A2.LO.TGI", 0
|
||||
.endif
|
||||
.byte 0 ; End marker
|
||||
.byte 0 ; End marker
|
||||
|
20
libsrc/apple2/vtabz.s
Normal file
20
libsrc/apple2/vtabz.s
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Oliver Schmidt, 03.03.2007
|
||||
;
|
||||
; VTABZ routine
|
||||
;
|
||||
|
||||
.export VTABZ
|
||||
|
||||
.include "apple2.inc"
|
||||
|
||||
.segment "LOWCODE"
|
||||
|
||||
VTABZ:
|
||||
; Switch in ROM and call VTABZ
|
||||
bit $C082
|
||||
jsr $FC24 ; Generate text base address
|
||||
|
||||
; Switch in LC bank 2 and return
|
||||
bit $C080
|
||||
rts
|
@ -57,6 +57,7 @@ S_OBJS= _scrsize.o \
|
||||
close.o \
|
||||
clrscr.o \
|
||||
color.o \
|
||||
cout.o \
|
||||
cputc.o \
|
||||
crt0.o \
|
||||
ctype.o \
|
||||
@ -75,6 +76,7 @@ S_OBJS= _scrsize.o \
|
||||
get_ostype.o \
|
||||
gotoxy.o \
|
||||
gotoy.o \
|
||||
home.o \
|
||||
initcwd.o \
|
||||
joy_stddrv.o \
|
||||
kbhit.o \
|
||||
@ -85,14 +87,9 @@ S_OBJS= _scrsize.o \
|
||||
oserrlist.o \
|
||||
oserror.o \
|
||||
randomize.o \
|
||||
rcout.o \
|
||||
rdkey.o \
|
||||
read.o \
|
||||
revers.o \
|
||||
rhome.o \
|
||||
rom.o \
|
||||
rpread.o \
|
||||
rrdkey.o \
|
||||
rvtabz.o \
|
||||
rwcommon.o \
|
||||
syschdir.o \
|
||||
sysmkdir.o \
|
||||
@ -103,6 +100,7 @@ S_OBJS= _scrsize.o \
|
||||
sysuname.o \
|
||||
textframe.o \
|
||||
tgi_mode_table.o\
|
||||
vtabz.o \
|
||||
wherex.o \
|
||||
wherey.o \
|
||||
write.o
|
||||
@ -110,7 +108,7 @@ S_OBJS= _scrsize.o \
|
||||
#--------------------------------------------------------------------------
|
||||
# Drivers
|
||||
|
||||
EMDS = apple2-auxmem.emd apple2-lc.emd
|
||||
EMDS = apple2-auxmem.emd
|
||||
|
||||
JOYS = apple2-stdjoy.joy
|
||||
|
||||
@ -118,7 +116,7 @@ MOUS = apple2-stdmou.mou
|
||||
|
||||
SERS = apple2-ssc.ser
|
||||
|
||||
TGIS = apple2-40-40-16.tgi apple2-280-192-6.tgi
|
||||
TGIS = apple2-280-192-8.tgi apple2-40-48-16.tgi
|
||||
|
||||
#--------------------------------------------------------------------------
|
||||
# Targets
|
||||
|
@ -83,7 +83,7 @@ gunzip65: $(CRT0) gunzip65.o $(CLIB)
|
||||
hello: $(CRT0) hello.o $(CLIB)
|
||||
@$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
|
||||
|
||||
# The apple machines need the start address adjusted for the mandelbrot demo
|
||||
# The Apple machines need the start address adjusted for the mandelbrot demo
|
||||
ifeq "$(SYS)" "apple2"
|
||||
mandelbrot: $(CRT0) mandelbrot.o $(CLIB)
|
||||
@$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^
|
||||
@ -115,7 +115,7 @@ plasma: $(CRT0) plasma.o $(CLIB)
|
||||
sieve: $(CRT0) sieve.o $(CLIB)
|
||||
@$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^
|
||||
|
||||
# The apple machines need the start address adjusted for the tgidemo
|
||||
# The Apple machines need the start address adjusted for the tgidemo
|
||||
ifeq "$(SYS)" "apple2"
|
||||
tgidemo: $(CRT0) tgidemo.o $(CLIB)
|
||||
@$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^
|
||||
|
@ -15,13 +15,13 @@
|
||||
|
||||
/* Graphics definitions */
|
||||
#if defined(__APPLE2__) || defined(__APPLE2ENH__)
|
||||
# define GRAPHMODE TGI_MODE_280_192_6
|
||||
# define GRAPHMODE TGI_MODE_280_192_8
|
||||
#else
|
||||
# define GRAPHMODE TGI_MODE_320_200_2
|
||||
#endif
|
||||
#define SCREEN_X (tgi_getmaxx()+1)
|
||||
#define SCREEN_Y (tgi_getmaxy()+1)
|
||||
#define MAXCOL (tgi_getmaxcolor()+1)
|
||||
#define SCREEN_X (tgi_getxres())
|
||||
#define SCREEN_Y (tgi_getyres())
|
||||
#define MAXCOL (tgi_getcolorcount())
|
||||
|
||||
#define maxiterations 32
|
||||
#define fpshift (10)
|
||||
|
@ -8,15 +8,12 @@
|
||||
|
||||
|
||||
#if defined(__APPLE2__) || defined(__APPLE2ENH__)
|
||||
# define TGI_MODE TGI_MODE_280_192_6
|
||||
# define PAL_BACK 0
|
||||
# define PAL_FORE 3
|
||||
# define COLOR_LIGHTRED 0 /* Dummy */
|
||||
# define TGI_MODE TGI_MODE_280_192_8
|
||||
#else
|
||||
# define TGI_MODE TGI_MODE_320_200_2
|
||||
# define PAL_BACK 0
|
||||
# define PAL_FORE 1
|
||||
# define TGI_MODE TGI_MODE_320_200_2
|
||||
#endif
|
||||
#define COLOR_BACK COLOR_BLACK
|
||||
#define COLOR_FORE COLOR_WHITE
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
@ -33,7 +30,7 @@ static const unsigned char SinusTable[] = {
|
||||
0x22,0x20,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19,0x18,
|
||||
0x17,0x16,0x15,0x14,0x13,0x12,0x12,0x11,0x10,0x10,
|
||||
0x0F,0x0E,0x0E,0x0D,0x0D,0x0C,0x0C,0x0C,0x0B,0x0B,
|
||||
0x0B,0x0B,0x0B,0x0B,0x0B,0x0A,0x0B,0x0B,0x0B,0x0B,
|
||||
0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
|
||||
0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,
|
||||
0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16,
|
||||
0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,
|
||||
@ -48,7 +45,7 @@ static const unsigned char SinusTable[] = {
|
||||
0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,
|
||||
0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB6,0xB7,0xB8,0xB8,
|
||||
0xB9,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xBD,0xBD,
|
||||
0xBD,0xBD,0xBD,0xBD,0xBD,0xBE,0xBD,0xBD,0xBD,0xBD,
|
||||
0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,
|
||||
0xBD,0xBD,0xBD,0xBC,0xBC,0xBC,0xBB,0xBB,0xBA,0xBA,
|
||||
0xB9,0xB8,0xB8,0xB7,0xB6,0xB6,0xB5,0xB4,0xB3,0xB2,
|
||||
0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8,
|
||||
@ -61,8 +58,8 @@ static const unsigned char SinusTable[] = {
|
||||
|
||||
|
||||
/* Driver stuff */
|
||||
static unsigned XRes;
|
||||
static unsigned YRes;
|
||||
static unsigned MaxX;
|
||||
static unsigned MaxY;
|
||||
|
||||
|
||||
|
||||
@ -99,22 +96,22 @@ static void DoWarning (void)
|
||||
|
||||
static void DoCircles (void)
|
||||
{
|
||||
static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_LIGHTRED };
|
||||
static const unsigned char Palette[2] = { COLOR_WHITE, COLOR_ORANGE };
|
||||
unsigned char I;
|
||||
unsigned char Color = PAL_FORE;
|
||||
unsigned X = XRes / 2;
|
||||
unsigned Y = YRes / 2;
|
||||
unsigned char Color = COLOR_FORE;
|
||||
unsigned X = MaxX / 2;
|
||||
unsigned Y = MaxY / 2;
|
||||
|
||||
tgi_setpalette (Palette);
|
||||
while (!kbhit ()) {
|
||||
tgi_setcolor (PAL_FORE);
|
||||
tgi_line (0, 0, XRes-1, YRes-1);
|
||||
tgi_line (0, YRes-1, XRes-1, 0);
|
||||
tgi_setcolor (COLOR_FORE);
|
||||
tgi_line (0, 0, MaxX, MaxY);
|
||||
tgi_line (0, MaxY, MaxX, 0);
|
||||
tgi_setcolor (Color);
|
||||
for (I = 10; I < 240; I += 10) {
|
||||
tgi_circle (X, Y, I);
|
||||
}
|
||||
Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE;
|
||||
Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
|
||||
}
|
||||
|
||||
cgetc ();
|
||||
@ -130,22 +127,22 @@ static void DoCheckerboard (void)
|
||||
unsigned char Color;
|
||||
|
||||
tgi_setpalette (Palette);
|
||||
Color = PAL_BACK;
|
||||
Color = COLOR_BACK;
|
||||
while (1) {
|
||||
for (Y = 0; Y < YRes; Y += 10) {
|
||||
for (X = 0; X < XRes; X += 10) {
|
||||
for (Y = 0; Y <= MaxY; Y += 10) {
|
||||
for (X = 0; X <= MaxX; X += 10) {
|
||||
tgi_setcolor (Color);
|
||||
tgi_bar (X, Y, X+9, Y+9);
|
||||
Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE;
|
||||
Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
|
||||
if (kbhit ()) {
|
||||
cgetc ();
|
||||
tgi_clear ();
|
||||
return;
|
||||
}
|
||||
}
|
||||
Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE;
|
||||
Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
|
||||
}
|
||||
Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE;
|
||||
Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -157,14 +154,14 @@ static void DoDiagram (void)
|
||||
unsigned X, I;
|
||||
|
||||
tgi_setpalette (Palette);
|
||||
tgi_setcolor (PAL_FORE);
|
||||
tgi_line (10, 10, 10, YRes-10);
|
||||
tgi_lineto (XRes-10, YRes-10);
|
||||
tgi_setcolor (COLOR_FORE);
|
||||
tgi_line (10, 10, 10, MaxY-10);
|
||||
tgi_lineto (MaxX-10, MaxY-10);
|
||||
tgi_line (8, 12, 10, 10);
|
||||
tgi_lineto (12, 12);
|
||||
tgi_line (XRes-12, YRes-12, XRes-10, YRes-10);
|
||||
tgi_lineto (XRes-12, YRes-8);
|
||||
for (I = 0, X = 10; X < XRes-10; ++X) {
|
||||
tgi_line (MaxX-12, MaxY-12, MaxX-10, MaxY-10);
|
||||
tgi_lineto (MaxX-12, MaxY-8);
|
||||
for (I = 0, X = 10; X < MaxX-10; ++X) {
|
||||
tgi_setpixel (X, SinusTable[I]);
|
||||
if (++I >= sizeof (SinusTable)) {
|
||||
I = 0;
|
||||
@ -183,13 +180,13 @@ static void DoLines (void)
|
||||
unsigned X;
|
||||
|
||||
tgi_setpalette (Palette);
|
||||
tgi_setcolor (PAL_FORE);
|
||||
tgi_setcolor (COLOR_FORE);
|
||||
|
||||
for (X = 0; X < YRes; X+=10) {
|
||||
tgi_line (0, 0, YRes, X);
|
||||
tgi_line (0, 0, X, YRes);
|
||||
tgi_line (YRes, YRes, 0, YRes-X);
|
||||
tgi_line (YRes, YRes, YRes-X, 0);
|
||||
for (X = 0; X <= MaxY; X += 10) {
|
||||
tgi_line (0, 0, MaxY, X);
|
||||
tgi_line (0, 0, X, MaxY);
|
||||
tgi_line (MaxY, MaxY, 0, MaxY-X);
|
||||
tgi_line (MaxY, MaxY, MaxY-X, 0);
|
||||
}
|
||||
|
||||
cgetc ();
|
||||
@ -212,8 +209,8 @@ int main (void)
|
||||
CheckError ("tgi_init");
|
||||
|
||||
/* Get stuff from the driver */
|
||||
XRes = tgi_getxres ();
|
||||
YRes = tgi_getyres ();
|
||||
MaxX = tgi_getmaxx ();
|
||||
MaxY = tgi_getmaxy ();
|
||||
|
||||
/* Set the palette, set the border color */
|
||||
Border = bordercolor (COLOR_BLACK);
|
||||
|
@ -1,37 +1,39 @@
|
||||
FEATURES {
|
||||
STARTADDRESS: default = $0800;
|
||||
STARTADDRESS: default = $0803;
|
||||
}
|
||||
MEMORY {
|
||||
ZP: start = $0080, size = $001A, define = yes;
|
||||
ZP: start = $0080, size = $001A, define = yes;
|
||||
HEADER: start = $0000, size = $0004, file = %O;
|
||||
RAM: start = %S, size = $9600 - %S, file = %O;
|
||||
RAM: start = %S, size = $9600 - %S, file = %O, define = yes;
|
||||
MOVE: start = $0000, size = $FFFF, file = %O, define = yes;
|
||||
LC: start = $D400, size = $0C00, define = yes;
|
||||
}
|
||||
SEGMENTS {
|
||||
EXEHDR: load = HEADER, type = ro;
|
||||
STARTUP: load = RAM, type = ro, define = yes;
|
||||
LOWCODE: load = RAM, type = ro, optional = yes;
|
||||
INIT: load = RAM, type = ro, define = yes, optional = yes;
|
||||
CODE: load = RAM, type = ro;
|
||||
RODATA: load = RAM, type = ro;
|
||||
DATA: load = RAM, type = rw;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
HEAP: load = RAM, type = bss, optional = yes; # must sit just below stack
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
EXEHDR: load = HEADER, type = ro;
|
||||
STARTUP: load = RAM, type = ro;
|
||||
LOWCODE: load = RAM, type = ro;
|
||||
CODE: load = RAM, type = ro;
|
||||
RODATA: load = RAM, type = ro;
|
||||
DATA: load = RAM, type = rw;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
INIT: load = MOVE, run = RAM, type = ro, define = yes;
|
||||
HIGHCODE: load = MOVE, run = LC, type = ro, optional = yes;
|
||||
}
|
||||
FEATURES {
|
||||
CONDES: segment = INIT,
|
||||
type = constructor,
|
||||
label = __CONSTRUCTOR_TABLE__,
|
||||
count = __CONSTRUCTOR_COUNT__;
|
||||
type = constructor,
|
||||
label = __CONSTRUCTOR_TABLE__,
|
||||
count = __CONSTRUCTOR_COUNT__;
|
||||
CONDES: segment = RODATA,
|
||||
type = destructor,
|
||||
label = __DESTRUCTOR_TABLE__,
|
||||
count = __DESTRUCTOR_COUNT__;
|
||||
type = destructor,
|
||||
label = __DESTRUCTOR_TABLE__,
|
||||
count = __DESTRUCTOR_COUNT__;
|
||||
CONDES: type = interruptor,
|
||||
segment = RODATA,
|
||||
label = __INTERRUPTOR_TABLE__,
|
||||
count = __INTERRUPTOR_COUNT__;
|
||||
segment = RODATA,
|
||||
label = __INTERRUPTOR_TABLE__,
|
||||
count = __INTERRUPTOR_COUNT__;
|
||||
}
|
||||
SYMBOLS {
|
||||
__STACKSIZE__ = $800; # 2K stack
|
||||
__STACKSIZE__ = $0800; # 2k stack
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user