1
0
mirror of https://github.com/cc65/cc65.git synced 2025-08-13 08:25:28 +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 ; C callable functions
.global _joy_load_driver
.global _joy_unload .global _joy_unload
.global _joy_install .global _joy_install
.global _joy_uninstall .global _joy_uninstall

View File

@@ -40,9 +40,8 @@
TGI_MODE_160_200_4 ; 160x200, 4 colors TGI_MODE_160_200_4 ; 160x200, 4 colors
TGI_MODE_640_200_2 ; 640x200, 2 colors (b/w) TGI_MODE_640_200_2 ; 640x200, 2 colors (b/w)
TGI_MODE_640_480_2 ; 640x480, 2 colors (b/w) TGI_MODE_640_480_2 ; 640x480, 2 colors (b/w)
TGI_MODE_280_192_6 ; 280x192, 6 colors TGI_MODE_280_192_8 ; 280x192, 8 colors
TGI_MODE_560_192_2 ; 560x192, 2 colors TGI_MODE_40_48_16 ; 40x48, 16 colors
TGI_MODE_40_40_16 ; 40x40, 16 colors
.endenum .endenum

View File

@@ -35,25 +35,25 @@ more information.
The standard binary output format generated by the linker for the The standard binary output format generated by the linker for the
Apple ][ target is a machine language program with a 4 byte DOS 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 The DOS header is in its own segment named <tt/EXEHDR/. If you don't want the
header for some reason, you can change header for some reason, you can change
<verb> <verb>
HEADER: start = $0000, size = $4, file = %O; HEADER: start = $0000, size = $0004, file = %O;
</verb> </verb>
to to
<verb> <verb>
HEADER: start = $0000, size = $4, file = ""; HEADER: start = $0000, size = $0004, file = "";
</verb> </verb>
in the linker configuration to have the linker remove it. in the linker configuration to have the linker remove it.
Please note that there is a "Apple&nbsp;&rsqb;&lsqb; ProDOS 8 system program 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. 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 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. 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> <sect>Memory layout<p>
In the standard setup, cc65 generated programs use the memory from 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 &dollar;803 to &dollar;95FF, so 35.5KB of RAM are available. While running
possible without further precautions. <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: Special locations:
@@ -77,6 +78,32 @@ Special locations:
runtime stack. runtime stack.
</descrip><p> </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> <sect>Platform specific header files<p>
@@ -112,14 +139,19 @@ you cannot do it, it just means that there's no help.
<descrip> <descrip>
<tag><tt/a2.lo.tgi/</tag> <tag><tt/a2.lo.tgi/</tag>
This driver was written by Stefan Haubenthal. It features a resolution of This driver features a resolution of 40&times;48 with 16 colors.
40&times;40 with 16 colors. At the bottom of the screen, 4 additional text
lines are available.
<tag><tt/a2.hi.tgi/</tag> <tag><tt/a2.hi.tgi/</tag>
This driver was written by Stefan Haubenthal. It features a resolution of This driver features a resolution of 280&times;192 with 8 colors and two
280&times;192 with 6 colors. Note that programs using this driver will have hires pages. Note that programs using this driver will have to be linked
to be linked with <tt/--start-addr $4000/ to reserve the first hires page. 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> </descrip><p>
@@ -128,11 +160,12 @@ you cannot do it, it just means that there's no help.
<descrip> <descrip>
<tag><tt/a2.lc.emd/</tag> <tag><tt/a2.auxmem.emd/</tag>
Gives access to 12KB RAM (48 pages of 256 bytes each) on the Gives access to 47,5 KB RAM (190 pages of 256 bytes each) on an Extended
Apple&nbsp;II Language Card. The driver was contributed by Stefan Haubenthal. 80-Column Text Card.
Note that this driver is incompatible with any DOS using the Language
Card memory! 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> </descrip><p>
@@ -155,10 +188,13 @@ you cannot do it, it just means that there's no help.
<tag><tt/a2.stdmou.mou/</tag> <tag><tt/a2.stdmou.mou/</tag>
Driver for the AppleMouse&nbsp;II Card. Searches all Apple&nbsp;II slots Driver for the AppleMouse&nbsp;II Card. Searches all Apple&nbsp;II slots
for an AppleMouse&nbsp;II Card compatible firmware. The default bounding 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 box is &lsqb;0..279,0..191&rsqb;.
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 Programs using this driver will have to be linked with <tt/--start-addr $4000/
an Apple&nbsp;//e). 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 Note that the Apple&nbsp;&rsqb;&lsqb; default mouse callbacks support text
mode only. 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. flow control because of a full buffer.
The driver defaults to slot 2. Call <tt/ser_ioctl(0, &lt;slot&gt;)/ prior to 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 <tt/ser_open()/ in order to select a different slot. <tt/ser_ioctl()/
for all Apple&nbsp;II slots, but <tt/ser_open/ fails with 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. <tt/SER_ERR_NO_DEVICE/ if there's no SSC firmware found in the selected slot.
</descrip><p> </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: supported by BASIC, the following syntax was chosen:
<tscreen><verb> <tscreen><verb>
]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 ]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
</verb></tscreen> </verb></tscreen>
<enum> <enum>
@@ -216,10 +252,11 @@ supported by BASIC, the following syntax was chosen:
<sect1>Interrupts<p> <sect1>Interrupts<p>
The runtime for the Apple&nbsp;&rsqb;&lsqb; uses routines marked as <tt/.CONDES/ 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 type <tt/interruptor/ for ProDOS 8 interrupt handlers. Such routines must be
machine language subroutines and will be called automatically by the interrupt written as simple machine language subroutines and will be called automatically
handler code when they are linked into a program. See the discussion of the by the interrupt handler code when they are linked into a program. See the
<tt/.CONDES/ feature in the <htmlurl url="ca65.html" name="assembler manual">. 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> <sect>License<p>
This software is provided 'as-is', without any expressed or implied 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. arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, 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 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 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 The DOS header is in its own segment named <tt/EXEHDR/. If you don't want the
header for some reason, you can change header for some reason, you can change
<verb> <verb>
HEADER: start = $0000, size = $4, file = %O; HEADER: start = $0000, size = $0004, file = %O;
</verb> </verb>
to to
<verb> <verb>
HEADER: start = $0000, size = $4, file = ""; HEADER: start = $0000, size = $0004, file = "";
</verb> </verb>
in the linker configuration to have the linker remove it. in the linker configuration to have the linker remove it.
Please note that there is a "Apple&nbsp;&rsqb;&lsqb; ProDOS 8 system program 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. 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 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. 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> <sect>Memory layout<p>
In the standard setup, cc65 generated programs use the memory from 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 &dollar;803 to &dollar;95FF, so 35.5KB of RAM are available. While running
possible without further precautions. <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: Special locations:
@@ -77,6 +78,32 @@ Special locations:
runtime stack. runtime stack.
</descrip><p> </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> <sect>Platform specific header files<p>
@@ -114,14 +141,19 @@ you cannot do it, it just means that there's no help.
<descrip> <descrip>
<tag><tt/a2e.lo.tgi/</tag> <tag><tt/a2e.lo.tgi/</tag>
This driver was written by Stefan Haubenthal. It features a resolution of This driver features a resolution of 40&times;48 with 16 colors.
40&times;40 with 16 colors. At the bottom of the screen, 4 additional text
lines are available.
<tag><tt/a2e.hi.tgi/</tag> <tag><tt/a2e.hi.tgi/</tag>
This driver was written by Stefan Haubenthal. It features a resolution of This driver features a resolution of 280&times;192 with 8 colors and two
280&times;192 with 6 colors. Note that programs using this driver will have hires pages. Note that programs using this driver will have to be linked
to be linked with <tt/--start-addr $4000/ to reserve the first hires page. 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> </descrip><p>
@@ -130,11 +162,12 @@ you cannot do it, it just means that there's no help.
<descrip> <descrip>
<tag><tt/a2e.lc.emd/</tag> <tag><tt/a2e.auxmem.emd/</tag>
Gives access to 12KB RAM (48 pages of 256 bytes each) on the Gives access to 47,5 KB RAM (190 pages of 256 bytes each) on an Extended
Apple&nbsp;II Language Card. The driver was contributed by Stefan Haubenthal. 80-Column Text Card.
Note that this driver is incompatible with any DOS using the Language
Card memory! 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> </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. flow control because of a full buffer.
The driver defaults to slot 2. Call <tt/ser_ioctl(0, &lt;slot&gt;)/ prior to 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 <tt/ser_open()/ in order to select a different slot. <tt/ser_ioctl()/
for all Apple&nbsp;II slots, but <tt/ser_open/ fails with 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. <tt/SER_ERR_NO_DEVICE/ if there's no SSC firmware found in the selected slot.
</descrip><p> </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: supported by BASIC, the following syntax was chosen:
<tscreen><verb> <tscreen><verb>
]CALL2048:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5 ]CALL2051:REM ARG1 " ARG2 IS QUOTED" ARG3 "" ARG5
</verb></tscreen> </verb></tscreen>
<enum> <enum>
@@ -220,10 +253,11 @@ These are defined to be OpenApple + number key.
<sect1>Interrupts<p> <sect1>Interrupts<p>
The runtime for the enhanced&nbsp;Apple&nbsp;//e uses routines marked as <tt/.CONDES/ 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 type <tt/interruptor/ for ProDOS 8 interrupt handlers. Such routines must be
machine language subroutines and will be called automatically by the interrupt written as simple machine language subroutines and will be called automatically
handler code when they are linked into a program. See the discussion of the by the interrupt handler code when they are linked into a program. See the
<tt/.CONDES/ feature in the <htmlurl url="ca65.html" name="assembler manual">. 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> <sect>License<p>
This software is provided 'as-is', without any expressed or implied 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. arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, 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 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 address is used depends on the config file in use. For the builtin
configurations, only the "none" system honors an explicit start address, configurations, only the "none", "apple2" and "apple2enh" systems honor an
all other builtin config provide their own. explicit start address, all other builtin config provide their own.
<tag><tt>-V, --version</tt></tag> <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 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 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 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 /* 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
*/
#define COLOR_BLACK 0x00 #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 */ /* Characters codes */
#define CH_ENTER 0x0D #define CH_ENTER 0x0D
@@ -104,7 +123,7 @@ extern unsigned char _dos_type;
* ProDOS 8 1.6 - 0x16 * ProDOS 8 1.6 - 0x16
* ProDOS 8 1.7 - 0x17 * ProDOS 8 1.7 - 0x17
* ProDOS 8 1.8 - 0x18 * 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.1 - 0x21
* ProDOS 8 2.0.2 - 0x22 * ProDOS 8 2.0.2 - 0x22
* ProDOS 8 2.0.3 - 0x23 * 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_160_200_4 2U /* 160x200, 4 colors */
#define TGI_MODE_640_200_2 3U /* 640x200, 2 colors (b/w) */ #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_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 done
mv apple2/crt0.o apple2.o mv apple2/crt0.o apple2.o
cp apple2/apple2-auxmem.emd a2.auxmem.emd 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-stdjoy.joy a2.stdjoy.joy
cp apple2/apple2-stdmou.mou a2.stdmou.mou cp apple2/apple2-stdmou.mou a2.stdmou.mou
cp apple2/apple2-ssc.ser a2.ssc.ser cp apple2/apple2-ssc.ser a2.ssc.ser
cp apple2/apple2-40-40-16.tgi a2.lo.tgi cp apple2/apple2-280-192-8.tgi a2.hi.tgi
cp apple2/apple2-280-192-6.tgi a2.hi.tgi cp apple2/apple2-40-48-16.tgi a2.lo.tgi
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Apple //e # Apple //e
@@ -65,12 +64,11 @@ apple2enhlib:
done done
mv apple2enh/crt0.o apple2enh.o mv apple2enh/crt0.o apple2enh.o
cp apple2enh/apple2-auxmem.emd a2e.auxmem.emd 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-stdjoy.joy a2e.stdjoy.joy
cp apple2enh/apple2-stdmou.mou a2e.stdmou.mou cp apple2enh/apple2-stdmou.mou a2e.stdmou.mou
cp apple2enh/apple2-ssc.ser a2e.ssc.ser cp apple2enh/apple2-ssc.ser a2e.ssc.ser
cp apple2enh/apple2-40-40-16.tgi a2e.lo.tgi cp apple2enh/apple2-280-192-8.tgi a2e.hi.tgi
cp apple2enh/apple2-280-192-6.tgi a2e.hi.tgi cp apple2enh/apple2-40-48-16.tgi a2e.lo.tgi
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Atari # Atari

