.macro buf_cmd ld a, 23 rst.lil $10 ld a, 0 rst.lil $10 ld a, $a0 rst.lil $10 .endmacro .macro vdu end push hl push bc ld hl, @vdu_start ld bc, end - @vdu_start rst.lil $18 pop bc pop hl jr end @vdu_start: .endmacro font_buf: .equ 1000 .include "mos_api.inc" .assume adl = 1 .org $40000 jr start .asciz "anxiety.bin" .align 64 ; fill with 0 up to MOS header .db "MOS" ; MOS header .db 0 ; version 0 .db 1 ; ADL mode start: ei ld hl, mode ; location of screen mode restore mos mos_sysvars ; load pointer to sysvars in IX ld a, (ix + sysvar_scrMode) ; get current screen mode ld (hl), a ; save it in command stream vdu_init: vdu @n .db 12 ; CLS .db 16 ; CLG .db 23, 0, $c0, 0 ; logical coords off ; .db 22, 0 ; select screenmode, 640x480x16 .db 22, 18 ; select screenmode, 1024x768x2 .db 23, 1, 0 ; hide cursor @@: ld de, 0 ld hl, font ; first 256 bytes are character widths ld ix, font + $100 ; font icn data starts here ld b, -1 create_char: call create_bitmap inc hl inc d djnz create_char main: ld hl, font ld (font_ptr), hl ld hl, 40 ld (x), hl ld hl, text call print_text ld hl, 0 ld (x), hl ld hl, (y) ld de, 32 add hl, de ld (y), hl ld hl, small_text call print_text loop: mos mos_sysvars ld a, (ix + sysvar_keyascii) cp '\e' jr nz, loop ; Loop until key is pressed end: vdu @n .db 16 ; CLG .db 23, 1, 1 ; show cursor .db 22 ; restore screen mode mode: .db 0 @@: ld hl, 0 ; return success ret create_bitmap: ld e, (hl) ; get width buf_cmd ld a, d ; buffer id rst.lil $10 ld a, 0 ; buffer id is 16-bit, send msb rst.lil $10 ld a, 2 ; clear buffer rst.lil $10 buf_cmd ld a, d ; buffer id rst.lil $10 ld a, 0 ; buffer id is 16-bit, send msb rst.lil $10 ld a, 0 ; write block rst.lil $10 ld a, 32 ; block length rst.lil $10 ld a, 0 ; length msb rst.lil $10 push bc ld b, 16 @loop: ld a, (ix) rst.lil $10 ld a, (ix + 16) rst.lil $10 inc ix djnz @loop ld b, 16 @@: inc ix djnz @p pop bc buf_cmd ld a, d ; buffer id rst.lil $10 ld a, 0 ; buffer id is 16-bit, send msb rst.lil $10 ld a, 14 ; consolidate blocks rst.lil $10 ld a, 23 ; bitmap api rst.lil $10 ld a, 27 ; bitmap api rst.lil $10 ld a, $20 ; select bitmap rst.lil $10 ld a, d ; buffer id rst.lil $10 ld a, 0 ; buffer id is 16-bit, send msb rst.lil $10 ld a, 23 ; bitmap api rst.lil $10 ld a, 27 ; bitmap api rst.lil $10 ld a, $21 ; create bitmap rst.lil $10 ld a, 16 ; width id rst.lil $10 ld a, 0 ; width is 16-bit, send msb rst.lil $10 ld a, 16 ; height rst.lil $10 ld a, 0 ; height is 16-bit, send msb rst.lil $10 ld a, 2 ; 1-bpp rst.lil $10 ret plot: ld a, 25 rst.lil $10 ld a, $ed rst.lil $10 ld a, l rst.lil $10 ld a, h rst.lil $10 ld a, e rst.lil $10 ld a, d rst.lil $10 ret draw_char: push hl ld de, 0 ld e, a ld a, 23 ; bitmap api rst.lil $10 ld a, 27 ; bitmap api rst.lil $10 ld a, $20 ; select bitmap rst.lil $10 ld a, e ; select bitmap id based on ascii code rst.lil $10 ld a, 0 ; buffer id is 16-bit, send msb rst.lil $10 push de ld hl, (x) ld de, (y) call plot pop de ld hl, font add hl, de ; add width pointer offset ld a, (hl) ; get width ld d, 0 ld e, a ld hl, (x) add hl, de ; update cursor pointer by width ld (x), hl pop hl ret print_text: ld a, (hl) cp 0 ret z inc hl call draw_char jr print_text font: .incbin "times15.uf2" ; times12: ; .incbin "times12.uf2" text: .asciz "Happy New Years!" small_text: .asciz "Wait a minute, wait a minute, Doc, are you telling me that you built a time machine out of a delorean." font_ptr: .dw 0 x: .dw 0 y: .dw 0