more work towards floppy directory reading
This commit is contained in:
1 parent
3aa33f76ff
commit
27c36bb554
6 files changed
+79
-21
No files matched your search
@@ -135,7 +135,7 @@
|
||||
; General purpose buffers, 512 bytes each, each starts at page start - XXX dynamic alllocation to be written
|
||||
|
||||
!addr SHARED_BUF_0 = $9200 ; XXX temporarily hardcoded for usage by SD card
|
||||
!addr SHARED_BUF_1 = $9400
|
||||
!addr SHARED_BUF_1 = $9400 ; XXX temporarily hardcoded for usage by floppy
|
||||
!addr SHARED_BUF_2 = $9600
|
||||
!addr SHARED_BUF_3 = $9800
|
||||
!addr SHARED_BUF_4 = $9A00
|
||||
|
||||
@@ -57,6 +57,10 @@ dev_fd_cmd_OPEN_dir:
|
||||
|
||||
@lp1_end:
|
||||
|
||||
jmp fs_1581_read_dir_open
|
||||
|
||||
|
||||
|
||||
; XXX experimental code below
|
||||
|
||||
; Try to read track 40, sector 0 (disk header)
|
||||
|
||||
@@ -2,26 +2,21 @@
|
||||
; Read a single sector from a floppy drive
|
||||
|
||||
|
||||
; XXX utilize this
|
||||
|
||||
dev_fd_util_readsector:
|
||||
|
||||
; Select FDD sector as buffer
|
||||
|
||||
lda #%10000000 ; select floppy buffer
|
||||
trb SD_BUFCTL
|
||||
trb SD_BUFCTL ; $D689
|
||||
|
||||
lda #%00000111
|
||||
trb FDC_CONTROL ; set drive 0 (internal) XXX support multiple drives
|
||||
|
||||
lda #%00001000
|
||||
trb FDC_CONTROL ; set side 0 by default
|
||||
lda #%00001111 ; set drive 0 (internal) and side 0
|
||||
trb FDC_CONTROL ; $D080
|
||||
|
||||
; Select physical track and sector based on logical ones from PAR_TRACK and PAR_SECTOR
|
||||
|
||||
lda PAR_TRACK
|
||||
dec
|
||||
sta FDC_TRACK
|
||||
sta FDC_TRACK ; $D084
|
||||
|
||||
lda PAR_SECTOR
|
||||
cmp #20
|
||||
@@ -29,8 +24,8 @@ dev_fd_util_readsector:
|
||||
|
||||
@side1:
|
||||
|
||||
lda #%00001000
|
||||
tsb FDC_CONTROL ; set side 1
|
||||
lda #%00001000 ; set side 1
|
||||
tsb FDC_CONTROL ; $D080
|
||||
|
||||
lda PAR_SECTOR
|
||||
sec
|
||||
@@ -42,21 +37,48 @@ dev_fd_util_readsector:
|
||||
@side0:
|
||||
|
||||
ldx #$00
|
||||
stx FDC_SIDE
|
||||
stx FDC_SIDE ; $D086
|
||||
clc
|
||||
ror
|
||||
sta FDC_SECTOR
|
||||
sta FDC_SECTOR ; $D085
|
||||
|
||||
; Ask the controller to read the sector
|
||||
; Ask the controller to read the sector XXX how to detect errors, missing disk, etc.?
|
||||
|
||||
lda #$40
|
||||
sta FDC_COMMAND
|
||||
@lp:
|
||||
lda FDC_STATUS_B ; XXX detect errors here XXX waiting is probably not corrent
|
||||
bpl @lp
|
||||
sta FDC_COMMAND ; $D081
|
||||
|
||||
; Wait for RDREQ (indicates sector found)
|
||||
|
||||
@lp1:
|
||||
lda FDC_STATUS_B ; $D083
|
||||
bpl @lp1
|
||||
|
||||
; Wait for BUSY flag to clear
|
||||
|
||||
@lp2:
|
||||
lda FDC_STATUS_A ; $D082
|
||||
bmi @lp2
|
||||
|
||||
; Wait for DRQ and EQ flags to go high
|
||||
|
||||
@lp3:
|
||||
lda FDC_STATUS_A ; $D082
|
||||
and #%01100000
|
||||
cmp #%01100000 ; XXX is this correct? .A seems to stay at $40 at this point
|
||||
bne @lp3
|
||||
|
||||
; Copy sector to buffer in RAM
|
||||
|
||||
; XXX
|
||||
lda #$00
|
||||
sta DMAJOB_DST_MB
|
||||
lda #<(SHARED_BUF_1 - $8000)
|
||||
sta DMAJOB_DST_ADDR+0
|
||||
lda #>(SHARED_BUF_1 - $8000)
|
||||
sta DMAJOB_DST_ADDR+1
|
||||
lda #$01
|
||||
sta DMAJOB_DST_ADDR+2
|
||||
|
||||
jsr util_dma_launch_from_hwbuf ; execute DMA job
|
||||
|
||||
clc
|
||||
rts
|
||||
@@ -0,0 +1,24 @@
|
||||
|
||||
;
|
||||
; Hypervisor virtual filesystem - reading directory
|
||||
;
|
||||
|
||||
|
||||
fs_1581_read_dir_open:
|
||||
|
||||
; Try to read track 40, sector 0 (disk header)
|
||||
|
||||
lda #40
|
||||
sta PAR_TRACK
|
||||
lda #$00
|
||||
sta PAR_SECTOR
|
||||
|
||||
jsr dev_fd_util_readsector ; XXX handle read errors
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; XXX continue implementation
|
||||
|
||||
jmp dos_EXIT_CLC
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
;
|
||||
; Hypervisor virtual filesystem - reading the file
|
||||
;
|
||||
|
||||
|
||||
fs_1581_read_file_open:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
;
|
||||
; Hypervisor virtual filesystem - opening the file
|
||||
; Hypervisor virtual filesystem - reading the file
|
||||
;
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user