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