cursos:ensamblador:esqueleto_programa

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cursos:ensamblador:esqueleto_programa [19-01-2024 06:16] sromerocursos: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               ; ROM_STACK_BC +    call $2d2b                    ; ROM_STACK_BC 
-    call $2de3               ; ROM_PRINT_FP+    call $2de3                    ; ROM_PRINT_FP
     pop hl     pop hl
     pop de     pop de
Línea 381: Línea 381:
 ; PrintNum4digits: Imprime el numero en BC (0-9999). ; PrintNum4digits: Imprime el numero en BC (0-9999).
 ;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
-CLS             EQU  $0daf               ; ROM_CLS +CLS             EQU  $0daf        ; ROM_CLS 
-CLS_COLOR       EQU  $5c8d               ; Variable del Sistema ATTR_P +CLS_COLOR       EQU  $5c8d        ; Variable del Sistema ATTR_P 
-BORDER          EQU  $229b               ; Rutina del borde +BORDER          EQU  $229b        ; Rutina del borde 
-PAUSE           EQU  $1f3d               ; PAUSAR BC/50 segundos (50 => 1s) +PAUSE           EQU  $1f3d        ; PAUSAR BC/50 segundos (50 => 1s) 
-MULT_HLDE       EQU  $30a9               ; Multiplica HL*DE => HL=HL*DE +MULT_HLDE       EQU  $30a9        ; Multiplica HL*DE => HL=HL*DE 
-PIXEL_ADDR2     EQU  $22b1               ; Devuelve direccion de pixel BC +PIXEL_ADDR2     EQU  $22b1        ; Devuelve direccion de pixel BC 
-PrintNum4digits EQU  $1a1b               ; Imprime valor de BC (0-9999)+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, 'd'     ld a, 'd'
-    call PrintChar     ; Imprimir sufijo 'd' despues del numero+    call PrintChar         ; Imprimir sufijo 'd' despues del numero
  
-    call PrintCR       ; Salto de linea+    call PrintCR           ; Salto de linea
  
-    ld bc, (variable)  ; Imprimir valor de variable (memoria)+    ld bc, (variable)      ; Imprimir valor de variable (memoria)
     call PrintNum     call PrintNum
  
Línea 502: Línea 502:
 CursorAt: CursorAt:
     push af     push af
-    ld a, _AT       ; Codigo control "AT Y,X"+    ld a, _AT                     ; Codigo control "AT Y,X"
     rst 16     rst 16
-    ld a, e         ; Y+    ld a, e                       ; Y
     rst 16     rst 16
-    ld a, d         ; X+    ld a, d                       ; X
     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)               ; Leemos el caracter apuntado por DE +    ld a, (de)                    ; Leemos el caracter apuntado por DE 
-    CP _EOS                  ; chequeamos si es $ff (fin de cadena) +    CP _EOS                       ; chequeamos si es $ff (fin de cadena) 
-    jr z, end_print_string   ; Si lo es, se activa el ZEROFLAG => SALIR +    jr z, end_print_string        ; Si lo es, se activa el ZEROFLAG => SALIR 
-    rst 16                   ; No lo es, no hemos saltado, imprimirlo +    rst 16                        ; No lo es, no hemos saltado, imprimirlo 
-    inc de                   ; Avanzar al siguiente caracter de la cadena +    inc de                        ; Avanzar al siguiente caracter de la cadena 
-    jr print_string_loop     ; Repetir hasta que alguno sea 0 y salgamos+    jr print_string_loop          ; Repetir hasta que alguno sea 0 y salgamos
 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                       ; Preservamos los registros que se usaran
  
-    ld c, a                  ; Guardamos en C copia de A +    ld c, a                       ; Guardamos en C copia de A 
-    ld b, 8                  ; Imprimiremos el estado de los 8 bits+    ld b, 8                       ; Imprimiremos el estado de los 8 bits
  
     ld a, '%'     ld a, '%'
-    rst 16                   ; Imprimir prefijo+    rst 16                        ; Imprimir prefijo
  
 printbin_loop: printbin_loop:
-    ld a, '1'                ; Para bit = 1, imprimiremos '1' +    ld a, '1'                     ; Para bit = 1, imprimiremos '1' 
-    bit 7, c                 ; Chequeamos el estado del bit 7 +    bit 7, c                      ; Chequeamos el estado del bit 7 
-    jr nz, printbin_es_uno   ; Dejamos A = 255 +    jr nz, printbin_es_uno        ; Dejamos A = 255 
-    ld a, '0'                ; A = '0'+    ld a, '0'                     ; A = '0'
  
 printbin_es_uno: printbin_es_uno:
-    rst 16                   ; Imprimimos (A): contiene '0' o '1' +    rst 16                        ; Imprimimos (A): contiene '0' o '1' 
-    rlc c                    ; Rotamos C a la izq para que podamos +    rlc c                         ; Rotamos C a la izq para que podamos 
-                             ; usar de nuevo el BIT 7 en el bucle +                                  ; usar de nuevo el BIT 7 en el bucle 
-    djnz printbin_loop       ; Repetimos 8 veces+    djnz printbin_loop            ; Repetimos 8 veces
  
     pop bc     pop bc
Línea 578: Línea 578:
     push hl     push hl
  
-    ld h, a                  ; Guardamos A+    ld h, a                       ; Guardamos A
     ld a, '$'     ld a, '$'
-    rst 16                   ; Imprimimos un "$" +    rst 16                        ; Imprimimos un "$" 
-    ld a, h                  ; Recuperamos A+    ld a, h                       ; Recuperamos A
  
     push af     push af
     push de     push de
  
