Trabajo

DATA SEGMENT XC DW ? YC DW ? TEMPO DW ? COLOR LAST RAD HOR VER VID MSGX MSGY MSGR MSGS DB DB DW DW DW DB DB DB DB DB ;

Views 254 Downloads 0 File size 30KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

DATA SEGMENT XC DW ? YC DW ? TEMPO DW ? COLOR LAST RAD HOR VER VID MSGX MSGY MSGR MSGS

DB DB DW DW DW DB DB DB DB DB

; Pos X del centro ; Pos Y del centro ; Temporal

20 ; Color inicial "5" ? ; Radio del c�rculo ? ? ? ; Salvamos el modo de video "INGRESE PUNTO "INGRESE PUNTO "INGRESE RADIO "NO ES POSIBLE

X 3 DIG: ","$" Y 3 DIG: ","$" R 3 DIG: ","$" DIBUJAR EN DICHO PUNTO...", "$"

MULTI DB 64h, 0Ah, 01h ; 100, 10, 1 CADENA LABEL BYTE TOTAL DB 31 ACTUAL DB ? CADE DB 31 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:PILA INICIO: MOV AX,DATA MOV DS,AX MOV AH,0Fh ; Petici�n de obtenci�n de modo de v�deo INT 10h ; Llamada al BIOS MOV VID,AL ;limpiar el area de la pantalla MOV AX,0600H MOV BH,07H MOV CX,0000H MOV DX,184fH INT 10H CALL INGRESACOOR MOV CX,XC MOV DX,YC MOV AH,00h MOV AL,12h INT 10h

; Funci�n para establecer modo de video ; Modo gr�fico resoluci�n 640x480

CALL PUNTEAR CALL INFI MOV AH,00h MOV AL,VID INT 10h

; Funci�n para re-establecer modo de texto ; Llamada al BIOS

MOV AH,004Ch INT 21h ; INGRESACOOR PROC NEAR ;*********** INGRESAR COORDENADA XXX ********* MOV DX,0110H ; renglon 1, columna 10 CALL POSICION LEA DX,MSGX CALL MUESTRA CALL INGRESO MOV MOV MOV LEA

DI,0 AX, 0 CX, 3 BX,CADE

FORMARX: MOV AL,[BX+DI] SUB AL,30H MUL MULTI[DI] ADD XC, AX INC DI LOOP FORMARX ; ********INGRESAR COORDENADA YYY

*********

MOV DX,0310H CALL POSICION LEA DX,MSGY CALL MUESTRA CALL INGRESO MOV MOV MOV LEA

DI,0 AX, 0 CX, 3 BX,CADE

FORMARY: MOV AL,[BX+DI] SUB AL,30H MUL MULTI[DI] ADD YC, AX INC DI LOOP FORMARY ; ********INGRESAR EL RADIO R *********** MOV DX,0510H CALL POSICION LEA DX,MSGR CALL MUESTRA CALL INGRESO MOV DI,0 MOV AX, 0 MOV CX, 3

LEA BX,CADE FORMARR: MOV AL,[BX+DI] SUB AL,30H MUL MULTI[DI] ADD RAD, AX INC DI LOOP FORMARR ; ************* VALIDAR COORDENADAS ************** MOV AX, XC CMP AX, 320 ; 140h x JB XMMITAD JMP XMAXMITAD ;-----------------XMMITAD: CMP AX, RAD JAE YYM ;.. ja CALL SALIDA1 YYM:

MOV AX, YC CMP AX, 240 ; F0H Y JB YYYM JMP YYYYM

YYYM: MOV AX, YC CMP AX, RAD JAE EJECUTA CALL SALIDA1 YYYYM: MOV AX, 480 SUB AX, RAD JBE EJECUTA CMP YC, AX CALL SALIDA1 ;------------------XMAXMITAD: MOV AX, XC ADD AX, RAD CMP AX, 640 JBE YYM CALL SALIDA1 ;*********** FIN VALIDACION *************** EJECUTA: ; OBTENER EL MODO ACTUAL DE VIDEO MOV AH,0FH INT 10H MOV VID, AL ; ESTABLECIMIENTO EN MODO GRAFICO MOV AH,00H MOV AL,12H INT 10H MOV COLOR,1AH ; COLOR VERDE MOV CX,XC MOV DX,YC ;JMP IZQUIERDA

