Sync push

This commit is contained in:
OmniaX-Dev 2024-09-17 07:32:24 +02:00
parent b90cc537ef
commit dc20f5cf39
14 changed files with 273 additions and 49 deletions

View file

@ -1 +1 @@
1617 1618

Binary file not shown.

Binary file not shown.

View file

@ -17,6 +17,7 @@
RAM 0x1740 RAM 0x1740
CMOS 0x1000 CMOS 0x1000
VGA 0x1600 VGA 0x1600
KEYBOARD 0x1280
@end @end
@raw_export_end @raw_export_end
@export_comment BIOS_API " --\n" @export_comment BIOS_API " --\n"
@ -74,6 +75,17 @@
@export_comment BIOS_API " These are the memory-mapped registers used to interact with the keyboard's interface."
@raw_export_start BIOS_API
@group Keyboard_Registers
MODIFIERS_BITFIELD { MemoryAddresses.KEYBOARD + 0x0000 }
KEYCODE { MemoryAddresses.KEYBOARD + 0x0002 }
@end
@raw_export_end
@export_comment BIOS_API " --\n"
@export_comment BIOS_API " These are the different Video Modes that the video card supports." @export_comment BIOS_API " These are the different Video Modes that the video card supports."
@raw_export_start BIOS_API @raw_export_start BIOS_API
@group VGA_VideoModes @group VGA_VideoModes

View file

@ -22,6 +22,39 @@ _print_string_text16_loop:
_print_integer_text16: ## _print_integer_text16(int16_t number, TextCell16* cell)
arg ACC ## @Param: number
arg R2 ## @Param: cell
mov R3, R2
addip R3, 3 ## R3 is now a pointer to the X coord in the cell
mov R1, 0
jne $_print_integer_text16_loop, 0
push 48 ## '0' ASCII is 48
inc R1
jmp $_print_integer_text16_loop_end
_print_integer_text16_loop:
jeq $_print_integer_text16_loop_end, 0
divipu ACC, 10
addipu RV, 48
push RV
inc R1
jmp $_print_integer_text16_loop
_print_integer_text16_loop_end:
pop R4 ## Put next char in R4
dec R1
movb *R2, R4 ## Store next char in first byte of cell
mov R10, 0x21 ## int 0x30 param for write vram
mov R9, R2 ## int 0x30 param for textCell16
int 0x30
debug_break
movb R5, *R3 ## Retrieve current X coord from cell
inc R5 ## Increment X coord
movb *R3, R5 ## Store new X coord in cell
mov ACC, R1
jne $_print_integer_text16_loop_end, 0
ret
_print_integer_signle_color: _print_integer_signle_color:
mov R1, 0 mov R1, 0

View file

