;******************************************************** ;* * ;* -- CUSTOM BIOS FOR CP/M VERSION 2.2 -- * ;* * ;* DOUBLE DENSITY CBIOS FOR BIGBOARD-II * ;* * ;* COPYRIGHT (C) 1982 BY RUSSELL SMITH * ;* 818 WEST HICKORY * ;* DENTON, TEXAS 76201 * ;* * ;* LAST EDIT DATE: 21-AUGUST-82 * ;* * ;******************************************************** ; ASEG .SFCOND ;DON'T LIST FALSE CONDITIONALS .Z80 ;USE ZILOG MNEMONICS ; TRUE EQU 1 FALSE EQU 0 ; IOBYTE EQU 0003H ;INTEL CONFIGURATION BYTE USRDRV EQU 00H ;USER/DRIVE TO LOG ON AFTER COLDSTART SERIAL EQU FALSE ;DISABLE SIO/CRT CONSOLE COMBINATION ; MSIZE EQU 60 ;MEMORY SIZE IN KBYTES (RANGE 20..60) BASE EQU ((MSIZE-20)*1024)-200H ; 2 pages lower for DR:C MOVCPM CCP EQU 3400H+BASE ;CONSOLE COMMAND PROCESSOR BDOS EQU 3C06H+BASE ;OPERATING SYSTEM ENTRY POINT DBBUG EQU 46D2H+BASE ;DEBLOCK BUG LOCATION IN BDOS CBIOS EQU 4A00H+BASE ;BASE OF CUSTOM BIOS CPMSIZE EQU (CBIOS-CCP)/128 ;NUMBER OF RECORDS NEEDED FOR CCP+BDOS MONITR EQU 0F000H ;BASE OF SYSTEM MONITOR SYSRAM EQU 0FF00H ;BASE OF SYSTEM VARIABLES SCRATCH EQU 0F880H ;RAM AREA FOR BIOS/CPM BUFFERS ; ; ; ... DEFINE HOW MANY DRIVES IN SYSTEM ... ; WINCH EQU 0 ;NUMBER OF WINCHESTERS (0..1) IN SYSTEM NFLOPPY EQU 2 ;NUMBER OF FLOPPYS (1..4) IN SYSTEM DOUBLE EQU TRUE ;SINGLE/DOUBLE SIDED DRIVE ENABLE FIVE EQU FALSE EIGHT EQU TRUE ;SELECT 8 INCH FLOPPYS ; ; ; ; ... DEFINE TRACK/SECTOR PARAMS FOR STANDARD FLOPPYS ... ; ; IF FIVE NSECTS EQU 18 ;SINGLE DENSITY SECTORS PER TRACK NTRAKS EQU 40 ;NUMBER OF TRACKS PER SURFACE RESERV EQU 3 ;NUMBER OF RESERVED TRACKS BLS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES IF DOUBLE ALLMAX EQU ((5*NTRAKS*2)/BLS)/8 DIRSIZ EQU 64 ELSE ALLMAX EQU ((5*NTRAKS)/BLS)/8 DIRSIZ EQU 64 ENDIF ENDIF ; IF EIGHT NSECTS EQU 26 ;SINGLE DENSITY SECTORS PER TRACK NTRAKS EQU 77 ;NUMBER OF TRACKS PER SURFACE RESERV EQU 2 ;NUMBER OF RESERVED TRACKS BLS EQU 2 ;DOUBLE DENSITY BLOCKSIZE IN KBYTES IF DOUBLE ALLMAX EQU ((9*NTRAKS*2)/BLS)/8 DIRSIZ EQU 128 ELSE ALLMAX EQU ((9*NTRAKS)/BLS)/8 DIRSIZ EQU 128 ENDIF ENDIF ; ; ; .XLIST INCLUDE MACROS.MAC ;ASSEMBLE WITH MACRO DEFINITIONS .LIST ; ; ; ... EQUATES FOR PRINTER DRIVER PORTS/HANDSHAKE MODE ... ; LSTDAT EQU 80H ;SIO CHANNEL A DATA PORT# LSTCTL EQU 81H ;SIO CHANNEL A CONTROL PORT# LSTBAUD EQU 89H ;SIO CHANNEL A BAUDRATE CTC PORT# XONXOFF EQU TRUE ;ENABLE XON-XOFF HANDSHAKE CTS EQU 00100000B ;CLEAR-TO-SEND BIT POSITION IN SIO RR0 SYNC EQU 00010000B ;SYNC/HUNT BIT DCD EQU 00001000B ;DATA-CARRIER-DETECT BIT TBE EQU 00000100B ;TRANSMIT-BUFFER-EMPTY BIT TXMASK EQU DCD+TBE ;LOOP UNTIL DCD AND TBE BITS ARE TRUE ; ; ; PAGE ORG CBIOS-256 .PHASE 0080H INCLUDE ONESECT.MAC ;ONE SECTOR LOADER .DEPHASE ; ; PAGE ORG CBIOS-128 ; ; ; ... CREATE SIGNON MESSAGE FOR SELECTED MEMORY SIZE CPM ... ; M1 EQU (MSIZE / 10) OR '0' ;TENS DIGIT OF MSIZE IN ASCII M2 EQU (MSIZE MOD 10) OR '0' ;ONES DIGIT ; DEFB CR,LF DEFB '.... Cal-Tex Computers ',M1,M2,'K CP/M version 2.2 ....' DEFB CR,LF DEFB '......... release date 15-September-82 .........' DEFB CR,LF DEFB NULL ; PAGE ; ; ; ... BIOS CODE STARTS HERE WITH JUMP VECTORS ... ; ORG CBIOS ; JP BOOT JP WBOOT JP CONST IVEC: JP CONIN OVEC: JP CONOUT JP LIST JP CONOUT ;PUNCH VECTOR SAME AS CONOUT JP CONIN ;READER VECTOR SAME AS CONIN JP HOME JP SELENTRY ;'SELDISK' WITH LOCAL STACK JP SETTRACK JP SETSECT JP SETDMA JP RDENTRY ;'READDB' WITH LOCAL STACK JP WRTENTRY ;'WRITEDB' WITH LOCAL STACK JP LISTST JP SECTRAN ; ; ; ; ... ENTRY POINTS FOR COMPLEX DISK ROUTINES ... ; SELENTRY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL SELDISK POP IX LD SP,(SPSAVE) RET ; ; ; RDENTRY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL READDB POP IX LD SP,(SPSAVE) RET ; ; ; WRTENTRY: LD (SPSAVE),SP LD SP,BIOSTK PUSH IX CALL WRITEDB POP IX LD SP,(SPSAVE) RET ; ; ; ; ; ... COLD BOOT ROUTINE ... ; BOOT: DEFB 0,0,0,0 ;PUT EXTRA COLDSTART INITIALIZATION DEFB 0,0,0,0 ; CODE HERE IF NEEDED. BE SURE TO TAKE DEFB 0,0,0,0 ; UP AT LEAST 40 BYTES OF MEMORY IN ANY DEFB 0,0,0,0 ; CASE TO MAKE ROOM FOR THE BIOS DEFB 0,0,0,0 ; SELECT/READ/WRITE LOCAL STACK AREA DEFB 0,0,0,0 DEFB 0,0,0,0 DEFB 0,0,0,0 DEFB 0,0,0,0 DEFB 0,0,0,0 JR WBOOT2 BIOSTK EQU $ ;BIOS STACK OVERLAYS COLDSTART CODE ; SPSAVE: DEFS 2 ;USER SP SAVE FOR COMPLEX BIOS ENTRYS ; ; ; ; ... WARM BOOT ROUTINE ... ; WBOOT: LD SP,0080H CALL FLUSH ;FINISH ANY DEFERRED DISK I/O WBOOT2: LD HL,DPHTAB ;SET PARAM POINTER FOR DRIVE ZERO LD (DPHPTR),HL ; FORMAT DESCRIPTOR STUFF XOR A LD (DISK),A INC A LD (TRACK),A CALL PARAMS ;SELECT A: AND FIND TRACK #1 FORMAT JR NZ,BOMB ;EXIT IF PERMANENT ERROR LD HL,DPHTAB+SPT ;GET LOGICAL SECTORS-PER-TRACK PARAM LD A,(HL) CP NSECTS+1 JR C,BOMB ;ERROR IF TRACK IS SINGLE DENSITY CP CPMSIZE JR NC,WBOOT3 ;JUMP IF CCP+BDOS FITS ON ONE TRACK LD B,(HL) ;LOAD B WITH # OF SECTORS ON TRACK #1 LD A,CPMSIZE SUB B ;COMPUTE # OF EXTRA SECTORS FROM TRACK #2 JR WBOOT4 ; WBOOT3: LD B,CPMSIZE ;GET ALL OF CP/M FROM TRACK #1 XOR A ;READ ZERO SECTORS FROM TRACK #2 WBOOT4: LD HL,CCP PUSH AF CALL RTRACK ;READ CCP+BDOS FROM DOUBLE DENSITY POP BC INC B DEC B CALL NZ,RTRACK ;CONDITIONAL READ FROM TRACK #2 GOCPM: LD HL,MEMTAB ;PREPARE TO STORE VECTORS & BDOS PATCH LD B,0 GOCPM2: LD C,(HL) ;BC=BYTECOUNT INC HL LD E,(HL) INC HL LD D,(HL) ;DE=DESTINATION POINTER INC HL LDIR ;COPY POOP INTO MEMORY LD A,(HL) OR A ;TEST FOR END OF TABLE JR NZ,GOCPM2 LD A,(IOBYTE+1) ;DO AUTO LOG-ON THING THAT PEOPLE LIKE AND 00001111B CP NFLOPPY+WINCH JR C,GOCPM3 XOR A ;LOG-ON A: IF DRIVE# IS ILLEGALY LARGE GOCPM3: LD C,A LD HL,CCP LD A,(HL) ;PEEK AT FIRST OPCODE IN CCP CP 0C3H JR NZ,BOMB ;ABORT IF NOT A JUMP INSTRUCTION JP (HL) ;ELSE JUMP INTO CCP TO START CPM ; ; ; ; RTRACK: LD C,1 ;READ TRACK FROM LOGICAL SECTOR #1 RTRK2: PUSH HL PUSH BC LD (POINTR),HL LD A,C LD (SECTOR),A ;SET LOGICAL SECTOR NUMBER FOR READ CALL READDB ;LOAD NEXT 128 BYTES OF CP/M POP BC POP HL JR NZ,BOMB ;EXIT IF PERMANENT ERROR LD DE,128 ADD HL,DE INC C DJNZ RTRK2 ;BUMP SECTOR# AND LOAD ADDRESS TILL B=0 LD A,(TRACK) INC A ;BUMP TRACK# AFTER LAST SECTOR IS READ LD (TRACK),A RET ; ; BOMB: LD HL,DEAD CALL PMSG JP MONITR+3 ; DEAD: DEFB ' cannot boot' DEFB NULL ; ; ; ... ASSORTED CONSTANTS AND WHERE TO PLUG THEM IN ... ; MEMTAB: DEFB 3 ;WARMSTART VECTOR DEFW 0000H JP CBIOS+3 DEFB 3 ;BDOS VECTOR DEFW 0005H JP BDOS DEFB 3 ;BREAKPOINT VECTOR DEFW 0038H JP MONITR+3 DEFB 5 ;CP/M 2.2 PATCH 01 3/31/81 DEFW DBBUG NOP NOP LD HL,0 DEFB 2 ;DEFAULT DISK I/O POINTER DEFW POINTR DEFW 0080H DEFB 0 ;END OF TABLE ; ; PAGE ; ; ... CHARACTER I/O ROUTINES FOR BIOS ... ; ; CONST: JP MONITR+6 ;MONITOR CONSOLE STATUS ENTRY POINT ; ; CONIN: JP MONITR+9 ;MONITOR CONSOLE INPUT ENTRY POINT ; ; CONOUT: LD A,C JP MONITR+12 ;MONITOR CONSOLE OUTPUT ENTRY POINT ; ; ; LISTST: LD A,00010000B OUT (LSTCTL),A ;DO SIO CLEAR STATUS/INTERRUPT CMD IN A,(LSTCTL) AND TXMASK ;DISCARD BITS NOT BEING TESTED CP TXMASK LD A,255 RET Z ;RETURN WITH A=255 IF PRINTER READY XOR A RET ;ELSE RETURN WITH A=0 ; ; ; LIST: CALL LISTST OR A JR Z,LIST ;LOOP TILL SIO CAN SEND A CHARACTER LD A,C OUT (LSTDAT),A ;OUTPUT ASCII TO SIO IF XONXOFF IN A,(LSTCTL) BIT 0,A ;TEST SIO RX DATA AVAILABLE RET Z ;EXIT IF NO INPUT FROM PRINTER IN A,(LSTDAT) ;ELSE GET CHARACTER AND TEST FOR RES 7,A ; 'XOFF' CHARACTER (CONTROL-S) CP 'S'-64 RET NZ LIST2: IN A,(LSTCTL) BIT 0,A JR Z,LIST2 ;LOOP TILL NEXT HANDSHAKE CHARACTER IN A,(LSTDAT) ;INPUT AND DISCARD 'XON' CHARACTER ENDIF RET ; ; ; INCLUDE DEBLOCK.MAC ;DEBLOCKING DISK DRIVERS ; IF WINCH INCLUDE XEBEC.MAC ;DISK DRIVERS FOR XEBEC CONTROLLER ENDIF ; ; IF $ GE MONITR .PRINTX /OVERLAYING SYSTEM MONITOR/ ENDIF ; BIOSLEN EQU (($ AND -128)+128)-CBIOS ;LENGTH OF CBIOS MOD 128 ; PAGE ;******************************************************** ;* * ;* DISK I/O BUFFERS FOR BDOS FILE HANDLER * ;* * ;******************************************************** ; ; ; ORG SCRATCH DIRBUF: DEFS 128 ;SCRATCH DIRECTORY BUFFER BIGBUF: DEFS 1024 ;HOST SECTOR BUFFER FOR DEBLOCKING ; ; ; DPH MACRO LOCAL BASE BASE: DEFS 16 ;;DISK PARAMETER HEADER DEFS 15 ;;DISK PARAMETER BLOCK DEFS 4 ;;DEBLOCK PARAMETERS DEFS 1 ;;DEBLOCK FLAGS DEFS DIRSIZ/4 ;;CHECK VECTOR DEFS ALLMAX ;;ALLOCATION VECTOR ENDM ; ; ; DPHTAB EQU $ REPT NFLOPPY ;CREATE FLOPPY DISK DATA AREAS DPH ENDM DPHSIZ EQU ($-DPHTAB)/NFLOPPY ; ; IF WINCH DEFS 16 ;DISK PARAMETER HEADER DEFS 15 ;DISK PARAMETER BLOCK DEFS 4 ;DEBLOCK PARAMETERS DEFS 1 ;DEBLOCK FLAGS DEFS MAXBLK/8 ;ALLOCATION VECTOR ENDIF ; ; ; NEW EQU $ SECTOR: DEFS 1 ;BIOS SECTOR NUMBER TRACK: DEFS 2 ;BIOS TRACK NUMBER DISK: DEFS 1 ;BIOS DISK NUMBER POINTR: DEFS 2 ;BIOS DMA POINTER ; ; HOST EQU $ HSTSEC: DEFS 1 ;HOST SECTOR NUMBER HSTTRK: DEFS 2 ;HOST TRACK NUMBER HSTDSK: DEFS 1 ;HOST DISK NUMBER HSTPTR: DEFS 2 ; HSTDPH: DEFS 2 ;HOST DISK PARAMETER POINTER ; NEXT EQU $ NXTSEC: DEFS 1 ;NEXT SECTOR NUMBER NXTTRK: DEFS 2 ;NEXT TRACK NUMBER ; RCOUNT: DEFS 1 ;UNALLOCATED RECORD COUNT SECTMP: DEFS 1 ;HOST EQUIVALENT OF SECTOR# RDACT: DEFS 1 ;READ BUFFER ACTIVE FLAG WRTACT: DEFS 1 ;WRITE BUFFER ACTIVE FLAG DIR: DEFS 1 ;DIR FOR DEFERRED RD/WRT (1=READ) RWFLAG: DEFS 1 ;DIR FOR HOST RD/WRT (1=READ) ; ; DPHPTR: DEFS 2 ;POINTER TO DPH ENTRY PRMPTR: DEFS 2 ;POINTER TO DISK PARAMS IDBUFF: DEFS 8 ;BUFFER FOR ID RECORDS ON SIDE #0 IDTOP: DEFS 8 ;BUFFER FOR ID RECORDS ON SIDE #1 SCRLEN EQU $-SCRATCH ; ; IF $ GE SYSRAM .PRINTX /BIOS OVERLAYING SYSTEM VARIABLES/ ENDIF ; ; .XLIST ;TURN OFF LISTING .PHASE SYSRAM INCLUDE MEMDEF.MAC ;ASSEMBLE SYSTEM VARIABLES IN CASE THEY .DEPHASE ; ARE REFERENCED ANYWHERE IN CBIOS ; ; END