FEATURES {
STARTADDRESS: default = $0803;
}
+SYMBOLS {
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
+}
MEMORY {
ZP: file = "", start = $0000, size = $00FF;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S, size = $C000 - %S;
BSS: file = "", start = __MAIN_LAST__, size = $C000 - __MAIN_LAST__;
}
}
SYMBOLS {
__EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $9600; # Presumed RAM end
__LCADDR__: type = weak, value = $D400; # Behind quit code
}
MEMORY {
ZP: file = "", define = yes, start = $0080, size = $001A;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S, size = __HIMEM__ - %S;
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
# Configuration for overlay programs (overlays located below main program)
-# The overlay files don't include the 4 byte DOS 3.3 header so use AppleCommander like this:
-# java -jar ac.jar -cc65 mydisk.dsk myprog bin < myprog
-# java -jar ac.jar -p mydisk.dsk myprog.1 bin < myprog.1
-# java -jar ac.jar -p mydisk.dsk myprog.2 bin < myprog.2
-# java -jar ac.jar -p mydisk.dsk myprog.3 bin < myprog.3
+# The overlay files are raw binary files so use AppleCommander like this:
+# java -jar ac.jar -as mydisk.dsk myprog < myprog
+# java -jar ac.jar -p mydisk.dsk myprog.1 bin < myprog.1
+# java -jar ac.jar -p mydisk.dsk myprog.2 bin < myprog.2
+# java -jar ac.jar -p mydisk.dsk myprog.3 bin < myprog.3
# ...
FEATURES {
}
SYMBOLS {
__EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $9600; # Presumed RAM end
__LCADDR__: type = weak, value = $D400; # Behind quit code
}
MEMORY {
ZP: file = "", define = yes, start = $0080, size = $001A;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S + __OVERLAYSIZE__, size = __HIMEM__ - __OVERLAYSIZE__ - %S;
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
-# Configuration for ProDOS 8 system programs (without the header)
+# Configuration for ProDOS 8 system programs (allowing for 3KB in LC)
SYMBOLS {
+ __EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $00FF; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__LCADDR__: type = weak, value = $D400; # Behind quit code
__LCSIZE__: type = weak, value = $0C00; # Rest of bank two
}
MEMORY {
- ZP: file = "", define = yes, start = $0080, size = $001A;
- MAIN: file = %O, start = $2000, size = $BF00 - $2000;
- BSS: file = "", start = __ONCE_RUN__, size = $BF00 - __STACKSIZE__ - __ONCE_RUN__;
- LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
+ ZP: file = "", define = yes, start = $0080, size = $001A;
+ HEADER: file = %O, start = $2000 - $003A, size = $003A;
+ MAIN: file = %O, define = yes, start = $2000, size = $BF00 - $2000;
+ BSS: file = "", start = __ONCE_RUN__, size = $BF00 - __STACKSIZE__ - __ONCE_RUN__;
+ LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
}
SEGMENTS {
ZEROPAGE: load = ZP, type = zp;
+ EXEHDR: load = HEADER, type = ro, optional = yes;
STARTUP: load = MAIN, type = ro;
LOWCODE: load = MAIN, type = ro, optional = yes;
CODE: load = MAIN, type = ro;
}
SYMBOLS {
__EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $9600; # Presumed RAM end
__LCADDR__: type = weak, value = $D400; # Behind quit code
}
MEMORY {
ZP: file = "", define = yes, start = $0080, size = $001A;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S, size = __HIMEM__ - %S;
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
FEATURES {
STARTADDRESS: default = $0803;
}
+SYMBOLS {
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
+}
MEMORY {
ZP: file = "", start = $0000, size = $00FF;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S, size = $C000 - %S;
BSS: file = "", start = __MAIN_LAST__, size = $C000 - __MAIN_LAST__;
}
}
SYMBOLS {
__EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $9600; # Presumed RAM end
__LCADDR__: type = weak, value = $D400; # Behind quit code
}
MEMORY {
ZP: file = "", define = yes, start = $0080, size = $001A;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S, size = __HIMEM__ - %S;
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
# Configuration for overlay programs (overlays located below main program)
-# The overlay files don't include the 4 byte DOS 3.3 header so use AppleCommander like this:
-# java -jar ac.jar -cc65 mydisk.dsk myprog bin < myprog
-# java -jar ac.jar -p mydisk.dsk myprog.1 bin < myprog.1
-# java -jar ac.jar -p mydisk.dsk myprog.2 bin < myprog.2
-# java -jar ac.jar -p mydisk.dsk myprog.3 bin < myprog.3
+# The overlay files are raw binary files so use AppleCommander like this:
+# java -jar ac.jar -as mydisk.dsk myprog < myprog
+# java -jar ac.jar -p mydisk.dsk myprog.1 bin < myprog.1
+# java -jar ac.jar -p mydisk.dsk myprog.2 bin < myprog.2
+# java -jar ac.jar -p mydisk.dsk myprog.3 bin < myprog.3
# ...
FEATURES {
}
SYMBOLS {
__EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $9600; # Presumed RAM end
__LCADDR__: type = weak, value = $D400; # Behind quit code
}
MEMORY {
ZP: file = "", define = yes, start = $0080, size = $001A;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S + __OVERLAYSIZE__, size = __HIMEM__ - __OVERLAYSIZE__ - %S;
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
-# Configuration for ProDOS 8 system programs (without the header)
+# Configuration for ProDOS 8 system programs (allowing for 3KB in LC)
SYMBOLS {
+ __EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $00FF; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__LCADDR__: type = weak, value = $D400; # Behind quit code
__LCSIZE__: type = weak, value = $0C00; # Rest of bank two
}
MEMORY {
- ZP: file = "", define = yes, start = $0080, size = $001A;
- MAIN: file = %O, start = $2000, size = $BF00 - $2000;
- BSS: file = "", start = __ONCE_RUN__, size = $BF00 - __STACKSIZE__ - __ONCE_RUN__;
- LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
+ ZP: file = "", define = yes, start = $0080, size = $001A;
+ HEADER: file = %O, start = $2000 - $003A, size = $003A;
+ MAIN: file = %O, define = yes, start = $2000, size = $BF00 - $2000;
+ BSS: file = "", start = __ONCE_RUN__, size = $BF00 - __STACKSIZE__ - __ONCE_RUN__;
+ LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
}
SEGMENTS {
ZEROPAGE: load = ZP, type = zp;
+ EXEHDR: load = HEADER, type = ro, optional = yes;
STARTUP: load = MAIN, type = ro;
LOWCODE: load = MAIN, type = ro, optional = yes;
CODE: load = MAIN, type = ro;
}
SYMBOLS {
__EXEHDR__: type = import;
+ __FILETYPE__: type = weak, value = $0006; # ProDOS file type
__STACKSIZE__: type = weak, value = $0800; # 2k stack
__HIMEM__: type = weak, value = $9600; # Presumed RAM end
__LCADDR__: type = weak, value = $D400; # Behind quit code
}
MEMORY {
ZP: file = "", define = yes, start = $0080, size = $001A;
- HEADER: file = %O, start = %S - 4, size = $0004;
+ HEADER: file = %O, start = %S - $003A, size = $003A;
MAIN: file = %O, define = yes, start = %S, size = __HIMEM__ - %S;
BSS: file = "", start = __ONCE_RUN__, size = __HIMEM__ - __STACKSIZE__ - __ONCE_RUN__;
LC: file = "", define = yes, start = __LCADDR__, size = __LCSIZE__;
<sect>Binary format<p>
The standard binary file format generated by the linker for the
-Apple ][ target is a binary program with a 4 byte DOS 3.3 header
-containing the load address and load length. The default load address is
-$803.
+Apple ][ target is an <url name="AppleSingle"
+url="http://kaiser-edv.de/documents/AppleSingle_AppleDouble.pdf"> file.
+The default load address is $803.
-<bf/AppleCommander 1.3.5/ or later (available at <url
-url="https://applecommander.github.io/">) includes the option <tt/-cc65/
-that allows to put binary files with a DOS 3.3 header onto disk images
-containing DOS 3.3 as well as ProDOS 8.
-
-For ProDOS 8 system programs the load address is fixed to $2000 so there
-is no need for a header. Thus the linker configuration
-<ref id="apple-sys-cfg" name="apple2-system.cfg"> for those programs
-omits the DOS 3.3 header. The right AppleCommander option to put system files
-without a header on a ProDOS 8 disk image is <tt/-p/.
+<bf/AppleCommander 1.4.0/ or later (available at <url
+url="https://applecommander.github.io/">) includes the option <tt/-as/ that
+allows to put AppleSingle files onto disk images containing DOS 3.3 as well
+as ProDOS 8.
<sect>Memory layout<p>
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
- the header.
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
<descrip>
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
+
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
stack size.
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
- the header.
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
<sect1><tt/apple2-overlay.cfg/<p>
Configuration for an overlay program with up to nine overlays. The overlay files
-don't include the DOS 3.3 header. See <tt>samples/overlaydemo.c</tt> for more
+don't include the AppleSingle header. See <tt>samples/overlaydemo.c</tt> for more
information on overlays.
Parameters:
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
- the header.
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: No header. Use <tt/-u __EXEHDR__ apple2.lib/ to add a DOS 3.3 header
- (address and length).
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: No. Use <tt/-u __EXEHDR__ apple2.lib/ to add the AppleSingle header.
</descrip><p>
Using LOADER.SYSTEM is as simple as copying it to the ProDOS 8 directory of the
program to load under name <program>.SYSTEM as a system program. For
-example the program <tt/MYPROG/ is loaded by <tt/MYPROG.SYSTEM/.
+example the program <tt/MYPROG/ is loaded by <tt/MYPROG.SYSTEM/. The right
+AppleCommander option to put LOADER.SYSTEM on a ProDOS 8 disk image is <tt/-p/.
<sect1>Heap<p>
<sect>Binary format<p>
The standard binary file format generated by the linker for the
-enhanced Apple //e target is a binary program with a 4 byte DOS 3.3 header
-containing the load address and load length. The default load address is
-$803.
+enhanced Apple //e target is an <url name="AppleSingle"
+url="http://kaiser-edv.de/documents/AppleSingle_AppleDouble.pdf"> file.
+The default load address is $803.
-<bf/AppleCommander 1.3.5/ or later (available at <url
-url="https://applecommander.github.io/">) includes the option <tt/-cc65/
-that allows to put binary files with a DOS 3.3 header onto disk images
-containing DOS 3.3 as well as ProDOS 8.
-
-For ProDOS 8 system programs the load address is fixed to $2000 so there
-is no need for a header. Thus the linker configuration
-<ref id="apple-sys-cfg" name="apple2enh-system.cfg"> for those programs
-omits the DOS 3.3 header. The right AppleCommander option to put system files
-without a header on a ProDOS 8 disk image is <tt/-p/.
+<bf/AppleCommander 1.4.0/ or later (available at <url
+url="https://applecommander.github.io/">) includes the option <tt/-as/ that
+allows to put AppleSingle files onto disk images containing DOS 3.3 as well
+as ProDOS 8.
<sect>Memory layout<p>
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
- the header.
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
<descrip>
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
+
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
stack size.
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
- the header.
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
<sect1><tt/apple2enh-overlay.cfg/<p>
Configuration for an overlay program with up to nine overlays. The overlay files
-don't include the DOS 3.3 header. See <tt>samples/overlaydemo.c</tt> for more
+don't include the AppleSingle header. See <tt>samples/overlaydemo.c</tt> for more
information on overlays.
Parameters:
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: DOS 3.3 header (address and length). Use <tt/-D __EXEHDR__=0/ to omit
- the header.
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: Yes. Use <tt/-D __EXEHDR__=0/ to omit the AppleSingle header.
<tag><tt/__STACKSIZE__:/ C runtime stack size</tag>
Default: $800. Use <tt/-D __STACKSIZE__=<size>/ to set a different
<tag><tt/STARTADDRESS:/ Program start address</tag>
Default: $803. Use <tt/-S <addr>/ to set a different start address.
- <tag><tt/__EXEHDR__:/ Executable file header</tag>
- Default: No header. Use <tt/-u __EXEHDR__ apple2enh.lib/ to add a DOS 3.3 header
- (address and length).
+ <tag><tt/__EXEHDR__:/ AppleSingle executable file header</tag>
+ Default: No. Use <tt/-u __EXEHDR__ apple2enh.lib/ to add the AppleSingle header.
</descrip><p>
Using LOADER.SYSTEM is as simple as copying it to the ProDOS 8 directory of the
program to load under name <program>.SYSTEM as a system program. For
-example the program <tt/MYPROG/ is loaded by <tt/MYPROG.SYSTEM/.
+example the program <tt/MYPROG/ is loaded by <tt/MYPROG.SYSTEM/. The right
+AppleCommander option to put LOADER.SYSTEM on a ProDOS 8 disk image is <tt/-p/.
<sect1>Heap<p>
Will test the hardware for the available RAM.
<tag><tt/c128-reu.emd (c128_reu_emd)/</tag>
- A driver for the CBM REUs. The driver will determine from the connected REU
- if it supports 128KB of RAM or more. In the latter case, 256KB are assumed,
- but since there are no range checks, the application can use more memory if
- it has better knowledge about the hardware than the driver.
+ A driver for the CBM REUs. The driver will test the connected REU to find
+ out how much RAM is present.
<tag><tt/c128-vdc.emd (c128_vdc_emd)/</tag>
A driver for the VDC memory of the C128, written and contributed by Maciej
Will test the hardware for the available RAM.
<tag><tt/c64-reu.emd (c64_reu_emd)/</tag>
- A driver for the CBM REUs. The driver will determine from the connected REU
- if it supports 128KB of RAM or more. In the latter case, 256KB are assumed,
- but since there are no range checks, the application can use more memory if
- it has better knowledge about the hardware than the driver.
+ A driver for the CBM REUs. The driver will test the connected REU to find
+ out how much RAM is present.
<tag><tt/c64-vdc.emd (c64_vdc_emd)/</tag>
A driver for the VDC memory of the C128. Written and contributed by Maciej
<sect2>AppleWin<p>
Available at <url
-url="http://applewin.berlios.de/">:
+url="https://github.com/AppleWin/AppleWin">:
Emulates Apple ][/enhanced Apple //e computers, with
sound, video, joysticks, serial port, and disk images. Includes monitor. Only
for Windows. The package comes with a DOS 3.3 disk (called "master.dsk") image;
-however, you will need <bf/AppleCommander 1.3.5/ or later (available at <url
-url="http://applecommander.sourceforge.net/">).
+however, you will need <bf/AppleCommander 1.4.0/ or later (available at <url
+url="https://applecommander.github.io/">).
Compile the tutorial with
<tt/cc65.dsk/, then use <bf/AppleCommander/:
<tscreen><verb>
-java -jar ac.jar -cc65 cc65.dsk test B < hello
+java -jar ac.jar -as cc65.dsk test < hello
</verb></tscreen>
Note that a convention in the Apple world is that "hello" is the file which is
run automatically upon booting a DOS disk, sort of like the "autoexec.bat" of
-the MSDOS/Windows world. We've avoided that in the example, however. Also,
-the <tt/B/ parameter must be in caps., and "test" is the name of the program as
-it will appear on the Apple disk.
+the MSDOS/Windows world. We've avoided that in the example, however by using
+"test" as the name of the program as it will appear on the Apple disk.
Start the emulator, click on the <bf/Disk 1/ icon, and point to <bf/cc65.dsk/;
then, click the big Apple logo, to boot the system. Then, type this on the
;
; Oliver Schmidt, 2012-06-10
;
-; This module supplies a 4 byte DOS 3.3 header
-; containing the load address and load length.
+; This module supplies an AppleSingle version 2 file header + entry with
+; ID 11 according to https://tools.ietf.org/rfc/rfc1740.txt Appendix A.
;
.export __EXEHDR__ : absolute = 1 ; Linker referenced
+ .import __FILETYPE__ ; Linker generated
.import __MAIN_START__, __MAIN_LAST__ ; Linker generated
+; ------------------------------------------------------------------------
+
+; Data Fork
+ID01_LENGTH = __MAIN_LAST__ - __MAIN_START__
+ID01_OFFSET = ID01 - START
+
+; ProDOS File Info
+ID11_LENGTH = ID01 - ID11
+ID11_OFFSET = ID11 - START
+
; ------------------------------------------------------------------------
.segment "EXEHDR"
- .addr __MAIN_START__ ; Load address
- .word __MAIN_LAST__ - __MAIN_START__ ; Load length
+START: .byte $00, $05, $16, $00 ; Magic number
+ .byte $00, $02, $00, $00 ; Version number
+ .res 16 ; Filler
+ .byte 0, 2 ; Number of entries
+ .byte 0, 0, 0, 1 ; Entry ID 1 - Data Fork
+ .byte 0, 0, >ID01_OFFSET, <ID01_OFFSET ; Offset
+ .byte 0, 0, >ID01_LENGTH, <ID01_LENGTH ; Length
+ .byte 0, 0, 0, 11 ; Entry ID 11 - ProDOS File Info
+ .byte 0, 0, >ID11_OFFSET, <ID11_OFFSET ; Offset
+ .byte 0, 0, >ID11_LENGTH, <ID11_LENGTH ; Length
+ID11: .byte 0, %11000011 ; Access - Destroy, Rename, Write, Read
+ .byte >__FILETYPE__, <__FILETYPE__ ; File Type
+ .byte 0, 0 ; Auxiliary Type high
+ .byte >__MAIN_START__, <__MAIN_START__ ; Auxiliary Type low
+ID01:
OP_COPYFROM = $ED
OP_COPYTO = $EC
+OP_COPYFROM_ALOAD = $B1
+OP_COPYTO_ALOAD = $B0
; ------------------------------------------------------------------------
; Data.
cmp REU_REUADDR ; Check for presence of REU
bne nodevice
- ldy #>(128*4) ; Assume 128KB
- lda REU_STATUS
- and #$10 ; Check size bit
- beq @L1
- ldy #>(256*4) ; 256KB when size bit is set
-@L1: sty pagecount+1
-
+; determine the size
+ php
+ sei
ldy #$FF
- sty curpage
- sty curpage+1 ; Invalidate the current page
- txa ; X = A = EM_ERR_OK
+loop:
+ sty window
+ jsr reu_size_check_common
+ ldx #OP_COPYTO_ALOAD
+ stx REU_COMMAND
+ dey
+ cpy #$FF
+ bne loop
+ iny
+size_loop:
+ jsr reu_size_check_common
+ ldx #OP_COPYFROM_ALOAD
+ stx REU_COMMAND
+ cpy window
+ bne size_found
+ iny
+ bne size_loop
+size_found:
+ plp
+ ldx #$00
+ cpy #$00 ; too many pages, shave off 2
+ bne pagecount_ok
+ dex
+ dex
+ dey
+pagecount_ok:
+ stx pagecount
+ sty pagecount+1
+ lda #<EM_ERR_OK
+ ldx #>EM_ERR_OK
+ rts
+
+; common REU setup for size check
+reu_size_check_common:
+ sty REU_REUADDR+2
+ ldx #<window
+ stx REU_C64ADDR
+ ldx #>window
+ stx REU_C64ADDR+1
+ ldx #$00
+ stx REU_REUADDR
+ stx REU_REUADDR+1
+ stx REU_COUNT+1
+ stx REU_CONTROL
+ inx
+ stx REU_COUNT
rts
; No REU found
OP_COPYFROM = $ED
OP_COPYTO = $EC
+OP_COPYFROM_ALOAD = $B1
+OP_COPYTO_ALOAD = $B0
+
; ------------------------------------------------------------------------
; Data.
cmp REU_REUADDR ; Check for presence of REU
bne nodevice
- ldy #>(128*4) ; Assume 128KB
- lda REU_STATUS
- and #$10 ; Check size bit
- beq @L1
- ldy #>(256*4) ; 256KB when size bit is set
-@L1: sty pagecount+1
-
+; determine the size
+ php
+ sei
ldy #$FF
- sty curpage
- sty curpage+1 ; Invalidate the current page
- txa ; X = A = EM_ERR_OK
+loop:
+ sty window
+ jsr reu_size_check_common
+ ldx #OP_COPYTO_ALOAD
+ stx REU_COMMAND
+ dey
+ cpy #$FF
+ bne loop
+ iny
+size_loop:
+ jsr reu_size_check_common
+ ldx #OP_COPYFROM_ALOAD
+ stx REU_COMMAND
+ cpy window
+ bne size_found
+ iny
+ bne size_loop
+size_found:
+ plp
+ ldx #$00
+ cpy #$00 ; too many pages, shave off 2
+ bne pagecount_ok
+ dex
+ dex
+ dey
+pagecount_ok:
+ stx pagecount
+ sty pagecount+1
+ lda #<EM_ERR_OK
+ ldx #>EM_ERR_OK
rts
+; common REU setup for size check
+reu_size_check_common:
+ sty REU_REUADDR+2
+ ldx #<window
+ stx REU_C64ADDR
+ ldx #>window
+ stx REU_C64ADDR+1
+ ldx #$00
+ stx REU_REUADDR
+ stx REU_REUADDR+1
+ stx REU_COUNT+1
+ stx REU_CONTROL
+ inx
+ stx REU_COUNT
+ rts
+
+
; No REU found
nodevice:
rts
; ------------------------------------------------------------------------
-; IRQ entry point. Is called from the C layer as a subroutine in the
-; interrupt. The routine MUST return carry set if the interrupt has been
-; 'handled' - which means that the interrupt source is gone. Otherwise it
-; MUST return carry clear.
+; COUNT: Return the total number of available joysticks in a/x.
+;
-IRQ: ; cia 2 setup
+COUNT: lda #<JOY_COUNT
+ ldx #>JOY_COUNT
+ rts
+; ------------------------------------------------------------------------
+; READ: Read a particular joystick passed in A.
+;
+
+readadapter:
+
+ sei
+
+ ; cia 2 setup
ldy #$00 ; port b direction
sty $dd03 ; => input
sta temp4
fire:
- ; Default Value: $40/64 on PAL
- ; $42/66 on NTSC
+ ; FIXME: to be really 100% correct this should restore the correct timer
+ ; values for the respective machine (PAL: $4025, NTSC: $4295)
+ ; however, this should hardly be a problem in a real world program
+
lda #$41
sta $dc05
- ; Default Value: $25/37 on PAL
- ; $95/149 on NTSC
lda #0
sta $dc04
- ; We do never "handle" the interrupt, we use it just as a timer.
- clc
- rts
-
-; ------------------------------------------------------------------------
-; COUNT: Return the total number of available joysticks in a/x.
-;
-
-COUNT: lda #<JOY_COUNT
- ldx #>JOY_COUNT
+ cli
rts
-; ------------------------------------------------------------------------
-; READ: Read a particular joystick passed in A.
-;
+READ:
+ pha
+ jsr readadapter
+ pla
-READ: tax ; Joystick number into X
+ tax ; Joystick number into X
bne joy2
; Read joystick 1
eor #$1F
ldx #0
rts
-
;
; Ullrich von Bassewitz, 05.08.1998
;
-; CC65 runtime: Increment ax by valie in y
+; CC65 runtime: Increment ax by value in y
;
.export incaxy, incax4
; Ullrich von Bassewitz, 25.10.2000
;
; CC65 runtime: Increment the stackpointer by 2. For performance reasons,
-; this modules does also contain the popax function.
+; this module also contains the popax function.
.export popax, incsp2
.importzp sp
;
; Ullrich von Bassewitz, 2002-12-26
;
-; CC65 runtime: Jump vector that resides in the data segment so it's address
+; CC65 runtime: Jump vector that resides in the data segment so its address
; may be patched at runtime.
;
;
; Ullrich von Bassewitz, 04.10.2001
;
-; CC65 runtime: Multiply the primary register
+; CC65 runtime: Multiply the primary register by 3
;
.export mulax3
;
; Ullrich von Bassewitz, 04.10.2001
;
-; CC65 runtime: Multiply the primary register
+; CC65 runtime: Multiply the primary register by 5
;
.export mulax5
$(foreach file,$(EMD) $(MOU) $(TGI),$(D64_WRITE_recipe))
# --------------------------------------------------------------------------
-# Rule to make an Apple II disk with all samples. Needs the Apple Commander
-# program available at http://applecommander.sourceforge.net/ and a template
-# disk named 'prodos.dsk'.
+# Rule to make an Apple II disk with all samples. Needs the AppleCommander
+# program available at https://applecommander.github.io/ and a template disk
+# named 'prodos.dsk'.
define DSK_WRITE_BIN_recipe
$(if $(findstring BF00,$(LDFLAGS_$(notdir $(file))_$(SYS))), \
java -jar $(AC) -p $@ $(notdir $(file)).system sys <$(TARGET_PATH)/$(SYS)/util/loader.system)
-java -jar $(AC) -cc65 $@ $(notdir $(file)) bin <$(file)
+java -jar $(AC) -as $@ $(notdir $(file)) <$(file)
endef # DSK_WRITE_BIN_recipe
#define VER_MAJOR 2U
-#define VER_MINOR 16U
+#define VER_MINOR 17U
#include <conio.h>
#include <joystick.h>
-
#ifdef JOYSTICK_DRIVER
/* A statically linked driver was named on the compiler's command line.
*/
# undef DYN_DRV
# define DYN_DRV 0
+
+/*
+** link existing drivers like this:
+**
+** cl65 -DJOYSTICK_DRIVER=c64_hitjoy_joy -o joy-test.prg joy-test.c
+**
+** for testing a new driver you will have to uncomment the define below, and
+** link your driver like this:
+**
+** co65 ../../target/c64/drv/joy/c64-hitjoy.joy -o hitjoy.s --code-label _hitjoy
+** cl65 -DJOYSTICK_DRIVER=hitjoy -o joy-test.prg joy-test.c hitjoy.s
+**
+*/
+
+/* extern char JOYSTICK_DRIVER; */
+
#else
/* Use a dynamically loaded driver, by default. */
unsigned char j;
unsigned char count;
unsigned char i;
+ unsigned char Res;
+ unsigned char ch, kb;
+
+ clrscr ();
#if DYN_DRV
- unsigned char Res = joy_load_driver (joy_stddrv);
+ Res = joy_load_driver (joy_stddrv);
#elif defined(JOYSTICK_DRIVER)
- unsigned char Res = joy_install (&JOYSTICK_DRIVER);
+ Res = joy_install (&JOYSTICK_DRIVER);
#else
- unsigned char Res = joy_install (&joy_static_stddrv);
+ Res = joy_install (&joy_static_stddrv);
#endif
if (Res != JOY_ERR_OK) {
exit (EXIT_FAILURE);
}
- clrscr ();
count = joy_count ();
#if defined(__ATARI5200__) || defined(__CREATIVISION__)
cprintf ("JOYSTICKS: %d", count);
gotoxy (0, i+1);
j = joy_read (i);
#if defined(__ATARI5200__) || defined(__CREATIVISION__)
- cprintf ("%1d:%-3s%-3s%-3s%-3s%-3s%-3s",
+ cprintf ("%1d:%-3s%-3s%-3s%-3s%-3s %02x",
i,
JOY_UP(j)? " U " : " - ",
JOY_DOWN(j)? " D " : " - ",
JOY_LEFT(j)? " L " : " - ",
JOY_RIGHT(j)? " R " : " - ",
- JOY_BTN_1(j)? " 1 " : " - ");
+ JOY_BTN_1(j)? " 1 " : " - ", j);
#else
- cprintf ("%2d: %-6s%-6s%-6s%-6s%-6s%-6s",
+ cprintf ("%2d: %-6s%-6s%-6s%-6s%-6s %02x",
i,
JOY_UP(j)? " up " : " ---- ",
JOY_DOWN(j)? " down " : " ---- ",
JOY_LEFT(j)? " left " : " ---- ",
JOY_RIGHT(j)? "right " : " ---- ",
- JOY_BTN_1(j)? "button" : " ---- ");
+ JOY_BTN_1(j)? "button" : " ---- ", j);
#endif
}
+
+ /* show pressed key, so we can verify keyboard is working */
+ kb = kbhit ();
+ ch = kb ? cgetc () : ' ';
+ gotoxy (1, i+2);
+ revers (kb);
+ cprintf ("kbd: %c", ch);
+ revers (0);
}
return 0;
}