@ -17,16 +17,13 @@ _int_20_disk_interface:
movb [{MemoryAddresses.DISK_INTERFACE + 0x2}], *R9 ## Disk movb [{MemoryAddresses.DISK_INTERFACE + 0x2}], *R9 ## Disk
inc R9 inc R9
mov [{MemoryAddresses.DISK_INTERFACE + 0x3}], *R9 ## Sector mov [{MemoryAddresses.DISK_INTERFACE + 0x3}], *R9 ## Sector
inc R9 addip R9, 2
inc R9
mov [{MemoryAddresses.DISK_INTERFACE + 0x5}], *R9 ## Address mov [{MemoryAddresses.DISK_INTERFACE + 0x5}], *R9 ## Address
inc R9 addip R9, 2
inc R9
mov [{MemoryAddresses.DISK_INTERFACE + 0x7}], *R9 ## Size mov [{MemoryAddresses.DISK_INTERFACE + 0x7}], *R9 ## Size
inc R9 addip R9, 2
inc R9
mov [{MemoryAddresses.DISK_INTERFACE + 0x9}], *R9 ## Memory Address mov [{MemoryAddresses.DISK_INTERFACE + 0x9}], *R9 ## Memory Address
movb [MemoryAddresses.DISK_INTERFACE], 0x00 ## Signal set to "Start Operation" movb [MemoryAddresses.DISK_INTERFACE], DiskSignals.START ## Signal set to "Start Operation"
jmp $_int_20_end jmp $_int_20_end
_int_20_disk_interface_get_disk_list: _int_20_disk_interface_get_disk_list:
jmp $_int_20_end jmp $_int_20_end
@ -68,6 +65,8 @@ _int_30_handler:
jeq $_int_30_write_vram_text16, 0x0021 jeq $_int_30_write_vram_text16, 0x0021
jeq $_int_30_print_string_text16, 0x0022 jeq $_int_30_print_string_text16, 0x0022
jeq $_int_30_print_integer_text16, 0x0023
jeq $_int_30_clear_screen_text16, 0x0024
jeq $_int_30_clear_screen, 0x00E0 jeq $_int_30_clear_screen, 0x00E0
jeq $_int_30_refresh_screen, 0x00E1 jeq $_int_30_refresh_screen, 0x00E1
@ -153,6 +152,20 @@ _int_30_print_string_text16:
push 2 push 2
call $_print_string_text16 call $_print_string_text16
jmp $_int_30_end jmp $_int_30_end
_int_30_print_integer_text16:
push R8 ## number
push R9 ## TextCell16 addr
push 2
call $_print_integer_text16
jmp $_int_30_end
_int_30_clear_screen_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
movb [VGA_Registers.SIGNAL], Sig_VGA_Text_16_Color.FORCE_CLEAR_SCREEN
jmp $_int_30_end
_int_30_clear_screen: _int_30_clear_screen:
movb [VGA_Registers.SIGNAL], Sig_VGA_Text_Single_Color.CLEAR_SCREEN movb [VGA_Registers.SIGNAL], Sig_VGA_Text_Single_Color.CLEAR_SCREEN

View file

@ -1,5 +1,5 @@
## -- ## --
## -- This file is automatically generated by the DragonAssembler (version 0.4.1616) ## -- This file is automatically generated by the DragonAssembler (version 0.4.1617)
## -- Please do not modify this file in any way. ## -- Please do not modify this file in any way.
## -- ## --
@ -11,6 +11,7 @@
RAM 0x1740 RAM 0x1740
CMOS 0x1000 CMOS 0x1000
VGA 0x1600 VGA 0x1600
KEYBOARD 0x1280
@end @end
## -- ## --
@ -44,6 +45,13 @@
@end @end
## -- ## --
## These are the memory-mapped registers used to interact with the keyboard's interface.
@group Keyboard_Registers
MODIFIERS_BITFIELD { MemoryAddresses.KEYBOARD + 0x0000 }
KEYCODE { MemoryAddresses.KEYBOARD + 0x0002 }
@end
## --
## These are the different Video Modes that the video card supports. ## These are the different Video Modes that the video card supports.
@group VGA_VideoModes @group VGA_VideoModes
TEXT_SINGLE_COLOR 0x00 TEXT_SINGLE_COLOR 0x00

View file

