.z80 ;================================================================ ;CP/M 2.2 f}r vortex-Speichererweiterung: Systeminitialisierung ;Datei: OSC4BOOT.MAC - Version 02-Jan-88 ;Includes: OSC4CONS.MAC ;Urversion erzeugt mit Hilfe von DISZ80.COM aus $OSC.SYS ; + RamDisk nur formatieren, falls leer und nicht abgebrochen ; + viele Einstellm|glichkeiten ; + CP/M - Autokommando auf Wunsch nur wenn RamDisk formatiert ; + deutsche Tastatur/Zeichensatz getrennt w{hlbar ; + durch umbenennen in allen Betriebssystemen startbar: ; aus Amsdos/Kassette als .BIN, beim Booten als $OSC.SYS ; aus 44K CP/M 2.2 und 62K CP/M 2.2 als .COM ; + Wahlweise Uhrzeit und Datumsabfrage beim Booten ; + Bildschirmfarben einstellbar ; + Wahlweises anh{ngen einer Funktionstastenbelegung ; + ESC und CLR CP/M-gerecht belegt ; + RamDisk Directory+Blockgr|~e an Speicher angepa~t public X_Move,X_Back,X_Retn,X_Jump,X_Firm public X_Halt,X_Cons,X_Time,X_Buff extrn dosanf,dosend extrn bankst,banken extrn L8142,CurBlk,ConTic,CurSpd,nkmw,nkmr,kmread extrn RomInt,L815A,L81CB,RamIni,L856C,kbreak,ibreak,xbreak,klevnt extrn motevn,motswt,LBE44,LBE46,printw,autobuf,FrmGate,autoclr extrn spdis,ccpcom,ccpanf,quelle,mcsend,mcwait,UhrCnt,Uhrevt,UhrTic extrn charus,chargr,cwrite,matrix extrn esctst,clrelp,lfp,newlf,paper,pen,turn,setvid extrn biosst,biosen extrn Intrpt,HigDrv,LFBA7,Stepsp,DrvAdr,vrttyp,amstyp extrn LF5ED,LFBAB,higdr2,errdrv,biosv,LFB8B extrn LFBAC,LFE2C,LFE7C,LFECC,LFEFC .XLIST include OSC4CONS.MAC .LIST codestart: ;****** Voreinstellungen des Bios: beim Booten instflg:defb 0FFh ;0FFh -> BankCpm ist installiert Xdpb_A: defw 0024h ;Disk Parameter Block (DPB) Drive A defb 5,1Fh,3 defw 00B0h,007Fh defb 80h,0 defw Drive_CKS,0002h defb 1,9,2Ah,52h,0E5h,2,4 ;XDPB Drive A defb 4Fh,4Fh,0Dh Xdpb_B: defw 0024h ;Disk Parameter Block (DPB) Drive B defb 5,1Fh,3 defw 00B0h,007Fh defb 80h,0 defw Drive_CKS,0002h defb 1,9,2Ah,52h,0E5h,2,4 ;XDPB Drive B defb 4Fh,4Fh,0Dh .COMMENT @ ;Amstrad-DPB defw 0024h ;Disk Parameter Block (DPB) Drive B defb 3,7,0 defw 00AAh,003Fh defb 0C0h,0 defw 0010h,0002h defb 41h,9,2Ah,52h,0E5h,2,4 defb 27h,27h,20h @ colors: defb 0,0,0,0,26,26 ;Border/Border,Paper/Paper,Pen/Pen formw: defw 600 ;verzoegerung beim RamDisk-formatieren settime:defb 0FFh ;0FFh -> beim Booten Uhrzeit abfragen stline: defb 0FFh ;0FFh -> Statuszeile eingeschaltet charset:defb 0FFh ;0FFh -> deutsche Umlaute keyb: defb 0FFh ;0FFh -> deutsche Tastatur keytab: defw 0 ;evtl. Adr. von Funktionstastentabelle ;****** Voreinstellungen des Bios: im residenten Segment SysVek: DEFB 0FFH ;0FFH -> Systemvektor aktiv mesbios:DEFB 0FFH ;0FFH -> Bios-Meldungen unterdr}cken RetryC: defb 8 ;Wiederholungszahl bei R/W-Fehler headset:defb 1Eh ;Kopfberuhigungszeit StepC: defb 44h ;Steprate Drive A und B DrvAd: defb 2 ;Ger{teadresse externes Drive vrtt: defb 0Ch ;Drive-Typ, Vortex amst: defb 00h ;Drive-Typ, Amstrad ;****** Voreinstellungen des Bios: im gebankten Segment mtimeon:DEFW 50 ;Diskettenmotor-Anlaufverz|gerung mtimeof:DEFW 150 ;Diskettenmotor-Abschaltverz|gerung prtw: defw 4500 ;Wartezeit bis Printer-Timeout auftritt blinker:DEFB 8 ;Cursor-Blinkperiode, 0-> Blinkt nicht clock: defb 50 ;Geschwindigkeit der Uhr splock: DEFB 0 ;0FFH -> kein Spooler m|glich (= 32 KB mehr RamDisk) spset: DEFB 0 ;0FFH -> Spooler an autocom:DEFB 0FFH ;0 -> CCP Auto-Kommando nur beim ersten Warmstart autofor:DEFB 0 ;0 -> CCP-Auto-Kommando nur, wenn RamDisk formatiert zmatrix:db 03ch,060h,03ch,066h,066h,03ch,006h,03ch ;Zeichenmatrizen db 0c6h,038h,06ch,0c6h,0feh,0c6h,0c6h,000h ;deutsche Zeichen db 0c6h,038h,06ch,0c6h,0c6h,06ch,038h,000h ;'@[\]^{|}~' db 0c6h,000h,0c6h,0c6h,0c6h,0c6h,07ch,000h db 010h,038h,06ch,0c6h,000h,000h,000h,000h db 06ch,000h,078h,00ch,07ch,0cch,076h,000h db 06ch,000h,03ch,066h,066h,066h,03ch,000h db 06ch,000h,000h,0c6h,0c6h,0c6h,07eh,000h db 01ch,036h,066h,06ch,066h,066h,0cch,000h ;****** Meldetexte titel: db 'BANKCPM 2.1 29-Jan-89 Copyright (c) 1986 Helmut Tischer',13,10 db ' (fuer Schneider CPC mit vortex-Speichererweiterung)',13,10,10,0 noinst: db 'Fehler: nicht installiert.',13,10,'HALT',0 asctim: db 'Zeit/Datum? (SS:MM:ss TT.MM.JJ) ',0 backsp: db 8,' ',8,0 crlf: db 13,10,0 text: db 7,'Tastendruck -> Ramdisk-Formatierung verhindern',13,10,0 schlaf: db 11,'Ramdisk Formatiert.',18,13,10,0 ;****** richtige Programmumgebung zum Booten anwh{hlen (FirmWare-Modus) anfang: ld a,(Cpm_BiosEntry) cp 0C3h ;OpCode Sprungbefehl (WBoot-Einsprung) jr nz,stexec ;CP/M nicht aktiv ld hl,0 add hl,sp ;Stackpointer holen ld a,h cp 0C0h ;Stapel im ROM-Bereich -> 62K CP/M aktiv jr nc,cpm62 call Sys_FirmEntry dw stexec ;CP/M 44 Firmware-Aufruf cpm62: ld de,stexec+3 push de ;Routinenadresse f}r Firmware-Aufruf ld hl,0F433h ;Sysvektor-Einsprung im BIOS suchen snext: ld a,(hl) ;(Beginnt mit ex (sp),hl! ld (004Fh),hl) snext2: inc hl cp 0E3h ;Opcode ex (sp),hl jr nz,snext ld a,(hl) cp 22h ;Opcode ld (nn),hl jr nz,snext2 dec hl ;HL ist Adresse Systemvektoreinsprung jp (hl) stexec: ld c,0FFh ;Rom-Konfiguration: alle ROMs aus ld hl,exec ;Startadresse des Programms jp MC_START_PROGRA ;###### BankCpm laden und initialisieren ;****** Farben und Bildschirmmodus exec: xor a ;Diskettenmotoren abschalten ld bc,Port_Motor out (c),a ld bc,(colors) call SCR_SET_BORDER ld bc,(colors+2) xor a call SCR_SET_INK ld bc,(colors+4) ld a,1 call SCR_SET_INK ;****** Zeropage ld hl,Drive_RamDiskNr*256+81h ld (Cpm_Devices),hl LD HL,L022E LD DE,Sys_Banking LD BC,L022Eend-L022E LDIR ;****** gebanktes Bios-Segment LD HL,bankst ;]bertragen und aktivieren LD DE,Sys_BnkBios LD BC,banken-bankst LDIR ld hl,(mtimeon) ;Voreinstellungen ld (LBE44),hl ld hl,(mtimeof) ld (LBE46),hl ld hl,(prtw) ld (Printw),hl ld a,(blinker) ld (CurSpd),a ld a,(splock) ld (spdis),a inc a jr z,spoff LD A,(spset) spoff: LD (L8142),A ld a,(autocom) ld (ccpcom),a ld hl,zmatrix ld de,matrix ld bc,72 ;9 deutsche Sonderzeichen ldir ;****** schnelle Zeichenausgabe in System einbauen ld hl,(TXT_WRITE_CHAR+1) ;schnelle Zeichenausgabe ld (cwrite+1),hl ld hl,charus ld a,(charset) and a jr z,setgr ld hl,chargr setgr: ld (TXT_WRITE_CHAR+1),hl ;****** Steuerzeichentabelle erweitern: ;Rudiment{re Heath/Zenith-Simulation call txt_get_control ;Adresse Steuerzeichentabelle ex de,hl ;nach DE ld hl,3*14 add hl,de ld (hl),1 inc hl ld bc,paper ld (hl),c inc hl ld (hl),b ld hl,3*15 add hl,de ld (hl),1 inc hl ld bc,pen ld (hl),c inc hl ld (hl),b ld hl,3*24 add hl,de ld (hl),0 inc hl ld bc,turn ld (hl),c inc hl ld (hl),b ld hl,3*25 ;^Y add hl,de ld (hl),1 inc hl ld bc,setvid ld (hl),c inc hl ld (hl),b ld hl,3*27 ;esc add hl,de ;HL -> Tabellensatz ESC ld (hl),1 ;Ein Parameter inc hl ld bc,esctst ;Adresse der ESC-Routine ld (hl),c inc hl ld (hl),b ;in Tabellensatz eintragen ld hl,18*3+1 ;Adresse des Pointers auf CLREOL-Routine add hl,de ld c,(hl) inc hl ld b,(hl) ld (clrelp+1),bc ;alte CLREOL-Routine in Erweiterung Eintragen ld hl,3*0Ah+1 add hl,de ld c,(hl) inc hl ld b,(hl) ld (lfp+1),bc ld bc,newlf ld (hl),b dec hl ld (hl),c ;****** Uhr aktivieren ld hl,UhrEvt ld de,UhrCnt ld b,81h call KL_INIT_EVENT ld hl,UhrTic ld a,(clock) ld c,a ld b,0 ld e,c ld d,b call KL_ADD_TICKER ld hl,CurBlk ld de,ConTic ld b,81h call KL_NEW_FRAME_FL ;****** Tastatur einstellen call KM_INITIALIZE ;deutsche Tastenbelegung ein/aus ld hl,ctast ;Tasten ESC und CLR CP/M-gerecht belegen call tastlp ld a,(keyb) and a jr z,noger ld hl,dtast call tastlp ld a,(KM_READ_CHAR) ld hl,(KM_READ_CHAR+1) ld (kmread),a ld (Kmread+1),hl ld hl,neukey ld de,KM_WAIT_CHAR ld bc,neukeyx-neukey ldir noger: ;****** Bildschirm einstellen ld a,(instflg) ;Programm installiert? and a jr z,noins1 ld a,(stline) inc a jr z,stlon noins1: ld a,2 call SCR_SET_MODE jr stloff stlon: ld a,1Bh call TXT_OUTPUT ld a,'E' call TXT_OUTPUT stloff: ld hl,titel call txtout ld a,(instflg) and a jr nz,instgo ld hl,noinst call txtout di halt instgo: ;****** derzeitigen Gate-Array Zustand merken di exx ld (FrmGate),bc exx ei ld a,(settime) and a jr z,notime ld hl,asctim call txtout ld hl,X_Buff ;Zeichenketten-Position ld b,0 ;Zeichen im Puffer inplp: push bc push hl call Sys_BnkBios+54h pop hl pop bc cp 7Fh ;Zeichen l|schen jr nz,nodel ld a,b and a jr z,inplp dec b dec hl push hl ld hl,backsp call txtout pop hl jr inplp nodel: cp ' ' jr c,inpend ld (hl),a inc hl inc b push hl push bc ld c,a call Sys_BnkBios+0Ch pop bc pop hl jr inplp inpend: ld (hl),0 ld hl,crlf call txtout ld de,X_BUFF call gettime ;Uhrzeit lesen notime: ld a,(dosanf-0980h+0987h) ;Kommandol{nge ld (comlen),a ;restaurieren bei RamDisk-format ld a,(autofor) and a jr nz,immera ;Auto-Kommando zun{chst l|schen ld (dosanf-0980h+0987h),a immera: ;****** Ram-Konfiguration feststellen+Ramdisk initialisieren CALL RamIni ;vorhandene RamBanks suchen LD A,(L856C) LD C,0 LD B,8 L0176: RLCA JR NC,L017A INC C L017A: DJNZ L0176 ;C := Anzahl der vorhandenen Banks ld a,(splock) rra ;bei gesperrtem Spooler 1/2 Bank mehr ld a,c dec a ;eine Bank f}r Betriebssystem adc a,a ;halbe Banks f}r die RamDisk and a ld c,2 ;maximale Laufwerksnummer+1 jp z,L0195 ;keine RamDisk da L0187: ADD A,A ;16 Bloecke pro halber Bank ADD A,A ADD A,A ADD A,A ;Anzahl der 2KB-Bl|cke cp 129 jr nc,bigblk add a,a ;nur 1 KB lange Bl|cke ld hl,dpbblm dec (hl) inc hl srl (hl) inc hl srl (hl) bigblk: dec a ;maximale Blocknummer LD (L0244),A ld bc,7FF0h ;Directory+Alv add a,a jr c,istdir ld bc,3FC0h add a,a jr c,istdir ld bc,1F80h ;Directoryeintr{ge istdir: ld a,b ld (dpbdir),a ld a,(dpbblm) cp 4 jr nz,no2k ;2KB-Bl|cke? ld c,0C0h ;dann nur 2 Dir-Bl|cke no2k: ld a,c ld (dpb_al0),a ld a,2 ;Lesen (RamDisk initialisieren) ld bc,0 ;Sektor 0/Track 0 ld de,0080h ;an Adresse 0080h call Sys_BnkBios+39h ;RamDisk-Zugriff ld de,0080h ld hl,ramid ld b,ramidn-ramid ramtst: ld a,(de) cp (hl) jr nz,format inc de inc hl djnz ramtst jr ramok format: ld hl,text call txtout ;Warnung -> Ramdisk formatieren call KL_TIME_PLEASE ex de,hl rwait: ld a,(X_Cons) ;Taste gedr}ckt? and a jr z,norbrk call Sys_BnkBios+54h ;gedr}ckte Taste lesen und abbruch jr rbreak norbrk: push de call KL_TIME_PLEASE pop de and a sbc hl,de ld bc,(formw) ;2 Sekunden warten sbc hl,bc jr c,rwait ld hl,schlaf call txtout call Sys_BnkBios+5Dh ;Ramdisk formatieren ld a,(comlen) ld (dosanf-0980h+0987h),a;Kommandol{nge wieder eintragen ld a,0FFh ld (ramform),a rbreak: ld a,2 ;Lesen (RamDisk initialisieren) ld bc,0 ;Sektor 0/Track 0 ld de,0080h ;an Adresse 0080h call Sys_BnkBios+39h ;RamDisk-Zugriff ld hl,ramid ld de,0080h ld bc,ramidx-ramid ldir ld b,32-ramidx+ramid xor a ramclr: ld (de),a ;RamDisk markieren inc de djnz ramclr xor a ld bc,0 ld de,0080h call Sys_BnkBios+39h ;RamDisk markieren ramok: LD c,3 ;maximale Laufwerksnummer+1 L0195: ld a,c ld (maxdrive),a ;Stapel wird beim Speicherl|schen zerst|rt! cp 3 ;a -> maxdrv+1, cy->keine RamDisk jr c,nopat ;Disk weiterhin auf A einloggen ld hl,(dosanf-0980h+1E0Ch) ;Bdos/CCP anpassen ld de,-32AFh ;Opcode XOR A!LD (nn),a add hl,de ;eventuell Z80DOS? ld a,h or l jr nz,altcpm ;kein Original CP/M 2.2 ld hl,(dosanf-0980h+1E0Eh) ;Default-Login von der Ramdisc ld (dosanf-0980h+1E0Fh),hl ld hl,Drive_RamDiskNr shl 8 + 3Eh ;Opcode LD A, ramdiscnr ld (dosanf-0980h+1E0Ch),hl ld a,32h ;Opcode ld (nn),a ld (dosanf-0980h+1E0Eh),a ld hl,802Eh ;Opcode LD L,80h ld (dosanf-0980h+1E11h),hl altcpm: xor a ;$$$.SUB auf der Ramdisk suchen ld h,a ld l,a ld (dosanf-0980h+0AC6h),a ld (dosanf-0980h+0AC7h),hl ld (dosanf-0980h+0B66h),a ld (dosanf-0980h+0B67h),hl ld a,Drive_RamDiskNr+1 ld (dosanf-0980h+112Ch),a nopat: ld hl,(dosanf-0980h+0981h) ;CCP-Ausf}hrungsanfang ld de,-035Ch add hl,de ;Anfangsadresse CCP zur Laufzeit ld (ccpanf+1),hl ;in BIOS eintragen (max. MOVCPM 250) ld hl,dosanf ld de,quelle ld bc,dosend-dosanf ldir ld l,e ;Speicher l|schen ld h,d inc de ld (hl),'%' ld bc,Sys_FirmArea-quelle+dosanf-dosend-1 ldir ld hl,Sys_FirmExp ld e,l ld d,h ld (hl),0 inc de ld bc,Sys_FirmStack-Sys_FirmExp-1 ldir LD HL,L81CB ;interne Initialisierung LD DE,L815A ;Motor-Tickerblock LD B,81H CALL KL_INIT_EVENT ld hl,motevn ld de,motswt ld b,81h call KL_INIT_EVENT ;****** Funktionstasten einstellen xor a ld (autobuf),a ld hl,(keytab) ld a,h or l jr z,nofunc call tastlp call nokey call txtout ld a,(hl) ;0FFh -> nur, wenn RamDisk formatiert inc hl and a jr z,setcom ld a,(ramform) and a jr z,nofunc setcom: ld a,(hl) inc hl ld (autoclr),a ld de,autobuf ld bc,Drive_RecordLen ldir nofunc: ;****** SHIFT_CTRL_ESC abfangen ld hl,ibreak ;Event-Block ld de,xbreak ;Routine, die bei SHIFT-CTRL-ESC auszuf}hren ld b,81h ;Priority, Near-Adress call KL_INIT_EVENT ;zur Ausf}hrung vorbereiten ld hl,(KL_EVENT+1) ;ROM-Adresse von KL_EVENT feststellen ld a,h ;(weil in KM_TEST_BREAK Interrupts and 3Fh ; nicht erlaubt sind) ld h,a ld (klevnt+1),hl ;in KM_TEST_BREAK einpatchen ld hl,ascrom ;Routine zum Word aus ROM lesen ld de,ascrom-ascromx+Sys_BnkBios ld bc,ascromx-ascrom ldir ld hl,(KM_TEST_BREAK+1) ;alte SHIFT_CTRL_ESC-Routine inc hl ;hier steht Key-State-TAble-Adr call ascrom-ascromx+Sys_BnkBios ld (kbreak+1),hl ;in neue Test_BREAK eintragen ld hl,kbreak ld (KM_TEST_BREAK+1),hl ;neue Test_Break aktivieren ld hl,mcwait ld (MC_WAIT_PRINTER+1),hl ld a,0C3h ld hl,mcsend ld (MC_SEND_PRINTER),a ld (MC_SEND_PRINTER+1),hl ld a,(maxdrive) ;h|chste Laufwreks-Nummer ;****** Residentes Bios-Segment ;Eingabe: maximale Laufwerksnummer DI ld bc,Port_Gate or 0E0h ;High-RAM einschalten out (c),c LD HL,BiosSt LD DE,Sys_ResBios LD BC,BiosEn-BiosSt LDIR ld de,biosv ld hl,Sys_ResBios ld bc,0033h ldir ;Bios-Vektor kopieren LD HL,(Sys_IntrptStart) LD (RomInt+1),HL LD HL,Intrpt LD (Sys_IntrptStart),HL LD SP,0 ei ld (higdrv+1),a ;maximale Laufwerksnummer ld (higdr2+1),a dec a jr nc,ramda xor a ramda: ld (errdrv+1),a LD A,(SysVek) LD (LF5ED),A ld a,(mesbios) LD (LFBAB),A ld a,(Retryc) ld (LFBA7),a ld a,(headset) ld (LFB8B),a ld a,(stepc) ld (stepsp),a ld a,(drvad) ld (drvadr+1),a ld hl,(vrtt) ld a,l and 0Ch or 01h ld (vrttyp),a ld a,h and 0Ch ld h,a rra rra and 02h or h or 20h ld (amstyp),a LD bc,LFECC+16 ;DPH B LD DE,LFE7C ld hl,Xdpb_B CALL L01FE LD bc,LFECC ;DPH A LD DE,LFE2C ld hl,Xdpb_A CALL L01FE LD HL,L023F LD DE,LFEFC LD BC,L023Fend-L023F LDIR LD HL,L024E LD DE,LFECC+32 ;DPH C LD BC,L024Eend-L024E LDIR ;****** Warmstart ausf}hren ld hl,(Sys_ResBios+04h) ;WBoot-Einsprung push hl ld hl,Sys_FirmArea ld d,h ld e,l ld (hl),'`' inc de ld bc,Sys_ResBios+33h-Sys_FirmArea-1 ldir ret ;###### Datenpuffer eines Laufwerks initialisieren L01FE: PUSH DE PUSH bc LD BC,Xdpb_B-Xdpb_A LDIR LD C,E LD B,D POP HL LD (HL),0 INC HL LD (HL),0 LD DE,7 ADD HL,DE LD DE,LFBAC LD (HL),E INC HL LD (HL),D INC HL POP DE LD (HL),E INC HL LD (HL),D INC HL LD (HL),C INC HL LD (HL),B INC HL EX DE,HL LD HL,Drive_CKS ADD HL,BC EX DE,HL LD (HL),E INC HL LD (HL),D RET txtout: ld a,(hl) inc hl and a ret z push bc push de push hl ld c,a call Sys_BnkBios+0Ch pop hl pop de pop bc jr txtout ;****** Tabelle mit Tastenbelegungen verarbeiten tastlp: ld a,(hl) inc hl inc a ret z dec a ld b,(hl) inc hl push af push hl call KM_SET_TRANSLAT pop hl pop af ld b,(hl) inc hl push af push hl call KM_SET_SHIFT pop hl pop af ld b,(hl) inc hl push hl call KM_SET_CTRL pop hl jr tastlp ;****** Expansionsstrings setzen (Funktionstasten) nokey: ld a,(hl) inc hl inc a ret z ;Adresse des Belegungsnamen wird in HL zur}ckgegeben dec a ld c,(hl) inc hl push hl ld b,0 add hl,bc ex (sp),hl ld b,a Call KM_SET_EXPAND pop hl jr nokey ;****** Word aus ROM bei HL lesen ascrom: call KL_L_ROM_ENABLE push af ld e,(hl) inc hl ld d,(hl) ex de,hl ;HL := (HL) aus ROM pop af jp KL_ROM_RESTORE ascromx: ;****** Uhrzeit und Datum aus Zeichenkette in CP/M-Format kovnertieren ;Eingabe: DE:= Zeichenkettenadresse, abgeschlossen durch 0 gettime:ld bc,X_Time+2 call skipspace ret z ;Zeichenkette Zuende call getbcd ;ld (bc),a! inc bc!ld a,(de)! inc de! cp ':' jr nz,timeend ;Zeit fehlt call getbcd jr nz,timeend ;Minute fehlt call getbcd ;Sekunde fehlt? timeend:call skipspace ret z ;Zeichenkette Zuende call getint ;a := Zahl aus DE-String (Tag) ret nz ;falscher Delimiter (auch Stringende ohne Zahl) ld l,a ld h,0 call getint ;Monat ret nz ld (mon),a ;aktueller Monat push de ;StrPos ld de,montab monlp: dec a jr z,monend ex de,hl ld c,(hl) inc hl ex de,hl ld b,0 add hl,bc jr monlp monend: pop de call getint cp 78 jr nc,taus2 ;kleiner als 78 add a,low 2000 ; -> sp{ter als Jahr 1999 taus2: cp 100 ;kleiner als 100 jr nc,taus ; -> auf Vierstellig erg{nzen add a,low 1900 taus: sub low 1976 ;Jahre seit 1976 ld c,a ;C := Jahre seit 1976 rra rra and 3fh ld e,a ;Anzahl der Schaltjahre ld a,c and 3 ;dieses Jahr Schaltjahr jr nz,noswj ld a,(mon) ;Januar oder Februar? cp 3 jr nc,noswj dec e ;dann Korrektur f}r dieses Jahr unwirksam noswj: ld d,0 add hl,de ;Schaltjahr-Korrektur ld a,c sub 2 ;A := Jahre seit 1978 jr z,diesj ld de,365 nxtj: add hl,de dec a jr nz,nxtj diesj: ld (X_Time),hl ret ;Ab TimePos befindet sich Uhrzeit und Datum im Speicher skipspace: ld a,(de) cp 9 jr z,skp cp ' ' jr z,skp and a ret skp: inc de jr skipspace getint: push hl ld l,0 intlp: ld a,(de) sub '0' cp '9'+1 jr nc,noziff inc de ld h,a ld a,l add a,a ld l,a add a,a add a,a add a,l add a,h ld l,a jr intlp noziff: ld a,(de) inc de cp '.' ld a,l pop hl ret getbcd: push hl ld l,0 bcdlp: ld a,(de) sub '0' cp 0ah jr nc,notz inc de ld h,a ld a,l add a,a add a,a add a,a add a,a or h ld l,a jr bcdlp notz: ld a,(de) inc de cp ':' ld a,l pop hl ld (bc),a inc bc ret ;****** Einspr}nge f}r neue KM_READ_CHAR, KM_WAIT_CHAR neukey: jp nkmw jp nkmr neukeyx: L022E: .PHASE Sys_Banking X_Move: OUT (C),C EXX LDIR EXX X_Back: LD C,A X_Retn: OUT (C),C RET X_Jump: OUT (C),C JP Sys_BnkBios X_Firm: DEFS 2 X_Halt: out (c),c jp Sys_ResBios+60h ;Break-Stackmanipulation ausf}hren X_Cons: defb 0 X_Time: defw 0 ;31. Dezember 1977 -> ung}ltiges Datum defb 0,0,0 ;00:00:00 X_Buff EQU Sys_Banking+40h .DEPHASE L022Eend: comlen: defs 1 maxdrive: defs 1 mon: defs 1 ramform: defb 0 ;0FFh -> RamDisk wurde formatiert montab: db 31,28,31,30,31,30,31,31,30,31,30,31 ramid: db 20h,'RAMDISK ' ramidn: db ' ',1,0,0,0 ramidx: L023F: DEFW 0020h ;RamDisk-DPB, SPT dpbblm: DEFB 4,0FH,1 ;EXM,BSH,BSM L0244: DEFw 0 ;DskSize je nach Ausbau dpbdir: DEFW 007Fh ;DirSize dpb_al0:DEFB 0C0H,0 ;ALV DEFW 0,0 ;CKS,OFF L023Fend: L024E: DEFW 0,0,0,0 ;RamDisk-DPH DEFW LFBAC,LFEFC,0,LFEFC+L023Fend-L023F L024Eend: ;****** CP/M-gerechte Belegung von ESC und CLR ctast: db 66,26,26,252 ;ESC -> ESC/ESC/Basic-ESC db 16,8,8,8 ;CLR -> ^H/^H/^H db 255 ;****** Deutsche Tastenbelegung dtast: db 17,'+','*',255 db 19,'#','^',30 db 22,'<','>',255 db 24,'''','`',255 db 25,'~','?',255 db 26,'}',']',29 db 28,'{','[',27 db 29,'|','\',28 db 30,'-','_',31 db 31,'.',':',255 db 32,'0','=',255 db 39,',',';',255 db 41,'7','/',255 db 43,'z','Z',26 db 57,'3','@',0 db 65,'2','"',255 db 71,'y','Y',25 db 255 defs codestart-$-3 AND 0FFH ;================================================================ END anfang