7.程式處理
原程式僅為解釋資料用,故瞭解資料結構後,即可瞭解程式之所作所為。在此,
我僅選擇數段具有代表性者,略作說明如次:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 主流程,程式入口
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CG SEGMENT PUBLIC ;為聯接方便,故為作任何宣告
ASSUME CS:CG,DS:CG
SS_ DW 0 ; 此緩衝區必須在本段內
SP_ DW 0 ; 同上
START:
PUSH CS
POP ES
MOV CS:SS_,SS ;先將外界之段暫存器保護之
MOV CS:SP_,SP
CMP BX,FUNC_CNT
JNC ERROR ;測輸入參數是否錯誤
OR BL,BL
JNZ START1 ;作參數處理
MOV DI,OFFSET BUFIN
MOV CX,5
REP MOVSB ;取輸入碼
JMP BEGIN ;開始組字
START1:
SHL BX,1 ;序數乘二
PUSH DS
PUSH CS
POP DS
CALL WORD PTR MKS [BX]
POP DS
ERRORT:
MOV SP,CS:SP_
MOV SS,CS:SS_
POP ES
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 參數處理功能,住址索引表。(以倉頡碼命名)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MKS DW BEGIN ;BX=0 字形組合
DW OCCG ;BX=1 繁體字設定
DW HCCG ;BX=2 簡體字設定
DW VFNHE ;BX=3 字級、字體設定
DW JCM ;BX=4 空心體
DW ODYJ ;BX=5 斜體
DW TOP ;BX=6 填花體
DW JBMMF ;BX=7 直加粗
DW JBMME ;BX=8 直減細
DW DTLCF ;BX=9 橫加粗
DW DTLCE ;BL=10 橫減細
DW HVIF16 ;BL=11 系統與排版切換專用,16點陣
DW HVIF24 ;BL=12 系統與排版切換專用,24點陣
DW OHR ;BL=13 供程式師設計用,字庫入口
DW YAV ;BL=14 供程式師設計用,使字庫退出系統
MKS_CNT EQU ($-FUNC)/2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 部份參數處理程式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DTLCF:
CMP BUFMAD,8 ;橫之定義
JAE DTLCRET ;目前所定不可大於八
INC BUFMAD
DTLCRET:
RET
DTLCE:
DEC BUFMAD
JA DTLCRET
MOV BUFMAD,1 ;不可小於一
RET
JBMMF:
CMP BUFDBM,8 ;直之定義
JAE DTLCRET ;目前所定不可大於八
INC BUFDBM
RET
JBMME
DEC BUFDBM
JA DTLCRET
MOV BUFDBM,1 ;不可小於一
RET
OCCG:
MOV BUFOH,BH ;設繁體旗號
RET
HCCG:
MOV BUFOH,BL ;設簡體旗號
RET
JCM:
XOR BUFJCM,BL ;設空心體旗號
RET
ODYJ:
XOR BUFITL,BL ;設斜體旗號
RET
TOP:
MOV WORD PTR BUFTEN,DX ;存花色
RET
YAV:
MOV AX,PSPM ;取出原始系統參數
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 空心體處理,原字形在 SI 中
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTLINE:
CALL XVALUE ;求字框值
PUSH SI ;原字形
MOV BX,OFFSET PATN2 ;第二組緩衝區
MOV DI,OFFSET PATN1 ;第一組緩衝區
INC CX ;高度值
PUSH CX
MOV BP,18 ;防最大值越區用
EMPTY_2:
PUSH BX
PUSH CX
PUSH SI
PUSH DI
MOV CX,DX ;先做一行
CLC ;先清旗號,以便移轉
EMPTY_3:
LODSB ;取原形
STOSB ;保存在第一區
RCR AL,1 ;移位
LAHF ;保留溢位
XOR AL,[SI-1] ;與原值交集
OR [BX],AL ;置入第二區
OR [BX+18],AL ;置入第二區之下一行
INC BX
SAHF ;取出溢位值
LOOP EMPTY_3
MOV AL,0
RCR AL,1
OR [BX],AL ;補右側一點
OR [BX+18],AL ;補下行一點
POP DI
POP SI
POP CX
POP BX
ADD SI,16 ;換行
ADD DI,BP ;換行,新區較大
ADD BX,BP ;換行,新區較大
LOOP EMPTY_2 ;第二區,左右為空心形
POP CX
POP DI ;原字形,亦為輸出字形
MOV SI,OFFSET AUXI1 ;第一區保留原字形
MOV BX,OFFSET AUXI2 ;第二區為左右空心形
INC CX
EMPTY_4:
PUSH BX
PUSH CX
PUSH SI
PUSH DI
MOV CX,DX
EMPTY_5: ;第二次再使上下為空心形
LODSB
XOR AL,[DI] ;處理本行
OR AL,[BX] ;與左右空心相合
STOSB ;存入輸出區
INC BX
LOOP EMPTY_5
POP DI
POP SI
POP CX
POP BX
ADD BX,BP
ADD SI,BP
ADD DI,16
LOOP EMPTY_4 ;各行做完
EMPTY_RET:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 填花體處理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 花色種類表
FAN DW FAN0,FAN1,FAN2,FAN3,FAN4
DW TOP,FAN5,FAN6,FAN7,FAN8
; 花色種類
FAN0 DB 0FFH,0FFH,00FH,0F0H
FAN1 DB 0CCH,0CCH,0CCH,0CCH,033H,033H,033H,033H,00FH,0F0H
FAN2 DB 0AAH,0AAH,055H,055H,00FH,0F0H
FAN3 DB 080H,080H,040H,040H,020H,020H,010H,010H
DB 08H,08H,04H,04H,02H,02H,01H,01H,0FH,0F0H
FAN4 DB 011H,011H,022H,022H,044H,044H,088H,088H,0FH,0F0H
FAN5 DB 028H,058H,034H,088H,06BH,0D4H,0C4H,023H
DB 028H,014H,010H,008H,010H,008H,010H,008H
DB 010H,088H,038H,014H,0C4H,023H,083H,0F4H
DB 082H,08CH,083H,08BH,044H,08CH,038H,078H,0FH,0F0H
FAN6 DB 057H,0AAH,02BH,0D0H,007H,0A0H,00BH,0C0H,0FH,0F0H
FAN7 DB 000H,000H,001H,0C0H,002H,020H,004H,010H
DB 004H,010H,01CH,09CH,022H,0A2H,041H,041H
DB 046H,031H,021H,042H,01EH,0BCH,008H,088H
DB 010H,014H,011H,044H,009H,048H,006H,030H,0FH,0F0H
FAN8 DB 07FH,07FH,041H,041H,05DH,05DH,051H,045H
DB 05FH,07DH,040H,001H,07FH,07FH,001H,040H
DB 07DH,05FH,045H,051H,055H,055H,05DH,05DH
DB 041H,041H,07FH,07FH,000H,000H,0FH,0F0H
; 處理程式,原字形設在 DI 中
TENTEN:
INC CX
INC CX
SUB BH,BH
MOV BL,BYTE PTR BUFTEN+1 ;取花色
SHL BX,1
MOV BX,TOP [BX]
MOV BP,BX
FANCY:
MOV BX,BP
TENS0:
CMP WORD PTR [BX],0F00FH ;終止指令
JE FANCY
PUSH CX
MOV CL,8
TENS1:
LODSW
AND AX,[BX]
OR [DI],AX
INC DI
INC DI
LOOP TENS1 ;完成一行
INC SI
INC SI
TENS2:
POP CX
INC BX
INC BX
LOOP TENS0 ;全部完成
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 斜體處理,原字形在 SI 中
; 若需不同斜度,可由參數決定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ITALIC:
MOV BX,WORD PTR BUFY
SUB BH,BL
INC BH
MOV AL,BH
SHR BH,1
SHR BH,1
SHR BH,1
SUB AH,AH
DIV BH ;斜度為直向1/8
CALL XVALUE
INC DX
MOV BL,BH
MOV AH,AL
ITAL1:
MOV BH,BL
ITAL2:
PUSH SI
MOV CX,DX
CLC
ITAL3:
RCR BYTE PTR [SI],1
INC SI
LOOP ITAL3
POP SI
DEC BH
JNZ ITAL2
ADD SI,10H ;左右最大值設為128點
DEC AL
JNZ ITAL1
MOV AL,AH
DEC BX
JNZ ITAL1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 程式開始,以下僅為主要之流程
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BEGIN:
MOV DI,OFFSET BUFOUT
CALL CLEBUF ;清輸出緩衝區
AND DL,7 ;點陣左側起點有效值
MOV BL,DL
MOV BUFWR,DL ;存入緩衝器
MOV BH,BL
MOV AX,WORD PTR BFDX2 ;原輸入值
ADD AX,BX
MOV WORD PTR BFTDX2,AX ;操作區之範圍
MOV AL,BFDX8
ADD AL,BL
MOV BFTDX8,AL ;1/8X之有效值
ADD BX,WORD PTR BUFX
MOV DX,WORD PTR BUFY
MOV WORD PTR BUFHX1,BX
MOV WORD PTR BUFHY1,DX
MOV SI,OFFSET BUFIN ;輸入碼
LODSW
CMP AL,20H
JA ASC ;為 ASCII
CMP AX,1919H
JNE NODHER ;為中文
CMP BYTE PTR[SI+1],0 ;為符號碼
JE NODHER
CMP BYTE PTR [SI],18H ;YYX
JB NODHER
JE DHER
CMP BYTE PTR[SI+1],18H ;YYYX?
JAE NODHER
DHER:
JMP GODHER
ASC:
JMP ASCIN
NODHER:
MOV BP,AX
MOV BH,AL
LODSW
CALL SHLAX ;求對照碼
OR AL,[SI]
XCHG BP,AX
CMP BUFOH,CH
JE NONHANA
JMP SEARCHH ;簡體
NONHANA:
SHL AX,1
SUB BH,BH
MOV BL,AL
MOV DI,WORD PTR TAB54[BX] ;25*26*2之值
MOV BL,AH
ADD DI,BX ;取索引表之值
ADD DI,OFFSET CG2I1 ;索引表
MOV SI,[DI] ;索引所得之位置
MOV DX,OFFSET DG1ET21 ;單字首、複字首分界值
CMP SI,DX ;單字首?複字首
PUSHF
JNC BE04
BE00:
CMP DI,OFFSET CG2I2
JE BE05
INC DI
INC DI
CMP [DI],DX
JAE BE00
BE01:
MOV DI,[DI]
BE011:
SUB DX,DX
CALL BINARY ;二分法找字
JC BE02
MOV AX,DG2 ;換段
MOV DS,AX
BE012:
SUB CH,CH
LODSW
TEST AH,80H ;1=指令,0=資料
JNZ BEOK ;找到資料
CALL ANALY ;找到指令,分析
JMP SHORT DELETE
BE04:
CMP DI,OFFSET CG2I2
JE BE041
INC DI
INC DI
CMP [DI],DX
JB BE04
JMP BE01
BE05:
MOV DI,OFFSET DG1ET21
JMP BE011
BE041:
MOV DI,OFFSET DG1ET24
JMP BE011
BEOK:
SHL AX,1
ADD AX,OFFSET DG3T8000
MOV SI,AX
MOV BX,DG3
MOV DS,BX
MOV SI,[SI]
MOV DI,OFFSET BUFMAP
MOV BX,CG2
MOV DS,BX
MOV ES,BX
SUB BX,BX
CMP BUFHY6,0FFH
JE BEOK1
TEST BYTE PTR [SI+1],20H
JZ BEOK0
MOV DL,BUFOY
MOV BUFHY1[BX],DL
BEOK0:
TEST BYTE PTR [SI+1],80H
JZ BEOK2
TEST BYTE PTR [SI+1],10H
JNZ BEOK1
BEOK2:
MOV DL,BUFOY+1
MOV BUFHY1+1[BX],DL
BEOK1:
JMP SHORT MAPO
BE02:
CMP ES:BYTE PTR BUFIN,18H
JNE BE020
ERROR0:
JMP ERROR
BE020:
CALL CKAN
JE BE03
BE07:
POPF
CALL AUTO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 字形處理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELETE:
CALL DIVALL
SUB BX,BX
MOV BFLAGAL,CL ;FOR CHKUP
DEC CX
DEC CX
DELET1:
PUSH CX
PUSH BX
MOV SI,WORD PTR INSTB[BX]
CALL CS:FRATB[SI]
POP BX
EXBACK:
INC BX
INC BX
POP CX
CMP BL,CL
JB DELET1
MOV BUFS1+1,BH
MOV BUF020,BH
MOV BUFKMKR,BH
CMP BL,0CH
JAE ERROR0
MOV BFLAGAL,BL ;FOR MOD2 CONBI. NO.
MOV DI,OFFSET BUFMAP
MAPL:
MOV SI,CS:BUFHTB[BX] ;DATA ADDR
MAPO:
CALL CHK012
PUSH BX
MOV BLAG,BL
CALL MAPIN
POP BX
DEC BX
JL MAPLOK
DEC BX
JMP MAPL
MAPLOK:
JMP CCGRET
BE03:
CALL ANTAUT
POP BP
JMP DELETE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 自動組字處理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AUTO:
PUSHF
MOV AX,CG2
MOV DS,AX
MOV AX,WORD PTR BUFIN
CMP BUFOH,BH
JNE HAUTO ;HANA AUTO
SINA1:
MOV BUFDEL,BH
MOV BL,AL
SHL BX,1
MOV SI,DS:WORD PTR CG2I3-2[BX]
ADD SI,OFFSET DG1BT01
POPF
JNC MUTAUT
CMP BUFIN+4,0
JNE ERROR1
MOV BL,DH ;DH = THE ORDER OF HEAD
CALL ANALYR
CALL SHFX1
JMP SHORT BODY
SINA0:
MOV BLAG,BH
SINA:
CMP ES:BUFOH,BH
JE SINA2
MOV ES:BUFDEL,1
SINA2:
STC
JMP AUTO
ERROR1:
JMP ERROR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 複字單處理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MUTA:
CMP ES:BUFOH,BH
JE AUTO
OR DH,DH
JZ AUTO
MOV ES:BUFDEL,1
JMP AUTO
MUTAUT:
MOV BUFMUT,AX
MOV BP,DG1
MOV DS,BP
DEC SI
MUTIH0:
INC SI
CMP [SI],AH
JNE MUTIH0
MOV BL,DH ;SAME AS SINAUT
CALL ANALYR
MOV BUFA,BL
MOV SI,OFFSET BUFIN+2
CMP [SI],BH
JZ SINA0
MOV CX,5
MOV DI,OFFSET BUFIN
REP MOVSB
BODYM1:
MOV SI,OFFSET BUFIN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 字身處理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BODY:
LODSW
SHL AX,1
MOV BL,AL ;THE 1ST BODY CODE *2 IN BL
MOV DI,TAB54[BX]
MOV BL,AH
LODSB
MOV SI,WORD PTR CG2I2[BX][DI]
ADD SI,OFFSET DG1BT01-1
MOV BP,DG1
MOV DS,BP
BODY1:
INC SI
CMP AL,[SI]
JE BOOK
JNB BODY1
MOV AX,CG2
MOV DS,AX
CMP BUFA,BH
JE ERROR1
CMP BUFIN+2,BH
JNE ERROR1
MOV AX,WORD PTR BUFMUT
XCHG AX,WORD PTR BUFIN
MOV WORD PTR BUFIN+2,AX
MOV BUFA,BH
MOV BLAG,BH
MOV BUFDEL,1
JMP SINA2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 反字首處理
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANTAUT:
CALL ANALY0
MOV AX,WORD PTR BUFIN
MOV BL,AL
SHL BX,1
MOV DI,TAB54[BX]
SHR DI,1
MOV BL,AH
MOV CL,BYTE PTR CG2I4[BX][DI]
JCXZ AN03
CMP CL,1AH
JE AN04
XCHG AH,CL
MOV WORD PTR BUFIN,AX
AN03:
MOV BUFIN+2,CL
JMP BODYM1
AN04:
MOV BLAG,BH
POP BP
JMP BE07
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 找到字形資料後之檢查
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BOOK:
MOV BL,DL
ANALYR:
ADD SI,BX
SHL SI,1
SUB SI,OFFSET DG1BT01
ANALY0:
MOV AX,DG2
MOV DS,AX
LODSW
TEST AH,80H
JZ ANALY
MOV DI,DG3
MOV DS,DI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 存資料內容
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SAVEH:
SHL AX,1
ADD AX,OFFSET DG3T8000
MOV DI,AX
MOV AX,[DI]
MOV DI,CG2
MOV DS,DI
MOV ES,DI
MOV BL,BLAG ;FLAG
MOV DI,AX
MOV AX,[DI]
SAVEH5:
PUSH AX
AND AX,0F000H
MOV WORD PTR BFADJB[BX],AX
POP AX
SAVEH3:
AND AH,0FH
MOV WORD PTR XYTB[BX],AX
MOV CS:WORD PTR BUFHTB[BX],DI
XCHG CH,BYTE PTR BUFOUT
OR CH,CH
JNZ SAVEH2
MOV CH,[DI+2]
SAVEH2:
MOV CL,CH
SUB CH,CH
MOV WORD PTR INSTB[BX],CX
INC BX
INC BX ;FLAG INC 2
MOV BLAG,BL
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 分析結構指令
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANALY:
PUSH AX
MOV AX,DG2
MOV DS,AX
MOV AX,CG2
MOV ES,AX
POP AX
MOV BL,AH
SHR BX,1
AND BL,7EH
JMP CS:ANYTB[BX]
ANY00:
MOV DX,AX
ANY01:
JMP SINA
ANY04:
MOV DX,AX
SUB DH,4
ANY05:
JMP MUTA
ANY08:
SUB AH,8
CALL SHFX
JMP ANY01
ANY0C:
SUB AH,0CH
CALL SHFX1
CALL SHFCOD
MOV DL,7
AND DL,DH
MOV DH,AH
MOV BUFIN+4,AL
JMP ANY05
ANY10:
SUB BP,BP
PUSH BP
CALL SHFX1
CALL SHFCOD
PUSH DX
MOV DH,AL
MOV AX,[DI-3]
CALL SHLAX
OR AL,DH
MOV BP,AX
ANY1010:
CALL CKAN
CALL ANALY0
POP DX
OR DH,DH
JZ ANY102
XCHG DH,BYTE PTR BUFIN+1
ANY102:
MOV BYTE PTR BUFIN+2,DH
MOV WORD PTR BUFIN+3,0
POP DX
ANY103:
JMP BODYM1
ANY14:
CALL SHFCOD
MOV DL,DH
SUB DH,DH
PUSH DX
MOV DH,AL
PUSH DX
JMP ANY1010
ANY18:
SUB DX,DX
ANY180:
AND AL,1FH
JZ ANY181
XCHG ES:BUFIN+2,AL
ANY181:
MOV ES:BUFIN+3,AL
MOV ES:BUFIN+4,BH
JMP ANY01
ANY1C:
SUB DX,DX
ANY1C0:
PUSH DX
CALL SHFCOD
MOV SI,OFFSET BUFIN
OR DH,DH
JZ ANY1C1
XCHG [SI+2],DH
MOV [SI+3],DH
INC SI
ANY1C1:
POP DX
OR AL,AL
JZ ANY1C2
XCHG [SI+2],AL
MOV [SI+3],AL
ANY1C2:
JMP MUTA
ANY44:
MOV DX,1
JMP ANY180
ANY48:
MOV DX,2
JMP ANY180
ANY4C:
MOV DX,100H
JMP ANY180
ANY50:
MOV DX,101H
JMP ANY180
ANY54:
MOV DX,200H
JMP ANY180
ANY58:
MOV DX,201H
JMP ANY180
ANY5C:
MOV DX,1
JMP ANY1C0
ANY60:
MOV DX,2
JMP ANY1C0
ANY64:
MOV DX,100H
JMP ANY1C0
ANY68:
MOV DX,101H
JMP ANY1C0
ANY6C:
MOV DX,200H
JMP ANY1C0
ANY70:
MOV DX,201H
JMP ANY1C0
ANY74:
MOV DX,300H
JMP ANY1C0
ANY78:
MOV DX,301H
JMP ANY1C0
ANY20:
CALL SHFCOD
JZ ANY201
XCHG ES:BUFIN+1,AL
ANY201:
MOV ES:BUFIN+2,AL
MOV SI,OFFSET DG1ET24
MOV DL,DH
SUB DH,DH
SHL DL,1
ADD SI,DX
SUB DX,DX
CALL ANALY0
JMP ANY103
ANY24:
SHL AX,1
TEST AH,4
JNZ ANY26
AND AX,3FEH
MOV SI,OFFSET DG3T2400
MOV CL,50H
ANY241:
ADD SI,AX
ADD SI,AX
PUSH SI
INC SI
INC SI
CALL DG3ANA
POP SI
ANY242:
JMP DG3AN1
ANY26:
TEST AH,2
JNZ ANY27
AND AX,1FEH
MOV SI,OFFSET DG3T2600
MOV CL,46H
ANY261:
ADD SI,AX
ANY262:
CALL DG3ANB
JMP DG3ANA
ANY27:
TEST AH,1
JNZ ANY278
SUB AH,AH
MOV SI,OFFSET DG3T2700
MOV CL,8AH
ANY2700:
ADD SI,AX
ANY2701:
CALL DG3ANB
MOV CL,46H
JMP ANY262
ANY278:
OR AL,AL
JS ANY27C
SUB AH,AH
MOV SI,OFFSET DG3T2780
MOV CL,48H
JMP ANY261
ANY27C:
TEST AL,40H
JNZ ANY27E
AND AX,7FH
MOV SI,OFFSET DG3T27C0
MOV CL,4CH
ADD SI,AX
CALL DG3ANB
JMP ANY2701
ANY27E:
AND AX,3FH
MOV SI,OFFSET DG3T27E0
MOV CL,4AH
JMP ANY2700
ANY28:
AND AH,7
ADD AX,AX
MOV CL,52H
MOV SI,OFFSET DG3T2800
JMP ANY241
ANY30:
SUB AH,30H
ADD AX,AX
ADD AX,AX
MOV SI,OFFSET DG3T3000
ADD SI,AX
MOV AX,DG3
MOV DS,AX
PUSH SI
MOV SI,[SI]
ADD SI,OFFSET DG1BT01
CALL ANALY0
POP SI
INC SI
INC SI
JMP ANY242
ANY7C:
ADD AX,AX
MOV SI,AX
ADD AX,AX
TEST AH,8
JNZ ANY7E
AND AH,3
MOV SI,OFFSET DG3T7C00
ADD SI,AX
MOV ES:BYTE PTR BUFOUT,4EH
ANY7C0:
CALL CGDATA
MOV BYTE PTR BUFOUT,8
CGDATA:
PUSH SI
MOV AX,DG3
MOV DS,AX
MOV AX,[SI]
CALL SAVEH
POP SI
INC SI
INC SI
RET
ANY7E:
ADD AX,SI
AND AH,1
MOV SI,OFFSET DG3T7E00
ADD SI,AX
MOV ES:BYTE PTR BUFOUT,4AH
CALL CGDATA
JMP ANY7C0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 二分法找字
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BINARY:
MOV AX,DG1
MOV DS,AX
MOV AX,DI
SUB AX,SI
JZ BINO
MOV CX,1
BINA:
SHL CX,1
SHR AX,1
JNZ BINA
BINAA:
MOV BL,2
CMP BP,[SI]
JBE BINOK
BINA0:
SHR CX,1
ADD SI,CX
CMP CL,BL
JE BINP
CMP SI,DI
JAE BINA3
CMP BP,[SI]
JE BINOK
JA BINA0
BINA2:
SHR CX,1
SUB SI,CX
CMP CL,BL
JE BINP
CMP BP,[SI]
JA BINA0
JB BINA2
RET
BINA3:
SUB SI,CX
JMP BINA0
BINP:
CMP BP,[SI]
JE BINOK
BINO:
STC
BINOK:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 查是否反字首 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CKAN:
MOV CX,DG1
MOV DS,CX
MOV SI,OFFSET DG1ET24
MOV DI,OFFSET DG1BT01
MOV CX,64
JMP BINAA
CHKANT:
CMP BYTE PTR INSTB[BX+2],6
JE CHKANT0
CMP BYTE PTR INSTB[BX+2],52H
JNE CHKDLRT
CHKANT0:
INC BX
INC BX
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 清緩衝區 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLEBUF:
CALL XVALUE
SHR DL,1
CMP DL,8
JE CLEBU2
INC DX
CLEBU2:
MOV CX,DX
SUB SI,CX
SUB SI,CX
MOV DH,BUFOY+1
INC DH
CLEBUF1:
MOV CL,DL
REP STOSW
ADD DI,SI
DEC DH
JNS CLEBUF1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 處理字首
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOVHH:
MOV DI,OFFSET BUFHH
INC BX
CMP [DI],BH
JE MOVHH1
ADD DI,3
MOVHH1:
MOV [DI],BL
INC DI
DEC BX
MOV AL,BUFHX1+1[BX]
STOSB
MOV AL,BUFHY1+1[BX]
TEST BFADJB[BX+1],80H
JNZ MOVHH2
MOV DH,AL
CALL CMPY2
MOV AL,DH
MOVHH2:
STOSB
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 檢查各種字形條件
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 查是否有斜
CHKODJA: ;FOR FRA06
XCHG AX,DX
DEC BX
DEC BX
CALL CHKODJ
XCHG AX,DX
CHKODJB:
INC BX
INC BX
RET
CHKODJ:
TEST BYTE PTR BFADJB[BX+3],10H
JZ CHKODJ0
PUSH AX
PUSH BX
MOV BX,AX ;X1,X2 OF THE HEAD PART
CMP SI,5AH
JE CHKODJ2
CMP BUFS1+3,1
JE CHKODJ2
CMP SI,60H
JE CHKODJ4
CMP SI,1
JA CHKODJ1
JE CHKODJ2
CMP BUFF,56H
JE CHKODJ4
CALL DIVDX5 ;54,58,94
JMP SHORT CHKODJE
CHKODJ1:
CMP SI,4
JE CHKODJ2
CHKODJ4:
CALL DIVDX4
JMP SHORT CHKODJE
CHKODJ2:
CALL DIVDX3 ;4,A6,A8,AA
CHKODJE:
POP BX
CMP AL,BUFDB1
JAE CHKODJF
MOV AL,BUFDB1
CHKODJF:
MOV BUFOJ1[BX+2],AL
POP AX
CHKODJ0:
MOV BUFS1+3,BH
MOV BUFF,BH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 查是否需要下降?
CHKDOWN0: ;FOR THOSE Y1,Y2 IN DX
TEST BFADJB [BX+3],80H
JZ CHKODJ0
CHKDOWN8:
TEST BFADJB [BX+3],10H
JZ CHKODJ0
CHKDOWN3:
CMP SI,2CH
JE CHKDOW50
CMP SI,2EH
JE CHKDOW50
CMP DH,BUFY+1
JE DOWNRET
SUB DH,BFDY32
RET
CHKDOWN:
CMP BUF02,1
JBE CHKDOWN60
CMP SI,2EH
JE CHKDOWN5
OR BL,BL
JZ CHKODJ0
CHKDOWN5:
PUSH BX
JMP SHORT CHKDOWN6
CHKDOWN60:
PUSH BX
CMP BUFDEL,52H
JE DOWNRT
CMP BFLAGAL,6
JB CHKDOWN6
JA CHKDOWN9
OR BL,BL
JNZ CHKDOWN6
CHKDOWN9:
INC BX
INC BX
CHKDOWN6:
TEST BFADJB[BX+3],80H
JZ DOWNRT
CMP BUF06,1
JE CHKDOWN7
TEST BFADJB[BX+3],10H
JZ DOWNRT
CHKDOWN7:
POP BX
PUSH DX
MOV DH,BYTE PTR BUFHY1+3[BX]
CALL CHKDOWN3
MOV BYTE PTR BUFHY1+3[BX],DH
POP DX
RET
CHKDOW50:
CALL TEST151
JNZ CHKDOW51
CALL CHKBONH6
CHKDOW51:
JMP SUBDHAW
DOWNRT:
POP BX
DOWNRET:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 查是否需要上升?
CHKUP:
CMP BYTE PTR INSTB[BX+2],52H ;ANTIHEAD FRA52
JNE CHKUP0
TEST BYTE PTR BFADJB[BX+5],20H
JZ DOWNRET
JMP SHORT CHKUP00
CHKUP0:
TEST BYTE PTR BFADJB[BX+3],20H
JZ DOWNRET
CHKUP00:
PUSH AX
MOV AL,BYTE PTR BUFTEM+2
SHR AL,1
CMP SI,78H
JE CHKUP02
CMP SI,22H ;FOR FRA22,14,42
JNE CHKUP01
CHKUP02:
SUB AL,BUFAW
JNC CHKUP01
SUB AL,AL
CHKUP01:
CMP SI,88H
JE CHKUP010
CMP BFLAGAL,6
JB CHKUP03
OR BL,BL
JNZ CHKUP03
CALL CMP020
JE CHKUP03
TEST BFADJB[BX+5],20H
JNZ CHKUP03
CHKUP010:
SHR AL,1
CHKUP03:
CALL TEST151
JNZ CHKUP04
CALL YDIVAL
CHKUP04:
SUB DL,AL
JNS CHKUP1
MOV DL,1
CHKUP1:
POP AX
RET
CHKUPDL: ;FRA09,FRA8A
MOV CH,BUFTEM+2
SHR CH,1
CMP BYTE PTR XYTB+3[BX],1
JNE CHKDL0
SUB AH,CH
SUB DL,CH
CHKDL0:
CMP SI,4EH
JNE CHKDL1
CMP BUFDEL,8
JNE CHKDL2
ADD AH,CH
ADD DL,CH
CHKDL2:
SHL CH,1
CHKDL1:
TEST BYTE PTR BFADJB[BX+3],20H
JZ CHKDLRT
SHR CH,1
SUB DL,CH
CHKDLRT:
RET
CHK012A:
OR BUFS,80H
CALL CHK012
RET
CHK012:
CMP BUFOY+1,2
JA CMPY1RET
POP BP
TEST BUFS,80H
JZ CHK015
POP BP
CHK015:
MOV BL,BUFOY+1
MOV BP,WORD PTR BUFKSY
MOV SI,OFFSET BUF012
MOV DI,OFFSET BUFOUT
CHK014:
MOVSB
DEC BL
JS CHK013
DEC DI
ADD DI,BP
JMP CHK014
CHK013:
JMP CCGRE1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 計算字形橫直向之比例
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVAX:
XCHG AH,AL
SUB AL,AH
INC AX
SUB AH,AH
DIV CL
OR AL,AL
JNZ DIVAX5
INC AX
SUB AH,AH
DIVAX5:
PUSH DX
PUSH CX
MOV DX,AX
MOV AL,AH
SUB AH,AH
MOV CH,BL
MOV BL,BH
SUB BH,BH
CMP BL,BH
JNE DIVAX0 ;VERTICAL
OR DI,DI
JZ DIVAX3
CMP DI,4 ;"TEFH"
JE DIVAX3
DIVAX1:
MOV CL,BYTE PTR XYTB[BX]
DIVAX2:
MOV BL,CH
MUL CL
POP CX
DIV CL
MOV AH,AL
MOV AL,DL
POP DX
RET
DIVAX0:
OR DI,DI
JZ DIVAX1
CMP DI,4
JE DIVAX1 ;"DTYJ"
CMP DI,0AH
JE DIVAX1 ;"HBUI"
CMP DI,8 ;"JEG"
JE DIVAX4
DIVAX3:
MOV CL,BYTE PTR XYTB[BX+2]
JMP DIVAX2
DIVAX4:
MOV CL,BUFF
JMP DIVAX2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 分組處理
DVTB DW DVTB00
DW DVTB02
DW DVTB04
DW DVTB06
DW DVTB08
DW DVTB0A
DW DVTB0C
DW DVTB0E
DVTB066:
CMP AH,07H
JAE DVTB660
MOV AH,7
JMP SHORT DVTB01
DVTB660:
CMP AH,0AH
JBE DVTB01
DEC AH
JMP SHORT DVTB01
DVTB02A:
CMP AH,8
JB DVTB02A0
DVTB02A1:
JA DVTB01
INC AH
JMP SHORT DVTB01
DVTB02A0:
MOV AH,8
JMP SHORT DVTB01
DVTB06E:
CMP AH,6
JBE DVTB000
CMP AH,0AH
JAE DVTB06E0
CMP CH,6EH
JE DVTB06E1
MOV AH,8
RET
DVTB06E0:
MOV AH,0AH
RET
DVTB06E1:
CMP AH,8
JBE DVTB06E2
DEC AH
DVTB06E2:
RET
DVTB000:
MOV AH,7
RET
DVTB044:
CMP AH,6
JA DVTB660
INC AH
JMP SHORT DVTB01
DVTB01:
SUB CH,CH
DEC BX
DEC BX
JZ DIVAL1
JMP DIVLOP
DVTB10:
CMP AH,6
JA DVTB01
INC AH
JMP SHORT DVTB01
DIVAL1:
PUSH BP
MOV CX,AX
MOV AX,WORD PTR BUFHX1
MOV BYTE PTR BUFMUT+1,CL
CMP CL,9
JB DIVALBX
CMP BUFWRB,BH
JNE DIVALBX0
CMP BUFMAD,BH
JE DIVALBX
CMP BUFDBM,7
JAE DIVALBX
DIVALBX0:
SUB AL,BUF03
ADD AH,BUF03
MOV WORD PTR BUFHX1,AX
DIVALBX:
MOV BH,BUFDEL
CMP BH,66H
JB DIVALB1
CMP BH,6CH
JA DIVALB2
JMP SHORT MODF10
DIVALB2:
CMP BH,0A4H
JNE DIVAL12
DIVAL12:
MOV BH,BUF02
MOV BUF020,BH
SUB BH,BH
MOV BL,BLAG
CALL DIVAX
MOV WORD PTR BUFTEM,AX
POP BP
MOV CL,CH
MOV AX,WORD PTR BUFY
CMP BYTE PTR BUFMUT,1
JNE DIVAL16
PUSH DX
MOV DX,AX
CALL DY16U
CMP BUFDEL,0A4H
JNE DIVAL100
SUB DH,AL
CALL DY10D
DIVAL100:
MOV AX,DX
POP DX
DIVAL16:
MOV BH,1
CALL DIVAX
MOV WORD PTR BUFTEM+2,AX
MOV CX,BX
RET
MODF1E:
MOV BP,OFFSET YDIV8
JMP MODF2A0
DIVALL:
MOV BL,BLAG
DEC BX
DEC BX
MOV AX,WORD PTR XYTB[BX]
MOV BYTE PTR INSTB[BX],BH
DIVLOP:
MOV DI,WORD PTR INSTB-2[BX]
MOV WORD PTR BUFDEL,DI
SHR DI,1
MOV CL,CS:DELTB[DI]
MOV DI,CX
JMP DVTB[DI]
DVTB0C:
DEC AL
DVTB06:
INC AH
DVTB02:
MOV CH,BUFDEL
CMP BLAG,6
JB DVTB020
CMP CH,06H
JE DVTB020
CMP CH,60H
JE DVTB020
INC BUFKMKR
DVTB020:
INC BUF02
ADD AL,BYTE PTR XYTB-2[BX]
CMP BL,2
JE DVTB023
CMP AH,BYTE PTR XYTB-1[BX]
JNB DVTB023
MOV AH,BYTE PTR XYTB-1[BX]
DVTB023:
CMP CH,46H
JNE DVTB022
DEC AL
DVTB022:
JMP DVTB01
DVTB0E:
MOV DI,4
INC AH
JMP SHORT DVTB04
DVTB0A:
DEC AH
DVTB04:
INC BUF080
ADD AH,BYTE PTR XYTB-1[BX]
CMP BUFDEL,70H
JE DVTB70
CMP BUFDEL,48H
JNE DVTB040
INC AL
DVTB040:
CMP AL,BYTE PTR XYTB-2[BX]
JNB DVTB041
MOV AL,BYTE PTR XYTB-2[BX]
DVTB041:
JMP DVTB01
DVTB70:
CMP AH,5
JAE DVTB700
INC AH
JMP DVTB040
DVTB700:
CMP AH,0CH
JB DVTB040
DEC AH
JMP DVTB040
DVTB08:
PUSH AX
MOV CL,BYTE PTR XYTB[BX]
ADD CL,BYTE PTR XYTB-2[BX]
MOV CH,BYTE PTR XYTB-6[BX]
JMP SHORT DVTB0823
DVTB0821:
MOV CH,BH ;BH=0
JMP SHORT DVTB081
DVTB082:
MOV CH,BYTE PTR XYTB-4[BX]
DVTB0823:
ADD CL,CH
DVTB081:
MOV AX,WORD PTR BUFHX1
CALL DIVAX
MOV WORD PTR BUFTEM+4,AX
SUB DL,DL
MOV AL,BYTE PTR XYTB-1[BX]
MOV AH,BYTE PTR XYTB+1[BX]
MOV BUFF,AL
SUB AL,AH
JBE DVTB080
MOV DL,AL
POP AX
ADD AH,DL
DVTB083:
OR CH,CH
JZ DVTB0830
SUB CL,CH
MOV CH,BH
DVTB0830:
CMP AL,CL
JAE DVTB0831
MOV AL,CL
DVTB0831:
JMP DVTB01
DVTB080:
MOV BUFF,AH
POP AX
JMP DVTB083
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 計算各字形之框值
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FRAXB:
CALL XYNO
CALL HE02Y1Y2
MOV DX,AX
FRAX:
ADD CH,BYTE PTR XYTB[BX] ;X VALUE
MOV AX,WORD PTR BUFTEM ;AL=YCBR AH=OIOMD
FRAXY:
SUB CL,CL
FRAXY0:
ADD CL,AL
DEC CH
JNZ FRAXY0
ADD AH,CL
MOV CL,AH ;CL=TQM OJBM
MOV AL,DL ;AX=TBLN FQ
ADD AH,AL
MOV DL,AH ;DX=HOVIE FQ
RET
FRAY:
MOV CH,BYTE PTR XYTB+1[BX]
FRAY1:
MOV AX,WORD PTR BUFTEM+2
JMP FRAXY
XYNO:
MOV AX,WORD PTR BUFHX1[BX]
MOV WORD PTR BUFHX1+2[BX],AX
XYNO1:
MOV DX,WORD PTR BUFHY1[BX]
XYNO2:
MOV WORD PTR BUFHY1+2[BX],DX
RET
XYNO3:
MOV BUFIN,7FH
JMP SHORT XYNO2
FRA98:
MOV SI,1
JMP SHORT FRA02
FRA54:
SUB SI,SI
JMP SHORT FRA02
FRAA0:
CALL FRAXB
CMP BFADJX,BH
JE FRAA01
CMP BUF02,1
JA FRAA00
FRAA01:
MOV BH,BUFTEM
SHR BH,1
SUB AH,BH
SUB DL,BH
SUB BH,BH
FRAA00:
MOV SI,2
JMP SHORT FRA020
FRA028:
CMP SI,4EH
JE FRA029
CMP BUFDEL,8
JNE FRA029
TEST BYTE PTR BFADJB[BX+1],20H
JNZ FRA029
TEST BYTE PTR BFADJB[BX+3],20H
JZ FRA029
PUSH DX
INC BX
INC BX
CALL XYNO1
DEC BX
DEC BX
CALL CHKUP
CALL XYNO2
POP DX
FRA029:
RET
FRAA6:
MOV BUFS1+3,1
FRA00:
CALL FRAXB
FRA020:
CMP CL,2
JA FRA0220
INC AH
INC DX
FRA0220:
MOV BUFS1+4,42H
SHR CL,1
SHR CL,1
SHR CL,1
CALL ADDCL1
CMP BYTE PTR INSTB[BX+2],4EH
JE FRA024
CALL FRA028
CMP BUF02,2
JB FRA025
OR BL,BL
JNZ FRA026
CMP BYTE PTR BUFMUT+1,12
JB FRA026
SUB CL,CL
FRA026:
SHR CL,1
FRA025:
SUB DL,CL
SUB AH,CL
CMP BUFS1+1,5 ;"IAIU"
JNE FRA024
SUB DL,CL
SUB AH,CL
MOV BUFS1+1,BH
FRA024:
CMP BYTE PTR INSTB[BX+2],6
JE FRA021
CMP BYTE PTR INSTB[BX+2],96H
JE FRA021
TEST BYTE PTR BFADJB[BX+3],40H
JNZ FRA027
FRA021:
OR SI,SI
JZ FRA02M3
CALL SHFCL
SUB DL,CL
CMP SI,1 ;FRA98,9A,9C,9E
JNE FRA02M0
SUB DL,CL
JMP SHORT FRA02M0
FRA02M3:
ADD AH,BUF24
ADD DL,BUF24
FRA02M:
CMP AH,DL ;"KHNBQ,EJJL
JNE FRA02M0
ADD DL,BFJB16
OR SI,SI
JNZ FRA02M0
DEC AH
FRA02M0:
CMP SI,90H
JE FRA02M2
MOV CH,BYTE PTR BFADJB[BX+1]
CALL CHKODJ
FRA02M2:
CMP SI,4EH
JE FRA022
CALL CHKDOWN
CALL CHKALAH
FRA022:
MOV WORD PTR BUFHX1[BX],AX
FRA023:
CMP DL,DH
JBE FRA0270
XCHG DL,DH
FRA0270:
XCHG AX,DX
CALL CHKALAH
XCHG AX,DX
MOV WORD PTR BUFHX1+2[BX],DX
RET
FRA027:
OR SI,SI
JNZ FRA02M
CALL SHFCL
ADD DL,CL
JMP FRA02M
FRA01:
SUB CH,CH
CALL FRAXB
CALL FRA02M
JMP CHKODJB
FRA9E:
MOV SI,1
JMP SHORT FRA04
FRA56:
SUB SI,SI
MOV BUFF,56H
FRA04:
CALL MOVDXHY1
CALL DY8U
FRA042:
CMP BUFOJ1[BX+2],BH
JE FRA043
CALL DY32U
FRA043:
MOV WORD PTR BUFHY1[BX],DX
RET
FRAAA:
MOV BUFS1+3,1
JMP SHORT FRA5A
FRA9C:
MOV SI,1
JMP SHORT FRA5A
FRA58:
SUB SI,SI
FRA5A:
CALL MOVDXHY1
CALL DY16U
JMP FRA042
FRAA8:
MOV BUFS1+3,1
JMP SHORT FRA92
FRA9A:
MOV SI,1
JMP SHORT FRA92
FRA94:
SUB SI,SI
FRA92:
CALL MOVDXHY1
SUB DH,BFJB24
JMP FRA042
FRA06:
MOV BUF06,1
INC BFANH
CALL FRAXB
XCHG DX,AX
MOV AL,AH
SUB AL,CL
JNS FRA600
MOV AL,1
FRA600:
MOV DH,AL
SHR CL,1
SHR CL,1
SHR CL,1
SHR CL,1
CMP SI,96H
JE FRA960
FRA060:
CMP SI,50H
JE FRA500
OR BX,BX
JZ FRA062
CMP BUF02,2 ;"QRSN
JAE FRA063
FRA062:
ADD DH,CL
ADD AL,CL
FRA063:
TEST BYTE PTR BFADJB[BX+1],40H
JZ FRA501
CALL ADDCL1
ADD AL,CL
FRA501:
CALL CHKODJA
CMP BUF02,2
JB FRA061
OR BL,BL
JZ FRA061
CALL CHKODJ
FRA061:
CALL FRA022
JMP CHKDOWN
FRA500:
SUB AL,CL
FRA5000:
JMP FRA501
FRA960:
SUB DH,CL
JMP FRA5000
FRAB0:
MOV SI,72H
FRA5E: ;DIFFERENT WITH FRA08 IN CHKUP
MOV BUFS1+1,3
FRA08:
MOV BUFDEL,8
FRA0800:
CALL XYNO
CALL FRAY
PUSH BX
CALL CHKANT
CALL CHKUP
POP BX
JMP SHORT FRA0822
FRA8E:
CALL FRA86
MOV CH,BUFTEM+2
SHR CH,1
SUB AH,CH
FRA8E0:
SUB DL,CH
JMP FRA0824
MOVHH086:
CALL MOVHH
JMP SHORT FRA086
FRA5C:
MOV BUFS1+1,1
FRA86:
MOV BUFDEL,8
FRA086:
CALL XYNO
FRA081:
CALL FRAY
FRA0822:
CALL MOVCLTEM
CMP SI,70H
JE FRA0827
CMP BUFS1+3,2 ;FOR 0.5 Y
JNE FRA0823
SUB AH,CL
SUB DL,CL
FRA0823:
MOV CH,BUFS1+1
OR BX,BX
JNZ FRA0827
CMP BUF080,1
JBE FRA0827
ADD AH,CL
ADD DL,CL
FRA0827:
OR CH,CH
JZ FRA082
CMP CH,3
JE FRA085E
ADD DL,CL
CMP CH,1
JE FRA082
TEST BYTE PTR BFADJB[BX+3],20H
JNZ FRA082
ADD DL,CL
FRA082:
MOV CH,BYTE PTR INSTB[BX+2] ;CHECK NEXT INS.
CMP CH,0CH
JE FRA083
CMP CH,0EH
JE FRA083
MOV CH,BFADJB[BX+1]
OR CH,CH
JNS FRA0821
TEST CH,10H
JZ FRA0821
SUB AH,BFDY32
FRA0821:
MOV CH,BL ;LAST ONE OF BODY PART
ADD CH,4
CMP CH,BFLAGAL
JNE FRA0820
CMP BUFKMKR,1 ;FIRST HEAD BELONGS TO KMKR DELETION
JNE FRA0820
PUSH SI
PUSH AX
MOV SI,WORD PTR INSTB[BX-2]
CMP BUF080,2
JB FRA08A
MOV AX,WORD PTR BUFHX1[BX-2] ;LTWI
FRA08A:
CALL CHKODJ
POP AX
POP SI
FRA0820:
CALL HE08Y1Y2
FRA0824:
MOV WORD PTR BUFHY1[BX],AX
SUB CH,CH
MOV BUFS1+1,CH
JMP XYNO2
FRA083:
CMP BFLAGAL,6 ;CONFIRM THERE IS NEXT INS.
JB FRA0821
SUB CL,BFDY32
ADD DL,CL
ADD AH,CL
JMP FRA0821
FRA085E:
CALL ADDCL1
MOV CH,CL
SHR CH,1
CMP SI,78H
JE FRA0878
CMP SI,72H
JNE FRA085E2
FRA0878:
SUB AH,CH
CALL TEST151
JNZ FRA0879
SUB AH,BUFAW ;"HXWKS
FRA0879:
OR CH,CH
JNZ FRA085E4
MOV CH,CL
FRA085E4:
SUB DL,CH
FRA085E2:
CMP SI,44H
JNE FRA085E3
OR CH,CH
JNZ FRA0844
INC CH
FRA0844:
ADD AH,CH
ADD DL,CL
FRA085E3:
CMP BUF080,2
JAE FRA085E8
MOV CH,CL
JMP SHORT FRA085E6
FRA085E7:
TEST BFSTYLE,10H
JNZ FRA085E0
CMP CH,BUFDBM
JAE FRA085E0
MOV CH,BUFDBM
FRA085E0:
CMP CH,BFDY8
JBE FRA085E9
MOV CH,BFDY8
FRA085E9:
RET
FRA085E8:
CALL FRA085E7
FRA085E1:
CMP SI,44H
JE FRA085E6
ADD CH,BUFAW
FRA085E6:
ADD DL,CH
CMP AH,DL
JB FRA085EA
JE FRA085E5
MOV DL,AH
FRA085E5:
CALL TEST151
JZ FRA085EA
DEC AH
FRA085EA:
CALL ADDDLWGF
SUB DL,BUFWRB
MOV BYTE PTR BUF5E[BX],5EH
FRA701:
RET
FRA70: ;FOR "T"
CALL FRA08
SUB AH,BUFWGF
MOV CH,BUFTEM+2
INC CH ;NEW
SHR CH,1
SHR CH,1
CMP CH,BUFWG2
JBE FRA701
SUB AH,CH
CALL CMP020
JNE FRA702
JMP FRA8E0
FRA702:
JMP FRA0824
FRA8A:
CALL FRA86
CALL CHKUPDL
SUB AH,CH
CMP BYTE PTR INSTB[BX+2],46H
JNE FRA8A0
SHR CL,1
SUB DL,CL
SUB AH,CL
FRA8A0:
CALL FRA0824
JMP SHORT FRA0A1
FRA0A:
CALL FRA08
FRA0A1:
MOV DX,WORD PTR BUFHX1[BX]
CALL YDIV16
MOV WORD PTR BUFHX1[BX],DX
RET
FRA40:
MOV BUFS1+3,2
FRA80:
MOV BUFAE,2
MOV SI,0EH
JMP SHORT FRA0CA
FRA8C:
SUB SI,SI
FRA0C:
OR BL,BL
JNZ FRA0CA
MOV BUFS1+6,1
FRA0CA:
CALL FRA86
MOV AL,BYTE PTR BUFTEM+2
MOV CH,BYTE PTR BFADJB[BX+3]
CMP SI,0EH
JE FRA0E0
TEST CH,20H
JNZ FRA0C0
SUB DL,BFJB24
JMP SHORT FRA0C2
FRA0C0:
MOV AH,AL
SHR AH,1
SHR AH,1
ADD DL,AH
FRA0C1:
OR BX,BX ;"JVME
JNZ FRA0C10
CALL CMP020
JE FRA0C10
TEST CH,20H
JZ FRA0C10
SUB AL,BUFDB1
JMP SHORT FRA0C11
FRA0E1:
OR BX,BX
JNZ FRA0E2
CALL CMP020
JNE FRA0C10
FRA0E2:
CMP BUF080,1
JA FRA0C10 ;"TJCN"
OR AH,AH
JNZ FRA0E4
ADD AH,BFJB16
FRA0E4:
ADD AL,AH
SUB DL,AH ;"EJCN","JCLB"
FRA0C10:
CALL TEST151
JZ FRA0C11
DEC DX
JNS FRA0C11
SUB DL,DL
FRA0C11:
CALL YDIVAL
SUB DL,AL
JNS FRA0C2
MOV DL,1
FRA0C2:
CALL XYNO2
CMP BYTE PTR INSTB[BX+2],02H
JE FRA0C3
MOV BUF0E,0EH ;FOR FRA0C,0E,74
OR SI,SI ;FRA8C
JZ FRA0CRT
FRA0C3:
MOV DX,WORD PTR BUFHX1+2[BX]
CALL YDIV32
JMP FRA023
FRA0CRT:
RET
FRA0E0:
MOV AH,AL
SHR AH,1
CMP BUFAE,2 ;FRA80
JE FRA800
SHR AH,1
TEST CH,20H
JNZ FRA0E1
FRA0E3:
SUB AL,AH
CMP BUFS1+3,2
JNE FRA0E5
SUB AL,AH
FRA0E5:
JMP FRA0C1
FRA88:
CALL FRA08
JMP FRA0C3
FRA800:
ADD AL,AH
SHR AH,1
TEST CH,20H
JZ FRA0E3
ADD AL,AH
ADD AL,AH
JMP FRA0E5
FRA74:
MOV BUFLAG,2
CALL FRA08
ADD DL,BFDY32
MOV AL,BUFTEM+2
SHR AL,1
JMP FRA0E5
FRA76:
CALL FRA5E
JMP FRA0C3
FRAAE:
MOV SI,0CH
CALL FRA0C
JMP FRA0C3
FRA66:
MOV SI,72H
FRA44:
MOV BUFS1+1,3
FRA68: ;BODY PART WILL UP
CALL MOVHH
CALL FRA0800
JMP SHORT FRA102
FRA42:
CALL MOVHH
CALL XYNO
CALL FRA22Y
CALL BO08Y1Y2
MOV CH,BUFWGF
SHL CH,1
ADD DL,CH
CALL TEST151
JZ FRA420
INC DX
INC DX
FRA420:
JMP SHORT FRA104
FRA6A2:
SUB AH,BUFDBM
SUB AH,BUFAW
CALL SUBDLAW
CALL FRA0824
JMP SHORT FRA6A0
FRA6A: ;DIFFERED IN DIVALL
CALL LOD5E
FRA38:
CALL MOVHH086
CMP SI,6CH
JE FRA104
CMP SI,6AH
JNE FRA6A0
CMP BUFOH,BH
JNE FRA6A2
FRA6A0:
CALL ADDDLWGF
PUSH BX
CALL CHKANT
TEST BYTE PTR BFADJB[BX+3],20H
JZ FRA1041
CMP CL,BFADJY
JAE FRA1040
JMP SHORT FRA1042
FRA1041:
ADD DL,BFDY32
FRA1042:
ADD DL,BUFMAD
FRA1040:
POP BX
FRA104:
CALL XYNO2
FRA102:
OR BX,BX
JNZ FRA1023
CALL CMP020
JE FRA1023
MOV BUFS1+1,5
FRA1023:
MOV BUF10,1
MOV CH,BFADJX1
SUB CH,BFJB24
MOV DX,WORD PTR BUFHX1[BX]
CMP SI,38H
JE FRA101
CALL DY6D
FRA1020:
ADD DL,CH
CMP SI,10H
JE FRA1021
SHR AL,1
SHR AL,1
JNZ FRA1022
MOV AL,BFJB32
FRA1022:
ADD DL,AL
FRA1021:
PUSH BX
CALL CHKANT
TEST BYTE PTR BFADJB[BX+3],40H
POP BX
JZ FRA103
ADD DL,BFJB16
OR BX,BX
JNZ FRA103
SUB DH,CH
FRA103:
MOV BUFS1+1,BH
MOV BUF02,1
FRA105:
JMP FRA023
FRA101:
CALL DY5D
SHR AL,1
JMP FRA1020
FRA3A:
CALL FRA02
CALL MOVHH
DEC DI
DEC DI
MOV AL,DH
STOSB
INC DI
CALL XYNO1
JMP FRA081
FRA84:
MOV SI,44H
CALL FRA44
SUB CH,CH
JMP SHORT FRA820
FRA82:
CALL MOVHH
CALL FRA74
FRA820:
INC BUF02
CALL TRAS081
CALL CHKBOND5
FRA821:
CALL CHKODJ
JMP FRA105
FRA12:
CALL MOVHH
CALL FRA0C
JMP FRA820
FRA14:
MOV SI,0EH
CALL FRA180
MOV BUF0E,0EH
JMP FRA821
FRA16:
CALL FRA38
MOV AL,BUFTEM+2
SHL AL,1
ADD BYTE PTR BUFHY1+1[BX],AL
RET
FRA6E:
MOV BUFS1+1,1
CALL MOVHH
CALL FRA08
CALL CHKDOWN0
CALL ADDDLWGF
CALL XYNO2
CALL TRAS081
JMP SHORT FRA181
FRA180:
CALL MOVHH
CALL FRA0800
JMP TRAS081
FRA18:
CALL FRA180
MOV BUFIN,7EH
INC BUF02
FRA181:
MOV BYTE PTR BUFOJ1+1[BX],CL
SUB DH,CL
CMP SI,1CH ;FRA1C
JNE FRA182
MOV BUFIN,81H
CALL TEST151
JNZ FRA182
SUB DH,CL
FRA182:
SUB DL,CL
CMP SI,36H ;FRA36
JE FRA360
CMP SI,6EH
JNE FRA184
TEST BYTE PTR BFADJB[BX+3],40H
JNZ FRA184
CALL ADDDHDBM
FRA184:
JMP FRA023
FRA1A:
INC BUF1A
FRA3C:
MOV BUF26,4
MOV BUFS1+1,2
CALL TRAS08H
CALL DY10U
JMP FRA181
FRA360:
CALL YDIV10
MOV CH,AL
JMP FRA1021
FRA36:
MOV BUFS1+1,1
FRA1C:
INC BUF02
CALL MOVHH086
CALL TRAS081
CMP SI,36H
JE FRA1C2
CMP BUF02,1
JE FRA1C1-3
FRA1C2:
MOV BUF26,4
CALL DY10U
CALL FRA1E3
FRA1C1:
MOV AX,WORD PTR BUFHY1[BX]
CMP BUFDEL,08H
JNE FRA1C0
CALL FRA522
MOV DX,AX
CALL FRA043
FRA1C0:
INC BX
INC BX
CALL MOVDXHY0
CALL FRA22Y
CALL DY8U
JMP FRA043
FRA1E3:
SHR CL,1
MOV AL,CL
SHR AL,1
ADD CL,AL ;CL=3/4dX
JMP FRA181
FRA24:
CALL XYNO
CALL FRA2E1
CALL TRAS081
SHR CL,1
JMP FRA181
FRAA4:
CALL MOVHH
CALL XYNO
CALL DY6D
CALL DY10U
TEST BYTE PTR BFADJB[BX+3],20H
JNZ FRA2A1
SHR AL,1
SHR AL,1
ADD DL,AL
JMP SHORT FRA2A1
FRA2A:
CALL MOVHH
CALL FRAB0
MOV BUFDEL,2AH
MOV BYTE PTR BUF5E[BX],BH
CALL DY16U
FRA2A1:
CALL ADDDLIST
CALL FRA2A0
CALL XYNO3
MOV DX,WORD PTR BUFHX1[BX]
CALL YDIV5
CMP BUFKMKR,1
JNE FRA2A2
OR BL,BL
JZ FRA2A2
FRA2A3:
CALL YDIV16
FRA2A2:
JMP FRA023
FRA28:
MOV SI,26H
CALL FRA26
CALL XYNO1
CALL DY16U
JMP XYNO2
FRA7E:
CALL XYNO
MOV CH,BUFTEM+2
SHR CH,1
ADD DL,CH
MOV CH,BH
CALL FRA62Y0
JMP SHORT FRA62X1
FRA62:
CALL XYNO
CALL HE02Y1Y2
CALL CHKDOWN
CALL XYNO2
JMP SHORT FRA62X
FRA7C:
CALL FRA62Y
JMP SHORT FRA62X
FRA20:
CALL MOVHH086
CALL CHKDOWN0
CALL FRA62Y3
MOV SI,26H
JMP FRA62X1
FRA78:
CALL MOVHH
CALL FRA5E
CALL ADDDLWGF
CALL FRA62Y0
CMP SI,64H
JE FRA62X
JMP SHORT FRA62X1
FRA62Y:
CALL MOVHH086
FRA62Y3:
TEST BFADJB [BX+3],20H
JNZ FRA62Y0
ADD DL,BFDY32
FRA62Y0:
CALL DY16U
CMP SI,7AH
JNE FRA62Y2
SUB DH,BFADJY
FRA62Y2:
JMP XYNO2
FRA26:
CALL XYNO
CALL HE02Y1Y2
MOV BUFS1+4,42H
FRA62X:
MOV BUF26,1
FRA62X1:
DEC BUF020
JNS FRA62X2
MOV BUF020,BH
FRA62X2:
CALL TRAS081
SHR CL,1
SUB DL,CL
SUB DH,CL
CMP SI,78H
JE FRA62X3
CMP SI,26H
JE FRA62X0
SHR CL,1
SHR CL,1
SUB DH,CL
CMP SI,7CH
JNE FRA62X5
MOV BUF0E,0EH
SHR CL,1
SUB DL,BFADJX
JMP SHORT FRA62X6
FRA62X5:
CMP SI,7EH
JNE FRA62X0
SHR CL,1
ADD DL,CL
FRA62X6:
SUB DH,CL
FRA62X0:
CALL CHKODJ
FRA62X4:
JMP FRA023
FRA62X3:
CALL YDIV10
SUB DH,BFADJX
CALL CHKDOWN
JMP SHORT FRA62X4
FRA22:
CALL MOVHH
CALL XYNO
PUSH AX
TEST BFSTYLE,10H
JNZ FRA223
SUB DH,BFADJX1
CALL TEST151
JZ FRA223
DEC DH
FRA223:
CALL DY10U
CALL ADDDLAW
CALL FRA22Y
PUSH SI
CALL FRA2A0
POP SI
CALL XYNO3
POP DX
CALL DIVDY6
CALL XDIVDBM
ADD DL,AL
SUB DH,AL
CMP SI,1EH
JNE FRA220
SHR AL,1
ADD DH,AL
TEST BYTE PTR BFADJB[BX+3],40H
JZ FRA220
ADD DL,AL
FRA220:
OR BL,BL
JZ FRA62X4
INC BUF02
JMP FRA62X4
FRA22Y:
CALL MOVCLTEM
ADD DL,CL
PUSH BX
PUSH AX
MOV BX,AX
CALL DTCDOT
CMP SI,22H
JNE FRA22Y1
MOV AH,BFADJX1
FRA22Y1:
ADD DL,AH
POP AX
POP BX
PUSH SI
MOV SI,22H
CALL CHKUP
POP SI
RET
FRAAC:
CALL MOVHH
CALL FRA98
MOV SI,2CH
JMP SHORT FRA2C0
FRAA2:
CALL MOVHH
CALL FRA98
MOV SI,2EH
JMP SHORT FRA2C0
FRAB4:
MOV BUFA,40H
JMP SHORT FRAB2+5
FRAB2:
MOV BUFA,80H
MOV SI,2EH
FRA2C:
CALL MOVHH
DEC BUF02
CALL FRA02
INC BUF02
FRA2C0:
CALL DIVDY16
CMP BUFA,0
JNE FRAB20
CALL XDIVDBM
FRAB20:
ADD DL,AL
CMP SI,2EH
JNE FRA2E4
TEST BUFA,40H
JNZ FRA2E4
SUB DH,AL
SUB DH,AL
FRA2E4:
CMP BUF02,2
JB FRA2E40
OR BL,BL
JNZ FRA2E40
ADD DL,AL
FRA2E40:
CALL FRA023
FRA2E1:
PUSH SI
MOV SI,2EH
MOV DH,BUFHY1+1[BX]
MOV BUFHY2+1[BX],DH
CALL CHKDOWN
MOV DX,WORD PTR BUFHY2[BX]
CALL DY10U
CMP DH,BFDY2 ;NMLMI
JA FRA2E5
SUB DH,AL
FRA2E5:
POP SI
CMP SI,2CH
JE FRA2E2
TEST BUFA,80H
JNZ FRA2E2
CALL DY32U
CMP SI,90H
JNE FRA2E2
SHL AL,1
SUB DH,AL
FRA2E2:
MOV BUFA,BH
OR BL,BL
JZ FRA2E3
CMP BUF02,2
JAE FRA2E30
FRA2E3:
CALL SUBDHAW
FRA2E30:
MOV BUFDEL,2EH
JMP XYNO2
FRA320:
ADD DL,CH
JMP SHORT FRA3E0
FRA32:
CALL XYNO
PUSH AX
MOV AL,BFADJB[BX+1]
OR AL,AL
JS FRA300
CALL CMPY2
FRA300:
TEST AL,20H
JZ FRA301
CALL CMPY1
FRA301:
CALL FRAY
MOV BUFHY6+1,DH
MOV CH,BYTE PTR BUFTEM+2
MOV CL,CH
CMP SI,32H
JE FRA320
JB FRA3E0
SHR CH,1
SUB AH,CH
SUB DL,CH
MOV CH,CL
FRA3E0:
ADD CH,CL
CMP SI,3EH
JE FRA3E1
ADD CH,CL
CMP SI,32H
JNE FRA3E1
ADD CH,CL
ADD CH,CL
FRA3E1:
ADD CH,BUFTEM+3
MOV CL,CH
SUB DX,CX
MOV BUFHY6,DH
CALL CHKDOWN0
CMP SI,32H
JBE FRA3E2
ADD DL,BFADJY
FRA3E2:
CALL CHKUP
CALL FRA0824
POP DX
CMP SI,3EH
JE FRA3E4
JMP FRA2A3
FRA3E4:
JMP FRA023
FRA48:
CALL XYNO
CALL FRA0A1
PUSH BX
ADD BL,12
CALL XYFQ
POP BX
RET
FRA46:
MOV BUFS1+4,46H
CALL XYNO
CALL HE02Y1Y2
XYFQ:
MOV AX,WORD PTR BUFHX1[BX]
MOV DH,AH
SUB AH,AL
SHR AH,1
ADD AH,AL
MOV DL,AH
TEST BYTE PTR BFADJB[BX+3],40H
JZ XYFQ0
SUB AH,BFADJX
ADD DL,BFADJX
XYFQ0:
JMP FRA02M
FRA4A:
MOV BUF26,2
MOV BUFS1+4,42H
PUSH AX
PUSH BX
MOV DI,OFFSET XYTB
ADD DI,BX
FRA4A2:
PUSH WORD PTR BUF03
MOV BUF03,BH
CALL DIVAL1
POP WORD PTR BUF03
POP BX
POP AX
PUSH WORD PTR BUFHX1[BX]
CALL FRA01
CALL FRA01
CALL FRA09
MOV WORD PTR BUFHY1[BX-4],AX
CALL FRA4E1
DEC BX
DEC BX
CALL FRA4E1
POP WORD PTR BUFHX1+4[BX]
FRA4A1:
MOV BL,BLAG
SUB BL,4
FRA4A4:
POP AX
POP AX
JMP EXBACK
FRA4E:
MOV BUF26,2 ;FOR "VEKS"
CALL XYNO
MOV DX,AX
MOV CH,BYTE PTR XYTB[BX]
MOV AX,WORD PTR BUFTEM+4
PUSH WORD PTR BUFHX1[BX]
CALL FRAXY
MOV BUFS1+3,1
CALL FRA020
INC BX
INC BX
CALL FRA09
CALL FRA4E1
POP WORD PTR BUFHX1+2[BX]
INC BUF02
JMP FRA4A4
FRA4E1:
TEST BFADJB[BX-1],20H
JZ FRA4E2
CALL CMPY1
FRA4E2:
MOV BYTE PTR BUFHY1-2[BX],DL
RET
FRA4C:
CALL XYFQ
ADD BL,4
CALL FRA022
ADD BL,8
CALL XYFQ
ADD BL,4
MOV WORD PTR BUFHX1-2[BX],AX
MOV AX,DX
CALL FRA022
JMP FRA4A1
FRA52:
MOV BUF1A,52H
CALL XYNO
CALL FRAY
INC BX
INC BX
CALL HE08Y1Y2
CALL BO08Y1Y2+5
DEC BX
DEC BX
XCHG AX,DX
MOV AL,AH
SUB AL,CL
MOV DH,AL
TEST BFADJB[BX+3],80H
JZ FRA521
CALL CHKDOWN8
JMP SHORT FRA520
FRA522:
TEST BYTE PTR BFADJB[BX+1],20H
JZ FRA52RT
CALL MOVCLTEM
SUB AL,CL
FRA52RT:
RET
FRA521:
CALL FRA522
FRA520:
CMP AL,DH
JNE FRA524
INC AX
FRA524:
JMP FRA0824
FRA09:
CALL XYNO
PUSH DX
MOV CH,BYTE PTR XYTB+1[BX] ;BODY, BODY, NO. OF *Y
CMP CH,BYTE PTR XYTB-1[BX] ;BODY, HEAD, NO. OF *Y
JAE FRA091
MOV CH,BYTE PTR XYTB-1[BX]
FRA091:
CALL FRAY1
CALL CHKUPDL
CALL FRA0821
MOV WORD PTR BUFHY1[BX-2],AX
POP DX
RET
CG1 ENDS
END
|