TITLE 64180-Teil fuer EUMEL-SHard Apple-Disk Unterstuetzung ; 24.05.86, M. Staubermann ; Ueberarbeitet: 04.01.87 INCLUDE HD64180.LIB .LIST CSEG ; ;---------------------------------------------------------------- ; ; Globale Adressen ; GLOBAL ANALOG, DISKBK, INIDISK ; ;---------------------------------------------------------------- ; ; Externe Adressen ; EXTERNAL TO6502, WTEND, TO65WA, ZGERL, RD6502 EXTERNAL HGOP, WARTE, MEMDMA ;--------------------------------------------------------------------------- ; ; K O N S T A N T E ; ;--------------------------------------------------------------------------- SEKTOR EQU 0F00CH LASTTRACK EQU 0F00DH ANALOGWERT EQU 0F00FH TASK EQU 0F080H PARAM EQU 0F081H DEFBYTE EQU 0F082H DISKNO EQU 0F083H TRACK EQU 0F084H DISKERR EQU 0F086H BUFPAGE EQU 0E0H ; Erste Page des Trackpuffers SEMA: DEFB 0 ; Semaphor fuer Apple-Disk LASTDISK: DEFB 0FFH DEFBYTE0: DEFB 0E0H ; Drive 0 DEFBYTE1: DEFB 0E0H ; Drive 1 ;--------------------------------------------------------------------------- ; ; A N A L O G ; Eingang: E = Nummer des Analogschalters (1..4) ; Ausgang: BC = Analogwert (0..255) ; ;--------------------------------------------------------------------------- ANALOG: LD A,E ; An jedem Kanal moeglich AND A JR Z,ILLEGAL ; Nur Analogschalter 1..4 CP 5 JR NC,ILLEGAL LD H,E ; Parameter ist Analogschalternr. LD L,6 ; Analogport abfragen CALL TO6502 ; Auf Taskende warten CALL WTEND ; Auf Ergebnis warten LD HL,LOW ANALOGWERT CALL RD6502 LD C,A LD B,0 ; Ergebnis in BC POP HL RET ILLEGAL: LD BC,-1 POP HL RET ;--------------------------------------------------------------------------- ; ; C H K A C C ; Semaphorhandler fuer Apple-Disks ; ; Akku veraendert, warte wird aufgerufen ; CHKACC: LD A,(SEMA) ; Disk-Zugriffssemaphor AND A ; 0=frei JR Z,ISFREE ; Ja -> CALL WARTE JR CHKACC ISFREE: DEC A LD (SEMA),A ;Semaphor sperren RET ;--------------------------------------------------------------------------- ; ; I N I D I S K ; Eingang: A = Kanalnummer (29, 30) ; DE = Schluessel von control 'size' ; Ausgang: BC = Anzahl 512-Byte Bloecke, die auf die Disk passen ; ;-------------------------------------------------------------------------- INIDISK: PUSH HL PUSH AF CALL CHKACC LD A,0FFH ; Nach der naechsten Operation LD (LASTDISK),A ; Track neu laden LD C,081H LD A,D AND A JR Z,INIDISK3 ; DE = 0, 1, 2 ; Format ueber Schluessel AND 10000010B ; Bit 7 und Bit 1 ausblenden JR Z,INIDISK4 ; 0: Erphi, 160k LD C,0E0H CP 10B ; 2: Erphi, 640k JR Z,INIDISK4 LD C,0A1H CP 10000000B ; 128: Ehring, 160k JR Z,INIDISK4 DEC C ; 130: Ehring 640k JR INIDISK4 INIDISK3: LD A,E ; Kein analytischer Schluessel CP 1 JR Z,INIDISK4 ; 1: 40 Tracks LD C,0E0H ; 2 * 80 Tracks INIDISK4: POP AF LD HL,DEFBYTE0 CP 30 JR Z,INIDISK5 INC HL INIDISK5: LD (HL),C ; Defbyte eintragen LD HL,SEMA LD (HL),0 ; Semaphor freigeben POP HL BIT 0,C ; 160k oder 640k ? LD BC,640*2 RET Z LD BC,160*2 RET ;--------------------------------------------------------------------------- ; ; D I S K B K ; Blockio auf Apple-Drives ; ; Eingang: A = Kanal (29, 30) ; DE = Blocknummer ; HL = Hauptspeicheraddresse des Blocks ; (HGOP) : 1 = BLOCKOUT, 0 = BLOCKIN ; Ausgang: BC = Fehlercode (0, 1, 2) ; ;-------------------------------------------------------------------------- DISKBK: PUSH DE PUSH AF ; Kanal merken CALL CHKACC ; Auf freie Diskroutinen warten XOR A ; A := 0 LD B,3 DIVLOOP: SRL D ; DE DIV 8 (Blocks/Track) RR E RRA DJNZ DIVLOOP ; E = Tracknummer ; D = 0 RRA RRA RRA RRA ; A = Sektornummer LD D,E LD E,A ; DE = Track/Sektor LD A,(HGOP) ; BLOCKIN oder BLOCKOUT ? DEC A CALL Z,TRANSPORT ; BLOCKOUT: 180-RAM --> 6502-RAM DI IN0 B,(CBR) LD C,51H ; Zeropage 6502 einblenden OUT0 (CBR),C CALL ZGERL POP AF ; Kanal zurueck AND 1 ; Diskno in A LD C,A LD A,(LASTDISK) CP C JR Z,DISKBK2 LD A,0FFH LD (LASTTRACK),A ; Track muss neu geladen werden DISKBK2: PUSH HL LD HL,TRACK LD (HL),D ; Track LD A,C LD (LASTDISK),A DEC HL LD (HL),C LD A,(DEFBYTE0) DEC C INC C JR Z,DISKBK3 LD A,(DEFBYTE1) DISKBK3: DEC HL LD (HL),A ; Defbyte LD A,(HGOP) DEC A ; Read/Write Param DEC HL LD (HL),A LD A,E ; Sektor LD (SEKTOR),A DEC HL LD (HL),1 ; Task: Disk R/W starten OUT0 (CBR),B EI CALL TO65WA ; Auf Beendigung der Task warten ; EUMEL-'warte' wird aufgerufen! LD HL,LOW DISKERR CALL RD6502 POP HL PUSH AF LD A,(HGOP) DEC A CALL NZ,TRANSPORT POP AF LD BC,2 DEC A JR Z,DISKBK1 ; 2 = Diskettenfehler DEC BC DEC A JR Z,DISKBK1 ; 1 = Writeprotected DEC BC ; 0 = ok DISKBK1: XOR A LD (SEMA),A POP DE RET ;............................................................................ ; ; Falls HGOP = 0: ; 2 Sektoren (E, E+1) aus Basisspeicher --> 64180 (HL) ; Falls HGOP = 1: ; 2 Sektoren aus 64180-RAM (HL) --> Basisspeicher (E, E+1) ; ; Eingang: E = Sektornummer (muss gerade sein) ; HL = Hauptspeicheradresse ; Ausgang: A, BC, HL veraendert TRANSPORT: PUSH HL PUSH DE LD A,E ; Sektor EX DE,HL ; HL (log. Adr.) --> DE AND 0FH ; 0..15 OR BUFPAGE ; Highbyte des Trackbuffers 6502 LD H,A ; phys. Adr. berechnen LD L,0 LD BC,512 ; 512 Bytes uebertragen LD A,(HGOP) ; Transferrichtung CALL MEMDMA ; DMA-Transfer POP DE POP HL RET END