3. Программа для работы с графическим процессором приставки SONY PLAYSTATION ; Программа печати текста на экране Playstation ; с использованием возможностей ; графического процессора использует шрифт из файла font.bin ; PrintGPU_Dma создает список примитивов, передаваемый ; с использованием прямого доступа к памяти. ; PrintGPU ожидает готовности графического процессора ; и рисует без использования прямого доступа ; к памяти. ; Работает медленнее, но не требует памяти ; для создания списка примитивов. org $80010000 ; Инициализация аппаратуры. lui a0, $0800 ; Инициализация GPU, jal InitGPU ; команда 8. ori а0,а0,$0009 ; биты 0 и 1 = 01 - ширина экрана 320, ; бит 3 = 1- режим = PAL. la a0,back ; Рисование фона, jal SendList nop jal Loadfont ; Загрузка шрифта, nop ; Рисование с использованием прямого доступа к памяти. la a0,textl ; a0 = указатель на строку, li al,$00200018 ; a1 : у«16|х (у=$2 0, х=$2 0) . li а2,$00808080 ; а2 : фон = 808080 = белый, jal PrintGPU_dma ; Создание списка примитивов, nop jal SendList ; Передача с использованием ПДП. or a0,zero,v0 ; Рисование без использования прямого доступа к памяти, la a0,text2 ; a0 = указатель на строку, li al,$00600018 ; a1 : у«16|х (у=$2 0, х=$20) . li а2, $00208080 ; а2 : фон = 808080 = белый. jal PrintGPU ; Рисование. nop self j self nop textl db "Here",$27,'s yar stuff printed.',$0a,$0d, 'Next line' db $0a,'Just a linefeed.',$00 text2 db "And here",$27,'s some more text in yellow',$2c db $0d,$0a,'printed without DMA.' align 4 dw $0 ; Подпрограммы работы с GPU GP0 equ $1810 GP1 equ $1814 DPCR equ $10f0 DICR equ $10f4 D2_MADR equ $10a0 D2_BCR equ $10a4 D2_CHCR equ $10a8 ; InitGPU - основная процедура инициализации ; Параметр: a0 - режим экрана InitGPU lui fp,$lf80 or t0,zero,rа sw zero, GP1(fp) ; Сброс процессора (команда 0). li t1, $05000000 jal WaitGPU nop sw t1, GPl(fp) li t1, $06ca0220 ; Размер по горизонтали (команда 6). sw t1, GPl(fp) ; $|06|ca0|220 = 336 точек. li t1, $0704b81e ; Размер по вертикали (команда 7). sw t1, GPl(fp) ; Начало = $1e, конец = $12e = 272 точки. sw a0, GP1(fp) ; Установка режима, nop li t1, $el0006cf ; Задание параметров рисования. sw t1, GP0(fp) ; DFE = $1 (разрешено рисование в области экрана). ; DTD = $1 (включен режим смешивания цветов). ; TP = $1 (используется 8-разрядное кодирование цвета в текстурах). ; ABR = $0 (расчет полупрозрачности по формуле 0,5F + 0,5В). ; TY = $0 (координата у памяти текстур = 0 х 256 = 0). ; ТХ = $f (координата х памяти текстур = 15 х 64 = 960) . li t1, $еЗ000000 ; Установка верхнего левого угла sw t1, GP0(fp) ; области рисования. li t1, $e407429f ; Установка правого нижнего угла sw t1, GP0(fp) ; области рисования. ; X = bit $09 - $00 = $014f $29f. ; Y = bit $13 - $0a = $0110 $110. li t1, $e5000000 sw t1, GP0(fp) li t1, $03000000 ; Разрешение вывода изображения. sw t1, GPl(fp) or ra,zero,t0 jr ra nop ; SendList - передача списка примитивов ; Параметр: a0 - адрес списка SendList lui fp,$lf80 or t0, zero, ra li t2, $04000002 jal WaitGPU nop lw t3, DPCR(fp) sw zero, DICR(fp) ori t3, t3, $0800 sw t3, DPCR(fp) sw t2, GPl(fp) sw a0, D2_MADR(fp) sw zero, D2_BCR(fp) li tl, $01000401 sw t1, D2_CHCR(fp) or ra, zero, t0 jr ra nop ; MemtoVRAM - передача графических данных в видеопамять ; in: a0 - адрес данных ; al - координаты х, у (у << 16 | х) ; а2 - высота и ширина w, h (h << 16 | w) ; аЗ - количество копируемых слов MemtoVRAM or t4,zero,ra ; Сохранение регистра RA. jal WaitDone ; Ожидание освобождения видеопроцессора. nop or t5,zero,a0 ; Сохранение стартового адреса данных, lui at,mvll sw al,mvll(at) ; Установка координат области отображения, sw a2,mvl2(at) ; Установка размеров области отображения, lui a0,mvl ; Передача установок, jal SendList ori a0,a0,mvl sll tl,a3,$10 ; Установка количества блоков. ori tl,tl,$0001 ; Установка размера блока равным слову. li t2,$01000201 ; Контроллер ПДП передает данные ; из памяти в видеопамять. jal WaitDMA ; Ожидание освобождения контроллера. пор sw t5,D2_MADR(fp) ; Установка базового адреса. sw tl,D2_BCR(fp) sw t2,D2_CHCR(fp) ; Запуск ПДП or ra, zero, t4 jr ra nop mvl dw $04ffffff dw $01000000 dw $a0000000 mvl1 dw $00000000 mvl2 dw $00000000 ; WaitGPU - ожидание готовности GPU к приему команд WaitGPU lui fp,$lf80 lw v1, GP1(fp) ; Загрузка регистра состояния GPU. lui v0, $1000 ; Проверка разряда $1c. and v1, v1, v0 beqz v1, WaitGPU ; Пока разряд равен 0, GPU занят, nop jr ra nop ; Waitldle - ожидание, пока GPU простаивает WaitIdle lui fp,$lf80 lui v1, $0400 widl lw v0, GP1(fp) nop and v0, v0, v1 beqz v0, widl nop jr ra nop ; WaitDone - ожидание освобождения контроллера ПДП и GPU WaitDone lui fp, $lf80 wdl lw v0, D2_CHCR(fp) lui vl, $0100 and v0, v0, vl bne v0, zero, wdl nop wd2 lw v0, GP1(fp) lui v1l, $0400 and v0, v0, vl beq v0, zero, WaitDone nop jr ra nop ; WaitDMA - ожидание освобождения контроллера ПДП WaitDMA lui fp, $lf80 wdmalp lw v0, D2_CHCR(fp) lui vl, $0100 and v0, v0, v1 bne v0, zero, wdmalp nop jr ra nop txtDMA equ $0000 txtRGB equ $0004 txtX equ $0008 txtY equ $000a txtU equ $000c txtV equ $000d txtClut equ $000e ; PrintGPU_dma - печать строки с использованием контроллера ПДП ; Параметры: а0 - указатель на печатаемую строку, ; a1 - координаты печати, а2 - цвет ; Результат: v0 - указатель на список примитивов PrintGPU_dma sw a1,cXY ; Сохранение координат. lui v0,$7400 ; Установка параметров. or t2,a2,v0 li t3, 511<<6 la t0,list2 ; t0 = указатель на элемент ; связанного списка. lui v0,$00ff ; t1 = указатель на следующий элемент ; для контроллера ПДП. ori v0,v0,$ffff and tl,t0,v0 lui v0,$0300 or tl,tl,v0 addiu tl,tl,$0010 lh t5,cY lh t4,cX addiu t6,t5,$08 lbu v0,$0000(a0) ; Получение символа. nop slti vl,v0,$0020 beq vl,zero,pgpuloop nop jr ra addiu v0,zero,-1 pgpuloop ; Поиск координат текстуры. andi vl,v0,$001f sll vl,vl,3 srl v0,v0,5 sll v0,v0,4 sw t1,txtDMA(t0) ; Установка указателя для контроллера ПДП. sw t2,txtRGB(t0) sh t4,txtX(t0) ; Установка координат. sh t5,txtY(t0) sb vl,txtU(t0) ; Установка ширины и высоты. sb v0,txtV(t0) sh t3,txtClut(t0) ; Задание цветовой таблицы. addiu t0,t0,$10 ; Задание указателя на следующий элемент. addiu t1,t1,$10 addiu v0,v0,$08 sw t1,txtDMA(t0) sw t2,txtRGB(t0) sh t4,txtX(t0) sh t6,txtY(t0) sb v1,txtU(t0) sb v0,txtV(t0) addiu t4,t4,$08 addiu a0,a0,$01 ; Следующий символ. lbu vO,$0000(a0) sh t3,txtClut(t0) ; Цветовая таблица. pgpuchk slti vl,v0,$002 0 ; Управляющий символ? bgtz vl,pgpucommand ; Переход к обработке команды. nop addiu t0,t0,$10 ; Обновление указателей, j pgpuloop addiu t1,t1,$10 pgpudone li tl,$03ffffff ; Завершение списка, sw tl,txtDMA(t0) la v0,list ; Возврат адреса списка, jr ra nop pgpucommand beq v0,zero,pgpudone ; Конец строки? ori v1,zero,$000a ; Новая строка = $0a. beq v0,v1,pgpuLF ori v1,zero,$000d ; Возврат каретки = $0d. beq v0,vl,pgpuCR nop pgpunxt addiu a0,a0,$0001 ; Неизвестная команда? lbu v0,$0000(a0) j pgpuchk ; Пропустить, nop pgpuLF addiu t6,t6,$0010 ; Обработка новой строки. j pgpunxt ; Переход к следующему символу. addiu t5,t5,$0010 pgpuCR lw t4,cX ; Обработка возврата каретки. j pgpunxt ; Переход к следующему символу. nop cXY сХ dh $0 cY dh $0 ; PrintGPU - печать текста без использования контроллера ПДП ; Параметры: а0 - указатель на строку, ; a1 - координаты строки, ; а2 - цвет PrintGPU or t0,zero,ra ; Сохранение адреса возврата. li t1,$el00060f li t2,$04000000 ; Выключение контроллера ПДП. jal WaitDone nop sw t2,GP1(fp) nop sw t1(GP0(fp) ; Указание страницы текстур. sw a1,c2XY ; Сохранение координат. lui v0,$7400 or t1,a2,v0 lui t2, 511<<6 lh t4,c2Y lh t3,c2X addiu t5,t4,$08 lbu v0,$0000(a0) ; Получение символа. nop slti vl,v0,$0020 bne vl,zero,p2gpucommand nop p2gpuloop ; Поиск координат текстуры. andi vl,v0,$001f sll vl,vl,3 srl v0,v0,5 sll v0,v0,4 sll t9,v0,$8 or t9,t9,vl or t9,t9,t2 addiu v0,v0,$08 sll t6,v0,$8 or t6,t6,vl or t6,t6,t2 sll t8,t4,$10 or t8,t8,t3 jal WaitGPU nop sw tl,GP0(fp) sw t8,GP0(fp) sw t9,GP0(fp) sll t8,t5,$10 or t8,t8,t3 jal WaitGPU nop sw tl,GP0(fp) ; Пересылка данных. sw t8,GP0(fp) sw t6,GP0(fp) addiu t3,t3,$08 p2gpunxt addiu a0,a0,$01 ; Переход к следующему символу. lbu v0,$0000(a0) nop slti v1,v0,$0020 ; Управляющий символ? bgtz v1,p2gpucommand nop j p2gpuloop ; Переход к рисованию следующего символа. nop p2gpudone or ra,zero,t0 ; Возврат, если все напечатано. jr ra nop p2gpucommand beq v0,zero,p2gpudone ; Конец строки? ori v1,zero,$000a beq v0,v1,p2gpuLF ; Обработка новой строки, ori v1,zero,$000d beq v0,v1,p2gpuCR ; Обработка возврата каретки. Nop ; Пропуск неизвестного символа j p2gpunxt p2gpuLF addiu t4,t4,$0010 ; Обработка перевода строки. j p2gpunxt ; Y = Y + $10. addiu t5,t5,$0010 p2gpuCR lw t3,c2X ; Обработка возврата каретки. j p2gpunxt ; X = start X. nop c2XY c2X dh $0 c2Y dh $0 ; Загрузка шрифта в видеопамять. Loadfont or s0,zero,ra la a0,img li al,$000003c0 li a2,$00400040 li a3,$00000800 jal MemtoVRAM nop la a0,clut li al,$01ff0000 li a2,$00010010 li a3,$00000008 jal MemtoVRAM nop or ra,zero,s0 jr ra nop ; Область памяти для списка, back dw back2 ,back2>>8 ,back2>>16 , $03 dw $02000000 dw $000003c0 dw $010000fe back2 dw $08ffffff dw $38300040 dw $00000000 dw $00250010 dw $00000150 dw $00250010 dw $01100000 dw $00800000 dw $01100150 list db list2 ,list2»8 ,list2»16, $01 dw $el00060f list2 dw $0 ; Рабочие данные. Таблица цветов и изображение шрифта clut dh $0000,$7fff,$7fff,$7fff,$7fff,$7fff,$7fff,$7fff dh $7fff,$7fff,$7fff,$7fff,$7fff,$7fff,$7fff,$7fff img incbin font.bin ; Шрифт. |