+ /* Only one row can be selected at a time. */
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
+
+ g_signal_connect(selection, "changed",
+ G_CALLBACK(pgmwin_sel_changed_event), NULL);
+
+ pgmwin_init_columns();
+
+ /*
+ * The tree view has acquired its own reference to the model, so we can
+ * drop ours. That way the model will be freed automatically when the
+ * tree view is destroyed.
+ */
+ g_object_unref(store);
+
+ return frame;
+}
+
+/* Show disassembled program. */
+void
+pgmwin_Disasm(void)
+{
+ int row;
+ GtkListStore *store;
+ unsigned int Address;
+
+ Address = cpu8051.pc;
+
+ store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(pgmlist)));
+
+ for (row = 0; row < DATA_ROWS; row++) {
+ int valid;
+ GtkTreeIter iter;
+ char str[128];
+ int k;
+ int col_id;
+ int InstSize;
+ unsigned char OpCode;
+
+ if (row == 0) {
+ /* Get first row in list store */
+ valid = gtk_tree_model_get_iter_first(
+ GTK_TREE_MODEL(store), &iter);
+ } else {
+ /* Get next row in list store */
+ valid = gtk_tree_model_iter_next(
+ GTK_TREE_MODEL(store), &iter);
+ }
+
+ if (!valid) {
+ printf("Invalid iter...\n");
+ return;
+ }
+
+ /* Display breakpoints. */
+ if (IsBreakpoint(Address))
+ sprintf(str, "*");
+ else
+ str[0] = '\0';
+
+ gtk_list_store_set(store, &iter, COL_BREAKPT, str, -1);
+
+ /* Display base address. */
+ int2asciihex(Address, str, 4);
+
+ gtk_list_store_set(store, &iter, COL_ADDR, str, -1);
+
+ OpCode = memory_read8(PGM_MEM_ID, Address);
+ InstSize = cpu8051_get_instruction_size(OpCode);
+
+ /* Display instruction hex bytes. */
+ for (k = 0, col_id = COL_B0; k < InstSize; k++, col_id++) {
+ int2asciihex(memory_read8(PGM_MEM_ID, Address + k),
+ str, 2);
+ gtk_list_store_set(store, &iter, col_id, str, -1);
+ }
+
+ /* Display instruction menmonic. */
+ cpu8051_disasm_mnemonic(OpCode, str);
+ gtk_list_store_set(store, &iter, COL_INST, str, -1);
+
+ /* Display instruction arguments (if applicable). */
+ str[0] = '\0';
+ cpu8051_disasm_args(Address, str);
+ gtk_list_store_set(store, &iter, COL_ARGS, str, -1);
+
+ Address += InstSize;
+ }