;; plot a pixel using the firmware screen functions
;; 
;; This example is more low level and works only with mode 0.
;; It will not work if upper rom is enabled and screen is at &c000-&ffff.

scr_set_mode equ &bc0e
scr_dot_position equ &bc1d
scr_ink_encode equ &bc2c
kl_u_rom_enable equ &b900
txt_set_paper equ &bb96
txt_clear_window equ &bb6c

org &4000

;; uncomment to see that this causes an effect
;;call kl_u_rom_enable

;; set mode 1
ld a,1
call scr_set_mode	

;; set paper
ld a,1
call txt_set_paper

;; clears window to paper colour
call txt_clear_window	

;; plot point
;;
;; for mode 0: x is in the range 0-159
;; for mode 1: x is in the range 0-320
;; for mode 2: x is in the range 0-639
;; for all modes: y is in the range 0-200
;; origin is bottom left

;; get address of pixel
;; change coords for mode 0 and 2 to get same location as mode 1
ld de,160		;; x 
ld hl,100		;; y 
call scr_dot_position
;; HL = address of byte containing pixel
;; C = bit mask for pixel
;; B = number of pixels in byte

push hl
push bc

ld a,3				;; pen 3

;; lookup encoded pixels from array
;; this performs a similar thing to SCR INK ENCODE but
;; is fixed for mode 1
;; a different array would be needed for mode 0 or 2
ld l,a
ld h,0
ld de,inks
add hl,de
;; HL = address in array
ld a,(hl)

;; A = pen 3 encoded into a form to poke to screen
;; but which would set all pixels in that byte

pop bc
pop hl
;; isolate just the pixel we want
;; using the pixel mask
and c
ld d,a


;; this avoids SCR PIXELS, but it is more complex.
;; We also require screen memory to be readable and writeable.
;; e.g. upper rom can't be enabled.
;;
;; SCR PIXELS does all the work necessary to enable/disable rom.
;;
;;
;; we need to read from screen
;; mask the pixels we don't want to change
;; combine with our pixel and write back

;; mask for pixel we want to write
ld a,c

;; complement it to make mask for pixels to keep
cpl

;; isolate pixels on screen 
and (hl)

;; combine with our pixel
or d

;; write to screen
ld (hl),a

ret

;; this is equivalent to the encodings SCR INK ENCODE would
;; give us for mode 1
inks:
defb %00000000
defb %11110000
defb %00001111
defb %11111111