;!HEAD MODULE ;FILE BDOSSCP.ROM.S ;DISK BIC-SCP-Quellen ;AUTHOR Kersten -> Ludewig ;DATE 25.05.89 ;VARIABLES (hier nicht angegeben) ;END ;! ; ; ; ; File enthaelt den BDOS-Teil fuer SCP, der immer im ROM steht. ; ; ; ;; Erforderliche Speicheraufteilung fuer Arbeit des BDOS: ; ; Disk-BASIC: FFFF ; | Bank 2 (RAM) : System-RAM + BASIC-Anwenderspeicher ; 8000 ; | Bank 1 oder 3 (ROM) : ROM-BDOS ; 4000 ; | Bank 0 (ROM) : BASIC-Treiber ; 0000 ; ; SCP: FFFF ; | Bank 2 (RAM) : System-RAM mit BIOS-Sprungleiste ; C000 ; | Bank 0 (ROM) : SCP-ROM (CCP, Treiber-Teile ...) ; | (Sonderserie Bank 1 oder 3) ; 8000 ; | Bank 1 oder 3 (ROM) : ROM-BDOS ; 4000 ; | Bank 2 (RAM) : SCP-RAM (0 - 0FFh) ; 0000 ; ; Erforderliche Speicher-Aufteilung fuer SCP-Dienstprogramme: ; ; FFFF ; | Bank 2 (RAM) ; 8000 ; | Bank 2 (RAM) ; 4000 ; | Bank 2 (RAM) ; 0000 *EJEC ; EXTERNAL INITBB EXTERNAL PUTSTR CRLF ; ;; BDOS-Anlauf fuer SCP ; ============================================ INITSB: CALL INITBB MOVE SBSEC SSBSEC MBad-SSBSEC ;SPC-Fehlerbehandlung MOVE SBDOS SBD0 SBD2-SBD0 ;BDOS-Rahmen MOVE BADSEC SERRAD 8 ;SCP-Fehleradr. LD HL,80H LD (DMAADD),HL LD (STDDMA),HL ;Standard-DMA RET ; ; ;; RAM-Abbild im ROM fuer BDOS-Rahmen SCP ; (steht nach System-Anlauf im RAM) ; ====================================== ; SBD0: JP SBDOS0 ; Sprung zur Bank-Umschaltung,) im ; + Ansprung ROM-BDOS ) RAM ; DEFW ERRBAD DEFW ERRSEL DEFW ERRDRO DEFW ERRFRO ; ; Original-Vorsatz von BWS (hier aber vor BDOS) ;=== Laenge = 13 === im RAM von Hand aendern ! === Vors0 JP BIORSL ; Kaltstart (in RAM) DEFW 200H ; Versions-Nr. 02.00 DEFW SBDOS ; SCP-Anfang DEFW 0FFFFH ; -Ende DEFM 'MD' ; Hersteller-Kennzeichen DEFB 2 ; BIC A5105 DEFB 0 ; Anzahl Install-Adressen ; ;=== Laenge = 24 === im RAM von Hand aendern ! === SBD1: LD (UST0),SP ; retten SP LD SP,STACK0 ; Ist erforderlich, da User-Stack ; nur Platz fuer 1xCALL zu haben ; braucht. IN A,(PPIA) ; ( zugehoerige RAM-Adr. = SBDOS0 ) LD (RettMem),A ; Retten Speicherbelegung LD A,(SLCTRL) ; SCPX-Bank-Belegung mit SCP-RAM AND 0FCh ; 0 bis 0FFh auf Bank 2 OR 2 OUT (PPIA),A JP SBDOS1 ; Sprung zu ROM-BDOS ; ;=== Laenge = 20 === im RAM von Hand aendern ! === SBD01: LD DE,(RettDE) ;SBDOSE: Endebehandlung fuer SCP-BDOS LD (RettA),A LD A,(RettMem) OUT (PPIA),A LD A,(RettA) LD SP,(UST0) RET SBD2: ; SERRAD: DFW SBSEC SBSEL SDRO SFRO ; defaul equ 4 ;default-disk in rechter tetr. ; *EJEC ; ;; BDOS-Eintritt fuer SCP (im ROM) ; ------------------------------- ; ; Makro fuer Test, ob BDOS-Ruf-Nr. in gegebenem Bereich ; IfBer: MACRO #Unten #Oben #Behandlung LD A,#Unten-1 CP C JR NC,M1#$YM LD A,#Oben CP C JP NC,#Behandlung M1#$YM: ENDM ; ; SBDOS1: LD (RettDE),DE ; Retten DE LD A,9 ; = Nr. fuer String-Ausgabe CP C JR Z,SPRSTR ; LD A,10 ; = Nr. fuer String-Eingabe CP C JR Z,SRCBUB ; SBDOS2: IfBer 15 17 FCBBeh ;Ruf 18 ausklammern IfBer 19 23 FCBBeh ; (s. UP NEXT) ; LD A,30 ; = Nr. fuer Attribut setzen CP C JR Z,FCBBeh ; IfBer 33 36 FCBBeh ; LD A,40 ; = Nr. fuer Random write mit CP C ; Initialisierung JR Z,FCBBeh ; SBDOS3: CALL BBDOS ; Aufruf ohne Umspeicherungen ; JP SBDOSE ;Ende im RAM *EJEC ; ; Sonderbehandlung String-Ausgabe ; SPRSTR: PUSH DE ; Retten >Teil-Quellpuffer< CALL ZKHOL LD A,'$' LD (ZSTR+STRLEN),A ; Begrenzen Teil-String LD C,9 LD DE,ZSTR CALL BBDOS POP DE LD HL,STRLEN ADD HL,DE EX HL,DE ; naechster Teil-Quellpuffer LD HL,ZSTR LD BC,STRLEN LD A,'$' CPIR JR NZ,SPRSTR ; '$' in Teil-String JP SBDOSE ; Ja ; ; Sonderbehandlung String-Eingabe ; SRCBUB: CALL ZKHOL LD DE,ZSTR CALL BBDOS CALL ZKZUR JP SBDOSE ; ; Sonderbehandlung FCB's ; FCBBeh:CALL FCBHOL LD DE,ZFCB CALL BBDOS CALL FCBZUR JP SBDOSE *EJEC ; ; Umspeicher-UPs fuer Sonderbehandlungen BDOS-Rufe ; ; (setzt Rettung DE bei BDOS-Ruf voraus!) ; FCBHOL: PUSH AF ;Original-FCB --> Zwischen-FCB PUSH BC PUSH DE PUSH HL LD HL,ZFCB EX DE,HL ;HL := Quelle DE := Ziel LD BC,36 ;max. FCB-Laenge (CP/M nach V:2.0) CALL FLLDIR ;Umladen, Einstellen/Regen. Bank-Belegg. LD BC,3 DEC HL DEC HL DEC HL ;Direktzugriffsparameter (r0..r2) CALL FLLDIR ; retten POP HL POP DE POP BC POP AF RET ; ; FCBZUR: PUSH AF ; Original-FCB <-- Zwischen-FCB PUSH BC PUSH DE PUSH HL LD HL,ZFCB+33 LD DE,DZRET LD BC,3 ;Direktzugriffsparameter (r0..r2) FCBZ10 LD A,(DE) CPI ; veraendert? JR NZ,FCBZ20 ; Ja--> INC DE JP PE,FCBZ10 ; LD BC,33 ;FCB-Laenge (CP/M vor V:2.0) JR FCBZ30 FCBZ20 LD BC,36 ;FCB-Laenge (CP/M nach V:2.0) FCBZ30 LD HL,ZFCB ;Quelle LD DE,(RettDE) ;Ziel CALL FLLDIR POP HL POP DE POP BC POP AF RET *EJEC ; ZKHOL: PUSH AF ; Original-ZK --> Zwischen-ZK PUSH BC PUSH DE PUSH HL LD HL,ZSTR EX DE,HL ; HL := Quelle DE := Ziel LD BC,STRLEN CALL FLLDIR POP HL POP DE POP BC POP AF RET ; ; ; ZKZUR: PUSH AF ; Original-ZK <-- Zwischen-ZK PUSH BC PUSH DE PUSH HL LD A,(ZSTR) ; Max-Laenge ADD A,2 LD C,A LD B,0 JR NC,ZKZ05 INC B ZKZ05 LD HL,ZSTR LD DE,(RettDE) CALL FLLDIR POP HL POP DE POP BC POP AF RET *EJEC ;****************************************************** ;; Sprung zur Fehlerbehandlung im SCP-Vorspann ( ->RAM) ; SSBSEC: ld hl,SBDSEC ;Relativspruenge fuehren in RAM !! jr SSbder SSBSEL: ld hl,SBDSEL jr SSbder SSDRO: ld hl,SDISKRO jr SSbder SSFRO: ld hl,SFILERO SSbder LD A,0AAH OUT (PPIA),A jp ie34a ;======================================================== ; ( ->RAM) ;=== Laenge = 25 === im RAM von Hand aendern ! === SERRBAD ld hl,MBad ;bad sector LD A,(SLCTRL) AND 0FCH OR 2 OUT (PPIA),A call SFMELD ; Aufruf Fehlerbehandlg. cp 03h ret nz LD A,0AAH OUT (PPIA),A JP 0 ;----------------------- ;=== Laenge = 05 === im RAM von Hand aendern ! === SERRSEL ld hl,MSel ;select jr SERRRES ;----------------------- ;=== Laenge = 05 === im RAM von Hand aendern ! === SERRDRO ld hl,MRO ;r/o jr SERRRES ;----------------------- ;=== Laenge = 03 === im RAM von Hand aendern ! === SERRFRO ld hl,MFRO ;file r/o ;=== Laenge = 19 === im RAM von Hand aendern ! === SERRRES LD A,(SLCTRL) AND 0FCH OR 2 OUT (PPIA),A call SFMELD LD A,0AAH OUT (PPIA),A jp 0 ;----------------------- ; ;; BDOS-Fehlermeldungen ( ->RAM) ; ;=== Laenge = 12 === im RAM von Hand aendern ! === MERR00: defm 'BDOS err on ' ;) werden in RAM geladen ;=== Laenge = 04 === im RAM von Hand aendern ! === MERR10: defm ' : $' ;) dort "MERR0" u. "MERR1" ; MBad: defm 'bad sector (^c=abort, other=ignore)$' MSel: defm 'select$' MFRO: defm 'file ' MRO: defm 'r/o$' ; ;****************************************************** ;; Ausgabe Fehlermeldung fuer SCP (ROM !) ; SFMELD: push hl call CRLF ld a,(CURRD) add a,'a' ld (MERR1),a ld bc,MERR0 call PUTSTR pop bc call PUTSTR IN A,(PPIA) PUSH AF AND 0FCH ;Page 0 auf Slot 0 OUT (PPIA),A CALL LORIPU POP AF OUT (PPIA),A jp ICONIN ;******************************************************* ÿªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª