.z80 ;================================================================ ;CP/M 2.2 f}r vortex-Speichererweiterung: residenter Bios-Teil ;Datei OSC4BIOS.MAC - Version 02-Jan-89 ;Includes: OSC4CONS.MAC ;Urversion erzeugt mit Hilfe von DISZ80.COM aus $OSC.SYS ; + rasante Konsolenstatus-Abfrage ; + Firmware-Aufruf kompatibel zu CP/M plus ; + Z80Dos-kompatible Uhrzeit verf}gbar ; + 80Spur/DS-Formate und 3. Laufwerk auch bei Amstrad-Controller ; + speziell f}r unsaubere Programme: BC' restauriert beim Warmstart ; + richtige Anzahl von Recalibrates bei Diskettenfehler ; + Sektorpuffer bei Warmstart nicht mehr zur}ckschreiben ; + sowieso unwirksame Drivetiming-Wahl entfernt ; + verschiebbarer Sektorpuffer (-> z.B. 1024 Bytes lange Sektoren) ; + Doublestep f}r 40Track Disketten in 80Track-Laufwerken ; durch setzen von Bit 1 im Flagbyte des XFCB ; + XLT-Tabellen erlaubt ; + Bis zu 416 Bl|cke und 128 gepr}fte Directoryeintr{ge pro Drive public biosst,biosen public romint ;(romint+1) ->Firmware-Interrupt eintragen public HigDrv ;(HigDrv+1) -> H|chste Laufwerksnummer+1 public higdr2 ;(Higdr2+1) -> H|chste Laufwerksnummer+1 public errdrv ;(errdrv+1) -> Laufwerk nach Select-Error public DrvAdr ;(DrvAdr+1) -> Ger{teadresse externes Drive public LF5ED ;0FFH -> Systemvektor aktiv public LFBAB ;0FFH -> Bios-Meldungen unterdr}cken public LFB8B ;Kopfberuhigungszeit public LFBA7 ;RetryCnt bei Lesefehler public stepsp ;Steprate extern/internes Drive public vrttyp public amstyp ;Drive-Typ, Bit2: Double Sided, Bit3: 80 Track public Intrpt ;Interruptroutine public biosv ;Raum f}r Kopie des Bios-Vektors public LFBAC ;128 Bytes DIRBUV f}r DPHs public LFE2C ;DPB, CSV, ALV Drive A (50h Bytes) public LFE7C ;DPB, CSV, ALV Drive B (50h Bytes) public LFECC ;DPH Laufwerk A, B, C (RamDisk) public LFEFC ;DPB, ALV Drive C (RamDisk) (2Bh Bytes) extrn X_Jump,X_Back,X_Firm,X_Cons,X_Time,X_Buff .XLIST include OSC4CONS.MAC .LIST biosst: .PHASE Sys_ResBios Bios_Boot: JP Boot_Cont ;F609h Bios_WBoot: JP WBoot_Cont ;F48Ch Bios_ConSt: JP ConSt_Cont ;F60Dh Bios_ConIn: JP ConIn_Cont ;F611h Bios_ConOut: JP ConOut_Cont ;F615h Bios_List: JP List_Cont ;F621h Bios_Punch: JP Punch_Cont ;F619h Bios_Reader: JP Reader_Cont ;F61Dh Bios_Home: JP Home_Cont ;F496h Bios_SelDsk: JP SelDsk_Cont ;F491h Bios_SetTrk: JP SetTrk_Cont ;F4A1h Bios_SetSec: JP SetSec_Cont ;F4A6h Bios_SetDma: JP SetDma_Cont ;F4ABh Bios_Read: JP Read_Cont ;F4B8h Bios_Write: JP Write_Cont ;F4B3h Bios_ListSt: JP ListSt_Cont ;F62Ah Bios_SecTran: JP SecTran_Cont ;F4B0h XBios_Spooler: JP Spooler_Cont ;F605h XBios_RamDisk: JP RamDisk_Cont ;F601h XBios_Message: JP Message_Cont ;FA23h XBios_TimeDate: JP TimeDate_Cont ;c=0 ->Zeit lesen, sonst schreiben XBios_SelFormat:JP SelFormat_Cont ;FA8Ah XBios_ReadSec: JP ReadSec_Cont ;F792h XBios_WriteSec: JP WriteSec_Cont ;F799h XBios_FormatTrk:JP FormatTrk_Cont ;F7A0h XBios_SeekTrk: JP SeekTrk_Cont ;F86Ch XBios_DriveStat:JP DriveStat_Cont ;F94Fh XBios_RetryCnt: JP RetryCnt_Cont ;FADDh XBios_FirmCall: JP FirmCall_Cont ;F4BDh XBios_OffMotor: JP OffMotor_Cont ;FA85h XBios_FirmExec: JP FirmExec_Cont ;Firmware-Aufruf wie CP/M plus XBios_AutoKeys: JP AutoKeys_Cont ;Systemvektor fortsetzen SBios_SetBreak: JP SetBreak_Cont ;KM_BREAK merken SysVektor_Cont: EX (SP),HL ;CPC-FirmwareRoutine ausf}hren LD (X_Firm),HL ;Routinenadresse+3 merken POP HL ;HL restaurieren CALL Exec_BankBios defb 57h ;Behandlungsroutine anspringen SetBreak_Cont: ld hl,(LF53E) ;ResBank-Stack dec hl ld (hl),High Sys_BreakEntry dec hl ld (hl),Low Sys_BreakEntry ld (LF53E),hl ;Sprung zum Breakpoint einschieben jp X_Back FirmCall_Cont: DI ;R}ckkehradresse merken, damit EXX ;durch ExecBiosCall kein POP HL ;"FirmJpCont" entsteht PUSH HL INC HL INC HL EX (SP),HL PUSH HL EXX EI Exec_BiosCall: ld (LF4E7),hl pop hl ld (LF4E9),sp ld sp,0 push af ld a,(hl) inc hl ld h,(hl) ld l,a pop af call xbc2 ld sp,(LF4E9) ret xbc2: push hl ld hl,(LF4E7) ret FirmExec_Cont: di ex af,af' exx ld (LF53E-2),hl ld (LF53E-4),de pop hl ld e,(hl) inc hl ld d,(hl) inc hl push hl ld (LF53E),sp ld sp,LF53E-4 jr IntCont Intrpt: di ;***** Interrupt ***** ex af,af' ;IS-Routine in Systembank exx ld (LF53E),sp ld sp,LF53E push hl push de ld de,Sys_IntrptEntry jr IntCont Exec_BankBios: DI ;R}ckkehradresse vom Stapel und dort EX AF,AF' ;gefundenes Datenbyte als Nummer der EXX ;auszuf}hrenden Routine in Sysbank LD (LF53E-2),HL ;interpretieren POP HL LD (LF53E),SP LD SP,LF53E-2 push de LD e,(HL) ld d,High Sys_BnkBios ;Routinenadresse zusammensetzen IntCont: push bc push af romint: ld hl,$-$ ;Rom-Interrupt eintragen ld (Sys_IntrptStart),hl ld bc,Port_Gate or 0C0h ;Expansion-RAM abschalten CALL X_Jump ld hl,Intrpt ld (Sys_IntrptStart),hl pop af pop bc pop de pop hl EXX EX AF,AF' LD SP,(LF53E) EI RET Sel_BankBios: LD (LF530),HL ;Routine Nr. RegL der Systembank CALL Exec_BankBios ;ausf}hren LF530: defs 2 ;Speicher f}r gew{hlte Routinennummer ;=====> DEFS 2 nicht weglassen, denn es kann Interrupt auftreten <===== DEFS 000AH ;Raum f}r Exec_BankBios-Stapel LF53E: DEFS 0002h ;Speicher f}r alten SP LF4E7: DEFS 0002H ;Speicher f}r alten User-HL-Inhalt LF4E9: DEFS 0002H ;Speicher f}r alten User-SP-Inhalt ConSt_Cont: LD a,(X_Cons) ;nichts mehr rechnen bei ConSt ret ConIn_Cont: call Exec_BankBios ;statt fehlender Systemdiskette db 54h ;spezielle Konsoleneingabe !!! ConOut_Cont: call Exec_BankBios db 0CH Reader_Cont: call Exec_BankBios ;statt Bios-Versionsanzeige db 5Ah ;Spezielle Reader-Eingabe !!! Punch_Cont: call Exec_BankBios db 12H ListSt_Cont: call Exec_BankBios db 4EH List_Cont: LD L,4BH CALL Sel_BankBios RET C ;###### Jr WBoot_Cont WBoot_Cont: CALL Exec_BiosCall defw WBoot_Exec Boot_Cont: call Exec_BankBios db 3 ;jetzt Funktionsnummer 1 !!! OffMotor_Cont: call Exec_BankBios db 3CH ;%%%%%% Firmvektor - Fortsetzung 2: Adresslage wie Original Vortex-Bios IF $ ne 0F542h .PRINTX * verschobene Adresslage der Firmvektor-Fortsetzung! * ENDIF EX (SP),HL ;CPC-FirmwareRoutine ausf}hren LD (X_Firm),HL ;Routinenadresse+3 merken POP HL ;HL restaurieren CALL Exec_BankBios defb 57h ;Behandlungsroutine anspringen ;%%%%%% jetzt wieder normal weiter SelDsk_Cont: CALL Exec_BiosCall defw SelDsk_Exec Home_Cont: ld hl,LFB9A ;Drive-Status BIT 7,(HL) JR NZ,LF49F RES 6,(HL) LF49F: LD C,0 SetTrk_Cont: LD A,C LD (LFB95),A RET SetSec_Cont: LD A,C LD (LFB96),A RET SetDma_Cont: LD (LFBA1),BC RET SecTran_Cont: LD H,B LD L,C ld a,d or e ;keine XLT-Tabelle ret z add hl,de ld l,(hl) ld h,0 ret Write_Cont: CALL Exec_BiosCall DEFW Write_Exec ;#0F67BH Read_Cont: CALL Exec_BiosCall DEFW Read_Exec ;#0F663H Spooler_Cont: call Exec_BankBios db 51H RamDisk_Cont: call Exec_BankBios db 5DH Message_Cont: LD HL,LFBAB LD E,(HL) LD (HL),A LD A,E RET TimeDate_Cont: ld a,c ;C = 255 -> Datum/Zeit setzen inc a jr z,tset ld hl,X_Time ;Zeiger auf Datum und Zeit ld a,(X_Time+4) ;Sekunden auch im A-Register ret tset: ld de,X_Time ;Lage des Datums/Zeit ld bc,4 ;Sekunden nicht kopieren ldir ld (de),a ;sondern immer zu 0 setzen ret RetryCnt_Cont: PUSH HL LD HL,(LFBA7) LD (LFBA7),A LD A,L POP HL RET AutoKeys_Cont: call Exec_BankBios db 3Fh WBoot_Exec: ld hl,0 ld (LFB9A),hl ;Discard Disc-Buffer LD A,(LF5ED) ;Systemvektor aktiv? OR A CALL NZ,LFB61 ;Systemvektor restaurieren ld l,42h ;Bdos nachladen call Sel_BankBios ;DE := CCP-Anfang push bc ;BC := Firmware-BC' exx ;(nur fuer unsaubere Programme wichtig) pop bc exx push de LD A,0C3H ;zeropage initialisieren LD (Cpm_BdosEntry),A LD (Cpm_BiosEntry),A ld (Sys_BreakEntry),a LD HL,0806h ADD HL,DE LD (Cpm_BdosStart),HL LD HL,1603h ADD HL,DE LD (Cpm_BiosStart),HL DEC HL ;Bios-Vektor restaurieren DEC HL DEC HL LD DE,biosv EX DE,HL LD BC,XBios_Spooler-Bios_Boot LDIR ld hl,WBoot_Cont ld (Sys_BreakStart),hl ld hl,Cpm_DefDrive ;Default-Drive holen ld a,(hl) and 0Fh higdr2: cp Drive_RamDiskNr+1 jr c,ccpst errdrv: ld (hl),Drive_RamDiskNr ccpst: ld c,(hl) ret ;CCP anspringen ;****** Sektorpuffer freimachen LF5EE: LD HL,LFB9A ;Flagbyte Puffer-Kontrolle PUSH HL XOR A CCF BIT 7,(HL) CALL NZ,LF77C ;Sektorpuffer zur}ckschreiben POP HL RET NC ;CY=0 fehler? LD (HL),0 ;dieses und n{chstes Flagbyte l|schen INC HL LD (HL),0 RET ;CY=1 SelDsk_Exec: LD HL,0 LD A,C HigDrv: CP 3 ;H|chste Laufwerksnummer+1 RET NC LD (LFB94),A LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,LFECC ADD HL,DE CP 2 RET NC PUSH HL CALL LF64D POP HL RET LF64D: LD E,A ;Steprate f}r Laufwerk RegA setzen CALL LF9FC ;Parameterbyte holen BIT 5,A ;externes Laufwerk verlangt? LD A,(stepsp) ;Stepratencode JR Z,LF65C RLCA ;dann h|here 4 Bits g}ltig RLCA RLCA RLCA LF65C: push af ;SPECIFY: A -> Steprate in msec LD BC,Port_Disk LD A,3 CALL LF9D9 POP AF AND 0FH LD (LFBA0),A DEC A RLCA RLCA RLCA CPL AND 0F0H OR 1 ;Bit 0..3: HUT CALL LF9D9 LD A,3 ;Bit 1..7: HLT, Bit 0: DMA JP LF9D9 Read_Exec: LD A,(LFB94) CP 2 JP Z,LFAE7 LD A,(LFB9A) AND 0F0H OR 32H LD (LFB9A),A XOR A LD (LFB9B),A JR LF6DB Write_Exec: LD A,(LFB94) CP 2 JP Z,LFAEB LD HL,LFB9A LD A,(HL) AND 0E0H OR C LD (HL),A LD A,C CP 2 JR NZ,LF6A4 LD HL,LFB94 LD E,(HL) LD A,3 CALL LF9FE INC A LD DE,LFB9B LD (DE),A INC DE LD BC,0003h LDIR LF6A4: LD HL,LFB9B LD A,(HL) OR A JR Z,LF6D3 DEC (HL) INC HL LD DE,LFB94 LD B,3 LF6B2: LD A,(DE) CP (HL) JR NZ,LF6D3 INC DE INC HL DJNZ LF6B2 LD HL,LFB9C LD E,(HL) INC HL INC HL INC (HL) XOR A CALL LF9FE CP (HL) JR NZ,LF6CC LD (HL),0 DEC HL INC (HL) LF6CC: LD HL,LFB9A RES 5,(HL) JR LF6DB LF6D3: LD HL,LFB9A SET 5,(HL) INC HL LD (HL),0 LF6DB: LD HL,LFB9A BIT 6,(HL) SET 6,(HL) JR Z,LF707 LD BC,LFB94 LD HL,LFB97 LD A,(BC) CP (HL) JR NZ,LF6FB LD E,A INC HL INC BC LD A,(BC) CP (HL) JR NZ,LF6FB CALL LF76C CP (HL) JR Z,LF729 LF6FB: LD A,(LFB9A) BIT 7,A LD A,0 SCF CALL NZ,LF77C RET NC LF707: LD HL,LFB97 LD BC,LFB94 LD A,(BC) LD (HL),A LD E,A INC HL INC BC LD A,(BC) LD (HL),A CALL LF76C LD (HL),A LD A,(LFB9A) BIT 5,A LD A,1 SCF CALL NZ,LF77C RET NC LD HL,LFB9A RES 7,(HL) LF729: LD HL,LFB94 LD E,(HL) INC HL INC HL LD A,15H CALL LF9FE DEC A AND (HL) LD HL,(Sector) LD BC,Drive_RecordLen OR A LF73D: JR Z,LF743 ADD HL,BC DEC A JR LF73D LF743: LD DE,(LFBA1) LD A,(LFB9A) BIT 4,A JR NZ,LF754 SET 7,A LD (LFB9A),A EX DE,HL LF754: LDIR LD HL,LFB9A LD A,(HL) AND 0FH CP 1 LD A,0 SCF RET NZ RES 7,(HL) XOR A CALL LF77C RET NC LD A,0 RET LF76C: INC BC INC HL LD A,15H CALL LF9FE LD D,A LD A,(BC) LF775: SRL D RET C SRL A JR LF775 LF77C: PUSH AF LD DE,(LFB97) LD A,0FH CALL LF9FE LD HL,LFB99 ADD A,(HL) LD C,A LD HL,(Sector) POP AF OR A JR Z,WriteSec_Cont ReadSec_Cont: CALL LF8DC LD A,66H JR LF7A2 WriteSec_Cont: CALL LF8DC LD A,'E' ;45H JR LF7A2 FormatTrk_Cont: LD A,'M' ;4DH LF7A2: CALL LFA3C LD (LFBA3),HL LD (LFBAA),A LD A,C LD (LFBA8),A LF7AF: LD A,(LFBA7) LD B,A LF7B3: CALL LF86F PUSH BC LD A,(LFBAA) CALL LF7EA POP BC RET C JR NZ,LF7B3 DEC B JR Z,LF7DF LD A,03 AND B JR nZ,LF7B3 CALL LFA07 RES 6,(HL) JR LF7B3 LF7D0: PUSH DE CALL LFA07 SET 6,(HL) LD D,0 LD A,7 CALL LF871 POP DE RET LF7DF: LD A,(LFBAA) AND 0FH CALL LFA2A JR NZ,LF7AF RET LF7EA: PUSH AF CALL LF8B0 POP AF BIT 3,A JR NZ,LF828 LD A,E CALL LF8EB AND 4 RRC A RRC A CALL LF9D9 LD A,(LFBA8) CALL LF9D9 LD A,14H CALL LF9D0 LD A,(LFBA9) CALL LF9D9 LD A,11H CALL LF9D0 LD A,0FFH LF818: CALL LF83E EI CALL LF93B RET C RET NZ LD A,(LFB8D+1) ADD A,A RET C XOR A RET LF828: LD A,14H CALL LF9D0 LD A,10H CALL LF9D0 LD A,12H CALL LF9D0 LD A,13H CALL LF9FE JR LF818 LF83E: DI CALL LF9D9 LD HL,(LFBA3) LD A,(LFBAA) BIT 1,A JR Z,LF85C LF84C: IN A,(C) JP P,LF84C BIT 5,A RET Z INC C IN A,(C) LD (HL),A DEC C INC HL JR LF84C LF85C: IN A,(C) JP P,LF85C BIT 5,A RET Z INC C LD A,(HL) OUT (C),A DEC C INC HL JR LF85C SeekTrk_Cont: CALL LFA3C LF86F: LD A,0FH LF871: PUSH DE PUSH BC PUSH AF CALL LFA07 BIT 6,(HL) CALL Z,LF7D0 POP AF LD (LFB9F),A LD A,16H CALL LFA09 LD A,D CALL LF909 CP (HL) JR Z,LF8A4 LD A,(LFBA7) LD B,A LF890: PUSH BC CALL LF8AD CALL LF917 POP BC JR C,LF8A4 JR NZ,LF890 CALL LF9BE DJNZ LF890 JP LFA65 LF8A4: LD A,D CALL LF909 LD (HL),A POP BC POP DE SCF RET ;%%%%%% FDC-Kommandovorspann absetzen LF8AD: LD A,(LFB9F) ;A := Seek oder Recalibrate-Kommando LF8B0: PUSH HL ;A := Read/Write/Format/Status-Kommando LD HL,LFB8D LD B,7 LF8B6: LD (HL),0FFH INC HL DJNZ LF8B6 POP HL ;Result gel|scht LD BC,Port_Disk PUSH AF CALL LF9D9 ;Kommando absetzen CALL LF9D5 ;Adresse und Kopf absetzen POP AF ;Kommando zur}ckholen and 1Fh cp 0Dh ret z ;Format-Kommando AND 0F7H cp 07 ;SEEK oder Recalibrate? jr nz,fdc_rw call LF9FC ;SEEK oder RECALIBRATE bit 1,a ;===> Flagbyte, Bit1 -> Doublesteps <=== ld a,(LFB9F) jr nz,dblstp XOR 7 ;RECALIBRATE? JR Z,LF8D7 ; -> dann keine Zylindernummer fdc_rw: LD A,D ;Track CALL LF909 ;A := Zylinder (Drive E) (Track D) CALL LF9D9 ;Zylindernummer absetzen LF8D7: SUB (HL) ;A := Zieltrack RET NC CPL INC A RET dblstp: xor 7 jr z,notrk ld a,d call lf909 add a,a ;doppelte Spurzahl call lf9d9 srl a ;A := logischer Zielzylinder notrk: sub (hl) ;(HL) := logischer Startzylinder add a,a ret nc ;Ergebnis war positiv cpl inc a ret ;fdc_rw: LD A,D ;Track ; CALL LF909 ;A := Zylinder (Drive E) (Track D) ; jp LF9D9 ;Zylindernummer absetzen LF8DC: PUSH HL CALL LFA07 BIT 4,(HL) LD A,C JR Z,LF8E6 LD A,B LF8E6: LD (LFBA9),A POP HL RET LF8EB: PUSH BC PUSH AF CALL LF9FC BIT 0,A LD B,A JR Z,LF8FE BIT 0,D JR Z,LF8FE POP AF SET 2,A JR LF907 LF8FE: POP AF BIT 5,B JR Z,LF907 AND 0FCH DrvAdr: OR 2 LF907: POP BC RET LF909: PUSH AF CALL LF9FC BIT 0,A JR Z,LF915 POP AF SRL A RET LF915: POP AF RET LF917: PUSH AF LD A,(LFBA0) CALL LF9EF POP AF DEC A JR NZ,LF917 LD A,(LFB8B) CALL LF9EF LD A,8 CALL LF9D9 LF92D: CALL LF96A RET C BIT 3,A RET Z BIT 5,A RET Z LD A,7 JR LF948 LF93B: CALL LF92D RET C RET NZ LD A,(LFB8D+1) BIT 1,A RET Z LD A,8 LF948: CALL LFA2A JP Z,LFA65 RET DriveStat_Cont: CALL LF957 RET NC LD A,(LFB8D) RET LF957: CALL LFA3C PUSH AF CALL LF9BE LD BC,Port_Disk LD A,4 CALL LF9D9 POP AF CALL LF9D9 LF96A: PUSH HL LD HL,LFB8D LF96E: IN A,(C) CP 0C0H JR C,LF96E JR LF980 LF976: IN A,(C) BIT 7,A JR Z,LF976 BIT 6,A JR Z,LF988 LF980: INC C IN A,(C) DEC C LD (HL),A INC HL JR LF976 LF988: LD A,(LFB8D) AND 0C0H LD A,(LFB8D) POP HL RET NZ SCF RET LF9BE: PUSH BC LD BC,Port_Disk LF9C2: LD A,8 CALL LF9D9 CALL LF96A CP 80H JR NZ,LF9C2 POP BC RET LF9D0: CALL LF9FE JR LF9D9 LF9D5: LD A,E CALL LF8EB LF9D9: PUSH AF PUSH AF LF9DB: IN A,(C) BIT 7,A JR Z,LF9DB BIT 6,A JR NZ,LF9EC POP AF INC C OUT (C),A DEC C POP AF RET LF9EC: POP AF POP AF RET LF9EF: PUSH AF LD A,0FAH LF9F2: DEC A JR NZ,LF9F2 POP AF DEC A JR NZ,LF9EF RET LD E,0 LF9FC: LD A,18H LF9FE: PUSH HL CALL LFA09 LD A,(HL) POP HL RET LFA05: LD E,0 LFA07: LD A,18H LFA09: PUSH DE LD L,E LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,LFECC ADD HL,DE LD DE,000Ah ADD HL,DE PUSH AF LD A,(HL) INC HL LD H,(HL) LD L,A POP AF LD E,A ADD HL,DE POP DE RET LFA2A: PUSH AF LD A,(LFBAB) OR A JR NZ,LFA38 POP AF LD C,E LD L,45H JP Sel_BankBios LFA38: POP AF XOR A OR A RET LFA3C: DI EXX LD (LFA63),HL POP HL EXX PUSH HL PUSH DE PUSH BC LD (LFBA5),SP EXX PUSH HL LD HL,LFA65 EX (SP),HL PUSH HL LD HL,(LFA63) EXX PUSH HL PUSH DE PUSH BC PUSH AF LD L,33H CALL Sel_BankBios POP AF POP BC POP DE POP HL RET LFA63: defs 2 LFA65: LD SP,(LFBA5) PUSH AF LD L,36H CALL Sel_BankBios CALL LFA05 RES 4,(HL) LD E,1 CALL LFA07 RES 4,(HL) POP AF POP BC POP DE POP HL LD A,0 RET C LD A,0FFH RET SelFormat_Cont: CP 0FFH JP Z,LFA07 PUSH AF CALL LF5EE LD A,1 CALL LFAB6 XOR A CALL LFAB6 POP AF and a RET Z DEC A LD DE,fcbams jr LFAC3 LFAB6: LD DE,fcbvrt LFAC3: PUSH DE LD E,A XOR A CALL LFA09 LD BC,fcbamsend-fcbams POP DE EX DE,HL LDIR RET fcbvrt: defw 0024h defb 5,1Fh,3 defw 00B0h,007Fh defb 80h,0 defw Drive_CKS,0002h defb 1 defb 9,2Ah,52h,0E5h,2,4 defb 4Fh,4Fh vrttyp: defb 1 fcbend: fcbams: defw 0024h defb 3,7,0 defw 00AAh,003Fh defb 0C0h,0 defw 0010h,0002h defb 41h defb 9,2Ah,52h,0E5h,2,4 defb 27h,27h amstyp: defb 40h fcbamsend: ;****** RamDisk lesen, 1 Sektor LFAE7: LD A,1 JR LFAEC ;****** RamDisk schreiben, 1 Sektor LFAEB: XOR A ;****** RamDisksektor verarbeiten LFAEC: LD HL,LFB3A LD (HL),A ;merken, ob schreiben oder lesen XOR A CALL LFB3B ;Diskettensektoren auf Disk zur}ck BIT 1,(HL) JR NZ,LFB07;Sprung -> Lesen aus RamdDisk BIT 0,(HL) ;Schreiben in RamDisk JR Z,LFB07 ;Sprung -> in unterem Speicher LD HL,(LFBA1) ;Sektor nach 0080 kopieren LD DE,X_Buff LD BC,Drive_RecordLen LDIR LFB07: LD A,(LFB3A) ;Flagbyte LD DE,(LFBA1) ;DMA LD BC,(LFB95) ;c: Track, b:Sektor LD L,39H CALL Sel_BankBios LD HL,LFB3A BIT 1,(HL) LD A,0 JR NZ,LFB25 ;1 -> RamDisk lesen BIT 0,(HL) RET Z JR LFB34 LFB25: BIT 0,(HL) ;in unterer H{lfte -> Ende RET Z LD DE,(LFBA1) ;Sektor aus 0080 holen LD HL,X_Buff LD BC,Drive_RecordLen LDIR LFB34: DEC A CALL LFB4F XOR A RET LFB3A: Defs 1 ;Flag, ob RAM lesen oder schreiben LFB3B: PUSH HL LD HL,(LFBA1) ;DMA-Adresse LD DE,7FFFh+Drive_RecordLen ADD HL,DE ;128Byte-DMA (teilweise) in oberer H{lfte? POP HL RL (HL) ;Flagbyte Bit1: R/W, Bit2: Low/High BIT 0,(HL) RET Z ;Ziel in unterer H{lfte PUSH HL CALL LF5EE ;512 Byte-Sektorpuffer auslagern???? POP HL XOR A ;vom Sektorpuffer in Bankpuffer kopieren LFB4F: PUSH HL LD HL,X_Buff ;Bank+Sektorpuffer hin und her LD DE,(Sector) LD BC,Drive_RecordLen OR A JR Z,LFB5D EX DE,HL LFB5D: LDIR POP HL RET LFB61: LD HL,XBios_Message ;Systemvektor restaurieren LD DE,Sys_XBiosVector LD BC,Sys_XBiosVende-Sys_XBiosVector;44K CP/M XBios-Vektoren LDIR ; ld hl,FirmExec_Cont ==>sonst Absturz bei call BE9B! dw BE80..BEA4<== ; ld (Sys_XBiosVector+1Ch),hl ;Firmware-Einsprung ld hl,return ld (Sys_XBiosVector+04h),hl ;nicht implementiert ld (Sys_XBiosVector+22h),hl LD HL,LFECC LD (Sys_DphPointer),HL LD B,0+(Sys_FirmVende-Sys_FirmVector)/3 LD A,0CDH LD DE,SysVektor_Cont LD HL,Sys_FirmVector LFB7C: LD (HL),A INC HL LD (HL),E INC HL LD (HL),D INC HL DJNZ LFB7C return: RET LFB94: DEFS 1 ;aktuelles Disclaufwerk LFB95: DEFS 1 ;Track LFB96: DEFS 1 ;Sektor (128 Byte) LFB97: DEFb 0,0 LFB99: DEFB 0 LFB9A: DEFB 0 ;Drive_Status. Bit7:Ramdisk, Bit6:Home zur}ckgestellt LFB9B: DEFB 0 ;#0 LFB9C: DEFB 0 DEFW 0 ;#0 LFB9F: DEFB 0 LFBA0: DEFB 4 LFBA1: DEFS 2 ;DMA-Adresse es BIOS LFBA3: DEFB 0,0 LFBA5: DEFB 0,0 LFBA8: DEFB 0 LFBA9: DEFB 0 LFBAA: DEFB 0 LFB8D: DEFM 6Fh,0DH,7Ah,0FEH,3,0DAH,6Fh ;FDC-Resultphase ;%%%%%% DPH auf Page-Grenze ausrichten defs low (-$-3Ah) ;wird nicht verwendet LFBAB: DEFS 0001H ;0FFh -> Bios-Meldungen unterdr}cken LF5ED: defs 1 ;0FFh -> Systemvektor aktiv LFBA7: DEFs 1 ;RetryCount LFB8B: DEFs 1 ;Kopfberuhigungszeit stepsp: defs 1 ;Stepratencode biosv: defs 33h ;Kopie der Bios-Sprungtabelle ;Adresse des Sektorpuffers steht unmittelbar vor dem ersten DPH Sector: defw secbuf ;Adresse des Sektorpuffers -> {nderbar LFECC: DEFS 0030H ;DPH Drive A, B, C (RamDisk) LFBAC: DEFS Drive_RecordLen ;DIRBUF f}r DPHs LFE2C: DEFS 0070H ;112 Bytes f}r XDPB,CSV,ALV Drive A LFE7C: DEFS 0070H ;112 Bytes f}r XDPB,CSV,ALV Drive B LFEFC: DEFS 0030H ;DPB,ALV Drive C (RamDisk) secbuf: DEFS Drive_SectorLen ;SektorPuffer defs -$ ;reserviert f}r Stapel bis Speicherende 128 Bytes .DEPHASE biosen: ;================================================================ END