Added customization instructions to README.md
This commit is contained in:
parent
1b8a173778
commit
9e413b1df1
19
README.md
19
README.md
|
@ -7,12 +7,12 @@ This repository contains firmware files for the "Apple-1 RAM/ROM Cartridge" expa
|
||||||
This project aims to provide Apple-1 users with a quick way to expand RAM capacity in their systems up to 52 KB and to simultaneously store some Apple-1 programs in
|
This project aims to provide Apple-1 users with a quick way to expand RAM capacity in their systems up to 52 KB and to simultaneously store some Apple-1 programs in
|
||||||
~30KB of on-board ROM, which can be banked in and out via software. The on-board ROM also contains a loader program which is capable of loading programs which span across non-continuous memory locations.
|
~30KB of on-board ROM, which can be banked in and out via software. The on-board ROM also contains a loader program which is capable of loading programs which span across non-continuous memory locations.
|
||||||
|
|
||||||
The A1C expansion card allows via the physical switch to completely disable the loader program functionality which takes up to the 2 KB of memory
|
The A1C expansion card allows via the physical switch to completely disable the ROM/loader program functionality which takes up to the 2 KB of memory (`$4000-$47FF`)
|
||||||
and to provide continuous 44KB wide RAM address space.
|
and to provide continuous 44KB wide RAM address space instead.
|
||||||
|
|
||||||
## Memory map
|
## Memory map
|
||||||
|
|
||||||
In ROM mode:
|
Physical switch in ROM mode:
|
||||||
|
|
||||||
| address | function |
|
| address | function |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
@ -22,7 +22,7 @@ In ROM mode:
|
||||||
| `$4800-$BFFF` | RAM region #2 when ROM banked out |
|
| `$4800-$BFFF` | RAM region #2 when ROM banked out |
|
||||||
| `$4800-$BFFF` | ROM with program contents when ROM banked in |
|
| `$4800-$BFFF` | ROM with program contents when ROM banked in |
|
||||||
|
|
||||||
In RAM mode:
|
Physical Switch in RAM mode:
|
||||||
|
|
||||||
| address | function |
|
| address | function |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
@ -54,6 +54,10 @@ And to clean the build:
|
||||||
|
|
||||||
`make clean`
|
`make clean`
|
||||||
|
|
||||||
|
# How to customise?
|
||||||
|
|
||||||
|
In order to customise your ROM contents you have to edit the `src/rom_content.a65` source file. You can find the entry table structure documentation in the source file.
|
||||||
|
|
||||||
## PCB
|
## PCB
|
||||||
|
|
||||||
The KiCad project files with board design and schematics can be found here:
|
The KiCad project files with board design and schematics can be found here:
|
||||||
|
@ -66,3 +70,10 @@ The onboard ROM loader program can also automatically load your Applesoft BASIC
|
||||||
applesoft-lite project which has been modified to make use of the A1SI expansion card:
|
applesoft-lite project which has been modified to make use of the A1SI expansion card:
|
||||||
|
|
||||||
http://github.com/flowenol/applesoft-lite
|
http://github.com/flowenol/applesoft-lite
|
||||||
|
|
||||||
|
## How to install hardware?
|
||||||
|
|
||||||
|
Just put the board in right orientation (as marked on the PCB) in the Apple-1 expansion slot.
|
||||||
|
Or you can use the port expander if the on board slot is already occupied:
|
||||||
|
|
||||||
|
https://github.com/flowenol/Apple1ExpanderPcb
|
||||||
|
|
|
@ -3,7 +3,7 @@ import binascii
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This utility transforms CFFA formated BASIC programs to binary, outputting
|
This utility transforms CFFA formatted Integer BASIC programs to binary, outputting
|
||||||
to file name with LOMEM & HIMEM appended
|
to file name with LOMEM & HIMEM appended
|
||||||
"""
|
"""
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
* = $4800
|
* = $4800
|
||||||
.dsb (*-loader_end), $FF
|
.dsb (*-loader_end), $FF
|
||||||
|
|
||||||
|
; start of loader entry table section
|
||||||
|
|
||||||
* = $4800
|
* = $4800
|
||||||
rom_content = $4800
|
rom_content = $4800
|
||||||
|
|
||||||
|
@ -18,15 +20,12 @@ number_of_entries .byt $08
|
||||||
;
|
;
|
||||||
; jump address - word
|
; jump address - word
|
||||||
|
|
||||||
; start of configuration section
|
; Integer BASIC
|
||||||
/*
|
;
|
||||||
Integer BASIC
|
; How to store INTEGER BASIC programs via ACI/Apple-1 Serial Interface?
|
||||||
|
; C100R
|
||||||
How to store INTEGER BASIC programs via Apple-1 Serial Interface?
|
; 004A.00FFW 0800.0FFFW
|
||||||
C100R
|
; E2B3R - warm entry point
|
||||||
004A.00FFW 0800.0FFFW
|
|
||||||
E2B3R - warm entry point
|
|
||||||
*/
|
|
||||||
basic
|
basic
|
||||||
basic_seg .byt $01
|
basic_seg .byt $01
|
||||||
basic_len .word $1000
|
basic_len .word $1000
|
||||||
|
@ -35,9 +34,9 @@ basic_cont_start .word basic_cont
|
||||||
basic_str .byt $0D,"INTEGER BASIC"
|
basic_str .byt $0D,"INTEGER BASIC"
|
||||||
basic_jmp_addr .word $e000
|
basic_jmp_addr .word $e000
|
||||||
|
|
||||||
/*
|
;
|
||||||
Apple 30th anniversary demo program
|
; Apple 30th anniversary demo program
|
||||||
*/
|
;
|
||||||
apple30th
|
apple30th
|
||||||
apple30th_seg .byt $01
|
apple30th_seg .byt $01
|
||||||
apple30th_len .word $0D80
|
apple30th_len .word $0D80
|
||||||
|
@ -46,24 +45,26 @@ apple30th_cont_start .word apple30th_cont
|
||||||
apple30th_str .byt $13,"APPLE 30TH BIRTHDAY"
|
apple30th_str .byt $13,"APPLE 30TH BIRTHDAY"
|
||||||
apple30th_jmp_addr .word $0280
|
apple30th_jmp_addr .word $0280
|
||||||
|
|
||||||
/*
|
;
|
||||||
Mike Willegal's memory test program
|
; Mike Willegal's memory test program
|
||||||
|
;
|
||||||
00: <start_low_byte> <start_high_byte> <end_low_byte> <end_high_byte>
|
; 00: <start_low_byte> <start_high_byte> <end_low_byte> <end_high_byte>
|
||||||
test address expected actual
|
; Output format:
|
||||||
|
; test_case address expected actual
|
||||||
0 - All zeros - each byte of memory is verified that a 0x00 value can be written and read
|
;
|
||||||
1 - All ones - each byte of memory is verified that a 0xff value can be written and read
|
; Test case numbers:
|
||||||
2 - Floating ones - eight passes, starting with 0x01 and moving the 1 bit to left each succeeding pass
|
; 0 - All zeros - each byte of memory is verified that a 0x00 value can be written and read
|
||||||
0x02 0x04 0x08 0x10 0x20 0x40 0x80
|
; 1 - All ones - each byte of memory is verified that a 0xff value can be written and read
|
||||||
3 - Floating zeros - eight passes, starting with 0x7f and shifting the 0 bit to the right each succeeding pass
|
; 2 - Floating ones - eight passes, starting with 0x01 and moving the 1 bit to left each succeeding pass
|
||||||
0xBF 0xDF 0xEF 0xF7 0xFB 0xFD 0xFE
|
; 0x02 0x04 0x08 0x10 0x20 0x40 0x80
|
||||||
4 - Address in Address 1 - one pass with low eight bits of the locations address is written to that location
|
; 3 - Floating zeros - eight passes, starting with 0x7f and shifting the 0 bit to the right each succeeding pass
|
||||||
if this fails, you have a problem with one of the low eight address lines (this is pretty unlikely to fail,
|
; 0xBF 0xDF 0xEF 0xF7 0xFB 0xFD 0xFE
|
||||||
since you need these address lines in order to load and run this program)
|
; 4 - Address in Address 1 - one pass with low eight bits of the locations address is written to that location
|
||||||
5 - Address in Address 2 - one pass with high eight bits of the locations address written to that location
|
; if this fails, you have a problem with one of the low eight address lines (this is pretty unlikely to fail,
|
||||||
if this fails, you have a problem with one of the eight high address lines
|
; since you need these address lines in order to load and run this program)
|
||||||
*/
|
; 5 - Address in Address 2 - one pass with high eight bits of the locations address written to that location
|
||||||
|
; if this fails, you have a problem with one of the eight high address lines
|
||||||
|
;
|
||||||
memorytest
|
memorytest
|
||||||
memorytest_seg .byt $02
|
memorytest_seg .byt $02
|
||||||
memorytest_1_len .word $0010
|
memorytest_1_len .word $0010
|
||||||
|
@ -75,12 +76,12 @@ memorytest_2_cont_start .word memorytest_cont+16
|
||||||
memorytest_str .byt $10,"MEMORY TEST 280R"
|
memorytest_str .byt $10,"MEMORY TEST 280R"
|
||||||
memorytest_jmp_addr .word $FF1F
|
memorytest_jmp_addr .word $FF1F
|
||||||
|
|
||||||
/*
|
;
|
||||||
Disassembler program
|
; Disassembler program
|
||||||
|
;
|
||||||
How to use:
|
; How to use:
|
||||||
44: <low_byte> <high_byte> - disassembler start address
|
; 44: <low_byte> <high_byte> - disassembler start address
|
||||||
*/
|
;
|
||||||
disassembler
|
disassembler
|
||||||
disassembler_seg .byt $01
|
disassembler_seg .byt $01
|
||||||
disassembler_1_len .word $0200
|
disassembler_1_len .word $0200
|
||||||
|
@ -89,9 +90,12 @@ disassembler_1_cont_start .word disassembler_cont
|
||||||
disassembler_str .byt $11,"DISASSEMBLER 800R"
|
disassembler_str .byt $11,"DISASSEMBLER 800R"
|
||||||
disassembler_jmp_addr .word $FF1F
|
disassembler_jmp_addr .word $FF1F
|
||||||
|
|
||||||
/*
|
;
|
||||||
Applesoft BASIC port
|
; Applesoft BASIC
|
||||||
*/
|
;
|
||||||
|
; A modified version from the following fork:
|
||||||
|
; https://github.com/flowenol/applesoft-lite
|
||||||
|
;
|
||||||
applesoft
|
applesoft
|
||||||
applesoft_seg .byt $01
|
applesoft_seg .byt $01
|
||||||
applesoft_len .word $2000
|
applesoft_len .word $2000
|
||||||
|
@ -101,9 +105,16 @@ applesoft_str .byt $15,"APPLESOFT BASIC 6000R"
|
||||||
applesoft_jmp_addr .word $6000
|
applesoft_jmp_addr .word $6000
|
||||||
|
|
||||||
|
|
||||||
/*
|
;
|
||||||
A sample Integer BASIC program with "Matrix" effect
|
; A sample Integer BASIC program - "Matrix" effect
|
||||||
*/
|
;
|
||||||
|
; 3 segments need to be loaded:
|
||||||
|
; 1. Integer BASIC
|
||||||
|
; 2. zero page variables for "Matrix" program
|
||||||
|
; 3. program contents between LOMEM and HIMEM
|
||||||
|
;
|
||||||
|
; Then a jump to Integer BASIC warm entrpoint has to be made
|
||||||
|
;
|
||||||
matrix
|
matrix
|
||||||
matrix_seg .byt $03
|
matrix_seg .byt $03
|
||||||
matrix_1_len .word $1000
|
matrix_1_len .word $1000
|
||||||
|
@ -118,10 +129,16 @@ matrix_3_cont_start .word matrix_cont+$B6
|
||||||
matrix_str .byt $0E,"MATRIX (BASIC)"
|
matrix_str .byt $0E,"MATRIX (BASIC)"
|
||||||
matrix_jmp_addr .word $E2B3
|
matrix_jmp_addr .word $E2B3
|
||||||
|
|
||||||
|
;
|
||||||
/*
|
; A sample Applesoft BASIC program - lemonade stand simulator
|
||||||
A sample Applesoft BASIC program - lemonade stand simulator
|
;
|
||||||
*/
|
; 3 segments need to be loaded:
|
||||||
|
; 1. Applesoft BASIC
|
||||||
|
; 2. lemonade stand program content
|
||||||
|
; 3. zero page variables for lemonade stand program
|
||||||
|
;
|
||||||
|
; Then jump to the STARTFROMCART routine
|
||||||
|
;
|
||||||
lemo
|
lemo
|
||||||
lemo_seg .byt $03
|
lemo_seg .byt $03
|
||||||
lemo_1_len .word $2000
|
lemo_1_len .word $2000
|
||||||
|
@ -134,12 +151,12 @@ lemo_3_len .word $000D
|
||||||
lemo_3_addr .word $0067
|
lemo_3_addr .word $0067
|
||||||
lemo_3_cont_start .word lemo_fix_cont
|
lemo_3_cont_start .word lemo_fix_cont
|
||||||
lemo_str .byt $16,"LEMONADE STAND (ASOFT)"
|
lemo_str .byt $16,"LEMONADE STAND (ASOFT)"
|
||||||
lemo_jmp_addr .word $7DFE
|
lemo_jmp_addr .word $7DF4
|
||||||
|
|
||||||
|
|
||||||
/*
|
;
|
||||||
Another sample Applesoft BASIC program - counts to 10 in a loop
|
; Another sample Applesoft BASIC program - counts to 10 in a loop
|
||||||
*/
|
;
|
||||||
count10
|
count10
|
||||||
count10_seg .byt $03
|
count10_seg .byt $03
|
||||||
count10_1_len .word $2000
|
count10_1_len .word $2000
|
||||||
|
@ -152,9 +169,9 @@ count10_3_len .word $000D
|
||||||
count10_3_addr .word $0067
|
count10_3_addr .word $0067
|
||||||
count10_3_cont_start .word count10_fix_cont
|
count10_3_cont_start .word count10_fix_cont
|
||||||
count10_str .byt $13,"COUNT TO 10 (ASOFT)"
|
count10_str .byt $13,"COUNT TO 10 (ASOFT)"
|
||||||
count10_jmp_addr .word $7DFE
|
count10_jmp_addr .word $7DF4
|
||||||
|
|
||||||
; end of configuration section
|
; end of loader entry table section
|
||||||
|
|
||||||
; start of binary content section
|
; start of binary content section
|
||||||
basic_cont .bin 0,0,"inc/basic.bin"
|
basic_cont .bin 0,0,"inc/basic.bin"
|
||||||
|
|
Loading…
Reference in New Issue