summaryrefslogtreecommitdiff
path: root/system/shard-z80-ruc-64180/1.5/src/DISK80.MAC
diff options
context:
space:
mode:
Diffstat (limited to 'system/shard-z80-ruc-64180/1.5/src/DISK80.MAC')
-rw-r--r--system/shard-z80-ruc-64180/1.5/src/DISK80.MAC302
1 files changed, 302 insertions, 0 deletions
diff --git a/system/shard-z80-ruc-64180/1.5/src/DISK80.MAC b/system/shard-z80-ruc-64180/1.5/src/DISK80.MAC
new file mode 100644
index 0000000..8afb780
--- /dev/null
+++ b/system/shard-z80-ruc-64180/1.5/src/DISK80.MAC
@@ -0,0 +1,302 @@
+ 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
+ \ No newline at end of file