-    call Byte2ASCII_Hex      ; Convertimos A en Cadena HEX +    call Byte2ASCII_Hex           ; Convertimos A en Cadena HEX 
-    ld hl, Byte2ASCII_output ; HL apunta a la cadena+    ld hl, Byte2ASCII_output      ; HL apunta a la cadena
  
     ld a, (hl)     ld a, (hl)
-    rst 16                   ; Imprimimos primer valor HEX +    rst 16                        ; Imprimimos primer valor HEX 
-    inc hl                   ; Avanzar en la cadena+    inc hl                        ; Avanzar en la cadena
     ld a, (hl)     ld a, (hl)
-    rst 16                   ; Imprimimos segundo valor HEX+    rst 16                        ; Imprimimos segundo valor HEX
  
     pop de     pop de
Línea 611: Línea 611:
  
     ld a, '$'     ld a, '$'
-    rst 16                   ; Imprimimos un "$"+    rst 16                        ; Imprimimos un "$"
  
     ld h, b     ld h, b
-    call Byte2ASCII_Hex      ; Convertimos A en Cadena HEX +    call Byte2ASCII_Hex           ; Convertimos A en Cadena HEX 
-    ld hl, Byte2ASCII_output ; HL apunta a la cadena+    ld hl, Byte2ASCII_output      ; HL apunta a la cadena
     ld a, (hl)     ld a, (hl)
-    rst 16                   ; Imprimimos primer valor HEX +    rst 16                        ; Imprimimos primer valor HEX 
-    inc hl                   ; Avanzar en la cadena+    inc hl                        ; Avanzar en la cadena
     ld a, (hl)     ld a, (hl)
-    rst 16                   ; Imprimimos segundo valor HEX+    rst 16                        ; Imprimimos segundo valor HEX
  
     ld h, c     ld h, c
-    call Byte2ASCII_Hex      ; Convertimos A en Cadena HEX +    call Byte2ASCII_Hex           ; Convertimos A en Cadena HEX 
-    ld hl, Byte2ASCII_output ; HL apunta a la cadena+    ld hl, Byte2ASCII_output      ; HL apunta a la cadena
     ld a, (hl)     ld a, (hl)
-    rst 16                   ; Imprimimos primer valor HEX +    rst 16                        ; Imprimimos primer valor HEX 
-    inc hl                   ; Avanzar en la cadena+    inc hl                        ; Avanzar en la cadena
     ld a, (hl)     ld a, (hl)
-    rst 16                   ; Imprimimos segundo valor HEX+    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     ; Convertimos A en Cadena Dec 0-99+    call Byte2ASCII_Dec2Digits    ; Convertimos A en Cadena Dec 0-99
     ld a, d     ld a, d
-    rst 16                         ; Imprimimos primer valor HEX+    rst 16                        ; Imprimimos primer valor HEX
     ld a, e     ld a, e
-    rst 16                         ; Imprimimos segundo valor HEX+    rst 16                        ; Imprimimos segundo valor HEX
  
     pop de     pop de
Línea 714: Línea 714:
 ;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
 Byte2ASCII_Dec2Digits: Byte2ASCII_Dec2Digits:
-    ld d, '0'                      ; Starting from ASCII '0' +    ld d, '0'                     ; Starting from ASCII '0' 
-    dec d                          ; Because we are inc'ing in the loop +    dec d                         ; Because we are inc'ing in the loop 
-    ld e, 10                       ; Want base 10 please +    ld e, 10                      ; Want base 10 please 
-    and a                          ; Clear carry flag+    and a                         ; Clear carry flag
  
 dtoa2dloop: dtoa2dloop:
-    inc d                          ; Increase the number of tens +    inc d                         ; Increase the number of tens 
-    sub e                          ; Take away one unit of ten from A +    sub e                         ; Take away one unit of ten from A 
-    jr nc, dtoa2dloop              ; If A still hasn't gone negative, do another +    jr nc, dtoa2dloop             ; If A still hasn't gone negative, do another 
-    add a, e                       ; Decreased it too much, put it back +    add a, e                      ; Decreased it too much, put it back 
-    add a, '0'                     ; Convert to ASCII +    add a, '0'                    ; Convert to ASCII 
-    ld e, a                        ; Stick remainder in E+    ld e, a                       ; Stick remainder in E
     ret     ret
  
Línea 738: Línea 738:
     push bc     push bc
  
-    push af            ; Metemos AF en al pila pero sacamos BC +    push af                       ; Metemos AF en al pila pero sacamos BC 
-    pop bc             ; Ahora C contiene el valor de F+    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                       ; Metemos AF en al pila pero sacamos BC 
-    pop bc               ; Ahora C contiene el valor de F +    pop bc                        ; Ahora C contiene el valor de F 
-                         ; y B contiene el antiguo valor A+                                  ; y B contiene el antiguo valor A
     ld a, c     ld a, c
 loopPrintFlag: loopPrintFlag:
-    rlc a                ; rotamos A veces el bit+    rlc a                         ; rotamos A veces el bit
     djnz loopPrintFlag     djnz loopPrintFlag
  
-    and %00000001        ; Borramos todos los bits menos bit 0 +    and %00000001                 ; Borramos todos los bits menos bit 0 
-    add a, '0'           ; Sumamos '0' para obtener ASCII+    add a, '0'                    ; Sumamos '0' para obtener ASCII
  
     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                         ; A = 0 
-    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)                ; Devolver Variable LAST-K en A+    ld a, ($5c08)                 ; Devolver Variable LAST-K en A
     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
  • cursos/ensamblador/esqueleto_programa.1705644966.txt.gz
  • Última modificación: 19-01-2024 06:16
  • por sromero