{{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Autor: Reinhard Zielinski │ │ Copyright (c) 2013 Reinhard Zielinski │ │ See end of file for terms of use. │ │ Die Nutzungsbedingungen befinden sich am Ende der Datei │ └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ Informationen : hive-project.de Kontakt : zille09@gmail.com System : TriOS Name : YModem - Treiber für die Dateiübertragung vom Hive zum PC und umgekehrt Chip : Regnatix Typ : Plexus-Erweiterungsdatei Version : 01 Subversion : 00 Logbuch : '############################################### Version 1.0 ###################################################################################################################### 20-03-2014 :-Template für DLL-Dateien an die neuen Anforderungen angepasst 21-03-2014 -YModem-Treiber eingebunden, momentan funktioniert nur das Senden -6624 Longs frei 23-03-2014 -Fehler in der Empfangsroutine gefunden -einige kleine Korrekturen im Code des Treibers, am Ende einer Datei wurden falsche Bytes übertragen -jetzt funktioniert der Treiber korrekt -5965 Longs frei 23-03-2014 -Sende-Routine auf SD-Karten-Blocklese-Befehl umgestellt, dadurch die Übertragungsgeschwindigkeit fast verdoppelt :-) -Korrektur beim Lesen der letzten zwei Bytes durchgeführt, jetzt wird die Datei korrekt bis zum letzten Byte übertragen -Korrektur in der Buttonabfrage -kleinere optische Korrekturen -5957 Longs frei 24-03-2014 -doppelten seriell Treiber entfernt -Korrektur in der Empfangsroutine (fehlendes ACK), jetzt funktioniert der Empfang auch mit ZTerm -seltsamerweise wird das Sendefenster in den Terminal-Programmen nach erfolgreichem Empfang nicht geschlossen!? -die Datei wird aber korrekt übertragen -6141 Longs frei 25-03-2014 -Beim Beenden wird jetzt nicht mehr der Desktop gelöscht -dadurch entsteht eine noch bessere Illusion, das die DLL im Plexus integriert ist -6148 Longs frei }} obj ios: "reg-ios-64" num: "Numbers" con _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 '------------- Shell-Farben ----------------------------------------------------- shellhcol =0 'Hauptfensterfarbe act_color =1 'Schriftfarbe winhcol =2 'Fensterhintergrundfarbe winframecol =3 'Fensterrandfarbe Titelhcol =4 'Titelleistenfarbe titeltextcol =5 'Titelleistentextfarbe hcolstatus =6 'statusleiste hintergrundfarbe statustextcol =7 'Statustextfarbe buttonhcol =8 'Buttonhintergrundfarbe buttontextcol =9 'Buttontextfarbe messagehcol =10 'Messagebox-Hintergrundfarbe messagetextcol =11 'Messagebox-Textfarbe selectcol =12 'selektionsfarbe mousecol =13 'Mauszeigerfarbe panelcol =14 'Farbe des Utility-Panels ADM_SPEC = %00000000_00000000_00000000_01010011 '-------- Speicher für diverse Texte ------------ TXT_RAM = $20000 Hour_Glass = $66800+(167*16*4) '-------- YMODEM Temp-Speicher ------------------ YMODEM_RAM= $7E400 '... $7E417 Name, der zu sendenden Datei, Was soll gemacht werden(0Empfang,1Senden)+Dirmarker SETTING_RAM = $7FF00 'Hier stehen die System-Settings BRAM = $50000 'Overlay-Puffer '******************Farben ******************************************************** #$FC, Light_Grey, #$A8, Grey, #$54, Dark_Grey #$C0, Light_Red, #$80, Red, #$40, Dark_Red #$30, Light_Green, #$20, Green, #$10, Dark_Green #$1F, Light_Blue, #$09, Blue, #$04, Dark_Blue #$F0, Light_Orange, #$E6, Orange, #$92, Dark_Orange #$CC, Light_Purple, #$88, Purple, #$44, Dark_Purple #$3C, Light_Teal, #$28, Teal, #$14, Dark_Teal #$FF, White, #$00, Black '----Icon-Nummern---------------------------------------------------------------- BEL_PIC =14 ADM_PIC =15 BIN_PIC =9 BAS_PIC =107 DIR_PIC =7 ALL_PIC =8 DMP_PIC =120 TXT_PIC =121 SYS_PIC =122 COG_PIC =75 BACK_PIC =124 VOR_PIC =123 PLAY_PIC =125 STOP_PIC =141 CLR_PIC =155 EXT_PIC =156 '------------- F-Tasten für Zusatzfunktionen ------------------------------------- F1_Key = 208 F2_Key = 209 F3_Key = 210 F4_Key = 211 F5_Key = 212 F6_Key = 213 F7_Key = 214 F8_Key = 215 F9_Key = 216 F10_Key = 217 F11_Key = 218 F12_Key = 219 ESC_KEY = 27 RETURN_KEY = 13 '-------------------------------------------------------------------------------- var byte mountmarker long userdir 'user-Dirmarker byte colors[15] 'Farbwerte byte ma,mb 'Maus-Tasten byte messagex 'x-Position der Messagebox byte windowx[3] byte windowy[3] byte windowxx[3] byte windowyy[3] byte buttonx[5],buttony[5] byte util long systemdir 'Plexus-System-Verzeichnis byte font[25] 'Hilfsstring für Strings aus dem Ram '----------- DCF-Indikator ------------------------------------ byte dcf_on '----------- YMODEM-Variablen --------------------------------- byte fbuf[12] byte sbuf[30] byte pdata[1028] 'packet data byte baud byte was 'Was soll ich machen? Senden oder Empfangen dat regsys byte "plexus.dll",0 'Reg.sys für Rückkehr aus externem Programm butOK byte " OK ",0 Abbr byte "Cancel",0 SYSTEM Byte "PLEXUS ",0 'Plexus-Systemverzeichnis fertig byte "Transmission done!",0 'fertig-Meldung {{ '################################################### ACHTUNG ############################################################### '# # '# Für eine optimale Übertragungsgeschwindigkeit muss der Puffer im Seriell-Treiber # '# auf die Mindest-Größe (128) eingestellt werden !!!! # '# # '################################################### ACHTUNG ############################################################### }} PUB main|yadr,i ios.start cmd_mount 'sd-card mounten mountmarker:=1 'mount-marker '-------------------------------------------------------------------------------------- activate_dirmarker(0) 'ins root ios.sdchdir(@system) 'System-Verzeichnis lesen systemdir:=get_dirmarker 'Dir-Marker lesen '-------------------------------------------------------------------------------------- cmd_unmount iniload 'Ini-Datei mit Farbwerten laden yadr:=YMODEM_RAM i:=0 was:=ios.ram_rdbyte(YMODEM_RAM+15) 'Modus=1 Senden 0=Empfangen userdir:=ios.ram_rdlong(YMODEM_RAM+16) if was 'was=1 heisst senden repeat 12 'Dateiname aus dem RAM lesen fbuf[i++]:=ios.ram_rdbyte(yadr++) fbuf[i]:=0 ios.seropen(bdselect(baud)) util:=0 testfenster repeat os_cmdinput 'Hauptprogrammschleife PRI os_cmdinput | x,y ,key repeat 'time 'Zeit und Datum anzeigen ma:=ios.mouse_button(0) 'linke Maustaste mb:=ios.mouse_button(1) 'rechte Maustaste key:=ios.key if key '**************************** Short-Cuts **************************************************************************** case key ESC_KEY:ausstieg RETURN_KEY:ausstieg '***************************** linke Maustaste ********************************************************************** if ma x:=ios.mousex y:=ios.mousey '****************************** Globale Funktionstasten ******************************************************** if(x=>buttonx[1]) and (x=buttonx[2]) and (x=0 key:=i i:=cnt if ((cnt-timer)/clkfreq)>10 '10 second timeout error(75) return 'fail 'start sending packets packet:=0 repeat timer:=cnt crc:=0 deot:=false ios.sertx(SOH) 'send header ios.sertx(packet) ios.sertx(!packet) 'construct packet if packet==0 i:=strsize(@fbuf) bytemove(@pdata,@fbuf,i+1) p:=num.tostr(size,num#DEC) j:=strsize(p) bytemove(@pdata+i+1,p,j+1) 'Send filename and length else if stand=>128 'Paket von SD-Karte lesen ios.sdgetblk(128,@pdata) zaehler+=128 stand-=128 else repeat i from 0 to 127 'letztes Paket d:=ios.sdgetc zaehler++ if zaehler==size+1 repeat i from i to 127 pdata[i]:=0 stand:=0 deot:=true quit pdata[i]:=d position:=zaehler/tmp 'balkenposition positionsbalken(position,11,11) repeat i from 0 to 127 'send packet ios.sertx(pdata[i]) crc:=UpdateCRC(pdata[i],crc) ios.sertx((crc>>8)&$FF) ios.sertx(crc&$FF) repeat i:=ios.serread'com.rxcheck if i==ACK 'Paket OK quit if i==NAK 'Paket Not OK 'retransmit packet repeat i from 0 to 127 ios.sertx(pdata[i]) ios.sertx((crc>>8)&$FF) ios.sertx(crc&$FF) if ((cnt-timer)/clkfreq)>10 ios.sertx(EOT) error(78) '"Timeout failure.")) return 'fail if (deot==true) 'done quit else packet++ timer:=cnt ios.sertx(EOT) 'send EOT wait for ACK and send end of batch packet repeat i:=ios.serread'com.rxcheck if i==ACK timer:=cnt key:=0 repeat until key==Cee 'now, wait for "C" i:=ios.serread'com.rxcheck if i>0 key:=i i:=cnt if ((cnt-timer)/clkfreq)>10 '10 second timeout error(75) return 'fail 'now, transmit null packet and wait for ACK key:=0 repeat until key==ACK ios.sertx(SOH) ios.sertx(0) ios.sertx($FF) crc:=0 repeat 128 ios.sertx(0) crc:=UpdateCRC(0,crc) ios.sertx((crc>>8)&$FF) ios.sertx(crc&$FF) 'wait for ack key:=ios.serget if key<>ACK and key<>NAK error(75) return 'fail quit 'all done! ios.sertx(EOT) print_win(@fertig,10,14) ' waitcnt(cnt+clkfreq) ausstieg PRI positionsbalken(pos,x,y) ios.display2dbox(colors[act_color],y,x,y,x+pos,0) pri Empfang_file|key,i,packet,crc,j,k,timer,bytes,done,zaehler,tmp,position 'get file from computer and save to SD 'Ymodem protocol: http://timeline.textfiles.com/1988/10/14/1/FILES/ymodem.txt zaehler:=0 print_titel(string("Receive"),22,7) ios.sdmount 'Receive file from host activate_dirmarker(userdir) 'repeat 'batch reception loop 'wait for first packet packet:=0 '############ erstes Paket ################# repeat until packet==1 key:=0 'waitcnt(cnt+clkfreq*3) ios.sertx(Cee) timer:=cnt repeat until key==SOH key:=ios.serread if(cnt-timer)>clkfreq*5 ios.sertx(EOT) error(75) return 'analyze first packet if(ios.serget==0) if(ios.serget==$FF) crc:=0 j:=0 i:=-1 done:=0 'filename repeat until i==0 i:=ios.serget fbuf[j++]:=i crc:=UpdateCRC(i,crc) print_win(@fbuf,10,13) 'Dateiname anzeigen i:=-1 k:=j j:=0 repeat until i==0 or i==32 i:=ios.serget if i<>32 sbuf[j++]:=i else sbuf[j++]:=0 crc:=UpdateCRC(i,crc) k+=j bytes:=num.fromstr(@sbuf,num#dec) tmp:=bytes/18 printdec_win(bytes,14,10) 'Dateigröße anzeigen repeat j from k+1 to 128 i:=ios.serget crc:=UpdateCRC(i,crc) else ios.sertx(NAK) else ios.sertx(NAK) i:=ios.serget j:=ios.serget if i<>(crc>>8) or j<>(crc&$FF) ios.sertx(NAK) else packet:=1 '###################### ende Paket 1 ################################## ios.sertx(ACK) 'open output file ios.sdnewfile(@fbuf) ios.sdopen("W",@fbuf) 'receive packets '################################# restliche Pakete empfangen #################### ios.sertx(Cee) k:=0 repeat until k==EOT k:=ios.serget if k==SOH packet:=ios.serget i:=ios.serget if (255-i)<>packet quit crc:=0 repeat j from 0 to 127 i:=ios.serget crc:=UpdateCRC(i,crc) pdata[j]:=i zaehler++ i:=ios.serget j:=ios.serget if i<>(crc>>8) or j<>(crc&$FF) ios.sertx(NAK) else 'write data if bytes>128 ios.sdputblk(128,@pdata) bytes-=128 else ios.sdputblk(bytes,@pdata) bytes:=0 ios.sertx(ACK) 'funktioniert auch ohne, ist aber unlogisch 'get more elseif k==STX '1024 byte packets repeat j from 0 to 1027 pdata[j]:=ios.serget zaehler++ packet:=pdata[0] i:=pdata[1] if (255-i)<>packet quit crc:=0 repeat j from 2 to 1025 i:=pdata[j] crc:=UpdateCRC(i,crc) i:=pdata[1026] j:=pdata[1027] if i<>(crc>>8) or j<>(crc&$FF) ios.sertx(NAK) else 'write data if bytes>1024 ios.sdputblk(1024,@pdata+2) bytes-=1024 else ios.sdputblk(bytes,@pdata+2) bytes:=0 ios.sertx(ACK) position:=zaehler/tmp 'balkenposition positionsbalken(position,11,11) ios.sertx(ACK) ios.sdclose print_win(@fertig,10,14) ausstieg PRI UpdateCRC(data,crc):newcrc|i 'look here:http://web.mit.edu/6.115/www/miscfiles/amulet/amulet-help/xmodem.htm crc:=crc^(data<<8) repeat i from 0 to 7 if crc&$8000 crc:=((crc<<1)&$FFFF)^$1021 else crc:=(crc<<=1)&$FFFF return crc&$FFFF con '********************************************* Ausgabe von Fehlermeldungen *************************************************************************************************** PRI error(err) messagebox(ram_txt(err),1) PRI messagebox(st,ok)|laenge,mindest laenge:=strsize(st)+2 mindest:= 20 messagex:=10+laenge ios.backup_area(7,10,messagex,17,BRAM) ios.display3DBox(white, colors[messagehcol], black, 10, 7, 17, messagex) print_message(st,8,11) if ok==1 button(1,@butOK,10,15) button(2,@Abbr,1+laenge,15) PRI ram_txt(nummer)|c,i,ad i:=0 ad:=TXT_RAM+((nummer-1)*25) repeat while c:=ios.ram_rdbyte(ad++) if c>13 byte[@font][i++]:=c byte[@font][i]:=0 return @font PRI button(n,btext,x,y) buttonx[n]:=x buttony[n]:=y printfont(btext,colors[buttonhcol],0,colors[buttontextcol],x,y) PRI Mouse_Release repeat while ios.mouse_button(0) 'warten bis Maustaste losgelassen wird pri ausstieg ios.Mousepointer(hour_glass) cmd_mount activate_dirmarker(systemdir) ios.sdopen("r",@regsys) ios.ldbin(@regsys) pri testfenster|a a:=0 window(2,4,9,9,14,31,string("Filetransfer:")) rahmen(10,10,30,12) printdec_win(0,9,10) printdec_win(100,9,28) if was Send_File else Empfang_File con '---------------------------------------------- Ausgaberoutinen --------------------------------------------------------------------------------------------------------------- PRI Win_Tile(nu,ty,tx) ios.displaytile(nu,colors[winhcol],0,colors[act_color],ty,tx) PRI print_message(stradr,x,y) printfont(stradr,colors[messagehcol],0,colors[messagetextcol],x,y) PRI printdec_win(n,y,x) printdec(n,y,x,colors[winhcol],colors[act_color]) PRI Print_win(str,x,y) printfont(str,colors[winhcol],0,colors[act_color],x,y) PRI print_titel(stradr,x,y) printfont(stradr,colors[titelhcol],0,colors[titeltextcol],x,y) con' PRI iniload|i,a a:=SETTING_RAM repeat i from 0 to 14 colors[i]:=ios.ram_rdbyte(a++) baud:=ios.ram_rdbyte(a++) 'Übertragungsrate serielles Terminal dcf_on:=ios.ram_rdbyte(a+2) PRI activate_dirmarker(mark) 'USER-Marker setzen ios.sddmput(ios#DM_USER,mark) 'usermarker wieder in administra setzen ios.sddmact(ios#DM_USER) 'u-marker aktivieren PRI get_dirmarker:dm 'USER-Marker lesen ios.sddmset(ios#DM_USER) dm:=ios.sddmget(ios#DM_USER) PRI cmd_mount :err 'cmd: mount repeat 16 err:=ios.sdmount ifnot err mountmarker:=1 quit PRI cmd_unmount|err 'cmd: unmount err:=ios.sdunmount ifnot err mountmarker:=0 PRI window(numm,cntrl,y,x,yy,xx,strg) 'ein Fenster erstellen windowx[numm]:=x-1 windowy[numm]:=y-2 windowxx[numm]:=xx+1 windowyy[numm]:=yy+1 ios.window(numm,0,colors[winhcol],0,colors[winframecol],colors[titelhcol],colors[titeltextcol],colors[hcolstatus],colors[statustextcol],y-2,x-1,yy+1,xx+1,cntrl,0) ios.printcursorrate(0) ios.printchar(12) 'cls printfont(strg,colors[titelhcol],0,colors[titeltextcol],x,y-2) PRI printfont(str1,a,b,c,d,e)|f repeat strsize(str1) f:= byte[str1++] if f >96 f^=32 f-=16 'anderer Zeichensatz, Zeichen um -16 Positionen versetzt if d>39 'wenn Bildschirmrand erreicht, neue Zeile d:=0 e++ ios.displayTile(f,a,b,c,e,d) 'einzelnes Tile anzeigen ('displayTile(tnr,pcol,scol,tcol, row, column)) d++ PRI printdec(value,y,xx,hint,vor) | i ,c ,x 'screen: dezimalen zahlenwert auf bildschirm ausgeben {{printdec(value) - screen: dezimale bildschirmausgabe zahlenwertes}} ' if value < 0 'negativer zahlenwert ' -value 'printchar("-") i := 1_000_000_000 repeat 10 'zahl zerlegen if value => i x:=value / i + "0" ios.displayTile(x-16,hint,0,vor,y,xx) 'printchar(x) xx++ c:=value / i + "0" value //= i result~~ elseif result or i == 1 printfont(string("0"),hint,0,vor,xx,y) 'printchar("0") xx++ i /= 10 'nächste stelle con '************************************************** Button-Funktionen ******************************************************************************************************** PRI buttonpress(n) case n 1:printfont(@butOK,250,0,0,buttonx[n],buttony[n]) 2:printfont(@Abbr,250,0,0,buttonx[n],buttony[n]) Mouse_Release case n 1:printfont(@butOK,colors[hcolstatus],0,colors[statustextcol],buttonx[n],buttony[n]) 2:printfont(@Abbr,colors[Buttonhcol],0,colors[buttontextcol],buttonx[n],buttony[n]) PRI rahmen(x,y,xx,yy)|i win_tile(137,y,x) win_tile(136,yy,x) win_tile(157,y,xx) win_tile(119,yy,xx) repeat i from y+1 to yy-1 win_tile(2,i,x) win_tile(114,i,xx) line(x+1,y,xx-1) line(x+1,yy,xx-1) PRI line(x,y,xx)|i repeat i from x to xx win_tile(130,y,i)