From dd0ae7d2ba0b58425e88a52c757c75f1eb7693ac Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 14 Aug 2015 11:45:41 -0400 Subject: [PATCH] direct stuff --- fst.equ | 8 +- get_dir_entry.aii | 399 ++++++++++++++++++++++++++++++++++++++++++++-- gsos.equ | 3 + 3 files changed, 397 insertions(+), 13 deletions(-) diff --git a/fst.equ b/fst.equ index ea6267b..a9ca043 100644 --- a/fst.equ +++ b/fst.equ @@ -46,9 +46,11 @@ dirty ds.w 1 mark ds.l 1 ; current position ; dirent stuff. -dirent ds.w 1 ; current directory entry. -dirent_zone ds.w 1 ; current directory zone [0-6] -dirent_offset ds.w 1 ; current directory offset + +dirent_zone equ mark ; current directory zone [0-6] +dirent_offset equ mark+2 ; current directory offset + +dirent_entry ds.w 1 ; current directory entry. __sizeof equ * diff --git a/get_dir_entry.aii b/get_dir_entry.aii index 7f10a24..be62aa0 100644 --- a/get_dir_entry.aii +++ b/get_dir_entry.aii @@ -9,19 +9,41 @@ include 'records.equ' + ; + ; dirent_entry 0 is a special case. + ; (assuming base = 1, displacement = 1) + ; first call: + ; before + ; dirent_entry = 0, dirent_zone = 0, dirent_offset = 0 + ; after: + ; dirent_entry = 1, dirent_zone = 0, dirent_offset = 0 + ; + ; subsequent calls: + ; before + ; dirent_entry = 1, dirent_zone = ..., dirent_offset = ... + ; after + ; dirent_entry = 2, dirent_zone = ..., dirent_offset = ... + ; gde_dp record dp displacement ds.w 1 -count ds.w 1 + dirent_size ds.w 1 +dirent_zone ds.w 1 +dirent_offset ds.w 1 +dirent_entry ds.w 1 IF *>=$d4 THEN AERROR 'dp -- too large.' ENDIF endr + +data record + +dirent v1L_dirent endr get_dir_entry procname export @@ -70,16 +92,76 @@ dir @ok + ; if data.dirent.inode is valid, load the inode + ; (if not valid, this was a base/displace of 0 to return + ; the dirent count. field info will be returned from the + ; directory inode) - ; hooray! it's a directory. - ; boo! we have to do all this work! + lda data.dirent.inode + beq dispatch + +dispatch + + lda