aboutsummaryrefslogblamecommitdiffstats
path: root/anxiety.asm
blob: 9e9eeac872e9b0bad50ba374244175c3f22bad1a (plain) (tree)





























































































































































































































































                                                                                                                   
.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