home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC6.DMS / in.adf / libsrc.lha / LIBSRC / dosbase.asm < prev    next >
Encoding:
Assembly Source File  |  1994-04-08  |  3.3 KB  |  178 lines

  1.  
  2. *
  3. * Maxon C++:
  4. *
  5. * Library-Modul "dosbase"
  6. *
  7. * Jens Gelhar 19.03.93, 31.08.93, 08.04.94
  8. *
  9.  
  10.     xdef    _INIT_1__Crunchy__fRoG,_EXIT_1__cRunchY__FrOg
  11.     xdef    _DosBase,_DOSBase
  12.     xdef    _exit,exit__i,abort__STANDARD,_errno
  13.     xdef    _Filehandle__Std__Input,_Filehandle__Std__Output,_FileHandle__Std__Error
  14.     xdef    _cout,_cin,_cerr,_clog
  15.     xdef    _std__in,_std__out,_std__err
  16.     xdef    __Writefile,__Writefile__NoBuf
  17.  
  18.     xref    __Writeflag,__CleanUp,main_,_wbmain
  19.  
  20. _SysBase    = 4
  21.  
  22. RemTask    = -288
  23. CloseLibrary    = -414
  24. OpenLibrary    = -552
  25.  
  26. Write    = -48
  27. Input    = -54
  28. Output    = -60
  29.  
  30.     ; * stream:
  31.     rsreset
  32. str_fh:        rs.l    1    ; 0 L Filehandle
  33. str_ungetch:    rs.b    1    ; 4 B Flag: Zeichen im "unget"-Buffer?
  34.         rs.b    1    ; 5 B ebenjenes Zeichen
  35. str_mode:    rs.b    1    ; 6 B Zugriffsmodus: 1 = read, 2 = write, 3 = rw
  36. str_error:    rs.b    1    ; 7 B str_error
  37. str_bufptr:    rs.l    1    ; 8 L Zeiger auf Buffer-Struct
  38. str_flags:    rs.b    1    ; 12 B Bit 7: freemem-Flag, 6: closefile-Flag
  39.  
  40. buf_write    = 16
  41.  
  42. _INIT_1__Crunchy__fRoG:
  43.     moveq    #12,d0    ; Returncode + 2 Parameter-LW
  44.     add.l    a7,d0
  45.     movem.l    d1-d3/a0/a4/a6,-(a7)
  46.     lea    _DosBase,a4
  47.     move.l    d0,returnstack-_DosBase(a4)
  48.     move.l    _SysBase.w,a6
  49.     clr.l    _errno-_DosBase(a4)
  50.     lea    DosLibName(pc),a1
  51.     moveq    #0,d0
  52.     jsr    OpenLibrary(a6)
  53.     move.l    d0,(a4)
  54.     beq    Panic
  55.     move.l    d0,a6
  56.     jsr    Input(a6)
  57.     move.l    d0,_Filehandle__Std__Input-_DosBase(a4)
  58.     clr.w    _std__in+str_ungetch-_DosBase(a4)
  59.     clr.l    _std__in+str_bufptr-_DosBase(a4)
  60.     jsr    Output(a6)
  61.     move.l    d0,_Filehandle__Std__Output-_DosBase(a4)
  62.     move.l    d0,_FileHandle__Std__Error-_DosBase(a4)
  63.     clr.w    _std__out+str_ungetch-_DosBase(a4)
  64.     clr.l    _std__out+str_bufptr-_DosBase(a4)
  65.     clr.w    _std__err+str_ungetch-_DosBase(a4)
  66.     clr.l    _std__err+str_bufptr-_DosBase(a4)
  67.     movem.l    (a7)+,d1-d3/a0/a4/a6
  68.     rts
  69.  
  70. _EXIT_1__cRunchY__FrOg:
  71.     movem.l    d0-d1/a0-a1/a6,-(a7)
  72.     move.l    _DosBase,d0
  73.     beq.b    .exit
  74.     move.l    _SysBase.w,a6
  75.     move.l    d0,a1
  76.     jsr    CloseLibrary(a6)
  77. .exit    movem.l    (a7)+,d0-d1/a0-a1/a6
  78.     rts
  79.  
  80. __Writefile:    ; stream a0, Daten d2..d3, d0 <> 0 bei Fehler
  81.     clr.w    str_ungetch(a0)
  82.     tst.l    str_bufptr(a0)
  83.     beq.b    __Writefile__NoBuf
  84.     ; in Puffer schreiben:
  85.     move.l    str_bufptr(a0),a0
  86.     move.l    buf_write(a0),a6
  87.     jmp    (a6)
  88. __Writefile__NoBuf:
  89.     btst    #1,str_mode(a0)
  90.     beq.b    wrMurx
  91.     move.l    #__Writeflag,d0
  92.     beq.b    wr2
  93.     btst    #6,str_flags(a0)
  94.     bne.b    wr2
  95.     cmp.l    cerr_base,a0
  96.     beq.b    wr1
  97.     cmp.l    cout_base,a0
  98.     bne.b    wr2
  99. wr1    move.l    d0,a0
  100.     jsr    (a0)
  101. wrok    moveq    #0,d0
  102.     rts
  103. wr2    ; "normale" Datei:
  104.     ; ganz brav in File schieben:
  105.     move.l    (a0),d1
  106.     beq.b    wrMurx
  107.     move.l    _DosBase,a6
  108.     jsr    Write(a6)
  109.     tst.l    d0
  110.     bpl.b    wrok
  111. wrMurx    moveq    #-1,d0
  112.     rts
  113.  
  114. Panic:    ; Esoterischer Fall: dosbase konnte nicht geƶffnet werden
  115.     move.l    _SysBase.w,a6
  116.     sub.l    a1,a1
  117.     jmp    RemTask(a6)         ; Task entfernen
  118.  
  119. abort__STANDARD:
  120.     moveq    #0,d0
  121.     bra.b    cool_babe
  122. _exit:
  123. exit__i:
  124.     jsr    __CleanUp
  125.     move.l    4(a7),d0
  126. cool_babe
  127.     move.l returnstack,a7
  128.     rts
  129.  
  130. DosLibName:    dc.b 'dos.library',0
  131.  
  132.     SECTION D,DATA
  133.  
  134. _DOSBase:
  135. _DosBase:    dc.l 0
  136. returnstack:    blk.l 1
  137.  
  138. _cin:    dc.l cin_base
  139.     dc.b 1,0
  140. cin_base:    dc.l _std__in
  141.     dc.b 10,1,2,3
  142. _std__in:
  143. _Filehandle__Std__Input:    dc.l 0
  144.     blk.w 1
  145.     dc.b 1,0
  146.     dc.l 0
  147.     dc.b 0
  148.     even
  149.  
  150. _cout:    dc.l cout_base
  151.     dc.b 1,0
  152. cout_base:    dc.l _std__out
  153.     dc.b 10,1,2,3
  154. _std__out:
  155. _Filehandle__Std__Output:    dc.l 0
  156.     blk.w 1
  157.     dc.b 2,0
  158.     dc.l 0
  159.     dc.b 0
  160.     even
  161.  
  162. _cerr:
  163. _clog:    dc.l cerr_base
  164.     dc.b 0,0
  165. cerr_base:    dc.l _std__err
  166.     dc.b 10,1,2,3
  167. _std__err:
  168. _FileHandle__Std__Error:    dc.l 0
  169.     blk.w 1
  170.     dc.b 2,0
  171.     dc.l 0
  172.     dc.b 0
  173.     even
  174.  
  175. _errno:    blk.l 1
  176.  
  177.     end
  178.