;MEGA-ROM-Software von Volker Pohlers ;mit Anpassungen an die Gegebenheiten des 64K-SRAM-Moduls mit 1MB-ROM-Bank: ;- Modulmeldung: "64K-SRAM-Modul" ;- Prompt = gelbes "XOS" ;- Pruefen auf RTC (bestueckt bzw. eingeschaltet) ; wenn ja, einmalige Ausgabe von Uhrzeit und Datum in Farbe gelb und Setzen ; der Systemuhr, aber nur, wenn der Kursor in Zeile 5 steht (beim Kaltstart) ;- Verzoegerung der Programmsuche in den Baenken (Schaueffekt) ############# ;- Suchzelle im BWS fuer Module ohne Bankanzeige ; PN SRAM64 ; MODIS: EQU 74H ;schaltet den Modul-EPROM aus (neu) BKPRT: EQU 75H ;Port zum Setzen der ROM-Bank (neu) RAM0: EQU 76H ;normalen RAM einschalten (RAM-Bank 0) (neu) RAM1: EQU 77H ;RAM-Bank 1 einschalten (neu) SWPRT: EQU 78H ;Port zum Weiterschalten (neu) SYSBK: EQU 00H ;Systembank LSTBK: EQU 7FH ;letzte zu durchsuchende Bank, EPROM-Groesse! BKANF: EQU 0000H ;Bankanfang (FC00H zu schnell) BKEND: EQU 0E8H ;Bankende CURBK: EQU 0042H ;Speicherzelle fuer aktuelle Bank FIRST: EQU CURBK+1 ;temporaere Zelle fuer MENU BKSWC: EQU 004EH ;Bank-Switch-Code 004EH-0059H (50H?) TMPCO: EQU 0110H ;temporaerer Programmcode 0110H-01CFH SHROF: EQU 04H ;Schatten-RAM aus (4000H-7FFFH) SHRON: EQU 05H ;Schatten-RAM ein HIROF: EQU 06H ;RAM ab C000H aus (oberer RAM) HIRON: EQU 07H ;RAM ab C000H ein KRT: EQU 0B8H ;Grafik-Port SEC: EQU 001FH ;Speicherzelle Sekunden (neu) MZBWS: EQU 0EC27H ;Merkzelle im BWS (Suchzelle) (neu) ; ;Systemrufe: ; CBOS: EQU 0005H ;zentraler BOS-Aufruf WBOOT: EQU 0F003H ;auch 0F6AEH CSTS: EQU 0F006H ;Status CONST CONSI: EQU 0F009H ;Zeicheneingabe von CONST CONSO: EQU 0F00CH ;Zeichenausgabe von CONST LISTO: EQU 0F00FH ;Ausgabe auf LIST-Geraet IOBYT: EQU 0004H CONBU: EQU 0080H ;CCP-Zeichenkettenpuffer STDMA: EQU 0080H ;Kassettenpuffer INTLN: EQU 0100H ;interner Zeichenkettenpuffer DMA: EQU 001BH PU: EQU 002FH WORKA: EQU 0033H PARBU: EQU 0040H FCB: EQU 005CH STADR: EQU 0071H ;Startadresse des gelesenen Programms OCRLF: EQU 0F2FEH OUTA: EQU 0F305H OSPAC: EQU 0F310H PRNST: EQU 0F3E2H DISPE: EQU 0F0C0H GVAL: EQU 0F1EAH LOCK: EQU 0F2B8H GETMS: EQU 0F35CH LOAD1: EQU 0F526H COEXT: EQU 0F5B9H ERPAR: EQU 0F5E6H ERDIS: EQU 0F5EAH ERINP: EQU 0F5E2H REA1: EQU 0F5A6H ; ;-------------------------------- ORG C000H ; START: JMP CCP ;Start der ROM-Banksteuerung DB '# ' DA 00 XOS: DB 0BH ;Aussehen des Prompts: DB 14H ;"XOS" in der Farbe gelb DB 03H DB 'XOS' DB 14H DB 02H DB 0AH DB 0DH DB 00H MOD: DB 0BH DB 14H DB 07H DB '64K-SRAM-MODUL' DB ' ' DB 14H DB 02H DB 0AH DB 0AH DB 0DH DB 00H ;-------------------------------- ;Warmbootroutine ;Bankrueckschaltcode, wenn ein Programm beendet wird ; FWBOT: LD HL,WBOOT ;OS-Routine PUSH HL ;Ruecksprung in den Kellerspeicher STBK0: LD A,SYSBK ;Systembank = 0 OUT SHROF ;Schatten-RAM ausschalten, (A) wird nicht ausgewertet OUT HIROF ;Oberen RAM ausschalten, (A) wird nicht ausgewertet STBK1: OUT BKPRT ;Systembank einschalten, (A) wird ausgewertet STBKE: RET ;WBOOT starten ; ;-------------------------------- ;Zeichenkettenvergleich ;DE,HL - Zeichenkettenadressen im Speicher ;BC - Laenge der Zeichenkette ;Rueckgabe in BC, C=0 --> Zeichenketten sind gleich ; STRVG: LD A,(DE) INC DE CPI ;A=(DE) mit (HL) vergleichen JPPO STRVE ;=0, wenn BC=0 JRZ STRVG-# ;falls gleich, dann naechstes Zeichen STRVE: RET ; ;-------------------------------- ;Programmbeginn ; CCP: LD SP,0200H ;Kellerspeicher im RAM festlegen LD HL,FWBOT ;wichtig bei weggeschalteter Systembank LD DE,BKSWC ;Zieladresse im Speicher (004EH) LD BC,STRVG-FWBOT LDIR LD HL,BKSWC ;LD HL,FWBOT: Adresse WBOOT fuer CALL 0 ----------> BKSWC LD (0001H),HL LD A,SYSBK ;Systembank = 0 OUT KRT ;KRT-Grafik ausschalten OUT SHROF ;Schatten-RAM ausschalten OUT HIROF ;Oberen RAM ausschalten ; ;-------------------------------- ;RESET-Test ;bei RESET Ausgabe der Modulmeldung (und Uhr), sonst Warmstart ; RTEST: LD HL,0EC00H ;Systemmeldung im BWS LD DE,0FC33H ;Systemmeldung aus dem System-EPROM LD BC,10H ;Laenge der Meldung CALL STRVG ;Zeichenkettenvergleich JRNZ CCP1-# ;nein, dann kein Reset und keine Uhr LD A,(002CH) ;Kursorzeile CMP 4 ;Zeile 4 JRNZ CCP1-# ;kein Neustart -> keine Modulmeldung LD DE,MOD ;Ausgabe der Modulmeldung LD C,9 CALL 5 LD A,(002CH) ;Kursorzeile CMP 5 ;jetzt Zeile 5 JRNZ CCP1-# ;kein Neustart --> keine Uhr-Ausgabe CALL UHR CCP1: LD DE,XOS ;XOS-Prompt ausgeben LD C,9 CALL 5 ; ;-------------------------------- ;Jetzt geht es los ; GOCPM: LD SP,0200H LD A,SYSBK ;Systembank = 0 LD (CURBK),A ;aktuelle Bank speichern OUT BKPRT ;Systembank einschalten LD HL,GOCPM PUSH HL ;Rueckkehradresse kellern Z1: EQU STBK0-FWBOT LD HL,BKSW+Z1 ;LD HL,STBK0 ----------> BKSWC+4 PUSH HL ;davor wieder auf Systembank umschalten LD HL,STDMA LD (STDMA),HL ;Kassettenpuffer LD A,'>' CALL OUTA ;Ausgabe Prompt CALL GETMS ;Eingabe Kommandozeile JPC DISPE ;Stoptaste oder Fehler CALL COEXT ;Vorverarbeitung eingabezeile RC ;Zeiechenkette leer, kein Programmname LD HL,ERDIS PUSH HL ;Adresse Fehlerroutine kellern CALL GVAL ;1. Parameter holen JPZ ERPAR ;kein Name ; ;-------------------------------- ;Namen im Speicher suchen ; INDV: PUSH BC ;Trennzeichen merken CALL CPROM ;Namen im Speicher suchen POP BC JRZ JMPHL-# ;gefunden INFIL: CALL LOAD1 ;Datei laden RC ;Ladefehler LD (HL),STADR ;gelesene Startadresse JMP (HL) ;Programm anspringen ; ;OS-Programm in der Bank --- (was passiert hier) ; JMPHL: LD A,IY ;FD 7C, immer 0? (XOR A?) ;es kommt bei den IY-Befehlen ;anderer Code raus! :man sollte den OS-Rahmen vielleicht in ;einer RAM-Zelle speichern und nicht in ;IY (z.B. CURBK+2) CMP 0 JRNZ JMPOS-# JMP (HL) ;zur Programmausfuehrung JMPOS: PUSH HL ;wozu jetzt Bank setzen? LD A,(CURBK) Z2: EQU LSBK2-LNXBK JMP TMPCO+Z2 ;JMP LSBK2: ----------> TMPCO+14 ; ;-------------------------------- ;Programm suchen von 100H-0FC00H ; CPROM: LD HL,0FC00H ;Anfangsadresse LD IY,00H ;21? FD 26 00 ---- ??? CP1: PUSH HL CP2: LD A,0C3H CPI ;Sprungbefehl suchen JRNZ CP22-# ;auf naechster Adresse suchen INC HL INC HL PUSH BC LD BC,10BH CALL LOCK ;Vergleich Zeichenkette POP BC JRZ CPE1-# ;gefunden XOR A DEC HL DEC HL CMP (HL) JRNZ CP2-# ;weiter in Kommandotabelle CP22: POP HL DEC H ;naechste 100H-Grenze JRNZ CP1-# LD HL,LNXBK ;weil beim Suchen die Bank weg ist !!! ### LD DE,TMPCO ;umkopieren nach 0110H LD BC,CPR4E-LNXBK LDIR Z3: EQU CP4-LNXBK CALL TMPCO+Z3 ;CALL CP4: steht jetzt im RAM ab TMPCO!!! ----------> TMPCO+17 RET ;nicht gefunden CPE1: POP BC ;HL vom Kellerspeicher holen RET ;der folgende Bereich wurde in den RAM kopiert und dann hingesprungen. ;Alle Adressen die keine relativen Spruenge sind. muessen angepasst werden. ;0110H-XXXXH ;Setzen_BanK ; LNXBK: LD A,(CURBK) ;LNXBK --> spaeter TMPCO INC A JR LSBK1-# LSBK0: LD A,SYSBK LSBK1: LD (CURBK),A LD (MZBWS),A LSBK2: OUT BKPRT ;78H RET CP4: CALL TMPCO ;CALL LNXBK: Bank erhoehen ----------> TMPCO LD HL,BKANF CP41: PUSH HL CP42: LD A,0C3H CPI JRNZ CP422-# ;----- LD IY,0C3H ;21? FD 26 C3 -> IY LD H,n INC HL INC HL PUSH BC LD BC,10BH CALL LOCK POP BC JRZ CPE41-# XOR A DEC HL DEC HL CMP (HL) JRNZ CP42-# CP422: POP HL INC H ;naechste 100H-Grenze LD A,BKEND CMP H JRNZ CP41-# INC H ;---? LD A,(CURBK) CMP LSTBK JRNZ CP4-# Z4: EQU LSBK0-LNXBK CALL LSBK0+Z4 ;CALL LSBK0: alles durchsucht, Systembank ein ----> TMPCO+6 INC H ;Z-Flag loeschen RET ;nicht gefunden CPE41: POP BC ;Kommando gefunden --- LD A,SYSBK ;Systembank = 0 OUT BKPRT ;einschalten RET CPR4E: NOP ; ;ENDE ; ; UNTERPROGRAMME -------------------------------------------------------- , ;-------------------------------- ;Test, ob der RTC installiert ist ; UHR: LD C,60H ;Port Sekundeneiner IN A ;Sekunde lesen LD HL,MZBWS ;Merkzelle im BWS LD M,A ;Wert sichern PUSH HL ;Warteschleife > 1 Sekunde LOOP: LD BC,0FFFFH LOOP1: INC L LOOP2: DEC C LD A,C OR A ;=0? JRNZ LOOP2-# LD A,L OR A ;=0? JRNZ LOOP1-# DJNZ LOOP2-# POP HL LD C,60H ;Port Sekundeneiner IN A ;Sekunde lesen SUB M ;vorherige Wert abziehen, ;nach einer Sekunde nicht gleich ;es muss eine Differenz auftreten RZ ;keine Uhr --> zurueck ; ;-------------------------------- ;Uhrzeit anzeigen ; RTC: LD HL,0EC76EH ;Anzeigeadresse im Bildspeicher LD C,60H ;Port Sekundeneiner JR RTC2-# RTC1: LD A,3AH ;Doppelpunkt LD M,A ;ausgeben DEC HL ;naechste BWS-Adresse RTC2: LD B,2 ;Anzahl der anzuzeigenden Stellen RTC3: IN A ;Sekundeneiner lesen (Minute,Stunde) AND 0FH ;letzte Stelle toren ADD 30H ;in Dezimalzahl wandeln LD M,A ;im BWS speichern DEC HL :naechste BWS-Adresse INC C ;Port Sekundenzehner (Minute,Stunde) DJNZ RTC3-# ;es war schon die zweite Stelle LD A,C ;aktueller RTC-Port CMP 65H ;Anzeigenende erreicht? JRC RTC1-# ;nein, zum Doppelpunkt ausgeben ;-------------------------------- ;Datum anzeigen ; DAT: LD HL,0EC64H ;Anzeigeadresse im Bildspeicher ; LD C,67H ;Port Jahreseiner JR DAT2-# DAT1: LD A,2EH ;Punkt LD M,A ;ausgeben INC HL ;naechste BWS-Adresse DAT2: LD B,2 ;Anzahl der anzuzeigenden Stellen DAT3: IN A ;Jahreseiner lesen (Monat,Tag) AND 0FH ;letzte Stelle toren ADD 30H ;in Dezimalzahl wandeln LD M,A ;im BWS speichern INC HL :naechste BWS-Adresse DEC C ;Port Jahreszehner (Monat,Tag) DJNZ DAT3-# ;es war schon die zweite Stelle INC C INC C INC C INC C LD A,C ;aktuelle Portadresse CMP 6DH ;Port Tageszehner? JRC DAT1-# ;nein, zum Punkt ausgeben ;Ausgabe beendet ;-------------------------------- ;Zeit ins System uebernehmen: ; R0: LD HL,SEC ;Systemzelle Sekunden fuer PRITI LD C,60H ;Port Sekundeneiner LD B,3 R1: IN A ;Sekundeneiner lesen (Minute,Stunde) AND 0FH ;letzte Stelle toren LD M,A ;in Systemzelle speichern INC C ;naechste Stelle IN A ;Sekundenzehner lesen AND 0FH OR A ;=0? JRZ R3-# PUSH BC LD B,A XOR A R2: ADD 0AH DJNZ R2-# POP BC R3: ADD M LD M,A INC C DEC HL DJNZ R1-# RET