From 69d9f4936163b4861a703c73eb26a4159d6cced4 Mon Sep 17 00:00:00 2001 From: OmniaX Date: Sun, 15 Sep 2024 13:26:05 +0200 Subject: [PATCH] Added way to print a string in text16 mode --- extra/config/testMachine.dvm | 4 +-- extra/dragon/cmos.dr | Bin 128 -> 128 bytes extra/dragon/disk1.dr | Bin 4194304 -> 4194304 bytes extra/dss/drake/bootsector.dss | 56 ++++++++++++++++++++++++++++++++- extra/dss/drake/palette.dss | 1 - src/assembler/Assembler.cpp | 2 +- src/runtime/DragonRuntime.cpp | 2 +- 7 files changed, 59 insertions(+), 6 deletions(-) diff --git a/extra/config/testMachine.dvm b/extra/config/testMachine.dvm index 93e2913..ecf8ba2 100644 --- a/extra/config/testMachine.dvm +++ b/extra/config/testMachine.dvm @@ -4,10 +4,10 @@ CMOS = dragon/cmos.dr cpuext = extmov, extalu fixed_clock = false -clock_rate_sec = 2000 +clock_rate_sec = 5000 memory_extension_pages = 16 -screen_redraw_rate_per_second = 50 +screen_redraw_rate_per_second = 10 SingleColor_foreground = #009900FF SingleColor_background = #111111FF diff --git a/extra/dragon/cmos.dr b/extra/dragon/cmos.dr index 357fb01de3239b5e17d78495eafe095232a05faf..fbd3acfee4049de53b2c7b40bba1d708c97ea340 100644 GIT binary patch literal 128 ScmWf4`2SzHgNtE+03!f(B?9~a literal 128 ScmWf4`2U~%f)T?20Y(6%{R3bC diff --git a/extra/dragon/disk1.dr b/extra/dragon/disk1.dr index 23815bd6e83243f0b43e944fc021fc37d8a944fe..f7e074ecdfbad5ea7e3cf54ef57f4afa1f627cde 100644 GIT binary patch delta 369 zcmX}kIZgs$0LAf-5e6L88NlT~xD6tL3hw)!XklUEBrNIyv?9?X5Q}#KJcG4~UclZf zSkQS2vTF+C(4TzPkx@?w%hl?YYflo`u1k`(muQSFy_w05}AbE42`Mh ztHG#=g~kehyYAlv{*@K@*HN0uz;Bsw>@@Tn(W0JjM3(w96In9k;@`S&cDeS{Y&orT z#!Z)8=fvq1T+>(a+!L?pdS1>HGTHR^O2u{_^4G>RUwihu_lSrIOZ17jNC;abMN0Gw zN2JAo7!*Uo6`sh5tjLLBF(O9An23ISkr(4)LQIM&F)ad75Hq4EW<^QNiL$7Od9ffC mMODJ7QPtiG6V(4#m+k$6r6H`BUEj delta 276 zcmW;EIZ6Wo06@{1F`02Uafv^!iCf(FxGxA6Rx%J$*sE2*D+G&wfx#7D9h_Z5A55w#>zOH@*!DA5Si}|>j20^3zQz->u z8bs;8jq+Xg9oM3lX6Gt-FJx(Q|BQqZNtfg#FR>)jEj`jJebO%jGAKh*kfIFBh>XgZ zlw@4~K4qDZNtu#qnUPtkNLA)!UKV6gmZT=jvLdUpChM{xo3bU_vLm~)C;L*D138o< RIhGSSl`}b)i&rkcegR0aMJ50M diff --git a/extra/dss/drake/bootsector.dss b/extra/dss/drake/bootsector.dss index 42b99b5..e2bd6dc 100644 --- a/extra/dss/drake/bootsector.dss +++ b/extra/dss/drake/bootsector.dss @@ -5,13 +5,19 @@ @include @include + + .data $string "Hello " $ddd $dpt_block $textCell + + .code + + _drake_bootsector_entry_point: push 0 call $_load_dpt_block @@ -22,10 +28,37 @@ _drake_bootsector_entry_point: push 2 call $_draw_palette - ## mov R9, { $dpt_block + DPTStructure.ENTRIES_START + (2 * DPTStructure.ENTRY_SIZE_B) + DPTStructure.ENTRY_PART_LBL } + + + movb [$textCell.CoordX], 2 + movb [$textCell.CoordY], 2 + movb [$textCell.Foreground], DefaultPalette.Orange + movb [$textCell.Background], DefaultPalette.Black + + push $string + push $textCell + push 2 + call $_print_string + + + + + movb [$textCell.CoordX], 8 + movb [$textCell.CoordY], 2 + movb [$textCell.Foreground], DefaultPalette.Black + movb [$textCell.Background], DefaultPalette.Orange + + push { $dpt_block + DPTStructure.ENTRIES_START + (2 * DPTStructure.ENTRY_SIZE_B) + DPTStructure.ENTRY_PART_LBL } + push $textCell + push 2 + call $_print_string + + hlt + + _load_dpt_block: mov [$ddd.Mode], DiskMode.READ mov [$ddd.Disk], 0x00 @@ -38,6 +71,27 @@ _load_dpt_block: call $_disk_load_from_ddd_blocking ret + + +_print_string: ## _print_string(String* str, Text16VModeCell* cell) + arg R1 ## @Param: String addr + arg R2 ## @Param: Cell addr +_print_string_loop: + mov R6, R2 ## Restore Cell addr + movb *R6, *R1 ## Move next character into cell + inc R1 ## Point address to next character + addip R6, 3 ## Offset to X coord of cell + movb R7, *R6 ## Store X coord in R7 + inc R7 ## Increment X coord + movb *R6, R7 ## Store new X coord in cell + mov R10, 0x21 ## int 0x30 parameter for print_char_text16 + mov R9, R2 ## int 0x30 parameter for text_cell address + int 0x30 ## bios_video_int + movb ACC, *R1 ## Copy current character in ACC + jne $_print_string_loop, 0 ## Jump if current character is not 0 (NULL_TERM) + ret + + .fixed 5120, 0xFF diff --git a/extra/dss/drake/palette.dss b/extra/dss/drake/palette.dss index 3fce7d0..e87d486 100644 --- a/extra/dss/drake/palette.dss +++ b/extra/dss/drake/palette.dss @@ -41,6 +41,5 @@ _draw_palette_loop: inc R5 mov ACC, R5 - debug_break jge $_draw_palette_loop, 15 ret \ No newline at end of file diff --git a/src/assembler/Assembler.cpp b/src/assembler/Assembler.cpp index 2afe323..8bed21c 100644 --- a/src/assembler/Assembler.cpp +++ b/src/assembler/Assembler.cpp @@ -2521,5 +2521,5 @@ namespace dragon if (opEdit == "fl") return data::Registers::FL; return data::Registers::Last; } - } + } } \ No newline at end of file diff --git a/src/runtime/DragonRuntime.cpp b/src/runtime/DragonRuntime.cpp index b1c1064..236b1c0 100644 --- a/src/runtime/DragonRuntime.cpp +++ b/src/runtime/DragonRuntime.cpp @@ -378,7 +378,7 @@ namespace dragon avg_count++; avg_tot += _time; s_avgInstTime = (uint64_t)std::round(avg_tot / avg_count); - // out.fg(ostd::ConsoleColors::Red).p(s_avgInstTime).nl().reset(); + // out.fg(ostd::ConsoleColors::Red).p(getAvgClockSpeed()).nl().reset(); acc = 0; } if (acc2 == (1000 / screenRedrawRate))