freebsd-skq/usr.bin/doscmd/redir.S
1999-08-28 01:08:13 +00:00

123 lines
3.1 KiB
ArmAsm

! Copyright (c) 1997 Helmut Wirth <hfwirth@ping.at>
! All rights reserved.
!
! Redistribution and use in source and binary forms, with or without
! modification, are permitted provided that the following conditions
! are met:
! 1. Redistributions of source code must retain the above copyright
! notice immediately at the beginning of the file, witout modification,
! this list of conditions, and the following disclaimer.
! 2. Redistributions in binary form must reproduce the above copyright
! notice, this list of conditions and the following disclaimer in the
! documentation and/or other materials provided with the distribution.
! 3. The name of the author may not be used to endorse or promote products
! derived from this software without specific prior written permission.
!
! THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
!
! $FreeBSD$
!
! This is the new redirector program, it replaces instbsdi.exe
! The program fetches some pointers from DOS and reports them back to
! the emulator via the emulator interrupt 0xff. It does not stay resident.
use16
.text
.bss
.data
.align 0
! Emulator interrupt entry
EmulatorINT = 0xFF
! Emulator redirector function
EmulatorRED = 0x1
! DOS interrupt
DOSInt = 0x21
! DOS get list of lists call, returns pointer to system vars in ES:BX
DOSGetList = 0x52
! DOS get swappable area, returns DOS swappable area in DS:SI
DOSGetSwapD = 0x5D06
! DOS terminate program with return code
DOSExit = 0x4C
! DOS print message
DOSMesg = 0x9
cr = 0xd
lf = 0xa
eom = '$' ! DOS end of string
.org 0x100
.globl _main
_main:
mov ah, #DOSGetList
int DOSInt
jc Fail
mov [_list], bx
mov ax, es
mov [_list+2], ax
push ds
mov ax, #DOSGetSwapD
int DOSInt
mov ax, ds
pop ds
jc Fail
mov [_swap], si
mov [_swap+2], ax
push ax
mov ah, #EmulatorRED
mov dx, [_list]
mov bx, [_list+2]
mov si, [_swap]
mov di, [_swap+2]
int EmulatorINT
xor al, al ! return 0
jmp Exit
Fail:
mov ah, #DOSMesg
mov dx, #ErrorMessage
int DOSInt
mov al, #1 ! return 1
Exit:
mov ah, #DOSExit
int DOSInt
!
! Should never get to this point
!
nop
nop
hlt
! The two pointers are found using the DOS calls
! and passed to the redirector interface via int FF
! The two pointers are passed in BX:DX (list) and DI:SI (swap)
.align 2
_list: .word 0
.word 0
_swap: .word 0
.word 0
ErrorMessage:
.ascii "Error installing redirector interface"
.byte cr,lf,eom, 0