Bf core

wtf?
brainfuck!

intro
bf core is extremely optimized by size (69 bytes) brainfuck core implementation written in x86 asm. Coded by Total Vacuum in 2016.

goal
The goal is to create as compact as possible brainfuck core implementation for simple brainfuck to dos/winxp executable .com file compiler. Output file format: You can freely use this core in your brainfuck compiler to produce dos/winxp executable .com files, or you can generate .com file even without compiler using copy bfcore.com+src.b dest.com where bfcore.com is previously compiled bf core, src.b is brainfuck source (strip comments and whitespaces first!), dest.com is destination .com file.
 * core (69 bytes for current version)
 * code (passed through comment and whitespace remover)
 * space (ascii 0x20, 1 byte)

The next goal is to trim core size to 64 bytes. Is it possible? All ideas on core size trimming are welcome! :)

specification

 * 8-bit cells
 * 510 memory cells (+2 bytes for 30000 cells)
 * max code size is 32K
 * the only available characters are [ ] < > + -,.
 * one extra terminating space character (ascii 0x20) required (for correct program termination)
 * no newline character conversions on i/o
 * incorrect i/o when redirecting from/to file (+3 bytes to fix)
 * up to 255 nested [ ] blocks

src
|        .model tiny       ; |        .code             ; |        .startup          ; BE 45 01 |        lea si,@src       ; D1 EF   |         shr di,1          ; F3 AB   |         rep stosw         ; 4F      |         dec di            ; 2B F8   | @move:  sub di,ax         ;  3D      |         db 3Dh            ; 28 05   | @add:   sub [di],al       ; +/- AC      | @next:  lodsb             ; 98      |         cbw               ; 2C 5B   |         sub al,'['        ; E3 07   |         jcxz @true        ; 7C F8   |         jl @next          ; 48      | @inccx: dec ax            ; [/] 2A C8   |         sub cl,al         ; EB F3   |         jmp @next         ; 7C 0C   | @true:  jl @ptr           ; 7F 06   |         jg @end           ; 3A 05   |         cmp al,[di]       ; [ 74 F3   |         je @inccx         ; 56      |         push si           ; 3D      |         db 3Dh            ; 5E      | @end:   pop si            ; ] 4E      |         dec si            ; EB E5   |         jmp @next         ; 2C E1   | @ptr:   sub al,'<'-'['    ; 48      |         dec ax            ; 73 DB   |         jnc @move         ; 2C EE   | @last:  sub al,'+'-'<'-1  ; +/,/-/. 3C 03   |         cmp al,3          ; 74 08   |         je @putc          ; 73 0A   |         jnc @exit         ; 48      |         dec ax            ; 75 D3   |         jnz @add          ; B4 08   | @getc:  mov ah,8          ; , 3D      |         db 3Dh            ; B4 02   | @putc:  mov ah,2          ;. 8A 15   |         mov dl,[di]       ; CD 21   | @exit:  int 21h           ; 88 05   |         mov [di],al       ; EB C8   |         jmp @next         ; | @src: ;db "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.--..>>+.>++. ";Hello World! |        end               ;

compilation
Compile with: tasm.exe /m9 tlink.exe /t /x

sorry
Sorry for my English :)