From bb9d3b8359e857918e2c75a5dd63af969baa7226 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 21 Aug 2015 17:08:12 -0400 Subject: [PATCH] move disk_inode to global data to reduce pressure on dp size --- Makefile | 4 +- data.aii | 13 -- fst.equ | 2 +- get_dir_entry.aii | 3 +- get_eof.aii | 4 + get_file_info.aii | 3 + get_mark.aii | 4 + globals.aii | 22 ++ main.aii | 3 + open.aii | 3 + params.aii | 4 + read.aii | 585 ++++++++++++++++++++++++++++++++++++++++++++++ set_mark.aii | 4 + stubs.aii | 1 - 14 files changed, 637 insertions(+), 18 deletions(-) delete mode 100644 data.aii create mode 100644 globals.aii create mode 100644 read.aii diff --git a/Makefile b/Makefile index e783c2a..3248179 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,8 @@ SOURCES = main.aii volume.aii get_file_info.aii \ open.aii get_dir_entry.aii get_mark.aii set_mark.aii get_eof.aii \ - close.aii \ - id_disk.aii stubs.aii tables.aii device.aii params.aii data.aii + close.aii read.aii \ + id_disk.aii stubs.aii tables.aii device.aii params.aii globals.aii OBJECTS=$(SOURCES:.aii=.o) diff --git a/data.aii b/data.aii deleted file mode 100644 index 9a15cca..0000000 --- a/data.aii +++ /dev/null @@ -1,13 +0,0 @@ - - string asis - - include 'records.equ' - -data record - - export target -target ds GSString32 - - endr - - end \ No newline at end of file diff --git a/fst.equ b/fst.equ index c288b4a..fb9dda4 100644 --- a/fst.equ +++ b/fst.equ @@ -17,7 +17,7 @@ tool_error ds.w 1 inode ds.w 1 parent_inode ds.w 1 -disk_inode ds v1_inode +;disk_inode ds v1_inode ;super ds v1_super __end equ * diff --git a/get_dir_entry.aii b/get_dir_entry.aii index 7ddfaa2..3749def 100644 --- a/get_dir_entry.aii +++ b/get_dir_entry.aii @@ -19,7 +19,8 @@ - + import disk_inode:v1_inode + import disk_super:v1_super ; ; dirent_entry 0 is a special case. diff --git a/get_eof.aii b/get_eof.aii index 86b2b8f..b52aefb 100644 --- a/get_eof.aii +++ b/get_eof.aii @@ -16,6 +16,10 @@ import do_ignore import init_fcr + + import disk_inode:v1_inode + import disk_super:v1_super + get_eof procname export with dp, fst_parms diff --git a/get_file_info.aii b/get_file_info.aii index ce5b20e..e71445c 100644 --- a/get_file_info.aii +++ b/get_file_info.aii @@ -21,6 +21,9 @@ import device_read + import disk_inode:v1_inode + import disk_super:v1_super + data record path_offset ds.w 1 diff --git a/get_mark.aii b/get_mark.aii index f7c1e2b..a7a640f 100644 --- a/get_mark.aii +++ b/get_mark.aii @@ -16,6 +16,10 @@ import do_ignore import init_fcr + + import disk_inode:v1_inode + import disk_super:v1_super + get_mark procname export with dp, fst_parms diff --git a/globals.aii b/globals.aii new file mode 100644 index 0000000..77e7b5d --- /dev/null +++ b/globals.aii @@ -0,0 +1,22 @@ + + string asis + + include 'records.equ' + include 'minix.equ' + +globals record + + export disk_inode +disk_inode ds v1_inode + + + export disk_super +disk_super ds v1_super + + + export target +target ds GSString32 + + endr + + end \ No newline at end of file diff --git a/main.aii b/main.aii index 64d40a3..3bc48a1 100644 --- a/main.aii +++ b/main.aii @@ -41,6 +41,9 @@ import format import erase_disk + import disk_inode:v1_inode + import disk_super:v1_super + header proc ; diff --git a/open.aii b/open.aii index a35ad22..afb231c 100644 --- a/open.aii +++ b/open.aii @@ -32,6 +32,9 @@ import path_to_inode import load_inode + import disk_inode:v1_inode + import disk_super:v1_super + open procname export with fst_parms diff --git a/params.aii b/params.aii index 1a643d7..b33a597 100644 --- a/params.aii +++ b/params.aii @@ -20,6 +20,10 @@ ; set tool_error if error. ; + + import disk_inode:v1_inode + import disk_super:v1_super + do_ignore proc export rts endp diff --git a/read.aii b/read.aii new file mode 100644 index 0000000..2786315 --- /dev/null +++ b/read.aii @@ -0,0 +1,585 @@ + + string asis + + include 'gsos.equ' + include 'minix.equ' + include 'fst.equ' + + include 'fst.macros' + + include 'M16.Debug' + + include 'records.equ' + + + import do_ignore + import init_fcr + import init_vcr + import read_data_block + + entry memcpy + entry do_transfer_count + entry do_data_buffer + entry do_request_count + + entry init_block + entry next_block + + entry slow_read + entry read_direct_block + entry read_partial_block + + import disk_inode:v1_inode + +my_dp record dp.__end + +dataBuffer ds.l 1 +requestCount ds.l 1 +transferCount ds.l 1 +mark ds.l 1 + +mtc ds.l 1 + +count ds.w 1 ; count from partial block read +block ds.w 1 ; current block for reading. + +zone ds.l 1 + + IF *>=$d4 THEN + AERROR 'dp -- too large.' + ENDIF + + endr + + + + ; + ; read logic... + ; if (mark & 1024-1) read partial block + ; while (transferCount >= 1024) direct read into dataBudder + ; if (transfterCount & 1024 - 1) read partial block + + + +do_transfer_count proc + with fst_parms, my_dp + + lda transferCount + sta [param_blk_ptr],y + iny + iny + lda transferCount+2 + sta [param_blk_ptr],y + rts + endp + +do_data_buffer proc + with fst_parms, my_dp + + lda [param_blk_ptr],y + sta dataBuffer + iny + iny + lda [param_blk_ptr],y + sta dataBuffer+2 + rts + endp + +do_request_count proc + with fst_parms, my_dp + + lda [param_blk_ptr],y + sta requestCount + iny + iny + lda [param_blk_ptr],y + sta requestCount+2 + rts + endp + +do_cache_priority proc + with fst_parms, my_dp, dp + + lda [param_blk_ptr],y + ; 0 or 1 only. + cmp #1 + bcs pre + sta dev_parms.dev_cache_pr + rts +pre + lda #parm_range_err + sta tool_error + rts + endp + + entry set_zone + +init_block proc + + with my_dp + + lda mark+1 + sta zone + lda mark+3 + and #$00ff + sta zone+2 + lsr zone+2 + ror zone + lsr zone+2 + ror zone + ldx zone + bra set_zone + endp + + ; updates block, zone, etc. + ; find the block to read. +next_block proc + + with my_dp, dp, v1 + + ldx zone + inx + inx + stx zone + entry set_zone + +set_zone + cpx #NR_DZONES*2 + bcc direct + +indirect +double_indirect + ; todo ... + lda #damaged_bitmap + sec + rts +direct + lda disk_inode.zone,x + sta block + clc + rts + + endp + +read procname export + + with dp, my_dp, fst_parms + + ; + jsr init_vcr + jsr init_fcr + + + ; can only read from regular files or links. + lda disk_inode.mode + and #S_IFMT + cmp #S_IFREG + beq @ok + cmp #S_IFLNK + beq @ok + + lda #bad_store_type + sec + rtl + +@ok + ; offset is 2 for class 0, 4 for class 1! + + + ; check for read-access + ldy #fcr.access + lda [= 1024 { read_direct_block } + lda transferCount+2 + bne @read + lda transferCount + beq done + cmp #1024 + bcc tail + +@read + jsr next_block + bcs exit + jsr read_direct_block + bcs exit + + bra aligned + +tail + ; read a partial tail block. + ; set up block... + jsr next_block + bcs exit + jsr read_direct_block + bcs exit + + +done + ; read complete! + ; todo -- update fcr, transferCount + + + ldy #fcr.mark + lda mark + sta [my_fcr],y + iny + iny + lda mark+2 + sta [my_fcr],y + + ; eventually, data_zone, data_block. + + ldx call_class + lda @table,x + tay + lda transferCount + sta [param_blk_ptr],y + iny + iny + lda transferCount+2 + sta [param_blk_ptr],y + + lda tool_error + cmp #0 + rtl + +@table dc.w FileIORec.transferCount, IORecGS.transferCount + + + lda tool_error + cmp #0 + +exit + rtl + + + endp + +update_counts proc + + with my_dp + + ;dataBuffer += count + + lda count + clc + adc dataBuffer + sta dataBuffer + lda #0 + adc dataBuffer+2 + sta dataBuffer+2 + + ; transferCount += count + + lda count + clc + adc transferCount + sta transferCount + + lda #0 + adc transferCount+2 + sta transferCount+2 + ; + + ; requestCount -= count + + lda requestCount + sec + sbc count + sta requestCount + lda requestCount+2 + sbc #0 + sta requestCount+2 + rts + + endp + + ; todo -- should read block into fcr, update fcr. +read_partial_block proc + ; read a block into io_buffer, then copy the parts we want into dataBuffer. + ; a = block number. + + with my_dp, dp + + jsr read_data_block + _rts.cs + + + ; count = 1024 - (mark & 0x1023) + lda mark + and #1024-1 + rsb #1024 + + + sta count + lda requestCount+2 + bne @ok + lda requestCount + cmp count + bcs @ok + ; requestCount is less than count... + sta count + +@ok + + ; assume block, etc are set up. + lda io_buffer + sta dev_parms.dev_buff + lda io_buffer+2 + sta dev_parms.dev_buff+2 + + lda block + jsr read_data_block + bcs exit + + ; set ptr to the offset... + lda mark + and #1024-1 + clc + adc io_buffer + sta ptr + lda #0 + adc io_buffer+2 + sta ptr+2 + + lda count + jsr memcpy + + + jsr update_counts + clc +exit + rts + + endp + +read_direct_block proc + + with dp, my_dp + + lda dataBuffer + sta dev_parms.dev_buff + lda dataBuffer+2 + sta dev_parms.dev_buff+2 + + lda block + jsr read_data_block + bcs exit + + lda #1024 + sta count + jsr update_counts + + clc +exit + rts + endp + +memcpy proc + + ; copy from ptr to dataBuffer + ; a = count + ;pha ; save + ; all registers are clobbered. + + with dp, my_dp + + lsr a ; / 2 + beq last_byte + + tax + ldy #0 +loop + lda [ptr],y + sta [dataBuffer],y + iny + iny + dex + bne loop + +last_byte + ;pla + ; carry still set... + bcc done + short m + lda [ptr],y + sta [dataBuffer],y + long m +done + rts + endp + +slow_read procname + + ; todo ... + lda #bad_store_type + sec + + rts + endp + + end diff --git a/set_mark.aii b/set_mark.aii index 978b71a..84736d7 100644 --- a/set_mark.aii +++ b/set_mark.aii @@ -11,6 +11,10 @@ include 'records.equ' + + import disk_inode:v1_inode + import disk_super:v1_super + my_dp record dp.__end displacement ds.w 1 diff --git a/stubs.aii b/stubs.aii index 89d49a6..0d13b7a 100644 --- a/stubs.aii +++ b/stubs.aii @@ -12,7 +12,6 @@ stubs proc export format export get_dev_num export judge_name - export read export set_eof export set_file_info export write