Autor Tema: Dudas en Ensamblador  (Leído 118767 veces)

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #255 en: Julio 22, 2015, 11:54:52 »
No pude encontrar un ejemplo de XOR en los punteros del raton, no recuerdo ahora en que sistema lo habia visto pero al parecer no era Windows 3.x ni MacOS, sin embargo el efecto era mas comun de lo que recordaba, se usaba para invertir los iconos seleccionados, cuando los iconos solian ser en blanco y negro (como en GEOS, o GEM Desktop del Atari ST), o para invertir una opcion de menu seleccionada. Lo que ganaban con eso era no tener que almacenar dos imagenes en memoria, y un poco de velocidad al evitar la transferencia de una imagen a la pantalla, ya que aplicaban XOR directamente en la VRAM.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #256 en: Julio 22, 2015, 12:16:44 »
Aca encontre el efecto XOR al que me referia, en juegos no es tan usado porque no siempre queda bien, es una tecnica usada cuando hay serias limitaciones de memoria y proceso, ademas de falta de colores.
El articulo esta en ingles pero de paso parece interesante, explica esa y otras tecnicas, y las imagenes son bastante claras:
http://stevewetherill.com/blog/2014/09/17/heartland-for-zx-spectrum/
En la parte donde dice XOR Technique se ve la imagen de un "sprite" con la mitad del fondo en blanco y la otra en negro, y el personaje siempre se ve bien.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #257 en: Julio 22, 2015, 12:56:39 »
"EOR #$ff" hace exacamente eso.

Código: [Seleccionar]
   lda #%00000001
   eor #%11111111      ; ahora A = %11111110

   lda #%00001111
   eor #%11111111      ; ahora A = %11110000


Sabía que lo tenía enfrente de la nariz... gracias.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #258 en: Julio 22, 2015, 12:57:37 »
Mi código aun mas corto en 3,2,1...

Claro! para eso mismo lo quería usar yo :D

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #259 en: Julio 22, 2015, 12:59:32 »
Aca encontre el efecto XOR al que me referia, en juegos no es tan usado porque no siempre queda bien, es una tecnica usada cuando hay serias limitaciones de memoria y proceso, ademas de falta de colores.
El articulo esta en ingles pero de paso parece interesante, explica esa y otras tecnicas, y las imagenes son bastante claras:
http://stevewetherill.com/blog/2014/09/17/heartland-for-zx-spectrum/
En la parte donde dice XOR Technique se ve la imagen de un "sprite" con la mitad del fondo en blanco y la otra en negro, y el personaje siempre se ve bien.

Para que el efecto quede bien hay que usar máscaras y sincronizar con el barrido, sino el efecto es bastante inmundo :P

Me recuerda a los juegos de la primera época del PC-XT, sprites monocolores que parpadeaban sobre el fondo... lloraba pensando en mis sprites de C64 a color :'(

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #260 en: Julio 22, 2015, 14:13:40 »
¿Hay alguna convención a la hora de escribir código en ensamblador?

Son muy útiles, aunque luego cada uno tiene sus gustos personales, no es mala idea seguir unos lineamientos generales.

Por ejemplo mayusculas o minusculas en labels, constantes (o etiquetas con direcciones de memoria), usar guion bajo, poner los labels en una linea distinta o en la misma del código. Usar ":" al declarar label.
Etc, etc.

Para PHP+Codeigniter yo usé una guía que me resultó muy útil, supongo que para esto debería haber algo.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #261 en: Julio 22, 2015, 14:31:44 »
En este mismo hilo, por el final de la primera pagina, se hablo de ese tema de los estilos para escribir en asm.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11304
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #262 en: Julio 22, 2015, 14:39:27 »
Gracias, lo he releido.

Debo decir que me resulta bastante antinatural escribir las instrucciones en mayusculas, lo veo bien en C64 pero en notepad-loquesea no, basicamente porque por defecto se escribe en minusculas.

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 534
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #263 en: Julio 22, 2015, 14:52:36 »
Yo las escribo como salen en las hojas de datos oficiales, las del 6502 salen en mayusculas, lo mismo que las del Z80, las de los microcontroladores PIC salen en minusculas, y asi las escribo.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 641
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #264 en: Julio 22, 2015, 16:54:56 »
¿Hay alguna convención a la hora de escribir código en ensamblador?
...