@ -3,60 +3,121 @@
@include <../bios_api.dss> @include <../bios_api.dss>
@include <palette.dss> @include <palette.dss>
@include <keyboard_driver.dss>
.data .data
$string "Hello " ## Disk data structures
$ddd <DiskDriverData> $ddd <DiskDriverData>
$dpt_block <DPTBlock> $dpt_block <DPTBlock>
$textCell <Text16VModeCell> $textCell <Text16VModeCell>
$counter 0x00
$current_char 65
$dpt_version_str "DPT Version "
$drake_version_str "Drake 0.1 -- "
$invalid_dpt_block_str "Error: Invalid DPT Block..."
.code .code
_drake_bootsector_entry_point: _drake_bootsector_entry_point:
push $ddd ## Load DPT block from disk 0
push $dpt_block push $ddd ## Empty DiskDriverData used to load from disk
push $dpt_block ## Empty DPT Block to store the partition table
push 2 push 2
call $_load_dpt_block call $_load_dpt_block
## Enable Text16 Video Mode
movb [VGA_Registers.VIDEO_MODE], VGA_VideoModes.TEXT_16_COLORS movb [VGA_Registers.VIDEO_MODE], VGA_VideoModes.TEXT_16_COLORS
## Validate DPT Block
push 2 mov ACC, [$dpt_block]
jne $_invalid_dpt_block, 0xF1CA
## Init Keyboard driver
push $_key_pressed ## KeyPressed handler address passed to the _init_keyboard subroutine
push 1 push 1
push 2 call $_init_keyboard
call $_draw_palette
movb [$textCell.CoordX], 0
movb [$textCell.CoordX], 2 movb [$textCell.CoordY], 0
movb [$textCell.CoordY], 2 movb [$textCell.Foreground], DefaultPalette.Pink
movb [$textCell.Foreground], DefaultPalette.Orange
movb [$textCell.Background], DefaultPalette.Black movb [$textCell.Background], DefaultPalette.Black
mov R10, 0x22 mov R10, 0x22
mov R8, $string mov R8, $drake_version_str
mov R9, $textCell mov R9, $textCell
int 0x30 int 0x30
movb [$textCell.CoordX], 13
movb [$textCell.CoordX], 8
movb [$textCell.CoordY], 2
movb [$textCell.Foreground], DefaultPalette.Black
movb [$textCell.Background], DefaultPalette.Orange
mov R10, 0x22 mov R10, 0x22
mov R8, { $dpt_block + DPTStructure.ENTRIES_START + (2 * DPTStructure.ENTRY_SIZE_B) + DPTStructure.ENTRY_PART_LBL } mov R8, $dpt_version_str
mov R9, $textCell mov R9, $textCell
int 0x30 int 0x30
movb [$textCell.CoordX], 26
mov R10, 0x23
movb R8, [{ $dpt_block + 2 }]
mov R9, $textCell
int 0x30
movb [$textCell.CoordX], 27
movb [$textCell.Character], 0x2E
mov R10, 0x21
mov R9, $textCell
int 0x30
movb [$textCell.CoordX], 28
mov R10, 0x23
movb R8, [{ $dpt_block + 3 }]
mov R9, $textCell
int 0x30
## mov R10, 0x23
## mov R9, $textCell
## mov R8, 2341
## int 0x30
## mov R10, 0x22
## mov R8, { $dpt_block + DPTStructure.ENTRIES_START + (2 * DPTStructure.ENTRY_SIZE_B) + DPTStructure.ENTRY_PART_LBL }
## mov R9, $textCell
## int 0x30
jmp $_endless_loop
_invalid_dpt_block:
push $invalid_dpt_block_str
push 1
call $_print_error_msg
_endless_loop:
jmp $_endless_loop
hlt hlt
_key_pressed:
mov ACC, [Keyboard_Registers.KEYCODE]
jne $_key_pressed_end, 0x0127
movb R1, [$counter]
movb [$textCell.CoordX], R1
movb [$textCell.CoordY], 12
movb [$textCell.Foreground], DefaultPalette.Orange
movb [$textCell.Background], DefaultPalette.Black
movb [$textCell.Character], 65
inc R1
movb [$counter], R1
mov R10, 0x21
mov R9, $textCell
int 0x30
_key_pressed_end:
ret
_load_dpt_block: ## _load_dpt_block(DiskDriverData* ddd, DPTBlock* dpt_block) _load_dpt_block: ## _load_dpt_block(DiskDriverData* ddd, DPTBlock* dpt_block)
arg R1 ## @Param: ddd arg R1 ## @Param: ddd
@ -79,5 +140,19 @@ _load_dpt_block: ## _load_dpt_block(DiskDriverData* ddd, DPTBlock* dpt_block)
ret ret
_print_error_msg: ## _print_error_msg(string* error_msg)
arg R1 ## @Param: error_msg
## TODO: Clear the screen
movb [$textCell.CoordX], 0
movb [$textCell.CoordY], 0
movb [$textCell.Foreground], DefaultPalette.Red
movb [$textCell.Background], DefaultPalette.Black
mov R10, 0x22
mov R8, R1
mov R9, $textCell
int 0x30
ret
.fixed 5120, 0xFF .fixed 5120, 0xFF

