📄 emufs.s
字号:
!! ! Mach Operating System! Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University! Copyright (c) 1991 IBM Corporation ! All Rights Reserved.! ! Permission to use, copy, modify and distribute this software and its! documentation is hereby granted, provided that both the copyright! notice and this permission notice appear in all copies of the! software, derivative works or modified versions, and any portions! thereof, and that both notices appear in supporting documentation,! and that the nema IBM not be used in advertising or publicity ! pertaining to distribution of the software without specific, written! prior permission.! ! CARNEGIE MELLON AND IBM ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS"! CONDITION. CARNEGIE MELLON AND IBM DISCLAIM ANY LIABILITY OF ANY KIND FOR! ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.! ! Carnegie Mellon requests users of this software to return to! ! Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU! School of Computer Science! Carnegie Mellon University! Pittsburgh PA 15213-3890! ! any improvements or extensions that they make and grant Carnegie Mellon! the rights to redistribute these changes.! ! MACHFS.ASM MS-DOS device driver to interface mach file system! with the dos server's monitor.!! Version 1.1!! Gerald Malan (grm) 4/5/1991!! modified for the linux dos emulator by Andrew Tridgell 13/4/93! translated into as86 form by Robert Sanders ('murrcan style date!) 4/13/93! (I probably broke something, but it seems to work)!! $Date: 2001/01/22 01:37:37 $! $Source: /cvsroot/pcemu/pcemu/programs/emufs.S,v $! $Revision: 1.1.1.1 $! $State: Exp $!! Altered slightly to run under PCEMU - DH! Additions/alterations are markeduse16.text.bss.data.align 0 .org 0MaxCmd = 12cr = 0xdlf = 0xaeom = '$' ! DOS end-of-string character (barf)Linuxfs = 0xe6 ! 0xe6 is Int for Mach Dos ServerMivec = (Linuxfs * 4) ! mem loc for the interrupt vector.globl _main_main:Header: .long -1 ! link to next device driver .word 0 ! attribute word for driver .word Strat ! ptr to strategy routine .word Intr ! ptr to interrupt service routine! ### Line below changed by DH ### .ascii "PCEMU " ! logical-device name! the Strat and Intr routines are entered with a "far call". I don't! know how to tell as86 that asI would in Turbo Assembler, so Ijust! explicitly "retf" at the end of their execution. careful! ! BPB from horse.mach.cs.cmu.eduBpb: .word 0x200 ! Bytes per Sector .byte 4 ! Sectors per allocation unit .word 1 ! Number of reserved sectors .byte 2 ! Number of FATS .word 0x200 ! Max number of root entries .word 0xac21 ! Total number of sectors .byte 0xf8 ! Media Desc Byte .word 0x2b ! Num sec per FAT .word 0x23 ! Sectors per track .word 0xf ! Number of heads .word 0 ! Number of hidden sectors .word 0 ! High order word of hidden sectors .long 0 ! zero .long 0 .long 0 .long 0 .long 0 .long 0 .long 0 .long 0BPBptr: .word BpbRHPtr: .long 0 ! ptr to request headerInitDone: .word 0 ! 1 when initialisation is completeDispatch: .word Init ! initialize driver .word MediaChk .word BuildBpb .word Dummy .word Read ! read .word Dummy .word Dummy .word Dummy .word Write ! write .word Write ! write with verify .word Dummy .word Dummy .word DummyStrat:! was...! mov word ptr cs:[RHPtr],bx! mov word ptr cs:[RHPtr+2],es seg cs mov [RHPtr], bx seg cs mov [RHPtr+2],es retfIntr: push ax push bx push cx push dx push ds push es push di push si push bp push cs pop ds les di,[RHPtr] ! let es:di = request header seg es movb bl,[di+2] xorb bh,bh cmp bx, #MaxCmd jle Intr1 call Error jmp Intr2Intr1: shl bx,#1 call [bx+Dispatch] les di,[RHPtr]Intr2: or ax,#0x100 ! Merge done bit with status seg es mov [di+3],ax pop bp pop si pop di pop es pop ds pop dx pop cx pop bx pop ax retfDummy: call MFSini les di, [RHPtr] seg es mov bl, [di+2] mov bh, #3 mov ax, #0x20 int Linuxfs xor ax,ax retMediaChk: call MFSini! was...! mov byte ptr es:[di+14],#-1 ! disk has changed! mov word ptr es:[di+15], offset NoName! mov word ptr es:[di+17], cs seg es movb [di+14],#-1 ! disk has changed seg es mov [di+15], #NoName seg es mov [di+17], cs xor ax,ax retBuildBpb: call MFSini! was...! mov word ptr es:[di+18],offset Bpb! mov word ptr es:[di+20],cs seg es mov [di+18], #Bpb seg es mov [di+20], cs xor ax,ax retRead: call MFSini mov bx,#0x101 mov ax,#0x20 int Linuxfs xor ax,ax retWrite: call MFSini mov bx,#0x202 mov ax,#0x20 int Linuxfs xor ax,ax retError: mov ax,#0x8003 retMyIret: xor ax,ax iretMFSini: push es push di push cs pop ds mov ax,[InitDone] cmp ax,#0 jne AlreadyDone mov ax, #0x3000 int 0x21 push ax mov ah, #0x52 int 0x21 mov ax, #0x5d06 int 0x21 pop cx push bx pop dx mov bx, #0x500 mov ax,#0x20 int Linuxfs push cs pop ds mov ax,#1 mov [InitDone],axAlreadyDone: pop di pop es ret! ### Added by DH ###Old2f: nop nop nop nopInt2fHandler: cmp ah,#0x11 jnz NotRedir push bp mov bp,sp push word ptr [bp+8] int #0xe8 pop bp pop bp jz NotRedir sti retf #2NotRedir: seg cs jmp far [Old2f]InitRedir: cli push ds push es push ax xor ax,ax mov ds,ax les ax,[0x2f*4] seg cs mov [Old2f],ax seg cs mov [Old2f+2],es mov [0x2f*4],#Int2fHandler mov [0x2f*4+2], cs pop ax pop es pop ds sti ret! ### End of additionInit: xor bx,bx push si mov si, #DirName movb [si], #0x24 mov ax, #0x20 int Linuxfs pop si cmp ax, #0 jne MFSinMFSout: push cs pop ds mov ah, #9 mov dx, #OutMess int 0x21! was...! mov byte ptr es:[di+13],#0 ! No units!!! mov word ptr es:[di+18],offset BPBptr! mov word ptr es:[di+20],cs! ### Line below changed from #0 to #InitRedir! mov word ptr es:[di+14],#InitRedir !Break addr = cs:InitRedir! mov word ptr es:[di+16],cs seg es movb [di+13],#0 ! No units!! seg es mov [di+18], #BPBptr seg es mov [di+20],cs seg es mov [di+14],#InitRedir !Break addr = cs:InitRedir seg es mov [di+16],cs retMFSin:! ### Added by DH ### call InitRedir! ### End of addition ### call MFSini seg es movb al, [di+22] add al, #0x41 push di push cs pop ds mov di, #Mesage1 movb [di],al mov ah, #9 mov dx, #Mesage int 0x21 pop di! was...! mov byte ptr es:[di+13],#1 ! Number of units! mov word ptr es:[di+18],offset BPBptr! mov word ptr es:[di+20],cs! mov word ptr es:[di+14],offset Init! mov word ptr es:[di+16],cs! this is part of diff9! seg es! movb [di+13],#1 ! Number of units seg es mov [di+18], #BPBptr seg es mov [di+20],cs seg es mov [di+14], #Init seg es mov [di+16],cs xor ax,ax ret! ### Next line altered slightly by DHMesage: .ascii "[PC Emulator File System] drive "Mesage1: .ascii "A: is directory "DirName: .space 128 .byte cr,lf,eomOutMess: .byte cr,lf,lf .ascii "Linux Dos Server not responding." .byte cr,lf .ascii "Installation aborted." .byte cr,lf,lf,eomNoName: .ascii "NO NAME" .byte 0 end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -