Foro de Assembler

Hola
Debes decidir si vas a programar microprocesadores o microcontroladores, los lenguajes ensambladores, no son conmutables.

Si estas probando con el emo8086, te estas dirigiendo a lo microprocesadores, en tan caso mejor lee assem2.

Bueno, logras edit la fuente, y cuando presionas emulate no aparecen las ventanas, emulator:noname.com y original source code?

...
 
Perdonad que no haverte dado la bienvenida bro KzK pero como dije antes he estado muy atareado...como sea es muy bueno que alguien mas se una a este tema en especial si conose mas que venom and IO....asi que gracias y bienvenido....ahora bro dijste que te interesa esto del assembler por los pics...asi que te sugiero que le heches un vistazo al tema de pics que hay en electronica...hay me han basiado un poco pero igual te ha de servir mucho...en cuanto a lo del asembler para procesadores ese es el tema nucleo aqui asi que con gusto lo que necesites...gracias por contestar mi duda respecto a como imprimir.
----------------------------------------------------------------------------------------------------------------------

pasando a otra cosa viejo venom tenes que pillar como dij KzK que lo que metes en el emu8086 sea assembler base de procesadores si no solo te saldran errores...en cuanto a lo del ajemplo que abriste en el emu8086 le das emulate...las dos ventanas que te salen son las del codigo original y las de los procesos en memoria...para ver correr el programa le das al boton run de la ventana de procesos o mejor mi favorito le das single step y vas viendo como cada linea desencadena un proceso...suerte pues ya te embie un MP con el serial del emu....
 
Bueno primero que todo me disculpo por no haber podido cumplir mi promesa de hacer el tuto en semana santa....pero como dije me ha tocado bastante duro....bueno pero hay en mis pocos ratos libres he podido hacer algo.

Trabajando con un ejemplo del emu8086 v4.05 llamado "compare numbers" he creado este miniprograma que realiza las funciones principales de todo software
(recibir datos---procesar datos---presentar resultados), y como que mejor forma de aprender que con un ejemplo pos aqui dejo el codigo comentariado...si he cometido algun error garafal en los comentarios por favor corrijanme:

Bloques
Comentarios
Cadenas de texto

Código:
name "Comparar"[COLOR=Green][B];Nombre del programa.[/B][/COLOR]

org 100h[COLOR=SeaGreen][B];[COLOR=Green] Direccion de arranque del programa en memoria.[/COLOR][/B][/COLOR]
  
[B][COLOR=Green];Imprime la cadena de inicio.[/COLOR][/B]
mov dx, offset ini 
mov ah, 9
int 21h       
                    [B][COLOR=Green]
;Inicio del sistema.[/COLOR][/B][B][COLOR=DarkOrange][COLOR=Red]
Run: [/COLOR]  [/COLOR][/B]
      [B][COLOR=Green] ;Imprime la cadena n1.[/COLOR][/B]
       mov dx, offset n1 
       mov ah, 9
       int 21h

       [B][COLOR=Green]; Lee el primer numero (caracter) en al.
       ;Se lee con el registro alto ah y se guarda en el registro bajo al.
[/COLOR][/B]        mov ah, 1 
       int 21h     
                 
      [B][COLOR=Green] ;Copia el contenido de al en bl.
       ;Esto debido a que ah es el unico registro facultado a manejar la int 21h. [/COLOR][/B]
       mov bl, al
                        
   [B][COLOR=Green]    ;Imprime la cadena n2.   [/COLOR][/B]              
       mov dx, offset n2 
       mov ah, 9
       int 21h
             
       [B][COLOR=Green]; Lee el segundo numero (caracter) en al. [/COLOR][/B]     
       mov ah, 1
       int 21h
       
       
       [B][COLOR=Green];Compara bl con el minimo posible.[/COLOR][/B]
       cmp bl, '0'
       jb parar[B][COLOR=Green]; LLama al retorno jb.[/COLOR][/B]
                                  
       
       [B][COLOR=Green];Compara a bl con el maximo posible. [/COLOR][/B]                          
       cmp bl, '9'
       ja parar[B][COLOR=Green]; LLama al retorno ja.[/COLOR][/B]
                 
     [B][COLOR=Green]  ;Compara los dos numeros.          [/COLOR][/B]
       cmp bl, al
       
       jb Menor[B][COLOR=Green]; Salta al Bloque Menor.[/COLOR][/B]
       
       ja Mayor[B][COLOR=Green]; Salta al Bloque Mayor.[/COLOR][/B]
       
       mov dx, offset igual_n[B][COLOR=Green]; Carga la cadena igual_n [/COLOR][/B]
       jmp Imprimir[B][COLOR=Green]; Salta al Bloque Imprimir.
[/COLOR][/B] 
        
[B][COLOR=Red]
Menor:[/COLOR][/B] [B][COLOR=Green];Se invoca si el primer numero es menor al segundo.[/COLOR][/B]
       mov dx, offset menor_n[B][COLOR=Green]; Carga la cadena menor_n.   [/COLOR][/B]  
       jmp Imprimir[B][COLOR=Green]; Salta al Bloque Imprimir. 
[/COLOR][/B] 
         
[B][COLOR=Red]
Mayor:[/COLOR][/B] [B][COLOR=Green];Se invoca si el primer numero es mayor al segundo.[/COLOR][/B]
       mov dx, offset mayor_n[B][COLOR=Green]; Carga la cadena mayor_n.[/COLOR][/B]
       jmp Imprimir[B][COLOR=Green]; Salta al Bloque Imprimir.[/COLOR][/B]
          
                   [B][COLOR=Red]

Imprimir:[/COLOR][/B] [B][COLOR=Green];Imprime la cadena cargada en dx.[/COLOR][/B]
          mov ah, 9
          int 21h
          jmp Run  [B][COLOR=Green]; recarga el ciclo.[/COLOR][/B]


[B][COLOR=Red]
parar:[/COLOR][/B] [COLOR=Green][B]; Pausa en la ejecucion.[/B][/COLOR]
        ret  

                                     
[B][COLOR=Green]
;Declaracion de "Cadenas" (varibles) a usar en el programa [/COLOR][/B]                                    

ini db [COLOR=RoyalBlue]"      -----Ingrese Dos Numeros A comparar O Dos Caracteres Para Salir-----      ",10,13,"$" 
[/COLOR] 
n1 db [COLOR=RoyalBlue]"Ingrese Primer Numero:  $"[/COLOR][B][COLOR=Green];Produce una cadena sin salto de renglon.[/COLOR][/B]
n2 db[COLOR=RoyalBlue] " --- Ingrese Segundo Numero:  $"[/COLOR]
igual_n db[COLOR=RoyalBlue] " --- Numeros Iguales    " ,10,13, "$"[/COLOR][B][COLOR=Green]; Produce una cadena con salto[/COLOR][/B].

menor_n db [COLOR=RoyalBlue]" --- El Primero Es Menor" ,10,13, "$"[/COLOR][B][COLOR=Green]; 10,13 Indica reserva de memoria. [/COLOR][/B]
mayor_n db [COLOR=RoyalBlue]" --- El Primero Es Mayor" ,10,13, "$"[/COLOR]; [B][COLOR=Green]"$" es equiparable a "\n".[/COLOR][/B]
Hay muchas cosas en este programita que se pueden simplificr...eso lo se pero lo deje asi para darle la apariencia mas simple y clara posible...si me pase pos perdon por la simplicidad...fue lo mejor que pude hacer entre cambios de aceite y reeplazos de cadena....jeje

Bueno pero el asunto de esto es verlo corriendo asi que les adjunto el codigo .asm y el ejecutable .com asi como otros dos mini programitas comentariados...suerte y ojala sirvan de algo a alguien.
 

Archivos adjuntos

  • Ejemplos.rar
    2.4 KB · Visitas: 456
