mirror of
https://github.com/open-goal/jak-project
synced 2026-05-24 23:22:14 -04:00
c9fc4f0bf9
* first draft eye renderer * working * working
2764 lines
106 KiB
Common Lisp
Vendored
Generated
2764 lines
106 KiB
Common Lisp
Vendored
Generated
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; definition for method 2 of type texture-page
|
|
(defmethod print texture-page ((obj texture-page))
|
|
(format
|
|
#t
|
|
"#<texture-page ~S :length ~D :dest #x~X :size ~DK @ #x~X>"
|
|
(-> obj name)
|
|
(-> obj length)
|
|
(shr (-> obj segment 0 dest) 6)
|
|
(shr (-> obj size) 8)
|
|
obj
|
|
)
|
|
obj
|
|
)
|
|
|
|
;; definition for method 4 of type texture-page
|
|
(defmethod length texture-page ((obj texture-page))
|
|
(-> obj length)
|
|
)
|
|
|
|
;; definition for method 5 of type texture-page
|
|
;; INFO: Return type mismatch uint vs int.
|
|
(defmethod asize-of texture-page ((obj texture-page))
|
|
(the-as int (+ (-> obj type size) (* (-> obj length) 4)))
|
|
)
|
|
|
|
;; definition for method 8 of type texture-page
|
|
(defmethod mem-usage texture-page ((obj texture-page) (arg0 memory-usage-block) (arg1 int))
|
|
(set! (-> arg0 length) (max 80 (-> arg0 length)))
|
|
(set! (-> arg0 data 79 name) "texture")
|
|
(+! (-> arg0 data 79 count) (-> obj length))
|
|
(let ((v1-7 (- (asize-of obj) (the-as int (* (-> obj size) 4)))))
|
|
(dotimes (a0-6 (-> obj length))
|
|
(if (-> obj data a0-6)
|
|
(+! v1-7 64)
|
|
)
|
|
)
|
|
(+! (-> arg0 data 79 used) v1-7)
|
|
(+! (-> arg0 data 79 total) (logand -16 (+ v1-7 15)))
|
|
)
|
|
obj
|
|
)
|
|
|
|
;; definition for function texture-bpp
|
|
(defun texture-bpp ((arg0 gs-psm))
|
|
(case arg0
|
|
(((gs-psm mt8))
|
|
8
|
|
)
|
|
(((gs-psm mt4))
|
|
4
|
|
)
|
|
(((gs-psm ct16) (gs-psm ct16s) (gs-psm mz16) (gs-psm mz16s))
|
|
16
|
|
)
|
|
(else
|
|
32
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function texture-qwc
|
|
(defun texture-qwc ((w int) (h int) (tex-format gs-psm))
|
|
(let ((v1-0 (texture-bpp tex-format)))
|
|
(/ (+ (* (* w h) v1-0) 127) 128)
|
|
)
|
|
)
|
|
|
|
;; definition for function physical-address
|
|
(defun physical-address ((arg0 pointer))
|
|
(logand #xfffffff arg0)
|
|
)
|
|
|
|
;; definition for function dma-buffer-add-ref-texture
|
|
;; INFO: Return type mismatch symbol vs none.
|
|
(defun dma-buffer-add-ref-texture ((buf dma-buffer) (data pointer) (tex-w int) (tex-h int) (tex-format gs-psm))
|
|
(let ((data-ptr (physical-address data))
|
|
(qwc (texture-qwc tex-w tex-h tex-format))
|
|
)
|
|
(while (> qwc 0)
|
|
(let ((qwc-this-time (min #x7fff qwc)))
|
|
(let ((eop (if (= qwc qwc-this-time)
|
|
1
|
|
0
|
|
)
|
|
)
|
|
)
|
|
(let* ((a2-2 buf)
|
|
(setup-dma (the-as dma-packet (-> a2-2 base)))
|
|
)
|
|
(set! (-> setup-dma dma) (new 'static 'dma-tag :qwc #x1 :id (dma-tag-id cnt)))
|
|
(set! (-> setup-dma vif0) (new 'static 'vif-tag))
|
|
(set! (-> setup-dma vif1) (new 'static 'vif-tag :imm #x1 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> a2-2 base) (&+ (the-as pointer setup-dma) 16))
|
|
)
|
|
(let* ((a2-3 buf)
|
|
(setup-dif (the-as gs-gif-tag (-> a2-3 base)))
|
|
)
|
|
(set! (-> setup-dif tag) (new 'static 'gif-tag64 :flg (gif-flag image) :eop eop :nloop qwc-this-time))
|
|
(set! (-> setup-dif regs) (new 'static 'gif-tag-regs))
|
|
(set! (-> a2-3 base) (&+ (the-as pointer setup-dif) 16))
|
|
)
|
|
)
|
|
(let* ((a1-9 buf)
|
|
(data-dma (the-as dma-packet (-> a1-9 base)))
|
|
)
|
|
(set! (-> data-dma dma)
|
|
(new 'static 'dma-tag :id (dma-tag-id ref) :addr (the-as int data-ptr) :qwc qwc-this-time)
|
|
)
|
|
(set! (-> data-dma vif0) (new 'static 'vif-tag))
|
|
(set! (-> data-dma vif1) (new 'static 'vif-tag :cmd (vif-cmd direct) :msk #x1 :imm qwc-this-time))
|
|
(set! (-> a1-9 base) (&+ (the-as pointer data-dma) 16))
|
|
)
|
|
(&+! data-ptr (* qwc-this-time 16))
|
|
(set! qwc (- qwc qwc-this-time))
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 2 of type texture
|
|
(defmethod print texture ((obj texture))
|
|
(format
|
|
#t
|
|
"#<texture ~20S psm: ~6S ~4D x ~4D num-mips: ~D :size ~4DK "
|
|
(-> obj name)
|
|
(psm->string (-> obj psm))
|
|
(-> obj w)
|
|
(-> obj h)
|
|
(-> obj num-mips)
|
|
(shr (-> obj size) 8)
|
|
)
|
|
(dotimes (s5-1 (the-as int (-> obj num-mips)))
|
|
(format #t " #x~X/~X" (-> obj dest s5-1) (-> obj width s5-1))
|
|
)
|
|
(if (< (texture-bpp (-> obj psm)) 16)
|
|
(format #t " :clut #x~X/1" (-> obj clutdest))
|
|
)
|
|
(format #t " @ #x~X>" obj)
|
|
obj
|
|
)
|
|
|
|
;; definition for symbol ct32-24-block-table, type (array int32)
|
|
(define ct32-24-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
0
|
|
1
|
|
4
|
|
5
|
|
16
|
|
17
|
|
20
|
|
21
|
|
2
|
|
3
|
|
6
|
|
7
|
|
18
|
|
19
|
|
22
|
|
23
|
|
8
|
|
9
|
|
12
|
|
13
|
|
24
|
|
25
|
|
28
|
|
29
|
|
10
|
|
11
|
|
14
|
|
15
|
|
26
|
|
27
|
|
30
|
|
31
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol mz32-24-block-table, type (array int32)
|
|
(define mz32-24-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
16
|
|
17
|
|
20
|
|
21
|
|
0
|
|
1
|
|
4
|
|
5
|
|
18
|
|
19
|
|
22
|
|
23
|
|
2
|
|
3
|
|
6
|
|
7
|
|
24
|
|
25
|
|
28
|
|
29
|
|
8
|
|
9
|
|
12
|
|
13
|
|
26
|
|
27
|
|
30
|
|
31
|
|
10
|
|
11
|
|
14
|
|
15
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol ct16-block-table, type (array int32)
|
|
(define ct16-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
0
|
|
2
|
|
8
|
|
10
|
|
1
|
|
3
|
|
9
|
|
11
|
|
4
|
|
6
|
|
12
|
|
14
|
|
5
|
|
7
|
|
13
|
|
15
|
|
16
|
|
18
|
|
24
|
|
26
|
|
17
|
|
19
|
|
25
|
|
27
|
|
20
|
|
22
|
|
28
|
|
30
|
|
21
|
|
23
|
|
29
|
|
31
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol ct16s-block-table, type (array int32)
|
|
(define ct16s-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
0
|
|
2
|
|
16
|
|
18
|
|
1
|
|
3
|
|
17
|
|
19
|
|
8
|
|
10
|
|
24
|
|
26
|
|
9
|
|
11
|
|
25
|
|
27
|
|
4
|
|
6
|
|
20
|
|
22
|
|
5
|
|
7
|
|
21
|
|
23
|
|
12
|
|
14
|
|
28
|
|
30
|
|
13
|
|
15
|
|
29
|
|
31
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol mz16-block-table, type (array int32)
|
|
(define mz16-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
16
|
|
18
|
|
24
|
|
26
|
|
17
|
|
19
|
|
25
|
|
27
|
|
20
|
|
22
|
|
28
|
|
30
|
|
21
|
|
23
|
|
29
|
|
31
|
|
0
|
|
2
|
|
8
|
|
10
|
|
1
|
|
3
|
|
9
|
|
11
|
|
4
|
|
6
|
|
12
|
|
14
|
|
5
|
|
7
|
|
13
|
|
15
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol mz16s-block-table, type (array int32)
|
|
(define mz16s-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
16
|
|
18
|
|
0
|
|
2
|
|
17
|
|
19
|
|
1
|
|
3
|
|
24
|
|
26
|
|
8
|
|
10
|
|
25
|
|
27
|
|
9
|
|
11
|
|
20
|
|
22
|
|
4
|
|
6
|
|
21
|
|
23
|
|
5
|
|
7
|
|
28
|
|
30
|
|
12
|
|
14
|
|
29
|
|
31
|
|
13
|
|
15
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol mt8-block-table, type (array int32)
|
|
(define mt8-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
0
|
|
1
|
|
4
|
|
5
|
|
16
|
|
17
|
|
20
|
|
21
|
|
2
|
|
3
|
|
6
|
|
7
|
|
18
|
|
19
|
|
22
|
|
23
|
|
8
|
|
9
|
|
12
|
|
13
|
|
24
|
|
25
|
|
28
|
|
29
|
|
10
|
|
11
|
|
14
|
|
15
|
|
26
|
|
27
|
|
30
|
|
31
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for symbol mt4-block-table, type (array int32)
|
|
(define mt4-block-table (the-as (array int32) (new
|
|
'static
|
|
'boxed-array
|
|
:type int32 :length 32 :allocated-length 32
|
|
0
|
|
2
|
|
8
|
|
10
|
|
1
|
|
3
|
|
9
|
|
11
|
|
4
|
|
6
|
|
12
|
|
14
|
|
5
|
|
7
|
|
13
|
|
15
|
|
16
|
|
18
|
|
24
|
|
26
|
|
17
|
|
19
|
|
25
|
|
27
|
|
20
|
|
22
|
|
28
|
|
30
|
|
21
|
|
23
|
|
29
|
|
31
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-find-block
|
|
(defun gs-find-block ((bx int) (by int) (tex-format gs-psm))
|
|
(cond
|
|
((= tex-format (gs-psm ct32))
|
|
(-> ct32-24-block-table (+ bx (* by 8)))
|
|
)
|
|
((= tex-format (gs-psm ct24))
|
|
(-> ct32-24-block-table (+ bx (* by 8)))
|
|
)
|
|
((= tex-format (gs-psm ct16))
|
|
(-> ct16-block-table (+ bx (* by 4)))
|
|
)
|
|
((= tex-format (gs-psm ct16s))
|
|
(-> ct16s-block-table (+ bx (* by 4)))
|
|
)
|
|
((= tex-format (gs-psm mz32))
|
|
(-> mz32-24-block-table (+ bx (* by 8)))
|
|
)
|
|
((= tex-format (gs-psm mz24))
|
|
(-> mz32-24-block-table (+ bx (* by 8)))
|
|
)
|
|
((= tex-format (gs-psm mz16))
|
|
(-> mz16-block-table (+ bx (* by 4)))
|
|
)
|
|
((= tex-format (gs-psm mz16s))
|
|
(-> mz16s-block-table (+ bx (* by 4)))
|
|
)
|
|
((= tex-format (gs-psm mt8))
|
|
(-> mt8-block-table (+ bx (* by 8)))
|
|
)
|
|
((= tex-format (gs-psm mt4))
|
|
(-> mt4-block-table (+ bx (* by 4)))
|
|
)
|
|
(else
|
|
0
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-page-width
|
|
(defun gs-page-width ((arg0 gs-psm))
|
|
(case arg0
|
|
(((gs-psm ct32) (gs-psm ct24) (gs-psm ct16) (gs-psm ct16s))
|
|
64
|
|
)
|
|
(((gs-psm mt8) (gs-psm mt4))
|
|
128
|
|
)
|
|
(else
|
|
(format #t "Warning: Unknown block width for psm ~D~%" arg0)
|
|
1
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-page-height
|
|
(defun gs-page-height ((arg0 gs-psm))
|
|
(case arg0
|
|
(((gs-psm ct32) (gs-psm ct24))
|
|
32
|
|
)
|
|
(((gs-psm ct16) (gs-psm ct16s))
|
|
64
|
|
)
|
|
(((gs-psm mt8))
|
|
64
|
|
)
|
|
(((gs-psm mt4))
|
|
128
|
|
)
|
|
(else
|
|
(format #t "Warning: Unknown block width for psm ~D~%" arg0)
|
|
1
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-block-width
|
|
(defun gs-block-width ((arg0 gs-psm))
|
|
(case arg0
|
|
(((gs-psm ct32) (gs-psm ct24))
|
|
8
|
|
)
|
|
(((gs-psm ct16) (gs-psm ct16s) (gs-psm mt8))
|
|
16
|
|
)
|
|
(((gs-psm mt4))
|
|
32
|
|
)
|
|
(else
|
|
(format #t "Warning: Unknown block width for psm ~D~%" arg0)
|
|
1
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-block-height
|
|
(defun gs-block-height ((arg0 gs-psm))
|
|
(case arg0
|
|
(((gs-psm ct32) (gs-psm ct24) (gs-psm ct16) (gs-psm ct16s))
|
|
8
|
|
)
|
|
(((gs-psm mt8) (gs-psm mt4))
|
|
16
|
|
)
|
|
(else
|
|
(format #t "Warning: Unknown block width for psm ~D~%" arg0)
|
|
1
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-largest-block
|
|
(defun gs-largest-block ((tex-width int) (tex-height int) (tex-format gs-psm))
|
|
(let* ((block-width (gs-block-width tex-format))
|
|
(block-height (gs-block-height tex-format))
|
|
(real-width (* (/ (+ block-width -1 tex-width) block-width) block-width))
|
|
(real-height (* (/ (+ block-height -1 tex-height) block-height) block-height))
|
|
(width-blocks (/ real-width block-width))
|
|
(height-blocks (/ real-height block-height))
|
|
(max-block 0)
|
|
)
|
|
(dotimes (x width-blocks)
|
|
(dotimes (y height-blocks)
|
|
(set! max-block (max max-block (gs-find-block x y tex-format)))
|
|
)
|
|
)
|
|
max-block
|
|
)
|
|
)
|
|
|
|
;; definition for function gs-blocks-used
|
|
(defun gs-blocks-used ((tex-width int) (tex-height int) (tex-format gs-psm))
|
|
(let* ((page-width (gs-page-width tex-format))
|
|
(page-height (gs-page-height tex-format))
|
|
(real-width (* (/ (+ page-width -1 tex-width) page-width) page-width))
|
|
(real-height (* (/ (+ page-height -1 tex-height) page-height) page-height))
|
|
(width-blocks (/ real-width page-width))
|
|
(height-blocks (/ real-height page-height))
|
|
(a0-9 (- tex-width (* (+ width-blocks -1) page-width)))
|
|
(a1-7 (- tex-height (* (+ height-blocks -1) page-height)))
|
|
)
|
|
(if (or (< a0-9 page-width) (< a1-7 page-height))
|
|
(+ (gs-largest-block a0-9 a1-7 tex-format) 1 (* (+ (* width-blocks height-blocks) -1) 32))
|
|
(* (* height-blocks width-blocks) 32)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for method 0 of type texture-pool
|
|
(defmethod new texture-pool ((allocation symbol) (type-to-make type))
|
|
(initialize! (object-new allocation type-to-make (the-as int (-> type-to-make size))))
|
|
)
|
|
|
|
;; definition for method 15 of type texture-pool
|
|
(defmethod allocate-vram-words! texture-pool ((obj texture-pool) (word-count int))
|
|
(let ((v0-0 (-> obj cur)))
|
|
(+! (-> obj cur) word-count)
|
|
v0-0
|
|
)
|
|
)
|
|
|
|
;; definition for method 22 of type texture-pool
|
|
(defmethod lookup-boot-common-id texture-pool ((obj texture-pool) (tpage-id int))
|
|
(case tpage-id
|
|
((1032)
|
|
0
|
|
)
|
|
((1119)
|
|
1
|
|
)
|
|
((1478)
|
|
2
|
|
)
|
|
((1485)
|
|
3
|
|
)
|
|
((1486)
|
|
4
|
|
)
|
|
((1487)
|
|
5
|
|
)
|
|
((635 1609)
|
|
6
|
|
)
|
|
((636)
|
|
7
|
|
)
|
|
((637)
|
|
8
|
|
)
|
|
((752)
|
|
9
|
|
)
|
|
((1598)
|
|
10
|
|
)
|
|
((1599)
|
|
11
|
|
)
|
|
((1600)
|
|
12
|
|
)
|
|
((1601)
|
|
13
|
|
)
|
|
((1602)
|
|
14
|
|
)
|
|
((1603)
|
|
15
|
|
)
|
|
((1604)
|
|
16
|
|
)
|
|
((1605)
|
|
17
|
|
)
|
|
((1606)
|
|
18
|
|
)
|
|
((1607)
|
|
19
|
|
)
|
|
(else
|
|
-1
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for method 9 of type texture-pool
|
|
(defmethod initialize! texture-pool ((obj texture-pool))
|
|
(set! (-> obj cur) 0)
|
|
(set! (-> obj top) (-> obj cur))
|
|
(set! (-> obj allocate-func) texture-page-default-allocate)
|
|
(allocate-defaults! obj)
|
|
(set! (-> obj font-palette) (allocate-vram-words! obj 64))
|
|
(dotimes (v1-6 32)
|
|
(set! (-> obj common-page v1-6) (the-as texture-page 0))
|
|
)
|
|
(set! (-> obj common-page-mask) 0)
|
|
(dotimes (v1-9 160)
|
|
(set! (-> obj ids v1-9) (the-as uint 0))
|
|
)
|
|
obj
|
|
)
|
|
|
|
;; definition for method 10 of type texture-page
|
|
(defmethod get-leftover-block-count texture-page ((obj texture-page) (segment-count int) (additional-size int))
|
|
(let ((v1-0 additional-size))
|
|
(dotimes (a2-1 segment-count)
|
|
(+! v1-0 (-> obj segment a2-1 size))
|
|
)
|
|
(logand (/ v1-0 64) 63)
|
|
)
|
|
)
|
|
|
|
;; definition for method 10 of type texture-pool
|
|
(defmethod print-usage texture-pool ((obj texture-pool))
|
|
(format #t "--------------------~%")
|
|
(format
|
|
#t
|
|
"texture pool ~DK - ~DK (~DK used, ~DK free)~%"
|
|
(/ (-> obj top) 256)
|
|
(/ (-> obj cur) 256)
|
|
(/ (- (-> obj cur) (-> obj top)) 256)
|
|
(/ (- #xfa000 (-> obj cur)) 256)
|
|
)
|
|
(format #t "--------------------~%")
|
|
obj
|
|
)
|
|
|
|
;; definition for method 16 of type texture-pool
|
|
(defmethod allocate-segment! texture-pool ((obj texture-pool) (segment texture-pool-segment) (size int))
|
|
(set! (-> segment size) (the-as uint size))
|
|
(set! (-> segment dest) (the-as uint (allocate-vram-words! obj size)))
|
|
segment
|
|
)
|
|
|
|
;; definition for method 12 of type texture-pool
|
|
;; INFO: Return type mismatch int vs none.
|
|
(defmethod allocate-defaults! texture-pool ((obj texture-pool))
|
|
(allocate-segment! obj (-> obj segment-common) #x1c000)
|
|
(allocate-segment! obj (-> obj segment-near) #x62000)
|
|
(set! *sky-base-vram-word* (allocate-vram-words! obj #x7000))
|
|
(set! *sky-base-block* (/ *sky-base-vram-word* 64))
|
|
(set! *sky-base-page* (sar *sky-base-vram-word* 11))
|
|
(set! *eyes-base-vram-word* (+ *sky-base-vram-word* 6144))
|
|
(set! *eyes-base-block* (/ *eyes-base-vram-word* 64))
|
|
(set! *eyes-base-page* (sar *eyes-base-vram-word* 11))
|
|
(set! *ocean-base-vram-word* (+ *sky-base-vram-word* 6144))
|
|
(set! *ocean-base-block* (/ *ocean-base-vram-word* 64))
|
|
(set! *ocean-base-page* (sar *ocean-base-vram-word* 11))
|
|
(set! *depth-cue-base-vram-word* (+ *sky-base-vram-word* 6144))
|
|
(set! *depth-cue-base-block* (/ *depth-cue-base-vram-word* 64))
|
|
(set! *depth-cue-base-page* (sar *depth-cue-base-vram-word* 11))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 9 of type texture-page
|
|
(defmethod remove-from-heap texture-page ((obj texture-page) (seg kheap))
|
|
(set! (-> seg current) (-> obj segment 0 block-data))
|
|
obj
|
|
)
|
|
|
|
;; definition for function texture-page-default-allocate
|
|
(defun texture-page-default-allocate ((pool texture-pool) (page texture-page) (seg kheap) (tpage-id int))
|
|
(dotimes (seg-id 3)
|
|
(let ((a1-2 (allocate-vram-words! pool (the-as int (-> page segment seg-id size)))))
|
|
(relocate-dests! page a1-2 seg-id)
|
|
)
|
|
)
|
|
(upload-now! page -1)
|
|
(remove-from-heap page seg)
|
|
page
|
|
)
|
|
|
|
;; definition for function texture-page-common-allocate
|
|
(defun texture-page-common-allocate ((pool texture-pool) (page texture-page) (seg kheap) (tpage-id int))
|
|
(let ((s5-0 (-> pool segment-common dest)))
|
|
(dotimes (seg-id 3)
|
|
(relocate-dests! page (the-as int s5-0) seg-id)
|
|
(+! s5-0 (-> page segment seg-id size))
|
|
)
|
|
)
|
|
page
|
|
)
|
|
|
|
;; definition for function texture-page-common-boot-allocate
|
|
(defun texture-page-common-boot-allocate ((pool texture-pool) (page texture-page) (heap kheap) (tpage-id int))
|
|
(let ((tex-id (lookup-boot-common-id pool tpage-id)))
|
|
(cond
|
|
((>= tex-id 0)
|
|
(texture-page-common-allocate pool page heap tpage-id)
|
|
(set! (-> pool common-page tex-id) page)
|
|
)
|
|
(else
|
|
(set! (-> *texture-pool* allocate-func) texture-page-default-allocate)
|
|
(texture-page-default-allocate pool page heap tpage-id)
|
|
)
|
|
)
|
|
)
|
|
page
|
|
)
|
|
|
|
;; definition for function upload-vram-data
|
|
;; INFO: Return type mismatch symbol vs none.
|
|
(defun upload-vram-data ((buf dma-buffer) (dest int) (tex-data pointer) (tex-h int))
|
|
(while (> tex-h 0)
|
|
(let ((height-this-time (min 2048 tex-h)))
|
|
(let* ((v1-1 buf)
|
|
(dma (the-as dma-packet (-> v1-1 base)))
|
|
)
|
|
(set! (-> dma dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt)))
|
|
(set! (-> dma vif0) (new 'static 'vif-tag))
|
|
(set! (-> dma vif1) (new 'static 'vif-tag :imm #x5 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-1 base) (&+ (the-as pointer dma) 16))
|
|
)
|
|
(let* ((v1-2 buf)
|
|
(gif (the-as gs-gif-tag (-> v1-2 base)))
|
|
)
|
|
(set! (-> gif tag) (new 'static 'gif-tag64 :nloop #x4 :nreg #x1))
|
|
(set! (-> gif regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
|
|
(set! (-> v1-2 base) (&+ (the-as pointer gif) 16))
|
|
)
|
|
(let* ((v1-3 buf)
|
|
(gs-data (-> v1-3 base))
|
|
)
|
|
(set! (-> (the-as (pointer gs-bitbltbuf) gs-data) 0) (new 'static 'gs-bitbltbuf :dbw #x2 :dbp dest))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-data) 1) (gs-reg64 bitbltbuf))
|
|
(set! (-> (the-as (pointer gs-trxpos) gs-data) 2) (new 'static 'gs-trxpos))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-data) 3) (gs-reg64 trxpos))
|
|
(set! (-> (the-as (pointer gs-trxreg) gs-data) 4) (new 'static 'gs-trxreg :rrw #x80 :rrh height-this-time))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-data) 5) (gs-reg64 trxreg))
|
|
(set! (-> (the-as (pointer gs-trxdir) gs-data) 6) (new 'static 'gs-trxdir))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-data) 7) (gs-reg64 trxdir))
|
|
(set! (-> v1-3 base) (&+ gs-data 64))
|
|
)
|
|
(dma-buffer-add-ref-texture buf tex-data 128 height-this-time (gs-psm ct32))
|
|
)
|
|
(+! dest 4096)
|
|
(&+! tex-data #x100000)
|
|
(+! tex-h -2048)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; definition for function upload-vram-pages
|
|
(defun upload-vram-pages ((pool texture-pool) (segment texture-pool-segment) (page texture-page) (mode int) (bucket-idx bucket-id))
|
|
(local-vars
|
|
(tex-data pointer)
|
|
(tex-dest-base-chunk uint)
|
|
(chunk-count int)
|
|
(chunks-to-upload-count int)
|
|
(first-chunk-idx-to-upload int)
|
|
(tex-id uint)
|
|
)
|
|
(let ((total-upload-size 0))
|
|
(let* ((dma-buf (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(dma-start (-> dma-buf base))
|
|
)
|
|
(set! tex-data (-> page segment 0 block-data))
|
|
(set! tex-dest-base-chunk (shr (-> page segment 0 dest) 12))
|
|
(set! chunk-count (the-as int (-> page segment 0 size)))
|
|
(set! chunks-to-upload-count 0)
|
|
(set! first-chunk-idx-to-upload 0)
|
|
(set! tex-id (-> page id))
|
|
(let ((v1-8 mode))
|
|
(cond
|
|
((= v1-8 -3)
|
|
(return 0)
|
|
)
|
|
((zero? v1-8)
|
|
)
|
|
((= v1-8 -2)
|
|
(set! chunk-count (the-as int (+ chunk-count (-> page segment 1 size))))
|
|
)
|
|
((= v1-8 -1)
|
|
(set! chunk-count (the-as int (-> page size)))
|
|
)
|
|
((= v1-8 2)
|
|
(set! tex-data (-> page segment 2 block-data))
|
|
(set! tex-dest-base-chunk (shr (-> page segment 2 dest) 12))
|
|
(set! chunk-count (the-as int (-> page segment 2 size)))
|
|
)
|
|
)
|
|
)
|
|
(set! chunk-count (shr (min (the-as int (-> segment size)) (the-as int (+ chunk-count 4095))) 12))
|
|
(dotimes (upload-chunk-idx chunk-count)
|
|
(let ((current-dest-chunk (+ tex-dest-base-chunk upload-chunk-idx)))
|
|
(cond
|
|
((zero? chunks-to-upload-count)
|
|
(when (!= (-> pool ids current-dest-chunk) tex-id)
|
|
(set! first-chunk-idx-to-upload upload-chunk-idx)
|
|
(set! (-> pool ids current-dest-chunk) tex-id)
|
|
(set! chunks-to-upload-count (+ chunks-to-upload-count 1))
|
|
)
|
|
)
|
|
((= (-> pool ids current-dest-chunk) tex-id)
|
|
(upload-vram-data
|
|
dma-buf
|
|
(the-as int (* (+ tex-dest-base-chunk first-chunk-idx-to-upload) 64))
|
|
(&+ tex-data (shl first-chunk-idx-to-upload 14))
|
|
(* chunks-to-upload-count 32)
|
|
)
|
|
(+! total-upload-size chunks-to-upload-count)
|
|
(set! chunks-to-upload-count 0)
|
|
0
|
|
)
|
|
(else
|
|
(set! (-> pool ids current-dest-chunk) tex-id)
|
|
(set! chunks-to-upload-count (+ chunks-to-upload-count 1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (nonzero? chunks-to-upload-count)
|
|
(upload-vram-data
|
|
dma-buf
|
|
(the-as int (* (+ tex-dest-base-chunk first-chunk-idx-to-upload) 64))
|
|
(&+ tex-data (shl first-chunk-idx-to-upload 14))
|
|
(* chunks-to-upload-count 32)
|
|
)
|
|
(+! total-upload-size chunks-to-upload-count)
|
|
)
|
|
(let* ((v1-47 dma-buf)
|
|
(dma (the-as dma-packet (-> v1-47 base)))
|
|
)
|
|
(set! (-> dma dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt)))
|
|
(set! (-> dma vif0) (new 'static 'vif-tag))
|
|
(set! (-> dma vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-47 base) (&+ (the-as pointer dma) 16))
|
|
)
|
|
(let* ((v1-48 dma-buf)
|
|
(gif (the-as gs-gif-tag (-> v1-48 base)))
|
|
)
|
|
(set! (-> gif tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1))
|
|
(set! (-> gif regs)
|
|
(new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> v1-48 base) (&+ (the-as pointer gif) 16))
|
|
)
|
|
(let* ((v1-49 dma-buf)
|
|
(gif-data (-> v1-49 base))
|
|
)
|
|
(set! (-> (the-as (pointer uint64) gif-data) 0) (the-as uint 1))
|
|
(set! (-> (the-as (pointer gs-reg64) gif-data) 1) (gs-reg64 texflush))
|
|
(set! (-> v1-49 base) (&+ gif-data 16))
|
|
)
|
|
(let ((a3-3 (-> dma-buf base)))
|
|
(let ((dma-end (the-as dma-packet (-> dma-buf base))))
|
|
(set! (-> dma-end dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> dma-end vif0) (new 'static 'vif-tag))
|
|
(set! (-> dma-end vif1) (new 'static 'vif-tag))
|
|
(set! (-> dma-buf base) (&+ (the-as pointer dma-end) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
bucket-idx
|
|
dma-start
|
|
(the-as (pointer dma-tag) a3-3)
|
|
)
|
|
)
|
|
)
|
|
(shl total-upload-size 14)
|
|
)
|
|
)
|
|
|
|
;; definition for function update-vram-pages
|
|
(defun update-vram-pages ((pool texture-pool) (pool-segment texture-pool-segment) (page texture-page) (mode int))
|
|
(-> page segment 0 block-data)
|
|
(let ((dest-block (shr (-> page segment 0 dest) 12))
|
|
(sz (-> page segment 0 size))
|
|
(modified-chunk-count 0)
|
|
)
|
|
0
|
|
(let ((page-id (-> page id)))
|
|
(cond
|
|
((= mode -3)
|
|
(return 0)
|
|
)
|
|
((zero? mode)
|
|
)
|
|
((= mode -2)
|
|
(+! sz (-> page segment 1 size))
|
|
)
|
|
((= mode -1)
|
|
(set! sz (-> page size))
|
|
)
|
|
((= mode 2)
|
|
(-> page segment 2 block-data)
|
|
(set! dest-block (shr (-> page segment 2 dest) 12))
|
|
(set! sz (-> page segment 2 size))
|
|
)
|
|
)
|
|
(let ((upload-chunks (shr (min (the-as int (-> pool-segment size)) (the-as int (+ sz 4095))) 12)))
|
|
(dotimes (chunk-idx upload-chunks)
|
|
(let ((vram-chunk (+ dest-block chunk-idx)))
|
|
(cond
|
|
((zero? modified-chunk-count)
|
|
(when (!= (-> pool ids vram-chunk) page-id)
|
|
(set! (-> pool ids vram-chunk) page-id)
|
|
(+! modified-chunk-count 1)
|
|
)
|
|
)
|
|
((= (-> pool ids vram-chunk) page-id)
|
|
(set! modified-chunk-count 0)
|
|
)
|
|
(else
|
|
(set! (-> pool ids vram-chunk) page-id)
|
|
(+! modified-chunk-count 1)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
;; definition for function upload-vram-pages-pris
|
|
(defun upload-vram-pages-pris ((pool texture-pool)
|
|
(segment texture-pool-segment)
|
|
(page texture-page)
|
|
(bucket-idx bucket-id)
|
|
(allow-cache-mask int)
|
|
)
|
|
(local-vars
|
|
(tex-data pointer)
|
|
(tex-dest-base-chunk uint)
|
|
(chunk-count int)
|
|
(chunks-to-upload-count int)
|
|
(first-chunk-idx-to-upload int)
|
|
(page-id uint)
|
|
(current-dest-chunk uint)
|
|
(need-tex symbol)
|
|
)
|
|
(let ((total-upload-size 0))
|
|
(let* ((dma-buf (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(s4-0 (-> dma-buf base))
|
|
)
|
|
(set! tex-data (-> page segment 0 block-data))
|
|
(set! tex-dest-base-chunk (shr (-> page segment 0 dest) 12))
|
|
(set! chunk-count (the-as int (-> page size)))
|
|
(set! chunks-to-upload-count 0)
|
|
(set! first-chunk-idx-to-upload 0)
|
|
(set! page-id (-> page id))
|
|
(set! chunk-count (shr (min (the-as int (-> segment size)) (the-as int (+ chunk-count 4095))) 12))
|
|
(dotimes (upload-chunk-idx chunk-count)
|
|
(set! current-dest-chunk (+ tex-dest-base-chunk upload-chunk-idx))
|
|
(set! need-tex (logtest? allow-cache-mask (ash 1 upload-chunk-idx)))
|
|
(cond
|
|
((zero? chunks-to-upload-count)
|
|
(when (and (!= (-> pool ids current-dest-chunk) page-id) need-tex)
|
|
(set! first-chunk-idx-to-upload upload-chunk-idx)
|
|
(set! (-> pool ids current-dest-chunk) page-id)
|
|
(set! chunks-to-upload-count (+ chunks-to-upload-count 1))
|
|
)
|
|
)
|
|
((or (= (-> pool ids current-dest-chunk) page-id) (not need-tex))
|
|
(upload-vram-data
|
|
dma-buf
|
|
(the-as int (* (+ tex-dest-base-chunk first-chunk-idx-to-upload) 64))
|
|
(&+ tex-data (shl first-chunk-idx-to-upload 14))
|
|
(* chunks-to-upload-count 32)
|
|
)
|
|
(+! total-upload-size chunks-to-upload-count)
|
|
(set! chunks-to-upload-count 0)
|
|
0
|
|
)
|
|
(else
|
|
(set! (-> pool ids current-dest-chunk) page-id)
|
|
(set! chunks-to-upload-count (+ chunks-to-upload-count 1))
|
|
)
|
|
)
|
|
)
|
|
(when (nonzero? chunks-to-upload-count)
|
|
(upload-vram-data
|
|
dma-buf
|
|
(the-as int (* (+ tex-dest-base-chunk first-chunk-idx-to-upload) 64))
|
|
(&+ tex-data (shl first-chunk-idx-to-upload 14))
|
|
(* chunks-to-upload-count 32)
|
|
)
|
|
(+! total-upload-size chunks-to-upload-count)
|
|
)
|
|
(let* ((v1-52 dma-buf)
|
|
(dma (the-as dma-packet (-> v1-52 base)))
|
|
)
|
|
(set! (-> dma dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt)))
|
|
(set! (-> dma vif0) (new 'static 'vif-tag))
|
|
(set! (-> dma vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-52 base) (&+ (the-as pointer dma) 16))
|
|
)
|
|
(let* ((v1-53 dma-buf)
|
|
(gif (the-as gs-gif-tag (-> v1-53 base)))
|
|
)
|
|
(set! (-> gif tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1))
|
|
(set! (-> gif regs)
|
|
(new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> v1-53 base) (&+ (the-as pointer gif) 16))
|
|
)
|
|
(let* ((v1-54 dma-buf)
|
|
(a0-25 (-> v1-54 base))
|
|
)
|
|
(set! (-> (the-as (pointer uint64) a0-25) 0) (the-as uint 1))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-25) 1) (gs-reg64 texflush))
|
|
(set! (-> v1-54 base) (&+ a0-25 16))
|
|
)
|
|
(let ((a3-3 (-> dma-buf base)))
|
|
(let ((dma-end (the-as dma-packet (-> dma-buf base))))
|
|
(set! (-> dma-end dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> dma-end vif0) (new 'static 'vif-tag))
|
|
(set! (-> dma-end vif1) (new 'static 'vif-tag))
|
|
(set! (-> dma-buf base) (&+ (the-as pointer dma-end) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
bucket-idx
|
|
s4-0
|
|
(the-as (pointer dma-tag) a3-3)
|
|
)
|
|
)
|
|
)
|
|
(shl total-upload-size 14)
|
|
)
|
|
)
|
|
|
|
;; definition for function texture-page-near-allocate-0
|
|
(defun texture-page-near-allocate-0 ((pool texture-pool) (page texture-page) (heap kheap) (mode int))
|
|
(relocate-dests! page (the-as int (-> pool segment-near dest)) 2)
|
|
(let ((common-dest (-> pool segment-common dest)))
|
|
(dotimes (page-seg-idx 2)
|
|
(relocate-dests! page (the-as int common-dest) page-seg-idx)
|
|
(+! common-dest (-> page segment page-seg-idx size))
|
|
)
|
|
)
|
|
(upload-now! page 2)
|
|
(update-vram-pages pool (-> pool segment-near) page 2)
|
|
(let ((page-seg-2-size (logand -4096 (+ (-> page segment 2 size) 4095))))
|
|
(cond
|
|
((< (the-as uint #x24000) page-seg-2-size)
|
|
(let ((after-seg-2-data (&+ (-> page segment 2 block-data) #x90000)))
|
|
(let ((seg-2-data (-> page segment 2 block-data)))
|
|
(set! (-> page segment 2 size) (+ -147456 page-seg-2-size))
|
|
(set! (-> page segment 2 dest) (+ #x24000 (-> pool segment-near dest)))
|
|
(set! (-> heap current) (&+ (-> page segment 2 block-data) (* (-> page segment 2 size) 4)))
|
|
(set! (-> *texture-relocate-later* memcpy) #t)
|
|
(set! (-> *texture-relocate-later* dest) (the-as uint seg-2-data))
|
|
)
|
|
(set! (-> *texture-relocate-later* source) (the-as uint after-seg-2-data))
|
|
)
|
|
(set! (-> *texture-relocate-later* move) (* (-> page segment 2 size) 4))
|
|
)
|
|
(else
|
|
(set! (-> page segment 2 size) (the-as uint 0))
|
|
(set! (-> heap current) (-> page segment 2 block-data))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> *texture-pool* allocate-func) texture-page-common-allocate)
|
|
(set! (-> *level* loading-level code-memory-end) (the-as pointer page))
|
|
page
|
|
)
|
|
|
|
;; definition for function texture-page-near-allocate-1
|
|
(defun texture-page-near-allocate-1 ((pool texture-pool) (page texture-page) (heap kheap) (mode int))
|
|
(let ((seg2-size (logand -4096 (+ (-> page segment 2 size) 4095))))
|
|
(let ((seg2-dest (+ (- #x62000 (the-as int seg2-size)) (-> pool segment-near dest))))
|
|
(relocate-dests! page (the-as int seg2-dest) 2)
|
|
)
|
|
(let ((common-dest (-> pool segment-common dest)))
|
|
(dotimes (page-seg-idx 2)
|
|
(relocate-dests! page (the-as int common-dest) page-seg-idx)
|
|
(+! common-dest (-> page segment page-seg-idx size))
|
|
)
|
|
)
|
|
(upload-now! page 2)
|
|
(update-vram-pages pool (-> pool segment-near) page 2)
|
|
(cond
|
|
((< (the-as uint #x24000) seg2-size)
|
|
(set! (-> page segment 2 size) (+ -147456 seg2-size))
|
|
(set! (-> heap current) (&+ (-> page segment 2 block-data) (* (-> page segment 2 size) 4)))
|
|
)
|
|
(else
|
|
(set! (-> page segment 2 size) (the-as uint 0))
|
|
(set! (-> heap current) (-> page segment 2 block-data))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> *texture-pool* allocate-func) texture-page-common-allocate)
|
|
(set! (-> *level* loading-level code-memory-end) (the-as pointer page))
|
|
page
|
|
)
|
|
|
|
;; definition for function texture-page-level-allocate
|
|
(defun texture-page-level-allocate ((pool texture-pool) (page texture-page) (heap kheap) (mode int))
|
|
(let ((common-id (lookup-boot-common-id pool mode)))
|
|
(cond
|
|
((>= common-id 0)
|
|
(texture-page-common-allocate pool page heap mode)
|
|
(set! (-> pool common-page common-id) page)
|
|
)
|
|
(else
|
|
(let ((level-idx (-> *level* loading-level index)))
|
|
(cond
|
|
((zero? level-idx)
|
|
(texture-page-near-allocate-0 pool page heap mode)
|
|
)
|
|
((= level-idx 1)
|
|
(texture-page-near-allocate-1 pool page heap mode)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
page
|
|
)
|
|
|
|
;; definition for function texture-page-size-check
|
|
(defun texture-page-size-check ((pool texture-pool) (level level) (hide-prints symbol))
|
|
(let ((oversize 0))
|
|
(let* ((tfrag-page (-> level texture-page 0))
|
|
(tfrag-mip0-size (-> tfrag-page mip0-size))
|
|
)
|
|
(when tfrag-page
|
|
(if (< (the-as uint #x3e000) tfrag-mip0-size)
|
|
(set! oversize (logior oversize 1))
|
|
)
|
|
(if (< (the-as uint #x1c000) (+ (-> tfrag-page segment 0 size) (-> tfrag-page segment 1 size)))
|
|
(set! oversize (logior oversize 1))
|
|
)
|
|
(when (not hide-prints)
|
|
(format
|
|
#t
|
|
"~Tlevel ~10S TFRAG tpage ~A uses ~DK of near ~DK~%"
|
|
(-> level name)
|
|
(-> tfrag-page name)
|
|
(shr tfrag-mip0-size 8)
|
|
992
|
|
)
|
|
(format
|
|
#t
|
|
"~Tlevel ~10S TFRAG tpage ~A uses ~DK of common ~DK~%"
|
|
(-> level name)
|
|
(-> tfrag-page name)
|
|
(shr (+ (-> tfrag-page segment 0 size) (-> tfrag-page segment 1 size)) 8)
|
|
448
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((pris-page (-> level texture-page 1)))
|
|
(when pris-page
|
|
(if (< (the-as uint #x1c000) (-> pris-page size))
|
|
(set! oversize (logior oversize 2))
|
|
)
|
|
(if (not hide-prints)
|
|
(format
|
|
#t
|
|
"~Tlevel ~10S PRIS tpage ~A uses ~DK of common ~DK~%"
|
|
(-> level name)
|
|
(-> pris-page name)
|
|
(shr (-> pris-page size) 8)
|
|
448
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((shrub-page (-> level texture-page 2)))
|
|
(when shrub-page
|
|
(if (< (the-as uint #x1c000) (-> shrub-page size))
|
|
(set! oversize (logior oversize 4))
|
|
)
|
|
(if (not hide-prints)
|
|
(format
|
|
#t
|
|
"~Tlevel ~10S SHRUB tpage ~A uses ~DK of common ~DK~%"
|
|
(-> level name)
|
|
(-> shrub-page name)
|
|
(shr (-> shrub-page size) 8)
|
|
448
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((alpha-page (-> level texture-page 3)))
|
|
(when alpha-page
|
|
(if (< (the-as uint #x1c000) (-> alpha-page size))
|
|
(set! oversize (logior oversize 8))
|
|
)
|
|
(if (not hide-prints)
|
|
(format
|
|
#t
|
|
"~Tlevel ~10S ALPHA tpage ~A uses ~DK of common ~DK~%"
|
|
(-> level name)
|
|
(-> alpha-page name)
|
|
(shr (-> alpha-page size) 8)
|
|
448
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((water-page (-> level texture-page 4)))
|
|
(when water-page
|
|
(if (< (the-as uint #x1c000) (-> water-page size))
|
|
(set! oversize (logior oversize 16))
|
|
)
|
|
(if (not hide-prints)
|
|
(format
|
|
#t
|
|
"~Tlevel ~10S WATER tpage ~A uses ~DK of common ~DK~%"
|
|
(-> level name)
|
|
(-> water-page name)
|
|
(shr (-> water-page size) 8)
|
|
448
|
|
)
|
|
)
|
|
)
|
|
)
|
|
oversize
|
|
)
|
|
)
|
|
|
|
;; definition for method 13 of type texture-pool
|
|
;; INFO: Return type mismatch int vs none.
|
|
(defmethod login-level-textures texture-pool ((obj texture-pool) (level level) (max-page-kind int) (id-array (pointer texture-id)))
|
|
(dotimes (page-idx 9)
|
|
(set! (-> level texture-page page-idx) #f)
|
|
)
|
|
(when (>= max-page-kind 0)
|
|
(let ((tfrag-dir-entry (texture-page-login
|
|
(-> id-array 0)
|
|
(if (= (-> level index) 1)
|
|
texture-page-near-allocate-1
|
|
texture-page-near-allocate-0
|
|
)
|
|
loading-level
|
|
)
|
|
)
|
|
)
|
|
(if tfrag-dir-entry
|
|
(set! (-> level texture-page 0) (-> tfrag-dir-entry page))
|
|
)
|
|
)
|
|
)
|
|
(when (>= max-page-kind 1)
|
|
(let ((pris-dir-entry (texture-page-login (-> id-array 1) texture-page-common-allocate loading-level)))
|
|
(if pris-dir-entry
|
|
(set! (-> level texture-page 1) (-> pris-dir-entry page))
|
|
)
|
|
)
|
|
)
|
|
(when (>= max-page-kind 2)
|
|
(let ((shrub-dir-entry (texture-page-login (-> id-array 2) texture-page-common-allocate loading-level)))
|
|
(if shrub-dir-entry
|
|
(set! (-> level texture-page 2) (-> shrub-dir-entry page))
|
|
)
|
|
)
|
|
)
|
|
(when (>= max-page-kind 3)
|
|
(let ((alpha-dir-entry (texture-page-login (-> id-array 3) texture-page-common-allocate loading-level)))
|
|
(if alpha-dir-entry
|
|
(set! (-> level texture-page 3) (-> alpha-dir-entry page))
|
|
)
|
|
)
|
|
)
|
|
(when (>= max-page-kind 4)
|
|
(let ((water-dir-entry (texture-page-login (-> id-array 4) texture-page-common-allocate loading-level)))
|
|
(if water-dir-entry
|
|
(set! (-> level texture-page 4) (-> water-dir-entry page))
|
|
)
|
|
)
|
|
)
|
|
(let ((overflow-bits (texture-page-size-check obj level #t)))
|
|
(when (nonzero? overflow-bits)
|
|
(format #t "-------------------- tpage overflow error #x~X~%" overflow-bits)
|
|
(texture-page-size-check obj level #f)
|
|
(format #t "--------------------~%")
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 14 of type texture-pool
|
|
;; INFO: Return type mismatch int vs none.
|
|
(defmethod add-tex-to-dma! texture-pool ((obj texture-pool) (level level) (tex-page-kind int))
|
|
(when (zero? tex-page-kind)
|
|
(let ((tfrag-page (-> level texture-page 0))
|
|
(tfrag-bucket (if (zero? (-> level index))
|
|
5
|
|
12
|
|
)
|
|
)
|
|
(distance
|
|
(fmin
|
|
(fmin
|
|
(-> level closest-object 0)
|
|
(if (and (< 0.0 (-> level level-distance)) (< (+ 409600.0 (-> level level-distance)) (-> level closest-object 5)))
|
|
4095996000.0
|
|
(-> level closest-object 5)
|
|
)
|
|
)
|
|
(-> level closest-object 6)
|
|
)
|
|
)
|
|
)
|
|
(when tfrag-page
|
|
(set! (-> level upload-size 0) 0)
|
|
(if (< distance 81920.0)
|
|
(+! (-> level upload-size 0)
|
|
(upload-vram-pages obj (-> obj segment-near) tfrag-page 2 (the-as bucket-id tfrag-bucket))
|
|
)
|
|
)
|
|
(cond
|
|
((= distance 4095996000.0)
|
|
)
|
|
((< 102400.0 distance)
|
|
(+! (-> level upload-size 0)
|
|
(upload-vram-pages obj (-> obj segment-common) tfrag-page 0 (the-as bucket-id tfrag-bucket))
|
|
)
|
|
)
|
|
(else
|
|
(+! (-> level upload-size 0)
|
|
(upload-vram-pages obj (-> obj segment-common) tfrag-page -2 (the-as bucket-id tfrag-bucket))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
(when (= tex-page-kind 1)
|
|
(let ((pris-page (-> level texture-page 1)))
|
|
(when (and pris-page (nonzero? pris-page))
|
|
(let ((pris-bucket (if (zero? (-> level index))
|
|
48
|
|
51
|
|
)
|
|
)
|
|
)
|
|
(set! (-> level upload-size 1) (upload-vram-pages-pris
|
|
obj
|
|
(-> obj segment-common)
|
|
pris-page
|
|
(the-as bucket-id pris-bucket)
|
|
(the-as int (-> level texture-mask 7))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (= tex-page-kind 2)
|
|
(let ((shrub-page (-> level texture-page 2))
|
|
(shrub-closest (-> level closest-object 2))
|
|
)
|
|
(when (and shrub-page (nonzero? shrub-page))
|
|
(let ((shrub-bucket (if (zero? (-> level index))
|
|
19
|
|
25
|
|
)
|
|
)
|
|
(shrub-mode (cond
|
|
((= shrub-closest 4095996000.0)
|
|
-3
|
|
)
|
|
((< 102400.0 shrub-closest)
|
|
0
|
|
)
|
|
((< 81920.0 shrub-closest)
|
|
-2
|
|
)
|
|
(else
|
|
-1
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> level upload-size 2)
|
|
(upload-vram-pages obj (-> obj segment-common) shrub-page shrub-mode (the-as bucket-id shrub-bucket))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (= tex-page-kind 3)
|
|
(let ((alpha-page (-> level texture-page 3))
|
|
(alpha-closest (-> level closest-object 3))
|
|
)
|
|
(when (and alpha-page (nonzero? alpha-page))
|
|
(let ((alpha-bucket (if (zero? (-> level index))
|
|
31
|
|
38
|
|
)
|
|
)
|
|
(alpha-mode (cond
|
|
((< 348160.0 alpha-closest)
|
|
0
|
|
)
|
|
((< 163840.0 alpha-closest)
|
|
-2
|
|
)
|
|
(else
|
|
-1
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((alpha-dest-chunk (shr (-> alpha-page segment 0 dest) 12)))
|
|
(when (movie?)
|
|
(set! (-> obj ids alpha-dest-chunk) (the-as uint 0))
|
|
(set! (-> obj ids (+ alpha-dest-chunk 1)) (the-as uint 0))
|
|
0
|
|
)
|
|
)
|
|
(set! (-> level upload-size 3)
|
|
(upload-vram-pages obj (-> obj segment-common) alpha-page alpha-mode (the-as bucket-id alpha-bucket))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (= tex-page-kind 4)
|
|
(let ((water-page (-> level texture-page 4)))
|
|
(when (and water-page (nonzero? water-page))
|
|
(let ((water-bucket (if (zero? (-> level index))
|
|
57
|
|
60
|
|
)
|
|
)
|
|
)
|
|
(set! (-> level upload-size 4) (upload-vram-pages-pris
|
|
obj
|
|
(-> obj segment-common)
|
|
water-page
|
|
(the-as bucket-id water-bucket)
|
|
(the-as int (-> level texture-mask 8))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 21 of type texture-pool
|
|
(defmethod upload-one-common! texture-pool ((obj texture-pool) (arg0 level))
|
|
(dotimes (v1-0 32)
|
|
(let ((a2-0 (-> obj common-page v1-0)))
|
|
(when (and (nonzero? a2-0) (logtest? (-> obj common-page-mask) (ash 1 v1-0)))
|
|
(upload-vram-pages obj (-> obj segment-common) a2-0 -2 (bucket-id pre-sprite-textures))
|
|
(return #f)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
|
|
;; definition for method 11 of type level
|
|
;; INFO: Return type mismatch int vs none.
|
|
(defmethod add-irq-to-tex-buckets! level ((obj level))
|
|
(cond
|
|
((zero? (-> obj index))
|
|
(let* ((v1-4 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-0 (-> v1-4 base))
|
|
)
|
|
(let* ((a0-4 v1-4)
|
|
(a1-0 (the-as object (-> a0-4 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-0) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-0) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-0) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-4 base) (&+ (the-as pointer a1-0) 16))
|
|
)
|
|
(let ((a3-3 (-> v1-4 base)))
|
|
(let ((a0-5 (the-as object (-> v1-4 base))))
|
|
(set! (-> (the-as dma-packet a0-5) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-5) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-5) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-4 base) (&+ (the-as pointer a0-5) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id tfrag-tex0)
|
|
a2-0
|
|
(the-as (pointer dma-tag) a3-3)
|
|
)
|
|
)
|
|
)
|
|
(let* ((v1-12 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-1 (-> v1-12 base))
|
|
)
|
|
(let* ((a0-14 v1-12)
|
|
(a1-4 (the-as object (-> a0-14 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-4) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-4) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-4) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-14 base) (&+ (the-as pointer a1-4) 16))
|
|
)
|
|
(let ((a3-7 (-> v1-12 base)))
|
|
(let ((a0-15 (the-as object (-> v1-12 base))))
|
|
(set! (-> (the-as dma-packet a0-15) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-15) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-15) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-12 base) (&+ (the-as pointer a0-15) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id pris-tex0)
|
|
a2-1
|
|
(the-as (pointer dma-tag) a3-7)
|
|
)
|
|
)
|
|
)
|
|
(let* ((v1-20 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-2 (-> v1-20 base))
|
|
)
|
|
(let* ((a0-24 v1-20)
|
|
(a1-8 (the-as object (-> a0-24 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-8) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-8) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-8) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-24 base) (&+ (the-as pointer a1-8) 16))
|
|
)
|
|
(let ((a3-11 (-> v1-20 base)))
|
|
(let ((a0-25 (the-as object (-> v1-20 base))))
|
|
(set! (-> (the-as dma-packet a0-25) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-25) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-25) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-20 base) (&+ (the-as pointer a0-25) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id shrub-tex0)
|
|
a2-2
|
|
(the-as (pointer dma-tag) a3-11)
|
|
)
|
|
)
|
|
)
|
|
(let* ((v1-28 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-3 (-> v1-28 base))
|
|
)
|
|
(let* ((a0-34 v1-28)
|
|
(a1-12 (the-as object (-> a0-34 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-12) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-12) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-12) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-34 base) (&+ (the-as pointer a1-12) 16))
|
|
)
|
|
(let ((a3-15 (-> v1-28 base)))
|
|
(let ((a0-35 (the-as object (-> v1-28 base))))
|
|
(set! (-> (the-as dma-packet a0-35) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-35) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-35) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-28 base) (&+ (the-as pointer a0-35) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id alpha-tex0)
|
|
a2-3
|
|
(the-as (pointer dma-tag) a3-15)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(let* ((v1-36 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-4 (-> v1-36 base))
|
|
)
|
|
(let* ((a0-44 v1-36)
|
|
(a1-16 (the-as object (-> a0-44 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-16) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-16) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-16) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-44 base) (&+ (the-as pointer a1-16) 16))
|
|
)
|
|
(let ((a3-19 (-> v1-36 base)))
|
|
(let ((a0-45 (the-as object (-> v1-36 base))))
|
|
(set! (-> (the-as dma-packet a0-45) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-45) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-45) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-36 base) (&+ (the-as pointer a0-45) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id tfrag-tex1)
|
|
a2-4
|
|
(the-as (pointer dma-tag) a3-19)
|
|
)
|
|
)
|
|
)
|
|
(let* ((v1-44 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-5 (-> v1-44 base))
|
|
)
|
|
(let* ((a0-54 v1-44)
|
|
(a1-20 (the-as object (-> a0-54 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-20) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-20) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-20) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-54 base) (&+ (the-as pointer a1-20) 16))
|
|
)
|
|
(let ((a3-23 (-> v1-44 base)))
|
|
(let ((a0-55 (the-as object (-> v1-44 base))))
|
|
(set! (-> (the-as dma-packet a0-55) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-55) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-55) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-44 base) (&+ (the-as pointer a0-55) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id pris-tex1)
|
|
a2-5
|
|
(the-as (pointer dma-tag) a3-23)
|
|
)
|
|
)
|
|
)
|
|
(let* ((v1-52 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-6 (-> v1-52 base))
|
|
)
|
|
(let* ((a0-64 v1-52)
|
|
(a1-24 (the-as object (-> a0-64 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-24) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-24) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-24) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-64 base) (&+ (the-as pointer a1-24) 16))
|
|
)
|
|
(let ((a3-27 (-> v1-52 base)))
|
|
(let ((a0-65 (the-as object (-> v1-52 base))))
|
|
(set! (-> (the-as dma-packet a0-65) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-65) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-65) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-52 base) (&+ (the-as pointer a0-65) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id shrub-tex1)
|
|
a2-6
|
|
(the-as (pointer dma-tag) a3-27)
|
|
)
|
|
)
|
|
)
|
|
(let* ((v1-60 (-> *display* frames (-> *display* on-screen) frame global-buf))
|
|
(a2-7 (-> v1-60 base))
|
|
)
|
|
(let* ((a0-74 v1-60)
|
|
(a1-28 (the-as object (-> a0-74 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a1-28) dma) (new 'static 'dma-tag :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a1-28) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a1-28) vif1) (new 'static 'vif-tag :irq #x1))
|
|
(set! (-> a0-74 base) (&+ (the-as pointer a1-28) 16))
|
|
)
|
|
(let ((a3-31 (-> v1-60 base)))
|
|
(let ((a0-75 (the-as object (-> v1-60 base))))
|
|
(set! (-> (the-as dma-packet a0-75) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
|
|
(set! (-> (the-as dma-packet a0-75) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-75) vif1) (new 'static 'vif-tag))
|
|
(set! (-> v1-60 base) (&+ (the-as pointer a0-75) 16))
|
|
)
|
|
(dma-bucket-insert-tag
|
|
(-> *display* frames (-> *display* on-screen) frame bucket-group)
|
|
(bucket-id alpha-tex1)
|
|
a2-7
|
|
(the-as (pointer dma-tag) a3-31)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for symbol *txt-dma-list*, type dma-buffer
|
|
(define *txt-dma-list* (new 'global 'dma-buffer 4096))
|
|
|
|
;; definition for method 14 of type texture-page
|
|
;; INFO: Return type mismatch int vs none.
|
|
(defmethod upload-now! texture-page ((obj texture-page) (arg0 int))
|
|
(let ((gp-0 *txt-dma-list*))
|
|
(let ((v1-0 gp-0))
|
|
(set! (-> v1-0 base) (-> v1-0 data))
|
|
(set! (-> v1-0 end) (&-> v1-0 data-buffer (-> v1-0 allocated-length)))
|
|
)
|
|
(add-to-dma-buffer obj gp-0 arg0)
|
|
(let* ((v1-3 gp-0)
|
|
(a0-1 (the-as object (-> v1-3 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a0-1) dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a0-1) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-1) vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-3 base) (&+ (the-as pointer a0-1) 16))
|
|
)
|
|
(let* ((v1-4 gp-0)
|
|
(a0-3 (the-as object (-> v1-4 base)))
|
|
)
|
|
(set! (-> (the-as gs-gif-tag a0-3) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1))
|
|
(set! (-> (the-as gs-gif-tag a0-3) regs)
|
|
(new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> v1-4 base) (&+ (the-as pointer a0-3) 16))
|
|
)
|
|
(let* ((v1-5 gp-0)
|
|
(a0-5 (-> v1-5 base))
|
|
)
|
|
(set! (-> (the-as (pointer uint64) a0-5) 0) (the-as uint 1))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-5) 1) (gs-reg64 texflush))
|
|
(set! (-> v1-5 base) (&+ a0-5 16))
|
|
)
|
|
(let* ((v1-6 gp-0)
|
|
(a0-7 (the-as object (-> v1-6 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a0-7) dma) (new 'static 'dma-tag :id (dma-tag-id end)))
|
|
(set! (-> (the-as (pointer uint64) a0-7) 1) (the-as uint 0))
|
|
(set! (-> v1-6 base) (&+ (the-as pointer a0-7) 16))
|
|
)
|
|
(dma-buffer-send-chain (the-as dma-bank-source #x1000a000) gp-0)
|
|
)
|
|
(dma-sync (the-as pointer #x1000a000) 0 0)
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 13 of type texture-page
|
|
(defmethod add-to-dma-buffer texture-page ((obj texture-page) (dma-buff dma-buffer) (mode int))
|
|
(local-vars (total-size int))
|
|
(let ((v1-0 mode))
|
|
(set! total-size (cond
|
|
((= v1-0 -3)
|
|
0
|
|
)
|
|
((= v1-0 -2)
|
|
(the-as int (+ (-> obj segment 0 size) (-> obj segment 1 size)))
|
|
)
|
|
((= v1-0 -1)
|
|
(the-as int (-> obj size))
|
|
)
|
|
(else
|
|
(the-as int (-> obj segment mode size))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let* ((start-segment (max 0 mode))
|
|
(chunk-count (* (/ (+ (/ total-size 64) 63) 64) 32))
|
|
(current-dest (shr (-> obj segment start-segment dest) 6))
|
|
(current-data (-> obj segment start-segment block-data))
|
|
)
|
|
(while (> chunk-count 0)
|
|
(let ((chunks-now (min 2048 chunk-count)))
|
|
(let* ((v1-11 dma-buff)
|
|
(pkt (the-as dma-packet (-> v1-11 base)))
|
|
)
|
|
(set! (-> pkt dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt)))
|
|
(set! (-> pkt vif0) (new 'static 'vif-tag))
|
|
(set! (-> pkt vif1) (new 'static 'vif-tag :imm #x5 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-11 base) (&+ (the-as pointer pkt) 16))
|
|
)
|
|
(let* ((v1-12 dma-buff)
|
|
(gs-tag (the-as gs-gif-tag (-> v1-12 base)))
|
|
)
|
|
(set! (-> gs-tag tag) (new 'static 'gif-tag64 :nloop #x4 :nreg #x1))
|
|
(set! (-> gs-tag regs) (new 'static 'gif-tag-regs :regs0 (gif-reg-id a+d)))
|
|
(set! (-> v1-12 base) (&+ (the-as pointer gs-tag) 16))
|
|
)
|
|
(let* ((v1-13 dma-buff)
|
|
(gs-reg-data (-> v1-13 base))
|
|
)
|
|
(set! (-> (the-as (pointer gs-bitbltbuf) gs-reg-data) 0)
|
|
(new 'static 'gs-bitbltbuf :dbw #x2 :dbp current-dest)
|
|
)
|
|
(set! (-> (the-as (pointer gs-reg64) gs-reg-data) 1) (gs-reg64 bitbltbuf))
|
|
(set! (-> (the-as (pointer gs-trxpos) gs-reg-data) 2) (new 'static 'gs-trxpos))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-reg-data) 3) (gs-reg64 trxpos))
|
|
(set! (-> (the-as (pointer gs-trxreg) gs-reg-data) 4) (new 'static 'gs-trxreg :rrw #x80 :rrh chunks-now))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-reg-data) 5) (gs-reg64 trxreg))
|
|
(set! (-> (the-as (pointer gs-trxdir) gs-reg-data) 6) (new 'static 'gs-trxdir))
|
|
(set! (-> (the-as (pointer gs-reg64) gs-reg-data) 7) (gs-reg64 trxdir))
|
|
(set! (-> v1-13 base) (&+ gs-reg-data 64))
|
|
)
|
|
(dma-buffer-add-ref-texture dma-buff current-data 128 chunks-now (gs-psm ct32))
|
|
)
|
|
(+! current-dest 4096)
|
|
(&+! current-data #x100000)
|
|
(+! chunk-count -2048)
|
|
)
|
|
)
|
|
total-size
|
|
)
|
|
|
|
;; definition for function texture-relocate
|
|
(defun texture-relocate ((dma-buff dma-buffer) (tex texture) (dest-loc int) (dest-fmt gs-psm) (clut-dst int))
|
|
(dotimes (mip-level (the-as int (-> tex num-mips)))
|
|
(let ((mip-w (ash (-> tex w) (- mip-level)))
|
|
(mip-h (ash (-> tex h) (- mip-level)))
|
|
)
|
|
(let* ((t3-2 dma-buff)
|
|
(dma-pkt (the-as dma-packet (-> t3-2 base)))
|
|
)
|
|
(set! (-> dma-pkt dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt)))
|
|
(set! (-> dma-pkt vif0) (new 'static 'vif-tag))
|
|
(set! (-> dma-pkt vif1) (new 'static 'vif-tag :imm #x5 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> t3-2 base) (&+ (the-as pointer dma-pkt) 16))
|
|
)
|
|
(let* ((t3-3 dma-buff)
|
|
(gs-pkt (the-as gs-gif-tag (-> t3-3 base)))
|
|
)
|
|
(set! (-> gs-pkt tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x4))
|
|
(set! (-> gs-pkt regs) (new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> t3-3 base) (&+ (the-as pointer gs-pkt) 16))
|
|
)
|
|
(let* ((t3-4 dma-buff)
|
|
(t4-4 (-> t3-4 base))
|
|
)
|
|
(set! (-> (the-as (pointer gs-bitbltbuf) t4-4) 0) (new 'static 'gs-bitbltbuf
|
|
:sbp (-> tex dest mip-level)
|
|
:sbw (-> tex width mip-level)
|
|
:spsm (the-as int (-> tex psm))
|
|
:dbp (/ dest-loc 64)
|
|
:dbw (-> tex width mip-level)
|
|
:dpsm (the-as int dest-fmt)
|
|
)
|
|
)
|
|
(set! (-> (the-as (pointer gs-reg64) t4-4) 1) (gs-reg64 bitbltbuf))
|
|
(set! (-> (the-as (pointer gs-trxpos) t4-4) 2) (new 'static 'gs-trxpos))
|
|
(set! (-> (the-as (pointer gs-reg64) t4-4) 3) (gs-reg64 trxpos))
|
|
(set! (-> (the-as (pointer gs-trxreg) t4-4) 4) (new 'static 'gs-trxreg :rrw mip-w :rrh mip-h))
|
|
(set! (-> (the-as (pointer gs-reg64) t4-4) 5) (gs-reg64 trxreg))
|
|
(set! (-> (the-as (pointer gs-trxdir) t4-4) 6) (new 'static 'gs-trxdir :xdir #x2))
|
|
(set! (-> (the-as (pointer gs-reg64) t4-4) 7) (gs-reg64 trxdir))
|
|
(set! (-> t3-4 base) (&+ t4-4 64))
|
|
)
|
|
)
|
|
(set! (-> tex dest mip-level) (the-as uint (/ dest-loc 64)))
|
|
)
|
|
(cond
|
|
((< clut-dst 0)
|
|
)
|
|
((= (-> tex psm) (gs-psm mt4))
|
|
(let* ((v1-7 dma-buff)
|
|
(a2-2 (the-as object (-> v1-7 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a2-2) dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a2-2) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a2-2) vif1) (new 'static 'vif-tag :imm #x5 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-7 base) (&+ (the-as pointer a2-2) 16))
|
|
)
|
|
(let* ((v1-8 dma-buff)
|
|
(a2-4 (the-as object (-> v1-8 base)))
|
|
)
|
|
(set! (-> (the-as gs-gif-tag a2-4) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x4))
|
|
(set! (-> (the-as gs-gif-tag a2-4) regs) (new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> v1-8 base) (&+ (the-as pointer a2-4) 16))
|
|
)
|
|
(let* ((v1-9 dma-buff)
|
|
(a2-6 (-> v1-9 base))
|
|
)
|
|
(set! (-> (the-as (pointer gs-bitbltbuf) a2-6) 0) (new 'static 'gs-bitbltbuf
|
|
:sbw #x1
|
|
:dbw #x1
|
|
:dpsm (-> tex clutpsm)
|
|
:dbp (/ clut-dst 64)
|
|
:spsm (-> tex clutpsm)
|
|
:sbp (-> tex clutdest)
|
|
)
|
|
)
|
|
(set! (-> (the-as (pointer gs-reg64) a2-6) 1) (gs-reg64 bitbltbuf))
|
|
(set! (-> (the-as (pointer gs-trxpos) a2-6) 2) (new 'static 'gs-trxpos))
|
|
(set! (-> (the-as (pointer gs-reg64) a2-6) 3) (gs-reg64 trxpos))
|
|
(set! (-> (the-as (pointer gs-trxreg) a2-6) 4) (new 'static 'gs-trxreg :rrw #x8 :rrh #x2))
|
|
(set! (-> (the-as (pointer gs-reg64) a2-6) 5) (gs-reg64 trxreg))
|
|
(set! (-> (the-as (pointer gs-trxdir) a2-6) 6) (new 'static 'gs-trxdir :xdir #x2))
|
|
(set! (-> (the-as (pointer gs-reg64) a2-6) 7) (gs-reg64 trxdir))
|
|
(set! (-> v1-9 base) (&+ a2-6 64))
|
|
)
|
|
(set! (-> tex clutdest) (the-as uint (/ clut-dst 64)))
|
|
)
|
|
((= (-> tex psm) (gs-psm mt8))
|
|
(let* ((v1-13 dma-buff)
|
|
(a2-9 (the-as object (-> v1-13 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a2-9) dma) (new 'static 'dma-tag :qwc #x5 :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a2-9) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a2-9) vif1) (new 'static 'vif-tag :imm #x5 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-13 base) (&+ (the-as pointer a2-9) 16))
|
|
)
|
|
(let* ((v1-14 dma-buff)
|
|
(a2-11 (the-as object (-> v1-14 base)))
|
|
)
|
|
(set! (-> (the-as gs-gif-tag a2-11) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x4))
|
|
(set! (-> (the-as gs-gif-tag a2-11) regs) (new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> v1-14 base) (&+ (the-as pointer a2-11) 16))
|
|
)
|
|
(let* ((v1-15 dma-buff)
|
|
(a2-13 (-> v1-15 base))
|
|
)
|
|
(set! (-> (the-as (pointer gs-bitbltbuf) a2-13) 0) (new 'static 'gs-bitbltbuf
|
|
:sbw #x2
|
|
:dbw #x2
|
|
:dpsm (-> tex clutpsm)
|
|
:dbp (/ clut-dst 64)
|
|
:spsm (-> tex clutpsm)
|
|
:sbp (-> tex clutdest)
|
|
)
|
|
)
|
|
(set! (-> (the-as (pointer gs-reg64) a2-13) 1) (gs-reg64 bitbltbuf))
|
|
(set! (-> (the-as (pointer gs-trxpos) a2-13) 2) (new 'static 'gs-trxpos))
|
|
(set! (-> (the-as (pointer gs-reg64) a2-13) 3) (gs-reg64 trxpos))
|
|
(set! (-> (the-as (pointer gs-trxreg) a2-13) 4) (new 'static 'gs-trxreg :rrw #x10 :rrh #x10))
|
|
(set! (-> (the-as (pointer gs-reg64) a2-13) 5) (gs-reg64 trxreg))
|
|
(set! (-> (the-as (pointer gs-trxdir) a2-13) 6) (new 'static 'gs-trxdir :xdir #x2))
|
|
(set! (-> (the-as (pointer gs-reg64) a2-13) 7) (gs-reg64 trxdir))
|
|
(set! (-> v1-15 base) (&+ a2-13 64))
|
|
)
|
|
(set! (-> tex clutdest) (the-as uint (/ clut-dst 64)))
|
|
)
|
|
)
|
|
(set! (-> tex psm) dest-fmt)
|
|
dma-buff
|
|
)
|
|
|
|
;; definition (perm) for symbol *font-texture*, type texture
|
|
(define-perm *font-texture* texture #f)
|
|
|
|
;; definition for method 11 of type texture-pool
|
|
;; WARN: Stack slot offset 20 signed mismatch
|
|
;; WARN: Stack slot offset 20 signed mismatch
|
|
;; WARN: Stack slot offset 20 signed mismatch
|
|
;; WARN: Stack slot offset 20 signed mismatch
|
|
;; WARN: Stack slot offset 16 signed mismatch
|
|
;; WARN: Stack slot offset 16 signed mismatch
|
|
;; WARN: Stack slot offset 16 signed mismatch
|
|
;; INFO: Return type mismatch int vs none.
|
|
(defmethod setup-font-texture! texture-pool ((obj texture-pool))
|
|
(local-vars (heap-before-font-tex int) (clut-dest-addr int))
|
|
(let ((font-clut (-> obj font-palette)))
|
|
(set! heap-before-font-tex (-> obj cur))
|
|
(set! clut-dest-addr (/ font-clut 64))
|
|
(set! *font-texture* (lookup-texture-by-id (new 'static 'texture-id :index #x1 :page #x4fe)))
|
|
(let ((main-font-tx
|
|
(texture-page-login (new 'static 'texture-id :index #x1 :page #x4fe) texture-page-default-allocate global)
|
|
)
|
|
)
|
|
(if (and main-font-tx (-> main-font-tx page))
|
|
(set! heap-before-font-tex (the-as int (-> main-font-tx page segment 0 dest)))
|
|
)
|
|
(let ((dma-buff *txt-dma-list*))
|
|
(let ((v1-6 dma-buff))
|
|
(set! (-> v1-6 base) (-> v1-6 data))
|
|
(set! (-> v1-6 end) (&-> v1-6 data-buffer (-> v1-6 allocated-length)))
|
|
)
|
|
(let ((font-tx-1 *font-texture*)
|
|
(font-tx-1-dest #xe0000)
|
|
(font-tx-1-fmt 36)
|
|
)
|
|
(texture-relocate dma-buff font-tx-1 font-tx-1-dest (the-as gs-psm font-tx-1-fmt) font-clut)
|
|
(font-set-tex0
|
|
(the-as (pointer gs-tex0) (-> *font-work* small-font-lo-tmpl))
|
|
font-tx-1
|
|
(the-as uint font-tx-1-dest)
|
|
(the-as uint font-tx-1-fmt)
|
|
(the-as uint clut-dest-addr)
|
|
)
|
|
)
|
|
(let ((font-tx-0 (lookup-texture-by-id (new 'static 'texture-id :page #x4fe)))
|
|
(font-tx-0-dest #xe0000)
|
|
(font-tx-0-fmt 44)
|
|
)
|
|
(texture-relocate dma-buff font-tx-0 font-tx-0-dest (the-as gs-psm font-tx-0-fmt) font-clut)
|
|
(font-set-tex0
|
|
(the-as (pointer gs-tex0) (-> *font-work* small-font-hi-tmpl))
|
|
font-tx-0
|
|
(the-as uint font-tx-0-dest)
|
|
(the-as uint font-tx-0-fmt)
|
|
(the-as uint clut-dest-addr)
|
|
)
|
|
)
|
|
(let ((font-tx-3 (lookup-texture-by-id (new 'static 'texture-id :index #x3 :page #x4fe)))
|
|
(font-tx-3-dest #xe6000)
|
|
(font-tx-3-fmt 36)
|
|
)
|
|
(texture-relocate dma-buff font-tx-3 font-tx-3-dest (the-as gs-psm font-tx-3-fmt) font-clut)
|
|
(font-set-tex0
|
|
(the-as (pointer gs-tex0) (-> *font-work* large-font-lo-tmpl))
|
|
font-tx-3
|
|
(the-as uint font-tx-3-dest)
|
|
(the-as uint font-tx-3-fmt)
|
|
(the-as uint clut-dest-addr)
|
|
)
|
|
)
|
|
(let ((font-tx-2 (lookup-texture-by-id (new 'static 'texture-id :index #x2 :page #x4fe)))
|
|
(font-tx-2-dest #xe6000)
|
|
(font-tx-2-fmt 44)
|
|
)
|
|
(texture-relocate dma-buff font-tx-2 font-tx-2-dest (the-as gs-psm font-tx-2-fmt) font-clut)
|
|
(font-set-tex0
|
|
(the-as (pointer gs-tex0) (-> *font-work* large-font-hi-tmpl))
|
|
font-tx-2
|
|
(the-as uint font-tx-2-dest)
|
|
(the-as uint font-tx-2-fmt)
|
|
(the-as uint clut-dest-addr)
|
|
)
|
|
)
|
|
(let* ((v1-15 dma-buff)
|
|
(a0-18 (the-as object (-> v1-15 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a0-18) dma) (new 'static 'dma-tag :qwc #x2 :id (dma-tag-id cnt)))
|
|
(set! (-> (the-as dma-packet a0-18) vif0) (new 'static 'vif-tag))
|
|
(set! (-> (the-as dma-packet a0-18) vif1) (new 'static 'vif-tag :imm #x2 :cmd (vif-cmd direct) :msk #x1))
|
|
(set! (-> v1-15 base) (&+ (the-as pointer a0-18) 16))
|
|
)
|
|
(let* ((v1-16 dma-buff)
|
|
(a0-20 (the-as object (-> v1-16 base)))
|
|
)
|
|
(set! (-> (the-as gs-gif-tag a0-20) tag) (new 'static 'gif-tag64 :nloop #x1 :eop #x1 :nreg #x1))
|
|
(set! (-> (the-as gs-gif-tag a0-20) regs)
|
|
(new 'static 'gif-tag-regs
|
|
:regs0 (gif-reg-id a+d)
|
|
:regs1 (gif-reg-id a+d)
|
|
:regs2 (gif-reg-id a+d)
|
|
:regs3 (gif-reg-id a+d)
|
|
:regs4 (gif-reg-id a+d)
|
|
:regs5 (gif-reg-id a+d)
|
|
:regs6 (gif-reg-id a+d)
|
|
:regs7 (gif-reg-id a+d)
|
|
:regs8 (gif-reg-id a+d)
|
|
:regs9 (gif-reg-id a+d)
|
|
:regs10 (gif-reg-id a+d)
|
|
:regs11 (gif-reg-id a+d)
|
|
:regs12 (gif-reg-id a+d)
|
|
:regs13 (gif-reg-id a+d)
|
|
:regs14 (gif-reg-id a+d)
|
|
:regs15 (gif-reg-id a+d)
|
|
)
|
|
)
|
|
(set! (-> v1-16 base) (&+ (the-as pointer a0-20) 16))
|
|
)
|
|
(let* ((v1-17 dma-buff)
|
|
(a0-22 (-> v1-17 base))
|
|
)
|
|
(set! (-> (the-as (pointer uint64) a0-22) 0) (the-as uint 1))
|
|
(set! (-> (the-as (pointer gs-reg64) a0-22) 1) (gs-reg64 texflush))
|
|
(set! (-> v1-17 base) (&+ a0-22 16))
|
|
)
|
|
(let* ((v1-18 dma-buff)
|
|
(a0-24 (the-as object (-> v1-18 base)))
|
|
)
|
|
(set! (-> (the-as dma-packet a0-24) dma) (new 'static 'dma-tag :id (dma-tag-id end)))
|
|
(set! (-> (the-as (pointer uint64) a0-24) 1) (the-as uint 0))
|
|
(set! (-> v1-18 base) (&+ (the-as pointer a0-24) 16))
|
|
)
|
|
(dma-buffer-send-chain (the-as dma-bank-source #x10009000) dma-buff)
|
|
)
|
|
(dma-sync (the-as pointer #x10009000) 0 0)
|
|
(if (and main-font-tx
|
|
(-> main-font-tx page)
|
|
(= (-> obj cur) (+ heap-before-font-tex (-> main-font-tx page size)))
|
|
)
|
|
(set! (-> obj cur) heap-before-font-tex)
|
|
(format 0 "ERROR: could not resize heap to remove gamefont.~%")
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 5 of type texture-page-dir
|
|
;; INFO: Return type mismatch uint vs int.
|
|
(defmethod asize-of texture-page-dir ((obj texture-page-dir))
|
|
(the-as int (+ (-> texture-page-dir size) (* 12 (+ (-> obj length) -1))))
|
|
)
|
|
|
|
;; definition for method 4 of type texture-page-dir
|
|
(defmethod length texture-page-dir ((obj texture-page-dir))
|
|
(-> obj length)
|
|
)
|
|
|
|
;; definition for method 7 of type texture-page-dir
|
|
;; INFO: Return type mismatch texture-page-dir vs none.
|
|
(defmethod relocate texture-page-dir ((obj texture-page-dir) (arg0 kheap) (arg1 (pointer uint8)))
|
|
(set! *texture-page-dir* obj)
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 12 of type texture-page
|
|
;; INFO: Return type mismatch texture-page vs none.
|
|
(defmethod relocate-dests! texture-page ((obj texture-page) (new-dest int) (seg-id int))
|
|
(let ((v1-0 (shr new-dest 6))
|
|
(dst-block (shr (-> obj segment seg-id dest) 6))
|
|
)
|
|
(when (!= v1-0 dst-block)
|
|
(dotimes (tex-id (-> obj length))
|
|
(when (-> obj data tex-id)
|
|
(let* ((tex (-> obj data tex-id))
|
|
(num-mips (-> tex num-mips))
|
|
)
|
|
(if (zero? seg-id)
|
|
(set! (-> tex clutdest) (+ (- (-> tex clutdest) dst-block) v1-0))
|
|
)
|
|
(dotimes (mip-id (the-as int num-mips))
|
|
(let ((t4-0 mip-id)
|
|
(t5-0 num-mips)
|
|
)
|
|
(if (= seg-id (if (>= (the-as uint 2) t5-0)
|
|
(+ (- -1 t4-0) t5-0)
|
|
(max 0 (- 2 t4-0))
|
|
)
|
|
)
|
|
(set! (-> tex dest mip-id) (+ (- (-> tex dest mip-id) dst-block) v1-0))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> obj segment seg-id dest) (the-as uint new-dest))
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 7 of type texture-page
|
|
;; INFO: Return type mismatch texture-page vs none.
|
|
(defmethod relocate texture-page ((obj texture-page) (arg0 kheap) (arg1 (pointer uint8)))
|
|
(local-vars (s4-0 texture-page-dir-entry))
|
|
(cond
|
|
((or (not obj) (not (file-info-correct-version? (-> obj info) (file-kind tpage) 0)))
|
|
(set! obj (the-as texture-page #f))
|
|
)
|
|
((begin
|
|
(let ((v1-2 (-> *level* loading-level)))
|
|
(when v1-2
|
|
(set! (-> v1-2 loaded-texture-page (-> v1-2 loaded-texture-page-count)) obj)
|
|
(+! (-> v1-2 loaded-texture-page-count) 1)
|
|
)
|
|
)
|
|
(set! (-> obj segment 1 dest) (-> obj segment 0 size))
|
|
(set! (-> obj segment 2 dest) (+ (-> obj segment 0 size) (-> obj segment 1 size)))
|
|
(let ((a3-0 (-> obj id)))
|
|
(set! s4-0 (-> *texture-page-dir* entries a3-0))
|
|
(set! (-> *texture-relocate-later* memcpy) #f)
|
|
((-> *texture-pool* allocate-func) *texture-pool* obj arg0 (the-as int a3-0))
|
|
)
|
|
(not (-> *texture-relocate-later* memcpy))
|
|
)
|
|
(set! (-> s4-0 page) obj)
|
|
(if (not (-> s4-0 link))
|
|
(set! (-> s4-0 link)
|
|
(the-as texture-link (malloc 'loading-level (* (max (-> s4-0 length) (-> obj length)) 4)))
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(let ((v1-19 *texture-relocate-later*))
|
|
(set! (-> v1-19 entry) s4-0)
|
|
(set! (-> v1-19 page) obj)
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; definition for function relocate-later
|
|
(defun relocate-later ()
|
|
(let ((gp-0 *texture-relocate-later*))
|
|
(let ((s5-0 (-> gp-0 entry))
|
|
(s4-0 (-> gp-0 page))
|
|
)
|
|
(ultimate-memcpy (the-as pointer (-> gp-0 dest)) (the-as pointer (-> gp-0 source)) (-> gp-0 move))
|
|
(set! (-> s5-0 page) s4-0)
|
|
(if (not (-> s5-0 link))
|
|
(set! (-> s5-0 link)
|
|
(the-as texture-link (malloc 'loading-level (* (max (-> s5-0 length) (-> s4-0 length)) 4)))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> gp-0 memcpy) #f)
|
|
)
|
|
#f
|
|
)
|
|
|
|
;; definition for function texture-page-login
|
|
(defun texture-page-login ((id texture-id) (alloc-func (function texture-pool texture-page kheap int texture-page)) (heap kheap))
|
|
(when (and (nonzero? (-> id page)) (< (-> id page) (the-as uint (-> *texture-page-dir* length))))
|
|
(let ((dir-entry (-> *texture-page-dir* entries (-> id page))))
|
|
(when (not (-> dir-entry page))
|
|
(let ((old-alloc-func (-> *texture-pool* allocate-func)))
|
|
(set! (-> *texture-pool* allocate-func) alloc-func)
|
|
(let* ((file-name (make-file-name (file-kind tpage) (the-as string (* (-> id page) 8)) 0 #f))
|
|
(s2-0 (the-as texture-page (loado file-name heap)))
|
|
)
|
|
(if s2-0
|
|
(relocate s2-0 heap (charp-basename (-> file-name data)))
|
|
)
|
|
)
|
|
(set! (-> *texture-pool* allocate-func) old-alloc-func)
|
|
)
|
|
)
|
|
dir-entry
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function lookup-texture-by-id
|
|
(defun lookup-texture-by-id ((arg0 texture-id))
|
|
(let ((v1-0 (texture-page-login arg0 texture-page-default-allocate loading-level)))
|
|
(if (and v1-0 (< (-> arg0 index) (the-as uint (-> v1-0 page length))))
|
|
(-> v1-0 page data (-> arg0 index))
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for method 20 of type texture-pool
|
|
(defmethod unload! texture-pool ((obj texture-pool) (arg0 texture-page))
|
|
(local-vars (a0-2 int))
|
|
(let ((v1-0 *texture-page-dir*))
|
|
(dotimes (a0-1 (-> v1-0 length))
|
|
(when (= arg0 (-> v1-0 entries a0-1 page))
|
|
(set! a0-2 a0-1)
|
|
(goto cfg-7)
|
|
)
|
|
)
|
|
(set! a0-2 -1)
|
|
(label cfg-7)
|
|
(when (>= a0-2 0)
|
|
(set! (-> v1-0 entries a0-2 page) #f)
|
|
(set! (-> v1-0 entries a0-2 link) #f)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
;; definition for symbol *shader-list*, type pair
|
|
(define *shader-list* '())
|
|
|
|
;; definition for symbol *edit-shader*, type texture-id
|
|
(define *edit-shader* (new 'static 'texture-id))
|
|
|
|
;; definition for function link-texture-by-id
|
|
(defun link-texture-by-id ((arg0 texture-id) (arg1 adgif-shader))
|
|
(when (not (or (zero? (-> arg0 page)) (>= (-> arg0 page) (the-as uint (-> *texture-page-dir* length)))))
|
|
(let ((dir-entry (-> *texture-page-dir* entries (-> arg0 page))))
|
|
(if (not (-> dir-entry link))
|
|
(set! (-> dir-entry link) (the-as texture-link (malloc 'loading-level (* (-> dir-entry length) 4))))
|
|
)
|
|
(when (< (-> arg0 index) (the-as uint (-> dir-entry length)))
|
|
(set! (-> arg1 next shader) (-> dir-entry link next (-> arg0 index) shader))
|
|
(set! (-> dir-entry link next (-> arg0 index) shader) (shr (the-as uint arg1) 4))
|
|
)
|
|
dir-entry
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for method 9 of type texture-page-dir
|
|
(defmethod unlink-textures-in-heap! texture-page-dir ((obj texture-page-dir) (heap kheap))
|
|
(local-vars (dist-past-end uint))
|
|
(let ((mem-start (-> heap base))
|
|
(mem-end (-> heap top-base))
|
|
)
|
|
(dotimes (entry-idx (-> obj length))
|
|
(let* ((entry (-> obj entries entry-idx))
|
|
(tex-page (-> entry page))
|
|
(link-arr (-> entry link next))
|
|
(tex-count (min (-> tex-page length) (-> entry length)))
|
|
)
|
|
0
|
|
(when link-arr
|
|
(dotimes (tex-idx tex-count)
|
|
(let ((link-slot (&-> link-arr 0))
|
|
(shader (the-as adgif-shader (* (-> link-arr 0 shader) 16)))
|
|
)
|
|
(while (nonzero? (the-as uint shader))
|
|
(b!
|
|
(< (the-as int (- (the-as uint shader) (the-as uint mem-start))) 0)
|
|
cfg-7
|
|
:delay
|
|
(set! dist-past-end (- (the-as uint shader) mem-end))
|
|
)
|
|
(b! (>= (the-as int dist-past-end) 0) cfg-7 :delay (nop!))
|
|
(let ((t4-2 (-> shader next)))
|
|
(b! #t cfg-8 :delay (set! (-> link-slot 0) t4-2))
|
|
)
|
|
(label cfg-7)
|
|
(set! link-slot (&-> shader next))
|
|
(label cfg-8)
|
|
(set! shader (the-as adgif-shader (* (-> shader next shader) 16)))
|
|
)
|
|
)
|
|
(set! link-arr (&-> link-arr 1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
;; definition for function adgif-shader<-texture!
|
|
;; ERROR: function was not converted to expressions. Cannot decompile.
|
|
|
|
;; definition for function adgif-shader-update!
|
|
;; INFO: Return type mismatch gs-tex1 vs none.
|
|
(defun adgif-shader-update! ((arg0 adgif-shader) (arg1 texture))
|
|
(let ((s5-0 (the int (/ 256.0 (-> arg1 uv-dist)))))
|
|
(case (-> arg0 tex1 l)
|
|
((1)
|
|
(set! (-> arg0 tex1 k) (+ (logand (ash s5-0 (- 5 (log2 s5-0))) 31) -350 (* (log2 s5-0) 32)))
|
|
)
|
|
(else
|
|
(set! (-> arg0 tex1 k) (+ (logand (ash s5-0 (- 4 (log2 s5-0))) 15) -175 (* (log2 s5-0) 16)))
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; definition for function adgif-shader<-texture-with-update!
|
|
;; ERROR: function was not converted to expressions. Cannot decompile.
|
|
|
|
;; definition for function adgif-shader-login
|
|
(defun adgif-shader-login ((shader adgif-shader))
|
|
(when (logtest? (-> shader link-test) (link-test-flags needs-log-in))
|
|
(logclear! (-> shader link-test) (link-test-flags needs-log-in bit-9))
|
|
(set! (-> shader texture-id) (level-remap-texture (-> shader texture-id)))
|
|
(link-texture-by-id (-> shader texture-id) shader)
|
|
(let ((tex (lookup-texture-by-id (-> shader texture-id))))
|
|
(if tex
|
|
(adgif-shader<-texture-with-update! shader tex)
|
|
(format 0 "login could not find texture ~X in shader ~X~%" (-> shader texture-id) shader)
|
|
)
|
|
tex
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function adgif-shader-login-no-remap
|
|
(defun adgif-shader-login-no-remap ((arg0 adgif-shader))
|
|
(when (logtest? (-> arg0 link-test) (link-test-flags needs-log-in))
|
|
(logclear! (-> arg0 link-test) (link-test-flags needs-log-in bit-9))
|
|
(link-texture-by-id (-> arg0 texture-id) arg0)
|
|
(let ((s5-0 (lookup-texture-by-id (-> arg0 texture-id))))
|
|
(if s5-0
|
|
(adgif-shader<-texture-with-update! arg0 s5-0)
|
|
(format 0 "login could not find texture ~X in shader ~X~%" (-> arg0 texture-id) arg0)
|
|
)
|
|
s5-0
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function adgif-shader-login-fast
|
|
(defun adgif-shader-login-fast ((shader adgif-shader))
|
|
(when (logtest? (-> shader link-test) (link-test-flags needs-log-in))
|
|
(logclear! (-> shader link-test) (link-test-flags needs-log-in bit-9))
|
|
(set! (-> shader texture-id) (level-remap-texture (-> shader texture-id)))
|
|
(let ((tex-id (-> shader texture-id)))
|
|
(when (and (nonzero? (-> tex-id page)) (< (-> tex-id page) (the-as uint (-> *texture-page-dir* length))))
|
|
(let ((dir-entry (-> *texture-page-dir* entries (-> tex-id page))))
|
|
(when (and (< (-> tex-id index) (the-as uint (-> dir-entry length))) (-> dir-entry link))
|
|
(set! (-> shader next shader) (-> dir-entry link next (-> tex-id index) shader))
|
|
(set! (-> dir-entry link next (-> tex-id index) shader) (shr (the-as uint shader) 4))
|
|
)
|
|
(when (and (-> dir-entry page) (< (-> tex-id index) (the-as uint (-> dir-entry page length))))
|
|
(let ((tex (-> dir-entry page data (-> tex-id index))))
|
|
(if tex
|
|
(adgif-shader<-texture-with-update! shader tex)
|
|
)
|
|
tex
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; definition for function adgif-shader-login-no-remap-fast
|
|
(defun adgif-shader-login-no-remap-fast ((arg0 adgif-shader))
|
|
(when (logtest? (-> arg0 link-test) (link-test-flags needs-log-in))
|
|
(logclear! (-> arg0 link-test) (link-test-flags needs-log-in bit-9))
|
|
(let ((v1-4 (-> arg0 texture-id)))
|
|
(when (and (nonzero? (-> v1-4 page)) (< (-> v1-4 page) (the-as uint (-> *texture-page-dir* length))))
|
|
(let ((a1-7 (-> *texture-page-dir* entries (-> v1-4 page))))
|
|
(when (and (< (-> v1-4 index) (the-as uint (-> a1-7 length))) (-> a1-7 link))
|
|
(set! (-> arg0 next shader) (-> a1-7 link next (-> v1-4 index) shader))
|
|
(set! (-> a1-7 link next (-> v1-4 index) shader) (shr (the-as uint arg0) 4))
|
|
)
|
|
(when (and (-> a1-7 page) (< (-> v1-4 index) (the-as uint (-> a1-7 page length))))
|
|
(let ((gp-0 (-> a1-7 page data (-> v1-4 index))))
|
|
(if gp-0
|
|
(adgif-shader<-texture-with-update! arg0 gp-0)
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; failed to figure out what this is:
|
|
(when (not *debug-segment*)
|
|
(set! adgif-shader-login adgif-shader-login-fast)
|
|
(set! adgif-shader-login-no-remap adgif-shader-login-no-remap-fast)
|
|
)
|
|
|
|
;; definition for function adgif-shader<-texture-simple!
|
|
(defun adgif-shader<-texture-simple! ((arg0 adgif-shader) (arg1 texture))
|
|
(set! (-> arg0 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1))
|
|
(set! (-> arg0 tex0) (the-as gs-tex0 (logand (the-as uint (-> arg0 tex0)) (the-as uint #xffffffe7ffffffff))))
|
|
(if arg1
|
|
(adgif-shader<-texture! arg0 arg1)
|
|
)
|
|
(set! (-> arg0 clamp) (new 'static 'gs-clamp :wms (gs-tex-wrap-mode clamp) :wmt (gs-tex-wrap-mode clamp)))
|
|
(set! (-> arg0 alpha) (new 'static 'gs-alpha :b #x1 :d #x1))
|
|
(set! (-> arg0 prims 1) (gs-reg64 tex0-1))
|
|
(set! (-> arg0 prims 3) (gs-reg64 tex1-1))
|
|
(set! (-> arg0 prims 5) (gs-reg64 miptbp1-1))
|
|
(set! (-> arg0 clamp-reg) (gs-reg64 clamp-1))
|
|
(set! (-> arg0 prims 9) (gs-reg64 alpha-1))
|
|
arg0
|
|
)
|
|
|
|
;; definition (debug) for function texture-page-dir-inspect
|
|
;; INFO: Return type mismatch texture-page-dir vs none.
|
|
(defun-debug texture-page-dir-inspect ((dir texture-page-dir) (mode symbol))
|
|
(format #t "[~8x] ~A~%" dir (-> dir type))
|
|
(let ((pool *texture-pool*))
|
|
(format
|
|
#t
|
|
"~Ttexture pool (~DK used, ~DK free)~%"
|
|
(/ (- (-> pool cur) (-> pool top)) 256)
|
|
(/ (- #xa0000 (-> pool cur)) 256)
|
|
)
|
|
)
|
|
(dotimes (level-idx (-> *level* length))
|
|
(let ((lev (-> *level* level level-idx)))
|
|
(if (= (-> lev status) 'active)
|
|
(texture-page-size-check *texture-pool* lev #f)
|
|
)
|
|
)
|
|
)
|
|
(format #t "~Tlength: ~D~%" (-> dir length))
|
|
(format #t "~Tdata[~D]: @ #x~X~%" (-> dir length) (-> dir entries))
|
|
(dotimes (entry-idx (-> dir length))
|
|
(let ((entry-page (-> dir entries entry-idx page))
|
|
(entry-link (-> dir entries entry-idx link))
|
|
)
|
|
(cond
|
|
(entry-page
|
|
(format
|
|
#t
|
|
"~T [~3D] loaded ~S ~A~%"
|
|
entry-idx
|
|
(if entry-link
|
|
" linked"
|
|
"unlinked"
|
|
)
|
|
entry-page
|
|
)
|
|
)
|
|
(else
|
|
(if (= mode 'full)
|
|
(format
|
|
#t
|
|
"~T [~3D] unloaded ~S #<texture-page :length ~D>~%"
|
|
entry-idx
|
|
(if entry-link
|
|
" linked"
|
|
"unlinked"
|
|
)
|
|
(-> dir entries entry-idx length)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (and (or entry-page entry-link) mode)
|
|
(dotimes (entry-list-length (-> dir entries entry-idx length))
|
|
(cond
|
|
((not entry-link)
|
|
(format #t "~T [~3D] unlinked" entry-list-length)
|
|
)
|
|
((zero? (-> entry-link next entry-list-length shader))
|
|
(format #t "~T [~3D] UNUSED " entry-list-length)
|
|
)
|
|
(else
|
|
(let ((t9-9 format)
|
|
(a0-12 #t)
|
|
(a1-10 "~T [~3D] ~3D links ")
|
|
(a2-11 entry-list-length)
|
|
(a3-7 0)
|
|
)
|
|
(let ((v1-40 (the-as object (* (-> entry-link next entry-list-length shader) 16))))
|
|
(while (nonzero? (the-as uint v1-40))
|
|
(nop!)
|
|
(+! a3-7 1)
|
|
(set! v1-40 (* (-> (the-as adgif-shader v1-40) next shader) 16))
|
|
)
|
|
)
|
|
(t9-9 a0-12 a1-10 a2-11 a3-7)
|
|
)
|
|
)
|
|
)
|
|
(cond
|
|
((not entry-page)
|
|
(format #t " unloaded~%")
|
|
)
|
|
((not (-> entry-page data entry-list-length))
|
|
(format #t " empty~%")
|
|
)
|
|
(else
|
|
(format #t " ~A~%" (-> entry-page data entry-list-length))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
;; definition for method 3 of type texture-page-dir
|
|
(defmethod inspect texture-page-dir ((obj texture-page-dir))
|
|
(texture-page-dir-inspect obj #f)
|
|
obj
|
|
)
|
|
|
|
;; definition for symbol *texture-pool*, type texture-pool
|
|
(define *texture-pool* (new 'global 'texture-pool))
|