This commit is contained in:
Bjorn Einar Bjarntes 2021-12-18 21:00:31 +01:00
parent 772c294fee
commit ecedd8fd59
2 changed files with 92 additions and 59 deletions

View file

@ -50,3 +50,5 @@ https://github.com/empathicqubit/vscode-cc65-debugger/tree/master/src/__tests__/
https://archive.org/details/The_Graphics_Book_for_the_Commodore_64/page/n25/mode/2up https://archive.org/details/The_Graphics_Book_for_the_Commodore_64/page/n25/mode/2up
http://www.appleoldies.ca/cc65/docs/shr/shrworld.pd http://www.appleoldies.ca/cc65/docs/shr/shrworld.pd
https://archive.org/details/The_Graphics_Book_for_the_Commodore_64/page/n59

View file

@ -13,18 +13,17 @@
unsigned short i; unsigned short i;
unsigned short x; // maybe if the ant does not go tooo far it could be an int.. short x; // maybe if the ant does not go tooo far it could be an int..
BYTE y; short y;
BYTE direction; // 0 = right, 64 = up, 128 = left, 192 = down short direction; // 0 = right, 64 = up, 128 = left, 192 = down
void setAndClearHiRes(void) { void setHiRes(void) {
// Hi-res is turned on by setting bits 5 and 6 (bit 6 must be set in any event)
// of register 17 of the VIC and clearing bit 4 of register 22.
*(BYTE*)0xd011 = *(BYTE*)0xd011 | 0xb0 ; // Graphics on *(BYTE*)0xd011 = *(BYTE*)0xd011 | 0xb0 ; // Graphics on
*(BYTE*)0xd016 = *(BYTE*)0xd016 & 240; //Multi color off *(BYTE*)0xd016 = *(BYTE*)0xd016 & 240; //Multi color off
*(BYTE*)0xd018 = *(BYTE*)0xd018 | 8 ; // Graphics to $2000 *(BYTE*)0xd018 = *(BYTE*)0xd018 | 8 ; // Graphics to $2000
}
void clearHiRes(void) {
// Hi-res is turned on by setting bits 5 and 6 (bit 6 must be set in any event)
// of register 17 of the VIC and clearing bit 4 of register 22.
// Clear memory // Clear memory
for (i =0;i< 8000; i++) for (i =0;i< 8000; i++)
{ {
@ -34,84 +33,116 @@ void setAndClearHiRes(void) {
// Clear colors // Clear colors
for (i =0;i< 1000; i++) for (i =0;i< 1000; i++)
{ {
*(BYTE*)(0x400+i) = 0xF0; *(BYTE*)(0x400+i) = 0xf0;
} }
} }
int power2(int exponent) void fillHiRes(void) {
// Hi-res is turned on by setting bits 5 and 6 (bit 6 must be set in any event)
// of register 17 of the VIC and clearing bit 4 of register 22.
// Clear memory
for (i =0;i< 8000; i++)
{ {
int result=1; *(BYTE*)(0x2000+i) = 0xff;
for (exponent; exponent>0; exponent--)
{
result = result * 2;
} }
return result; }
void setAndClearHiRes(){
setHiRes();
clearHiRes();
} }
// need to think // need to think
BYTE isPositionBlack(unsigned short x, BYTE y) BYTE isPositionWhite(short x, short y)
{ {
unsigned short ra = (320 * (BYTE)(y/8)) + (y & 7); short ra = (320 * (short)(y/8)) + (y & 7);
unsigned short ba = 8 * (BYTE)(x/8); short ba = 8 * (short)(x/8);
unsigned short ma = 255 - power2((7-(x & 7))); short ma = 1 << ((7-(x & 7)));
unsigned short sa = 0x2000; short sa = 0x2000;
unsigned short ad = sa+ra+ba; short ad = sa+ra+ba;
return 1; return *(short*)(ad) & ma;
// return *(BYTE*)(ad) & ma;
} }
// https://archive.org/details/The_Graphics_Book_for_the_Commodore_64/page/n129/ // https://archive.org/details/The_Graphics_Book_for_the_Commodore_64/page/n129/
void setPositionWhite(unsigned short x, BYTE y) void setPositionWhite(short x, short y)
{ {
unsigned short ra = (320 * (BYTE)(y/8)) + (y & 7); short ra = (320 * (short)(y/8)) + (y & 7);
unsigned short ba = 8 * (BYTE)(x/8); short ba = 8 * (short)(x/8);
unsigned short ma = power2((7-(x & 7))); short ma = 1 << ((7-(x & 7)));
unsigned short sa = 0x2000; short sa = 0x2000;
unsigned short ad = sa+ra+ba; short ad = sa+ra+ba;
*(unsigned short*)(ad) = *(unsigned short*)(ad) | ma; *(short*)(ad) = *(short*)(ad) | ma;
} }
void setPositionBlack(unsigned short x, BYTE y) void setPositionBlack(unsigned short x, unsigned short y)
{ {
unsigned short ra = (320 * (BYTE)(y/8)) + (y & 7); short ra = (320 * (short)(y/8)) + (y & 7);
unsigned short ba = 8 * (BYTE)(x/8); short ba = 8 * (short)(x/8);
unsigned short ma = 255 - power2((7-(x & 7))); short ma = (1 << ((7-(x & 7))));
unsigned short sa = 0x2000; short sa = 0x2000;
unsigned short ad = sa+ra+ba; short ad = sa+ra+ba;
*(unsigned short*)(ad) = *(unsigned short*)(ad) & ma; *(short*)(ad) = (*(short*)(ad)) & ~ma;
} }
void makeMove() { void moveForward() {
if (isPositionBlack(x,y)) {
setPositionWhite(x,y);
direction = direction - 64;
} else {
setPositionBlack(x,y);
direction = direction + 64;
}
}
unsigned short line;
int main(void) {
x = 160;
y = 100;
direction = 0;
setAndClearHiRes();
while(1)
{
if (direction == 0) { if (direction == 0) {
x = x+1; x = x+1;
} else if (direction == 64) { } else if (direction == 64) {
y = y+1; y = y+1;
} else if (direction == 128) { } else if (direction == 128) {
x = x-1; x = x-1;
} else { } else if (direction == 192) {
y = y-1; y = y-1;
} }
}
void turnLeft(){
direction = direction + 64;
if (direction >= 255)
direction = 0;
}
void turnRight(){
direction = direction - 64;
if (direction <0)
direction = 192;
}
void makeMove() {
if (isPositionWhite(x,y)) {
turnRight();
setPositionBlack(x,y);
} else {
turnLeft();
setPositionWhite(x,y);
}
moveForward();
}
unsigned short line;
unsigned short foo;
unsigned short j;
int main(void) {
setAndClearHiRes();
for (i = 0;i<50;i++){
for (j= 0;j<50;j++){
setPositionWhite(i,j);
}
}
for (i = 0;i<50;i++){
for (j= 0;j<50;j++){
setPositionBlack(i,j);
}
}
x = 160;
y = 100;
direction = 0;
while(1)
{
makeMove(); makeMove();
} }