57 lines
1.6 KiB
Common Lisp
57 lines
1.6 KiB
Common Lisp
;;Note that by using the 'CFFI' library, one can apply this procedure portably in any lisp implementation;
|
|
;; in this code however I chose to demonstrate only the implementation-dependent programs.
|
|
|
|
;;CCL
|
|
;; Allocate a memory pointer and poke the opcode into it
|
|
(defparameter ptr (ccl::malloc 9))
|
|
|
|
(loop for i in '(139 68 36 4 3 68 36 8 195)
|
|
for j from 0 do
|
|
(setf (ccl::%get-unsigned-byte ptr j) i))
|
|
|
|
;; Execute with the required arguments and return the result as an unsigned-byte
|
|
(ccl::ff-call ptr :UNSIGNED-BYTE 7 :UNSIGNED-BYTE 12 :UNSIGNED-BYTE)
|
|
|
|
;; Output = 19
|
|
|
|
;; Free the pointer
|
|
(ccl::free ptr)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;SBCL
|
|
(defparameter mmap (list 139 68 36 4 3 68 36 8 195))
|
|
|
|
(defparameter pointer (sb-alien:make-alien sb-alien:unsigned-char (length mmap)))
|
|
|
|
(defparameter callp (loop for byte in mmap
|
|
for i from 0
|
|
do
|
|
(setf (sb-alien:deref pointer i) byte)
|
|
finally
|
|
(return (sb-alien:cast pointer (function integer integer integer)))))
|
|
|
|
(sb-alien:alien-funcall callp 7 12)
|
|
|
|
(loop for i from 0 below 18 collect (sb-alien:deref ptr i))
|
|
|
|
(sb-alien:free-alien pointer)
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;CLISP
|
|
(defparameter mmap (list 139 68 36 4 3 68 36 8 195))
|
|
|
|
(defparameter POINTER (FFI:FOREIGN-ADDRESS (FFI:FOREIGN-ALLOCATE 'FFI:UINT8 :COUNT 9)))
|
|
|
|
(loop for i in mmap
|
|
for j from 0 do
|
|
(FUNCALL #'(SETF FFI:MEMORY-AS) i POINTER 'FFI:INT j))
|
|
|
|
(FUNCALL
|
|
(FFI:FOREIGN-FUNCTION POINTER
|
|
(LOAD-TIME-VALUE
|
|
(FFI:PARSE-C-TYPE
|
|
'(FFI:C-FUNCTION (:ARGUMENTS 'FFI:INT 'FFI:INT) (:RETURN-TYPE FFI:INT) (:LANGUAGE :STDC)))))
|
|
7 12)
|
|
|
|
(FFI:FOREIGN-FREE POINTER)
|