;;-*-Lisp-*- (in-package goal) ;; definition for method 2 of type texture-page (defmethod print texture-page ((obj texture-page)) (format #t "#" (-> 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 "# 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 #~%" 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))