Skip to content

Instantly share code, notes, and snippets.

@cesarjimenez
Last active April 17, 2017 17:55
Show Gist options
  • Save cesarjimenez/e1d31f22179ee3a9b437cb3cffeb6c27 to your computer and use it in GitHub Desktop.
Save cesarjimenez/e1d31f22179ee3a9b437cb3cffeb6c27 to your computer and use it in GitHub Desktop.

ASM

ADC

ADd with Carry

adc a, b     ; A + B + CARRY
adc hl, bc   ; HL + BC + CARRY

ADD

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

CCF

Complement Carry Flag

ccf   ; CARRY = 0 si CARRY era 1
ccf   ; CARRY = 1 si CARRY era 0

DEC

DECrement

Decrementa el valor de un registro (de 8 o 16 bits), pero no actualiza el flag de CARRY!

INC

INCrement

Incrementa el valor de un registro (de 8 o 16 bits), pero no actualiza el flag de CARRY!

LD

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

LDD

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.

LDDR

LoaD_Decrement_and_Repeat

Ejecuta LDR hasta que BC llegue a 0.

LDI

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

LDIR

LoaD_Increment_and_Repeat

Ejecuta LDI hasta que BC llegue a 0.

POP

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!

PUSH

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.

RET

RETurn

Termina la ejecución del programa.

SBC

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

SCF

Set Carry Flag

scf       ; CARRY = 1

TRUQUI: Para resetear el flag de CARRY:

add a, 0  ; CARRY = 0

SUB

SUBstract

Sólo se pueden restar sobre el registro A.

sub a   ; A - A
sub b   ; A - B
sub 10  ; A - 10

BASIC

USR

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment