2 codigos sencillos... Para los que les pueda interesar.

Iniciado por -Gosw-, 27 Mayo 2009, 04:09 AM

0 Miembros y 1 Visitante están viendo este tema.

-Gosw-

Code 1: Especie de Paint (MUYYYYY BASICO ok), me base en el manejo del modo grafico de DOS y el manejo del mouse.


Código (asm) [Seleccionar]
MODEL SMALL
STACK 256

MOSTRAR MACRO M
mov dx,OFFSET &M
call Imprimir
ENDM

TERMINAR MACRO
mov ax,4C00h
int 21h
ENDM

DETENER MACRO
mov ah,01h
int 21h
ENDM

LINEA MACRO
mov dl,0Ah
mov ah,02h
int 21h
ENDM

minX EQU 20
minY EQU 40
maxX EQU 500
maxY EQU 280
DATASEG

;--------------------------------------------------------------
Color DB 1 DUP(0)
B_Enc DB '   Especie de Paint v.1.0asm$'
B_Pos DB 'Comenzar$'
B_Com DB 'Limpiar Tabla$'
B_Col DB '   Color del Trazado:$'
B_Sal DB 'Salir$'
;--------------------------------------------------------------
CODESEG
Inicio: mov ax,@data
mov ds,ax
mov es,ax

mov ah,0Fh
int 10h
push ax
call MGrafico
call Encabezado
call Boton_Pos
call Boton_Com
call Boton_Sal
call MMouse
call Lee_Mouse
call OMouse
pop ax
mov ah,00h
int 10h
TERMINAR

MGrafico PROC NEAR
mov ax,0012h
int 10h
mov ah,0Bh
mov bx,0000h
int 10h
ret
MGrafico ENDP

Imprimir PROC NEAR
push ax
mov ah,09h
int 21h
pop ax
ret
Imprimir ENDP

Cursor PROC NEAR
mov ah,02h
mov bh,00h
int 10h
ret
Cursor ENDP

Limpiar PROC NEAR
    mov ax,0600h
  mov bx,7100h
    mov cx,00h
    mov dx,174fh
    int 10h
    ret
Limpiar ENDP

MMouse PROC NEAR
mov ax,0001h
int 33h
ret
MMouse ENDP

OMouse PROC NEAR
mov ax,0002h
int 33h
ret
OMouse ENDP

Boton_Pos PROC NEAR
mov dx,82
mov cx,520

Inicio_Aqui: mov ah,0Ch
mov al,0Eh
mov bh,00h
int 10h
cmp cx,530
je inc_dx
inc cx
jmp Inicio_Aqui

inc_dx: mov cx,520
cmp dx,91
je Continua_Aqui
inc dx
jmp Inicio_Aqui

Continua_Aqui: mov cx,000Ah

Escribe: mov dx,0543h

call Cursor
MOSTRAR B_Pos
ret
Boton_Pos ENDP

Boton_Com PROC NEAR
mov dx,130
mov cx,520

Inicio_Aqui1: mov ah,0Ch
mov al,0Ah
mov bh,00h
int 10h
cmp cx,530
je inc_dx1
inc cx
jmp Inicio_Aqui1

inc_dx1: mov cx,520
cmp dx,139
je Continua_Aqui1
inc dx
jmp Inicio_Aqui1

Continua_Aqui1: mov cx,000Ah

Escribe1: mov dx,0843h

call Cursor
MOSTRAR B_Com
ret
Boton_Com ENDP

Boton_Sal PROC NEAR
mov dx,178
mov cx,520

Inicio_Aqui3: mov ah,0Ch
mov al,06h
mov bh,00h
int 10h
cmp cx,530
je inc_dx3
inc cx
jmp Inicio_Aqui3

inc_dx3: mov cx,520
cmp dx,187
je Continua_Aqui3
inc dx
jmp Inicio_Aqui3

Continua_Aqui3: mov cx,000Ah

Escribe3: mov dx,0B43h

call Cursor
MOSTRAR B_Sal
ret
Boton_Sal ENDP

Encabezado PROC NEAR
mov dx,0000h
call Cursor
MOSTRAR B_Enc
ret
Encabezado ENDP

Colorcitos PROC NEAR
mov dx,1500h
call Cursor
MOSTRAR B_Col
ret
Colorcitos ENDP


Terreno PROC NEAR
mov cx,minX
mov dx,minY

Inicio_Aqui4: mov ah,0Ch
mov al,0Fh
mov bh,00h
int 10h
cmp cx,maxX
je inc_dx4
inc cx
jmp Inicio_Aqui4

inc_dx4: mov cx,minX
cmp dx,maxY
je Continua_Aqui4
inc dx
jmp Inicio_Aqui4

Continua_Aqui4: ret
Terreno ENDP

Lee_Mouse PROC NEAR
Clic_Izq: mov ax,0003h
int 33h
and bx,0001h
cmp bx,0001h
je Verificar1
jmp Clic_Izq

Verificar1: cmp cx,520
jae La_Otra1
jmp Clic_Izq

La_Otra1: cmp cx,530
jbe Ahora_dx1
jmp Clic_Izq

Ahora_dx1: cmp dx,82
jae Otro_Punto1
jmp Ahora_dx2

Otro_Punto1: cmp dx,91
jbe Colocar
jmp Ahora_dx2

Ahora_dx2: cmp dx,178
jae Otro_Punto2
jmp Clic_Izq

Otro_Punto2: cmp dx,187
jbe Sales
jmp Clic_Izq

Colocar: call Terreno
call Colorcitos
call Dib_Cuadros
call Dibujar
jmp Sales

Sales: ret
Lee_Mouse ENDP

Dibujar PROC NEAR
Clicito: mov ax,0003h
int 33h
and bx,0001h
cmp bx,0001h
je Verificar2
jmp Clicito

Verificar2: cmp cx,20
jae Otra2
jmp Verificar3

Otra2: cmp cx,500
jbe Now_dx1
jmp Verificar3

Now_dx1: cmp dx,40
jae Punto1
jmp Verificar3

Punto1: cmp dx,280
jbe Dibujito
jmp Verificar3

Dibujito: sub dx,01h
mov ah,0Ch
mov al,Color[0]
mov bh,00h
int 10h
jmp Clicito

Verificar3: cmp cx,520
jae Otra3
jmp Verificar4

Otra3: cmp cx,530
jbe Ah_dx2
jmp Verificar4

Ah_dx2: cmp dx,130
jae Punto2
jmp Ah_dx3

Punto2: cmp dx,139
jbe Otro_Terreno
jmp Ah_dx3

Otro_Terreno: call Terreno
jmp Clicito

Ah_dx3: cmp dx,178
jae Punto3
jmp Verificar4

Punto3: cmp dx,187
jbe Sales1
jmp Verificar4

Sales1: jmp Sales11

Verificar4: cmp dx,338
jae Otra4
jmp Clicito

Otra4: cmp dx,347
jbe Ah_cx1
jmp Clicito

Ah_cx1: cmp cx,180
jae Puntocx1
jmp Ah_cx2

Puntocx1: cmp cx,189
jbe Cambia_Color1
jmp Ah_cx2

Cambia_Color1: mov Color[0],01h
jmp Clicito

Ah_cx2: cmp cx,200
jae Puntocx2
jmp Ah_cx3

Puntocx2: cmp cx,209
jbe Cambia_Color2
jmp Ah_cx3

Cambia_Color2: mov Color[0],02h
jmp Clicito

Ah_cx3: cmp cx,220
jae Puntocx3
jmp Ah_cx4

Puntocx3: cmp cx,229
jbe Cambia_Color3
jmp Ah_cx4

Cambia_Color3: mov Color[0],03h
jmp Clicito

Ah_cx4: cmp cx,240
jae Puntocx4
jmp Ah_cx5

Puntocx4: cmp cx,249
jbe Cambia_Color4
jmp Ah_cx5

Cambia_Color4: mov Color[0],04h
jmp Clicito

Ah_cx5: cmp cx,260
jae Puntocx5
jmp Ah_cx6

Puntocx5: cmp cx,269
jbe Cambia_Color5
jmp Ah_cx6

Cambia_Color5: mov Color[0],05h
jmp Clicito

Ah_cx6: cmp cx,280
jae Puntocx6
jmp Ah_cx7

Puntocx6: cmp cx,289
jbe Cambia_Color6
jmp Ah_cx7

Cambia_Color6: mov Color[0],06h
jmp Clicito

Ah_cx7: cmp cx,300
jae Puntocx7
jmp Ah_cx8

Puntocx7: cmp cx,309
jbe Cambia_Color7
jmp Ah_cx8

Cambia_Color7: mov Color[0],07h
jmp Clicito

Ah_cx8: cmp cx,320
jae Puntocx8
jmp Ah_cx9

Puntocx8: cmp cx,329
jbe Cambia_Color8
jmp Ah_cx9

Cambia_Color8: mov Color[0],08h
jmp Clicito

Ah_cx9: cmp cx,340
jae Puntocx9
jmp Ah_cx10

Puntocx9: cmp cx,349
jbe Cambia_Color9
jmp Ah_cx10

Cambia_Color9: mov Color[0],09h
jmp Clicito

Ah_cx10: cmp cx,360
jae Puntocx10
jmp Ah_cx11

Puntocx10: cmp cx,369
jbe Cambia_Color10
jmp Ah_cx11

Cambia_Color10: mov Color[0],0Ah
jmp Clicito

Ah_cx11: cmp cx,380
jae Puntocx11
jmp Ah_cx12

Puntocx11: cmp cx,389
jbe Cambia_Color11
jmp Ah_cx12

Cambia_Color11: mov Color[0],0Bh
jmp Clicito

Ah_cx12: cmp cx,400
jae Puntocx12
jmp Clicito

Puntocx12: cmp cx,409
jbe Cambia_Color12
jmp Clicito

Cambia_Color12: mov Color[0],0Ch
jmp Clicito

Sales11: ret
Dibujar ENDP

Dib_Cuadros PROC NEAR

mov dx,338
mov cx,180

@Aqui1: mov ah,0Ch
mov al,01h
mov bh,00h
int 10h
cmp cx,189
je @dx1
inc cx
jmp @Aqui1

@dx1: mov cx,180
cmp dx,347
je Color2
inc dx
jmp @Aqui1

Color2: mov dx,338
mov cx,200

@Aqui2: mov ah,0Ch
mov al,02h
mov bh,00h
int 10h
cmp cx,209
je @dx2
inc cx
jmp @Aqui2

@dx2: mov cx,200
cmp dx,347
je Color3
inc dx
jmp @Aqui2

Color3: mov dx,338
mov cx,220

@Aqui3: mov ah,0Ch
mov al,03h
mov bh,00h
int 10h
cmp cx,229
je @dx3
inc cx
jmp @Aqui3

@dx3: mov cx,220
cmp dx,347
je Color4
inc dx
jmp @Aqui3

Color4: mov dx,338
mov cx,240

@Aqui4: mov ah,0Ch
mov al,04h
mov bh,00h
int 10h
cmp cx,249
je @dx4
inc cx
jmp @Aqui4

@dx4: mov cx,240
cmp dx,347
je Color5
inc dx
jmp @Aqui4

Color5: mov dx,338
mov cx,260

@Aqui5: mov ah,0Ch
mov al,05h
mov bh,00h
int 10h
cmp cx,269
je @dx5
inc cx
jmp @Aqui5

@dx5: mov cx,260
cmp dx,347
je Color6
inc dx
jmp @Aqui5

Color6: mov dx,338
mov cx,280

@Aqui6: mov ah,0Ch
mov al,06h
mov bh,00h
int 10h
cmp cx,289
je @dx6
inc cx
jmp @Aqui6

@dx6: mov cx,280
cmp dx,347
je Color7
inc dx
jmp @Aqui6

Color7: mov dx,338
mov cx,300

@Aqui7: mov ah,0Ch
mov al,07h
mov bh,00h
int 10h
cmp cx,309
je @dx7
inc cx
jmp @Aqui7

@dx7: mov cx,300
cmp dx,347
je Color8
inc dx
jmp @Aqui7

Color8: mov dx,338
mov cx,320

@Aqui8: mov ah,0Ch
mov al,08h
mov bh,00h
int 10h
cmp cx,329
je @dx8
inc cx
jmp @Aqui8

@dx8: mov cx,320
cmp dx,347
je Color9
inc dx
jmp @Aqui8

Color9: mov dx,338
mov cx,340

@Aqui9: mov ah,0Ch
mov al,09h
mov bh,00h
int 10h
cmp cx,349
je @dx9
inc cx
jmp @Aqui9

@dx9: mov cx,340
cmp dx,347
je Color10
inc dx
jmp @Aqui9

Color10: mov dx,338
mov cx,360

@Aqui10: mov ah,0Ch
mov al,0Ah
mov bh,00h
int 10h
cmp cx,369
je @dx10
inc cx
jmp @Aqui10

@dx10: mov cx,360
cmp dx,347
je Color11
inc dx
jmp @Aqui10

Color11: mov dx,338
mov cx,380

@Aqui11: mov ah,0Ch
mov al,0Bh
mov bh,00h
int 10h
cmp cx,389
je @dx11
inc cx
jmp @Aqui11

@dx11: mov cx,380
cmp dx,347
je Color12
inc dx
jmp @Aqui11

Color12: mov dx,338
mov cx,400

@Aqui12: mov ah,0Ch
mov al,0Ch
mov bh,00h
int 10h
cmp cx,409
je @dx12
inc cx
jmp @Aqui12

@dx12: mov cx,400
cmp dx,347
je Salll
inc dx
jmp @Aqui12

Salll: ret
Dib_Cuadros ENDP

END Inicio


Aqui les dejo el ejecutable para que vean el resultado: http://www.megaupload.com/?d=L1KFHMYD


Code 2: Conversor de Decimal a Hexadecimal (Medio Arcaico la manera en que lo trabaje), pero lo hice sin usar variables, a punta de registros.

Código (asm) [Seleccionar]
MODEL SMALL
STACK 256

MOSTRAR MACRO M
mov dx,OFFSET &M
call Imprimir
ENDM

TERMINAR MACRO
mov ax,4C00h
int 21h
ENDM

DETENER MACRO
mov ah,01h
int 21h
ENDM

LINEA MACRO
mov dl,0Ah
mov ah,02h
int 21h
ENDM

PRINTLETTER MACRO
mov bx,OFFSET VALORES
xlat
mov dx,ax
mov ah,02h
int 21h
ENDM

PRINTBYTE MACRO
mov bx,OFFSET VALORES
xlat
mov dx,ax
mov ah,02h
int 21h
mov ax,di
xlat
mov dx,ax
mov ah,02h
int 21h
ENDM

PRINT3DIGIT MACRO
mov bx,OFFSET VALORES
xlat
mov dx,ax
mov ah,02h
int 21h
mov ax,si
xlat
mov dx,ax
mov ah,02h
int 21h
mov ax,di
xlat
mov dx,ax
mov ah,02h
int 21h
ENDM

PRINTWORD MACRO
mov bx,OFFSET VALORES
xlat
mov dx,ax
mov ah,02h
int 21h
mov ax,cx
xlat
mov dx,ax
mov ah,02h
int 21h
mov ax,si
xlat
mov dx,ax
mov ah,02h
int 21h
mov ax,di
xlat
mov dx,ax
mov ah,02h
int 21h
ENDM

Tamaño EQU 4
DATASEG
Mensaje DB 'Ingrese un Numero de Maximo 4 Digitos y Presione [Enter]: $'
Msm_Salir DB 'A ingresado un Caracter no Valido. Presione cualquier tecla para Salir del Programa$'
Msm_Exc DB 'Solo se Permite un Maximo de 4 Digitos. Intentelo de Nuevo$'
Msm_Result DB 'El codigo Hexadecimal del Numero introducido es: $'
VALORES DB '0123456789ABCDEF$'

CODESEG
Inicio: mov ax,@data
mov ds,ax
MOSTRAR Mensaje
call Ascii_Hex
DETENER
Terminado: TERMINAR

Ascii_Hex PROC NEAR
jmp Comenzar

Arriba: LINEA
MOSTRAR Msm_Result
jmp Multi

Numero_DeMas: cmp al,0Dh
je Arriba
LINEA
MOSTRAR Msm_Exc
LINEA
LINEA
jmp Inicio

Comenzar: xor al,al
mov si,5
mov bx,0
mov cx,0

Escribir: dec si
mov ah,01h
int 21h
cmp si,0
je Numero_DeMas
cmp al,0Dh
je Arriba
cmp al,1Bh
je Salir2
cmp al,30h
jb Salir
cmp al,39h
ja Salir
and al,0Fh
cmp si,4
je @@3
cmp si,3
je @@2
cmp si,2
je @@1
cmp si,1
je @@0

@@3: mov bl,al
jmp Escribir

@@2: mov cl,bl
mov bl,al
jmp Escribir

@@1: mov ch,cl
mov cl,bl
mov bl,al
jmp Escribir

@@0: mov bh,ch
mov ch,cl
mov cl,bl
mov bl,al
jmp Escribir

Salir: mov dl,0Ah
mov ah,02h
int 21h
MOSTRAR Msm_Salir
jmp Terminado1

Salir2: jmp Terminado

Multi: mov al,bh
mov dx,1000
mov ah,0
mul dx
mov si,ax
mov al,bl
mov dx,1
mov ah,0
mul dx
mov di,ax
add si,di
mov al,ch
mov dx,100
mov ah,0
mul dx
mov di,ax
mov al,cl
mov dx,10
mov ah,0
mul dx
mov bx,ax
add bx,di
add bx,si
mov ax,bx
mov dx,0
mov bx,16

