From 71cafa58a5f52764b2f8d561ea1256a1bd16fb0b Mon Sep 17 00:00:00 2001 From: Zane Kaminski Date: Fri, 11 Sep 2020 22:47:53 -0400 Subject: [PATCH] More ramtest stuff --- Makefile | 8 +- bin/GWRAM.dbg.po | Bin 143360 -> 0 bytes bin/GWRAM.po | Bin 143360 -> 0 bytes gsram_asm.s | 2 +- ramtest.c | 114 ++++++++++++++++++---------- ramtest.s | 190 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 270 insertions(+), 44 deletions(-) delete mode 100644 bin/GWRAM.dbg.po delete mode 100644 bin/GWRAM.po create mode 100644 ramtest.s diff --git a/Makefile b/Makefile index 29d179d..377eef4 100644 --- a/Makefile +++ b/Makefile @@ -35,13 +35,17 @@ obj/util.o: obj util.c cc65 util.c $(cflags) -o obj/util.s ca65 obj/util.s -o obj/util.o +obj/ramtest.o: obj ramtest.c + cc65 ramtest.c $(cflags) -o obj/ramtest.s + ca65 obj/ramtest.s -o obj/ramtest.o + obj/gwconio.o: obj gwconio.s ca65 gwconio.s -o obj/gwconio.o -bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o +bin/main.sys: bin obj/main.o obj/ram2e.o obj/ram2gs.o obj/ram2gs_asm.o obj/util.o obj/ramtest.o obj/gwconio.o ld65 -o bin/main.sys obj/main.o obj/ram2gs.o obj/ram2e.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 -bin/main.dbg.sys: bin obj/main.o obj/ram2e.dbg.o obj/ram2gs.dbg.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o +bin/main.dbg.sys: bin obj/main.o obj/ram2e.dbg.o obj/ram2gs.dbg.o obj/ram2gs_asm.o obj/util.o obj/ramtest.o obj/gwconio.o ld65 -o bin/main.dbg.sys obj/main.o obj/ram2gs.dbg.o obj/ram2e.dbg.o obj/ram2gs_asm.o obj/util.o obj/gwconio.o -C apple2-system.cfg --lib apple2.lib -D __EXEHDR__=0 GWRAM.po: bin/main.sys diff --git a/bin/GWRAM.dbg.po b/bin/GWRAM.dbg.po deleted file mode 100644 index 45f04a603ad8ea9a35459abb74e2e3b78ef19af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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 diff --git a/gsram_asm.s b/gsram_asm.s index 12d1758..52ae700 100644 --- a/gsram_asm.s +++ b/gsram_asm.s @@ -36,7 +36,7 @@ .I16 .endmacro -.segment "CODE" +.code .proc _gsram_getsize: near .A8 diff --git a/ramtest.c b/ramtest.c index e4ec7a2..610ad79 100644 --- a/ramtest.c +++ b/ramtest.c @@ -9,12 +9,49 @@ #include "gwconio.h" #include "ramtestpat.c" -#define TEST_SIZE 8*1024*1024 +#define TEST_SIZE (8*1024*1024) +#define BANK_SIZE (65536) +#define NUM_BANKS (TEST_SIZE/BANK_SIZE) + +static char getpat(uint32_t i) { + return ramtestpat[i % RAMTESTPAT_SIZE]; +} char test_run() { - // Put copy stub in low RAM - for (uint32_t a = 0; a < TEST_SIZE) { - wr(a, getpat(a)); + uint32_t i; + uint8_t ah; + + // Put read/write stubs in low RAM + + + for (ah = 0, i = 0; ah < NUM_BANKS; ah++) { + uint16_t al = 0; + + // Copy 0x0000-01FF + *((char*)_test_wr1_dm1 + 1) = getpat(i); + for (; al < 0x200; al++, i++) { + _test_wr1_dm1: + __asm__("lda #$00"); + __asm__("sta $C009"); // SETALTZP + _test_wr1_am1: + __asm__("lda $0000"); + __asm__("sta $C008"); // SETSTDZP + } + + // Copy 0x0200-BFFF + for (; al < 0xC000; al++, i++) { + + } + + // Copy 0xC000-CFFF to LC2 D000-DFFF + for (; al < 0xD000; al++, i++) { + + } + + // Copy 0xD000-FFFF to LC1 D000-FFFF + for (; al != 0x0000; al++, i++) { + + } } for (uint32_t a = 0; a < TEST_SIZE) { @@ -25,47 +62,42 @@ char test_run() { return 0; } -static inline char getpat(uint32_t a) { - return ramtestpat[a % RAMTESTPAT_SIZE]; +static void rd_zplc() { + _rd_zplc: + __asm__("sta $C009"); // SETALTZP + _rd_zplc_am1: + __asm__("lda $0000"); + __asm__("sta $C008"); // SETSTDZP + __asm__("rts"); } -static char rd(uint32_t a) { - uint16_t al = a & 0xFFFF; - if (al < 0x0200) { return rd_zplc(a); } - else if (al < 0xC000) { return rd_mid(a); } - else if (al < 0xD000) { return rd_lc2(a); } - else { return rd_zplc(a); } +static void rd_main() { + _rd_main: + __asm__("sta $C003"); // WRCARDRAM + _rd_main_am1: + __asm__("lda $0000"); + __asm__("sta $C002"); // WRMAINRAM + __asm__("rts"); } -static char rd_zplc(uint32_t a) { - +static void wr_zplc() { + _wr_zplc: + _wr_zplc_dm1: + __asm__("lda #$00"); + __asm__("sta $C009"); // SETALTZP + _wr_zplc_am1: + __asm__("lda $0000"); + __asm__("sta $C008"); // SETSTDZP + __asm__("rts"); } -static char rd_mid(uint32_t a) { - +static void wr_main() { + _wr_main: + _wr_zplc_dm1: + __asm__("lda #$00"); + __asm__("sta $C005"); // WRCARDRAM + _wr_main_am1: + __asm__("lda $0000"); + __asm__("sta $C004"); // WRMAINRAM + __asm__("rts"); } - -static char rd_lc2(uint32_t a) { - -} - -static char wr(uint32_t a, char d) { - uint16_t al = a & 0xFFFF; - if (al < 0x0200) { wr_zplc(a, d); } - else if (al < 0xC000) { wr_mid(a, d); } - else if (al < 0xD000) { wr_lc2(a, d); } - else { wr_zplc(a, d); } -} - -static char rd_zplc(uint32_t a) { - -} - -static char rd_mid(uint32_t a) { - -} - -static char rd_lc2(uint32_t a) { - -} - diff --git a/ramtest.s b/ramtest.s new file mode 100644 index 0000000..0fc9765 --- /dev/null +++ b/ramtest.s @@ -0,0 +1,190 @@ +.autoimport on +.importzp sp + +.export rtst_run +.import rtst_pat +.import rtst_scratch + +.code + +.proc ramtest_run: near + ; Preamble + php ; Push status + sei ; Disable interrupts + phx ; Push X + phy ; Push Y + + ; Save entire ZP + ldx #0 ; X = 0 + savezp: + lda $00,X + sta rtst_scratch,X + inx + bne savezp + + ; Set bank counter and address to 0 + lda #0 + sta $04 + sta $03 + sta $02 + + ; Set pattern address to 0xA000 + lda #$A0 + sta $01 + lda #$00 + sta $00 + + bankloop: + ; Store 0x0000-01FF + + ; Store 0x0200-BFFF + + ; Switch to LC2 + + ; Store in 0xD000-DFFF + + ; Switch to LC1 + + ; Store in 0xD000-FFFF + + ; Increment bank and repeat if < 128 + inc $04 + lda $04 + cmp #$80 + blt bankloop + + ; Restore entire ZP + ldx #0 ; X = 0 + savezp: + lda rtst_scratch,X + sta $00,X + inx + bne savezp + + ; Postamble + ply ; Pull Y + plx ; Pull X + plp ; Pull status +.endproc + +.proc ramtest_incpat: near + ; Increment pattern pointer + inc $00 ; Increment low byte + bne incpat1 ; If low byte nonzero, skip incrementing high byte + inc $01 ; If low byte zero, increment high byte + bne incpat2 ; Unconditional branch to return + beq incpat2 + + ; Check if pointer == 0xB001 + ; if low byte didn't roll around + incpat1: + lda $01 ; Load high byte of pointer + cmp #$B0 ; Check == 0xB0 + bne incpat2 ; If not, goto return + lda $00 ; Load low byte of pointer + cmp #$01 ; Check == 0x01 + bne incpat2 ; If not, goto return + ; Otherwise fall through + + ; Reset pattern pointer + lda #$A0 + sta $01 + lda #$00 + sta $00 + + incpat2: + rts +.endproc + +.proc ramtest_wr256zp: near + ; Set up to copy + ldy $02 ; Y = address lo + sty wr256zp_am1_1+1 ; Set 1st address lo = 0 + sty wr256zp_am1_2+1 ; Set 2nd address lo = 0 + ldy $03 ; Y = address hi + sty wr256zp_am1_1+2 ; Set 1st address hi + sty wr256zp_am1_2+2 ; Set 2nd address hi + ldy #0 ; Y = 0 + + wr256zp_loop: + ; Load two pattern bytes + lda ($00) ; A = next pattern byte + jsr ramtest_incpat ; Increment pattern pointer + ldx ($00) ; Y = next pattern byte + jsr ramtest_incpat ; Increment pattern pointer + ; Switch into ALTZP, store two pattern bytes, switch back + sta $C009 ; SETALTZP + wr256zp_am1_1: + sta $0000,Y ; Store in RAM + iny ; Y++ + wr256zp_am1_2: + stx $0000,Y ; Store in RAM + iny ; Y++ + sta $C008 ; SETSTDZP + ; Repeat + bne wr256zp_loop ; Repeat until X rolls over (256 times) + + ; Success exit + rts +.endproc + +.proc ramtest_wr256mn: near + ; Set up to copy + ldy $02 ; Y = address lo + sty wr256zp_am1_1+1 ; Set 1st address lo + sty wr256zp_am1_2+1 ; Set 2nd address lo + ldy $03 ; Y = address hi + sty wr256zp_am1_1+2 ; Set 1st address hi + sty wr256zp_am1_2+2 ; Set 2nd address hi + ldy #0 ; Y = 0 + + wr256mn_loop: + ; Load two pattern bytes + lda ($00) ; A = next pattern byte + jsr ramtest_incpat ; Increment pattern pointer + ldx ($00) ; Y = next pattern byte + jsr ramtest_incpat ; Increment pattern pointer + ; RAMWRTON, store two pattern bytes, RAMWRTOFF + sta $C009 ; RAMWRTON + wr256mn_am1_1: + sta $0000,Y ; Store in RAM + iny ; X++ + wr256mn_am1_2: + stx $0000,Y ; Store in RAM + iny ; X++ + sta $C008 ; RAMWRTOFF + ; Repeat + bne wr256mn_loop ; Repeat until X rolls over (256 times) + + ; Success exit + rts +.endproc + +.proc ramtest_vfy256zp: near + ; Set up to verify + ldx #0 ; X = 0 + stx vfy256zp_am1+1 ; Address lo = 0 + sty vfy256zp_am1+2 ; Address hi = Y + ldy #0 ; Y = 0 + + vfy256zp_loop: + ; Switch into ALTZP, load byte from RAM, switch back + sta $C009 ; SETALTZP + vfy256zp_am1: + lda $0000,X ; A = next RAM byte + sta $C008 ; SETSTDZP + ; Compare loaded byte from RAM with pattern + cmp ($00),Y ; Compare with pattern byte + bne vfy256zp_vfail + jsr ramtest_incpat ; Increment pattern pointer + inx + ; Repeat + bne vfy256zp_loop ; Repeat until X rolls over (256 times) + + ; Success exit + rts + ; Fail exit + vfy256zp_vfail: + lda #$FF + rts +.endproc