diff options
Diffstat (limited to 'sys/arch/amiga/dev/grf_ultms.g')
-rw-r--r-- | sys/arch/amiga/dev/grf_ultms.g | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/sys/arch/amiga/dev/grf_ultms.g b/sys/arch/amiga/dev/grf_ultms.g new file mode 100644 index 00000000000..502af7b3323 --- /dev/null +++ b/sys/arch/amiga/dev/grf_ultms.g @@ -0,0 +1,483 @@ +; +; ite support for A2410. + +; +; Copyright (c) 1995 Ignatios Souvatzis. +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; 1. Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; 3. All advertising materials mentioning features or use of this software +; must display the following acknowledgement: +; 4. The name of the author may not be used to endorse or promote products +; derived from this software withough specific prior written permission +; +; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +; This file contains the source code for grf_ultmscode.h. It is +; assembler code for the TMS34010 CPU/graphics processor. +; +; Use Paul Mackerras' gspa assembler to transfer it to hex format, then +; Ignatios Souvatzis' hex2c utility (available from the author) or a small +; perl script to transform that into the form of grf_ultmscode.h. +; +; A modified gspa for this purpose will be released as soon as this +; procedure is cleaned up. +; + +; memory map: +; FF800000 .. FF9FFFFF overlay planes +; FFA00000 .. FFA0FFFF ite support code +; FFA10000 .. FFA1FFFF ite support, input queue +; FFA20000 .. FFA2FEFF variables +; FFA2FF00 .. FFA2FFFF variables, X server +; FFA30000 .. FFA3FFFF font data +; FFA40000 .. FFA4FFFF font data, bold +; FFA50000 .. FFA5FFFF X server, input queue +; FFA60000 .. FFFFC000 X server, onboard pixmaps + +; Start of data area + .org $FFA20000 +d: + +; +; Ring buffer for getting stuff from host +; Data buffer: +inbuf = $FFA10000 ; 64kbits here (8k bytes) +; +; Pointers: (these must be at address $FFA20000) +put: .long inbuf +get: .long inbuf + +; +; Mode bits for communication between GSP and CPU +; +; GSP mode bits: set by CPU, control GSP operation +GSP_HOLD = 0 +GSP_FLUSH = 1 +GSP_ALT_SCRN = 2 +GSP_DISP_CTRL = 3 +GSP_NO_CURSOR = 4 +GSP_CALL_X = 5 +gsp_mode: .word 0 + +; +; Pointer to X operation routine +xproc: .long 0 + +; We leave the next few words for future communication requirements + + .org d+0x100 +; +; Other data: +magic: .blkl 1 ; set => screen already inited +MAGIC = 0xD0D0BEAC + +screen_width: .word 1024 +screen_height: .word 768 +screen_origin: .long $FE000000 ; just a placeholder +screen_pitch: .word 8192 ; 1024*8 +pixel_size: .word 8 + + .org d+0x200 +font_adr: +; +; Font information is stored in the structure defined declared below. +; +bitmap_ptrs: .long $FFA30000 ; points to first bitmap +font_size: .long $00080008 ; Y:X bitmap size +under_row: .word 6 ; row # for underlines +under_ht: .word 1 ; thickness of underline +first_char: .word 32 ; first and last char in font +last_char: .word 255 ; +bold_smear: .word 1 ; for making bold fonts + +bgcolor: .long 0 ; background color +fgcolor: .long $01010101 ; foreground color +;precomputed out of what the host gave us: +font_area: .word 64 ; in pixels +font_pitch: .word 8 +font_lmo: .word 28 + + +; Control register addresses +hesync = $c0000000 +dpyctl = $c0000080 +control = $c00000b0 +convsp = $c0000130 +convdp = $c0000140 +psize = $c0000150 + +; +; Bits in control register +T = $20 ; enable transparency +W = $C0 ; window options +PBH = $100 ; pixblt horiz dirn +PBV = $200 ; pixblt vertical dirn +PPOP = $7C00 ; pixel processing options + +; +; Bits in dpyctl register +SRT = $800 ; do serial register transfers + +free_memory: .long free_memory_start +free_memory_start: ; allocate dynamic arrays from here + +; +; Program starts here. + .org $FFA00000 + .start . + +; +; initialization +; + setf 16,0,0 ; just in case + setf 32,0,1 + move $fffff000,sp + +; Set up sync, blank parameters +; done by host through interface + +; set up overlay clut: + move $0,a0 + move a0,@$fe800000 + move $fe800030,a1 + move 128,a0 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move 0,a0 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move a0,*a1 + move a0,*a1 + +; set up overlay planes: + move 6,a0 + move a0,@$fe800000 + move $0b,a0 + move a0,@$fe800020 + +; set up global registers + move @screen_pitch,b3,0 + move @screen_origin,b4,1 + move @bgcolor,b8,1 + lmo b3,b0 + move b0,@convdp,0 + move @control,a0,0 + andn $7FE0,a0 ; clear PPOP, PBV, PBH, W, T fields + move a0,@control,0 + move @pixel_size,a0,0 + move a0,@psize,0 + move @psize,a0,0 + + +; clear the entire screen + move b4,b2 + move 0,b9 + move @screen_width,b7,1 + fill l + +4: +; main stuff... + move @get,a0,1 + jruc main_loop +loop_end: + clr a4 + move a4,*a0,0 + addxy a1,a0 + move a0,@get,1 +main_loop: + move @gsp_mode,a1,0 + btst GSP_CALL_X,a1 + jreq main_loop_1 + + mmtm sp,a0,a1,a2,a3 + move @xproc,a4,1 + call a4 + mmfm sp,a0,a1,a2,a3 + +main_loop_1: + move @put,a3,1 + move *a0,a1,0 + + move a1,a2 + andi $FFF0,a1 + jrz main_loop + + sub a0,a3 + jreq main_loop +continue: + andi $F,a2 + jrz loop_end + dec a2 + jrnz testfor2 +; op 1 - char + movk 6,b10 + move b10,@$fe800000,0 + movk 1,b10 + move b10,@$fe800020,0 + + move a0,b10 + move *b10+,b12,0 ; dummy move (faster than addk) + move *b10+,b12,0 ; char code + move @first_char,b11,0 + sub b11,b12 ; minus first char in font + move @font_size,b7,1 ;dydx - char size->pixel array dimensions + move @font_pitch,b1 + move @font_lmo,b0 + move b0,@convsp,0 + move @font_area,b11 + + mpyu b12,b11 ; times char offset + move @font_adr,b0,1 ; font bitmaps base + add b11,b0 ; character bitmap start addr. linear + + move *b10+,b8,0 ; fg + move *b10+,b9,0 ; bg + move *b10+,b2,1 ; y:x + + move *b10+,b11,0 ; flags + move b11,a4 + btst 0,a4 + jreq noinv + move b8,b11 + move b9,b8 + move b11,b9 +noinv: + btst 2,a4 + jreq nobold + addi $10000,b0 +nobold: + move b2,a5 + pixblt b,xy + move a5,b2 + + btst 1,a4 + jreq noul + move @under_row,b11,0 + sll 16,b11 ; shift into Y half + add b11,b2 + move @under_ht,b11,0 + sll 16,b11 ; shift into Y half + movy b11,b7 ; and move Y half only + fill xy +noul: + jruc loop_end +testfor2: + dec a2 + jrnz testfor3 +; op 2 - fill + move a0,b10 + move *b10+,b9,0 ; dummy move + move *b10+,b9,0 ; color + move *b10+,b2,1 ; XY start address + move *b10+,b7,1 ; dydx + + move @control,b0,0 + move b0,*-sp + move *b10+,b0 + setf 5,0,0 + move b0,@control+10 + setf 16,0,0 + move @control,b0,0 + + fill xy + + move *sp+,b0 + move b0,@control,0 + jruc loop_end,l + +testfor3: + dec a2 + jrnz testfor4 +; op 3 - pixblt + move a0,b10 + move @convdp,@convsp,0 + move *b10+,b0,0 ; dummy move + move *b10+,b0,1 ; XY src + move *b10+,b7,1 ; dxdy + move *b10+,b2,1 ; XY dst + move b3,b1 + move @control,b11,0 + andni PBH|PBV,b11 + cmpxy b0,b2 + jrc yok + ori PBV,b11 +yok: jrv xok + ori PBH,b11 +xok: move b11,@control,0 + move @control,b11,0 + + pixblt xy,xy + jruc loop_end,l + +testfor4: + dec a2 + jrnz testfor5 + +; op 4 - mirror the font and precompute some values. + + move @font_size,a5,0 + movk 8,a6 + cmp a6,a5 + jrle t4b8 + movi 16, a6 +t4b8: move a6,@font_pitch,0 + lmo a5,a6 + move a6,@font_lmo,0 + move @font_size+$10,a6,0 + move @font_pitch,a5,0 + mpyu a6,a5 + move a5,@font_area,0 + + move @last_char,a6,0 + move @first_char,a5,0 + sub a5,a6 + addk 1,a6 + move @font_size+$10,a5,0 + mpyu a6,a5 + move @font_size,a7,0 + cmpi 8,a7 + move $7f7f,a12 ; mask for bold smearing + jrgt t4bf ; wider than 8 pixels? + addk 1,a5 ; yes, the words are only half the # of rows + srl 1,a5 + move $7fff,a12 ; mask for bold smearing changes, too +t4bf: move @font_adr,a6,1 + move a6,a9 + addi $10000,a9 ; start address of bold font + move @bold_smear,a10 + +; fortunately, this loop fits into 3 of the 4 cache segments: +; execution time: about 32 periods per word of font. + +mirlp: move *a6,a7 + clr a8 + + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + srl 1,a7 + addc a8,a8 + + move a8,*a6+ + move a8,a7 + move a10,a11 +smearlp: + and a12,a7 + sll 1,a7 + or a7,a8 + dsj a11,smearlp + move a8,*a9+ + + dsj a5,mirlp +;; support odd-sized fonts. pitch must still be 8 or 16 + move @font_size,a5,0 + move @font_pitch,a6,0 + sub a5,a6 + move @font_adr,a5,1 + add a5,a6 + move a6,@font_adr,1 +;; + jruc loop_end,l + + +testfor5: + dec a2 + jrne testfor6 +; loadclut --- load clut entry. +; 1==overlay index red green blue +; for speed reasons, the host will load the image clut directly rather +; than through us, but its not that expensive to support both here +; just in case + move a0,a4 + addk $10,a4 + move $fe800030,a6 + move *a4+,a5,0 + jrne t5l1 + subk $20,a6 +t5l1: move *a4+,a5,0 + move a5,@$fe800000,0 + move *a4+,a5,0 + move a5,*a6,0 + move *a4+,a5,0 + move a5,*a6,0 + move *a4+,a5,0 + move a5,*a6,0 + jruc loop_end,l + +testfor6: + dec a2 + jrne testfor7 + +; op 6: load new framebuffer size and position for ite support. + move a0,b10 + addk $10,b10 + move *b10+,b7,1 + move b7,@screen_width,1 + move *b10+,b4,1 + move b4,@screen_origin,1 + move *b10+,b3,0 + move b3,@screen_pitch,0 + lmo b3,b0 + move b0,@convdp,0 + move *b10,b0,0 + move b0,@psize,0 + move b0,@pixel_size,0 ; this syncs the psize write, too + + jruc loop_end,l + +testfor7: + jruc loop_end,l +;;; |