More ultraForth cleanup

This commit is contained in:
Carsten Strotmann 2020-07-15 09:48:43 +02:00
parent 352036bb6e
commit 920d458551
83 changed files with 60603 additions and 0 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

486
archive/6502/CBM/CLV/EDIT Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

BIN
archive/6502/CBM/CLV/MENUE Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,28 @@
/* convert */
PARSE ARG in out
SAY in out
rc = Stream(in,"C","OPEN READ")
rc = Stream(out,"C","OPEN WRITE")
cnt = 0
end = 174080
DO WHILE cnt < end
DO u = 0 to 23
line = ""
line = charin(in,, 41)
rc = lineout(out,line)
cnt = cnt + 41
END
line = charin(in,,40)
rc = lineout(out,line)
cnt = cnt + 40
END
rc = Stream(out,"C", "CLOSE")
rc = Stream(in, "C", "CLOSE")
RETURN

View File

@ -0,0 +1 @@
ultraForth Dump von Martin Bitter

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,70 @@
Ramdisk f<>r das Kassetten-Forth des Commodore C-16
Stichworte: Ramdisk, Commodore C-16/Plus4, Kassetten-Forth,
Datenabstraktion, Supertape
Abstract: Das beschriebene Programm simuliert ein Diskettenlaufwerk
im Speicher. Es entstand f<>r die Kassettenversion des volksforth f<>r
den Commodore C-16 und benutzt ein Speicherverfahren, daá normale
Forth-Quelltexte durch Verdichten aufeinanderfolgender Leerzeichen
auf ca. die H„lfte bis 1/3 komprimiert. Anhand des Programmes werden
die Konzepte von 'information hiding' und 'Datenabstraktion' erl„utert,
die eine Žnderung des Datenformats und somit eine leichte Anpassung an
spezifische Anforderungen erm”glichen.
Problemstellung:
F<EFBFBD>r das - inzwischen als Testversion erh„ltliche - volksFORTH f<>r die
Rechner Commodore C-16,C-116 und Plus4 stellte sich folgendes Problem:
Da diese Rechner ca. 100-200 DM kosten, ein Diskettenlaufwerk aber gleich
300 DM h„tte eine nur mit Floppy lauff„hige Forth-Version den
Verbreitungsgrad dieser Sprache f<>r obengenannte Rechner stark
eingeschr„nkt. Wer kauft sich ein so teures Laufwerk, wenn er
vielleicht das Programm nur mal so 'irgendwo abgestaubt' hat.
Es erschien mir - als Autor der C-16-Version daher w<>nschenswert,
eine Kassettenversion zus„tzlich zu erstellen.
Wie aber Forth von seiner traditionellen Disketten-Unterst<73>tzung
befreien? Mehrere Konzepte wurden angedacht:
- eine 'Batch-Version', die - mittels externem Editor erstellte - Files
kompiliert, h„tte Forth seines groáen Vorzugs der inkrementellen
Programmentwicklung beraubt.
- eine zweite Variante sah einen Sprachaufsatz vor, der ein einfaches
Decompilieren des kompletten Quelltextes mit Kommentaren, Layout, etc.
erm”glicht h„tte. Die daraus resultierende Arbeitsweise h„tte so
ausgesehen, daá die Quelltexte im Direkt-Modus eingegeben werden
und am Ende der Sitzung vom Decompiler auf ein einfaches
Kassetten-File geschrieben w<>rden. Ein solcher Sprachaufsatz
erschien mir allerdings als zu aufwendig und fehleranf„llig, als
daá ich ihn mit meinen geringen Forth-Kenntnissen zuwege gebracht
h„tte.
- die dritte ( und klassische ) Variante benutzt eine Ram-Disk,
die mit den Load- und Save-Routinen des Betriebssystems am
Anfang der Sitzung von Kassette geladen wird, anschlieáend
von Forth aus wie ein physikalisches Laufwerk benutzt werden
kann und am Ende komplett wieder zur<75>ckgeschrieben wird. Dieser
Variante wurde der Vorzug gegeben, sie wird im folgenden beschrieben.
Spezielle Anforderungen an eine Ram-Disk f<>r Kassettenbetrieb:
Beim vorgestellten Problem m<>ssen folgende Anforderungen befriedigt
werden:
- Mit dem vorhandenen Speicherplatz muá sparsam umgegangen werden,
dahinter stehen Geschwindigkeits-Anforderungen jederzeit zur<75>ck.
- Die Ramdisk sollte Absturz fest sein und m”glichst das Forth
<20>berleben. D.h., daá sie mit vertretbarem Aufwand restauriert
werden kann, wenn sie nicht allzu stark gesch„digt wurde,
selbst wenn das Forth-System neu geladen wurde.
- W<>nschenswert w„re, den Speicherbereich hardwarem„áig gegen
fehlerhaftes šberschreiben zu sichern, was mit Bankswitching
m”glich w„re.
- Es sollte eine schnelle Kassetten


