--- /dev/null
+unit TxtScrIO;\r
+interface\r
+\r
+const\r
+ Black = $00; DGray = $08;\r
+ Blue = $01; LBlue = $09;\r
+ Green = $02; LGreen = $0a;\r
+ Cyan = $03; LCyan = $0b;\r
+ Red = $04; LRed = $0c;\r
+ Magenta = $05; LMagenta = $0d;\r
+ Brown = $06; Yellow = $0e;\r
+ LGray = $07; White = $0f;\r
+ Blink = $80;\r
+\r
+procedure ShowStr(var dest; x,y: Byte; str: String; attr: Byte);\r
+procedure ShowVStr(var dest; x,y: Byte; str: String; attr: Byte);\r
+procedure ShowCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte);\r
+procedure ShowVCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte);\r
+procedure ShowC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte);\r
+procedure ShowVC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte);\r
+function CStrLen(str: String): Byte;\r
+function AbsPos(x,y: Byte): Word;\r
+function Color(fgnd,bgnd: Byte): Byte;\r
+procedure CleanScreen(var dest);\r
+procedure initialize;\r
+\r
+type\r
+ tCUSTOM_VIDEO_MODE = 0..52;\r
+\r
+procedure SetCustomVideoMode(vmode: tCUSTOM_VIDEO_MODE);\r
+\r
+type\r
+ tFRAME_SETTING = Record\r
+ shadow_enabled,\r
+ wide_range_type,\r
+ zooming_enabled,\r
+ update_area: Boolean;\r
+ end;\r
+const\r
+ fr_setting: tFRAME_SETTING =\r
+ (shadow_enabled: TRUE;\r
+ wide_range_type: FALSE;\r
+ zooming_enabled: FALSE;\r
+ update_area: TRUE);\r
+\r
+procedure Frame(var dest; x1,y1,x2,y2,atr1: Byte;\r
+ title: String; atr2: Byte; border: String);\r
+\r
+const\r
+ solid1 = ' ';\r
+ solid2 = 'ÛßÛÛÛÛÜÛ';\r
+ single = 'ÚÄ¿³³ÀÄÙ';\r
+ double = 'ÉÍ»ººÈͼ';\r
+ dbside = 'ÖÄ·ººÓĽ';\r
+ dbtop = 'Õ͸³³Ô;';\r
+\r
+var\r
+ MaxLn,MaxCol,\r
+ work_maxln,work_maxcol: Byte;\r
+ area_x1,area_y1,area_x2,area_y2: Byte;\r
+ v_mode: Byte;\r
+ DispPg: Byte;\r
+ v_seg,v_ofs: Longint;\r
+ CheckSnow: Boolean;\r
+\r
+function iEGA: Boolean;\r
+function iVGA: Boolean;\r
+function iPS2: Boolean;\r
+function iMDA: Boolean;\r
+function iCGA: Boolean;\r
+function iMCGA: Boolean;\r
+\r
+function WhereX: Byte;\r
+function WhereY: Byte;\r
+procedure GotoXY(x,y: Byte);\r
+procedure ResetMode;\r
+\r
+function GetCursor: Longint;\r
+procedure SetCursor(cursor: Longint);\r
+procedure ThinCursor;\r
+procedure WideCursor;\r
+procedure HideCursor;\r
+function GetCursorShape: Word;\r
+procedure SetCursorShape(shape: Word);\r
+\r
+type\r
+ tVIDEO_STATE = Record\r
+ font: Byte;\r
+ cursor: Longint;\r
+ MaxLn,MaxCol,v_mode: Byte;\r
+ v_ofs: Longint;\r
+ screen: array[0..PRED(8192)] of Byte;\r
+ data: array[0..PRED(4096)] of Byte;\r
+ end;\r
+\r
+procedure GetVideoState(var data: tVIDEO_STATE);\r
+procedure SetVideoState(var data: tVIDEO_STATE; restore_screen: Boolean);\r
+procedure GetRGBitem(color: Byte; var red,green,blue: Byte);\r
+procedure SetRGBitem(color: Byte; red,green,blue: Byte);\r
+procedure WaitRetrace;\r
+procedure GetPalette(var pal; first,last: Word);\r
+procedure SetPalette(var pal; first,last: Word);\r
+\r
+type\r
+ tFADE = (first,fadeOut,fadeIn);\r
+ tDELAY = (fast,delayed);\r
+\r
+type\r
+ tFADE_BUF = Record\r
+ action: tFADE;\r
+ pal0: array[0..255] of Record r,g,b: Byte end;\r
+ pal1: array[0..255] of Record r,g,b: Byte end;\r
+ end;\r
+\r
+const\r
+ fade_speed: Byte = 63;\r
+\r
+procedure VgaFade(var data: tFADE_BUF; fade: tFADE; delay: tDELAY);\r
+procedure RefreshEnable;\r
+procedure RefreshDisable;\r
+procedure Split2Static;\r
+procedure SplitScr(line: Integer);\r
+procedure SetSize(columns,lines: Integer);\r
+procedure SetTextDisp(x,y: Integer);\r
+\r
+implementation\r
+uses DPMI;\r
+\r
+var\r
+ absolute_pos: Word;\r
+\r
+procedure DupChar; assembler;\r
+asm\r
+ pushad { IN/ al -column }\r
+ xor ebx,ebx { ah -line }\r
+ xchg ax,bx { dl -character }\r
+ xor eax,eax { dh -attribute }\r
+ xchg ax,bx { ecx -count }\r
+ mov bl,al { edi -ptr. to write }\r
+ mov al,MaxCol\r
+ mul ah\r
+ add ax,bx\r
+ mov bl,MaxCol\r
+ sub ax,bx\r
+ dec ax\r
+ shl ax,1\r
+ jecxz @@1\r
+ add edi,eax\r
+ xchg ax,dx\r
+ rep stosw\r
+ xchg ax,dx\r
+@@1: mov absolute_pos,ax\r
+ popad\r
+end;\r
+\r
+procedure ShowStr(var dest; x,y: Byte; str: String; attr: Byte); assembler;\r
+asm\r
+ mov edi,[dest]\r
+ mov esi,[str]\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ lodsb\r
+ mov cl,al\r
+ jecxz @@2\r
+ add edi,edx\r
+ mov ah,attr\r
+@@1: lodsb\r
+ stosw\r
+ loop @@1\r
+@@2:\r
+end;\r
+\r
+procedure ShowVStr(var dest; x,y: Byte; str: String; attr: Byte); assembler;\r
+asm\r
+ mov al,MaxCol\r
+ dec al\r
+ xor ah,ah\r
+ xor ebx,ebx\r
+ mov bl,2\r
+ mul bl\r
+ mov bx,ax\r
+ mov edi,[dest]\r
+ mov esi,[str]\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ lodsb\r
+ mov cl,al\r
+ jecxz @@2\r
+ add edi,edx\r
+ mov ah,attr\r
+@@1: lodsb\r
+ stosw\r
+ add edi,ebx\r
+ loop @@1\r
+@@2:\r
+end;\r
+\r
+procedure ShowCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte); assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov ah,atr1\r
+ mov bh,atr2\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ stosw\r
+ loop @@1\r
+ jmp @@3\r
+@@2: xchg ah,bh\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+procedure ShowVCStr(var dest; x,y: Byte; str: String; atr1,atr2: Byte); assembler;\r
+asm\r
+ mov al,MaxCol\r
+ dec al\r
+ xor ah,ah\r
+ mov bl,2\r
+ mul bl\r
+ mov bx,ax\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov dx,bx\r
+ mov ah,atr1\r
+ mov bh,atr2\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ stosw\r
+ add edi,edx\r
+ loop @@1\r
+ jmp @@3\r
+@@2: xchg ah,bh\r
+ loop @@1\r
+@@3:\r
+end;\r
+\r
+procedure ShowC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte); assembler;\r
+asm\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@3\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov ah,atr1\r
+ mov bl,atr2\r
+ mov bh,atr3\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ cmp al,'`'\r
+ jz @@3\r
+ stosw\r
+ loop @@1\r
+ jmp @@4\r
+@@2: xchg ah,bl\r
+ loop @@1\r
+ jmp @@4\r
+@@3: xchg ah,bh\r
+ loop @@1\r
+@@4:\r
+end;\r
+\r
+procedure ShowVC3Str(var dest; x,y: Byte; str: String; atr1,atr2,atr3: Byte); assembler;\r
+asm\r
+ mov al,MaxCol\r
+ dec al\r
+ xor ah,ah\r
+ mov bl,2\r
+ mul bl\r
+ mov bx,ax\r
+ mov esi,[str]\r
+ mov edi,[dest]\r
+ lodsb\r
+ xor ecx,ecx\r
+ mov cl,al\r
+ jecxz @@4\r
+ push ecx\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ xor edx,edx\r
+ mov dx,absolute_pos\r
+ pop ecx\r
+ add edi,edx\r
+ mov dx,bx\r
+ mov ah,atr1\r
+ mov bl,atr2\r
+ mov bh,atr3\r
+@@1: lodsb\r
+ cmp al,'~'\r
+ jz @@2\r
+ cmp al,'`'\r
+ jz @@3\r
+ stosw\r
+ add edi,edx\r
+ loop @@1\r
+ jmp @@4\r
+@@2: xchg ah,bl\r
+ loop @@1\r
+ jmp @@4\r
+@@3: xchg ah,bh\r
+ loop @@1\r
+@@4:\r
+end;\r
+\r
+function CStrLen(str: String): Byte; assembler;\r
+asm\r
+ mov edi,[str]\r
+ xor ecx,ecx\r
+ mov cl,[edi]\r
+ inc edi\r
+ mov bx,cx\r
+ jecxz @@2\r
+ mov al,'~'\r
+@@1: repne scasb\r
+ jnz @@2\r
+ dec bx\r
+ jmp @@1\r
+@@2: mov ax,bx\r
+end;\r
+\r
+function AbsPos(x,y: Byte): Word; assembler;\r
+asm\r
+ mov al,x\r
+ mov ah,y\r
+ xor ecx,ecx\r
+ call DupChar\r
+ mov ax,absolute_pos\r
+end;\r
+\r
+function Color(fgnd,bgnd: Byte): Byte; assembler;\r
+asm\r
+ mov al,bgnd\r
+ xor ah,ah\r
+ mov bh,16\r
+ mul bh\r
+ add al,fgnd\r
+end;\r
+\r
+procedure CleanScreen(var dest); assembler;\r
+asm\r
+ mov edi,[dest]\r
+ mov al,1\r
+ mov bh,1\r
+ mov cl,MaxCol\r
+ xor ch,ch\r
+@@1: mov ah,bh\r
+ mov dl,' '\r
+ mov dh,07h\r
+ call DupChar\r
+ inc bh\r
+ cmp bh,MaxLn\r
+ jle @@1\r
+end;\r
+\r
+procedure Frame(var dest; x1,y1,x2,y2,atr1: Byte;\r
+ title: String; atr2: Byte; border: String); assembler;\r
+var\r
+ xexp1,xexp2,xexp3,yexp1,yexp2: Byte;\r
+ offs: Longint;\r
+\r
+asm\r
+ cmp fr_setting.update_area,1\r
+ jnz @@0\r
+ mov al,x1\r
+ mov area_x1,al\r
+ mov al,y1\r
+ mov area_y1,al\r
+ mov al,x2\r
+ mov area_x2,al\r
+ mov al,y2\r
+ mov area_y2,al\r
+@@0: mov bl,fr_setting.wide_range_type\r
+ mov bh,fr_setting.shadow_enabled\r
+ mov esi,[border]\r
+ mov edi,[dest]\r
+ mov offs,edi\r
+ cmp bl,0\r
+ je @@1\r
+ mov xexp1,4\r
+ mov xexp2,-1\r
+ mov xexp3,7\r
+ mov yexp1,1\r
+ mov yexp2,2\r
+ jmp @@2\r
+@@1: mov xexp1,1\r
+ mov xexp2,2\r
+ mov xexp3,1\r
+ mov yexp1,0\r
+ mov yexp2,1\r
+ jmp @@4\r
+@@2: mov al,x1\r
+ sub al,3\r
+ mov ah,y1\r
+ dec ah\r
+ mov dl,' '\r
+ mov dh,atr1\r
+ xor ecx,ecx\r
+ mov cl,x2\r
+ sub cl,x1\r
+ add cl,7\r
+ call DupChar\r
+ mov ah,y2\r
+ inc ah\r
+ call DupChar\r
+ mov bl,y1\r
+@@3: mov al,x1\r
+ sub al,3\r
+ mov ah,bl\r
+ mov dl,' '\r
+ mov ecx,3\r
+ call DupChar\r
+ mov al,x2\r
+ inc al\r
+ mov dl,' '\r
+ mov ecx,3\r
+ call DupChar\r
+ inc bl\r
+ cmp bl,y2\r
+ jng @@3\r
+@@4: mov al,x1\r
+ mov ah,y1\r
+ mov dl,[esi+1]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ push edi\r
+ call DupChar\r
+ inc al\r
+ mov dl,[esi+2]\r
+ mov dh,atr1\r
+ mov cl,x2\r
+ sub cl,x1\r
+ dec cl\r
+ call DupChar\r
+ mov al,x2\r
+ mov dl,[esi+3]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ mov bl,y1\r
+@@5: inc bl\r
+ mov al,x1\r
+ mov ah,bl\r
+ mov dl,[esi+4]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ inc al\r
+ mov dl,' '\r
+ mov dh,atr1\r
+ mov cl,x2\r
+ sub cl,x1\r
+ dec cl\r
+ call DupChar\r
+ mov al,x2\r
+ mov dl,[esi+5]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ cmp bl,y2\r
+ jnge @@5\r
+ mov al,x1\r
+ mov ah,y2\r
+ mov dl,[esi+6]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ inc al\r
+ mov dl,[esi+7]\r
+ mov cl,x2\r
+ sub cl,x1\r
+ dec cl\r
+ call DupChar\r
+ mov al,x2\r
+ mov dl,[esi+8]\r
+ mov dh,atr1\r
+ mov ecx,1\r
+ call DupChar\r
+ mov esi,[title]\r
+ mov cl,[esi]\r
+ jecxz @@7\r
+ xor eax,eax\r
+ mov al,x2\r
+ sub al,x1\r
+ sub al,cl\r
+ mov bl,2\r
+ div bl\r
+ add al,x1\r
+ add al,ah\r
+ mov ah,y1\r
+ xor ecx,ecx\r
+ call DupChar\r
+ push eax\r
+ xor eax,eax\r
+ mov ax,absolute_pos\r
+ mov edi,offs\r
+ add edi,eax\r
+ pop eax\r
+ lodsb\r
+ mov cl,al\r
+ mov ah,atr2\r
+@@6: lodsb\r
+ stosw\r
+ loop @@6\r
+@@7: cmp bh,0\r
+ je @@11\r
+ mov bl,y1\r
+ sub bl,yexp1\r
+@@8: inc bl\r
+ mov al,x2\r
+ add al,xexp1\r
+ mov ah,bl\r
+ xor ecx,ecx\r
+ call DupChar\r
+ push eax\r
+ xor eax,eax\r
+ mov ax,absolute_pos\r
+ mov edi,offs\r
+ add edi,eax\r
+ pop eax\r
+ inc edi\r
+ mov al,07\r
+ stosb\r
+ cmp MaxLn,80\r
+ jae @@9\r
+ inc edi\r
+ stosb\r
+ cmp MaxCol,132\r
+ jna @@9\r
+ inc edi\r
+ stosb\r
+@@9: cmp bl,y2\r
+ jng @@8\r
+ mov al,x1\r
+ add al,xexp2\r
+ mov ah,y2\r
+ add ah,yexp2\r
+ xor ecx,ecx\r
+ call DupChar\r
+ push eax\r
+ xor eax,eax\r
+ mov ax,absolute_pos\r
+ mov edi,offs\r
+ add edi,eax\r
+ pop eax\r
+ inc edi\r
+ mov al,07\r
+ mov cl,x2\r
+ sub cl,x1\r
+ add cl,xexp3\r
+ cmp MaxLn,45\r
+ jb @@10\r
+ dec cl\r
+@@10: stosb\r
+ inc edi\r
+ loop @@10\r
+@@11:\r
+end;\r
+\r
+function iEGA: Boolean; assembler;\r
+asm\r
+ mov ax,01200h\r
+ mov bx,00010h\r
+ mov cx,0ffffh\r
+ int 10h\r
+ cmp cx,0ffffh\r
+ jz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iVGA: Boolean; assembler;\r
+asm\r
+ mov ax,1a00h\r
+ int 10h\r
+ cmp al,1ah\r
+ jnz @@1\r
+ cmp bl,7\r
+ jb @@1\r
+ cmp bl,0ffh\r
+ jnz @@2\r
+@@1: xor al,al\r
+ jmp @@3\r
+@@2: mov al,1\r
+@@3:\r
+end;\r
+\r
+function iPS2: Boolean; assembler;\r
+asm\r
+ mov ax,1a00h\r
+ int 10h\r
+ and al,0ffh\r
+ cmp al,1ah\r
+ jnz @@1\r
+ and bl,0ffh\r
+ cmp bl,07h\r
+ jb @@1\r
+ cmp bl,0ch\r
+ ja @@1\r
+ cmp bl,09h\r
+ jz @@1\r
+ cmp bl,0ah\r
+ jz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iMDA: Boolean; assembler;\r
+asm\r
+ cmp v_mode,07h\r
+ jnz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iCGA: Boolean; assembler;\r
+asm\r
+ call iMDA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iEGA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iPS2\r
+ cmp al,0\r
+ jnz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function iMCGA: Boolean; assembler;\r
+asm\r
+ call iMDA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iEGA\r
+ cmp al,0\r
+ jnz @@1\r
+ call iPS2\r
+ cmp al,1\r
+ jnz @@1\r
+ mov al,1\r
+ jmp @@2\r
+@@1: xor al,al\r
+@@2:\r
+end;\r
+\r
+function WhereX: Byte; assembler;\r
+asm\r
+ mov bh,DispPg\r
+ mov ah,03h\r
+ int 10h\r
+ inc dl\r
+ mov al,dl\r
+end;\r
+\r
+function WhereY: Byte; assembler;\r
+asm\r
+ mov bh,DispPg\r
+ mov ah,03h\r
+ int 10h\r
+ inc dh\r
+ mov al,dh\r
+end;\r
+\r
+procedure GotoXY(x,y: Byte); assembler;\r
+asm\r
+ mov dh,y\r
+ mov dl,x\r
+ dec dh\r
+ dec dl\r
+ mov bh,DispPg\r
+ mov ah,02h\r
+ int 10h\r
+end;\r
+\r
+procedure ResetMode; assembler;\r
+asm\r
+ xor ah,ah\r
+ mov al,v_mode\r
+ mov bh,DispPg\r
+ int 10h\r
+end;\r
+\r
+function GetCursor: Longint; assembler;\r
+asm\r
+ xor edx,edx\r
+ mov bh,DispPg\r
+ mov ah,03h\r
+ int 10h\r
+ shl edx,16\r
+ xor eax,eax\r
+ push edx\r
+ call GetCursorShape\r
+ pop edx\r
+ add edx,eax\r
+ mov eax,edx\r
+end;\r
+\r
+\r
+procedure SetCursor(cursor: Longint); assembler;\r
+asm\r
+ xor eax,eax\r
+ mov ax,word ptr [cursor]\r
+ push eax\r
+ call SetCursorShape\r
+ mov dx,word ptr [cursor+2]\r
+ mov bh,DispPg\r
+ mov ah,02h\r
+ int 10h\r
+end;\r
+\r
+procedure ThinCursor; assembler;\r
+asm\r
+ xor ecx,ecx\r
+ call iMDA\r
+ cmp al,1\r
+ jnz @@1\r
+ mov cx,0b0ch\r
+ jmp @@5\r
+@@1: call iCGA\r
+ cmp al,1\r
+ jnz @@2\r
+ mov cx,0708h\r
+ jmp @@5\r
+@@2: call iMCGA\r
+ cmp al,1\r
+ jnz @@3\r
+ mov cx,0708h\r
+ jmp @@5\r
+@@3: call iVGA\r
+ cmp al,1\r
+ jnz @@4\r
+ mov cx,0d0eh\r
+ jmp @@5\r
+@@4: mov cx,0b0ch\r
+@@5: push ecx\r
+ call SetCursorShape\r
+end;\r
+\r
+procedure WideCursor; assembler;\r
+asm\r
+ xor ecx,ecx\r
+ call iMDA\r
+ cmp al,1\r
+ jnz @@1\r
+ mov cx,010ch\r
+ jmp @@5\r
+@@1: call iCGA\r
+ cmp al,1\r
+ jnz @@2\r
+ mov cx,0107h\r
+ jmp @@5\r
+@@2: call iMCGA\r
+ cmp al,1\r
+ jnz @@3\r
+ mov cx,0107h\r
+ jmp @@5\r
+@@3: call iVGA\r
+ cmp al,1\r
+ jnz @@4\r
+ mov cx,010eh\r
+ jmp @@5\r
+@@4: mov cx,010ch\r
+@@5: push ecx\r
+ call SetCursorShape\r
+end;\r
+\r
+procedure HideCursor; assembler;\r
+asm\r
+ xor ecx,ecx\r
+ mov cx,1010h\r
+ push ecx\r
+ call SetCursorShape\r
+end;\r
+\r
+function GetCursorShape: Word; assembler;\r
+asm\r
+ mov dx,03d4h\r
+ mov al,0ah\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ and al,1fh\r
+ mov ah,al\r
+ dec dx\r
+ mov al,0bh\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ and al,1fh\r
+end;\r
+\r
+procedure SetCursorShape(shape: Word); assembler;\r
+asm\r
+ mov dx,03d4h\r
+ mov al,0ah\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ mov ah,BYTE(shape)[1]\r
+ and al,0e0h\r
+ or al,ah\r
+ out dx,al\r
+ dec dx\r
+ mov al,0bh\r
+ out dx,al\r
+ inc dx\r
+ in al,dx\r
+ mov ah,BYTE(shape)[0]\r
+ and al,0e0h\r
+ or al,ah\r
+ out dx,al\r
+end;\r
+\r
+procedure initialize;\r
+begin\r
+ asm\r
+ mov ah,0fh\r
+ int 10h\r
+ and al,7fh\r
+ mov v_mode,al\r
+ mov DispPg,bh\r
+ end;\r
+\r
+ If (MEM[0:$449] = 7) then\r
+ begin\r
+ v_seg := $0b000;\r
+ MaxLn := 25;\r
+ end\r
+ else begin\r
+ v_seg := $0b800;\r
+ MaxLn := SUCC(MEM[0:$484]);\r
+ end;\r
+\r
+ v_ofs := MEM[0:$44e];\r
+ MaxCol := MEM[0:$44a];\r
+\r
+ work_MaxLn := MaxLn;\r
+ work_MaxCol := MaxCol;\r
+\r
+ If iCGA then CheckSnow := TRUE\r
+ else CheckSnow := FALSE;\r
+end;\r
+\r
+var\r
+ dos_seg: Word;\r
+ bios_data_backup: array[0..167] of Byte;\r
+ regs: tRmRegs;\r
+\r
+procedure GetVideoState(var data: tVIDEO_STATE);\r
+begin\r
+ Move(Ptr(v_seg,v_ofs)^,data.screen,SizeOf(data.screen));\r
+ data.cursor := GetCursor;\r
+ data.font := MEMW[0:$0485];\r
+ data.v_mode := v_mode;\r
+ data.MaxLn := MaxLn;\r
+ data.MaxCol := MaxCol;\r
+ data.v_ofs := v_ofs;\r
+ Move(MEM[$40:0],bios_data_backup,168);\r
+ dos_seg := DosMemoryAlloc(SizeOf(tVIDEO_STATE(data).data));\r
+ ClearRmRegs(regs);\r
+ regs.cx := 7;\r
+ regs.es := dos_seg;\r
+ regs.ax := $1c01;\r
+ RealModeInt($10,regs);\r
+ Move(bios_data_backup,MEM[$40:0],168);\r
+ Move(POINTER(DWORD(dos_seg)*16)^,tVIDEO_STATE(data).data,\r
+ SizeOf(tVIDEO_STATE(data).data));\r
+ DosMemoryFree(dos_seg);\r
+end;\r
+\r
+procedure SetVideoState(var data: tVIDEO_STATE; restore_screen: Boolean);\r
+begin\r
+ v_mode := data.v_mode;\r
+ ResetMode;\r
+ Move(MEM[$40:0],bios_data_backup,168);\r
+ dos_seg := DosMemoryAlloc(SizeOf(tVIDEO_STATE(data).data));\r
+ Move(tVIDEO_STATE(data).data,POINTER(DWORD(dos_seg)*16)^,\r
+ SizeOf(tVIDEO_STATE(data).data));\r
+ ClearRmRegs(regs);\r
+ regs.cx := 7;\r
+ regs.es := dos_seg;\r
+ regs.ax := $1c02;\r
+ RealModeInt($10,regs);\r
+ DosMemoryFree(dos_seg);\r
+ Move(bios_data_backup,MEM[$40:0],168);\r
+\r
+ MEM[0:$44e] := data.v_ofs;\r
+ MEM[0:$484] := PRED(data.MaxLn);\r
+ MEM[0:$44a] := data.MaxCol;\r
+\r
+ Case data.font of\r
+ 8: asm mov ax,1112h; xor bl,bl; int 10h end;\r
+ 14: asm mov ax,1111h; xor bl,bl; int 10h end;\r
+ else asm mov ax,1114h; xor bl,bl; int 10h end;\r
+ end;\r
+\r
+ initialize;\r
+ SetCursor(data.cursor);\r
+ If restore_screen then\r
+ Move(data.screen,Ptr(v_seg,v_ofs)^,SizeOf(data.screen));\r
+end;\r
+\r
+procedure GetRGBitem(color: Byte; var red,green,blue: Byte);\r
+begin\r
+ PORT[$3c7] := color;\r
+ red := PORT[$3c9];\r
+ green := PORT[$3c9];\r
+ blue := PORT[$3c9];\r
+end;\r
+\r
+procedure SetRGBitem(color: Byte; red,green,blue: Byte);\r
+begin\r
+ PORT[$3c8] := color;\r
+ PORT[$3c9] := red;\r
+ PORT[$3c9] := green;\r
+ PORT[$3c9] := blue;\r
+end;\r
+\r
+procedure WaitRetrace; assembler;\r
+asm\r
+ mov dx,3dah\r
+@@1: in al,dx\r
+ and al,08h\r
+ jnz @@1\r
+@@2: in al,dx\r
+ and al,08h\r
+ jz @@2\r
+end;\r
+\r
+procedure GetPalette(var pal; first,last: Word); assembler;\r
+asm\r
+ xor eax,eax\r
+ xor ecx,ecx\r
+ mov ax,first\r
+ mov cx,last\r
+ sub ecx,eax\r
+ inc ecx\r
+ mov dx,03c7h\r
+ out dx,al\r
+ add dx,2\r
+ mov edi,[pal]\r
+ add edi,eax\r
+ add edi,eax\r
+ add edi,eax\r
+ mov eax,ecx\r
+ add ecx,eax\r
+ add ecx,eax\r
+ rep insb\r
+end;\r
+\r
+procedure SetPalette(var pal; first,last: Word); assembler;\r
+asm\r
+ mov dx,03dah\r
+@@1: in al,dx\r
+ test al,8\r
+ jz @@1\r
+ xor eax,eax\r
+ xor ecx,ecx\r
+ mov ax,first\r
+ mov cx,last\r
+ sub ecx,eax\r
+ inc ecx\r
+ mov dx,03c8h\r
+ out dx,al\r
+ inc dx\r
+ mov esi,[pal]\r
+ add esi,eax\r
+ add esi,eax\r
+ add esi,eax\r
+ mov eax,ecx\r
+ add ecx,eax\r
+ add ecx,eax\r
+ rep outsb\r
+end;\r
+\r
+const\r
+ fade_first: Byte = 0;\r
+ fade_last: Byte = 255;\r
+\r
+procedure wait_ms; assembler;\r
+asm\r
+@@1: mov di,-1*1193*2\r
+ xor al,al\r
+ out 43h,al\r
+ in al,40h\r
+ mov bl,al\r
+ in al,40h\r
+ mov bh,al\r
+@@2: xor al,al\r
+ out 43h,al\r
+ in al,40h\r
+ mov ah,al\r
+ in al,40h\r
+ xchg ah,al\r
+ sub ax,bx\r
+ cmp ax,di\r
+ jnc @@2\r
+end;\r
+\r
+procedure VgaFade(var data: tFADE_BUF; fade: tFADE; delay: tDELAY);\r
+\r
+var\r
+ i,j: Byte;\r
+\r
+begin\r
+ If (fade = fadeOut) and (data.action in [first,fadeIn]) then\r
+ begin\r
+ GetPalette(data.pal0,fade_first,fade_last);\r
+ If delay = delayed then\r
+ For i := fade_speed downto 0 do\r
+ begin\r
+ For j := fade_first to fade_last do\r
+ begin\r
+ data.pal1[j].r := data.pal0[j].r * i DIV fade_speed;\r
+ data.pal1[j].g := data.pal0[j].g * i DIV fade_speed;\r
+ data.pal1[j].b := data.pal0[j].b * i DIV fade_speed;\r
+ end;\r
+ SetPalette(data.pal1,fade_first,fade_last);\r
+ wait_ms;\r
+ end\r
+ else\r
+ begin\r
+ FillChar(data.pal1,SizeOf(data.pal1),0);\r
+ SetPalette(data.pal1,fade_first,fade_last);\r
+ end;\r
+ data.action := fadeOut;\r
+ end;\r
+\r
+ If (fade = fadeIn) and (data.action = fadeOut) then\r
+ begin\r
+ If delay = delayed then\r
+ For i := 0 to fade_speed do\r
+ begin\r
+ For j := fade_first to fade_last do\r
+ begin\r
+ data.pal1[j].r := data.pal0[j].r * i DIV fade_speed;\r
+ data.pal1[j].g := data.pal0[j].g * i DIV fade_speed;\r
+ data.pal1[j].b := data.pal0[j].b * i DIV fade_speed;\r
+ end;\r
+ SetPalette(data.pal1,fade_first,fade_last);\r
+ wait_ms;\r
+ end\r
+ else\r
+ SetPalette(data.pal0,fade_first,fade_last);\r
+ data.action := fadeIn;\r
+ end;\r
+end;\r
+\r
+procedure RefreshEnable; assembler;\r
+asm mov ax,1200h; mov bl,36h; int 10h end;\r
+\r
+procedure RefreshDisable; assembler;\r
+asm mov ax,1201h; mov bl,36h; int 10h end;\r
+\r
+procedure Split2Static;\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ temp := PORT[$3da];\r
+ PORT[$3c0] := $10 OR $20;\r
+ PORT[$3c0] := PORT[$3c1] OR $20;\r
+end;\r
+\r
+procedure SplitScr(line: Integer);\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ PORT[$3d4] := $18;\r
+ PORT[$3d5] := LO(line);\r
+ PORT[$3d4] := $07;\r
+ temp := PORT[$3d5];\r
+\r
+ If (line < $100) then temp := temp AND $0ef\r
+ else temp := temp OR $10;\r
+\r
+ PORT[$3d5] := temp;\r
+ PORT[$3d4] := $09;\r
+ temp := PORT[$3d5];\r
+\r
+ If (line < $200) then temp := temp AND $0bf\r
+ else temp := temp OR $40;\r
+\r
+ PORT[$3d5] := temp;\r
+end;\r
+\r
+procedure SetSize(columns,lines: Integer);\r
+begin\r
+ PORT[$3d4] := $13;\r
+ PORT[$3d5] := columns SHR 1;\r
+ MEMW[$0000:$44a] := columns;\r
+ MEMW[$0000:$484] := lines-1;\r
+ MEMW[$0000:$44c] := columns*lines;\r
+end;\r
+\r
+procedure SetTextDisp(x,y: Integer);\r
+\r
+var\r
+ temp: Byte;\r
+\r
+begin\r
+ While (PORT[$3da] AND 1 = 1) do ;\r
+ While (PORT[$3da] AND 1 <> 1) do ;\r
+\r
+ PORT[$3d4] := $0c;\r
+ PORT[$3d5] := HI((y SHR 4)*MaxCol+(x DIV 9));\r
+ PORT[$3d4] := $0d;\r
+ PORT[$3d5] := LO((y SHR 4)*MaxCol+(x DIV 9));\r
+ PORT[$3d4] := $08;\r
+ PORT[$3d5] := (PORT[$3d5] AND $0e0) OR (y AND $0f);\r
+ temp := PORT[$3da];\r
+ PORT[$3c0] := $13 OR $20;\r
+ PORT[$3c0] := (x+9) MOD 9;\r
+end;\r
+\r
+procedure SetCustomVideoMode(vmode: tCUSTOM_VIDEO_MODE);\r
+\r
+const\r
+ vmode_data: array[0..52,0..63] of Byte = (\r
+\r
+{ 1..5 - BIOS variables,\r
+ 6..9 - Sequencer,\r
+ 10 - Miscellaneous Output,\r
+ 11..35 - CRTC,\r
+ 36..55 - Attribute,\r
+ 56..64 - Graphics }\r
+\r
+{ 0, Text 36x14, 9x14, complete }\r
+( 36, 13, 14, 0, 4, 8, 3, 0, 2, 99,\r
+ 40, 35, 36,138, 38,192,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 18, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 1, Text 40x14, 8x14, complete }\r
+( 40, 13, 14, 0, 5, 9, 3, 0, 2, 99,\r
+ 45, 39, 40,144, 43,160,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 20, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 2, Text 40x14, 9x14, complete }\r
+( 40, 13, 14, 0, 5, 8, 3, 0, 2, 103,\r
+ 45, 39, 40,144, 43,160,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 20, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 3, Text 46x14, 8x14, complete }\r
+( 46, 13, 14, 0, 6, 9, 3, 0, 2, 103,\r
+ 52, 45, 46,151, 50,150,183, 31, 0,205, 11, 12, 0, 0, 0,\r
+ 0,148,134,135, 23, 31,142,177,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 4, Text 36x15, 9x16, complete }\r
+( 36, 14, 16, 0, 5, 8, 3, 0, 2, 227,\r
+ 40, 35, 36,138, 38,192, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 18, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 5, Text 40x15, 8x16, complete }\r
+( 40, 14, 16, 0, 5, 9, 3, 0, 2, 227,\r
+ 45, 39, 40,144, 43,160, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 20, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 6, Text 40x15, 9x16, complete }\r
+( 40, 14, 16, 0, 5, 8, 3, 0, 2, 231,\r
+ 45, 39, 40,144, 43,160, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 20, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 7, Text 46x15, 8x16, complete }\r
+( 46, 14, 16, 0, 6, 9, 3, 0, 2, 231,\r
+ 52, 45, 46,151, 50,150, 11, 62, 0,207, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 23, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 8, Text 36x17, 9x14, complete }\r
+( 36, 16, 14, 0, 5, 8, 3, 0, 2, 227,\r
+ 40, 35, 36,138, 38,192, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 18, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 9, Text 40x17, 8x14, complete }\r
+( 40, 16, 14, 0, 6, 9, 3, 0, 2, 227,\r
+ 45, 39, 40,144, 43,160, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 20, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 10, Text 40x17, 9x14, complete }\r
+( 40, 16, 14, 0, 6, 8, 3, 0, 2, 231,\r
+ 45, 39, 40,144, 43,160, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 20, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 11, Text 46x17, 9x14, complete }\r
+( 46, 16, 14, 0, 7, 9, 3, 0, 2, 231,\r
+ 52, 45, 46,151, 50,150, 7, 62, 0,205, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 23, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 12, Text 36x22, 9x16, complete }\r
+( 36, 21, 16, 0, 7, 8, 3, 0, 2, 163,\r
+ 40, 35, 36,138, 38,192,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 18, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 13, Text 40x22, 8x16, complete }\r
+( 40, 21, 16, 0, 7, 9, 3, 0, 2, 163,\r
+ 45, 39, 40,144, 43,160,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 20, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 14, Text 40x22, 9x16, complete }\r
+( 40, 21, 16, 0, 7, 8, 3, 0, 2, 167,\r
+ 45, 39, 40,144, 43,160,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 20, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 15, Text 46x22, 8x16, complete }\r
+( 46, 21, 16, 0, 8, 9, 3, 0, 2, 167,\r
+ 52, 45, 46,151, 50,150,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 23, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 16, Text 70x22, 9x16, complete }\r
+( 70, 21, 16, 0,13, 0, 3, 0, 2, 163,\r
+ 83, 69, 70,150, 75, 21,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 35, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 17, Text 80x22, 8x16, complete }\r
+( 80, 21, 16, 0,14, 1, 3, 0, 2, 163,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 40, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 18, Text 80x22, 9x16, complete }\r
+( 80, 21, 16, 0,14, 0, 3, 0, 2, 167,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 40, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 19, Text 90x22, 8x16, complete }\r
+( 90, 21, 16, 0,16, 1, 3, 0, 2, 167,\r
+ 107, 89, 90,142, 95,138,193, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,133,165, 95, 45, 31,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 20, Text 36x25, 9x16, complete }\r
+( 36, 24, 16, 0, 8, 8, 3, 0, 2, 99,\r
+ 40, 35, 36,138, 38,192,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 18, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 21, Text 40x25, 8x16, complete }\r
+( 40, 24, 16, 0, 8, 9, 3, 0, 2, 99,\r
+ 45, 39, 40,144, 43,160,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 20, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 22, Text 40x25, 9x16, complete }\r
+( 40, 24, 16, 0, 8, 8, 3, 0, 2, 103,\r
+ 45, 39, 40,144, 43,160,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 20, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 23, Text 46x25, 8x16, complete }\r
+( 46, 24, 16, 0,10, 9, 3, 0, 2, 103,\r
+ 52, 45, 46,151, 50,150,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 23, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 24, Text 70x25, 9x16, complete }\r
+( 70, 24, 16, 0,14, 0, 3, 0, 2, 99,\r
+ 83, 69, 70,150, 75, 21,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 35, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 25, Text 80x25, 8x16, complete }\r
+( 80, 24, 16, 0,16, 1, 3, 0, 2, 99,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 26, Text 80x25, 9x16, standard }\r
+( 80, 24, 16, 0,16, 0, 3, 0, 2, 103,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 27, Text 90x25, 8x16, complete }\r
+( 90, 24, 16, 0, 18 , 1, 3, 0, 2, 103,\r
+ 107, 89, 90,142, 95,138,191, 31, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,156,142,143, 45, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 28, Text 46x29, 8x16, complete }\r
+( 46, 28, 14, 0,11, 9, 3, 0, 2, 103,\r
+ 52, 45, 46,151, 50,150,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 23, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 29, Text 70x29, 9x14, complete }\r
+( 70, 28, 14, 0, 16 , 0, 3, 0, 2, 99,\r
+ 83, 69, 70,150, 75, 21,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 35, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 30, Text 80x29, 8x14, complete }\r
+( 80, 28, 14, 0, 19 , 1, 3, 0, 2, 99,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 40, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 31, Text 80x29, 9x14, complete }\r
+( 80, 28, 14, 0, 19 , 0, 3, 0, 2, 103,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 40, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 32, Text 90x29, 8x14, complete }\r
+( 90, 28, 14, 0, 21 , 1, 3, 0, 2, 103,\r
+ 107, 89, 90,142, 95,138,193, 31, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,159,145,149, 45, 31,155,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 33, Text 70x30, 9x16, complete }\r
+( 70, 29, 16, 0, 17 , 0, 3, 0, 2, 227,\r
+ 83, 69, 70,150, 75, 21, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 35, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 34, Text 80x30, 8x16, complete }\r
+( 80, 29, 16, 0, 19 , 1, 3, 0, 2, 227,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 35, Text 80x30, 9x16, complete }\r
+( 80, 29, 16, 0, 19 , 0, 3, 0, 2, 231,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 36, Text 90x30, 8x16 ,complete }\r
+( 90, 29, 16, 0, 22 , 1, 3, 0, 2, 231,\r
+ 107, 89, 90,142, 95,138, 11, 62, 0, 79, 13, 14, 0, 0, 0,\r
+ 0,234,172,223, 45, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 37, Text 70x34, 9x14, complete }\r
+( 70, 33, 14, 0, 19 , 0, 3, 0, 2, 227,\r
+ 83, 69, 70,150, 75, 21, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 35, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 38, Text 80x34, 8x14, complete }\r
+( 80, 33, 14, 0, 22 , 1, 3, 0, 2, 227,\r
+ 95, 79, 80,130, 85,129, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 40, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 39, Text 80x34, 9x14, complete }\r
+( 80, 33, 14, 0, 22 , 0, 3, 0, 2, 231,\r
+ 95, 79, 80,130, 85,129, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 40, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 40, Text 90x34, 8x14, complete }\r
+( 90, 33, 14, 0, 24 , 1, 3, 0, 2, 231,\r
+ 107, 89, 90,142, 95,138, 7, 62, 0, 77, 11, 12, 0, 0, 0,\r
+ 0,230,168,219, 45, 31,227, 2,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 41, Text 70x44, 9x8, complete }\r
+( 70, 43, 8, 0,25, 0, 3, 0, 2, 163,\r
+ 83, 69, 70,150, 75, 21,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 35, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 42, Text 80x44, 8x8, complete }\r
+( 80, 43, 8, 0,28, 1, 3, 0, 2, 163,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 40, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 43, Text 80x44, 9x8, complete }\r
+( 80, 43, 8, 0,28, 0, 3, 0, 2, 167,\r
+ 95, 79, 80,130, 85,129,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 40, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 44, Text 90x44, 8x8, complete }\r
+( 90, 43, 8, 0,31, 1, 3, 0, 2, 167,\r
+ 107, 89, 90,142, 95,138,193, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,133,135, 95, 45, 15,101,187,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 45, Text 70x50, 9x8, complete }\r
+( 70, 49, 8, 0,28, 0, 3, 0, 2, 99,\r
+ 83, 69, 70,150, 75, 21,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 35, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 46, Text 80x50, 8x8, complete }\r
+( 80, 49, 8, 0,32, 1, 3, 0, 2, 99,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 47, Text 80x50, 9x8, standard }\r
+( 80, 49, 8, 0,32, 0, 3, 0, 2, 103,\r
+ 95, 79, 80,130, 85,129,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 40, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 12, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 48, Text 90x50, 8x8, complete }\r
+( 90, 49, 8, 0, 36 , 1, 3, 0, 2, 103,\r
+ 107, 89, 90,142, 95,138,191, 31, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,156,142,143, 45, 31,150,185,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+\r
+{ 49, Text 70x60, 9x8, complete }\r
+( 70, 59, 8, 0, 33 , 0, 3, 0, 2, 227,\r
+ 83, 69, 70,150, 75, 21, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 35, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 50, Text 80x60, 8x8, complete }\r
+( 80, 59, 8, 0, 38 , 1, 3, 0, 2, 227,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 51, Text 80x60, 9x8, complete }\r
+( 80, 59, 8, 0, 38 , 0, 3, 0, 2, 231,\r
+ 95, 79, 80,130, 85,129, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 40, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 8,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255),\r
+\r
+{ 52, Text 90x60, 8x8, complete }\r
+( 90, 59, 8,128, 42 , 1, 3, 0, 2, 231,\r
+ 107, 89, 90,142, 95,138, 11, 62, 0, 71, 6, 7, 0, 0, 0,\r
+ 0,234,172,223, 45, 31,231, 6,163,255, 0, 1, 2, 3, 4,\r
+ 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63, 8, 0, 15, 0,\r
+ 0, 0, 0, 0, 0, 16, 14, 0, 255)\r
+\r
+);\r
+\r
+begin\r
+ asm\r
+ movzx eax,vmode\r
+ shl eax,6\r
+ lea esi,[vmode_data]\r
+ add esi,eax\r
+ mov dx,3cch\r
+ in al,dx\r
+ mov dl,0d4h\r
+ test al,1\r
+ jnz @@1\r
+ mov dl,0b4h\r
+ @@1: add dx,6\r
+ in al,dx\r
+ xor al,al\r
+ mov dx,3c0h\r
+ out dx,al\r
+ mov ax,100h\r
+ mov dx,3c4h\r
+ out dx,ax\r
+ add esi,5\r
+ mov ecx,4\r
+ mov al,1\r
+ mov dx,3c4h\r
+ @@2: mov ah,[esi]\r
+ inc esi\r
+ out dx,ax\r
+ inc al\r
+ loop @@2\r
+ mov al,[esi]\r
+ inc esi\r
+ mov dx,3c2h\r
+ out dx,al\r
+ mov dx,3c4h\r
+ mov ax,300h\r
+ out dx,ax\r
+ mov dx,3cch\r
+ in al,dx\r
+ mov dl,0d4h\r
+ test al,1\r
+ jnz @@3\r
+ mov dl,0b4h\r
+ @@3: movzx edi,SEG0040\r
+ shl edi,4\r
+ add edi,63h\r
+ shl edi,4\r
+ mov [edi],dx\r
+ mov al,11h\r
+ out dx,al\r
+ inc dx\r
+ mov ah,al\r
+ in al,dx\r
+ dec dx\r
+ xchg al,ah\r
+ and ah,7fh\r
+ out dx,ax\r
+ mov ecx,25\r
+ xor al,al\r
+ @@4: mov ah,[esi]\r
+ inc esi\r
+ out dx,ax\r
+ inc al\r
+ loop @@4\r
+ add dx,6\r
+ in al,dx\r
+ xor ah,ah\r
+ mov ecx,20\r
+ mov dx,3c0h\r
+ @@5: mov al,ah\r
+ out dx,al\r
+ inc ah\r
+ mov al,[esi]\r
+ inc esi\r
+ out dx,al\r
+ loop @@5\r
+ xor al,al\r
+ mov ecx,9\r
+ mov dx,3ceh\r
+ @@6: mov ah,[esi]\r
+ inc esi\r
+ out dx,ax\r
+ inc al\r
+ loop @@6\r
+ mov dx,3c0h\r
+ mov al,32\r
+ out dx,al\r
+ end;\r
+\r
+ MEM[SEG0040:$4a] := vmode_data[vmode,0];\r
+ MEM[SEG0040:$84] := vmode_data[vmode,1];\r
+ MEM[SEG0040:$85] := vmode_data[vmode,2];\r
+ MEM[SEG0040:$4c] := vmode_data[vmode,3];\r
+ MEM[SEG0040:$4d] := vmode_data[vmode,4];\r
+ FillChar(MEM[SEG0040:$4e],17,0);\r
+\r
+ MEM[SEG0040:$60] := vmode_data[vmode,20];\r
+ MEM[SEG0040:$61] := vmode_data[vmode,21];\r
+ MEM[SEG0040:$62] := 0;\r
+\r
+ Case vmode_data[vmode,2] of\r
+ 8: asm mov ah,11h; mov al,2; xor bx,bx; int 10h end;\r
+ 14: asm mov ah,11h; mov al,1; xor bx,bx; int 10h end;\r
+ 16: asm mov ah,11h; mov al,4; xor bx,bx; int 10h end;\r
+ end;\r
+\r
+ initialize;\r
+ CleanScreen(Ptr(v_seg,v_ofs)^);\r
+end;\r
+\r
+begin\r
+ initialize;\r
+end.\r