From cdd8afb05d6328dd1f681c97fe520b74803faa46 Mon Sep 17 00:00:00 2001 From: OmniaX Date: Fri, 12 Jan 2024 16:58:28 +0100 Subject: [PATCH] [0.2.1577] - Added Virtual Display (Text-Single-Color mode only) --- CMakeLists.txt | 4 + build.nr | 2 +- count_lines.sh | 14 ++ create_win_release.sh | 23 ++- extra/config/testMachine.dvm | 4 +- extra/dragon info/DragonVM Information Sheet | 122 +++++++++++++ extra/dragon info/DragonVM Memory Structure | 69 ------- extra/dragon info/Interrupts | 13 -- extra/dragon info/Memory Map.png | Bin 124438 -> 0 bytes extra/dragon/bios.bin | Bin 4096 -> 4096 bytes extra/dss/{ => bios}/bios.dss | 182 +++++++++++++++++-- extra/dss/newTest.dss | 108 ++++------- extra/dss/{test.dss => test1.dss} | 2 +- extra/dss/test2.dss | 48 +++++ extra/font_big.bmp | Bin 0 -> 439434 bytes extra/make | 13 ++ extra/make_and_debug | 25 +++ extra/make_and_run | 3 +- extra/scripts/bios_flash | 4 +- extra/scripts/run-test-1.bat | 2 + extra/scripts/run-test-2.bat | 2 + run-test.bat | 2 - src/assembler/Assembler.cpp | 28 ++- src/debugger/Debugger.cpp | 12 +- src/debugger/Debugger.hpp | 2 +- src/gui/Renderer.cpp | 70 +++++++ src/gui/Renderer.hpp | 29 +++ src/gui/Window.cpp | 8 +- src/gui/Window.hpp | 7 +- src/hardware/VirtualCPU.cpp | 23 +++ src/hardware/VirtualDisplay.cpp | 158 ++++++++++++++++ src/hardware/VirtualDisplay.hpp | 60 ++++++ src/hardware/VirtualIODevices.cpp | 33 +++- src/hardware/VirtualIODevices.hpp | 1 + src/runtime/ConfigLoader.cpp | 10 + src/runtime/ConfigLoader.hpp | 4 +- src/runtime/DragonRuntime.cpp | 3 +- src/runtime/DragonRuntime.hpp | 33 ++-- src/tools/GlobalData.hpp | 18 +- 39 files changed, 914 insertions(+), 227 deletions(-) create mode 100644 count_lines.sh create mode 100644 extra/dragon info/DragonVM Information Sheet delete mode 100644 extra/dragon info/DragonVM Memory Structure delete mode 100644 extra/dragon info/Interrupts delete mode 100644 extra/dragon info/Memory Map.png rename extra/dss/{ => bios}/bios.dss (51%) rename extra/dss/{test.dss => test1.dss} (98%) create mode 100644 extra/dss/test2.dss create mode 100644 extra/font_big.bmp create mode 100644 extra/make create mode 100644 extra/make_and_debug create mode 100644 extra/scripts/run-test-1.bat create mode 100644 extra/scripts/run-test-2.bat delete mode 100644 run-test.bat create mode 100644 src/gui/Renderer.cpp create mode 100644 src/gui/Renderer.hpp create mode 100644 src/hardware/VirtualDisplay.cpp create mode 100644 src/hardware/VirtualDisplay.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 79e4a8c..f2969fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,12 +31,14 @@ list(APPEND RUNTIME_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/gui/Window.cpp ${CMAKE_CURRENT_LIST_DIR}/src/gui/RawTextRenderer.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/gui/Renderer.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualCPU.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualRAM.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/MemoryMapper.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualIODevices.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualHardDrive.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualDisplay.cpp ${CMAKE_CURRENT_LIST_DIR}/src/tools/Utils.cpp ) @@ -47,12 +49,14 @@ list(APPEND DEBUGGER_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/src/gui/Window.cpp ${CMAKE_CURRENT_LIST_DIR}/src/gui/RawTextRenderer.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/gui/Renderer.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualCPU.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualRAM.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/MemoryMapper.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualIODevices.cpp ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualHardDrive.cpp + ${CMAKE_CURRENT_LIST_DIR}/src/hardware/VirtualDisplay.cpp ${CMAKE_CURRENT_LIST_DIR}/src/runtime/DragonRuntime.cpp ${CMAKE_CURRENT_LIST_DIR}/src/runtime/ConfigLoader.cpp diff --git a/build.nr b/build.nr index 340b351..7bb9a89 100644 --- a/build.nr +++ b/build.nr @@ -1 +1 @@ -1576 +1578 diff --git a/count_lines.sh b/count_lines.sh new file mode 100644 index 0000000..2839182 --- /dev/null +++ b/count_lines.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +green='\033[0;32m' +red='\033[0;31m' +clear='\033[0m' + +printf "Counting lines of code...\n" + +(find ./src/ -type f \( -iname \*.hpp -o -iname \*.cpp \) | xargs -n1 cpp -fpreprocessed -P | awk '!/^[{[:space:]}]*$/' | wc -l) > _lines.tmp 2> /dev/null +typeset -i netto_lines=$(cat _lines.tmp) +rm _lines.tmp +total_lines=$(find ./src/ -type f \( -iname \*.hpp -o -iname \*.cpp \) | xargs wc -l | sort -n | tail -1 | tr -d -c 0-9) +printf "Total: ${red}${total_lines}\n${clear}" +printf "Netto: ${green}${netto_lines}${clear} (No braces, comments or empty lines.)\n" \ No newline at end of file diff --git a/create_win_release.sh b/create_win_release.sh index fcd10a4..291b80c 100644 --- a/create_win_release.sh +++ b/create_win_release.sh @@ -7,7 +7,7 @@ rm -r ./win-release cd bin printf "${green}Compiling vBIOS...\n${clear}" -./dasm dss/bios.dss -o dragon/bios.bin --save-disassembly disassembly/bios.dds --verbose +./dasm dss/bios/bios.dss -o dragon/bios.bin --save-disassembly disassembly/bios.dds --verbose printf "\n${green}Creating Virtual Disk...\n${clear}" rm dragon/disk1.dr @@ -19,8 +19,10 @@ printf "\n${green}Compiling MBR Block...\n${clear}" printf "\n${green}Loading MBR Block...\n${clear}" ./dtools load-binary dragon/disk1.dr dragon/mbr.bin 0x00000000 -printf "${green}Compiling Test Program...\n" -./dasm dss/test.dss -o test.bin --save-disassembly disassembly/test.dds --verbose +printf "${green}Compiling Test Program 1...\n" +./dasm dss/test1.dss -o test1.bin --save-disassembly disassembly/test1.dds --verbose +printf "${green}Compiling Test Program 2...\n" +./dasm dss/test2.dss -o test2.bin --save-disassembly disassembly/test2.dds --verbose printf "${green}Creating Windows Release...\n" cd .. @@ -31,17 +33,23 @@ cp ./bin/ddb.exe ./win-release cp ./bin/dtools.exe ./win-release cp ./bin/dvm.exe ./win-release cp ./bin/font.bmp ./win-release -# cp ./bin/test.bin ./win-release cp -r ./bin/config ./win-release cp -r ./bin/disassembly/bios.dds ./win-release/disassembly cp -r ./bin/disassembly/mbr.dds ./win-release/disassembly +cp -r ./bin/disassembly/test1.dds ./win-release/disassembly +cp -r ./bin/disassembly/test2.dds ./win-release/disassembly cp -r ./bin/dragon ./win-release +rm ./bin/disassembly/test1.dds +rm ./bin/disassembly/test2.dds + mkdir ./win-release/dss -cp ./bin/dss/bios.dss ./win-release/dss +mkdir ./win-release/dss/bios +cp ./bin/dss/bios/bios.dss ./win-release/dss/bios cp ./bin/dss/mbr.dss ./win-release/dss -cp ./bin/dss/test.dss ./win-release/dss +cp ./bin/dss/test1.dss ./win-release/dss +cp ./bin/dss/test2.dss ./win-release/dss cp C:/msys64/ucrt64/bin/libgcc_s_seh-1.dll ./win-release cp C:/msys64/ucrt64/bin/libstdc++-6.dll ./win-release @@ -49,4 +57,5 @@ cp C:/msys64/ucrt64/bin/libwinpthread-1.dll ./win-release cp C:/msys64/ucrt64/bin/SDL2.dll ./win-release cp C:/msys64/ucrt64/bin/libostd.dll ./win-release -cp ./run-test.bat ./win-release \ No newline at end of file +cp ./extra/scripts/run-test-1.bat ./win-release +cp ./extra/scripts/run-test-2.bat ./win-release \ No newline at end of file diff --git a/extra/config/testMachine.dvm b/extra/config/testMachine.dvm index c6c902d..90cb646 100644 --- a/extra/config/testMachine.dvm +++ b/extra/config/testMachine.dvm @@ -1,3 +1,5 @@ Disks = dragon/disk1.dr Bios = dragon/bios.bin -CMOS = dragon/cmos.dr \ No newline at end of file +CMOS = dragon/cmos.dr +SingleColor_foreground = #009900FF +SingleColor_background = #111111FF \ No newline at end of file diff --git a/extra/dragon info/DragonVM Information Sheet b/extra/dragon info/DragonVM Information Sheet new file mode 100644 index 0000000..eaa340f --- /dev/null +++ b/extra/dragon info/DragonVM Information Sheet @@ -0,0 +1,122 @@ +#========================================================================================================================================== +# Memory Map +#========================================================================================================================================== + + +0x0000 BIOS (4096 Bytes) +0x0FFF +------- +0x1000 CMOS (128 Bytes) + BootDisk: 0x0010 +0x107F +------- +0x1080 INTERRUPT VECTOR (512 Bytes) + Status: 1 Byte + 0xFF: Enabled + 0x00: Disabled + Handler Address: 2 Byte + ...Repeat... +0x127F +------- +0x1280 KEYBOARD MAPPING (224 Bytes) +0x135F +------- +0x1360 MOUSE MAPPING (32 Bytes) +0x137F +------- +0x1380 BOOTLOADER (512 Bytes) +0x157F +------- +0x1580 DISK INTERFACE (128 Bytes) + Read/Write: + Signal: 1 Byte + 0x00: Start Operation + 0x01: Cancel Current Operation + 0xFF: Ignore + Mode: 1 Byte + 0x00: Read + 0x01: Write + Disk: 1 Byte + Sector: 2 Bytes + Address: 2 Bytes + DataSize: 2 Bytes + DataAddress: 2 Byte + ReadOnly: + Status: 1 Byte + 0x00: Free + 0x01: Writing + 0x02: Reading + CurrentDisk: 1 Byte + CurrentSector: 2 Bytes + CurrentAddress: 2 Bytes + RestDataSize: 2 Bytes + SourceData: 2 Bytes + Free: 107 Byte +0x15FF +------- +0x1600 VIDEO CARD INTERFACE (256 Bytes) + 0x00: Video Mode (1 Byte) + 0x00: Text Single Color + # 0x01: Text 16-color + # 0x02: Text 256-color + # 0x03: Text True Color Mode + # 0x04: GFX Single Color + # 0x05: GFX 16-color + # 0x06: GFX 256-color + # 0x07: GFX True Color Mode + # 0x01: Clear Color (1 Byte) + # 0x02: Palette (1 Byte) + 0x03: Signal (1 Byte) + 0x00: Continue + + 0x02: Text Single Color - Direct Print Character + 0x03: Text Single Color - Store character in buffer + 0x04: Text SIngle Color - Direct Print buffer & Flush Buffer + 0x05: Text Single Color - Flush Buffer + 0x06: Text Single Color - Print Buffer Without Flushing + + 0xE0: Refresh Screen + 0xE1: Clear Screen + 0x04: Text Single Color Character +0x16FF +------- +0x1700 GENERIC SERIAL INTERFACE (64 Bytes) +0x173F +------- +0x1740 RAM (59583 Bytes) +0xFFFF + + + +#========================================================================================================================================== +# INTERRUPTS +#========================================================================================================================================== + + + + +BIOS Specific - Software Interrupts: +==================================== +0x20: BIOS Interrupt (Uses R10 register for specific functionality) + 0x00: Set Interrupt Handler + 0x01: Clear Interrupt Handler + 0x10: Disk Interface +0x30: BIOS Video Interrupt (Uses R10 register for specific functionality) + 0x01: Print Char in Text Single Mode (char stored in R9 register) + 0x02: New Line in Text Single Mode + 0x03: Print Null-Terminated String in Text Single Mode (string address stored in R9 register) + 0x04: Print Integer in Text Single Mode (integer stored in R9 register) + 0x05: Store Integer in buffer in Text Single Mode (integer stored in R9 register) + 0x06: Store character in buffer in Text Single Mode (integer stored in R9 register) + 0x07: Print buffer no flush in Text Single Mode + 0x08: Print buffer and flush in Text Single Mode + 0x09: Flush buffer in Text Single Mode + 0x0A: Store Null-Terminated String in buffer in Text Single Mode (string address stored in R9 register) + + 0xE0: Refresh Screen + 0xE1: Clear Screen + + +Machine Specific - Hardware Interrupts: +======================================= +0x80: Disk Interface Finished \ No newline at end of file diff --git a/extra/dragon info/DragonVM Memory Structure b/extra/dragon info/DragonVM Memory Structure deleted file mode 100644 index 2499593..0000000 --- a/extra/dragon info/DragonVM Memory Structure +++ /dev/null @@ -1,69 +0,0 @@ -0x0000 BIOS (4096 Bytes) -0x0FFF -------- -0x1000 CMOS (128 Bytes) - BootDisk: 0x0010 -0x107F -------- -0x1080 INTERRUPT VECTOR (512 Bytes) - Status: 1 Byte - 0xFF: Enabled - 0x00: Disabled - Handler Address: 2 Byte - ...Repeat... -0x127F -------- -0x1280 KEYBOARD MAPPING (224 Bytes) -0x135F -------- -0x1360 MOUSE MAPPING (32 Bytes) -0x137F -------- -0x1380 BOOTLOADER (512 Bytes) -0x157F -------- -0x1580 DISK INTERFACE (128 Bytes) - Read/Write: - Signal: 1 Byte - 0x00: Start Operation - 0x01: Cancel Current Operation - 0xFF: Ignore - Mode: 1 Byte - 0x00: Read - 0x01: Write - Disk: 1 Byte - Sector: 2 Bytes - Address: 2 Bytes - DataSize: 2 Bytes - DataAddress: 2 Byte - ReadOnly: - Status: 1 Byte - 0x00: Free - 0x01: Writing - 0x02: Reading - CurrentDisk: 1 Byte - CurrentSector: 2 Bytes - CurrentAddress: 2 Bytes - RestDataSize: 2 Bytes - SourceData: 2 Bytes - Free: 107 Byte -0x15FF -------- -0x1600 VIDEO CARD INTERFACE (256 Bytes) - 0x00: Video Mode (1 Byte) - 0x00: Single Color - 0x01: 16-color - 0x02: 256-color - 0x03: True Color Mode - 0x01: Clear Color (1 Byte) - 0x02: Palette (1 Byte) - 0x03: Signal (1 Byte) - 0x00: Continue - 0x01: Clear Screen -0x16FF -------- -0x1700 GENERIC SERIAL INTERFACE (64 Bytes) -0x173F -------- -0x1740 RAM (59583 Bytes) -0xFFFF diff --git a/extra/dragon info/Interrupts b/extra/dragon info/Interrupts deleted file mode 100644 index ecf25f3..0000000 --- a/extra/dragon info/Interrupts +++ /dev/null @@ -1,13 +0,0 @@ -Software Interrupts: -==================== -0x20: BIOS Interrupt (Uses R10 register for specific functionality) - 0x00: Set Interrupt Handler - 0x01: Clear Interrupt Handler - 0x10: Disk Interface -0x30: BIOS Video Interrupt (Uses R10 register for specific functionality) - 0x00: Clear Screen - - -Hardware Interrupts: -==================== -0x80: Disk Interface Finished \ No newline at end of file diff --git a/extra/dragon info/Memory Map.png b/extra/dragon info/Memory Map.png deleted file mode 100644 index 1ac7c135bde17fea0b4070f9e7e50ad61e71e9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124438 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 ar@G( 0x11, 0x22 - height:2 > 0x99 - x:2 - y:2 > 0xAA -@end +.load 0x1740 .data $string "Hello World!!" - $rect = (0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88) - $test_byte 0xAF - $super_long_variable_name 0x01, 0x02, 0x03, 0x04 .code -begin: - mov R10, Rectangle.SIZE - mov R9, [$rect.height] - mov R8, [$rect.width] - mov R7, [$rect.x] - mov R5, $strlen - push $string - push 1 - call R5 - push 0 - call $testinttest - debug_break - mov [$rect.y], 0x0000 - ## debug_break - jmp $begin - push $string - push 1 - call $strlen - mov R1, RV - mov IP, 0x0001 - mov R1, RV + mov R1, 99 ## Zero the counter +infinite_loop: + inc R1 ## Increment the counter + div R1, 10 ## Divide the counter by 10 + mov ACC, RV + jne $no_clear_screen, 0 ## If reminder not zero, keep going + mov R10, 0xE0 ## Else clear the screen (0x0E is for 'Clear Screen' functionality in int 0x30) + int 0x30 ## BIOS Video Interrupt +no_clear_screen: + + ## Print counter + mov R9, R1 ## Pass the counter as parameter to int 0x30 + mov R10, 0x05 ## 0x05 is for 'Store Integer in buffer' functionality in int 0x30 + int 0x30 ## BIOS Video Interrupt + + ## Print a space + mov R9, 32 ## Pass 32 (space character in ASCII) as parameter to int 0x30 + mov R10, 0x06 ## 0x06 is for 'Store Character in buffer' functionality in int 0x30 + int 0x30 ## BIOS Video Interrupt + + ## Print the string + mov R9, $string ## Pass the address of the string as parameter to int 0x30 + mov R10, 0x0A ## 0x0A is for 'Store String in buffer' functionality in int 0x30 + int 0x30 ## BIOS Video Interrupt + + ## Print a new-line character + mov R10, 0x02 ## 0x02 is for 'Print New-Line' functionality in int 0x30 + ## Printing a new line when in Text-Single-Color Mode also + ## prints and flushes the buffer + int 0x30 ## BIOS Video Interrupt + + jmp $infinite_loop ## jump to the beginning of infinite loop hlt -testinttest: - push 0 - call $inttest - ret - -inttest: - push 0 - call $testint - ret - -testint: - push 0 - call $test_int - ret - -test_int: - push 0 - call $int_test - ret - -int_test: - nop - ret - - -strlen: - arg R1 - mov R2, 0 -loop: - movb ACC, *R1 - inc R1 - jeq $loop_end, 0 -not_zero: - inc R2 - jmp $loop -loop_end: - mov RV, R2 - ret - .fixed 512, 0x00 \ No newline at end of file diff --git a/extra/dss/test.dss b/extra/dss/test1.dss similarity index 98% rename from extra/dss/test.dss rename to extra/dss/test1.dss index 204e9fb..7c3d69c 100644 --- a/extra/dss/test.dss +++ b/extra/dss/test1.dss @@ -1,5 +1,5 @@ ##================================================================================================================================= -## This is the test program for the Dragon Virtual Machine. The example has two subroutines: One is the $strlen subroutine, +## This is the test1 program for the Dragon Virtual Machine. The example has two subroutines: One is the $strlen subroutine, ## which calculates the length of the string passed as a parameter; The other calculates the fibonacci sequence up to the ## Nth number (N being the parameter passed to the subroutine). ## In the main part of the .code section, debug_break instructions are used in order to pause the debugger, so that the diff --git a/extra/dss/test2.dss b/extra/dss/test2.dss new file mode 100644 index 0000000..ad0b86b --- /dev/null +++ b/extra/dss/test2.dss @@ -0,0 +1,48 @@ +##================================================================================================================================= +## This is the test2 program for the Dragon Virtual Machine. This example simply demonstrates the Virtual Display in Text-Single-Color +## mode, by printing an increasing counter followed by whatever is in the $string variable. The program also clears the screen +## every 10 lines. +##================================================================================================================================= + +.load 0x1740 + +.data + $string "Hello World!!" + +.code + mov R1, 99 ## Zero the counter +infinite_loop: + inc R1 ## Increment the counter + div R1, 10 ## Divide the counter by 10 + mov ACC, RV + jne $no_clear_screen, 0 ## If reminder not zero, keep going + mov R10, 0xE0 ## Else clear the screen (0x0E is for 'Clear Screen' functionality in int 0x30) + int 0x30 ## BIOS Video Interrupt +no_clear_screen: + + ## Print counter + mov R9, R1 ## Pass the counter as parameter to int 0x30 + mov R10, 0x05 ## 0x05 is for 'Store Integer in buffer' functionality in int 0x30 + int 0x30 ## BIOS Video Interrupt + + ## Print a space + mov R9, 32 ## Pass 32 (space character in ASCII) as parameter to int 0x30 + mov R10, 0x06 ## 0x06 is for 'Store Character in buffer' functionality in int 0x30 + int 0x30 ## BIOS Video Interrupt + + ## Print the string + mov R9, $string ## Pass the address of the string as parameter to int 0x30 + mov R10, 0x0A ## 0x0A is for 'Store String in buffer' functionality in int 0x30 + int 0x30 ## BIOS Video Interrupt + + ## Print a new-line character + mov R10, 0x02 ## 0x02 is for 'Print New-Line' functionality in int 0x30 + ## Printing a new line when in Text-Single-Color Mode also + ## prints and flushes the buffer + int 0x30 ## BIOS Video Interrupt + + jmp $infinite_loop ## jump to the beginning of infinite loop + hlt + + +.fixed 512, 0x00 \ No newline at end of file diff --git a/extra/font_big.bmp b/extra/font_big.bmp new file mode 100644 index 0000000000000000000000000000000000000000..133414b50921e22b75a788e00b76260b2efbe90a GIT binary patch literal 439434 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 literal 0 HcmV?d00001 diff --git a/extra/make b/extra/make new file mode 100644 index 0000000..8f22b0a --- /dev/null +++ b/extra/make @@ -0,0 +1,13 @@ +#!/bin/bash + +green='\033[0;32m' +clear='\033[0m' + +printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}" +\cp -r ../extra/* ./ +if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + make +elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then + mingw32-make.exe +fi +printf "${green}\n=================================================================================================================\n\n" \ No newline at end of file diff --git a/extra/make_and_debug b/extra/make_and_debug new file mode 100644 index 0000000..c5cb565 --- /dev/null +++ b/extra/make_and_debug @@ -0,0 +1,25 @@ +#!/bin/bash + +green='\033[0;32m' +clear='\033[0m' + +printf "${green}\n============================================[ Building Application ]============================================\n\n${clear}" +\cp -r ../extra/* ./ +if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then + make +elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW64_NT" ]; then + mingw32-make.exe +fi +printf "${green}\n=================================================================================================================\n\n" +if [ $? -eq 0 ]; then + cd scripts + /bin/bash ./bios_flash + /bin/bash ./load_mbr + cd .. + printf "${green}Compiling Test Program...\n" + ./dasm dss/newTest.dss -o newTest.bin --save-disassembly disassembly/newTest.dds --verbose + printf "\n${green}Running Application...\n\n${clear}" + ./ddb config/testMachine.dvm --force-load newTest.bin 0x00 --verbose-load + cp dragon/disk1.dr ../extra/dragon/disk1.dr + cp dragon/cmos.dr ../extra/dragon/cmos.dr +fi diff --git a/extra/make_and_run b/extra/make_and_run index 4157d6a..948a57b 100644 --- a/extra/make_and_run +++ b/extra/make_and_run @@ -19,8 +19,7 @@ if [ $? -eq 0 ]; then printf "${green}Compiling Test Program...\n" ./dasm dss/newTest.dss -o newTest.bin --save-disassembly disassembly/newTest.dds --verbose printf "\n${green}Running Application...\n\n${clear}" - ./ddb config/testMachine.dvm --force-load newTest.bin 0x00 --verbose-load --hide-vdisplay - # ./dvm config/testMachine.dvm --debug --force-load newTest.bin 0x00 --verbose-load + ./dvm config/testMachine.dvm --force-load newTest.bin 0x00 cp dragon/disk1.dr ../extra/dragon/disk1.dr cp dragon/cmos.dr ../extra/dragon/cmos.dr fi diff --git a/extra/scripts/bios_flash b/extra/scripts/bios_flash index c7a66ce..7f5af9d 100644 --- a/extra/scripts/bios_flash +++ b/extra/scripts/bios_flash @@ -5,6 +5,6 @@ clear='\033[0m' printf "${green}Reloading BIOS...\n${clear}" cd .. -cp ../extra/dss/bios.dss ./dss/bios.dss -./dasm dss/bios.dss -o dragon/bios.bin --save-disassembly disassembly/bios.dds --verbose +cp ../extra/dss/bios/bios.dss ./dss/bios/bios.dss +./dasm dss/bios/bios.dss -o dragon/bios.bin --save-disassembly disassembly/bios.dds --verbose cp dragon/bios.bin ../extra/dragon/bios.bin diff --git a/extra/scripts/run-test-1.bat b/extra/scripts/run-test-1.bat new file mode 100644 index 0000000..2b89fff --- /dev/null +++ b/extra/scripts/run-test-1.bat @@ -0,0 +1,2 @@ +dasm dss/test1.dss -o test1.bin --save-disassembly disassembly/test1.dds --verbose +ddb config/testMachine.dvm --force-load test1.bin 0x00 --verbose-load --hide-vdisplay \ No newline at end of file diff --git a/extra/scripts/run-test-2.bat b/extra/scripts/run-test-2.bat new file mode 100644 index 0000000..7080b39 --- /dev/null +++ b/extra/scripts/run-test-2.bat @@ -0,0 +1,2 @@ +dasm dss/test2.dss -o test2.bin --save-disassembly disassembly/test2.dds --verbose +ddb config/testMachine.dvm --force-load test2.bin 0x00 --verbose-load --hide-vdisplay \ No newline at end of file diff --git a/run-test.bat b/run-test.bat deleted file mode 100644 index 589665b..0000000 --- a/run-test.bat +++ /dev/null @@ -1,2 +0,0 @@ -dasm dss/test.dss -o test.bin --save-disassembly disassembly/test.dds --verbose -ddb config/testMachine.dvm --force-load test.bin 0x00 --verbose-load --hide-vdisplay \ No newline at end of file diff --git a/src/assembler/Assembler.cpp b/src/assembler/Assembler.cpp index e0a7f82..2a8df79 100644 --- a/src/assembler/Assembler.cpp +++ b/src/assembler/Assembler.cpp @@ -128,7 +128,7 @@ namespace dragon void Assembler::loadSource(ostd::String source) { m_rawSource = source; - m_lines = ostd::String(source).tokenize("\n").getRawData(); + m_lines = ostd::String(source.replaceAll("\t", " ")).tokenize("\n").getRawData(); } ostd::ByteStream Assembler::assembleToFile(ostd::String sourceFileName, ostd::String binaryFileName) @@ -245,7 +245,7 @@ namespace dragon { ostd::String lineEdit(line); for (int32_t i = defines.size() - 1; i >= 0; i--) - lineEdit.replaceAll(defines[i].name, defines[i].value); + lineEdit.replaceAll(defines[i].name, defines[i].value.new_trim()); line = lineEdit; } m_lines.clear(); @@ -1190,7 +1190,7 @@ namespace dragon } return; } - else if (instEdit == "add" || instEdit == "sub" || instEdit == "mul") + else if (instEdit == "add" || instEdit == "sub" || instEdit == "mul" || instEdit == "div") { m_code.push_back(0x00); eOperandType opType = parseOperand(st.next(), word); @@ -1208,6 +1208,7 @@ namespace dragon if (instEdit == "add") m_code[m_code.size() - 2] = data::OpCodes::AddImmReg; else if (instEdit == "sub") m_code[m_code.size() - 2] = data::OpCodes::SubImmReg; else if (instEdit == "mul") m_code[m_code.size() - 2] = data::OpCodes::MulImmReg; + else if (instEdit == "div") m_code[m_code.size() - 2] = data::OpCodes::DivImmReg; m_code.push_back((uint8_t)((word & 0xFF00) >> 8)); m_code.push_back((uint8_t)(word & 0x00FF)); } @@ -1216,6 +1217,7 @@ namespace dragon if (instEdit == "add") m_code[m_code.size() - 2] = data::OpCodes::AddRegReg; else if (instEdit == "sub") m_code[m_code.size() - 2] = data::OpCodes::SubRegReg; else if (instEdit == "mul") m_code[m_code.size() - 2] = data::OpCodes::MulRegReg; + else if (instEdit == "div") m_code[m_code.size() - 2] = data::OpCodes::DivRegReg; m_code.push_back((uint8_t)word); } else @@ -1435,6 +1437,26 @@ namespace dragon return eOperandType::DerefRegister; return eOperandType::Register; } + else if (opEdit.startsWith("reg(") && opEdit.endsWith(")")) + { + opEdit.substr(4, opEdit.len() - 1); + opEdit.trim(); + if (!opEdit.isNumeric()) + { + std::cout << "Invalid numeric value: " << opEdit << "\n"; + return eOperandType::Error; + } + uint8_t _reg = opEdit.toInt(); + if (_reg >= data::Registers::Last) + { + std::cout << "Invalid Register: " << opEdit << "\n"; + return eOperandType::Error; + } + outOp = (int16_t)_reg; + if (derefReg) + return eOperandType::DerefRegister; + return eOperandType::Register; + } if (derefReg) { std::cout << "Invalid Register Dereferencing: " << op << "\n"; diff --git a/src/debugger/Debugger.cpp b/src/debugger/Debugger.cpp index 36873f7..55b8255 100644 --- a/src/debugger/Debugger.cpp +++ b/src/debugger/Debugger.cpp @@ -13,12 +13,12 @@ namespace dragon { validate(); enableSignals(); - connectSignal(dragon::Window::Signal_OnWindowClosed); + connectSignal(ostd::tBuiltinSignals::WindowClosed); } void Debugger::tCloseEventListener::handleSignal(ostd::tSignal& signal) { - m_mainWindowClosed = signal.ID == dragon::Window::Signal_OnWindowClosed; + m_mainWindowClosed = signal.ID == ostd::tBuiltinSignals::WindowClosed; } @@ -1290,6 +1290,11 @@ namespace dragon data().args.step_exec = !data().args.step_exec; output().p("Step execution = ").p(STR_BOOL(data().args.step_exec)).nl(); } + else if (data().command == "display") + { + data().args.hide_virtual_display = !data().args.hide_virtual_display; + output().p("Virtual Display Hidden = ").p(STR_BOOL(data().args.hide_virtual_display)).nl(); + } } } @@ -1526,6 +1531,9 @@ namespace dragon tmpCommand = "(t)rack "; tmpCommand.addRightPadding(commandLength); out.fg(ostd::ConsoleColors::Blue).p(tmpCommand).fg(ostd::ConsoleColors::Green).p("Used to track specific addresses during execution.").reset().nl(); + tmpCommand = "display"; + tmpCommand.addRightPadding(commandLength); + out.fg(ostd::ConsoleColors::Blue).p(tmpCommand).fg(ostd::ConsoleColors::Green).p("Used to enable/disable the Virtual Display for the runtime.").reset().nl(); out.nl().fg(ostd::ConsoleColors::Cyan).p("The letters in parenthesis can be used as the short version of the command.").nl(); out.p("Square brackets represent optional parameters. If they have an '=' and a value, that is the default if not specified.").reset().nl(); diff --git a/src/debugger/Debugger.hpp b/src/debugger/Debugger.hpp index 7c5fd04..d28455c 100644 --- a/src/debugger/Debugger.hpp +++ b/src/debugger/Debugger.hpp @@ -19,7 +19,7 @@ namespace dragon bool step_exec = false; bool track_step_diff = true; bool auto_start_debug = false; - bool hide_virtual_display = false; + bool hide_virtual_display = true; bool track_call_stack = true; bool auto_track_all_data_symbols = true; ostd::String force_load_file = ""; diff --git a/src/gui/Renderer.cpp b/src/gui/Renderer.cpp new file mode 100644 index 0000000..ebc33fe --- /dev/null +++ b/src/gui/Renderer.cpp @@ -0,0 +1,70 @@ +#include "Renderer.hpp" +#include "Window.hpp" +#include + +namespace dragon +{ + Renderer::~Renderer(void) + { + if (isInvalid()) return; + ostd::Utils::destroyArray(m_pixels); + SDL_DestroyTexture(m_texture); + } + + void Renderer::initialize(Window& parent) + { + if (isValid()) return; //TODO: Error + if (!parent.isValid() || !parent.isInitialized()) + return; //TODO: Error + m_parent = &parent; + m_pixels = ostd::Utils::createArray(parent.getWindowWidth() * parent.getWindowHeight()); + m_texture = SDL_CreateTexture(parent.getSDLRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, parent.getWindowWidth(), parent.getWindowHeight()); + m_windowWidth = parent.getWindowWidth(); + m_windowHeight = parent.getWindowHeight(); + setTypeName("lspp::gfx::Renderer"); + enableSignals(); + connectSignal(ostd::tBuiltinSignals::WindowResized); + validate(); + } + + void Renderer::handleSignal(ostd::tSignal& signal) + { + if (isInvalid()) return; + if (signal.ID == ostd::tBuiltinSignals::WindowResized) + { + m_pixels = ostd::Utils::resizeArray(m_pixels, m_parent->getWindowWidth() * m_parent->getWindowHeight()); + SDL_DestroyTexture(m_texture); + m_texture = SDL_CreateTexture(m_parent->getSDLRenderer(), SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, m_parent->getWindowWidth(), m_parent->getWindowHeight()); + m_windowWidth = m_parent->getWindowWidth(); + m_windowHeight = m_parent->getWindowHeight(); + updateBuffer(); + displayBuffer(); + } + } + + void Renderer::updateBuffer(void) + { + if (isInvalid()) return; + SDL_UpdateTexture(m_texture, NULL, m_pixels, m_windowWidth * 4); + } + + void Renderer::displayBuffer(void) + { + if (isInvalid()) return; + SDL_Rect rect { 0, 0, m_windowWidth, m_windowHeight }; + SDL_RenderCopy(m_parent->getSDLRenderer(), m_texture, NULL, &rect); + } + + void Renderer::clear(const ostd::Color& color) + { + if (isInvalid()) return; + for (int32_t y = 0; y < m_windowHeight; y++) + { + for (uint32_t x = 0; x < m_windowWidth; x++) + { + int32_t index = CONVERT_2D_1D(x, y, m_windowWidth); + m_pixels[index] = color.asInteger(); + } + } + } +} \ No newline at end of file diff --git a/src/gui/Renderer.hpp b/src/gui/Renderer.hpp new file mode 100644 index 0000000..654e7bf --- /dev/null +++ b/src/gui/Renderer.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include "../tools/SDLInclude.hpp" + +namespace dragon +{ + class Window; + class Renderer : public ostd::BaseObject + { + public: + inline Renderer(void) { invalidate(); } + ~Renderer(void); + void initialize(Window& parent); + void handleSignal(ostd::tSignal& signal) override; + void updateBuffer(void); + void displayBuffer(void); + inline uint32_t* getScreenPixels(void) { return m_pixels; } + + void clear(const ostd::Color& color); + + private: + uint32_t* m_pixels { nullptr }; + SDL_Texture* m_texture { nullptr }; + Window* m_parent { nullptr }; + int32_t m_windowWidth { 0 }; + int32_t m_windowHeight { 0 }; + }; +} \ No newline at end of file diff --git a/src/gui/Window.cpp b/src/gui/Window.cpp index fa67852..eca0648 100644 --- a/src/gui/Window.cpp +++ b/src/gui/Window.cpp @@ -54,8 +54,9 @@ namespace dragon if (!m_initialized) return; Uint64 start = SDL_GetPerformanceCounter(); handleEvents(); + if (m_refreshScreen) + SDL_RenderClear(m_renderer); onUpdate(); - SDL_RenderClear(m_renderer); onRender(); SDL_RenderPresent(m_renderer); Uint64 end = SDL_GetPerformanceCounter(); @@ -81,6 +82,7 @@ namespace dragon { if (!isInitialized()) return; SDL_SetWindowSize(m_window, width, height); + ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowResized, ostd::tSignalPriority::RealTime); } void Window::setTitle(const ostd::String& title) @@ -113,7 +115,7 @@ namespace dragon if (event.type == SDL_QUIT) { m_running = false; - ostd::SignalHandler::emitSignal(Signal_OnWindowClosed, ostd::tSignalPriority::Normal, *this); + ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowClosed, ostd::tSignalPriority::Normal, *this); } else if (event.type == SDL_WINDOWEVENT) { @@ -129,7 +131,7 @@ namespace dragon { MouseEventData mmd = l_getMouseState(); if (isMouseDragEventEnabled() && mmd.button != MouseEventData::eButton::None) - ostd::SignalHandler::emitSignal(Signal_OnMouseDragged, ostd::tSignalPriority::RealTime, mmd); + ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::WindowClosed, ostd::tSignalPriority::RealTime, mmd); else ostd::SignalHandler::emitSignal(ostd::tBuiltinSignals::MouseMoved, ostd::tSignalPriority::RealTime, mmd); } diff --git a/src/gui/Window.hpp b/src/gui/Window.hpp index db6ac8a..0c31f39 100644 --- a/src/gui/Window.hpp +++ b/src/gui/Window.hpp @@ -49,6 +49,8 @@ namespace dragon SDL_Surface* m_fontSurface { nullptr }; uint32_t* m_fontPixels { nullptr }; + bool m_refreshScreen { true }; + private: int32_t m_windowWidth { 0 }; int32_t m_windowHeight { 0 }; @@ -61,11 +63,6 @@ namespace dragon bool m_deagEventEnabled { false }; bool m_running { false }; bool m_initialized { false }; - - public: - //Signals //TODO: Add theese to the builtin signals in ostd::SignalHandler - inline static const uint32_t Signal_OnMouseDragged = ostd::SignalHandler::newCustomSignal(1003); - inline static const uint32_t Signal_OnWindowClosed = ostd::SignalHandler::newCustomSignal(2000); }; class WindowResizedData : public ostd::BaseObject { diff --git a/src/hardware/VirtualCPU.cpp b/src/hardware/VirtualCPU.cpp index e784936..7f7a530 100644 --- a/src/hardware/VirtualCPU.cpp +++ b/src/hardware/VirtualCPU.cpp @@ -413,6 +413,29 @@ namespace dragon writeRegister(data::Registers::ACC, regValue1 * regValue2); } break; + case data::OpCodes::DivImmReg: //TODO: Division by zero is unhandled + { + uint8_t regAddr = fetch8(); + int16_t literal = fetch16(); + int16_t regValue = readRegister(regAddr); + int16_t quotient = regValue / literal; + int16_t reminder = regValue % literal; + writeRegister(data::Registers::ACC, quotient); + writeRegister(data::Registers::RV, reminder); + } + break; + case data::OpCodes::DivRegReg: //TODO: Division by zero is unhandled + { + uint8_t regAddr1 = fetch8(); + uint8_t regAddr2 = fetch8(); + int16_t regValue1 = readRegister(regAddr1); + int16_t regValue2 = readRegister(regAddr2); + int16_t quotient = regValue1 / regValue2; + int16_t reminder = regValue1 % regValue2; + writeRegister(data::Registers::ACC, quotient); + writeRegister(data::Registers::RV, reminder); + } + break; case data::OpCodes::IncReg: { uint8_t regAddr = fetch8(); diff --git a/src/hardware/VirtualDisplay.cpp b/src/hardware/VirtualDisplay.cpp new file mode 100644 index 0000000..31bee4f --- /dev/null +++ b/src/hardware/VirtualDisplay.cpp @@ -0,0 +1,158 @@ +#include "VirtualDisplay.hpp" +#include "../gui/RawTextRenderer.hpp" +#include "../runtime/DragonRuntime.hpp" + +namespace dragon +{ + namespace hw + { + void VirtualDisplay::onInitialize(void) + { + m_renderer.initialize(*this); + RawTextRenderer::initialize(); + } + + void VirtualDisplay::onDestroy(void) { } + + void VirtualDisplay::onRender(void) + { + auto& config = DragonRuntime::machine_config; + if (m_refreshScreen) + { + m_renderer.clear(config.singleColor_background); + for (int32_t i = 0; i < m_singleTextLines.size(); i++) + { + auto& line = m_singleTextLines[i]; + RawTextRenderer::drawString(line, 0, i, m_renderer.getScreenPixels(), getWindowWidth(), getWindowHeight(), m_fontPixels, config.singleColor_foreground); + } + m_refreshScreen = false; + } + m_renderer.updateBuffer(); + m_renderer.displayBuffer(); + } + + void VirtualDisplay::onUpdate(void) + { + auto& mem = DragonRuntime::memMap; + uint16_t vga_addr = data::MemoryMapAddresses::VideoCardInterface_Start; + uint8_t video_mode = mem.read8(vga_addr + tRegisters::VideoMode); + uint8_t signal = mem.read8(vga_addr + tRegisters::Signal); + if (signal == tSignalValues::Continue) return; + if (video_mode == tVideoModeValues::TextSingleColor) + { + if (signal == tSignalValues::TextSingleColor_DirectPrintChar) + { + char c = (char)mem.read8(vga_addr + tRegisters::TextSingleCharacter); + single_text_add_char_to_line(c); + } + else if (signal == tSignalValues::TextSingleColor_StoreChar) + { + char c = (char)mem.read8(vga_addr + tRegisters::TextSingleCharacter); + single_text_add_char_to_buffer(c); + } + else if (signal == tSignalValues::TextSingleColor_DirectPrintBuffNoFlush) + { + single_text_print_buffer_no_flush(); + } + else if (signal == tSignalValues::TextSingleColor_DirectPrintBuffAndFlush) + { + single_text_print_buffer_and_flush(); + } + else if (signal == tSignalValues::TextSingleColor_FlushBuffer) + { + single_text_flush_buffer(); + } + else if (signal == tSignalValues::ClearSCreen) + { + single_text_clear_screen(); + } + else if (signal == tSignalValues::RefreshScreen) + { + single_text_refresh_screen(); + } + } + else return; + mem.write8(vga_addr + tRegisters::Signal, tSignalValues::Continue); + } + + void VirtualDisplay::onFixedUpdate(void) { } + + void VirtualDisplay::onSlowUpdate(void) { } + + void VirtualDisplay::single_text_add_char_to_line(char c) + { + auto& config = DragonRuntime::machine_config; + if (m_singleTextLines.size() == 0) + { + m_singleTextLines.push_back(ostd::String().addChar(c)); + RawTextRenderer::drawString(ostd::String().addChar(c), 0, 0, m_renderer.getScreenPixels(), getWindowWidth(), getWindowHeight(), m_fontPixels, config.singleColor_foreground); + return; + } + auto& line = m_singleTextLines[m_singleTextLines.size() - 1]; + if (c == '\n') + m_singleTextLines.push_back(""); + else if (isprint(c)) + { + if (line.len() == RawTextRenderer::CONSOLE_CHARS_H) + { + m_singleTextLines.push_back(ostd::String().addChar(c)); + auto& line = m_singleTextLines[m_singleTextLines.size() - 1]; + RawTextRenderer::drawString(ostd::String().addChar(c), line.len() - 1, m_singleTextLines.size() - 1, m_renderer.getScreenPixels(), getWindowWidth(), getWindowHeight(), m_fontPixels, config.singleColor_foreground); + } + else + { + line.addChar(c); + RawTextRenderer::drawString(ostd::String().addChar(c), line.len() - 1, m_singleTextLines.size() - 1, m_renderer.getScreenPixels(), getWindowWidth(), getWindowHeight(), m_fontPixels, config.singleColor_foreground); + } + } + else return; + if (m_singleTextLines.size() == RawTextRenderer::CONSOLE_CHARS_V + 1) + { + m_refreshScreen = true; + m_singleTextLines.erase(m_singleTextLines.begin()); + } + } + + void VirtualDisplay::single_text_add_char_to_buffer(char c) + { + if (c == '\n' || m_singleTextBuffer.len() == RawTextRenderer::CONSOLE_CHARS_H) + { + single_text_print_buffer_and_flush(); + single_text_add_char_to_line(c); + } + else + m_singleTextBuffer.addChar(c); + } + + void VirtualDisplay::single_text_flush_buffer(void) + { + m_singleTextBuffer = ""; + } + + void VirtualDisplay::single_text_print_buffer_and_flush(void) + { + for (auto& ch : m_singleTextBuffer) + single_text_add_char_to_line(ch); + single_text_flush_buffer(); + } + + void VirtualDisplay::single_text_print_buffer_no_flush(void) + { + for (auto& ch : m_singleTextBuffer) + single_text_add_char_to_line(ch); + } + + + void VirtualDisplay::single_text_clear_screen(void) + { + m_singleTextLines.clear(); + m_refreshScreen = true; + } + + void VirtualDisplay::single_text_refresh_screen(void) + { + m_refreshScreen = true; + } + + } +} \ No newline at end of file diff --git a/src/hardware/VirtualDisplay.hpp b/src/hardware/VirtualDisplay.hpp new file mode 100644 index 0000000..c9599b6 --- /dev/null +++ b/src/hardware/VirtualDisplay.hpp @@ -0,0 +1,60 @@ +#pragma once + +#include "../gui/Window.hpp" +#include "../gui/Renderer.hpp" + +namespace dragon +{ + namespace hw + { + class VirtualDisplay : public Window + { + public: struct tRegisters + { + inline static constexpr uint8_t VideoMode = 0x00; + inline static constexpr uint8_t Signal = 0x03; + inline static constexpr uint8_t TextSingleCharacter = 0x04; + }; + public: struct tVideoModeValues + { + inline static constexpr uint8_t TextSingleColor = 0x00; + }; + public: struct tSignalValues + { + inline static constexpr uint8_t Continue = 0x00; + + inline static constexpr uint8_t TextSingleColor_DirectPrintChar = 0x02; + inline static constexpr uint8_t TextSingleColor_StoreChar = 0x03; + inline static constexpr uint8_t TextSingleColor_DirectPrintBuffAndFlush = 0x04; + inline static constexpr uint8_t TextSingleColor_FlushBuffer = 0x05; + inline static constexpr uint8_t TextSingleColor_DirectPrintBuffNoFlush = 0x06; + + inline static constexpr uint8_t RefreshScreen = 0xE0; + inline static constexpr uint8_t ClearSCreen = 0xE1; + }; + public: + void onInitialize(void) override; + void onDestroy(void) override; + void onRender(void) override; + void onUpdate(void) override; + void onFixedUpdate(void) override; + void onSlowUpdate(void) override; + + private: + void single_text_add_char_to_line(char c); + void single_text_add_char_to_buffer(char c); + void single_text_flush_buffer(void); + void single_text_print_buffer_and_flush(void); + void single_text_print_buffer_no_flush(void); + + void single_text_clear_screen(void); + void single_text_refresh_screen(void); + + private: + Renderer m_renderer; + + std::vector m_singleTextLines; + ostd::String m_singleTextBuffer { "" }; + }; + } +} \ No newline at end of file diff --git a/src/hardware/VirtualIODevices.cpp b/src/hardware/VirtualIODevices.cpp index 290f3e9..3bd3e8e 100644 --- a/src/hardware/VirtualIODevices.cpp +++ b/src/hardware/VirtualIODevices.cpp @@ -438,31 +438,54 @@ namespace dragon Graphics::Graphics(void) { + m_videoMemory.init(0xFFFF); } int8_t Graphics::read8(uint16_t addr) { - return 0x00; + int8_t outVal = 0; + if (!m_videoMemory.r_Byte(addr, outVal)) + { + data::ErrorHandler::pushError(data::ErrorCodes::Graphics_MemoryReadFailed, "Failed to read byte from Graphics Memory"); + return 0; + } + return outVal; } int16_t Graphics::read16(uint16_t addr) { - return 0x0000; + int16_t outVal = 0; + if (!m_videoMemory.r_Word(addr, outVal)) + { + data::ErrorHandler::pushError(data::ErrorCodes::Graphics_MemoryReadFailed, "Failed to read word from Graphics Memory"); + return 0; + } + return outVal; } int8_t Graphics::write8(uint16_t addr, int8_t value) { - return 0x00; + if (!m_videoMemory.w_Byte(addr, value)) + { + data::ErrorHandler::pushError(data::ErrorCodes::Graphics_MemoryWriteFailed, "Failed to write byte to Graphics Memory"); + return 0; + } + return value; } int16_t Graphics::write16(uint16_t addr, int16_t value) { - return 0x0000; + if (!m_videoMemory.w_Word(addr, value)) + { + data::ErrorHandler::pushError(data::ErrorCodes::Graphics_MemoryWriteFailed, "Failed to word byte to Graphics Memory"); + return 0; + } + return value; } ostd::ByteStream* Graphics::getByteStream(void) { - return nullptr; + return &m_videoMemory.getData(); } diff --git a/src/hardware/VirtualIODevices.hpp b/src/hardware/VirtualIODevices.hpp index e853aea..1418da9 100644 --- a/src/hardware/VirtualIODevices.hpp +++ b/src/hardware/VirtualIODevices.hpp @@ -170,6 +170,7 @@ namespace dragon ostd::ByteStream* getByteStream(void) override; private: + ostd::serial::SerialIO m_videoMemory; }; class SerialPort : public IMemoryDevice { diff --git a/src/runtime/ConfigLoader.cpp b/src/runtime/ConfigLoader.cpp index 1b9c8ae..2e21432 100644 --- a/src/runtime/ConfigLoader.cpp +++ b/src/runtime/ConfigLoader.cpp @@ -40,6 +40,16 @@ namespace dragon lineEdit = tokens.next(); config.cmos_path = lineEdit; } + else if (lineEdit == "singlecolor_foreground") + { + lineEdit = tokens.next(); + config.singleColor_foreground.set(lineEdit); + } + else if (lineEdit == "singlecolor_background") + { + lineEdit = tokens.next(); + config.singleColor_background.set(lineEdit); + } else continue; //TODO: Warning } return validate_machine_config(config); diff --git a/src/runtime/ConfigLoader.hpp b/src/runtime/ConfigLoader.hpp index 1d54ab2..5b550af 100644 --- a/src/runtime/ConfigLoader.hpp +++ b/src/runtime/ConfigLoader.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include namespace dragon @@ -10,6 +10,8 @@ namespace dragon std::map vdisk_paths; ostd::String bios_path; ostd::String cmos_path; + ostd::Color singleColor_background; + ostd::Color singleColor_foreground; inline bool isValid(void) const { return m_valid; } diff --git a/src/runtime/DragonRuntime.cpp b/src/runtime/DragonRuntime.cpp index acb302c..313039f 100644 --- a/src/runtime/DragonRuntime.cpp +++ b/src/runtime/DragonRuntime.cpp @@ -136,10 +136,9 @@ namespace dragon if (verbose) out.fg(ostd::ConsoleColors::Magenta).p(" Initializing virtual display:").nl(); - vDisplay.initialize(800, 600, "DragonVM", "font.bmp"); int32_t w = RawTextRenderer::CONSOLE_CHARS_H * RawTextRenderer::FONT_CHAR_W; //60 * 16; int32_t h = RawTextRenderer::CONSOLE_CHARS_V * RawTextRenderer::FONT_CHAR_H; //60 * 9; - vDisplay.setSize(w, h); + vDisplay.initialize(w, h, "DragonVM", "font.bmp"); if (hideVirtualDisplay) vDisplay.hide(); if (verbose) diff --git a/src/runtime/DragonRuntime.hpp b/src/runtime/DragonRuntime.hpp index 81faa0e..2bffa0b 100644 --- a/src/runtime/DragonRuntime.hpp +++ b/src/runtime/DragonRuntime.hpp @@ -7,6 +7,7 @@ #include "../hardware/VirtualRAM.hpp" #include "../hardware/VirtualIODevices.hpp" #include "../hardware/VirtualHardDrive.hpp" +#include "../hardware/VirtualDisplay.hpp" #include "../tools/GlobalData.hpp" @@ -73,7 +74,7 @@ namespace dragon std::vector callStack; }; public: - static void printRegisters(dragon::hw::VirtualCPU& cpu); + static void printRegisters(hw::VirtualCPU& cpu); static void processErrors(void); static std::vector getErrorList(void); static int32_t loadArguments(int argc, char** argv, tCommandLineArgs& args); @@ -99,24 +100,24 @@ namespace dragon public: inline static ostd::ConsoleOutputHandler out; - inline static dragon::hw::MemoryMapper memMap; - inline static dragon::hw::VirtualCPU cpu { memMap }; - inline static dragon::hw::VirtualRAM ram; - inline static dragon::hw::InterruptVector intVec; - inline static dragon::hw::VirtualBIOS vBIOS; - inline static dragon::hw::interface::CMOS vCMOS; - inline static dragon::hw::VirtualBootloader vMBR; - inline static dragon::hw::VirtualKeyboard vKeyboard; - inline static dragon::hw::VirtualMouse vMouse; - inline static dragon::hw::interface::Disk vDiskInterface { memMap, cpu }; - inline static dragon::hw::interface::Graphics vGraphicsInterface; - inline static dragon::hw::interface::SerialPort vSerialInterface; + inline static hw::MemoryMapper memMap; + inline static hw::VirtualCPU cpu { memMap }; + inline static hw::VirtualRAM ram; + inline static hw::InterruptVector intVec; + inline static hw::VirtualBIOS vBIOS; + inline static hw::interface::CMOS vCMOS; + inline static hw::VirtualBootloader vMBR; + inline static hw::VirtualKeyboard vKeyboard; + inline static hw::VirtualMouse vMouse; + inline static hw::interface::Disk vDiskInterface { memMap, cpu }; + inline static hw::interface::Graphics vGraphicsInterface; + inline static hw::interface::SerialPort vSerialInterface; - inline static std::unordered_map vDisks; + inline static std::unordered_map vDisks; - inline static dragon::Window vDisplay; + inline static hw::VirtualDisplay vDisplay; - inline static dragon::tMachineConfig machine_config; + inline static tMachineConfig machine_config; private: inline static tMachineDebugInfo s_machineInfo; diff --git a/src/tools/GlobalData.hpp b/src/tools/GlobalData.hpp index 841a80f..bea96f2 100644 --- a/src/tools/GlobalData.hpp +++ b/src/tools/GlobalData.hpp @@ -49,6 +49,9 @@ namespace dragon inline static constexpr uint64_t IntVector_InvalidAddress = 0x7000000000000000; + inline static constexpr uint64_t Graphics_MemoryReadFailed = 0x8000000000000000; + inline static constexpr uint64_t Graphics_MemoryWriteFailed = 0x8000000000000001; + }; class ErrorHandler @@ -158,9 +161,7 @@ namespace dragon inline static constexpr uint8_t PP = 0x04; inline static constexpr uint8_t FL = 0x05; inline static constexpr uint8_t ACC = 0x06; - - //TODO: Either add general purpose registers in this space or check when read/write registers - + //0x07, 0x08, 0x09 Are hidden registers used internally, but can be normally accessed by address inline static constexpr uint8_t R1 = 0x0A; inline static constexpr uint8_t R2 = 0x0B; inline static constexpr uint8_t R3 = 0x0C; @@ -184,11 +185,6 @@ namespace dragon class InterruptCodes { public: - inline static constexpr uint8_t Keyboard = 0x10; - inline static constexpr uint8_t Mouse = 0x11; - inline static constexpr uint8_t BiosInterrupt = 0x20; - inline static constexpr uint8_t BiosVideoInterrupt = 0x30; - inline static constexpr uint8_t DiskInterfaceFFinished = 0x80; }; @@ -229,6 +225,8 @@ namespace dragon inline static constexpr uint8_t SubImmReg = 0x33; inline static constexpr uint8_t MulRegReg = 0x34; inline static constexpr uint8_t MulImmReg = 0x35; + inline static constexpr uint8_t DivRegReg = 0x36; + inline static constexpr uint8_t DivImmReg = 0x37; inline static constexpr uint8_t IncReg = 0x40; inline static constexpr uint8_t DecReg = 0x41; @@ -305,6 +303,8 @@ namespace dragon case data::OpCodes::SubRegReg: return "SubRegReg"; case data::OpCodes::MulImmReg: return "MulImmReg"; case data::OpCodes::MulRegReg: return "MulRegReg"; + case data::OpCodes::DivImmReg: return "DivImmReg"; + case data::OpCodes::DivRegReg: return "DivRegReg"; case data::OpCodes::IncReg: return "IncReg"; case data::OpCodes::DecReg: return "DecReg"; case data::OpCodes::RShiftRegImm: return "RShiftRegImm"; @@ -379,6 +379,8 @@ namespace dragon case data::OpCodes::SubRegReg: return 3; case data::OpCodes::MulImmReg: return 4; case data::OpCodes::MulRegReg: return 3; + case data::OpCodes::DivImmReg: return 4; + case data::OpCodes::DivRegReg: return 3; case data::OpCodes::IncReg: return 2; case data::OpCodes::DecReg: return 2; case data::OpCodes::RShiftRegImm: return 4;