LIMIT &FFFF        ;Von Dr. Stefan W. Stumpferl aka TFM of FutureSoft
ORG   &B800        ;Version CPC6128 und 6128 Plus - DEUtsch
;Datei #OS-Var.Deu ;1017 Zeilen - 2016-06-24
;WIDTH 160         ;Drucker auf 160 ZEICHEN!!!

NOLIST
NOCODE

;--------------------------------------------;
; Speicher-Karte des FUTURE OPERATING SYSTEM ;
;--------------------------------------------;
;
; &FFFFH !====!===============================================================;
;        !  3 !         - Lesen --- ; 16 KB RAM oder eines von 256 ROM's      ;
;        !  3 ! Block 3 - Schreiben ; 16 KB RAM (Video-RAM) / SB = OS ROM A-D ;
; &C000H !====!===============================================================;
;        !  2 !         - Lesen --- ; 16 KB RAM einziger COMMON Block RAM     ;
;        !  2 ! Block 2 - Schreiben ; 16 KB RAM einziger COMMON Block RAM     ;
; &8000H !====!===============================================================;
;        !  1 !         - Lesen --- ; 16 KB RAM (1 aus 257) oder Mem.Map. I/O ;
;        !  1 ! Block 1 - Schreiben ; 16 KB RAM siehe Lesen / SB = RAM &C0    ;
; &4000H !====!===============================================================;
;        !  0 !         - Lesen --- ; 16 KB RAM oder L-ROM je mit Zeichensatz ;
;        !  0 ! Block 0 - Schreiben ; 16 KB RAM (RST Vek.bei IM 1) / SB = RAM ;
; &0000H !====!===============================================================;
;
; SB = Standartbelegung. StandartSpeicher
;
;
; BFFF ---\
;      ----\
; BF00 -----> BE02 bis BFFF 510 Bytes Stack d.h. 255 Elemente
;      ----/
; BE00 ---<
;      ---->  BD00 bis BE00(incl.) 257 Bytes INTERUPT MODE 2 Vektoren
; BD00 ---<
;      ---->  BC00 bis BC7F Datei-Header der Vordergrund-Applikation 
; BC00 ---<   BC80 bis BCFF Datei-Header der Hintergrund-Applikation
;      ----\
; BB00 -----\
;      ------\
; BA00 -------> B800 bis BBFF 1024 Bytes als 1 KB Systemvariablenspeicher
;      ------/
; B900 -----/
;      ----/
; B800 ---<
;      ----\
; B700 -----\
;      ------\
; B600 -------\
;      --------!
; B500 --------!
;      --------!
; B400 --------! B000 bis B7FF 2048 Bytes Textbildschirm Puffer, frei f. Apps.
;      --------!
; B300 --------!
;      --------!
; B200 -------/
;      ------/
; B100 -----/
;      ----/
; B000 ---/
;
; A000-A0FF - 256 tagging Bytes f. FDC 0 (intern) und LW A
; A100-A1FF - 256 tagging Bytes f. FDC 0 (intern) und LW B
; A200-A2FF - 256 tagging Bytes f. FDC 0 (intern) und LW C
; A300-A3FF - 256 tagging Bytes f. FDC 0 (intern) und LW D
;
; A400-A4FF - 256 tagging Bytes f. FDC 1 (extern) und LW E
; A500-A5FF - 256 tagging Bytes f. FDC 1 (extern) und LW F
; A600-A6FF - 256 tagging Bytes f. FDC 1 (extern) und LW G
; A700-A7FF - 256 tagging Bytes f. FDC 1 (extern) und LW H
;
; A800-A9FF - 512 tagging Bytes f. Hard-Disk Partition I
; AA00-ABFF - 512 tagging Bytes f. Hard-Disk Partition J
; AC00-ADFF - 512 tagging Bytes f. Hard-Disk Partition K
; AE00-AFFF - 512 tagging Bytes f. Hard-Disk Partition L
;
; Aufbau eines der obenstehenden 4096 DATEI-Tagging-Bytes ...
; Bit 0 - Null => nicht getagged /// Eins => getagged
; Bit 1 - Null => nicht REtagged /// Eins => REtagged 
; Bit 2 - reserviert
; Bit 3 - reserviert
; Bit 4 - reserviert
; Bit 5 - RO  / RW    ;===> Aufbau wie im DIR Eintr. (32er Orginal)
; Bit 6 - DIR / SYS   ;===> Aufbau wie im DIR Eintr. (32er Orginal)
; Bit 7 - ARC / NOARC ;===> Aufbau wie im DIR Eintr. (32er Orginal)


;Es folgen die EQUates fuer das Desktop und das FutureOS

KS0XL EQU &6000 ;Koordinaten Sprite 0 f. CPC6128plus
KS0XH EQU &6001
KS0YL EQU &6002
KS0YH EQU &6003 ;... oder ...

P_BUF EQU &B400 ;Video-RAM-Puffer 64 Bytes f. CPC old Gen. Software-Sprite

FDC0_ST EQU &FB7E ;HAUPT-STATUS-REGISTER interner FDC
FDC1_ST EQU &FBF6 ;ext.FDC(Vortex)

TMS_A EQU &A000 ; <T>agging <M>assen <S>peicher Laufwerk <A>
TMS_B EQU &A100 ; Standart Laufwerke A, B, (C, D) des internen FDC765
TMS_C EQU &A200
TMS_D EQU &A300

