From dc5ad5f3ac7dcedb098d7366e2aa0fdd353330b1 Mon Sep 17 00:00:00 2001 From: Piotr Jaczewski Date: Wed, 29 Jul 2020 11:12:19 +0200 Subject: [PATCH] cartridge ram & rom banking --- address_decoder.jed | 35 ++++++++++ address_decoder.log | 73 ++++++++++++++++++++ addressdecoder.eqn | 15 +++++ build.sh | 1 - src/cartridge.xa | 24 ++++++- src/cartridge_applesoft.xa | 135 ------------------------------------- src/rom_applesoft.xa | 7 -- src/rom_content.xa | 75 ++++++++++++++++++++- src/rom_content1.xa | 20 ------ src/rom_content2.xa | 40 ----------- 10 files changed, 218 insertions(+), 207 deletions(-) create mode 100644 address_decoder.jed create mode 100644 address_decoder.log create mode 100644 addressdecoder.eqn delete mode 100644 src/cartridge_applesoft.xa delete mode 100644 src/rom_applesoft.xa delete mode 100644 src/rom_content1.xa delete mode 100644 src/rom_content2.xa diff --git a/address_decoder.jed b/address_decoder.jed new file mode 100644 index 0000000..2ad3ef3 --- /dev/null +++ b/address_decoder.jed @@ -0,0 +1,35 @@ + +GAL20V8 +EQN2JED - Boolean Equations to JEDEC file assembler (Version V101) +Copyright (c) National Semiconductor Corporation 1990-1993 +Assembled from "c:/APPLE1~2/ADDRES~1.EQN". Date: 7-22-120 +* +NOTE PINS RW:2 PHI:3 A9:4 A8:5 A7:6 A6:7 A5:8 A4:9 A3:10 A2:11* +NOTE PINS GND:12 A15:14 A14:15 A13:16 A12:17 A11:18 A10:19 RAM:20* +NOTE PINS ROM:21 FF:22 BANK:23 VCC:24* +NOTE GALMODE REGISTERED* +QF2706*QP24*F0* +L0000 +1111111111111111111111111111111111111111 +1011011101110111010101100110011001010111* +L0320 +1111111111111111111111111111111111111111 +0111111111111111111111101110111011011110 +0101111111111111111111111111111111011110 +0101111111111111111111111111111111101101* +L0640 +1111111111111111111111111111111111111111 +1110011111111111111111011110111011011110 +1110011111111111111111111111111111101101 +1110011111111111111111111111110111011110 +1110011111111111111111111101111011011110* +L2560 +10000000* +L2632 +11111111* +L2640 +1100000011110000111110000000000000000000000000000000000000000000* +L2704 +01* +C3073* +0000 diff --git a/address_decoder.log b/address_decoder.log new file mode 100644 index 0000000..c503ba7 --- /dev/null +++ b/address_decoder.log @@ -0,0 +1,73 @@ +EQN2JED - Boolean Equations to JEDEC file assembler (Version V101) +Copyright (c) National Semiconductor Corporation 1990-1993 + +Log file for c:/APPLE1~2/ADDRES~1.EQN +Device: 20V8 + +Pin Label Type +--- ----- ---- +2 RW pos,com input +3 PHI pos,com input +4 A9 pos,com input +5 A8 pos,com input +6 A7 pos,com input +7 A6 pos,com input +8 A5 pos,com input +9 A4 pos,com input +10 A3 pos,com input +11 A2 pos,com input +12 GND ground pin +14 A15 pos,com input +15 A14 pos,com input +16 A13 pos,com input +17 A12 pos,com input +18 A11 pos,com input +19 A10 pos,com input +20 RAM neg,trst,com output +21 ROM neg,trst,com output +22 FF pos,trst,com output +23 BANK pos,com input +24 VCC power pin + + EQN2JED - Boolean Equations to JEDEC file assembler (Version V101) +Copyright (c) National Semiconductor Corporation 1990-1993 + +Device Utilization: + +No of dedicated inputs used : 12/12 (100.0%) +No of feedbacks used as dedicated inputs : 5/8 (62.5%) +No of feedbacks used as dedicated outputs : 3/8 (37.5%) + + ------------------------------------------ + Pin Label Terms Usage + ------------------------------------------ + 22 FF.oe 1/1 (100.0%) + 22 FF 1/7 (14.3%) + 21 ROM.oe 1/1 (100.0%) + 21 ROM 3/7 (42.9%) + 20 RAM.oe 1/1 (100.0%) + 20 RAM 4/7 (57.1%) + ------------------------------------------ + Total Terms 11/64 (17.2%) + ------------------------------------------ + + EQN2JED - Boolean Equations to JEDEC file assembler (Version V101) +Copyright (c) National Semiconductor Corporation 1990-1993 + + Chip diagram (DIP) + + ._____ _____. + | \__/ | + CLK | 1 24 | VCC + RW | 2 23 | BANK + PHI | 3 22 | FF + A9 | 4 21 | ROM + A8 | 5 20 | RAM + A7 | 6 19 | A10 + A6 | 7 18 | A11 + A5 | 8 17 | A12 + A4 | 9 16 | A13 + A3 | 10 15 | A14 + A2 | 11 14 | A15 + GND | 12 13 | /OE + |______________| diff --git a/addressdecoder.eqn b/addressdecoder.eqn new file mode 100644 index 0000000..565c6b7 --- /dev/null +++ b/addressdecoder.eqn @@ -0,0 +1,15 @@ +chip GAL20V8 + +NC=1 RW=2 PHI=3 A2=11 A3=10 A4=9 A5=8 A6=7 A7=6 A8=5 A9=4 A10=19 GND=12 +A11=18 A12=17 A13=16 A14=15 A15=14 RAM=20 ROM=21 FF=22 BANK=23 VCC=24 + +equations + +/ROM = /A15 * A14 * /A13 * /A12 * /A11 * RW + + /A15 * A14 * RW * BANK + + A15 * /A14 * RW * BANK +/RAM = /A15 * A14 * /A13 * /A12 * A11 * /BANK * PHI + + A15 * /A14 * /BANK * PHI + + /A15 * A14 * A13 * /BANK * PHI + + /A15 * A14 * /A13 * A12 * /BANK * PHI +FF = A2 * A3 * A4 * A5 * A6 * A7 * A8 * A9 * A10 * /A11 * /A12 * /A13 * A14 * /RW * PHI diff --git a/build.sh b/build.sh index eefc71d..d9918b1 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,3 @@ #!/bin/sh xa -W -C -v -O ASCII -c src/cartridge.xa -l cartridge.label -o cartridge.bin -xa -W -C -v -O ASCII -c src/cartridge_applesoft.xa -l cartridge_applesoft.label -o cartridge_applesoft.bin diff --git a/src/cartridge.xa b/src/cartridge.xa index a454b52..18fe773 100644 --- a/src/cartridge.xa +++ b/src/cartridge.xa @@ -5,6 +5,10 @@ #define kbd_data $D010 #define kbd_cr $D011 +; cartridge bank control constants +#define rom_bank $47FF +#define ram_bank $47FE + ; zero page variables ; content copy variables @@ -34,6 +38,10 @@ start + ; enable rom bank + sta rom_bank + + ; print entries and get option jsr print_entries jsr get_option @@ -150,6 +158,9 @@ load_program lda (dest_addr),Y sta jmp_addr+1 + ; enable ram bank to make jmp + sta ram_bank + jmp (jmp_addr) skip_entry @@ -182,11 +193,19 @@ init_copy sta copy_counter sta copy_counter+1 copy - ; load byte from rom into ram + ; load byte from rom ldy #$00 lda (src_addr),Y + + ; enable ram bank + stx ram_bank + + ; store byte to ram sta (dest_addr),Y + ; enable rom bank + stx rom_bank + ; increment source address ldx #src_addr jsr increment_16bit @@ -218,6 +237,7 @@ increment_copy_counter ;;; load-end ;;; printing + print_entries ; print welcome string lda #rom_content - sta entries_scan_addr+1 - -load_segment - - ; load segment length - ldy #$00 - lda (entries_scan_addr),Y - sta src_len - ldx #entries_scan_addr - jsr increment_16bit - lda (entries_scan_addr),Y - sta src_len+1 - - ; load dest addr - ldx #entries_scan_addr - jsr increment_16bit - lda (entries_scan_addr),Y - sta dest_addr - ldx #entries_scan_addr - jsr increment_16bit - lda (entries_scan_addr),Y - sta dest_addr+1 - - ; load source addr - ldx #entries_scan_addr - jsr increment_16bit - lda (entries_scan_addr),Y - sta src_addr - ldx #entries_scan_addr - jsr increment_16bit - lda (entries_scan_addr),Y - sta src_addr+1 - - ; copy segment from source to destination - jsr init_copy - -load_program - - ldx #entries_scan_addr - jsr increment_16bit - - ; load entry jump address - lda entries_scan_addr - sta dest_addr - lda entries_scan_addr+1 - sta dest_addr+1 - - ldy #$00 - lda (dest_addr),Y - sta jmp_addr - - iny - - lda (dest_addr),Y - sta jmp_addr+1 - - jmp (jmp_addr) - -init_copy - lda #$00 - sta copy_counter - sta copy_counter+1 -copy - ; load byte from rom into ram - ldy #$00 - lda (src_addr),Y - sta (dest_addr),Y - - ; increment source address - ldx #src_addr - jsr increment_16bit - - ; increment destination address - ldx #dest_addr - jsr increment_16bit - - ; compare counter lower byte with source length lower byte - ; if not equal increment counter - lda src_len - cmp copy_counter - bne increment_copy_counter - - ; compare counter upper byte with content length upper byte - ; if not equal increment counter - lda src_len+1 - cmp copy_counter+1 - bne increment_copy_counter - - rts - -increment_copy_counter - ldx #copy_counter - jsr increment_16bit - - jmp copy - -;;; load-end - -;;; tools -increment_16bit - inc $00,X - bne increment_16bit_done - inx - inc $00,X -increment_16bit_done - rts - -;;; tools-end - -rom_content -#include "src/rom_applesoft.xa" diff --git a/src/rom_applesoft.xa b/src/rom_applesoft.xa deleted file mode 100644 index d17e346..0000000 --- a/src/rom_applesoft.xa +++ /dev/null @@ -1,7 +0,0 @@ -applesoft -applesoft_len .word $1F65 -applesoft_addr .word $6000 -applesoft_cont_start .word applesoft_cont -applesoft_jmp_addr .word $6000 - -applesoft_cont .bin 0,8037,"inc/applesoft.bin" diff --git a/src/rom_content.xa b/src/rom_content.xa index baed275..3d18039 100644 --- a/src/rom_content.xa +++ b/src/rom_content.xa @@ -1,2 +1,73 @@ -;#include "src/rom_content1.xa" -#include "src/rom_content2.xa" +* = $4800 +.dsb (*-loader_end), $FF + +* = $4800 +rom_content = $4800 + +number_of_entries .byt $05 + +basic +basic_seg .byt $01 +basic_len .word $1000 +basic_addr .word $e000 +basic_cont_start .word basic_cont +basic_str .byt $0D,"INTEGER BASIC" +basic_jmp_addr .word $e000 + +apple30th +apple30th_seg .byt $01 +apple30th_len .word $0D80 +apple30th_addr .word $0280 +apple30th_cont_start .word apple30th_cont +apple30th_str .byt $13,"APPLE 30TH BIRTHDAY" +apple30th_jmp_addr .word $0280 + +/* 00: */ +/* test 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 +2 - Floating ones - eight passes, starting with 0x01 and moving the 1 bit to left each succeeding pass + 0x02 0x04 0x08 0x10 0x20 0x40 0x80 +3 - Floating zeros - eight passes, starting with 0x7f and shifting the 0 bit to the right each succeeding pass + 0xBF 0xDF 0xEF 0xF7 0xFB 0xFD 0xFE +4 - Address in Address 1 - one pass with low eight bits of the locations address is 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, + 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_seg .byt $02 +memorytest_1_len .word $0010 +memorytest_1_addr .word $0000 +memorytest_1_cont_start .word memorytest_cont +memorytest_2_len .word $0122 +memorytest_2_addr .word $0280 +memorytest_2_cont_start .word memorytest_cont+16 +memorytest_str .byt $10,"MEMORY TEST 280R" +memorytest_jmp_addr .word $FF1F + +/* 44: */ + +disassembler +disassembler_seg .byt $01 +disassembler_1_len .word $0200 +disassembler_1_addr .word $0800 +disassembler_1_cont_start .word disassembler_cont +disassembler_str .byt $11,"DISASSEMBLER 800R" +disassembler_jmp_addr .word $FF1F + +applesoft +applesoft_seg .byt $01 +applesoft_len .word $1F65 +applesoft_addr .word $6000 +applesoft_cont_start .word applesoft_cont +applesoft_str .byt $15,"APPLESOFT BASIC 6000R" +applesoft_jmp_addr .word $6000 + +basic_cont .bin 0,4096,"inc/basic.bin" +apple30th_cont .bin 0,3456,"inc/apple30th.bin" +memorytest_cont .bin 0,306,"inc/a1mt.bin" +disassembler_cont .bin 0,512,"inc/disassembler.bin" +applesoft_cont .bin 0,8037,"inc/applesoft.bin" diff --git a/src/rom_content1.xa b/src/rom_content1.xa deleted file mode 100644 index 5db73f1..0000000 --- a/src/rom_content1.xa +++ /dev/null @@ -1,20 +0,0 @@ -number_of_entries .byt $02 - -basic -basic_seg .byt $01 -basic_1_len .word $1000 -basic_1_addr .word $e000 -basic_1_cont_start .word basic_cont -basic_str .byt $05,"BASIC" -basic_jmp_addr .word $e000 - -apple30th -apple30th_seg .byt $01 -apple30th_len .word $0D80 -apple30th_addr .word $0280 -apple30th_cont_start .word apple30th_cont -apple30th_str .byt $13,"APPLE 30TH BIRTHDAY" -apple30th_jmp_addr .word $0280 - -basic_cont .bin 0,4096,"inc/basic.bin" -apple30th_cont .bin 0,3456,"inc/apple30th.bin" diff --git a/src/rom_content2.xa b/src/rom_content2.xa deleted file mode 100644 index 0aafb66..0000000 --- a/src/rom_content2.xa +++ /dev/null @@ -1,40 +0,0 @@ -number_of_entries .byt $02 - -/* 00: */ -/* test 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 -2 - Floating ones - eight passes, starting with 0x01 and moving the 1 bit to left each succeeding pass - 0x02 0x04 0x08 0x10 0x20 0x40 0x80 -3 - Floating zeros - eight passes, starting with 0x7f and shifting the 0 bit to the right each succeeding pass - 0xBF 0xDF 0xEF 0xF7 0xFB 0xFD 0xFE -4 - Address in Address 1 - one pass with low eight bits of the locations address is 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, - 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_seg .byt $02 -memorytest_1_len .word $0010 -memorytest_1_addr .word $0000 -memorytest_1_cont_start .word memorytest_cont -memorytest_2_len .word $0122 -memorytest_2_addr .word $0280 -memorytest_2_cont_start .word memorytest_cont+16 -memorytest_str .byt $10,"MEMORY TEST 280R" -memorytest_jmp_addr .word $FF1F - -/* 44: */ - -disassembler -disassembler_seg .byt $01 -disassembler_1_len .word $0200 -disassembler_1_addr .word $0800 -disassembler_1_cont_start .word disassembler_cont -disassembler_str .byt $11,"DISASSEMBLER 800R" -disassembler_jmp_addr .word $FF1F - -memorytest_cont .bin 0,306,"inc/a1mt.bin" -disassembler_cont .bin 0,512,"inc/disassembler.bin"