;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; DXF "Remove 3DFaces"
;
; Lets say you have a 3d object from some bulletin board, but the 3dfaces
; are all screwed up. Use this utility to remove any 3dfaces but keep the
; wireframe. After I wrote this, I realized you can do this from AUTOCAD
; by just selecting ERASE 3DFACE ALL ... oh, well...
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Link this with PMODE, FILE, and ARGC
.386p
jumps
code32 segment para public use32
assume cs:code32, ds:code32, ss:code32
include pmode.ext
include file.ext
include argc.ext
public _main
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Macros
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
upper macro regx ; make register uppercase
local strl
cmp regx,"a"
jb short strl
cmp regx,"z"
ja short strl
sub regx,"a"-"A"
strl:
endm
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; DATA
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
inputname db 60 dup (?)
outputname db 60 dup (?)
buffer db 60 dup (?)
fileloc dd 0
dxfo dd 0 ; start dxf file location
dxfsize dd 0 ; dxf filesize
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; CODE
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
include extras.rt
errmsg0 db 10,13,'Missing Filename!',0dh,0ah,"$"
errmsg1 db 10,13,'Not Enough Memory!',0dh,0ah,"$"
errmsg2 db 10,13,'Error Opening File!',0dh,0ah,"$"
okmsg db 10,13,"Bye!",10,13,"$"
exiterr0:
mov edx,offset errmsg0
call _putdosmsg
jmp okerr0
exiterr1:
mov edx,offset errmsg1
call _putdosmsg
jmp okerr0
exiterr2:
mov edx,offset errmsg2
call _putdosmsg
jmp okerr0
okerr0:
mov edx,offset okmsg
call _putdosmsg
jmp _exit
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Allocate memory
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_main:
call _setbuf
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Parse and open DXF, allocate memory, load DXF, close file
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
xor al,al
mov edx,offset inputname
call _cchekstr
jc exiterr0
mov edx,offset inputname
call _openfile
jc exiterr2
call _filesize
mov dxfsize,eax
call _getlomem
jc exiterr1
mov dxfo,eax
mov fileloc,eax
mov edx,eax
mov ecx,dxfsize
call _readfile
jc exiterr2
call _closefile
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Parse and open output filename
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov al,1 ; check for filename on commandline
mov edx,offset outputname
call _cchekstr
jc exiterr0
mov edx,offset outputname
call _createfile
jc exiterr0
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Write new DXF file without 3dfaces
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov edi,dxfo
mov ebp,edi
add ebp,dxfsize
mov dxfsize,ebp
outloop:
mov fileloc,edi
mov edx,offset tag1
mov ebp,dxfsize
call search_string
jc done
push edi
mov edx,fileloc
mov ecx,edi
sub ecx,edx
cmp ecx,0
je end2end
call _writefile
end2end:
pop edi
mov edx,offset tag2
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag3
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag4
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag5
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag6
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag7
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag8
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tag9
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset taga
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tagb
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tagc
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tagd
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tage
mov ebp,dxfsize
call search_string
jc exiterr0
mov edx,offset tagf ; yeah, it should have been a loop but who gives a shit!
mov ebp,dxfsize
call search_string
jc exiterr0
call next
jmp outloop
done:
mov edx,fileloc
mov ecx,dxfsize
sub ecx,edx
cmp ecx,0
je outq
call _writefile
outq:
call _closefile
jmp _exit
tag1 db "3DFACE",0
tag2 db " 8",0
tag3 db " 10",0
tag4 db " 20",0
tag5 db " 30",0
tag6 db " 11",0
tag7 db " 21",0
tag8 db " 31",0
tag9 db " 12",0
taga db " 22",0
tagb db " 32",0
tagc db " 13",0
tagd db " 23",0
tage db " 33",0
tagf db " 0",0
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Unpad string
; In: EDI => string eg " , Hello th"
; Out: EDI => string (after spaces, colons, whatever) eg "Hello th"
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
unpad:
dec edi
upx:
inc edi
mov al,[edi]
cmp al,"A"
jae upretx
cmp al,"9"
ja upx
cmp al,31
jb upx
upretx:
ret
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Next string
; In: EDI => string eg "Hello there mi"
; Out: EDI => next string (after spaces, colons, whatever) eg "there mi"
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
next:
call unpad
dec edi
nxc:
inc edi
mov al,[edi]
cmp al,"A"
jae nxc
cmp al,"9"
ja nxretc
cmp al,31
jae nxc
nxretc:
jmp unpad
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Search_string: Find string at EDX in DXF file
; In:
; EDX => ASCIIZ string to search for (DXF)
; EDI = location to start search
; EBP = location to end search
; Out:
; CF = 1 - not found
; CF = 0 - found
; EDI = location where found
; Notes: String at EDI must have a space or zero at end for search tp succeed.
; eg: EDX => "HELLO",0
; EDI => "ABCDHELLOEFGI" will FAIL! - but " ABCDHELLO DKJ" will succeed!
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
search_string:
mov esi,edx
mov ecx,edi
ssloop:
mov al,[esi]
mov ah,[ecx]
upper al
upper ah
inc esi
inc ecx
cmp al,ah
je ssloop
cmp al,0
jne ssabort
cmp ah,"."
jae ssabort
clc
ret
ssabort:
cmp ecx,ebp
jae ssretx
inc edi
jmp search_string
ssretx:
stc
ret
code32 ends
end