]> cloudbase.mooo.com Git - avrcpm.git/blobdiff - avrcpm/avr/dsk_fsys.asm
* ipl.mac added
[avrcpm.git] / avrcpm / avr / dsk_fsys.asm
index 60d6d73cfba63190674aadfa3ddd3685b07db0cd..1f3a1950b246c50bd2c0ebb6ee28d6ad382cf72c 100644 (file)
@@ -20,6 +20,7 @@
 ;    $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
@@ -90,7 +91,7 @@ erflag:               .byte   1               ;error reporting
 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)
@@ -100,6 +101,79 @@ hostlba:   .byte   3               ;host sector number (relative to partition start)
 ; ------------------------------- 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
 ; ====================================================================
@@ -111,7 +185,7 @@ hostlba:    .byte   3               ;host sector number (relative to partition start)
 ; --------------------------------------------------------------------
 ; Description:
 ; ====================================================================
-
+       
 dsk_param_getadr:
        ldiw    z,biospar_base
        add     zl,temp3
@@ -136,139 +210,135 @@ dsk_param_rd:
        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
-       
                
 ; -------------------------------------------------------------------
 
@@ -278,38 +348,45 @@ tmpdpb:   .byte   15
 
        .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
@@ -390,9 +467,6 @@ cpydpb_l:
        pop     zh
        ret
        
-; clear drive table
-; for now, only  entries 1 - 3 are cleared.
-
 ; ====================================================================
 ; Function: Clear drive table
 ; ====================================================================
@@ -405,12 +479,12 @@ cpydpb_l:
 ; 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
@@ -429,6 +503,8 @@ dsk_drvi_l:
 ; Init CP/M data structures 
 ;      temp = drive #
 ;
+;      return !0 if ok
+;              0 on error
 
 
 dsk_diskinit:
@@ -524,7 +600,7 @@ dsk_dicks0:
        adc     xh,_0
        movw    temp,y
        rcall   dram_writew_pp  
-       clr     temp
+       ori     temp,0xff               ;return ok
        ret
 
 ; error, free mem
@@ -533,31 +609,9 @@ dsk_di_err_p1:
        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
@@ -646,7 +700,7 @@ dsk_home:
 ; --------------------------------------------------------------------
 ; 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:
@@ -656,25 +710,24 @@ dsk_read:
        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:
@@ -686,19 +739,18 @@ 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
@@ -712,14 +764,15 @@ dsk_write:
        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