summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/dev/grf_ultms.g
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/amiga/dev/grf_ultms.g')
-rw-r--r--sys/arch/amiga/dev/grf_ultms.g483
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
+;;;