// Illustrates problem with bitmap-draw.kc line() // Reported by Janne Johansson .pc = $801 "Basic" :BasicUpstart(main) .pc = $80d "Program" .const VIC_BMM = $20 .const VIC_DEN = $10 .const VIC_RSEL = 8 .label BORDERCOL = $d020 .label BGCOL = $d021 .label D011 = $d011 .label VIC_MEMORY = $d018 .label SCREEN = $400 .label BITMAP = $2000 .label next = 2 main: { // *BORDERCOL = 0 lda #0 sta BORDERCOL // *BGCOL = 0 sta BGCOL // *D011 = VIC_BMM|VIC_DEN|VIC_RSEL|3 lda #VIC_BMM|VIC_DEN|VIC_RSEL|3 sta D011 // *VIC_MEMORY = (byte)((((word)SCREEN&$3fff)/$40)|(((word)BITMAP&$3fff)/$400)) lda #(SCREEN&$3fff)/$40|(BITMAP&$3fff)/$400 sta VIC_MEMORY // bitmap_init(BITMAP) jsr bitmap_init // bitmap_clear() jsr bitmap_clear // init_screen() jsr init_screen lda #0 sta.z next __b1: // bitmap_line(0,next,0,100) lda.z next jsr bitmap_line // next++; inc.z next jmp __b1 } // Draw a line on the bitmap // bitmap_line(byte register(A) x1) bitmap_line: { .label x0 = 0 .label y0 = 0 .label y1 = $64 // if(x0>1 sta.z e lda #bitmap_line.y0 sta.z y lda #bitmap_line.x0 sta.z x __b1: // bitmap_plot(x,y) ldx.z x ldy.z y jsr bitmap_plot // x++; inc.z x // e = e+yd lax.z e axs #-[bitmap_line.y1] stx.z e // if(xd>1 lda.z xd lsr sta.z e lda #bitmap_line.y0 sta.z y lda #bitmap_line.x0 sta.z x __b1: // bitmap_plot(x,y) ldx.z x ldy.z y jsr bitmap_plot // y++; inc.z y // e = e+xd lda.z e clc adc.z xd sta.z e // if(yd>1 sta.z e lda #bitmap_line.y1 sta.z y __b1: // bitmap_plot(x,y) ldx.z x ldy.z y jsr bitmap_plot // x++; inc.z x // e = e+yd lax.z e axs #-[bitmap_line.y1] stx.z e // if(xd>1 lda.z xd lsr sta.z e lda #bitmap_line.y0 sta.z y lda #bitmap_line.x0 sta.z x __b1: // bitmap_plot(x,y) ldx.z x ldy.z y jsr bitmap_plot // y = y++; inc.z y // e = e+xd lda.z e clc adc.z xd sta.z e // if(ydSCREEN sta.z c+1 __b1: // for(byte* c = SCREEN; c!=SCREEN+$400;c++) lda.z c+1 cmp #>SCREEN+$400 bne __b2 lda.z c cmp #bitmap lda #>BITMAP sta bitmap_plot_xhi,x // bitmap_plot_bit[x] = bits tya sta bitmap_plot_bit,x // bits = bits>>1 tya lsr tay // if(bits==0) cpy #0 bne __b2 ldy #$80 __b2: // for(char x : 0..255) inx cpx #0 bne __b1 lda #<0 sta.z yoffs sta.z yoffs+1 tax __b3: // y&$7 lda #7 sax.z __10 // yoffs lda.z yoffs+1 // bitmap_plot_yhi[y] = >yoffs sta bitmap_plot_yhi,x // if((y&$7)==7) lda #7 cmp.z __10 bne __b4 // yoffs = yoffs + 40*8 clc lda.z yoffs adc #<$28*8 sta.z yoffs lda.z yoffs+1 adc #>$28*8 sta.z yoffs+1 __b4: // for(char y : 0..255) inx cpx #0 bne __b3 // } rts } // Tables for the plotter - initialized by calling bitmap_draw_init(); bitmap_plot_xlo: .fill $100, 0 bitmap_plot_xhi: .fill $100, 0 bitmap_plot_ylo: .fill $100, 0 bitmap_plot_yhi: .fill $100, 0 bitmap_plot_bit: .fill $100, 0