Perdonad que no haverte dado la bienvenida bro KzK pero como dije antes he estado muy atareado...como sea es muy bueno que alguien mas se una a este tema en especial si conose mas que venom and IO....asi que gracias y bienvenido....ahora bro dijste que te interesa esto del assembler por los pics...
Hola sairus black, gracias por la bienvenida, si es cierto por el tema de la electronica es que estoi por aca, pero no tanto por el campo de los pic, sino mas bien por el tema de control via PC, conectarle "bichos rarros" al computador, ya he jugado leyendo señales de controles remotos, esos de TV, las tipicas conecciones de motores y led ( luces ), al puerto paralelo, pero con programas en asm bien rudimentarios, por ello es que quisiera afinar mis bajos conocimientos de programacion y compartir algo para apoyar a mas personas, a si que eso, lo mio es perifericos, sera tipico que les deje cosa que tengan que ver con la pantalla, el teclado, puertos, etc, etc, ...lo malo es que he sabido y me estoi dando cuenta que el XP es sumamente "celoso de sus sentidos" :lick:

Aprovecho de recomendar El universo digital del IBM PC, At y PC/2 y el tutoria de AESOFT, con los que comenze y me iluminaron mi camino en este oscuro mundo.

Luego quisiera comentar los codigos que compartamos, de ese modo iremos fortaleciendo nuestra informacion.

Saludos
KZK.
 
hoye bro el xp moles mucho con los puertos io hace poco tube que hacer un circuito que reciviera y enviara datos por el puerto paralelo....fue muy canson pero menos mal aqui me ayudaron y con un paquetico llamado useport.zip logra quitarme el problemita y mi circuito quedo de perlas chacte esto:
http://mundobyte.wordpress.com/2007/12/22/puerto-paralelo-parte-ii/

suerte hay tamos posteando.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Bueno bros termino la semana santa mas agitada de mi vida ahora si en que nos quedamos......ahhhhh si en las interrupciones...por hay atras deje una minilista en español...y de donde bajar el remanual pero en ingles....bueno la verdad esto de las interrupciones en assembler es la mama de la mama si se aprenden a usar bien se puede hacer cualquier cosa con el pc....hasta ahora emos usado la int 21h y eso a medias, ahora no se si les parece pero creo que seria bueno hacer algunos programitas piloto para ilustrar el uso de alguns interupciones las mas utiles....bueno creo que voy a hacer eso....y las coloco aqui...si hay algo que crean mas urgente y util pos me dicen y a ver que hacemos como dige antes se aceptan sugerencias...

Ha y otra cosa alguien por favor califique este tema...esque ya me canse de ver estrellitas por todo lado menos aqui...seguro que saben como y si no pos arriba a mano derecha esta....aunque sea una de terrible....jeje no es broma....queria escribir esto hace rato ya me desaogue....jejeje.
 
hoye bro el xp moles mucho con los puertos io hace poco tube que hacer un circuito que reciviera y enviara datos por el puerto paralelo....fue muy canson pero menos mal aqui me ayudaron y con un paquetico llamado useport.zip logra quitarme el problemita y mi circuito quedo de perlas chacte esto:
http://mundobyte.wordpress.com/2007/12/22/puerto-paralelo-parte-ii/

Vale el dato!
Lo voy a probar y te cuento como me va, ...aproposito, existira un driver para el puerto 60h/64h del teclado, con el que pueda programar el micro de estos, desde esto, llamado XP?, es que en mis antiguos pc con DOS, 95 u 98, podia manejas hasta las luces de teclado, y ahora no pasa nada!

Un comentario general, "Recordar que la Int son "rutina" asm, con uso de registros, que no siempre esta a la vista, esto a la hora de dejar datos utiles de nuestra rutina en ellos o los punteros de segmentos adecuados, que se deben considerar, al entrar y salir de una de ellas."

Por ejemplo en codigo modificado de "Hello World", el DS es igual a CS, de ese modo los datos se tomaran desde ese segmento, DS:DX, si se modifico antes DS, los datos seran otros, esto se explica en ese mismo codigo en la lineas de:

