From a54e22b7b347f891ef00b8b25a798311082eaa61 Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 5 Aug 2010 08:43:26 +0000 Subject: [PATCH] Merge softuart/cpm back into trunk: * cpm/bios.asm: - read/write: Get error code from avr part and return it to caller. - Added dph/dpb for ramdisk. - boot: If ramdisk exists, clear directory area, and copy ccp+bdos from boot disk. - wboot: Load system from ramdisk, if feasible. - Added print hex and reorderd functions to ease debugging. * cpm/ipl.asm - Increased number of sectors to load from 49 to 51 (= all reserved sectors). * cpm/Makefile: - oflag=direct removed from installcpm target. git-svn-id: svn://cu.loc/avr-cpm/trunk@63 57430480-672e-4586-8877-bcf8adbbf3b7 --- avrcpm/cpm/Makefile | 2 +- avrcpm/cpm/bios.asm | 331 +++++++++++++++++++++++++++++++++++--------- avrcpm/cpm/ipl.asm | 2 +- 3 files changed, 264 insertions(+), 71 deletions(-) diff --git a/avrcpm/cpm/Makefile b/avrcpm/cpm/Makefile index 7de02d2..80c9ef6 100644 --- a/avrcpm/cpm/Makefile +++ b/avrcpm/cpm/Makefile @@ -23,7 +23,7 @@ clean: rm -f cpm.bin diskimage installcpm: cpm.bin dummy - sudo dd if=cpm.bin of=${INSTALLDISK} bs=128 conv=sync oflag=direct,sync + sudo dd if=cpm.bin of=${INSTALLDISK} bs=128 conv=sync oflag=sync sync sleep 1 sync diff --git a/avrcpm/cpm/bios.asm b/avrcpm/cpm/bios.asm index a91de4f..b5985f7 100644 --- a/avrcpm/cpm/bios.asm +++ b/avrcpm/cpm/bios.asm @@ -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<= 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<