CP/M MACRO ASSEM 2.0 #001 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;********************************************************************** TITLE 'CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs' ;********************************************************************** ; ;THE FOLLOWING DRIVERS ARE INCLUDED IN THIS CBIOS. ;------------------------------------------------- ; ; CONSOLE DEVICES: ; CDRV0 PROM PATCH (4 JUMPS: CONIN, CONOUT, CONST & CONINT) ; CDRV1 PATCH AREA (128 BYTES) ; CDRV2 MULTI I/O OR DECISION I DRIVER ; CDRV3 2D/B DRIVER ; CDRV4 DJDMA SERIAL PORT ; CDRV5 SWITCHBOARD SERIAL PORT ; CDRV6 NORTH STAR MOTHERBOARD (2 SERIAL + 1 PARALLEL) ; ; LIST DEVICES: ; LDRV0 PROM PATCH (3 JUMPS: LSTOUT, LSTOST & LSTSET) ; LDRV1 PATCH AREA (128 BYTES) ; LDRV2 MULTIO_REV3-4 OR WUNDERBUSS I/O SERIAL, NO PROTOCOL ; LDRV3 MULTIO_REV3-4 OR WUNDERBUSS I/O SERIAL, CLEAR TO SEND PROTOCOL ; LDRV4 MULTIO_REV3-4 OR WUNDERBUSS I/O SERIAL, DATA SET READY PROTOCOL ; LDRV5 MULTIO_REV3-4 OR WUNDERBUSS I/O SERIAL, XON/XOFF PROTOCOL ; ; DISK SYSTEMS: ; DDRV1 DJDMA FLOPPY DISK CONTROLLER WITH 8 AND 5 1/4 INCH DISKS. ; DDRV2 DJ 2D/B FLOPPY DISK CONTROLLER WITH 8 INCH DISKS. ; DDRV3 HDDMA 5, 10, 16, MEGABYTE HARD DISK SYSTEMS. ; DDRV3 HDCA 10, 20 AND 26 MEGABYTE HARD DISKS. ; ; 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. PAGE CP/M MACRO ASSEM 2.0 #002 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;***************************** ;BEGIN USER CONFIGURATION AREA ;***************************** 0001 = ABSASM EQU 1 ;SET 0 FOR RMAC, SET 1 FOR MAC ; ;GENERAL SYSTEM CONSIDERATIONS ;============================= ;MEMORY SIZE ;----------- ; 1) THE FOLLOWING EQUATE SETS THE MEMORY SIZE IN KILOBYTES. FOR ; EXAMPLE, 48 DENOTES A 48K SYSTEM WHILE 64 EQUALS A 64K SYSTEM. ; 0030 = MSIZE EQU 48 ;MEMORY SIZE OF TARGET CP/M 0014 = BIOSLN EQU 14H ;BIOS LENGTH. ALSO IN ABOOT&.ASM ;NON-STANDARD FLAG ;----------------- ; 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. ; 0000 = NOSTAND EQU 0 ;SET TO 1 FOR NON-STANDARD MODE ;DEFINE THE CONSOLE AND PRINTER ENVIRONMENTS ;=========================================== ; THE FOLLOWING IS A LIST OF POSSIBLE BAUD RATES AND THE DECIMAL ; VALUE NEEDED FOR THE CBAUD AND LBAUD DEFINITIONS ; ; BAUD RATE CBAUD/LBAUD BAUD RATE CBAUD/LBAUD ; 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 ; 1200 96 38400 3 ; 1800 64 56000 2 ; ;DEFINE THE CONSOLE DRIVER TO BE USED. ;------------------------------------- ; CONTYP IS: 0 NOTHING, USED FOR PATCHING TO PROM'S. ; 1 PROVIDE FOR 128 BYTES OF PATCH SPACE. ; 2 MULTI I/O OR DECISION I DRIVER. ; 3 2D/B DRIVER. ; 4 DJDMA SERIAL PORT ; 5 SWITCHBOARD SERIAL PORT ; 6 NORTH STAR MOTHERBOARD (2 SERIAL + 1 PARALLEL) ; 0006 = CONTYP EQU 6 ;CONSOLE TYPE 000C = CBAUD EQU 12 ;CONSOLE BAUD RATE CP/M MACRO ASSEM 2.0 #003 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;DEFINE THE LIST DRIVER TO BE USED ;--------------------------------- ; LSTTYP IS: 0 NOTHING, USED FOR PATCHING TO PROM'S. ; 1 PROVIDE FOR 128 BYTES OF PATCH SPACE. ; 2 MULTIO/WBIO SERIAL, NO PROTOCOL. ; 3 MULTIO/WBIO SERIAL, CLEAR TO SEND PROTOCOL. ; 4 MULTIO/WBIO SERIAL, DATA SET READY PROTOCOL. ; 5 MULTIO/WBIO SERIAL, XON/XOFF PROTOCOL. ; ; NOTE: THE WUNDERBUSS I/O BOARD (WBIO) USED IN THE DECISION 1 IS ; FUNCTIONALLY IDENTICAL TO THE MULTIO. ; 0001 = LSTTYP EQU 1 ;LIST DEVICE TYPE 0060 = LBAUD EQU 96 ;LIST DEVICE BAUD RATE PAGE CP/M MACRO ASSEM 2.0 #004 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;SETUP DISK SYSTEM ;================= ; ;SELECT THE NUMBER OF EACH TYPE OF DISK DRIVE ;-------------------------------------------- ; 1) THIS FOLLOWING TABLE TELLS THE SYSTEM THE TYPES AND NUMBERS OF DRIVES ; THAT ARE ACTIVE. ; 2) DRIVES THAT ARE NOT PRESENT SHOULD BE SET TO ZERO. ; 3) AN EXAMPLE: IF YOU HAVE 2-8" DRIVES USING A DJDMA AND ONE DISK ; ATTACHED TO AN HDDMA CONTROLLER YOU WOULD SET MAXDM = 2 AND ; MAXMW = 1, WITH ALL OTHER SELECTIONS SET TO ZERO. ; 0002 = MAXDM EQU 2 ;DJDMA FLOPPIES (8") 0002 = MAXMF EQU 2 ;DJDMA FLOPPIES (5 1/4") 0000 = MAXFD EQU 0 ;DJ2D/B FLOPPIES (8" ONLY) 0000 = MAXMW EQU 0 ;HDDMA HARD DISKS 0000 = MAXHD EQU 0 ;HDCA HARD DISK DRIVES ;SET THE LOGICAL ORDERING OF THE DRIVES ;-------------------------------------- ; 1) YOU MUST ASSIGN AN 'ORDER NUMBER' FOR EACH DRIVE TYPE SELECTED ; IN THE PREVIOUS SET OF EQUATES. DRIVE TYPES THAT WERE NOT SELECTED ; IN THE PREVIOUS SET OF EQUATES MUST BE SET TO ZERO IN THIS SET. ; 2) NUMBERING MUST START WITH 1 AND BE CONTINIOUS. ; 3) AN EXAMPLE: SUPPOSE THAT YOUR SYSTEM CONSISTS OF TWO DJDMA_8" ; DRIVES AND FOUR DJDMA_1/4" DRIVES ALONG WITH ONE DRIVE ATTACHED TO ; AN HDDMA CONTROLLER; FURTHERMORE, SUPPOSE THAT YOU SET DMORDER TO ; 3, MFORDER TO 2 AND MWORDER TO 1. THE HDDMA WOULD BE YOUR A: DRIVE. ; THE 8" DRIVES WOULD BE THE B: AND C: DRIVES; AND, FINALLY, THE D:, ; E:, F:, AND G: DRIVES WOULD BE ASSIGNED TO THE 5_1/4" DJDMA DRIVES. ; 0001 = DMORDER EQU 1 ;DJDMA FLOPPIES (8") 0002 = MFORDER EQU 2 ;DJDMA FLOPPIES (5 1/4") 0000 = FDORDER EQU 0 ;DJ2D/B FLOPPIES (8" ONLY) 0000 = MWORDER EQU 0 ;HDDMA HARD DISKS 0000 = HDORDER EQU 0 ;HDCA HARD DISK DRIVES ;HDDMA CONTROLLER DISK DRIVES ;---------------------------- ; 1) IF THE HDDMA CONTROLLER HAS BEEN SELECTED THEN YOU MUST CHOOSE ONE ; (AND ONLY ONE) OF THE FOLLOWING DRIVE TYPES. ; 0000 = ST506 EQU 0 ;SEAGATE ST-506 0000 = ST412 EQU 0 ;SEAGATE ST-412 0000 = CM5619 EQU 0 ;CMI CM-5619 ;HDCA CONTROLLER DISK DRIVES ;--------------------------- ; 1) IF THE HDCA CONTROLLER HAS BEEN SELECTED THEN YOU MUST CHOOSE ONE ; (AND ONLY ONE) OF THE FOLLOWING DRIVE TYPES. ; 0000 = M10F EQU 0 ;FUJITSU M2301B 0000 = M10M EQU 0 ;MEMOREX 0000 = M20 EQU 0 ;FUJITSU M2302B CP/M MACRO ASSEM 2.0 #005 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs 0000 = M26 EQU 0 ;SHUGART SA4000 ;DJDMA CONTROLLER EQUATES ;------------------------ ; 0000 = MFSLOW EQU 0 ;SET TRUE IF SLOW STEPPING 5-1/4" FLOPPY ;DJ2D/B CONTROLLER EQUATES ;------------------------- ; F800 = FDORIG EQU 0F800H ;ORIGIN OF DJ2D/B DISK JOCKEY PROM ;MISC CONSIDERATIONS ;------------------- 0000 = WMDRIVE EQU 0 ;CP/M LOGICAL DRIVE NUMBER TO WARM BOOT FROM. 0000 = MWQUIET EQU 0 ;SET FOR NO NAMES PRINTED ON LOGIN (HDDMA ONLY) IF MAXMW NE 0 BADSIZ EQU 32 ;NUMBER OF BADMAP ENTRIES FOR HDDMA ELSE ;(ONLY HDDMA DRIVES USE THE BAD MAP) 0001 = BADSIZ EQU 1 ;LEAVE ONE ENTRY AS FILLER ENDIF PAGE CP/M MACRO ASSEM 2.0 #006 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ***************************** ;BEGIN INTERNAL CBIOS EQUATES ;**************************** ; ; ;REVISION NUMBERS ;---------------- ; 1) THE CBIOS REVISION NUMBER IS OUTPUT ON A COLD BOOT OF THE SYSTEM. ; 2) THE FIRST PART OF THE CBIOS REVISION NUMBER IS CONVERTED TO AN ; ALPHA CHARACTER WHILE THE THE SECOND PART IS SIMPLY OUTPUT AS A ; NUMBER. FOR EXAMPLE 54 BECOMES E4 AND 27 BECOMES B7. 0036 = REVNUM EQU 54 ;CBIOS REVISION NUMBER 0016 = CPMREV EQU 22 ;CP/M REVISION NUMBER 2.2 ;DEBUG FLAG ;---------- ; THE DEBUG FLAG MERELY CAUSES VARIOUS INTERNAL VALUES AND ; 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. ; 0000 = DEBUG EQU 0 ;SET TO 1 FOR DEBUGGING MODE PAGE CP/M MACRO ASSEM 2.0 #007 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;GENERAL CP/M SYSTEM EQUATES. ;============================ ; ;LOCATION DEFINITIONS ;-------------------- 0000 = WBOT EQU 0 ;WARM BOOT JUMP ADDRESS 0003 = IOBYTE EQU 3 ;IOBYTE LOCATION 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 0100 = TPA EQU 100H ;TRANSIENT MEMORY ;SIZE DEFINITIONS ;---------------- 0800 = CCPLN EQU 800H 0E00 = BDOSLN EQU 0E00H C000 = SIZE EQU (MSIZE*1024) IF ABSASM ;IF MAC AC00 = CBIOS EQU SIZE-(BIOSLN*100H) AC00 = BIOS EQU CBIOS 7500 = OFFSETC EQU 2100H-BIOS ;OFFSET FOR SYSGEN ENDIF ;SIZES OUTPUT FOR DEBUGGING PURPOSES ;----------------------------------- IF DEBUG DBGTMP SET OFFSETC ;DDT OFFSET ! DBGTMP SET CCP ;CCP ADDRESS ! DBGTMP SET BDOS ;BDOS ADDRESS ! DBGTMP SET BIOS ;CBIOS ADDRESS ! ENDIF ;MISC. CONSTANTS ;--------------- ; 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR PAGE CP/M MACRO ASSEM 2.0 #008 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;INTERNAL DISK SYSTEM EQUATES ;============================ ; ;HARD DISK SYSTEM EQUATES ;------------------------ ; 0000 = M10 EQU M10F OR M10M 0000 = FUJITSU EQU M20 OR M10F 0000 = HDSPT EQU 32*M26+21*M20+21*M10 ;SECTORS PER TRACK FOR HDCA 0009 = MWSPT EQU 9 ;SECTORS PER TRACK FOR HDDMA 0000 = HDLOG EQU M10*2+M20*3+M26*3 ;LOGICAL DISKS PER DRIVE FOR HDCA 0000 = MWLOG EQU ST506+ST412*2++CM5619*2 ;LOGICAL DISKS PER DRIVE FOR HDDMA 0004 = MAXLOG EQU (MAXHD*HDLOG)+(MAXMW*MWLOG)+MAXFD+MAXDM+MAXMF ;DISK SYSTEM ORDERING MACROS ;--------------------------- ; THE FOLLOWING MARCO IS USED IN GENERATING THE LOGICAL ORDER OF THE ; CP/M DRIVES. ; ORDER MACRO NUM IF NUM EQ HDORDER DW HDDST ENDIF IF NUM EQ MWORDER DW MWDST ENDIF IF NUM EQ FDORDER DW FDDST ENDIF IF NUM EQ DMORDER DW DMDST ENDIF IF NUM EQ MFORDER DW MFDST ENDIF ENDM PAGE CP/M MACRO ASSEM 2.0 #009 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;*********************************** ;BEGIN CBIOS EXECUTABLE CODE SECTION ;*********************************** ; THIS SECTION CONSISTS OF 3 ROUTINES ; 1) THE JUMP TABLE ; 2) WARM BOOT ROUTINE ; 3) GO CPM (EXECUTED DIRECTLY AFTER EVERY WARM/COLD BOOT) ; ;CBIOS JUMP TABLE ;---------------- ; THE JUMP TABLE BELOW MUST REMAIN IN THE SAME ORDER, THE ROUTINES ; MAY BE CHANGED, BUT THE FUNCTION EXECUTED MUST BE THE SAME. ; IF ABSASM ;MAC STUFF AC00 ORG BIOS ;CBIOS STARTING ADDRESS ELSE ;RMAC STUFF CSEG PUBLIC CODEND,SAVLN PUBLIC CBIOS,CCP,BDOS,BIOSLEN PUBLIC CBIOS,CBOOT,WBOOT,CONST,CONIN,CONOUT,LSTOUT PUBLIC HOME,SETDRV,SETTRK,SETSEC,SETDMA,READ,WRITE PUBLIC LSTOST,SECTRAN BIOSLN EQU -1 ;SUPPRESS ERRORS ENDIF CBIOS: ;LABEL FOR REFRENCING BASE OF CBIOS 9E00 = BDOS EQU CBIOS-BDOSLN 9600 = CCP EQU CBIOS-(BDOSLN+CCPLN) IF NOSTAND NE 0 CBLOCK EQU CBIOS-19H ;CURRENT ACTUAL BLOCK# * BLKMSK ENDIF ;USED FOR UNALLOCATED WRITTING ;BEGIN NORMAL CPM BIOS JUMP TABLE ;-------------------------------- AC00 C334B8 JMP CBOOT ;COLD BOOT ENTRY POINT AC03 C339AC WBOOTE: JMP WBOOT ;WARM BOOT ENTRY POINT AC06 C35FB6 JMP CONST ;CONSOLE STATUS ROUTINE AC09 C345B6 CIN: JMP CONIN ;CONSOLE INPUT AC0C C352B6 COUT: JMP CONOUT ;CONSOLE OUTPUT AC0F C34EB7 POUT: JMP LSTOUT ;LIST DEVICE OUTPUT IF (LSTTYP GE 2) AND (LSTTYP LE 5) ;HAS MULTIO OR WBIO JMP PUNOUT ;PUNCH DEVICE OUTPUT JMP RDRIN ;READER DEVICE INPUT IF NOT ABSASM ;IF RMAC PUBLIC PUNOUT,RDRIN ENDIF ELSE ;NOT MULTIO/WBIO AC12 C30CAC JMP COUT ;USER CONSOLE OUT AS PUNCH AC15 C309AC JMP CIN ;USE CONSOLE IN AS READER CP/M MACRO ASSEM 2.0 #010 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ENDIF AC18 C30CAD JMP HOME ;HOME DRIVE AC1B C31EAD JMP SETDRV ;SELECT DISK AC1E C381AD JMP SETTRK ;SET TRACK AC21 C387AD JMP SETSEC ;SET SECTOR AC24 C38DAD JMP SETDMA ;SET DMA ADDRESS AC27 C393AD JMP READ ;READ THE DISK AC2A C398AD JMP WRITE ;WRITE THE DISK AC2D C351B7 JMP LSTOST ;LIST DEVICE STATUS AC30 C317AE JMP SECTRAN ;SECTOR TRANSLATION ;THE FOLLOWING JUMPS ARE EXTENDED BIOS CALLS DEFINED BY MORROW DESIGNS ;--------------------------------------------------------------------- IF MAXFD NE 0 JMP FDSEL ;HOOKUP FOR SINGLE.COM PROGRAM ELSE AC33 C38CAD JMP DONOP ENDIF AC36 C30000 JMP 0 ;END OF THE JUMP TABLE PAGE CP/M MACRO ASSEM 2.0 #011 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;WARM BOOT ;========= ; 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. ; AC39 310001 WBOOT: LXI SP,TPA ;SET UP STACK POINTER AC3C 3E01 MVI A,1 AC3E 32A5AC STA CWFLG ;SET COLD/WARM BOOT FLAG AC41 2600 MVI H,WMDRIVE ;MOVE DRIVE TO WARM BOOT OFF OF INTO (H) AC43 2E00 MVI L,D$WBOOT ;PEFORM WARM BOOT OPERATION AC45 CDAFAE CALL JUMPER AC48 D250AC JNC GOCPM ;NO ERROR AC4B 76 HLT ;HALT COMPUTER AC4C 00 DB 0 AC4D C339AC JMP WBOOT ;IN CASE USER RESTARTS THE COMPUTER ;BEGIN EXECUTING CPM (GOCPM) ;=========================== ; 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). ; AC50 018000 GOCPM: LXI B,BUFF ;SET UP INITIAL DMA ADDRESS AC53 CD8DAD CALL SETDMA AC56 3EC3 MVI A,(JMP) ;INITIALIZE JUMP TO WARM BOOT AC58 320000 STA WBOT AC5B 320500 STA ENTRY ;INITIALIZE JUMP TO BDOS AC5E 2103AC LXI H,WBOOTE ;SET UP LOW MEMORY ENTRY TO CBIOS WARM BOOT AC61 220100 SHLD WBOT+1 AC64 21069E LXI H,BDOS+6 ;SET UP LOW MEMORY ENTRY TO BDOS AC67 220600 SHLD ENTRY+1 AC6A AF XRA A ;A <- 0 AC6B 323EB6 STA BUFSEC ;SET BUFFER TO UNKNOWN STATE AC6E 324DAE STA BUFWRTN ;SET BUFFER NOT DIRTY FLAG AC71 323AB6 STA ERROR ;CLEAR BUFFER ERROR FLAG AC74 3AA5AC LDA CWFLG ;GET COLD/WARM BOOT FLAG AC77 B7 ORA A AC78 21A9AC LXI H,COLDMES ;POINTER TO INITIAL COLD COMMAND AC7B CA81AC JZ CLDCMND AC7E 21ABAC LXI H,WARMES ;POINTER TO INITIAL WARM COMMAND AC81 5E CLDCMND:MOV E,M ;DO ONE LEVEL OF INDIRECTION AC82 23 INX H AC83 56 MOV D,M AC84 1A LDAX D ;GET COMMAND LENGTH AC85 3C INR A ;BUMP LENGTH TO INCLUDE LENGTH BYTE ITSELF AC86 210796 LXI H,CCP+7 ;COMMAND BUFFER (INCLUDES LENGTH BYTE) AC89 4F MOV C,A ;SET UP FOR BLOCK MOVE AC8A 0600 MVI B,0 AC8C CDD5AE CALL MOVBYT ;MOVE COMMAND TO INTERNAL CCP BUFFER CP/M MACRO ASSEM 2.0 #012 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs AC8F 3AA5AC LDA CWFLG ;FIGURE OUT WHETHER OR NOT TO SEND MESSAGE AC92 B7 ORA A AC93 3AA8AC LDA AUTOFLG AC96 CA9AAC JZ CLDBOT AC99 1F RAR AC9A 1F CLDBOT: RAR AC9B 3A0400 LDA CDISK ;JUMP TO CP/M WITH CURRENTLY SELECTED DISK IN C AC9E 4F MOV C,A AC9F DA0096 JC CCP ;ENTER CP/M, SEND MESSAGE ACA2 C30396 JMP CCP+3 ;ENTER CP/M, NO MESSAGE ACA5 00 CWFLG: DB 0 ;COLD/WARM BOOT FLAG PAGE CP/M MACRO ASSEM 2.0 #013 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;*************** ;MISC. DATA AREA ;*************** ; THE FOLLOWING AREA IS A HODGE-PODGE OF POINTERS, CONSTANTS AND ; REVISION LABELS. ; ;AUTO START ;========== ; 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. ; ACA6 00 AUTOST: DB 0 ;REVISION 0 STRUCTURE ACA7 59 DB 100H - (LOW ($ - CBIOS)) ;THE REST OF THE PAGE IS USED FOR THIS STUFF ACA8 00 AUTOFLG:DB 0 ;AUTO COMMAND FEATURE ENABLE FLAG ACA9 ADAC COLDMES:DW COLDCM ;POINTER TO THE COLD START COMMAND ACAB AEAC WARMES: DW WARMCM ;POINTER TO THE WARM START COMMAND ;DEFINE THE AUTO 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. ; ACAD 01 COLDCM: DB COLDEND-COLDCM ;LENGTH OF COLD BOOT COMMAND DB '' ;COLD BOOT COMMAND GOES HERE ACAE = COLDEND EQU $ ACAE 01 WARMCM: DB WARMEND-WARMCM ;LENGTH OF WARM BOOT COMMAND DB '' ;WARM BOOT COMMAND GOES HERE ACAF = WARMEND EQU $ PAGE CP/M MACRO ASSEM 2.0 #014 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;CBIOS CONFIGURATION DATA ;======================== ; ;POINTER TO THE DRIVE CONFIGURATION TABLE. ;----------------------------------------- ; ACAF 00 DRCONF: DB 0 ;REVISION 0 STRUCTURE ACB0 20 DB 32 ;32 BYTES LONG NOW ;POINTER TO DEVICE SPECIFICATION TABLES ;-------------------------------------- ; THIS MACRO GENERATES A TABLE OF POINTERS TO THE START OF EACH ACTIVE ; DISK DRIVER'S DISPATCH TABLE. THE ORDER OF THIS TABLE DEFINES THE ; LOGICAL ORDER OF THE CP/M DRIVES. ; ACB1 = DSTTAB EQU $ 0001 # DN SET 1 REPT 16 ORDER %DN DN SET DN+1 ENDM ACB1+A1AF DW DMDST ACB3+3BB1 DW MFDST ;I/O CONFIGURATION TABLE. ;------------------------ ; 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 ; CP/M MACRO ASSEM 2.0 #015 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; ;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. ; ; 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. ; ; 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. ; ACB5 02 IOCONF: DB 2 ;REVISION 2 STRUCTURE ACB6 0B DB 11 ;11 BYTES LONG NOW ACB7 06 DB CONTYP ;CONSOLE DEVICE DRIVER NUMBER ACB8 01 DB LSTTYP ;LIST DEVICE DRIVE NUMBER ACB9 00 IOBYT: DB 00000000B ;INITIAL IOBYT VALUE (ALL DEVICES GO TO CON:) ACBA 00 GROUP: DB 0 ;GROUP BYTE IF NOT ABSASM ;IF RMAC PUBLIC GROUP ENDIF ACBB 0C00 DEFCON: DW CBAUD ;CONSOLE BAUD RATE DIVISOR VALUE ACBD 6000 DEFLST: DW LBAUD ;PRINTER BAUD RATE DIVISOR VALUE ;CLEAR TO SEND PROTOCOL IF LSTTYP EQ 3 LSTAND: DB CTS ;SERIAL LIST HANDSHAKE MASK LSTXOR: DB 0 ;SERIAL LIST INVERSION FLAG ENDIF ;DATA SET READY PROTOCOL IF LSTTYP EQ 4 LSTAND: DB DSR ;SERIAL LIST HANDSHAKE MASK LSTXOR: DB 0 ;SERIAL LIST INVERSION FLAG ENDIF CP/M MACRO ASSEM 2.0 #016 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;XON/XOFF PROTOCOL IF (LSTTYP NE 3) AND (LSTTYP NE 4) ACBF 00 LSTAND: DB 0 ;SERIAL LIST HANDSHAKE MASK ACC0 FF LSTXOR: DB 0FFH ;SERIAL LIST INVERSION FLAG ENDIF ACC1 11 LASTCH: DB XON ;LAST CHARACTER RECIEVED FROM THE PRINTER PAGE CP/M MACRO ASSEM 2.0 #017 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;CONFIGURATION POINTER TABLE ;=========================== ; 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 ($ - CBIOS) GT 256 ;TEST FOR CODE OVERLAP 'Fatal error, pointer table placement.' ELSE ACC2 DS 100H - (LOW ($ - CBIOS)) ;START AT A PAGE BOUNDRY ENDIF ;BPAGE IS FILLED-IN AT RUN-TIME BY INIT AD00 00 BPAGE: DB 0 ;CBIOS PAGE NUMBER AD01 36 DB REVNUM ;CBIOS REVISION NUMBER AD02 AFAC DW DRCONF ;DRIVE CONFIGURATION TABLE POINTER AD04 B5AC DW IOCONF ;I/O CONFIGURATION TABLE POINTER IF (MAXDM NE 0) OR (MAXMF NE 0) AD06 3FAF DW DMARAP ;DRIVE PARAMETER TABLE POINTER FOR DJDMA ELSE DW 0 ENDIF AD08 A6AC DW AUTOST ;AUTO COMMAND STRUCTURE POINTER AD0A 0000 DW 0 ;END OF TABLE MARKER PAGE CP/M MACRO ASSEM 2.0 #018 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;************************ ;BEGIN BIOS DISK ROUTINES ;************************ ; ;HOME THE DISK (HOME) ;==================== ; HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. ; AD0C 3A4DAE HOME: LDA BUFWRTN ;TEST BUFFER DIRTY FLAG AD0F B7 ORA A AD10 C217AD JNZ DOHOME ;SKIP BUFFER DISABLE IF BUFFER DIRTY AD13 AF XRA A ;INVALIDATE BUFFER ON HOME CALL AD14 323EB6 STA BUFSEC AD17 010000 DOHOME: LXI B,0 ;TRACK TO SEEK TO AD1A CD81AD CALL SETTRK AD1D C9 RET ;SELECT A DISK DIRVE (SELDSK) ;============================ ; 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. ; AD1E 79 SETDRV: MOV A,C ;SAVE THE LOGICAL DRIVE NUMBER AD1F 3235B6 STA CPMDRV AD22 FE04 CPI MAXLOG ;CHECK FOR A VALID DRIVE NUMBER AD24 D2F8AE JNC ZRET ;ILLEGAL DRIVE AD27 7B MOV A,E ;CHECK IF BIT 0 OF (E) = 1 AD28 E601 ANI 1 AD2A C262AD JNZ SETD3 ;DRIVE HAS ALLREADY BEEN ACCESSED AD2D 61 MOV H,C ;MOVE LOGICAL DRIVE INTO (H) AD2E 2E02 MVI L,D$SEL1 AD30 CDAFAE CALL JUMPER ;CALL LOW LEVEL DRIVE SELECT AD33 7C MOV A,H ;CHECK IF THE LOW LEVEL DRIVE SELECT RETURNED AD34 B5 ORA L ;ZERO TO INDICATE AN ERROR AD35 CAF8AE JZ ZRET ;YES, AN ERROR SO REPORT TO CP/M AD38 E5 PUSH H ;SAVE DPH ADDRESS AD39 CD74AD CALL GDPH ;GET ENTRY IF DPH SAVE TABLE AD3C D1 POP D ;DPH -> (DE) AD3D 73 MOV M,E ;PUT ADDRESS OF DPH IN TABLE AD3E 23 INX H AD3F 72 MOV M,D AD40 23 INX H AD41 71 MOV M,C ;PUT SECTOR SIZE IN TABLE AD42 23 INX H AD43 7E MOV A,M ;CHECK IF BAD MAP HAS EVER BEEN READ FOR THIS AD44 B7 ORA A ; DRIVE CP/M MACRO ASSEM 2.0 #019 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs AD45 CC21AF CZ GETBAD ;NEVER BEEN READ SO READ IN BAD MAP AD48 EB XCHG ;DPH -> (HL) AD49 79 SETD0: MOV A,C ;MOVE SECTOR SIZE CODE INTO (A) AD4A 32A6AD STA SECSIZ ;SAVE SECTOR SIZE AD4D AF XRA A AD4E 0D SETD1: DCR C ;CREATE NUMBER OF (128 BYTES/PHYSICAL SECTOR)-1 AD4F CA58AD JZ SETD2 AD52 07 RLC AD53 F601 ORI 1 AD55 C34EAD JMP SETD1 AD58 32E4AD SETD2: STA SECPSEC ;SAVE FOR DEBLOCKING AD5B 3A35B6 LDA CPMDRV ;SAVE CURRENT DRIVE AS OLD DRIVE AD5E 3244B6 STA LASTDRV ; IN CASE OF SELECT ERRORS AD61 C9 RET AD62 61 SETD3: MOV H,C ;DRIVE IN (H) AD63 2E03 MVI L,D$SEL2 ;SELECT DRIVE AD65 CDAFAE CALL JUMPER AD68 CD74AD CALL GDPH ;QUICK SELECT AD6B 5E MOV E,M ;DPH -> (DE) AD6C 23 INX H AD6D 56 MOV D,M AD6E 23 INX H AD6F 4E MOV C,M ;SECTOR SIZE -> (C) AD70 EB XCHG ;DPH -> (HL) AD71 C349AD JMP SETD0 ;RETURN A POINTER TO THE CURRENT DRIVE'S DPH ;------------------------------------------- ; 1) THIS ROUTINE IS ONLY CALLED BY SETDRV. ; 2) THE DRIVE NUMBER SHOULD BE IN LOCATION CPMDRV. THE DE REGISTER ; PAIR IS DESTROYED. THE DPH POINTER IS RETURNED IN THE HL ; REGISTER PAIR ; ; AD74 3A35B6 GDPH: LDA CPMDRV ;RETURN POINTER TO DPH SAVE AREA AD77 07 RLC ;EACH ENTRY IS 4 BYTES LONG AD78 07 RLC AD79 5F MOV E,A AD7A 1600 MVI D,0 AD7C 212FAF LXI H,DPHTAB ;DPH SAVE AREA TABLE AD7F 19 DAD D ;ADD OFFSET AD80 C9 RET ;(HL) = DPH SAVE AREA FOR CURRENT DRIVE ;SELECT A TRACK (SELTRK) ;======================= ; SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT THIS ; POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. ; AD81 60 SETTRK: MOV H,B ;ENTER WITH TRACK NUMBER IN (BC) AD82 69 MOV L,C AD83 2236B6 SHLD CPMTRK AD86 C9 RET ;SELECT A SECTOR (SETSEC) CP/M MACRO ASSEM 2.0 #020 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;======================== ; SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN ; ACTUAL READ OR WRITE IS ATTEMPTED. ; AD87 60 SETSEC: MOV H,B ;ENTER WITH SECTOR NUMBER IN (BC) AD88 69 MOV L,C AD89 2233B6 SHLD CPMSEC AD8C C9 DONOP: RET ;SET THE DMA ADDRESS (SETDMA) ;============================ ; SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. ; AD8D 60 SETDMA: MOV H,B ;ENTER WITH DMA ADDRESS IN (BC) AD8E 69 MOV L,C AD8F 22F5AD SHLD CPMDMA ;CP/M DMA ADDRESS AD92 C9 RET ;READ DATA FROM A DISK (READ) ;============================ ; 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. ; AD93 AF READ: XRA A ;SET THE COMMAND TYPE TO READ IF NOSTAND NE 0 STA UNALOC ;CLEAR UNALLOCATED WRITE FLAG ENDIF AD94 CDA2AD CALL RWENT AD97 C9 RET ;WRITE DATA TO A DISK (WRITE) ;============================ ; 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. ; AD98 79 WRITE: MOV A,C ;SAVE WRITE COMMAND TYPE AD99 320EAE STA WRITTYP AD9C 3E01 MVI A,1 ;SET WRITE COMMAND AD9E CDA2AD CALL RWENT ADA1 C9 RET ;READ/WRITE TO/FROM THE DISK ;--------------------------- ; 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 CP/M MACRO ASSEM 2.0 #021 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR READ ; FROM THE DISK. ; IF NOT ABSASM ;IF RMAC PUBLIC RWENT,FILL,FLUSH,PREP,JUMPER ENDIF ADA2 32F8AD RWENT: STA RDWR ;SAVE COMMAND TYPE ADA5 0600 MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN THE LOG2 ADA6 = SECSIZ EQU $-1 ; OF THE PHYSICAL SECTOR SIZE/128 ; ON THE CURRENTLY SELECTED DISK ADA7 2A33B6 LHLD CPMSEC ;GET THE DESIRED CP/M SECTOR # ADAA 7C MOV A,H ADAB E680 ANI 80H ;SAVE ONLY THE SIDE BIT ADAD 4F MOV C,A ;REMEMBER THE SIDE ADAE 7C MOV A,H ADAF E67F ANI 7FH ;FORGET THE SIDE BIT ADB1 67 MOV H,A ADB2 2B DCX H ;TEMPORARY ADJUSTMENT ADB3 05 DIVLOOP:DCR B ;UPDATE REPEAT COUNT ADB4 CAC1AD JZ DIVDONE ADB7 B7 ORA A ADB8 7C MOV A,H ADB9 1F RAR ADBA 67 MOV H,A ADBB 7D MOV A,L ADBC 1F RAR ;DIVIDE THE CP/M SECTOR # BY THE SIZE ADBD 6F MOV L,A ; OF THE PHYSICAL SECTORS ADBE C3B3AD JMP DIVLOOP ADC1 23 DIVDONE:INX H ADC2 7C MOV A,H ADC3 B1 ORA C ;RESTORE THE SIDE BIT ADC4 67 MOV H,A ADC5 2238B6 SHLD TRUESEC ;SAVE THE PHYSICAL SECTOR NUMBER ADC8 2135B6 LXI H,CPMDRV ;POINTER TO DESIRED DRIVE,TRACK, AND SECTOR ADCB 113BB6 LXI D,BUFDRV ;POINTER TO BUFFER DRIVE,TRACK, AND SECTOR ADCE 0606 MVI B,6 ;COUNT LOOP ADD0 05 DTSLOP: DCR B ;TEST IF DONE WITH COMPARE ADD1 CADFAD JZ MOVE ;YES, MATCH. GO MOVE THE DATA ADD4 1A LDAX D ;GET A BYTE TO COMPARE ADD5 BE CMP M ;TEST FOR MATCH ADD6 23 INX H ;BUMP POINTERS TO NEXT DATA ITEM ADD7 13 INX D ADD8 CAD0AD JZ DTSLOP ;MATCH, CONTINUE TESTING ;IF DRIVE, TRACK, AND SECTOR DON'T MATCH, FLUSH THE BUFFER IF ;NECESSARY AND THEN REFILL. ADDB CD21AE CALL FILL ;FILL THE BUFFER WITH CORRECT PHYSICAL SECTOR ADDE D8 RC ;NO GOOD, RETURN WITH ERROR INDICATION ;MOVE HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO OR OUT ;THE BUFFER. ADDF 3A33B6 MOVE: LDA CPMSEC ;GET THE CP/M SECTOR TO TRANSFER ADE2 3D DCR A ;ADJUST TO PROPER SECTOR IN BUFFER ADE3 E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS CP/M MACRO ASSEM 2.0 #022 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ADE4 = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL SECTORS ADE5 6F MOV L,A ;PUT INTO HL ADE6 2600 MVI H,0 ADE8 29 DAD H ;FORM OFFSET INTO BUFFER ADE9 29 DAD H ADEA 29 DAD H ADEB 29 DAD H ADEC 29 DAD H ADED 29 DAD H ADEE 29 DAD H ADEF 11CEB7 LXI D,BUFFER ;STARTING ADDRESS OF BUFFER ADF2 19 DAD D ;FORM BEGINNING ADDRESS OF SECTGR TO TRANSFER ADF3 EB XCHG ;DE = ADDRESS IN BUFFER ADF4 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS MODIFIED T/ ADF5 = CPMDMA EQU $-2 ; CONTAIN THE DMA ADDRESS ADF7 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO CONTAIN ADF8 = RDWR EQU $-1 ; A ZERO IF A READ, OR A 1 IF WRITE ADF9 A7 ANA A ;TEST WHICH KIND OF OPERATION ADFA C204AE JNZ INTO ;TRANSFER DATA INTO THE BUFFER ADFD CDD2AE OUTOF: CALL MOV128 AE00 3A3AB6 LDA ERROR ;GET THE BUFFER ERROR FLAG AE03 C9 RET AE04 EB INTO: XCHG ; AE05 CDD2AE CALL MOV128 ;MOVE THE DATA, HL = DESTINATION AE08 3E01 MVI A,1 ; DE = SOURCE AE0A 324DAE STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG AE0D 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE AE0E = WRITTYP EQU $-1 AE0F 3D DCR A ;TEST FOR A DIRECTORY WRITE (A=1=DIR) AE10 3E00 MVI A,0 AE12 C0 RNZ ; IF NOT DIR THEN EXIT (A=0=NO-ERROR) AE13 CD4CAE CALL FLUSH ;FLUSH THE BUFFER IF THIS IS A DIR OPER AE16 C9 RET ;(ACCM IS SETUP BY THE ROUTINE PREP) ;PERFORM SECTOR TRANSLATION (SECTRAN) ;==================================== ;SECTRAN TRANSLATES A LOGICAL SECTOR NUMBER INTO A PHYSICAL ; SECTOR NUMBER. ; AE17 3A35B6 SECTRAN:LDA CPMDRV ;GET THE DRIVE NUMBER AE1A 67 MOV H,A ;DRIVE IN (H) AE1B 2E01 MVI L,D$STRAN AE1D CDAFAE CALL JUMPER ;SEE DEVICE LEVEL SECTOR TRANSLATION ROUTINES AE20 C9 RET PAGE CP/M MACRO ASSEM 2.0 #023 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;BEGIN CBIOS DISK ROUTINE UTILITIES ;================================== ; THESE ARE GENERAL PURPOSE ROUTINES THAT ARE USED BY BY ONE OR MORE ; OF THE PRECEEDING CBIOS DISK ROUTINES AND/OR THE LO_LEVEL DRIVERS. ; ;FILL THE BUFFER WITH A NEW SECTOR ;--------------------------------- ; FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. IF ; WERE NO ERRORS THEN THE CARRY IS RETURNED CLEARED ELSE IT IS ; SET. ; AE21 CD4CAE FILL: CALL FLUSH ;FLUSH BUFFER FIRST AE24 D8 RC ;(CARRY IS SET IF THERE WERE ANY ERRORS) AE25 1135B6 LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, AND SECTOR AE28 213BB6 LXI H,BUFDRV AE2B 010500 LXI B,5 ;NUMBER OF BYTES TO MOVE AE2E CDD5AE CALL MOVBYT ;COPY THE DATA AE31 3AF8AD LDA RDWR ;TEST READ WRITE FLAG AE34 B7 ORA A AE35 CA43AE JZ FREAD ;SKIP WRITE TYPE CHECK IF READING AE38 3A0EAE LDA WRITTYP ;0 = ALLOC, 1 = DIR, 2 = UNALLOC IF NOSTAND NE 0 ;DO NON STANDARD (BUT QUICK AND DIRTY) CHECK ORA A ;(CLEARS THE CARRY) JNZ FNALOC ;SKIP IF NOT AN ALLOCATED WRITE LDA UNALOC ;CHECK UNALLOCATED WRITE IN PROGRESS FLAG ORA A ;(CLEARS THE CARRY FLAG) JZ FWRITIN ;WE ARE DOING AN ALLOCATED WRITE LHLD CBLOCK ;GET CURRENT BLOCK ADDRESS XCHG LHLD OBLOCK ; AND OLD BLOCK ADDRESS MOV A,D ;COMPARE OLD VERSUS NEW CMP H JNZ AWRITIN ;DIFFERENT, CLEAR UNALLOCATED WRITTING MODE MOV A,E CMP L JNZ AWRITIN LXI H,CPMDRV ;TEST FOR DIFFERENT DRIVE LDA UNADRV CMP M ;(RESET THE CARRY ON EQUAL) JNZ AWRITIN ;DRIVE IS DIFFERENT, CLEAR UNALLOCATED MODE RET ;UNALLOCATED WRITE (RETURN WITH CARRY=CLEAR) FNALOC: DCR A ;(DOESN'T AFFECT CARRY) JZ AWRITIN ;DO A DIRECTORY WRITE ;WE ARE NOW DOING AN UNALLOCATED WRITE LHLD CBLOCK ;SAVE CURRENT BLOCK NUMBER SHLD OBLOCK LDA CPMDRV ;SAVE DRIVE THAT THIS BLOCK BELONGS TO STA UNADRV CP/M MACRO ASSEM 2.0 #024 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs MVI A,1 ;SET UNALLOCATED WRITE FLAG STA UNALOC ; AND WE DO NOTHING ABOUT THE WRITE RET ;(CARRY CLEARED BY LAST ORA) AWRITIN:XRA A ;CLEAR UNALLOCATED WRITTING MODE STA UNALOC ELSE ;DO STANDARD UNALLOCATED TEST AE3B D602 SUI 2 ;TEST FOR AN UNALLOCATED WRITE AE3D C8 RZ ;(CARRY WILL BE CLEARED IF ZERO RESULT) ENDIF AE3E 3AA6AD FWRITIN:LDA SECSIZ ;CHECK FOR 128 BYTE SECTORS AE41 3D DCR A ;(DOESN'T AFFECT THE CARRY FLAG) AE42 C8 RZ ;NO DEBLOCKING (CARRY CLEARED BY LAST ORA) AE43 3E08 FREAD: MVI A,D$READ AE45 3286AE STA RWOP AE48 CD59AE CALL PREP ;READ THE PHYSICAL SECTOR THE BUFFER AE4B C9 RET ;(CARRY AND ACCM SET BY PREP) ;FLUSH THE DISK BUFFER ;--------------------- ; FLUSH WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK IF ; IT HAS EVER BEEN WRITTEN INTO. IF THERE ARE ANY ERRORS THEN ; THE CARRY IS RETURNED SET ELSE IT IS CLEARED. ; AE4C 3E00 FLUSH: MVI A,0 ;THE 0 IS MODIFIED TO REFLECT IF AE4D = BUFWRTN EQU $-1 ; THE BUFFER HAS BEEN WRITTEN INTO AE4E B7 ORA A ;TEST IF WRITTEN INTO AE4F C8 RZ ;NOT WRITTEN, ALL DONE (OR CLEARS THE CARRY) AE50 3E09 MVI A,D$WRITE AE52 3286AE STA RWOP AE55 CD59AE CALL PREP ;DO THE PHYSICAL WRITE AE58 C9 RET ;(CARRY AND ACCM SET BY PREP) ;PREPARE THE DISK FOR READING AND/OR WRITING ;------------------------------------------- ; 1) THIS IS ACTUALLY THE PLACE WHERE DISKS ARE READ/WRITTEN (CONTRARY ; TO THE NAME OF THIS ROUTINE) ; 2) PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE ATTEMPTED. ; IF THERE ARE ANY ERRORS THEN THE CARRY IS RETURNED ; SET AND THE LOCATION ERROR IS SET TO 0FFH, ELSE THE CARRY IS ; RETURNED CLEARED ERROR IS RESET TO ZERO. ; AE59 CD22AF PREP: CALL ALT ;CHECK FOR ALTERNATE SECTORS AE5C F3 DI ;RESET INTERRUPTS AE5D AF XRA A ;RESET BUFFER WRITTEN FLAG AE5E 324DAE STA BUFWRTN AE61 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES TO ATTEMPT AE63 C5 RETRYLP:PUSH B ;SAVE THE RETRY COUNT AE64 2E03 MVI L,D$SEL2 ;SELECT DRIVE AE66 CDABAE CALL JUMPBUF CP/M MACRO ASSEM 2.0 #025 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs AE69 2A40B6 LHLD ALTTRK ;TRACK NUMBER -> (HL) AE6C 44 MOV B,H AE6D 4D MOV C,L AE6E 2E05 MVI L,D$STRK AE70 CDABAE CALL JUMPBUF AE73 2A42B6 LHLD ALTSEC ;SECTOR -> (HL) AE76 44 MOV B,H AE77 4D MOV C,L AE78 2E06 MVI L,D$SSEC AE7A CDABAE CALL JUMPBUF AE7D 01CEB7 LXI B,BUFFER ;SET THE DMA ADDRESS AE80 2E07 MVI L,D$SDMA AE82 CDABAE CALL JUMPBUF AE85 2E00 MVI L,0 ;GET OPERATION ADDRESS OFFSET (8 OR 9) AE86 = RWOP EQU $-1 ;(SET BY FREAD [READ=8] AND FLUSH [WRITE=9]) AE87 CDABAE CALL JUMPBUF ;READ OR WRITE TO THE DISK AE8A C1 POP B ;RESTORE THE RETRY COUNTER AE8B 3E00 MVI A,0 ;NO ERROR EXIT STATUS AE8D D2A7AE JNC PRPRET ;RETURN NO ERROR (ACCM=0, CARRY=CLEAR) AE90 05 DCR B ;UPDATE THE RETRY COUNTER AE91 37 STC ;ASSUME RETRY COUNT EXPIRED AE92 3EFF MVI A,0FFH ;ERROR RETURN AE94 CAA7AE JZ PRPRET ;RETURN ERROR (ACCM=FF, CARRY=SET) AE97 78 MOV A,B AE98 FE05 CPI RETRIES/2 AE9A C263AE JNZ RETRYLP ;TRY AGAIN AE9D C5 PUSH B ;SAVE RETRY COUNT AE9E 2E04 MVI L,D$HOME ;HOME DRIVE AFTER (RETRIES/2) ERRORS AEA0 CDABAE CALL JUMPBUF AEA3 C1 POP B AEA4 C363AE JMP RETRYLP ;TRY AGAIN AEA7 323AB6 PRPRET: STA ERROR ;SAVE THE ERROR FLAG AEAA C9 RET ;ACCESS A LO-LEVEL DRIVER SUBROUTINE ;----------------------------------- ; 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. ; ;ENTRY POINT_1 AEAB 3A3BB6 JUMPBUF:LDA BUFDRV ;DISPATCH WITH BUFDRV FOR DRIVE AEAE 67 MOV H,A ;ENTRY POINT_2 CP/M MACRO ASSEM 2.0 #026 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs AEAF D5 JUMPER: PUSH D AEB0 C5 PUSH B AEB1 E5 PUSH H AEB2 7C MOV A,H ;LOGICAL DRIVE INTO (A) AEB3 11B1AC LXI D,DSTTAB ;DRIVE SPECIFICATION POINTER TABLE AEB6 4F JUMPL: MOV C,A ;SAVE LOGICAL IN (C) AEB7 1A LDAX D AEB8 6F MOV L,A AEB9 13 INX D AEBA 1A LDAX D AEBB 67 MOV H,A ;GET A DST POINTER IN (HL) AEBC 13 INX D AEBD 79 MOV A,C ;LOGICAL IN (A) AEBE 96 SUB M ;SUBTRACT FROM FIRST ENTRY IN DST AEBF D2B6AE JNC JUMPL ;KEEP SCANNING TABLE TILL CORRECT DRIVER FOUND AEC2 23 INX H ;BUMP (HL) TO POINT TO START OF DISPATCH TABLE AEC3 D1 POP D ;REAL (HL) -> (DE) AEC4 7B MOV A,E ;MOVE OFFSET NUMBER INTO (A) AEC5 07 RLC ;EACH ENTRY IS 2 BYTES AEC6 5F MOV E,A ;MAKE AN OFFSET AEC7 1600 MVI D,0 AEC9 19 DAD D ;(HL) = **ROUTINE AECA 7E MOV A,M ;PICK UP ADDRESS OF HANDLER FOR SELECTED AECB 23 INX H ; FUNCTION AECC 66 MOV H,M AECD 6F MOV L,A ;(HL) = *ROUTINE AECE 79 MOV A,C ;LOGICAL IN (A) AECF C1 POP B ;RESTORE SAVED REGISTERS AED0 D1 POP D AED1 E9 PCHL ;MOVE DATA ;--------- ; 1) THE ENTRY POINT MOV128 FORCES 128 BYTES OF DATA TO BE MOVED ; FROM SOURCE TO DESTINATION. ; 2) THE SECOND ENTRY POINT (MOVBYT) CAN MOVE UPTO 65K OF DATA. ; 3) THE SOURCE POINTER IS PASSED IN THE DE REGISTER PAIR. ; 4) THE DESTINATION POINTER IS PASSED IN THE HL REGISTER PAIR. ; ;ENTRY POINT_1 AED2 018000 MOV128: LXI B,128 ;LENGTH OF TRANSFER ;ENTRY POINT_2 AED5 AF MOVBYT: XRA A ;CHECK IF HOST PROCESSOR IS A Z80 AED6 C603 ADI 3 AED8 E2E6AE JPO Z80MOV ;YES, ITS A Z80 SO USE BLOCK MOVE AEDB 1A M8080: LDAX D ;GET A BYTE OF SOURCE AEDC 77 MOV M,A ;MOVE IT AEDD 13 INX D ;BUMP POINTERS AEDE 23 INX H AEDF 0B DCX B ;UPDATE COUNTER AEE0 78 MOV A,B ;TEST FOR END AEE1 B1 ORA C AEE2 C2DBAE JNZ M8080 CP/M MACRO ASSEM 2.0 #027 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs AEE5 C9 RET AEE6 EB Z80MOV: XCHG ;SOURCE IN (HL), DESTINATION IN (DE) AEE7 EDB0 DW 0B0EDH ;LDIR AEE9 EB XCHG AEEA C9 RET ;PRINT A MESSAGE ;--------------- ;UTILITY ROUTINE TO OUTPUT THE MESSAGE POINTED AT BY (HL) ;TERMINATED WITH A NULL. ; AEEB 7E MESSAGE:MOV A,M ;GET A CHARACTER OF THE MESSAGE AEEC 23 INX H ;BUMP TEXT POINTER AEED B7 ORA A ;TEST FOR END AEEE C8 RZ ;RETURN IF DONE AEEF E5 PUSH H ;SAVE POINTER TO TEXT AEF0 4F MOV C,A ;OUTPUT CHARACTER IN C AEF1 CD0CAC CALL COUT ;OUTPUT THE CHARACTER AEF4 E1 POP H ;RESTORE THE POINTER AEF5 C3EBAE JMP MESSAGE ;CONTINUE UNTIL NULL REACHED ;DRIVE SELECT ERROR RETURN ;------------------------- ; 1) THIS ROUTINE SETS THE HL PAIR TO ZERO (THE SEL-DRIVE ERROR ; RETURN CONDITION) AND UPDATES THE VALUE OF CDISK. NOTICE THAT ; THIS ROUTINE IS CALLED FROM BOTH THE HIGH LEVEL SELECT ROUTINE ; (SETDRV) AND FROM THE LO-LEVEL ROUTINES AS WELL (E.G. MFLDR1 ; IN THE DJDMA DRIVERS). TO STOP INFINITE SELECT ERROR LOOPS BY THE ; CCP, CDISK IS MODIFIED IF IT SPECIFIES THE DISK IN ERROR. ; AEF8 210000 ZRET: LXI H,0 ;SELDRV ERROR EXIT AEFB 3A0400 LDA CDISK AEFE E60F ANI 15 ;ISOLATE 'CCP' CURR DISK (STRIP USER NUM) AF00 4F MOV C,A AF01 3A35B6 LDA CPMDRV ;GET CURR SELECTED DRIVE AF04 B9 CMP C AF05 C0 RNZ ;EXIT IF NOT 'CCP' SELECT ERROR AF06 3A44B6 LDA LASTDRV ;GET LAST VALID SELECTED DRIVE AF09 4F MOV C,A AF0A 3A0400 LDA CDISK ;PICK UP USER/DRIVE AF0D E6F0 ANI 0F0H ;SAVE USER NUMBER AF0F B1 ORA C ;PUT TOGETHER WITH OLD VALID DRIVE AF10 320400 STA CDISK ;SET NEW DEFAULT DISK FOR 'CCP' AF13 C9 RET ;NO BAD MAP ;---------- ; THIS ROUTINE IS USED BY THE LO-LEVEL DRIVERS TO INDICATE THAT ; THE SELECTED DEVICE HAS NO BAD MAP. ; AF14 210000 NOBAD: LXI H,0 ;USED BY DEVICE DRIVES TO INDICATE NO BAD AF17 C9 RET ; SECTOR MAP ;RETURN DPH POINTER ;------------------ CP/M MACRO ASSEM 2.0 #028 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; ENTER WITH (DE) WITH DPH BASE ADDRESS AND (A) WITH LOGICAL ; DRIVE NUMBER. RETURNS WITH DPH ADDRESS IN (HL). ; AF18 6F RETDPH: MOV L,A ;MOVE LOGICAL DRIVE INTO (L) AF19 2600 MVI H,0 AF1B 29 DAD H ;MULTIPLY BY 16 (SIZE OF DPH) AF1C 29 DAD H AF1D 29 DAD H AF1E 29 DAD H AF1F 19 DAD D ;(HL) = POINTER TO DPH AF20 C9 RET PAGE CP/M MACRO ASSEM 2.0 #029 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;CBIOS BAD MAP ROUTINES (ONLY FOR HDDMA) ;======================================= ; ;NULL ROUTINES IF NO HDDMA ;------------------------- ; IF MAXMW EQ 0 ;IF NO HDDMA ; AF21 C9 GETBAD: RET ;NO BAD MAP TO READ FROM DISK ; AF22 2A3CB6 ALT: LHLD BUFTRK ;NO ALTERNATE SECTOR SO USE SELECTED SECTOR AF25 2240B6 SHLD ALTTRK AF28 2A3EB6 LHLD BUFSEC AF2B 2242B6 SHLD ALTSEC AF2E C9 RET ; ELSE ;HAVE A HDDMA ;CHECK IF A DEVICE HAS A BAD MAP ;------------------------------- ; 1) THIS ROUTINE IS ONLY CALLED BY SETDRV ; 2) IF THE DEVICE HAS A BAD SECTOR MAP THEN APPEND BAD ENTRIES TO END ; OF BADMAP TABLE. ; 3) THIS ROUTINE IS ONLY REQUIRED FOR HDDMA. ; GETBAD: MVI M,1 ;SET DRIVE INITILIZED PUSH B PUSH D LDA CPMDRV ;PICK UP CURRENT DRIVE MOV H,A ;CALL DRIVE ROUTINE TO RETURN A POINTER TO MVI L,D$BAD ;THE TRACK AND SECTOR OF THE BAD MAP CALL JUMPER MOV A,H ;IF ROUTINE RETURNS 0 THEN THE DEVICE HAS ORA L ; NO BAD SECTOR MAP JZ BADRET MOV E,M ;PICK UP TRACK NUMBER OF BAD SECTOR MAP -> (DE) INX H MOV D,M INX H XCHG SHLD CPMTRK XCHG MOV A,M ;PICK UP SECTOR NUMBER OF OF BAD SECTOR MAP INX H MOV H,M MOV L,A SHLD TRUESEC CALL FILL ;READ IN BAD SECTOR MAP INTO THE BUFFER RC LHLD BADPTR ;PICK UP BAD MAP POINTER LXI D,BUFFER ;START AT BEGINNING OF BUFFER BADL: LDAX D ;PICK UP AN ENTRY FROM THE BUFFER CP/M MACRO ASSEM 2.0 #030 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ORA A JZ BADE ;ALL DONE MOV A,M ;PICK UP ENTRY FROM BAD MAP TABLE INR A JZ OVERFLO ;BAD MAP OVERFLOW LDA CPMDRV ;PUT DRIVE IN TABLE MOV M,A INX H LXI B,8 CALL MOVBYT ;MOVE THE REST OF INFORMATION INTO THE TABLE JMP BADL BADE: SHLD BADPTR ;RESTORE NEW BAD MAP POINTER BADRET: POP D POP B RET OVERFLO:LXI H,OMES CALL MESSAGE JMP BADRET ;CHECK FOR ALTERNATE SECTORS IN BAD SECTOR TABLE ;----------------------------------------------- ; 1) THIS ROUTINE IS ONLY CALLED BY PREP. ; 2) IF AN ALTERNATE SECTOR IS FOUND REPLACE ALTTRK AND ALTSEC WITH ; NEW SECTOR NUMBER ELSE PASS ALONG UNALTERED. ; ALT: LXI H,BADMAP ;ADDRESS OF BAD MAP -> (HL) LDA BUFDRV ;PICK UP DRIVE NUMBER CURRENTLY WORKING ON MOV C,A ;MOVE DRIVE INTO (C) FOR SPEED IN SEARCH ALL: XCHG LHLD BADPTR ;GET BAD MAP POINTER XCHG ; -> (DE) MOV A,D ;CHECK IF AT END OF BAD MAP TABLE CMP H JNZ ALT2 ;STILL MORE MOV A,E CMP L JNZ ALT2 ;STILL MORE LHLD BUFTRK ;NO ALTERNATE SECTOR SO USE SELECTED SECTOR SHLD ALTTRK LHLD BUFSEC SHLD ALTSEC RET ALT2: PUSH H ;SAVE CURRENT BAD MAP ENTRY ADDRESS MOV A,C ;MOVE DRIVE INTO (A) CMP M ;CHECK IF DRIVE IN TABLE MATCHES JNZ ALTMIS ;DOES NOT MATCH SKIP THIS ENTRY INX H ;POINT TO LSB OF ALTERNATE TRACK LDA BUFTRK ;PICK UP LSB OF BUFFER TRACK CMP M JNZ ALTMIS INX H ;POINT TO MSB ALTERNATE TRACK LDA BUFTRK+1 ;PICK UP MSB OF BUFFER TRACK CMP M CP/M MACRO ASSEM 2.0 #031 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs JNZ ALTMIS INX H ;POINT TO LSB OF ALTERNATE SECTOR LDA BUFSEC ;PICK UP LSB OF BUFFER SECTOR CMP M JNZ ALTMIS INX H ;POINT TO MSB OF ALTERNATE SECTOR LDA BUFSEC+1 ;PICK UP MSB OF BUFFER SECTOR CMP M JNZ ALTMIS ;FOUND AN ALTERNATE SECTOR INX H ;POINT TO REAL INFO ON THE ALTERNATE SECTOR LXI D,ALTTRK XCHG ;MOVLOP (DE) = SOURCE, (HL) = DEST PUSH B LXI B,4 CALL MOVBYT ;MOVE ALTERNATE SECTOR INFO IN CORRECT PLACE POP B POP H RET ALTMIS: POP H ;CURRENT ALTERNATE DID NOT MATCH LXI D,9 ;BUMP POINTER BY THE LENGTH OF AN ENTRY DAD D JMP ALL ;LOOP FOR MORE ;BAD MAP ROUTINES DATA AREAS ;--------------------------- ; OMES: DB 0DH, 0AH, 'BAD MAP OVERFLOW!', 0DH, 0AH, 0 BADPTR: DW BADMAP ;POINTER TO NEXT AVAILABLE BAD MAP ENTRY ENDIF ;END OF BAD MAP ROUTINES PAGE CP/M MACRO ASSEM 2.0 #032 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;CBIOS DISK ROUTINES DATA AREA ;============================= ; ;DPH SAVE AREA ;------------- ; 1) 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, 4=1024) ; 3 - BAD MAP HAS BEEN INITILIZED (0 = UNINITILIZED) ; DPHTAB: REPT MAXLOG*4 DB 0 ENDM AF2F+00 DB 0 AF30+00 DB 0 AF31+00 DB 0 AF32+00 DB 0 AF33+00 DB 0 AF34+00 DB 0 AF35+00 DB 0 AF36+00 DB 0 AF37+00 DB 0 AF38+00 DB 0 AF39+00 DB 0 AF3A+00 DB 0 AF3B+00 DB 0 AF3C+00 DB 0 AF3D+00 DB 0 AF3E+00 DB 0 PAGE CP/M MACRO ASSEM 2.0 #033 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;************************** ;BEGIN DISK DRIVER ROUTINES ;************************** ; ;GENERAL EQUATES AND MACROS ;========================== ; ;DISK SYSTEM DISPATCH TABLE OFFSETS ;---------------------------------- ; 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 ;DISK SYSTEM DPB GENERATION MACROS ;--------------------------------- ; 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 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 CP/M MACRO ASSEM 2.0 #034 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs CSV&NAM&LOG: DS CS ALV&NAM&LOG: DS AL ENDM PAGE CP/M MACRO ASSEM 2.0 #035 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF (MAXDM NE 0) OR (MAXMF NE 0) ;DJDMA PRESENT? ;************************************************************** ;BEGIN THE DJDMA DRIVER (DDRV1) ;****************************** ; ;STEP RATE TABLES ;================ ; 1) THE FOLLOWING TABLE ARE DRIVE PARAMETERS FOR DRIVES CONNECTED TO ; THE DJDMA FLOPPY DISK CONTROLLER. THERE IS ONE ENTRY FOR EACH OF ; THE THE EIGHT DRIVE THAT THE CONTROLLER CAN ADDRESS. THE FIRST ; FOUR ENTRIES ARE FOR THE 8" DRIVES AND THE LAST FOUR ARE FOR THE ; 5.25" DRIVES. USERS WITH FAST STEPPING 8" DRIVES (SA850/1) OR ; SLOW 5.25" DRIVES (SA400) SHOULD ADJUST THIS TABLE FOR OPTIMAL ; DEVICE PERFORMACE. ; 2) EACH TABLE ENTRY CONTAINS FOUR FIXED LENGTH FIELDS. THE FIELDS ; ARE DEFINED AS FOLLOWS: ; ; TRACKS THIS BYTE CONTAINS THE NUMBER OF TRACKS ON THE ; DRIVE. MOST 8" DRIVES HAVE 77 TRACKS AND ; MOST 5.25" DRIVES HAVE 35 OR 40 TRACKS. ; ; CONFIG THIS A A FLAG BYTE THAT INDICATES AS TO WHETHER ; OR NOT THIS DRIVE HAS BEEN CONFIGURED. SET TO ; 0 TO FORCE RECONFIGURATION. ; ; STEP THIS WORD CONTAINS THE STEPPING RATE CONSTANT. ; THE DJDMA'S DELAY ROUTINES TICK 34.1 TIMES PER ; MILLISECOND. THUS THE STEP CONSTANT WOULD BE THE ; DRIVE MANUFACTORS RECOMENDED STEPPING DELAY TIMES ; 34.1. EXAMPLE. SHUGART SA 850'S STEP AT 3 ; MILLISEOND INTERVALS. THE STEP CONSTANT WOULD BE ; 3 * 43.1 OR 102. ; ; RFU THE NEXT TWO WORDS ARE RESERVED FOR FUTURE USE. ; THEY MUST BE ZERO. ; ; SETTLE THIS WORD IS SIMILAR TO THE PREVIOUSLY DEFINED ; STEP WORD. THIS SPECIFIES THE HEAD SETTLE TIMING ; AFTER THE HEADS HAVE BEEN STEPPED. EXAMPLE, ; SHUGART'S SA 850 HEAD SETTLE TIME IS 15 ; MILLISECONDS. THE SETTLE CONSTANT WOULD BE 15 * ; 34.1 OR 512. ; ; 3) AN ASSEMBLER MACRO (DCONF) HAS BEEN PROVIDED TO ASSIST IN ; GENERATING THE DPARAM TABLE. THIS MACROS PARAMETERS ARE THE ; NUMBER OF TRACKS, THE STEP RATE IN MILLISECONDS, AND THE HEAD ; SETTLE TIME IN MILLISECONDS. FOR EXAMPLE: ; ; ;SHUGART SA 850 ; DCONF 77, 3, 15 ;77 TRACKS, 3 MS STEP, 15 MS SETTLE ; ; ;SHUGART SA 400 ; DCONF 35, 40, 10 ;35 TRACKS, 40 MS STEP, 10 MS SETTLE ; CP/M MACRO ASSEM 2.0 #036 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; 4) NOTE: CAUTION SHOULD BE USED WHEN DEFINING THE DRIVE PARAMETERS. ; INCORRECT DEFINATIONS MAY DAMAGE THE FLOPPY DISK DRIVE. MORROW ; DESIGNS TAKES NO RESPONSIBILITY FOR DAMAGE THAT OCCURES THROUGH ; THE MISUSE OF THIS MACRO. ; DCONF MACRO TRACKS, STEP, SETTLE DB TRACKS ;NUMBER OF TRACKS DB 0 ;RESET THE CALIBRATED FLAG DW STEP*341/10 ;STEP TIME DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO DW SETTLE*341/10 ;HEAD SETTLE TIME ENDM AF3F 0050 DMARAP: DB 0, 10*8 ;REVISION 0, LENGTH 80 BYTES AF41 = DPARAM EQU $ ;DRIVE PARAMETER TABLE ; ;DEFINE 8" DRIVE PARAMETERS ;-------------------------- ; 1) USE SA800 PARAMETERS: 77 TRACKS, 8 MS STEP, 8 MS SETTLE ; DCONF 77, 8, 8 ;DRIVE 0 AF41+4D DB 77 ;NUMBER OF TRACKS AF42+00 DB 0 ;RESET THE CALIBRATED FLAG AF43+1001 DW 8*341/10 ;STEP TIME AF45+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF47+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF49+1001 DW 8*341/10 ;HEAD SETTLE TIME DCONF 77, 8, 8 ;DRIVE 1 AF4B+4D DB 77 ;NUMBER OF TRACKS AF4C+00 DB 0 ;RESET THE CALIBRATED FLAG AF4D+1001 DW 8*341/10 ;STEP TIME AF4F+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF51+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF53+1001 DW 8*341/10 ;HEAD SETTLE TIME DCONF 77, 8, 8 ;DRIVE 2 AF55+4D DB 77 ;NUMBER OF TRACKS AF56+00 DB 0 ;RESET THE CALIBRATED FLAG AF57+1001 DW 8*341/10 ;STEP TIME AF59+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF5B+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF5D+1001 DW 8*341/10 ;HEAD SETTLE TIME DCONF 77, 8, 8 ;DRIVE 3 AF5F+4D DB 77 ;NUMBER OF TRACKS AF60+00 DB 0 ;RESET THE CALIBRATED FLAG AF61+1001 DW 8*341/10 ;STEP TIME AF63+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF65+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF67+1001 DW 8*341/10 ;HEAD SETTLE TIME ; ;DEFINE 5.25" DRIVE PARAMETERS ;----------------------------- ; 1) USE TANDON PARAMETERS: 40 TRACKS, 5 MS STEP, 15 MS SETTLE ; 2) NOTE: DRIVE 1 IS SET UP FOR A 20MS STEP RATE AND A 25MS HEAD ; SETTLING TIME SO THAT IT WILL OPERATE PROPERLY WITH OUR ; SOFT-SECTORED DRIVES. ; CP/M MACRO ASSEM 2.0 #037 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF MFSLOW DCONF 40, 20, 20 ;DRIVE 0 DCONF 40, 20, 20 ;DRIVE 1 DCONF 40, 20, 20 ;DRIVE 2 DCONF 40, 20, 20 ;DRIVE 3 ELSE DCONF 40, 5, 15 ;DRIVE 0 AF69+28 DB 40 ;NUMBER OF TRACKS AF6A+00 DB 0 ;RESET THE CALIBRATED FLAG AF6B+AA00 DW 5*341/10 ;STEP TIME AF6D+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF6F+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF71+FF01 DW 15*341/10 ;HEAD SETTLE TIME DCONF 40, 5, 15 ;DRIVE 1 AF73+28 DB 40 ;NUMBER OF TRACKS AF74+00 DB 0 ;RESET THE CALIBRATED FLAG AF75+AA00 DW 5*341/10 ;STEP TIME AF77+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF79+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF7B+FF01 DW 15*341/10 ;HEAD SETTLE TIME DCONF 40, 5, 15 ;DRIVE 2 AF7D+28 DB 40 ;NUMBER OF TRACKS AF7E+00 DB 0 ;RESET THE CALIBRATED FLAG AF7F+AA00 DW 5*341/10 ;STEP TIME AF81+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF83+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF85+FF01 DW 15*341/10 ;HEAD SETTLE TIME DCONF 40, 5, 15 ;DRIVE 3 AF87+28 DB 40 ;NUMBER OF TRACKS AF88+00 DB 0 ;RESET THE CALIBRATED FLAG AF89+AA00 DW 5*341/10 ;STEP TIME AF8B+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF8D+0000 DW 0 ;RESERVED FOR FUTURE USE, MUST BE ZERO AF8F+FF01 DW 15*341/10 ;HEAD SETTLE TIME ENDIF PAGE CP/M MACRO ASSEM 2.0 #038 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;DJDMA EQUATES ;============= ; ;DEFINE DJDMA I/O PORTS AND DEFAULT CHANNEL ADDRESS ;-------------------------------------------------- ; 0050 = DMCHAN EQU 50H ;DEFAULT CHANNEL ADDRESS 00EF = DMKICK EQU 0EFH ;KICK I/O PORT ADDRESS 003E = SERIN EQU 03EH ;ADDRESS OF SERIAL INPUT DATA ;DEFINE THE CHANNEL COMMANDS ;--------------------------- ; 0020 = DMRSEC EQU 20H ;READ SECTOR COMMAND 0021 = DMWSEC EQU 21H ;WRITE A SECTOR COMMAND 0022 = DMSTAC EQU 22H ;GET DRIVE STATUS 0023 = DMSDMA EQU 23H ;SET DMA ADDRESS 0024 = INTRQC EQU 24H ;SET INTERRUPT REQUEST 0025 = DMHALT EQU 25H ;HALT COMMAND 0026 = BRACHA EQU 26H ;CHANNEL BRANCH 0027 = SETCHA EQU 27H ;SET CHANNEL ADDRESS 0028 = DMSERR EQU 28H ;SET CRC RETRY COUNT 0029 = RDTRCK EQU 29H ;READ TRACK COMMAND 002A = WRTRCK EQU 2AH ;WRITE TRACK COMMAND 002B = SEROUT EQU 2BH ;SERIAL CHARACTER OUPUT 002C = SENABL EQU 2CH ;ENABLE/DISABLE SERIAL INPUT 002D = TRKSIZ EQU 2DH ;SET NUMBER OF TRACKS 002E = DMSETL EQU 2EH ;SET LOGICAL DRIVES 00A0 = READM EQU 0A0H ;READ FROM CONTROLLER MEMORY 00A1 = WRITEM EQU 0A1H ;WRITE TO CONTROLLER MEMORY ;DEFINE STEPPING RATE EQUATES ;---------------------------- ; 0066 = DMFSTE EQU 3*341/10 ;SA851 STEPPING RATE CONSTANT 01FF = DMFSET EQU 15*341/10 ;SA851 SETTLING RATE CONSTANT ;DEFINE INTERNAL STATUS BYTE FIELDS ;---------------------------------- ; 0040 = DMS$T0 EQU 01000000B ;TRACK 0 STATUS MASK (1 = ON TRK 0) 0020 = DMS$DD EQU 00100000B ;DOUBLE DENSITY MASK (1 = DOUBLE) 0010 = DMS$WR EQU 00010000B ;DOUBLE SIDED TRACK WRAP (1 = WRAP) 0008 = DMS$DS EQU 00001000B ;DOUBLE SIDED STATUS MASK (1 = DOUBLE) 0004 = DMS$HS EQU 00000100B ;HARD SECTORED STATUS MASK (1 = HARD) 0003 = DMS$SS EQU 00000011B ;SECTOR SIZE CODE MASK ... ;... 0 = 128, 1 = 256, 2 = 512, 3 = 1024 ;DEFINE NORTH STAR STATUS BYTE FIELDS ;------------------------------------ ; 0080 = DMN$DD EQU 10000000B ;DOUBLE DENSITY MASK 0040 = DMN$DS EQU 01000000B ;DOUBLE SIDED MASK 0020 = DMN$2X EQU 00100000B ;CP/M VERSION 2.X MASK CP/M MACRO ASSEM 2.0 #039 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs 0010 = DMN$OK EQU 00010000B ;VALIDATION MASK 0008 = DMN$40 EQU 00001000B ;40/80 TRACK MASK 0004 = DMN$DT EQU 00000100B ;DOUBLE TRACK DENSITY MASK 0003 = DMN$XX EQU 00000011B ;RFU MASK ;COMMON SUBROUTINES ;------------------ ; RETURN A POINTER TO THE CURRENT DRIVES DRIVE PARAMETER ENTRY ;------------------------------------------------------------- ; AF91 2ABEB4 DMDPAR: LHLD DMDRIV ;GET THE CURRENT DRIVE NUMBER AF94 2600 MVI H,0 ;DRIVE NUMBER IS A BYTE AF96 29 DAD H ;TEN BYTES PER PARAMETER TABLE ENTRY AF97 54 MOV D,H AF98 5D MOV E,L AF99 29 DAD H AF9A 29 DAD H AF9B 19 DAD D AF9C 1141AF LXI D,DPARAM ;PARAMETER TABLE ADDRESS AF9F 19 DAD D AFA0 C9 RET PAGE CP/M MACRO ASSEM 2.0 #040 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF MAXDM NE 0 ;START 8" DRIVE'S UNIQUE CODE SECTION ;==================================================================== ;DEVICE SPECIFICATION TABLE FOR DJDMA CONTROLLER WITH 8" DRIVES ;============================================================== ; AFA1 02 DMDST: DB MAXDM ;NUMBER OF LOGICAL DRIVES AFA2 B8AF DW DMWARM ;WARM BOOT AFA4 26B0 DW DMTRAN ;SECTOR TRANSLATION AFA6 42B0 DW DMLDR1 ;SELECT DRIVE 1 AFA8 CDB0 DW DMLDR2 ;SELECT DRIVE 2 AFAA F1B3 DW DMHOME ;HOME DRIVE AFAC FBB3 DW DMSEEK ;SEEK TO SPECIFIED TRACK AFAE 00B4 DW DMSEC ;SET SECTOR AFB0 06B4 DW DMDMA ;SET DMA ADDRESS AFB2 0CB4 DW DMREAD ;READ A SECTOR AFB4 11B4 DW DMWRIT ;WRITE A SECTOR AFB6 14AF DW NOBAD ;NO BAD SECTOR MAP IF DMORDER NE 1 ;NO WARM BOOT POSSIBLE ;DJDMA 8" WARM BOOT DUMMY ;------------------------ ; 1) IF 8" DJDMA IS NOT DRIVE A (I.E. DMORDER NOT EQUAL 1) THEN ; IT IS NOT POSSIBLE TO WARM BOOT FROM 8". SO ROUTINE NOT NEEDED. ; DMWARM: RET ;RETURN IF CALLED ELSE ;DJDMA 8" WARM BOOT LOADER ;------------------------- ; 1) THIS LOADER LOADS FROM THE START OF THE CCP (TRACK 0 SECTOR 5) ; TO THE END OF THE BDOS (TRACK 1 SECTOR 3). ONLY 768 (3/4K) BYTES ; OF TRACK 1 SECTOR 3 IS READ IN SINCE THE WARM BOOT ROUTINE IS ; NOT ALLOWED TO LOAD ANY THE CBIOS CODE. ; 2) SECTOR 3 IS READ INTO THE DISK BUFFER AND COPIED INTO ITS PROPER ; RESTING PLACE. ; 0B00 = DMCOD8 EQU 22*128 ;AMOUNT OF CODE ON TRACK 0 TO LOAD AFB8 CDE3B3 DMWARM: CALL DMSEL2 ;SELECT DRIVE 0 AFBB 21E1AF DMWBAD: LXI H,DMWCHN ;WARM BOOT COMMAND CHANNEL AFBE 112200 LXI D,DMWOFF AFC1 CD8AB4 CALL DMCMD ;EXECUTE THE CHANNEL AFC4 C2BBAF JNZ DMWBAD ;RETRY AFC7 3AECAF LDA DMWST0 ;GET TRACK READ STATUS AFCA 2AF8AF LHLD DMWST1 ;TRACK ONES STATUS IN L AFCD B5 ORA L AFCE FE40 CPI 40H AFD0 C2BBAF JNZ DMWBAD ;LOOP ON 'TERRIBLE' ERRORS LIKE NO DISK AFD3 010003 LXI B,300H ;MOVE .75 KBYTES OF SECTOR 3 AFD6 11CEB7 LXI D,BUFFER ;SECTOR 3 IS IN OUR BUFFER AFD9 2100A9 LXI H,CCP+1300H ; AND THIS IS WHERE WE WANT IT TO GO CP/M MACRO ASSEM 2.0 #041 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs AFDC CDD5AE CALL MOVBYT AFDF AF XRA A AFE0 C9 RET AFE1 23 DMWCHN: DB DMSDMA ;SET TRACK 0 DMA ADDRESS AFE2 0094 DW CCP-512 ;FIRST TRACK DMA ADDRESS - BOOT LOADER AFE4 00 DB 0 AFE5 29 DB RDTRCK ;READ TRACK COMMAND AFE6 00 DB 0 ;TRACK 0 AFE7 00 DB 0 ;SIDE 0 AFE8 00 DB 0 ;DRIVE 0 AFE9 04B0 DW DMWMAP ;SECTOR LOAD/STATUS MAP AFEB 00 DB 0 AFEC 00 DMWST0: DB 0 ;TRACK READ STATUS AFED 23 DB DMSDMA AFEE 00A1 DW CCP+DMCOD8 ;DMA ADDRESS FOR TRACK 1 AFF0 00 DB 0 AFF1 29 DB RDTRCK AFF2 01 DB 1 ;TRACK 1 AFF3 00 DB 0 ;SIDE 0 AFF4 00 DB 0 ;DRIVE 0 AFF5 1EB0 DW DMWMAP+26 ;LOAD MAP RIGHT AFTER TRACK 0 MAP AFF7 00 DB 0 AFF8 00 DMWST1: DB 0 ;TRACK READ STATUS AFF9 23 DB DMSDMA AFFA CEB7 DW BUFFER ;SECTOR 3 GETS LOADED IN SYSTEM BUFFER AFFC 00 DB 0 AFFD 20 DB DMRSEC AFFE 01 DB 1 ;TRACK 1 AFFF 03 DB 3 ;SIDE 0, SECTOR 3 B000 00 DB 0 ;DRIVE 0 B001 00 DB 0 ;READ STATUS B002 25 DB DMHALT ;CONTROLLER HALT COMMAND B003 00 DB 0 0022 = DMWOFF EQU $-DMWCHN-1 ;HALT OFFSET FOR THE COMMAND CHANNEL B004 FFFFFFFF00DMWMAP: DW -1, -1, 0, 0, 0, 0, 0 ;DO NOT LOAD THE BOOT LOADER B012 0000000000 DW 0, 0, 0, 0, 0, 0 B01E 0000FFFFFF DW 0, -1, -1, -1 ;FIRST 2 SECTORS ON TRACK 2 ENDIF ;END OF 8" DJDMA WARM BOOT ;DJDMA 8" SECTOR TRANSLATION ;--------------------------- ; B026 03 DMTRAN: INX B ;AJUST SECTORS TO START AT 1 B027 3AD4B4 LDA DMPSTA ;TEST FOR DOUBLE SIDED DRIVES B02A E608 ANI DMS$DS B02C CA3BB0 JZ DMTRN0 ;SKIP IF SINGLE SIDED B02F 3AFAB0 LDA DMCSPT ;GET SPT/2 B032 91 SUB C ;TEST FOR SIDE ONE SECTORS B033 D23BB0 JNC DMTRN0 ;SKIP SECTOR ADJUSTMENT IF ON SIDE ZERO B036 2F CMA ;'KNOCK OFF' FIRST SIDES SECTORS B037 3C INR A CP/M MACRO ASSEM 2.0 #042 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B038 4F MOV C,A B039 0680 MVI B,80H ;SET SIDE ONE FLAG B03B 69 DMTRN0: MOV L,C ;MAKE AN INDEX TO THE SECTRAN TABLE B03C 2600 MVI H,0 B03E 19 DAD D B03F 6E MOV L,M ;LOAD THE TRANSLATED SECTOR B040 60 MOV H,B ;SET THE SIDE BIT B041 C9 RET ;DJDMA 8" DRIVE SELECT 1 ;----------------------- ; 1) DETERMINE THE SECTOR SIZE AND THE NUMBER OF SIDES ON THE DRIVE. ; 2) RETURN CORRECT DPH. ; B042 CDE3B3 DMLDR1: CALL DMSEL2 ;DO LOGICAL SELECT B045 CDBCB3 CALL DMINIT ;TEST FOR A CONTROLLER B048 DAF8AE JC ZRET ;SKIP IF NO CONTROLLER PRESENT B04B CD63B4 CALL DMSTAT ;ACCM:= DJDMA_RETURNED_DRIVE_STATUS B04E DAF8AE JC ZRET ;SKIP ON STATUS CHECK ERROR B051 F5 PUSH PSW B052 E640 ANI DMS$T0 ;CHECK FOR TRACK 0 B054 CA7CB0 JZ DMLDR0 ;SKIP IF NOT ON TRACK 0 (STATUS VALID) B057 F1 POP PSW ;CLEAN STACK B058 210100 LXI H,1 ;READ SECTOR 1 ... B05B 2238B6 SHLD TRUESEC B05E 23 INX H ;... OF TRACK 2 B05F 2236B6 SHLD CPMTRK ;BECAUSE TRACK 1 ALWAYS SINGLE DENSITY B062 AF XRA A B063 32F8AD STA RDWR ;FORCE READ TO GET VALID DRIVE STATUS B066 CD21AE CALL FILL ;FLUSH BUFFER AND READ B069 DAF8AE JC ZRET ;EXIT WITH ERROR IF ERROR B06C CD91AF CALL DMDPAR ;GET THE DRIVE PARAMETER ADDRESS B06F 23 INX H B070 3600 MVI M,0 ;DECALIBRATE THE DRIVE B072 CD23B4 CALL DMPARM B075 CD63B4 CALL DMSTAT ;ACCM:= DJDMA_RETURNED_DRIVE_STATUS B078 DAF8AE JC ZRET ;IF (ERROR EQ TRUE) GOTO ERROR_RETURN B07B F5 PUSH PSW B07C F1 DMLDR0: POP PSW ;GET DRIVE STATUS B07D 32D4B4 STA DMPSTA ;SET THE PHYSICAL STATUS MODE B080 CD80B4 CALL DMSPTR ;SAVE STATUS IN STATUS TABLE B083 77 MOV M,A B084 E603 ANI DMS$SS ;MASK IN SECTOR SIZE BITS B086 07 RLC ;MAKE A WORD INDEX B087 F5 PUSH PSW ;USED TO SELECT A DPB B088 5F MOV E,A B089 1600 MVI D,0 B08B 21DDB4 LXI H,XLTS ;TABLE OF XLT TABLE POINTERS B08E 19 DAD D B08F E5 PUSH H ;SAVE POINTER TO PROPER XLT CP/M MACRO ASSEM 2.0 #043 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B090 CDC3B0 CALL DMGDPH ;GET A POINTER TO THE DRIVES DPH B093 D1 POP D ;COPY XLT POINTER FROM TABLE TO DPH B094 010200 LXI B,2 B097 CDD5AE CALL MOVBYT B09A 110800 LXI D,8 ;OFFSET TO DPB POINTER B09D 19 DAD D B09E E5 PUSH H B09F 3AD4B4 LDA DMPSTA ;TEST FOR A DOUBLE SIDED DRIVE B0A2 E608 ANI DMS$DS B0A4 11B3B5 LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S B0A7 CAB0B0 JZ DMSOK B0AA CDE1B0 CALL DMFSTP ;SET CONTROLLER TO FAST STEPING MODE B0AD 11F3B5 LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S B0B0 EB DMSOK: XCHG B0B1 D1 POP D ;RESTORE DPH POINTER TO DPB B0B2 F1 POP PSW ;OFFSET TO CORRECT DPB (SECTOR SIZE) B0B3 07 RLC ;TIMES 4 B0B4 07 RLC ; 8 B0B5 07 RLC ; 16 BYTES PER DPB B0B6 4F MOV C,A ;OFFSET TO THE CORRECT DPB B0B7 0600 MVI B,0 B0B9 09 DAD B B0BA EB XCHG ;LOAD THE DPB POINTER IN THE DPH B0BB 73 MOV M,E B0BC 23 INX H B0BD 72 MOV M,D B0BE 210F00 LXI H,15 ;OFFSET TO THE SECTOR SIZE CODE B0C1 19 DAD D B0C2 4E MOV C,M B0C3 3ABEB4 DMGDPH: LDA DMDRIV ;GET THE DPH POINTER B0C6 11FBB0 LXI D,DPHDM0 B0C9 CD18AF CALL RETDPH B0CC C9 RET ;DJDMA 8" DRIVE SELECT 2 ;----------------------- ; 1) FIGURE NUMBER OF SECTORS_PER_TRACK/2 FOR SECTRAN. ; ; B0CD CDE3B3 DMLDR2: CALL DMSEL2 ;PERFORM LOGICAL DRIVE SELECT B0D0 CDC3B0 CALL DMGDPH ;LOAD THE DPH POINTER B0D3 110A00 LXI D,10 ;OFFSET TO THE DPB POINTER B0D6 19 DAD D B0D7 7E MOV A,M ;LOAD THE DPB POINTER B0D8 23 INX H B0D9 66 MOV H,M B0DA 6F MOV L,A B0DB 7E MOV A,M ;LOAD THE NUMBER OF CP/M SECTORS/TRACK B0DC 0F RRC ;DIVIDE BY TWO B0DD 32FAB0 STA DMCSPT ;SAVE CPM SPT B0E0 C9 RET CP/M MACRO ASSEM 2.0 #044 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;SET THE DRIVE'S STEP RATE TO 3MS ;-------------------------------- ; 1) THE CURRENT DRIVE IS DOUBLE SIDED. THUS IS IT SAFE TO SET THE ; STEPPING RATE TO 3 MS WITH 15 MS SETTLING. ; B0E1 CD91AF DMFSTP: CALL DMDPAR ;GET THE PARAMETER TABLE POINTER B0E4 23 INX H ;BUMP TO THE DRIVE INITIALIZED FLAG B0E5 3600 MVI M,0 ;FORCE REPARAMITIZATION OF THIS DRIVE B0E7 23 INX H ;OFFSET TO THE STEPPING RATE CONSTANT B0E8 3666 MVI M,(LOW DMFSTE) ;FAST STEPPING RATE CONSTANT B0EA 23 INX H B0EB 3600 MVI M,(HIGH DMFSTE) B0ED 110500 LXI D,5 ;SKIP OVER THE RESERVED FIELDS B0F0 19 DAD D B0F1 36FF MVI M,(LOW DMFSET) ;FAST SETTLING RATE CONSTANT B0F3 23 INX H B0F4 3601 MVI M,(HIGH DMFSET) B0F6 CD23B4 CALL DMPARM ;SET DRIVE PARAMETERS FOR THE SA850 B0F9 C9 RET ;DJDMA 8" DRIVER VARIABLES ;------------------------- ; B0FA 00 DMCSPT: DB 0 ;CPM SECTORS PER TRACK / 2 ; 8" DISK PARAMETER HEADERS ;-------------------------- ; B0FB 0000 DPHDM0: DW 0 ;TRANSLATION TABLE ADDRESS B0FD 0000 DW 0 B0FF 0000 DW 0 B101 0000 DW 0 B103 D8BB DW DIRBUF ;DIRECTORY BUFFER B105 0000 DW 0 ;POINTER TO DISK PARAMETER BLOCK B107 58BC DW CSVDM0 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B109 98BC DW ALVDM0 ;SCRATCH PAD FOR ALLOCATION INFORMATION B10B 0000 DPHDM1: DW 0 ;TRANSLATION TABLE ADDRESS B10D 0000 DW 0 B10F 0000 DW 0 B111 0000 DW 0 B113 D8BB DW DIRBUF ;DIRECTORY BUFFER B115 0000 DW 0 ;POINTER TO DISK PARAMETER BLOCK B117 E3BC DW CSVDM1 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B119 23BD DW ALVDM1 ;SCRATCH PAD FOR ALLOCATION INFORMATION B11B 0000 DPHDM2: DW 0 ;TRANSLATION TABLE ADDRESS B11D 0000 DW 0 B11F 0000 DW 0 B121 0000 DW 0 B123 D8BB DW DIRBUF ;DIRECTORY BUFFER B125 0000 DW 0 ;POINTER TO DISK PARAMETER BLOCK B127 6EBD DW CSVDM2 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B129 AEBD DW ALVDM2 ;SCRATCH PAD FOR ALLOCATION INFORMATION B12B 0000 DPHDM3: DW 0 ;TRANSLATION TABLE ADDRESS CP/M MACRO ASSEM 2.0 #045 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B12D 0000 DW 0 B12F 0000 DW 0 B131 0000 DW 0 B133 D8BB DW DIRBUF ;DIRECTORY BUFFER B135 0000 DW 0 ;POINTER TO DISK PARAMETER BLOCK B137 F9BD DW CSVDM3 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B139 39BE DW ALVDM3 ;SCRATCH PAD FOR ALLOCATION INFORMATION ENDIF ;END OF 8" DRIVE'S UNIQUE CODE PAGE CP/M MACRO ASSEM 2.0 #046 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF MAXMF NE 0 ;START OF 5" DRIVE'S UNIQUE CODE SECTION ;======================================================================= ;DRIVE SPECIFICATION TABLE FOR DJDMA 5.25" DRIVES ;================================================ ; B13B 02 MFDST: DB MAXMF ;NUMBER OF LOGICAL DRIVES B13C 52B1 DW MFWARM ;WARM BOOT B13E 53B1 DW MFTRAN ;SECTOR TRANSLATION B140 71B1 DW MFLDR1 ;SELECT DRIVE 1 B142 31B2 DW MFSEL2 ;SELECT DRIVE 2 B144 F1B3 DW DMHOME ;HOME DRIVE B146 36B2 DW MFSEEK ;SEEK TO SPECIFIED TRACK B148 75B2 DW MFSSEC ;SET SECTOR B14A 06B4 DW DMDMA ;SET DMA ADDRESS B14C 81B2 DW MFREAD ;READ A SECTOR B14E 87B2 DW MFWRIT ;WRITE A SECTOR B150 14AF DW NOBAD ;NO BAD SECTOR MAP IF MFORDER NE 1 ;NO WARM BOOT POSSIBLE ;DJDMA 5.25" WARM BOOT DUMMY ;--------------------------- ; 1) IF 5.25" DJDMA IS NOT DRIVE A (I.E. MFORDER NOT EQUAL 1) THEN ; IT IS NOT POSSIBLE TO WARM BOOT FROM 5.25". SO ROUTINE NOT NEEDED. ; B152 C9 MFWARM: RET ;RETURN IF CALLED ELSE ;DJDMA 5.25" WARM BOOT LOADER ;---------------------------- ; 1) LOAD FROM THE START OF THE CCP (TRACK 0 SECTOR 1) TO THE END ; OF THE BDOS (TRACK 1 SECTOR 1). MFTRCK EQU 9*512 ;AMOUNT OF CODE ON TRACK 0 MFWARM: CALL MFSEL2 ;SELECT DRIVE 0 MFWBAD: LXI H,MFWCHN ;WARM BOOT COMMAND CHANNEL LXI D,MFWLEN CALL DMCMD JNZ MFWBAD ;LOOP ON 'BAD' ERRORS LDA MFWST0 CPI 40H JNZ MFWBAD XRA A ;RETURN NO ERROR RET MFWCHN: DB DMSDMA ;SET TRACK 0 DMA ADDRESS DW CCP-512 ;FIRST TRACK DMA ADDRESS - BOOT LOADER DB 0 DB RDTRCK ;READ TRACK COMMAND DB 0 ;TRACK 0 DB 0 ;SIDE 0 DB 4 ;MINI DRIVE 0 CP/M MACRO ASSEM 2.0 #047 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DW MFWSEC ;SECTOR LOAD/STATUS MAP DB 0 MFWST0: DB 0 ;TRACK READ STATUS DB DMSDMA DW CCP+MFTRCK ;DMA ADDRESS FOR TRACK 1 DB 0 DB RDTRCK DB 1 ;TRACK 1 DB 0 ;SIDE 0 DB 4 ;MINI DRIVE 0 DW MFWSEC+10 ;LOAD MAP RIGHT AFTER TRACK 0 MAP DB 0 DB 0 ;TRACK READ STATUS DB DMHALT DB 0 MFWLEN EQU $-MFWCHN-1 ;CHANNEL LENGTH MFWSEC: DW 0FFH, 0, 0, 0, 0 ;DO NOT LOAD BOOT LOADER DW 0, -1, -1, -1, -1 ;FIRST TWO SECTORS LOADED ENDIF ;DJDMA 5.25" WARM BOOT ROUTINE ;DJDMA 5.25" SECTOR TRANSLATION ;------------------------------ ; B153 3AD4B4 MFTRAN: LDA DMPSTA ;TEST FOR SOFT SECTORED MEDIA B156 E604 ANI DMS$HS B158 21F3B2 LXI H,MFXLT1 ;SOFT SECTORED SECTRAN TABLE B15B CA6CB1 JZ MFTRN B15E 3AD4B4 LDA DMPSTA ;TEST DISK DENSITY B161 E620 ANI DMS$DD B163 21CBB2 LXI H,MFXLTD ;DOUBLE DENSITY SECTRAN TABLE B166 C26CB1 JNZ MFTRN B169 21B7B2 LXI H,MFXLTS ;SINGLE DENSITY SECTRAN TABLE B16C 09 MFTRN: DAD B B16D 6E MOV L,M ;LOAD PHYSICAL SECTOR NUMBER B16E 2600 MVI H,0 B170 C9 RET ;DJDMA 5.25" FIRST TIME SELECT ;----------------------------- ; 1) THIS ROUTINE INPECTES THE DISK. IF THE DISK IS HARD SECTORED ; THE THE NORTH STAR CONFIGURATION BYTE IS READ FROM TRACK 0, ; SECTOR 0 BYTE 5C. IF THE MEDIA IS SOFT SECTORED THE THE ; MORROW DESIGNS MICRO DECISION FORMAT IS ASSUMED. ; B171 CD31B2 MFLDR1: CALL MFSEL2 ;DO LOGICAL DRIVE SELECT B174 CDBCB3 CALL DMINIT ;TEST FOR A CONTROLLER B177 DAF8AE JC ZRET B17A CD63B4 CALL DMSTAT ;GET THE DRIVE STATUS BYTE B17D DAF8AE JC ZRET ;ERROR EXIT IF STATUS NOT GOOD B180 32D4B4 STA DMPSTA B183 CD80B4 CALL DMSPTR ;SAVE IN THE STATUS TABLE CP/M MACRO ASSEM 2.0 #048 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B186 77 MOV M,A B187 E604 ANI DMS$HS ;TEST FOR HARD SECTORED DRIVES B189 C2B7B1 JNZ MFLD0 ;SKIP TO HARD SECTORED LOGGER B18C CD04B2 CALL MFRDS1 ;GET SECTOR 1 OF TRACK 0 B18F 2167B8 LXI H,BUFFER+80H+25 ;LONGITUDINAL PARITY CHECK THE DATA B192 0619 MVI B,25 ;NUMBER OF BYTES TO CHECK B194 AF XRA A ;INIT LONG PARITY B195 5F MOV E,A ;0-CHECK BYTE B196 2B MFCKL: DCX H ;NEXT BYTE TO CHECK B197 AE XRA M ;GET LONG PARITY B198 57 MOV D,A ;SAVE PARITY B199 B3 ORA E ;CATCH ANY 1 BITS IN 0-CHECK BYTE B19A 5F MOV E,A ;SAVE 0-CHECK B19B 7A MOV A,D ;GET PARITY AGAIN B19C 05 DCR B B19D C296B1 JNZ MFCKL ;LOOP FOR WHOLE TABLE B1A0 B7 ORA A ;TESTS PARITY (SHOULD BE 0 FOR VALID) B1A1 C2B2B1 JNZ MFSFT ;ASSUME SINGLE SIDE IF BAD TABLE B1A4 B3 ORA E ;TEST 0-CHECK (SHOULD NOT BE ALL 0) B1A5 CAB2B1 JZ MFSFT ;ASSUME SINGLE SIDE IN ALL 0 TABLE B1A8 3A4FB8 LDA BUFFER+81H ;GET MORROW SOFT SECTOR CONFIG BYTE B1AB E604 ANI 4 ;CHECK DOUBLE SIDED INDICATOR B1AD 3EA9 MVI A,0A9H ;DOUBLE SIDED CONFIG BYTE B1AF C2BDB1 JNZ MFLD1 ;SKIP IF DOUBLE SIDED B1B2 3EA1 MFSFT: MVI A,0A1H ;MORROW SOFT SECTORED FLOPPY B1B4 C3BDB1 JMP MFLD1 B1B7 CD04B2 MFLD0: CALL MFRDS1 ;GET SECTOR 1 OF TRACK 0 B1BA 3A2AB8 LDA BUFFER+5CH ;GET THE NORTH STAR CONFIGURATION BYTE B1BD B7 MFLD1: ORA A ;OLD CP/M 1.4 SYSTEMS DID NOT HAVE A B1BE CC1AB2 CZ MFLCL ; CONFIGURATION BYTE. THIS ROUTINE B1C1 FEE5 CPI 0E5H ; WILL MAKE A CONFIGURATION BYTE FOR B1C3 CC1AB2 CZ MFLCL ; THESE SYSTEMS. B1C6 4F MOV C,A B1C7 2196B2 LXI H,MFS ;POINTER TO CONFIGURATION TABLE B1CA 7E MFLD2: MOV A,M ;GET AN ENTRY B1CB B7 ORA A ;CHECK FOR END OF THE TABLE B1CC CAF8AE JZ ZRET ;YES, SELECT ERROR B1CF B9 CMP C ;CHECK IF ENTRY MATCHES SELECTED DRIVE B1D0 CADAB1 JZ MFLD3 ;MATCH, GET ENTRY B1D3 23 INX H ;SKIP TO THE NEXT ENTRY B1D4 23 INX H B1D5 23 INX H B1D6 23 INX H B1D7 C3CAB1 JMP MFLD2 B1DA 23 MFLD3: INX H ;BUMP TO THE TRUE CONFIGURATION BYTE B1DB 3AD4B4 LDA DMPSTA ;GET THE PHYSICAL STATUS CP/M MACRO ASSEM 2.0 #049 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B1DE B6 ORA M ;FILL IN THE FIELDS THE HARDWARE CAN'T B1DF 32D4B4 STA DMPSTA ; FIGURE OUT B1E2 E5 PUSH H B1E3 CD80B4 CALL DMSPTR ;LOAD THE STATUS BYTE INTO THE TABLE B1E6 77 MOV M,A B1E7 E1 POP H B1E8 23 INX H ;BUMP TO THE DPB POINTER B1E9 7E MOV A,M ;LOAD THE DPB POINTER B1EA 23 INX H B1EB 66 MOV H,M B1EC 6F MOV L,A B1ED E5 PUSH H ;SAVE DPB ADDRESS B1EE CD25B2 CALL MFGDPH ;GET A DPH POINTER B1F1 110A00 LXI D,10 ;OFFSET TO DPB ADDRESS IN DPH B1F4 19 DAD D B1F5 D1 POP D B1F6 73 MOV M,E ;STORE DPB ADDRESS IN DPH B1F7 23 INX H B1F8 72 MOV M,D B1F9 CD25B2 CALL MFGDPH ;GET THE DPH POINTER B1FC 3AD4B4 LDA DMPSTA ;GET PHYSICAL STATUS B1FF E603 ANI DMS$SS ;MASK SECTOR SIZE FIELD B201 3C INR A ;MAKE CBIOS SECTOR SIZE CODE B202 4F MOV C,A B203 C9 RET ; ; ROUTINE CALLED BY FIRST TIME SELECT TO READ SECTOR 1 TRACK 0 ; FOR DISK CONFIGURATION BYTE CHECKS FOR HARD/SOFT SECTORED ; MINIFLOPPIES. ; B204 210100 MFRDS1: LXI H,1 ;SELECT SECTOR 1 OF TRACK 0 B207 2238B6 SHLD TRUESEC B20A 2B DCX H B20B 2236B6 SHLD CPMTRK B20E AF XRA A ;MAKE SURE WE ARE DOING A READ B20F 32F8AD STA RDWR B212 CD21AE CALL FILL ;FLUSH BUFFER AND REFILL B215 D0 RNC ;RETURN IF NO ERROR B216 E1 POP H ;FLUSH RETURN ADDRESS B217 C3F8AE JMP ZRET ;DO ERROR RETURN ; GET THE CONFIGURATION BYTE FOR A NORTH STAR DISK ;------------------------------------------------- ; 1) THIS ROUTINE IS ONLY USED BY MFLDR1: (MINI-FLOPPY FIRST TIME ; SELECT ; 2) NORTH STAR CONFIGURATION BYTE VALUE IS 0 OR AN E5. CHECK ; PHYSICAL DISK DENSITY AND GENERATE CORRECT CONFIGURATION BYTE ; VALUE. ; B21A 3AD4B4 MFLCL: LDA DMPSTA ;GET PHYSICAL STATUS B21D E620 ANI DMS$DD ;TEST THE DOUBLE DENSITY BIT B21F 3E10 MVI A,10H ;CP/M 1.4 SINGLE DENSITY CONFIGURATION B221 C8 RZ B222 3E90 MVI A,90H ;CP/M 1.4 DOUBLE DENSITY CONFIGURATION CP/M MACRO ASSEM 2.0 #050 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B224 C9 RET ; RETURN A POINTER TO THE CURRENT DRIVES DPH ;------------------------------------------- ; ; 1) THIS ROUTINE IS ONLY USED BY MFLDR1: (MINI-FLOPPY FIRST TIME ; SELECT ; B225 3ABEB4 MFGDPH: LDA DMDRIV ;GET THE CURRENT DRIVE B228 D604 SUI 4 ;5.25 DRIVES START AT DRIVE 4 B22A 111CB3 LXI D,DPHMF0 B22D CD18AF CALL RETDPH B230 C9 RET ;SELECT DRIVE #2 ;--------------- ; 1) THIS DRIVER CONFIGURES THE 5 1/4" DRIVES AS DRIVES 4 TO 7. ; ; B231 C604 MFSEL2: ADI 4 ;5.25" DRIVES ARE DRIVES 4-7 B233 C3E3B3 JMP DMSEL2 ;SET TRACK ;--------- ; 1) NORTH STAR IMPLEMENTS DOUBLE SIDED DRIVES BY DOUBLING ; THE NUMBER OF TRACKS TO 70. TRACKS 0 TO 34 ARE ON SIDE 0 LIKE A ; SINGLE SIDED FLOPPY. TRACKS 35 TO 69 ARE ON SIDE 1 IN REVERSE ; (E.G. TRACK 35 IS ON TRACK 34 SIDE 1 AND TRACK 69 IS ON TRACK 0 ; SIDE 1). ; B236 AF MFSEEK: XRA A ;CLEAR DOUBLE SIDED SELECT FLAG B237 321BB3 STA MFSID1 B23A 21D4B4 LXI H,DMPSTA ;GET THE DRIVE STATUS B23D 7E MOV A,M B23E E604 ANI DMS$HS ;TEST FOR HARD SECTORED DRIVES B240 CA61B2 JZ DMSOFT ;SKIP IF SOFT SECTORED B243 7E MOV A,M ;TEST FOR DOUBLE SIDED DRIVES B244 E608 ANI DMS$DS B246 CAFBB3 JZ DMSEEK ;SKIP IF SINGLE SIDED B249 7E MOV A,M ;TEST FOR TRACK WRAP MODE B24A E610 ANI DMS$WR B24C CAFBB3 JZ DMSEEK ;SKIP IF NOT WRAPPING B24F 79 MOV A,C ;TEST FOR TRACKS 35-69 B250 FE23 CPI 35 B252 DAFBB3 JC DMSEEK ;SKIP IF LESS THAN TRACK 35 B255 3E45 MVI A,69 ;ADJUST TRACKS 35 -> 69 TO 34 -> 0 B257 91 SUB C B258 4F MOV C,A B259 3E80 MVI A,080H ;SET SIDE ONE FLAG B25B 321BB3 STA MFSID1 B25E C3FBB3 JMP DMSEEK B261 7E DMSOFT: MOV A,M ;GET DRIVE STATUS AGAIN B262 E608 ANI DMS$DS ;CHECK FOR DOUBLE SIDED (CY = 0) CP/M MACRO ASSEM 2.0 #051 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B264 CAFBB3 JZ DMSEEK ;SKIP IF NOT DOUBLE SIDED B267 79 MOV A,C ;GET TRACK NUMBER B268 1F RAR ;DIVIDE BY 2 FOR MORROW SOFT SECTORED B269 4F MOV C,A B26A D2FBB3 JNC DMSEEK ;SKIP IF ON SIDE 1 B26D 3E80 MVI A,80H B26F 321BB3 STA MFSID1 ;ELSE INDICATE SIDE 2 B272 C3FBB3 JMP DMSEEK ;DJDMA 5.25" SET SECTOR ;---------------------- ; B275 3AD4B4 MFSSEC: LDA DMPSTA ;IF (DRIVE .EQ. SOFT_SECTORED) B278 E604 ANI DMS$HS ; GOTO SECTOR SAVE ROUTINE B27A CA00B4 JZ DMSEC ;ELSE B27D 0D DCR C ; ADJUST FOR FIRST SECT = ZERO B27E C300B4 JMP DMSEC ;DJDMA 5.25" READ/WRITE SECTOR ;----------------------------- ; B281 CD8DB2 MFREAD: CALL MFSET ;SET UP SIDE FLAG B284 C30CB4 JMP DMREAD B287 CD8DB2 MFWRIT: CALL MFSET ;SET UP SIDE FLAG B28A C311B4 JMP DMWRIT B28D 3A1BB3 MFSET: LDA MFSID1 ;GET THE SIDE FLAG B290 21BDB4 LXI H,DMSCTR ;MERGE WITH THE SECTOR NUMBER B293 B6 ORA M B294 77 MOV M,A B295 C9 RET ;DJDMA 5.25" DRIVER VARIABLES ;---------------------------- ; ;MINI-FLOPPY CONFIGURATION/DPB_LOOKUP TABLE ; 1) THIS TABLE IS USED BY THE MINI-FLOPPY FIRST TIME SELECT ROUTINE ; (MFSLDR1) AND IS USED TO: ; A) VALIDATE THE DRIVE CONFIGURATION BYTE. ; B) FILL IN THE PARAMETERS THAT CAN'T BE DETERMINED BY DOING ; SENSE DRIVE STATUS (LIKE SENSING DOUBLE SIDED DRIVES). ; C) RETURNING A POINTER TO THE PROPER DPB FOR THE MEDIA. ; 2) THERE ARE FOUR FIELDS PER ENTRY. ; FIELD_1: DRIVE CONFIGURATION BYTE. ; FIELD_2: ADDITIONAL DRIVE PARAMETERS THAT CAN'T BE DETERMINED ; BY DOING A SENSE DRIVE STATUS (I.E. DOUBLE_SIDED AND ; TRACK_WRAP). ; FIELD_3: POINTER TO THE APPROPRIATE DPB ; B296 10 MFS: DB 10H ;NORTH STAR CP/M 1.4 B297 00 DB 0 ;SINGLE DENSITY, 35 TRACKS, 1-SIDED B298 5CB3 DW DPBMF0 ;1K GROUPS B29A 90 DB 90H ;NORTH STAR CP/M 1.4 CP/M MACRO ASSEM 2.0 #052 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B29B 00 DB 0 ;DOUBLE DENSITY, 35 TRACKS, 1-SIDED B29C 6CB3 DW DPBMF1 ;1K GROUPS B29E B0 DB 0B0H ;NORTH STAR CP/M 2.X B29F 00 DB 0 ;DOUBLE DENSITY, 35 TRACKS, 1-SIDED B2A0 7CB3 DW DPBMF2 ;2K GROUPS B2A2 F0 DB 0F0H ;NORTH STAR CP/M 2.X B2A3 18 DB (DMS$DS OR DMS$WR) ;DOUBLE DENSITY, 35 TRACKS, 2-SIDED B2A4 8CB3 DW DPBMF3 ;2K GROUPS B2A6 A0 DB 0A0H ;NORTH STAR CP/M 2.X (FAKE 40 TRACK) B2A7 00 DB 0 ;DOUBLE DENSITY, 35 TRACKS, 1-SIDED B2A8 7CB3 DW DPBMF2 ;2K GROUPS B2AA D0 DB 0D0H ;NORTH STAR CP/M 2.X (FAKE 40 TRACK) B2AB 18 DB (DMS$DS OR DMS$WR) ;DOUBLE DENSITY, 35 TRACKS, 2-SIDED B2AC 8CB3 DW DPBMF3 ;2K GROUPS B2AE A1 DB 0A1H ;MORROW DESIGNS CP/M 2.X SOFT SECTORED B2AF 00 DB 0 ;DOUBLE DENSITY, 40 TRACKS, 1-SIDED B2B0 9CB3 DW DPBMF4 B2B2 A9 DB 0A9H ;MORROW DESIGNS CP/M 2.X SOFT SECTORED B2B3 08 DB DMS$DS ;DOUBLE DENSITY, 40 TRACKS, 2-SIDED B2B4 ACB3 DW DPBMF5 B2B6 00 DB 0 ;END OF CONFIGURATION TABLE ; HARD SECTORED SINGLE SIDED SECTOR TRANSLATION TABLE ; B2B7 0102 MFXLTS: DB 1, 2 B2B9 0304 DB 3, 4 B2BB 0506 DB 5, 6 B2BD 0708 DB 7, 8 B2BF 090A DB 9, 10 B2C1 0B0C DB 11, 12 B2C3 0D0E DB 13, 14 B2C5 0F10 DB 15, 16 B2C7 1112 DB 17, 18 B2C9 1314 DB 19, 20 ; HARD SECTORED DOUBLE SIDED SECTOR TRANSLATION TABLE ; B2CB 01020304 MFXLTD: DB 1, 2, 3, 4 B2CF 15161718 DB 21, 22, 23, 24 B2D3 05060708 DB 5, 6, 7, 8 B2D7 191A1B1C DB 25, 26, 27, 28 B2DB 090A0B0C DB 9, 10, 11, 12 B2DF 1D1E1F20 DB 29, 30, 31, 32 B2E3 0D0E0F10 DB 13, 14, 15, 16 B2E7 21222324 DB 33, 34, 35, 36 B2EB 11121314 DB 17, 18, 19, 20 B2EF 25262728 DB 37, 38, 39, 40 ; SOFT SECTORED SINGLE SIDED TRANSLATION TABLE CP/M MACRO ASSEM 2.0 #053 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; B2F3 0102030405MFXLT1: DB 1, 2, 3, 4, 5, 6, 7, 8 B2FB 191A1B1C1D DB 25, 26, 27, 28, 29, 30, 31, 32 B303 090A0B0C0D DB 9, 10, 11, 12, 13, 14, 15, 16 B30B 2122232425 DB 33, 34, 35, 36, 37, 38, 39, 40 B313 1112131415 DB 17, 18, 19, 20, 21, 22, 23, 24 B31B 00 MFSID1: DB 0 ;ON SIDE ONE FLAG ;DISK PARAMETER HEADERS ;---------------------- ; B31C 0000 DPHMF0: DW 0 ;TRANSLATION TABLE ADDRESS B31E 0000 DW 0 B320 0000 DW 0 B322 0000 DW 0 B324 D8BB DW DIRBUF ;DIRECTORY BUFFER B326 5CB3 DW DPBMF0 ;POINTER TO DISK PARAMETER BLOCK B328 84BE DW CSVMF0 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B32A B4BE DW ALVMF0 ;SCRATCH PAD FOR ALLOCATION INFORMATION ; B32C 0000 DPHMF1: DW 0 ;TRANSLATION TABLE ADDRESS B32E 0000 DW 0 B330 0000 DW 0 B332 0000 DW 0 B334 D8BB DW DIRBUF ;DIRECTORY BUFFER B336 6CB3 DW DPBMF1 ;POINTER TO DISK PARAMETER BLOCK B338 CDBE DW CSVMF1 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B33A FDBE DW ALVMF1 ;SCRATCH PAD FOR ALLOCATION INFORMATION ; B33C 0000 DPHMF2: DW 0 ;TRANSLATION TABLE ADDRESS B33E 0000 DW 0 B340 0000 DW 0 B342 0000 DW 0 B344 D8BB DW DIRBUF ;DIRECTORY BUFFER B346 7CB3 DW DPBMF2 ;POINTER TO DISK PARAMETER BLOCK B348 16BF DW CSVMF2 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B34A 46BF DW ALVMF2 ;SCRATCH PAD FOR ALLOCATION INFORMATION ; B34C 0000 DPHMF3: DW 0 ;TRANSLATION TABLE ADDRESS B34E 0000 DW 0 B350 0000 DW 0 B352 0000 DW 0 B354 D8BB DW DIRBUF ;DIRECTORY BUFFER B356 8CB3 DW DPBMF3 ;POINTER TO DISK PARAMETER BLOCK B358 5FBF DW CSVMF3 ;SCRATCH PAD AREA FOR CHECKING CHANGED DISKS B35A 8FBF DW ALVMF3 ;SCRATCH PAD FOR ALLOCATION INFORMATION ;DISK PARAMETER BUFFERS ;---------------------- ; B35C 1400 DPBMF0: DW 20 ;SPT B35E 03 DB 3 ;BSH B35F 07 DB 7 ;BLM B360 00 DB 0 ;EXM B361 4F00 DW 79 ;DSM CP/M MACRO ASSEM 2.0 #054 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B363 3F00 DW 63 ;DRM B365 C0 DB 0C0H ;AL0 B366 00 DB 0 ;AL1 B367 1000 DW 16 ;CKS B369 0300 DW 3 ;OFF B36B 02 DB 2 ;SECSIZ ; B36C 2800 DPBMF1: DW 40 ;SPT B36E 03 DB 3 ;BSH B36F 07 DB 7 ;BLM B370 00 DB 0 ;EXM B371 A400 DW 164 ;DSM B373 3F00 DW 63 ;DRM B375 C0 DB 0C0H ;AL0 B376 00 DB 0 ;AL1 B377 1000 DW 16 ;CKS B379 0200 DW 2 ;OFF B37B 03 DB 3 ;SECSIZ ; B37C 2800 DPBMF2: DW 40 ;SPT B37E 04 DB 4 ;BSH B37F 0F DB 15 ;BLM B380 01 DB 1 ;EXM B381 5100 DW 81 ;DSM B383 3F00 DW 63 ;DRM B385 80 DB 080H ;AL0 B386 00 DB 0 ;AL1 B387 1000 DW 16 ;CKS B389 0200 DW 2 ;OFF B38B 03 DB 3 ;SECSIZ ; B38C 2800 DPBMF3: DW 40 ;SPT B38E 04 DB 4 ;BSH B38F 0F DB 15 ;BLM B390 01 DB 1 ;EXM B391 A900 DW 169 ;DSM B393 3F00 DW 63 ;DRM B395 80 DB 080H ;AL0 B396 00 DB 0 ;AL1 B397 1000 DW 16 ;CKS B399 0200 DW 2 ;OFF B39B 03 DB 3 ;SECSIZ ; B39C 2800 DPBMF4: DW 40 ;SPT B39E 04 DB 4 ;BSH B39F 0F DB 15 ;BLM B3A0 01 DB 1 ;EXM B3A1 5E00 DW 94 ;DSM B3A3 7F00 DW 127 ;DRM B3A5 C0 DB 0C0H ;AL0 B3A6 00 DB 0 ;AL1 B3A7 2000 DW 32 ;CKS B3A9 0200 DW 2 ;OFF B3AB 04 DB 4 ;SECSIZ B3AC 2800 DPBMF5: DW 40 ;SPT CP/M MACRO ASSEM 2.0 #055 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B3AE 04 DB 4 ;BSH B3AF 0F DB 15 ;BLM B3B0 01 DB 1 ;EXM B3B1 C200 DW 194 ;DSM B3B3 BF00 DW 191 ;DRM B3B5 E0 DB 0E0H ;AL0 B3B6 00 DB 0 ;AL1 B3B7 3000 DW 48 ;CKS B3B9 0200 DW 2 ;OFF B3BB 04 DB 4 ;SECSIZ PAGE CP/M MACRO ASSEM 2.0 #056 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ENDIF ;END OF 5" DRIVE'S UNIQUE CODE SECTION ;===================================================================== ;COMMON ROUTINES FOR THE DJDMA WITH 8 AND 5.25" DRIVES ;===================================================== ; ;SET UP THE DISK CONTROLLER ;-------------------------- ; B3BC 215000 DMINIT: LXI H,DMCHAN ;SEE IF THE CONTROLLER WILL HALT B3BF 3625 MVI M,DMHALT B3C1 23 INX H B3C2 3600 MVI M,0 B3C4 D3EF OUT DMKICK ;START CONTROLLER B3C6 110000 LXI D,0 ;SET UP TIMEOUT COUNTER B3C9 7E DMINWT: MOV A,M ;TEST FOR STATUS RETURNED B3CA B7 ORA A B3CB C2D6B3 JNZ DMIOK ;CONTROLLER HAS RESPONDED B3CE 1B DCX D ;BUMP TIMEOUT COUNTER B3CF 7A MOV A,D B3D0 B3 ORA E B3D1 C2C9B3 JNZ DMINWT B3D4 37 STC ;SET ERROR FLAG B3D5 C9 RET B3D6 CD23B4 DMIOK: CALL DMPARM ;SET THE DRIVE PARAMETERS B3D9 21A8B4 LXI H,DMSETU ;SET MORE PARAMETERS B3DC 110600 LXI D,6 B3DF CD93B4 CALL DMDOIT B3E2 C9 RET ;RETURN NO ERROR (C RESET) ;DRIVE SELECT TWO. ;----------------- ; 1) 8" DRIVES ARE DRIVES 0-3, 5.25" DRIVES ARE DRIVES 4-7. ; B3E3 32BEB4 DMSEL2: STA DMDRIV ;SAVE THE DRIVE NAME B3E6 32B0B4 STA DMGSTA+1 ;(FOR SENSE STATUS COMMAND) B3E9 CD80B4 CALL DMSPTR ;GET STATUS POINTER B3EC 7E MOV A,M B3ED 32D4B4 STA DMPSTA ;SAVE CURRENT STATUS B3F0 C9 RET ;SEEK TO TRACK 0 ;--------------- ; B3F1 CD91AF DMHOME: CALL DMDPAR ;GET THE DRIVE PARAMETER ADDRESS B3F4 23 INX H B3F5 3600 MVI M,0 ;DECALIBRATE THE DRIVE B3F7 CD23B4 CALL DMPARM B3FA C9 RET ;SET TRACK ;--------- ; B3FB 79 DMSEEK: MOV A,C ;SET UP DJDMA TRACK B3FC 32BCB4 STA DMTRCK CP/M MACRO ASSEM 2.0 #057 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B3FF C9 RET ;SET SECTOR ;---------- ; B400 79 DMSEC: MOV A,C ;SET THE SECTOR NUMBER + SIDE BIT B401 B0 ORA B B402 32BDB4 STA DMSCTR B405 C9 RET ;SET THE DMA POINTER ;------------------- ; B406 60 DMDMA: MOV H,B ;SET THE DMA ADDRESS B407 69 MOV L,C B408 22B8B4 SHLD DMCDMA B40B C9 RET ;READ/WRITE A SECTOR. ;-------------------- ; 1) NOTICE THAT THE CARRY IS RETURNED SET IF THERE WERE ANY ; ERRORS OTHERWISE IT IS RETURNED CLEARED. ALSO NOTICE THAT ; THE ACCM IS EQUAL TO THE DJDMA RETURNED STATUS (E.G. 40=NO_ERROR) ; B40C 3E20 DMREAD: MVI A,DMRSEC ;READ SECTOR COMMAND B40E C313B4 JMP DMSRW B411 3E21 DMWRIT: MVI A,DMWSEC ;WRITE SECTOR COMMAND B413 32BBB4 DMSRW: STA DMRWCM ;SET THE DISK COMMAND BYTE B416 21B7B4 LXI H,DMRDWR ;READ/WRITE COMMAND CHANNEL ADDRESS B419 110A00 LXI D,10 B41C CD8AB4 CALL DMCMD ;DO THE READ/WRITE B41F 37 STC ;IF (ERROR EQ TRUE) B420 C0 RNZ ; RETURN (CARRY_SET=ERROR) B421 3F CMC ;ELSE B422 C9 RET ; RETURN (CARRY_CLEARED=NO_ERROR) ;SET FLOPPY DRIVE PARAMETERS. ;---------------------------- ; 1) THIS ROUTINE INSPECTS THE DPARAM TABLE AND IF THE A DRIVE ; HAS NOT BEEN CALIBRATED PREVIOUSLY THEN THAT DRIVES TRACK ; COUNT, STEPPING RATE, AND HEAD SETTLE TIME ARE LOADED. ; B423 3E08 DMPARM: MVI A,8 ;EIGHT DRIVES B425 114013 LXI D,1340H ;CONTROLLERS DRIVE PARAMETER ADDRESS B428 2142AF LXI H,DPARAM+1 ;CBIOS'S DRIVE PARAMETER TABLE B42B F5 DMSTR0: PUSH PSW ;SAVE THE DRIVE COUNT B42C 7E MOV A,M ;LOAD FLAGS B42D B7 ORA A ;DOES THE DRIVE NEED TO BE CALIBRATED? B42E C253B4 JNZ DMSTR1 ;NO, DO NOT FIDDLE AROUND B431 E5 PUSH H ;SAVE THE PARAMETER TABLE POINTER B432 D5 PUSH D ;SAVE THE CONTROLLERS TABLE POINTER B433 35 DCR M ;SET TO CALIBRATED MODE (0FFH) B434 2B DCX H ;BACK UP TO THE TRACK SIZE BYTE CP/M MACRO ASSEM 2.0 #058 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B435 22C3B4 SHLD DMNTRK ;SET THE NUMBER OF TRACKS POINTER B438 23 INX H B439 23 INX H B43A 22CBB4 SHLD DMSPAR ;SET THE STEPPING CONSTANTS POINTER B43D EB XCHG ;SET THE LOCAL PARAMETER TABLE POINTER B43E 22C8B4 SHLD DMLOC0 B441 23 INX H ;OFFSET TO THE STEPPING PARAMETERS B442 23 INX H B443 23 INX H B444 23 INX H B445 22D0B4 SHLD DMLOC1 B448 21C2B4 LXI H,DMWCON ;WRITE THE DRIVE CONSTANTS OUT B44B 111100 LXI D,17 ;HALT STATUS OFFSET B44E CD93B4 CALL DMDOIT B451 D1 POP D ;RETRIEVE THE TABLE POINTERS B452 E1 POP H B453 010A00 DMSTR1: LXI B,10 ;BUMP PARAMETER TABLE POINTER B456 09 DAD B B457 EB XCHG B458 011000 LXI B,16 ;BUMP CONTROLLER TABLES POINTER B45B 09 DAD B B45C EB XCHG B45D F1 POP PSW ;RETRIEVE DRIVE COUNT B45E 3D DCR A ;BUMP COUNT B45F C22BB4 JNZ DMSTR0 ;SET UP NEXT DRIVE B462 C9 RET ;RETURN THE SELECTED DRIVE'S STATUS ;---------------------------------- ; 1) THE STATUS IS RETURNED IN THE (A) REGISTER IN THE FOLLOWING FORM: ; ; BIT=1 IF 7 6 5 4 3 2 1 0 ; -------- ^ ^ ^ ^ ^ ^ ^ ^ ; RESERVED ---------------+ | | | | | | | ; ON TRACK 0 TRACK ZERO ----------------+ | | | | | | ; DBL DENS DOUBLE DENSITY ---------------+ | | | | | ; WRAP TRK TRACK WRAP FLAG -----------------+ | | | | ; 2-SIDED DOUBLE SIDED MEDIA -----------------+ | | | ; HARD SECT HARD SECTORED MEDIA -------------------+ | | ; SECTOR SIZE MSB --------------------------+ | ; SECTOR SIZE LSB -----------------------------+ ; 00 = 128, 01 = 256, 10 = 512, 11 = 1024 BYTES. ; ; 2) 5" DRIVES ARE ALWAYS REPORTED AS BEING SINGLE SIDED (BECAUSE THE ; HARDWARE DOUBLE SIDED LINE IS NOT IMPLEMENTED). ; B463 21AFB4 DMSTAT: LXI H,DMGSTA ;GET CONTROLLER STATUS COMMAND B466 110700 LXI D,7 B469 CD8AB4 CALL DMCMD B46C 37 STC ;SET THE ERROR FLAG JUST IN CASE B46D C0 RNZ ;RETURN ON ERROR ;76543210 (STATUS REGISTER BITS) B46E 3AB1B4 LDA DMSTA1 ;?????H?? DOUBLE DENSITY, HARD SECTORED CP/M MACRO ASSEM 2.0 #059 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B471 E612 ANI 00010010B ;---D--H- B473 6F MOV L,A ;---D--H- B474 3AB3B4 LDA DMSTA3 ;??0??D?? TRACK 0, DOUBLE SIDED BITS B477 E624 ANI 00100100B ;--0--S-- B479 B5 ORA L ;--0D-SH- B47A 07 RLC ;-0D-SH-- B47B 21B2B4 LXI H,DMSTA2 ;-0D-SH-- B47E B6 ORA M ;-0D-SHXX SECTOR SIZE CODE B47F C9 RET ;RETURN NO ERROR (C RESET) ;RETURN A POINTER TO THE CURRENT DRIVES STATUS BYTE ;-------------------------------------------------- ; B480 11D5B4 DMSPTR: LXI D,DMSTBL ;STATUS BYTE TABLE B483 2ABEB4 LHLD DMDRIV ;CURRENT DRIVE INTO L B486 2600 MVI H,0 B488 19 DAD D B489 C9 RET ;EXECUTE A DJDMA COMMAND, RETURN COMMAND STATUS RESULTS ;------------------------------------------------------ ; 1) ENTER THIS ROUTINE WITH: ; DE = OFFSET TO THE HALT STATUS ; HL = POINTER TO THE START OF THE COMMAND ; 2) THIS ROUTINE RETURNS: ; A = COMMAND STATUS ; ZF = SET ON 40 COMMAND STATUS VALUE ; B48A CD93B4 DMCMD: CALL DMDOIT ;DO THE DESIRED COMMAND B48D 2B DCX H ;BACK UP TO THE COMMAND STATUS BYTE B48E 2B DCX H B48F 7E MOV A,M ;LOAD THE COMMAND STATUS BYTE B490 FE40 CPI 40H ;SET FLAGS B492 C9 RET ;EXECUTE A DJDMA COMMAND, NO COMMAND STATUS IS RETURNED ;------------------------------------------------------ ; 1) ENTER THIS ROUTINE WITH: ; DE = OFFSET TO THE HALT STATUS ; HL = POINTER TO THE START OF THE COMMAND ; 2) THIS ROUTINE RETURNS NO STATUS ; B493 3E26 DMDOIT: MVI A,BRACHA ;BRANCH CHANNEL COMMAND B495 325000 STA DMCHAN B498 225100 SHLD DMCHAN+1 ;LOAD COMMAND VECTOR B49B AF XRA A ;CLEAR EXTENDED ADDRESS B49C 325300 STA DMCHAN+3 B49F 19 DAD D ;OFFSET TO THE HALT STATUS B4A0 77 MOV M,A ;CLEAR THE HALT STATUS INDICATOR B4A1 D3EF OUT DMKICK ;START THE CONTROLLER B4A3 B6 DMWAIT: ORA M ;WAIT FOR THE OPERATION COMPLETE STATUS B4A4 CAA3B4 JZ DMWAIT B4A7 C9 RET ;DJDMA COMMMAND CHANNEL ROUTINES ;=============================== CP/M MACRO ASSEM 2.0 #060 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; ;SET THE LOGICAL DRIVE ASSIGNMENTS AND THE RETRY COUNT ;----------------------------------------------------- ; B4A8 2E DMSETU: DB DMSETL ;SET THE LOGICAL DRIVE ASSIGNMENTS B4A9 00 DB 0 ;DRIVES 0-3 ARE 8", 4-7 ARE 5.25" B4AA 00 DB 0 ;OLD STATUS B4AB 28 DB DMSERR ;SET THE ERROR RETRY COUNT TO 0 B4AC 01 DB 1 ;ONE RETRY (THE CBIOS DOES TEN) B4AD 25 DB DMHALT B4AE 00 DB 0 ;GET A DRIVE'S STATUS ;--------------------- ; B4AF 22 DMGSTA: DB DMSTAC ;CONTROLLER/DRIVE STATUS COMMAND B4B0 00 DB 0 ;DRIVE TO BE SENSED B4B1 00 DMSTA1: DB 0 ;STATUS BYTE 1 B4B2 00 DMSTA2: DB 0 ;STATUS BYTE 2 B4B3 00 DMSTA3: DB 0 ;STATUS BYTE 3 B4B4 00 DB 0 ;RETURN STATUS B4B5 25 DB DMHALT B4B6 00 DB 0 ;SET THE DMA ADDRESS AND THEN DO A READ OR A WRITE ;------------------------------------------------- ; B4B7 23 DMRDWR: DB DMSDMA ;SET DMA ADDRESS COMMAND B4B8 0000 DMCDMA: DW 0 ;DMA ADDRESS B4BA 00 DB 0 ;X-ADDR B4BB 00 DMRWCM: DB 0 ;READ/WRITE COMMAND FILLED IN B4BC 00 DMTRCK: DB 0 ;TRACK B4BD 00 DMSCTR: DB 0 ;SECTOR B4BE 00 DMDRIV: DB 0 ;DRIVE B4BF 00 DB 0 ;STATUS B4C0 25 DB DMHALT ;CONTROLLER HALT COMMAND B4C1 00 DB 0 ;STATUS ;WRITE A DRIVE'S CONSTANTS INTO THE CONTROLLER'S MEMORY ;------------------------------------------------------ ; B4C2 A1 DMWCON: DB WRITEM ;WRITE TRACK SIZE B4C3 0000 DMNTRK: DW 0 ;NUMBER OF TRACKS + DESYNC B4C5 00 DB 0 ;X-ADDRESS B4C6 0200 DW 2 ;TWO BYTES B4C8 0000 DMLOC0: DW 0 ;LOCAL CONTROLLER ADDRESS B4CA A1 DB WRITEM ;WRITE STEPPING RATE DATA B4CB 0000 DMSPAR: DW 0 ;POINTER TO THE STEPPING PARAMETERS B4CD 00 DB 0 B4CE 0800 DW 8 B4D0 0000 DMLOC1: DW 0 B4D2 25 DB DMHALT ;CONTROLLER HALT B4D3 00 DB 0 ;STATUS ;DRIVER VARIABLES ;---------------- CP/M MACRO ASSEM 2.0 #061 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; B4D4 00 DMPSTA: DB 0 ;PHYSICAL STATUS FOR THE CURRENT DRIVE B4D5 0000000000DMSTBL: DB 0,0,0,0,0,0,0,0 ;PHYSICAL STATUS BYTES FOR EACH DRIVE ENDIF ;END OF DJDMA ROUTINES PAGE CP/M MACRO ASSEM 2.0 #062 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF MAXFD NE 0 ;INCLUDE DISCUS 2D ? ;*********************************************************** ; BEGIN THE DJ2DB DRIVER (DDRV2) ;******************************* ; ;DJ2DB EQUATES ;------------- ; 1) THE FOLLOWING EQUATES RELATE THE MORROW DESIGNS 2D/B ; CONTROLLER. IF THE CONTROLLER IS NON STANDARD (0F800H) ; ONLY THE FDORIG EQUATE NEED BE CHANGED. ; ; --NOTE-- 'FDORIG' EQUATE MOVED TO TOP OF SOURCE MODULE ;FDORIG EQU 0XXXXH ;ORIGIN OF DISK JOCKEY PROM FDBOOT EQU FDORIG+00H ;DISK JOCKEY 2D INITIALIZATION FDCIN EQU FDORIG+03H ;DISK JOCKEY 2D CHARACTER INPUT ROUTINE FDCOUT EQU FDORIG+06H ;DISK JOCKEY 2D CHARACTER OUTPUT ROUTINE FDHOME EQU FDORIG+09H ;DISK JOCKEY 2D TRACK ZERO SEEK FDSEEK EQU FDORIG+0CH ;DISK JOCKEY 2D TRACK SEEK ROUTINE FDSEC EQU FDORIG+0FH ;DISK JOCKEY 2D SET SECTOR ROUTINE FDDMA EQU FDORIG+12H ;DISK JOCKEY 2D SET DMA ADDRESS FDREAD EQU FDORIG+15H ;DISK JOCKEY 2D READ ROUTINE FDWRITE EQU FDORIG+18H ;DISK JOCKEY 2D WRITE ROUTINE FDSEL EQU FDORIG+1BH ;DISK JOCKEY 2D SELECT DRIVE ROUTINE FDTSTAT EQU FDORIG+21H ;DISK JOCKEY 2D TERMINAL STATUS ROUTINE FDSTAT EQU FDORIG+27H ;DISK JOCKEY 2D STATUS ROUTINE FDERR EQU FDORIG+2AH ;DISK JOCKEY 2D ERROR, FLASH LED FDDEN EQU FDORIG+2DH ;DISK JOCKEY 2D SET DENSITY ROUTINE FDSIDE EQU FDORIG+30H ;DISK JOCKEY 2D SET SIDE ROUTINE FDRAM EQU FDORIG+400H ;DISK JOCKEY 2D RAM ADDRESS DBLSID EQU 20H ;SIDE BIT FROM CONTROLLER IO EQU FDORIG+3F8H ;START OF I/O REGISTERS DREG EQU IO+1 CMDREG EQU IO+4 CLRCMD EQU 0D0H ;***************************************************************; ; ; ; DEVICE SPECIFICATION TABLE FOR THE DISK JOCKEY 2D/B ; ; ; ;***************************************************************; FDDST: DB MAXFD ;NUMBER OF LOGICAL DRIVES DW FDWARM ;WARM BOOT DW FDTRAN ;SECTOR TRANSLATION DW FDLDRV ;SELECT DRIVE 1 DW FDSEL2 ;SELECT DRIVE 2 DW FDLHOME ;HOME DRIVE DW FDSEEK ;SEEK TO SPECIFIED TRACK DW FDSSEC ;SET SECTOR DW FDDMA ;SET DMA ADDRESS DW FDREAD ;READ A SECTOR DW FDWRITE ;WRITE A SECTOR DW NOBAD ;NO BAD SECTOR MAP CP/M MACRO ASSEM 2.0 #063 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF FDORDER NE 1 ;NO WARM BOOT POSSIBLE ;DJ2D/B WARM BOOT DUMMY ;--------------------------- ; 1) IF DJ2D/B IS NOT DRIVE A (I.E. FDORDER NOT EQUAL 1) THEN ; IT IS NOT POSSIBLE TO WARM BOOT FROM DJ2D/B. SO ROUTINE NOT NEEDED. ; FDWARM: RET ;RETURN IF CALLED ELSE ; DJ2D/B FLOPPY DISK WARM BOOT LOADER ;------------------------------------ ; FDWARM: MOV C,A CALL FDSEL ;SELECT DRIVE A MVI C,0 ;SELECT SIDE 0 CALL FDSIDE WRMFAIL:CALL FDHOME ;TRACK 0, SINGLE DENSITY JC WRMFAIL ;LOOP IF ERROR ;THE NEXT BLOCK OF CODE RE-INITIALIZES ; THE WARM BOOT LOADER FOR TRACK 0 MVI A,5-2 ;INITIALIZE THE SECTOR TO READ - 2 STA NEWSEC LXI H,CCP-100H ;FIRST REVOLUTION DMA - 100H SHLD NEWDMA ;LOAD ALL OF TRACK 0 T0BOOT: MVI A,5-2 ;FIRST SECTOR - 2 NEWSEC EQU $-1 INR A ;UPDATE SECTOR # INR A CPI 27 ;SIZE OF TRACK IN SECTORS + 1 JC NOWRAP ;SKIP IF NOT AT END OF TRACK JNZ T1BOOT ;DONE WITH THIS TRACK SUI 27-6 ;BACK UP TO SECTOR 6 LXI H,CCP-80H ;MEMORY ADDRESS OF SECTOR - 100H SHLD NEWDMA NOWRAP: STA NEWSEC ;SAVE THE UPDATED SECTOR # MOV C,A CALL FDSEC ;SET UP THE SECTOR LXI H,CCP-100H ;MEMORY ADDRESS OF SECTOR - 100H NEWDMA EQU $-2 LXI D,100H ;UPDATE DMA ADDRESS DAD D NOWRP: SHLD NEWDMA ;SAVE THE UPDATED DMA ADDRESS MOV B,H MOV C,L CALL FDDMA ;SET UP THE NEW DMA ADDRESS LXI B,RETRIES*100H+0;MAXIMUM # OF ERRORS, TRACK # WRMFRED:PUSH B CALL FDSEEK ;SET UP THE PROPER TRACK CALL FDREAD ;READ THE SECTOR POP B JNC T0BOOT ;CONTINUE IF NO ERROR CP/M MACRO ASSEM 2.0 #064 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DCR B JNZ WRMFRED ;KEEP TRYING IF ERROR JMP FDERR ;TOO MANY ERRORS, FLASH THE LIGHT ;LOAD TRACK 1, SECTOR 1, SECTOR 3 (PARTIAL), SECTOR 2 (1024 BYTE SECTORS) T1BOOT: MVI C,1 ;TRACK 1 CALL FDSEEK LXI B,CCP+0B00H ;ADDRESS FOR SECTOR 1 LXI D,10*100H+1 ;RETRY COUNT + SECTOR 1 CALL WRMREAD LXI B,CCP+0F00H ;ADDRESS FOR SECTOR 2 LXI D,10*100H+3 ;RETRY COUNT + SECTOR 3 CALL WRMREAD LXI B,0300H ;SIZE OF PARTIAL SECTOR LXI D,CCP+1300H ;ADDRESS FOR SECTOR 3 LXI H,CCP+0F00H ;ADDRESS OF SECTOR 3 WRMCPY: MOV A,M ;GET A BYTE AND STAX D ; SAVE IT INX D ;BUMP POINTERS INX H DCX B ;BUMP COUNTER MOV A,B ;CHECK IF DONE ORA C JNZ WRMCPY ; IF NOT, LOOP LXI B,CCP+0F00H ;ADDRESS FOR SECTOR 2 LXI D,10*100H+2 ;RETRY COUNT + SECTOR 2 CALL WRMREAD XRA A ;CLEAR ERROR INDICATOR RET WRMREAD:PUSH D CALL FDDMA ;SET DMA ADDRESS POP B CALL FDSEC ;SET SECTOR WRMFRD: PUSH B ;SAVE ERROR COUNT CALL FDREAD ;READ A SECTOR JC WRMERR ;DO RETRY STUFF ON ERROR CALL FDSTAT ;SECTOR SIZE MUST BE 1024 BYTES ANI 0CH ;MASK LENGTH BITS SUI 0CH ;CARRY (ERROR) WILL BE SET IF < 0C0H WRMERR: POP B ;FETCH RETRY COUNT RNC ;RETURN IF NO ERROR DCR B ;BUMP ERROR COUNT JNZ WRMFRD JMP FDERR ;ERROR, FLASH THE LIGHT ENDIF ;END OF DJ2D/B WARM BOOT ROUTINE ;DJ2D/B SECTOR TRANSLATE ROUTINE ;------------------------------- ; CP/M MACRO ASSEM 2.0 #065 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs FDTRAN: INX B PUSH D ;SAVE TABLE ADDRESS PUSH B ;SAVE SECTOR # CALL FDGET ;GET DPH FOR CURRENT DRIVE LXI D,10 ;LOAD DPH POINTER DAD D MOV A,M INX H MOV H,M MOV L,A MOV A,M ;GET # OF CP/M SECTORS/TRACK ORA A ;CLEAR CARRY RAR ;DIVIDE BY TWO SUB C ;SUBTRACT SECTOR NUMBER PUSH PSW ;SAVE ADJUSTED SECTOR JM SIDETWO SIDEA: POP PSW ;DISCARD ADJUSTED SECTOR POP B ;RESTORE SECTOR REQUESTED POP D ;RESTORE ADDRESS OF XLT TABLE SIDEONE:XCHG ;HL <- &(TRANSLATION TABLE) DAD B ;BC = OFFSET INTO TABLE MOV L,M ;HL <- PHYSICAL SECTOR MVI H,0 RET SIDETWO:CALL FDGSID ;CHECK OUT NUMBER OF SIDES JZ SIDEA ;SINGLE SIDED POP PSW ;RETRIEVE ADJUSTED SECTOR POP B CMA ;MAKE SECTOR REQUEST POSITIVE INR A MOV C,A ;MAKE NEW SECTOR THE REQUESTED SECTOR POP D CALL SIDEONE MVI A,80H ;SIDE TWO BIT ORA H ; AND SECTOR MOV H,A RET ;DJ2D/B FIRST TIME DRIVE SELECT ROUTINE ;-------------------------------------- ; FDLDRV: STA FDLOG ;SAVE LOGICAL DRIVE MOV C,A ;SAVE DRIVE # MVI A,0 ;HAVE THE FLOPPIES BEEN ACCESSED YET ? FLOPFLG EQU $-1 ANA A JNZ FLOPOK MVI B,17 ;FLOPPIES HAVN'T BEEN ACCESSED LXI H,FDBOOT ;CHECK IF 2D CONTROLLER IS INSTALLED MVI A,(JMP) CLOPP: CMP M ;MUST HAVE 17 JUMPS JNZ ZRET INX H INX H CP/M MACRO ASSEM 2.0 #066 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs INX H DCR B JNZ CLOPP LXI D,FDINIT ;INITIALIZATION SEQUENCE LXI H,FDORIG+7E2H ;LOAD ADDRESS LXI B,30 ;BYTE COUNT CALL MOVBYT ;LOAD CONTROLLER RAM MVI A,0FFH ;START 1791 STA DREG MVI A,CLRCMD ;1791 RESET STA CMDREG MVI A,1 ;SET 2D INITIALIZED FLAG STA FLOPFLG FLOPOK: CALL FLUSH ;FLUSH BUFFER SINCE WE ARE USING IT LDA FDLOG ;SELECT NEW DRIVE MOV C,A CALL FDSEL CALL FDLHOME ;RECALIBRATE THE DRIVE LXI H,1 ;SELECT SECTOR 1 OF TRACK 2 SHLD TRUESEC INX H SHLD CPMTRK XRA A ;MAKE SURE WE ARE DOING A READ STA RDWR CALL FILL ;FILL IN BUFFER WITH SECTOR JC ZRET ;TEST FOR ERROR RETURN CALL FDSTAT ;GET STATUS ON CURRENT DRIVE STA FDLDST ;SAVE DRIVE STATUS ANI 0CH ;MASK IN SECTOR SIZE BITS PUSH PSW ;USED TO SELECT A DPB RAR LXI H,XLTS ;TABLE OF XLT ADDRESSES MOV E,A MVI D,0 DAD D PUSH H ;SAVE POINTER TO PROPER XLT CALL FDGET ;GET POINTER TO PROPER DPH POP D LXI B,2 ;COPY XLT POINTER INTO DPH CALL MOVBYT LXI D,8 ;OFFSET TO DPB POINTER IN DPH DAD D ;HL <- &DPH.DPB PUSH H CALL FDGSID ;GET POINTER TO SIDE FLAG TABLE ENTRY LDA FDLDST ;GET DRIVE STATUS ANI DBLSID ;CHECK DOUBLE SIDED BIT MOV M,A ;SAVE SIDES FLAG LXI D,DPB128S ;BASE FOR SINGLE SIDED DPB'S JZ SIDEOK LXI D,DPB128D ;BASE OF DOUBLE SIDED DPB'S SIDEOK: XCHG POP D ;(HL) -> DPB BASE, (DE) -> &DPH.DPB POP PSW ;OFFSET TO CORRECT DPB RAL RAL ;MAKE 0, 10, 20, 30 CP/M MACRO ASSEM 2.0 #067 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs MOV C,A MVI B,0 ;MAKE OFFSET DAD B ;(HL) IS NOW A DPB POINTER XCHG ;PUT PROPER DPB ADDRESS IN DPH.DPB MOV M,E INX H MOV M,D LXI H,15 ;OFFSET TO DPB.SIZ DAD D MOV C,M ;FETCH SECTOR SIZE CODE FDGET: LDA FDLOG ;RETURN PROPER DPH LXI D,DPHFD0 JMP RETDPH ;DJ2D/B NON-INITIAL DRIVE SELECT ROUTINE ;--------------------------------------- ; FDSEL2: STA FDLOG MOV C,A JMP FDSEL ;DJ2D/B HOME DRIVE ROUTINE ;------------------------- ; FDLHOME:MVI C,0 ;SELECT SIDE 0 CALL FDSIDE JMP FDHOME ;DO ACTUAL HOME ;DJ2D/B SET SECTOR ROUTINE ;------------------------- ; FDSSEC: PUSH B ;SAVE SECTOR NUMBER MOV A,B ;CHECK SIDE SELECT BIT RLC ;MOVE HIGH BIT TO BIT ZERO ANI 1 MOV C,A CALL FDSIDE ;CALL SELECT SIDE 0 = SIDE A, 1 = SIDE B POP B JMP FDSEC FDGSID: LXI H,FDLSID ;SIDE FLAG TABLE LDA FDLOG ;DRIVE NUMBER PUSH D MOV E,A ;MAKE OFFSET MVI D,0 DAD D ;OFFSET TO PROPER ENTRY POP D MOV A,M ;SET UP FLAGS ORA A RET FDINIT: DW 0 ;INITIALIZATION BYTES LOADED ONTO 2D/B DW 1800H ;HEAD LOADED TIMEOUT DW 0 ;DMA ADDRESS DB 0 ;DOUBLE SIDED FLAG DB 0 ;READ HEADER FLAG CP/M MACRO ASSEM 2.0 #068 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DB 07EH ;DRIVE SELECT CONSTANT DB 0 ;DRIVE NUMBER DB 8 ;CURRENT DISK DB 0 ;HEAD LOADED FLAG DB 9 ;DRIVE 0 PARAMETERS DB 0FFH ;DRIVE 0 TRACK ADDRESS DB 9 ;DRIVE 1 PARAMETERS DB 0FFH ;DRIVE 1 TRACK ADDRESS DB 9 ;DRIVE 2 PARAMETERS DB 0FFH ;DRIVE 2 TRACK ADDRESS DB 9 ;DRIVE 3 PARAMETERS DB 0FFH ;DRIVE 3 TRACK ADDRESS DB 9 ;CURRENT PARAMETERS DB 0 ;SIDE DESIRED DB 1 ;SECTOR DESIRED DB 0 ;TRACK DESIRED DB 0 ;HEADER IMAGE, TRACK DB 0 ;SECTOR DB 0 ;SIDE DB 0 ;SECTOR DW 0 ;CRC FDLOG: DB 0 FDLDST: DB 0 ;FLOPPY DRIVE STATUS BYTE FDLSID: REPT MAXFD DB 0FFH ;DOUBLE SIDED FLAG 0 = SINGLE, 1 = DOUBLE ENDM ENDIF PAGE CP/M MACRO ASSEM 2.0 #069 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF (MAXFD NE 0) OR (MAXDM NE 0) ;DJDMA OR DJ2DB PRESENT? ;*********************************************************************** ; BEGIN COMMON FLOPPY DISK TRANSLATION TABLES AND DPB'S ;****************************************************** ; ;SECTOR TRANSLATION POINTER TABLE ;-------------------------------- ; 1) XLTS IS A TABLE OF ADDRESS THAT POINT TO EACH OF THE XLT ; TABLES FOR EACH SECTOR SIZE. ; B4DD E5B4 XLTS: DW XLT128 ;XLT FOR 128 BYTE SECTORS B4DF 00B5 DW XLT256 ;XLT FOR 256 BYTE SECTORS B4E1 35B5 DW XLT512 ;XLT FOR 512 BYTE SECTORS B4E3 72B5 DW XLT124 ;XLT FOR 1024 BYTE SECTORS ;SECTOR TRANSLATION TABLES ;------------------------- ; ; 1) 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. ; B4E5 00 XLT128: DB 0 B4E6 01070D1319 DB 1,7,13,19,25 B4EB 050B1117 DB 5,11,17,23 B4EF 03090F15 DB 3,9,15,21 B4F3 02080E141A DB 2,8,14,20,26 B4F8 060C1218 DB 6,12,18,24 B4FC 040A1016 DB 4,10,16,22 ; B500 00 XLT256: DB 0 B501 0102131425 DB 1,2,19,20,37,38 B507 0304151627 DB 3,4,21,22,39,40 B50D 0506171829 DB 5,6,23,24,41,42 B513 0708191A2B DB 7,8,25,26,43,44 B519 090A1B1C2D DB 9,10,27,28,45,46 B51F 0B0C1D1E2F DB 11,12,29,30,47,48 B525 0D0E1F2031 DB 13,14,31,32,49,50 B52B 0F10212233 DB 15,16,33,34,51,52 B531 11122324 DB 17,18,35,36 ; B535 00 XLT512: DB 0 B536 0102030411 DB 1,2,3,4,17,18,19,20 B53E 2122232431 DB 33,34,35,36,49,50,51,52 B546 0506070815 DB 5,6,7,8,21,22,23,24 B54E 2526272835 DB 37,38,39,40,53,54,55,56 B556 090A0B0C19 DB 9,10,11,12,25,26,27,28 B55E 292A2B2C39 DB 41,42,43,44,57,58,59,60 B566 0D0E0F101D DB 13,14,15,16,29,30,31,32 B56E 2D2E2F30 DB 45,46,47,48 ; CP/M MACRO ASSEM 2.0 #070 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B572 00 XLT124: DB 0 B573 0102030405 DB 1,2,3,4,5,6,7,8 B57B 191A1B1C1D DB 25,26,27,28,29,30,31,32 B583 3132333435 DB 49,50,51,52,53,54,55,56 B58B 090A0B0C0D DB 9,10,11,12,13,14,15,16 B593 2122232425 DB 33,34,35,36,37,38,39,40 B59B 393A3B3C3D DB 57,58,59,60,61,62,63,64 B5A3 1112131415 DB 17,18,19,20,21,22,23,24 B5AB 292A2B2C2D DB 41,42,43,44,45,46,47,48 ;DISK PARAMETER BUFFERS ;---------------------- ; 1) EACH OF THE FOLLOWING TABLES DESCRIBES A DISKETTE WITH THE ; SPECIFIED CHARACTERISTICS. ; ;128 BYTE SECTORS, SINGLE DENSITY, AND SINGLE SIDED. ;--------------------------------------------------- ; B5B3 1A00 DPB128S:DW 26 ;CP/M SECTORS/TRACK B5B5 03 DB 3 ;BSH B5B6 07 DB 7 ;BLM B5B7 00 DB 0 ;EXM B5B8 F200 DW 242 ;DSM B5BA 3F00 DW 63 ;DRM B5BC C0 DB 0C0H ;AL0 B5BD 00 DB 0 ;AL1 B5BE 1000 DW 16 ;CKS B5C0 0200 DW 2 ;OFF B5C2 01 DB 1 ;128 BYTE SECTORS ; ;256 BYTE SECTORS, DOUBLE DENSITY, AND SINGLE SIDED. ;--------------------------------------------------- ; B5C3 3400 DPB256S:DW 52 ;CP/M SECTORS/TRACK B5C5 04 DB 4 ;BSH B5C6 0F DB 15 ;BLM B5C7 01 DB 1 ;EXM B5C8 F200 DW 242 ;DSM B5CA 7F00 DW 127 ;DRM B5CC C0 DB 0C0H ;AL0 B5CD 00 DB 0 ;AL1 B5CE 2000 DW 32 ;CKS B5D0 0200 DW 2 ;OFF B5D2 02 DB 2 ;256 BYTE SECTORS ; ;512 BYTE SECTORS, DOUBLE DENSITY, AND SINGLE SIDED. ;--------------------------------------------------- ; B5D3 3C00 DPB512S:DW 60 ;CP/M SECTORS/TRACK B5D5 04 DB 4 ;BSH B5D6 0F DB 15 ;BLM B5D7 00 DB 0 ;EXM B5D8 1801 DW 280 ;DSM B5DA 7F00 DW 127 ;DRM B5DC C0 DB 0C0H ;AL0 B5DD 00 DB 0 ;AL1 CP/M MACRO ASSEM 2.0 #071 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B5DE 2000 DW 32 ;CKS B5E0 0200 DW 2 ;OFF B5E2 03 DB 3 ;512 BYTE SECTORS ; ;1024 BYTE SECTORS, DOUBLE DENSITY, AND SINGLE SIDED. ;---------------------------------------------------- ; B5E3 4000 DP1024S:DW 64 ;CP/M SECTORS/TRACK B5E5 04 DB 4 ;BSH B5E6 0F DB 15 ;BLM B5E7 00 DB 0 ;EXM B5E8 2B01 DW 299 ;DSM B5EA 7F00 DW 127 ;DRM B5EC C0 DB 0C0H ;AL0 B5ED 00 DB 0 ;AL1 B5EE 2000 DW 32 ;CKS B5F0 0200 DW 2 ;OFF B5F2 04 DB 4 ;1024 BYTE SECTORS ; ;128 BYTE SECTORS, SINGLE DENSITY, AND DOUBLE SIDED. ;----------------------------------------------------; ; B5F3 3400 DPB128D:DW 52 ;CP/M SECTORS/TRACK B5F5 04 DB 4 ;BSH B5F6 0F DB 15 ;BLM B5F7 01 DB 1 ;EXM B5F8 F200 DW 242 ;DSM B5FA 7F00 DW 127 ;DRM B5FC C0 DB 0C0H ;AL0 B5FD 00 DB 0 ;AL1 B5FE 2000 DW 32 ;CKS B600 0200 DW 2 ;OFF B602 01 DB 1 ;128 BYTE SECTORS ; ;256 BYTE SECTORS, DOUBLE DENSITY, AND DOUBLE SIDED. ;--------------------------------------------------- ; B603 6800 DPB256D:DW 104 ;CP/M SECTORS/TRACK B605 04 DB 4 ;BSH B606 0F DB 15 ;BLM B607 00 DB 0 ;EXM B608 E601 DW 486 ;DSM B60A FF00 DW 255 ;DRM B60C F0 DB 0F0H ;AL0 B60D 00 DB 0 ;AL1 B60E 4000 DW 64 ;CKS B610 0200 DW 2 ;OFF B612 02 DB 2 ;256 BYTE SECTORS ; ;512 BYTE SECTORS, DOUBLE DENSITY, AND DOUBLE SIDED. ;--------------------------------------------------- ; B613 7800 DPB512D:DW 120 ;CP/M SECTORS/TRACK B615 04 DB 4 ;BSH B616 0F DB 15 ;BLM B617 00 DB 0 ;EXM CP/M MACRO ASSEM 2.0 #072 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B618 3102 DW 561 ;DSM B61A FF00 DW 255 ;DRM B61C F0 DB 0F0H ;AL0 B61D 00 DB 0 ;AL1 B61E 4000 DW 64 ;CKS B620 0200 DW 2 ;OFF B622 03 DB 3 ;512 BYTE SECTORS ; ;1024 BYTE SECTORS, DOUBLE DENSITY, AND DOUBLE SIDED. ;---------------------------------------------------- ; B623 8000 DP1024D:DW 128 ;CP/M SECTORS/TRACK B625 04 DB 4 ;BSH B626 0F DB 15 ;BLM B627 00 DB 0 ;EXM B628 5702 DW 599 ;DSM B62A FF00 DW 255 ;DRM B62C F0 DB 0F0H ;AL0 B62D 00 DB 0 ;AL1 B62E 4000 DW 64 ;CKS B630 0200 DW 2 ;OFF B632 04 DB 4 ;1024 BYTE SECTORS ENDIF PAGE CP/M MACRO ASSEM 2.0 #073 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF MAXMW NE 0 ;HDDMA CONTROLLER PRESENT ? ;********************************************************** ; BEGIN THE HDDMA DRIVER (DDRV3) ;******************************* ; ;HDDMA EQUATES ;============= ; ;SPECIFICATIONS FOR A SEAGATE TECHNOLOGY 506 IF ST506 CYL EQU 153 ;NUMBER OF CYLINDERS HEADS EQU 4 ;NUMBER OF HEADS PER CYLINDER PRECOMP EQU 64 ;CYLINDER TO START WRITE PRECOMENSATION LOWCURR EQU 128 ;CYLINDER TO START LOW CURRENT STEPDLY EQU 30 ;STEP DELAY (0-12.7 MILLISECONDS) STEPRCL EQU 30 ;RECALIBRATE STEP DELAY HEADDLY EQU 0 ;SETTLE DELAY (0-25.5 MILLISECONDS) ENDIF ;SPECIFICATIONS FOR A SEAGATE ST412 IF ST412 CYL EQU 306 ;NUMBER OF CYLINDERS HEADS EQU 4 ;NUMBER OF HEADS PER CYLINDER PRECOMP EQU 128 ;CYLINDER TO START WRITE PRECOMENSATION LOWCURR EQU 128 ;CYLINDER TO START LOW CURRENT STEPDLY EQU 0 ;STEP DELAY (0-12.7 MILLISECONDS) STEPRCL EQU 30 ;RECALIBRATE STEP DELAY HEADDLY EQU 0 ENDIF ;SPECIFICATIONS FOR AN CMI 5619 IF CM5619 CYL EQU 306 ;NUMBER OF CYLINDERS HEADS EQU 6 ;NUMBER OF HEADS PER CYLINDER PRECOMP EQU 128 ;CYLINDER TO START WRITE PRECOMENSATION LOWCURR EQU 128 ;CYLINDER TO START LOW CURRENT STEPDLY EQU 2 ;STEP DELAY (0-12.7 MILLISECONDS) STEPRCL EQU 30 ;RECALIBRATE STEP DELAY HEADDLY EQU 0 ENDIF SECTSIZ EQU 7 ;SECTOR SIZE CODE (MUST BE 7 FOR THIS CBIOS) ; 0 = 128 BYTE SECTORS ; 1 = 256 BYTE SECTORS ; 3 = 512 BYTE SECTORS ; 7 = 1024 BYTE SECTORS (DEFAULT) ; F = 2048 BYTE SECTORS ;DEFINE CONTROLLER COMMANDS DMAREAD EQU 0 ;READ SECTOR DMAWRIT EQU 1 ;WRITE SECTOR DMARHED EQU 2 ;FIND A SECTOR DMAWHED EQU 3 ;WRITE HEADERS (FORMAT A TRACK) DMALCON EQU 4 ;LOAD DISK PARAMETERS CP/M MACRO ASSEM 2.0 #074 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DMASSTA EQU 5 ;SENSE DISK DRIVE STATUS DMANOOP EQU 6 ;NULL CONTROLLER OPERATION RESET EQU 54H ;RESET CONTROLLER ATTN EQU 55H ;SEND A CONTROLLER ATTENTION CHAN EQU 50H ;DEFAULT CHANNEL ADDRESS STEPOUT EQU 10H ;STEP DIRECTION OUT STEPIN EQU 0 ;STEP DIRECTION IN BAND1 EQU 40H ;NO PRECOMP, HIGH CURRENT BAND2 EQU 0C0H ;PRECOMP, HIGH CURRENT BAND3 EQU 80H ;PRECOMP, LOW CURRENT TRACK0 EQU 1 ;TRACK ZERO STATUS WFLT EQU 2 ;WRITE FAULT FROM DRIVE DREADY EQU 4 ;DRIVE READY SEKCMP EQU 8 ;SEEK COMPLETE ;DRIVE SPECIFICATION TABLE FOR THE HD DMA HARD DISK CONTROLLER ;------------------------------------------------------------- ; MWDST: DB MAXMW*MWLOG ;NUMBER OF LOGICAL DRIVES DW MWWARM ;WARM BOOT DW MWTRAN ;SECTOR TRANSLATION DW MWLDRV ;SELECT LOGICAL DRIVE 1 (FIRST TIME SELECT) DW MWDRV ;SELECT LOGICAL DRIVE 2 (GENERAL SELECT) DW MWHOME ;HOME CURRENT SELECTED DRIVE DW MWSEEK ;SEEK TO SELECTED TRACK DW MWSEC ;SELECT SECTOR DW MWDMA ;SET DMA ADDRESS DW MWREAD ;READ A SECTOR DW MWWRITE ;WRITE A SECTOR IF HEADS GT 2 ;TEST IF DRIVE IS BIG ENOUGH FOR A BAD SPOT MAP DW MWBAD ;RETURN BAD SECTOR MAP INFO ELSE DW NOBAD ENDIF IF MWORDER NE 1 ;NO WARM BOOT POSSIBLE ;HDDMA WARM BOOT DUMMY ;--------------------------- ; 1) IF HDDMA IS NOT DRIVE A (I.E. MWORDER NOT EQUAL 1) THEN ; IT IS NOT POSSIBLE TO WARM BOOT FROM HDDMA. SO ROUTINE NOT NEEDED. ; MWWARM: RET ;RETURN IF CALLED ELSE ;HDDMA WARM BOOT ROUTINE ;----------------------- ; MWWARM: XRA A CALL MWDRV ;SELECT DRIVE A CALL MWHOME ;HOME AND RESET THE DRIVE LXI B,0 ;MAKE SURE WE ARE ON TRACK 0 CALL MWSEEK CP/M MACRO ASSEM 2.0 #075 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs XRA A STA MWHEAD ;SELECT HEAD ZERO STA MWSECTR ;SELECT SECTOR 1 LXI H,BUFFER ;LOAD SECTOR 1 INTO BUFFER SHLD DMADMA CALL MWWREAD ;READ CCP INTO BUFFER RC ;RETURN IF ERROR LXI D,BUFFER+200H LXI H,CCP LXI B,200H ;MOVE 200H BYTES CALL MOVBYT LXI H,CCP-200H ;INITIAL DMA ADDRESS PUSH H XRA A PUSH PSW ;SAVE FIRST SECTOR -1 MWWLOD: POP PSW ;RESTORE SECTOR POP H ;RESTORE DMA ADDRESS INR A STA MWSECTR CPI 6 ;PAST BDOS ? RZ ;YES, ALL DONE INR H ;UPDATE DMA ADDRESS BY 1024 BYTES INR H INR H INR H SHLD DMADMA PUSH H PUSH PSW CALL MWWREAD ;READ IN A SECTOR JNC MWWLOD RET ;RETURN WITH ERROR MWWREAD:MVI C,RETRIES ;RETRY COUNTER MWWERR: PUSH B ;SAVE THE RETRY COUNT CALL MWREAD ;READ THE SECTOR POP B RNC DCR C ;UPDATE THE ERROR COUNT JNZ MWWERR ;KEEP TRYING IF NOT TOO MANY ERRORS STC ;SET ERROR FLAG RET ENDIF ;OF HDDMA WARM BOOT ROUTINE ;HDDMA FIRST TIME DRIVE SELECT ROUTINE ;------------------------------------- ; MWLDRV: STA MWCURL ;SAVE CURRENT LOGICAL DRIVE CALL MWRESET ;RESET CONTROLLER CARD JC ZRET ;CONTROLLER FAILURE LDA MWCURL CALL MWDRV ;SELECT DRIVE JC ZRET ;SELECT ERROR CALL MWSTAT ;GET DRIVE STATUS CP/M MACRO ASSEM 2.0 #076 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ANI DREADY ;CHECK IF DRIVE READY JNZ ZRET CALL MWHOME ;HOME DRIVE LXI D,DPHMW0 ;START OF HARD DISK DPH'S LDA MWCURL MOV L,A MVI H,0 DAD H DAD H DAD H DAD H DAD D ;(HL) = POINTER TO DPH MVI C,4 ;RETURN SECTOR SIZE OF 1024 RET ;HDDMA NON-INITIAL DRIVE SELECT ROUTINE ;-------------------------------------- ; MWDRV: STA MWCURL CALL MWDLOG MOV A,C STA MWDRIVE ;SAVE NEW SELECTED DRIVE MWSEL: MVI A,DMANOOP JMP MWPREP ;EXECUTE DISK COMMAND MWDLOG: MVI C,0 MWLLX: SUI MWLOG RC INR C JMP MWLLX MWSTAT: MVI A,DMASSTA ;SENSE STATUS OPERATION CODE JMP MWPREP ;EXECUTE DISK COMMAND ;HDDMA HOME DRIVE ROUTINE ;------------------------ ; MWHOME: CALL MWRESET ;RESET CONTROLLER, DO A LOAD CONSTANTS LXI H,DMARG1 ;LOAD ARGUMENTS MVI M,STEPRCL ;LOAD STEP DELAY (SLOW RATE) INX H MVI M,HEADDLY ;HEAD SETTLE DELAY CALL MWISSUE ;DO LOAD CONSTANTS AGAIN CALL MWPTR ;GET POINTER TO CURRENT CYLINDER NUMBER MVI M,0FFH ;FAKE AT CYLINDER 65535 FOR MAX HEAD TRAVEL INX H MVI M,0FFH LXI B,0 ;SEEK TO CYLINDER 0 CALL MWSEEK ;RECAL SLOWLY JMP MWRESET ;BACK TO FAST STEPPING MODE ;HDDMA RETURN BAD MAP POSITION ROUTINE ;------------------------------------- ; CP/M MACRO ASSEM 2.0 #077 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs MWBAD: LXI H,MWBTAB ;RETURN POINTER TO BAD SECTOR LOCATION RET MWBTAB: DW 0 ;TRACK 0 DW 19 ;HEAD 2, SECTOR 0 = (2 * SPT + 0) + 1 ;HDDMA SET TRACK ROUTINE ;----------------------- ; MWSEEK: CALL MWPTR ;GET TRACK POINTER MOV E,M ;GET OLD TRACK NUMBER INX H MOV D,M DCX H MOV M,C ;STORE NEW TRACK NUMBER INX H MOV M,B MOV L,C ;BUILD CYLINDER WORD MOV H,B SHLD DMARG0 ;SET COMMAND CHANNEL CYLINDER NUMBER MOV A,D INR A LXI H,0FFFFH JNZ MWSKIP0 MVI C,STEPOUT JMP MWSKIP MWSKIP0:MOV H,B ;(HL) = NEW TRACK, (DE) = OLD TRACK MOV L,C CALL MWHLMDE MVI C,STEPOUT MOV A,H ANI 80H ;CHECK HIT BIT FOR NEGITIVE DIRECTION JNZ MWSOUT ;STEP IN MVI C,0 JMP MWSKIP MWSOUT: CALL MWNEGHL MWSKIP: SHLD DMASTEP LDA MWDRIVE ORA C STA DMASEL0 MVI A,DMANOOP ;NO-OPERATION COMMAND FOR THE CHANNEL CALL MWPREP ;STEP TO PROPER TRACK LXI H,0 ;CLEAR STEP COUNTER SHLD DMASTEP RET ;HDDMA SET DMA ADDRESS ROUTINE ;----------------------------- ; MWDMA: MOV H,B ;SET DMA ADDRESS MOV L,C SHLD DMADMA RET CP/M MACRO ASSEM 2.0 #078 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;HDDMA SET SECTOR ROUTINE ;------------------------ ; MWSEC: MOV A,C ;LOAD SECTOR NUMBER DCR A ;RANGE IS ACTAULLY 0-16 CALL MWDSPT ;FIGURE OUT HEAD NUMBER -> (C) ADI MWSPT ;MAKE SECTOR NUMBER STA MWSECTR MOV A,C STA MWHEAD ;SAVE HEAD NUMBER RET MWDSPT: MVI C,0 ;CLEAR HEAD COUNTER MWDSPTX:SUI MWSPT ;SUBTRACT A TRACKS WORTH OF SECTORS RC ;RETURN IF ALL DONE INR C ;BUMP TO NEXT HEAD JMP MWDSPTX MWRESET:LHLD CHAN ;SAVE THE COMMAND CHANNEL FOR A WHILE SHLD TEMPB LDA CHAN+2 STA TEMPB+2 OUT RESET ;SEND RESET PULSE TO CONTROLLER LXI H,DMACHAN ;ADDRESS OF COMMAND CHANNEL SHLD CHAN ;DEFAULT CHANNEL ADDRESS XRA A STA CHAN+2 ;CLEAR EXTENDED ADDRESS BYTE SHLD 40H ;SET UP A POINTER TO THE COMMAND CHANNEL STA 42H LHLD DMARG0 ;SAVE THE TRACK NUMBER PUSH H LXI H,DMASEL1 ;LOAD ARGUMENTS LDA MWDRIVE ;GET THE CURRENTLY SELECTED DRIVE ORI 03CH ;RAISE *STEP AND *DIR MOV M,A ;SAVE IN DRIVE SELECT REGISTER LXI D,5 ;OFFSET TO DMARG1 DAD D MVI M,STEPDLY ;LOAD STEP DELAY INX H MVI M,HEADDLY ;HEAD SETTLE DELAY INX H MVI M,SECTSIZ ;SECTOR SIZE CODE INX H MVI M,DMALCON ;LOAD CONSTANTS COMMAND CALL MWISSUE ;DO LOAD CONSTANTS POP H ;RESTORE THE TRACK NUMBER SHLD DMARG0 PUSH PSW ;SAVE STATUS LHLD TEMPB ;RESTORE MEMORY USED FOR THE CHANNEL POINTER SHLD CHAN LDA TEMPB+2 STA CHAN+2 POP PSW RET ;HDDMA READ/WRITE SECTOR ROUTINES CP/M MACRO ASSEM 2.0 #079 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;-------------------------------- ; MWREAD: MVI A,DMAREAD ;LOAD DISK READ COMMND JMP MWPREP MWWRITE:MVI A,DMAWRIT ;LOAD DISK WRITE COMMAND MWPREP: STA DMAOP ;SAVE COMMAND CHANNEL OP CODE MVI C,BAND1 LHLD DMARG0 LXI D,PRECOMP CALL MWHLCDE JC MWPREPS MVI C,BAND2 LXI D,LOWCURR CALL MWHLCDE JC MWPREPS MVI C,BAND3 ;CYLINDER > LOW_CURRENT MWPREPS:LDA MWHEAD ;LOAD HEAD ADDRESS STA DMARG2 CMA ;NEGATIVE LOGIC FOR THE CONTROLLER ANI 7 ;3 BITS OF HEAD SELECT RLC ;SHOVE OVER TO BITS 2 - 4 RLC ORA C ;ADD ON LOW CURRENT AND PRECOMP BITS MOV C,A LDA MWDRIVE ;LOAD DRIVE ADDRESS ORA C ;SLAP IN DRIVE BITS STA DMASEL1 ;SAVE IN COMMAND CHANNEL HEAD SELECT LDA MWSECTR ;LOAD SECTOR ADDRESS STA DMARG3 IF 0 ;SET TO 1 FOR MW ERROR REPORTER MWISSUE:CALL MWDOIT ;DO DESIRED OPERATION RNC ;DO NOTHING IF NO ERROR PUSH PSW ;SAVE ERROR INFO CALL HEXOUT ;PRINT STATUS CALL DSPOUT ; AND A SPACE LXI H,DMACHAN MVI C,16 ;16 BYTES OF STATUS MWERR: PUSH B PUSH H MOV A,M CALL HEXOUT ;PRINT A BYTE OF THE STATUS LINE CALL SPOUT POP H POP B INX H ;BUMP COMMAND CHANNEL POINTER DCR C JNZ MWERR MVI C,0AH ;TERMINATE WITH A CRLF CALL POUT MVI C,0DH CALL POUT CP/M MACRO ASSEM 2.0 #080 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs POP PSW ;RESTORE ERROR STATUS RET DSPOUT: CALL SPOUT ;PRINT TWO SPACES SPOUT: MVI C,' ' ;PRINT A SPACE JMP POUT HEXOUT: PUSH PSW ;POOR PERSONS NUMBER PRINTER RRC RRC RRC RRC CALL NIBOUT POP PSW NIBOUT: ANI 0FH ADI '0' CPI '9'+1 JC NIBOK ADI 27H NIBOK: MOV C,A JMP POUT MWDOIT EQU $ ELSE MWISSUE EQU $ ;DO A DISK COMMAND, HANDLE TIMEOUTS + ERRORS ENDIF LXI H,DMASTAT ;CLEAR STATUS BYTE MVI M,0 OUT ATTN ;START THE CONTROLLER LXI D,0 ;TIME OUT COUNTER (65536 RETRIES) MWILOOP:MOV A,M ;GET STATUS ORA A ;SET UP CPU FLAGS RM ;RETURN NO ERROR (CARRY RESET) STC RNZ ;RETURN ERROR STATUS XTHL ;WASTE SOME TIME XTHL XTHL XTHL DCX D ;BUMP TIMEOUT COUNTER MOV A,D ORA E JNZ MWILOOP ;LOOP IF STILL BUSY STC ;SET ERROR FLAG RET MWPTR: LDA MWDRIVE ;GET CURRENTLY SELECT DRIVES TRACK ADDRESS RLC MOV E,A MVI D,0 LXI H,MWTAB DAD D ;OFFSET INTO TRACK TABLE CP/M MACRO ASSEM 2.0 #081 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs RET MWTRAN: MOV H,B MOV L,C INX H RET MWNEGHL:MOV A,H CMA MOV H,A MOV A,L CMA MOV L,A INX H RET MWHLMDE:XCHG CALL MWNEGHL XCHG DAD D RET MWHLCDE:MOV A,H CMP D RNZ MOV A,L CMP E RET MWTAB EQU $ ;COLLECTION OF TRACK ADDRESSES REPT MAXMW DB 0FFH ;INITIALIZE TO (WAY OUT ON THE END OF THE DISK) DB 0FFH ENDM DB 0FFH MWCURL: DB 0 ;CURRENT LOGICAL DRIVE MWDRIVE:DB 0FFH ;CURRENTLY SELECTED DRIVE MWHEAD: DB 0 ;CURRENTLY SELECTED HEAD MWSECTR:DB 0 ;CURRENTLY SELECTED SECTOR DMACHAN EQU $ ;COMMAND CHANNEL AREA DMASEL0:DB 0 ;DRIVE SELECT DMASTEP:DW 0 ;RELATIVE STEP COUNTER DMASEL1:DB 0 ;HEAD SELECT DMADMA: DW 0 ;DMA ADDRESS DB 0 ;EXTENDED ADDRESS DMARG0: DB 0 ;FIRST ARGUMENT DMARG1: DB 0 ;SECOND ARGUMENT DMARG2: DB 0 ;THIRD ARGUMENT DMARG3: DB 0 ;FOURTH ARGUMENT DMAOP: DB 0 ;OPERATION CODE DMASTAT:DB 0 ;CONTROLLER STATUS BYTE DMALNK: DW DMACHAN ;LINK ADDRESS TO NEXT COMMAND CHANNEL DB 0 ;EXTENDED ADDRESS TEMPB: DS 4 ;COMMAND CHANNEL POINTER BUFFER CP/M MACRO ASSEM 2.0 #082 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ENDIF PAGE CP/M MACRO ASSEM 2.0 #083 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF MAXHD NE 0 ;WANT HDC3 OR 4 CONTROLLER INCLUDED ? ;**************************************************************************** ; BEGIN THE HDCA DRIVER (DDRV4) ;****************************** ; ;HDCA EQUATES ;------------ ; HDORG EQU 50H ;HARD DISK CONTROLLER ORIGIN HDSTAT EQU HDORG ;DISK STATUS HDCNTL EQU HDORG ;DISK CONTROL HDRESLT EQU HDORG+1 ;DISK RESULTS HDCMND EQU HDORG+1 ;DISK COMMANDS HDSKOMP EQU HDORG+2 ;SEEK COMPLETE CLEAR PORT (ON HDC4) HDFUNC EQU HDORG+2 ;FUNCTION PORT HDDATA EQU HDORG+3 ;DATA PORT ; STATUS PORT (50) TKZERO EQU 01H ;TRACK ZERO OPDONE EQU 02H ;OPERATION DONE COMPLT EQU 04H ;SEEK COMPLETE TMOUT EQU 08H ;TIME OUT WFAULT EQU 10H ;WRITE FAULT DRVRDY EQU 20H ;DRIVE READY INDEX EQU 40H ;DELTA INDEX ; CONTROL PORT (50) HDFREN EQU 01H ;ENABLE EXTERNAL DRIVERS HDRUN EQU 02H ;ENABLE CONTROLLERS STATE MACHINE HDCLOK EQU 04H ;CLOCK SOURCE CONTROL BIT, HIGH = DISK HDWPRT EQU 08H ;WRITE PROTECT A DRIVE ; RESULT PORT (51) RETRY EQU 02H ;RETRY FLAG ; COMMAND PORT (51) IDBUFF EQU 0 ;INITIALIZE DATA BUFFER POINTER RSECT EQU 1 ;READ SECTOR WSECT EQU 5 ;WRITE SECTOR ISBUFF EQU 8 ;INITIALIZE HEADER BUFFER POINTER ; FUNCTION PORT (52) PSTEP EQU 04H ;STEP BIT NSTEP EQU 0FFH-PSTEP ;STEP BIT MASK NULL EQU 0FCH ;NULL COMMAND ; MISC CONSTANTS CP/M MACRO ASSEM 2.0 #084 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs HDRLEN EQU 4 ;SECTOR HEADER LENGTH SECLEN EQU 512 ;SECTOR DATA LENGTH ; ;DEVICE SPECIFICATION TABLE FOR HDCA CONTROLLER DRIVER ;----------------------------------------------------- ; HDDST: DB MAXHD*HDLOG ;NUMBER OF LOGICAL DRIVES DW HDWARM ;WARM BOOT DW HDTRAN ;SECTOR TRANSLATION DW HDLDRV ;FIRST TIME SELECT DW HDDRV ;GENERAL SELECT DW HDHOME ;HOME CURRENT SELECTED DRIVE DW HDSEEK ;SEEK TO SELECTED TRACK DW HDSEC ;SELECT SECTOR DW HDDMA ;SET DMA ADDRESS DW HDREAD ;READ A SECTOR DW HDWRITE ;WRITE A SECTOR DW NOBAD ;NO BAD SECTOR MAP IF HDORDER NE 1 ;NO WARM BOOT POSSIBLE ;HDCA WARM BOOT DUMMY ;--------------------------- ; 1) IF HDCA IS NOT DRIVE A (I.E. HDORDER NOT EQUAL 1) THEN ; IT IS NOT POSSIBLE TO WARM BOOT FROM HDCA. SO ROUTINE NOT NEEDED. ; HDWARM: RET ;RETURN IF CALLED ELSE ;HDCA WARM BOOT ROUTINE ;---------------------- ; HDWARM: CALL DIVLOG ;GET PHYSICAL DRIVE NUMBER IN (C) XRA A LXI H,CCP-200H ;INITIAL DMA ADDRESS PUSH H STA HEAD ;SELECT HEAD ZERO INR A ; 1 -> (A) PUSH PSW ;SAVE FIRST SECTOR - 1 CALL HDD2 ;SELECT DRIVE MVI C,0 CALL HDHOME ;HOME THE DRIVE HDWRLD: POP PSW ;RESTORE SECTOR POP H ;RESTORE DMA ADDRESS INR A STA HDSECT CPI 13 ;PAST BDOS ? RZ ;YES, ALL DONE INR H ;UPDATE DMA ADDRESS INR H SHLD HDADD PUSH H PUSH PSW HDWRRD: LXI B,RETRIES*100H+0 ;RETRY COUNTER CP/M MACRO ASSEM 2.0 #085 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs HDWR: PUSH B ;SAVE THE RETRY COUNT CALL HDREAD ;READ THE SECTOR POP B JNC HDWRLD ;TEST FOR ERROR DCR B ;UPDATE THE ERROR COUNT JNZ HDWR ;KEEP TRYING IF NOT TOO MANY ERRORS STC ;ERROR FLAG RET ENDIF ;HDCA WARM BOOT ROUTINE ;HDCA SECTOR TRANSLATE ROUTINE ;----------------------------- ; HDTRAN: MOV H,B ;SECTOR TRANSLATION IS HANDLED VIA MOV L,C ; PHYSICAL SECTOR HEADER SKEWWING INX H RET ;HDCA FIRST TIME DRIVE SELECT ROUTINE ;------------------------------------ ; HDLDRV: STA HDCUR ;SAVE LOGICAL DISK CALL DIVLOG ;DIVIDE BY LOGICAL DISKS PER DRIVE MOV A,C STA HDDISK ;SAVE NEW PHYSICAL DRIVE CALL HDPTR ;GET TRACK POINTERS MOV A,M ;GET CURRENT TRACK INR A ;CHECK IF -1 JNZ HDL2 ;NOPE, ALLREADY ACCESSED ORI NULL ;SELECT DRIVE OUT HDFUNC MVI A,HDFREN+HDCLOK ;ENABLE DRIVERS OUT HDCNTL MVI C,239 ;WAIT 2 MINUTES FOR DISK READY LXI H,0 HDTDEL: DCX H MOV A,H ORA L CZ DCRC JZ ZRET ;DRIVE NOT READY ERROR IN HDSTAT ;TEST IF READY YET ANI DRVRDY JNZ HDTDEL IF NOT FUJITSU LXI H,0 ;TIME ONE REVOLUTION OF THE DRIVE MVI C,INDEX IN HDSTAT ANA C MOV B,A ;SAVE CURRENT INDEX LEVEL IN B HDINXD1:IN HDSTAT ANA C CMP B ;LOOP UNTILL INDEX LEVEL CHANGES JZ HDINXD1 HDINDX2:INX H CP/M MACRO ASSEM 2.0 #086 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IN HDSTAT ;START COUNTING UNTILL INDEX RETURNS TO ANA C ; PREVIOUS STATE CMP B JNZ HDINDX2 IF M10 ;MEMOREX M10'S HAVE 40 MS HEAD SETTLE DAD H ;HL*2 ENDIF IF M26 ;SHUGART M26'S HAVE 30 MS HEAD SETTLE XRA A ;HL/2 + HL (SAME AS HL*1.5) MOV A,H RAR MOV D,A MOV A,L RAR MOV E,A DAD D ENDIF SHLD SETTLE ;SAVE THE COUNT FOR TIMEOUT DELAY ENDIF CALL HDHOME HDL2: LDA HDCUR ;LOAD LOGICAL DRIVE LXI D,DPHHD0 ;START OF HARD DISK DPH'S MVI C,3 ;HARD DISK SECTOR SIZE EQUALS 512 BYTES JMP RETDPH DCRC: DCR C ;CONDITIONAL DECREMENT C ROUTINE RET DIVLOG: MVI C,0 DIVLX: SUI HDLOG RC INR C JMP DIVLX ;HDCA NON-INITIAL DRIVE SELECT ROUTINE ;------------------------------------- ; HDDRV: STA HDCUR CALL DIVLOG ;GET THE PHYSICAL DRIVE # HDD2: MOV A,C STA HDDISK ;SELECT THE DRIVE ORI NULL OUT HDFUNC MVI A,HDFREN+HDRUN+HDCLOK+HDWPRT ;WRITE PROTECT OUT HDCNTL RET ;HDCA HOME DISK ROUTINE ;---------------------- ; HDHOME: CALL HDPTR ;GET TRACK POINTER CP/M MACRO ASSEM 2.0 #087 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs MVI M,0 ;SET TRACK TO ZERO IN HDSTAT ;TEST STATUS ANI TKZERO ;AT TRACK ZERO ? RZ ;YES IF NOT FUJITSU HDSTEPO:IN HDSTAT ;TEST STATUS ANI TKZERO ;AT TRACK ZERO ? JZ HDDELAY MVI A,1 STC CALL ACCOK ;TAKE ONE STEP OUT JMP HDSTEPO ELSE XRA A JMP ACCOK ENDIF IF NOT FUJITSU HDDELAY:LHLD SETTLE ;GET HDDELAY DELOOP: DCX H ;WAIT 20MS MOV A,H ORA L INX H DCX H JNZ DELOOP RET ENDIF ;HDCA SET TRACK ROUTINE ;---------------------- ; HDSEEK: CALL HDPTR ;GET POINTER TO CURRENT TRACK MOV E,M ;GET CURRENT TRACK MOV M,C ;UPDATE THE TRACK MOV A,E ;NEED TO SEEK AT ALL ? SUB C RZ CMC ;GET CARRY INTO DIRECTION JC HDTRK2 CMA INR A IF FUJITSU HDTRK2: JMP ACCOK ELSE HDTRK2: CALL ACCOK JMP HDDELAY ENDIF ACCOK: MOV B,A ;PREP FOR BUILD CALL BUILD SLOOP: ANI NSTEP ;GET STEP PULSE LOW OUT HDFUNC ;OUTPUT LOW STEP LINE ORI PSTEP ;SET STEP LINE HIGH CP/M MACRO ASSEM 2.0 #088 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs OUT HDFUNC ;OUTPUT HIGH STEP LINE DCR B ;UPDATE REPEAT COUNT JNZ SLOOP ;KEEP GOING THE REQUIRED # OF TRACKS JMP WSDONE ;HDCA SET DMA ADDRESS ROUTINE ;---------------------------- ; HDDMA: MOV H,B ;SAVE THE DMA ADDRESS MOV L,C SHLD HDADD RET WSDONE: IN HDSTAT ;WAIT FOR SEEK COMPLETE TO FINISH ANI COMPLT JZ WSDONE IN HDSKOMP ;CLEAR SDONE BIT ON AN HDCA4 RET ;HDCA SET SECTOR ROUTINE FOR M26 DISK ;------------------------------------ ; IF M26 HDSEC: MVI A,01FH ;FOR COMPATIBILITY WITH CBIOS REVS. ; 2.3 AND 2.4 ANA C ;MASK IN SECTOR NUMBER (0-31) CZ GETSPT ;TRANSLATE SECTOR 0 TO SECTOR 32 STA HDSECT ;SAVE TRANSLATED SECTOR NUMBER (1-32) MVI A,0E0H ;GET THE HEAD NUMBER ANA C RLC RLC RLC STA HEAD ;SAVE THE HEAD NUMBER GETSPT: MVI A,HDSPT RET ELSE ;HDCA SET SECTOR ROUTINE FOR M10 AND M20 DISKS ;--------------------------------------------- ; HDSEC: MOV A,C CALL DIVSPT ADI HDSPT ANA A CZ GETSPT STA HDSECT MOV A,C STA HEAD GETSPT: MVI A,HDSPT DCR C RET DIVSPT: MVI C,0 CP/M MACRO ASSEM 2.0 #089 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DIVSX: SUI HDSPT RC INR C JMP DIVSX ENDIF ;HDCA READ SECTOR ROUTINE ;------------------------ ; HDREAD: CALL HDPREP RC XRA A OUT HDCMND CMA OUT HDDATA OUT HDDATA MVI A,RSECT ;READ SECTOR COMMAND OUT HDCMND CALL PROCESS RC XRA A OUT HDCMND MVI B,SECLEN/4 LHLD HDADD IN HDDATA IN HDDATA RTLOOP: IN HDDATA ;MOVE FOUR BYTES MOV M,A INX H IN HDDATA MOV M,A INX H IN HDDATA MOV M,A INX H IN HDDATA MOV M,A INX H DCR B JNZ RTLOOP RET ;HDCA WRITE SECTOR ROUTINE ;------------------------- ; HDWRITE:CALL HDPREP ;PREPARE HEADER RC XRA A OUT HDCMND LHLD HDADD MVI B,SECLEN/4 WTLOOP: MOV A,M ;MOVE 4 BYTES OUT HDDATA INX H MOV A,M OUT HDDATA CP/M MACRO ASSEM 2.0 #090 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs INX H MOV A,M OUT HDDATA INX H MOV A,M OUT HDDATA INX H DCR B JNZ WTLOOP MVI A,WSECT ;ISSUE WRITE SECTOR COMMAND OUT HDCMND CALL PROCESS RC MVI A,WFAULT ANA B STC RZ XRA A RET PROCESS:IN HDSTAT ;WAIT FOR COMMAND TO FINISH MOV B,A ANI OPDONE JZ PROCESS MVI A,HDFREN+HDRUN+HDCLOK ;WRITE PROTECT OUT HDCNTL IN HDSTAT ANI TMOUT ;TIMED OUT ? STC RNZ IN HDRESLT ANI RETRY ;ANY RETRIES ? STC RNZ XRA A RET HDPREP: IN HDSTAT ANI DRVRDY STC RNZ MVI A,ISBUFF ;INITIALIZE POINTER OUT HDCMND CALL BUILD ORI 0CH OUT HDFUNC LDA HEAD OUT HDDATA ;FORM HEAD BYTE CALL HDPTR ;GET POINTER TO CURRENT DRIVES TRACK MOV A,M ;FORM TRACK BYTE OUT HDDATA ANA A MVI B,80H JZ ZKEY MVI B,0 ZKEY: LDA HDSECT ;FORM SECTOR BYTE CP/M MACRO ASSEM 2.0 #091 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs OUT HDDATA MOV A,B OUT HDDATA MVI A,HDFREN+HDRUN+HDCLOK ;WRITE PROTECT OUT HDCNTL MVI A,HDFREN+HDRUN+HDCLOK+HDWPRT ;WRITE PROTECT OUT HDCNTL XRA A RET HDPTR: LHLD HDDISK ;GET A POINTER TO THE CURRENT DRIVES MVI H,0 ; TRACK POSITION XCHG LXI H,HDTRAK DAD D RET BUILD: LDA HEAD ;BUILD A CONTROLLER COMMAND BYTE RAL RAL RAL RAL LXI H,HDDISK ORA M XRI 0F0H RET HDCUR: DB 0 ;CURRENT LOGICAL DISK HDADD: DW 0 ;DMA ADDRESS HDDISK: DB 0 ;CURRENT PHYSICAL DISK NUMBER HEAD: DB 0 ;CURRENT PHYSICAL HEAD NUMBER HDSECT: DB 0 ;CURRENT PHYSICAL SECTOR NUMBER HDTRAK: DB 0FFH ;TRACK POINTER FOR EACH DRIVE DB 0FFH ;ALL DRIVE DEFAULT TO AN UNCALIBRATED DB 0FFH ; STATE (FF) DB 0FFH SETTLE: DW 0 ;TIME DELAY CONSTANT FOR HEAD SETTLE ENDIF PAGE CP/M MACRO ASSEM 2.0 #092 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;******************** ; END OF DISK DRIVERS ;******************** ; ; CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. ;==================================================== ; IF NOSTAND NE 0 ;UNALLOCATED WRITTING VARIABLES UNALOC: DB 0 ;UNALLOCATED WRITE IN PROGRESS FLAG OBLOCK: DW 0 ;LAST UNALLOCATED BLOCK NUMBER WRITTEN UNADRV: DB 0 ;DRIVE THAT THE BLOCK BELONGS TO ENDIF B633 0000 CPMSEC: DW 0 ;CP/M SECTOR # B635 00 CPMDRV: DB 0 ;CP/M DRIVE # B636 0000 CPMTRK: DW 0 ;CP/M TRACK # B638 0000 TRUESEC:DW 0 ;PHYSICAL SECTOR THAT CONTAINS CP/M SECTOR B63A 00 ERROR: DB 0 ;BUFFER'S ERROR STATUS FLAG B63B 00 BUFDRV: DB 0 ;DRIVE THAT BUFFER BELONGS TO B63C 0000 BUFTRK: DW 0 ;TRACK THAT BUFFER BELONGS TO B63E 0000 BUFSEC: DW 0 ;SECTOR THAT BUFFER BELONGS TO B640 0000 ALTTRK: DW 0 ;ALTERNATE TRACK B642 0000 ALTSEC: DW 0 ;ALTERANTE SECTOR B644 00 LASTDRV:DB 0 ;LAST SELECTED DRIVE ;***************************************************************; ; ; ; DPB AND DPH AREA. ; ; ; ;***************************************************************; IF MAXHD NE 0 DPHDSK SET 0 ;GENERATE DPH'S FOR THE HDCA HARD DISKS REPT MAXHD LDSK SET 0 REPT HDLOG DPHGEN HD,%DPHDSK,DPBHD,%LDSK LDSK SET LDSK+1 DPHDSK SET DPHDSK+1 ENDM ENDM IF M26 NE 0 DPBHD0: DW 1024 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 2015 ;DSM DW 511 ;DRM DB 0FFH ;AL0 CP/M MACRO ASSEM 2.0 #093 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DB 0FFH ;AL1 DW 0 ;CKS DW 1 ;OFF DB 3 ;SECSIZ DPBHD1: DW 1024 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 2015 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 64 ;OFF DB 3 ;SECSIZ DPBHD2: DW 1024 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 2047 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 127 ;OFF DB 3 ;SECSIZ ENDIF IF M10 NE 0 DPBHD0: DW 336 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 1269 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 1 ;OFF DB 3 ;SECSIZ DPBHD1: DW 336 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 1280 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 122 ;OFF DB 3 ;SECSIZ ENDIF CP/M MACRO ASSEM 2.0 #094 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF M20 NE 0 DPBHD0: DW 672 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 2036 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 1 ;OFF DB 3 ;SECSIZ DPBHD1: DW 672 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 2036 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 98 ;OFF DB 3 ;SECSIZ DPBHD2: DW 672 ;CP/M SECTORS/TRACK DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 1028 ;DSM DW 511 ;DRM DB 0FFH ;AL0 DB 0FFH ;AL1 DW 0 ;CKS DW 195 ;OFF DB 3 ;SECSIZ ENDIF ENDIF ;END OF HD DPH'S AND DPB'S ; DPH'S FOR DJ2DB ;---------------- ; IF MAXFD NE 0 DN SET 0 REPT MAXFD DPHGEN FD,%DN,0,0 DN SET DN+1 ENDM ENDIF IF MAXMW NE 0 ;***************************************************************; ; ; ; MWSECTP IS THE NUMBER OF 128 BYTE SECTORS PER CYLINDER. ; ; MWSECTP = 72 * HEADS ; CP/M MACRO ASSEM 2.0 #095 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; ; ; MWTRKS IS THE TOTAL NUMBER OF DATA CYLINDERS. ; ; MWTRKS = TRACKS - 1 ; ; ; ;***************************************************************; IF ST506 NE 0 MWSECPT EQU 288 ;SECTORS PER TRACK MWTRKS EQU 152 ;TOTAL DATA TRACKS ENDIF IF ST412 NE 0 MWSECPT SET 288 MWTRKS SET 305 ENDIF IF CM5619 NE 0 MWSECPT SET 432 MWTRKS SET 305 ENDIF DPHDSK SET 0 ;GENERATE DPH'S FOR THE HDDMA HARD DISKS REPT MAXMW LDSK SET 0 REPT MWLOG DPHGEN MW,%DPHDSK,DPBMW,%LDSK DPHDSK SET DPHDSK+1 LDSK SET LDSK+1 ENDM ENDM OFF SET 1 ;INITIAL SYSTEM TRACK OFFSET TRKOFF SET 8192/(MWSECPT/8)+1 ;THE NUMBER OF TRACKS IN A PARTITION BLOCKS SET MWSECPT/8*MWTRKS ;THE NUMBER OF BLOCKS ON THE DRIVE PSIZE SET TRKOFF*(MWSECPT/8) ;THE NUMBER OF BLOCKS IN A PARTITION LDSK SET 0 REPT BLOCKS/8192 ;GENERATE SOME 8 MEGABYTE DPB'S DPBGEN MW,%LDSK,%MWSECPT,5,31,1,2047,1023,0FFH,0FFH,0,%OFF,4 OFF SET OFF+TRKOFF BLOCKS SET BLOCKS-PSIZE LDSK SET LDSK+1 ENDM BLOCKS SET BLOCKS/4 IF BLOCKS GT 256 ;IF THERE IS ANY STUFF LEFT, THEN USE IT BLOCKS SET BLOCKS-1 DPBGEN MW,%LDSK,%MWSECPT,5,31,1,%BLOCKS,1023,0FFH,0FFH,0,%OFF,4 ENDIF ENDIF ;********************************************************* ;BEGIN DEFINITIONS FOR THE CONSOLE AND LIST DEVICE DRIVERS ;********************************************************* ; ;DEFINE PRINTER CHARACTER CONSTANTS ;---------------------------------- CP/M MACRO ASSEM 2.0 #096 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs 000D = ACR EQU 0DH ;CARRIAGE RETURN 000A = ALF EQU 0AH ;LINE FEED 001A = CLEAR EQU 1AH ;CLEAR SCREEN ON AN ADM 3 0013 = XOFF EQU 13H ;XOFF CHARACTER 0011 = XON EQU 11H ;XON CHARACTER IF (CONTYP EQ 2) OR (LSTTYP GE 2) ;MULTIO OR WUNDERBUSS ;MULTIO/WUNDERBUSS EQUATES ;------------------------- ; THE FOLLOWING EQUATES WILL DEFINE THE DECISION I MOTHER ; BOARD I/O OR THE MULTI I/O ENVIRONMENTS IF NEEDED. ; ;LOCATION DEFINITIONS ;-------------------- MBASE EQU 48H ;BASE ADDRESS OF MULTI I/O OR DECISION I RBR EQU MBASE ;READ DATA BUFFER THR EQU MBASE ;TRANMITTER DATA BUFFER DLL EQU MBASE ;DIVISOR (LSB) STROBE EQU MBASE ;PARALLEL PORT STROBE OUT STATUS EQU MBASE ;PARALLEL PORT STATUS IN DLM EQU MBASE+1 ;DIVISOR (MSB) IER EQU MBASE+1 ;INTERUPT ENABLE REGISTER SENSESW EQU MBASE+1 ;SENSE SWITCHES, ONLY IN GP 06 DATA EQU MBASE+1 ;PARALLEL PORT DATA BUFFER CLK EQU MBASE+2 ;WB14 PRINTER SELECT PORT LCR EQU MBASE+3 ;LINE CONTROL REGISTER MCR EQU MBASE+4 LSR EQU MBASE+5 ;LINE STATUS REGISTER MSR EQU MBASE+6 GRPSEL EQU MBASE+7 ;GROUP SELECT PORT ; ;DEFINE TRANSMITTER/RECIEVER MASK BYTES ;-------------------------------------- DR EQU 01H ;LINE STATUS DR BIT CTS EQU 10H ;CLEAR TO SEND DSR EQU 20H ;DATA SET READY THRE EQU 20H ;STATUS LINE THRE BIT DLAB EQU 80H ;DIVISOR LATCH ACCESS BIT ; WLS0 EQU 1 ;WORD LENGTH SELECT BIT 0 WLS1 EQU 2 ;WORD LENGTH SELECT BIT 1 FOR 8 BIT WORD STB EQU 4 ;STOP BIT COUNT - 2 STOP BITS ; ; DEFINE MODEM CONTROL REGISTER BITS ;----------------------------------- DTRENB EQU 1 ;DTR ENABLE RTSENB EQU 2 ;RTS ENABLE ; ;DEFINE GROUP SELECT MASKS ;------------------------- SPP EQU 0 ;SELECT PARALLEL PORT S0 EQU 01H ;GROUP NUMBER (0-3) S1 EQU 02H SMASK EQU 03H BANK EQU 04H CP/M MACRO ASSEM 2.0 #097 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ENINT EQU 08H RESTOR EQU 10H ;PRINTER RESTORE ON MULTI I/O BUSY EQU 20H ;PARALLEL PRINTER BUSY MASK DENABLE EQU 20H ;DRIVER ENABLE ON MULTI I/O ; ;GROUP PORT ASSIGNMENTS ;---------------------- CONGRP EQU 1 ;CONSOLE PORT (1=P1, 2=P2, 3=P3) LSTGRP EQU 3 ;PRINTER PORT (1=P1, 2=P2, 3=P3) ENDIF ;FOR MULTIO/WUNDERBUSS DEFINITIONS PAGE CP/M MACRO ASSEM 2.0 #098 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;**************************** ;BEGIN CONSOLE DEVICE DRIVERS ;**************************** IF CONTYP EQ 0 ;************************ ;BEGIN PROM PATCH (CDRV0) ;************************ ; THIS DRIVER SIMPLY DEFINES THE FOUR JUMPS NORMALLY NEEDED TO GET TO ; YOUR ACTUAL CONSOLE DRIVERS. THE ASSUMPTION IS THAT YOU ALREADY HAVE ; THESE DRIVERS IN A ROM; AND, FURTHERMORE, THAT THE ROM'ED DRIVERS ; EXACTLY MATCH THE SPECS GIVEN IN THE CPM ALTERATION GUIDE FOR CONIN, ; CONOUT AND CONST. CONINT IS INVOLKED DURING THE COLD BOOT PROCESS. ; CONIN: JMP $ ;CONSOLE INPUT CONOUT: JMP $ ;CONSOLE OUTPUT CONST: JMP $ ;CONSOLE INPUT STATUS CONINT: JMP $ ;CONSOLE INITIALIZATION ENDIF ;END OF PROM PATCH CONSOLE ROUTINES IF CONTYP EQ 1 ;*********************************** ;BEGIN PATCH AREA (128 BYTE) (CDRV1) ;*********************************** ; THIS DRIVER PROVIDES YOU WITH A 128 BYTE AREA FOR PATCHING IN YOUR ; OWN I/O ROUTINES. THIS FIRST 12 BYTES ARE TAKEN UP BY JUMPS TO THE ; APPROPRIATE ROUTINES (CONIN, CONOUT AND CONST). SEE THE CPM USER ; REFERENCE MANUAL SECTION ON SYSTEM ALTERATION FOR A DESCRIPTION OF ; THESE ROUTINES AND THE PARAMETER PASSING CONVENTIONS. ; ; THE CONSOLE INITIALIZATION ROUTINE (CONINT) IS USUALLY PLACED ; JUST AFTER THE COLD BOOT LOADER. ; CONIN: JMP $ ;CONSOLE INPUT CONOUT: JMP $ ;CONSOLE OUTPUT CONST: JMP $ ;CONSOLE INPUT STATUS CONINT: JMP $ ;CONSOLE INITIALIZATION DS 116 ;(RESERVE THE REMAINING SPACE) ENDIF ;END OF PATCH AREA CONSOLE ROUTINES IF CONTYP EQ 2 ;**************************************************** ;BEGIN MULTI I/O OR DECISION I CONSOLE DRIVER (CDRV2) ;**************************************************** ; 1) THIS DRIVER ON COLD BOOT WILL INSPECT BITS 1-3 OF THE SENSE ; SWITCHES. IF THE VALUE FOUND IS IN THE RANGE 0-6 THEN THE ; CONSOLE BAUD RATE WILL BE TAKEN FROM THE RATE TABLE. OTHERWISE ; THE BAUD RATE WILL BE SET FROM THE DEFCON WORD WHICH IS FOUND ; JUST BELOW THE REGULAR CBIOS JUMP TABLE. THE STANDARD DIVISOR ; TABLE IS GIVEN BELOW. ; ; SENSE SWITCH: 123 (0 = OFF, 1 = ON) CP/M MACRO ASSEM 2.0 #099 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; 000 = 110 ; 001 = 300 ; 010 = 1200 ; 011 = 2400 ; 100 = 4800 ; 101 = 9600 ; 110 = 19200 ; DEFCON = 9600 ; ; 2) IF YOU ARE USING A MULTIO THEN THE SWITCHES WILL NOT BE ; AVAILABLE SO THE BAUD RATE WILL BE TAKEN FROM DEFCON. ; ;CONSOLE INPUT ;------------- ; DB 0 ;USED BY SWAP.COM CONIN: CALL CONST ;SELECT CONSOLE AND TEST FOR CHAR JZ CONIN IN RBR ;READ CHARACTER ANI 7FH ;STRIP PARITY RET ;CONSOLE OUTPUT ;-------------- ; DB 1 ;USED BY SWAP.COM CONOUT: CALL CONOST ;SELECT CONSOLE AND TEST STATUS JZ CONOUT MOV A,C ;CHARACTER IS IN (C) ANI 7FH OUT THR ;OUTPUT TO TRANSMITTER BUFFER RET ;CONSOLE STATUS ;-------------- ; 1) RETURNS ZERO IF CHARACTER IS NOT READY TO BE READ; OTHERWISE, ; THIS ROUTINE RETURNS 255 INDICATING A READY CONDITION. ; CONST: CALL SELCON ;SELECT CONSOLE IN LSR ;READ STATUS REGISTER ANI DR RZ ;NO CHARACTTER READY MVI A,0FFH ;CHARACTER READY RET ;CONSOLE OUTPUT STATUS ROUTINE ;----------------------------- ; CONOST: CALL SELCON IN LSR ANI THRE RZ MVI A,0FFH RET ;CONSOLE SELECT ROUTINE CP/M MACRO ASSEM 2.0 #100 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;---------------------- ; SELCON: LXI D,GROUP ;PASS TO APPLICATION LDAX D ORI CONGRP OUT GRPSEL RET ENDIF ;END OF MULTIO/WUNDERBUSS CONSOLE DRIVER IF CONTYP EQ 3 ;********************************** ;BEGIN DJ2DB CONSOLE DRIVER (CDRV3) ;********************************** ; ;CONSOLE INPUT ;------------- ; CONIN: JMP FDCIN ;CONSOLE INPUT ;CONSOLE OUTPUT ;-------------- ; CONOUT: MOV A,C ANI 7FH MOV C,A JMP FDCOUT ;CONSOLE OUTPUT ;CONSOLE STATUS ;-------------- ; CONST: CALL FDTSTAT ;CONSOLE STATUS MVI A,0FFH RZ INR A RET ENDIF ;END OF DJ2DB CONSOLE DRIVER IF CONTYP EQ 4 ;********************************** ;BEGIN DJDMA CONSOLE DRIVER (CDRV4) ;********************************** ; ;CONSOLE INPUT ;------------- ; CONIN: LXI H,SERIN+1 ;SERIAL INPUT STATUS XRA A CI2: CMP M ;WAIT TILL 40H DEPOSITED AT 3FH JZ CI2 MOV M,A ;CLEAR STATUS DCX H ;POINT TO INPUT DATA MVI A,7FH ;FOR MASKING OUT PARITY ANA M RET CP/M MACRO ASSEM 2.0 #101 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;CONSOLE OUTPUT ;-------------- ; CONOUT: LXI H,DMCHOT+1 ;CHARACTER OUTPUT LOCATION MOV A,C ANI 7FH MOV M,A ;STORE CHARACTER IN COMMAND DCX H ;BACK UP TO START OF COMMAND LXI D,4 ;OFFSET TO RETURNED STATUS CALL DMDOIT ;WRITE A CHARACTER RET ;CONSOLE STATUS ;-------------- ; CONST: LDA SERIN+1 ;PICK UP SERIAL INPUT STATUS ORA A RZ ;IF ZERO THEN NO CHARACTER READY MVI A,0FFH ;SET CHARACTER READY RET ;DJDMA COMMAND STRINGS FOR CONSOLE I/O ;------------------------------------- ; DMCHOT: DB SEROUT ;SERIAL OUTPUT COMMAND DB 0 ;THE CHARACTER TO BE OUTPUT DB 0 ;DUMMY STATUS DB DMHALT ;HALT COMMAND DB 0 ;RETURNED STATUS ENDIF ;END OF DJDMA CONSOLE DRIVER IF CONTYP EQ 5 ;**************************************** ;BEGIN SWITCHBOARD CONSOLE DRIVER (CDRV5) ;**************************************** ; ;SWITHBOARD EQUATES ;------------------ ; SWBASE EQU 0 ;BASE OF THE SWITCHBOARD ;CONSOLE INPUT ;------------- ; CONIN: IN SWBASE+2 ;GET SWITCHBOARD STATUS ANI 4 ;TEST FOR DATA READY JZ CONIN IN SWBASE ;GET A CHARACTER ANI 7FH ;STRIP OFF PARITY RET ;CONSOLE OUTPUT ;-------------- ; CP/M MACRO ASSEM 2.0 #102 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs CONOUT: IN SWBASE+2 ;CHECK STATUS ANI 8 ;WAIT TILL OUTPUT BUFFER EMPTY JZ CONOUT MOV A,C ;WRITE A CHARACTER ANI 7FH OUT SWBASE RET ;CONSOLE STATUS ;-------------- ; CONST: IN SWBASE+2 ;GET THE FIRST PORTS STATUS ANI 4 ;MASK THE DATA READY BITS RZ ;RETURN CONSOLE NOT READY MVI A,0FFH CONINT: RET ;NULL TERMINAL INITIALIZATION ENDIF ;END OF SWITCHBOARD CONSOLE DRIVER IF CONTYP EQ 6 ;*************************************** ;BEGIN NORTH STAR CONSOLE DRIVER (CDRV6) ;*************************************** ; ;GENERAL INFORMATION ;=================== ; 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. ; ;NORTH STAR EQUATES ;================== ; 0002 = NSLDAT EQU 2 ;LEFT SERIAL PORT DATA PORT 0003 = NSLSTA EQU 3 ;LEFT SERIAL PORT STATUS PORT 0004 = NSRDAT EQU 4 ;RIGHT SERIAL PORT DATA PORT 0005 = NSRSTA EQU 5 ;RIGHT SERIAL PORT STATUS PORT CP/M MACRO ASSEM 2.0 #103 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs 0001 = NSSTBE EQU 1 ;TRANSMITTER BUFFER EMPTY STATUS BIT 0002 = NSSRBR EQU 2 ;RECIEVER BUFFER READY STATUS BIT ;SEE THE 8251 DATA SHEETS FOR MORE ; CONFIGURATION INFORMATION. 00CE = NSLIN1 EQU 0CEH ;LEFT SERIAL PORT INITIALIZATION # 1 00CE = 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 ;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 0037 = NSLIN2 EQU 37H ;LEFT SERIAL PORT INITIALIZATION # 2 0037 = 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) 0000 = NSPDAT EQU 0 ;PARALLEL DATA PORT 0006 = NSPSTA EQU 6 ;PARALLEL STATUS PORT 0001 = NSPRBR EQU 1 ;RECIEVER BUFFER READY STATUS BIT 0002 = NSPTBE EQU 2 ;TRANSMITTER BUFFER EMPTY STATUS BIT 00C0 = NSRAM EQU 0C0H ;NORTH STAR MEMORY PARITY PORT, ; SET TO 0 FOR NO NORTH STAR RAM ;NORTH STAR IOBYTE IMPLEMENTATION ;================================ ; 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. CP/M MACRO ASSEM 2.0 #104 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; ; 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 ; 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 CP/M MACRO ASSEM 2.0 #105 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; PROVIDED BY THIS DEVICE MAPPER. THE OTHER ENTRY NAMES MUST BE ; PROVIDED BY THE PHYSICAL DEVICE DRIVERS. ; ;CONSOLE INPUT ;------------- ; B645 1E01 CONIN: MVI E,1 ;CONSOLE INPUT B647 CDADB6 CALL REDIR ; IOBYTE: 76543210 B64A C1B6 DW TTYIN ;CON: = TTY: XXXXXX00 B64C EAB6 DW CRTIN ;CON: = CRT: XXXXXX01 B64E 6CB6 DW RDRIN ;CON: = BAT: XXXXXX10 B650 13B7 DW UC1IN ;CON: = UC1: XXXXXX11 ;CONSOLE OUTPUT ;-------------- ; B652 1E01 CONOUT: MVI E,1 ;CONSOLE OUTPUT B654 CDADB6 CALL REDIR ; IOBYTE: 76543210 B657 CDB6 DW TTYOUT ;CON: = TTY: XXXXXX00 B659 F6B6 DW CRTOUT ;CON: = CRT: XXXXXX01 B65B 4EB7 DW LSTOUT ;CON: = BAT: XXXXXX10 B65D 25B7 DW UC1OUT ;CON: = UC1: XXXXXX11 ;CONSOLE STATUS ;-------------- ; B65F 1E01 CONST: MVI E,1 ;CONSOLE INPUT STATUS B661 CDADB6 CALL REDIR ; IOBYTE: 76543210 B664 DAB6 DW TTYIST ;CON: = TTY: XXXXXX00 B666 03B7 DW CRTIST ;CON: = CRT: XXXXXX01 B668 79B6 DW RDRIST ;CON: = BAT: XXXXXX10 B66A 3EB7 DW UC1IST ;CON: = UC1: XXXXXX11 ;READER INPUT ;------------ ; B66C 1E07 RDRIN: MVI E,7 ;READER INPUT B66E CDADB6 CALL REDIR ; IOBYTE: 76543210 B671 C1B6 DW TTYIN ;RDR: = TTY: XXXX00XX B673 EAB6 DW PTRIN ;RDR: = PTR: XXXX01XX B675 13B7 DW UR1IN ;RDR: = UR1: XXXX10XX B677 13B7 DW UR2IN ;RDR: = UR2: XXXX11XX ;READER STATUS ;------------- ; B679 1E07 RDRIST: MVI E,7 ;READER INPUT STATUS B67B CDADB6 CALL REDIR ; IOBYTE: 76543210 B67E DAB6 DW TTYIST ;RDR: = TTY: XXXX00XX B680 03B7 DW PTRIST ;RDR: = PTR: XXXX01XX B682 3EB7 DW UR1IST ;RDR: = UR1: XXXX10XX B684 3EB7 DW UR2IST ;RDR: = UR2: XXXX11XX ;PUNCH OUTPUT ;----------- ; CP/M MACRO ASSEM 2.0 #106 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B686 1E05 PUNOUT: MVI E,5 ;PUNCH OUTPUT B688 CDADB6 CALL REDIR ; IOBYTE: 76543210 B68B CDB6 DW TTYOUT ;PUN: = TTY: XX00XXXX B68D F6B6 DW PTPOUT ;PUN: = PTP: XX01XXXX B68F 25B7 DW UP1OUT ;PUN: = UP1: XX10XXXX B691 25B7 DW UP2OUT ;PUN: = UP2: XX11XXXX ;LIST OUTPUT ;----------- ; PB693 1E03 LSTOUT: MVI E,3 ;LIST OUTPUT B695 CDADB6 CALL REDIR ; IOBYTE: 76543210 B698 CDB6 DW TTYOUT ;LST: = TTY: 00XXXXXX B69A F6B6 DW CRTOUT ;LST: = CRT: 01XXXXXX B69C 25B7 DW LPTOUT ;LST: = LPT: 10XXXXXX B69E 25B7 DW UL1OUT ;LST: = UL1: 11XXXXXX ;LIST STATUS ;----------- ; PB6A0 1E03 LSTOST: MVI E,3 ;LIST OUTPUT STATUS B6A2 CDADB6 CALL REDIR ; IOBYTE: 76543210 B6A5 E2B6 DW TTYOST ;LST: = TTY: 00XXXXXX B6A7 0BB7 DW CRTOST ;LST: = CRT: 01XXXXXX B6A9 46B7 DW LPTOST ;LST: = LPT: 10XXXXXX B6AB 46B7 DW UL1OST ;LST: = UL1: 11XXXXXX ;REDIRECT THE I/O ;---------------- ; B6AD 3A0300 REDIR: LDA IOBYTE ;GET THE INTEL STANDARD IOBYTE B6B0 07 REDIR0: RLC ;SHIFT THE NEXT FIELD IN B6B1 1D DCR E ;BUMP THE SHIFT COUNT B6B2 C2B0B6 JNZ REDIR0 B6B5 E606 REDIR1: ANI 110B ;MASK THE REDIRECTION FIELD B6B7 5F MOV E,A ;MAKE THE WORD TABLE OFFSET B6B8 1600 MVI D,0 B6BA E1 POP H ;GET THE TABLE BASE B6BB 19 DAD D ;OFFSET INTO OUR TABLE B6BC 7E MOV A,M ;LOAD THE LOW LEVEL I/O ROUTINE POINTER B6BD 23 INX H B6BE 66 MOV H,M B6BF 6F MOV L,A B6C0 E9 PCHL ;EXECUTE THE LOW LEVEL I/O DRIVER ;LEFT SERIAL PORT ROUTINES. USE TTY: DEVICE. ;-------------------------------------------- ; B6C1 DB03 TTYIN: IN NSLSTA ;READ A CHARACTER B6C3 E602 ANI NSSRBR B6C5 CAC1B6 JZ TTYIN ;WAIT TILL A CHARACTER IS READY B6C8 DB02 IN NSLDAT ;GET THE CHARACTER B6CA E67F ANI 7FH ;STRIP PARITY B6CC C9 RET CP/M MACRO ASSEM 2.0 #107 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B6CD DB03 TTYOUT: IN NSLSTA ;WRITE A CHARACTER B6CF E601 ANI NSSTBE B6D1 CACDB6 JZ TTYOUT ;WAIT TILL THE BUFFER IS EMPTY B6D4 79 MOV A,C ;WRITE THE CHARACTER B6D5 E67F ANI 7FH B6D7 D302 OUT NSLDAT B6D9 C9 RET B6DA DB03 TTYIST: IN NSLSTA ;RETURN INPUT BUFFER STATUS B6DC E602 ANI NSSRBR B6DE C8 RZ ;RETURN NOT READY B6DF 3EFF MVI A,0FFH B6E1 C9 RET ;THERE IS A CHARACTER READY B6E2 DB03 TTYOST: IN NSLSTA ;RETURN OUTPUT BUFFER STATUS B6E4 E601 ANI NSSTBE B6E6 C8 RZ ;RETURN NOT READY B6E7 3EFF MVI A,0FFH B6E9 C9 RET ;RETURN READY ;RIGHT SERIAL PORT ROUTINES. USE CRT:, PTR:, AND PTP: DEVICES. ;-------------------------------------------------------------- ; CRTIN: B6EA DB05 PTRIN: IN NSRSTA ;READ A CHARACTER B6EC E602 ANI NSSRBR B6EE CAEAB6 JZ CRTIN ;WAIT TILL A CHARACTER IS READY B6F1 DB04 IN NSRDAT ;GET THE CHARACTER B6F3 E67F ANI 7FH ;STRIP PARITY B6F5 C9 RET CRTOUT: B6F6 DB05 PTPOUT: IN NSRSTA ;WRITE A CHARACTER B6F8 E601 ANI NSSTBE B6FA CAF6B6 JZ CRTOUT ;WAIT TILL THE BUFFER IS EMPTY B6FD 79 MOV A,C ;WRITE THE CHARACTER B6FE E67F ANI 7FH B700 D304 OUT NSRDAT B702 C9 RET CRTIST: B703 DB05 PTRIST: IN NSRSTA ;RETURN INPUT BUFFER STATUS B705 E602 ANI NSSRBR B707 C8 RZ ;RETURN NOT READY B708 3EFF MVI A,0FFH B70A C9 RET ;THERE IS A CHARACTER READY B70B DB05 CRTOST: IN NSRSTA ;RETURN OUTPUT BUFFER STATUS B70D E601 ANI NSSTBE B70F C8 RZ ;RETURN NOT READY B710 3EFF MVI A,0FFH B712 C9 RET ;RETURN READY ;PARALLEL PORT ROUTINES ;---------------------- ; USE UC1: UR1: UP1: UP2: LPT: AND UL1: DEVICES. CP/M MACRO ASSEM 2.0 #108 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ; UC1IN: UR1IN: B713 DB06 UR2IN: IN NSPSTA ;READ A CHARACTER B715 E601 ANI NSPRBR B717 CA13B7 JZ UC1IN ;WAIT TILL A CHARACTER IS READY B71A DB00 IN NSPDAT ;GET THE CHARACTER B71C F5 PUSH PSW B71D 3E30 MVI A,30H ;RESET THE PARALLEL INPUT FLAG B71F D306 OUT NSPSTA B721 F1 POP PSW B722 E67F ANI 7FH ;STRIP PARITY B724 C9 RET UC1OUT: UP1OUT: UP2OUT: LPTOUT: B725 DB06 UL1OUT: IN NSPSTA ;WRITE A CHARACTER B727 E602 ANI NSPTBE B729 CA25B7 JZ UC1OUT ;WAIT TILL THE BUFFER IS EMPTY B72C 3E20 MVI A,20H ;RESET THE PARALLEL OUTPUT FLAG B72E D306 OUT NSPSTA B730 79 MOV A,C ;WRITE THE CHARACTER, STROBE BIT 7 B731 F680 NSPOUT: ORI 80H B733 D300 OUT NSPDAT B735 E67F ANI 7FH B737 D300 OUT NSPDAT B739 F680 ORI 80H B73B D300 OUT NSPDAT B73D C9 RET UC1IST: UR1IST: B73E DB06 UR2IST: IN NSPSTA ;RETURN INPUT BUFFER STATUS B740 E601 ANI NSPRBR B742 C8 RZ ;RETURN NOT READY B743 3EFF MVI A,0FFH B745 C9 RET ;RETURN READY LPTOST: B746 DB06 UL1OST: IN NSPSTA ;RETURN OUTPUT BUFFER STATUS B748 E602 ANI NSPTBE B74A C8 RZ ;RETURN NOT READY B74B 3EFF MVI A,0FFH B74D C9 RET ;RETURN READY ENDIF ;NORTH STAR I/O CONFIGURATION PAGE CP/M MACRO ASSEM 2.0 #109 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;************************* ;BEGIN LIST DEVICE DRIVERS ;************************* ; IF LSTTYP EQ 0 ;******************************* ;BEGIN PROM PATCH DRIVER (LDRV0) ;******************************* ; THE DRIVER ENTRIES LSTOUT AND LSTOST ARE DEFINED IN THE CP/M ; ALTERNATION GUIDE (E.G. 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. ; ; THESE ROUTINES ALL POINT TO LSTSKP INITIALLY SO THAT THE SYSTEM ; WON'T HANG UP, WAITING FOR A NON-EXISTANT LIST DEVICE TO BECOME ; READY. ; LSTOUT: JMP LSTSKP ;PRINTER OUTPUT LSTOST: JMP LSTSKP ;PRINTER OUTPUT STATUS LSTSET: JMP LSTSKP ;PRINTER INITIALIZATION LSTSKP: RET ENDIF ;END OF PATCH AREA FOR LIST DRIVERS IF LSTTYP EQ 1 ;******************************************* ;BEGIN PATCH AREA DRIVER (128 BYTES) (LDRV1) ;******************************************* ; THE DRIVER ENTRIES LSTOUT AND LSTOST ARE DEFINED IN THE CP/M ; ALTERNATION GUIDE (E.G. 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. ; ; THESE ROUTINES ALL POINT TO LSTSKP INITIALLY SO THAT THE SYSTEM ; WON'T HANG UP, WAITING FOR A NON-EXISTANT LIST DEVICE TO BECOME ; READY. ; B74E C357B7 LSTOUT: JMP LSTSKP ;PRINTER OUTPUT B751 C357B7 LSTOST: JMP LSTSKP ;PRINTER OUTPUT STATUS B754 C357B7 LSTSET: JMP LSTSKP ;PRINTER INITIALIZATION B757 C9 LSTSKP: RET B758 DS 118 ;(RESERVE THE REMAINING SPACE) ENDIF ;END OF PATCH AREA FOR LIST DRIVERS IF (LSTTYP GE 2) AND (LSTTYP LE 5) CP/M MACRO ASSEM 2.0 #110 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;***************************************************** ;BEGIN OTHER LIST DEVICES (LDRV2, LDRV3, LDRV4, LDRV5) ;***************************************************** ; ALL OTHER LIST DEVICES ARE MULTIO/WUNDERBUSS SERIAL I/O WITH ; DIFFERENT TYPES OF I/O PROTOCOLS. ; ALTERED REV E4, LSTTYP 2 THRU 5 ALWAYS INCLUDE CENTRONICS PUNCH ; NOTE: FIRST INSTRUCTION IN OUTPUT ROUTINE MUST BE CALL TO STATUS ; SO SWAP PROGRAM CAN RE-ASSIGN LIST STATUS ROUTINE. ; ALSO, THE POINTER TO THE DEVICE NAME STRING MUST BE JUST AHEAD OF ; THE ENTRY POINT ; ;LIST OUTPUT ;----------- DB 2 ;USED BY SWAP.COM ; LSTOUT: CALL LSTOST ;CHECK PRINTER STATUS ORA A JZ LSTOUT ;LOOP IF NOT READY MOV A,C ;PRINT THE CHARACTER OUT THR RET ;LIST STATUS ;----------- ; LSTOST: CALL SELLST ;PRINTER STATUS ROUTINE IN LSR ;CHECK IF TRANSMITTER BUFFER EMPTY ANI THRE RZ ;RETURN BUSY IF BUFFER IS NOT EMPTY 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) ;GROUP SELECT ROUTINES ;--------------------- ; SELLST: LXI D,GROUP ;PASS TO APPLICATION LDAX D ;SELECT PRINTER GROUP CP/M MACRO ASSEM 2.0 #111 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ORI LSTGRP OUT GRPSEL RET XSDONE: MVI A,0FFH ;PRINTER READY FOR DATA RET ;READER INPUT ;----------- ; DB 4 ;USED BY SWAP.COM RDRIN: CALL RDRIST JZ RDRIN ;WAIT FOR CHAR AVAIL IN RBR ;GET DATA ANI 7FH RET RDRIST: CALL SELLST ;IT'S THE LIST DEVICE KIDDIES IN LSR ;CHECK FOR CHAR ANI DR ;DATA READY? RZ ;EXIT FALSE MVI A,0FFH ;TRUE RET ;PUNCH OUTPUT ;----------- DB 3 ;USED BY SWAP.COM ; PUNOUT: CALL PUNOST ;SELECT GROUP ZERO, SENSESW JZ PUNOUT IN SENSESW ;READ MOTHERBOARD SWITCHES CPI 0FFH ;FF MEANS MULTIO JZ PMULT MOV A,C ;PRINT THE CHARACTER OUT DATA MVI A,0BFH OUT STROBE ;STROBE LOW (ASSERTED) XTHL XTHL ;STALL 10 US MVI A,0FFH OUT STROBE ;STROBE HIGH (INACTIVE) RET PMULT: MOV A,C ;PRINT THE CHARACTER OUT STROBE ;REALLY 'DATA' MVI A,0BFH OUT DATA ;STROBE LOW (ASSERTED) (REALLY STROBE) XTHL XTHL ;STALL 10 US MVI A,0FFH OUT DATA ;STROBE HIGH (INACTIVE) (REALLY STROBE) CP/M MACRO ASSEM 2.0 #112 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs RET ;PUNCH STATUS ;----------- ; PUNOST: LXI D,GROUP ;PASS TO APPLICATION LDAX D OUT GRPSEL ;SELECT PARALLEL PRINTER GROUP IN STATUS ANI BUSY RZ ;RETURN BUSY IF BUFFER IS NOT EMPTY MVI A,0FFH RET ;RETURN NOT BUSY ENDIF ;MULTIO WBIO SERIAL DRIVERS PAGE CP/M MACRO ASSEM 2.0 #113 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;************************ ;START OF THE DISK BUFFER ;************************ ; ALL OF THE ROUTINES FOLLOWING THIS EQUATE WILL BE OVERWRITTEN ; BY DISK ACCESSES. ; B7CE = BUFFER EQU $ PAGE CP/M MACRO ASSEM 2.0 #114 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;*********************************************** ;CONSOLE AND LIST DEVICE INITIALIZATION ROUTINES ;*********************************************** ; IF CONTYP EQ 2 ;********************************************************************* ;BEGIN MULTIO I/O OR WUNDERBUS CONSOLE INITIALIZATION ROUTINE (CIDRV2) ;********************************************************************* ; THIS ROUTINE READS THE SENSE SWITCH ON THE WB-14 AND SETS ; THE SPEED ACCORDINGLY. ; CONINT: 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 ;ENABLE DIVISOR ACCESS LATCH SETIT: MVI A,DLAB+WLS1+WLS0+STB OUT LCR ;SET THE BAUD RATE IN (DE) MOV A,D OUT DLM ;SET UPPER DIVISOR MOV A,E OUT DLL ;SET LOWER DIVISOR ;CLEAR DIVISOR LATCH CP/M MACRO ASSEM 2.0 #115 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs MVI A,WLS1+WLS0+STB 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 SELG0: LDA GROUP ;SELECT GROUP ZERO OUT GRPSEL RET SELRDR: LDA GROUP ;SELECT READER/PUNCH GROUP ORI 5-LSTGRP ;USE 'OTHER' SERIAL PORT OUT GRPSEL RET 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 ;END MULTI I/O, DECISION I CON INIT IF CONTYP EQ 3 ;*************************************************** ;BEGIN DJ2DB CONSOLE INITIALIZATION ROUTINE (CIDRV3) ;*************************************************** ; CONINT: CALL FDTSTAT ;CLEAN INPUT BUFFER RNZ ;ALL EMPTY CALL FDCIN JMP CONINT ENDIF ;END 2D/B CONSOLE INITIALIZATION IF CONTYP EQ 4 ;*************************************************** ;BEGIN DJDMA CONSOLE INITIALIZATION ROUTINE (CIDRV4) ;*************************************************** ; CONINT: CALL DMINIT ;SEE IF CONTROLLER PRESENT RC ;NO CONTROLLER, RETURN LXI H,0 ;CLEAR SHLD SERIN ;INITIALIZE NO CHAR PRESENT LXI H,DMACI ;CONSOLE INITIALIZATION SEQUENCE LXI D,3 ;HALT OFFSET CP/M MACRO ASSEM 2.0 #116 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs CALL DMDOIT RET ;DJDMA INITIALIZATION COMMAND STRING ;----------------------------------- ; DMACI: DB SENABL ;ENABLE SERIAL INPUT DB 1 DB DMHALT DB 0 ENDIF ;END DJDMA CONSOLE INTIALIZATION IF CONTYP EQ 6 ;******************************************************** ;BEGIN NORTH STAR CONSOLE INITIALIZATION ROUTINE (CIDRV6) ;******************************************************** ; INITIALIZE THE NORTH STAR MOTHER BOARD, LEFT SERIAL PORT, RIGHT ; SERIAL PORT, AND NORTH STAR RAM PARITY. ; ;INITIALIZE MOTHER BOARD B7CE AF CONINT: XRA A ;SET UP THE PARALLEL PORT + MOTHERBOARD B7CF D306 OUT 6 B7D1 D306 OUT 6 B7D3 D306 OUT 6 B7D5 D306 OUT 6 B7D7 3E30 MVI A,30H ;RESET THE PARALLEL PORT INPUT FLAG B7D9 D306 OUT NSPSTA B7DB 3E60 MVI A,60H ;SET THE PARALLEL PORT OUTPUT FLAG B7DD D306 OUT NSPSTA B7DF 3E0D MVI A,ACR ;FORCE A CR OUT THE PARALLEL PORT B7E1 CD31B7 CALL NSPOUT ;INITIALIZE THE LEFT SERIAL PORT B7E4 3ECE MVI A,NSLIN1 ;SEE THE EQUATES FOR BIT DEFINATIONS B7E6 D303 OUT NSLSTA B7E8 3E37 MVI A,NSLIN2 B7EA D303 OUT NSLSTA B7EC AF XRA A ;CLEAR THE INPUT/OUTPUT BUFFERS B7ED D302 OUT NSLDAT B7EF DB02 IN NSLDAT B7F1 DB02 IN NSLDAT ;INITIALIZE THE RIGHT SERIAL PORT B7F3 3ECE MVI A,NSRIN1 ;SEE THE EQUATES FOR BIT DEFINATIONS B7F5 D305 OUT NSRSTA B7F7 3E37 MVI A,NSRIN2 B7F9 D305 OUT NSRSTA B7FB AF XRA A ;CLEAR THE INPUT/OUTPUT BUFFERS B7FC D304 OUT NSRDAT B7FE DB04 IN NSRDAT B800 DB04 IN NSRDAT IF NSRAM NE 0 ;RESET PARITY ON NORTH STAR RAMS B802 3E40 MVI A,40H ;DISABLE PARITY LOGIC CP/M MACRO ASSEM 2.0 #117 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B804 D3C0 OUT NSRAM B806 210000 LXI H,0 ;STARTING ADDRESS B809 7E NSET0: MOV A,M ;GET A BYTE B80A 77 MOV M,A ;REWRITE, SET PROPER PARITY B80B 2C INR L ;BUMP THE ADDRESS POINTER B80C C209B8 JNZ NSET0 B80F 24 NSET1: INR H ;SKIP TO THE NEXT MEMORY PAGE B810 CA2FB8 JZ NSET2 ;SKIP IF ALL DONE B813 1113B9 LXI D,$ + 100H ;FIX FOR ASSEM WITH RMAC B816 7A MOV A,D ; MVI A,(HIGH $) + 1 ;IS THE POINTER ABOVE US? B817 BC CMP H ;SET CARRY IF POINTER IS <= OUR PAGE+1 B818 DA09B8 JC NSET0 ;RESET THE NEXT PAGES PARITY B81B 7E MOV A,M ;TEST FOR A PROM OR NO MEMORY B81C 47 MOV B,A ;SAVE THE ORIGINAL BYTE B81D 2F CMA ;SEE IF THIS LOCATION WILL CHANGE B81E 77 MOV M,A B81F BE CMP M ;TEST FOR A CHANGE B820 70 MOV M,B ;RESTORE THE ORIGINAL VALUE B821 CA09B8 JZ NSET0 ;VALUE COMPLEMENTED, MUST BE RAM B824 B7 ORA A ;TEST FOR NO MEMORY PRESENT B825 CA0FB8 JZ NSET1 ;SKIP TO THE NEXT PAGE IF NO MEMORY B828 110007 LXI D,700H ;SKIP 2K BYTES OF 'PROM' B82B 19 DAD D B82C D20FB8 JNC NSET1 ;DO A PAGE CHECK IF NO OVERFLOW B82F 3E41 NSET2: MVI A,41H ;RE-ENABLE PARITY ON THE MEMORY BOARDS B831 D3C0 OUT NSRAM ENDIF CRTSET: ;NULL ROUTINES PTRSET: PTPSET: UC1SET: UR1SET: UR2SET: UP1SET: UP2SET: LPTSET: B833 C9 UL1SET: RET ENDIF ;END NORTH STAR INITIALIZATION PAGE CP/M MACRO ASSEM 2.0 #118 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF (LSTTYP GE 2) AND (LSTTYP LE 5) ;******************************************************************* ;BEGIN MULTIO I/O OR WUNDERBUSS LIST AND PUNCH INITIALIZATION ;ROUTINE ;******************************************************************* ; 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 ;FALL THRU TO CENTRONICS INIT ;******************************************************************* ;BEGIN MULTIO I/O OR WUNDERBUSS PARALLEL LIST INITIALIZATION ROUTINE ;******************************************************************* ; PUNSET: LDA GROUP OUT GRPSEL ;SELECT PARALLEL PORT IN SENSESW ;READ MOTHERBOARD SWITCHES CPI 0FFH ;FF IS MULTIO JZ IMULT MVI A,0FFH OUT STROBE ;TURN STROBES OFF MVI A,0C0H OUT CLK ;TURN ON DRIVERS MVI A,07FH OUT STROBE ;ASSERT RESTORE (LOW TRUE) MVI A,0FFH OUT STROBE ;INACTIVATE RESTORE RET IMULT: LDA GROUP ORI DENABLE STA GROUP ;TURN PARALLEL PORT DRIVERS ON OUT GRPSEL ;SELECT PARALLEL PORT MVI A,0C0H OUT STROBE ;TURN DATA STROBE OFF LDA GROUP ORI RESTOR OUT GRPSEL ;ASSERT RESTORE LDA GROUP OUT GRPSEL ;DE-ASSERT RESTORE RET CP/M MACRO ASSEM 2.0 #119 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ENDIF ;END MULTIO/WBIO PUNCH / LIST INIT PAGE CP/M MACRO ASSEM 2.0 #120 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;********************** ;BEGIN COLD BOOT LOADER ;********************** ; CBOOT IS THE COLD BOOT LOADER. ALL OF CP/M HAS BEEN LOADED IN ; WHEN CONTROL IS PASSED HERE. ; B834 310001 CBOOT: LXI SP,TPA ;SET UP STACK B837 AF XRA A ;CLEAR COLD BOOT FLAG B838 32A5AC STA CWFLG B83B 32BAAC STA GROUP ;CLEAR GROUP SELECT BYTE B83E 3235B6 STA CPMDRV ;SELECT DISK A: B841 320400 STA CDISK B844 2103AC LXI H,CBIOS+3 ;PATCH COLD BOOT TO WARM CODE B847 7C MOV A,H B848 3200AD STA BPAGE ;SET CBIOS BASE PAGE NUMBER B84B 2201AC SHLD CBIOS+1 B84E 3AB9AC LDA IOBYT ;INITIALIZE THE IOBYTE B851 320300 STA IOBYTE B854 AF XRA A B855 11CEBB LXI D,BADMAP ;CLEAR OUT BAD MAP B858 12 STAX D B859 21CFBB LXI H,BADMAP+1 B85C 010900 LXI B,9*BADSIZ ;32 MAP ENTRIES B85F CDD5AE CALL MOVBYT B862 36FF MVI M,0FFH ;END MARKER IF CONTYP NE 6 ;NON IOBYTE INITS CALL CONINT ;INITIALIZE THE TERMINAL CALL LSTSET ;INITIALIZE THE LIST DEVICE ELSE ;DO IOBYTE INITS B864 217BB8 LXI H,DEVSET ;DEVICE SETUP ROUTINE POINTER TABLE B867 5E CBOOT0: MOV E,M ;LOAD A ROUTINE ADDRESS B868 23 INX H B869 56 MOV D,M B86A 23 INX H B86B 7A MOV A,D ;TEST FOR THE END OF THE TABLE B86C B3 ORA E B86D CA93B8 JZ CBOOT2 B870 E5 PUSH H ;SAVE THE TABLE POINTER B871 2177B8 LXI H,CBOOT1 ;RETURN ADDRESS B874 E5 PUSH H B875 EB XCHG B876 E9 PCHL ;'CALL' A DEVICE SETUP ROUTINE B877 E1 CBOOT1: POP H ;RESTORE THE TABLE POINTER B878 C367B8 JMP CBOOT0 ;DEVICE SETUP ROUTINE POINTERS ;----------------------------- B87B CEB733B833DEVSET: DW CONINT, CRTSET, UC1SET CP/M MACRO ASSEM 2.0 #121 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs B881 33B833B833 DW PTRSET, UR1SET, UR2SET B887 33B833B833 DW PTPSET, UP1SET, UP2SET B88D 33B833B800 DW LPTSET, UL1SET, 0 B893 = CBOOT2 EQU $ ENDIF B893 219CB8 LXI H,PROMPT ;PREP FOR SENDING SIGNON MESSAGE B896 CDEBAE CALL MESSAGE ;SEND THE PROMPT B899 C350AC JMP GOCPM ;SIGNON MESSAGE OUTPUT DURING COLD BOOT ;-------------------------------------- ; PRINT A MESSAGE LIKE: ; ; MORROW DESIGNS 48K CP/M 2.2 E4 ; AB: DJ/DMA 8", CD: DJ/DMA 5 1/4", E: HDC/DMA M5 ; ;PRINT STRING FOR THE FIRST LINE OF THE SIGN-ON MESSAGE ;------------------------------------------------------ B89C 801A PROMPT: DB 80H, CLEAR ;CLEAN BUFFER AND SCREEN B89E 0D0A0A DB ACR, ALF, ALF B8A1 4D6F72726F DB 'Morrow Designs ' B8B0 34 DB '0'+MSIZE/10 ;CP/M MEMORY SIZE B8B1 38 DB '0'+(MSIZE MOD 10) B8B2 4B2043502F DB 'K CP/M ' ;CP/M VERSION NUMBER B8B9 32 DB CPMREV/10+'0' B8BA 2E DB '.' B8BB 32 DB (CPMREV MOD 10)+'0' B8BC 20 DB ' ' B8BD 45 DB (REVNUM/10)+'A'-1 B8BE 34 DB (REVNUM MOD 10)+'0' B8BF 0D0A DB ACR, ALF ;MACROS TO GENERATE THE SECOND LINE OF THE SIGN-ON MESSAGE ;--------------------------------------------------------- 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 ENDM PRNIB MACRO DIGIT ;WRITE A DIGIT IN HEX TEMP SET DIGIT AND 0FH CP/M MACRO ASSEM 2.0 #122 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs IF TEMP LT 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 IF DN EQ HDORDER ;GENERATE THE HDCA'S MESSAGE MSBUMP MAXHD*HDLOG DB 'HDCA ' IF MAXHD GT 1 DB '(', MAXHD+'0', ')' ENDIF IF M10 NE 0 IF M10M NE 0 DB 'Memorex' ELSE DB 'Fujitsu' ENDIF DB ' M10' ENDIF IF M20 NE 0 DB 'Fujitsu M20' ENDIF IF M26 NE 0 DB 'Shugart M26' ENDIF ENDIF IF DN EQ MWORDER ;GENERATE THE HDDMA'S MESSAGE MSBUMP MAXMW*MWLOG DB 'HDC/DMA' IF MWQUIET EQ 0 DB ' ' IF MAXMW GT 1 DB '(', MAXMW+'0', ')' ENDIF IF ST506 NE 0 DB 'M5' ENDIF IF ST412 NE 0 DB 'M10' ENDIF IF CM5619 NE 0 DB 'M16' ENDIF ENDIF ENDIF IF DN EQ FDORDER ;GENERATE THE 2D/B MESSAGE MSBUMP MAXFD CP/M MACRO ASSEM 2.0 #123 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DB 'DJ2D/B @' PRHEX FDORIG/100H PRHEX FDORIG ENDIF IF DN EQ DMORDER ;GENERATE THE DJDMA 8 MESSAGE MSBUMP MAXDM DB 'DJ/DMA 8"' ENDIF IF DN EQ MFORDER ;GENERATE THE DJDMA 5 1/4 MESSAGE MSBUMP MAXMF DB 'DJ/DMA 5 1/4"' ENDIF DN SET DN+1 ENDM B8C1+41 DB MSDRV+'A' B8C2+42 DB MSDRV+'A' B8C3+3A20 DB ': ' B8C5+444A2F444D DB 'DJ/DMA 8"' B8CE+2C20 DB ', ' B8D0+43 DB MSDRV+'A' B8D1+44 DB MSDRV+'A' B8D2+3A20 DB ': ' B8D4+444A2F444D DB 'DJ/DMA 5 1/4"' B8E1 0D0A DB ACR,ALF B8E3 00 DB 0 ;END OF MESSAGE PAGE CP/M MACRO ASSEM 2.0 #124 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;DEBUGGING CHECKS ;---------------- B8E4 = CODEND EQU $ BBE4 = SAVLN EQU CODEND+300H ;FOR MOVCPM 0CE4 = CODELEN EQU ($ - CBIOS) ;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 ;RESERVE THE SPACE FOR THE DISK BUFFER ;------------------------------------- B8E4 DS 512-($-BUFFER) ;BUFFER FOR 512 BYTE SECTORS IF (MAXFD NE 0) OR (MAXDM NE 0) OR (MAXMW NE 0) OR (MAXMF NE 0) B9CE DS 512 ;ADDITIONAL SPACE FOR 1K SECTOR DEVICES ENDIF PAGE CP/M MACRO ASSEM 2.0 #125 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;****************************** ;BEGIN UNINITIALIZED DATA AREAS ;****************************** ; ;BAD MAP SPACE ;============= ; 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) ; BBCE BADMAP: DS BADSIZ*9+1 ;32 ENTRIES + END MARKER ;DIRECTORY BUFFER ;================ ; BBD8 DIRBUF: DS 128 ;DIRECTORY BUFFER ;ALLOCATION AND CHECKED DIRECTORY TABLE AREA ;============================================ ; ;DJDMA 8" DRIVES ;--------------- ; IF MAXDM NE 0 ;DRIVE_0 BC58 CSVDM0: DS 64 BC98 ALVDM0: DS 75 ;DRIVE_1 BCE3 CSVDM1: DS 64 BD23 ALVDM1: DS 75 ;DRIVE_2 BD6E CSVDM2: DS 64 BDAE ALVDM2: DS 75 ;DRIVE_3 BDF9 CSVDM3: DS 64 BE39 ALVDM3: DS 75 ;DN SET 0 ; REPT MAXDM ; ALLOC DM,%DN,75,64 ;DN SET DN+1 ; ENDM ENDIF ;DJDMA 5" DRIVES ;--------------- ; IF MAXMF NE 0 CP/M MACRO ASSEM 2.0 #126 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;DRIVE_4 BE84 CSVMF0: DS 48 BEB4 ALVMF0: DS 25 ;DRIVE_5 BECD CSVMF1: DS 48 BEFD ALVMF1: DS 25 ;DRIVE_6 BF16 CSVMF2: DS 48 BF46 ALVMF2: DS 25 ;DRIVE_7 BF5F CSVMF3: DS 48 BF8F ALVMF3: DS 25 ;DN SET 0 ; REPT MAXMF ; ALLOC MF,%DN,25,48 ;DN SET DN+1 ; ENDM ENDIF ;DJ2DB DRIVES ;------------ ; IF MAXFD NE 0 DN SET 0 REPT MAXFD ALLOC FD,%DN,75,64 DN SET DN+1 ENDM ENDIF ;HDDMA DRIVES ;------------ ; IF MAXMW NE 0 DN SET 0 TRKOFF SET 8192/(MWSECPT/8)+1 PSIZE SET TRKOFF*(MWSECPT/8) REPT MAXMW BLOCKS SET MWSECPT/8*MWTRKS REPT BLOCKS/8192 ;GENERATE SOME 8 MEGABYTE ALV'S ALLOC MW,%DN,256,0 BLOCKS SET BLOCKS-PSIZE DN SET DN+1 ENDM BLOCKS SET BLOCKS/4 IF BLOCKS GT 256 ;USE THE REMAINDER BLOCKS SET BLOCKS-1 ALV SET (BLOCKS/8)+1 ALLOC MW,%DN,%ALV,0 CP/M MACRO ASSEM 2.0 #127 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs DN SET DN+1 ENDIF ENDM ENDIF ;HDCA DRIVES ;----------- ; IF MAXHD NE 0 DN SET 0 REPT MAXHD IF M26 NE 0 ALLOC HD,%DN,252,0 DN SET DN+1 ALLOC HD,%DN,252,0 DN SET DN+1 ALLOC HD,%DN,256,0 DN SET DN+1 ENDIF IF M10 NE 0 ALLOC HD,%DN,159,0 DN SET DN+1 ALLOC HD,%DN,161,0 DN SET DN+1 ENDIF IF M20 NE 0 ALLOC HD,%DN,255,0 DN SET DN+1 ALLOC HD,%DN,255,0 DN SET DN+1 ALLOC HD,%DN,129,0 DN SET DN+1 ENDIF ENDM ENDIF PAGE CP/M MACRO ASSEM 2.0 #128 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;DEBUGGING AIDS ;-------------- ; 0014 = BIOSLEN EQU (HIGH ($ - CBIOS)) + 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 PAGE CP/M MACRO ASSEM 2.0 #129 CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs ;REVISION HISTORY ;================ ; ; ; DATE PROGRAMMER DESCRIPTION ; ; 9 17 83 WEST * PUBLIC RELEASE OF E.4 FOR DJ/DMA AND HDC/DMA. ; 9 13 83 WEST REPAIRED DJ CONSOLE INIT/DRIVERS ; 9 12 83 WEST MULTIO INITIALIZATION SELECTS SWITCHES CORRECTLY ; 8 23 83 WEST ALL MULTIO/WBIO DEVICES HAVE NAMES FOR SWAP.COM ; 8 22 83 WEST PREP: NOW ALLOWS NORMAL SEEKS TO TRACK ZERO ; 8 21 83 WEST ALL MULTIO/WBIO CHARACTER DEVICES RETURN POINTER ; TO 'GROUP' IN [DE] TO TPA PROGRAM ; 8 15 83 WEST ALL MULTIO/WBIO SERIAL LIST HAVE CENTRONICS PUNCH ; AND RDR: IMPLEMENTED AS LIST INPUT ; 5 5 83 F.R.K. ADD PARALLEL CENTRONICS PRINTER THRU MULITO/WBIO ; 3 28 83 F.R.K. ADD DBL-SIDED SOFT SECTOR, FIX FOR RMAC ; 1 18 83 JZ DID A COSMETIC RESTRUCTURING OF THE CODE DEALING ; WITH THE DISKS AT BOTH THE HI AND LO LEVELS. ; 1 17 83 JZ NOW READS 5" SOFT SECTORED SINGLE DENSITY DISKS ; 1 16 83 JZ PATCHED UP VARIOUS HOLES IN THE DISK ERROR HANDELING ; ROUTINES IN THE HI-LEVEL ROUTINES SETDRV, READ, AND ; WRITE AND IN THE DJDMA DRIVERS ;*11 20 82 MARC PUBLIC RELEASE OF REVISION E.31 BFA8 END