X-Git-Url: http://cloudbase.mooo.com/gitweb/avrcpm.git/blobdiff_plain/bd06e5abe9bd1e8ed0be797f3e36656e8dc12f6f..846ffdc92a6d4d2520e7cbd55ec5a3c91327f2c8:/avrcpm/cpm/bios.asm?ds=sidebyside diff --git a/avrcpm/cpm/bios.asm b/avrcpm/cpm/bios.asm index 6321916..1f44c64 100644 --- a/avrcpm/cpm/bios.asm +++ b/avrcpm/cpm/bios.asm @@ -13,21 +13,29 @@ ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . +; +; $Id$ +; msize: equ 62 ;size of available RAM in k bias: equ (msize-20) * 1024 -ccp: equ $3400+bias ;base of cpm ccp -bdos: equ ccp+$806 ;base of bdos -bios: equ ccp+$1600 ;base of bios -cdisk: equ $0004 ;current disk number (0 ... 15) -iobyte: equ $0003 ;intel iobyte -buff: equ $0080 ;default buffer address +ccp: equ 3400h+bias ;base of cpm ccp +bdos: equ ccp+806h ;base of bdos +bios: equ ccp+1600h ;base of bios +cdisk: equ 0004h ;current disk number (0 ... 15) +iobyte: equ 0003h ;intel iobyte +buff: equ 0080h ;default buffer address retry: equ 3 ;max retries on disk i/o before error cr: equ 13 lf: equ 10 +READ_FUNC: equ 7 +WRITE_FUNC: equ 6 +BOOT_FUNC: equ 5 +HOME_FUNC: equ 4 + org bios nsects: equ ($-ccp)/128 ;warm start sector count @@ -55,12 +63,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 0ffh + 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,01Fh + 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 00fh + cp 10 + jp c,prd1 + add a,7 +prd1: + add a,'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 0fch + 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,0E5h +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 @@ -68,7 +261,10 @@ boot: wboot: ;re-load CP/M ld sp,buff - ld c,0 + 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 push bc push de push hl + ld b,0 call settrk pop hl pop de @@ -126,147 +325,183 @@ gocpm: ld a,(cdisk) ld c,a jp ccp + +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 ; -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 + 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: - push af - ld a,0 - out (16),a - pop af - ret - -seldsk: - push af - ld a,c - cp 0 - jp nz,seldsk_na - ld hl,dph - pop af - ret -seldsk_na: - ld hl,0 - pop af - ret - + ld a,1<