From 24317fc8608ee433ac34573a111ac1b921b815f5 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Thu, 26 May 2016 23:39:50 -0700 Subject: [PATCH] chip8 --- beautiful-racket/br/demo/chip8.rkt | 51 ++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/beautiful-racket/br/demo/chip8.rkt b/beautiful-racket/br/demo/chip8.rkt index 4ea33f3..ba92a96 100644 --- a/beautiful-racket/br/demo/chip8.rkt +++ b/beautiful-racket/br/demo/chip8.rkt @@ -3,7 +3,7 @@ ; http://devernay.free.fr/hacks/chip8/C8TECH10.HTM ; http://mattmik.com/files/chip8/mastering/chip8.html -(define (explode-bytes val) +(define (split-bytes val) (cond [(zero? val) (list 0)] [else @@ -17,21 +17,21 @@ (module+ test (require rackunit) - (check-equal? (explode-bytes #x2B45) (list #x2 #xB #x4 #x5)) - (check-equal? (explode-bytes #xCD) (list #xC #xD)) - (check-equal? (explode-bytes #xA) (list #xA)) - (check-equal? (explode-bytes #x0) (list #x0))) + (check-equal? (split-bytes #x2B45) (list #x2 #xB #x4 #x5)) + (check-equal? (split-bytes #xCD) (list #xC #xD)) + (check-equal? (split-bytes #xA) (list #xA)) + (check-equal? (split-bytes #x0) (list #x0))) -(define (glue-bytes bytes) +(define (join-bytes bytes) (for/sum ([b (in-list (reverse bytes))] [i (in-naturals)]) (* b (expt 16 i)))) (module+ test - (check-equal? #x2B45 (glue-bytes (list #x2 #xB #x4 #x5))) - (check-equal? #xCD (glue-bytes (list #xC #xD))) - (check-equal? #xA (glue-bytes (list #xA))) - (check-equal? #x0 (glue-bytes (list #x0)))) + (check-equal? #x2B45 (join-bytes (list #x2 #xB #x4 #x5))) + (check-equal? #xCD (join-bytes (list #xC #xD))) + (check-equal? #xA (join-bytes (list #xA))) + (check-equal? #x0 (join-bytes (list #x0)))) (define-macro (define-memory-vector ID [FIELD LENGTH SIZE] ...) (with-pattern @@ -50,7 +50,7 @@ (define (PREFIXED-ID-REF idx) (unless (< idx LENGTH) (raise-argument-error 'PREFIXED-ID-REF (format "index less than field length ~a" LENGTH) idx)) - (glue-bytes + (join-bytes (for/list ([i (in-range SIZE)]) (vector-ref ID (+ FIELD-OFFSET i idx))))) ... @@ -60,19 +60,38 @@ (unless (< val (expt 16 SIZE)) (raise-argument-error 'PREFIXED-ID-SET! (format "value less than field size ~a" (expt 16 SIZE)) val)) (for ([i (in-range SIZE)] - [b (in-list (explode-bytes val))]) + [b (in-list (split-bytes val))]) (vector-set! ID (+ FIELD-OFFSET i idx) b))) ...))) -(define-memory-vector chip +(define-memory-vector chip8 [opcode 1 2] ; two bytes [memory 4096 1] ; one byte per [V 16 1] ; one byte per - [I 3 1] ; index register, 0x000 to 0xFFF - [pc 3 1] ; program counter, 0x000 to 0xFFF + [I 2 1] ; index register, 0x000 to 0xFFF (1.5 bytes) + [pc 2 1] ; program counter, 0x000 to 0xFFF (1.5 bytes) [gfx (* 64 32) 1] ; pixels [delay_timer 1 1] [sound_timer 1 1] [stack 16 2] ; 2 bytes each - [sp 1 1] ; stack pointer + [sp 1 2] ; stack pointer [key 16 1]) ; keys +;; Set up render system and register input callbacks +;(setup-graphics chip8) +;(setup-input chip8) + +;; Initialize the Chip8 system and load the game into the memory +;(initialize chip8) +;(load-game chip8 "pong") + +;; Emulation loop +#;(let loop () + ;; Emulate one cycle + (emulate-cycle chip8) + ;; If the draw flag is set, update the screen + (when (draw-flag? chip8) + (draw-graphics chip8)) + + ;; Store key press state (Press and Release) + (set-keys chip8) + (loop)) \ No newline at end of file