32 Commits

Author SHA1 Message Date
optixx
d229719d0c o add bankselect test for logic analyser test 2009-04-26 16:24:04 +02:00
optixx
096ad71b4e o make crc an 8mb game
o add rand garbage in banks 3-8 and banks 9-16
2009-04-26 16:22:41 +02:00
optixx
aa29d483eb o get crc working on 8 banks 2009-04-26 15:02:10 +02:00
optixx
dc83f998c7 o switch to compact mem layout
o 16 bit code
0 24 bit data
2009-04-26 11:39:23 +02:00
optixx
369667e154 o cleanup
o refactor debug function
o add ifeq platform to makefile
o get crc working on bank 0
2009-04-26 11:00:02 +02:00
optixx
4a083cbea3 o crc checking rom 2009-04-25 20:41:02 +02:00
optixx
edf204ac24 o more crc checking 2009-04-24 09:21:54 +02:00
optixx
0c378a9f7c o cleanup 2009-04-22 20:04:28 +02:00
optixx
55e3468f74 o tried other rom 2009-04-22 20:02:29 +02:00
optixx
78e9dce5ea o add new test roms 2009-04-22 09:09:34 +02:00
optixx
eaf0bda3ee o add converter tools: 2009-04-22 09:08:16 +02:00
optixx
d58d3439ec o add crc check 2009-04-22 09:07:52 +02:00
optixx
b5f111fa41 o use up more rom space to test mem holes 2009-04-21 21:14:36 +02:00
optixx
6508530384 o add dex x hex x binary converter 2009-04-20 21:59:50 +02:00
optixx
e4364eedb1 o add test roms 2009-04-20 21:45:38 +02:00
optixx
74312e08e1 o add bank test
o cleanup bank debug in uploaded
o add header dump to uploader
2009-04-20 21:44:14 +02:00
optixx
09f42acfc8 o played with banks
o add ditz
o add checksize
2009-04-20 20:14:42 +02:00
optixx
70984ebd00 o 2009-04-17 08:53:46 +02:00
optixx
cafe5b8efd o add cleanup db
o add analyse sql batch
2009-04-17 08:53:13 +02:00
optixx
a1e89d9528 o finish rom analyse 2009-04-13 17:30:04 +02:00
optixx
43ee4e0f7e o swicth to new rom layout 2009-04-08 21:43:03 +02:00
optixx
8b606ce329 o add missing file
o tweak ignores
2009-04-08 21:33:18 +02:00
optixx
4b99eeb2d0 o clean up 2009-04-08 21:31:07 +02:00
optixx
27b58a09f2 o add bsnes 2009-04-08 21:29:36 +02:00
optixx
bcb4a055e9 o add avrusb
o add zsnes
2009-04-06 21:19:15 +02:00
optixx
c9a23df103 o add another snes demo 2009-04-05 18:47:38 +02:00
optixx
0354b82c8e o finish first poc 2009-04-05 15:29:09 +02:00
optixx
9d38af4267 o add org roms
o add first dump
2009-03-30 00:27:06 +02:00
optixx
c88a4f3b49 o cleanup 2009-03-29 22:37:00 +02:00
optixx
27278a7f36 o add file dumpo 2009-03-29 22:35:57 +02:00
optixx
aacd3296ef oMerge branch 'sdcard_m32'
Conflicts:
	poc/avr_sdcard/Makefile
	poc/avr_sdcard/main.c
2009-03-29 19:51:01 +02:00
optixx
9f55ce0992 o testing 2009-03-15 19:25:59 +01:00
1207 changed files with 360026 additions and 65 deletions

4
.ditz-config Normal file
View File

@@ -0,0 +1,4 @@
--- !ditz.rubyforge.org,2008-03-06/config
name: David
email: david@optixx.org
issue_dir: bugs

5
.gitignore vendored
View File

@@ -16,3 +16,8 @@
.DS_Store .DS_Store
*.a *.a
*.prj *.prj
*.bak
*.smc
*.swc
*.rom
*.usage

View File

@@ -0,0 +1,18 @@
--- !ditz.rubyforge.org,2008-03-06/issue
title: Test
desc: Test
type: :bugfix
component: snesram
release:
reporter: David <david@optixx.org>
status: :unstarted
disposition:
creation_time: 2009-04-20 18:13:29.104365 Z
references: []
id: 33e57a7c3ac89afc2e37880441fe0eeec05e2b3f
log_events:
- - 2009-04-20 18:13:33.543384 Z
- David <david@optixx.org>
- created
- nope

8
bugs/project.yaml Normal file
View File

@@ -0,0 +1,8 @@
--- !ditz.rubyforge.org,2008-03-06/project
name: snesram
version: "0.5"
components:
- !ditz.rubyforge.org,2008-03-06/component
name: snesram
releases: []

View File

@@ -181,11 +181,10 @@ LDFLAGS += $(PRINTF_LIB_MIN) $(SCANF_LIB) $(MATH_LIB)
AVRDUDE_PROGRAMMER = stk500v2 AVRDUDE_PROGRAMMER = stk500v2
# com1 = serial port. Use lpt1 to connect to parallel port. # com1 = serial port. Use lpt1 to connect to parallel port.
AVRDUDE_PORT = /dev/tty.PL2303-00001324 # programmer connected to serial device
AVRDUDE_PORT = /dev/tty.PL2303-00001124
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
# Uncomment the following if you want avrdude's erase cycle counter. # Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn, # Note that this counter needs to be initialized first using -Yn,
@@ -211,10 +210,6 @@ AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
# avrdude -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -U hfuse:w:0xd9:m # avrdude -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -U hfuse:w:0xd9:m
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Define directories, if needed. # Define directories, if needed.
@@ -327,16 +322,10 @@ gccversion :
# Program the device. # Program the device.
flash_avrdude: flash
flash: $(TARGET).hex $(TARGET).eep flash: $(TARGET).hex $(TARGET).eep
sudo $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) sudo $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
flash_uisp:
sudo uisp -dprog=avr910 -dpart=ATmega8 -dserial=/dev/ttyUSB0 --verify --erase -v --upload if=$(TARGET).hex
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \ COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \ --change-section-address .data-0x800000 \

35
poc/avr_sdcard/checksize Normal file
View File

