1
0
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:
cuz 2008-03-16 09:37:22 +00:00
parent c7ddd12bba
commit feae688346
36 changed files with 1032 additions and 989 deletions

View File

@ -74,6 +74,7 @@ JOY_API_VERSION = $01
;------------------------------------------------------------------------------
; C callable functions
.global _joy_load_driver
.global _joy_unload
.global _joy_install
.global _joy_uninstall

View File

@ -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

View File

@ -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&nbsp;&rsqb;&lsqb; ProDOS 8 system program
for loading binary programs" available in the cc65 User Contributions section.
Please note that there is an 'Apple&nbsp;&rsqb;&lsqb; 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&nbsp;&rsqb;&lsqb; target.
@ -62,8 +62,9 @@ program generated by the linker for the Apple&nbsp;&rsqb;&lsqb; target.
<sect>Memory layout<p>
In the standard setup, cc65 generated programs use the memory from
&dollar;800 to &dollar;95FF, so 35.5K of memory are available. ROM calls are
possible without further precautions.
&dollar;803 to &dollar;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 &dollar;D400 to &dollar;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&times;40 with 16 colors. At the bottom of the screen, 4 additional text
lines are available.
This driver features a resolution of 40&times;48 with 16 colors.
<tag><tt/a2.hi.tgi/</tag>
This driver was written by Stefan Haubenthal. It features a resolution of
280&times;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&times;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 &dollar;803 to &dollar;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&nbsp;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&nbsp;II Card. Searches all Apple&nbsp;II slots
for an AppleMouse&nbsp;II Card compatible firmware. The default bounding
box is &lsqb;0..279,0..191&rsqb;. 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&nbsp;&rsqb;&lsqb; (in contrast to
an Apple&nbsp;//e).
box is &lsqb;0..279,0..191&rsqb;.
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&nbsp;&rsqb;&lsqb; (in contrast to an Apple&nbsp;//e) because the
AppleMouse&nbsp;II Card firmware writes to the hires page when initializing
on that machine.
Note that the Apple&nbsp;&rsqb;&lsqb; 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, &lt;slot&gt;)/ prior to
<tt/ser_open/ in order to select a different slot. <tt/ser_ioctl/ succeeds
for all Apple&nbsp;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&nbsp;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&nbsp;&rsqb;&lsqb; 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,

View File

@ -35,25 +35,25 @@ more information.
The standard binary output format generated by the linker for the
enhanced&nbsp;Apple&nbsp;//e target is a machine language program with a 4 byte DOS
3.3 header. The standard load address is &dollar;800.
3.3 header. The standard load address is &dollar;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&nbsp;&rsqb;&lsqb; ProDOS 8 system program
for loading binary programs" available in the cc65 User Contributions section.
Please note that there is an 'Apple&nbsp;&rsqb;&lsqb; 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&nbsp;Apple&nbsp;//e target.
@ -62,8 +62,9 @@ program generated by the linker for the enhanced&nbsp;Apple&nbsp;//e target.
<sect>Memory layout<p>
In the standard setup, cc65 generated programs use the memory from
&dollar;800 to &dollar;95FF, so 35.5K of memory are available. ROM calls are
possible without further precautions.
&dollar;803 to &dollar;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 &dollar;D400 to &dollar;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&times;40 with 16 colors. At the bottom of the screen, 4 additional text
lines are available.
This driver features a resolution of 40&times;48 with 16 colors.
<tag><tt/a2e.hi.tgi/</tag>
This driver was written by Stefan Haubenthal. It features a resolution of
280&times;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&times;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 &dollar;803 to &dollar;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&nbsp;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, &lt;slot&gt;)/ prior to
<tt/ser_open/ in order to select a different slot. <tt/ser_ioctl/ succeeds
for all Apple&nbsp;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&nbsp;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&nbsp;Apple&nbsp;//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,

View File

@ -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.

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
View 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

View File

@ -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

View File

@ -17,7 +17,6 @@ getfd:
cmp #MAX_FDS
bcs error
; Convert handle to fdtab slot
.assert .sizeof(FD) = 4, error
asl

View File

@ -6,7 +6,6 @@
;
.export _gotoxy, _gotox
.import popa, VTABZ
.include "apple2.inc"

View File

@ -5,7 +5,6 @@
;
.export _gotoy
.import VTABZ
.include "apple2.inc"

20
libsrc/apple2/home.s Normal file
View 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

View File

@ -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) {

View File

@ -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
View 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

View File

@ -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 {

View File

@ -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)) {

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -1,9 +0,0 @@
;
; Ullrich von Bassewitz, 2004-06-03
;
; Rom VTABZ routine
;
.export VTABZ
VTABZ := $FC24 ; Generate text base address

View File

@ -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
View 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

View File

@ -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

View File

@ -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 $@ $^

View File

@ -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)

View File

@ -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);

View File

@ -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
}