2011-03-30 12:46:40 +00:00
|
|
|
#include "x16.h"
|
|
|
|
#include "mem.h"
|
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
#define RELOC 0x7c00
|
2011-03-30 12:46:40 +00:00
|
|
|
|
|
|
|
TEXT _magic(SB), $0
|
|
|
|
BYTE $0xEB; BYTE $0x3C; /* jmp .+ 0x3C (_start0x3E) */
|
|
|
|
BYTE $0x90 /* nop */
|
|
|
|
TEXT _version(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _sectsize(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _clustsize(SB), $0
|
|
|
|
BYTE $0x00
|
|
|
|
TEXT _nresrv(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _nfats(SB), $0
|
|
|
|
BYTE $0x00
|
|
|
|
TEXT _rootsize(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _volsize(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _mediadesc(SB), $0
|
|
|
|
BYTE $0x00
|
|
|
|
TEXT _fatsize(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _trksize(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _nheads(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _nhiddenlo(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _nhiddenhi(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00;
|
|
|
|
TEXT _bigvolsize(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
|
|
|
|
TEXT _driveno(SB), $0
|
|
|
|
BYTE $0x00
|
|
|
|
TEXT _reserved0(SB), $0
|
|
|
|
BYTE $0x00
|
|
|
|
TEXT _bootsig(SB), $0
|
|
|
|
BYTE $0x00
|
|
|
|
TEXT _volid(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
|
|
|
|
TEXT _label(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00
|
|
|
|
TEXT _type(SB), $0
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
|
|
|
|
BYTE $0x00; BYTE $0x00; BYTE $0x00; BYTE $0x00;
|
|
|
|
|
|
|
|
_start0x3E:
|
|
|
|
CLI
|
|
|
|
CLR(rAX)
|
|
|
|
MTSR(rAX, rSS) /* 0000 -> rSS */
|
|
|
|
MTSR(rAX, rDS) /* 0000 -> rDS, source segment */
|
|
|
|
MTSR(rAX, rES)
|
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
LWI(0x100, rCX)
|
|
|
|
LWI(RELOC, rSI)
|
|
|
|
MW(rSI, rSP)
|
|
|
|
LWI(_magic(SB), rDI)
|
|
|
|
CLD
|
|
|
|
REP; MOVSL /* MOV DS:[(E)SI] -> ES:[(E)DI] */
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
PUSHA
|
|
|
|
MW(rSP, rBP)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
PUSHR(rCX)
|
|
|
|
PUSHI(start16(SB))
|
|
|
|
BYTE $0xCB /* FAR RET */
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT halt(SB), $0
|
|
|
|
_halt:
|
|
|
|
JMP _halt
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT start16(SB), $0
|
|
|
|
STI
|
|
|
|
LWI(hello(SB), rSI)
|
|
|
|
CALL16(print16(SB))
|
|
|
|
LWI(crnl(SB), rSI)
|
|
|
|
CALL16(print16(SB))
|
2011-03-30 12:46:40 +00:00
|
|
|
LW(_volid(SB), rAX) /* Xrootlo */
|
2011-04-11 15:30:05 +00:00
|
|
|
LW(_volid+2(SB), rBX) /* Xroothi */
|
|
|
|
PUSHR(rBP)
|
|
|
|
LW(_sectsize(SB), rCX)
|
|
|
|
SUB(rCX, rSP)
|
|
|
|
MW(rSP, rBP)
|
|
|
|
MW(rSP, rSI)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
_nextsect:
|
|
|
|
PUSHR(rAX)
|
|
|
|
CALL16(readsect16(SB))
|
|
|
|
OR(rAX, rAX)
|
|
|
|
JNE _halt
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
LW(_sectsize(SB), rCX)
|
|
|
|
SHRI(5, rCX)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
_nextdir:
|
|
|
|
PUSHR(rCX)
|
|
|
|
PUSHR(rSI) /* save for later if it matches */
|
|
|
|
LWI(bootname(SB), rDI)
|
|
|
|
LW(bootnamelen(SB), rCX)
|
|
|
|
CLD
|
2011-03-30 12:46:40 +00:00
|
|
|
REP
|
|
|
|
CMPSB
|
2011-04-11 15:30:05 +00:00
|
|
|
POPR(rSI)
|
|
|
|
POPR(rCX)
|
|
|
|
JEQ _found
|
|
|
|
ADDI(0x20, rSI)
|
|
|
|
LOOP _nextdir
|
|
|
|
POPR(rAX)
|
|
|
|
ADDI(1, rAX)
|
|
|
|
ADC(rCX, rBX)
|
|
|
|
JMP _nextsect
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
_found:
|
|
|
|
PUSHR(rDX)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
CLR(rBX)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
|
|
|
LW(_rootsize(SB), rAX) /* calculate and save Xrootsz */
|
2011-04-11 15:30:05 +00:00
|
|
|
LWI(0x20, rCX)
|
2011-03-30 12:46:40 +00:00
|
|
|
MUL(rCX)
|
|
|
|
LW(_sectsize(SB), rCX)
|
|
|
|
PUSHR(rCX)
|
|
|
|
DEC(rCX)
|
|
|
|
ADD(rCX, rAX)
|
|
|
|
ADC(rBX, rDX)
|
|
|
|
POPR(rCX) /* _sectsize(SB) */
|
|
|
|
DIV(rCX)
|
|
|
|
PUSHR(rAX) /* Xrootsz */
|
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
LXW(0x1a, xSI, rAX) /* starting sector address */
|
2011-03-30 12:46:40 +00:00
|
|
|
DEC(rAX) /* that's just the way it is */
|
|
|
|
DEC(rAX)
|
|
|
|
LB(_clustsize(SB), rCL)
|
|
|
|
CLRB(rCH)
|
|
|
|
MUL(rCX)
|
|
|
|
LW(_volid(SB), rCX) /* Xrootlo */
|
|
|
|
ADD(rCX, rAX)
|
|
|
|
LW(_volid+2(SB), rCX) /* Xroothi */
|
|
|
|
ADC(rCX, rDX)
|
|
|
|
POPR(rCX) /* Xrootsz */
|
|
|
|
ADD(rCX, rAX)
|
|
|
|
ADC(rBX, rDX)
|
|
|
|
|
|
|
|
PUSHR(rAX) /* calculate how many sectors to read */
|
|
|
|
PUSHR(rDX)
|
2011-04-11 15:30:05 +00:00
|
|
|
LXW(0x1c, xSI, rAX)
|
|
|
|
LXW(0x1e, xSI, rDX)
|
2011-03-30 12:46:40 +00:00
|
|
|
LW(_sectsize(SB), rCX)
|
|
|
|
PUSHR(rCX)
|
|
|
|
DEC(rCX)
|
|
|
|
ADD(rCX, rAX)
|
|
|
|
ADC(rBX, rDX)
|
|
|
|
POPR(rCX) /* _sectsize(SB) */
|
|
|
|
DIV(rCX)
|
|
|
|
MW(rAX, rCX)
|
2011-04-11 15:30:05 +00:00
|
|
|
POPR(rBX)
|
2011-03-30 12:46:40 +00:00
|
|
|
POPR(rAX)
|
2011-04-11 15:30:05 +00:00
|
|
|
POPR(rDX)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
LWI(RELOC, rSI)
|
|
|
|
PUSHR(rSI)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
_loadnext:
|
|
|
|
PUSHR(rCX)
|
|
|
|
PUSHR(rAX)
|
|
|
|
CALL16(readsect16(SB))
|
|
|
|
OR(rAX, rAX)
|
|
|
|
JNE _loaderror
|
|
|
|
POPR(rAX)
|
|
|
|
CLR(rCX)
|
|
|
|
ADDI(1, rAX)
|
|
|
|
ADC(rCX, rBX)
|
|
|
|
LW(_sectsize(SB), rCX)
|
|
|
|
ADD(rCX, rSI)
|
|
|
|
POPR(rCX)
|
|
|
|
LOOP _loadnext
|
|
|
|
CLI
|
|
|
|
RET
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
_loaderror:
|
|
|
|
LWI(ioerror(SB), rSI)
|
|
|
|
CALL16(print16(SB))
|
|
|
|
CALL16(halt(SB))
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT print16(SB), $0
|
|
|
|
PUSHA
|
|
|
|
CLR(rBX)
|
|
|
|
_printnext:
|
|
|
|
LODSB
|
|
|
|
ORB(rAL, rAL)
|
|
|
|
JEQ _printret
|
|
|
|
LBI(0x0E, rAH)
|
|
|
|
BIOSCALL(0x10)
|
|
|
|
JMP _printnext
|
|
|
|
_printret:
|
|
|
|
POPA
|
|
|
|
RET
|
2011-03-30 12:46:40 +00:00
|
|
|
|
|
|
|
/*
|
2011-04-11 15:30:05 +00:00
|
|
|
* in:
|
|
|
|
* DL drive
|
|
|
|
* AX:BX lba32,
|
|
|
|
* 0000:SI buffer
|
2011-03-30 12:46:40 +00:00
|
|
|
*/
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT readsect16(SB), $0
|
|
|
|
PUSHA
|
|
|
|
CLR(rCX)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
PUSHR(rCX) /* qword lba */
|
|
|
|
PUSHR(rCX)
|
|
|
|
PUSHR(rBX)
|
|
|
|
PUSHR(rAX)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
PUSHR(rCX) /* dword buffer */
|
|
|
|
PUSHR(rSI)
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
INC(rCX)
|
|
|
|
PUSHR(rCX) /* word # of sectors */
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
PUSHI(0x0010) /* byte reserved, byte packet size */
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
MW(rSP, rSI)
|
|
|
|
LWI(0x4200, rAX)
|
2011-03-30 12:46:40 +00:00
|
|
|
BIOSCALL(0x13)
|
2011-04-11 15:30:05 +00:00
|
|
|
JCC _readok
|
|
|
|
ADDI(0x10, rSP)
|
2011-03-30 12:46:40 +00:00
|
|
|
POPA
|
2011-04-11 15:30:05 +00:00
|
|
|
CLR(rAX)
|
|
|
|
DEC(rAX)
|
2011-03-30 12:46:40 +00:00
|
|
|
RET
|
2011-04-11 15:30:05 +00:00
|
|
|
_readok:
|
|
|
|
ADDI(0x10, rSP)
|
2011-03-30 12:46:40 +00:00
|
|
|
POPA
|
2011-04-11 15:30:05 +00:00
|
|
|
CLR(rAX)
|
2011-03-30 12:46:40 +00:00
|
|
|
RET
|
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT bootnamelen(SB), $0
|
|
|
|
WORD $8
|
|
|
|
TEXT bootname(SB), $0
|
|
|
|
BYTE $'9'; BYTE $'B'; BYTE $'O'; BYTE $'O';
|
|
|
|
BYTE $'T'; BYTE $'F'; BYTE $'A'; BYTE $'T';
|
|
|
|
BYTE $0
|
|
|
|
|
2011-03-30 12:46:40 +00:00
|
|
|
TEXT ioerror(SB), $0
|
2011-04-11 15:30:05 +00:00
|
|
|
BYTE $'i'; BYTE $'/'; BYTE $'o'; BYTE $'-';
|
|
|
|
BYTE $'e'; BYTE $'r'; BYTE $'r'; BYTE $0
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT hello(SB), $0
|
|
|
|
BYTE $'p'; BYTE $'b'; BYTE $'s'; BYTE $0
|
2011-03-30 12:46:40 +00:00
|
|
|
|
2011-04-11 15:30:05 +00:00
|
|
|
TEXT crnl(SB), $0
|
|
|
|
BYTE $'\r'; BYTE $'\n'; BYTE $0
|