;******************************************************************* ; Kopierprogramm fuer BIC ; Stand: 1.7.88, Dr.Busch/EKR2 ;------------------------------------------------------------------- ; Kopieren von Dateien mit Luecken im SCP-Format ; Aufruf mit ; COPY "[geraet:]name" TO "[geraet:]name" ; aus RBASIC ;******************************************************************* COPY call STCKM ;Stackmanipulation ld ix,CLOSEA ;alle files schlieszen call JL1CAL push hl ld hl,ZIFCB ;fcb's initialisieren ld b,48h COPY1 ld (hl),0 inc hl djnz COPY1 pop hl call DSKNAM ;source name call NACOF4 ;zulaessig ? call NAMUML ;ja, umladen push hl ;nach QUFCB ld hl,ZIFCB ld de,QUFCB ld bc,12 ldir pop hl call DCPSTX ;'TO' defb 0D9h ;TO-token call DSKNAM ;destination name call NACOF4 ;zulaessig ? call NAMUML ;ja, umladen nach ZIFCB call DTCHAR ;Ende Anweisung ? ret nz ;nein -> syntax error push hl ;Zeiger retten ld hl,QUFCB ;LW, Namen vergleichen ld de,ZIFCB ld b,12 COPY3 ld a,(de) cp (hl) jr nz,COPY2 ;LW,Name <>, o.k. inc hl inc de djnz COPY3 jp ERDBNA ;= -> bad file name COPY2 call DATCU2 ;Quellfile suchen jp z,ERDFNF ;file not found ld hl,ZIFCB+9 push hl ld de,ZITYP ld bc,3 ldir ;temporaer typ '$$$' pop hl ld b,3 COPY5 ld (hl),'$' inc hl djnz COPY5 ; call BLKPR ;Parameter Quell-disk bestimmen jp c,ERDMO ;out of memory bei Puffer<1 extent call DATCOP ;Datei kopieren ; push af ld e,0 ld c,14 ;select disk A call BBDOSX pop af jr nc,COPY4 ;kein Fehler push af call COPYUP ld c,19 ;Fehler -> delete file call BBDOSX pop af ;Fehlercode in a dec a jp z,ERFULL ;disk full dec a jp z,ERTOOM ;too many files dec a jp z,ERDFNF ;file not found jp ERIO ;disk I/O error COPY4 call COPYUP ;kein Fehler push de ;alte Zieldatei loeschen ld hl,ZITYP ld de,ZIFCB+9 ld bc,3 ldir pop de ld c,19 ;delete file call BBDOSX call COPYUP push de ld hl,ZIFCB+9 ld b,3 COPY6 ld (hl),'$' inc hl djnz COPY6 ld hl,ZIFCB ld de,ZIFCB+10h ld bc,10h ldir ld hl,ZITYP ;Zieltyp regenerieren ld de,ZIFCB+19h ld bc,3 ldir pop de ld c,23 ;rename file call BBDOSX COPYE pop hl ;Zeiger reg. ret ;----------------------------------------------------- COPYUP ld de,ZIFCB ;Ziel-fcb init ld hl,12 add hl,de ld b,24 COPYU1 ld (hl),0 inc hl djnz COPYU1 ret ;===================================================== BLKPR ld a,(QUFCB) ;Blockangaben ermitteln ld e,a ;vom Quell-LW dec e ld c,14 ;select disk (Quell-LW) call BBDOSX ;wenn Quell-LW <> A ld c,31 ;DPB-Adresse call BBDOSX ;in hl inc hl ;DPB auswerten inc hl inc hl ;Blockmaske ld a,(hl) inc a ld (BLGROS),a ;Blockgroesze: rec's/block ld b,8 BLKPR4 rra rl c djnz BLKPR4 ld a,c ld (BLEXT),a ;blocks/extent inc hl ld a,(hl) ;Eintragsmaske ld (EXTMSK),a ;extents/dir-Eintrag-1 inc hl ld a,(hl) inc hl ld l,(hl) ld h,a inc hl ;Blockanzahl ld a,h and a ;< 256 ? ld a,0 ;ja, 1 byte Blocknummern jr z,BLKPR1 inc a ;> 255, 2 byte Blocknummern BLKPR1 ld (BLNRGR),a ;Blocknummerngroesze ld hl,-30 ;Pufferspeicher berechnen add hl,sp ld de,(FSLPTR) ;Anfang Freibereich ld (PUCOPY),de ;= Anfang Puffer and a sbc hl,de ;Laenge Freibereich ld de,4000h ;extent-Groesze rst CPREG ret ;----------------------------------------------------------- DATCOP call DATCU2 ;ersten Eintrag suchen scf ld b,a ;Rueckgabecode retten ld a,3 ;file not found ret z ;Fehler ld a,b DATCO2 call DATCUP ;Adr. Eintrag bestimmen call DATCU3 ;exNrn bestimmen DATCO9 call DATCU4 ;recordmaske/extent bestimmen push bc ;exNrn retten ; call LESEXT ;extent lesen call nc,SCHEXT ;extent schreiben ; pop bc ;b: hoechste, c:akt. extNr jr c,DATCOE ;Fehler inc c ld a,(LASTEX) ;letzter ex ? and a jr nz,DATCO9 ;nicht fertig -> weiter ; push bc ;b: letzte exNr im Eintrag ld de,HIDMA ld c,26 call BBDOSX ;set dma ld hl,QUFCB+12 ;search first auf letzten ex pop bc ld (hl),b ;des Eintrags ld de,QUFCB push de ld c,17 ;search first call BBDOSX cp 0FFh ;Fehler ? ld a,4 pop de jr z,DATCOE ;ja (CY=1) ld hl,QUFCB+12 ld (hl),'?' ;naechsten extent ld c,18 call BBDOSX cp 0FFh ;fertig ? jr nz,DATCO2 ;nein, weiter and a ;fertig -> Ok DATCOE ret ; DATCUP and 3 add a,a add a,a add a,a add a,a add a,a ld b,0 ld c,a ld hl,HIDMA add hl,bc ;Eintragsanfang ld (DIRAD),hl ret ; DATCU2 ld de,HIDMA ;dma-Bereich fuer Suche ld c,26 ;set dma call BBDOSX ld de,QUFCB ;ersten Eintrag suchen ld c,17 ;search first call BBDOSX cp 0FFh ;Fehler ? ret ; DATCU3 ld de,(DIRAD) ;erste extNr suchen im Eintrag ld hl,12 add hl,de ld b,(hl) ;b: hoechste extNr ld a,(EXTMSK) cpl and b ld c,a ;c: erste extNr ret ; DATCU4 push bc ld a,b cp c ;letzter extent im Eintrag ? ld a,0 jr z,DATCU5 ;ja inc a ;nein DATCU5 ld (LASTEX),a ld hl,0 ld (RECMSK),hl ;recordmaske/extent ld hl,16 ;bestimmen add hl,de ;hl: Anfang BlockNr im Eintrag ld a,(BLEXT) ld e,a ;e: Blockanzahl/extent ld a,(BLGROS) srl a srl a srl a ld d,a ;Kbyte/block DATCU6 push de ld bc,0 ld c,(hl) inc hl ld a,(BLNRGR) and a jr z,DATCU7 ld b,(hl) inc hl DATCU7 ld a,b or c jr z,DATCU8 ;block leer ld a,0FFh ;voll DATCU8 pop de ;d: Kbyte/block push de push hl ld hl,(RECMSK) DATCU9 srl a rr h rr l dec d jr nz,DATCU9 ld (RECMSK),hl pop hl pop de dec e jr nz,DATCU6 pop bc ret ;----------------------------------------------------- LESEXT push bc ;c: akt. extent push de push hl ;hl: ext-Anfang ld hl,QUFCB ;open Quelle ld de,12 add hl,de ld (hl),c ;akt. extent eintragen inc hl ld b,23 LESEX1 ld (hl),0 ;Rest loeschen inc hl djnz LESEX1 ld de,HI2DMA ld c,26 ;set dma call BBDOSX ld de,QUFCB ld c,15 ;open file call BBDOSX cp 0FFh jp z,LESEXF ;Fehler ld hl,(RECMSK) ;record-Maske ld a,h ;leer ? or l jr z,LESEX6 ;ja, CY=0 -> fertig ld b,16 ;16K/extent ld de,(PUCOPY) ;Anfang COPY-Puffer ld c,0 ;erste recNr LESEX2 srl h ;naechsten Block rr l jr nc,LESEX3 ;nicht besetzt push de ;Puffer-Anfang push bc ;Block-Zaehler push hl ;Maske retten ld b,8 ;8 rec's/Kbyte ld hl,QUFCB+32 ;cr ld (hl),c ;eintragen LESEX4 push bc ;Zaehler rec's push de ld c,26 ;set dma call BBDOSX ld de,QUFCB ld c,20 ;sequ. read call BBDOSX pop de pop bc and a jp nz,LESEX5 ;extent-Ende ld hl,80h add hl,de ex de,hl ;naechste dma dec b ;Block fertig ? (K) jr nz,LESEX4 ;nein -> weiter LESEX5 pop hl ;Maske pop bc ;Block-Zaehler pop de ;Block-Puffer-Anfang reg. LESEX3 push hl ld hl,400h ;Block-Laenge add hl,de ex de,hl ;Anfang Puffer naechster Block pop hl ld a,c add a,8 ld c,a ;naechsten recNr-Anfang dec b ;fertig ? jr nz,LESEX2 ;nein -> weiter ld de,QUFCB ld c,16 ;close file call BBDOSX and a LESEX6 pop hl ;hl: ext-Anfang pop de pop bc ;c: aktueller extent ret LESEXF scf ld a,3 ;file not found jr LESEX6 ;--------------------------------------------------- SCHEXT push bc ;c: akt. extent push de push hl ld hl,ZIFCB+12 ld (hl),c ;eintragen inc hl ld b,23 SCHEX1 ld (hl),0 ;Rest loeschen inc hl djnz SCHEX1 ld de,HI2DMA push bc ld c,26 ;set dma call BBDOSX pop bc ld de,ZIFCB push de ld c,15 ;open file call BBDOSX cp 0FFh ;Fehler ? pop de jr nz,SCHEX2 ;nein ld c,22 ;create call BBDOSX SCHEX2 inc a ld a,2 jp z,SCHEXF ;too many files ; ld hl,(RECMSK) ;record-Maske ld a,h or l ;leer ? jr z,SCHEX7 ;ja, fertig ld b,16 ld de,(PUCOPY) ld c,0 SCHEX3 srl h ;naechsten Block rr l jr nc,SCHEX4 ;nicht besetzt push de push bc push hl ld b,8 ;8 rec's/K ld hl,ZIFCB+32 ;cr ld (hl),c ;eintragen SCHEX5 push bc push de ld a,(LASTEX) ;letzter extent ? and a jr nz,SCHEX6 ;nein ld hl,(DIRAD) ;rc push de ld de,15 add hl,de pop de ld a,(hl) cp c ;erreicht ? jr z,SCHEX8 ;ja, fertig SCHEX6 ld c,26 ;set dma call BBDOSX ld de,ZIFCB ld c,21 ;sequ. write call BBDOSX pop de pop bc and a jp nz,SCHXFF ;disk full ld hl,80h add hl,de ;naechste dma ex de,hl inc c ;naechsten record dec b ;Block fertig ? jr nz,SCHEX5 ;nein -> weiter pop hl pop bc pop de SCHEX4 push hl ld hl,400h add hl,de ex de,hl ;Anfang naechstes K pop hl ld a,c add a,8 ld c,a dec b ;fertig ? jr nz,SCHEX3 ;nein -> naechstes K SCHEX9 ld de,ZIFCB ld c,16 ;close file call BBDOSX and a SCHEX7 pop hl pop de pop bc ret ; SCHEX8 pop de pop bc pop hl pop bc pop de jr SCHEX9 SCHEXF scf jr SCHEX7 SCHXFF pop hl pop bc pop de ld a,1 ;disk full jr SCHEXF ;************************************************ ÿªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª