        opt      l-
        SECTION  TERMINAL_plus_XPRZMODEMSHELL,CODE
	incdir   "include/"             ;devpac/oma
	include	 "exec/exec_lib.i"      ;Gellermann in 1990.
        include  "intuition/intuition.i"
        include  "intuition/intuition_lib.i"
        include  "libraries/dos_lib.i"
	include	 "libraries/dosextens.i"
        include  "devices/serial.i"
        include  "devices/timer.i"
        include  "graphics/graphics_lib.i"
        include  "graphics/text.i"

;---------------------------------------WB-Startup-Code "damit von der WB hehe"
	movem.l	 d0/a0,-(sp)		;rette Kommandozeile
	clr.l	 _WBenchMsg		;sicherheitshalber
	sub.l	 a1,a1			;a1=0 = eigener Task
	CALLEXEC FindTask		;wo sind wir?
	move.l	 d0,a4			;Adresse retten
	tst.l	 pr_CLI(a4)             ;Laufen wir unter WB?
	beq.s	 fromWB         	;wenn so
	movem.l	 (sp)+,d0/a0		;Parms Kommandozeile holen
	bra	 run    		;und starten
fromWB  lea	 pr_MsgPort(a4),a0
	CALLEXEC WaitPort		;Warte auf Start-Message
	lea	 pr_MsgPort(a4),a0	;sie ist da
	CALLEXEC GetMsg			;hole sie
	move.l	 d0,_WBenchMsg		;immer Msg sichern!
	movem.l	 (sp)+,d0/a0		;bringe Stack i.O.
run	bsr.s	 _main			;rufe unser Programm auf
	move.l	 d0,-(sp)		;rette seinen Return-Code
	tst.l	 _WBenchMsg             ;gibt's eine WB-Message
	beq.s	 _exit			;nein: dann war's CLI
	CALLEXEC Forbid			;keine Unterbrechung jetzt
	move.l	 _WBenchMsg(pc),a1	;hole die Message
	CALLEXEC ReplyMsg		;und gib sie zurueck
_exit   move.l	 (sp)+,d0		;hole Return-Code
	rts				;das war's
_WBenchMsg	 ds.l	1
	cnop	  0,4
;---------------------------------------------------------------------               
PRINT	macro		; Macro zur Ausgabe eines Textes
	move	#\1,d0	;:ganz stolz: mein erster, wenn auch gerippter MACRO!
	move	#\2,d1	
	move.l	UDwindowptr,a1
	move.l	wd_RPort(a1),a1
	CALLGRAF Move		
	move	#\3,d0	
	move.l	UDwindowptr,a1
	move.l	wd_RPort(a1),a1
	CALLGRAF SetAPen
	lea	\4,a0	
	move.l	#\5,d0	
	move.l	UDwindowptr,a1		
	move.l	wd_RPort(a1),a1	
	CALLGRAF Text
	endm
;---------------------------------------------------------------------
_main
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

;----------------------------------LIBS OEFFNEN

        moveq    #0,d0
        lea      int_name(pc),a1
        CALLEXEC OpenLibrary
        tst.l    d0
        beq      EXIT
        lea      _IntuitionBase(pc),a0
        move.l   d0,(a0)

        moveq    #0,d0
        lea      dos_name(pc),a1
        CALLEXEC OpenLibrary
        tst.l    d0
        beq      ClInt
        lea      _DOSBase(pc),a0
        move.l   d0,(a0)

        moveq    #0,d0
        lea      graf_name(pc),a1
        CALLEXEC OpenLibrary
        tst.l    d0
        beq      ClDos
        lea      _GfxBase(pc),a0
        move.l   d0,(a0)

        moveq    #0,d0
        lea      xpr_name(pc),a1
        CALLEXEC OpenLibrary
        tst.l    d0
        beq      ClGraf
        lea      _XPRBase(pc),a0
        move.l   d0,(a0)

;----------------------------------DEVICES OEFFNEN

        sub.l    a1,a1             ;Replyport einrichten
        CALLEXEC FindTask          ;eigenen Task eintragen
        lea      SerReply,a1
        move.l   d0,MP_SIGTASK(a1) 
        CALLEXEC AddPort           ;reply (message-)port einrichten
        lea      SerIO,a1          ;IOExtSer Struktur
        clr.l    d0         
        clr.l    d1
        move.b   #$B4,IO_SERFLAGS(a1) ;set radboogie,7wire,(shared=b4)
        lea      ser_name,a0
        CALLEXEC OpenDevice
        tst.l    d0
        bne      ClXpr

        sub.l    a1,a1
        CALLEXEC FindTask
        lea      TimeReply,a1
        move.l   d0,MP_SIGTASK(a1)
        CALLEXEC AddPort
        lea      TimeIO,a1
        move.l   #UNIT_MICROHZ,d0
        clr.l    d1
        lea      timer_name,a0
        CALLEXEC OpenDevice
        tst.l    d0
        bne      ClSer
 
        lea      windowdef(pc),a0  ;CON: braucht zusaetzlich
        CALLINT  OpenWindow        ;ein window, dem es zugeordnet
        tst.l    d0                ;wird.
        beq      ClTimer           ;
        move.l   d0,windowptr      ;

        sub.l    a1,a1
        CALLEXEC FindTask
        lea      ConReply,a1
        move.l   d0,MP_SIGTASK(a1)
        CALLEXEC AddPort
        lea      ConIO,a1
        move.l   windowptr,IO_DATA(a1) ;CON: diesem fenster zugeordnet
        move.l   #48,IO_LENGTH(a1)     ;48 = laenge windowdef
        clr.l    d0
        clr.l    d1
        lea      con_name,a0
        CALLEXEC OpenDevice
        tst.l    d0
        bne      ClWdw

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        bsr      TERMINAL
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

ClCon                        ;ALLES BEENDEN
        lea      ConIO,a1
        CALLEXEC CloseDevice
ClWdw
        lea      ConReply,a1
        CALLEXEC RemPort
        move.l   windowptr,a0
        CALLINT  CloseWindow        
ClTimer
        lea      TimeIO,a1
        CALLEXEC CloseDevice
ClSer
        lea      TimeReply,a1
        CALLEXEC RemPort
        lea      SerIO,a1
        CALLEXEC CloseDevice
ClXpr
        lea      SerReply,a1
        CALLEXEC RemPort
        move.l   _XPRBase,a1
        CALLEXEC CloseLibrary
ClGraf
        move.l   _GfxBase,a1
        CALLEXEC CloseLibrary
ClDos
        move.l   _DOSBase,a1
        CALLEXEC CloseLibrary
ClInt
        move.l   _IntuitionBase,a1
        CALLEXEC CloseLibrary
EXIT                               ;PROGRAMMENDE
        move.l  #0,d0              ;Return Code 0 = OK
        rts

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
TERMINAL

m0
        bsr      xpr_squery                 ;wieviele bytes eingetrudelt?
        cmpi.l   #2000,d0
        bcs      m8  ;d0 kleiner pufferlaenge
        move.l   #2000,d0 ;wenn ueber 2000
m8       
        move.l   d0,Dnull                   
        tst.l    d0
        bne      m9
        move.l   #1,Dnull                   ;wenn 0 dann 1 byte anfordern.
m9
        lea      SerIO,a1                   ;post SER:readrequest for X byte
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #CMD_READ,IO_COMMAND(a1)
        move.l   Dnull,IO_LENGTH(a1)
        move.l   #SerPuff,IO_DATA(a1)
        CALLEXEC SendIO

        lea      ConIO,a1                   ;post CON:readrequest for 1 byte
        move.l   #ConReply,MN_REPLYPORT(a1)
        move.w   #CMD_READ,IO_COMMAND(a1)
        move.l   #1,IO_LENGTH(a1)
        move.l   #ConPuff,IO_DATA(a1)
        CALLEXEC SendIO

