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:
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.
|
|