]> cloudbase.mooo.com Git - avrcpm.git/blobdiff - avrcpm/cpm/bios.asm
Merge softuart/cpm back into trunk:
[avrcpm.git] / avrcpm / cpm / bios.asm
index a91de4ff6d77a6f871593884c66afff6ac77bd60..b5985f7f1852106e3e4f65bb3c682dec7f242cbb 100644 (file)
@@ -60,12 +60,197 @@ signon:
        db      msize/10+'0'
        db      msize - (msize/10)*10 + '0'     ;modulo doesn't work?
        db      "k cp/m vers 2.2"
-       db      cr,lf,0
+msgnl: db      cr,lf,0
+
+const:
+       in a,(0)
+       ret
+
+conin:
+       in a,(0)
+       cp $ff
+       jp nz,conin
+
+       in a,(1)
+       ret
+
+conout:
+       ld a,c
+       out (2),a
+       ret
+
+list:
+       ret
+
+listst:
+       ld a,0
+       ret
+
+punch:
+       ret
+
+reader:
+       ld a,$1F
+       ret
+
+prmsg:
+       ld      a,(hl)
+       or      a
+       ret     z
+       push    hl
+       ld      c,a
+       call    conout
+       pop     hl
+       inc     hl
+       jp      prmsg
+       
+prhex:
+       ld      a,c
+       push    af
+       rra     
+       rra     
+       rra     
+       rra     
+       call    prhexdigit
+       pop     af
+       ;       fall thru
+
+prhexdigit:
+       and     $0f
+       cp      10
+       jp      c,prd1
+       add     7
+prd1:
+       add     '0'
+       ld      c,a
+       jp      conout
+
 
 boot:
        ld      sp,buff
        ld      hl,signon
        call    prmsg
+       
+       xor     a
+       ld      (bootdsk),a
+       ld      a,(dpb)
+       ld      (bootspt),a
+       
+       ld      c,'I'-'A'
+       call    seldsk
+       ld      a,h
+       or      l
+       jp      z,boot1
+
+       ld      de,10
+       add     hl,de
+       ld      e,(hl)
+       inc     hl
+       ld      d,(hl)          ;de = dpb of first ram disk
+       
+       ld      hl,7
+       add     hl,de
+       ld      a,(hl)          ;get drm
+       inc     a
+       and     $0fc
+       rrca                    ;4 dir entries per sector
+       rrca                    ;Number of sectors to init
+       push    af
+       
+       ld      bc,6
+       add     hl,bc
+       ld      c,(hl)          ;Start track
+       push    bc              ;Save track
+       
+; Check, if we have reserved tracks.
+       ld      a,c
+       or      a
+       jp      z,boot0         ;Skip if not.
+
+; Save CPM to ram disk.
+
+       ld      a,(de)          ;sectors per track
+       ld      (bootspt),a
+       ld      a,'I'-'A'
+       ld      (bootdsk),a
+       call    home
+       ld      b,nsects
+       ld      c,0             ;track
+       ld      d,1             ;sektor (0 based)
+       ld      hl,ccp
+store1:
+       push    bc
+       push    de
+       push    hl
+       ld      c,d
+       ld      b,0
+       call    setsec
+       pop     bc
+       push    bc
+       call    setdma
+       ld      c,0
+       call    write
+       
+       pop     hl
+       ld      de,128
+       add     hl,de
+       pop     de
+       pop     bc
+       dec     b
+       jp      z,boot0
+       
+       inc     d
+       ld      a,(bootspt)
+       dec     a
+       cp      d               ;if sector >= spt then change tracks
+       jp      nc,store1
+       
+       ld      d,0
+       inc     c
+       push    bc
+       push    de
+       push    hl
+       ld      b,0
+       call    settrk  
+       pop     hl
+       pop     de
+       pop     bc
+       jp      store1
+
+; Clear directory area of ram disk.
+
+boot0:
+       pop     bc
+       call    settrk
+       pop     af
+       ld      d,a             ;d = # of sectors
+       ld      e,0             ;e = sector
+       push    de
+       ld      hl,dirbuf       ;Clear dirbuf
+       ld      c,128
+       ld      a,$E5
+boot_cl:
+       ld      (hl),a
+       inc     hl
+       dec     c
+       jp      nz,boot_cl
+
+       ld      bc,dirbuf
+       call    setdma
+       pop     de
+boot_cl2:
+       push    de
+       ld      c,e
+       ld      b,0
+       call    setsec
+       ld      c,0
+       call    write
+       pop     de
+       inc     e
+       dec     d
+       jp      nz,boot_cl2     
+       
+boot1: 
        xor     a
        ld      (iobyte),a
        ld      (cdisk),a
@@ -73,9 +258,10 @@ boot:
 
 wboot: ;re-load CP/M
        ld      sp,buff
-       ld      a,1<<BOOT_FUNC
+       ld      a,1<<BOOT_FUNC  ;init (de)blocking
        out     (22),a
-       ld      c,0
+       ld      a,(bootdsk)
+       ld      c,a
        call    seldsk
        call    home
        ld      b,nsects