File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,105 @@
LQ12
(c) 1988 volksFORTH83-Autoren in der Forth-Gesellschaft eV ultraFORTH83 ist ein Public-Domain-Produkt und kostet
c/o Rainer Mertins; Antilopenstieg 6a; D-2000 Hamburg 54 ca. 60.-DM ( 200 Seiten Handbuch + 4 Diskettenseiten)
f<>r C16/116(64kB) & Plus4
rev 3.8-Tape; Format:C16,ST
Inhalt der Kassette
Z„hler Format Filename
------- ------ --------------- ------------------------------- ----------------------------------------- ---------------------------------
0 CBM taperunme Ein Basicprogramm mit Kurzinfos Laden: LOAD - Laden des Programms Sichern von Basic aus:
RUN - Starten SAVE "TAPERUNME"
35 CBM/ST ultraforth83 Ein Arbeitssystem mit Assembler, Laden: MONITOR - Aufruf des Monitors Sichern von ultraFORH aus:
.blk, Editor, Tracer, Buffers L - Laden des Schnelladers SAVESYSTEM ULTRAFORTH83
und Tape G726E - Laden des restlichen
ultraFORTH83 und Starten.
69 ST RD.infos Inhaltsverzeichnisse aller Disks / Alle 'RD.???'-Files sind Ramdisks Sichern von ultraFORTH aus:
verschiedene Infos und Quellen / mit Quelltexten. Sie werden von SAVERAMDISK
ST RD.disk diskutilities / ultraFORTH83 geladen mit:
ST RD.kleinkram verschiedene kleine Quellen / LOADRAMDISK
ST RD.1 uf-quelle Screens 0 bis 30 der Quelldisk / Welche Screens drin sind kann
ST RD.2 uf-quelle Screens 31 bis 60 der Quelldisk / erfahren werden mit:
ST RD.3 uf-quelle Screens 61 bis 90 der Quelldisk / RDCHECK
ST RD.4 uf-quelle Screens 91 bis 120 der Quelldisk / Anschlieáend kann ein Screen ediert werden
ST RD.5 uf-quelle Screens 121 bis 169 der Quelldisk / mit: <screen-nummer> EDIT
ST RD.assembler 6502-Assembler / z.B. kann Screen 4:1 ediert werden mit:
ST RD.editor ben”tigt assembler / 1 4 >DRIVE EDIT
ST RD.tracer ben”tigt assembler /
ST RD.multitasker ben”tigt assembler
ST RD.printer Treiber f<>r verschiedene Drucker
ST RD.c16 supertape nur f<>r C16! ben”tigt assembler
ST RD.ramdisk
ST RD.tape ben”tigt assembler, c16 supertape,
ramdisk
ST RD.decompiler Ein automatischer Decompiler
ST RD.c64 1-grafik nur f<>r C64
ST RD.c64 2-grafik nur f<>r C64
ST RD.c64 grafdemo nur f<>r C64
210 ST c16tapeforth der reine Forth-Kern mit Tape / Selten benutzte Programme. Verschieben in lauff„higen Bereich:
ST runme Basicprog: Infos zur Disk-Version / Laden von ultraFORTH aus: <Reset-Taste> dr<64>cken
ST c16ultraforth83 der reine Forth-Kern ohne(!!) Tape / $8000 N" <filename>" BLOAD MONITOR
ST c64ultraforth83 " f<>r C64 / Sichern dann mit: >7f8 80
ST c16demo Arbeitssystem f<>r C16-Disk-Version / $8000 swap N" <filename>" BSAVE T8000 fd00 1001
ST c64demo Arbeitssystem f<>r C64-Disk-Version / X
/ RUN
274 ST end-of-tape Eine Kassettenendemarkierung
CBM end-of-tape "
------- ------ --------------- ------------------------------- ----------------------------------------- ---------------------------------
Leider ist es nicht m”glich, alle Files im normalen Supertape wird von der Zeitschrift C'T f<>r
Commodore-C16-Format zu sichern, da wir dann 2 Kassetten … 90 min alle g„ngigen Rechner verbreitet.
ausliefern m<>áten und das w<>rde 3 mal soviel kosten. Wir danken dem Heise-Verlag f<>r die
Daher sind alle Files (soweit m”glich) im Supertape-Format freundliche Genehmigung, es zu verwenden.
abgespeichert.
*** Was tun bei Lesefehlern *********************************** *** Einstellen des Tonkopfs beim C16,C116 und Plus 4 **********
Oft k”nnen Kassetten, die auf anderen Rekordern bespielt werden, Falls Sie beim Laden unsere Kassette Schwierigkeiten haben, hilft
nicht gelesen werden. Dies kann mehrere Ursachen haben: Ihnen oft das Einstellen des Tonkopfs. Dazu m<>ssen Sie
zuerst Ihr Programm 'h”rbar' machen. Grade bei schlecht abgeschirmten
1) Die Kassette wurde mit einer ungeeigneten Anlage beschrieben. Anlagen reicht manchmal das Aufdrehen des Lautst„rkereglers am
Es passiert h„ufig, daá ganz findige Rechnerfreaks Ihre Fernseher, um beim Laden mitzuhorchen. Besser ist, wenn Sie das
Programme mit normalen Musik-Anlagen <20>bertragen (m”glichst folgende kleine Programm mit dem Monitor eingeben:
noch mit Stereo-Rekordern). Die so erstellten Kassetten sind
h”chstens ausnahmsweise mal ohne 'LOAD-Error' zu laden. MONITOR ; umschalten auf Monitor
- Diese M”glichkeit gibt es bei uns nicht. Wir produzieren a3000 lda #$10 ; Lautst„rke aus ..
mit einfachen Mitteln Qualit„t, wie sie eine a3002 sta $ff11 ; .. Tongerator 1
digital bespielte Datasette bietet. a3005 lda #$ff ; Tonh”he ..
a3007 sta $ff0e ; ..
2) Oft sind die Tonk”pfe der verwendeten Rekorder verschieden a300a lda $ff12 ; ..
eingestellt. Dann muá der Tonkopf der lesenden Datasette a300d ora #$03 ; ..
speziell justiert werden. Verschiedene Zeitschriften a300f sta $ff12 ; .. f<>r Tongenerator 1
( 64er, Compute Mit!) schlagen dazu kleine Hardware-Erweiterungen a3012 lda $01 ; Kassettenport ..
vor, die das Justieren erleichtern. a3014 and #$10 ; .. lesen
a3016 ora #$07 ; .. Lautst„rke
Weil wir niemand zumuten m”chten, extra f<>r diese Kassette a3018 sta $ff11 ; .. Tongenrator 1 schreiben
groá zu basteln, stellen wir im folgenden eine einfache Methode a301b bne $3012 ; Endlose Schleife nach $3012
vor, wie jede/r seinen Tonkopf in 10 min selbst einstellen kann,
ohne groáe Bastelei. s"tonkopf",1,3000,3020 ; Sichern des Programms auf Kassette,
; falls gew<65>nscht.
Wenn Sie nun Ihre Datasette auf 'Play' stellen und das Programm mit
g3000
starten, h”ren Sie das Programm als wechselnden Ton. Pausen zwischen
den Programmen h”ren Sie als Dauerton oder Stille.
Wenn Sie nun mit einem kleinen Schraubenzieher im Loch oberhalb der
'REWIND'-Taste der Datasette nach der kleinen Schraube tasten, k”nnen
Sie durch Drehen der Schraube (bitte max. 1 Umdrehung nach rechts/links)
den Ton ver„ndern. Eine gute Einstellung erzeugt einen h”heren Ton,
eine schlechte einen tieferen Ton bis hin zum v”lligen Verstummen.
Drehen Sie nach rechts und links, bis der Ton anf„ngt, tiefer zu werden.
Drehen Sie anschlieáend in die Mitte zwischen diese beiden Punkte und
Sie haben die optimale Einstellung. Dr<44>cken Sie bitte beim Drehen nicht
auf die Schraube. Wenn Sie die optimale Einstellung gefunden haben,
k”nnen Sie das Programm abbrechen durch Dr<44>cken der <RESET>-Taste
oder Aus- und Wiedereinschalten des Rechners.
Wir wollen Ihnen nicht verschweigen, daá durch dieses Einstellen
des Tonkopfes m”glicherweise manche Ihrer alten Kassetten nicht mehr gut
gelesen werden k”nnen. Das macht aber nichts, Sie k”nnen den Tonkopf
durch die gleiche Prozedur nat<61>rlich wieder auf Ihre alten
Kassetten einjustieren.


View File

@ -0,0 +1,94 @@
ERGŽNZUNG zum Info-Zettel volksFORTH83 vom 30.11.87 clv01dec87
****************************************************************
*** Wir haben s„mtliche Bestellungen von ultraFORTH83 **
*** auf Kassette vorerst storniert! Wenn Sie sich f<>r eine **
*** der Notl”sungen entscheiden k”nnen, bestellen Sie bitte **
*** neu und geben Sie an, welche der L”sungen Sie m”chten. **
****************************************************************
Bestellungen von ultraFORTH83 f<>r Rekorder bitte an:
Claus Vogt; B<>lowstr.67; D-1000 Westberlin 30
Zahlung bevorzugt per beigelegtem Verrechnungsscheck.
ultraFORTH83 f<>r C16 & C64 ist
Lauff„hig auf: C64, C128 im C64-Modus, C16/116 (min 32kB) und Plus4
mit Diskettenlaufwerk. Kostet 50.-DM +NN (2 Disks, 200 S. Handbuch)
*******Lieferung von ultraFORTH83 rev 3.8 auf Kassette: ***********
******* f<>r C16/116 mit 64kB oder Plus 4 ***********
Da es uns leider nicht gelungen ist, zu einem vertretbaren Preis
eine Kassette im von uns gew<65>nschten Format zu produzieren, die
auch auf jedem Rekorder problemlos gelesen werden kann, k”nnen wir
vorerst nur verschiedene Notl”sungen anbieten:
1) Lieferung auf Kassette im Format: C16 und Supertape gemischt (15 min) .
Diese Kassette erfordert aufgrund des empfindlichen
Formats auf den meisten Rekordern ein Einjustieren des
Tonkopf. Ein kleines Programm das dieses Einjustieren erleichtert,
wird mitgeliefert, allerdings muá selbst danach i.a. noch
mehrmals mit geringem Verstellen noch einige Zeit getestet werden,
bis die Kassette wirklich gelesen werden. F<>r alle, die die
entsprechenden Kenntnisse haben oder die entsprechende Hardware
(z.B. die in 64er und ComputeMit! vorgestellten Kontrollplatinen)
d<>rfte diese L”sung die beste sein. Bitte haben sie Verst„ndnis,
daá wir keinerlei Gew„hrleistung <20>bernehmen, wenn die Kassette
aufgrund mangelnder Tonkopfeinstellung nicht gelesen werden kann.
Kosten: wie normale Diskettenversion
2) Lieferung auf Kassette im Format: C16 (120 min) .
Diese Kassette im normalen C16-Format bedingt f<>rchterlich
lange Ladezeiten. Ein normales Forth-System braucht
ca. 10 min, ebenso wie eine Ramdisk. Die Arbeit wird zur Qual und
bei solchen Ladezeiten werden auch die Ladefehler h„ufig.
Sie k”nnen selbstverst„ndlich die Kassette (wenn Sie sie
einmal geladen haben) im Supertape-Format auf eine andere
Kassette sichern. Bitte haben sie Verst„ndnis,
daá wir keinerlei Gew„hrleistung <20>bernehmen, wenn die Kassette
aufgrund mangelnder Tonkopfeinstellung nicht gelesen werden kann.
Kosten: Aufpreis von 10.-DM auf normale Diskettenversion
3) Lieferung auf Diskette f<>r 1541/1551 im komprimierten Ramdisk-Format.
Dazu brauchen Sie Zugang zu einem Diskettenlaufwerk. Die Forth-
Quelltexte des Lieferumfangs sind hier bereits in Files zusammengefaát,
die Sie nur auf Ihren Rekorder kopieren brauchen. Dies kann mit
normalen Betriebssystemmitteln, Kopierprogrammen oder einer
mitgelieferten (Forth)-Kopiermethode geschehen. Die reine Kopierzeit
betr„gt ca. 40 min (Supertape-Format) bis zu ca. 200 min (Commodore-Format),
sodaá Sie schon einen Nachmittag zum Kopieren rechnen sollten.
Kosten: wie normale Diskettenversion
Noch zu einer oft gestellte Frage:
'Enth„lt die Kassettenversion alles, was auch die Diskettenversion enth„lt?'
Ja, tut sie.
Claus Vogt
Erg„nzung zum Kassettenbeipackzettel.
Eine Ramdisk namens RD.makecopy ist zum Lieferumfang hinzugekommen.
Sie ist insbesondere sinnvoll, wenn Sie die Kassettenversion auf
einer Diskette mit komprimierten Ramdisks erhalten. In diesem Fall
geben Sie ein:
LOAD"C16DEMO" ; Laden eines Forth-Systems
RUN ; Starten
LIMIT N" RD.makecopy*" BLOAD ; Laden einer Ramdisk
1 DRIVE ; Umschalten auf virtuelles Laufwerk 1
1 LIST ; Listen der Directory desselben
25 LOAD ; Laden des Kopierprogramms
im Fehlerfall k”nnen Sie mit CONT fortsetzen.
Ein Programm namens JUSTAGE zum Tonkopfjustieren wird - wenn fertig -
demn„chst hinzugef<65>gt. Es wird das erste Programm auf der Kassette sein.
Die angegebenen Z„hlerst„nde sind nur als grobe Anhaltspunkte zu
verstehen und gelten nur f<>r Supertape-Format.
Die Schriftz<74>ge 'ultraFORTH83' auf dem Beipackzettel sind zum
bekleben der Kassetten gedacht.
Claus Vogt


File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,166 @@
\ transient Assembler clv10oct87
\ Basis: Forth Dimensions VOL III No. 5)
\ internal loading 04may85BP/re)
\ Forth-6502 Assembler clv10oct87
\ Basis: Forth Dimensions VOL III No. 5)
Onlyforth Assembler also definitions
\ here $800 hallot heap dp !
\ Forth-83 6502-Assembler 20oct87re
: end-code context 2- @ context ! ;
Create index
$0909 , $1505 , $0115 , $8011 ,
$8009 , $1D0D , $8019 , $8080 ,
$0080 , $1404 , $8014 , $8080 ,
$8080 , $1C0C , $801C , $2C80 ,
| Variable mode
: Mode: ( n -) Create c,
Does> ( -) c@ mode ! ;
0 Mode: .A 1 Mode: #
2 | Mode: mem 3 Mode: ,X
4 Mode: ,Y 5 Mode: X)
6 Mode: )Y $F Mode: )
\ upmode cpu 20oct87re
| : upmode ( addr0 f0 - addr1 f1)
IF mode @ 8 or mode ! THEN
1 mode @ $F and ?dup IF
0 DO dup + LOOP THEN
over 1+ @ and 0= ;
: cpu ( 8b -) Create c,
Does> ( -) c@ c, mem ;
00 cpu brk $18 cpu clc $D8 cpu cld
$58 cpu cli $B8 cpu clv $CA cpu dex
$88 cpu dey $E8 cpu inx $C8 cpu iny
$EA cpu nop $48 cpu pha $08 cpu php
$68 cpu pla $28 cpu plp $40 cpu rti
$60 cpu rts $38 cpu sec $F8 cpu sed
$78 cpu sei $AA cpu tax $A8 cpu tay
$BA cpu tsx $8A cpu txa $9A cpu txs
$98 cpu tya
\ m/cpu 20oct87re
: m/cpu ( mode opcode -) Create c, ,
Does>
dup 1+ @ $80 and IF $10 mode +! THEN
over $FF00 and upmode upmode
IF mem true Abort" invalid" THEN
c@ mode @ index + c@ + c, mode @ 7 and
IF mode @ $F and 7 <
IF c, ELSE , THEN THEN mem ;
$1C6E $60 m/cpu adc $1C6E $20 m/cpu and
$1C6E $C0 m/cpu cmp $1C6E $40 m/cpu eor
$1C6E $A0 m/cpu lda $1C6E $00 m/cpu ora
$1C6E $E0 m/cpu sbc $1C6C $80 m/cpu sta
$0D0D $01 m/cpu asl $0C0C $C1 m/cpu dec
$0C0C $E1 m/cpu inc $0D0D $41 m/cpu lsr
$0D0D $21 m/cpu rol $0D0D $61 m/cpu ror
$0414 $81 m/cpu stx $0486 $E0 m/cpu cpx
$0486 $C0 m/cpu cpy $1496 $A2 m/cpu ldx
$0C8E $A0 m/cpu ldy $048C $80 m/cpu sty
$0480 $14 m/cpu jsr $8480 $40 m/cpu jmp
$0484 $20 m/cpu bit
\ Assembler conditionals 20oct87re
| : range? ( branch -- branch )
dup abs $7F u> Abort" out of range " ;
: [[ ( BEGIN) here ;
: ?] ( UNTIL) c, here 1+ - range? c, ;
: ?[ ( IF) c, here 0 c, ;
: ?[[ ( WHILE) ?[ swap ;
: ]? ( THEN) here over c@ IF swap !
ELSE over 1+ - range? swap c! THEN ;
: ][ ( ELSE) here 1+ 1 jmp
swap here over 1+ - range? swap c! ;
: ]] ( AGAIN) jmp ;
: ]]? ( REPEAT) jmp ]? ;
\ Assembler conditionals 20oct87re
$90 Constant CS $B0 Constant CC
$D0 Constant 0= $F0 Constant 0<>
$10 Constant 0< $30 Constant 0>=
$50 Constant VS $70 Constant VC
: not $20 [ Forth ] xor ;
: beq 0<> ?] ; : bmi 0>= ?] ;
: bne 0= ?] ; : bpl 0< ?] ;
: bcc CS ?] ; : bvc VS ?] ;
: bcs CC ?] ; : bvs VC ?] ;
\ 2inc/2dec winc/wdec 20oct87re
: 2inc ( adr -- )
dup lda clc 2 # adc
dup sta CS ?[ swap 1+ inc ]? ;
: 2dec ( adr -- )
dup lda sec 2 # sbc
dup sta CC ?[ swap 1+ dec ]? ;
: winc ( adr -- )
dup inc 0= ?[ swap 1+ inc ]? ;
: wdec ( adr -- )
dup lda 0= ?[ over 1+ dec ]? dec ;
: ;c:
recover jsr end-code ] 0 last ! 0 ;
\ ;code Code code> bp/re03feb85
Onlyforth
: Assembler
Assembler [ Assembler ] mem ;
: ;Code
[compile] Does> -3 allot
[compile] ; -2 allot Assembler ;
immediate
: Code Create here dup 2- ! Assembler ;
: >label ( adr -)
here | Create immediate swap ,
4 hallot heap 1 and hallot ( 6502-alig)
here 4 - heap 4 cmove
heap last @ count $1F and + ! dp !
Does> ( - adr) @
state @ IF [compile] Literal THEN ;
: Label
[ Assembler ] here >label Assembler ;
\ dp !
Onlyforth

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
/* convert */
PARSE ARG in out
SAY in out
rc = Stream(in,"C","OPEN READ")
rc = Stream(out,"C","OPEN WRITE")
cnt = 0
end = 174080
DO WHILE cnt < end
DO u = 0 to 23
line = ""
line = charin(in,, 41)
rc = lineout(out,line)
cnt = cnt + 41
END
line = charin(in,,40)
rc = lineout(out,line)
cnt = cnt + 40
END
rc = Stream(out,"C", "CLOSE")
rc = Stream(in, "C", "CLOSE")
RETURN

View File

