Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende ÜberarbeitungLetzte ÜberarbeitungBeide Seiten der Revision | ||
z9001:basic [2010/07/31 17:46] – volkerp | z9001:basic [2013/06/12 06:59] – Link mit z9001:module:192k_modul geändert zu z9001:module_sonstige:192k_modul volkerp | ||
---|---|---|---|
Zeile 23: | Zeile 23: | ||
* Etwa 6K-Byte der Software (Kern) wurde so gelassen der Rest wurde überarbeitet/ | * Etwa 6K-Byte der Software (Kern) wurde so gelassen der Rest wurde überarbeitet/ | ||
* Insbesondere wurden einige Fehler beseitigt, die schon in der MS-Version steckten und wesentliche Sprachkomponenten wurden angepasst (bei MKD durch Keller/ | * Insbesondere wurden einige Fehler beseitigt, die schon in der MS-Version steckten und wesentliche Sprachkomponenten wurden angepasst (bei MKD durch Keller/ | ||
- | * In die Spracherweiterung flossen Gedanken mehrerer Mitarbeiter (auch von RED) ein, vor allem aber die Erfahrungen, | + | * In die Spracherweiterung flossen Gedanken mehrerer Mitarbeiter (auch von RED) ein, vor allem aber die Erfahrungen, |
* In Ergänzung zu dem 6K-Kern wurde dann eine 8K-Version erarbeitet, die im Wesentlichen nicht mehr geändert wurde. | * In Ergänzung zu dem 6K-Kern wurde dann eine 8K-Version erarbeitet, die im Wesentlichen nicht mehr geändert wurde. | ||
* Die Erweiterung (zu 10K-Basic) enthielt dann hardware-bezogene Ergänzungen, | * Die Erweiterung (zu 10K-Basic) enthielt dann hardware-bezogene Ergänzungen, | ||
Zeile 96: | Zeile 96: | ||
Die Anweisungen PRINT#, LIST#, LOAD#, INPUT# sind mit den Gerätenummern 0 ,2 ,3 und CLOAD, CLOAD*, CSAVE, CSAVE* mit beliebigen zugewiesenen Peripheriegeräten funktionstüchtig, | Die Anweisungen PRINT#, LIST#, LOAD#, INPUT# sind mit den Gerätenummern 0 ,2 ,3 und CLOAD, CLOAD*, CSAVE, CSAVE* mit beliebigen zugewiesenen Peripheriegeräten funktionstüchtig, | ||
- | Mir sind bislang 2 verschiedene Revisionen dieser Erweiterung bekannt: Aus dem [[z9001:module: | + | Mir sind bislang 2 verschiedene Revisionen dieser Erweiterung bekannt: Aus dem [[.:module_sonstige: |
===== CP/M-BASIC ===== | ===== CP/M-BASIC ===== | ||
Zeile 152: | Zeile 152: | ||
| basic-2le.rom | BASIC-Erweitwerung von L.Elßner, Version 1.00 | | | basic-2le.rom | BASIC-Erweitwerung von L.Elßner, Version 1.00 | | ||
| basea.rom | BASIC-Erweitwerung von L.Elßner, vermutlich ältere Version (kleine Unterschiede in den Merkzellen für die Kassettenroutinen) | | | basea.rom | BASIC-Erweitwerung von L.Elßner, vermutlich ältere Version (kleine Unterschiede in den Merkzellen für die Kassettenroutinen) | | ||
+ | |||
+ | |||
+ | ===== Patch BASIC86 ===== | ||
+ | |||
+ | um das o.a. Problem beim BASIC86, einen sinnlosen Kopfblock zu schreiben, zu umgehen, gibt es einen kleinen Patch. Der kleine Nachteil dieser Lösung ist, das jetzt wieder direkt interne Monitoraufrufe getätigt werden. | ||
+ | |||
+ | -> weitere Patches s. Assemblerquellcode bm608p.asm | ||
+ | |||
+ | < | ||
+ | ; Patch in BASIC-Erweiterung BM608 für write tape | ||
+ | ; nicht OPENW nutzen, das (schreibt nur sinnlosen (!!!) Block 0 | ||
+ | org 0E68Bh | ||
+ | call 0F593h | ||
+ | ld a, 1 | ||
+ | ld (6Bh), a ; BLNR | ||
+ | nop | ||
+ | nop | ||
+ | ; | ||
+ | org 0E6EEh | ||
+ | push de | ||
+ | call sub_E7D8 | ||
+ | pop de | ||
+ | |||
+ | |||
+ | org | ||
+ | sub_E7D8: | ||
+ | dec a | ||
+ | jp nz, 0F46Fh ; wenn nicht Block 1 | ||
+ | ld bc, 1770h ; sonst: langer Vorton | ||
+ | jp 0F472h ; fuer ersten Block | ||
+ | </ | ||
Zeile 241: | Zeile 272: | ||
===== Internas ===== | ===== Internas ===== | ||
+ | |||
+ | 7.8.2012: Das Zahlenformat des BASIC entspricht dem SKR-Standardformat. | ||
+ | s. Lampe/ Jorke/ Wengel: Algorithmen der Mikrorechentechnik, | ||
+ | |||
< | < | ||
Zeile 312: | Zeile 347: | ||
Länge des Feldes = 1 (Byte f. Dimensionen) + n (Anzahl Diemensionen) + Anzahl Folgebyte | Länge des Feldes = 1 (Byte f. Dimensionen) + n (Anzahl Diemensionen) + Anzahl Folgebyte | ||
Bei der Zählung der Dimensionszahlen ist zu beachten, daß mit 0 begonnen wird: 0..n = (n+1) Werte! | Bei der Zählung der Dimensionszahlen ist zu beachten, daß mit 0 begonnen wird: 0..n = (n+1) Werte! | ||
+ | |||
+ | # | ||
+ | # Zahlen | ||
+ | # | ||
+ | |||
+ | 20.2.2011: In Büchern war nichts über das intere Zahlenformat zu finden. | ||
+ | Dehalb habe ich das analysiert. Und so kompliziert ist es gar nicht: | ||
+ | |||
+ | BASIC speichert Zahlen generell als Gleitkommazahlen einfacher Genauigkeit | ||
+ | in 4 Byte ab (7 Bit Exponent mit Vorzeichen, 24 Bit Mantisse) | ||
+ | (floating point number, single precision, a signed seven bit exponent | ||
+ | and a signed 24 bit mantissa): | ||
+ | |||
+ | ----------------- | ||
+ | | 1 | 2 | 3 | 4 | | ||
+ | ----------------- | ||
+ | | | ||
+ | ----------------- | ||
+ | |||
+ | Schreibt man die Bytes in umgekehrter Reihenfolge (4 3 2 1), so erhält man | ||
+ | |||
+ | ---------------------------------------------------------------------- | ||
+ | | 4 | | ||
+ | ---------------------------------------------------------------------- | ||
+ | | Exponent | ||
+ | ---------------------------------------------------------------------- | ||
+ | | 1 Bit expVorzeichen, | ||
+ | ---------------------------------------------------------------------- | ||
+ | | VZ, Bit7...Bit0 | ||
+ | ---------------------------------------------------------------------- | ||
+ | |||
+ | |||
+ | Die Mantisse liegt immer im Bereich 2^(-1)< | ||
+ | Das erste Bit(2^-1) ist daher immer 1, und wird deshalb als Vorzeichenbit genutzt. | ||
+ | |||
+ | Mantisse Vorzeichen = " | ||
+ | stelligkeit=2^exp, | ||
+ | stelligkeit=2^(exp-128), | ||
+ | |||
+ | Zahl = 0.1Bit(2^-2)...Bit(2^-24) * stelligkeit | ||
+ | |||
+ | Das Exponent-Vorzeichen ist beim KC genau andersherum als üblich! | ||
+ | |||
+ | Beispiel Umrechnung in internes Format: | ||
+ | |||
+ | 0.1 dezimal | ||
+ | nächstgrößere 2er-Potenz ist 2^-3=0.125 | ||
+ | 0.1/ | ||
+ | 0.8*2^24=13421772, | ||
+ | |||
+ | Exponent | ||
+ | -3 = -000011b, 2er Komplement 1111101 (=bitweise negiert + 1) | ||
+ | Vorzeichen " | ||
+ | => 0-1111101 | ||
+ | |||
+ | Mantisse | ||
+ | von 110011001100110011001101b erste 1 weglassen, dafür Vorzeichen | ||
+ | => 0-10011001100110011001101 | ||
+ | |||
+ | Gesamtzahl | ||
+ | 0-1111101|0-10011001100110011001101=7D4CCCCDh | ||
+ | |||
+ | Ablage im Speicher als CD,CC,4C,7D | ||
+ | |||
+ | Mit einem kleinen BASIC-Programm kann man das verifizieren: | ||
+ | |||
+ | 10 A=0.1:!als erste Variable anlegen | ||
+ | 100 VI=DEEK(983): | ||
+ | 1000 PRINT " | ||
+ | 1010 PRINT PEEK(VI+2);" | ||
+ | |||
Zeile 377: | Zeile 483: | ||
Es gibt keine direkte Möglichkeit zu ermitteln, ob es sich um | Es gibt keine direkte Möglichkeit zu ermitteln, ob es sich um | ||
- | ein Zahlen- oder Stringfeld handelt. Auch die Größe ist nicht bestimmbar | + | ein Zahlen- oder Stringfeld handelt. Auch die Größe ist nicht direkt |
+ | (mit ein paar Programmtricks geht es aber -> total commander plugin listtap2 zeigt auch Felder an!) | ||
84 85 7C 3F A$(0) je 4 Byte pro Feldwert | 84 85 7C 3F A$(0) je 4 Byte pro Feldwert |