|
|
1.1 root 1: # Main Tcl script for Generator
2:
3: ### Setup global variables and options ###
4:
5: global debug, sharedir, savename, nextdump, name, copyright, scale, smooth
6: global layerB, layerBp, layerA, layerAp, layerH, layerS, layerSp, vdpsimple
7: global layerW, layerWp
8: global skip
9: set sharedir {/usr/local/share/generator}
10: set savename {}
11: set tk_strictMotif 1
12: set nextdump 1
13: set name {}
14: set copyright {}
15:
16: ### Main window definition ###
17:
18: # Set window attributes: title and make unresizable
19: wm title . Generator
20: wm resizable . 0 0
21:
22: # Split main window into two frames, the top one is the menu bar
23: frame .bar -relief raised -bd 2
24: frame .main -width 320 -height 224 -bg black
25: pack .bar -side top -fill x
26: pack .main -side top -side top -anchor center
27:
28: # Create left-side menu names on the menu bar
29: menubutton .bar.file -text File -underline 0 -menu .bar.file.menu
30: menubutton .bar.open -text Open -underline 0 -menu .bar.open.menu
31: menubutton .bar.display -text Display -underline 0 -menu .bar.display.menu
32: menubutton .bar.game -text Game -underline 0 -menu .bar.game.menu
33: if {$debug == 1} {
34: menubutton .bar.debug -text Debug -underline 0 -menu .bar.debug.menu
35: pack .bar.file .bar.open .bar.display .bar.game .bar.debug -side left
36: } else {
37: pack .bar.file .bar.open .bar.display .bar.game -side left
38: }
39:
40: # Create right-side menu names on the menu bar
41: menubutton .bar.help -text Help -underline 0 -menu .bar.help.menu
42: pack .bar.help -side right
43:
44: # Create some key bindings
45: bind . <Control-c> {destroy .}
46: bind . q {destroy .}
47:
48: # Define File menu
49: menu .bar.file.menu -tearoff true
50: .bar.file.menu add command -label {Open image} -command {File_open 0}
51: #.bar.file.menu add command -label {Open saved position} -command {File_open 1}
52: #.bar.file.menu add command -label Save -command {File_save $savename}
53: #.bar.file.menu add command -label "Save as" -command File_saveas
54: .bar.file.menu add separator
55: .bar.file.menu add command -label Quit -command {destroy .}
56:
57: # Define Open menu
58: menu .bar.open.menu -tearoff true
59: .bar.open.menu add command -label {Image information} -command {Info_open}
60:
61: # Define Display menu
62: menu .bar.display.menu -tearoff true
63: .bar.display.menu add radiobutton -variable myscale -label "100%" -value 1 \
64: -command "Display_set 1"
65: .bar.display.menu add radiobutton -variable myscale -label "200%" -value 2 \
66: -command "Display_set 2"
67: .bar.display.menu add radiobutton -variable myscale -label "200% smooth" \
68: -value 3 -command "Display_set 3"
69: .bar.display.menu add separator
70: .bar.display.menu add radiobutton -variable vdpsimple \
71: -label "Complex (slow) VDP" \
72: -value 0 -command "Gen_Change"
73: .bar.display.menu add radiobutton -variable vdpsimple \
74: -label "Simple (fast) VDP" \
75: -value 1 -command "Gen_Change"
76: .bar.display.menu add separator
77: .bar.display.menu add checkbutton -variable layerB -label "Layer B" \
78: -onvalue 1 -command "Gen_Change"
79: .bar.display.menu add checkbutton -variable layerA -label "Layer A" \
80: -onvalue 1 -command "Gen_Change"
81: .bar.display.menu add checkbutton -variable layerW -label "Window" \
82: -onvalue 1 -command "Gen_Change"
83: .bar.display.menu add checkbutton -variable layerH -label "Shadow" \
84: -onvalue 1 -command "Gen_Change"
85: .bar.display.menu add checkbutton -variable layerS -label "Sprites" \
86: -onvalue 1 -command "Gen_Change"
87: .bar.display.menu add checkbutton -variable layerBp -label "Layer B pri" \
88: -onvalue 1 -command "Gen_Change"
89: .bar.display.menu add checkbutton -variable layerAp -label "Layer A pri" \
90: -onvalue 1 -command "Gen_Change"
91: .bar.display.menu add checkbutton -variable layerWp -label "Window pri" \
92: -onvalue 1 -command "Gen_Change"
93: .bar.display.menu add checkbutton -variable layerSp -label "Sprites pri" \
94: -onvalue 1 -command "Gen_Change"
95: .bar.display.menu add separator
96: .bar.display.menu add radiobutton -variable skip -label "All frames" \
97: -value 1 -command "Gen_Change"
98: .bar.display.menu add radiobutton -variable skip -label "Every other frame" \
99: -value 2 -command "Gen_Change"
100: .bar.display.menu add radiobutton -variable skip -label "Every 3 frames" \
101: -value 3 -command "Gen_Change"
102: .bar.display.menu add radiobutton -variable skip -label "Every 4 frames" \
103: -value 4 -command "Gen_Change"
104: .bar.display.menu add radiobutton -variable skip -label "Every 5 frames" \
105: -value 5 -command "Gen_Change"
106:
107: # Define Game menu
108: menu .bar.game.menu -tearoff true
109: .bar.game.menu add radiobutton -variable state -label "Stop" -value 0 \
110: -command "Gen_Change"
111: .bar.game.menu add radiobutton -variable state -label "Pause" -value 1 \
112: -command "Gen_Change"
113: .bar.game.menu add radiobutton -variable state -label "Play" -value 2 \
114: -command "Gen_Change"
115: .bar.game.menu add separator
116: .bar.game.menu add radiobutton -variable loglevel -label {Log quiet} \
117: -value 0 -command "Gen_Change"
118: .bar.game.menu add radiobutton -variable loglevel -label {Log critical} \
119: -value 1 -command "Gen_Change"
120: .bar.game.menu add radiobutton -variable loglevel -label {Log normal} \
121: -value 2 -command "Gen_Change"
122: .bar.game.menu add radiobutton -variable loglevel -label {Log verbose} \
123: -value 3 -command "Gen_Change"
124: .bar.game.menu add radiobutton -variable loglevel -label {Log user} \
125: -value 4 -command "Gen_Change"
126: .bar.game.menu add radiobutton -variable loglevel -label {Log debug1} \
127: -value 5 -command "Gen_Change"
128:
129: # Set default values for Display menu
130: set myscale 1
131: set layerB 1
132: set layerBp 1
133: set layerA 1
134: set layerAp 1
135: set layerW 1
136: set layerWp 1
137: set layerH 1
138: set layerS 1
139: set layerSp 1
140: set skip 3
141: set vdpsimple 1
142: set state 0
143: set loglevel 2
144:
145: # Define Help menu
146: menu .bar.help.menu -tearoff true
147: .bar.help.menu add command -label Generator -command "Help_show generator.hlp"
148: .bar.help.menu add command -label Genesis -command "Help_show genesis.hlp"
149: .bar.help.menu add separator
150: .bar.help.menu add command -label Copyright -command "Help_show copyright.hlp"
151:
152: Gen_Change
153:
154: # Define Debug menu
155: if {$debug} {
156: menu .bar.debug.menu -tearoff true
157: .bar.debug.menu add command -label {Disassemble ROM} -command \
158: {Debug_dump 0 0 0}
159: .bar.debug.menu add command -label {Disassemble RAM} -command \
160: {Debug_dump 1 0 0}
161: .bar.debug.menu add command -label {Disassemble VRAM} -command \
162: {Debug_dump 2 0 0}
163: .bar.debug.menu add command -label {Disassemble CRAM} -command \
164: {Debug_dump 3 0 0}
165: .bar.debug.menu add command -label {Disassemble VSRAM} -command \
166: {Debug_dump 4 0 0}
167: .bar.debug.menu add command -label {Disassemble SRAM} -command \
168: {Debug_dump 5 0 0}
169: .bar.debug.menu add command -label {VDP register dump} -command {Gen_Regs}
170: .bar.debug.menu add command -label {Describe VDP} \
171: -command {Gen_VDPDescribe}
172: .bar.debug.menu add command -label {Profile clear} \
173: -command {Gen_ProfileClr}
174: .bar.debug.menu add command -label {Profile dump} \
175: -command {Gen_ProfileDump}
176: .bar.debug.menu add command -label {Sprite list dump} \
177: -command {Gen_SpriteList}
178: .bar.debug.menu add command -label {Registers} -command {Regs_open}
179: .bar.debug.menu add separator
180: .bar.debug.menu add command -label {Reset z80} -command {Gen_Reset 1}
181: }
182:
183: Gen_Initialised
184:
185: ### File menu support functions ###
186:
187: proc File_open {savetype} {
188: set types {
189: {{Generator Save Game files} {.gsg} }
190: {{All files} * }
191: }
192: set filename [tk_getOpenFile -parent . -defaultextension gsg \
193: -title [expr { $savetype ? {Open saved position} : \
194: {Open image} }] -filetypes $types]
195: if {[string compare $filename {}] == 0} {
196: return
197: }
198: Gen_Load $savetype $filename
199: }
200:
201: proc File_save {filename} {
202: global savename
203:
204: if {[string compare $filename {}] == 0} {
205: File_saveas
206: return
207: }
208: set savename $filename
209: puts $filename
210: }
211:
212: proc File_saveas {} {
213: set filename [tk_getSaveFile -parent . -initialfile {savegame.gsg} \
214: -defaultextension gsg -title {Save position as}]
215: if {[string compare $filename {}] == 0} {
216: return
217: }
218: File_save $filename
219: }
220:
221: ### Display menu support functions ###
222:
223: proc Display_set {myscale} {
224: global smooth scale
225: set smooth 0
226: if {$myscale == 1} {
227: set scale 1
228: .main configure -width 320 -height [expr 224]
229: } else {
230: set scale 2
231: if {$myscale == 2} {
232: .main configure -width 640 -height [expr 448]
233: } else {
234: set smooth 1
235: .main configure -width 640 -height [expr 448]
236: }
237: }
238: Gen_Change
239: }
240:
241: ### Help menu support functions ###
242:
243: proc Help_show file {
244: global sharedir
245: if ![winfo exists .help] {
246: toplevel .help
247: text .help.text -relief raised -bd 2 -yscrollcommand ".help.scroll set"
248: scrollbar .help.scroll -command ".help.text yview"
249: pack .help.scroll -side right -fill y
250: pack .help.text -side top -fill both -expand true
251: }
252: .help.text configure -state normal
253: .help.text delete 1.0 end
254: set f [open $sharedir/$file]
255: while {![eof $f]} {
256: .help.text insert end [read $f 1000]
257: }
258: close $f
259: .help.text configure -state disabled
260: }
261:
262: ### Info menu support functions ###
263:
264: proc Info_open {} {
265: global i_console i_copyright i_name_domestic i_name_overseas
266: global i_prodtype i_version i_checksum
267: if ![winfo exists .info] {
268: toplevel .info
269: label .info.lconsole -text "Console" -anchor w
270: entry .info.console -width 32 -textvariable i_console
271: grid .info.lconsole .info.console -sticky news
272: label .info.lcopyright -text Copyright -anchor w
273: entry .info.copyright -width 32 -textvariable i_copyright
274: grid .info.lcopyright .info.copyright -sticky news
275: label .info.ldomestic -text "Domestic name" -anchor w
276: entry .info.domestic -width 32 -textvariable i_name_domestic
277: grid .info.ldomestic .info.domestic -sticky news
278: label .info.loverseas -text "Overseas name" -anchor w
279: entry .info.overseas -width 32 -textvariable i_name_overseas
280: grid .info.loverseas .info.overseas -sticky news
281: label .info.lprodtype -text "Product Type" -anchor w
282: entry .info.prodtype -width 32 -textvariable i_prodtype
283: grid .info.lprodtype .info.prodtype -sticky news
284: label .info.lversion -text "Version" -anchor w
285: entry .info.version -width 32 -textvariable i_version
286: grid .info.lversion .info.version -sticky news
287: label .info.lchecksum -text "Checksum" -anchor w
288: entry .info.checksum -width 32 -textvariable i_checksum
289: grid .info.lchecksum .info.checksum -sticky news
290: wm resizable .info 0 0
291: }
292: }
293:
294: ### Regs menu support functions ###
295:
296: proc Regs_open {} {
297: global regs.d0 regs.d1 regs.d2 regs.d3 regs.d4 regs.d5 regs.d6 regs.d7
298: global regs.a0 regs.a1 regs.a2 regs.a3 regs.a4 regs.a5 regs.a6 regs.a7
299: global regs.s regs.x regs.n regs.z regs.v regs.c regs.stop
300: global regs.clocks regs.frames
301: if ![winfo exists .regs] {
302: toplevel .regs
303: label .regs.d0txt -text "D0" -relief flat
304: label .regs.d1txt -text "D1" -relief flat
305: label .regs.d2txt -text "D2" -relief flat
306: label .regs.d3txt -text "D3" -relief flat
307: label .regs.d4txt -text "D4" -relief flat
308: label .regs.d5txt -text "D5" -relief flat
309: label .regs.d6txt -text "D6" -relief flat
310: label .regs.d7txt -text "D7" -relief flat
311: grid .regs.d0txt .regs.d1txt .regs.d2txt .regs.d3txt .regs.d4txt .regs.d5txt .regs.d6txt .regs.d7txt -sticky news
312: button .regs.d0 -textvariable regs.d0 -width 9 \
313: -command {Regs_dump ${regs.d0}}
314: button .regs.d1 -textvariable regs.d1 -width 9 \
315: -command {Regs_dump ${regs.d1}}
316: button .regs.d2 -textvariable regs.d2 -width 9 \
317: -command {Regs_dump ${regs.d2}}
318: button .regs.d3 -textvariable regs.d3 -width 9 \
319: -command {Regs_dump ${regs.d3}}
320: button .regs.d4 -textvariable regs.d4 -width 9 \
321: -command {Regs_dump ${regs.d4}}
322: button .regs.d5 -textvariable regs.d5 -width 9 \
323: -command {Regs_dump ${regs.d5}}
324: button .regs.d6 -textvariable regs.d6 -width 9 \
325: -command {Regs_dump ${regs.d6}}
326: button .regs.d7 -textvariable regs.d7 -width 9 \
327: -command {Regs_dump ${regs.d7}}
328: grid .regs.d0 .regs.d1 .regs.d2 .regs.d3 .regs.d4 .regs.d5 .regs.d6 .regs.d7 -sticky news
329: label .regs.a0txt -text "A0" -relief flat
330: label .regs.a1txt -text "A1" -relief flat
331: label .regs.a2txt -text "A2" -relief flat
332: label .regs.a3txt -text "A3" -relief flat
333: label .regs.a4txt -text "A4" -relief flat
334: label .regs.a5txt -text "A5" -relief flat
335: label .regs.a6txt -text "A6" -relief flat
336: label .regs.a7txt -text "A7" -relief flat
337: grid .regs.a0txt .regs.a1txt .regs.a2txt .regs.a3txt .regs.a4txt .regs.a5txt .regs.a6txt .regs.a7txt -sticky news
338: button .regs.a0 -textvariable regs.a0 -width 9 \
339: -command {Regs_dump ${regs.a0}}
340: button .regs.a1 -textvariable regs.a1 -width 9 \
341: -command {Regs_dump ${regs.a1}}
342: button .regs.a2 -textvariable regs.a2 -width 9 \
343: -command {Regs_dump ${regs.a2}}
344: button .regs.a3 -textvariable regs.a3 -width 9 \
345: -command {Regs_dump ${regs.a3}}
346: button .regs.a4 -textvariable regs.a4 -width 9 \
347: -command {Regs_dump ${regs.a4}}
348: button .regs.a5 -textvariable regs.a5 -width 9 \
349: -command {Regs_dump ${regs.a5}}
350: button .regs.a6 -textvariable regs.a6 -width 9 \
351: -command {Regs_dump ${regs.a6}}
352: button .regs.a7 -textvariable regs.a7 -width 9 \
353: -command {Regs_dump ${regs.a7}}
354: grid .regs.a0 .regs.a1 .regs.a2 .regs.a3 .regs.a4 .regs.a5 .regs.a6 .regs.a7 -sticky news
355: label .regs.sptxt -text "SP" -relief flat
356: label .regs.srtxt -text "SR" -relief flat
357: label .regs.pctxt -text "PC" -relief flat
358: label .regs.stoptxt -text "Stop" -relief flat
359: label .regs.clockstxt -text "Clocks" -relief flat
360: grid .regs.sptxt .regs.srtxt .regs.pctxt x x x .regs.stoptxt .regs.clockstxt -sticky news
361: label .regs.sr -textvariable regs.sr -width 9 -relief groove
362: button .regs.pc -textvariable regs.pc -width 9 \
363: -command {Regs_dump ${regs.pc}}
364: label .regs.clocks -textvariable regs.clocks -width 9 -relief groove
365: button .regs.sp -textvariable regs.sp -width 9 \
366: -command {Regs_dump ${regs.sp}}
367: button .regs.step -text "Step" -command {Gen_Step}
368: button .regs.cont -text "Cont" -command {Gen_Cont}
369: button .regs.framestep -text "Frame step" -command {Gen_FrameStep}
370: entry .regs.stop -textvariable regs.stop -width 9
371: grid .regs.sp .regs.sr .regs.pc .regs.step .regs.cont .regs.framestep .regs.stop .regs.clocks -sticky news
372: checkbutton .regs.s -variable regs.s -text "S" -onvalue 1
373: checkbutton .regs.x -variable regs.x -text "X" -onvalue 1
374: checkbutton .regs.n -variable regs.n -text "N" -onvalue 1
375: checkbutton .regs.z -variable regs.z -text "Z" -onvalue 1
376: checkbutton .regs.v -variable regs.v -text "V" -onvalue 1
377: checkbutton .regs.c -variable regs.c -text "C" -onvalue 1
378: label .regs.frames -textvariable regs.frames -width 9 -relief groove
379: grid .regs.s .regs.x .regs.n .regs.z .regs.c .regs.v x .regs.frames -sticky news
380: wm resizable .regs 0 0
381: }
382: }
383:
384: proc Regs_dump {addr} {
385: Debug_dump 0 0 0x$addr
386: }
387:
388: ### Debug menu support functions ###
389:
390: proc Debug_dump {memtype dumptype offset} {
391: global nextdump
392: set dumpname .dump$nextdump
393: toplevel $dumpname
394: text $dumpname.main -relief raised
395: scrollbar $dumpname.bar -command "Gen_Dump $dumpname yview"
396: pack $dumpname.bar -fill y -side right
397: pack $dumpname.main -expand true -fill both
398: global $dumpname.main $dumpname.offset $dumpname.memtype $dumpname.dumptype
399: global $dumpname.lines
400: set $dumpname.offset $offset
401: set $dumpname.memtype $memtype
402: set $dumpname.dumptype $dumptype
403: set $dumpname.lines 0
404: $dumpname.bar set 0 1
405: tkwait visibility $dumpname
406: $dumpname.main insert end "..."
407: Gen_Dump $dumpname redraw
408: bind $dumpname <Configure> "Gen_Dump $dumpname redraw"
409: set nextdump [expr {$nextdump+1}]
410: }
411:
412: ### Message window definition ###
413:
414: proc showmessage {msg} {
415: toplevel .message
416: message .message.text -relief raised -bd 2 -justify center \
417: -text $msg -width 128
418: pack .message.text -side top -fill both -expand true
419: button .message.ok -text "OK" -command {destroy .message}
420: pack .message.ok -side bottom
421: wm minsize .message 192 128
422: wm title .message "Message from Generator"
423: tkwait visibility .message
424: grab set .message
425: tkwait window .message
426: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.