177 lines
5.4 KiB
Common Lisp
177 lines
5.4 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; definition for method 0 of type state
|
|
(defmethod new state ((allocation symbol)
|
|
(type-to-make type)
|
|
(arg0 symbol)
|
|
(arg1 function)
|
|
(arg2 (function object))
|
|
(arg3 function)
|
|
(arg4 (function object))
|
|
(arg5 (function process int symbol event-message-block object))
|
|
)
|
|
(let ((v0-0 (object-new allocation type-to-make (the-as int (-> type-to-make size)))))
|
|
(set! (-> v0-0 name) arg0)
|
|
(set! (-> v0-0 next) #f)
|
|
(set! (-> v0-0 exit) arg4)
|
|
(set! (-> v0-0 code) arg1)
|
|
(set! (-> v0-0 trans) arg2)
|
|
(set! (-> v0-0 post) #f)
|
|
(set! (-> v0-0 enter) arg3)
|
|
(set! (-> v0-0 event) arg5)
|
|
v0-0
|
|
)
|
|
)
|
|
|
|
;; definition for function inherit-state
|
|
(defun inherit-state ((arg0 state) (arg1 state))
|
|
(set! (-> arg0 exit) (-> arg1 exit))
|
|
(set! (-> arg0 code) (-> arg1 code))
|
|
(set! (-> arg0 trans) (-> arg1 trans))
|
|
(set! (-> arg0 post) (-> arg1 post))
|
|
(set! (-> arg0 enter) (-> arg1 enter))
|
|
(set! (-> arg0 event) (-> arg1 event))
|
|
arg0
|
|
)
|
|
|
|
;; definition for method 2 of type state
|
|
(defmethod print ((this state))
|
|
(format #t "#<~A ~A @ #x~X>" (-> this type) (-> this name) this)
|
|
this
|
|
)
|
|
|
|
;; definition for function enter-state
|
|
;; ERROR: Unsupported inline assembly instruction kind - [lwu sp, 28(v1)]
|
|
;; ERROR: Unsupported inline assembly instruction kind - [lw ra, return-from-thread-dead(s7)]
|
|
;; ERROR: Unsupported inline assembly instruction kind - [jr t9]
|
|
;; ERROR: Unsupported inline assembly instruction kind - [sw v1, 0(sp)]
|
|
(defun enter-state ((arg0 object) (arg1 object) (arg2 object) (arg3 object) (arg4 object) (arg5 object))
|
|
(local-vars (s7-0 none) (sp-0 int) (ra-0 int))
|
|
(with-pp
|
|
(logclear! (-> pp mask) (process-mask sleep sleep-code))
|
|
(logior! (-> pp mask) (process-mask going))
|
|
(cond
|
|
((= (-> pp status) 'initialize)
|
|
(set! (-> pp trans-hook) #f)
|
|
(set-to-run (-> pp main-thread) enter-state arg0 arg1 arg2 arg3 arg4 arg5)
|
|
(set! (-> pp status) 'initialize-go)
|
|
(throw 'initialize #t)
|
|
#t
|
|
)
|
|
((!= (-> *kernel-context* current-process) pp)
|
|
(let ((s0-0 (-> pp status)))
|
|
(set! (-> pp trans-hook) #f)
|
|
(set-to-run (-> pp main-thread) enter-state arg0 arg1 arg2 arg3 arg4 arg5)
|
|
(set! (-> pp status) s0-0)
|
|
)
|
|
#t
|
|
)
|
|
((= (-> pp main-thread) (-> pp top-thread))
|
|
(set! (-> pp state) (-> pp next-state))
|
|
(let ((s0-1 (-> pp stack-frame-top)))
|
|
(while s0-1
|
|
(case (-> s0-1 type)
|
|
((protect-frame state)
|
|
((-> (the-as protect-frame s0-1) exit))
|
|
)
|
|
)
|
|
(set! s0-1 (-> s0-1 next))
|
|
)
|
|
)
|
|
(logclear! (-> pp mask) (process-mask going))
|
|
(let ((s0-2 (-> pp state)))
|
|
(set! (-> pp event-hook) (-> s0-2 event))
|
|
(if (-> s0-2 exit)
|
|
(set! (-> pp stack-frame-top) s0-2)
|
|
(set! (-> pp stack-frame-top) #f)
|
|
)
|
|
(set! (-> pp post-hook) (-> s0-2 post))
|
|
(set! (-> pp trans-hook) (-> s0-2 trans))
|
|
(let ((t9-4 (-> s0-2 enter)))
|
|
(if t9-4
|
|
((the-as (function object object object object object object none) t9-4) arg0 arg1 arg2 arg3 arg4 arg5)
|
|
)
|
|
)
|
|
(let ((t9-5 (-> s0-2 trans)))
|
|
(if t9-5
|
|
(t9-5)
|
|
)
|
|
)
|
|
(let ((v1-28 (-> pp main-thread)))
|
|
(.lwu sp-0 28 v1-28)
|
|
)
|
|
(let ((t9-6 (-> s0-2 code)))
|
|
(.lw ra-0 return-from-thread-dead s7-0)
|
|
(.jr t9-6)
|
|
)
|
|
)
|
|
arg4
|
|
)
|
|
(else
|
|
(set! (-> pp trans-hook) #f)
|
|
(set-to-run (-> pp main-thread) enter-state arg0 arg1 arg2 arg3 arg4 arg5)
|
|
(when (!= (-> pp top-thread name) 'post)
|
|
(let ((v1-31 return-from-thread))
|
|
(.sw v1-31 0 (the-as none sp-0))
|
|
)
|
|
)
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(kmemopen global "event-queue")
|
|
|
|
;; failed to figure out what this is:
|
|
(let ((v1-3 (new 'global 'event-message-block-array 64)))
|
|
(set! (-> v1-3 length) 0)
|
|
(set! *event-queue* v1-3)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(kmemclose)
|
|
|
|
;; definition for function send-event-function
|
|
(defun send-event-function ((arg0 process-tree) (arg1 event-message-block))
|
|
(with-pp
|
|
(when (and arg0 (!= (-> arg0 type) process-tree) (-> (the-as process arg0) event-hook) (-> arg1 from))
|
|
(let ((gp-0 pp))
|
|
(set! pp (the-as process arg0))
|
|
(let ((v0-0 ((-> (the-as process arg0) event-hook) (-> arg1 from 0) (-> arg1 num-params) (-> arg1 message) arg1)))
|
|
(set! pp gp-0)
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for method 9 of type event-message-block-array
|
|
;; WARN: Return type mismatch int vs none.
|
|
(defmethod send-all! ((this event-message-block-array))
|
|
(dotimes (s5-0 (-> this length))
|
|
(let* ((a1-0 (-> this data s5-0))
|
|
(a0-2 (handle->process (-> a1-0 to-handle)))
|
|
)
|
|
(if (and a0-2 (handle->process (-> a1-0 form-handle)))
|
|
(send-event-function a0-2 a1-0)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> this length) 0)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for function looping-code
|
|
;; WARN: new jak 2 until loop case, check carefully
|
|
(defun looping-code ()
|
|
(until #f
|
|
(suspend)
|
|
)
|
|
#f
|
|
)
|