mirror of https://github.com/nmlgc/ReC98.git
220 lines
3.7 KiB
NASM
220 lines
3.7 KiB
NASM
|
; 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(NOVA)
|
|||
|
; 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 @@SKIP
|
|||
|
mov CH,0fh
|
|||
|
sub DH,200 ; AL = 200 - AL
|
|||
|
neg DH
|
|||
|
@@SKIP:
|
|||
|
mov SI,offset Palettes
|
|||
|
mov DL,100
|
|||
|
|
|||
|
cmp PaletteNote,BX ; 0
|
|||
|
jne short @@LCD
|
|||
|
|
|||
|
|
|||
|
@@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 @@PLOOP
|
|||
|
|
|||
|
pop SI
|
|||
|
ret
|
|||
|
|
|||
|
; 液晶〜〜〜
|
|||
|
EVEN
|
|||
|
@@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 @@NEWNOTE
|
|||
|
mov DX,0ae8eh
|
|||
|
in AL,DX
|
|||
|
shr AL,2
|
|||
|
@@NEWNOTE:
|
|||
|
shr AL,1
|
|||
|
cmc
|
|||
|
ENDIF
|
|||
|
sbb AL,AL
|
|||
|
mov CS:@@XORVAL,AL ; 反転
|
|||
|
mov DX,BX
|
|||
|
|
|||
|
push DI ; 1byte
|
|||
|
mov DI,0 ; +3byte
|
|||
|
; =4(even)
|
|||
|
@@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 @@S1
|
|||
|
mov BH,AL
|
|||
|
@@S1: cmp BH,BL
|
|||
|
ja short @@S2
|
|||
|
mov BH,BL ; BH = max(r,g,b)
|
|||
|
@@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
|
|||
|
@@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 @@LLOOP
|
|||
|
|
|||
|
pop DI
|
|||
|
pop SI
|
|||
|
ret
|
|||
|
endfunc ; }
|