BLOAD en BSAVE problematiek

Página 1/2
| 2

Por Laurens

Supporter (7)

imagem de Laurens

21-08-2007, 11:37

Dag mensen,

Alle draden omtrent soortgelijke onderwerpen heb ik al doorgelezen, maar nergens heb ik het perfect passende antwoord kunnen vinden. Het gaat om het volgende:

Als ik een basic programma dat ik in binair formaat wil opslaan lukt dat gewoon, ook het terugladen met BLOAD gaat goed, maar als ik run typ of BLOAD"programma.bin",R dan verdwijnt het programma als sneeuw voor de zon. Zelfs met de pokes die in het programma.ldr bestand worden voorgeladen:

De listing van het diagnosegedeelte van mijn programma:

Bepalen van de BSAVE adressen:

1080 BEGINADR=PEEK(&HF676)+PEEK(&HF677)*256-1
1090 EINDADR=PEEK(&HF6C2)+PEEK(&HF6C3)*256-1
1100 CLS:PRINT"* * * * * Diagnostische modus * * * * *"
1110 PRINT
1120 PRINT"Bsave beginadres: "BEGINADR
1130 PRINT"Bsave eindadres:  "EINDADR

Verderop in het programma maakt deze het bestand programma.bin en programma.ldr aan:

1210 BB$=BST$+"programma.bin"
1220 BSAVE BB$,BEGINADR,EINDADR
1230 BL$=BST$+"programma.ldr"
1240 OPENBL$FOROUTPUTAS#1
1250 PRINT #1,"10 CLS"
1260 PRINT #1,"20 PRINT"+CHR$(34)+"Geheugensegmenten worden insgesteld enhet programma wordt geladen..."+CHR$(34)
1270 PRINT #1,"30 POKE&h676,"PEEK(&H676)
1280 PRINT #1,"40 POKE&h677,"PEEK(&H677)
1290 PRINT #1,"50 POKE&h6c2,"PEEK(&H6C2)
1300 PRINT #1,"60 POKE&h6c3,"PEEK(&H6C3)
1310 PRINT #1,"70 BLOAD"CHR$(34)BB$CHR$(34)",R"
1320 CLOSE

Waarbij het bestand programma.ldr er als volgt uit ziet zoals ook de bedoeling naar mijn idee is:

10 CLS
20 PRINT"Geheugensegmenten worden insgesteld en het programma wordt geladen..."
30 POKE&H676, 205 
40 POKE&H677, 221 
50 POKE&H6C2, 64 
60 POKE&H6C3, 24 
70 BLOAD"a:programma.bin",R

Ik vermoed dat ik nog meer pokes moet plaatsen in het programma.ldr bestand, maar weet niet welke. Wie kan mij dit vertellen?

Entrar ou registrar-se para comentar

Por [D-Tail]

Ascended (8258)

imagem de [D-Tail]

22-08-2007, 09:46

Eerlijk gezegd heb ik normaal gesproken niet zoveel problemen met BASIC. Het hele punt is dat ik nooit het ASM startadres verander (dat is wat je volgens mij doet met die peek/poke &HF676/&HF677, om de top van BASIC te bepalen).

*kwartje valt*
Ik weet niet of je dit opzettelijk hebt gedaan, maar in je programmaregels 1260-1300 en in programma.ldr staat een verwijzing naar poke &H676, in plaats van &HF676. Kan aan mij liggen.
Verder wat algemene tips: "programma.ldr" wordt uiteraard "programm.ald" op disk, aangezien MSX (of FAT12 in het algemeen) een 8.3 conventie heeft voor bestandsnamen. Ook werkt BASIC alleen met de eerste twee letters van een identifier. Dus BEGINADR wordt BE en EINDADR wordt EI. Hier geen probleem, maar stel dat je nog een variabele BEGINWAARDE introduceert, dan heb je een probleem omdat je BEGINADR (eigenlijk BE) overschrijft.

