/usr/share/openmsx/scripts/save_debuggable.tcl is in openmsx-data 0.8.2-2.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | namespace eval save_debuggable {
set_help_text save_debuggable \
{Save a debuggable to file. Examples of debuggables are memory, VRAM, ...
Use 'debug list' to get a complete list of all debuggables.
Usage:
save_debuggable VRAM vram.raw Save the content of the MSX VRAM to a file
called 'vram.raw'
}
proc save_debuggable {debuggable filename} {
set size [debug size $debuggable]
set data [debug read_block $debuggable 0 $size]
set file [open $filename "WRONLY CREAT TRUNC"]
fconfigure $file -translation binary -buffersize $size
puts -nonewline $file $data
close $file
}
set_help_text load_debuggable \
{Load a raw data file into a certain debuggable (see also save_debuggable).
Note that saving and reloading the same data again does not always bring the
MSX in the same state (e.g. the subslotregister). Use 'savestate' and 'loadstate'
if you want that.
}
proc load_debuggable {debuggable filename} {
set size [debug size $debuggable]
set file [open $filename "RDONLY"]
fconfigure $file -translation binary -buffersize $size
set data [read $file]
close $file
debug write_block $debuggable 0 $data
}
set_tabcompletion_proc save_debuggable [namespace code tab_loadsave_debuggable]
set_tabcompletion_proc load_debuggable [namespace code tab_loadsave_debuggable]
proc tab_loadsave_debuggable {args} {
if {[llength $args] == 2} {
return [debug list]
}
}
# TODO remove these two procs?
# They were meant as a very quick-and-dirty savestate mechanism, but it
# doesn't work (e.g. because of subslot register)
proc save_all {directory} {
puts stderr "This command ('save_all') has been deprecated (and may be removed in a future release). In contrast to what you might think, it cannot be used to save the machine state. You probably just want to use 'save_state' instead!"
foreach debuggable [debug list] {
save_debuggable $debuggable ${directory}/${debuggable}.sav
}
}
proc load_all {directory} {
puts stderr "This command ('load_all') has been deprecated (and may be removed in a future release). In contrast to what you might think, it cannot be used to load the machine state. You probably just want to use 'load_state' instead!"
foreach debuggable [debug list] {
load_debuggable $debuggable ${directory}/${debuggable}.sav
}
}
# for backwards compatibility
proc vramdump {{filename "vramdump"}} {
#puts stderr "This command ('vramdump') has been deprecated (and may be removed in a future release), please use 'save_debuggable VRAM' instead!"
# I prefer to keep this command as a convenience shortcut
save_debuggable "VRAM" $filename
}
set_help_text vram2bmp \
{Dump a selected region of the video memory into a bitmap file.
vram filename filename [start address] [width] [length]
usage example: vram2bmp RawDataDump.bmp 0 256 1024
}
proc vram2bmp {filename start dx dy} {
set file [open $filename "WRONLY CREAT TRUNC"]
set data_len [expr {$dx * $dy / 2}]
set file_len [expr {$data_len + 0x76}]
set file_len_HI [expr {$file_len / 0x100}]
set dx_HI [expr {$dx / 0x100}]
set dy_HI [expr {$dy / 0x100}]
set data_len_HI [expr {$data_len / 0x100}]
fconfigure $file -translation binary -buffersize $file_len
puts -nonewline $file "\x42\x4d" ;# BMP FILE identificator
puts -nonewline $file [format %c $file_len] ;# <-File length
puts -nonewline $file [format %c $file_len_HI] ;# <-File length
puts -nonewline $file "\x00\x00" ;# last always always zero because maximim file length is 128KB + header length
puts -nonewline $file "\x00\x00\x00\x00" ;# unused
puts -nonewline $file "\x76\x00\x00\x00" ;# offset to bitmap data - always same for 16 colors bmp
puts -nonewline $file "\x28\x00\x00\x00" ;# number of bytes in the header
puts -nonewline $file [format %c $dx] ;# bitmap width
puts -nonewline $file [format %c $dx_HI] ;# bitmap width
puts -nonewline $file "\x00\x00" ;# bitmap width - unused because maximum width is 256
puts -nonewline $file [format %c $dy] ;# bitmap height
puts -nonewline $file [format %c $dy_HI] ;# bitmap height
puts -nonewline $file "\x00\x00" ;# bitmap height, if negative image will look normal in mspaint
puts -nonewline $file "\x01\x00" ;# 1 plane used
puts -nonewline $file "\x04\x00" ;# 4 bits per pixel
puts -nonewline $file "\x00\x00\x00\x00" ;# no compression used
puts -nonewline $file [format %c $data_len] ;# RAW image data length
puts -nonewline $file [format %c $data_len_HI] ;# RAW image data length
puts -nonewline $file "\x00\x00" ;# RAW image data length - always zero, because maximum length is 128KB
puts -nonewline $file "\x00\x00\x00\x00"
puts -nonewline $file "\x00\x00\x00\x00"
puts -nonewline $file "\x00\x00\x00\x00" ;#how many colors used
puts -nonewline $file "\x00\x00\x00\x00" ;#important colors
#set colors (16 colors [0..15])
for {set col 0} {$col < 16} {incr col} {
set color [getcolor $col]
puts -nonewline $file [format %c [expr {[string index $color 2] * 255 / 7}]]
puts -nonewline $file [format %c [expr {[string index $color 1] * 255 / 7}]]
puts -nonewline $file [format %c [expr {[string index $color 0] * 255 / 7}]]
puts -nonewline $file "\x00"
}
set cur_addr $start
for {set i 0} {$i < $dy} {incr i} {
for {set addr $cur_addr} {$addr < ($cur_addr + $dx / 2)} {incr addr} {
puts -nonewline $file [format %c [vpeek $addr]]
}
set cur_addr [expr {$cur_addr + 0x80}]
}
close $file
}
namespace export save_debuggable
namespace export load_debuggable
namespace export save_all
namespace export load_all
namespace export vramdump
namespace export vram2bmp
} ;# namespace save_debuggable
namespace import save_debuggable::*
|