PC-88 z80asmでランダムドット

```pset.asm
; z88dk / PC-88 mon
; z80asm -b -l pset.asm

TVRAM   equ     $f3c8

        org     $b000
start:
        call    crtset
        ld      iy, paint1
.mloop
        ld      hl, pset
        ld      (paint2+1), hl
        ld      (iy+1), 0
        call    paint
        ld      (iy+1), 1
        call    paint
        call    randot

        ld      hl, preset
        ld      (paint2+1), hl
        ld      (iy+1), 0
        call    paint
        ld      (iy+1), 1
        call    paint
        call    randot

        jr      mloop

paint:
        ld      b, 0
.paint1
        ld      c, 0
.paint2
        call    0
        inc     c
        inc     c
        ld      a, c
        cp      160
        jr      c, paint2
        inc     b
        ld      a, b
        cp      100
        jr      c, paint1
        ret

randot:
        ld      hl, 10000
.randot0
        push    hl
.randot1
        call    rnd
        ld      a, l
        cp      160
        jr      nc, randot1
        ld      c, a
        ld      a, h
        and     $7f
        cp      100
        jr      nc, randot1
        ld      b, a
        call    pset
.randot2
        call    rnd
        ld      a, l
        cp      160
        jr      nc, randot2
        ld      c, a
        ld      a, h
        and     $7f
        cp      100
        jr      nc, randot2
        ld      b, a
        call    preset

        pop     hl
        dec     hl
        ld      a, l
        or      h
        jr      nz, randot0
        ret

rnd:
        ld      hl, $cafe
        add     hl, hl
        ld      a, h
        jr      nc, noxor
        xor     2
.noxor
        bit     1, a
        jr      nz, noinc
        inc     l
.noinc
        ld      (rnd+1), hl
        ret

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

; point set
; b=y c=x
pset:
        call    pcalc
        or      (hl)
        ld      (hl), a
        ret

; point reset
; b=y c=x
preset:
        call    pcalc
        cpl
        and     (hl)
        ld      (hl), a
        ret

; point calc
; in : b=y c=x
; out: hl=addr a=bits
pcalc:
        ld      a, b            ; de = y & $fc
        and     $fc
        ld      e, a
        ld      d, 0

        ld      h, d            ; hl = de * 30
        ld      l, e
        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, TVRAM
        add     hl, de
        push    hl

        ld      a, c
        and     $01
        add     a, a
        add     a, a
        ld      e, a
        ld      a, b
        and     $03
        or      e
        ld      e, a
        ld      d, 0
        ld      hl, PCALC
        add     hl, de
        ld      a, (hl)
        pop     hl
        ret

PCALC:  defb    $01,$02,$04,$08,$10,$20,$40,$80
```

![pset.png](https://qiita-image-store.s3.amazonaws.com/0/257554/bb86a3e2-84e4-b40e-d7ac-fb2a279f61ff.png)