• Muchachos, hace rato que tengo ganas de aprender algo de assembler para la C64 y me pareció buena idea tratar de desensamblar algo para saber como funciona, asi que elegí la pantalla de presentacion del Maniac Mansion. Si, el aguila esa que está con el diskette. La cuestion es que hay unas cosas que no logro entender que es lo que hace y poray alguien me puede dar una mano.

    0810   78            SEI                 ; Apaga las interrupciones
    0811   A2 FF      LDX #$FF       ; XR = $FF
    0813   9A           TXS                   ; SP = XR
    0814   A0 00      LDY #$00       ; YR = 0
    0816   84 01      STY $01           ; $01 = YR (6510 On-chip 8-bit Input/Output Register)
    0818   A2 CC      LDX #$CC       ; XR = $CC

    Aca lo que no entiendo es para que pone en cero la direccion $01 que por lo que me estuve fijando es un registro de I/O del micro?

    081A   BD 57 08   LDA $0857,X       ; AC = $0857+XR (Normal BASIC program space) $0858-$0923
    081D   9D 33 03   STA $0333,X        ; $0333+XR = AC (Tape I/O buffer, sprites)           $0334-$03FF
    0820   B9 1D 09   LDA $091D,Y       ; AC = $091D+YR (Normal BASIC program space) $091D-$0A1C
    0823   99 FF 00    STA $00FF,Y        ; $00FF+YR = AC (BASIC temp data area, Assembly Area for Floating point to ASCII conversion, Tape Input Error log,
                                                                    ;
    6510 Hardware Stack Area) $0FF-$1FE
    0826   CA               DEX                        ; XR = XR - 1
    0827   D0 02         BNE $082B           ; Si no es cero X saltar a $082B
    0829   A2 01         LDX #$01             ; XR = $01
    082B   88               DEY                        ; YR = YR - 1
    082C   D0 EC         BNE $081A           ; Si no es cero Y saltar a $081A

    Aca está copiando lo que está en $0858-$0923 a $0334-$03FF despues copia $091D-$0A1C a $0FF-$1FE, lo que no entiendo es para que copia esta parte de la memoria...

    082E   C6 2E        DEC $2E          ; $2E = $2E - 1 ($2E puntero al principio del area de variables??)
    0830   A5 2E        LDA $2E         ; AC = $2E
    0832   C9 08        CMP #$08       ; ¿ AC == $08 ?
    0834   F0 0D        BEQ $0843     ; Si es igual saltar a $0843
    0836   CE 3D 08   DEC $083D    ; $083D = $083D - 1
    0839   B1 2D        LDA ($2D),Y ; AC = ($2D+YR)
    083B   99 FF FF   STA $FFFF,Y ; $FFFF+YR = A
    083E   88              DEY                  ; YR = YR - 1
    083F   D0 F8        BNE $0839  
    0841   F0 EB        BEQ $082E   

    Que es la direccion de memoria $2E?? segun lo que encontré dice "Pointer: Start of BASIC Variables"
     

  • Las direcciones 00 y 01 son especiales, internas del microprocesador y manejan en la C64 el mapeo de la memoria y perifericos, que bloque es de ram, que de rom, que perifericos.

     Lo que pasa que esa rutina que agarraste es un cargador, y los cargadores son complicados, tene en cuenta que el "sistema operatico" tira el programa (cargador con el programa comprimido en realidad) en un lugar de memoria fijo (0x801 en adelante), y despues el cargador tiene que reemplazar ese contenido por el programa que va a correr, que puede estar comprimido, y ahi tiene que mover bloques de memoria de un lado para otro, aprovechando las areas mas bajas (menores a 0x801), siempre evitando pisarse a si mismo por supuesto.
      
     El basic tiene varios punteros indicando donde esta el programa y las variabels en la la RAM, el cargador tiene que actualizar esos punteros, porque si queres ejecutar un RUN por ejemplo, el basic se vuelve loco si no estan bien los punteros.

           Saludos
          MARCOS
     

  • 1)La dirección $01 maneja la configuración de memoria de la C64, si las ROM estan activas o no.

    Poniendolo a 0 se pone todo el mapa de memoria a RAM.

    2)Usualmente se mueven datos para aprovechar mejor la memoria. En este caso como un programa ejecutable con RUN se carga desde $0801, aca aparentemente mueve algunas rutinas a partes más bajas de memoria. Exactamente para qué no lo vas a saber hasta que avances más en el desensamblado. Tambien esta usando la parte de la pila del procesador, asi que se te puede llegar a complicar el desensamblado si lo que hace es usar esos datos precargados en la pila, te vas a romper la cabeza para deducir de donde salen las cosas.

    3)$2E es el byte alto del puntero de donde empiezan las variables del BASIC, o dicho de otra manera, donde termina el programa BASIC o hasta donde cargo el ultimo programa, +1. Por lo que veo parece estar copiando el final del programa hacia $FFFF (de atras hacia adelante, o sea, $FFFF, $FFFE, $FFFD, etc), y usa codigo automodificable.
     

  • oops, me tarde mucho en escribir la respuesta tongue
     

  • ok, si, es bastante complicado ese programa voy a ver si encuentro alguno mas simple para empezar... como es eso del codigo automodificable??? nunca escuché algo asi!
     

  • Codigo automodificable es algo que hace muy dificil leer el codigo fuente, porque el prorama (que corre en RAM, en el atari 2600 no se puede hacer) modifica los parametros de otra parte del codigo, por ejemplo hay un LDA 12 y mas adelante para pasar de 12 a 13, directamente se modifica la posicion de memoria donde esta el 12 al lado del LDA. Se usa mucho para usar punteros de 16 bits, porque con X e Y podes avanzar hasta 256 bytes en un LDA nnnn,X , para avanzar mas tenes que tocar la direccion nnnn a mano.

    No es una tecnica muy bien vista por los puristas de la programacion, y es muy molesto de leer el programa

    Saludos
    MARCOS
     

  • Codigo auto-modificable (self-modifying code) es cuando un programa sobreescribe parte de si mismo para cambiar su funcionamiento.

    En el caso de la intro que estas desensamblando fijate aca:


    0836   CE 3D 08   DEC $083D    ; $083D = $083D - 1
    0839   B1 2D        LDA ($2D),Y ; AC = ($2D+YR)
    083B   99 FF FF   STA $FFFF,Y ; $FFFF+YR = A
    083E   88              DEY                  ; YR = YR - 1
    083F   D0 F8        BNE $0839  
    0841   F0 EB        BEQ $082E   

    Nico

    La instruccion DEC$083D decrementa el tercer byte de la instruccion STA $FFFF,Y
    Por lo que la primera vez que el programa llegue a 083B va a ejecutar STA $FEFF,Y - la segunda STA $FDFF,Y y asi sucesivamente hasta que $2E sea igual a $08
     

  • ootra vez jaja!
     

  • Ejecuta
    LDA #nn
    JSR FFD2
    nn es el codigo ASCII que queres mostrar

    Esta vez contesto incluso antes de que hagan la pregunta asi me sigo adelantando a woz wink

    Saludos
    MARCOS
     

  • Todavia no entiendo bien como es el tema es del registro $01... si yo ejectuto estas 2 instrucciones, que estoy haciendo exactamente? LDA #$34 ; AC = %00110100 STA $01
     

Moderador (s): thierry, homecomputer, Selandari, pastbytes, Durandal