mov ax, 0b800h
mov ds, ax

para poder manipular las direcciones de pantalla, se cambia DS, que se asocia a DI, no explicitamente, pero si por defecto.

** Buscar modos de direccionamiento **

Por mi parte me parece que le des a las Int mas utiles, y apartir de alli se podra ir comprementando con mas informacion.

Yo quisiera ir compartiendo codigo, estoi desarrollando unas rutinas de uso general, que me permitiran recuperar algunos conceptos y que pueden quedar como demos, este es el primero.

Código:
[LEFT] name "Colore10"                                              
; Colorea la pantalla pixel a pixel
; Utilizando Int 10h

org 100h
    mov ax, 0013h         ;Modo video grafico 320x200 pixels
    int 10h             ;Activa modo de video
    
    jmp j1              ;Inicia numero de linea
         
c2: mov dx, posy        ;Carga numero de linea
    mov al, color       ;Carga color de Pixel
    mov cx, 319      ;Carga numero de columna maxima
c1: mov ah, 0ch         ;modo un pixel
    int 10h             ;Activa pixel
    
    dec cx              ;Decrementa columna
    jns c1              ;Si >0 salta

    mov ah,6        ;Entrada/Salida directa a teclado
    mov dl,255        ;Habilitado como entrada
    int 21h        ;Lee teclado
    jnz j2         ;Controla presion de tecla
               
    dec posy        ;Decrementa linea
    jns c2        ;Si >0 salta
    
    inc color        ;Cambia color
j1: mov posy, 199    ;Reinicia linea
    jmp c2        ;Proxima pantalla
         
j2: mov ax,0003h    ;Modo texto normal
    int 10h           ;Activa modo
    ret            ;Termina y cierra rutina
    
posy dw 0        ;Guarda posicion vertical, linea
color db 15        ;Guarda Color

end
[/LEFT]
Instrucciones :

mov => copia segundo argumento a primer argumento
Int 10 => Modo de video grafico
jmp => Salta a la etiqueta indicada
dec => Decrementa contenido de argumento
jns => Salta si SF = 0
int 21 => ???
jnz => Salta si ZF = 0
dec => Incrementa contenido de argumento
ret => Sale de la rutina actual

Eso, la idea es encontrar optimizaciones, luego subo la version 1.5
Compilen y corran el .com

Saludos
KZK
 
Hola
La siguiente rutina cumple similar objetivo del anterior ( pintar pixel a pixel la pantalla, a un color por pantalla ), la diferencia es no utilizar la Int 10 para activar el color del pixel, se escribe directamente en la zona de pantalla grafica, 0A000h, aca se nota la diferencia de velocidad, al camparar diferentes formas de pintar un pixel.

Código:
name "Colore15"
; Colorea utilizando rutina propia
; Escribe en memoria lineal

org 100h
    mov ax, 0013h         
    int 10h

c2: mov ax, 0A000h  ;Carga direccion de pantalla
    mov es, ax           ;Activa segmento
    
    mov bx, 64000      ;Carga direccion inicial
    mov ah, color        ;Carga Color

c1: dec bx                 ;Decrementa direccion
    mov es:[bx], ah     ;Coloca pixel en pantalla
    jnz c1                    ;Si es positivo salta
       
    mov dl,255      
    mov ah,6
    int 21h
    jnz j1 
    
    inc color
    jmp c2
         
j1: mov ax,0003h
    int 10h
    ret


color db 15
end
Nota : No existen instruciones nuevas a comentar, y solo la nuevas lineas son comentadas dentro del codigo.

Saludos
KZK
 
Bien, tercer codigo

Este se aproxima al primero, en el sentido de que ponemos los pixeles utilizando coordenada X,Y ( horizontal/vertical ), una rutina propia aun mas optima en velocidad

Código:
name "Colore20"
; Colorea la pantalla pixel a pixel
; Utilizando rutina propia por coordenadas 

