CHIP-8 in Common Lisp
stevelosh.com
stevelosh.com
https://github.com/flambard/chip-8-dynarec
Perhaps my project will be completed after all.. :-)
(defun-inline (setf vref) (new-value chip x y)
(setf (aref (chip-video chip) (+ (* +screen-width+ y) x))
new-value))Normally function must be accessed trough the symbol and it can be redefined on the fly.
I would also think that lexical functions are not called via symbols...
(defun-inline set-vref (new-value chip x y)
...)
And how would you actually call the original function to set a pixel? (I'm not very familiar with inlines, maybe that's my problem here.)In this case you would use
(setf (vref chip x y) new-value)
to call the function (just like with AREF above). Using SETF has the advantage that you can define "modify macros" that read and write a place. For example, (incf (vref chip x y) delta)
would increment the place by DELTA. Or (rotatef (vref chip x1 y1)
(vref chip x2 y2))
would swap two pixels. (declaim (inline (setf vref)))
(defun (setf vref) (new-value chip x y)
(setf (aref (chip-video chip) (+ (* +screen-width+ y) x))
new-value)) (defun foo (chip y)
(declare (optimize speed)
(type chip chip)
(type int16 y))
(vref chip 0 y))
(disassemble 'foo)
; disassembly for FOO
; Size: 48 bytes. Origin: #x100EF5E39D
; 9D: 488B423D MOV RAX, [RDX+61] ; no-arg-parsing entry point
;; ---------------------- Look ma, no multiplication!
;; vvvvvvvvvvv
; A1: 48C1E706 SHL RDI, 6
; A5: B900100000 MOV ECX, 4096
; AA: 40F6C701 TEST DIL, 1
; AE: 7513 JNE L0
; B0: 4839F9 CMP RCX, RDI
; B3: 760E JBE L0
; B5: 488B54B801 MOV RDX, [RAX+RDI*4+1]
; BA: 488BE5 MOV RSP, RBP
; BD: F8 CLC
; BE: 5D POP RBP
; BF: C3 RET
; C0: 0F0B10 BREAK 16 ; Invalid argument count trap
; C3: L0: 0F0B0A BREAK 10 ; error trap
; C6: 06 BYTE #X06
; C7: 0C BYTE #X0C ; INVALID-ARRAY-INDEX-ERROR
; C8: 1B BYTE #X1B ; RAX
; C9: 9A BYTE #X9A ; RCX
; CA: FE9A03 BYTE #XFE, #X9A, #X03 ; RDIIt's a rare treat to see low level programming in Common Lisp!!
+100 for Steve Losh!
https://github.com/kingcons/cl-6502/blob/master/README.md
And the corresponding book
If I understand correctly, that's because 0-1FF was ROM (including the interpreter itself) on the original machine, and you typed CHIP-8 programs into RAM.
I still use (Neo)Vim, using VLIME for Common Lisp interaction: https://github.com/l04m33/vlime It works great.