Dr. Mugroso: Menu en segundo plano sin borrar lo de atras
hola es mi primer post me meti en esto de la ensamblada por curiosidad y aprender lo que realmente hace la PC internamente, y me he divertido a la vez que algunas cosas no las entiendo nada, pero poco a poco se van entendiendo hay que tenerle paciencia a esto y solito van saliendo las cosas claro que hay que investigar mucho y no ver tanta TV jajaja
a lo que voy es que queria saber la forma de que un menu en pantalla de texto (80x25) se desplegara pero al darle a cualquier tecla borre el menu y despliegue lo que hay atras. Este codigo lo hice a mi forma de ver, pero no se si haya otro metodo mejor, y si alguien hizo o tiene algun codigo parecido que lo comparta
PAGE 60,132
TITLE VIDEO (EXE)
;ejemplo de un menu emergente en segundo plano
;---------------------------
; INCLUDE MACROS.LIB
.MODEL SMALL
;-------------------------
VIDSEG SEGMENT AT 0B800H ;Pagina 0 del area de video
VIDAREA DB 1000H DUP(?)
VIDSEG ENDS
;-------------------------
.STACK 64
.DATA
;----------------------------
SAVEVIDAREA DB 4000H DUP(?)
;Menu a desplegar en la posicion 00:00 esquina superior izquierda
;con su respectivo retorno de carro (0DH) y avance de line (0AH) al final
MENU DB 0C9H, 10 DUP(0CDH),0BBH,0DH,0AH
DB 0BAH,'El texto ' ,0BAH,0DH,0AH
DB 0BAH,'de atras ' ,0BAH,0DH,0AH
DB 0BAH,'no se ' ,0BAH,0DH,0AH
DB 0BAH,'borra ' ,0BAH,0DH,0AH
DB 0BAH,'se guarda ' ,0BAH,0DH,0AH
DB 0C8H, 10 DUP(0CDH),0BCH,0DH,0AH
CONT DW 0
;-----------------------------
.CODE
BEGIN PROC FAR
MOV AX,VIDSEG
MOV ES,AX
ASSUME ES:VIDSEG
MOV AX,@data
MOV DS,AX
CALL GUARDA
MOV AH,02H ;Peticion para colocar el cursor
MOV BH,00 ;Numero de pagina
MOV DH,00 ;Renglon
MOV DL,00 ;columna
INT 10H
MOV AH,40H ;Peticion de despliegue
MOV BX,01 ;Manejador de archivo de salida
MOV CX,98 ;# de caracteres a desplegar
LEA DX,MENU ;area de despliegue
INT 21H
MOV AH,10H ;KEYPRESS
INT 16H
MOV CONT,0
CALL CARGA
MOV AX,4C00H ;Salir al DOS
INT 21H
BEGIN ENDP
;------------------------------------
;Movemos toda la pantalla en la pagina 0 a nuestra variable SAVEVIDAREA
;para guardarla
GUARDA PROC NEAR
LEA SI,SAVEVIDAREA
LEA DI,VIDAREA
A10:
MOV AL,ES:[DI]
INC DI
MOV AH,ES:[DI]
INC DI
MOV WORD PTR[SAVEVIDAREA+SI],AX
INC SI
INC SI
INC CONT
CMP CONT,2048
JNE A10
RET
GUARDA ENDP
;------------------------------------
;Lo que hemos guardado en SAVEVIDAREA lo cargamos en el area de video del
;BIOS lo que se llama "Despliegue Directo en video"
CARGA PROC NEAR
LEA SI,SAVEVIDAREA
LEA DI,VIDAREA
A20:
MOV AL,[SI]
INC SI
MOV AH,[SI]
INC SI
MOV WORD PTR ES:[VIDAREA+DI],AX
INC DI
INC DI
INC CONT
CMP CONT,2048
JNE A20
RET
CARGA ENDP
END
este fuente lo compile con el TASM 3.1 y el LINK 5.0
bueno bye
a lo que voy es que queria saber la forma de que un menu en pantalla de texto (80x25) se desplegara pero al darle a cualquier tecla borre el menu y despliegue lo que hay atras. Este codigo lo hice a mi forma de ver, pero no se si haya otro metodo mejor, y si alguien hizo o tiene algun codigo parecido que lo comparta
PAGE 60,132
TITLE VIDEO (EXE)
;ejemplo de un menu emergente en segundo plano
;---------------------------
; INCLUDE MACROS.LIB
.MODEL SMALL
;-------------------------
VIDSEG SEGMENT AT 0B800H ;Pagina 0 del area de video
VIDAREA DB 1000H DUP(?)
VIDSEG ENDS
;-------------------------
.STACK 64
.DATA
;----------------------------
SAVEVIDAREA DB 4000H DUP(?)
;Menu a desplegar en la posicion 00:00 esquina superior izquierda
;con su respectivo retorno de carro (0DH) y avance de line (0AH) al final
MENU DB 0C9H, 10 DUP(0CDH),0BBH,0DH,0AH
DB 0BAH,'El texto ' ,0BAH,0DH,0AH
DB 0BAH,'de atras ' ,0BAH,0DH,0AH
DB 0BAH,'no se ' ,0BAH,0DH,0AH
DB 0BAH,'borra ' ,0BAH,0DH,0AH
DB 0BAH,'se guarda ' ,0BAH,0DH,0AH
DB 0C8H, 10 DUP(0CDH),0BCH,0DH,0AH
CONT DW 0
;-----------------------------
.CODE
BEGIN PROC FAR
MOV AX,VIDSEG
MOV ES,AX
ASSUME ES:VIDSEG
MOV AX,@data
MOV DS,AX
CALL GUARDA
MOV AH,02H ;Peticion para colocar el cursor
MOV BH,00 ;Numero de pagina
MOV DH,00 ;Renglon
MOV DL,00 ;columna
INT 10H
MOV AH,40H ;Peticion de despliegue
MOV BX,01 ;Manejador de archivo de salida
MOV CX,98 ;# de caracteres a desplegar
LEA DX,MENU ;area de despliegue
INT 21H
MOV AH,10H ;KEYPRESS
INT 16H
MOV CONT,0
CALL CARGA
MOV AX,4C00H ;Salir al DOS
INT 21H
BEGIN ENDP
;------------------------------------
;Movemos toda la pantalla en la pagina 0 a nuestra variable SAVEVIDAREA
;para guardarla
GUARDA PROC NEAR
LEA SI,SAVEVIDAREA
LEA DI,VIDAREA
A10:
MOV AL,ES:[DI]
INC DI
MOV AH,ES:[DI]
INC DI
MOV WORD PTR[SAVEVIDAREA+SI],AX
INC SI
INC SI
INC CONT
CMP CONT,2048
JNE A10
RET
GUARDA ENDP
;------------------------------------
;Lo que hemos guardado en SAVEVIDAREA lo cargamos en el area de video del
;BIOS lo que se llama "Despliegue Directo en video"
CARGA PROC NEAR
LEA SI,SAVEVIDAREA
LEA DI,VIDAREA
A20:
MOV AL,[SI]
INC SI
MOV AH,[SI]
INC SI
MOV WORD PTR ES:[VIDAREA+DI],AX
INC DI
INC DI
INC CONT
CMP CONT,2048
JNE A20
RET
CARGA ENDP
END
este fuente lo compile con el TASM 3.1 y el LINK 5.0
bueno bye
