vinxru, тебе ещё все предстоит в очередной раз переделывать, когда будешь вести по каждой переменной её состояние, и в зависимости от этого код будет разный. Приблизительный пример.
Твой код, сейчас:
Код:
  ; 54 for(y=0; y<8; y++)
  ld c, 0
l64:
  ld a, c
  cp 8
  jp nc, l65
...

l66:
  ld a, c
  inc c
  jp l64
l65:
Тут есть два варианта - если условие по старту верное (как в этом коде), то такой код неоптимален, и лучше что-то типа:

Код:
  ; 54 for(y=0; y<8; y++)
  ld c, 0
l64:
...


  ld a, c
  inc c
  cp 7
  jp c, l64
а вот если условие неопределённое, то нужен такой код как есть.
Нужно на каждую переменную вести её последнее значение, на этапе компиляции анализировать условия (y<8 в данном случае). И в зависимости от этого анализа условия компилятор выбирает нужную ветку.

Ты молодец, много сделал, но тут ещё копать и копать. И боюсь, ещё не раз придётся всё переписать...