; converted with mrs2a80 convertor by dR0n^k3l 2002 ; FIXED DMA - 2007 POKE ; disable NMI calling in BS-DOS - VELESOFT 2008 ; fixed RST0 in BS-DOS(also RESET in DIVIDE mode) - VELESOFT 2009 ; enable NMI button for DIVIDE - VELESOFT 2009 ; converted to HDD BIOS (2009 ub880d) ; ; HDD BIOS (c) UB880D 2009 ; (based on FDC BIOS (c) Busy Software 199x) ; $Id: bios.a80 14 2009-08-16 01:11:57Z ub880d $ cpu Z80UNDOC RELAXED ON ;--[Hardwarove definicie]------------------------------------------------ ram: equ $e3 ;strankovaci port pro spodnich 16kB ram ($17 pro MB02+ / $e3 pro DIVIDE) h04: equ $00 ;stranka s bs-rom + write protect ($40 pro MB02+ / $00 pro DIVIDE) h05: equ $01 ;stranka s bs-dos + write protect ($41 pro MB02+ / $01 pro DIVIDE) h0c: equ $40 ;stranka s bs-rom + write enable ($60 pro MB02+ / $40 pro DIVIDE) h0d: equ $41 ;stranka s bs-dos + write enable ($61 pro MB02+ / $41 pro DIVIDE) ATA_RLBA0: equ $AF ATA_RLBA1: equ $B3 ATA_RLBA2: equ $B7 ATA_RLBA3: equ $BB ATA_RDATA: equ $A3 ATA_RERROR: equ $A7 ATA_RCOUNT: equ $AB ATA_RCOMMAND: equ $BF ATA_RSTATUS: equ ATA_RCOMMAND ATA_SBUSY equ $80 ATA_SDRDY equ $40 ATA_SDRQ equ $08 ATA_TIMEOUT: equ 0 ; 0 = 65536 ;rdrom: equ $3c98 ;rdram: equ $3c9a ;wrrom: equ $3c9c ;wrram: equ $3c9e ;---[restarty]----------------------------------------------------------- org 0 rst0: di xor a ; ld de,$ffff prepsano nasledujici instrukci JR (rst0 - velesoft) ; jp pitfall nepotrebne, odstraneno (rst0 - velesoft) jr nmires ;po RST0 skok na rutinu,ktera vola nmi (rst0 - velesoft) db 0,0 ;nove nepouzite volne misto (rst0 - velesoft) jr nmires ;po RST0X skok na rutinu,ktera vola nmi (rst0 - velesoft) rst8: pop hl ld l,(hl) rst $28 dw $55 nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) rst16: rst $28 dw $10 ret nop nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) rst24: jp hdd_bios_start ;volani hdd biosu (ramdrv vola $90) nop ;.L001b ld a,$64 ;ramdrv nop ; out ($17),a nop ; ret ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) rst32: jp bsdos ;volani dosu nop nop nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) rst40: jp L3ca0 ;skok mezi vektory... nop nop nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) rst48: xor a ret nop nop nop nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) rst56: ei ;simulace testu klavesnice ret pop hl ;zachyt pro im2 programy volajici primo rom pop af ;az po pitfall... ei ret nop nop nop nop nop nop nop nop nop nop nop nop nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) pop de ;zachyt pop bc pop hl pop af ei ret nop nop nop nop nop nop nop nop nop nop nop nop nop nop ; jr pitfall jr nmirun ;novy skok na NMI (rsterr velesoft) prepit: call rdrom ;skok do bs-rom s write protect pitfall: ;zde je adresa $66 (NMI) ; ld sp,$5820 - odstraneno,presunute na NMIRES (disable nmi - velesoft) retn ;NMI v dosu blokovano (disable nmi - velesoft) nop ;NOP jen aby sedely adresy (disable nmi - velesoft) jr prepit nmires: ld sp,$5820 ;osetreni pri RST0. Novy SP (rst0 - velesoft) ld de,$5 ;adresa skoku do BS-ROM (rst0 - velesoft) pushde push de ;adesu skoku podstrcime na zasobnik (rst0 - velesoft) ld de,$ffff ;opsana premazana instrukce z adresy $2 (rst0 - velesoft) jp rdrom ;navrat do bs-rom s write protect (rst0 - velesoft) nmirun: ld sp,$5820 ;osetreni skoku CPU mezi RST body(vola NMI).(rsterr velesoft) ld de,$66 ;adresa pro skok do NMI v BS-ROM (rsterr velesoft) jr pushde ;uloz adresu NMI na zasobnik a skoc do bs-rom (rsterr velesoft) ; free space ??? a_fr7: equ tabset-$ ;---[flopy disk setup]--------------------------------------------------- ;adresa tabulek disku!!! org $80 tabset: db $03 ;rezimy db 80 ;stopy db $00 ;krokovanie db $80 ;disk change,ak je 1 tak ok db $01 ;rezimy db 80 ;stopy db $00 ;krokovanie db $01 ;ready, ak je 0 tak ok dw 0,0,0,0 ;dalsie dve mechaniky nie su ; free space $0090-$00FF ? ;*********************************************************************** ;*** HDD BIOS *** ;*********************************************************************** ; ;HDD bios: obsluha hardware verzia_bios: equ 01 ; well.. nothing is perfect at first time ;] org $0100 hdd_bios_start: jr exec_service ; 00 dummy reset - just return bios version dw hdd_status_zero ; 01 dummy read status dw hdd_restore ; 02 dummy restore to track 0 dw hdd_status_zero ; 03 dummy restore to track N dw hdd_read_sec ; 04 read (bsdos) sector dw hdd_write_sec ; 05 write (bsdos) sector dw hdd_status_zero ; 06 dummy read track dw hdd_status_zero ; 07 dummy write (format) track dw hdd_status_zero ; 08 dummy read sector identification dw hdd_set_density ; 09 dummy set density dw hdd_status_zero ; 0a dummy $0A service dw hdd_status_zero ; 0b dummy $0B service dw hdd_img_active ; 0c turn on drive N (set active diskette image) dw hdd_status_zero ; 0d dummy turn off all drives dw hdd_img_info ; 0e dummy info about drive, just return $52 tracks and all densities dw hdd_status_zero ; 0f dummy maximum size for DMA dw hdd_set_mlt ; 10 set address of "multitasking" routine (called after read and write sector) dw hdd_status_zero ; 11 dummy turn-off motor mode exec_service: push af ld a,(partscanned) ; we don't know when system is in initializing state, or a ; so we initialize internal data at first call of HDD BIOS call z,hdd_initialize ; !!!ON MB02 WE NEED TO BE SURE THAT PARTSCANNED VARIABLE IS RESET TO ZERO ON POWERON OF MACHINE!!! pop af add a,a ; double A - 2 byte vectors in table (well it means no more than 127 services ;]) jp z,hdd_reset ; get bios version cp exec_service#256 jp nc,hdd_status_zero ; unknown service push hl ld l,a ; get address of service ld h,hdd_bios_start/256 ld a,(hl) inc hl ld h,(hl) ld l,a ex (sp),hl ; store it on stack run_service: ret ; run it ;*********************************************************************** ;*** HDD BIOS SERVICES *** ;*********************************************************************** ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; dummy reset - just return bios version ; OUTPUT: BC - bios version hdd_reset: ld bc,verzia_bios ; just return version of bios ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; dummy set density ; INPUT: E - density ; OUTPUT: Z if density is HD, otherwise return NZ hdd_set_density: ld a,e dec a ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; dummy services - just return 0 ; OUTPUT: A - status hdd_status_zero: ; dummy services which are expected to return A=0 or zero flag set to 1 xor a ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; dummy restore to track ; OUTPUT: A - status hdd_restore: ; dummy service 'restore' - just return 4 - on track 0 ld a,4 ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; turn on drive N ; INPUT: E - drive to activate hdd_img_active: ld a,(maxdisk) sub e ; check whether image exists ld a,0 ; return 0 - drive does not exists ret c ld a,e or a ret z ; is it tape? if so, do nothing push hl push de push bc ld de,(activepart) ; BCDE = LBA of 1st image (32 bit number) ld bc,(activepart+2) dec a ; first image is @1, so decrement to have zero based numbering rlca ; 2MB in (512 Bytes) sectors is $00001000 rlca ; max A = FE, so max address is $000FE000 rlca ; so we add int(A/16) to C and (A&15)*16 to D rlca ld l,a and $F0 ; int(A/16) add a,d ld d,a jr nc,no_inc_c ; overflow on D? so increment C inc c jr nz,no_inc_c ; overflow on C? so increment B inc b no_inc_c: ld a,l and $0F ; (A&15)*16 add a,c ld c,a jr nc,no_inc_b ; overflow on C? so increment B inc b no_inc_b: ld (activedisk),de ; BCDE = LBA of A-th image ld (activedisk+2),bc pop bc pop de pop hl ld a,2 ; return 2 - drive activated, diskette wasn't changed ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; dummy info about drive, just return $52 tracks and all densities ; OUTPUT: D - numbet of tracks, E - bitmask of available densities hdd_img_info: ld de,$5202 ; dummy return of 82 ($52) tracks and HD density ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; ATA status waiting subprogs (inspired by fatware) ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; wait for busy=0 ; OUTPUT: flag Z - success, NZ - timeout ide_wait_nobusy: push bc ld bc,ATA_TIMEOUT ide_wait_nobusy_loop: in a,(ATA_RSTATUS) and ATA_SBUSY ; Z - successful operation jr z,ide_wait_nobusy_next dec bc ld a,b or c jr nz,ide_wait_nobusy_loop inc a ; set NZ - timeout ide_wait_nobusy_next: pop bc ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; wait for busy=0 and drdy=1 ; OUTPUT: flag Z - success, NZ - timeout ide_wait_drdy: push bc ld bc,ATA_TIMEOUT ide_wait_drdy_loop: in a,(ATA_RSTATUS) and ATA_SBUSY|ATA_SDRDY cp ATA_SDRDY ; Z - successful operation jr z,ide_wait_drdy_next dec bc ld a,b or c jr nz,ide_wait_drdy_loop inc a ; set NZ - timeout ide_wait_drdy_next: pop bc ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; wait for busy=0 and drq=1 ; OUTPUT: flag Z - success, NZ - timeout ide_wait_drq: push bc ld bc,ATA_TIMEOUT ide_wait_drq_loop: in a,(ATA_RSTATUS) and ATA_SBUSY|ATA_SDRQ cp ATA_SDRQ ; Z - successful operation jr z,ide_wait_drq_next dec bc ld a,b or c jr nz,ide_wait_drq_loop inc a ; set NZ - timeout ide_wait_drq_next: pop bc ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; translate geometry ; INPUT : DE - physical number of sector on active diskette image ; (geometry with 11 sectors on track) ; OUTPUT: BCDE - LBA on hdd hdd_translate: push hl ; do not alter hl! ld h,0 ; address in memory stored in HL is on stack, we can use HL to translate bsdos sectors to LBA ld l,d ; DE: D - track, E7 - side E6-E0 = sector (1-128) add hl,hl ; calculate HL=D*2+(E7) ld a,e and 128 jr z,hdd_translate_side0 inc hl ; E7=1 so increment HL hdd_translate_side0: ld a,e dec a and 127 ; (E6-E0) = 0 => 128th sector ld d,h ld e,l ; DE=HL add hl,hl add hl,hl ; HL*4 add hl,de ; HL*5 add hl,hl ; HL*10 add hl,de ; HL*11 (we are using 11 sectors on track) ld e,a ld d,0 add hl,de ; +sector add hl,hl ; *2 ... 1024 Bytes sectors ex de,hl ; DE = LBA of sector relative to start of image ld bc,(activedisk+2) ld hl,(activedisk) or a add hl,de ex de,hl jr nc,hdd_translate_nocarry inc bc hdd_translate_nocarry: pop hl ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; read sector subroutine, HL cannot be modified! ; INPUT: DE - physical number of sector ; (geometry with 11 sectors on track) ; HL - address in memory hdd_read_sec: ld a,$20 ; ATA command: $20 = read sectors jr rdwr_sec ; and follow common read/write routine ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; write sector subroutine, HL cannot be modified! ; INPUT: DE - physical number of sector ; (geometry with 11 sectors on track) ; HL - address in memory hdd_write_sec: ld a,$30 ; ATA command: $30 = write sectors ; jr rdwr_sec ; common read/write subroutine, don't call this directly rdwr_sec: ld (rdwr_ata_cmd+1),a ; store ATA command call hdd_translate ; translate physical addres to LBA address call ide_wait_nobusy ; wait for device to accept commands (with timeout) jr nz,rdwr_timeout ; timeout ld a,b ; BCDE = fixed LBA on disk and $0F or $E0 ; add LBA addressing mode and MASTER device bit out (ATA_RLBA3),a ; ATA DEVICE/LBA3 register call ide_wait_drdy ; wait to MASTER device ready jr nz,rdwr_timeout ; timeout ld a,c out (ATA_RLBA2),a ; set rest of LBA address ld a,d out (ATA_RLBA1),a ld a,e out (ATA_RLBA0),a ld a,2 ; read 2 sectors out (ATA_RCOUNT),a rdwr_ata_cmd: ld a,$20 ; ATA $20 - read sectors, $30 - write sectors out (ATA_RCOMMAND),a call ide_wait_drq ; wait for data request flag jr nz,rdwr_timeout ; timeout ld bc,ATA_RDATA push hl ; undocumented demand of bsdos.. DO NOT CHANGE HL! rdwr_read_write: ld a,(rdwr_ata_cmd+1) ; ATA $20 - read sectors, $30 - write sectors cp $20 jr nz,rdwr_write_sec rdwr_read_sec: inir ; load 1 (hdd) sector inir call ide_wait_drq ; after 1 IDE sector wait for drq jr nz,rdwr_timeout_after_sector ; timeout? so exit rdwr_read_2sec: inir inir jr rdwr_run_mlt rdwr_write_sec: otir ; store 1 (hdd) sector otir call ide_wait_drq ; after 1 IDE sector wait for drq jr nz,rdwr_timeout_after_sector ; timeout? so exit rdwr_write_2sec: otir otir ; jr rdwr_run_mlt rdwr_run_mlt: ld hl,(rdwr_mlt_call+1) ; is mlt other than $0? if so, call that subroutine ld a,h or l jr z,rdwr_nomlt rdwr_mlt_call: call $0 ; not really $0, it is rewritten by setmlt service rdwr_nomlt: pop hl ; undocumented demand of bsdos.. DO NOT CHANGE HL! rdwr_ret: xor a ret rdwr_timeout_after_sector: pop hl ; undocumented demand of bsdos.. DO NOT CHANGE HL! rdwr_timeout: ld a,1 ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; set multitasking interrupt routine ; INPUT: HL - address od routine hdd_set_mlt: ld (rdwr_mlt_call+1),hl ; write new address of interrupt routine ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; setup active partition, max number of disk image, active disk image hdd_initialize: push hl push de push bc call hdd_init ; read identify & mbr, then calculate sizes and set active first image (DOS should set it afterwards too) jr nz,hdd_initialize_end ; don't set "partscanned" to 1, so we will try initialize again later ld a,1 ld (partscanned),a ; mark that we already scanned disk, so we do it once only hdd_initialize_end: pop bc pop de pop hl ret hdd_init: xor a ld h,a ld l,a ld (maxdisk),a ; reset all stored data ld (totallba),hl ld (totallba+2),hl ld (activepart),hl ld (activepart+2),hl ld (activedisk),hl ld (activedisk+2),hl call ide_wait_nobusy ret nz ; timeout so return ld a,$E0 ; $E0 = master in LBA mode out (ATA_RLBA3),a call ide_wait_drdy ret nz ; timeout so return xor a out (ATA_RLBA2),a out (ATA_RLBA1),a out (ATA_RLBA0),a inc a out (ATA_RCOUNT),a ld a,$EC ; $EC - identify drive (ATA) out (ATA_RCOMMAND),a call ide_wait_drq ret nz ; timeout so return ld b,100 ; on 100th byte is stored LBA capability hdd_ident_skip_head: in a,(ATA_RDATA) djnz hdd_ident_skip_head and 2 jr nz,hdd_ident_canlba ld b,156 ; disk doesn't support LBA, so we will read rest of identify and return (156+256 bytes) hdd_ident_nolba1: in a,(ATA_RDATA) djnz hdd_ident_nolba1 hdd_ident_nolba2: in a,(ATA_RDATA) djnz hdd_ident_nolba2 ret hdd_ident_canlba: ld b,21 ; offset 121 - 32bit number of sectors on disk hdd_ident_skip_to_size: in a,(ATA_RDATA) djnz hdd_ident_skip_to_size ld l,a in a,(ATA_RDATA) ld h,a ld (totallba),hl in a,(ATA_RDATA) ld l,a in a,(ATA_RDATA) ld h,a ld (totallba+2),hl ; totallba = size of disk (in sectors) ld b,132 ; and read rest of identify (132+256 bytes) hdd_ident_skip_tail1: in a,(ATA_RDATA) djnz hdd_ident_skip_tail1 hdd_ident_skip_tail2: in a,(ATA_RDATA) djnz hdd_ident_skip_tail2 ; we know total LBA sectors now we have to read mbr for partitions, search for $47 type (used same number as in hddpatch) hdd_mbr_start: call ide_wait_nobusy ret nz ; timeout so return ld a,$E0 ; $E0 = MASTER, LBA addressing out (ATA_RLBA3),a call ide_wait_drdy ret nz ; timeout so return xor a ; sector 0 = mbr sector out (ATA_RLBA2),a out (ATA_RLBA1),a out (ATA_RLBA0),a inc a ; read of 1 sector = 512 bytes out (ATA_RCOUNT),a ld a,$20 ; $20 - read sector(s) (ATA) out (ATA_RCOMMAND),a call ide_wait_drq ret nz ; timeout so return ld b,$C0 ; skip $1BE+$2 bytes (start of ptable, and 2 more bytes - for better align) hdd_mbr_skip_head1: in a,(ATA_RDATA) djnz hdd_mbr_skip_head1 hdd_mbr_skip_head2: in a,(ATA_RDATA) djnz hdd_mbr_skip_head2 ld c,4 ; partition table can store 4 primary partitions hdd_pentry_begin: in a,(ATA_RDATA) in a,(ATA_RDATA) in a,(ATA_RDATA) cp $47 ; is this our partition? (used hddpatch partition type) jr z,hdd_mbr_got_partition ld b,13 ; no? skip rest of data for this partition (plus 2 more bytes as for first partition) hdd_pentry_skip_rest: in a,(ATA_RDATA) djnz hdd_pentry_skip_rest dec c ; if this is not last partition then test next partition jr nz,hdd_pentry_begin ret ; there is no mbd partition :( hdd_mbr_got_partition: in a,(ATA_RDATA) ; so we skip CHS for end of partition, we will use LBA only in a,(ATA_RDATA) in a,(ATA_RDATA) ld b,8 ; and finally, there are two 32bit numbers - LBA of start and size in sectors of partition ld hl,partstart hdd_pentry_read: in a,(ATA_RDATA) ld (hl),a inc hl djnz hdd_pentry_read in a,(ATA_RDATA) ; 2 bytes of next partition / DOS magic number (if last partition) in a,(ATA_RDATA) dec c jr z,hdd_init_math ; if it is last partition then jump to calculations (hurray!) hdd_mbr_finish: ; just read rest of partition table / mbr sector ld b,16 hdd_mbr_finish_loop: in a,(ATA_RDATA) djnz hdd_mbr_finish_loop dec c jr nz,hdd_mbr_finish ; here comes 32bit math ;] ; we are going to calculate size of storage for images, ; we need firstly count size of the rest of disk (from ; beginning of partition) to check is partition table ; isn't corrupted hdd_init_math: ld bc,(partstart+2) ; higher part of partition start ld de,(partstart) ; lower part of partition start ld hl,(totallba) ; lower part of disk size or a ; reset carry to make sure substitution is not affected by carry flag sbc hl,de ex de,hl ; de = the rest of the disk in sectors - lower 16 bits ld hl,(totallba+2) sbc hl,bc ld b,h ld c,l ; bc = the rest of the disk in sectors - higher 16 bits ld (restofdisk),de ; restofdisk - 32 bit size from beginning of partition to end of disk (in sectors) ld (restofdisk+2),bc or a ; and now we are going to see whether partition ends before end of disk ;] we use simple '32bit sub' ld hl,(partsize) ex de,hl ; gonna count restofdisk-partsize, so move de to hl sbc hl,de ld e,c ld d,b ld hl,(partsize+2) ex de,hl sbc hl,de ; carry? so partition is larger than rest of disk (which is bad) ret c partok: ld de,(partsize) ; so partition size is (likely) valid, so we are going to get max number of diskettes on partition ld bc,(partsize+2) ld h,255 ; max number of diskette images (@1-@255) ld a,c ; BCDE should be less than $00100000 (256 images of $1000 sectors [2MB]) and $F0 ; so check it if BC is less than $0010 or b jr nz,hdd_init_finish ; if not zero, then we have more than 255 disks, so we use 255 only ld h,c ; CDE / $1000 = CDE / $100 / $10 ld l,d ; HL = CDE/$100 - we need to divide it by 16 or multiple by 16 and get H add hl,hl add hl,hl add hl,hl add hl,hl ; HL = CDE/$100 * 16, so in H is max number of image hdd_init_finish: ld a,h ld (maxdisk),a ld de,(partstart) ; partition start - DE = lower part, BC = higher part ld bc,(partstart+2) ld (activepart),de ; everything is ok, so setup variables ld (activepart+2),bc ld (activedisk),de ; set 1st diskette as active ld (activedisk+2),bc xor a ret ;"""""""""""""""""""""""""""""""""""""""""""""""""""" ; variables partscanned: db 0 ; when =1 means partition table is already readed totallba: dw 0,0 ; total HDD sectors in LBA mode restofdisk: dw 0,0 ; number of sectors from beginnig of partition to end of disk (temporary) partstart: dw 0,0 ; LBA of start of partition (temporary) partsize: dw 0,0 ; LBA of size of partition (temporary) activepart: dw 0,0 ; LBA of start of bsdos partition = LBA of first bsdos image activedisk: dw 0,0 ; LBA of selected bsdos image maxdisk: db 0 ; max id of disk image (from size of bsdos partition) hdd_bios_end: ; End of HDD bios ;---------------- hdd_bios_len: equ hdd_bios_end-hdd_bios_start ; free space ??? a_fr6: equ drkes-$ ;az do promennych dosu? a2_end: equ $ ;pri bootovani sa spusti boot sektor, ktory ;vytvori v dos ramke FDC bios. Tym padom ma ;pristup k disketovej jednotke. Nacita z nej subor ;"masterboot" a spusti ho. Masterboot vypise ;tabulku konfigutacie, pomocou FDC biosu loadne ;subor "bsdos308". Kedze boot a masterboot este ;neovladaju filesystem, tak je nutne aby masterboot ;a bsdos308 lezali na konkretnych sektoroch ;(treba ich sejvnut na cistu prazdnu disketu HD, 11sec/trk). ;Po loadnuti suboru bsdos308 sa tento zdepakuje, ;LDIRne do baniek (outy pre prepinanie baniek sa ;beru z boot sektora) a znovu sa spusti boot, ktory ;znovu vytvori FDC bios a aj ROM bios. Nakoniec ;sa spusti sluzba dosu #30 START, tym je proces ;bootovania z hladiska vytvorenia dosu hotovy a ;vsetko ostatne je uz zalezitost autoexecu.