diff --git a/README.md b/README.md index 437141e..a8b28b0 100644 --- a/README.md +++ b/README.md @@ -44,27 +44,27 @@ TODO When you want to see whats happening do a debug run; normal run; - time make assert-all + time make bin/@assert-all real 0m3.223s debug run at 11 Mhz; - time MB_OPENMSX_HEADLESS=off MB_OPENMSX_THROTTLE=on make assert-all + time MB_OPENMSX_HEADLESS=off MB_OPENMSX_THROTTLE=on make vassert-all real 1m4.856s debug run real msx speed; - time MB_OPENMSX_HEADLESS=off MB_OPENMSX_THROTTLE=on MB_OPENMSX_SPEED=100 make assert-all + time MB_OPENMSX_HEADLESS=off MB_OPENMSX_THROTTLE=on MB_OPENMSX_SPEED=100 make bin/@assert-all real 2m37.379s debug run with screenshot on exit; (black screens without throttle) - time MB_OPENMSX_HEADLESS=off MB_OPENMSX_THROTTLE=on MB_FLIGHT_SCREEN=on make -s assert-all + time MB_OPENMSX_HEADLESS=off MB_OPENMSX_THROTTLE=on MB_FLIGHT_SCREEN=on make -s bin/@assert-all real 1m14.043s debug run with video recorder and merge to one video file; - time MB_OPENMSX_HEADLESS=off MB_FLIGHT_VIDEO=on make -s assert-all + time MB_OPENMSX_HEADLESS=off MB_FLIGHT_VIDEO=on make -s bin/@assert-all real 0m7.136s build parallel; - time make -s -j4 assert-all + time make -s -j4 bin/@assert-all real 0m1.817s manual test msxhub on machine; @@ -86,6 +86,7 @@ Current set is WIP. ## Errata * Doesn't work on windows +* TODO: mbboot80+add arg prefix and move to other repro + msxhub package * TODO: Missing C and mixed support * TODO: Use TCL for BASIC/ASM/C lcov (Cobertura) code coverage @@ -104,6 +105,7 @@ Current set is WIP. * run instance-id or run/process-label to replace hardcoded "untitled1" path * Remove msg or add ignore sram-fully or blank setting: SRAM file nms8250.cmos not found, assuming blank SRAM content. * Video record append mode + optional multiple previds to glue videos as one +* Video record remove blue start frame on start of recording * (FIXED) Allow for `set renderer none` in TCL or command argument for headless mode * SDL-NULL as window less renderer so that screenshot and/or video works headless * DocUpdate: Add speed note because it is slow + add example "after quit {export hdd}" diff --git a/lib/emuctl/mbboot80.com b/lib/emuctl/mbboot80.com new file mode 100644 index 0000000..2dbd2e1 Binary files /dev/null and b/lib/emuctl/mbboot80.com differ diff --git a/lib/make/mb_autoexec.mk b/lib/make/mb_autoexec.mk index 36c8e7d..00e8994 100644 --- a/lib/make/mb_autoexec.mk +++ b/lib/make/mb_autoexec.mk @@ -5,6 +5,9 @@ MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_SHOW_VERSION,"Print O MB_AUTOEXEC_SHOW_PATH ?= on MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_SHOW_PATH,"Print search path on boot.",$(MB_AUTOEXEC_SHOW_PATH)) +MB_AUTOEXEC_SHOW_PROLOG ?= on +MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_SHOW_PROLOG,"Print msxbuild prolog on boot.",$(MB_AUTOEXEC_SHOW_PROLOG)) + MB_AUTOEXEC_SHOW_CONFIG ?= on MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_SHOW_CONFIG,"Print host config on boot.",$(MB_AUTOEXEC_SHOW_CONFIG)) @@ -32,6 +35,9 @@ MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_SAFE_CMD_TIMEOUT,"Saf MB_AUTOEXEC_SAFE_CMD_EXITCODE ?= 1 MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_SAFE_CMD_EXITCODE,"Safe command execution failure exit code.",$(MB_AUTOEXEC_SAFE_CMD_EXITCODE)) +MB_AUTOEXEC_STARTUP_PROLOG ?= mb::boot MSXBUILD UID $(USER) +MB_DOC_HELP_VARIABLE += $(call mb_doc_variable,MB_AUTOEXEC_STARTUP_PROLOG,"Boot prolog user postfix.",$(MB_AUTOEXEC_STARTUP_PROLOG)) + define mb_autoexec_append_cmd echo "$(2)\r" >> $(1)/autoexec.bat endef @@ -80,33 +86,36 @@ MB_DOC_HELP_FUNCTION += $(call mb_doc_function,mb_autoexec_append_save_video,"Ap define mb_autoexec_append_safe_test $(call mb_autoexec_append_cmd,$(1),omsxctl fail_after $(if $(3),$(3),$(MB_AUTOEXEC_SAFE_TEST_TIMEOUT)) seconds failed_test $(if $(4),$(4),$(MB_AUTOEXEC_SAFE_TEST_EXITCODE))) - $(call mb_autoexec_append_echo,$(1),Running test: $(2)) + $(call mb_autoexec_append_echo,$(1),mb::safe test $(2)) $(call mb_autoexec_append_cmd,$(1),$(2)) endef MB_DOC_HELP_FUNCTION += $(call mb_doc_function,mb_autoexec_append_safe_test,"Appends running a safe test."," [timeout] [exit-code]") define mb_autoexec_append_safe_cmd $(call mb_autoexec_append_cmd,$(1),omsxctl fail_after $(if $(3),$(3),$(MB_AUTOEXEC_SAFE_CMD_TIMEOUT)) seconds failed_cmd $(if $(4),$(4),$(MB_AUTOEXEC_SAFE_CMD_EXITCODE))) - $(call mb_autoexec_append_echo,$(1),Running command: $(2)) + $(call mb_autoexec_append_echo,$(1),mb::safe command $(2)) $(call mb_autoexec_append_cmd,$(1),$(2)) endef MB_DOC_HELP_FUNCTION += $(call mb_doc_function,mb_autoexec_append_safe_cmd,"Appends running a safe command."," [timeout] [exit-code]") +define _mb_autoexec_write_preboot + $(call mb_autoexec_append_cmd,$(1),$(2)mbboot80) + $(call mb_autoexec_append_cmd,$(1),$(2)omsxctl boot_exec_color_vdp) + $(if $(filter on,$(MB_FLIGHT_VIDEO)),$(call mb_autoexec_append_save_video,$(1))) + $(call mb_autoexec_append_cmd,$(1),$(2)omsxctl fail_after $(MB_AUTOEXEC_STARTUP_TIMEOUT) seconds failed_exec $(MB_AUTOEXEC_STARTUP_EXITCODE)) +endef + define mb_autoexec_write_default @echo === Writing autoexec.bat for $@ @echo -n "" > $(1)/autoexec.bat - $(if $(filter 40,$(2)),$(call mb_autoexec_append_cmd,$(1),mode 40),$(call mb_autoexec_append_cmd,$(1),mode 80)) - $(call mb_autoexec_append_echo,$(1),==== MSXBUILD ====) - $(if $(filter 40,$(2)),$(call mb_autoexec_append_echo,$(1),Boot mode 40),$(call mb_autoexec_append_echo,$(1),Boot mode 80)) - $(call mb_autoexec_append_cmd,$(1),omsxctl boot_exec_color_vdp) - $(if $(filter on,$(MB_FLIGHT_VIDEO)),$(call mb_autoexec_append_save_video,$(1))) - $(call mb_autoexec_append_cmd,$(1),omsxctl fail_after $(MB_AUTOEXEC_STARTUP_TIMEOUT) seconds failed_exec $(MB_AUTOEXEC_STARTUP_EXITCODE)) + $(if $(wildcard $(1)/utils),$(call _mb_autoexec_write_preboot,$(1),utils\),$(call _mb_autoexec_write_preboot,$(1))) $(if $(filter on,$(MB_AUTOEXEC_SHOW_VERSION)),$(call mb_autoexec_append_cmd,$(1),ver)) - $(if $(wildcard $(1)/utils),$(call mb_autoexec_append_cmd,$(1),PATH + A:\; A:\UTILS)) + $(if $(wildcard $(1)/utils),$(call mb_autoexec_append_cmd,$(1),PATH + A:\UTILS)) $(if $(filter on,$(MB_AUTOEXEC_SHOW_PATH)),$(call mb_autoexec_append_cmd,$(1),PATH)) + $(if $(filter on,$(MB_AUTOEXEC_SHOW_PROLOG)),$(call mb_autoexec_append_echo,$(1),$(MB_AUTOEXEC_STARTUP_PROLOG))) $(if $(filter on,$(MB_AUTOEXEC_SHOW_CONFIG)),$(call mb_autoexec_append_cmd,$(1),omsxctl boot_exec_config_info)) - $(if $(filter on,$(MB_AUTOEXEC_SHOW_FOLDER)),$(call mb_autoexec_append_echo,$(1),Run folder $(1))) - $(if $(filter on,$(MB_AUTOEXEC_SHOW_TARGET)),$(call mb_autoexec_append_echo,$(1),Run target $@)) + $(if $(filter on,$(MB_AUTOEXEC_SHOW_FOLDER)),$(call mb_autoexec_append_echo,$(1),mb::path $(1))) + $(if $(filter on,$(MB_AUTOEXEC_SHOW_TARGET)),$(call mb_autoexec_append_echo,$(1),mb::pipe $@)) endef -MB_DOC_HELP_FUNCTION += $(call mb_doc_function,mb_autoexec_write_default,"Write a default autoexec.bat file."," [text-mode]") +MB_DOC_HELP_FUNCTION += $(call mb_doc_function,mb_autoexec_write_default,"Write a default autoexec.bat file.","") diff --git a/lib/make/mb_msxpipe.mk b/lib/make/mb_msxpipe.mk index 6ab0272..37d47e6 100644 --- a/lib/make/mb_msxpipe.mk +++ b/lib/make/mb_msxpipe.mk @@ -20,8 +20,8 @@ define _mb_autoexec_show_gui $(call mb_autoexec_append_stop_fail,$(1)) $(call mb_autoexec_append_show_gui,$(1)) $(if $(filter mouse,$(4)),$(call mb_autoexec_append_joyporta_mouse,$(1))) - $(call mb_autoexec_append_echo,$(1),Type shutdown to stop emulation) - $(if $(3),$(call mb_autoexec_append_echo,$(1),Running command: $(3))) + $(call mb_autoexec_append_echo,$(1),mb::exit Type shutdown to stop emulation) + $(if $(3),$(call mb_autoexec_append_echo,$(1),mb::show command $(3))) $(if $(3),$(call mb_autoexec_append_cmd,$(1),$(3))) endef diff --git a/lib/make/mb_openmsx.mk b/lib/make/mb_openmsx.mk index 5aeaad2..c902180 100644 --- a/lib/make/mb_openmsx.mk +++ b/lib/make/mb_openmsx.mk @@ -92,12 +92,13 @@ define _mb_openmsx_dosctl_bat $(if $(wildcard $(1)/z80.bat),,$(call mb_copy,$(PATH_MSXBUILD_REAL)/lib/emuctl/z80.bat,$(1))) $(if $(wildcard $(1)/reboot.bat),,$(call mb_copy,$(PATH_MSXBUILD_REAL)/lib/emuctl/reboot.bat,$(1))) $(if $(wildcard $(1)/shutdown.bat),,$(call mb_copy,$(PATH_MSXBUILD_REAL)/lib/emuctl/shutdown.bat,$(1))) + $(if $(wildcard $(1)/mbboot80.com),,$(call mb_copy,$(PATH_MSXBUILD_REAL)/lib/emuctl/mbboot80.com,$(1))) + $(if $(wildcard $(1)/omsxctl.com),,$(call mb_msxhub_file,$(1),OMSXCTL/1.0-1/get/OMSXCTL/omsxctl.com)) endef define mb_openmsx_dosctl $(call mb_openmsx_setup,$(1),$(if $(2),$(2),$(MB_OPENMSX_MACHINE))) $(if $(wildcard $(1)/utils),$(call _mb_openmsx_dosctl_bat,$(1)/utils),$(call _mb_openmsx_dosctl_bat,$(1))) - $(if $(wildcard $(1)/omsxctl.com),,$(call mb_msxhub_file,$(1),OMSXCTL/1.0-1/get/OMSXCTL/omsxctl.com)) $(if $(wildcard $(1)/command.com),,$(if $(wildcard $(1)/command2.com),,$(call mb_msxhub_get_$(MB_OPENMSX_BOOT_OS)_boot,$(1)))) $(call _mb_openmsx_run,$(1),$(if $(2),$(2),$(MB_OPENMSX_MACHINE)),$(if $(3),$(3),$(MB_OPENMSX_MACHINE_RAM))) endef diff --git a/lib/openmsx/share/scripts/boot_exec.tcl b/lib/openmsx/share/scripts/boot_exec.tcl index 20eadec..3463c57 100644 --- a/lib/openmsx/share/scripts/boot_exec.tcl +++ b/lib/openmsx/share/scripts/boot_exec.tcl @@ -33,13 +33,17 @@ proc boot_exec_color_vdp {{vdp_fg 0} {vdp_bg 0}} { } else { set color_vdp_bg $boot_exec_color_vdp_bg } - setcolor 15 $color_vdp_fg - setcolor 4 $color_vdp_bg - return "Boot color vdp fg $color_vdp_fg bg $color_vdp_bg" + if {([vdpreg 8] != 0) || ([vdpreg 16] != 0)} { + setcolor 15 $color_vdp_fg + setcolor 4 $color_vdp_bg + return "mb::boot color vdp fg $color_vdp_fg bg $color_vdp_bg" + } else { + return "mb::boot color MSX1" + } } proc boot_exec_config_info {} { - set result "Run machine " + set result "mb::host " append result [machine_info config_name] append result " on " append result [openmsx_info version] diff --git a/lib/openmsx/share/scripts/fail_after.tcl b/lib/openmsx/share/scripts/fail_after.tcl index 9b4fda6..e8fd7b2 100644 --- a/lib/openmsx/share/scripts/fail_after.tcl +++ b/lib/openmsx/share/scripts/fail_after.tcl @@ -41,7 +41,7 @@ proc fail_after { timeout {time_unit "time"} {fail_id "fail_after"} {fail_code 2 set msg "" if {$fail_after_prev_timer != 0} { after cancel $fail_after_prev_timer - set msg "$fail_after_prev_id: Stopped attempt" + set msg "mb::fail canceled $fail_after_prev_id" } set fail_after_prev_id $fail_id if {$time_unit != "time"} { @@ -52,7 +52,7 @@ proc fail_after { timeout {time_unit "time"} {fail_id "fail_after"} {fail_code 2 puts stderr "error: $err_msg" fail_after_exit fail_after_timer_error 1 } - set msg "$msg\n$fail_id: Failure in $timeout $time_unit sec" + set msg "$msg\nmb::fail after $timeout $time_unit $fail_id" } else { set fail_after_prev_timer 0 } diff --git a/lib/openmsx/share/scripts/headless.tcl b/lib/openmsx/share/scripts/headless.tcl index fee8cda..ba33157 100644 --- a/lib/openmsx/share/scripts/headless.tcl +++ b/lib/openmsx/share/scripts/headless.tcl @@ -31,12 +31,12 @@ set headless_renderer_done 0 proc headless_exit {} { after time 1 "exit 0" - return "Shutdown openMSX" + return "mb::head shutdown openMSX" } proc headless_reset {} { after time 1 "reset" - return "Reboot openMSX" + return "mb::head reboot openMSX" } proc headless_show_gui {} { @@ -45,7 +45,7 @@ proc headless_show_gui {} { global headless_renderer_type global headless_renderer_done if {$headless_renderer_done != 0} { - return "Requested GUI already showing" + return "mb::head GUI already showing" } if {$headless_renderer_type != 0} { after time 1 "set renderer $headless_renderer_type" @@ -55,7 +55,7 @@ proc headless_show_gui {} { puts stderr "error: Requested show gui but env.RENDERER is missing." exit 1 } - return "Requested GUI with $headless_renderer_type" + return "mb::head GUI renderer $headless_renderer_type" } if {[info exists ::env(RENDERER)] && ([string trim $::env(RENDERER)] != "")} { diff --git a/lib/openmsx/share/scripts/night_flight.tcl b/lib/openmsx/share/scripts/night_flight.tcl index 2d895d6..b27d0ee 100644 --- a/lib/openmsx/share/scripts/night_flight.tcl +++ b/lib/openmsx/share/scripts/night_flight.tcl @@ -33,7 +33,7 @@ proc night_flight_save_screenshot {{prefix_id 0}} { set file_prefix "$night_flight_prefix$night_flight_seperator" } screenshot -prefix $file_prefix - return "Flight screenshot saved" + return "mb::save flight screenshot" } proc night_flight_save_video {{prefix_id 0}} { @@ -47,7 +47,7 @@ proc night_flight_save_video {{prefix_id 0}} { } after quit "record stop" after time 1 "record start $night_flight_record_flag -prefix $file_prefix" - return "Flight video started" + return "mb::save flight video" } if {[info exists ::env(NF_PREFIX)] && ([string trim $::env(NF_PREFIX)] != "")} { diff --git a/src/0module/assert-all/0module.mk b/src/0module/assert-all/0module.mk index 9f9b4d1..638aa8a 100644 --- a/src/0module/assert-all/0module.mk +++ b/src/0module/assert-all/0module.mk @@ -6,7 +6,8 @@ bin/dist-qa-dos1/@assert \ bin/dist-qa-dos2/@assert \ bin/dist-qa-msx1/@assert \ bin/dist-qa-msxhub/@assert \ -bin/make-on-msx/@assert +bin/make-on-msx/@assert \ +bin/mbboot80-test/@assert $(PATH_BIN)/@assert-all: | $(ASSERT_ALL_DEPS) @echo === All assertions completed diff --git a/src/mbboot80-test/0module.mk b/src/mbboot80-test/0module.mk new file mode 100644 index 0000000..ee52b70 --- /dev/null +++ b/src/mbboot80-test/0module.mk @@ -0,0 +1,24 @@ + +MBBOOT80_TEST_MOD := mbboot80-test +MBBOOT80_TEST_SRC := $(PATH_SRC)/$(MBBOOT80_TEST_MOD) +MBBOOT80_TEST_BIN := $(PATH_BIN)/$(MBBOOT80_TEST_MOD) + +$(MBBOOT80_TEST_BIN): | $(PATH_BIN)/@prepare + $(call mb_mkdir,$(MBBOOT80_TEST_BIN)) + +$(MBBOOT80_TEST_BIN)/mbboot80.com: $(MBBOOT80_BIN)/mbboot80.com | $(MBBOOT80_TEST_BIN) + $(call mb_copy,$<,$@) + +$(MBBOOT80_TEST_BIN)/@run: | $(MBBOOT80_TEST_BIN)/mbboot80.com + $(call mb_autoexec_show_gui80,$(MBBOOT80_TEST_BIN)) + $(call mb_openmsx_dosctl,$(MBBOOT80_TEST_BIN)) +MB_DOC_HELP_TARGET += $(call mb_doc_target,$(MBBOOT80_TEST_BIN)/@run,"Run binaries from mbboot80.") +.PHONY: $(MBBOOT80_TEST_BIN)/@run + +$(MBBOOT80_TEST_BIN)/@assert: | $(MBBOOT80_TEST_BIN)/mbboot80.com + $(call mb_delete,$(MBBOOT80_TEST_BIN)/ahello.out) + $(call mb_autoexec_safe_test,$(MBBOOT80_TEST_BIN),mbboot80 > mbboot80.out) + $(call mb_openmsx_dosctl,$(MBBOOT80_TEST_BIN)) + grep "mb::boot mode 80" $(MBBOOT80_TEST_BIN)/mbboot80.out +MB_DOC_HELP_TARGET += $(call mb_doc_target,$(MBBOOT80_TEST_BIN)/@assert,"Assert binaries from mbboot80.") +.PHONY: $(MBBOOT80_TEST_BIN)/@assert \ No newline at end of file diff --git a/src/mbboot80/0module.mk b/src/mbboot80/0module.mk new file mode 100644 index 0000000..f703fea --- /dev/null +++ b/src/mbboot80/0module.mk @@ -0,0 +1,28 @@ + +MBBOOT80_MOD := mbboot80 +MBBOOT80_SRC := $(PATH_SRC)/$(MBBOOT80_MOD) +MBBOOT80_BIN := $(PATH_BIN)/$(MBBOOT80_MOD) + +$(MBBOOT80_BIN): | $(PATH_BIN)/@prepare + $(call mb_mkdir,$(MBBOOT80_BIN)) + +$(MBBOOT80_BIN)/%.rel: $(MBBOOT80_SRC)/%.asm | $(MBBOOT80_BIN) + $(call mb_sdcc_compile_asm,$<,$@) + +$(MBBOOT80_BIN)/mbboot80.hex: $(MBBOOT80_BIN)/mbboot80.rel + $(call mb_sdcc_link_asm_bdos,$<,$@) + +$(MBBOOT80_BIN)/mbboot80.com: $(MBBOOT80_BIN)/mbboot80.hex + $(call mb_sdcc_hex2bin,$<,$@) +MB_DOC_HELP_TARGET += $(call mb_doc_target,$(MBBOOT80_BIN)/mbboot80.com,"Compiles mbboot80.") + +$(MBBOOT80_BIN)/@run: | $(MBBOOT80_BIN)/mbboot80.com + $(call mb_autoexec_show_gui80,$(MBBOOT80_BIN)) + $(call mb_openmsx_dosctl,$(MBBOOT80_BIN)) +MB_DOC_HELP_TARGET += $(call mb_doc_target,$(MBBOOT80_BIN)/@run,"Run the compiled mbboot80.") +.PHONY: $(MBBOOT80_BIN)/@run + +$(MBBOOT80_BIN)/@release-local: | $(MBBOOT80_TEST_BIN)/@assert + $(call mb_copy,$(MBBOOT80_BIN)/mbboot80.com,lib/emuctl//mbboot80.com) +MB_DOC_HELP_TARGET += $(call mb_doc_target,$(MBBOOT80_BIN)/@release-local,"Updates binary copy in lib/emuctl folder.") +.PHONY: $(MBBOOT80_BIN)/@release-local diff --git a/src/mbboot80/mbboot80.asm b/src/mbboot80/mbboot80.asm new file mode 100644 index 0000000..1654669 --- /dev/null +++ b/src/mbboot80/mbboot80.asm @@ -0,0 +1,51 @@ + +.area _CODE + JP MAIN + .db 0x0D + .db 0x0D,0x0A + .str "MSXBUILD Boot mode 80 to support msx1 systems." + .db 0x0D,0x0A + .db 0x1A + +MAIN: + LD HL,#0x002D + LD A,(0xFCC1) + CALL 0x0C + LD HL,#TXT_MODE80_MSX1 + OR A + JP Z,PUT_TXT + + LD A,#80 + LD (0xF3AE),A + LD A,#0 + LD IY,(0xFCC1) + LD IX,#0x5F + CALL 0x1C + + LD HL,#TXT_MODE80 + +PUT_TXT: + LD A,(HL) + CP #0x1D + RET Z + LD E,A + LD C,#2 + PUSH HL + CALL 0x5 + POP HL + INC HL + JR PUT_TXT + +;=========== MSX_TYPE TXT'S + +TXT_MODE80: + .str "mb::boot mode 80" + .db 0x0D,0x0A + .db 0x1D + +TXT_MODE80_MSX1: + .str "mb::boot mode MSX1" + .db 0x0D,0x0A + .db 0x1D + +.area _DATA