m1
        clr.l    d0                         ;gehe schlafen, bis einer der
        clr.l    d1                         ;beiden readrequests 
        lea      SerReply,a1                ;erfuellt wird (1000% multitask) 
        move.b   MP_SIGBIT(a1),d1
        bset.l   d1,d0
        lea      ConReply,a1
        move.b   MP_SIGBIT(a1),d1
        bset.l   d1,d0
        CALLEXEC Wait
 
        lea      ConIO,a1     ;taste?
        CALLEXEC CheckIO
        beq      m2           ;nein
        CALLEXEC WaitIO       ;cleanup con

        lea      SerIO,a1   ;serrequest abbrechen
        CALLEXEC AbortIO
        lea      SerIO,a1
        CALLEXEC WaitIO       ;cleanup

        cmp.b    #"å",ConPuff
        bne      m001
        rts      ;exit
m001
        cmp.b    #"ð",ConPuff
        bne      m002
        bsr      Download
m002
        cmp.b    #"µ",ConPuff
        bne      m003
        bsr      Upload
m003        

        lea      SerIO,a1   ;den Tastenwert ins modem
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #CMD_WRITE,IO_COMMAND(a1)
        move.l   #1,IO_LENGTH(a1)
        move.l   #ConPuff,IO_DATA(a1)
        CALLEXEC DoIO

        bra      m0

m2
        lea      SerIO,a1
        CALLEXEC CheckIO      ;war es der SerReq?
        beq      m1           ;nein
        CALLEXEC WaitIO       ;cleanup serial

        lea      ConIO,a1     ;Conrequest abbrechen
        CALLEXEC AbortIO
        lea      ConIO,a1
        CALLEXEC WaitIO       ;cleanup

        lea      ConIO,a1     ;X serielle bytes ins fenster
        move.l   #ConReply,MN_REPLYPORT(a1)
        move.w   #CMD_WRITE,IO_COMMAND(a1)
        move.l   Dnull,IO_LENGTH(a1)
        move.l   #SerPuff,IO_DATA(a1)
        CALLEXEC DoIO

        bra      m0

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Download

        lea      XPR_IO,a0
        move.l   #iname,(a0)
        move.l   _XPRBase,a6
        jsr      -36(a6)            ;Setup

        lea      UDwindowdef(pc),a0
        CALLINT  OpenWindow
        tst.l    d0
        move.l   d0,UDwindowptr

        lea      XPR_IO,a0          ;xprz lib routine anspringen
        move.l   _XPRBase,a6
        jsr      -48(a6)            ;Download

        move.l   UDwindowptr,a0
        CALLINT  CloseWindow        

;wenn d/l success war ist nun in register d0=1, wenn fail d0=0

        lea      XPR_IO,a0
        move.l   _XPRBase,a6
        jsr      -30(a6)            ;Cleanup

        rts

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Upload

        lea      XPR_IO,a0
        move.l   #iname,(a0)
        move.l   _XPRBase,a6
        jsr      -36(a6)            ;Setup

        move.l   #connam,d1         ;welles file
        move.l   #MODE_OLDFILE,d2           
        CALLDOS  Open
        move.l   d0,conhandle
        move.l   d0,d1             
        move.l   #cname,d2
        move.l   #70,d3
        CALLDOS  Read
        lea      cname,a0
        subq.b   #1,d0
        move.b   #0,(a0,d0)         ;null am ende
        move.l   conhandle,d1
        CALLDOS  Close
         
        lea      UDwindowdef(pc),a0
        CALLINT  OpenWindow
        tst.l    d0
        move.l   d0,UDwindowptr

        lea      cname,a1
        lea      XPR_IO,a0
        move.l   a1,(a0)            ;xpr_filename
        move.l   _XPRBase,a6
        jsr      -42(a6)            ;Upload

        move.l   UDwindowptr,a0
        CALLINT  CloseWindow        

