Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:ensamblador:esqueleto_programa [19-01-2024 06:16] – sromero | cursos:ensamblador:esqueleto_programa [19-01-2024 11:32] (actual) – sromero | ||
---|---|---|---|
Línea 8: | Línea 8: | ||
Para ello, necesitamos saber lo siguiente: | Para ello, necesitamos saber lo siguiente: | ||
- | - Tener el esqueleto de un programa mínimo, vacío, que no haga nada, al cual podamos añadirle instrucciones para hacer nuestras pruebas. Podremos utilizar un esqueleto de programa similar para cada prueba que queramos realizar. | + | - Tener el esqueleto de un programa mínimo, que no haga nada, al cual podamos añadirle instrucciones para hacer nuestras pruebas. Podremos utilizar un esqueleto de programa similar para cada prueba que queramos realizar. |
- Saber cómo ensamblar ese programa para obtener un fichero TAP que podamos probar en un emulador. | - Saber cómo ensamblar ese programa para obtener un fichero TAP que podamos probar en un emulador. | ||
- Tener alguna forma de imprimir por pantalla para tener un feedback visual en las pruebas que hagamos. | - Tener alguna forma de imprimir por pantalla para tener un feedback visual en las pruebas que hagamos. | ||
Línea 364: | Línea 364: | ||
push de | push de | ||
push hl | push hl | ||
- | call $2d2b | + | call $2d2b ; ROM_STACK_BC |
- | call $2de3 | + | call $2de3 ; ROM_PRINT_FP |
pop hl | pop hl | ||
pop de | pop de | ||
Línea 381: | Línea 381: | ||
; PrintNum4digits: | ; PrintNum4digits: | ||
; | ; | ||
- | CLS | + | CLS |
- | CLS_COLOR | + | CLS_COLOR |
- | BORDER | + | BORDER |
- | PAUSE | + | PAUSE |
- | MULT_HLDE | + | MULT_HLDE |
- | PIXEL_ADDR2 | + | PIXEL_ADDR2 |
- | PrintNum4digits EQU $1a1b | + | PrintNum4digits EQU $1a1b ; Imprime valor de BC (0-9999) |
; | ; | ||
Línea 429: | Línea 429: | ||
call CLS | call CLS | ||
- | ld bc, 1234 ; Queremos imprimir un valor directo | + | ld bc, 1234 ; Queremos imprimir un valor directo |
call PrintNum | call PrintNum | ||
ld a, ' | ld a, ' | ||
- | call PrintChar | + | call PrintChar |
- | call PrintCR | + | call PrintCR |
- | ld bc, (variable) | + | ld bc, (variable) |
call PrintNum | call PrintNum | ||
Línea 502: | Línea 502: | ||
CursorAt: | CursorAt: | ||
push af | push af | ||
- | ld a, _AT | + | ld a, _AT |
rst 16 | rst 16 | ||
- | ld a, e | + | ld a, e |
rst 16 | rst 16 | ||
- | ld a, d | + | ld a, d |
rst 16 | rst 16 | ||
pop af | pop af | ||
Línea 522: | Línea 522: | ||
push af | push af | ||
print_string_loop: | print_string_loop: | ||
- | ld a, (de) | + | ld a, (de) ; Leemos el caracter apuntado por DE |
- | CP _EOS ; chequeamos si es $ff (fin de cadena) | + | CP _EOS |
- | jr z, end_print_string | + | jr z, end_print_string |
- | rst 16 | + | rst 16 ; No lo es, no hemos saltado, imprimirlo |
- | inc de | + | inc de ; Avanzar al siguiente caracter de la cadena |
- | jr print_string_loop | + | jr print_string_loop |
end_print_string: | end_print_string: | ||
pop af | pop af | ||
Línea 541: | Línea 541: | ||
PrintBin: | PrintBin: | ||
push af | push af | ||
- | push bc ; Preservamos los registros que se usaran | + | push bc |
- | ld c, a ; Guardamos en C copia de A | + | ld c, a |
- | ld b, 8 ; Imprimiremos el estado de los 8 bits | + | ld b, 8 |
ld a, ' | ld a, ' | ||
- | rst 16 | + | rst 16 ; Imprimir prefijo |
printbin_loop: | printbin_loop: | ||
- | ld a, ' | + | ld a, ' |
- | bit 7, c | + | bit 7, c ; Chequeamos el estado del bit 7 |
- | jr nz, printbin_es_uno | + | jr nz, printbin_es_uno |
- | ld a, ' | + | ld a, ' |
printbin_es_uno: | printbin_es_uno: | ||
- | rst 16 | + | rst 16 ; Imprimimos (A): contiene ' |
- | rlc c ; Rotamos C a la izq para que podamos | + | rlc c |
- | | + | ; usar de nuevo el BIT 7 en el bucle |
- | djnz printbin_loop | + | djnz printbin_loop |
pop bc | pop bc | ||
Línea 578: | Línea 578: | ||
push hl | push hl | ||
- | ld h, a ; Guardamos A | + | ld h, a |
ld a, ' | ld a, ' | ||
- | rst 16 | + | rst 16 ; Imprimimos un " |
- | ld a, h ; Recuperamos A | + | ld a, h |
push af | push af | ||
push de | push de | ||
- | call Byte2ASCII_Hex | + | call Byte2ASCII_Hex |
- | ld hl, Byte2ASCII_output ; HL apunta a la cadena | + | ld hl, Byte2ASCII_output |
ld a, (hl) | ld a, (hl) | ||
- | rst 16 | + | rst 16 ; Imprimimos primer valor HEX |
- | inc hl | + | inc hl ; Avanzar en la cadena |
ld a, (hl) | ld a, (hl) | ||
- | rst 16 | + | rst 16 ; Imprimimos segundo valor HEX |
pop de | pop de | ||
Línea 611: | Línea 611: | ||
ld a, ' | ld a, ' | ||
- | rst 16 | + | rst 16 ; Imprimimos un " |
ld h, b | ld h, b | ||
- | call Byte2ASCII_Hex | + | call Byte2ASCII_Hex |
- | ld hl, Byte2ASCII_output ; HL apunta a la cadena | + | ld hl, Byte2ASCII_output |
ld a, (hl) | ld a, (hl) | ||
- | rst 16 | + | rst 16 ; Imprimimos primer valor HEX |
- | inc hl | + | inc hl ; Avanzar en la cadena |
ld a, (hl) | ld a, (hl) | ||
- | rst 16 | + | rst 16 ; Imprimimos segundo valor HEX |
ld h, c | ld h, c | ||
- | call Byte2ASCII_Hex | + | call Byte2ASCII_Hex |
- | ld hl, Byte2ASCII_output ; HL apunta a la cadena | + | ld hl, Byte2ASCII_output |
ld a, (hl) | ld a, (hl) | ||
- | rst 16 | + | rst 16 ; Imprimimos primer valor HEX |
- | inc hl | + | inc hl ; Avanzar en la cadena |
ld a, (hl) | ld a, (hl) | ||
- | rst 16 | + | rst 16 ; Imprimimos segundo valor HEX |
pop hl | pop hl | ||
Línea 692: | Línea 692: | ||
push af | push af | ||
push de | push de | ||
- | call Byte2ASCII_Dec2Digits | + | call Byte2ASCII_Dec2Digits |
ld a, d | ld a, d | ||
- | rst 16 | + | rst 16 ; Imprimimos primer valor HEX |
ld a, e | ld a, e | ||
- | rst 16 | + | rst 16 ; Imprimimos segundo valor HEX |
pop de | pop de | ||
Línea 714: | Línea 714: | ||
; | ; | ||
Byte2ASCII_Dec2Digits: | Byte2ASCII_Dec2Digits: | ||
- | ld d, ' | + | ld d, ' |
- | dec d ; Because we are inc' | + | dec d |
- | ld e, 10 | + | ld e, 10 ; Want base 10 please |
- | and a ; Clear carry flag | + | and a |
dtoa2dloop: | dtoa2dloop: | ||
- | inc d ; Increase the number of tens | + | inc d |
- | sub e ; Take away one unit of ten from A | + | sub e |
- | jr nc, dtoa2dloop | + | jr nc, dtoa2dloop |
- | add a, e | + | add a, e ; Decreased it too much, put it back |
- | add a, ' | + | add a, ' |
- | ld e, a ; Stick remainder in E | + | ld e, a |
ret | ret | ||
Línea 738: | Línea 738: | ||
push bc | push bc | ||
- | push af ; Metemos AF en al pila pero sacamos BC | + | push af |
- | pop bc | + | pop bc ; Ahora C contiene el valor de F |
ld a, c | ld a, c | ||
call PrintBin | call PrintBin | ||
Línea 757: | Línea 757: | ||
push bc | push bc | ||
- | push af ; Metemos AF en al pila pero sacamos BC | + | push af |
- | pop bc | + | pop bc ; Ahora C contiene el valor de F |
- | | + | ; y B contiene el antiguo valor A |
ld a, c | ld a, c | ||
loopPrintFlag: | loopPrintFlag: | ||
- | rlc a ; rotamos A veces el bit | + | rlc a |
djnz loopPrintFlag | djnz loopPrintFlag | ||
- | and %00000001 | + | and %00000001 |
- | add a, ' | + | add a, ' |
rst 16 | rst 16 | ||
Línea 784: | Línea 784: | ||
push af | push af | ||
wait_for_key_loop: | wait_for_key_loop: | ||
- | xor a ; A = 0 | + | xor a |
- | in a, (254) | + | in a, ($FE) |
- | or 224 | + | or %11100000 |
inc a | inc a | ||
jr z, wait_for_key_loop | jr z, wait_for_key_loop | ||
pop af | pop af | ||
- | ld a, ($5c08) | + | ld a, ($5c08) |
ret | ret | ||
Línea 804: | Línea 804: | ||
xor a | xor a | ||
in a, ($fe) | in a, ($fe) | ||
- | or 224 | + | or %11100000 |
inc a | inc a | ||
jr nz, wait_for_no_key_loop | jr nz, wait_for_no_key_loop |