PAGE DELCNT: EQU 10*1000 ;Delay count for 10 mhz CPU CR: EQU 0Dh LF: EQU 0Ah BELCHR: EQU 07 EOS: EQU 0 CLRSCR: EQU 1AH ;TeleVideo clear screen code K: EQU 1024 BDOSINT = 224 ;BDOS Interrupt number OPTS = 40h ;board option switches (by Boot) ORG 408h TICKH DS 2 ;Banger parameters OPTSH DS 1 ;OPT_SW ALIGN MACRO BITS ORG (*+(%1)-1) / (%1) * (%1) ENDM ; CP/M to host disk constants HSTSIZ: EQU 1024 ;Blocking/Deblocking buffer size CPMSIB: EQU 1024/128 ;Standard sectors in block FPYSIB: EQU 2048/128 ;Sectors in floppy disk block HMDSIB: EQU 2048/128 ;Sectors in Memory drive block HRDSIB: EQU 4096/128 ;Sectors in hard disk block ; CP/M disk control block equates which define the ; disk types and maximum storage capability of each ; disk type. DSKS1: EQU 0 ;Single density, single sided. DSKS2: EQU 1 ;Single density, double sided. DSKD1: EQU 2 ;Double density, single sided. DSKD2: EQU 3 ;Double density, double sided. DSKD3: EQU 4 ;Double density, single sided DSKD4: EQU 5 ;Double density, double sided DSKD5: EQU 6 ;Double density, single sided DSKD6: EQU 7 ;Double density, double sided MAXFTP: EQU DSKD6 ;Maximum floppy type HMDTYP: EQU 128 ;M-DRIVE/H type (always 128 for MFORM) if gbc20 DSK8F1: EQU 8 ;Fujitsu 20 megabyte first 8 megabytes DSK8F2: EQU 9 ;Fujitsu 20 megabyte second 8 megabytes DSK8F3: EQU 10 ;Fujitsu 20 megabytes last 4 megabytes endif if gbc10 DSK8M1: EQU 8 ;Fujitsu 10 megabyte first 8 megabytes DSK8M2: EQU 9 ;Fujitsu 10 megabyte second 8 megabytes ENDIF if gbf40 DSKFF1: EQU 8 ;Fujitsu 40 megabye first 8 megabytes DSKFF2: EQU 9 ;Fujitsu 40 megabye first 8 megabytes DSKFF3: EQU 10 ;Fujitsu 40 megabye first 8 megabytes DSKFF4: EQU 11 ;Fujitsu 40 megabye first 8 megabytes DSKFF5: EQU 12 ;Fujitsu 40 megabye first 8 megabytes endif if DISK3 DSK506: EQU 8 ;DISK3 and ST506 ;Quantum 40 mbyte DSKQ51 EQU 9 DSKQ52 EQU 10 DSKQ53 EQU 11 DSKQ54 EQU 12 DSKQ55 EQU 13 endif S1DSM: EQU ((77-2)*26)/CPMSIB ;Single side,single density S2DSM: EQU ((77-2)*2*26)/FPYSIB ;Double side,single density D1DSM: EQU ((77-2)*2*26)/FPYSIB ;Single side, 256 B/S D2DSM: EQU ((77-2)*2*2*26)/FPYSIB ;Double side, 256 B/S D3DSM: EQU ((77-2)*4*15)/FPYSIB ;Single side, 512 B/S D4DSM: EQU ((77-2)*2*4*15)/FPYSIB ;Double side, 512 B/S D5DSM: EQU ((77-2)*8*8)/FPYSIB ;Single side, 1024 B/S D6DSM: EQU ((77-2)*2*8*8)/FPYSIB ;Double side, 1024 B/S F81DSM: EQU (8*(94-1)*8*11)/HRDSIB ;Fujistu 20 meg, 1st 8 meg F82DSM: EQU (8*(93-0)*8*11)/HRDSIB ;Fujistu 20 meg, 2nd 8 meg F83DSM: EQU (8*(57-0)*8*11)/HRDSIB ;Fujistu 20 meg, last 4 meg M81DSM: EQU (4*(123-1)*8*11)/HRDSIB ;Fujistu 10 meg, 1st 5 meg M82DSM: EQU (4*(121-0)*8*11)/HRDSIB ;Fujistu 10 meg, 2nd 5 meg ; SECCYL: EQU (8*8*22)/HRDSIB ;Fujistu 40 meg, #Blocks/cylinder FF1DSM: EQU (50-1)*SECCYL ;Fujistu 40 meg, 1st 5 meg FF2DSM: EQU 49*SECCYL ;Fujistu 40 meg, last 35 meg FF3DSM: EQU 48*SECCYL ;3rd - 5th 8 meg of 40 meg Fujistu FF4DSM: EQU 48*SECCYL FF5DSM: EQU 47*SECCYL ; ST5DSM: EQU (4*(153-2-14)*8*9)/HRDSIB ;ST506 5 meg ; QSECCYL EQU (8*8*9)/HRDSIB Q51DSM EQU (75-3) * QSECCYL ;22 tracks reserved by controller Q52DSM EQU (215-75) * QSECCYL ; 2 for boot Q53DSM EQU (355-215) * QSECCYL Q54DSM EQU (495-355) * QSECCYL Q55DSM EQU (512-495) * ((8*8*9)/FPYSIB) ;Want this to look like a floppy ; HMDDSM: EQU ((512-4)*8)/HMDSIB ;M-DRIVE/H 512k ; BDOS constants on entry to write WRALL: EQU 0 ;write to allocated WRDIR: EQU 1 ;write to directory WRUAL: EQU 2 ;write to unallocated PAGE ; Macro for generating Control Blocks for disk drives ; The format of these disk control blocks are as follows: ; ; 16 bits = -> translation table. ; 48 bits = -> Work area for CP/M. ; 16 bits = -> DIRBUF. ; 16 bits = -> Parameter block. ; 16 bits = -> check vector. ; 16 bits = -> allocation vector. ; ; They are called where ; NUMBER = Drive designation (A-P) ; TYPE = DSK (Signifies floppy, hard, mdrive0 ; XLATE = Address of translation table if needed ; DIRBUF = Address of 128 byte buffer for CP/M(can be same on all drive) ; DPBADR = Address of this disks TRUE (CP/M) DPB table NDSK: SET 0 ;Number of disk drives NOHRD: SET 0 ;Number of hard disk drives NOFDD: SET 0 ;Number of floppy disk drives ndisk2 set 0 ;Number of drives on DISK2 (must all be same size) ndisk3 set 0 ;Number of Drives on DISK 3 NOHMEM: SET 0 ;Number of up to 4 megabyte memory disks DPHNUM: SET 0 ; ALVS: SET 0 ;Allocation vector size CSVS: SET 0 ;Check vector size DPHGEN MACRO NUMBER,TYPE,XLATE,DIRBUF,DPBADR IF %2 <= MAXFTP DB NOFDD ELSE IF %2 < HMDTYP IF DISK3 DB ndisk3 else if disk2 DB ndisk2 endif endif ELSE IF %2 = HMDTYP DB NOHMEM ENDIF ENDIF ENDIF NDSK: SET NDSK+1 DPHNUM: SET DPHNUM+1 DRV%1: SET DPHNUM DW %3 DW 0,0,0 DW %4 DW %5 DW CSV+CSVS DW ALV+ALVS .type IF %2 <= MAXFTP NOFDD: SET NOFDD+1 CSVS: SET CSVS+(256/4) ALVS: SET ALVS+((D6DSM+7)/8) .type else .type IF %2 < HMDTYP NOHRD: SET NOHRD+1 CSVS: SET CSVS+0 IF GBC20 IF %2 = DSK8F1 ALVS: SET ALVS+((F81DSM+7)/8) ENDIF IF %2 = DSK8F2 ALVS: SET ALVS+((F82DSM+7)/8) ENDIF IF %2 = DSK8F3 ndisk2 set ndisk2+1 ALVS: SET ALVS+((F83DSM+7)/8) ENDIF ENDIF IF GBC10 IF %2 = DSK8M1 ALVS: SET ALVS+((M81DSM+7)/8) ENDIF IF %2 = DSK8M2 ndisk2 set ndisk2+1 ALVS: SET ALVS+((M82DSM+7)/8) ENDIF ENDIF IF GBF40 IF %2 = DSKFF1 ALVS: SET ALVS+((FF1DSM+7)/8) ENDIF IF %2 = DSKFF2 ALVS: SET ALVS+((FF2DSM+7)/8) ENDIF IF %2 = DSKFF3 ALVS: SET ALVS+((FF3DSM+7)/8) ENDIF IF %2 = DSKFF4 ALVS: SET ALVS+((FF4DSM+7)/8) ENDIF IF %2 = DSKFF5 ALVS: SET ALVS+((FF5DSM+7)/8) ndisk2 set ndisk2+1 ENDIF ENDIF IF ST506 IF %2 = DSK506 NDISK3 SET NDISK3+1 ALVS: SET ALVS+((ST5DSM+7)/8) ENDIF ENDIF IF Q540 IF %2 = DSKQ51 ALVS: SET ALVS+((Q51DSM+7)/8) ENDIF IF %2 = DSKQ52 ALVS: SET ALVS+((Q52DSM+7)/8) ENDIF IF %2 = DSKQ53 ALVS: SET ALVS+((Q53DSM+7)/8) ENDIF IF %2 = DSKQ54 ALVS: SET ALVS+((Q54DSM+7)/8) ENDIF IF %2 = DSKQ55 ALVS: SET ALVS+((Q55DSM+7)/8) NDISK3 SET NDISK3+1 ENDIF ENDIF .type else .type IF %2 = HMDTYP NOHMEM: SET NOHMEM+1 CSVS: SET CSVS+0 ALVS: SET ALVS+(((HMDDSM*8)+7)/8) .type ENDIF .type ENDIF .type ENDIF ENDM space 4,10 ; Macro for generating the Disk Parameter Blocks. ; ; Disk type definition blocks for each particular mode. ; The format of these areas are as follow: ; 8 bit = disk type code ; 16 bit = Sectors per track ; 8 bit = Block shift ; 8 bit = BS mask ; 8 bit = Extent mask ; 16 bit = Disk size/1024 - 1. ; 16 bit = Directory size. ; 16 bit = Allocation for directory. ; 16 bit = check area size. ; 16 bit = offset to first track. DPBGEN MACRO TYPE,SPT,BSH,BSM,EXM,DSM,DIRSIZ,ALVMSK,OFFSET DB %1 DW %2 DB %3,%4,%5 DW %6-1,%7-1,REV (%8) .hrd IF %1 <= MAXFTP DW (%7+3)/4 .hrd else DW 0 .hrd ENDIF DW %9 ENDM page ; CP/M 8-16 memory organization: ; ; 0000: 0000 +-----------------------+ Absolute ; | Interrupt vectors | ; 0400 | Transfer area | ; 040F +-----------------------+ ; ; SysSeg: +-----------------------+ 410 nominal ; 0000 | | ; | CCP 88 | ; 0AFF | | ; +-----------------------+ ; 0B00 | | ; | BDOS 88 | ; 27FF | | ; +-----------------------+ ; 2800 | | ; | BIOS 88 | ; | | ; 2E00 +-----------------------+ ; | uninit storage | ; 3400 +-----------------------+ 3810 ; ; ; LdrSeg: +-----------------------+ 4000 normal ; 0000 | | ; | LdCpm | ; 03FF | | ; +-----------------------+ ; 0400 | | ; | LdBdos | ; 11FF | | ; +-----------------------+ ; 1200 | | ; | LdBios | ; | | ; 1B00 +-----------------------+ ; | uninit storage | ; 2200 +-----------------------+ 6200 ; ; ; FFFF: +-----------------------+ ; 0000 | jmpl 0400h,0 | ; +-----------------------+ ORG 0000h ;Zero segment ZSEG: EQU 0000h ; Interrupt 224 -- BDOS call interrupt vector. ORG 4*BDOSINT STRAP: DS 2 ;Offset STRPSG: DS 2 ;Paragraph space 4,10 ORG 0000h ;System segment CCP: DS L$CCP BDOS: DS L$DOS BDOSE: = BDOS+6 ;True entry point space 4,10 ; The following jump vector defines the entry points into ; the CBIOS for use by CP/M86; therefore the order of ; these jumps cannot be modified. BIOS: JMP CBOOT ;Cold boot JMP WBOOT ;Warm boot j.CST: JMP NOTHIN ;Console status (input) j.CIN JMP NOTHIN ;Console input j.COUT JMP NOTHIN ;Console output JMP NOTHIN ;List output JMP NOTHIN ;Punch output JMP NOTHIN ;Reader input JMP HOME ;Set track to zero JMP SELDSK ;Select disk unit JMP SETTRK ;Set track JMP SETSEC ;Set sector JMP SETDMA ;Set Disk Memory Address JMP READ ;Read from disk JMP WRITE ;Write onto disk J.LST: JMP NOTHIN ;List status (output) JMP SECTRN ;Translate sector number JMP SETXAD ;Set DMA segment address. JMP GETSGT ;Get segment table address JMP GETIOB ;Get IOBYTE JMP SETIOB ;SET IOBYTE ; What follows is not part of the formal interface ; to CP/m, however various CompuPro/Sorcim utilities ; will not operate properly if arbitrary alterations ; are made. Caveat moderator. j.CPM: JMPL 0,SysSeg ;(reserved) ; Floppy step rate. STEPMS: VFD 4\ SRT, 4\ 0 space 4,10 bauds db 7 ;Relative port for console db 0eeh ;Mode register 1 db 7eh ;Mode register 2 db 27h ;Command register db 4 ;Relative port for lst: db 0eeh ;Mode register 1 db 7eh ;Mode register 2 db 27h ;Command register db 5 ;Relative port for ul1: db 0eeh ;Mode register 1 db 7eh ;Mode register 2 db 27h ;Command register space 4,10 ; Board option switches. ; Boot stores switch settings into OPTS. ; CBios/CBoot copies into OPT_SW. ; 0= Normal. ; 1= Use BitBanger for console. ; 2= (reserved) ; 3= (available) OPT_SW: DB 0 space 4,10 ; IOBYTE -- Currently used by I/O 3/4 for UL1 ; ; 7 6 5 4 3 2 1 0 ; +--------+-------+-------+--------+ ; | List | Punch | Reader| Console| ; +--------+-------+-------+--------+ IOBYTE: DB 0 space 4,10 ; Memory region descriptors. ; ; +---------------+ ; MRT: | region count | ; +---------------+---------------+ ; 0: | region base | ; +---- ----+ ; | region length | ; +-------------------------------+ ; | | ; . . . ; | | ; +---------------+---------------+ ; n: | region base | ; +---- ----+ ; | region length | ; +-------------------------------+ ; ; The region base is a paragraph and the length is ; in paragraphs. HiBase = 0F000h + (1000h - HIMEM) MRT: DB MRTCNT DW SYSEND, LOMEM-SYSEND IF HiMem <> 0 DW HiBase, HiMem-1 endif MRTCNT: = (*-MRT-1)/4 ECHO 8-MRTCNT DW 0, 0 ENDM