Die LC-80 Subroutinen - Anwendungsbeschreibung history menue Letztmalig dran rumgefummelt: 07.07.20 18:23:12
Hier beschreiben wir die Monitor-Programme des LC-80 sowie seine permanent angewandten Subroutinen eigentlich sowie im Zusammenhang grundsätzlich funktionieren. Wir liefern die "Grund-Idee", die Randbetrachtungen - die Parameter nach hinein, sowie heraus.
Für die Testprogramme ab dem 17.6.2020  gilt, dass sie noch überarbeitungsbedürftig sind - es wird ja der Versuch der Erklärung unternommen - und dies für ein extrem komplexes Thema der Informatik!
  0. Subroutinen - wie funktioniert das?
  1. DAK1
  2. DAK2
  3. ONESEG
  4. TWOSEG
  5. ADRSDP
  6. DADP
  7. RAMCHK
  8. SOUND
  9. SOUND1K
10. SOUND2K
11. MUSIC
12. MONMUS
13. Verwandte Themen

die Elektronikseiten

die LC-80 Subroutinen

inhaltlich auf korrektem Stand - evtl. partiell unvollständig ;-)

Wissen für Fortgeschrittene der Informatik

Informatik-Profi-Wissen


0. Subroutinen & Zyklen - wie funktioniert das? history menue scroll up

Das Problem ist in sich äußerst komplex - das Gute daran ist: ... man muss das anfangs gar nicht alles intern wirklich und ganz genau verstehen. Das Problem "Subroutine oder Unterprgramm" kann man wie eine Black-Box betrachten: ... was darin wirklich passiert, ist erst einmal egal - ich muss nur wissen, was muss rein und was kommt raus (Beispiel Otto-Motor: ... ich muss nicht wissen, wie der Motor funktioniert, gebe ich Gas, fährt das Fahrzeug schneller - fertig!!!). Gerne auch das Internet: ich rufe eine Website auf - was zum Aufruf alles getan werden muss, interessiert vorerst nicht - ich bekomme die Seite angezeigt.
Unterprogramme - Subroutinen sind das Herzstück aller Betriebssysteme. Deshalb gibt's hier als erstes auch das Listing des LC-80 Monitors selbst komplett dokumentiert. Das Gesamtsystem mit Verständnis interpretiert zeigt auf, dass der Rahmen immer wieder - und auch ineinander geschachtelt, raffiniert ausgeklügelte Subroutinen aufruft.
Eine Subroutine ist ein Programmteil, welcher wie eine mathematische Funktion
y = f (x) funktioniert. "f" ist die Funktion - in unserem Falle das Unterprogramm, welches einen Ausgangszustand in einen Endzustand überführt. "x" sind dabei die Parameter - selten nur ein Wert, "y" ist der "Rückgabewert". Das funktioniert genau wie in der Mathematik - nur anders ;-)

... Definition einer Subroutine

... Beispiel für eine Subroutine mit Parameter-Übergabe

... Schema eines Subroutinen-Aufrufs

Schema eines Subroutinen-Aufrufs - mehrfach - an verschiedenen Stellen

... Subroutinen können auch "geschachtelt" sein - eine Subroutine ruft eine andere weitere auf

... beim LC-80 - funktioniert ein Unterprogrammaufruf - also eine Subroutine - im Detail so:

  • eine Subroutine erweist sich genau dann als vorteilhaft, wenn an mehren Stellen eines Programms ein identischer Vorgang mit lediglich unterschiedlichen Eingangswerten abgearbeitet werden muss
  • dabei können Subroutinen Eingabe-Parameter erhalten und Ausgabeparameter zurück geben (müssen sie aber nicht!!!)
  • es ist auch selbstverständlich auch möglich, dass eine Subroutine eine weitere aufruft - das wird im LC-80 Betriebssystem sogar häufig genutzt
  • ... dies auch mehrfach ineinander geschachtelt

... das Assembler-Listing für den Test von Subroutinen
  Projekt als A-Side Assembler Datei

    ... das Listing downloaden

    ... und hier im HEX-Format

      ... und im BIN-Format

... igrob dargestellt, was auf Maschinen-Ebene bei Aufruf einer Subroutine passiert
... download im CorelDraw 11.0-Format