Respuesta corta: No

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Dudas en Ensamblador
« Respuesta #265 en: Julio 22, 2015, 19:46:16 »
Como dijo Carlos, no lo hay.  Mi consejo es que seas consistente. Usa la convención que quieras, pero no mezcles convenciones dentro de un mismo archivo... (y mejor aun, no mezcles dentro de un mismo proyecto).

Actualizo:
A veces ciertos ensambladores tienen sus propias sugerencias. Por ejemplo, en ACME se estila utilizar la extensión ".a" para los archivos. En ca65, se suele usar la ".s". En KickAssembler se utiliza la ".asm"... pero son solo conveciones. Que indentación usar, si usar mayúsculas o minusculas, si usar CamelCase o underscore_case, es usa cuestion de gustos.
Y esto es válido para otros lenguajes también como C++, C, etc...
Por ahora el único lenguaje que conozco que tiene una guia oficial de como programalo es Python: https://www.python.org/dev/peps/pep-0008/
« última modificación: Julio 22, 2015, 19:56:28 por riq »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #266 en: Julio 22, 2015, 22:29:35 »
Debo decir que me resulta bastante antinatural escribir las instrucciones en mayusculas, lo veo bien en C64 pero en notepad-loquesea no, basicamente porque por defecto se escribe en minusculas.

  Estas flipando Jose?,..a mi me parece mas antinatural escribir en minusculas,...el Commodore te muestra las letras en mayusculas por defecto y yo en el Notepad lo hago asi (en mayusculas) al igual que en la Maquina Original.

  basicamente porque por defecto se escribe en minusculas

  Pero eso donde lo pone?,...seran en los lenguajes C estos en los que te manejas....

  Para terminar pongo dos ejemplos: gente como Silicebit o Madonna (de los que he aprendido mucho) programan en Mayusculas y creo que estamos hablando de dos programadores de primera!!!,..,,que pasa que esta gente es gilipollas y no sabe lo que se hace?,...ja,j,aj,aj,ja
« última modificación: Julio 23, 2015, 01:18:58 por josepzin »

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #267 en: Julio 22, 2015, 22:35:09 »
Passbytes:
No te mates buscando el ejemplo. Tengo máquinas (pockets PC) con pantalla LCD bicolor y se aprecia lo que comentas.

Citar
    Mi código aun mas corto en 3,2,1...


Claro! para eso mismo lo quería usar yo :D

Ahí esta el por qué he usado ADC para activar o desactivar el MSB.

Estoy encantado con las clases que estoy recibiendo. Tengo material para practicar durante todo el fin de semana.

LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #268 en: Julio 22, 2015, 22:42:23 »
¿Hay alguna convención a la hora de escribir código en ensamblador?

Caray!!
Ya me lo leeré, aunque para mi mientras esté claro y bién comentado, me da igual mayúsculas como minúsculas.

Passbytes:

El link sobre EOR, OR y demás es superinteresante. Lastima que con el inglés me va a costar comprenderlo al 100% y google translator es un cachondo con las traducciones y me desconcentra con las burradas que traduce de vez en cuando.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #269 en: Julio 23, 2015, 23:06:49 »
Retomando el tema principal.
Aquí esta mi código retocado con lo aprendido. Como se puede observar, aplicando EOR ya no necesito dos rutinas para conectar o desconectar el byte deseado del MSB.

Es un poco mas corto pero no lo que me gustaria. Tratare de acortarlo mas enfocandolo de otra manera.
Es lo bueno del ensamblador.

No pongo el PRG por que funciona exactamente igual que el otro, solo que es un poquiiiito mas pequeño .

Código: [Seleccionar]
                ;CMB prg studio
; 10 SYS (4096)

*=$801

        BYTE    $0E, $08, $0A, $00, $9E, $20, $28,  $34, $30, $39, $36, $29, $00, $00, $00

ciapra=$DC00    ; Joy2
msb=$D010       ;MSB >255
posprites=$D000   ;Coordenadas sprites D000-D00F
sprena=$D015     ;Sprites visibles o no
Posmemspr=$07f8  ;64*x Posicion memoria sprites 2040

