For fun, I created an icon pack based on the popular Bitcoin logo in Adobe Illustrator.
As I actually managed to finish it, I figured, what the hell, and converted it to a variety of formats as well.

In this pack, you’ll find:

PNG’s in 16, 32, 48, 128 and 256px resolutions.
ICO’s containing all the PNG resolution in two versions: One compressed PNG, one just regular PNG’s.
favicon versions.
SVG for all your open format needs.
EPS and AI for all your Adobe needs.

I also made a pixel-art version in 16px resolution, just for fun.

It is available for download here (1.82 MiB).

 

If you found this pack useful, why not send me some chump-change here:

 17tudgQA8uBnAnZJ8pygfKh3B1a8we6dRe

July 11, 2012 Posted by | Main Page | Comments Off


Lately I’ve been working on reading the CF card contents on the PowerPak. I thought I’d share my findings so far.

This post is just to publish a few of my notes on reading the CF card contents on the PowerPak on the NES.

The information was gained from disassembling and reverse-engineering the PowerPak boot ROM, thus it’s incomplete. At this point, I’m only able to read sectors; Not write.

The PowerPak boot ROM used was obtained from the PowerPak Mappers v1.34 archive found on RetroZone‘s site.

;---------------------------------------------------------------- 
; Notes
;---------------------------------------------------------------- 
;
; Reading from $5007 will return the status of the CF card
; 	0xFF - No card inserted
; 	0x80 - Card busy[1]
; 	0x58 - Card busy[1]
; 	0x50 - Unknown
; 	0x01 - Fatal card read error
;
; Reading form $5001 - Unknown
;
; Reading from $5000 - Read bytes from sector
;
; Writing to $5402
;   0x01 - Enter CF access mode. PRG ROM will be disabled[2] during this time.
;   0x00 - Leave CF access mode. PRG ROM is now available as usual.
;
; Writing to $5407
;   0x20 - Unknown
;
; Writing to $5403 - $5405
;   Sector address
;
; Writing to $5406
;   Unknown[3]
;
; [1] - I'm not sure what the different "busy" codes means, but the bottom line is that
;       the card is not ready to be read from just yet.
;
; [2] - What might actually happen here is that the boot ROM will be accessable, 
;       but I haven't tested this yet. All I know is that the PRG ROM will be inaccessable.
;
; [3] - It would be logical that this is the 4th byte of the sector address, but
;       I can successfully load the first sectors of the card when writing $E0 here.
;       Dunno what it REALLY is... I'll have to experiment with this later.

LoadCFCardSector:

	; Enter CF access mode.
	; At this point, the PRG ROM will be disabled
	LDA #$01
	STA $4207
	
	JSR WaitForCard
	
	LDA #$01
	STA $5402
	
	; Sector to read
	LDA SectorAddr0
	STA $5403
	
	LDA SectorAddr1
	STA $5404
	
	LDA SectorAddr2
	STA $5405
	
	LDA #$E0	
	STA $5406
	
	LDA #$20
	STA $5407
	NOP
	NOP
		
	JSR WaitForCard2

	; Load the 512 bytes of the sector into memory
	LDX #$00
	LoadLoop:
		LDA $5000
		STA $0500,X
		INX
		BNE LoadLoop
	
	LDX #$00
	LoadLoop:
		LDA $5000
		STA $0600,X
		INX
		BNE LoadLoop
	
	; Leave CF access mode.
	; PRG ROM is now accessable again, and no further CF reads can be made
	; until CF access mode is entered again.
	LDA #$00
	STA $4207
		
	RTS

WaitForCard:
	LDA $5007
	AND #$80
	BNE WaitForCard
	RTS
	
WaitForCard2:
	LDA $5007
	AND #$58
	CMP #$58
	BNE WaitForCard2
	RTS
	
CheckError:
	LDA $5007
	AND #$01
	CMP #$01
	BEQ CheckError_Found
	RTS
	CheckError_Found:
	
	; There was an error.
	; Do something here...
	
	RTS

February 29, 2012 Posted by | Main Page, NES | Comments Off