... igrob dargestellt, was auf Maschinen-Ebene bei Aufruf einer Subroutine passiert
... download im CorelDraw 11.0-Format

... grob dargestellt, was auf Maschinen-Ebene bei Aufruf einer Subroutine passiert
... download im CorelDraw 11.0-Format

... im Detail dargestellt, was auf Maschinen-Ebene bei Aufruf einer Subroutine passiert
... download im CorelDraw 11.0-Format

LC-80 Monitor - Disassembliert für die 2 × 1 KByte-Variante - eventuell müssen

Hinweise zu den LC-80 Standard-Subroutinen - eingebunden in den Monitor von Johannes Uhlig aus dem Jahr 2007 - fehlerfrei sowie editierbar

LC-80 Monitor von Johannes Uhlig aus dem Jahr 2007 - fehlerfrei sowie frei  editierbar

LC-80 Monitor von Johannes Uhlig aus dem Jahr 2007 - in Mnemonik-Codierung - fehlerfrei

LC-80 - der Monitor

... vollständig disassembliert - vor allem kommentiert

  • das gesamte Betriebssystem des LC-80 ist eigentlich "nur ein Rahmen", welcher seine eigenen System-Unterprogramme - teilweise extrem ineinander verschachtelt) aufruft
  • dies sind genau diejenigen Routinen, welche mir als Programmierer auch zur Verfügung stehen - selbstverständlich darf ich mir auch selbst Subroutinen schreiben und darin logischerweise auch die Standard-Subroutinen aufrufen

 

... vollständig fehlerfrei und editierbar nach Johannes Uhlig Stand 2008
ein kleiner Teil der BELL von Johannes Uhlig 2007 zum Thema LC-80

... vollständig fehlerfrei nach Johannes Uhlig Stand 2008 im Mnemonik-Code
BELL von Johannes Uhlig 2007

LC-80-Monitor

