LoginSignup
0
0

More than 5 years have passed since last update.

PC-88 z80asmでセミグラフィック (3)

Last updated at Posted at 2018-08-09
semgra.asm
; z88dk / PC-88 mon
; z80asm -b -l semgra.asm

tvram   equ     $f3c8
vtvram  equ     $c3c8

        org     $b000
start:
        call    crtset
        call    vtinit
.mloop
        xor     a
        call    vtcls

        call    inkey           ; hl = (datidx)

        ld      b, 160          ; 列数
        ld      c, 0            ; x
.vloop
        push    bc
        ld      a, h
        and     $03             ; hl %= 1024
        ld      h, a
        push    hl
        add     hl, hl
        ld      de, data
        add     hl, de          ; hl = data + hl*2
        ld      d, (hl)
        ld      a, 50
        sub     d
        ld      b, a            ; y = 50 - d
        rlc     d               ; 高さ
        inc     hl
        ld      e, (hl)         ; 色
        call    vline
        pop     hl
        inc     hl
        pop     bc
        inc     c
        djnz    vloop

        call    vblank
        call    vtblt
        jr      mloop
.exit
        di
        halt

crtset:
        ld      hl, $e6b4
        ld      (hl), $98       ; アトリビュート
        inc     hl
        inc     hl
        inc     hl
        inc     hl
        ld      (hl), $00       ; ファンクション・キー表示スイッチ
        inc     hl
        ld      (hl), $ff       ; カラー/白黒スイッチ
        ld      b, 80
        ld      c, 25
        call    $6f6b           ; CRTSET
        ret

vblank:
        in      a, ($40)
        and     $20
        jr      nz, vblank
.wait
        in      a, ($40)
        and     $20
        jr      z, wait
        ret

vtinit:
        ld      hl, tvram
        ld      de, vtvram
        ld      bc, 120*25
        ldir
        ret

vtblt:
        ld      hl, vtvram
        ld      de, tvram
        ld      bc, 120*25
        ldir
        ret

vtcls:
        ld      hl, vtvram
        ld      b, 25
.vtcls1
        push    bc
        ld      (hl), a
        ld      d, h
        ld      e, l
        inc     de
        ld      bc, 80-1
        ldir
        ld      de, 40+1
        add     hl, de
        pop     bc
        djnz    vtcls1
        ret

inkey:
        ld      hl, (datidx)
        in      a, ($0a)        ; 左キー
        and     $04
        jr      nz, skip1
        dec     hl
        dec     hl
.skip1
        in      a, ($08)        ; 右キー
        and     $04
        jr      nz, skip2
        inc     hl
        inc     hl
.skip2
        ld      (datidx), hl
        ret

; vertical line
; b=y c=x d=高さ e=色
vline:
        ld      a, d
        or      a
        ret     z

        push    de
        ld      hl, pmasks
        ld      d, 0
        add     hl, de
        ld      a, (hl)
        ld      (pmask), a
        call    pset
.vline1
        pop     de
        dec     d
        ret     z
        push    de
        call    psetd
        jr      vline1

; point set
; b=y c=x
; use: a, de, hl
pset:
        ld      a, b            ; de = y & $fc
        and     $fc
        ld      e, a
        ld      d, 0

        ld      hl, 0           ; hl = de * 30
        add     hl, de
        add     hl, hl
        add     hl, de
        add     hl, hl
        add     hl, de
        add     hl, hl
        add     hl, de
        add     hl, hl          ; %11110=30倍

        ld      e, c            ; hl += x / 2
        srl     e
        add     hl, de
        ld      de, vtvram
        add     hl, de

        ld      a, b
        and     $03
        ld      e, a            ; e = y & 3
        ld      a, c            ; a = (x & 1 == 0) ? $01 : $10
        and     $01
        ld      a, $01
        jr      z, pset1
        ld      a, $10
.pset1
        dec     e
        jp      m, pset2
        add     a, a
        jr      pset1
.pset2
        call    psetdo
        ret

; pset down
; use: a, de, hl
psetd:
        ld      hl, (paddr)
        ld      a, (pbits)
        ld      e, a
        and     $88
        ld      a, e
        jr      z, psetd1

        ld      de, 120
        add     hl, de
        rlca
        rlca
        rlca
        rlca
.psetd1
        rlca
        call    psetdo
        ret

; pset do
; hl=addr a=bits
; use: a, e
psetdo:
        ld      (paddr), hl
        ld      (pbits), a
        ld      e, a
        ld      a, (pmask)
        and     e
        ld      a, e
        jr      z, psetdo0
.psetdo1
        or      (hl)
        ld      (hl), a
        ret
.psetdo0
        cpl
        and     (hl)
        ld      (hl), a
        ret

paddr:  defw    0
pbits:  defb    0
pmask:  defb    0
pmasks: defb    $ff, $5a

datidx: defw    0