Dividir: cmp ax,bx
jb Otro_Lugar0
div bx
mov di,dx
mov dx,0
cmp ax,bx
jb Otro_Lugar1
div bx
mov si,dx
mov dx,0
cmp ax,bx
jb Otro_Lugar2
div bx
mov cx,dx
cmp ax,bx
jb Otro_Lugar3

Otro_Lugar0: PRINTLETTER
jmp Terminado1
Otro_Lugar1: PRINTBYTE
jmp Terminado1
Otro_Lugar2: PRINT3DIGIT
jmp Terminado1
Otro_Lugar3: PRINTWORD
jmp Terminado1
ret
Ascii_Hex ENDP

Imprimir PROC NEAR
push ax
mov ah,09h
int 21h
pop ax
Terminado1: ret
Imprimir ENDP

END Inicio


Aqui dejo el ejecutable para que lo prueben: http://www.megaupload.com/?d=1273QRVX

karmany

Gracias por los ejemplos, no creas que mucha gente sabe programar en asm para DOS usando las "int". Buenos ejemplos.

El primero, sin embargo, no sé el motivo y tampoco lo he analizado, me bloquea totalmente el ordenador.(lo he probado desde Windows, no desde DOS)

-Gosw-

Cita de: karmany en  1 Junio 2009, 21:54 PM
Gracias por los ejemplos, no creas que mucha gente sabe programar en asm para DOS usando las "int". Buenos ejemplos.

El primero, sin embargo, no sé el motivo y tampoco lo he analizado, me bloquea totalmente el ordenador.(lo he probado desde Windows, no desde DOS)

Que raro, que windows usas?? Yo lo corro en XP (cualquier SP) y funciona perfecto...

karmany

Recuerdo que se ponía toda la pantalla negra, salía el encabezado y a la derecha como 3 opciones. Y ahí se quedaba, no funcionaba nada. No tengo tiempo para analizarlo, tal vez lo pruebe en DOS pero sólo lo he comentado por si alguien lo prueba que mejor lo pruebe en un máquina virtua por ej.

Mi Windows es Windows XP Profesional, 5.1.2600 con SP3.

Eternal Idol

En Windows (gama NT) de por si ya esta siendo ejecutado en una maquina virtual al ser codigo de 16 bits. ¿Se te colgo el S.O.? ¿Probaste alt+ctrl+del?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

karmany

Creo que debe ser problema (en Windows) del ratón, porque acabo de hacer un cd booteable, con drivers del mouse y con tu programa, y ahí sí que funciona perfectamente:





-Gosw-

Cita de: karmany en  3 Junio 2009, 18:27 PM
Creo que debe ser problema (en Windows) del ratón, porque acabo de hacer un cd booteable, con drivers del mouse y con tu programa, y ahí sí que funciona perfectamente:






Bueno te dire que sigo pensando y aun nose que te sucede... Lo acabo de bajar del link que deje y lo he probado y funciona bien, tambien tengo XP SP3...

Es ams en esa captura que dejas noto que te da las cosas en blanco y negro (o ecala de grises) pero el programa en en colores, de verdad nose que sucede, tambien lo he probado en otras maquinas y funciona sin problemas (incluso en una con Vista)...

Puede ser problema de tu maquina nose, es lo que se me ocurre... :-\

karmany

No, no es en blanco y negro... Tal vez fue al optimizarla para Web o  al redimensionarla. Yo no le di importancia a la tonalidad gris. Esta es el original:



Lo he vuelto a ejecutar desde Windows y efectivamente se me ha colgado de nuevo. Ha cargado todo correctamente, incluso esta vez el mouse. He echado un vistazo a tu código y yo no le veo problema. Solamente he hecho poner el ratón encima del cuadro que pone comenzar y se ha bloqueado todo, no ha habido forma de solucionarlo, se ha congelado el ratón y todo y la única forma ha sido reiniciar el ordenador. No sé por qué se cuelga.

Sino tocará depurar el código. Todos las interrupciones y servicios los veo bien nombrados.

-Gosw-

Bueno el codigo ya lo he depurado y en verdad no tiene problema alguno... Has intentado probarlo en una pc distinta?? A lo mejor y es problema de tu PC...

Como te dije lo he probado ya en distintas con Windows distintos y todo funciona perfectamente... Pero igual si quieres metele mano al codigo y ve si consigues algo...