[109c83b] | 1 | * ------------------------------------------------------------------------------
|
---|
| 2 | * glcplot.s -- plot a pixel on the LCD display
|
---|
| 3 | * Version 2 -- 1987-04-23 -- D.N. Lynx Crowe
|
---|
| 4 | * (c) Copyright 1987 -- D.N. Lynx Crowe
|
---|
| 5 | *
|
---|
| 6 | * GLCplot(x, y, val)
|
---|
| 7 | * unsigned x, y, val);
|
---|
| 8 | *
|
---|
| 9 | * Plot a pixel at ('x', 'y') using lcdbase as the plane address
|
---|
| 10 | * in GLC RAM. If 'val' is zero, the pixel is cleared,
|
---|
| 11 | * otherwise the pixel is cleared. No error checking is done.
|
---|
| 12 | * Limits: 0 LE x LE 511, 0 LE y LE 63.
|
---|
| 13 | * ------------------------------------------------------------------------------
|
---|
| 14 | .text
|
---|
| 15 | *
|
---|
| 16 | .xdef _GLCplot
|
---|
| 17 | .xref _lcd_a0,_lcd_a1,_lcdbase
|
---|
| 18 | *
|
---|
| 19 | XLOC .equ 8 * 'x' parameter offset
|
---|
| 20 | YLOC .equ 10 * 'y' parameter offset
|
---|
| 21 | VAL .equ 12 * 'val' parameter offset
|
---|
| 22 | *
|
---|
| 23 | G_CRSWR .equ $46 * GLC set cursor command
|
---|
| 24 | G_MWRITE .equ $42 * GLC write command
|
---|
| 25 | G_MREAD .equ $43 * GLC read command
|
---|
| 26 | *
|
---|
| 27 | .page
|
---|
| 28 | *
|
---|
| 29 | _GLCplot: link a6,#0 * Link stack frames
|
---|
| 30 | moveq #63,d0 * d0 = (63-y) * 85
|
---|
| 31 | sub.w YLOC(a6),d0 * ...
|
---|
| 32 | mulu #85,d0 * ...
|
---|
| 33 | clr.l d1 * d1 = x/6
|
---|
| 34 | move.w XLOC(a6),d1 * ...
|
---|
| 35 | divu #6,d1 * ...
|
---|
| 36 | add.w d1,d0 * d0 = (63-y)*85 + (x/6)
|
---|
| 37 | swap d1 * d2 = 7 - (x%6) % 8
|
---|
| 38 | moveq #7,d2 * ...
|
---|
| 39 | sub.w d1,d2 * ...
|
---|
| 40 | andi.w #7,d2 * ...
|
---|
| 41 | lsr.w #3,d1 * d1 = (x%6) / 8
|
---|
| 42 | add.w d1,d0 * d0 = cursor address
|
---|
| 43 | add.w _lcdbase,d0 * ...
|
---|
| 44 | move.w d0,d1 * d1 = cursor address, too
|
---|
| 45 | move.b #G_CRSWR,_lcd_a1 * Send cursor address to GLC
|
---|
| 46 | move.b d0,_lcd_a0 * ...
|
---|
| 47 | lsr.w #8,d0 * ...
|
---|
| 48 | move.b d0,_lcd_a0 * ...
|
---|
| 49 | move.b #G_MREAD,_lcd_a1 * Read old pixel byte
|
---|
| 50 | move.b _lcd_a1,d0 * ... into d0
|
---|
| 51 | tst.w VAL(a6) * Check val for zero
|
---|
| 52 | beq glcplt1 * Jump if val EQ 0
|
---|
| 53 | *
|
---|
| 54 | bset d2,d0 * Set the pixel to 1
|
---|
| 55 | bra glcplt2 * Go write pixel to GLC
|
---|
| 56 | *
|
---|
| 57 | glcplt1: bclr d2,d0 * Clear the pixel to 0
|
---|
| 58 | *
|
---|
| 59 | glcplt2: move.b #G_CRSWR,_lcd_a1 * Send cursor address to GLC
|
---|
| 60 | move.b d1,_lcd_a0 * ...
|
---|
| 61 | lsr.w #8,d1 * ...
|
---|
| 62 | move.b d1,_lcd_a0 * ...
|
---|
| 63 | move.b #G_MWRITE,_lcd_a1 * Setup GLC to write pixel
|
---|
| 64 | move.b d0,_lcd_a0 * Write pixel
|
---|
| 65 | unlk a6 * Unlink stack frames
|
---|
| 66 | rts * Return to caller
|
---|
| 67 | *
|
---|
| 68 | .end
|
---|