|
24 | 24 | (defun model-index (model row col)
|
25 | 25 | (q+:index model row col (q+:make-qmodelindex)))
|
26 | 26 |
|
| 27 | +(defun data-changed! (model index-from &optional (index-to index-from)) |
| 28 | + (signal! model (data-changed "QModelIndex" "QModelIndex") |
| 29 | + index-from |
| 30 | + index-to)) |
| 31 | + |
27 | 32 |
|
28 | 33 | ;;;; Disassembler -------------------------------------------------------------
|
29 | 34 | ;;;; Code
|
|
36 | 41 | ;;;; Model
|
37 | 42 | (define-widget disassembly-model (QAbstractTableModel)
|
38 | 43 | ((chip :initarg :chip)
|
| 44 | + (parity :initform 0) |
39 | 45 | (current-address :initform 0)))
|
40 | 46 |
|
| 47 | + |
| 48 | +(defun disassembly-model-address-to-row (model address) |
| 49 | + (-<> address |
| 50 | + (+ <> (slot-value model 'parity)) |
| 51 | + (truncate <> 2) |
| 52 | + (values <>))) |
| 53 | + |
| 54 | + |
41 | 55 | (defun disassembly-model-update-current-address (model new-address)
|
42 | 56 | (let* ((old-address (slot-value model 'current-address))
|
43 |
| - (old-row (floor old-address 2)) |
44 |
| - (new-row (floor new-address 2))) |
| 57 | + (old-row (disassembly-model-address-to-row model old-address)) |
| 58 | + (new-row (disassembly-model-address-to-row model new-address))) |
45 | 59 | (setf (slot-value model 'current-address) new-address)
|
46 |
| - (signal! model (data-changed "QModelIndex" "QModelIndex") |
47 |
| - (model-index model old-row 0) |
48 |
| - (model-index model old-row 3)) |
49 |
| - (signal! model (data-changed "QModelIndex" "QModelIndex") |
50 |
| - (model-index model new-row 0) |
51 |
| - (model-index model new-row 3)))) |
| 60 | + (data-changed! model |
| 61 | + (model-index model old-row 0) |
| 62 | + (model-index model old-row 3)) |
| 63 | + (data-changed! model |
| 64 | + (model-index model new-row 0) |
| 65 | + (model-index model new-row 3)))) |
| 66 | + |
| 67 | +(defun disassembly-model-toggle-parity (model) |
| 68 | + (zapf (slot-value model 'parity) (if (zerop %) 1 0)) |
| 69 | + (signal! model (layout-changed))) |
| 70 | + |
52 | 71 |
|
53 | 72 | (define-override (disassembly-model column-count) (index)
|
54 | 73 | (declare (ignore index))
|
55 | 74 | 4)
|
56 | 75 |
|
57 | 76 | (define-override (disassembly-model row-count) (index)
|
58 | 77 | (declare (ignore index))
|
59 |
| - (ceiling 4096 2)) |
| 78 | + (+ parity (ceiling 4096 2))) |
60 | 79 |
|
61 | 80 |
|
62 | 81 | (defun disassembly-index-valid-p (index)
|
|
66 | 85 | (defun get-disassembly-contents (model row col)
|
67 | 86 | (let ((data (-<> model
|
68 | 87 | (slot-value <> 'chip)
|
69 |
| - (disassemble-address <> (* 2 row)) |
| 88 | + (disassemble-address <> (- (* 2 row) |
| 89 | + (slot-value model 'parity))) |
70 | 90 | (nth col <>))))
|
71 | 91 | (ecase col
|
72 | 92 | (0 (format nil "~3,'0X" data))
|
|
89 | 109 | ((q+:qt.font-role) *font*)
|
90 | 110 |
|
91 | 111 | ((q+:qt.background-role)
|
92 |
| - (if (= row (floor current-address 2)) |
| 112 | + (if (= row (disassembly-model-address-to-row disassembly-model |
| 113 | + current-address)) |
93 | 114 | *current-instruction-brush*
|
94 | 115 | (q+:make-qvariant)))
|
95 | 116 |
|
|
118 | 139 | (disassembly-model-update-current-address model address)
|
119 | 140 | (-<> address
|
120 | 141 | ;; raw address -> row number
|
121 |
| - (floor <> 2) |
| 142 | + (disassembly-model-address-to-row model <>) |
122 | 143 | ;; Give ourselves a bit of breathing room at the top of the table
|
123 | 144 | (- <> 4)
|
124 | 145 | (max <> 0)
|
|
127 | 148 | ;; make the debugger show the current line
|
128 | 149 | (q+:scroll-to view <> (q+:qabstractitemview.position-at-top))))
|
129 | 150 |
|
130 |
| -(define-subwidget (debugger disassembly-table) (q+:make-qtableview debugger) |
| 151 | +(define-subwidget (debugger disassembly-table) |
| 152 | + (q+:make-qtableview debugger) |
131 | 153 | (chip8::debugger-add-callback-arrived
|
132 | 154 | chip-debugger ; bit of a fustercluck here...
|
133 | 155 | (curry #'disassembly-update-address model-disassembly disassembly-table))
|
|
142 | 164 | (q+:set-resize-mode vheader (q+:qheaderview.fixed))
|
143 | 165 | (q+:set-default-section-size vheader 14)))
|
144 | 166 |
|
| 167 | +(define-subwidget (debugger disassembly-parity-button) |
| 168 | + (q+:make-qpushbutton "Flip Parity" debugger)) |
| 169 | + |
| 170 | +(define-slot (debugger disassembly-toggle-parity) () |
| 171 | + (declare (connected disassembly-parity-button (pressed))) |
| 172 | + (disassembly-model-toggle-parity model-disassembly)) |
| 173 | + |
| 174 | + |
145 | 175 |
|
146 | 176 | ;;;; Register Viewer ----------------------------------------------------------
|
147 | 177 | ;;;; Code
|
|
250 | 280 | (val (parse-hex value (registers-max-value row))))
|
251 | 281 | (when val
|
252 | 282 | (setf (registers-value chip row) val)
|
253 |
| - (signal! registers-model (data-changed "QModelIndex" "QModelIndex") |
254 |
| - index index)) |
| 283 | + (data-changed! registers-model index)) |
255 | 284 | t)
|
256 | 285 | nil))
|
257 | 286 |
|
|
341 | 370 | (define-subwidget (debugger layout) (q+:make-qhboxlayout debugger)
|
342 | 371 | (let ((disassembly (q+:make-qvboxlayout)))
|
343 | 372 | (q+:add-widget disassembly disassembly-table)
|
| 373 | + (q+:add-widget disassembly disassembly-parity-button) |
344 | 374 | (q+:add-layout layout disassembly))
|
345 | 375 | (let ((values (q+:make-qvboxlayout)))
|
346 | 376 | (q+:set-fixed-width registers-table 90)
|
|
0 commit comments