... das hier ist LC-80 Insider-Wissen - muss man als Anfänger nicht verstehen ;-)
System-Neustart: ... entscheidend ist der Inhalt auf Adresse 23FCH - ist dieser ungleich 80H, dann wird das System neu gestartet
Adresse im HEX-Format HEX-Code Assembler-Code
00074H 3A FC 23 LD A, (23FCH)
00077H FE 80 CP 80H
00079H C4 9C 02 CALL NZ, L0015 (... das entspricht Adresse 029CH)
... das hier kommt erst bei Nutzung des Interruptsystems zum Tragen (... und auch da lediglich im IMO 0) - muss man als Anfänger nicht wissen oder verstehen ;-)
Adresse im HEX-Format HEX-Code für den Sprungbefehl Adresse im HEX-Format
Kurzruf-Adresse 00H C7H darf nicht verwendet werden - Rechner-Neustart
Kurzruf-Adresse 08H CFH L0003: EQU 02308H
Kurzruf-Adresse 10H D7H L0004: EQU 02310H
Kurzruf-Adresse 18H DFH L0005: EQU 02318H
Kurzruf-Adresse 20H E7H L0006: EQU 02320H
Kurzruf-Adresse 28H EFH L0007: EQU 02328H
Kurzruf-Adresse 30H F7H L0008: EQU 02330H
Kurzruf-Adresse 38H FFH L0009: EQU 02338H
... NMI-Behandlung - den Gesamtzusammenhang muss man anfangs nicht wissen - aber man muss es tun können    ;-)
NMI-Aufruf: ... entscheidend ist der Inhalt auf Adresse 2340H - sowie die beiden folgenden Bytes 2341H sowie 2342H
  • NMI ist ein direktes Anschluss-Pin an der CPU Z80
  • es ist ein "L"-aktives Signal (damit die CPU "normal" arbeiten kann, muss es auf "H" liegen)
  • wird es auf "L" gelegt, so springt die Z80-CPU automatisch auf die Adresse 0066H und führt die dort eingetragenen Befehle aus (vorher wird die Rückkehr-Adresse auf dem Stack hinterlegt
  • das Betriebssystem des LC-80 ist so ausgelegt, dass auf der Adresse 00066H ein unbedingter Sprung auf die Adresse 02340H ausgeführt wird - das ist notwendig, um in der Reaktion auf NMI variabel zu sein (die Adresse 00066H liegt im ROM-Bereich und lässt somit keine Veränderung des Inhaltes zu)
  • durch den kleinen Trick mit dem Sprung auf den RAM-Bereich 02340H wird es möglich, anwenderspezifisch auf das Auslösen eines NMI zu reagieren
Adresse im HEX-Format LC-80 Reaktion auf NMI Anzeige-Wirksamkeit
Kurzruf-Adresse 00066H Sprung zur Adresse 000EEH Anzeige "Int" für eine Sekunde lang
Kurzruf-Adresse 00066H
  • bei Einsatz 2KByte-ROM - Sprung zur Adresse 00690H
  • bei Einsatz 1KByte-ROM - Sprung zur Adresse 00A90H
Register-Anzeige - Weiterschalten mit "+" oder "-"-Taste
Kurzruf-Adresse 00066H
  • bei Einsatz 2KByte-ROM - Sprung zur Adresse 00790H
  • bei Einsatz 1KByte-ROM - Sprung zur Adresse 00B90H
Step-Betrieb - Start mit "NMI" - Weiterschalten mit "ADR"-Taste
... wichtige Speicherbereiche des Systems - hier und mit diesem Geltungsbereich werden sie definiert
Adresse & Ladebefehl im HEX-Format sowie Assembler-Code LC-80 Reaktion auf den aktuellen Befehl Was der Programmierer beachten sollte
0006BH     31 EA 23        L0010:     LD SP, 23EAH der Stackpointer enthält nun den Wert  023E9H
  • ... ACHTUNG: auch der Systemstackpointer läuft selbstverständlich beginnend bei 023E9H nach unten
  • der Adressebereich oberhalb 02300H sollte für Programme und eigene Daten gemieden werden
0012EH     DD 21 F2 23                LD IX, 23F2H der System-Anzeigespeicher belegt nun die Speicherzellen von  023F2H bis  023F7H Register-Anzeige - Weiterschalten mit "+" oder "-"-Taste

1. DAK1 history menue scroll up

Ansteuerung der Anzeige sowie der Tastatur - Hauptanwendung ist die Anzeigesteuerung bis eine Taste gedrückt wurde. Tastatur sowie alle 6 LED-Anzeigen werden nacheinander angesteuert - anstelle des Tastaturcodes wird der interne Code geliefert, wie er von anderen Teilen des Monitorprogramms benötigt wird.

Aufrufadresse Eintritts-Parameter Austritts-Parameter verwendetet Register ... besonders zu beachten  
  • ... für die 1 KByte oder Betriebssystem-Variante mit U505: 085AH
  • ... für die 2 KByte oder Betriebssystem-Variante mit i2716: 045AH ... dies ist die gängigere Version
Eintritt:

IX, zeigt auf die niederwertigste Adresse des Speicherbereiches, der zur Anzeige gelangen soll (das ist das rechte Zeichen)
 
  Digit 1 Digit 2 Digit 3 Digit 4 Digit 5 Digit 6
Adresse 23F7H 23F6H 23F5H 23F4H 23F3H 23F2H


 

Austritt:
  • läuft automatisch endlos - wird erst mit Tastendruck verlassen
  • der Positionscode der Taste befindet sich im A-Register (siehe unten rechts)
  • Tastatur-Code-Tabelle siehe unten rechts

     
  • der Inhalt von AF wird zerstört
  • der Inhalt von HL wird zerstört
  • der Inhalt von A'F' wird zerstört
  • der Inhalt von B'C' wird zerstört
  • der Inhalt von D'E' wird zerstört
  • Beginn des System-Anzeigebereichs ist auf 023F2H bis zur023F7H
  • jeder 7-Segment Anzeige ist ein Byte im Speicher zugeordnet, insgesamt also 6 Byte
  • dabei ist der rechtesten LED das niederwertigste Byte zugeordnet (man muss so zu sagen von "hinten" schreiben - das letzte Zeichen zuerst!)
  • IX zeigt auf niederwertiges Byte- z.B. 2300H - System-Index ist 23F2H
     

Segment-Decodierung und Zeichentabelle

Detailliertes Assemblerlisting Beispielprogramm zum Test der Bedingungen HEX-Listing der gesamten Subroutine Ausgangs-Übergabe-Parameter

... das Assembler-Listing für DAK1

... Tastatur-Codes für DAK-Programme

... das Assembler-Listing für den Test von DAK1

  Projekt als A-Side Assembler Datei

    ... das Listing downloaden - hier im Listing

    ... und wenn's dennoch nicht klappt - dann hier als LC-80 ladbare Datei  downloaden - hier im HEX-Format

      ... und wenn's dennoch nicht klappt - dann hier als LC-80-ladbare Datei  downloaden - hier im  BIN-Format - das kann man direkt mit den richtigen Einstellungen in den LC-80 Emulator laden - die Sache mit der NMI-Register-Anzeige ist damit auch gleich bereits erledigt   ;-)

Textlisting der Subroutine DAK1

Positions-Codetabelle - Wert der Taste steht im Register A:

Taste 0 entspricht: 000H
Taste 1 entspricht: 001H
Taste 2 entspricht: 002H
Taste 3 entspricht: 003H
Taste 4 entspricht: 004H
Taste 5 entspricht: 005H
Taste 6 entspricht: 006H
Taste 7 entspricht: 007H
Taste 8 entspricht: 008H
Taste 9 entspricht: 009H
Taste A entspricht: 00AH
Taste B entspricht: 00BH
Taste C entspricht: 00CH
Taste D entspricht: 00DH
Taste E entspricht: 00EH
Taste F entspricht: 00FH
Taste ADR entspricht: 019H
Taste DAT entspricht: 014H
Taste + entspricht: 010H
Taste - entspricht: 011H
Taste STR entspricht: nicht nutzbar
Taste LD entspricht: nicht nutzbar
Taste EX entspricht: 012H

Der Tasten-Positions-Code steht im Register A


2. DAK2 history menue scroll up

Ansteuerung der Anzeige und Tastatur für 10 ms, Hauptanwendung ist die Anzeigesteuerung bis eine Taste gedrückt wurde. Alle 6 LED-Anzeigen werden nacheinander angesteuert - anstelle des internen Tastaturcodes wird der Code geliefert, wie er von Anwenderprogrammen benötigt wird.
Die praktische Umsetzung setzt jedoch ein wenig Erfahrung sowie "Mitdenken" voraus. Erfahrungen haben gezeigt, dass es vorteilhaft ist, auf dem System-Anzeigespeicher-Bereich zu arbeiten (beginnend bei
23F2H und endend bei 23F7H). Dann greifen auch die systemäquivalenten Subroutinen ohne Umprogrammierung von Registern und/oder RAM-Adressen!

Aufrufadresse Eintritts-Parameter Austritts-Parameter verwendetet Register ... besonders zu beachten ... die Zeichen-Codetabelle
  • ... für die 1 KByte Betriebssystem-Variante mit U505: 0883H
  • ... für die 2 KByte Betriebssystem-Variante mit i2716: 0485H ... dies ist die gängigere Version
Eintritt:

IX, zeigt auf die niederwertigste Adresse des Speicherbereiches, der zur Anzeige gelangen soll (das ist das rechte Zeichen)
 
  Digit 1 Digit 2 Digit 3 Digit 4 Digit 5 Digit 6
Adresse 23F7H 23F6H 23F5H 23F4H 23F3H 23F2H

Austritt:
  • CY = 1, wenn keine Taste gedrückt
  • CY = 0, wenn eine Taste gedrückt (außer RES oder NMI)
  • der Positionscode der Taste befindet sich im A-Register (siehe unten rechts)
  • der Inhalt von AF wird zerstört
  • der Inhalt von A'F' wird zerstört
  • der Inhalt von B'C' wird zerstört
  • der Inhalt von D'E' wird zerstört
 

Segment-Decodierung und Zeichentabelle

Detailliertes Assemblerlisting Beispielprogramm zum Test der Bedingungen HEX-Listing der gesamten Subroutine Parameter

... das Assembler-Listing für DAK2- Teil 1

... das Assembler-Listing für DAK2- Teil 2

... Tastatur-Codes für DAK-Programme

 

... das Assembler-Listing für den Test von DAK2

Projekt als A-Side Assembler Datei

    ... das Listing downloaden - hier im Listing

    ... und wenn's dennoch nicht klappt - dann hier als LC-80 ladbare Datei  downloaden - hier im HEX-Format

      ... und wenn's dennoch nicht klappt - dann hier als LC-80-ladbare Datei  downloaden - hier im  BIN-Format - das kann man direkt mit den richtigen Einstellungen in den LC-80 Emulator laden - die Sache mit der NMI-Register-Anzeige ist damit auch gleich bereits erledigt   ;-)

Textlisting der Subroutine DAK2

Bit-Codierung für die Einzelsegmente
 
  System-PIO-Ports zur Segmentsteuerung
PIO-Port-Bit A7 A6 A5 A4 A3 A2 A1 A0
Segment d e c dp g a f b
HEX-Wert 80H 40H 20H 10H 08H 04H 02H 01H

Kombinationen von Segmenten werden aus der HEX-Summe der Einzelsegmente gebildet - Beispiel - und Du solltest verstanden haben, wieso:

HEX-Wert 80H 40H 20H 10H 08H 04H 02H 01H
Bit 0 1 1 0 1 1 1 0
HEX-Wert 0H 40H 20H 0H 8H 4H 2H 0H
zusammen addiert in Summe der Wertigkeit der Bits 6EH
Taste 0 entspricht: 004H
Taste 1 entspricht: 005H
Taste 2 entspricht: 006H
Taste 3 entspricht: 007H
Taste 4 entspricht: 008H
Taste 5 entspricht: 009H
Taste 6 entspricht: 016H
Taste 7 entspricht: 00BH
Taste 8 entspricht: 00CH
Taste 9 entspricht: 00DH
Taste A entspricht: 0C6H
Taste B entspricht: 00FH
Taste C entspricht: 010H
Taste D entspricht: 011H
Taste E entspricht: 00EH
Taste F entspricht: 013H
Taste ADR entspricht: 014H
Taste DAT entspricht: 015H
Taste + entspricht: 00AH
Taste - entspricht: 017H
Taste ST entspricht: 001H
Taste LD entspricht: 002H
Taste EX entspricht: 000H

3. ONESEG history menue scroll up

Umwandlung einer Ziffer (die rechten 4 Bits eines Bytes) in den entsprechenden Sieben-Segment-Code, die rechten 4 Bit des A-Registers sind die umzuwandelnde HEX-Zahl - die höherwertige Tetrade bleibt bei der Operation unbehelligt. Das Ergebnis steht in Register A.

Aufrufadresse Eintritts-Parameter Austritts-Parameter verwendetet Register ... besonders zu beachten ... die Zeichen-Codetabelle
  • ... für die 1 KByte Betriebssystem-Variante mit U505: 08CAH
  • ... für die 1 KByte Betriebssystem-Variante mit i27165: 04CAH ... dies ist die gängigere Version
Eintritt:

die rechten 4 Bit des A-Registers sind die umzuwandelnde HEX-Zahl
 

Austritt:

der entsprechende 7-SegmentCode steht im Register A (Code-Tabelle siehe rechts)
 

  • der Inhalt von AF wird zerstört
  • Qelle des umzuwandelnden Hexadezimalwertes sind die rechten 4 Bit des Registers A
  • der zu erzielende Siebensegment-Code ist in jedem Falle ein 8-Bit- Wert
  • Ziel ist das gesamte Register A - also auch die ungenutzten 4 linken Bits werden überschrieben
  • das Ergebnis macht nur Sinn, wenn es auch auf den RAM-Speicher geschrieben und auch zur Anzeige genutzt wird
  • umgewandelt werden können natürlich nur Hexadezimalzahlen im Bereich von 0H bis FH

Segment-Decodierung und Zeichentabelle

Detailliertes Assemblerlisting Beispielprogramm zum Test der Bedingungen HEX-Listing der gesamten Subroutine sowie Technisches Prinzip der gesamten Subroutine Parameter

... das Assembler-Listing für ONSEG

... Ziffern-Anzeige-Codde Tabelle

 

... das Assembler-Listing für den Test von ONSEG

Projekt als A-Side Assembler Datei

    ... das Listing downloaden - hier im Listing

    ... und wenn's dennoch nicht klappt - dann hier als LC-80 ladbare Datei  downloaden - hier im HEX-Format

      ... und wenn's dennoch nicht klappt - dann hier als LC-80-ladbare Datei  downloaden - hier im  BIN-Format - das kann man direkt mit den richtigen Einstellungen in den LC-80 Emulator laden - die Sache mit der NMI-Register-Anzeige ist damit auch gleich bereits erledigt   ;-)

Textlisting der Subroutine ONESEG

Funktion der Subroutine ONESEG vor der Operation

Funktion der Subroutine ONESEG nach der Operation
ausgewogen austarierter Baum zum Download im CoreDraw 11.0-Format

Zeichen-Codetabelle der HEX-Zahlen:

0 entspricht: 0E7H
1 entspricht: 021H
2 entspricht: 0CDH
3 entspricht: 0ADH
4 entspricht: 02BH
5 entspricht: 0AEH
6 entspricht: 0EEH
7 entspricht: 025H
8 entspricht: 0EFH
9 entspricht: 0AFH
A entspricht: 06FH
B entspricht: 0EAH
C entspricht: 0C6H
D entspricht: 0E9H
E entspricht: 0CEH
F entspricht: 04EH

Der Ergebmnis-Code steht im Register A


4. TWOSEG history menue scroll up

Umwandlung des Inhalts des A-Registers in den entsprechenden Sieben-Segment-Code - die untere Tetrade von A als erste Ziffer, die obere Tetrade von A als zweite Ziffer. Die beiden Ergebnisse stehen auf durch HL indizierten Speicherplatz

Aufrufadresse Eintritts-Parameter Austritts-Parameter verwendetet Register ... besonders zu beachten ... die Zeichen-Codetabelle
  • ... für die 1 KByte Betriebssystem-Variante mit U505: 08D9H
  • ... für die 2 KByte Betriebssystem-Variante mit i2716: 04D9H ... dies ist die gängigere Version
Eintritt:

die untere Tetrade von A als erste Ziffer, die obere Tetrade von A als zweite Ziffer
 

Austritt:

der entsprechende 7-Segment Code steht auf (HL), der zweite auf (HL+1), wobei vorab HL um 2 erhöht wird
 

  • der Inhalt von AF wird zerstört
  • der Inhalt von HL wird zerstört
 

Segment-Decodierung und Zeichentabelle

Detailliertes Assemblerlisting Beispielprogramm zum Test der Bedingungen HEX-Listing sowie Technisches Prinzip der gesamten Subroutine Parameter

... das Assembler-Listing für TWOSEG

... Ziffern-Anzeige-Codde Tabelle

 

... das Assembler-Listing für den Test von TWOSEG

Projekt als A-Side Assembler Datei

    ... das Listing downloaden - hier im Listing

    ... und wenn's dennoch nicht klappt - dann hier als LC-80 ladbare Datei  downloaden - hier im HEX-Format

      ... und wenn's dennoch nicht klappt - dann hier als LC-80-ladbare Datei  downloaden - hier im  BIN-Format - das kann man direkt mit den richtigen Einstellungen in den LC-80 Emulator laden - die Sache mit der NMI-Register-Anzeige ist damit auch gleich bereits erledigt   ;-)

Textlisting der Subroutine TWOSEG

Funktion der Subroutine TWOSEG vor der Operation

Funktion der Subroutine TWOSEG nach der Operation

Codetabelle:

0 entspricht: 0E7H
1 entspricht: 021H
2 entspricht: 0CDH
3 entspricht: 0ADH
4 entspricht: 02BH
5 entspricht: 0AEH
6 entspricht: 0EEH
7 entspricht: 025H
8 entspricht: 0EFH
9 entspricht: 0AFH
A entspricht: 06FH
B entspricht: 0EAH
C entspricht: 0C6H
D entspricht: 0E9H
E entspricht: 0CEH
F entspricht: 04EH

  • der Ergebmnis-Code des niederwertigen Teils steht auf Adresse HL
  • der Ergebmnis-Code des höherwertigen Teils steht auf Adresse HL+1
  • HL wird um zwei erhöht

5. ADRSDP history menue scroll up

 

 

6. DADP history menue scroll up

 

 

7. RAMCHK history menue scroll up

 

 

8. SOUND history menue scroll up

Tonsignal für Lautsprecher - Ausgabe eines Tones definierter Länge und Frequenz

Aufrufadresse Eintritts-Parameter Austritts-Parameter verwendetet Register ... besonders zu beachten  
  • ... für alle Varianten: 0376H
Eintritt:
  • das Register IY zeigt auf den Anfang den Speicherbereiches in dem die codierten Noten stehen
  • jeweils 2 Byte repräsentieren eine Note
  • das erste Byte gibt die Tonhöhe, das zweite Byte die Tonlänge an
     
SOUND Byte 1 Byte 2 Funktion
Wert 00H bis 1FH 00H bis FFH Ton sowie Tonlänge
Wert 80H frei Melodie-Ende


 

Austritt:
  • läuft automatisch bis Ende - wird aber nur sauber beendet, wenn das Code-Byte 80H am Ende des Code-Sets in den Tonfolgenbereich eingeschlossen ist
  • wird mit dem Code-Byte 80H  verlassen (kein zweites Byte erforderlich - nachfolgende Codes werden zwangsläufig ignoriert)
  • wird mit dem Code-Byte 40H  von vorn begonnen (kein zweites Byte erforderlich)
  • mit dem Code-Byte 20H  wird eine Pause der Länge zweites Code-Byte eingefügt
  • der Inhalt von AF wird zerstört
  • der Inhalt von BC wird zerstört
  • der Inhalt von DE wird zerstört
  • der Inhalt von HL wird zerstört
  • die Inhalte von IX wird zerstört
  • wird mit dem Code-Byte 80H  verlassen (kein zweites Byte erforderlich)
  • wird mit dem Code-Byte 40H  von vorn begonnen (kein zweites Byte erforderlich)
  • mit dem Code-Byte 20H  wird eine Pause der Länge zweites Code-Byte eingefügt

Noten- und Codezuordnungstabelle


9. SOUND1K history menue scroll up

 

 

10. SOUND2K history menue scroll up

 

 

11. MUSIC history menue scroll up

Abspielen einer Tonfolge - Das Register IY zeigt auf den Anfang den Speicherbereiches in dem die codierten Noten stehen. Jeweils 2 Byte repräsentieren eine Note. Das erste Byte gibt die Tonhöhe, das zweite Byte die Tonlänge an
Hat das erste Byte den Wert
80H, wird das Musikprogramm verlassen, bei 40H wird das Programm von vorn begonnen, bei 20H wird eine Pause mit der durch das zweite Byte angegebenen Länge gemacht
Als Werte für die Tonhöhe sind die Zahlen
00H bis 1FH erlaubt. Bezogen auf eine Taktfrequenz von 900 kHz entsprechen aufeinander folgende Zahlen jeweils einen Halbtonschritt, wobei der tiefste Ton (00H) etwa dem Ton ais entspricht.
Die Tonlänge ist ebenfalls frei wählbar, dabei entspricht eine Verdoppelung der Zahl etwa der doppelten Dauer des Tones. Bitte beachten Sie, dass auf Grund des verwendeten RC-Generators die Taktfrequenz nicht konstant ist und daher die einzelnen Notenwerte nicht exakt erzielt werden, gleiches gilt für die Tonlänge.

Aufrufadresse Eintritts-Parameter Austritts-Parameter verwendetet Register ... besonders zu beachten  
  • ... für die 1 KByte oder Betriebssystem-Variante mit U505: 08EEH
  • ... für die 2 KByte oder Betriebssystem-Variante mit i2716: 04EEH ... dies ist die gängigere Version
Eintritt:
  • das Register IY zeigt auf den Anfang den Speicherbereiches in dem die codierten Noten stehen
  • jeweils 2 Byte repräsentieren eine Note
  • das erste Byte gibt die Tonhöhe, das zweite Byte die Tonlänge an
     
SOUND Byte 1 Byte 2
Wert 00H bis 1FH
Tonhöhe
00H bis FFH
Tonlänge
Wert 80H - STOP Melodie-Ende
Wert 40H - REPEAT Melodie-Wiederholung
Wert 20H - BREAK 00H bis FFH
Melodie-Pause


 

Austritt:
  • läuft automatisch bis Ende - wird aber nur sauber beendet, wenn das Code-Byte 80H am Ende des Code-Sets in den Tonfolgenbereich eingeschlossen ist
  • wird mit dem Code-Byte 80H  verlassen (kein zweites Byte erforderlich - nachfolgende Codes werden zwangsläufig ignoriert)
  • wird mit dem Code-Byte 40H  von vorn begonnen (kein zweites Byte erforderlich)
  • mit dem Code-Byte 20H  wird eine Pause der Länge zweites Code-Byte eingefügt
  • der Inhalt von AF wird zerstört
  • der Inhalt von BC wird zerstört
  • der Inhalt von DE wird zerstört
  • der Inhalt von HL wird zerstört
  • die Inhalte von IX wird zerstört
  • wird mit dem Code-Byte 80H  verlassen (kein zweites Byte erforderlich)
  • wird mit dem Code-Byte 40H  von vorn begonnen (kein zweites Byte erforderlich)
  • mit dem Code-Byte 20H  wird eine Pause der Länge zweites Code-Byte eingefügt

Noten- und Codezuordnungstabelle

Detailliertes Assemblerlisting Beispielprogramm zum Test der Bedingungen HEX-Listing der gesamten Subroutine Ausgangs-Übergabe-Parameter

... das Assembler-Listing für DAK1

... Tastatur-Codes für DAK-Programme

... das Assembler-Listing für den Test von DAK1

  Projekt als A-Side Assembler Datei

    ... das Listing downloaden - hier im Listing

    ... und wenn's dennoch nicht klappt - dann hier als LC-80 ladbare Datei  downloaden - hier im HEX-Format

      ... und wenn's dennoch nicht klappt - dann hier als LC-80-ladbare Datei  downloaden - hier im  BIN-Format - das kann man direkt mit den richtigen Einstellungen in den LC-80 Emulator laden - die Sache mit der NMI-Register-Anzeige ist damit auch gleich bereits erledigt   ;-)

Textlisting der Subroutine DAK1

Positions-Codetabelle - Wert der Taste steht im Register A:

Taste 0 entspricht: 000H
Taste 1 entspricht: 001H
Taste 2 entspricht: 002H
Taste 3 entspricht: 003H
Taste 4 entspricht: 004H
Taste 5 entspricht: 005H
Taste 6 entspricht: 006H
Taste 7 entspricht: 007H
Taste 8 entspricht: 008H
Taste 9 entspricht: 009H
Taste A entspricht: 00AH
Taste B entspricht: 00BH
Taste C entspricht: 00CH
Taste D entspricht: 00DH
Taste E entspricht: 00EH
Taste F entspricht: 00FH
Taste ADR entspricht: 019H
Taste DAT entspricht: 014H
Taste + entspricht: 010H
Taste - entspricht: 011H
Taste STR entspricht: nicht nutzbar
Taste LD entspricht: nicht nutzbar
Taste EX entspricht: 012H

Der Tasten-Positions-Code steht im Register A


12. MONMUS history menue scroll up

 

 

13. Verwandte Themen history menue scroll up

Hier gibt es Querverweise vor allem zu bereits vorab gelösten Programmierungsproblemen der einzelnen Schuljahre bis ins Schuljahr 2005 zurück, welche mittels LC-80 zu lösen waren. Der LC-80 ist zwar alt, aber immer noch hoch aktuell - heutige Prozessoren funktionieren bis ins Detail prinzipiell genau so, wie der Z80, welcher im Lern-Computer LC-80 als Hauptprozessor installiert ist. Moderen Prozessoren haben 64 Bit Verarbeitungsbreite (Z80 nur 98 Bit), sie arbeiten mit Taktfrequenzen bis 8 Giga-Hertz (LC-80

 


zur Hauptseite
© Samuel-von-Pufendorf-Gymnasium Flöha © Frank Rost am 15. Juni 2002 um 9.49 Uhr

... dieser Text wurde nach den Regeln irgendeiner Rechtschreibreform verfasst - ich hab' irgendwann einmal beschlossen, an diesem Zirkus nicht mehr teilzunehmen ;-)

„Dieses Land braucht eine Steuerreform, dieses Land braucht eine Rentenreform - wir schreiben Schiffahrt mit drei „f“!“

Diddi Hallervorden, dt. Komiker und Kabarettist