mirror of https://github.com/nmlgc/ReC98.git
150 lines
2.8 KiB
NASM
150 lines
2.8 KiB
NASM
; master library - (pf.lib)
|
|
;
|
|
; Description:
|
|
; 1バイト読み込み関数
|
|
;
|
|
; Functions/Procedures:
|
|
; int pfgetc(pf_t pf)
|
|
;
|
|
; Parameters:
|
|
;
|
|
;
|
|
; Returns:
|
|
;
|
|
;
|
|
; Subroutines:
|
|
; 以下は内部関数
|
|
; ※引き数は、ESレジスタに入れること
|
|
; int pfgetc1(pf_t pf) 圧縮タイプ1用のpfgetc()
|
|
; int pfgetx0(pf_t pf) 暗号なしのときの内部1byte読み出し関数
|
|
; int pfgetx1(pf_t pf) 暗号を復号化するときの内部1byte読み出し関数
|
|
;
|
|
; Binding Target:
|
|
; Microsoft-C / Turbo-C / Turbo Pascal
|
|
;
|
|
; Running Target:
|
|
; MS-DOS
|
|
;
|
|
; Requiring Resources:
|
|
; CPU: 186
|
|
;
|
|
; Notes:
|
|
;
|
|
;
|
|
; Assembly Language Note:
|
|
;
|
|
;
|
|
; Compiler/Assembler:
|
|
; TASM 3.0
|
|
; OPTASM 1.6
|
|
;
|
|
; Author:
|
|
; iR
|
|
; 恋塚昭彦
|
|
;
|
|
; Revision History:
|
|
; PFGETC.ASM 1,751 94-09-17 23:31
|
|
; 95/ 1/10 Initial: pfgetc.asm/master.lib 0.23
|
|
; 95/ 1/19 MODIFY: 内部1バイト読み込みルーチンをレジスタ渡しに変更
|
|
|
|
func PFGETC ; pfgetc() {
|
|
push BP
|
|
mov BP,SP
|
|
|
|
;arg pf:word
|
|
pf = (RETSIZE+1)*2
|
|
|
|
mov ES,[BP+pf] ; PFILE構造体のセグメント
|
|
call word ptr ES:[pf_getc]
|
|
|
|
pop BP
|
|
ret (1)*2
|
|
endfunc ; }
|
|
|
|
|
|
; 圧縮タイプ1用の pfgetc()
|
|
; 圧縮方式: 同じデータが2バイト並んだら、続くバイトが長さ。
|
|
; 256バイト以上ならば、さらに同じバイト+長さで連続できる。
|
|
public PFGETC1
|
|
PFGETC1 proc near ; pfgetc1() {
|
|
cmp ES:[pf_cnt],0
|
|
jz short @@PFGETC1_getx
|
|
dec ES:[pf_cnt]
|
|
add word ptr ES:[pf_loc],1
|
|
adc word ptr ES:[pf_loc + 2],0
|
|
mov AX,ES:[pf_ch]
|
|
ret
|
|
|
|
@@PFGETC1_getx:
|
|
call word ptr ES:[pf_getx] ; 新しいバイトが
|
|
test AH,AH
|
|
jnz short @@PFGETC1_return
|
|
|
|
cmp AX,ES:[pf_ch] ; 直前のバイトと同じ値なら
|
|
mov ES:[pf_ch],AX
|
|
jne short @@PFGETC1_return
|
|
|
|
push AX
|
|
call word ptr ES:[pf_getx] ; くり返しだ。続くバイトが
|
|
test AH,AH
|
|
jnz short @@PFGETC1_return1
|
|
mov ES:[pf_cnt],AX ; 長さね。
|
|
sub word ptr ES:[pf_loc],1
|
|
sbb word ptr ES:[pf_loc + 2],0
|
|
@@PFGETC1_return1:
|
|
pop AX
|
|
|
|
@@PFGETC1_return:
|
|
ret
|
|
PFGETC1 endp ; }
|
|
|
|
|
|
; 暗号なしのときの内部1byte読み出し関数
|
|
public PFGETX0
|
|
PFGETX0 proc near ; pfgetx0() {
|
|
mov AX,word ptr ES:[pf_read]
|
|
mov DX,word ptr ES:[pf_read + 2]
|
|
cmp DX,word ptr ES:[pf_size + 2]
|
|
jb short @@PFGETX0_getc
|
|
ja short @@PFGETX0_eof
|
|
cmp AX,word ptr ES:[pf_size]
|
|
jb short @@PFGETX0_getc
|
|
@@PFGETX0_eof:
|
|
mov AX,EOF
|
|
ret
|
|
|
|
@@PFGETX0_getc:
|
|
add AX,1
|
|
adc DX,0
|
|
mov word ptr ES:[pf_read],AX
|
|
mov word ptr ES:[pf_read + 2],DX
|
|
|
|
add word ptr ES:[pf_loc],1
|
|
adc word ptr ES:[pf_loc + 2],0
|
|
|
|
push ES
|
|
push ES:[pf_bf]
|
|
_call BGETC
|
|
pop ES
|
|
|
|
ret
|
|
PFGETX0 endp ; }
|
|
|
|
|
|
; 暗号を復号化するときの内部1byte読み出し関数
|
|
public PFGETX1
|
|
PFGETX1 proc near ; pfgetx1() {
|
|
call PFGETX0
|
|
or AH,AH ; == EOF?
|
|
jnz short @@PFGETX1_return
|
|
|
|
; 復号化
|
|
xor AL,ES:[pf_key]
|
|
; Not used in Touhou
|
|
; ror AL,4
|
|
|
|
@@PFGETX1_return:
|
|
ret
|
|
PFGETX1 endp ; }
|
|
db 0 ; word alignment
|