Drawline:

ExecBase equ 4
Open equ -30 
Close equ -36
Read equ -42
SetRGB8 equ -$354
SetAPen equ -342
WritePixel equ -324
OpenLibrary equ -552

*Change with passing variables

	movem.l a1-a6,resave
	move.l ExecBase,a6
	move.l #dosname,a1
	move.l #0,d0
	jsr OpenLibrary(a6)
	move.l d0,_dosbase


	move.l ExecBase,a6
	move.l #GFXname,a1
	move.l #0,d0
	jsr OpenLibrary(a6)
	move.l d0,GfxBase


	move.l _dosbase,a6
	move.l #sendname,d1
	move.l #1005,d2
	jsr Open(a6)
	move.l d0,sendhandle
	move.l _dosbase,a6
	move.l sendhandle,d1
	move.l #sendinfo,d2
	move.l #4,d3
	jsr Read(a6)
	move.l _dosbase,a6
	move.l sendhandle,d1
	jsr Close(a6)

	move.l sendinfo,a1

	move.l (a1)+,dither     * Buffer space
	move.l (a1)+,rastport
	move.l (a1)+,cols
	move.l (a1)+,maxx
	move.l (a1)+,maxy
	move.l (a1)+,rpal
	move.l (a1)+,gpal
	move.l (a1)+,bpal
	move.l (a1)+,contrast
	move.l (a1)+,red
	move.l (a1)+,gre
	move.l (a1)+,blu
	move.l (a1)+,rbuf
	move.l (a1)+,gbuf
	move.l (a1)+,bbuf
	move.l (a1)+,divider


	move.l #0,y   * y%

	yloop:

	move.l #0,d5     * x%

	xloop:
	

	move.l rbuf,a0
		move.l #0,d1
	move.b (a0)+,d1
	move.l a0,rbuf

	move.l gbuf,a0
		move.l #0,d2
	move.b (a0)+,d2
	move.l a0,gbuf
	
	move.l bbuf,a0
		move.l #0,d3
	move.b (a0)+,d3
	move.l a0,bbuf


*Select best colour for RGB

	move.w #0,selcol		* Selected colour for RGB (d1,d2,d3)
	move.w #9999,dis    * Distance from colour
	move.w #0,d4        *  for d4=0 to ?
	colloop:
		move.l rpal,a0
			move.w #0,d6
		move.b 0(a0,d4),d6
		sub.w d1,d6   * r()-r
		bpl rneg
			neg.w d6
		rneg:
		move.w d6,d0    * Cummulative distance

		move.l gpal,a0
			move.w #0,d6
		move.b 0(a0,d4),d6
		sub.w d2,d6   * g()-g
		bpl gneg
			neg.w d6
		gneg:
		add.w d6,d0

		move.l bpal,a0
			move.w #0,d6
		move.b 0(a0,d4),d6
		sub.w d3,d6   * g()-g
		bpl bneg
			neg.w d6
		bneg:
		add.w d6,d0

		move.w dis,d6
		cmp.w d6,d0
		bpl biggerdis
			move.w d0,dis
			move.w d4,selcol
			cmp.w #0,d0
			beq jump
		biggerdis:

	add.w #1,d4
	move.l cols,d0
	cmp.w d0,d4
	bne colloop
	
	jump:

	* Chosen colour is in selcol

