- Example to change the mode and inks using the firmware
- and then how to plot in each area.
- by Kevin Thacker. 2025. Released under BSD License.
kl_new_fast_ticker equ &bce0 mc_set_mode equ &bd1c kl_new_frame_fly equ &bcd7 mc_set_inks equ &bd25 scr_set_mode equ &bc0e scr_mode_clear equ &bdeb txt_set_cursor equ &bb75 txt_output equ &bb5a
- ---------------------------------------------------------------------------------------
org &4000
- ---------------------------------------------------------------------------------------
start:
- set a mode and clear screen
xor a call scr_set_mode
- prevent screen clearing. See SOFT968 Hits and Tips
ld a,&c9 ld (scr_mode_clear),a
- interrupt counter which goes from 0-5.
xor a ld (interrupt_index),a
- install frame flyback interrupt to reset counter.
ld hl,frame_flyback_block ld b,&81 ld c,&ff ld de,frame_flyback_function call kl_new_frame_fly
- install fast ticker interrupt to set mode and inks.
ld hl,fast_ticker_block ld b,&81 ld c,&ff ;; in main ram ld de,fast_ticker_function call kl_new_fast_ticker
- set mode 1 - now without clearing screen
ld a,1 call scr_set_mode
- set text position
ld h,1 ld l,24 call txt_set_cursor
- write text in mode 1
ld hl,message_lower call display_message
- set mode 0 - now without clearing screen
xor a call scr_set_mode
- set text position
ld h,1 ld l,1 call txt_set_cursor
- write text in mode 0
ld hl,message_upper call display_message
- loop to see effect.
loop: jp loop
- ---------------------------------------------------------------------------------------
message_upper: defb "This is in mode 0",0
- ---------------------------------------------------------------------------------------
message_lower: defb "This is in mode 1",0
- ---------------------------------------------------------------------------------------
display_message: ld a,(hl) inc hl or a ;; look for 0 which is end of string ret z call txt_output jr display_message
- ---------------------------------------------------------------------------------------
frame_flyback_function: push af xor a ld (fast_ticker_block),a pop af ret
- ---------------------------------------------------------------------------------------
fast_ticker_function: push af push hl push bc push de
ld hl,modes ld a,(fast_ticker_block) ld c,a ld b,0 add hl,bc ld a,(hl) call mc_set_mode
ld a,(fast_ticker_block) ld l,a ld h,0 ld c,l ld b,0 add hl,hl ;; x2 add hl,hl ;; x4 add hl,hl ;; x8 add hl,hl ;; x16 add hl,bc ;; x17 ld bc,inks add hl,bc ld e,l ld d,h call mc_set_inks
ld a,(fast_ticker_block) cp 5 jr z,ftf inc a ld (fast_ticker_block),a ftf:
pop de
pop bc
pop hl
pop af
ret
- ---------------------------------------------------------------------------------------
- must be in range &4000-&7fff
frame_flyback_block: defs 9
- must be in range &4000-&7fff
fast_ticker_block: defs 9
- ---------------------------------------------------------------------------------------
- which interrupt.
interrupt_index: defb 0
- ---------------------------------------------------------------------------------------
- mode per interrupt
modes:
- mode in top border. not useful unless screen height is changed.
defb 0
- to set mode for top few lines of screen
defb 0
- mode in middle of screen
defb 0 defb 0
- to set mode for bottom few lines of screen
defb 1
- mode in bottom border. not useful unless screen height is changed.
defb 0
- ---------------------------------------------------------------------------------------
- palette per interrupt; 17 values, border then inks.
- All inks are set even if mode doesn't use them all.
inks:
- top border.
defb 21,21,10,20,12,11,20,21,13,6,30,27,7,18,25,4,23
- just before graphics starts.
defb 0,21,10,20,12,11,20,21,13,6,30,27,7,18,25,4,23
defb 21,21,10,20,12,11,20,21,13,6,30,27,7,18,25,4,23
defb 0,21,10,20,12,11,20,21,13,6,30,27,7,18,25,4,23
defb 21,21,10,20,12,11,20,21,13,6,30,27,7,18,25,4,23
- single line before graphics ends and into bottom border
defb 0,21,10,20,12,11,20,21,13,6,30,27,7,18,25,4,23
end start