source: buchla-68k/vlib/vvputsv.s@ 5f1d169

Last change on this file since 5f1d169 was 109c83b, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Compiled full ROM in Hatari.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1* ------------------------------------------------------------------------------
2* vvputsv.s -- output characters to a 4-bit / pixel graphics window
3* with variable vertical pitch
4* Version 1 -- 1988-10-07 -- D.N. Lynx Crowe
5* (c) Copyright 1988 -- D.N. Lynx Crowe
6* ------------------------------------------------------------------------------
7*
8* vvputsv(obase, nw, fg, bg, row, col, str, pitch, ht, cgtab)
9* uint *obase, nw, fg, bg, row, col, pitch, ht, cgtab[][256];
10* char *str;
11*
12* Outputs characters from the string at 'str' to an 'nw'
13* character wide 4-bit per pixel graphics window at 'obase'
14* at ('row','col'), using 'fg' as the foreground color, and
15* 'bg' as the background color. Uses cgtab[][256] as the
16* VSDD formatted character generator table. Assumes 'ht' line
17* high characters in the cg table. Uses 'pitch' as the vertical
18* spacing between character rows. No error checks are done.
19* The string must fit the output area (no overlaps, single line).
20*
21* ------------------------------------------------------------------------------
22 .text
23*
24 .xdef _vvputsv
25*
26* Argument offsets from a6:
27*
28OBASE .equ 8 * LONG - Output area base address
29NW .equ 12 * WORD - Character width of output area
30FG .equ 14 * WORD - Foreground color
31BG .equ 16 * WORD - Background color
32ROW .equ 18 * WORD - Row
33COL .equ 20 * WORD - Column
34STR .equ 22 * LONG - String base address
35PITCH .equ 26 * WORD - Vertical spacing between rows
36HT .equ 28 * WORD - Character height (LE PITCH)
37CGTAB .equ 30 * LONG - Character generator table
38*
39* Program constant definitions:
40*
41HPIX .equ 8 * Character width in pixels
42HCW .equ 4 * Horizontal character width (bytes)
43PSHIFT .equ 12 * Pixel shift into MS bits
44HSHIFT .equ 4 * Pixel right shift
45*
46 .page
47*
48* Register usage:
49*
50* d0 output word and scratch
51* d1 CG word and scratch
52* d2 pixel counter
53*
54* d3 foreground color (in the 4 ms bits)
55* d4 background color (in the 4 ms bits)
56* d5 width of the area in bytes
57* d6 scan line counter
58*
59* a0 CG table pointer
60* a1 output area scan line pointer
61* a2 input string character pointer
62*
63* a3 output area character base pointer
64*
65* a6 frame pointer
66* a7 stack pointer
67*
68 .page
69*
70_vvputsv: link a6,#0 * Link stack frames
71 movem.l d3-d6/a3,-(a7) * Save registers we use
72 move.w #PSHIFT,d1 * Set shift constant
73 move.w FG(a6),d3 * Setup foreground color
74 lsl.w d1,d3 * ... in ms 4 bits of d3.W
75 move.w BG(a6),d4 * Setup background color
76 lsl.w d1,d4 * ... in ms 4 bits of d4.W
77 move.w NW(a6),d5 * Get line width in d5.W
78 lsl.w #2,d5 * Multiply width by 4 for offset
79 move.w ROW(a6),d0 * Calculate output address
80 move.w PITCH(a6),d1 * ... PITCH
81 mulu d1,d0 * ... * ROW
82 add.w #HT(a6),d0 * ... + HT-1
83 subq.w #1,d0 * ...
84 mulu d5,d0 * ... * NW
85 clr.l d1 * ...
86 move.w COL(a6),d1 * ... +
87 lsl.w #2,d1 * ... COL * 4
88 add.l d1,d0 * ...
89 add.l OBASE(a6),d0 * ... + OBASE
90 movea.l d0,a3 * Leave output address in a3
91 movea.l STR(a6),a2 * Put string address in a2
92*
93cgl0: clr.l d0 * Clear out upper bits of d0
94 move.b (a2)+,d0 * Get next character
95 beq cgl5 * Done if character EQ 0
96*
97 movea.l a3,a1 * Establish output pointer in a1
98 adda.l #HCW,a3 * Update output pointer for next char.
99 movea.l CGTAB(a6),a0 * Establish CG pointer in a0
100 lsl.w #1,d0 * ... 2 * character
101 adda.w d0,a0 * ... + cg table address
102 move.w HT(a6),d6 * Set scan line counter in d6
103 subq.w #1,d6 * ... to HT-1
104*
105 .page
106cgl1: move.w (a0),d1 * Get character generator word in d1
107 move.w #(HPIX/2)-1,d2 * Set pixel counter in d2
108*
109cgl2: lsr.w #HSHIFT,d0 * Shift output word right 1 pixel
110 btst.l #0,d1 * Check CG word ls bit
111 beq cgl3 * Set background color if bit EQ 0
112*
113 or.w d3,d0 * OR foreground color into output word
114 bra cgl4 * Go update CG word
115*
116cgl3: or.w d4,d0 * OR background color into output word
117*
118cgl4: lsr.w #1,d1 * Shift CG word right 1 pixel
119 dbf d2,cgl2 * Loop for first 4 pixels
120*
121 move.w d0,(a1)+ * Store first output word in scan line
122 move.w #(HPIX/2)-1,d2 * Set pixel counter in d2
123*
124cgl2a: lsr.w #HSHIFT,d0 * Shift output word right 1 pixel
125 btst.l #0,d1 * Check CG word ls bit
126 beq cgl3a * Set background color if bit EQ 0
127*
128 or.w d3,d0 * OR foreground color into output word
129 bra cgl4a * Go update CG word
130*
131cgl3a: or.w d4,d0 * OR background color into output word
132*
133cgl4a: lsr.w #1,d1 * Shift CG word right 1 pixel
134 dbf d2,cgl2a * Loop for last 4 pixels
135*
136 move.w d0,(a1) * Store second output word in scan line
137 suba.w d5,a1 * Update output pointer
138 suba.w #2,a1 * ...
139 adda.l #512,a0 * Update CG pointer for next scan line
140 dbf d6,cgl1 * Loop for all scan lines
141*
142 bra cgl0 * Loop for next character
143*
144cgl5: movem.l (a7)+,d3-d6/a3 * Restore registers
145 unlk a6 * Unlink stack frames
146 rts * Return to caller
147*
148 .end
Note: See TracBrowser for help on using the repository browser.