1(import srfi-151)23;;;;4;; Utility procedures5;;;;67(define (get-elem unit value nth)8 (let ((mask (- (expt 2 unit) 1))9 (shamt (* -1 (* nth unit))))10 (bitwise-and (arithmetic-shift value shamt) mask)))1112(define (get-byte value nth) (get-elem 8 value nth))13(define (get-nibble value nth) (get-elem 4 value nth))1415(define (byte-swap u32)16 (bitwise-ior17 (arithmetic-shift (get-byte u32 0) 24)18 (arithmetic-shift (get-byte u32 1) 16)19 (arithmetic-shift (get-byte u32 2) 8)20 (get-byte u32 3)))2122(define (nibble-length number)23 (let* ((bit-length (integer-length number))24 (rem (modulo bit-length 4)))25 (/26 (if (zero? rem)27 bit-length28 (+ (- bit-length rem) 4)) ;; Round to next nibble boundary29 4)))3031(define (nibble-fold proc seed number)32 (define (recur n)33 (if (>= n (nibble-length number))34 seed35 (proc (get-nibble number n)36 (recur (+ n 1)))))3738 (if (zero? number)39 (proc 0 seed)40 (recur 0)))4142;;;;43;; Byte order conversion44;;;;4546(define (le->instr instr)47 instr)4849(define (be->instr instr)50 (byte-swap instr))5152(define (instr->le instr)53 instr)5455(define (instr->be instr)56 (byte-swap instr))5758;;;;59;; Output format conversion60;;;;6162(define (instr->bin instr)63 (define (bit->string bit)64 (if bit "1" "0"))6566 (if (negative? instr)67 (error "not a valid RISC-V instruction")68 (string-append "#b"69 (bitwise-fold (lambda (bit output)70 (string-append (bit->string bit) output)) "" instr))))7172(define (instr->hex instr)73 (define (nibble->string nibble)74 (vector-ref #(75 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f"76 ) nibble))7778 (if (negative? instr)79 (error "not a valid RISC-V instruction")80 (nibble-fold (lambda (nibble str)81 (string-append str (nibble->string nibble)))82 "#x" instr)))