Permalink
Browse files

Booting from flash drive OK! :)

Заработала загрузка с флешки. В качестве флешкиного бутсектора я использовал бутсектор от OS Kolibri.
Флешку надо форматировать как FAT-32, затем инсталлировать туда бутсектор (см. make installflash в
каталоге boot-sector), затем просто скопировать туда файл stage2 (см. make installflash в каталоге
stage2)

Замечание: флешка грузится как flash-HDD, то есть эмулирует HDD. На уровне BIOS прооисходит подмена
прерывания 0x13 и устройство 0x80 - это флешка (флешка как HDD, там есть MBR!), а 0x81 - ПЕРВЫЙ
жесткий диск (с компьютерами у которых два жеских диска я еще не эксмериментировал)
  • Loading branch information...
prool committed Apr 14, 2016
1 parent 15a142a commit 6ad7245a0a5bfb50b02c3652ded019f568b61190
@@ -0,0 +1,114 @@
# Proolix-l stage2
# makefile for cygwin
#status of this file: OBSOLETE!
LD = ld
AS = as
CPP = cpp
ASFLAG =
boot: boot_ cmd2com
dd if=boot_ of=boot skip=1
boot_: boot_.o
$(LD) -Ttext 0x0 -M -s -o $@ $< > map.lst
chmod a-x boot_
boot_.o: boot_.S macros.S ohw.S sayr.S saycsip.S
sh date.sh
$(AS) $(ASFLAG) -a=boot_.lst -o $@ $<
ccc: c1.c
gcc c1.c -o ccc.exe
strip ccc.exe
mv ccc.exe ccc
CKERNELboot: kernc.o c0.o
$(LD) $(LDFLAGS) -M -Ttext 0x0 -s -o boot c0.o kernc.o > mapc.lst
chmod a-x boot
kernc.o: kernc.c
gcc -c -fno-asynchronous-unwind-tables kernc.c
kernc.s: kernc.c
gcc -m32 -S -fno-asynchronous-unwind-tables kernc.c
libc.o: libc.c
gcc -m32 -c libc.c
# $(AS) $(ASFLAG) -a=libc.lst -o libc.o libc.s
lib2.o: lib2.c
gcc -m32 -c lib2.c
libc.s: libc.c
gcc -m16 -S libc.c
lib2.s: lib2.c
gcc -m16 -S lib2.c
#boot.s: boot.S macros.S defines.h
# $(CPP) -traditional $< -o $@
clean:
rm boot boot_ kernc *.lst *.o a.out
saycsip.s: saycsip.S macros.S defines.h
$(CPP) -traditional $< -o $@
saycsip.o: saycsip.s
$(AS) $(ASFLAG) -a=saycsip.lst -o $@ $<
ohw.s: ohw.S defines.h
$(CPP) -traditional $< -o $@
ohw.o: ohw.s
$(AS) $(ASFLAG) -a=ohw.lst -o $@ $<
sayr.s: sayr.S
$(CPP) -traditional $< -o $@
sayr.o: sayr.s
$(AS) $(ASFLAG) -a=sayr.lst -o $@ $<
end.s: end.S
$(CPP) -traditional $< -o $@
end.o: end.s
$(AS) $(ASFLAG) -a=end.lst -o $@ $<
c0.s: c0.S
$(CPP) -traditional $< -o $@
c0.o: c0.s
$(AS) $(ASFLAG) -a=c0.lst -o $@ $<
cmd1: cmd1.o saycsip.o ohw.o sayr.o
$(LD) $(LDFLAGS) -m i386pe -M -Ttext 0x0 -s -o $@ $< saycsip.o ohw.o sayr.o> cmd1-map.lst
chmod a-x cmd1
cmd1.s: cmd1.S
$(CPP) -traditional $< -o $@
cmd1.o: cmd1.s
$(AS) $(ASFLAG) -a=cmd1.lst -o $@ $<
cmd2: cmd2.S
$(AS) $(ASFLAG) -a=cmd2.lst -o cmd2.o cmd2.S
$(LD) $(LDFLAGS) -M -Ttext 0x0 -s -o cmd2 cmd2.o > cmd2-map.lst
chmod a-x cmd2
# cmd2com - example of binary assembler utility. compile under cygwin. run by 'run' command
cmd2com: cmd2
dd if=cmd2 of=cmd2com skip=1
c1s: c1s.s
$(AS) $(ASFLAG) -a=c1s.lst -o c1s.o c1s.s
$(LD) $(LDFLAGS) -M -Ttext 0x0 -s -o c1s c1s.o > map.lst
chmod a-x c1s
# cygwin experiments: cross-compile for Proolix: .c file -> asm .s file -> stripped .s file -> binary
ct: c2.c headers.h clib.c prefix.s
gcc -S -m16 c2.c
./britva.sh c2.s
$(AS) $(ASFLAG) -a=ctmp.lst -o ctmp.o ctmp.s
$(LD) $(LDFLAGS) -M -Ttext 0x0 -s -o ctmp ctmp.o > map.lst
# skip parameter set manually (use brains)
dd if=ctmp of=ct skip=1
cp ct /cygdrive/e
vexe: vexe.c
gcc vexe.c -o vexe.exe
vpeexe: vpeexe.c
gcc vpeexe.c -o vpeexe.exe
@@ -82,10 +82,12 @@ mount_disk(0);
if (boot_drive==0xDDDDU)
{
puts0("Boot from HDD0\r\n");
mount_disk(0x80U);
}
else if (boot_drive==0xAAAAU)
{
puts0("Boot from FDD0\r\n");
mount_disk(0);
}
else puts0("Boot from unknown device\r\n");
@@ -124,6 +126,7 @@ while (1)
else if (!strcmp(buf,"testdisk")) testdisk();
else if (!strcmp(buf,"mount")) mount();
else if (!strcmp(buf,"off")) off();
else if (!strcmp(buf,"vec")) vectors();
else if (!strcmp(buf,"skript")) skript();
else
{
@@ -1447,6 +1447,7 @@ system - print system parameters\r\n\
memd0 - memory dump for extended processor mode\r\n\
memd - memory dump for real mode\r\n\
memmap - print memory map\r\n\
vec - print interrupt vectors\r\n\
basic - call ROM BASIC (if exist)\r\n\
diskd0 - disk dump #1 (sector/head/track)\r\n\
diskd - disk dump #2 (absolute sector)\r\n\
@@ -1800,6 +1801,8 @@ puts0("\r\ndrive = 0x");
puthex_b(drive);
puts0(" sec = ");
putdec(sec);
puts0("/");
putdec(MaxSectors);
Track=(sec/SectorsOnCyl); /*SectorsOnCyl=HeadCnt*TrkSecs,Track==Cyl */
SecNoOnCyl=(sec%SectorsOnCyl);
@@ -1808,10 +1811,16 @@ SecOnTrk=SecNoOnCyl%TrkSecs+1;
puts0(" CHS = ( ");
putdec(Track);
puts0("/");
putdec(MaxCyl);
puts0(" ");
putdec(Head);
puts0("/");
putdec(HeadCnt);
puts0(" ");
putdec(SecOnTrk);
puts0("/");
putdec(TrkSecs);
puts0(" ) ");
for(i=0;i<512;i++) buffer512[i]=0;
@@ -1844,10 +1853,25 @@ for (line=0;line<32;line++)
}
puts0("\r\n");
}
puts0("Next sector(q-quit,r-retry,b-back,V-viewMBR,B-viewboot,W-write,D-debug,otherkey-next)?\r\n");
puts0("Next sector(q-quit,b-back,V-viewMBR,B-viewboot,?-help,otherkey-next)?\r\n");
char c=getch();
switch(c)
{
{int delta;
case '?':
puts0("=Diskd help=\r\n\
q-quit,r-retry,b-back,V-viewMBR,B-viewboot,W-write,D-debug,otherkey-next\r\n\
+ - skip sectors, = - go to sector\r\n");
break;
case '+': puts0("delta? ");
getsn(str,MAX_LEN_STR);
delta=atoi(str);
sec+=delta;
break;
case '=': puts0("go to sector? ");
getsn(str,MAX_LEN_STR);
delta=atoi(str);
sec=delta;
break;
case 'D': buffer512[0]='Z';
case 'W': i=secwrite(drive, sec, buffer512);
puts0("Disk write. Return code=");
@@ -2720,4 +2744,18 @@ puts0("\r\n");
#endif
void vectors(void)
{short int i;
for (i=0;i<128+10;i++)
{
puthex_b(i);
puts0(" ");
puthex(peek(i*4+2));
puts0(":");
puthex(peek(i*4));
if ((i+1)%6==0) puts0("\r\n");
else puts0(" ");
}
}
#include "proolskript.c"
@@ -97,6 +97,7 @@ void mount(void);
void out_os(unsigned char);
void out_fat(void);
void skript(void);
void vectors(void);
int open(char *path, int flags);
int read (int fd, char *buf, int count);

0 comments on commit 6ad7245

Please sign in to comment.