C64-Programme auf CBM-Rechnern

[mc, Juli 1986, bisher unveröffentlicht]

C64 - Programme im CBM

In der mc 4/85 fand sich ein Beitrag von Herrn Jürgen H. Schmid, der beschreibt, wie mit einem Maschinenprogramm ein Verschiebelader ersetzt werden kann. Bekanntlich sind ja C64-Programme durch eine andere Startadresse ($0801) nicht ohne weiteres in einen CBM zu laden.

Der Umweg - erst laden, dann verschieben - erscheint doch sehr mühsam. In der Regel braucht man Programme ja mehr als nur einmal und da bietet es sich an, die Ladeadresse direkt zu ändern (dies wäre ein einmaliger Vorgang). Ein weiterer Vorteil dieser Methode ist, daß bei langen Programmen und wenig Speicherplatz (CBM 3008, CBM 4016) das komplette Einladen nicht daran scheitert, weil 1 Kbyte "verschenkt" wird. Dies wäre der Fall wenn man erst einlädt und dann verschiebt! Der Nachteil ist: es funktioniert nicht mit Datasette.

Das Programm "Ladeadresse Ändern", das sich im Aufbau an das Programm: "Löschschutz für Commodore Disketten" von Dr. H. Lindner anlehnt (mc 2/84), arbeitet auf allen Commodore-Computern (Basic 2.0) und mit allen DOS-Versionen (5 1/4-Zoll).


Manipulation der Ladeadresse
Der VC 20 und der C-64 haben einen Verschiebelader im Betriebssystem, der es ihnen ermöglicht auch Programme der „alten“ CBM-Computer zu laden. Der umgekehrte Weg ist da schon schwieriger.
Die Startadresse für Basicprogramme liegt beim CBM bei $0401 beim C-64 dagegen bei $0801 und beim VC 20 ändert sie sich je nach angeschlossener Speichererweiterung.
Viele der für den C-64 oder VC 20 geschriebenen Programme könnten mit mehr der weniger aufwendigen Änderungen auch auf CBM-Computern lauffähig sein. Nach dem Laden kann man diese Programme aber weder listen noch starten.
Abhilfe bringt ein „verbiegen“ der Programmanfangszeiger durch Poke-Befehle. Doch wird hier 1Kbyte Speicherplatz verschenkt und zudem muß diese umständliche Prozedur ständig wiederholt werden.
Besser ist ein nachträgliches Verschieben des Programms an den Speicheranfang. Dies kann mittels Basicprogramm (mc 9/83) oder schneller in Maschinensprache erfolgen (mc 4/85).
Noch flexibler, und auch zum Verschieben von Maschinenprogrammen geeignet, ist die hier vorgestellte Methode, die allerdings nur mit einer Floppy als Massenspeicher realisierbar ist.
Das dialoggesteuerte Programm ermöglicht es, die Ladeadresse jeder Programm-Datei (PRG) zu ändern. Das Programm liest die Dateinamen aus dem Directory und fragt, ob eine Änderung der Ladeadresse gewünscht wird. Wenn eine Änderung gewünscht wird, erfolgt die Ausgabe der aktuellen Adresse, diese kann nun überschrieben werden. Zur Sicherheit ist noch eine weitere Abfrage eingebaut. Die geänderte Adresse wird anschließend auf die Diskette geschrieben und führt später zu einem ordnungsgemäßen Ladevorgang.
Das Programm ermittelt dazu aus den letzten zwei Datenbytes vor jedem  Programmnamen Spur und Sektor des ersten Datenblocks. Dieser enthält in Byte 2 nd 3 Low- und Highbyte der Ladeadresse.

Reinhard Kratzberg

Download: [Download]
Datei: "change loadaddr"
Das Programm ermöglicht es, gezielt die Startadressen von Programmen (auch solcher in Maschinensprache) direkt auf der Diskette zu verändern:
 1000 rem  ladeadresse aendern
 1010 rem   (c) r. kratzberg
 1020 rem   3012 langenhagen
 1030 rem
 1040 gosub 1970: n$=chr$(0)
 1050 :
 1060 kk=15: rem kommandokanal
 1070 ka= 3: rem kanalnummer fuer direktzugriff
 1080 kb= 4: rem kanalnummer fuer direktzugriff
 1090 di= 3: rem kanalnummer fuer directory
 1100 se= 1: rem directory-sektor
 1110 input"floppy- nummer   8{LEFT}{LEFT}{LEFT}"; fl
 1120 close kk: open kk,fl,kk
 1130 input"drive #  0{LEFT}{LEFT}{LEFT}"; dr$
 1140 if dr$<>"0" and dr$<>"1" then print"{UP}{UP}{UP}": goto 1130
 1150 dr=val(dr$)
 1160 print: print"bitte diskette in drive "dr$" einlegen"
 1170 print"dann die leertaste druecken": print: print
 1180 getx$: if x$<>" " then 1180
 1190 print# kk, "i"+dr$
 1200 gosub 1920: rem floppy-meldung
 1210 if en then if st then 1110
 1220 if en>0 then 1160
 1230 close di: open di,fl,0,"$"+dr$
 1240 get#di, x$,y$: rem startadresse
 1250 get#di, x$,y$: rem linkbytes
 1260 get#di, x$,y$: rem drivenummer
 1270 print: printchr$(48-(x$>"")); " ";
 1280 for i=1 to 23: get#di, x$: print x$;: nexti
 1290 get#di, x$,y$: rem format
 1300 print x$; y$: close di: print
 1310 if x$<>"2" then 1340
 1320 if y$="a" then sp=18: goto1350
 1330 if y$="c" then sp=39: goto1350
 1340 print"nur fuer dos ab version 2.1": goto 1160
 1350 input"muster  *{LEFT}{LEFT}{LEFT}"; mu$
 1360 if len(mu$)<16 then mu$=mu$+" ": goto 1360
 1370 print: print"ladeadresse aendern:     {RVS ON}j/n{RVS OFF}": print: print
 1380 close ka: open ka,fl,ka,"#"
 1390 close kb: open kb,fl,kb,"#"
 1400 :
 1410 rem directory-block lesen
 1420 print# kk, "u1"; ka; dr; sp; se
 1430 for i=2 to 2+7*32 step 32
 1440 :   print# kk, "b-p"; ka; i
 1450 :   gosub 1880: typ=x
 1460 :   if (typ and 127)=0 then 1800
 1470 :   if (typ and 7) <>2 then 1800
 1480 :   get# ka, x$, y$: rem spur & sektor
 1490 :   t=asc(x$+n$):s=asc(y$+n$)
 1500 :   na$="": match=-1
 1510 :   for j=1 to 16
 1520 :       gosub 1880: na$=na$+x$
 1530 :       if match>=0 then 1590
 1540 :       z$=mid$(mu$,j,1)
 1550 :       if z$="*" then match=1: goto 1590
 1560 :       if z$="?" then 1590
 1570 :       if z$=" " and x=160 then 1590
 1580 :       if z$<>x$ then match=0
 1590 :   next
 1600 :   if match=0 then 1800
 1610 :   printchr$(34) na$chr$(34);" :"spc(6)
 1620 :   get x$: if x$="n" then print x$: goto 1800
 1630 :           if x$<>"j" then 1620
 1640 :           print x$
 1650 :   print# kk, "u1"; kb; dr; t; s
 1660 :   print# kk, "b-p"; kb; 2
 1670 :   get# kb, x$,y$: rem adresse
 1680 :   la=asc(x$+n$)
 1690 :   la=la+asc(y$+n$)*256
 1700 :   print"ladeadresse  "la;chr$(141)" "tab(12)
 1710 :   input la
 1720 :   print"neue adresse ok ? (j/n) ";
 1730 :   get x$: if x$="n" then printx$: goto 1700
 1740 :           if x$<>"j" then 1730
 1750 :           print x$
 1760 :   x=int(la/256):la=la-x*256
 1770 :   print# kk, "b-p"; kb; 2
 1780 :   print# kb, chr$(la)chr$(x);
 1790 print# kk, "u2"; kb; dr; t; s
 1800 next
 1810 print# kk, "b-p"; ka; 0
 1820 gosub 1880: sp=x
 1830 gosub 1880: se=x
 1840 if sp>0 goto 1420
 1850 close ka: close kb: close kk: end
 1860 :
 1870 rem aus buffer lesen
 1880 get# ka, x$: if x$="" then x$=n$
 1890 x=asc(x$):return
 1900 :
 1910 rem floppy-meldung einholen
 1920 input# kk, en, em$, et$, es$
 1930 if en=0 then en=(st and 191): em$="*status*"
 1940 if en>0 then print en","em$","et$","es$: print
 1950 return
 1960 :
 1970 u$="---------------------------"
 1980 print"{CLR}{DOWN}{DOWN}"u$
 1990 print"    ladeadresse aendern"
 2000 print u$: print
 2010 print"fuer dos 2.1 / 2.5 / 2.6{DOWN}{DOWN}"
 2020 print"r. kratzberg (15.07.85){DOWN}{DOWN}"
 2030 return: end
ready.
 
 

[Seitenanfang] [Artikel] [Info] [Links] [Download] [Home]
Erstellt von WTE, am 14. Februar 2006; überarbeitet am 21. Februar 2006