164 lines
3.2 KiB
NASM
164 lines
3.2 KiB
NASM
|
|
.MODEL COMPACT
|
|
.286
|
|
.CODE
|
|
|
|
BUFFER_SVGA DB 256 DUP (0)
|
|
|
|
PUBLIC _SET_VESA
|
|
|
|
_SET_VESA PROC NEAR
|
|
PUSH BP
|
|
MOV BP,SP
|
|
PUSH DI
|
|
PUSH ES
|
|
|
|
VER_SVGA: MOV AX,CS
|
|
MOV ES,AX
|
|
MOV DI,OFFSET CS:BUFFER_SVGA
|
|
MOV AX,4F00h
|
|
INT 10h
|
|
MOV AX,2
|
|
CMP WORD PTR CS:[BUFFER_SVGA+0],"EV"
|
|
JNE NO_VESA
|
|
CMP WORD PTR CS:[BUFFER_SVGA+2],"AS"
|
|
JE SI_SVGA
|
|
NO_VESA: MOV AX,0
|
|
JMP NO_SVGA
|
|
|
|
SI_SVGA: MOV AH,4Fh
|
|
MOV AL,02h
|
|
MOV BX,[BP+4]
|
|
INT 10h
|
|
MOV AX,1
|
|
|
|
NO_SVGA: POP ES
|
|
POP DI
|
|
POP BP
|
|
RET
|
|
_SET_VESA ENDP
|
|
|
|
PUBLIC _CHANGE_BANK
|
|
|
|
_CHANGE_BANK PROC NEAR
|
|
PUSH BP
|
|
MOV BP,SP
|
|
|
|
MOV AH,4Fh
|
|
MOV AL,05h
|
|
MOV BX,0 ;ventana de acceso
|
|
MOV DX,[BP+4] ;bank
|
|
INT 10h
|
|
|
|
POP BP
|
|
RET
|
|
_CHANGE_BANK ENDP
|
|
|
|
PUBLIC _APAGA_PANTALLA
|
|
|
|
_APAGA_PANTALLA PROC NEAR
|
|
PUSH BP
|
|
MOV BP,SP
|
|
PUSH SI
|
|
PUSH DS
|
|
|
|
MOV CH,0
|
|
MOV CL,0
|
|
SIGUE_APAGANDO: MOV DX,3C8h
|
|
MOV AL,0
|
|
OUT DX,AL
|
|
|
|
MOV DX,3DAh
|
|
ESPERA_FIN_RETR:IN AL,DX
|
|
TEST AL,00001000b
|
|
JNZ ESPERA_FIN_RETR
|
|
ESPERA_INI_RETR:IN AL,DX
|
|
TEST AL,00001000b
|
|
JZ ESPERA_INI_RETR
|
|
|
|
MOV DX,3C9h
|
|
LDS SI,[BP+4]
|
|
OTRO_DAC: MOV AL,[SI]
|
|
SUB AL,CH
|
|
JGE DEC_ROJO
|
|
MOV AL,0
|
|
DEC_ROJO: OUT DX,AL
|
|
MOV AL,[SI+1]
|
|
SUB AL,CH
|
|
JGE DEC_VERDE
|
|
MOV AL,0
|
|
DEC_VERDE: OUT DX,AL
|
|
MOV AL,[SI+2]
|
|
SUB AL,CH
|
|
JGE DEC_AZUL
|
|
MOV AL,0
|
|
DEC_AZUL: OUT DX,AL
|
|
ADD SI,3
|
|
INC CL
|
|
JNZ OTRO_DAC
|
|
INC CH
|
|
CMP CH,00111111b
|
|
JL SIGUE_APAGANDO
|
|
|
|
POP DS
|
|
POP SI
|
|
POP BP
|
|
RET
|
|
_APAGA_PANTALLA ENDP
|
|
|
|
PUBLIC _ENCIENDE_PANTALLA
|
|
|
|
_ENCIENDE_PANTALLA PROC NEAR
|
|
PUSH BP
|
|
MOV BP,SP
|
|
PUSH SI
|
|
PUSH DS
|
|
|
|
MOV CH,00111111b
|
|
MOV CL,0
|
|
SIGUE_ENCENDIEN:MOV DX,3C8h
|
|
MOV AL,0
|
|
OUT DX,AL
|
|
|
|
MOV DX,3DAh
|
|
ESPERA_FIN_RET: IN AL,DX
|
|
TEST AL,00001000b
|
|
JNZ ESPERA_FIN_RET
|
|
ESPERA_INI_RET: IN AL,DX
|
|
TEST AL,00001000b
|
|
JZ ESPERA_INI_RET
|
|
|
|
MOV DX,3C9h
|
|
LDS SI,[BP+4]
|
|
OTR_DAC: MOV AL,[SI]
|
|
SUB AL,CH
|
|
JGE INC_ROJO
|
|
MOV AL,0
|
|
INC_ROJO: OUT DX,AL
|
|
MOV AL,[SI+1]
|
|
SUB AL,CH
|
|
JGE INC_VERDE
|
|
MOV AL,0
|
|
INC_VERDE: OUT DX,AL
|
|
MOV AL,[SI+2]
|
|
SUB AL,CH
|
|
JGE INC_AZUL
|
|
MOV AL,0
|
|
INC_AZUL: OUT DX,AL
|
|
ADD SI,3
|
|
DEC CL
|
|
JNZ OTR_DAC
|
|
CMP CH,00000000b
|
|
JZ FIN_ENCENDER
|
|
DEC CH
|
|
JMP SIGUE_ENCENDIEN
|
|
|
|
FIN_ENCENDER: POP DS
|
|
POP SI
|
|
POP BP
|
|
RET
|
|
_ENCIENDE_PANTALLA ENDP
|
|
|
|
END
|
|
|