LinuxQuestions.org
Review your favorite Linux distribution.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices

Reply
 
Search this Thread
Old 10-02-2009, 12:36 PM   #46
johnsfine
Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,044

Rep: Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100

Quote:
Originally Posted by smeezekitty View Post
it only uses DGROUP@ in tiny model
Code:
mov     bp,cs:DGROUP@
mov     ds,bp
mov     bp,sp
Where does it generate that code?
That appears to be startup code. I would not expect the startup code to be generated when compiling a .c file and I thought you were providing your own startup code, not linking in the standard startup module for .com files.

Code:
_TEXT   segment byte public 'CODE'
        extrn   DGROUP@:word
_TEXT   ends
I think that means DGROUP@ is a location in the _TEXT segment containing the value DGROUP (meaning I was wrong earlier to guess it was just another name for DGROUP).

The correct value of DGROUP for tiny model is actually the value of the cs register. So you could add that to your startup module.

I don't understand how the declaration of _main and jmp _main you quoted in your startup module could be correct, so I'm just quoting that part back to you as you gave it to me, so I can show you where the change I'm suggesting fits in:

Code:
    .MODEL TINY
    .CODE
    .DATA
    .DATA?
    DGROUP GROUP _TEXT,_DATA,_BSS
    .CODE
    extrn _main:far
START:
mov si,ax
mov ax,cs
mov ss,ax
mov ds,ax
    assume ds:DGROUP
mov DGROUP@,ax
mov ax,si
jmp _main
    PUBLIC DGROUP@
DGROUP@ dw 0
END START
Quote:
i dont have the tasm doc
I gave you a URL for some tasm doc Yesterday in post #38 of this thread.

I got directly to that copy from a google search on a specific detail from this thread. But you might find a better version by going up one level in that URL to the containing directory:
http://www.bitsavers.org/pdf/borland/

Last edited by johnsfine; 10-02-2009 at 12:41 PM.
 
Old 10-02-2009, 12:38 PM   #47
manu-tm
Member
 
Registered: May 2008
Location: France
Distribution: Ubuntu, Debian
Posts: 239

Rep: Reputation: 23
I think this is the one I found very usefull:
http://www.bitsavers.org/pdf/borland...Guide_1990.pdf
(all the stuff on segments and memory)
don't know if it will help, hope so
 
Old 10-02-2009, 12:49 PM   #48
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
i just saw a blank screen on that link

Last edited by smeezekitty; 10-02-2009 at 12:55 PM.
 
Old 10-02-2009, 12:50 PM   #49
manu-tm
Member
 
Registered: May 2008
Location: France
Distribution: Ubuntu, Debian
Posts: 239

Rep: Reputation: 23
Sorry, didn't see I was duplicating the previous post
 
Old 10-02-2009, 01:00 PM   #50
johnsfine
Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,044

Rep: Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100
Quote:
Originally Posted by smeezekitty View Post
i just saw a blank screen on that link
Which link? A link directly to the pdf file or the link to the directory above the pdf?

Your browser may hang for a long time on a blank screen if you click directly on one of those pdf files. Then it should eventually show you contents.

It may be more effective to right click on the pdf link and select to save the pdf to your own system. Then you get a progress indication of how slowly it is arriving and you can use it once it is saved.

