| Known Errors | Bugfix provided by Flavio M. Matsumoto:
<UL><LI> Bloody Paws has a bug that causes the 'snow' effect in the screen. When IM 2 is activated with I register in the range 64-127 ($40-$7F), ULA is confused and shows noises in the screen. This bug does not affect machine code execution and game can be played normally, but this effect is visually very annoying.
The program disassembly reveals forbidden value 93 ($5D) assigned to I register:
<PRE>24000 LD SP, 24000
24003 DI
24004 LD A, $5D
24006 LD I, A
24008 IM 2
24010 XOR A</PRE>
The value of assembly instruction operand at 24004 must be replaced by any value greater than $7F. The chosen value was $FB because the RAM in the $FB00-$FC00 range was empty. The instruction at 24004 was altered to:
<PRE>24004 LD A, $FB</PRE>
In IM 2, the most significant byte (MSB) of the interrupt vector is the value of I register and the least significant byte (LSB) is read from data bus. Due to push-up resistors present in the data bus, the LSB is usually 255 ($FF), but it can return any other values because noise can be left by some device (mainly ULA). Programmer of Bloody Paws erroneously assumed that LSB will always be 255, but this is wrong! The proper way to handle interrupts would be making an interrupt vector table in the RAM, containing all possible values of LSB. Moreover, the interrupt routine address must be symmetrical because LSB can assume even or odd value.
To prepare interrupt vector table, the RAM located at $FB00-$FC00 range was chosen because it was empty. Address $FAFA was also empty and was chosen to hold the interrupt routine that consists only by 'JP $FEF6' instruction ($FEF6 is the beginning of program's real interrupt routine).</UL>
Modified "BUGFIX" file provided by Flavio M. Matsumoto. |