1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
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
|