org 100h
    mov ax, 0013h
    int 10h
    
    mov ax, 0A000h
    mov es, ax
           
c3: mov posy, 199
c2: mov posx, 319
   
                    ;Si, Pos = ( PosY * 320 ) + PosX
                    ;para, PosY * 320, = PosY * 255 + PosY * 65
c1: mov bx, posy    ;Carga Multiplicando 1
    mov al, 255     ;Carga 1ra parte 
    mul bl          ;PosY * 255
    
    mov dx, ax      ;Guarda resultado 1
    
    mov al, 65      ;Carga 2da parte
    mul bl          ;Posy * 65
    
    clc             ;Prepara suma
    adc ax,dx       ;Resultado1 + resultado2
    
    clc             ;Prepara suma
    adc ax, posx    ;( 320 * PosY ) + PosX, OK!
    
    mov bx,ax       ;Carga Puntero base de Memoria
    mov ah, color   ;Carga color de pixel         
    mov es:[bx], ah ;Activa pixel
        
    dec posx        ;Decrementa columna
    jns c1          ;Si es positivo salta
        
    dec posy        ;Decrementa linea
    jns c2          ;Si positivo salta
    
    mov dl,255
    mov ah,6
    int 21h
    jnz j1
    
    inc color
    jmp c3
         
j1: mov ah,0003h
    int 10h
    ret

    
posx dw ?
posy dw ?
color db 15

end

Nota : No existen nuevas instrucciones que comentar, lo nuevo se comenta, lo interezante es el trozo de codigo que utilice para calcular las posiciones X,Y ; no se si sera la ideal, solo la desarrolle como se me ocurrio, poderia existir otras y mejores opciones....???

Listo, estoi tratando de avanzar siguiendo una linea comun, la idea es que los codigo se vayan desarrollando por si mismos, de este modo ademas de ejercitar instrucciones, se van conociendo recursos.

Hasta la proxima!

Saludos
KZK
 
muy buenos aportes bro KzK....ahora si vamos avanzando...por lo pronto me dedicare a las interrupciones para el manejo de ficheros...pos es algo muy util a y un poco de teoria respecto a la cola...jeje espero tenerlos listos para este sabado o maximo domingo....jeje aproposito gracias por la calificacion.....!ALFIN ESTRELLITAS....JEJEJE¡
 
Bien!, dale con esas teorias, me interezaria saber sobre eso, que es algo de las muchas cosas que no he visto aun, vamos abarcando.

estoi preparando la continuacion de otros demos, me tope con una limitacion del emu, con respecto a algunos puertos, pero por el momento siguire tratando que sean compatibles con el emu para que los que empiezen en esto puedan probar los procesos.

Se bienen cosas mas llamatibas.

Saludos
KKZ
 
Demo 4

Cuarto codigo

Aca, simplifique la multiplicacion, ( es mas sencillo de lo que habia compredido antes, je,je ), aparte de las nuevas instrucciones y otras que deje pendientes, aca lo destacable es el uso del puerto 3DAh, que permite sincronizar los cambios de la imagen con la velocidad de refresco de video, esto principalmente nos evita una imagen cortada o parpedeante, ademas de darnos una base de tiempo para animaciones.

Código:
[LEFT] name "Colore25"
; Coloca objeto en posicion deseada

ancho equ 200
alto equ 100

org 100h
    mov ax, 0013h
    int 10h

    mov ax, 0A000h
    mov es, ax
    
j1:
    mov posx, (320/2)-(ancho/2)
    mov posy, (200/2)-(alto/2)

call pon_objeto

    inc color
    mov dl, 255
    mov ah, 6
    int 21h
    jz j1
    
    ret

pon_objeto proc
    mov  dx, 3DAh       ;Puerto VGA, 3erBit 
c1:                     
    in   al, dx         ;Carga puerto 
    test al, 8          ;Prueba 3vo bit
    jnz  c1             ;Si =0, espera 