data:
        defb    16,0,16,0,16,0,16,0,16,0,16,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0
        defb    04,0,04,0,04,0,00,0,00,0,00,0,00,0,03,1,03,1,03,0,03,0,03,1,03,1,04,1,04,1,04,1
        defb    04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0,00,0,00,0
        defb    03,1,03,1,03,1,03,0,03,0,03,0,03,0,03,0,03,0,03,0,03,0,03,0,03,0,03,0,03,0,00,0
        defb    00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,03,0,03,1
        defb    03,1,05,1,05,1,07,1,07,1,07,1,07,1,07,1,07,1,07,1,07,1,07,1,07,1,08,1,08,1,08,1
        defb    08,1,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,07,0,07,0,07,0,07,0,07,0,07,0,07,0
        defb    07,0,07,0,07,0,07,0,07,0,07,0,06,1,06,1,06,0,06,0,06,0,06,0,06,0,06,0,05,0,05,0
        defb    05,0,05,0,05,0,05,0,05,0,05,0,00,0,00,0,00,0,00,0,00,0,00,0,03,1,03,1,03,1,03,1
        defb    03,1,04,1,04,1,05,1,05,1,05,1,05,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1
        defb    16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,28,1
        defb    28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1
        defb    28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1
        defb    29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1
        defb    30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1
        defb    30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1
        defb    30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1
        defb    30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1
        defb    30,1,30,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1
        defb    29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,18,1,18,1,18,1,30,0,30,0,30,0,30,0,32,0
        defb    32,0,32,0,32,0,33,0,33,0,33,0,33,0,33,0,34,0,34,0,34,0,34,0,34,0,36,0,36,0,36,0
        defb    36,0,36,0,36,0,36,0,38,0,38,0,38,0,38,0,38,0,38,0,38,0,38,0,40,0,40,0,40,0,40,0
        defb    40,0,40,0,40,0,40,0,40,0,42,0,42,0,42,0,42,0,42,0,42,0,42,0,42,0,42,0,42,0,42,0
        defb    42,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0,44,0
        defb    44,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0,47,0
        defb    47,0,47,0,47,0,47,0,47,0,47,0,47,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0
        defb    50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0
        defb    50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0
        defb    50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0
        defb    50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,0,50,1,50,1,50,1,50,1,50,1,50,1,50,1,47,1
        defb    47,1,47,1,47,1,44,1,44,1,44,1,42,1,42,1,40,1,40,1,38,1,38,1,36,1,34,1,34,1,33,1
        defb    32,1,29,1,28,1,27,1,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0
        defb    00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0
        defb    05,1,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0,05,0
        defb    05,0,05,0,05,0,05,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0
        defb    00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0
        defb    00,0,00,0,03,1,03,1,03,1,04,1,04,1,04,1,04,0,04,0,04,0,04,0,04,0,04,0,04,0,04,0
        defb    07,1,07,1,07,1,07,1,07,1,07,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,0
        defb    08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0
        defb    08,0,08,0,07,0,07,0,07,0,07,0,04,1,04,1,04,1,04,1,04,0,04,0,04,0,04,0,04,0,04,0
        defb    04,0,04,0,04,0,04,0,04,0,00,0,00,0,00,0,00,0,07,1,07,1,07,1,08,1,08,1,08,1,08,1
        defb    08,1,08,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1,09,1
        defb    09,1,09,1,09,1,09,1,09,1,09,1,09,0,09,0,09,0,09,0,09,0,09,0,09,0,09,0,08,0,08,0
        defb    08,0,08,0,08,0,08,0,08,0,08,1,08,0,08,0,08,0,08,0,07,0,07,0,07,0,07,0,07,0,07,0
        defb    07,0,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1,05,1
        defb    05,0,05,0,05,0,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,20,1
        defb    20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1
        defb    20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1
        defb    20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1
        defb    20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1
        defb    20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1
        defb    20,1,20,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,00,0
        defb    10,0,10,0,10,0,11,0,11,0,11,0,11,0,11,0,11,0,11,0,11,0,12,0,12,0,12,0,12,0,12,0
        defb    12,0,12,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,14,0,14,0,14,0,14,0,14,0,14,0
        defb    14,0,14,0,14,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,16,0,16,0,16,0,16,0,16,0
        defb    16,0,16,0,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,15,1,15,1,15,1,15,1
        defb    15,1,15,1,15,1,15,1,15,1,15,1,15,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1
        defb    14,1,14,1,14,1,13,1,13,1,13,1,13,1,13,1,00,0,00,0,00,0,00,0,00,0,00,0,00,0,00,0
        defb    00,0,00,0,00,0,00,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0
        defb    08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,08,0,09,0,09,0
        defb    08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,08,1,07,1,15,0,15,0,15,0,15,0,15,0,15,0
        defb    15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0
        defb    15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0
        defb    16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0

semgra.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0