049
06.01.2013, 14:35 Uhr
m.haardt
|
Wie ich schon sagte: Den Bootsektor musst Du selbst schreiben.
Bei CP/M machte man es sich noch einfach, da enthält ein Bootsektor für ein Laufwerk genau den Code, um von dem Laufwerk zu booten, d.h. der Bootsektor für Floppies und Platten ist verschieden. Ich hänge hier mal den von Udo Munk ein, den ich auch bei Yaze benutze. Er fängt bei Sektor 2 an, weil Sektor 1 der Bootsektor ist.
CP/M selbst ist das alles egal. Die Systemspuren sind nur reservierter Platz. Was da drin steht, interessiert es nicht. Wie das ganze System beim Kaltstart geladen wird oder nur CCP und BDOS beim Warmstart, ist Sache des BIOS.
Michael
; CP/M 2.2 boot-loader for Z80-Simulator ; ; Copyrigth (C) 1988-95 by Udo Munk ; .var CCP 0xE400 ; base of the ccp .var BIOS CCP+0x1600 ; base of the bios .var BIOSL 0x0300 ; length of the bios .var SIZE BIOS+BIOSL-CCP ; size of cp/m system .var SECTS SIZE/128 ; # of sectors to load ; ; I/O ports ; .var DRIVE 10 ; fdc-port: # of drive .var TRACKL 11 ; fdc-port: # of track low .var TRACKH 12 ; fdc-port: # of track high .var SECTOR 13 ; fdc-port: # of sector .var FDCOP 14 ; fdc-port: command .var FDCST 15 ; fdc-port: status .var DMAL 16 ; dma-port: dma address low .var DMAH 17 ; dma-port: dma address high ; ; begin the load operation ; COLD: LD BC,2 ; b=track 0, c=sector 2 LD D,SECTS ; d=# sectors to load LD HL,CCP ; base transfer address LD A,0 ; select drive A OUT (DRIVE),A ; ; load the next sector ; LSECT: LD A,B ; set track OUT (TRACKL),A XOR A OUT (TRACKH),A LD A,C ; set sector OUT (SECTOR),A LD A,L ; set dma address low OUT (DMAL),A LD A,H ; set dma adress high OUT (DMAH),A XOR A ; read sector OUT (FDCOP),A IN A,(FDCST) ; get status of fdc CP 0 ; read successful ? JR Z,CONT ; yes, continue HALT ; no, halt cpu CONT: ; go to next sector if load is incomplete DEC D ; sects=sects-1 JP Z,BIOS ; head for the bios ; ; more sectors to load ; ; we aren't using a stack, so use <sp> as scratch register ; to hold the load address increment ; LD SP,128 ; 128 bytes per sector ADD HL,SP ; <hl> = <hl> + 128 ; INC C ; sector = sector + 1 LD A,C CP 27 ; last sector of track ? JR C,LSECT ; no, go read another ; ; end of track, increment to next track ; LD C,1 ; sector = 1 INC B ; track = track + 1 JR LSECT ; for another group |