From bd0edf8f7c63b16fa638bcbfb2b43a163e91ca38 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 18 Nov 2015 13:16:36 -0600 Subject: [PATCH] added another library ^^ --- 16/tauron/ASM_SRC/CLEAR.ASM | 241 +++++++ 16/tauron/ASM_SRC/DUAL.ASM | 275 ++++++++ 16/tauron/ASM_SRC/FONT1.ASM | 266 +++++++ 16/tauron/ASM_SRC/FONT2.ASM | 266 +++++++ 16/tauron/ASM_SRC/MAIN.ASM | 788 +++++++++++++++++++++ 16/tauron/ASM_SRC/MODES.ASM | 1240 +++++++++++++++++++++++++++++++++ 16/tauron/ASM_SRC/MODES.INC | 196 ++++++ 16/tauron/ASM_SRC/TESTS.ASM | 676 ++++++++++++++++++ 16/tauron/C_SRC/CLEAR.CPP | 180 +++++ 16/tauron/C_SRC/DUAL.CPP | 236 +++++++ 16/tauron/C_SRC/FONT1.H | 268 +++++++ 16/tauron/C_SRC/FONT2.H | 268 +++++++ 16/tauron/C_SRC/MAINC.CPP | 181 +++++ 16/tauron/C_SRC/MODES.CPP | 833 ++++++++++++++++++++++ 16/tauron/C_SRC/MODES_C.INC | 262 +++++++ 16/tauron/C_SRC/PALETTE.INC | 62 ++ 16/tauron/C_SRC/TAURON.H | 105 +++ 16/tauron/C_SRC/TESTS.CPP | 376 ++++++++++ 16/tauron/FEDIT.EXE | Bin 0 -> 151665 bytes 16/tauron/FEDIT.TXT | 93 +++ 16/tauron/MAIN.EXE | Bin 0 -> 18460 bytes 16/tauron/MAINC.EXE | Bin 0 -> 82375 bytes 16/tauron/README.TXT | 226 ++++++ 16/tauron/USAGE.TXT | 118 ++++ 16/tauron/WHATSNEW.TXT | 32 + 16/tauron/tauron30.zip | Bin 0 -> 138287 bytes 16/tauron30/ASM_SRC/CLEAR.ASM | 241 +++++++ 16/tauron30/ASM_SRC/DUAL.ASM | 275 ++++++++ 16/tauron30/ASM_SRC/FONT1.ASM | 266 +++++++ 16/tauron30/ASM_SRC/FONT2.ASM | 266 +++++++ 16/tauron30/ASM_SRC/MAIN.ASM | 788 +++++++++++++++++++++ 16/tauron30/ASM_SRC/MODES.ASM | 1240 +++++++++++++++++++++++++++++++++ 16/tauron30/ASM_SRC/MODES.INC | 196 ++++++ 16/tauron30/ASM_SRC/TESTS.ASM | 676 ++++++++++++++++++ 16/tauron30/C_SRC/CLEAR.CPP | 180 +++++ 16/tauron30/C_SRC/DUAL.CPP | 236 +++++++ 16/tauron30/C_SRC/FONT1.H | 268 +++++++ 16/tauron30/C_SRC/FONT2.H | 268 +++++++ 16/tauron30/C_SRC/MAINC.CPP | 181 +++++ 16/tauron30/C_SRC/MODES.CPP | 833 ++++++++++++++++++++++ 16/tauron30/C_SRC/MODES_C.INC | 262 +++++++ 16/tauron30/C_SRC/PALETTE.INC | 62 ++ 16/tauron30/C_SRC/TAURON.H | 105 +++ 16/tauron30/C_SRC/TESTS.CPP | 376 ++++++++++ 16/tauron30/FEDIT.EXE | Bin 0 -> 151665 bytes 16/tauron30/FEDIT.TXT | 93 +++ 16/tauron30/MAIN.EXE | Bin 0 -> 18460 bytes 16/tauron30/MAINC.EXE | Bin 0 -> 82375 bytes 16/tauron30/README.TXT | 226 ++++++ 16/tauron30/USAGE.TXT | 118 ++++ 16/tauron30/WHATSNEW.TXT | 32 + 51 files changed, 14376 insertions(+) create mode 100755 16/tauron/ASM_SRC/CLEAR.ASM create mode 100755 16/tauron/ASM_SRC/DUAL.ASM create mode 100755 16/tauron/ASM_SRC/FONT1.ASM create mode 100755 16/tauron/ASM_SRC/FONT2.ASM create mode 100755 16/tauron/ASM_SRC/MAIN.ASM create mode 100755 16/tauron/ASM_SRC/MODES.ASM create mode 100755 16/tauron/ASM_SRC/MODES.INC create mode 100755 16/tauron/ASM_SRC/TESTS.ASM create mode 100755 16/tauron/C_SRC/CLEAR.CPP create mode 100755 16/tauron/C_SRC/DUAL.CPP create mode 100755 16/tauron/C_SRC/FONT1.H create mode 100755 16/tauron/C_SRC/FONT2.H create mode 100755 16/tauron/C_SRC/MAINC.CPP create mode 100755 16/tauron/C_SRC/MODES.CPP create mode 100755 16/tauron/C_SRC/MODES_C.INC create mode 100755 16/tauron/C_SRC/PALETTE.INC create mode 100755 16/tauron/C_SRC/TAURON.H create mode 100755 16/tauron/C_SRC/TESTS.CPP create mode 100755 16/tauron/FEDIT.EXE create mode 100755 16/tauron/FEDIT.TXT create mode 100755 16/tauron/MAIN.EXE create mode 100755 16/tauron/MAINC.EXE create mode 100755 16/tauron/README.TXT create mode 100755 16/tauron/USAGE.TXT create mode 100755 16/tauron/WHATSNEW.TXT create mode 100755 16/tauron/tauron30.zip create mode 100755 16/tauron30/ASM_SRC/CLEAR.ASM create mode 100755 16/tauron30/ASM_SRC/DUAL.ASM create mode 100755 16/tauron30/ASM_SRC/FONT1.ASM create mode 100755 16/tauron30/ASM_SRC/FONT2.ASM create mode 100755 16/tauron30/ASM_SRC/MAIN.ASM create mode 100755 16/tauron30/ASM_SRC/MODES.ASM create mode 100755 16/tauron30/ASM_SRC/MODES.INC create mode 100755 16/tauron30/ASM_SRC/TESTS.ASM create mode 100755 16/tauron30/C_SRC/CLEAR.CPP create mode 100755 16/tauron30/C_SRC/DUAL.CPP create mode 100755 16/tauron30/C_SRC/FONT1.H create mode 100755 16/tauron30/C_SRC/FONT2.H create mode 100755 16/tauron30/C_SRC/MAINC.CPP create mode 100755 16/tauron30/C_SRC/MODES.CPP create mode 100755 16/tauron30/C_SRC/MODES_C.INC create mode 100755 16/tauron30/C_SRC/PALETTE.INC create mode 100755 16/tauron30/C_SRC/TAURON.H create mode 100755 16/tauron30/C_SRC/TESTS.CPP create mode 100755 16/tauron30/FEDIT.EXE create mode 100755 16/tauron30/FEDIT.TXT create mode 100755 16/tauron30/MAIN.EXE create mode 100755 16/tauron30/MAINC.EXE create mode 100755 16/tauron30/README.TXT create mode 100755 16/tauron30/USAGE.TXT create mode 100755 16/tauron30/WHATSNEW.TXT diff --git a/16/tauron/ASM_SRC/CLEAR.ASM b/16/tauron/ASM_SRC/CLEAR.ASM new file mode 100755 index 00000000..f7b4bbe6 --- /dev/null +++ b/16/tauron/ASM_SRC/CLEAR.ASM @@ -0,0 +1,241 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +TEXTCLEAR PROC + PUSH BP + MOV BP,SP + + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AH,byte ptr [bp+4] + MOV AL,' ' + MOV CX,Mode.width_bytes + CLD + REP STOSW + + POP BP + RET 2 +TEXTCLEAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CLEAR_B8000H PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AX,WORD PTR [BP+4] + CLD + MOV CX,Mode.width_bytes + REP STOSW + + POPA + POP BP + RET 2 +CLEAR_B8000H ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Mode 0Dh clear screen +CLEAR0DH PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,2000H +CLEAR_LOOP: + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV EAX,0 + XCHG DWORD PTR ES:[DI],EAX + + MOV DX,03C4H + MOV AH,BYTE PTR [BP+4] + MOV AL,2 + OUT DX,AX + + MOV DWORD PTR ES:[DI],0FFFFFFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,4 + LOOP CLEAR_LOOP + + POP BP + RET 2 +CLEAR0DH ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Mode 0Eh clear screen +CLEAR0EH PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,4000H +CLEAR_LOOP2: + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV EAX,0 + XCHG DWORD PTR ES:[DI],EAX + + MOV DX,03C4H + MOV AH,BYTE PTR [BP+4] + MOV AL,2 + OUT DX,AX + + MOV DWORD PTR ES:[DI],0FFFFFFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,4 + LOOP CLEAR_LOOP2 + + POP BP + RET 2 +CLEAR0EH ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CLEAR11H PROC + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV AX,0FFFFH + CLD + MOV CX,4B00H + REP STOSW + RET +CLEAR11H ENDP + +; 0d 0e 11 have bytes /2 +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PLANARCLEAR PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,Mode.width_bytes + SHR CX,1 +CLEAR_LOOP3: + + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV AX,0 + XCHG WORD PTR ES:[DI],AX + + MOV DX,03C4H + MOV AH,byte ptr [bp+4] + MOV AL,2 + OUT DX,AX + + MOV WORD PTR ES:[DI],0FFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,2 + LOOP CLEAR_LOOP3 + + POP BP + RET 2 +PLANARCLEAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CLEAR13H PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV AL,byte ptr [bp+4] + MOV AH,AL + CLD + MOV CX,8000H + REP STOSW + + POP BP + RET 2 +CLEAR13H ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +UNCHAINEDCLEAR PROC + PUSH BP + MOV BP,SP + + mov dx, 03C4h ; 03c4h + mov al, 2 ; Map Mask Register + out dx, al + inc dx + mov al,00001111B ; Select all planes to write to + out dx, al ; Doing this to clear all planes at once + + mov ax,0A000H + mov es, ax + XOR DI,DI ; set es:di = Screen Mem + mov ah,byte ptr [bp+4] ; move the color into ah + mov al,ah ; copy the value to al + mov cx,Mode.width_bytes ; Number of words + SHR CX,1 + cld + rep stosw ; clear it + + POP BP + RET 2 +UNCHAINEDCLEAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/ASM_SRC/DUAL.ASM b/16/tauron/ASM_SRC/DUAL.ASM new file mode 100755 index 00000000..0ee31055 --- /dev/null +++ b/16/tauron/ASM_SRC/DUAL.ASM @@ -0,0 +1,275 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; 3C4H, 03H +; Bit positions for font maps: +; +; +--7--+--6--+--5--+--4--+--3--+--2--+--1--+--0--+ +; | | | SAH | SBH | SA | SB | +; +-----+-----+-----+-----+-----+-----+-----+-----+ +; +; SA - bits 1, 0 of Character Map A +; SAH - bit 2 (high order) of Charcter Map A +; +; SB - bits 1, 0 of Character Map B +; SBH - bit 2 (high order) of Charcter Map B +; + +; Points to fonts for Map A Memory Address +DFM_MAPA_FONT1 EQU 00H ; 0K +DFM_MAPA_FONT2 EQU 04H ; 16K +DFM_MAPA_FONT3 EQU 08H ; 32K +DFM_MAPA_FONT4 EQU 0CH ; 48K +DFM_MAPA_FONT5 EQU 20H ; 8K +DFM_MAPA_FONT6 EQU 24H ; 24K +DFM_MAPA_FONT7 EQU 28H ; 40K +DFM_MAPA_FONT8 EQU 2CH ; 56K + +; Points to fonts for Map B +DFM_MAPB_FONT1 EQU 00H ; 0K +DFM_MAPB_FONT2 EQU 01H ; 16K +DFM_MAPB_FONT3 EQU 02H ; 32K +DFM_MAPB_FONT4 EQU 03H ; 48K +DFM_MAPB_FONT5 EQU 10H ; 8K +DFM_MAPB_FONT6 EQU 11H ; 24K +DFM_MAPB_FONT7 EQU 12H ; 40K +DFM_MAPB_FONT8 EQU 13H ; 56K + + +; To set dual font mode, just set the character map select register to point +; to 2 different fonts. There can be up to 8 fonts resident in memory at +; once but only 2 can be active at a time. +; +; ** NOTE ** If you set both font maps the same you are no longer in dual font +; mode. But what this allows you to do is to put up to 8 fonts in VGA memory +; and switch between them at any time. +; +; Both fonts were made with my font editor. I just read the BIOS and +; modified the second font so a solid line goes through the middle of it. +; +; This procedure sets up dual font mode and loads 2 fonts into video memory. +SETDUAL PROC + + ; Sequencer address + MOV DX,SEQ_ADDR + + ; 2 different font maps + MOV AH,DFM_MAPA_FONT1 + OR AH,DFM_MAPB_FONT5 + + ; Sequencer register + MOV AL,03H + + ; Send it + OUT DX,AX + + ; Load font 1 into 0K + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH OFFSET FONT1 ; Offset of Font in our Data Segment + PUSH DS + CALL LOADFONT + + ; Load font 2 into 8K + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A200H + PUSH OFFSET FONT2 ; Offset of Font in our Data Segment + PUSH DS + CALL LOADFONT + + RET +SETDUAL ENDP + +; This procedure reset the character map select register to point to only +; one font. +UNSETDUAL PROC + + ; Set both fonts to point to font 1 + MOV DX,SEQ_ADDR + MOV AX,0003H + OUT DX,AX + + RET +UNSETDUAL ENDP + +; In dual font modes, the palette is in effect half of what it is. The +; bottom 8 colors for the first font, and the top 8 colors for the second +; font. +; +; What I do here is to set them to the same 8 colors. +; Black, Blue, Green, Red, Purple, Yellow, Light Gray, and White +; +SETDUALPALETTE PROC + + PUSH 0 + PUSH 0 + PUSH 0 + PUSH 0 + CALL SETPAL + + PUSH 42 + PUSH 0 + PUSH 0 + PUSH 1 + CALL SETPAL + + PUSH 0 + PUSH 42 + PUSH 0 + PUSH 2 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 0 + PUSH 3 + CALL SETPAL + + PUSH 0 + PUSH 0 + PUSH 42 + PUSH 4 + CALL SETPAL + + PUSH 21 + PUSH 63 + PUSH 63 + PUSH 5 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 42 + PUSH 6 + CALL SETPAL + + PUSH 63 + PUSH 63 + PUSH 63 + PUSH 7 + CALL SETPAL + + PUSH 0 + PUSH 0 + PUSH 0 + PUSH 8 + CALL SETPAL + + PUSH 42 + PUSH 0 + PUSH 0 + PUSH 9 + CALL SETPAL + + PUSH 0 + PUSH 42 + PUSH 0 + PUSH 10 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 0 + PUSH 11 + CALL SETPAL + + PUSH 0 + PUSH 0 + PUSH 42 + PUSH 12 + CALL SETPAL + + PUSH 21 + PUSH 63 + PUSH 63 + PUSH 13 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 42 + PUSH 14 + CALL SETPAL + + PUSH 63 + PUSH 63 + PUSH 63 + PUSH 15 + CALL SETPAL + + RET +SETDUALPALETTE ENDP + +DUALTEST PROC + + MOV SI,OFFSET MODE03H + CALL SETMODE + + CALL SETDUAL + CALL SETDUALPALETTE + + PUSH 1FH + CALL TEXTCLEAR + + ; Attribute to print text in. + ; + ; In dual font mode, attrubute bit 3 is the deciding factor as to which + ; font is printed. 0001X111B where X is 0 for font 1 or 1 for font 2. + ; The Charcter Map Select Register determines where font 1 and font 2 + ; reside. + ; 00011111B - Font 2, Blue Background, with color 7 text. + MOV ATT, 1Fh + + MOV BX,5 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_D + CALL PRINTSTRING + MOV BX,6 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_E + CALL PRINTSTRING + MOV BX,7 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_F + CALL PRINTSTRING + + ; 00010111B - Font 1, Blue Background, with color 7 text. + MOV ATT, 17h + + MOV BX,0 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_D + CALL PRINTSTRING + MOV BX,1 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_E + CALL PRINTSTRING + MOV BX,2 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_F + CALL PRINTSTRING + + ; Wait for a keypress + MOV AH,0 + INT 16H + + CALL UNSETDUAL + RET +DUALTEST ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/ASM_SRC/FONT1.ASM b/16/tauron/ASM_SRC/FONT1.ASM new file mode 100755 index 00000000..772d612e --- /dev/null +++ b/16/tauron/ASM_SRC/FONT1.ASM @@ -0,0 +1,266 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +;=- -= +;=- Tauron VGA Utilities Version 1.0 -= +;=- Released June 14, 1998 -= +;=- -= +;=- Font Width: 8 -= +;=- Font Height: 16 -= +;=- Bytes per character: 16 -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH,099H,081H,081H,07EH,000H,000H,000H,000H +DB 000H,000H,07EH,0FFH,0DBH,0FFH,0FFH,0C3H,0E7H,0FFH,0FFH,07EH,000H,000H,000H,000H +DB 000H,000H,000H,000H,06CH,0FEH,0FEH,0FEH,0FEH,07CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,07CH,0FEH,07CH,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,03CH,0E7H,0E7H,0E7H,099H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,07EH,0FFH,0FFH,07EH,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,018H,03CH,03CH,018H,000H,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,0C3H,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,03CH,066H,042H,042H,066H,03CH,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0C3H,099H,0BDH,0BDH,099H,0C3H,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,01EH,00EH,01AH,032H,078H,0CCH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,066H,066H,066H,03CH,018H,07EH,018H,018H,000H,000H,000H,000H +DB 000H,000H,03FH,033H,03FH,030H,030H,030H,030H,070H,0F0H,0E0H,000H,000H,000H,000H +DB 000H,000H,07FH,063H,07FH,063H,063H,063H,063H,067H,0E7H,0E6H,0C0H,000H,000H,000H +DB 000H,000H,000H,018H,018H,0DBH,03CH,0E7H,03CH,0DBH,018H,018H,000H,000H,000H,000H +DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FEH,0F8H,0F0H,0E0H,0C0H,080H,000H,000H,000H,000H +DB 000H,002H,006H,00EH,01EH,03EH,0FEH,03EH,01EH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,066H,066H,066H,000H,066H,066H,000H,000H,000H,000H +DB 000H,000H,07FH,0DBH,0DBH,0DBH,07BH,01BH,01BH,01BH,01BH,01BH,000H,000H,000H,000H +DB 000H,07CH,0C6H,060H,038H,06CH,0C6H,0C6H,06CH,038H,00CH,0C6H,07CH,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,0FEH,0FEH,0FEH,0FEH,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,07EH,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,00CH,0FEH,00CH,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,030H,060H,0FEH,060H,030H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C0H,0C0H,0C0H,0C0H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,028H,06CH,0FEH,06CH,028H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,038H,07CH,07CH,0FEH,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,0FEH,07CH,07CH,038H,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,03CH,03CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,066H,066H,066H,024H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,06CH,06CH,0FEH,06CH,06CH,06CH,0FEH,06CH,06CH,000H,000H,000H,000H +DB 018H,018H,07CH,0C6H,0C2H,0C0H,07CH,006H,086H,0C6H,07CH,018H,018H,000H,000H,000H +DB 000H,000H,000H,000H,0C2H,0C6H,00CH,018H,030H,060H,0C6H,086H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,06CH,038H,076H,0DCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,030H,030H,030H,060H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,00CH,018H,030H,030H,030H,030H,030H,030H,018H,00CH,000H,000H,000H,000H +DB 000H,000H,030H,018H,00CH,00CH,00CH,00CH,00CH,00CH,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,03CH,0FFH,03CH,066H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,018H,030H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,002H,006H,00CH,018H,030H,060H,0C0H,080H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0CEH,0D6H,0D6H,0E6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,018H,038H,078H,018H,018H,018H,018H,018H,018H,07EH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,00CH,018H,030H,060H,0C0H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,006H,03CH,006H,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,00CH,01CH,03CH,06CH,0CCH,0FEH,00CH,00CH,00CH,01EH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C0H,0C0H,0C0H,0FCH,00EH,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,060H,0C0H,0C0H,0FCH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,006H,006H,00CH,018H,030H,030H,030H,030H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07CH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07EH,006H,006H,006H,00CH,078H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,006H,00CH,018H,030H,060H,030H,018H,00CH,006H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,060H,030H,018H,00CH,006H,00CH,018H,030H,060H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,00CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0DEH,0DEH,0DEH,0DCH,0C0H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,066H,066H,066H,066H,0FCH,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H,0C0H,0C2H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,0F8H,06CH,066H,066H,066H,066H,066H,066H,06CH,0F8H,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,068H,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,068H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0DEH,0C6H,0C6H,066H,03AH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,03CH,018H,018H,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,01EH,00CH,00CH,00CH,00CH,00CH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,0E6H,066H,06CH,06CH,078H,078H,06CH,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,0F0H,060H,060H,060H,060H,060H,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0C6H,0EEH,0FEH,0FEH,0D6H,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0CEH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,060H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0D6H,0DEH,07CH,00CH,00EH,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,06CH,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,060H,038H,00CH,006H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07EH,07EH,05AH,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,06CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0D6H,0D6H,0FEH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,06CH,06CH,038H,038H,06CH,06CH,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,03CH,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,086H,00CH,018H,030H,060H,0C2H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,03CH,030H,030H,030H,030H,030H,030H,030H,030H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,080H,0C0H,0E0H,070H,038H,01CH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,03CH,00CH,00CH,00CH,00CH,00CH,00CH,00CH,00CH,03CH,000H,000H,000H,000H +DB 010H,038H,06CH,0C6H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H +DB 030H,030H,018H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0E0H,060H,060H,078H,06CH,066H,066H,066H,066H,0DCH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C0H,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,01CH,00CH,00CH,03CH,06CH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,0CCH,078H,000H +DB 000H,000H,0E0H,060H,060H,06CH,076H,066H,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,018H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,006H,006H,000H,00EH,006H,006H,006H,006H,006H,006H,066H,066H,03CH,000H +DB 000H,000H,0E0H,060H,060H,066H,06CH,078H,078H,06CH,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,038H,018H,018H,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0ECH,0FEH,0D6H,0D6H,0D6H,0D6H,0D6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,07CH,060H,060H,0F0H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,00CH,01EH,000H +DB 000H,000H,000H,000H,000H,0DCH,076H,062H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,060H,038H,00CH,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,030H,030H,0FCH,030H,030H,030H,030H,036H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,066H,066H,066H,066H,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0D6H,0D6H,0FEH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,06CH,038H,038H,038H,06CH,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,0F8H,000H +DB 000H,000H,000H,000H,000H,0FEH,0CCH,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,00EH,018H,018H,018H,070H,018H,018H,018H,018H,00EH,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,000H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,070H,018H,018H,018H,00EH,018H,018H,018H,018H,070H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,06CH,0C6H,0C6H,0C6H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H,0C2H,066H,03CH,00CH,006H,07CH,000H,000H +DB 000H,000H,0CCH,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0CCH,0CCH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,038H,06CH,038H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,03CH,066H,060H,060H,066H,03CH,00CH,006H,03CH,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,066H,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,03CH,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,0C6H,0C6H,010H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 038H,06CH,038H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 018H,030H,060H,000H,0FEH,066H,060H,07CH,060H,060H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,076H,036H,07EH,0D8H,0D8H,06EH,000H,000H,000H,000H +DB 000H,000H,03EH,06CH,0CCH,0CCH,0FEH,0CCH,0CCH,0CCH,0CCH,0CEH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,030H,078H,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,078H,000H +DB 000H,0C6H,0C6H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,018H,03CH,066H,060H,060H,060H,066H,03CH,018H,018H,000H,000H,000H,000H +DB 000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0E6H,0FCH,000H,000H,000H,000H +DB 000H,000H,066H,066H,03CH,018H,07EH,018H,07EH,018H,018H,018H,000H,000H,000H,000H +DB 000H,0F8H,0CCH,0CCH,0F8H,0C4H,0CCH,0DEH,0CCH,0CCH,0CCH,0C6H,000H,000H,000H,000H +DB 000H,00EH,01BH,018H,018H,018H,07EH,018H,018H,018H,018H,018H,0D8H,070H,000H,000H +DB 000H,018H,030H,060H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 076H,0DCH,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0CEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,03CH,06CH,06CH,03EH,000H,07EH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,07CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,030H,030H,000H,030H,030H,060H,0C0H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,006H,006H,006H,006H,000H,000H,000H,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,060H,0CEH,093H,006H,00CH,01FH,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,066H,0CEH,09AH,03FH,006H,00FH,000H,000H +DB 000H,000H,018H,018H,000H,018H,018H,018H,03CH,03CH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,033H,066H,0CCH,066H,033H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,066H,033H,066H,0CCH,000H,000H,000H,000H,000H,000H +DB 011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H +DB 055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH +DB 0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H +DB 018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,0F6H,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FEH,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F6H,006H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,03FH,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F7H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,0F7H,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,03FH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H +DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,0D8H,0D8H,0D8H,0DCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FCH,0C6H,0FCH,0C6H,0C6H,0FCH,0C0H,0C0H,0C0H,000H,000H +DB 000H,000H,0FEH,0C6H,0C6H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,080H,0FEH,06CH,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,0FEH,0C6H,060H,030H,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0D8H,0D8H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,066H,066H,066H,066H,066H,07CH,060H,060H,0C0H,000H,000H,000H +DB 000H,000H,000H,000H,076H,0DCH,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07EH,018H,03CH,066H,066H,066H,03CH,018H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,06CH,06CH,06CH,06CH,0EEH,000H,000H,000H,000H +DB 000H,000H,01EH,030H,018H,00CH,03EH,066H,066H,066H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0DBH,0DBH,0DBH,07EH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,003H,006H,07EH,0CFH,0DBH,0F3H,07EH,060H,0C0H,000H,000H,000H,000H +DB 000H,000H,01CH,030H,060H,060H,07CH,060H,060H,060H,030H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,0FFH,000H,000H,000H,000H +DB 000H,000H,000H,030H,018H,00CH,006H,00CH,018H,030H,000H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,00CH,018H,030H,060H,030H,018H,00CH,000H,07EH,000H,000H,000H,000H +DB 000H,000H,00EH,01BH,01BH,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,018H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,07EH,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,000H,076H,0DCH,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,00FH,00CH,00CH,00CH,00CH,00CH,0ECH,06CH,06CH,03CH,01CH,000H,000H,000H,000H +DB 000H,0D8H,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,070H,098H,030H,060H,0C8H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,07CH,07CH,07CH,07CH,07CH,07CH,07CH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H diff --git a/16/tauron/ASM_SRC/FONT2.ASM b/16/tauron/ASM_SRC/FONT2.ASM new file mode 100755 index 00000000..9c84bf90 --- /dev/null +++ b/16/tauron/ASM_SRC/FONT2.ASM @@ -0,0 +1,266 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +;=- -= +;=- Tauron VGA Utilities Version 1.0 -= +;=- Released June 14, 1998 -= +;=- -= +;=- Font Width: 8 -= +;=- Font Height: 16 -= +;=- Bytes per character: 16 -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH,099H,081H,081H,07EH,000H,000H,000H,000H +DB 000H,000H,07EH,0FFH,0DBH,0FFH,0FFH,0C3H,0E7H,0FFH,0FFH,07EH,000H,000H,000H,000H +DB 000H,000H,000H,000H,06CH,0FEH,0FEH,0FEH,0FEH,07CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,07CH,0FEH,07CH,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,03CH,0E7H,0E7H,0E7H,099H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,07EH,0FFH,0FFH,07EH,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,018H,03CH,03CH,018H,000H,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,0C3H,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,03CH,066H,042H,042H,066H,03CH,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0C3H,099H,0BDH,0BDH,099H,0C3H,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,01EH,00EH,01AH,032H,078H,0CCH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,066H,066H,066H,03CH,018H,07EH,018H,018H,000H,000H,000H,000H +DB 000H,000H,03FH,033H,03FH,030H,030H,030H,030H,070H,0F0H,0E0H,000H,000H,000H,000H +DB 000H,000H,07FH,063H,07FH,063H,063H,063H,063H,067H,0E7H,0E6H,0C0H,000H,000H,000H +DB 000H,000H,000H,018H,018H,0DBH,03CH,0E7H,03CH,0DBH,018H,018H,000H,000H,000H,000H +DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FEH,0F8H,0F0H,0E0H,0C0H,080H,000H,000H,000H,000H +DB 000H,002H,006H,00EH,01EH,03EH,0FEH,03EH,01EH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,066H,066H,066H,000H,066H,066H,000H,000H,000H,000H +DB 000H,000H,07FH,0DBH,0DBH,0DBH,07BH,01BH,01BH,01BH,01BH,01BH,000H,000H,000H,000H +DB 000H,07CH,0C6H,060H,038H,06CH,0C6H,0C6H,06CH,038H,00CH,0C6H,07CH,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,0FEH,0FEH,0FEH,0FEH,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,07EH,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,00CH,0FEH,00CH,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,030H,060H,0FEH,060H,030H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C0H,0C0H,0C0H,0C0H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,028H,06CH,0FEH,06CH,028H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,038H,07CH,07CH,0FEH,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,0FEH,07CH,07CH,038H,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,03CH,03CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,066H,066H,066H,024H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,06CH,06CH,0FEH,06CH,06CH,06CH,0FEH,06CH,06CH,000H,000H,000H,000H +DB 018H,018H,07CH,0C6H,0C2H,0C0H,07CH,006H,086H,0C6H,07CH,018H,018H,000H,000H,000H +DB 000H,000H,000H,000H,0C2H,0C6H,00CH,018H,030H,060H,0C6H,086H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,06CH,038H,076H,0DCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,030H,030H,030H,060H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,00CH,018H,030H,030H,030H,030H,030H,030H,018H,00CH,000H,000H,000H,000H +DB 000H,000H,030H,018H,00CH,00CH,00CH,00CH,00CH,00CH,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,03CH,0FFH,03CH,066H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,018H,030H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,002H,006H,00CH,018H,030H,060H,0C0H,080H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0CEH,0D6H,0D6H,0E6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,018H,038H,078H,018H,018H,018H,018H,018H,018H,07EH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,00CH,018H,030H,060H,0C0H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,006H,03CH,006H,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,00CH,01CH,03CH,06CH,0CCH,0FEH,00CH,00CH,00CH,01EH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C0H,0C0H,0C0H,0FCH,00EH,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,060H,0C0H,0C0H,0FCH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,006H,006H,00CH,018H,030H,030H,030H,030H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07CH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07EH,006H,006H,006H,00CH,078H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,006H,00CH,018H,030H,060H,030H,018H,00CH,006H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,060H,030H,018H,00CH,006H,00CH,018H,030H,060H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,00CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0DEH,0DEH,0DEH,0DCH,0C0H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,038H,06CH,0C6H,0C6H,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,0FFH,066H,066H,066H,0FCH,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0FFH,0C0H,0C2H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,0F8H,06CH,066H,066H,066H,0FFH,066H,066H,06CH,0F8H,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,0FFH,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,0FFH,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0FFH,0C6H,0C6H,066H,03AH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0FEH,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,03CH,018H,018H,018H,018H,0FFH,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,01EH,00CH,00CH,00CH,00CH,0FFH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,0E6H,066H,06CH,06CH,078H,0FFH,06CH,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,0F0H,060H,060H,060H,060H,0FFH,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0C6H,0EEH,0FEH,0FEH,0D6H,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,0FFH,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,0FFH,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0FFH,0C6H,0D6H,0DEH,07CH,00CH,00EH,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,0FFH,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,060H,038H,0FFH,006H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07EH,07EH,05AH,018H,018H,0FFH,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0FFH,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0FFH,0C6H,06CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0FFH,0D6H,0FEH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,06CH,06CH,038H,0FFH,06CH,06CH,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,03CH,0FFH,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,086H,00CH,018H,0FFH,060H,0C2H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,03CH,030H,030H,030H,030H,0FFH,030H,030H,030H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,080H,0C0H,0E0H,070H,0FFH,01CH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,03CH,00CH,00CH,00CH,00CH,0FFH,00CH,00CH,00CH,03CH,000H,000H,000H,000H +DB 010H,038H,06CH,0C6H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,0FFH,000H,000H +DB 030H,030H,018H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0E0H,060H,060H,078H,06CH,066H,066H,066H,066H,0DCH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C0H,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,01CH,00CH,00CH,03CH,06CH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,0CCH,078H,000H +DB 000H,000H,0E0H,060H,060H,06CH,076H,066H,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,018H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,006H,006H,000H,00EH,006H,006H,006H,006H,006H,006H,066H,066H,03CH,000H +DB 000H,000H,0E0H,060H,060H,066H,06CH,078H,078H,06CH,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,038H,018H,018H,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0ECH,0FEH,0D6H,0D6H,0D6H,0D6H,0D6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,07CH,060H,060H,0F0H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,00CH,01EH,000H +DB 000H,000H,000H,000H,000H,0DCH,076H,062H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,060H,038H,00CH,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,030H,030H,0FCH,030H,030H,030H,030H,036H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,066H,066H,066H,066H,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0D6H,0D6H,0FEH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,06CH,038H,038H,038H,06CH,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,0F8H,000H +DB 000H,000H,000H,000H,000H,0FEH,0CCH,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,00EH,018H,018H,018H,070H,018H,018H,018H,018H,00EH,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,000H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,070H,018H,018H,018H,00EH,018H,018H,018H,018H,070H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,06CH,0C6H,0C6H,0C6H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H,0C2H,066H,03CH,00CH,006H,07CH,000H,000H +DB 000H,000H,0CCH,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0CCH,0CCH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,038H,06CH,038H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,03CH,066H,060H,060H,066H,03CH,00CH,006H,03CH,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,066H,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,03CH,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,0C6H,0C6H,010H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 038H,06CH,038H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 018H,030H,060H,000H,0FEH,066H,060H,07CH,060H,060H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,076H,036H,07EH,0D8H,0D8H,06EH,000H,000H,000H,000H +DB 000H,000H,03EH,06CH,0CCH,0CCH,0FEH,0CCH,0CCH,0CCH,0CCH,0CEH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,030H,078H,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,078H,000H +DB 000H,0C6H,0C6H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,018H,03CH,066H,060H,060H,060H,066H,03CH,018H,018H,000H,000H,000H,000H +DB 000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0E6H,0FCH,000H,000H,000H,000H +DB 000H,000H,066H,066H,03CH,018H,07EH,018H,07EH,018H,018H,018H,000H,000H,000H,000H +DB 000H,0F8H,0CCH,0CCH,0F8H,0C4H,0CCH,0DEH,0CCH,0CCH,0CCH,0C6H,000H,000H,000H,000H +DB 000H,00EH,01BH,018H,018H,018H,07EH,018H,018H,018H,018H,018H,0D8H,070H,000H,000H +DB 000H,018H,030H,060H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 076H,0DCH,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0CEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,03CH,06CH,06CH,03EH,000H,07EH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,07CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,030H,030H,000H,030H,030H,060H,0C0H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,006H,006H,006H,006H,000H,000H,000H,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,060H,0CEH,093H,006H,00CH,01FH,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,066H,0CEH,09AH,03FH,006H,00FH,000H,000H +DB 000H,000H,018H,018H,000H,018H,018H,018H,03CH,03CH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,033H,066H,0CCH,066H,033H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,066H,033H,066H,0CCH,000H,000H,000H,000H,000H,000H +DB 011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H +DB 055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH +DB 0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H +DB 018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,0F6H,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FEH,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F6H,006H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,03FH,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F7H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,0F7H,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,03FH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H +DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,0D8H,0D8H,0D8H,0DCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FCH,0C6H,0FCH,0C6H,0C6H,0FCH,0C0H,0C0H,0C0H,000H,000H +DB 000H,000H,0FEH,0C6H,0C6H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,080H,0FEH,06CH,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,0FEH,0C6H,060H,030H,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0D8H,0D8H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,066H,066H,066H,066H,066H,07CH,060H,060H,0C0H,000H,000H,000H +DB 000H,000H,000H,000H,076H,0DCH,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07EH,018H,03CH,066H,066H,066H,03CH,018H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,06CH,06CH,06CH,06CH,0EEH,000H,000H,000H,000H +DB 000H,000H,01EH,030H,018H,00CH,03EH,066H,066H,066H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0DBH,0DBH,0DBH,07EH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,003H,006H,07EH,0CFH,0DBH,0F3H,07EH,060H,0C0H,000H,000H,000H,000H +DB 000H,000H,01CH,030H,060H,060H,07CH,060H,060H,060H,030H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,0FFH,000H,000H,000H,000H +DB 000H,000H,000H,030H,018H,00CH,006H,00CH,018H,030H,000H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,00CH,018H,030H,060H,030H,018H,00CH,000H,07EH,000H,000H,000H,000H +DB 000H,000H,00EH,01BH,01BH,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,018H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,07EH,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,000H,076H,0DCH,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,00FH,00CH,00CH,00CH,00CH,00CH,0ECH,06CH,06CH,03CH,01CH,000H,000H,000H,000H +DB 000H,0D8H,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,070H,098H,030H,060H,0C8H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,07CH,07CH,07CH,07CH,07CH,07CH,07CH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H diff --git a/16/tauron/ASM_SRC/MAIN.ASM b/16/tauron/ASM_SRC/MAIN.ASM new file mode 100755 index 00000000..8bf81cef --- /dev/null +++ b/16/tauron/ASM_SRC/MAIN.ASM @@ -0,0 +1,788 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +.MODEL SMALL +.386 +JUMPS +LOCALS +.STACK 200h +.DATA + +ATTRCON_ADDR EQU 03C0H +MISC_ADDR EQU 03C2H +VGAENABLE_ADDR EQU 03C3H +SEQ_ADDR EQU 03C4H +GRACON_ADDR EQU 03CEH +CRTC_ADDR EQU 03D4H +STATUS_ADDR EQU 03DAH + +; Videomode defines +VMODE_00H EQU 00H +VMODE_01H EQU 00H +VMODE_02H EQU 03H +VMODE_03H EQU 03H +VMODE_04H EQU 04H +VMODE_05H EQU 04H +VMODE_06H EQU 06H +VMODE_07H EQU 07H +VMODE_0DH EQU 0DH +VMODE_0EH EQU 0EH +VMODE_0FH EQU 0FH +VMODE_10H EQU 10H +VMODE_11H EQU 11H +VMODE_12H EQU 12H +VMODE_13H EQU 13H +VMODE_CHAIN4 EQU 14H +VMODE_MODE_X EQU 15H +VMODE_MODE_A EQU 16H +VMODE_MODE_B EQU 17H +VMODE_MODE_C EQU 18H +VMODE_MODE_D EQU 19H +VMODE_MODE_E EQU 1AH +VMODE_MODE_F EQU 1BH +VMODE_MODE_G EQU 1CH +VMODE_MODE_H EQU 1DH +VMODE_MODE_I EQU 1EH +VMODE_MODE_J EQU 1FH +VMODE_MODE_K EQU 20H +VMODE_MODE_L EQU 21H +VMODE_MODE_M EQU 22H +VMODE_MODE_N EQU 23H + +;These next four lines must be included for the text mode stuff to work. +oldmode db ? +oldmisc db ? +oldmask db ? +oldmem db ? + +PALETTE LABEL BYTE +DB 0, 0, 0, 0, 0, 42, 0, 42, 0, 0, 42, 42, 42, 0, 0, 42, 0, 42 +DB 42, 21, 0, 42, 42, 42, 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63 +DB 63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63, 0, 0, 0, 5, 5, 5 +DB 8, 8, 8, 11, 11, 11, 14, 14, 14, 17, 17, 17, 20, 20, 20, 24, 24, 24 +DB 28, 28, 28, 32, 32, 32, 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50 +DB 56, 56, 56, 63, 63, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63 +DB 63, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0, 0, 63, 16, 0 +DB 63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0 +DB 0, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63 +DB 0, 31, 63, 0, 16, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63 +DB 63, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, 31, 63, 39, 31 +DB 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31 +DB 31, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63 +DB 31, 47, 63, 31, 39, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63 +DB 63, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, 45, 63, 49, 45 +DB 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45 +DB 45, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63 +DB 45, 54, 63, 45, 49, 63, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28 +DB 28, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0, 0, 28, 7, 0 +DB 28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0 +DB 0, 28, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28 +DB 0, 14, 28, 0, 7, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28 +DB 28, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, 14, 28, 17, 14 +DB 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14 +DB 14, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28 +DB 14, 21, 28, 14, 17, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28 +DB 28, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, 20, 28, 22, 20 +DB 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20 +DB 20, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28 +DB 20, 24, 28, 20, 22, 28, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16 +DB 16, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0, 0, 16, 4, 0 +DB 16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0 +DB 0, 16, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16 +DB 0, 8, 16, 0, 4, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16 +DB 16, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8, 8, 16, 10, 8 +DB 16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8 +DB 8, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16 +DB 8, 12, 16, 8, 10, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16 +DB 16, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, 11, 16, 12, 11 +DB 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11 +DB 11, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16 +DB 11, 13, 16, 11, 12, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63 + +; Must be included for any videomode to be set. +include modes.inc + +MAIN_MSG LABEL BYTE +DB 'Tauron VGA Utilities v3.0',13,10 +DB 'Copyright (c) 1998 Jeffrey Morgan. All Rights Reserved.',13,10 +DB 'Select a video mode to test: (Modes with a ! are not implemented)',13,10 +DB 'Key Videomode (Modes with a % are unchained)',13,10 +DB '================================================================================' +DB ' 0) 00H, 01H -- 40 x 25 x 16 %F) Mode D -- 360 x 200 x 256',13,10 +DB ' 1) Mode L -- 40 x 43 x 16 %G) Mode E -- 360 x 240 x 256',13,10 +DB ' 2) Mode M -- 40 x 50 x 16 %H) Mode F -- 360 x 350 x 256',13,10 +DB '!3) 07H -- 80 x 25 x 2 %I) Mode G -- 360 x 400 x 256',13,10 +DB ' 4) 02H, 03H -- 80 x 25 x 16 %J) Mode H -- 360 x 480 x 256',13,10 +DB ' 5) Mode J -- 80 x 43 x 16 K) 06H -- 640 x 200 x 2',13,10 +DB ' 6) Mode K -- 80 x 50 x 16 !L) 0FH -- 640 x 350 x 2',13,10 +DB ' 7) 04H, 05H -- 320 x 200 x 4 M) 11H -- 640 x 480 x 2',13,10 +DB ' 8) 0DH -- 320 x 200 x 16 N) 0EH -- 640 x 200 x 16',13,10 +DB ' 9) 13H -- 320 x 200 x 256 O) 10H -- 640 x 350 x 16',13,10 +DB '%A) Chain 4 -- 320 x 200 x 256 P) Mode I -- 640 x 400 x 16',13,10 +DB '%B) Mode X -- 320 x 240 x 256 Q) 12H -- 640 x 480 x 16',13,10 +DB '%C) Mode A -- 320 x 350 x 256',13,10 +DB '%D) Mode B -- 320 x 400 x 256 R) Dual Font Test',13,10 +DB '%E) Mode C -- 320 x 480 x 256',13,10 +DB '===============================================================================',13,10 +DB 'Hit ',39,'ESC',39,' to exit. Press a key [0-9 or A-O]>$' + +TEXTMSG_1 DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0 +TEXTMSG_2 DB 179,'Text Mode: 00H ',179,0 ; +13 +TEXTMSG_3 DB 179,'Width: 80 Height: 25',179,0 ; +8 +TEXTMSG_4 DB 179,'Bytes per screen: 4000',179,0 ; +19 +TEXTMSG_5 DB 179,'Number of pages: 8 ',179,0 +TEXTMSG_6 DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0 + +TEXTMSG_7 DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0 +TEXTMSG_8 DB 179,'Text Mode J ',179,0 ; +11 +TEXTMSG_9 DB 179,'Width: 80 Height: 43',179,0 ; +21, +22 +TEXTMSG_A DB 179,'Bytes per screen: 3440',179,0 ; +19, +20, +21, +22 +TEXTMSG_B DB 179,'Number of pages: 8 ',179,0 +TEXTMSG_C DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0 + +TEXTMSG_D DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0 +TEXTMSG_E DB 179,' DUAL FONT MODE ',179,0 ; +TEXTMSG_F DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0 + +FONT_8x8_OFF DW ? +FONT_8x14_OFF DW ? + +; Attribute for text charcters +ATT DB 1FH + +FONT1 LABEL BYTE +include font1.asm +FONT2 LABEL BYTE +include font2.asm +.CODE + +IODELAY MACRO + REPT 8 + JMP $+2 + ENDM +ENDM + +Start: + MOV AX,@DATA + MOV DS,AX + + ; This must be here to ensure that the fonts are properly found because + ; the location of the fonts in ROM is different on every VGA BIOS. + ; Get location of the fonts for Modes J and K + MOV AH,11h + MOV AL,30h + MOV BH,03h + INT 10H + MOV FONT_8x8_OFF,BP + + ; Get location of the fonts for Modes 00H, 01H, 02H, 03H, and 07H + MOV AH,11h + MOV AL,30h + MOV BH,06h + INT 10H + MOV FONT_8x14_OFF,BP + + ; Reset the mode and clear the screen + MOV AX,0003H + INT 10H + + ; Print out the message + MOV DX,OFFSET MAIN_MSG + MOV AH,9 + INT 21H + +MAIN_LOOP: + + ; Wait for a keypress + MOV AH,0 + INT 16H + + CMP AL,27 + JE QUIT_PROGRAM + + CMP AL,'0' + JE MODE_00_TEST + + CMP AL,'1' + JE MODE_L_TEST + + CMP AL,'2' + JE MODE_M_TEST + + CMP AL,'4' + JE MODE_03_TEST + + CMP AL,'5' + JE MODE_J_TEST + + CMP AL,'6' + JE MODE_K_TEST + + CMP AL,'7' + JE MODE_04_TEST + + CMP AL,'8' + JE MODE_0D_TEST + + CMP AL,'9' + JE MODE_13_TEST + + CMP AL,'a' + JE MODE_C4_TEST + CMP AL,'A' + JE MODE_C4_TEST + + CMP AL,'b' + JE MODE_X_TEST + CMP AL,'B' + JE MODE_X_TEST + + CMP AL,'c' + JE MODE_A_TEST + CMP AL,'C' + JE MODE_A_TEST + + CMP AL,'d' + JE MODE_B_TEST + CMP AL,'D' + JE MODE_B_TEST + + CMP AL,'e' + JE MODE_C_TEST + CMP AL,'E' + JE MODE_C_TEST + + CMP AL,'f' + JE MODE_D_TEST + CMP AL,'F' + JE MODE_D_TEST + + CMP AL,'g' + JE MODE_E_TEST + CMP AL,'G' + JE MODE_E_TEST + + CMP AL,'h' + JE MODE_F_TEST + CMP AL,'H' + JE MODE_F_TEST + + CMP AL,'i' + JE MODE_G_TEST + CMP AL,'I' + JE MODE_G_TEST + + CMP AL,'j' + JE MODE_H_TEST + CMP AL,'J' + JE MODE_H_TEST + + CMP AL,'k' + JE MODE_06_TEST + CMP AL,'K' + JE MODE_06_TEST + + CMP AL,'m' + JE MODE_11_TEST + CMP AL,'M' + JE MODE_11_TEST + + CMP AL,'n' + JE MODE_0E_TEST + CMP AL,'N' + JE MODE_0E_TEST + + CMP AL,'o' + JE MODE_10_TEST + CMP AL,'O' + JE MODE_10_TEST + + CMP AL,'p' + JE MODE_I_TEST + CMP AL,'P' + JE MODE_I_TEST + + CMP AL,'q' + JE MODE_12_TEST + CMP AL,'Q' + JE MODE_12_TEST + + CMP AL,'r' + JE DUAL_TEST + CMP AL,'R' + JE DUAL_TEST + JMP MAIN_LOOP + +; ====================== New Video Mode ==================================== +MODE_00_TEST: + PUSH VMODE_00H + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_03_TEST: + PUSH VMODE_03H + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_04_TEST: + PUSH VMODE_04H + CALL SETVIDEOMODE + + PUSH 0AAAAH + CALL CLEAR_B8000H + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_06_TEST: + PUSH VMODE_06H + CALL SETVIDEOMODE + + PUSH 0FFFFH + CALL CLEAR_B8000H + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_0D_TEST: + PUSH VMODE_0DH + CALL SETVIDEOMODE + + PUSH 12 + CALL CLEAR0DH + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_0E_TEST: + PUSH VMODE_0EH + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_10_TEST: + PUSH VMODE_10H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_11_TEST: + PUSH VMODE_11H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_12_TEST: + PUSH VMODE_12H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_13_TEST: + PUSH VMODE_13H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_I_TEST: + PUSH VMODE_MODE_I + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_C4_TEST: + PUSH VMODE_CHAIN4 + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_X_TEST: + PUSH VMODE_MODE_X + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_A_TEST: + PUSH VMODE_MODE_A + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_B_TEST: + PUSH VMODE_MODE_B + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_C_TEST: + PUSH VMODE_MODE_C + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_D_TEST: + PUSH VMODE_MODE_D + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_E_TEST: + PUSH VMODE_MODE_E + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_F_TEST: + PUSH VMODE_MODE_F + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_G_TEST: + PUSH VMODE_MODE_G + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_H_TEST: + PUSH VMODE_MODE_H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_J_TEST: + PUSH VMODE_MODE_J + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_K_TEST: + PUSH VMODE_MODE_K + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_L_TEST: + PUSH VMODE_MODE_L + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_M_TEST: + PUSH VMODE_MODE_M + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +DUAL_TEST: + CALL DUALTEST + +RESET: + ; Reset the mode and clear the screen + MOV AX,0003H + INT 10H + + ; Print out the message + MOV DX,OFFSET MAIN_MSG + MOV AH,9 + INT 21H + JMP MAIN_LOOP + +; ====================== New Video Mode ==================================== +QUIT_PROGRAM: + ; Set the BIOS mode 03h + MOV AX,0003H + INT 10H + + ; Exit to DOS + MOV AX,4C00H + INT 21H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +LOADFONT PROC + PUSH BP + MOV BP,SP + PUSHA + mov dx,GRACON_ADDR ;get graphics port + mov al,5 ;get write mode reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmode],al ;store it + dec dx ;restore DX + mov al,6 ;get misc reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmisc],al ;store it + dec dx ;restore DX + mov dx,SEQ_ADDR ;get sequencer port + mov al,2 ;get map mask reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmask],al ;store it + dec dx ;restore DX + mov al,4 ;get memory selector reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmem],al ;store it + + mov dx,GRACON_ADDR ;select graphics port + mov al,5 ;get write mode reg + mov ah,[oldmode] ;get old value + and ah,0fch ;mask it + out dx,ax ;set new value + IODELAY ;pause + mov al,6 ;get misc reg + mov ah,[oldmisc] ;get old value + and ah,0f1h ;mask it + or ah,4 ;set a flag + out dx,ax ;set it + IODELAY ;pause + mov dx,SEQ_ADDR ;select sequencer port + mov al,2 ;get mask reg + mov ah,4 ;get new value + out dx,ax ;set it + IODELAY ;pause + mov al,4 ;get memory reg + mov ah,[oldmem] ;get old value + or ah,4 ;set flag + out dx,ax ;set value + IODELAY ;pause + + PUSH DS + PUSH ES + + MOV AX,[BP+8] + MOV ES,AX + MOV DI,[BP+10] + + MOV AX,[BP+4] + MOV DS,AX + MOV SI,[BP+6] + +@@LOOP1: + PUSH DI + MOV CL,[BP+12] +@@LOOP2: + MOVSB + DEC CL + JNZ @@LOOP2 + + MOV CL,32 + SUB CL,byte ptr [BP+12] +@@LOOP3: + MOV AX,00H + STOSB + DEC CL + JNZ @@LOOP3 + + POP DI + ADD DI,32 + + DEC CH + JNZ @@LOOP1 + + POP ES + POP DS + + mov dx,GRACON_ADDR ;get graphics port + mov al,5 ;get 1st reg + mov ah,[oldmode] ;get old value + out dx,ax ;set it + IODELAY ;pause + mov al,6 ;get 2nd reg + mov ah,[oldmisc] ;get old value + out dx,ax ;set it + IODELAY ;pause + mov dx,SEQ_ADDR ;get seq port + mov al,2 ;get 3rd reg + mov ah,[oldmask] ;get old value + out dx,ax ;set it + IODELAY ;pause + mov al,4 ;get 4th reg + mov ah,[oldmem] ;get old value + out dx,ax ;set it + IODELAY ;pause + + POPA + POP BP + RET 10 +LOADFONT ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +include clear.asm +include modes.asm +include tests.asm +include dual.asm +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +END Start diff --git a/16/tauron/ASM_SRC/MODES.ASM b/16/tauron/ASM_SRC/MODES.ASM new file mode 100755 index 00000000..28e72a84 --- /dev/null +++ b/16/tauron/ASM_SRC/MODES.ASM @@ -0,0 +1,1240 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETVIDEOMODE PROC + PUSH BP + MOV BP,SP + + MOV AX,word ptr [BP+4] + MOV Mode.videomode, AX + CMP AX,VMODE_00H + JE SET00H + CMP AX,VMODE_03H + JE SET03H + CMP AX,VMODE_04H + JE SET04H + CMP AX,VMODE_06H + JE SET06H +; CMP AX,VMODE_07H +; JE SET07H + CMP AX,VMODE_0DH + JE SET0DH + CMP AX,VMODE_0EH + JE SET0EH +; CMP AX,VMODE_0FH +; JE SET0FH + CMP AX,VMODE_10H + JE SET10H + CMP AX,VMODE_11H + JE SET11H + CMP AX,VMODE_12H + JE SET12H + CMP AX,VMODE_13H + JE SET13H + CMP AX,VMODE_CHAIN4 + JE SETCHAIN4 + CMP AX,VMODE_MODE_X + JE SETMODE_X + CMP AX,VMODE_MODE_A + JE SETMODE_A + CMP AX,VMODE_MODE_B + JE SETMODE_B + CMP AX,VMODE_MODE_C + JE SETMODE_C + CMP AX,VMODE_MODE_D + JE SETMODE_D + CMP AX,VMODE_MODE_E + JE SETMODE_E + CMP AX,VMODE_MODE_F + JE SETMODE_F + CMP AX,VMODE_MODE_G + JE SETMODE_G + CMP AX,VMODE_MODE_H + JE SETMODE_H + CMP AX,VMODE_MODE_I + JE SETMODE_I + CMP AX,VMODE_MODE_J + JE SETMODE_J + CMP AX,VMODE_MODE_K + JE SETMODE_K + CMP AX,VMODE_MODE_L + JE SETMODE_L + CMP AX,VMODE_MODE_M + JE SETMODE_M + JMP SET_OUT + +SET00H: + MOV SI,OFFSET MODE00H + CALL SETMODE + + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x14_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + CALL SETPALETTE16 + MOV Mode.mode_width,40; + MOV Mode.mode_height,25; + MOV Mode.width_bytes,1000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT; + JMP SET_OUT + +SET03H: + MOV SI,OFFSET MODE03H + CALL SETMODE + + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x14_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT +; CALL SETPALETTE16 + MOV Mode.mode_width,80; + MOV Mode.mode_height,25; + MOV Mode.width_bytes,2000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT; + JMP SET_OUT + +SET04H: + MOV SI,OFFSET MODE04H + CALL SETMODE + CALL SETPALETTE4 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,65535; + MOV Mode.colors,4; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_B8000_ADDR + JMP SET_OUT + +SET06H: + MOV SI,OFFSET MODE06H + CALL SETMODE + CALL SETPALETTE4 + MOV Mode.mode_width,640; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,16384; + MOV Mode.colors,4; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_B8000_ADDR + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET07H: + MOV SI,OFFSET MODE07H + CALL SETMODE + + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x14_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + MOV Mode.mode_width,80; + MOV Mode.mode_height,25; + MOV Mode.width_bytes,2000; + MOV Mode.colors,2; + MOV Mode.attrib,TVU_TEXT + OR Mode.attrib,TVU_MONOCHROME + JMP SET_OUT + +SET0DH: + MOV SI,OFFSET MODE0DH + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,8000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET0EH: + MOV SI,OFFSET MODE0EH + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,16000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET0FH: + MOV SI,OFFSET MODE0FH + CALL SETMODE + MOV Mode.mode_width,640; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,28000; + MOV Mode.colors,2; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_MONOCHROME + JMP SET_OUT + +SET10H: + MOV SI,OFFSET MODE10H + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,28000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET11H: + MOV SI,OFFSET MODE11H + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,480; + MOV Mode.width_bytes,38400; + MOV Mode.colors,2; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET12H: + MOV SI,OFFSET MODE12H + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640 + MOV Mode.mode_height,480 + MOV Mode.width_bytes,38400 + MOV Mode.colors,16 + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET13H: + MOV SI,OFFSET MODE13H + CALL SETMODE + CALL SETPALETTE256 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,64000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS; + JMP SET_OUT + +SETCHAIN4: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + CALL SETPALETTE256 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,16000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_X: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + MOV DX,MISC_ADDR + MOV AX,0E3H + OUT DX,AL + + MOV DX,CRTC_ADDR + + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + ; vertical total + MOV AX,00D06H + OUT DX,AX + ; overflow register + MOV AX,03E07H + OUT DX,AX + ; vertical retrace start + MOV AX,0EA10H + OUT DX,AX + ; vertical retrace end AND wr.prot + MOV AX,0AC11H + OUT DX,AX + ; vertical display enable end + MOV AX,0DF12H + OUT DX,AX + ; start vertical blanking + MOV AX,0E715H + OUT DX,AX + ; end vertical blanking + MOV AX,00616H + OUT DX,AX + + CALL SETPALETTE256 + MOV Mode.mode_width,320; + MOV Mode.mode_height,240; + MOV Mode.width_bytes,19200; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_A: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + ; turn off double scanning mode + MOV DX,CRTC_ADDR + MOV AX,9 + OUT DX,AL + INC DX + IN AL,DX + AND AL,0E0h + OUT DX,AL + + ; change the vertical resolution flags to 350 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,80h + MOV DX,MISC_ADDR + OUT DX,AL + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + ; vertical total + MOV AX,0BF06H + OUT DX,AX + ; overflow register + MOV AX,01F07H + OUT DX,AX + ; vertical retrace start + MOV AX,08310H + OUT DX,AX + ; vertical retrace end AND wr.prot + MOV AX,08511H + OUT DX,AX + ; vertical display enable end + MOV AX,05D12H + OUT DX,AX + ; start vertical blanking + MOV AX,06315H + OUT DX,AX + ; end vertical blanking + MOV AX,0BA16H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,320; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,28000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_B: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + ; turn off double scanning mode + MOV DX,CRTC_ADDR + MOV AX,9 + OUT DX,AL + INC DX + IN AL,DX + AND AL,0E0h + OUT DX,AL + + ; change the vertical resolution flags to 400 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,40h + MOV DX,MISC_ADDR + OUT DX,AL + + CALL SETPALETTE256 + + MOV Mode.mode_width,320; + MOV Mode.mode_height,400; + MOV Mode.width_bytes,32000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_C: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + ; turn off double scanning mode + MOV DX,CRTC_ADDR + MOV AX,9 + OUT DX,AL + INC DX + IN AL,DX + AND AL,0E0h + OUT DX,AL + + ; change the vertical resolution flags to 480 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,0C0h + MOV DX,MISC_ADDR + OUT DX,AL + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + ; vertical total + MOV AX,00D06H + OUT DX,AX + ; overflow register + MOV AX,03E07H + OUT DX,AX + ; vertical retrace start + MOV AX,0EA10H + OUT DX,AX + ; vertical retrace end AND wr.prot + MOV AX,0AC11H + OUT DX,AX + ; vertical display enable end + MOV AX,0DF12H + OUT DX,AX + ; start vertical blanking + MOV AX,0E715H + OUT DX,AX + ; end vertical blanking + MOV AX,00616H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,320; + MOV Mode.mode_height,480; + MOV Mode.width_bytes,38400; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_D: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 400 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,40h + MOV DX,MISC_ADDR + OUT DX,AL + CALL SETPALETTE256 + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,0C009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,18000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + + +SETMODE_E: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 480 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,0C0h + MOV DX,MISC_ADDR + OUT DX,AL + CALL SETPALETTE256 + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00D06H + OUT DX,AX + MOV AX,03E07H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,0C009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0EA10H + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,0DF12H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E715H + OUT DX,AX + MOV AX,00616H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,240; + MOV Mode.width_bytes,21600; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_F: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 350 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,080h + MOV DX,MISC_ADDR + OUT DX,AL + CALL SETPALETTE256 + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,0BF06H + OUT DX,AX + MOV AX,01F07H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,04009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,08310H + OUT DX,AX + MOV AX,08511H + OUT DX,AX + MOV AX,05D12H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,06315H + OUT DX,AX + MOV AX,0BA16H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,31500; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_G: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 400 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,040h + MOV DX,MISC_ADDR + OUT DX,AL + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,04009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,400; + MOV Mode.width_bytes,36000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_H: + + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 480 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,0C0h + MOV DX,MISC_ADDR + OUT DX,AL + + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00D06H + OUT DX,AX + MOV AX,03E07H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,04009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0EA10H + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,0DF12H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E715H + OUT DX,AX + MOV AX,00616H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,480; + MOV Mode.width_bytes,43200; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_I: + MOV SI,OFFSET MODE10H + CALL SETMODE + + MOV DX,03CCH + IN AL,DX + AND AL,03FH + OR AL,40H + + MOV DX,03C2H + OUT DX,AL + + MOV DX,CRTC_ADDR + MOV AX,9C10H + OUT DX,AX + IODELAY + + MOV AX,8311H + OUT DX,AX + IODELAY + + MOV AX,8F12H + OUT DX,AX + IODELAY + + MOV AX,9615H + OUT DX,AX + IODELAY + + MOV AX,0B916H + OUT DX,AX + IODELAY + + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,400; + MOV Mode.width_bytes,32000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SETMODE_J: + MOV SI,OFFSET MODEJ + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,80; + MOV Mode.mode_height,43; + MOV Mode.width_bytes,3440; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + JMP SET_OUT + +SETMODE_K: + MOV SI,OFFSET MODEK + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,80; + MOV Mode.mode_height,50; + MOV Mode.width_bytes,4000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + JMP SET_OUT + +SETMODE_L: + MOV SI,OFFSET MODE_L + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,40; + MOV Mode.mode_height,43; + MOV Mode.width_bytes,3440; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + JMP SET_OUT + +SETMODE_M: + MOV SI,OFFSET MODEM + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,40; + MOV Mode.mode_height,50; + MOV Mode.width_bytes,4000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + +SET_OUT: + + POP BP + RET 2 +SETVIDEOMODE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + PUBLIC SETMODE +SETMODE PROC + + ; Send MISC regs + MOV DX,MISC_ADDR + MOV AL,[SI] + OUT DX,AL + IODELAY + INC SI + + MOV DX,STATUS_ADDR + MOV AL,[SI] + OUT DX,AL + IODELAY + INC SI + + ; Send SEQ regs + MOV CX,0 +REG_LOOP: + MOV DX,SEQ_ADDR + MOV AL,CL + OUT DX,AL + IODELAY + + MOV DX,SEQ_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + IODELAY + INC SI + INC CX + CMP CL,5 + JL REG_LOOP + + ; Clear Protection bits + MOV AH,0EH + MOV AL,11H + AND AH,7FH + MOV DX,CRTC_ADDR + OUT DX,AX + IODELAY + + ; Send CRTC regs + MOV CX,0 +REG_LOOP2: + MOV DX,CRTC_ADDR + MOV AL,CL + OUT DX,AL + IODELAY + + MOV DX,CRTC_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + IODELAY + + INC SI + INC CX + CMP CL,25 + JL REG_LOOP2 + + ; Send GRAPHICS regs + MOV CX,0 +REG_LOOP3: + MOV DX,GRACON_ADDR + MOV AL,CL + OUT DX,AL + IODELAY + + MOV DX,GRACON_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + IODELAY + + INC SI + INC CX + CMP CL,9 + JL REG_LOOP3 + + MOV DX,STATUS_ADDR + IN AL,DX + IODELAY + + ; Send ATTRCON regs + MOV CX,0 +REG_LOOP4: + MOV DX,ATTRCON_ADDR + IN AX,DX + + MOV AL,CL + OUT DX,AL + IODELAY + + MOV AL,[SI] + OUT DX,AL + IODELAY + + INC SI + INC CX + CMP CL,21 + JL REG_LOOP4 + + MOV AL,20H + OUT DX,AL + IODELAY + + RET +SETMODE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Assumes [bp+4] = color +; Assumes [bp+6] = r value +; Assumes [bp+8] = g value +; Assumes [bp+10] = b value + PUBLIC SETPAL +SETPAL PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV AX,WORD PTR [BP+4] + ; Send color + MOV DX,03C8H + OUT DX,AL + + ; Write R value + MOV DX,03C9H + MOV AL,BYTE PTR [BP+6] + OUT DX,AL + + ; Write G value + MOV DX,03C9H + MOV AL,BYTE PTR [BP+8] + OUT DX,AL + + ; Write B value + MOV DX,03C9H + MOV AL,BYTE PTR [BP+10] + OUT DX,AL + + POPA + POP BP + RET 8 +SETPAL ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETPALETTE4 PROC + PUSH 0 + PUSH 0 + PUSH 0 + PUSH 0 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 0 + PUSH 1 + CALL SETPAL + + PUSH 42 + PUSH 0 + PUSH 42 + PUSH 2 + CALL SETPAL + + PUSH 63 + PUSH 63 + PUSH 63 + PUSH 3 + CALL SETPAL + + RET +SETPALETTE4 ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETPALETTE16 PROC + + MOV SI,OFFSET PALETTE + MOV CX,16 + MOV DX,0 +PAL_LOOP: + PUSH WORD PTR [SI+2] + PUSH WORD PTR [SI+1] + PUSH WORD PTR [SI] + PUSH DX + CALL SETPAL + + INC DX + ADD SI,3 + LOOP PAL_LOOP + + RET +SETPALETTE16 ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETPALETTE256 PROC + + MOV SI,OFFSET PALETTE + MOV CX,256 + MOV DX,0 +PAL_LOOP2: + PUSH WORD PTR [SI+2] + PUSH WORD PTR [SI+1] + PUSH WORD PTR [SI] + PUSH DX + CALL SETPAL + + INC DX + ADD SI,3 + LOOP PAL_LOOP2 + + RET +SETPALETTE256 ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/ASM_SRC/MODES.INC b/16/tauron/ASM_SRC/MODES.INC new file mode 100755 index 00000000..3c8a84a0 --- /dev/null +++ b/16/tauron/ASM_SRC/MODES.INC @@ -0,0 +1,196 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- VGA register variables for the various videomodes -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; Same as Mode 01H +MODE00H DB 67H, 00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,1FH,00H,4FH,06H,07H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; Same as Mode 02H +MODE03H DB 67H, 00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0EH,0FH,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,01H,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; Same as Mode 05H +MODE04H DB 63H, 00H, 03H,09H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,80H,0BFH,1FH,00H,0C1H,00H,00H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0A2H,0FFH + DB 00H,00H,00H,00H,00H,30H,0FH,00H,0FFH + DB 00H,3BH,3DH,3FH,02H,04H,06H,07H,10H,11H,12H,13H,14H,15H,16H,17H + DB 01H,00H,03H,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE06H DB 63H, 00H, 03H,01H,01H,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,0C1H,00H,00H,00H,00H,00H,00H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0C2H,0FFH + DB 00H,00H,00H,00H,00H,00H,0DH,00H,0FFH + DB 00H,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH + DB 01H,00H,01H,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE07H DB 066H, 00H, 03H,00H,03H,00H,02H + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 00H,00H,00H,00H,00H,10H,0AH,00H,0FFH + DB 00H,08H,08H,08H,08H,08H,08H,08H,10H,18H,18H,18H,18H,18H,18H,18H + DB 0EH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE0DH DB 063H, 00H, 03H,09H,0FH,00H,06H + DB 2DH,27H,28H,90H,2BH,80H,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,10H,05H,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE0EH DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,59H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE0FH DB 0A2H, 00H, 03H,01H,0FH,00H,06H + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,05H,0FFH + DB 00H,08H,00H,00H,18H,18H,00H,00H,00H,08H,00H,00H,00H,18H,00H,00H + DB 0BH,00H,05H,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE10H DB 0A3H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H + DB 83H,85H,5DH,28H,0FH,63H,0BAH,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE11H DB 063H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,59H + DB 0EAH,8CH,0DFH,28H,0FH,0E7H,004H,0C3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,05H,0FFH + DB 00H,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE12H DB 063H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,59H + DB 0EAH,8CH,0DFH,28H,00H,0E7H,04H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE13H DB 63H, 00H, 03H,01H,0FH,00H,0EH + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CHAIN4 DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODEJ DB 63H, 00H, 03H,01H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,83H,85H,57H,28H,1FH,60H,0B8H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODEK DB 63H, 00H, 03H,01H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +MODE_L DB 67H, 00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 31H,83H,85H,57H,14H,1FH,60H,0B8H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODEM DB 67H, 00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Videomode Structure Definition +VMODE STRUC + videomode DW ? ; Videomode Number + mode_width DW ? ; Width in pixels + mode_height DW ? ; height in pixels + width_bytes DW ? ; Number of bytes per screen + colors DW ? ; Number of colors + attrib DW ? ; Videomode attributes +VMODE ENDS + +; Videomode attributes +TVU_TEXT EQU 0001h +TVU_GRAPHICS EQU 0002h +TVU_MONOCHROME EQU 0004h +TVU_PLANAR EQU 0008h +TVU_UNCHAINED EQU 0010h +TVU_B8000_ADDR EQU 0020h + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Videomode Info Structure +MODE VMODE +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/ASM_SRC/TESTS.ASM b/16/tauron/ASM_SRC/TESTS.ASM new file mode 100755 index 00000000..7401c0ee --- /dev/null +++ b/16/tauron/ASM_SRC/TESTS.ASM @@ -0,0 +1,676 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PIXEL PROC + PUSH BP + MOV BP,SP + PUSHA + + TEST Mode.attrib,TVU_PLANAR + JNZ PLANAR_PIXEL + CMP Mode.videomode,VMODE_13H + JE MODE_13H_PIXEL + +; Unchained Modes Pixel + MOV AX,0A000H ; video memory segment number + MOV ES,AX ; place it in es + + MOV DX,03C4H + MOV AL,2 + OUT DX,AL + INC DX + + MOV AL,1 + MOV CX,word ptr [bp+4] + AND CX,3 + SHL AL,CL + OUT DX,AL + + XOR DI,DI + +; Calculate the Offset + mov ax,Mode.mode_width ; width / 4 + SHR AX,2 + mul word ptr [bp+6] ; (Y * (width / 4)) + mov bx,word ptr [bp+4] ; (X / 4) + (Y * (width / 4)) + shr bx,2 + add ax,bx +; Done! + + ADD DI,AX + mov ah,byte ptr [bp+8] ; move the Color into ah + mov es:[di],ah ; move the value to the screen + JMP PIXEL_OUT + +PLANAR_PIXEL: + MOV AX,0A000H ; video memory segment number + MOV ES,AX ; place it in es + + MOV BX,word ptr [bp+4] ; X Value + MOV CX,BX + MOV AX,word ptr [bp+6] ; Y Value + MOV SI,80 + MUL SI + SHR BX,3 ; /8 + ADD AX,BX + MOV DI,AX + + AND CL,7 + XOR CL,7 + MOV AH,1 + + SHL AH,CL + + MOV DX,03CEH + MOV AL,8 + OUT DX,AX + + MOV AL,0 + XCHG ES:[DI],AL + + MOV DX,03C4H + MOV AH,byte ptr [bp+8] + MOV AL,2 + OUT DX,AX + + MOV BYTE PTR ES:[DI],0FFh + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + JMP PIXEL_OUT + +MODE_13H_PIXEL: + + MOV AX,0A000H ; video memory segment number + MOV ES,AX ; place it in es + XOR DI,DI + +; Calculate the Offset + mov ax,Mode.mode_width ; width + mul word ptr [bp+6] ; (Y * width)) + mov bx,word ptr [bp+4] ; (X + (Y * width)) + add ax,bx +; Done! + + ADD DI,AX + mov ah,byte ptr [bp+8] ; move the Color into ah + mov es:[di],ah ; move the value to the screen + +PIXEL_OUT: + + POPA + POP BP + RET 6 +PIXEL ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +HLINE PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV CX,WORD PTR [BP+4] +HLINE_LOOP: + PUSH WORD PTR [BP+10] ; Color + PUSH WORD PTR [BP+8] ; Y value + PUSH CX ; X value + CALL PIXEL + INC CX + CMP CX,WORD PTR [BP+6] + JLE HLINE_LOOP + + POPA + POP BP + RET 8 +HLINE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +VLINE PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV CX,WORD PTR [BP+4] +VLINE_LOOP: + PUSH WORD PTR [BP+10] ; Color + PUSH CX ; Y value + PUSH WORD PTR [BP+8] ; X value + CALL PIXEL + INC CX + CMP CX,WORD PTR [BP+6] + JLE VLINE_LOOP + + POPA + POP BP + RET 8 +VLINE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +DRAWRECT PROC + PUSH BP + MOV BP,SP + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+6] + PUSH WORD PTR [BP+8] + PUSH WORD PTR [BP+4] + CALL HLINE + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+10] + PUSH WORD PTR [BP+8] + PUSH WORD PTR [BP+4] + CALL HLINE + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+4] + PUSH WORD PTR [BP+10] + PUSH WORD PTR [BP+6] + CALL VLINE + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+8] + PUSH WORD PTR [BP+10] + PUSH WORD PTR [BP+6] + CALL VLINE + + POP BP + RET 10 +DRAWRECT ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +FILLRECT PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV CX,WORD PTR [BP+6] +HLINE_LOOP2: + PUSH WORD PTR [BP+12] ; Color + PUSH CX ; Y1 value + PUSH WORD PTR [BP+8] ; X2 value + PUSH WORD PTR [BP+4] ; X1 value + CALL HLINE + + INC CX + CMP CX,WORD PTR [BP+10] ; Y2 value + JLE HLINE_LOOP2 + + POPA + POP BP + RET 10 +FILLRECT ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODETEST PROC + PUSH BP + MOV BP,SP + SUB SP,2 + + TEST Mode.attrib,TVU_PLANAR + JNZ PLANAR_CLEAR + CMP Mode.videomode,VMODE_13H + JNE UNCHAINED_CLEAR + + PUSH 0 + CALL CLEAR13H + JMP CLEAROUT + +PLANAR_CLEAR: + PUSH 0 + CALL PLANARCLEAR + JMP CLEAROUT + +UNCHAINED_CLEAR: + PUSH 0 + CALL UNCHAINEDCLEAR + +CLEAROUT: + + PUSH 15 + + MOV AX,Mode.mode_height + DEC AX + PUSH AX + + MOV AX,Mode.mode_width + DEC AX + PUSH AX + + PUSH 0 + PUSH 0 + CALL DRAWRECT + + MOV CX,50 +LINE_LOOP: + PUSH 15 + PUSH CX + PUSH 10 + PUSH 0 + CALL HLINE + ADD CX,50 + + PUSH 15 + PUSH CX + PUSH 25 + PUSH 0 + CALL HLINE + ADD CX,50 + + CMP CX,Mode.mode_height + JLE LINE_LOOP + + MOV CX,40 +LINE_LOOP2: + PUSH 15 + PUSH CX + PUSH 15 + PUSH 0 + CALL VLINE + ADD CX,40 + + PUSH 15 + PUSH CX + PUSH 30 + PUSH 0 + CALL VLINE + ADD CX,40 + + CMP CX,Mode.mode_width + JLE LINE_LOOP2 + + CMP Mode.colors,16 + JE SETBLOCK16 + CMP Mode.colors,256 + JE SETBLOCK256 + + MOV AX,Mode.mode_width + SUB AX,420 + MOV DI,AX + ADD DI,200 + MOV BX,Mode.mode_height + SUB BX,220 + MOV SI,BX + ADD SI,200 + + PUSH 0 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,200 + ADD DI,200 + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + + MOV AX,Mode.mode_width + SUB AX,420 + MOV DI,AX + ADD DI,400 + MOV BX,Mode.mode_height + SUB BX,220 + MOV SI,BX + ADD SI,200 + + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL DRAWRECT + + JMP BLOCKOUT +SETBLOCK16: + + MOV AX,Mode.mode_width + SUB AX,522 + MOV DI,AX + ADD DI,64 + + MOV BX,Mode.mode_height + SUB BX,135 + MOV SI,BX + ADD SI,64 + MOV CX,0 + MOV DX,0 +LINE1_LOOP1: + + PUSH DX ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,64 + ADD DI,64 + INC CX + INC DX + CMP CX,8 + JL LINE1_LOOP1 + + MOV AX,Mode.mode_width + SUB AX,522 + MOV DI,AX + ADD DI,64 + ADD SI,64 + ADD BX,64 + MOV CX,0 +LINE1_LOOP2: + + PUSH DX ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,64 + ADD DI,64 + INC CX + INC DX + CMP CX,8 + JL LINE1_LOOP2 + + MOV AX,Mode.mode_width + SUB AX,522 + MOV DI,Mode.mode_width + SUB DI,10 + MOV BX,Mode.mode_height + SUB BX,135 + MOV SI,Mode.mode_height + SUB SI,7 + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL DRAWRECT + JMP BLOCKOUT + +SETBLOCK256: + + MOV WORD PTR [BP-2],0 + MOV BX,Mode.mode_height + SUB BX,165 + MOV SI,BX + ADD SI,10 + MOV DX,0 +LINE2_LOOP2: + + MOV AX,Mode.mode_width + SUB AX,165 + MOV DI,Mode.mode_width + SUB DI,155 + + MOV CX,0 +LINE2_LOOP1: + + PUSH DX ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,10 + ADD DI,10 + INC CX + INC DX + CMP CX,16 + JL LINE2_LOOP1 + + ADD BX,10 + ADD SI,10 + INC WORD PTR [BP-2] + CMP WORD PTR [BP-2],16 + JL LINE2_LOOP2 + + MOV AX,Mode.mode_width + SUB AX,165 + MOV DI,Mode.mode_width + SUB DI,5 + MOV BX,Mode.mode_height + SUB BX,165 + MOV SI,Mode.mode_height + SUB SI,5 + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL DRAWRECT + +BLOCKOUT: + ADD SP,2 + POP BP + RET +MODETEST ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PUTCHAR PROC + PUSH BP + MOV BP,SP + SUB SP,2 + PUSHA + + CMP Mode.videomode,VMODE_00H + JE SET2 + CMP Mode.videomode,VMODE_MODE_L + JE SET2 + CMP Mode.videomode,VMODE_MODE_M + JE SET2 + MOV BYTE PTR [BP-2],160 + JMP NOSET2 +SET2: + MOV BYTE PTR [BP-2],80 + JMP NOSET2 +NOSET2: + + MOV AX,0B800h + MOV ES,AX + + MOV AX,WORD PTR [BP+6] ; Y value + MOV BL,BYTE PTR [BP-2] + MUL BL + SHL WORD PTR [BP+4],1 + ADD AX,WORD PTR [BP+4] ; X value + MOV DI,AX + MOV AH,ATT + MOV AL,BYTE PTR [BP+8] ; character + CLD + STOSW + + POPA + ADD SP,2 + POP BP + RET 6 +PUTCHAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PRINTSTRING PROC + +TEXT_LOOP: + XOR DX,DX + MOV DL,BYTE PTR [SI] + PUSH DX + PUSH BX + PUSH AX + CALL PUTCHAR + + INC AX + INC SI + CMP BYTE PTR [SI],0 + JNE TEXT_LOOP + RET +PRINTSTRING ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +TEXTTEST PROC + PUSH 1FH + CALL TEXTCLEAR + + MOV AH,2h + MOV BH,0 + MOV DX,Mode.mode_height + MOV DH,DL + MOV DL,0 + INT 10h + + CMP Mode.videomode,VMODE_00H + JE SET_TEXT1 + CMP Mode.videomode,VMODE_MODE_J + JE SET_TEXT2 + CMP Mode.videomode,VMODE_MODE_K + JE SET_TEXT3 + CMP Mode.videomode,VMODE_MODE_L + JE SET_TEXT4 + CMP Mode.videomode,VMODE_MODE_M + JE SET_TEXT5 + ; Mode 03h + MOV TEXTMSG_2+13,'3' + MOV TEXTMSG_3+8,'8' + MOV TEXTMSG_4+19,'4' + JMP NOSET +SET_TEXT1: + ; Mode 00h + MOV TEXTMSG_2+13,'0' + MOV TEXTMSG_3+8,'4' + MOV TEXTMSG_4+19,'2' + JMP NOSET +SET_TEXT2: + ; Mode J + MOV TEXTMSG_8+11,'J' + MOV TEXTMSG_9+21,'4' + MOV TEXTMSG_9+22,'3' + MOV TEXTMSG_A+19,'3' + MOV TEXTMSG_A+20,'4' + MOV TEXTMSG_A+21,'4' + MOV TEXTMSG_A+22,'0' + JMP NOSET +SET_TEXT3: + ; Mode K + MOV TEXTMSG_8+11,'K' + MOV TEXTMSG_9+21,'5' + MOV TEXTMSG_9+22,'0' + MOV TEXTMSG_A+19,'4' + MOV TEXTMSG_A+20,'0' + MOV TEXTMSG_A+21,'0' + MOV TEXTMSG_A+22,'0' + JMP NOSET +SET_TEXT4: + ; Mode L + MOV TEXTMSG_8+11,'L' + MOV TEXTMSG_9+8,'4' + MOV TEXTMSG_9+21,'4' + MOV TEXTMSG_9+22,'3' + MOV TEXTMSG_A+19,'3' + MOV TEXTMSG_A+20,'4' + MOV TEXTMSG_A+21,'4' + MOV TEXTMSG_A+22,'0' + JMP NOSET +SET_TEXT5: + ; Mode M + MOV TEXTMSG_8+11,'M' + MOV TEXTMSG_9+8,'4' + MOV TEXTMSG_9+21,'5' + MOV TEXTMSG_9+22,'0' + MOV TEXTMSG_A+19,'4' + MOV TEXTMSG_A+20,'0' + MOV TEXTMSG_A+21,'0' + MOV TEXTMSG_A+22,'0' +NOSET: + + CMP Mode.videomode,VMODE_00H + JE WRITE1 + CMP Mode.videomode,VMODE_03H + JE WRITE1 + CMP Mode.videomode,VMODE_MODE_J + JE WRITE2 + JMP WRITE2 + +WRITE1: + MOV BX,0 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_1 + CALL PRINTSTRING + MOV BX,1 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_2 + CALL PRINTSTRING + MOV BX,2 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_3 + CALL PRINTSTRING + MOV BX,3 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_4 + CALL PRINTSTRING + MOV BX,4 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_5 + CALL PRINTSTRING + MOV BX,5 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_6 + CALL PRINTSTRING + JMP WRITEOUT + +WRITE2: + MOV BX,0 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_7 + CALL PRINTSTRING + MOV BX,1 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_8 + CALL PRINTSTRING + MOV BX,2 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_9 + CALL PRINTSTRING + MOV BX,3 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_A + CALL PRINTSTRING + MOV BX,4 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_B + CALL PRINTSTRING + MOV BX,5 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_C + CALL PRINTSTRING +WRITEOUT: + RET +TEXTTEST ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/C_SRC/CLEAR.CPP b/16/tauron/C_SRC/CLEAR.CPP new file mode 100755 index 00000000..e201a055 --- /dev/null +++ b/16/tauron/C_SRC/CLEAR.CPP @@ -0,0 +1,180 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include +#include "tauron.h" + +void TextClear(char attrib) +{ + unsigned int bytes = Mode.width_bytes; + asm { + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AH,attrib + MOV AL,' ' + MOV CX,bytes + CLD + REP STOSW + } +} + +void Clear04H() +{ + unsigned int bytes = Mode.width_bytes; + asm { + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AX,0AAAAH + CLD + MOV CX,bytes + REP STOSW + } +} + +void Clear06H() +{ + unsigned int bytes = Mode.width_bytes; + asm { + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AX,0FFFFH + CLD + MOV CX,bytes + REP STOSW + } +} + +void Clear0DH(char color) +{ + unsigned int bytes = Mode.width_bytes/2; + asm { + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,bytes + } +CLEAR_LOOP: + asm { + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV AX,0 + XCHG WORD PTR ES:[DI],AX + + MOV DX,03C4H + MOV AH,color + MOV AL,2 + OUT DX,AX + + MOV WORD PTR ES:[DI],0FFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,2 + LOOP CLEAR_LOOP + } +} + +void PlanarClear(char Color) +{ + unsigned int bytes = Mode.width_bytes/2; + asm { + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,bytes + } +CLEAR_LOOP: + asm { + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV AX,0 + XCHG WORD PTR ES:[DI],AX + + MOV DX,03C4H + MOV AH,Color + MOV AL,2 + OUT DX,AX + + MOV WORD PTR ES:[DI],0FFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,2 + LOOP CLEAR_LOOP + } +} + +void Clear13H(char Color) +{ + asm { + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV AL,Color + MOV AH,AL + CLD + MOV CX,8000H + REP STOSW + } +} + +void UnchainedClear(char Color) +{ + unsigned int bytes = Mode.width_bytes/2; + asm { + mov dx, 03C4h // 03c4h + mov al, 2 // Map Mask Register + out dx, al + inc dx + mov al,00001111B // Select all planes to write to + out dx, al // Doing this to clear all planes at once + + mov ax,0A000H + mov es, ax + XOR DI,DI // set es:di = Screen Mem + mov ah,Color // move the color into ah + mov al,ah // copy the value to al + mov cx,bytes // Number of words + cld + rep stosw // clear it + } +} diff --git a/16/tauron/C_SRC/DUAL.CPP b/16/tauron/C_SRC/DUAL.CPP new file mode 100755 index 00000000..e60d1fb9 --- /dev/null +++ b/16/tauron/C_SRC/DUAL.CPP @@ -0,0 +1,236 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// 3C4H, 03H +// Bit positions for font maps: +// +// +--7--+--6--+--5--+--4--+--3--+--2--+--1--+--0--+ +// | | | SAH | SBH | SA | SB | +// +-----+-----+-----+-----+-----+-----+-----+-----+ +// +// SA - bits 1, 0 of Character Map A +// SAH - bit 2 (high order) of Charcter Map A +// +// SB - bits 1, 0 of Character Map B +// SBH - bit 2 (high order) of Charcter Map B +// +#include +#include +#include +#include +#include +#include "tauron.h" +#include "font1.h" +#include "font2.h" +extern unsigned char mode03h[62]; +void LoadFonts(); + +// Points to fonts for Map A Memory Address +#define DFM_MAPA_FONT1 0x00 // 0K +#define DFM_MAPA_FONT2 0x04 // 16K +#define DFM_MAPA_FONT3 0x08 // 32K +#define DFM_MAPA_FONT4 0x0C // 48K +#define DFM_MAPA_FONT5 0x20 // 8K +#define DFM_MAPA_FONT6 0x24 // 24K +#define DFM_MAPA_FONT7 0x28 // 40K +#define DFM_MAPA_FONT8 0x2C // 56K + +// Points to fonts for Map B +#define DFM_MAPB_FONT1 0x00 // 0K +#define DFM_MAPB_FONT2 0x01 // 16K +#define DFM_MAPB_FONT3 0x02 // 32K +#define DFM_MAPB_FONT4 0x03 // 48K +#define DFM_MAPB_FONT5 0x10 // 8K +#define DFM_MAPB_FONT6 0x11 // 24K +#define DFM_MAPB_FONT7 0x12 // 40K +#define DFM_MAPB_FONT8 0x13 // 56K + + +// To set dual font mode, just set the character map select register to point +// to 2 different fonts. There can be up to 8 fonts resident in memory at +// once but only 2 can be active at a time. +// +// ** NOTE ** If you set both font maps the same you are no longer in dual font +// mode. But what this allows you to do is to put up to 8 fonts in VGA memory +// and switch between them at any time. +// +// Both fonts were made with my font editor. I just read the BIOS and +// modified the second font so a solid line goes through the middle of it. +// +// This procedure sets up dual font mode and loads 2 fonts into video memory. +void SetDual() +{ + outport(SEQ_ADDR, ((DFM_MAPA_FONT1 | DFM_MAPB_FONT5) << 8) | 0x03); + + // Load font 1 into 0K and font 2 into 8K + LoadFonts(); +} + +// This procedure reset the character map select register to point to only +// one font. +void UnSetDual() +{ + outport(0x3C4,0x0003); +} + +// In dual font modes, the palette is in effect half of what it is. The +// bottom 8 colors for the first font, and the top 8 colors for the second +// font. +// +// What I do here is to set them to the same 8 colors. +// Black, Blue, Green, Red, Purple, Yellow, Light Gray, and White +// +void SetDualPalette() +{ + // Font 1 + setpal( 0, 0, 0, 0); + setpal( 1, 0, 0, 42); + setpal( 2, 0, 42, 0); + setpal( 3, 0, 42, 42); + setpal( 4, 42, 0, 0); + setpal( 5, 63, 63, 21); + setpal( 6, 42, 42, 42); + setpal( 7, 63, 63, 63); + // Font 2 + setpal( 8, 0, 0, 0); + setpal( 9, 0, 0, 42); + setpal(10, 0, 42, 0); + setpal(11, 0, 42, 42); + setpal(12, 42, 0, 0); + setpal(13, 63, 63, 21); + setpal(14, 42, 42, 42); + setpal(15, 63, 63, 63); +} + +void pchar(int x, int y, char c, char att) +{ + char far *vidmem; + int off; + + // Make a pointer to the font + vidmem = (char far *)MK_FP( 0xB800, 0x0000); + off = y * 160 + x * 2; + vidmem += off; + *vidmem++ = c; + *vidmem = att; +} + +void print(int x, int y, char *Text, char attrib) +{ + for (int i = 0; i < strlen(Text); i++) + pchar(x++,y,Text[i],attrib); +} + +void DualTest() +{ + SetMode((unsigned int)&mode03h); + TextClear(0x1F); + SetDual(); + SetDualPalette(); + + /* ** NOTE ** when trying to print text on the screen, do not use the printf + * text functions. For some reason they do not select the proper VGA font. + */ + + print(0,0,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x17); + print(0,1,"³ DUAL FONT MODE ³",0x17); + print(0,2,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x17); + + print(0,4,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x1F); + print(0,5,"³ DUAL FONT MODE ³",0x1F); + print(0,6,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x1F); + + getch(); + UnSetDual(); + textcolor(7); + textbackground(0); +} + + +void LoadFonts() +{ + char far *vidmem; + int l = 0; + unsigned char oldmode,oldmisc,oldmem,oldmask; + unsigned char newmode,newmisc,newmem; + + // Make a pointer to the font + vidmem = (char far *)MK_FP( 0xA000, 0x0000); + + // Store the OLD 'Mode Register' value + outportb(GRACON_ADDR,5); + oldmode = inportb(GRACON_ADDR+1); + // Store the OLD 'Miscellaneous Register' value + outportb(GRACON_ADDR,6); + oldmisc = inportb(GRACON_ADDR+1); + // Store the OLD 'Mask Map' value + outportb(SEQ_ADDR,2); + oldmask = inportb(SEQ_ADDR+1); + // Store the OLD 'Memory Mode' value + outportb(SEQ_ADDR,4); + oldmem = inportb(SEQ_ADDR+1); + + // Write the NEW 'Mode Register' value + newmode = (oldmode & 0xFC); + outport(GRACON_ADDR, (newmode << 8) | 0x05); + // Write the NEW 'Miscellaneous Register' value + newmisc = ((oldmisc & 0xF1)|4); + outport(GRACON_ADDR, (newmisc << 8) | 0x06); + // Write the NEW 'Mask Map' value + outport(SEQ_ADDR, 0x0402); + // Write the NEW 'Memory Mode' value + newmem = (oldmem | 4); + outport(SEQ_ADDR, (newmem << 8) | 0x04); + + // Copy the font from BIOS + l = 0; + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 16; j++) + { + *vidmem++ = Font1[l++]; + } + for (int k = 0; k < 16; k++) + { + *vidmem++ = 0x00; + } + } + + vidmem = (char far *)MK_FP( 0xA000, 0x2000); + l = 0; + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 16; j++) + { + *vidmem++ = Font2[l++]; + } + for (int k = 0; k < 16; k++) + { + *vidmem++ = 0x00; + } + } + + // Write the OLD 'Mode Register' value + outport(GRACON_ADDR, (oldmode << 8) | 0x05); + // Write the OLD 'Miscellaneous Register' value + outport(GRACON_ADDR, (oldmisc << 8) | 0x06); + // Write the OLD 'Mask Map' value + outport(SEQ_ADDR,(oldmask << 8) | 0x02); + // Write the OLD 'Memory Mode' value + outport(SEQ_ADDR, (oldmem << 8) | 0x04); +} + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= \ No newline at end of file diff --git a/16/tauron/C_SRC/FONT1.H b/16/tauron/C_SRC/FONT1.H new file mode 100755 index 00000000..ae20aa2c --- /dev/null +++ b/16/tauron/C_SRC/FONT1.H @@ -0,0 +1,268 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +//=- -= +//=- Tauron VGA Utilities Version 1.0 -= +//=- Released June 14, 1998 -= +//=- -= +//=- Font Width: 8 -= +//=- Font Height: 16 -= +//=- Bytes per character: 16 -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +char Font1[] = { +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x081,0x0A5,0x081,0x081,0x0BD,0x099,0x081,0x081,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x0FF,0x0DB,0x0FF,0x0FF,0x0C3,0x0E7,0x0FF,0x0FF,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x06C,0x0FE,0x0FE,0x0FE,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x07C,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x03C,0x0E7,0x0E7,0x0E7,0x099,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x07E,0x0FF,0x0FF,0x07E,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0E7,0x0C3,0x0C3,0x0E7,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x03C,0x066,0x042,0x042,0x066,0x03C,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0C3,0x099,0x0BD,0x0BD,0x099,0x0C3,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x01E,0x00E,0x01A,0x032,0x078,0x0CC,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x066,0x066,0x066,0x03C,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x03F,0x033,0x03F,0x030,0x030,0x030,0x030,0x070,0x0F0,0x0E0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x063,0x07F,0x063,0x063,0x063,0x063,0x067,0x0E7,0x0E6,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x018,0x0DB,0x03C,0x0E7,0x03C,0x0DB,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x080,0x0C0,0x0E0,0x0F0,0x0F8,0x0FE,0x0F8,0x0F0,0x0E0,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x002,0x006,0x00E,0x01E,0x03E,0x0FE,0x03E,0x01E,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x0DB,0x0DB,0x0DB,0x07B,0x01B,0x01B,0x01B,0x01B,0x01B,0x000,0x000,0x000,0x000, +0x000,0x07C,0x0C6,0x060,0x038,0x06C,0x0C6,0x0C6,0x06C,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x0FE,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x07E,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x00C,0x0FE,0x00C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x030,0x060,0x0FE,0x060,0x030,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C0,0x0C0,0x0C0,0x0C0,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x028,0x06C,0x0FE,0x06C,0x028,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x038,0x07C,0x07C,0x0FE,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x07C,0x07C,0x038,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x03C,0x03C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x066,0x066,0x066,0x024,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x06C,0x06C,0x0FE,0x06C,0x06C,0x06C,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x018,0x018,0x07C,0x0C6,0x0C2,0x0C0,0x07C,0x006,0x086,0x0C6,0x07C,0x018,0x018,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0C2,0x0C6,0x00C,0x018,0x030,0x060,0x0C6,0x086,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x06C,0x038,0x076,0x0DC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x030,0x030,0x030,0x060,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x018,0x030,0x030,0x030,0x030,0x030,0x030,0x018,0x00C,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x018,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x03C,0x0FF,0x03C,0x066,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x018,0x030,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x002,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0CE,0x0D6,0x0D6,0x0E6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x038,0x078,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x006,0x03C,0x006,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x01C,0x03C,0x06C,0x0CC,0x0FE,0x00C,0x00C,0x00C,0x01E,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0FC,0x00E,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x060,0x0C0,0x0C0,0x0FC,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x006,0x006,0x00C,0x018,0x030,0x030,0x030,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x006,0x006,0x00C,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x006,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x006,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x060,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x060,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x00C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0DE,0x0DE,0x0DE,0x0DC,0x0C0,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x066,0x066,0x066,0x066,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0C0,0x0C0,0x0C2,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F8,0x06C,0x066,0x066,0x066,0x066,0x066,0x066,0x06C,0x0F8,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x068,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x068,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0DE,0x0C6,0x0C6,0x066,0x03A,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x00C,0x00C,0x00C,0x00C,0x00C,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E6,0x066,0x06C,0x06C,0x078,0x078,0x06C,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F0,0x060,0x060,0x060,0x060,0x060,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0EE,0x0FE,0x0FE,0x0D6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0CE,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x060,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0D6,0x0DE,0x07C,0x00C,0x00E,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x06C,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x060,0x038,0x00C,0x006,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x07E,0x05A,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0D6,0x0D6,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x06C,0x06C,0x038,0x038,0x06C,0x06C,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x03C,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x086,0x00C,0x018,0x030,0x060,0x0C2,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x030,0x030,0x030,0x030,0x030,0x030,0x030,0x030,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x080,0x0C0,0x0E0,0x070,0x038,0x01C,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x03C,0x000,0x000,0x000,0x000, +0x010,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000, +0x030,0x030,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x078,0x06C,0x066,0x066,0x066,0x066,0x0DC,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C0,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x00C,0x00C,0x03C,0x06C,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x0CC,0x078,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x06C,0x076,0x066,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x006,0x006,0x000,0x00E,0x006,0x006,0x006,0x006,0x006,0x006,0x066,0x066,0x03C,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x066,0x06C,0x078,0x078,0x06C,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0EC,0x0FE,0x0D6,0x0D6,0x0D6,0x0D6,0x0D6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0F0,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x00C,0x01E,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x076,0x062,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x060,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x030,0x030,0x0FC,0x030,0x030,0x030,0x030,0x036,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0D6,0x0D6,0x0FE,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x06C,0x038,0x038,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x0F8,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x0CC,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x018,0x018,0x018,0x070,0x018,0x018,0x018,0x018,0x00E,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x000,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x070,0x018,0x018,0x018,0x00E,0x018,0x018,0x018,0x018,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0C0,0x0C2,0x066,0x03C,0x00C,0x006,0x07C,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x038,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x03C,0x066,0x060,0x060,0x066,0x03C,0x00C,0x006,0x03C,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x03C,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x038,0x06C,0x038,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x018,0x030,0x060,0x000,0x0FE,0x066,0x060,0x07C,0x060,0x060,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x076,0x036,0x07E,0x0D8,0x0D8,0x06E,0x000,0x000,0x000,0x000, +0x000,0x000,0x03E,0x06C,0x0CC,0x0CC,0x0FE,0x0CC,0x0CC,0x0CC,0x0CC,0x0CE,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x030,0x078,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x078,0x000, +0x000,0x0C6,0x0C6,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x018,0x03C,0x066,0x060,0x060,0x060,0x066,0x03C,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0E6,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x03C,0x018,0x07E,0x018,0x07E,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x0F8,0x0CC,0x0CC,0x0F8,0x0C4,0x0CC,0x0DE,0x0CC,0x0CC,0x0CC,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x00E,0x01B,0x018,0x018,0x018,0x07E,0x018,0x018,0x018,0x018,0x018,0x0D8,0x070,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x076,0x0DC,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0CE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x03C,0x06C,0x06C,0x03E,0x000,0x07E,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x07C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x030,0x000,0x030,0x030,0x060,0x0C0,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x006,0x006,0x006,0x000,0x000,0x000,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x060,0x0CE,0x093,0x006,0x00C,0x01F,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x066,0x0CE,0x09A,0x03F,0x006,0x00F,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x018,0x018,0x018,0x03C,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0CC,0x066,0x033,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x066,0x033,0x066,0x0CC,0x000,0x000,0x000,0x000,0x000,0x000, +0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044, +0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA, +0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x03F,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x03F,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0, +0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x0D8,0x0D8,0x0D8,0x0DC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FC,0x0C6,0x0FC,0x0C6,0x0C6,0x0FC,0x0C0,0x0C0,0x0C0,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x0C6,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x080,0x0FE,0x06C,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x0FE,0x0C6,0x060,0x030,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0D8,0x0D8,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x076,0x0DC,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07E,0x018,0x03C,0x066,0x066,0x066,0x03C,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x06C,0x06C,0x06C,0x06C,0x0EE,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x030,0x018,0x00C,0x03E,0x066,0x066,0x066,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0DB,0x0DB,0x0DB,0x07E,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x003,0x006,0x07E,0x0CF,0x0DB,0x0F3,0x07E,0x060,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x030,0x060,0x060,0x07C,0x060,0x060,0x060,0x030,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x01B,0x01B,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x07E,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x00F,0x00C,0x00C,0x00C,0x00C,0x00C,0x0EC,0x06C,0x06C,0x03C,0x01C,0x000,0x000,0x000,0x000, +0x000,0x0D8,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x070,0x098,0x030,0x060,0x0C8,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 +}; diff --git a/16/tauron/C_SRC/FONT2.H b/16/tauron/C_SRC/FONT2.H new file mode 100755 index 00000000..1a2a5166 --- /dev/null +++ b/16/tauron/C_SRC/FONT2.H @@ -0,0 +1,268 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +//=- -= +//=- Tauron VGA Utilities Version 1.0 -= +//=- Released June 14, 1998 -= +//=- -= +//=- Font Width: 8 -= +//=- Font Height: 16 -= +//=- Bytes per character: 16 -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +char Font2[] = { +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x081,0x0A5,0x081,0x081,0x0BD,0x099,0x081,0x081,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x0FF,0x0DB,0x0FF,0x0FF,0x0C3,0x0E7,0x0FF,0x0FF,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x06C,0x0FE,0x0FE,0x0FE,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x07C,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x03C,0x0E7,0x0E7,0x0E7,0x099,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x07E,0x0FF,0x0FF,0x07E,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0E7,0x0C3,0x0C3,0x0E7,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x03C,0x066,0x042,0x042,0x066,0x03C,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0C3,0x099,0x0BD,0x0BD,0x099,0x0C3,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x01E,0x00E,0x01A,0x032,0x078,0x0CC,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x066,0x066,0x066,0x03C,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x03F,0x033,0x03F,0x030,0x030,0x030,0x030,0x070,0x0F0,0x0E0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x063,0x07F,0x063,0x063,0x063,0x063,0x067,0x0E7,0x0E6,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x018,0x0DB,0x03C,0x0E7,0x03C,0x0DB,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x080,0x0C0,0x0E0,0x0F0,0x0F8,0x0FE,0x0F8,0x0F0,0x0E0,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x002,0x006,0x00E,0x01E,0x03E,0x0FE,0x03E,0x01E,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x0DB,0x0DB,0x0DB,0x07B,0x01B,0x01B,0x01B,0x01B,0x01B,0x000,0x000,0x000,0x000, +0x000,0x07C,0x0C6,0x060,0x038,0x06C,0x0C6,0x0C6,0x06C,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x0FE,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x07E,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x00C,0x0FE,0x00C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x030,0x060,0x0FE,0x060,0x030,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C0,0x0C0,0x0C0,0x0C0,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x028,0x06C,0x0FE,0x06C,0x028,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x038,0x07C,0x07C,0x0FE,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x07C,0x07C,0x038,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x03C,0x03C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x066,0x066,0x066,0x024,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x06C,0x06C,0x0FE,0x06C,0x06C,0x06C,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x018,0x018,0x07C,0x0C6,0x0C2,0x0C0,0x07C,0x006,0x086,0x0C6,0x07C,0x018,0x018,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0C2,0x0C6,0x00C,0x018,0x030,0x060,0x0C6,0x086,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x06C,0x038,0x076,0x0DC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x030,0x030,0x030,0x060,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x018,0x030,0x030,0x030,0x030,0x030,0x030,0x018,0x00C,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x018,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x03C,0x0FF,0x03C,0x066,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x018,0x030,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x002,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0CE,0x0D6,0x0D6,0x0E6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x038,0x078,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x006,0x03C,0x006,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x01C,0x03C,0x06C,0x0CC,0x0FE,0x00C,0x00C,0x00C,0x01E,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0FC,0x00E,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x060,0x0C0,0x0C0,0x0FC,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x006,0x006,0x00C,0x018,0x030,0x030,0x030,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x006,0x006,0x00C,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x006,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x006,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x060,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x060,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x00C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0DE,0x0DE,0x0DE,0x0DC,0x0C0,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x0FF,0x066,0x066,0x066,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0FF,0x0C0,0x0C2,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F8,0x06C,0x066,0x066,0x066,0x0FF,0x066,0x066,0x06C,0x0F8,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x0FF,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x0FF,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0FF,0x0C6,0x0C6,0x066,0x03A,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0FE,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x00C,0x00C,0x00C,0x00C,0x0FF,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E6,0x066,0x06C,0x06C,0x078,0x0FF,0x06C,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F0,0x060,0x060,0x060,0x060,0x0FF,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0EE,0x0FE,0x0FE,0x0D6,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x0FF,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x0D6,0x0DE,0x07C,0x00C,0x00E,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x0FF,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x060,0x038,0x0FF,0x006,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x07E,0x05A,0x018,0x018,0x0FF,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x06C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0D6,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x06C,0x06C,0x038,0x0FF,0x06C,0x06C,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x03C,0x0FF,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x086,0x00C,0x018,0x0FF,0x060,0x0C2,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x030,0x030,0x030,0x030,0x0FF,0x030,0x030,0x030,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x080,0x0C0,0x0E0,0x070,0x0FF,0x01C,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x00C,0x00C,0x00C,0x00C,0x0FF,0x00C,0x00C,0x00C,0x03C,0x000,0x000,0x000,0x000, +0x010,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000, +0x030,0x030,0x018,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x078,0x06C,0x066,0x066,0x066,0x066,0x0DC,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C0,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x00C,0x00C,0x03C,0x06C,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x0CC,0x078,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x06C,0x076,0x066,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x006,0x006,0x000,0x00E,0x006,0x006,0x006,0x006,0x006,0x006,0x066,0x066,0x03C,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x066,0x06C,0x078,0x078,0x06C,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0EC,0x0FE,0x0D6,0x0D6,0x0D6,0x0D6,0x0D6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0F0,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x00C,0x01E,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x076,0x062,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x060,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x030,0x030,0x0FC,0x030,0x030,0x030,0x030,0x036,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0D6,0x0D6,0x0FE,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x06C,0x038,0x038,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x0F8,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x0CC,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x018,0x018,0x018,0x070,0x018,0x018,0x018,0x018,0x00E,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x000,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x070,0x018,0x018,0x018,0x00E,0x018,0x018,0x018,0x018,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0C0,0x0C2,0x066,0x03C,0x00C,0x006,0x07C,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x038,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x03C,0x066,0x060,0x060,0x066,0x03C,0x00C,0x006,0x03C,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x03C,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x038,0x06C,0x038,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x018,0x030,0x060,0x000,0x0FE,0x066,0x060,0x07C,0x060,0x060,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x076,0x036,0x07E,0x0D8,0x0D8,0x06E,0x000,0x000,0x000,0x000, +0x000,0x000,0x03E,0x06C,0x0CC,0x0CC,0x0FE,0x0CC,0x0CC,0x0CC,0x0CC,0x0CE,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x030,0x078,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x078,0x000, +0x000,0x0C6,0x0C6,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x018,0x03C,0x066,0x060,0x060,0x060,0x066,0x03C,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0E6,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x03C,0x018,0x07E,0x018,0x07E,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x0F8,0x0CC,0x0CC,0x0F8,0x0C4,0x0CC,0x0DE,0x0CC,0x0CC,0x0CC,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x00E,0x01B,0x018,0x018,0x018,0x07E,0x018,0x018,0x018,0x018,0x018,0x0D8,0x070,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x076,0x0DC,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0CE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x03C,0x06C,0x06C,0x03E,0x000,0x07E,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x07C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x030,0x000,0x030,0x030,0x060,0x0C0,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x006,0x006,0x006,0x000,0x000,0x000,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x060,0x0CE,0x093,0x006,0x00C,0x01F,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x066,0x0CE,0x09A,0x03F,0x006,0x00F,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x018,0x018,0x018,0x03C,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0CC,0x066,0x033,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x066,0x033,0x066,0x0CC,0x000,0x000,0x000,0x000,0x000,0x000, +0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044, +0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA, +0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x03F,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x03F,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0, +0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x0D8,0x0D8,0x0D8,0x0DC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FC,0x0C6,0x0FC,0x0C6,0x0C6,0x0FC,0x0C0,0x0C0,0x0C0,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x0C6,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x080,0x0FE,0x06C,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x0FE,0x0C6,0x060,0x030,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0D8,0x0D8,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x076,0x0DC,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07E,0x018,0x03C,0x066,0x066,0x066,0x03C,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x06C,0x06C,0x06C,0x06C,0x0EE,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x030,0x018,0x00C,0x03E,0x066,0x066,0x066,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0DB,0x0DB,0x0DB,0x07E,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x003,0x006,0x07E,0x0CF,0x0DB,0x0F3,0x07E,0x060,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x030,0x060,0x060,0x07C,0x060,0x060,0x060,0x030,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x01B,0x01B,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x07E,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x00F,0x00C,0x00C,0x00C,0x00C,0x00C,0x0EC,0x06C,0x06C,0x03C,0x01C,0x000,0x000,0x000,0x000, +0x000,0x0D8,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x070,0x098,0x030,0x060,0x0C8,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 +}; diff --git a/16/tauron/C_SRC/MAINC.CPP b/16/tauron/C_SRC/MAINC.CPP new file mode 100755 index 00000000..34a1247a --- /dev/null +++ b/16/tauron/C_SRC/MAINC.CPP @@ -0,0 +1,181 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include +#include "tauron.h" + +void MainScreen() +{ + clrscr(); + printf("Tauron VGA Utilities v3.0\n" + "Copyright (c) 1998 Jeffrey Morgan. All Rights Reserved.\n"); + textcolor(12); + cprintf("Modes with a ! are not implemented Modes with a % are unchained\r\n"); + textcolor(7); + printf("Select a video mode to test:\n" + "Key Videomode Key Videomode\n" + "================================================================================" + " 0) 00H, 01H -- 40 x 25 x 16 %F) Mode D -- 360 x 200 x 256\n" + " 1) Mode L -- 40 x 43 x 16 %G) Mode E -- 360 x 240 x 256\n" + " 2) Mode M -- 40 x 50 x 16 %H) Mode F -- 360 x 350 x 256\n" + "!3) 07H -- 80 x 25 x 2 %I) Mode G -- 360 x 400 x 256\n" + " 4) 02H, 03H -- 80 x 25 x 16 %J) Mode H -- 360 x 480 x 256\n" + " 5) Mode J -- 80 x 43 x 16 K) 06H -- 640 x 200 x 2\n" + " 6) Mode K -- 80 x 50 x 16 !L) 0FH -- 640 x 350 x 2\n" + " 7) 04H, 05H -- 320 x 200 x 4 M) 11H -- 640 x 480 x 2\n" + " 8) 0DH -- 320 x 200 x 16 N) 0EH -- 640 x 200 x 16\n" + " 9) 13H -- 320 x 200 x 256 O) 10H -- 640 x 350 x 16\n" + "%A) Chain 4 -- 320 x 200 x 256 P) Mode I -- 640 x 400 x 16\n" + "%B) Mode X -- 320 x 240 x 256 Q) 12H -- 640 x 480 x 16\n" + "%C) Mode A -- 320 x 350 x 256\n" + "%D) Mode B -- 320 x 400 x 256 R) Dual Font Test\n" + "%E) Mode C -- 320 x 480 x 256\n" + "===============================================================================\n" + "Hit 'ESC' to exit. Press a key [0-9 or A-O]>"); +} + +void SetMode03h() +{ + asm MOV AX,0003H + asm INT 10H +} + +void main() +{ + int ok, key; + ok = 1; + MainScreen(); + while (ok) + { + if( (key = getch()) == 0 ) + key = 256 * getch(); + switch( key ) + { + case Escape : ok = 0; break; + + case '0' : + SetVideoMode(MODE00H); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '1': + SetVideoMode(MODE_L); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '2': + SetVideoMode(MODE_M); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '4' : + SetVideoMode(MODE03H); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '5': + SetVideoMode(MODE_J); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '6': + SetVideoMode(MODE_K); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '7': + SetVideoMode(MODE04H); Clear04H(); getch(); + SetMode03h(); MainScreen(); break; + + case '8' : + SetVideoMode(MODE0DH); Clear0DH(12); /*ModeTest();*/ getch(); + SetMode03h(); MainScreen(); break; + + case '9': + SetVideoMode(MODE13H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'a': case 'A': + SetVideoMode(CHAIN4); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'b': case 'B': + SetVideoMode(MODE_X); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'c': case 'C': + SetVideoMode(MODE_A); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'd': case 'D': + SetVideoMode(MODE_B); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'e': case 'E': + SetVideoMode(MODE_C); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'f': case 'F': + SetVideoMode(MODE_D); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'g': case 'G': + SetVideoMode(MODE_E); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'h': case 'H': + SetVideoMode(MODE_F); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'i': case 'I': + SetVideoMode(MODE_G); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'j': case 'J': + SetVideoMode(MODE_H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'k': case 'K': + SetVideoMode(MODE06H); Clear06H(); getch(); + SetMode03h(); MainScreen(); break; + + case 'm': case 'M': + SetVideoMode(MODE11H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'n': case 'N': + SetVideoMode(MODE0EH); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'o': case 'O': + SetVideoMode(MODE10H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'p': case 'P': + SetVideoMode(MODE_I); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'q': case 'Q': + SetVideoMode(MODE12H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'r': case 'R': + SetVideoMode(MODE03H); DualTest(); + SetMode03h(); MainScreen(); break; + + default : break; + } + } + asm MOV AX,0003h + asm int 10h +} diff --git a/16/tauron/C_SRC/MODES.CPP b/16/tauron/C_SRC/MODES.CPP new file mode 100755 index 00000000..72e11c94 --- /dev/null +++ b/16/tauron/C_SRC/MODES.CPP @@ -0,0 +1,833 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include +#include "tauron.h" +#include "modes_c.inc" +#include "palette.inc" + +void setpalette4(); +void setpalette16(); +void setpalette256(); +Vmode Mode; + +#define SEQ_ADDR 0x03C4 +#define GRACON_ADDR 0x03CE +#define CRTC_ADDR 0x03D4 + +void ReadBIOSfont(int fontnum, int bytesperchar) +{ + char far *biosfont,*vidmem; + struct REGPACK reg; + unsigned char oldmode,oldmisc,oldmem,oldmask; + unsigned char newmode,newmisc,newmem; + + // get the location of the font stroed in BIOS + reg.r_ax = 0x1130; + reg.r_bx = fontnum << 8; + intr(0x10, ®); + + // Make a pointer to the font + biosfont = (char far *)MK_FP( reg.r_es, reg.r_bp); + vidmem = (char far *)MK_FP( 0xA000, 0x0000); + + // Store the OLD 'Mode Register' value + outportb(GRACON_ADDR,5); + oldmode = inportb(GRACON_ADDR+1); + // Store the OLD 'Miscellaneous Register' value + outportb(GRACON_ADDR,6); + oldmisc = inportb(GRACON_ADDR+1); + // Store the OLD 'Mask Map' value + outportb(SEQ_ADDR,2); + oldmask = inportb(SEQ_ADDR+1); + // Store the OLD 'Memory Mode' value + outportb(SEQ_ADDR,4); + oldmem = inportb(SEQ_ADDR+1); + + // Write the NEW 'Mode Register' value + newmode = (oldmode & 0xFC); + outport(GRACON_ADDR, (newmode << 8) | 0x05); + // Write the NEW 'Miscellaneous Register' value + newmisc = ((oldmisc & 0xF1)|4); + outport(GRACON_ADDR, (newmisc << 8) | 0x06); + // Write the NEW 'Mask Map' value + outport(SEQ_ADDR, 0x0402); + // Write the NEW 'Memory Mode' value + newmem = (oldmem | 4); + outport(SEQ_ADDR, (newmem << 8) | 0x04); + + // Copy the font from BIOS + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < bytesperchar; j++) + { + *vidmem++ = *biosfont++; + } + for (int k = 0; k < 32-bytesperchar; k++) + { + *vidmem++ = 0x00; + } + } + + // Write the OLD 'Mode Register' value + outport(GRACON_ADDR, (oldmode << 8) | 0x05); + // Write the OLD 'Miscellaneous Register' value + outport(GRACON_ADDR, (oldmisc << 8) | 0x06); + // Write the OLD 'Mask Map' value + outport(SEQ_ADDR,(oldmask << 8) | 0x02); + // Write the OLD 'Memory Mode' value + outport(SEQ_ADDR, (oldmem << 8) | 0x04); +} + +void SetMode(unsigned int regs) +{ + asm { + MOV SI, regs + + // Send MISC regs + MOV DX,MISC_ADDR + MOV AL,[SI] + OUT DX,AL + INC SI + + MOV DX,STATUS_ADDR + MOV AL,[SI] + OUT DX,AL + INC SI + + // Send SEQ regs + MOV CX,0 +REG_LOOP: + MOV DX,SEQ_ADDR + MOV AL,CL + OUT DX,AL + + MOV DX,SEQ_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,5 + JL REG_LOOP + + // Clear Protection bits + MOV AH,0EH + MOV AL,11H + AND AH,7FH + MOV DX,CRTC_ADDR + OUT DX,AX + + // Send CRTC regs + MOV CX,0 +REG_LOOP2: + MOV DX,CRTC_ADDR + MOV AL,CL + OUT DX,AL + + MOV DX,CRTC_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,25 + JL REG_LOOP2 + + // Send GRAPHICS regs + MOV CX,0 +REG_LOOP3: + MOV DX,GRACON_ADDR + MOV AL,CL + OUT DX,AL + + MOV DX,GRACON_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,9 + JL REG_LOOP3 + + MOV DX,STATUS_ADDR + IN AL,DX + + // Send ATTRCON regs + MOV CX,0 +REG_LOOP4: + MOV DX,ATTRCON_ADDR + IN AX,DX + + MOV AL,CL + OUT DX,AL + + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,21 + JL REG_LOOP4 + + MOV AL,20H + OUT DX,AL + } +} + +void SetVideoMode(int mode) +{ + Mode.mode = mode; + if (mode == MODE00H) // 40 x 25 x 16 + { + SetMode((unsigned int)&mode00h); + setpalette16(); + ReadBIOSfont(6,16); + + Mode.width = 40; + Mode.height = 25; + Mode.width_bytes = 1000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE03H) // 80 x 25 x 16 + { + SetMode((unsigned int)&mode03h); + setpalette16(); + ReadBIOSfont(6,16); + + Mode.width = 80; + Mode.height = 25; + Mode.width_bytes = 2000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE04H) // 320 x 200 x 4 + { + SetMode((unsigned int)&mode04h); + setpalette4(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 8192; + Mode.colors = 4; + Mode.attrib = TVU_GRAPHICS; + } + else if (mode == MODE06H) // 640 x 200 x 2 + { + SetMode((unsigned int)&mode06h); + + Mode.width = 640; + Mode.height = 200; + Mode.width_bytes = 8192; + Mode.colors = 2; + Mode.attrib = TVU_GRAPHICS; + } + else if (mode == MODE07H) // 80 x 25 x 2 + { + SetMode((unsigned int)&mode07h); + + Mode.width = 80; + Mode.height = 25; + Mode.width_bytes = 2000; + Mode.colors = 2; + Mode.attrib = TVU_TEXT | TVU_MONOCHROME; + } + else if (mode == MODE0DH) // 320 x 200 x 16 + { + SetMode((unsigned int)&mode0Dh); + setpalette16(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 8000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE0EH) // 640 x 200 x 16 + { + SetMode((unsigned int)&mode0Eh); + setpalette16(); + + Mode.width = 640; + Mode.height = 200; + Mode.width_bytes = 16000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE0FH) // 640 x 350 x 2 + { + SetMode((unsigned int)&mode0Fh); + + Mode.width = 640; + Mode.height = 350; + Mode.width_bytes = 28000; + Mode.colors = 2; + Mode.attrib = TVU_GRAPHICS | TVU_MONOCHROME; + } + else if (mode == MODE10H) // 640 x 350 x 16 + { + SetMode((unsigned int)&mode10h); + setpalette16(); + + Mode.width = 640; + Mode.height = 350; + Mode.width_bytes = 28000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE11H) // 640 x 480 x 2 + { + SetMode((unsigned int)&mode11h); + + Mode.width = 640; + Mode.height = 480; + Mode.width_bytes = 38400u; + Mode.colors = 2; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE12H) // 640 x 480 x 16 + { + SetMode((unsigned int)&mode12h); + setpalette16(); + + Mode.width = 640; + Mode.height = 480; + Mode.width_bytes = 38400u; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE13H) // 320 x 200 x 256 + { + SetMode((unsigned int)&mode13h); + setpalette256(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 64000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS; + } + else if (mode == CHAIN4) // unchained 320 x 200 x 256 + { + SetMode((unsigned int)&modeC4); + setpalette256(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 16000; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_X) // unchained 320 x 240 x 256 + { + SetMode((unsigned int)&modeC4); + + outportb(MISC_ADDR,0xE3); + // turn off write protect + outport(CRTC_ADDR,0x2C11); + // vertical total + outport(CRTC_ADDR,0x0D06); + // overflow register + outport(CRTC_ADDR,0x3E07); + // vertical retrace start + outport(CRTC_ADDR,0xEA10); + // vertical retrace end AND wr.prot + outport(CRTC_ADDR,0xAC11); + // vertical display enable end + outport(CRTC_ADDR,0xDF12); + // start vertical blanking + outport(CRTC_ADDR,0xE715); + // end vertical blanking + outport(CRTC_ADDR,0x0616); + + setpalette256(); + Mode.width = 320; + Mode.height = 240; + Mode.width_bytes = 19200; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_A) // unchained 320 x 350 x 256 + { + SetMode((unsigned int)&modeC4); + + // turn off double scanning mode + outportb(CRTC_ADDR,9); + outportb(CRTC_ADDR+1,inportb(CRTC_ADDR+1) & ~0x1F); + // change the vertical resolution flags to 350 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x80); + // turn off write protect + outport(CRTC_ADDR,0x2C11); + // vertical total + outport(CRTC_ADDR,0xBF06); + // overflow register + outport(CRTC_ADDR,0x1F07); + // vertical retrace start + outport(CRTC_ADDR,0x8310); + // vertical retrace end AND wr.prot + outport(CRTC_ADDR,0x8511); + // vertical display enable end + outport(CRTC_ADDR,0x5D12); + // start vertical blanking + outport(CRTC_ADDR,0x6315); + // end vertical blanking + outport(CRTC_ADDR,0xBA16); + + setpalette256(); + Mode.width = 320; + Mode.height = 350; + Mode.width_bytes = 28000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_B) // unchained 320 x 400 x 256 + { + SetMode((unsigned int)&modeC4); + // turn off double scanning mode + outportb(CRTC_ADDR,9); + outportb(CRTC_ADDR+1,inportb(CRTC_ADDR+1) & ~0x1F); + // change the vertical resolution flags to 400 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x40); + + setpalette256(); + Mode.width = 320; + Mode.height = 400; + Mode.width_bytes = 32000; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_C) // unchained 320 x 480 x 256 + { + SetMode((unsigned int)&modeC4); + + // turn off double scanning mode + outportb(CRTC_ADDR,9); + outportb(CRTC_ADDR+1,inportb(CRTC_ADDR+1) & ~0x1F); + // change the vertical resolution flags to 480 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0xC0); + // turn off write protect + outport(CRTC_ADDR,0x2C11); + // vertical total + outport(CRTC_ADDR,0x0D06); + // overflow register + outport(CRTC_ADDR,0x3E07); + // vertical retrace start + outport(CRTC_ADDR,0xEA10); + // vertical retrace end AND wr.prot + outport(CRTC_ADDR,0xAC11); + // vertical display enable end + outport(CRTC_ADDR,0xDF12); + // start vertical blanking + outport(CRTC_ADDR,0xE715); + // end vertical blanking + outport(CRTC_ADDR,0x0616); + + setpalette256(); + Mode.width = 320; + Mode.height = 480; + Mode.width_bytes = 38400u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_D) // unchained 360 x 200 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 400 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x40); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0xC009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 200; + Mode.width_bytes = 18000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_E) // unchained 360 x 240 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 480 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0xC0); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0D06); + outport(CRTC_ADDR,0x3E07); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0xC009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xEA10); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0xDF12); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE715); + outport(CRTC_ADDR,0x0616); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 240; + Mode.width_bytes = 21600; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_F) // unchained 360 x 350 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 350 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x80); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0xBF06); + outport(CRTC_ADDR,0x1F07); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0x4009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0x8310); + outport(CRTC_ADDR,0x8511); + outport(CRTC_ADDR,0x5D12); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0x6315); + outport(CRTC_ADDR,0xBA16); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 350; + Mode.width_bytes = 31500; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_G) // unchained 360 x 400 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 400 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x40); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0x4009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 400; + Mode.width_bytes = 36000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_H) // unchained 360 x 480 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 480 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0xC0); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0D06); + outport(CRTC_ADDR,0x3E07); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0x4009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xEA10); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0xDF12); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE715); + outport(CRTC_ADDR,0x0616); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 480; + Mode.width_bytes = 43200u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_I) // 640 x 400 x 16 + { + SetMode((unsigned int)&mode10h); + asm { + + MOV DX,03CCH + IN AL,DX + AND AL,03FH + OR AL,40H + + MOV DX,03C2H + OUT DX,AL + + MOV DX,CRTC_ADDR + MOV AX,9C10H + OUT DX,AX + + MOV AX,8311H + OUT DX,AX + + MOV AX,8F12H + OUT DX,AX + + MOV AX,9615H + OUT DX,AX + + MOV AX,0B916H + OUT DX,AX + } + setpalette16(); + Mode.width = 640; + Mode.height = 400; + Mode.width_bytes = 32000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE_J) // 80 x 43 x 16 + { + SetMode((unsigned int)&modeJ); + ReadBIOSfont(3,8); + + Mode.width = 80; + Mode.height = 43; + Mode.width_bytes = 3440; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE_K) // 80 x 50 x 16 + { + SetMode((unsigned int)&modeK); + ReadBIOSfont(3,8); + + Mode.width = 80; + Mode.height = 50; + Mode.width_bytes = 4000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE_L) // 40 x 43 x 16 + { + SetMode((unsigned int)&modeL); + ReadBIOSfont(3,8); + + Mode.width = 40; + Mode.height = 43; + Mode.width_bytes = 4000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE_M) // 40 x 50 x 16 + { + SetMode((unsigned int)&modeM); + ReadBIOSfont(3,8); + + Mode.width = 40; + Mode.height = 50; + Mode.width_bytes = 4000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } +} + +void setpal(int color, char r, char g, char b) +{ + asm { + // Send color + MOV AX,color + MOV DX,03C8H + OUT DX,AL + + // Write R value + MOV DX,03C9H + MOV AL,r + OUT DX,AL + + // Write G value + MOV DX,03C9H + MOV AL,g + OUT DX,AL + + // Write B value + MOV DX,03C9H + MOV AL,b + OUT DX,AL + } +} + +void setpalette4() +{ + setpal( 0, 0, 0, 0); + setpal( 1, 0, 42, 42); + setpal( 2, 42, 0, 42); + setpal( 3, 63, 63, 63); +} + +void setpalette16() +{ + int j = 0; + for (int i = 0; i < 48; i+=3) + { + setpal(j, Pal[i], Pal[i+1], Pal[i+2]); + j++; + } +} + +void setpalette256() +{ + int j = 0; + for (int i = 0; i < 768; i+=3) + { + setpal(j, Pal[i], Pal[i+1], Pal[i+2]); + j++; + } +} diff --git a/16/tauron/C_SRC/MODES_C.INC b/16/tauron/C_SRC/MODES_C.INC new file mode 100755 index 00000000..585af88d --- /dev/null +++ b/16/tauron/C_SRC/MODES_C.INC @@ -0,0 +1,262 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- VGA register variables for the various videomodes -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +// Same as Mode 01H +unsigned char mode00h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x67, 0x00, 0x03,0x08,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0xA0,0xBF,0x1F,0x00,0x4F,0x06,0x07,0x00,0x00,0x00, +0x31,0x9C,0x8E,0x8F,0x14,0x1F,0x96,0xB9,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x08,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +// Same as Mode 02H +unsigned char mode03h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x67, 0x00, 0x03,0x00,0x03,0x00,0x02, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0E,0x0F,0x00,0x00,0x00, +0x00,0x9C,0x0E,0x8F,0x28,0x01,0x96,0xB9,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x08,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +// Same as Mode 05, +unsigned char mode04h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x09,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x80,0x0BF,0x1F,0x00,0x0C1,0x00,0x00,0x00,0x00,0x00, +0x31,0x9C,0x8E,0x8F,0x14,0x00,0x96,0xB9,0x0A2,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x30,0x0F,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x3B,0x3D,0x3F,0x02,0x04,0x06,0x07,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x01,0x00,0x03,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode06h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x01,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x0C1,0x00,0x00,0x00,0x00,0x00, +0x00,0x9C,0x8E,0x8F,0x28,0x00,0x96,0xB9,0x0C2,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, +0x01,0x00,0x01,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode07h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x066, 0x00, 0x03,0x00,0x03,0x00,0x02, +// CRTC regs +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x0E,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode0Dh[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x063, 0x00, 0x03,0x09,0x0F,0x00,0x06, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x80,0x0BF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00, +0x31,0x9C,0x8E,0x8F,0x14,0x00,0x96,0xB9,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode0Eh[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00, +0x59,0x9C,0x8E,0x8F,0x28,0x00,0x96,0xB9,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x08,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode0Fh[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x0A2, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00, +0x0B,0x00,0x05,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode10h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x0A3, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00, +0x00,0x83,0x85,0x5D,0x28,0x0F,0x63,0x0BA,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode11h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0xE3, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x59, +0xEA,0x8C,0x0DF,0x28,0x0F,0x0E7,0x004,0x0C3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x08,0x3F,0x3F,0x18,0x18,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, +0x01,0x00,0x0F,0x00,0x00 + +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode12h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0xE3, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x59, +0xEA,0x8C,0x0DF,0x28,0x00,0x0E7,0x04,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode13h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x0F,0x00,0x0E, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00, +0x00,0x9C,0x0E,0x8F,0x28,0x40,0x96,0xB9,0x0A3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x41,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeC4[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00, +0x9C,0x0E,0x8F,0x28,0x00,0x96,0xB9,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x41,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeJ[62] = { +// MISC reg, STATUS reg, SEQ regs + 0xa3, 0x00, 0x03,0x01,0x03,0x00,0x02, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x47,0x0E,0x0F,0x00,0x00,0x00, +0x00,0x83,0x85,0x57,0x28,0x1F,0x60,0xB8,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeK[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x03,0x00,0x02, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x47,0x0E,0x0F,0x00,0x00,0x00, +0x00,0x9C,0x8E,0x8F,0x28,0x1F,0x96,0xB9,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeL[62] = { +// MISC reg, STATUS reg, SEQ regs +0x67,0x00,0x03,0x08,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x0A0,0x0BF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00, +0x31,0x83,0x85,0x57,0x14,0x1F,0x60,0x0B8,0x0A3,0x0FF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0x0FF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00, +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +unsigned char modeM[62] = { +// MISC reg, STATUS reg, SEQ regs +0x67,0x00,0x03,0x08,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x0A0,0x0BF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x31, +0x9C,0x8E,0x8F,0x14,0x1F,0x96,0x0B9,0x0A3,0x0FF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0x0FF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00, +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/C_SRC/PALETTE.INC b/16/tauron/C_SRC/PALETTE.INC new file mode 100755 index 00000000..a89ce796 --- /dev/null +++ b/16/tauron/C_SRC/PALETTE.INC @@ -0,0 +1,62 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +char Pal[768] = { + 0, 0, 0, 0, 0, 42, 0, 42, 0, 0, 42, 42, 42, 0, 0, 42, 0, 42, +42, 21, 0, 42, 42, 42, 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63, +63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63, 0, 0, 0, 5, 5, 5, + 8, 8, 8, 11, 11, 11, 14, 14, 14, 17, 17, 17, 20, 20, 20, 24, 24, 24, +28, 28, 28, 32, 32, 32, 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50, +56, 56, 56, 63, 63, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63, +63, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0, 0, 63, 16, 0, +63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0, + 0, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63, + 0, 31, 63, 0, 16, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, +63, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, 31, 63, 39, 31, +63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, +31, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, +31, 47, 63, 31, 39, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, +63, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, 45, 63, 49, 45, +63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, +45, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, +45, 54, 63, 45, 49, 63, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28, +28, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0, 0, 28, 7, 0, +28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0, + 0, 28, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28, + 0, 14, 28, 0, 7, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, +28, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, 14, 28, 17, 14, +28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, +14, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, +14, 21, 28, 14, 17, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, +28, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, 20, 28, 22, 20, +28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, +20, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, +20, 24, 28, 20, 22, 28, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16, +16, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0, 0, 16, 4, 0, +16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0, + 0, 16, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16, + 0, 8, 16, 0, 4, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16, +16, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8, 8, 16, 10, 8, +16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8, + 8, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16, + 8, 12, 16, 8, 10, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, +16, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, 11, 16, 12, 11, +16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, +11, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, +11, 13, 16, 11, 12, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63 +}; diff --git a/16/tauron/C_SRC/TAURON.H b/16/tauron/C_SRC/TAURON.H new file mode 100755 index 00000000..f14f3120 --- /dev/null +++ b/16/tauron/C_SRC/TAURON.H @@ -0,0 +1,105 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#ifndef __TAURON_H__ +#define __TAURON_H__ + +// VGA register port addresses +#define ATTRCON_ADDR 0x03C0 +#define MISC_ADDR 0x03C2 +#define VGAENABLE_ADDR 0x03C3 +#define SEQ_ADDR 0x03C4 +#define GRACON_ADDR 0x03CE +#define CRTC_ADDR 0x03D4 +#define STATUS_ADDR 0x03DA + +// Video mode numbers +#define MODE00H 0x00 +#define MODE01H 0x00 +#define MODE02H 0x03 +#define MODE03H 0x03 +#define MODE04H 0x04 +#define MODE05H 0x05 +#define MODE06H 0x06 +#define MODE07H 0x07 +#define MODE0DH 0x0D +#define MODE0EH 0x0E +#define MODE0FH 0x0F +#define MODE10H 0x10 +#define MODE11H 0x11 +#define MODE12H 0x12 +#define MODE13H 0x13 +#define CHAIN4 0x14 +#define MODE_X 0x15 +#define MODE_A 0x16 +#define MODE_B 0x17 +#define MODE_C 0x18 +#define MODE_D 0x19 +#define MODE_E 0x1A +#define MODE_F 0x1B +#define MODE_G 0x1C +#define MODE_H 0x1D +#define MODE_I 0x1E +#define MODE_J 0x1F +#define MODE_K 0x20 +#define MODE_L 0x21 +#define MODE_M 0x22 + +// Keypresses +#define Escape 0x001b + +// Videomode attributes +#define TVU_TEXT 0x0001 +#define TVU_GRAPHICS 0x0002 +#define TVU_MONOCHROME 0x0004 +#define TVU_PLANAR 0x0008 +#define TVU_UNCHAINED 0x0010 + +// Videomode Info Structure +struct Vmode { + int mode; // Videomode Number + int width; // Width in pixels + int height; // Height in pixels + unsigned int width_bytes; // Number of bytes per screen + int colors; // Number of colors + int attrib; // Videomode attributes +}; + +extern Vmode Mode; + +// MODES.CPP Function Prototypes +void SetVideoMode(int mode); +void ReadBIOSfont(int fontnum, int bytesperchar); +void SetMode(unsigned int regs); +void setpal(int color, char r, char g, char b); + +// CLEAR.CPP Function Prototypes +void TextClear(char attrib); +void PlanarClear(char Color); +void UnchainedClear(char Color); +void Clear13H(char color); +void Clear04H(); +void Clear06H(); +void Clear0DH(char color); + +// TESTS.CPP Function Prototypes +void ModeTest(); +void TextTest(); + +// DUAL.CPP Function Prototypes +void DualTest(); + +#endif \ No newline at end of file diff --git a/16/tauron/C_SRC/TESTS.CPP b/16/tauron/C_SRC/TESTS.CPP new file mode 100755 index 00000000..e89084fd --- /dev/null +++ b/16/tauron/C_SRC/TESTS.CPP @@ -0,0 +1,376 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include "tauron.h" +#define ABS(a) ((a < 0) ? -a : a) +#define SGN(a) ((a < 0) ? -1 : 1) + +void Pixel13H(int x, int y, char color) +{ + int width = Mode.width; + asm { + MOV AX,0A000H // video memory segment number + MOV ES,AX // place it in es + + MOV DX,03C4H + MOV AL,2 + OUT DX,AL + INC DX + + MOV AL,1 + MOV CX,x + AND CX,3 + SHL AL,CL + OUT DX,AL + + XOR DI,DI + +// Calculate the Offset + mov ax,width // width + mul y // (Y * width)) + mov bx,x // (X + (Y * width)) + add ax,bx +// Done! + + ADD DI,AX + mov ah,color // move the Color into ah + mov es:[di],ah // move the value to the screen + } +} + +void pixel(int x, int y, char color) +{ + int width = Mode.width; + if (Mode.mode == MODE13H) + Pixel13H(x,y,color); + else if (Mode.attrib & TVU_UNCHAINED) { + asm { + MOV AX,0A000H // video memory segment number + MOV ES,AX // place it in es + + MOV DX,03C4H + MOV AL,2 + OUT DX,AL + INC DX + + MOV AL,1 + MOV CX,x + AND CX,3 + SHL AL,CL + OUT DX,AL + + XOR DI,DI + +// Calculate the Offset + mov ax,width // width / 4 + SHR AX,2 + mul y // (Y * (width / 4)) + mov bx,x // (X / 4) + (Y * (width / 4)) + shr bx,2 + add ax,bx +// Done! + + ADD DI,AX + mov ah,color // move the Color into ah + mov es:[di],ah // move the value to the screen + }} + else if (Mode.attrib & TVU_PLANAR) + { + asm { + MOV AX,0A000H // video memory segment number + MOV ES,AX // place it in es + + MOV BX,x // X Value + MOV CX,BX + MOV AX,y // Y Value + MOV SI,80 + MUL SI + SHR BX,3 // /8 + ADD AX,BX + MOV DI,AX + + AND CL,7 + XOR CL,7 + MOV AH,1 + + SHL AH,CL + + MOV DX,03CEH + MOV AL,8 + OUT DX,AX + + MOV AL,0 + XCHG ES:[DI],AL + + MOV DX,03C4H + MOV AH,color + MOV AL,2 + OUT DX,AX + + MOV BYTE PTR ES:[DI],0FFh + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + }} +} + +// This is Bresenham's Line Drawing Algorithm +void drawline(int x1, int y1, int x2, int y2, char col) +{ + int d, x, y, ax, ay, sx, sy, dx, dy; + + dx = x2-x1; + ax = ABS(dx) << 1; + sx = SGN(dx); + dy = y2-y1; + ay = ABS(dy) << 1; + sy = SGN(dy); + + x = x1; + y = y1; + if( ax > ay ) + { + d = ay - (ax >> 1); + while( x != x2 ) + { + pixel( x, y, col ); + if( d >= 0 ) + { + y += sy; + d -= ax; + } + x += sx; + d += ay; + } + } + else + { + d = ax - (ay >> 1); + while( y != y2 ) + { + pixel( x, y, col ); + if( d >= 0 ) + { + x += sx; + d -= ay; + } + y += sy; + d += ax; + } + } + return; +} + +void drawrect(int x1, int y1, int x2, int y2, char color) +{ + drawline(x1,y1,x2,y1,color); + drawline(x1,y2,x2,y2,color); + drawline(x1,y1,x1,y2,color); + drawline(x2,y1,x2,y2+1,color); +} + +void hline(int x1, int x2, int y, char color) +{ + drawline(x1,y,x2,y,color); +} + +void vline(int y1, int y2, int x, char color) +{ + drawline(x,y1,x,y2,color); +} + +void fillrect(int x1, int y1, int x2, int y2, char color) +{ + for (int i = y1; i < y2; i++) + hline(x1,x2,i,color); +} + +void ModeTest() +{ + if (Mode.mode == MODE13H) + { + Clear13H(0); + } + else if (Mode.attrib & TVU_PLANAR) + { + PlanarClear(0); + } + else if (Mode.attrib & TVU_UNCHAINED) + { + UnchainedClear(0); + } + + /* Print mode stats + * + */ + + drawrect(0,0,Mode.width-1,Mode.height-1,15); + for (int i = 50; i < Mode.height; i += 100) + { + hline(0,10,i,15); + hline(0,25,i+50,15); + } + + for (int i = 40; i < Mode.width; i += 80) + { + vline(0,15,i,15); + vline(0,30,i+40,15); + } + + if (Mode.colors == 2) + { + int x,y; + x = Mode.width - 420; + y = Mode.height - 220; + fillrect(x,y,x+200,y+200,0); + x+=200; + fillrect(x,y,x+200,y+200,15); + drawrect(x-200,y,x+200,y+200,15); + } + else if (Mode.colors == 16) + { + int x,y; + x = Mode.width - 522; + y = Mode.height - 135; + for (int i = 0; i < 8; i++) + { + fillrect(x,y,x+64,y+64,i); + x+=64; + } + x = Mode.width - 522; + y += 64; + for (int i = 8; i < 16; i++) + { + fillrect(x,y,x+64,y+64,i); + x+=64; + } + drawrect(x-512,y-64,x,y+64,15); + } + else if (Mode.colors == 256) + { + int x,y,k; + x = Mode.width - 165; + y = Mode.height - 165; + k = 0; + for (int i = 0; i < 16; i++) + { + for (int j = 0; j < 16; j++) + { + fillrect(x,y,x+10,y+10,k); + x+=10; + k++; + } + x = Mode.width - 165; + y += 10; + } + drawrect(Mode.width - 165,Mode.height - 165,Mode.width -5,Mode.height - 5,15); + } +} + +void TextTest() +{ + TextClear(0x1F); + gotoxy(1,1); + if (Mode.mode == MODE00H) + { + // ** NOTE ** the gotoxy's here are a hack so that i could use the + // standard C functions to program this mode. Normally you would just + // calculate the proper address and display the text but since DOS still + // thinks we are in mode 03h (it checks the BIOS), this is necessary. + gotoxy(1,1); + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + gotoxy(41,1); + printf("³Text Mode: 00H ³\n"); + gotoxy(1,2); + printf("³Width: 40 Height: 25³\n"); + gotoxy(41,2); + printf("³Bytes per screen: 2000³\n"); + gotoxy(1,3); + printf("³Number of pages: 8 ³\n"); + gotoxy(41,3); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE03H) + { + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + printf("³Text Mode: 03H ³\n"); + printf("³Width: 80 Height: 25³\n"); + printf("³Bytes per screen: 4000³\n"); + printf("³Number of pages: 8 ³\n"); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_J) + { + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + printf("³Text Mode K ³\n"); + printf("³Width: 80 Height: 43³\n"); + printf("³Bytes per screen: 3440³\n"); + printf("³Number of pages: 8 ³\n"); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_K) + { + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + printf("³Text Mode K ³\n"); + printf("³Width: 80 Height: 50³\n"); + printf("³Bytes per screen: 4000³\n"); + printf("³Number of pages: 8 ³\n"); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_L) + { + // ** NOTE ** the gotoxy's here are a hack so that i could use the + // standard C functions to program this mode. Normally you would just + // calculate the proper address and display the text but since DOS still + // thinks we are in mode 03h (it checks the BIOS), this is necessary. + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + gotoxy(41,1); + printf("³Text Mode L ³\n"); + gotoxy(1,2); + printf("³Width: 40 Height: 43³\n"); + gotoxy(41,2); + printf("³Bytes per screen: 3440³\n"); + gotoxy(1,3); + printf("³Number of pages: 8 ³\n"); + gotoxy(41,3); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_M) + { + // ** NOTE ** the gotoxy's here are a hack so that i could use the + // standard C functions to program this mode. Normally you would just + // calculate the proper address and display the text but since DOS still + // thinks we are in mode 03h (it checks the BIOS), this is necessary. + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + gotoxy(41,1); + printf("³Text Mode K ³\n"); + printf("³Width: 40 Height: 50³\n"); + gotoxy(1,2); + gotoxy(41,2); + printf("³Bytes per screen: 4000³\n"); + gotoxy(1,3); + printf("³Number of pages: 8 ³\n"); + gotoxy(41,3); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } +} diff --git a/16/tauron/FEDIT.EXE b/16/tauron/FEDIT.EXE new file mode 100755 index 0000000000000000000000000000000000000000..98d5c46b4d6a4302d472cd1c6fefd4bec2eaf9bf GIT binary patch literal 151665 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®!#%xNqu$sY??;!gd)WrBWv!$vy3_enL$~)Lu(=#jx3L%_()RkrQ|?-ZH60w zm6G8&l}v?FBS|C_B^BfYoXdyf$!LnJXA~8|u;IAme!jd@(1%n5tU>cx$;QA7w zwY~9Cvq1c@8^&Xg1crAK<9;xL`LmByR4+J1>x+-{j+OKH6o{IYtkGz1I(2FVG&GI6 zI36XGkdea}5rxXcLNvot9vdt&97=?s6+A7YDlk-OMnKwB0&az*lOoA1UZ&YpV`$N= zUf4P&(-~QtZp@M4K0GS)R*HttT@% z)SlD}-L5mOcz$wv0U6+i7gFG??g_3N&*w1umKq8y1#69l2IH6;!IB2^G)Q?l(aLAZ z9#}QR28Tk?7+Rc9+xwZF_w|U4qDE+dw*ziN2Mn(;v zp6-#}Zav%m#_Z8OF@DWrA@>oC9-6#a^FH2YNi0GrLnJ{}9ut@^v$zS;8xJM)r=}$u zmPu=aDNH+KqVd%ep1#AOa5S~w9~q*Iah^(FO; z#iM=t3UD9aRncKAfnd%ik?%ecY4$-ck13JS6R3Oi#0ad7a6<13YgY_~MuTfHf$B|z zh1jg_wz*^qVO7<%7^*}DIWY%VnFFoN^fc4b6iTchvzQY!v$ixvVr!y_IIVs_b;MTa zL^5I!-6$GF!%3`{g7G9Q!X&0Y&>1S8915-E#Q+t>k`$I$A`zo?P$DH4D`*@9Ff{sg5dxv#aG zd^p+NPGs7S)we2O5$QH-pTVd7gL>4ozrm--j-#F-BZntQf{a0w7NwQL45$~c8;{;- zc=kwtKdn=ZGS80;&7w8N;t=(+DMi&NE`=qbo}eCo30kK=J*@W~(rNL&V>vBOrU!Cb zw9f!eOEV)kEuuvdpQ=zGJUa$k)}+$IuR9!y^~C#3Uaxl7U>{Uhr_%(ifmO84M9rvo z9=vp72rH2x+WqLoS|lDr3)Ay$3iO#PC^5*|vf2ZuFOaYVqgLwXi<||trxYAxgy}-q z!M*VoT37|cYf}9oQsi0ly63ge>ETp+XUjrH%Aafu4-d0B?Hz61j8`DaR&tiL_u-ks zFivULVNO?P580(`IEAf`{{CQ!@d+=*`e9Ci!!*>w1|w@CgRGzHCWg~Me6Wx8QaDCE ziG?Tz?l6NQN3eC1im$@91^F)Fze`!~I+}JP`q++*4AB@*veuc)X15%;3?;^Dylq)` zPit%29PFe1NRG{vx%-p1cC^plue`nM$KsYQY?(of&9a`kbC!VOZPSRM$he)z+iQN; zqV6_Sifo!B{`TD{Ti7AIl;O5u)Zh@Q!_HGWJ3cCo!&dZ!h;MOZGD5RZ(wZYvHOIQ z@>21V(%NQ4|0pl3Q4nu@6RRtw?7^p!5>IHfQ6^A@Kk*6EXB}+DTcnI23atx#t&KwEdNP@iqMatef_kHOXf%)a>L*ugO{lOR1`BB5oAYlLa$1HFh+CT7_Dk; bUuaPVQiA?SUo@o;nzq*V9yW)5d87XqhIj+7 literal 0 HcmV?d00001 diff --git a/16/tauron/FEDIT.TXT b/16/tauron/FEDIT.TXT new file mode 100755 index 00000000..42883ec6 --- /dev/null +++ b/16/tauron/FEDIT.TXT @@ -0,0 +1,93 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= +=- Tauron VGA Utilities Version 3.0 -= +=- Released September 20, 1998 -= +=- Font Editor Docs -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +=- All Rights Reserved. =-= that you put my name some- -= +=- =-= where in your credits. -= +=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- I assume no responsibility whatsoever for any effect that this package, -= +=- the information contained therein or the use thereof has on you, your -= +=- sanity, computer, spouse, children, pets or anything else related to -= +=- you or your existance. No warranty is provided nor implied with this -= +=- source code. -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +A mouse is required to run this program. + +On the main screen is a blue box with a white solid line surrounding it. +This is the MAIN EDIT BOX. Inside of this box is where the font is created. +Left click with the mouse to turn a bit on, right click with the mouse to +turn a bit off. + +In the bottom left corner there is the ACTIONS box. Inside is all of the +options that you have available. **NOTE** The delete this character action +is not operational. + + Update this character -- This action puts the curently edited character + into its final font position. There is a charcter buffer and a character + list. When editing you are editing the buffer. If you don't want to keep + the current changes, then don't hit update character. But if you do want to + keep the changes, then hit update character before hitting anything else. If + you don't the cnages will be lost. + + Display next character -- Hit the left or right arrows to go up or down the + list character list. As you display each character, it is editable and you + must hit update character if you want to save the changes. + + Goto character -- Goes to a certain character in the list. + + Read font from BIOS -- Read in a font from the BIOS which can now be + edited. + + Add a character -- Adds a charcter to the end of the list. No more than + 256 characters can be added. + + Delete a character -- Not operational + + Dump font to FONT.ASM -- This dumps the font to a text file ready to be + assembled with an assembler. + + +Along the bottom of the screen is a menu bar with choices: +Alt+N New This creates a new font with dimensions you specify. + +Alt+O Open Opens a file. Careful using the dialog as it may no be + intuitive at first glance. + +Alt+S Save Savess a file. Careful using the dialog as it may no be + intuitive at first glance. + +Alt+A About Opens a window containing information about the program. + Also has contact information + +Alt+X Exit Exits the program. This does not prompt you to save the file + you are working on so be careful. + + + +Here is the structure for the files saved in binary : +Header 7 bytes 'KINFIRA' +Width Word +Height Word +Number of characters Word +Bytes per character Word + +The rest of the file is the font saved in bitwise form. +For example: This is a partial text dump from an 8x14 font from BIOS +Every byte (8 bits) is one scanline. Notice there are 14 bytes per character +DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH,099H,081H,07EH,000H,000H,000H + +If this font was say a 16x14 font, every word (16 bits) would be a scanline. +Take the same line as above, represented as a 16 bit wide font: + +DB 000H,000H, <====== First scanline + 000H,000H, <====== Second scanline + 000H,07EH, + 000H,081H, + 000H,0A5H, + and so on... +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/MAIN.EXE b/16/tauron/MAIN.EXE new file mode 100755 index 0000000000000000000000000000000000000000..f8caffeb75a744a168ab40e1c743598c63a7b729 GIT binary patch literal 18460 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 literal 0 HcmV?d00001 diff --git a/16/tauron/MAINC.EXE b/16/tauron/MAINC.EXE new file mode 100755 index 0000000000000000000000000000000000000000..2668a905ee8668b8a937757fb1784c8b48068d45 GIT binary patch literal 82375 zcmeFadtg*WmOozoNOz|bI!%n>A=89ciw2PpiG+?Z1i0}TThI;x4eBT|QPBzA!Eqpj zXRWGypaOUIaV?cml8t@F?Ix zz+Hf;fQf)HfDAwypetdr^#tGu;A6l}z$<{~0Z#)~1C|0F0L%f*02Bc{fGYtb00RI? z0M$I%dK&N*parl4Fr4kQN`^XH0pMyt7GNMC74Q+Ovwa9?2D}ZZ2mA%_AAny1<^rYw zasgKYMgcAXqypSm`xA!)T!6uVbU-S=0k8us03#rp<4^1Yv;$57P5_PrjscDU4gn4V zJ_fV^J^<_lYzH&~-Ue&|ybAbFz(&AJfENJI0e%ly3s?hq5>N-I0jvQ022cff3{VNE z0L%xJ14g?TdvhdX*8r{noF2j0(|}4q3E(QgIKbtA{lghs0w@O*0eHsSMdnTbT0G0!W0Z!#I_BTKcUHz0Am0SK>IYtqD71)c=3JzHy5-3%zu!v zn*dV*R{=Hyb^t~{#8?L4bGFg;5@0RhK|l%M3cwIR8elEr)B=_PssVe98*Og_mI0;% z3IR^Q8N)`~yMVs{)&dp)W&kb+qyrKF=aAomhZ%bSa6jN~KndU$z>R=u01qG=a3$a} zKnlPBI6WWq2mBqd3-A`;FM#I(&jMBgeg${{a5tb7FazMQZnT*J-&i)<-Ul=T-T^!d z_zmD5KoQ_lz~2*42f!AihE&0ECYA}Zon|WAixy+M%!q>(Zr3m9e_UovH_`pGdAD=SOZuFm;)#QNPs-R zV8A)l>s!E=fM&qI16BhT0pJDyL#A+>%v5>2hg~rygu-CA@lGQb2H^>L% z&ezo?-KRDloifEeF(J@iy}P>O(~!f@UN^FRM}ym(!J};<*Q2bqCG+?@n01@oa{eQ^ zOI2oEV0(ud-66PMG4DHBZ)szzdBowY#MmN?1r&*mWPb*yzO~?eqQE>-KSp)=I2jHtGvECe-SfP6fU$@=Pzci zirjj`%r}f|_ppk~H{UP2@+aUeWAk-y7|3ft!G=0^9SXS~4m-tU@aD+O8k7C??LcZ< z_Do*T+p9e9yzB{YWok|Z;1R%lz=MEtw)QqwXY(TVr%aK}Ax+{@}M z+%Xr9d90p|s@++4aLdmPyN3@meNc6YzSEc(velF1_xmX9oEb z`H<%e{~&kuwW{CYuDQi9{%g;U1!j4xyf3)Tq8#;n;=e>bh+yX4ZdEOQt6QC8v?@(* zwFHm1wryrw76W(|$?l2w8!9aBn)?kRgMWNa2F)UahHZ?Q8*Z0deI@G(vyhq3d_%`^ zlVrKh)L^nq%aYTJvgVZC*=S~n6Kpji+EhdfNl}+vY(6@xsmlItrKQ``vA`~Gy>9Pe zQ=6&tT(Bz20_M}tE1oR}O|=cRpLw?V`**eO*->#8KMT%2fA+{X%FsBE|8rJ8&=V|g z`}5f&fA1bTr%e9GosD+pE7@f6uA7wQUFQMh0j|mNZerf>vk5inld@`ZJXxEKud#5Y z6-_LvlAks5ks6<+`pDz<#^>^>20a0fBj6Qt%aQ6MOL_;^NER)wucX?MpJhXKcys4x zb?~=!*Jkl>$|~4u^ObCu&a&`w3nxc-vE>!pzA(LaM-H;4GP^3--8I%#(%H@I3M-Qj z1kYL)jx~KYR{c|xd9!1aHN4%T_))FR%p*k?m#f85%`kY94WLMARB_e#qBWJ>oFeyHYFs?c z=ET?7>joB{VNsWPnAKI13Iv&?PJ&Oxut|<P0OJ3H(26B6(eVUoH%Qdgiko)*3maG-^AAhmD!PN_+TDRd7L{D5ntR0l}l;Nr=*=+!?Go#r%U%$u7~?!gr`Z$QCx6h=ckym08@f z6|X_bVhmQDVSX3lc589RsUTa;=jeV&lNjD(qy%>OxkJ{VWCs(VTbaS1Ps_e`UeEty z)O!){H;5nxfhXtO$VKtI{Gfgty8Y!7xy77W>7QZ(9f_4SeOEGC5=ngg|r>|adlPY4M zx%4!hh|)z9d+XV_ILJ=RB|K5>m9Sm&S1a2iOLPp*6zJKV!V6HiE*9&IT6qe&`{FU+ zShwj(P5^^8!l3+nFnBepW55%(#`13E^`@l%N=cPLHTf9F=Q<#})XcZn6erhIT55c@ za8Mg>lR@RpCd`2qOm3W0whevYYjrcD>G4&T*;v5mukb-tOi?xIo|rf15oI7cmMWPs zU!f^g$>yG9_0w>fOdSrgN8k(I->H+Kpwz!Q!-=eBo4Jj~dlYuN>(*0a>VX3#?z1)-!*i2) zfYqN-&)T*eSH06+^*3dC!%sxf&y&Mj=n>0gs)!2@wn;J7v-%B1SeczTK`gLux8Skv_ACYIt-FU&lkA%5@S>J{QWdch9pT*= z%c6?I5pJRv;;kuNrRYjxN)svcOcUx=Rq01L8%Qd;9b`e7Bn|O0IqC_UlXee#3Wafc zx@5^A?>L$UX%I4D_vsgErmEw=bl2Rhj{kaS=2lA013 zW8FbMS6O0l5JN7uqYKm=?(S$dFu(a|;!D@>jhz1T0>ewOSQsPFzcB8RG(oirHre`Q z1Q|6M{a*k#KQ+IZQz!O+tw6~bPDK>p~i&j+sKVF~Nmf4Boo?nna^6Vc; z6xGn@Q!f=LMqEdD4T{wYh()SBhyvsTpo82ozTtIMJ+-l8uN*~@oGk8|JJrl>bq8bd zQQzzak7Ns&Jfn6PPkm{?znY^U4CKGwah>M?~HuAK1QfR+cI^ zCit@CgQ1o4vL<^R`4cKWUNvBoVRqxB9 zxMv&~WY*0W2`B3bAB-h@h$l4iIaEtn&J(^t33;Dux6I5k`!CgV9AqgiRdepjQgh0( zP{7!MrKQalA6UBCatD6fEf0#=A{!-vV*3%hf?_isyPU^=6Q3RUp<>D zmsxfXdva7Y?>wCS;bZ!2>7NQFsOL5pg2UkktAjzY>@_M0-taHgr>WU%wug z#bLaxIBb66(zJq0U!t*VY3mvc!p+hN5L0UP;^#PH$_*u8oAC|AY1hx$ma{6MC|cYa z$ewZQbj#`$Q7G+5Towo{V@*a+Ntp zP6$e7WA!=Xg4CpjUs*a1P=1gI|7MEJSF6vN1D`-bjJ_MWn;Z*v{tdHVd*n9t$uZ-e zLZXF({$^Y$btW||+Pn9#yl3xWENmMMQfFj5Py4%-Qagr?zr}~ON77Z4;f&m;E-j8S z128=qDOF#yDfZXwisd!uUn9nY+of;WD&N`cmQ}tkfu-Vn&AwggGQd}OJY7^2sPdn<8geM5XeO;p(a_a+x_ty?V-&P?;IoXE47rM;^eP>DF-FxlNN^O1I7mFF!|l z10{wUoLybKCG)$LA0k7~-X%tPZ)80~W-(-m#_3jIH~!0l3KRYZ6%CqMEs9 ztGgc#^rP5I&~Z*-9=W8t`%%a=-7^FI(GUeU-WZ&J%D9*U88a210wUndWW};6Bm7YJ zjh;`Jw8N`_`I9z{3*XU=?(PUYfZx^Ps!NoOgxamX`skDKlVozZ|~0`}!MK z?mTKm{4w1}zQb#3=BMtL^?qmy5A8nE26;VE-i0y}5hZeSHyQ}6B&eShqrPI*XkYJT zmrJcC>4ZC!fJk67Yf+KAIRTqGj&8ZKtxmF`@|#A5x16P(ALyvAYV|HQg*TtI2CI&P zDM>Ui$sZNQ6;+h#k!T6#nK$(aNmg2z3!SKGoMR4ZICUXrSYdx+V&!oF<^HGZ!tQF7Fbsb5sFs~Y9S1M zjIGa~fVD_%87;qkS<3LHvTmw~$)Dy%t^Ck8L}#Gp-$XI!6M`X45M$}HLOgpbkyNr-NwT`Pyrl?H2KSkh#$|Ug0^u^=%z43tVPc)f7 zO~_n8|JshyQqT}c(`w;T;g70`SteYEWv$-y78hy-LQ!C3Om11j)iV(Wjw2?C*<`8iI%z9vKCN zx(E59GX6_Y2F02i>Y(*i%wrjS_2Qwy{3^y44U}C~>=om_qw;UdbL5rtazx&WO>~`6 zxf;)nA>^{g4C*X{JwHM&=sDGDFYOcAf4I)A6f?zhvU9|p2(4WbC3e6Wj{5RIH^h>S33 ziJrimfV9Q{*SFB{6S4BJrMDQdlR$+pu`vHb#H)TNiR?t7CwNZC{d2GjP%45fR~+*M9pIO78K`s2HaY83Iaoj*qNAlg!t_&Q!76USFZ2em zPy?iV$Hx;>q?)JuURpuJa%2zM zR}_E2_U*xJ*!SZ6pecs)Z29l!;j#L`lp>VD&C5a(A<-t1ChlJktHU&5OV(egH=ved3Up=4z^0o zmfGCYL!qZnl9B_olY!FSPb>|QmfxP#=trYs>bk{fhH?nQ_Z4tr2LSPPX-F?ZmYgWb z!sk0K4cJJk;p5-Z)+eyu1V$bU^b2+_YVT@`Naz#E1=kqaf`sgb$V7}kSlNon=OTRs zK)V5%*(p^z z#dp;@^6UZBt_!=O{V=`btw!o_ud?EO^@>MS%v0H)W$p=n#*#i;bQ9DdUDd2&YVQ!t zG}F^DNGVf(e{X&73O;uXYx92zAkV$I(0caZ0`=`Ox` z9O0KquSQ{|j$5uVtU)ehjVl9q-_F;0;dvJZ)@mcUw7VI#~k=HX=Nw%8Zj@5R{-jDZw;yG85 zw9xE1U6GJ^`jT@6N4}cfvCYW*7J0k;$zG*nn;9z?EjOUI)5bbZcQhk{;mPb42fW{;Mkw9d-Uo zW=qHEf9W`#vnowGYFFCGN$;4)&#W#!)bXk5gYM#-8uJ+Y0<(FNVlqnRmyVp+#9qRB zow_7%z($8qC~=vLgeeT+^>#+v-J9pR1U*Ov#0AaB~4Ss(AfUw&l9q z%>}!MMJCx*ceSS<%rwocOYO0m`5f<9=CNtR`ATIZ@qVGbHkY1 z#Ktn%uEzZtVA4%FC$Jp0z+dr;`S-^K;?<(1v?3*}SL6PS%*bv52@+r!{^;EgKKSs@ zVfe~PVv38!v~57X+V)QZwwIlUEuS}O7`&O#ZI|o@Kg3;PKln{$rKO5lEOYOStH>Az zBi*<^s>pj237xChqYo|UQw=VX#qxA<9*B)MT1f|0;tcK^Y^9y!^bb7i-}i_WfoS#+ zyf(b=iCh zfzRV{iX#gf>q&1M<-fY_V4cedVZz8TZjG&VHH}gx)*cw^u^{l`^)@zkL(?c1cryGP z8(ZhvF-jRRRz||H&4|Dl9!=u0ogNfnIz_%65}_G;39dSe5p_c5FiJvZyv(s~UR=Pv zp0U{$w*j(6?N-ws>ac_cmJ=a|jVTZY92m(>;ai!tw!v*ew7LTVQNuPQ6$xR+V}ccU z-8T0IBZEng3q%@JXR)w4mlw!fJY0?Y?Ka>h|PN z{G3`OtxY$xx_!^`G?aK7Pe?gXsMw-|*N#zWc1$8Es8G|WKtlKxOq$^ol@owi#mnDl z@CvVnplKeJ!u)AloGfz>nWZ7UcY4@Q0W-bXpVfR0BR6H=VIDBU8=g%8vq_2^2zxuw zI)p;%VE4wL|2M(_jBU$qczW9fQVxryoQM(w1INmare4WGP)a^yddGnTC(Hf}rG0Hg zX|s57rb1;mws<H>ANarU;Mb&VF+ z3>kIkzTq7+lRKcZJ^eh2yt=lbpsu0zKtbJsY!w>SolC!C&Pvnk%(?gP^zZcZOOM0D zS=*4noD`8B2b6uhOh@=E*68M0M8vTkbQb?K`K+n4u37#jv&|iXslS`3W$_X}LS)`& z+N-lQOyojfZzTZ_8r2F zO0$wY1Ft_LltA(rfl;!q6(y}CY%VY3hDQn4vR5qo!tnA~R^FF}8M<`i1&rp#eJ5aEzR`OdpM7TLDAsljYiqWw!dlQ@xO5k5n<0G33$pN)bLIWP zFT3YHGk4}(dB@L{P%a{i>@r7cWiw@pI>XntTJWKSDa2>Uttqb^TkeP-7JCC*h#c5)+VVjTQba zNyI`;r>(llcPaPvm7tSrzTx@s!frY_NwkGk2zR^cpW?FK5-8#|L*Q4`n0&f<0yKNO zhy80UjB2z}HjjdrORS^F(@R^dF4(}l1&iqaOH2>ZH5IDLd;HdCRM*Tr1%uL-|xUL#7~IiSOwH4F|S$% z)rSph#yMp}X}fmjhZn#Al0)wLhM!R4TTztQ$V+U9m6(PS%|E)t?YZllenN>iQihdeS zh_5_?9BcvDLBVVNSn7IU@Xe&Y<6ajb7G}yD5GyH=U7cT#awJ-YBG#{|oLPArX6Esz z|K|$6K1D!)l5e-v=Ngp3NN5hE@d#Ir^^$f95pJUhGIm#`u9#kgQ;SpO_fefHd_41C zkQR_`ct5=jc_c~QflDETLEGiGUz5%P4wTV&HoIZ>h* zkba4SoEQ2#f~C8O9p%ep?c9M|EZ@(L2P&1hwPmydfBZ-vJU$Oe2SGfnFgSj}C8;cs z7%N?iT$CD;4%d|(R?807l^x<%G>Q#x$ndS7;pZGgi6eL}$<=EQKBTFF%QIM%>V-N{ zdB+b`o)oGMz4)~F%JZzyb^ByRJy3WBm!!p^o~FesN<&|E)s;oTLPLS#^!Qz3h^ye0 zBr+nyPV6LTPfVmou|k)KZA0wz3Iwn_5EV$%=C54Rg<4=ck3^`ZvQ9WOjg2n7#pRi= z=UHMzzOhVxTE3`svn3U+j)#*TwXT8mp3V;E;xU+g9j!gE;Y{v^Q@J^EI)c`xvxFD5 z77djQ2Td~&FAb^`(I&BKr)gb(Y+Gr_hwU8;)ZeZ?`lU|NG?NZoB2xg;E&c53UJ5M1 zxiq}a!xDr3=-H!2TLuYASEJQV;6xfNSaaCI?fWKxsU3nfjbHZO<9wUUcsIyDqdyVkul=|@HV`smL<$#^AQ zPaS_)we%8d9pL@`TBoCwe&31VkDR0N63%*4|r)Tl!gv$pb^2R!}xq{lF%3; z>4B?y)tYM;MYrHeO!SwK713VNqG`%fp+_7rL2nNlYyWvwx_VW`HWB&WcU7ONWX4s+ zr&VP@Tvf*Ns*s*lU1)TxSNEw-;*YD&k?dYNCGFC3A}WTD_2Njp{c0}|EdTz;eDDq^ioW*N7VQhzLFLc#o2v2qiZ7Xj3OV% z)Q7xi6D-N0^gWagwe@|Ih!4)B#Jbo&Z;e&C@x`v8Vm}!#DB$rW2NFDz-CqUISI76F z)rG66wbVmO57YgVmYSnwtI_p>j3=<6b3HW2y*Pg6EYUVS8tI>=$Tc%(hMjE!?S-~F z<8q9T|5fF-uO#$&X!msQu0Dggwf11W&BIUD2>jiqBC@R&voI{8`p_8L%CwDZB%byZ z83XrnHx4tvX$|<|LX(P&FIESp!lx%=eJMJAE0er zGHbxBTx1z#V%M0MSZ?!kOI>Ou1e11Qgy9Hx5Zgkpni#C=qTR@C*n4hAMmDn_yTFJH zQ>EC=ri#({tqp68;LMS*7&0qc`@>VDDb zuUI-a%CeWv?Pl5V!?{LSO>AIE?|}qqShGY&F%wn@OOG&0fYR3~txb|BQ1M=aD1CBY`O>+v&fi zU2=j@C|kJ-ZR7Nh0pDc!ArPI*@Mj=OfqyVh*~62u-hY0}=nDdH244`sdSevrRH2?u zvmf^H-A23_{SLgD+ok@70QsR9Cv1!HX2V-Ge{&*~*mpVXH@byYezlQX$l6zcb z$)%-{MF!Wq6s}i<6JTiMzCPZZ3PU5sl$lmLEi=u9lCpT3o|^cQhem$Z$FB^2iH3-! zrxDIF-UwD|1dU?%tKvN}8!vH0L5Z4eqNt!sSlM7utwn!8PY0_QiAX01_cTT;az(cH z8b~6$dpq|=1!+LXQf0384jL)5dMHF;r9+kL;(UmTLzSFZS|u}Z{Z__OA1R1@8?f8Mf|HPTwC};VSVAw!jB3M7q%6yEO@%$ z&js%kd{S_%;M;=4$*##`C+APTb#jOH@4m?kCNG=(yUG7Kxnc5$laEg3q8pas!Kzd; zYlkKUOo$#8*Sos0+{TO|dRLd;ySie%t1H&Kx?;VnE7rTZoN`&0=u{UOczd3l$~P*g z2Y}1S9uL$uqs8EA6E3YAQHMJe=Oa4Y`+5pA`fQO{L8n3{dhf%mue-o}&p`KN#<(Jy z9D6sq3t`pBi&7z&Itdc$uCiq1Ufx_3P^!$--l^4Z5^co;hAR2G3qeDbaj`Vef>G~* zq9R!ttjD3I?x#EA+xhb;$ES2ou}>W`_0p+VPQ7O8O;cx0oj0{|YFPWXZ0ZwJpPBm7 z)cUF0rhYK>v#Gq@dNeUbJ)>ZHjUoR028xG;+>P{I-!-wkT5k*a|=;7 zN7_(jg%Te-M)1*JpGW=F=e|-_DS zlOYL9prhVViSq>S^Ap57xE6jPD`4;PP{jyIe$+2h_`l*^0QUNjN2;Q_G}Kn+0=wX%g4 zxeJ;wCAUla4gR~}8aR@#PWAQ4_K?)X^{8qk_!)M@n9*r5(UU_sfYSjEp**!CgIUM% zQ$+@?yGO`n+vVb>y2gJ6HlT1yuxca=Ohs8ne?C&A(#A97uS1Z%fGj;S04}xiFjlCd zpzyt2!6s)<_Gf9MaHvghL5&Hwgrs`eH(Zu7LcX^{(wnl6S~28n3`q@G-PdEWzXj?9 zn8|EGiPP&(I<|b!<)ur1zJV&rDb&1Ajfh*iVJ-;G$0kTuj$DExgy1>8cH?t52Gwr0 z5@-%lD+jBU1LJ6etm2nj*mn6fWbur+jIkyR&Bw8v_TCxm6%y;MF6dyfU7dv6HAtYg zM1-_13fAU(T7<%6TRcEMa&hvBS8i5JuhmN?;+UD(|3<4T=rp9<&8cmf4%$;H(y?IG zuou@0Xqf7|wtSz28$!WGGzS7c&SPQyo3lQRObi_1k5y$d<_svSK^ROv0<|a&eMCB3 zPXykO_h4mAn^sq0V-p5XNRYE3jdntE#7!C4^z=hfL>H?BUg;GF)s7?GO?<77%!V{e zuabe*W;cGe&>Lp#W~q^})xOR0!JObNW=NwrNbU7bcZ73<)vDOPfO5fm>+~77!AR9* zp#!ul469c>rg|OWBWme0GeP(2d~Ad-FhyQvbMFexZLiOO%^z0HFy(zroRr^+{xbJ& zdCj7z46o3do7B*X8&r8sHQZHjd*LpIyB6*mxNn1dI^0jdT?h9}xP5T{8{ALAeFxmL z;C>43HE`brcNyHv;QkHV_riUT%D3sahMgg@XvVRd74y~R6$RKHseK_IZ+Y~#agwTB zpWTq%5?X;oYwkfpWVWUZPZY9d7M>`4jSo*CwPre=Kz27-HE$Lg#iX+C?>F6+N+BTxp)x2UJ z&v7oY?`~f4Aa|6jIK1vnza3;<%gNgM4#+C6cqZDs;yNBfLg8!Sn#x^;sNhXQEU)~e6NP2&CSw(VxvwPnIyRb_GW1~F<1uK0uE;tsSBaX$VjP-`KKUe z28JJQGpJmqZTYR1wwMlprLnJixT$iasm(3lhOTYS!BmqIf@M0E!O`p%k8gOzZc+_q zRBXpyE{sc8Y>awWOD};Rmxx7tV0^nY#NfZFS$df@G)pgyg24^VlLBqMBM^!}8XW=W zzyB62-e~Nb-8fArV2V6o&{_O2lj~r<6&Y8z0#yA}UNK3Qs)MRaY5V#dN z1x`h&0vFUv;E}H3F;L)P9eVe(yA&F|uRALL!-{pxowH}pDxJBDB(q7lC-y>rLXvB_ zg~GJ$PMDLRP2V_v3vybCfe(9{VlwDE)j%W-UyY+Tag*f-w0n696Fog&A0n1gTqeX8 zA*q7+-0-ka3Z)zUcOu$=A-x0unu#d9X^y!T13grde6FU4Hdl+4f|&~x7H{}^QZ6E& z4==$CAQyM`%>I-O#1O8Osa}%H{4>Z$F1ZS$$9P@I+6ncP(dZvXGZPe5Mn8^-(Hs>& z!ExPTCxk2<8CsYV{)Ci;;9b zjJ-G<-|NZ&8}P+cclaF`2SLW_cGu0p#7{FaIn+6WvB-^^tC9tQbvcTP)|6&+L}oo^ zKL-Q=BW6ItJf>wPV<$R{iy0b60lIX9HWIl+VUDmh!j*f0LMoRN>t?)ZTdyYCgvWJP zXJlM&CAIs<({*q{lH#IEyIOe$mtEne4rs_Oro$QBE>0Vkz*yo8eWVaus+cfi`af-( z=5A=wwL?R^B&rr&_azjGG2tkD7EOW@0$K6#HT8E-{2rkuyi+8A7{IrT6mxb=+af_qT@Bvnj()GiJV}ZYA9qM(jA7F{wyTHaF&cZ!LH&+5$y{=NQV9x z2Q+bhE|ok&MLB|?J#0y$N;_|uTX6Y7`_^%O2teJD4X`8WP^VY zga=Rt>`Ee84!XvTuai<{jG?{J0Cn5*44L8iES?#Dqk@#DC>LPUgJFBo#ZEug52tF& z=o}O-`#@8nW7A%M$T$_5J00Q3F~J?vWFL6oRLFNcB!$n52QI*kRS=|!?Ap;P9^d0T zPSa7?kDCin1ebfHQ{KqO=(SXzG=qQ9dAVT?p_O{sd0~1kn^4C4&g0AQU!iw~UO>x%fW zQPG8JptGCGP7rs{T>&S+<1u#|xse279F16VSzGXI0uC--EHqBP!k91O3W+V0J~wZ} zy?Indb5W{+xvWreow;3}-|kjj_vYO>R13j%5c{xEbONYoW*8wKtdNf>7@Ln{@E+-r z%mI*r-Y=&c0gX_D_*!M@xQN$Ob}Yuwts&_+Ha52N*qq5JRE)xEWvg0wJbWik$zp^( zE=E}LB8M1Zl^gXcp!#3-s(x+R5t#EptiqB#Bprc@uf*R^)&5z9>K~oe3P9x zQ97kSaKrXn7vDBZ0&T@@6HkjXq1%dmca+e-kgtCUpE7ahfwu19ik)aU4KqR9h~E<~ z#=-Cz+#VnnIken~i%Ir5d;=@Ntl2j!x1(C1kv6)anYHDge;hKS4Igw3y>F32Tix+p z3pmZ;=eQnA&*Gqt+0&l&hbY(U+1`Q?REraU??i`Qx*aFIxBhB1-m zC?77?KtJUe&;qSwF!*nvHm8(z_ps`zkkr;x)`qeKs~(3g4N;LvSYvTGb*?`a=f$}m zjYp)R6(xqg7wMQ3X43H1Zb7o8ON=KS7{T8+<}AJTgD$)^g3lpDYr~>w>BC9V5v2Z; zQOTpJq^ax-k*TTdFdk&fAUrfuQ5aw7hTr*zAQepzLFq8|(+;CIaVph|7Cyx5Vx?xo zz%Uycq(k%`xdxq!Dhc*E5xLZei%-CDz{|vQz}$lD2v6O8gxqr35z!0VL@)ekHq~6O z;b#WDhI=suiIiF;4?^KZ`00byLFjM7Z($t8Vc0_<3F@WKlcYl+z;BTfgMBxK6AV~q zWZxkKp-+v52f8SN4&&`|jxO{_=p8LhWuM20`Ef|vuL~Dz+HeO+KNa|Qyj%J#8T#J==Dm%U0~Ra{p>2b1O2`Vs z#X}R|g>Xp*HQ^2#MR)=w5sB+Qc7*?W25u}W$z28a227i@oG5qp8PSSUm3xqHUsH-; zRT`IQF}y*djTs!mE=^-|8fsz_ZU%H|7z^uwXGW{w~%wuV1?UzKtbIs9fLLlqmAT9lAJjEI42IMmj_^9*k{UT|xUB5UVA(NnTboUJ zG9DR-`$Rxpbl~zQC>`>}p-~n?qqr9uxdM&xK!cCJz=GB@m=-w}T`?>M6Bblcbllqv z*v5>Z(`i#`;?Wr?1kR8TBV%h*SvW=&3_7r|JwoOThd>gO*?);p-ebZz!ryd3nqrEe z!5#CD$Okyd7WS_ok}a@nB}cX+qi{U0iG6~e0uNx50E3pH5;sAlsg=jnN;G0vn;9@< zVH^Wj)q<-WbmfQE5EP9MZy$>&IQWYJ7hM8e)GU38{yskplhLq8YOOFuevR!^A|0n5 zkxu7X(RfFpa^Yn2>jm(Ln&^r9U?T%?O)#{(A88kF@);SI7KH5 zyAN7&zq{;UdIOwFPoK9c-h#>>4i%aAPUl9isXx zdI~p@2rY&aS{WxgwUx9!&}gb}EC;kPM@PD-TVRc0NX$pVG+K)VqI1(|ASASRB3T^5 zy10+)k?A(3E|XlA4CIGER2VF<2dlkpk5jB|_fe13;}(WEO^Fn0d-! zNCKvXAscB1aBBvP7vg3qF$L2UFw$9_#$VZY405~} z)wC?CDHS9)4a;NHx+KWemWctIms5ZpU+GITt@^|m;0XT?9U6Qha)tbQBIF~)1YJD6fAXa}6>bJegOgYKE<0wtk0td91@y#z%NnmVKD^GA~5h*Uk#u6W79b(WpKgJ|3K1!`Imi;}%LyqWm_4o`L7hRCoSlW37xoepALD@5jR(Te-GG`W)Ecl#tSGED>;5D70O2}!iuz;VS3Ev z22zc&mlgA&!x}vCKzYcQ^P(AYEqfs2}s7*Af2c2+X7V42Cp$38QcAj3gi3=r9V=Ildrhzx+M6 zeaGL5+4hmDj}~owwMJ=TJCw=$xpGU`&cQ%OvjXmY_5lJM^qaP)Iu2aYP!O{d<_d4V zyhfYj4BaNC%%oy4PHG+orHFf!fVrdOug$Q~&C*6G(ozV`1PI|0D-R)RqQzitxtN>u zakOZ!5u~S@#GyZWU#yP&IJE3b!@j*X35W)AUy%H+`Umqs^mHQnU4IABdqggNh9?;} zJPF*jGdw~%z|2Cr0IUQpZrbPQIRY*Cf=^qW#K-OQbB2DPw89=)k~G+ltC^sQ!<;=B zTim!ju7y{UE?T17)@=ZsYSiOn%gx$F#w8R!DltBc*qOwi76Izud z$>AR)6f7R!iNIpWkby^mE=Ib@Mo>L1NlN!$r7-}E3$!LpGg@3<8D^5SCA3HSUc!Z$ zSZrgYCP`_;i$ZFqslyRA@8J#TPlODKTH?MvJ)8th*gt1NOR6=={U&PBZUe% zokI15r_k`>Fs3%NC}%OLHAy-Vm>Qo$PlFH|=cRtBZ)(`w(k;0lEVZ#RE?AY${NLBZ zAEF*^q#j=Nf6>EZ>bhNYmyR80+!!mo``$S}zk7k7zWf^R=l|6s_x<8t+A*Z#7{&OG zB=?y=_hB5!;BHbayg8RK8$X?a;~LI!xS1#Zk8-3K2@KXElpj*ZhhyixrQXSQ;Wv%# zs%wz<$-CY19J7gpVhhwGHn|DvOuX3fIWRmNIiZD4=tzvSXW|!TY4}a%zp3~Jq$B(n zb@spFnhrUIq!#%=PUx1w$Y}^deisYDUM&JrXtZ*Km#MHpp(G*eojZ-Vh7Qx)V>ow3 zSi0~HOn&S~pXvDJM%b?AhuwOvViL=04B3zDf)LZ^a-;iSi$8(J^B<0HXzs^1GO3KW z@a#ESR)rGvd!-^JyzLCfQfpP0uNad~{D<)Ollu@PX_BkFCyTF2@N?n7bM#=nh0Q)M z>^|nrc@iJbG_`&z^c@LwD9>dSv$ZT_LwU-JE# zZMZ;YYkx4a@!y}B?*f_K+&8l=O{RL2^CXBd+Q=mx?!iv-_i`rwt(B8@T0ye%%emVS zb2IK^jJYr8Zd1%n=`Sxg$J`f}UyFYUF*n7(yxbCVQ|Ptj)|gwAZ;QD_`H3;NDBm7) zi}I6VZc%=6%q`0A7juj99Wl2kKSg)nxod}ovAJAYX7#uc;TH|-AQo6mEv80D{Mc#2 z9mx<|@X-=(94p?F@&29=8fAO~q+Jy=E=N;YS$i-5)I<;F|YD2DOAE{1o!AlgEaP zaszp+)IDC!C^wQvCHENWn)hBtxtTof(>*@VC{G}d+jNhU8RZu8m_iMo>&1~yoTfYQ`lqd1EgOT4Pn^#HgHB!3>z_o}7Ag(l;5&j*8ev6C# zMW~q}~6Gx1nb7h!S9@lTA}U7-OAl=SSrJ>;2I}e)K<8( ziy0Q}=2ggG>yW{F$e@L1z!hgA1KiE=JsC`1`W9ax{T`Jl19J z?b?C0TFLqb4|eV9*}A$0L9oJ22Hcvo^zSCta`*(k1|vl~=F(NGh69G?nz>-LQFBC6 z+`G-w2J_$cTogzX-_8-bxj&)}EfJY@Sax`D1aZO-X1_IT6eVm`j6H=Y#grIUEHFg_ zZa^UPDf+A40oK79mOj@94HkV?Z86M9&vYE1Yg5md8n9I3o_x(LZt8>jlfHz9jb4(D zDf%f9{S-yVt}i^}qPL^d0ZqOUN?*0Bx*98|y;wnYW$uwrDZ{BVLV_&8`W#ZXC8>Q; zBJ`^UDVkZ?ZK~=tRd#u*?14{}iRj*xth;ZrWm+-|VrN!j6rjW=(zbKE*N+wK4e9+K z*0WVMDiMeJ?IpNl?Hm&0BS?gT*sV#1XE@H&N3qBdipN6L3lP;#$sOSa^46EiawUCC z$?L;-0>BQ#a}=swXru*dVaRcLuRxn}5#fMzSQsMdMsSNw@>C`-3L^s=^yqFVVyZ-R z`>!$jC@C5<*x~Ua4M&Po<1HI}EC%?Lr>t-ET;~N(Ugs6V(|1(r+vAxsygbEMj-+C6 zv6ZK+o;u!JK8QTVQ`y1o_j+;~J&O*!Jz9&LLSfkyMv+H*%U$F#TtxPIavBghn7`d) z49r4-33o*0Hk6()Qk6T)+3MvxuvA!vAEKrmiR??a?_kKOSHL%fUN6tp%O;Wq@ni~! z48)i1wtJi@%a=1MqWzpG;#Vj_*ofl0m9X)gR^VMdwSbpIn>_a5_5xUiLQ!N}^o5=- z*j#`lxR&v}BoFmU;#~9v@Ij8g)zcbK0~Q4~e}$gY9;snVfekaHEU)J1%vJ?DcnWm* zG^OP7MLa$j%2BfeH9JQwL6n25(4$x+Vzua8^f_Ti*#w*6jeghdT(p%pV!~OKnvp+1 z)Y-y?ha>DJWHbiXXC_QNhP7>28DIt@wqYsD|CPmiy5<>&t$lD1j{yJ6^vJGxLwfv; zJ(;-X<;45P#rO93o8se_$NR^{Ul#L^V21*@nF58bdB2bOy5`l#y|=`@x5m9&hU?h7 z=4A|5UZ#wO2Bx^?O^OS+E$)4O-21Ay_vhl?-y9yn`EBHsK{(eBfK*5=WY_3`2LFTK=_;O`4n)$>C4ViQ43;Fzt8quP82V_)}5F&kQF zHf&D7=Qet#!(g-V$VYJq{I@c}DhI~Jn59uYTrSnr{W_~g1$wH_bJxX-loNW~xt3Lj zdq^=7Z@F{raeP+|^Ck2jvhPdO7g}$KPf$9tUJ_sj zNdmeA*e*&G65ttf=n^1AxDJv4PuEDNg;1nRfbBv8JXIr|ikGF3SV(~1k_7lojr2{t zECuoHDu{0vk(@`LyX+M5I4*T4^nAQ1f*^>1ok9fcEW}BW%G3)vnQzsO6ZkD8kIB{FB`j*iH=_IF!rg!!Z7vn=K8V(YQ~p(K86YO`fnxxiT0v1#+?2pyM@^ z;Ao;q(1wAYC&0((VhQ$GalIb|%4SH0_%PV?#9-7M7(LHD$`S62QtEpXsf+>xCE3Bt zU>TIe%p$)w1f!O~h>JO>A~O)r8n|rUbBMP=#5*4ax)*teCxJyi zv<0L60>kGWM(hAbVfc9{6by|-tih-Q(Ohm?MiHiG@zsak7*yv+8WAl8W#55lm&W5* zh8i__?s|yoBFeS^QI^>Bk?|eEx7A=a2p` z^GE6z{BiMD{E==U-NM^o8=WiK1XtV`VJIX$P{|86^{L=%AG4A2HtY)hHZe zquIh2$;@z)TI(wscIp`x&Vq`(Dsc_S9^fQ0l=6ph7Jr!P_`_Vr9|<-5VPpJ}*uWol z;Yt#ZWbx=H9uDzH5f6_dfEzdVl$&zgF8LG;q(Uq`;cL@*@A=TCM12rB&d z`TVEW`=9gqR!nj_pNrvRU2VjKy8SF=d6I$m;Ws;eMBV$FS$VctL=o|nHa zMW8H%Dk055{NAzy6W@EL8p$RecJW9)(Mvb)2=C!a5~2DwIKo>sC+WtGj_`kSr%-Hz z02|0D=^BZUTg`)DGF}KP&{tYVO`(!z0tjT^rg62Yta{4 z{Iw}i7Q5!{$c!xklZ74`YyL57TZFPe*Dbr|{d|lbk0Xb>^maQnG~YHr@$<5Z>y5ci zTE-WA142EG1&Z7$e-TtJ37#!US-D+YuQS__-5z-p>TxBte3;@WAFkNTO^T&_sA4S7 zSo;>K)YmqcCtH=F*qIQ{OG(4!Ebk|r<;iP*P8u#v1^%$=2w$Np50qb|Twk81Oe?=w znOvT(TvI+k$t@qKOei0uWR(wAt|-4mxvYGMGOGM%$}sF{h@7WU&aamD2ObXK;RGHo z;E}2YuQdXX-UJ?L{6FAVEA$Wo?!pRobA71b^ved?c9)L);>yn5xyum=_&UVdvQ zSs-}5P>Ux?$@GyPQVsJhA?zc<3@N58Cc6iWdUxUbFsX60`JtO4mO{JtK~_)c)^eBKG-+CpnG(JlNq3uoaR4;u=BQ~Bj+q<>`0v=u>4l8=31C_eL z8_HfRn6X~}XxPGsx#1uT=jo$iZjbnG77#E%K_EV@1r<@JckPU;NkIhd(J=?33-I9! z1H*7T6b}}j`us{E9o^AtOZKi^fGd$;EdyhI&Yb6C|K9gvkI#PKL@D~oKgE7(5B5`F z_4Sk(~y3he=90=5?rkuEae!v%*$b!?f^VUJ~`r}9#m9u|0Gm0xffSH4oDPzk3T!a+c6_MX?< zwbG{alm@d~l=ElIx&M>pXcPSHv2su$LP<3B51{^ijsAT#nIlSAp8+NQVc9XLb6{j@Hw0$lJ}{k`#rB^SfR$VvbYs1 zj$!%rVnsFuH=dDkGM)LrEmep4@u`@H$9I^_K@X8RXeusP@{bpVf)v{TX2w$AbJ46>K^z>rUZ72_M8J)(>dh^A#9!_DeA57ae zXzdMy(dO|-t0-`Y9ysIzfi6AJb%8))B%W=?1pXj z3OpR}KRmbM?)mpaa=H-yJ@OR272kf-O&L?Jn>OXf-u~n&e7NGlyXW7VF(orIGMmM zzV-CdrBxzcmHL^gZu?4AH8*1qM)9|3qEpYuIdM_Eb6{THS6_Yg^gz9wfq7L(JTT@) zGDI0DQmg#$t8G*O{c+#CxrK#uMRM-B?diAPdU~4{?s5zs|LFVpdsO6*H~0Uw_a^XB z6?PMhKfvo!!k1hUrA&p zjOAwvRAUsO=~SAnJcOqB8~vKfangz#i_^^5eBB14b7$PEqOk%?6w4%KW-eQ16^}qP z-m=VC^I6ffi?+!^`9kx9s$xNIHx4EXNWEyEJr+ zSPJDL{&ahbWep9x-+uc*gVkIqnf1sE#%vzY&FBp}PheM;%jL4-`%|+jb~S?Kj%GoP zXpEzYF?wb(a086)4vk1}*4d1Y@*Bunbn-7p{(jxRscKw5U5_ZXs>|#_YOZJms=nqH zVZ}tF8k=&d_7x<6ef#$9-KP0VqVC&B44Ltdq6aLa9)HxtS!LU)zirn8R2-=w zVp&)hJin=YMI_mO3FV6J4qV2VO`KfXIa^`f=^3=G(8gPu?ej8)REFYXyWMYt5{E{qL z2D<)@4Hr@4ZMXVgmN{I~(llK_gH>myM)g&eIeh$nrc-O0;nA=Fp7xX%czH6DERXFmm zsH6O~e9<*C?d|V!35+H(kP8wcei?TF9p8+M6qY=M_^R=3GQP`2(@g1*ii=@v$;errhWB7LgIQzEKbO#B#GmM!Z(I`$zwTbKYM$6G29^qDY!W_>S z&VCn5WY;cX=O2A9u04@h#Ptuvw_|9VIGl-bW~YOPtTHqqipwH?D8IP=f^lHSl%E~b zyqihY)9sytnZb@Jz8yC-aCJ$;P;tbLrQisYT5K#UM%!EZ3W2-oGM4Yz!$0H@VpPSh zU5zA>-4tK*OD)9GqQ(S&F>LZ1!)f*L@+7)lzLcJmL+O*s2Q)R5)=yEgE)VsF_#i*s z-qGQ8;3)G4`OspB)+~&V?Amo?$F6-S((GS}?LpxcP0AkXAtV5M`%rt^;tbP#uiXsIMPnRp8vlD&G`#^yTQ3dH9@b-3kpvOGFUG`^MIqO;p6B^qDzH`J;RyF=5mV@1K2ofc33K}7TC zc*n#KP0~l>YkD+3$NM1`pZPf!%TMPMjc=v5_-9O?M~yd8ey#fHc&1~kuMW?SPo5FY z&*UeiseGHZS5$ty39?-*{;Z%wO-%D9M#qa|SJds@vuDp(^z@`hWp3<|BwAYdb8DGG0^_l|6{~&vlh(%C-(ox zXh~`+ilgWO%Z}l4)Wp1BIM!tU4|?4G|5%g#|FPKq$xPp5|8Fag_r5eAW|`&j{{I-3 zob@K={r|Bh`+r+`y#Kf5$IDS0=G8T@HNTkki}As8+W z+xR8PHBfoW%=j9|@BfcA+5aDFvj4Z`$NT?dP4@rCu;JA5;r;)yCj0+mm?fA_n;-CD z&1EJ_7DlMv|Hsqq`+-09|2QA`WBH{l6s;a{t)>(|m6?@f$cHI$1<(pKrOkKUwftlkNYZCfon!f9(IYwuS7 z2~4Rf4Gj;ZrHv10^Dro~-bI8=mbXrn%hEj{|R9eMNGoYoFL??iiC2v9*-Sa5$6QNiBwt$Qn5++b^1X1XANq z6-}Fd{;cyTbt2!KxiRsIUh=n7mk1-lDtiS|KgXJx%NEx@ahq9oT62^=Vq~^*xKMV> zR>`f~w3YPe8B$9rTvT>pEVTgVy^wml-s?6)>g;$!FC7$RCg;%^wW)_$Nx~Ztg~v2W zdTve>s3LLRT)0?jRQ9$w&Og#pbN*6lQm2+k9p&6iJy&zCQwwMFsLVZD=A8OA)ElXr zG91Osif}r?Io~Fu_b;V|0^gke5 zbjlV<$jDBxg&v>KsZ(~(PT2!GWe@F?olXBkvpWsQ?$k3oo?r_-KA~T~?1BBVGx}u@ z@0XoT|HHHUWn}jom>o~Bg&vyq+Y#Cn?dBltllDNgjWa$D0&Su!SC< z;PWN zdj+k0!-2)+kp+QZpmQKt6ADyTMFQoEsw+Z^LY0wFskusti`Sjw)mD})2$oldO7S4@ z%uq$BB!VpH@!+b!BIFu~R0Xh1jtuus0vmB=Hbvq%(clxu@s9i-Hi5L>wAAk#NEnT*qs^5Zhm z1tOC{nm)yr$q*{S&dGQkX{rP zZy*y{st$ zV=Ms1PngGaEwTy7Gn$9lw3NpfO`cPzcT7?VhjG<;JCpcBud1f$tq(9trf!pPAc}bW^Cl zJOZ^iy(Sb6LvbyHk~%G|->^VcO(3V=v@=H08^)U&DRQSxnVvJl3{Sud((Gn7-t*;E z@u|*2m{Rc(mm@4!VbfqUS0QYSa@azIxD#Q2m_H=&hXnq=l)xY%ixvJH8`Oq>D<7?t zayVVst|Yg1wn}t5Td0n``(lgIs~0;?XYaOcv5kqD=6$=WzRmj}LaX+vN;#XWw!Qka z>Z2ocO-$|8wrlrRy+p6d+KLMN3^qAgCbz~GC|QYQ!;zeT&5>y+Oq=Fyn|t7OC%3Ue zlAA?+$w^+E?R&h*$*$y~*mBz;1&jptQWFd>K%}Y2G*nqtJAXl7 z5!0jGnJ_S~qN-$JAXr*TGg*`vs;n!=Zh_YD(Xg_rnnl4F43?D8+*g9ddNfLDFcQSC z1$8}3Lv`gPA(0b_gceoPUI6oE4Vb741xjjbz-GiI0%9~ATogj>I2AHMbwaxKmPms& z^J|%@oSON8it=y-c~%AHmCqOX^`R1ok61K+U?_5Hs>0!ZW_E~MxzINLrjWp+nPEp$ zTVZBZfxwU$ODzq0@@7b214?FEZG`Rw=vFhsw)GXl zvN`iAskRk?>YA$gHNi#LE}@51BLAw&-}-T-a(H~r+lbbe`OJLH>*_)HMv48Yb35_> zygv)$6Q6Y%g)<}b>(9KxlOh`@huOk>dkea^ejiByKd`0dGk;?H-=TKt(v$y0(kN;z zMZfWq;*Bo22Bvn!HMxIxgeP@E-w^5{q6Y5c@H`6t!~7>D@Kb@|xEo*CS%alG#3R18l}KYNyeQj84)hoqv9A{s0<#Cq_8Y zWHXCV2aO(J)KMcIgUmk#6tVscz(@Jgmpg>$Oc$6jjJlXWy zj!_Sd9$plQp`7X;U=1o6*!bG)<$;OoPH<^B|)cai~C}JnptLH5$jLFb>Vq zD8#hc8ZBdVibjo$=4h0|oqw)I^p-3kPSxlOMyF{cxbvT`5xu5Ph%+?W&ge{yb}%Z^ zsDV+jM)ZyoA%byeo<{TnB)WTLnl_9|HKLdN2ocg~DWfut&gTI&U!xZoEzqcthgZ2q z5k_Zew3yMtI8>q0My4&&=uSqJai~h8x0qI~(RYl_*62?>oNF|?f>BtbPBgehM595B zYBd_qs7|9(87m!Mi*(+o7K+68qsU6 zgt$Z_dU0B8F7B8~=u*1Cyv%5o3B-_L0ctRt3qiKqGQX_g%YKnMDBl<8wjZ*y- z^97CkVznnlG-x!D(Tf@tGI|M!jE~<4`mzbcVMaSON;2p@mak}ZEu&o;6*`FaszxoH zgm!E6Dx=plqBl$m@w!HB+=SlH=t4$sYV;MOziKqqLowgd=yFDX(`b^HXm4w@fYCb| ztz@)EquUt0tI@NJ-qYxFM(=9`U7dg*ZD@2VqrYo(CZl~C&13X|MrDllYjhT)4>hV_ z^bd`y8GWQtgwe+u)iL@+qk2XMG+N5&Q;n7}`YaB89*4fr=p2surAEsceWlR~Mh7)I zpV8MEUC8J^G`fV*A&o9$^iQA;uvaqr#zILX!Eb?5VK;RnbXcR$7=5QvkM2bKUZYY* zKWKCtqazyaXY`{+9eYr^e`$0&qn|Xop3zZ__AvTcqc%M$U86>YjE-q^6(ia*64$RY zk{TuUqI7gah-i};85&*6$N|(9w3iq;fyiVIq;xKghBLz3BH2u2NT5=K2WI%x!@>!ndDquv^I zWYkBa0Hc#N>cXh6M%@_o(`W^w{u-UnXaGFpD@FtWhze zbd9JhIK_}Sl%bKIX>_*2CW&GW2U37U^9sBIkdc>B7LWrzs9?}WYUE-xN~3>acqx$$ zl!EZ1jN)U)=MrB+eCeZ+3-OZ3CFJNlf18&vnit~C5#`ejjlO3zPNN?fjo0W1qX`=Q$Y`QQrmQDv^b^x2 z15q29b&qd{DWFj}8JCy}M6x8~64T;nrvp)Kep}XOASRX9$ff^UOULIKkK$V;K9~P$ z31{j$n7yY+^J(_$VvWrD1vN7J^*oKteqEx`H(b9`jSe#kX=JuvnMP)d&DY3mqXin7 zofp5bcri!SukjLJx`oVkuq0u& zgO$ti+QDABSH#D(av_=dMSKbI$m&^Ud6vw~@~j$}?H-TfV_LcVT6zCHS&#W2=>=BZ zOH0BugjEk*;8 z&NADt28deOEaBH^@i8r#9WR%7TKHGWi>Lj56wgb1y5BE}#o#P9PuFW?*2rp=__@kN zRvRG!(pz)YKUvpVbCszFt-0!3rde~9sTHlc%ADh@xysa$)?8)IaZ6E9XOy*K4yF_@g-Q&B|c+o26M#y8tvEGeF-@0jQq&B@%35zc(_7yZI*DQMrP^1mgg|U zbox)l)esVrrJuQ+#$gX~82$W1A?$1pd!ECRAbpBm$6=r1>JV+P(s3YcHHRIRlSkay<#>*9=P@X5wkQay| zxl+uR7h%k-6c@>h#dY$};wHIDY>=0Ud*tO}i(D-pmDh+T%~{{I`Ol- zUL>j;MJIKW=%#KKz0@rtO>GdFYNHsg?iAVTUXi2j7ZcP2Vw&0_W~+z9>FNM>ER9v5}$DRGW^TC7xC#Wm_#akF|(Y*x>UN7N4Sw0cpzqFxfOs-5BuwM+aB?ni33 z_*}g%4#NEbw4c>m!eRVP_>H$kqOnJ`G~N?!;C3_iiay3Z(I0LmXrqjeM85HfC^SA5 zCC2BtxB3O{sHULTo+J{m^KXu`j+VHql?;iu#W-sR{d5xUJGaLzlMbQ>LVE)Bg0ByJ z{X}ov$?Gcy;4cl|Tp29V@s}Znh+$%=$ig*SjKH0$EHMf9#|p$KwA^U4P!3uq7j2g( z>Oif>H)ocJ@nWf%fcG9w6z3xL1?USa#Z+;Tn1S>20Gq3h)x;ud+gxK-XO9+3Bmt@3`cT|OXQkXyt{@*%NX z-Xq?SkBWEYU(oj+7azzc#TW7^@soU7B&laaXY`#+wM}HH?RaAMdGxav#9Z{9V)TzN z`b-`A&QkTNI2Z03^qY0)Ki8`_#Rl}9yVTp_LA3`Tba_{7Q}2oGYOmO-J`!)LkI~N# zh_BVB;wb#h&|lgZUy1g{LD3uj;l?46YkVsv8iz%J@tru;_+C^QKZvk#L|kJ0C~h_W zC2lu<7MqPm@u+c3JcAz|?l6>m7yiA5Lw;g7ApIQ9B4DHXUD0%D_m?#ONFj?K}db zF$*Jc6tr_TM&W3T!W?lX#&j`am56Z|Z4)rE@C5{nb2Q^n=T;R=l5D@Bo5i(J-=c^Ka%;zo?)TQG(_`O3c#Qm5>xSLXi zv0aU^eKzhsf>hdN2B&R zsBtc8k_VZMg^b4I9@YftzRA#YQ^j*=r5E771DWrI-rNuO3(yWj-ajEHuRH_17U68K z7*86_!x>mejFJmPjx5Ky&slgHXrUM<7eRkjib=9cOp(<%JqhE?Bq9nhkIs^d#VK-$ zm?M{BrSvE0w`Jl?%&A3~Q;RXD1~I3W$_qsq=F$b2Q_sSDx=3CksxhCQjrlZ!xpc9- zLM(x>xIWPTlFe!bj;`T9QS(9PmD$a*7WeW!dFbN8cS6LjW%@^P_QJ^|hOlz0$2bBlaN zJS4YbPTwXTlh0vZe_lK(Ul7m87sU?w5_IlPu}i)p-jchZb9al6utSA8PJLyt~{9xYU# ziBr{=nEwxo1?oRA{~v;G{-;=`z7glE@5CzggSb-tDAucgVIA<3xLq9;o7B(H&yC_Q z>X>*!Nx4-i*`OTq73Gv~D3^RkdF6iPm!GI+@}O!izfno@h-x7lRcq-s+DgCCP9_^C z$&-xsGGL_29!3Y**XSq*8J*-1qq7`tbdh6>ZgQN_T~0B2$eBhTdAiY8295r*+!!FM zj5Jwm43vK|2Fde`!SZ4wU0!Nr$SaJYa-A_u-e?S$w;3bk-A1;2#K@6P7-QsfMxJai z^5rgLtbEfLC-)fRkXiS&Kj2Y7Dm?aY(r^r^0xw5_E zG}+m4hV11i!aNX^8IBS;(hy}YWacV z3i*lSYWcNet^C%pPX6Rrk8dVkFMZA%Wn1S>m?v(QU7WXIuGlCCI`5Df&b#F(=RGpd zd9R%6+$>LZJ|Kh6EpmbLVOiyTRMt5kljk^}kQX|ilB=B0VD8u|*Eye+H#xV-jm{nN zK4*h`*!i-2%K3`i?tE3g?0gOL$eZ$Q=ilT%obSlboqOaV=ezO;=Xax^IV_ENv;F3!1XESm(OIe>vK8Z^`)$I zeI>)LgK~-MYk98g8+nQAu)MEfyvz#tNZFM=-3oe)1<#MaP zx;*MVSAzP`q$H%G@2)B6lYhaR<~AcV~63yNg=s?x9w@d#SbV zlhsY`e(HAj0Clf>pxWY2SC6}gsvYiO>J|5J^`?7-de@z$_Pa-_Pu-)`*Y0ffoqM!8 z>dsMyXN>ZCa#agYo=WlLt4^M=s)uKs>gO4+(mfN@2+u?{#xqGx@Jv?IJyX;vo~i0g z&omYCOji}287l0Vsg`;Q)w!NoYNcnkTID%aUE?`j-QX!w8$Cg_$y1`XctYwi&jPj8 zvrz5yEK+ZHD%BoOmHNO_tqyq3RtG&b>aZuQe)2?=N~l!{33VzdVX=gWsal+HxjHxD z3UyJ!8g+TX)#~bmYt{7$*Qq-bZcv*OZd8vX+@zjLxLIvaxJA93utB|^aI1PJ;Wo7| zVWava;db>^!X4_{gge#067Evcd$;m`I^Fvh74$x)=6fGki@Z;$u=h!|#QT&w*ZZ_O-@8>^?0rsM z;oYvT@;MLlyIbAieO=w@eM8;j{j1vK zeM@cjzOC-}zN5By-&GHJ-&2oy-&fCg_p0Z;e^)Pi_p3L(|4{FEKT;ofKT%(J52!=l zPu2I{FV!*cLFMp$t^B@2s;%#zs)O%))!lbQ_3{0v2KjzcBYj6zuJ30x!6%IZpJANh za~MTFmvNTQZB+X_Mx8IgSmyH@=llG|CB8&sm9M3-+Skfh<4ZQK@wGM9`cjPbzIMh9 zzEtBzUkBqBUq|CMUuR>ZuZwY~ud8v7ue-6y*VDMq*V}l&*T>lEJK1>E*VowV>t}rF z8(g0<7y#D3R_xj6y*mu8rUQ!xhzMn=#-7Oc^yJULHjOcwT!bNfvRxuRc%y&NMbgD;ZJY?p}PV8Ejn@~&B&R#)ap6Xl&5Aq41DLveS z!y2#}^hESDGCyJMOXqhM{R6BDFJMg10N}|wS%B3S5@J16bjFg3LtY6s-PYc(ZZ7xQpZWVfr&hCvmq89|GPCZ0Ph^julun5`Xt(%<;__ZV?cV04waO$j}bWZhAtlf8qG) z9NZUL!EW+Fe~jrF96S;9#~GWkO3>m@aQ>MbKs$w}Z1lT9f12sTnZ6nHtv32WxIG+PXVR!MajsA?>o$wyxaZKMKUrcx(*y^vVe4TMhLU;nx zSNqIbWK|77tA;~9**`s3sKp~X!zlbz-m-*z)m>nQ*1N2Vy7O_V}+CBO909O0V482OlboWe~?GfJhq zM|1LX#&~9k{5lh!qcj7(C>-UI;k@8)Wx^;AJoo5)d_>d!lgY31Y(svO3s$wR6AmJo zdQUirCCg96v3^G9psY+?ofMbWmd}NhwjzCJ;`3q2*a=c`mX%7h4{hT{!ZewPza` z=Mah0rvsQRTPg#+p(QHR7CkHgDRq_IWp88sJoE6;6WJVEwfY zr$#s6Z2DH5TiuIunFq1{dKBkXPl;#5Hmt*T;QSfq3pjax1Ey<8=)k=M&xVKO805%u%y7(c6gieU z&T(AeSnXKjSm$`!vCZ+kW4~j8GwfXIeA@ZE)8%UBn(mtG+T;4r6@uRJL(Z+ylI@_4 zI*QIXgQOG4zL4+`%nc;rkzzE~wE0-^PRCi{ENHe(v$F zJaHjT5HH2q-4$5%uEmP?I;?na5gQ=$J8(|8nI--tP6wZb#9zRv;LDKsYd8&j3nzi^ z;S_Km5>|^-Dg)?O{IlxxuDYvnq* z9zFkh^!;1pZE~Z$Q{E#t$@}DH^n?fH7Wt5TR6Zu3kWb2I@z+!zA_RWtsG%Tz2j@gw~m3% z4Cj5$hn<(Wu5hh(uXSJJxxrJNus9*?J>Pq=_X_V--mAT9z3aT!dvEaG?7h`{oA(ay zo!)!Ao4lL7_j|W^AM(EJebf7n_n6n=>+b90o8T+(o#MO1x5~HLx5jskZ>?{=?*`wE zzFT~^`8N9Q^xfmz(NUt#CW_Cqj5d@#Rlwx?!+kEj`n{C?fwZy*+Cv*Kcc;H+#?fY zGqiC4?b{2j+h2~56Xj&xT6aM&NtAInyM^K&c8kR(cIz<4iGG2&kKI3`?-AaJkxx&a zo6q?B(8C{Oe5u&N?&JJKzYiMWVa6|rN7&too=fRo$BLfZF7h$BNf8$z&(G#3;dK0I#%s_giN1lK#BYOf_AGE4oF8vv_XYG=!imOqc6%Dnvpc}p!R|2Q z1-KniUIV*BpsfgxfV^nm;S=;Ev={ETaOobyVRpNt-xE&9I3jn9FrRgvj!{MUOzbep ztWoMiQK-)dZxmOIj$J453|mEc1Q63 z%!fM?XEVM`(DN~b>B$&!BigOiZk=`)Yqwszw6F3(+ihg`W8NqEpqpraM6GwHcJE^M z81I98xTit;B_CR2lXhvp;}fl+SIBJz?LuyIdB1ia(C&k9{W!PS0=F6J^$=Vdm9*bU zg1)DHO%m=j(f%a~CmFO)Ny42X+K(jRG~zjSZxheMZGn7tz-@_qUVz&g`OvL{~B%p z@&7AkYYTj`6EZiCH3oHJlY!QTyTf7s!$ z6M^T!&W8O0a`+imBD^cMU+vK^dcux?tw-36u>V_3E#z??Y&z;O8g?@59N1FWYS?A4 zm%v^FyAk#Q*r#B3!|sFq0`_}Yg}Nug{%_Hp#;O(Y~ zk9Qpm`bgMu$B8!sVQ0cFgsq2N340an2H5*ypN8ED`#$Vfus_2l@{zzVOX`g9G+27W z!(`Y~VUK4PAUp!Q0yh5rIcDtj2)`ZnLD;8Zo0^vp_7?1Z*soxZz&cJaSF}KQC)j?l zS+J8~=fal3*1=u^dkyRc*!y9hhJ77l`9ENf!v1$nYaG3#!{)$Ff}IUp40{%A1a>*> zpJA_oy#;m?>|bEF!|sNCANEt&rskXDgf)#rxE=a)57@!5qhV)YELOvw1A95_4X}5? zJ`3HnFRGtpf@W(x#}*#%$6~-VvT+%fvNm{;MM3(NSV>0X*$H-kT%?^= ze5BrO^S@;C@3Hy!+Wc?Z{LkA<-f9O=*}$w4RLR@`ERlLZ?^eY#r!4GG>|D9iy|8@v%JXEmY{K$ zE&RQhf12f$jh98DYx{>*6?`_7Qi#7xzjy5gYle|NWA$v^P^IDYO|M&P` zwZ*6IWtH{&!fjRhIIa?3#G%8et}W`fq(*G`7f9o{t>VWbZ? zYIWqHeyA1gPxs@7rS|v1`DqlS1!4>h=o}5kOd$P!pV#a2dGY7-b?BVbxqo_k|MYGE zv1o$~^aq`9V>%uASRl(z8D*pNr8q83{50LLI`vRjWS@(Cd|?<1YvPMh+fj-Rbn!=h zsGyW-(Mt>lC@hvX=8LhtOZXcaM{YPndBlO;804FAKH%|V<0 zh|N#R-r^|TuvPOT8{4l4|H;1AtsCF9B^)Dt9j(4&WpTo>W0s)DjtQKNYvnQ7Jz9!u z#xa=+)BzTKXbg!;`$y5N)j_<1=}xxCIMBi9`5iJmtsHRHfjVqWoYx-z}PN7e&O@?Ro z^uhvi3Ua0h)J3x!%mQ! znZ0;dDFPwNFdQ>gStLYse5DTWG=@vBv4#9OR*4zeaux&;p=hkxQsA*}UM(&JrIahA!Et_(Q!qTA$~2QeHWOicpQh z1vOQRO>Xg;XW~CHkp61R>94Z31aS&NO=Fo9h^L}zUa+F5wsLVf-ZEZPKy4Mx3@N#s zTyr`gCNVmy&^pls$U0J6QyIh2#N*AufE2lSvp0fs@tF=%(2zWHLvPfcir0H{-F4Vx zeE!G$_|0vaD)!TC`CztuS;l8&!+%1XN4(_7tJBE4tM~;wMN_89MvK zG@)C3`o&yL}5~57#Gb|i$a#gUDKFktkG`+k&RDrM8a6+UbsQsli!NqvfIdU(D zK{gaXZ^4fSEQpdpt+NBXHXmHL~n}&)Q`bCa$z4n>ch;LAj1yw01$0@ zMX)kh(5o9b58vd<`KBiv(w>=M4MEjm+B#H)vA&_NQ@|hdRfQJ? z&tf*_El-~1$+tXXwP&D}&%l9J$RNvO<(!*t7B$gyCYcU46I4ES zKTw|FdNFoDRlK~m_A%zCJ}gu+wjxMEEWziwsEyFtq2MA?*p>8c5V-W=k1|ZrMWt2f z{iej=<)vF;)y&zHXi1oasijA#5|9Xyh30;t$Xu@=C^IcH1CF`KE8%?&t?bN&I{C_| zK*S)w_G0ffJ;duGv?@(AAcIZ|C1Rhamv9i@0nD386!y-XK;Gyg&)gScxnM5nN;Qts zi_D}^y2cS&aJ6OZ4 zN2^9@DK14dGc?oBfpp5Eqd$J+M}y;sd^9*59q-YgxN#m0jScW<5bX?Dqk$nzF%`LW zk?1I$iSLLMR+UMAIN.ASM The Main source file -= +=- +->MODES.ASM The mode switching file -= +=- +->CLEAR.ASM The clear screen routines -= +=- +->TESTS.ASM The videomode tests -= +=- +->DUAL.ASM The dual font setup and test -= +=- +->FONT1.ASM Font 1 for dual font test -= +=- +->FONT2.ASM Font 2 for dual font test -= +=- +->MODES.INC The includes for each videomode -= +=- -= +=- C_SRC The C source directory -= +=- +->MAINC.CPP The main source file -= +=- +->MODES.CPP The mode switching file -= +=- +->CLEAR.CPP The clear screen routines -= +=- +->TESTS.CPP The videomode tests -= +=- +->TAURON.H The main header file -= +=- +->FONT1.H Font 1 for dual font test -= +=- +->FONT2.H Font 2 for dual font test -= +=- +->MODES_C.INC The includes for each videomode -= +=- +->PALETTE.INC The standard palette -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +When running the demo: + + In graphics modes, there is a vertical line every 40 pixels with a longer + vertical line every 80 pixels. + + I have not yet figured out how to program modes 04H, 05H, or 06H. Once + the mode is set, I only clear the mode to a specified color. + + + +The VGA BIOS must be called once at the beginning of the routines so that we +know where the fonts are stored. Once this information is known we no longer +need the BIOS. + +The reason for starting this package is that I am writing an Operating +System. (There are a lot of us out there I know.) I wanted to be able to +program standard VGA cards for my OS. + +This is not a graphics library although there are some clear screen and pixel +routines around. It only sets the video mode. This works in real mode as +well as protected mode. To use it in protected mode you will have to modify +it to suit your own needs. + +The use of the fonts stored in BIOS ROM is now included. We are using what is +already built into the VGA BIOS. + + +E-mail: kinfira@hotmail.com +Homepage: http://home.onestop.net/kinfira/ + +Drop me a line if you find this package useful. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=-= Credits: =-= =-= +=-=-=-=-=-=-=-=-= =-= +=-= A great book: "Programmer's Guide to the EGA, VGA, and Super VGA =-= +=-= Cards" 3rd Edition Richard F. Ferraro ISBN 0-201-62490-7 =-= +=-= Addison-Wesley Publishing Company. =-= +=-= =-= +=-= A very excellent book: "Programmer's Guide to the EGA & VGA Cards" =-= +=-= Richard F. Ferraro ISBN 0-201-12692-3 =-= +=-= Addison-Wesley Publishing Company. =-= +=-= =-= +=-= Anthony A.J. Williams for writing MODES.ASM, which I used to help =-= +=-= write the Text Mode routine. I specifically used the SetFont =-= +=-= procedure which was instrumental in getting the code for Mode 03h =-= +=-= working. =-= +=-= =-= +=-= Boone (boone@ucsd.edu) for the docs on programming the VGA Registers. =-= +=-= =-= +=-= I also used a really great program called TWEAK to get some of the =-= +=-= values for the non-standard modes. =-= +=-= =-= +=-= Denthor of ASPHYXIA for his trainer on Chain-4 Mode. =-= +=-= =-= +=-= Robert Schmidt for the great doc in PCGPE 1.0 =-= +=-= about Mode X. This helped a great deal. =-= +=-= =-= +=-= Michael Abrash for his super excellent VGA articles on everything, =-= +=-= plus all of his books and public domain code. =-= +=-= =-= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +=-=-=-=-=-=-=-=-=-=-=-= +=- Revision History: -= +=-=-=-=-=-=-=-=-=-=-=-= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 3.0 released September 20, 1998 + I added 2 new text modes, 40x43 and 40x50. Also I have added a new dual + font test which uses 2 of the VGA's 8 font maps. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.1 released July 5, 1998 + The only change is that in the C version, the routine to read fronts from + BIOS is now working. This routine reads a font from the BIOS and places + it in memory for use in a textmode. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.0 released June 22, 1998 + I have added more videomodes. I have also written a version of the + source in C. So the routines are available in Assembly and C. I have + also written some documentation for the font editor. So now the only + modes that are not implemented are the monochrome modes which will still + be worked on. + + +Tauron VGA Utilities +Version 1.0 released June 14, 1998 + I changed the name because that other was a little too long. B-> + I have packaged in a small font editor. I have also rearranged the mode + numbers and added a few more video modes that will be implemented. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Source code for switching videomodes without using BIOS +Version 4.1 released May 28, 1998 + +New in this version: + We call a BIOS function to find out where in memory the fonts are stored. + Since this is different on every cards' VGA BIOS, it is absolutely + necessary so that in text modes, the proper fonts are displayed. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 4.0 released March 5, 1998 + +New in this version: + All VGA Modes are supported! Plus Chain-4 Mode, ModeX, ModeA, + ModeB and ModeC. Modes 07H and 0FH are still being worked on. + + Use of Fonts stored in ROM. + Custom Font data stored in system memory is no longer needed. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 3.0 released January 2, 1998 + Includes Modes 03h, 10h, 12h, and 13h plus Chain-4 Mode, ModeX, ModeA, + ModeB and ModeC. + +New in this version: Mode 10h (640x350x16), Mode C (640x400x16) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.5 not released + Includes Modes 03h, 12h, and 13h plus Chain-4 Mode, ModeX, ModeA, and + ModeB. + +New in this version: VGA register data takes up less space. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.1 released Nov. 21, 1997 + Includes Modes 03h, 12h, and 13h plus Chain-4 Mode, ModeX, ModeA, and + ModeB. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.0 released Nov. 10, 1997 + Includes Modes 03h, 12h, and 13h plus Chain-4 Mode and ModeX. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 1.5 released late Oct. 1997 + Includes Modes 03h, 12h, and 13h. Fully functional + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 1.1 released in Oct. 12, 1997 + Includes Mode 13h, Mode 03h finally works. Realized that I needed to reset + the text mode font. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 1.0 released in Oct. 7, 1997 + Included Mode 13h, Mode 03h partially. (Did not have setfont routine) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/USAGE.TXT b/16/tauron/USAGE.TXT new file mode 100755 index 00000000..939c2dec --- /dev/null +++ b/16/tauron/USAGE.TXT @@ -0,0 +1,118 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= +=- Tauron VGA Utilities Version 3.0 -= +=- Released September 20, 1998 -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +=- All Rights Reserved. =-= that you put my name some- -= +=- =-= where in your credits. -= +=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- I assume no responsibility whatsoever for any effect that this package, -= +=- the information contained therein or the use thereof has on you, your -= +=- sanity, computer, spouse, children, pets or anything else related to -= +=- you or your existance. No warranty is provided nor implied with this -= +=- source code. -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +** Note ** This code does not update BIOS when in real mode. So if you need +that particular functionality, you will have to add this yourself. + + + Use MODE NUMBER to set the video mode with the procedure provided. + + A star (*) next to the mode number indicates that it is not yet + implemented. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Currently supported Video Modes: -= MODE NUMBER =-= Type -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= =-= -= +=- 00H,01H -- 40 x 25 x 16 -= 00H,01H =-= Text -= +=- -= =-= -= +=- 02H,03H -- 80 x 25 x 16 -= 02H,03H =-= Text -= +=- -= =-= -= +=- 04H,05H -- 320 x 200 x 4 -= 04H,05H =-= Graphics -= +=- -= =-= -= +=- 06H -- 640 x 200 x 2 -= 06H =-= Graphics -= +=- -= =-= -= +=- 07H -- 80 x 25 x 2 (Monochrome) -= * 07H =-= Text -= +=- -= =-= -= +=- 0DH -- 320 x 200 x 16 -= 0DH =-= Graphics -= +=- -= =-= -= +=- 0EH -- 640 x 200 x 16 -= 0EH =-= Graphics -= +=- -= =-= -= +=- 0FH -- 640 x 350 x 2 (Monochrome) -= * 0FH =-= Graphics -= +=- -= =-= -= +=- 10H -- 640 x 350 x 16 -= 10H =-= Graphics -= +=- -= =-= -= +=- 11H -- 640 x 480 x 2 -= 11H =-= Graphics -= +=- -= =-= -= +=- 12H -- 640 x 480 x 16 -= 12H =-= Graphics -= +=- -= =-= -= +=- 13H -- 320 x 200 x 256 -= 13H =-= Graphics -= +=- -= =-= -= +=- Chain 4 -- unchained 320 x 200 x 256 -= 14H =-= Graphics -= +=- -= =-= -= +=- Mode X -- unchained 320 x 240 x 256 -= 15H =-= Graphics -= +=- -= =-= -= +=- Mode A -- unchained 320 x 350 x 256 -= 16H =-= Graphics -= +=- -= =-= -= +=- Mode B -- unchained 320 x 400 x 256 -= 17H =-= Graphics -= +=- -= =-= -= +=- Mode C -- unchained 320 x 480 x 256 -= 18H =-= Graphics -= +=- -= =-= -= +=- Mode D -- unchained 360 x 200 x 256 -= 19H =-= Graphics -= +=- -= =-= -= +=- Mode E -- unchained 360 x 240 x 256 -= 1AH =-= Graphics -= +=- -= =-= -= +=- Mode F -- unchained 360 x 350 x 256 -= 1BH =-= Graphics -= +=- -= =-= -= +=- Mode G -- unchained 360 x 400 x 256 -= 1CH =-= Graphics -= +=- -= =-= -= +=- Mode H -- unchained 360 x 480 x 256 -= 1DH =-= Graphics -= +=- -= =-= -= +=- Mode I -- 640 x 400 x 16 -= 1EH =-= Graphics -= +=- -= =-= -= +=- Mode J -- 80 x 43 x 16 -= 1FH =-= Text -= +=- -= =-= -= +=- Mode K -- 80 x 50 x 16 -= 20H =-= Text -= +=- -= =-= -= +=- Mode K -- 40 x 43 x 16 -= 21H =-= Text -= +=- -= =-= -= +=- Mode K -- 40 x 50 x 16 -= 22H =-= Text -= +=- -= =-= -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +To set a video mode using the procedure I already have written: + +PUSH *VALUE* ; Where value is the mode number +CALL SETVIDEOMODE + +and thats it the videomode gets set. + +Once the video mode is set, you can program each video mode as normal. + +Just remember, you can't rely on BIOS so if you need the palette set to the +proper values, you need to set them yourself. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +If you want to use this code in your programs, all you need is which ever +mode you want from MODES.INC and also the procedure SETMODE. + +Just + +MOV SI, OFFSET *MODE* ; Where mode is the mode from MODES.INC +CALL SETMODE + +If you want the unchained modes, you also need a bit of code from the +SETVIDEOMODE procedure in MAIN.ASM. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +I have also included some source for clearing the screen and plotting pixels. +If you notice that since all of the chained modes use the same memory +structure the same code can be used to program all with only a few +modifications. This also goes for the planar modes 10h, 12h, Mode C, etc. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/WHATSNEW.TXT b/16/tauron/WHATSNEW.TXT new file mode 100755 index 00000000..72ab292c --- /dev/null +++ b/16/tauron/WHATSNEW.TXT @@ -0,0 +1,32 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= +=- Tauron VGA Utilities Version 3.0 -= +=- Released September 20, 1998 -= +=- -= +=- What new with this release??? -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +=- All Rights Reserved. =-= that you put my name some- -= +=- =-= where in your credits. -= +=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- I assume no responsibility whatsoever for any effect that this package, -= +=- the information contained therein or the use thereof has on you, your -= +=- sanity, computer, spouse, children, pets or anything else related to -= +=- you or your existance. No warranty is provided nor implied with this -= +=- source code. -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + I added 2 new text modes, 40x43 and 40x50. + + There is now a dual font test. What this does is load 2 fonts into VGA + memory and display text from both fonts on the screen at the same time. + This is possible by reprogramming the charcter map select register. You + can have up to 8 fonts present in memory at any time but can only use 2 + at a time. + + I was trying to add some more high-res video modes but so far they don't + quite work. I'm shooting for 720x200 first just to see if I can make it + work. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron/tauron30.zip b/16/tauron/tauron30.zip new file mode 100755 index 0000000000000000000000000000000000000000..05e65c0f5170829927c646de8ff4745619f11f1d GIT binary patch literal 138287 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 literal 0 HcmV?d00001 diff --git a/16/tauron30/ASM_SRC/CLEAR.ASM b/16/tauron30/ASM_SRC/CLEAR.ASM new file mode 100755 index 00000000..f7b4bbe6 --- /dev/null +++ b/16/tauron30/ASM_SRC/CLEAR.ASM @@ -0,0 +1,241 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +TEXTCLEAR PROC + PUSH BP + MOV BP,SP + + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AH,byte ptr [bp+4] + MOV AL,' ' + MOV CX,Mode.width_bytes + CLD + REP STOSW + + POP BP + RET 2 +TEXTCLEAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CLEAR_B8000H PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AX,WORD PTR [BP+4] + CLD + MOV CX,Mode.width_bytes + REP STOSW + + POPA + POP BP + RET 2 +CLEAR_B8000H ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Mode 0Dh clear screen +CLEAR0DH PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,2000H +CLEAR_LOOP: + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV EAX,0 + XCHG DWORD PTR ES:[DI],EAX + + MOV DX,03C4H + MOV AH,BYTE PTR [BP+4] + MOV AL,2 + OUT DX,AX + + MOV DWORD PTR ES:[DI],0FFFFFFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,4 + LOOP CLEAR_LOOP + + POP BP + RET 2 +CLEAR0DH ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Mode 0Eh clear screen +CLEAR0EH PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,4000H +CLEAR_LOOP2: + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV EAX,0 + XCHG DWORD PTR ES:[DI],EAX + + MOV DX,03C4H + MOV AH,BYTE PTR [BP+4] + MOV AL,2 + OUT DX,AX + + MOV DWORD PTR ES:[DI],0FFFFFFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,4 + LOOP CLEAR_LOOP2 + + POP BP + RET 2 +CLEAR0EH ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CLEAR11H PROC + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV AX,0FFFFH + CLD + MOV CX,4B00H + REP STOSW + RET +CLEAR11H ENDP + +; 0d 0e 11 have bytes /2 +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PLANARCLEAR PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,Mode.width_bytes + SHR CX,1 +CLEAR_LOOP3: + + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV AX,0 + XCHG WORD PTR ES:[DI],AX + + MOV DX,03C4H + MOV AH,byte ptr [bp+4] + MOV AL,2 + OUT DX,AX + + MOV WORD PTR ES:[DI],0FFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,2 + LOOP CLEAR_LOOP3 + + POP BP + RET 2 +PLANARCLEAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CLEAR13H PROC + PUSH BP + MOV BP,SP + + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV AL,byte ptr [bp+4] + MOV AH,AL + CLD + MOV CX,8000H + REP STOSW + + POP BP + RET 2 +CLEAR13H ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +UNCHAINEDCLEAR PROC + PUSH BP + MOV BP,SP + + mov dx, 03C4h ; 03c4h + mov al, 2 ; Map Mask Register + out dx, al + inc dx + mov al,00001111B ; Select all planes to write to + out dx, al ; Doing this to clear all planes at once + + mov ax,0A000H + mov es, ax + XOR DI,DI ; set es:di = Screen Mem + mov ah,byte ptr [bp+4] ; move the color into ah + mov al,ah ; copy the value to al + mov cx,Mode.width_bytes ; Number of words + SHR CX,1 + cld + rep stosw ; clear it + + POP BP + RET 2 +UNCHAINEDCLEAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/ASM_SRC/DUAL.ASM b/16/tauron30/ASM_SRC/DUAL.ASM new file mode 100755 index 00000000..0ee31055 --- /dev/null +++ b/16/tauron30/ASM_SRC/DUAL.ASM @@ -0,0 +1,275 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; 3C4H, 03H +; Bit positions for font maps: +; +; +--7--+--6--+--5--+--4--+--3--+--2--+--1--+--0--+ +; | | | SAH | SBH | SA | SB | +; +-----+-----+-----+-----+-----+-----+-----+-----+ +; +; SA - bits 1, 0 of Character Map A +; SAH - bit 2 (high order) of Charcter Map A +; +; SB - bits 1, 0 of Character Map B +; SBH - bit 2 (high order) of Charcter Map B +; + +; Points to fonts for Map A Memory Address +DFM_MAPA_FONT1 EQU 00H ; 0K +DFM_MAPA_FONT2 EQU 04H ; 16K +DFM_MAPA_FONT3 EQU 08H ; 32K +DFM_MAPA_FONT4 EQU 0CH ; 48K +DFM_MAPA_FONT5 EQU 20H ; 8K +DFM_MAPA_FONT6 EQU 24H ; 24K +DFM_MAPA_FONT7 EQU 28H ; 40K +DFM_MAPA_FONT8 EQU 2CH ; 56K + +; Points to fonts for Map B +DFM_MAPB_FONT1 EQU 00H ; 0K +DFM_MAPB_FONT2 EQU 01H ; 16K +DFM_MAPB_FONT3 EQU 02H ; 32K +DFM_MAPB_FONT4 EQU 03H ; 48K +DFM_MAPB_FONT5 EQU 10H ; 8K +DFM_MAPB_FONT6 EQU 11H ; 24K +DFM_MAPB_FONT7 EQU 12H ; 40K +DFM_MAPB_FONT8 EQU 13H ; 56K + + +; To set dual font mode, just set the character map select register to point +; to 2 different fonts. There can be up to 8 fonts resident in memory at +; once but only 2 can be active at a time. +; +; ** NOTE ** If you set both font maps the same you are no longer in dual font +; mode. But what this allows you to do is to put up to 8 fonts in VGA memory +; and switch between them at any time. +; +; Both fonts were made with my font editor. I just read the BIOS and +; modified the second font so a solid line goes through the middle of it. +; +; This procedure sets up dual font mode and loads 2 fonts into video memory. +SETDUAL PROC + + ; Sequencer address + MOV DX,SEQ_ADDR + + ; 2 different font maps + MOV AH,DFM_MAPA_FONT1 + OR AH,DFM_MAPB_FONT5 + + ; Sequencer register + MOV AL,03H + + ; Send it + OUT DX,AX + + ; Load font 1 into 0K + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH OFFSET FONT1 ; Offset of Font in our Data Segment + PUSH DS + CALL LOADFONT + + ; Load font 2 into 8K + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A200H + PUSH OFFSET FONT2 ; Offset of Font in our Data Segment + PUSH DS + CALL LOADFONT + + RET +SETDUAL ENDP + +; This procedure reset the character map select register to point to only +; one font. +UNSETDUAL PROC + + ; Set both fonts to point to font 1 + MOV DX,SEQ_ADDR + MOV AX,0003H + OUT DX,AX + + RET +UNSETDUAL ENDP + +; In dual font modes, the palette is in effect half of what it is. The +; bottom 8 colors for the first font, and the top 8 colors for the second +; font. +; +; What I do here is to set them to the same 8 colors. +; Black, Blue, Green, Red, Purple, Yellow, Light Gray, and White +; +SETDUALPALETTE PROC + + PUSH 0 + PUSH 0 + PUSH 0 + PUSH 0 + CALL SETPAL + + PUSH 42 + PUSH 0 + PUSH 0 + PUSH 1 + CALL SETPAL + + PUSH 0 + PUSH 42 + PUSH 0 + PUSH 2 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 0 + PUSH 3 + CALL SETPAL + + PUSH 0 + PUSH 0 + PUSH 42 + PUSH 4 + CALL SETPAL + + PUSH 21 + PUSH 63 + PUSH 63 + PUSH 5 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 42 + PUSH 6 + CALL SETPAL + + PUSH 63 + PUSH 63 + PUSH 63 + PUSH 7 + CALL SETPAL + + PUSH 0 + PUSH 0 + PUSH 0 + PUSH 8 + CALL SETPAL + + PUSH 42 + PUSH 0 + PUSH 0 + PUSH 9 + CALL SETPAL + + PUSH 0 + PUSH 42 + PUSH 0 + PUSH 10 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 0 + PUSH 11 + CALL SETPAL + + PUSH 0 + PUSH 0 + PUSH 42 + PUSH 12 + CALL SETPAL + + PUSH 21 + PUSH 63 + PUSH 63 + PUSH 13 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 42 + PUSH 14 + CALL SETPAL + + PUSH 63 + PUSH 63 + PUSH 63 + PUSH 15 + CALL SETPAL + + RET +SETDUALPALETTE ENDP + +DUALTEST PROC + + MOV SI,OFFSET MODE03H + CALL SETMODE + + CALL SETDUAL + CALL SETDUALPALETTE + + PUSH 1FH + CALL TEXTCLEAR + + ; Attribute to print text in. + ; + ; In dual font mode, attrubute bit 3 is the deciding factor as to which + ; font is printed. 0001X111B where X is 0 for font 1 or 1 for font 2. + ; The Charcter Map Select Register determines where font 1 and font 2 + ; reside. + ; 00011111B - Font 2, Blue Background, with color 7 text. + MOV ATT, 1Fh + + MOV BX,5 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_D + CALL PRINTSTRING + MOV BX,6 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_E + CALL PRINTSTRING + MOV BX,7 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_F + CALL PRINTSTRING + + ; 00010111B - Font 1, Blue Background, with color 7 text. + MOV ATT, 17h + + MOV BX,0 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_D + CALL PRINTSTRING + MOV BX,1 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_E + CALL PRINTSTRING + MOV BX,2 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_F + CALL PRINTSTRING + + ; Wait for a keypress + MOV AH,0 + INT 16H + + CALL UNSETDUAL + RET +DUALTEST ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/ASM_SRC/FONT1.ASM b/16/tauron30/ASM_SRC/FONT1.ASM new file mode 100755 index 00000000..772d612e --- /dev/null +++ b/16/tauron30/ASM_SRC/FONT1.ASM @@ -0,0 +1,266 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +;=- -= +;=- Tauron VGA Utilities Version 1.0 -= +;=- Released June 14, 1998 -= +;=- -= +;=- Font Width: 8 -= +;=- Font Height: 16 -= +;=- Bytes per character: 16 -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH,099H,081H,081H,07EH,000H,000H,000H,000H +DB 000H,000H,07EH,0FFH,0DBH,0FFH,0FFH,0C3H,0E7H,0FFH,0FFH,07EH,000H,000H,000H,000H +DB 000H,000H,000H,000H,06CH,0FEH,0FEH,0FEH,0FEH,07CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,07CH,0FEH,07CH,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,03CH,0E7H,0E7H,0E7H,099H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,07EH,0FFH,0FFH,07EH,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,018H,03CH,03CH,018H,000H,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,0C3H,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,03CH,066H,042H,042H,066H,03CH,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0C3H,099H,0BDH,0BDH,099H,0C3H,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,01EH,00EH,01AH,032H,078H,0CCH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,066H,066H,066H,03CH,018H,07EH,018H,018H,000H,000H,000H,000H +DB 000H,000H,03FH,033H,03FH,030H,030H,030H,030H,070H,0F0H,0E0H,000H,000H,000H,000H +DB 000H,000H,07FH,063H,07FH,063H,063H,063H,063H,067H,0E7H,0E6H,0C0H,000H,000H,000H +DB 000H,000H,000H,018H,018H,0DBH,03CH,0E7H,03CH,0DBH,018H,018H,000H,000H,000H,000H +DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FEH,0F8H,0F0H,0E0H,0C0H,080H,000H,000H,000H,000H +DB 000H,002H,006H,00EH,01EH,03EH,0FEH,03EH,01EH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,066H,066H,066H,000H,066H,066H,000H,000H,000H,000H +DB 000H,000H,07FH,0DBH,0DBH,0DBH,07BH,01BH,01BH,01BH,01BH,01BH,000H,000H,000H,000H +DB 000H,07CH,0C6H,060H,038H,06CH,0C6H,0C6H,06CH,038H,00CH,0C6H,07CH,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,0FEH,0FEH,0FEH,0FEH,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,07EH,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,00CH,0FEH,00CH,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,030H,060H,0FEH,060H,030H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C0H,0C0H,0C0H,0C0H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,028H,06CH,0FEH,06CH,028H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,038H,07CH,07CH,0FEH,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,0FEH,07CH,07CH,038H,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,03CH,03CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,066H,066H,066H,024H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,06CH,06CH,0FEH,06CH,06CH,06CH,0FEH,06CH,06CH,000H,000H,000H,000H +DB 018H,018H,07CH,0C6H,0C2H,0C0H,07CH,006H,086H,0C6H,07CH,018H,018H,000H,000H,000H +DB 000H,000H,000H,000H,0C2H,0C6H,00CH,018H,030H,060H,0C6H,086H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,06CH,038H,076H,0DCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,030H,030H,030H,060H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,00CH,018H,030H,030H,030H,030H,030H,030H,018H,00CH,000H,000H,000H,000H +DB 000H,000H,030H,018H,00CH,00CH,00CH,00CH,00CH,00CH,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,03CH,0FFH,03CH,066H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,018H,030H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,002H,006H,00CH,018H,030H,060H,0C0H,080H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0CEH,0D6H,0D6H,0E6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,018H,038H,078H,018H,018H,018H,018H,018H,018H,07EH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,00CH,018H,030H,060H,0C0H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,006H,03CH,006H,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,00CH,01CH,03CH,06CH,0CCH,0FEH,00CH,00CH,00CH,01EH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C0H,0C0H,0C0H,0FCH,00EH,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,060H,0C0H,0C0H,0FCH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,006H,006H,00CH,018H,030H,030H,030H,030H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07CH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07EH,006H,006H,006H,00CH,078H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,006H,00CH,018H,030H,060H,030H,018H,00CH,006H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,060H,030H,018H,00CH,006H,00CH,018H,030H,060H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,00CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0DEH,0DEH,0DEH,0DCH,0C0H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,066H,066H,066H,066H,0FCH,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H,0C0H,0C2H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,0F8H,06CH,066H,066H,066H,066H,066H,066H,06CH,0F8H,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,068H,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,068H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0DEH,0C6H,0C6H,066H,03AH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,03CH,018H,018H,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,01EH,00CH,00CH,00CH,00CH,00CH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,0E6H,066H,06CH,06CH,078H,078H,06CH,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,0F0H,060H,060H,060H,060H,060H,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0C6H,0EEH,0FEH,0FEH,0D6H,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0CEH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,060H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0D6H,0DEH,07CH,00CH,00EH,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,06CH,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,060H,038H,00CH,006H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07EH,07EH,05AH,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,06CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0D6H,0D6H,0FEH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,06CH,06CH,038H,038H,06CH,06CH,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,03CH,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,086H,00CH,018H,030H,060H,0C2H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,03CH,030H,030H,030H,030H,030H,030H,030H,030H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,080H,0C0H,0E0H,070H,038H,01CH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,03CH,00CH,00CH,00CH,00CH,00CH,00CH,00CH,00CH,03CH,000H,000H,000H,000H +DB 010H,038H,06CH,0C6H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H +DB 030H,030H,018H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0E0H,060H,060H,078H,06CH,066H,066H,066H,066H,0DCH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C0H,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,01CH,00CH,00CH,03CH,06CH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,0CCH,078H,000H +DB 000H,000H,0E0H,060H,060H,06CH,076H,066H,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,018H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,006H,006H,000H,00EH,006H,006H,006H,006H,006H,006H,066H,066H,03CH,000H +DB 000H,000H,0E0H,060H,060H,066H,06CH,078H,078H,06CH,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,038H,018H,018H,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0ECH,0FEH,0D6H,0D6H,0D6H,0D6H,0D6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,07CH,060H,060H,0F0H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,00CH,01EH,000H +DB 000H,000H,000H,000H,000H,0DCH,076H,062H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,060H,038H,00CH,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,030H,030H,0FCH,030H,030H,030H,030H,036H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,066H,066H,066H,066H,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0D6H,0D6H,0FEH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,06CH,038H,038H,038H,06CH,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,0F8H,000H +DB 000H,000H,000H,000H,000H,0FEH,0CCH,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,00EH,018H,018H,018H,070H,018H,018H,018H,018H,00EH,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,000H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,070H,018H,018H,018H,00EH,018H,018H,018H,018H,070H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,06CH,0C6H,0C6H,0C6H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H,0C2H,066H,03CH,00CH,006H,07CH,000H,000H +DB 000H,000H,0CCH,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0CCH,0CCH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,038H,06CH,038H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,03CH,066H,060H,060H,066H,03CH,00CH,006H,03CH,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,066H,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,03CH,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,0C6H,0C6H,010H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 038H,06CH,038H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 018H,030H,060H,000H,0FEH,066H,060H,07CH,060H,060H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,076H,036H,07EH,0D8H,0D8H,06EH,000H,000H,000H,000H +DB 000H,000H,03EH,06CH,0CCH,0CCH,0FEH,0CCH,0CCH,0CCH,0CCH,0CEH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,030H,078H,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,078H,000H +DB 000H,0C6H,0C6H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,018H,03CH,066H,060H,060H,060H,066H,03CH,018H,018H,000H,000H,000H,000H +DB 000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0E6H,0FCH,000H,000H,000H,000H +DB 000H,000H,066H,066H,03CH,018H,07EH,018H,07EH,018H,018H,018H,000H,000H,000H,000H +DB 000H,0F8H,0CCH,0CCH,0F8H,0C4H,0CCH,0DEH,0CCH,0CCH,0CCH,0C6H,000H,000H,000H,000H +DB 000H,00EH,01BH,018H,018H,018H,07EH,018H,018H,018H,018H,018H,0D8H,070H,000H,000H +DB 000H,018H,030H,060H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 076H,0DCH,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0CEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,03CH,06CH,06CH,03EH,000H,07EH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,07CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,030H,030H,000H,030H,030H,060H,0C0H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,006H,006H,006H,006H,000H,000H,000H,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,060H,0CEH,093H,006H,00CH,01FH,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,066H,0CEH,09AH,03FH,006H,00FH,000H,000H +DB 000H,000H,018H,018H,000H,018H,018H,018H,03CH,03CH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,033H,066H,0CCH,066H,033H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,066H,033H,066H,0CCH,000H,000H,000H,000H,000H,000H +DB 011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H +DB 055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH +DB 0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H +DB 018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,0F6H,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FEH,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F6H,006H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,03FH,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F7H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,0F7H,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,03FH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H +DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,0D8H,0D8H,0D8H,0DCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FCH,0C6H,0FCH,0C6H,0C6H,0FCH,0C0H,0C0H,0C0H,000H,000H +DB 000H,000H,0FEH,0C6H,0C6H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,080H,0FEH,06CH,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,0FEH,0C6H,060H,030H,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0D8H,0D8H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,066H,066H,066H,066H,066H,07CH,060H,060H,0C0H,000H,000H,000H +DB 000H,000H,000H,000H,076H,0DCH,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07EH,018H,03CH,066H,066H,066H,03CH,018H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,06CH,06CH,06CH,06CH,0EEH,000H,000H,000H,000H +DB 000H,000H,01EH,030H,018H,00CH,03EH,066H,066H,066H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0DBH,0DBH,0DBH,07EH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,003H,006H,07EH,0CFH,0DBH,0F3H,07EH,060H,0C0H,000H,000H,000H,000H +DB 000H,000H,01CH,030H,060H,060H,07CH,060H,060H,060H,030H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,0FFH,000H,000H,000H,000H +DB 000H,000H,000H,030H,018H,00CH,006H,00CH,018H,030H,000H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,00CH,018H,030H,060H,030H,018H,00CH,000H,07EH,000H,000H,000H,000H +DB 000H,000H,00EH,01BH,01BH,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,018H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,07EH,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,000H,076H,0DCH,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,00FH,00CH,00CH,00CH,00CH,00CH,0ECH,06CH,06CH,03CH,01CH,000H,000H,000H,000H +DB 000H,0D8H,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,070H,098H,030H,060H,0C8H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,07CH,07CH,07CH,07CH,07CH,07CH,07CH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H diff --git a/16/tauron30/ASM_SRC/FONT2.ASM b/16/tauron30/ASM_SRC/FONT2.ASM new file mode 100755 index 00000000..9c84bf90 --- /dev/null +++ b/16/tauron30/ASM_SRC/FONT2.ASM @@ -0,0 +1,266 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +;=- -= +;=- Tauron VGA Utilities Version 1.0 -= +;=- Released June 14, 1998 -= +;=- -= +;=- Font Width: 8 -= +;=- Font Height: 16 -= +;=- Bytes per character: 16 -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH,099H,081H,081H,07EH,000H,000H,000H,000H +DB 000H,000H,07EH,0FFH,0DBH,0FFH,0FFH,0C3H,0E7H,0FFH,0FFH,07EH,000H,000H,000H,000H +DB 000H,000H,000H,000H,06CH,0FEH,0FEH,0FEH,0FEH,07CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,07CH,0FEH,07CH,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,03CH,0E7H,0E7H,0E7H,099H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,018H,03CH,07EH,0FFH,0FFH,07EH,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,018H,03CH,03CH,018H,000H,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,0C3H,0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,03CH,066H,042H,042H,066H,03CH,000H,000H,000H,000H,000H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0C3H,099H,0BDH,0BDH,099H,0C3H,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,01EH,00EH,01AH,032H,078H,0CCH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,066H,066H,066H,03CH,018H,07EH,018H,018H,000H,000H,000H,000H +DB 000H,000H,03FH,033H,03FH,030H,030H,030H,030H,070H,0F0H,0E0H,000H,000H,000H,000H +DB 000H,000H,07FH,063H,07FH,063H,063H,063H,063H,067H,0E7H,0E6H,0C0H,000H,000H,000H +DB 000H,000H,000H,018H,018H,0DBH,03CH,0E7H,03CH,0DBH,018H,018H,000H,000H,000H,000H +DB 000H,080H,0C0H,0E0H,0F0H,0F8H,0FEH,0F8H,0F0H,0E0H,0C0H,080H,000H,000H,000H,000H +DB 000H,002H,006H,00EH,01EH,03EH,0FEH,03EH,01EH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,066H,066H,066H,000H,066H,066H,000H,000H,000H,000H +DB 000H,000H,07FH,0DBH,0DBH,0DBH,07BH,01BH,01BH,01BH,01BH,01BH,000H,000H,000H,000H +DB 000H,07CH,0C6H,060H,038H,06CH,0C6H,0C6H,06CH,038H,00CH,0C6H,07CH,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,0FEH,0FEH,0FEH,0FEH,000H,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,07EH,03CH,018H,07EH,000H,000H,000H +DB 000H,000H,018H,03CH,07EH,018H,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,018H,018H,018H,07EH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,00CH,0FEH,00CH,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,030H,060H,0FEH,060H,030H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C0H,0C0H,0C0H,0C0H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,028H,06CH,0FEH,06CH,028H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,038H,07CH,07CH,0FEH,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,0FEH,07CH,07CH,038H,038H,010H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,018H,03CH,03CH,03CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,066H,066H,066H,024H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,06CH,06CH,0FEH,06CH,06CH,06CH,0FEH,06CH,06CH,000H,000H,000H,000H +DB 018H,018H,07CH,0C6H,0C2H,0C0H,07CH,006H,086H,0C6H,07CH,018H,018H,000H,000H,000H +DB 000H,000H,000H,000H,0C2H,0C6H,00CH,018H,030H,060H,0C6H,086H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,06CH,038H,076H,0DCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,030H,030H,030H,060H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,00CH,018H,030H,030H,030H,030H,030H,030H,018H,00CH,000H,000H,000H,000H +DB 000H,000H,030H,018H,00CH,00CH,00CH,00CH,00CH,00CH,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,03CH,0FFH,03CH,066H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,018H,030H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,002H,006H,00CH,018H,030H,060H,0C0H,080H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0CEH,0D6H,0D6H,0E6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,018H,038H,078H,018H,018H,018H,018H,018H,018H,07EH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,00CH,018H,030H,060H,0C0H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,006H,006H,03CH,006H,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,00CH,01CH,03CH,06CH,0CCH,0FEH,00CH,00CH,00CH,01EH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C0H,0C0H,0C0H,0FCH,00EH,006H,006H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,060H,0C0H,0C0H,0FCH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,006H,006H,00CH,018H,030H,030H,030H,030H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07CH,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,07EH,006H,006H,006H,00CH,078H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,000H,000H,018H,018H,030H,000H,000H,000H,000H +DB 000H,000H,000H,006H,00CH,018H,030H,060H,030H,018H,00CH,006H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,060H,030H,018H,00CH,006H,00CH,018H,030H,060H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,00CH,018H,018H,018H,000H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0DEH,0DEH,0DEH,0DCH,0C0H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,038H,06CH,0C6H,0C6H,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,0FFH,066H,066H,066H,0FCH,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0FFH,0C0H,0C2H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,0F8H,06CH,066H,066H,066H,0FFH,066H,066H,06CH,0F8H,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,0FFH,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0FEH,066H,062H,068H,078H,0FFH,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0FFH,0C6H,0C6H,066H,03AH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0FEH,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,03CH,018H,018H,018H,018H,0FFH,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,01EH,00CH,00CH,00CH,00CH,0FFH,0CCH,0CCH,0CCH,078H,000H,000H,000H,000H +DB 000H,000H,0E6H,066H,06CH,06CH,078H,0FFH,06CH,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,0F0H,060H,060H,060H,060H,0FFH,060H,062H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,0C6H,0EEH,0FEH,0FEH,0D6H,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0FFH,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,0FFH,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,0FFH,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0FFH,0C6H,0D6H,0DEH,07CH,00CH,00EH,000H,000H +DB 000H,000H,0FCH,066H,066H,066H,07CH,0FFH,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,07CH,0C6H,0C6H,060H,038H,0FFH,006H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,07EH,07EH,05AH,018H,018H,0FFH,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0FFH,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0FFH,0C6H,06CH,038H,010H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0FFH,0D6H,0FEH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,06CH,06CH,038H,0FFH,06CH,06CH,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,066H,066H,066H,066H,03CH,0FFH,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,0FEH,0C6H,086H,00CH,018H,0FFH,060H,0C2H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,03CH,030H,030H,030H,030H,0FFH,030H,030H,030H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,080H,0C0H,0E0H,070H,0FFH,01CH,00EH,006H,002H,000H,000H,000H,000H +DB 000H,000H,03CH,00CH,00CH,00CH,00CH,0FFH,00CH,00CH,00CH,03CH,000H,000H,000H,000H +DB 010H,038H,06CH,0C6H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,0FFH,000H,000H +DB 030H,030H,018H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0E0H,060H,060H,078H,06CH,066H,066H,066H,066H,0DCH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C0H,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,01CH,00CH,00CH,03CH,06CH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,0CCH,078H,000H +DB 000H,000H,0E0H,060H,060H,06CH,076H,066H,066H,066H,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,018H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,006H,006H,000H,00EH,006H,006H,006H,006H,006H,006H,066H,066H,03CH,000H +DB 000H,000H,0E0H,060H,060H,066H,06CH,078H,078H,06CH,066H,0E6H,000H,000H,000H,000H +DB 000H,000H,038H,018H,018H,018H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0ECH,0FEH,0D6H,0D6H,0D6H,0D6H,0D6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0DCH,066H,066H,066H,066H,066H,07CH,060H,060H,0F0H,000H +DB 000H,000H,000H,000H,000H,076H,0CCH,0CCH,0CCH,0CCH,0CCH,07CH,00CH,00CH,01EH,000H +DB 000H,000H,000H,000H,000H,0DCH,076H,062H,060H,060H,060H,0F0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07CH,0C6H,060H,038H,00CH,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,010H,030H,030H,0FCH,030H,030H,030H,030H,036H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,066H,066H,066H,066H,066H,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0D6H,0D6H,0FEH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,06CH,038H,038H,038H,06CH,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,0F8H,000H +DB 000H,000H,000H,000H,000H,0FEH,0CCH,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,00EH,018H,018H,018H,070H,018H,018H,018H,018H,00EH,000H,000H,000H,000H +DB 000H,000H,018H,018H,018H,018H,000H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,070H,018H,018H,018H,00EH,018H,018H,018H,018H,070H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,010H,038H,06CH,0C6H,0C6H,0C6H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,03CH,066H,0C2H,0C0H,0C0H,0C0H,0C2H,066H,03CH,00CH,006H,07CH,000H,000H +DB 000H,000H,0CCH,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0CCH,0CCH,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,038H,06CH,038H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,03CH,066H,060H,060H,066H,03CH,00CH,006H,03CH,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0FEH,0C0H,0C0H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,066H,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,03CH,066H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,0C6H,0C6H,010H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 038H,06CH,038H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 018H,030H,060H,000H,0FEH,066H,060H,07CH,060H,060H,066H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,076H,036H,07EH,0D8H,0D8H,06EH,000H,000H,000H,000H +DB 000H,000H,03EH,06CH,0CCH,0CCH,0FEH,0CCH,0CCH,0CCH,0CCH,0CEH,000H,000H,000H,000H +DB 000H,010H,038H,06CH,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,030H,078H,0CCH,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,060H,030H,018H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07EH,006H,00CH,078H,000H +DB 000H,0C6H,0C6H,000H,038H,06CH,0C6H,0C6H,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,0C6H,0C6H,000H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,018H,03CH,066H,060H,060H,060H,066H,03CH,018H,018H,000H,000H,000H,000H +DB 000H,038H,06CH,064H,060H,0F0H,060H,060H,060H,060H,0E6H,0FCH,000H,000H,000H,000H +DB 000H,000H,066H,066H,03CH,018H,07EH,018H,07EH,018H,018H,018H,000H,000H,000H,000H +DB 000H,0F8H,0CCH,0CCH,0F8H,0C4H,0CCH,0DEH,0CCH,0CCH,0CCH,0C6H,000H,000H,000H,000H +DB 000H,00EH,01BH,018H,018H,018H,07EH,018H,018H,018H,018H,018H,0D8H,070H,000H,000H +DB 000H,018H,030H,060H,000H,078H,00CH,07CH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,00CH,018H,030H,000H,038H,018H,018H,018H,018H,018H,03CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,018H,030H,060H,000H,0CCH,0CCH,0CCH,0CCH,0CCH,0CCH,076H,000H,000H,000H,000H +DB 000H,000H,076H,0DCH,000H,0DCH,066H,066H,066H,066H,066H,066H,000H,000H,000H,000H +DB 076H,0DCH,000H,0C6H,0E6H,0F6H,0FEH,0DEH,0CEH,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,03CH,06CH,06CH,03EH,000H,07EH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,07CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,030H,030H,000H,030H,030H,060H,0C0H,0C6H,0C6H,07CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,0FEH,006H,006H,006H,006H,000H,000H,000H,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,060H,0CEH,093H,006H,00CH,01FH,000H,000H +DB 000H,0C0H,0C0H,0C2H,0C6H,0CCH,018H,030H,066H,0CEH,09AH,03FH,006H,00FH,000H,000H +DB 000H,000H,018H,018H,000H,018H,018H,018H,03CH,03CH,03CH,018H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,033H,066H,0CCH,066H,033H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0CCH,066H,033H,066H,0CCH,000H,000H,000H,000H,000H,000H +DB 011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H,011H,044H +DB 055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH,055H,0AAH +DB 0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H,0DDH,077H +DB 018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,000H,000H,0FEH,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0F8H,018H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,0F6H,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FEH,006H,0F6H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F6H,006H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FEH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,0F8H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0F8H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,018H,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 036H,036H,036H,036H,036H,036H,036H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,03FH,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,0F7H,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,037H,030H,037H,036H,036H,036H,036H,036H,036H,036H,036H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,0F7H,000H,0F7H,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,000H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FFH,000H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,03FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 018H,018H,018H,018H,018H,01FH,018H,01FH,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,01FH,018H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 000H,000H,000H,000H,000H,000H,000H,03FH,036H,036H,036H,036H,036H,036H,036H,036H +DB 036H,036H,036H,036H,036H,036H,036H,0FFH,036H,036H,036H,036H,036H,036H,036H,036H +DB 018H,018H,018H,018H,018H,0FFH,018H,0FFH,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,01FH,018H,018H,018H,018H,018H,018H,018H,018H +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 000H,000H,000H,000H,000H,000H,000H,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH +DB 0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H +DB 00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH +DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,0D8H,0D8H,0D8H,0DCH,076H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,0FCH,0C6H,0FCH,0C6H,0C6H,0FCH,0C0H,0C0H,0C0H,000H,000H +DB 000H,000H,0FEH,0C6H,0C6H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,0C0H,000H,000H,000H,000H +DB 000H,000H,000H,000H,080H,0FEH,06CH,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H +DB 000H,000H,000H,0FEH,0C6H,060H,030H,018H,030H,060H,0C6H,0FEH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0D8H,0D8H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,066H,066H,066H,066H,066H,07CH,060H,060H,0C0H,000H,000H,000H +DB 000H,000H,000H,000H,076H,0DCH,018H,018H,018H,018H,018H,018H,000H,000H,000H,000H +DB 000H,000H,000H,07EH,018H,03CH,066H,066H,066H,03CH,018H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,038H,06CH,0C6H,0C6H,0FEH,0C6H,0C6H,06CH,038H,000H,000H,000H,000H +DB 000H,000H,038H,06CH,0C6H,0C6H,0C6H,06CH,06CH,06CH,06CH,0EEH,000H,000H,000H,000H +DB 000H,000H,01EH,030H,018H,00CH,03EH,066H,066H,066H,066H,03CH,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,07EH,0DBH,0DBH,0DBH,07EH,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,003H,006H,07EH,0CFH,0DBH,0F3H,07EH,060H,0C0H,000H,000H,000H,000H +DB 000H,000H,01CH,030H,060H,060H,07CH,060H,060H,060H,030H,01CH,000H,000H,000H,000H +DB 000H,000H,000H,07CH,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,0C6H,000H,000H,000H,000H +DB 000H,000H,000H,000H,0FEH,000H,000H,0FEH,000H,000H,0FEH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,07EH,018H,018H,000H,000H,0FFH,000H,000H,000H,000H +DB 000H,000H,000H,030H,018H,00CH,006H,00CH,018H,030H,000H,07EH,000H,000H,000H,000H +DB 000H,000H,000H,00CH,018H,030H,060H,030H,018H,00CH,000H,07EH,000H,000H,000H,000H +DB 000H,000H,00EH,01BH,01BH,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H,018H +DB 018H,018H,018H,018H,018H,018H,018H,018H,0D8H,0D8H,0D8H,070H,000H,000H,000H,000H +DB 000H,000H,000H,000H,018H,018H,000H,07EH,000H,018H,018H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,076H,0DCH,000H,076H,0DCH,000H,000H,000H,000H,000H,000H +DB 000H,038H,06CH,06CH,038H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,018H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,018H,000H,000H,000H,000H,000H,000H,000H +DB 000H,00FH,00CH,00CH,00CH,00CH,00CH,0ECH,06CH,06CH,03CH,01CH,000H,000H,000H,000H +DB 000H,0D8H,06CH,06CH,06CH,06CH,06CH,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,070H,098H,030H,060H,0C8H,0F8H,000H,000H,000H,000H,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,07CH,07CH,07CH,07CH,07CH,07CH,07CH,000H,000H,000H,000H,000H +DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H diff --git a/16/tauron30/ASM_SRC/MAIN.ASM b/16/tauron30/ASM_SRC/MAIN.ASM new file mode 100755 index 00000000..8bf81cef --- /dev/null +++ b/16/tauron30/ASM_SRC/MAIN.ASM @@ -0,0 +1,788 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +.MODEL SMALL +.386 +JUMPS +LOCALS +.STACK 200h +.DATA + +ATTRCON_ADDR EQU 03C0H +MISC_ADDR EQU 03C2H +VGAENABLE_ADDR EQU 03C3H +SEQ_ADDR EQU 03C4H +GRACON_ADDR EQU 03CEH +CRTC_ADDR EQU 03D4H +STATUS_ADDR EQU 03DAH + +; Videomode defines +VMODE_00H EQU 00H +VMODE_01H EQU 00H +VMODE_02H EQU 03H +VMODE_03H EQU 03H +VMODE_04H EQU 04H +VMODE_05H EQU 04H +VMODE_06H EQU 06H +VMODE_07H EQU 07H +VMODE_0DH EQU 0DH +VMODE_0EH EQU 0EH +VMODE_0FH EQU 0FH +VMODE_10H EQU 10H +VMODE_11H EQU 11H +VMODE_12H EQU 12H +VMODE_13H EQU 13H +VMODE_CHAIN4 EQU 14H +VMODE_MODE_X EQU 15H +VMODE_MODE_A EQU 16H +VMODE_MODE_B EQU 17H +VMODE_MODE_C EQU 18H +VMODE_MODE_D EQU 19H +VMODE_MODE_E EQU 1AH +VMODE_MODE_F EQU 1BH +VMODE_MODE_G EQU 1CH +VMODE_MODE_H EQU 1DH +VMODE_MODE_I EQU 1EH +VMODE_MODE_J EQU 1FH +VMODE_MODE_K EQU 20H +VMODE_MODE_L EQU 21H +VMODE_MODE_M EQU 22H +VMODE_MODE_N EQU 23H + +;These next four lines must be included for the text mode stuff to work. +oldmode db ? +oldmisc db ? +oldmask db ? +oldmem db ? + +PALETTE LABEL BYTE +DB 0, 0, 0, 0, 0, 42, 0, 42, 0, 0, 42, 42, 42, 0, 0, 42, 0, 42 +DB 42, 21, 0, 42, 42, 42, 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63 +DB 63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63, 0, 0, 0, 5, 5, 5 +DB 8, 8, 8, 11, 11, 11, 14, 14, 14, 17, 17, 17, 20, 20, 20, 24, 24, 24 +DB 28, 28, 28, 32, 32, 32, 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50 +DB 56, 56, 56, 63, 63, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63 +DB 63, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0, 0, 63, 16, 0 +DB 63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0 +DB 0, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63 +DB 0, 31, 63, 0, 16, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63 +DB 63, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, 31, 63, 39, 31 +DB 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31 +DB 31, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63 +DB 31, 47, 63, 31, 39, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63 +DB 63, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, 45, 63, 49, 45 +DB 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45 +DB 45, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63 +DB 45, 54, 63, 45, 49, 63, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28 +DB 28, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0, 0, 28, 7, 0 +DB 28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0 +DB 0, 28, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28 +DB 0, 14, 28, 0, 7, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28 +DB 28, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, 14, 28, 17, 14 +DB 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14 +DB 14, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28 +DB 14, 21, 28, 14, 17, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28 +DB 28, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, 20, 28, 22, 20 +DB 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20 +DB 20, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28 +DB 20, 24, 28, 20, 22, 28, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16 +DB 16, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0, 0, 16, 4, 0 +DB 16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0 +DB 0, 16, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16 +DB 0, 8, 16, 0, 4, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16 +DB 16, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8, 8, 16, 10, 8 +DB 16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8 +DB 8, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16 +DB 8, 12, 16, 8, 10, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16 +DB 16, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, 11, 16, 12, 11 +DB 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11 +DB 11, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16 +DB 11, 13, 16, 11, 12, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63 + +; Must be included for any videomode to be set. +include modes.inc + +MAIN_MSG LABEL BYTE +DB 'Tauron VGA Utilities v3.0',13,10 +DB 'Copyright (c) 1998 Jeffrey Morgan. All Rights Reserved.',13,10 +DB 'Select a video mode to test: (Modes with a ! are not implemented)',13,10 +DB 'Key Videomode (Modes with a % are unchained)',13,10 +DB '================================================================================' +DB ' 0) 00H, 01H -- 40 x 25 x 16 %F) Mode D -- 360 x 200 x 256',13,10 +DB ' 1) Mode L -- 40 x 43 x 16 %G) Mode E -- 360 x 240 x 256',13,10 +DB ' 2) Mode M -- 40 x 50 x 16 %H) Mode F -- 360 x 350 x 256',13,10 +DB '!3) 07H -- 80 x 25 x 2 %I) Mode G -- 360 x 400 x 256',13,10 +DB ' 4) 02H, 03H -- 80 x 25 x 16 %J) Mode H -- 360 x 480 x 256',13,10 +DB ' 5) Mode J -- 80 x 43 x 16 K) 06H -- 640 x 200 x 2',13,10 +DB ' 6) Mode K -- 80 x 50 x 16 !L) 0FH -- 640 x 350 x 2',13,10 +DB ' 7) 04H, 05H -- 320 x 200 x 4 M) 11H -- 640 x 480 x 2',13,10 +DB ' 8) 0DH -- 320 x 200 x 16 N) 0EH -- 640 x 200 x 16',13,10 +DB ' 9) 13H -- 320 x 200 x 256 O) 10H -- 640 x 350 x 16',13,10 +DB '%A) Chain 4 -- 320 x 200 x 256 P) Mode I -- 640 x 400 x 16',13,10 +DB '%B) Mode X -- 320 x 240 x 256 Q) 12H -- 640 x 480 x 16',13,10 +DB '%C) Mode A -- 320 x 350 x 256',13,10 +DB '%D) Mode B -- 320 x 400 x 256 R) Dual Font Test',13,10 +DB '%E) Mode C -- 320 x 480 x 256',13,10 +DB '===============================================================================',13,10 +DB 'Hit ',39,'ESC',39,' to exit. Press a key [0-9 or A-O]>$' + +TEXTMSG_1 DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0 +TEXTMSG_2 DB 179,'Text Mode: 00H ',179,0 ; +13 +TEXTMSG_3 DB 179,'Width: 80 Height: 25',179,0 ; +8 +TEXTMSG_4 DB 179,'Bytes per screen: 4000',179,0 ; +19 +TEXTMSG_5 DB 179,'Number of pages: 8 ',179,0 +TEXTMSG_6 DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0 + +TEXTMSG_7 DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0 +TEXTMSG_8 DB 179,'Text Mode J ',179,0 ; +11 +TEXTMSG_9 DB 179,'Width: 80 Height: 43',179,0 ; +21, +22 +TEXTMSG_A DB 179,'Bytes per screen: 3440',179,0 ; +19, +20, +21, +22 +TEXTMSG_B DB 179,'Number of pages: 8 ',179,0 +TEXTMSG_C DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0 + +TEXTMSG_D DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0 +TEXTMSG_E DB 179,' DUAL FONT MODE ',179,0 ; +TEXTMSG_F DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0 + +FONT_8x8_OFF DW ? +FONT_8x14_OFF DW ? + +; Attribute for text charcters +ATT DB 1FH + +FONT1 LABEL BYTE +include font1.asm +FONT2 LABEL BYTE +include font2.asm +.CODE + +IODELAY MACRO + REPT 8 + JMP $+2 + ENDM +ENDM + +Start: + MOV AX,@DATA + MOV DS,AX + + ; This must be here to ensure that the fonts are properly found because + ; the location of the fonts in ROM is different on every VGA BIOS. + ; Get location of the fonts for Modes J and K + MOV AH,11h + MOV AL,30h + MOV BH,03h + INT 10H + MOV FONT_8x8_OFF,BP + + ; Get location of the fonts for Modes 00H, 01H, 02H, 03H, and 07H + MOV AH,11h + MOV AL,30h + MOV BH,06h + INT 10H + MOV FONT_8x14_OFF,BP + + ; Reset the mode and clear the screen + MOV AX,0003H + INT 10H + + ; Print out the message + MOV DX,OFFSET MAIN_MSG + MOV AH,9 + INT 21H + +MAIN_LOOP: + + ; Wait for a keypress + MOV AH,0 + INT 16H + + CMP AL,27 + JE QUIT_PROGRAM + + CMP AL,'0' + JE MODE_00_TEST + + CMP AL,'1' + JE MODE_L_TEST + + CMP AL,'2' + JE MODE_M_TEST + + CMP AL,'4' + JE MODE_03_TEST + + CMP AL,'5' + JE MODE_J_TEST + + CMP AL,'6' + JE MODE_K_TEST + + CMP AL,'7' + JE MODE_04_TEST + + CMP AL,'8' + JE MODE_0D_TEST + + CMP AL,'9' + JE MODE_13_TEST + + CMP AL,'a' + JE MODE_C4_TEST + CMP AL,'A' + JE MODE_C4_TEST + + CMP AL,'b' + JE MODE_X_TEST + CMP AL,'B' + JE MODE_X_TEST + + CMP AL,'c' + JE MODE_A_TEST + CMP AL,'C' + JE MODE_A_TEST + + CMP AL,'d' + JE MODE_B_TEST + CMP AL,'D' + JE MODE_B_TEST + + CMP AL,'e' + JE MODE_C_TEST + CMP AL,'E' + JE MODE_C_TEST + + CMP AL,'f' + JE MODE_D_TEST + CMP AL,'F' + JE MODE_D_TEST + + CMP AL,'g' + JE MODE_E_TEST + CMP AL,'G' + JE MODE_E_TEST + + CMP AL,'h' + JE MODE_F_TEST + CMP AL,'H' + JE MODE_F_TEST + + CMP AL,'i' + JE MODE_G_TEST + CMP AL,'I' + JE MODE_G_TEST + + CMP AL,'j' + JE MODE_H_TEST + CMP AL,'J' + JE MODE_H_TEST + + CMP AL,'k' + JE MODE_06_TEST + CMP AL,'K' + JE MODE_06_TEST + + CMP AL,'m' + JE MODE_11_TEST + CMP AL,'M' + JE MODE_11_TEST + + CMP AL,'n' + JE MODE_0E_TEST + CMP AL,'N' + JE MODE_0E_TEST + + CMP AL,'o' + JE MODE_10_TEST + CMP AL,'O' + JE MODE_10_TEST + + CMP AL,'p' + JE MODE_I_TEST + CMP AL,'P' + JE MODE_I_TEST + + CMP AL,'q' + JE MODE_12_TEST + CMP AL,'Q' + JE MODE_12_TEST + + CMP AL,'r' + JE DUAL_TEST + CMP AL,'R' + JE DUAL_TEST + JMP MAIN_LOOP + +; ====================== New Video Mode ==================================== +MODE_00_TEST: + PUSH VMODE_00H + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_03_TEST: + PUSH VMODE_03H + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_04_TEST: + PUSH VMODE_04H + CALL SETVIDEOMODE + + PUSH 0AAAAH + CALL CLEAR_B8000H + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_06_TEST: + PUSH VMODE_06H + CALL SETVIDEOMODE + + PUSH 0FFFFH + CALL CLEAR_B8000H + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_0D_TEST: + PUSH VMODE_0DH + CALL SETVIDEOMODE + + PUSH 12 + CALL CLEAR0DH + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_0E_TEST: + PUSH VMODE_0EH + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_10_TEST: + PUSH VMODE_10H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_11_TEST: + PUSH VMODE_11H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_12_TEST: + PUSH VMODE_12H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_13_TEST: + PUSH VMODE_13H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_I_TEST: + PUSH VMODE_MODE_I + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_C4_TEST: + PUSH VMODE_CHAIN4 + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_X_TEST: + PUSH VMODE_MODE_X + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_A_TEST: + PUSH VMODE_MODE_A + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_B_TEST: + PUSH VMODE_MODE_B + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_C_TEST: + PUSH VMODE_MODE_C + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_D_TEST: + PUSH VMODE_MODE_D + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_E_TEST: + PUSH VMODE_MODE_E + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_F_TEST: + PUSH VMODE_MODE_F + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_G_TEST: + PUSH VMODE_MODE_G + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_H_TEST: + PUSH VMODE_MODE_H + CALL SETVIDEOMODE + + CALL MODETEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_J_TEST: + PUSH VMODE_MODE_J + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_K_TEST: + PUSH VMODE_MODE_K + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_L_TEST: + PUSH VMODE_MODE_L + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +MODE_M_TEST: + PUSH VMODE_MODE_M + CALL SETVIDEOMODE + + CALL TEXTTEST + + ; Wait for a keypress + MOV AH,0 + INT 16H + JMP RESET + +; ====================== New Video Mode ==================================== +DUAL_TEST: + CALL DUALTEST + +RESET: + ; Reset the mode and clear the screen + MOV AX,0003H + INT 10H + + ; Print out the message + MOV DX,OFFSET MAIN_MSG + MOV AH,9 + INT 21H + JMP MAIN_LOOP + +; ====================== New Video Mode ==================================== +QUIT_PROGRAM: + ; Set the BIOS mode 03h + MOV AX,0003H + INT 10H + + ; Exit to DOS + MOV AX,4C00H + INT 21H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +LOADFONT PROC + PUSH BP + MOV BP,SP + PUSHA + mov dx,GRACON_ADDR ;get graphics port + mov al,5 ;get write mode reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmode],al ;store it + dec dx ;restore DX + mov al,6 ;get misc reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmisc],al ;store it + dec dx ;restore DX + mov dx,SEQ_ADDR ;get sequencer port + mov al,2 ;get map mask reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmask],al ;store it + dec dx ;restore DX + mov al,4 ;get memory selector reg + out dx,al ;select the reg + IODELAY ;delay a bit + inc dx ;change DX + in al,dx ;get value + IODELAY ;pause + mov [oldmem],al ;store it + + mov dx,GRACON_ADDR ;select graphics port + mov al,5 ;get write mode reg + mov ah,[oldmode] ;get old value + and ah,0fch ;mask it + out dx,ax ;set new value + IODELAY ;pause + mov al,6 ;get misc reg + mov ah,[oldmisc] ;get old value + and ah,0f1h ;mask it + or ah,4 ;set a flag + out dx,ax ;set it + IODELAY ;pause + mov dx,SEQ_ADDR ;select sequencer port + mov al,2 ;get mask reg + mov ah,4 ;get new value + out dx,ax ;set it + IODELAY ;pause + mov al,4 ;get memory reg + mov ah,[oldmem] ;get old value + or ah,4 ;set flag + out dx,ax ;set value + IODELAY ;pause + + PUSH DS + PUSH ES + + MOV AX,[BP+8] + MOV ES,AX + MOV DI,[BP+10] + + MOV AX,[BP+4] + MOV DS,AX + MOV SI,[BP+6] + +@@LOOP1: + PUSH DI + MOV CL,[BP+12] +@@LOOP2: + MOVSB + DEC CL + JNZ @@LOOP2 + + MOV CL,32 + SUB CL,byte ptr [BP+12] +@@LOOP3: + MOV AX,00H + STOSB + DEC CL + JNZ @@LOOP3 + + POP DI + ADD DI,32 + + DEC CH + JNZ @@LOOP1 + + POP ES + POP DS + + mov dx,GRACON_ADDR ;get graphics port + mov al,5 ;get 1st reg + mov ah,[oldmode] ;get old value + out dx,ax ;set it + IODELAY ;pause + mov al,6 ;get 2nd reg + mov ah,[oldmisc] ;get old value + out dx,ax ;set it + IODELAY ;pause + mov dx,SEQ_ADDR ;get seq port + mov al,2 ;get 3rd reg + mov ah,[oldmask] ;get old value + out dx,ax ;set it + IODELAY ;pause + mov al,4 ;get 4th reg + mov ah,[oldmem] ;get old value + out dx,ax ;set it + IODELAY ;pause + + POPA + POP BP + RET 10 +LOADFONT ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +include clear.asm +include modes.asm +include tests.asm +include dual.asm +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +END Start diff --git a/16/tauron30/ASM_SRC/MODES.ASM b/16/tauron30/ASM_SRC/MODES.ASM new file mode 100755 index 00000000..28e72a84 --- /dev/null +++ b/16/tauron30/ASM_SRC/MODES.ASM @@ -0,0 +1,1240 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETVIDEOMODE PROC + PUSH BP + MOV BP,SP + + MOV AX,word ptr [BP+4] + MOV Mode.videomode, AX + CMP AX,VMODE_00H + JE SET00H + CMP AX,VMODE_03H + JE SET03H + CMP AX,VMODE_04H + JE SET04H + CMP AX,VMODE_06H + JE SET06H +; CMP AX,VMODE_07H +; JE SET07H + CMP AX,VMODE_0DH + JE SET0DH + CMP AX,VMODE_0EH + JE SET0EH +; CMP AX,VMODE_0FH +; JE SET0FH + CMP AX,VMODE_10H + JE SET10H + CMP AX,VMODE_11H + JE SET11H + CMP AX,VMODE_12H + JE SET12H + CMP AX,VMODE_13H + JE SET13H + CMP AX,VMODE_CHAIN4 + JE SETCHAIN4 + CMP AX,VMODE_MODE_X + JE SETMODE_X + CMP AX,VMODE_MODE_A + JE SETMODE_A + CMP AX,VMODE_MODE_B + JE SETMODE_B + CMP AX,VMODE_MODE_C + JE SETMODE_C + CMP AX,VMODE_MODE_D + JE SETMODE_D + CMP AX,VMODE_MODE_E + JE SETMODE_E + CMP AX,VMODE_MODE_F + JE SETMODE_F + CMP AX,VMODE_MODE_G + JE SETMODE_G + CMP AX,VMODE_MODE_H + JE SETMODE_H + CMP AX,VMODE_MODE_I + JE SETMODE_I + CMP AX,VMODE_MODE_J + JE SETMODE_J + CMP AX,VMODE_MODE_K + JE SETMODE_K + CMP AX,VMODE_MODE_L + JE SETMODE_L + CMP AX,VMODE_MODE_M + JE SETMODE_M + JMP SET_OUT + +SET00H: + MOV SI,OFFSET MODE00H + CALL SETMODE + + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x14_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + CALL SETPALETTE16 + MOV Mode.mode_width,40; + MOV Mode.mode_height,25; + MOV Mode.width_bytes,1000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT; + JMP SET_OUT + +SET03H: + MOV SI,OFFSET MODE03H + CALL SETMODE + + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x14_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT +; CALL SETPALETTE16 + MOV Mode.mode_width,80; + MOV Mode.mode_height,25; + MOV Mode.width_bytes,2000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT; + JMP SET_OUT + +SET04H: + MOV SI,OFFSET MODE04H + CALL SETMODE + CALL SETPALETTE4 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,65535; + MOV Mode.colors,4; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_B8000_ADDR + JMP SET_OUT + +SET06H: + MOV SI,OFFSET MODE06H + CALL SETMODE + CALL SETPALETTE4 + MOV Mode.mode_width,640; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,16384; + MOV Mode.colors,4; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_B8000_ADDR + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET07H: + MOV SI,OFFSET MODE07H + CALL SETMODE + + PUSH 16 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x14_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + MOV Mode.mode_width,80; + MOV Mode.mode_height,25; + MOV Mode.width_bytes,2000; + MOV Mode.colors,2; + MOV Mode.attrib,TVU_TEXT + OR Mode.attrib,TVU_MONOCHROME + JMP SET_OUT + +SET0DH: + MOV SI,OFFSET MODE0DH + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,8000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET0EH: + MOV SI,OFFSET MODE0EH + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,16000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET0FH: + MOV SI,OFFSET MODE0FH + CALL SETMODE + MOV Mode.mode_width,640; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,28000; + MOV Mode.colors,2; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_MONOCHROME + JMP SET_OUT + +SET10H: + MOV SI,OFFSET MODE10H + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,28000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET11H: + MOV SI,OFFSET MODE11H + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,480; + MOV Mode.width_bytes,38400; + MOV Mode.colors,2; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET12H: + MOV SI,OFFSET MODE12H + CALL SETMODE + CALL SETPALETTE16 + MOV Mode.mode_width,640 + MOV Mode.mode_height,480 + MOV Mode.width_bytes,38400 + MOV Mode.colors,16 + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SET13H: + MOV SI,OFFSET MODE13H + CALL SETMODE + CALL SETPALETTE256 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,64000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS; + JMP SET_OUT + +SETCHAIN4: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + CALL SETPALETTE256 + MOV Mode.mode_width,320; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,16000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS; + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_X: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + MOV DX,MISC_ADDR + MOV AX,0E3H + OUT DX,AL + + MOV DX,CRTC_ADDR + + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + ; vertical total + MOV AX,00D06H + OUT DX,AX + ; overflow register + MOV AX,03E07H + OUT DX,AX + ; vertical retrace start + MOV AX,0EA10H + OUT DX,AX + ; vertical retrace end AND wr.prot + MOV AX,0AC11H + OUT DX,AX + ; vertical display enable end + MOV AX,0DF12H + OUT DX,AX + ; start vertical blanking + MOV AX,0E715H + OUT DX,AX + ; end vertical blanking + MOV AX,00616H + OUT DX,AX + + CALL SETPALETTE256 + MOV Mode.mode_width,320; + MOV Mode.mode_height,240; + MOV Mode.width_bytes,19200; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_A: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + ; turn off double scanning mode + MOV DX,CRTC_ADDR + MOV AX,9 + OUT DX,AL + INC DX + IN AL,DX + AND AL,0E0h + OUT DX,AL + + ; change the vertical resolution flags to 350 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,80h + MOV DX,MISC_ADDR + OUT DX,AL + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + ; vertical total + MOV AX,0BF06H + OUT DX,AX + ; overflow register + MOV AX,01F07H + OUT DX,AX + ; vertical retrace start + MOV AX,08310H + OUT DX,AX + ; vertical retrace end AND wr.prot + MOV AX,08511H + OUT DX,AX + ; vertical display enable end + MOV AX,05D12H + OUT DX,AX + ; start vertical blanking + MOV AX,06315H + OUT DX,AX + ; end vertical blanking + MOV AX,0BA16H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,320; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,28000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_B: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + ; turn off double scanning mode + MOV DX,CRTC_ADDR + MOV AX,9 + OUT DX,AL + INC DX + IN AL,DX + AND AL,0E0h + OUT DX,AL + + ; change the vertical resolution flags to 400 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,40h + MOV DX,MISC_ADDR + OUT DX,AL + + CALL SETPALETTE256 + + MOV Mode.mode_width,320; + MOV Mode.mode_height,400; + MOV Mode.width_bytes,32000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_C: + MOV SI,OFFSET CHAIN4 + CALL SETMODE + + ; turn off double scanning mode + MOV DX,CRTC_ADDR + MOV AX,9 + OUT DX,AL + INC DX + IN AL,DX + AND AL,0E0h + OUT DX,AL + + ; change the vertical resolution flags to 480 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,0C0h + MOV DX,MISC_ADDR + OUT DX,AL + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + ; vertical total + MOV AX,00D06H + OUT DX,AX + ; overflow register + MOV AX,03E07H + OUT DX,AX + ; vertical retrace start + MOV AX,0EA10H + OUT DX,AX + ; vertical retrace end AND wr.prot + MOV AX,0AC11H + OUT DX,AX + ; vertical display enable end + MOV AX,0DF12H + OUT DX,AX + ; start vertical blanking + MOV AX,0E715H + OUT DX,AX + ; end vertical blanking + MOV AX,00616H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,320; + MOV Mode.mode_height,480; + MOV Mode.width_bytes,38400; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_D: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 400 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,40h + MOV DX,MISC_ADDR + OUT DX,AL + CALL SETPALETTE256 + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,0C009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,200; + MOV Mode.width_bytes,18000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + + +SETMODE_E: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 480 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,0C0h + MOV DX,MISC_ADDR + OUT DX,AL + CALL SETPALETTE256 + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00D06H + OUT DX,AX + MOV AX,03E07H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,0C009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0EA10H + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,0DF12H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E715H + OUT DX,AX + MOV AX,00616H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,240; + MOV Mode.width_bytes,21600; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_F: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 350 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,080h + MOV DX,MISC_ADDR + OUT DX,AL + CALL SETPALETTE256 + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,0BF06H + OUT DX,AX + MOV AX,01F07H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,04009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,08310H + OUT DX,AX + MOV AX,08511H + OUT DX,AX + MOV AX,05D12H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,06315H + OUT DX,AX + MOV AX,0BA16H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,350; + MOV Mode.width_bytes,31500; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_G: + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain 4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 400 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,040h + MOV DX,MISC_ADDR + OUT DX,AL + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,04009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,400; + MOV Mode.width_bytes,36000; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_H: + + MOV SI,OFFSET MODE13H + CALL SETMODE + + ; Turn off Chain4 + MOV DX,SEQ_ADDR + MOV AX,0604H + OUT DX,AX + + ; Activate a synchronous reset + MOV AX,0100H + OUT DX,AX + + ; Select 28 mhz pixel clock + MOV DX,MISC_ADDR + MOV AL,067H + OUT DX,AL + + ; Release synchronous reset + MOV DX,SEQ_ADDR + MOV AX,0300H + OUT DX,AX + + ; change the vertical resolution flags to 480 + MOV DX,03CCH + IN AL,DX + AND AL,02Fh + OR AL,0C0h + MOV DX,MISC_ADDR + OUT DX,AL + + + MOV DX,CRTC_ADDR + ; turn off write protect + MOV AX,02C11H + OUT DX,AX + + MOV AX,06B00H + OUT DX,AX + MOV AX,05901H + OUT DX,AX + MOV AX,05A02H + OUT DX,AX + MOV AX,08E03H + OUT DX,AX + MOV AX,05E04H + OUT DX,AX + MOV AX,08A05H + OUT DX,AX + MOV AX,00D06H + OUT DX,AX + MOV AX,03E07H + OUT DX,AX + MOV AX,00008H + OUT DX,AX + MOV AX,04009H + OUT DX,AX + MOV AX,0000AH + OUT DX,AX + MOV AX,0000BH + OUT DX,AX + MOV AX,0000DH + OUT DX,AX + MOV AX,0000CH + OUT DX,AX + MOV AX,0000EH + OUT DX,AX + MOV AX,0000FH + OUT DX,AX + MOV AX,0EA10H + OUT DX,AX + MOV AX,0AC11H + OUT DX,AX + MOV AX,0DF12H + OUT DX,AX + MOV AX,02D13H + OUT DX,AX + MOV AX,00014H + OUT DX,AX + MOV AX,0E715H + OUT DX,AX + MOV AX,00616H + OUT DX,AX + MOV AX,0E317H + OUT DX,AX + MOV AX,0FF18H + OUT DX,AX + + CALL SETPALETTE256 + + MOV Mode.mode_width,360; + MOV Mode.mode_height,480; + MOV Mode.width_bytes,43200; + MOV Mode.colors,256; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_UNCHAINED + JMP SET_OUT + +SETMODE_I: + MOV SI,OFFSET MODE10H + CALL SETMODE + + MOV DX,03CCH + IN AL,DX + AND AL,03FH + OR AL,40H + + MOV DX,03C2H + OUT DX,AL + + MOV DX,CRTC_ADDR + MOV AX,9C10H + OUT DX,AX + IODELAY + + MOV AX,8311H + OUT DX,AX + IODELAY + + MOV AX,8F12H + OUT DX,AX + IODELAY + + MOV AX,9615H + OUT DX,AX + IODELAY + + MOV AX,0B916H + OUT DX,AX + IODELAY + + CALL SETPALETTE16 + MOV Mode.mode_width,640; + MOV Mode.mode_height,400; + MOV Mode.width_bytes,32000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_GRAPHICS + OR Mode.attrib,TVU_PLANAR + JMP SET_OUT + +SETMODE_J: + MOV SI,OFFSET MODEJ + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,80; + MOV Mode.mode_height,43; + MOV Mode.width_bytes,3440; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + JMP SET_OUT + +SETMODE_K: + MOV SI,OFFSET MODEK + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,80; + MOV Mode.mode_height,50; + MOV Mode.width_bytes,4000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + JMP SET_OUT + +SETMODE_L: + MOV SI,OFFSET MODE_L + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,40; + MOV Mode.mode_height,43; + MOV Mode.width_bytes,3440; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + JMP SET_OUT + +SETMODE_M: + MOV SI,OFFSET MODEM + CALL SETMODE + CALL SETPALETTE16 + + PUSH 8 ; Bytes per character + PUSH 0 ; Offset of font in Video Memory + PUSH 0A000H + PUSH FONT_8x8_OFF ; Offset of Font in BIOS + PUSH 0C000H + CALL LOADFONT + + MOV Mode.mode_width,40; + MOV Mode.mode_height,50; + MOV Mode.width_bytes,4000; + MOV Mode.colors,16; + MOV Mode.attrib,TVU_TEXT + +SET_OUT: + + POP BP + RET 2 +SETVIDEOMODE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + PUBLIC SETMODE +SETMODE PROC + + ; Send MISC regs + MOV DX,MISC_ADDR + MOV AL,[SI] + OUT DX,AL + IODELAY + INC SI + + MOV DX,STATUS_ADDR + MOV AL,[SI] + OUT DX,AL + IODELAY + INC SI + + ; Send SEQ regs + MOV CX,0 +REG_LOOP: + MOV DX,SEQ_ADDR + MOV AL,CL + OUT DX,AL + IODELAY + + MOV DX,SEQ_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + IODELAY + INC SI + INC CX + CMP CL,5 + JL REG_LOOP + + ; Clear Protection bits + MOV AH,0EH + MOV AL,11H + AND AH,7FH + MOV DX,CRTC_ADDR + OUT DX,AX + IODELAY + + ; Send CRTC regs + MOV CX,0 +REG_LOOP2: + MOV DX,CRTC_ADDR + MOV AL,CL + OUT DX,AL + IODELAY + + MOV DX,CRTC_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + IODELAY + + INC SI + INC CX + CMP CL,25 + JL REG_LOOP2 + + ; Send GRAPHICS regs + MOV CX,0 +REG_LOOP3: + MOV DX,GRACON_ADDR + MOV AL,CL + OUT DX,AL + IODELAY + + MOV DX,GRACON_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + IODELAY + + INC SI + INC CX + CMP CL,9 + JL REG_LOOP3 + + MOV DX,STATUS_ADDR + IN AL,DX + IODELAY + + ; Send ATTRCON regs + MOV CX,0 +REG_LOOP4: + MOV DX,ATTRCON_ADDR + IN AX,DX + + MOV AL,CL + OUT DX,AL + IODELAY + + MOV AL,[SI] + OUT DX,AL + IODELAY + + INC SI + INC CX + CMP CL,21 + JL REG_LOOP4 + + MOV AL,20H + OUT DX,AL + IODELAY + + RET +SETMODE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Assumes [bp+4] = color +; Assumes [bp+6] = r value +; Assumes [bp+8] = g value +; Assumes [bp+10] = b value + PUBLIC SETPAL +SETPAL PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV AX,WORD PTR [BP+4] + ; Send color + MOV DX,03C8H + OUT DX,AL + + ; Write R value + MOV DX,03C9H + MOV AL,BYTE PTR [BP+6] + OUT DX,AL + + ; Write G value + MOV DX,03C9H + MOV AL,BYTE PTR [BP+8] + OUT DX,AL + + ; Write B value + MOV DX,03C9H + MOV AL,BYTE PTR [BP+10] + OUT DX,AL + + POPA + POP BP + RET 8 +SETPAL ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETPALETTE4 PROC + PUSH 0 + PUSH 0 + PUSH 0 + PUSH 0 + CALL SETPAL + + PUSH 42 + PUSH 42 + PUSH 0 + PUSH 1 + CALL SETPAL + + PUSH 42 + PUSH 0 + PUSH 42 + PUSH 2 + CALL SETPAL + + PUSH 63 + PUSH 63 + PUSH 63 + PUSH 3 + CALL SETPAL + + RET +SETPALETTE4 ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETPALETTE16 PROC + + MOV SI,OFFSET PALETTE + MOV CX,16 + MOV DX,0 +PAL_LOOP: + PUSH WORD PTR [SI+2] + PUSH WORD PTR [SI+1] + PUSH WORD PTR [SI] + PUSH DX + CALL SETPAL + + INC DX + ADD SI,3 + LOOP PAL_LOOP + + RET +SETPALETTE16 ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SETPALETTE256 PROC + + MOV SI,OFFSET PALETTE + MOV CX,256 + MOV DX,0 +PAL_LOOP2: + PUSH WORD PTR [SI+2] + PUSH WORD PTR [SI+1] + PUSH WORD PTR [SI] + PUSH DX + CALL SETPAL + + INC DX + ADD SI,3 + LOOP PAL_LOOP2 + + RET +SETPALETTE256 ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/ASM_SRC/MODES.INC b/16/tauron30/ASM_SRC/MODES.INC new file mode 100755 index 00000000..3c8a84a0 --- /dev/null +++ b/16/tauron30/ASM_SRC/MODES.INC @@ -0,0 +1,196 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- VGA register variables for the various videomodes -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; Same as Mode 01H +MODE00H DB 67H, 00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,1FH,00H,4FH,06H,07H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; Same as Mode 02H +MODE03H DB 67H, 00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0EH,0FH,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,01H,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +; Same as Mode 05H +MODE04H DB 63H, 00H, 03H,09H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,80H,0BFH,1FH,00H,0C1H,00H,00H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0A2H,0FFH + DB 00H,00H,00H,00H,00H,30H,0FH,00H,0FFH + DB 00H,3BH,3DH,3FH,02H,04H,06H,07H,10H,11H,12H,13H,14H,15H,16H,17H + DB 01H,00H,03H,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE06H DB 63H, 00H, 03H,01H,01H,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,0C1H,00H,00H,00H,00H,00H,00H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0C2H,0FFH + DB 00H,00H,00H,00H,00H,00H,0DH,00H,0FFH + DB 00H,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH + DB 01H,00H,01H,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE07H DB 066H, 00H, 03H,00H,03H,00H,02H + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 00H,00H,00H,00H,00H,10H,0AH,00H,0FFH + DB 00H,08H,08H,08H,08H,08H,08H,08H,10H,18H,18H,18H,18H,18H,18H,18H + DB 0EH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE0DH DB 063H, 00H, 03H,09H,0FH,00H,06H + DB 2DH,27H,28H,90H,2BH,80H,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,10H,05H,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE0EH DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,0C0H,00H,00H,00H,00H,00H,59H + DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE0FH DB 0A2H, 00H, 03H,01H,0FH,00H,06H + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,05H,0FFH + DB 00H,08H,00H,00H,18H,18H,00H,00H,00H,08H,00H,00H,00H,18H,00H,00H + DB 0BH,00H,05H,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE10H DB 0A3H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H + DB 83H,85H,5DH,28H,0FH,63H,0BAH,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE11H DB 063H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,59H + DB 0EAH,8CH,0DFH,28H,0FH,0E7H,004H,0C3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,05H,0FFH + DB 00H,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE12H DB 063H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,59H + DB 0EAH,8CH,0DFH,28H,00H,0E7H,04H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 01H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODE13H DB 63H, 00H, 03H,01H,0FH,00H,0EH + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +CHAIN4 DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH + DB 41H,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODEJ DB 63H, 00H, 03H,01H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,83H,85H,57H,28H,1FH,60H,0B8H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODEK DB 63H, 00H, 03H,01H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +MODE_L DB 67H, 00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 31H,83H,85H,57H,14H,1FH,60H,0B8H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODEM DB 67H, 00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H,31H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Videomode Structure Definition +VMODE STRUC + videomode DW ? ; Videomode Number + mode_width DW ? ; Width in pixels + mode_height DW ? ; height in pixels + width_bytes DW ? ; Number of bytes per screen + colors DW ? ; Number of colors + attrib DW ? ; Videomode attributes +VMODE ENDS + +; Videomode attributes +TVU_TEXT EQU 0001h +TVU_GRAPHICS EQU 0002h +TVU_MONOCHROME EQU 0004h +TVU_PLANAR EQU 0008h +TVU_UNCHAINED EQU 0010h +TVU_B8000_ADDR EQU 0020h + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +; Videomode Info Structure +MODE VMODE +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/ASM_SRC/TESTS.ASM b/16/tauron30/ASM_SRC/TESTS.ASM new file mode 100755 index 00000000..7401c0ee --- /dev/null +++ b/16/tauron30/ASM_SRC/TESTS.ASM @@ -0,0 +1,676 @@ +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- -= +;=- Tauron VGA Utilities Version 3.0 -= +;=- Released September 20, 1998 -= +;=- -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +;=- All Rights Reserved. =-= that you put my name some- -= +;=- =-= where in your credits. -= +;=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +;=- I assume no responsibility whatsoever for any effect that this package, -= +;=- the information contained therein or the use thereof has on you, your -= +;=- sanity, computer, spouse, children, pets or anything else related to -= +;=- you or your existance. No warranty is provided nor implied with this -= +;=- source code. -= +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PIXEL PROC + PUSH BP + MOV BP,SP + PUSHA + + TEST Mode.attrib,TVU_PLANAR + JNZ PLANAR_PIXEL + CMP Mode.videomode,VMODE_13H + JE MODE_13H_PIXEL + +; Unchained Modes Pixel + MOV AX,0A000H ; video memory segment number + MOV ES,AX ; place it in es + + MOV DX,03C4H + MOV AL,2 + OUT DX,AL + INC DX + + MOV AL,1 + MOV CX,word ptr [bp+4] + AND CX,3 + SHL AL,CL + OUT DX,AL + + XOR DI,DI + +; Calculate the Offset + mov ax,Mode.mode_width ; width / 4 + SHR AX,2 + mul word ptr [bp+6] ; (Y * (width / 4)) + mov bx,word ptr [bp+4] ; (X / 4) + (Y * (width / 4)) + shr bx,2 + add ax,bx +; Done! + + ADD DI,AX + mov ah,byte ptr [bp+8] ; move the Color into ah + mov es:[di],ah ; move the value to the screen + JMP PIXEL_OUT + +PLANAR_PIXEL: + MOV AX,0A000H ; video memory segment number + MOV ES,AX ; place it in es + + MOV BX,word ptr [bp+4] ; X Value + MOV CX,BX + MOV AX,word ptr [bp+6] ; Y Value + MOV SI,80 + MUL SI + SHR BX,3 ; /8 + ADD AX,BX + MOV DI,AX + + AND CL,7 + XOR CL,7 + MOV AH,1 + + SHL AH,CL + + MOV DX,03CEH + MOV AL,8 + OUT DX,AX + + MOV AL,0 + XCHG ES:[DI],AL + + MOV DX,03C4H + MOV AH,byte ptr [bp+8] + MOV AL,2 + OUT DX,AX + + MOV BYTE PTR ES:[DI],0FFh + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + JMP PIXEL_OUT + +MODE_13H_PIXEL: + + MOV AX,0A000H ; video memory segment number + MOV ES,AX ; place it in es + XOR DI,DI + +; Calculate the Offset + mov ax,Mode.mode_width ; width + mul word ptr [bp+6] ; (Y * width)) + mov bx,word ptr [bp+4] ; (X + (Y * width)) + add ax,bx +; Done! + + ADD DI,AX + mov ah,byte ptr [bp+8] ; move the Color into ah + mov es:[di],ah ; move the value to the screen + +PIXEL_OUT: + + POPA + POP BP + RET 6 +PIXEL ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +HLINE PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV CX,WORD PTR [BP+4] +HLINE_LOOP: + PUSH WORD PTR [BP+10] ; Color + PUSH WORD PTR [BP+8] ; Y value + PUSH CX ; X value + CALL PIXEL + INC CX + CMP CX,WORD PTR [BP+6] + JLE HLINE_LOOP + + POPA + POP BP + RET 8 +HLINE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +VLINE PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV CX,WORD PTR [BP+4] +VLINE_LOOP: + PUSH WORD PTR [BP+10] ; Color + PUSH CX ; Y value + PUSH WORD PTR [BP+8] ; X value + CALL PIXEL + INC CX + CMP CX,WORD PTR [BP+6] + JLE VLINE_LOOP + + POPA + POP BP + RET 8 +VLINE ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +DRAWRECT PROC + PUSH BP + MOV BP,SP + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+6] + PUSH WORD PTR [BP+8] + PUSH WORD PTR [BP+4] + CALL HLINE + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+10] + PUSH WORD PTR [BP+8] + PUSH WORD PTR [BP+4] + CALL HLINE + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+4] + PUSH WORD PTR [BP+10] + PUSH WORD PTR [BP+6] + CALL VLINE + + PUSH WORD PTR [BP+12] + PUSH WORD PTR [BP+8] + PUSH WORD PTR [BP+10] + PUSH WORD PTR [BP+6] + CALL VLINE + + POP BP + RET 10 +DRAWRECT ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +FILLRECT PROC + PUSH BP + MOV BP,SP + PUSHA + + MOV CX,WORD PTR [BP+6] +HLINE_LOOP2: + PUSH WORD PTR [BP+12] ; Color + PUSH CX ; Y1 value + PUSH WORD PTR [BP+8] ; X2 value + PUSH WORD PTR [BP+4] ; X1 value + CALL HLINE + + INC CX + CMP CX,WORD PTR [BP+10] ; Y2 value + JLE HLINE_LOOP2 + + POPA + POP BP + RET 10 +FILLRECT ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +MODETEST PROC + PUSH BP + MOV BP,SP + SUB SP,2 + + TEST Mode.attrib,TVU_PLANAR + JNZ PLANAR_CLEAR + CMP Mode.videomode,VMODE_13H + JNE UNCHAINED_CLEAR + + PUSH 0 + CALL CLEAR13H + JMP CLEAROUT + +PLANAR_CLEAR: + PUSH 0 + CALL PLANARCLEAR + JMP CLEAROUT + +UNCHAINED_CLEAR: + PUSH 0 + CALL UNCHAINEDCLEAR + +CLEAROUT: + + PUSH 15 + + MOV AX,Mode.mode_height + DEC AX + PUSH AX + + MOV AX,Mode.mode_width + DEC AX + PUSH AX + + PUSH 0 + PUSH 0 + CALL DRAWRECT + + MOV CX,50 +LINE_LOOP: + PUSH 15 + PUSH CX + PUSH 10 + PUSH 0 + CALL HLINE + ADD CX,50 + + PUSH 15 + PUSH CX + PUSH 25 + PUSH 0 + CALL HLINE + ADD CX,50 + + CMP CX,Mode.mode_height + JLE LINE_LOOP + + MOV CX,40 +LINE_LOOP2: + PUSH 15 + PUSH CX + PUSH 15 + PUSH 0 + CALL VLINE + ADD CX,40 + + PUSH 15 + PUSH CX + PUSH 30 + PUSH 0 + CALL VLINE + ADD CX,40 + + CMP CX,Mode.mode_width + JLE LINE_LOOP2 + + CMP Mode.colors,16 + JE SETBLOCK16 + CMP Mode.colors,256 + JE SETBLOCK256 + + MOV AX,Mode.mode_width + SUB AX,420 + MOV DI,AX + ADD DI,200 + MOV BX,Mode.mode_height + SUB BX,220 + MOV SI,BX + ADD SI,200 + + PUSH 0 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,200 + ADD DI,200 + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + + MOV AX,Mode.mode_width + SUB AX,420 + MOV DI,AX + ADD DI,400 + MOV BX,Mode.mode_height + SUB BX,220 + MOV SI,BX + ADD SI,200 + + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL DRAWRECT + + JMP BLOCKOUT +SETBLOCK16: + + MOV AX,Mode.mode_width + SUB AX,522 + MOV DI,AX + ADD DI,64 + + MOV BX,Mode.mode_height + SUB BX,135 + MOV SI,BX + ADD SI,64 + MOV CX,0 + MOV DX,0 +LINE1_LOOP1: + + PUSH DX ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,64 + ADD DI,64 + INC CX + INC DX + CMP CX,8 + JL LINE1_LOOP1 + + MOV AX,Mode.mode_width + SUB AX,522 + MOV DI,AX + ADD DI,64 + ADD SI,64 + ADD BX,64 + MOV CX,0 +LINE1_LOOP2: + + PUSH DX ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,64 + ADD DI,64 + INC CX + INC DX + CMP CX,8 + JL LINE1_LOOP2 + + MOV AX,Mode.mode_width + SUB AX,522 + MOV DI,Mode.mode_width + SUB DI,10 + MOV BX,Mode.mode_height + SUB BX,135 + MOV SI,Mode.mode_height + SUB SI,7 + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL DRAWRECT + JMP BLOCKOUT + +SETBLOCK256: + + MOV WORD PTR [BP-2],0 + MOV BX,Mode.mode_height + SUB BX,165 + MOV SI,BX + ADD SI,10 + MOV DX,0 +LINE2_LOOP2: + + MOV AX,Mode.mode_width + SUB AX,165 + MOV DI,Mode.mode_width + SUB DI,155 + + MOV CX,0 +LINE2_LOOP1: + + PUSH DX ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL FILLRECT + ADD AX,10 + ADD DI,10 + INC CX + INC DX + CMP CX,16 + JL LINE2_LOOP1 + + ADD BX,10 + ADD SI,10 + INC WORD PTR [BP-2] + CMP WORD PTR [BP-2],16 + JL LINE2_LOOP2 + + MOV AX,Mode.mode_width + SUB AX,165 + MOV DI,Mode.mode_width + SUB DI,5 + MOV BX,Mode.mode_height + SUB BX,165 + MOV SI,Mode.mode_height + SUB SI,5 + PUSH 15 ; Color + PUSH SI ; Y2 + PUSH DI ; X2 + PUSH BX ; Y1 + PUSH AX ; X1 + CALL DRAWRECT + +BLOCKOUT: + ADD SP,2 + POP BP + RET +MODETEST ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PUTCHAR PROC + PUSH BP + MOV BP,SP + SUB SP,2 + PUSHA + + CMP Mode.videomode,VMODE_00H + JE SET2 + CMP Mode.videomode,VMODE_MODE_L + JE SET2 + CMP Mode.videomode,VMODE_MODE_M + JE SET2 + MOV BYTE PTR [BP-2],160 + JMP NOSET2 +SET2: + MOV BYTE PTR [BP-2],80 + JMP NOSET2 +NOSET2: + + MOV AX,0B800h + MOV ES,AX + + MOV AX,WORD PTR [BP+6] ; Y value + MOV BL,BYTE PTR [BP-2] + MUL BL + SHL WORD PTR [BP+4],1 + ADD AX,WORD PTR [BP+4] ; X value + MOV DI,AX + MOV AH,ATT + MOV AL,BYTE PTR [BP+8] ; character + CLD + STOSW + + POPA + ADD SP,2 + POP BP + RET 6 +PUTCHAR ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +PRINTSTRING PROC + +TEXT_LOOP: + XOR DX,DX + MOV DL,BYTE PTR [SI] + PUSH DX + PUSH BX + PUSH AX + CALL PUTCHAR + + INC AX + INC SI + CMP BYTE PTR [SI],0 + JNE TEXT_LOOP + RET +PRINTSTRING ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +TEXTTEST PROC + PUSH 1FH + CALL TEXTCLEAR + + MOV AH,2h + MOV BH,0 + MOV DX,Mode.mode_height + MOV DH,DL + MOV DL,0 + INT 10h + + CMP Mode.videomode,VMODE_00H + JE SET_TEXT1 + CMP Mode.videomode,VMODE_MODE_J + JE SET_TEXT2 + CMP Mode.videomode,VMODE_MODE_K + JE SET_TEXT3 + CMP Mode.videomode,VMODE_MODE_L + JE SET_TEXT4 + CMP Mode.videomode,VMODE_MODE_M + JE SET_TEXT5 + ; Mode 03h + MOV TEXTMSG_2+13,'3' + MOV TEXTMSG_3+8,'8' + MOV TEXTMSG_4+19,'4' + JMP NOSET +SET_TEXT1: + ; Mode 00h + MOV TEXTMSG_2+13,'0' + MOV TEXTMSG_3+8,'4' + MOV TEXTMSG_4+19,'2' + JMP NOSET +SET_TEXT2: + ; Mode J + MOV TEXTMSG_8+11,'J' + MOV TEXTMSG_9+21,'4' + MOV TEXTMSG_9+22,'3' + MOV TEXTMSG_A+19,'3' + MOV TEXTMSG_A+20,'4' + MOV TEXTMSG_A+21,'4' + MOV TEXTMSG_A+22,'0' + JMP NOSET +SET_TEXT3: + ; Mode K + MOV TEXTMSG_8+11,'K' + MOV TEXTMSG_9+21,'5' + MOV TEXTMSG_9+22,'0' + MOV TEXTMSG_A+19,'4' + MOV TEXTMSG_A+20,'0' + MOV TEXTMSG_A+21,'0' + MOV TEXTMSG_A+22,'0' + JMP NOSET +SET_TEXT4: + ; Mode L + MOV TEXTMSG_8+11,'L' + MOV TEXTMSG_9+8,'4' + MOV TEXTMSG_9+21,'4' + MOV TEXTMSG_9+22,'3' + MOV TEXTMSG_A+19,'3' + MOV TEXTMSG_A+20,'4' + MOV TEXTMSG_A+21,'4' + MOV TEXTMSG_A+22,'0' + JMP NOSET +SET_TEXT5: + ; Mode M + MOV TEXTMSG_8+11,'M' + MOV TEXTMSG_9+8,'4' + MOV TEXTMSG_9+21,'5' + MOV TEXTMSG_9+22,'0' + MOV TEXTMSG_A+19,'4' + MOV TEXTMSG_A+20,'0' + MOV TEXTMSG_A+21,'0' + MOV TEXTMSG_A+22,'0' +NOSET: + + CMP Mode.videomode,VMODE_00H + JE WRITE1 + CMP Mode.videomode,VMODE_03H + JE WRITE1 + CMP Mode.videomode,VMODE_MODE_J + JE WRITE2 + JMP WRITE2 + +WRITE1: + MOV BX,0 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_1 + CALL PRINTSTRING + MOV BX,1 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_2 + CALL PRINTSTRING + MOV BX,2 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_3 + CALL PRINTSTRING + MOV BX,3 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_4 + CALL PRINTSTRING + MOV BX,4 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_5 + CALL PRINTSTRING + MOV BX,5 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_6 + CALL PRINTSTRING + JMP WRITEOUT + +WRITE2: + MOV BX,0 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_7 + CALL PRINTSTRING + MOV BX,1 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_8 + CALL PRINTSTRING + MOV BX,2 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_9 + CALL PRINTSTRING + MOV BX,3 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_A + CALL PRINTSTRING + MOV BX,4 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_B + CALL PRINTSTRING + MOV BX,5 + MOV AX,0 + MOV SI,OFFSET TEXTMSG_C + CALL PRINTSTRING +WRITEOUT: + RET +TEXTTEST ENDP + +;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/C_SRC/CLEAR.CPP b/16/tauron30/C_SRC/CLEAR.CPP new file mode 100755 index 00000000..e201a055 --- /dev/null +++ b/16/tauron30/C_SRC/CLEAR.CPP @@ -0,0 +1,180 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include +#include "tauron.h" + +void TextClear(char attrib) +{ + unsigned int bytes = Mode.width_bytes; + asm { + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AH,attrib + MOV AL,' ' + MOV CX,bytes + CLD + REP STOSW + } +} + +void Clear04H() +{ + unsigned int bytes = Mode.width_bytes; + asm { + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AX,0AAAAH + CLD + MOV CX,bytes + REP STOSW + } +} + +void Clear06H() +{ + unsigned int bytes = Mode.width_bytes; + asm { + MOV AX,0B800H + MOV ES,AX + XOR DI,DI + + MOV AX,0FFFFH + CLD + MOV CX,bytes + REP STOSW + } +} + +void Clear0DH(char color) +{ + unsigned int bytes = Mode.width_bytes/2; + asm { + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,bytes + } +CLEAR_LOOP: + asm { + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV AX,0 + XCHG WORD PTR ES:[DI],AX + + MOV DX,03C4H + MOV AH,color + MOV AL,2 + OUT DX,AX + + MOV WORD PTR ES:[DI],0FFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,2 + LOOP CLEAR_LOOP + } +} + +void PlanarClear(char Color) +{ + unsigned int bytes = Mode.width_bytes/2; + asm { + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV CX,bytes + } +CLEAR_LOOP: + asm { + MOV DX,03CEH + MOV AX,0FF08H + OUT DX,AX + + MOV AX,0 + XCHG WORD PTR ES:[DI],AX + + MOV DX,03C4H + MOV AH,Color + MOV AL,2 + OUT DX,AX + + MOV WORD PTR ES:[DI],0FFFFH + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + + ADD DI,2 + LOOP CLEAR_LOOP + } +} + +void Clear13H(char Color) +{ + asm { + MOV AX,0A000H + MOV ES,AX + XOR DI,DI + + MOV AL,Color + MOV AH,AL + CLD + MOV CX,8000H + REP STOSW + } +} + +void UnchainedClear(char Color) +{ + unsigned int bytes = Mode.width_bytes/2; + asm { + mov dx, 03C4h // 03c4h + mov al, 2 // Map Mask Register + out dx, al + inc dx + mov al,00001111B // Select all planes to write to + out dx, al // Doing this to clear all planes at once + + mov ax,0A000H + mov es, ax + XOR DI,DI // set es:di = Screen Mem + mov ah,Color // move the color into ah + mov al,ah // copy the value to al + mov cx,bytes // Number of words + cld + rep stosw // clear it + } +} diff --git a/16/tauron30/C_SRC/DUAL.CPP b/16/tauron30/C_SRC/DUAL.CPP new file mode 100755 index 00000000..e60d1fb9 --- /dev/null +++ b/16/tauron30/C_SRC/DUAL.CPP @@ -0,0 +1,236 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// 3C4H, 03H +// Bit positions for font maps: +// +// +--7--+--6--+--5--+--4--+--3--+--2--+--1--+--0--+ +// | | | SAH | SBH | SA | SB | +// +-----+-----+-----+-----+-----+-----+-----+-----+ +// +// SA - bits 1, 0 of Character Map A +// SAH - bit 2 (high order) of Charcter Map A +// +// SB - bits 1, 0 of Character Map B +// SBH - bit 2 (high order) of Charcter Map B +// +#include +#include +#include +#include +#include +#include "tauron.h" +#include "font1.h" +#include "font2.h" +extern unsigned char mode03h[62]; +void LoadFonts(); + +// Points to fonts for Map A Memory Address +#define DFM_MAPA_FONT1 0x00 // 0K +#define DFM_MAPA_FONT2 0x04 // 16K +#define DFM_MAPA_FONT3 0x08 // 32K +#define DFM_MAPA_FONT4 0x0C // 48K +#define DFM_MAPA_FONT5 0x20 // 8K +#define DFM_MAPA_FONT6 0x24 // 24K +#define DFM_MAPA_FONT7 0x28 // 40K +#define DFM_MAPA_FONT8 0x2C // 56K + +// Points to fonts for Map B +#define DFM_MAPB_FONT1 0x00 // 0K +#define DFM_MAPB_FONT2 0x01 // 16K +#define DFM_MAPB_FONT3 0x02 // 32K +#define DFM_MAPB_FONT4 0x03 // 48K +#define DFM_MAPB_FONT5 0x10 // 8K +#define DFM_MAPB_FONT6 0x11 // 24K +#define DFM_MAPB_FONT7 0x12 // 40K +#define DFM_MAPB_FONT8 0x13 // 56K + + +// To set dual font mode, just set the character map select register to point +// to 2 different fonts. There can be up to 8 fonts resident in memory at +// once but only 2 can be active at a time. +// +// ** NOTE ** If you set both font maps the same you are no longer in dual font +// mode. But what this allows you to do is to put up to 8 fonts in VGA memory +// and switch between them at any time. +// +// Both fonts were made with my font editor. I just read the BIOS and +// modified the second font so a solid line goes through the middle of it. +// +// This procedure sets up dual font mode and loads 2 fonts into video memory. +void SetDual() +{ + outport(SEQ_ADDR, ((DFM_MAPA_FONT1 | DFM_MAPB_FONT5) << 8) | 0x03); + + // Load font 1 into 0K and font 2 into 8K + LoadFonts(); +} + +// This procedure reset the character map select register to point to only +// one font. +void UnSetDual() +{ + outport(0x3C4,0x0003); +} + +// In dual font modes, the palette is in effect half of what it is. The +// bottom 8 colors for the first font, and the top 8 colors for the second +// font. +// +// What I do here is to set them to the same 8 colors. +// Black, Blue, Green, Red, Purple, Yellow, Light Gray, and White +// +void SetDualPalette() +{ + // Font 1 + setpal( 0, 0, 0, 0); + setpal( 1, 0, 0, 42); + setpal( 2, 0, 42, 0); + setpal( 3, 0, 42, 42); + setpal( 4, 42, 0, 0); + setpal( 5, 63, 63, 21); + setpal( 6, 42, 42, 42); + setpal( 7, 63, 63, 63); + // Font 2 + setpal( 8, 0, 0, 0); + setpal( 9, 0, 0, 42); + setpal(10, 0, 42, 0); + setpal(11, 0, 42, 42); + setpal(12, 42, 0, 0); + setpal(13, 63, 63, 21); + setpal(14, 42, 42, 42); + setpal(15, 63, 63, 63); +} + +void pchar(int x, int y, char c, char att) +{ + char far *vidmem; + int off; + + // Make a pointer to the font + vidmem = (char far *)MK_FP( 0xB800, 0x0000); + off = y * 160 + x * 2; + vidmem += off; + *vidmem++ = c; + *vidmem = att; +} + +void print(int x, int y, char *Text, char attrib) +{ + for (int i = 0; i < strlen(Text); i++) + pchar(x++,y,Text[i],attrib); +} + +void DualTest() +{ + SetMode((unsigned int)&mode03h); + TextClear(0x1F); + SetDual(); + SetDualPalette(); + + /* ** NOTE ** when trying to print text on the screen, do not use the printf + * text functions. For some reason they do not select the proper VGA font. + */ + + print(0,0,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x17); + print(0,1,"³ DUAL FONT MODE ³",0x17); + print(0,2,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x17); + + print(0,4,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿",0x1F); + print(0,5,"³ DUAL FONT MODE ³",0x1F); + print(0,6,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ",0x1F); + + getch(); + UnSetDual(); + textcolor(7); + textbackground(0); +} + + +void LoadFonts() +{ + char far *vidmem; + int l = 0; + unsigned char oldmode,oldmisc,oldmem,oldmask; + unsigned char newmode,newmisc,newmem; + + // Make a pointer to the font + vidmem = (char far *)MK_FP( 0xA000, 0x0000); + + // Store the OLD 'Mode Register' value + outportb(GRACON_ADDR,5); + oldmode = inportb(GRACON_ADDR+1); + // Store the OLD 'Miscellaneous Register' value + outportb(GRACON_ADDR,6); + oldmisc = inportb(GRACON_ADDR+1); + // Store the OLD 'Mask Map' value + outportb(SEQ_ADDR,2); + oldmask = inportb(SEQ_ADDR+1); + // Store the OLD 'Memory Mode' value + outportb(SEQ_ADDR,4); + oldmem = inportb(SEQ_ADDR+1); + + // Write the NEW 'Mode Register' value + newmode = (oldmode & 0xFC); + outport(GRACON_ADDR, (newmode << 8) | 0x05); + // Write the NEW 'Miscellaneous Register' value + newmisc = ((oldmisc & 0xF1)|4); + outport(GRACON_ADDR, (newmisc << 8) | 0x06); + // Write the NEW 'Mask Map' value + outport(SEQ_ADDR, 0x0402); + // Write the NEW 'Memory Mode' value + newmem = (oldmem | 4); + outport(SEQ_ADDR, (newmem << 8) | 0x04); + + // Copy the font from BIOS + l = 0; + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 16; j++) + { + *vidmem++ = Font1[l++]; + } + for (int k = 0; k < 16; k++) + { + *vidmem++ = 0x00; + } + } + + vidmem = (char far *)MK_FP( 0xA000, 0x2000); + l = 0; + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 16; j++) + { + *vidmem++ = Font2[l++]; + } + for (int k = 0; k < 16; k++) + { + *vidmem++ = 0x00; + } + } + + // Write the OLD 'Mode Register' value + outport(GRACON_ADDR, (oldmode << 8) | 0x05); + // Write the OLD 'Miscellaneous Register' value + outport(GRACON_ADDR, (oldmisc << 8) | 0x06); + // Write the OLD 'Mask Map' value + outport(SEQ_ADDR,(oldmask << 8) | 0x02); + // Write the OLD 'Memory Mode' value + outport(SEQ_ADDR, (oldmem << 8) | 0x04); +} + +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= \ No newline at end of file diff --git a/16/tauron30/C_SRC/FONT1.H b/16/tauron30/C_SRC/FONT1.H new file mode 100755 index 00000000..ae20aa2c --- /dev/null +++ b/16/tauron30/C_SRC/FONT1.H @@ -0,0 +1,268 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +//=- -= +//=- Tauron VGA Utilities Version 1.0 -= +//=- Released June 14, 1998 -= +//=- -= +//=- Font Width: 8 -= +//=- Font Height: 16 -= +//=- Bytes per character: 16 -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +char Font1[] = { +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x081,0x0A5,0x081,0x081,0x0BD,0x099,0x081,0x081,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x0FF,0x0DB,0x0FF,0x0FF,0x0C3,0x0E7,0x0FF,0x0FF,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x06C,0x0FE,0x0FE,0x0FE,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x07C,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x03C,0x0E7,0x0E7,0x0E7,0x099,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x07E,0x0FF,0x0FF,0x07E,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0E7,0x0C3,0x0C3,0x0E7,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x03C,0x066,0x042,0x042,0x066,0x03C,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0C3,0x099,0x0BD,0x0BD,0x099,0x0C3,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x01E,0x00E,0x01A,0x032,0x078,0x0CC,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x066,0x066,0x066,0x03C,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x03F,0x033,0x03F,0x030,0x030,0x030,0x030,0x070,0x0F0,0x0E0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x063,0x07F,0x063,0x063,0x063,0x063,0x067,0x0E7,0x0E6,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x018,0x0DB,0x03C,0x0E7,0x03C,0x0DB,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x080,0x0C0,0x0E0,0x0F0,0x0F8,0x0FE,0x0F8,0x0F0,0x0E0,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x002,0x006,0x00E,0x01E,0x03E,0x0FE,0x03E,0x01E,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x0DB,0x0DB,0x0DB,0x07B,0x01B,0x01B,0x01B,0x01B,0x01B,0x000,0x000,0x000,0x000, +0x000,0x07C,0x0C6,0x060,0x038,0x06C,0x0C6,0x0C6,0x06C,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x0FE,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x07E,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x00C,0x0FE,0x00C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x030,0x060,0x0FE,0x060,0x030,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C0,0x0C0,0x0C0,0x0C0,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x028,0x06C,0x0FE,0x06C,0x028,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x038,0x07C,0x07C,0x0FE,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x07C,0x07C,0x038,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x03C,0x03C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x066,0x066,0x066,0x024,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x06C,0x06C,0x0FE,0x06C,0x06C,0x06C,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x018,0x018,0x07C,0x0C6,0x0C2,0x0C0,0x07C,0x006,0x086,0x0C6,0x07C,0x018,0x018,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0C2,0x0C6,0x00C,0x018,0x030,0x060,0x0C6,0x086,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x06C,0x038,0x076,0x0DC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x030,0x030,0x030,0x060,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x018,0x030,0x030,0x030,0x030,0x030,0x030,0x018,0x00C,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x018,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x03C,0x0FF,0x03C,0x066,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x018,0x030,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x002,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0CE,0x0D6,0x0D6,0x0E6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x038,0x078,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x006,0x03C,0x006,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x01C,0x03C,0x06C,0x0CC,0x0FE,0x00C,0x00C,0x00C,0x01E,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0FC,0x00E,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x060,0x0C0,0x0C0,0x0FC,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x006,0x006,0x00C,0x018,0x030,0x030,0x030,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x006,0x006,0x00C,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x006,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x006,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x060,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x060,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x00C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0DE,0x0DE,0x0DE,0x0DC,0x0C0,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x066,0x066,0x066,0x066,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0C0,0x0C0,0x0C2,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F8,0x06C,0x066,0x066,0x066,0x066,0x066,0x066,0x06C,0x0F8,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x068,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x068,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0DE,0x0C6,0x0C6,0x066,0x03A,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x00C,0x00C,0x00C,0x00C,0x00C,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E6,0x066,0x06C,0x06C,0x078,0x078,0x06C,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F0,0x060,0x060,0x060,0x060,0x060,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0EE,0x0FE,0x0FE,0x0D6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0CE,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x060,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0D6,0x0DE,0x07C,0x00C,0x00E,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x06C,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x060,0x038,0x00C,0x006,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x07E,0x05A,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0D6,0x0D6,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x06C,0x06C,0x038,0x038,0x06C,0x06C,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x03C,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x086,0x00C,0x018,0x030,0x060,0x0C2,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x030,0x030,0x030,0x030,0x030,0x030,0x030,0x030,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x080,0x0C0,0x0E0,0x070,0x038,0x01C,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x03C,0x000,0x000,0x000,0x000, +0x010,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000, +0x030,0x030,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x078,0x06C,0x066,0x066,0x066,0x066,0x0DC,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C0,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x00C,0x00C,0x03C,0x06C,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x0CC,0x078,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x06C,0x076,0x066,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x006,0x006,0x000,0x00E,0x006,0x006,0x006,0x006,0x006,0x006,0x066,0x066,0x03C,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x066,0x06C,0x078,0x078,0x06C,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0EC,0x0FE,0x0D6,0x0D6,0x0D6,0x0D6,0x0D6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0F0,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x00C,0x01E,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x076,0x062,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x060,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x030,0x030,0x0FC,0x030,0x030,0x030,0x030,0x036,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0D6,0x0D6,0x0FE,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x06C,0x038,0x038,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x0F8,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x0CC,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x018,0x018,0x018,0x070,0x018,0x018,0x018,0x018,0x00E,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x000,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x070,0x018,0x018,0x018,0x00E,0x018,0x018,0x018,0x018,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0C0,0x0C2,0x066,0x03C,0x00C,0x006,0x07C,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x038,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x03C,0x066,0x060,0x060,0x066,0x03C,0x00C,0x006,0x03C,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x03C,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x038,0x06C,0x038,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x018,0x030,0x060,0x000,0x0FE,0x066,0x060,0x07C,0x060,0x060,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x076,0x036,0x07E,0x0D8,0x0D8,0x06E,0x000,0x000,0x000,0x000, +0x000,0x000,0x03E,0x06C,0x0CC,0x0CC,0x0FE,0x0CC,0x0CC,0x0CC,0x0CC,0x0CE,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x030,0x078,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x078,0x000, +0x000,0x0C6,0x0C6,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x018,0x03C,0x066,0x060,0x060,0x060,0x066,0x03C,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0E6,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x03C,0x018,0x07E,0x018,0x07E,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x0F8,0x0CC,0x0CC,0x0F8,0x0C4,0x0CC,0x0DE,0x0CC,0x0CC,0x0CC,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x00E,0x01B,0x018,0x018,0x018,0x07E,0x018,0x018,0x018,0x018,0x018,0x0D8,0x070,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x076,0x0DC,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0CE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x03C,0x06C,0x06C,0x03E,0x000,0x07E,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x07C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x030,0x000,0x030,0x030,0x060,0x0C0,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x006,0x006,0x006,0x000,0x000,0x000,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x060,0x0CE,0x093,0x006,0x00C,0x01F,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x066,0x0CE,0x09A,0x03F,0x006,0x00F,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x018,0x018,0x018,0x03C,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0CC,0x066,0x033,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x066,0x033,0x066,0x0CC,0x000,0x000,0x000,0x000,0x000,0x000, +0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044, +0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA, +0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x03F,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x03F,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0, +0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x0D8,0x0D8,0x0D8,0x0DC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FC,0x0C6,0x0FC,0x0C6,0x0C6,0x0FC,0x0C0,0x0C0,0x0C0,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x0C6,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x080,0x0FE,0x06C,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x0FE,0x0C6,0x060,0x030,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0D8,0x0D8,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x076,0x0DC,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07E,0x018,0x03C,0x066,0x066,0x066,0x03C,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x06C,0x06C,0x06C,0x06C,0x0EE,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x030,0x018,0x00C,0x03E,0x066,0x066,0x066,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0DB,0x0DB,0x0DB,0x07E,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x003,0x006,0x07E,0x0CF,0x0DB,0x0F3,0x07E,0x060,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x030,0x060,0x060,0x07C,0x060,0x060,0x060,0x030,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x01B,0x01B,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x07E,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x00F,0x00C,0x00C,0x00C,0x00C,0x00C,0x0EC,0x06C,0x06C,0x03C,0x01C,0x000,0x000,0x000,0x000, +0x000,0x0D8,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x070,0x098,0x030,0x060,0x0C8,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 +}; diff --git a/16/tauron30/C_SRC/FONT2.H b/16/tauron30/C_SRC/FONT2.H new file mode 100755 index 00000000..1a2a5166 --- /dev/null +++ b/16/tauron30/C_SRC/FONT2.H @@ -0,0 +1,268 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Created with FEDIT written by Kinfira (Jeffrey Morgan) -= +//=- -= +//=- Tauron VGA Utilities Version 1.0 -= +//=- Released June 14, 1998 -= +//=- -= +//=- Font Width: 8 -= +//=- Font Height: 16 -= +//=- Bytes per character: 16 -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +char Font2[] = { +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x081,0x0A5,0x081,0x081,0x0BD,0x099,0x081,0x081,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x0FF,0x0DB,0x0FF,0x0FF,0x0C3,0x0E7,0x0FF,0x0FF,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x06C,0x0FE,0x0FE,0x0FE,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x07C,0x0FE,0x07C,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x03C,0x0E7,0x0E7,0x0E7,0x099,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x03C,0x07E,0x0FF,0x0FF,0x07E,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0E7,0x0C3,0x0C3,0x0E7,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x03C,0x066,0x042,0x042,0x066,0x03C,0x000,0x000,0x000,0x000,0x000, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0C3,0x099,0x0BD,0x0BD,0x099,0x0C3,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x01E,0x00E,0x01A,0x032,0x078,0x0CC,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x066,0x066,0x066,0x03C,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x03F,0x033,0x03F,0x030,0x030,0x030,0x030,0x070,0x0F0,0x0E0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x063,0x07F,0x063,0x063,0x063,0x063,0x067,0x0E7,0x0E6,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x018,0x018,0x0DB,0x03C,0x0E7,0x03C,0x0DB,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x080,0x0C0,0x0E0,0x0F0,0x0F8,0x0FE,0x0F8,0x0F0,0x0E0,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x002,0x006,0x00E,0x01E,0x03E,0x0FE,0x03E,0x01E,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x07F,0x0DB,0x0DB,0x0DB,0x07B,0x01B,0x01B,0x01B,0x01B,0x01B,0x000,0x000,0x000,0x000, +0x000,0x07C,0x0C6,0x060,0x038,0x06C,0x0C6,0x0C6,0x06C,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x0FE,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x07E,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x07E,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x00C,0x0FE,0x00C,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x030,0x060,0x0FE,0x060,0x030,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C0,0x0C0,0x0C0,0x0C0,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x028,0x06C,0x0FE,0x06C,0x028,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x038,0x07C,0x07C,0x0FE,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x0FE,0x07C,0x07C,0x038,0x038,0x010,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x03C,0x03C,0x03C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x066,0x066,0x066,0x024,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x06C,0x06C,0x0FE,0x06C,0x06C,0x06C,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x018,0x018,0x07C,0x0C6,0x0C2,0x0C0,0x07C,0x006,0x086,0x0C6,0x07C,0x018,0x018,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0C2,0x0C6,0x00C,0x018,0x030,0x060,0x0C6,0x086,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x06C,0x038,0x076,0x0DC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x030,0x030,0x030,0x060,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x018,0x030,0x030,0x030,0x030,0x030,0x030,0x018,0x00C,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x018,0x00C,0x00C,0x00C,0x00C,0x00C,0x00C,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x03C,0x0FF,0x03C,0x066,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x018,0x030,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x002,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x080,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0CE,0x0D6,0x0D6,0x0E6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x038,0x078,0x018,0x018,0x018,0x018,0x018,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x00C,0x018,0x030,0x060,0x0C0,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x006,0x006,0x03C,0x006,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x00C,0x01C,0x03C,0x06C,0x0CC,0x0FE,0x00C,0x00C,0x00C,0x01E,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0FC,0x00E,0x006,0x006,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x060,0x0C0,0x0C0,0x0FC,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x006,0x006,0x00C,0x018,0x030,0x030,0x030,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x006,0x006,0x00C,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x018,0x018,0x030,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x006,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x006,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x060,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x060,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x00C,0x018,0x018,0x018,0x000,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0DE,0x0DE,0x0DE,0x0DC,0x0C0,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x0FF,0x066,0x066,0x066,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0FF,0x0C0,0x0C2,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F8,0x06C,0x066,0x066,0x066,0x0FF,0x066,0x066,0x06C,0x0F8,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x0FF,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x066,0x062,0x068,0x078,0x0FF,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0FF,0x0C6,0x0C6,0x066,0x03A,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0FE,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x00C,0x00C,0x00C,0x00C,0x0FF,0x0CC,0x0CC,0x0CC,0x078,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E6,0x066,0x06C,0x06C,0x078,0x0FF,0x06C,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0F0,0x060,0x060,0x060,0x060,0x0FF,0x060,0x062,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0EE,0x0FE,0x0FE,0x0D6,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0FF,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x0FF,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x0D6,0x0DE,0x07C,0x00C,0x00E,0x000,0x000, +0x000,0x000,0x0FC,0x066,0x066,0x066,0x07C,0x0FF,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x07C,0x0C6,0x0C6,0x060,0x038,0x0FF,0x006,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x07E,0x07E,0x05A,0x018,0x018,0x0FF,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0C6,0x06C,0x038,0x010,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0FF,0x0D6,0x0FE,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x06C,0x06C,0x038,0x0FF,0x06C,0x06C,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x066,0x066,0x03C,0x0FF,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x086,0x00C,0x018,0x0FF,0x060,0x0C2,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x030,0x030,0x030,0x030,0x0FF,0x030,0x030,0x030,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x080,0x0C0,0x0E0,0x070,0x0FF,0x01C,0x00E,0x006,0x002,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x00C,0x00C,0x00C,0x00C,0x0FF,0x00C,0x00C,0x00C,0x03C,0x000,0x000,0x000,0x000, +0x010,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000, +0x030,0x030,0x018,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x078,0x06C,0x066,0x066,0x066,0x066,0x0DC,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C0,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x00C,0x00C,0x03C,0x06C,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x0CC,0x078,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x06C,0x076,0x066,0x066,0x066,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x006,0x006,0x000,0x00E,0x006,0x006,0x006,0x006,0x006,0x006,0x066,0x066,0x03C,0x000, +0x000,0x000,0x0E0,0x060,0x060,0x066,0x06C,0x078,0x078,0x06C,0x066,0x0E6,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0EC,0x0FE,0x0D6,0x0D6,0x0D6,0x0D6,0x0D6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0F0,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x07C,0x00C,0x00C,0x01E,0x000, +0x000,0x000,0x000,0x000,0x000,0x0DC,0x076,0x062,0x060,0x060,0x060,0x0F0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07C,0x0C6,0x060,0x038,0x00C,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x010,0x030,0x030,0x0FC,0x030,0x030,0x030,0x030,0x036,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0D6,0x0D6,0x0FE,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x06C,0x038,0x038,0x038,0x06C,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x0F8,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x0CC,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x018,0x018,0x018,0x070,0x018,0x018,0x018,0x018,0x00E,0x000,0x000,0x000,0x000, +0x000,0x000,0x018,0x018,0x018,0x018,0x000,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x070,0x018,0x018,0x018,0x00E,0x018,0x018,0x018,0x018,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x010,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x03C,0x066,0x0C2,0x0C0,0x0C0,0x0C0,0x0C2,0x066,0x03C,0x00C,0x006,0x07C,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0CC,0x0CC,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x038,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x03C,0x066,0x060,0x060,0x066,0x03C,0x00C,0x006,0x03C,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0FE,0x0C0,0x0C0,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x03C,0x066,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x010,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x038,0x06C,0x038,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x018,0x030,0x060,0x000,0x0FE,0x066,0x060,0x07C,0x060,0x060,0x066,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x076,0x036,0x07E,0x0D8,0x0D8,0x06E,0x000,0x000,0x000,0x000, +0x000,0x000,0x03E,0x06C,0x0CC,0x0CC,0x0FE,0x0CC,0x0CC,0x0CC,0x0CC,0x0CE,0x000,0x000,0x000,0x000, +0x000,0x010,0x038,0x06C,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x030,0x078,0x0CC,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x060,0x030,0x018,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07E,0x006,0x00C,0x078,0x000, +0x000,0x0C6,0x0C6,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x0C6,0x0C6,0x000,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x018,0x03C,0x066,0x060,0x060,0x060,0x066,0x03C,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x064,0x060,0x0F0,0x060,0x060,0x060,0x060,0x0E6,0x0FC,0x000,0x000,0x000,0x000, +0x000,0x000,0x066,0x066,0x03C,0x018,0x07E,0x018,0x07E,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x0F8,0x0CC,0x0CC,0x0F8,0x0C4,0x0CC,0x0DE,0x0CC,0x0CC,0x0CC,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x00E,0x01B,0x018,0x018,0x018,0x07E,0x018,0x018,0x018,0x018,0x018,0x0D8,0x070,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x078,0x00C,0x07C,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x00C,0x018,0x030,0x000,0x038,0x018,0x018,0x018,0x018,0x018,0x03C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x018,0x030,0x060,0x000,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x0CC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x076,0x0DC,0x000,0x0DC,0x066,0x066,0x066,0x066,0x066,0x066,0x000,0x000,0x000,0x000, +0x076,0x0DC,0x000,0x0C6,0x0E6,0x0F6,0x0FE,0x0DE,0x0CE,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x03C,0x06C,0x06C,0x03E,0x000,0x07E,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x07C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x030,0x030,0x000,0x030,0x030,0x060,0x0C0,0x0C6,0x0C6,0x07C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x006,0x006,0x006,0x000,0x000,0x000,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x060,0x0CE,0x093,0x006,0x00C,0x01F,0x000,0x000, +0x000,0x0C0,0x0C0,0x0C2,0x0C6,0x0CC,0x018,0x030,0x066,0x0CE,0x09A,0x03F,0x006,0x00F,0x000,0x000, +0x000,0x000,0x018,0x018,0x000,0x018,0x018,0x018,0x03C,0x03C,0x03C,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0CC,0x066,0x033,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0CC,0x066,0x033,0x066,0x0CC,0x000,0x000,0x000,0x000,0x000,0x000, +0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044,0x011,0x044, +0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA,0x055,0x0AA, +0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077,0x0DD,0x077, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FE,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FE,0x006,0x0F6,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F6,0x006,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FE,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x0F8,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0F8,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x03F,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x037,0x030,0x037,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x0F7,0x000,0x0F7,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x000,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FF,0x000,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x03F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x018,0x018,0x018,0x018,0x018,0x01F,0x018,0x01F,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x03F,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x0FF,0x036,0x036,0x036,0x036,0x036,0x036,0x036,0x036, +0x018,0x018,0x018,0x018,0x018,0x0FF,0x018,0x0FF,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x01F,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF, +0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0,0x0F0, +0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F,0x00F, +0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x0FF,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x0D8,0x0D8,0x0D8,0x0DC,0x076,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x0FC,0x0C6,0x0FC,0x0C6,0x0C6,0x0FC,0x0C0,0x0C0,0x0C0,0x000,0x000, +0x000,0x000,0x0FE,0x0C6,0x0C6,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x080,0x0FE,0x06C,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x0FE,0x0C6,0x060,0x030,0x018,0x030,0x060,0x0C6,0x0FE,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0D8,0x0D8,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x066,0x066,0x066,0x066,0x066,0x07C,0x060,0x060,0x0C0,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x076,0x0DC,0x018,0x018,0x018,0x018,0x018,0x018,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07E,0x018,0x03C,0x066,0x066,0x066,0x03C,0x018,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0FE,0x0C6,0x0C6,0x06C,0x038,0x000,0x000,0x000,0x000, +0x000,0x000,0x038,0x06C,0x0C6,0x0C6,0x0C6,0x06C,0x06C,0x06C,0x06C,0x0EE,0x000,0x000,0x000,0x000, +0x000,0x000,0x01E,0x030,0x018,0x00C,0x03E,0x066,0x066,0x066,0x066,0x03C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x07E,0x0DB,0x0DB,0x0DB,0x07E,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x003,0x006,0x07E,0x0CF,0x0DB,0x0F3,0x07E,0x060,0x0C0,0x000,0x000,0x000,0x000, +0x000,0x000,0x01C,0x030,0x060,0x060,0x07C,0x060,0x060,0x060,0x030,0x01C,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x07C,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x0C6,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x0FE,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x07E,0x018,0x018,0x000,0x000,0x0FF,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x030,0x018,0x00C,0x006,0x00C,0x018,0x030,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x00C,0x018,0x030,0x060,0x030,0x018,0x00C,0x000,0x07E,0x000,0x000,0x000,0x000, +0x000,0x000,0x00E,0x01B,0x01B,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018, +0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x018,0x0D8,0x0D8,0x0D8,0x070,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x07E,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x076,0x0DC,0x000,0x076,0x0DC,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x038,0x06C,0x06C,0x038,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x018,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x00F,0x00C,0x00C,0x00C,0x00C,0x00C,0x0EC,0x06C,0x06C,0x03C,0x01C,0x000,0x000,0x000,0x000, +0x000,0x0D8,0x06C,0x06C,0x06C,0x06C,0x06C,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x070,0x098,0x030,0x060,0x0C8,0x0F8,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x07C,0x000,0x000,0x000,0x000,0x000, +0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000 +}; diff --git a/16/tauron30/C_SRC/MAINC.CPP b/16/tauron30/C_SRC/MAINC.CPP new file mode 100755 index 00000000..34a1247a --- /dev/null +++ b/16/tauron30/C_SRC/MAINC.CPP @@ -0,0 +1,181 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include +#include "tauron.h" + +void MainScreen() +{ + clrscr(); + printf("Tauron VGA Utilities v3.0\n" + "Copyright (c) 1998 Jeffrey Morgan. All Rights Reserved.\n"); + textcolor(12); + cprintf("Modes with a ! are not implemented Modes with a % are unchained\r\n"); + textcolor(7); + printf("Select a video mode to test:\n" + "Key Videomode Key Videomode\n" + "================================================================================" + " 0) 00H, 01H -- 40 x 25 x 16 %F) Mode D -- 360 x 200 x 256\n" + " 1) Mode L -- 40 x 43 x 16 %G) Mode E -- 360 x 240 x 256\n" + " 2) Mode M -- 40 x 50 x 16 %H) Mode F -- 360 x 350 x 256\n" + "!3) 07H -- 80 x 25 x 2 %I) Mode G -- 360 x 400 x 256\n" + " 4) 02H, 03H -- 80 x 25 x 16 %J) Mode H -- 360 x 480 x 256\n" + " 5) Mode J -- 80 x 43 x 16 K) 06H -- 640 x 200 x 2\n" + " 6) Mode K -- 80 x 50 x 16 !L) 0FH -- 640 x 350 x 2\n" + " 7) 04H, 05H -- 320 x 200 x 4 M) 11H -- 640 x 480 x 2\n" + " 8) 0DH -- 320 x 200 x 16 N) 0EH -- 640 x 200 x 16\n" + " 9) 13H -- 320 x 200 x 256 O) 10H -- 640 x 350 x 16\n" + "%A) Chain 4 -- 320 x 200 x 256 P) Mode I -- 640 x 400 x 16\n" + "%B) Mode X -- 320 x 240 x 256 Q) 12H -- 640 x 480 x 16\n" + "%C) Mode A -- 320 x 350 x 256\n" + "%D) Mode B -- 320 x 400 x 256 R) Dual Font Test\n" + "%E) Mode C -- 320 x 480 x 256\n" + "===============================================================================\n" + "Hit 'ESC' to exit. Press a key [0-9 or A-O]>"); +} + +void SetMode03h() +{ + asm MOV AX,0003H + asm INT 10H +} + +void main() +{ + int ok, key; + ok = 1; + MainScreen(); + while (ok) + { + if( (key = getch()) == 0 ) + key = 256 * getch(); + switch( key ) + { + case Escape : ok = 0; break; + + case '0' : + SetVideoMode(MODE00H); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '1': + SetVideoMode(MODE_L); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '2': + SetVideoMode(MODE_M); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '4' : + SetVideoMode(MODE03H); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '5': + SetVideoMode(MODE_J); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '6': + SetVideoMode(MODE_K); TextTest(); getch(); + SetMode03h(); MainScreen(); break; + + case '7': + SetVideoMode(MODE04H); Clear04H(); getch(); + SetMode03h(); MainScreen(); break; + + case '8' : + SetVideoMode(MODE0DH); Clear0DH(12); /*ModeTest();*/ getch(); + SetMode03h(); MainScreen(); break; + + case '9': + SetVideoMode(MODE13H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'a': case 'A': + SetVideoMode(CHAIN4); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'b': case 'B': + SetVideoMode(MODE_X); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'c': case 'C': + SetVideoMode(MODE_A); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'd': case 'D': + SetVideoMode(MODE_B); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'e': case 'E': + SetVideoMode(MODE_C); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'f': case 'F': + SetVideoMode(MODE_D); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'g': case 'G': + SetVideoMode(MODE_E); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'h': case 'H': + SetVideoMode(MODE_F); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'i': case 'I': + SetVideoMode(MODE_G); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'j': case 'J': + SetVideoMode(MODE_H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'k': case 'K': + SetVideoMode(MODE06H); Clear06H(); getch(); + SetMode03h(); MainScreen(); break; + + case 'm': case 'M': + SetVideoMode(MODE11H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'n': case 'N': + SetVideoMode(MODE0EH); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'o': case 'O': + SetVideoMode(MODE10H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'p': case 'P': + SetVideoMode(MODE_I); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'q': case 'Q': + SetVideoMode(MODE12H); ModeTest(); getch(); + SetMode03h(); MainScreen(); break; + + case 'r': case 'R': + SetVideoMode(MODE03H); DualTest(); + SetMode03h(); MainScreen(); break; + + default : break; + } + } + asm MOV AX,0003h + asm int 10h +} diff --git a/16/tauron30/C_SRC/MODES.CPP b/16/tauron30/C_SRC/MODES.CPP new file mode 100755 index 00000000..72e11c94 --- /dev/null +++ b/16/tauron30/C_SRC/MODES.CPP @@ -0,0 +1,833 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include +#include "tauron.h" +#include "modes_c.inc" +#include "palette.inc" + +void setpalette4(); +void setpalette16(); +void setpalette256(); +Vmode Mode; + +#define SEQ_ADDR 0x03C4 +#define GRACON_ADDR 0x03CE +#define CRTC_ADDR 0x03D4 + +void ReadBIOSfont(int fontnum, int bytesperchar) +{ + char far *biosfont,*vidmem; + struct REGPACK reg; + unsigned char oldmode,oldmisc,oldmem,oldmask; + unsigned char newmode,newmisc,newmem; + + // get the location of the font stroed in BIOS + reg.r_ax = 0x1130; + reg.r_bx = fontnum << 8; + intr(0x10, ®); + + // Make a pointer to the font + biosfont = (char far *)MK_FP( reg.r_es, reg.r_bp); + vidmem = (char far *)MK_FP( 0xA000, 0x0000); + + // Store the OLD 'Mode Register' value + outportb(GRACON_ADDR,5); + oldmode = inportb(GRACON_ADDR+1); + // Store the OLD 'Miscellaneous Register' value + outportb(GRACON_ADDR,6); + oldmisc = inportb(GRACON_ADDR+1); + // Store the OLD 'Mask Map' value + outportb(SEQ_ADDR,2); + oldmask = inportb(SEQ_ADDR+1); + // Store the OLD 'Memory Mode' value + outportb(SEQ_ADDR,4); + oldmem = inportb(SEQ_ADDR+1); + + // Write the NEW 'Mode Register' value + newmode = (oldmode & 0xFC); + outport(GRACON_ADDR, (newmode << 8) | 0x05); + // Write the NEW 'Miscellaneous Register' value + newmisc = ((oldmisc & 0xF1)|4); + outport(GRACON_ADDR, (newmisc << 8) | 0x06); + // Write the NEW 'Mask Map' value + outport(SEQ_ADDR, 0x0402); + // Write the NEW 'Memory Mode' value + newmem = (oldmem | 4); + outport(SEQ_ADDR, (newmem << 8) | 0x04); + + // Copy the font from BIOS + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < bytesperchar; j++) + { + *vidmem++ = *biosfont++; + } + for (int k = 0; k < 32-bytesperchar; k++) + { + *vidmem++ = 0x00; + } + } + + // Write the OLD 'Mode Register' value + outport(GRACON_ADDR, (oldmode << 8) | 0x05); + // Write the OLD 'Miscellaneous Register' value + outport(GRACON_ADDR, (oldmisc << 8) | 0x06); + // Write the OLD 'Mask Map' value + outport(SEQ_ADDR,(oldmask << 8) | 0x02); + // Write the OLD 'Memory Mode' value + outport(SEQ_ADDR, (oldmem << 8) | 0x04); +} + +void SetMode(unsigned int regs) +{ + asm { + MOV SI, regs + + // Send MISC regs + MOV DX,MISC_ADDR + MOV AL,[SI] + OUT DX,AL + INC SI + + MOV DX,STATUS_ADDR + MOV AL,[SI] + OUT DX,AL + INC SI + + // Send SEQ regs + MOV CX,0 +REG_LOOP: + MOV DX,SEQ_ADDR + MOV AL,CL + OUT DX,AL + + MOV DX,SEQ_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,5 + JL REG_LOOP + + // Clear Protection bits + MOV AH,0EH + MOV AL,11H + AND AH,7FH + MOV DX,CRTC_ADDR + OUT DX,AX + + // Send CRTC regs + MOV CX,0 +REG_LOOP2: + MOV DX,CRTC_ADDR + MOV AL,CL + OUT DX,AL + + MOV DX,CRTC_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,25 + JL REG_LOOP2 + + // Send GRAPHICS regs + MOV CX,0 +REG_LOOP3: + MOV DX,GRACON_ADDR + MOV AL,CL + OUT DX,AL + + MOV DX,GRACON_ADDR + INC DX + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,9 + JL REG_LOOP3 + + MOV DX,STATUS_ADDR + IN AL,DX + + // Send ATTRCON regs + MOV CX,0 +REG_LOOP4: + MOV DX,ATTRCON_ADDR + IN AX,DX + + MOV AL,CL + OUT DX,AL + + MOV AL,[SI] + OUT DX,AL + + INC SI + INC CX + CMP CL,21 + JL REG_LOOP4 + + MOV AL,20H + OUT DX,AL + } +} + +void SetVideoMode(int mode) +{ + Mode.mode = mode; + if (mode == MODE00H) // 40 x 25 x 16 + { + SetMode((unsigned int)&mode00h); + setpalette16(); + ReadBIOSfont(6,16); + + Mode.width = 40; + Mode.height = 25; + Mode.width_bytes = 1000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE03H) // 80 x 25 x 16 + { + SetMode((unsigned int)&mode03h); + setpalette16(); + ReadBIOSfont(6,16); + + Mode.width = 80; + Mode.height = 25; + Mode.width_bytes = 2000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE04H) // 320 x 200 x 4 + { + SetMode((unsigned int)&mode04h); + setpalette4(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 8192; + Mode.colors = 4; + Mode.attrib = TVU_GRAPHICS; + } + else if (mode == MODE06H) // 640 x 200 x 2 + { + SetMode((unsigned int)&mode06h); + + Mode.width = 640; + Mode.height = 200; + Mode.width_bytes = 8192; + Mode.colors = 2; + Mode.attrib = TVU_GRAPHICS; + } + else if (mode == MODE07H) // 80 x 25 x 2 + { + SetMode((unsigned int)&mode07h); + + Mode.width = 80; + Mode.height = 25; + Mode.width_bytes = 2000; + Mode.colors = 2; + Mode.attrib = TVU_TEXT | TVU_MONOCHROME; + } + else if (mode == MODE0DH) // 320 x 200 x 16 + { + SetMode((unsigned int)&mode0Dh); + setpalette16(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 8000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE0EH) // 640 x 200 x 16 + { + SetMode((unsigned int)&mode0Eh); + setpalette16(); + + Mode.width = 640; + Mode.height = 200; + Mode.width_bytes = 16000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE0FH) // 640 x 350 x 2 + { + SetMode((unsigned int)&mode0Fh); + + Mode.width = 640; + Mode.height = 350; + Mode.width_bytes = 28000; + Mode.colors = 2; + Mode.attrib = TVU_GRAPHICS | TVU_MONOCHROME; + } + else if (mode == MODE10H) // 640 x 350 x 16 + { + SetMode((unsigned int)&mode10h); + setpalette16(); + + Mode.width = 640; + Mode.height = 350; + Mode.width_bytes = 28000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE11H) // 640 x 480 x 2 + { + SetMode((unsigned int)&mode11h); + + Mode.width = 640; + Mode.height = 480; + Mode.width_bytes = 38400u; + Mode.colors = 2; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE12H) // 640 x 480 x 16 + { + SetMode((unsigned int)&mode12h); + setpalette16(); + + Mode.width = 640; + Mode.height = 480; + Mode.width_bytes = 38400u; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE13H) // 320 x 200 x 256 + { + SetMode((unsigned int)&mode13h); + setpalette256(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 64000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS; + } + else if (mode == CHAIN4) // unchained 320 x 200 x 256 + { + SetMode((unsigned int)&modeC4); + setpalette256(); + + Mode.width = 320; + Mode.height = 200; + Mode.width_bytes = 16000; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_X) // unchained 320 x 240 x 256 + { + SetMode((unsigned int)&modeC4); + + outportb(MISC_ADDR,0xE3); + // turn off write protect + outport(CRTC_ADDR,0x2C11); + // vertical total + outport(CRTC_ADDR,0x0D06); + // overflow register + outport(CRTC_ADDR,0x3E07); + // vertical retrace start + outport(CRTC_ADDR,0xEA10); + // vertical retrace end AND wr.prot + outport(CRTC_ADDR,0xAC11); + // vertical display enable end + outport(CRTC_ADDR,0xDF12); + // start vertical blanking + outport(CRTC_ADDR,0xE715); + // end vertical blanking + outport(CRTC_ADDR,0x0616); + + setpalette256(); + Mode.width = 320; + Mode.height = 240; + Mode.width_bytes = 19200; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_A) // unchained 320 x 350 x 256 + { + SetMode((unsigned int)&modeC4); + + // turn off double scanning mode + outportb(CRTC_ADDR,9); + outportb(CRTC_ADDR+1,inportb(CRTC_ADDR+1) & ~0x1F); + // change the vertical resolution flags to 350 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x80); + // turn off write protect + outport(CRTC_ADDR,0x2C11); + // vertical total + outport(CRTC_ADDR,0xBF06); + // overflow register + outport(CRTC_ADDR,0x1F07); + // vertical retrace start + outport(CRTC_ADDR,0x8310); + // vertical retrace end AND wr.prot + outport(CRTC_ADDR,0x8511); + // vertical display enable end + outport(CRTC_ADDR,0x5D12); + // start vertical blanking + outport(CRTC_ADDR,0x6315); + // end vertical blanking + outport(CRTC_ADDR,0xBA16); + + setpalette256(); + Mode.width = 320; + Mode.height = 350; + Mode.width_bytes = 28000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_B) // unchained 320 x 400 x 256 + { + SetMode((unsigned int)&modeC4); + // turn off double scanning mode + outportb(CRTC_ADDR,9); + outportb(CRTC_ADDR+1,inportb(CRTC_ADDR+1) & ~0x1F); + // change the vertical resolution flags to 400 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x40); + + setpalette256(); + Mode.width = 320; + Mode.height = 400; + Mode.width_bytes = 32000; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_C) // unchained 320 x 480 x 256 + { + SetMode((unsigned int)&modeC4); + + // turn off double scanning mode + outportb(CRTC_ADDR,9); + outportb(CRTC_ADDR+1,inportb(CRTC_ADDR+1) & ~0x1F); + // change the vertical resolution flags to 480 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0xC0); + // turn off write protect + outport(CRTC_ADDR,0x2C11); + // vertical total + outport(CRTC_ADDR,0x0D06); + // overflow register + outport(CRTC_ADDR,0x3E07); + // vertical retrace start + outport(CRTC_ADDR,0xEA10); + // vertical retrace end AND wr.prot + outport(CRTC_ADDR,0xAC11); + // vertical display enable end + outport(CRTC_ADDR,0xDF12); + // start vertical blanking + outport(CRTC_ADDR,0xE715); + // end vertical blanking + outport(CRTC_ADDR,0x0616); + + setpalette256(); + Mode.width = 320; + Mode.height = 480; + Mode.width_bytes = 38400u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_D) // unchained 360 x 200 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 400 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x40); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0xC009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 200; + Mode.width_bytes = 18000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_E) // unchained 360 x 240 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 480 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0xC0); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0D06); + outport(CRTC_ADDR,0x3E07); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0xC009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xEA10); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0xDF12); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE715); + outport(CRTC_ADDR,0x0616); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 240; + Mode.width_bytes = 21600; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_F) // unchained 360 x 350 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 350 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x80); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0xBF06); + outport(CRTC_ADDR,0x1F07); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0x4009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0x8310); + outport(CRTC_ADDR,0x8511); + outport(CRTC_ADDR,0x5D12); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0x6315); + outport(CRTC_ADDR,0xBA16); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 350; + Mode.width_bytes = 31500; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_G) // unchained 360 x 400 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 400 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0x40); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0x4009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 400; + Mode.width_bytes = 36000u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_H) // unchained 360 x 480 x 256 + { + SetMode((unsigned int)&mode13h); + + // Turn off Chain 4 + outport(SEQ_ADDR,0x0604); + // Activate a synchronous reset + outport(SEQ_ADDR,0x0100); + // Select 28 mhz pixel clock + outportb(MISC_ADDR,0xE7); + // Release synchronous reset + outport(SEQ_ADDR,0x0300); + + // change the vertical resolution flags to 480 + outportb(MISC_ADDR,(inportb(0x3CC) & ~0xC0) | 0xC0); + + // turn off write protect + outport(CRTC_ADDR,0x2C11); + + outport(CRTC_ADDR,0x6B00); + outport(CRTC_ADDR,0x5901); + outport(CRTC_ADDR,0x5A02); + outport(CRTC_ADDR,0x8E03); + outport(CRTC_ADDR,0x5E04); + outport(CRTC_ADDR,0x8A05); + outport(CRTC_ADDR,0x0D06); + outport(CRTC_ADDR,0x3E07); + outport(CRTC_ADDR,0x0008); + outport(CRTC_ADDR,0x4009); + outport(CRTC_ADDR,0x000A); + outport(CRTC_ADDR,0x000B); + outport(CRTC_ADDR,0x000C); + outport(CRTC_ADDR,0x000D); + outport(CRTC_ADDR,0x000E); + outport(CRTC_ADDR,0x000F); + outport(CRTC_ADDR,0xEA10); + outport(CRTC_ADDR,0xAC11); + outport(CRTC_ADDR,0xDF12); + outport(CRTC_ADDR,0x2D13); + outport(CRTC_ADDR,0x0014); + outport(CRTC_ADDR,0xE715); + outport(CRTC_ADDR,0x0616); + outport(CRTC_ADDR,0xE317); + outport(CRTC_ADDR,0xFF18); + + setpalette256(); + Mode.width = 360; + Mode.height = 480; + Mode.width_bytes = 43200u; + Mode.colors = 256; + Mode.attrib = TVU_GRAPHICS | TVU_UNCHAINED; + } + else if (mode == MODE_I) // 640 x 400 x 16 + { + SetMode((unsigned int)&mode10h); + asm { + + MOV DX,03CCH + IN AL,DX + AND AL,03FH + OR AL,40H + + MOV DX,03C2H + OUT DX,AL + + MOV DX,CRTC_ADDR + MOV AX,9C10H + OUT DX,AX + + MOV AX,8311H + OUT DX,AX + + MOV AX,8F12H + OUT DX,AX + + MOV AX,9615H + OUT DX,AX + + MOV AX,0B916H + OUT DX,AX + } + setpalette16(); + Mode.width = 640; + Mode.height = 400; + Mode.width_bytes = 32000; + Mode.colors = 16; + Mode.attrib = TVU_GRAPHICS | TVU_PLANAR; + } + else if (mode == MODE_J) // 80 x 43 x 16 + { + SetMode((unsigned int)&modeJ); + ReadBIOSfont(3,8); + + Mode.width = 80; + Mode.height = 43; + Mode.width_bytes = 3440; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE_K) // 80 x 50 x 16 + { + SetMode((unsigned int)&modeK); + ReadBIOSfont(3,8); + + Mode.width = 80; + Mode.height = 50; + Mode.width_bytes = 4000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE_L) // 40 x 43 x 16 + { + SetMode((unsigned int)&modeL); + ReadBIOSfont(3,8); + + Mode.width = 40; + Mode.height = 43; + Mode.width_bytes = 4000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } + else if (mode == MODE_M) // 40 x 50 x 16 + { + SetMode((unsigned int)&modeM); + ReadBIOSfont(3,8); + + Mode.width = 40; + Mode.height = 50; + Mode.width_bytes = 4000; + Mode.colors = 16; + Mode.attrib = TVU_TEXT; + } +} + +void setpal(int color, char r, char g, char b) +{ + asm { + // Send color + MOV AX,color + MOV DX,03C8H + OUT DX,AL + + // Write R value + MOV DX,03C9H + MOV AL,r + OUT DX,AL + + // Write G value + MOV DX,03C9H + MOV AL,g + OUT DX,AL + + // Write B value + MOV DX,03C9H + MOV AL,b + OUT DX,AL + } +} + +void setpalette4() +{ + setpal( 0, 0, 0, 0); + setpal( 1, 0, 42, 42); + setpal( 2, 42, 0, 42); + setpal( 3, 63, 63, 63); +} + +void setpalette16() +{ + int j = 0; + for (int i = 0; i < 48; i+=3) + { + setpal(j, Pal[i], Pal[i+1], Pal[i+2]); + j++; + } +} + +void setpalette256() +{ + int j = 0; + for (int i = 0; i < 768; i+=3) + { + setpal(j, Pal[i], Pal[i+1], Pal[i+2]); + j++; + } +} diff --git a/16/tauron30/C_SRC/MODES_C.INC b/16/tauron30/C_SRC/MODES_C.INC new file mode 100755 index 00000000..585af88d --- /dev/null +++ b/16/tauron30/C_SRC/MODES_C.INC @@ -0,0 +1,262 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- VGA register variables for the various videomodes -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +// Same as Mode 01H +unsigned char mode00h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x67, 0x00, 0x03,0x08,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0xA0,0xBF,0x1F,0x00,0x4F,0x06,0x07,0x00,0x00,0x00, +0x31,0x9C,0x8E,0x8F,0x14,0x1F,0x96,0xB9,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x08,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +// Same as Mode 02H +unsigned char mode03h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x67, 0x00, 0x03,0x00,0x03,0x00,0x02, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4F,0x0E,0x0F,0x00,0x00,0x00, +0x00,0x9C,0x0E,0x8F,0x28,0x01,0x96,0xB9,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x08,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +// Same as Mode 05, +unsigned char mode04h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x09,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x80,0x0BF,0x1F,0x00,0x0C1,0x00,0x00,0x00,0x00,0x00, +0x31,0x9C,0x8E,0x8F,0x14,0x00,0x96,0xB9,0x0A2,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x30,0x0F,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x3B,0x3D,0x3F,0x02,0x04,0x06,0x07,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x01,0x00,0x03,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode06h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x01,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x0C1,0x00,0x00,0x00,0x00,0x00, +0x00,0x9C,0x8E,0x8F,0x28,0x00,0x96,0xB9,0x0C2,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, +0x01,0x00,0x01,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode07h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x066, 0x00, 0x03,0x00,0x03,0x00,0x02, +// CRTC regs +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x0E,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode0Dh[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x063, 0x00, 0x03,0x09,0x0F,0x00,0x06, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x80,0x0BF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00, +0x31,0x9C,0x8E,0x8F,0x14,0x00,0x96,0xB9,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode0Eh[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0xC0,0x00,0x00,0x00,0x00,0x00, +0x59,0x9C,0x8E,0x8F,0x28,0x00,0x96,0xB9,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x08,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode0Fh[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x0A2, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x08,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00, +0x0B,0x00,0x05,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode10h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x0A3, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x40,0x00,0x00,0x00,0x00,0x00, +0x00,0x83,0x85,0x5D,0x28,0x0F,0x63,0x0BA,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode11h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0xE3, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x59, +0xEA,0x8C,0x0DF,0x28,0x0F,0x0E7,0x004,0x0C3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x08,0x3F,0x3F,0x18,0x18,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, +0x01,0x00,0x0F,0x00,0x00 + +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode12h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0xE3, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x59, +0xEA,0x8C,0x0DF,0x28,0x00,0x0E7,0x04,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x01,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char mode13h[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x0F,0x00,0x0E, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00, +0x00,0x9C,0x0E,0x8F,0x28,0x40,0x96,0xB9,0x0A3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x41,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeC4[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x0F,0x00,0x06, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x54,0x80,0x0BF,0x1F,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00, +0x9C,0x0E,0x8F,0x28,0x00,0x96,0xB9,0xE3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x40,0x05,0x0F,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x41,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeJ[62] = { +// MISC reg, STATUS reg, SEQ regs + 0xa3, 0x00, 0x03,0x01,0x03,0x00,0x02, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x47,0x0E,0x0F,0x00,0x00,0x00, +0x00,0x83,0x85,0x57,0x28,0x1F,0x60,0xB8,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeK[62] = { +// MISC reg, STATUS reg, SEQ regs + 0x63, 0x00, 0x03,0x01,0x03,0x00,0x02, +// CRTC regs +0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x47,0x0E,0x0F,0x00,0x00,0x00, +0x00,0x9C,0x8E,0x8F,0x28,0x1F,0x96,0xB9,0xA3,0xFF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0xFF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00 +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +unsigned char modeL[62] = { +// MISC reg, STATUS reg, SEQ regs +0x67,0x00,0x03,0x08,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x0A0,0x0BF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00, +0x31,0x83,0x85,0x57,0x14,0x1F,0x60,0x0B8,0x0A3,0x0FF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0x0FF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x10,0x11,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00, +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +unsigned char modeM[62] = { +// MISC reg, STATUS reg, SEQ regs +0x67,0x00,0x03,0x08,0x03,0x00,0x02, +// CRTC regs +0x2D,0x27,0x28,0x90,0x2B,0x0A0,0x0BF,0x1F,0x00,0x47,0x06,0x07,0x00,0x00,0x00,0x31, +0x9C,0x8E,0x8F,0x14,0x1F,0x96,0x0B9,0x0A3,0x0FF, +// GRAPHICS regs +0x00,0x00,0x00,0x00,0x00,0x10,0x0E,0x00,0x0FF, +// ATTRIBUTE CONTROLLER regs +0x00,0x01,0x02,0x03,0x04,0x05,0x14,0x07,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, +0x0C,0x00,0x0F,0x00,0x00, +}; +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/C_SRC/PALETTE.INC b/16/tauron30/C_SRC/PALETTE.INC new file mode 100755 index 00000000..a89ce796 --- /dev/null +++ b/16/tauron30/C_SRC/PALETTE.INC @@ -0,0 +1,62 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +char Pal[768] = { + 0, 0, 0, 0, 0, 42, 0, 42, 0, 0, 42, 42, 42, 0, 0, 42, 0, 42, +42, 21, 0, 42, 42, 42, 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63, +63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63, 0, 0, 0, 5, 5, 5, + 8, 8, 8, 11, 11, 11, 14, 14, 14, 17, 17, 17, 20, 20, 20, 24, 24, 24, +28, 28, 28, 32, 32, 32, 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50, +56, 56, 56, 63, 63, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63, +63, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0, 0, 63, 16, 0, +63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63, 0, 31, 63, 0, 16, 63, 0, + 0, 63, 0, 0, 63, 16, 0, 63, 31, 0, 63, 47, 0, 63, 63, 0, 47, 63, + 0, 31, 63, 0, 16, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, +63, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, 31, 63, 39, 31, +63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, +31, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, +31, 47, 63, 31, 39, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, +63, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, 45, 63, 49, 45, +63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, +45, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, +45, 54, 63, 45, 49, 63, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28, +28, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0, 0, 28, 7, 0, +28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28, 0, 14, 28, 0, 7, 28, 0, + 0, 28, 0, 0, 28, 7, 0, 28, 14, 0, 28, 21, 0, 28, 28, 0, 21, 28, + 0, 14, 28, 0, 7, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, +28, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, 14, 28, 17, 14, +28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, +14, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, +14, 21, 28, 14, 17, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, +28, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, 20, 28, 22, 20, +28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, +20, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, +20, 24, 28, 20, 22, 28, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16, +16, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0, 0, 16, 4, 0, +16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16, 0, 8, 16, 0, 4, 16, 0, + 0, 16, 0, 0, 16, 4, 0, 16, 8, 0, 16, 12, 0, 16, 16, 0, 12, 16, + 0, 8, 16, 0, 4, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16, +16, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8, 8, 16, 10, 8, +16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16, 8, 12, 16, 8, 10, 16, 8, + 8, 16, 8, 8, 16, 10, 8, 16, 12, 8, 16, 14, 8, 16, 16, 8, 14, 16, + 8, 12, 16, 8, 10, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, +16, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, 11, 16, 12, 11, +16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, +11, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, +11, 13, 16, 11, 12, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 63, 63 +}; diff --git a/16/tauron30/C_SRC/TAURON.H b/16/tauron30/C_SRC/TAURON.H new file mode 100755 index 00000000..f14f3120 --- /dev/null +++ b/16/tauron30/C_SRC/TAURON.H @@ -0,0 +1,105 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#ifndef __TAURON_H__ +#define __TAURON_H__ + +// VGA register port addresses +#define ATTRCON_ADDR 0x03C0 +#define MISC_ADDR 0x03C2 +#define VGAENABLE_ADDR 0x03C3 +#define SEQ_ADDR 0x03C4 +#define GRACON_ADDR 0x03CE +#define CRTC_ADDR 0x03D4 +#define STATUS_ADDR 0x03DA + +// Video mode numbers +#define MODE00H 0x00 +#define MODE01H 0x00 +#define MODE02H 0x03 +#define MODE03H 0x03 +#define MODE04H 0x04 +#define MODE05H 0x05 +#define MODE06H 0x06 +#define MODE07H 0x07 +#define MODE0DH 0x0D +#define MODE0EH 0x0E +#define MODE0FH 0x0F +#define MODE10H 0x10 +#define MODE11H 0x11 +#define MODE12H 0x12 +#define MODE13H 0x13 +#define CHAIN4 0x14 +#define MODE_X 0x15 +#define MODE_A 0x16 +#define MODE_B 0x17 +#define MODE_C 0x18 +#define MODE_D 0x19 +#define MODE_E 0x1A +#define MODE_F 0x1B +#define MODE_G 0x1C +#define MODE_H 0x1D +#define MODE_I 0x1E +#define MODE_J 0x1F +#define MODE_K 0x20 +#define MODE_L 0x21 +#define MODE_M 0x22 + +// Keypresses +#define Escape 0x001b + +// Videomode attributes +#define TVU_TEXT 0x0001 +#define TVU_GRAPHICS 0x0002 +#define TVU_MONOCHROME 0x0004 +#define TVU_PLANAR 0x0008 +#define TVU_UNCHAINED 0x0010 + +// Videomode Info Structure +struct Vmode { + int mode; // Videomode Number + int width; // Width in pixels + int height; // Height in pixels + unsigned int width_bytes; // Number of bytes per screen + int colors; // Number of colors + int attrib; // Videomode attributes +}; + +extern Vmode Mode; + +// MODES.CPP Function Prototypes +void SetVideoMode(int mode); +void ReadBIOSfont(int fontnum, int bytesperchar); +void SetMode(unsigned int regs); +void setpal(int color, char r, char g, char b); + +// CLEAR.CPP Function Prototypes +void TextClear(char attrib); +void PlanarClear(char Color); +void UnchainedClear(char Color); +void Clear13H(char color); +void Clear04H(); +void Clear06H(); +void Clear0DH(char color); + +// TESTS.CPP Function Prototypes +void ModeTest(); +void TextTest(); + +// DUAL.CPP Function Prototypes +void DualTest(); + +#endif \ No newline at end of file diff --git a/16/tauron30/C_SRC/TESTS.CPP b/16/tauron30/C_SRC/TESTS.CPP new file mode 100755 index 00000000..e89084fd --- /dev/null +++ b/16/tauron30/C_SRC/TESTS.CPP @@ -0,0 +1,376 @@ +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- -= +//=- Tauron VGA Utilities Version 3.0 -= +//=- Released September 20, 1998 -= +//=- -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +//=- All Rights Reserved. =-= that you put my name some- -= +//=- =-= where in your credits. -= +//=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +//=- I assume no responsibility whatsoever for any effect that this package, -= +//=- the information contained therein or the use thereof has on you, your -= +//=- sanity, computer, spouse, children, pets or anything else related to -= +//=- you or your existance. No warranty is provided nor implied with this -= +//=- source code. -= +//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include +#include +#include +#include "tauron.h" +#define ABS(a) ((a < 0) ? -a : a) +#define SGN(a) ((a < 0) ? -1 : 1) + +void Pixel13H(int x, int y, char color) +{ + int width = Mode.width; + asm { + MOV AX,0A000H // video memory segment number + MOV ES,AX // place it in es + + MOV DX,03C4H + MOV AL,2 + OUT DX,AL + INC DX + + MOV AL,1 + MOV CX,x + AND CX,3 + SHL AL,CL + OUT DX,AL + + XOR DI,DI + +// Calculate the Offset + mov ax,width // width + mul y // (Y * width)) + mov bx,x // (X + (Y * width)) + add ax,bx +// Done! + + ADD DI,AX + mov ah,color // move the Color into ah + mov es:[di],ah // move the value to the screen + } +} + +void pixel(int x, int y, char color) +{ + int width = Mode.width; + if (Mode.mode == MODE13H) + Pixel13H(x,y,color); + else if (Mode.attrib & TVU_UNCHAINED) { + asm { + MOV AX,0A000H // video memory segment number + MOV ES,AX // place it in es + + MOV DX,03C4H + MOV AL,2 + OUT DX,AL + INC DX + + MOV AL,1 + MOV CX,x + AND CX,3 + SHL AL,CL + OUT DX,AL + + XOR DI,DI + +// Calculate the Offset + mov ax,width // width / 4 + SHR AX,2 + mul y // (Y * (width / 4)) + mov bx,x // (X / 4) + (Y * (width / 4)) + shr bx,2 + add ax,bx +// Done! + + ADD DI,AX + mov ah,color // move the Color into ah + mov es:[di],ah // move the value to the screen + }} + else if (Mode.attrib & TVU_PLANAR) + { + asm { + MOV AX,0A000H // video memory segment number + MOV ES,AX // place it in es + + MOV BX,x // X Value + MOV CX,BX + MOV AX,y // Y Value + MOV SI,80 + MUL SI + SHR BX,3 // /8 + ADD AX,BX + MOV DI,AX + + AND CL,7 + XOR CL,7 + MOV AH,1 + + SHL AH,CL + + MOV DX,03CEH + MOV AL,8 + OUT DX,AX + + MOV AL,0 + XCHG ES:[DI],AL + + MOV DX,03C4H + MOV AH,color + MOV AL,2 + OUT DX,AX + + MOV BYTE PTR ES:[DI],0FFh + + MOV AX,0F02H + OUT DX,AX + + MOV DX,03CEH + MOV AX,0FF08h + OUT DX,AX + }} +} + +// This is Bresenham's Line Drawing Algorithm +void drawline(int x1, int y1, int x2, int y2, char col) +{ + int d, x, y, ax, ay, sx, sy, dx, dy; + + dx = x2-x1; + ax = ABS(dx) << 1; + sx = SGN(dx); + dy = y2-y1; + ay = ABS(dy) << 1; + sy = SGN(dy); + + x = x1; + y = y1; + if( ax > ay ) + { + d = ay - (ax >> 1); + while( x != x2 ) + { + pixel( x, y, col ); + if( d >= 0 ) + { + y += sy; + d -= ax; + } + x += sx; + d += ay; + } + } + else + { + d = ax - (ay >> 1); + while( y != y2 ) + { + pixel( x, y, col ); + if( d >= 0 ) + { + x += sx; + d -= ay; + } + y += sy; + d += ax; + } + } + return; +} + +void drawrect(int x1, int y1, int x2, int y2, char color) +{ + drawline(x1,y1,x2,y1,color); + drawline(x1,y2,x2,y2,color); + drawline(x1,y1,x1,y2,color); + drawline(x2,y1,x2,y2+1,color); +} + +void hline(int x1, int x2, int y, char color) +{ + drawline(x1,y,x2,y,color); +} + +void vline(int y1, int y2, int x, char color) +{ + drawline(x,y1,x,y2,color); +} + +void fillrect(int x1, int y1, int x2, int y2, char color) +{ + for (int i = y1; i < y2; i++) + hline(x1,x2,i,color); +} + +void ModeTest() +{ + if (Mode.mode == MODE13H) + { + Clear13H(0); + } + else if (Mode.attrib & TVU_PLANAR) + { + PlanarClear(0); + } + else if (Mode.attrib & TVU_UNCHAINED) + { + UnchainedClear(0); + } + + /* Print mode stats + * + */ + + drawrect(0,0,Mode.width-1,Mode.height-1,15); + for (int i = 50; i < Mode.height; i += 100) + { + hline(0,10,i,15); + hline(0,25,i+50,15); + } + + for (int i = 40; i < Mode.width; i += 80) + { + vline(0,15,i,15); + vline(0,30,i+40,15); + } + + if (Mode.colors == 2) + { + int x,y; + x = Mode.width - 420; + y = Mode.height - 220; + fillrect(x,y,x+200,y+200,0); + x+=200; + fillrect(x,y,x+200,y+200,15); + drawrect(x-200,y,x+200,y+200,15); + } + else if (Mode.colors == 16) + { + int x,y; + x = Mode.width - 522; + y = Mode.height - 135; + for (int i = 0; i < 8; i++) + { + fillrect(x,y,x+64,y+64,i); + x+=64; + } + x = Mode.width - 522; + y += 64; + for (int i = 8; i < 16; i++) + { + fillrect(x,y,x+64,y+64,i); + x+=64; + } + drawrect(x-512,y-64,x,y+64,15); + } + else if (Mode.colors == 256) + { + int x,y,k; + x = Mode.width - 165; + y = Mode.height - 165; + k = 0; + for (int i = 0; i < 16; i++) + { + for (int j = 0; j < 16; j++) + { + fillrect(x,y,x+10,y+10,k); + x+=10; + k++; + } + x = Mode.width - 165; + y += 10; + } + drawrect(Mode.width - 165,Mode.height - 165,Mode.width -5,Mode.height - 5,15); + } +} + +void TextTest() +{ + TextClear(0x1F); + gotoxy(1,1); + if (Mode.mode == MODE00H) + { + // ** NOTE ** the gotoxy's here are a hack so that i could use the + // standard C functions to program this mode. Normally you would just + // calculate the proper address and display the text but since DOS still + // thinks we are in mode 03h (it checks the BIOS), this is necessary. + gotoxy(1,1); + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + gotoxy(41,1); + printf("³Text Mode: 00H ³\n"); + gotoxy(1,2); + printf("³Width: 40 Height: 25³\n"); + gotoxy(41,2); + printf("³Bytes per screen: 2000³\n"); + gotoxy(1,3); + printf("³Number of pages: 8 ³\n"); + gotoxy(41,3); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE03H) + { + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + printf("³Text Mode: 03H ³\n"); + printf("³Width: 80 Height: 25³\n"); + printf("³Bytes per screen: 4000³\n"); + printf("³Number of pages: 8 ³\n"); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_J) + { + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + printf("³Text Mode K ³\n"); + printf("³Width: 80 Height: 43³\n"); + printf("³Bytes per screen: 3440³\n"); + printf("³Number of pages: 8 ³\n"); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_K) + { + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + printf("³Text Mode K ³\n"); + printf("³Width: 80 Height: 50³\n"); + printf("³Bytes per screen: 4000³\n"); + printf("³Number of pages: 8 ³\n"); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_L) + { + // ** NOTE ** the gotoxy's here are a hack so that i could use the + // standard C functions to program this mode. Normally you would just + // calculate the proper address and display the text but since DOS still + // thinks we are in mode 03h (it checks the BIOS), this is necessary. + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + gotoxy(41,1); + printf("³Text Mode L ³\n"); + gotoxy(1,2); + printf("³Width: 40 Height: 43³\n"); + gotoxy(41,2); + printf("³Bytes per screen: 3440³\n"); + gotoxy(1,3); + printf("³Number of pages: 8 ³\n"); + gotoxy(41,3); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } + else if (Mode.mode == MODE_M) + { + // ** NOTE ** the gotoxy's here are a hack so that i could use the + // standard C functions to program this mode. Normally you would just + // calculate the proper address and display the text but since DOS still + // thinks we are in mode 03h (it checks the BIOS), this is necessary. + printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n"); + gotoxy(41,1); + printf("³Text Mode K ³\n"); + printf("³Width: 40 Height: 50³\n"); + gotoxy(1,2); + gotoxy(41,2); + printf("³Bytes per screen: 4000³\n"); + gotoxy(1,3); + printf("³Number of pages: 8 ³\n"); + gotoxy(41,3); + printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n"); + } +} diff --git a/16/tauron30/FEDIT.EXE b/16/tauron30/FEDIT.EXE new file mode 100755 index 0000000000000000000000000000000000000000..98d5c46b4d6a4302d472cd1c6fefd4bec2eaf9bf GIT binary patch literal 151665 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®!#%xNqu$sY??;!gd)WrBWv!$vy3_enL$~)Lu(=#jx3L%_()RkrQ|?-ZH60w zm6G8&l}v?FBS|C_B^BfYoXdyf$!LnJXA~8|u;IAme!jd@(1%n5tU>cx$;QA7w zwY~9Cvq1c@8^&Xg1crAK<9;xL`LmByR4+J1>x+-{j+OKH6o{IYtkGz1I(2FVG&GI6 zI36XGkdea}5rxXcLNvot9vdt&97=?s6+A7YDlk-OMnKwB0&az*lOoA1UZ&YpV`$N= zUf4P&(-~QtZp@M4K0GS)R*HttT@% z)SlD}-L5mOcz$wv0U6+i7gFG??g_3N&*w1umKq8y1#69l2IH6;!IB2^G)Q?l(aLAZ z9#}QR28Tk?7+Rc9+xwZF_w|U4qDE+dw*ziN2Mn(;v zp6-#}Zav%m#_Z8OF@DWrA@>oC9-6#a^FH2YNi0GrLnJ{}9ut@^v$zS;8xJM)r=}$u zmPu=aDNH+KqVd%ep1#AOa5S~w9~q*Iah^(FO; z#iM=t3UD9aRncKAfnd%ik?%ecY4$-ck13JS6R3Oi#0ad7a6<13YgY_~MuTfHf$B|z zh1jg_wz*^qVO7<%7^*}DIWY%VnFFoN^fc4b6iTchvzQY!v$ixvVr!y_IIVs_b;MTa zL^5I!-6$GF!%3`{g7G9Q!X&0Y&>1S8915-E#Q+t>k`$I$A`zo?P$DH4D`*@9Ff{sg5dxv#aG zd^p+NPGs7S)we2O5$QH-pTVd7gL>4ozrm--j-#F-BZntQf{a0w7NwQL45$~c8;{;- zc=kwtKdn=ZGS80;&7w8N;t=(+DMi&NE`=qbo}eCo30kK=J*@W~(rNL&V>vBOrU!Cb zw9f!eOEV)kEuuvdpQ=zGJUa$k)}+$IuR9!y^~C#3Uaxl7U>{Uhr_%(ifmO84M9rvo z9=vp72rH2x+WqLoS|lDr3)Ay$3iO#PC^5*|vf2ZuFOaYVqgLwXi<||trxYAxgy}-q z!M*VoT37|cYf}9oQsi0ly63ge>ETp+XUjrH%Aafu4-d0B?Hz61j8`DaR&tiL_u-ks zFivULVNO?P580(`IEAf`{{CQ!@d+=*`e9Ci!!*>w1|w@CgRGzHCWg~Me6Wx8QaDCE ziG?Tz?l6NQN3eC1im$@91^F)Fze`!~I+}JP`q++*4AB@*veuc)X15%;3?;^Dylq)` zPit%29PFe1NRG{vx%-p1cC^plue`nM$KsYQY?(of&9a`kbC!VOZPSRM$he)z+iQN; zqV6_Sifo!B{`TD{Ti7AIl;O5u)Zh@Q!_HGWJ3cCo!&dZ!h;MOZGD5RZ(wZYvHOIQ z@>21V(%NQ4|0pl3Q4nu@6RRtw?7^p!5>IHfQ6^A@Kk*6EXB}+DTcnI23atx#t&KwEdNP@iqMatef_kHOXf%)a>L*ugO{lOR1`BB5oAYlLa$1HFh+CT7_Dk; bUuaPVQiA?SUo@o;nzq*V9yW)5d87XqhIj+7 literal 0 HcmV?d00001 diff --git a/16/tauron30/FEDIT.TXT b/16/tauron30/FEDIT.TXT new file mode 100755 index 00000000..42883ec6 --- /dev/null +++ b/16/tauron30/FEDIT.TXT @@ -0,0 +1,93 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= +=- Tauron VGA Utilities Version 3.0 -= +=- Released September 20, 1998 -= +=- Font Editor Docs -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +=- All Rights Reserved. =-= that you put my name some- -= +=- =-= where in your credits. -= +=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- I assume no responsibility whatsoever for any effect that this package, -= +=- the information contained therein or the use thereof has on you, your -= +=- sanity, computer, spouse, children, pets or anything else related to -= +=- you or your existance. No warranty is provided nor implied with this -= +=- source code. -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +A mouse is required to run this program. + +On the main screen is a blue box with a white solid line surrounding it. +This is the MAIN EDIT BOX. Inside of this box is where the font is created. +Left click with the mouse to turn a bit on, right click with the mouse to +turn a bit off. + +In the bottom left corner there is the ACTIONS box. Inside is all of the +options that you have available. **NOTE** The delete this character action +is not operational. + + Update this character -- This action puts the curently edited character + into its final font position. There is a charcter buffer and a character + list. When editing you are editing the buffer. If you don't want to keep + the current changes, then don't hit update character. But if you do want to + keep the changes, then hit update character before hitting anything else. If + you don't the cnages will be lost. + + Display next character -- Hit the left or right arrows to go up or down the + list character list. As you display each character, it is editable and you + must hit update character if you want to save the changes. + + Goto character -- Goes to a certain character in the list. + + Read font from BIOS -- Read in a font from the BIOS which can now be + edited. + + Add a character -- Adds a charcter to the end of the list. No more than + 256 characters can be added. + + Delete a character -- Not operational + + Dump font to FONT.ASM -- This dumps the font to a text file ready to be + assembled with an assembler. + + +Along the bottom of the screen is a menu bar with choices: +Alt+N New This creates a new font with dimensions you specify. + +Alt+O Open Opens a file. Careful using the dialog as it may no be + intuitive at first glance. + +Alt+S Save Savess a file. Careful using the dialog as it may no be + intuitive at first glance. + +Alt+A About Opens a window containing information about the program. + Also has contact information + +Alt+X Exit Exits the program. This does not prompt you to save the file + you are working on so be careful. + + + +Here is the structure for the files saved in binary : +Header 7 bytes 'KINFIRA' +Width Word +Height Word +Number of characters Word +Bytes per character Word + +The rest of the file is the font saved in bitwise form. +For example: This is a partial text dump from an 8x14 font from BIOS +Every byte (8 bits) is one scanline. Notice there are 14 bytes per character +DB 000H,000H,07EH,081H,0A5H,081H,081H,0BDH,099H,081H,07EH,000H,000H,000H + +If this font was say a 16x14 font, every word (16 bits) would be a scanline. +Take the same line as above, represented as a 16 bit wide font: + +DB 000H,000H, <====== First scanline + 000H,000H, <====== Second scanline + 000H,07EH, + 000H,081H, + 000H,0A5H, + and so on... +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/MAIN.EXE b/16/tauron30/MAIN.EXE new file mode 100755 index 0000000000000000000000000000000000000000..f8caffeb75a744a168ab40e1c743598c63a7b729 GIT binary patch literal 18460 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 literal 0 HcmV?d00001 diff --git a/16/tauron30/MAINC.EXE b/16/tauron30/MAINC.EXE new file mode 100755 index 0000000000000000000000000000000000000000..2668a905ee8668b8a937757fb1784c8b48068d45 GIT binary patch literal 82375 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.ASM The Main source file -= +=- +->MODES.ASM The mode switching file -= +=- +->CLEAR.ASM The clear screen routines -= +=- +->TESTS.ASM The videomode tests -= +=- +->DUAL.ASM The dual font setup and test -= +=- +->FONT1.ASM Font 1 for dual font test -= +=- +->FONT2.ASM Font 2 for dual font test -= +=- +->MODES.INC The includes for each videomode -= +=- -= +=- C_SRC The C source directory -= +=- +->MAINC.CPP The main source file -= +=- +->MODES.CPP The mode switching file -= +=- +->CLEAR.CPP The clear screen routines -= +=- +->TESTS.CPP The videomode tests -= +=- +->TAURON.H The main header file -= +=- +->FONT1.H Font 1 for dual font test -= +=- +->FONT2.H Font 2 for dual font test -= +=- +->MODES_C.INC The includes for each videomode -= +=- +->PALETTE.INC The standard palette -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +When running the demo: + + In graphics modes, there is a vertical line every 40 pixels with a longer + vertical line every 80 pixels. + + I have not yet figured out how to program modes 04H, 05H, or 06H. Once + the mode is set, I only clear the mode to a specified color. + + + +The VGA BIOS must be called once at the beginning of the routines so that we +know where the fonts are stored. Once this information is known we no longer +need the BIOS. + +The reason for starting this package is that I am writing an Operating +System. (There are a lot of us out there I know.) I wanted to be able to +program standard VGA cards for my OS. + +This is not a graphics library although there are some clear screen and pixel +routines around. It only sets the video mode. This works in real mode as +well as protected mode. To use it in protected mode you will have to modify +it to suit your own needs. + +The use of the fonts stored in BIOS ROM is now included. We are using what is +already built into the VGA BIOS. + + +E-mail: kinfira@hotmail.com +Homepage: http://home.onestop.net/kinfira/ + +Drop me a line if you find this package useful. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=-= Credits: =-= =-= +=-=-=-=-=-=-=-=-= =-= +=-= A great book: "Programmer's Guide to the EGA, VGA, and Super VGA =-= +=-= Cards" 3rd Edition Richard F. Ferraro ISBN 0-201-62490-7 =-= +=-= Addison-Wesley Publishing Company. =-= +=-= =-= +=-= A very excellent book: "Programmer's Guide to the EGA & VGA Cards" =-= +=-= Richard F. Ferraro ISBN 0-201-12692-3 =-= +=-= Addison-Wesley Publishing Company. =-= +=-= =-= +=-= Anthony A.J. Williams for writing MODES.ASM, which I used to help =-= +=-= write the Text Mode routine. I specifically used the SetFont =-= +=-= procedure which was instrumental in getting the code for Mode 03h =-= +=-= working. =-= +=-= =-= +=-= Boone (boone@ucsd.edu) for the docs on programming the VGA Registers. =-= +=-= =-= +=-= I also used a really great program called TWEAK to get some of the =-= +=-= values for the non-standard modes. =-= +=-= =-= +=-= Denthor of ASPHYXIA for his trainer on Chain-4 Mode. =-= +=-= =-= +=-= Robert Schmidt for the great doc in PCGPE 1.0 =-= +=-= about Mode X. This helped a great deal. =-= +=-= =-= +=-= Michael Abrash for his super excellent VGA articles on everything, =-= +=-= plus all of his books and public domain code. =-= +=-= =-= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +=-=-=-=-=-=-=-=-=-=-=-= +=- Revision History: -= +=-=-=-=-=-=-=-=-=-=-=-= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 3.0 released September 20, 1998 + I added 2 new text modes, 40x43 and 40x50. Also I have added a new dual + font test which uses 2 of the VGA's 8 font maps. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.1 released July 5, 1998 + The only change is that in the C version, the routine to read fronts from + BIOS is now working. This routine reads a font from the BIOS and places + it in memory for use in a textmode. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.0 released June 22, 1998 + I have added more videomodes. I have also written a version of the + source in C. So the routines are available in Assembly and C. I have + also written some documentation for the font editor. So now the only + modes that are not implemented are the monochrome modes which will still + be worked on. + + +Tauron VGA Utilities +Version 1.0 released June 14, 1998 + I changed the name because that other was a little too long. B-> + I have packaged in a small font editor. I have also rearranged the mode + numbers and added a few more video modes that will be implemented. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Source code for switching videomodes without using BIOS +Version 4.1 released May 28, 1998 + +New in this version: + We call a BIOS function to find out where in memory the fonts are stored. + Since this is different on every cards' VGA BIOS, it is absolutely + necessary so that in text modes, the proper fonts are displayed. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 4.0 released March 5, 1998 + +New in this version: + All VGA Modes are supported! Plus Chain-4 Mode, ModeX, ModeA, + ModeB and ModeC. Modes 07H and 0FH are still being worked on. + + Use of Fonts stored in ROM. + Custom Font data stored in system memory is no longer needed. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 3.0 released January 2, 1998 + Includes Modes 03h, 10h, 12h, and 13h plus Chain-4 Mode, ModeX, ModeA, + ModeB and ModeC. + +New in this version: Mode 10h (640x350x16), Mode C (640x400x16) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.5 not released + Includes Modes 03h, 12h, and 13h plus Chain-4 Mode, ModeX, ModeA, and + ModeB. + +New in this version: VGA register data takes up less space. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.1 released Nov. 21, 1997 + Includes Modes 03h, 12h, and 13h plus Chain-4 Mode, ModeX, ModeA, and + ModeB. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 2.0 released Nov. 10, 1997 + Includes Modes 03h, 12h, and 13h plus Chain-4 Mode and ModeX. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 1.5 released late Oct. 1997 + Includes Modes 03h, 12h, and 13h. Fully functional + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 1.1 released in Oct. 12, 1997 + Includes Mode 13h, Mode 03h finally works. Realized that I needed to reset + the text mode font. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Version 1.0 released in Oct. 7, 1997 + Included Mode 13h, Mode 03h partially. (Did not have setfont routine) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/USAGE.TXT b/16/tauron30/USAGE.TXT new file mode 100755 index 00000000..939c2dec --- /dev/null +++ b/16/tauron30/USAGE.TXT @@ -0,0 +1,118 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= +=- Tauron VGA Utilities Version 3.0 -= +=- Released September 20, 1998 -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +=- All Rights Reserved. =-= that you put my name some- -= +=- =-= where in your credits. -= +=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- I assume no responsibility whatsoever for any effect that this package, -= +=- the information contained therein or the use thereof has on you, your -= +=- sanity, computer, spouse, children, pets or anything else related to -= +=- you or your existance. No warranty is provided nor implied with this -= +=- source code. -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +** Note ** This code does not update BIOS when in real mode. So if you need +that particular functionality, you will have to add this yourself. + + + Use MODE NUMBER to set the video mode with the procedure provided. + + A star (*) next to the mode number indicates that it is not yet + implemented. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Currently supported Video Modes: -= MODE NUMBER =-= Type -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= =-= -= +=- 00H,01H -- 40 x 25 x 16 -= 00H,01H =-= Text -= +=- -= =-= -= +=- 02H,03H -- 80 x 25 x 16 -= 02H,03H =-= Text -= +=- -= =-= -= +=- 04H,05H -- 320 x 200 x 4 -= 04H,05H =-= Graphics -= +=- -= =-= -= +=- 06H -- 640 x 200 x 2 -= 06H =-= Graphics -= +=- -= =-= -= +=- 07H -- 80 x 25 x 2 (Monochrome) -= * 07H =-= Text -= +=- -= =-= -= +=- 0DH -- 320 x 200 x 16 -= 0DH =-= Graphics -= +=- -= =-= -= +=- 0EH -- 640 x 200 x 16 -= 0EH =-= Graphics -= +=- -= =-= -= +=- 0FH -- 640 x 350 x 2 (Monochrome) -= * 0FH =-= Graphics -= +=- -= =-= -= +=- 10H -- 640 x 350 x 16 -= 10H =-= Graphics -= +=- -= =-= -= +=- 11H -- 640 x 480 x 2 -= 11H =-= Graphics -= +=- -= =-= -= +=- 12H -- 640 x 480 x 16 -= 12H =-= Graphics -= +=- -= =-= -= +=- 13H -- 320 x 200 x 256 -= 13H =-= Graphics -= +=- -= =-= -= +=- Chain 4 -- unchained 320 x 200 x 256 -= 14H =-= Graphics -= +=- -= =-= -= +=- Mode X -- unchained 320 x 240 x 256 -= 15H =-= Graphics -= +=- -= =-= -= +=- Mode A -- unchained 320 x 350 x 256 -= 16H =-= Graphics -= +=- -= =-= -= +=- Mode B -- unchained 320 x 400 x 256 -= 17H =-= Graphics -= +=- -= =-= -= +=- Mode C -- unchained 320 x 480 x 256 -= 18H =-= Graphics -= +=- -= =-= -= +=- Mode D -- unchained 360 x 200 x 256 -= 19H =-= Graphics -= +=- -= =-= -= +=- Mode E -- unchained 360 x 240 x 256 -= 1AH =-= Graphics -= +=- -= =-= -= +=- Mode F -- unchained 360 x 350 x 256 -= 1BH =-= Graphics -= +=- -= =-= -= +=- Mode G -- unchained 360 x 400 x 256 -= 1CH =-= Graphics -= +=- -= =-= -= +=- Mode H -- unchained 360 x 480 x 256 -= 1DH =-= Graphics -= +=- -= =-= -= +=- Mode I -- 640 x 400 x 16 -= 1EH =-= Graphics -= +=- -= =-= -= +=- Mode J -- 80 x 43 x 16 -= 1FH =-= Text -= +=- -= =-= -= +=- Mode K -- 80 x 50 x 16 -= 20H =-= Text -= +=- -= =-= -= +=- Mode K -- 40 x 43 x 16 -= 21H =-= Text -= +=- -= =-= -= +=- Mode K -- 40 x 50 x 16 -= 22H =-= Text -= +=- -= =-= -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + +To set a video mode using the procedure I already have written: + +PUSH *VALUE* ; Where value is the mode number +CALL SETVIDEOMODE + +and thats it the videomode gets set. + +Once the video mode is set, you can program each video mode as normal. + +Just remember, you can't rely on BIOS so if you need the palette set to the +proper values, you need to set them yourself. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +If you want to use this code in your programs, all you need is which ever +mode you want from MODES.INC and also the procedure SETMODE. + +Just + +MOV SI, OFFSET *MODE* ; Where mode is the mode from MODES.INC +CALL SETMODE + +If you want the unchained modes, you also need a bit of code from the +SETVIDEOMODE procedure in MAIN.ASM. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +I have also included some source for clearing the screen and plotting pixels. +If you notice that since all of the chained modes use the same memory +structure the same code can be used to program all with only a few +modifications. This also goes for the planar modes 10h, 12h, Mode C, etc. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/16/tauron30/WHATSNEW.TXT b/16/tauron30/WHATSNEW.TXT new file mode 100755 index 00000000..72ab292c --- /dev/null +++ b/16/tauron30/WHATSNEW.TXT @@ -0,0 +1,32 @@ +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- -= +=- Tauron VGA Utilities Version 3.0 -= +=- Released September 20, 1998 -= +=- -= +=- What new with this release??? -= +=- -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- Copyright (c) 1997, 1998 by Jeff Morgan =-= This code is FREE provided -= +=- All Rights Reserved. =-= that you put my name some- -= +=- =-= where in your credits. -= +=- DISCLAIMER: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +=- I assume no responsibility whatsoever for any effect that this package, -= +=- the information contained therein or the use thereof has on you, your -= +=- sanity, computer, spouse, children, pets or anything else related to -= +=- you or your existance. No warranty is provided nor implied with this -= +=- source code. -= +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + I added 2 new text modes, 40x43 and 40x50. + + There is now a dual font test. What this does is load 2 fonts into VGA + memory and display text from both fonts on the screen at the same time. + This is possible by reprogramming the charcter map select register. You + can have up to 8 fonts present in memory at any time but can only use 2 + at a time. + + I was trying to add some more high-res video modes but so far they don't + quite work. I'm shooting for 720x200 first just to see if I can make it + work. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -- 2.39.2