Laatste opmerking, hierover ben ik niet zeker: in regel 1080 bereken je het startadres met PEEK(&HF676)+PEEK(&HF677)*256-1. Volgens mij moet dit zijn PEEK(&HF676)+PEEK(&HF677)*256, dus ZONDER de -1 op het eind. Anders zou je wel eens een variabele kunnen overschrijven als je dit zo zou doen. Nogmaals, ben ik niet zeker van. In ieder geval zou je eens kunnen kijken naar die adressen die ik noemde. Veel succes in ieder geval!

Por Laurens

Supporter (7)

imagem de Laurens

22-08-2007, 11:29

Hmmm, die F ben ik inderdaad vergeten Shocked! Die ga ik gelijk aanpassen.

Ik heb de naam 'programma.ext' gebruikt omdat ik dit deel van de programma's die ik maak overal gebruik, het is een fictief woord, maar inderdaad wel scherp van je dat je ziet dat het een 9.3 naam is - had ik nog niet gezien.

Dat van die twee letters zal ik in mijn achterhoofd houden, daar ik er niet op heb gelet. En die laatste berekening had ik 1:1 uit een msx boek gehaald.

Voorlopig heb ik weer een hele berg om uit te zoeken zie ik. Ik laat het je weten wat er uit komt. Bedankt voor de info Smile

Por Laurens

Supporter (7)

imagem de Laurens

23-08-2007, 11:46

Bdw had ik dat inlezen van het startadres (dat bij de MSX-2 altijd &H8000 is) gedaan om compatible te blijven met oudere machines, maar dan moeten er wel MSX-1 computers zijn met diskdrives (daar gebruik ik namelijk het programma voor).

Ik heb die F's ingevoegd en het adres gecontroleerd (256-1) maar dat is wel de juiste. Het adres telt natuurlijk vanaf 0. (0 is de eerste). Maar: nu gaat de computer ineens resetten als ik 'm run.

Moet ik nog wat bijpoken omdat het BIN bestand ná het loader bestand komt?

Por AuroraMSX

Paragon (1902)

imagem de AuroraMSX

25-08-2007, 12:22

(dat is wat je volgens mij doet met die peek/poke &HF676/&HF677, om de top van BASIC te bepalen).Bijna. &HF676/7 bepaalt 't beginadres van BASIC Smile

Verder moet je loader programma er uiteindelijk ongeveer zo uit komen te zien:

 5 ' -- loader.bas
10 IF PEEK(&HF676)=xx AND PEEK(&HF677)=yy THEN 30
20 POKE &HF676,xx: POKE &HF677,yy: RUN"program.ldr"
30 BLOAD"program.bin",r

Regel 10 controleert of de loader al op zn nieuwe plek staat. Zo niet, dan wordt in 20 t BASIC startadress verplaatst en de loader opnieuw (op de niewe plek!) ingeladen. Zonder t opnieuw inladen verzet je wel t begin van BASIC, maarje loader blijft op zn oude plekje staan. Die wordt dan waarschijnlijk door de BLOAD overschreven en dan werkt de boel niet meer.

Por [D-Tail]

Ascended (8258)

imagem de [D-Tail]

25-08-2007, 16:27

Dat was het... Ik had het eerder gezien ;-)

Por Laurens

Supporter (7)

imagem de Laurens

26-08-2007, 12:00

Ik heb dat intussen gedaan (ik heb tevens de pokes van de eindadressen weggelaten) en dan volgt gelijk een totale reset van de computer - meteen hetzelfde gedaan met de eindadressen als wat ik met de beginadressen deed, en nu lijkt hij inderdaad verder te komen. Ik kwam ineens in de listing van het binaire programma terecht zonder dat deze is gewist. Is het gebruikelijk dat het programma bij regel 70 in het eerste programma eindigt en dan bij regel 80 in het tweede programma verder wil?

