|
|
@@ -1,51 +0,0 @@ |
|
|
|
This file describe tricks and conventions that are used throughout the code and |
|
|
|
might need explanation. |
|
|
|
|
|
|
|
*** Quickies |
|
|
|
|
|
|
|
or a: Equivalent to "cp 0", but results in a shorter opcode. |
|
|
|
|
|
|
|
xor a: sets A to 0 more efficiently than ld a, 0 |
|
|
|
|
|
|
|
and 0xbf: Given a letter in the a-z range, changes it to its uppercase value |
|
|
|
if it's already uppercased, then it stays that way. |
|
|
|
|
|
|
|
*** Z flag for results |
|
|
|
|
|
|
|
Z if almost always used as a success indicator for routines. Set for success, |
|
|
|
Reset for failure. "xor a" (destroys A) and "cp a" (preserves A) are used to |
|
|
|
ensure Z is set. To ensure that it is reset, it's a bit more complicated and |
|
|
|
"unsetZ" routine exists for that, although that in certain circumstances, |
|
|
|
"inc a \ dec a" or "or a" can work. |
|
|
|
|
|
|
|
*** Little endian |
|
|
|
|
|
|
|
z80 is little endian in its 16-bit loading operations. For example, "ld hl, (0)" |
|
|
|
will load the contents of memory address 0 in L and memory address 1 in H. This |
|
|
|
little-endianess is followed by Collapse OS in most situations. When it's not, |
|
|
|
it's specified in comments. |
|
|
|
|
|
|
|
This get a bit awkward with regards to 32-bit. There are no "native" z80 32-bit |
|
|
|
operations, so z80 doesn't mandate an alignment. In Collapse OS, 32-bit numbers |
|
|
|
are stored as "big endian pair of little endian 16-bit numbers". For example, |
|
|
|
if "ld dehl, (0)" existed and if the first 4 bytes of memory were 0x01, 0x02, |
|
|
|
0x03 and 0x04, then DE (being the "high" word) would be 0x0201 and HL would be |
|
|
|
0x0403. |
|
|
|
|
|
|
|
*** DAA |
|
|
|
|
|
|
|
When it comes to dealing with decimals, the DAA instruction, which look a bit |
|
|
|
obscur, can be very useful. It transforms the result of a previous arithmetic |
|
|
|
operation involving two BCD (binary coded decimal, one digit in high nibble, |
|
|
|
the other digit in low nibble. For example, 0x99 represents 99) into a valid |
|
|
|
BCD. For example, 0x12+0x19=0x2b, but after calling DAA, it will be 0x31. |
|
|
|
|
|
|
|
To clear misunderstanding: this does **not** transform an arbitrary value into |
|
|
|
BCD. For example, "ld a, 0xff \ daa" isn't going to magically give you a binary |
|
|
|
coded 255 (how could it?). This is designed to be ran after an arithmetic |
|
|
|
operation. |
|
|
|
|
|
|
|
A common trick to transform an arbitrary number to BCD is to loop 8 times over |
|
|
|
your bitstream, SLA your bits out of your binary value and then run |
|
|
|
"adc a, a \ daa" over it (with provisions for carries if you expect numbers |
|
|
|
over 99). |