home *** CD-ROM | disk | FTP | other *** search
-
- *
- * Maxon C++:
- *
- * Library-Modul "dosbase"
- *
- * Jens Gelhar 19.03.93, 31.08.93, 08.04.94
- *
-
- xdef _INIT_1__Crunchy__fRoG,_EXIT_1__cRunchY__FrOg
- xdef _DosBase,_DOSBase
- xdef _exit,exit__i,abort__STANDARD,_errno
- xdef _Filehandle__Std__Input,_Filehandle__Std__Output,_FileHandle__Std__Error
- xdef _cout,_cin,_cerr,_clog
- xdef _std__in,_std__out,_std__err
- xdef __Writefile,__Writefile__NoBuf
-
- xref __Writeflag,__CleanUp,main_,_wbmain
-
- _SysBase = 4
-
- RemTask = -288
- CloseLibrary = -414
- OpenLibrary = -552
-
- Write = -48
- Input = -54
- Output = -60
-
- ; * stream:
- rsreset
- str_fh: rs.l 1 ; 0 L Filehandle
- str_ungetch: rs.b 1 ; 4 B Flag: Zeichen im "unget"-Buffer?
- rs.b 1 ; 5 B ebenjenes Zeichen
- str_mode: rs.b 1 ; 6 B Zugriffsmodus: 1 = read, 2 = write, 3 = rw
- str_error: rs.b 1 ; 7 B str_error
- str_bufptr: rs.l 1 ; 8 L Zeiger auf Buffer-Struct
- str_flags: rs.b 1 ; 12 B Bit 7: freemem-Flag, 6: closefile-Flag
-
- buf_write = 16
-
- _INIT_1__Crunchy__fRoG:
- moveq #12,d0 ; Returncode + 2 Parameter-LW
- add.l a7,d0
- movem.l d1-d3/a0/a4/a6,-(a7)
- lea _DosBase,a4
- move.l d0,returnstack-_DosBase(a4)
- move.l _SysBase.w,a6
- clr.l _errno-_DosBase(a4)
- lea DosLibName(pc),a1
- moveq #0,d0
- jsr OpenLibrary(a6)
- move.l d0,(a4)
- beq Panic
- move.l d0,a6
- jsr Input(a6)
- move.l d0,_Filehandle__Std__Input-_DosBase(a4)
- clr.w _std__in+str_ungetch-_DosBase(a4)
- clr.l _std__in+str_bufptr-_DosBase(a4)
- jsr Output(a6)
- move.l d0,_Filehandle__Std__Output-_DosBase(a4)
- move.l d0,_FileHandle__Std__Error-_DosBase(a4)
- clr.w _std__out+str_ungetch-_DosBase(a4)
- clr.l _std__out+str_bufptr-_DosBase(a4)
- clr.w _std__err+str_ungetch-_DosBase(a4)
- clr.l _std__err+str_bufptr-_DosBase(a4)
- movem.l (a7)+,d1-d3/a0/a4/a6
- rts
-
- _EXIT_1__cRunchY__FrOg:
- movem.l d0-d1/a0-a1/a6,-(a7)
- move.l _DosBase,d0
- beq.b .exit
- move.l _SysBase.w,a6
- move.l d0,a1
- jsr CloseLibrary(a6)
- .exit movem.l (a7)+,d0-d1/a0-a1/a6
- rts
-
- __Writefile: ; stream a0, Daten d2..d3, d0 <> 0 bei Fehler
- clr.w str_ungetch(a0)
- tst.l str_bufptr(a0)
- beq.b __Writefile__NoBuf
- ; in Puffer schreiben:
- move.l str_bufptr(a0),a0
- move.l buf_write(a0),a6
- jmp (a6)
- __Writefile__NoBuf:
- btst #1,str_mode(a0)
- beq.b wrMurx
- move.l #__Writeflag,d0
- beq.b wr2
- btst #6,str_flags(a0)
- bne.b wr2
- cmp.l cerr_base,a0
- beq.b wr1
- cmp.l cout_base,a0
- bne.b wr2
- wr1 move.l d0,a0
- jsr (a0)
- wrok moveq #0,d0
- rts
- wr2 ; "normale" Datei:
- ; ganz brav in File schieben:
- move.l (a0),d1
- beq.b wrMurx
- move.l _DosBase,a6
- jsr Write(a6)
- tst.l d0
- bpl.b wrok
- wrMurx moveq #-1,d0
- rts
-
- Panic: ; Esoterischer Fall: dosbase konnte nicht geƶffnet werden
- move.l _SysBase.w,a6
- sub.l a1,a1
- jmp RemTask(a6) ; Task entfernen
-
- abort__STANDARD:
- moveq #0,d0
- bra.b cool_babe
- _exit:
- exit__i:
- jsr __CleanUp
- move.l 4(a7),d0
- cool_babe
- move.l returnstack,a7
- rts
-
- DosLibName: dc.b 'dos.library',0
-
- SECTION D,DATA
-
- _DOSBase:
- _DosBase: dc.l 0
- returnstack: blk.l 1
-
- _cin: dc.l cin_base
- dc.b 1,0
- cin_base: dc.l _std__in
- dc.b 10,1,2,3
- _std__in:
- _Filehandle__Std__Input: dc.l 0
- blk.w 1
- dc.b 1,0
- dc.l 0
- dc.b 0
- even
-
- _cout: dc.l cout_base
- dc.b 1,0
- cout_base: dc.l _std__out
- dc.b 10,1,2,3
- _std__out:
- _Filehandle__Std__Output: dc.l 0
- blk.w 1
- dc.b 2,0
- dc.l 0
- dc.b 0
- even
-
- _cerr:
- _clog: dc.l cerr_base
- dc.b 0,0
- cerr_base: dc.l _std__err
- dc.b 10,1,2,3
- _std__err:
- _FileHandle__Std__Error: dc.l 0
- blk.w 1
- dc.b 2,0
- dc.l 0
- dc.b 0
- even
-
- _errno: blk.l 1
-
- end
-