Skip to content

Instantly share code, notes, and snippets.

@FiXato FiXato/vblank.tcl
Created Jul 14, 2010

Embed
What would you like to do?
TCL plugin script for openMSX Emulator to record a video of MSX software that makes use of switching frame rate frequencies.
# TCL plugin script for openMSX Emulator
# by Albert "BiFiMSX" Beevendorp and Filip H.F. "FiXato" Slagter
# Used to record a video of MSX software that makes use of switching frame rate frequencies.
# Version 0.7
#
# `toggle_vblank` enables/disables auto-'splitting' of videos at the frame rate change.
# `record_with_vblank` is a wrapper that enables the vblank detection, and allows for
# passing along `record start` parameters such as -prefix and -doublesize.
# It automatically starts the video recording and will stop and start recording a new video when
# the frame rate change is detected.
#
# Usage examples:
# Manually:
# record start
# toggle_vblank
# Automatically:
# record_with_vblank -doublesize -prefix "\[MSX\] N.O.P. - Unknown Reality"
#
# Changelog:
# 0.1 Initial `toggle_vblank` and `check` script by BiFiMSX
# 0.2 Removed extra ) in `check` proc
# 0.3 Added `record_with_vblank` proc and support for $record_args to toggle_vblank
# 0.4 Bugfix: called variable on cur_wp in `record_with_vblank`
# 0.5 Put the watchpoint creation in a helper proc and made it conditional to prevent
# duplicate watchpoints.
# 0.6 Refactored some more and removed the helper proc again.
# 0.7 Added some output to indicate the Frame rate changes, and the start of a new video.
namespace eval vblank {
variable cur_wp ""
variable old_r9 0
variable record_args ""
proc check {} {
variable old_r9
variable record_args
# TODO: Implement check if video recording is already in progress.
if {[expr [vdpreg 9] & 2] != $old_r9} {
puts "Frame rate change detected from [expr ($old_r9 eq 0) ? 60 : 50] to [expr ([expr [vdpreg 9] & 2] eq 0) ? 60 : 50]. Starting recording of next video."
set old_r9 [expr [vdpreg 9] & 2]
record stop
eval [linsert $record_args 0 record start]
}
}
proc toggle_vblank {} {
variable cur_wp
if {$cur_wp == ""} {
variable old_r9
set old_r9 [expr [vdpreg 9] & 2]
set cur_wp [debug set_watchpoint write_io 0x99 1 { vblank::check }]
} else {
debug remove_watchpoint $cur_wp
set cur_wp ""
}
return ""
}
proc record_with_vblank { args } {
variable record_args
variable cur_wp
set record_args $args
if {$cur_wp == ""} {
toggle_vblank
}
eval [linsert $record_args 0 record start]
}
namespace export toggle_vblank
namespace export record_with_vblank
}; #namespace
namespace import vblank::*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.