;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*- ;;Screen print. Draws a pixel at a specified position. .proc pixel_draw; user-procedure :clobbers (A X Y) :clobbers-arguments 0 ;; Draws a pixel at Y_pos, X_pos se mem.inc .include "mem.inc" Bitmap = $4000 Bitmap_end = $5F3F ;; X = X_pos (mod 8) LDA X_pos ; X (mod 8) AND #%00000111 TAX ;;Store pixel in byte_to_paint LDA #%10000000 INX @shift_btp: ;; check out SMB instruction here! //Hugo DEX BEQ end__;X=0 end this CLC ROR A jmp @shift_btp end__: STA byte_to_paint ;;FIND THE POSITION IN MEMORY TO WRITE PIXEL ;; + + + + + > X ;; + ;; + ;;\/ ;; Y ;; ;;pos = x_offset LDA #%11111000 AND X_pos STA btp_mem_pos LDA X_pos + 1 STA btp_mem_pos + 1 ;;The y_pos adds offset because chunk offsets + inside chunk offset. ;; Adding inside chunk offset LDA #%00000111 ; A = y (mod 8) AND Y_pos ;; offset to add TAY LDA #$00 STA $4B ;;y =8 translates to 320 bytes. CLC LDA #%11111000 ; A = y - [y (mod 8)] AND Y_pos STA C STA B LDA #$00 STA C+1 STA B+1 ;;We need to calculate C*40. 40 = 2*2*2*(2^2 +1) ;; _*2^2 Mult_16 C, C+1 Mult_16 C, C+1 ;; + _*1 Add_16 C, C+1, B, B+1, ! ;; *2*2*2 Mult_16 C, C + 1 Mult_16 C, C + 1 Mult_16 C, C + 1 Add_16 btp_mem_pos, btp_mem_pos + 1, C, C + 1, ! ;;add offset for where bitmap is Add_16 btp_mem_pos, btp_mem_pos + 1, #Bitmap, ! ;;Let draw some stuff LDA byte_to_paint ;; note that both bytes are used! ORA (>btp_mem_pos), Y STA (>btp_mem_pos), Y RTS .endproc