Metropoli BBS
VIEWER: r3df.asm MODE: TEXT (CP437)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; 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

[ RETURN TO DIRECTORY ]