; wenn d0=1 successful upload  , wenn d0=0 dann fail

        lea      XPR_IO,a0
        move.l   _XPRBase,a6
        jsr      -30(a6)            ;Cleanup

        rts

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
          cnop 0,4
connam    dc.b "CON:10/150/620/30/......enter full u/l path, man.....",0
          cnop 0,4
conhandle dc.l 0
          cnop 0,4
iname     dc.b "TN, ON, RN, AY, KY, SN, DN, F0, Pdh0:empty/, B64",0
cname     ds.b 80 ;               download path: ^^^^^^^^^^
          cnop 0,4
SerPuff   ds.b 2001
          cnop 0,4
ConPuff   ds.b 100
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;--------------------------------------XPR CALLBACK ROUTINEN--------------
; das sind  externe routinen, die XPR-library anspringt, und ICH, Knecht
; extra schreiben muss weil von einer lib aus
; keine anderen libs aufgerufen werden sollten..(dosroutinen) oder fenster
; geoeffnet etc.
;
;----------------------------------xpr_open
xpr_fopen       ;dont use standard c-compiler routines...not fast enough
                ;for isdn... just include the standard xpr_f`s
	MOVE.L	A0,D1
	CMP.B	#"r",(A1)
	BNE.S   fopen1
	MOVE.L	#$3ED,D2
fopen1
        CMP.B	#"w",(A1)
	BNE.S   fopen2
	MOVE.L	#$3EE,D2
fopen2
        CMP.B	#"a",(A1)
	BNE.S   fopen3
	MOVE.L	#$3EC,D2
fopen3
        CALLDOS Open
	RTS
;----------------------------------xpr_fclose
xpr_fclose
             move.l  a0,d1
             CALLDOS Close
             rts
;----------------------------------xpr_fread
xpr_fread
             move.l  d1,d3
             move.l  a0,d2
             move.l  a1,d1
             CALLDOS Read
             rts
;----------------------------------xpr_fwrite
xpr_fwrite
             move.l  d1,d3
             move.l  a0,d2
             move.l  a1,d1
             CALLDOS Write
             rts
;----------------------------------xpr_fseek
xpr_fseek
             move.l  d1,d3
             move.l  d0,d2
             move.l  a0,d1
             subq.l  #1,d3
             CALLDOS Seek
             tst.l   d0
             bmi.s   fseek1
             clr.l   d0 ;0=success
fseek1
             rts
;----------------------------------xpr_finfo
xpr_finfo

	MOVE.L	D0,-(SP)      
	MOVE.L	A0,D1
	MOVE.L	#-2,D2
        CALLDOS Lock
	MOVE.L	D0,D1
	BEQ	finfo2
	MOVE.L	D0,-(SP)
	MOVE.L	D0,D1
	MOVE.L	#FIB,D2
        CALLDOS Examine
	MOVE.L	(SP)+,D1
        CALLDOS UnLock
	MOVE.L	(SP),D0
	CMP.L	#2,D0
	BEQ	finfo1
	CMP.L	#1,D0
	BNE	finfo2
        lea     FIB,a0
        move.l  124(a0),d0 ;anzahl bytes
	BRA	finfo3
finfo1	CLR.L	D0
	BRA	finfo3
finfo2	CLR.L	D0
finfo3	CLR.L	(SP)+
	RTS
;----------------------------------xpr_update
xpr_update  ;must be as short and fast as possible! gets called between
            ;EVERY 1k block transferred!

	MOVE.L	A0,Asave

        move.l	68(a0),d2 ;datarate printen
        lea     CPS+5,a0
	bsr	makeASC
	PRINT	10,20,3,CPS,13

        move.l  Asave,a0
        move.l  12(a0),d2
        lea     SIZE+5,a0
        bsr     makeASC
        PRINT   10,30,3,SIZE,13

        move.l  Asave,a0
        move.l  32(a0),d2
        lea     BYT+5,a0
        bsr     makeASC
        PRINT   10,40,3,BYT,13

        move.l  Asave,a0
        move.l  60(a0),a0
        lea     TIME+5,a1
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        move.b  (a0)+,(a1)+
        PRINT   10,50,3,TIME,13

        rts

CPS     dc.b    "CPS: 12345678"
SIZE    dc.b    "SIZE:12345678"
BYT     dc.b    "BYTE:12345678"
TIME    dc.b    "TIME:  :  :  "
Asave   dc.l    0,0,0,0

UDwindowdef     cnop 0,4
        dc.w    470,20
	dc.w	135,60
	dc.b	-1,-1	
	dc.l	CLOSEWINDOW
        dc.l    UDW_Gadgets!UDW_Extras  
	dc.l	0	
	dc.l	0	
	dc.l	UDW_Title
	dc.l	0	
	dc.l	0	
	dc.w	135,21   
        dc.w    135,53
	dc.w   	WBENCHSCREEN	
        cnop    0,4
UDW_Gadgets equ   WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE
UDW_Extras  equ   SMART_REFRESH!ACTIVATE
UDW_Title   dc.b  "XPR>>Z",0,0
            cnop  0,4
UDwindowptr dc.l  0
            cnop  0,4

;----------------------------------xpr_chkabort
xpr_chkabort 

        move.l   UDwindowptr,a0  ;IDCMP-Windowport holen
        move.l   wd_UserPort(a0),a0
        CALLEXEC GetMsg
        tst.l    d0             ;nix da
        beq      chkabort1
        move.l   d0,a1
        move.l   im_Class(a1),Dsave
        CALLEXEC ReplyMsg
        cmp.l    #CLOSEWINDOW,Dsave 
        bne      chkabort1
        move.l   #-1,d0         ;abort
        rts
chkabort1
        clr.l   d0 
        rts         ;d0 nonzero = abort

Dsave   dc.l    0
;----------------------------------xpr_chkmisc
xpr_chkmisc 
             rts
;----------------------------------xpr_sread
xpr_sread

        move.l   a0,Anull
        move.l   d0,Dnull
        move.l   d1,Deins

        tst.l    d1                ;timeout?
        bne      sread7            ;wenn ja

        bsr      xpr_squery
        tst.l    d0                ;was im port?
        bne      sread0            ;wenn ja
        rts
sread0
        cmp.l    Dnull,d0
        bls.s    sreadX            ;mehr gefordert als angekommen?
        move.l   Dnull,d0          ;wenn ja: nur geforderte zahl lesen
sreadX
        lea      SerIO,a1          ;abholen
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #CMD_READ,IO_COMMAND(a1)
        move.l   d0,IO_LENGTH(a1)
        move.l   Anull,IO_DATA(a1)
        CALLEXEC DoIO
        move.l   IO_ACTUAL(a1),d0
        rts

sread7
        lea      SerIO,a1
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #CMD_READ,IO_COMMAND(a1)
        move.l   Dnull,IO_LENGTH(a1)
        move.l   Anull,IO_DATA(a1)
        CALLEXEC SendIO

        lea      TimeIO,a1
        move.l   #TimeReply,MN_REPLYPORT(a1)
        move.w   #9,IO_COMMAND(a1) ;add timerequest
        move.l   Deins,$24(a1)     ;timeout microsecs
        move.l   #0,$20(a1)        ;null secs
        clr.b    IO_FLAGS(a1)
        CALLEXEC SendIO
;--------
sread1
        clr.l    d0                ;warten: entweder geforderte bytes
        clr.l    d1                ;angekommen oder timeout
        lea      SerReply,a1       ;waitmaske erstellen
        move.b   MP_SIGBIT(a1),d1
        bset.l   d1,d0
        lea      TimeReply,a1
        move.b   MP_SIGBIT(a1),d1
        bset.l   d1,d0
        CALLEXEC Wait
;--------
        lea      SerIO,a1
        CALLEXEC CheckIO      ;war es der SerReq?
        beq      sread2       ;nein
        CALLEXEC WaitIO       ;cleanup serial

        lea      TimeIO,a1    ;timerrequest abbrechen
        CALLEXEC AbortIO
        lea      TimeIO,a1
        CALLEXEC WaitIO       ;cleanup

        lea      SerIO,a1
        move.l   IO_ACTUAL(a1),d0
        rts
;-------
sread2
        lea      TimeIO,a1    ;timeout?
        CALLEXEC CheckIO
        beq      sread1       ;nein
        CALLEXEC WaitIO       ;cleanup timer

        lea      SerIO,a1     ;readrequest abbrechen
        CALLEXEC AbortIO
        lea      SerIO,a1
        CALLEXEC WaitIO       ;cleanup

        lea      SerIO,a1
        move.l   IO_ACTUAL(a1),d0 ;soviele bytes waren angekommen
        rts
;----------------------------------xpr_swrite
xpr_swrite

        lea      SerIO,a1
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #CMD_WRITE,IO_COMMAND(a1)
        move.l   d0,IO_LENGTH(a1)
        move.l   a0,IO_DATA(a1)
        CALLEXEC DoIO
        rts
;----------------------------------xpr_sflush
xpr_sflush

        lea      SerIO,a1
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #CMD_FLUSH,IO_COMMAND(a1)
        CALLEXEC DoIO
        rts
;----------------------------------xpr_squery
xpr_squery

        lea      SerIO,a1
        move.l   #SerReply,MN_REPLYPORT(a1)
        move.w   #SDCMD_QUERY,IO_COMMAND(a1)
        CALLEXEC DoIO
        move.l   IO_ACTUAL(a1),d0
        rts
;----------------------------------xpr_unlink
xpr_unlink

        MOVE.L  A0,D1
        CALLDOS DeleteFile
        TST.L   D0
        BEQ     unlink1
        MOVEQ   #-$1,D0
        BRA     unlink2
unlink1	CLR.L   D0
unlink2 RTS
;---------------------------------xpr_getptr
xpr_getptr
	CLR.L	D0
	RTS
;---------------------------------xpr_options
xpr_options
        RTS
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
;-=-=-=-=-DATENBEREICH=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

XPR_IO       dc.l  0
             dc.l  xpr_fopen  ;a pointer to this structure must be in A0
             dc.l  xpr_fclose ;when calling XPR library functions
             dc.l  xpr_fread  ;
             dc.l  xpr_fwrite ;
             dc.l  xpr_sread  ;
             dc.l  xpr_swrite
             dc.l  xpr_sflush
             dc.l  xpr_update
             dc.l  xpr_chkabort
             dc.l  xpr_chkmisc
             dc.l  0          ;xpr_gets ---optional!
             dc.l  0          ;xpr_setserial
             dc.l  0          ;xpr_ffirst
             dc.l  0          ;xpr_fnext
             dc.l  xpr_finfo
             dc.l  xpr_fseek
             dc.l  4          ;all 4 ext fields are programmed
             dc.l  0
             dc.l  xpr_options;EXT1
             dc.l  xpr_unlink ;EXT2 
             dc.l  xpr_squery ;EXT3
             dc.l  xpr_getptr ;EXT4
             dc.l  0,0,0,0

;------------IOExtSer--------------------------
SerIO        ds.b    100      ;Alloc fuer Message und Replyports
SerReply     ds.b    100
;----------------------------------------------
TimeIO       ds.b    100
TimeReply    ds.b    100
;----------------------------------------------
ConIO        ds.b    100
ConReply     ds.b    100
;----------------------------------------------

          cnop  0,4
windowdef dc.w  0,0
          dc.w  640,256
          dc.b  -1,-1
          dc.l  WINDOWCLOSE
          dc.l  W_Gadgets!W_Extras
          dc.l  0,0
          dc.l  W_Title
          dc.l  0,0
          dc.w  200,30
          dc.w  640,256
          dc.w  WBENCHSCREEN
W_Gadgets equ   WINDOWSIZING!WINDOWDRAG!WINDOWDEPTH
W_Extras  equ   SMART_REFRESH!ACTIVATE
W_Title   dc.b  "ALT-Quit, ALT-Download, ALT-Upload",0,0


             cnop    0,4
Anull        dc.l    0   ;scratschregister
Aeins        dc.l    0
Dnull        dc.l    0
Deins        dc.l    0
handle       dc.l    0
_DOSBase       dc.l  0
_XPRBase       dc.l  0
_IntuitionBase dc.l  0
_GfxBase       dc.l  0
windowptr    dc.l    0

FIB          ds.b    500  ;file-info-block (da steht irgendwann die filesize)

             cnop    0,4
int_name     INTNAME
             cnop    0,4
con_name     dc.b    "console.device",0
             cnop    0,4
timer_name   TIMERNAME
             cnop    0,4
ser_name     dc.b    "isdn.device",0
             cnop    0,4
dos_name     DOSNAME
             cnop    0,4
graf_name    GRAFNAME
             cnop    0,4
xpr_name     dc.b    "xprzmodem.library",0
             cnop    0,4

;--------------------------------------------
makeASC                     ;a0->puffer;d2=wert

        moveq	#7,d0       ;8 stellen...
	lea.l	Potenzen,a1
next	move	#"0",d1
make1   addq	#1,d1	
	sub.l	(a1),d2	
	bcc	make1	
	subq	#1,d1	
	add.l	(a1),d2	
	move.b	d1,(a0)+	
	tst.l	(a1)+
	dbra	d0,next	
        rts

Potenzen dc.l	10000000
	 dc.l	1000000
	 dc.l	100000
	 dc.l	10000
	 dc.l	1000
	 dc.l	100
	 dc.l	10
	 dc.l	1
	 dc.l	0 

;---------------------------------------------------------------------
             END
;---------------------------------------------------------------------



not yet implemented:



	MOVEM.L	D1-D7/A0-A6,-(SP)   ;xpr_first
	MOVEM.L	A0/A1,-(SP)
	LEA	$C29A2A,A0
	MOVE.L	$C4F1E6,A6
	JSR	-$1C2(A6)
	MOVEM.L	(SP)+,A0/A1
	MOVE.L	A0,-(SP)
	MOVE.L	A1,D0
	LEA	$C29A2A,A0
	CLR.L	$10(A0)
	MOVE.L	$C4F1E6,A6
	JSR	-$1B6(A6)
	MOVE.L	(SP)+,A0
	TST.L	D0
	BNE.S	lbC0007E8
	LEA	$C29A46,A1
lbC0007E0	MOVE.B	(A1)+,(A0)+
	BNE.S	lbC0007E0
	MOVEQ	#-$1,D0
	BRA.S	lbC0007EA

lbC0007E8	CLR.L	D0
lbC0007EA	MOVEM.L	(SP)+,D1-D7/A0-A6
	RTS
;----------------------------
	MOVEM.L	D1-D7/A0-A6,-(SP)  ;xpr_next
	MOVE.L	A0,-(SP)
	LEA	$C29A2A,A0
	MOVE.L	$C4F1E6,A6
	JSR	-$1BC(A6)
	MOVE.L	(SP)+,A0
	TST.L	D0
	BNE.S	lbC00081A
	LEA	$C29A46,A1
lbC000812	MOVE.B	(A1)+,(A0)+
	BNE.S	lbC000812
	MOVEQ	#-$1,D0
	BRA.S	lbC00081C

lbC00081A	CLR.L	D0
lbC00081C	MOVEM.L	(SP)+,D1-D7/A0-A6
	RTS
;------------------------------------

