From: Tobias Girstmair Date: Tue, 11 Dec 2018 22:13:46 +0000 (+0100) Subject: swap registers for `t` and `_` X-Git-Tag: attiny9~10 X-Git-Url: https://git.gir.st/Chiptunes.git/commitdiff_plain/d44d4b472bcfc03fd6739bd0ff445fbbcb890967 swap registers for `t` and `_` LDing to Xhi or Xlo is undefined, so we had to move `t` somewhere else and then back. swapping these registers globally solves this. also rename 'data' to 'notes' to be more expressive --- diff --git a/foo.S b/foo.S index 2a7f4f6..7eb9965 100644 --- a/foo.S +++ b/foo.S @@ -7,10 +7,10 @@ #define i3 r21 #define n r22 #define s r23 -#define _ r24 +#define t r24 //==Ml ; r25 #define x r26 //==Xlo==Mh -#define t r27 //==Xhi==Ml +#define _ r27 //==Xhi ; r28 ; r29 ; r30 Zlo @@ -18,8 +18,8 @@ ; aliases: #define Xlo r26 #define Xhi r27 -#define Mh r26 //mod3 vars -#define Ml r27 // -"- +#define Ml r24 //mod3 vars +#define Mh r26 // -"- /* I/O REGISTERS */ OCR0AL = 0x26 @@ -38,7 +38,7 @@ TIMSK0 = 0x2B TIFR0 = 0x2A .section .data -data: +notes: .byte 0x84, 0x9d, 0xb0, 0x69, 0x9d, 0x84, 0x69, 0x58 .byte 0x75, 0x8c, 0xb0, 0x69, 0x8c, 0x75, 0x69, 0x58 @@ -121,15 +121,10 @@ g: ; g(i, t) -> t #undef tmp ;TODO: check correctness! - #define tmp _ - MOV tmp, t ; NOTE: must move value away from `t`, as that is also hi(X) - LDI Xhi, hi8(data) ; hi(data) always zero, but still need to clear the register - LDI Xlo, lo8(data) - ADD Xlo, tmp ;<-- the offset (formerly `t`) into data[] - ;ADC Xhi, zero ; data == 0x40 t <= 0x10, so can never overflow - LD tmp, X - MOV t, tmp - #undef tmp + LDI Xhi, hi8(notes) ; hi(notes) always zero, but still need to clear the register + LDI Xlo, lo8(notes) + ADD Xlo, t ; NOTE: can't overflow, since RAMEND == 0x5F + LD t, X #define a1 x #define a2 _