| Routines to interface C to the graphics card in the Prisma
|
| Routines to interface C to the graphics card in the Prisma
|
| These replace the ROM routines.
|
| These replace the ROM routines.
|
|
|
|
|
| 0.1 16/02/99 G.Harvey first created
|
| 0.1 16/02/99 G.Harvey first created
|
| 0.11 19/02/99 G.Harvey optimise line drawing (c_ldraw4())
|
| 0.11 19/02/99 G.Harvey optimise line drawing (c_ldraw4())
|
| 0.2 20/02/99 G.Harvey add read/write pixel
|
| 0.2 20/02/99 G.Harvey add read/write pixel
|
| 0.3 21/02/99 G.Harvey add video init routines
|
| 0.3 21/02/99 G.Harvey add video init routines
|
| 0.4 23/02/99 G.Harvey add r1pix
|
| 0.4 23/02/99 G.Harvey add r1pix
|
| 0.41 26/02/99 G.Harvey add w1pix
|
| 0.41 26/02/99 G.Harvey add w1pix
|
| 0.5 27/02/99 G.Harvey add rd_rect, wr_rect
|
| 0.5 27/02/99 G.Harvey add rd_rect, wr_rect
|
| 0.51 02/03/99 G.Harvey add wr_rect5
|
| 0.51 02/03/99 G.Harvey add wr_rect5
|
|
|
| Base addr of GC video buffer control registers
|
| Base addr of GC video buffer control registers
|
|
|
GC_BASE = 0x200440
|
GC_BASE = 0x200440
|
|
|
| GC Video Buffer write registers (offsets from the base addr)
|
| GC Video Buffer write registers (offsets from the base addr)
|
|
|
GCW_CE = 0x00 | chip enable
|
GCW_CE = 0x00 | chip enable
|
GCW_PSEL = 0x04 | plane select
|
GCW_PSEL = 0x04 | plane select
|
GCW_INTEN = 0x08 | intensity write data
|
GCW_INTEN = 0x08 | intensity write data
|
GCW_CMD = 0x0c | command
|
GCW_CMD = 0x0c | command
|
GCW_CMAP = 0x10 | colour map address / data
|
GCW_CMAP = 0x10 | colour map address / data
|
GCW_DAC = 0x14 | DAC / video control
|
GCW_DAC = 0x14 | DAC / video control
|
GCW_PY_SM = 0x18 | pixel Y address / start single mem cycle
|
GCW_PY_SM = 0x18 | pixel Y address / start single mem cycle
|
GCW_IN_SM = 0x1c | intensity write data / start single mem cycle
|
GCW_IN_SM = 0x1c | intensity write data / start single mem cycle
|
GCW_PX_SL = 0x20 | pixel X address / start line
|
GCW_PX_SL = 0x20 | pixel X address / start line
|
GCW_PX_SM = 0x24 | pixel X address / start single mem cycle
|
GCW_PX_SM = 0x24 | pixel X address / start single mem cycle
|
GCW_PY = 0x28 | pixel Y address
|
GCW_PY = 0x28 | pixel Y address
|
GCW_PX = 0x2c | pixel X address
|
GCW_PX = 0x2c | pixel X address
|
GCW_LG1 = 0x30 | line generation algorithm
|
GCW_LG1 = 0x30 | line generation algorithm
|
GCW_LG2 = 0x34 | line generation algorithm
|
GCW_LG2 = 0x34 | line generation algorithm
|
GCW_LG3 = 0x38 | line generation algorithm
|
GCW_LG3 = 0x38 | line generation algorithm
|
GCW_LG4 = 0x3c | line generation algorithm
|
GCW_LG4 = 0x3c | line generation algorithm
|
|
|
| GC Video Buffer read registers (offsets from the base addr)
|
| GC Video Buffer read registers (offsets from the base addr)
|
|
|
GCR_INTEN = 0x00 | read intensity
|
GCR_INTEN = 0x00 | read intensity
|
GCR_RESV = 0x04 | reserved
|
GCR_RESV = 0x04 | reserved
|
GCR_CMAP = 0x08 | read colour map
|
GCR_CMAP = 0x08 | read colour map
|
GCR_STATUS = 0x0c | read VBUSY, VBLANK status
|
GCR_STATUS = 0x0c | read VBUSY, VBLANK status
|
GCR_IN_SM = 0x10 | read intensity / start single mem cycle
|
GCR_IN_SM = 0x10 | read intensity / start single mem cycle
|
|
|
.text
|
.text
|
|
|
| Video init 1
|
| Video init 1
|
| from LAB_0367 at 0x00104760
|
| from LAB_0367 at 0x00104760
|
|
|
.even
|
.even
|
.globl init_scr
|
.globl init_scr
|
init_scr:
|
init_scr:
|
init1:
|
init1:
|
movel d0,sp@-
|
movel d0,sp@-
|
movel a0,sp@-
|
movel a0,sp@-
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
clrl a0@(GCW_LG3)
|
clrl a0@(GCW_LG3)
|
tstl a0@(524) | 0x20064c - CMD reg but inhibit command
|
tstl a0@(524) | 0x20064c - CMD reg but inhibit command
|
init1_1:
|
init1_1:
|
btst #6,a0@(524) | GCR_STATUS with command inhibit
|
btst #6,a0@(524) | GCR_STATUS with command inhibit
|
beq init1_1 | wait for VBLANK ?
|
beq init1_1 | wait for VBLANK ?
|
init1_2:
|
init1_2:
|
btst #5,a0@(524) | GCR_STATUS
|
btst #5,a0@(524) | GCR_STATUS
|
bne init1_2 | VBLANK ?
|
bne init1_2 | VBLANK ?
|
clrl a0@(GCW_CMAP) | colour map
|
clrl a0@(GCW_CMAP) | colour map
|
moveq #0x17,d0
|
moveq #0x17,d0
|
clrl a0@(GCW_CMAP)
|
clrl a0@(GCW_CMAP)
|
movel d0,a0@(GCW_DAC)
|
movel d0,a0@(GCW_DAC)
|
moveq #0x1b,d0
|
moveq #0x1b,d0
|
clrl a0@(GCW_CMAP)
|
clrl a0@(GCW_CMAP)
|
movel d0,a0@(GCW_DAC)
|
movel d0,a0@(GCW_DAC)
|
moveq #0x1f,d0
|
moveq #0x1f,d0
|
clrl a0@(GCW_CMAP)
|
clrl a0@(GCW_CMAP)
|
movel d0,a0@(GCW_DAC)
|
movel d0,a0@(GCW_DAC)
|
moveq #6,d0
|
moveq #6,d0
|
moveb d0,init_flag1 | ??
|
moveb d0,init_flag1 | ??
|
moveq #7,d0
|
moveq #7,d0
|
moveb d0,line_flag
|
moveb d0,line_flag
|
clrl d0
|
clrl d0
|
moveb line_flag,d1
|
moveb line_flag,d1
|
btst #2,d1
|
btst #2,d1
|
beq init1_3
|
beq init1_3
|
orw #0x100,d0
|
orw #0x100,d0
|
init1_3:
|
init1_3:
|
notb d1
|
notb d1
|
andb #3,d1
|
andb #3,d1
|
orb d1,d0
|
orb d1,d0
|
clrl d1
|
clrl d1
|
moveb init_flag1,d1
|
moveb init_flag1,d1
|
lsll #5,d1
|
lsll #5,d1
|
orl d1,d0
|
orl d1,d0
|
movel d0,a0@(GCW_DAC)
|
movel d0,a0@(GCW_DAC)
|
movel #0x1ff,line_selmask
|
movel #0x1ff,line_selmask
|
bsr init3
|
bsr init3
|
bsr init2
|
bsr init2
|
moveal sp@+,a0
|
moveal sp@+,a0
|
movel sp@+,d0
|
movel sp@+,d0
|
rts
|
rts
|
|
|
| Video init 2
|
| Video init 2
|
| LAB_036B at 0x0010047f4
|
| LAB_036B at 0x0010047f4
|
|
|
.even
|
.even
|
init2:
|
init2:
|
link a6,#0
|
link a6,#0
|
moveml d2-d7/a2-a5,sp@-
|
moveml d2-d7/a2-a5,sp@-
|
moveal #0x118808,a3
|
moveal #0x118808,a3
|
clrw init_flag2
|
clrw init_flag2
|
init2_1:
|
init2_1:
|
moveq #0x10,d0
|
moveq #0x10,d0
|
cmpw init_flag2,d0
|
cmpw init_flag2,d0
|
ble init2_7
|
ble init2_7
|
movew init_flag2,init_flag3
|
movew init_flag2,init_flag3
|
moveb a3@+,d7
|
moveb a3@+,d7
|
andw #0xff,d7
|
andw #0xff,d7
|
moveb a3@+,d6
|
moveb a3@+,d6
|
extw d6
|
extw d6
|
moveb a3@+,d5
|
moveb a3@+,d5
|
andw #0xff,d5
|
andw #0xff,d5
|
moveb a3@+,d4
|
moveb a3@+,d4
|
extw d4
|
extw d4
|
moveb a3@+,d3
|
moveb a3@+,d3
|
andw 0xff,d3
|
andw 0xff,d3
|
moveb a3@+,d2
|
moveb a3@+,d2
|
extw d2
|
extw d2
|
moveal init_flag4,a2
|
moveal init_flag4,a2
|
clrw init_flag5
|
clrw init_flag5
|
init2_2:
|
init2_2:
|
moveq #16,d0
|
moveq #16,d0
|
cmpw init_flag5,d0 | 06F4
|
cmpw init_flag5,d0 | 06F4
|
ble init2_6
|
ble init2_6
|
movew init_flag3,d1 | 06F8
|
movew init_flag3,d1 | 06F8
|
extl d1
|
extl d1
|
moveq #24,d0
|
moveq #24,d0
|
lsll d0,d1
|
lsll d0,d1
|
movel d1,init_flag6 | 6F0
|
movel d1,init_flag6 | 6F0
|
movew d7,d1
|
movew d7,d1
|
extl d1
|
extl d1
|
moveq #16,d0
|
moveq #16,d0
|
lsll d0,d1
|
lsll d0,d1
|
orl d1,init_flag6 | 6F0
|
orl d1,init_flag6 | 6F0
|
movew d5,d1
|
movew d5,d1
|
extl d1
|
extl d1
|
lsll #8,d1
|
lsll #8,d1
|
orl d1,init_flag6 | 6F0
|
orl d1,init_flag6 | 6F0
|
movew d3,d1
|
movew d3,d1
|
extl d1
|
extl d1
|
orl d1,init_flag6
|
orl d1,init_flag6
|
movel init_flag6,a2@+ | store map entry in table
|
movel init_flag6,a2@+ | store map entry in table
|
movew d7,d1
|
movew d7,d1
|
extl d1
|
extl d1
|
movew d6,d0
|
movew d6,d0
|
extl d0
|
extl d0
|
addl d0,d1
|
addl d0,d1
|
movew d1,d7
|
movew d1,d7
|
movew d5,d0
|
movew d5,d0
|
extl d0
|
extl d0
|
movew d4,d1
|
movew d4,d1
|
extl d1
|
extl d1
|
addl d1,d0
|
addl d1,d0
|
movew d0,d5
|
movew d0,d5
|
movew d3,d0
|
movew d3,d0
|
extl d0
|
extl d0
|
movew d2,d1
|
movew d2,d1
|
extl d1
|
extl d1
|
addl d1,d0
|
addl d1,d0
|
movew d0,d3
|
movew d0,d3
|
cmpw #0xff,d7
|
cmpw #0xff,d7
|
ble init2_3
|
ble init2_3
|
movew #0xff,d7
|
movew #0xff,d7
|
init2_3:
|
init2_3:
|
cmpw #0xff,d5
|
cmpw #0xff,d5
|
ble init2_4
|
ble init2_4
|
movew #0xff,d5
|
movew #0xff,d5
|
init2_4:
|
init2_4:
|
cmpw #0xff,d3
|
cmpw #0xff,d3
|
ble init2_5
|
ble init2_5
|
movew #0xff,d3
|
movew #0xff,d3
|
init2_5:
|
init2_5:
|
moveq #16,d0
|
moveq #16,d0
|
addw d0,init_flag3 | 06F8
|
addw d0,init_flag3 | 06F8
|
addqw #1,init_flag5 | 06F4
|
addqw #1,init_flag5 | 06F4
|
bra init2_2
|
bra init2_2
|
init2_6:
|
init2_6:
|
pea init_flag4 | start of colour map
|
pea init_flag4 | start of colour map
|
moveq #16,d0 | no. of entries
|
moveq #16,d0 | no. of entries
|
movel d0,sp@-
|
movel d0,sp@-
|
bsr c_pcmap | write colour map to video board
|
bsr c_pcmap | write colour map to video board
|
addql #8,sp
|
addql #8,sp
|
addqw #1,init_flag2 | 06F6
|
addqw #1,init_flag2 | 06F6
|
bra init2_1
|
bra init2_1
|
init2_7:
|
init2_7:
|
moveml sp@+,d2-d7/a2-a5
|
moveml sp@+,d2-d7/a2-a5
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
|
|
| C entry to program the colour map
|
| C entry to program the colour map
|
| c_pcmap(int len, int *map)
|
| c_pcmap(int len, int *map)
|
|
|
|
|
| the format of the map appears to be an array of longwords, each word
|
| the format of the map appears to be an array of longwords, each word
|
| contains an index value and the values for R, G and B, all 8 bits.
|
| contains an index value and the values for R, G and B, all 8 bits.
|
| Format is: :INDEX:RED:GREEN:BLUE:
|
| Format is: :INDEX:RED:GREEN:BLUE:
|
|
|
.even
|
.even
|
.globl c_pcmap
|
.globl c_pcmap
|
c_pcmap:
|
c_pcmap:
|
link a6,#0
|
link a6,#0
|
movel a5,sp@-
|
movel a5,sp@-
|
movel d7,sp@-
|
movel d7,sp@-
|
moveal a6@(12),a5 | point to colour map
|
moveal a6@(12),a5 | point to colour map
|
movel a6@(8),d7 | no. of entries
|
movel a6@(8),d7 | no. of entries
|
bsr pcmap1
|
bsr pcmap1
|
movel sp@+,d7
|
movel sp@+,d7
|
moveal sp@+,a5
|
moveal sp@+,a5
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| program colour map 1
|
| program colour map 1
|
| looks like you can only set a maximum of 127 entries at a time
|
| looks like you can only set a maximum of 127 entries at a time
|
|
|
.even
|
.even
|
pcmap1:
|
pcmap1:
|
moveml d0-d7/a0-a6,sp@-
|
moveml d0-d7/a0-a6,sp@-
|
moveq #0x17,d0
|
moveq #0x17,d0
|
moveq #0x1b,d1
|
moveq #0x1b,d1
|
moveq #0x1f,d2
|
moveq #0x1f,d2
|
subql #1,d7
|
subql #1,d7
|
btst #7,d7
|
btst #7,d7
|
bne pcmap1_1 | bra if more than 127 entries
|
bne pcmap1_1 | bra if more than 127 entries
|
bsr pcmap2
|
bsr pcmap2
|
bra pcmap1_2 | done
|
bra pcmap1_2 | done
|
pcmap1_1:
|
pcmap1_1:
|
subl #0x7f,d7
|
subl #0x7f,d7
|
movel d7,sp@-
|
movel d7,sp@-
|
moveq #0x7f,d7
|
moveq #0x7f,d7
|
bsr pcmap2 | first 127 entries
|
bsr pcmap2 | first 127 entries
|
movel sp@+,d7
|
movel sp@+,d7
|
bsr pcmap2 | remainder of entries
|
bsr pcmap2 | remainder of entries
|
pcmap1_2:
|
pcmap1_2:
|
moveml sp@+,d0-d7/a0-a6
|
moveml sp@+,d0-d7/a0-a6
|
rts
|
rts
|
|
|
| program colour map 2
|
| program colour map 2
|
| this subroutine actually writes to the colour map on the video
|
| this subroutine actually writes to the colour map on the video
|
| board
|
| board
|
|
|
.even
|
.even
|
pcmap2:
|
pcmap2:
|
lea GC_BASE,a0 | pint to control registers
|
lea GC_BASE,a0 | pint to control registers
|
tstl a0@(524) | wait for VBLANK
|
tstl a0@(524) | wait for VBLANK
|
pcmap2_1:
|
pcmap2_1:
|
btst #6,a0@(524)
|
btst #6,a0@(524)
|
beq pcmap2_1
|
beq pcmap2_1
|
pcmap2_2:
|
pcmap2_2:
|
btst #6,a0@(524)
|
btst #6,a0@(524)
|
bne pcmap2_2
|
bne pcmap2_2
|
pcmap2_3:
|
pcmap2_3:
|
movel a5@+,d3 | map entry
|
movel a5@+,d3 | map entry
|
movew d3,d5
|
movew d3,d5
|
swap d3
|
swap d3
|
movel d5,d4
|
movel d5,d4
|
rorl #8,d4
|
rorl #8,d4
|
movel d3,a0@(GCW_CMAP) | upper 8 bits is addr, lower is data
|
movel d3,a0@(GCW_CMAP) | upper 8 bits is addr, lower is data
|
movel d0,a0@(GCW_DAC) | write RED
|
movel d0,a0@(GCW_DAC) | write RED
|
moveb d4,d3
|
moveb d4,d3
|
movel d3,a0@(GCW_CMAP)
|
movel d3,a0@(GCW_CMAP)
|
movel d1,a0@(GCW_DAC) | write GREEN
|
movel d1,a0@(GCW_DAC) | write GREEN
|
moveb d5,d3
|
moveb d5,d3
|
movel d3,a0@(GCW_CMAP)
|
movel d3,a0@(GCW_CMAP)
|
movel d2,a0@(GCW_DAC) | write BLUE
|
movel d2,a0@(GCW_DAC) | write BLUE
|
tstw d7
|
tstw d7
|
dbeq d7,pcmap2_3 | loop
|
dbeq d7,pcmap2_3 | loop
|
clrl a0@(GCW_CMAP)
|
clrl a0@(GCW_CMAP)
|
clrl d0
|
clrl d0
|
| moveb line_flag,d1
|
| moveb line_flag,d1
|
moveb #7,d1 | line_flag when ROM monitor active
|
moveb #7,d1 | line_flag when ROM monitor active
|
btst #2,d1
|
btst #2,d1
|
beq pcmap2_4
|
beq pcmap2_4
|
orw #0x100,d0 | overlay on
|
orw #0x100,d0 | overlay on
|
pcmap2_4:
|
pcmap2_4:
|
notb d1
|
notb d1
|
andb #3,d1
|
andb #3,d1
|
orb d1,d0
|
orb d1,d0
|
clrl d1
|
clrl d1
|
| moveb init_flag1,d1
|
| moveb init_flag1,d1
|
moveb #6,d1 | init_flag1 when ROM monitor active
|
moveb #6,d1 | init_flag1 when ROM monitor active
|
lsll #5,d1 | overlay colour ?
|
lsll #5,d1 | overlay colour ?
|
orl d1,d0
|
orl d1,d0
|
movel d0,a0@(GCW_DAC) | set overlay colour & operating mode
|
movel d0,a0@(GCW_DAC) | set overlay colour & operating mode
|
rts
|
rts
|
|
|
| Init 3
|
| Init 3
|
| LAB_0389 at 0x001004b0c
|
| LAB_0389 at 0x001004b0c
|
|
|
.even
|
.even
|
init3:
|
init3:
|
moveml d0-d7/a0,sp@-
|
moveml d0-d7/a0,sp@-
|
movel line_selmask,d6
|
movel line_selmask,d6
|
moveq #5,d7
|
moveq #5,d7
|
clrl d0
|
clrl d0
|
clrl d5
|
clrl d5
|
moveq #-1,d1
|
moveq #-1,d1
|
movel d1,d2
|
movel d1,d2
|
movew #0xfb00,d1
|
movew #0xfb00,d1
|
movew #0xf602,d2
|
movew #0xf602,d2
|
movel #0x04fe,d3
|
movel #0x04fe,d3
|
moveq #7,d4
|
moveq #7,d4
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
init3_1:
|
init3_1:
|
movel d0,a0@(GCW_INTEN) | intensity
|
movel d0,a0@(GCW_INTEN) | intensity
|
movel d6,a0@(GCW_PSEL) | plane select
|
movel d6,a0@(GCW_PSEL) | plane select
|
movel #0x0e,a0@(GCW_CMD) | command
|
movel #0x0e,a0@(GCW_CMD) | command
|
movel d1,a0@(GCW_LG2) | line draw
|
movel d1,a0@(GCW_LG2) | line draw
|
movel d0,a0@(GCW_LG1) | line draw
|
movel d0,a0@(GCW_LG1) | line draw
|
movel d2,a0@(GCW_LG2) | line draw
|
movel d2,a0@(GCW_LG2) | line draw
|
movel d3,a0@(GCW_LG3) | line draw
|
movel d3,a0@(GCW_LG3) | line draw
|
movel d4,a0@(GCW_LG4) | line draw
|
movel d4,a0@(GCW_LG4) | line draw
|
movel d5,a0@(GCW_PY) | pixel Y addr
|
movel d5,a0@(GCW_PY) | pixel Y addr
|
movel d0,a0@(GCW_PX_SL) | pixel X addr, start line
|
movel d0,a0@(GCW_PX_SL) | pixel X addr, start line
|
addql #1,d5 | incr Y addr
|
addql #1,d5 | incr Y addr
|
cmpw d7,d5
|
cmpw d7,d5
|
bne init3_1
|
bne init3_1
|
clrl d2
|
clrl d2
|
movel #0x03fc,d3
|
movel #0x03fc,d3
|
moveq #19,d0
|
moveq #19,d0
|
moveq #27,d1
|
moveq #27,d1
|
movel d6,a0@(GCW_PSEL) | plane select
|
movel d6,a0@(GCW_PSEL) | plane select
|
tstl a0@(524) | 0x20064c - CMD reg but inhibit cmd
|
tstl a0@(524) | 0x20064c - CMD reg but inhibit cmd
|
init3_2:
|
init3_2:
|
movel a0@(524),d4
|
movel a0@(524),d4
|
btst #0x1e,d4
|
btst #0x1e,d4
|
beq init3_2
|
beq init3_2
|
init3_3:
|
init3_3:
|
movel a0@(524),d4
|
movel a0@(524),d4
|
btst #0x1e,d4
|
btst #0x1e,d4
|
bne init3_3
|
bne init3_3
|
movel d0,a0@(GCW_CMD) | command
|
movel d0,a0@(GCW_CMD) | command
|
movel d2,a0@(GCW_PY_SM) | pixel Y addr, start mem cycle
|
movel d2,a0@(GCW_PY_SM) | pixel Y addr, start mem cycle
|
init3_4:
|
init3_4:
|
movel d1,a0@(GCW_CMD) | command
|
movel d1,a0@(GCW_CMD) | command
|
movel d3,a0@(GCW_PY_SM) | pixel Y addr, start mem cycle
|
movel d3,a0@(GCW_PY_SM) | pixel Y addr, start mem cycle
|
subql #4,d3
|
subql #4,d3
|
bpl init3_4
|
bpl init3_4
|
moveml sp@+,d0-d7/a0
|
moveml sp@+,d0-d7/a0
|
rts
|
rts
|
|
|
| in-lined version of ldraw
|
| in-lined version of ldraw
|
|
|
.even
|
.even
|
.globl c_ldraw4
|
.globl c_ldraw4
|
c_ldraw4:
|
c_ldraw4:
|
link a6,#0
|
link a6,#0
|
moveml d0-d7/a0-a6,sp@-
|
moveml d0-d7/a0-a6,sp@-
|
lea gr_data,a1 | point to data space
|
lea gr_data,a1 | point to data space
|
movel a6@(8),d2 | x1
|
movel a6@(8),d2 | x1
|
movel a6@(12),d3 | y1
|
movel a6@(12),d3 | y1
|
movel a6@(16),d1 | x2
|
movel a6@(16),d1 | x2
|
movel a6@(20),d0 | y2
|
movel a6@(20),d0 | y2
|
moveb #0x03,line_flag | magic number ?
|
moveb #0x03,line_flag | magic number ?
|
|
|
moveq #1,d5
|
moveq #1,d5
|
movel d5,a1@(40) | set x direction flag
|
movel d5,a1@(40) | set x direction flag
|
movel d5,a1@(44) | set y direction flag
|
movel d5,a1@(44) | set y direction flag
|
subl d2,d1 | (d1-d2)->d1, (x2 - x1) -> d1
|
subl d2,d1 | (d1-d2)->d1, (x2 - x1) -> d1
|
movel d1,a1@(16) | delta-x
|
movel d1,a1@(16) | delta-x
|
|
|
subl d3,d0 | (y2 - y1) -> d0
|
subl d3,d0 | (y2 - y1) -> d0
|
movel d0,a1@(20) | delta-y
|
movel d0,a1@(20) | delta-y
|
cmpl d1,d0 | delta-y - delta-x
|
cmpl d1,d0 | delta-y - delta-x
|
bgt ldraw4_6 | bra if delta-y > delta-x
|
bgt ldraw4_6 | bra if delta-y > delta-x
|
movel d5,d0 | set d0 to 1
|
movel d5,d0 | set d0 to 1
|
bra ldraw4_7
|
bra ldraw4_7
|
ldraw4_6:
|
ldraw4_6:
|
clrl d0 | set d0 to 0
|
clrl d0 | set d0 to 0
|
ldraw4_7:
|
ldraw4_7:
|
movel d0,a1@(48) | set to 0 if delta-y > delta-x, else set to 1
|
movel d0,a1@(48) | set to 0 if delta-y > delta-x, else set to 1
|
beq ldraw4_8 | bra if delta-y > delta-x
|
beq ldraw4_8 | bra if delta-y > delta-x
|
movel a1@(20),d5 | delta-y to d5
|
movel a1@(20),d5 | delta-y to d5
|
lsll #1,d5 | shift left (mul by 2)
|
lsll #1,d5 | shift left (mul by 2)
|
movel d5,d4 | copy to d4
|
movel d5,d4 | copy to d4
|
subl a1@(16),d4 | (2 * dy) - dx -> d4
|
subl a1@(16),d4 | (2 * dy) - dx -> d4
|
subl a1@(40),d4 | d4 - xdir -> d4
|
subl a1@(40),d4 | d4 - xdir -> d4
|
movel a1@(16),d6 | dx -> d6
|
movel a1@(16),d6 | dx -> d6
|
movel a1@(20),d7 | dy -> d7
|
movel a1@(20),d7 | dy -> d7
|
subl d6,d7 | dy - dx -> d7
|
subl d6,d7 | dy - dx -> d7
|
lsll #1,d7 | shift left, d7 = ND/NA
|
lsll #1,d7 | shift left, d7 = ND/NA
|
bra ldraw4_9
|
bra ldraw4_9
|
ldraw4_8:
|
ldraw4_8:
|
movel a1@(16),d5 | dx
|
movel a1@(16),d5 | dx
|
lsll #1,d5 | shift left (mul by 2)
|
lsll #1,d5 | shift left (mul by 2)
|
movel d5,d4
|
movel d5,d4
|
subl a1@(20),d4 | (2 * dx) - dy
|
subl a1@(20),d4 | (2 * dx) - dy
|
subl a1@(44),d4 | ydir
|
subl a1@(44),d4 | ydir
|
movel a1@(20),d6 | dy
|
movel a1@(20),d6 | dy
|
movel a1@(16),d7 | dx
|
movel a1@(16),d7 | dx
|
subl d6,d7
|
subl d6,d7
|
lsll #1,d7 | shift left, d7 = ND/NA
|
lsll #1,d7 | shift left, d7 = ND/NA
|
ldraw4_9:
|
ldraw4_9:
|
|
|
| by this point, d4 = ND/NA, d5 = NB
|
| by this point, d4 = ND/NA, d5 = NB
|
|
|
subql #1,d6 | d6 = NC
|
subql #1,d6 | d6 = NC
|
movel a1@(40),d0 | xdir
|
movel a1@(40),d0 | xdir
|
lsll #1,d0
|
lsll #1,d0
|
orl a1@(44),d0 | ydir
|
orl a1@(44),d0 | ydir
|
lsll #1,d0
|
lsll #1,d0
|
orl a1@(48),d0 | SX/SY
|
orl a1@(48),d0 | SX/SY
|
|
|
lea GC_BASE,a0 | point to video control registers
|
lea GC_BASE,a0 | point to video control registers
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel a6@(28),a0@(GCW_PSEL) | plane select
|
movel a6@(28),a0@(GCW_PSEL) | plane select
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
tstl a1@(16)
|
tstl a1@(16)
|
bne ldraw41
|
bne ldraw41
|
tstl a1@(20)
|
tstl a1@(20)
|
bne ldraw41
|
bne ldraw41
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
bra ldraw4_done
|
bra ldraw4_done
|
ldraw41:
|
ldraw41:
|
movel d4,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d4,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d5,a0@(GCW_LG1) | line gen, NB15-NB0
|
movel d5,a0@(GCW_LG1) | line gen, NB15-NB0
|
movel d7,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d7,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d6,a0@(GCW_LG3) | line-gen, NC11-NC0
|
movel d6,a0@(GCW_LG3) | line-gen, NC11-NC0
|
movel d0,a0@(GCW_LG4) | line-gen, SX, SY, XMAJ
|
movel d0,a0@(GCW_LG4) | line-gen, SX, SY, XMAJ
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
ldraw4_done:
|
ldraw4_done:
|
moveml sp@+,d0-d7/a0-a6
|
moveml sp@+,d0-d7/a0-a6
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| in-lined version of ldraw including y loop counter
|
| in-lined version of ldraw including y loop counter
|
|
|
.even
|
.even
|
.globl c_ldraw4y
|
.globl c_ldraw4y
|
c_ldraw4y:
|
c_ldraw4y:
|
link a6,#0
|
link a6,#0
|
moveml d0-d7/a0-a2,sp@-
|
moveml d0-d7/a0-a2,sp@-
|
lea gr_data,a1 | point to data space
|
lea gr_data,a1 | point to data space
|
movel a6@(8),d2 | x1
|
movel a6@(8),d2 | x1
|
movel a6@(12),d3 | y1
|
movel a6@(12),d3 | y1
|
movel a6@(20),a2 | y3
|
movel a6@(20),a2 | y3
|
ldraw4y_1:
|
ldraw4y_1:
|
cmpl d3,a2
|
cmpl d3,a2
|
jge ldraw4y_2
|
jge ldraw4y_2
|
jra ldraw4y_11
|
jra ldraw4y_11
|
ldraw4y_2:
|
ldraw4y_2:
|
movel a6@(16),d1 | x2
|
movel a6@(16),d1 | x2
|
movel a6@(12),d0 | y2 = y1
|
movel a6@(12),d0 | y2 = y1
|
moveb #0x03,line_flag | magic number ?
|
moveb #0x03,line_flag | magic number ?
|
|
|
moveq #1,d5
|
moveq #1,d5
|
movel d5,a1@(40) | set x direction flag
|
movel d5,a1@(40) | set x direction flag
|
movel d5,a1@(44) | set y direction flag
|
movel d5,a1@(44) | set y direction flag
|
subl d2,d1 | (d1-d2)->d1, (x2 - x1) -> d1
|
subl d2,d1 | (d1-d2)->d1, (x2 - x1) -> d1
|
movel d1,a1@(16) | delta-x
|
movel d1,a1@(16) | delta-x
|
|
|
subl d3,d0 | (y2 - y1) -> d0
|
subl d3,d0 | (y2 - y1) -> d0
|
movel d0,a1@(20) | delta-y
|
movel d0,a1@(20) | delta-y
|
cmpl d1,d0 | delta-y - delta-x
|
cmpl d1,d0 | delta-y - delta-x
|
bgt ldraw4y_6 | bra if delta-y > delta-x
|
bgt ldraw4y_6 | bra if delta-y > delta-x
|
movel d5,d0 | set d0 to 1
|
movel d5,d0 | set d0 to 1
|
bra ldraw4y_7
|
bra ldraw4y_7
|
ldraw4y_6:
|
ldraw4y_6:
|
clrl d0 | set d0 to 0
|
clrl d0 | set d0 to 0
|
ldraw4y_7:
|
ldraw4y_7:
|
movel d0,a1@(48) | set to 0 if delta-y > delta-x, else set to 1
|
movel d0,a1@(48) | set to 0 if delta-y > delta-x, else set to 1
|
beq ldraw4y_8 | bra if delta-y > delta-x
|
beq ldraw4y_8 | bra if delta-y > delta-x
|
movel a1@(20),d5 | delta-y to d5
|
movel a1@(20),d5 | delta-y to d5
|
lsll #1,d5 | shift left (mul by 2)
|
lsll #1,d5 | shift left (mul by 2)
|
movel d5,d4 | copy to d4
|
movel d5,d4 | copy to d4
|
subl a1@(16),d4 | (2 * dy) - dx -> d4
|
subl a1@(16),d4 | (2 * dy) - dx -> d4
|
subl a1@(40),d4 | d4 - xdir -> d4
|
subl a1@(40),d4 | d4 - xdir -> d4
|
movel a1@(16),d6 | dx -> d6
|
movel a1@(16),d6 | dx -> d6
|
movel a1@(20),d7 | dy -> d7
|
movel a1@(20),d7 | dy -> d7
|
subl d6,d7 | dy - dx -> d7
|
subl d6,d7 | dy - dx -> d7
|
lsll #1,d7 | shift left, d7 = ND/NA
|
lsll #1,d7 | shift left, d7 = ND/NA
|
bra ldraw4y_9
|
bra ldraw4y_9
|
ldraw4y_8:
|
ldraw4y_8:
|
movel a1@(16),d5 | dx
|
movel a1@(16),d5 | dx
|
lsll #1,d5 | shift left (mul by 2)
|
lsll #1,d5 | shift left (mul by 2)
|
movel d5,d4
|
movel d5,d4
|
subl a1@(20),d4 | (2 * dx) - dy
|
subl a1@(20),d4 | (2 * dx) - dy
|
subl a1@(44),d4 | ydir
|
subl a1@(44),d4 | ydir
|
movel a1@(20),d6 | dy
|
movel a1@(20),d6 | dy
|
movel a1@(16),d7 | dx
|
movel a1@(16),d7 | dx
|
subl d6,d7
|
subl d6,d7
|
lsll #1,d7 | shift left, d7 = ND/NA
|
lsll #1,d7 | shift left, d7 = ND/NA
|
ldraw4y_9:
|
ldraw4y_9:
|
|
|
| by this point, d4 = ND/NA, d5 = NB
|
| by this point, d4 = ND/NA, d5 = NB
|
|
|
subql #1,d6 | d6 = NC
|
subql #1,d6 | d6 = NC
|
movel a1@(40),d0 | xdir
|
movel a1@(40),d0 | xdir
|
lsll #1,d0
|
lsll #1,d0
|
orl a1@(44),d0 | ydir
|
orl a1@(44),d0 | ydir
|
lsll #1,d0
|
lsll #1,d0
|
orl a1@(48),d0 | SX/SY
|
orl a1@(48),d0 | SX/SY
|
|
|
lea GC_BASE,a0 | point to video control registers
|
lea GC_BASE,a0 | point to video control registers
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel #0xff,a0@(GCW_PSEL) | plane select
|
movel #0xff,a0@(GCW_PSEL) | plane select
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
tstl a1@(16)
|
tstl a1@(16)
|
bne ldraw4y_10
|
bne ldraw4y_10
|
tstl a1@(20)
|
tstl a1@(20)
|
bne ldraw4y_10
|
bne ldraw4y_10
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
bra ldraw4y_done
|
bra ldraw4y_done
|
ldraw4y_10:
|
ldraw4y_10:
|
movel d4,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d4,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d5,a0@(GCW_LG1) | line gen, NB15-NB0
|
movel d5,a0@(GCW_LG1) | line gen, NB15-NB0
|
movel d7,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d7,a0@(GCW_LG2) | line gen, ND15-ND0
|
movel d6,a0@(GCW_LG3) | line-gen, NC11-NC0
|
movel d6,a0@(GCW_LG3) | line-gen, NC11-NC0
|
movel d0,a0@(GCW_LG4) | line-gen, SX, SY, XMAJ
|
movel d0,a0@(GCW_LG4) | line-gen, SX, SY, XMAJ
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
ldraw4y_done:
|
ldraw4y_done:
|
addql #1,d3 | y++
|
addql #1,d3 | y++
|
jra ldraw4y_1
|
jra ldraw4y_1
|
ldraw4y_11:
|
ldraw4y_11:
|
moveml sp@+,d0-d7/a0-a2
|
moveml sp@+,d0-d7/a0-a2
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
|
|
| in-lined version of ldraw including y loop counter
|
| in-lined version of ldraw including y loop counter
|
| this version optimised for horizontal lines
|
| this version optimised for horizontal lines
|
|
|
.even
|
.even
|
.globl c_ldraw5y
|
.globl c_ldraw5y
|
c_ldraw5y:
|
c_ldraw5y:
|
link a6,#0
|
link a6,#0
|
moveml d0-d7/a0-a2,sp@-
|
moveml d0-d7/a0-a2,sp@-
|
lea gr_data,a1 | point to data space
|
lea gr_data,a1 | point to data space
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel #0xff,a0@(GCW_PSEL) | plane select
|
movel #0xff,a0@(GCW_PSEL) | plane select
|
movel a6@(8),d2 | x1
|
movel a6@(8),d2 | x1
|
movel a6@(12),d3 | y1
|
movel a6@(12),d3 | y1
|
movel a6@(16),d1 | x2
|
movel a6@(16),d1 | x2
|
movel a6@(20),a2 | y2
|
movel a6@(20),a2 | y2
|
|
|
subl d2,d1 | (x2 - x1) -> d1
|
subl d2,d1 | (x2 - x1) -> d1
|
clrl d4 | d4 = (2 * dy) = NA
|
clrl d4 | d4 = (2 * dy) = NA
|
clrl d5 | d5 = (2 * dy) = NB
|
clrl d5 | d5 = (2 * dy) = NB
|
subl d1,d4 | (2 * dy) - dx -> d4
|
subl d1,d4 | (2 * dy) - dx -> d4
|
subql #1,d4 | d4 - SX -> d4
|
subql #1,d4 | d4 - SX -> d4
|
movel d1,d6 | dx -> d6
|
movel d1,d6 | dx -> d6
|
movel d5,d7 | dy -> d7
|
movel d5,d7 | dy -> d7
|
subl d6,d7 | dy - dx -> d7
|
subl d6,d7 | dy - dx -> d7
|
lsll #1,d7 | shift left, d7 = ND
|
lsll #1,d7 | shift left, d7 = ND
|
|
|
| by this point, d4 = ND, d5 = NB
|
| by this point, d4 = ND, d5 = NB
|
|
|
subql #1,d6 | d6 = NC
|
subql #1,d6 | d6 = NC
|
moveq #7,d0 | SX, SY, XMAJ
|
moveq #7,d0 | SX, SY, XMAJ
|
|
|
| we are drawing a series of horizontal lines, all the same length
|
| we are drawing a series of horizontal lines, all the same length
|
| so no need to re-calculate all the magic numbers each time
|
| so no need to re-calculate all the magic numbers each time
|
|
|
ldraw5y_1:
|
ldraw5y_1:
|
cmpl d3,a2 | y1 <= y2
|
cmpl d3,a2 | y1 <= y2
|
jge ldraw5y_2
|
jge ldraw5y_2
|
jra ldraw5y_12
|
jra ldraw5y_12
|
ldraw5y_2:
|
ldraw5y_2:
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
tstl d1 | dx
|
tstl d1 | dx
|
bne ldraw5y_10
|
bne ldraw5y_10
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
bra ldraw5y_11
|
bra ldraw5y_11
|
ldraw5y_10:
|
ldraw5y_10:
|
movel d4,a0@(GCW_LG2) | NA
|
movel d4,a0@(GCW_LG2) | NA
|
movel d5,a0@(GCW_LG1) | NB
|
movel d5,a0@(GCW_LG1) | NB
|
movel d7,a0@(GCW_LG2) | ND
|
movel d7,a0@(GCW_LG2) | ND
|
movel d6,a0@(GCW_LG3) | NC
|
movel d6,a0@(GCW_LG3) | NC
|
movel d0,a0@(GCW_LG4) | SX, SY, XMAJ
|
movel d0,a0@(GCW_LG4) | SX, SY, XMAJ
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
ldraw5y_11:
|
ldraw5y_11:
|
addql #1,d3 | y++
|
addql #1,d3 | y++
|
jra ldraw5y_1
|
jra ldraw5y_1
|
ldraw5y_12:
|
ldraw5y_12:
|
moveml sp@+,d0-d7/a0-a2
|
moveml sp@+,d0-d7/a0-a2
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| in-lined version of ldraw including x loop counter
|
| in-lined version of ldraw including x loop counter
|
| this version optimised for vertical lines
|
| this version optimised for vertical lines
|
|
|
.even
|
.even
|
.globl c_ldraw5x
|
.globl c_ldraw5x
|
c_ldraw5x:
|
c_ldraw5x:
|
link a6,#0
|
link a6,#0
|
moveml d0-d7/a0-a2,sp@-
|
moveml d0-d7/a0-a2,sp@-
|
lea gr_data,a1 | point to data space
|
lea gr_data,a1 | point to data space
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel a6@(24),a0@(GCW_INTEN) | intensity
|
movel #0xff,a0@(GCW_PSEL) | plane select
|
movel #0xff,a0@(GCW_PSEL) | plane select
|
movel a6@(8),d2 | x1
|
movel a6@(8),d2 | x1
|
movel a6@(12),d3 | y1
|
movel a6@(12),d3 | y1
|
movel a6@(20),d1 | y2
|
movel a6@(20),d1 | y2
|
movel a6@(16),a2 | x2
|
movel a6@(16),a2 | x2
|
|
|
subl d3,d1 | (y2 - y1) -> d1
|
subl d3,d1 | (y2 - y1) -> d1
|
clrl d4 | d4 = (2 * dx) = NA
|
clrl d4 | d4 = (2 * dx) = NA
|
clrl d5 | d5 = (2 * dx) = NB
|
clrl d5 | d5 = (2 * dx) = NB
|
subl d1,d4 | (2 * dx) - dy -> d4
|
subl d1,d4 | (2 * dx) - dy -> d4
|
subql #1,d4 | d4 - SY -> d4
|
subql #1,d4 | d4 - SY -> d4
|
movel d1,d6 | dy -> d6
|
movel d1,d6 | dy -> d6
|
movel d5,d7 | dx -> d7
|
movel d5,d7 | dx -> d7
|
subl d6,d7 | dx - dy -> d7
|
subl d6,d7 | dx - dy -> d7
|
lsll #1,d7 | shift left, d7 = ND
|
lsll #1,d7 | shift left, d7 = ND
|
|
|
| by this point, d4 = ND, d5 = NB
|
| by this point, d4 = ND, d5 = NB
|
|
|
subql #1,d6 | d6 = NC
|
subql #1,d6 | d6 = NC
|
moveq #6,d0 | SX, SY, XMAJ
|
moveq #6,d0 | SX, SY, XMAJ
|
|
|
| we are drawing a series of vertical lines, all the same length
|
| we are drawing a series of vertical lines, all the same length
|
| so no need to re-calculate all the magic numbers each time
|
| so no need to re-calculate all the magic numbers each time
|
|
|
ldraw5x_1:
|
ldraw5x_1:
|
cmpl d2,a2 | x1 <= x2
|
cmpl d2,a2 | x1 <= x2
|
jge ldraw5x_2
|
jge ldraw5x_2
|
jra ldraw5x_12
|
jra ldraw5x_12
|
ldraw5x_2:
|
ldraw5x_2:
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
movel #0x0e,a0@(GCW_CMD) | write, 4x5, 1 of 20
|
tstl d1 | dy
|
tstl d1 | dy
|
bne ldraw5x_10
|
bne ldraw5x_10
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d3,a0@(GCW_PY) | pixel Y addr
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
movel d2,a0@(GCW_PX_SM) | pixel X addr, start single mem
|
bra ldraw5x_11
|
bra ldraw5x_11
|
ldraw5x_10:
|
ldraw5x_10:
|
movel d4,a0@(GCW_LG2) | NA
|
movel d4,a0@(GCW_LG2) | NA
|
movel d5,a0@(GCW_LG1) | NB
|
movel d5,a0@(GCW_LG1) | NB
|
movel d7,a0@(GCW_LG2) | ND
|
movel d7,a0@(GCW_LG2) | ND
|
movel d6,a0@(GCW_LG3) | NC
|
movel d6,a0@(GCW_LG3) | NC
|
movel d0,a0@(GCW_LG4) | SX, SY, XMAJ
|
movel d0,a0@(GCW_LG4) | SX, SY, XMAJ
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d3,a0@(GCW_PY) | pixel Y
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
movel d2,a0@(GCW_PX_SL) | pixel X, start line
|
ldraw5x_11:
|
ldraw5x_11:
|
addql #1,d2 | x++
|
addql #1,d2 | x++
|
jra ldraw5x_1
|
jra ldraw5x_1
|
ldraw5x_12:
|
ldraw5x_12:
|
moveml sp@+,d0-d7/a0-a2
|
moveml sp@+,d0-d7/a0-a2
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| read 1 pixel from the screen, handle the bizarre layout
|
| read 1 pixel from the screen, handle the bizarre layout
|
|
|
.even
|
.even
|
.globl r1pix3
|
.globl r1pix3
|
r1pix3:
|
r1pix3:
|
link a6,#0
|
link a6,#0
|
moveml d1-d5/a0,sp@-
|
moveml d1-d5/a0,sp@-
|
movew #1023,d5
|
movew #1023,d5
|
subw a6@(14),d5 | d5 is y as 16-bit value
|
subw a6@(14),d5 | d5 is y as 16-bit value
|
movew d5,d4
|
movew d5,d4
|
andib #0xfc,d4 | d4 is y0
|
andib #0xfc,d4 | d4 is y0
|
movew #3,d0
|
movew #3,d0
|
andw d5,d0 | y & 3
|
andw d5,d0 | y & 3
|
movel #3,d3 | ensure top word is clear
|
movel #3,d3 | ensure top word is clear
|
subw d0,d3 | 3 - (y & 3)
|
subw d0,d3 | 3 - (y & 3)
|
aslw #3,d3 | << 3
|
aslw #3,d3 | << 3
|
movel a6@(8),d0 | x
|
movel a6@(8),d0 | x
|
divuw #20,d0 | x % 20
|
divuw #20,d0 | x % 20
|
clrw d0 | clear quotient
|
clrw d0 | clear quotient
|
swap d0 | put remainder in lower 16 bits
|
swap d0 | put remainder in lower 16 bits
|
divuw #5,d0 | (x % 20) / 5
|
divuw #5,d0 | (x % 20) / 5
|
aslw #3,d0 | << 3
|
aslw #3,d0 | << 3
|
addw d0,d3 | ys in d3
|
addw d0,d3 | ys in d3
|
movew #24,d0
|
movew #24,d0
|
cmpw d3,d0
|
cmpw d3,d0
|
jge r1pix3_1
|
jge r1pix3_1
|
movew #-32,d0
|
movew #-32,d0
|
addw d0,d3
|
addw d0,d3
|
r1pix3_1:
|
r1pix3_1:
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(16),a0@(GCW_PSEL) | plane select mask
|
movel a6@(16),a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x66,a0@(GCW_CMD)
|
movel #0x66,a0@(GCW_CMD)
|
movel a6@(8),a0@(GCW_PX) | x
|
movel a6@(8),a0@(GCW_PX) | x
|
movel d4,a0@(GCW_PY) | y
|
movel d4,a0@(GCW_PY) | y
|
movel a0@(GCR_IN_SM),d0 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d0 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d0
|
movel a0@(GCR_IN_SM),d0
|
movel d0,d1
|
movel d0,d1
|
moveq #0,d0
|
moveq #0,d0
|
notb d0 | d0 = 0xff
|
notb d0 | d0 = 0xff
|
asll d3,d0 | << fs
|
asll d3,d0 | << fs
|
andl d1,d0 | (ic & (0xff << fs)
|
andl d1,d0 | (ic & (0xff << fs)
|
asrl d3,d0 | >> ys
|
asrl d3,d0 | >> ys
|
andl #0xff,d0
|
andl #0xff,d0
|
moveml sp@+,d1-d5/a0
|
moveml sp@+,d1-d5/a0
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| read a rectangular array of pixels from the screen
|
| read a rectangular array of pixels from the screen
|
| void rd_rect(int x1, int y1, int x2, int y2, char *buf)
|
| void rd_rect(int x1, int y1, int x2, int y2, char *buf)
|
|
|
.even
|
.even
|
.globl rd_rect2
|
.globl rd_rect2
|
rd_rect2:
|
rd_rect2:
|
link a6,#0
|
link a6,#0
|
moveml d1-d7/a0-a1,sp@-
|
moveml d1-d7/a0-a1,sp@-
|
movel #1023,d7
|
movel #1023,d7
|
subl a6@(20),d7 | d7 is y2 as 16-bit value
|
subl a6@(20),d7 | d7 is y2 as 16-bit value
|
movel d7,a6@(20)
|
movel d7,a6@(20)
|
movel #1023,d6
|
movel #1023,d6
|
subl a6@(12),d6 | d6 is y1 as 16-bit value
|
subl a6@(12),d6 | d6 is y1 as 16-bit value
|
movel d6,a6@(12)
|
movel d6,a6@(12)
|
movel a6@(8),d5 | d5 is x
|
movel a6@(8),d5 | d5 is x
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(24),a1 | buf
|
movel a6@(24),a1 | buf
|
rd_rect2_1:
|
rd_rect2_1:
|
cmpw a6@(18),d5 | x < x2
|
cmpw a6@(18),d5 | x < x2
|
jlt rd_rect2_2
|
jlt rd_rect2_2
|
jra rd_rect2_8
|
jra rd_rect2_8
|
rd_rect2_2:
|
rd_rect2_2:
|
movel d5,d4 | d4 is xs
|
movel d5,d4 | d4 is xs
|
divuw #20,d4 | x % 20
|
divuw #20,d4 | x % 20
|
clrw d4 | clear quotient
|
clrw d4 | clear quotient
|
swap d4 | remainder in lower word
|
swap d4 | remainder in lower word
|
divuw #5,d4 | (x % 20) / 5
|
divuw #5,d4 | (x % 20) / 5
|
aslw #3,d4 | ((x % 20) / 5) << 3
|
aslw #3,d4 | ((x % 20) / 5) << 3
|
rd_rect2_3:
|
rd_rect2_3:
|
cmpw d7,d6 | y > y2
|
cmpw d7,d6 | y > y2
|
jgt rd_rect2_4
|
jgt rd_rect2_4
|
jra rd_rect2_7
|
jra rd_rect2_7
|
rd_rect2_4:
|
rd_rect2_4:
|
movel d6,d3 | d3 is y0
|
movel d6,d3 | d3 is y0
|
andib #0xfc,d3 | y & 0xfffc
|
andib #0xfc,d3 | y & 0xfffc
|
moveq #3,d0
|
moveq #3,d0
|
andw d6,d0 | y & 3
|
andw d6,d0 | y & 3
|
moveq #3,d2 | ensure top word is clear
|
moveq #3,d2 | ensure top word is clear
|
subw d0,d2 | 3 - (y & 3)
|
subw d0,d2 | 3 - (y & 3)
|
aslw #3,d2 | << 3
|
aslw #3,d2 | << 3
|
addw d4,d2 | ys in d2
|
addw d4,d2 | ys in d2
|
moveq #24,d0
|
moveq #24,d0
|
cmpw d2,d0
|
cmpw d2,d0
|
jge rd_rect2_5
|
jge rd_rect2_5
|
movew #-32,d0
|
movew #-32,d0
|
addw d0,d2
|
addw d0,d2
|
rd_rect2_5:
|
rd_rect2_5:
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x66,a0@(GCW_CMD)
|
movel #0x66,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1
|
movel a0@(GCR_IN_SM),d1
|
moveq #0,d0
|
moveq #0,d0
|
notb d0 | d0 = 0xff
|
notb d0 | d0 = 0xff
|
asll d2,d0 | << fs
|
asll d2,d0 | << fs
|
andl d1,d0 | (ic & (0xff << fs)
|
andl d1,d0 | (ic & (0xff << fs)
|
asrl d2,d0 | >> ys
|
asrl d2,d0 | >> ys
|
andl #0xff,d0
|
andl #0xff,d0
|
moveb d0,a1@+ | *buf++
|
moveb d0,a1@+ | *buf++
|
rd_rect2_6:
|
rd_rect2_6:
|
subqw #1,d6 | y--
|
subqw #1,d6 | y--
|
jra rd_rect2_3
|
jra rd_rect2_3
|
rd_rect2_7:
|
rd_rect2_7:
|
addqw #1,d5 | x++
|
addqw #1,d5 | x++
|
movel a6@(12),d6 | y = y1
|
movel a6@(12),d6 | y = y1
|
jra rd_rect2_1
|
jra rd_rect2_1
|
rd_rect2_8:
|
rd_rect2_8:
|
moveml sp@+,d1-d7/a0-a1
|
moveml sp@+,d1-d7/a0-a1
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
|
|
| write a rectangular array of pixels to the screen
|
| write a rectangular array of pixels to the screen
|
| void wr_rect(int x1, int y1, int x2, int y2, char *buf)
|
| void wr_rect(int x1, int y1, int x2, int y2, char *buf)
|
|
|
.even
|
.even
|
.globl wr_rect2
|
.globl wr_rect2
|
wr_rect2:
|
wr_rect2:
|
link a6,#0
|
link a6,#0
|
moveml d1-d7/a0-a1,sp@-
|
moveml d1-d7/a0-a1,sp@-
|
movel #1023,d7
|
movel #1023,d7
|
subl a6@(20),d7 | d7 is y2 as 16-bit value
|
subl a6@(20),d7 | d7 is y2 as 16-bit value
|
movel d7,a6@(20)
|
movel d7,a6@(20)
|
movel #1023,d6
|
movel #1023,d6
|
subl a6@(12),d6 | d6 is y1 as 16-bit value
|
subl a6@(12),d6 | d6 is y1 as 16-bit value
|
movel d6,a6@(12)
|
movel d6,a6@(12)
|
movel a6@(8),d5 | d5 is x
|
movel a6@(8),d5 | d5 is x
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(24),a1 | buf
|
movel a6@(24),a1 | buf
|
wr_rect2_1:
|
wr_rect2_1:
|
cmpw a6@(18),d5 | x < x2
|
cmpw a6@(18),d5 | x < x2
|
jlt wr_rect2_2
|
jlt wr_rect2_2
|
jra wr_rect2_8
|
jra wr_rect2_8
|
wr_rect2_2:
|
wr_rect2_2:
|
movel d5,d4 | d4 is xs
|
movel d5,d4 | d4 is xs
|
divuw #20,d4 | x % 20
|
divuw #20,d4 | x % 20
|
clrw d4 | clear quotient
|
clrw d4 | clear quotient
|
swap d4 | remainder in lower word
|
swap d4 | remainder in lower word
|
divuw #5,d4 | (x % 20) / 5
|
divuw #5,d4 | (x % 20) / 5
|
aslw #3,d4 | ((x % 20) / 5) << 3
|
aslw #3,d4 | ((x % 20) / 5) << 3
|
wr_rect2_3:
|
wr_rect2_3:
|
cmpw d7,d6 | y > y2
|
cmpw d7,d6 | y > y2
|
jgt wr_rect2_4
|
jgt wr_rect2_4
|
jra wr_rect2_7
|
jra wr_rect2_7
|
wr_rect2_4:
|
wr_rect2_4:
|
movel d6,d3 | d3 is y0
|
movel d6,d3 | d3 is y0
|
andib #0xfc,d3 | y & 0xfffc
|
andib #0xfc,d3 | y & 0xfffc
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x66,a0@(GCW_CMD)
|
movel #0x66,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | d1 is ic
|
movel a0@(GCR_IN_SM),d1 | d1 is ic
|
moveq #3,d0
|
moveq #3,d0
|
andw d6,d0 | y & 3
|
andw d6,d0 | y & 3
|
moveq #3,d2 | ensure top word is clear
|
moveq #3,d2 | ensure top word is clear
|
subw d0,d2 | 3 - (y & 3)
|
subw d0,d2 | 3 - (y & 3)
|
aslw #3,d2 | << 3
|
aslw #3,d2 | << 3
|
addw d4,d2 | ys in d2
|
addw d4,d2 | ys in d2
|
moveq #24,d0
|
moveq #24,d0
|
cmpw d2,d0
|
cmpw d2,d0
|
jge wr_rect2_5
|
jge wr_rect2_5
|
movew #-32,d0
|
movew #-32,d0
|
addw d0,d2
|
addw d0,d2
|
wr_rect2_5:
|
wr_rect2_5:
|
moveq #0,d0
|
moveq #0,d0
|
notb d0 | d0 = 0xff
|
notb d0 | d0 = 0xff
|
asll d2,d0 | <<fs
|
asll d2,d0 | <<fs
|
notl d0 | invert
|
notl d0 | invert
|
andl d1,d0 | (ic & (0cff << ys))
|
andl d1,d0 | (ic & (0cff << ys))
|
clrl d1
|
clrl d1
|
moveb a1@+,d1 | *buf++
|
moveb a1@+,d1 | *buf++
|
asll d2,d1 | << ys
|
asll d2,d1 | << ys
|
orl d1,d0
|
orl d1,d0
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x6e,a0@(GCW_CMD)
|
movel #0x6e,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
wr_rect2_6:
|
wr_rect2_6:
|
subqw #1,d6 | y--
|
subqw #1,d6 | y--
|
jra wr_rect2_3
|
jra wr_rect2_3
|
wr_rect2_7:
|
wr_rect2_7:
|
addqw #1,d5 | x++
|
addqw #1,d5 | x++
|
movel a6@(12),d6 | y = y1
|
movel a6@(12),d6 | y = y1
|
jra wr_rect2_1
|
jra wr_rect2_1
|
wr_rect2_8:
|
wr_rect2_8:
|
moveml sp@+,d1-d7/a0-a1
|
moveml sp@+,d1-d7/a0-a1
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| write a rectangular array of pixels to the screen
|
| write a rectangular array of pixels to the screen
|
| void wr_rect4(int x1, int y1, int x2, int y2, char *buf)
|
| void wr_rect4(int x1, int y1, int x2, int y2, char *buf)
|
|
|
|
|
| This version writes the block with the x axis as the inner loop,
|
| This version writes the block with the x axis as the inner loop,
|
| this is slower than wr_rect2() but is necessary for the VNC
|
| this is slower than wr_rect2() but is necessary for the VNC
|
| CopyDataToScreen() function.
|
| CopyDataToScreen() function.
|
|
|
.even
|
.even
|
.globl wr_rect4
|
.globl wr_rect4
|
wr_rect4:
|
wr_rect4:
|
link a6,#0
|
link a6,#0
|
moveml d1-d7/a0-a1,sp@-
|
moveml d1-d7/a0-a1,sp@-
|
movel #1023,d7
|
movel #1023,d7
|
subl a6@(20),d7 | d7 is y2 as 16-bit value
|
subl a6@(20),d7 | d7 is y2 as 16-bit value
|
movel d7,a6@(20)
|
movel d7,a6@(20)
|
movel #1023,d6
|
movel #1023,d6
|
subl a6@(12),d6 | d6 is y1 as 16-bit value
|
subl a6@(12),d6 | d6 is y1 as 16-bit value
|
movel d6,a6@(12)
|
movel d6,a6@(12)
|
movel a6@(8),d5 | d5 is x
|
movel a6@(8),d5 | d5 is x
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(24),a1 | buf
|
movel a6@(24),a1 | buf
|
wr_rect4_1:
|
wr_rect4_1:
|
cmpw d7,d6 | y > y2
|
cmpw d7,d6 | y > y2
|
jgt wr_rect4_2
|
jgt wr_rect4_2
|
jra wr_rect4_8
|
jra wr_rect4_8
|
wr_rect4_2:
|
wr_rect4_2:
|
movel d6,d3 | d3 is y0
|
movel d6,d3 | d3 is y0
|
andib #0xfc,d3 | y & 0xfffc
|
andib #0xfc,d3 | y & 0xfffc
|
moveq #3,d0
|
moveq #3,d0
|
andw d6,d0 | y & 3
|
andw d6,d0 | y & 3
|
moveq #3,d2 | ensure top word is clear
|
moveq #3,d2 | ensure top word is clear
|
subw d0,d2 | 3 - (y & 3)
|
subw d0,d2 | 3 - (y & 3)
|
aslw #3,d2 | << 3
|
aslw #3,d2 | << 3
|
wr_rect4_3:
|
wr_rect4_3:
|
cmpw a6@(18),d5 | x < x2
|
cmpw a6@(18),d5 | x < x2
|
jlt wr_rect4_4
|
jlt wr_rect4_4
|
jra wr_rect4_7
|
jra wr_rect4_7
|
wr_rect4_4:
|
wr_rect4_4:
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x66,a0@(GCW_CMD)
|
movel #0x66,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | d1 is ic
|
movel a0@(GCR_IN_SM),d1 | d1 is ic
|
movel d5,d4 | d4 is xs
|
movel d5,d4 | d4 is xs
|
divuw #20,d4 | x % 20
|
divuw #20,d4 | x % 20
|
clrw d4 | clear quotient
|
clrw d4 | clear quotient
|
swap d4 | remainder in lower word
|
swap d4 | remainder in lower word
|
divuw #5,d4 | (x % 20) / 5
|
divuw #5,d4 | (x % 20) / 5
|
aslw #3,d4 | ((x % 20) / 5) << 3
|
aslw #3,d4 | ((x % 20) / 5) << 3
|
addw d2,d4 | ys in d2, xs in d4
|
addw d2,d4 | ys in d2, xs in d4
|
moveq #24,d0
|
moveq #24,d0
|
cmpw d4,d0
|
cmpw d4,d0
|
jge wr_rect4_5
|
jge wr_rect4_5
|
movew #-32,d0
|
movew #-32,d0
|
addw d0,d4
|
addw d0,d4
|
wr_rect4_5:
|
wr_rect4_5:
|
moveq #0,d0
|
moveq #0,d0
|
notb d0 | d0 = 0xff
|
notb d0 | d0 = 0xff
|
asll d4,d0 | <<fs
|
asll d4,d0 | <<fs
|
notl d0 | invert
|
notl d0 | invert
|
andl d1,d0 | (ic & (0cff << ys))
|
andl d1,d0 | (ic & (0cff << ys))
|
clrl d1
|
clrl d1
|
moveb a1@+,d1 | *buf++
|
moveb a1@+,d1 | *buf++
|
asll d4,d1 | << ys
|
asll d4,d1 | << ys
|
orl d1,d0
|
orl d1,d0
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x6e,a0@(GCW_CMD)
|
movel #0x6e,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
wr_rect4_6:
|
wr_rect4_6:
|
addqw #1,d5 | x++
|
addqw #1,d5 | x++
|
jra wr_rect4_3
|
jra wr_rect4_3
|
wr_rect4_7:
|
wr_rect4_7:
|
subqw #1,d6 | y--
|
subqw #1,d6 | y--
|
movel a6@(8),d5 | x = x1
|
movel a6@(8),d5 | x = x1
|
jra wr_rect4_1
|
jra wr_rect4_1
|
wr_rect4_8:
|
wr_rect4_8:
|
moveml sp@+,d1-d7/a0-a1
|
moveml sp@+,d1-d7/a0-a1
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| write a rectangular array of pixels to the screen
|
| write a rectangular array of pixels to the screen
|
| void wr_rect5(int x1, int y1, int x2, int y2, char *buf)
|
| void wr_rect5(int x1, int y1, int x2, int y2, char *buf)
|
|
|
|
|
| This version writes the block with the x axis as the inner loop,
|
| This version writes the block with the x axis as the inner loop,
|
| this is slower than wr_rect2() but is necessary for the VNC
|
| this is slower than wr_rect2() but is necessary for the VNC
|
| CopyDataToScreen() function.
|
| CopyDataToScreen() function.
|
|
|
|
|
| This version uses a lookup table for the pixel mask and shift count.
|
| This version uses a lookup table for the pixel mask and shift count.
|
| This removes one of the divide instructions (divides are slow).
|
| This removes one of the divide instructions (divides are slow).
|
|
|
.even
|
.even
|
.globl wr_rect5
|
.globl wr_rect5
|
wr_rect5:
|
wr_rect5:
|
link a6,#0
|
link a6,#0
|
moveml d1-d7/a0-a2,sp@-
|
moveml d1-d7/a0-a2,sp@-
|
movel #1023,d7
|
movel #1023,d7
|
subl a6@(20),d7 | d7 is y2
|
subl a6@(20),d7 | d7 is y2
|
movel #1023,d6
|
movel #1023,d6
|
subl a6@(12),d6 | d6 is y1
|
subl a6@(12),d6 | d6 is y1
|
movel a6@(8),d5 | d5 is x
|
movel a6@(8),d5 | d5 is x
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(24),a1 | buf
|
movel a6@(24),a1 | buf
|
lea pm_tab,a2 | base of lookup table
|
lea pm_tab,a2 | base of lookup table
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
movel #0xff,a0@(GCW_PSEL) | plane select mask
|
wr_rect5_1:
|
wr_rect5_1:
|
cmpl d7,d6 | y > y2
|
cmpl d7,d6 | y > y2
|
jle wr_rect5_8
|
jle wr_rect5_8
|
movel d6,d3 | d3 is y0
|
movel d6,d3 | d3 is y0
|
andib #0xfc,d3 | y & 0xfffc
|
andib #0xfc,d3 | y & 0xfffc
|
moveq #3,d2
|
moveq #3,d2
|
andl d6,d2 | y & 3
|
andl d6,d2 | y & 3
|
asll #3,d2 | (y & 3) * 8
|
asll #3,d2 | (y & 3) * 8
|
wr_rect5_3:
|
wr_rect5_3:
|
cmpl a6@(16),d5 | x < x2
|
cmpl a6@(16),d5 | x < x2
|
jge wr_rect5_7
|
jge wr_rect5_7
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x66,a0@(GCW_CMD)
|
movel #0x66,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d1 | d1 is ic
|
movel a0@(GCR_IN_SM),d1 | d1 is ic
|
movel d5,d4 | d4 is xs
|
movel d5,d4 | d4 is xs
|
divuw #20,d4 | x % 20
|
divuw #20,d4 | x % 20
|
clrw d4 | clear quotient
|
clrw d4 | clear quotient
|
swap d4 | remainder in lower word
|
swap d4 | remainder in lower word
|
asll #5,d4 | *32
|
asll #5,d4 | *32
|
addl d2,d4 | ((x % 20) * 32) + ((y % 4) * 8)
|
addl d2,d4 | ((x % 20) * 32) + ((y % 4) * 8)
|
movel a2@(d4:w:1),d0 | fetch mask
|
movel a2@(d4:w:1),d0 | fetch mask
|
andl d1,d0 | (ic & mask)
|
andl d1,d0 | (ic & mask)
|
| andl a2@(d4:w:1),d0 | (ic & mask)
|
| andl a2@(d4:w:1),d0 | (ic & mask)
|
clrl d1
|
clrl d1
|
moveb a1@+,d1 | *buf++
|
moveb a1@+,d1 | *buf++
|
addql #4,d4
|
addql #4,d4
|
movel a2@(d4:w:1),d4 | fetch shift count
|
movel a2@(d4:w:1),d4 | fetch shift count
|
asll d4,d1 | << ys
|
asll d4,d1 | << ys
|
orl d1,d0
|
orl d1,d0
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x6e,a0@(GCW_CMD)
|
movel #0x6e,a0@(GCW_CMD)
|
movel d5,a0@(GCW_PX) | x
|
movel d5,a0@(GCW_PX) | x
|
movel d3,a0@(GCW_PY) | y0
|
movel d3,a0@(GCW_PY) | y0
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
wr_rect5_6:
|
wr_rect5_6:
|
addql #1,d5 | x++
|
addql #1,d5 | x++
|
jra wr_rect5_3
|
jra wr_rect5_3
|
wr_rect5_7:
|
wr_rect5_7:
|
subql #1,d6 | y--
|
subql #1,d6 | y--
|
movel a6@(8),d5 | x = x1
|
movel a6@(8),d5 | x = x1
|
jra wr_rect5_1
|
jra wr_rect5_1
|
wr_rect5_8:
|
wr_rect5_8:
|
moveml sp@+,d1-d7/a0-a2
|
moveml sp@+,d1-d7/a0-a2
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| write 1 pixel to the screen, handle the bizarre layout
|
| write 1 pixel to the screen, handle the bizarre layout
|
|
|
.even
|
.even
|
.globl w1pix3
|
.globl w1pix3
|
w1pix3:
|
w1pix3:
|
link a6,#0
|
link a6,#0
|
moveml d1-d5/a0,sp@-
|
moveml d1-d5/a0,sp@-
|
movew #1023,d5
|
movew #1023,d5
|
subw a6@(14),d5 | d5 is y as 16-bit value
|
subw a6@(14),d5 | d5 is y as 16-bit value
|
movew d5,d4
|
movew d5,d4
|
andib #0xfc,d4 | d4 is y0
|
andib #0xfc,d4 | d4 is y0
|
lea GC_BASE,a0 | base of video control registers
|
lea GC_BASE,a0 | base of video control registers
|
movel a6@(16),a0@(GCW_PSEL) | plane select mask
|
movel a6@(16),a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x66,a0@(GCW_CMD)
|
movel #0x66,a0@(GCW_CMD)
|
movel a6@(8),a0@(GCW_PX) | x
|
movel a6@(8),a0@(GCW_PX) | x
|
movel d4,a0@(GCW_PY) | y0
|
movel d4,a0@(GCW_PY) | y0
|
movel a0@(GCR_IN_SM),d0 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d0 | read intensity, start single mem cycle
|
movel a0@(GCR_IN_SM),d0 | 4 pixels in d0
|
movel a0@(GCR_IN_SM),d0 | 4 pixels in d0
|
movel d0,d3 | ic in d3
|
movel d0,d3 | ic in d3
|
movew #3,d0
|
movew #3,d0
|
andw d5,d0 | y & 3
|
andw d5,d0 | y & 3
|
movel #3,d2 | ensure top word is clear
|
movel #3,d2 | ensure top word is clear
|
subw d0,d2 | 3 - (y & 3)
|
subw d0,d2 | 3 - (y & 3)
|
aslw #3,d2 | << 3
|
aslw #3,d2 | << 3
|
movel a6@(8),d0 | x
|
movel a6@(8),d0 | x
|
divuw #20,d0 | x % 20
|
divuw #20,d0 | x % 20
|
clrw d0 | clear quotient
|
clrw d0 | clear quotient
|
swap d0 | put remainder in lower 16 bits
|
swap d0 | put remainder in lower 16 bits
|
divuw #5,d0 | (x % 20) / 5
|
divuw #5,d0 | (x % 20) / 5
|
aslw #3,d0 | << 3
|
aslw #3,d0 | << 3
|
addw d0,d2 | ys in d2
|
addw d0,d2 | ys in d2
|
movew #24,d0
|
movew #24,d0
|
cmpw d2,d0
|
cmpw d2,d0
|
jge w1pix3_1
|
jge w1pix3_1
|
movew #-32,d0
|
movew #-32,d0
|
addw d0,d2
|
addw d0,d2
|
w1pix3_1:
|
w1pix3_1:
|
moveq #0,d0
|
moveq #0,d0
|
notb d0 | d0 = 0xff
|
notb d0 | d0 = 0xff
|
asll d2,d0 | << ys
|
asll d2,d0 | << ys
|
notl d0 | invert
|
notl d0 | invert
|
andl d3,d0 | (ic & (0xff << ys)
|
andl d3,d0 | (ic & (0xff << ys)
|
movel a6@(20),d1 | i
|
movel a6@(20),d1 | i
|
asll d2,d1 | i << ys
|
asll d2,d1 | i << ys
|
orl d1,d0
|
orl d1,d0
|
movel a6@(16),a0@(GCW_PSEL) | plane select mask
|
movel a6@(16),a0@(GCW_PSEL) | plane select mask
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x07,a0@(GCW_LG4)
|
movel #0x6e,a0@(GCW_CMD)
|
movel #0x6e,a0@(GCW_CMD)
|
movel a6@(8),a0@(GCW_PX) | x
|
movel a6@(8),a0@(GCW_PX) | x
|
movel d4,a0@(GCW_PY) | y0
|
movel d4,a0@(GCW_PY) | y0
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
movel d0,a0@(GCW_IN_SM) | write inten, start single mem cycle
|
moveml sp@+,d1-d5/a0
|
moveml sp@+,d1-d5/a0
|
unlk a6
|
unlk a6
|
rts
|
rts
|
|
|
| data
|
| data
|
|
|
.data
|
.data
|
|
|
| lookup table for wr_rect5()
|
| lookup table for wr_rect5()
|
| this gives the pixel mask and shift count to locate each pixel in
|
| this gives the pixel mask and shift count to locate each pixel in
|
| the 4 x 20 array pattern used by the Prisma video board
|
| the 4 x 20 array pattern used by the Prisma video board
|
|
|
pm_tab: .long 0x00ffffff, 24 | 0,0
|
pm_tab: .long 0x00ffffff, 24 | 0,0
|
.long 0xff00ffff, 16 | 0,1
|
.long 0xff00ffff, 16 | 0,1
|
.long 0xffff00ff, 8 | 0,2
|
.long 0xffff00ff, 8 | 0,2
|
.long 0xffffff00, 0 | 0,3
|
.long 0xffffff00, 0 | 0,3
|
.long 0x00ffffff, 24 | 1,0
|
.long 0x00ffffff, 24 | 1,0
|
.long 0xff00ffff, 16 | 1,1
|
.long 0xff00ffff, 16 | 1,1
|
.long 0xffff00ff, 8 | 1,2
|
.long 0xffff00ff, 8 | 1,2
|
.long 0xffffff00, 0 | 1,3
|
.long 0xffffff00, 0 | 1,3
|
.long 0x00ffffff, 24 | 2,0
|
.long 0x00ffffff, 24 | 2,0
|
.long 0xff00ffff, 16 | 2,1
|
.long 0xff00ffff, 16 | 2,1
|
.long 0xffff00ff, 8 | 2,2
|
.long 0xffff00ff, 8 | 2,2
|
.long 0xffffff00, 0 | 2,3
|
.long 0xffffff00, 0 | 2,3
|
.long 0x00ffffff, 24 | 3,0
|
.long 0x00ffffff, 24 | 3,0
|
.long 0xff00ffff, 16 | 3,1
|
.long 0xff00ffff, 16 | 3,1
|
.long 0xffff00ff, 8 | 3,2
|
.long 0xffff00ff, 8 | 3,2
|
.long 0xffffff00, 0 | 3,3
|
.long 0xffffff00, 0 | 3,3
|
.long 0x00ffffff, 24 | 4,0
|
.long 0x00ffffff, 24 | 4,0
|
.long 0xff00ffff, 16 | 4,1
|
.long 0xff00ffff, 16 | 4,1
|
.long 0xffff00ff, 8 | 4,2
|
.long 0xffff00ff, 8 | 4,2
|
.long 0xffffff00, 0 | 4,3
|
.long 0xffffff00, 0 | 4,3
|
.long 0xffffff00, 0 | 5,0
|
.long 0xffffff00, 0 | 5,0
|
.long 0x00ffffff, 24 | 5,1
|
.long 0x00ffffff, 24 | 5,1
|
.long 0xff00ffff, 16 | 5,2
|
.long 0xff00ffff, 16 | 5,2
|
.long 0xffff00ff, 8 | 5,3
|
.long 0xffff00ff, 8 | 5,3
|
.long 0xffffff00, 0 | 6,0
|
.long 0xffffff00, 0 | 6,0
|
.long 0x00ffffff, 24 | 6,1
|
.long 0x00ffffff, 24 | 6,1
|
.long 0xff00ffff, 16 | 6,2
|
.long 0xff00ffff, 16 | 6,2
|
.long 0xffff00ff, 8 | 6,3
|
.long 0xffff00ff, 8 | 6,3
|
.long 0xffffff00, 0 | 7,0
|
.long 0xffffff00, 0 | 7,0
|
.long 0x00ffffff, 24 | 7,1
|
.long 0x00ffffff, 24 | 7,1
|
.long 0xff00ffff, 16 | 7,2
|
.long 0xff00ffff, 16 | 7,2
|
.long 0xffff00ff, 8 | 7,3
|
.long 0xffff00ff, 8 | 7,3
|
.long 0xffffff00, 0 | 8,0
|
.long 0xffffff00, 0 | 8,0
|
.long 0x00ffffff, 24 | 8,1
|
.long 0x00ffffff, 24 | 8,1
|
.long 0xff00ffff, 16 | 8,2
|
.long 0xff00ffff, 16 | 8,2
|
.long 0xffff00ff, 8 | 8,3
|
.long 0xffff00ff, 8 | 8,3
|
.long 0xffffff00, 0 | 9,0
|
.long 0xffffff00, 0 | 9,0
|
.long 0x00ffffff, 24 | 9,1
|
.long 0x00ffffff, 24 | 9,1
|
.long 0xff00ffff, 16 | 9,2
|
.long 0xff00ffff, 16 | 9,2
|
.long 0xffff00ff, 8 | 9,3
|
.long 0xffff00ff, 8 | 9,3
|
.long 0xffff00ff, 8 | 10,0
|
.long 0xffff00ff, 8 | 10,0
|
.long 0xffffff00, 0 | 10,1
|
.long 0xffffff00, 0 | 10,1
|
.long 0x00ffffff, 24 | 10,2
|
.long 0x00ffffff, 24 | 10,2
|
.long 0xff00ffff, 16 | 10,3
|
.long 0xff00ffff, 16 | 10,3
|
.long 0xffff00ff, 8 | 11,0
|
.long 0xffff00ff, 8 | 11,0
|
.long 0xffffff00, 0 | 11,1
|
.long 0xffffff00, 0 | 11,1
|
.long 0x00ffffff, 24 | 11,2
|
.long 0x00ffffff, 24 | 11,2
|
.long 0xff00ffff, 16 | 11,3
|
.long 0xff00ffff, 16 | 11,3
|
.long 0xffff00ff, 8 | 12,0
|
.long 0xffff00ff, 8 | 12,0
|
.long 0xffffff00, 0 | 12,1
|
.long 0xffffff00, 0 | 12,1
|
.long 0x00ffffff, 24 | 12,2
|
.long 0x00ffffff, 24 | 12,2
|
.long 0xff00ffff, 16 | 12,3
|
.long 0xff00ffff, 16 | 12,3
|
.long 0xffff00ff, 8 | 13,0
|
.long 0xffff00ff, 8 | 13,0
|
.long 0xffffff00, 0 | 13,1
|
.long 0xffffff00, 0 | 13,1
|
.long 0x00ffffff, 24 | 13,2
|
.long 0x00ffffff, 24 | 13,2
|
.long 0xff00ffff, 16 | 13,3
|
.long 0xff00ffff, 16 | 13,3
|
.long 0xffff00ff, 8 | 14,0
|
.long 0xffff00ff, 8 | 14,0
|
.long 0xffffff00, 0 | 14,1
|
.long 0xffffff00, 0 | 14,1
|
.long 0x00ffffff, 24 | 14,2
|
.long 0x00ffffff, 24 | 14,2
|
.long 0xff00ffff, 16 | 14,3
|
.long 0xff00ffff, 16 | 14,3
|
.long 0xff00ffff, 16 | 15,0
|
.long 0xff00ffff, 16 | 15,0
|
.long 0xffff00ff, 8 | 15,1
|
.long 0xffff00ff, 8 | 15,1
|
.long 0xffffff00, 0 | 15,2
|
.long 0xffffff00, 0 | 15,2
|
.long 0x00ffffff, 24 | 15,3
|
.long 0x00ffffff, 24 | 15,3
|
.long 0xff00ffff, 16 | 16,0
|
.long 0xff00ffff, 16 | 16,0
|
.long 0xffff00ff, 8 | 16,1
|
.long 0xffff00ff, 8 | 16,1
|
.long 0xffffff00, 0 | 16,2
|
.long 0xffffff00, 0 | 16,2
|
.long 0x00ffffff, 24 | 16,3
|
.long 0x00ffffff, 24 | 16,3
|
.long 0xff00ffff, 16 | 17,0
|
.long 0xff00ffff, 16 | 17,0
|
.long 0xffff00ff, 8 | 17,1
|
.long 0xffff00ff, 8 | 17,1
|
.long 0xffffff00, 0 | 17,2
|
.long 0xffffff00, 0 | 17,2
|
.long 0x00ffffff, 24 | 17,3
|
.long 0x00ffffff, 24 | 17,3
|
.long 0xff00ffff, 16 | 18,0
|
.long 0xff00ffff, 16 | 18,0
|
.long 0xffff00ff, 8 | 18,1
|
.long 0xffff00ff, 8 | 18,1
|
.long 0xffffff00, 0 | 18,2
|
.long 0xffffff00, 0 | 18,2
|
.long 0x00ffffff, 24 | 18,3
|
.long 0x00ffffff, 24 | 18,3
|
.long 0xff00ffff, 16 | 19,0
|
.long 0xff00ffff, 16 | 19,0
|
.long 0xffff00ff, 8 | 19,1
|
.long 0xffff00ff, 8 | 19,1
|
.long 0xffffff00, 0 | 19,2
|
.long 0xffffff00, 0 | 19,2
|
.long 0x00ffffff, 24 | 19,3
|
.long 0x00ffffff, 24 | 19,3
|
|
|
|
|
| temporary storage for line drawing routine
|
| temporary storage for line drawing routine
|
|
|
gr_data:
|
gr_data:
|
line_x1: .long 0 | 0 (668)
|
line_x1: .long 0 | 0 (668)
|
line_y1: .long 0 | 4 (66c)
|
line_y1: .long 0 | 4 (66c)
|
line_x2: .long 0 | 8 (670)
|
line_x2: .long 0 | 8 (670)
|
line_y2: .long 0 | 12 (674)
|
line_y2: .long 0 | 12 (674)
|
.long 0 | 16 (678)
|
.long 0 | 16 (678)
|
.long 0 | 20 (67c)
|
.long 0 | 20 (67c)
|
.long 0 | 24 (680)
|
.long 0 | 24 (680)
|
.long 0 | 28 (684)
|
.long 0 | 28 (684)
|
.long 0 | 32 (688)
|
.long 0 | 32 (688)
|
.long 0 | 36 (68c)
|
.long 0 | 36 (68c)
|
line_xdir: .long 0 | 40 (690)
|
line_xdir: .long 0 | 40 (690)
|
line_ydir: .long 0 | 44 (694)
|
line_ydir: .long 0 | 44 (694)
|
.long 0 | 48 (698)
|
.long 0 | 48 (698)
|
line_selmask: .long 0 | 52 (69c)
|
line_selmask: .long 0 | 52 (69c)
|
line_inten: .long 0 | 56 (6A0)
|
line_inten: .long 0 | 56 (6A0)
|
line_flag: .word 0 | 60 (6a4)
|
line_flag: .word 0 | 60 (6a4)
|
init_flag1: .word 0 | 62 (6a6)
|
init_flag1: .word 0 | 62 (6a6)
|
.long 0 | 64 (6a8)
|
.long 0 | 64 (6a8)
|
.long 0 | 64 (6ac)
|
.long 0 | 64 (6ac)
|
init_flag4: .long 0 | 64 (6b0)
|
init_flag4: .long 0 | 64 (6b0)
|
.long 0 | 64 (6b4)
|
.long 0 | 64 (6b4)
|
.long 0 | 64 (6b8)
|
.long 0 | 64 (6b8)
|
.long 0 | 64 (6bc)
|
.long 0 | 64 (6bc)
|
.long 0 | 64 (6c0)
|
.long 0 | 64 (6c0)
|
.long 0 | 64 (6c4)
|
.long 0 | 64 (6c4)
|
.long 0 | 64 (6c8)
|
.long 0 | 64 (6c8)
|
.long 0 | 64 (6cc)
|
.long 0 | 64 (6cc)
|
.long 0 | 64 (6d0)
|
.long 0 | 64 (6d0)
|
.long 0 | 64 (6d4)
|
.long 0 | 64 (6d4)
|
.long 0 | 64 (6d8)
|
.long 0 | 64 (6d8)
|
.long 0 | 64 (6dc)
|
.long 0 | 64 (6dc)
|
.long 0 | 64 (6e0)
|
.long 0 | 64 (6e0)
|
.long 0 | 64 (6e4)
|
.long 0 | 64 (6e4)
|
.long 0 | 64 (6e8)
|
.long 0 | 64 (6e8)
|
.long 0 | 64 (6ec)
|
.long 0 | 64 (6ec)
|
init_flag6: .long 0 | 64 (6f0)
|
init_flag6: .long 0 | 64 (6f0)
|
init_flag5: .word 0 | 64 (6f4)
|
init_flag5: .word 0 | 64 (6f4)
|
init_flag2: .word 0 | 64 (6f6)
|
init_flag2: .word 0 | 64 (6f6)
|
init_flag3: .word 0 | 64 (6f8)
|
init_flag3: .word 0 | 64 (6f8)
|
|
|
|
|
|
|