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.

159 lines
4.6KB

  1. #lang racket
  2. (struct mem
  3. (regs pc sp flags bank))
  4. (define (make-mem)
  5. (mem (make-regs)
  6. 0
  7. 0
  8. 0
  9. (make-bank)))
  10. (define (make-regs)
  11. (make-vector 8 0))
  12. (define (get-reg x mem)
  13. (if (and (< x 8) (>= x 0))
  14. (let ([regs (mem-regs mem)])
  15. (if (not (= x 6))
  16. (vector-ref regs x)
  17. (let([bank (mem-bank mem)]
  18. [h (vector-ref regs 4)]
  19. [l (vector-ref regs 5)])
  20. (vector-ref bank (make-16b-addr h l)))))
  21. (error "unknown register index")))
  22. (define (set-reg x val m)
  23. (if (and (< x 8) (>= x 0))
  24. (let ([regs (mem-regs m)])
  25. (if (not (= x 6))
  26. (let ([newregs (vector-copy regs)])
  27. (vector-set! newregs x (mod-8bit val))
  28. (struct-copy mem m [regs newregs]))
  29. (let ([newbank (vector-copy (mem-bank m))]
  30. [h (vector-ref regs 4)]
  31. [l (vector-ref regs 5)])
  32. (vector-set! newbank (make-16b-addr h l) (mod-8bit val))
  33. (struct-copy mem m [bank newbank]))))
  34. (error "unknown register index")))
  35. (define (make-bank)
  36. (make-vector 65536 #x00))
  37. (define (mod-8bit val)
  38. (modulo val 256))
  39. (define (mod-16bit val)
  40. (modulo val 65536))
  41. (define (set-pc addr m)
  42. (begin
  43. (struct-copy mem m [pc (mod-16bit addr)])))
  44. (define (get-byte addr m)
  45. (let ([b (mem-bank m)])
  46. (if (and (>= addr 0)
  47. (< addr (vector-length b)))
  48. (vector-ref b addr)
  49. (error (format "address ~a out of bounds" addr)))))
  50. (define (set-byte addr val m)
  51. (let ([b (mem-bank m)])
  52. (if (and (>= addr 0)
  53. (< addr (vector-length b)))
  54. (let ([newbank (vector-copy b)])
  55. (vector-set! newbank addr (mod-8bit val))
  56. (struct-copy mem m [bank newbank]))
  57. (error (format "address ~a out of bounds" addr)))))
  58. (define (set-bytes addr bs m)
  59. (if (null? bs)
  60. m
  61. (set-bytes (mod-16bit (add1 addr))
  62. (cdr bs)
  63. (set-byte addr (car bs) m))))
  64. (define (inc-sp m)
  65. (struct-copy mem m [sp (add1 (mem-sp m))]))
  66. (define (inc-pc m)
  67. (struct-copy mem m [pc (add1 (mem-pc m))]))
  68. (define (make-16b-addr x y)
  69. (bitwise-ior y (arithmetic-shift x 8)))
  70. (define (8b-ld-reg-imm reg imm)
  71. (lambda (m)
  72. (set-reg reg imm m)))
  73. (define (8b-ld-reg-reg dst src)
  74. (lambda (m)
  75. (set-reg dst
  76. (get-reg src m)
  77. m)))
  78. (define (display-byte-hex v)
  79. (~a #:align 'right #:left-pad-string "0" #:width 2
  80. (format "~x" v)))
  81. (define (display-word-hex v)
  82. (~a #:align 'right #:left-pad-string "0" #:width 4
  83. (format "~x" v)))
  84. (define (display-bin v)
  85. (~a #:left-pad-string "0" #:width 8 #:align 'right
  86. (format "~b" v)))
  87. (define (print-regs m)
  88. (letrec ([regs (mem-regs m)]
  89. [F (display-byte-hex (mem-flags m))]
  90. [B (display-byte-hex (vector-ref regs 0))]
  91. [C (display-byte-hex (vector-ref regs 1))]
  92. [D (display-byte-hex (vector-ref regs 2))]
  93. [E (display-byte-hex (vector-ref regs 3))]
  94. [h (vector-ref regs 4)]
  95. [l (vector-ref regs 5)]
  96. [H (display-byte-hex (vector-ref regs 4))]
  97. [L (display-byte-hex (vector-ref regs 5))]
  98. [HL-ind (display-byte-hex (get-byte (make-16b-addr h l) m))]
  99. [A (display-byte-hex (vector-ref regs 7))])
  100. (displayln (format "BC: $~a~a, DE: $~a~a" B C D E))
  101. (displayln (format "HL: $~a~a, AF: $~a~a" H L A F))
  102. (displayln (format "(HL): $~a" HL-ind))
  103. (void)))
  104. (define (print-state m)
  105. (displayln (format "PC: $~a, SP: $~a, Flags: %~a"
  106. (display-byte-hex (mem-pc m))
  107. (display-byte-hex (mem-sp m))
  108. (display-bin(mem-flags m)))))
  109. (define (print-part-bank start count m)
  110. (define (print-mem v)
  111. (display (format " $~a" (display-byte-hex v))))
  112. (let ([s (display-word-hex start)]
  113. [e (display-word-hex (mod-16bit (+ start count)))])
  114. (display (format "$~a >" s))
  115. (let ([splice (vector-take
  116. (vector-drop (mem-bank m) start)
  117. count)])
  118. (vector-map print-mem splice))
  119. (display (format " < $~a\n" e) ))
  120. (void))
  121. (define (run-lines ls)
  122. (define (run-line-help ls m)
  123. (if (null? ls)
  124. m
  125. (run-line-help (cdr ls)
  126. ((car ls) (inc-pc m)))))
  127. (let ([fin (run-line-help ls (make-mem))])
  128. (begin
  129. (print-state fin)
  130. (print-regs fin)
  131. (print-part-bank #x150 16 fin))))
  132. (provide (all-defined-out))