View file

@ -0,0 +1,10 @@
@guard _KEYBOARD_DRIVER_DSS_
.code
_init_keyboard: ## _init_keyboard(func_ptr* key_pressed_handler)
arg R9 ## @Param: key_pressed_handler
mov R10, 0x00 ## int 0x20 param for set_interrupt_handler
mov R8, 0xA0 ## 0xA0 is the hardware interrupt for KeyPressed
int 0x20
ret

View file

@ -129,6 +129,8 @@
0x00: Set Interrupt Handler 0x00: Set Interrupt Handler
0x01: Clear Interrupt Handler 0x01: Clear Interrupt Handler
0x10: Disk Interface 0x10: Disk Interface
0x11: Disk Interface - Get disk list
0x12: Disk Interface - Load from DDD - BLOCKING
0x30: BIOS Video Interrupt (Uses R10 register for specific functionality) 0x30: BIOS Video Interrupt (Uses R10 register for specific functionality)
0x01: Print Char in Text Single Mode (char stored in R9 register) 0x01: Print Char in Text Single Mode (char stored in R9 register)
0x02: New Line in Text Single Mode 0x02: New Line in Text Single Mode
@ -142,8 +144,10 @@
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)
0x21: Write VRAM in Text16 Colors Mode (Cell address stored in R9) 0x21: Write VRAM in Text16 Colors Mode (Cell address stored in R9)
0x22: Print String in Text16 Colors Mode (String address stored in R8, Cell address stored in R9)
0x23: Print Integer in Text16 Colors Mode (Integer stored in R8, Cell address stored in R9)
0x24: Clear Screen in Text16 Colors Mode (Cell address stored in R9)
0xE0: Refresh Screen 0xE0: Refresh Screen
0xE1: Clear Screen 0xE1: Clear Screen

View file

