home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / makeboot / makeboot.asm < prev    next >
Encoding:
Assembly Source File  |  1980-01-04  |  13.5 KB  |  468 lines

  1.     include    "exec/types.i"
  2.     include    "exec/nodes.i"
  3.     include    "exec/lists.i"
  4.     include    "exec/memory.i"
  5.     include    "exec/ports.i"
  6.     include    "exec/io.i"
  7.     include    "exec/devices.i"
  8.     include    "exec/resident.i"
  9.     include    "devices/trackdisk.i"
  10.     include    "dos.i"
  11.  
  12.     xref    _LVOOpenLibrary,_LVOCloseLibrary
  13.     xref    _LVOAllocSignal,_LVOFreeSignal,_LVOFindTask
  14.     xref    _LVOAddPort,_LVORemPort
  15.     xref    _LVOOpenDevice,_LVOCloseDevice,_LVODoIO
  16.     xref    _LVORawDoFmt,_LVOAllocMem,_LVOFreeMem
  17.     xref    _LVOFindResident,_LVOOutput,_LVOWrite
  18.     xref    _LVOLoadSeg,_LVOUnLoadSeg
  19.  
  20. BOOTSIZE    equ    1024        ; boottilohkon koko tavuina
  21. BUF        equ    2048        ; koodipuskurin koko
  22. LF        equ    10        ; rivinsiirto
  23.  
  24. .DosBase    equ    -4        ; dos-kirjaston perusosoite pinossa
  25. port        equ    -8        ; viestiportin osoite pinossa
  26. ioreq        equ    -12        ; ioreq-osoitin
  27. buf        equ    -16        ; puskurin osoite
  28. seglist        equ    -20        ; segmenttilistan osoitin
  29. unit        equ    -24        ; levyaseman numero
  30. filename    equ    -28        ; tiedoston nimen osoitin
  31. devflag        equ    -30        ; lippu: trackdisk auki
  32.  
  33. Start    link    a4,#-30
  34.     clr.b    -1(a0,d0.l)        ; lisätään loppunolla
  35.     move.l    a0,a5            ; komentorivin osoite
  36.  
  37.     moveq    #6,d0
  38.     move.l    a4,a0
  39. 1$    clr.l    -(a0)            ; nollataan muuttujat
  40.     dbf    d0,1$
  41.     clr.w    -(a0)
  42.  
  43.     lea    dosname,a1        ; dos-kirjaston nimi
  44.     moveq    #0,d0            ; mikä tahansa versio
  45.     move.l    $4,a6            ; avataan dos
  46.     jsr    _LVOOpenLibrary(a6)
  47.     move.l    d0,.DosBase(a4)        ; perusosoite talteen
  48.     beq    cleanup            ; jos ei auennut, pois
  49.  
  50.     move.l    #BUF,d0            ; puskurin koko
  51.     move.l    #MEMF_CHIP!MEMF_CLEAR,d1; tyyppi=CHIP-muisti
  52.     move.l    $4,a6
  53.     jsr    _LVOAllocMem(a6)    ; varataan puskuri
  54.     move.l    d0,buf(a4)        ; osoite talteen
  55.     beq    cleanup            ; jos ei puskuria, pois
  56.     move.l    d0,a0
  57.     lea.l    BOOTSIZE(a0),a0
  58.     move.l    a0,filename(a4)        ; filename = buf + BOOTSIZE
  59.  
  60.     move.l    a5,a0            ; komentorivin osoite
  61.     bsr    parse            ; nuuskitaan komentorivi
  62.     move.l    a0,d0
  63.     bne    cmderr            ; virhe: pois
  64.  
  65.     moveq.l    #MP_SIZE,d0        ; viestiportin koko
  66.     sub.l    a0,a0            ; ei nimeä (yksit. portti)
  67.     bsr    createport        ; luodaan portti
  68.     move.l    d0,port(a4)        ; osoite talteen
  69.     beq    cleanup            ; jos ei porttia, pois
  70.  
  71.     moveq.l    #IOSTD_SIZE,d0        ; IORequestin koko
  72.     move.l    port(a4),a0        ; viestiportin osoite
  73.     bsr    createio        ; luodaan IOReq
  74.     move.l    d0,ioreq(a4)        ; osoite talteen
  75.     beq    cleanup            ; jos ei IOReq:a, pois
  76.  
  77.     lea    INITIAL(pc),a0        ; kopioidaan puskuriin..
  78.     moveq    #(USERCODE-INITIAL),d0    ; ..näin monta tavua
  79.     move.l    d0,d1
  80.     subq.l    #1,d0            ; dbf:lle yhtä pienempi luku
  81.     move.l    buf(a4),a2        ; puskurin osoite
  82. cploop    move.b    (a0)+,(a2)+        ; kopioidaan koodia..
  83.     dbf    d0,cploop        ; ..kunnes loppu
  84.  
  85.     move.l    #BOOTSIZE,d2        ; boottilohko BOOTSIZE tavua
  86.     sub.l    d1,d2            ; d2 = jäljelle jäävän koko
  87.     move.l    filename(a4),d1        ; ladattava tiedosto
  88.     move.l    .DosBase(a4),a6
  89.     jsr    _LVOLoadSeg(a6)        ; ladataan se muistiin
  90.     move.l    d0,seglist(a4)        ; seglistin osoitin talteen
  91.     bne.s    ck_len            ; hyppy jos latautui
  92.     lea    eltxt(pc),a0        ; virheilmoitus, jos..
  93.     move.l    filename(a4),d0        ; ..ei saatu ladattua
  94.     bsr    dpymsg            ; tulostetaan virhe
  95.     bra    cleanup            ; pois
  96.  
  97. ck_len    add.l    d0,d0            ; muunnetaan BCPL-osoitin..
  98.     add.l    d0,d0            ; ..abs. osoitteeksi
  99.     move.l    d0,a0            ; osoite a0:aan
  100.  
  101.     tst.l    (a0)            ; onko useita segmenttejä?
  102.     bne    multip            ; on, hyppää ja valita
  103.     move.l    -(a0),d0        ; segmentin koko d0:aan
  104.     cmp.l    d2,d0            ; riittääkö tila?
  105.     bhi    toolong            ; ei, hyppää ja valita
  106.     addq.l    #8,a0            ; segm. koodi alkaa tästä
  107.     subq.l    #1,d0            ; kopioitava määrä
  108. cp_code    move.b    (a0)+,(a2)+        ; kopioidaan puskuriin..
  109.     dbf    d0,cp_code        ; ..kunnes segmentti kopiotu
  110.  
  111. ; Lasketaan boottilohkon tarkistussumma.  Kun kaikki 256 long wordia
  112. ; lasketaan yhteen, tuloksen on oltava nolla.  Jokaisen yhteenlaskun
  113. ; jälkeen tarkistetaan carry-bitin tila ja lisätään summaan ykkönen,
  114. ; jos carry oli 1 (yhteenlaskussa syntyi ylivuoto).  Lopuksi asete-
  115. ; taan tarkistussumma sellaiseksi, että summasta tosiaan tulee nolla.
  116.     move.l    buf(a4),a0        ; puskurin osoite
  117.     move.l    a0,a1            ; myös a1:een
  118.     move.w    #BOOTSIZE/4-1,d1    ; lohkon koko longeina
  119.     moveq    #0,d0            ; summa alussa = 0
  120. c_csum    add.l    (a0)+,d0        ; lisätään jokainen LONG
  121.     bcc.s    1$            ; jos muistinumero, ..
  122.     addq.l    #1,d0            ; ..lisätään vielä ykkönen
  123. 1$    dbf    d1,c_csum        ; lasketaan kaikki
  124.     move.l    buf(a4),a0        ; puskurin osoite
  125.     addq.l    #4,a0            ; offset tarkistussummaan
  126.     sub.l    d0,(a0)            ; vähenn. tarkistussummasta
  127.     bcc.s    2$            ; pitikö lainata?
  128.     subq.l    #1,(a0)            ; joo, vähennetään vielä 1
  129.  
  130. 2$    lea    TDname(pc),a0        ; laitenimi
  131.     move.l    unit(a4),d0        ; yksikkö
  132.     move.l    ioreq(a4),a1        ; IORequestin osoite
  133.     moveq.l    #0,d1            ; liput
  134.     move.l    $4,a6
  135.     jsr    _LVOOpenDevice(a6)    ; avataan trackdisk
  136.     tst.l    d0            ; saatiinko auki?
  137.     beq.s    dev_ok            ; joo, hyppää
  138.  
  139.     lea    optxt(pc),a0
  140.     move.l    unit(a4),d0        ; yksikkö
  141.     bsr    dpymsg            ; tulostetaan virhe
  142.     bra    cleanup            ; pois
  143.  
  144. dev_ok    st    devflag(a4)        ; trackdisk saatiin auki
  145.     moveq    #1,d0            ; käynnistetään moottori
  146.     bsr    Motor
  147.     bsr    WriteBlk        ; kirjoitetaan boottilohko
  148.     bne.s    wrerr            ; kirjoitus ei onnistunut
  149.  
  150.     moveq    #0,d0
  151.     bsr    Motor            ; pysäytetään moottori
  152.     bra    cleanup            ; siivotaan jäljet
  153.  
  154.  
  155. wrerr    lea    wrtxt(pc),a0        ; virheilmoituksia
  156.     bra.s    cmderr
  157.  
  158. multip    lea    ootxt(pc),a0
  159.     bra.s    cmderr
  160.  
  161. toolong    lea    tltxt(pc),a0
  162.     move.l    d2,d1
  163. cmderr    bsr    dpymsg
  164. cleanup    tst.b    devflag(a4)        ; onko trackdisk auki?
  165.     beq.s    100$
  166.     move.l    ioreq(a4),a1
  167.     move.l    $4,a6
  168.     jsr    _LVOCloseDevice(a6)    ; on -> suljetaan se
  169.  
  170. 100$    move.l    ioreq(a4),a0        ; vapautetaan IOReq
  171.     bsr    deleteio
  172.     move.l    port(a4),a0        ; vapautetaan MsgPort
  173.     bsr    deleteport
  174.  
  175.     move.l    seglist(a4),d1        ; segmenttilista olemassa?
  176.     beq.s    103$
  177.     move.l    .DosBase(a4),a6
  178.     jsr    _LVOUnLoadSeg(a6)    ; joo -> vapautetaan se
  179.  
  180. 103$    move.l    buf(a4),d0        ; puskuri varattu?
  181.     beq.s    105$
  182.     move.l    d0,a1
  183.     move.l    #BUF,d0
  184.     move.l    $4,a6
  185.     jsr    _LVOFreeMem(a6)        ; jep -> vapautetaan se
  186.  
  187. 105$    move.l    .DosBase(a4),d0        ; suljetaan Dos-kirjasto
  188.     beq.s    107$
  189.     move.l    d0,a1
  190.     move.l    $4,a6
  191.     jsr    _LVOCloseLibrary(a6)
  192. 107$    unlk    a4
  193.     rts
  194.  
  195. skipblk    move.b    (a0)+,d0        ; hypätään välilyöntien ja
  196.     beq.s    10$            ; tabulaattorien yli
  197.     cmp.b    #32,d0
  198.     beq.s    skipblk
  199.     cmp.b    #9,d0
  200.     beq.s    skipblk
  201. 10$    subq.l    #1,a0
  202.     rts
  203.  
  204. ;;;; tutkitaan komentorivin parametrit
  205. parse    bsr.s    skipblk            ; hypätään rivin alussa tyhjän yli
  206.     beq    perr1            ; jos rivi loppui, virhe
  207.     moveq    #34,d1            ; lainausmerkki d1:een
  208.     move.l    filename(a4),a1        ; tila tiedoston nimelle
  209.     move.b    (a0)+,d0        ; otetaan merkki komentoriviltä
  210.     beq    perr1            ; jos nolla, virhe
  211.     cmp.b    d1,d0            ; lainausmerkki?
  212.     bne.s    101$            ; ei -> hypellään yli
  213. 10$    move.b    (a0)+,d0        ; kopioidaan tiedoston nimeä,
  214.     beq.s    11$            ; kunnes .. .. nolla ..
  215.     cmp.b    d1,d0            ; .. tai lainausmerkki
  216.     beq.s    11$
  217.     move.b    d0,(a1)+        ; merkki talteen nimipuskuriin
  218.     bra.s    10$            ; kopioidaan koko nimi
  219.  
  220. 100$    move.b    (a0)+,d0        ; kopioidaan nimeä, kunnes...
  221.     beq.s    11$            ; .. nolla ...
  222. 101$    cmp.b    #' ',d0            ; .. tai välilyönti ..
  223.     beq.s    11$
  224.     cmp.b    #9,d0            ; .. tai tabulaattori
  225.     beq.s    11$
  226.     move.b    d0,(a1)+        ; merkki talteen
  227.     bra.s    100$
  228. 11$    clr.b    (a1)            ; lisätään nimen loppuun nolla
  229.     bsr.s    skipblk            ; hypätään mahdollisen tyhjän yli
  230.  
  231.     move.b    (a0)+,d0        ; otetaan levyaseman numero
  232.     beq.s    perr2
  233.     bsr.s    ucase
  234.     cmp.b    #'D',d0            ; 'D'
  235.     bne.s    perr2
  236.     move.b    (a0)+,d0
  237.     beq.s    perr2
  238.     bsr.s    ucase
  239.     cmp.b    #'F',d0            ; 'F'
  240.     bne.s    perr2
  241.     moveq    #0,d0
  242.     move.b    (a0)+,d0
  243.     beq.s    perr2
  244.     sub.b    #'0',d0            ; '0'...'3'
  245.     cmp.b    #3,d0
  246.     bhi.s    perr2
  247.     move.l    d0,unit(a4)
  248.     cmp.b    #':',(a0)        ; kaksoispiste?
  249.     bne.s    perr2
  250.     sub.l    a0,a0            ; ei virhettä
  251.     rts
  252. perr1    lea    fntxt(pc),a0
  253.     rts
  254. perr2    lea    ddtxt(pc),a0
  255.     rts
  256.  
  257. ucase    cmp.b    #'a',d0            ; muunnetaan ISOKSI KIRJAIMEKSI
  258.     bcs.s    10$            ; alle 'a'?
  259.     cmp.b    #'z',d0
  260.     bhi.s    10$            ; yli 'z'?
  261.     sub.b    #('a'-'A'),d0        ; ISONNA
  262. 10$    rts
  263.  
  264. ; dpymsg tulostaa a0:n osoittaman merkkijonon ja sen mahdollisesti
  265. ; sisältämät muuttujat d0...d7 C-kielen printf-lauseen tavoin.
  266. dpymsg    movem.l    d0-d7/a0-a3,-(sp)    ; rekisterit pinoon
  267.     move.l    sp,a1
  268.     lea.l    110$(pc),a2        ; putchar-rutiinin osoite
  269.     move.l    buf(a4),a3        ; tulostuspuskuri
  270.     move.l    $4,a6
  271.     jsr    _LVORawDoFmt(a6)    ; muotoillaan rivi
  272.     move.l    .DosBase(a4),a6
  273.     jsr    _LVOOutput(a6)        ; tulostustiedosto
  274.     move.l    d0,d1
  275.     beq.s    105$
  276.     move.l    a3,d2
  277. 100$    tst.b    (a3)+            ; lasketaan rivin pituus
  278.     bne.s    100$
  279.     subq.w    #1,a3
  280.     move.l    a3,d3
  281.     sub.l    d2,d3
  282.     jsr    _LVOWrite(a6)        ; tulostetaan rivi
  283.     movem.l    (sp)+,d0-d7/a0-a3    ; rekisterit takaisin
  284. 105$    rts
  285. 110$    move.b    d0,(a3)+        ; putchar-rutiini
  286.     rts
  287.  
  288. ; port = createport(size,name);
  289. ;  d0                d0   a0
  290. ;
  291. createport:
  292.     movem.l    d2-d3/a2-a3,-(sp)
  293.     move.l    d0,d3            ; koko
  294.     move.l    a0,a3            ; nimen osoite
  295.     move.l    a0,d1            ; nimen osoite = 0?
  296.     beq.s    10$            ; joo -> ei nimeä
  297. 1$    tst.b    (a0)+            ; mitataan nimen pituus
  298.     bne.s    1$
  299.     sub.l    d1,a0
  300.     add.l    a0,d0            ; lisätään nimen pituus kokoon
  301. 10$    addq.l    #4,d0            ; tilaa portin koolle (4 tavua)
  302.     move.l    d0,d2            ; lopullinen koko talteen
  303.     move.l    #1!(1<<16),d1        ; MEMF_PUBLIC!MEMF_CLEAR
  304.     move.l    $4,a6            ; ExecBase
  305.     jsr    _LVOAllocMem(a6)    ; varataan muistia
  306.     move.l    d0,a2            ; varatun muistin osoite
  307.     tst.l    d0            ; saatiinko muistia?
  308.     beq    creaport1        ; ei -> pois
  309.     move.l    d2,(a2)+        ; varatun alueen koko muistiin
  310.     moveq.l    #-1,d0            ; varataan signaalibitti
  311.     jsr    _LVOAllocSignal(a6)
  312.     move.b    d0,MP_SIGBIT(a2)    ; asetetaan signaali porttiin
  313.     bmi.s    creaporte        ; ei saatu signaalia -> pois
  314.     sub.l    a1,a1            ; etsitään tämä taski
  315.     jsr    _LVOFindTask(a6)
  316.     move.l    d0,MP_SIGTASK(a2)    ; asetetaan osoite porttiin
  317.     move.b    #NT_MSGPORT,LN_TYPE(a2)    ; noden tyyppi = MSGPORT
  318.     clr.b    MP_FLAGS(a2)        ; nollataan liput
  319.  
  320.     move.l    a3,d0            ; nimen osoite
  321.     beq.s    20$            ; jos ei nimeä, hypätään
  322.     lea.l    0(a2,d3.l),a0        ; a0 = portin loppuosoite
  323.     move.l    a0,LN_NAME(a2)        ; asetetaan nimen osoite porttiin
  324. 2$    move.b    (a3)+,(a0)+        ; kopioidaan nimi
  325.     bne.s    2$            ; kunnes NULL
  326.     move.l    a2,a1            ; portilla nimi -> lisätään listaan
  327.     jsr    _LVOAddPort(a6)        ; julkiseksi portiksi
  328.     move.l    a2,d0            ; palautetaan portin osoite d0:ssa
  329.     bra.s    creaport1
  330. 20$    lea    MP_MSGLIST(a2),a0    ; ei nimeä -> tehdään vain NEWLIST
  331.     NEWLIST    A0
  332.     move.l    a2,d0            ; palautetaan portin osoite d0:ssa
  333.     bra.s    creaport1
  334.  
  335. ; deleteport(MsgPort);
  336. ;              a0
  337. ;
  338. deleteport:
  339.     movem.l    d2-d3/a2-a3,-(sp)
  340.     move.l    a0,d0            ; portin osoite
  341.     beq.s    creaport1        ; jos nolla, ei tehdä mitään
  342.     move.l    a0,a2
  343.     tst.l    LN_NAME(a2)        ; onko portilla nimi?
  344.     beq.s    30$            ; ei -> hyppää
  345.     move.l    a2,a1            ; on -> poistetaan portti listalta
  346.     move.l    $4,a6            ; ExecBase
  347.     jsr    _LVORemPort(a6)        ; poistetaan listalta
  348. 30$    moveq.l    #0,d0
  349.     move.b    MP_SIGBIT(a2),d0    ; signaalin numero
  350.     bmi.s    creaporte        ; negatiivinen -> ei signaalia, pois
  351.     move.l    $4,a6
  352.     jsr    _LVOFreeSignal(a6)    ; vapautetaan signaali
  353. creaporte:
  354.     move.l    -(a2),d0        ; d0 = portille varatun alueen koko
  355.     move.l    a2,a1            ; a1 = alueen osoite
  356.     move.l    $4,a6
  357.     jsr    _LVOFreeMem(a6)        ; vapautetaan muisti
  358.     moveq.l    #0,d0            ; palautetaan nolla
  359. creaport1:
  360.     movem.l    (sp)+,d2-d3/a2-a3
  361.     move.l    d0,a0            ; nolla myös a0:aan
  362.     rts
  363.  
  364. ; IOReq = createio(size,MsgPort);
  365. ;  d0               d0    a0
  366. ;
  367. createio:
  368.     movem.l    d2/a2,-(sp)         ; d0=koko, a0=MsgPort
  369.     move.l    a0,a2            ; msgport* talteen
  370.     addq.l    #4,d0            ; tilaa stuktuurin koolle
  371.     move.l    d0,d2
  372.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  373.     move.l    $4,a6
  374.     jsr    _LVOAllocMem(a6)    ; varataan muistia IORequestille
  375.     move.l    d0,a0
  376.     tst.l    d0
  377.     beq.s    100$            ; ei muistia -> pois
  378.     move.l    d2,(a0)+        ; tallennetaan struktuurin koko
  379.     move.l    a2,MN_REPLYPORT(a0)    ; portin osoite IORequestiin
  380.     move.b    #NT_MESSAGE,LN_TYPE(a0)    ; portin tyyppi
  381.     subq.l    #4,d2
  382.     move.w    d2,MN_LENGTH(a0)    ; asetetaan viestin koko
  383.     move.l    a0,d0            ; palautetaan struktuurin osoite
  384. 100$    movem.l    (sp)+,d2/a2
  385.     rts
  386.  
  387. ; deleteio(IOReq);
  388. ;       a0
  389. ;
  390. deleteio:
  391.     move.l    a0,d0            ; a0 = IoRequest
  392.     beq.s    100$            ; nolla -> ei tehdä mitään
  393.     move.l    a0,a1
  394.     move.l    -(a1),d0        ; otetaan struktuurin koko
  395.     move.l    $4,a6
  396.     jsr    _LVOFreeMem(a6)        ; vapautetaan muisti
  397. 100$    rts
  398.  
  399. ; Motor kytkee levyaseman moottorin päälle tai pois riippuen d0:n
  400. ; arvosta.
  401. Motor    move.l    ioreq(a4),a1        ; IORequest, kuinkas muuten
  402.     move.l    d0,IO_LENGTH(a1)    ; moottorin tila on/off
  403.     move.w    #TD_MOTOR,IO_COMMAND(a1); komento TD_MOTOR
  404.     move.l    $4,a6
  405.     jsr    _LVODoIO(a6)        ; komenna
  406.     rts
  407.  
  408. ; WriteBlk kirjoittaa boottilohkon levylle trackdisk devicen avulla.
  409. WriteBlk:
  410.     move.l    ioreq(a4),a1        ; IORequest
  411.     clr.l    IO_OFFSET(a1)        ; aloitetaan lohkosta nolla
  412.     move.l    #BOOTSIZE,IO_LENGTH(a1)    ; pituus = 1024 tavua
  413.     move.l    buf(a4),IO_DATA(a1)    ; puskurin osoite
  414.     move.w    #CMD_WRITE,IO_COMMAND(a1); IO-komento = WRITE
  415.     move.l    a1,a2            ; IOReq talteen
  416.     move.l    $4,a6            ; kirjoitetaan boottilohko
  417.     jsr    _LVODoIO(a6)
  418.     tst.l    d0            ; virhe?
  419.     bne.s    WrBlke
  420.  
  421.     move.l    a2,a1            ; IOReq taas
  422.     move.w    #CMD_UPDATE,IO_COMMAND(a1); update-komento
  423.     jsr    _LVODoIO(a6)        ; kirjoitetaan puskurit levylle
  424.     tst.l    d0            ; virhe?
  425. WrBlke    rts
  426.  
  427. ; Boottilohkon alkuun kopioitava koodi, joka hoitaa varsinaisen käyttäjän
  428. ; aliohjelman kutsumisen sekä koneen boottauksen jatkamisen käyttäjän oh-
  429. ; jelman ajon päätyttyä.
  430. INITIAL    dc.b    'DOS',0            ; levykkeen tyyppi (OFS)
  431.     dc.l    0            ; tarkistussumma (lasketaan myöh.)
  432.     dc.l    880            ; levykkeen root blockin numero
  433.     movem.l    d0-d7/a0-a6,-(sp)    ; rekisterit pinoon
  434.     clr.l    IO_LENGTH(a1)        ; moottori sammuksiin
  435.     move.w    #TD_MOTOR,IO_COMMAND(a1); moottorin ohjauskomento
  436.     move.l    $4,a6            ; sammutetaan moottori
  437.     jsr    _LVODoIO(a6)
  438.     movem.l    (sp),d0-d7/a0-a6    ; luetaan rekisterien arvot
  439.     bsr.s    USERCODE        ; kutsutaan käyttäjän koodia
  440.     movem.l    (sp)+,d0-d7/a0-a6    ; otetaan rekisterit pinosta
  441.     lea    dosname(pc),a1        ; Dos-kirjaston nimi
  442.     jsr    _LVOFindResident(a6)    ; etsitään dos-resident modulia
  443.     tst.l    d0
  444.     beq.s    INITIAL_err        ; ei löytynyt -> guru
  445.     move.l    d0,a0            ; resident-palikka
  446.     move.l    RT_INIT(a0),a0        ; resident-palikan alustusrutiini
  447.     moveq    #0,d0            ; ei virhettä, jatketaan boottia
  448.     rts
  449. INITIAL_err:
  450.     moveq    #-1,d0            ; virhe, guruillaan
  451.     rts
  452. dosname    dc.b    'dos.library',0        ; nimen pituus parillinen
  453.  
  454. USERCODE    ; käyttäjän koodi tulee tähän
  455.  
  456. TDname    dc.b    'trackdisk.device',0    ; trackdiskin nimi
  457. eltxt    dc.b    'Error loading "%s"',LF,0
  458. optxt    dc.b    'Unable to open unit df%ld:',LF,0
  459. wrtxt    dc.b    'Could not write boot block - error %ld.',LF,0
  460. ootxt    dc.b    'Only one segment allowed.',LF,0
  461. tltxt    dc.b    'Length %ld (space %ld).',LF,0
  462. fntxt    dc.b    'error in filename',LF,0
  463. ddtxt    dc.b    'give destination drive dfN: where N is 0...3',LF,0
  464.     ds.w    0
  465.  
  466.     end
  467.  
  468.