View File

@@ -57,6 +57,7 @@ S_OBJS= _scrsize.o \
close.o \ close.o \
clrscr.o \ clrscr.o \
color.o \ color.o \
cout.o \
cputc.o \ cputc.o \
crt0.o \ crt0.o \
ctype.o \ ctype.o \
@@ -75,6 +76,7 @@ S_OBJS= _scrsize.o \
get_ostype.o \ get_ostype.o \
gotoxy.o \ gotoxy.o \
gotoy.o \ gotoy.o \
home.o \
initcwd.o \ initcwd.o \
joy_stddrv.o \ joy_stddrv.o \
kbhit.o \ kbhit.o \
@@ -85,14 +87,9 @@ S_OBJS= _scrsize.o \
oserrlist.o \ oserrlist.o \
oserror.o \ oserror.o \
randomize.o \ randomize.o \
rcout.o \ rdkey.o \
read.o \ read.o \
revers.o \ revers.o \
rhome.o \
rom.o \
rpread.o \
rrdkey.o \
rvtabz.o \
rwcommon.o \ rwcommon.o \
syschdir.o \ syschdir.o \
sysmkdir.o \ sysmkdir.o \
@@ -102,6 +99,7 @@ S_OBJS= _scrsize.o \
systime.o \ systime.o \
sysuname.o \ sysuname.o \
tgi_mode_table.o\ tgi_mode_table.o\
vtabz.o \
wherex.o \ wherex.o \
wherey.o \ wherey.o \
write.o write.o
@@ -109,7 +107,7 @@ S_OBJS= _scrsize.o \
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# Drivers # Drivers
EMDS = apple2-auxmem.emd apple2-lc.emd EMDS = apple2-auxmem.emd
JOYS = apple2-stdjoy.joy JOYS = apple2-stdjoy.joy
@@ -117,7 +115,7 @@ MOUS = apple2-stdmou.mou
SERS = apple2-ssc.ser 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 # 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> ; Stefan Haubenthal <polluks@sdf.lonestar.org>
; Oliver Schmidt <ol.sc@web.de>
; Based on Maciej Witkowiak's circle routine ; Based on Maciej Witkowiak's circle routine
; ;
@@ -15,11 +16,23 @@
.macpack generic .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 TEXT := $F399 ; Return to text screen
HGR2 := $F3D8 ; Initialize and clear hi-res page 2.
HGR := $F3E2 ; Initialize and clear hi-res page 1. HGR := $F3E2 ; Initialize and clear hi-res page 1.
HCLR := $F3F2 ; Clear the current hi-res screen to black. 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 HPOSN := $F411 ; Positions the hi-res cursor without
; plotting a point. ; plotting a point.
; Enter with (A) = Y-coordinate, and ; Enter with (A) = Y-coordinate, and
@@ -33,30 +46,60 @@ HLIN := $F53A ; Draws a line from the last plotted
; point or line destination to: ; point or line destination to:
; (X,A) = X-coordinate, and ; (X,A) = X-coordinate, and
; (Y) = Y-coordinate. ; (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 DRAW := $F601 ; Draws a shape. Enter with (Y,X) = the
; address of the shape table, and (A) = ; address of the shape table, and (A) =
; the rotation factor. Uses the current ; the rotation factor. Uses the current
; color. ; 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) SETHCOL := $F6EC ; Set the hi-res color to (X), where (X)
; must be between 0 and 7. ; 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 ; First part of the header is a structure that has a magic and defines the
; capabilities of the driver ; capabilities of the driver
.byte $74, $67, $69 ; "tgi" .byte $74, $67, $69 ; "tgi"
.byte TGI_API_VERSION ; TGI API version number .byte TGI_API_VERSION ; TGI API version number
xres: .word 280 ; X resolution xres: .word 280 ; X resolution
yres: .word 192 ; Y resolution yres: .word 192 ; Y resolution
.byte 8 ; Number of drawing colors .byte 8 ; Number of drawing colors
.byte 2 ; Number of screens available .byte 2 ; Number of screens available
.byte 8 ; System font X size .byte 8 ; System font X size
.byte 8 ; System font Y size .byte 8 ; System font Y size
.res 4, $00 ; Reserved for future extensions .res 4, $00 ; Reserved for future extensions
; Next comes the jump table. Currently all entries must be valid and may point ; Next comes the jump table. Currently all entries must be valid and may point
; to an RTS for test versions (function not implemented). ; to an RTS for test versions (function not implemented).
@@ -81,55 +124,33 @@ yres: .word 192 ; Y resolution
.addr CIRCLE .addr CIRCLE
.addr TEXTSTYLE .addr TEXTSTYLE
.addr OUTTEXT .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 .bss
; 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
; Absolute variables used in the code ; 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 OGora: .res 2
OUkos: .res 2 OUkos: .res 2
Y3: .res 2 Y3: .res 2
; Text output stuff ; ------------------------------------------------------------------------
TEXTMAGX = $E7
TEXTMAGY = $E7 .rodata
TEXTDIR = $F9
; Constants and tables ; Constants and tables
.rodata DEFPALETTE: .byte $00, $01, $02, $03, $04, $05, $06, $07
DEFPALETTE: .byte $00, $05, $04, $01, $00, $08, $06, $01; 6 unique colors
SHAPE: .byte $64,$01,$D0,$00,$D5,$00,$DA,$00,$E0,$00,$EF,$00,$FE,$00,$0C,$01 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 .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 $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 .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
; INIT: Changes an already installed device from text mode to graphics mode.
; ------------------------------------------------------------------------
; 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.
; Note that INIT/DONE may be called multiple times while the driver ; 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 ; 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 ; to initializes variables and so on must go here. Setting palette and
@@ -249,153 +248,152 @@ UNINSTALL:
; kernel later. ; kernel later.
; The graphics kernel will never call INIT when a graphics mode is already ; The graphics kernel will never call INIT when a graphics mode is already
; active, so there is no need to protect against that. ; active, so there is no need to protect against that.
;
; Must set an error code: YES ; Must set an error code: YES
;
INIT: INIT:
.ifdef __APPLE2ENH__
; Save and clear 80 column store
lda RD80COL
sta Set80
sta CLR80COL
.endif
; Switch into graphics mode ; Switch into graphics mode
bit HIRES
jsr HGR
bit MIXCLR bit MIXCLR
bit TXTCLR
; Done, reset the error code ; Done, reset the error code
lda #TGI_ERR_OK lda #TGI_ERR_OK
sta ERROR 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 rts
; ------------------------------------------------------------------------
; DONE: Will be called to switch the graphics device back into text mode. ; 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, ; The graphics kernel will never call DONE when no graphics mode is active,
; so there is no need to protect against that. ; so there is no need to protect against that.
;
; Must set an error code: NO ; 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: Return the error code in A and clear it.
GETERROR: GETERROR:
ldx #TGI_ERR_OK
lda ERROR lda ERROR
ldx #TGI_ERR_OK
stx ERROR stx ERROR
rts rts
; ------------------------------------------------------------------------ ; CLEAR: Clears the screen.
; CONTROL: Platform/driver specific entry point. ; Must set an error code: NO
; CLEAR:
; Must set an error code: YES bit $C082 ; Switch in ROM
; jsr HCLR
bit $C080 ; Switch in LC bank 2 for R/O
CONTROL:
lda #TGI_ERR_INV_FUNC
sta ERROR
rts 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). ; 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. ; 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) ; Must set an error code: NO (will only be called if page ok)
;
SETVIEWPAGE: SETVIEWPAGE:
tax tax
beq @L1 .assert LOWSCR + 1 = HISCR, error
bit HISCR lda LOWSCR,x ; No BIT absolute,X available
rts
@L1: bit LOWSCR
rts rts
; ------------------------------------------------------------------------
; SETDRAWPAGE: Set the drawable page. Called with the new page in A (0..n). ; 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. ; 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) ; Must set an error code: NO (will only be called if page ok)
;
SETDRAWPAGE: SETDRAWPAGE:
tax tax
beq @L1 beq :+
lda #>$4000 ; Page 2 lda #>$4000 ; Page 2
.byte $2C .byte $2C ; BIT absolute
@L1: lda #>$2000 ; Page 1 : lda #>$2000 ; Page 1
sta $E6 sta PAGE
rts rts
; ------------------------------------------------------------------------
; SETCOLOR: Set the drawing color (in A). The new color is already checked ; SETCOLOR: Set the drawing color (in A). The new color is already checked
; to be in a valid range (0..maxcolor-1). ; to be in a valid range (0..maxcolor-1).
;
; Must set an error code: NO (will only be called if color ok) ; Must set an error code: NO (will only be called if color ok)
;
SETCOLOR: SETCOLOR:
bit $C082 ; Switch in ROM
tax 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). ; 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 ; A pointer to the palette is passed in ptr1. Must set an error if palettes
; are not supported ; are not supported
;
; Must set an error code: YES ; Must set an error code: YES
;
SETPALETTE: SETPALETTE:
lda #TGI_ERR_INV_FUNC lda #TGI_ERR_INV_FUNC
sta ERROR sta ERROR
rts rts
; ------------------------------------------------------------------------
; GETPALETTE: Return the current palette in A/X. Even drivers that cannot ; 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 ; set the palette should return the default palette here, so there's no
; way for this function to fail. ; way for this function to fail.
;
; Must set an error code: NO ; Must set an error code: NO
;
GETPALETTE: GETPALETTE:
; Fall through
; ------------------------------------------------------------------------
; GETDEFPALETTE: Return the default palette for the driver in A/X. All ; GETDEFPALETTE: Return the default palette for the driver in A/X. All
; drivers should return something reasonable here, even drivers that don't ; drivers should return something reasonable here, even drivers that don't
; support palettes, otherwise the caller has no way to determine the colors ; support palettes, otherwise the caller has no way to determine the colors
; of the (not changeable) palette. ; of the (not changeable) palette.
;
; Must set an error code: NO (all drivers must have a default palette) ; Must set an error code: NO (all drivers must have a default palette)
;
GETDEFPALETTE: GETDEFPALETTE:
lda #<DEFPALETTE lda #<DEFPALETTE
ldx #>DEFPALETTE ldx #>DEFPALETTE
rts rts
; ------------------------------------------------------------------------
; SETPIXEL: Draw one pixel at X1/Y1 = ptr1/ptr2 with the current drawing ; SETPIXEL: Draw one pixel at X1/Y1 = ptr1/ptr2 with the current drawing
; color. The coordinates passed to this function are never outside the ; color. The coordinates passed to this function are never outside the
; visible screen area, so there is no need for clipping inside this function. ; visible screen area, so there is no need for clipping inside this function.
;
; Must set an error code: NO ; 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: SETPIXELCLIP:
lda Y1+1 lda Y1+1
bmi @finito ; y<0 bmi :+ ; y < 0
lda X1+1 lda X1+1
bmi @finito ; x<0 bmi :+ ; x < 0
lda X1 lda X1
ldx X1+1 ldx X1+1
sta ADDR sta ADDR
@@ -404,7 +402,7 @@ SETPIXELCLIP:
lda xres lda xres
ldy xres+1 ldy xres+1
jsr icmp ; ( x < xres ) ... jsr icmp ; ( x < xres ) ...
bcs @finito bcs :+
lda Y1 lda Y1
ldx Y1+1 ldx Y1+1
sta ADDR sta ADDR
@@ -414,64 +412,33 @@ SETPIXELCLIP:
ldy yres+1 ldy yres+1
jsr icmp ; ... && ( y < yres ) jsr icmp ; ... && ( y < yres )
bcc SETPIXEL 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 ; 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 ; coordinates passed to this function are never outside the visible screen
; area, so there is no need for clipping inside this function. ; area, so there is no need for clipping inside this function.
GETPIXEL: GETPIXEL:
bit $C082 ; Switch in ROM
ldx X1 ldx X1
ldy X1+1 ldy X1+1
lda Y1 lda Y1
jsr HPOSN ; 1st pixel jsr HPOSN
HBASL = $26
HMASK = $30
ldx #$00
lda (HBASL),y lda (HBASL),y
and HMASK and HMASK
beq @L1 asl
inx beq :+ ; 0 (black)
@L1: stx tmp1 lda #$03 ; 3 (white)
: bcc :+
lda $E0 ; which neighbour adc #$03 ; += 4 (black -> black2, white -> white2)
tax : ldx #$00
and #$01 bit $C080 ; Switch in LC bank 2 for R/O
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
rts rts
; ------------------------------------------------------------------------
; LINE: Draw a line from X1/Y1 to X2/Y2, where X1/Y1 = ptr1/ptr2 and ; 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. ; X2/Y2 = ptr3/ptr4 using the current drawing color.
;
; Must set an error code: NO ; Must set an error code: NO
;
LINE: LINE:
bit $C082 ; Switch in ROM
ldx X1 ldx X1
ldy X1+1 ldy X1+1
lda Y1 lda Y1
@@ -479,9 +446,10 @@ LINE:
lda X2 lda X2
ldx X2+1 ldx X2+1
ldy Y2 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 ; 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. ; 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 ; Contrary to most other functions, the graphics kernel will sort and clip
@@ -493,13 +461,10 @@ LINE:
; (X2 >= 0) && (X2 < XRES) ; (X2 >= 0) && (X2 < XRES)
; (Y1 >= 0) && (Y1 < YRES) ; (Y1 >= 0) && (Y1 < YRES)
; (Y2 >= 0) && (Y2 < YRES) ; (Y2 >= 0) && (Y2 < YRES)
;
; Must set an error code: NO ; Must set an error code: NO
;
BAR: BAR:
inc Y2 inc Y2
@L1: lda Y2 : lda Y2
pha pha
lda Y1 lda Y1
sta Y2 sta Y2
@@ -508,30 +473,27 @@ BAR:
sta Y2 sta Y2
inc Y1 inc Y1
cmp Y1 cmp Y1
bne @L1 bne :-
rts rts
; ------------------------------------------------------------------------
; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the ; CIRCLE: Draw a circle around the center X1/Y1 (= ptr1/ptr2) with the
; radius in tmp1 and the current drawing color. ; radius in tmp1 and the current drawing color.
;
; Must set an error code: NO ; Must set an error code: NO
;
CIRCLE: CIRCLE:
lda RADIUS lda RADIUS
bne @L1 bne :+
jmp SETPIXELCLIP ; Plot as a point jmp SETPIXELCLIP ; Plot as a point
: sta XX
@L1: sta XX ; x = r
; x = r;
lda #$00 lda #$00
sta XX+1 sta XX+1
sta YY sta YY
sta YY+1 sta YY+1
sta MaxO sta MaxO
sta MaxO+1 sta MaxO+1
; y =0; mo=0;
; y = 0, mo = 0
lda X1 lda X1
ldx X1+1 ldx X1+1
sta XS sta XS
@@ -541,97 +503,98 @@ CIRCLE:
sta YS sta YS
stx YS+1 ; XS/YS to remember the center stx YS+1 ; XS/YS to remember the center
; while (y<x) { ; while (y < x) {
@L013B: ldx #YY while: ldx #YY
lda XX lda XX
ldy XX+1 ldy XX+1
jsr icmp jsr icmp
bcc @L12 bcc :+
rts rts
@L12: ; plot points in 8 slices...
lda XS ; Plot points in 8 slices...
: lda XS
add XX add XX
sta X1 sta X1
lda XS+1 lda XS+1
adc XX+1 adc XX+1
sta X1+1 ; x1 = xs+x sta X1+1 ; x1 = xs + x
lda YS lda YS
add YY add YY
sta Y1 sta Y1
pha pha
lda YS+1 lda YS+1
adc YY+1 adc YY+1
sta Y1+1 ; (stack)=ys+y, y1=(stack) sta Y1+1 ; (stack) = ys + y, y1 = (stack)
pha pha
jsr SETPIXELCLIP ; plot(xs+x,ys+y) jsr SETPIXELCLIP ; plot (xs + x, ys + y)
lda YS lda YS
sub YY sub YY
sta Y1 sta Y1
sta Y3 sta Y3
lda YS+1 lda YS+1
sbc YY+1 sbc YY+1
sta Y1+1 ; y3 = y1 = ys-y sta Y1+1 ; y3 = y1 = ys - y
sta Y3+1 sta Y3+1
jsr SETPIXELCLIP ; plot(xs+x,ys-y) jsr SETPIXELCLIP ; plot (xs + x, ys - y)
pla pla
sta Y1+1 sta Y1+1
pla pla
sta Y1 ; y1 = ys+y sta Y1 ; y1 = ys + y
lda XS lda XS
sub XX sub XX
sta X1 sta X1
lda XS+1 lda XS+1
sbc XX+1 sbc XX+1
sta X1+1 sta X1+1
jsr SETPIXELCLIP ; plot (xs-x,ys+y) jsr SETPIXELCLIP ; plot (xs - x, ys + y)
lda Y3 lda Y3
sta Y1 sta Y1
lda Y3+1 lda Y3+1
sta Y1+1 sta Y1+1
jsr SETPIXELCLIP ; plot (xs-x,ys-y) jsr SETPIXELCLIP ; plot (xs - x, ys - y)
lda XS lda XS
add YY add YY
sta X1 sta X1
lda XS+1 lda XS+1
adc YY+1 adc YY+1
sta X1+1 ; x1 = xs+y sta X1+1 ; x1 = xs + y
lda YS lda YS
add XX add XX
sta Y1 sta Y1
pha pha
lda YS+1 lda YS+1
adc XX+1 adc XX+1
sta Y1+1 ; (stack)=ys+x, y1=(stack) sta Y1+1 ; (stack) = ys + x, y1 = (stack)
pha pha
jsr SETPIXELCLIP ; plot(xs+y,ys+x) jsr SETPIXELCLIP ; plot (xs + y, ys + x)
lda YS lda YS
sub XX sub XX
sta Y1 sta Y1
sta Y3 sta Y3
lda YS+1 lda YS+1
sbc XX+1 sbc XX+1
sta Y1+1 ; y3 = y1 = ys-x sta Y1+1 ; y3 = y1 = ys - x
sta Y3+1 sta Y3+1
jsr SETPIXELCLIP ; plot(xs+y,ys-x) jsr SETPIXELCLIP ; plot (xs + y, ys - x)
pla pla
sta Y1+1 sta Y1+1
pla pla
sta Y1 ; y1 = ys+x(stack) sta Y1 ; y1 = ys + x(stack)
lda XS lda XS
sub YY sub YY
sta X1 sta X1
lda XS+1 lda XS+1
sbc YY+1 sbc YY+1
sta X1+1 sta X1+1
jsr SETPIXELCLIP ; plot (xs-y,ys+x) jsr SETPIXELCLIP ; plot (xs - y, ys + x)
lda Y3 lda Y3
sta Y1 sta Y1
lda Y3+1 lda Y3+1
sta Y1+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 lda MaxO
ldx MaxO+1 ldx MaxO+1
add YY add YY
@@ -647,11 +610,12 @@ CIRCLE:
tax tax
tya tya
add #$01 add #$01
bcc @L0143 bcc :+
inx inx
@L0143: sta OGora : sta OGora
stx OGora+1 stx OGora+1
; ou = og-x-x+1
; ou = og - x - x + 1
sub XX sub XX
tay tay
txa txa
@@ -665,16 +629,18 @@ CIRCLE:
tax tax
tya tya
add #$01 add #$01
bcc @L0146 bcc :+
inx inx
@L0146: sta OUkos : sta OUkos
stx OUkos+1 stx OUkos+1
; ++y
; ++y
inc YY inc YY
bne @L0148 bne :+
inc YY+1 inc YY+1
@L0148: ; if (abs(ou)<abs(og))
lda OUkos ; if (abs (ou) < abs (og)) {
: lda OUkos
ldy OUkos+1 ldy OUkos+1
jsr abs jsr abs
sta TEMP3 sta TEMP3
@@ -684,52 +650,47 @@ CIRCLE:
jsr abs jsr abs
ldx #TEMP3 ldx #TEMP3
jsr icmp jsr icmp
bpl @L0149 bpl :++
; { --x;
; --x
lda XX lda XX
sub #$01 sub #$01
sta XX sta XX
bcs @L014E bcs :+
dec XX+1 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 ; 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. ; direction is passend in X/Y, the text direction is passed in A.
;
; Must set an error code: NO ; Must set an error code: NO
;
TEXTSTYLE: TEXTSTYLE:
stx TEXTMAGX stx SCALE
sty TEXTMAGY asl ; 16 <=> 90þ
asl ; 16 <=> 90þ
asl asl
asl asl
asl asl
sta TEXTDIR sta ROT
rts rts
; ------------------------------------------------------------------------
; OUTTEXT: Output text at X/Y = ptr1/ptr2 using the current color and the ; 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 ; current text style. The text to output is given as a zero terminated
; string with address in ptr3. ; string with address in ptr3.
;
; Must set an error code: NO ; Must set an error code: NO
;
OUTTEXT: OUTTEXT:
bit $C082 ; Switch in ROM
ldx X1 ldx X1
ldy X1+1 ldy X1+1
lda Y1 lda Y1
@@ -742,10 +703,10 @@ OUTTEXT:
sta tmp3+1 sta tmp3+1
ldy #$00 ldy #$00
@L1: lda (ptr3),y : lda (ptr3),y
beq @end beq :+
sub #$1F ; no controls sub #$1F ; No controls
asl ; offset*2 asl ; Offset * 2
tax tax
lda SHAPE,x lda SHAPE,x
add #<SHAPE add #<SHAPE
@@ -757,26 +718,25 @@ OUTTEXT:
pha pha
ldx tmp1 ldx tmp1
ldy tmp1+1 ldy tmp1+1
lda TEXTDIR lda ROT
jsr DRAW jsr DRAW
ldx tmp3 ldx tmp3
ldy tmp3+1 ldy tmp3+1
lda TEXTDIR lda ROT
jsr DRAW jsr DRAW
pla pla
tay tay
iny iny
bne @L1 bne :-
@end: rts : bit $C080 ; Switch in LC bank 2 for R/O
rts
;------------- ; Copies of some runtime routines
; copies of some runtime routines
abs: abs:
; a/y := abs(a/y) ; A/Y := abs (A/Y)
cpy #$00 cpy #$00
bpl @L1 bpl :+
; negay
clc clc
eor #$FF eor #$FF
adc #$01 adc #$01
@@ -786,10 +746,10 @@ abs:
adc #$00 adc #$00
tay tay
pla pla
@L1: rts : rts
icmp: icmp:
; compare a/y to zp,x ; Compare A/Y to zp,X
sta TEMP ; TEMP/TEMP2 - arg2 sta TEMP ; TEMP/TEMP2 - arg2
sty TEMP2 sty TEMP2
lda $00,x lda $00,x
@@ -798,16 +758,16 @@ icmp:
tay tay
pla pla
tax tax
tya ; x/a - arg1 (a=high) tya ; X/A - arg1 (a = high)
sub TEMP2 sub TEMP2
bne @L4 bne :++
cpx TEMP cpx TEMP
beq @L3 beq :+
adc #$FF adc #$FF
ora #$01 ora #$01
@L3: rts : rts
@L4: bvc @L3 : bvc :+
eor #$FF eor #$FF
ora #$01 ora #$01
rts : rts

View File

@@ -1,8 +1,9 @@
; ;
; Standard joystick driver for the Apple ][. May be used multiple times when ; Standard joystick driver for the Apple ][. May be used multiple times
; linked to the statically application. ; when statically linked to the application.
; ;
; Ullrich von Bassewitz, 2003-05-02 ; Ullrich von Bassewitz, 2003-05-02
; Oliver Schmidt, 2008-02-25
; Using the readjoy code from Stefan Haubenthal ; Using the readjoy code from Stefan Haubenthal
; ;
@@ -14,121 +15,117 @@
.macpack generic .macpack generic
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Constants ; Constants
OFFS = 10 THRESHOLD = 20 ; Deviation from center triggering movement
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; ROM entry points ; ROM entry points
PREAD := $FB1E ; Read paddle in X, return AD conv. value in Y 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 ; Driver signature
.byte $6A, $6F, $79 ; "joy" .byte $6A, $6F, $79 ; "joy"
.byte JOY_API_VERSION ; Driver API version number .byte JOY_API_VERSION ; Driver API version number
; Button state masks (8 values) ; Button state masks (8 values)
.byte $40
.byte $80
.byte $10 .byte $10
.byte $20 .byte $20
.byte $04
.byte $08 .byte $08
.byte $00 ; FIRE2 not available .byte $40
.byte $00 ; Future expansion .byte $80
.byte $00 ; Future expansion .byte $00 ; Future expansion
.byte $00 ; Future expansion
; Jump table. ; Jump table
.addr INSTALL .addr INSTALL
.addr UNINSTALL .addr UNINSTALL
.addr COUNT .addr COUNT
.addr READJOY .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 ; INSTALL routine. Is called after the driver is loaded into memory. If
; possible, check if the hardware is present and determine the amount of ; possible, check if the hardware is present and determine the amount of
; memory available. ; memory available.
; Must return an JOY_ERR_xx code in a/x. ; Must return an JOY_ERR_xx code in a/x.
;
INSTALL: INSTALL:
lda #<JOY_ERR_OK lda #<JOY_ERR_OK
ldx #>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. ; UNINSTALL routine. Is called before the driver is removed from memory.
; Can do cleanup or whatever. Must not return anything. ; Can do cleanup or whatever. Must not return anything.
;
UNINSTALL: UNINSTALL:
rts rts
; ------------------------------------------------------------------------
; COUNT: Return the total number of available joysticks in a/x. ; COUNT: Return the total number of available joysticks in a/x.
;
COUNT: COUNT:
lda #<JOY_COUNT lda #$02 ; Number of joysticks we support
ldx #>JOY_COUNT ldx #$00
rts rts
; ------------------------------------------------------------------------
; READ: Read a particular joystick passed in A. ; READ: Read a particular joystick passed in A.
;
READJOY: READJOY:
and #$01 ; Fix joystick number bit $C082 ; Switch in ROM
asl a ; and #$01 ; Restrict joystick number
tax ; Joystick number (0,2) into X
; Read joystick ; Read horizontal paddle
asl ; Joystick number -> paddle number
lda BUTN0,x ; Check fire button tax ; Set paddle number (0, 2)
and #$80 ; BTN 0 0 0 0 0 0 0 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 pha
jsr PREAD ; Read first paddle value inx ; Set paddle number (1, 3)
jsr PREAD ; Read paddle value
pla pla
cpy #127-OFFS cpy #127 - THRESHOLD
ror a ; /LEFT BTN 0 0 0 0 0 0 ror ; !UP RIGHT !LEFT 0 0 0 0 0
cpy #127+OFFS cpy #127 + THRESHOLD
ror a ; RIGHT /LEFT BTN 0 0 0 0 0 ror ; DOWN !UP RIGHT !LEFT 0 0 0 0
inx ; Read primary button
pha tay
jsr PREAD ; Read second paddle lda BUTN0-1,x ; Check button (1, 3)
pla asl
cpy #127-OFFS tya
ror a ; /UP RIGHT /LEFT BTN 0 0 0 0 ror ; FIRE DOWN !UP RIGHT !LEFT 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
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 rts

View File

@@ -147,31 +147,16 @@ next: inc ptr1+1
asl asl
sta yparam+1 sta yparam+1
.ifdef __APPLE2ENH__ ; The AppleMouse II Card needs the ROM switched in
; 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
; to be able to detect an Apple //e and use RDVBL ; to be able to detect an Apple //e and use RDVBL
sta ROMIN ; STA keeps LC write state bit $C082
.endif
; Reset mouse hardware ; Reset mouse hardware
ldx #INITMOUSE ldx #INITMOUSE
jsr firmware jsr firmware
.ifdef __APPLE2ENH__ ; Switch in LC bank 2 for R/O
; Restore LC read state bit $C080
plx
sta $C000,x ; STA keeps LC write state
.endif
; Turn mouse on ; Turn mouse on
lda #%00000001 lda #%00000001

View File

@@ -34,6 +34,7 @@ KBDSTRB := $C010 ; Clear keyboard strobe
; 80 column video switches ; 80 column video switches
CLR80COL:= $C000 ; Disable 80 column store CLR80COL:= $C000 ; Disable 80 column store
SET80COL:= $C001 ; Enable 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 RD80VID := $C01F ; >127 if 80 column video enabled
; Character set switches ; Character set switches
@@ -49,6 +50,8 @@ LCBANK2 := $C083 ; Swap in LC bank 2
LCBANK1 := $C08B ; Swap in LC bank 1 LCBANK1 := $C08B ; Swap in LC bank 1
; Video mode switches ; Video mode switches
TXTCLR := $C050 ; Display graphics
TXTSET := $C051 ; Display text
MIXCLR := $C052 ; Disable 4 lines of text MIXCLR := $C052 ; Disable 4 lines of text
MIXSET := $C053 ; Enable 4 lines of text MIXSET := $C053 ; Enable 4 lines of text
LOWSCR := $C054 ; Page 1 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 zerobss
.import initlib, donelib .import initlib, donelib
.import callmain, callirq .import callmain, callirq
.import COUT .import __RAM_START__ , __RAM_LAST__ ; Linker generated
.import __STARTUP_LOAD__, __BSS_LOAD__ ; 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 .import __INTERRUPTOR_COUNT__ ; Linker generated
.include "zeropage.inc" .include "zeropage.inc"
.include "apple2.inc" .include "apple2.inc"
.include "mli.inc"
.linecont +
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
.segment "EXEHDR" .segment "EXEHDR"
.addr __STARTUP_LOAD__ ; Start address .addr __RAM_START__ ; Start address
.word __BSS_LOAD__ - __STARTUP_LOAD__ ; Size .word __BSS_RUN__ - __RAM_START__ + \
__MOVE_LAST__ - __MOVE_START__ ; Size
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
@@ -33,13 +37,64 @@
ldx #$FF ldx #$FF
txs ; Init stack pointer 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 jsr init
; Avoid re-entrance of donelib. This is also the _exit entry ; Avoid re-entrance of donelib. This is also the _exit entry
_exit: ldx #<exit _exit: ldx #<exit
lda #>exit lda #>exit
jsr reset ; Setup RESET vector jsr reset ; Setup RESET vector
; Switch in ROM in case it wasn't already switched in by a RESET
bit $C082
; Call module destructors ; Call module destructors
jsr donelib jsr donelib
@@ -50,7 +105,7 @@ _exit: ldx #<exit
; Deallocate interrupt vector table entry ; Deallocate interrupt vector table entry
dec params ; Adjust parameter count dec params ; Adjust parameter count
jsr ENTRY jsr $BF00 ; MLI call entry point
.byte $41 ; Dealloc interrupt .byte $41 ; Dealloc interrupt
.addr params .addr params
@@ -88,6 +143,9 @@ init: ldx #zpspace-1
dex dex
bpl :- bpl :-
; Clear the BSS data
jsr zerobss
; Save the original RESET vector ; Save the original RESET vector
ldx #$02 ldx #$02
: lda SOFTEV,x : lda SOFTEV,x
@@ -102,9 +160,6 @@ init: ldx #zpspace-1
lda #>_exit lda #>_exit
jsr reset ; Setup RESET vector jsr reset ; Setup RESET vector
; Clear the BSS data
jsr zerobss
; Setup the stack ; Setup the stack
lda HIMEM lda HIMEM
sta sp sta sp
@@ -116,12 +171,12 @@ init: ldx #zpspace-1
beq :+ beq :+
; Check for ProDOS ; Check for ProDOS
lda ENTRY lda $BF00 ; MLI call entry point
cmp #$4C ; Is MLI present? (JMP opcode) cmp #$4C ; Is MLI present? (JMP opcode)
bne prterr bne prterr
; Allocate interrupt vector table entry ; Allocate interrupt vector table entry
jsr ENTRY jsr $BF00 ; MLI call entry point
.byte $40 ; Alloc interrupt .byte $40 ; Alloc interrupt
.addr params .addr params
bcs prterr bcs prterr
@@ -133,13 +188,16 @@ init: ldx #zpspace-1
; Call module constructors ; Call module constructors
: jsr initlib : jsr initlib
; Switch in LC bank 2 for R/O
bit $C080
; Push arguments and call main() ; Push arguments and call main()
jmp callmain jmp callmain
; Print error message and return ; Print error message and return
prterr: ldx #msglen-1 prterr: ldx #msglen-1
: lda errmsg,x : lda errmsg,x
jsr COUT jsr $FDED ; COUT
dex dex
bpl :- bpl :-
rts rts
@@ -184,10 +242,6 @@ intrpt: cld
: sec : sec
rts rts
; ------------------------------------------------------------------------
.code
; Setup RESET vector ; Setup RESET vector
reset: stx SOFTEV reset: stx SOFTEV
sta SOFTEV+1 sta SOFTEV+1
@@ -201,8 +255,12 @@ reset: stx SOFTEV
zpsave: .res zpspace zpsave: .res zpspace
rvsave: .res 3
params: .byte $02 ; Parameter count params: .byte $02 ; Parameter count
intnum: .byte $00 ; Interrupt number 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 cmp #MAX_FDS
bcs error bcs error
; Convert handle to fdtab slot ; Convert handle to fdtab slot
.assert .sizeof(FD) = 4, error .assert .sizeof(FD) = 4, error
asl asl

View File

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

View File

@@ -5,7 +5,6 @@
; ;
.export _gotoy .export _gotoy
.import VTABZ .import VTABZ
.include "apple2.inc" .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 */ /* Alloc DIR */
if ((dir = malloc (sizeof (*dir))) == NULL) { 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 */ /* Search for the next active directory entry */
do { do {

View File

@@ -44,7 +44,7 @@
void __fastcall__ rewinddir (DIR* dir) void __fastcall__ rewinddir (register DIR* dir)
{ {
/* Rewind directory file */ /* Rewind directory file */
if (lseek (dir->fd, 0, SEEK_SET)) { 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 ; BEWARE: The current implementation of tgi_map_mode does not work with tables
; larger that 255 bytes! ; larger that 255 bytes!
.rodata .rodata
_tgi_mode_table: _tgi_mode_table:
.ifdef __APPLE2ENH__ .ifdef __APPLE2ENH__
.byte TGI_MODE_280_192_6, "A2E.HI.TGI", 0 .byte TGI_MODE_280_192_8, "A2E.HI.TGI", 0
.byte TGI_MODE_40_40_16, "A2E.LO.TGI", 0 .byte TGI_MODE_40_48_16, "A2E.LO.TGI", 0
; .byte TGI_MODE_560_192_2, "A2E.DHI.TGI", 0
.else .else
.byte TGI_MODE_280_192_6, "A2.HI.TGI", 0 .byte TGI_MODE_280_192_8, "A2.HI.TGI", 0
.byte TGI_MODE_40_40_16, "A2.LO.TGI", 0 .byte TGI_MODE_40_48_16, "A2.LO.TGI", 0
; .byte TGI_MODE_560_192_2, "A2.DHI.TGI", 0
.endif .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 \ close.o \
clrscr.o \ clrscr.o \
color.o \ color.o \
cout.o \
cputc.o \ cputc.o \
crt0.o \ crt0.o \
ctype.o \ ctype.o \
@@ -75,6 +76,7 @@ S_OBJS= _scrsize.o \
get_ostype.o \ get_ostype.o \
gotoxy.o \ gotoxy.o \
gotoy.o \ gotoy.o \
home.o \
initcwd.o \ initcwd.o \
joy_stddrv.o \ joy_stddrv.o \
kbhit.o \ kbhit.o \
@@ -85,14 +87,9 @@ S_OBJS= _scrsize.o \
oserrlist.o \ oserrlist.o \
oserror.o \ oserror.o \
randomize.o \ randomize.o \
rcout.o \ rdkey.o \
read.o \ read.o \
revers.o \ revers.o \
rhome.o \
rom.o \
rpread.o \
rrdkey.o \
rvtabz.o \
rwcommon.o \ rwcommon.o \
syschdir.o \ syschdir.o \
sysmkdir.o \ sysmkdir.o \
@@ -103,6 +100,7 @@ S_OBJS= _scrsize.o \
sysuname.o \ sysuname.o \
textframe.o \ textframe.o \
tgi_mode_table.o\ tgi_mode_table.o\
vtabz.o \
wherex.o \ wherex.o \
wherey.o \ wherey.o \
write.o write.o
@@ -110,7 +108,7 @@ S_OBJS= _scrsize.o \
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# Drivers # Drivers
EMDS = apple2-auxmem.emd apple2-lc.emd EMDS = apple2-auxmem.emd
JOYS = apple2-stdjoy.joy JOYS = apple2-stdjoy.joy
@@ -118,7 +116,7 @@ MOUS = apple2-stdmou.mou
SERS = apple2-ssc.ser 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 # Targets

View File

@@ -83,7 +83,7 @@ gunzip65: $(CRT0) gunzip65.o $(CLIB)
hello: $(CRT0) hello.o $(CLIB) hello: $(CRT0) hello.o $(CLIB)
@$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ @$(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" ifeq "$(SYS)" "apple2"
mandelbrot: $(CRT0) mandelbrot.o $(CLIB) mandelbrot: $(CRT0) mandelbrot.o $(CLIB)
@$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^
@@ -115,7 +115,7 @@ plasma: $(CRT0) plasma.o $(CLIB)
sieve: $(CRT0) sieve.o $(CLIB) sieve: $(CRT0) sieve.o $(CLIB)
@$(LD) -t $(SYS) -m $(basename $@).map -o $@ $^ @$(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" ifeq "$(SYS)" "apple2"
tgidemo: $(CRT0) tgidemo.o $(CLIB) tgidemo: $(CRT0) tgidemo.o $(CLIB)
@$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^ @$(LD) -t $(SYS) -m $(basename $@).map --start-addr 0x4000 -o $@ $^

View File

@@ -15,13 +15,13 @@
/* Graphics definitions */ /* Graphics definitions */
#if defined(__APPLE2__) || defined(__APPLE2ENH__) #if defined(__APPLE2__) || defined(__APPLE2ENH__)
# define GRAPHMODE TGI_MODE_280_192_6 # define GRAPHMODE TGI_MODE_280_192_8
#else #else
# define GRAPHMODE TGI_MODE_320_200_2 # define GRAPHMODE TGI_MODE_320_200_2
#endif #endif
#define SCREEN_X (tgi_getmaxx()+1) #define SCREEN_X (tgi_getxres())
#define SCREEN_Y (tgi_getmaxy()+1) #define SCREEN_Y (tgi_getyres())
#define MAXCOL (tgi_getmaxcolor()+1) #define MAXCOL (tgi_getcolorcount())
#define maxiterations 32 #define maxiterations 32
#define fpshift (10) #define fpshift (10)

View File

@@ -8,15 +8,12 @@
#if defined(__APPLE2__) || defined(__APPLE2ENH__) #if defined(__APPLE2__) || defined(__APPLE2ENH__)
# define TGI_MODE TGI_MODE_280_192_6 # define TGI_MODE TGI_MODE_280_192_8
# define PAL_BACK 0
# define PAL_FORE 3
# define COLOR_LIGHTRED 0 /* Dummy */
#else #else
# define TGI_MODE TGI_MODE_320_200_2 # define TGI_MODE TGI_MODE_320_200_2
# define PAL_BACK 0
# define PAL_FORE 1
#endif #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, 0x22,0x20,0x1F,0x1E,0x1D,0x1C,0x1B,0x1A,0x19,0x18,
0x17,0x16,0x15,0x14,0x13,0x12,0x12,0x11,0x10,0x10, 0x17,0x16,0x15,0x14,0x13,0x12,0x12,0x11,0x10,0x10,
0x0F,0x0E,0x0E,0x0D,0x0D,0x0C,0x0C,0x0C,0x0B,0x0B, 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, 0x0B,0x0B,0x0B,0x0C,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,
0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16, 0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20, 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, 0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,
0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB6,0xB7,0xB8,0xB8, 0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB6,0xB7,0xB8,0xB8,
0xB9,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xBD,0xBD, 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, 0xBD,0xBD,0xBD,0xBC,0xBC,0xBC,0xBB,0xBB,0xBA,0xBA,
0xB9,0xB8,0xB8,0xB7,0xB6,0xB6,0xB5,0xB4,0xB3,0xB2, 0xB9,0xB8,0xB8,0xB7,0xB6,0xB6,0xB5,0xB4,0xB3,0xB2,
0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8, 0xB1,0xB0,0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9,0xA8,
@@ -61,8 +58,8 @@ static const unsigned char SinusTable[] = {
/* Driver stuff */ /* Driver stuff */
static unsigned XRes; static unsigned MaxX;
static unsigned YRes; static unsigned MaxY;
@@ -99,22 +96,22 @@ static void DoWarning (void)
static void DoCircles (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 I;
unsigned char Color = PAL_FORE; unsigned char Color = COLOR_FORE;
unsigned X = XRes / 2; unsigned X = MaxX / 2;
unsigned Y = YRes / 2; unsigned Y = MaxY / 2;
tgi_setpalette (Palette); tgi_setpalette (Palette);
while (!kbhit ()) { while (!kbhit ()) {
tgi_setcolor (PAL_FORE); tgi_setcolor (COLOR_FORE);
tgi_line (0, 0, XRes-1, YRes-1); tgi_line (0, 0, MaxX, MaxY);
tgi_line (0, YRes-1, XRes-1, 0); tgi_line (0, MaxY, MaxX, 0);
tgi_setcolor (Color); tgi_setcolor (Color);
for (I = 10; I < 240; I += 10) { for (I = 10; I < 240; I += 10) {
tgi_circle (X, Y, I); tgi_circle (X, Y, I);
} }
Color = Color == PAL_FORE ? PAL_BACK : PAL_FORE; Color = Color == COLOR_FORE ? COLOR_BACK : COLOR_FORE;
} }
cgetc (); cgetc ();
@@ -130,22 +127,22 @@ static void DoCheckerboard (void)
unsigned char Color; unsigned char Color;
tgi_setpalette (Palette); tgi_setpalette (Palette);
Color = PAL_BACK; Color = COLOR_BACK;
while (1) { while (1) {
for (Y = 0; Y < YRes; Y += 10) { for (Y = 0; Y <= MaxY; Y += 10) {
for (X = 0; X < XRes; X += 10) { for (X = 0; X <= MaxX; X += 10) {
tgi_setcolor (Color); tgi_setcolor (Color);
tgi_bar (X, Y, X+9, Y+9); 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 ()) { if (kbhit ()) {
cgetc (); cgetc ();
tgi_clear (); tgi_clear ();
return; 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; unsigned X, I;
tgi_setpalette (Palette); tgi_setpalette (Palette);
tgi_setcolor (PAL_FORE); tgi_setcolor (COLOR_FORE);
tgi_line (10, 10, 10, YRes-10); tgi_line (10, 10, 10, MaxY-10);
tgi_lineto (XRes-10, YRes-10); tgi_lineto (MaxX-10, MaxY-10);
tgi_line (8, 12, 10, 10); tgi_line (8, 12, 10, 10);
tgi_lineto (12, 12); tgi_lineto (12, 12);
tgi_line (XRes-12, YRes-12, XRes-10, YRes-10); tgi_line (MaxX-12, MaxY-12, MaxX-10, MaxY-10);
tgi_lineto (XRes-12, YRes-8); tgi_lineto (MaxX-12, MaxY-8);
for (I = 0, X = 10; X < XRes-10; ++X) { for (I = 0, X = 10; X < MaxX-10; ++X) {
tgi_setpixel (X, SinusTable[I]); tgi_setpixel (X, SinusTable[I]);
if (++I >= sizeof (SinusTable)) { if (++I >= sizeof (SinusTable)) {
I = 0; I = 0;
@@ -183,13 +180,13 @@ static void DoLines (void)
unsigned X; unsigned X;
tgi_setpalette (Palette); tgi_setpalette (Palette);
tgi_setcolor (PAL_FORE); tgi_setcolor (COLOR_FORE);
for (X = 0; X < YRes; X+=10) { for (X = 0; X <= MaxY; X += 10) {
tgi_line (0, 0, YRes, X); tgi_line (0, 0, MaxY, X);
tgi_line (0, 0, X, YRes); tgi_line (0, 0, X, MaxY);
tgi_line (YRes, YRes, 0, YRes-X); tgi_line (MaxY, MaxY, 0, MaxY-X);
tgi_line (YRes, YRes, YRes-X, 0); tgi_line (MaxY, MaxY, MaxY-X, 0);
} }
cgetc (); cgetc ();
@@ -212,8 +209,8 @@ int main (void)
CheckError ("tgi_init"); CheckError ("tgi_init");
/* Get stuff from the driver */ /* Get stuff from the driver */
XRes = tgi_getxres (); MaxX = tgi_getmaxx ();
YRes = tgi_getyres (); MaxY = tgi_getmaxy ();
/* Set the palette, set the border color */ /* Set the palette, set the border color */
Border = bordercolor (COLOR_BLACK); Border = bordercolor (COLOR_BLACK);

View File

@@ -1,37 +1,39 @@
FEATURES { FEATURES {
STARTADDRESS: default = $0800; STARTADDRESS: default = $0803;
} }
MEMORY { MEMORY {
ZP: start = $0080, size = $001A, define = yes; ZP: start = $0080, size = $001A, define = yes;
HEADER: start = $0000, size = $0004, file = %O; 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 { SEGMENTS {
EXEHDR: load = HEADER, type = ro; ZEROPAGE: load = ZP, type = zp;
STARTUP: load = RAM, type = ro, define = yes; EXEHDR: load = HEADER, type = ro;
LOWCODE: load = RAM, type = ro, optional = yes; STARTUP: load = RAM, type = ro;
INIT: load = RAM, type = ro, define = yes, optional = yes; LOWCODE: load = RAM, type = ro;
CODE: load = RAM, type = ro; CODE: load = RAM, type = ro;
RODATA: load = RAM, type = ro; RODATA: load = RAM, type = ro;
DATA: load = RAM, type = rw; DATA: load = RAM, type = rw;
BSS: load = RAM, type = bss, define = yes; BSS: load = RAM, type = bss, define = yes;
HEAP: load = RAM, type = bss, optional = yes; # must sit just below stack INIT: load = MOVE, run = RAM, type = ro, define = yes;
ZEROPAGE: load = ZP, type = zp; HIGHCODE: load = MOVE, run = LC, type = ro, optional = yes;
} }
FEATURES { FEATURES {
CONDES: segment = INIT, CONDES: segment = INIT,
type = constructor, type = constructor,
label = __CONSTRUCTOR_TABLE__, label = __CONSTRUCTOR_TABLE__,
count = __CONSTRUCTOR_COUNT__; count = __CONSTRUCTOR_COUNT__;
CONDES: segment = RODATA, CONDES: segment = RODATA,
type = destructor, type = destructor,
label = __DESTRUCTOR_TABLE__, label = __DESTRUCTOR_TABLE__,
count = __DESTRUCTOR_COUNT__; count = __DESTRUCTOR_COUNT__;
CONDES: type = interruptor, CONDES: type = interruptor,
segment = RODATA, segment = RODATA,
label = __INTERRUPTOR_TABLE__, label = __INTERRUPTOR_TABLE__,
count = __INTERRUPTOR_COUNT__; count = __INTERRUPTOR_COUNT__;
} }
SYMBOLS { SYMBOLS {
__STACKSIZE__ = $800; # 2K stack __STACKSIZE__ = $0800; # 2k stack
} }