'*****************************************************************************
'* INT 10H AH=10h (VGA BIOS) COLOR MANAGEMENT
'*****************************************************************************

protected function Exec as boolean

select case cpu.AL
case 0 //write base EGA/VGA palette color
  pc.ReadPort(0x3DA) : pc.WritePort(0x3C0,cpu.BL) : pc.WritePort(0x3C1,cpu.BH)
case 2 //write base EGA/VGA palette colors and border color
   mem.Pos=cpu.ESPhisBase+cpu.DX : dim i as integer
   for i=0 to 16 
     pc.ReadPort(0x3DA) : pc.WritePort(0x3C0,i) : pc.WritePort(0x3C1,mem.Byte)
   next
case 0x10 //write DAC register color
   pc.WritePort(0x3C8,cpu.BL) : pc.WritePort(0x3C9,cpu.DH)
   pc.WritePort(0x3C9,cpu.CH) : pc.WritePort(0x3C9,cpu.CL)
case 0x15 //read DAC register color
   pc.WritePort(0x3C7,cpu.BL) : cpu.DH=pc.ReadPort(0x3C9)
   cpu.CH=pc.ReadPort(0x3C9) : cpu.CL=pc.ReadPort(0x3C9)
case 0x12 //write DAC registers colors
   dim w as word=cpu.BL+cpu.CX-1, b as byte, i as integer
   if w>255 then b=255 else b=w : mem.Pos=cpu.ESPhisBase+cpu.DX
   for i=cpu.BL to b 
    pc.WritePort(0x3C8,i) 
    pc.WritePort(0x3C9,mem.Byte) : pc.WritePort(0x3C9,mem.Byte)
    pc.WritePort(0x3C9,mem.Byte)
   next
case 0x13 //select color pages 
   //TODO
case 0x17 //read DAC registers colors
   dim w as word=cpu.BL+cpu.CX-1, b as byte, i as integer
   if w>255 then b=255 else b=w : mem.Pos=cpu.ESPhisBase+cpu.DX
   for i=cpu.BL to b 
    pc.WritePort(0x3C7,i) :  mem.Byte=pc.ReadPort(0x3C9)
    mem.Byte=pc.ReadPort(0x3C9) : mem.Byte=pc.ReadPort(0x3C9)
   next
case else : exit(false)
end select

//success
result=true : end