ReC98/libs/master.lib/palette_show.asm

220 lines
3.8 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; master library - PC98V
;
; Description:
; Palettes,PaletteToneの内容を実際のハードウェアに書き込む。
;
; Function/Procedures:
; void palette_show( void ) ;
;
; Parameters:
; none
;
; Returns:
; none
;
; Binding Target:
; Microsoft-C / Turbo-C / Turbo Pascal
;
; Running Target:
; PC-9801
;
; Requiring Resources:
; CPU: 8086
;
; Notes:
; ・PaletteToneが 0より小さければ 0 に、200より大きければ200に丸めます。
; ・PaletteTone が 0 〜 100のときは、 0 = 黒、100 = 本来の色となり、
; 常駐パレット互換となります。
; ・PaletteTone が 101 〜 200のときは、200 = 白と、常駐パレットと
;  異なり、フラッシュになります。
; ・PaletteNoteが 0 以外のときは、液晶 8階調用の表示を行います。
; ・液晶補正は、NEC製 98NOTE系の8階調表示機種用のパレット補正を
;  行うものです。このとき、反転状態にかかわらず、白が最も明るく
;  なるように補正します。
;
; 動作確認機種(確認者): ArtsLink la femyでテスト
; 98NS(hila), 98NS/E(あら), 98NS/T(M.Kit), 98NL(mau), 98NA(guri)
; 98NS/R(虹), 98NS/L()
; 98NC(うか) 9821Ne(うか)←カラー機種は液晶補正対象外
;
; Compiler/Assembler:
; TASM 3.0
; OPTASM 1.6
;
; Author:
; 恋塚昭彦
;
; Revision History:
; 92/11/16 Initial
; 92/11/26 tone : 101〜200に対応, 200=白
; 93/ 4/ 6 LCD対応
; 93/ 5/22 液晶の反転状態自動判定
; 93/12/ 5 [M0.22] Palettes[] 0..15 -> 0..255
; 94/ 1/ 9 [M0.22] NEC機での反転状態自動対応をNS/T以降にも対応
func PALETTE_SHOW ; palette_show() {
CLD
push SI
mov AX,PaletteTone
cwd ; if AX < 0 then AX = 0
not DX ;
and AX,DX ;
sub AX,200 ; if AX >= 200 then AX = 200
sbb DX,DX ;
and AX,DX ;
add AX,200 ;
mov DH,AL ; DH = tone
xor BX,BX
mov CH,BL ; 0
cmp DH,100
jna short PALSHOW_SKIP
mov CH,0fh
sub DH,200 ; AL = 200 - AL
neg DH
PALSHOW_SKIP:
mov SI,offset Palettes
mov DL,100
cmp PaletteNote,BX ; 0
jne short PALSHOW_LCD
PALSHOW_PLOOP: mov AL,BL
out 0a8h,AL ; palette number
lodsw
shr AX,4
mov CL,AH
and AL,0fh
xor AL,CH
mul DH
div DL
xor AL,CH
out 0ach,AL ; r
mov AL,CL
xor AL,CH
mul DH
div DL
xor AL,CH
out 0aah,AL ; g
lodsb
shr AL,4
xor AL,CH
mul DH
div DL
xor AL,CH
out 0aeh,AL ; b
inc BX
cmp BX,16
jl short PALSHOW_PLOOP
pop SI
ret
; 液晶〜〜〜
EVEN
PALSHOW_LCD:
mov BX,DX
IF 0
mov DX,0ae8eh
in AL,DX
and AL,4
cmp AL,1
ELSE
mov DX,0871eh
mov AL,0a0h
out 0f6h,AL
in AL,DX
cmp AL,0ffh
jnz short PALSHOW_NEWNOTE
mov DX,0ae8eh
in AL,DX
shr AL,2
PALSHOW_NEWNOTE:
shr AL,1
cmc
ENDIF
sbb AL,AL
mov CS:PALSHOW_XORVAL,AL ; 反転
mov DX,BX
push DI ; 1byte
mov DI,0 ; +3byte
; =4(even)
PALSHOW_LLOOP:
mov AX,DI
out 0a8h,AL ; palette number
lodsw
mov BX,AX ; BL = r BH = g
shr BX,4
and BL,CH
lodsb ; AL = b
and AL,CH
xor AL,CH
mul DH
div DL
xor AL,CH
xchg AL,BH ; BH = b' AL = g
xor AL,CH
mul DH
div DL
xor AL,CH
xchg AL,BL ; BL = g' AL = r
xor AL,CH
mul DH
div DL
xor AL,CH
xchg AL,BL ; BL = r' AL = g
mov AH,BH ; AL = g' AH = BH = b'
cmp BH,AL ; BL = r AL = g AH = BH = b
ja short PALSHOW_S1
mov BH,AL
PALSHOW_S1: cmp BH,BL
ja short PALSHOW_S2
mov BH,BL ; BH = max(r,g,b)
PALSHOW_S2:
shl AL,1
add AL,BL
shl AL,1
add AL,AH
add AL,BH
mov CL,3 ; al = al * 9 * 2 / ((1+2+4+1)*15) ;
mul CL ; -> 約分して al = al * 3 / 20
mov CL,20
div CL
shr AL,1 ; al = al / 2 + (al & 1) ;
adc AL,0
sub AL,2 ; al = max(al-2,0)
cmc
sbb AH,AH
and AH,AL
xor AH,0
org $-1
PALSHOW_XORVAL db ?
shr AH,1
sbb AL,AL
and AL,15
out 0aeh,AL ; b
shr AH,1
sbb AL,AL
and AL,15
out 0ach,AL ; r
shr AH,1
sbb AL,AL
and AL,15
out 0aah,AL ; g
inc DI
cmp DI,16
jl short PALSHOW_LLOOP
pop DI
pop SI
ret
endfunc ; }