RET INGRESACOOR ENDP INFI PROC NEAR ITERA: CALL GRAFICAR CALL ESCUCHAR JNZ ATENDER ; Si no est� vac�o atiende el que est� ; Si est� vac�o atiende el �ltimo ingresado MOV AL,LAST ATENDER: CMP AL, "1" JNZ E2 CALL MOVSWEST JMP ITERA E2: CMP AL, "2" JNZ E3 CALL MOVSOUTH JMP ITERA E3: CMP AL, "3" JNZ E4 CALL MOVSEAST JMP ITERA E4: CMP AL, "4" JNZ E5 CALL MOVWEST JMP ITERA E5: CMP AL, "5" JNZ E6 CALL DONTMOVE JMP ITERA E6: CMP AL, "6" JNZ E7 CALL MOVEAST JMP ITERA E7: CMP AL, "7" JNZ E8 CALL MOVNWEST JMP ITERA E8: CMP AL, "8" JNZ E9 CALL MOVNORTH JMP ITERA E9: CMP AL, "9" JNZ CAMBIARC CALL MOVNEAST JMP ITERA ; Modificaci�n del COLOR a tiempo real CAMBIARC:

CMP AL,"c" JNZ QUIT CALL CCOLOR JMP ITERA QUIT:

CMP AL, "q" JNZ INFI RET INFI ENDP CCOLOR PROC NEAR ADD COLOR,27 ;MOV LAST,"5" Que se detenga al cambiar de color RET CCOLOR ENDP MOVSWEST PROC NEAR MOV AX,XC SUB AX,RAD JNZ NO1 CALL MOVSEAST RET NO1: MOV AX,YC ADD AX,RAD SUB AX,480 JNZ NO2 CALL MOVNWEST RET NO2: CALL BORRAR INC YC DEC XC MOV LAST,"1" RET MOVSWEST ENDP MOVSOUTH PROC NEAR MOV AX,YC ADD AX,RAD SUB AX,480 JNZ NO3 CALL MOVNORTH RET NO3: CALL BORRAR INC YC MOV LAST,"2" RET MOVSOUTH ENDP MOVSEAST PROC NEAR MOV AX,YC ADD AX,RAD SUB AX,480 JNZ NO4 CALL MOVNEAST RET

NO4:

NO5:

MOV AX,XC ADD AX,RAD SUB AX,640 JNZ NO5 CALL MOVSWEST RET

CALL BORRAR INC YC INC XC MOV LAST,"3" RET MOVSEAST ENDP MOVWEST PROC NEAR MOV AX,XC SUB AX,RAD JNZ NO6 CALL MOVEAST RET NO6: CALL BORRAR DEC XC MOV LAST,"4" RET MOVWEST ENDP MOVEAST PROC NEAR MOV AX,XC ADD AX,RAD SUB AX,640 JNZ NO7 CALL MOVWEST RET NO7: CALL BORRAR INC XC MOV LAST,"6" RET MOVEAST ENDP MOVNWEST PROC NEAR MOV AX,XC SUB AX,RAD JNZ NO8 CALL MOVNEAST RET NO8: MOV AX,YC SUB AX,RAD JNZ NO9 CALL MOVSWEST RET NO9: CALL BORRAR DEC YC DEC XC MOV LAST,"7"

RET MOVNWEST ENDP MOVNORTH PROC NEAR MOV AX,YC SUB AX,RAD JNZ NO10 CALL MOVSOUTH RET NO10: CALL BORRAR DEC YC MOV LAST,"8" RET MOVNORTH ENDP MOVNEAST PROC NEAR MOV AX,XC ADD AX,RAD SUB AX,640 JNZ NO11 CALL MOVNWEST RET NO11: MOV AX,YC SUB AX,RAD JNZ NO12 CALL MOVSEAST RET NO12: CALL BORRAR DEC YC INC XC MOV LAST,"9" RET MOVNEAST ENDP DONTMOVE PROC NEAR ; CALL GRAFICAR MOV AH,00h INT 16h ; Si deseamos que parpadee, eliminamos las 3 de arriba. MOV LAST,AL RET DONTMOVE ENDP BORRAR PROC NEAR MOV CX,0 MOV CL,COLOR PUSH CX MOV COLOR,00h CALL GRAFICAR POP CX MOV COLOR,CL RET BORRAR ENDP

