TITLE RAMDISK ;------------------------------------------------- ; ; Ramdisk-Treiber (BASIS) fuer CP/M 3.0 ; ; rekonstruiert: ; 23/11/1984 R. Weniger, Neu Isenburg ; ;------------------------------------------------- ; ; Installationsparameter ; SLOT EQU 4 ; Slot Nr RAM-Diskette BYTE EQU 256 ; Kapazitaet in k-Byte ;------------------------------------------------- .Z80 ASEG ORG 0100H ; ; CP/M interne Adressen ; BOOT EQU 00000H BDOS EQU 00005H ; ; CP/M Funktionen ; BD$PSTR EQU 9 ; Print String BD$MV EQU 12 ; Versions-Nr lesen BD$RES EQU 13 ; Reset Disk ; ; BIOS interne Adressen ; NODRV EQU 0F3B8H ; Adr Anz Disk-Laufwerke FORVAL EQU 0E5H ; Formatbyte ; ; BIOS Funktionen ; BI$DRVT EQU 22 ; DRVTBL BI$MOV EQU 25 ; MOVE BI$XMOV EQU 29 ; XMOVE BI$USER EQU 30 ; USERF ; ; Abgeleitete Werte ; PROM EQU 0E000H+0100H*SLOT ; I/O-RAM IOLOC EQU 0E080H+010H*SLOT ; 1. I/O-Adr ; SPACE EQU BYTE-1 DRIVES EQU (7-SLOT)*2-1 ; Anz Laufwerke DRVTR EQU (6-SLOT)*4 ; rel Adr Drivetable AD$RWTS EQU 0F3A8H+(6-SLOT)*4 ; Adr RWTS-Routine PAGE ; ; Initialisierung ; LD SP,(BDOS+1) LD A,(BOOT+2) ; HIGH (BIOS Basis) LD (STO$1+1),A LD (STO$2+2),A ; LD C,BD$MV CALL BDOS LD A,L CP 030H ; CP/M 3.x ? JR NC,MV$OK ; Ja ; LD DE,ERR$TXT JP ERROR ; Fehler ; MV$OK: LD C,BD$RES ; Disk Reset CALL BDOS ; ; Get addr (drivetable) ; = Adr ; LD A,BI$DRVT*3 CALL CA$BIOS ; ; CP/M ein weiteres Laufwerk vortaeuschen ; LD A,DRIVES LD (NODRV),A ; LD DE,DRVTR ; rel Adr drivetable ADD HL,DE LD E,(HL) INC HL LD D,(HL) PUSH DE ; Adr Disk param. header (DPH) ; ; Bank-Schaltung herstellen fuer BIOS-Fkt MOVE ; = Ziel Bank ; = Quell Bank ; LD A,BI$XMOV*3 LD BC,0001 CALL CA$BIOS ; ; Alten DPH ueberschreiben durch BIOS-Fkt MOVE ; = Ziel Adr ; = Quell Adr ; = Anzahl ; POP HL LD DE,DPH LD BC,DPH$L LD A,BI$MOV*3 CALL CA$BIOS ; ; Run-Time Paket ins I/O-RAM speichern ; LD HL,BLBEG ; Anfangsadr LD DE,PROM ; Zieladresse LD BC,BLEND-BLBEG ; Laenge LDIR ; ; Aufruf des Run-Time Paketes statt RWTS ; LD HL,RAMDSK LD (AD$RWTS),HL ; ; Formattiert den ersten Track der RAM-Diskette ; XOR A LD (IOLOC+2),A ; Track LD C,16 ; Sektor Zaehler LD DE,IOLOC+3 LD HL,IOLOC FORMAT1:DEC C LD A,C LD (IOLOC+1),A ; Sector Nr LD A,FORVAL LD B,00 ; Byte Zaehler FORMAT2:LD (HL),B ; Byte Nr LD (DE),A ; Schreibt Byte DJNZ FORMAT2 ; LD A,C OR A JR NZ,FORMAT1 ; JP BOOT ; ; BIOS-Routine aufrufen ; ; = rel Adr zu BIOS-Fkt 0 (Coldboot) ; CA$BIOS:PUSH HL STO$1: LD H,00 ; HIGH (BIOS Basis) LD L,A EX (SP),HL RET ; ; Fehlerausgang ; ERROR: LD C,BD$PSTR JP BDOS ; ; Disk parameter header (DPH) ; 18 von 25 bytes ; DPH: DEFW 00000H ; XLT = Sector translation table DEFW 00000H,00000H,00000H,00000H DEFB 000H ; SCRATCH DEFB 000H ; MF = Media flag DEFW DPB ; = Disk parameter block DEFW 00000H ; CSV = Changed disk vector DEFW ALV ; = Allocation vector ; DEFW DIRBCB ; = Directory buf ctrl block ; DEFW DTABCB ; = Data buf ctrl block ; DEFW HASH ; = Hash table ; DEFB HBANK ; = Bank no hash table DPH$L EQU $-DPH ; Laenge DPH PAGE ;------------------------------------------------- ; ; R U N - T I M E P A K E T ; ;------------------------------------------------- BLBEG EQU $ .PHASE PROM ; ; Adressen der IOB der RWTS Routinen ; ;VOL EQU 0xxxxH ; Volume ;DRVN EQU 0xxxxH ; Drive Nummer ;IBSLOT EQU 0xxxxH ; Slot Nummer ;CMD EQU 0xxxxH ; Command TRK EQU 0F0A1H ; Track SECT EQU 0F0A2H ; Sector BUFP EQU 0F0A3H ; Buffer Adresse STAT EQU 0F0A5H ; RWTS Status DISK1$7 EQU 0F0A7H ; ??? DISK1$8 EQU 0F0A8H ; ??? ; ; Aufrufadresse des Run-Time Paketes ; RAMDSK: LD A,(DISK1$8) ; ??? CALL RD$USER ; ??? CALL RDSK1 LD C,A ; Fehler Nr retten LD A,(DISK1$7) ; ??? CALL RD$USER ; ??? LD A,C ; Fehler Nr zurueck RET ; CONT EQU $ .DEPHASE STO$2 EQU $ .PHASE CONT ; ; Adr Umsetzung 6502 <--> Z80 ??? ; RD$USER:JP BI$USER*3 ; HIGH Byte wird BIOS Basis !!! ; ; Berechnet aus Track und Sector die ; Werte der I/O Bytes der RAM-Diskette ; ; +--------+--------+--------+ ; |0000TTTT|TTTTSSSS|BBBBBBBB! ; +--------+--------+--------+ ; ; IOLOC+2 IOLOC+1 IOLOC ; ; mit ; ; T 8-Bit Track Nummer 0..255 ; S 4-Bit Sector Nummer 0..15 ; B 8-Bit Byte Nummer 0..255 ; ; = - 1, Lesen ; /= - 1, Schreiben ; RDSK1: XOR A ; := 0 LD (STAT),A LD B,A ; := 0 LD H,A ; := 0 LD A,(TRK) LD L,A SLA L RL H SLA L RL H SLA L RL H SLA L RL H LD A,(SECT) ; Record Nr RRA ; = Sector Nr, = rel Rec Nr RR B ; = Record Adr (0/80H) OR L LD (IOLOC+1),A LD A,H LD (IOLOC+2),A ; LD DE,(BUFP) LD HL,IOLOC ; Adr Bytezaehler INC C LD C,B ; = Record Adr (0/80H) LD B,80H ; Bytezaehler (1 Record) JR Z,RREAD ; Lesen ; ; In RAM-Disk schreiben ; RWRITE: LD (HL),C LD A,(DE) LD (IOLOC+3),A INC DE INC C DJNZ RWRITE ; XOR A ; BIOS: kein Fehler RET ; ; Von RAM-Disk lesen ; RREAD: LD (HL),C LD A,(IOLOC+3) LD (DE),A INC DE INC C DJNZ RREAD ; XOR A ; BIOS: kein Fehler RET ; DEFB 000H ; evtl. NOP ; ; Disk parameter block ; DPB: DEFW 16*2 ; SPT = 128-byte-Sector / Track DEFB 003H ; BSH = Block SHift factor DEFB 007H ; BLM = BLock Mask DEFB 000H ; EXM = EXtent Mask DEFW SPACE ; DSM = # Blocks - 1 DEFW 128-1 ; DRM = # Dir entries - 1 DEFB 0F0H ; AL0 = reserved dir blocks DEFB 000H ; AL1 = " DEFW 00000H ; CKS = ChecK vector Size DEFW 00000H ; OFF = res. tracks (Dir OFFset) DEFB 000H ; PSH = Physical record SHift DEFB 000H ; PHM = PHysical record Mask ; ; Allocation vector ; ALV: DEFW 00000H,00000H,00000H,00000H DEFW 00000H,00000H,00000H,00000H DEFW 00000H,00000H,00000H,00000H DEFW 00000H,00000H,00000H,00000H ; .DEPHASE BLEND EQU $ ; ERR$TXT:DEFM 'Requires CP/M 3.0 upward' DEFB 0DH,0AH,'$' ; ; Sektor Rest mit Ctrl-Z auffuellen ; DEFS (($-1)/128+1)*128-$,01AH END