• para debugear un programa BASIC viene bárbaro!! 

    Exacto Hernán, esa fué la idea.

    Saludos.

    PD1: Lo mejor a lo último.


     
  •  

  • Si bien no tengo el assembler, viendo el LM en decimal, me juego a que si.

    DATA 62,24,50,255,255,62,195,50,244,255,33,90,
    255,34,245,255,62,59,237,71,71,237,94,201
    ,62,63,231,
    71,237,86,201
    ,229,245,197,213,42,69,92,17,71,71,237,
    83,24,88,237,83,26,88,205,126,255,209,193,241,225,
    195,56,0,17,24,0,237,83,200,255,17,232,3,205,189,255,
    17,100,0,205,189,255,17,10,0,205,189,259,255,77,205,
    179,255,62,58,205,189,255,58,71,92,38,0,111,17,100,0,
    209,189,255,17,101,0,205,189,255,77,25,62,48,129,225,
    205,199,255,225,201,167,14,0,237,82,56,239,12,24,249,
    17,32,0,38,0,111,237,75,54,92,41,41,41,9,122,230,24,
    198,64,71,122,15,15,15,230,224,131,95,80,6,8,126,18
    ,20,35,16,250,33,200,255,52,201


    En rojo, el activador en IM 2.
    En verde, el desactivador a IM 1.
    En gris, la rutina en si.

    EDIT: Lo estoy desensamblando a mano para verificar y encuentro discrepancias... Cuando termine posteo el assembler.


    Saludos,
     

  • Va el codigo desensamblado... fiuuuu..  confused
    Fue una buena práctica y me trajo algunos recuerdos...  :'(


    ORG 65340

    62,24            LD A,24
    50,255,255      LD (65535),A
    62,195            LD A,195
    50,244,255      LD (65524),A
    33,90,255      LD HL,65370      
    34,245,255      LD (65525),HL
    62,59            LD A,59            
    237,71            LD I,A
    237,94            IM 2            
    201            RET
    62,63            LD A,63            
    231,71            LD I,A
    237,86            IM 1            
    201            RET
    229            PUSH HL            
    245            PUSH AF
    197            PUSH BC
    213            PUSH DE
    42,69,92      LD HL,(23621)
    17,71,71      LD DE,18247      ; RUTINA ROM??
    237,83,24,88      LD (22552),DE
    237,83,26,88      LD (22554),DE
    205,126,255      CALL 65406
    209            POP DE
    193            POP BC
    241            POP AF
    225            POP HL
    195,56,0      JP 56      ; RET ESTABLE EN ROM
    17,24,0            LD DE,24
    237,83,200,255      LD (65480),DE
    17,232,3      LD DE,1000
    205,189,255      CALL 65469
    17,100,0      LD DE,100
    205,189,255      CALL 65469
    17,10,0            LD DE,10
    205,189,255      CALL 65469
    255            RST 38H            ; IMPRESION?
    77            LD C,L
    205,179,255      CALL 65459
    62,58            LD A,58
    205,189,255      CALL 65469
    58,71,92      LD A,(21063)
    38,0            LD H,0
    111            LD L,A
    17,100,0      LD DE,100
    209            POP DE
    189            CP L
    255            RST 38H            ; IMPRESION?
    17,101,0      LD DE, 101
    205,189,255      CALL 65469
    77            LD C,L
    77            LD C,L
    25            ADD HL,DE
    62,48            LD A,48
    129            ADD A,C
    225            POP HL
    205,199,255      CALL 65479
    225            POP HL
    201            RET      ; SALGO AL BASIC
    167            AND A
    14,0            LD C,0
    237,82            SBC HL,DE
    56,239            JR C, -111      ; 239 CON SIGNO
    12            INC C
    24,249            JR -121      ; 249 CON SIGNO
    17,32,0            LD DE,32
    38,0            LD H,0
    111            LD L,A
    237,75,54,92      LD BC,(23606)
    41            ADD HL,HL
    41            ADD HL,HL
    41            ADD HL,HL
    9            ADD HL,BC
    122            LD A,D
    230,24            AND 24
    198,64            ADD A,64
    71            LD B,A
    122            LD A,D
    15            RRCA
    15            RRCA
    15            RRCA
    230,224            AND 224
    131            ADD A,E
    96            LD E,A
    80            LD D,B
    6,8            LD B,8
    126            LD A,(HL)
    18            LD (DE),A
    20            INC D
    35            INC HL
    16,250            DJNZ -122      ; 250 CON SIGNO
    33,200,255      LD HL, 65480
    52            INC (HL)
    201            RET

    Prueben y me cuentan...  "Fingercrossed"  :-/
     

  • Sumo una anécdota al último post que hice:

    Hice el desensamble en el trabajo. Mientras estaba desensamblando, me la pasaba los papeles para buscar los opcodes, se aparece mi jefe (un tipo de 40 largos) y se establece este diálogo:

    J: ¿que estas haciendo?

    S: (con la mejor cara de piedra de mi catálogo)
    Estoy desensamblando este código de Z80.
    Postee estos números pero me temo que puede haber errores de tipeo.

    J: (Mira el desensamble y dice) Ese assembler es de Spectrum... (y se va)

    S:  suprised suprised suprised suprised suprised suprised suprised suprised suprised suprised suprised suprised suprised suprised suprised

    Nunca me lo hubiese imaginado....

    Saludos,
     

  • Hiciste el desensamble a mano?  suprised

    Si bien no tengo el assembler, viendo el LM en decimal, me juego a que si.

    Te pareces al tipo de Matrix que interpretaba el mundo mirando los numeros de la pantalla.  ;D
     

  • Hiciste el desensamble a mano? 

    Si, el desensamble lo hice a mano, pero no recuerdo todos los opcodes por eso las planillas de la anécdota.
    Lo marcado en verde y rojo, fue una interpretación de los numeros on-the-fly (en la mosca =P )

    Jajaja!! Si, me recibí de "Operator", en cualquier momento me pongo a diseñar mujeres de rojo.  ;D

    Saludos,
     

  • ...En la Spectrum, si uno se equivocaba, bajo assembler, en la lógica de la programación, el costo era un cuelgue.  >:(

    ...En los sistemas operativos multitarea actuales, si uno se equivoca no solo no se cuelga, ni se pierde nada, sino que se puede interrumpir. (por lo menos, bajo linux, con la famosa Ctrl+C).  smile

    Las veces que putee en la speecy....  :-/

    Saludos,
     

  • ... para multiplicar en assembler, se utiliza un método desde tiempos inmemoriables, que aún hoy se usa: El desplazamiento de registros.

    ¿Cómo es esto?

    Un breve intro, seguro que todos lo saben, pero igual lo repasamos:

    Sistema decimal:

    Sabemos que dentro de cualquier dispositivo digital, todo es binario, y en la speccy, estos dígitos se agrupaban de a 8 formando algo que se lo llama "byte".

    Cada "posición" en esos lugares tiene un "peso", llendo de izquierda (los mas pesados) a derecha (los menos pesados).

    No se sientan confundidos, es igual que nuestro sistema numérico:
    Para el caso de del número 69, el 6 pesa mas que el 9 (porque el 9 son 9 unidades, y el 6 son 6 decenas)

    Recordemos nuestras clases...
    Si descomponemos el numero del ejemplo, en el sistema decimal, vemos que esta formado por:


    6 x 10[sup]1[/sup] + 9 x 10[sup]0[/sup] = 69
    Fig.1

    Acá también se aclara porque se dice que nuestro sistema numérico tiene base decimal. Porque en la potencia de la Fig.1, el número 10 es la base del término potencial.

    Sistema binario:
    Una aclaración: Vamos a trabajar con números de 8 bits (1 byte).
    Veremos que los bits en los números binarios tambien tienen su peso:


    Pos:   7   6   5   4   3   2   1   0
         | x | x | x | x | x | x | x | x |
           ^   ^   ^   ^   ^   ^   ^   ^
           |   |   |   |   |   |   |   +-- 1
           |   |   |   |   |   |   +------ 2
           |   |   |   |   |   +---------- 4
           |   |   |   |   +-------------- 8
           |   |   |   +------------------ 16
           |   |   +---------------------- 32
           |   +-------------------------- 64
           +------------------------------ 128
    Fig.2

    De la Fig.2 podemos sacar algunas conclusiones:


    • El mayor número posible, en 8 bits, es 255: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128.
    • El peso entre bits es en potencias de 2: f(x):R->R / f(x)=x[sup]2[/sup]
    • La paridad de cualquier número esta dada por el estado (1 o 0) del bit menos significativo (el de la derecha).


    Por cada bit encendido, tendremos su valor incorporado, o siendo componente del número expresado en el byte. Y para convertir un número binario a decimal, solo basta sumar el peso de aquellos bits encencidos o lo que es lo mismo, en estado 1.

    Ejemplos:
    00000001[sub]2[/sub] = 1[sub]10[/sub] (1x2[sup]0[/sup])
    00000010[sub]2[/sub] = 2[sub]10[/sub] (1x2[sup]1[/sup])
    00000011[sub]2[/sub] = 3[sub]10[/sub] (1 x 2[sup]1[/sup] + 1 x 2[sup]0[/sup])

    Y ahora si llegamos al principio:
    La forma clásica de multiplicar en assembler es desplazando los bits hacia la izquierda. Y en contrapartida, se divide (Z[sup]+[/sup] únicamente!) desplazando hacia la derecha.
    Pero haciendo esto, multiplicamos (o dividimos) por 2.
    ¿Y si queremos multiplicar por 3?
    Se desplaza a la izquierda una sola vez y se suma. Recordemos que el multiplicando nos dice cuantas veces sumamos.

    00000010[sub]2[/sub] = 2[sub]10[/sub]

    Desplazando 1 sola vez hacia la izquierda (multiplicando por 2), queda:

    00000100[sub]2[/sub] = 4[sub]10[/sub]

    Otro ejemplo:

    00000011[sub]2[/sub] = 3[sub]10[/sub]
    Desplazando:
    00000110[sub]2[/sub] = 6[sub]10[/sub]

    La instrucción en assembler del Z80 que lo hace es "RL" (rotate left) y hacia la derecha, "RR" (rotate right).

    Una última aclaración: desplazar y rotar son dos cosas distintas, si bien ambas desplazan, la diferencia radica en que es lo que sucede con el bit que se quedo al "borde". Si se rota, el mismo se inyecta en el "otro lado" del byte, y se desplaza, se va al tacho (el bit de carry se activa en ambos casos).

    Saludos y espero haber sido claro.
     
  •  

Moderador (s): homecomputer, Selandari, pastbytes, Palamar, phd, Durandal