mirror of
https://github.com/livingcomputermuseum/UniBone.git
synced 2026-04-19 01:08:17 +00:00
89 lines
2.0 KiB
Plaintext
89 lines
2.0 KiB
Plaintext
|
|
.title ma_ry - RX211/RX02 test driver
|
|
; RX11 DMA is generated by reading cylinder 0, head 0, sector 0
|
|
|
|
ryvect = 264 ; vector of RX211 controller
|
|
rybase = 777170 ; base addr of RX211 controller
|
|
rylabl = 'Y ; label char
|
|
|
|
rydens = 400 ; bit 8 in CSR determines density. 400 or 0
|
|
|
|
; --- ISRs, increment Interrupt FLags
|
|
ryiflg: .word 1 ; Interrupt flags
|
|
|
|
rybuff: .blkw 200+1 ; data buffer: 1 sector = 256 bytes = 128 words for double dens
|
|
|
|
ryecnt: .word 1 ; event counter
|
|
|
|
ryphas: .word 1 ; 0 = ISR after "Read sector", 1 = ISR after DMA
|
|
|
|
|
|
ryisr:
|
|
tst ryphas
|
|
bne ryisr1
|
|
; Phase = 0
|
|
; RX211 ISR triggered when data in controller buffer
|
|
; initiate command to DMA data into buffer, then INTR again
|
|
mov r1,-(sp) ; push
|
|
mov #rybase,r1 ; r1 = controller base address
|
|
; 1. Command "Empty buffer"
|
|
mov #rydens+100+2+1,(r1) ; Density, Intr enable + Empty Buffer + GO
|
|
1$: tstb (r1) ; wait for TR
|
|
bpl 1$
|
|
; 2. Word Count
|
|
.if ne rydens
|
|
mov #200,2(r1) ; double density: 128 words
|
|
.endc
|
|
.if eq rydens
|
|
mov #100,2(r1) ; single density: 64 words
|
|
.endc
|
|
2$: tstb (r1) ; wait for TR
|
|
bpl 2$
|
|
; 3. Bus Address
|
|
mov #rybuff,2(r1)
|
|
; now starting
|
|
|
|
mov (sp)+,r1 ; pop
|
|
inc ryphas
|
|
rti
|
|
ryisr1:
|
|
; Phase = 1
|
|
; RX211 ISR triggered on "DMA ready"
|
|
inc ryiflg ; set ISR flag after DMA
|
|
rti
|
|
|
|
; --- Initialize device after RESET
|
|
ryinit:
|
|
mov #rybase,r1 ; r1 = controller base address
|
|
mov #rydens+40000,(r1) ; init
|
|
1$:
|
|
bit #40,@#rybase
|
|
beq 1$ ; wait for "done"
|
|
|
|
clr ryecnt
|
|
return
|
|
|
|
; --- Restart new DMA transmission
|
|
rygo:
|
|
clr ryphas ; Start with ISR Phase = 0
|
|
mov #rybase,r1 ; r1 = controller base address
|
|
; sequence from RX02 Floppy Disk System User's Guide (July 1978, EK-RX02-UG-001)
|
|
|
|
; 1. command "read sector"
|
|
mov #rydens+100+6+1,(r1) ; Density, Intr enable + Read Sector + GO
|
|
1$: tstb (r1) ; wait for TR
|
|
bpl 1$
|
|
|
|
; 2. sector address into RX2DB
|
|
mov #1,2(r1) ; read sector 1
|
|
2$: tstb (r1) ; wait for TR
|
|
bpl 2$
|
|
|
|
; 3. track address into RX2DB
|
|
mov #0,2(r1)
|
|
; now starting
|
|
|
|
inc ryecnt ; register as event
|
|
return
|
|
|