Started work on Text16-Mode part of the int 0x30 Video Drived
This commit is contained in:
parent
bed680aeb2
commit
58c7d9e0b9
18 changed files with 164 additions and 45 deletions
2
build.nr
2
build.nr
|
|
@ -1 +1 @@
|
||||||
1602
|
1603
|
||||||
|
|
|
||||||
6
compile
6
compile
|
|
@ -5,7 +5,7 @@ rm -r bin
|
||||||
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||||
cmake -B bin -S ./
|
cmake -B bin -S ./
|
||||||
cd bin
|
cd bin
|
||||||
make
|
make -j$(grep -c ^processor /proc/cpuinfo)
|
||||||
mkdir disassembly
|
mkdir disassembly
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
cd ..
|
cd ..
|
||||||
|
|
@ -19,7 +19,7 @@ if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||||
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
||||||
cmake -B bin -S ./ -G "MinGW Makefiles"
|
cmake -B bin -S ./ -G "MinGW Makefiles"
|
||||||
cd bin
|
cd bin
|
||||||
mingw32-make.exe
|
mingw32-make.exe -j16
|
||||||
mkdir disassembly
|
mkdir disassembly
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
cd ..
|
cd ..
|
||||||
|
|
@ -30,4 +30,4 @@ elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
||||||
else
|
else
|
||||||
cd ..
|
cd ..
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,4 @@ memory_extension_pages = 16
|
||||||
|
|
||||||
SingleColor_foreground = #009900FF
|
SingleColor_foreground = #009900FF
|
||||||
SingleColor_background = #111111FF
|
SingleColor_background = #111111FF
|
||||||
16Color_Palette = config/test_palette.dpal
|
16Color_Palette = 0
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -39,6 +39,8 @@
|
||||||
KEY_PRESSED 0xA0
|
KEY_PRESSED 0xA0
|
||||||
KEY_RELEASED 0xA1
|
KEY_RELEASED 0xA1
|
||||||
TEXT_ENTERED 0xA2
|
TEXT_ENTERED 0xA2
|
||||||
|
|
||||||
|
TEXT16_SCREEN_REFRESHED 0xE0
|
||||||
@end
|
@end
|
||||||
@raw_export_end
|
@raw_export_end
|
||||||
@export_comment BIOS_API " --\n"
|
@export_comment BIOS_API " --\n"
|
||||||
|
|
@ -57,10 +59,12 @@
|
||||||
TEXT_SIGNLE_STR { MemoryAddresses.VGA + 0x0006 }
|
TEXT_SIGNLE_STR { MemoryAddresses.VGA + 0x0006 }
|
||||||
|
|
||||||
MEMORY_CONTROLLER_X { MemoryAddresses.VGA + 0x0080 }
|
MEMORY_CONTROLLER_X { MemoryAddresses.VGA + 0x0080 }
|
||||||
MEMORY_CONTROLLER_Y { MemoryAddresses.VGA + 0x0084 }
|
MEMORY_CONTROLLER_X_BYTE { MemoryAddresses.VGA + 0x0080 + 1 }
|
||||||
MEMORY_CONTROLLER_CHAR { MemoryAddresses.VGA + 0x0088 }
|
MEMORY_CONTROLLER_Y { MemoryAddresses.VGA + 0x0082 }
|
||||||
MEMORY_CONTROLLER_BG_COL { MemoryAddresses.VGA + 0x0089 }
|
MEMORY_CONTROLLER_Y_BYTE { MemoryAddresses.VGA + 0x0082 + 1 }
|
||||||
MEMORY_CONTROLLER_FG_COL { MemoryAddresses.VGA + 0x008A }
|
MEMORY_CONTROLLER_CHAR { MemoryAddresses.VGA + 0x0084 }
|
||||||
|
MEMORY_CONTROLLER_BG_COL { MemoryAddresses.VGA + 0x0085 }
|
||||||
|
MEMORY_CONTROLLER_FG_COL { MemoryAddresses.VGA + 0x0086 }
|
||||||
|
|
||||||
BUFF_START { MemoryAddresses.VGA + 0x00E0 }
|
BUFF_START { MemoryAddresses.VGA + 0x00E0 }
|
||||||
@end
|
@end
|
||||||
|
|
@ -159,7 +163,7 @@
|
||||||
|
|
||||||
@export_comment BIOS_API " Structure to store a character cell for the Text16-Video-Mode."
|
@export_comment BIOS_API " Structure to store a character cell for the Text16-Video-Mode."
|
||||||
@raw_export_start BIOS_API
|
@raw_export_start BIOS_API
|
||||||
@struct Text16VModeTextCell
|
@struct Text16VModeCell
|
||||||
Character:1
|
Character:1
|
||||||
Foreground:1
|
Foreground:1
|
||||||
Background:1
|
Background:1
|
||||||
|
|
|
||||||
|
|
@ -128,7 +128,16 @@ _int_30_print_string_buffered:
|
||||||
jmp $_int_30_end
|
jmp $_int_30_end
|
||||||
|
|
||||||
_int_30_write_vram_text16:
|
_int_30_write_vram_text16:
|
||||||
|
movb [VGA_Registers.MEMORY_CONTROLLER_CHAR], *R9
|
||||||
|
inc R9
|
||||||
|
movb [VGA_Registers.MEMORY_CONTROLLER_FG_COL], *R9
|
||||||
|
inc R9
|
||||||
|
movb [VGA_Registers.MEMORY_CONTROLLER_BG_COL], *R9
|
||||||
|
inc R9
|
||||||
|
movb [VGA_Registers.MEMORY_CONTROLLER_X_BYTE], *R9
|
||||||
|
inc R9
|
||||||
|
movb [VGA_Registers.MEMORY_CONTROLLER_Y_BYTE], *R9
|
||||||
|
movb [VGA_Registers.SIGNAL], Sig_VGA_Text_16_Color.WRITE_VRAM
|
||||||
jmp $_int_30_end
|
jmp $_int_30_end
|
||||||
_int_30_read_vram_text16:
|
_int_30_read_vram_text16:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
## --
|
## --
|
||||||
## -- This file is automatically generated by the DragonAssembler (version 0.4.1601)
|
## -- This file is automatically generated by the DragonAssembler (version 0.4.1602)
|
||||||
## -- Please do not modify this file in any way.
|
## -- Please do not modify this file in any way.
|
||||||
## --
|
## --
|
||||||
|
|
||||||
|
|
@ -20,19 +20,27 @@
|
||||||
KEY_PRESSED 0xA0
|
KEY_PRESSED 0xA0
|
||||||
KEY_RELEASED 0xA1
|
KEY_RELEASED 0xA1
|
||||||
TEXT_ENTERED 0xA2
|
TEXT_ENTERED 0xA2
|
||||||
|
TEXT16_SCREEN_REFRESHED 0xE0
|
||||||
@end
|
@end
|
||||||
## --
|
## --
|
||||||
|
|
||||||
## These are the memory-mapped registers used to interact with the video card's interface.
|
## These are the memory-mapped registers used to interact with the video card's interface.
|
||||||
@group VGA_Registers
|
@group VGA_Registers
|
||||||
VIDEO_MODE { MemoryAddresses.VGA + 0x0000 }
|
VIDEO_MODE { MemoryAddresses.VGA + 0x0000 }
|
||||||
CLEAR_COLOR { MemoryAddresses.VGA + 0x0001 }
|
CLEAR_COLOR { MemoryAddresses.VGA + 0x0001 }
|
||||||
PALETTE { MemoryAddresses.VGA + 0x0002 }
|
PALETTE { MemoryAddresses.VGA + 0x0002 }
|
||||||
SIGNAL { MemoryAddresses.VGA + 0x0003 }
|
SIGNAL { MemoryAddresses.VGA + 0x0003 }
|
||||||
TEXT_SINGLE_CHAR { MemoryAddresses.VGA + 0x0004 }
|
TEXT_SINGLE_CHAR { MemoryAddresses.VGA + 0x0004 }
|
||||||
TEXT_SIGNLE_INVERT { MemoryAddresses.VGA + 0x0005 }
|
TEXT_SIGNLE_INVERT { MemoryAddresses.VGA + 0x0005 }
|
||||||
TEXT_SIGNLE_STR { MemoryAddresses.VGA + 0x0006 }
|
TEXT_SIGNLE_STR { MemoryAddresses.VGA + 0x0006 }
|
||||||
BUFF_START { MemoryAddresses.VGA + 0x00E0 }
|
MEMORY_CONTROLLER_X { MemoryAddresses.VGA + 0x0080 }
|
||||||
|
MEMORY_CONTROLLER_X_BYTE { MemoryAddresses.VGA + 0x0080 + 1 }
|
||||||
|
MEMORY_CONTROLLER_Y { MemoryAddresses.VGA + 0x0082 }
|
||||||
|
MEMORY_CONTROLLER_Y_BYTE { MemoryAddresses.VGA + 0x0082 + 1 }
|
||||||
|
MEMORY_CONTROLLER_CHAR { MemoryAddresses.VGA + 0x0084 }
|
||||||
|
MEMORY_CONTROLLER_BG_COL { MemoryAddresses.VGA + 0x0085 }
|
||||||
|
MEMORY_CONTROLLER_FG_COL { MemoryAddresses.VGA + 0x0086 }
|
||||||
|
BUFF_START { MemoryAddresses.VGA + 0x00E0 }
|
||||||
@end
|
@end
|
||||||
## --
|
## --
|
||||||
|
|
||||||
|
|
@ -57,6 +65,16 @@
|
||||||
@end
|
@end
|
||||||
## --
|
## --
|
||||||
|
|
||||||
|
## These are signals used to comunicate with the video card's interface, when in TEXT16_COLOR mode.
|
||||||
|
@group Sig_VGA_Text_16_Color
|
||||||
|
CONTINUE 0x00
|
||||||
|
READ_VRAM 0x10
|
||||||
|
WRITE_VRAM 0x11
|
||||||
|
FORCE_REFRESH_SCREEN 0xE0
|
||||||
|
FORCE_CLEAR_SCREEN 0xE1
|
||||||
|
@end
|
||||||
|
## --
|
||||||
|
|
||||||
## Structure of a DPT (Dragon Partition Table).
|
## Structure of a DPT (Dragon Partition Table).
|
||||||
@group DPTStructure
|
@group DPTStructure
|
||||||
DISK_ADDR 0x0200
|
DISK_ADDR 0x0200
|
||||||
|
|
@ -81,3 +99,13 @@
|
||||||
@end
|
@end
|
||||||
## --
|
## --
|
||||||
|
|
||||||
|
## Structure to store a character cell for the Text16-Video-Mode.
|
||||||
|
@struct Text16VModeCell
|
||||||
|
Character:1
|
||||||
|
Foreground:1
|
||||||
|
Background:1
|
||||||
|
CoordX:1
|
||||||
|
CoordY:1
|
||||||
|
@end
|
||||||
|
## --
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,49 @@
|
||||||
$string "Hello "
|
$string "Hello "
|
||||||
$ddd <DiskDriverData>
|
$ddd <DiskDriverData>
|
||||||
$dpt_block <DPTBlock>
|
$dpt_block <DPTBlock>
|
||||||
|
$textCell <Text16VModeCell>
|
||||||
|
|
||||||
.code
|
.code
|
||||||
push 0
|
push 0
|
||||||
call $_load_dpt_block
|
call $_load_dpt_block
|
||||||
|
|
||||||
|
movb [VGA_Registers.VIDEO_MODE], VGA_VideoModes.TEXT_16_COLORS
|
||||||
|
|
||||||
|
mov R5, 0
|
||||||
|
draw_loop:
|
||||||
|
|
||||||
|
movb [$textCell.Character], 65
|
||||||
|
movb [$textCell.Foreground], 6
|
||||||
|
movb [$textCell.Background], 0
|
||||||
|
movb [$textCell.CoordX], R5
|
||||||
|
movb [$textCell.CoordY], 1
|
||||||
|
|
||||||
|
mov R10, 0x21
|
||||||
|
mov R9, $textCell
|
||||||
|
int 0x30
|
||||||
|
|
||||||
|
inc R5
|
||||||
|
mov ACC, R5
|
||||||
|
jgr $draw_loop, 90
|
||||||
|
|
||||||
|
mov R5, 0
|
||||||
|
draw_loop2:
|
||||||
|
|
||||||
|
movb [$textCell.Character], 65
|
||||||
|
movb [$textCell.Foreground], 6
|
||||||
|
movb [$textCell.Background], 0
|
||||||
|
movb [$textCell.CoordX], R5
|
||||||
|
movb [$textCell.CoordY], 10
|
||||||
|
|
||||||
|
mov R10, 0x21
|
||||||
|
mov R9, $textCell
|
||||||
|
int 0x30
|
||||||
|
|
||||||
|
inc R5
|
||||||
|
mov ACC, R5
|
||||||
|
jgr $draw_loop2, 90
|
||||||
|
|
||||||
|
|
||||||
mov R10, 0x0C
|
mov R10, 0x0C
|
||||||
mov R9, $string
|
mov R9, $string
|
||||||
int 0x30
|
int 0x30
|
||||||
|
|
|
||||||
|
|
@ -102,8 +102,8 @@
|
||||||
0x06: (2 bytes) Text Single Color Buffered String Address
|
0x06: (2 bytes) Text Single Color Buffered String Address
|
||||||
|
|
||||||
0x80: Memory Controller
|
0x80: Memory Controller
|
||||||
0x80: XCoordinate (4 Bytes)
|
0x80: XCoordinate (2 Bytes)
|
||||||
0x84: YCoordinate (4 Bytes)
|
0x84: YCoordinate (2 Bytes)
|
||||||
0x88: Character (1 Byte)
|
0x88: Character (1 Byte)
|
||||||
0x09: Foreground (1 Byte)
|
0x09: Foreground (1 Byte)
|
||||||
0x8A: Background (1 Byte)
|
0x8A: Background (1 Byte)
|
||||||
|
|
@ -142,6 +142,9 @@
|
||||||
0x0A: Store Null-Terminated String in buffer in Text Single Mode (string address stored in R9 register)
|
0x0A: Store Null-Terminated String in buffer in Text Single Mode (string address stored in R9 register)
|
||||||
0x0B: Toggles inverted colors in Text Single Mode
|
0x0B: Toggles inverted colors in Text Single Mode
|
||||||
|
|
||||||
|
0x20: Read VRAM in Text16 Colors Mode (Cell address stored in R9)
|
||||||
|
0x20: Write VRAM in Text16 Colors Mode (Cell address stored in R9)
|
||||||
|
|
||||||
0xE0: Refresh Screen
|
0xE0: Refresh Screen
|
||||||
0xE1: Clear Screen
|
0xE1: Clear Screen
|
||||||
|
|
||||||
|
|
@ -153,6 +156,7 @@
|
||||||
0xA0: Keyboard Interface - Key Pressed
|
0xA0: Keyboard Interface - Key Pressed
|
||||||
0xA1: Keyboard Interface - Key Released
|
0xA1: Keyboard Interface - Key Released
|
||||||
0xA2: Keyboard Interface - Text Entered
|
0xA2: Keyboard Interface - Text Entered
|
||||||
|
0xE0: Virtual Display - Text16_Mode Screen Refreshed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ clear='\033[0m'
|
||||||
printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}"
|
printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}"
|
||||||
\cp -r ../extra/* ./
|
\cp -r ../extra/* ./
|
||||||
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||||
make
|
make -j$(grep -c ^processor /proc/cpuinfo)
|
||||||
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
||||||
mingw32-make.exe
|
mingw32-make.exe -j16
|
||||||
fi
|
fi
|
||||||
printf "${green}\n=================================================================================================================\n\n"
|
printf "${green}\n=================================================================================================================\n\n"
|
||||||
|
|
@ -6,9 +6,9 @@ clear='\033[0m'
|
||||||
printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}"
|
printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}"
|
||||||
\cp -r ../extra/* ./
|
\cp -r ../extra/* ./
|
||||||
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||||
make
|
make -j$(grep -c ^processor /proc/cpuinfo)
|
||||||
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
||||||
mingw32-make.exe
|
mingw32-make.exe -j16
|
||||||
fi
|
fi
|
||||||
printf "${green}\n=================================================================================================================\n\n"
|
printf "${green}\n=================================================================================================================\n\n"
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ clear='\033[0m'
|
||||||
printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}"
|
printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}"
|
||||||
\cp -r ../extra/* ./
|
\cp -r ../extra/* ./
|
||||||
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
|
||||||
make
|
make -j$(grep -c ^processor /proc/cpuinfo)
|
||||||
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then
|
||||||
mingw32-make.exe
|
mingw32-make.exe -j16
|
||||||
fi
|
fi
|
||||||
printf "${green}\n=================================================================================================================\n\n"
|
printf "${green}\n=================================================================================================================\n\n"
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,13 @@ namespace dragon
|
||||||
m_renderer.initialize(*this);
|
m_renderer.initialize(*this);
|
||||||
RawTextRenderer::initialize();
|
RawTextRenderer::initialize();
|
||||||
|
|
||||||
m_text16_palette = new data::BiosVideoDefaultPalette; //TODO: Delete, Memory Leak
|
text16_load_palettes();
|
||||||
|
m_currentPaletteID = DragonRuntime::machine_config.text16_palette;
|
||||||
|
if (m_currentPaletteID >= m_text16_palettes.size())
|
||||||
|
m_text16_Currentpalette = m_text16_palettes[0];
|
||||||
|
else
|
||||||
|
m_text16_Currentpalette = m_text16_palettes[m_currentPaletteID];
|
||||||
|
|
||||||
text16_init_buffer();
|
text16_init_buffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,17 +55,19 @@ namespace dragon
|
||||||
if (m_refreshScreen)
|
if (m_refreshScreen)
|
||||||
{
|
{
|
||||||
uint8_t clear_color = mem.read8(vga_addr + tRegisters::ClearColor);
|
uint8_t clear_color = mem.read8(vga_addr + tRegisters::ClearColor);
|
||||||
ostd::Color clearColor = m_text16_palette->getColor(clear_color);
|
ostd::Color clearColor = m_text16_Currentpalette->getColor(clear_color);
|
||||||
m_renderer.clear(clearColor);
|
m_renderer.clear(clearColor);
|
||||||
for (int32_t i = 0; i < RawTextRenderer::CONSOLE_CHARS_V * RawTextRenderer::CONSOLE_CHARS_H; i++)
|
for (int32_t i = 0; i < RawTextRenderer::CONSOLE_CHARS_V * RawTextRenderer::CONSOLE_CHARS_H; i++)
|
||||||
{
|
{
|
||||||
auto& cell = m_text16_buffer[i];
|
auto& cell = m_text16_buffer[i];
|
||||||
ostd::Color background = m_text16_palette->getColor(cell.backgroundColor);
|
ostd::Color background = m_text16_Currentpalette->getColor(cell.backgroundColor);
|
||||||
ostd::Color foreground = m_text16_palette->getColor(cell.foregroundColor);
|
ostd::Color foreground = m_text16_Currentpalette->getColor(cell.foregroundColor);
|
||||||
char character = static_cast<char>(cell.character);
|
char character = static_cast<char>(cell.character);
|
||||||
auto xy = CONVERT_1D_2D(i, RawTextRenderer::CONSOLE_CHARS_H);
|
auto xy = CONVERT_1D_2D(i, RawTextRenderer::CONSOLE_CHARS_H);
|
||||||
RawTextRenderer::drawString(ostd::String().addChar(character), xy.x, xy.y, m_renderer.getScreenPixels(), getWindowWidth(), getWindowHeight(), m_fontPixels, foreground, background);
|
RawTextRenderer::drawString(ostd::String().addChar(character), xy.x, xy.y, m_renderer.getScreenPixels(), getWindowWidth(), getWindowHeight(), m_fontPixels, foreground, background);
|
||||||
}
|
}
|
||||||
|
DragonRuntime::cpu.handleInterrupt(data::InterruptCodes::Text16ModeScreenRefreshed, true);
|
||||||
|
m_refreshScreen = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_renderer.updateBuffer();
|
m_renderer.updateBuffer();
|
||||||
|
|
@ -121,6 +129,22 @@ namespace dragon
|
||||||
}
|
}
|
||||||
else if (video_mode == tVideoModeValues::Text16Colors)
|
else if (video_mode == tVideoModeValues::Text16Colors)
|
||||||
{
|
{
|
||||||
|
if (signal == tSignalValues::Text16Color_ReadMemory)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (signal == tSignalValues::Text16Color_WriteMemory)
|
||||||
|
{
|
||||||
|
hw::interface::Graphics::tText16_Cell textCell;
|
||||||
|
|
||||||
|
textCell.foregroundColor = mem.read8(vga_addr + tRegisters::MemControllerFGCol);
|
||||||
|
textCell.backgroundColor = mem.read8(vga_addr + tRegisters::MemControllerBGCol);
|
||||||
|
textCell.character = mem.read8(vga_addr + tRegisters::MemControllerChar);
|
||||||
|
int16_t x = mem.read16(vga_addr + tRegisters::MemControllerX);
|
||||||
|
int16_t y = mem.read16(vga_addr + tRegisters::MemControllerY);
|
||||||
|
|
||||||
|
DragonRuntime::vGraphicsInterface.writeVRAM_16Colors(static_cast<uint8_t>(x), static_cast<uint8_t>(y), textCell.character, textCell.backgroundColor, textCell.foregroundColor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else return;
|
else return;
|
||||||
mem.write8(vga_addr + tRegisters::Signal, tSignalValues::Continue);
|
mem.write8(vga_addr + tRegisters::Signal, tSignalValues::Continue);
|
||||||
|
|
@ -133,7 +157,6 @@ namespace dragon
|
||||||
uint16_t vga_addr = data::MemoryMapAddresses::VideoCardInterface_Start;
|
uint16_t vga_addr = data::MemoryMapAddresses::VideoCardInterface_Start;
|
||||||
uint8_t video_mode = mem.read8(vga_addr + tRegisters::VideoMode);
|
uint8_t video_mode = mem.read8(vga_addr + tRegisters::VideoMode);
|
||||||
uint8_t signal = mem.read8(vga_addr + tRegisters::Signal);
|
uint8_t signal = mem.read8(vga_addr + tRegisters::Signal);
|
||||||
if (signal == tSignalValues::Continue) return;
|
|
||||||
if (video_mode == tVideoModeValues::Text16Colors)
|
if (video_mode == tVideoModeValues::Text16Colors)
|
||||||
{
|
{
|
||||||
m_refreshScreen = true;
|
m_refreshScreen = true;
|
||||||
|
|
@ -147,8 +170,6 @@ namespace dragon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualDisplay::onFixedUpdate(void) { }
|
|
||||||
|
|
||||||
void VirtualDisplay::onSlowUpdate(void) { }
|
void VirtualDisplay::onSlowUpdate(void) { }
|
||||||
|
|
||||||
void VirtualDisplay::single_text_add_char_to_line(char c)
|
void VirtualDisplay::single_text_add_char_to_line(char c)
|
||||||
|
|
@ -244,12 +265,9 @@ namespace dragon
|
||||||
m_text16_buffer.push_back({ 0, 0, ' ' });
|
m_text16_buffer.push_back({ 0, 0, ' ' });
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualDisplay::text16_buffer_diff(void)
|
void VirtualDisplay::text16_load_palettes(void)
|
||||||
{
|
{
|
||||||
for (int32_t i = 0; i < RawTextRenderer::CONSOLE_CHARS_V * RawTextRenderer::CONSOLE_CHARS_H; i++)
|
m_text16_palettes.push_back(new data::BiosVideoDefaultPalette); //TODO: Delete, Memory Leak
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,12 @@ namespace dragon
|
||||||
inline static constexpr uint8_t TextSingleCharacter = 0x04;
|
inline static constexpr uint8_t TextSingleCharacter = 0x04;
|
||||||
inline static constexpr uint8_t TextSingleInvertColors = 0x05;
|
inline static constexpr uint8_t TextSingleInvertColors = 0x05;
|
||||||
inline static constexpr uint8_t TextSingleString = 0x06;
|
inline static constexpr uint8_t TextSingleString = 0x06;
|
||||||
|
|
||||||
|
inline static constexpr uint8_t MemControllerX = 0x80;
|
||||||
|
inline static constexpr uint8_t MemControllerY = 0x82;
|
||||||
|
inline static constexpr uint8_t MemControllerChar = 0x84;
|
||||||
|
inline static constexpr uint8_t MemControllerBGCol = 0x85;
|
||||||
|
inline static constexpr uint8_t MemControllerFGCol = 0x86;
|
||||||
};
|
};
|
||||||
public: struct tVideoModeValues
|
public: struct tVideoModeValues
|
||||||
{
|
{
|
||||||
|
|
@ -49,7 +55,6 @@ namespace dragon
|
||||||
void onRender(void) override;
|
void onRender(void) override;
|
||||||
void onUpdate(void) override;
|
void onUpdate(void) override;
|
||||||
void onFixedUpdate(void) override;
|
void onFixedUpdate(void) override;
|
||||||
void onFixedUpdate(void) override;
|
|
||||||
void onSlowUpdate(void) override;
|
void onSlowUpdate(void) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -63,7 +68,7 @@ namespace dragon
|
||||||
void single_text_refresh_screen(void);
|
void single_text_refresh_screen(void);
|
||||||
|
|
||||||
void text16_init_buffer(void);
|
void text16_init_buffer(void);
|
||||||
void text16_buffer_diff(void);
|
void text16_load_palettes(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Renderer m_renderer;
|
Renderer m_renderer;
|
||||||
|
|
@ -72,7 +77,9 @@ namespace dragon
|
||||||
ostd::String m_singleTextBuffer { "" };
|
ostd::String m_singleTextBuffer { "" };
|
||||||
|
|
||||||
std::vector<hw::interface::Graphics::tText16_Cell> m_text16_buffer;
|
std::vector<hw::interface::Graphics::tText16_Cell> m_text16_buffer;
|
||||||
data::IBiosVideoPalette* m_text16_palette;
|
std::vector<data::IBiosVideoPalette*> m_text16_palettes;
|
||||||
|
data::IBiosVideoPalette* m_text16_Currentpalette { nullptr };
|
||||||
|
uint8_t m_currentPaletteID { 0 };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -9,7 +9,7 @@ namespace dragon
|
||||||
{
|
{
|
||||||
tMachineConfig config;
|
tMachineConfig config;
|
||||||
ostd::TextFileBuffer file(configFilePath.cpp_str());
|
ostd::TextFileBuffer file(configFilePath.cpp_str());
|
||||||
if (!file.exists()) return config;
|
if (!file.exists()) return config; //TODO: Error
|
||||||
auto lines = file.getLines();
|
auto lines = file.getLines();
|
||||||
for (auto& line : lines)
|
for (auto& line : lines)
|
||||||
{
|
{
|
||||||
|
|
@ -102,6 +102,13 @@ namespace dragon
|
||||||
if (config.memory_extension_pages > data::DefaultValues::MaxMemoryExtensionPages)
|
if (config.memory_extension_pages > data::DefaultValues::MaxMemoryExtensionPages)
|
||||||
config.memory_extension_pages = data::DefaultValues::MaxMemoryExtensionPages;
|
config.memory_extension_pages = data::DefaultValues::MaxMemoryExtensionPages;
|
||||||
}
|
}
|
||||||
|
else if (lineEdit == "16color_palette")
|
||||||
|
{
|
||||||
|
lineEdit = tokens.next();
|
||||||
|
lineEdit.trim().toLower();
|
||||||
|
if (!lineEdit.isNumeric()) continue; //TODO: Error
|
||||||
|
config.text16_palette = lineEdit.toInt();
|
||||||
|
}
|
||||||
else continue; //TODO: Warning
|
else continue; //TODO: Warning
|
||||||
}
|
}
|
||||||
return validate_machine_config(config);
|
return validate_machine_config(config);
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ namespace dragon
|
||||||
ostd::String cmos_path;
|
ostd::String cmos_path;
|
||||||
ostd::Color singleColor_background;
|
ostd::Color singleColor_background;
|
||||||
ostd::Color singleColor_foreground;
|
ostd::Color singleColor_foreground;
|
||||||
|
uint8_t text16_palette { 0 };
|
||||||
|
|
||||||
inline bool isValid(void) const { return m_valid; }
|
inline bool isValid(void) const { return m_valid; }
|
||||||
inline void destroy(void) { for (auto& ptr : cpuext_list) delete ptr.second; }
|
inline void destroy(void) { for (auto& ptr : cpuext_list) delete ptr.second; }
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ namespace dragon
|
||||||
return m_colors[col];
|
return m_colors[col];
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::vector<ostd::Color> m_colors;
|
std::vector<ostd::Color> m_colors;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -196,6 +196,8 @@ namespace dragon
|
||||||
inline static constexpr uint8_t KeyReleased = 0xA1;
|
inline static constexpr uint8_t KeyReleased = 0xA1;
|
||||||
inline static constexpr uint8_t TextEntered = 0xA2;
|
inline static constexpr uint8_t TextEntered = 0xA2;
|
||||||
|
|
||||||
|
inline static constexpr uint8_t Text16ModeScreenRefreshed = 0xE0;
|
||||||
|
|
||||||
inline static ostd::String getInterruptName(uint8_t code)
|
inline static ostd::String getInterruptName(uint8_t code)
|
||||||
{
|
{
|
||||||
switch (code)
|
switch (code)
|
||||||
|
|
@ -204,6 +206,7 @@ namespace dragon
|
||||||
case KeyPressed: return "Key_Pressed";
|
case KeyPressed: return "Key_Pressed";
|
||||||
case KeyReleased: return "Key_Released";
|
case KeyReleased: return "Key_Released";
|
||||||
case TextEntered: return "Text_Entered";
|
case TextEntered: return "Text_Entered";
|
||||||
|
case Text16ModeScreenRefreshed: return "Text16_Mode_Screen_Refreshed";
|
||||||
default: return "UNKNOWN";
|
default: return "UNKNOWN";
|
||||||
}
|
}
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue