mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-06-14 16:29:26 +00:00
More ultraForth cleanup
This commit is contained in:
parent
352036bb6e
commit
920d458551
928
archive/6502/CBM/CLV/DSK-GRF.487
Normal file
928
archive/6502/CBM/CLV/DSK-GRF.487
Normal file
File diff suppressed because one or more lines are too long
5177
archive/6502/CBM/CLV/DSK-GRF.txt
Normal file
5177
archive/6502/CBM/CLV/DSK-GRF.txt
Normal file
File diff suppressed because it is too large
Load Diff
486
archive/6502/CBM/CLV/EDIT
Normal file
486
archive/6502/CBM/CLV/EDIT
Normal file
File diff suppressed because one or more lines are too long
4735
archive/6502/CBM/CLV/EDIT.txt
Normal file
4735
archive/6502/CBM/CLV/EDIT.txt
Normal file
File diff suppressed because it is too large
Load Diff
174
archive/6502/CBM/CLV/EH-TERM.387
Normal file
174
archive/6502/CBM/CLV/EH-TERM.387
Normal file
File diff suppressed because one or more lines are too long
4423
archive/6502/CBM/CLV/EH-TERM.txt
Normal file
4423
archive/6502/CBM/CLV/EH-TERM.txt
Normal file
File diff suppressed because it is too large
Load Diff
BIN
archive/6502/CBM/CLV/MENUE
Normal file
BIN
archive/6502/CBM/CLV/MENUE
Normal file
Binary file not shown.
BIN
archive/6502/CBM/CLV/MENUE.txt
Normal file
BIN
archive/6502/CBM/CLV/MENUE.txt
Normal file
Binary file not shown.
28
archive/6502/CBM/CLV/convert.rx
Normal file
28
archive/6502/CBM/CLV/convert.rx
Normal 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
|
1
archive/6502/CBM/MBitter/README.TXT
Normal file
1
archive/6502/CBM/MBitter/README.TXT
Normal file
|
@ -0,0 +1 @@
|
|||
ultraForth Dump von Martin Bitter
|
BIN
archive/6502/CBM/MBitter/UltraForth-380.zip
Normal file
BIN
archive/6502/CBM/MBitter/UltraForth-380.zip
Normal file
Binary file not shown.
1257
archive/6502/CBM/MBitter/ultra4_1.d64
Normal file
1257
archive/6502/CBM/MBitter/ultra4_1.d64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/MBitter/ultra4_2.d64
Normal file
1
archive/6502/CBM/MBitter/ultra4_2.d64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/MBitter/ultra4_3.d64
Normal file
1
archive/6502/CBM/MBitter/ultra4_3.d64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/MBitter/ultra4_4.d64
Normal file
1
archive/6502/CBM/MBitter/ultra4_4.d64
Normal file
File diff suppressed because one or more lines are too long
70
archive/6502/CBM/UF83TAPE/RAMDISK.TXT
Normal file
70
archive/6502/CBM/UF83TAPE/RAMDISK.TXT
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
1358
archive/6502/CBM/UF83TAPE/UF361.TXT
Normal file
1358
archive/6502/CBM/UF83TAPE/UF361.TXT
Normal file
File diff suppressed because it is too large
Load Diff
105
archive/6502/CBM/UF83TAPE/UFTAPE.TXT
Normal file
105
archive/6502/CBM/UF83TAPE/UFTAPE.TXT
Normal 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.
|
||||
|
94
archive/6502/CBM/UF83TAPE/VF83T.TXT
Normal file
94
archive/6502/CBM/UF83TAPE/VF83T.TXT
Normal 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
|
||||
|
||||
|
||||
|
1
archive/6502/CBM/UF83_380/TC38
Normal file
1
archive/6502/CBM/UF83_380/TC38
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF83_380/TC38.d64
Normal file
1
archive/6502/CBM/UF83_380/TC38.d64
Normal file
File diff suppressed because one or more lines are too long
1248
archive/6502/CBM/UF83_380/UF38-1
Normal file
1248
archive/6502/CBM/UF83_380/UF38-1
Normal file
File diff suppressed because one or more lines are too long
BIN
archive/6502/CBM/UF83_380/UF38-1.d64
Normal file
BIN
archive/6502/CBM/UF83_380/UF38-1.d64
Normal file
Binary file not shown.
1
archive/6502/CBM/UF83_380/UF38-2
Normal file
1
archive/6502/CBM/UF83_380/UF38-2
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF83_380/UF38-2.d64
Normal file
1
archive/6502/CBM/UF83_380/UF38-2.d64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF83_380/UF38-3
Normal file
1
archive/6502/CBM/UF83_380/UF38-3
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF83_380/UF38-4
Normal file
1
archive/6502/CBM/UF83_380/UF38-4
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF83_380/convert/Assembler.f
Normal file
1
archive/6502/CBM/UF83_380/convert/Assembler.f
Normal file
File diff suppressed because one or more lines are too long
166
archive/6502/CBM/UF83_380/convert/Assembler.txt
Normal file
166
archive/6502/CBM/UF83_380/convert/Assembler.txt
Normal 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
|
1
archive/6502/CBM/UF83_380/convert/TC38
Normal file
1
archive/6502/CBM/UF83_380/convert/TC38
Normal file
File diff suppressed because one or more lines are too long
BIN
archive/6502/CBM/UF83_380/convert/TC38.tex.gz
Normal file
BIN
archive/6502/CBM/UF83_380/convert/TC38.tex.gz
Normal file
Binary file not shown.
4250
archive/6502/CBM/UF83_380/convert/TC38.txt
Normal file
4250
archive/6502/CBM/UF83_380/convert/TC38.txt
Normal file
File diff suppressed because it is too large
Load Diff
1248
archive/6502/CBM/UF83_380/convert/UF38-1
Normal file
1248
archive/6502/CBM/UF83_380/convert/UF38-1
Normal file
File diff suppressed because one or more lines are too long
1725
archive/6502/CBM/UF83_380/convert/UF38-1.tex
Normal file
1725
archive/6502/CBM/UF83_380/convert/UF38-1.tex
Normal file
File diff suppressed because it is too large
Load Diff
1
archive/6502/CBM/UF83_380/convert/UF38-2
Normal file
1
archive/6502/CBM/UF83_380/convert/UF38-2
Normal file
File diff suppressed because one or more lines are too long
4250
archive/6502/CBM/UF83_380/convert/UF38-2.txt
Normal file
4250
archive/6502/CBM/UF83_380/convert/UF38-2.txt
Normal file
File diff suppressed because it is too large
Load Diff
1
archive/6502/CBM/UF83_380/convert/UF38-3
Normal file
1
archive/6502/CBM/UF83_380/convert/UF38-3
Normal file
File diff suppressed because one or more lines are too long
4250
archive/6502/CBM/UF83_380/convert/UF38-3.txt
Normal file
4250
archive/6502/CBM/UF83_380/convert/UF38-3.txt
Normal file
File diff suppressed because it is too large
Load Diff
1
archive/6502/CBM/UF83_380/convert/UF38-4
Normal file
1
archive/6502/CBM/UF83_380/convert/UF38-4
Normal file
File diff suppressed because one or more lines are too long
4250
archive/6502/CBM/UF83_380/convert/UF38-4.txt
Normal file
4250
archive/6502/CBM/UF83_380/convert/UF38-4.txt
Normal file
File diff suppressed because it is too large
Load Diff
28
archive/6502/CBM/UF83_380/convert/convert.rx
Normal file
28
archive/6502/CBM/UF83_380/convert/convert.rx
Normal 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
|
1
archive/6502/CBM/UF83_380/convert/debugtools.f
Normal file
1
archive/6502/CBM/UF83_380/convert/debugtools.f
Normal 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 ! › ›
|
64
archive/6502/CBM/UF83_380/convert/debugtools.txt
Normal file
64
archive/6502/CBM/UF83_380/convert/debugtools.txt
Normal 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 !
|
||||
|
1
archive/6502/CBM/UF83_380/convert/decompiler.f
Normal file
1
archive/6502/CBM/UF83_380/convert/decompiler.f
Normal file
File diff suppressed because one or more lines are too long
241
archive/6502/CBM/UF83_380/convert/decompiler.txt
Normal file
241
archive/6502/CBM/UF83_380/convert/decompiler.txt
Normal 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 ;
|
||||
|
||||
|
||||
|
1
archive/6502/CBM/UF83_380/convert/disassembler.f
Normal file
1
archive/6502/CBM/UF83_380/convert/disassembler.f
Normal file
File diff suppressed because one or more lines are too long
129
archive/6502/CBM/UF83_380/convert/disassembler.txt
Normal file
129
archive/6502/CBM/UF83_380/convert/disassembler.txt
Normal 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 ;
|
1
archive/6502/CBM/UF83_380/convert/multitask.f
Normal file
1
archive/6502/CBM/UF83_380/convert/multitask.f
Normal 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 ; › ›
|
106
archive/6502/CBM/UF83_380/convert/multitask.txt
Normal file
106
archive/6502/CBM/UF83_380/convert/multitask.txt
Normal 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 ;
|
||||
|
1
archive/6502/CBM/UF83_380/convert/sieve.f
Normal file
1
archive/6502/CBM/UF83_380/convert/sieve.f
Normal 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 ; ›
|
25
archive/6502/CBM/UF83_380/convert/sieve.txt
Normal file
25
archive/6502/CBM/UF83_380/convert/sieve.txt
Normal 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 ;
|
1
archive/6502/CBM/UF83_380/convert/tracer.f
Normal file
1
archive/6502/CBM/UF83_380/convert/tracer.f
Normal file
File diff suppressed because one or more lines are too long
174
archive/6502/CBM/UF83_380/convert/tracer.txt
Normal file
174
archive/6502/CBM/UF83_380/convert/tracer.txt
Normal 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 ;
|
168
archive/6502/CBM/UF_TO_PC/CBM.ART
Normal file
168
archive/6502/CBM/UF_TO_PC/CBM.ART
Normal 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
|
BIN
archive/6502/CBM/UF_TO_PC/CBM.COM
Normal file
BIN
archive/6502/CBM/UF_TO_PC/CBM.COM
Normal file
Binary file not shown.
1
archive/6502/CBM/UF_TO_PC/CBM.SCR
Normal file
1
archive/6502/CBM/UF_TO_PC/CBM.SCR
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF_TO_PC/CBM_ST.SCR
Normal file
1
archive/6502/CBM/UF_TO_PC/CBM_ST.SCR
Normal 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 + ! ;
|
1
archive/6502/CBM/UF_TO_PC/EDITORCB.SCR
Normal file
1
archive/6502/CBM/UF_TO_PC/EDITORCB.SCR
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF_TO_PC/EPSONCBM.PRN
Normal file
1
archive/6502/CBM/UF_TO_PC/EPSONCBM.PRN
Normal file
File diff suppressed because one or more lines are too long
53
archive/6502/CBM/UF_TO_PC/FG0190.ART
Normal file
53
archive/6502/CBM/UF_TO_PC/FG0190.ART
Normal 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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
1
archive/6502/CBM/UF_TO_PC/GRAPHIC.PRN
Normal file
1
archive/6502/CBM/UF_TO_PC/GRAPHIC.PRN
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/UF_TO_PC/INDEX.SCR
Normal file
1
archive/6502/CBM/UF_TO_PC/INDEX.SCR
Normal 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 ;
|
2
archive/6502/CBM/UF_TO_PC/LIST-CBM.BAT
Normal file
2
archive/6502/CBM/UF_TO_PC/LIST-CBM.BAT
Normal file
|
@ -0,0 +1,2 @@
|
|||
for %%1 in (%1) do cbm use %%1 listing bye
|
||||
|
1
archive/6502/CBM/UF_TO_PC/UTI.SCR
Normal file
1
archive/6502/CBM/UF_TO_PC/UTI.SCR
Normal file
File diff suppressed because one or more lines are too long
1248
archive/6502/CBM/uf382/UF-ORG1.D64
Normal file
1248
archive/6502/CBM/uf382/UF-ORG1.D64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/uf382/UF-ORG2.D64
Normal file
1
archive/6502/CBM/uf382/UF-ORG2.D64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/uf382/UF-ORG3.D64
Normal file
1
archive/6502/CBM/uf382/UF-ORG3.D64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/uf382/UF-ORG4.D64
Normal file
1
archive/6502/CBM/uf382/UF-ORG4.D64
Normal file
File diff suppressed because one or more lines are too long
263
archive/6502/CBM/uf382/UF382-1.D64
Normal file
263
archive/6502/CBM/uf382/UF382-1.D64
Normal file
File diff suppressed because one or more lines are too long
1
archive/6502/CBM/uf382/UF382-2.D64
Normal file
1
archive/6502/CBM/uf382/UF382-2.D64
Normal file
File diff suppressed because one or more lines are too long
70
archive/6502/CBM/uf382/UF382DOC.TXT
Normal file
70
archive/6502/CBM/uf382/UF382DOC.TXT
Normal 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.
|
1
archive/6502/CBM/uf382/UF382SRC.D64
Normal file
1
archive/6502/CBM/uf382/UF382SRC.D64
Normal file
File diff suppressed because one or more lines are too long
4420
archive/6502/CBM/uf382/uf-org2.4th
Normal file
4420
archive/6502/CBM/uf382/uf-org2.4th
Normal file
File diff suppressed because it is too large
Load Diff
4420
archive/6502/CBM/uf382/uf-org3.4th
Normal file
4420
archive/6502/CBM/uf382/uf-org3.4th
Normal file
File diff suppressed because it is too large
Load Diff
4420
archive/6502/CBM/uf382/uf382-2.4th
Normal file
4420
archive/6502/CBM/uf382/uf382-2.4th
Normal file
File diff suppressed because it is too large
Load Diff
4420
archive/6502/CBM/uf382/uf382src.4th
Normal file
4420
archive/6502/CBM/uf382/uf382src.4th
Normal file
File diff suppressed because it is too large
Load Diff
97
archive/6502/CBM/uf382/ufscr2file.c
Normal file
97
archive/6502/CBM/uf382/ufscr2file.c
Normal 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user