Merge branch 'vendor/XZ'
[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 ! $DragonFly: src/usr.bin/doscmd/redir.S,v 1.2 2003/06/17 04:29:26 dillon Exp $
29
30
31 !
32 ! This is the new redirector program, it replaces instbsdi.exe
33 ! The program fetches some pointers from DOS and reports them back to
34 ! the emulator via the emulator interrupt 0xff. It does not stay resident.
35
36 use16
37
38 .text
39 .bss
40 .data
41 .align 0
42
43 ! Emulator interrupt entry
44 EmulatorINT = 0xFF
45 ! Emulator redirector function
46 EmulatorRED = 0x1
47
48 ! DOS interrupt
49 DOSInt      = 0x21
50
51 ! DOS get list of lists call, returns pointer to system vars in ES:BX 
52 DOSGetList  = 0x52
53
54 ! DOS get swappable area, returns DOS swappable area in DS:SI
55 DOSGetSwapD = 0x5D06
56
57 ! DOS terminate program with return code
58 DOSExit     = 0x4C
59
60 ! DOS print message
61 DOSMesg     = 0x9
62
63 cr      =       0xd
64 lf      =       0xa
65 eom     =       '$'             ! DOS end of string
66
67         .org 0x100
68
69 .globl _main
70 _main:
71         
72         mov     ah, #DOSGetList
73         int     DOSInt
74         jc      Fail
75         mov     [_list], bx
76         mov     ax, es
77         mov     [_list+2], ax
78         push    ds
79         mov     ax, #DOSGetSwapD
80         int     DOSInt
81         mov     ax, ds
82         pop     ds
83         jc      Fail
84         mov     [_swap], si
85         mov     [_swap+2], ax
86         push    ax
87         mov     ah, #EmulatorRED
88         mov     dx, [_list]
89         mov     bx, [_list+2]
90         mov     si, [_swap]
91         mov     di, [_swap+2]
92         int     EmulatorINT
93         xor     al, al                  ! return 0
94         jmp     Exit
95 Fail:
96         mov     ah, #DOSMesg
97         mov     dx, #ErrorMessage
98         int     DOSInt
99         mov     al, #1                  ! return 1
100 Exit:
101         mov     ah, #DOSExit
102         int     DOSInt
103 !
104 !       Should never get to this point
105 !
106         nop
107         nop
108         hlt
109
110 ! The two pointers are found using the DOS calls
111 ! and passed to the redirector interface via int FF
112 ! The two pointers are passed in BX:DX (list) and DI:SI (swap)
113
114 .align  2
115
116 _list:  .word 0
117         .word 0
118 _swap:  .word 0
119         .word 0
120
121 ErrorMessage:
122         .ascii  "Error installing redirector interface"
123         .byte   cr,lf,eom, 0