forked from Apple-2-HW/arduino-appleii
42 lines
1.3 KiB
Arduino
42 lines
1.3 KiB
Arduino
|
// squash all the modes for this demo
|
||
|
unsigned char appleToGhettoVGA(unsigned char apple) {
|
||
|
if(apple >= 0xC0) return apple-0x40;
|
||
|
else return apple&0x7F;
|
||
|
}
|
||
|
|
||
|
// Squash into normal mode
|
||
|
unsigned char ghettoVGAToApple(unsigned char ghettoVga) {
|
||
|
if(ghettoVga >= 0x40 && ghettoVga <= 0x7f) return ghettoVga;
|
||
|
else return ghettoVga|0x80;
|
||
|
}
|
||
|
|
||
|
// Extract row, column addressing from woz's interlacing mode
|
||
|
static unsigned char g_row = 0, g_col = 0;
|
||
|
void decodeScreenAddress(unsigned short address) {
|
||
|
unsigned char block_of_lines = (address>>7) - 0x08;
|
||
|
unsigned char block_offset = (address&0x00FF) - ((block_of_lines&0x01) ? 0x80 : 0x00);
|
||
|
if(block_offset < 0x28) {
|
||
|
g_row = block_of_lines;
|
||
|
g_col = block_offset;
|
||
|
} else if(block_offset < 0x50) {
|
||
|
g_row = block_of_lines + 8;
|
||
|
g_col = block_offset-0x28;
|
||
|
} else {
|
||
|
g_row = block_of_lines + 16;
|
||
|
g_col = block_offset-0x50;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unsigned char screenRead(unsigned short address) {
|
||
|
//Find our row/column
|
||
|
decodeScreenAddress(address);
|
||
|
return ghettoVGAToApple(readCharacter(g_row, g_col));
|
||
|
}
|
||
|
|
||
|
void screenWrite(unsigned short address, unsigned char value) {
|
||
|
//Find our row/column
|
||
|
decodeScreenAddress(address);
|
||
|
// If not bell character
|
||
|
if(value != 0x87) writeCharacter(g_row, g_col, appleToGhettoVGA(value));
|
||
|
}
|