|
|
GenFont: ; FUNCTION = make pattern completly ; INPUT : (DS=CS) CX = KS code, ES:DI = buffer pointer ; OUTPUT : (NC) ES:DI = buffer pointer ; PROTECT : none extrn Ks2ChAddr:word VowelTypeCnt = 3 push bp push di mov ax,cx mov bp,di ; save buffer pointer test [CodeStat],Chab jnz @f call [Ks2ChAddr] jnc @f jmp MakeFontEnd @@: call ChkVowelType ; check vowel type add si,[PatGenAddr] mov di,bp mov dx,ax ; save CH code xor ax,ax mov cx,16 rep stosw ; clear buffer ; DX = CH code, BP = buffer pointer, SI = type no. add si,offset Type1stTbl - offset GenFont push dx mov di,[HanPatternPtr] add di,FontStruc1st and dx,0111110000000000b mov cl,7 rol dx,cl call MakePattern pop dx jc MakeFontEnd @@: add si,offset Type2ndTbl - offset Type1stTbl push dx mov di,[HanPatternPtr] add di,FontStruc2ndV push si mov si,dx mov cl,5 shr si,cl and si,0000000000011111b add si,offset VowelType - offset GenFont add si,[PatGenAddr] mov al,[si] dec al mov ah,4*VowelTypeCnt mul ah pop si add di,ax and dx,0000001111100000b mov cl,4 shr dx,cl add dx,32*2 call MakePattern pop dx jc MakeFontEnd @@: add si,offset Type3rdTbl - offset Type2ndTbl mov di,[HanPatternPtr] add di,FontStruc3rd and dx,0000000000011111b shl dx,1 add dx,32*2*2 call MakePattern MakeFontEnd: pop di pop bp ret
ChkVowelType: ; FUNCTION = get vowel type bits(4) ; INPUT : (DS=CS)AX = CH code ; OUTPUT : (CC) SI = vowel type code(4 bits) ; DESTORY : CX, DX mov si,ax mov cl,5 shr si,cl and si,0000000000011111b add si,offset VowelType - offset GenFont add si,[PatGenAddr] mov cl,[si] shl cl,1 shl cl,1 ; 0000xx00b mov dx,ax and dx,0111110000011111b cmp dh,00000100b ; 1st fill code ? jz @f ; jump if so or cl,00000001b ; 0000xxx1b @@: cmp dl,00000001b ; last fill code ? jz @f ; jump if so or cl,00000010b ; 0000xx1xb @@: xor ch,ch mov si,cx ret
MakePattern: ; FUNCTION = make pattern ; INPUT : (DS=CS) BP = buffer pointer, DX = input code ; DI = font struc pointer, CL = real type no. ; OUTPUT : none ; DESTORY : AX, BX, CX, DI push si mov cl,[si] ; get type no. mov si,dx add si,[HanPatternPtr] mov si,[si] or si,si jz MakePatternFill or si,si js MakePatternErr ; jump if MSB = 1 or cl,cl js MakePatternFill ; jump if MSB = 1 xor ch,ch xor bx,bx @@: jcxz @f mov ax,[di+2] mul ah add bx,ax ; BX = byte size add di,4 loop @b @@: add si,[HanPatternPtr] add si,bx mov bx,di ; calc target address mov di,bp mov ax,[bx] ; get (X, Y) mov cl,al mov al,ah xor ah,ah shl ax,1 add di,ax xor ch,ch add di,cx ; calc repeat counter mov dx,[bx+2] mov bl,dh mov bh,dl mov dl,2 ; 16 dot sub dl,bh xor dh,dh ; AX = blank byte xor ch,ch MakeFontLoop: mov cl,bh ; BH = repeat counter @@: lodsb or es:[di],al inc di loop @b add di,dx dec bl jnz MakeFontLoop MakePatternFill: pop si ret MakePatternErr: pop si stc ret
VowelType label byte db 0,0,0,1,1,1,1,1,0,0,1,1,1,2,3,3 db 0,0,3,2,2,3,3,3,0,0,2,2,3,1,0,0 Type1stTbl label byte db -1, 0,-1, 4,-1, 1,-1, 2,-1, 3,-1, 4,-1, 6,-1, 5 Type2ndTbl label byte db -1,-1,-1,-1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2 Type3rdTbl label byte db -1,-1, 0, 1,-1,-1, 0, 1,-1,-1, 0, 1,-1,-1, 0, 1
FontStruc STRUC Char1st dw 32 dup(?) ; 1st code word table Char2nd dw 32 dup(?) ; 2nd code word table Char3rd dw 32 dup(?) ; 3rd code word table FontStruc1st db 4*7 dup(?) ; 1st code struc table FontStruc2ndV db 4*3 dup(?) ; 2nd V-vowel code struc table FontStruc2ndH db 4*3 dup(?) ; 2nd H-vowel code struc table FontStruc2ndHV db 4*3 dup(?) ; 2nd HV-vowel code struc table FontStruc3rd db 4*2 dup(?) ; 3rd code struc table RealFont db ? ; font image area FontStruc ENDS
CharTbl label word INCLUDE HAN.PAT GenFontLng = $-GenFont
|