ADd with Carry
adc a, b ; A + B + CARRY
adc hl, bc ; HL + BC + CARRY
Sólo se puede sumar en los registros A (8 bits) y HL (16 bits).
add a, b ; A + B
add hl, bc ; HL + BC
Complement Carry Flag
ccf ; CARRY = 0 si CARRY era 1
ccf ; CARRY = 1 si CARRY era 0
DECrement
Decrementa el valor de un registro (de 8 o 16 bits), pero no actualiza el flag de CARRY!
INCrement
Incrementa el valor de un registro (de 8 o 16 bits), pero no actualiza el flag de CARRY!
LoaD
Registros de 8 bits: A, B, C, D, E, H, L
Registros de 16 bits: BC, DE, HL
Para leer y escribir una posición de memoria se utilizan paréntesis. Para leer palabras de 8 bits sólo se puede usar el registro A. Para leer palabras de 16 bits se puede usar cualquier registro de 16 bits.
ld hl, 5C65 ; HL = 23653 (5C65 en decimal)
ld a, (5C65) ; A = PEEK 23653
ld hl, (5C65) ; L = PEEK 23653; H = PEEK 23654 (registro de 16 bits, hay que hacer PEEK de dos valores!)
ld (5C65), a ; POKE 23653, A
ld (5C65), hl ; POKE 23653, L; POKE 23654, H
TRUQUI: Si queremos leer una palabra de 8 bits en un registro de 16 bits (para evitar tocar A, por ejemplo) se puede poner a 0 la parte alta del registro:
ld bc, (5C65)
ld b, 00
ret
LoaD and Decrement
Copia el valor de la posición de memoria a la que apunte DE en la posición de memoria a la que apunte HL, decrementa ambos y decrementa BC. Ver LDI.
LoaD_Decrement_and_Repeat
Ejecuta LDR hasta que BC llegue a 0.
LoaD and Increment
Copia el valor de la posición de memoria a la que apunte DE en la posición de memoria a la que apunte HL, incrementa ambos y decrementa BC. Se usa para copiar grandes bloques de memoria de un sitio a otro.
ld (A000), FF
ld de, A000
ld hl, B000
ld bc, 1
ldi ; (B000) = FF, DE = A001, HL = B001, BC = 0
LoaD_Increment_and_Repeat
Ejecuta LDI hasta que BC llegue a 0.
Recupera el último elemento añadido a la pila. Siempre se recuperan datos de 16 bits, así que siempre hay que usar BC, DE o HL. Si queremos desapilar el valor del registro A, hay que desapilar el registro AF (A + Flags).
Al hacer POP
se modifica el registro SP sumándole 2.
Duda: ¿Al hacer POP AF
se machacan los flags?
Truqui: Se puede incrementar o decrementar el registro SP! Esto permite, por ejemplo, intercambiar los valores de dos registros sin usar registros extra:
push de ; SP = SP - 2 -> STACK = (DE)
push de ; SP = SP - 2 -> STACK = (DE), (DE)
inc sp ; SP = SP + 1 -> STACK = (D), (ED)
pop de ; DE = (ED) -> STACK = (D)
inc sp ; SP = SP + 1 -> STACK = (vacía) ¡Si dejamos SP con un valor impar dará un crash al volver a usar la pila!
Añade un elemento a lo alto de la pila. Siempre se almacenan datos de 16 bits, así que siempre hay que usar BC, DE o HL. Si queremos apilar el valor del registro A, hay que apilar el registro AF (A + Flags).
Al hacer POP
se modifica el registro SP restándole 2.
RETurn
Termina la ejecución del programa.
SuBstract with Carry
Resta con CARRY. Se puede restar sobre el registro A y sobre HL (¡curioso! la resta normal sólo se puede hacer sobre A).
sbc a, b ; A - B - CARRY
sbc hl, bc ; HL - BC - CARRY
Set Carry Flag
scf ; CARRY = 1
TRUQUI: Para resetear el flag de CARRY:
add a, 0 ; CARRY = 0
SUBstract
Sólo se pueden restar sobre el registro A.
sub a ; A - A
sub b ; A - B
sub 10 ; A - 10
USR _MEM_POS_
ejecuta el código máquina almacenado a partir de _MEM_POS_
hasta que encuentra un RET
.
Si tenemos una función, debemos dejar el valor de retorno en el registro BC. Con PRINT
podemos imprimir el valor almacenado en BC:
PRINT USR 61440
Si tenemos un procedimiento no tendremos valor de retorno, así que PRINT
pintará un valor sin sentido. En estos casos podemos usar:
RANDOMIZE USR 61440