;
    ; Program to be inserted on the boot sector of the emergency repair
    ; disk.  Prints out a message and hangs.
    ;
    ; The program is designed to be inserted around the existing BPB.
    ; Whoever puts it in place should read the first three bytes of the
    ; boot sector to determine the byte offset within the sector where the
    ; program should be placed.
    ;
    ; See setup\src\restore.c.
    ;

TheSeg segment
    assume cs:TheSeg,ds:nothing,es:nothing,ss:nothing

    ;
    ; Make link happy with /tiny by setting org to 100h.
    ; The program itself is designed to run at 0:7c00h, so
    ; the org is just a dummy.
    ;
    org     100h
Start:

    ;
    ; Set up a stack and initialize necessary segment registers.
    ;
    xor     bx,bx
    mov     ss,bx
    mov     ds,bx
    mov     sp,7c00h

    ;
    ; Set video mode -- 80x25 text.
    ;
    mov     ax,3
    int     10h

    ;
    ; Make ds:si point at the message to be displayed.
    ;
    call    @f
@@: pop     si
    add     si,offset cs:msg - @b

    ;
    ; Print out the string via BIOS calls.  Registers ds, si, and bx are
    ; already set up.
    ;
    ; Some BIOSes don't preserve ax properly so we'll reload it
    ; on every iteration.
    ;
    cld
@@: mov     ah,0eh
    lodsb
    or      al,al
    jz      @f
    int     10h
    jmp     @b

    ;
    ; Done.  Hide the cursor and hang.
    ; Register bh is already set up.
    ;
@@: mov     ah,2
    mov     dl,bl
    mov     dh,19h
    int     10h
    sti
@@: jmp     @b

    ;
    ; The message to be printed.  This will be inserted by setup from its
    ; resources (IDS_REPAIR_BOOTCODE_MSG), and must be nul-terminated.
    ;
msg label byte

TheSeg ends

    end     Start