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,'$'