#Z80 Machine Code, <s>8</s> 6 bytes* `I<ww>I` * Assumes certain conditions by entering from Amstrad BASIC I LD C, C ## Loads C with itself. Shortest safe instruction that does nothing! < INC A // A=A+1 w LD (HL), A // Saves A to the memory location in HL w LD (HL), A // Saves A to the memory location in HL >I LD A, #49 ## Loads A with #49 just before finishing! This version is slightly cheating by assuming certain entry conditions, namely entering from BASIC guarantees that `A` is always 0. The location of `(HL)` is not guaranteed to be safe, and in fact, is probably a dangerous location. The below code is much more robust which is why it's so much longer. #Z80 Machine Code, 30 bytes As ASCII: `o!.ww.!>A=o>{))((}<o=A<!.ww.!o` Basically, the first half guarantees creation of a zero value and the second half increments it and writes it to memory. In the expanded version below `##` denotes code that serves no purpose in its half of the mirror. o LD L, A ## !.w LD HL, #772E // Load specific address to not corrupt random memory! w LD (HL), A ## Save random contents of A to memory .! LD L, #21 ## >A LD A, #41 // A=#41 = DEC A // A=#40 o LD L, A // L=#40 >{ LD A, #7B ## ) ADD HL, HL // HL=#EE80 ) ADD HL, HL // HL=#DD00. L=#00 at this point (( JR Z, #28 ## } LD A, L // A=L < INC A // A=L+1 o LD L, A // L=L+1 = DEC A // A=L A LD B, C ## < INC A // A=L+1 !.w LD HL, #772E // Load address back into HL w LD (HL), A // Save contents of A to memory .! LD L, #21 ## o LD L, A // L=A Breakdown of allowed instructions: n op description -- ---- ----------- 28 LD LoaD 8-bit or 16-bit register 3 DEC DECrement 8-bit or 16-bit register 1 INC INCrement 8-bit or 16-bit register 1 ADD ADD 8-bit or 16-bit register Available but useless instructions: 3 JR Jump Relative to signed 8-bit offset 1 DAA Decimal Adjust Accumulator (treats the A register as two decimal digits instead of two hexadecimal digits and adjusts it if necessary) 1 CPL 1s ComPLement A 1 HALT HALT the CPU until an interrupt is received Out of the 39 instructions allowed, 28 are load operations (the block from 0x40 to 0x7F are all single byte `LD` instructions), most of which are of no help here! The only load to memory instruction still allowed is `LD (HL), A` which means I have to store the value in `A`. Since `A` is the only register left with an allowed `INC` instruction this is actually quite handy! I can't load `A` with 0x00 to start with because ASCII 0x00 is not an allowed character! All the available values are far from 0 and all mathematical and logical instructions have been disallowed! Except... I can still do `ADD HL, HL`, add 16-bit `HL` to itself! Apart from directly loading values (no use here!), INCrementing `A` and DECrementing `A`, `L` or `HL` this is the only way I have of changing the value of a register! There is actually one specialised instruction that could be helpful in the first half but a pain to work around in the second half, and a ones-complement instruction that is almost useless here and would just take up space. So, I found the closest value to 0 I could: 0x41. How is that close to 0? In binary it is 0x01000001. So I decrement it, load it into `L` and do `ADD HL, HL` twice! `L` is now zero, which I load back into `A`! Unfortunately, the ASCII code for `ADD HL, HL` is `)` so I now need to use `(` twice. Fortunately, `(` is `JR Z, e`, where `e` is the next byte. So it gobbles up the second byte and I just need to make sure it doesn't do anything by being careful with the `Z` flag! The last instruction to affect the `Z` flag was `DEC A` (counter-intuitively, `ADD HL, HL` doesn't change it) and since I know that `A` was 0x40 at that point it's guaranteed that `Z` is not set. The first instruction in the second half `JR Z, #28` will do nothing the first 255 times because the Z flag can only be set if A has overflowed from 255 to 0. After that the output will be wrong, however since it's only saving 8-bits values anyway that shouldn't matter. The code shouldn't be expanded more than 255 times. The code has to be executed as a snippet since all available ways of returning cleanly have been disallowed. All the RETurn instructions are above 0x80 and the few Jump operations allowed can only jump to a positive offset, because all 8-bit negative values have been disallowed too!