    IDEAL
    DOSSEG
    MODEL SMALL
    STACK 200h
    CODESEG
    p386

InputStatus1=   3dah
MISC_OUTPUT =   3c2h
SC_Index    =   3c4h
CRTC_Index  =   3d4h
Graph_Index =   3ceh
Attr_Index  =   3c0h    ;don't forget to clear flipflop & set bit 5 on index
PEL_Write   =   3c8h
PEL_Read    =   3c7h
PEL_Data    =   3c9h

VGASeg      dw  0A000h
VGAcSeg     dw  0B800h

STRUC FNT_Header
    Id          db  "VLAFNT"
    X           db  1           ;widths in BYTES (8 pixels)
    Y           db  8
    NumChr      db  ?
    StartChr    db  " "         ;char to start with
ENDS

INCLUDE "MCLSUB.INC"

FNTHead FNT_Header  <>
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MACRO @vidmemm0                    ; Vidmem mode 0 (character bitmap dat)
        mov dx,3c4h
        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
ENDM

MACRO @vidmemm1                       ; Vidmem mode 1 (screen character dat)
        mov dx,3c4h
        mov ax,00302h
        out dx,ax
        mov ax,00204h
        out dx,ax
        ÄÄ
        mov dx,3ceh
        mov ax,01005h
        out dx,ax
        mov ax,00e06h
        out dx,ax
        mov ax,00004h
        out dx,ax
ENDM

FileName_FNT    db  100 dup (0)
EXT_FNT         db  ".FNT",0

HANDLE_FNT      dw  ?

PROC LoadAndDumpFont NEAR
    pusha
    push    ds es

    mov     ax,cs
    mov     ds,ax
    mov     ax,3d00h
    mov     dx,offset FileName_FNT
    int     21h
    jc      @@Abort
    mov     bx,ax
    mov     [cs:HANDLE_FNT],bx

    mov     dx,offset FNThead       ;read in the header
    mov     ah,3fh
    mov     cx,(size FNT_Header)
    int     21h

    mov     ds,[cs:VGAcSeg]
    mov     es,[cs:VGAcSeg]
    @VidMemM0
    movzx   di,[cs:FNTHead.StartChr]
    shl     di,5
    
    movzx   si,[cs:FNTHead.NumChr]

    mov     bx,[cs:HANDLE_FNT]
@@ReadLoop:
    mov     dx,di
    movzx   cx,[cs:FNTHead.Y]
    mov     ah,3fh
    int     21h

    add     di,cx
    sub     cx,32
    neg     cx
    xor     al,al
    cld
    rep     stosb

    dec     si
    jne     @@ReadLoop

    @VidMemM1

    mov     bx,[cs:HANDLE_FNT]
    mov     ah,3eh
    int     21h

  ;  mov     dx,3d4h         ;set char height
  ;  mov     al,9
  ;  out     dx,al
  ;  inc     dx
  ;  in      al,dx
  ;  and     al,11100000b
  ;  or      al,[cs:FNThead.Y]
  ;  out     dx,al

@@Abort:
    pop     es ds
    popa
    ret
ENDP


START:
    mov     ax,cs
    mov     ds,ax

    mov     bx,offset EXT_FNT
    mov     dx,offset FileName_FNT
    mov     bp,0                    ;only put ext if none exists
    call    GetCommandLine

    call    LoadAndDumpFont

    mov     ax,4c00h
    int     21h
END START
