Skip to content

Commit 7535d4e

Browse files
committed
Add disassembly parity control
1 parent aec54ee commit 7535d4e

File tree

3 files changed

+57
-21
lines changed

3 files changed

+57
-21
lines changed

.lispwords

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
(1 macro-map)
22
(1 register-case)
3+
(2 define-subwidget)

src/debugger.lisp

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
(defun model-index (model row col)
2525
(q+:index model row col (q+:make-qmodelindex)))
2626

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+
2732

2833
;;;; Disassembler -------------------------------------------------------------
2934
;;;; Code
@@ -36,27 +41,41 @@
3641
;;;; Model
3742
(define-widget disassembly-model (QAbstractTableModel)
3843
((chip :initarg :chip)
44+
(parity :initform 0)
3945
(current-address :initform 0)))
4046

47+
48+
(defun disassembly-model-address-to-row (model address)
49+
(-<> address
50+
(+ <> (slot-value model 'parity))
51+
(truncate <> 2)
52+
(values <>)))
53+
54+
4155
(defun disassembly-model-update-current-address (model new-address)
4256
(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)))
4559
(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+
5271

5372
(define-override (disassembly-model column-count) (index)
5473
(declare (ignore index))
5574
4)
5675

5776
(define-override (disassembly-model row-count) (index)
5877
(declare (ignore index))
59-
(ceiling 4096 2))
78+
(+ parity (ceiling 4096 2)))
6079

6180

6281
(defun disassembly-index-valid-p (index)
@@ -66,7 +85,8 @@
6685
(defun get-disassembly-contents (model row col)
6786
(let ((data (-<> model
6887
(slot-value <> 'chip)
69-
(disassemble-address <> (* 2 row))
88+
(disassemble-address <> (- (* 2 row)
89+
(slot-value model 'parity)))
7090
(nth col <>))))
7191
(ecase col
7292
(0 (format nil "~3,'0X" data))
@@ -89,7 +109,8 @@
89109
((q+:qt.font-role) *font*)
90110

91111
((q+:qt.background-role)
92-
(if (= row (floor current-address 2))
112+
(if (= row (disassembly-model-address-to-row disassembly-model
113+
current-address))
93114
*current-instruction-brush*
94115
(q+:make-qvariant)))
95116

@@ -118,7 +139,7 @@
118139
(disassembly-model-update-current-address model address)
119140
(-<> address
120141
;; raw address -> row number
121-
(floor <> 2)
142+
(disassembly-model-address-to-row model <>)
122143
;; Give ourselves a bit of breathing room at the top of the table
123144
(- <> 4)
124145
(max <> 0)
@@ -127,7 +148,8 @@
127148
;; make the debugger show the current line
128149
(q+:scroll-to view <> (q+:qabstractitemview.position-at-top))))
129150

130-
(define-subwidget (debugger disassembly-table) (q+:make-qtableview debugger)
151+
(define-subwidget (debugger disassembly-table)
152+
(q+:make-qtableview debugger)
131153
(chip8::debugger-add-callback-arrived
132154
chip-debugger ; bit of a fustercluck here...
133155
(curry #'disassembly-update-address model-disassembly disassembly-table))
@@ -142,6 +164,14 @@
142164
(q+:set-resize-mode vheader (q+:qheaderview.fixed))
143165
(q+:set-default-section-size vheader 14)))
144166

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+
145175

146176
;;;; Register Viewer ----------------------------------------------------------
147177
;;;; Code
@@ -250,8 +280,7 @@
250280
(val (parse-hex value (registers-max-value row))))
251281
(when val
252282
(setf (registers-value chip row) val)
253-
(signal! registers-model (data-changed "QModelIndex" "QModelIndex")
254-
index index))
283+
(data-changed! registers-model index))
255284
t)
256285
nil))
257286

@@ -341,6 +370,7 @@
341370
(define-subwidget (debugger layout) (q+:make-qhboxlayout debugger)
342371
(let ((disassembly (q+:make-qvboxlayout)))
343372
(q+:add-widget disassembly disassembly-table)
373+
(q+:add-widget disassembly disassembly-parity-button)
344374
(q+:add-layout layout disassembly))
345375
(let ((values (q+:make-qvboxlayout)))
346376
(q+:set-fixed-width registers-table 90)

src/emulator.lisp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,14 @@
210210
:result-type 'string)))
211211

212212
(defun retrieve-instruction (array index)
213-
(chip8::cat-bytes (aref array index)
214-
;; ugly hack to handle odd-sized roms
215-
(if (< (1+ index) (length array))
216-
(aref array (1+ index))
217-
0)))
213+
(chip8::cat-bytes
214+
;; ugly hacks to handle odd parity
215+
(if (minusp index)
216+
0
217+
(aref array index))
218+
(if (< (1+ index) (length array))
219+
(aref array (1+ index))
220+
0)))
218221

219222
(defun instruction-information (array index)
220223
(let ((instruction (retrieve-instruction array index)))
@@ -708,10 +711,12 @@
708711

709712

710713
;;;; Main ---------------------------------------------------------------------
711-
(defun run (rom-filename)
714+
(defun run (rom-filename &key start-paused)
712715
(let ((chip (make-chip)))
713716
(setf *c* chip)
714717
(load-rom chip rom-filename)
718+
(when start-paused
719+
(debugger-pause (chip-debugger chip)))
715720
(chip8.gui::run-gui
716721
chip
717722
(lambda ()

0 commit comments

Comments
 (0)