home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0620.ZIP / CCE_0620.PD / RAM__1_4 / SOURCE / RAMDISK.S < prev   
Text File  |  1993-09-21  |  25KB  |  990 lines

  1.           .LIST 
  2.  
  3. ; RAM-Disk als Default mit zunächst fester Größe von 128 KByte installiert
  4. ; auf D:.
  5.  
  6. gemdos    = 1
  7. xbios     = 14
  8. bios      = 13
  9.  
  10. ptermres  = $31
  11. superexec           = 38
  12. malloc    = 72
  13. mfree     = 73
  14. cconws    = 9
  15. cconin    = 1
  16. cconrs    = 10
  17. mshrink   = 74
  18. fcreate   = 60
  19. fopen     = 61
  20. fclose    = 62
  21. fread     = 63
  22. fwrite    = 64
  23. fsetdta   = 26
  24. fsfirst   = 78
  25. fsnext    = 79
  26. dsetdrv   = 14
  27. dsetpath  = 59
  28.  
  29. kbshift   = 11
  30.  
  31. drvbits   = $4c2
  32. hdvbpb    = $472
  33. hdvrw     = $476
  34. hdvmed    = $47e
  35.  
  36. resvalid  = $426
  37. resvector           = $42a
  38. phystop   = $42e
  39.  
  40. buserror  = 8
  41.  
  42. magic1    = $15051956
  43.  
  44. EOF       = -1
  45. EOLN      = -2
  46.  
  47.           .TEXT 
  48.  
  49. ; ***** Defaultparameter *****
  50.  
  51.           bra       start
  52.           .DC.b 'xbrarram'
  53. rdsizef:  .DC.w 128 ; Defaultgroesse
  54. rdnumf:   .DC.w 3   ; Defaultlaufwerk
  55. rdreset:  .DC.w 1   ; Defaultmaessig resetfest
  56. paramflag:          
  57.           .DC.w 0
  58. inffile:  .DC.b 'RAMDISK.INF',0,0,0,0,0
  59.           .EVEN 
  60. magic2:   .DC.l $11021959
  61. protect:  .DC.l 0
  62. reset:    .DC.w 0
  63. printflag:          .DC.w 1
  64.  
  65. ; ***** Programmstart *****
  66.  
  67. ; Speicherbedarf ausrechnen
  68. start:    
  69.           movea.l   4(sp),a5
  70.           move.l    12(a5),d6
  71.           add.l     20(a5),d6
  72.           add.l     28(a5),d6
  73.           addi.l    #$500,d6
  74.           move.l    d6,size
  75.  
  76.           movea.l   #stack,sp
  77.  
  78.           move.l    #meldstr,d0
  79.           bsr       print
  80.  
  81. ; Berechne Defaultwerte für Ramdisk
  82.           move.w    rdsizef,rdsize
  83.           move.w    rdnumf,rdnum
  84.           move.w    rdnum,d0
  85.           moveq.l   #1,d1
  86.           lsl.l     d0,d1
  87.           move.l    d1,rdbit
  88.           move.w    rdreset,resetflag
  89.  
  90. ; Speicherplatz freigeben
  91.           move.l    d6,-(sp)
  92.           move.l    a5,-(sp)
  93.           clr.w     -(sp)
  94.           move.w    #mshrink,-(sp)
  95.           trap      #gemdos
  96.           lea.l     12(sp),sp
  97.  
  98. ; Testen, ob Ramdisk schon hinter phystop initialisiert wurde
  99.           pea       testram
  100.           move.w    #superexec,-(sp)
  101.           trap      #xbios
  102.           addq.l    #6,sp
  103.           tst.w     sucheflag
  104.           bne       initdone
  105.  
  106. ; Bei rechter Shifttaste Parameter einlesen
  107.           tst.w     paramflag
  108.           bne       doparam
  109.           move.w    #-1,-(sp)
  110.           move.w    #kbshift,-(sp)
  111.           trap      #bios
  112.           addq.l    #4,sp
  113.           btst      #0,d0
  114.           beq       noparam
  115. doparam:  
  116.           bsr       param
  117.           bra       noinf
  118. noparam:  
  119.  
  120. ; Eventuell Parameter von RAMDISK.INF einlesen
  121.           bsr       getinf
  122. noinf:    
  123.  
  124. ; Bei Groesse 0 nichts tun
  125.           tst.w     rdsize
  126.           beq       quit
  127.  
  128. ; Speicherplatz besorgen
  129.           bsr       getstart
  130.           tst.l     d0
  131.           beq       error
  132.  
  133. ; in Supervisormodus Vektoren verbiegen
  134. initdone: 
  135.           move.l    adrinstall,-(sp)
  136.           move.w    #superexec,-(sp)
  137.           trap      #xbios
  138.           addq.l    #6,sp
  139.  
  140. ; Evtl. Dateien auf Ramdisk kopieren
  141.           tst.w     infflag
  142.           beq       nocopy
  143.           bsr       copy
  144.  
  145. ; Evtl. RAMDISK.INF schliessen
  146.           bsr       closeinf
  147. nocopy:   
  148.  
  149. ; Resident halten
  150.           tst.w     sucheflag ; Ramdisk hinter Phystop?
  151.           bne       rdest
  152.           tst.w     resetflag ; Ramdisk resetfest?
  153.           beq       rescont
  154.           pea       resinst
  155.           move.w    #superexec,-(sp)
  156.           trap      #xbios
  157.           addq.l    #6,sp
  158.           tst.w     reset
  159.           bne       doreset
  160. rescont:  
  161.           clr.w     -(sp)
  162.           move.l    size,-(sp)
  163.           move.w    #ptermres,-(sp)
  164.           trap      #gemdos
  165.  
  166. ; Konnte Ramdisk nicht installieren
  167. error:    
  168.           move.l    #errormeld,-(sp)
  169.           move.w    #cconws,-(sp)
  170.           trap      #gemdos
  171.           addq.l    #6,sp
  172.           move.w    #cconin,-(sp)
  173.           trap      #gemdos
  174.           addq.l    #2,sp
  175.           move.l    #notinststr,d0
  176.           bsr       print
  177.  
  178. ; Nicht resident halten
  179. rdest:    
  180.           move.l    #eststr,d0
  181.           bsr       print
  182. quit:     
  183.           clr.w     -(sp)
  184.           trap      #gemdos
  185.  
  186. ; Reset auslösen
  187. doreset:  
  188.           pea       knall
  189.           move.w    #superexec,-(sp)
  190.           trap      #xbios
  191. knall:    
  192.           movea.l   0,sp
  193.           movea.l   4,a0
  194.           jmp       (a0)
  195.  
  196. ; ***** Installationsunterprogramm *****
  197.  
  198. ; Resetvektor verbiegen
  199. resinst:  
  200.           move.l    resvalid,oldvalid
  201.           move.l    resvector,oldvector
  202.           move.l    #$31415926,resvalid
  203.           move.l    #newvector,resvector
  204.           rts       
  205.  
  206. ; ***** Suche Ramdisk hinter phystop *****
  207.  
  208. testram:  
  209.           move.l    buserror,oldbus
  210.           move.l    #newbus,buserror
  211.           move.l    phystop,d0
  212.           andi.l    #$ffffff00,d0
  213.           movea.l   d0,a0
  214. suche:    
  215.           cmpi.l    #magic1,(a0)
  216.           bne       nicht1
  217.           move.l    4(a0),d1
  218.           cmp.l     magic2,d1
  219.           beq       ja1
  220. nicht1:   
  221.           adda.l    #$100,a0
  222.           move.l    a0,d0
  223.           bpl       suche
  224. busexit:  
  225.           clr.w     sucheflag
  226.           move.l    oldbus,buserror
  227.           move.l    #install,adrinstall
  228.           rts       
  229.  
  230. ja1:      
  231.           move.l    oldbus,buserror
  232.           move.w    #1,sucheflag
  233.           move.l    a0,d0
  234.           addi.l    #(install-rdrstart),d0
  235.           move.l    d0,adrinstall
  236.           rts       
  237.  
  238. newbus:   
  239.           cmpa.l    2(sp),a0  ; zeigt bei 68000 auf error acces addres
  240.           bne       l68010
  241.           addq.l    #8,sp
  242.           move.l    #busexit,2(sp)
  243. l68010:   
  244.           rte       
  245.  
  246. ; ***** besorge Speicherplatz *****
  247.  
  248. getstart: 
  249.           move.w    rdsize,d3
  250.           mulu.w    #1024,d3
  251.           move.l    d3,-(sp)
  252.           move.w    #malloc,-(sp)
  253.           trap      #gemdos
  254.           addq.l    #6,sp
  255.           move.l    d0,rdstart
  256.           move.l    d0,d1
  257.           beq       getstartdone
  258.           add.l     d3,d1
  259.           move.l    d1,rdend
  260.           movea.l   rdstart,a0
  261. rdclear:  
  262.           clr.l     (a0)+
  263.           cmp.l     a0,d1
  264.           bgt.s     rdclear
  265. getstartdone:       
  266.           rts       
  267.  
  268. ; ***** Ramdiskroutinen *****
  269.  
  270. rdrstart: 
  271.  
  272. kmagic1:  .DC.l magic1
  273. kmagic2:  .DC.l 0
  274.  
  275. rdstart:  .DS.l 1
  276. rdend:    .DS.l 1
  277. drvnum:   .DS.w 1
  278. rdbit:    .DS.l 1
  279.  
  280. install:  
  281. ; Drive anmelden
  282.           move.l    drvbits,d0
  283.           or.l      rdbit(pc),d0
  284.           move.l    d0,drvbits
  285.  
  286. ; Vektoren merken
  287.           lea.l     oldbpb(pc),a0
  288.           move.l    hdvbpb,(a0)
  289.           lea.l     oldrw(pc),a0
  290.           move.l    hdvrw,(a0)
  291.           lea.l     oldmed(pc),a0
  292.           move.l    hdvmed,(a0)
  293.  
  294. ; neue Vektoren einsetzen
  295.           lea.l     newbpb(pc),a0
  296.           move.l    a0,hdvbpb
  297.           lea.l     newrw(pc),a0
  298.           move.l    a0,hdvrw
  299.           lea.l     newmed(pc),a0
  300.           move.l    a0,hdvmed
  301.           rts       
  302.  
  303.           .DC.b 'xbrarram'
  304. oldbpb:   .DS.l 1
  305.  
  306. newbpb:   
  307.           move.w    4(sp),d0
  308.           movea.l   oldbpb(pc),a0
  309.           lea.l     rdbpb(pc),a1
  310.           bra.s     chkdriv
  311.  
  312.           .DC.b 'xbrarram'
  313. oldrw:    .DS.l 1
  314.  
  315. newrw:    
  316.           move.w    14(sp),d0
  317.           movea.l   oldrw(pc),a0
  318.           lea.l     rdrw(pc),a1
  319.           bra.s     chkdriv
  320.  
  321.           .DC.b 'xbrarram'
  322. oldmed:   .DS.l 1
  323.  
  324. newmed:   
  325.           move.w    4(sp),d0
  326.           movea.l   oldmed(pc),a0
  327.           lea.l     rdmed(pc),a1
  328.  
  329. chkdriv:  
  330.           cmp.w     rdnum(pc),d0
  331.           bne.s     olddisk
  332.           jmp       (a1)
  333. olddisk:  
  334.           jmp       (a0)
  335.  
  336. rdrw:     
  337.           move.w    10(sp),d1
  338.           mulu.w    #$20,d1
  339.           movea.l   6(sp),a0
  340.           move.l    a0,d2
  341.           movea.l   rdstart(pc),a1
  342.           move.w    $c(sp),d0
  343.           mulu.w    #$200,d0
  344.           adda.l    d0,a1
  345.           tst.w     4(sp)
  346.           bne.s     rdwrite
  347.           exg.l     a1,a0
  348.           bra.s     dorw
  349. rdwrite:            ; Schreiben auf die Ramdisk
  350.           asl.l     #4,d1
  351.           move.l    a1,d0
  352.           add.l     d1,d0
  353.           asr.l     #4,d1
  354.           cmp.l     rdend(pc),d0
  355.           bgt.s     werror
  356.  
  357. dorw:     btst      #0,d2
  358.           bne.s     odd
  359.           subq.l    #1,d1
  360.  
  361. tlong:    
  362.           move.l    (a0)+,(a1)+
  363.           move.l    (a0)+,(a1)+
  364.           move.l    (a0)+,(a1)+
  365.           move.l    (a0)+,(a1)+
  366.           dbf       d1,tlong
  367.  
  368. rdmed:    clr.l     d0
  369.           rts       
  370. werror:   move.w    #-10,d0
  371.           rts       
  372.  
  373. odd:      asl.l     #2,d1
  374.           subq.l    #1,d1
  375. tbyte:    
  376.           move.b    (a0)+,(a1)+
  377.           move.b    (a0)+,(a1)+
  378.           move.b    (a0)+,(a1)+
  379.           move.b    (a0)+,(a1)+
  380.           dbf       d1,tbyte
  381.           bra       rdmed
  382.  
  383. rdbpb:    
  384.           lea.l     rambpb(pc),a0
  385.           move.l    a0,d0
  386.           rts       
  387.  
  388. rambpb:   
  389.           .DC.w $0200,$0002,$0400,$0007,$0005,$0006,$0012
  390. rdsize:   .DC.w 128
  391.           .DC.w $0001
  392.  
  393. rdnum:    .DC.w 3
  394.  
  395. rdrend:   
  396.  
  397. ; ***** Resetroutinen *****
  398.  
  399.           .DC.b 'xbrarram'
  400. oldvector:          .DS.l 1
  401.  
  402. newvector:          
  403.           move.l    phystop,d0
  404.           cmp.l     rdstart,d0
  405.           ble       resetdone
  406.           movea.l   d0,a1
  407.           move.w    rdsize,d1
  408.           mulu.w    #1024,d1
  409.           sub.l     d1,d0     ; d0 is Start of Copy
  410.           move.l    d0,d1
  411.           subi.l    #(rdrend-rdrstart),d1
  412.           sub.l     protect,d1
  413.           andi.l    #$fffff000,d1
  414.           move.l    d1,phystop
  415.           move.l    magic2,kmagic2
  416.           movea.l   rdend,a0
  417.           move.l    a1,rdend
  418.           move.l    d0,rdstart
  419. rette:              ; Kopiere Ramdisk
  420.           move.l    -(a0),-(a1)
  421.           cmp.l     a1,d0
  422.           blt.s     rette
  423.           lea.l     rdrstart,a0
  424.           movea.l   d1,a1
  425. rette1:             ; Kopiere Ramdiskroutinen
  426.           move.l    (a0)+,(a1)+
  427.           cmpa.l    #rdrend,a0
  428.           blt.s     rette1
  429.  
  430. resetdone:          
  431.           move.l    oldvalid,resvalid
  432.           move.l    oldvector,resvector
  433.           cmpi.w    #$9bcd,(a6)         ; Vorschlag aus ST Profibuch
  434.           beq       oldtos
  435.           jmp       (a6)
  436. oldtos:   
  437.           jmp       $24(a6)
  438.  
  439. ; ***** Parameter einlesen *****
  440.  
  441. param:    
  442. ; Lies Ramdiskgroesse
  443.           move.l    #sizestr,-(sp)
  444.           move.w    #cconws,-(sp)
  445.           trap      #gemdos
  446.           addq.l    #6,sp
  447.           bsr       input
  448.           bsr       getsize
  449.           tst.w     rdsize
  450.           beq       paramdone
  451.  
  452. ; Lies Ramdiskbuchstabe
  453.           move.l    #letterstr,-(sp)
  454.           move.w    #cconws,-(sp)
  455.           trap      #gemdos
  456.           addq.l    #6,sp
  457.           bsr       input
  458.           bsr       getletter
  459.  
  460. ; Frage, ob Ramdisk resetfest sein soll
  461.           move.l    #resetstr,-(sp)
  462.           move.w    #cconws,-(sp)
  463.           trap      #gemdos
  464.           addq.l    #6,sp
  465.           bsr       input
  466.           bsr       getreset
  467.  
  468. paramdone:          
  469.           rts       
  470.  
  471. ; Inputroutine
  472. input:    
  473.           movea.l   #line,a0
  474.           move.b    #16,(a0)
  475.           move.l    a0,-(sp)
  476.           move.w    #cconrs,-(sp)
  477.           trap      #gemdos
  478.           addq.l    #6,sp
  479.           rts       
  480.  
  481. ; Soll Ramdisk resetfest sein?
  482. getreset: 
  483.           move.w    #1,resetflag        ; Defaultwert
  484.           movea.l   #line,a0
  485.           tst.b     1(a0)
  486.           beq       getrdone
  487.           cmpi.b    #'n',2(a0)
  488.           beq       notreset
  489.           cmpi.b    #'N',2(a0)
  490.           bne       getrdone
  491. notreset: 
  492.           clr.w     resetflag
  493. getrdone: 
  494.           rts       
  495.  
  496. ; Lies Groesse ein
  497. getsize:  
  498.           movea.l   #line,a0
  499.           move.b    1(a0),d0
  500.           ext.w     d0
  501.           beq       getsdone
  502.           clr.w     d1
  503.           clr.w     d3
  504. getsloop: 
  505.           move.b    2(a0,d3.w),d2
  506.           subi.b    #'0',d2
  507.           bmi       getsend
  508.           cmpi.b    #9,d2
  509.           bgt       getsend
  510.           ext.w     d2
  511.           mulu.w    #10,d1
  512.           add.w     d2,d1
  513.           addi.w    #1,d3
  514.           cmp.w     d3,d0
  515.           bgt       getsloop
  516. getsend:  
  517.           move.w    d1,rdsize
  518. getsdone: 
  519.           rts       
  520.  
  521. ; Lies Buchstaben
  522. getletter:          
  523.           movea.l   #line,a0
  524.           tst.b     1(a0)
  525.           beq       getldone
  526.           move.b    2(a0),d0
  527.           ext.w     d0
  528.           cmpi.w    #'a',d0
  529.           bge       getlsmall
  530.           subi.w    #'A',d0
  531.           bra       getlcont
  532. getlsmall:          
  533.           subi.w    #'a',d0
  534. getlcont: 
  535.           cmpi.w    #15,d0
  536.           bgt       getldone
  537.           cmpi.w    #2,d0
  538.           blt       getldone
  539.           move.w    d0,rdnum
  540.           moveq.l   #1,d2
  541.           lsl.l     d0,d2
  542.           move.l    d2,rdbit
  543. getldone: 
  544.           rts       
  545.  
  546. ; ***** Einlesen der RAMDISK.INF Datei *****
  547.  
  548. getinf:   
  549. ; Oeffnen
  550.           move.w    #0,-(sp)  ; nur lesen
  551.           pea       inffile
  552.           move.w    #fopen,-(sp)
  553.           trap      #gemdos
  554.           addq.l    #8,sp
  555.           tst.w     d0
  556.           bmi       notexinf
  557.           move.w    d0,infhandle
  558.           move.l    #infstr,d0
  559.           bsr       print
  560.           move.w    #1,infflag
  561. getiloop: 
  562.           bsr       getline
  563.           cmpi.l    #'SIZE',command
  564.           bne       cont1
  565.           bsr       getsize
  566.           bra       getiloop
  567. cont1:    
  568.           cmpi.l    #'DISK',command
  569.           bne       cont2
  570. cont3:    
  571.           bsr       getletter
  572.           bra       getiloop
  573.           cmpi.l    #'DISC',command
  574.           beq       cont3
  575. cont2:    
  576.           cmpi.l    #'RESE',command
  577.           bne       cont4
  578.           bsr       getreset
  579.           bra       getiloop
  580. cont4:    
  581.           cmpi.l    #'LOAD',command
  582.           beq       getidone
  583.           tst.l     command
  584.           bne       getiloop
  585. getidone: 
  586.           rts       
  587.  
  588. notexinf: 
  589.           clr.w     infflag
  590.           rts       
  591.  
  592. ; ***** Zeile von RAMDISK.INF einlesen *****
  593. ; Die Zeile soll das Format haben:
  594. ; KOMM = PARAMETER
  595.  
  596. getline:  
  597. ; Loesche zunaechst Kommando und Kommandoparameter
  598.           clr.l     command
  599.           clr.w     line      ; zweites Byte in line ist Zaehler
  600.           move.l    #line,d0
  601.           addq.l    #2,d0
  602.           move.l    d0,nextpos
  603.           move.l    #command,nextcom
  604. blankloop:                    ; Ueberlies fuehrende Leerzeichen
  605.           bsr       getone
  606.           tst.w     d0
  607.           bmi       skipline
  608.           cmpi.w    #' ',d0
  609.           beq       blankloop
  610. commandloop:                  ; Lesen der ersten vier Buchstaben als Kommando
  611.           tst.w     d0
  612.           bmi       skipline  ; EOF oder EOLN
  613.           movea.l   nextcom,a0
  614.           move.b    d0,(a0)+
  615.           move.l    a0,nextcom
  616.           cmpa.l    #(command+4),a0
  617.           bge       equloop
  618.           bsr       getone
  619.           bra       commandloop
  620. equloop:            ; Lesen bis zum =
  621.           bsr       getone
  622.           tst.w     d0
  623.           bmi       skipline  ; Zeile oder File nach Kommando zuende
  624.           cmpi.w    #'=',d0
  625.           bne       equloop
  626. equloop1:           ; Ueberlesen von Leerzeichen
  627.           bsr       getone
  628.           tst.w     d0
  629.           bmi       linedone  ; Keine Parameter
  630.           cmpi.w    #' ',d0
  631.           beq       equloop1
  632. lineloop:           ; Einlesen der Kommandoparameter
  633.           cmpi.w    #EOF,d0
  634.           beq       linedone
  635.           cmpi.w    #EOLN,d0
  636.           beq       linedone
  637.           movea.l   nextpos,a0
  638.           move.b    d0,(a0)+
  639.           move.l    a0,nextpos
  640.           lea.l     line,a0
  641.           addi.b    #1,1(a0)
  642.           bsr       getone
  643.           cmpi.b    #64,1(a0)
  644.           blt       lineloop
  645. skiprest:           ; Zeile war zu lang
  646.           tst.w     d0
  647.           bmi       linedone
  648.           bsr       getone
  649.           bra       skiprest
  650. linedone: 
  651.           movea.l   nextpos,a0
  652.           clr.b     (a0)
  653.           rts       
  654. skipline: 
  655.           cmpi.w    #EOLN,d0
  656.           beq       getline
  657.           clr.l     command
  658.           rts       
  659.  
  660. getone:             ; Buchstaben einlesen und zu Grossbuchstaben machen
  661.           pea       puffer
  662.           move.l    #1,-(sp)
  663.           move.w    infhandle,-(sp)
  664.           move.w    #fread,-(sp)
  665.           trap      #gemdos
  666.           lea.l     12(sp),sp
  667.           tst.l     d0
  668.           bmi       eof
  669.           beq       eof
  670.           move.b    puffer,d0
  671.           ext.w     d0
  672.           cmpi.w    #13,d0
  673.           beq       eoln
  674.           cmpi.w    #10,d0
  675.           beq       blank
  676.           cmpi.w    #'a',d0
  677.           blt       getoneok
  678.           cmpi.w    #'z',d0
  679.           bgt       getoneok
  680.           subi.w    #('a'-'A'),d0
  681. getoneok: 
  682.           rts       
  683. eof:      
  684.           move.w    #EOF,d0
  685.           rts       
  686. eoln:     
  687.           move.w    #EOLN,d0
  688.           rts       
  689. blank:    
  690.           move.w    #' ',d0
  691.           rts       
  692.  
  693. ; ***** Schliessen von RAMDISK.INF *****
  694. closeinf: 
  695.           tst.w     infflag
  696.           beq       closedone
  697.           move.w    infhandle,-(sp)
  698.           move.w    #fclose,-(sp)
  699.           trap      #gemdos
  700.           addq.l    #4,sp
  701. closedone:          
  702.           rts       
  703.  
  704. ; ***** Kopieren von Dateien *****
  705.  
  706. copy:     
  707. ; DTA setzen
  708.           pea       dta
  709.           move.w    #fsetdta,-(sp)
  710.           trap      #gemdos
  711.           addq.l    #6,sp
  712. copyloop: 
  713.           tst.l     command
  714.           beq       copydone
  715.           move.l    #kopstr,d0
  716.           bsr       print
  717.           tst.b     line+1
  718.           beq       copycont
  719.           cmpi.l    #'LOAD',command
  720.           bne       copycont
  721. ; Setze Diskette und Pfad, speichere Filenamen
  722.           bsr       setpath
  723. ; Suche File
  724.           clr.w     -(sp)
  725.           move.l    filename,-(sp)
  726.           move.w    #fsfirst,-(sp)
  727.           trap      #gemdos
  728.           addq.l    #8,sp
  729.           tst.w     d0
  730.           bmi       notfound
  731. ; open file
  732. loadit:   
  733.           move.l    #dname,d0
  734.           bsr       print
  735.           move.l    #commastr,d0
  736.           bsr       print
  737.           move.w    #0,-(sp)
  738.           move.l    #dname,-(sp)
  739.           move.w    #fopen,-(sp)
  740.           trap      #gemdos
  741.           addq.l    #8,sp
  742.           tst.w     d0
  743.           bmi       copycont
  744.           move.w    d0,copyhandle
  745. ; Besorge Speicherplatz in der Länge des Files
  746.           move.l    dlaenge,-(sp)
  747.           move.w    #malloc,-(sp)
  748.           trap      #gemdos
  749.           addq.l    #6,sp
  750.           tst.l     d0
  751.           beq       closeit
  752.           move.l    d0,copyadr
  753. ; Lies File in Speicher
  754.           move.l    copyadr,-(sp)
  755.           move.l    dlaenge,-(sp)
  756.           move.w    copyhandle,-(sp)
  757.           move.w    #fread,-(sp)
  758.           trap      #gemdos
  759.           lea.l     12(sp),sp
  760. ; Schliesse File
  761. closeit:  
  762.           move.w    copyhandle,-(sp)
  763.           move.w    #fclose,-(sp)
  764.           trap      #gemdos
  765.           addq.l    #4,sp
  766. ; Setze Drive auf Ramdisk
  767.           move.w    rdnum,-(sp)
  768.           move.w    #dsetdrv,-(sp)
  769.           trap      #gemdos
  770.           addq.l    #4,sp
  771. ; Oeffne Output Datei
  772.           clr.w     -(sp)
  773.           move.l    #dname,-(sp)
  774.           move.w    #fcreate,-(sp)
  775.           trap      #gemdos
  776.           addq.l    #8,sp
  777.           tst.w     d0
  778.           bmi       copyerror
  779.           move.w    d0,copyhandle
  780. ; Schreibe File auf Ramdisk
  781.           move.l    copyadr,-(sp)
  782.           move.l    dlaenge,-(sp)
  783.           move.w    copyhandle,-(sp)
  784.           move.w    #fwrite,-(sp)
  785.           trap      #gemdos
  786.           lea.l     12(sp),sp
  787.           cmp.l     dlaenge,d0
  788.           bne       copyerror
  789. ; Schliesse File wieder
  790.           move.w    copyhandle,-(sp)
  791.           move.w    #fclose,-(sp)
  792.           trap      #gemdos
  793.           addq.l    #4,sp
  794. ; Gib Speicher frei
  795.           move.l    copyadr,-(sp)
  796.           move.w    #mfree,-(sp)
  797.           trap      #gemdos
  798.           addq.l    #6,sp
  799. ; Setze Drive zurueck
  800.           move.w    aktnum,-(sp)
  801.           move.w    #dsetdrv,-(sp)
  802.           trap      #gemdos
  803.           addq.l    #4,sp
  804. ; Suche nach noch einem File mit gleicher Maske
  805.           move.w    #fsnext,-(sp)
  806.           trap      #gemdos
  807.           addq.l    #2,sp
  808.           tst.w     d0
  809.           bge       loadit
  810. copycont: 
  811.           bsr       getline
  812.           bra       copyloop
  813. copydone: 
  814.           rts       
  815. notfound: 
  816.           move.l    #notfstr,d0
  817.           bsr       print
  818.           bra       copycont
  819. copyerror:          
  820.           move.l    #copyestr,d0
  821.           bsr       print
  822.           rts       
  823.  
  824. ; ***** Setze Pfad *****
  825. ; Der komplette Zugriffspfad liegt in line+2, Laenge in line+1
  826. setpath:  
  827.           move.b    line+1,d0
  828.           ble       setpdone
  829. ; Evtl. Diskette setzen
  830.           move.b    line+3,d0
  831.           cmpi.b    #':',d0
  832.           bne       nodisk
  833.           move.b    line+2,d0
  834.           subi.b    #'A',d0
  835.           ext.w     d0
  836.           move.w    d0,aktnum
  837.           move.w    d0,-(sp)
  838.           move.w    #dsetdrv,-(sp)
  839.           trap      #gemdos
  840.           addq.l    #4,sp
  841.           bra       diskdone
  842. nodisk:   
  843.           clr.w     aktnum
  844.           move.w    #0,-(sp)
  845.           move.w    #dsetdrv,-(sp)
  846.           trap      #gemdos
  847.           addq.l    #4,sp
  848. diskdone: 
  849.           move.b    line+1,d0
  850.           ext.w     d0
  851.           ext.l     d0
  852.           lea.l     line+2,a0
  853.           adda.l    d0,a0
  854.           movea.l   #(filenp+64),a1
  855.           clr.w     -(a1)
  856. setpnameloop:       
  857.           move.b    -(a0),d0
  858.           move.b    d0,-(a1)
  859.           cmpi.b    #'\',d0
  860.           beq       nameend
  861.           cmpi.b    #':',d0
  862.           beq       nameend
  863.           cmpa.l    #(line+1),a0
  864.           bgt       setpnameloop
  865. nameend:  
  866.           move.l    a1,d1
  867.           addq.l    #1,d1
  868.           move.l    d1,filename
  869.           cmpa.l    #(line+1),a0
  870.           beq       nopath
  871.           cmpi.b    #'\',d0
  872.           bne       nopath
  873.           clr.b     1(a0)
  874.           clr.b     2(a0)
  875.           bra       path
  876. nopath:   
  877.           pea       defaultpath
  878.           bra       path1
  879. ; Pfad setzen
  880. path:     
  881.           pea       line+2
  882. path1:    
  883.           move.w    #dsetpath,-(sp)
  884.           trap      #gemdos
  885.           addq.l    #6,sp
  886. setpdone: 
  887.           rts       
  888.  
  889.  
  890. ; ***** Gib String aus *****
  891. print:    
  892.           tst.w     printflag
  893.           beq       noprint
  894.           move.l    d0,-(sp)
  895.           move.w    #cconws,-(sp)
  896.           trap      #gemdos
  897.           addq.l    #6,sp
  898. noprint:  
  899.           rts       
  900.  
  901.  
  902.           .DATA 
  903.  
  904. errormeld:          
  905.           .DC.b 13,10,'Ramdisk konnte nicht installiert werden.',13,10,0,0
  906.           .EVEN 
  907. sizestr:  
  908.           .DC.b 13,10,'Größe (Kbyte): ',0,0
  909.           .EVEN 
  910. letterstr:          
  911.           .DC.b 13,10,'Buchstabe (a,...):           ',0,0
  912.           .EVEN 
  913. resetstr: 
  914.           .DC.b 13,10,'Reset resident (y/n):     ',0,0
  915.           .EVEN 
  916. meldstr:  
  917.           .DC.b 13,10,'Ramdisk von R. Grothmann',0,0
  918.           .EVEN 
  919. notinststr:         
  920.           .DC.b 13,10,'Ramdisk konnte nicht installiert werden',0,0
  921.           .EVEN 
  922. copystr:  
  923.           .DC.b ' kopiert',0,0
  924.           .EVEN 
  925. crstr:    
  926.           .DC.b 13,10,0,0
  927. infstr:   
  928.           .DC.b 13,10,'RAMDISK.INF gefunden',0,0
  929.           .EVEN 
  930. kopstr:   
  931.           .DC.b 13,10,'LOAD = ',0,0
  932.           .EVEN 
  933. notfstr:  
  934.           .DC.b ' nicht gefunden',0,0
  935.           .EVEN 
  936. copyestr: 
  937.           .DC.b 13,10,'Copy Fehler !!!',0,0
  938.           .EVEN 
  939. commastr: 
  940.           .DC.b ',',0,0
  941.           .EVEN 
  942. eststr:   
  943.           .DC.b 13,10,'Ramdisk wiedergefunden.',0,0
  944.           .EVEN 
  945.  
  946. defaultpath:        
  947.           .DC.b '\',0,0
  948.           .EVEN 
  949.  
  950.           .BSS 
  951.  
  952. dta:      .DS.b 21
  953. dattrib:  .DS.b 1
  954. dtime:    .DS.w 1
  955. ddate:    .DS.w 1
  956. dlaenge:  .DS.l 1
  957. dname:    .DS.b 14
  958.  
  959. oldvalid: .DS.l 1
  960. oldbus:   .DS.l 1
  961. adrinstall:         .DS.l install
  962.  
  963. size:     .DS.l 1
  964.  
  965. flag:     .DS.w 1
  966. sucheflag:          .DS.w 1
  967. resetflag:          .DS.w 1
  968. infflag:  .DS.w 1
  969.  
  970. infhandle:          .DS.w 1
  971. copyhandle:         .DS.w 1
  972.  
  973. command:  .DS.l 1
  974. line:     .DS.b 70
  975. filenp:   .DS.b 70
  976. puffer:   .DS.b 16
  977. aktnum:   .DS.w 1
  978.  
  979. nextcom:  .DS.l 1
  980. nextpos:  .DS.l 1
  981.  
  982. copyadr:  .DS.l 1
  983. filename: .DS.l 1
  984.  
  985.           .DS.l $100
  986. stack:    
  987.  
  988.           .END 
  989.  
  990.