; Ya que en GRAFICAR se usan todos los registros

PUNTEAR PROC NEAR ; Grafica un punto en CX,DX

; Petici�n para escribir un punto ; Color del pixel ; P�gina ; Llamada al BIOS

MOV AH,0Ch MOV AL,COLOR MOV BH,00h INT 10H RET PUNTEAR ENDP

GRAFICAR PROC NEAR ; Graficamos todo el circulo ! MOV HOR,0 MOV AX,RAD MOV VER,AX BUSQUEDA: CALL BUSCAR MOV AX,VER SUB AX,HOR CMP AX,1 JA BUSQUEDA RET GRAFICAR ENDP BUSCAR PROC NEAR ; Se encarga de buscar la coord del pixel sgte. INC HOR ; Horizontalmente siempre aumenta 1 MOV MUL MOV MOV MUL ADD MOV MUL SUB

AX,HOR AX BX,AX ; AX,VER AX ; BX,AX ; AX,RAD AX ; AX,BX ;

X^2 se almacena en BX AX almacena Y^2 BX almacena X^2 + Y^2 AX almacena R^2 AX almacena R^2 - (X^2+Y^2)

MOV TEMPO,AX MOV MUL MOV MOV DEC MUL ADD MOV MUL SUB

AX,HOR AX BX,AX ; AX,VER AX ; AX ; BX,AX ; AX,RAD AX ; AX,BX ;

BX almacena X^2 una unidad menos para Y (�VAYA DIFERENCIA!) AX almacena Y^2 BX almacena X^2 + Y^2 AX almacena R^2 AX almacena R^2 - (X^2+Y^2)

CMP TEMPO,AX JB NODEC DEC VER NODEC: CALL REPUNTEAR PUSH VER PUSH HOR POP VER POP HOR ; Cambiamos valores

CALL REPUNTEAR PUSH VER PUSH HOR POP VER POP HOR ; Devolvemos originales RET BUSCAR ENDP REPUNTEAR PROC NEAR ; I CUADRANTE MOV CX,XC ADD CX,HOR MOV DX,YC SUB DX,VER CALL PUNTEAR ; IV CUADRANTE MOV DX,YC ADD DX,VER CALL PUNTEAR ; III CUADRANTE MOV CX,XC SUB CX,HOR CALL PUNTEAR ; II CUADRANTE MOV DX,YC SUB DX,VER CALL PUNTEAR RET REPUNTEAR ENDP ESCUCHAR PROC NEAR MOV AH,06h ; Peticion directa a la consola MOV DL,0FFh ; Entrada de teclado INT 21h ; Interrupcion que llama al DOS ; Si ZF est� prendido quiere decir que el buffer est� vac�o. RET ; En AL queda el ASCII del caracter ingresado. ESCUCHAR ENDP ;agregados del otro codigo POSICION PROC NEAR MOV AH,02H MOV BH,00 INT 10H RET POSICION ENDP MUESTRA PROC NEAR MOV AH,09H INT 21H RET MUESTRA ENDP INGRESO PROC NEAR MOV AH,0AH LEA DX,CADENA INT 21H RET

INGRESO ENDP ;************************************* ; -------- SALIDA FIN -----------; muestra mensaje que no se puede dibujar SALIDA1 PROC NEAR MOV DX,0910H CALL POSICION LEA DX,MSGS CALL MUESTRA JMP SALIDA SALIDA1 ENDP ;ESPERAR UNA TECLA SALIDA PROC NEAR MOV AH,00H INT 16H MOV AH,00H MOV AL,VID INT 10H JMP SALIR SALIDA ENDP ;IRQ DE SALIDA AL SISTEMA OPERATIVO SALIR: MOV AX,4C00H INT 21H CODE ENDS PILA SEGMENT STACK DB 777 DUP(?) PILA ENDS END INICIO