Por [D-Tail]

Ascended (8258)

imagem de [D-Tail]

26-08-2007, 13:51

Nee, dat is [in mijn optiek] niet gebruikelijk. Dat zou betekenen dat je het eerste programma volledig in je geheugen hebt staan, terwijl het tweede programma regels 10-70 mist -- oftewel, je hebt programma 1 'over' programma 2 geladen. Zou kunnen, maar het einde van het huidige BASIC programma wordt dat door programma 1 aangegeven. Hij zou dus nooit bij programma 2 mogen komen in zo'n geval.

Ik heb nog wat verder geresearcht (is dit een Nederlands woord?). Zie bijvoorbeeld deze link. Daar probeert iemand een ROM header te maken vanuit BASIC. Geen idee of dat gelukt is, dat kon ik er niet uithalen. Met mijn basiscursus Spaans [hoewel Portugees] heb ik er wel zoiets uit kunnen halen ;)

Uit het BASIC aldaar haal ik het volgende: de ROM header bestaat uit de byte sequence

A B 0 0 0 0 0 0 L H 0 0 0 0 0 0

Waarbij L en H resp. het Low part/High part startadres van BASIC zijn. Ze zetten het BASIC startadres op &H8011 (waar het normaal gesproken &H8001 is). Ook vullen ze &HF6C2-&HF6C7 met driemaal &H8013. Wat dat betekent zou ik niet weten. &HF6C2,&H13-&HF6C3,&H80 betekent in ieder geval dat het eindadres op &H8013 staat. Dit doen ze natuurlijk in direct mode, omdat je anders gelijk je programma weggooit. Met een NEW statement kun je dan beginnen. Nogmaals, ik heb geen idee waarom ze &HF6C4-&HF6C7 vullen met nog tweemaal &H8013. Ik hoop iig dat je hiermee wat kunt.

Een klein programmaatje dat je BASIC workspace monitort in HEX, ASC en decimaal:

10 cls: width80: x=0: y=0: s=peek(&HF676)+256*peek(&HF677): e=peek(&HF6C2)+256*peek(&HF6C3)
20 for i=s to e: a=peek(i): A$=hex$(a): B$=chr$(a): C$=right$(str$(a),3): if a<32 then B$="??"
30 locate x,y: print A$: locate x,y+7: print B$: locate x,y+14: print C$
40 x=x+3: if x>79 then x=0: y=y+1
50 if y>7 then I$=input$(1): y=0: cls
60 next:end

Geen idee of het zo ook direct werkt, ik heb hier geen MSX bij me. Succes iig!

Por Laurens

Supporter (7)

imagem de Laurens

27-08-2007, 16:25

Het programmaatje geeft heel wat gebrabbel op het scherm, het lijkt goed te werken. Ik heb geprobeerd er een foto van te maken, maar de verversingsfrequentie van de tv en het fototoestel liggen ongeveer gelijk 1:2 en daardoor komen er lelijke zwarte strepen op de foto Sad Intussen ben ik gaan expirimenteren met die andere adressen door eerst het originele programma (basic broncode) te laden en met print peek(&hf6c2...f6c7) die waarden op het scherm te zetten en van daaruit het binaire bestand te laden. Het lijkt er op dat de adressen altijd het zelfde zijn als een programma in beeld komt:

&H676   1
&H677 128
&H6C2 114
&H6C3 178
&H6C4 114
&H6C5 178
&H6C6 114
&H6C7 178

Op basis hiervan (ook van die portugese site geven ze aan dat je vanuit je loader verder moet rekenen) heb ik onderstaande loader sm.ldr gemaakt:

