/usr/share/openmsx/scripts/slot.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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | namespace eval slot {
#
# get_selected_slot
#
set_help_text get_selected_slot \
{Returns the selected slot for the given memory page.
This proc is typically used as a helper for a larger proc.
@param page The memory page (0-3)
@result Returns a Tcl list with two elements.
First element is the primary slot (0-3).
Second element is the secondary slot (0-3) or 'X'
in case this slot was not expanded
}
proc get_selected_slot {page} {
set ps_reg [debug read "ioports" 0xA8]
set ps [expr {($ps_reg >> (2 * $page)) & 0x03}]
if {[machine_info "issubslotted" $ps]} {
set ss_reg [debug read "slotted memory" [expr {0x40000 * $ps + 0xFFFF}]]
set ss [expr {(($ss_reg ^ 255) >> (2 * $page)) & 0x03}]
} else {
set ss "X"
}
list $ps $ss
}
#
# slotselect
#
set_help_text slotselect \
{Returns a nicely formatted overview of the selected slots.}
proc slotselect {} {
set result ""
for {set page 0} {$page < 4} {incr page} {
lassign [get_selected_slot $page] ps ss
append result [format "%04X: slot %d" [expr {0x4000 * $page}] $ps]
if {$ss ne "X"} {append result "." $ss}
append result "\n"
}
return $result
}
#
# get_mapper_size
#
set_help_text get_mapper_size \
{Returns the size of the memory mapper in a given slot.
Result is 0 when there is no memory mapper in the slot.}
proc get_mapper_size {ps ss} {
set result 0
catch {
set device [machine_info slot $ps $ss 0]
if {[debug desc $device] eq "memory mapper"} {
set result [expr {[debug size $device] / 0x4000}]
}
}
return $result
}
#
# pc_in_slot
#
set_help_text pc_in_slot \
{Test whether the CPU's program counter is inside a certain slot.
Typically used to set breakpoints in specific slots.}
proc pc_in_slot {ps {ss "X"} {mapper "X"}} {
set page [expr {[reg PC] >> 14}]
lassign [get_selected_slot $page] pc_ps pc_ss
if {($ps ne "X") && ($pc_ps != $ps)} {return false}
if {($ss ne "X") && ($pc_ss ne "X") && ($pc_ss != $ss)} {return false}
set mapper_size [get_mapper_size $pc_ps $pc_ss]
if {($mapper_size == 0) || ($mapper eq "X")} {return true}
set pc_mapper [debug read "MapperIO" $page]
expr {$mapper == ($pc_mapper & ($mapper_size - 1))}
}
#
# slotmap
#
set_help_text slotmap \
{Gives an overview of the devices in the different slots.}
proc slotmap_helper {ps ss} {
set result ""
for {set page 0} {$page < 4} {incr page} {
set name [machine_info slot $ps $ss $page]
append result [format "%04X: %s\n" [expr {$page * 0x4000}] $name]
}
return $result
}
proc slotmap_name {ps ss} {
set t [list $ps $ss]
foreach slot [machine_info external_slot] {
if {[lrange [machine_info external_slot $slot] 0 1] eq $t} {
return " (${slot})"
}
}
return ""
}
proc slotmap {} {
set result ""
for {set ps 0} {$ps < 4} {incr ps} {
if {[machine_info issubslotted $ps]} {
for {set ss 0} {$ss < 4} {incr ss} {
append result "slot $ps.$ss[slotmap_name $ps $ss]:\n"
append result [slotmap_helper $ps $ss]
}
} else {
append result "slot $ps[slotmap_name $ps X]:\n"
append result [slotmap_helper $ps 0]
}
}
return $result
}
#
# iomap
#
set_help_text iomap \
{Gives an overview of the devices connected to the different I/O ports.}
proc iomap_helper {prefix begin end name} {
if {$name eq "empty"} {return ""}
set result [format "port %02X" $begin]
if {$begin == ($end - 1)} {
append result ": "
} else {
append result [format "-%02X:" [expr {$end - 1}]]
}
append result " $prefix $name\n"
}
proc iomap {} {
set result ""
set port 0
while {$port < 256} {
set in [machine_info input_port $port]
set out [machine_info output_port $port]
set end [expr {$port + 1}]
while {($end < 256) &&
($in eq [machine_info input_port $end]) &&
($out eq [machine_info output_port $end])} {
incr end
}
if {$in eq $out} {
append result [iomap_helper "I/O" $port $end $in ]
} else {
append result [iomap_helper "I " $port $end $in ]
append result [iomap_helper " O" $port $end $out]
}
set port $end
}
return $result
}
namespace export get_selected_slot
namespace export slotselect
namespace export get_mapper_size
namespace export pc_in_slot
namespace export slotmap
namespace export iomap
} ;# namespace slot
namespace import slot::*
|