Edit: I just remembered that link acted differently for me in Firefox in Linux than it did in Firefox in Windows. In Linux, the pdf reader popped up behind the browser window so the browser tab stayed blank and Firefox continued to work well in other tabs I was using. By the time I noticed the pdf window behind the browser window the contents were already there (maybe you didn't notice a pdf window behind the broswer window). In windows, clicking the link froze the whole Firefox (all tabs) on a blank tab until the whole file was downloaded then it embedded a pdf viewer in place of the blank tab and all the other tabs unfroze. I guess the pdf viewer is integrated with Firefox differently on my two systems. Neither behavior is great. If I knew in advance this pdf was difficult I would have used the right click/save method.

Last edited by johnsfine; 10-02-2009 at 01:13 PM.
 
Old 10-02-2009, 01:52 PM   #51
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
i got it to assemble, compile & link into a reguler .com file in the tiny model but still
garbadge where its suppose to be a string
 
Old 10-02-2009, 01:57 PM   #52
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
the PDF file is huge! its 17 megabytes
anyway i think firefox is crabby right now
 
Old 10-02-2009, 02:17 PM   #53
johnsfine
Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,044

Rep: Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100
Quote:
Originally Posted by smeezekitty View Post
i got it to assemble, compile & link into a reguler .com file in the tiny model but still
garbadge where its suppose to be a string
In post #15 you had a disassembly of the whole thing. There are some parts of that which I would want to look at the cumulative changes from everything you've done so far. You could post the key parts or the whole thing, whichever is more convenient for you.

The startup code at offset 0300 is importantant. Yesterday you needed to disassemble that seperately, because the main disassembly had it as data.

That include the jmp to _main, which yesterday was loc_EBF

The code it jumps to is also important. Yesterday loc_EBF wasn't labeled but was disassembled as
Code:
		push	bp
		mov	bp, sp
		sub	sp, 2
		push	si
		push	di
		mov	al, ds:byte_C60
		mov	[bp-2],	al
...
Somewhere soon after that, I'd expect to see the code that does the broken reference to the data, but in Yesterday's version I don't see that.

The first function in the disassembly yesterday (sub_309) had a data reference (word_C5A) that could be checked against the disassembly near location C5A to see that the code was not correctly linked for tiny memory model. Anything similar to that (both reference and vicinity of referenced location) should be enough now to see if the code is compiled and linked correctly for tiny model.

Last edited by johnsfine; 10-02-2009 at 02:23 PM.
 
Old 10-02-2009, 02:32 PM   #54
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
one was the disassembly one was the hand written
call.asm:
Code:
   .MODEL TINY
       .CODE
           .DATA
               .DATA?
                   DGROUP GROUP _TEXT,_DATA,_BSS
                       .CODE
                           extrn _main:far
                           START:
                           mov si,ax
                           mov ax,cs
                           mov ss,ax
                           mov ds,ax
                               assume ds:DGROUP
                               mov DGROUP@,ax
                               mov ax,si
                               jmp _main
                                   PUBLIC DGROUP@
                                   DGROUP@ dw 0
                                   END START
compile.bat:
Code:
nasm16 -f bin -o bnl.bin boot.asm
tcc -mt -c nodos
tlink /t /n /m call+nodos, kernel.ker
copy /b bnl.bin+kernel.ker kernel.out
copy kernel.ker dbg.com
boot.asm:
Code:
;
;   Boot-n-Load
;
;   Bootable floppy.  BIOS loads one sector, executes it.  The
;   executable loads the next level of code.
;
;   To build & use (DOS Batch file):
;
;;  ;;            NASM16 -f bin -o bnl1.bin -l bnl1.lst bnl1.asm
;;  ;;            NASM16 -f bin -o bnl2.bin -l bnl2.lst bnl2.asm
;;  ;;            copy  /b bnl1.bin+bnl2.bin bnl.bin
;;  ;;            rawrite2 -f bnl.bin -d A -n
;
LEVEL2_SEG      equ     0x9000
LEVEL2_OFF      equ     0x0100;0x0000

[BITS 16]
[ORG 0]

BnL_start:
;
;   We know the absolute address, but some BIOSes use different
;   SEG:OFF combos.  This makes sure we are using offsets that agree
;   with our ORG statement
;
    jmp     0x07c0:BnL_Go


BnL_HelloMsg:
    db      'BnL ver 0.1',0x0d,0x0a,0

BnL_Go:
    mov     ax, cs
    mov     es, ax
    mov     ds, ax
;
;   Set up a stack
;
    cli
    mov     sp, 0xffff
    mov     ax, LEVEL2_SEG
    mov     ss, ax
    sti

    mov     si, BnL_HelloMsg    ; Print msg
BnL_SayHello:
    lodsb                       ; AL=memory contents at DS:SI

    cmp     al, 0               ; If AL=0 then done talking
    je      BnL_ResetDisk       ; go on to next step

    mov     ah, 0x0E            ; Print AL
    mov     bx, 7               ; text attribute/colour
    int     10h                 ; BIOS Print Char

    jmp     BnL_SayHello        ; Print next character

;
;   Load the next piece of code from sector 2, 3...
;

BnL_ResetDisk:

    mov     ax, 0
    int     0x13            ;
    jc      BnL_ResetDisk

BnL_Reload:
    mov     ax, LEVEL2_SEG
    mov     es, ax          ; SEgment address for destination
    mov     ah, 02          ; BIOS Int 13h func: Read disk
    mov     al, 9           ; sector count
    mov     bx, LEVEL2_OFF  ; Address OFFSET for destination (ES:BX --> dest)
    mov     ch, 0           ; Disk cylinder
    mov     cl, 2           ; Sector (numbered from 1)
    mov     dh, 0           ; Head
    mov     dl, 0           ; Drive

    int     0x13
    jc      BnL_Reload


    jmp     LEVEL2_SEG:LEVEL2_OFF

TIMES 510-($-$$) db 0x90
    dw      0AA55h

;
;=========================================================================
;   The following code is loaded from disk sector(s) following
;   the sector 1 code loaded and invoked by the BIOS.
;   We jump to this code from the bootstrap loader above.
;
;
;    mov     ax, cs
;    mov     es, ax
;    mov     ds, ax
;
;    mov     si, BnL2_HelloMsg
;BnL2_SayHello:
;    lodsb                       ; AL=memory contents at DS:SI
;
;    cmp     al, 0               ; If AL=0 then done talking
;    je      BnL2_Go             ; go on to next step
;
;    mov     ah, 0x0E            ; Print AL
;    mov     bx, 7               ; text attribute/colour
;    int     10h                 ; BIOS Print Char
;
;    jmp     BnL2_SayHello       ; Print next character
;
;
;BnL2_Go:
;    jmp     $
;
;BnL2_HelloMsg:
;    db      'Now using level2 code', 0
;
;times 1022-($-$$) db 0xff
;dw 0AA55h
part of nodos.cpp:
Code:
int far main(){
tickz=0;
//old_clock=(void interrupt (*)(...))MK_FP(FP_SEG(getvector(0x1C)), FP_OFF(getvector(0x1C)));
//setvector(0x1C, (unsigned long)(char far *)MK_FP(FP_SEG(clock_hook), FP_OFF(clock_hook)));
char mew[1] = {234};
_video_putchar('H');
_video_putchar('e');
_video_putchar('l');
_video_putchar('l');
_video_putchar('o');
_video_putchar(' ');
//timer(3000);
_video_putchar('w');
_video_putchar('o');
_video_putchar('r');
_video_putchar('l');
_video_putchar('d');
_video_putchar('!');
_video_putchar('\n');
//_DS += 0x306;
kernel_print("Hey!");
}
more parts of nodos.cpp:
Code:
unsigned char read_keyboard(){
int al;
_AH = 0;
asm {int 16h}
al=_AL;
return al;
}
void _video_putchar(char c){
_AH = 0xE;
_AL = c;
_BL = 0xF;
asm {int 10h}
}
note: i changed it to .cpp file extension but its still C
 
Old 10-02-2009, 03:05 PM   #55
johnsfine
Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,044

Rep: Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100
Those bits of source code are interesting, but I don't know what your tool chain is turning them into. So I wanted to see the disassembly of certain parts.

For example, you have the two line
extrn _main:far
and
jmp _main

I can't imagine how the tool chain could turn that into something correct. Yesterday you showed what should have been the disassembly of that and it was
Code:
seg000:0306                 jmp     loc_EBF
but that is not a far jmp.

At my suggestion, you added the line
mov DGROUP@,ax
After compiling and linking that instruction may indicate whether the tiny memory model and offset of 0x100 have been dealt with correctly by your build process. But I need to see the disassembly for that.

Similarly, I would like to see the disassembly of
kernel_print("Hey!");

All dissasemblies of course should be from the final output of the build process, the kernel.out file that you actually test on diskette.
 
Old 10-02-2009, 03:13 PM   #56
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
Code:
seg000:0DC4 loc_DC4:                                ; CODE XREF: start+10j
seg000:0DC4                 push    bp
seg000:0DC5                 mov     bp, sp
seg000:0DC7                 sub     sp, 2
seg000:0DCA                 mov     word ptr loc_991, 0
seg000:0DD0                 mov     word ptr loc_98E+1, 0
seg000:0DD6                 mov     al, byte ptr loc_D4D+1
seg000:0DD9                 mov     [bp-2], al
seg000:0DDC                 mov     al, 48h
seg000:0DDE                 push    ax
seg000:0DDF                 call    sub_231
seg000:0DE2                 pop     cx
seg000:0DE3                 mov     al, 65h
seg000:0DE5                 push    ax
seg000:0DE6                 call    sub_231
seg000:0DE9                 pop     cx
seg000:0DEA                 mov     al, 6Ch
seg000:0DEC                 push    ax
seg000:0DED                 call    sub_231
seg000:0DF0                 pop     cx
seg000:0DF1                 mov     al, 6Ch
seg000:0DF3                 push    ax
seg000:0DF4                 call    sub_231
seg000:0DF7                 pop     cx
seg000:0DF8                 mov     al, 6Fh
seg000:0DFA                 push    ax
seg000:0DFB                 call    sub_231
seg000:0DFE                 pop     cx
seg000:0DFF                 mov     al, 20h
seg000:0E01                 push    ax
seg000:0E02                 call    sub_231
seg000:0E05                 pop     cx
seg000:0E06                 mov     al, 77h
seg000:0E08                 push    ax
seg000:0E09                 call    sub_231
seg000:0E0C                 pop     cx
seg000:0E0D                 mov     al, 6Fh
seg000:0E0F                 push    ax
seg000:0E0F ; END OF FUNCTION CHUNK FOR start
seg000:0E10
seg000:0E10 loc_E10:                                ; DATA XREF: seg000:loc_DA6r
seg000:0E10                 call    sub_231
seg000:0E13                 pop     cx
seg000:0E14                 mov     al, 72h
seg000:0E16                 push    ax
seg000:0E17                 call    sub_231
seg000:0E1A                 pop     cx
seg000:0E1B                 mov     al, 6Ch
seg000:0E1D                 push    ax
seg000:0E1E                 call    sub_231
seg000:0E21                 pop     cx
seg000:0E22                 mov     al, 64h         ; DATA XREF: start+Bw
seg000:0E24                 push    ax
seg000:0E25                 call    sub_231
seg000:0E28                 pop     cx
seg000:0E29                 mov     al, 21h
seg000:0E2B                 push    ax
seg000:0E2C                 call    sub_231
seg000:0E2F                 pop     cx
seg000:0E30                 mov     al, 0Ah
seg000:0E32                 push    ax
seg000:0E33                 call    sub_231
seg000:0E36                 pop     cx
seg000:0E37                 mov     ax, 0D69h
seg000:0E3A                 push    ax
seg000:0E3B                 call    sub_261
seg000:0E3E                 pop     cx
seg000:0E3F                 hlt
seg000:0E40                 mov     sp, bp
seg000:0E42                 pop     bp
seg000:0E43                 retf
seg000:0E43 ; ---------------------------------------------------------------------------
seg000:0E44                 db    0
seg000:0E45                 db    0
seg000:0E46                 db    0
seg000:0E47                 db    0
seg000:0E48                 db    0
seg000:0E49                 db    0
seg000:0E4A                 db    0
seg000:0E4B                 db    0
seg000:0E4C                 db  0Eh
seg000:0E4D                 db    0
seg000:0E4E                 db 0EAh ; O
seg000:0E4F                 db  25h ; %
seg000:0E50                 db  73h ; s
seg000:0E51                 db  20h
seg000:0E52                 db  5Bh ; [
seg000:0E53                 db  25h ; %
seg000:0E54                 db  64h ; d
seg000:0E55                 db  5Dh ; ]
seg000:0E56                 db  2Dh ; -
seg000:0E57                 db    0
seg000:0E58                 db  77h ; w
seg000:0E59                 db  2Bh ; +
seg000:0E5A                 db    0
seg000:0E5B                 db  77h ; w
seg000:0E5C                 db    0
seg000:0E5D                 db  72h ; r
seg000:0E5E                 db    0
seg000:0E5F                 db  61h ; a
seg000:0E60                 db    0
seg000:0E61                 db  70h ; p
seg000:0E62                 db  61h ; a
seg000:0E63                 db  6Eh ; n
seg000:0E64                 db  69h ; i
seg000:0E65                 db  63h ; c
seg000:0E66                 db  3Ah ; :
seg000:0E67                 db  3Ah ; :
seg000:0E68                 db    0
seg000:0E69                 db  48h ; H
seg000:0E6A                 db  65h ; e
seg000:0E6B                 db  79h ; y
seg000:0E6C                 db  21h ; !
seg000:0E6D                 db    0
seg000:0E6D seg000          ends
seg000:0E6D
seg000:0E6D
seg000:0E6D                 end start
and the start call
Code:
                .model tiny
seg000:0100
seg000:0100 ; ---------------------------------------------------------------------------
seg000:0100
seg000:0100 ; Segment type: Pure code
seg000:0100 seg000          segment byte public 'CODE' use16
seg000:0100                 assume cs:seg000
seg000:0100                 org 100h
seg000:0100                 assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing
seg000:0100
seg000:0100 ;  S U B R O U T I N E 
seg000:0100
seg000:0100
seg000:0100                 public start
seg000:0100 start           proc near
seg000:0100
seg000:0100 ; FUNCTION CHUNK AT seg000:0DC4 SIZE 0000004C BYTES
seg000:0100
seg000:0100                 mov     si, ax
seg000:0102                 mov     ax, cs
seg000:0104                 add     ax, 0E1h
seg000:0107                 mov     ss, ax
seg000:0109                 assume ss:nothing
seg000:0109                 mov     ds, ax
seg000:010B                 assume ds:nothing
seg000:010B                 mov     ds:13h, ax
seg000:010E                 mov     ax, si
seg000:0110                 jmp     loc_DC4
seg000:0110 start           endp
seg000:0110
seg000:0110 ; ---------------------------------------------------------------------------
seg000:0113                 db    0
seg000:0114                 db    0
any other info you need just ask
 
Old 10-02-2009, 03:22 PM   #57
johnsfine
Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,044

Rep: Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100
Notice the line
Code:
seg000:010B                 mov     ds:13h, ax
Notice that it is 13h, but should have been 113h. That tells me the offset of 0x100 that seems to be implicit in the way you load and run this code is not taken into account by the way you link the code.

I also see that you are disassembling this section at offset 0100, but in your kernel.out file it should have been at offset 0300.

We see the same off by 0x100 error in the line
Code:
seg000:0E37                 mov     ax, 0D69h
The actual data is at 0E69h

If the tool chain isn't applying the 0x100 offset, maybe the cleanest approach is to change the boot code to not introduce that offset, which I think would be accomplished by changing LEVEL2_OFF back to 0000. That would mean the code can no longer be debugged as a .com, but I'm not sure that will matter for long.

If you want to keep LEVEL2_OFF equal to 0x100 and adjust the code to work right in a debugger as a .com file, I'm not certain of the rules in tasm, but I think adding the line
org 0100h
right before START: might fix it.

Also, I see the jmp at seg000:0110 is a correct near jmp even though you declared it far. I don't know why tasm and/or tlink fixes that apparent error in the source code, but I guess that bit works no matter how wrong it looks to me.

Last edited by johnsfine; 10-02-2009 at 04:00 PM.
 
Old 10-02-2009, 03:31 PM   #58
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
but the question is is how do you fix the offset
 
Old 10-02-2009, 03:37 PM   #59
johnsfine
Guru
 
Registered: Dec 2007
Distribution: Centos
Posts: 5,044

Rep: Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100Reputation: 1100
Quote:
Originally Posted by smeezekitty View Post
but the question is is how do you fix the offset
Reread my post. I think you read it while I was editing it (I often press Submit Reply on a half written post and then finish it with Edit. Maybe that's a bad habit, but it's what I'm used to.)
 
Old 10-02-2009, 03:43 PM   #60
smeezekitty
Senior Member
 
Registered: Sep 2009
Location: Washington U.S.
Distribution: M$ Windows / Debian / Ubuntu / DSL / many others
Posts: 2,220

Original Poster
Rep: Reputation: 164Reputation: 164
mmmmmmm fresh baked disassembly
Code:
seg000:0E3C ;  S U B R O U T I N E 
seg000:0E3C
seg000:0E3C ; Attributes: bp-based frame
seg000:0E3C
seg000:0E3C sub_70E3C       proc near               ; CODE XREF: seg000:0E71p
seg000:0E3C                                         ; sub_70E8C+37p
seg000:0E3C
seg000:0E3C arg_0           = word ptr  4
seg000:0E3C
seg000:0E3C                 push    bp
seg000:0E3D                 mov     bp, sp
seg000:0E3F                 push    si
seg000:0E40                 push    di
seg000:0E41                 mov     di, [bp+arg_0]
seg000:0E44                 push    di
seg000:0E45                 call    sub_70B73
seg000:0E48                 pop     cx
seg000:0E49                 xor     si, si
seg000:0E4B                 jmp     short loc_70E5A
seg000:0E4D ; ---------------------------------------------------------------------------
seg000:0E4D
seg000:0E4D loc_70E4D:                              ; CODE XREF: sub_70E3C+22j
seg000:0E4D                 mov     bx, [di+5]
seg000:0E50                 cmp     byte ptr [bx+si], 0FFh
seg000:0E53                 jnz     short loc_70E59
seg000:0E55                 mov     ax, si
seg000:0E57
seg000:0E57 loc_70E57:                              ; CODE XREF: sub_70E3C+27j
seg000:0E57                 jmp     short loc_70E65
seg000:0E59 ; ---------------------------------------------------------------------------
seg000:0E59
seg000:0E59 loc_70E59:                              ; CODE XREF: sub_70E3C+17j
seg000:0E59                 inc     si
seg000:0E5A
seg000:0E5A loc_70E5A:                              ; CODE XREF: sub_70E3C+Fj
seg000:0E5A                 cmp     si, 200h
seg000:0E5E                 jl      short loc_70E4D
seg000:0E60                 mov     ax, 200h
seg000:0E63                 jmp     short loc_70E57
seg000:0E65 ; ---------------------------------------------------------------------------
seg000:0E65
seg000:0E65 loc_70E65:                              ; CODE XREF: sub_70E3C:loc_70E57j
seg000:0E65                 pop     di
seg000:0E66                 pop     si
seg000:0E67                 pop     bp
seg000:0E68                 retn
seg000:0E68 sub_70E3C       endp
seg000:0E68
seg000:0E69 ; ---------------------------------------------------------------------------
seg000:0E69                 push    bp
seg000:0E6A                 mov     bp, sp
seg000:0E6C                 push    si
seg000:0E6D                 mov     si, [bp+4]
seg000:0E70                 push    si
seg000:0E71                 call    sub_70E3C
seg000:0E74                 pop     cx
seg000:0E75                 mov     dx, [si+3]
seg000:0E78                 and     dx, 3FFh
seg000:0E7C                 cmp     ax, dx
seg000:0E7E                 jnb     short loc_70E85
seg000:0E80                 mov     ax, 1
seg000:0E83
seg000:0E83 loc_70E83:                              ; CODE XREF: seg000:0E87j
seg000:0E83                 jmp     short loc_70E89
seg000:0E85 ; ---------------------------------------------------------------------------
seg000:0E85
seg000:0E85 loc_70E85:                              ; CODE XREF: seg000:0E7Ej
seg000:0E85                 xor     ax, ax
seg000:0E87                 jmp     short loc_70E83
seg000:0E89 ; ---------------------------------------------------------------------------
seg000:0E89
seg000:0E89 loc_70E89:                              ; CODE XREF: seg000:loc_70E83j
seg000:0E89                 pop     si
seg000:0E8A                 pop     bp
seg000:0E8B                 retn
seg000:0E8C
seg000:0E8C ;  S U B R O U T I N E 
seg000:0E8C
seg000:0E8C ; Attributes: bp-based frame
seg000:0E8C
seg000:0E8C sub_70E8C       proc near               ; CODE XREF: seg000:0F2Cp
seg000:0E8C
seg000:0E8C arg_0           = word ptr  4
seg000:0E8C arg_2           = word ptr  6
seg000:0E8C arg_4           = byte ptr  8
seg000:0E8C
seg000:0E8C                 push    bp
seg000:0E8D                 mov     bp, sp
seg000:0E8F                 push    si
seg000:0E90                 push    di
seg000:0E91                 mov     si, [bp+arg_0]
seg000:0E94                 mov     di, [bp+arg_2]
seg000:0E97                 mov     al, [bp+arg_4]
seg000:0E9A                 cbw
seg000:0E9B                 or      ax, ax
seg000:0E9D                 jz      short loc_70EAB
seg000:0E9F                 cmp     ax, 1
seg000:0EA2                 jz      short loc_70EBA
seg000:0EA4                 cmp     ax, 2
seg000:0EA7                 jz      short loc_70EC2
seg000:0EA9                 jmp     short loc_70ECB
seg000:0EAB ; ---------------------------------------------------------------------------
seg000:0EAB
seg000:0EAB loc_70EAB:                              ; CODE XREF: sub_70E8C+11j
seg000:0EAB                 mov     ax, di
seg000:0EAD
seg000:0EAD loc_70EAD:                              ; CODE XREF: sub_70E8C+3Dj
seg000:0EAD                 and     ax, 3FFh
seg000:0EB0                 and     word ptr [si+3], 0FC00h
seg000:0EB5                 or      [si+3], ax
seg000:0EB8                 jmp     short loc_70ECD
seg000:0EBA ; ---------------------------------------------------------------------------
seg000:0EBA
seg000:0EBA loc_70EBA:                              ; CODE XREF: sub_70E8C+16j
seg000:0EBA                 mov     ax, [si+3]
seg000:0EBD                 and     ax, 3FFh
seg000:0EC0                 jmp     short loc_70EC7
seg000:0EC2 ; ---------------------------------------------------------------------------
seg000:0EC2
seg000:0EC2 loc_70EC2:                              ; CODE XREF: sub_70E8C+1Bj
seg000:0EC2                 push    si
seg000:0EC3                 call    sub_70E3C
seg000:0EC6                 pop     cx
seg000:0EC7
seg000:0EC7 loc_70EC7:                              ; CODE XREF: sub_70E8C+34j
seg000:0EC7                 add     ax, di
seg000:0EC9                 jmp     short loc_70EAD
seg000:0ECB ; ---------------------------------------------------------------------------
seg000:0ECB
seg000:0ECB loc_70ECB:                              ; CODE XREF: sub_70E8C+1Dj
seg000:0ECB                 jmp     short $+2
seg000:0ECD
seg000:0ECD loc_70ECD:                              ; CODE XREF: sub_70E8C+2Cj
seg000:0ECD                 pop     di
seg000:0ECE                 pop     si
seg000:0ECF                 pop     bp
seg000:0ED0                 retn
seg000:0ED0 sub_70E8C       endp
seg000:0ED0
seg000:0ED1 ; ---------------------------------------------------------------------------
seg000:0ED1                 push    bp
seg000:0ED2                 mov     bp, sp
seg000:0ED4                 push    si
seg000:0ED5                 mov     si, [bp+4]
seg000:0ED8                 mov     ax, [si+3]
seg000:0EDB                 and     ax, 3FFh
seg000:0EDE                 jmp     short $+2
seg000:0EE0                 pop     si
seg000:0EE1                 pop     bp
seg000:0EE2                 retn
seg000:0EE3 ; ---------------------------------------------------------------------------
seg000:0EE3                 push    bp
seg000:0EE4                 mov     bp, sp
seg000:0EE6                 mov     ax, 0D61h
seg000:0EE9                 push    ax
seg000:0EEA                 call    sub_70461
seg000:0EED                 pop     cx
seg000:0EEE                 push    word ptr [bp+4]
seg000:0EF1                 call    sub_70461
seg000:0EF4                 pop     cx
seg000:0EF5                 pop     bp
seg000:0EF6                 retn
seg000:0EF7 ; ---------------------------------------------------------------------------
seg000:0EF7                 push    bp
seg000:0EF8                 mov     bp, sp
seg000:0EFA                 sub     sp, 8
seg000:0EFD                 push    si
seg000:0EFE                 mov     si, [bp+0Ah]
seg000:0F01                 mov     ax, [bp+6]
seg000:0F04                 imul    word ptr [bp+8]
seg000:0F07                 cwd
seg000:0F08                 mov     [bp-2], dx
seg000:0F0B                 mov     [bp-4], ax
seg000:0F0E                 mov     al, [si]
seg000:0F10                 and     ax, 3
seg000:0F13                 cmp     ax, 2
seg000:0F16                 jnz     short loc_70F1A
seg000:0F18                 jmp     short loc_70F8C
seg000:0F1A ; ---------------------------------------------------------------------------
seg000:0F1A
seg000:0F1A loc_70F1A:                              ; CODE XREF: seg000:0F16j
seg000:0F1A                 mov     al, [si]
seg000:0F1C                 and     ax, 3
seg000:0F1F                 cmp     ax, 3
seg000:0F22                 jnz     short loc_70F32
seg000:0F24                 mov     al, [bp-4]
seg000:0F27                 push    ax
seg000:0F28                 xor     ax, ax
seg000:0F2A                 push    ax
seg000:0F2B                 push    si
seg000:0F2C                 call    sub_70E8C
seg000:0F2F                 add     sp, 6
seg000:0F32
seg000:0F32 loc_70F32:                              ; CODE XREF: seg000:0F22j
seg000:0F32                 mov     word ptr [bp-6], 0
seg000:0F37                 mov     word ptr [bp-8], 0
seg000:0F3C                 jmp     short loc_70F55
seg000:0F3E ; ---------------------------------------------------------------------------
seg000:0F3E
seg000:0F3E loc_70F3E:                              ; CODE XREF: seg000:0F5Ej
seg000:0F3E                                         ; seg000:0F65j
seg000:0F3E                 mov     bx, [bp+4]
seg000:0F41                 add     bx, [bp-8]
seg000:0F44                 mov     al, [bx]
seg000:0F46                 push    ax
seg000:0F47                 push    si
seg000:0F48                 call    sub_70CE3
seg000:0F4B                 pop     cx
seg000:0F4C                 pop     cx
seg000:0F4D                 add     word ptr [bp-8], 1
seg000:0F51                 adc     word ptr [bp-6], 0
seg000:0F55
seg000:0F55 loc_70F55:                              ; CODE XREF: seg000:0F3Cj
seg000:0F55                 mov     ax, [bp-6]
seg000:0F58                 mov     dx, [bp-8]
seg000:0F5B                 cmp     ax, [bp-2]
seg000:0F5E                 jl      short loc_70F3E
seg000:0F60                 jnz     short loc_70F67
seg000:0F62                 cmp     dx, [bp-4]
seg000:0F65                 jb      short loc_70F3E
seg000:0F67
seg000:0F67 loc_70F67:                              ; CODE XREF: seg000:0F60j
seg000:0F67                 mov     ax, [si+3]
seg000:0F6A                 and     ax, 3FFh
seg000:0F6D                 mov     bx, [si+5]
seg000:0F70                 add     bx, ax
seg000:0F72                 mov     byte ptr [bx], 0FFh
seg000:0F75                 push    word ptr [si+5]
seg000:0F78                 mov     ax, [si+1]
seg000:0F7B                 and     ax, 7FFFh
seg000:0F7E                 push    ax
seg000:0F7F                 mov     ax, 1
seg000:0F82                 push    ax
seg000:0F83                 xor     ax, ax
seg000:0F85                 push    ax
seg000:0F86                 call    sub_707BB
seg000:0F89                 add     sp, 8
seg000:0F8C
seg000:0F8C loc_70F8C:                              ; CODE XREF: seg000:0F18j
seg000:0F8C                 pop     si
seg000:0F8D                 mov     sp, bp
seg000:0F8F                 pop     bp
seg000:0F90                 retn
seg000:0F91 ; ---------------------------------------------------------------------------
seg000:0F91                 push    bp
seg000:0F92                 mov     bp, sp
seg000:0F94                 sub     sp, 4
seg000:0F97                 push    di
seg000:0F98                 mov     ax, cs
seg000:0F9A                 mov     [bp-2], ax
seg000:0F9D                 xor     di, di
seg000:0F9F                 mov     word ptr [bp-4], 0
seg000:0FA4                 jmp     short loc_70FB9
seg000:0FA6 ; ---------------------------------------------------------------------------
seg000:0FA6
seg000:0FA6 loc_70FA6:                              ; CODE XREF: seg000:0FBDj
seg000:0FA6                 cmp     byte ptr ds:0, 0EAh
seg000:0FAB                 jnz     short loc_70FB6
seg000:0FAD                 mov     ax, [bp-4]
seg000:0FB0                 mov     ds, ax
seg000:0FB2                 mov     bp, ax
seg000:0FB4                 jmp     short loc_70FBF
seg000:0FB6 ; ---------------------------------------------------------------------------
seg000:0FB6
seg000:0FB6 loc_70FB6:                              ; CODE XREF: seg000:0FABj
seg000:0FB6                 inc     word ptr [bp-4]
seg000:0FB9
seg000:0FB9 loc_70FB9:                              ; CODE XREF: seg000:0FA4j
seg000:0FB9                 cmp     word ptr [bp-4], 0FFFFh
seg000:0FBD                 jb      short loc_70FA6
seg000:0FBF
seg000:0FBF loc_70FBF:                              ; CODE XREF: seg000:0FB4j
seg000:0FBF                 pop     di
seg000:0FC0                 mov     sp, bp
seg000:0FC2                 pop     bp
seg000:0FC3                 retn
seg000:0FC4 ; ---------------------------------------------------------------------------
seg000:0FC4
seg000:0FC4 loc_70FC4:                              ; CODE XREF: seg000:0310j
seg000:0FC4                 push    bp
seg000:0FC5                 mov     bp, sp
seg000:0FC7                 sub     sp, 2
seg000:0FCA                 mov     word_70991, 0
seg000:0FD0                 mov     word_7098F, 0
seg000:0FD6                 mov     al, byte_70D4E
seg000:0FD9                 mov     [bp-2], al
seg000:0FDC                 mov     al, 48h
seg000:0FDE                 push    ax
seg000:0FDF                 call    sub_70431
seg000:0FE2                 pop     cx
seg000:0FE3                 mov     al, 65h
seg000:0FE5                 push    ax
seg000:0FE6                 call    sub_70431
seg000:0FE9                 pop     cx
seg000:0FEA                 mov     al, 6Ch
seg000:0FEC                 push    ax
seg000:0FED                 call    sub_70431
seg000:0FF0                 pop     cx
seg000:0FF1                 mov     al, 6Ch
seg000:0FF3                 push    ax
seg000:0FF4                 call    sub_70431
seg000:0FF7                 pop     cx
seg000:0FF8                 mov     al, 6Fh
seg000:0FFA                 push    ax
seg000:0FFB                 call    sub_70431
seg000:0FFE                 pop     cx
seg000:0FFF                 mov     al, 20h
seg000:1001                 push    ax
seg000:1002                 call    sub_70431
seg000:1005                 pop     cx
seg000:1006                 mov     al, 77h
seg000:1008                 push    ax
seg000:1009                 call    sub_70431
seg000:100C                 pop     cx
seg000:100D                 mov     al, 6Fh
seg000:100F                 push    ax
seg000:1010                 call    sub_70431
seg000:1013                 pop     cx
seg000:1014                 mov     al, 72h
seg000:1016                 push    ax
seg000:1017                 call    sub_70431
seg000:101A                 pop     cx
seg000:101B                 mov     al, 6Ch
seg000:101D                 push    ax
seg000:101E                 call    sub_70431
seg000:1021                 pop     cx
seg000:1022                 mov     al, 64h
seg000:1024                 push    ax
seg000:1025                 call    sub_70431
seg000:1028                 pop     cx
seg000:1029                 mov     al, 21h
seg000:102B                 push    ax
seg000:102C                 call    sub_70431
seg000:102F                 pop     cx
seg000:1030                 mov     al, 0Ah
seg000:1032                 push    ax
seg000:1033                 call    sub_70431
seg000:1036                 pop     cx
seg000:1037                 mov     ax, 0D69h
seg000:103A                 push    ax
seg000:103B                 call    sub_70461
seg000:103E                 pop     cx
seg000:103F                 hlt
seg000:1040                 mov     sp, bp
seg000:1042                 pop     bp
seg000:1043                 retf
seg000:1043 ; ---------------------------------------------------------------------------
seg000:1044                 db    0
seg000:1045                 db    0
seg000:1046                 db    0
seg000:1047                 db    0
seg000:1048                 db    0
seg000:1049                 db    0
seg000:104A                 db    0
seg000:104B                 db    0
seg000:104C                 db  0Eh
seg000:104D                 db    0
seg000:104E                 db 0EAh ; O
seg000:104F                 db  25h ; %
seg000:1050                 db  73h ; s
seg000:1051                 db  20h
seg000:1052                 db  5Bh ; [
seg000:1053                 db  25h ; %
seg000:1054                 db  64h ; d
seg000:1055                 db  5Dh ; ]
seg000:1056                 db  2Dh ; -
seg000:1057                 db    0
seg000:1058                 db  77h ; w
seg000:1059                 db  2Bh ; +
seg000:105A                 db    0
seg000:105B                 db  77h ; w
seg000:105C                 db    0
seg000:105D                 db  72h ; r
seg000:105E                 db    0
seg000:105F                 db  61h ; a
seg000:1060                 db    0
seg000:1061                 db  70h ; p
seg000:1062                 db  61h ; a
seg000:1063                 db  6Eh ; n
seg000:1064                 db  69h ; i
seg000:1065                 db  63h ; c
seg000:1066                 db  3Ah ; :
seg000:1067                 db  3Ah ; :
seg000:1068                 db    0
seg000:1069                 db  48h ; H
seg000:106A                 db  65h ; e
seg000:106B                 db  79h ; y
seg000:106C                 db  21h ; !
seg000:106D                 db    0
seg000:106D seg000          ends
seg000:106D
seg000:106D
seg000:106D                 end start
and
Code:
;
seg000:0100 ; +-------------------------------------------------------------------------+
seg000:0100 ;      This file is generated by The Interactive Disassembler (IDA)        
seg000:0100 ;      Copyright (c) 2006 by DataRescue sa/nv, <ida@datarescue.com>        
seg000:0100 ;                       Licensed to: Freeware version                      
seg000:0100 ; +-------------------------------------------------------------------------+
seg000:0100 ;
seg000:0100 ; File Name   : C:\tc\TCC\kernel (2).com
seg000:0100 ; Format      : MS-DOS COM-file
seg000:0100 ; Base Address: 7000h Range: 70100h-7106Eh Loaded length: F6Eh
seg000:0100
seg000:0100                 .686p
seg000:0100                 .mmx
seg000:0100                 .model tiny
seg000:0100
seg000:0100 ; ---------------------------------------------------------------------------
seg000:0100
seg000:0100 ; Segment type: Pure code
seg000:0100 seg000          segment byte public 'CODE' use16
seg000:0100                 assume cs:seg000
seg000:0100                 org 100h
seg000:0100                 assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing
seg000:0100
seg000:0100 ;  S U B R O U T I N E 
seg000:0100
seg000:0100
seg000:0100                 public start
seg000:0100 start           proc near
seg000:0100                 jmp     far ptr 7C0h:13h
seg000:0100 start           endp
seg000:0100
seg000:0100 ; ---------------------------------------------------------------------------
seg000:0105                 db  42h ; B
seg000:0106                 db  6Eh ; n
seg000:0107                 db  4Ch ; L
seg000:0108                 db  20h
seg000:0109                 db  76h ; v
seg000:010A                 db  65h ; e
seg000:010B                 db  72h ; r
seg000:010C                 db  20h
seg000:010D                 db  30h ; 0
seg000:010E                 db  2Eh ; .
seg000:010F                 db  31h ; 1
seg000:0110                 db  0Dh
seg000:0111                 db  0Ah
seg000:0112                 db    0
seg000:0113 ; ---------------------------------------------------------------------------
seg000:0113                 mov     ax, cs
seg000:0115                 mov     es, ax
seg000:0117                 assume es:seg000
seg000:0117                 mov     ds, ax
seg000:0119                 cli
seg000:011A                 mov     sp, 0FFFFh
seg000:011D                 mov     ax, 9000h
seg000:0120                 mov     ss, ax
seg000:0122                 assume ss:nothing
seg000:0122                 sti
seg000:0123                 mov     si, 5
seg000:0126
seg000:0126 loc_70126:                              ; CODE XREF: seg000:0132j
seg000:0126                 lodsb
seg000:0127                 cmp     al, 0
seg000:0129                 jz      short loc_70135
seg000:012B                 mov     ah, 0Eh
seg000:012D                 mov     bx, 7
seg000:0130                 int     10h             ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
seg000:0130                                         ; AL = character, BH = display page (alpha modes)
seg000:0130                                         ; BL = foreground color (graphics modes)
seg000:0132                 jmp     loc_70126
seg000:0135 ; ---------------------------------------------------------------------------
seg000:0135
seg000:0135 loc_70135:                              ; CODE XREF: seg000:0129j
seg000:0135                                         ; seg000:013Aj
seg000:0135                 mov     ax, 0
seg000:0138                 int     13h             ; DISK - RESET DISK SYSTEM
seg000:0138                                         ; DL = drive (if bit 7 is set both hard disks and floppy disks reset)
seg000:013A                 jb      short loc_70135
seg000:013C
seg000:013C loc_7013C:                              ; CODE XREF: seg000:0152j
seg000:013C                 mov     ax, 9000h
seg000:013F                 mov     es, ax
seg000:0141                 assume es:nothing
seg000:0141                 mov     ah, 2
seg000:0143                 mov     al, 9
seg000:0145                 mov     bx, 100h
seg000:0148                 mov     ch, 0
seg000:014A                 mov     cl, 2
seg000:014C                 mov     dh, 0
seg000:014E                 mov     dl, 0
seg000:0150                 int     13h             ; DISK - READ SECTORS INTO MEMORY
seg000:0150                                         ; AL = number of sectors to read, CH = track, CL = sector
seg000:0150                                         ; DH = head, DL = drive, ES:BX -> buffer to fill
seg000:0150                                         ; Return: CF set on error, AH = status, AL = number of sectors read
seg000:0152                 jb      short loc_7013C
seg000:0154                 jmp     far ptr 9000h:100h
seg000:0154 ; ---------------------------------------------------------------------------
seg000:0159                 db  90h ; 
seg000:015A                 db  90h ; 
seg000:015B                 db  90h ; 
seg000:015C                 db  90h ; 
seg000:015D                 db  90h ; 
seg000:015E                 db  90h ; 
seg000:015F                 db  90h ; 
seg000:0160                 db  90h ; 
seg000:0161 ; ---------------------------------------------------------------------------
seg000:0161                 nop
seg000:0162                 nop
seg000:0163                 nop
seg000:0164                 nop
seg000:0165                 nop
seg000:0166                 nop
seg000:0167                 nop
seg000:0168                 nop
seg000:0169                 nop
seg000:016A                 nop
seg000:016B                 nop
seg000:016C                 nop
seg000:016D                 nop
seg000:016E                 nop
seg000:016F                 nop
seg000:0170                 nop
seg000:0171                 nop
seg000:0172                 nop
seg000:0173                 nop
seg000:0174                 nop
seg000:0175                 nop
seg000:0176                 nop
seg000:0177                 nop
seg000:0178                 nop
seg000:0179                 nop
seg000:017A                 nop
seg000:017B                 nop
seg000:017C                 nop
seg000:017D                 nop
seg000:017E                 nop
seg000:017F                 nop
<ALL NOP>
seg000:02FE                 push    bp
seg000:02FF                 stosb
seg000:0300                 mov     si, ax
seg000:0302                 mov     ax, cs
seg000:0304                 add     ax, 100h
seg000:0307                 mov     ss, ax
seg000:0309                 assume ss:nothing
seg000:0309                 mov     ds, ax
seg000:030B                 mov     ds:13h, ax
seg000:030E                 mov     ax, si
seg000:0310                 jmp     loc_70FC4
seg000:0310 ; ---------------------------------------------------------------------------
seg000:0313                 nop
seg000:0314                 nop
seg000:0315
seg000:0315 ;  S U B R O U T I N E 
seg000:0315
seg000:0315 ; Attributes: bp-based frame
seg000:0315
seg000:0315 sub_70315       proc near               ; CODE XREF: sub_70ADB+50p
seg000:0315
seg000:0315 var_4           = word ptr -4
seg000:0315 var_2           = word ptr -2
seg000:0315
seg000:0315                 push    bp
seg000:0316                 mov     bp, sp
seg000:0318                 sub     sp, 4
seg000:031B                 push    si
seg000:031C                 mov     ax, word_70D44
seg000:031F                 mov     cl, 0Ah
seg000:0321                 shl     ax, cl
seg000:0323                 mov     si, ax
seg000:0325                 mov     ax, word_70D44
seg000:0328                 mov     bx, 40h
seg000:032B                 cwd
seg000:032C                 idiv    bx
seg000:032E                 test    dx, si
seg000:0330                 jz      short loc_70335
seg000:0332                 add     si, 8
seg000:0335
 
  


Reply

Tags
asm, assembler, boot, data, find, kernel, loader


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
missing/lost data - where is it, how do I find it ????? bigjohn Linux - General 10 10-05-2008 02:34 PM
Reiserfs - how to find which file contains data in a block Vrajgh Linux - Software 8 09-14-2007 03:04 AM
Retrieving semi-formatted data: Kernel Panic (cannot find file or dir /dev/root) majorGrey Linux - General 2 09-05-2007 04:02 AM
Kernel Panic: Resume Machine: Unable to find suspended-data signature ( - mispelled? ToddM Linux - General 1 09-30-2004 10:59 AM
can't find data mcd Linux - Software 1 08-12-2003 12:12 AM


All times are GMT -5. The time now is 07:10 PM.

Main Menu
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration