Annotation of generator/share/gen.tcl, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.