unacnt: .byte 1 ;unalloc rec cnt
unadsk: .byte 1 ;last unalloc disk
unatrk: .byte 2 ;last unalloc track
-unasec: .byte 1 ;last unalloc sector
+unasec: .byte 2 ;last unalloc sector
erflag: .byte 1 ;error reporting
wrtype: .byte 1 ;write operation type
hostdsk: .byte 1 ;host disk number
-hostlba: .byte 3 ;host sector number (relative to partition start)
+hostlba: .byte 2 ;host sector number (relative to partition start)
hostparttbl: .byte PARTENTRY_SIZE*MAXDISKS ;host partition table (type, start sector, sector count)
hostparttbltop:
hostbuf: .byte HOSTSIZE ;host buffer (from/to SD-card)
ret
.endif
+; ====================================================================
; ====================================================================
; Function: Get a Pointer to a Partitiontable entry
; ====================================================================
add zh,_tmp1
ret
+; ====================================================================
; ====================================================================
; Function: Virtual Port Interface
; ====================================================================
adc zh,_0
ret
-dsk_param_wr:
+dsk_param_set:
rcall dsk_param_getadr
st z,temp
- cpi temp3,bcbadr+1-seektrk
- brne dsk_param_wr1
- std z+1,_0
-dsk_param_wr1:
cpi temp3,bcbadr+1-biospar_base
breq SetBCB
ret
-dsk_param_rd:
+dsk_param_get:
cpi temp3,seekdsk-biospar_base
breq dskDiskCheck
rcall dsk_param_getadr
brne sbcb_l
; rcall dbg_print_biosd
- rcall dpb_drvtblinit
+ rcall dpb_drvtblclear
; rcall dbg_prdrvtbl
ret
cpi temp,RAMDISKNR
brsh dsk_dchrd ;maybe ramdisk
-; Check if selected disk # is less then # of disks.
-
- lds temp2,ndisks
tst temp2 ;0 disks?
brne dsk_dchpart1
; No disks yet, need to init
+ rcall dpb_drvtblclear
+.if 0
+ ldi temp2,0x40
+ ldi temp,1
+ lcall clockput
+.endif
rcall mgr_init_partitions ;disk chanched?
+ push temp
+.if 0
+ ldi temp2,0x40
+ ldi temp,2
+ lcall clockput
; sbrs temp,7
; rjmp dsk_dchpart0
- push temp
- rcall dpb_drvtblinit
+
+ lcall mgr_prnt_parttbl
+ printnewline
+.endif
+
; rcall dbg_prdrvtbl
pop temp2
dsk_dchpart0:
cbr temp2,0x80
lds temp,seekdsk
+; Check if selected disk # is less then # of disks.
+
dsk_dchpart1:
cp temp,temp2
brsh dsk_dch_err
rcall dpb_drvtbl_entry_get
or temp,temp2 ;if !0, drive is allready initialized
brne dsk_dchend
- lds temp,seekdsk
- rcall dpb_diskinit
-
+ lds temp3,seekdsk
+ mov temp,temp3
+ rcall dpb_biosdph_get
dsk_dchend:
+
.if DSKSEL_DEBUG
push temp
lds temp,seekdsk
ret
-; -------------------------------------------------------------------
+; ====================================================================
+; ====================================================================
.dseg
#endif
-; Copy the dpb data in flash memory, pointed to by Z to temp ram.
+; Copy the dpb data from flash memory, pointed to by Z, to temp ram.
dpb_copy_p:
push yh
;
-dpb_drvtblinit:
+dpb_drvtblclear:
ldsw x,biosdrvtbl
-; adiw x,2
+ sbiw x,0
+ breq dpb_drvi_ex
+
+dpb_drvi_1:
ldi temp3,8
-dpb_drvi_l:
+dpb_drvi_lp:
ldi temp,0
ldi temp2,0
rcall dram_writew_pp
dec temp3
- brne dpb_drvi_l
+ brne dpb_drvi_lp
lds temp,biosenddat
lds temp2,biosenddat+1
+ cp temp,_0
+ cpc temp2,_0
+ breq dpb_drvi_ex
+
rcall heap_init
+dpb_drvi_ex:
clr temp
ret
; ====================================================================
-; Function:
+; Function: Test disk format: avrcpmhd
; ====================================================================
; Parameters
; --------------------------------------------------------------------
; Registers : temp drive #
;
; --------------------------------------------------------------------
-; Description:
+; Description: Not implemented yet.
; ====================================================================
dsk_tst_avrcpmhd:
- ori temp,0xff ; Test, return 'not found' for now.
+ clr temp ; Test, return 'not found' for now.
ret
ldi temp,1 ;1 sector header size
rcall dpb_copy
- clr temp
+ ori temp,0xff
ret
dsk_tyze_not:
- ori temp,0xff ;Not a YAZE disk image.
+ clr temp ;Not a YAZE disk image.
ret
; ====================================================================
dec temp2
brne dsk_tmyz80_loop
- clr temp
+ ori temp,0xff
ret
dsk_tmyz80_not:
- ori temp,0xff ;Not a MyZ80 hard disk image.
+ clr temp ;Not a MyZ80 hard disk image.
ret
; ====================================================================
dec temp2
brne dsk_tsimhd_loop
- clr temp
+ ori temp,0xff
ret
dsk_tsimhd_not:
- ori temp,0xff ;Not a simhd hard disk image.
+ clr temp ;Not a simhd hard disk image.
ret
; ====================================================================
; ====================================================================
; Parameters
; --------------------------------------------------------------------
-; Registers : temp drive #
+; Registers : temp3 drive #
;
; --------------------------------------------------------------------
; Description:
; ====================================================================
-dsk_img_type:
-
-; todo: flush hostbuf!
-; todo: flush hostbuf!
+dsk_format_get:
; Get first sector (512 byte) of current drive into hostbuf.
- push temp3
- mov temp3,temp
+ push temp3
ldi temp,0
ldi temp2,0 ;
rcall dsk_readhost_lba
- pop temp3
- push temp3
-
; Test for variable format avrcpmhd.
rcall dsk_tst_avrcpmhd
- breq dsk_img_prep
+ brne dsk_imgt_done
; Test for YAZE formats.
rcall dsk_tst_yaze
- breq dsk_img_prep
+ brne dsk_imgt_done
; Test for simhd format.
rcall dsk_tst_simhd
ldiw z,dpbdat_simhd*2
- breq dsk_img_fix
+ brne dsk_imgt_fixed
; Test for MyZ80 format.
rcall dsk_tst_myz80
ldiw z,dpbdat_myz80*2
- breq dsk_img_fix
+ brne dsk_imgt_fixed
; No special image found. Use avrcpm.
ldiw z,dpbdat_avrcpm*2
-dsk_img_fix:
+dsk_imgt_fixed:
rcall dpb_copy_p
-
-dsk_img_prep:
+ ori temp,0xff
+dsk_imgt_done:
+ pop temp3
+ ret
- pop temp3
+; ====================================================================
+; Function: Add CP/M image format data to partition table data
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : temp3 drive #
+;
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
+
+dpb_imgdata_get:
+
+; Test for known CP/M formats
+
+ rcall dsk_format_get
+ breq dpb_imgd_err ;no known format detected
+
+;
mov zl,temp3
rcall dsk_getpartentry ;get partition entry
ldiw y,tmpdpb
printstring ": Format not supported: Too much sectors per track! "
printnewline
+dpb_imgd_err:
clr temp
ret
-; ----------------------------------------------------------------------
-; Init CP/M data structures
-; temp = drive #
+; ====================================================================
+; Function:
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : temp drive #
+;
+; return !0 if ok
+; 0 on error
+; --------------------------------------------------------------------
+; Description: Init CP/M data structures
;
-; return !0 if ok
-; 0 on error
-
+; -----------------------------------------------------------------
+; DPH: | XLT | | | |DIRBUF | DPB | CSV | ALV |
+; -----------------------------------------------------------------
+;offset: 0 2 4 6 8 10 12 14
+;
+; -------------------------------------------------------------
+; DPB: | SPT |BSH|BLM|EXM| DSM | DRM |AL0|AL1| CKS | OFF |
+; -------------------------------------------------------------
+;offset: 0 5 7 11 13
+; ====================================================================
-dpb_diskinit:
+dpb_biosdph_get:
mov temp3,temp ;save disk #
- rcall dsk_img_type
+ rcall dsk_format_get
brne dpb_di_0
rjmp dpb_di_err
dpb_di_0:
; get mem for DPH
-; -----------------------------------------------------------------
-; DPH: | XLT | | | |DIRBUF | DPB | CSV | ALV |
-; -----------------------------------------------------------------
-;(offset) 0 2 4 6 8 10 12 14
ldi temp, low (16)
ldi temp2,high(16)
- rcall heap_get
+ rcall heap_get ;returns ptr to dph mem
brne dpb_di_1
rjmp dpb_di_err ;
dpb_di_1:
rcall dram_writew_pp ;DIRBUF
; get mem for DPB
-; -------------------------------------------------------------
-; DPB: | SPT |BSH|BLM|EXM| DSM | DRM |AL0|AL1| CKS | OFF |
-; -------------------------------------------------------------
-; 0 5 7 11 13
ldi temp, low (15)
ldi temp2,high(15)
#endif
rcall dsk_getpartentry ; Get Paritiontableentry
ld temp2,z ; Get Partitiontype
- andi temp,dskType_MASK
+ andi temp2,dskType_MASK
; Isn't it a Disk ?
cpi temp2,dskType_None
rcall dsk_setdrvparam ;todo: do this only if needed (disk change)
- cbi flags,readop ;not a read operation
-
andi temp,WRTMSK
sts wrtype,temp ;save write type
in temp,flags
rcall printhex
.endif
- sts erflag,_0 ;no errors (yet)
-
;Convert track/sector to an LBA address (in 128byte blocks)
lds xl,seeksec ;
ror xl
dec temp
brne dsk_sh1
- ;yl:xh:xl = host block to seek
-; active host sector?
- in _tmp0,flags ;host active flag
- sbi flags,hostact ;always becomes 1
- sbrs _tmp0,hostact ;was it already?
- rjmp dsk_filhst ;fill host if not
-
-; host buffer active, same as seek buffer?
- lds temp,seekdsk
- lds temp2,hostdsk ;same disk?
- cp temp,temp2 ;seekdsk = hostdsk?
- brne dsk_nomatch
-
-; same disk, same block?
- lds temp,hostlba
- lds temp2,hostlba+1
- lds temp3,hostlba+2
- cp xl,temp
- cpc xh,temp2
- cpc yl,temp3
- breq dsk_match
-;
-dsk_nomatch:
- ;proper disk, but not correct sector
- sbis flags,hostwrt ;host written?
- rjmp dsk_filhst
- push xl
- push xh
- push yl
- rcall dsk_writehost ;clear host buff
- pop yl
- pop xh
- pop xl
-
-dsk_filhst:
- ;may have to fill the host buffer
- lds temp,seekdsk
- sts hostdsk,temp
- sts hostlba,xl
- sts hostlba+1,xh
- sts hostlba+2,yl
-
- sbic flags,rsflag ;need to read?
- rcall dsk_readhost ;yes, if 1
- cbi flags,hostwrt ;no pending write
-
-dsk_match:
+ ;todo: yl should be 0 here.
+ ;xh:xl = host block to seek
+ movw temp,x
+ lds temp3,seekdsk
+ rcall dsk_rw_hostbuf
;copy data to or from buffer
ldiw z,hostbuf
adc zh,r1
.if DISK_DEBUG > 2
- push r0
- push r1
+ movw temp,r0
printstring "; host buf adr: "
- pop temp2
- pop temp
rcall printhexw
.endif
; Description:
; ====================================================================
dsk_readhost_lba:
- sts hostlba+0,temp
- sts hostlba+1,temp2
- sts hostlba+2,_0
- sts hostdsk,temp3
-#if 0
+#if 0
printnewline
printstring "readhst lba"
#endif
- rjmp dsk_readhost ;returns 0, if ok
+ sbi flags,rsflag ;must read data
+ rcall dsk_rw_hostbuf
+ lds temp,erflag ;returns 0, if ok
+ tst temp
+ ret
+; ====================================================================
+; Function: Get physical disk sector in hostbuf.
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : temp2:temp host block to read/write (lba)
+; temp3 disk #
+;
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
+dsk_rw_hostbuf:
+ ;xh:xl = host block to seek
+ sts erflag,_0 ;no errors (yet)
+
+; active host sector?
+ in _tmp0,flags ;host active flag
+ sbi flags,hostact ;always becomes 1
+ sbrs _tmp0,hostact ;was it already?
+ rjmp dsk_filhst ;fill host if not
+
+; host buffer active, same as seek buffer?
+ lds _tmp0,hostdsk ;same disk?
+ cp temp3,_tmp0 ;seekdsk = hostdsk?
+ brne dsk_nomatch
+
+; same disk, same block?
+ lds _tmp0,hostlba
+ lds _tmp1,hostlba+1
+ cp temp,_tmp0
+ cpc temp2,_tmp1
+ breq dsk_match
+
+dsk_nomatch:
+ ;proper disk, but not correct sector
+ sbis flags,hostwrt ;host written?
+ rjmp dsk_filhst
+ push temp3
+ push temp2
+ push temp
+ rcall dsk_writehost ;clear host buff
+ pop temp
+ pop temp2
+ pop temp3
+
+dsk_filhst:
+ ;may have to fill the host buffer
+ sts hostlba,temp
+ sts hostlba+1,temp2
+ sts hostdsk,temp3
+
+ sbic flags,rsflag ;need to read?
+ rcall dsk_readhost ;yes, if 1
+ cbi flags,hostwrt ;no pending write
+
+dsk_match:
+ ret
; ====================================================================
; Function: Does a Disk write operation
; Disktype not supported -> Return
ret
+
+; vim:set ts=8 noet nowrap
+
\r
;Drive A B C D E F G H I J K L\r
;drvtbl: dtbl <dpha,dphb,dphc,dphd, , , , ,dphi,dphj,dphk,dphl>\r
-drvtbl: dtbl <dpha, , , , , , , ,dphi,dphj,dphk,dphl>\r
+;drvtbl: dtbl <dpha, , , , , , , ,dphi,dphj,dphk,dphl>\r
+drvtbl: dtbl < , , , , , , , ,dphi,dphj,dphk,dphl>\r
\r
; Name spt bls dks dir cks off\r
- dpb dpb243, 26, 1024, 243, 64, 64, 2\r
- dpb dp8192s,32, 4096,2046, 512, 512, 2\r
- dpb dp8192, 32, 4096,2046,1024,1024, 2\r
+; dpb dpb243, 26, 1024, 243, 64, 64, 2\r
+; dpb dp8192s,32, 4096,2046, 512, 512, 2\r
+; dpb dp8192, 32, 4096,2046,1024,1024, 2\r
; dpb dpbrd, 32, 1024, 56, 32, 0, 2\r
dpb rd1016, 32, 2048, 508, 192, 0, 2\r
dpb rd1024, 32, 2048, 512, 192, 0, 0\r
dpb rd0960, 32, 2048, 480, 192, 0, 0\r
\r
-dpha: dph dpb243\r
+;dpha: dph dpb243\r
;dphb: dph dpb243\r
;dphc: dph dpb243\r
;dphd: dph dpb243\r