@ -503,16 +503,13 @@ namespace dragon
{ {
std::vector<ostd::String> newLines; std::vector<ostd::String> newLines;
ostd::String lineEdit; ostd::String lineEdit;
bool in_group = false;
ostd::String group_name = "";
for (auto& line : m_rawDataSection) for (auto& line : m_rawDataSection)
{ {
lineEdit = line; lineEdit = line;
lineEdit.trim(); lineEdit.trim();
if (!lineEdit.startsWith("$") || lineEdit.indexOf(" ") < 2) if (!lineEdit.startsWith("$"))
{ {
std::cout << "Invalid data entry: " << lineEdit << "\n"; continue;
return;
} }
ostd::String symbolName = lineEdit.new_substr(0, lineEdit.indexOf(" ")); ostd::String symbolName = lineEdit.new_substr(0, lineEdit.indexOf(" "));
symbolName.trim(); symbolName.trim();
@ -853,6 +850,8 @@ namespace dragon
{ {
ostd::String lineEdit(line); ostd::String lineEdit(line);
tSymbol symbol; tSymbol symbol;
ostd::String symbolName = "";
bool array = false;
if (lineEdit.startsWith("!")) if (lineEdit.startsWith("!"))
{ {
if (lineEdit.contains(" ")) if (lineEdit.contains(" "))
@ -866,15 +865,52 @@ namespace dragon
m_symbolTable[lineEdit] = symbol; m_symbolTable[lineEdit] = symbol;
continue; continue;
} }
if (!lineEdit.startsWith("$") || lineEdit.indexOf(" ") < 2) if (!lineEdit.startsWith("$"))
{ {
std::cout << "Invalid data entry: " << lineEdit << "\n"; std::cout << "Invalid data entry (name must start with $): " << line << "\n";
continue; continue;
} }
ostd::String symbolName = lineEdit.new_substr(0, lineEdit.indexOf(" ")); if (lineEdit.contains(":") && (!lineEdit.contains("\"") || lineEdit.indexOf(":") < lineEdit.indexOf("\"")))
symbolName.trim(); {
lineEdit.substr(lineEdit.indexOf(" ") + 1); if (lineEdit.indexOf(":") < 2 || lineEdit.indexOf(":") == lineEdit.len() - 1)
lineEdit.trim(); {
std::cout << "Invalid array data entry: " << line << "\n";
continue;
}
symbolName = lineEdit.new_substr(0, lineEdit.indexOf(":")).trim();
lineEdit.substr(lineEdit.indexOf(":") + 1).trim();
if (!lineEdit.isNumeric())
{
std::cout << "Invalid array data entry size (must be numeric): " << line << "\n";
continue;
}
array = true;
}
else if (lineEdit.indexOf(" ") >= 2)
{
symbolName = lineEdit.new_substr(0, lineEdit.indexOf(" ")).trim();
lineEdit.substr(lineEdit.indexOf(" ") + 1).trim();
}
else
{
std::cout << "Invalid data entry1: " << line << "\n";
continue;
}
if (array)
{
uint16_t array_size = lineEdit.toInt();
if (array_size == 0)
{
std::cout << "Invalid array data entry size (must be greater than 0): " << line << "\n";
continue;
}
lineEdit = "";
for (int32_t i = 0; i < array_size; i++)
lineEdit.add("0x00, ");
lineEdit.trim().substr(0, lineEdit.len() - 1).trim();
}
if (lineEdit.isNumeric()) if (lineEdit.isNumeric())
{ {
// union valueSplit { // union valueSplit {
@ -909,7 +945,7 @@ namespace dragon
auto tokens = lineEdit.tokenize(","); auto tokens = lineEdit.tokenize(",");
if (tokens.count() < 2) if (tokens.count() < 2)
{ {
std::cout << "Invalid data entry: " << lineEdit << "\n"; std::cout << "Invalid data entry2: " << line << "\n";
return; return;
} }
for (auto& token : tokens) for (auto& token : tokens)
@ -929,7 +965,7 @@ namespace dragon
} }
else else
{ {
std::cout << "Invalid data entry: " << lineEdit << "\n"; std::cout << "Invalid data entry3: " << line << "\n";
continue; continue;
} }
} }
@ -1176,16 +1212,21 @@ namespace dragon
} }
else if (instEdit == "push") else if (instEdit == "push")
{ {
m_code.push_back(0x00);
eOperandType opType = parseOperand(opEdit, word); eOperandType opType = parseOperand(opEdit, word);
if (opType == eOperandType::Immediate || opType == eOperandType::Label) if (opType == eOperandType::Immediate || opType == eOperandType::Label)
{ {
m_code.push_back(data::OpCodes::PushImm); // if (opType == eOperandType::Label)
// std::cout << ostd::Utils::getHexStr(word, true, 2) << "\n";
m_code[m_code.size() - 1] = data::OpCodes::PushImm;
// m_code.push_back(data::OpCodes::PushImm);
m_code.push_back((uint8_t)((word & 0xFF00) >> 8)); m_code.push_back((uint8_t)((word & 0xFF00) >> 8));
m_code.push_back((uint8_t)(word & 0x00FF)); m_code.push_back((uint8_t)(word & 0x00FF));
} }
else if (opType == eOperandType::Register) else if (opType == eOperandType::Register)
{ {
m_code.push_back(data::OpCodes::PushReg); // m_code.push_back(data::OpCodes::PushReg);
m_code[m_code.size() - 1] = data::OpCodes::PushReg;
m_code.push_back((uint8_t)word); m_code.push_back((uint8_t)word);
} }
else else
@ -2467,6 +2508,9 @@ namespace dragon
if (labelAddr == 0x0000) if (labelAddr == 0x0000)
m_labelTable[opEdit].references.push_back(m_code.size()); m_labelTable[opEdit].references.push_back(m_code.size());
outOp = (int16_t)labelAddr; outOp = (int16_t)labelAddr;
// std::cout << "LABEL: " << opEdit << "\n";
// std::cout << " : " << ostd::Utils::getHexStr(labelAddr, true, 2) << "\n";
// std::cout << " : " << ostd::Utils::getHexStr(outOp, true, 2) << "\n";
return eOperandType::Label; return eOperandType::Label;
} }
if (opEdit.startsWith("{") && opEdit.endsWith("}")) if (opEdit.startsWith("{") && opEdit.endsWith("}"))

View file

@ -157,6 +157,16 @@ namespace dragon
DragonRuntime::vGraphicsInterface.writeVRAM_16Colors(static_cast<uint8_t>(x), static_cast<uint8_t>(y), textCell.character, textCell.backgroundColor, textCell.foregroundColor); DragonRuntime::vGraphicsInterface.writeVRAM_16Colors(static_cast<uint8_t>(x), static_cast<uint8_t>(y), textCell.character, textCell.backgroundColor, textCell.foregroundColor);
} }
else if (signal == tSignalValues::ClearSCreen)
{
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);
DragonRuntime::vGraphicsInterface.clearVRAM_16Colors(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);

