1
0
mirror of https://github.com/livingcomputermuseum/UniBone.git synced 2026-04-19 01:08:17 +00:00
Files
2019-09-02 15:37:29 +02:00

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