@@ -0,0 +1,35 @@
#!/bin/sh
# Name: checksize
# Project: PowerSwitch/AVR-USB
# Author: Christian Starkjohann
# Creation Date: 2004-12-29
# Tabsize: 4
# Copyright: (c) 2005 OBJECTIVE DEVELOPMENT Software GmbH.
# Revision: $Id: checksize 83 2006-01-05 22:20:53Z cs $
error=0
codelimit=2048 # default value
datalimit=96 # default value; leave 32 bytes for stack
if [ $# -gt 1 ]; then
codelimit="$2"
fi
if [ $# -gt 2 ]; then
datalimit="$3"
fi
set -- `avr-size -d "$1" | awk '/[0-9]/ {print $1 + $2, $2 + $3, $2}'`
if [ $1 -gt $codelimit ]; then
echo "*** code size $1 exceeds limit of $codelimit"
error=1
else
echo "ROM: $1 bytes (data=$3)"
fi
if [ $2 -gt $datalimit ]; then
echo "*** data size $2 exceeds limit of $datalimit"
error=1
else
echo "RAM: $2 bytes"
fi
exit $error

View File

@@ -7,6 +7,10 @@
#include "mmc.h" #include "mmc.h"
#include "fat.h" #include "fat.h"
// Debug
#define debug(x, fmt) printf("%s:%u: %s=" fmt, __FILE__, __LINE__, #x, x)
extern FILE uart_stdout;
//SREG defines //SREG defines
#define S_MOSI PB5 #define S_MOSI PB5
#define S_MISO PB6 #define S_MISO PB6
@@ -24,43 +28,102 @@
#define RAM_DIR DDRA #define RAM_DIR DDRA
#define RAM_REG PINA #define RAM_REG PINA
#define CTRL_PORT PORTB #define CTRL_PORT PORTB
#define CTR_DIR DDRB #define CTR_DIR DDRB
#define LATCH_PORT PORTB #define LATCH_PORT PORTB
#define LATCH_DIR DDRB #define LATCH_DIR DDRB
#define SPI_PORT PORTB #define SPI_PORT PORTB
#define SPI_DIR DDRB #define SPI_DIR DDRB
#define LED_PORT PORTD #define LED_PORT PORTD
#define LED_DIR DDRD #define LED_DIR DDRD
//#define FILENAME "sprite.raw" //ok
//#define FILENAME "ascii.smc" //ok
//#define FILENAME "rom.smc" //ok
//#define FILENAME "supert.smc"
//#define FILENAME "vortex.smc"
//#define FILENAME "mrdo.smc"
//#define FILENAME "spacei.smc"
//#define FILENAME "bank01.smc" //ok
//#define FILENAME "bank02.smc" //ok
//#define FILENAME "bank03.smc" //ok
//#define FILENAME "bank04.smc" //ok
//#define FILENAME "bank05.smc" //ok
//#define FILENAME "bank06.smc" //ok
//#define FILENAME "bank07.smc" //ok
//#define FILENAME "banklo.smc" //ok
//#define FILENAME "bankhi.smc" //ok
//#define FILENAME "vram2.smc" //ok
//#define FILENAME "super02.smc"
#define FILENAME "crc.smc"
//#define FILENAME "banks.smc"
#define READ_BUFFER_SIZE 512 #define ROMSIZE 4
#define BLOCKS 510 #define DUMPNAME "dump256.smc"
#define BUFFER_SIZE 512
#define BLOCKS (ROMSIZE << 8)
#define MEMSIZE 0x80000
#define debug(x, fmt) printf("%s:%u: %s=" fmt, __FILE__, __LINE__, #x, x) uint8_t read_buffer[BUFFER_SIZE];
extern FILE uart_stdout;
uint8_t read_buffer[READ_BUFFER_SIZE]; uint16_t crc_xmodem_update (uint16_t crc, uint8_t data)
{
int i;
crc = crc ^ ((uint16_t)data << 8);
for (i=0; i<8; i++)
{
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
return crc;
}
uint16_t do_crc(uint8_t * data,uint16_t size)
{
uint16_t crc =0;
uint16_t i;
for (i=0; i<size; i++){
crc = crc_xmodem_update(crc,data[i]);
//printf("%x : %x\n",crc,data[i]);
}
return crc;
}
uint16_t do_crc_update(uint16_t crc,uint8_t * data,uint16_t size)
{
uint16_t i;
for (i=0; i<size; i++)
crc = crc_xmodem_update(crc,data[i]);
return crc;
}
void dump_packet(uint32_t addr,uint32_t len,uint8_t *packet){ void dump_packet(uint32_t addr,uint32_t len,uint8_t *packet){
uint16_t i,j; uint16_t i,j;
uint16_t sum =0; uint16_t sum = 0;
uint8_t clear=0;
for (i=0;i<len;i+=16) { for (i=0;i<len;i+=16) {
sum = 0; sum = 0;
for (j=0;j<16;j++) { for (j=0;j<16;j++) {
sum +=packet[i+j]; sum +=packet[i+j];
} }
if (!sum){ if (!sum){
//printf("."); clear=1;
continue; continue;
} }
if (clear){
printf("*\n");
clear = 0;
}
printf("%08lx:", addr + i); printf("%08lx:", addr + i);
for (j=0;j<16;j++) { for (j=0;j<16;j++) {
printf(" %02x", packet[i+j]); printf(" %02x", packet[i+j]);
@@ -96,6 +159,17 @@ void spi_master_transmit(unsigned char cData)
while(!(SPSR & (1<<SPIF))); while(!(SPSR & (1<<SPIF)));
} }
void sram_set_addr(uint32_t addr)
{
spi_master_transmit((uint8_t)(addr>>16));
spi_master_transmit((uint8_t)(addr>>8));
spi_master_transmit((uint8_t)(addr>>0));
LATCH_PORT |= (1<<S_LATCH);
LATCH_PORT &= ~(1<<S_LATCH);
}
uint8_t sram_read(uint32_t addr) uint8_t sram_read(uint32_t addr)
{ {
uint8_t byte; uint8_t byte;
@@ -166,12 +240,19 @@ void sram_init(void){
LED_PORT |= (1<<D_LED0); LED_PORT |= (1<<D_LED0);
} }
void sram_snes_mode(void){
CTRL_PORT |= (1<<R_WR);
CTRL_PORT &= ~(1<<R_RD);
}
void sram_clear(uint32_t addr, uint32_t len){ void sram_clear(uint32_t addr, uint32_t len){
uint32_t i; uint32_t i;
for (i=addr; i<(addr + len);i++ ) for (i=addr; i<(addr + len);i++ ){
if (0==i%0xfff)
printf("sram_clear %lx\n\r",i);
sram_write(i, 0x00); sram_write(i, 0x00);
}
} }
void sram_copy(uint32_t addr,uint8_t *src, uint32_t len){ void sram_copy(uint32_t addr,uint8_t *src, uint32_t len){
@@ -191,7 +272,13 @@ void sram_read_buffer(uint32_t addr,uint8_t *dst, uint32_t len){
ptr++; ptr++;
} }
} }
uint8_t sram_check(uint8_t *buffer, uint32_t len){
for (uint16_t cnt=0; cnt<len; cnt++)
if (buffer[cnt])
return 1;
return 0;
}
int main(void) int main(void)
{ {
@@ -199,73 +286,154 @@ int main(void)
uint8_t fat_attrib = 0; uint8_t fat_attrib = 0;
uint32_t fat_size = 0; uint32_t fat_size = 0;
uint32_t rom_addr = 0; uint32_t rom_addr = 0;
uint8_t bank_cnt = 0;
uint16_t crc = 0;
uint16_t block_cnt;
uart_init(); uart_init();
stdout = &uart_stdout; stdout = &uart_stdout;
sram_init(); sram_init();
printf("sram_init\n"); printf("SRAM Init\n");
spi_init(); spi_init();
printf("spi_init\n"); printf("SPI Init\n");
/*
sram_clear(0x000000, 0x400000); #if 0
printf("sram_clear\n"); uint8_t t[] = "david";
*/ printf("Test CRC %x\n",do_crc(t,5));
while(1);
#endif
#if 0
sram_clear(0x000000, 0x80000);
printf("sram_clear\n");
#endif
#if 0
printf("read 0x0f0f\n");
sram_read(0x0f0f);
printf("write 0x0f0f\n");
sram_write(0x0f0f,0xaa);
#endif
#if 0
rom_addr = 0x4aaaa;
printf("write %lx\n",rom_addr);
sram_set_addr(rom_addr);
while(1);
#endif
//printf("read 0x0f0f\n");
//sram_read(0x0f0f);
//printf("write 0x0f0f\n");
//sram_write(0x0f0f,0xaa);
//while(1);
while ( mmc_init() !=0) { while ( mmc_init() !=0) {
printf("no sdcard..\n"); printf("No sdcard...\n");
} }
printf("mmc_init\n"); printf("MMC Init done\n");
fat_init(read_buffer); fat_init(read_buffer);
printf("fat_init\n"); printf("FAT Init done.\n");
rom_addr = 0x000000; rom_addr = 0x000000;
printf("look for sprite.smc\n"); printf("Look for %s\n",FILENAME);
if (fat_search_file((uint8_t*)"sprite.smc", if (fat_search_file((uint8_t*)FILENAME,
&fat_cluster, &fat_cluster,
&fat_size, &fat_size,
&fat_attrib, &fat_attrib,
read_buffer) == 1) { read_buffer) == 1) {
for (uint16_t block_cnt=0; block_cnt<BLOCKS+1; block_cnt++) { for (block_cnt=0; block_cnt<BLOCKS; block_cnt++) {
fat_read_file (fat_cluster,read_buffer,block_cnt); fat_read_file (fat_cluster,read_buffer,block_cnt);
if (block_cnt==0){
// Skip Copier Header if (block_cnt && block_cnt % 64 == 0){
printf("Copier Header \n",block_cnt,rom_addr); printf("Write Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
dump_packet(rom_addr,512,read_buffer); bank_cnt++;
printf("Read Blocks "); crc = 0;
} }
printf(".",block_cnt,rom_addr); crc = do_crc_update(crc,read_buffer,512);
sram_copy(rom_addr,read_buffer,512); sram_copy(rom_addr,read_buffer,512);
rom_addr += 512; rom_addr += 512;
} }
printf("\nDone %lx\n",rom_addr); printf("Write Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
printf("Done\n");
} }
printf("Dump Headern\r");
rom_addr = 0x8000-512;
sram_read_buffer(rom_addr,read_buffer,512);
dump_packet(rom_addr,512,read_buffer);
#if 0
printf("Dump Memory\n\r");
rom_addr = 0x000000; rom_addr = 0x000000;
for (uint16_t block_cnt=0; block_cnt<BLOCKS; block_cnt++) { for (uint16_t block_cnt=0; block_cnt < 64; block_cnt++) {
sram_read_buffer(rom_addr,read_buffer,512); sram_read_buffer(rom_addr,read_buffer,512);
dump_packet(rom_addr,512,read_buffer); dump_packet(rom_addr,512,read_buffer);
rom_addr += 512; rom_addr += 512;
} }
printf("Done\n",rom_addr); printf("\nDone 0x%lx\n",rom_addr);
#endif
#if 1
block_cnt = 0;
crc = 0;
bank_cnt=0x00;
rom_addr = 0x000000;
for (block_cnt=0; block_cnt<BLOCKS; block_cnt++) {
sram_read_buffer(rom_addr,read_buffer,512);
if (block_cnt && block_cnt % 64 == 0){
printf("Read Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
bank_cnt++;
crc = 0;
}
crc = do_crc_update(crc,read_buffer,512);
rom_addr += 512;
}
printf("Read Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
#endif
#if 0
printf("Look for %s\n",DUMPNAME);
fat_cluster = 0;
fat_attrib = 0;
fat_size = 0;
if (fat_search_file((uint8_t*)DUMPNAME,
&fat_cluster,
&fat_size,
&fat_attrib,
read_buffer) == 1) {
printf("Found %s\n",DUMPNAME);
rom_addr = 0x000000;
bank_cnt =0;
for (uint16_t block_cnt=0; block_cnt<BLOCKS; block_cnt++) {
printf("Write 1");
sram_read_buffer(rom_addr,read_buffer,512);
printf("Write 2");
fat_write_file (fat_cluster,read_buffer,block_cnt);
if (block_cnt % 64 == 0){
bank_cnt++;
}
printf("Write File Bank: 0x%x Addr: 0x%lx Skipped: %li\n",bank_cnt,rom_addr,skip_block);
rom_addr += 512;
}
printf("Done 0x%lx Skipped %li\n",rom_addr,skip_block);
}
#endif
sram_snes_mode();
printf("\nEnter Snes mode\n");
while(1); while(1);
return 0 ;
return(0);
} }

View File

@@ -151,12 +151,10 @@ int main(int argc, char **argv)
unsigned char *buffer; unsigned char *buffer;
unsigned char dummy[10]; unsigned char dummy[10];
buffer = (unsigned char*)malloc(ROMSIZE); buffer = (unsigned char*)malloc(ROMSIZE);
memset(buffer,0,ROMSIZE);
if (NULL == buffer){ if (NULL == buffer){
fprintf(stderr, "Malloc failed",f); fprintf(stderr, "Malloc failed",f);
exit(-1); exit(-1);
} }
put(&ftdica,0x00);
for ( addr = 0; addr<ROMSIZE; addr+=1){ for ( addr = 0; addr<ROMSIZE; addr+=1){
byte = data_read(&ftdica); byte = data_read(&ftdica);
printf("0x%08x: %x\n",addr,byte); printf("0x%08x: %x\n",addr,byte);
@@ -166,7 +164,10 @@ int main(int argc, char **argv)
} }
dump_packet(0x000,ROMSIZE,buffer); dump_packet(0x000,ROMSIZE,buffer);
FILE *fp;
fp=fopen("dump.rom", "wb");
fwrite(buffer, ROMSIZE, 1, fp);
fclose(fp);
ftdi_disable_bitbang(&ftdica); ftdi_disable_bitbang(&ftdica);
ftdi_usb_close(&ftdica); ftdi_usb_close(&ftdica);

Binary file not shown.

BIN
roms/anime.smc Normal file

Binary file not shown.

BIN
roms/bank01.smc Normal file

Binary file not shown.

BIN
roms/bank02.smc Normal file

Binary file not shown.

BIN
roms/bank03.smc Normal file

Binary file not shown.

BIN
roms/bank04.smc Normal file

Binary file not shown.

BIN
roms/bank05.smc Normal file

Binary file not shown.

BIN
roms/bank06.smc Normal file

Binary file not shown.

BIN
roms/bank07.smc Normal file

Binary file not shown.

BIN
roms/bankhi.smc Normal file

Binary file not shown.

BIN
roms/banklo.smc Normal file

Binary file not shown.

BIN
roms/dezaemon.smc Normal file

Binary file not shown.

BIN
roms/dump256.smc Normal file

Binary file not shown.

BIN
roms/dump512.smc Normal file

Binary file not shown.

BIN
roms/hungry.smc Normal file

Binary file not shown.

BIN
roms/kungfu.smc Normal file

Binary file not shown.

BIN
roms/mrdo.smc Normal file

Binary file not shown.

BIN
roms/spacei.smc Normal file

Binary file not shown.

BIN
roms/supert.smc Normal file

Binary file not shown.

BIN
roms/vortex.smc Normal file

Binary file not shown.

BIN
roms/vram2.smc Normal file

Binary file not shown.

28
scripts/b.py Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/python
import sys
try:
if 'x' in sys.argv[1] or 'X' in sys.argv[1]:
v = int(sys.argv[1],16)
else:
v = int(sys.argv[1])
except:
print "%s NUM" % sys.argv[0]
sys.exit(-1)
bits = 32
sys.stdout.write("0b")
for i in range(bits-1,-1,-1):
s = 1<<i
if v & s:
sys.stdout.write("1")
else:
sys.stdout.write("0")
if i and not i%8:
sys.stdout.write(" ")
print
print "0x%x"% v
print v

66
scripts/crc_xmodem.py Normal file
View File

@@ -0,0 +1,66 @@
import ctypes
import sys
import os
def crc_xmodem_update(crc,data):
crc = ctypes.c_uint16(crc.value ^ data.value << 8)
for i in range(0,8):
if crc.value & 0x8000:
crc = ctypes.c_uint16((crc.value << 1) ^ 0x1021);
else:
crc = ctypes.c_uint16(crc.value << 1);
return crc
def do_crc(data):
crc = ctypes.c_uint16(0)
for idx,char in enumerate(data):
crc = crc_xmodem_update(crc,ctypes.c_uint8(ord(char)))
return crc.value
def test_performance():
data=str()
fd = open("/dev/urandom")
for i in range(0,256):
data+= fd.read(1024)
sys.stdout.write("*")
sys.stdout.flush()
print
fd.close()
print "%s" % do_crc(data)
def test_algo():
data='david'
data='da'
print "%x" % do_crc(data)
def main():
#import cProfile
#cProfile.run('test_performance()')
size = os.stat(sys.argv[1])[6]
fd = open(sys.argv[1])
addr = 0x0000
step = 2**15
result = []
while addr < size:
try:
block = fd.read(step)
addr += step
except:
print "Done"
break
crc = do_crc(block)
print "Bank: 0x%02x Addr: 0x%06x Block: 0x%04x CRC 0x%04x" % (addr/(2**15),addr,addr/512, ctypes.c_uint16(crc).value)
result.append(hex(ctypes.c_uint16(crc).value))
#print result
if __name__ == '__main__':
#test_algo()
main()

279
scripts/rom.py Normal file
View File

@@ -0,0 +1,279 @@
import sqlite3
import os
import re
import string
import stat
import popen2
import glob
import sys
import pprint
# Detect Mirrord Roms
# Rom Type Mapping
#
# 0 ROM only
# 1 ROM and RAM
# 2 ROM and Save RAM
# 3 ROM and DSP1 chip
# 4 ROM, RAM and DSP1 chip
# 5 ROM, Save RAM and DSP1 chip
# 19 ROM and Super FX chip
#227 ROM, RAM and GameBoy data
#246 ROM and DSP2 chip
#Process /Users/david/Devel/arch/snes/roms/Teenage Mutant Ninja Turtles IV - Turtles in Time (U) [!].smc
#0 uCON64 2.0.0 Apple (PPC) 1999-2005
#1 Uses code from various people. See 'developers.html' for more!
#2 This may be freely redistributed under the terms of the GNU Public License
#4 /Users/david/Devel/arch/snes/roms/Teenage Mutant Ninja Turtles IV - Turtles in Time (U) [!].smc
#6 Multi Game Doctor (2)/Multi Game Hunter/MGH
#8 00007fb0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
#9 00007fc0 54 2e 4d 2e 4e 2e 54 2e 20 34 20 20 20 20 20 20 T.M.N.T. 4
#10 00007fd0 20 20 20 20 20 20 00 0a 00 01 a4 00 7c e9 83 16 ......|...
#12 Super Nintendo Entertainment System/SNES/Super Famicom
#13 T.M.N.T. 4
#14 Konami
#15 U.S.A.
#16 1048576 Bytes (8.0000 Mb)
#18 Padded: Maybe, 105 Bytes (0.0008 Mb)
#19 Interleaved/Swapped: No
#20 Backup unit/emulator header: No
#21 HiROM: No
#22 Internal size: 8 Mb
#23 ROM type: (0) ROM
#24 ROM speed: 200 ns (SlowROM)
#25 SRAM: No
#26 Version: 1.0
#27 Checksum: Ok, 0x1683 (calculated) == 0x1683 (internal)
#28 Inverse checksum: Ok, 0xe97c (calculated) == 0xe97c (internal)
#29 Checksum (CRC32): 0x5940bd99
#31 This ROM has no backup unit header
swc_header_tpl='''
Backup unit header info (SWC)
00000000 20 00 0c 00 00 00 00 00 aa bb 04 00 00 00 00 00 ...............
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
[0-1] File size: 262144 Bytes (2.0000 Mb) => Matches
[2:7] Run program in mode: 3
[2:6] Split: No => Matches
[2:5] SRAM mapping mode: LoROM => Matches
[2:4] DRAM mapping mode: LoROM => Matches
[2:3-2] SRAM size: 0 kB => Matches
[2:1] Run program in mode: 3
[2:0] External cartridge memory: Disabled
'''
def createdb():
try:
os.unlink("roms.sqlite3")
except:
pass
conn = sqlite3.connect('roms.sqlite3')
c = conn.cursor()
c.execute('''create table roms
(
file_name text,
file_ext text,
file_size integer,
rom_size integer,
rom_mb real,
rom_padded integer,
rom_trainer integer,
rom_backup integer,
rom_name text,
rom_vendor text,
rom_region text,
rom_hirom integer,
rom_internalsize integer,
rom_type integer,
rom_speed integer,
rom_sram integer,
rom_version real,
rom_chk integer,
swc_size integer,
swc_mode integer,
swc_split text,
swc_sram_mode text,
swc_dram_mode text,
swc_sram_size text
)''')
return conn,c
def process(conn,c,file_name,out):
file_ext = os.path.splitext(file_name)[1].replace(".",'')
file_size = os.stat(file_name)[stat.ST_SIZE]
rom_size = 0
rom_mb = 0
rom_padded = 0
rom_trainer = 0
rom_backup = 0
rom_name = ''
rom_vendor = ''
rom_region = ''
rom_hirom = 0
rom_internalsize = 0
rom_type = 0
rom_speed = 0
rom_sram = 0
rom_version = 0
rom_chk = 0
swc_size = 0
swc_mode = 0
swc_split = ''
swc_sram_mode = ''
swc_dram_mode = ''
swc_sram_size = ''
print "-" * 60
print "Process %s" % file_name
try:
rom_name = out[13]
rom_vendor = out[14]
rom_region = out[15]
try:
rom_size = int(out[16].split(" ")[0])
rom_mb = float(re.compile("([\d.]+) Mb").search(out[16]).groups()[0])
except:
print "Broken..."
return
if not "No" in out[18]:
rom_padded = int(re.compile("([\d.]+) Bytes").search(out[18]).groups()[0])
for idx,line in enumerate(out):
if line is None:
continue
if "Backup unit/emulator header: Yes" in line:
rom_backup = int(re.compile("([\d.]+) Bytes").search(line).groups()[0])
if "Intro/Trainer:" in line:
rom_trainer = int(re.compile("([\d.]+) Bytes").search(line).groups()[0])
if "HiROM: Yes" in line:
rom_hirom = 1
if "Internal size:" in line:
rom_internalsize = int(re.compile("([\d.]+) Mb").search(line).groups()[0])
if "ROM type:" in line:
try:
rom_type = int(re.compile("([\d]+)").search(line).groups()[0])
except:
pass
if "ROM speed:" in line:
rom_speed = int(re.compile("([\d]+) ns").search(line).groups()[0])
if "SRAM: Yes" in line:
rom_sram = int(re.compile("([\d]+) kBytes").search(line).groups()[0])
if "Version:" in line:
rom_version = float(re.compile("([\d.]+)").search(line).groups()[0])
if "Checksum: Ok" in line:
rom_chk = 1
except:
for idx,line in enumerate(out):
if line is None:
continue
print idx,line
sys.exit()
query = """INSERT INTO roms
VALUES
(
?,?,?,?,?,
?,?,?,?,?,
?,?,?,?,?,
?,?,?,?,?,
?,?,?,?) """
data = (file_name,
file_ext,
file_size,
rom_size,
rom_mb,
rom_padded,
rom_trainer,
rom_backup,
rom_name,
rom_vendor,
rom_region,
rom_hirom,
rom_internalsize,
rom_type,
rom_speed,
rom_sram,
rom_version,
rom_chk,
swc_size,
swc_mode,
swc_split,
swc_sram_mode,
swc_dram_mode,
swc_sram_size)
c.execute(query,data)
conn.commit()
def ucon64_info(filename):
cmd = "ucon64 --dbuh -snes \"%s\"" % filename
r, w, e = popen2.popen3(cmd)
err = e.readlines()
out = r.readlines()
r.close()
e.close()
w.close()
if len(err):
return False,err
return out,err
def clean(s):
s = s.replace("\n","")
if not len(s):
return None
return s
def main():
conn,c = createdb()
path = sys.argv[1]
files = glob.glob(path + "/*")
for filename in files:
try:
r,err = ucon64_info(filename)
if not r:
print err
continue
r = map(clean,r)
process(conn,c,filename,r)
except (KeyboardInterrupt, SystemExit):
print "Saving DB..."
c.close()
conn.commit()
conn.close()
sys.exit(-1)
c.close()
conn.commit()
conn.close()
if __name__ == "__main__":
main()

53
scripts/rom_analyse.sql Normal file
View File

@@ -0,0 +1,53 @@
-- Global
select count(*) from roms;
select distinct rom_name from roms;
select count(*) from roms where rom_sram = 0;
-- Hirom x Sram
select count(*) from roms where rom_hirom= 1;
select count(*),rom_internalsize from roms where rom_hirom= 1 group by rom_internalsize;
select count(*) as count ,rom_internalsize,rom_sram from roms where rom_hirom= 1 group by rom_internalsize,rom_sram having rom_sram > 0;
-- Lorom x Sram
select count(*) from roms where rom_hirom= 0;
select count(*),rom_internalsize from roms where rom_hirom= 0 group by rom_internalsize;
select count(*) as count ,rom_internalsize,rom_sram from roms where rom_hirom= 0 group by rom_internalsize,rom_sram having rom_sram > 0;
-- Sram
select count(*) as count ,rom_sram from roms group by rom_sram having count > 1;
-- Rom
select count(*) as count ,rom_size from roms group by rom_size having count > 1;
select count(*) as count ,rom_size from roms group by rom_size having count > 10;
select count(*) as count ,rom_internalsize from roms group by rom_internalsize having count > 1;
select count(distinct rom_name) as count ,rom_internalsize from roms group by rom_internalsize having count > 1;
select count(*) as count ,rom_size,rom_internalsize from roms group by rom_size having count > 10;
-- Type
-- 00 ROM
-- 01 ROM/RAM
-- 02 ROM/SRAM
-- 03 ROM/DSP1
-- 04 ROM/DSP1/RAM
-- 05 ROM/DSP1/SRAM
-- 06 FX
select count(*) as count ,rom_type from roms group by rom_type having count > 1;
select count(*) as count ,rom_type from roms group by rom_type having count > 5;
select count(*) as count from roms where rom_type > 2;
select count(*) as count from roms where rom_type <= 2;
--
-- cleanup
--
--delete from roms where rom_vendor = 'Demo or Beta ROM?';
--delete from roms where rom_internalsize > 128;
--delete from roms where rom_name like "%.....%";
--delete from roms where rom_name like "%\%";
--delete from roms where rom_vendor = 'Unknown';

BIN
scripts/roms.sqlite3 Normal file

Binary file not shown.

Binary file not shown.

45
snes/ascii/Makefile Normal file
View File

@@ -0,0 +1,45 @@
CC = wla-65816
CFLAGS = -o
LD = wlalink
LDFLAGS = -v
SFILES = main.asm
IFILES =
OFILES = main.o
GFXDATA = optixx_logo.bmp
all: $(OFILES) Makefile
$(LD) $(LDFLAGS) linkfile ascii.smc
ucon64 -chk -swc ascii.smc
zsnes:
/Applications/ZSNES.app/Contents/MacOS/ZSNES ascii.swc
bsnes:
open /Applications/BSNES.app ascii.swc
main.o: colorlist sine gfx main.asm
$(CC) $(CFLAGS) main.asm main.o
gfx: bmp2bitplane.py optixx_logo.bmp
python bmp2bitplane.py optixx_logo.bmp
sine: sinegen.py
python sinegen.py vsine_1.s 256 96 1
python sinegen.py vsine_2.s 256 96 1 flip
python sinegen.py colbarsine_1.s 256 64 3
colorlist: bmp2col.py
python bmp2col.py backcolors.bmp list
python bmp2col.py colbar_1.bmp
python bmp2col.py colbar_2.bmp
python bmp2col.py colbar_3.bmp
$(OFILES): $(HFILES)
clean:
rm -f $(OFILES) core *~ result.rom optixx_logo.s

BIN
snes/ascii/backcolors.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

472
snes/ascii/backcolors.s Normal file
View File

@@ -0,0 +1,472 @@
backcolors_color_list:
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db $01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00,$01,$00
.db 0
backcolors_color_values:
.db $01
.dw $1400 ;line=0x01
.db $01
.dw $1400 ;line=0x02
.db $01
.dw $1400 ;line=0x03
.db $01
.dw $1400 ;line=0x04
.db $01
.dw $1400 ;line=0x05
.db $01
.dw $1400 ;line=0x06
.db $01
.dw $1400 ;line=0x07
.db $01
.dw $1400 ;line=0x08
.db $01
.dw $1400 ;line=0x09
.db $01
.dw $1400 ;line=0x0a
.db $01
.dw $1400 ;line=0x0b
.db $01
.dw $1400 ;line=0x0c
.db $01
.dw $1400 ;line=0x0d
.db $01
.dw $1400 ;line=0x0e
.db $01
.dw $1400 ;line=0x0f
.db $01
.dw $1400 ;line=0x10
.db $01
.dw $1400 ;line=0x11
.db $01
.dw $1400 ;line=0x12
.db $01
.dw $1400 ;line=0x13
.db $01
.dw $1400 ;line=0x14
.db $01
.dw $1400 ;line=0x15
.db $01
.dw $1400 ;line=0x16
.db $01
.dw $1400 ;line=0x17
.db $01
.dw $1400 ;line=0x18
.db $01
.dw $1400 ;line=0x19
.db $01
.dw $1400 ;line=0x1a
.db $01
.dw $1400 ;line=0x1b
.db $01
.dw $1400 ;line=0x1c
.db $01
.dw $1400 ;line=0x1d
.db $01
.dw $1400 ;line=0x1e
.db $01
.dw $1400 ;line=0x1f
.db $01
.dw $1400 ;line=0x20
.db $01
.dw $1400 ;line=0x21
.db $01
.dw $1400 ;line=0x22
.db $01
.dw $1400 ;line=0x23
.db $01
.dw $1400 ;line=0x24
.db $01
.dw $1400 ;line=0x25
.db $01
.dw $1400 ;line=0x26
.db $01
.dw $1400 ;line=0x27
.db $01
.dw $1400 ;line=0x28
.db $01
.dw $1400 ;line=0x29
.db $01
.dw $1400 ;line=0x2a
.db $01
.dw $1400 ;line=0x2b
.db $01
.dw $1400 ;line=0x2c
.db $01
.dw $1400 ;line=0x2d
.db $01
.dw $1400 ;line=0x2e
.db $01
.dw $1400 ;line=0x2f
.db $01
.dw $1400 ;line=0x30
.db $01
.dw $1400 ;line=0x31
.db $01
.dw $1400 ;line=0x32
.db $01
.dw $1400 ;line=0x33
.db $01
.dw $1400 ;line=0x34
.db $01
.dw $1400 ;line=0x35
.db $01
.dw $1400 ;line=0x36
.db $01
.dw $1400 ;line=0x37
.db $01
.dw $1400 ;line=0x38
.db $01
.dw $1400 ;line=0x39
.db $01
.dw $1400 ;line=0x3a
.db $01
.dw $1400 ;line=0x3b
.db $01
.dw $1400 ;line=0x3c
.db $01
.dw $1400 ;line=0x3d
.db $01
.dw $1400 ;line=0x3e
.db $01
.dw $1400 ;line=0x3f
.db $01
.dw $1400 ;line=0x40
.db $01
.dw $1400 ;line=0x41
.db $01
.dw $1400 ;line=0x42
.db $01
.dw $1400 ;line=0x43
.db $01
.dw $1400 ;line=0x44
.db $01
.dw $1400 ;line=0x45
.db $01
.dw $1400 ;line=0x46
.db $01
.dw $1400 ;line=0x47
.db $01
.dw $1400 ;line=0x48
.db $01
.dw $1400 ;line=0x49
.db $01
.dw $1400 ;line=0x4a
.db $01
.dw $1400 ;line=0x4b
.db $01
.dw $1400 ;line=0x4c
.db $01
.dw $1400 ;line=0x4d
.db $01
.dw $1400 ;line=0x4e
.db $01
.dw $1400 ;line=0x4f
.db $01
.dw $1400 ;line=0x50
.db $01
.dw $1400 ;line=0x51
.db $01
.dw $1400 ;line=0x52
.db $01
.dw $1400 ;line=0x53
.db $01
.dw $1400 ;line=0x54
.db $01
.dw $1400 ;line=0x55
.db $01
.dw $1400 ;line=0x56
.db $01
.dw $1400 ;line=0x57
.db $01
.dw $1400 ;line=0x58
.db $01
.dw $1400 ;line=0x59
.db $01
.dw $1400 ;line=0x5a
.db $01
.dw $1400 ;line=0x5b
.db $01
.dw $1800 ;line=0x5c
.db $01
.dw $1800 ;line=0x5d
.db $01
.dw $1820 ;line=0x5e
.db $01
.dw $1820 ;line=0x5f
.db $01
.dw $1820 ;line=0x60
.db $01
.dw $1820 ;line=0x61
.db $01
.dw $1820 ;line=0x62
.db $01
.dw $1820 ;line=0x63
.db $01
.dw $1820 ;line=0x64
.db $01
.dw $1820 ;line=0x65
.db $01
.dw $1820 ;line=0x66
.db $01
.dw $1c20 ;line=0x67
.db $01
.dw $1c20 ;line=0x68
.db $01
.dw $1c20 ;line=0x69
.db $01
.dw $1c20 ;line=0x6a
.db $01
.dw $1c40 ;line=0x6b
.db $01
.dw $1c40 ;line=0x6c
.db $01
.dw $1c40 ;line=0x6d
.db $01
.dw $1c40 ;line=0x6e
.db $01
.dw $1c40 ;line=0x6f
.db $01
.dw $1c41 ;line=0x70
.db $01
.dw $1c41 ;line=0x71
.db $01
.dw $2041 ;line=0x72
.db $01
.dw $2041 ;line=0x73
.db $01
.dw $2041 ;line=0x74
.db $01
.dw $2041 ;line=0x75
.db $01
.dw $2041 ;line=0x76
.db $01
.dw $2041 ;line=0x77
.db $01
.dw $2061 ;line=0x78
.db $01
.dw $2061 ;line=0x79
.db $01
.dw $2061 ;line=0x7a
.db $01
.dw $2061 ;line=0x7b
.db $01
.dw $2061 ;line=0x7c
.db $01
.dw $2461 ;line=0x7d
.db $01
.dw $2461 ;line=0x7e
.db $01
.dw $2461 ;line=0x7f
.db $01
.dw $2461 ;line=0x80
.db $01
.dw $2461 ;line=0x81
.db $01
.dw $2461 ;line=0x82
.db $01
.dw $2461 ;line=0x83
.db $01
.dw $2461 ;line=0x84
.db $01
.dw $2481 ;line=0x85
.db $01
.dw $2481 ;line=0x86
.db $01
.dw $2481 ;line=0x87
.db $01
.dw $2881 ;line=0x88
.db $01
.dw $2881 ;line=0x89
.db $01
.dw $2881 ;line=0x8a
.db $01
.dw $2881 ;line=0x8b
.db $01
.dw $2882 ;line=0x8c
.db $01
.dw $2882 ;line=0x8d
.db $01
.dw $2882 ;line=0x8e
.db $01
.dw $2882 ;line=0x8f
.db $01
.dw $2882 ;line=0x90
.db $01
.dw $2882 ;line=0x91
.db $01
.dw $28a2 ;line=0x92
.db $01
.dw $2ca2 ;line=0x93
.db $01
.dw $2ca2 ;line=0x94
.db $01
.dw $2ca2 ;line=0x95
.db $01
.dw $2ca2 ;line=0x96
.db $01
.dw $2ca2 ;line=0x97
.db $01
.dw $2ca2 ;line=0x98
.db $01
.dw $2ca2 ;line=0x99
.db $01
.dw $2ca2 ;line=0x9a
.db $01
.dw $2ca2 ;line=0x9b
.db $01
.dw $2ca2 ;line=0x9c
.db $01
.dw $30a2 ;line=0x9d
.db $01
.dw $30a2 ;line=0x9e
.db $01
.dw $30c2 ;line=0x9f
.db $01
.dw $30c2 ;line=0xa0
.db $01
.dw $30c2 ;line=0xa1
.db $01
.dw $30c2 ;line=0xa2
.db $01
.dw $30c2 ;line=0xa3
.db $01
.dw $30c2 ;line=0xa4
.db $01
.dw $34c3 ;line=0xa5
.db $01
.dw $34e3 ;line=0xa6
.db $01
.dw $34e3 ;line=0xa7
.db $01
.dw $38e3 ;line=0xa8
.db $01
.dw $38e3 ;line=0xa9
.db $01
.dw $3903 ;line=0xaa
.db $01
.dw $3903 ;line=0xab
.db $01
.dw $3d03 ;line=0xac
.db $01
.dw $3d03 ;line=0xad
.db $01
.dw $3d24 ;line=0xae
.db $01
.dw $4124 ;line=0xaf
.db $01
.dw $4124 ;line=0xb0
.db $01
.dw $4124 ;line=0xb1
.db $01
.dw $4144 ;line=0xb2
.db $01
.dw $4544 ;line=0xb3
.db $01
.dw $4544 ;line=0xb4
.db $01
.dw $4544 ;line=0xb5
.db $01
.dw $4945 ;line=0xb6
.db $01
.dw $4965 ;line=0xb7
.db $01
.dw $4965 ;line=0xb8
.db $01
.dw $4965 ;line=0xb9
.db $01
.dw $4d65 ;line=0xba
.db $01
.dw $4d85 ;line=0xbb
.db $01
.dw $4d85 ;line=0xbc
.db $01
.dw $5185 ;line=0xbd
.db $01
.dw $51a5 ;line=0xbe
.db $01
.dw $51c5 ;line=0xbf
.db $01
.dw $55c5 ;line=0xc0
.db $01
.dw $55e4 ;line=0xc1
.db $01
.dw $55e4 ;line=0xc2
.db $01
.dw $5a04 ;line=0xc3
.db $01
.dw $5a04 ;line=0xc4
.db $01
.dw $5a24 ;line=0xc5
.db $01
.dw $5e24 ;line=0xc6
.db $01
.dw $5e43 ;line=0xc7
.db $01
.dw $5e63 ;line=0xc8
.db $01
.dw $6263 ;line=0xc9
.db $01
.dw $6283 ;line=0xca
.db $01
.dw $6283 ;line=0xcb
.db $01
.dw $66a2 ;line=0xcc
.db $01
.dw $66a2 ;line=0xcd
.db $01
.dw $66c2 ;line=0xce
.db $01
.dw $6ae2 ;line=0xcf
.db $01
.dw $6ae2 ;line=0xd0
.db $01
.dw $6b02 ;line=0xd1
.db $01
.dw $6f01 ;line=0xd2
.db $01
.dw $6f21 ;line=0xd3
.db $01
.dw $6f41 ;line=0xd4
.db $01
.dw $7341 ;line=0xd5
.db $01
.dw $7361 ;line=0xd6
.db $01
.dw $7760 ;line=0xd7
.db $01
.dw $7780 ;line=0xd8
.db $01
.dw $77a0 ;line=0xd9
.db $01
.dw $7ba0 ;line=0xda
.db $01
.dw $7bc0 ;line=0xdb
.db $01
.dw $7bc0 ;line=0xdc
.db 0

167
snes/ascii/bmp2bitplane.py Normal file
View File

@@ -0,0 +1,167 @@
import os
import re
import string
import sys
import binascii
import math
def openfile(filename):
return open(filename)
def mk_sint(s):
a = ord(s[1])
b = ord(s[0])
return (a<<8) + b
def mk_int(s):
a = ord(s[3])
b = ord(s[2])
c = ord(s[1])
d = ord(s[0])
return (a<<32) + (b<<16) + (c<<8) + d
def main():
file = sys.argv[1]
asmfile = string.replace(file,".bmp",".s")
basename = string.replace(file,".bmp","")
fp =openfile(file)
header_offset = 14 + 40
data = fp.read()
fp.close()
type = mk_sint(data[0:2])
size = mk_int(data[2:6])
width = mk_int(data[18:22])
height = mk_int(data[22:26])
bits_per_pixel = mk_int(data[28:32])
num_of_colors = mk_int(data[46:50])
bytes_per_line = width / 8
bytes_per_line_padded = bytes_per_line + (4-(bytes_per_line % 4))
header = data[0:header_offset]
colors = data[header_offset: header_offset + (num_of_colors * 4)]
data = data[header_offset + (num_of_colors * 4):]
raw = []
for i in data:
raw.append(ord(i))
raw_len = len(raw)
print "file:\t\t%s" % file
print "basename:\t%s" % asmfile
print "header info"
print "type: \t\t%04X " % type
print "size: \t\t%i bytes" % size
print "width: \t\t%i pixel" % width
print "height: \t%i pixel" % height
print "bit per pixel:\t%i" % bits_per_pixel
print "num of colors:\t%i" % num_of_colors
print "imagedata: \t%s bytes" % raw_len
print "per line: \t%i bytes" % bytes_per_line
print "per line pad: \t%i bytes" % bytes_per_line_padded
bitplane={}
for bit in range(0,bits_per_pixel):
bitplane[bit] = []
bytes = [0,0,0,0]
bit_cnt =0
cnt=0
last_progress = 0
for byte in raw:
cnt+=1
progress = cnt / (raw_len/100)
if (progress%10)==0:
if (progress>last_progress):
print "converting bmp to bitplane buffers %i%% done" % (progress)
last_progress = progress
if bits_per_pixel == 4 :
hi_nibble = (byte >> 4)
lo_nibble = byte & 16
hi_nibble_bin = ''
for nibble in (hi_nibble,lo_nibble):
for plane in range(bits_per_pixel-1,-1,-1):
if (nibble & (1 << plane)):
bytes[plane] |= 1 << bit_cnt
bit_cnt += 1
if (bit_cnt==8):
for i in range(0,bits_per_pixel):
bitplane[i].append(bytes[i])
bytes=[0,0,0,0]
bit_cnt =0
if bits_per_pixel == 1 :
bitplane[0] = raw
break
out='';
for plane in range(0,bits_per_pixel):
print "bitplane %i has %i bytes " % (plane,len(bitplane[plane]))
x_tiles = width / 8
y_tiles = height / 8
cnt=0
last_progress=0
fp = open(asmfile,'w')
tile_cnt = 0
out ="\n\n\n%s:\n\n" % (basename)
fp.write(out)
#for yt in range(0,y_tiles):
for yt in range(y_tiles-1,-1,-1): # needed for h flip
out ="; ### row %02x ### \n" % yt
fp.write(out)
progress = cnt / (raw_len/100)
if(progress%5)==0:
print "building asm include %i%% done" % (progress)
#last_progress = progress
for xt in range(0,x_tiles):
for plane in range(0,bits_per_pixel):
out = ' .db '
for y in range(((yt+1)*8)-1,(yt*8)-1,-1): # needed for h flip
#for y in range(yt*8,(yt+1)*8):
out += "$%02x," % bitplane[plane][(y*x_tiles)+xt]
cnt+=1
out = out[:-1]
out += ' ; tile=%02x plane=%02x row=%02x col=%02x \n' % (tile_cnt,plane,yt,xt)
fp.write(out)
tile_cnt+=1
fp.close()
if __name__ == '__main__':
if len(sys.argv) is 2:
main()
else:
print "usage: %s in out" % sys.argv[0]

180
snes/ascii/bmp2col.py Normal file
View File

@@ -0,0 +1,180 @@
import os
import re
import string
import sys
import binascii
import math
class color:
def __init__(self,r,g,b):
self.r = r >> 3
self.g = g >> 3
self.b = b >> 3
self.snes = "$%04x" % (( self.b << 10 ) | (self.g << 5) | self.r )
def get(self):
return self.snes
def __str__(self):
return "r=0x%02x g=0x%02x b=0x%02x snes=%s" % ( self.r,self.g,self.b,self.snes)
def openfile(filename):
return open(filename)
def mk_sint(s):
a = ord(s[1])
b = ord(s[0])
return (a<<8) + b
def mk_int(s):
a = ord(s[3])
b = ord(s[2])
c = ord(s[1])
d = ord(s[0])
return (a<<32) + (b<<16) + (c<<8) + d
def main():
file = sys.argv[1]
asmfile = string.replace(file,".bmp",".s")
basename = string.replace(file,".bmp","")
if len(sys.argv) >= 3 and sys.argv[2] =='list' :
do_list = 1
else:
do_list = 0
if len(sys.argv) >= 4 and sys.argv[3] =='compress':
do_compress = 1
else:
do_compress = 0
fp =openfile(file)
header_offset = 14 + 40
data = fp.read()
fp.close()
type = mk_sint(data[0:2])
size = mk_int(data[2:6])
width = mk_int(data[18:22])
height = mk_int(data[22:26])
bits_per_pixel = mk_int(data[28:32])
num_of_colors = mk_int(data[46:50])
bytes_per_line = width / 8
bytes_per_line_padded = bytes_per_line + (4-(bytes_per_line % 4))
header = data[0:header_offset]
colors = data[header_offset: header_offset + (num_of_colors * 4)]
data = data[header_offset + (num_of_colors * 4):]
raw = []
for i in data:
raw.append(ord(i))
raw_len = len(raw)
palette = []
for i in range(0,len(colors),4):
palette.append(color(ord(colors[i+2]),ord(colors[i+1]),ord(colors[i])))
print "file:\t\t%s" % file
print "basename:\t%s" % asmfile
print "header info"
print "type: \t\t%04X " % type
print "size: \t\t%i bytes" % size
print "width: \t\t%i pixel" % width
print "height: \t%i pixel" % height
print "bit per pixel:\t%i" % bits_per_pixel
print "num of colors:\t%i" % num_of_colors
print "imagedata: \t%s bytes" % raw_len
print "per line: \t%i bytes" % bytes_per_line
print "per line pad: \t%i bytes" % bytes_per_line_padded
out='';
fp = open(asmfile,'w')
tile_cnt = 0
color_list = str()
value_list = str()
color_list="\n\n\n%s_color_list:\n\n" % (basename)
value_list ="\n\n\n%s_color_values:\n\n" % (basename)
out = " .db "
cnt=0
last = "";
repeat = 1;
for i in range(raw_len-1,-1,-width):
idx = raw[i]
col = palette[idx].get()
if col == last and do_compress:
repeat += 1
continue
else:
#print palette[idx]
last = col
if do_list:
value_list += " .db $%02x\n" % repeat
value_list += " .dw %s ;line=0x%02x\n" % (col, (height - (i/width)) )
out += "$%02x,$00," % repeat
repeat = 1
cnt +=1
if cnt == width/20:
cnt=0
out = out[:-1]
out +="\n"
color_list += out
out = " .db "
value_list += " .db 0\n"
color_list += " .db 0\n"
if do_list:
fp.write(color_list)
fp.write(value_list)
fp.close()
if __name__ == '__main__':
if len(sys.argv)>= 2:
main()
else:
print "usage: %s in [list] [compress]" % sys.argv[0]

BIN
snes/ascii/colbar_1.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

38
snes/ascii/colbar_1.s Normal file
View File

@@ -0,0 +1,38 @@
colbar_1_color_values:
.dw $0001 ;line=0x01
.dw $0003 ;line=0x02
.dw $0004 ;line=0x03
.dw $0006 ;line=0x04
.dw $0008 ;line=0x05
.dw $000a ;line=0x06
.dw $000c ;line=0x07
.dw $000e ;line=0x08
.dw $0011 ;line=0x09
.dw $0014 ;line=0x0a
.dw $0019 ;line=0x0b
.dw $001b ;line=0x0c
.dw $001a ;line=0x0d
.dw $0019 ;line=0x0e
.dw $0018 ;line=0x0f
.dw $0017 ;line=0x10
.dw $0016 ;line=0x11
.dw $0015 ;line=0x12
.dw $0014 ;line=0x13
.dw $0013 ;line=0x14
.dw $0010 ;line=0x15
.dw $000d ;line=0x16
.dw $000a ;line=0x17
.dw $0008 ;line=0x18
.dw $0006 ;line=0x19
.dw $0004 ;line=0x1a
.dw $0002 ;line=0x1b
.dw $0001 ;line=0x1c
.dw $0000 ;line=0x1d
.dw $0000 ;line=0x1e
.dw $0000 ;line=0x1f
.dw $0000 ;line=0x20
.db 0

BIN
snes/ascii/colbar_2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

38
snes/ascii/colbar_2.s Normal file
View File

@@ -0,0 +1,38 @@
colbar_2_color_values:
.dw $0020 ;line=0x01
.dw $0060 ;line=0x02
.dw $0080 ;line=0x03
.dw $00c0 ;line=0x04
.dw $0100 ;line=0x05
.dw $0140 ;line=0x06
.dw $0180 ;line=0x07
.dw $01c0 ;line=0x08
.dw $0220 ;line=0x09
.dw $0280 ;line=0x0a
.dw $0320 ;line=0x0b
.dw $0360 ;line=0x0c
.dw $0340 ;line=0x0d
.dw $0320 ;line=0x0e
.dw $0300 ;line=0x0f
.dw $02e0 ;line=0x10
.dw $02c0 ;line=0x11
.dw $02a0 ;line=0x12
.dw $0280 ;line=0x13
.dw $0260 ;line=0x14
.dw $0200 ;line=0x15
.dw $01a0 ;line=0x16
.dw $0140 ;line=0x17
.dw $0100 ;line=0x18
.dw $00c0 ;line=0x19
.dw $0080 ;line=0x1a
.dw $0040 ;line=0x1b
.dw $0020 ;line=0x1c
.dw $0000 ;line=0x1d
.dw $0000 ;line=0x1e
.dw $0000 ;line=0x1f
.dw $0000 ;line=0x20
.db 0

BIN
snes/ascii/colbar_3.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

38
snes/ascii/colbar_3.s Normal file
View File

@@ -0,0 +1,38 @@
colbar_3_color_values:
.dw $0400 ;line=0x01
.dw $0c00 ;line=0x02
.dw $1000 ;line=0x03
.dw $1800 ;line=0x04
.dw $2000 ;line=0x05
.dw $2800 ;line=0x06
.dw $3000 ;line=0x07
.dw $3800 ;line=0x08
.dw $4400 ;line=0x09
.dw $5000 ;line=0x0a
.dw $6400 ;line=0x0b
.dw $6c00 ;line=0x0c
.dw $6800 ;line=0x0d
.dw $6400 ;line=0x0e
.dw $6000 ;line=0x0f
.dw $5c00 ;line=0x10
.dw $5800 ;line=0x11
.dw $5400 ;line=0x12
.dw $5000 ;line=0x13
.dw $4c00 ;line=0x14
.dw $4000 ;line=0x15
.dw $3400 ;line=0x16
.dw $2800 ;line=0x17
.dw $2000 ;line=0x18
.dw $1800 ;line=0x19
.dw $1000 ;line=0x1a
.dw $0800 ;line=0x1b
.dw $0400 ;line=0x1c
.dw $0000 ;line=0x1d
.dw $0000 ;line=0x1e
.dw $0000 ;line=0x1f
.dw $0000 ;line=0x20
.db 0

13
snes/ascii/colbarsine_1.s Normal file
View File

@@ -0,0 +1,13 @@
colbarsine_1:
.db $60,$60,$63,$66,$69,$69,$6c,$6f,$72,$75,$75,$78,$7b,$7e,$7e,$81,$84,$84,$87,$8a,$8d,$8d,$90,$93,$93,$96,$99,$99,$9c,$9c,$9f,$a2
.db $a2,$a5,$a5,$a8,$a8,$ab,$ab,$ae,$ae,$b1,$b1,$b1,$b4,$b4,$b4,$b7,$b7,$b7,$ba,$ba,$ba,$ba,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$bd
.db $c0,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$bd,$ba,$ba,$ba,$ba,$b7,$b7,$b7,$b4,$b4,$b4,$b1,$b1,$b1,$ae,$ae,$ab,$ab,$a8,$a8,$a5,$a5
.db $a2,$a2,$9f,$9c,$9c,$99,$99,$96,$93,$93,$90,$8d,$8d,$8a,$87,$84,$84,$81,$7e,$7e,$7b,$78,$75,$75,$72,$6f,$6c,$69,$69,$66,$63,$60
.db $60,$60,$5d,$5a,$57,$57,$54,$51,$4e,$4b,$4b,$48,$45,$42,$42,$3f,$3c,$3c,$39,$36,$33,$33,$30,$2d,$2d,$2a,$27,$27,$24,$24,$21,$1e
.db $1e,$1b,$1b,$18,$18,$15,$15,$12,$12,$0f,$0f,$0f,$0c,$0c,$0c,$09,$09,$09,$06,$06,$06,$06,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03
.db $00,$03,$03,$03,$03,$03,$03,$03,$03,$03,$03,$06,$06,$06,$06,$09,$09,$09,$0c,$0c,$0c,$0f,$0f,$0f,$12,$12,$15,$15,$18,$18,$1b,$1b
.db $1e,$1e,$21,$24,$24,$27,$27,$2a,$2d,$2d,$30,$33,$33,$36,$39,$3c,$3c,$3f,$42,$42,$45,$48,$4b,$4b,$4e,$51,$54,$57,$57,$5a,$5d,$60

61
snes/ascii/header.inc Normal file
View File

@@ -0,0 +1,61 @@
;------------------------------ Header File ---------------------------------
; This is basically a combo of MarctheMER's and Neviksti's header files
; Perhaps reading their's will also help your understanding of the header,
; but I believe this will be the simplest method of defining your header,
; as Marc's doesn't provide a full explanation, and Neviksti's can be
; a bit more difficult for beginners (using the WLA directives is easier).
;----------------------------------------------------------------------------
;==LoRom== ; We'll get to HiRom some other time.
.MEMORYMAP ; Begin describing the system architecture.
SLOTSIZE $8000 ; The slot is $8000 bytes in size. More details on slots later.
DEFAULTSLOT 0 ; There's only 1 slot in SNES, there are more in other consoles.
SLOT 0 $8000 ; Define's Slot 0's starting address.
.ENDME ; End MemoryMap definition
.ROMBANKSIZE $8000 ; Every ROM bank is 32 KBytes in size
.ROMBANKS 8 ; 2 Mbits - Tell WLA we want to use 8 ROM Banks
.SNESHEADER
ID "SNES" ; 1-4 letter string, just leave it as "SNES"
NAME "SNES Tile Demo " ; Program Title - can't be over 21 bytes,
; "123456789012345678901" ; use spaces for unused bytes of the name.
SLOWROM
LOROM
CARTRIDGETYPE $00 ; $00 = ROM only, see WLA documentation for others
ROMSIZE $08 ; $0 = 0.5 Mbits, see WLA doc for more..
SRAMSIZE $00 ; No SRAM see WLA doc for more..
COUNTRY $02 ; $01 = U.S. $00 = Japan, that's all I know
LICENSEECODE $00 ; Just use $00
VERSION $00 ; $00 = 1.00, $01 = 1.01, etc.
.ENDSNES
.SNESNATIVEVECTOR ; Define Native Mode interrupt vector table
COP EmptyHandler
BRK EmptyHandler
ABORT EmptyHandler
NMI EmptyHandler
IRQ EmptyHandler
.ENDNATIVEVECTOR
.SNESEMUVECTOR ; Define Emulation Mode interrupt vector table
COP EmptyHandler
ABORT EmptyHandler
NMI EmptyHandler
RESET init
IRQBRK EmptyHandler
.ENDEMUVECTOR
.BANK 0 SLOT 0 ; Defines the ROM bank and the slot it is inserted in memory.
.ORG 0 ; .ORG 0 is really $8000, because the slot starts at $8000
.SECTION "EmptyVectors" SEMIFREE
EmptyHandler:
rti
.ENDS
.EMPTYFILL $00

2
snes/ascii/linkfile Normal file
View File

@@ -0,0 +1,2 @@
[objects]
main.o

817
snes/ascii/main.asm Normal file
View File

@@ -0,0 +1,817 @@
;============================================================================
; Includes
;============================================================================
;== Include MemoryMap, Vector Table, and HeaderInfo ==
.INCLUDE "header.inc"
.SECTION "MAIN"
.define dp $0000
.define sineswap $0002
.define sine_offset $0003
.define scrollval $0005
.define colbar_offset_1 $0006
.define colbar_offset_2 $0007
.define colbar_offset_3 $0008
.define colbar_offset_table $0010
.define colbar_color_table $0020
.define colbar_count $0030
.define colbar_color $0032
.define colbar_color_ptr $0034
.define hdma_table0 $0050
.define hdma_table1 $0200
.define plane_0 $0800
.define plane_1 $0c00
.define char_data $2000
.define logo_data $2200
init:
sei ;stop interrupts
phk ;get the current bank and store on stack
plb ;get value off stack and make it the current
;programming bank
clc ;clear carry bit
xce ;native 16 bit mode (no 6502 emulation!)
jsr setup
rep #$30 ; x,y,a fixed -> 16 bit mode
sep #$20 ; accumulator -> 8 bit mode
lda #(dp+0) ;load direct page
tcd ;store & and assign
lda #(plane_0>>8) ; screen map data @ vram location $1000
sta $2107 ; plane 0 map location register
lda #(plane_1>>8) ; screen map data @ vram location $1000
sta $2108 ; plane 1 map location register
lda #$22 ; plane 0 and plane 1 tile graphics @ $2000
sta $210b ; plane 0 tile graphics register
lda #$00 ; mode 0 value / tile mode
sta $2105 ; graphics mode register
lda #%00000011 ;
sta $212c ; plane enable register
lda #$01
sta $4200 ; enable joypad read (bit one)
lda #$00
sta $2121
ldx #$0000
col_loop:
lda #$ff
sta $2122
lda #$7f
sta $2122
inx
cpx #$00ff
bne col_loop
ldx.w #char_data ; assign vram location
stx $2116 ; writing to $2118/9 will store data here!
ldx #$0000
copychar:
lda.w charset,x ; get character set data<74>(font data)
sta $2118 ; store bitplane 1
stz $2119 ; clear bitplane 2 and increase vram address
inx
cpx #$0200 ; transfer $0200 bytes
bne copychar
ldx #$0000
copy_logo: ; copy tile data to vram
lda.w optixx_logo,x ; using continuos tile vram pointer
sta $2118 ; charset @ $2000
stz $2119 ; logo @ $2200
inx
cpx #$0500
bne copy_logo
init_plane_0:
ldx.w #plane_0 ; assign vram location $1000 to $2116/7
stx $2116
ldx #$0000
init_plane_0_loop:
lda.w text_0,x ; get ascii text data
and #$3f ; we only want the first 64 characters
; convert ascii to c64 screen code
sta $2118
stz $2119 ; clear unwanted bits, no h/v flipping
inx
cpx #$0400 ; transfer entire screen
; $20*$20=$0400 (1024 bytes)
bne init_plane_0_loop
init_plane_1: ; write optixx logo tiles
ldx.w #plane_1
stx $2116
ldx #$0000
lda #$0040
init_plane_1_clear_1: ; 0x0140 tiles clear
sta $2118
stz $2119
inx
cpx #$0140
bne init_plane_1_clear_1
ldx #$0000
init_plane_1_loop_1:
ina
sta $2118
stz $2119
inx
cpx #$00a0 ; 0x00a0 logo tiles
bne init_plane_1_loop_1
ldx #$0000
lda #$0040
init_plane_1_clear_2:
sta $2118
stz $2119
inx
cpx #$01a0 ; 0x01a0 tiles clear
bne init_plane_1_clear_2
ldx #$0000
init_screen:
lda #$0f ; screen enabled, full brightness
sta $2100 ;
cli ; clear interrupt bit
init_scroll:
lda #$00
sta.w scrollval
init_sineoffset:
lda #$00
sta.w sine_offset
lda #$00
sta sineswap
ldx.w #colbar_1_color_values
stx colbar_color_table
ldx.w #colbar_2_color_values
stx colbar_color_table + $02
ldx.w #colbar_3_color_values
stx colbar_color_table + $04
ldx.w #colbar_1_color_values
stx colbar_color_table + $06
ldx.w #colbar_2_color_values
stx colbar_color_table + $08
ldx.w #colbar_3_color_values
stx colbar_color_table + $0a
lda #$00
sta colbar_offset_table
lda #$15
sta colbar_offset_table + $01
lda #$25
sta colbar_offset_table + $02
lda #$35
sta colbar_offset_table + $03
lda #$45
sta colbar_offset_table + $04
lda #$55
sta colbar_offset_table + $05
call_hmda_setup:
jsr init_hdma_table0
jsr init_hdma_table1
jmp intro
main:
jsr wait_vbl
jsr sine_plane
jsr sine_colbar
jsr scroll_plane
jsr joypad
jmp main
; test vertical interrupt
wait_vbl:
lda $4210 ; check for vertical blank
and #$80
beq wait_vbl
rts
; joypad poll
joypad:
lda $4212 ; is joypad ready to be read?
and #$0001
bne joypad ; no? go back until it is!
lda $4219 ; read joypad high byte
and #$10 ; leave only "start" bit
bne reset ; "start" pressed? go to reset
rts ; if not then jump back to loop
reset:
sep #$30
lda #$00
pha ; push #$00 to stack
plb ; pull #$00 from stack and make it the
; the programming bank
jmp init ; jump long to $008000
; gfx routine
; intro stuff
intro:
rep #$30
sep #$20
ldx #$f2
mosaic_l:
jsr wait_vbl
jsr wait_vbl
txa
sta $2106
sbc #$10
tax
cmp #$02
bne mosaic_l
stz $2106
fade:
ldy #$0f
fade_dark:
jsr wait_vbl
tya
sta $2100
dey
cpy #$0000
bne fade_dark
ldy #$0000
fade_light:
jsr wait_vbl
tya
sta $2100
iny
cpy #$000f
bne fade_light
jmp main
; scroll loop
scroll_plane:
lda.w scrollval
sta $210e
stz $210e
adc #$01
sta.w scrollval
cmp #$ff
beq restore_scroll
rts
restore_scroll:
lda #$00
sta.w scrollval
rts
sine_plane:
rep #$10
sep #$20
lda sine_offset
ina
sta sine_offset
cmp #$ff
bne sine_plane_c
lda #$00
sta sine_offset
lda sineswap ; check wich sine table ot take
ina
sta sineswap
cmp #$04 ; after 4 loop reset counter
bne sine_plane_c
lda #$00
sta sineswap
sine_plane_c:
tay
ldx #$0000
sine_plane_l:
iny
cpy #$ff
bne sine_plane_l_c
lda #$00
tay
sine_plane_l_c:
inx
lda.w sineswap
cmp #$02 ; lower 2 use vsine 1
bmi sine_load_vsine1
sine_load_vsine2: ; else use vsine 2
lda.w vsine_2,y
bra sine_load_done
sine_load_vsine1:
lda.w vsine_1,y
sine_load_done:
adc #$c8 ; shift logo left
sta hdma_table0+3,x
inx
inx
cpx #$00c0 ; 64 hdma lines a 3 byte
bne sine_plane_l
rep #$30
sep #$20
rts
sine_colbar:
rep #$10
sep #$20
ldx #$00
sine_colbar_clear:
stz hdma_table1+1,x
stz hdma_table1+2,x
inx
inx
inx
cpx #$012c
bne sine_colbar_clear
lda #$00
sta colbar_count
ldy #$0000
sty colbar_color
sine_colbar_init:
ldy colbar_color
ldx colbar_color_table,y
stx colbar_color_ptr
lda.w colbar_count
tay
lda colbar_offset_table,y
ina
sta colbar_offset_table,y
cmp #$ff ; if end of sine table
bne sine_colbar_continue
lda #$00 ; reset table pointer
sta colbar_offset_table,y
sine_colbar_continue:
tay
lda.w colbarsine_1,y
tax
ldy #$0000
sine_colbar_loop:
lda (colbar_color_ptr),y
ora hdma_table1+1,x
and #$ff
sta hdma_table1+1,x
iny
lda (colbar_color_ptr),y
ora hdma_table1+2,x
and #$ff
sta hdma_table1+2,x
inx
inx
inx
iny
;iny
cpy #$0040 ; 32 colot lines a 2 byte
bne sine_colbar_loop
ldy colbar_color
iny
iny
sty colbar_color
lda.w colbar_count
ina
sta.w colbar_count
cmp #$06
bne sine_colbar_init
sine_colbar_end:
rep #$30
sep #$20
rts
; init hdma list
init_hdma_table0:
rep #$10
sep #$20
ldy #$0000
ldx #$0000
;lda #$00
;sta sine_offset
lda #$4c
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
sta hdma_table0,x
inx
init_hdma_table0_loop:
lda #$01
sta hdma_table0,x
inx
;lda vsine_1,y
lda #$00
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
iny
;cpx #$0183 ; (128 + 1) * 3 = 387 = 0x0183
cpx #$00c3 ; (64 + 1) * 3 = 195 = 0x00c0
bne init_hdma_table0_loop
lda #$4c
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
sta hdma_table0,x
inx
sta hdma_table0,x
inx
sta hdma_table0,x
lda #$02
sta $4300
lda #$0f
sta $4301
ldx.w #hdma_table0
;ldx.w #test_hmda_table
stx $4302
lda #$00
sta $4304
;lda #%00000001
;sta $420c
rep #$30
sep #$20
rts
init_hdma_table1:
;rep #$10
;sep #$30
ldx #$0000
init_hdma_tabel1_copy:
ldy.w backcolors_color_values,x
tya
sta hdma_table1,x
inx
cpx #$0295
bne init_hdma_tabel1_copy
lda #$00
sta $4310
lda #$21
sta $4311
ldx.w #backcolors_color_list
stx $4312
lda #$00
sta $4314
lda #$02
sta $4320
lda #$22
sta $4321
;ldx.w #backcolors_color_values
ldx.w #hdma_table1
stx $4322
lda #$00
sta $4324
lda #%00000111
sta $420c
rep #$30
sep #$20
rts
setup:
sep #$30 ; x,y,a are 8 bit numbers
lda #$8f ; screen off, full brightness
sta $2100 ; brightness + screen enable register
lda #$00 ;
sta $2101 ; sprite register (size + address in vram)
lda #$00
sta $2102 ; sprite registers (address of sprite memory [oam])
sta $2103 ; "" ""
lda #$00 ; mode 0
sta $2105 ; graphic mode register
lda #$00 ; no planes, no mosaic
sta $2106 ; mosaic register
lda #$00 ;
sta $2107 ; plane 0 map vram location
lda #$00
sta $2108 ; plane 1 map vram location
lda #$00
sta $2109 ; plane 2 map vram location
lda #$00
sta $210a ; plane 3 map vram location
lda #$00
sta $210b ; plane 0+1 tile data location
lda #$00
sta $210c ; plane 2+3 tile data location
lda #$00
sta $210d ; plane 0 scroll x (first 8 bits)
sta $210d ; plane 0 scroll x (last 3 bits) #$0 - #$07ff
sta $210e ; plane 0 scroll y (first 8 bits)
sta $210e ; plane 0 scroll y (last 3 bits) #$0 - #$07ff
sta $210f ; plane 1 scroll x (first 8 bits)
sta $210f ; plane 1 scroll x (last 3 bits) #$0 - #$07ff
sta $2110 ; plane 1 scroll y (first 8 bits)
sta $2110 ; plane 1 scroll y (last 3 bits) #$0 - #$07ff
sta $2111 ; plane 2 scroll x (first 8 bits)
sta $2111 ; plane 2 scroll x (last 3 bits) #$0 - #$07ff
sta $2112 ; plane 2 scroll y (first 8 bits)
sta $2112 ; plane 2 scroll y (last 3 bits) #$0 - #$07ff
sta $2113 ; plane 3 scroll x (first 8 bits)
sta $2113 ; plane 3 scroll x (last 3 bits) #$0 - #$07ff
sta $2114 ; plane 3 scroll y (first 8 bits)
sta $2114 ; plane 3 scroll y (last 3 bits) #$0 - #$07ff
lda #$80 ; increase vram address after writing to $2119
sta $2115 ; vram address increment register
lda #$00
sta $2116 ; vram address low
sta $2117 ; vram address high
sta $211a ; initial mode 7 setting register
sta $211b ; mode 7 matrix parameter a register (low)
lda #$01
sta $211b ; mode 7 matrix parameter a register (high)
lda #$00
sta $211c ; mode 7 matrix parameter b register (low)
sta $211c ; mode 7 matrix parameter b register (high)
sta $211d ; mode 7 matrix parameter c register (low)
sta $211d ; mode 7 matrix parameter c register (high)
sta $211e ; mode 7 matrix parameter d register (low)
lda #$01
sta $211e ; mode 7 matrix parameter d register (high)
lda #$00
sta $211f ; mode 7 center position x register (low)
sta $211f ; mode 7 center position x register (high)
sta $2120 ; mode 7 center position y register (low)
sta $2120 ; mode 7 center position y register (high)
sta $2121 ; color number register ($0-ff)
sta $2123 ; bg1 & bg2 window mask setting register
sta $2124 ; bg3 & bg4 window mask setting register
sta $2125 ; obj & color window mask setting register
sta $2126 ; window 1 left position register
sta $2127 ; window 2 left position register
sta $2128 ; window 3 left position register
sta $2129 ; window 4 left position register
sta $212a ; bg1, bg2, bg3, bg4 window logic register
sta $212b ; obj, color window logic register (or,and,xor,xnor)
lda #$01
sta $212c ; main screen designation (planes, sprites enable)
lda #$00
sta $212d ; sub screen designation
lda #$00
sta $212e ; window mask for main screen
sta $212f ; window mask for sub screen
lda #$30
sta $2130 ; color addition & screen addition init setting
lda #$00
sta $2131 ; add/sub sub designation for screen, sprite, color
lda #$e0
sta $2132 ; color data for addition/subtraction
lda #$00
sta $2133 ; screen setting (interlace x,y/enable sfx<66>data)
lda #$00
sta $4200 ; enable v-blank, interrupt, joypad register
lda #$ff
sta $4201 ; programmable i/o port
lda #$00
sta $4202 ; multiplicand a
sta $4203 ; multiplier b
sta $4204 ; multiplier c
sta $4205 ; multiplicand c
sta $4206 ; divisor b
sta $4207 ; horizontal count timer
sta $4208 ; horizontal count timer msb (most significant bit)
sta $4209 ; vertical count timer
sta $420a ; vertical count timer msb
sta $420b ; general dma enable (bits 0-7)
sta $420c ; horizontal dma (hdma) enable (bits 0-7)
sta $420d ; access cycle designation (slow/fast rom)
rts
charset:
.db $55,$aa,$55,$aa,$55,$aa,$55,$aa ;'@'
.db $00,$3c,$66,$7e,$66,$66,$66,$00 ;'a'
.db $00,$7c,$66,$7c,$66,$66,$7c,$00 ;'b'
.db $00,$3c,$66,$60,$60,$66,$3c,$00 ;'c'
.db $00,$78,$6c,$66,$66,$6c,$78,$00 ;'d'
.db $00,$7e,$60,$78,$60,$60,$7e,$00 ;'e'
.db $00,$7e,$60,$78,$60,$60,$60,$00 ;'f'
.db $00,$3c,$66,$60,$6e,$66,$3c,$00 ;'g'
.db $00,$66,$66,$7e,$66,$66,$66,$00 ;'h'
.db $00,$3c,$18,$18,$18,$18,$3c,$00 ;'i'
.db $00,$1e,$0c,$0c,$0c,$6c,$38,$00 ;'j'
.db $00,$6c,$78,$70,$78,$6c,$66,$00 ;'k'
.db $00,$60,$60,$60,$60,$60,$7e,$00 ;'l'
.db $00,$63,$77,$7f,$6b,$63,$63,$00 ;'m'
.db $00,$66,$76,$7e,$7e,$6e,$66,$00 ;'n'
.db $00,$3c,$66,$66,$66,$66,$3c,$00 ;'o'
.db $00,$7c,$66,$66,$7c,$60,$60,$00 ;'p'
.db $00,$3c,$66,$66,$66,$3c,$0e,$00 ;'q'
.db $00,$7c,$66,$66,$7c,$6c,$66,$00 ;'r'
.db $00,$3e,$60,$3c,$06,$66,$3c,$00 ;'s'
.db $00,$7e,$18,$18,$18,$18,$18,$00 ;'t'
.db $00,$66,$66,$66,$66,$66,$3c,$00 ;'u'
.db $00,$66,$66,$66,$66,$3c,$18,$00 ;'v'
.db $00,$63,$63,$6b,$7f,$77,$63,$00 ;'w'
.db $00,$66,$3c,$18,$3c,$66,$66,$00 ;'x'
.db $00,$66,$66,$3c,$18,$18,$18,$00 ;'y'
.db $00,$7e,$0c,$18,$30,$60,$7e,$00 ;'z'
.db $00,$3c,$30,$30,$30,$30,$3c,$00 ;'['
.db $c0,$60,$30,$18,$0c,$06,$03,$00 ;'|'
.db $00,$3c,$0c,$0c,$0c,$0c,$3c,$00 ;']'
.db $10,$38,$6c,$c6,$00,$00,$00,$00 ;'^'
.db $00,$00,$00,$00,$00,$00,$00,$fe ;'_'
.db $00,$00,$00,$00,$00,$00,$00,$00 ;' '
.db $00,$18,$18,$18,$00,$00,$18,$00 ;'!'
.db $00,$66,$66,$00,$00,$00,$00,$00 ;'"'
.db $00,$66,$ff,$66,$ff,$66,$00,$00 ;'#'
.db $00,$08,$1c,$28,$28,$1c,$08,$00 ;'$'
.db $00,$64,$6c,$18,$30,$6c,$4c,$00 ;'%'
.db $00,$00,$18,$18,$7e,$18,$18,$00 ;'&'
.db $00,$0c,$18,$00,$00,$00,$00,$00 ;'''
.db $00,$18,$30,$30,$30,$18,$0c,$00 ;'('
.db $00,$18,$0c,$0c,$0c,$18,$30,$00 ;')'
.db $00,$66,$3c,$ff,$3c,$66,$00,$00 ;'*'
.db $00,$18,$18,$7e,$18,$18,$00,$00 ;'+'
.db $00,$00,$00,$00,$00,$18,$18,$30 ;','
.db $00,$00,$00,$fe,$00,$00,$00,$00 ;'-'
.db $00,$00,$00,$00,$00,$18,$18,$00 ;'.'
.db $03,$06,$0c,$18,$30,$60,$c0,$00 ;'/'
.db $00,$3c,$66,$6e,$76,$66,$3c,$00 ;'0'
.db $00,$18,$38,$18,$18,$18,$7e,$00 ;'1'
.db $00,$7c,$06,$0c,$30,$60,$7e,$00 ;'2'
.db $00,$7e,$06,$1c,$06,$66,$3c,$00 ;'3'
.db $00,$0e,$1e,$36,$7f,$06,$06,$00 ;'4'
.db $00,$7e,$60,$7c,$06,$66,$3c,$00 ;'5'
.db $00,$3e,$60,$7c,$66,$66,$3c,$00 ;'6'
.db $00,$7e,$06,$0c,$0c,$0c,$0c,$00 ;'7'
.db $00,$3c,$66,$3c,$66,$66,$3c,$00 ;'8'
.db $00,$3c,$66,$3e,$06,$66,$3c,$00 ;'9'
.db $00,$00,$18,$00,$00,$18,$00,$00 ;':'
.db $00,$00,$18,$00,$00,$18,$18,$30 ;';'
.db $18,$18,$18,$18,$18,$18,$18,$00 ;'<'
.db $00,$00,$7e,$00,$7e,$00,$00,$00 ;'='
.db $18,$18,$0c,$0c,$0c,$0c,$18,$18 ;'>'
.db $00,$7c,$06,$0c,$18,$00,$18,$00 ;'?'
; 12345678901234567890123456789012
text_0:
.db " _ _ "
.db " ___ _ __ | |_(_)_ ____ __ "
.db " / _ \| '_ \| __| \ \/ /\ \/ / "
.db " | (_) | |_) | |_| |> < > < "
.db " \___/| .__/ \__|_/_/\_\/_/\_\ "
.db " |_| "
.db " "
.db " "
.db " "
.db " OPTIXX ONCE A AGAIN "
.db " WITH A CONSOLE RELEASE "
.db " WWW.OPTIXX.ORG "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.db " "
.INCLUDE "vsine_1.s"
.INCLUDE "vsine_2.s"
.INCLUDE "backcolors.s"
.INCLUDE "colbar_1.s"
.INCLUDE "colbar_2.s"
.INCLUDE "colbar_3.s"
.INCLUDE "optixx_logo.s"
.INCLUDE "colbarsine_1.s"
.ends
.bank 1
.SECTION "GFX"
.ends
;.BANK $04 SLOT 6
;.ORGA $8000
;long_label:
nop
nop
rts
;.BANK $01 SLOT 6
;.ORGA $8000
;.BASE $01
;.INCLUDE "music.s"
;.BANK $02 SLOT 6
;.ORG $0000
;music_data_1:
;.INCBIN "music1.bin"
;.BANk $03 SLOT 6
;.ORG $0000
;music_data_2:
;.INCBIN "music2.bin"

140
snes/ascii/music.inc Normal file
View File

@@ -0,0 +1,140 @@
; ***********************************************************
; *** Music routine taken from 'ZOOM.ASM'. ***
; *** Optimized by Yoshi ***
; ***********************************************************
play_music:
sep #$30
lda #$ff
sta $2140
rep #$10
ldx.w #$7fff
- lda.l $028000,x
sta.l $7f0000,x
lda.l $038000,x
sta.l $7f8000,x
dex
bpl -
stz $00fd
stz $00fe
lda #$7f
sta $00ff
ina ; Oh boy. Actually stores #$80. :-)
sta $2100
stz $4200
sei
jsr res1
sep #$30
- lda $2140
bne -
lda #$e0
sta $2143
lda #$ff
sta $2142
lda #$01
sta $2141
sta $2140
- lda $2140
cmp #$01
bne -
- lda $2140
cmp #$55
bne -
lda $0207
sta $2141
lda #$07
sta $2140
- lda $2140
cmp #$07
bne -
- lda $2140
cmp #$55
bne -
cli
rts
res1 php
jsr res2
plp
stz $2140
rts
res2 php
rep #$30
;ldy.w #$0000
lda.w #$bbaa
- cmp $2140
bne -
sep #$20
lda #$cc
bra B1
B4 lda [$fd],y
iny
xba
lda #$00
bra B2
B3 xba
lda [$fd],y
iny
xba
B5 cmp $2140
bne B5
ina
B2 rep #$20
sta $2140
sep #$20
dex
bne B3
- cmp $2140
bne -
- adc #$03
beq -
B1 pha
rep #$20
lda [$fd],y
iny
iny
tax
lda [$fd],y
iny
iny
sta $2142
sep #$20
cpx.w #$0001
lda #$00
rol
sta $2141
adc #$7f
pla
sta $2140
- cmp $2140
bne -
bvs B4
plp
rts
pla
sta $2140
- cmp $2140
bne -
bvs B5
plp
rts

BIN
snes/ascii/optixx_logo.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

170
snes/ascii/optixx_logo.s Normal file
View File

@@ -0,0 +1,170 @@
optixx_logo:
; ### row 04 ###
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=00 plane=00 row=04 col=00
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=01 plane=00 row=04 col=01
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=02 plane=00 row=04 col=02
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=03 plane=00 row=04 col=03
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=04 plane=00 row=04 col=04
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=05 plane=00 row=04 col=05
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=06 plane=00 row=04 col=06
.db $00,$00,$00,$00,$00,$00,$03,$0f ; tile=07 plane=00 row=04 col=07
.db $00,$00,$00,$00,$00,$00,$ff,$ff ; tile=08 plane=00 row=04 col=08
.db $00,$00,$00,$00,$00,$00,$fe,$fe ; tile=09 plane=00 row=04 col=09
.db $00,$00,$00,$00,$00,$00,$1f,$1f ; tile=0a plane=00 row=04 col=0a
.db $00,$00,$00,$00,$00,$00,$ff,$ff ; tile=0b plane=00 row=04 col=0b
.db $00,$00,$00,$00,$00,$00,$f0,$fc ; tile=0c plane=00 row=04 col=0c
.db $00,$00,$00,$00,$00,$00,$03,$03 ; tile=0d plane=00 row=04 col=0d
.db $00,$00,$00,$00,$00,$00,$ff,$ff ; tile=0e plane=00 row=04 col=0e
.db $00,$00,$00,$00,$00,$00,$ff,$ff ; tile=0f plane=00 row=04 col=0f
.db $00,$00,$00,$00,$00,$00,$fe,$fe ; tile=10 plane=00 row=04 col=10
.db $00,$00,$00,$00,$00,$00,$1f,$1f ; tile=11 plane=00 row=04 col=11
.db $00,$00,$00,$00,$00,$00,$80,$80 ; tile=12 plane=00 row=04 col=12
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=13 plane=00 row=04 col=13
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=14 plane=00 row=04 col=14
.db $00,$00,$00,$00,$00,$00,$3f,$3f ; tile=15 plane=00 row=04 col=15
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=16 plane=00 row=04 col=16
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=17 plane=00 row=04 col=17
.db $00,$00,$00,$00,$00,$00,$01,$01 ; tile=18 plane=00 row=04 col=18
.db $00,$00,$00,$00,$00,$00,$f8,$f8 ; tile=19 plane=00 row=04 col=19
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=1a plane=00 row=04 col=1a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=1b plane=00 row=04 col=1b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=1c plane=00 row=04 col=1c
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=1d plane=00 row=04 col=1d
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=1e plane=00 row=04 col=1e
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=1f plane=00 row=04 col=1f
; ### row 03 ###
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=20 plane=00 row=03 col=00
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=21 plane=00 row=03 col=01
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=22 plane=00 row=03 col=02
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=23 plane=00 row=03 col=03
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=24 plane=00 row=03 col=04
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=25 plane=00 row=03 col=05
.db $00,$00,$00,$01,$03,$07,$07,$07 ; tile=26 plane=00 row=03 col=06
.db $3f,$7f,$ff,$ff,$fc,$f0,$e0,$e0 ; tile=27 plane=00 row=03 col=07
.db $ff,$ff,$ff,$ff,$00,$00,$01,$01 ; tile=28 plane=00 row=03 col=08
.db $fe,$fc,$fc,$fc,$fc,$fc,$f8,$f8 ; tile=29 plane=00 row=03 col=09
.db $1f,$1f,$3f,$3f,$00,$00,$00,$00 ; tile=2a plane=00 row=03 col=0a
.db $ff,$ff,$ff,$ff,$00,$00,$00,$00 ; tile=2b plane=00 row=03 col=0b
.db $fe,$ff,$ff,$ff,$3f,$1f,$0f,$0f ; tile=2c plane=00 row=03 col=0c
.db $03,$03,$87,$c7,$c0,$c0,$c0,$c0 ; tile=2d plane=00 row=03 col=0d
.db $ff,$ff,$ff,$ff,$00,$00,$00,$00 ; tile=2e plane=00 row=03 col=0e
.db $ff,$ff,$ff,$ff,$00,$00,$00,$00 ; tile=2f plane=00 row=03 col=0f
.db $fe,$fc,$fc,$fc,$00,$00,$00,$00 ; tile=30 plane=00 row=03 col=10
.db $1f,$1f,$3f,$3f,$3f,$3f,$3f,$7e ; tile=31 plane=00 row=03 col=11
.db $80,$80,$80,$00,$03,$03,$03,$07 ; tile=32 plane=00 row=03 col=12
.db $00,$00,$00,$00,$f0,$f0,$f0,$e0 ; tile=33 plane=00 row=03 col=13
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=34 plane=00 row=03 col=14
.db $3f,$7e,$7e,$7e,$7e,$7e,$fc,$fc ; tile=35 plane=00 row=03 col=15
.db $00,$00,$00,$00,$1f,$1f,$1f,$3f ; tile=36 plane=00 row=03 col=16
.db $00,$00,$00,$00,$80,$80,$80,$00 ; tile=37 plane=00 row=03 col=17
.db $01,$03,$03,$03,$03,$03,$07,$07 ; tile=38 plane=00 row=03 col=18
.db $f8,$f0,$f0,$f0,$f0,$f0,$e0,$e0 ; tile=39 plane=00 row=03 col=19
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=3a plane=00 row=03 col=1a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=3b plane=00 row=03 col=1b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=3c plane=00 row=03 col=1c
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=3d plane=00 row=03 col=1d
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=3e plane=00 row=03 col=1e
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=3f plane=00 row=03 col=1f
; ### row 02 ###
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=40 plane=00 row=02 col=00
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=41 plane=00 row=02 col=01
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=42 plane=00 row=02 col=02
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=43 plane=00 row=02 col=03
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=44 plane=00 row=02 col=04
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=45 plane=00 row=02 col=05
.db $0f,$0f,$0f,$0f,$1f,$1f,$1f,$1f ; tile=46 plane=00 row=02 col=06
.db $c0,$c0,$c0,$c0,$80,$80,$80,$80 ; tile=47 plane=00 row=02 col=07
.db $01,$01,$03,$03,$03,$03,$03,$07 ; tile=48 plane=00 row=02 col=08
.db $f8,$f8,$f8,$f0,$f0,$f0,$f0,$e0 ; tile=49 plane=00 row=02 col=09
.db $00,$00,$7f,$7f,$ff,$ff,$ff,$ff ; tile=4a plane=00 row=02 col=0a
.db $00,$00,$ff,$ff,$ff,$ff,$ff,$ff ; tile=4b plane=00 row=02 col=0b
.db $0f,$1f,$ff,$ff,$ff,$ff,$ff,$ff ; tile=4c plane=00 row=02 col=0c
.db $c0,$c0,$8a,$8f,$9f,$9f,$9f,$1f ; tile=4d plane=00 row=02 col=0d
.db $00,$00,$80,$c0,$80,$80,$80,$80 ; tile=4e plane=00 row=02 col=0e
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=4f plane=00 row=02 col=0f
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=50 plane=00 row=02 col=10
.db $7e,$7e,$7e,$7e,$fc,$fc,$fc,$fc ; tile=51 plane=00 row=02 col=11
.db $07,$07,$07,$07,$07,$03,$07,$0f ; tile=52 plane=00 row=02 col=12
.db $e0,$f0,$ff,$ff,$ff,$ff,$ff,$ff ; tile=53 plane=00 row=02 col=13
.db $00,$01,$ff,$ff,$ff,$ff,$ff,$ff ; tile=54 plane=00 row=02 col=14
.db $fc,$fc,$f8,$f8,$f0,$e0,$f0,$f0 ; tile=55 plane=00 row=02 col=15
.db $3f,$3f,$3f,$3f,$3f,$1f,$3f,$7f ; tile=56 plane=00 row=02 col=16
.db $00,$80,$ff,$ff,$ff,$ff,$ff,$ff ; tile=57 plane=00 row=02 col=17
.db $07,$0f,$ff,$ff,$ff,$ff,$ff,$ff ; tile=58 plane=00 row=02 col=18
.db $e0,$e0,$c0,$c0,$80,$00,$80,$80 ; tile=59 plane=00 row=02 col=19
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=5a plane=00 row=02 col=1a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=5b plane=00 row=02 col=1b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=5c plane=00 row=02 col=1c
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=5d plane=00 row=02 col=1d
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=5e plane=00 row=02 col=1e
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=5f plane=00 row=02 col=1f
; ### row 01 ###
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=60 plane=00 row=01 col=00
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=61 plane=00 row=01 col=01
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=62 plane=00 row=01 col=02
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=63 plane=00 row=01 col=03
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=64 plane=00 row=01 col=04
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=65 plane=00 row=01 col=05
.db $3f,$3f,$3f,$3f,$3f,$7e,$7e,$7f ; tile=66 plane=00 row=01 col=06
.db $80,$00,$00,$00,$00,$00,$00,$ff ; tile=67 plane=00 row=01 col=07
.db $07,$07,$07,$0f,$0f,$3f,$7f,$ff ; tile=68 plane=00 row=01 col=08
.db $e1,$e1,$e1,$e1,$c1,$c3,$83,$03 ; tile=69 plane=00 row=01 col=09
.db $fc,$f8,$f8,$f8,$f8,$f8,$f0,$f0 ; tile=6a plane=00 row=01 col=0a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=6b plane=00 row=01 col=0b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=6c plane=00 row=01 col=0c
.db $3f,$3f,$3f,$3f,$3f,$3f,$3f,$1f ; tile=6d plane=00 row=01 col=0d
.db $80,$00,$00,$00,$00,$80,$c0,$ff ; tile=6e plane=00 row=01 col=0e
.db $00,$00,$00,$00,$00,$00,$00,$f0 ; tile=6f plane=00 row=01 col=0f
.db $01,$01,$01,$01,$01,$03,$03,$03 ; tile=70 plane=00 row=01 col=10
.db $fc,$f8,$f8,$f8,$f8,$f8,$f0,$f0 ; tile=71 plane=00 row=01 col=11
.db $0f,$1f,$1f,$1f,$1f,$3f,$3f,$3f ; tile=72 plane=00 row=01 col=12
.db $c0,$c0,$80,$80,$80,$00,$00,$00 ; tile=73 plane=00 row=01 col=13
.db $07,$03,$03,$03,$07,$07,$07,$00 ; tile=74 plane=00 row=01 col=14
.db $f0,$f0,$f0,$f0,$e0,$e1,$e1,$01 ; tile=75 plane=00 row=01 col=15
.db $7e,$fe,$fc,$fc,$fc,$f8,$f8,$f8 ; tile=76 plane=00 row=01 col=16
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=77 plane=00 row=01 col=17
.db $3f,$1f,$1f,$1f,$3f,$3f,$3f,$00 ; tile=78 plane=00 row=01 col=18
.db $80,$80,$80,$80,$00,$00,$00,$00 ; tile=79 plane=00 row=01 col=19
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=7a plane=00 row=01 col=1a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=7b plane=00 row=01 col=1b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=7c plane=00 row=01 col=1c
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=7d plane=00 row=01 col=1d
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=7e plane=00 row=01 col=1e
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=7f plane=00 row=01 col=1f
; ### row 00 ###
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=80 plane=00 row=00 col=00
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=81 plane=00 row=00 col=01
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=82 plane=00 row=00 col=02
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=83 plane=00 row=00 col=03
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=84 plane=00 row=00 col=04
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=85 plane=00 row=00 col=05
.db $7f,$7f,$ff,$ff,$ff,$00,$00,$00 ; tile=86 plane=00 row=00 col=06
.db $ff,$ff,$ff,$ff,$ff,$00,$00,$00 ; tile=87 plane=00 row=00 col=07
.db $fe,$fc,$f8,$e0,$80,$00,$00,$00 ; tile=88 plane=00 row=00 col=08
.db $03,$03,$03,$01,$00,$00,$00,$00 ; tile=89 plane=00 row=00 col=09
.db $f0,$f0,$e0,$e0,$e0,$00,$00,$00 ; tile=8a plane=00 row=00 col=0a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=8b plane=00 row=00 col=0b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=8c plane=00 row=00 col=0c
.db $1f,$0f,$07,$03,$00,$00,$00,$00 ; tile=8d plane=00 row=00 col=0d
.db $ff,$ff,$ff,$ff,$ff,$00,$00,$00 ; tile=8e plane=00 row=00 col=0e
.db $e0,$e0,$e0,$e0,$c0,$00,$00,$00 ; tile=8f plane=00 row=00 col=0f
.db $03,$03,$03,$01,$00,$00,$00,$00 ; tile=90 plane=00 row=00 col=10
.db $f0,$f0,$e0,$e0,$e0,$00,$00,$00 ; tile=91 plane=00 row=00 col=11
.db $3f,$3f,$3e,$1e,$0e,$00,$00,$00 ; tile=92 plane=00 row=00 col=12
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=93 plane=00 row=00 col=13
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=94 plane=00 row=00 col=14
.db $01,$01,$01,$00,$00,$00,$00,$00 ; tile=95 plane=00 row=00 col=15
.db $f8,$f8,$f0,$f0,$70,$00,$00,$00 ; tile=96 plane=00 row=00 col=16
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=97 plane=00 row=00 col=17
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=98 plane=00 row=00 col=18
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=99 plane=00 row=00 col=19
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=9a plane=00 row=00 col=1a
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=9b plane=00 row=00 col=1b
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=9c plane=00 row=00 col=1c
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=9d plane=00 row=00 col=1d
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=9e plane=00 row=00 col=1e
.db $00,$00,$00,$00,$00,$00,$00,$00 ; tile=9f plane=00 row=00 col=1f

BIN
snes/ascii/optixx_logo2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

705
snes/ascii/save.s Normal file
View File

@@ -0,0 +1,705 @@
.EMPTYFILL 0
.LOROM
.MEMORYMAP
SLOTSIZE $8000
DEFAULTSLOT 0
SLOT 0 $0000 ; ram , direct page
SLOT 1 $2000 ; PPU1, APU
SLOT 2 $3000 ; SFX, DSP
SLOT 3 $4000 ; Controller
SLOT 4 $4200 ; PPU2, DMA
SLOT 5 $6000 ; RESERVED
SLOT 6 $8000 ; code segment
.ENDME
;.ROMBANKSIZE $8000
;.ROMBANKS $80
.ROMBANKMAP
BANKSTOTAL $80
BANKSIZE $8000
BANKS $80
.ENDRO
.NAME "optixx"
.BANK $00 SLOT 6
.ORG $0000
.ORGA $8000
.SECTION "MAIN"
.define dp $0000
.define xstorage1 $0001
.define xstorage2 $0002
.define sineoffset $0003
.define scrollval $0005
.define col_reg $0007
.define hdma_table0 $0010
.define plane_0 $0400
.define plane_1 $0800
.define tile $2000
init:
sei ;stop interrupts
phk ;get the current bank and store on stack
plb ;get value off stack and make it the current
;programming bank
clc ;clear carry bit
xce ;native 16 bit mode (no 6502 emulation!)
jsr init_hdma_table0
;==========================================================================
; start of snes register initialization
;==========================================================================
sep #$30 ; x,y,a are 8 bit numbers
lda #$8f ; screen off, full brightness
sta $2100 ; brightness + screen enable register
lda #$00 ;
sta $2101 ; sprite register (size + address in vram)
lda #$00
sta $2102 ; sprite registers (address of sprite memory [oam])
sta $2103 ; "" ""
lda #$00 ; mode 0
sta $2105 ; graphic mode register
lda #$00 ; no planes, no mosaic
sta $2106 ; mosaic register
lda #$00 ;
sta $2107 ; plane 0 map vram location
lda #$00
sta $2108 ; plane 1 map vram location
lda #$00
sta $2109 ; plane 2 map vram location
lda #$00
sta $210a ; plane 3 map vram location
lda #$00
sta $210b ; plane 0+1 tile data location
lda #$00
sta $210c ; plane 2+3 tile data location
lda #$00
sta $210d ; plane 0 scroll x (first 8 bits)
sta $210d ; plane 0 scroll x (last 3 bits) #$0 - #$07ff
sta $210e ; plane 0 scroll y (first 8 bits)
sta $210e ; plane 0 scroll y (last 3 bits) #$0 - #$07ff
sta $210f ; plane 1 scroll x (first 8 bits)
sta $210f ; plane 1 scroll x (last 3 bits) #$0 - #$07ff
sta $2110 ; plane 1 scroll y (first 8 bits)
sta $2110 ; plane 1 scroll y (last 3 bits) #$0 - #$07ff
sta $2111 ; plane 2 scroll x (first 8 bits)
sta $2111 ; plane 2 scroll x (last 3 bits) #$0 - #$07ff
sta $2112 ; plane 2 scroll y (first 8 bits)
sta $2112 ; plane 2 scroll y (last 3 bits) #$0 - #$07ff
sta $2113 ; plane 3 scroll x (first 8 bits)
sta $2113 ; plane 3 scroll x (last 3 bits) #$0 - #$07ff
sta $2114 ; plane 3 scroll y (first 8 bits)
sta $2114 ; plane 3 scroll y (last 3 bits) #$0 - #$07ff
lda #$80 ; increase vram address after writing to $2119
sta $2115 ; vram address increment register
lda #$00
sta $2116 ; vram address low
sta $2117 ; vram address high
sta $211a ; initial mode 7 setting register
sta $211b ; mode 7 matrix parameter a register (low)
lda #$01
sta $211b ; mode 7 matrix parameter a register (high)
lda #$00
sta $211c ; mode 7 matrix parameter b register (low)
sta $211c ; mode 7 matrix parameter b register (high)
sta $211d ; mode 7 matrix parameter c register (low)
sta $211d ; mode 7 matrix parameter c register (high)
sta $211e ; mode 7 matrix parameter d register (low)
lda #$01
sta $211e ; mode 7 matrix parameter d register (high)
lda #$00
sta $211f ; mode 7 center position x register (low)
sta $211f ; mode 7 center position x register (high)
sta $2120 ; mode 7 center position y register (low)
sta $2120 ; mode 7 center position y register (high)
sta $2121 ; color number register ($0-ff)
sta $2123 ; bg1 & bg2 window mask setting register
sta $2124 ; bg3 & bg4 window mask setting register
sta $2125 ; obj & color window mask setting register
sta $2126 ; window 1 left position register
sta $2127 ; window 2 left position register
sta $2128 ; window 3 left position register
sta $2129 ; window 4 left position register
sta $212a ; bg1, bg2, bg3, bg4 window logic register
sta $212b ; obj, color window logic register (or,and,xor,xnor)
lda #$01
sta $212c ; main screen designation (planes, sprites enable)
lda #$00
sta $212d ; sub screen designation
lda #$00
sta $212e ; window mask for main screen
sta $212f ; window mask for sub screen
lda #$30
sta $2130 ; color addition & screen addition init setting
lda #$00
sta $2131 ; add/sub sub designation for screen, sprite, color
lda #$e0
sta $2132 ; color data for addition/subtraction
lda #$00
sta $2133 ; screen setting (interlace x,y/enable sfx<66>data)
lda #$00
sta $4200 ; enable v-blank, interrupt, joypad register
lda #$ff
sta $4201 ; programmable i/o port
lda #$00
sta $4202 ; multiplicand a
sta $4203 ; multiplier b
sta $4204 ; multiplier c
sta $4205 ; multiplicand c
sta $4206 ; divisor b
sta $4207 ; horizontal count timer
sta $4208 ; horizontal count timer msb (most significant bit)
sta $4209 ; vertical count timer
sta $420a ; vertical count timer msb
sta $420b ; general dma enable (bits 0-7)
sta $420c ; horizontal dma (hdma) enable (bits 0-7)
sta $420d ; access cycle designation (slow/fast rom)
;===========================================================================
; end of init routine
;===========================================================================
rep #$30 ; x,y,a fixed -> 16 bit mode
sep #$20 ; accumulator -> 8 bit mode
lda #(dp+0) ;load direct page
tcd ;store & and assign
lda #(plane_0>>8) ; screen map data @ vram location $1000
sta $2107 ; plane 0 map location register
lda #(plane_1>>8) ; screen map data @ vram location $1000
sta $2108 ; plane 1 map location register
lda #$22 ; plane 0 and plane 1 tile graphics @ $2000
sta $210b ; plane 0 tile graphics register
lda #$00 ; mode 0 value / tile mode
sta $2105 ; graphics mode register
lda #%00000011 ;
sta $212c ; plane enable register
lda #$00
sta $2121 ; set color number to 0 (background)
lda #$46 ; blue color, lower 8 bits
sta $2122 ; enter color value #$46 to color num. (low)
lda #$69 ; blue color, higher 8 bits
sta $2122 ; enter color value #$69 to color num. (high)
lda #$ff ; white color, lower 8 bits
sta $2122 ; write to next color number (01)
sta $2122 ; enter same value to color number (01)
ldx #$00
col_loop:
txa
sta $2121
lda #$00
sta $2122
lda #$7f
sta $2122
txa
ina
tax
cmp #$ff
beq col_loop
lda #$01
sta $4200 ; enable joypad read (bit one)
;==========================================================================
; start transfer of graphics to vram
;==========================================================================
ldx #(tile+0) ; assign vram location
stx $2116 ; writing to $2118/9 will store data here!
ldx #$0000
copychar:
lda.w charset,x ; get character set data<74>(font data)
sta $2118 ; store bitplane 1
stz $2119 ; clear bitplane 2 and increase vram address
inx
cpx #$0200 ; transfer $0200 bytes
bne copychar
init_plane_0:
ldx #(plane_0+0) ; assign vram location $1000 to $2116/7
stx $2116
ldx #$0000
init_plane_0_loop:
lda.w text_0,x ; get ascii text data
and #$3f ; we only want the first 64 characters
; convert ascii to c64 screen code
sta $2118
stz $2119 ; clear unwanted bits, no h/v flipping
inx
cpx #$0400 ; transfer entire screen
; $20*$20=$0400 (1024 bytes)
bne init_plane_0_loop
init_plane_1:
ldx #(plane_1+0) ; assign vram location $1000 to $2116/7
stx $2116
ldx #$0000
init_plane_1_loop:
lda.w text_1,x ; get ascii text data
and #$3f ; we only want the first 64 characters
; convert ascii to c64 screen code
sta $2118
stz $2119 ; clear unwanted bits, no h/v flipping
inx
cpx #$0400 ; transfer entire screen
; $20*$20=$0400 (1024 bytes)
bne init_plane_1_loop
init_screen:
lda #$0f ; screen enabled, full brightness
sta $2100 ;
cli ; clear interrupt bit
init_scroll:
lda #$00
sta.w scrollval
init_col_reg:
lda #$00
sta.w col_reg
init_sineoffset:
lda #$00
sta.w sineoffset
call_hmda_setup:
jsr init_hdma_table0
jmp intro
main:
jsr wait_vbl
jsr sine_plane
jsr scroll_plane
jsr cycle_color
jsr joypad
jmp main
; test vertical interrupt
wait_vbl:
lda $4210 ; check for vertical blank
and #$80
beq wait_vbl
rts
; joypad poll
joypad:
lda $4212 ; is joypad ready to be read?
and #$0001
bne joypad ; no? go back until it is!
lda $4219 ; read joypad high byte
and #$10 ; leave only "start" bit
bne reset ; "start" pressed? go to reset
rts ; if not then jump back to loop
reset:
sep #$30
lda #$00
pha ; push #$00 to stack
plb ; pull #$00 from stack and make it the
; the programming bank
jmp init ; jump long to $008000
; gfx routine
; intro stuff
intro:
rep #$30
sep #$20
ldx #$f1
mosaic_l:
jsr wait_vbl
txa
sta $2106
sbc #$10
tax
cmp #$01
bne mosaic_l
stz $2106
fade:
ldy #$0f
fade_dark:
jsr wait_vbl
tya
sta $2100
dey
cpy #$0000
bne fade_dark
ldy #$0000
fade_light:
jsr wait_vbl
tya
sta $2100
iny
cpy #$000f
bne fade_light
jmp main
; scroll loop
scroll_plane:
lda.w scrollval
sta $210e
stz $210e
adc #$01
sta.w scrollval
cmp #$ff
beq restore_scroll
rts
restore_scroll:
lda #$00
sta.w scrollval
rts
; cycle loop
cycle_color:
ldx #$0000
lda.w col_reg,x
adc #$01
stz $2121
sta $2122
stz $2122
sta col_reg
cmp #$7f
bne cycle_c
lda #$0000
sta col_reg
cycle_c:
rts
sine_plane:
rep #$10
sep #$20
lda sineoffset
ina
sta sineoffset
cmp #$ff
bne sine_plane_c
lda #$00
sta sineoffset
sine_plane_c:
tay
ldx #$0000
sine_plane_l:
iny
cpy #$ff
bne sine_plane_l_c
lda #$00
tay
sine_plane_l_c:
inx
lda.w vsine,y
sta hdma_table0+3,x
inx
inx
cpx #$0180
bne sine_plane_l
rep #$30
sep #$20
rts
; init hdma list
init_hdma_table0:
rep #$10
sep #$20
ldy #$0000
ldx #$0000
;lda #$00
;sta sineoffset
lda #$30
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
sta hdma_table0,x
inx
init_hdma_table0_loop:
lda #$01
sta hdma_table0,x
inx
lda vsine,y
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
iny
cpx #$0183 ; (128 + 1) * 3 = 387 = 0x0183
bne init_hdma_table0_loop
lda #$20
sta hdma_table0,x
inx
lda #$00
sta hdma_table0,x
inx
sta hdma_table0,x
inx
sta hdma_table0,x
inx
sta hdma_table0,x
lda #$02
sta $4300
lda #$0f
sta $4301
ldx.w #hdma_table0
;ldx.w #test_hmda_table
stx $4302
lda #$00
sta $4304
lda #%00000001
sta $420c
rep #$30
sep #$20
rts
charset:
.db $55,$aa,$55,$aa,$55,$aa,$55,$aa ;'@'
.db $00,$3c,$66,$7e,$66,$66,$66,$00 ;'a'
.db $00,$7c,$66,$7c,$66,$66,$7c,$00 ;'b'
.db $00,$3c,$66,$60,$60,$66,$3c,$00 ;'c'
.db $00,$78,$6c,$66,$66,$6c,$78,$00 ;'d'
.db $00,$7e,$60,$78,$60,$60,$7e,$00 ;'e'
.db $00,$7e,$60,$78,$60,$60,$60,$00 ;'f'
.db $00,$3c,$66,$60,$6e,$66,$3c,$00 ;'g'
.db $00,$66,$66,$7e,$66,$66,$66,$00 ;'h'
.db $00,$3c,$18,$18,$18,$18,$3c,$00 ;'i'
.db $00,$1e,$0c,$0c,$0c,$6c,$38,$00 ;'j'
.db $00,$6c,$78,$70,$78,$6c,$66,$00 ;'k'
.db $00,$60,$60,$60,$60,$60,$7e,$00 ;'l'
.db $00,$63,$77,$7f,$6b,$63,$63,$00 ;'m'
.db $00,$66,$76,$7e,$7e,$6e,$66,$00 ;'n'
.db $00,$3c,$66,$66,$66,$66,$3c,$00 ;'o'
.db $00,$7c,$66,$66,$7c,$60,$60,$00 ;'p'
.db $00,$3c,$66,$66,$66,$3c,$0e,$00 ;'q'
.db $00,$7c,$66,$66,$7c,$6c,$66,$00 ;'r'
.db $00,$3e,$60,$3c,$06,$66,$3c,$00 ;'s'
.db $00,$7e,$18,$18,$18,$18,$18,$00 ;'t'
.db $00,$66,$66,$66,$66,$66,$3c,$00 ;'u'
.db $00,$66,$66,$66,$66,$3c,$18,$00 ;'v'
.db $00,$63,$63,$6b,$7f,$77,$63,$00 ;'w'
.db $00,$66,$3c,$18,$3c,$66,$66,$00 ;'x'
.db $00,$66,$66,$3c,$18,$18,$18,$00 ;'y'
.db $00,$7e,$0c,$18,$30,$60,$7e,$00 ;'z'
.db $00,$3c,$30,$30,$30,$30,$3c,$00 ;'['
.db $c0,$60,$30,$18,$0c,$06,$03,$00 ;'|'
.db $00,$3c,$0c,$0c,$0c,$0c,$3c,$00 ;']'
.db $10,$38,$6c,$c6,$00,$00,$00,$00 ;'^'
.db $00,$00,$00,$00,$00,$00,$00,$fe ;'_'
.db $00,$00,$00,$00,$00,$00,$00,$00 ;' '
.db $00,$18,$18,$18,$00,$00,$18,$00 ;'!'
.db $00,$66,$66,$00,$00,$00,$00,$00 ;'"'
.db $00,$66,$ff,$66,$ff,$66,$00,$00 ;'#'
.db $00,$08,$1c,$28,$28,$1c,$08,$00 ;'$'
.db $00,$64,$6c,$18,$30,$6c,$4c,$00 ;'%'
.db $00,$00,$18,$18,$7e,$18,$18,$00 ;'&'
.db $00,$0c,$18,$00,$00,$00,$00,$00 ;'''
.db $00,$18,$30,$30,$30,$18,$0c,$00 ;'('
.db $00,$18,$0c,$0c,$0c,$18,$30,$00 ;')'
.db $00,$66,$3c,$ff,$3c,$66,$00,$00 ;'*'
.db $00,$18,$18,$7e,$18,$18,$00,$00 ;'+'
.db $00,$00,$00,$00,$00,$18,$18,$30 ;','
.db $00,$00,$00,$fe,$00,$00,$00,$00 ;'-'
.db $00,$00,$00,$00,$00,$18,$18,$00 ;'.'
.db $03,$06,$0c,$18,$30,$60,$c0,$00 ;'/'
.db $00,$3c,$66,$6e,$76,$66,$3c,$00 ;'0'
.db $00,$18,$38,$18,$18,$18,$7e,$00 ;'1'
.db $00,$7c,$06,$0c,$30,$60,$7e,$00 ;'2'
.db $00,$7e,$06,$1c,$06,$66,$3c,$00 ;'3'
.db $00,$0e,$1e,$36,$7f,$06,$06,$00 ;'4'
.db $00,$7e,$60,$7c,$06,$66,$3c,$00 ;'5'
.db $00,$3e,$60,$7c,$66,$66,$3c,$00 ;'6'
.db $00,$7e,$06,$0c,$0c,$0c,$0c,$00 ;'7'
.db $00,$3c,$66,$3c,$66,$66,$3c,$00 ;'8'
.db $00,$3c,$66,$3e,$06,$66,$3c,$00 ;'9'
.db $00,$00,$18,$00,$00,$18,$00,$00 ;':'
.db $00,$00,$18,$00,$00,$18,$18,$30 ;';'
.db $18,$18,$18,$18,$18,$18,$18,$00 ;'<'
.db $00,$00,$7e,$00,$7e,$00,$00,$00 ;'='
.db $18,$18,$0c,$0c,$0c,$0c,$18,$18 ;'>'
.db $00,$7c,$06,$0c,$18,$00,$18,$00 ;'?'
; 12345678901234567890123456789012
text_0:
.db "| _ _ |"
.db "| ___ _ __ | |_(_)_ ____ __|"
.db "| / _ \| '_ \| __| \ \/ /\ \/ /|"
.db "|| (_) | |_) | |_| |> < > < |"
.db "| \___/| .__/ \__|_/_/\_\/_/\_\|"
.db "| |_| |"
.db "| |"
.db "| |"
.db "| |"
.db "| OPTIXX ONCE A AGAIN |"
.db "| WITH A CLASSIS CONSOL |"
.db "| PIECE OF CODE... |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
.db "| |"
text_1:
.REPT 20
.db "| _ _ |"
.db "| ___ _ __ | |_(_)_ ____ __|"
.db "| / _ \| '_ \| __| \ \/ /\ \/ /|"
.db "|| (_) | |_) | |_| |> < > < |"
.db "| \___/| .__/ \__|_/_/\_\/_/\_\|"
.db "| |_| |"
.db "| |"
.ENDR
vsine:
.db 108,109,111,112,113,114,115,115,116,117,118,119,120,120,121
.db 122,122,123,123,124,124,125,125,125,126,126,126,127,127,127
.db 127,127,127,127,127,127,127,127,126,126,126,125,125,125,124
.db 124,123,123,122,122,121,120,120,119,118,117,116,115,115,114
.db 113,112,111,109,108,107,106,105,104,103,101,100,99,97,96,95
.db 93,92,91,89,88,86,85,83,82,80,79,77,76,74,73,71,70,68,67,65
.db 64,62,60,59,57,56,54,53,51,50,48,47,45,44,42,41,39,38,36,35
.db 34,32,31,30,28,27,26,24,23,22,21,20,19,18,16,15,14,13,12,12
.db 11,10,9,8,7,7,6,5,5,4,4,3,3,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0
.db 0,1,1,1,2,2,2,3,3,4,4,5,5,6,7,7,8,9,10,11,12,12,13,14,15,16
.db 18,19,20,21,22,23,24,26,27,28,30,31,32,34,35,36,38,39,41,42
.db 44,45,47,48,50,51,53,54,56,57,59,60,62,64,65,67,68,70,71,73
.db 74,76,77,79,80,82,83,85,86,88,89,91,92,93,95,96,97,99,100,101
.db 103,104,105,106,107
vsine_end:
.ENDS
.BANK $04 SLOT 6
.ORGA $8000
long_label:
nop
nop
rts
.BANK $01 SLOT 6
.ORGA $8000
.BASE $01
.INCLUDE "music.s"
.BANK $02 SLOT 6
.ORG $0000
music_data_1:
.INCBIN "music1.bin"
.BANk $03 SLOT 6
.ORG $0000
music_data_2:
.INCBIN "music2.bin"

90
snes/ascii/sinegen.py Normal file
View File

@@ -0,0 +1,90 @@
import string
import math
import sys
M_PI = 3.14159265358979323846
def writefile(fp,val):
global out,el
if not len(out):
out = " .db "
el+=1
out += "$%02x," % val
if el == cnt/8 :
out=out[:-1]
out+="\n"
fp.write(out)
out =""
el=0
def sine(val,r,scale,stepping):
global M_PI,flip
re = int(math.sin(val*(M_PI*scale)/r)*r) + r
re = re & 0xff
if flip and val%2:
re = (r*2) - re
re = re * stepping
#print "sine %s -> %s " % (val,re)
return re
def main():
global cnt,flip
asmfile = sys.argv[1]
basename = string.replace(asmfile,".s","")
cnt = int(sys.argv[2])
upper = int(sys.argv[3])
if len(sys.argv) >= 5:
stepping = int(sys.argv[4])
else:
stepping = 1
if len(sys.argv) >= 6 and sys.argv[5]=='flip':
flip = 1
else:
flip = 0
half = int(cnt) / 2
if cnt%8:
print "ctn should be modulo 8"
sys.exit(1)
fp = open(asmfile,'w')
out = "\n\n\n%s:\n\n" % (basename)
fp.write(out)
out = ""
for i in range(0,cnt):
writefile(fp,sine(i,upper/2,(float(upper)/cnt),stepping))
out = str()
el = 0
if __name__ == '__main__':
if len(sys.argv) >= 4:
main()
else:
print "usage: %s filename cnt(int) upper(int) [stepping (int)] ['flip']" % sys.argv[0]

13
snes/ascii/test.s Normal file
View File

@@ -0,0 +1,13 @@
test:
.db $30,$2f,$32,$2d,$34,$2b,$37,$28,$39,$26,$3b,$24,$3d,$21,$40,$1f,$42,$1d,$44,$1b,$46,$19,$48,$17,$4a,$15,$4c,$13,$4e,$11,$50,$0f
.db $51,$0e,$53,$0c,$55,$0b,$56,$09,$57,$08,$59,$07,$5a,$06,$5b,$05,$5c,$04,$5d,$03,$5d,$02,$5e,$02,$5f,$01,$5f,$01,$5f,$01,$5f,$01
.db $60,$01,$5f,$01,$5f,$01,$5f,$01,$5f,$02,$5e,$02,$5d,$03,$5d,$04,$5c,$05,$5b,$06,$5a,$07,$59,$08,$57,$09,$56,$0b,$55,$0c,$53,$0e
.db $51,$0f,$50,$11,$4e,$13,$4c,$15,$4a,$17,$48,$19,$46,$1b,$44,$1d,$42,$1f,$40,$21,$3d,$24,$3b,$26,$39,$28,$37,$2b,$34,$2d,$32,$2f
.db $30,$31,$2e,$33,$2c,$35,$29,$38,$27,$3a,$25,$3c,$23,$3f,$20,$41,$1e,$43,$1c,$45,$1a,$47,$18,$49,$16,$4b,$14,$4d,$12,$4f,$10,$51
.db $0f,$52,$0d,$54,$0b,$55,$0a,$57,$09,$58,$07,$59,$06,$5a,$05,$5b,$04,$5c,$03,$5d,$03,$5e,$02,$5e,$01,$5f,$01,$5f,$01,$5f,$01,$5f
.db $00,$5f,$01,$5f,$01,$5f,$01,$5f,$01,$5e,$02,$5e,$03,$5d,$03,$5c,$04,$5b,$05,$5a,$06,$59,$07,$58,$09,$57,$0a,$55,$0b,$54,$0d,$52
.db $0f,$51,$10,$4f,$12,$4d,$14,$4b,$16,$49,$18,$47,$1a,$45,$1c,$43,$1e,$41,$20,$3f,$23,$3c,$25,$3a,$27,$38,$29,$35,$2c,$33,$2e,$31

13
snes/ascii/vsine_1.s Normal file
View File

@@ -0,0 +1,13 @@
vsine_1:
.db $30,$31,$32,$33,$34,$35,$37,$38,$39,$3a,$3b,$3c,$3d,$3f,$40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$4a,$4b,$4c,$4d,$4e,$4f,$50,$51
.db $51,$52,$53,$54,$55,$55,$56,$57,$57,$58,$59,$59,$5a,$5a,$5b,$5b,$5c,$5c,$5d,$5d,$5d,$5e,$5e,$5e,$5f,$5f,$5f,$5f,$5f,$5f,$5f,$5f
.db $60,$5f,$5f,$5f,$5f,$5f,$5f,$5f,$5f,$5e,$5e,$5e,$5d,$5d,$5d,$5c,$5c,$5b,$5b,$5a,$5a,$59,$59,$58,$57,$57,$56,$55,$55,$54,$53,$52
.db $51,$51,$50,$4f,$4e,$4d,$4c,$4b,$4a,$49,$48,$47,$46,$45,$44,$43,$42,$41,$40,$3f,$3d,$3c,$3b,$3a,$39,$38,$37,$35,$34,$33,$32,$31
.db $30,$2f,$2e,$2d,$2c,$2b,$29,$28,$27,$26,$25,$24,$23,$21,$20,$1f,$1e,$1d,$1c,$1b,$1a,$19,$18,$17,$16,$15,$14,$13,$12,$11,$10,$0f
.db $0f,$0e,$0d,$0c,$0b,$0b,$0a,$09,$09,$08,$07,$07,$06,$06,$05,$05,$04,$04,$03,$03,$03,$02,$02,$02,$01,$01,$01,$01,$01,$01,$01,$01
.db $00,$01,$01,$01,$01,$01,$01,$01,$01,$02,$02,$02,$03,$03,$03,$04,$04,$05,$05,$06,$06,$07,$07,$08,$09,$09,$0a,$0b,$0b,$0c,$0d,$0e
.db $0f,$0f,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f,$20,$21,$23,$24,$25,$26,$27,$28,$29,$2b,$2c,$2d,$2e,$2f

13
snes/ascii/vsine_2.s Normal file
View File

@@ -0,0 +1,13 @@
vsine_2:
.db $30,$2f,$32,$2d,$34,$2b,$37,$28,$39,$26,$3b,$24,$3d,$21,$40,$1f,$42,$1d,$44,$1b,$46,$19,$48,$17,$4a,$15,$4c,$13,$4e,$11,$50,$0f
.db $51,$0e,$53,$0c,$55,$0b,$56,$09,$57,$08,$59,$07,$5a,$06,$5b,$05,$5c,$04,$5d,$03,$5d,$02,$5e,$02,$5f,$01,$5f,$01,$5f,$01,$5f,$01
.db $60,$01,$5f,$01,$5f,$01,$5f,$01,$5f,$02,$5e,$02,$5d,$03,$5d,$04,$5c,$05,$5b,$06,$5a,$07,$59,$08,$57,$09,$56,$0b,$55,$0c,$53,$0e
.db $51,$0f,$50,$11,$4e,$13,$4c,$15,$4a,$17,$48,$19,$46,$1b,$44,$1d,$42,$1f,$40,$21,$3d,$24,$3b,$26,$39,$28,$37,$2b,$34,$2d,$32,$2f
.db $30,$31,$2e,$33,$2c,$35,$29,$38,$27,$3a,$25,$3c,$23,$3f,$20,$41,$1e,$43,$1c,$45,$1a,$47,$18,$49,$16,$4b,$14,$4d,$12,$4f,$10,$51
.db $0f,$52,$0d,$54,$0b,$55,$0a,$57,$09,$58,$07,$59,$06,$5a,$05,$5b,$04,$5c,$03,$5d,$03,$5e,$02,$5e,$01,$5f,$01,$5f,$01,$5f,$01,$5f
.db $00,$5f,$01,$5f,$01,$5f,$01,$5f,$01,$5e,$02,$5e,$03,$5d,$03,$5c,$04,$5b,$05,$5a,$06,$59,$07,$58,$09,$57,$0a,$55,$0b,$54,$0d,$52
.db $0f,$51,$10,$4f,$12,$4d,$14,$4b,$16,$49,$18,$47,$1a,$45,$1c,$43,$1e,$41,$20,$3f,$23,$3c,$25,$3a,$27,$38,$29,$35,$2c,$33,$2e,$31

79
snes/bankselect/Makefile Normal file
View File

@@ -0,0 +1,79 @@
# SDK Config
PLATFORM=mac
ifeq ($(PLATFORM),linux)
# Linux Wine
SDK=/home/david/.wine/drive_c/65xx_FreeSDK
WINE=wine
EMU=zsnes
EMU_DEBUG=/home/david/Devel/arch/snes/tools/zsnes_linux_debug151/src/zsnesd -d
else
# Mac Wine
SDK=/Users/david/.wine/drive_c/65xx_FreeSDK
WINE=wine
EMU=zsnes
endif
CC=$(WINE) $(SDK)/bin/WDC816CC.exe
AS=$(WINE) $(SDK)/bin/WDC816AS.exe
LD=$(WINE) $(SDK)/bin/WDCLN.exe
PADBIN=$(WINE) tools/padbin.exe
PCX2SNES=$(WINE) tools/Pcx2Snes.exe
# Project
INC=$(SDK)/include
LIBS=$(SDK)/lib/cc
#OBJS=StartupSnes.obj main.obj pad.obj event.obj myEvents.obj PPU.obj debug.obj ressource.obj
OBJS=StartupSnes.obj main.obj pad.obj PPU.obj debug.obj ressource.obj crc.obj
APP=banks.smc
GFX=kungfu debugfont
all: $(APP)
run:
$(EMU) $(APP)
debugger:
$(EMU_DEBUG) $(APP)
upload:
ucon64 $(APP)
cp -rv $(APP) /Volumes/SNES
sync
diskutil unmount /Volumes/SNES
crc:
python ../../scripts/crc_xmodem.py $(APP)
kungfu:
$(PCX2SNES) ressource/kungfu -n -c16 -screen
debugfont:
$(PCX2SNES) ressource/debugFont -n -c16 -s8 -o1
StartupSnes.obj: StartupSnes.asm
$(AS) -V $?
ressource.obj: ressource.asm
$(AS) -V $?
%.obj: %.c
$(CC) -wl -wp -sop -MC -I $(INC) $?
$(APP): $(OBJS)
$(LD) -HB -M21 -V -T -Pff \
-C008000,0000 -U0000,0000 \
-Avectors=FFE4,7FE4 \
-Aregistration_data=FFB0,7FB0 \
-Aressource=18000,8000 \
-N $(OBJS) -L$(LIBS) -O $@
$(PADBIN) 0x40000 $(APP)
clean:
rm -vf $(APP) *.obj

80
snes/bankselect/PPU.c Normal file
View File

@@ -0,0 +1,80 @@
#include "data.h"
byte tileMapLocation[4];
word characterLocation[4];
void waitForVBlank(void) {
byte Status;
do {
Status = *(byte*)0x4210;
} while (!(Status & 0x80));
}
void setTileMapLocation(word vramDst, byte screenProp, byte bgNumber) {
tileMapLocation[bgNumber] = ((vramDst >> 8) & 0xfc) | ( screenProp & 0x03 );
*(byte*) (0x2107+bgNumber) = tileMapLocation[bgNumber];
}
void restoreTileMapLocation(byte bgNumber) {
*(byte*) (0x2107+bgNumber) = tileMapLocation[bgNumber];
}
void setCharacterLocation(word vramDst, byte bgNumber) {
characterLocation[bgNumber] = vramDst;
if(bgNumber < 2) {
*(byte*) 0x210b = (characterLocation[1] >> 8 & 0xf0 ) + (characterLocation[0] >> 12);
} else {
*(byte*) 0x210c = (characterLocation[3] >> 8 & 0xf0 ) + (characterLocation[2] >> 12);
}
}
void restoreCharacterLocation(byte bgNumber) {
setCharacterLocation(characterLocation[bgNumber], bgNumber);
}
void VRAMByteWrite(byte value, word vramDst) {
*(byte*)0x2115 = 0x80;
*(word*)0x2116 = vramDst;
*(byte*)0x2118 = value;
}
void VRAMLoad(word src, word vramDst, word size) {
// set address in VRam for read or write ($2116) + block size transfer ($2115)
*(byte*)0x2115 = 0x80;
*(word*)0x2116 = vramDst;
*(word*)0x4300 = 0x1801; // set DMA control register (1 word inc)
// and destination ($21xx xx -> 0x18)
*(word*)0x4302 = src; // DMA channel x source address offset
// (low $4302 and high $4303 optimisation)
*(byte*)0x4304 = 0x01; // DMA channel x source address bank
*(word*)0x4305 = size; // DMA channel x transfer size
// (low $4305 and high $4306 optimisation)
// Turn on DMA transfer for this channel
waitForVBlank();
*(byte*)0x2100 = 0x80;
*(byte*)0x420b = 0x01;
*(byte*)0x2100 = 0x00;
}
void CGRAMLoad(word src, byte cgramDst, word size) {
// set address in VRam for read or write + block size
*(byte*)0x2121 = cgramDst;
*(word*)0x4300 = 0x2200; // set DMA control register (1 byte inc)
// and destination ($21xx xx -> 022)
*(word*)0x4302 = src; // DMA channel x source address offset
// (low $4302 and high $4303 optimisation)
*(byte*)0x4304 = 0x01; // DMA channel x source address bank
*(word*)0x4305 = size; // DMA channel x transfer size
// (low $4305 and high $4306 optimisation)
// Turn on DMA transfer for this channel
waitForVBlank();
*(byte*)0x2100 = 0x80;
*(byte*)0x420b = 0x01;
*(byte*)0x2100 = 0x00;
}

11
snes/bankselect/PPU.h Normal file
View File

@@ -0,0 +1,11 @@
extern byte tileMapLocation[4];
extern word characterLocation[4];
void waitForVBlank(void);
void setTileMapLocation(word vramDst, byte screenProp, byte bgNumber);
void restoreTileMapLocation(byte bgNumber);
void setCharacterLocation(word vramDst, byte bgNumber);
void restoreCharacterLocation(byte bgNumber);
void VRAMByteWrite(byte value, word vramDst);
void VRAMLoad(word src, word vramDst, word size);
void CGRAMLoad(word src, byte cgramDst, word size);

View File

@@ -0,0 +1,240 @@
; SNES ROM startup code
;******************************************************************************
;*** Define a special section in case most of the code is not in bank 0. ***
;******************************************************************************
;STACK EQU $01ff ;CHANGE THIS FOR YOUR SYSTEM
;STARTUP SECTION OFFSET $008000
CODE
XDEF START
START:
XREF _~main
sei ; Disabled interrupts
clc ; clear carry to switch to native mode
xce ; Xchange carry & emulation bit. native mode
rep #$18 ; Binary mode (decimal mode off), X/Y 16 bit
LONGI ON
ldx #$1FFF ; set stack to $1FFF
txs
rep #$30
longa on
longi on
; Init data used for heap
; see heap definition below
XREF _~_heap_top
XREF _~_mem_start
stz _~_heap_top
stz _~_mem_start
XREF _~preInit
jsr >_~preInit
sep #$30 ; X,Y,A are 8 bit numbers
LONGA OFF
LONGI OFF
lda #$8F ; screen off, full brightness
sta $2100 ; brightness + screen enable register
stz $2101 ; Sprite register (size + address in VRAM)
stz $2102 ; Sprite registers (address of sprite memory [OAM])
stz $2103 ; "" ""
stz $2105 ; Mode 0, = Graphic mode register
stz $2106 ; noplanes, no mosaic, = Mosaic register
stz $2107 ; Plane 0 map VRAM location
stz $2108 ; Plane 1 map VRAM location
stz $2109 ; Plane 2 map VRAM location
stz $210A ; Plane 3 map VRAM location
stz $210B ; Plane 0+1 Tile data location
stz $210C ; Plane 2+3 Tile data location
stz $210D ; Plane 0 scroll x (first 8 bits)
stz $210D ; Plane 0 scroll x (last 3 bits) #$0 - #$07ff
stz $210E ; Plane 0 scroll y (first 8 bits)
stz $210E ; Plane 0 scroll y (last 3 bits) #$0 - #$07ff
stz $210F ; Plane 1 scroll x (first 8 bits)
stz $210F ; Plane 1 scroll x (last 3 bits) #$0 - #$07ff
stz $2110 ; Plane 1 scroll y (first 8 bits)
stz $2110 ; Plane 1 scroll y (last 3 bits) #$0 - #$07ff
stz $2111 ; Plane 2 scroll x (first 8 bits)
stz $2111 ; Plane 2 scroll x (last 3 bits) #$0 - #$07ff
stz $2112 ; Plane 2 scroll y (first 8 bits)
stz $2112 ; Plane 2 scroll y (last 3 bits) #$0 - #$07ff
stz $2113 ; Plane 3 scroll x (first 8 bits)
stz $2113 ; Plane 3 scroll x (last 3 bits) #$0 - #$07ff
stz $2114 ; Plane 3 scroll y (first 8 bits)
stz $2114 ; Plane 3 scroll y (last 3 bits) #$0 - #$07ff
lda #$80 ; increase VRAM address after writing to $2119
sta $2115 ; VRAM address increment register
stz $2116 ; VRAM address low
stz $2117 ; VRAM address high
stz $211A ; Initial Mode 7 setting register
stz $211B ; Mode 7 matrix parameter A register (low)
lda #$01
sta $211B ; Mode 7 matrix parameter A register (high)
stz $211C ; Mode 7 matrix parameter B register (low)
stz $211C ; Mode 7 matrix parameter B register (high)
stz $211D ; Mode 7 matrix parameter C register (low)
stz $211D ; Mode 7 matrix parameter C register (high)
stz $211E ; Mode 7 matrix parameter D register (low)
sta $211E ; Mode 7 matrix parameter D register (high)
stz $211F ; Mode 7 center position X register (low)
stz $211F ; Mode 7 center position X register (high)
stz $2120 ; Mode 7 center position Y register (low)
stz $2120 ; Mode 7 center position Y register (high)
stz $2121 ; Color number register ($0-ff)
stz $2123 ; BG1 & BG2 Window mask setting register
stz $2124 ; BG3 & BG4 Window mask setting register
stz $2125 ; OBJ & Color Window mask setting register
stz $2126 ; Window 1 left position register
stz $2127 ; Window 2 left position register
stz $2128 ; Window 3 left position register
stz $2129 ; Window 4 left position register
stz $212A ; BG1, BG2, BG3, BG4 Window Logic register
stz $212B ; OBJ, Color Window Logic Register (or,and,xor,xnor)
sta $212C ; Main Screen designation (planes, sprites enable)
stz $212D ; Sub Screen designation
stz $212E ; Window mask for Main Screen
stz $212F ; Window mask for Sub Screen
lda #$30
sta $2130 ; Color addition & screen addition init setting
stz $2131 ; Add/Sub sub designation for screen, sprite, color
lda #$E0
sta $2132 ; color data for addition/subtraction
stz $2133 ; Screen setting (interlace x,y/enable SFX data)
stz $4200 ; Enable V-blank, interrupt, Joypad register
lda #$FF
sta $4201 ; Programmable I/O port
stz $4202 ; Multiplicand A
stz $4203 ; Multiplier B
stz $4204 ; Multiplier C
stz $4205 ; Multiplicand C
stz $4206 ; Divisor B
stz $4207 ; Horizontal Count Timer
stz $4208 ; Horizontal Count Timer MSB (most significant bit)
stz $4209 ; Vertical Count Timer
stz $420A ; Vertical Count Timer MSB
stz $420B ; General DMA enable (bits 0-7)
stz $420C ; Horizontal DMA (HDMA) enable (bits 0-7)
stz $420D ; Access cycle designation (slow/fast rom)
cli ; Enable interrupts
rep #$30
longa on
longi on
jsr >_~main
brk
XDEF IRQ
IRQ:
XREF _~IRQHandler
LONGA ON
LONGI ON
rep #$30
pha
phx
phy
jsr _~IRQHandler
ply
plx
pla
rti
XDEF NMI
NMI:
XREF _~NMIHandler
LONGA ON
LONGI ON
rep #$30
pha
phx
phy
phd
phb
lda #$0000
sep #$30 ; X,Y,A are 8 bit numbers
LONGA OFF
LONGI OFF
lda $4210 ; Read NMI
LONGA ON
LONGI ON
rep #$30
jsr _~NMIHandler
plb
pld
ply
plx
pla
rti
DIRQ:
rti
ENDS
;******************************************************************************
;*** Heap definition ***
;******************************************************************************
DATA
XDEF _~heap_start
XDEF _~heap_end
_~heap_start:
WORD $1000
_~heap_end:
WORD $1200
;******************************************************************************
;*** SNES ROM Registartion Data ***
;******************************************************************************
REGISTRATION_DATA SECTION
MAKER_CODE FCC /FF/
GAME_CODE FCC /SMWJ/
FIXED_VALUE0 BYTE $00, $00, $00, $00, $00, $00, $00
EXPANSION_RAM_SIZE BYTE $00
SPECIAL_VERSION BYTE $00
CARTRIDGE_TYPE_SUB BYTE $00
GAME_TITLE FCC /GAME TITLE !/
;012345678901234567890;
MAP_MODE BYTE $20
CARTRIDGE_SIZE BYTE $00
ROM_SIZE BYTE $08
RAM_SIZE BYTE $00
DESTINATION_CODE BYTE $00
FIXED_VALUE1 BYTE $33
MASK_ROM_VERSION BYTE $00
COMPLEMENT_CHECK BYTE $00, $00
CHEKSUM BYTE $00, $00
;******************************************************************************
;*** SNES Interrupts and Reset vector ***
;******************************************************************************
VECTORS SECTION
; Native vector
N_COP DW DIRQ
N_BRK DW DIRQ
N_ABORT DW DIRQ
N_NMI DW NMI
N_RSRVD DW DIRQ
N_IRQ DW IRQ
DS 4
; Emulation vector
E_COP DW DIRQ
E_RSRVD DW DIRQ
E_ABORT DW DIRQ
E_NMI DW DIRQ
E_RESET DW START
E_IRQ DW DIRQ
END

37
snes/bankselect/crc.c Normal file
View File

@@ -0,0 +1,37 @@
#include "data.h"
word crc_update (char far *data, word size)
{
word i;
word j;
word crc=0;
for (j=0; j<size; j++){
crc = crc ^ ((word)data[j]<< 8);
for (i=0; i<8; i++){
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}
word crc_update_mem (unsigned long addr, word size)
{
word i;
word j;
word crc=0;
for (j=0; j<size; j++){
crc = crc ^ ((word) *(byte*)(addr+j)<< 8);
for (i=0; i<8; i++){
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}

4
snes/bankselect/crc.h Normal file
View File

@@ -0,0 +1,4 @@
word crc_update (byte *data, word size);
word crc_update_mem (unsigned long, word size);

2
snes/bankselect/data.h Normal file
View File

@@ -0,0 +1,2 @@
typedef unsigned char byte;
typedef unsigned short word;

60
snes/bankselect/debug.c Normal file
View File

@@ -0,0 +1,60 @@
#include "data.h"
#include "pad.h"
#include "PPU.h"
#include "ressource.h"
#include "crc.h"
word debugMap[0x400];
void initDebugMap(void) {
word i;
for(i=0; i<0x400; i++) {
debugMap[i] = 0x00;
}
}
char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
void int2hex(unsigned long number, char *buf,word size)
{
/*
long a;
for (a = 0; a < size; ++a) {
buf[a] = (i >> ((long)size * (2 * 2 - 1 - a))) & 0xf;
if (buf[a] < 10)
buf[a] += '0';
else
buf[a] += 'A' - 10;
}
*/
//buf[a] = 0;
unsigned long n;
unsigned char i;
//unsigned char x;
for (i = 0; i < size; i++) {
n = number >> 4;
//x = (number - (n << 4));
buf[size-i-1] = hex_chars[(number - (n << 4))];
number = n;
}
}
void writeln(char *buffer,word y){
char i;
waitForVBlank();
for(i=0; i<32; i++) {
waitForVBlank();
VRAMByteWrite((byte) (buffer[i]-32), (word) (0x4000+i+(y*0x20)));
}
}
void enableDebugScreen(void){
VRAMLoad((word) debugFont_pic, 0x5000, 2048);
CGRAMLoad((word) debugFont_pal, (byte) 0x00, (word) 16);
VRAMLoad((word) debugMap, 0x4000, 0x0800);
setTileMapLocation(0x4000, (byte) 0x00, (byte) 0);
setCharacterLocation(0x5000, (byte) 0);
*(byte*) 0x2100 = 0x0f; // enable background
}

5
snes/bankselect/debug.h Normal file
View File

@@ -0,0 +1,5 @@
void initDebugMap(void);
void debug(void);
void int2hex(unsigned long i, char *buf,word size);
void writeln(char* line,word y);
void enableDebugScreen(void);

101
snes/bankselect/event.c Normal file
View File

@@ -0,0 +1,101 @@
#include <stdlib.h>
#include "data.h";
#include "event.h";
event *events;
void initEvents(void) {
events = NULL;
}
event *createEvent(char (*callback)(word counter)) {
event *myEvent;
myEvent = (event*) malloc(sizeof(event));
myEvent->VBlankCount = 0;
myEvent->callback = callback;
myEvent->nextEvent = NULL;
myEvent->previousEvent = NULL;
return myEvent;
}
event* addEvent(char (*callback)(word counter), int noDuplicateCallback) {
event *lastEvent;
event *myEvent;
if(events == NULL) {
events = createEvent(callback);
return events;
} else {
lastEvent = events;
// TODO optimise this with noduplicate
while(lastEvent->nextEvent != NULL) {
if(noDuplicateCallback == 1 && lastEvent->callback == *callback) {
return NULL;
}
lastEvent = lastEvent->nextEvent;
}
if(noDuplicateCallback == 1 && lastEvent->callback == *callback) {
return NULL;
}
myEvent = createEvent(callback);
myEvent->previousEvent = lastEvent;
lastEvent->nextEvent = myEvent;
return myEvent;
}
}
void removeEvent(event *eventElement) {
byte alone = 0;
event *next, *previous;
next = eventElement->nextEvent;
previous = eventElement->previousEvent;
if(eventElement->nextEvent != NULL && eventElement->previousEvent != NULL) {
alone++;
next->previousEvent = previous;
previous->nextEvent = next;
} else if(eventElement->nextEvent != NULL) {
alone++;
next->previousEvent = NULL;
events = next;
} else if(eventElement->previousEvent != NULL) {
alone++;
previous->nextEvent = NULL;
}
free(eventElement);
if(alone == 0) {
events = NULL;
}
}
void processEvents(void) {
event *currentEvent;
char returnValue;
currentEvent = events;
while(currentEvent != NULL) {
returnValue = currentEvent->callback(currentEvent->VBlankCount);
if(returnValue == EVENT_CONTINUE) {
currentEvent->VBlankCount++;
} else {
removeEvent(currentEvent);
}
currentEvent = currentEvent->nextEvent;
}
}

16
snes/bankselect/event.h Normal file
View File

@@ -0,0 +1,16 @@
typedef struct event{
word VBlankCount;
char (*callback)(word counter);
struct event *previousEvent;
struct event *nextEvent;
} event;
#define EVENT_STOP 0
#define EVENT_CONTINUE 1
extern event *events;
void initEvents(void);
extern event* addEvent(char (*callback)(word counter), int noDuplicateCallback);
extern void removeEvent(event *eventElement);
extern void processEvents(void);

10
snes/bankselect/hex.py Normal file
View File

@@ -0,0 +1,10 @@
number=0xffaaee
size = 6
print hex(number)
for i in range(0,size):
n = number >> 4;
print size-i-1, hex(number - (n << 4));
number = n;

71
snes/bankselect/main.c Normal file
View File

@@ -0,0 +1,71 @@
#include "data.h";
#include "pad.h";
#include "event.h";
#include "myEvents.h";
#include "ressource.h";
#include "PPU.h"
#include "debug.h"
#include "crc.h"
#include <stdlib.h>
padStatus pad1;
void initInternalRegisters(void) {
characterLocation[0] = 0x0000;
characterLocation[1] = 0x0000;
characterLocation[2] = 0x0000;
characterLocation[3] = 0x0000;
initDebugMap();
}
void preInit(void) {
// For testing purpose ...
// Insert code here to be executed before register init
}
void main(void) {
word i,j;
word crc01;
word crc02;
padStatus pad1; //012345678901234567890123456789012
char line_header[32] = "BANK ADDR VAL 123456789ABCDEF";
char line[32] = " ";
char space;
unsigned long addr;
initInternalRegisters();
*(byte*) 0x2105 = 0x01; // MODE 1 value
*(byte*) 0x212c = 0x01; // Plane 0 (bit one) enable register
*(byte*) 0x212d = 0x00; // All subPlane disable
*(byte*) 0x2100 = 0x0f; // enable background
enablePad();
enableDebugScreen();
writeln(line_header,0);
while(1){
addr = 0x018000;
for(j=1; j<16; j++) {
int2hex((unsigned long)j,&line[0],4);
int2hex((unsigned long)addr,&line[5],6);
int2hex((unsigned long)*(byte*)addr,&line[12],4);
writeln(line,j+1);
addr+= 0x010000;
pad1 = readPad((byte) 0);
while(!pad1.start) {
//waitForVBlank();
pad1 = readPad((byte) 0);
}
}
}
while(1);
}
void IRQHandler(void) {
}
void NMIHandler(void) {
//processEvents();
}

View File

@@ -0,0 +1,97 @@
#include "data.h";
#include "pad.h";
#include "event.h";
extern padStatus pad1;
extern word scrollValue;
char fadeOut(word counter) {
static byte fadeOutValue;
if(counter == 0) {
// init fade value
fadeOutValue = 0x0f;
} else {
fadeOutValue--;
}
*(byte*) 0x2100 = fadeOutValue;
if(fadeOutValue == 0x00) {
return EVENT_STOP;
} else {
return EVENT_CONTINUE;
}
}
char fadeIn(word counter) {
static byte fadeInValue;
if(counter == 0) {
// init fade value
fadeInValue = 0x00;
} else {
fadeInValue++;
}
*(byte*) 0x2100 = fadeInValue;
if(fadeInValue >= 0x0f) {
return EVENT_STOP;
} else {
return EVENT_CONTINUE;
}
}
char mosaicOut(word counter) {
static byte mosaicOutValue;
if(counter == 0) {
// init fade value
mosaicOutValue = 0xff;
} else {
mosaicOutValue -= 0x10;
}
*(byte*) 0x2106 = mosaicOutValue;
if(mosaicOutValue == 0x0f) {
return EVENT_STOP;
} else {
return EVENT_CONTINUE;
}
}
char mosaicIn(word counter) {
static byte mosaicInValue;
if(counter == 0) {
// init fade value
mosaicInValue = 0x0f;
} else {
mosaicInValue += 0x10;
}
*(byte*) 0x2106 = mosaicInValue;
if(mosaicInValue == 0xff) {
return EVENT_STOP;
} else {
return EVENT_CONTINUE;
}
}
char NMIReadPad(word counter) {
pad1 = readPad((byte) 0);
return EVENT_CONTINUE;
}
char scrollLeft(word counter) {
scrollValue++;
*(byte*) 0x210d = (byte) scrollValue;
*(byte*) 0x210d = (byte) (scrollValue>>8);
return EVENT_CONTINUE;
}

View File

@@ -0,0 +1,6 @@
char fadeOut(word counter);
char fadeIn(word counter);
char mosaicOut(word counter);
char mosaicIn(word counter);
char NMIReadPad(word counter);
char scrollLeft(word counter);

17
snes/bankselect/pad.c Normal file
View File

@@ -0,0 +1,17 @@
#include "data.h";
#include "pad.h";
void enablePad(void) {
// Enable pad reading and NMI
*(byte*)0x4200 = 0x81;
}
padStatus readPad(byte padNumber) {
word test;
padStatus *status;
padNumber = padNumber << 1;
test = (word) *(byte*)0x4218+padNumber << 8;
test |= (word) *(byte*)0x4219+padNumber;
status = (padStatus *) &test;
return *status;
}

19
snes/bankselect/pad.h Normal file
View File

@@ -0,0 +1,19 @@
typedef struct padStatus{
byte right:1;
byte left:1;
byte down:1;
byte up:1;
byte start:1; // Enter
byte select:1; // Space
byte Y:1; // X
byte B:1; // C
//--------------------------------
byte Dummy:4;
byte R:1; // Z
byte L:1; // A
byte X:1; // S
byte A:1; // D
} padStatus;
extern void enablePad(void);
extern padStatus readPad(byte padNumber);

View File

@@ -0,0 +1,23 @@
ressource .section
; XDEF __title_map
;__title_map:
; INSERT ressource/kungfu.map
;
; XDEF __title_pic
;__title_pic:
; INSERT ressource/kungfu.pic
;
; XDEF __title_pal
;__title_pal:
;make INSERT ressource/kungfu.clr
XDEF _~debugFont_pic
_~debugFont_pic
INSERT ressource/debugFont.pic
XDEF _~debugFont_pal
_~debugFont_pal
INSERT ressource/debugFont.clr
.ends

View File

@@ -0,0 +1,3 @@
extern word debugFont_pic[];
extern word debugFont_pal[];

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,143 @@
;============================================================================
; Macros
;============================================================================
;============================================================================
;LoadPalette - Macro that loads palette information into CGRAM
;----------------------------------------------------------------------------
; In: SRC_ADDR -- 24 bit address of source data,
; START -- Color # to start on,
; SIZE -- # of COLORS to copy
;----------------------------------------------------------------------------
; Out: None
;----------------------------------------------------------------------------
; Modifies: A,X
; Requires: mem/A = 8 bit, X/Y = 16 bit
;----------------------------------------------------------------------------
.MACRO LoadPalette
lda #\2
sta $2121 ; Start at START color
lda #:\1 ; Using : before the parameter gets its bank.
ldx #\1 ; Not using : gets the offset address.
ldy #(\3 * 2) ; 2 bytes for every color
jsr DMAPalette
.ENDM
;============================================================================
; LoadBlockToVRAM -- Macro that simplifies calling LoadVRAM to copy data to VRAM
;----------------------------------------------------------------------------
; In: SRC_ADDR -- 24 bit address of source data
; DEST -- VRAM address to write to (WORD address!!)
; SIZE -- number of BYTEs to copy
;----------------------------------------------------------------------------
; Out: None
;----------------------------------------------------------------------------
; Modifies: A, X, Y
;----------------------------------------------------------------------------
;LoadBlockToVRAM SRC_ADDRESS, DEST, SIZE
; requires: mem/A = 8 bit, X/Y = 16 bit
.MACRO LoadBlockToVRAM
lda #$80
sta $2115
ldx #\2 ; DEST
stx $2116 ; $2116: Word address for accessing VRAM.
lda #:\1 ; SRCBANK
ldx #\1 ; SRCOFFSET
ldy #\3 ; SIZE
jsr LoadVRAM
.ENDM
;============================================================================
; Routines
;============================================================================
.BANK 0
.ORG 0
.SECTION "LoadVRAMCode" SEMIFREE
;============================================================================
; LoadVRAM -- Load data into VRAM
;----------------------------------------------------------------------------
; In: A:X -- points to the data
; Y -- Number of bytes to copy (0 to 65535) (assumes 16-bit index)
;----------------------------------------------------------------------------
; Out: None
;----------------------------------------------------------------------------
; Modifies: none
;----------------------------------------------------------------------------
; Notes: Assumes VRAM address has been previously set!!
;----------------------------------------------------------------------------
LoadVRAM:
pha
phx
phy
phb
php ; Preserve Registers
sep #$20
stx $4302 ; Store Data offset into DMA source offset
sta $4304 ; Store data Bank into DMA source bank
sty $4305 ; Store size of data block
lda #$01
sta $4300 ; Set DMA mode (word, normal increment)
lda #$18 ; Set the destination register (VRAM write register)
sta $4301
lda #$01 ; Initiate DMA transfer (channel 1)
sta $420B
plp ; restore registers
plb
ply
plx
pla
rts ; return
;============================================================================
.ENDS
.BANK 0
.ORG 0
.SECTION "DMAPaletteCode" SEMIFREE
;============================================================================
; DMAPalette -- Load entire palette using DMA
;----------------------------------------------------------------------------
; In: A:X -- points to the data
; Y -- Size of data
;----------------------------------------------------------------------------
; Out: None
;----------------------------------------------------------------------------
; Modifies: none
;----------------------------------------------------------------------------
DMAPalette:
pha
phx
phb
php ; Preserve Registers
sep #$20
stx $4302 ; Store data offset into DMA source offset
sta $4304 ; Store data bank into DMA source bank
sty $4305 ; Store size of data block
stz $4300 ; Set DMA Mode (byte, normal increment)
lda #$22 ; Set destination register ($2122 - CGRAM Write)
sta $4301
lda #$01 ; Initiate DMA transfer
sta $420B
plp ; Restore registers
plb
plx
pla
rts ; return from subroutine
;============================================================================
.ENDS

33
snes/banktest/Makefile Normal file
View File

@@ -0,0 +1,33 @@
#wla-65816 -o %1.asm %1.obj
#wlalink -vr temp.prj %1.smc
AS=wla-65816
LD=wlalink
OBJS=vram2.o
APP=vram2.smc
GFX=
all: clean $(APP)
run:
zsnes $(APP)
linkfile:
echo "[objects]" > linkerfile.prj
optixx.inc: optixx.pcx
wine tools/pcx2snes.exe optixx.pcx -b2 -nOptixx -ooptixx.inc
%.o: %.asm
echo "$@" >> linkerfile.prj
$(AS) -o $? $@
$(APP): linkfile $(GFX) $(OBJS) $(GFX)
$(LD) -vr linkerfile.prj $@
clean:
rm -vf $(APP) *.prj *.o

61
snes/banktest/header.inc Normal file
View File

@@ -0,0 +1,61 @@
;------------------------------ Header File ---------------------------------
; This is basically a combo of MarctheMER's and Neviksti's header files
; Perhaps reading their's will also help your understanding of the header,
; but I believe this will be the simplest method of defining your header,
; as Marc's doesn't provide a full explanation, and Neviksti's can be
; a bit more difficult for beginners (using the WLA directives is easier).
;----------------------------------------------------------------------------
;==LoRom== ; We'll get to HiRom some other time.
.MEMORYMAP ; Begin describing the system architecture.
SLOTSIZE $8000 ; The slot is $8000 bytes in size. More details on slots later.
DEFAULTSLOT 0 ; There's only 1 slot in SNES, there are more in other consoles.
SLOT 0 $8000 ; Define's Slot 0's starting address.
.ENDME ; End MemoryMap definition
.ROMBANKSIZE $8000 ; Every ROM bank is 32 KBytes in size
.ROMBANKS 8 ; 2 Mbits - Tell WLA we want to use 8 ROM Banks
.SNESHEADER
ID "SNES" ; 1-4 letter string, just leave it as "SNES"
NAME "SNES Tile Demo " ; Program Title - can't be over 21 bytes,
; "123456789012345678901" ; use spaces for unused bytes of the name.
SLOWROM
LOROM
CARTRIDGETYPE $00 ; $00 = ROM only, see WLA documentation for others
ROMSIZE $08 ; $08 = 2 Mbits, see WLA doc for more..
SRAMSIZE $00 ; No SRAM see WLA doc for more..
COUNTRY $01 ; $01 = U.S. $00 = Japan, that's all I know
LICENSEECODE $00 ; Just use $00
VERSION $00 ; $00 = 1.00, $01 = 1.01, etc.
.ENDSNES
.SNESNATIVEVECTOR ; Define Native Mode interrupt vector table
COP EmptyHandler
BRK EmptyHandler
ABORT EmptyHandler
NMI EmptyHandler
IRQ EmptyHandler
.ENDNATIVEVECTOR
.SNESEMUVECTOR ; Define Emulation Mode interrupt vector table
COP EmptyHandler
ABORT EmptyHandler
NMI EmptyHandler
RESET Start
IRQBRK EmptyHandler
.ENDEMUVECTOR
.BANK 0 SLOT 0 ; Defines the ROM bank and the slot it is inserted in memory.
.ORG 0 ; .ORG 0 is really $8000, because the slot starts at $8000
.SECTION "EmptyVectors" SEMIFREE
EmptyHandler:
rti
.ENDS
.EMPTYFILL $00

262
snes/banktest/init.inc Normal file
View File

@@ -0,0 +1,262 @@
;------------------------------------------------------------------------
;- Written by: Neviksti
;- If you use my code, please share your creations with me
;- as I am always curious :)
;------------------------------------------------------------------------
;----------------------------------------------------------------------------
; InitSNES -- my "standard" initialization of SNES memory and registers
;----------------------------------------------------------------------------
.MACRO InitSNES
sei ;disable interrupts
clc ;switch to native mode
xce
REP #$38 ; mem/A = 16 bit, X/Y = 16 bit
;decimal mode off
LDX #$1FFF ;Setup the stack
TXS ;Transfer Index X to Stack Pointer Register
;do the rest of the initialization in a routine
JSL $008000
SEP #$20 ; mem/A = 8 bit
.ENDM
;----------------------------------------------------------------------------
.BANK 0 SLOT 0
.ORG 0
.SECTION "InitializeSNESCode" FORCE
InitializeSNES:
PHK ;set Data Bank = Program Bank
PLB
LDA #$0000 ;set Direct Page = $0000
TCD ;Transfer Accumulator to Direct Register
LDX $1FFD ;we clear all the mem at one point ...
STX $4372 ;so save the return address in a place that won't get overwritten
LDX $1FFF
STX $4374
SEP #$20 ; mem/A = 8 bit
REP #$10
LDA #$8F
STA $2100 ;turn screen off for now, set brightness to normal
LDX #$2101
_Loop00: ;regs $2101-$210C
STZ $00,X ;set Sprite,Character,Tile sizes to lowest, and set addresses to $0000
INX
CPX #$210D
BNE _Loop00
_Loop01: ;regs $210D-$2114
STZ $00,X ;Set all BG scroll values to $0000
STZ $00,X
INX
CPX #$2115
BNE _Loop01
LDA #$80 ;reg $2115
STA $2115 ; Initialize VRAM transfer mode to word-access, increment by 1
STZ $2116 ;regs $2117-$2117
STZ $2117 ;VRAM address = $0000
;reg $2118-$2119
;VRAM write register... don't need to initialize
STZ $211A ;clear Mode7 setting
LDX #$211B
_Loop02: ;regs $211B-$2120
STZ $00,X ;clear out the Mode7 matrix values
STZ $00,X
INX
CPX #$2121
BNE _Loop02
;reg $2121 - Color address, doesn't need initilaizing
;reg $2122 - Color data, is initialized later
LDX #$2123
_Loop03: ;regs $2123-$2133
STZ $00,X ;turn off windows, main screens, sub screens, color addition,
INX ;fixed color = $00, no super-impose (external synchronization),
CPX #$2134 ;no interlaced mode, normal resolution
BNE _Loop03
;regs $2134-$2136 - multiplication result, no initialization needed
;reg $2137 - software H/V latch, no initialization needed
;reg $2138 - Sprite data read, no initialization needed
;regs $2139-$213A - VRAM data read, no initialization needed
;reg $213B - Color RAM data read, no initialization needed
;regs $213C-$213D - H/V latched data read, no initialization needed
STZ $213E ;reg $213E - might not be necesary, but selects PPU master/slave mode
;reg $213F - PPU status flag, no initialization needed
;reg $2140-$2143 - APU communication regs, no initialization required
;reg $2180 - read/write WRAM register, no initialization required
;reg $2181-$2183 - WRAM address, no initialization required
;reg $4016-$4017 - serial JoyPad read registers, no need to initialize
STZ $4200 ;reg $4200 - disable timers, NMI,and auto-joyread
LDA #$FF
STA $4201 ;reg $4201 - programmable I/O write port, initalize to allow reading at in-port
;regs $4202-$4203 - multiplication registers, no initialization required
;regs $4204-$4206 - division registers, no initialization required
;regs $4207-$4208 - Horizontal-IRQ timer setting, since we disabled this, it is OK to not init
;regs $4209-$420A - Vertical-IRQ timer setting, since we disabled this, it is OK to not init
STZ $420B ;reg $420B - turn off all general DMA channels
STZ $420C ;reg $420C - turn off all H-MA channels
STZ $420D ;reg $420D - ROM access time to slow (2.68Mhz)
LDA $4210 ;reg $4210 - NMI status, reading resets
;reg $4211 - IRQ status, no need to initialize
;reg $4212 - H/V blank and JoyRead status, no need to initialize
;reg $4213 - programmable I/O inport, no need to initialize
;reg $4214-$4215 - divide results, no need to initialize
;reg $4216-$4217 - multiplication or remainder results, no need to initialize
;regs $4218-$421f - JoyPad read registers, no need to initialize
;regs $4300-$437F
;no need to intialize because DMA was disabled above
;also, we're not sure what all of the registers do, so it is better to leave them at
;their reset state value
JSR ClearVRAM ;Reset VRAM
JSR ClearPalette ;Reset colors
;**** clear Sprite tables ********
STZ $2102 ;sprites initialized to be off the screen, palette 0, character 0
STZ $2103
LDX #$0080
LDA #$F0
_Loop08:
STA $2104 ;set X = 240
STA $2104 ;set Y = 240
STZ $2104 ;set character = $00
STZ $2104 ;set priority=0, no flips
DEX
BNE _Loop08
LDX #$0020
_Loop09:
STZ $2104 ;set size bit=0, x MSB = 0
DEX
BNE _Loop09
;**** clear WRAM ********
STZ $2181 ;set WRAM address to $000000
STZ $2182
STZ $2183
LDX #$8008
STX $4300 ;Set DMA mode to fixed source, BYTE to $2180
LDX #wram_fill_byte
STX $4302 ;Set source offset
LDA #:wram_fill_byte
STA $4304 ;Set source bank
LDX #$0000
STX $4305 ;Set transfer size to 64k bytes
LDA #$01
STA $420B ;Initiate transfer
LDA #$01 ;now set the next 64k bytes
STA $420B ;Initiate transfer
PHK ;make sure Data Bank = Program Bank
PLB
CLI ;enable interrupts again
LDX $4372 ;get our return address...
STX $1FFD
LDA $4374
STA $1FFF
RTL
wram_fill_byte:
.db $00
;----------------------------------------------------------------------------
; ClearVRAM -- Sets every byte of VRAM to zero
; In: None
; Out: None
; Modifies: flags
;----------------------------------------------------------------------------
ClearVRAM:
pha
phx
php
REP #$30 ; mem/A = 8 bit, X/Y = 16 bit
SEP #$20
LDA #$80
STA $2115 ;Set VRAM port to word access
LDX #$1809
STX $4300 ;Set DMA mode to fixed source, WORD to $2118/9
LDX #$0000
STX $2116 ;Set VRAM port address to $0000
STX $0000 ;Set $00:0000 to $0000 (assumes scratchpad ram)
STX $4302 ;Set source address to $xx:0000
LDA #$00
STA $4304 ;Set source bank to $00
LDX #$FFFF
STX $4305 ;Set transfer size to 64k-1 bytes
LDA #$01
STA $420B ;Initiate transfer
STZ $2119 ;clear the last byte of the VRAM
plp
plx
pla
RTS
;----------------------------------------------------------------------------
; ClearPalette -- Reset all palette colors to zero
; In: None
; Out: None
; Modifies: flags
;----------------------------------------------------------------------------
ClearPalette:
PHX
PHP
REP #$30 ; mem/A = 8 bit, X/Y = 16 bit
SEP #$20
STZ $2121
LDX #$0100
ClearPaletteLoop:
STZ $2122
STZ $2122
DEX
BNE ClearPaletteLoop
PLP
PLX
RTS
.ENDS

969
snes/banktest/optixx.inc Normal file
View File

@@ -0,0 +1,969 @@
; Created with eKid's pcx2snes converter ;
OptixxData:
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $F8, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $F8, $00, $E0, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $FE, $00, $80, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $FA, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $06, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $2F, $00, $01, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $3F, $00, $07, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FC, $00
.db $FF, $00, $FF, $00, $FE, $00, $F8, $00, $E0, $00, $80, $00, $00, $00, $00, $00
.db $E0, $00, $80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $3F, $00, $07, $00, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $7F, $00, $3F, $00, $0F, $00, $07, $00, $01, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FC, $00, $F8, $00, $F0, $00
.db $F8, $00, $E0, $00, $C0, $00, $80, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $3F, $00, $1F, $00, $0F, $00, $07, $00, $01, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $7F, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FE, $00, $FE, $00, $FC, $00, $F8, $00
.db $E0, $00, $C0, $00, $80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $3F, $00, $1F, $00, $0F, $00, $07, $00, $03, $00, $03, $00, $01, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FE, $00
.db $F0, $00, $E0, $00, $C0, $00, $C0, $00, $80, $00, $80, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $7F, $00, $3F, $00, $3F, $00, $1F, $00, $0F, $00, $07, $00, $07, $00, $03, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FE, $00, $FC, $00, $FC, $00, $F8, $00, $F0, $00, $F0, $00, $F0, $00, $E0, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $03, $00, $01, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $7F, $00, $7F, $00, $3F, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $E0, $00, $C0, $00, $C0, $00, $C0, $00, $80, $00, $80, $00, $80, $00, $80, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $3F, $00, $1F, $00, $1F, $00, $1F, $00, $0F, $00, $0F, $00, $0F, $00, $0F, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FE, $00, $FE, $00, $FE, $00, $FE, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $07, $00, $07, $00, $07, $00, $03, $00, $03, $00, $03, $00, $03, $00, $03, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FE, $00, $FC, $00, $FC, $00, $FE, $00, $FC, $00, $FC, $00, $FC, $00, $FC, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $03, $00, $01, $00, $01, $00, $03, $00, $01, $00, $01, $00, $01, $00, $01, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FC, $00, $FC, $00, $FC, $00, $FC, $00, $FC, $00, $FC, $00, $FE, $00, $FC, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $01, $00, $01, $00, $01, $00, $01, $00, $01, $00, $03, $00, $01, $00, $01, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FE, $00, $FE, $00, $FE, $00, $FE, $00, $FE, $00, $FE, $00, $FE, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $03, $00, $03, $00, $03, $00, $03, $00, $03, $00, $03, $00, $03, $00, $07, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $80, $00, $80, $00, $80, $00, $80, $00, $C0, $00, $C0, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $07, $00, $07, $00, $07, $00, $0F, $00, $0F, $00, $0F, $00, $1F, $00, $1F, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $E0, $00, $E0, $00, $E0, $00, $E0, $00, $F0, $00, $F8, $00, $F8, $00, $FC, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00
.db $3F, $00, $3F, $00, $3F, $00, $7F, $00, $7F, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FC, $00, $FE, $00, $FE, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $00, $C0, $00, $E0, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $01, $00, $03, $00, $03, $00, $07, $00, $0F, $00, $0F, $00, $1F, $00, $3F, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $E0, $00, $F0, $00, $F8, $00, $FC, $00, $FE, $00, $FE, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $01, $00, $03, $00, $03, $00, $07, $00, $0F, $00
.db $3F, $00, $7F, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $C0, $00, $E0, $00, $F0, $00, $F8, $00, $FE, $00, $FE, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $00, $C0, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $07, $00, $0F, $00, $1F, $00
.db $1F, $00, $3F, $00, $7F, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $E0, $00, $F8, $00, $FC, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $80, $00, $E0, $00, $F8, $00, $FE, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $03, $00
.db $00, $00, $00, $00, $01, $00, $07, $00, $0F, $00, $3F, $00, $FF, $00, $FF, $00
.db $3F, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $80, $00, $E0, $00, $F8, $00, $FE, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $E0, $00, $FC, $00, $FF, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $80, $00, $FC, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $1F, $00, $FF, $00
.db $00, $00, $00, $00, $00, $00, $07, $00, $3F, $00, $FF, $00, $FF, $00, $FF, $00
.db $07, $00, $3F, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FD, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $00, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $05, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
.db $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00, $FF, $00
OptixxPalette:
.db $00, $00, $10, $42, $00, $00, $00, $00
; 960 tiles (0 spaces)
; 15360 bytes

BIN
snes/banktest/optixx.pcx Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,39 @@
+----------------+
| pcx2snes (win) |
+----------------+
v1.1
by eKid
to make the snes life a little easier
how it's used...
1. Run the program.
2. Click Import .PCX to load a pcx file.
3. Image should display in top-left corner.
4. (Optional) Swap around the colors in the palette by left clicking to select, and right clicking to swap.
5. Select Bit-Depth for export and set tile size (bottom left corner).
6. Click Export .inc and choose a filename to export to.
7. Your Done!
------------------------
Command Line mode
Usage:
pcx2snes in.pcx [-oOut.inc] [-bBits] [-nName] [-d (16x16)] [-sColor]
-parameters in brackets are all optional
-there must be no space between the prefix and value
Parameter Description:
-o Specifies file to output to, if not supplied it will use the input file with a ".inc" extension.
-b Specifies bit depth, can be 2/4/8 for 4/16/256 colors, if not supplied it will use the bit depth of the PCX.
-n Specifies name to use as a prefix of the exported array, default is "Untitled".
-s Specifies an index to swap color 0 with, this is optional (mainly for transparency).
-d Tells pcx2snes to arrange for 16x16 mode.
------------------------
Questions/Comments/BUGS can be sent to mukunda51@hotmail.com, or you can find me on EFNet IRC - #snesdev as eKid!

94
snes/banktest/vram2.asm Normal file
View File

@@ -0,0 +1,94 @@
;============================================================================
; Includes
;============================================================================
;== Include MemoryMap, Vector Table, and HeaderInfo ==
.INCLUDE "header.inc"
;== Include SNES Initialization routines ==
.INCLUDE "init.inc"
.INCLUDE "LoadGraphics.asm"
;============================================================================
; Main Code
;============================================================================
.BANK 0 SLOT 0
.ORG 0
.SECTION "MainCode"
Start:
InitSNES ; Clear registers, etc.
; Load Palette for our tiles
LoadPalette OptixxPalette, 0, 16
; Load Tile data to VRAM
;LoadBlockToVRAM TilesData, $0000, $0020 ; 2 tiles, 2bpp, = 32 bytes
;LoadBlockToVRAM OptixxData, $0000, 0xa00 ; 160 tiles, 2bpp, = 2560 bytes
;LoadBlockToVRAM OptixxData, $0000, 0x1e00 ; 480 tiles, 2bpp, = 7680 bytes
LoadBlockToVRAM OptixxData, $0000, 0x3c00 ; 960 tiles, 2bpp, = 15360 bytes
lda #$80
sta $2115
;ldx #$0800 ; 5AF
ldx #$4000 ; 5AF
stx $2116
ldx #$0
Start_do:
stx $2118
inx
cpx #960
bne Start_do
; Setup Video modes and other stuff, then turn on the screen
jsr SetupVideo
Infinity:
jmp Infinity ; bwa hahahahaha
;============================================================================
; SetupVideo -- Sets up the video mode and tile-related registers
;----------------------------------------------------------------------------
; In: None
;----------------------------------------------------------------------------
; Out: None
;----------------------------------------------------------------------------
SetupVideo:
php
lda #$00
sta $2105 ; Set Video mode 0, 8x8 tiles, 4 color BG1/BG2/BG3/BG4
;lda #$08 ; Set BG1's Tile Map offset to $0800 (Word address)
lda #$40 ; Set BG1's Tile Map offset to $2000 (Word address)
sta $2107 ; And the Tile Map size to 32x32
stz $210B ; Set BG1's Character VRAM offset to $0000 (word address)
lda #$01 ; Enable BG1
sta $212C
lda #$FF
sta $210E
sta $210E
lda #$0F
sta $2100 ; Turn on screen, full Brightness
plp
rts
;============================================================================
.ENDS
;============================================================================
; Character Data
;============================================================================
.BANK 0 SLOT 0
.SECTION "CharacterData02"
.INCLUDE "optixx.inc"
.ENDS

93
snes/crc/Makefile Normal file
View File

@@ -0,0 +1,93 @@
# SDK Config
PLATFORM=mac
ifeq ($(PLATFORM),linux)
# Linux Wine
SDK=/home/david/.wine/drive_c/65xx_FreeSDK
WINE=wine
EMU=zsnes
EMU_DEBUG=/home/david/Devel/arch/snes/tools/zsnes_linux_debug151/src/zsnesd -d
else
# Mac Wine
SDK=/Users/david/.wine/drive_c/65xx_FreeSDK
WINE=wine
EMU=zsnes
endif
CC=$(WINE) $(SDK)/bin/WDC816CC.exe
AS=$(WINE) $(SDK)/bin/WDC816AS.exe
LD=$(WINE) $(SDK)/bin/WDCLN.exe
PADBIN=$(WINE) tools/padbin.exe
PCX2SNES=$(WINE) tools/Pcx2Snes.exe
# Project
INC=$(SDK)/include
LIBS=$(SDK)/lib/cc
#OBJS=StartupSnes.obj main.obj pad.obj event.obj myEvents.obj PPU.obj debug.obj ressource.obj
OBJS=StartupSnes.obj main.obj pad.obj PPU.obj debug.obj ressource.obj crc.obj
APP=crc.smc
GFX=kungfu debugfont
all: $(APP)
run:
$(EMU) $(APP)
debugger:
$(EMU_DEBUG) $(APP)
upload:
ucon64 -chk $(APP)
cp -rv $(APP) /Volumes/SNES
sync
diskutil unmount /Volumes/SNES
rand:
dd if=/dev/urandom of=tmp.rand bs=32k count=6
dd if=$(APP) of=tmp.app bs=32k count=2
cat tmp.app tmp.rand > $(APP)
rm tmp.rand tmp.app
ucon64 -chk $(APP)
rand16:
dd if=/dev/urandom of=tmp.rand bs=32k count=14
dd if=$(APP) of=tmp.app bs=32k count=2
cat tmp.app tmp.rand > $(APP)
rm tmp.rand tmp.app
ucon64 -chk $(APP)
crc:
python ../../scripts/crc_xmodem.py $(APP)
kungfu:
$(PCX2SNES) ressource/kungfu -n -c16 -screen
debugfont:
$(PCX2SNES) ressource/debugFont -n -c16 -s8 -o1
StartupSnes.obj: StartupSnes.asm
$(AS) -V $?
ressource.obj: ressource.asm
$(AS) -V $?
%.obj: %.c
$(CC) -wl -wp -sop -MC -I $(INC) $?
$(APP): $(OBJS)
$(LD) -HB -M21 -V -T -Pff \
-C008000,0000 -U0000,0000 \
-Avectors=FFE4,7FE4 \
-Aregistration_data=FFB0,7FB0 \
-Aressource=18000,8000 \
-N $(OBJS) -L$(LIBS) -O $@
$(PADBIN) 0x40000 $(APP)
clean:
rm -vf $(APP) *.obj

Some files were not shown because too many files have changed in this diff Show More