;----------------------------------------------------------------------------- ; ; Ju + Te 2013 BASIC-System ; PIC18F2550 ; ;----------------------------------------------------------------------------- ; ; +-----------+-----------------------------------+ ; |1k RAM FFFF| 512 Byte Graphik- | endfällt ; | FE00| Bildwiederholspeicher | ; +-----------+-----------------------------------+ ; | FDFF| 128 Byte Systemstack | verschieben ; | FD80| | ; +-----------+-----------------------------------+ ; | FD7F| 128 Byte ASCII- | endfällt ; | FD00| Bildwiederholspeicher | ; +-----------+-----------------------------------+ ; | FCFF| 128 Byte frei für Standard- | endfällt ; | FC80| Programme | ; +-----------+-----------------------------------+ ; | FC7F| 128 Byte Magnetbandpuffer | endfällt ; | FC00| | ; +-----------+-----------------------------------+ ; | FBFF| Anwenderbereich | beginnt ab 8000h ; | E000| | ; +-----------+-----------------------------------+ ; ; Frei für eigene programme : ; +-----------+-----------------------------------+ ; |2k ROM 0FFF| 2048 Byte 2k Betriebssystem | ; |Modul1 0800| | ; +-----------+-----------------------------------+ ; |2k ROM 07FF| 2048 Byte Basicinterpreter | ; |intern 0000| | ; +-----------+-----------------------------------+ ; ;----------------------------------------------------------------------------- ; Registerbelegung für BASIC-Editor ;----------------------------------------------------------------------------- ; %10-11 Pointer auf BASIC-Programmzeile ; %12-13 temp z.B. Wort für Dezimalausgabe ; %13 Zeichen von getchar ; %15-19 temp z.B. ASCII-Stellen für Dezimalausgabe ; %15 Zeichen an putchar ; %20-21 BASIC-Variable A ; %22-23 BASIC-Variable B ; (...) ; %4E-4F BASIC-Variable X ; %50-51 BASIC-Variable Y oder Programmstart für SAVE ; %52-53 BASIC-Variable Z oder Programmende für SAVE ; ;----------------------------------------------------------------------------- ; Registerbelegung für Betriebsystem ;----------------------------------------------------------------------------- ; %54 Videozeilenzähler ; %58 temp z.B. Textnummer ; %5A ASCII-Übergaberegister ; %5B Cursorposition im Zeichenspeicher (0..127) ; %5C temp z.B. Schrittweite beim Cursor ; %5D HexByte-Übergaberegister ; %5E-5F Adress-Übergaberegister ; %60 temp ; %6C Byte aus Hex-Eingabe über Tastatur ; %6D Tastencode-Register. T-Bit (bit 7) =1 wenn neuer Inhalt ; %6E-6F Wort aus Hex-Eingabe über Tastatur ; %74-75 IRQ0-Vektor ; %76-77 IRQ1-Vektor ; %78-79 IRQ2-Vektor ; %7A-7B IRQ3-Vektor ; %7C-7D IRQ4-Vektor (T0 für Videoerzeugung) ; %7E-7F IRQ5-Vektor ; ;----------------------------------------------------------------------------- ; Speicherbelegung ;----------------------------------------------------------------------------- ; %FFFF Shift-Flag. 0 wenn Shift aktiv ; Das gibt einen weissen Strich unten rechts auf dem Bildschirm. ; ;----------------------------------------------------------------------------- ;**************************************************************************** ; Beginn Quellcode & Config Assembler ;**************************************************************************** cpu z8601 include stddefz8.inc ;**************************************************************************** ; Festlegung AS-Steuervariabeln ;**************************************************************************** ROMsize SET 4096 MONTYP SET "2K_NEU" ;MONTYP SET "VGA" ;KEYTYP SET "JU+TE" ;KEYTYP SET "VPOHLERS" KEYTYP SET "KEYB" ;**************************************************************************** ; Festlegung AS-Funktionen ;**************************************************************************** HI function x,(x>>8)&255 LO function x, x&255 ;**************************************************************************** ; Festlegung Konstanten ;**************************************************************************** ;SYNON EQU 00080h ; original: P37 für Sync, P35 für seriell in SW ;SYNOFF EQU 0007Fh SYNON EQU 00020h ; P35 für Sync, P37 frei für Nutzung mit SIO SYNOFF EQU 000DFh ;**************************************************************************** ; Register ;**************************************************************************** org 00000h assume RP: 0000Ch ; keine Optimierung ! ;----------------------------------------------------------------------------- ; Interupt-Verteiler ;----------------------------------------------------------------------------- org 00000h dw irq0 dw irq1 dw irq2 dw irq3 dw irq4 dw irq5 ;----------------------------------------------------------------------------- ; MME-Basic ;----------------------------------------------------------------------------- org 0000Ch include MME_BASIC.inc ;----------------------------------------------------------------------------- ; Einsprungadressen ;----------------------------------------------------------------------------- org 0800h phase 0800h if MONTYP = "2K_NEU" ; Original irq0: jp 0E000h ; IRQ 0 irq1: jp 0E003h ; IRQ 1 irq2: jp 0E006h ; IRQ 2 irq3: jp 0E009h ; IRQ 3 irq4: jp M_0ADA ; IRQ 4 irq5: jp 0E00Fh ; IRQ 5 elseif MONTYP == "PROP" irq0: jp M_0B5C ; IRQ 0 irq1: jp M_0B5C ; IRQ 1 irq2: jp M_0B5C ; IRQ 2 irq3: jp M_0B5C ; IRQ 3 irq4: jp M_0B5C ; IRQ 4 irq5: jp M_0B5C ; IRQ 5 endif M_0812: jp M_08FF ; Eintritt aus Bootstrap Module ;----------------------------------------------------------------------------- ; Einsprungziele für den U883 ;----------------------------------------------------------------------------- M_0815: jp M_081D ;----------------------------------------------------------------------------- ; ;----------------------------------------------------------------------------- M_0818: ld 5Ah, 15h ; Ausgabe des in %5A übergebenen ASCII auf dem Bildschirm jr M_0827 ; mit %5B als Pointer ;----------------------------------------------------------------------------- ; ;----------------------------------------------------------------------------- M_081D: call M_0824 ; statische Tastaturabfrage mit Ausführung auf Bildschirm ld 13h, 5Ah ; %5B: Bildschirmpointer, %5A: ASCII ret ;----------------------------------------------------------------------------- ; statische Tastaturabfrage mit Echo auf Bildschirm ; %5B: Bildschirmpointer, %5A: ASCII ;----------------------------------------------------------------------------- M_0824: call TSK ; statische Tastenabfrage. %6D: T-Bit, %5A: ASCII ;----------------------------------------------------------------------------- ; Ausgabe des in %5A übergebenen ASCII auf dem Bildschirm mit %5B als ; Pointer, Verarbeitung der Cursortasten, CR, CLR, CLS ;----------------------------------------------------------------------------- M_0827: cp 5Ah ,#7Fh ; Taste "OFF" gedrückt? jr Z ,M_086B ; --> Eingabe abbrechen! cp 5Ah ,#20h ; druckbares Zeichen? jr NC ,M_0872 ; --> ausgeben! cp 5Ah ,#1Bh ; Taste "Cursor rechts" ? jr Z ,M_0875 ; --> Pointer erhöhen, ggf. Zeilenschaltung und Bildrollen ld 5Ch ,#-10h cp 5Ah ,#1Ah ; Taste "Cursor hoch" ? jr Z ,M_0878 ; --> Pointer um Wert in %5C (-16) erhöhen ld 5Ch ,#10h cp 5Ah ,#0Ah ; Taste "Cursor runter" ? jr Z ,M_0878 ; --> Pointer um Wert in %5C (+16) erhöhen ld 5Ch ,#-1 cp 5Ah ,#0Bh ; Taste "Cursor links" ? jr Z ,M_0878 ; --> Pointer um Wert in %5C (+1) erhöhen cp 5Ah ,#8 ; Taste "CLR" ? jr NZ ,M_0860 ; nein --> weiter call M_0878 ; --> Pointer um Wert in %5C (+1) erhöhen ld 5Ah ,#20h ; Leerzeichen call M_0B95 ; in Bildschirmspeicher eintragen ld 5Ah ,#8 ret M_0860: cp 5Ah ,#0Dh ; Taste "ENTER" ? jr NZ ,M_086C ; nein --> weiter call M_0AD4 ; neue Bildschirmzeile mit Freizeilensperre ld 5Ah ,#0Dh M_086B: ret M_086C: cp 5Ah ,#0Ch ; Taste "CLS" ? jr Z ,M_08DD ; --> Löschen von Bildschirm und Pointer %5B ret ;----------------------------------------------------------------------------- ; Darstellen des ASCII aus %5A auf dem Bildschirm, Kursor (%5B) wird ; aktualisiert. Steuerzeichen werden nicht erkannt ;----------------------------------------------------------------------------- M_0872: call M_0B95 ;----------------------------------------------------------------------------- ; Erhöhen des Bildschirmpointers %5B um einen Schritt ;----------------------------------------------------------------------------- M_0875: ld 5Ch ,#1 ; Schrittweite auf +1 setzen ;----------------------------------------------------------------------------- ; Erhöhen des Bildschirmpointers %5B um mehrere Schritte, Anzahl in %5C. ; (incl. Zeilenschaltung und Bildschirmrollen) ;----------------------------------------------------------------------------- M_0878: add 5Bh ,5Ch ; Pointer um Schrittweite erhöhen jr OV ,M_0899 ; >128? --> scrollen jr MI ,M_08FC ; =128? --> auf Null setzen ld 60h ,5Ch ; Schrittweite sichern ld 5Ch ,5Bh ; Pointer kopieren and 5Ch ,#0Fh ; Position in der Zeile ausmaskieren cp 5Ch ,#0Dh ; <13 ? jr C ,M_08DC ; ja --> fertig rl 60h jr NC ,M_0894 ; Schrittweite < 128 ? sub 5Bh ,#6 M_0894: add 5Bh ,#3 ; 3 dabei für neue Zeile jr NOV ,M_08DC ; und fertig M_0899: push RP srp #60h ; klarmachen zum Scrollen assume RP:060h ld R0 ,#0FDh ; erste Zeile Zeichenspeicher ld R1 ,#000h ld R2 ,#0FDh ; zweite Zeile ld R3 ,#010h ld R4 ,#070h ; 7x 16(13) Zeichen M_08A7: lde R5 ,@RR2 lde @RR0 ,R5 inc R1 inc R3 djnz R4 ,M_08A7 ld R4 ,#10h ; 16 Zeichen der untersten Zeile ld R5 ,#20h ; mit Leerzeichen M_08B3: lde @RR0 ,R5 ; füllen inc R1 djnz R4 ,M_08B3 ld R1 ,#38h ; erste Zeile Pixelspeicher inc R2 inc R0 ld R3 ,#70h ; zweite Zeile ld 5Bh ,R3 M_08C0: lde R5 ,@RR2 lde @RR0 ,R5 incw RR0 incw RR2 cp R3 ,#0F0h jr C ,M_08C0 ld R5 ,#0FFh cp R2 ,R5 jr C ,M_08C0 ; bis unteres Ende (%FFF0) erreicht ld R4 ,#38h M_08D5: lde @RR0 ,R5 ; die nächsten 56 bytes mit %FF füllen inc R1 djnz R4 ,M_08D5 pop RP ; und fertig M_08DC: ret ;----------------------------------------------------------------------------- ; Löschen von Bildschirm und Pointer %5B ;----------------------------------------------------------------------------- M_08DD: push RP srp #60h assume RP:060h ld R4 ,#0FDh ; Ende des Zeichenspeichers ld R5 ,#80h ld R3 ,#20h ; Leerzeichen ld R2 ,#128 ; Länge des Zeichenspeichers M_08E9: dec R5 lde @RR4 ,R3 ; Zeichenspeicher löschen djnz R2 ,M_08E9 ld R2 ,#2 ld R3 ,#0FFh ; schwarze Pixel M_08F3: inc R4 ; das gibt %FE00, Beginn des Pixelspeichers M_08F4: lde @RR4 ,R3 ; Pixelspeicher löschen djnz R5 ,M_08F4 djnz R2 ,M_08F3 pop RP M_08FC: clr 5Bh ; Cursor auf Home-Position oben links ret ;----------------------------------------------------------------------------- ; Eintritt aus Bootstrap Module ;----------------------------------------------------------------------------- M_08FF: srp #0F0h ; SFR-Page assume RP:0F0h ld SPL ,#0 ; Stackpointer auf %FE00 ld SPH ,#0FEh ld IMR ,#10h ; IRQ4 erlauben, INTs aus ld IPR ,#8 ; IRQ4 auf niedrigste Priorität ld P01M ,#92h ; P0/P1 Adressbus, Stack extern, Timing normal ld PRE0 ,#5 ; Prescaler =1, Timer modulo N ld T0 ,#64 ; Timer 0 auf 64 (d.h. INT4 alle 64µs bzw 15,625kHz) ld TMR ,#3 ; Timer 0 laden und starten ld 06h, #0E0h clr 07h ; BASIC-Programmstart auf %E000 clr 08h clr 6Dh ; Tastaturpuffer löschen call M_08DD ; Löschen von Bildschirm und Pointer %5B ei ; Interrupts einschalten ld 58h ,#14h ; Textnummer von "COMP JU+TE R" call PrtText ; Text ausgeben ; Hauptschleife des BASIC-Editors M_0924: srp #10h assume RP:010h ld 5Ah ,#'K' call M_0B95 ; Cursorbuchstaben drucken call M_0824 ; auf Eingabe warten ld R6 ,5Ah ; geholtes Zeichen ld R15 ,#16h ; Zeiger auf R6 call B_03D9 ; U883BAS: Test auf Buchstabe 'A'..'Z' jr NC ,M_0945 ; nein --> weiter ; Buchstabe: Variablenwert ausgeben sub R6 ,#31h ; d.h. %10 für A, %2B für Z add R6 ,R6 ; mal 2 ld R2 ,@R6 ; MSB in %12 inc R6 ld R3 ,@R6 ; LSB in %13 ld 5Ah ,#'=' call M_0872 ; Gleichzeichen drucken call PrtDezNr ; Variablenwert + NLN ausgeben jr M_0924 ; und zurück zur Eingabeschleife ; Sonderzeichen: Editor-Kommandos M_0945: cp R6 ,#'*' ; CONT ? jr NZ ,M_095C ; nein --> weiter tm 0Fh, #8 ; sind wir auf STOP? jr Z ,M_098D ; nein --> Fehler 0 and 0Fh,#0F7h ; STOP-Flag löschen jr M_0978 ; und Programm fortsetzen M_095C: ld 0Fh,#4 clr 0Eh ; Fehlerflags löschen ld R0 ,06h ; Pointer auf Anfang des BASIC-Programmes ld R1 ,07h cp R6 ,#8 ; NEW ? jr NZ ,M_0970 ; nein --> weiter ld R4 ,#0 lde @RR0 ,R4 ; erstes Byte des BASIC-Programmes auf 0 setzen jr M_0924 ; und zurück zur Eingabeschleife M_0970: cp R6 ,#'+' ; RUN ? jr NZ ,M_09AB ; nein --> weiter call B_06C9 ; Variablen löschen und BASIC initialisieren M_0978: call B_0738 ; Programm fortsetzen call M_0AD4 ; neue Zeile ld 58h ,#0Ch ; Textnummer von "END" tm 0Fh, #2 ; sind wir fertig? jr NZ ,M_0992 ; ok --> weiter dec 58h ; Textnummer von "STOP" tm 0Fh, #8 ; sind wir auf STOP? jr NZ ,M_0992 ; ok --> weiter M_098D: call PrtError ; Fehler melden M_0990: jr M_0924 ; und zurück zur Eingabeschleife M_0992: call PrtText ; Text ausgeben push R0 ; BASIC-Zeilenpointer sichern push R1 decw RR0 call B_0500 ld R2 ,R4 ld R3 ,R5 call PrtDezNr ; Zeilennummer ausgeben pop R1 pop R0 jr M_0990 ; und zurück zur Eingabeschleife M_09AB: cp R6 ,#'-' ; LIST ? ld 6Eh ,#0Ch jr NZ ,M_09D9 ; nein --> weiter ld 6Fh ,#0E6h M_09B6: lde R2 ,@RR0 ; MSB Zeilennummer holen or R2 ,R2 ; Null? jr Z ,M_0990 ; --> zurück zur Eingabeschleife incw RR0 lde R3 ,@RR0 ; LSB Zeilennummer holen and R2 ,#7Fh ; bit 7 im MSB löschen call M_0AA3 ; und Nummer drucken call PrtList ; BASIC-ZEile drucken jr NC ,M_098D ; Fehler ? clr 6Dh ; Tastaturflag löschen call TSK ; und auf Tastendruck warten cp 5Ah ,#"-" ; wieder LIST? jr NZ ,M_0990 ; nein, zurück zur Eingabeschleife incw RR0 jr M_09B6 ; sonst nächste Zeile ausgeben ; Zahlen: BASIC-Zeile eingeben M_09D9: call B_03E7 ; U883BAS: Test auf Ziffer '0'..'9' jr NC ,M_0A38 ; C=0, keine Ziffer --> weiter ld R3 ,R6 ; Ziffer als erstes Eingabezeichen in %13 call 02F4h ; und den Rest über U883 p_input3 holen ld R15 ,#16h ld R8 ,#80h ; Zeilennr hat bit 15 gesetzt... or R8 ,R4 ld R9 ,R5 ; ... und steht nun in R8-R9 or R9 ,R5 ; LSB Null? Darf nicht wg. EOF. jr NZ ,M_09F0 ; nein --> weiter inc R9 ; sonst Zeilennummer um eins erhöhen M_09F0: lde R2 ,@RR0 ; MSB der aktuellen BASIC-Zeile holen or R2 ,R2 ; Null? jr Z ,M_0A13 ; ja --> and R2 ,#7Fh ; bit 15 ausblenden incw RR0 lde R3 ,@RR0 ; LSB holen call B_0141 ; U883BAS: M_0141 tm 0Fh, #40h jr NZ ,M_0A33 tm 0Fh, #20h jr NZ ,M_0A11 call B_0593 ; U883BAS: M_593 incw RR0 jr M_09F0 M_0A11: decw RR0 M_0A13: ld 6Fh ,#0D7h ld R6 ,R8 call M_CA4 ld R6 ,R9 call PrtList jr C ,M_0A2D call M_0A83 inc R6 jr MI ,M_0A30 call PrtError jr M_0A30 M_0A2D: call M_CA4 M_0A30: jp M_0924 ; und zurück zur Eingabeschleife M_0A33: call M_0A83 jr M_0A13 ;----------------------------------------------------------------------------- ; LOAD und SAVE-Routinen über SIO. Der Inhalt des BASIC-Speichers wird als ; SIO-Datenstrom rausgeschrieben bzw der empfangene Datenstrom in den Speicher ; geschrieben. Ein Nullbyte beendet das Ganze ; ; bit rate = xtal frEQUency / (128 x (PRE0/4) x T0) ; = 8 000 000 / (128 x 8 x 13) = 601 bps ;----------------------------------------------------------------------------- M_0A38: di ld PRE0 ,#21h ; T0 prescaler 8, Zähler mod n ld T0 ,#13 ; Zählwert für 600 bps ld TMR ,#43h ; T0 laden und starten, Ausgang aktiv ld P3M ,#48h ; P34 als /DM, P30 und P37 für SIO ld SIO ,#0FFh clr IRQ ; aktive Interrupts löschen cp R6 ,#5Fh ; LOAD (shift-O) ? jr NZ ,M_0A63 ; nein --> weiter M_0A4F: tm irq ,#8 ; auf SIO-Interrupt warten jr Z ,M_0A4F clr irq ; Interrupt löschen ld R6 ,SIO ; Daten holen lde @RR0 ,R6 ; und in den BASIC-Speicher schreiben incw RR0 ; Pointer erhöhen or R6 ,R6 ; 0 = Programmende? jr NZ ,M_0A4F ; nein, weitermachen M_0A60: jp 0020h ; Abgang über UB883BAS Init-Routine M_0A63: cp R6 ,#40h ; SAVE (shift-P) ? jr NZ ,M_0A60 ; nein --> ins BASIC ld R2 ,#14h call B_06AA ; etwas warten inc R6 ; inc R6 in einem Byte M_0A6E: tm irq ,#10h ; auf T0-Interrupt warten jr Z ,M_0A6E clr irq ; Interrupt löschen or R6 ,R6 ; jr Z ,M_0A60 ; 0 = Programmende? lde R6 ,@RR0 ; neues Programmbyte holen ld sio ,R6 ; und rausschicken incw RR0 ; Pointer erhöhen jr M_0A6E ; und weitermachen M_0A83: call B_0500 ; U883BAS: M_500 ld R2 ,R0 ld R3 ,R1 ld R4 ,R0 ld R5 ,R1 incw RR4 M_0A8E: incw RR4 lde R7 ,@RR4 rl R7 jr UGT ,M_0A8E M_0A96: lde R7 ,@RR4 lde @RR2 ,R7 incw RR2 incw RR4 or R7 ,R7 jr NZ ,M_0A96 ret ;----------------------------------------------------------------------------- ; BASIC-Editor ; Dezimalausgabe aus %12-13 ohne führende Nullen (RP=%10 !) ;----------------------------------------------------------------------------- M_0AA3: call B_0182 ; Word %12-13 in ASCII %15-19 + Vorzeichen in R4 cp R4 ,#20h ; Vorzeichen ist Leerzeichen? jr Z ,M_0AAE ; nein --> weiter call M_0ABD ; sonst Vorzeichen drucken M_0AAE: ld R11 ,#15h ; erste Ziffer steht in %15 M_0AB0: ld R4 ,@R11 ; Ziffer holen cp R4 ,#30h ; ist es Null? jr NZ ,M_0AC2 ; nein --> zum Drucken übergehen inc R11 ; sonst überspringen cp R11 ,#1Ah jr C ,M_0AB0 M_0ABD: ld 5Ah ,R4 ; R4 in ASCII-Übergaberegister jp M_0872 ; und ausgeben M_0AC2: call M_0ABD ; Ziffer drucken inc R11 ; und die nächste holen ld R4 ,@R11 cp R11 ,#1Ah jr C ,M_0AC2 ret ;----------------------------------------------------------------------------- ; Zeilenschaltung ;----------------------------------------------------------------------------- M_0ACE: ld 5Ah ,#20h ; Leerzeichen in ASCII-Übergaberegister call M_0872 ; und drucken ;----------------------------------------------------------------------------- ; neue Bildschirmzeile mit Freizeilensperre, d.h. nur wenn Cursor nicht ; am Zeilenanfang steht ;----------------------------------------------------------------------------- M_0AD4: tm 5Bh ,#0Fh ; sind wir am Zeilenanfang? jr NZ ,M_0ACE ; nein --> Zeilenschaltung ret ;**************************************************************************** ; ; Timing: ; Darstellung der verfuegbaren Rechenzeit ; ;rechter linker ;Bildrand Bildrand ; +--------------+-+--------------+--------------------------------+ ; | |H| | | ; | |H| | 32µs sichtbare Zeile | 192 Zeilen ; | |H| | | durchgaengig ; | |H| | | ohne Interrupt ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; | |H| | | ; +--------------+-+--------------++-------------------------------+ ; | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 1 Zeile zum ; | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| umprogrammieren, ; unterer | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| ; Bildrand | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 120 Zeilen ; | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| mit Interrupt, ; | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| ; + - - - - - - -+-+ - - - - - - - |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| davon ; V-Impuls | |V| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| 5 Zeilen ; + - - - - - - -+-+ - - - - - - - |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| mit V-Impuls, ; oberer | |H| |xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| ; Bildrand +--------------+-+---------------+-------------------------------+ ; zusammen: ; 313 Zeilen * 64µs ; = 20,032ms ; ; ; H -> Horizontalsynchronimpuls ; ; V -> Vertikalsynchronimpuls, der V-Impuls wird durch invertierte H-Impulse unterbrochen, ; ; x -> freie Rechenzeit, ca. 20% der Gesamtrechenleistung koennen genutzt werden, ; ; 1 23 4 ; +-+ ; | | ; +-----------------+ +---------------+-------------------------------+ ; ;**************************************************************************** M_0ADA: push RP srp #50h assume RP:050h djnz R4 ,M_0B3E ; wenn (%54)>0, dann sind wir noch im Strahlrücklauf ;----------------------------------------------------------------------------- ; Beginn des sichtbaren Bereiches (3x 64 = 192 Zeilen) ; Hier braucht die Bilderzeugung 100% Rechenleistung ! ;----------------------------------------------------------------------------- ld R6 ,SPH ; Stackpointer sichern ld R7 ,SPL ld SPH ,#0FEh ; Stackpointer auf Beginn des Pixelspeichers (%FE00) clr SPL ld R4 ,#64 ; Zeilenzähler (%54) auf 64 M_0AEB: swap 80h ; 8 , %80 nibble tauschen, zeit totschlagen ???? ;----------------------------------------------------------------------------- ; 2. HSync-Impuls ;----------------------------------------------------------------------------- or P3 ,#SYNON ; 10 , P37 setzen _ and P3 ,#SYNOFF ; 10 , P37 löschen, Horizontalsynchronimpuls ;----------------------------------------------------------------------------- ; 3. Schwarzschulter ;----------------------------------------------------------------------------- tm 6Dh ,#80h ; 10 , Ist das T-Bit gesetzt jr Z ,M_0AFD ; 12/10, nein --> kein Tasten-Piep xor P3 ,#40h ; 10 , sonst P36 toggeln jr M_0B02 ; 12 M_0AFD: and P3 ,#SYNOFF-40h ; 10 , P36 löschen (P37 auch wäre aber nicht nötig) jr F ,$ ; 10 , zeitanpassung M_0B02: jr F ,$ ; 10 , zeitanpassung ;----------------------------------------------------------------------------- ; 4. sichtbarer Teil, 8 Byte darstellen (insg. = 128 Zyklen = 32µs) ;----------------------------------------------------------------------------- nop ; 6 pop 80h ; 10 , laden 1.Byte nop ; 6 pop 80h ; 10 , laden 2.Byte nop ; 6 , pop 80h ; 10 , laden 3.Byte nop ; 6 pop 80h ; 10 , laden 4.Byte nop ; 6 pop 80h ; 10 , laden 5.Byte nop ; 6 pop 80h ; 10 , laden 6.Byte nop ; 6 pop 80h ; 10 , laden 7.Byte nop ; 6 pop 80h ; 10 , laden 8.Byte ;----------------------------------------------------------------------------- ; 1. rechter Bildrand ;----------------------------------------------------------------------------- inc R5 ; 6 , Zeile noch mal darstellen ? jr Z ,M_0B27 ; 12/10, nein --> weiter sub SPL ,#8 ; 10 , sonst Zeiger zurueck auf Anfang der Zeile sbc SPH ,#0 ; 10 jr M_0AEB ; 12 , und das Ganze wiederholen M_0B27: ld R5 ,#-3 ; jede Zeile wird 3x ausgeben nop nop djnz R4 ,M_0AEB ; Zähler dekrementieren und weiter mit nächster Zeile ;----------------------------------------------------------------------------- ; erste Zeile vom unteren Bildrand ;----------------------------------------------------------------------------- and irq ,#0EFh ; IRQ4 löschen or P3 ,#SYNON ; HSync ein and P3 ,#SYNOFF ; HSync aus ld SPH ,R6 ld SPL ,R7 ; Stackpointer wiederherstellen ld R4 ,#120 ; 120 Zeilen für Retrace werden im Interrupt erzeugt jr M_0B5A ;----------------------------------------------------------------------------- ; Bilderzeugung im Interrupt während des Strahlrücklaufes (120 Zeilen) ;----------------------------------------------------------------------------- M_0B3E: cp R4 ,#32 jr C ,M_0B50 ; die letzten 32 Zeilen sind leer cp R4 ,#37 jr NC ,M_0B54 ; die ersten 88 Zeilen ebenfalls and P3 ,#SYNOFF ; dazwischen VSync mit or P3 ,#SYNON ; invertiertem HSync jr M_0B5A M_0B50: incw 56h ; Zeit schinden decw 56h M_0B54: or P3 ,#SYNON ; HSync ein and P3 ,#SYNOFF ; HSync aus M_0B5A: pop RP M_0B5C: iret ;----------------------------------------------------------------------------- ; Position des Zeichens in R2 in der Zeichentabelle berechnen ; und in RR0 zurückliefern ;----------------------------------------------------------------------------- assume RP:010h M_0B5D: ld R1 ,R2 ; ASCII mal drei add R1 ,R2 ; plus Tabellenanfang add R1 ,R2 add R1 ,#LO(charset)-060h ; %20 ist erstes Zeichen ld R0 ,#HI(charset) ret ;----------------------------------------------------------------------------- ; Position %5B im Bildschirmspeicher berechnen, in RR4 zurückliefern ;----------------------------------------------------------------------------- M_0B69: ld R5 ,5Bh ; Cursorposition and R5 ,#0Fh ; Spalte innerhalb der Zeile (0..12) ld R3 ,R5 rl R5 rl R5 add R3 ,R5 ; x5 (0..60 bzw %00..3C) ld R5 ,R3 and R3 ,#007h ; bit 0..2 isolieren and R5 ,#038h ; bit 3..5 isolieren rl R5 swap R5 ld R6 ,5Bh ; nochmal Cursorposition swap R6 ld R4 ,#0FEh and R6 ,#007h ; Zeile inc R6 ; +1 M_0B8C: add R5 ,#38h adc R4 ,#0 djnz R6 ,M_0B8C ret ;----------------------------------------------------------------------------- ; Darstellen eines ASCII aus %5A auf dem Bildschirm, Kursor bleibt unverändert, ; Steuerzeichen werden nicht erkannt ;----------------------------------------------------------------------------- M_0B95: push RP assume RP:060h srp #60h ld R0 ,#0FDh ld R1 ,5Bh ; Position im Zeichenspeicher ld R2 ,5Ah ; auszugebendes Zeichen lde @RR0 ,R2 ; und eintragen call M_0B5D ; Zeiger auf charset berechnen (in RR0) ld R2 ,#3 ; Zeichen besteht aus 3 Byte für 6 Zeilen call M_0B69 ; Position im Bildschirmspeicher (in RR4) M_0BA9: ldc R6 ,@RR0 ; obere Zeile call M_0BBB ; in Bildschirmspeicher eintragen ldc R6 ,@RR0 swap R6 ; untere Zeile call M_0BBB ; in Bildschirmspeicher eintragen inc R1 djnz R2 ,M_0BA9 ; nächstes Byte pop RP ret ;----------------------------------------------------------------------------- ; Zeichen im oberen Nibble von R6 in den Bildschirmspeicher an der Adresse ; RR4 eintragen. RR4 wird auf die nächste Zeile erhöht ;----------------------------------------------------------------------------- M_0BBB: lde R7 ,@RR4 incw RR4 lde R8 ,@RR4 or R3 ,R3 jr Z ,M_0BCF ld R10 ,R3 M_0BC7: rl R8 ; das ist die wilde Schieberei... rlc R7 rlc R9 djnz R10 ,M_0BC7 M_0BCF: and R7 ,#00Fh and R6 ,#0F0h ; und das unser Zeichen or R7 ,R6 or R3 ,R3 jr Z ,M_0BE5 ld R10 ,R3 M_0BDD: rr R9 rrc R7 rrc R8 djnz R10 ,M_0BDD M_0BE5: lde @RR4 ,R8 decw RR4 lde @RR4 ,R7 add R5 ,#8 adc R4 ,#0 ret ;----------------------------------------------------------------------------- ; Textausgabe. Die Nummer des Textes steht in Register 58h ; Die Texttabelle ist TextTab ;----------------------------------------------------------------------------- PrtText: push RP srp #50h assume RP:050h ld R14 ,#HI(TextTab) ld R15 ,#LO(TextTab) PrtTxt1: ld R9 ,#5Ah ldci @R9 ,@RR14 ; Zeichen nach %5A holen tm R10 ,#80h ; Bit 7 gesetzt? jr Z ,PrtTxt1 ; nein, nächstes Zeichen dec R8 ; Textnummer (%58) herunterzählen jr NZ ,PrtTxt1 ; und weiter ;----------------------------------------------------------------------------- ; Text gefunden ;----------------------------------------------------------------------------- and R10 ,#7Fh ; bit 7 löschen PrtTxt2: call M_0827 ; und Zeichen drucken ld R9 ,#5Ah ldci @R9 ,@RR14 ; nächstes holen tm R10 ,#80h ; Bit 7 gesetzt? jr Z ,PrtTxt2 ; nein, weitermachen ld R10 ,#20h ; Leerzeichen pop RP assume RP:010h jp M_0872 ; ausgeben und fertig ;----------------------------------------------------------------------------- ; statische Tastenabfrage. %6D: T-Bit, %5A: ASCII ; An der Cursorposition wird abwechselnd ein weisses Feld und das dort ; vorhandene Zeichen ausgegeben, solange bis TAS einen Tastendruck erkennt ;----------------------------------------------------------------------------- TSK: cp 54h ,#119 jr NZ ,TSK ; warte bis zum unteren Bildrand push RP assume RP:060h srp #60h ld R2 ,#5 ; 5 Bildschirmzeilen call M_0B69 ; Cursorposition im Bildschirmspeicher TSK_2: ld R6 ,#0 call M_0BBB ; Strich ausgeben djnz R2 ,TSK_2 ; bis Cursorblock komplett ld R0 ,#0FDh ld R1 ,5Bh lde R2 ,@RR0 ; Zeichen an Cursorposition holen ld 5Ah ,R2 pop RP assume RP:010h TSK_1: cp 54h ,#119 jr NZ ,TSK_1 ; warte bis zum unteren Bildrand call M_0B95 ; und ausgeben call TAS ; dynamische Tastenabfrage aufrufen tm 6Dh ,#7Fh ; Taste gedrückt, T-Bit gesetzt? jr Z ,TSK ; nein --> nochmal das Ganze! ld 5Ah ,6Dh ; Zeichen von TAS übernehmen and 6Dh ,#080h ; ASCII löschen and 5Ah ,#07Fh ; T-Bit ausmaskieren ret ;----------------------------------------------------------------------------- ; dynamische Tastenabfrage ; ; liefert den letzten erkannten ASCII-Code in %6D. Wenn eine Taste gedrückt ; war, ist zusätzlich bit 7 (T-Bit) gesetzt. ; ; (ASCII-Code %15) toggelt das Shift-Flag in %FFFF. Wenn das Shift- ; Flag =0 ist, wird bei dem gelesenen ASCII-Code bit 4 invertiert. Das macht ; nicht immer Sinn, erzeugt aber aus ; ; 0123456789:;<=>? ; !"#$%&'()*+,-./ ; ; und umgekehrt. %0A (Cursor hoch) wird zu %1A (Cursor runter), %0B (Cursor ; links) zu %1B (Cursor rechts). ;----------------------------------------------------------------------------- TAS: push RP srp #60h ; wir nutzen Register %60 - %62, %6D assume RP:060h ld R0 ,#7Fh ; Tastaturspalten auf %7F00 - %7F0F ld R1 ,#0Fh TAS_Loop: ldc R2 ,@RR0 ; Spalte lesen and R2 ,#0F0h ; ungenutzte Zeilen ausblenden jr NZ ,TAS_KeyPressd ; nicht Null --> Taste gedrückt ! djnz R1 ,TAS_Loop ; weiter mit nächster Spalte and R13 ,R0 ; T-Bit (bit 7) löschen TAS_Done: pop RP ret assume RP:010h TAS_KeyPressd: or R13 ,R13 ; %6D nicht leer? jr NZ ,TAS_Done ; --> Abbruch! ld R13 ,#080h ; T-Bit setzen ld R3 ,#040h ; Offset für (letzte Zeile +1) TAS_KeyPr1: sub R3 ,#10h ; eine davor rl R2 ; Bit im Spaltenwort prüfen jr NC ,TAS_KeyPr1 ; nein, diese Zeile war's nicht or R1 ,R3 ; Zeilenoffset zur Spaltennummer in R1 hinzu ld R0 ,#0Fh ; die Tabelle geht von %0F00 - %0F3F ldc R3 ,@RR0 ; ASCII holen ld R0 ,#0FFh ld R1 ,#0FFh lde R2 ,@RR0 ; RAM-Adresse %FFFF (Shift-Flag) holen cp R3 ,#15h ; ASCII-Code %15 (Shift gedrückt)? jr Z ,TAS_KeyPr2 ; --> Shift-Flag setzen or R2 ,R2 ; Shift-Flag testen jr NZ ,TAS_KeyPr3 ; nicht null --> kein Shift xor R3 ,#10h ; ASCII-Code um 16 erhöhen bzw erniedrigen cp R3 ,#1Dh ; Shift-Enter (OFF)? jr NZ ,TAS_KeyPr3 ; nein --> ld R3 ,#7Fh ; sonst %7F zurückliefern TAS_KeyPr3: or R13 ,R3 ; ASCII in %6D einbauen ld R2 ,#0 ; letzte Taste war kein Shift TAS_KeyPr2: com R2 ; Shift-Flag toggeln lde @RR0 ,R2 ; und zurückschreiben jr TAS_Done M_CA4: ld R2 ,R0 ; Zeiger auf aktuelle BASIC-Zeile ld R3 ,R1 ;----------------------------------------------------------------------------- ; Nullbyte, d.h. Programmende suchen ;----------------------------------------------------------------------------- M_CA8: lde R7 ,@RR2 ; Zeichen holen incw RR2 or R7 ,R7 ; Null, d.h. Programmende? jr NZ ,M_CA8 ; nein --> nächstes Zeichen prüfen M_CB0: lde @RR2 ,R7 ; Byte hinter Programmende auf Null setzen decw RR2 ; Zeiger zurück auf altes Programmende cp R3 ,R1 jr Z ,M_CC0 M_CB8: decw RR2 lde R7 ,@RR2 incw RR2 jr M_CB0 M_CC0: cp R0 ,R2 jr C ,M_CB8 lde @RR0 ,R6 incw RR0 ret M_CC9: call M_CA4 jr Z ,M_CD6 M_CCE: call M_0824 ; statische Tastaturabfrage mit Ausführung auf Bildschirm ld R6 ,5Ah M_CD3: cp R6 ,#60h M_CD6: ret call M_CC9 jr Z ,M_CD6 M_CDC: cp R6 ,#20h jr NZ ,M_CD3 call M_CCE jr M_CDC incw RR0 lde R6 ,@RR0 ld 5Ah ,R6 call M_0827 ; Ausgabe des in %5A übergebenen ASCII auf dem Bildschirm mit %5B als Pointer or R6 ,R6 jr NZ ,M_CD3 ret M_CF4: call M_D32 jr NC ,M_D6A call M_D09 jr NZ ,M_D56 call @6Eh jr NC ,M_D6A call M_D09 jr Z ,M_D32 jr M_D36 M_D09: cp R6 ,#3Ch jr Z ,M_D6A cp R6 ,#3Dh jr Z ,M_D6A cp R6 ,#3Eh ret M_D17: cp 6Fh ,#0E6h jr Z ,M_D1F ld 6Fh ,#0C9h M_D1F: call @6Eh jr NC ,M_D6A cp R6 ,#22h jr NZ ,M_D1F cp 6Fh ,#-1Ah jr Z ,M_D30 ld 6Fh ,#-29h M_D30: jp @6Eh M_D32: call @6Eh jr NC ,M_D6A M_D36: call M_D58 jr NC ,M_D6A ld R10 ,#3 ld R11 ,#0C1h ld R13 ,#3 call B_03AF ; U883BAS: M_3AF jr Z ,M_D32 cp R6 ,#24h jr NZ ,M_D69 call @6Eh jr NC ,M_D6A ld R13 ,#3 call B_03AF ; U883BAS: M_3AF jr Z ,M_D32 M_D56: rcf ret M_D58: cp R6 ,#28h jr NZ ,M_D6B call M_D32 jr NC ,M_D6A cp R6 ,#29h jr NZ ,M_D56 jp @6Eh M_D69: scf M_D6A: ret M_D6B: call B_03D9 ; U883BAS: Test auf Buchstabe 'A'..'Z' jr NC ,M_D8E call @6Eh jr NC ,M_D6A call B_03E2 ; U883BAS: Test auf Buchstabe oder Ziffer jr NC ,M_D69 M_D79: call @6Eh jr NC ,M_D6A cp R6 ,#3Bh jr Z ,M_D69 cp R6 ,#0Dh jr Z ,M_D69 cp R6 ,#5Dh jr NZ ,M_D79 jp @6Eh M_D8E: ld R4 ,#5 call B_03E7 ; U883BAS: Test auf Ziffer '0'..'9' jr C ,M_DAD cp R6 ,#2Dh jr Z ,M_DAC cp R6 ,#25h jr NZ ,M_D56 M_D9F: call @6Eh jr NC ,M_D6A call B_03F2 ; U883BAS: Test auf Hexziffer '0'..'F' jr NC ,M_DB8 djnz R4 ,M_D9F rcf ret M_DAC: inc R4 M_DAD: call @6Eh jr NC ,M_D6A call B_03E7 ; U883BAS: Test auf Ziffer '0'..'9' jr NC ,M_DB8 djnz R4 ,M_DAD M_DB8: ccf ret M_DBA: db 00002h ; db 00027h ; ' db 0000Dh ; db 00037h ; 7 db 00023h ; # db 00023h ; # db 0000Dh ; db 0000Dh ; db 00027h ; ' db 0000Dh ; db 00023h ; # db 00023h ; # db 0003Ah ; db 00023h ; # db 00060h ; db 00060h ; db 00050h ; P db 000FFh ; ;----------------------------------------------------------------------------- ; BASIC-Editor ; Anzeige einer BASIC-Zeile ohne Zeilennummer ab Adresse aus %10-11, ; die Adresse wird aktualisiert ;----------------------------------------------------------------------------- PrtList: ld 5Ah ,#'A' call M_0B95 clr 58h call @6Eh jr NC ,M_DEB ld R2 ,#HI(B_07C8) ; ld R2, #007h M_07C8 im U883 ld R3 ,#LO(B_07C8) ; ld R3, #0C8h M_DDC: ld R13 ,#17h ldci @R13 ,@RR2 inc 58h cp R6 ,R7 jr Z ,M_DEC cp 58h ,#12h jr C ,M_DDC M_DEB: ret M_DEC: ld R3 ,58h add R3 ,#0B9h ld 5Ch ,#-1 call M_0878 ; Cursor eins zurück call PrtText ; Textausgabe. %58: Text-Nr. ld R2 ,#0Dh ld R4 ,#0Eh ldc R5 ,@RR2 jp @RR4 M_E02: call @6Eh call B_03D9 ; U883BAS: Test auf Buchstabe 'A'..'Z' jr NC ,M_DEB call @6Eh ld R6 ,#3Dh M_E0D: call M_D32 jr NC ,M_DEB cp R6 ,#2Ch jr Z ,M_E02 M_E17: cp R6 ,#3Bh jr Z ,PrtList cp R6 ,#0Dh jr Z ,M_E35 M_E21: rcf ret M_E23: call @6Eh jr M_E17 M_E27: call @6Eh jr NC ,M_DEB cp R6 ,#3Bh jr Z ,PrtList cp R6 ,#0Dh jr NZ ,M_E27 M_E35: scf ret M_E37: ld R5 ,#0 db 0Dh ; jp never M_E3A: ld R5 ,#1 call M_CF4 jr NC, M_DEB or R5 ,R5 jr NZ ,M_E0D ld R6 ,#3Bh ld 58h ,#13h call PrtText M_E4D: jp PrtList call @6Eh cp R6 ,#22h jr NZ ,M_E5A call M_D17 M_E5A: call 3D9h ; U883BAS: Test auf Buchstabe 'A'..'Z' jr C ,M_E23 ret M_E60: call @6Eh cp R6 ,#22h jr NZ ,M_E6A call M_D17 M_E6A: cp R6 ,#3Bh jr Z ,M_E4D cp R6 ,#0Dh jr Z ,M_E35 call M_D36 jr NC ,M_E21 cp R6 ,#2Ch jr NZ ,M_E17 jr M_E60 ;----------------------------------------------------------------------------- ; Ausgabe "ERROR xx" ;----------------------------------------------------------------------------- PrtError: call M_0AD4 ; neue Zeile ld 58h ,#12h ; Text ERROR call PrtText ; Textausgabe. %58: Text-Nr. clr R2 ld R3 ,0Eh ; Fehlercode and R3 ,#0F0h ; obere vier Byte swap R3 ; als Zahl ausgeben ;----------------------------------------------------------------------------- ; BASIC-Editor ; Dezimalanzeige aus %12-13 ohne führende Nullen mit Zeilenschaltung (RP=%10 !) ;----------------------------------------------------------------------------- PrtDezNr: call M_0AA3 ; Zahlenwert drucken jp M_0AD4 ; und neue Zeile anfangen ;----------------------------------------------------------------------------- ; Texttabelle für Textausgabe PrtText ;----------------------------------------------------------------------------- TextTab: db 'L' + 00080h ,"ET" ; #01h db 'P' + 00080h ,"ROC" ; #02h db 'G' + 00080h ,"OTO" ; #03h db 'I' + 00080h ,"F" ; #04h db 'E' + 00080h ,"LSE" ; #05h db 'R' + 00080h ,"ETURN" ; #06h db 'G' + 00080h ,"OSUB" ; #07h db 'W' + 00080h ,"AIT" ; #08h db 'R' + 00080h ,"EM" ; #09h db 'C' + 00080h ,"ALL" ; #0Ah db 'S' + 00080h ,"TOP" ; #0Bh db 'E' + 00080h ,"ND" ; #0Ch db 'T' + 00080h ,"RAP" ; #0Dh db 'T' + 00080h ,"OFF" ; #0Eh db 'P' + 00080h ,"RINT" ; #0Fh db 'P' + 00080h ,"TH" ; #10h db 'I' + 00080h ,"NPUT" ; #11h db 'E' + 00080h ,"RROR" ; #12h db 0000Bh + 00080h ,"THEN" ; #13h db 'C' + 00080h ,"OMP JU+TE R " db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0005Ch db 0000Ah ; #14h db 000FFh ; Listenende ;----------------------------------------------------------------------------- ; Tastaturmatrix 16x4. Spalte 0 darf nicht belegt werden! ;----------------------------------------------------------------------------- keytab: if KEYTYP == "JU+TE" ; Original-Belegung db0 ,20h, 'Y', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 0Dh, 1Bh, 0, 0 db0 ,15h, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '*', '-', 0Ah, 0, 0 db0 ,0Bh, 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', '+', 0Bh, 0, 0 db0 ,0Ah, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 08h, 1Ah, 0, 0 elseif KEYTYP == "VPOHLERS" ; Pollin-Tastatur V.Pohlers db0 ,0Dh, 'Y', 'X', 'C', 'V', 'M', ',', 0, 20h, 0Ah, 0Bh, '.', 'B', 'N', 1Bh db0 ,'L', 'A', 'S', 'D', 'F', 'J', 'K', 0, 0, 8, 1Ah, '-', 'G', 'H', 0 db0 ,'O', 'Q', 'W', 'E', 'R', 'U', 'I', 0, 15h, 8, 0, 'P', 'T', 'Z', '+' db0 ,'9', '1', '2', '3', '4', '7', '8', 0, 0, '/', 0, '*', '5', '6', '0' elseif KEYTYP == "KEYB" ; Tastatur am Propeller endif ;----------------------------------------------------------------------------- ; Zeichensatz 64 Zeichen je 4x6 Pixel, invers+normal ;----------------------------------------------------------------------------- charset: ; Zeichengenerator, 2k-System, 4x6 Pixel, ; ; Zeichen werden invertiert ausgegeben, ; ; 1 --> dunkel; ; 0 --> hell ; ; -+--------------------------------------------------------------------------------- ; ; | 0 1 2 3 4 5 6 7 8 9 A B C D E F ; ; -+--------------------------------------------------------------------------------- ; ; | .... ..#. .#.# #.#. #..# #..# #..# ..#. ..#. .#.. #..# .... .... .... .... ...# ; ; | .... ..#. .#.# #### .##. ..#. ..#. ..#. .#.. ..#. .##. ..#. .... .... .... ..#. ; ; 2| .... ..#. .... #.#. #..# .#.. .#.. .... .#.. ..#. #### .### .... #### .... .#.. ; ; | .... .... .... #### .##. #... #... .... .#.. ..#. .##. ..#. ..#. .... .... #... ; ; | .... ..#. .... #.#. #..# #..# .#.# .... ..#. .#.. #..# .... .#.. .... .#.. #... ; ; | .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ; ; -+--------------------------------------------------------------------------------- ; ; | .##. ..#. ###. ###. #... #### .##. #### .##. .##. .... .... ..#. .... .#.. .##. ; ; | #.## .##. ...# ...# #.#. #... #... ...# #..# #..# .#.. ..#. .#.. #### ..#. #..# ; ; 3| #..# ..#. .##. .##. #### ###. ###. ..#. .##. .### .... .... #... .... ...# ..#. ; ; | ##.# ..#. #... ...# ..#. ...# #..# .#.. #..# ...# .#.. ..#. .#.. #### ..#. .... ; ; | .##. .### #### ###. ..#. ### .##. .#.. .##. .##. .... .#.. ..#. .... .#.. ..#. ; ; | .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ; ; -+--------------------------------------------------------------------------------- ; ; | .### .##. ###. .### ###. #### #### .### #..# .### #### #..# #... #..# #..# .##. ; ; | #..# #..# #..# #... #..# #... #... #... #..# ..#. ...# #.#. #... #### ##.# #..# ; ; 4| #.## #..# ###. #... #..# ###. ###. #.## #### ..#. ...# ##.. #... #### #.## #..# ; ; | #... #### #..# #... #..# #... #... #..# #..# ..#. #..# #.#. #... #..# #..# #..# ; ; | .### #..# ###. .### ###. #### #... .### #..# .### .##. #..# #### #..# #..# .##. ; ; | .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ; ; -+--------------------------------------------------------------------------------- ; ; | ###. .##. ###. .### .### #..# .#.# #..# #..# .#.# #### .##. .... .##. #... .... ; ; | #..# #..# #..# #... ..#. #..# .#.# #..# #..# .#.# ..#. .#.. #### ..#. .#.. .... ; ; 5| ###. #..# ###. .##. ..#. #..# .#.# #### .##. ..#. .#.. .#.. #..# ..#. ..#. .... ; ; | #... #.## #.#. ...# ..#. #..# .#.# #### #..# ..#. #... .#.. #..# ..#. ...# .... ; ; | #... .### #..# ###. ..#. .##. ..#. .##. #..# ..#. #### .##. #### .##. ...# #### ; ; | .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... .... ; ; -+--------------------------------------------------------------------------------- ; if MONTYP == "2K_NEU" ; Original ; 20h, space ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1111 #### .... ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0FFh,0FFh,0FFh ; 21h, ! ; 1.byte, oberes nibble 1101 ##.# ..#. ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 0DDh,0DFh,0DFh ; 22h, " ; 1.byte, oberes nibble 1010 #.#. .#.# ; 1.byte, unteres nibble 1010 #.#. .#.# ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0AAh,0FFh,0FFh ; 23h, # ; 1.byte, oberes nibble 0101 .#.# #.#. ; 1.byte, unteres nibble 0000 .... #### ; 2.byte, oberes nibble 0101 .#.# #.#. ; 2.byte, unteres nibble 0000 .... #### ; 3.byte, oberes nibble 0101 .#.# #.#. ; 3.byte, unteres nibble 1111 #### .... DB 050h,050h,05Fh ; 24h, $, Währungszeichen, ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 1001 #..# .##. ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 1001 #..# .##. ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 069h,069h,06Fh ; 25h, % ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1011 #.## .#.. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 06Dh,0B7h,06Fh ; 26h, & ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1011 #.## .#.. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 1010 #.#. .#.# ; 3.byte, unteres nibble 1111 #### .... DB 06Dh,0B7h,0AFh ; 27h, ' ; 1.byte, oberes nibble 1101 ##.# ..#. ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0DDh,0FFh,0FFh ; 28h, ( ; 1.byte, oberes nibble 1101 ##.# ..#. ; 1.byte, unteres nibble 1011 #.## .#.. ; 2.byte, oberes nibble 1011 #.## .#.. ; 2.byte, unteres nibble 1011 #.## .#.. ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 0DBh,0BBh,0DFh ; 29h, ) ; 1.byte, oberes nibble 1011 #.## .#.. ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1011 #.## .#.. ; 3.byte, unteres nibble 1111 #### .... DB 0BDh,0DDh,0BFh ; 2Ah, * ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 1001 #..# .##. ; 2.byte, oberes nibble 0000 .... #### ; 2.byte, unteres nibble 1001 #..# .##. ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 069h,009h,06Fh ; 2Bh, + ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1000 #... .### ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0FDh,08Dh,0FFh ; Korrektur VP 8D statt 8F ; 2Ch, , ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1111 #### .... ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1011 #.## .#.. ; 3.byte, unteres nibble 1111 #### .... DB 0FFh,0FDh,0BFh ; 2Dh, - ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1111 #### .... ; 2.byte, oberes nibble 0000 .... #### ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0FFh,00Fh,0FFh ; 2Eh, . ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1111 #### .... ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1111 #.## .#.. ; 3.byte, unteres nibble 1111 #### .... DB 0FFh,0FFh,0BFh ; 2Fh, / ; 1.byte, oberes nibble 1110 ###. ...# ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1011 #.## .#.. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0111 .### #... ; 3.byte, unteres nibble 1111 #### .... DB 0EDh,0B7h,07Fh ; 30h, 0 ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0100 .#.. #.## ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0010 ..#. ##.# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 094h,062h,09Fh ; 31h, 1 ; 1.byte, oberes nibble 1101 ##.# ..#. ; 1.byte, unteres nibble 1001 #..# .##. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1000 #... .### ; 3.byte, unteres nibble 1111 #### .... DB 0D9h,0DDh,08Fh ; 32h, 2 ; 1.byte, oberes nibble 0001 ...# ###. ; 1.byte, unteres nibble 1110 ###. ...# ; 2.byte, oberes nibble 1001 #..# .##. ; 2.byte, unteres nibble 0111 .### #.. ; 3.byte, oberes nibble 0000 .... #### ; 3.byte, unteres nibble 1111 #### .... DB 01Eh,097h,00Fh ; 33h, 3 ; 1.byte, oberes nibble 0001 ...# ###. ; 1.byte, unteres nibble 1110 ###. ...# ; 2.byte, oberes nibble 1001 #..# .##. ; 2.byte, unteres nibble 1110 ###. ...# ; 3.byte, oberes nibble 0001 ...# ###. ; 3.byte, unteres nibble 1111 #### .... DB 01Eh,09Eh,01Fh ; 34h, 4 ; 1.byte, oberes nibble 0111 .### #... ; 1.byte, unteres nibble 0101 .#.# #.#. ; 2.byte, oberes nibble 0000 .... #### ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 075h,00Dh,0DFh ; 35h, 5 ; 1.byte, oberes nibble 0000 .... #### ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 1110 ###. ...# ; 3.byte, oberes nibble 0001 ...# ###. ; 3.byte, unteres nibble 1111 #### .... DB 007h,01Eh,01Fh ; 36h, 6 ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 097h,016h,09Fh ; 37h, 7 ; 1.byte, oberes nibble 0000 .... #### ; 1.byte, unteres nibble 1110 ###. ...# ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1011 #.## .#.. ; 3.byte, oberes nibble 1011 #.## .#.. ; 3.byte, unteres nibble 1111 #### .... DB 00Eh,0DBh,0BFh ; 38h, 8 ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 1001 #..# .##. ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 096h,096h,09Fh ; 39h, 9 ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 1000 #... .### ; 2.byte, unteres nibble 1110 ###. ...# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 096h,08Eh,09Fh ; 3Ah, : ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1011 #.## .#.. ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1011 #.## .#.. ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0FBh,0FBh,0FFh ; 3Bh, ; ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1011 #.## .#.. ; 3.byte, unteres nibble 1111 #### .... DB 0FDh,0FDh,0BFh ; 3Ch, < ; 1.byte, oberes nibble 1101 ##.# ..#. ; 1.byte, unteres nibble 1011 #.## .#.. ; 2.byte, oberes nibble 0111 .### #... ; 2.byte, unteres nibble 1011 #.## .#.. ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 0DBh,07Bh,0DFh ; 3Dh, = ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 0000 .... #### ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 0000 .... #### ; 3.byte, oberes nibble 1111 #### .... ; 3.byte, unteres nibble 1111 #### .... DB 0F0h,0F0h,0FFh ; 3Eh, > ; 1.byte, oberes nibble 1011 #.## .#.. ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1110 ###. ...# ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1011 #.## .#.. ; 3.byte, unteres nibble 1111 #### .... DB 0BDh,0EDh,0BFh ; 3Fh, ? ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 096h,0DFh,0DFh ; 40h, @ ; 1.byte, oberes nibble 1000 #... .### ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0100 .#.. #.## ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 1000 #... .### ; 3.byte, unteres nibble 1111 #### .... DB 086h,047h,08Fh ; 41h, A ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0000 .... #### ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 096h,060h,06Fh ; 42h, B ; 1.byte, oberes nibble 0001 ...# ###. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0001 ...# ###. ; 3.byte, unteres nibble 1111 #### .... DB 016h,016h,01Fh ; 43h, C ; 1.byte, oberes nibble 1000 #... .### ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0111 .### #... ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 1000 #... .### ; 3.byte, unteres nibble 1111 #### .... DB 087h,077h,08Fh ; 44h, D ; 1.byte, oberes nibble 0001 ...# ###. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0001 ...# ###. ; 3.byte, unteres nibble 1111 #### .... DB 016h,066h,01Fh ; 45h, E ; 1.byte, oberes nibble 0000 .... #### ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0000 .... #### ; 3.byte, unteres nibble 1111 #### .... DB 007h,017h,00Fh ; 46h, F ; 1.byte, oberes nibble 0000 .... #### ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0111 .### #... ; 3.byte, unteres nibble 1111 #### .... DB 007h,017h,07Fh ; 47h, G ; 1.byte, oberes nibble 1000 #... .### ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0100 .#.. #.## ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 1000 #... .### ; 3.byte, unteres nibble 1111 #### .... DB 087h,046h,08Fh ; 48h, H ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0000 .... #### ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 066h,006h,06Fh ; 49h, I ; 1.byte, oberes nibble 1000 #... .### ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1000 #... .### ; 3.byte, unteres nibble 1111 #### .... DB 08Dh,0DDh,08Fh ; 4Ah, J ; 1.byte, oberes nibble 0000 .... #### ; 1.byte, unteres nibble 1110 ###. ...# ; 2.byte, oberes nibble 1110 ###. ...# ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 00Eh,0E6h,09Fh ; 4Bh, K ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0101 .#.# #.#. ; 2.byte, oberes nibble 0011 ..## ##.. ; 2.byte, unteres nibble 0101 .#.# #.#. ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 065h,035h,06Fh ; 4Ch, L ; 1.byte, oberes nibble 0111 .### #... ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 0111 .### #... ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0000 .... #### ; 3.byte, unteres nibble 1111 #### .... DB 077h,077h,00Fh ; 4Dh, M ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0000 .... #### ; 2.byte, oberes nibble 0000 .... #### ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 060h,006h,06Fh ; 4Eh, N ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0010 ..#. ##.# ; 2.byte, oberes nibble 0100 .#.. #.## ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 062h,046h,06Fh ; 4Fh, O ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 096h,066h,09Fh ; 50h, P ; 1.byte, oberes nibble 0001 ...# ###. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0111 .### #... ; 3.byte, unteres nibble 1111 #### .... DB 016h,017h,07Fh ; 51h, Q ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0100 .#.. #.## ; 3.byte, oberes nibble 1000 #... .### ; 3.byte, unteres nibble 1111 #### .... DB 096h,064h,08Fh ; 52h, R ; 1.byte, oberes nibble 0001 ...# ###. ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0001 ...# ###. ; 2.byte, unteres nibble 0101 .#.# #.#. ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 016h,015h,06Fh ; 53h, S ; 1.byte, oberes nibble 1000 #... .### ; 1.byte, unteres nibble 0111 .### #... ; 2.byte, oberes nibble 1001 #..# .##. ; 2.byte, unteres nibble 1110 ###. ...# ; 3.byte, oberes nibble 0001 ...# ###. ; 3.byte, unteres nibble 1111 #### .... DB 087h,09Eh,01Fh ; 54h, T ; 1.byte, oberes nibble 1000 #... .### ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 08Dh,0DDh,0DFh ; 55h, U ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 066h,066h,09Fh ; 56h, V ; 1.byte, oberes nibble 1010 #.#. .#.# ; 1.byte, unteres nibble 1010 #.#. .#.# ; 2.byte, oberes nibble 1010 #.#. .#.# ; 2.byte, unteres nibble 1010 #.#. .#.# ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 0AAh,0AAh,0DFh ; 57h, W ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 0000 .... #### ; 2.byte, unteres nibble 0000 .... #### ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 066h,000h,09Fh ; 58h, X ; 1.byte, oberes nibble 0110 .##. #..# ; 1.byte, unteres nibble 0110 .##. #..# ; 2.byte, oberes nibble 1001 #..# .##. ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0110 .##. #..# ; 3.byte, unteres nibble 1111 #### .... DB 066h,096h,06Fh ; 59h, Y ; 1.byte, oberes nibble 1010 #.#. .#.# ; 1.byte, unteres nibble 1010 #.#. .#.# ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1101 ##.# ..#. ; 3.byte, unteres nibble 1111 #### .... DB 0AAh,0DDh,0DFh ; 5Ah, Z ; 1.byte, oberes nibble 0000 .... #### ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1011 #.## .#.. ; 2.byte, unteres nibble 0111 .### #... ; 3.byte, oberes nibble 0000 .... #### ; 3.byte, unteres nibble 1111 #### .... DB 00Dh,0B7h,00Fh ; 5Bh, [ ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 1011 #.## .#.. ; 2.byte, oberes nibble 1011 #.## .#.. ; 2.byte, unteres nibble 1011 #.## .#.. ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 09Bh,0BBh,09Fh ; 5Ch, viereck ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 0000 .... #### ; 2.byte, oberes nibble 0110 .##. #..# ; 2.byte, unteres nibble 0110 .##. #..# ; 3.byte, oberes nibble 0000 .... #### ; 3.byte, unteres nibble 1111 #### .... DB 0F0h,066h,00Fh ; 5Dh, ] ; 1.byte, oberes nibble 1001 #..# .##. ; 1.byte, unteres nibble 1101 ##.# ..#. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1101 ##.# ..#. ; 3.byte, oberes nibble 1001 #..# .##. ; 3.byte, unteres nibble 1111 #### .... DB 09Dh,0DDh,09Fh ; 5Eh, \ ; 1.byte, oberes nibble 0111 .### #... ; 1.byte, unteres nibble 1011 #.## .#.. ; 2.byte, oberes nibble 1101 ##.# ..#. ; 2.byte, unteres nibble 1110 ###. ...# ; 3.byte, oberes nibble 1110 ###. ...# ; 3.byte, unteres nibble 1111 #### .... DB 07Bh,0DEh,0EFh ; 5Fh, _ ; 1.byte, oberes nibble 1111 #### .... ; 1.byte, unteres nibble 1111 #### .... ; 2.byte, oberes nibble 1111 #### .... ; 2.byte, unteres nibble 1111 #### .... ; 3.byte, oberes nibble 0000 .... #### ; 3.byte, unteres nibble 1111 #### .... DB 0FFh,0FFh,00Fh endif ; ;===================================================================================== ; dephase if $>ROMsize error "\aROM size exceeded !!!" elseif db ROMsize-$ dup(0FFh) ; pad with $FF's endif end %0824 Tastenabfrage statisch mit Ausführung auf Bildschirm, Kursor (%5B) wird aktualisiert, %5A := ASCII %0827 Darstellen eines ASCII aus %5A auf dem Bildschirm, Kursor (%5B) wird aktualisiert %0872 Darstellen eines ASCII aus %5A auf dem Bildschirm, Kursor (%5B) wird aktualisiert. Steuerzeichen werden nicht erkannt %0875 Erhöhen des Kursors (%5B) um 1 mit ggf. Bildrollen %0878 Erhöhen des Kursors (%5B) um den Inhalt von %5C mit ggf. Bildrollen %08DD Bild löschen, Kursor (%5B) := 0 %0AA3 Dezimalausgabe aus %12 und %13 ohne führende Nullen RP = #%10 %0ACE Zeilenschaltung %0AD4 Zeilenschaltung mit Freizeilensperre %0B95 Darstellen eines ASCII aus %5A auf dem Bildschirm, Kursor bleibt unverändert, Steuerzeichen werden nicht erkannt %0C1D Tastenabfrage statisch ohne Ausführung auf dem Bildschirm %5A:= ASCII %0C56 Tastenabfrage dynamisch mittels Tastencoderegister (%6D): T-Bit und ASCII %0DCC Anzeige einer BASIC-Zeile ohne Zeilennummer ab Adresse aus %10 und %11, die Adresse wird aktualisiert RP = #%10 %6E = #%0C %6F = #%E6 %0E92 Dezimalanzeige aus %12 und %13 ohne führende Nullen mit Zeilenschaltung RP = #%10 %20B6 Hexadezimalanzeige eines Bytes aus %5D, Kursor (%5B) wird aktualisiert %20CF Hexadezimalanzeige der Speicherzelle mit der Adresse aus %5E und %5F, Adresse wird um 1 erhöht, der Kursor (%5B) wird aktualisiert %20DB Hexadezimalanzeige eines Doppelbytes aus %5E und %5F, Kursor (%5B) wird aktualisiert %20E6 Berechnen der Byteanzahl in %6B eines Befehls mit dem Operationscode aus %5D %22E5 Hexadezimaleingabe eines Bytes in %6C mit Tastatur und Anzeige RP = #%60 %231F Hexadezimaleingabe eines Doppelbytes in %6E und %6F mit Tastatur und Anzeige RP = #%60 %2352 RAM- und Registeranzeige %23E6 Programm-Modus %260E Anzeige einer Maschinenprogrammzeile mit der Adresse aus %5E und %5F, Adresse und Kursor (%5B) werden aktualisiert, RP := #%60 %268F Magnetbandausgabe RP = #%60 %27D1 Magnetbandeingabe RP = #%60 end