First step of implementing Scroll in Text16Color mode

This commit is contained in:
Syl4r39 2025-04-07 07:15:50 +02:00
parent e3cb57e454
commit dcbf3cce66
18 changed files with 233 additions and 4 deletions

View file

@ -1 +1 @@
1620 1621

Binary file not shown.

Binary file not shown.

View file

@ -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

View file

@ -24,7 +24,6 @@ _kernel0_main:
push DefaultPalette.Black push DefaultPalette.Black
push 1 push 1
call $_clear_screen call $_clear_screen
debug_break
push $test_str push $test_str
push 1 push 1
call $_print_string call $_print_string
@ -34,12 +33,38 @@ _kernel0_main:
push 1 push 1
call $_init_keyboard call $_init_keyboard
_infinite_loop:
jmp $_infinite_loop
hlt 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) _print_string: ## _print_string(string* str)
arg R1 ## @Param: str arg R1 ## @Param: str
@ -54,6 +79,26 @@ _print_string: ## _print_string(string* str)
ret 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
## =========================================================================================================================

View file

@ -1,5 +1,7 @@
@guard _KEYBOARD_DRIVER_DSS_ @guard _KEYBOARD_DRIVER_DSS_
@include <ascii.dss>
.code .code
_init_keyboard: ## _init_keyboard(func_ptr* key_pressed_handler) _init_keyboard: ## _init_keyboard(func_ptr* key_pressed_handler)

View file

@ -141,6 +141,7 @@
SWAP_BUFFERS 0x10 SWAP_BUFFERS 0x10
WRITE_VRAM 0x11 WRITE_VRAM 0x11
SCROLL 0x12
FORCE_REFRESH_SCREEN 0xE0 FORCE_REFRESH_SCREEN 0xE0
FORCE_CLEAR_SCREEN 0xE1 FORCE_CLEAR_SCREEN 0xE1

View file

@ -67,6 +67,7 @@ _int_30_handler:
jeq $_int_30_print_string_text16, 0x0022 jeq $_int_30_print_string_text16, 0x0022
jeq $_int_30_print_integer_text16, 0x0023 jeq $_int_30_print_integer_text16, 0x0023
jeq $_int_30_clear_screen_text16, 0x0024 jeq $_int_30_clear_screen_text16, 0x0024
jeq $_int_30_scroll_text16, 0x0025
jeq $_int_30_clear_screen, 0x00E0 jeq $_int_30_clear_screen, 0x00E0
jeq $_int_30_refresh_screen, 0x00E1 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.MEMORY_CONTROLLER_BG_COL], *R9
movb [VGA_Registers.SIGNAL], Sig_VGA_Text_16_Color.FORCE_CLEAR_SCREEN movb [VGA_Registers.SIGNAL], Sig_VGA_Text_16_Color.FORCE_CLEAR_SCREEN
jmp $_int_30_end 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: _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

@ -100,6 +100,7 @@
CONTINUE 0x00 CONTINUE 0x00
SWAP_BUFFERS 0x10 SWAP_BUFFERS 0x10
WRITE_VRAM 0x11 WRITE_VRAM 0x11
SCROLL 0x12
FORCE_REFRESH_SCREEN 0xE0 FORCE_REFRESH_SCREEN 0xE0
FORCE_CLEAR_SCREEN 0xE1 FORCE_CLEAR_SCREEN 0xE1
FORCE_REDRAW_SCREEN 0xE2 FORCE_REDRAW_SCREEN 0xE2

View file

@ -125,7 +125,6 @@ _endless_loop:
mov R10, 0x12 ## int 0x20 parameter for load_from_ddd_blocking mov R10, 0x12 ## int 0x20 parameter for load_from_ddd_blocking
int 0x20 ## Bios interrupt int 0x20 ## Bios interrupt
debug_break
jmp OS_LOAD_ADDR jmp OS_LOAD_ADDR
jmp $_main_end jmp $_main_end

View file

@ -1,4 +1,5 @@
Runtime: Runtime:
Add option to disable screenRedrawRate in debugger top-level prompt
Assembler: Assembler:
Add subroutine address export functionality Add subroutine address export functionality

View file

@ -34,6 +34,8 @@ namespace dragon
m_lines = IncludePreprocessor::loadEntryFile(fileName); m_lines = IncludePreprocessor::loadEntryFile(fileName);
if (m_lines.size() == 0) if (m_lines.size() == 0)
return { }; //TODO: Error return { }; //TODO: Error
// for (auto& line : m_lines)
// std::cout << line << "\n";
removeComments(); removeComments();
parseExportSpecifications(); parseExportSpecifications();
createExports(); createExports();

View file

@ -179,6 +179,11 @@ namespace dragon
DragonRuntime::vGraphicsInterface.swapBuffers_16Colors(); DragonRuntime::vGraphicsInterface.swapBuffers_16Colors();
__redraw_screen(); __redraw_screen();
} }
else if (signal == tSignalValues::Text16Color_Scroll)
{
DragonRuntime::vGraphicsInterface.scroll_16Colors();
__redraw_screen();
}
} }
else return; else return;
mem.write8(vga_addr + tRegisters::Signal, tSignalValues::Continue); mem.write8(vga_addr + tRegisters::Signal, tSignalValues::Continue);

View file

@ -47,6 +47,7 @@ namespace dragon
inline static constexpr uint8_t Text16Color_SwapBuffers = 0x10; inline static constexpr uint8_t Text16Color_SwapBuffers = 0x10;
inline static constexpr uint8_t Text16Color_WriteMemory = 0x11; 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 RefreshScreen = 0xE0;
inline static constexpr uint8_t ClearSCreen = 0xE1; inline static constexpr uint8_t ClearSCreen = 0xE1;

View file

@ -799,6 +799,28 @@ namespace dragon
m_16Color_secondFrameAddr = tmp; 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);
}
}

View file

@ -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 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); bool clearVRAM_16Colors(uint8_t character = 0, uint8_t background = 0x00, uint8_t foreground = 0xFF);
void swapBuffers_16Colors(void); void swapBuffers_16Colors(void);
void scroll_16Colors(void);
private: private:
ostd::serial::SerialIO m_videoMemory; ostd::serial::SerialIO m_videoMemory;

View file

@ -403,8 +403,19 @@ namespace dragon
__get_machine_footprint(&s_machineInfo, trackedAddresses, true); __get_machine_footprint(&s_machineInfo, trackedAddresses, true);
__track_call_stack(&s_machineInfo); __track_call_stack(&s_machineInfo);
bool running = cpu.execute() && vDisplay.isRunning(); bool running = cpu.execute() && vDisplay.isRunning();
uint8_t screenRedrawRate = vCMOS.read8(data::CMOSRegisters::ScreenRedrawRate);
vDisplay.update(); 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(); vDiskInterface.cycleStep();
__get_machine_footprint(&s_machineInfo, trackedAddresses, false); __get_machine_footprint(&s_machineInfo, trackedAddresses, false);
return running || vDiskInterface.isBusy(); return running || vDiskInterface.isBusy();

View file

@ -132,6 +132,8 @@ namespace dragon
inline static tMachineConfig machine_config; inline static tMachineConfig machine_config;
inline static uint64_t s_avgInstTime { 0 }; inline static uint64_t s_avgInstTime { 0 };
inline static double s_stepAcc2 { 0 };
inline static bool s_enableScreenRedrawDelay { true };
private: private:
inline static tMachineDebugInfo s_machineInfo; inline static tMachineDebugInfo s_machineInfo;