10 CLS
20 LE=114
30 RE=178
40 'IF PEEK(&HF676)=1 AND PEEK(&HF677)=128 THEN 120
50 BA=PEEK(&HF6C2)+PEEK(&HF6C3)*256-1
60 TA=LE+(RE)*256-1
70 SA=BA-(PEEK(&HF676)+PEEK(&HF677)*256-1)
80 EA=TA+SA
90 LS=INT(SA/256)
100 RS=SA-(LS*256)
105 PRINT"Initial beg. adress:"PEEK(&HF676)+PEEK(&HF677)*256-1
110 PRINT"Beginning adress:   "BA
120 PRINT"Ending adress:      "EA
130 PRINT"Target adress p1:   "TA
140 PRINT"Left end target:    "LE
150 PRINT"Right end target:   "RE
160 PRINT"Shift program:      "SA
170 PRINT"Left shift:         "LS
180 PRINT"Right shift:        "RS
190 REM
200 POKE&HF6C2, LS+LE
210 POKE&HF6C3, LS+RE
220 POKE&HF6C4, LS+LE
230 POKE&HF6C5, LS+RE
240 POKE&HF6C6, LS+LE
250 POKE&HF6C7, LS+RE
260 POKE&HF676, LS+PEEK(676)
270 POKE&HF677, RS+PEEK(677)
280 BLOAD"a:sm.bin",R

Maar nu begint hij met laden en houdt er na het laden mee op (leeg scherm, geen acties meer). Ik denk dat mijn probleem nu is dat ik die pokes in 260 en 270 moet vervolgen met run"sm.ldr" maar dan worden die andere pokes weer overschreven Shocked!

Por [D-Tail]

Ascended (8258)

imagem de [D-Tail]

27-08-2007, 20:33

Een truuk om je BASIC code wat efficiënter te maken -- kan het niet laten Wink: 90 LS=SA\256
Verder opnieuw het opvallende in je PEEKs in regels 260-270: PEEK(&hF676) en PEEK(&hF677) i.p.v. wat je er nu hebt staan. Verder zal ik eens kijken of ik openMSX geïnstalleerd krijg op mijn net nieuwe Linux installatie, dan zal ik er eens wat beter naar kijken. Naar mijn idee moet dit niet zo moeilijk zijn. Het lastige is de referenties naar de POKE-adressen, die moet je even weten te vinden. Een stapel oude magazines kan een hoop oplossen in zo'n geval.

Por [D-Tail]

Ascended (8258)

imagem de [D-Tail]

27-08-2007, 20:39

Overigens heb ik het idee dat je de variabele SA gebruikt om een StartAdres aan te geven (lijkt me logisch). Welnu, je moet dit 16-bits getal opsplitsen in twee stukjes van 8 bits, zoals je doet in regels 90 en 100. Wat in #100 staat werkt op zich wel, echter eenvoudiger is RS = SA AND 255.

Ter verduiidelijking een diagrammetje:

[adres] | [waarde]
&hF677  |   &h80
&hF676	|   &h01
Samen: &h8001.

Makkelijke conversie van dit 16-bits getal naar 2x 8-bits:
&h8001  \  &h100 = &H80
&h8001 AND &hFF  = &H01

Dus: POKE &hF677, SA\256: POKE &hF676, SA AND 255

Hierbij geldt dat het wel makkelijk is als je een beetje vloeiend hexadecimaal/binair kunt rekenen en je raad weet met bits & bytes.

[edit]
Vergelijk decimaal rekenen. Als je van 2345 de twee meest significante cijfers wilt weten, dan doe je 2345\100. Da's 23,45 (maar de \ kapt het af naar beneden), dus 23. Wil je de twee minst significante cijfers weten, dan doe je 2345 MOD 100 (MOD = modulo). Dat levert 45 op. Nu is er een equivalentierelatie tussen (x) MOD 2^(n) <==> (x) AND 2^(n) - 1, waarbij de laatste variant in BASIC sneller werkt. In ASM overigens ook, maar dat terzjide.
[/edit]

[edit2]
Overbodig: (n) en (x) zijn gehele, positieve getallen.
[/edit2]

Página 1/2
| 2