* We have the colour (selcol) - now lets do some error distribution...

  *Now distribute error (in d4) ---- RED
			move.l rbuf,a0    * Copy of pointer to red-data (Already inc. so =x+1)
			move.w selcol,d0  * Colour to be printed
			move.l rpal,a1	
			move.l #0,d4
			move.b 0(a1,d0),d4	*Red value of that colour
			sub.l d1,d4   * r()-r
			neg.l d4

			move.l d4,d1    * d1 is workspace
			muls #7,d1      * time by 7
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos1
				move.l #0,d1
				bra fin1
			pos1:
			cmp.l #255,d1
			bmi fin1
				move.l #255,d1
			fin1:
			move.b d1,(a0)   * Store it at x+1,y

			add.l maxx,a0     * Now points to x+1,y+1
			move.l d4,d1    * d1 is workspace
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos2
				move.l #0,d1
				bra fin2
			pos2:
			cmp.l #255,d1
			bmi fin2
				move.l #255,d1
			fin2:
			move.b d1,(a0)   * Store it at x+1,y+1

			sub.l #1,a0     * Now points to x,y+1
			move.l d4,d1    * d1 is workspace
			muls #5,d1     * time by 5
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos3
				move.l #0,d1
				bra fin3
			pos3:
			cmp.l #255,d1
			bmi fin3
				move.l #255,d1
			fin3:
			move.b d1,(a0)   * Store it at x,y+1

			sub.l #1,a0     * Now points to x-1,y+1
			move.l d4,d1    * d1 is workspace
			muls #3,d1     * time by 3
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos4
				move.l #0,d1
				bra fin4
			pos4:
			cmp.l #255,d1
			bmi fin4
				move.l #255,d1
			fin4:
			move.b d1,(a0)   * Store it at x-1,y+1

  *Now distribute error (in d4) ---- GREEN
			move.l gbuf,a0    * Copy of pointer to red-data (Already inc. so =x+1)
			move.w selcol,d0  * Colour to be printed
			move.l gpal,a1	
			move.l #0,d4
			move.b 0(a1,d0),d4	*gre value of that colour
			sub.l d2,d4   * g()-g
			neg.l d4

			move.l d4,d1    * d1 is workspace
			muls #7,d1      * time by 7
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos12
				move.l #0,d1
				bra fin12
			pos12:
			cmp.l #255,d1
			bmi fin12
				move.l #255,d1
			fin12:
			move.b d1,(a0)   * Store it at x+1,y

			add.l maxx,a0     * Now points to x+1,y+1
			move.l d4,d1    * d1 is workspace
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos22
				move.l #0,d1
				bra fin22
			pos22:
			cmp.l #255,d1
			bmi fin22
				move.l #255,d1
			fin22:
			move.b d1,(a0)   * Store it at x+1,y+1

			sub.l #1,a0     * Now points to x,y+1
			move.l d4,d1    * d1 is workspace
			muls #5,d1     * time by 5
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos32
				move.l #0,d1
				bra fin32
			pos32:
			cmp.l #255,d1
			bmi fin32
				move.l #255,d1
			fin32:
			move.b d1,(a0)   * Store it at x,y+1

			sub.l #1,a0     * Now points to x-1,y+1
			move.l d4,d1    * d1 is workspace
			muls #3,d1     * time by 3
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos42
				move.l #0,d1
				bra fin42
			pos42:
			cmp.l #255,d1
			bmi fin42
				move.l #255,d1
			fin42:
			move.b d1,(a0)   * Store it at x-1,y+1

  *Now distribute error (in d4) ---- BLUE
			move.l bbuf,a0    * Copy of pointer to red-data (Already inc. so =x+1)
			move.w selcol,d0  * Colour to be printed
			move.l bpal,a1	
			move.l #0,d4
			move.b 0(a1,d0),d4	*blu value of that colour
			sub.l d3,d4   * b()-b
			neg.l d4

			move.l d4,d1    * d1 is workspace
			muls #7,d1      * time by 7
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos13
				move.l #0,d1
				bra fin13
			pos13:
			cmp.l #255,d1
			bmi fin13
				move.l #255,d1
			fin13:
			move.b d1,(a0)   * Store it at x+1,y

			add.l maxx,a0     * Now points to x+1,y+1
			move.l d4,d1    * d1 is workspace
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos23
				move.l #0,d1
				bra fin23
			pos23:
			cmp.l #255,d1
			bmi fin23
				move.l #255,d1
			fin23:
			move.b d1,(a0)   * Store it at x+1,y+1

			sub.l #1,a0     * Now points to x,y+1
			move.l d4,d1    * d1 is workspace
			muls #5,d1     * time by 5
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos33
				move.l #0,d1
				bra fin33
			pos33:
			cmp.l #255,d1
			bmi fin33
				move.l #255,d1
			fin33:
			move.b d1,(a0)   * Store it at x,y+1

			sub.l #1,a0     * Now points to x-1,y+1
			move.l d4,d1    * d1 is workspace
			muls #3,d1     * time by 3
			asr.l #4,d1     * Divide by 16
				move.l #0,d0
				move.b (a0),d0
				add.l d0,d1   * Add the value to pixel 
			cmp.l #0,d1
			bpl pos43
				move.l #0,d1
				bra fin43
			pos43:
			cmp.l #255,d1
			bmi fin43
				move.l #255,d1
			fin43:
			move.b d1,(a0)   * Store it at x-1,y+1

* Now do bits - output is colour (in SelCol)
	
	printpixel:

	move.l #0,d0
	move.w selcol,d0
	move.l GfxBase,a6
	move.l rastport,a1
	jsr SetAPen(a6)

	move.l GfxBase,a6
	move.l y,d1
	move.l d5,d0
	move.l rastport,a1
	jsr WritePixel(a6)

	add #1,d5
	move.l maxx,d0
	cmp.l d5,d0
	bne xloop

	move.l y,d0
	add.l #1,d0
	move.l d0,y
	move.l maxy,d1
	cmp.l d1,d0
	bne yloop

CloseLibrary equ -414  * Should be at the top- but I forgot to put it in till now.

	move.l ExecBase,a6
	move.l _dosbase,a1
	jsr CloseLibrary(a6)
	move.l GFXbase,a1
	jsr CloseLibrary(a6)

	
	movem.l resave,a1-a6

	rts

dither:
	dc.l 0
y:
	dc.l 0
resave: 
	ds.l 6
GfxBase:
	dc.l 0
rastport:
	dc.l 0
cols:
	dc.l 0
maxx:
	dc.l 0
maxy:
	dc.l 0
contrast:
	dc.l 0
red:
	dc.l 0
gre:
	dc.l 0
blu:
	dc.l 0
dis:
	dc.l 0
selcol:
	dc.l 0
rpal:
	dc.l 0
gpal:
  dc.l 0
bpal:
	dc.l 0
rbuf:
	dc.l 0
gbuf:
	dc.l 0
bbuf:
	dc.l 0
divider:
	dc.l 0
dosname:
	dc.b 'dos.library',0
_dosbase:
	dc.l 0
GFXname:
	dc.b 'graphics.library',0,0
GFXbase:
	dc.l 0
sendname:
	dc.b 'BBoard:BBsend',0
sendhandle
	dc.l 0
sendinfo:
	dc.l 0

end
