Initial import from FreeBSD RELENG_4:
[dragonfly.git] / usr.bin / doscmd / redir.S
1 ! Copyright (c) 1997 Helmut Wirth <hfwirth@ping.at>
2 ! All rights reserved.
3 !
4 ! Redistribution and use in source and binary forms, with or without
5 ! modification, are permitted provided that the following conditions
6 ! are met:
7 ! 1. Redistributions of source code must retain the above copyright
8 !    notice immediately at the beginning of the file, witout modification,
9 !    this list of conditions, and the following disclaimer.
10 ! 2. Redistributions in binary form must reproduce the above copyright
11 !    notice, this list of conditions and the following disclaimer in the
12 !    documentation and/or other materials provided with the distribution.
13 ! 3. The name of the author may not be used to endorse or promote products
14 !    derived from this software without specific prior written permission.
15 !
16 ! THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 ! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 ! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 ! IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 ! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 ! NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 ! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 ! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
24 ! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 ! THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 !
27 ! $FreeBSD: src/usr.bin/doscmd/redir.S,v 1.2 1999/08/28 01:00:22 peter Exp $
28
29
30 !
31 ! This is the new redirector program, it replaces instbsdi.exe
32 ! The program fetches some pointers from DOS and reports them back to
33 ! the emulator via the emulator interrupt 0xff. It does not stay resident.
34
35 use16
36
37 .text
38 .bss
39 .data
40 .align 0
41
42 ! Emulator interrupt entry
43 EmulatorINT = 0xFF
44 ! Emulator redirector function
45 EmulatorRED = 0x1
46
47 ! DOS interrupt
48 DOSInt      = 0x21
49
50 ! DOS get list of lists call, returns pointer to system vars in ES:BX 
51 DOSGetList  = 0x52
52
53 ! DOS get swappable area, returns DOS swappable area in DS:SI
54 DOSGetSwapD = 0x5D06
55
56 ! DOS terminate program with return code
57 DOSExit     = 0x4C
58
59 ! DOS print message
60 DOSMesg     = 0x9
61
62 cr      =       0xd
63 lf      =       0xa
64 eom     =       '$'             ! DOS end of string
65
66         .org 0x100
67
68 .globl _main
69 _main:
70         
71         mov     ah, #DOSGetList
72         int     DOSInt
73         jc      Fail
74         mov     [_list], bx
75         mov     ax, es
76         mov     [_list+2], ax
77         push    ds
78         mov     ax, #DOSGetSwapD
79         int     DOSInt
80         mov     ax, ds
81         pop     ds
82         jc      Fail
83         mov     [_swap], si
84         mov     [_swap+2], ax
85         push    ax
86         mov     ah, #EmulatorRED
87         mov     dx, [_list]
88         mov     bx, [_list+2]
89         mov     si, [_swap]
90         mov     di, [_swap+2]
91         int     EmulatorINT
92         xor     al, al                  ! return 0
93         jmp     Exit
94 Fail:
95         mov     ah, #DOSMesg
96         mov     dx, #ErrorMessage
97         int     DOSInt
98         mov     al, #1                  ! return 1
99 Exit:
100         mov     ah, #DOSExit
101         int     DOSInt
102 !
103 !       Should never get to this point
104 !
105         nop
106         nop
107         hlt
108
109 ! The two pointers are found using the DOS calls
110 ! and passed to the redirector interface via int FF
111 ! The two pointers are passed in BX:DX (list) and DI:SI (swap)
112
113 .align  2
114
115 _list:  .word 0
116         .word 0
117 _swap:  .word 0
118         .word 0
119
120 ErrorMessage:
121         .ascii  "Error installing redirector interface"
122         .byte   cr,lf,eom, 0