eject subttl Edit defect list ;Autor Wilfried Schmitten, Heidebloeck 16, 2 Hamburg 74 ;letzte Aenderung : 20.2.1989 ;Include File fuer Harddisk Utility cseg mdmen: db 0 db 'Neu ',0 db 'Append ',0 db 'Edit ',0 db 'Anzeigen ',0 db 'Ende ',0 mdtable: db mdanz dw defmend ;Ausgang db 1 dw definp db 2 dw defapp db 3 dw eddef db 4 dw defanz mdanz equ ($-mdtable)/3 defedit: fenster L,13,11,28,7,'DEFECT LIST',2,1,mdanz,1 ld hl,mdmen ld de,lst ld bc,(lanz) call select ld a,mdanz cp c jr z,defed3 push bc fenster M,40,5,50,25,'Edit Defect List' pop bc jr defed1 defed2: ld a,(lnr) call wselect ld bc,(lanz) ld de,lst ld hl,mdmen call select1 defed1: ld (lanz),bc ld a,c ld de,mdtable call acase3 jp defed2 defmend:pop hl ;Returnadresse vernichten call wclose defed3: call wclose ret deftext: db ' Eingabe Defect-List',0dh,0ah,0 apptext: db ' Anfuegen Defect-List',0dh,0ah,0ah,0 def1text: db ' Track Head',0dh,0ah,0 defapp: ld ix,(defliakt) ld hl,apptext jr defi7 definp: ld ix,deflist ld hl,deftext defi7: ld a,(Mnr) call wselect call cursorhome call erasescreenend call epstr ld hl,def1text call epstr defi1: call getposition ld h,8 ;x Koordinate call cursorat ld hl,inpbuf ;Input track ld (hl),8 ;max Laenge Buffer ex de,hl ld c,10 call bdos defi2: ld hl,inpbuf+1 ld a,(hl) or a jr z,defiend ;kein Input inc hl push hl ;Zeiger auf 1. Zeichen ld b,0 ld c,a add hl,bc ld (hl),0 ;Endemarke pop hl call eval10 push hl ld hl,cylinder-1 sbc hl,de ;Wert gueltig? pop hl jr nc,defi3 ;ja defi31: ld e,'G'-'@' ld c,2 call bdos call carreturn call eraselineend jr defi1 defi3: ld (ix+0),e ld (ix+1),d ;Track in Defektlist ;ablegen defi5: call sksp ;skip space charaters call eval10 xor a or (hl) ;alle Zeichen jr nz,defi61 ;fehlerfrei? nein ld hl,hd$head-1 sbc hl,de ;Eingabe gueltig? jr nc,defi6 ; ja defi61: ld e,'G'-'@' ld c,2 call bdos jr defi31 defi6: ld (ix+2),e ld (ix+3),d ld de,4 add ix,de ;*** Test Defektlist Overflow call newline jp defi1 defiend: push ix pop hl ;Anzahl berechnen ld (defliakt),hl ld de,deflist ;Ende- Anfang/4 or a sbc hl,de rrc h rr l rrc h rr l ld (dsortanz),hl ld (deflinto),hl ld de,dsortspec call sort call calcalt call caltdef ret ;Test auf doppelte Eintraege in der Defect List defdop: ld a,(deflinto) ;Anzahl gueltige Eintraege or a jr z,defdexit ;Liste leer dec a jr z,defdexit ;fertig, nur 1 Eintrag ld b,a ld c,0 ;Zaehler fuer aussortierte Eintraege ld hl,deflist defdloop: ld de,4 ex de,hl ; Pointer 1. Eintrag add hl,de ; Pointer 2. Eintrag call compare jr nz,defd1 push de ;Eintrag zum loeschen ;auf dem Stack merken inc c ;Zaehler fuer ungueltig defd1: djnz defdloop ld a,c or a jr z,defdexit ;keine ungueltigen Eintraege ld hl,(deflinto) or a sbc hl,bc ;neue Nettolaenge ld (deflinto),hl ;merken defl2: ld b,4 ;Zaehler fuer loeschen pop hl ;zu loeschenden Eintrag defl1: ld (hl),0ffh ;vom Stack inc hl djnz defl1 dec c jr nz,defl2 ld de,dsortspec call sort ;Liste neu sortieren ld hl,(deflinto) ld (dsortanz),hl ;neue Listenlaenge ;DEFLIST aktpointer anpassen ld b,l ld hl,deflist ld de,4 defl3: add hl,de djnz defl3 ld (defliakt),hl defdexit: ret ;Anzeigen der Defect und Alternate Liste zeiza equ 8 defanz: call defdop ld a,(Mnr) call wselect ld a,(deflinto) ;Pruefung ld hl,altlinto cp (hl) ;DEFLIST =< ALTLIST jr z,defa2 ;ja jr c,defa2 ;ja push af call cursorhome call erasescreenend ld hl,defwarn call epstr call wjn pop af defa2: or a jr z,defaexit ;kein Eintrag ld b,a ld c,zeiza ;Zeilenzaehler ld hl,deflist ld de,altlist defaloop1: push hl call cursorhome call erasescreenend ld hl,defames call epstr pop hl defaloop: push bc push de push hl ld a,(hl) ;low def cyl inc hl push hl ld h,(hl) ;high def cyl ld l,a ld de,ddcyl call mhldc ;Konvert nach Memory pop hl inc hl ld a,(hl) ;head def ld de,ddhead call madc ;Konvert pop hl pop de push de push hl ex de,hl ;das gleiche fuer alternate ld a,(hl) ;low alt cyl inc hl push hl ld h,(hl) ;high alt cyl ld l,a ld de,dacyl call mhldc ;Konvert nach Memory pop hl inc hl ld a,(hl) ;head alt ld de,dahead call madc ;Konvert ld hl,defatxt call epstr pop hl pop de ld bc,4 add hl,bc ex de,hl ;beide Pointer add hl,bc ;weiterschalten ex de,hl pop bc djnz defa1 defaexit: call wjn ret defa1: dec c ;Zeilenzaehler-1 jr nz,defaloop push bc push de push hl call wjn pop hl pop de pop bc ld c,zeiza jr defaloop1 edtext1: db 0dh,0ah,'Edit cr/weiter l/loesche',0 eddma: equ 80h eddef: ld a,(Mnr) call wselect call cursorhome call erasescreenend ld hl,edtext1 call epstr ld ix,deflist ld a,(deflinto) or a ret z ;Ausgang, keine Eintraege ld b,a ld c,0 ;Zaehler fuer geloeschte Eintraege eddef1: push bc eddef1a: ld l,(ix+0) ;low byte cyl ld h,(ix+1) ;high byte ld de,eddma+2 call mhldc ;zum Editieren in den Buffer ld a,(ix+2) ld de,eddma+7 call madc ;Head ebenfalls xor a ld (eddma+10),a ld hl,805h ;Cursorposition call cursorat call eraselineend ld hl,eddma ;Input track ld (hl),15 ;max Laenge Buffer inc hl ld (hl),9 ;Anzahl Character ld de,0 ld c,10 call bdos eddef2: ld hl,eddma+1 ld a,(hl) or a jr z,eddefloe ;kein Input,loeschen inc hl push hl ;Zeiger auf 1. Zeichen ld b,0 ld c,a add hl,bc ld (hl),0 ;Endemarke pop hl call testloe jr z,eddefloe ;L im String call sksp call eval10 push hl or a ld hl,cylinder-1 sbc hl,de ;Wert gueltig? pop hl jr nc,eddef3 ;ja eddef31: ld e,'G'-'@' ld c,2 call bdos call carreturn call eraselineend jr eddef1a eddef3: ld (ix+0),e ld (ix+1),d ;Track in Defektlist ;ablegen eddef5: call sksp ;skip space charaters call eval10 or a ld hl,hd$head-1 sbc hl,de ;Eingabe gueltig? jr c,eddef31 ;nein eddef6: ld (ix+2),e ld (ix+3),d ld de,4 add ix,de ;*** Test Defektlist Overflow call newline pop bc dec b jp nz,eddef1 eddefexit: ld hl,(deflinto) or a sbc hl,bc ld (deflinto),hl ;neue Nettolaenge ld de,dsortspec call sort ld hl,(deflinto) ld (dsortanz),hl ;neue Listenlaenge ld b,l ld hl,deflist ;deflist aktptr ld de,4 ;anpassen eddef7: add hl,de djnz eddef7 ld (defliakt),hl call calcalt call caltdef ret eddefloe: ld de,0ffffh ld (ix+0),e ld (ix+1),e ex (sp),hl ;l=loesch Zaehler inc l ex (sp),hl jr eddef6 ;Suchen ob l oder L im Eingabestring testloe: ld de,l1string call instr ret z ld de,l2string call instr ret l1string: db 'l',0 l2string: db 'L',0 ;Durchsehen der Alternate Track List, ob in Defekt List enthalten caltdef: ld a,(altlinto) ;Laenge Alt. List ld b,a ld c,0 ;Zaehler fuer defekt ld de,altlist caltd1: push bc ld a,(deflinto) ;Laenge Def. List ld b,a ld hl,deflist caltd2: call compare jr nz,caltd3 push de ;Alternate Track ist push hl ex de,hl ;defekt ld (hl),0ffh inc hl ld (hl),0ffh inc hl ld (hl),0ffh ;markiert pop hl pop de ex (sp),hl inc l ;entspricht Zaehler fuer defekt ex (sp),hl ld b,1 ;Durchlauf durch defekt List ;beenden caltd3: ld a,b ;Zaehler nach retten ld bc,4 ;Pointer in defekt List add hl,bc ;weiterschalten ld b,a djnz caltd2 ;Zaehler in Defektliste ld hl,4 ;Pointer in Alt List add hl,de ;weiterschalten ex de,hl ;wieder nach DE pop bc djnz caltd1 ;Zaehler in Alt.Liste ld a,c or a ret z ;Alternate Liste i.O. ld hl,(altlinto) or a sbc hl,bc ;- als defekt markierte ld (altlinto),hl ld de,asortspec call sort ;neu sortieren, defekte ;fallen raus ld hl,(altlinto) ld (asortanz),hl ;neue Listenlaenge ret defwarn: db ' Warnung',0dh,0ah db ' zu wenig Alternate Tracks',0dh,0ah,0 defames: db 0ah,' D.CYL HEAD A.CYL HEAD',0dh,0ah,0ah,0 defatxt:db ' ' ddcyl: db 0,0,0,0,0,' ' ddhead: db 0,0,0,' ' dacyl: db 0,0,0,0,0,' ' dahead: db 0,0,0 db 0dh,0ah,0 dseg dsortspec: dw deflist ;Start Adr. 1.Record dsortanz: dw 0 ;Anzahl records dw 4 ;size of each record dw compare ;Vergleichsroutine dw 0 ;no Pointer table db 0 ;no pointers db 0 ;unused deflinto: ;Defektlist Laenge "Netto" dw 0 defliakt: dw 0 deflist: ;Defekt Liste 2 byte track, 2byte head ds 256*4 cseg ; Automatische Ermittlung der alternate tracks ; aus den spare tracks der unbenutzten Systemspuren calcalt: ld ix,altlist ld a,1 ;2.log Laufwerk ca1: push af ld c,a ld b,spare ;Anzahl res. tracks xor a or b jr z,ca4 ;keine res vorhanden ld hl,0 ld de,cyl$num ca2: add hl,de ;cylinder nr. ermitteln dec c jr nz,ca2 xor a ca3: ld (ix+0),l ;in Liste eintragen ld (ix+1),h ; high byte ld (ix+2),a ld (ix+3),0 inc ix inc ix inc ix inc ix inc a cp hd$head jr c,ca3 ;naechster Head inc hl ;evtl. naechster Cyl djnz ca3 ca4: pop af inc a ;naechstes Laufwerk cp loghd jr nz,ca1 push ix ;Anzahl berechnen pop hl ld de,altlist ;Ende- Anfang/4 or a sbc hl,de rrc h rr l rrc h rr l ld (asortanz),hl ld (altlinto),hl ld de,asortspec call sort ret ;Vergleich zweier Eintraege Track und Head ;Zeiger HL und DE compare: push bc push de push hl push de ld e,(hl) inc hl ld d,(hl) inc hl ;Track ld b,0 ld a,(hl) ;Head and 3 ld c,a ex de,hl add hl,hl add hl,hl ;Track * 4 add hl,bc ; + Head ex (sp),hl ld e,(hl) inc hl ld d,(hl) inc hl ld a,(hl) and 3 ld c,a ex de,hl add hl,hl add hl,hl add hl,bc ;das gleiche f}r pointed DE pop de or a sbc hl,de pop hl pop de pop bc ret dseg asortspec: dw altlist asortanz: dw 0 dw 4 dw compare dw 0 db 0 db 0 altlinto: dw 0 ;"Nettolaenge" altlist: ds 4 * spare * hd$head * (loghd-1) cseg