448i mode (select button), sram reliability checking
This commit is contained in:
@@ -71,7 +71,7 @@ hdma_cg_addr_src
|
|||||||
.byt $00
|
.byt $00
|
||||||
hdma_mode_src .byt 74, $03, $01, $05, $00
|
hdma_mode_src .byt 74, $03, $01, $05, $00
|
||||||
hdma_scroll_src .byt 74
|
hdma_scroll_src .byt 74
|
||||||
.byt $00, $00, $ff, $00
|
.byt $00, $00, $ff, $0f
|
||||||
.byt $01
|
.byt $01
|
||||||
.byt $fc, $00, $05, $00
|
.byt $fc, $00, $05, $00
|
||||||
.byt $00
|
.byt $00
|
||||||
|
|||||||
@@ -67,6 +67,11 @@ fd_fnoff .word 0 ; offset of filename in file descriptor
|
|||||||
pad1mem .word 0
|
pad1mem .word 0
|
||||||
pad1trig .word 0
|
pad1trig .word 0
|
||||||
pad1delay .word 0
|
pad1delay .word 0
|
||||||
|
;----------menu layout/system constants (224/448)
|
||||||
|
listdisp .word 0 ; number of displayable list entries
|
||||||
|
textdmasize .word 0 ; number of bytes to copy each frame
|
||||||
|
barstep .byt 0 ; step size for bar
|
||||||
|
|
||||||
;----------hdma tables in WRAM (must be stable when cartridge is cut off)
|
;----------hdma tables in WRAM (must be stable when cartridge is cut off)
|
||||||
hdma_pal .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
hdma_pal .byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
.byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
.byt 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
|
|||||||
@@ -53,12 +53,12 @@ setup_gfx:
|
|||||||
;clear BG1 tilemap
|
;clear BG1 tilemap
|
||||||
ldx #BG1_TILE_BASE
|
ldx #BG1_TILE_BASE
|
||||||
stx $2116
|
stx $2116
|
||||||
DMA0(#$09, #$800, #^zero, #!zero, #$18)
|
DMA0(#$09, #$1000, #^zero, #!zero, #$18)
|
||||||
|
|
||||||
;clear BG2 tilemap
|
;clear BG2 tilemap
|
||||||
ldx #BG2_TILE_BASE
|
ldx #BG2_TILE_BASE
|
||||||
stx $2116
|
stx $2116
|
||||||
DMA0(#$09, #$800, #^zero, #!zero, #$18)
|
DMA0(#$09, #$1000, #^zero, #!zero, #$18)
|
||||||
|
|
||||||
;copy logo tiles
|
;copy logo tiles
|
||||||
ldx #$2000
|
ldx #$2000
|
||||||
@@ -123,17 +123,18 @@ tests:
|
|||||||
rep #$10 : .xl ;16-bit index
|
rep #$10 : .xl ;16-bit index
|
||||||
lda #$03 ;mode 3, mode 5 via HDMA :D
|
lda #$03 ;mode 3, mode 5 via HDMA :D
|
||||||
sta $2105
|
sta $2105
|
||||||
lda #$54 ;Tilemap addr 0xA800
|
lda #$58 ;Tilemap addr 0xB000
|
||||||
|
ora #$02 ;SC size 32x64
|
||||||
sta $2107 ;for BG1
|
sta $2107 ;for BG1
|
||||||
lda #$50 ;Tilemap addr 0xA000
|
lda #$50 ;Tilemap addr 0xA000
|
||||||
|
ora #$02 ;SC size 32x64
|
||||||
sta $2108 ;for BG2
|
sta $2108 ;for BG2
|
||||||
lda #$40 ;chr base addr:
|
lda #$40 ;chr base addr:
|
||||||
sta $210b ;BG1=0x0000, BG2=0x8000
|
sta $210b ;BG1=0x0000, BG2=0x8000
|
||||||
lda #$03 ;enable BG1+BG2
|
lda #$03 ;enable BG1+BG2
|
||||||
sta $212c ;BG Main
|
sta $212c ;BG Main
|
||||||
sta $212d ;BG Sub
|
sta $212d ;BG Sub
|
||||||
lda #$00 ;224 (01=448)
|
jsr setup_224
|
||||||
sta $2133 ;
|
|
||||||
lda #$00
|
lda #$00
|
||||||
sta $2130
|
sta $2130
|
||||||
stz $2121
|
stz $2121
|
||||||
@@ -202,6 +203,7 @@ snes_init:
|
|||||||
stz $2120 ;
|
stz $2120 ;
|
||||||
stz $2121 ;
|
stz $2121 ;
|
||||||
stz $2122 ; (CG Data?!)
|
stz $2122 ; (CG Data?!)
|
||||||
|
stz $2122 ; (CG Data?!)
|
||||||
stz $2123 ;
|
stz $2123 ;
|
||||||
stz $2124 ;
|
stz $2124 ;
|
||||||
stz $2125 ;
|
stz $2125 ;
|
||||||
|
|||||||
122
snes/menu.a65
122
snes/menu.a65
@@ -53,7 +53,7 @@ menu_cleanup:
|
|||||||
lsr
|
lsr
|
||||||
pha
|
pha
|
||||||
menu_cleanup_loop
|
menu_cleanup_loop
|
||||||
cmp #17
|
cmp listdisp
|
||||||
beq +
|
beq +
|
||||||
pha
|
pha
|
||||||
clc
|
clc
|
||||||
@@ -108,6 +108,9 @@ menu_updates:
|
|||||||
lda #$80
|
lda #$80
|
||||||
and pad1trig+1
|
and pad1trig+1
|
||||||
bne key_b
|
bne key_b
|
||||||
|
lda #$20
|
||||||
|
and pad1trig+1
|
||||||
|
bne key_select
|
||||||
bra menuupd_out
|
bra menuupd_out
|
||||||
key_down
|
key_down
|
||||||
jsr menu_key_down
|
jsr menu_key_down
|
||||||
@@ -124,6 +127,10 @@ key_left
|
|||||||
key_b
|
key_b
|
||||||
jsr menu_key_b
|
jsr menu_key_b
|
||||||
bra menuupd_out
|
bra menuupd_out
|
||||||
|
key_select
|
||||||
|
jsr menu_key_select
|
||||||
|
bra menuupd_out
|
||||||
|
|
||||||
menuupd_out
|
menuupd_out
|
||||||
lda #$0A
|
lda #$0A
|
||||||
sta cursor_y
|
sta cursor_y
|
||||||
@@ -146,7 +153,9 @@ redraw_filelist
|
|||||||
redraw_filelist_loop
|
redraw_filelist_loop
|
||||||
ldy dirptr_idx
|
ldy dirptr_idx
|
||||||
tya
|
tya
|
||||||
cmp #17*4
|
lsr
|
||||||
|
lsr
|
||||||
|
cmp listdisp
|
||||||
beq redraw_filelist_last
|
beq redraw_filelist_last
|
||||||
lda dirptr_bank
|
lda dirptr_bank
|
||||||
phb
|
phb
|
||||||
@@ -272,8 +281,9 @@ dirent_type_cont
|
|||||||
rts
|
rts
|
||||||
|
|
||||||
menu_key_down:
|
menu_key_down:
|
||||||
lda menu_sel
|
lda listdisp
|
||||||
cmp #$10
|
dec
|
||||||
|
cmp menu_sel
|
||||||
bne +
|
bne +
|
||||||
lda #$01
|
lda #$01
|
||||||
sta menu_dirty
|
sta menu_dirty
|
||||||
@@ -286,7 +296,8 @@ menu_key_down:
|
|||||||
sta dirptr_addr
|
sta dirptr_addr
|
||||||
sep #$20 : .as
|
sep #$20 : .as
|
||||||
rts
|
rts
|
||||||
+ inc
|
+ lda menu_sel
|
||||||
|
inc
|
||||||
sta menu_sel
|
sta menu_sel
|
||||||
down_out
|
down_out
|
||||||
rts
|
rts
|
||||||
@@ -317,9 +328,16 @@ menu_key_left:
|
|||||||
lda dirptr_addr
|
lda dirptr_addr
|
||||||
beq +
|
beq +
|
||||||
sec
|
sec
|
||||||
sbc #17*4
|
sbc listdisp
|
||||||
|
sec
|
||||||
|
sbc listdisp
|
||||||
|
sec
|
||||||
|
sbc listdisp
|
||||||
|
sec
|
||||||
|
sbc listdisp
|
||||||
cmp dirstart_addr
|
cmp dirstart_addr
|
||||||
bcc +
|
bcc +
|
||||||
|
bmi +
|
||||||
- sta dirptr_addr
|
- sta dirptr_addr
|
||||||
sep #$20 : .as
|
sep #$20 : .as
|
||||||
rts
|
rts
|
||||||
@@ -336,9 +354,11 @@ menu_key_right:
|
|||||||
lda #$01
|
lda #$01
|
||||||
sta menu_dirty
|
sta menu_dirty
|
||||||
rep #$20 : .al
|
rep #$20 : .al
|
||||||
lda dirptr_addr
|
lda listdisp
|
||||||
|
asl
|
||||||
|
asl
|
||||||
clc
|
clc
|
||||||
adc #17*4
|
adc dirptr_addr
|
||||||
sta dirptr_addr
|
sta dirptr_addr
|
||||||
sep #$20 : .as
|
sep #$20 : .as
|
||||||
rts
|
rts
|
||||||
@@ -353,6 +373,16 @@ menu_key_b:
|
|||||||
jsr select_item
|
jsr select_item
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
menu_key_select:
|
||||||
|
lda barstep
|
||||||
|
beq do_setup448
|
||||||
|
do_setup224
|
||||||
|
jsr setup_224
|
||||||
|
rts
|
||||||
|
do_setup448
|
||||||
|
jsr setup_448
|
||||||
|
rts
|
||||||
|
|
||||||
select_item:
|
select_item:
|
||||||
rep #$20 : .al
|
rep #$20 : .al
|
||||||
lda menu_sel
|
lda menu_sel
|
||||||
@@ -384,7 +414,6 @@ sel_is_dir
|
|||||||
|
|
||||||
select_file:
|
select_file:
|
||||||
; have avr load the rom
|
; have avr load the rom
|
||||||
sta @$fffffe
|
|
||||||
dey
|
dey
|
||||||
lda (dirptr_addr), y
|
lda (dirptr_addr), y
|
||||||
sta @AVR_PARAM+2
|
sta @AVR_PARAM+2
|
||||||
@@ -399,7 +428,6 @@ select_file:
|
|||||||
rts
|
rts
|
||||||
|
|
||||||
select_dir: ; y = direntry ptr
|
select_dir: ; y = direntry ptr
|
||||||
sta @$ffffff ;for great breakpoint
|
|
||||||
dey
|
dey
|
||||||
lda (dirptr_addr), y
|
lda (dirptr_addr), y
|
||||||
clc
|
clc
|
||||||
@@ -432,3 +460,77 @@ select_dir: ; y = direntry ptr
|
|||||||
sta @menu_dirty
|
sta @menu_dirty
|
||||||
plb
|
plb
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
setup_224:
|
||||||
|
php
|
||||||
|
rep #$30 : .xl : .al
|
||||||
|
lda #17
|
||||||
|
sta listdisp
|
||||||
|
dec
|
||||||
|
cmp menu_sel
|
||||||
|
bmi setup_228_adjsel
|
||||||
|
bra +
|
||||||
|
setup_228_adjsel
|
||||||
|
sta menu_sel
|
||||||
|
+
|
||||||
|
lda #18*64
|
||||||
|
sta textdmasize
|
||||||
|
lda #$0005
|
||||||
|
sta hdma_scroll+8
|
||||||
|
sep #$20 : .as
|
||||||
|
lda #$05
|
||||||
|
sta $2110
|
||||||
|
lda #$00
|
||||||
|
sta $2110
|
||||||
|
lda #$00
|
||||||
|
sta barstep
|
||||||
|
sta $2133
|
||||||
|
lda #$0a
|
||||||
|
sta hdma_math+6
|
||||||
|
lda #$01
|
||||||
|
sta menu_dirty
|
||||||
|
lda #^space64
|
||||||
|
ldx #!space64
|
||||||
|
sta print_bank
|
||||||
|
stx print_src
|
||||||
|
stz print_pal
|
||||||
|
lda #64
|
||||||
|
sta print_count
|
||||||
|
lda #27
|
||||||
|
sta print_y
|
||||||
|
stz print_x
|
||||||
|
jsr hiprint
|
||||||
|
lda #28
|
||||||
|
sta print_y
|
||||||
|
jsr hiprint
|
||||||
|
jsr hiprint
|
||||||
|
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
setup_448:
|
||||||
|
php
|
||||||
|
rep #$30 : .xl : .al
|
||||||
|
lda #34
|
||||||
|
sta listdisp
|
||||||
|
lda #36*64
|
||||||
|
sta textdmasize
|
||||||
|
lda #$ffba
|
||||||
|
sta hdma_scroll+8
|
||||||
|
sep #$20 : .as
|
||||||
|
lda #$ba
|
||||||
|
sta $2110
|
||||||
|
lda #$ff
|
||||||
|
sta $2110
|
||||||
|
lda #$01
|
||||||
|
sta barstep
|
||||||
|
sta $2133
|
||||||
|
lda #$06
|
||||||
|
sta hdma_math+6
|
||||||
|
lda #$01
|
||||||
|
sta menu_dirty
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ NMI_ROUTINE:
|
|||||||
|
|
||||||
ldx #BG1_TILE_BASE+32*10
|
ldx #BG1_TILE_BASE+32*10
|
||||||
stx $2116
|
stx $2116
|
||||||
DMA0(#$01, #$380*2-64*10, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*10, #$18)
|
DMA0(#$01, #34*64, #^BG1_TILE_BUF, #!BG1_TILE_BUF+64*10, #$18)
|
||||||
|
|
||||||
ldx #BG2_TILE_BASE+32*10
|
ldx #BG2_TILE_BASE+32*10
|
||||||
stx $2116
|
stx $2116
|
||||||
DMA0(#$01, #$380*2-64*10, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*10, #$18)
|
DMA0(#$01, #34*64, #^BG2_TILE_BUF, #!BG2_TILE_BUF+64*10, #$18)
|
||||||
|
|
||||||
ldx #BG2_TILE_BASE
|
ldx #BG2_TILE_BASE
|
||||||
stx $2116
|
stx $2116
|
||||||
@@ -33,7 +33,18 @@ NMI_ROUTINE:
|
|||||||
lda bar_yl
|
lda bar_yl
|
||||||
asl
|
asl
|
||||||
asl
|
asl
|
||||||
|
tax
|
||||||
|
lda barstep
|
||||||
|
php
|
||||||
|
txa
|
||||||
|
plp
|
||||||
|
bne small_bar
|
||||||
asl
|
asl
|
||||||
|
bra normal_bar
|
||||||
|
small_bar
|
||||||
|
clc
|
||||||
|
adc #36
|
||||||
|
normal_bar
|
||||||
sta bar_y
|
sta bar_y
|
||||||
|
|
||||||
lda bar_y
|
lda bar_y
|
||||||
|
|||||||
@@ -245,11 +245,13 @@ int main(void) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
dprintf("cmd was %x, going to snes main loop\n", cmd);
|
dprintf("cmd was %x, going to snes main loop\n", cmd);
|
||||||
|
led_std();
|
||||||
cmd=0;
|
cmd=0;
|
||||||
while(1) {
|
while(1) {
|
||||||
if(get_snes_reset()) {
|
if(get_snes_reset()) {
|
||||||
dprintf("RESET\n");
|
dprintf("RESET\n");
|
||||||
}
|
}
|
||||||
|
sram_reliable();
|
||||||
snes_main_loop();
|
snes_main_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
40
src/memory.c
40
src/memory.c
@@ -218,30 +218,30 @@ uint32_t load_sram(uint8_t* filename, uint32_t base_addr) {
|
|||||||
|
|
||||||
|
|
||||||
void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr) {
|
void save_sram(uint8_t* filename, uint32_t sram_size, uint32_t base_addr) {
|
||||||
uint32_t count = 0;
|
uint32_t count = 0;
|
||||||
uint32_t num = 0;
|
uint32_t num = 0;
|
||||||
|
|
||||||
spi_none();
|
spi_none();
|
||||||
file_open(filename, FA_CREATE_ALWAYS | FA_WRITE);
|
file_open(filename, FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if(file_res) {
|
if(file_res) {
|
||||||
uart_putc(0x30+file_res);
|
uart_putc(0x30+file_res);
|
||||||
}
|
}
|
||||||
while(count<sram_size) {
|
while(count<sram_size) {
|
||||||
set_avr_addr(base_addr+count);
|
set_avr_addr(base_addr+count);
|
||||||
spi_fpga();
|
spi_fpga();
|
||||||
spiTransferByte(0x81); // read
|
spiTransferByte(0x81); // read
|
||||||
spiTransferByte(0); // dummy
|
spiTransferByte(0); // dummy
|
||||||
for(int j=0; j<sizeof(file_buf); j++) {
|
for(int j=0; j<sizeof(file_buf); j++) {
|
||||||
file_buf[j] = spiTransferByte(0x00);
|
file_buf[j] = spiTransferByte(0x00);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
spi_none();
|
spi_none();
|
||||||
num = file_write();
|
num = file_write();
|
||||||
if(file_res) {
|
if(file_res) {
|
||||||
uart_putc(0x30+file_res);
|
uart_putc(0x30+file_res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_close();
|
file_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -269,13 +269,27 @@ uint32_t calc_sram_crc(uint32_t base_addr, uint32_t size) {
|
|||||||
|
|
||||||
uint8_t sram_reliable() {
|
uint8_t sram_reliable() {
|
||||||
uint16_t score=0;
|
uint16_t score=0;
|
||||||
uint32_t val = sram_readlong(SRAM_SCRATCHPAD);
|
// uint32_t val = sram_readlong(SRAM_SCRATCHPAD);
|
||||||
while(score<SRAM_RELIABILITY_SCORE) {
|
uint8_t result = 0;
|
||||||
|
/* while(score<SRAM_RELIABILITY_SCORE) {
|
||||||
if(sram_readlong(SRAM_SCRATCHPAD)==val) {
|
if(sram_readlong(SRAM_SCRATCHPAD)==val) {
|
||||||
score++;
|
score++;
|
||||||
} else {
|
} else {
|
||||||
|
set_pwr_led(0);
|
||||||
score=0;
|
score=0;
|
||||||
}
|
}
|
||||||
|
}*/
|
||||||
|
for(uint16_t i = 0; i < SRAM_RELIABILITY_SCORE; i++) {
|
||||||
|
if(sram_readlong(SRAM_SCRATCHPAD)==0x12345678) {
|
||||||
|
score++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
if(score<SRAM_RELIABILITY_SCORE) {
|
||||||
|
result = 0;
|
||||||
|
dprintf("score=%d\n", score);
|
||||||
|
} else {
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
set_pwr_led(result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,13 +56,15 @@ uint8_t get_snes_reset() {
|
|||||||
* monitors SRAM changes and other things
|
* monitors SRAM changes and other things
|
||||||
*/
|
*/
|
||||||
uint32_t diffcount = 0, samecount = 0;
|
uint32_t diffcount = 0, samecount = 0;
|
||||||
|
uint8_t sram_valid = 0;
|
||||||
void snes_main_loop() {
|
void snes_main_loop() {
|
||||||
if(initloop) {
|
if(initloop) {
|
||||||
saveram_crc_old = calc_sram_crc(saveram_base_addr, saveram_size);
|
saveram_crc_old = calc_sram_crc(saveram_base_addr, saveram_size);
|
||||||
initloop=0;
|
initloop=0;
|
||||||
}
|
}
|
||||||
saveram_crc = calc_sram_crc(saveram_base_addr, saveram_size);
|
saveram_crc = calc_sram_crc(saveram_base_addr, saveram_size);
|
||||||
if(crc_valid) {
|
sram_valid = sram_reliable();
|
||||||
|
if(crc_valid && sram_valid) {
|
||||||
if(saveram_crc != saveram_crc_old) {
|
if(saveram_crc != saveram_crc_old) {
|
||||||
if(samecount) {
|
if(samecount) {
|
||||||
diffcount=1;
|
diffcount=1;
|
||||||
@@ -84,7 +86,7 @@ void snes_main_loop() {
|
|||||||
}
|
}
|
||||||
saveram_crc_old = saveram_crc;
|
saveram_crc_old = saveram_crc;
|
||||||
}
|
}
|
||||||
dprintf("valid=%d diffcount=%ld samecount=%ld\n", crc_valid, diffcount, samecount);
|
dprintf("crc_valid=%d sram_valid=%d diffcount=%ld samecount=%ld\n", crc_valid, sram_valid, diffcount, samecount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -96,6 +98,7 @@ uint8_t menu_main_loop() {
|
|||||||
sram_writebyte(0, SRAM_CMD_ADDR);
|
sram_writebyte(0, SRAM_CMD_ADDR);
|
||||||
while(!cmd) {
|
while(!cmd) {
|
||||||
if(!get_snes_reset()) {
|
if(!get_snes_reset()) {
|
||||||
|
while(!sram_reliable());
|
||||||
cmd = sram_readbyte(SRAM_CMD_ADDR);
|
cmd = sram_readbyte(SRAM_CMD_ADDR);
|
||||||
}
|
}
|
||||||
if(get_snes_reset()) {
|
if(get_snes_reset()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user