Fix the stupid tetris input bug
Apparently ADD Reg, Imm doesn't set the carry flag like all the
other ADD/SUB instructions.
    
        | author | Steve Losh <steve@stevelosh.com> | 
    
        | date | Thu, 15 Dec 2016 19:45:03 -0500 | 
    
    
        | parents | 92440a7b350b | 
    
        | children | 2dd99e07f368 | 
    
        | branches/tags | (none) | 
    
        | files | src/emulator.lisp | 
Changes
    
--- a/src/emulator.lisp	Thu Dec 15 19:44:28 2016 -0500
+++ b/src/emulator.lisp	Thu Dec 15 19:45:03 2016 -0500
@@ -2,6 +2,7 @@
 
 (setf *print-length* 16)
 (setf *print-base* 10)
+
 (declaim (optimize (speed 1) (safety 3) (debug 3)))
 (declaim (optimize (speed 3) (safety 1) (debug 3)))
 
@@ -13,7 +14,7 @@
 
 
 ;;;; Constants ----------------------------------------------------------------
-(defconstant +cycles-per-second+ 500)
+(defconstant +cycles-per-second+ 1000)
 (defconstant +cycles-before-sleep+ 10)
 (defconstant +screen-width+ 64)
 (defconstant +screen-height+ 32)
@@ -445,10 +446,13 @@
 (define-opcode op-ret ()                                ;; RET
   (setf program-counter (vector-pop stack)))
 
+(define-opcode op-add-reg<imm (_ r (immediate 2))       ;; ADD Vx, Imm
+  ;; For some weird reason the ADD immediate op doesn't set the flag
+  (zapf (register r) (+_8 % immediate)))
+
 (macro-map                                              ;; ADD/SUB (8-bit)
   ((name op source-arg source-expr)
-   ((op-add-reg<imm +_8 (immediate 2) immediate)
-    (op-add-reg<reg +_8 (ry 1) (register ry))
+   ((op-add-reg<reg +_8 (ry 1) (register ry))
     (op-sub-reg<reg -_8 (ry 1) (register ry))))
   `(define-opcode ,name (_ rx ,source-arg)
     (multiple-value-bind (result carry)
@@ -737,3 +741,5 @@
         (bt:make-thread (curry #'run-cpu chip))
         (bt:make-thread (curry #'run-timers chip))
         (bt:make-thread (curry #'run-sound chip))))))
+
+; (run "roms/blitz.rom")