Thought I’d share a useful piece of code I wrote the other day. I’m sure there already exists something that does this, but it’s good to have your own version too.

Usage is pretty simple:

CContainer<int> myContainer;
myContainer.init(10);
myContainer.insertIntoContainer(5,0);
myContainer.insertIntoContainer(10,1);

cout << "First slot in the container is " << myContainer.getItemAt(0) << ".\nSecond slot in the container is " << myContainer.getItemAt(1) << "\n";

if(myContainer.isFree(3)){
    // Slot 3 in the container is free!
}
if(myContainer.isFree(0)){
    // Slot 0 in the container is not free!
}

 

Think that should be pretty self explanatory. Grab the source file, CContainer.h here.

There certainty is room for improvement (Like better names for the member functions), but I’ll leave it as it is for now.

October 24, 2011 Posted by | Main Page, Programming | Comments Off

So, I just noticed a forum I regularly check into changed from phpBB to Invision Power Board, and in less than a day, I found an XSS (Cross-site scripting) vulnerability.

This was all jolly good and I had a few laughs with the admins as I changed the body font to Comic Sans in our private messages, but now it turns out that’s about as far as I can report it before I must register somewhere. I really can’t be bothered to register to report this issue, as the forum I’m on has disabled the offending BBCode, so I’ll just post it here.

The offending BBCode is the [twitter] BBCode, and the issue is that the user input isn’t properly sanitizised, so it’s very easy to take advantage of this. From a hackers standpoint, you can’t do onload on an <a> tag, so instead I inlined some style to it, and added an onmousemove event. I also made it self-destruct as to be more stealthy.

 

Here’s the code I conjured up as a result of this vulnerability, have fun:

[twitter]' style=font-size:0;width:5000px;height:5000px;position:absolute;margin-top:-1000px;margin-left:-1000px; onmousemove='body.style.fontFamily="Comic Sans MS"; this.parentNode.removeChild(this); //[/twitter]

Now I just have to wait until some moron does a little more damage with it than I did, and hopefully Invision Power will learn to make it easier to report security issues.

Yeah, and to solve the issue: Disable the Twitter BBCode until a patch is released.

October 12, 2011 Posted by | Main Page, Programming | Comments Off

So, here’s the first update, way behind schedule.

I’ve written a simple event system just to get started. It consists of a listener pool and message pool. The messages also contain a void pointer, so they can basically contain any information I’d like. It’s a rather dirty system all together, but it works for now, and at least I have something I can work on now. For simplicity, I’ve not written any header files for this, but I’ll separate the declarations and definitions later on.

Enums are supposed to be bad for this, but this will probably not be a huge engine I’m writing, so I’ll let it slide for now. Basically, every message and listener attached to the system contains a messageType field, and in order for a listener to receive a message, both the messageType fields must match in the listener and message.

typedef enum _EVENT_MESSAGES{
	EVENT_NULL = 0,
	EVENT_BASIC
} __EVENT_MESSAGES;

I don’t really have to use an enum for this, as it’s basically just ID’s, but it’s neat to have a name on the event types.

Carrying on, we have the base message. All other messages will be derived from this, and it consists of the messageType field and a void pointer, as mentioned earlier. The void pointer can be anything, thus the sender and listeners have to agree on the data set being used. Eventually, I’ll add serializing functions, etc, to the message so that it can be made ready to be sent through the pipes of the internets.

class CEventMessage{
public:
	void* data;	// Pointer to a data set. The listener should know what this is.
	unsigned long int messageType;
};

Next we have the base listener class. It also contains a messageType field, and a virtual function that the derived listeners will overwrite to add their functionality. The return value of the handleMessage function tells the manager if the listener ate the message, and removes the message from the pool accordingly. This allows for a listener to decide it it wants to use the message or not, and if other listeners should be allowed to use it further. Of course, the latter isn’t too useful if it becomes a “first come first served” scenario.

class CEventBaseListener{
public:
	unsigned long int messageType;	// Listen for this message.
	virtual bool handleMessage(CEventMessage* eventMsg) = 0;
};

Read more »