123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- #if !defined(USE_NASM) && !defined(USE_AS86)
- #define USE_AS86
- #endif
-
- #ifdef USE_AS86
- #define CON(x) *x
- #define BCON(x) *x
- #define WCON(x) *x
- #define LOC(x) x
- #define BLOC(x) byte ptr x
- #define WLOC(x) word ptr x
- #define JMP(x) jmp x
- #define STRDECL(s) .ascii s
- #define SEGCS seg cs
- #define SEGES seg es
- #define ALIGN(x) .align x
- #define SPACE(x) .space x
- #endif
-
- #ifdef USE_NASM
- #define CON(x) x
- #define BCON(x) byte x
- #define WCON(x) word x
- #define LOC(x) [x]
- #define BLOC(x) byte [x]
- #define WLOC(x) word [x]
- #define JMP(x) jmp short x
- #define STRDECL(s) db s
- #define SEGCS cs
- #define SEGES es
- #define ALIGN(x) align x, db 0
- #define SPACE(x) times x db 0
- #endif
-
- ROMLOAD equ 0x5000
-
- start:
- cli
- xor ax, ax
- mov ss, ax
- mov sp, CON(0x7C00)
- mov si, sp
- mov es, ax
- mov ds, ax
- sti
- cld
- mov di, CON(0x600)
- mov cx, CON(0x100)
- rep
- movsw
- db 0xEA
- dw jump
- dw 0
- jump:
- mov si, CON(Hlaska)
- call print
-
- ; rozmery prvniho HD
- mov ah, CON(8)
- mov dl, CON(0x80)
- int 0x13
- jc chyba
- ; dh - H, cx - CS
-
- ; prvi stopa obsahuje bootrom, tak ji natahneme do RAM
- mov ah, CON(2)
- mov al, cl
- and al, CON(0x3F)
- dec al
- mov dx, CON(0x80)
- mov cx, CON(2)
- mov bx, CON(ROMLOAD)
- mov es, bx
- xor bx, bx
- int 0x13
- jc chyba
-
- ; hromada kodu podle zdrojaku netboot
- xor di, di
- mov es, di
- mov di, CON(0x380)
- push di
- mov cx, CON(10)
- cld
- rep
- stosw
- pop di
- #ifdef USE_AS86
- mov word ptr [ di ], CON(0x5a5a)
- mov byte ptr [ di + 2 ], CON(0x50)
- mov word ptr [ di + 0x10 ], CON(0xFFFF)
- mov word ptr [ di + 0x12 ], CON(0xFFFF)
- #endif
- #ifdef USE_NASM
- mov word [ di ], CON(0x5a5a)
- mov byte [ di + 2 ], CON(0x50)
- mov word [ di + 10h ], CON(0xFFFF)
- mov word [ di + 12h ], CON(0xFFFF)
- #endif
-
- ; navratova adresa, kdyby nezabrala ROM
- SEGCS
- mov WLOC(OfsErr), CON(RomErr)
- push cs
- push WCON(chyba)
- mov ax, CON(ROMLOAD)
- mov es, ax
- push es
- ; kouzelny jump....
- SEGES
- mov si, [ 0x1a ]
- SEGES
- #ifdef USE_AS86
- push word ptr [ si + 0x1a ] ; ...do bootrom v RAM
- #endif
- #ifdef USE_NASM
- push word [ si + 0x1a ] ; ...do bootrom v RAM
- #endif
- retf
-
- chyba:
- SEGCS
- mov si, LOC(OfsErr)
- call print
- mov si, CON(CRLF)
- call print
- JMP(chyba)
-
- print:
- lodsb
- cmp al,CON(0)
- je navrat
- push si
- mov bx,CON(7)
- mov ah,CON(0x0E)
- int 0x10
- pop si
- JMP(print)
-
- navrat:
- ret
-
- Hlaska: db 13, 10
- STRDECL('HD Net Loader v1.0 (c) poli 1999')
- db 13, 10, 0
- CRLF: db 13, 10, 0
- OfsErr: dw Error
- Error: STRDECL('Error load from HD !')
- db 0
- RomErr: STRDECL('ROM Error !')
- db 0
-
- mbrend:
- ret
-
- #ifdef USE_AS86
- org 510
- #endif
- #ifdef USE_NASM
- times 510-($-$$) db 0
- #endif
- dw 0xAA55
|