P8000/WEGA/src/uts/dev/disk.s

196 lines
3.7 KiB
ArmAsm

!******************************************************************************
*******************************************************************************
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1986
KERN 3.2 Modul: disk.s fuer P8000-WDC
Bearbeiter: P. Hoge
Datum: 5.4.88
Version: 1.3
*******************************************************************************
******************************************************************************!
disk module
$segmented
constant
!Port Adressen!
PIOAD := %FFA1 !Daten lesen / schreiben!
PIOBD := %FFA3 !Steuerport !
PIOAC := %FFA5
PIOBC := %FFA7
RETI := %FFE1
!PIO Programmierung!
OUTPUT := %0F
INPUT := %4F
BITMODE := %CF
INTVEC := %18
PIOEI := %97FE
PIODI := %17FF
!Anschlussbelegung des Controlers am U880 PIO
PORT A: 8 bit bidirektionale Daten (D0 bis D7)
PORT B:
bit 0: /ST0 (Interrupt Request), Eingang
bit 1: /ST1 (Anforderung der Daten), Eingang
bit 2: /ST2 (Error), Eingang
bit 3: frei, Ausgang
bit 4: frei, Ausgang
bit 5: RESET (WDC-Reset), Ausgang
bit 6: TE und Richtung Datentreiber 0=write 1=read Ausgang
bit 7: TR (Transfer Request), Eingang
!
!WDC Steuerport!
RDATA := %4000 !Daten lesen!
WDATA := %00 !Daten schreiben!
RESET := %80 !Reset an Controler ausgeben!
!WDC-Kommandos!
READ := %21 !Read ab Blocknummer!
WRITE := %22 !Write ab Blocknummer!
global
!*
*mdcmd
* Kommando an WDC ausgeben
*
* r7 Request-Code (1=Read, 2=Write)
* r6 Drive-Nr.
* rr4 Blocknummer
* r3 Laenge
*!
_mdcmd procedure
entry
ei vi, nvi
ld r1, #PIOAD
ld r2, #PIOBD
ld r0, #WDATA+OUTPUT
outb @r2, rh0 !Datentreiber auf Ausgabe!
outb PIOAC, rl0 !Datenport auf Ausgaberichtung!
wready: inb rl0, @r2
bitb rl0, #0
jr nz,wready !Warten bis WDC bereit!
ld r0, #PIOEI !PIO-Interrupt freigeben!
outb PIOBC, rh0
outb PIOBC, rl0
ldk r0, #0 !M1 fuer PIO erzeugen!
outb RETI, rl0
!WDC-Kommando ausgeben!
ldb rh0, #READ
testb rl7
jr nz, cmd
ldb rh0, #WRITE
cmd: outb @r1, rh0 !Kommando ausgeben!
outb @r1, rl6 !Laufwerknummer!
outb @r1, rl5 !Blocknummer low!
outb @r1, rh5 !Blocknummer mitte low!
outb @r1, rl4 !Blocknummer mitte high!
outb @r1, rh4 !Blocknummer high!
outb @r1, rl3 !Laenge!
outb @r1, rh3
outb @r1, rl0 !Pruefsumme, nicht benutzt!
testb rl7
ret nz !Read!
wwait: inb rl0, @r2 !Write!
bitb rl0, #1 !Warten, bis WDC bereit fuer Daten!
jr nz, wwait
ret
end _mdcmd
!*
*mdin
*!
_mdin procedure
entry
ei vi, nvi
ld r4, #PIOAD
inirb @rr6, @r4, r5
di vi, nvi
ret
end _mdin
!*
*mdout
*!
_mdout procedure
entry
ld r4, #PIOAD
otirb @r4, @rr6, r5
ret
end _mdout
!*
*mdint2
* Return: r2 Fehlercode
*!
_mdint2 procedure
entry
ld r0, #PIODI !Interrupt PIO sperren!
outb PIOBC, rh0
outb PIOBC, rl0
ld r4, #PIOAD
ld r5, #PIOBD
ldk r2, #0 !Returncode kein Fehler!
inb rl1, @r5 !Status einlesen!
comb rl1 !logisch negieren!
andb rl1, #%07 !Maske!
cpb rl1, #%01 !Status 1 = fertig, kein Fehler!
ret z
ld r0, #RDATA+INPUT
outb PIOAC, rl0 !Daten-PIO auf Eingabe!
outb @r5, rh0 !Treiber auf Eingabe!
inb rl0, @r4 !Scheineingabe!
cpb rl1, #%03 !Fehler ?!
ret z !nein!
error: inb rl2, @r4 !Fehlercode einlesen!
ret
end _mdint2
!Initialisierung der Ports und des Controlers!
internal
init array [* byte] := [
PIOBC, INTVEC !Int Vektor holt PIO Port aus Reset!
PIOBD, WDATA !Reset wegnehmen, Richtung auf Write!
PIOBC, BITMODE !Port B auf Bitmode programmieren!
PIOBC, %87 !bit 7,2,1,0 auf Eingabe!
]
global
_mdinit procedure
entry
ld r5, #PIOBD
lda rr2, init
ldk r0, #(sizeof init)/2 !Anzahl der Ausgaben!
iloop: ldb rl5, @rr2 !low Portadresse!
inc r3, #1
outib @r5, @rr2, r0
jr nov, iloop
ret
end _mdinit
end disk