#!/usr/bin/env scheme-script


;;; This is a debugging tool for developing the 64-bit
;;; ikarus.  It only works on Mac OS.

(import (ikarus))

(define stub1
  '(#xcf #xfa #xed #xfe #x07 #x00 #x00 #x01
    #x03 #x00 #x00 #x00 #x01 #x00 #x00 #x00
    #x01 #x00 #x00 #x00 #x98 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x19 #x00 #x00 #x00 #x98 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x08 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #xb8 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x08 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x07 #x00 #x00 #x00 #x07 #x00 #x00 #x00
    #x01 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x5f #x5f #x74 #x65 #x78 #x74 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x5f #x5f #x54 #x45 #x58 #x54 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    ))

(define stub2
  '(#x08 #x00 #x00 #x00 #x00 #x00 #x00 #x00))

(define (mkstub2 len)
  (bytevector->u8-list 
    (let ([v (make-bytevector 8)])
      (bytevector-u64-set! v 0 len 'little)
      v)))

(define stub3
  '(#xb8 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    #x00 #x04 #x00 #x80 #x00 #x00 #x00 #x00
    #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00
    ))

(define (gen ls)
  (let ([p (open-file-output-port "tmp.o" (file-options no-fail))])
    (for-each 
      (lambda (b) 
        (put-u8 p b))
      (append stub1 (mkstub2 (length ls)) stub3 ls))
    (close-output-port p))
  (system "otool64 -tv tmp.o"))

(printf "Trying a simple sequence ...\n")

(gen '(#x48 #xc7 #xc3 #x50 #x01 #x00 #x00 #xc3))

(printf "That should've printed the following: \n\
         tmp.o: \n\
         (__TEXT,__text) section\n\
         0000000000000000        movq    $0x00000150,%rbx\n\
         0000000000000007        ret\n\n\
         OK, now you can enter byte sequences like\n\
         \x20;  (72 199 195 80 1 0 0 195)\n\n")

(new-cafe gen)