No había visto tu respuesta, Metalbrain.
En condiciones generales, nz sí que es más común que z (en proporción 255 a 1), pero en mi caso partícular son equiprobables.
Pero vamos, que al final se queda como está, con el if-then-else por jrs. Modificar uno de los métodos (añadir el xor a) pues es mejorar este caso para penalizar el resto de sitios en los que se usa. Y al fin y al cabo era más por optimizar estéticamente el código que porque necesitara más velocidad o memoria.
El código del Genesis es inmanejable para mí; no sé ni por dónde empezar a mirar. De momento me tengo que conformar con los ejemplos del asMSX y el Jumping 

Muchas gracias a todos por las respuestas.
Y aquí voy con otras dos consultas: 

Ahora mismo, mi código (asMSX) empieza con:
	.page	1
	.size	32
rom_start:
	.rom			; ID ("AB")
	.start	MAIN		; INIT
	.org	rom_start + $10	; STATEMENT, DEVICE, TEXT, Reserved
MAIN:
	; ...
El caso es que la directiva .rom ya hace automáticamente dicho padding (e incluso el .start), pero siempre lo veo puesto explícitamente. Es decir, si simplifico lo anterior a lo siguiente, genera exactamente el mismo fichero .rom:
	.page	1
	.size	32
	.rom			; ID ("AB"), INIT, STATEMENT, DEVICE, TEXT, Reserved
	; ...
Entonces viene la duda, porque en todos los ejemplos he visto el start y, en la mayoría, el padding. ¿Se deja simplemente por claridad o hay algún motivo que se me escapa? (en algunos casos he visto el padding de la tercera línea con .dws)
Y una última cosa: he visto que algunos listados empiezan por ld sp, $f380 ¿Es necesario? ¿El stack pointer no está inicialmente apuntando ya ahí?
Lo dicho, muchas gracias a todos de antemano.