;a=character
;c=attribute
n_putchr:
or a
jp z,n_put00 ;$00=空白
cp $43
jp z,n_put43 ;$43=■
cp $EF
jp z,n_putEF ;$EF=網掛
push de
cp $C0 ;かなバンク $C0-$FF にフォント2倍テーブルを上書きしているのでカナバンクに読み替え
jr c,.safe
res 7,c
.safe:
ld l,a
ld h,$F0 >> 3 ;<< 3 したときに $F000 + a * 8 になるように
ld a,c
and %01110111
ld (WorkAtr),a
xor c ;アトリビュートの bit7=1 なら小文字/ひらがなバンクへ($F800-)
jp p,.skip
inc h ;$F8 >> 3 相当
.skip:
add hl,hl
add hl,hl
add hl,hl ;hl=font address
ld d,BitTable >> 8 ;de=BitTable 256byte * 2 ビットパターンを横 2 倍にする
ld bc,FontBuffer ;8byte * 2 PC88 用のフォントビットパターン格納バッファ. 16byte 桁上がりしない前提で inc c 使用.
ld a,%00001001 ;bit7=0:音源割込可 bit6=0:Non-ALU bit5=0:デジタル/アナログ mode bit4=0:TVRAM bit32=10:アナログ bit10:内部EROMバンク
out ($32),a
rept 7
ld e,(hl) ;元ビットパターン
ld a,(de) ;左側
ld (bc),a
inc c ;buffer++
inc d ;-> BitTable.r
ld a,(de) ;右側
ld (bc),a
inc c ;buffer++
dec d ;-> BitTable.l
inc l ;fontdata++
endm
ld e,(hl)
ld a,(de)
ld (bc),a
inc c ;buffer++
inc d ;-> BitTable.r
ld a,(de)
ld (bc),a
ld a,%01011001 ;bit7=0:音源割込可 bit6=1:ALU mode bit5=0:デジタル/アナログ mode bit4=1:Main RAM bit32=10:アナログ bit10:内部EROMバンク
out ($32),a
pop hl ;hl=VRAM
;ここまででバッファへのコピー完了
;--------------------------------------------------------------------------------------------------
;%_fff_bbb
;b=1 の場合、消去フェーズで OR で 1 を書き込む -> 該当プレーン全て 1 に
;b=0 の場合、消去フェーズで not AND で 1 を書き込む -> 該当プレーン全て 0 に
;
;b=0 f=1 の場合、書き込むフェーズで OR で 0->0 1->1
;b=1 f=0 の場合、書き込むフェーズで not AND で 0->1 1->0
;b=0 f=0 の場合、書き込むフェーズで NOP で 0->0 1->0
;b=1 f=1 の場合、書き込むフェーズで NOP で 0->1 1->1
;hl=vram(PC88)
DrawFont:
; ld a,%10000000 ;bit54=00 ポート$34の設定を使ったライト
; out ($35),a
ld a,(WorkAtr)
and %00000111 ;GRB プレーンに対して %xxx0xxx1 (BC のみ有) は OR オペレーション
out ($34),a ;GRB プレーンに対して %xxx0xxx0 (共になし) は not AND オペレーション
;消去フェーズ
;BC=1 の場合、OR で 1 を書き込み、該当プレーンのビットをセットする
;BC=0 の場合、not AND で 1 を書き込み、該当プレーンのビットをリセットする
push hl
ld a,$FF
ld bc,79
rept 7
ld (hl),a ;左側
inc l
ld (hl),a ;右側
add hl,bc
endm
ld (hl),a
inc l
ld (hl),a
;フォント書き込みフェーズ
; ld b,0 ;ALU $34 レジスタ に設定する値
ld a,(WorkAtr)
ld c,a
and %00010001
jp pe,.b03 ;xxx0xxx0 / xxx1xxx1 両対応
rrca
jr c,.r ;B=not AND (b0 のみ 1 = BC のみ)
; set 0,b
inc b ;B=OR (b4 のみ 1 = FC のみ)
jr .r
.b03:
ld b,%00010001 ;B=NOP (消去フェーズで書き込んだ VRAM のまま)
.r:
ld a,c
and %00100010
jp pe,.r03
bit 1,a
jr nz,.g ;R=not AND
set 1,b ;R=OR
jr .g
.r03:
set 1,b
set 5,b ;B=NOP
.g:
ld a,c
and %01000100
jp pe,.g03
bit 2,a
jr nz,.out ;G=not AND
set 2,b ;G=OR
jr .out
.g03:
set 2,b
set 6,b ;G=NOP
.out:
ld a,b
out ($34),a ;ALU オペレーション
pop hl ;hl=VRAM Adr
ld bc,79
di
ld (.stack + 1),sp ;自己書き換え
ld sp,FontBuffer
rept 7
pop de
ld (hl),e
inc l
ld (hl),d
add hl,bc
endm
pop de
ld (hl),e
inc l
ld (hl),d
.stack:
ld sp,$0000
ei
ret
WorkAtr: db 0 ;アトリビュート値(MZ)
|
L2A8E: ;len start:$2A8E end:$2A9E db $04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04 db $D9 L2AC3: ;seq start:$2AC3 end:$2AE2 dw $08EB,$07F2,$08EB,$07F2,$08EB,$07F2,$08EB,$0714,$08EB,$07F2,$08EB,$07F2,$08EB,$07F2,$08EB,$0714 |
;b = PSG reg(ch0=$00 ch1=$02)
;hl=input MZ value
ConvFRQ:
add hl,hl
add hl,hl
ld c,29 ;7.17056290064102564 << 2
call div168u
ld c,PSGREG
out (c),b ;R.0 / R.2
inc c
out (c),l
dec c
inc b
out (c),b ;R.1 / R.3
inc c
out (c),h
dec c
srl b
set 3,b ;R.8 / R.9
out (c),b
inc c
ld a,10 ;仮音量
out (c),a
ret
|