lr35902ish racket
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.1KB

  1. #lang racket
  2. (require (for-syntax syntax/parse))
  3. ;-----------------------
  4. ; Memory Data Structure
  5. ;-----------------------
  6. ; Methods for accessing a 16 bit addressing memory
  7. ; including support for banking (planned) and
  8. ; access controls for ROM (planned)
  9. ;-----------------------
  10. ; Needs:
  11. ; Banking
  12. ; Routes based on memory location
  13. ; Banking based on memory
  14. ; Registers:
  15. ; Fast access
  16. ; Hash?
  17. ;
  18. (struct memory
  19. (registers state banks)
  20. #:transparent)
  21. (define (make-memory)
  22. (memory (make-regvec) (make-statevec) (make-bank)))
  23. (define (make-regvec)
  24. (make-vector 8))
  25. (define (make-statevec)
  26. (make-vector 2))
  27. (define (make-bank [init 0])
  28. (make-vector (expt 2 16)))
  29. (define (deref-state sym)
  30. (case sym
  31. [(state-PC) 0]
  32. [(state-SP) 1]
  33. [else (error "invalid state:" sym)]))
  34. (define (deref-reg sym)
  35. (case sym
  36. [(reg-A) 0]
  37. [(reg-F) 1]
  38. [(reg-B) 2]
  39. [(reg-C) 3]
  40. [(reg-D) 4]
  41. [(reg-E) 5]
  42. [(reg-H) 6]
  43. [(reg-L) 7]
  44. [else (error "invalid register:" sym)]))
  45. (define (get-reg sym memory)
  46. (vector-ref (memory-registers memory) (deref-reg sym)))
  47. (define (get-state sym memory)
  48. (vector-ref (memory-state memory) (deref-state sym)))
  49. (define (get-byte addr bank memory)
  50. (if (and (>= addr 0)
  51. (< addr 65536))
  52. (vector-ref (memory-banks memory) addr)
  53. (error (format "ERROR: address ~a out of bounds" addr))))
  54. (define (set-reg! sym memory val)
  55. (vector-set! (memory-registers memory) (deref-reg sym) (mod-8bit val)))
  56. (define (set-state! sym memory val)
  57. (vector-set! (memory-state memory) (deref-state sym) (mod-16bit val)))
  58. (define (set-byte! addr bank memory val)
  59. (if (and (>= addr 0)
  60. (< addr 65536))
  61. (vector-set! (memory-banks memory) addr (mod-8bit val))
  62. (error (format "ERROR: address ~a out of bounds" addr))))
  63. ;----------------------------
  64. ; define-8bit & define-16bit
  65. ;----------------------------
  66. ; composes operations with a modulo in order
  67. ; to keep numbers within 8 bits
  68. ;----------------------------
  69. (define (mod-8bit x)
  70. (modulo x 256))
  71. (define (mod-16bit x)
  72. (modulo x 65536))
  73. (provide (all-defined-out))