View file

@ -45,13 +45,13 @@ namespace dragon
int8_t VirtualBIOS::write8(uint16_t addr, int8_t value) int8_t VirtualBIOS::write8(uint16_t addr, int8_t value)
{ {
data::ErrorHandler::pushError(data::ErrorCodes::BIOS_WriteAttempt, ostd::String("Attempting to write to BIOS memory map.").add(addr)); data::ErrorHandler::pushError(data::ErrorCodes::BIOS_WriteAttempt, ostd::String("Attempting to write to BIOS memory map: ").add(ostd::Utils::getHexStr(addr, true, 2)));
return 0x00; return 0x00;
} }
int16_t VirtualBIOS::write16(uint16_t addr, int16_t value) int16_t VirtualBIOS::write16(uint16_t addr, int16_t value)
{ {
data::ErrorHandler::pushError(data::ErrorCodes::BIOS_WriteAttempt, ostd::String("Attempting to write to BIOS memory map.").add(addr)); data::ErrorHandler::pushError(data::ErrorCodes::BIOS_WriteAttempt, ostd::String("Attempting to write to BIOS memory map: ").add(ostd::Utils::getHexStr(addr, true, 2)));
return 0x0000; return 0x0000;
} }
@ -741,6 +741,20 @@ namespace dragon
return true; return true;
} }
bool Graphics::clearVRAM_16Colors(uint8_t character, uint8_t background, uint8_t foreground)
{
for (int32_t i = m_vramStart; i < m_vramStart + (RawTextRenderer::CONSOLE_CHARS_H * RawTextRenderer::CONSOLE_CHARS_V); i++)
{
if (!m_videoMemory.w_Byte(i + tText16_CellStructure::character, character))
return false; //TODO: Error
if (!m_videoMemory.w_Byte(i + tText16_CellStructure::background, background))
return false; //TODO: Error
if (!m_videoMemory.w_Byte(i + tText16_CellStructure::foreground, foreground))
return false; //TODO: Error
}
return true;
}

View file

@ -370,6 +370,7 @@ namespace dragon
inline uint16_t getVRAMStart(void) { return m_vramStart; } inline uint16_t getVRAMStart(void) { return m_vramStart; }
bool readVRAM_16Colors(uint8_t x, uint8_t y, tText16_Cell& outTextCell); bool readVRAM_16Colors(uint8_t x, uint8_t y, tText16_Cell& outTextCell);
bool writeVRAM_16Colors(uint8_t x, uint8_t y, uint8_t character = 0, uint8_t background = 0xFF, uint8_t foreground = 0xFF); bool writeVRAM_16Colors(uint8_t x, uint8_t y, uint8_t character = 0, uint8_t background = 0xFF, uint8_t foreground = 0xFF);
bool clearVRAM_16Colors(uint8_t character = 0, uint8_t background = 0x00, uint8_t foreground = 0xFF);
private: private:
ostd::serial::SerialIO m_videoMemory; ostd::serial::SerialIO m_videoMemory;