diff --git a/build.nr b/build.nr index c772079..ff0ba09 100644 --- a/build.nr +++ b/build.nr @@ -1 +1 @@ -1620 +1621 diff --git a/extra/dragon/bios.bin b/extra/dragon/bios.bin index 10b22bf..838cc56 100644 Binary files a/extra/dragon/bios.bin and b/extra/dragon/bios.bin differ diff --git a/extra/dragon/disk1.dr b/extra/dragon/disk1.dr index 39adc53..e805635 100644 Binary files a/extra/dragon/disk1.dr and b/extra/dragon/disk1.dr differ diff --git a/extra/dss/DragonOS/ascii.dss b/extra/dss/DragonOS/ascii.dss new file mode 100644 index 0000000..88bcd7b --- /dev/null +++ b/extra/dss/DragonOS/ascii.dss @@ -0,0 +1,132 @@ +@guard _ASCII_DSS_ + +@group ASCII + NULL 0x00 + SOH 0x01 + STX 0x02 + ETX 0x03 + EOT 0x04 + ENQ 0x05 + ACK 0x06 + BEL 0x07 + BS 0x08 + HT 0x09 + LF 0x0A + VT 0x0B + FF 0x0C + CR 0x0D + SO 0x0E + SI 0x0F + DLE 0x10 + DC1 0x11 + DC2 0x12 + DC3 0x13 + DC4 0x14 + NAK 0x15 + SYN 0x16 + ETB 0x17 + CAN 0x18 + EM 0x19 + SUB 0x1A + ESC 0x1B + FS 0x1C + GS 0x1D + RS 0x1E + US 0x1F + SPACE 0x20 + EXCLAMATION_MARK 0x21 + DOUBLE_QUOTE 0x22 + HASH 0x23 + DOLLAR_SIGN 0x24 + PERCENT_SIGN 0x25 + AMPERSAND 0x26 + SINGLE_QUOTE 0x27 + OPEN_PARENTHESIS 0x28 + CLOSE_PARENTHESIS 0x29 + ASTERISK 0x2A + PLUS_SIGN 0x2B + COMMA 0x2C + HYPHEN 0x2D + PERIOD 0x2E + FORWARD_SLASH 0x2F + DIGIT_0 0x30 + DIGIT_1 0x31 + DIGIT_2 0x32 + DIGIT_3 0x33 + DIGIT_4 0x34 + DIGIT_5 0x35 + DIGIT_6 0x36 + DIGIT_7 0x37 + DIGIT_8 0x38 + DIGIT_9 0x39 + COLON 0x3A + SEMICOLON 0x3B + LESS_THAN_SIGN 0x3C + EQUALS_SIGN 0x3D + GREATER_THAN_SIGN 0x3E + QUESTION_MARK 0x3F + AT_SIGN 0x40 + UPPERCASE_A 0x41 + UPPERCASE_B 0x42 + UPPERCASE_C 0x43 + UPPERCASE_D 0x44 + UPPERCASE_E 0x45 + UPPERCASE_F 0x46 + UPPERCASE_G 0x47 + UPPERCASE_H 0x48 + UPPERCASE_I 0x49 + UPPERCASE_J 0x4A + UPPERCASE_K 0x4B + UPPERCASE_L 0x4C + UPPERCASE_M 0x4D + UPPERCASE_N 0x4E + UPPERCASE_O 0x4F + UPPERCASE_P 0x50 + UPPERCASE_Q 0x51 + UPPERCASE_R 0x52 + UPPERCASE_S 0x53 + UPPERCASE_T 0x54 + UPPERCASE_U 0x55 + UPPERCASE_V 0x56 + UPPERCASE_W 0x57 + UPPERCASE_X 0x58 + UPPERCASE_Y 0x59 + UPPERCASE_Z 0x5A + OPEN_SQUARE_BRACKET 0x5B + BACKSLASH 0x5C + CLOSE_SQUARE_BRACKET 0x5D + CARET 0x5E + UNDERSCORE 0x5F + GRAVE_ACCENT 0x60 + LOWERCASE_A 0x61 + LOWERCASE_B 0x62 + LOWERCASE_C 0x63 + LOWERCASE_D 0x64 + LOWERCASE_E 0x65 + LOWERCASE_F 0x66 + LOWERCASE_G 0x67 + LOWERCASE_H 0x68 + LOWERCASE_I 0x69 + LOWERCASE_J 0x6A + LOWERCASE_K 0x6B + LOWERCASE_L 0x6C + LOWERCASE_M 0x6D + LOWERCASE_N 0x6E + LOWERCASE_O 0x6F + LOWERCASE_P 0x70 + LOWERCASE_Q 0x71 + LOWERCASE_R 0x72 + LOWERCASE_S 0x73 + LOWERCASE_T 0x74 + LOWERCASE_U 0x75 + LOWERCASE_V 0x76 + LOWERCASE_W 0x77 + LOWERCASE_X 0x78 + LOWERCASE_Y 0x79 + LOWERCASE_Z 0x7A + OPEN_CURLY_BRACE 0x7B + VERTICAL_BAR 0x7C + CLOSE_CURLY_BRACE 0x7D + TILDE 0x7E + DELETE 0x7F +@end \ No newline at end of file diff --git a/extra/dss/DragonOS/kernel0.dss b/extra/dss/DragonOS/kernel0.dss index f19037f..f36c426 100644 --- a/extra/dss/DragonOS/kernel0.dss +++ b/extra/dss/DragonOS/kernel0.dss @@ -24,7 +24,6 @@ _kernel0_main: push DefaultPalette.Black push 1 call $_clear_screen - debug_break push $test_str push 1 call $_print_string @@ -34,12 +33,38 @@ _kernel0_main: push 1 call $_init_keyboard +_infinite_loop: + jmp $_infinite_loop + hlt ## ========================================================================================================================= +## ========================================================================================================================= +_key_pressed: + ## debug_break + mov R1, [Keyboard_Registers.KEYCODE] + + mov ACC, ASCII.LOWERCASE_A + jls $_key_pressed_end, R1 + mov ACC, ASCII.LOWERCASE_Z + jgr $_key_pressed_end, R1 + push R1 + push 10 + push 10 + push DefaultPalette.Red + push 4 + call $_print_char + +_key_pressed_end: + ret +## ========================================================================================================================= + + + + ## ========================================================================================================================= _print_string: ## _print_string(string* str) arg R1 ## @Param: str @@ -54,6 +79,26 @@ _print_string: ## _print_string(string* str) ret ## ========================================================================================================================= + + + +## ========================================================================================================================= +_print_char: ## _print_char(int16 char, int16 x, int16 y, int16 color) + arg R1 ## @Param: char + arg R2 ## @Param: x + arg R3 ## @Param: y + arg R4 ## @Param: color + movb [$textCell.CoordX], R2 + movb [$textCell.CoordY], R3 + movb [$textCell.Foreground], R4 + movb [$textCell.Background], DefaultPalette.Black + movb [$textCell.Character], R1 + mov R10, 0x21 + mov R9, $textCell + int 0x30 + ret +## ========================================================================================================================= + diff --git a/extra/dss/DragonOS/keyboard_driver.dss b/extra/dss/DragonOS/keyboard_driver.dss index 6caee03..d65fb26 100644 --- a/extra/dss/DragonOS/keyboard_driver.dss +++ b/extra/dss/DragonOS/keyboard_driver.dss @@ -1,5 +1,7 @@ @guard _KEYBOARD_DRIVER_DSS_ +@include + .code _init_keyboard: ## _init_keyboard(func_ptr* key_pressed_handler) diff --git a/extra/dss/bios/data.dss b/extra/dss/bios/data.dss index a8520ec..4551901 100644 --- a/extra/dss/bios/data.dss +++ b/extra/dss/bios/data.dss @@ -141,6 +141,7 @@ SWAP_BUFFERS 0x10 WRITE_VRAM 0x11 + SCROLL 0x12 FORCE_REFRESH_SCREEN 0xE0 FORCE_CLEAR_SCREEN 0xE1 diff --git a/extra/dss/bios/drivers.dss b/extra/dss/bios/drivers.dss index 9f99cf0..c43b5cb 100644 --- a/extra/dss/bios/drivers.dss +++ b/extra/dss/bios/drivers.dss @@ -67,6 +67,7 @@ _int_30_handler: jeq $_int_30_print_string_text16, 0x0022 jeq $_int_30_print_integer_text16, 0x0023 jeq $_int_30_clear_screen_text16, 0x0024 + jeq $_int_30_scroll_text16, 0x0025 jeq $_int_30_clear_screen, 0x00E0 jeq $_int_30_refresh_screen, 0x00E1 @@ -166,6 +167,9 @@ _int_30_clear_screen_text16: 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_scroll_text16: + movb [VGA_Registers.SIGNAL], Sig_VGA_Text_16_Color.SCROLL + jmp $_int_30_end _int_30_clear_screen: movb [VGA_Registers.SIGNAL], Sig_VGA_Text_Single_Color.CLEAR_SCREEN diff --git a/extra/dss/bios_api.dss b/extra/dss/bios_api.dss index 8fd1d90..850645d 100644 --- a/extra/dss/bios_api.dss +++ b/extra/dss/bios_api.dss @@ -100,6 +100,7 @@ CONTINUE 0x00 SWAP_BUFFERS 0x10 WRITE_VRAM 0x11 + SCROLL 0x12 FORCE_REFRESH_SCREEN 0xE0 FORCE_CLEAR_SCREEN 0xE1 FORCE_REDRAW_SCREEN 0xE2 diff --git a/extra/dss/drake/bootsector.dss b/extra/dss/drake/bootsector.dss index 70e4062..872dc2a 100644 --- a/extra/dss/drake/bootsector.dss +++ b/extra/dss/drake/bootsector.dss @@ -125,7 +125,6 @@ _endless_loop: mov R10, 0x12 ## int 0x20 parameter for load_from_ddd_blocking int 0x20 ## Bios interrupt - debug_break jmp OS_LOAD_ADDR jmp $_main_end diff --git a/extra/info/todo.txt b/extra/info/todo.txt index 09ad29d..7a8cf86 100644 --- a/extra/info/todo.txt +++ b/extra/info/todo.txt @@ -1,4 +1,5 @@ Runtime: + Add option to disable screenRedrawRate in debugger top-level prompt Assembler: Add subroutine address export functionality diff --git a/src/assembler/Assembler.cpp b/src/assembler/Assembler.cpp index 7c7fd19..38b8997 100644 --- a/src/assembler/Assembler.cpp +++ b/src/assembler/Assembler.cpp @@ -34,6 +34,8 @@ namespace dragon m_lines = IncludePreprocessor::loadEntryFile(fileName); if (m_lines.size() == 0) return { }; //TODO: Error + // for (auto& line : m_lines) + // std::cout << line << "\n"; removeComments(); parseExportSpecifications(); createExports(); diff --git a/src/hardware/VirtualDisplay.cpp b/src/hardware/VirtualDisplay.cpp index c584bf0..4e5a5b1 100644 --- a/src/hardware/VirtualDisplay.cpp +++ b/src/hardware/VirtualDisplay.cpp @@ -179,6 +179,11 @@ namespace dragon DragonRuntime::vGraphicsInterface.swapBuffers_16Colors(); __redraw_screen(); } + else if (signal == tSignalValues::Text16Color_Scroll) + { + DragonRuntime::vGraphicsInterface.scroll_16Colors(); + __redraw_screen(); + } } else return; mem.write8(vga_addr + tRegisters::Signal, tSignalValues::Continue); diff --git a/src/hardware/VirtualDisplay.hpp b/src/hardware/VirtualDisplay.hpp index 0545ce5..83f7ce9 100644 --- a/src/hardware/VirtualDisplay.hpp +++ b/src/hardware/VirtualDisplay.hpp @@ -47,6 +47,7 @@ namespace dragon inline static constexpr uint8_t Text16Color_SwapBuffers = 0x10; inline static constexpr uint8_t Text16Color_WriteMemory = 0x11; + inline static constexpr uint8_t Text16Color_Scroll = 0x12; inline static constexpr uint8_t RefreshScreen = 0xE0; inline static constexpr uint8_t ClearSCreen = 0xE1; diff --git a/src/hardware/VirtualIODevices.cpp b/src/hardware/VirtualIODevices.cpp index 1b7d03c..c73a2e8 100644 --- a/src/hardware/VirtualIODevices.cpp +++ b/src/hardware/VirtualIODevices.cpp @@ -799,6 +799,28 @@ namespace dragon m_16Color_secondFrameAddr = tmp; } + void Graphics::scroll_16Colors(void) + { + int32_t line_len = (RawTextRenderer::CONSOLE_CHARS_H * 4); + for (int32_t i = m_16Color_currentFrameAddr + line_len; i < m_16Color_currentFrameAddr + m_16Color_frameSize; i += 4) + { + int32_t k = i; + int8_t outByte = 0; + m_videoMemory.r_Byte(k, outByte); + m_videoMemory.w_Byte(k - line_len, outByte); + k++; + m_videoMemory.r_Byte(k, outByte); + m_videoMemory.w_Byte(k - line_len, outByte); + k++; + m_videoMemory.r_Byte(k, outByte); + m_videoMemory.w_Byte(k - line_len, outByte); + } + for (int32_t i = m_16Color_currentFrameAddr + m_16Color_frameSize - line_len; i < m_16Color_currentFrameAddr + m_16Color_frameSize; i += 4) + { + m_videoMemory.w_Byte(i, 0x20); + } + } + diff --git a/src/hardware/VirtualIODevices.hpp b/src/hardware/VirtualIODevices.hpp index e6fa3d0..7b3aeb8 100644 --- a/src/hardware/VirtualIODevices.hpp +++ b/src/hardware/VirtualIODevices.hpp @@ -380,6 +380,7 @@ namespace dragon 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); void swapBuffers_16Colors(void); + void scroll_16Colors(void); private: ostd::serial::SerialIO m_videoMemory; diff --git a/src/runtime/DragonRuntime.cpp b/src/runtime/DragonRuntime.cpp index f7dcfd7..c029760 100644 --- a/src/runtime/DragonRuntime.cpp +++ b/src/runtime/DragonRuntime.cpp @@ -403,8 +403,19 @@ namespace dragon __get_machine_footprint(&s_machineInfo, trackedAddresses, true); __track_call_stack(&s_machineInfo); bool running = cpu.execute() && vDisplay.isRunning(); + uint8_t screenRedrawRate = vCMOS.read8(data::CMOSRegisters::ScreenRedrawRate); vDisplay.update(); - vDisplay.redrawScreen(); // This is slow...maybe it should be on a 100ms rate, like in normal runtime mode + if (s_enableScreenRedrawDelay && s_stepAcc2 == (1000 / screenRedrawRate)) + { + vDisplay.redrawScreen(); + s_stepAcc2 = 0; + } + else if (!s_enableScreenRedrawDelay) + { + vDisplay.redrawScreen(); + } + s_stepAcc2++; + // vDisplay.redrawScreen(); // This is slow...maybe it should be on a 100ms rate, like in normal runtime mode vDiskInterface.cycleStep(); __get_machine_footprint(&s_machineInfo, trackedAddresses, false); return running || vDiskInterface.isBusy(); diff --git a/src/runtime/DragonRuntime.hpp b/src/runtime/DragonRuntime.hpp index 5b6e229..db664d8 100644 --- a/src/runtime/DragonRuntime.hpp +++ b/src/runtime/DragonRuntime.hpp @@ -132,6 +132,8 @@ namespace dragon inline static tMachineConfig machine_config; inline static uint64_t s_avgInstTime { 0 }; + inline static double s_stepAcc2 { 0 }; + inline static bool s_enableScreenRedrawDelay { true }; private: inline static tMachineDebugInfo s_machineInfo;