'*****************************************************************************
'* 
'* VIDEO BIOS INITIALIZATION (Executed by main "bios" script)
'* 
'* Note: - Called by main "bios" script to init video bios at C000h segment
'* 
'*****************************************************************************

public procedure InitVideoBIOS(video as string="cga")

'Write video BIOS stub header (for whole 0xC000:0x0000-0xFFFF)
mem.Word(0xC0000+0)=0xAA55 'marker
mem.Byte(0xC0000+2)=0x10000/512 'size (count of 512-byte blocks)
mem.Byte(0xC0000+3)=0xCB 'RETF - first byte of video BIOS code
mem.Pos=0xC001E : mem.Byte=0x49 : mem.Byte=0x42 : mem.Byte=0x4D 'IBM signature

'Write complete 8x8 charset (256 symbols) to (C000h:1000h)
mem.Bytes(0xC0000+0x1000)=ArrayFile("Fonts\ru8x8.fnt",0,256*8)

'Write pointer to second part of charset (80h..FFh) to vector INT 1Fh (CGA)
mem.Dword(0x1F*4)=shl(0xC140,16) 'seg=C140h, offs=0 (for max. compatibility)

'Write complete charset pointer (00h..FFh) to vector INT 43h (EGA/VGA)
mem.Dword(0x43*4)=shl(0xC100,16) 'seg=C100h, offs=0 (for max. compatibility)

'Write video BIOS control sum byte at (0xC000:FFFFh)
dim i as integer, sum as byte=0 
for i=0xC0000 to 0xC0000+0xFFFF : sum=sum+mem.Byte(i) : next
mem.Byte(0xC0000+0xFFFF)=0-sum 'control sum must be zero

'Specific video BIOS initialization
select case UCase(video) 
 case "VGA": Exec("vga\init") 'VGA
 case else:  Exec("cga\init") 'CGA
end select

end