@@ -105,9 +291,10 @@ load1:
        jp      z,gocpm
        
        inc     d
-       ld      a,d
-       cp      26              ;if sector >= 26 then change tracks
-       jp      c,load1
+       ld      a,(bootspt)
+       dec     a
+       cp      d               ;if sector >= spt then change tracks
+       jp      nc,load1
        
        ld      d,0
        inc     c
@@ -135,54 +322,25 @@ gocpm:
        ld      a,(cdisk)
        ld      c,a
        jp      ccp
-
-const:
-       in a,(0)
-       ret
-
-conin:
-       in a,(0)
-       cp $ff
-       jp nz,conin
-
-       in a,(1)
-       ret
-
-conout:
-       ld a,c
-       out (2),a
-       ret
-
-list:
-       ret
-
-listst:
-       ld a,0
-       ret
-
-punch:
-       ret
-
-reader:
-       ld a,$1F
-       ret
-
-seldsk:
-       ld hl,0                 ;error return code
-       ld a,c
-       out (15),a
-       in a,(15)               ;querry, if disk exists
-       or a                    ;0 = disk is ok
-       ret nz
        
-       ld l,c
-       ld h,0
-       add hl,hl
-       add hl,hl
-       add hl,hl
-       add hl,hl               ;*16
-       ld de,dpbase
-       add hl,de               ;return disk parameter header address
+seldsk:
+       ld      hl,dphtab
+       ld      b,0
+       add     hl,bc
+       add     hl,bc
+       ld      a,(hl)          ;get table entry for selected disk
+       inc     hl
+       ld      h,(hl)
+       ld      l,a             
+       or      h               ;no entry, no disk
+       ret     z               ;
+
+       ld      a,c
+       out     (15),a
+       in      a,(15)          ;querry, if disk exists
+       or      a               ;0 = disk is ok
+       ret     z
+       ld      hl,0            ;error return code
        ret
 
 home:
@@ -212,14 +370,17 @@ setdma:
 read:
        ld a,1<<READ_FUNC
        out (22),a
-       ld a,0
+       in a,(22)
+       and 1
        ret
 
 write:
-       ld      a,1<<WRITE_FUNC
-       or      c                       ;merge write type in c
+       ld      a,c
+       and     3               ;mask write  type
+       or      1<<WRITE_FUNC
        out     (22),a
-       ld      a,0
+       in a,(22)
+       and 1
        ret
 
 sectran:
@@ -235,16 +396,24 @@ sectran:
        ld h,0
        ret
 
-prmsg:
-       ld      a,(hl)
-       or      a
-       ret     z
-       push    hl
-       ld      c,a
-       call    conout
-       pop     hl
-       inc     hl
-       jp      prmsg
+dphtab:
+       dw      dpe0
+       dw      dpe1
+       dw      dpe2
+       dw      dpe3
+       dw      0       
+       dw      0       
+       dw      0       
+       dw      0       
+       dw      dperd0
+       dw      0       
+       dw      0       
+       dw      0       
+       dw      0       
+       dw      0       
+       dw      0       
+       dw      0       
+
        
 
 ;Disk Parameter Header
@@ -282,8 +451,17 @@ dpe3:      dw 0            ;XLT: No sector translation table
        dw chk3         ;CSV: Address of scratchpad area for changed disks
        dw all3         ;ALV: Address of an allocation info sratchpad
 
-dpb:
-       dw 26           ;SPT: sectors per track
+dperd0:        dw 0            ;XLT: No sector translation table
+       dw 0            ;000: Scratchpad
+       dw 0            ;000: Scratchpad
+       dw 0            ;000: Scratchpad
+       dw dirbuf       ;DIRBUF: Address of a dirbuff scratchpad
+       dw dpbrd        ;DPB: Address of a disk parameter block
+       dw chkrd0       ;CSV: Address of scratchpad area for changed disks
+       dw allrd0       ;ALV: Address of an allocation info sratchpad
+
+
+dpb:   dw 26           ;SPT: sectors per track
        db 3            ;BSH: data allocation block shift factor
        db 7            ;BLM: Data Allocation Mask
        db 0            ;Extent mask
@@ -294,6 +472,19 @@ dpb:
        dw 16           ;CKS, size of dir check vector
        dw 2            ;OFF, no of reserved tracks
        
+dpbrd: dw 32           ;SPT: sectors per track
+       db 3            ;BSH: data allocation block shift factor
+       db 7            ;BLM: Data Allocation Mask
+       db 0            ;Extent mask
+       dw 55           ;DSM: Disk storage capacity
+       dw 15           ;DRM, no of directory entries
+       db 128          ;AL0
+       db 0            ;AL1
+       dw 0            ;CKS, size of dir check vector
+       dw 2            ;OFF, no of reserved tracks
+       
+bootdsk:ds     1
+bootspt:ds     1
 
 dirbuf:
        ds 128
@@ -306,6 +497,8 @@ chk2:       ds 16
 all2:  ds 31
 chk3:  ds 16
 all3:  ds 31
+chkrd0:        ds 0
+allrd0:        ds 7
 
 end