
This was recomended by dicander and duunqnd because A =$ABAC looks like one address and not 2 zero-page addresses.
83 lines
1.6 KiB
ArmAsm
Executable file
83 lines
1.6 KiB
ArmAsm
Executable file
;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-
|
|
|
|
;;Screen print. Draws a pixel at a specified position.
|
|
;; Destroys A X Y
|
|
.proc pixel_draw; Draws a pixel at [Y = FB , X = FC, FD]. Y = 0 - 320, X= 0 - 200
|
|
.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
|
|
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, #>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
|