* * BORIS, * This is MY fixed version of the C you sent. I noticed that there * was a PLOT missing so after consulting my book and a Pascal source I * inserted one. * * This routine draws a line (not optimised). The test is to draw a line * from the centre to the edges of the screen (it works!!!) * * * MSD 30-4-95 @ 9:55 PM * yes=1 no=0 DOWNLOAD=yes ifne DOWNLOAD include transmit.s ;include Transmit code org $30000 ;origin to start of code in memory Code_Start Exec_Addr mycode endc bsr set_up clr.l $462 move.w #100,y1 ;middle move.w #160,x1 ;of screen move.w #0,d4 ;x2 move.w #0,d5 ;y2 ;draw top left to top right move.w #320-1,d0 tl2tr movem.w d0/d4/d5,-(sp) move.w d4,x2 move.w d5,y2 bsr do_letter movem.w (sp)+,d0/d4/d5 add.w #1,d4 dbf d0,tl2tr ;draw top right to bottom right move.w #100,y1 ;middle move.w #160,x1 ;of screen move.w #320,d4 ;x2 move.w #0,d5 ;y2 move.w #200-1,d0 tr2br movem.w d0/d4/d5,-(sp) move.w d4,x2 move.w d5,y2 bsr do_letter movem.w (sp)+,d0/d4/d5 add.w #1,d5 dbf d0,tr2br ;draw bottom right to bottom left move.w #100,y1 ;middle move.w #160,x1 ;of screen move.w #320,d4 ;x2 move.w #200,d5 ;y2 move.w #320-1,d0 br2bl movem.w d0/d4/d5,-(sp) move.w d4,x2 move.w d5,y2 bsr do_letter movem.w (sp)+,d0/d4/d5 sub.w #1,d4 dbf d0,br2bl ;draw bottom left to top left move.w #100,y1 ;middle move.w #160,x1 ;of screen move.w #0,d4 ;x2 move.w #200,d5 ;y2 move.w #200-1,d0 bl2tl movem.w d0/d4/d5,-(sp) move.w d4,x2 move.w d5,y2 bsr do_letter movem.w (sp)+,d0/d4/d5 sub.w #1,d5 dbf d0,bl2tl move.l $462.w,$200.w move.w pic+2,$ffff8240.w move.l $200.w,d0 ;print how long routine takes bsr printn wait bsr tst_key tst.l d0 beq.s wait main_loop bsr set_old_palette move.w org_rez,$ffff8260.w move.b #$8,$fffffc02.w ifeq DOWNLOAD bsr set_user else move.l 4.w,a0 jmp (a0) endc clr.w -(sp) trap #1 printn move.l scr_now,a0 move.l d0,d3 offset set 0 rept 24 clr.l offset(a0) clr.l offset+4(a0) clr.l offset+8(a0) clr.l offset+12(a0) offset set offset+160 endr add.w #160*8,a0 lea number4+1(pc),a4 move.l d3,d2 rept 2 move.b d2,d1 and.b #$f,d1 move.b d1,-(a4) move.b d2,d1 lsr.w #4,d1 move.b d1,-(a4) lsr.l #8,d2 endr ;cycles lea number1(pc),a4 ; 8 move.w #2-1,d0 ; 8 .digits move.b (a4)+,d4 ; 8 and.w #$f,d4 ;12 cmp.b #$a,d4 ; 8 blt.s .ok ;12 add.w #7,d4 ; 8 .ok add.w #16,d4 ; 8 mulu #5,d4 ;40? lea font(pc),a2 ; 8 lea (a2,d4.w),a2 ;16 move.b (a2)+,(a0) ;16 move.b (a2)+,160(a0) ;16 move.b (a2)+,320(a0) ;16 move.b (a2)+,480(a0) ;16 move.b (a2)+,640(a0) ;16 move.b (a4)+,d4 ; 8 and.w #$f,d4 ;12 cmp.b #$a,d4 ; 8 blt.s .ok2 ;12 add.w #7,d4 ; 8 .ok2 add.w #16,d4 ; 8 mulu #5,d4 ;40? lea font(pc),a2 ; 8 lea (a2,d4.w),a2 ;16 move.b (a2)+,1(a0) ;16 move.b (a2)+,161(a0) ;16 move.b (a2)+,321(a0) ;16 move.b (a2)+,481(a0) ;16 move.b (a2)+,641(a0) ;16 add.w #8,a0 ;16 dbf d0,.digits ;16+12n rts number1 dc.b 0 number2 dc.b 0 number3 dc.b 0 number4 dc.b 0 *************************************************************** * based on the following C source * * a classic Bresenham line drawer * * #define ABS(x) (x>0?x:-x) //get positive value of number * #define SGN(x) (x>0?1:(x==0?0:-1)) //get sign of number (-1,0,1) * * /*draw line from (x1,y1) to (x2,y2) */ * * DDA2 (short x1,short y1,short x2,short y2) * ( * short d,x,y,ax,ay,sx,sy,dx,dy; * * d = x2-x1; ax=ABS(d)*2; sx=SGN(d); * d = y2-y1; ay=ABS(d)*2; sy=SGN(d); * * x = x1; y = y1; * if (ax>ay) * { * d = ay-(ax/2); * plot (x,y); * while (x != x2) //while x does not equal x2 * { * plot (x,y); * if (d >= 0) * { * y += sy; * d -= ax; * } * x += sx; * d += ay; * } * } * else * { * d = ax-(ay/2); * plot (x,y); * while (y != y2) //while y does not equal y2 * { * if (d >= 0) * { * x += sx; * d -= ay; * } * **** plot x,y (MSD's FIX) * * * y += sy; * d += ax; * } * } * } *************************************************************** ; Converted from 'C' source... (and I don't even know 'C' !) do_letter moveq #0,d0 moveq #0,d1 **** Calc X values ************ ;d=x2-x1 move.w x2,d0 move.w x1,d1 sub.w d1,d0 bpl.s xplus ;check the result is ABS ;no so make ABS neg.w d0 ;sx=SGN(d) move.w #-1,sx bra.s xoverplus xplus move.w #1,sx xoverplus ;ax=ABS(d)*2 lsl.w #1,d0 ;ax=ABS(d)*2 move.w d0,ax ************************************************** **** Calc Y values ************ ;d=y2-y1 move.w y2,d0 move.w y1,d1 sub.w d1,d0 bpl.s yplus ;check the result is ABS ;no so make ABS neg.w d0 ;sy=SGN(d) move.w #-1,sy bra.s yoverplus yplus move.w #1,sy yoverplus ;ay=ABS(d)*2 lsl.w #1,d0 move.w d0,ay ******************************************* ; x=x1 move.w x1,x ; y=y1 move.w y1,y ;if (ax>ay) move.w ax,d0 cmp.w ay,d0 bgt.s axbigger ;else if (axy2 .loop move.w y,d0 cmp.w y2,d0 beq .quit *if d(>=0) tst.w d7 bmi.s .over *x += sx move.w sx,d0 add.w d0,x *d -= ay move.w ay,d0 sub.w d0,d7 .over ************ MSD fix here!! ******* (After looking at a Pascal source! move.w x,d0 move.w y,d1 bsr plot *y += sy move.w sy,d0 add.w d0,y *d += ax add.w ax,d7 bra.s .loop .quit rts ;if (ax>ay) then do axbigger axbigger ;d=(ay-(ax/2) move.w ax,d0 ;let d0=ax/2 lsr.w #1,d0 ;d0 now equ ax/2 move.w ay,d1 sub.w d0,d1 ;d1 now equ (ay-(ax/2) move.w d1,d7 *plot x,y move.w x,d0 move.w y,d1 bsr plot *while (x != x2) while x<>x2 .loop move.w x,d0 cmp.w x2,d0 beq.s .quit move.w x,d0 move.w y,d1 bsr plot ;if (d>=0) tst.w d7 bmi.s .over *y += sy move.w sy,d0 add.w d0,y *d -= ax sub.w ax,d7 .over *x += sx move.w sx,d0 add.w d0,x *d += ay add.w ay,d7 bra.s .loop .quit rts * Plot * * On entry d0=x * d1=y * plot move.l scr_now,a6 ;multiply y axis offset by line width (*160) lsl.w #5,d1 *32 move.w d1,d2 lsl.w #2,d1 *128 add.w d2,d1 =160 move.w d0,d2 ;divide x offset by 16 for word values then *8 for low rez lsr.w #1,d0 and.w #$1f8,d0 add.w d1,d0 ;add y offset to word offset add.w d0,a6 ;add word + y offset to screen start and.w #$f,d2 ;get pixel offset lsl.w #1,d2 ;double it to get word offset lea pixel_offsets(pc),a5 ;get plot values move.w 0(a5,d2.w),d0 or.w d0,(a6) ;now plot it rts *********************** * SUBROUTINES SECTION * *********************** v_sync movem.l d0-d3/a0-a3,-(sp) move.w #$25,-(sp) trap #14 addq.l #2,sp movem.l (sp)+,d0-d3/a0-a3 rts tst_key move.w #11,-(sp) trap #1 addq.l #2,sp rts get_key move.w #7,-(sp) trap #1 addq.l #2,sp rts set_user move.l stack_save,-(sp) move.w #$20,-(sp) trap #1 addq.l #6,sp rts set_old_palette lea old_palette,a0 set_pal lea $ffff8240.w,a1 movem.l (a0),d0-d7 movem.l d0-d7,(a1) rts set_up ifeq DOWNLOAD clr.l -(sp) ;supervisor move.w #$20,-(sp) trap #1 addq.l #6,sp move.l d0,stack_save endc move.b #$12,$fffffc02.w ;DI mouse move.w #3,-(sp) ;get screen base trap #14 addq.l #2,sp move.l d0,screen_base move.b $ffff8260.w,org_rez movem.l $ffff8240.w,d0-d7 movem.l d0-d7,old_palette clr.b $ffff8260.w movem.l pic+2,d0-d7 movem.l d0-d7,$ffff8240.w move.l #screens,d0 clr.b d0 move.l d0,scr_now move.l d0,d1 add.l #32000,d1 eor.l d0,d1 move.l d1,scr_xor lea pic+34,a0 move.l scr_now,a1 move.l a1,a2 add.l #32000,a2 move.w #32000/4-1,d0 .show move.l (a0),(a1)+ move.l (a0)+,(a2)+ dbf d0,.show set_screen move.l scr_now,d6 move.l scr_xor,d7 eor.l d7,d6 move.l d6,scr_now lsr.l #8,d6 lea $ffff8201.w,a6 movep.w d6,(a6) rts ifeq DOWNLOAD ******************* SECTION DATA ******************* endc pixel_offsets dc.w %1000000000000000 dc.w %0100000000000000 dc.w %0010000000000000 dc.w %0001000000000000 dc.w %0000100000000000 dc.w %0000010000000000 dc.w %0000001000000000 dc.w %0000000100000000 dc.w %0000000010000000 dc.w %0000000001000000 dc.w %0000000000100000 dc.w %0000000000010000 dc.w %0000000000001000 dc.w %0000000000000100 dc.w %0000000000000010 dc.w %0000000000000001 font incbin g:\down\font.dat pic incbin f:\pics\oz\grn_man.pi1 Code_End ifeq DOWNLOAD ******************* SECTION BSS ******************* endc stack_save ds.l 1 screen_base ds.l 1 org_rez ds.w 1 old_palette ds.w 16 scr_now ds.l 1 scr_xor ds.l 1 x1 ds.w 1 x2 ds.w 1 y1 ds.w 1 y2 ds.w 1 ax ds.w 1 ay ds.w 1 sx ds.w 1 sy ds.w 1 x ds.w 1 y ds.w 1 black ds.w 16 ds.b 256 screens ds.b 32000 ds.b 32000 ifne DOWNLOAD myend Code_Length equ Code_End-Code_Start CODE_LENGTH equ myend-mycode endc