c2: 
    in   al, dx         ;Carga puerto 
    test al, 8          ;Prueba 3er bit 
    jz   c2             ;Si =1, espera
     
    mov cx, alto
                        ;(Y * 320) + X
c4: mov ax, 320         ;Carga 320
    mul posy            ;* Y
    clc                 ;Prepara suma
    adc ax,posx         ;+ X    
    mov di, ax          ;Carga (X,Y) lineal
    
    mov bp, ancho       ;Carga contador del ancho en pixeles
    mov al, color       ;Carga color del pixel

c3: mov es:di+bp, al    ;Activa pixel 
    dec bp              ;Decrement X
    jnz c3              ;Si <>0 salta
    
    inc posy            ;Incrementa Y
    loop c4             ;Si <>0 salta
    
    ret                 ;Sale de procedimiento
    
pon_objeto endp

color db 15
posx dw ?
posy dw ? 

end
[/LEFT]
Instrucciones:

jz => Salta si SF = 1
in => Lee puerto
test => Logica AND de todos los bits, entre ambos argumentos
mul => Multiplicacion entre argumentos
clc => Limpia acarreo, CF = 0
adc => Suma entre argumentos
loop => Decrementa CX, si CX <> 0, salta

Directivas :

equ => Asigna igualdad
db => Carga un valor de un Byte, en una direccion
dw => Carga un valor de dos bytes, en un par de direcciones continuas
org => Asigna direccion de comienzo de codigo
end => Finan del codigo fuente

Saludos
KZK
 
super bro...gracias...hey que verguenza...otravez incumpli mi plazo...lo que pasa es que como raro el vista se tosto...y tube que formatear y reinstalar todo es que ahora tengo mandriva one...jeje bueno esto no viene al caso...por ahora voy a darle duro a ver si mañana en la noche termino el demo de como crear y leer archivos...pero si no alcanso me disculpo de antemano...jeje.

Hey viejo venom como seguis hace rato que no posteas aca....?
 
ummmmmmmmmm que pena se me cahe la cara de verguenza pero es que de veras....toy reocupado....es que andamos en semana de proyectos y apenas si me queda tiempo de navegar...bueno espero me disculpen....ya pondre los tutos cueste lo que cueste...
 
HOLA, BUENA CON ENSAMBLADOR, TENGO UN ROLLAZO BROS CON LA DISKTERA AVER SI ME SOLUCIONAN UN POCO ESTO, NECESITO LAS MACROS O PROC PARA DESHABILITAR Y VOLVER A HABILITAR LA UNIDAD DE DISCO (DISKETERA) ES UN TRABAJO Y NO TENGO IDEA DE COMO HACERLO, AUN SOY UN PRINCIIANTE PORFAVOR AYUDENEME SI PUEDEN ME LO ENVIAN A MI MAIL, kevincitox@hotmail.com, AGRADEZCO DE ANTEMANO SU AYUDA, GRACIAS
 
HOLA BROS, NECESITO LAS MACROS O PROC NECESARIOS PARA PODER DESHABILITAR Y HABILITAR LA DISKTERA, SI ALGUIEN ME LAS PUEDE PROPORCIONAR ENVIARLAS A MI CORREO PORFAVOR, kevincitox@hotmail.com LES AGRADEZCO MUCHO EL PAORTE SOY NUEVO EN ESTO Y QUIERO APRENDER, GRACIAS!!!!!
 
HOLA BROS, NECESITO LAS MACROS O PROC NECESARIOS PARA PODER DESHABILITAR Y HABILITAR LA DISKTERA, SI ALGUIEN ME LAS PUEDE PROPORCIONAR ENVIARLAS A MI CORREO PORFAVOR, kevincitox@hotmail.com LES AGRADEZCO MUCHO EL PAORTE SOY NUEVO EN ESTO Y QUIERO APRENDER, GRACIAS!!!!!

seguro que algun bro ha de saber....tal vez tu KzK....la verdad io no me he metido en el cuento de las macros...pero bueno cosa de paciencia....una cosa bro tean cuidado con los post multiples...a muchos nos pasa...pero hay que hacer lo posible para evitarlos....suerte.
 