TMS_E EQU &A400 ; Laufwerke E bis F (externer Vortex FDC765
TMS_F EQU &A500
TMS_G EQU &A600
TMS_H EQU &A700

TMS_I EQU &A800 ; Dobbertin Festplatten Partitionen I bis L der HD20 mit 20 MB
TMS_J EQU &AA00 ; FutureOS Partitionen I-L entsprechen D-G unter BASIC od. CP/M
TMS_K EQU &AC00
TMS_L EQU &AE00

;Memory Laufwerk M vorerst inaktiv.
;Seine 16er DIR Daten werden troz RAM Laufwerk, im RAM gespeichert.

TAR16   EQU &1800 ;Temporaerer 8 KB Puffer fuer 32er auf 16er DIR Umwandlung.
TXT_SCR EQU &B000 ;Anfang des 2 KB Textbildschirms


; ---=== Die System-Variablen des FutureOS ===---
;
;Speicher von B800 bis BBFF Byte auf Byte

TAS_S1 DS 64 ;64 (32*2) Bytes f. Mode 1 Terminal JP Tabelle.
             ;muss auf &B800 liegen.

FDC_RES DS 7 ;7 Bytes RESULT FDC 0 und 1.

RAMCHAR DS 1 ;Bildschirm-Modus und RAM/ROM-Zeichensatz Auswahl.

;Bit 0, 1 enthalten den Bildschirm-Mode 0..3 (MODE 0 - 2 wie unter Basic)
;
;Bit 2 = 0 ==> Zeichensatz aus ROM (lower ROM einblenden!)
;      = 1 ==> RAM Zeichensatz von &3800 bis &3FFF geladen

C_POS   DS 2 ;2 Bytes f. Cursor POSition >> &BFFE (&BFFF) bis &C7FE (&C7FF)

AKT_ROM DS 2 ;Entspricht dem gerade aktiven ROM 0..255.
             ;Gefolgt von &DF um einen LD BC,(AKT_ROM) mit OUT zu ermoeglichen.

AKT_RAM DS 2 ;Gerade aktives RAM &C4..&FF oder &C0 f. Standart-RAM.
             ;Gefolgt von &78-&7F um LD BC,(AKT_RAM) mit OUT zu ermoeglichen.

TAST_R0 DS 10 ;Platz um Daten von den PSG Tastaturreihen 0..9 zu speichern

TURBO_A DS 8 ;Turbo Desk Laufwerk A
TURBO_B DS 8 ;Turbo Desk Laufwerk B
TURBO_C DS 8 ;Turbo Desk Laufwerk C
TURBO_D DS 8 ;Turbo Desk Laufwerk D

TURBO_E DS 8 ;Turbo Desk Laufwerk E
TURBO_F DS 8 ;Turbo Desk Laufwerk F
TURBO_G DS 8 ;Turbo Desk Laufwerk G
TURBO_H DS 8 ;Turbo Desk Laufwerk H

TURBO_I DS 8 ;Turbo Desk Laufwerk I
TURBO_J DS 8 ;Turbo Desk Laufwerk J
TURBO_K DS 8 ;Turbo Desk Laufwerk K
TURBO_L DS 8 ;Turbo Desk Laufwerk L

TURBO_M DS 8 ;Turbo Desk Laufwerk M

;Byte 0 - LW Tagging Byte.
;
; Bits 7,6,5,4 - enthalten Formatnummer.
;
; &0X ==> noch kein Floppyzugriff, HD oder Fremdformat
; &1X ==> VORTEX - Format
; &2X ==> IBM ---- Format
; &4X ==> SYSTEM - Format
; &8X ==> FutureOS Format
; &CX ==> DATA --- Format
;
; Bit 3 - Inhaltsverzeichniss manipuliert, relevant wenn Bit 0 = 1, LW aktiv.
;       = 0 ==> DIR wurde noch nicht manipuliert.
;       = 1 ==> DIR wurde durch Datei-Operation manipuliert. ==> SORT, DW, DS
;
; Bit 2 - Kopf-Nummer bei einseitigen SS Formaten auf doppelseitigen DS Laufw.
;       = 0 ==> Kopfnummer 0 wird benutzt
;       = 1 ==> Kopfnummer 1 wird benutzt
; Achtung diese Funktion ist momentan noch inaktiv geschaltet!!!
;
; Bit 1 - LW manipulierbar.
;       = 0 ==> manipulierbar, LW vorhanden
;       = 1 ==> nicht manipulierbar, LW nicht vorhanden/inaktiv.
;
; Bit 0 - LW markiert oder nicht.
;       = 0 ==> nicht markiert.
;       = 1 ==> LW ist markiert.
;
;Byte 1 - RAM Block &C4..&FF oder &C0. (32er DIR)
;Byte 2 - StartA (in Pages) &40 - &7F. (32er DIR)
;Byte 3 - Laenge (in Pages) &00 - &40. (32er DIR)
;
;Byte 4 - RAM Block &C4..&FF oder &C0. (16er DIR)
;Byte 5 - StartA (in Pages) &40 - &7F. (16er DIR)
;Byte 6 - Laenge (in Pages) &00 - &20. (16er DIR)
;
;Byte 7 - Anz. der 64 Eintr. Pages (z.B. = 1 bei 64 Eintr.)


TURBO_X DS 1 ;Zeiger auf Ext-RAM Nummer &C4..&FF, oder &C0 f. StandertRAM
        DS 1 ;Dann hoechste freie Adresse (in Pages) &41 - &80
             ;z.B. &FF, &80 (bei 576 K maximalausbau)

REG_AF1 DS 2 ;Register AF - alle Prozessorregister f. Maschienen Mon.
REG_BC1 DS 2 ;Register BC
REG_DE1 DS 2 ;Register DE
REG_HL1 DS 2 ;Register HL

REG_AF2 DS 2 ;Register AF'
REG_BC2 DS 2 ;Register BC'
REG_DE2 DS 2 ;Register DE'
REG_HL2 DS 2 ;Register HL'

REG_IX  DS 2 ;Register IX
REG_IY  DS 2 ;Register IY
REG_SP  DS 2 ;Register SP
REG_R   DS 1 ;Register R
REG_I   DS 1 ;Register I ;Achtung bitte Wert NIE veraendern!

REG_PC  DS 2 ;Register PC

REG08_0 DS 1 ;USER-Register 0 (8 Bit)
REG08_1 DS 1 ;USER-Register 1 (8 Bit)
REG08_2 DS 1 ;USER-Register 2 (8 Bit)
REG08_3 DS 1 ;USER-Register 3 (8 Bit)
REG08_4 DS 1 ;USER-Register 4 (8 Bit)
REG08_5 DS 1 ;USER-Register 5 (8 Bit)
REG08_6 DS 1 ;USER-Register 6 (8 Bit)
REG08_7 DS 1 ;USER-Register 7 (8 Bit)

REG16_0 DS 2 ;USER-Register 0 (16 Bit)
REG16_1 DS 2 ;USER-Register 1 (16 Bit)
REG16_2 DS 2 ;USER-Register 2 (16 Bit)
REG16_3 DS 2 ;USER-Register 3 (16 Bit)
REG16_4 DS 2 ;USER-Register 4 (16 Bit)
REG16_5 DS 2 ;USER-Register 5 (16 Bit)
REG16_6 DS 2 ;USER-Register 6 (16 Bit)
REG16_7 DS 2 ;USER-Register 7 (16 Bit)
REG16_8 DS 2 ;USER-Register 8 (16 Bit)
REG16_9 DS 2 ;USER-Register 9 (16 Bit)

REG32_0 DS 4 ;USER-Register 0 (32 Bit)
REG32_1 DS 4 ;USER-Register 1 (32 Bit)

TAS_S2 DS 64 ;64 (32*2) Bytes f. Mode 2 Terminal JP Tabelle.
             ;muss auf &B900 liegen.

TMD_A DS 2 ; <T>agging <M>assenpeicher <D>ateienanzahl <A>. (INTERN)
TMD_B DS 2 ; Verwendung im Desktop. gibt Anzahl versch.
TMD_C DS 2 ; Dateien eines jeden LW an.
TMD_D DS 2
TMD_E DS 2 ; (EXTERN)
TMD_F DS 2 ; d.h. Vortex F1-S, F1-D oder Dobbertin D-DOS.
TMD_G DS 2
TMD_H DS 2
TMD_I DS 2 ; (HD 20MB)
TMD_J DS 2 ; d.h. z.B die 20 MB Dobbertin Platte
TMD_K DS 2 ; die Vortex Platte ist auch geplant
TMD_L DS 2
TMD_M DS 2 ;Memory Floppy (z.B. Otten & Fecht)

;hier folgen 8 Bytes f. die Daten der Echtzeituhr. Die ROM Version des SETUP
;enthaelt hier das Brenndatum und die Brennzeit des Eproms.

UHR_00  DS 1 ;Byte 0 ==> Sekunden-Bruchteile
UHR_SEK DS 1 ;Byte 1 ==> Sekunde
UHR_MIN DS 1 ;Byte 2 ==> Minute
UHR_STU DS 1 ;Byte 3 ==> Stunde
UHR_WOT DS 1 ;Byte 4 ==> Wochentag 1..7, 1=Sonntag
UHR_TAG DS 1 ;Byte 5 ==> Tag
UHR_MON DS 1 ;Byte 6 ==> Monat
UHR_JAR DS 1 ;Byte 7 ==> Jahr (Zehner und Einer)

UHR_ROM DS 2 ;ROM Nummer unter der die SmartWatch von Dobbertin sitzt. (15)
             ;gefolgt von &DF um einen LD BC,(UHR_ROM) + OUT zu ermoeglichen.

MAX_CRX DS 1 ;X = temp. max. Spaltenanzahl, MAXIMAL 104
MAX_CRY DS 1 ;Y = temp. max.  Zeilenanzahl, MAXIMAL  40

MAX_RAM DS 1 ;Anzahl aller 16 KB Erweiterungsbloecke, die lueckenlos
             ;ab &C4 addressiert werden koennen.

ADROM_X DS 1 ;Nummer des FutureOS E-ROMs von dem aus das OS aufgerufen wurde

ADROM_A DS 2 ;Nummer des FutureOS ROMs A, gefolgt vom Byte &DF
             ;Ermoeglicht ld bc,(adrom_a) + out (c),c

FREEZE  DS 1 ;= 1 Alle LW Tag-Bytes nur vom User manipulierbar, = 0 alles o.k.

ANALOX  DS 1 ;Verzoegerungswert f. Analog-Joystick horizontal.
ANALOY  DS 1 ;Verzoegerungswert f. Analog-Joystick vertikal.

DIRIN   DS 1 ;DIRectory eINgelesen, LW oder &FF ==> KEIN DIR gelesen.


; Nun folgen einige Konfigurations-Bytes
; ======================================
;
; Bit 0 = 0 ==> Eingaben werden im HEXadezimalen Zahlen-System gemacht
;       = 1 ==> Eingaben werden im ....DEZimalen Zahlen-System gemacht
;
; Bit 1 = 0 ==> kein Albireo angeschlossen
;       = 1 =======> Albireo angeschlossen
;
; Bit 2 = 0 ==> kein PlayCity angeschlossen
;       = 1 =======> PlayCity angeschlossen
;
; Bit 3 = 0 ==> kein MultiPlay angeschlossen
;       = 1 =======> MultiPlay angeschlossen
;
; Bit 4 = 0 ==> SPARtan Modus aus. Normale Anzeige der Icons (Desktop)
;       = 1 ==> SPARtan Modus EIN. Minimierte Anzeige der Icons (Desktop)
;
; Bit 5 = 0 ==> kein DigiBlaster angeschlossen
;       = 1 =======> DigiBlaster angeschlossen
;
; Bit 6 = 0 ==> kein WizCat Netz angeschlossen
;       = 1 =======> WizCat Netz angeschlossen
;
; Bit 7 = 0 ==> kein M4-WiFi angeschlossen
;       = 1 =======> M4-WiFi angeschlossen

KF_MED  DS 1 ; %MWDSMPAZ - Netzwerk, DigiBlaster, SPARtan, MP, PCity, Albi, Hex


; Bit 0 = 0 ==> kein externer FDC angeschlossen
;       = 1 ==> Vortex (F1-D) FDC angeschlossen
;
; Bit 1 = 0 ==> kein interner FDC vorhanden
;       = 1 ==> ein  interner FDC vorhanden (CPC464 Amstrad oder Dobbertin)
;
; Bit 2 = 0 ==> kein CPC Booster(+) vorhanden
;       = 1 ==> ein  CPC Booster(+) vorhanden
;
; Bit 3 = 0 ==> Keine Vortex HD angeschlossen
;       = 1 ==> Vortex Winchester angeschlossen
;
; Bit 4 = 0 ==> Keine Dobbertin HD20 angeschlossen
;       = 1 ==> Dobbertin Harddisk angeschlossen
;
; Bit 5 = 0 ==> kein Kassettenlaufwerk angeschlossen
;       = 1 =======> Kassettenlaufwerk angeschlossen
;
; Bit 6 = 0 ==> keine TIMEROM - Echtzeituhr (Dobbertin oder dxs)
;       = 1 ========> TIMEROM - Echtzeituhr (Dobbertin oder dxs)
;
; Bit 7 = 0 ==> keine Happy - Echtzeituhr (Happy Comp. Sonderh.)
;       = 1 ========> Happy - Echtzeituhr (Happy Comp. Sonderh.)

KF_FDHD DS 1 ; %HTKHVBIE ;FDC extern, FDC intern, HD Typ, Echtzeituhr aktiv ?


; Bit 0 = 0 ==> kein internes Laufwerk (DS 0 - LW A) vorhanden
;       = 1 =======> internes Laufwerk (DS 0 - LW A) vorhanden
; Bit 1 = 0 internes LW (DS 0 - LW A) hat 40 Spuren
;       = 1 internes LW (DS 0 - LW A) hat 80 Spuren
; Bit 2 = 0 internes LW (DS 0 - LW A) ist einseitig
;       = 1 internes LW (DS 0 - LW A) ist zweiseitig
; Bit 3 = 0 internes LW (DS 0 - LW A) hat 8 Zoll
;       = 1 internes LW (DS 0 - LW A) hat 3, 3.5, 5.25 Zoll
;
; Bit 4 = 0 ==> kein internes Laufwerk (DS 1 - LW B) vorhanden
;       = 1 =======> internes Laufwerk (DS 1 - LW B) vorhanden
; Bit 5 = 0 internes LW (DS 1 - LW B) hat 40 Spuren
;       = 1 internes LW (DS 1 - LW B) hat 80 Spuren
; Bit 6 = 0 internes LW (DS 1 - LW B) ist einseitig
;       = 1 internes LW (DS 1 - LW B) ist zweiseitig
; Bit 7 = 0 internes LW (DS 1 - LW B) hat 8 Zoll
;       = 1 internes LW (DS 1 - LW B) hat 3, 3.5, 5.25 Zoll

KF_AB   DS 1 ; %11111001 ; LW's A und B des internen FDC


; Bit 0 = 0 ==> kein internes Laufwerk (DS 2 - LW C) vorhanden
;       = 1 =======> internes Laufwerk (DS 2 - LW C) vorhanden
; Bit 1 = 0 internes LW (DS 2 - LW C) hat 40 Spuren
;       = 1 internes LW (DS 2 - LW C) hat 80 Spuren
; Bit 2 = 0 internes LW (DS 2 - LW C) ist einseitig
;       = 1 internes LW (DS 2 - LW C) ist zweiseitig
; Bit 3 = 0 internes LW (DS 2 - LW C) hat 8 Zoll
;       = 1 internes LW (DS 2 - LW C) hat 3, 3.5, 5.25 Zoll
;
; Bit 4 = 0 ==> kein internes Laufwerk (DS 3 - LW D) vorhanden
;       = 1 =======> internes Laufwerk (DS 3 - LW D) vorhanden
; Bit 5 = 0 internes LW (DS 3 - LW D) hat 40 Spuren
;       = 1 internes LW (DS 3 - LW D) hat 80 Spuren
; Bit 6 = 0 internes LW (DS 3 - LW D) ist einseitig
;       = 1 internes LW (DS 3 - LW D) ist zweiseitig
; Bit 7 = 0 internes LW (DS 3 - LW D) hat 8 Zoll
;       = 1 internes LW (DS 3 - LW D) hat 3, 3.5, 5.25 Zoll

KF_CD   DS 1 ; %00000000 ; LW's C und D des internen FDC


; Bit 0 = 0 ==> kein externes Laufwerk (DS 0 - LW E) vorhanden
;       = 1 =======> externes Laufwerk (DS 0 - LW E) vorhanden
; Bit 1 = 0 externes LW (DS 0 - LW E) hat 40 Spuren
;       = 1 externes LW (DS 0 - LW E) hat 80 Spuren
; Bit 2 = 0 externes LW (DS 0 - LW E) ist einseitig
;       = 1 externes LW (DS 0 - LW E) ist zweiseitig
; Bit 3 = 0 externes LW (DS 0 - LW E) hat 8 Zoll
;       = 1 externes LW (DS 0 - LW E) hat 3, 3.5, 5.25 Zoll
;
; Bit 4 = 0 ==> kein externes Laufwerk (DS 1 - LW F) vorhanden
;       = 1 =======> externes Laufwerk (DS 1 - LW F) vorhanden
; Bit 5 = 0 externes LW (DS 1 - LW F) hat 40 Spuren
;       = 1 externes LW (DS 1 - LW F) hat 80 Spuren
; Bit 6 = 0 externes LW (DS 1 - LW F) ist einseitig
;       = 1 externes LW (DS 1 - LW F) ist zweiseitig
; Bit 7 = 0 externes LW (DS 1 - LW F) hat 8 Zoll
;       = 1 externes LW (DS 1 - LW F) hat 3, 3.5, 5.25 Zoll

KF_EF   DS 1 ; %11111111 ; LW's E und F des externen FDC


; Bit 0 = 0 ==> kein externes Laufwerk (DS 2 - LW G) vorhanden
;       = 1 =======> externes Laufwerk (DS 2 - LW G) vorhanden
; Bit 1 = 0 externes LW (DS 2 - LW G) hat 40 Spuren
;       = 1 externes LW (DS 2 - LW G) hat 80 Spuren
; Bit 2 = 0 externes LW (DS 2 - LW G) ist einseitig
;       = 1 externes LW (DS 2 - LW G) ist zweiseitig
; Bit 3 = 0 externes LW (DS 2 - LW G) hat 8 Zoll
;       = 1 externes LW (DS 0 - LW G) hat 3, 3.5, 5.25 Zoll
;
; Bit 4 = 0 ==> kein externes Laufwerk (DS 3 - LW H) vorhanden
;       = 1 =======> externes Laufwerk (DS 3 - LW H) vorhanden
; Bit 5 = 0 externes LW (DS 3 - LW H) hat 40 Spuren
;       = 1 externes LW (DS 3 - LW H) hat 80 Spuren
; Bit 6 = 0 externes LW (DS 3 - LW H) ist einseitig
;       = 1 externes LW (DS 3 - LW H) ist zweiseitig
; Bit 7 = 0 externes LW (DS 3 - LW H) hat 8 Zoll
;       = 1 externes LW (DS 3 - LW H) hat 3, 3.5, 5.25 Zoll

KF_GH   DS 1 ; %00000000 ; LW's G und H des externen FDC


; Bit 0 = 0 ==> kein E-RAM durch &78xx addressierbar
;       = 1 =======> E-RAM durch &78xx addressierbar
; Bit 1 = 0 ==> kein E-RAM durch &79xx addressierbar
;       = 1 =======> E-RAM durch &79xx addressierbar
; Bit 2 = 0 ==> kein E-RAM durch &7Axx addressierbar
;       = 1 =======> E-RAM durch &7Axx addressierbar
; Bit 3 = 0 ==> kein E-RAM durch &7Bxx addressierbar
;       = 1 =======> E-RAM durch &7Bxx addressierbar
; Bit 4 = 0 ==> kein E-RAM durch &7Cxx addressierbar
;       = 1 =======> E-RAM durch &7Cxx addressierbar
; Bit 5 = 0 ==> kein E-RAM durch &7Dxx addressierbar
;       = 1 =======> E-RAM durch &7Dxx addressierbar
; Bit 6 = 0 ==> kein E-RAM durch &7Exx addressierbar
;       = 1 =======> E-RAM durch &7Exx addressierbar
; Bit 7 = 0 ==> kein E-RAM durch &7Fxx addressierbar
;       = 1 =======> E-RAM durch &7Fxx addressierbar
;
;Genauere Aufschluesselung der einzelnen Bloecke ab X4RAM

KF_MEM  DS 1 ; %00000000 ; 4 MB RAM-Banking Byte


; Bit 0 = 0 ==> keine serielle Schnittstelle vorhanden, generell.
;       = 1 ========> serielle Schnittstelle vorhanden, generell.
; Bit 1 = 0 ==> keine Schneider-Schnittstelle (Z80-STI) vorhanden.
;       = 1 ========> Schneider-Schnittstelle (Z80-STI) vorhanden.
; Bit 2 = 0 ==> keine Amstrad-Schnittstelle (Z80-SIO) vorhanden.
;       = 1 ========> Amstrad-Schnittstelle (Z80-SIO) vorhanden.
; Bit 3 = 0 ==> keine Vortex-Schnittstelle (Z80-SIO) vorhanden.
;       = 1 ========> Vortex-Schnittstelle (Z80-SIO) vorhanden.
; Bit 4 = 0 ==> keine RS232C-Valcom-Schnittstelle (Z80-SIO) vorhanden.
;       = 1 ========> RS232C-Valcom-Schnittstelle (Z80-SIO) vorhanden.
; Bit 5 = 0 ==> keine eigene serielle Schnittstelle vorhanden.
;       = 1 ========> eigene serielle Schnittstelle vorhanden, Spezialanfertig.
;
; Bit 6 = 0 ==> 7 Bit Druckerport (Standart).
;       = 1 ==> 8 Bit Druckerport (CPC plus oder PPI-Eigenbau 8. Bit).
;
; Bit 7 = 0 ==> Gruenmonitor oder S/W Monitor angeschlossen.
;       = 1 ==> RGB Farbmonitor angeschlossen.

KF_SIO  DS 1 ; %11100100  ; Hat der CPC eine serielle Schnittstellen, welche ?


; 2,1,0 = 000 = 0 ==> CPC  464
;       = 001 = 1 ==> CPC  664
;       = 010 = 2 ==> CPC 6128
;       = 011 = 3 ==> CPC  464 plus
;       = 100 = 4 ==> CPC 6128 plus
;       = 101 = 5 ==> CPC 2128, der GX4000 Umbau
;       = 110 = 6 ==> C-One
;       = 111 = 7 ==> T-Rex
;
; 5,4,3 = 00 0 = 0 ==> OS Anwender spricht Deutsch
;       = 00 1 = 1 ==> Franzoesich
;       = 01 0 = 2 ==> Englisch
;       = 01 1 = 3 ==> Griechisch
;       = 10 0 = 4 ==> Spanisch
;       = 10 1 = 5 ==> Hollaendisch
;       = 11 0 = 6 ==> reserviert
;       = 11 1 = 7 ==> reserviert
;
;   7,6 = 00 = 0 ==> Weder CPC-IDE / X-MASS, noch SYMBiFACE II angeschlossen
;       = 01 = 1 ==> Nur CPC-IDE / X-MASS angeschlosen
;       = 10 = 2 ==> SYMBiFACE II angeschlossen
;       = 11 = 3 ==> SYMBiFACE II mit Erweiterungskarte Silikon Storm angeschlossen

KF_CPC  DS 1 ; %00000100 ;CPC Typ, Sprache und IDE Geraet bestimmen


; 1. Byte
;---------
;
; Bits 2,1,0 - reserviert (normal 000)
;
; Bit 3 = 0 ==> Gunhead T8000 Version
;       = 1 ==> Terra Version
;
; Bit 4 - reserviert (normal 0)
;
; Bit 5 = 0 ==> Persoenliche Version des FutureOS
;       = 1 ==> PD Version des FutureOS
;
; Bit 6 = 0 ==> Datum & Uhrzeit als Icons angezeigt (mittig)
;       = 1 ==> Datum & Uhrzeit als Zeichen angezeigt (unten)
;
; Bit 7 = 0 ==> Keine persoenliche Konfiguraton vorhanden
;       = 1 ==> Persoenliche Konfiguraton vorhanden
;
; 2. & 3. Byte
;--------------
; Bits 15-0 = 16 Bit Anwender-Nummer

KF_VERS DS 1 ; &88   ;&88 = Terra // &80 = GUNHEAD T8000 // &20 = PD
        DS 2 ; &0100 ;Versionsnummer des Users 0..65535


;Bytes f. Desktop f. SCRI und TAG_DIR
;(TD... Variablen)

TDRAM DS 1 ;RAM Block 16er des akt.LWK
TDHST DS 1 ;Hi Startadr. 16er
TDANZ DS 1 ;Anz. aller 1 KB Seiten des DIRs des aktuellen Laufwerks
TDAKT DS 1 ;aktuelle 1 KB Seite (gerade angezeigt)
TDLWK DS 1 ;akt. Laufwerk

MO_ST DS 1 ;MOtor STatus, normal &00, User kann aktivieren
           ; = &00 => alle LW Motoren aus
           ; = &FF => LW Motoren immer EIN

TAST_N DS 80 ;80 Bytes f. ASCII Zeichen aus Tastaturmatrix 10 * 8  NORMAL

;Nun folgen 32 Bytes, die die 32 Erweiterungsrams von je 16K repraesentieren.
;Sie werden jeweils zwischen &4000 und &7FFF eingeblendet.
;
; Bit 7 !==> = 1 ==> RAM ist durch geladene Datei belegt.
; Bit 6 !==> = 1 ==> RAM wird durch Multitasking Routine belegt.
; Bit 5 !==> = 1 ==> ??? reserviert!!!
; Bit 4 !==> = 1 ==> RAM wird vom User belegt. OS ignoriert Block.
; Bit 3 !==> = 1 ==> RAM wird als KURZZEIT Puffer verwendet.
;                    Steht also zur freien Verfuegung
; Bit 2 !==> = 1 ==> RAM wird als LANGZEIT Puffer verwendet.
;                    z.B. Drucker Puffer, Soft-Memory-Floppy, alt 64K usw.
; Bit 1 !==> = 1 ==> RAM wird als DIR Puffer verwendet.
; Bit 0 !==> = 0 ==> Ram nicht vorhanden. /// = 1 ==> RAM ist angeschlossen.
;
; Von den Bits 1..7 darf nur EINES gesetzt sein, Verwendungszweck.
;
; RAMs mit der Kennung &01 bzw. &09 sind frei benutzbar.

XRAM_C4 DS 1 ;32 eXpansion RAMs - f.jeden 16K Block ein Byte, bitsig.
XRAM_C5 DS 1 ;physikalisch adressiert zwischen &7FC4 und &7FFF.
XRAM_C6 DS 1
XRAM_C7 DS 1

XRAM_CC DS 1
XRAM_CD DS 1
XRAM_CE DS 1
XRAM_CF DS 1

XRAM_D4 DS 1
XRAM_D5 DS 1
XRAM_D6 DS 1
XRAM_D7 DS 1

XRAM_DC DS 1
XRAM_DD DS 1
XRAM_DE DS 1
XRAM_DF DS 1

XRAM_E4 DS 1
XRAM_E5 DS 1
XRAM_E6 DS 1
XRAM_E7 DS 1

XRAM_EC DS 1
XRAM_ED DS 1
XRAM_EE DS 1
XRAM_EF DS 1

XRAM_F4 DS 1
XRAM_F5 DS 1
XRAM_F6 DS 1
XRAM_F7 DS 1

XRAM_FC DS 1
XRAM_FD DS 1
XRAM_FE DS 1
XRAM_FF DS 1

             ;Variablen des Maschinen MONitors
MON_ROM DS 1 ;&82 ==> Unteres ROM eingeblendet /// &86 kein U.ROM
MON_RAM DS 1 ;RAM Nr. &C0,&C4..&C7,&CC..&CF,,&F4..&F7,&FC..&FF
MON_MMB DS 1 ;&A0 ==> Memory mapped Baugruppen inaktiv /// &B8 ==> aktiv

            ;XWART Variablen, f. variable Wartezeit
VZ_MOD DS 1 ;VerZoegerung MODus = 0 dann Anfangs-VZ, sonst Folge-VZ.
VZ_AG  DS 2 ;VerZoegerung Anfang Generell (Wiederladewert)
VZ_AA  DS 2 ;VerZoegerung Anfang Aktuelle Restzeit
VZ_FG  DS 2 ;VerZoegerung Folge  Generell (Wiederladewert)
VZ_FA  DS 2 ;VerZoegerung Folge  Aktuelle Restzeit

FDCLSA DS 1 ;Aktueller Versuch beim lesen/schreiben FDC 0/1 (variabel)
FDCLSV DS 1 ;Zahl der Versuche beim lesen/schreiben FDC 0/1 insgesamt,konstant

DEFINT DS 1 ; = &00 ==> Interrupts aus, DI // = &FF Ints ein, EI
DEFRAS DS 1 ; = &00 ==> Raster ausgeschalten // = &FF Raster eingeschalten

TAST_S DS 80 ;80 Bytes f. ASCII Zeichen aus Tastaturmatrix 10 * 8  SHIFT

;Daten Spur Wechsel Zeit - interner & externer Controller
;
;&A0 => 12 Milli-Sekunden SpurWechselZeit
;&E0 =>  4 Milli-Sekunden SpurWechselZeit
;
;----------> A ! B ! C ! D ! E ! F ! G ! H <
DSWZ DS 8 ; &A0,&E0,&E0,&E0,&E0,&E0,&E0,&E0

OK_ADR DS 2 ;ADResse die bei OK Icon aufgerufen wird &????
OK_ATE DS 2 ;Inhalt muss mit (OK_ADR) ADDiert &FFFF ergeben
OK_BLK DS 2 ;BLocK bei Aufruf von OK an; &7F00 + &C0,&C4,&C5,..,&FF
OK_BTE DS 2 ;Inhalt muss mit (OK_BLK) ADDiert &FFFF ergeben

DS 6 ;CPC PLUS .. oder ..

;KS0XL DS 1 ;Koordinaten Sprite 0 f.
;KS0XH DS 1 ;CPC old Generation
;KS0YL DS 1
;KS0YH DS 1
;P_POS DS 2 ;SSP(SoftSpritePosition) CPC old Generation &C000..&FF7F

;Dobb.Uhr Daten ins RAM ab UHR_00 ; AKT_ROM ein
;Mani; AF,BC,DE,HL

LUHR LD BC,(UHR_ROM)

 OUT  (C),C
 LD   A,(&C004)
 LD   DE,&C000
 LD   HL,&C001
 CALL KOAS
 CALL KOAS
 LD   E,4  ;DE=&C004
 JP   RDUK

TAST_C DS 80 ;80 Bytes f. ASCII Zeichen aus Tastaturmatrix 10 * 8  CONTROL

RDUK LD HL,UHR_00
     LD B,8
RDUL LD A,(DE)

 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  A,(DE)
 RRA
 RR  C
 LD  (HL),C
 INC HL

 DJNZ RDUL
 LD   BC,(AKT_ROM)
 OUT  (C),C
 RET

TAST_SC DS 80 ;80 Bytes f. ASCII Zeichen aus Tastaturmatrix 10 * 8  SHI/CONT

KOAS LD A,(HL)

 LD A,(DE)
 LD A,(HL)
 LD A,(DE)
 LD A,(DE)
 LD A,(DE)
 LD A,(HL)
 LD A,(HL)
 LD A,(DE)
 LD A,(HL)
 LD A,(DE)
 LD A,(HL)
 LD A,(HL)
 LD A,(HL)
 LD A,(DE)
 LD A,(DE)
 LD A,(HL)
 LD A,(HL)
 LD A,(DE)
 LD A,(DE)
 LD A,(DE)
 LD A,(HL)
 LD A,(DE)
 LD A,(HL)
 LD A,(DE)
 LD A,(DE)
 LD A,(HL)
 LD A,(HL)
 LD A,(HL)
 LD A,(DE)
 LD A,(HL)
 LD A,(DE)
 RET

CAPS DS 1 ;Bit ? = 0 normal // Bit 7 Control // Bit 6 Caps-Lock // Bit 5 Shift

I_ADR DS 2 ;ADResse die bei I Icon aufgerufen wird &????
I_ATE DS 2 ;Inhalt muss mit (I_ADR) ADDiert &FFFF ergeben
I_BLK DS 2 ;BLocK bei Aufruf von I an; &7F00 + &C0,&C4,&C5,..,&FF
I_BTE DS 2 ;Inhalt muss mit (I_BLK) ADDiert &FFFF ergeben

DRUMEM DS 1 ;phys.Block-Nr. erster E-RAM Block Spooler &C4,..,&FF
DRUBAZ DS 1 ;Anzahl direkt folgende E-RAM Blocks 0..31 f. Spooler

MMFMEM DS 1 ;phys.Block-Nr. erster E-RAM Block RAM-Floppy &C4,..,&FF
MMFBAZ DS 1 ;Anzahl direkt folgende E-RAM Blocks 0..31 f. RAM-Floppy

HI_MEM DS 2 ;Zeiger, oberstes freies Byte, OS-Start; &9FFF

AUH_00  DS 1 ;8 Bytes, analog UHR_Daten
AUH_SEK DS 1 ;geben alte Zeit an
AUH_MIN DS 1 ;vor letztem Lesen
AUH_STU DS 1
AUH_WOT DS 1
AUH_TAG DS 1
AUH_MON DS 1
AUH_JAR DS 1

WECK_ST DS 1 ;=&00 ==> keine Weckzeit // &FF ==> Alarm aktiv
WECK_ZS DS 1 ;Sekunde Weckzeit
WECK_ZM DS 1 ;Minute
WECK_ZH DS 1 ;Stunde

BILD_SS DS 2 ;Start-Adr Bildschirm-Schoner
BILD_RB DS 1 ;RAM-Block Bildschirm-Schoner
BILD_ST DS 1 ;=&00 ==> kein Bild-Schoner // &FF ==> BSS aktiv

L_RAM DS 1 ;Nummer des E-RAMs in dem das untere RAM (&0-&3FFF) gepuffert wird
           ;= 0 ==> kein Puffer // = &C0, &C4-&FF => phys.E-RAM (L-RAM Puffer)

BORDER DS 1 ;Hardware-Farb-Wert Rand

INK_0 DS 1 ;Hardware-Farb-Wert INK 0 (Untergrund)
INK_1 DS 1 ;Hardware-Farb-Wert INK 1 (Stift 1)
INK_2 DS 1 ;Hardware-Farb-Wert INK 2 (Stift 2)
INK_3 DS 1 ;Hardware-Farb-Wert INK 3 (Stift 3)

BSS_WW DS 2 ;BSS Wiederlade-Wert
BSS_WA DS 2 ;BSS Wert aktuell

HGB_RB DS 1 ;RAM &C4..&FF, 16KB Hintergrundbild (Mode 2)
HGB_ST DS 1 ;HinterGrundBild Status, &00 => kein Bild, &FF => Bild

FDC_ERR DS 2 ;Adr. FDC765-Fehler-Behandler
FDE_RAM DS 2 ;phys.Fehler-Behandler-RAM, gefolgt von &7F.

X4RXE DS 1 ;Bit 7 = 0 kein E-RAM oberhalb des 512 KB Standard E-RAMs (&7Fxx)
           ;      = 1 mehr als 512 KB E-RAM am CPC!
;---------/
;
;Bits 6,5 sind reserviert
;
;Bit 4 = 0 kein E-RAM an &7EC4-7 adressierbar
;      = 1 64KB E-RAM an &7EC4-7 adressierbar
;
;Bit 3 = 0 kein E-RAM durch &7EFx adressierbar
;      = 1 E-RAM durch &7EFx adressierbar
;
;Bit 2 = 0 kein E-RAM &7EEx
;      = 1 E-RAM &7EEx vorhanden
;
;Bit 1 = 0 kein E-RAM &7EDx
;      = 1 E-RAM &7EDx vorhanden
;
;Bit 0 = 0 kein E-RAM &7ECx
;      = 1 E-RAM &7ECx vorhanden

X4RDC DS 1 ;Bit 7 = 0 kein E-RAM &7CFx
           ;      = 1 E-RAM &7CFx vorhanden
;---------/
;Bit 6 = 0 kein E-RAM &7CEx
;      = 1 E-RAM &7CEx vorhanden
;
;Bit 5 = 0 kein E-RAM &7CDx
;      = 1 E-RAM &7CDx vorhanden
;
;Bit 4 = 0 kein E-RAM &7CCx
;      = 1 E-RAM &7CCx vorhanden
;
;Bit 3 = 0 kein E-RAM &7DFx
;      = 1 E-RAM &7DFx vorhanden
;
;Bit 2 = 0 kein E-RAM &7DEx
;      = 1 E-RAM &7DEx vorhanden
;
;Bit 1 = 0 kein E-RAM &7DDx
;      = 1 E-RAM &7DDx vorhanden
;
;Bit 0 = 0 kein E-RAM &7DCx
;      = 1 E-RAM &7DCx vorhanden

X4RBA DS 1 ;Bit 7 = 0 kein E-RAM &7AFx
           ;      = 1 E-RAM &7AFx vorhanden
;---------/
;Bit 6 = 0 kein E-RAM &7AEx
;      = 1 E-RAM &7AEx vorhanden
;
;Bit 5 = 0 kein E-RAM &7ADx
;      = 1 E-RAM &7ADx vorhanden
;
;Bit 4 = 0 kein E-RAM &7ACx
;      = 1 E-RAM &7ACx vorhanden
;
;Bit 3 = 0 kein E-RAM &7BFx
;      = 1 E-RAM &7BFx vorhanden
;
;Bit 2 = 0 kein E-RAM &7BEx
;      = 1 E-RAM &7BEx vorhanden
;
;Bit 1 = 0 kein E-RAM &7BDx
;      = 1 E-RAM &7BDx vorhanden
;
;Bit 0 = 0 kein E-RAM &7BCx
;      = 1 E-RAM &7BCx vorhanden

X4R98 DS 1 ;Bit 7 = 0 kein E-RAM &78Fx
           ;      = 1 E-RAM &78Fx vorhanden
;---------/
;Bit 6 = 0 kein E-RAM &78Ex
;      = 1 E-RAM &78Ex vorhanden
;
;Bit 5 = 0 kein E-RAM &78Dx
;      = 1 E-RAM &78Dx vorhanden
;
;Bit 4 = 0 kein E-RAM &78Cx
;      = 1 E-RAM &78Cx vorhanden
;
;Bit 3 = 0 kein E-RAM &79Fx
;      = 1 E-RAM &79Fx vorhanden
;
;Bit 2 = 0 kein E-RAM &79Ex
;      = 1 E-RAM &79Ex vorhanden
;
;Bit 1 = 0 kein E-RAM &79Dx
;      = 1 E-RAM &79Dx vorhanden
;
;Bit 0 = 0 kein E-RAM &79Cx
;      = 1 E-RAM &79Cx vorhanden

X4RAM DS 28 ;Hat der CPC mehr als 512 KB, so wird dieses RAM so verwaltet...
            ;224 Bits f. je 16 KB RAM, = 0 RAM nicht benutzt, = 1 RAM benutzt
;-----------/
;1.Byte,8.Bit -> Block &7EC4
;1.Byte,7.Bit -> Block &7EC5
;1.Byte,6.Bit -> Block &7EC6
;
;...
;
;28.Byte,3.Bit -> Block &78FD
;28.Byte,2.Bit -> Block &78FE
;28.Byte,1.Bit -> Block &78FF

JT_JH DS 1 ;aktuelles Jahrtausend und Jahrhundert z.B. &20 = 20??
F2AMS DS 1 ; = &FF -> RET zu AmsDOS, sonnst RESET bei ENDE

HEGP2 DS 1 ;Bit 0 = 0 kein Hegotron Grafpad 2 angeschlossen
           ;      = 1 Hegotron Grafpad 2 IST angeschlossen
           ;
           ;Bit 1 = 0 Grafpad ist INaktiv
           ;      = 1 Grafpad ist AKTIV


DS 1 ;reserviert!!!


IDE DS 1 ; = &00 --> Kein IDE Geraet angeschlossen
         ;
;--------/
;Bit 7 = 0 --> IDE8255 selektiert
;      = 1 --> CPC-IDE selektiert
;
;Bit 6 = 0 --> kein IDE8255
;      = 1 --> IDE8255 angeschlossen
;
;Bit 5 = 0 --> kein CPC-IDE
;      = 1 --> CPC-IDE angeschlossen
;
;Bit 4 = 0 --> &00 --> IDE Geraet 0 selektiert (siehe Bit 7)
;      = 1 --> &10 --> IDE Geraet 1 selektiert (siehe Bit 7)
;
;
;Bit 3 = 0 --> CPC-IDE Geraet 0 arbeitet mit LBA 28
;      = 1 --> CPC-IDE Geraet 0 arbeitet mit LBA 48
;
;Bit 2 = 0 --> CPC-IDE Ger.1 nutzt LBA28
;      = 1 --> CPC-IDE Ger.1 nutzt LBA48
;
;Bit 1 = 0 --> IDE8255 Ger.0 nutzt LBA28
;      = 1 --> IDE8255 Ger.0 nutzt LBA48
;
;Bit 0 = 0 --> IDE8255 Ger.1 nutzt LBA28
;      = 1 --> IDE8255 Ger.1 nutzt LBA48

IDE_DEV DS 1 ; = &00 --> Kein IDE Geraet angeschlossen
             ;
;------------/
;Bit 7 = 0 --> 
;      = 1 --> 
;
;Bit 6 = 0 --> 
;      = 1 --> 
;
;Bit 5 = 0 --> 
;      = 1 --> 
;
;Bit 4 = 0 --> 
;      = 1 --> 
;
;
;Bit 3 = 0 --> CPC-IDE Geraet 0 absent (Master)
;      = 1 --> CPC-IDE Geraet 0 betriebsbereit
;
;Bit 2 = 0 --> CPC-IDE Ger.1 absent (Slave)
;      = 1 --> CPC-IDE Ger.1 betriebsbereit
;
;Bit 1 = 0 --> IDE8255 Ger.0 absent
;      = 1 --> IDE8255 Ger.0 betriebsbereit
;
;Bit 0 = 0 --> IDE8255 Ger.1 absent
;      = 1 --> IDE8255 Ger.1 betriebsbereit

IDE_RAM DS 1 ;16 KB RAM als Hard-Disc Cache &C4..&FF

IDE_SECNT DS 1 ;Sector Count (### bisher NICHT benutzt)

IDE_00_07 DS 1 ;4/6 Bytes die auf aktuellen 512 Byte LBA(28/48) Sektor zeigen
IDE_08_15 DS 1
IDE_16_23 DS 1 ;LBA28 nutzt IDE_00_07 bis IDE_24_31 (4 Bytes)
IDE_24_31 DS 1

IDE_32_39 DS 1 ;LBA48 nutzt IDE_00_07 bis IDE_40_47 (6 Bytes)
IDE_40_47 DS 1

;Uhr-Daten schreiben
;-------------------
;DE=8 Bytes in.Page, Dobb.komp
;Mani; AF,BC,E,HL,BC',DE',HL'
;AKT_ROM aktiv

SUHR EXX

 LD BC,(UHR_ROM):OUT (C),C
 LD A,(&C004)
 LD DE,&C000
 LD HL,&C001
 CALL KOAS
 CALL KOAS
 EXX
 LD BC,&0800
 LD H,&C0

SUGL LD A,(DE):SCF
SUNB RR A:JR Z,SUZZ

 LD L,C
 RL L
 LD L,(HL)
 JR SUNB

SUZZ INC E

 DJNZ SUGL
 LD BC,(AKT_ROM):OUT (C),C
 RET

ZZEND DS 0 ;muss &BC00 sein !!!

LIST
DUMP
