;m80 =ldrbios ;link bootldr[l4000]=cpmldr,ldrbios,scb .z80 true equ -1 false equ not true $txrdy equ 4 rev equ romrev-30h ; Rom Jump Table Definitions ;--------------------------- ; rom equ 0 rdhsrm equ rom+9 ;rom read disk routine wrhsrm equ rom+0Ch ;rom write disk routine include HD19DEF.MAC include DRIVES.MAC include DEFINE.MAC ;---------------------------------------------------------------------- extrn @civec, @covec, @aivec, @aovec, @lovec, @bnkbf extrn @crdma, @crdsk, @vinfo, @resel, @fx, @usrcd, @mltio extrn @ermde, @erdsk, @media, @bflgs extrn @date, @hour, @min, @sec extrn ?erjmp, @mxtpa ;---------------------------------------------------------------------- ; cp/m plus version 3.0 jump table ;---------------------------------------------------------------------- cseg ;resident jp boot ;arrive here from cold start load warmpt: jp wboot ;arrive here for warm start jp const ;return console input status jp conin ;read console character jp conout ;write conlole character jp list ;write list character jp auxout ;write aux character jp auxin ;read aux character jp home ;move to track zero on selected drive jp seldsk ;select disk drive jp settrk ;set track number jp setsec ;set sector number jp setdma ;set DMA address jp read ;read selected sector jp write ;write selected sector jp listst ;return list device status jp sectrn ;translate logical to physical sector number jp conost ;return console output status jp auxist ;return aux device input status jp auxost ;return aux device output status jp devtbl ;return address of character i/o table jp devini ;init character i/o devices jp drvtbl ;return address of disk drive table jp multio ;set number of consec. sec. to read/write jp flush ;flush user [de]blocking buffers jp move ;copy memory to memory jp time ;clock support jp selmem ;select memory bank jp setbnk ;set bank for next DMA jp xmove ;set banks for next move jp userf ;reserved for me. jp wboot ;reserved for DRI jp wboot ;reserved for DRI ;---------------------------------------------------------------------- const: conost: listst: auxist: auxost: list: auxout: conin: auxin: flush: time: write: setbnk: userf: selmem: xmove: multio: home: wboot: devtbl: devini: drvtbl: ret ;---------------------------------------------------------------------- boot: ;save interrupt vectors ld hl,0fff0h ;source ld de,irq_vec_buf ;dest ld bc,16 ;leng ldir ;copy ret ;---------------------------------------------------------------------- conout: in a,(s1stat) and 4 jr z,conout ld a,c out (s1data),a ret ;---------------------------------------------------------------------- settrk: ld (hsttrk+ramdaty),bc ;set track in ramdaty ret ;---------------------------------------------------------------------- setsec: ld (hstsec+ramdaty),bc ;set sector in ramdaty ret ;---------------------------------------------------------------------- setdma: ld (dmaadr+ramdaty),bc ;set dma address in ramdaty ret ;---------------------------------------------------------------------- sectrn: ld l,c ;hl=bc ld h,b inc hl ;start sectors at 1 ld a,d ;see if xlat table or e ret z ;return if no xlat ex de,hl ;hl=xlt add hl,bc ;add to table ld l,(hl) ;get xlated sector ld h,0 ret ;---------------------------------------------------------------------- seldsk:: ;select drive 0, 1k sectors, others set-up if floppy ld a,5 else ld a,9 endif ld (physpt+ramdaty),a ;set sectors for BAD ld hl,dpha ret ;---------------------------------------------------------------------- read:: ld iy,ramdaty ;set-up iy -> ramdaty call rdhsrm ;read from disk ld de,(dmaadr+ramdaty) ;destination address ld hl,dskbuf ;source address ld bc,400h ;number of bytes to transfer ldir or a ret z ;if error, ld a,1 ; say so ret ;endif ;---------------------------------------------------------------------- move: ;first call here is to move highest 128 bytes (ff80-ffff) ;on first call, replace vectors ex de,hl ldir ex de,hl ld a,h or l ret nz ;if [hl] = 0, just clobbered vectors push hl push de ld hl,irq_vec_buf ;source ld de,0fff0h ;top 16 bytes of memory ld bc,16 ldir pop de pop hl ;restore ret ;---------------------------------------------------------------------- ramdatY: db 0 ;(SEKDSK) BDOS disk number dw 0 ;(SEKTRK) BDOS track number ; dw 0 ;(SEKSEC) BDOS sector number ; dw 0 ;(SEKHST) Actual sector number on the disk ; db 0 ;(UNACNT) Unallocated record count db 0 ;(UNADSK) Unallocated disk number dw 0 ;(UNATRK) Unallocated track number ; dw 0 ;(UNASEC) Unallocated sector number ; db 0 ;(UNAMAX) Sectors per Unallocated block dw 0 ;(SECTRK) Logical Sectors per track ; db 0 ;(PHYSPT) Physical sectors per track db 0 ;(WRTYPE) Write type db 0 ;(CFLAG) Flag Byte db 0 ;(DFLAG) Flag Byte db 0 ;(TRSEC) Offset to logical sector within physical sector dw 0 ;(VMSGP) Pointer to virtual drive message ; dw 0 ;(VDRVP) Pointer to virtual drive in message ; db 0FFh ;(CDSK) Current drive db 0 ;(VDSK) Current virtual drive dw 0 ;(DMAADR) BDOS DMA address ; dw conout ;(CONOUT) Pointer to Current console output routine ; dw conin ;(CONIN) Pointer to Current console input routine ; dw const ;(CONSTS) Pointer to Current console status routine db 0 ;(CPYBNK) Copy of bank strobe (printer restore = false) ;---------------------------------------------------------------------- ; Default Application Interface area (13_Oct_83) ;----------------------------------------------- ; APIF: db 0 ;(HSTDRV) BDOS Drive Number (1st floppy) dw 0000 ;(HSTTRK) Desired Cylinder (lo) ; Desired Cylinder (hi) dw 1 ;(HSTSEC) Desired Sector (lo) ; Desired Sector (hi) db 1 ;(SECCNT) Number of sectors to transfer db 20 ;(RETRY) Retry Count dw dskbuf ;(HSTBUF) Buffer Address (lo) ; Buffer Address (hi) db 0 ;(ERFLAG) Error Code db 0 ;(OPFLAG) Options Flag dw 0 ;(PHYTRK) Physical track number (lo) ; Physical track number (hi) db 0 ;(PHYSEC) Physical sector number db 0 ;(PHYHD) Desired Head db 2 ;(PHYDRV) Physical Drive Number dw 0 ;(IOADD) Execution Address (lo) ; Execution Address (hi) ;---------------------------------------------------------------------- ; Ram MTABs (3_Oct_83) ;--------------------- ; mtab: mtma ;make mtab ;---------------------------------------------------------------------- dpbase: dpha: if floppy dw xlt1k ;xlt else dw 0 endif ds 10,0 ;scratch dw dpba ;dpb dw 0 ;csv dw 0 dw dirbcb dw dtabcb dw -1 ;hash db 0 ;hbank dphlen equ $-dpha dirbcb: db -1 ds 9,0 dw dirbuf ds 3,0 dtabcb: db -1 ds 9,0 dw dtabuf ds 3,0 dpbma ;make dpb xlt1k: db 1,4,2,5,3 irq_vec_buf equ $ dirbuf equ irq_vec_buf+16 dtabuf equ dirbuf+1024 END