CP/M MACRO ASSEM 2.0 #001 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ************************************************************************* * * * MORROW DESIGNS CBIOS FOR CP/M VERSION 2.2. * * * * THIS CBIOS CAN BE CONFIGURED TO RUN WITH THE FOLLOWING DEVICES. * * THE DISKS MAY BE CONFIGURED TO RUN WITH ANY OR ALL OF THE DISK * * SYSTEMS. THE LOGICAL ORDER OF THE DISKS CAN BE SET TO ANY ORDER. * * * * DISK SYSTEMS: * * DJ 2D/B FLOPPY DISK CONTROLLER WITH 8 INCH DISKS. * * * * CONSOLE I/O: * * DISK JOCKEY 2D/B SERIAL. * * MULTI I/O SERIAL. * * DECISION I SERIAL. * * * * PRINTER I/O: * * MULTI I/O SERIAL WITH HANDSHAKING. * * MULTI I/O DIABLO 1620 SIMULATOR FOR THE HYTYPE II. * * * * NOTE: FLOPPY SYSTEMS DISKETTE (DRIVE A:) HAS TO HAVE 1024 BYTE * * SECTORS IN ORDER FOR THE COLD AND WARM BOOT LOADERS TO * * WORK. BE SURE TO FORMAT ALL NEW SYSTEM DISKETTES WITH * * 1024 BYTE SECTORS. THE SYSTEM DISKETTE CAN BE EITHER * * SINGLE OR DOUBLE SIDED. THE SECTOR SIZE ON NORMAL (NON * * A: DRIVE) DISKETTES IS NOT RESTRICTED. THUS IF YOU HAVE * * A DISKETTE WITH SOFTWARE THAT IS SUPPOSED TO RUN ON THE * * A: DRIVE THEN YOU SHOULD MOUNT THE DISKETTE IN THE B: * * DRIVE AND THEN PIP IT OVER TO A 1024 BYTE SECTOR * * SYSTEM DISKETTE. * * * * WRITTEN BY LES KENT AND MARC KUPPER 3/4/82 * * * * DATE PROGRAMMER DESCRIPTION * * * **11 20 82 MARC PUBLIC RELEASE OF REVISION E.31 * * * ************************************************************************* TITLE 'CBIOS Revision E for CP/M Version 2.2 - March 4, 1982' 0035 = REVNUM EQU 53 ;CBIOS REVISION NUMBER 5.X = E 0016 = CPMREV EQU 22 ;CP/M REVISION NUMBER 2.2 ************************************************************************* * * * THE FOLLOWING FLAGS SET A 'NON-STANDARD' SYSTEM MODE AND AN * * ASSEMBLY TIME DEBUGGER. * * * * IF THIS CBIOS IS USED WITH THE CP/M 2.2 SYSTEM THAT IS SHIPPED ON * * A MORROW DESIGNS DISKETTE THEN NOSTAND CAN BE SET TO 1. THIS * * WILL ALLOW THE CBIOS TO USE VARIOUS DATA AREAS FOUND INSIDE OF * * THE CP/M 2.2 BDOS. IF THE CBIOS IS USED WITH A DIFFERENT * * OPERATING SYSTEM THEN NOSTAND SHOULD BE SET TO 0. * * * * THE DEBUG FLAG MERELY CAUSES VARIOUS INTERNAL VALUES AND * CP/M MACRO ASSEM 2.0 #002 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * ADDRESSES TO BE PRINTED DURING THE ASSEMBLY PROCESS. THIS * * PRINTING IS FORCED VIA ASSEMBLY ERRORS AND THUS SHOULD NOT * * AFFECT THE RESULTING CODE IN ANY WAY. * * * ************************************************************************* 0001 = NOSTAND EQU 1 ;SET TO 1 FOR NON-STANDARD MODE 0000 = DEBUG EQU 0 ;SET TO 1 FOR DEBUGGING MODE ************************************************************************* * * * THE FOLLOWING IS SET TO THE MEMORY SIZE OF THE CP/M THE CBIOS IS * * BEING CREATED FOR. * * * ************************************************************************* 0038 = MSIZE EQU 56 ;MEMORY SIZE OF TARGET CP/M 0010 = BIOSLN EQU 10H ;BIOS LENGTH. ALSO IN ABOOT&.ASM ************************************************************************* * * * THE FOLLOWING EQUATES SET UP THE DISK SYSTEMS TO BE INCLUDED * * ALONG WITH THE TYPES OF DRIVES AND THE LOGICAL ORDER OF THE * * DRIVES. * * * ************************************************************************* 0002 = MAXFD EQU 2 ;SET TO NUMBER OF 2D/B FLOPPIES 0001 = FDORDER EQU 1 0000 = MWQUIET EQU 0 ;SET FOR NO NAMES PRINTED ON LOGIN 0000 = WMDRIVE EQU 0 ;DEVICE TO WARM BOOT FROM. THIS IS THE ; CP/M LOGICAL DRIVE NUMBER. ************************************************************************* * * * THE FOLLOWING EQUATES DEFINE THE CONSOLE AND PRINTER ENVIRONMENTS. * * * ************************************************************************* ************************************************************************* * * * DEFINE THE CONSOLE DRIVER TO BE USED. * * * * CONTYP IS: 0 NOTHING, USED FOR PATCHING TO PROM'S. * * 3 2D/B DRIVER. * * 6 NORTH STAR MOTHERBOARD (2 SERIAL + 1 PARALLEL) * * * * SET CBAUD TO THE DIVISOR LATCH VALUE FOR THE CONSOLE. FOR AN * * EXPLANATION OF THE VALUES LOOK AT THE DEFCON TABLE. * * * ************************************************************************* 0003 = CONTYP EQU 3 0000 = CBAUD EQU 0 CP/M MACRO ASSEM 2.0 #003 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ************************************************************************* * * * DEFINE THE PRINTER DRIVER TO BE USED. * * * * LSTTYP IS: 0 NOTHING, USED FOR PATCHING TO PROM'S. * * 1 PROVIDE FOR 128 BYTES OF PATCH SPACE. * * 2 MULTIO SERIAL, NO PROTOCOL. * * 3 MULTIO SERIAL, CLEAR TO SEND PROTOCOL. * * 4 MULTIO SERIAL, DATA SET READY PROTOCOL. * * 5 MULTIO SERIAL, XON/XOFF PROTOCOL. * * * * NOTE: THE DECISION BOARD IS FUNCTIONALLY IDENTICAL TO THE MULTI * * I/O BOARD FOR SERIAL PRINTER I/O. SELECTIONS 2 TO 5 WILL * * WORK ON THE WUNDERBUSS I/O BOARD. TO USE DRIVERS 6 OR 7 * * THE MULTR3 EQUATE WILL HAVE TO BE SET. * * * * SET PBAUD TO THE DIVISOR LATCH VALUE FOR THE PRINTER. FOR AN * * EXPLANATION OF THE VALUES SEE THE DEFLST TABLE. * * * ************************************************************************* 0001 = LSTTYP EQU 1 0000 = LBAUD EQU 0 ************************************************************************* * * * THE NEXT EQUATE DETERMINES IF YOU HAVE A MULTI I/O REV 3 OR A * * DECISION I MOTHER BOARD FOR PARALLEL I/O. IF ARE NOT USING * * EITHER OF THESE BOARDS THEN YOU NEED NOT WORRY ABOUT THIS EQUATE. * * IF YOU ARE USING A MULTI I/O REV. OTHER THAN 3.X OR 4.X THEN YOU * * SHOULD SET MULTR3 TO 0. * * * ************************************************************************* 0000 = MULTR3 EQU 0 ;0 = DECISION, 1 = MULTI I/O REV. 3 OR 4 0001 = CONGRP EQU 1 ;COSOLE PORT (1 = P1, 2 = P2, 3 = P3) 0003 = LSTGRP EQU 3 ;PRINTER PORT (1 = P1, 2 = P2, 3 = P3) ************************************************************************* * * * CP/M SYSTEM EQUATES. * * * ************************************************************************* 0800 = CCPLN EQU 800H 0E00 = BDOSLN EQU 0E00H E000 = SIZE EQU (MSIZE*1024) BA00 = CCP EQU SIZE-(BIOSLN*100H+CCPLN+BDOSLN) C200 = BDOS EQU CCP+CCPLN D000 = BIOS EQU CCP+CCPLN+BDOSLN 5100 = OFFSETC EQU 2100H-BIOS ;OFFSET FOR SYSGEN CP/M MACRO ASSEM 2.0 #004 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 IF DEBUG DBGTMP SET OFFSETC ;DDT OFFSET ! DBGTMP SET CCP ;CCP ADDRESS ! DBGTMP SET BDOS ;BDOS ADDRESS ! DBGTMP SET BIOS ;CBIOS ADDRESS ! ENDIF 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 0100 = TPA EQU 100H ;TRANSIENT MEMORY 0003 = IOBYTE EQU 3 ;IOBYTE LOCATION 0000 = WBOT EQU 0 ;WARM BOOT JUMP ADDRESS 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS IF NOSTAND NE 0 CFE7 = CBLOCK EQU BIOS-19H ;CURRENT ACTUAL BLOCK# * BLKMSK ;USED FOR UNALLOCATED WRITTING ENDIF ************************************************************************* * * * THE FOLLOWING ARE INTERNAL CBIOS EQUATES. MOST ARE MISC. CONSTANTS. * * * ************************************************************************* 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 001A = CLEAR EQU 'Z'-64 ;CLEAR SCREEN ON AN ADM 3 0000 = ANUL EQU 0 ;NULL 0003 = AETX EQU 'C'-64 ;ETX CHARACTER 0006 = AACK EQU 'F'-64 ;ACK CHARACTER 0007 = ABEL EQU 'G'-64 ;BELL 0008 = ABS EQU 'H'-64 ;BACK SPACE 0009 = AHT EQU 'I'-64 ;HORIZONTAL TAB 000A = ALF EQU 'J'-64 ;LINE FEED 000B = AVT EQU 'K'-64 ;VERTICAL TAB 000C = AFF EQU 'L'-64 ;FORM FEED 000D = ACR EQU 'M'-64 ;CARRIAGE RETURN 0011 = XON EQU 'Q'-64 ;XON CHARACTER 0013 = XOFF EQU 'S'-64 ;XOFF CHARACTER 001B = AESC EQU 1BH ;ESCAPE CHARACTER 001E = ARS EQU 1EH ;RS CHARACTER 001F = AUS EQU 1FH ;US CHARACTER 0020 = ASP EQU ' ' ;SPACE 007F = ADEL EQU 7FH ;DELETE ************************************************************************* * * * THE FOLLOWING ARE THE MACROS USED IN GENERATING THE DPH, DPB AND * * ALLOCATION TABLES. * * * ************************************************************************* DPBGEN MACRO NAM,LOG,DSPT,DBSH,DBLM,DEXM,DDSM,DDRM,DAL0,DAL1,DCKS,DOFF,SSIZ DPB&NAM&LOG EQU $ DW DSPT CP/M MACRO ASSEM 2.0 #005 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 DB DBSH DB DBLM DB DEXM DW DDSM DW DDRM DB DAL0 DB DAL1 DW DCKS DW DOFF DB SSIZ ENDM DPHGEN MACRO NAM,LOG,DPB1,DPB2 DPH&NAM&LOG EQU $ DW 0 DW 0,0,0 DW DIRBUF DW &DPB1&DPB2 DW CSV&NAM&LOG DW ALV&NAM&LOG ENDM ALLOC MACRO NAM,LOG,AL,CS CSV&NAM&LOG: DS CS ALV&NAM&LOG: DS AL ENDM ************************************************************************* * * * THE FOLLOWING MACRO IS USED IN GENERATING THE LOGICAL ORDER OF THE * * CP/M DRIVES. * * * ************************************************************************* ORDER MACRO NUM DW FDDST ENDM ************************************************************************* * * * THE FOLLOWING ARE OFFSET NUMBERS OF DEVICE SPECIFICATION TABLES. * * * ************************************************************************* 0000 = D$WBOOT EQU 0 ;WARM BOOT 0001 = D$STRAN EQU 1 ;SECTOR TRANSLATION 0002 = D$SEL1 EQU 2 ;DRIVE SELECT, RETURN DPH 0003 = D$SEL2 EQU 3 ;DRIVE SELECT 0004 = D$HOME EQU 4 ;HOME DRIVE 0005 = D$STRK EQU 5 ;SET TRACK 0006 = D$SSEC EQU 6 ;SET SECTOR 0007 = D$SDMA EQU 7 ;SET DMA ADDRESS 0008 = D$READ EQU 8 ;READ A PHYSICAL SECTOR 0009 = D$WRITE EQU 9 ;WRITE A PHYSICAL SECTOR 000A = D$BAD EQU 10 ;RETURN POINTER TO BAD SECTOR INFO CP/M MACRO ASSEM 2.0 #006 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ************************************************************************* * * * THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE ROUTINES * * MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE THE SAME. * * * ************************************************************************* D000 ORG BIOS ;CBIOS STARTING ADDRESS D000 C360D7 JMP CBOOT ;COLD BOOT ENTRY POINT D003 C3E2D1 WBOOTE: JMP WBOOT ;WARM BOOT ENTRY POINT IF CONTYP NE 0 D006 C384D0 CONST: JMP CONIST ;CONSOLE STATUS ROUTINE D009 C381D0 CIN: JMP CONIN ;CONSOLE INPUT D00C C368D0 COUT: JMP COSTRP ;CONSOLE OUTPUT ELSE CONST: JMP $ ;CONSOLE STATUS ROUTINE PROM POINTER CIN: JMP $ ;CONSOLE INPUT PROM POINTER COUT: JMP $ ;CONSOLE OUTPUT PROM POINTER ENDIF IF (LSTTYP NE 0) OR (CONTYP EQ 6) D00F C30CD1 POUT: JMP LSTOUT ;LIST DEVICE OUTPUT ELSE POUT: JMP COUT ;LIST DEVICE OUTPUT ENDIF IF CONTYP EQ 6 ;NORTH STAR DRIVERS HAVE PUNCH ENTRY POINTS JMP PUNOUT ;PUNCH DEVICE OUTPUT ELSE D012 C30CD0 JMP COUT ;USE CONSOLE I/O ENDIF IF CONTYP EQ 6 ;NORTH STAR DRIVERS HAVE READER ENTRY POINTS JMP RDRIN ;READER DEVICE INPUT ELSE D015 C309D0 JMP CIN ;USE CONSOLE I/O ENDIF D018 C305D2 JMP HOME ;HOME DRIVE D01B C322D2 JMP SETDRV ;SELECT DISK D01E C313D2 JMP SETTRK ;SET TRACK D021 C3F9D1 JMP SETSEC ;SET SECTOR D024 C3FFD1 JMP SETDMA ;SET DMA ADDRESS D027 C310D3 JMP READ ;READ THE DISK D02A C307D3 JMP WRITE ;WRITE THE DISK IF LSTTYP NE 0 D02D C30CD1 JMP LSTOST ;LIST DEVICE STATUS ELSE JMP DONOP ;LIST DEVICE STATUS ENDIF D030 C319D2 JMP SECTRAN ;SECTOR TRANSLATION CP/M MACRO ASSEM 2.0 #007 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ; ; THE FOLLOWING JUMPS ARE EXTENDED BIOS CALLS DEFINED BY MORROW DESIGNS ; IF MAXFD NE 0 D033 C31BE0 JMP FDSEL ;HOOKUP FOR SINGLE.COM PROGRAM ELSE JMP DONOP ENDIF D036 C30000 JMP 0 ;END OF THE JUMP TABLE ************************************************************************* * * * DRIVE CONFIGURATION TABLE. * * * ************************************************************************* D039 00 DRCONF: DB 0 ;REVISION 0 STRUCTURE D03A 20 DB 32 ;32 BYTES LONG NOW ************************************************************************* * * * THE FOLLOWING IS THE TABLE OF POINTERS TO THE DEVICE * * SPECIFICATION TABLES. THE ORDER OF THIS TABLE DEFINES THE * * LOGICAL ORDER OF THE CP/M DRIVES. * * * ************************************************************************* D03B = DSTTAB: EQU $ 0001 # DN SET 1 REPT 16 ORDER %DN DN SET DN+1 ENDM D03B+08D5 DW FDDST D03D+08D5 DW FDDST D03F+08D5 DW FDDST D041+08D5 DW FDDST D043+08D5 DW FDDST D045+08D5 DW FDDST D047+08D5 DW FDDST D049+08D5 DW FDDST D04B+08D5 DW FDDST D04D+08D5 DW FDDST D04F+08D5 DW FDDST D051+08D5 DW FDDST D053+08D5 DW FDDST D055+08D5 DW FDDST D057+08D5 DW FDDST D059+08D5 DW FDDST ************************************************************************* * * * I/O CONFIGURATION TABLE. * CP/M MACRO ASSEM 2.0 #008 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * * * AT THIS CBIOS REVISION 11 BYTES ARE DEFINED FOR THIS TABLE. * * SEVERAL EXTENSIVE CHANGES ARE PLANNED FOR THE TABLE. FUTURE * * REVISION OF THE IOCONF TABLE WILL HAVE INDEPENDANT ENTRIES FOR * * THREE SERIAL PORTS AND WILL BE USED BY SEVERAL CHARACTER DRIVERS. * * ALSO THE IOBYTE WILL BE IMPLEMENTED FOR ALL THE CHARACTER * * DRIVERS. I MIGHT EVEN WRITE AN EXTERNAL PROGRAM TO EDIT THIS * * TABLE. * * * * THE FIRST TWO BYTES SHOW THE I/O CONFIGURATION THAT THE CBIOS WAS * * ASSEMBLED WITH. THESE BYTES ARE USED BY EXTERNAL SOFTWARE TO * * DETERMINE THE CONFIGURATION OPTIONS THAT ARE AVAILABLE. * * * * THE NEXT BYTE IS THE INITIAL IOBYTE VALUE. THIS VALUE IS WRITTEN * * TO LOCATION 3 ON COLD BOOTS. SEE THE CP/M 2 ALTERNATION GUIDE * * FOR A DESCRIPTION OF THE IOBYTE. * * * * THE NEXT BYTE IS TO MAKE SURE THAT THE GROUP SELECT BYTE ON THE * * MULT I/O OR DECSION I STAYS CONSISTANT THROUGHOUT THE CBIOS. * * ONLY THE GROUP BITS THEMSELVES (BITS 0 AND 1) SHOULD BE CHANGED * * AS YOU OUTPUT TO THE GROUP PORT. IF YOU MODIFY ONE OF THE OTHER * * BITS (SUCH AS DRIVER-ENABLE) THEN YOU SHOULD MODIFY THE SAME BIT * * IN THIS BYTE. FOR EXAMPLE: * * * * ;SELECT CONSOLE GROUP * * LDA GROUP ;GET GROUP BYTE * * ORI CONGRP ;SELECT THE CONSOLE PORT * * OUT GRPSEL ;SELECT THE GROUP * * * * ;MODIFY A BIT IN THE GROUP BYTE * * LDA GROUP ;GET GROUP BYTE * * ORI BANK ;SET THE BANK BIT * * STA GROUP ;SAVE NEW GROUP SETTING * * ORI GROUP2 ;SELECT SECOND SERIAL PORT * * OUT GRPSEL ;SELECT THE DESIRED GROUP * * * * NOTE: YOU SHOULD NOT SET THE GROUP BITS THEMSELVES IN THE * * GROUP BYTE. * * * * * * THE FOLLOWING TWO WORDS DEFINE THE DEFAULT BAUD RATES FOR THE * * CONSOLE AND THE LIST DEVICES. THESE WORDS ARE PROVIDED SO THAT * * THE USER CAN EASILY MODIFY THEM AND THAT THEY WILL ALSO BE USED * * IN THE FUTURE BY MORROW DESIGNS SOFTWARE. * * * * THE FOLLOWING IS A LIST OF POSSIBLE BAUD RATES AND THE DECIMAL * * VALUE NEEDED FOR THE DEFCON OR DEFLST WORDS. * * * * BAUD RATE DEFCON/DEFLST BAUD RATE DEFCON/DEFLST * * 50 2304 2000 58 * * 75 1536 2400 48 * * 110 1047 3600 32 * * 134.5 857 4800 24 * * 150 768 7200 16 * * 300 384 9600 12 * * 600 192 19200 6 * CP/M MACRO ASSEM 2.0 #009 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * 1200 96 38400 3 * * 1800 64 56000 2 * * * * * * THE NEXT TWO BYTES ARE UED TO CONFIGURE THE HARDWARE HANDSHAKING * * PROTOCALL USED BY THE SERIAL LIST DRIVERS WITH THE MULTIO OR * * WUNDERBUSS I/O BOARDS. THE FIRST OF THESE TWO BYTES IS A MASK. * * THIS MASK IS ANDED WITH THE 8250'S MODEM STATUS REGISTER TO STRIP * * OUT THE DESIRED HANDSHAKE LINES. NEXT THE RESULT OF THE ANDING * * IS XORED WITH THE SECOND OF THE TWO BYTES. THIS XORING ALLOWS * * THE HANDSHAKE LINES TO BE INVERTED. COMMON BYTE VALUES ARE * * SHOWN BELOW. * * * * CTS EQU 10H ;CLEAR TO SEND STATUS MASK * * * * DB CTS ;MORROW DESIGNS 'CLEAR TO SEND' * * DB 0 * * * * DB CTS ;INVERTED CLEAR TO SEND * * DB CTS * * * * DB 0 ;NO HANDSHAKING * * DB 0FFH * * * * * * THE LAST BYTE IN THE REVISION ONE STRUCTURE IS THE LAST CHARACTER * * THAT WAS RECIEVED FROM THE PRINTER. THIS BYTE IS USED TO * * IMPLEMENT XON/XOFF SOFTWARE HANDSHAKING. THIS HANDSHAKING * * PROTOCOL SHOULD NOT BOTHER PRINTERS THAT HAVE NOT IMPLEMENTED * * XON/XOFF PROTOCOL SO THIS DRIVER IS ENABLED ALL THE TIME. * * * ************************************************************************* D05B 02 IOCONF: DB 2 ;REVISION 2 STRUCTURE D05C 0B DB 11 ;11 BYTES LONG NOW D05D 03 DB CONTYP ;CONSOLE DEVICE DRIVER NUMBER D05E 01 DB LSTTYP ;LIST DEVICE DRIVE NUMBER D05F = IOBYT EQU $ ;THE INITIAL IOBYTE IS KEPT HERE D05F 00 DB 00$00$00$00B ;ALL DEVICES GO TO CON: D060 00 GROUP: DB 0 ;GROUP BYTE D061 0000 DEFCON: DW CBAUD ;CONSOLE BAUD RATE DIVISOR VALUE D063 0000 DEFLST: DW LBAUD ;PRINTER BAUD RATE DIVISOR VALUE IF (LSTTYP NE 3) AND (LSTTYP NE 4) ;XON/XOFF PROTOCOL D065 00 LSTAND: DB 0 ;SERIAL LIST HANDSHAKE MASK D066 FF LSTXOR: DB 0FFH ;SERIAL LIST INVERSION FLAG ENDIF IF LSTTYP EQ 3 ;CLEAR TO SEND PROTOCOL LSTAND: DB CTS ;SERIAL LIST HANDSHAKE MASK LSTXOR: DB 0 ;SERIAL LIST INVERSION FLAG ENDIF IF LSTTYP EQ 4 ;DATA SET READY PROTOCOL CP/M MACRO ASSEM 2.0 #010 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 LSTAND: DB DSR ;SERIAL LIST HANDSHAKE MASK LSTXOR: DB 0 ;SERIAL LIST INVERSION FLAG ENDIF D067 11 LASTCH: DB XON ;LAST CHARACTER RECIEVED FROM THE PRINTER ************************************************************************* * * * THIS ROUTINE IS AN EXPERIMENT TO REDUCE MISSED AND GARBLED * * CHARACTERS ON CONSOLE OUTPUT. * * * ************************************************************************* IF CONTYP NE 0 D068 79 COSTRP: MOV A,C ;STRIP PARITY ON CONOUT D069 E67F ANI 7FH D06B 4F MOV C,A D06C C37ED0 JMP CONOUT ENDIF ************************************************************************* * * * DUE TO ITS LENGTH, THE TTYSET ROUTINE DRIVER IS BELOW THE CBOOT * * CBOOT ROUTINE. * * * ************************************************************************* ***************************************************************** * * * READ A CHARACTER FROM THE SERIAL PORT. * * * ***************************************************************** UD06F CD0000 CONIN: CALL SELCON ;SELECT CONSOLE UD072 DB00 CONIN1: IN LSR ;READ STATUS REGISTER UD074 E600 ANI DR ;WAIT TILL CHARACTER READY D076 CA72D0 JZ CONIN1 UD079 DB00 IN RBR ;READ CHARACTER D07B E67F ANI 7FH ;STRIP PARITY D07D C9 RET ***************************************************************** * * * OUTPUT A CHARACTER TO SERIAL PORT. * * * ***************************************************************** ***************************************************************** * * * CONTYP: 3 2DB CONSOLE DRIVER * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #011 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 IF CONTYP EQ 3 D07E C306E0 CONOUT: JMP FDCOUT ;CONSOLE OUTPUT D081 C303E0 CONIN: JMP FDCIN ;CONSOLE INPUT D084 CD21E0 CONIST: CALL FDTSTAT ;CONSOLE STATUS D087 3EFF MVI A,0FFH D089 C8 RZ D08A 3C INR A D08B C9 RET ENDIF ;2DB ***************************************************************** * * * THE FOLLOWING BYTE DETERMINES IF AN INITIAL COMMAND IS TO BE * * GIVEN TO CP/M ON WARM OR COLD BOOTS. THE VALUE OF THE BYTE IS * * USED TO GIVE THE COMMAND TO CP/M: * * * * 0 = NEVER GIVE COMMAND. * * 1 = GIVE COMMAND ON COLD BOOTS ONLY. * * 2 = GIVE THE COMMAND ON WARM BOOTS ONLY. * * 3 = GIVE THE COMMAND ON WARM AND COLD BOOTS. * * * ***************************************************************** D08C 00 AUTOST: DB 0 ;REVISION 0 STRUCTURE D08D 73 DB 100H - (LOW $) ;THE REST OF THE PAGE IS USED FOR THIS STUFF D08E 00 AUTOFLG:DB 0 ;AUTO COMMAND FEATURE ENABLE FLAG D08F 93D0 COLDMES:DW COLDCM ;POINTER TO THE COLD START COMMAND D091 94D0 WARMES: DW WARMCM ;POINTER TO THE WARM START COMMAND ***************************************************************** * * * IF THERE IS A COMMAND INSERTED HERE, IT WILL BE PASSED TO THE * * CCP IF THE AUTO FEATURE IS ENABLED. FOR EXAMPLE: * * * * COLDCM: DB COLDEND-COLDCM * * DB 'MBASIC MYPROG' * * COLDEND EQU $ * * * * WILL EXECUTE MICROSOFT BASIC, AND MBASIC WILL EXECUTE THE * * "MYPROG" BASIC PROGRAM. NOTE: THE COMMAND LINE MUST BE IN * * UPPER CASE FOR MOST COMMANDS. * * * ***************************************************************** D093 01 COLDCM: DB COLDEND-COLDCM ;LENGTH OF COLD BOOT COMMAND DB '' ;COLD BOOT COMMAND GOES HERE D094 = COLDEND EQU $ D094 01 WARMCM: DB WARMEND-WARMCM ;LENGTH OF WARM BOOT COMMAND CP/M MACRO ASSEM 2.0 #012 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 DB '' ;WARM BOOT COMMAND GOES HERE D095 = WARMEND EQU $ ************************************************************************* * * * AT THE FIRST PAGE BOUNDRY FOLLOWING THE CBIOS WE HAVE A SERIES OF * * POINTERS THAT POINT TO VARIOUS INTERNAL TABLES. AT THE START OF * * EACH OF THESE TABLES WE HAVE A REVISION BYTE AND A LENGTH BYTE. * * THE REVISION BYTE IS THE CURRENT REVISION NUMBER FOR THAT * * PARTICULAR STRUCTURE AND THE LENGTH BYTE IS THE LENGTH OF THAT * * STRUCTURE. THIS LENGTH DOES NOT INCLUDE THE REVISION BYTE NOR * * THE LENGTH BYTE ITSELF. * * * * REVISION DESCRIPTION * * E.0 1 AND 2 DEFINED * * E.3 THIS TABLE IS MOVED TO A PAGE BOUNDRY * * E.3 0, 3 AND 4 DEFINED * * * * THE POINTERS DEFINED SO FAR ARE AS FOLLOWS: * * * * 0) HIGH BYTE IS THE PAGE NUMBER OF THE CBIOS. LOW BYTE IS * * THE CBIOS REVISION NUMBER. USED TO DETERMINE POINTER * * STRUCTURE. * * * * 1) THIS POINTS TO THE DRIVE CONFIGURATION TABLE. * * * * 2) THIS POINTS TO THE I/O CONFIGURATION BYTES FOR THE SERIAL * * DRIVERS. EG, THE CONSOLE, PRINTER, READER, AND PUNCH * * DEVICES. * * * * 3) THIS POINTS TO THE DRIVE PARAMETER TABLE FOR DJDMA FLOPPY * * DISK DRIVES. IF NO DJDMA IS PRESENT THEN THIS POINTER IS * * NULL (0). * * * * 4) THIS POINTS TO THE AUTOSTART COMMAND STRUCTURES. USED TO * * AUTOMATICALLY INVOKE A COMMAND ON COLD OR WARM BOOT * * * * 5) THIS WILL BE A NULL (0) POINTER. IT MARKS THE END OF THE * * TABLE. * * * ************************************************************************* IF $ GT BIOS+256 ;TEST FOR CODE OVERLAP 'Fatal error, pointer table placement.' ELSE D095 DS BIOS+256-$ ;START AT A PAGE BOUNDRY ENDIF D100 D0 DB HIGH ($-1) ;CBIOS PAGE NUMBER D101 35 DB REVNUM ;CBIOS REVISION NUMBER D102 39D0 DW DRCONF ;DRIVE CONFIGURATION TABLE POINTER D104 5BD0 DW IOCONF ;I/O CONFIGURATION TABLE POINTER D106 0000 DW 0 D108 8CD0 DW AUTOST ;AUTO COMMAND STRUCTURE POINTER D10A 0000 DW 0 ;END OF TABLE MARKER CP/M MACRO ASSEM 2.0 #013 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ************************************************************************* * * * THE FOLLOWING CODE PERFORMS THE MAPPING OF LOGICAL TO PHYSICAL * * SERIAL I/O DEVICES. THE PHYSICAL ENTRY POINTS ARE CONIN, CONOUT, * * CONIST, RDRIN, PUNOUT, LSTOUT, AND LSTOST. THESE ENTRY POINTS * * ARE MAPPED VIA THE INTEL STANDARD I/O BYTE (IOBYTE) AT LOCATION 3 * * IN THE BASE PAGE TO THE LOW LEVEL DEVICE DRIVERS. * * * * NOTE: A NAMING CONVENTION HAS BEEN CHOSEN TO REDUCE LABEL * * COLISIONS. THE FIRST THREE CHARACTERS OF A NAME INDICATE THE * * DEVICE DRIVERS NAME, THE FOLLOWING THREE CHARACTERS INDICATED THE * * FUNCTION PERFORMED BY THAT PARTICULAR DEVICE ROUTINE. THE DEVICE * * NAMES ARE DEFINED AND DESCRIBED IN THE "AN INTRODUCTION TO CP/M * * FEATURES AND FACILITIES" MANUAL IN THE SECTION ON THE STAT * * COMMAND AND IN THE "CP/M INTERFACE GUIDE" IN THE IOBYTE SECTION. * * THE DEVICE FUNCTION POSTFIXES ARE AS FOLLOWS. * * * * DEVSET INITIAL DEVICE SETUP AND INITIALZATION * * DEVIN READ ONE CHARACTER FROM THE DEVICE * * DEVOUT WRITE ONE CHARACTER TO THE DEVICE * * DEVIST RETURN THE DEVICE CHARACTER INPUT READY STATUS * * DEVOST RETURN THE DEVICE CHARACTER OUTPUT READY STATUS * * * * THE SETUP ROUTINE INITIALIZES THE DEVICE AND RETURNS. THE INPUT * * ROUTINE RETURNS ONE CHARACTER IN THE A REGISTER (PARITY RESET). * * THE OUTPUT ROUTINE WRITE ONE CHARACTER FROM THE C REGISTER. THE * * INPUT STATUS ROUTINE RETURNS IN THE A REGISTER A 0 IF THE DEVICE * * DOES NOT HAVE A CHARACTER READY FOR INPUT FOR 0FFH IF A CHARACTER * * IS READY FOR INPUT. THE OUTPUT STATUS ROUTINE RETURNS IN THE A * * REGISTER A 0 IF THE DEVICE IS NOT READY ACCEPT A CHARACTER AND A * * 0FFH IF THE DEVICE IS READY. THE INPUT AND OUTPUT ROUTINES * * SHOULD WAIT UNTILL THE DEVICE IS READY FOR THE DESIRED OPERATION * * BEFORE THE DOING THE OPERATION AND RETURNING. * * * * NOT ALL OF THESE FUNCTIONS NEED TO BE IMPLEMENTED FOR ALL THE * * DEVICES. THE FOLLOWING IS A TABLE OF THE ENTRY POINTS NEEDED FOR * * EACH DEVICE HANDLER. * * * * DEVICE SETUP INPUT OUTPUT INPUT OUTPUT * * NAME STATUS STATUS * * * * CON: CONIN CONOUT CONIST * * RDR: RDRIN RDRIST * * PUN: PUNOUT * * LST: LSTOUT LSTOST * * * * TTY: TTYSET TTYIN TTYOUT TTYIST TTYOST * * CRT: CRTSET CRTIN CRTOUT CRTIST CRTOST * * UC1: UC1SET UC1IN UC1OUT UC1IST * * * * PTR: PTRSET PTRIN PTRIST * * UR1: UR1SET UR1IN UR1IST * * UR2: UR2SET UR2IN UR2IST * * * * PTP: PTPSET PTPOUT * * UP1: UP1SET UP1OUT * CP/M MACRO ASSEM 2.0 #014 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * UP2: UP2SET UP2OUT * * * * LPT: LPTSET LPTOUT LPTOST * * UL1: UL1SET UL1OUT UL1OST * * * * THE CONIN, CONOUT, CONIST, RDRIN, RDRIST, PUNOUT, LSTOUT, AND * * LSTOST ROUTINES ARE THE LOGICAL DEVICE DRIVER ENTRY POINTS * * PROVIDED BY THIS DEVICE MAPPER. THE OTHER ENTRY NAMES MUST BE * * PROVIDED BY THE PHYSICAL DEVICE DRIVERS. * * * ************************************************************************* IF CONTYP EQ 6 ;I/O BYTE IMPLEMENTED FOR NORTH STAR ; DRIVERS. OTHER DRIVERS TO FOLLOW CONIN: MVI E,1 ;CONSOLE INPUT CALL REDIR ; IOBYTE: 76543210 DW TTYIN ;CON: = TTY: XXXXXX00 DW CRTIN ;CON: = CRT: XXXXXX01 DW RDRIN ;CON: = BAT: XXXXXX10 DW UC1IN ;CON: = UC1: XXXXXX11 CONOUT: MVI E,1 ;CONSOLE OUTPUT CALL REDIR ; IOBYTE: 76543210 DW TTYOUT ;CON: = TTY: XXXXXX00 DW CRTOUT ;CON: = CRT: XXXXXX01 DW LSTOUT ;CON: = BAT: XXXXXX10 DW UC1OUT ;CON: = UC1: XXXXXX11 CONIST: MVI E,1 ;CONSOLE INPUT STATUS CALL REDIR ; IOBYTE: 76543210 DW TTYIST ;CON: = TTY: XXXXXX00 DW CRTIST ;CON: = CRT: XXXXXX01 DW RDRIST ;CON: = BAT: XXXXXX10 DW UC1IST ;CON: = UC1: XXXXXX11 RDRIN: MVI E,7 ;READER INPUT CALL REDIR ; IOBYTE: 76543210 DW TTYIN ;RDR: = TTY: XXXX00XX DW PTRIN ;RDR: = PTR: XXXX01XX DW UR1IN ;RDR: = UR1: XXXX10XX DW UR2IN ;RDR: = UR2: XXXX11XX RDRIST: MVI E,7 ;READER INPUT STATUS CALL REDIR ; IOBYTE: 76543210 DW TTYIST ;RDR: = TTY: XXXX00XX DW PTRIST ;RDR: = PTR: XXXX01XX DW UR1IST ;RDR: = UR1: XXXX10XX DW UR2IST ;RDR: = UR2: XXXX11XX PUNOUT: MVI E,5 ;PUNCH OUTPUT CALL REDIR ; IOBYTE: 76543210 DW TTYOUT ;PUN: = TTY: XX00XXXX DW PTPOUT ;PUN: = PTP: XX01XXXX DW UP1OUT ;PUN: = UP1: XX10XXXX DW UP2OUT ;PUN: = UP2: XX11XXXX CP/M MACRO ASSEM 2.0 #015 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 LSTOUT: MVI E,3 ;LIST OUTPUT CALL REDIR ; IOBYTE: 76543210 DW TTYOUT ;LST: = TTY: 00XXXXXX DW CRTOUT ;LST: = CRT: 01XXXXXX DW LPTOUT ;LST: = LPT: 10XXXXXX DW UL1OUT ;LST: = UL1: 11XXXXXX LSTOST: MVI E,3 ;LIST OUTPUT STATUS CALL REDIR ; IOBYTE: 76543210 DW TTYOST ;LST: = TTY: 00XXXXXX DW CRTOST ;LST: = CRT: 01XXXXXX DW LPTOST ;LST: = LPT: 10XXXXXX DW UL1OST ;LST: = UL1: 11XXXXXX REDIR: LDA IOBYTE ;GET THE INTEL STANDARD IOBYTE REDIR0: RLC ;SHIFT THE NEXT FIELD IN DCR E ;BUMP THE SHIFT COUNT JNZ REDIR0 REDIR1: ANI 110B ;MASK THE REDIRECTION FIELD MOV E,A ;MAKE THE WORD TABLE OFFSET MVI D,0 POP H ;GET THE TABLE BASE DAD D ;OFFSET INTO OUR TABLE MOV A,M ;LOAD THE LOW LEVEL I/O ROUTINE POINTER INX H MOV H,M MOV L,A PCHL ;EXECUTE THE LOW LEVEL I/O DRIVER ENDIF ;IOBYTE REDIRECTOR ************************************************************************* * * * CONTYP: 1 BLANK SPACE FOR CONSOLE DRIVER * * * * THE DRIVER ENTRIES CONOUT, CONIN, CONIST ARE DEFINED IN THE CP/M * * ALTERNATION GUIDE. EG. INPUT PARAMETERS ARE IN REGISTER C AND * * RESULTS ARE RETURNED IN REGISTER A. THE TTYSET ROUTINE IS USED * * FOR INITIALIZATION CODE. IT SHOULD EXECUTE A RET WHEN COMPLETE. * * * * THE TTYSET ROUTINE COULD BE PLACED JUST BELOW THE CBOOT ROUTINE. * * THIS SPACE (BELOW CBOOT) IS RECYLED FOR USE AS A DISK BUFFER * * AFTER CBOOT IS DONE. * * * ************************************************************************* IF CONTYP EQ 1 ;USER DEFINED IO AREA TTYSET EQU $ ;CONSOLE INITIALIZATION CONOUT EQU $ ;CONSOLE OUTPUT CONIN EQU $ ;CONSOLE INPUT CONIST EQU $ ;CONSOLE INPUT STATUS JMP $ DS 125 ENDIF ;USER IO CP/M MACRO ASSEM 2.0 #016 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ************************************************************************* * * * CONYTP: 6 NORTH STAR * * * * THE FOLLOWING CODE IMPLEMENTS THE NORTH STAR CONSOLE I/O SYSTEM. * * THIS SYSTEM IS FOR USERS WHO PURCHASE A MORROW DESIGNS DISK * * SYSTEM TO REPLACE THEIR NORTH STAR DISK SYSTEM. THE MAPPING OF * * THE LOGICAL TO PHYSICAL ENTRY POINTS IS PERFORMED AS FOLLOWS: * * * * DEVICE NAME LEFT RIGHT PARALLEL * * SERIAL SERIAL PORT * * * * CONSOLE CON: = TTY: CRT: UC1: * * READER RDR: = TTY: PTR: UR1: * * PUNCH PUN: = TTY: PTP: UP1: * * LIST LST: = TTY: CRT: UL1: * * * * FOR EXAMPLE, TO USE A PRINTER CONNECTED TO THE RIGHT SERIAL PORT, * * USE THE CP/M COMMAND: * * * * STAT LST:=CRT: * * * * LIKEWISE, THE CP/M COMMAND "STAT LST:=UL1:" IS USED IF YOU HAVE A * * PRINTER CONNECTED TO THE PARALLEL PORT. * * * ************************************************************************* IF CONTYP EQ 6 ;USE NORTH STAR I/O? NSLDAT EQU 2 ;LEFT SERIAL PORT DATA PORT NSLSTA EQU 3 ;LEFT SERIAL PORT STATUS PORT NSRDAT EQU 4 ;RIGHT SERIAL PORT DATA PORT NSRSTA EQU 5 ;RIGHT SERIAL PORT STATUS PORT NSSTBE EQU 1 ;TRANSMITTER BUFFER EMPTY STATUS BIT NSSRBR EQU 2 ;RECIEVER BUFFER READY STATUS BIT ;SEE THE 8251 DATA SHEETS FOR MORE ; CONFIGURATION INFORMATION. NSLIN1 EQU 0CEH ;LEFT SERIAL PORT INITIALIZATION # 1 NSRIN1 EQU 0CEH ;RIGHT SERIAL PORT INITIALIZATION # 1 ;76543210 BIT DEFINATIONS ;11001110 DEFAULT CONFIGURATION ;XXXXXX00 SYNCHRONOUS MODE ;XXXXXX01 1X CLOCK RATE ;XXXXXX10 16X CLOCK RATE ;XXXXXX11 64X CLOCK RATE ;XXXX00XX 5 BIT CHARACTERS ;XXXX01XX 6 BIT CHARACTERS ;XXXX10XX 7 BIT CHARACTERS ;XXXX11XX 8 BIT CHARACTERS ;XXX0XXXX PARITY DISBABLE ;XXX1XXXX PARITY ENABLE CP/M MACRO ASSEM 2.0 #017 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ;XX0XXXXX ODD PARITY GENERATION/CHECK ;XX1XXXXX EVEN PARITY GENERATION/CHECK ;00XXXXXX INVALID ;01XXXXXX 1 STOP BIT ;10XXXXXX 1.5 STOP BITS ;11XXXXXX 2 STOP BITS NSLIN2 EQU 37H ;LEFT SERIAL PORT INITIALIZATION # 2 NSRIN2 EQU 37H ;RIGHT SERIAL PORT INITIALIZATION # 2 ;76543210 BIT DEFINATIONS ;00110111 DEFAULT CONFIGURATION ;XXXXXXX1 ENABLE TRANSMITTER ;XXXXXX1X ASSERT DTR* ;XXXXX1XX ENABLE RECIEVER ;XXXX1XXX SEND BREAK CHARACTER, TXD LOW ;XXX1XXXX RESET PE, OE, FE ERROR FLAGS ;XX1XXXXX ASSERT RTS* ;X1XXXXXX INTERNAL RESET ;1XXXXXXX ENTER HUNT MODE (FOR SYNC) NSPDAT EQU 0 ;PARALLEL DATA PORT NSPSTA EQU 6 ;PARALLEL STATUS PORT NSPRBR EQU 1 ;RECIEVER BUFFER READY STATUS BIT NSPTBE EQU 2 ;TRANSMITTER BUFFER EMPTY STATUS BIT NSRAM EQU 0C0H ;NORTH STAR MEMORY PARITY PORT, ; SET TO 0 FOR NO NORTH STAR RAM ************************************************************************* * * * LEFT SERIAL PORT ROUTINES. USE TTY: DEVICE. * * * ************************************************************************* TTYIN: ;READ A CHARACTER IN NSLSTA ANI NSSRBR JZ TTYIN ;WAIT TILL A CHARACTER IS READY IN NSLDAT ;GET THE CHARACTER ANI 7FH ;STRIP PARITY RET TTYOUT: ;WRITE A CHARACTER IN NSLSTA ANI NSSTBE JZ TTYOUT ;WAIT TILL THE BUFFER IS EMPTY MOV A,C ;WRITE THE CHARACTER OUT NSLDAT RET TTYIST: ;RETURN INPUT BUFFER STATUS IN NSLSTA ANI NSSRBR RZ ;RETURN NOT READY MVI A,0FFH CP/M MACRO ASSEM 2.0 #018 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 RET ;THERE IS A CHARACTER READY TTYOST: ;RETURN OUTPUT BUFFER STATUS IN NSLSTA ANI NSSTBE RZ ;RETURN NOT READY MVI A,0FFH RET ;RETURN READY ************************************************************************* * * * RIGHT SERIAL PORT ROUTINES. USE CRT:, PTR:, AND PTP: DEVICES. * * * ************************************************************************* CRTIN: ;READ A CHARACTER PTRIN: IN NSRSTA ANI NSSRBR JZ CRTIN ;WAIT TILL A CHARACTER IS READY IN NSRDAT ;GET THE CHARACTER ANI 7FH ;STRIP PARITY RET CRTOUT: ;WRITE A CHARACTER PTPOUT: IN NSRSTA ANI NSSTBE JZ CRTOUT ;WAIT TILL THE BUFFER IS EMPTY MOV A,C ;WRITE THE CHARACTER OUT NSRDAT RET CRTIST: ;RETURN INPUT BUFFER STATUS PTRIST: IN NSRSTA ANI NSSRBR RZ ;RETURN NOT READY MVI A,0FFH RET ;THERE IS A CHARACTER READY CRTOST: ;RETURN OUTPUT BUFFER STATUS IN NSRSTA ANI NSSTBE RZ ;RETURN NOT READY MVI A,0FFH RET ;RETURN READY ************************************************************************* * * * PARALLEL PORT ROUTINES. USE UC1:, UR1:, UR2:, UP1:, UP2:, LPT:, * * AND UL1: DEVICES. * * * ************************************************************************* UC1IN: ;READ A CHARACTER CP/M MACRO ASSEM 2.0 #019 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 UR1IN: UR2IN: IN NSPSTA ANI NSPRBR JZ UC1IN ;WAIT TILL A CHARACTER IS READY IN NSPDAT ;GET THE CHARACTER PUSH PSW MVI A,30H ;RESET THE PARALLEL INPUT FLAG OUT NSPSTA POP PSW ANI 7FH ;STRIP PARITY RET UC1OUT: ;WRITE A CHARACTER UP1OUT: UP2OUT: LPTOUT: UL1OUT: IN NSPSTA ANI NSPTBE JZ UC1OUT ;WAIT TILL THE BUFFER IS EMPTY MVI A,20H ;RESET THE PARALLEL OUTPUT FLAG OUT NSPSTA MOV A,C ;WRITE THE CHARACTER, STROBE BIT 7 NSPOUT: ORI 80H OUT NSPDAT ANI 7FH OUT NSPDAT ORI 80H OUT NSPDAT RET UC1IST: ;RETURN INPUT BUFFER STATUS UR1IST: UR2IST: IN NSPSTA ANI NSPRBR RZ ;RETURN NOT READY MVI A,0FFH RET ;RETURN READY LPTOST: ;RETURN OUTPUT BUFFER STATUS UL1OST: IN NSPSTA ANI NSPTBE RZ ;RETURN NOT READY MVI A,0FFH RET ;RETURN READY ENDIF ;NORTH STAR I/O CONFIGURATION ************************************************************************* * * * LST: DEVICE DRIVER ROUTINES. * * * * ROUTINE USED DEPENDS ON THE VALUE OF LSTTYP. POSSIBLE LSTTYP * CP/M MACRO ASSEM 2.0 #020 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * VALUES ARE LISTED AS FOLLOWS: * * * * LSTTYP IS: 0 NOTHING, USED FOR PATCHING TO PROM'S * * 1 PROVIDE FOR 128 BYTES OF PATCH SPACE * * 2 MULTIO SERIAL, NO PROTOCOL * * 3 MULTIO SERIAL, CLEAR TO SEND PROTOCOL * * 4 MULTIO SERIAL, DATA SET READY PROTOCOL * * 5 MULTIO SERIAL, XON/XOFF PROTOCOL * * * ************************************************************************* ************************************************************************* * * * LSTTYP: 1 BLANK SPACE FOR PRINTER DRIVER * * * * THE DRIVER ENTRIES LSTOUT AND LSTOST ARE DEFINED IN THE CP/M * * ALTERNATION GUIDE. EG. INPUT PARAMETERS ARE IN REGISTER C AND * * RESULTS ARE RETURNED IN REGISTER A. THE LSTSET ROUTINE IS USED * * FOR INITIALIZATION CODE. IT SHOULD EXECUTE A RET WHEN COMPLETE. * * * * THE LSTSET ROUTINE COULD BE PLACED JUST BELOW THE CBOOT ROUTINE. * * THIS SPACE (BELOW CBOOT) IS RECYLED FOR USE AS A DISK BUFFER * * AFTER CBOOT IS DONE. * * * ************************************************************************* IF LSTTYP EQ 1 D10C = LSTSET EQU $ ;PRINTER INITIALIZATION D10C = LSTOUT EQU $ ;PRINTER OUTPUT D10C = LSTOST EQU $ ;PRINTER OUTPUT STATUS D10C C9 RET D10D DS 127 ENDIF ;USER IO ***************************************************************** * * * LSTTYP: 2, 3, 4, OR 5 SERIAL PRINTER, MULTI PROTOCOL * * * ***************************************************************** IF (LSTTYP GE 2) AND (LSTTYP LE 5) LSTOUT: CALL LSTOST ;CHECK PRINTER STATUS ORA A JZ LSTOUT ;LOOP IF NOT READY MOV A,C ;PRINT THE CHARACTER OUT THR RET LSTOST: CALL SELLST ;PRINTER STATUS ROUTINE IN LSR ;CHECK IF TRANSMITTER BUFFER EMPTY ANI THRE RZ ;RETURN BUSY IF BUFFER IS NOT EMPTY CP/M MACRO ASSEM 2.0 #021 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 LHLD LSTAND ;FETCH HANDSHAKE MASK BITS IN MSR ;GET MODEM STATUS REGISTER ANA L ;STRIP OUT HAND-SHAKE LINES XRA H ;INVERT STATUS RZ ;RETURN BUSY IF PRINTER IS BUSY LDA LASTCH ;GET LAST CHARACTER RECIEVED FROM THE PRINTER MOV B,A IN LSR ;CHECK FOR A CHARACTER FROM THE PRINTER ANI DR JZ XSKIP ;SKIP IF NO CHARACTER PRESENT IN RBR ;GET THE CHARACTER ANI 7FH ;STRIP PARITY STA LASTCH ;SAVE LAST CHARACTER RECIEVED MOV B,A XSKIP: MOV A,B SUI XOFF ;CHECK FOR XOFF CHAR (CONTROL S) JNZ XSDONE ;PRINTER READY RET ;PRINTER NOT READY (RETURN ZERO) XSDONE: MVI A,0FFH ;PRINTER READY FOR DATA RET ENDIF ;MULTI I/O SERIAL DRIVER ***************************************************************** * * * GOCPM IS THE ENTRY POINT FROM COLD BOOTS, AND WARM BOOTS. IT * * INITIALIZES SOME OF THE LOCATIONS IN PAGE 0, AND SETS UP THE * * INITIAL DMA ADDRESS (80H). * * * ***************************************************************** D18C 218000 GOCPM: LXI H,BUFF ;SET UP INITIAL DMA ADDRESS D18F CDFFD1 CALL SETDMA D192 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT D194 320000 STA WBOT D197 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS D19A 2103D0 LXI H,WBOOTE ;SET UP LOW MEMORY ENTRY TO CBIOS WARM BOOT D19D 220100 SHLD WBOT+1 D1A0 2106C2 LXI H,BDOS+6 ;SET UP LOW MEMORY ENTRY TO BDOS D1A3 220600 SHLD ENTRY+1 D1A6 AF XRA A ;A <- 0 D1A7 3201D7 STA BUFSEC ;SET BUFFER TO UNKNOWN STATE D1AA 3286D3 STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG D1AD 32FDD6 STA ERROR ;CLEAR BUFFER ERROR FLAG D1B0 3AE1D1 LDA CWFLG ;GET COLD/WARM BOOT FLAG D1B3 B7 ORA A D1B4 218FD0 LXI H,COLDMES ;POINTER TO INITIAL COLD COMMAND D1B7 CABDD1 JZ CLDCMND D1BA 2191D0 LXI H,WARMES ;POINTER TO INITIAL WARM COMMAND D1BD 5E CLDCMND:MOV E,M ;DO ONE LEVEL OF INDIRECTION D1BE 23 INX H D1BF 56 MOV D,M CP/M MACRO ASSEM 2.0 #022 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D1C0 1A LDAX D ;GET COMMAND LENGTH D1C1 3C INR A ;BUMP LENGTH TO INCLUDE LENGTH BYTE ITSELF D1C2 2107BA LXI H,CCP+7 ;COMMAND BUFFER (INCLUDES LENGTH BYTE) D1C5 4F MOV C,A ;SET UP FOR BLOCK MOVE D1C6 0600 MVI B,0 D1C8 CDDCD4 CALL MOVBYT ;MOVE COMMAND TO INTERNAL CCP BUFFER D1CB 3AE1D1 LDA CWFLG ;FIGURE OUT WHETHER OR NOT TO SEND MESSAGE D1CE B7 ORA A D1CF 3A8ED0 LDA AUTOFLG D1D2 CAD6D1 JZ CLDBOT D1D5 1F RAR D1D6 1F CLDBOT: RAR D1D7 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C D1DA 4F MOV C,A D1DB DA00BA JC CCP ;ENTER CP/M, SEND MESSAGE D1DE C303BA JMP CCP+3 ;ENTER CP/M, NO MESSAGE D1E1 00 CWFLG: DB 0 ;COLD/WARM BOOT FLAG ***************************************************************** * * * WBOOT LOADS IN ALL OF CP/M EXCEPT THE CBIOS, THEN INITIALIZES * * SYSTEM PARAMETERS AS IN COLD BOOT. SEE THE COLD BOOT LOADER * * LISTING FOR EXACTLY WHAT HAPPENS DURING WARM AND COLD BOOTS. * * * ***************************************************************** D1E2 310001 WBOOT: LXI SP,TPA ;SET UP STACK POINTER D1E5 3E01 MVI A,1 D1E7 32E1D1 STA CWFLG ;SET COLD/WARM BOOT FLAG D1EA 2600 MVI H,WMDRIVE ;MOVE DRIVE TO WARM BOOT OFF OF INTO (H) D1EC 2E00 MVI L,D$WBOOT ;PEFORM WARM BOOT OPERATION D1EE CD56D4 CALL JUMPER D1F1 D28CD1 JNC GOCPM ;NO ERROR D1F4 76 HLT ;HALT COMPUTER D1F5 00 DB 0 D1F6 C3E2D1 JMP WBOOT ;IN CASE USER RESTARTS THE COMPUTER ***************************************************************** * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ***************************************************************** D1F9 60 SETSEC: MOV H,B ;ENTER WITH SECTOR NUMBER IN (BC) D1FA 69 MOV L,C D1FB 22F6D6 SHLD CPMSEC D1FE C9 DONOP: RET ***************************************************************** * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * CP/M MACRO ASSEM 2.0 #023 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * * ***************************************************************** D1FF 60 SETDMA: MOV H,B ;ENTER WITH DMA ADDRESS IN (BC) D200 69 MOV L,C D201 2267D3 SHLD CPMDMA ;CP/M DMA ADDRESS D204 C9 RET ***************************************************************** * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ***************************************************************** D205 3A86D3 HOME: LDA BUFWRTN ;TEST BUFFER DIRTY FLAG D208 B7 ORA A D209 C210D2 JNZ DOHOME ;SKIP BUFFER DISABLE IF BUFFER DIRTY D20C AF XRA A ;INVALIDATE BUFFER ON HOME CALL D20D 3201D7 STA BUFSEC D210 010000 DOHOME: LXI B,0 ;TRACK TO SEEK TO ***************************************************************** * * * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT THIS * * POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * * * ***************************************************************** D213 60 SETTRK: MOV H,B ;ENTER WITH TRACK NUMBER IN (BC) D214 69 MOV L,C D215 22F9D6 SHLD CPMTRK D218 C9 RET ***************************************************************** * * * SECTRAN TRANSLATES A LOGICAL SECTOR NUMBER INTO A PHYSICAL * * SECTOR NUMBER. * * * ***************************************************************** D219 3AF8D6 SECTRAN:LDA CPMDRV ;GET THE DRIVE NUMBER D21C 67 MOV H,A ;DRIVE IN (H) D21D 2E01 MVI L,D$STRAN D21F C356D4 JMP JUMPER ;SEE DEVICE LEVEL SECTOR TRANSLATION ROUTINES ***************************************************************** * * * SETDRV SELECTS THE NEXT DRIVE TO BE USED IN READ/WRITE * * OPERATIONS. IF THE DRIVE HAS NEVER BEEN SELECTED IT CALLS * * A LOW LEVEL DRIVE SELECT ROUTINE THAT SHOULD PERFORM SOME * * SORT OF CHECK IF THE DEVICE IS WORKING. IF NOT WORKING THEN * * IT SHOULD REPORT AN ERROR. IF THE LOGICAL DRIVE HAS BEEN * * SELECTED BEFORE THEN SETDRV JUST RETURNS THE DPH WITHOUT * * CHECKING THE DRIVE. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #024 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D222 79 SETDRV: MOV A,C ;SAVE THE LOGICAL DRIVE NUMBER D223 32F8D6 STA CPMDRV UD226 FE00 CPI MAXLOG ;CHECK FOR A VALID DRIVE NUMBER D228 D287D2 JNC ZRET ;ILLEGAL DRIVE D22B 7B MOV A,E ;CHECK IF BIT 0 OF (E) = 1 D22C E601 ANI 1 D22E C266D2 JNZ SETD3 ;DRIVE HAS ALLREADY BEEN ACCESSED D231 61 MOV H,C ;MOVE LOGICAL DRIVE INTO (H) D232 2E02 MVI L,D$SEL1 D234 CD56D4 CALL JUMPER ;CALL LOW LEVEL DRIVE SELECT D237 7C MOV A,H ;CHECK IF THE LOW LEVEL DRIVE SELECT RETURNED D238 B5 ORA L ; ZERO TO INDICATE AN ERROR D239 CA87D2 JZ ZRET ;YES, AN ERROR SO REPORT TO CP/M D23C E5 PUSH H ;SAVE DPH ADDRESS D23D CD7AD2 CALL GDPH ;GET ENTRY IF DPH SAVE TABLE D240 D1 POP D ;DPH -> (DE) D241 73 MOV M,E ;PUT ADDRESS OF DPH IN TABLE D242 23 INX H D243 72 MOV M,D D244 23 INX H D245 71 MOV M,C ;PUT SECTOR SIZE IN TABLE D246 23 INX H D247 7E MOV A,M ;CHECK IF BAD MAP HAS EVER BEEN READ FOR THIS D248 B7 ORA A ; DRIVE D249 CC98D2 CZ GETBAD ;NEVER BEEN READ SO READ IN BAD MAP D24C EB XCHG ;DPH -> (HL) D24D 79 SETD0: MOV A,C ;MOVE SECTOR SIZE CODE INTO (A) D24E 3218D3 STA SECSIZ ;SAVE SECTOR SIZE D251 AF XRA A D252 0D SETD1: DCR C ;CREATE NUMBER OF (128 BYTES/PHYSICAL SECTOR)-1 D253 CA5CD2 JZ SETD2 D256 07 RLC D257 F601 ORI 1 D259 C352D2 JMP SETD1 D25C 3256D3 SETD2: STA SECPSEC ;SAVE FOR DEBLOCKING D25F 3AF8D6 LDA CPMDRV ;SAVE CURRENT DRIVE AS OLD DRIVE D262 3207D7 STA LASTDRV ; IN CASE OF SELECT ERRORS D265 C9 RET D266 D5 SETD3: PUSH D ;SAVE DPH ADDRESS D267 61 MOV H,C ;DRIVE IN (H) D268 2E03 MVI L,D$SEL2 ;SELECT DRIVE D26A CD56D4 CALL JUMPER D26D CD7AD2 CALL GDPH ;QUICK SELECT D270 D1 POP D D271 5E MOV E,M ;DPH -> (DE) D272 23 INX H D273 56 MOV D,M D274 23 INX H D275 4E MOV C,M ;SECTOR SIZE -> (C) D276 EB XCHG ;DPH -> (HL) CP/M MACRO ASSEM 2.0 #025 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D277 C34DD2 JMP SETD0 D27A 3AF8D6 GDPH: LDA CPMDRV ;RETURN POINTER TO DPH SAVE AREA D27D 07 RLC ;EACH ENTRY IS 4 BYTES LONG D27E 07 RLC D27F 5F MOV E,A D280 1600 MVI D,0 D282 2198D2 LXI H,DPHTAB ;DPH SAVE AREA TABLE D285 19 DAD D ;ADD OFFSET D286 C9 RET ;(HL) = DPH SAVE AREA FOR CURRENT DRIVE D287 210000 ZRET: LXI H,0 ;SELDRV ERROR EXIT D28A 3A07D7 LDA LASTDRV ;GET LAST SELECTED DRIVE D28D 4F MOV C,A D28E 3A0400 LDA CDISK ;PICK UP USER/DRIVE D291 E6F0 ANI 0F0H ;SAVE USER NUMBER D293 B1 ORA C ;PUT TOGETHER WITH OLD DRIVE D294 320400 STA CDISK D297 C9 RET ***************************************************************** * * * DPH SAVE AREA. EACH ENTRY IS 4 BYTES LONG: * * 0 - LSB OF DPH ADDRESS * * 1 - MSB OF DPH ADDRESS * * 2 - SECTOR SIZE CODE (1 = 128, 2 = 256, 3 = 512... * * 3 - BAD MAP HAS BEEN INITILIZED (0 = UNINITILIZED) * * * ***************************************************************** U DPHTAB: REPT MAXLOG*4 DB 0 ENDM ***************************************************************** * * * GETBAD - CHECK IF A DEVICE HAS A BAD MAP. IF THE DEVICE HAS * * A BAD SECTOR MAP THEN APPEND BAD ENTRIES TO END OF BADMAP * * TABLE. * * * ***************************************************************** D298 3601 GETBAD: MVI M,1 ;SET DRIVE INITILIZED D29A C5 PUSH B D29B D5 PUSH D D29C 3AF8D6 LDA CPMDRV ;PICK UP CURRENT DRIVE D29F 67 MOV H,A ;CALL DRIVE ROUTINE TO RETURN A POINTER TO D2A0 2E0A MVI L,D$BAD ;THE TRACK AND SECTOR OF THE BAD MAP D2A2 CD56D4 CALL JUMPER D2A5 7C MOV A,H ;IF ROUTINE RETURNS 0 THEN THE DEVICE HAS D2A6 B5 ORA L ; NO BAD SECTOR MAP D2A7 CADFD2 JZ BADRET D2AA 5E MOV E,M ;PICK UP TRACK NUMBER OF BAD SECTOR MAP -> (DE) D2AB 23 INX H CP/M MACRO ASSEM 2.0 #026 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D2AC 56 MOV D,M D2AD 23 INX H D2AE EB XCHG D2AF 22F9D6 SHLD CPMTRK D2B2 EB XCHG D2B3 7E MOV A,M ;PICK UP SECTOR NUMBER OF OF BAD SECTOR MAP D2B4 23 INX H D2B5 66 MOV H,M D2B6 6F MOV L,A D2B7 22FBD6 SHLD TRUESEC D2BA CDE6D3 CALL FILL ;READ IN BAD SECTOR MAP INTO THE BUFFER D2BD D8 RC D2BE 2A05D3 LHLD BADPTR ;PICK UP BAD MAP POINTER D2C1 1128D7 LXI D,BUFFER ;START AT BEGINNING OF BUFFER D2C4 1A BADL: LDAX D ;PICK UP AN ENTRY FROM THE BUFFER D2C5 B7 ORA A D2C6 CADCD2 JZ BADE ;ALL DONE D2C9 7E MOV A,M ;PICK UP ENTRY FROM BAD MAP TABLE D2CA 3C INR A D2CB CAE2D2 JZ OVERFLO ;BAD MAP OVERFLOW D2CE 3AF8D6 LDA CPMDRV ;PUT DRIVE IN TABLE D2D1 77 MOV M,A D2D2 23 INX H D2D3 010800 LXI B,8 D2D6 CDDCD4 CALL MOVBYT ;MOVE THE REST OF INFORMATION INTO THE TABLE D2D9 C3C4D2 JMP BADL D2DC 2205D3 BADE: SHLD BADPTR ;RESTORE NEW BAD MAP POINTER D2DF D1 BADRET: POP D D2E0 C1 POP B D2E1 C9 RET D2E2 21EBD2 OVERFLO:LXI H,OMES D2E5 CDFBD4 CALL MESSAGE D2E8 C3DFD2 JMP BADRET D2EB 0D0A424144OMES: DB 0DH, 0AH, 'BAD MAP OVERFLOW!', 0DH, 0AH, 0 D301 210000 NOBAD: LXI H,0 ;USED BY DEVICE DRIVES TO INDICATE NO BAD D304 C9 RET ; SECTOR MAP D305 28D9 BADPTR: DW BADMAP ;POINTER TO NEXT AVAILABLE BAD MAP ENTRY ***************************************************************** * * * WRITE ROUTINE MOVES DATA FROM MEMORY INTO THE BUFFER. IF THE * * DESIRED CP/M SECTOR IS NOT CONTAINED IN THE DISK BUFFER, THE * * BUFFER IS FIRST FLUSHED TO THE DISK IF IT HAS EVER BEEN * * WRITTEN INTO, THEN A READ IS PERFORMED INTO THE BUFFER TO GET * * THE DESIRED SECTOR. ONCE THE CORRECT SECTOR IS IN MEMORY, THE * * BUFFER WRITTEN INDICATOR IS SET, SO THE BUFFER WILL BE * * FLUSHED, THEN THE DATA IS TRANSFERRED INTO THE BUFFER. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #027 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D307 79 WRITE: MOV A,C ;SAVE WRITE COMMAND TYPE D308 3280D3 STA WRITTYP D30B 3E01 MVI A,1 ;SET WRITE COMMAND D30D C314D3 JMP RWENT ***************************************************************** * * * READ ROUTINE TO BUFFER DATA FROM THE DISK. IF THE SECTOR * * REQUESTED FROM CP/M IS IN THE BUFFER, THEN THE DATA IS SIMPLY * * TRANSFERRED FROM THE BUFFER TO THE DESIRED DMA ADDRESS. IF * * THE BUFFER DOES NOT CONTAIN THE DESIRED SECTOR, THE BUFFER IS * * FLUSHED TO THE DISK IF IT HAS EVER BEEN WRITTEN INTO, THEN * * FILLED WITH THE SECTOR FROM THE DISK THAT CONTAINS THE * * DESIRED CP/M SECTOR. * * * ***************************************************************** D310 AF READ: XRA A ;SET THE COMMAND TYPE TO READ IF NOSTAND NE 0 D311 32F2D6 STA UNALOC ;CLEAR UNALLOCATED WRITE FLAG ENDIF D314 326AD3 RWENT: STA RDWR ;SAVE COMMAND TYPE ***************************************************************** * * * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS THE * * SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, THE * * BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR READ * * FROM THE DISK. * * * ***************************************************************** D317 0600 REDWRT: MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 D318 = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK D319 2AF6D6 LHLD CPMSEC ;GET THE DESIRED CP/M SECTOR # D31C 7C MOV A,H D31D E680 ANI 80H ;SAVE ONLY THE SIDE BIT D31F 4F MOV C,A ;REMEMBER THE SIDE D320 7C MOV A,H D321 E67F ANI 7FH ;FORGET THE SIDE BIT D323 67 MOV H,A D324 2B DCX H ;TEMPORARY ADJUSTMENT D325 05 DIVLOOP:DCR B ;UPDATE REPEAT COUNT D326 CA33D3 JZ DIVDONE D329 B7 ORA A D32A 7C MOV A,H D32B 1F RAR D32C 67 MOV H,A D32D 7D MOV A,L D32E 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ; OF THE PHYSICAL SECTORS D32F 6F MOV L,A D330 C325D3 JMP DIVLOOP ; D333 23 DIVDONE:INX H CP/M MACRO ASSEM 2.0 #028 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D334 7C MOV A,H D335 B1 ORA C ;RESTORE THE SIDE BIT D336 67 MOV H,A D337 22FBD6 SHLD TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER D33A 21F8D6 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR D33D 11FED6 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR D340 0606 MVI B,6 ;COUNT LOOP D342 05 DTSLOP: DCR B ;TEST IF DONE WITH COMPARE D343 CA51D3 JZ MOVE ;YES, MATCH. GO MOVE THE DATA D346 1A LDAX D ;GET A BYTE TO COMPARE D347 BE CMP M ;TEST FOR MATCH D348 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM D349 13 INX D D34A CA42D3 JZ DTSLOP ;MATCH, CONTINUE TESTING ***************************************************************** * * * DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF * * NECESSARY AND THEN REFILL. * * * ***************************************************************** D34D CDE6D3 CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR D350 D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ***************************************************************** * * * MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT * * THE BUFFER. * * * ***************************************************************** D351 3AF6D6 MOVE: LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER D354 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER D355 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS D356 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS D357 6F MOV L,A ;PUT INTO HL D358 2600 MVI H,0 D35A 29 DAD H ;FORM OFFSET INTO BUFFER D35B 29 DAD H D35C 29 DAD H D35D 29 DAD H D35E 29 DAD H D35F 29 DAD H D360 29 DAD H D361 1128D7 LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER D364 19 DAD D ;FORM BEGINNING ADDRESS OF SECTGR TO TRANSFER D365 EB XCHG ;DE = ADDRESS IN BUFFER D366 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED T/ ; CONTAIN THE DMA ADDRESS D367 = CPMDMA EQU $-2 D369 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ; A ZERO IF A READ, OR A 1 IF WRITE D36A = RDWR EQU $-1 D36B A7 ANA A ;TEST WHICH KIND OF OPERATION CP/M MACRO ASSEM 2.0 #029 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D36C C276D3 JNZ INTO ;TRANSFER DATA INTO THE BUFFER D36F CDD9D4 OUTOF: CALL MOV128 D372 3AFDD6 LDA ERROR ;GET THE BUFFER ERROR FLAG D375 C9 RET D376 EB INTO: XCHG ; D377 CDD9D4 CALL MOV128 ;MOVE THE DATA, HL = DESTINATION ; DE = SOURCE D37A 3E01 MVI A,1 D37C 3286D3 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG D37F 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE D380 = WRITTYP EQU $-1 D381 3D DCR A ;TEST FOR A DIRECTORY WRITE D382 3E00 MVI A,0 D384 C0 RNZ ;NO ERROR EXIT ***************************************************************** * * * FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF * * IT HAS EVER BEEN WRITTEN INTO. * * * ***************************************************************** D385 3E00 FLUSH: MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF ; THE BUFFER HAS BEEN WRITTEN INTO D386 = BUFWRTN EQU $-1 D387 B7 ORA A ;TEST IF WRITTEN INTO D388 C8 RZ ;NOT WRITTEN, ALL DONE D389 3E09 MVI A,D$WRITE D38B 32C9D3 STA RWOP+1 D38E CD95D3 CALL PREP ;DO THE PHYSICAL WRITE D391 32FDD6 STA ERROR ;SET UP THE ERROR FLAG D394 C9 RET ***************************************************************** * * * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE ATTEMPTED. * * UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE OPERATION * * ADDRESS. * * * ***************************************************************** D395 CD79D4 PREP: CALL ALT ;CHECK FOR ALTERNATE SECTORS D398 F3 DI ;RESET INTERRUPTS D399 AF XRA A ;RESET BUFFER WRITTEN FLAG D39A 3286D3 STA BUFWRTN D39D 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT D39F C5 RETRYLP:PUSH B ;SAVE THE RETRY COUNT D3A0 2E03 MVI L,D$SEL2 ;SELECT DRIVE D3A2 CD52D4 CALL JUMPBUF D3A5 2A03D7 LHLD ALTTRK ;TRACK NUMBER -> (HL) D3A8 7C MOV A,H ;TEST FOR TRACK ZERO CP/M MACRO ASSEM 2.0 #030 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D3A9 B5 ORA L D3AA E5 PUSH H ;SAVE TRACK NUMBER D3AB 2E04 MVI L,D$HOME D3AD CC52D4 CZ JUMPBUF D3B0 C1 POP B ;RESTORE TRACK # D3B1 2E05 MVI L,D$STRK D3B3 CD52D4 CALL JUMPBUF D3B6 2A05D7 LHLD ALTSEC ;SECTOR -> (HL) D3B9 44 MOV B,H D3BA 4D MOV C,L D3BB 2E06 MVI L,D$SSEC D3BD CD52D4 CALL JUMPBUF D3C0 0128D7 LXI B,BUFFER ;SET THE DMA ADDRESS D3C3 2E07 MVI L,D$SDMA D3C5 CD52D4 CALL JUMPBUF D3C8 2E00 RWOP: MVI L,0 ;GET OPERATION ADDRESS D3CA CD52D4 CALL JUMPBUF D3CD C1 POP B ;RESTORE THE RETRY COUNTER D3CE 3E00 MVI A,0 ;NO ERROR EXIT STATUS D3D0 D0 RNC ;RETURN NO ERROR D3D1 05 DCR B ;UPDATE THE RETRY COUNTER D3D2 37 STC ;ASSUME RETRY COUNT EXPIRED D3D3 3EFF MVI A,0FFH ;ERROR RETURN D3D5 C8 RZ ;RETURN SAD NEWS D3D6 78 MOV A,B D3D7 FE05 CPI RETRIES/2 D3D9 C29FD3 JNZ RETRYLP ;TRY AGAIN D3DC C5 PUSH B ;SAVE RETRY COUNT D3DD 2E04 MVI L,D$HOME ;HOME DRIVE AFTER (RETRIES/2) ERRORS D3DF CD52D4 CALL JUMPBUF D3E2 C1 POP B D3E3 C39FD3 JMP RETRYLP ;TRY AGAIN ***************************************************************** * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ***************************************************************** D3E6 CD85D3 FILL: CALL FLUSH ;FLUSH BUFFER FIRST D3E9 D8 RC ;CHECK FOR ERROR D3EA 11F8D6 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR D3ED 21FED6 LXI H,BUFDRV D3F0 010500 LXI B,5 ;NUMBER OF BYTES TO MOVE D3F3 CDDCD4 CALL MOVBYT ;COPY THE DATA D3F6 3A6AD3 LDA RDWR ;TEST READ WRITE FLAG D3F9 B7 ORA A D3FA CA46D4 JZ FREAD ;SKIP WRITE TYPE CHECK IF READING CP/M MACRO ASSEM 2.0 #031 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D3FD 3A80D3 LDA WRITTYP ;0 = ALLOC, 1 = DIR, 2 = UNALLOC IF NOSTAND NE 0 ;DO NON STANDARD (BUT QUICK AND DIRTY) CHECK D400 B7 ORA A D401 C227D4 JNZ FNALOC ;SKIP IF NOT AN ALLOCATED WRITE D404 3AF2D6 LDA UNALOC ;CHECK UNALLOCATED WRITE IN PROGRESS FLAG D407 B7 ORA A D408 CA41D4 JZ FWRITIN ;WE ARE DOING AN ALLOCATED WRITE D40B 2AE7CF LHLD CBLOCK ;GET CURRENT BLOCK ADDRESS D40E EB XCHG D40F 2AF3D6 LHLD OBLOCK ; AND OLD BLOCK ADDRESS D412 7A MOV A,D ;COMPARE OLD VERSUS NEW D413 BC CMP H D414 C23DD4 JNZ AWRITIN ;DIFFERENT, CLEAR UNALLOCATED WRITTING MODE D417 7B MOV A,E D418 BD CMP L D419 C23DD4 JNZ AWRITIN D41C 21F8D6 LXI H,CPMDRV ;TEST FOR DIFFERENT DRIVE D41F 3AF5D6 LDA UNADRV D422 BE CMP M D423 C23DD4 JNZ AWRITIN ;DRIVE IS DIFFERENT, CLEAR UNALLOCATED MODE D426 C9 RET ;UNALLOCATED WRITE, DO NOTHING... D427 3D FNALOC: DCR A D428 CA3DD4 JZ AWRITIN ;DO A DIRECTORY WRITE ;WE ARE NOW DOING AN UNALLOCATED WRITE D42B 2AE7CF LHLD CBLOCK ;SAVE CURRENT BLOCK NUMBER D42E 22F3D6 SHLD OBLOCK D431 3AF8D6 LDA CPMDRV ;SAVE DRIVE THAT THIS BLOCK BELONGS TO D434 32F5D6 STA UNADRV D437 3E01 MVI A,1 ;SET UNALLOCATED WRITE FLAG D439 32F2D6 STA UNALOC D43C C9 RET ; AND WE DO NOTHING ABOUT THE WRITE D43D AF AWRITIN:XRA A ;CLEAR UNALLOCATED WRITTING MODE D43E 32F2D6 STA UNALOC ELSE ;DO STANDARD UNALLOCATED TEST SUI 2 ;TEST FOR AN UNALLOCATED WRITE RZ ENDIF D441 3A18D3 FWRITIN:LDA SECSIZ ;CHECK FOR 128 BYTE SECTORS D444 3D DCR A D445 C8 RZ ;NO DEBLOCKING NEEDED D446 3E08 FREAD: MVI A,D$READ D448 32C9D3 STA RWOP+1 D44B CD95D3 CALL PREP ;READ THE PHYSICAL SECTOR THE BUFFER D44E 32FDD6 STA ERROR ;SET THE ERROR STATUS D451 C9 RET ***************************************************************** CP/M MACRO ASSEM 2.0 #032 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * * * JUMPBUF, JUMPER ARE USED TO DISPATCH TO A LOW LEVEL DEVICE * * SUBROUTINE. JUMPER IS CALLED WITH THE DRIVE IN (H) AND THE * * ROUTINE NUMBER (SEE DESCRIPTION ABOVE) IN (L). IT PASSES * * ALONG THE (BC) AND (DE) REGISTERS UNALTERED. JUMPBUF IS * * A CALL TO JUMPER WITH THE DRIVE NUMBER FROM BUFDRV. * * * ***************************************************************** D452 3AFED6 JUMPBUF:LDA BUFDRV ;DISPATCH WITH BUFDRV FOR DRIVE D455 67 MOV H,A D456 D5 JUMPER: PUSH D D457 C5 PUSH B D458 E5 PUSH H D459 7C MOV A,H ;LOGICAL DRIVE INTO (A) D45A 113BD0 LXI D,DSTTAB ;DRIVE SPECIFICATION POINTER TABLE D45D 4F JUMPL: MOV C,A ;SAVE LOGICAL IN (C) D45E 1A LDAX D D45F 6F MOV L,A D460 13 INX D D461 1A LDAX D D462 67 MOV H,A ;GET A DST POINTER IN (HL) D463 13 INX D D464 79 MOV A,C ;LOGICAL IN (A) D465 96 SUB M ;SUBTRACT FROM FIRST ENTRY IN DST D466 D25DD4 JNC JUMPL ;KEEP SCANNING TABLE TILL CORRECT DRIVER FOUND D469 23 INX H ;BUMP (HL) TO POINT TO START OF DISPATCH TABLE D46A D1 POP D ;REAL (HL) -> (DE) D46B 7B MOV A,E ;MOVE OFFSET NUMBER INTO (A) D46C 07 RLC ;EACH ENTRY IS 2 BYTES D46D 5F MOV E,A ;MAKE AN OFFSET D46E 1600 MVI D,0 D470 19 DAD D ;(HL) = **ROUTINE D471 7E MOV A,M ;PICK UP ADDRESS OF HANDLER FOR SELECTED D472 23 INX H ; FUNCTION D473 66 MOV H,M D474 6F MOV L,A ;(HL) = *ROUTINE D475 79 MOV A,C ;LOGICAL IN (A) D476 C1 POP B ;RESTORE SAVED REGISTERS D477 D1 POP D D478 E9 PCHL ***************************************************************** * * * CHECK FOR ALTERNATE SECTORS IN BAD SECTOR TABLE. IF AN * * ALTERNATE SECTOR IS FOUND REPLACE ALTTRK AND ALTSEC WITH * * NEW SECTOR NUMBER ELSE PASS ALONG UNALTERED. * * * ***************************************************************** D479 2128D9 ALT: LXI H,BADMAP ;ADDRESS OF BAD MAP -> (HL) D47C 3AFED6 LDA BUFDRV ;PICK UP DRIVE NUMBER CURRENTLY WORKING ON D47F 4F MOV C,A ;MOVE DRIVE INTO (C) FOR SPEED IN SEARCH D480 EB ALL: XCHG CP/M MACRO ASSEM 2.0 #033 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D481 2A05D3 LHLD BADPTR ;GET BAD MAP POINTER D484 EB XCHG ; -> (DE) D485 7A MOV A,D ;CHECK IF AT END OF BAD MAP TABLE D486 BC CMP H D487 C29CD4 JNZ ALT2 ;STILL MORE D48A 7B MOV A,E D48B BD CMP L D48C C29CD4 JNZ ALT2 ;STILL MORE D48F 2AFFD6 LHLD BUFTRK ;NO ALTERNATE SECTOR SO USE SELECTED SECTOR D492 2203D7 SHLD ALTTRK D495 2A01D7 LHLD BUFSEC D498 2205D7 SHLD ALTSEC D49B C9 RET D49C E5 ALT2: PUSH H ;SAVE CURRENT BAD MAP ENTRY ADDRESS D49D 79 MOV A,C ;MOVE DRIVE INTO (A) D49E BE CMP M ;CHECK IF DRIVE IN TABLE MATCHES D49F C2D1D4 JNZ ALTMIS ;DOES NOT MATCH SKIP THIS ENTRY D4A2 23 INX H ;POINT TO LSB OF ALTERNATE TRACK D4A3 3AFFD6 LDA BUFTRK ;PICK UP LSB OF BUFFER TRACK D4A6 BE CMP M D4A7 C2D1D4 JNZ ALTMIS D4AA 23 INX H ;POINT TO MSB ALTERNATE TRACK D4AB 3A00D7 LDA BUFTRK+1 ;PICK UP MSB OF BUFFER TRACK D4AE BE CMP M D4AF C2D1D4 JNZ ALTMIS D4B2 23 INX H ;POINT TO LSB OF ALTERNATE SECTOR D4B3 3A01D7 LDA BUFSEC ;PICK UP LSB OF BUFFER SECTOR D4B6 BE CMP M D4B7 C2D1D4 JNZ ALTMIS D4BA 23 INX H ;POINT TO MSB OF ALTERNATE SECTOR D4BB 3A02D7 LDA BUFSEC+1 ;PICK UP MSB OF BUFFER SECTOR D4BE BE CMP M D4BF C2D1D4 JNZ ALTMIS ;FOUND AN ALTERNATE SECTOR D4C2 23 INX H ;POINT TO REAL INFO ON THE ALTERNATE SECTOR D4C3 1103D7 LXI D,ALTTRK D4C6 EB XCHG ;MOVLOP (DE) = SOURCE, (HL) = DEST D4C7 C5 PUSH B D4C8 010400 LXI B,4 D4CB CDDCD4 CALL MOVBYT ;MOVE ALTERNATE SECTOR INFO IN CORRECT PLACE D4CE C1 POP B D4CF E1 POP H D4D0 C9 RET D4D1 E1 ALTMIS: POP H ;CURRENT ALTERNATE DID NOT MATCH D4D2 110900 LXI D,9 ;BUMP POINTER BY THE LENGTH OF AN ENTRY D4D5 19 DAD D D4D6 C380D4 JMP ALL ;LOOP FOR MORE ***************************************************************** * * * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * * POINTER IN HL. * * * ***************************************************************** CP/M MACRO ASSEM 2.0 #034 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D4D9 018000 MOV128: LXI B,128 ;LENGTH OF TRANSFER D4DC AF MOVBYT: XRA A ;CHECK IF HOST PROCESSOR IS A Z80 D4DD C603 ADI 3 D4DF E2EDD4 JPO Z80MOV ;YES, ITS A Z80 SO USE BLOCK MOVE D4E2 1A M8080: LDAX D ;GET A BYTE OF SOURCE D4E3 77 MOV M,A ;MOVE IT D4E4 13 INX D ;BUMP POINTERS D4E5 23 INX H D4E6 0B DCX B ;UPDATE COUNTER D4E7 78 MOV A,B ;TEST FOR END D4E8 B1 ORA C D4E9 C2E2D4 JNZ M8080 D4EC C9 RET D4ED EB Z80MOV: XCHG ;SOURCE IN (HL), DESTINATION IN (DE) D4EE EDB0 DW 0B0EDH ;LDIR D4F0 EB XCHG D4F1 C9 RET ***************************************************************** * * * RETURN DPH POINTER. ENTER WITH (DE) WITH DPH BASE ADDRESS * * AND (A) WITH LOGICAL DRIVE NUMBER. RETURNS WITH DPH ADDRESS * * IN (HL). * * * ***************************************************************** D4F2 6F RETDPH MOV L,A ;MOVE LOGICAL DRIVE INTO (L) D4F3 2600 MVI H,0 D4F5 29 DAD H ;MULTIPLY BY 16 (SIZE OF DPH) D4F6 29 DAD H D4F7 29 DAD H D4F8 29 DAD H D4F9 19 DAD D ;(HL) = POINTER TO DPH D4FA C9 RET ***************************************************************** * * * UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY (HL) * * TERMINATED WITH A NULL. * * * ***************************************************************** D4FB 7E MESSAGE:MOV A,M ;GET A CHARACTER OF THE MESSAGE D4FC 23 INX H ;BUMP TEXT POINTER D4FD B7 ORA A ;TEST FOR END D4FE C8 RZ ;RETURN IF DONE D4FF E5 PUSH H ;SAVE POINTER TO TEXT D500 4F MOV C,A ;OUTPUT CHARACTER IN C D501 CD0CD0 CALL COUT ;OUTPUT THE CHARACTER D504 E1 POP H ;RESTORE THE POINTER D505 C3FBD4 JMP MESSAGE ;CONTINUE UNTIL NULL REACHED ***************************************************************** * * CP/M MACRO ASSEM 2.0 #035 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * THE FOLLOWING EQUATES RELATE THE MORROW DESIGNS 2D/B * * CONTROLLER. IF THE CONTROLLER IS NON STANDARD (0F800H) * * ONLY THE FDORIG EQUATE NEED BE CHANGED. * * * ***************************************************************** IF MAXFD NE 0 ;INCLUDE DISCUS 2D ? E000 = FDORIG EQU 0E000H ;ORIGIN OF DISK JOCKEY PROM E000 = FDBOOT EQU FDORIG+00H ;DISK JOCKEY 2D INITIALIZATION E003 = FDCIN EQU FDORIG+03H ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE E006 = FDCOUT EQU FDORIG+06H ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE E009 = FDHOME EQU FDORIG+09H ;DISK JOCKEY 2D TRACK ZERO SEEK E00C = FDSEEK EQU FDORIG+0CH ;DISK JOCKEY 2D TRACK SEEK ROUTINE E00F = FDSEC EQU FDORIG+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE E012 = FDDMA EQU FDORIG+12H ;DISK JOCKEY 2D SET DMA ADDRESS E015 = FDREAD EQU FDORIG+15H ;DISK JOCKEY 2D READ ROUTINE E018 = FDWRITE EQU FDORIG+18H ;DISK JOCKEY 2D WRITE ROUTINE E01B = FDSEL EQU FDORIG+1BH ;DISK JOCKEY 2D SELECT DRIVE ROUTINE E021 = FDTSTAT EQU FDORIG+21H ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE E027 = FDSTAT EQU FDORIG+27H ;DISK JOCKEY 2D STATUS ROUTINE E02A = FDERR EQU FDORIG+2AH ;DISK JOCKEY 2D ERROR, FLASH LED E02D = FDDEN EQU FDORIG+2DH ;DISK JOCKEY 2D SET DENSITY ROUTINE E030 = FDSIDE EQU FDORIG+30H ;DISK JOCKEY 2D SET SIDE ROUTINE E400 = FDRAM EQU FDORIG+400H ;DISK JOCKEY 2D RAM ADDRESS 0020 = DBLSID EQU 20H ;SIDE BIT FROM CONTROLLER E3F8 = IO EQU FDORIG+3F8H ;START OF I/O REGISTERS E3F9 = DREG EQU IO+1 E3FC = CMDREG EQU IO+4 00D0 = CLRCMD EQU 0D0H ***************************************************************** * * * DEVICE SPECIFICATION TABLE FOR THE DISK JOCKEY 2D/B * * * ***************************************************************** D508 02 FDDST: DB MAXFD ;NUMBER OF LOGICAL DRIVES D509 1FD5 DW FDWARM ;WARM BOOT D50B CCD5 DW FDTRAN ;SECTOR TRANSLATION D50D FFD5 DW FDLDRV ;SELECT DRIVE 1 D50F A5D6 DW FDSEL2 ;SELECT DRIVE 2 D511 ACD6 DW FDLHOME ;HOME DRIVE D513 0CE0 DW FDSEEK ;SEEK TO SPECIFIED TRACK D515 B4D6 DW FDSSEC ;SET SECTOR D517 12E0 DW FDDMA ;SET DMA ADDRESS D519 15E0 DW FDREAD ;READ A SECTOR D51B 18E0 DW FDWRITE ;WRITE A SECTOR D51D 01D3 DW NOBAD ;NO BAD SECTOR MAP ***************************************************************** * * * FLOPPY DISK WARM BOOT LOADER * * * ***************************************************************** D51F 4F FDWARM: MOV C,A CP/M MACRO ASSEM 2.0 #036 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D520 CD1BE0 CALL FDSEL ;SELECT DRIVE A D523 0E00 MVI C,0 ;SELECT SIDE 0 D525 CD30E0 CALL FDSIDE D528 CD09E0 WRMFAIL:CALL FDHOME ;TRACK 0, SINGLE DENSITY D52B DA28D5 JC WRMFAIL ;LOOP IF ERROR ;THE NEXT BLOCK OF CODE RE-INITIALIZES ; THE WARM BOOT LOADER FOR TRACK 0 D52E 3E03 MVI A,5-2 ;INITIALIZE THE SECTOR TO READ - 2 D530 323AD5 STA NEWSEC D533 2100B9 LXI H,CCP-100H ;FIRST REVOLUTION DMA - 100H D536 2255D5 SHLD NEWDMA ;LOAD ALL OF TRACK 0 D539 3E03 T0BOOT: MVI A,5-2 ;FIRST SECTOR - 2 D53A = NEWSEC EQU $-1 D53B 3C INR A ;UPDATE SECTOR # D53C 3C INR A D53D FE1B CPI 27 ;SIZE OF TRACK IN SECTORS + 1 D53F DA4DD5 JC NOWRAP ;SKIP IF NOT AT END OF TRACK D542 C278D5 JNZ T1BOOT ;DONE WITH THIS TRACK D545 D615 SUI 27-6 ;BACK UP TO SECTOR 6 D547 2180B9 LXI H,CCP-80H ;MEMORY ADDRESS OF SECTOR - 100H D54A 2255D5 SHLD NEWDMA D54D 323AD5 NOWRAP: STA NEWSEC ;SAVE THE UPDATED SECTOR # D550 4F MOV C,A D551 CD0FE0 CALL FDSEC ;SET UP THE SECTOR D554 2100B9 LXI H,CCP-100H ;MEMORY ADDRESS OF SECTOR - 100H D555 = NEWDMA EQU $-2 D557 110001 LXI D,100H ;UPDATE DMA ADDRESS D55A 19 DAD D D55B 2255D5 NOWRP: SHLD NEWDMA ;SAVE THE UPDATED DMA ADDRESS D55E 44 MOV B,H D55F 4D MOV C,L D560 CD12E0 CALL FDDMA ;SET UP THE NEW DMA ADDRESS D563 01000A LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS, TRACK # D566 C5 WRMFRED:PUSH B D567 CD0CE0 CALL FDSEEK ;SET UP THE PROPER TRACK D56A CD15E0 CALL FDREAD ;READ THE SECTOR D56D C1 POP B D56E D239D5 JNC T0BOOT ;CONTINUE IF NO ERROR D571 05 DCR B D572 C266D5 JNZ WRMFRED ;KEEP TRYING IF ERROR D575 C32AE0 JMP FDERR ;TOO MANY ERRORS, FLASH THE LIGHT ;LOAD TRACK 1, SECTOR 1, SECTOR 3 (PARTIAL), SECTOR 2 (1024 BYTE SECTORS) D578 0E01 T1BOOT: MVI C,1 ;TRACK 1 D57A CD0CE0 CALL FDSEEK D57D 0100C5 LXI B,CCP+0B00H ;ADDRESS FOR SECTOR 1 D580 11010A LXI D,10*100H+1 ;RETRY COUNT + SECTOR 1 D583 CDADD5 CALL WRMREAD D586 0100C9 LXI B,CCP+0F00H ;ADDRESS FOR SECTOR 2 D589 11030A LXI D,10*100H+3 ;RETRY COUNT + SECTOR 3 D58C CDADD5 CALL WRMREAD CP/M MACRO ASSEM 2.0 #037 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D58F 010003 LXI B,0300H ;SIZE OF PARTIAL SECTOR D592 1100CD LXI D,CCP+1300H ;ADDRESS FOR SECTOR 3 D595 2100C9 LXI H,CCP+0F00H ;ADDRESS OF SECTOR 3 D598 7E WRMCPY: MOV A,M ;GET A BYTE AND D599 12 STAX D ; SAVE IT D59A 13 INX D ;BUMP POINTERS D59B 23 INX H D59C 0B DCX B ;BUMP COUNTER D59D 78 MOV A,B ;CHECK IF DONE D59E B1 ORA C D59F C298D5 JNZ WRMCPY ; IF NOT, LOOP D5A2 0100C9 LXI B,CCP+0F00H ;ADDRESS FOR SECTOR 2 D5A5 11020A LXI D,10*100H+2 ;RETRY COUNT + SECTOR 2 D5A8 CDADD5 CALL WRMREAD D5AB AF XRA A ;CLEAR ERROR INDICATOR D5AC C9 RET D5AD D5 WRMREAD:PUSH D D5AE CD12E0 CALL FDDMA ;SET DMA ADDRESS D5B1 C1 POP B D5B2 CD0FE0 CALL FDSEC ;SET SECTOR D5B5 C5 WRMFRD: PUSH B ;SAVE ERROR COUNT D5B6 CD15E0 CALL FDREAD ;READ A SECTOR D5B9 DAC3D5 JC WRMERR ;DO RETRY STUFF ON ERROR D5BC CD27E0 CALL FDSTAT ;SECTOR SIZE MUST BE 1024 BYTES D5BF E60C ANI 0CH ;MASK LENGTH BITS D5C1 D60C SUI 0CH ;CARRY (ERROR) WILL BE SET IF < 0C0H D5C3 C1 WRMERR: POP B ;FETCH RETRY COUNT D5C4 D0 RNC ;RETURN IF NO ERROR D5C5 05 DCR B ;BUMP ERROR COUNT D5C6 C2B5D5 JNZ WRMFRD D5C9 C32AE0 JMP FDERR ;ERROR, FLASH THE LIGHT D5CC 03 FDTRAN: INX B D5CD D5 PUSH D ;SAVE TABLE ADDRESS D5CE C5 PUSH B ;SAVE SECTOR # D5CF CD9CD6 CALL FDGET ;GET DPH FOR CURRENT DRIVE D5D2 110A00 LXI D,10 ;LOAD DPH POINTER D5D5 19 DAD D D5D6 7E MOV A,M D5D7 23 INX H D5D8 66 MOV H,M D5D9 6F MOV L,A D5DA 7E MOV A,M ;GET # OF CP/M SECTORS/TRACK D5DB B7 ORA A ;CLEAR CARRY D5DC 1F RAR ;DIVIDE BY TWO D5DD 91 SUB C ;SUBTRACT SECTOR NUMBER D5DE F5 PUSH PSW ;SAVE ADJUSTED SECTOR D5DF FAEBD5 JM SIDETWO D5E2 F1 SIDEA: POP PSW ;DISCARD ADJUSTED SECTOR D5E3 C1 POP B ;RESTORE SECTOR REQUESTED D5E4 D1 POP D ;RESTORE ADDRESS OF XLT TABLE D5E5 EB SIDEONE:XCHG ;HL <- &(TRANSLATION TABLE) CP/M MACRO ASSEM 2.0 #038 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D5E6 09 DAD B ;BC = OFFSET INTO TABLE D5E7 6E MOV L,M ;HL <- PHYSICAL SECTOR D5E8 2600 MVI H,0 D5EA C9 RET D5EB CDC1D6 SIDETWO:CALL FDGSID ;CHECK OUT NUMBER OF SIDES D5EE CAE2D5 JZ SIDEA ;SINGLE SIDED D5F1 F1 POP PSW ;RETRIEVE ADJUSTED SECTOR D5F2 C1 POP B D5F3 2F CMA ;MAKE SECTOR REQUEST POSITIVE D5F4 3C INR A D5F5 4F MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR D5F6 D1 POP D D5F7 CDE5D5 CALL SIDEONE D5FA 3E80 MVI A,80H ;SIDE TWO BIT D5FC B4 ORA H ; AND SECTOR D5FD 67 MOV H,A D5FE C9 RET D5FF 32EED6 FDLDRV: STA FDLOG ;SAVE LOGICAL DRIVE D602 4F MOV C,A ;SAVE DRIVE # D603 3E00 MVI A,0 ;HAVE THE FLOPPIES BEEN ACCESSED YET ? D604 = FLOPFLG EQU $-1 D605 A7 ANA A D606 C236D6 JNZ FLOPOK D609 0611 MVI B,17 ;FLOPPIES HAVN'T BEEN ACCESSED D60B 2100E0 LXI H,FDBOOT ;CHECK IF 2D CONTROLLER IS INSTALLED D60E 3EC3 MVI A,(JMP) D610 BE CLOPP: CMP M ;MUST HAVE 17 JUMPS D611 C287D2 JNZ ZRET D614 23 INX H D615 23 INX H D616 23 INX H D617 05 DCR B D618 C210D6 JNZ CLOPP D61B 11D0D6 LXI D,FDINIT ;INITIALIZATION SEQUENCE D61E 21E2E7 LXI H,FDORIG+7E2H ;LOAD ADDRESS D621 011E00 LXI B,30 ;BYTE COUNT D624 CDDCD4 CALL MOVBYT ;LOAD CONTROLLER RAM D627 3EFF MVI A,0FFH ;START 1791 D629 32F9E3 STA DREG D62C 3ED0 MVI A,CLRCMD ;1791 RESET D62E 32FCE3 STA CMDREG D631 3E01 MVI A,1 ;SET 2D INITIALIZED FLAG D633 3204D6 STA FLOPFLG D636 CD85D3 FLOPOK: CALL FLUSH ;FLUSH BUFFER SINCE WE ARE USING IT D639 3AEED6 LDA FDLOG ;SELECT NEW DRIVE D63C 4F MOV C,A D63D CD1BE0 CALL FDSEL D640 CDACD6 CALL FDLHOME ;RECALIBRATE THE DRIVE D643 210100 LXI H,1 ;SELECT SECTOR 1 OF TRACK 2 D646 22FBD6 SHLD TRUESEC D649 23 INX H D64A 22F9D6 SHLD CPMTRK CP/M MACRO ASSEM 2.0 #039 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D64D AF XRA A ;MAKE SURE WE ARE DOING A READ D64E 326AD3 STA RDWR D651 CDE6D3 CALL FILL ;FILL IN BUFFER WITH SECTOR D654 DA87D2 JC ZRET ;TEST FOR ERROR RETURN D657 CD27E0 CALL FDSTAT ;GET STATUS ON CURRENT DRIVE D65A 32EFD6 STA FDLDST ;SAVE DRIVE STATUS D65D E60C ANI 0CH ;MASK IN SECTOR SIZE BITS D65F F5 PUSH PSW ;USED TO SELECT A DPB D660 1F RAR UD661 210000 LXI H,XLTS ;TABLE OF XLT ADDRESSES D664 5F MOV E,A D665 1600 MVI D,0 D667 19 DAD D D668 E5 PUSH H ;SAVE POINTER TO PROPER XLT D669 CD9CD6 CALL FDGET ;GET POINTER TO PROPER DPH D66C D1 POP D D66D 010200 LXI B,2 ;COPY XLT POINTER INTO DPH D670 CDDCD4 CALL MOVBYT D673 110800 LXI D,8 ;OFFSET TO DPB POINTER IN DPH D676 19 DAD D ;HL <- &DPH.DPB D677 E5 PUSH H D678 CDC1D6 CALL FDGSID ;GET POINTER TO SIDE FLAG TABLE ENTRY D67B 3AEFD6 LDA FDLDST ;GET DRIVE STATUS D67E E620 ANI DBLSID ;CHECK DOUBLE SIDED BIT D680 77 MOV M,A ;SAVE SIDES FLAG UD681 110000 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S D684 CA8AD6 JZ SIDEOK UD687 110000 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S D68A EB SIDEOK: XCHG D68B D1 POP D ;(HL) -> DPB BASE, (DE) -> &DPH.DPB D68C F1 POP PSW ;OFFSET TO CORRECT DPB D68D 17 RAL D68E 17 RAL ;MAKE 0, 10, 20, 30 D68F 4F MOV C,A D690 0600 MVI B,0 ;MAKE OFFSET D692 09 DAD B ;(HL) IS NOW A DPB POINTER D693 EB XCHG ;PUT PROPER DPB ADDRESS IN DPH.DPB D694 73 MOV M,E D695 23 INX H D696 72 MOV M,D D697 210F00 LXI H,15 ;OFFSET TO DPB.SIZ D69A 19 DAD D D69B 4E MOV C,M ;FETCH SECTOR SIZE CODE D69C 3AEED6 FDGET: LDA FDLOG ;RETURN PROPER DPH D69F 1108D7 LXI D,DPHFD0 D6A2 C3F2D4 JMP RETDPH D6A5 32EED6 FDSEL2: STA FDLOG D6A8 4F MOV C,A D6A9 C31BE0 JMP FDSEL D6AC 0E00 FDLHOME:MVI C,0 ;SELECT SIDE 0 D6AE CD30E0 CALL FDSIDE D6B1 C309E0 JMP FDHOME ;DO ACTUAL HOME D6B4 C5 FDSSEC: PUSH B ;SAVE SECTOR NUMBER CP/M MACRO ASSEM 2.0 #040 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D6B5 78 MOV A,B ;CHECK SIDE SELECT BIT D6B6 07 RLC ;MOVE HIGH BIT TO BIT ZERO D6B7 E601 ANI 1 D6B9 4F MOV C,A D6BA CD30E0 CALL FDSIDE ;CALL SELECT SIDE 0 = SIDE A, 1 = SIDE B D6BD C1 POP B D6BE C30FE0 JMP FDSEC D6C1 21F0D6 FDGSID: LXI H,FDLSID ;SIDE FLAG TABLE D6C4 3AEED6 LDA FDLOG ;DRIVE NUMBER D6C7 D5 PUSH D D6C8 5F MOV E,A ;MAKE OFFSET D6C9 1600 MVI D,0 D6CB 19 DAD D ;OFFSET TO PROPER ENTRY D6CC D1 POP D D6CD 7E MOV A,M ;SET UP FLAGS D6CE B7 ORA A D6CF C9 RET D6D0 0000 FDINIT: DW 0 ;INITIALIZATION BYTES LOADED ONTO 2D/B D6D2 0018 DW 1800H ;HEAD LOADED TIMEOUT D6D4 0000 DW 0 ;DMA ADDRESS D6D6 00 DB 0 ;DOUBLE SIDED FLAG D6D7 00 DB 0 ;READ HEADER FLAG D6D8 7E DB 07EH ;DRIVE SELECT CONSTANT D6D9 00 DB 0 ;DRIVE NUMBER D6DA 08 DB 8 ;CURRENT DISK D6DB 00 DB 0 ;HEAD LOADED FLAG D6DC 09 DB 9 ;DRIVE 0 PARAMETERS D6DD FF DB 0FFH ;DRIVE 0 TRACK ADDRESS D6DE 09 DB 9 ;DRIVE 1 PARAMETERS D6DF FF DB 0FFH ;DRIVE 1 TRACK ADDRESS D6E0 09 DB 9 ;DRIVE 2 PARAMETERS D6E1 FF DB 0FFH ;DRIVE 2 TRACK ADDRESS D6E2 09 DB 9 ;DRIVE 3 PARAMETERS D6E3 FF DB 0FFH ;DRIVE 3 TRACK ADDRESS D6E4 09 DB 9 ;CURRENT PARAMETERS D6E5 00 DB 0 ;SIDE DESIRED D6E6 01 DB 1 ;SECTOR DESIRED D6E7 00 DB 0 ;TRACK DESIRED D6E8 00 DB 0 ;HEADER IMAGE, TRACK D6E9 00 DB 0 ;SECTOR D6EA 00 DB 0 ;SIDE D6EB 00 DB 0 ;SECTOR D6EC 0000 DW 0 ;CRC D6EE 00 FDLOG: DB 0 D6EF 00 FDLDST: DB 0 ;FLOPPY DRIVE STATUS BYTE FDLSID: REPT MAXFD DB 0FFH ;DOUBLE SIDED FLAG 0 = SINGLE, 1 = DOUBLE ENDM D6F0+FF DB 0FFH ;DOUBLE SIDED FLAG 0 = SINGLE, 1 = DOUBLE D6F1+FF DB 0FFH ;DOUBLE SIDED FLAG 0 = SINGLE, 1 = DOUBLE ENDIF CP/M MACRO ASSEM 2.0 #041 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 U IF (MAXFD NE 0) OR (MAXDM NE 0) ***************************************************************** * * * XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT * * TABLES FOR EACH SECTOR SIZE. * * * ***************************************************************** XLTS: DW XLT128 ;XLT FOR 128 BYTE SECTORS DW XLT256 ;XLT FOR 256 BYTE SECTORS DW XLT512 ;XLT FOR 512 BYTE SECTORS DW XLT124 ;XLT FOR 1024 BYTE SECTORS ***************************************************************** * * * XLT TABLES (SECTOR SKEW TABLES) FOR CP/M 2.0. THESE TABLES * * DEFINE THE SECTOR TRANSLATION THAT OCCURS WHEN MAPPING CP/M * * SECTORS TO PHYSICAL SECTORS ON THE DISK. THERE IS ONE SKEW * * TABLE FOR EACH OF THE POSSIBLE SECTOR SIZES. CURRENTLY THE * * TABLES ARE LOCATED ON TRACK 0 SECTORS 6 AND 8. THEY ARE * * LOADED INTO MEMORY IN THE CBIOS RAM BY THE COLD BOOT ROUTINE. * * * ***************************************************************** XLT128: DB 0 DB 1,7,13,19,25 DB 5,11,17,23 DB 3,9,15,21 DB 2,8,14,20,26 DB 6,12,18,24 DB 4,10,16,22 XLT256: DB 0 DB 1,2,19,20,37,38 DB 3,4,21,22,39,40 DB 5,6,23,24,41,42 DB 7,8,25,26,43,44 DB 9,10,27,28,45,46 DB 11,12,29,30,47,48 DB 13,14,31,32,49,50 DB 15,16,33,34,51,52 DB 17,18,35,36 XLT512: DB 0 DB 1,2,3,4,17,18,19,20 DB 33,34,35,36,49,50,51,52 DB 5,6,7,8,21,22,23,24 DB 37,38,39,40,53,54,55,56 DB 9,10,11,12,25,26,27,28 DB 41,42,43,44,57,58,59,60 DB 13,14,15,16,29,30,31,32 DB 45,46,47,48 XLT124: DB 0 CP/M MACRO ASSEM 2.0 #042 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 DB 1,2,3,4,5,6,7,8 DB 25,26,27,28,29,30,31,32 DB 49,50,51,52,53,54,55,56 DB 9,10,11,12,13,14,15,16 DB 33,34,35,36,37,38,39,40 DB 57,58,59,60,61,62,63,64 DB 17,18,19,20,21,22,23,24 DB 41,42,43,44,45,46,47,48 ***************************************************************** * * * EACH OF THE FOLLOWING TABLES DESCRIBES A DISKETTE WITH THE * * SPECIFIED CHARACTERISTICS. * * * ***************************************************************** ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * * SINGLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** DPB128S:DW 26 ;CP/M SECTORS/TRACK DB 3 ;BSH DB 7 ;BLM DB 0 ;EXM DW 242 ;DSM DW 63 ;DRM DB 0C0H ;AL0 DB 0 ;AL1 DW 16 ;CKS DW 2 ;OFF DB 1 ;128 BYTE SECTORS ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 256 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** DPB256S:DW 52 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 1 ;EXM DW 242 ;DSM DW 127 ;DRM DB 0C0H ;AL0 DB 0 ;AL1 DW 32 ;CKS DW 2 ;OFF DB 2 ;256 BYTE SECTORS ***************************************************************** * * CP/M MACRO ASSEM 2.0 #043 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** DPB512S:DW 60 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 0 ;EXM DW 280 ;DSM DW 127 ;DRM DB 0C0H ;AL0 DB 0 ;AL1 DW 32 ;CKS DW 2 ;OFF DB 3 ;512 BYTE SECTORS ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND SINGLE SIDED. * * * ***************************************************************** DP1024S:DW 64 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 0 ;EXM DW 299 ;DSM DW 127 ;DRM DB 0C0H ;AL0 DB 0 ;AL1 DW 32 ;CKS DW 2 ;OFF DB 4 ;1024 BYTE SECTORS ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE FOR 128 BYTE SECTORS, * * SINGLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** DPB128D:DW 52 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 1 ;EXM DW 242 ;DSM DW 127 ;DRM DB 0C0H ;AL0 DB 0 ;AL1 DW 32 ;CKS DW 2 ;OFF DB 1 ;128 BYTE SECTORS ***************************************************************** CP/M MACRO ASSEM 2.0 #044 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 256 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** DPB256D:DW 104 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 0 ;EXM DW 486 ;DSM DW 255 ;DRM DB 0F0H ;AL0 DB 0 ;AL1 DW 64 ;CKS DW 2 ;OFF DB 2 ;256 BYTE SECTORS ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 512 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** DPB512D:DW 120 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 0 ;EXM DW 561 ;DSM DW 255 ;DRM DB 0F0H ;AL0 DB 0 ;AL1 DW 64 ;CKS DW 2 ;OFF DB 3 ;512 BYTE SECTORS ***************************************************************** * * * THE FOLLOWING DPB DEFINES A DISKETTE AS 1024 BYTE SECTORS, * * DOUBLE DENSITY, AND DOUBLE SIDED. * * * ***************************************************************** DP1024D:DW 128 ;CP/M SECTORS/TRACK DB 4 ;BSH DB 15 ;BLM DB 0 ;EXM DW 599 ;DSM DW 255 ;DRM DB 0F0H ;AL0 DB 0 ;AL1 DW 64 ;CKS DW 2 ;OFF DB 4 ;1024 BYTE SECTORS CP/M MACRO ASSEM 2.0 #045 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ENDIF ***************************************************************** * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ***************************************************************** IF NOSTAND NE 0 ;UNALLOCATED WRITTING VARIABLES D6F2 00 UNALOC: DB 0 ;UNALLOCATED WRITE IN PROGRESS FLAG D6F3 0000 OBLOCK: DW 0 ;LAST UNALLOCATED BLOCK NUMBER WRITTEN D6F5 00 UNADRV: DB 0 ;DRIVE THAT THE BLOCK BELONGS TO ENDIF D6F6 0000 CPMSEC: DW 0 ;CP/M SECTOR # D6F8 00 CPMDRV: DB 0 ;CP/M DRIVE # D6F9 0000 CPMTRK: DW 0 ;CP/M TRACK # D6FB 0000 TRUESEC:DW 0 ;PHYSICAL SECTOR THAT CONTAINS CP/M SECTOR D6FD 00 ERROR: DB 0 ;BUFFER'S ERROR STATUS FLAG D6FE 00 BUFDRV: DB 0 ;DRIVE THAT BUFFER BELONGS TO D6FF 0000 BUFTRK: DW 0 ;TRACK THAT BUFFER BELONGS TO D701 0000 BUFSEC: DW 0 ;SECTOR THAT BUFFER BELONGS TO D703 0000 ALTTRK: DW 0 ;ALTERNATE TRACK D705 0000 ALTSEC: DW 0 ;ALTERANTE SECTOR D707 00 LASTDRV:DB 0 ;LAST SELECTED DRIVE ***************************************************************** * * * DPB AND DPH AREA. * * * ***************************************************************** IF MAXFD NE 0 0000 # DN SET 0 REPT MAXFD DPHGEN FD,%DN,0,0 DN SET DN+1 ENDM D708+= DPHFD0 EQU $ D708+0000 DW 0 D70A+0000000000 DW 0,0,0 D710+28D9 DW DIRBUF D712+0000 DW 00 D714+B8D9 DW CSVFD0 D716+F8D9 DW ALVFD0 D718+= DPHFD1 EQU $ D718+0000 DW 0 D71A+0000000000 DW 0,0,0 D720+28D9 DW DIRBUF D722+0000 DW 00 D724+43DA DW CSVFD1 D726+83DA DW ALVFD1 CP/M MACRO ASSEM 2.0 #046 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ENDIF U IF MAXDM NE 0 DN SET 0 REPT MAXDM DPHGEN DM,%DN,0,0 DN SET DN+1 ENDM ENDIF D728 = BUFFER EQU $ ***************************************************************** * * * SIGNON MESSAGE OUTPUT DURING COLD BOOT. * * * ***************************************************************** D728 801A PROMPT: DB 80H, CLEAR ;CLEAN BUFFER AND SCREEN D72A 0D0A0A DB ACR, ALF, ALF D72D 4D6F72726F DB 'Morrow Designs ' D73C 35 DB '0'+MSIZE/10 ;CP/M MEMORY SIZE D73D 36 DB '0'+(MSIZE MOD 10) D73E 4B2043502F DB 'K CP/M ' ;CP/M VERSION NUMBER D745 32 DB CPMREV/10+'0' D746 2E DB '.' D747 32 DB (CPMREV MOD 10)+'0' D748 20 DB ' ' D749 45 DB (REVNUM/10)+'A'-1 D74A 33 DB (REVNUM MOD 10)+'0' D74B 0D0A DB ACR, ALF ; ; PRINT A MESSAGE LIKE: ; ; AB: DJDMA 8", CD: DJDMA 5 1/4", E: HDDMA M5 ; 0000 # MSDRV SET 0 ;START WITH DRIVE A: MSBUMP MACRO NDRIVES ;PRINT A DRIVE NAME IF DN GT 1 DB ', ' ENDIF REPT NDRIVES DB MSDRV+'A' MSDRV SET MSDRV+1 ENDM DB ': ' ENDM PRHEX MACRO DIGIT ;WRITE A BYTE IN HEX PRNIB DIGIT/10H PRNIB DIGIT CP/M MACRO ASSEM 2.0 #047 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ENDM PRNIB MACRO DIGIT ;WRITE A DIGIT IN HEX TEMP SET DIGIT AND 0FH IF TEMP < 10 DB TEMP + '0' ELSE DB TEMP - 10 + 'A' ENDIF ENDM 0001 # DN SET 1 ;GENERATE THE DRIVE MESSAGES REPT 16 ;RUN OFF AT LEAST 16 DRIVES ENDIF ENDIF ENDIF IF DN EQ FDORDER ;GENERATE THE 2D/B MESSAGE MSBUMP MAXFD DB 'DJ2D/B @' PRHEX FDORIG/100H PRHEX FDORIG ENDIF DN SET DN+1 ENDM B + ENDIF B + ENDIF B + ENDIF D74D+41 DB MSDRV+'A' D74E+42 DB MSDRV+'A' D74F+3A20 DB ': ' D751+444A32442F DB 'DJ2D/B @' D759+45 DB TEMP - 10 + 'A' D75A+30 DB TEMP + '0' D75B+30 DB TEMP + '0' D75C+30 DB TEMP + '0' B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF CP/M MACRO ASSEM 2.0 #048 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF B + ENDIF D75D 0D0A DB ACR,ALF D75F 00 DB 0 ;END OF MESSAGE ***************************************************************** * * * CBOOT IS THE COLD BOOT LOADER. ALL OF CP/M HAS BEEN LOADED IN * * WHEN CONTROL IS PASSED HERE. * * * ***************************************************************** D760 310001 CBOOT: LXI SP,TPA ;SET UP STACK D763 AF XRA A ;CLEAR COLD BOOT FLAG D764 32E1D1 STA CWFLG D767 3260D0 STA GROUP ;CLEAR GROUP SELECT BYTE D76A 32F8D6 STA CPMDRV ;SELECT DISK A: D76D 320400 STA CDISK D770 2103D0 LXI H,BIOS+3 ;PATCH COLD BOOT TO WARM CODE D773 2201D0 SHLD BIOS+1 D776 3A5FD0 LDA IOBYT ;INITIALIZE THE IOBYTE D779 320300 STA IOBYTE D77C 1128D9 LXI D,BADMAP ;CLEAR OUT BAD MAP CP/M MACRO ASSEM 2.0 #049 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 D77F 12 STAX D D780 2129D9 LXI H,BADMAP+1 UD783 010000 LXI B,9*BADSIZ ;32 MAP ENTRIES D786 CDDCD4 CALL MOVBYT D789 36FF MVI M,0FFH ;END MARKER IF CONTYP NE 6 ;NON IOBYTE INITS IF CONTYP NE 0 ;DO NOT CALL TTYSET FOR PROM'S D78B CD9AD7 CALL TTYSET ;INITIALIZE THE TERMINAL ENDIF IF LSTTYP NE 0 ;DO NOT CALL LSTSET FOR PROM'S D78E CD0CD1 CALL LSTSET ;INITIALIZE THE LIST DEVICE ENDIF ELSE ;DO IOBYTE INITS LXI H,DEVSET ;DEVICE SETUP ROUTINE POINTER TABLE CBOOT0: MOV E,M ;LOAD A ROUTINE ADDRESS INX H MOV D,M INX H MOV A,D ;TEST FOR THE END OF THE TABLE ORA E JZ CBOOT2 PUSH H ;SAVE THE TABLE POINTER LXI H,CBOOT1 ;RETURN ADDRESS PUSH H XCHG PCHL ;'CALL' A DEVICE SETUP ROUTINE CBOOT1: POP H ;RESTORE THE TABLE POINTER JMP CBOOT0 DEVSET: DW TTYSET, CRTSET, UC1SET ;DEVICE SETUP ROUTINE POINTERS DW PTRSET, UR1SET, UR2SET DW PTPSET, UP1SET, UP2SET DW LPTSET, UL1SET, 0 CBOOT2 EQU $ ENDIF D791 2128D7 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE D794 CDFBD4 CALL MESSAGE ;SEND THE PROMPT D797 C38CD1 JMP GOCPM ***************************************************************** * * * CONSOLE AND LIST DEVICE INITIALIZATION ROUTINES FOLLOW. * * * ***************************************************************** IF CONTYP EQ 2 ;MULTI I/O, DECISION I ***************************************************************** * * * TERMINAL INITILIZATION ROUTINE. THIS ROUTINE READS THE SENSE * * SWITCH ON THE WB-14 AND SETS THE SPEED ACCORDINGLY. * * * CP/M MACRO ASSEM 2.0 #050 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ***************************************************************** TTYSET: CALL SELG0 ;SELECT GROUP 0 IN SENSESW ;GET SENSE SWITCH (FF ON A MULTIO) PUSH PSW CALL SELCON ;SELECT CONSOLE POP PSW PUSH PSW CALL TINI0 ;INITIALIZE THE CONSOLE POP PSW PUSH PSW CALL SELRDR ;SELECT THE READER/PUNCH POP PSW CALL TINI0 ;INITIALIZE THE READER/PUNCH RET TINI0: ANI 0E0H ;MASK IN UPPER THREE BITS RLC ;MOVE INTO LOWER 3 BITS RLC RLC CPI 7 ;CHECK FOR SENSE = 7 (DEFAULT SETTING) JZ DFBAUD ;USE DEFAULT BAUD RATE LXI H,BTAB ;POINTER TO BAUD RATE TABLE ADD A ;TABLE OF WORDS SO DOUBLE MOV E,A ;MAKE A 16 BIT NUMBER INTO (DE) MVI D,0 DAD D ;GET A POINTER INTO BAUD RATE TABLE MOV E,M ;GET LOWER BYTE OF WORD INX H ;BUMP TO HIGH BYTE OF WORD MOV D,M ;GET UPPER BYTE. (DE) NOW HAS DIVISOR JMP SETIT ;SET BAUD RATE DFBAUD: LHLD DEFCON ;USE DEFAULT BAUD RATE XCHG SETIT: MVI A,DLAB+WLS1+WLS0+STB ;ENABLE DIVISOR ACCESS LATCH OUT LCR ;SET THE BAUD RATE IN (DE) MOV A,D OUT DLM ;SET UPPER DIVISOR MOV A,E OUT DLL ;SET LOWER DIVISOR MVI A,WLS1+WLS0+STB ;CLEAR DIVISOR LATCH OUT LCR XRA A OUT IER ;SET NO INTERRUPTS OUT LSR ;CLEAR STATUS MVI A,DTRENB+RTSENB ;ENABLE DTR AND RTS OUTPUTS TO TERMINAL OUT MCR IN MSR ;CLEAR MODEM STATUS REGISTER IN LSR ;CLEAR LINE STATUS REGISTER IN RBR ;CLEAR RECIEVER BUFFERS IN RBR RET CP/M MACRO ASSEM 2.0 #051 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 BTAB: DW 1047 ;110 BAUD 000 DW 384 ;300 001 DW 96 ;1200 010 DW 48 ;2400 011 DW 24 ;4800 100 DW 12 ;9600 101 DW 6 ;19200 110 ;DEFCON 111 ENDIF ;MULTI I/O, DECISION I IF CONTYP EQ 3 ;2D/B CONSOLE INITIALIZATION D79A CD21E0 TTYSET: CALL FDTSTAT ;CLEAN INPUT BUFFER D79D C0 RNZ ;ALL EMPTY D79E CD03E0 CALL FDCIN D7A1 C39AD7 JMP TTYSET ENDIF ;2D/B CONSOLE IF CONTYP EQ 4 TTYSET: CALL DMINIT ;SEE IF CONTROLLER PRESENT RC ;NO CONTROLLER, RETURN LXI D,DMACI ;CONSOLE INITIALIZATION SEQUENCE LXI H,DMCHAN LXI B,10 ;COMMAND LENGTH CALL MOVBYT DCX H XRA A ;CLEAR SERIAL INPUT STATUS STA SERIN+1 JMP DOCMD2 ;DO STUFF AND RETURN DMACI: DB WRITEM ;ZOT MONITOR DISABLE FLAG DW TTYSET ;ANY NON-ZERO BYTE WILL DO DB 0 DW 1 ;ONE BYTE DW 13F5H ;MAGICAL PLACE IN MONITOR DB SENABL ;ENABLE SERIAL INPUT DB 1 ENDIF ************************************************************************* * * * INITIALIZE THE NORTH STAR MOTHER BOARD, LEFT SERIAL PORT, RIGHT * * SERIAL PORT, AND NORTH STAR RAM PARITY. * * * ************************************************************************* IF CONTYP EQ 6 ;NORTH STAR DRIVERS TTYSET: ;SET UP THE PARALLEL PORT + MOTHERBOARD XRA A ;INITIALIZE MOTHER BOARD OUT 6 OUT 6 OUT 6 CP/M MACRO ASSEM 2.0 #052 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 OUT 6 MVI A,30H ;RESET THE PARALLEL PORT INPUT FLAG OUT NSPSTA MVI A,60H ;SET THE PARALLEL PORT OUTPUT FLAG OUT NSPSTA MVI A,ACR ;FORCE A CR OUT THE PARALLEL PORT CALL NSPOUT ;INITIALIZE THE LEFT SERIAL PORT MVI A,NSLIN1 ;SEE THE EQUATES FOR BIT DEFINATIONS OUT NSLSTA MVI A,NSLIN2 OUT NSLSTA XRA A ;CLEAR THE INPUT/OUTPUT BUFFERS OUT NSLDAT IN NSLDAT IN NSLDAT ;INITIALIZE THE RIGHT SERIAL PORT MVI A,NSRIN1 ;SEE THE EQUATES FOR BIT DEFINATIONS OUT NSRSTA MVI A,NSRIN2 OUT NSRSTA XRA A ;CLEAR THE INPUT/OUTPUT BUFFERS OUT NSRDAT IN NSRDAT IN NSRDAT IF NSRAM NE 0 ;RESET PARITY ON NORTH STAR RAMS MVI A,40H ;DISABLE PARITY LOGIC OUT NSRAM LXI H,0 ;STARTING ADDRESS NSET0: MOV A,M ;GET A BYTE MOV M,A ;REWRITE, SET PROPER PARITY INR L ;BUMP THE ADDRESS POINTER JNZ NSET0 NSET1: INR H ;SKIP TO THE NEXT MEMORY PAGE JZ NSET2 ;SKIP IF ALL DONE MVI A,(HIGH $) + 1 ;IS THE POINTER ABOVE US? CMP H ;SET CARRY IF POINTER IS <= OUR PAGE+1 JC NSET0 ;RESET THE NEXT PAGES PARITY MOV A,M ;TEST FOR A PROM OR NO MEMORY MOV B,A ;SAVE THE ORIGINAL BYTE CMA ;SEE IF THIS LOCATION WILL CHANGE MOV M,A CMP M ;TEST FOR A CHANGE MOV M,B ;RESTORE THE ORIGINAL VALUE JZ NSET0 ;VALUE COMPLEMENTED, MUST BE RAM ORA A ;TEST FOR NO MEMORY PRESENT JZ NSET1 ;SKIP TO THE NEXT PAGE IF NO MEMORY LXI D,700H ;SKIP 2K BYTES OF 'PROM' DAD D JNC NSET1 ;DO A PAGE CHECK IF NO OVERFLOW CP/M MACRO ASSEM 2.0 #053 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 NSET2: MVI A,41H ;RE-ENABLE PARITY ON THE MEMORY BOARDS OUT NSRAM ENDIF CRTSET: ;NULL ROUTINES PTRSET: PTPSET: UC1SET: UR1SET: UR2SET: UP1SET: UP2SET: LPTSET: UL1SET: RET ENDIF ;NORTH STAR DRIVERS IF (LSTTYP GE 2) AND (LSTTYP LE 5) ;SERIAL MULTI I/O LIST DRIVERS LSTSET: CALL SELLST ;SELECT PRINTER GROUP MVI A,DLAB ;ACCESS DIVISOR LATCH OUT LCR LHLD DEFLST ;GET LST: BAUD RATE DIVISOR MOV A,H OUT DLM ;SET UPPER BAUD RATE MOV A,L OUT DLL MVI A,STB+WLS0+WLS1 ;2 STOP BITS + 8 BIT WORD OUT LCR MVI A,DTRENB+RTSENB ;DTR + RTS ENABLED OUT MCR IN RBR ;CLEAR INPUT BUFFER XRA A OUT IER ;NO INTERRUPTS RET ENDIF D7A4 00FF00 DB 0,0FFH,0 07A7 = CODELEN EQU ($-BIOS) ;LENGTH OF CBIOS CODE IF CODELEN GT 1000H ;TEST FOR SYSGEN PROBLEMS 'FATAL ERROR, system is too big for SYSGEN rev. 4.X' DBGTMP SET CODELEN ;CBIOS CODE LENGTH ! ENDIF IF DEBUG DBGTMP SET CODELEN ;CBIOS CODE LENGTH ! ENDIF D7A7 DS 512-($-BUFFER) ;BUFFER FOR 512 BYTE SECTORS U IF (MAXFD NE 0) OR (MAXDM NE 0) OR (MAXMW NE 0) DS 512 ;ADDITIONAL SPACE FOR 1K SECTOR DEVICES CP/M MACRO ASSEM 2.0 #054 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 ENDIF ***************************************************************** * * * EACH BAD MAP ENTRY CONSISTS OF 9 BYTES: * * LOGICAL DRIVE NUMBER (1 BYTE) * * TRACK NUMBER OF BAD SECTOR (2 BYTES) * * SECTOR NUMBER OF BAD SECTOR (2 BYTES) * * TRACK NUMBER OF ALTERNATE SECTOR (2 BYTES) * * SECTOR NUMBER OF ALTERNATE SECTOR (2 BYTES) * * * ***************************************************************** UD928 BADMAP: DS BADSIZ*9+1 ;32 ENTRIES + END MARKER D928 DIRBUF: DS 128 ;DIRECTORY BUFFER D9A8 TEMPB: DS 16 ;A LITTLE TEMPORARY BUFFER ***************************************************************** * * * ALLOCATION AND CHECKED DIRECTORY TABLE AREA * * * ***************************************************************** IF MAXFD NE 0 0000 # DN SET 0 REPT MAXFD ALLOC FD,%DN,75,64 DN SET DN+1 ENDM D9B8+ CSVFD0: DS 64 D9F8+ ALVFD0: DS 75 DA43+ CSVFD1: DS 64 DA83+ ALVFD1: DS 75 ENDIF U IF MAXDM NE 0 DN SET 0 REPT MAXDM ALLOC DM,%DN,75,64 DN SET DN+1 ENDM ENDIF U IF MAXMF NE 0 DN SET 0 REPT MAXMF ALLOC MF,%DN,22,16 DN SET DN+1 ENDM ENDIF CP/M MACRO ASSEM 2.0 #055 CBIOS Revision E for CP/M Version 2.2 - March 4, 1982 000B = BIOSLEN EQU (HIGH ($-BIOS))+1 ;BIOS LENGTH IN PAGES IF BIOSLEN GT BIOSLN ;TEST FOR OVERFLOW 'FATAL ERROR, system overflow. BIOSLN must be at least' DBGTMP SET BIOSLEN ;BIOSLN! ENDIF IF DEBUG DBGTMP SET BIOSLN ;CURRENT BIOSLN! IF BIOSLN GT BIOSLEN DBGTMP SET BIOSLEN ;OPTIMAL BIOSLN! ENDIF ENDIF DACE END