Hola muchachos.

Bueno, nose mucho mas que uds, pero de un libro encontre esta pista :

INT 13H
Esta llamada controla las unidades de disco flexible (5 1/4 o 3 1/2) y tambien las unidades de disco fijo o duro conectados al sistema. la tabla A-7 lista las funciones disponibles para esta interrupcion por medio del registro AH, El control directo de un disco flexible o duro puede acarrear problemas. Por lo tanto proporcionamos solamente un listado de las funciones, sin los detallles de su uso. Antes de utilizar estas funciones, consulte el manual de BIOS disponible de la compañia que fabrico su version de la ROM del BIOS. Nunca utilice estas funciones en operaciones normales de disco.

Si se necesita podria trascribir las funciones que se mencionan, aun no he encontrado rutinas especificas, pero siguire buscando.

....

Ref.:"Los Microprocesadores Intel", Arquitectura, programacion e interfaz de los procesadores 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro y Pentium II, de Barry B. Brey, 966 paginas
 
Demo 5

Continuando los demos y manteniendo el avance de la estructura, el siguiente demo, ademas de dibujar en posicion y zonas controladas, agrega el movimiento controlado por las teclas de direccion, notar que se utiliza la interrucion 21H, funcion 06FFh, cuya caracteristica es la lectura dinamica del teclado, osea no se detiene a la espera de una pulsacion de tecla.

Código:
name "COLORE30"
; Coloca objeto en posicion deseada
ancho equ 150
alto equ 100
xmax equ 320-ancho
ymay equ 200-alto
 
org 100h
    mov ax, 0013h
    int 10h
    mov ax, 0A000h
    mov es, ax
    
    mov posx, (320/2)-(ancho/2)
    mov posy, (200/2)-(alto/2)
         
j1: mov al, color
    mov buffer, al      ;Guarda color actual
        
    call pon_objeto     ;Dibuja objeto

c3: mov dl,255
    mov ah,6
    int 21h
    ;jz c3
    mov key, al
    
    mov  dx,3DAh        ;Retado vertical 
c1: in   al,dx 
    test al,8 
    jnz  c1 
c2: in   al,dx 
    test al,8 
    jz   c2

    mov buffer, 0       ;Color Cero
    call pon_objeto     ;Borra objeto
    inc color
      
    cmp key, 1Bh        ;Escape
    jnz j2
    ret
    
j2: cmp key, 77         ;Derecha
    jnz j3
    inc posx
j3: cmp key, 75         ;Izquierda
    jnz j4
    dec posx
j4: cmp key, 72         ;Arriba
    jnz j5
    dec posy
j5: cmp key, 80         ;Abajo
    jnz j1
    inc posy
    jmp j1 
    

pon_objeto proc
    push posy
    mov cx, alto        ;Alto
            
c01:mov bx, posy    
    mov ax, 320 
    mul bx              ;320*Y
   
    clc
    adc ax, posx        ;+X    
    mov di, ax          ;POS X,Y
    
    mov bp, ancho       ;Control ancho de linea
    mov al, buffer      ;Buffer de Pintado/Borrado
c02:mov es:di+bp, al    ;Activa Pixel
    dec bp              ;Otra columna
    jnz c02
    
    inc posy
    dec cx              ;Otra linea
    jnz c01
    pop posy            ;Recupera Y
    ret
pon_objeto endp

posx dw ?
posy dw ?
color db 15
buffer db ?
key db ? 

end
Eso, la proxima vez comento las instruciones nuevas.

Saludos
KZK
 
voy a tener que pasar mas seguido por estos lados...
mis conocimientos en Asembler no son muchos q digamos....
saludos y gracias por la info.
 
muy buenas colaboraciones....me disculpo de nuevo pero la proxima semana la cosa se normaliza...y vuelvo a trabajar en assembler.
 

Los últimos mensajes

Los últimos temas