; $Id$
;
+.equ DSKSEL_DEBUG = 0
; ---------------- Defines for the Filesystem Interface -------
.equ dskType_None = 0
.equ dskType_CPM = 1
.equ dskType_FAT = 2
- .equ dskType_RAM = 3
+; .equ dskType_RAM = 3
;*****************************************************
;* CP/M to host disk constants *
;*****************************************************
- .equ MAXDISKS = 6 ;Max number of Disks (partitions)
+ .equ MAXDISKS = 8 ;Max number of Disks (partitions)
.equ PARTENTRY_SIZE = 9 ;Size of a Partitiontableentry
.equ blksize = 1024 ;CP/M allocation size
.equ hostsize = 512 ;host disk sector size
wrtype: .byte 1 ;write operation type
hostbuf: .byte hostsize ;host buffer (from/to SD-card)
-hostparttbl: .byte PARTENTRY_SIZE*MAXDISKS ;host partition table (type, start sector, sector count)
+hostparttbl: .byte PARTENTRY_SIZE*MAXDISKS ;host partition table (type, start sector, sector count)
hostparttbltop:
hostdsk: .byte 1 ;host disk number
hosttype: .byte 1 ;host disk type (same entry as 1 parition entry)
; ------------------------------- Start of Code Segment
.cseg
+;---------------------------------------------------------------------
+
+.if DSKSEL_DEBUG
+
+dbg_prdrvtbl:
+ push xh
+ push xl
+ push temp3
+ push temp2
+ push temp
+ printnewline
+ printstring "drvtbl ("
+ lds xl,biosdrvtbl
+ lds xh,biosdrvtbl+1
+ movw temp,x
+ rcall printhexw
+ printstring "): "
+ ldi temp3,16
+dbg_pcpel:
+ rcall dram_readw_pp
+ rcall printhexw
+ printstring " "
+ dec temp3
+ brne dbg_pcpel
+ pop temp
+ pop temp2
+ pop temp3
+ pop xl
+ pop xh
+ ret
+
+dbg_print_biosd:
+ printnewline
+ lds temp,bcbadr
+ lds temp2,bcbadr+1
+ rcall printhexw
+ printstring " "
+ lds temp,biosdrvtbl
+ lds temp2,biosdrvtbl+1
+ rcall printhexw
+ printstring " "
+ lds temp,biosdirbuf
+ lds temp2,biosdirbuf+1
+ rcall printhexw
+ printstring " "
+ lds temp,biosenddat
+ lds temp2,biosenddat+1
+ rcall printhexw
+ printstring " "
+ ret
+.endif
+
+; ====================================================================
+; Function: Get a Pointer to a Partitiontable entry
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers : [w] z Pointer to the Partitionentry
+; [r] xl Number of Diskentry to Read
+; [w] _tmp0 scratch
+; [w] _tmp1 "
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
+dsk_getpartentry:
+
+ ldi zl,PARTENTRY_SIZE
+ mul xl,zl
+ ldiw z,hostparttbl
+ add zl,_tmp0
+ add zh,_tmp1
+ ret
+
; ====================================================================
; Function: Virtual Port Interface
; ====================================================================
; --------------------------------------------------------------------
; Description:
; ====================================================================
-
+
dsk_param_getadr:
ldiw z,biospar_base
add zl,temp3
ld temp,z
ret
+SetBCB:
+ lds xl,bcbadr
+ mov xh,temp
+ ldiw z,biosdrvtbl
+ ldi temp3,6
+sbcb_l:
+ rcall dram_read_pp
+ st z+,temp
+ dec temp3
+ brne sbcb_l
+
+; rcall dbg_print_biosd
+ rcall dsk_drvtblinit
+; rcall dbg_prdrvtbl
+
+ ret
+
+; ====================================================================
+; Function: Check if disk exists
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers :
+; Variables :
+; return 0, if selected disk not exist.
+; return !0, if disk exist
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
dskDiskCheck:
- lds temp2,seekdsk
- cpi temp2,RAMDISKNR
+ lds temp,ndisks
+ lds temp2,seekdsk
+.if DSKSEL_DEBUG
+ printnewline
+ printstring "DiskCheck: "
+ rcall printhexw
+.endif
+ cpi temp2,RAMDISKNR
brsh dsk_dchrd ;maybe ramdisk
; Check if selected disk # is less then # of disks.
- lds temp,ndisks
+ lds temp,ndisks
tst temp ;0 disks?
brne dsk_dchpart1
; No disks yet, need to init
rcall mgr_init_partitions ;disk chanched?
- sbrs temp,7
- rjmp dsk_dchpart0
+; sbrs temp,7
+; rjmp dsk_dchpart0
push temp
rcall dsk_drvtblinit
- rcall dbg_prdrvtbl
+; rcall dbg_prdrvtbl
pop temp
dsk_dchpart0:
- cbr temp,0x80
- lds temp2,seekdsk
+ cbr temp,0x80
+ lds temp2,seekdsk
dsk_dchpart1:
- cp temp2,temp
- brsh dsk_dcher
+ cp temp2,temp
+ brsh dsk_dch_err
+.if DSKSEL_DEBUG
printnewline
printstring "Select: "
mov temp,temp2
rcall printhex
-
- lds xl,biosdrvtbl
- lds xh,biosdrvtbl+1
+.endif
+ ldsw x,biosdrvtbl
lsl temp2 ;drive #
add xl,temp2
adc xh,_0
- rcall dram_readw_pp
+ rcall dram_readw_pp ;get drive table entry
- printstring ", "
- rcall printhexw
-
- or temp,temp2
+ or temp,temp2 ;if !0, drive is allready initialized
brne dsk_dchend
lds temp,seekdsk
rcall dsk_diskinit
- brne dsk_dcher
dsk_dchend:
- ldi temp,0
+.if DSKSEL_DEBUG
+ push temp
+ ldsw x,biosdrvtbl
+ lds temp,seekdsk
+ lsl temp ;drive #
+ add xl,temp
+ adc xh,_0
+ rcall dram_readw_pp
+ printstring ", "
+ rcall printhexw
+ pop temp
+.endif
+
ret
+dsk_dch_err:
+ ldi temp,0 ;error return
+ ret
+
+; Check RAMDISK
+
dsk_dchrd:
#if RAMDISKCNT
- cpi temp,RAMDISKNR+RAMDISKCNT
- brlo dsk_dchend
-#endif
-dsk_dcher:
- ldi temp,0xff ;error return
+ cpi temp,RAMDISKNR+RAMDISKCNT
+ brsh dsk_dchrd_err
+
+ ldi temp,0xff ;return ok
ret
-
-dskErrorRet:
- lds temp,erflag
+#endif
+dsk_dchrd_err:
+ ldi temp,0 ;error return
ret
-SetBCB:
- lds xl,bcbadr
- mov xh,temp
- ldiw z,biosdrvtbl
- ldi temp3,6
-sbcb_l:
- rcall dram_read_pp
- st z+,temp
- dec temp3
- brne sbcb_l
-
- rcall dbg_print_biosd
- rcall dsk_drvtblinit
+; ====================================================================
+; Function: Return status of last disk i/o function
+; ====================================================================
+; Parameters
+; --------------------------------------------------------------------
+; Registers :
+; Variables :
+; --------------------------------------------------------------------
+; Description:
+; ====================================================================
+dskErrorRet:
+ lds temp,erflag
ret
-;---------------------------------------------------------------------
-
-dbg_prdrvtbl:
- push xh
- push xl
- push temp3
- push temp2
- push temp
- printnewline
- printstring "drvtbl ("
- lds xl,biosdrvtbl
- lds xh,biosdrvtbl+1
- movw temp,x
- rcall printhexw
- printstring "): "
- ldi temp3,16
-dbg_pcpel:
- rcall dram_readw_pp
- rcall printhexw
- printstring " "
- dec temp3
- brne dbg_pcpel
- pop temp
- pop temp2
- pop temp3
- pop xl
- pop xh
- ret
-
-; -------------------------------------------------------------------
-dbg_print_biosd:
- printnewline
- lds temp,bcbadr
- lds temp2,bcbadr+1
- rcall printhexw
- printstring " "
- lds temp,biosdrvtbl
- lds temp2,biosdrvtbl+1
- rcall printhexw
- printstring " "
- lds temp,biosdirbuf
- lds temp2,biosdirbuf+1
- rcall printhexw
- printstring " "
- lds temp,biosenddat
- lds temp2,biosenddat+1
- rcall printhexw
- printstring " "
-
- ret
-
; -------------------------------------------------------------------
.cseg
-; init bios disk tables.
-; leave drive 'A' out for now
-
-
- rcall dbg_prdrvtbl
-
- rcall dsk_drvtblinit
- rcall dbg_prdrvtbl
-
- lds temp,biosenddat
- lds temp2,biosenddat+1
- rcall heap_init
-
- ldi temp,1
-dsk_pdil:
- cp temp,temp2
- brsh dsk_pdie
- push temp2
- push temp
- rcall dsk_diskinit
- pop temp
- pop temp2
- inc temp
- rjmp dsk_pdil
-
-
-
-dsk_pdie:
- mov temp,temp2
; Test DPBs (avrcpm format)
dpblist:
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
+;dpb243
+ .db 0x1A,0x00 ;spt
+ .db 0x03,0x07 ;block shift, bock mask
+ .db 0x00,0xF2 ;extent mask, low(disk size -1),
+ .db 0x00,0x3F ;high(disk size -1), low(dir max)
+ .db 0x00,0xC0 ;high(dir max), alloc0
+ .db 0x00,0x10 ;alloc1, low(chk size)
+ .db 0x00,0x02 ;high(chk size), low(offset)
+ .db 0x00,0x00 ;high(offset), fill
;dpb243
.db 0x1A,0x00 ;spt
.db 0x03,0x07 ;block shift, bock mask
pop zh
ret
-; clear drive table
-; for now, only entries 1 - 3 are cleared.
-
; ====================================================================
; Function: Clear drive table
; ====================================================================
; Description:
; ====================================================================
-; For now, only entries 1 - 3 are cleared.
+; For now, only entries 1 - 7 are cleared.
dsk_drvtblinit:
ldsw x,biosdrvtbl
adiw x,2
- ldi temp3,3
+ ldi temp3,7
dsk_drvi_l:
ldi temp,0
ldi temp2,0
; Init CP/M data structures
; temp = drive #
;
+; return !0 if ok
+; 0 on error
dsk_diskinit:
adc xh,_0
movw temp,y
rcall dram_writew_pp
- clr temp
+ ori temp,0xff ;return ok
ret
; error, free mem
movw temp,y
rcall heap_release
dsk_di_err:
- ldi temp,1
- or temp,temp
+ eor temp,temp ;return 0 (+ Z-flag)
ret
-; ====================================================================
-; Function: Get a Pointer to a Partitiontable entry
-; ====================================================================
-; Parameters
-; --------------------------------------------------------------------
-; Registers : [w] z Pointer to the Partitionentry
-; [r] xl Number of Diskentry to Read
-; [w] _tmp0 scratch
-; [w] _tmp1 "
-; --------------------------------------------------------------------
-; Description:
-; ====================================================================
-dsk_getpartentry:
-
- ldi zl,PARTENTRY_SIZE
- mul xl,zl
- ldiw z,hostparttbl
- add zl,_tmp0
- add zh,_tmp1
- ret
-
; ====================================================================
; Function: Does a Disk interaction
; --------------------------------------------------------------------
; Registers : in: temp
; Variables : [r] seekdsk Number of Disk to Read
-; [r] seeksec Sector to read
+; [r] seeksec Sector to read
; [r] seektrk Track to read
; --------------------------------------------------------------------
; Description:
sbi flags,readop ; Set read operation flag
;RAM disk?
- lds xl,seekdsk
+ lds xl,seekdsk
#if RAMDISKCNT
cpi xl,RAMDISKNR
brlt PC+2
rjmp rdsk_read
#endif
rcall dsk_getpartentry ; Get Paritiontableentry
- ld temp,z ; Get Partitiontype
+ ld temp,z ; Get Partitiontype
; Isn't it a Disk ?
- cpi temp,dskType_None
+ cpi temp,dskType_None
brne PC+2
rjmp dsk_read_err
-
; It must be a FAT16-Imagefile or CP/M Partition.
- sts unacnt,_0
- sbi flags,rsflag ;must read data
- ldi temp,WRUAL ;write type
- sts wrtype,temp ;treat as unalloc
+ sts unacnt,_0
+ sbi flags,rsflag ;must read data
+ ldi temp,WRUAL ;write type
+ sts wrtype,temp ;treat as unalloc
rjmp dsk_rwoper ;to perform the read
dsk_read_err:
; Parameters
; --------------------------------------------------------------------
; Registers : in: temp Write type
-; Variables : [r] seekdsk Number of Disk to Read
-; [r] seeksec Sector to read
-; [r] seektrk Track to read
+; Variables : [r] seekdsk Number of Disk to Read
+; [r] seeksec Sector to read
+; [r] seektrk Track to read
; --------------------------------------------------------------------
; Description:
; ====================================================================
dsk_write:
;write the selected sector
- sts erflag,_0
- cbi flags,readop ; not a read operation
-
+ sts erflag,_0
+ cbi flags,readop ; not a read operation
;RAM disk?
- lds xl,seekdsk
+ lds xl,seekdsk
#if RAMDISKCNT
cpi xl,RAMDISKNR
brlt PC+2
brne PC+2
rjmp dsk_write_err
+
; It must be a FAT16-Imagefile or CP/M Partition.
- cbi flags,readop ;not a read operation
+ cbi flags,readop ;not a read operation
andi temp,WRTMSK
- sts wrtype,temp ;save write type
+ sts wrtype,temp ;save write type
- cpi temp,WRUAL ;write unallocated?
+ cpi temp,WRUAL ;write unallocated?
brne dsk_chkuna ;check for unalloc
; write to unallocated, set parameters