@ -0,0 +1 @@
\ tools for decompiling, clv12oct87 ( interactive use ) Onlyforth Tools also definitions | : ?: ?cr dup 4 u.r ." :" ; | : @? dup @ 6 u.r ; | : c? dup c@ 3 .r ; | : bl $24 col - 0 max spaces ; : s ( adr - adr+) ( print literal string) ?: space c? 4 spaces dup count type dup c@ + 1+ bl ; ( count + re) : n ( adr - adr+2) ( print name of next word by its cfa) ?: @? 2 spaces dup @ >name .name 2+ bl ; : k ( adr - adr+2) ( print literal value) ?: @? 2+ bl ; ( tools for decompiling, interactive ) : d ( adr n - adr+n) ( dump n bytes) 2dup swap ?: 3 spaces swap 0 DO c? 1+ LOOP 4 spaces -rot type bl ; : c ( adr - adr+1) ( print byte as unsigned value) 1 d ; : b ( adr - adr+2) ( print branch target location ) ?: @? dup @ over + 6 u.r 2+ bl ; ( used for : ) ( Name String Literal Dump Clit Branch ) ( - - - - - - ) ( debugging utilities bp 19 02 85 ) : unravel \ unravel perform (abort" rdrop rdrop rdrop cr ." trace dump is " cr BEGIN rp@ r0 @ - WHILE r> dup 8 u.r space 2- @ >name .name cr REPEAT (error ; ' unravel errorhandler !

View File

@ -0,0 +1,64 @@
\ tools for decompiling, clv12oct87
( interactive use )
Onlyforth Tools also definitions
| : ?: ?cr dup 4 u.r ." :" ;
| : @? dup @ 6 u.r ;
| : c? dup c@ 3 .r ;
| : bl $24 col - 0 max spaces ;
: s ( adr - adr+)
( print literal string)
?: space c? 4 spaces dup count type
dup c@ + 1+ bl ; ( count + re)
: n ( adr - adr+2)
( print name of next word by its cfa)
?: @? 2 spaces
dup @ >name .name 2+ bl ;
: k ( adr - adr+2)
( print literal value)
?: @? 2+ bl ;
( tools for decompiling, interactive )
: d ( adr n - adr+n) ( dump n bytes)
2dup swap ?: 3 spaces swap 0
DO c? 1+ LOOP
4 spaces -rot type bl ;
: c ( adr - adr+1)
( print byte as unsigned value)
1 d ;
: b ( adr - adr+2)
( print branch target location )
?: @? dup @ over + 6 u.r 2+ bl ;
( used for : )
( Name String Literal Dump Clit Branch )
( - - - - - - )
( debugging utilities bp 19 02 85 )
: unravel \ unravel perform (abort"
rdrop rdrop rdrop
cr ." trace dump is " cr
BEGIN rp@ r0 @ -
WHILE r> dup 8 u.r space
2- @ >name .name cr
REPEAT (error ;
' unravel errorhandler !

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,241 @@
\ Loadscreen for Decompiler 20oct87re
\ nach F83 by Henry Laxen / Mike Perry
\needs Tools Vocabulary Tools
.( Decompiler loading...)
Onlyforth
Tools also definitions
\needs dis ' drop | Alias dis
\ Disassemble if possible
&1 &9 +thru
\\
clear
\ case defining words 20aug85mawe
| : case: ( n -)
Create , 0 ]
Does> 2+ swap 2* + perform ;
| : associative:
Create , ( n -)
Does> ( n - index)
dup @ -rot dup @ 0
DO 2+ 2dup @ =
IF 2drop drop I 0 0 LEAVE THEN
LOOP 2drop ;
Defer (see
| Variable maxbranch
| Variable thenbranch
\ decompile each type of word 29nov85re
| : .word ( IP - IP')
dup @ >name .name 2+ ;
| : .lit ( IP - IP')
.word dup @ . 2+ ;
| : .clit ( IP - IP')
.word dup c@ . 1+ ;
| : .string ( IP - IP')
cr .word count 2dup type ascii " emit
space + ;
| : .do ( IP - IP') ." DO " 4 + ;
| : .loop ( IP - IP') ." LOOP " 4 + ;
| : .exit ( IP - IP' f)
dup maxbranch @ u< IF .word exit THEN
dup @ [ Forth ] ['] unnest =
IF ." ; " ELSE .word ." ; -2 allot "
THEN 0= ;
\ branch, ?branch 29nov85re
| : .to
." back to " .word drop ;
| : .branch ( IP - IP')
2+ dup @ 2dup + swap 0<
IF cr ." REPEAT to " .exit
0<> swap 2+ and exit
THEN cr ." ELSE " dup thenbranch !
dup maxbranch @ u>
IF maxbranch ! ELSE drop THEN 2+ ;
| : .?branch ( IP - IP')
2+ dup @ 2dup +
swap 0<
IF cr ." UNTIL " .to 2+ exit THEN
cr dup 4 - @ [ ' branch ] literal =
over 2- @ 0< and
IF ." WHILE "
ELSE ." IF " dup thenbranch !
THEN dup maxbranch @ u>
IF maxbranch ! ELSE drop THEN 2+ ;
\ decompile does> ;code ; 20oct87re
| : does? ( IP - IP' f)
dup 3 + swap
dup c@ $4C = swap \ jmp-opcode
1+ @ ['] Forth @ 1+ @ = \ (dodoes>
and ;
| : .(;code ( IP - IP' f)
2+ does?
IF cr ." Does> "
ELSE ." ;Code " 3 - dis 0 THEN ;
| : .compile ( IP -- IP' )
.word .word ;
\ classify each word 20oct87re
&18 associative: execution-class
Forth
' lit , ' clit , ' ?branch ,
' branch , ' (DO , ' (." ,
' (abort" , ' Does> 4 + @ , \ (;code
' exit , ' abort , ' quit ,
' 'quit , ' (quit , ' unnest ,
' (" , ' (?DO , ' (LOOP ,
' compile ,
&19 case: .execution-class
.lit .clit .?branch
.branch .do .string
.string .(;code
.exit .exit .exit
.exit .exit .exit
.string .do .loop
.compile .word ;
\ decompile a :-definition 20aug85mawe
: .pfa ( cfa -)
>body
BEGIN ?cr dup
dup thenbranch @ =
IF ." THEN " ?cr THEN
@ execution-class .execution-class
dup 0= stop? or UNTIL
drop ;
: .immediate ( cfa -)
>name c@ dup
?cr $40 and IF ." Immediate " THEN
?cr $80 and IF ." restrict" THEN ;
: .constant ( cfa -)
dup >body @ . ." Constant "
>name .name ;
: .variable ( cfa -)
dup >body . ." Variable "
dup >name .name
cr ." Value = " >body @ . ;
\ display category of word 20oct87re
: .: ( cfa -)
." : " dup >name .name cr .pfa ;
: .does> ( cfa -)
cr ." Does> " 2- .pfa ;
: .user-variable ( cfa -)
dup >body c@ . ." User-Variable "
dup >name .name
cr ." Value = " execute @ . ;
: .defer ( cfa -)
." deferred " dup >name .name
." Is " >body @ (see ;
: .other ( cfa -)
dup >name .name
dup @ over >body =
IF ." is Code" @ dis exit THEN
dup @ does? IF .does> drop exit THEN
drop ." maybe Code" @ dis ;
\ Classify a word 22jul85we
5 associative: definition-class
' quit @ , ' 0 @ ,
' scr @ , ' base @ ,
' 'cold @ ,
6 case: .definition-class
.: .constant
.variable .user-variable
.defer .other ;
\ Top level of Decompiler 20aug85mawe
: ((see ( cfa -)
maxbranch off thenbranch off
cr dup dup @
definition-class .definition-class
.immediate ;
' ((see Is (see
Forth definitions
: see ' (see ;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,129 @@
\ disassembler 6502 loadscr 06mar86re
Onlyforth
\needs Tools Vocabulary Tools
Tools also definitions hex
| : tabelle ( +n -- )
Create 0 DO
bl word number drop , LOOP
Does> ( 8b1 -- 8b2 +n )
+ count swap c@ ;
\ dis shortcode0 20oct87re
base @ hex
$80 | tabelle shortcode0
0B10 0000 0000 0341 2510 0320 0000 0332
0AC1 0000 0000 03A1 0E10 0000 0000 0362
1D32 0000 0741 2841 2710 2820 0732 2832
08C1 0000 0000 28A1 2D10 0000 0000 2862
2A10 0000 0000 2141 2410 2120 1C32 2132
0CC1 0000 0000 21A1 1010 0000 0000 2162
2B10 0000 0000 2941 2610 2920 1CD2 2932
0DC1 0000 0000 29A1 2F10 0000 0000 2962
0000 0000 3241 3141 1710 3610 3232 3132
04C1 0000 32A1 31B1 3810 3710 0000 0000
2051 1F51 2041 1F41 3410 3310 2032 1F32
05C1 0000 20A1 1FB1 1110 3510 2062 1F72
1451 0000 1441 1541 1B10 1610 1432 1532
09C1 0000 0000 15A1 0F10 0000 0000 1562
1351 0000 1341 1941 1A10 2210 1332 1932
06C1 0000 0000 19A1 2E10 0000 0000 1962
base !
\ dis scode adrmode 20oct87re
| Create scode
$23 c, $02 c, $18 c, $01 c,
$30 c, $1e c, $12 c, $2c c,
| Create adrmode
$81 c, $41 c, $51 c, $32 c,
$91 c, $a1 c, $72 c, $62 c,
| : shortcode1 ( 8b1 - 8b2 +n)
2/ dup 1 and
IF 0= 0 exit THEN
2/ dup $7 and adrmode + c@
swap 2/ 2/ 2/ $7 and scode + c@ ;
| Variable mode
| Variable length
\ dis shortcode texttab 06mar86re
| : shortcode ( 8b1 -- +n )
dup 1 and ( ungerade codes)
IF dup $89 =
IF drop 2 THEN shortcode1
ELSE shortcode0 ( gerade codes)
THEN
swap dup 3 and length !
2/ 2/ 2/ 2/ mode ! ;
| : texttab ( char +n 8b -- )
Create
dup c, swap 0 DO >r dup word
1+ here r@ cmove r@ allot r>
LOOP 2drop
Does> ( +n -- )
count >r swap r@ * + r> type ;
\ dis text-tabellen 06mar86re
bl $39 3 | texttab .mnemonic
*by adc and asl bcc bcs beq bit bmi bne
bpl brk bvc bvs clc cld cli clv cmp cpx
cpy dec dex dey eor inc inx iny jmp jsr
lda ldx ldy lsr nop ora pha php pla plp
rol ror rti rts sbc sec sed sei sta stx
sty tax tay tsx txa txs tya
( +n -- )
Ascii / $E 1 | texttab .vor
/ /a/ /z/#/ / /(/(/z/z/ /(/
Ascii / $E 3 | texttab .nach
/ / / / / /,x
/,y /,x)/),y/,x /,y / /) /
\ dis 2u.r 4u.r 06mar86re
: 4u.r ( u -)
0 <# # # # # #> type ;
: 2u.r ( u -)
0 <# # # #> type ;
-->
\ dis 20oct87re
Forth definitions
: dis ( adr -- ) base push hex
BEGIN
cr dup 4u.r space dup c@ dup 2u.r space
shortcode >r length @ dup
IF over 1+ c@ 2u.r space THEN dup 2 =
IF over 2+ c@ 2u.r space THEN
2 swap - 3 * spaces
r> .mnemonic space 1+
mode @ dup .vor $C =
IF dup c@ dup $80 and IF $100 - THEN
over + 1+ 4u.r
ELSE length @ dup 2 swap - 2* spaces
?dup
IF 2 =
IF dup @ 4u.r
ELSE dup c@ 2u.r
THEN THEN THEN mode @ .nach length @ +
stop? UNTIL drop ;

View File

@ -0,0 +1 @@
\ Multitasker BP 13.9.84 ) Onlyforth \needs multitask 1 +load save 2 4 +thru \ Tasker \ 5 +load \ Demotask \ Multitasker BP 13.9.84 ) \needs Code -$36 +load \ transient Ass Code stop SP 2dec IP lda SP X) sta IP 1+ lda SP )Y sta SP 2dec RP lda SP X) sta RP 1+ lda SP )Y sta 6 # ldy SP lda UP )Y sta iny SP 1+ lda UP )Y sta 1 # ldy tya clc UP adc W sta txa UP 1+ adc W 1+ sta W 1- jmp end-code | Create taskpause Assembler $2C # lda UP X) sta ' stop @ jmp end-code : singletask [ ' pause @ ] Literal ['] pause ! ; : multitask taskpause ['] pause ! ; \ pass activate ks 8 may 84 ) : pass ( n0 .. nr-1 Tadr r -- ) BEGIN [ rot ( Trick ! ) ] swap $2C over c! \ awake Task r> -rot \ IP r addr 8 + >r \ s0 of Task r@ 2+ @ swap \ IP r0 r 2+ 2* \ bytes on Taskstack \ incl. r0 & IP r@ @ over - \ new SP dup r> 2- ! \ into ssave swap bounds ?DO I ! 2 +LOOP ; restrict : activate ( Tadr --) 0 [ -rot ( Trick ! ) ] REPEAT ; -2 allot restrict : sleep ( Tadr --) $4C swap c! ; \ JMP-Opcode : wake ( Tadr --) $2C swap c! ; \ BIT-Opcode \ building a Task BP 13.9.84 ) | : taskerror ( string -) standardi/o singletask ." Task error : " count type multitask stop ; : Task ( rlen slen -- ) allot \ Stack here $FF and $FE = IF 1 allot THEN \ 6502-align up@ here $100 cmove \ init user area here $4C c, \ JMP opcode \ to sleep Task up@ 1+ @ , dup up@ 1+ ! \ link Task 3 allot \ allot JSR wake dup 6 - dup , , \ ssave and s0 2dup + , \ here + rlen = r0 under + here - 2+ allot ['] taskerror over [ ' errorhandler >body c@ ] Literal + ! Constant ; \ more Tasks ks/bp 26apr85re) : rendezvous ( semaphoradr -) dup unlock pause lock ; | : statesmart state @ IF [compile] Literal THEN ; : 's ( Tadr - adr.of.taskuservar) ' >body c@ + statesmart ; immediate \ Syntax: 2 Demotask 's base ! \ makes Demotask working binary : tasks ( -) ." MAIN " cr up@ dup 1+ @ BEGIN 2dup - WHILE dup [ ' r0 >body c@ ] Literal + @ 6 + name> >name .name dup c@ $4C = IF ." sleeping" THEN cr 1+ @ REPEAT 2drop ;

View File

@ -0,0 +1,106 @@
\ Multitasker BP 13.9.84 )
Onlyforth
\needs multitask 1 +load save
2 4 +thru \ Tasker
\ 5 +load \ Demotask
\ Multitasker BP 13.9.84 )
\needs Code -$36 +load \ transient Ass
Code stop
SP 2dec IP lda SP X) sta
IP 1+ lda SP )Y sta
SP 2dec RP lda SP X) sta
RP 1+ lda SP )Y sta
6 # ldy SP lda UP )Y sta
iny SP 1+ lda UP )Y sta
1 # ldy tya clc UP adc W sta
txa UP 1+ adc W 1+ sta
W 1- jmp end-code
| Create taskpause Assembler
$2C # lda UP X) sta ' stop @ jmp
end-code
: singletask
[ ' pause @ ] Literal ['] pause ! ;
: multitask taskpause ['] pause ! ;
\ pass activate ks 8 may 84 )
: pass ( n0 .. nr-1 Tadr r -- )
BEGIN [ rot ( Trick ! ) ]
swap $2C over c! \ awake Task
r> -rot \ IP r addr
8 + >r \ s0 of Task
r@ 2+ @ swap \ IP r0 r
2+ 2* \ bytes on Taskstack
\ incl. r0 & IP
r@ @ over - \ new SP
dup r> 2- ! \ into ssave
swap bounds ?DO I ! 2 +LOOP ;
restrict
: activate ( Tadr --)
0 [ -rot ( Trick ! ) ] REPEAT ;
-2 allot restrict
: sleep ( Tadr --)
$4C swap c! ; \ JMP-Opcode
: wake ( Tadr --)
$2C swap c! ; \ BIT-Opcode
\ building a Task BP 13.9.84 )
| : taskerror ( string -)
standardi/o singletask
." Task error : " count type
multitask stop ;
: Task ( rlen slen -- )
allot \ Stack
here $FF and $FE =
IF 1 allot THEN \ 6502-align
up@ here $100 cmove \ init user area
here $4C c, \ JMP opcode
\ to sleep Task
up@ 1+ @ ,
dup up@ 1+ ! \ link Task
3 allot \ allot JSR wake
dup 6 - dup , , \ ssave and s0
2dup + , \ here + rlen = r0
under + here - 2+ allot
['] taskerror over
[ ' errorhandler >body c@ ] Literal + !
Constant ;
\ more Tasks ks/bp 26apr85re)
: rendezvous ( semaphoradr -)
dup unlock pause lock ;
| : statesmart
state @ IF [compile] Literal THEN ;
: 's ( Tadr - adr.of.taskuservar)
' >body c@ + statesmart ; immediate
\ Syntax: 2 Demotask 's base !
\ makes Demotask working binary
: tasks ( -)
." MAIN " cr up@ dup 1+ @
BEGIN 2dup - WHILE
dup [ ' r0 >body c@ ] Literal + @
6 + name> >name .name
dup c@ $4C = IF ." sleeping" THEN cr
1+ @ REPEAT 2drop ;

View File

@ -0,0 +1 @@
\ Sieve benchmark 20oct87re Onlyforth : allot ( u --) dup sp@ here - $180 - u> abort" no room" allot ; &8192 Constant size Create flags size allot : do-prime ( -- #primes ) flags size 1 fill 0 size 0 DO flags I + c@ IF I 2* 3+ dup I + BEGIN dup size < WHILE 0 over flags + c! over + REPEAT 2drop 1+ THEN LOOP ; : benchmark 9 0 DO do-prime drop LOOP do-prime . ." Primzahlen" ; : .primes size 0 DO flags I + c@ IF I 2* 3+ . THEN ?cr stop? IF LEAVE THEN LOOP ;

View File

@ -0,0 +1,25 @@
\ Sieve benchmark 20oct87re
Onlyforth
: allot ( u --)
dup sp@ here - $180 - u>
abort" no room" allot ;
&8192 Constant size
Create flags size allot
: do-prime ( -- #primes )
flags size 1 fill 0
size 0 DO flags I + c@
IF I 2* 3+ dup I +
BEGIN dup size <
WHILE 0 over flags + c!
over +
REPEAT 2drop 1+
THEN
LOOP ;
: benchmark 9 0 DO do-prime drop LOOP
do-prime . ." Primzahlen" ;
: .primes size 0 DO flags I + c@
IF I 2* 3+ . THEN ?cr
stop? IF LEAVE THEN LOOP ;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,174 @@
\ tracer: loadscreen clv12oct87
Onlyforth
\needs Code -$2B +load \ Trans Assembler
\needs Tools Vocabulary Tools
Tools also definitions
1 6 +thru \ Tracer
7 8 +thru \ Tools for decompiling
Onlyforth
\\
Dieser wundervolle Tracer wurde
von Bernd Pennemann und Co fuer
den Atari entwickelt. Ich liess mir
aufschwatzen, ihn an C64/C16 anzupassen
und muss sagen, es ging erstaunlich
einfach. /clv
\ tracer: wcmp variables clv04aug87
Assembler also definitions
: wcmp ( adr1 adr2--) \ Assembler-Macro
over lda dup cmp swap \ compares word
1+ lda 1+ sbc ;
Only Forth also Tools also definitions
| Variable (W
| Variable <ip | Variable ip>
| Variable nest? | Variable trap?
| Variable last' | Variable #spaces
\ tracer:cpush oneline clv12oct87
| Create cpull 0 ]
rp@ count 2dup + rp! r> swap cmove ;
: cpush ( addr len -)
r> -rot over >r
rp@ over 1+ - dup rp! place
cpull >r >r ;
| : oneline &82 allot keyboard display
.status space query interpret
-&82 allot rdrop
( delete quit from tnext ) ;
: range ( adr--) \ ermittelt <ip ip>
ip> off dup <ip !
BEGIN 1+ dup @
[ Forth ] ['] unnest = UNTIL
3+ ip> ! ;
\ tracer:step tnext clv04aug87
| Code step
$ff # lda trap? sta trap? 1+ sta
RP X) lda IP sta
RP )Y lda IP 1+ sta RP 2inc
(W lda W sta (W 1+ lda W 1+ sta
Label W1- W 1- jmp end-code
| Create: nextstep step ;
Label tnext IP 2inc
trap? lda W1- beq
nest? lda 0= \ low(!)Byte test
?[ IP <ip wcmp W1- bcc
IP ip> wcmp W1- bcs
][ nest? stx \ low(!)Byte clear
]?
trap? dup stx 1+ stx \ disable tracer
W lda (W sta W 1+ lda (W 1+ sta
\ tracer:..tnext clv12oct87
;c: nest? @
IF nest? off r> ip> push <ip push
dup 2- range
#spaces push 1 #spaces +! >r THEN
r@ nextstep >r
input push output push
2- dup last' !
cr #spaces @ spaces
dup 4 u.r @ dup 5 u.r space
>name .name $10 col - 0 max spaces .s
state push blk push >in push
[ ' 'quit >body ] Literal push
[ ' >interpret >body ] Literal push
#tib push tib #tib @ cpush r0 push
rp@ r0 !
['] oneline Is 'quit quit ;
\ tracer:do-trace traceable clv12oct87
| Code do-trace \ installs TNEXT
tnext 0 $100 m/mod
# lda Next $c + sta
# lda Next $b + sta
$4C # lda Next $a + sta Next jmp
end-code
| : traceable ( cfa--<IP ) recursive
dup @
['] : @ case? IF >body exit THEN
['] key @ case? IF >body c@ Input @ +
@ traceable exit THEN
['] type @ case? IF >body c@ Output @ +
@ traceable exit THEN
['] r/w @ case? IF >body
@ traceable exit THEN
@ [ ' Forth @ @ ] Literal =
IF @ 3 + exit THEN
\ fuer def.Worte mit does>
>name .name ." can't be DEBUGged"
quit ;
\ tracer:Benutzer/innen-Worte clv12oct87
: nest \ trace into current word
last' @ @ traceable drop nest? on ;
: unnest \ proceeds at calling word
<ip on ip> off ; \ clears trap range
: endloop last' @ 4 + <ip ! ;
\ no trace of next word to skip LOOP..
' end-trace Alias unbug \ cont. execut.
: (debug ( cfa-- )
traceable range
nest? off trap? on #spaces off
Tools do-trace ;
Forth definitions
: debug ' (debug ; \ word follows
: trace' \ word follows
' dup (debug execute end-trace ;

View File

@ -0,0 +1,168 @@
Daten<EFBFBD>bertragung von Commodore-Plus4 auf den PC clv03jul89
////Stichworte: Commodore-Plus4
serielle Daten<65>bertragung
Screenformat_40mal25
volksFORTH
////Abstract:
Der Autor hatte das Problem, seine in ultraFORTH auf Plus4 entwickelten
Quelltext-Screens auf einen IBM-
kompatiblen PC zu transportieren, um sie dort
unter volksFORTH 3.8.1-2 weiterzuverarbeiten. Dieser
technologische Sprung erfordert ein gewisses Maá an Soft-
und Hardware, das es
erstmal zu entwickeln gilt. Die vorgestellten L”sungen sind weder besonders
intelligent noch besonders schwierig, k”nnen aber sicher dem einen oder der
anderen helfen, die Zeit lieber f<>r wichtigere Dinge zu verwenden. Teile der
L”sungen sind auch f<>r den Transport vom C64 aus und f<>r den Transport auf
andere Zielrechner (z.B. Atari ST) zu verwenden.
Es werden Hard- und Software f<>r die Plus4-Seite und geringe
Software„nderungen f<>r die PC-Seite vorgestellt.
////Artikel:
Zur Weiterverarbeitung von C16- und C64-
Screens auf anderen Rechnern stellen
sich folgende Probleme:
1) Die hardware-Verbindung der beiden Rechner
2) Ein šbertragungsprogramm auf dem Plus4
3) Die Anpassung der Software auf dem PC auf das Commodore-Screen-Format
von 25 Zeilen … 41 Buchstaben. Dies erfordert geringe Žnderungen im
volksForth-System, im Editor und im Druckertreiber.
1) Die hardware-Verbindung: Sie ist ganz einfach. (s.Tabelle 1 und 2)
Einerseits ist ein geeignetes Kabel erforderlich, ein User-Port-Stecker f<>r den
C64, ein RS-232-Stecker f<>r die andere Seite. Dazwischen muá aber noch ein
wenig Elektronik her, zur Konvertierung der TTL-Pegel der CBM-Rechner
(0 und +5 Volt) auf die vorgeschriebenen RS232-Pegel (+/- 3 Volt bis +/-
15 Volt). Die im User-Port vorhandene 9 Volt-Wechselspannung l„át sich meiner
Ansicht nach hierf<72>r nicht verwenden, da sie nicht potentialfrei von der
TTL-Versorgungsspannung ist. Ein zus„tzliches Netzteil wollte ich mir sparen,
sodaá die Wahl auf den MAX232 (kostet ca. 10 DM) fiel, der keine hohe externe
Versorgungsspannung erfordert. Der Inverter 7406 wurde gew„hlt, da das DCD- und
DSR-Signal bereits im Plus4 mit einem Kollektorwiderstand versehen ist. Da
dieses Signal von unserer Schaltung aber garnicht ver„ndert wird (Es liegt
immer auf High), ist ein 7404 sinnvoller, der keine Kollektorwiderst„nde
erfordert.
2) Ein šbertragungsprogramm f<>r den Plus4. (s.CBM-TERM.SCR)
Im Handbuch f<>r den Plus4 ist ein kurzes Terminalprogramm vorgestellt. Es
arbeitet mit oben vorgestelltem Kabel durchaus zusammen. Allerdings kann es zum
Filetransfers kaum eingesetzt werden, da die zugrundeliegenden
Betriebssystemroutinen keinen korrekten Hardwarehandshake machen. Ein
XON/XOFF-Protokoll ist im Betriebssystem zwar implementiert, aber nachdem noch
nicht einmal das Handbuch dies zu erw„hnen wagt, erscheint es auch nicht grade
als zuverl„ssige Variante. Die selbst erstellte Software lehnt sich ein
wenig an SERIAL.SCR der PC-Version an. Sie greift direkt auf den Chip des Plus4
zu (ein 6551, der bis zu 19.200 baud erlaubt, also nix f<>r C64!). Es werden
elementare W”rter (RX TX RX? TX?) definiert, ankommende Zeichen werden in einem
128 byte tiefen Buffer per Interrupt zwischengelagert.
H”here W”rter erlauben eine einfache Teletype-Emulation sowie die šbertragung
von Forth-Screens.
3) notwendige Žnderungen an der PC-Software. (s.CBM.SCR)
Dieser Teil bezieht sich auf volksFORTH3.8.1-2. Einzelne Teile sind aber sicher
auch auf andere Forth-Systeme <20>bertragbar (oder eventuell sogar auf die
neueren, immer zahlreicher erscheinenden volksFORTH-Versionen).
Die Žnderungen sind ausschlieálich deshalb erforderlich, weil ultraFORTH
ein etwas exotisches, dem kleinen Bildschirm angepaátes Screenformat verwendet.
Im Gegensatz zum Standard (der 16 Zeilen … 64 Buchstaben vorschreibt), werden
25 Zeilen benutzt, von denen die ersten 24 je 41 Buchstaben haben, die 25te nur
40 Buchstaben.
Zun„chst muá dem Forth-System das neue Format mitgeteilt werden. Dies ist
n”tig, da Worte wie: \ \needs sonst fehlerhaft arbeiten. Dies kann sehr
einfach durch patchen von C/L und L/S geschehen. Nun ist auch bereits ein
angucken der Screens mit LIST problemlos m”glich. Hierbei macht sich der
fehlende 41te Buchstabe der 25ten Zeile l„stig bemerkbar. An seiner Stelle
erscheint ein Zufallszeichen, da LIST f<>r jede Zeile 41 Buchstaben ausgibt. Ein
Sch”nheitsfehler, mit dem sich leben l„át.
Die Ausgabe auf den Drucker erfordert noch eine kleine Žnderung. Da die Screens
etwas l„nger sind, wird es etwas enger auf der Seite. Dies l„át sich durch
Umschalten auf kleinen Zeilenabstand (Wort: 8/" ) erreichen. Zumindest
auf Endlos-Papier passen damit 6 Screens pro Seite. Die Stelle, an der dieses
Wort ausgef<65>hrt werden muá, ist je nach Drucker verschieden. Dem
EPSON.PRN-Treiber, den ich verwendet habe, reicht es v”llig, ein einziges Mal
umgestellt zu werden. Der GRAPHICS.PRN-Treiber ist in dieser Beziehung etwas
problematischer, da das Wort NORMAL jedesmal auf den Standard-Zeilen-Abstand
von 6-Zeilen-per-Zoll zur<75>ckschaltet. Hier sollte das 8/" anschlieáend in
NORMAL ausgef<65>hrt werden.
Auch das Betrachten und Ver„ndern von ultraFORTH-Screens mit dem Editor ist
durch Gerinf<6E>gige Žnderungen in EDITOR.SCR, die in CBM.SCR,Scr 5
aufgef<EFBFBD>hrt sind,
einfach zu erreichten. Auch beim Editor ignorieren wir kleinere
Sch”nheitsfehler: Die Statuszeile
verdeckt am Anfang die letzte Zeile, die Fehlermeldungen kann man nicht mehr
sehen.
An zus„tzlicher Software enth„lt CBM.SCR noch spezielle Worte zum Behandeln
von Ascii-Nullen im Quelltext. Commodore-Disketten enthalten auf nicht
benutzten Screens gerne allerlei bin„res Gewimmel. Sei es vom Formatieren
<EFBFBD>briggeblieben oder von alten Files: es st”rt. Es „uáert sich beim Ausdrucken
als groáe schwarze K„stchen und kostet Zeit und Farbband. Bin„re Nullen sind
ein sicheres Indiz f<>r solche bin„r-Screens. Die Worte SEARCH0 REPLACE0 bzw.
WIPE0 sind daf<61>r, solche Screens zu finden, die Nullen durch Blanks zu ersetzen
bzw. den gesamten Screen mit Blanks zu <20>berschreiben.
Claus Vogt, B<>lowstr. 67, D-1000 Berlin 30
--Tabelle------------------------------------------------------------------
UP 1 User-Port-Stecker C64 (paát auch auf Plus4)
1 Stecker-Geh„use (passend zu UP, mit Platz f<>r 2 ICs drin)
2 m 9-poliges Kabel
1 sub-d25 bzw. sub-d9-Stecker
1 Max232-Pegelwandler
1 7406-Inverter (oder 7404)
R1,R2 2 Widerst„nde 10k (nur, wenn 7406)
R3 1 Widerstand 3k
C1..4 4 22uF-Kondensatoren
1 kleine Lochraster-Platine
Tab1: St<53>ckliste CBM+4-auf-PC-Kabel
--Tabelle------------------------------------------------------------------
Die aus dem User-Port kommenden Anschl<68>sse C,D,M,K werden (teils <20>ber Inverter
7406 durch den (ebenfalls invertierenden Pegelwandler max232 gef<65>hrt) und
anschlieáend nach Bedarf an sub-d25 oder sub-d9 gef<65>hrt.
Um die folgende - etwas esoterische Notation zu erl„utern, sei die
erste Zeile nochmal als Klartext beschrieben:
Das RxD-(Receive-Data)-Signal aus User-Port, Pin C wird mittels
Leitung in den Max232, Pin 9 gef<65>hrt, der es an Pin 8 wieder
rausl„žt, von wo es per Leitung je nach Bedarf an den Sub-d25-
Stecker Pin 3 oder Sub-D9 Pin 2 gef<65>hrt, ein TxD (transmit-data)-
Signal darstellt:
RxD = UP:C ---- max232:09--08 -- sub-d25:3 bzw: sub-d9:2 = TxD
RTS = UP:D ---- 7406:5--6 -- max232:10--07 -- sub-d25:4 bzw: sub-d9:7 = CTS
TxD = UP:M ---- max232:11--14 -- sub-d25:2 bzw: sub-d9:3 = RxD
CTS = UP:K ---- 7406:2--1 -- max232:12--13 -- sub-d25:5 bzw: sub-d9:8 = CTS
Die Spannungsversorgung sieht so aus:
GND = UP:1 ---- 7406:7 -- max232:15 -- sub-d25:1 bzw: sub-d9:5
+5V = UP:2 ---- 7406:14 -- max232:16
Der 7406 erfordert Kollektorwiderst„nde (wer sie sparen m”chte kann einen 7404
nehmen und sie weglassen).
7406:6 -- R1=10k -- +5V
7406:2 -- R2=10k -- +5V
Der max232 braucht noch eine Reihe 22uF-Kondensatoren f<>r seine Ladungspumpe:
max232:1 --+C1-- max232:3
max232:4 --+C2-- max232:5
max232:6 --+C3-- GND
GND --+C4-- max232:2 -- R3=3k -- sub_d20:4 bzw: sub-d9:6 =DSR
Tab2: Verdrahtung CBM+4-auf-PC-Kabel

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
\\ CBM.SCR - Benutzunb von Commodore-Screens mit Atariclv05jan90 Das Commodore-Screen-Format von 25 Zeilen a 41 Buchstaben kann so unter Atari ST, volksFORTH 3.80 verwendet werden. Autor: Claus Vogt, B<>lowstr. 67, D-1000 Berlin 30 \ CBM.SCR clv05jan90 ' Ediicon.scr $26 + Alias (dx ' Ediicon.scr $2a + Alias (dy : 64x16 2 (dx ! 4 (dy ! &64 ['] c/l >body ! &16 ['] l/s >body ! [ printer ] ['] 1/6" ['] normal 8 + ! ; : 41x25 0 (dx ! 0 (dy ! &41 ['] c/l >body ! &25 ['] l/s >body ! [ printer ] ['] 1/8" ['] normal 8 + ! ;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,53 @@
Claus Vogt, B<>lowstr.67, D-1000 Berlin 30 030/216 89 38 5.1.90
Vierte Dimension / D.Luda Soft
Staudinger Str.65
D-8000 M<>nchen 83
Liebe Redaktion,
anbei:
- Erg„nzung zum Artikel Datentransfers Commodore-PC in VD....
- dazu ein Ein-Screen-Quellchen: CBM_ST.SCR
Mit forthigen Gr<47>žen,
- Claus Vogt -
Artikel f<>r die Vierte Dimension:
TITEL:::::
Erg„nzung zu ........... in VD .............
F<EFBFBD>r jene, die Ihre volksFORTH-Quellen auf C16 oder C64
im 41x25-Format geschrieben haben und sie gerne auf
Atari-ST weiterverwenden m”chten, gibt es - „hnlich
zur PC-Variante - auch eine M”glichkeit. Diesmal
ist es nur ein einziger Screen. Es werden wieder
die Konstanten C/L und L/S gepatched, wieder
werden die Editor-Variablen, die die linke
obere Ecke des Bildschirms angeben, ver„ndert.
Wieder gibt es H„žlichkeiten, die wir
geflissentlich <20>bersehen (Zufallszeichen rechts
unten in der letzten Zeile, leicht zerschroteter
Bildschirmaufbau im Editor). Etwas neues gibt
es auch: Die Umstellung des Zeilenabstands
im Editor erfolgt durch Patchen in NORMAL.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
\ index clv 28jun89 : index ( scr1 scr2 -- ) 1+ swap ?DO stop? IF leave THEN I 3 u.r space I block c/l type CR LOOP ;

View File

@ -0,0 +1,2 @@
for %%1 in (%1) do cbm use %%1 listing bye


File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,70 @@
Dokumentation der Änderungen im ultraFORTH für C64/C16 von Version
3.80 zu Version 3.82
Philip Zembrod, 2.3.1991
Scr. 128: PENCOL von 0540 auf 0536 geändert ( -> C16-INKPOT-Befehl )
Scr. 139: DERROR? wurde verändert: In die IF- Abfrage wurde ein
ELSE-Zweig eingeschoben, der den Rest der "00,OK,00,00"-Meldung
abholt und verwirft. Dies ist nötig, damit die Floppy eine
neue Meldung bereitstellt.
Scr. 49: Martin Tracy's UNLOOP wurde eingebaut. Es entfernt die
Parameter von DO-LOOP vom Returnstack. In Forth implementiert
sähe es fuer uF so aus: : UNLOOP rdrop rdrop rdrop ;
Es wird verwendet, um innerhalb einer DO-LOOP-Schleife ein Wort
zu verlassen.
: suchen ( xx -- yy )
vorbereiten
ende anfang DO
found? IF I irgendwas UNLOOP exit THEN
LOOP leidernichtgefunden ;
Meiner Erfahrung nach sehr praktisch.
Scr. 143: in index und find >2 .r< zu >3 .r< und >1+ 25 type< zu >28 type<
verändert.
Scr. 123: (64 bzw. (16 prüfen jetzt auf auf Länge=2 von c)
Scr. 113: in endpoints wurde das @ nach voc-link gestrichen, da es bewirkte,
daß das neueste Vokabular nicht durchsucht wurde.
Scr. 16: Logo auf "ultraFORTH-83 3.82 ..." geändert
Scr. 35: Das Wort 4+ wurde sichtbar gemacht.
Scr. 139: Scr. 140 - 148 wurden nach 141ff. verschoben und der
load/thru-Befehl in Scr. 123 angepaßt. DERROR? wurde nach
Scr. 140 verschoben, in Scr. 139 wurden die Worte
I/O-STATUS? ( liest das I/O-Statusbyte an Adresse $90 ) und
BUSREAD ( was der genau macht, weiß ich im Moment leider
selbst nicht mehr ) eingefügt.
Liste der Dateien/Disk-Images
Philip Zembrod, 12.1.2007
UF-ORG1.D64,
UF-ORG2.D64,
UF-ORG3.D64,
UF-ORG4.D64: Images der Original-ultraForth-3.80-Disketten
UF382SRC.D64: ultraForth-3.82-Sourcen, basierend auf UF-ORG2.D64
UF382-1.D64: Erste Seite der ultraForth-3.82-Diskette für die Forth-Tagung 1991:
Files c64uf382.prg und c16uf382.prg (ausführbare
Forth-Kernsysteme für C64 bzw. C16, analog UF-ORG1.D64)
UF382-2.D64: Zweite Seite der ultraForth-3.82-Diskette für die Forth-Tagung 1991:
Transient Assembler etc, basierend auf UF-ORG3.D64,
von mir geänderte/erweiterte Drucker-Einbindung, außerdem
der Skriptor, ein Textverarbeitungsprogramm von Heinz Schnitter.
ufscr2file.c: C-Programm, das aus einem .D64-Disk-Image mit ultraForth-Screens
die Screens extrahiert und in ein Textfile umwandelt: Praktisch,
um uF-Sourcen unter Windows oder Linux anzusehen oder per diff
zu vergleichen. Aufruf: ufscr2file name.d64 name.4th
uf382src.4th: Mit ufscr2file aus UF382SRC.D64 extrahiert.
uf382-2.4th: Mit ufscr2file aus UF382-2.D64 extrahiert.
uf-org2.4th: Mit ufscr2file aus UF-ORG2.D64 extrahiert.
uf-org3.4th: Mit ufscr2file aus UF-ORG3.D64 extrahiert.
UF382DOC.TXT: Diese Datei.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,97 @@
/* ufscr2file.c, (c) Philip Zembrod, 1995, 2007 */
/* Wandelt eine C64-ultraFORTH-Screen-Diskette in ein PC- bzw. Unix-ASCII-File
um. Die ultraFORTH-Screen-Diskette muss im .d64-Format vorliegen. */
#include <stdio.h>
#include <stdlib.h>
int nextchar(FILE *in)
{
static int tr=1,se=0,by=0;
int c,flag;
do
{ c=fgetc(in);
if(c==EOF) break;
flag = (tr==18) && (se<3); /* bugfix 26.10.95: Spur 18 Sektor 2 muss auch
uebersprungen werden. */
by++;
if(by%256==0)
{ se++;
if(se>20)
{ se=0; tr++; }
}
} while(flag);
return(c);
}
int convchar(int c)
{
if(c>=0x41 && c<=0x5a) return(c+0x20);
if(c>=0xc1 && c<=0xda) return(c-0x80);
if(c>=0xdb && c<=0xdf) return(c-0x60);
if(c<0x20) return(0x20);
return(c);
}
void bputc(char c, FILE *out)
{
static char line[50], *p=line;
if(p-line>45)
{ fprintf(stderr,"!!! overlong line !!!\n");
exit(1);
}
if(c=='\n')
{ while(p>line && *(p-1)==' ') p--;
*p='\0';
fprintf(out,"%s\n",line);
p=line;
return;
}
*p++=c;
}
int printblock(FILE *in, FILE *out, char *name, int n)
{
int line,col,c;
// fprintf(out,"\\ Disk %s, Block No. %d\n",name,n);
fprintf(out,"\\ Block No. %d\n",n);
for(line=0;line<25;line++)
{ for(col=0;col<(line==24?40:41);col++)
{ if((c=nextchar(in))==EOF)
{ fprintf(out,"\n### premature end of input file ###\n");
return(1); }
bputc((char)convchar(c),out);
}
bputc('\n',out);
}
return(0);
}
int main(int argc, char *argv[])
{
FILE *in, *out;
int block;
if(argc<2 || argc>3)
{ fprintf(stderr,"usage: %s file.d64 [outfile]\n",argv[0]);
return(argc!=1); }
if((in=fopen(argv[1],"r"))==NULL)
{ fprintf(stderr,"%s: can't open %s\n",argv[0],argv[1]);
return(1); }
if(argc==3)
{ if((out=fopen(argv[2],"w"))==NULL)
{ fprintf(stderr,"%s: can't open %s\n",argv[0],argv[2]);
return(1); }
}
else
{
out=stdout;
}
for(block=0;block<170;block++)
if(printblock(in,out,argv[1],block))
return(1);
return(0);
}