
O    EQU OFFSET
SYS  EQU INT 021
STOP EQU INT 020
TSR  EQU INT 027


   ;USE PSP FOR DATA


SIGN    EQU  0F7   ;Signature 'FTH' (46h,54h,48h)
OLDINT  EQU  0FA    ;OLD INT 10h VECTOR
VERSION EQU  0FE   ;Version Number to force (0102) DEFAULT
MEMORYS EQU 0100   ;Memory size in 64K units (4=256K)
CONTROL EQU 0102   ;CONTROL WORD. BIT FLAGS:
                   ; BIT 0: Disable VESA if set
                   ;     7: Terminate TSR if set

CT_NOVESA EQU   1  ;SET TO DISABLE ANY PREVIOUS VESA DRIVER
CT_NEW    EQU 040  ;SET IF NO PREVIOUS "vesalie" INSTALLED
CT_STOP   EQU 080  ;SET TO TERMINATE AND UNINSTALL

 ORG 0100
 JMP START

INT10:
 PUSHF
 CS TEST B[CONTROL],CT_STOP
 JNZ >L7
 CMP AH,04F
 JNZ >L8
 CS TEST B[CONTROL],CT_NOVESA
 JNZ >L9
 CMP AL,0
 JNZ >L8            ;NOW 04F00
 CS CALL D[OLDINT]  ;FLAGS ALREADY ON STACK
 PUSH BP
 MOV BP,SP
 PUSH AX
 LAHF
 MOV [BP+6],AH  ;CHANGE OLD FLAGS ON STACK
 CS MOV AX,[VERSION]
 OR AX,AX
 IF NE ES MOV [DI+4],AX
 CS MOV AX,[MEMORYS]
 OR AX,AX
 IF NE ES MOV [DI+012],AX
 POP AX,BP
 IRET

L9:   ;KILL ANY VESA QUERIES
 POPF
 IRET
L8:   ;LET SOMEONE ELSE HANDLE THIS
 POPF
 CS JMP D[OLDINT]

L7:   ;TERMINATE
 PUSH ES,AX
 XOR AX,AX
 MOV ES,AX
 CS MOV AX,[OLDINT]
 ES MOV [040],AX
 CS MOV AX,[OLDINT+2]
 ES MOV [042],AX

 MOV AH,049
 MOV ES,CS
 SYS
 POP AX,ES
 POPF
 IRET


START:
 MOV W[VERSION],0
 MOV W[MEMORYS],0
 MOV B[CONTROL],0

 XOR AX,AX
 MOV ES,AX
 ES LES DI,[040]    ;INT 10h VECTOR
 MOV [OLDINT],DI
 MOV [OLDINT+2],ES
 CMP DI,O INT10
 JNZ >L2
 ES CMP W[SIGN],05446
 JNZ >L2
 ES CMP B[SIGN+2],048
 JZ >L3
L2:
 MOV ES,CS
 OR B[CONTROL],CT_NEW
L3:
 MOV SI,080
 LODSB
 MOV AH,0
 ADD AX,SI
 MOV DI,AX
 MOV B[DI],0
L0:
 LODSB
 OR AL,AL
 IF Z JMP PROCESS
 CMP AL,'/'
 IF NE CMP AL,'-'
 JZ >L1
 CMP AL,' '
 JZ L0
 CMP AL,9
 JZ L0
 CMP AL,0D
 JZ L0
 JMP USAGE

L1:
 LODSB
 OR AL,020    ;LOWER CASE
 CMP AL,'o'
 JNZ >L1
 LODSB
 OR AL,020
 CMP AL,'n'
 JNE >L2
 ES AND B[CONTROL],NOT CT_NOVESA
 JMP L0
L2:
 CMP AL,'f'
 IF E ES OR B[CONTROL],CT_NOVESA
 LODSB
 CMP AL,'f'
 IF NE CMP AL,'F'
 IF NE DEC SI
 JMP L0
L1:
 CMP AL,'?'
 JNZ >l2
USAGE:
 MOV AH,9
 MOV DX,O USE
 SYS
 STOP


L2:
 CMP AL,'m'
 JNZ >L3
 MOV BX,0
L22:
 LODSB
 CMP AL,'0'
 JB >L7
 CMP AL,'9'
 JA >L7
 XCHG AX,BX
 MOV DX,10
 MUL DX
 AND BX,0F
 ADD BX,AX
 JMP L22
L7:
 ADD BX,63
 MOV CL,6
 SHR BX,CL
 ES MOV [MEMORYS],BX
 JMP L0
L3:
 CMP AL,'u'
 JNZ >L4
 ES OR B[CONTROL],CT_STOP
 OR B[CONTROL],CT_STOP
 JMP L0
L4:
 MOV BX,0
 CMP AL,'0'
 IF E MOV BX,0100
 CMP AL,'1'
 IF E MOV BX,0101
 CMP AL,'2'
 IF E MOV BX,0102
 OR BX,BX
 JZ USAGE
 ES MOV W[VERSION],BX
 JMP L0

PROCESS:
 TEST B[CONTROL],CT_STOP
 JZ >L6
 MOV DX,O UNLOAD
 MOV AH,9
 SYS
 STOP

L6: 
 TEST B[CONTROL],CT_NEW
 JNZ >L5
 MOV DX,O ALLOK
 MOV AH,9
 SYS
 STOP

L5:  ;INSTALL
 MOV W[SIGN],05446
 MOV B[SIGN+2],'H'
 XOR AX,AX
 MOV ES,AX
 ES MOV W[040],O INT10
 ES MOV W[042],CS
 MOV ES,[02C]     ;Environment
 MOV AH,049
 SYS
 MOV DX,O LOAD
 MOV AH,9
 SYS
 MOV DX,O START
 TSR        ;GO TSR, KEEP UNTIL START

BUF:
ALLOK:
 DB 13,10,'VESALIE: Parameters have been changed.',13,10,'$'
UNLOAD:
 DB 13,10,'VESALIE has been uninstalled',13,10,'$'
LOAD:
 DB 13,10,'VESALIE has been installed.',13,10,'$'

USE:
 DB 13,10,'Usage: VESALIE [/0|/1|/2] [/ON|/OFF] [/Mxx] [/U]',13,10
 DB 13,10,'Where /0 /1 /2 selects VESA version 1.00, 1.01 or 1.02'
 DB 13,10,'      /ON /OFF turns the VESA driver on and off'
 DB 13,10,'      /Mxx     sets the memory size returned by the driver'
 DB 13,10,'      /U       Uninstalls the VESA "Cheat" facility'
 DB 13,10,'$'
