home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
VLA_FONT.ZIP
/
GCX.INC
< prev
next >
Wrap
Text File
|
1993-09-28
|
22KB
|
1,070 lines
PAGEUP = 73
PAGEDOWN= 81
CSRUP = 72
CSRDN = 80
CSRLF = 75
CSRRT = 77
CSRUPC = 141
CSRDNC = 145
CSRLFC = 115
CSRRTC = 116
────────────────────────────────────────────────────────────────────────────
ENLARGEOFFSET = 30*SCRW+1
MINX = 2
MINY = 2
MAXX = 38
MAXY = 38
STRUC PalStruc
R db ?
G db ?
B db ?
ENDS
STRUC VchHdr
ID db "VGACH"
From db " "
SizeX db 5
SizeY db 5
NumChar db 64
ENDS
STRUC MsgHdr
Off dw ?
Xpos dw ?
Ypos dw ?
ENDS
BLACK = 0
BLUE = 255
GREEN = 254
RED = 253
GREY1 = 252
GREY2 = 251
GREY3 = 250
GREY4 = 249
GREY5 = 248
RED2 = 247
────────────────────────────────────────────────────────────────────────────
SCRW = 80
Split dw 80
SplitDest db 1 ;0= 400, 1=80
OldX dw ?
OldY dw ?
Credits db 1,BLUE," Character Grabber",1,GREEN," by "
db 1,RED,"Draeden",1,GREEN," of ",1,RED,"VLA",0
Curchar db 0
Xpos dw 0
Ypos dw 0
PSPSeg dw ?
FileNameTGA db 120 dup (0)
FileNameVCH db 120 dup (0)
TGAexten db ".TGA",0
VCHexten db ".VCH",0
VCHheader VCHHDR <>
Palette PalStruc 256 dup (<>)
DefPal PalStruc <10,00,00>,<25,25,25>,<35,35,35>,<45,45,45>,<56,56,56>
PalStruc <63,63,63>,<40,00,00>,<00,40,00>,<00,00,40>
Font8x8 db 256*8 dup (0) ;holding place for font
TextColor db RED
PicSeg dw ?
CharSeg dw ?
NumChar db 64
SizeMsg db 1,GREEN,"`-' W:- H:- #: -/ X: - Y: - ",0
SizeMsg2 db 1,GREY2," A 12 15 21 252 123",0
ClrSize db 1,BLACK," █ ██ ██ ███ ███ ███ ███",0
INST1 db 1,RED,"^G: Grab Image ^D: ReDimension ",0
INST2 db 1,RED,"^S: Save Set ^Q: Quit ",0
NumMsgs = 7
Messages MsgHdr <offset Credits,1,1>,<Offset FileNameVCH,1,10>
MsgHdr <offset Inst1,1,184>,<Offset Inst2,1,192>
MsgHdr <offset SizeMsg,1,18>
ReFMsg MsgHdr <Offset ClrSize,1,18>
MsgHdr <offset SizeMsg2,1,18>
DimMsg1 db 1,GREY2,"Select size using arrow keys",0
DimMsg2 db 1,GREY2,"Hit ",1,RED,"[ENTER]",1,GreY2," when finished",0
DimMsg3 db 1,GREY2," Width: "
Wtext db "000",0
DimMsg4 db 1,GREY2,"Height: "
Htext db "000",0
DimMsg5 db 1,GREY2," Chars: "
Ntext db "000",0
DimMsg6 db 1,GREY2," From: "
Ftext db "000",0
DimMsgE db 1,BLACK," ███",0
NumDimMsg = 2
DimMsgH MsgHdr <offset DimMsg1,10,60>,<offset DimMsg2,13,120>
DimMsgH2 MsgHdr <offset DimMsgE,25,80>,<offset DimMsgE,25,90>
MsgHdr <offset DimMsgE,25,100>,<offset DimMsgE,25,110>
MsgHdr <offset DimMsg3,25,80>,<offset DimMsg4,25,90>
MsgHdr <offset DimMsg5,25,100>,<offset DimMsg6,25,110>
────────────────────────────────────────────────────────────────────────────
;DS:BX = Ptr to list
; CX = # of entries
PROC PrintList
pusha
@@MSgLoop:
mov si,[(MsgHdr PTR bx).Off]
mov ax,[(MsgHdr PTR bx).Xpos]
mov di,[(MsgHdr PTR bx).Ypos]
call PrintText
add bx,(size MsgHdr)
dec cx
jne @@MsgLoop
popa
ret
ENDP
;di = Ypos
;ax = Xpos
;ds:si = ptr to zero terminating string
PROC PrintText
pusha
push es
mov es,[cs:VGAseg]
imul di,SCRW
add di,ax
@@PrintLoop:
lodsb
or al,al
je @@Done
dec al
je @@ColorChange
dec al
movzx bx,al
shl bx,3 ;*8
mov cl,8
mov ch,[cs:TextColor]
mov bp,di
@@CopyChar:
mov ah,[cs:Font8x8 + bx]
and ah,1111b
@Set_Write_Plane
mov [es:bp],ch
mov ah,[cs:Font8x8 + bx]
shr ah,4
@Set_Write_Plane
mov [es:bp+1],ch
add bp,SCRW
inc bx
dec cl
jne @@CopyChar
add di,2
jmp short @@PrintLoop
@@Done:
pop es
popa
ret
@@ColorChange:
lodsb
mov [cs:TextColor],al
jmp @@PrintLoop
ENDP
PROC StealFont
pusha
push es ds
mov ax,0003h
int 10h ;set VGA 80x25x16 char
mov ax,1112h
mov bl,0
int 10h ;load 8x8 bios font into bank 0
mov dx,3c4h ;setup to read memory
mov ax,00402h
out dx,ax
mov ax,00604h
out dx,ax
──
mov dx,3ceh
mov ax,00005h
out dx,ax
mov ax,00c06h
out dx,ax
mov ax,00204h
out dx,ax
mov ax,0b800h
mov ds,ax
mov ax,cs
mov es,ax
mov di,offset Font8x8
mov si,64 ;start w/ char #2, not #0
cld
mov dx,255 ;grab 255 chars
@@GrabLoop:
mov cx,8
@@UpHere:
lodsb
xor ah,ah
REPT 8
shl al,1
rcr ah,1
ENDM
mov al,ah
stosb
loop @@UpHere
add si,32-8
dec dx
jne @@GrabLoop
pop ds es
popa
ret
ENDP
;Changes the TGA palette to write to the VGA card
; IN: DS = CS
PROC Palettesetup
pusha
xor di,di
mov cx,256
@@FixItLoop:
mov al,[di + Palette.R]
mov ah,[di + Palette.G]
mov bl,[di + Palette.B]
shr al,2
shr ah,2
shr bl,2
mov [di + Palette.R],bl ;swap B & R
mov [di + Palette.G],ah
mov [di + Palette.B],al
add di,(size PalStruc)
dec cx
jne @@FixItLoop
popa
ret
ENDP
;Grab 2 copies of the command line w/ different endings...
PROC CaptureFilename
pusha
push es ds
mov ax,cs
mov ds,ax
mov es,[PSPseg]
mov dx,offset FileNameTGA
mov bx,offset TGAexten
mov bp,1
call GetCommandLine
or ax,ax
je @@NoFile
mov dx,offset FileNameVCH
mov bx,offset VCHexten
mov bp,1
call GetCommandLine
clc
jmp short @@Done
@@NoFile:
stc
@@Done:
pop ds es
popa
ret
ENDP
PROC LoadPicture
pusha
mov ax,cs
mov ds,ax
cld
mov dx,offset FileNameVCH
mov ax,3d00h
int 21h
jc @@NoVchFile
mov bx,ax
mov cx,9
mov dx,offset VCHHeader
mov ah,3fh
int 21h
mov al,[VCHheader.SizeX] ;calc # of bytes to read
movzx cx,[VCHheader.NumChar]
mul [VCHheader.SizeY]
mul cx
mov cx,ax
push ds ;read in the file
mov ds,[CharSeg]
xor dx,dx
mov ax,3f00h
int 21h
pop ds
mov ax,3e00h ;close the VCH file
int 21h
@@NoVchFile:
mov dx,offset FileNameTGA ;load in 320x200x256 screen
mov ax,3d00h
int 21h
jc @@Abort
mov bx,ax
sub cx,cx ;18 past beginning
mov dx,18
mov ax,4200h ;move FP rel. to start
int 21h
mov cx,768
mov dx,offset Palette ;read in the palette
mov ah,3fh
int 21h
call PaletteSetup
push ds
mov ax,[PicSeg]
mov ds,ax
mov cx,64000 ;read 64000 bytes
xor dx,dx
mov ah,3fh
int 21h
pop ds
mov ah,3eh ;close source file
int 21h
popa
ret
@@Abort:
stc
popa
ret
ENDP
PROC ScrollSplit
cmp [SplitDest],0
je @@GoDown
cmp [Split],80
je @@Done
sub [Split],8
jmp short @@Done1
@@GoDown:
cmp [Split],400
je @@Done
add [Split],8
@@Done1:
@WaitVert
mov bx,[Split]
@Set_Split
@@Done:
ret
ENDP
PROC SetUpStuff
pusha
push ds es
mov es,[VGAseg]
mov ds,[PicSeg]
mov bl,00010001b
xor bp,bp
@@OuterLoop:
mov ah,bl
@Set_Write_Plane
mov cx,64000 /4
mov di,240*SCRW
mov si,bp
@@inLoop:
mov al,[ds:si]
stosb
add si,4
dec cx
jne @@InLoop
inc bp
shl bl,1
jnc @@OuterLoop
mov ah,1111b
@Set_Write_Plane
mov di,0 ;SCRW*2
mov cx,SCRW
mov al,GREY5
rep stosb
mov cx,SCRW
mov al,GREY4
rep stosb
mov cx,SCRW
mov al,GREY3
rep stosb
mov cx,SCRW
mov al,GREY2
rep stosb
mov cx,SCRW
mov al,GREY1
rep stosb
mov cx,SCRW
mov al,GREY2
rep stosb
mov cx,SCRW
mov al,GREY3
rep stosb
mov cx,SCRW
mov al,GREY4
rep stosb
mov cx,SCRW
mov al,GREY5
rep stosb
pop es ds
mov bx,offset Messages
mov cx,NumMsgs
call PrintList
popa
ret
ENDP
PROC GetDimensions
pusha
push es
mov ax,cs
mov es,ax
mov [SplitDest],1
mov bx,offset DimMsgH
mov cx,NumDimMsg
call PrintList
@@Zloop:
movzx eax,[VCHheader.SizeX]
mov di,offset Wtext
mov cx,3
call DEC_Print2Mem
movzx eax,[VCHheader.SizeY]
mov di,offset Htext
call DEC_Print2Mem
movzx eax,[VCHheader.From]
mov di,offset Ftext
call DEC_Print2Mem
movzx eax,[VCHheader.NumChar]
mov di,offset Ntext
call DEC_Print2Mem
mov bx,offset DimMsgH2
mov cx,8
call PrintList
@@GetChar:
call ScrollSplit
mov ah,11h
int 16h ;get a char
jz @@GetChar
mov ah,10h
int 16h
cmp al,13
je @@AllDone
cmp ah,CSRUP
je @@HandleUp
cmp ah,CSRDN
je @@HandleDown
cmp ah,CSRLF
je @@HandleLeft
cmp ah,CSRRT
je @@HandleRight
cmp al,"+"
je @@MoreChars
cmp al,"-"
je @@LessChars
cmp al,"F"
je @@IncFrom
cmp al,"f"
je @@DecFrom
jmp @@Zloop
@@IncFrom:
add [VCHheader.From],2
@@DecFrom:
dec [VCHheader.From]
jmp @@Zloop
@@MoreChars:
inc [VCHheader.NumChar]
jnz @@Zloop
dec [VCHheader.NumChar]
jmp @@Zloop
@@LessChars:
dec [VCHheader.NumChar]
jnz @@Zloop
inc [VCHheader.NumChar]
jmp @@Zloop
@@HandleUp:
inc [VCHheader.SizeY]
cmp [VCHheader.SizeY],MAXY
jbe @@Zloop
mov [VCHheader.SizeY],MAXY
jmp @@Zloop
@@HandleDown:
dec [VCHheader.SizeY]
cmp [VCHheader.SizeY],MINY
jge @@Zloop
mov [VCHheader.SizeY],MINY
jmp @@Zloop
@@HandleRight:
inc [VCHheader.SizeX]
cmp [VCHheader.SizeX],MAXX
jbe @@Zloop
mov [VCHheader.SizeX],MAXX
jmp @@Zloop
@@HandleLeft:
dec [VCHheader.SizeX]
cmp [VCHheader.SizeX],MINX
jge @@Zloop
mov [VCHheader.SizeX],MINX
jmp @@Zloop
@@AllDone:
mov ah,1111b
@Set_Write_Plane
mov es,[VGAseg]
mov di,29*SCRW
mov cx,153*SCRW/2
mov ax,Red2*100h + RED2
rep Stosw
mov [SplitDest],0
call RefreshScreen
pop es
popa
ret
ENDP
PROC GrabTheChar
pusha
push es ds
mov si,[Ypos]
imul si,320
add si,[Xpos]
mov al,[VCHheader.SizeX]
mul [VCHheader.SizeY]
movzx cx,[CurChar]
mul cx
mov di,ax ;ds:si pts to character
mov es,[CharSeg]
mov ds,[PicSeg]
movzx bp,[cs:VCHheader.SizeX]
sub bp,320
neg bp ;BP = 320-SizeX
mov dl,[cs:VCHheader.SizeY]
@@Loop:
movzx cx,[cs:VCHheader.SizeX]
rep movsb
add si,bp
dec dl
jne @@Loop
pop ds es
popa
ret
ENDP
PROC CheckKeys
mov ah,11h
int 16h
jnz @@DoAKey
clc
ret
@@DoAKey:
mov ah,10h
int 16h
cmp al,17
je @@DoQuit
cmp ah,PAGEUP
je @@DoPU
cmp ah,PAGEDOWN
je @@DoPD
cmp ax,2004h
je @@DoReDim
cmp ax,1f13h
je @@DoSave
cmp ah,CSRUP
je @@DoUp
cmp ah,CSRDN
je @@DoDN
cmp ah,CSRLF
je @@DoLF
cmp ah,CSRRT
je @@DoRT
cmp ah,CSRUPC
je @@DoUpC
cmp ah,CSRDNC
je @@DoDNC
cmp ah,CSRLFC
je @@DoLFC
cmp ah,CSRRTC
je @@DoRTC
cmp ax,2207h
je @@DoGrabIt
cmp al,"+"
je @@DoPlus
cmp al,"-"
je @@DoMinus
clc
ret
@@DoPlus:
inc [CurChar]
mov al,[VCHheader.NumChar]
cmp [CurChar],al
jb @@Done
mov [CurChar],0
jmp @@Done
@@DoMinus:
dec [CurChar]
mov al,[VCHheader.NumChar]
cmp [CurChar],al
jb @@Done
dec al
mov [CurChar],al
jmp @@Done
@@DoGrabIt:
call GrabTheChar
call RefreshScreen
clc
ret
@@DoUpC:
movzx ax,[VCHheader.SizeY]
dec ax
sub [Ypos],ax
jmp @@DoUp
@@DoDNC:
movzx ax,[VCHheader.SizeY]
dec ax
add [Ypos],ax
jmp @@DoDN
@@DoLFC:
movzx ax,[VCHheader.SizeX]
dec ax
sub [Xpos],ax
jmp @@DoLF
@@DoRTC:
movzx ax,[VCHheader.SizeX]
dec ax
add [Xpos],ax
jmp @@DoRT
@@DoUp:
dec [Ypos]
cmp [Ypos],0
jge @@Done
mov [Ypos],0
jmp @@Done
@@DoDN:
inc [Ypos]
movzx ax,[VCHheader.SizeY]
sub ax,200
neg ax
cmp [Ypos],ax
jl @@Done
mov [Ypos],ax
jmp @@Done
@@DoLF:
dec [Xpos]
cmp [Xpos],0
jge @@Done
mov [Xpos],0
jmp @@Done
@@DoRT:
inc [Xpos]
movzx ax,[VCHheader.SizeX]
sub ax,320
neg ax
cmp [Xpos],ax
jl @@Done
mov [Xpos],ax
jmp @@Done
@@DoSave:
call SaveIt
clc
ret
@@DoReDim:
call GetDimensions
clc
ret
@@DoQuit:
stc
ret
@@DoPU:
mov [SplitDest],1
clc
ret
@@DoPD:
mov [SplitDest],0
clc
ret
@@Done:
call RefreshScreen
clc
ret
ENDP
; Draws enlarged & normal sized image
;updates x & Y positions, width, height, current char etc..
;
PROC RefreshScreen
pusha
push es ds
mov ax,cs
mov es,ax
mov ds,ax
;SizeMsg db 1,GREEN,"`-' W:- H:- #: -/ X: - Y: - ",0
;SizeMsg2 db 1,GREY2," A 12 15 21 252 123",0
;ClrSize db 1,BLACK," █ ██ ██ ███ ███ ███ ███",0
mov al,[CurChar]
add al,[VCHheader.From] ;" "
cmp al,1
ja @@OK
mov al," "
@@ok:
mov [SizeMsg2+3],al
movzx eax,[VCHheader.SizeX]
mov cx,2
mov di,offset SizeMsg2 + 8
call DEC_Print2Mem
movzx eax,[VCHheader.SizeY]
mov di,offset SizeMsg2 + 13
call DEC_Print2Mem
movzx eax,[CurChar]
mov cx,3
mov di,offset SizeMsg2 + 18
call DEC_Print2Mem
movzx eax,[VCHheader.NumChar]
mov di,offset SizeMsg2 + 22
call DEC_Print2Mem
movzx eax,[Xpos]
mov di,offset SizeMsg2 + 28
call DEC_Print2Mem
movzx eax,[Ypos]
mov di,offset SizeMsg2 + 34
call DEC_Print2Mem
mov bx,offset RefMsg
mov cx,2
call PrintList
mov es,[VGAseg]
mov ds,[CharSeg]
mov al,[cs:VCHheader.SizeX]
mul [cs:VCHheader.SizeY]
movzx cx,[cs:CurChar]
mul cx
mov si,ax ;ds:si pts to character
mov ah,1110b
@Set_Write_Plane
mov di,ENLARGEOFFSET
mov dl,[cs:VCHheader.SizeY]
mov bx,SCRW
sub bl,[cs:VCHheader.SizeX]
@@BigLoop:
mov dh,2
mov bp,si
@@BigLoop2:
movzx cx,[cs:VCHheader.SizeX]
rep movsb
mov si,bp
add di,bx
dec dh
jne @@BigLoop2
movzx cx,[cs:VCHheader.SizeX]
rep movsb
add di,bx
add di,SCRW
dec dl
jne @@BigLoop
──
mov ds,[cs:PicSeg]
mov ax,[cs:Ypos]
imul ax,320
add ax,[cs:Xpos]
mov si,ax ;ds:si pts to character
mov di,ENLARGEOFFSET+40
mov bx,SCRW
mov ax,320
movzx dx,[cs:VCHheader.SizeX]
sub bx,dx
sub ax,dx ;AX=320-SizeX BX=SCRW-SizeX
mov dl,[cs:VCHheader.SizeY]
@@BigLoop3:
mov dh,2
mov bp,si
@@BigLoop4:
movzx cx,[cs:VCHheader.SizeX]
rep movsb
mov si,bp
add di,bx
dec dh
jne @@BigLoop4
movzx cx,[cs:VCHheader.SizeX]
rep movsb
add di,bx
add di,SCRW
add si,ax
dec dl
jne @@BigLoop3
──
mov di,[cs:OldY] ;erase top line
dec di
js @@SkipEtop
imul di,SCRW
add di,240*SCRW
mov si,[cs:OldY]
dec si
imul si,320
mov bl,1
@@LoLo:
push si di
mov ah,bl
@Set_Write_Plane
mov cx,SCRW
@@InLoLo:
movsb
add si,3
loop @@InLoLO
pop di si
inc si
shl bl,1
cmp bl,10000b
jb @@LoLo
@@SkipEtop:
mov di,[cs:OldY] ;erase bottom line
movzx ax,[cs:VCHheader.SizeY]
add di,ax
imul di,SCRW
add di,240*SCRW
mov si,[cs:OldY]
add si,ax
imul si,320
mov bl,1
@@LoLo2:
push si di
mov ah,bl
@Set_Write_Plane
mov cx,SCRW
@@InLoLo2:
movsb
add si,3
loop @@InLoLO2
pop di si
inc si
shl bl,1
cmp bl,10000b
jb @@LoLo2
mov si,[cs:OldX] ;erase left
dec si
js @@SkipELeft
mov di,si
mov cx,di
and cl,11b
mov ah,1
shl ah,cl
@Set_Write_Plane
shr di,2
add di,240*SCRW
mov dx,200
@@LoX:
movsb
add di,SCRW-1
add si,320-1
dec dx
jne @@Lox
@@SkipELeft:
mov si,[cs:OldX] ;erase right
movzx ax,[cs:VCHheader.SizeX]
add si,ax
cmp si,320
jae @@SkipEright
mov di,si
mov cx,di
and cl,11b
mov ah,1
shl ah,cl
@Set_Write_Plane
shr di,2
add di,240*SCRW
mov dx,200
@@LoX2:
movsb
add di,SCRW-1
add si,320-1
dec dx
jne @@Lox2
@@SkipEright:
mov ax,[cs:Xpos]
mov [cs:OldX],ax
mov ax,[cs:Ypos]
mov [cs:OldY],ax
mov ah,1111b
@Set_write_plane
mov di,[cs:OldY] ;draw top line
dec di
js @@SKipDtop
imul di,SCRW
add di,240*SCRW
mov cx,SCRW
mov al,RED
rep stosb
@@SKipDtop:
mov di,[cs:OldY] ;draw bottom line
movzx ax,[cs:VCHheader.SizeY]
add di,ax
imul di,SCRW
add di,240*SCRW
mov cx,SCRW
mov al,RED
rep stosb
mov di,[cs:OldX] ;draw left
dec di
js @@SKipDLeft
mov cx,di
and cl,11b
mov ah,1
shl ah,cl
@Set_Write_Plane
shr di,2
add di,240*SCRW
mov dx,200
mov al,RED
@@LoXx:
stosb
add di,SCRW-1
dec dx
jne @@Loxx
@@SKipDLeft:
mov di,[cs:OldX] ;draw right
movzx ax,[cs:VCHheader.SizeX]
add di,ax
cmp di,320
jae @@SkipDright
mov cx,di
and cl,11b
mov ah,1
shl ah,cl
@Set_Write_Plane
shr di,2
add di,240*SCRW
mov dx,200
mov al,RED
@@LoX2x:
stosb
add di,SCRW-1
dec dx
jne @@Lox2x
@@SkipDright:
pop ds es
popa
ret
ENDP
PROC SaveIt
pusha
push ds
mov ax,cs
mov ds,ax
mov dx,offset FileNameVCH
sub cx,cx
mov ah,3ch ;open file
int 21h
jc @@abort
mov bx,ax
mov dx,offset VCHheader
mov cx,(size VchHdr)
mov ah,40h
int 21h
mov al,[VCHheader.SizeY] ;figure size
mul [VCHheader.SizeX]
movzx dx,[VCHheader.NumChar]
mul dx
mov cx,ax ; the dest file lenght
push ds
mov ds,[CharSeg]
mov ah,40h ; function write
xor dx,dx
int 21h ; write it
pop ds
mov ah,3eh ;close source file
int 21h
@@Abort:
pop ds
popa
ret
ENDP