_cpuregs.tcl 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. namespace eval cpuregs {
  2. # reg command
  3. set_help_text reg \
  4. {Convenience procs to read or write Z80 registers.
  5. Usage is similar to the builtin Tcl proc 'set'
  6. usage:
  7. reg <reg> read from a Z80 register
  8. reg <reg> <value> write to a Z80 register
  9. <reg> must be one of
  10. A F B C D E H L
  11. A2 F2 B2 C2 D2 E3 H2 L2
  12. IXl IXh IYl IYh PCh PCl SPh SPl
  13. I R IM IFF
  14. AF BC DE HL
  15. AF2 BC2 DE2 HL2
  16. IX IY PC SP
  17. examples:
  18. reg E read register E
  19. reg HL read register HL
  20. reg C 7 write 7 to register C
  21. reg AF 0x1234 write 0x12 to register A and 0x34 to F
  22. }
  23. variable regB [dict create \
  24. A 0 F 1 B 2 C 3 \
  25. D 4 E 5 H 6 L 7 \
  26. A2 8 F2 9 B2 10 C2 11 \
  27. D2 12 E2 13 H2 14 L2 15 \
  28. IXH 16 IXL 17 IYH 18 IYL 19 \
  29. PCH 20 PCL 21 SPH 22 SPL 23 \
  30. I 24 R 25 IM 26 IFF 27 ]
  31. variable regW [dict create \
  32. AF 0 BC 2 DE 4 HL 6 \
  33. AF2 8 BC2 10 DE2 12 HL2 14 \
  34. IX 16 IY 18 PC 20 SP 22 ]
  35. set_tabcompletion_proc reg [namespace code tab_reg] false
  36. proc tab_reg {args} {
  37. variable regB
  38. variable regW
  39. concat [dict keys $regB] [dict keys $regW]
  40. }
  41. proc reg {name {val ""}} {
  42. variable regB
  43. variable regW
  44. set name [string toupper $name]
  45. if {[dict exists $regB $name]} {
  46. set i [dict get $regB $name]
  47. set single 1
  48. } elseif {[dict exists $regW $name]} {
  49. set i [dict get $regW $name]
  50. set single 0
  51. } else {
  52. error "Unknown Z80 register: $name"
  53. }
  54. set d "CPU regs"
  55. if {$val eq ""} {
  56. if {$single} {
  57. return [debug read $d $i]
  58. } else {
  59. return [expr {256 * [debug read $d $i] + [debug read $d [expr {$i + 1}]]}]
  60. }
  61. } else {
  62. if {$single} {
  63. debug write $d $i $val
  64. } else {
  65. debug write $d $i [expr {$val / 256}]
  66. debug write $d [expr {$i + 1}] [expr {$val & 255}]
  67. }
  68. }
  69. }
  70. # cpuregs command
  71. set_help_text cpuregs "Gives an overview of all Z80 registers."
  72. proc cw {reg} {format "%04X" [reg $reg]}
  73. proc cb {reg} {format "%02X" [reg $reg]}
  74. proc cpuregs {} {
  75. set result ""
  76. append result "AF =[cw AF ] BC =[cw BC ] DE =[cw DE ] HL =[cw HL ]\n"
  77. append result "AF'=[cw AF2] BC'=[cw BC2] DE'=[cw DE2] HL'=[cw HL2]\n"
  78. append result "IX =[cw IX ] IY =[cw IY ] PC =[cw PC ] SP =[cw SP ]\n"
  79. append result "I =[cb I ] R =[cb R] IM =[cb IM] IFF=[cb IFF]"
  80. return $result
  81. }
  82. # get_active_cpu
  83. set_help_text get_active_cpu "Returns the name of the active CPU ('z80' or 'r800')."
  84. proc get_active_cpu {} {
  85. set result "z80"
  86. catch {
  87. # On non-turbor machines this debuggable doesn't exist
  88. if {([debug read "S1990 regs" 6] & 0x20) == 0} {
  89. set result "r800"
  90. }
  91. }
  92. return $result
  93. }
  94. namespace export reg
  95. namespace export cpuregs
  96. namespace export get_active_cpu
  97. } ;# namespace cpuregs
  98. namespace import cpuregs::*