*=$1000
       
;Conectando sprites:
        lda #255
        sta $d015       ;Conecto sprites
        ldy #00
loopsa  sta 2040,y        ;Pos mem sprite 0 2040-2047 sprite 0 al 7
        iny
        cpy #08
        bne loopsa

       
        ldy #00
        ldx #00
loopsb  lda corspritesx,x            ;Leo coordenadas sprites (solo el 0 para las pruebas)
        sta posprites,y     ;Posiciones coord X
        iny
        iny
        inx
        cpx #8
        bne loopsb

        ldy #00
        ldx #00
loopsc  lda corspritesy,x
        sta posprites+1,y
        iny
        iny
        inx
        cpx #8
        bne loopsc
        lda #00
        sta msb

;Empieza el programa en si
;Para mover los sprites , hay que ir dandole pulsos en la direccion que se quiera.
;Si no lo hago así, se mueven demasiado deprisa ;) . Un bucle lo arreglaria, pero no quieroooo.

loop     ldx#00  ; X controlara los sprites que se usen. Para el ejemplo serán los 8 (0-7)

                ; Lectura Joystick puerto2 y decidir que hacer.
loopjoy1        lda ciapra      ;Leer posicion joystick
                cmp #127        ;Si no esta en el centro
                bne loopjoy1    ;Sigo en el bucle hasta que lo sueltes
loopjoy2        lda ciapra      ;Leer posicion joystick
                cmp #119        ;Valor derecha
                beq der         ;Si o es, pues a mover hacia la derecha
                cmp #123         ;Valor izquierda
                beq izq         ;Si lo es, pues a mover izquierda
                jmp loopjoy2    ;Cualquier otra cosa, a esperar a las dos posibles direcciones.
;En un juego se controlaria la coordenada actual y si estuviera en sus limites se impediria
;la funcion de la direccion correspondiente.
;En este caso, se tendria que tener en cuenta si su MSB esta activado o no.

der             lda corspritesx,x ;
                clc               ;Cary a 0
                adc #01           ;Sumo 1 a la coordenada X
                bcs msbOnoff         ;Acarreo activado >255 conecto MSB
                jmp cont          ;Si no se a activado seguimos.

izq             lda corspritesx,x ;
                sec               ;Carry a 1 para restas
                sbc #01           ;Resto 1 a la coordenada X
                bcc msbonOff        ;Carry desactivado <0 Desconecto MSB
                jmp cont          ;Si carry sigue activado, seguimos

msbOnoff        tay             ;Guardo Acu en Y (contiene el alor de la coordenada x aun sin guardar)
                lda msb         ;Carga Acu con el valor actual de MSB
                eor valbmsb,x   ;Conecto o desconecto el byt de la variable segun el sprite en curso.
                sta msb         ;Guarda el nuevo valor con el sprite activado/desactivado su MSB
                tya             ;Recupero Acu de Y
                jmp cont        ;Sigo con el programa

cont            clc
                pha             ;Guardo Acu en la pila para no perderlo. Una veriable cualquiera ;)
                txa             ;Acu obtiene el valor de X
                rol             ;Lo multiplico por 2
                tay             ;Le doy el nuevo valor a Y para posprites
                pla             ;Recupero Acu antes guardado
                sta corspritesx,x       ;Guardar posicion sprite X
                sta posprites,y         ;Guardar coordenada sprite X
                sta $0400        ;Control visual para ver la coordenada X del sprite
                stx $0401        ;Control visual para ver el valor del registro X
                sty $0402        ;Control visual para ver el valor del registro Y
                inx              ;Pasemos al siguiente Sprite.
                cpx #08          ;Estoy ya en el último Sprite?
                bne loopjoy1     ;=NO. Sigo con el bucle de muestreo
                jmp loop         ;=SI. Repetimos ciclo desde cero


*=$3000
;Las 8 coordenadas de los sprites almacenadas aqui
corspritesx byte $fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe
corspritesy byte $50,$60,$70,$80,$90,$a0,$b0,$c0
valbmsb byte $01,$02,$04,$08,$10,$20,$40,$80 ;Byte MSB a conectar o desconectar segun se necesite
« última modificación: Julio 23, 2015, 23:09:47 por Maniako »
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.