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

Last change on this file since b8080f6 was 4f508e6, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Converted assembly language files.

  • Property mode set to 100644
File size: 4.7 KB
RevLine 
[4f508e6]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| ------------------------------------------------------------------------------
[f40a309]22 .text
[4f508e6]23
[f40a309]24 .xdef _vvputsv
[4f508e6]25
26| Argument offsets from a6:
27
28OBASE = 8 | LONG - Output area base address
29NW = 12 | WORD - Character width of output area
30FG = 14 | WORD - Foreground color
31BG = 16 | WORD - Background color
32ROW = 18 | WORD - Row
33COL = 20 | WORD - Column
34STR = 22 | LONG - String base address
35PITCH = 26 | WORD - Vertical spacing between rows
36HT = 28 | WORD - Character height (LE PITCH)
37CGTAB = 30 | LONG - Character generator table
38
39| Program constant definitions:
40
41HPIX = 8 | Character width in pixels
42HCW = 4 | Horizontal character width (bytes)
43PSHIFT = 12 | Pixel shift into MS bits
44HSHIFT = 4 | Pixel right shift
45
[f40a309]46 .page
[4f508e6]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
[f40a309]68 .page
[4f508e6]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
[f40a309]105 .page
[4f508e6]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
[f40a309]148 .end
Note: See TracBrowser for help on using the repository browser.