CP/M RMAC ASSEM 1.1 #001 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 TITLE 'BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97' ; This is a CP/M 3.0 bios for the North Star double density ; controller in a non banked environment. ; ; The present plan is to boot CP/M 3 using an existing ; version of CP/M 2.2 patched to autoload CPM3.COM on bootup. ; ; Later versions will incorporate a loaderbios version for ; direct booting and the Morrow 8 inch disk board perhaps ; using a 1.2 or 1.44 meg drive for IBM compatability. ; ; These routines copyright (c) 1980, 1981, 1982 by Steve Bogolub, ; 2338 S. Scoville Ave., Berwyn, IL 60402. ; (The Jade routines will be replaced with Morrow) ; Jade Double D (tm) ; disk handlers contributed to the public domain for use on Jade ; equipment by special permission of Jade Computer Products. ; This software may be used freely for non-commercial purposes ; only, and may not be sold. ; ; THIS BIOS CONTAINS ROUTINES TO SUPPORT THE ; FOLLOWING HARDWARE: ; ; DISK: NORTH STAR MDS-AD2 DOUBLE DENSITY 5.25" ; FLOPPY DISK UNITS 1 AND 2 AS CP/M DRIVES ; A: AND B: ; ; JADE DOUBLE D REV C 8" FLOPPY DISK UNITS ; 0 AND 1 AS CP/M DRIVES C: AND D: ; ; SERIAL I/O: HORIZON LEFT (LOW) SERIAL I/O PORT AS ; CP/M DEVICE CRT: ; ; ; ; THE GENNED-IN CONSOLE IS DETERMINED BY SOLICITING ; A SPACE CODE (20H) FROM CRT:, TTY:, AND UC1:. IF ; NO SPACE CODE IS RECEIVED AFTER ABOUT EIGHT SECONDS ; (AT 4 MHZ), CRT: IS ASSUMED TO BE THE CONSOLE. IF ; A SPACE IS READ FROM ONE OF THE DEVICES, THAT DEVICE ; IS ASSUMED TO BE THE CONSOLE. ; ; SINCE THIS BIOS IS SO LARGE, MOVCPM SHOULD BE ; RUN FOR TWO LESS THAN THE DESIRED SYSTEM SIZE ; IN K, I.E. SPECIFY 30 FOR A 32K SYSTEM. ; ; *** IMPORTANT BOOTSTRAP INFO *** ; ; THIS BIOS IS INTENDED TO RUN IN THE LAST ; 3.5K OF MEMORY. THE LAST .5K IS SET ASIDE ; FOR A NORTH STAR SECTOR DEBLOCKING BUFFER. ; THE FIRST 3K IS GENNED-IN BIOS CODE, AND ; IS EXPECTED TO RESIDE ON TRACK 0 OF NORTH ; STAR DISK UNIT 1 (A:) IN SECTORS 5-9, AND ; 4. THE NORTH STAR BOOT PROM READS IN SECTOR ; 4 INTO CONSECUTIVE PAGES OF MEMORY, STARTING CP/M RMAC ASSEM 1.1 #002 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; WITH THE PAGE NUMBER SPECIFIED BY THE FIRST ; BYTE OF SECTOR DATA, THEN JUMPS TO THAT ; ADDRESS + 10 (0AH). THIS BIOS IS SET UP TO ; USE THAT METHOD TO COLD BOOT ITSELF. CODE ; AT THAT ADDRESS READS THE LAST FIVE SECTORS ; OF TRACK ZERO INTO MEMORY AT ADDRESS "BIOS", ; THEN JUMPS TO THE BIOS COLD START ADDRESS. ; THE BIOS COLD BOOT EXPECTS THE JADE DOUBLE D ; CONTROL CODE ("NDCM") TO RESIDE ON SECTORS ; ONE AND TWO OF TRACK ZERO, AND LOADS THOSE ; SECTORS FROM THE DISK INTO THE JADE DD MEMORY, ; THEN RESETS AND STARTS UP THE JADE DD RESIDENT ; Z80. THE BIOS WARM BOOT EXPECTS THE CCP/BDOS ; CODE TO RESIDE ON TRACKS 0-9 OF TRACK ONE ; (IN OTHER WORDS, THE WHOLE TRACK), AND THE ; LAST SECTOR IS EXPECTED TO BE ON TRACK ZERO, ; SECTOR 3. TRACK ZERO, SECTOR ZERO IS RESERVED ; FOR LIFEBOAT-COMPATIBLE ID INFO AND FUTURE ; ADDITIONS. THE MODIFIED VERSION OF SYSGEN ; NAMED "NSGEN" IS SET UP TO TRANSFER CP/M TO ; AND FROM DISK IN THIS REQUIRED MANNER. ; ; WE USE THE Z80 INSTRUCTION "LD A,I" ON ENTRY ; TO THE DISK READ AND WRITE ROUTINES TO GET ; THE STATUS OF THE INTERRUPT FLIP/FLOP, SINCE ; WE MUST DISABLE INTERRUPTS WHILE THE NORTH ; STAR DISK READS OR WRITES ARE PERFORMED. ; USING THE Z80 STATUS, WE CAN RE-ENABLE ; INTERRUPTS AFTER WE LEAVE. THIS CHECK IS ; DONE BY THE ROUTINES "INTDI" AND "INDEN", ; AND CAN EASILY BE REMOVED IF WE EVER GO ; TO A NON-Z80 CPU (NEVER, I HOPE). ; ; ; ; CONSOLE DEFINITIONS ; 0000 = MOTHR EQU 000H ;HORIZON MOTHERBOARD BASE 0002 = CRT EQU MOTHR+2 ;HORIZON LEFT SERIAL BASE ; ; ************************************************************* * * * BIOS AND LOADER BIOS FOR CP/M 3.0 (BETA V1.2) FOR DJ2D * * CONTROLLER. * * WRITTEN NOVEMBER 1982 BY DAVE HARDY AND KEN JACKSON * * * ************************************************************* TITLE 'BIOS AND LOADER BIOS FOR CP/M 3.0' ************************************************************* * * * TO INSTALL THIS BIOS INTO CP/M 3.0, PERFORM THE FOLLOWING * * STEPS: * * 1. CONSOLE AND PRINTER I/O ARE SET UP FOR A * CP/M RMAC ASSEM 1.1 #003 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 * NORTH STAR MOTHERBOARD * * 2. ADD ANY INITIALIZATION THAT YOU NEED AT TINIT: * * 3. SET THE LDRBIOS EQUATE IN THIS FILE TO TRUE * * 4. RMAC SCB (ASSEMBLE SCB.ASM, SUPPLIED) * * 5. RMAC BIOS3 (ASSEMBLE LDRBIOS) * * 6. REN LDRBIOS.REL=BIOS3.REL * * 7. SET THE LDRBIOS EQUATE IN THIS FILE FALSE * * 8. RMAC BIOS3 (ASSEMBLE BIOS) * * 9. LINK BIOS3[B]=BIOS3,SCB * * 10. GENCPM * * (ANSWER ALL QUESTIONS WITH A CARRIAGE RETURN * * EXCEPT ANSSWER "N" AT "BANK SWITCHED MEMORY?" * * QUESTION, AND ANSWER WITH YOUR TOP PAGE OF * * MEMORY WHEN ASKED "TOP PAGE OF MEMORY?") * * 11. LINK CPMLDR[L100]=CPMLDR,LDRBIOS * * 12. CPMLDR (LOAD AND RUN CP/M 3.0) * * * ************************************************************* 0000 = FALSE EQU 0 ;DEFINE TRUE AND FALSE FFFF = TRUE EQU NOT FALSE ************************************************************* * * * THE FOLLOWING REVISION NUMBER IS IN REFERENCE TO THE CP/M * * 3.0 CBIOS. * * * ************************************************************* 000A = REVNUM EQU 10 ;BIOS REVISION NUMBER 001E = CPMREV EQU 30 ;CP/M REVISION NUMBER ************************************************************* * * * THESE ARE THE ROUTINES CALLED FROM THE DJ2D'S BUILT-IN * * EPROM. (MODEL B ONLY) * * * ************************************************************* E000 = ORIGIN EQU 0E000H ;EPROM ORIGIN OF YOUR DJ2D BOARD E400 = DJRAM EQU ORIGIN+400H ;RAM ADDRESS E409 = DJHOME EQU DJRAM+9H ;DJ2D TRACK ZERO SEEK E40C = DJTRK EQU DJRAM+0CH ;DJ2D TRACK SEEK ROUTINE E40F = DJSEC EQU DJRAM+0FH ;DJ2D SET SECTOR ROUTINE E412 = DJDMA EQU DJRAM+012H ;SET DMA ADDRESS E415 = DJREAD EQU DJRAM+15H ;READ ROUTINE E418 = DJWRITE EQU DJRAM+18H ;WRITE ROUTINE E41B = DJSEL EQU DJRAM+1BH ;DJ2D SELECT DRIVE ROUTINE E427 = DJSTAT EQU DJRAM+27H ;STATUS ROUTINE E430 = DJSIDE EQU DJRAM+30H ;SET SIDE ROUTINE ************************************************************* * * * MISCELLANEOUS INTERNAL BIOS EQUATES. * * WE'VE TRIED TO MAINTAIN COMPATIBILITY WITH THE MORROW'S * * DJ2D BIOS. * CP/M RMAC ASSEM 1.1 #004 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 * * ************************************************************* 0000 = LDRBIOS EQU FALSE ;TRUE IF YOU WANT TO ASSEMBLE AS LOADER BIOS 0004 = CDISK EQU 4 ;ADDRESS OF LAST LOGGED DISK 0080 = BUFF EQU 80H ;DEFAULT BUFFER ADDRESS 0100 = TPA EQU 100H ;TRANSIENT MEMORY 0005 = ENTRY EQU 5 ;BDOS ENTRY JUMP ADDRESS 000A = RETRIES EQU 10 ;MAX RETRIES ON DISK I/O BEFORE ERROR 000D = ACR EQU 0DH ;CARRIAGE RETURN 000A = ALF EQU 0AH ;A LINE FEED 0020 = SPACE EQU 20H ;ASCII SPACE 0004 = MAXDISK EQU 4 ;MAX OF DISK DRIVES 001A = CLEAR EQU 1AH ;CLEAR SCREEN CODE FOR LDRBIOS 57ED = LDAI EQU 057EDH ;Z80 "LD A,I" BYTE-SWAPPED ; FOR "DW" USE ; ; DISK OPERATING SYSTEM ADDRESSES ; 0034 = NKSYS EQU 52 ;SYS SIZE IN K BYTES 0400 = KBYTE EQU 1024 ;1K BYTE SIZE D000 = CPMSZ EQU NKSYS*KBYTE ;TOP SYSTEM ADDRESS 7800 = CPMBS EQU CPMSZ-(22*KBYTE);CP/M BIAS VALUE AC00 = CCP EQU CPMBS+3400H ;ADDRESS OF CCP B400 = BDOS EQU CPMBS+3C00H ;ADDRESS OF BDOS C200 = BIOS EQU CPMBS+4A00H ;ADDRESS OF BIOS 6180 = BIOSR EQU 1F80H-BIOS+400H ;DDT LOAD OFFSET ;(LEAVES ROOM FOR NDCM) 0004 = DEFDSK EQU 0004H ;DEFAULT DISK FOR CCP 0080 = SECSZ EQU 128 ;BYTES PER SECTOR 0200 = HSTSIZ EQU 512 ;BYTES PER N* SECTOR ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; 0000 = WRALL EQU 0 ;WRITE TO ALLOCATED 0001 = WRDIR EQU 1 ;WRITE TO DIRECTORY 0002 = WRUAL EQU 2 ;WRITE TO UNALLOCATED ; ; NORTH STAR MEMORY MAPPED I/O ADDRESSES ; E800 = CBOOT EQU 0E800H ;COLD BOOT ROM ADDRESS E900 = WDATA EQU 0E900H ;WRITE DATA. DATA IS ; LOW 8 ADRESS BITS. EA00 = CORDER EQU 0EA00H ;CONTROLLER ORDER EB00 = CCMND EQU 0EB00H ;CONTROLLER COMMAND ************************************************************* * * * PUBLIC AND EXTERNAL DECLARATIONS REQUIRED FOR CP/M PLUS. * * * ************************************************************* CSEG PUBLIC ?BOOT,?WBOOT,?CONST,?CONIN,?CONO,?LIST,?AUXO,?AUXI PUBLIC ?HOME,?SLDSK,?STTRK,?STSEC,?STDMA,?READ,?WRITE CP/M RMAC ASSEM 1.1 #005 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 PUBLIC ?LISTS,?SCTRN PUBLIC ?CONOS,?AUXIS,?AUXOS,?DVTAB,?DEVIN,?DRTBL,?MLTIO,?FLUSH PUBLIC ?MOV,?TIM,?BNKSL,?STBNK,?XMOV IF NOT LDRBIOS L PUBLIC ?INIT,?LDCCP EXTRN @CIVEC,@COVEC,@AIVEC,@AOVEC,@LOVEC,@MXTPA ENDIF ;NOT LDRBIOS ************************************************************* * * * THE BIOS 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. THERE ARE 33 JUMPS IN THE CP/M PLUS BIOS VECTOR* * * ************************************************************* ; 0000 C300E8 ?BOOT: JMP CBOOT ;COLD START ENTRY POINT WBOOTE: 0003 C3D407 ?WBOOT: JMP WBOOT ;WARM START ENTRY POINT 0006 C32904 ?CONST: JMP CONST ;CONSOLE STATUS A=FF=READY 0009 C31204 ?CONIN: JMP CONIN ;CONSOLE INPUT DATA IN A COUT: 000C C31E04 ?CONO: JMP CONOUT ;CONSOLE OUTPUT DATA IN C 000F C37204 ?LIST: JMP LIST ;LIST DEVICE DATA IN C 0012 C34504 ?AUXO: JMP AUXOUT ;PUNCH DEVICE NONE 0015 C33904 ?AUXI: JMP AUXIN ; READER DEVICE NONE 0018 C3E703 ?HOME JMP HOME ;SEEK HOME TRACK 001B C30503 ?SLDSK: JMP SETDRV ;SELECT DISK DISK IN C 001E C3F303 ?STTRK: JMP SETTRK ;SEEK TRACK TRACK IN BC 0021 C3F803 ?STSEC: JMP SETSEC ;SET SECTOR SECTOR IN BC 0024 C3FD03 ?STDMA: JMP SETDMA ;SET DMA DMA IN BC 0027 C3B904 ?READ: JMP READ ;READ SECTOR 002A C3B004 ?WRITE: JMP WRITE ;WRITE SECTOR 002D C39304 ?LISTS: JMP LISTST ;RETURN LIST STATUS A=FF=READY 0030 C30304 ?SCTRN: JMP SECTRAN ;SECTOR TRANSLATE SECTOR IN BC 0033 C33104 ?CONOS: JMP CONOST ; OUTPUT STATUS OF CONSOLE 0036 C35004 ?AUXIS: JMP AUXIST ; INPUT STATUS OF AUX. PORT 0039 C35804 ?AUXOS: JMP AUXOST ; OUTPUT STATUS OF AUX. PORT 003C C36300 ?DVTAB: JMP DEVTBL ; ADDRESS OF CHAR. I/O TABLE 003F C36D00 ?DEVIN: JMP DEVINI ;INITIALIZE CHAR. I/O DEVICES 0042 C36900 ?DRTBL: JMP DRVTBL ; ADDRESS OF DISK DRIVE TABLE 0045 C36D00 ?MLTIO: JMP MULTIO ;SET NUMBER OF LOGICALLY CONSECUITIVE ;SECTORS TO BE READ OR WRITTEN 0048 C36700 ?FLUSH: JMP FLUSH ;FORCE PHYSICAL BUFFER FLUSHING FOR ;USER-SUPPORTED DEBLOCKING 004B C37100 ?MOV: JMP MOVE ;MEMORY MOVE FOR LARGE MEMORY COPY 004E C36D00 ?TIM: JMP ?TIME ;GET THE TIME 0051 C36D00 ?BNKSL: JMP SELMEM ;SELECT ALTERNATE BANK OF MEMORY 0054 C36D00 ?STBNK: JMP SETBNK ;SELECT BANK FOR DMA OPERATION 0057 C36D00 ?XMOV: JMP XMOVE ;SET BANK WHEN A BUFFER IS IN A BANK ; THAN 0 OR 1 005A C31BE4 DJDRV JMP DJSEL ;HOOK FOR SINGLE.COM PROGRAM ;RESERVED FOR SYSTEM IMPLEMENTOR 005D C36D00 JMP RESERV1 ;RESERVED FOR CP/M PLUS CP/M RMAC ASSEM 1.1 #006 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 0060 C36D00 JMP RESERV2 ;RESERVED FOR CP/M PLUS ; ; DEVICE TABLE IS NOT IMPLEMENTED, SO RETURN HL=0 0063 210000 DEVTBL: LXI H,0 0066 C9 RET ; ; FLUSH ROUTINE IS NOT IMPLEMENTED, SO RETURN A=0 0067 AF FLUSH: XRA A 0068 C9 RET ; ; DRIVE TABLE IS NOT USED, SO RETURN HL=0FFFEH 0069 21FEFF DRVTBL: LXI H,0FFFEH 006C C9 RET ; ; THE FOLLOWING JUMPS FROM THE BIOS JUMP VECTOR ; ARE NOT IMPLEMENTED: IF LDRBIOS AUXIST: AUXOUT: AUXIN: AUXOST: LIST: LISTST ENDIF ;LDRBIOS DEVINI: MULTIO: XMOVE: SELMEM: SETBNK: RESERV1: RESERV2: ?TIME: 006D C9 RET ************************************************************* * * * MOVER MOVES 128 BYTES OF DATA. SOURCE POINTER IN DE, DEST * * POINTER IN HL. * * * ************************************************************* 006E 018000 MOVER LXI B,128 ;LENGTH OF TRANSFER ************************************************************* * * * GENERAL PURPOSE MEMORY MOVE SUBROUTINE. * * MOVES BC BYTES FROM DE TO HL * * * ************************************************************* 0071 1A MOVE: LDAX D 0072 77 MOV M,A 0073 13 INX D 0074 23 INX H 0075 0D DCR C CP/M RMAC ASSEM 1.1 #007 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 0076 C27100 JNZ MOVE 0079 78 MOV A,B 007A B1 ORA C 007B C8 RZ 007C 05 DCR B 007D C37100 JMP MOVE ; ; BLOCK - BLOCK MOVE (Z80 LDIR REGISTER USAGE) ; 0080 7E BLOCK: MOV A,M ;GET BYTE 0081 12 STAX D ;STORE IT 0082 23 INX H ;BOP PTRS 0083 13 INX D 0084 0B DCX B ;COUNT OFF BYTE 0085 78 MOV A,B ;CHECK FOR DONE 0086 B1 ORA C 0087 C28000 JNZ BLOCK ;GO BACK IF NOT 008A C9 RET ; ;******************************************************** ; NORTH STAR STUFF FROM HERE DOWN ;******************************************************** ; ; INIT - COLD START ENTRY ** DIRECTORY BUFFER OVERLAY ** ; 008B = DIRBUF EQU $ ;BUFFER BEGINNING ; ; SCRATCH RAM FOR BDOS OVERLAY ; 010B = D0ALL EQU DIRBUF+SECSZ ;OVERLAY ALLOCATE AND CHECK 0122 = D0CHK EQU D0ALL+23 ; BUFFERS HERE TOO 0132 = D1ALL EQU D0CHK+16 0149 = D1CHK EQU D1ALL+23 0159 = D2ALL EQU D1CHK+16 ;NOTE THAT THE JADE DISKS 01EF = D2CHK EQU D2ALL+150 ; (C: AND D:) MAY NEED 022F = D3ALL EQU D2CHK+64 ; MUCH MORE ALLOC AND 02C5 = D3CHK EQU D3ALL+150 ; CHECK SPACE THAN N* 0305 = ENDOV EQU D3CHK+64 ;END OF OVERLAY AREA ; ; THE INIT ROUTINE IS ACTUALLY A CONTINUATION OF THE ; COLD BOOT BEGUN DOWN AT "BOOT". ; 008B 31F3CF INIT: LXI SP,HSTBUF+HSTSIZ ;SET SP TO SCRATCH AREA 008E 2100AC LXI H,CCP ;WHERE TO START CP/M 0091 E5 PUSH H 0092 AF XRA A ;INIT HORIZON MOTHERBOARD 0093 D306 OUT MOTHR+6 0095 3208CC STA COLDB ;BIOS NOW IN MEMORY 0098 CDC200 CALL DELAY ;DELAY FOR 8251'S 009B 3EAE MVI A,0AEH ;INIT SERIAL PORTS 009D D303 OUT CRT+1 ;OUTPUT DUMMY MODE TO INSURE 009F CDC200 CALL DELAY 00A2 3E40 MVI A,040H ; CMD EXPECTED, THEN OUTPUT 00A4 D303 OUT CRT+1 ; RESET CMD 00A6 CDC200 CALL DELAY 00A9 3E4E MVI A,04EH ;MODE: 1 STOP BIT, 16X CLK, CP/M RMAC ASSEM 1.1 #008 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 00AB D303 OUT CRT+1 ; 8 DATA BITS, NO PARITY 00AD CDC200 CALL DELAY 00B0 3E37 MVI A,037H ;CMD: RTS, ER, RXEN, DTR, TXEN 00B2 D303 OUT CRT+1 00B4 CDC200 CALL DELAY 00B7 DB02 IN CRT ;FLUSH RECEIVER INPUTS 00B9 21CC00 LXI H,MSGSO ;SIGN-ON MSG ADDRESS 00BC CD6A08 CALL MSGOT ;ISSUE MESSAGE ; ; 00BF C3F107 JMP CPMLD ;GO PERFORM WARM BOOT FUNCS ; ; THIS DELAY SUBROUTINE IS USED TO HELP US OUT ON ; TIMING WHEN RESETTING THE 8251 CONSOLE SERIAL DEVICE. ; 00C2 010006 DELAY: LXI B,600H 00C5 0B DEL5: DCX B 00C6 78 MOV A,B 00C7 B1 ORA C 00C8 C2C500 JNZ DEL5 00CB C9 RET ; 00CC 0D0A4E6F72MSGSO: DB ACR,ALF,'North Star / ' 00DB 4469736B20 DB 'Disk Jockey 2D/B ' 00EC 3532 DB (NKSYS/10)+'0',(NKSYS MOD 10)+'0' 00EE 4B2043502F DB 'K CP/M 2.2 of 02/21/82',ACR,ALF+80H ; IF ($-ENDOV) SHR 15 0305 ORG ENDOV ;FILL OUT OVERLAY SIZE ENDIF ; ; SELECT DRIVE - LOGON ; 0305 210000 SETDRV: LXI H,0 ;ERROR RETURN CODE 0308 79 MOV A,C ;PUT DRIVE # IN A 0309 FE04 CPI MAXDISK ;CHECK IF LEGAL DRIVE 030B D0 RNC ;NO CARRY IF ILLEGAL 030C 32E709 STA SEKDSK ;STORE DRIVE NUMBER 030F 43 MOV B,E ;SAVE LOGON REQ REG 0310 69 MOV L,C ;L = DISK NUMBER 0311 2600 MVI H,0 ;ZERO H REG 0313 29 DAD H ; *2 0314 29 DAD H ; *4 0315 29 DAD H ; *8 0316 29 DAD H ; *16 (SIZE OF HEADER) 0317 119F09 LXI D,D0DPH ;DRIVE 0 DPH 031A 19 DAD D ;HL = DRIVE N DPH 031B 22ED09 SHLD DTPTR ;STORE DRIVE TBL PTR ; ; LOG-ON - SET DISK PARAMETER BLOCK ; ; -- CHECK IF LOG-ON REQUESTED ; 031E AF XRA A 031F 32EF09 STA LOGFLG ;ASSUME NO JADE LOGON 0322 78 MOV A,B ;CHECK LOG REQUEST CP/M RMAC ASSEM 1.1 #009 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 0323 E601 ANI 001H ;LOG ON BIT TEST 0325 C27E03 JNZ NOLOG ;PASS IF NO REQUEST U0328 CD0000 CALL HFLUSH ;MAKE SURE HOST BUF U032B C20000 JNZ LOGERR ; AVAILABLE, OUT ON ERR ; ; SEE IF DISK IS JADE OR NORTH STAR. ; 032E 3AE709 LDA SEKDSK ;GET DISK # 0331 FE02 CPI 2 U0333 D20000 JNC LOGDJ2D ;IF DISK JOCKEY, GO ELSEWHERE ; ; LOG ON NORTH STAR BY READING ID SECTOR, THEN DECIDE ; WHICH TABLE TO USE BASED ON SINGLE OR DOUBLE DENSITY. ; IF DOUBLE DENSITY, LOOK FOR LIFEBOAT 2.X FLAG BYTE ; AT OFFSET 05CH IN THE SECTOR, AND USE LIFEBOAT 2.X ; DPB IF THAT BYTE CONTAINS 0B0H. IF NOT, ASSUME OUR ; NORMAL LIFEBOAT 1.4-COMPATIBLE DPB FOR DOUBLE DENSITY. ; 0336 3203CC STA HSTDSK ;GOING TO ACCESS THIS DISK 0339 AF XRA A 033A 3204CC STA HSTTRK ;TRACK ZERO 033D 3205CC STA HSTSEC ;N* SECTOR ZERO 0340 CDCB04 CALL INTDI ;INTERRUPTS OFF 0343 CD35CC CALL READHST ;READ THE SECTOR 0346 CDBF04 CALL INTEN ;INTERRUPTS RESTORED 0349 3A06CC LDA ERFLAG ;CHECK FOR READ ERROR 034C B7 ORA A U034D C20000 JNZ LOGERR ;LOG-ON ERROR IF SO 0350 3A2CCC LDA NSDENS ;IF OK, GET DENSITY FLAG 0353 010000 LXI B,TRAN5S ;ASSUME SINGLE DENSITY, 0356 112509 LXI D,DPBNSS ; EVEN THO USUALLY WRONG 0359 B7 ORA A ;CHECK 035A C26E03 JNZ LOGNSD ;GO ON IF RIGHT 035D 01DD08 LXI B,TRAN5D ;DOUBLE DENS, COMMON XLATE 0360 110509 LXI D,DPBNSD ; BUT ASSUME OUR 1.4 DPB 0363 3A4FCE LDA HSTBUF+05CH ;GET LIFEBOAT FLAG BYTE 0366 FEB0 CPI 0B0H ;IS IT LIFEBOAT 2.X FLAG? 0368 C26E03 JNZ LOGNSD ;KEEP OUR DPB IF NOT 036B 111509 LXI D,DPBNSL ;GO TO LIFEBOAT 2.X IF NOT ; 036E 2AED09 LOGNSD: LHLD DTPTR ;LOAD DRIVE TBL PTR 0371 71 MOV M,C ;SET TRANSLATE TABLE ADDR 0372 23 INX H 0373 70 MOV M,B 0374 010900 LXI B,9 ;PT TO DPB ADDR 0377 09 DAD B 0378 73 MOV M,E ;SET DPB ADDR 0379 23 INX H 037A 72 MOV M,D 037B C37E03 JMP NOLOG ;GO COMPLETE LOGON NOW ; ; SET UP DEBLOCKING VARIABLES FROM DPB VALUES ; 037E CDDC03 NOLOG: CALL DPBAD ;GET DPB ADDR 0381 EB XCHG ; IN HL 0382 7E MOV A,M ;SET UP DEBLOCK CP/M RMAC ASSEM 1.1 #010 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 0383 32F509 STA CPMSPT ; SECTORS PER TRACK 0386 23 INX H ;GET TO GROUP MASK 0387 23 INX H 0388 23 INX H 0389 7E MOV A,M ;GET IT 038A 3C INR A ;CALC # BLOCKS/GROUP 038B 32F409 STA UNAVAL ; AND SAVE THAT 038E 110C00 LXI D,12 0391 19 DAD D ;PT TO SECTOR SHIFT 0392 7E MOV A,M ; BIT FLAG 0393 B7 ORA A ;HAVE WE GOT ONE? 0394 CA9F03 JZ NOSHF ;PASS IF NOT 0397 06FF MVI B,0FFH ;INIT SHIFT COUNT ; 0399 04 CALCSH: INR B ;COUNT UP A SHIFT 039A 1F RAR ;SEE IF DONE 039B D29903 JNC CALCSH ;GO BACK IF NOT YET 039E 78 MOV A,B ;SHIFT COUNT TO ACC ; 039F 32F609 NOSHF: STA SECSHF ;STORE SHIFT COUNT 03A2 7E MOV A,M ;RELOAD BIT FLAG 03A3 3D DCR A ;FORM SECTOR MASK 03A4 32F709 STA SECMSK ; AND SET IT 03A7 2AED09 LHLD DTPTR ;RELOAD PTR 03AA 3AEF09 LDA LOGFLG ;WAS JADE LOGGED ON?++++++++++++++++++++ 03AD B7 ORA A ;FLAG NON-ZERO IF SO, U03AE C20000 JNZ DSKOK ; GO HANDLE DCM MORE 03B1 C9 RET ;IF NOT, DONE, RET ZERO ; ; -- ASSUME 3740 DISKETTE ; 03B2 CDC403 LG3740: CALL TR3740 ;SET SECTOR TRANSLATE 03B5 CDDC03 CALL DPBAD ;SET REGISTER DE 03B8 011000 LXI B,DPBSZ ;DPB SIZE IN BYTES 03BB 214F09 LXI H,DPB8 ;ADDRESS OF BLK IMAGE 03BE CD8000 CALL BLOCK ;MOVE INTO DPB 03C1 C37E03 JMP NOLOG ;GO SET UP (CLEAR) THE ; DEBLOCK VARIABLES ; ; -- SET 3740 SECTOR TRANSLATION ; 03C4 113509 TR3740: LXI D,TRAN8 ;SECTOR TRAN TBL ADDR ; 03C7 2AED09 TRCOM: LHLD DTPTR ;ADDR DISK PARA HDER 03CA 73 MOV M,E 03CB 23 INX H 03CC 72 MOV M,D 03CD C9 RET ; ; -- SET 1024 BYTES/SECTOR TRANSLATION ; 03CE 115F09 TR1024: LXI D,TRN124 ;SECTOR TRAN TBL ADDR 03D1 C3C703 JMP TRCOM ;GO SET IT ; ; -- SET NO SECTOR TRANSLATION ; CP/M RMAC ASSEM 1.1 #011 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 03D4 AF TRNONE: XRA A ;ZERO A REG 03D5 2AED09 LHLD DTPTR 03D8 77 MOV M,A 03D9 23 INX H 03DA 77 MOV M,A 03DB C9 RET ; ; -- GET DRIVE PARA BLK ADDR ; 03DC 2AED09 DPBAD: LHLD DTPTR ;ADDR DISK PARA HDED 03DF 110A00 LXI D,10 ;DPB TBL PNTR OFFSET 03E2 19 DAD D ;NOW AT DPB PNTR 03E3 5E MOV E,M ;LOAD INTO DE 03E4 23 INX H 03E5 56 MOV D,M 03E6 C9 RET ;RETURN TO LOG USER ************************************************************* * * * HOME IS TRANSLATED INTO A SEEK TO TRACK ZERO. * * * ************************************************************* 03E7 0E00 HOME MVI C,0 ;TRACK TO SEEK TO 03E9 3AEC09 LDA HSTWRT ;CHECK FOR PENDING WRITE 03EC B7 ORA A 03ED C2F303 JNZ SETTRK 03F0 32EB09 STA HSTACT ;CLEAR HOST ACTIVE IF NOT ************************************************************* * * * SETTRK SAVES THE TRACK # TO SEEK TO. NOTHING IS DONE AT * * THIS POINT, EVERYTHING IS DEFFERED UNTIL A READ OR WRITE. * * * ************************************************************* 03F3 79 SETTRK MOV A,C ;A <- TRACK # 03F4 32F5CF STA CPMTRK ;CP/M TRACK # 03F7 C9 RET ************************************************************* * * * SETSEC JUST SAVES THE DESIRED SECTOR TO SEEK TO UNTIL AN * * ACTUAL READ OR WRITE IS ATTEMPTED. * * * ************************************************************* 03F8 79 SETSEC MOV A,C ;SAVE THE SECTOR NUMBER 03F9 32F3CF STA CPMSEC ;CP/M SECTOR # 03FC C9 RET ************************************************************* * * * SETDMA SAVES THE DMA ADDRESS FOR THE DATA TRANSFER. * * * ************************************************************* CP/M RMAC ASSEM 1.1 #012 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 03FD 60 SETDMA MOV H,B ;HL <- BC 03FE 69 MOV L,C 03FF 223D07 SHLD CPMDMA ;CP/M DMA ADDRESS 0402 C9 RET ; ; SECTOR TRANSLATION+++++++++++++++++++++++++++++++++++++++++++++++++ ; 0403 7B SECTRAN: MOV A,E ;IS THERE A TABLE? 0404 B2 ORA D 0405 CA0E04 JZ JTRAN ;JADE SPECIAL XLATE IF NOT 0408 EB XCHG ;MAP OFF TABLE IF SO 0409 09 DAD B 040A 6E MOV L,M 040B 2600 MVI H,0 040D C9 RET ; 040E 60 JTRAN: MOV H,B ;JADE XLATE OFF BY ONE 040F 69 MOV L,C ; SO FIX FOR CALLER 0410 23 INX H 0411 C9 RET ; THEN DONE ************************************************************* * * * TERMINAL DRIVER SUBROUTINES. IOBYTE IS NOT USED. * * NOTE THAT THE CONSOLE DEVICE IS NOT THE DJ2D MEMORY * * MAPPED SERIAL I/O PORT. THE NORTHSTAR SERIAL PORT IS * * USED INSTEAD. * * * ************************************************************* ;I/O ROUTINES FOR NORTHSTAR MOTHERBOARD ************************************************************* * * * LEFT SERIAL PORT ROUTINES. CONSOLE I/O * * * ************************************************************* ************************************************************* * * * LEFT SERIAL PORT ROUTINES. CONSOLE INPUT * * * ************************************************************* CONIN: ;READ A CHARACTER 0412 DB03 IN 03H 0414 E602 ANI 02H 0416 CA1204 JZ CONIN ;WAIT TILL A CHARACTER IS ; READY 0419 DB02 IN 02H ;GET THE CHARACTER 041B E67F ANI 7FH ;STRIP PARITY 041D C9 RET ************************************************************* * * * LEFT SERIAL PORT ROUTINES. CONSOLE OUTPUT * CP/M RMAC ASSEM 1.1 #013 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 * * ************************************************************* CONOUT: ;WRITE A CHARACTER 041E DB03 IN 03H 0420 E601 ANI 01H 0422 CA1E04 JZ CONOUT ;WAIT TILL THE BUFFER IS ; EMPTY 0425 79 MOV A,C ;WRITE THE CHARACTER 0426 D302 OUT 02H 0428 C9 RET ************************************************************* * * * LEFT SERIAL PORT ROUTINES. CONSOLE INPUT STATUS * * * ************************************************************* CONST: ;RETURN INPUT BUFFER STATUS 0429 DB03 IN 03H 042B E602 ANI 02H 042D C8 RZ ;RETURN NOT READY 042E 3EFF MVI A,0FFH 0430 C9 RET ;THERE IS A CHARACTER READY ************************************************************* * * * LEFT SERIAL PORT ROUTINES. CONSOLE OUT STATUS * * * ************************************************************* CONOST: ;RETURN OUTPUT BUFFER STATUS 0431 DB03 IN 03H 0433 E601 ANI 01H 0435 C8 RZ ;RETURN NOT READY 0436 3EFF MVI A,0FFH 0438 C9 RET ;RETURN READY IF NOT LDRBIOS ************************************************************* * * * RIGHT SERIAL PORT ROUTINES. RIGHT INPUT * * * ************************************************************* AUXIN: ;READ A CHARACTER 0439 DB05 IN 05H 043B E602 ANI 02H 043D CA3904 JZ AUXIN ;WAIT TILL A CHARACTER IS ; READY 0440 DB04 IN 04H ;GET THE CHARACTER 0442 E67F ANI 7FH ;STRIP PARITY 0444 C9 RET ************************************************************* * * CP/M RMAC ASSEM 1.1 #014 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 * RIGHT SERIAL PORT ROUTINES. RIGHT OUTPUT * * * ************************************************************* AUXOUT: ;WRITE A CHARACTER 0445 DB05 IN 05H 0447 E601 ANI 01H 0449 CA4504 JZ AUXOUT ;WAIT TILL THE BUFFER IS ; EMPTY 044C 79 MOV A,C ;WRITE THE CHARACTER 044D D304 OUT 04H 044F C9 RET ************************************************************* * * * RIGHT SERIAL PORT ROUTINES. RIGHT INPUT STATUS * * * ************************************************************* AUXIST: ;RETURN INPUT BUFFER STATUS 0450 DB05 IN 05H 0452 E602 ANI 02H 0454 C8 RZ ;RETURN NOT READY 0455 3EFF MVI A,0FFH 0457 C9 RET ;THERE IS A CHARACTER READY ************************************************************* * * * RIGHT SERIAL PORT ROUTINES. RIGHT OUT STATUS * * * ************************************************************* AUXOST: ;RETURN OUTPUT BUFFER STATUS 0458 DB05 IN 05H 045A E601 ANI 01H 045C C8 RZ ;RETURN NOT READY 045D 3EFF MVI A,0FFH 045F C9 RET ;RETURN READY ************************************************************* * * * PARALLEL PORT ROUTINES. PARALLEL INPUT * * * ************************************************************* PARIN: ;READ A CHARACTER 0460 DB06 IN 06H 0462 E601 ANI 01H 0464 CA6004 JZ PARIN ;WAIT TILL A CHARACTER IS ; READY 0467 DB00 IN 00H ;GET THE CHARACTER 0469 F5 PUSH PSW 046A 3E30 MVI A,30H ;RESET THE PARALLEL INPUT ; FLAG 046C D306 OUT 06H 046E F1 POP PSW CP/M RMAC ASSEM 1.1 #015 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 046F E67F ANI 7FH ;STRIP PARITY 0471 C9 RET ************************************************************* * * * PARALLEL PORT ROUTINES. PRINTER OUTPUT * * * ************************************************************* LIST: ;WRITE A CHARACTER 0472 DB06 IN 06H 0474 E602 ANI 02H 0476 CA7204 JZ LIST ;WAIT TILL THE BUFFER IS ; EMPTY 0479 3E20 MVI A,20H ;RESET THE PARALLEL OUTPUT ; FLAG 047B D306 OUT 06H 047D 79 MOV A,C ;WRITE THE CHARACTER, STROBE ; BIT 7 047E F680 NSPOUT: ORI 80H 0480 D300 OUT 00H 0482 E67F ANI 7FH 0484 D300 OUT 00H 0486 F680 ORI 80H 0488 D300 OUT 00H 048A C9 RET ************************************************************* * * * PARALLEL PORT ROUTINES. INPUT STATUS * * * ************************************************************* PINPST: ;RETURN INPUT BUFFER STATUS 048B DB06 IN 06H 048D E601 ANI 01H 048F C8 RZ ;RETURN NOT READY 0490 3EFF MVI A,0FFH 0492 C9 RET ;RETURN READY ************************************************************* * * * PARALLEL PORT ROUTINES. LIST DEVICE STATUS * * * ************************************************************* LISTST: ;RETURN OUTPUT BUFFER STATUS 0493 DB06 IN 06H 0495 E602 ANI 02H 0497 C8 RZ ;RETURN NOT READY 0498 3EFF MVI A,0FFH 049A C9 RET ;RETURN READY ENDIF ;NOT LDRBIOS ; CP/M RMAC ASSEM 1.1 #016 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; HXBOT DISPLAYS HEXIDECIMAL EQUIV OF ACC CONTENTS. ; 049B F5 HXBOT: PUSH PSW ;SAVE CHAR 049C 0F RRC ;SWAP NIBBLES 049D 0F RRC 049E 0F RRC 049F 0F RRC 04A0 CDA404 CALL HXNOT ;OUTPUT HIGH NIBBLE 04A3 F1 POP PSW ; THEN LOW NIBBLE 04A4 E60F HXNOT: ANI 0FH ;STRIP HIGH NIBBLE 04A6 C690 ADI 90H ;CVT TO ASCII DECIMAL 04A8 27 DAA 04A9 CE40 ACI 40H 04AB 27 DAA 04AC 4F MOV C,A ;CHAR TO C 04AD C31E04 JMP CONOUT ;THRU VECTOR TO CONOUT ; ; DEBLOCKING DISK WRITE ; 04B0 CDCB04 WRITE: CALL INTDI ;MASK INTERRUPTS 04B3 CDFC04 CALL DSKWR ;DO THE WRITE 04B6 C3BF04 JMP INTEN ;GO RESTORE INTS ; ; DEBLOCKING DISK READ. NOTE THAT ON DEBLOCKING READ ; AND WRITE, THE CALLER SECTOR NUMBERS RANGE FROM 1-XX ; DECIMAL. THIS IS FOR COMPATIBILITY WITH 8" FORMATS ; THAT ARE 1-ORIGIN. WE ADJUST FOR THIS THROUGHOUT THE ; DEBLOCKING ROUTINES BY SUBTRACTING 1 FROM CPMSEC ; BEFORE WE USE IT. VARIABLES TO CONTROL DEBLOCKING ; ARE SET UP FOR US WHEN DISK IS SELECTED. ; 04B9 CDCB04 READ: CALL INTDI ;DISABLE INTERRUPTS 04BC CDDA04 CALL DSKRD ;DO THE I/O ; 04BF F5 INTEN: PUSH PSW ;SAVE DISK I/O ERROR CODE 04C0 2A33CC LHLD ENTPSW ;GET ENTRY PSW TO TEST 04C3 E5 PUSH H 04C4 F1 POP PSW 04C5 E2C904 JPO INTEN5 ;PASS IF INTS OFF WHEN ENTERED 04C8 FB EI ; ELSE RE-ENABLE INTS ; 04C9 F1 INTEN5: POP PSW ;RESTORE DISK I/O ERROR CODE 04CA C9 RET ; THEN RETURN TO CALLER ; 04CB 3E7F INTDI: MVI A,7FH ;CHECK FOR RUNNING ON 04CD 3C INR A ; 8080 OR Z80 04CE E2D804 JPO NOTZ80 ;CAN'T GET INT STATE ON 8080 04D1 ED57 DW LDAI ;GET INT STATE INTO 04D3 F5 PUSH PSW ; PARITY FLAG, THEN 04D4 E1 POP H ; SAVE PSW IN MEMORY 04D5 2233CC SHLD ENTPSW ; 04D8 F3 NOTZ80: DI ;ALLOW NO INTERRUPTS 04D9 C9 RET ; DURING THE I/O XFER ; 04DA 3AF609 DSKRD: LDA SECSHF ;SEE IF DEBLOCKING CP/M RMAC ASSEM 1.1 #017 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 04DD B7 ORA A 04DE CAF106 JZ DJRD ;MUST BE JADE IF NOT 04E1 3AE709 LDA SEKDSK ;IF SO, SEE IF JADE ANYWAY 04E4 FE02 CPI 2 04E6 DAF104 JC NOTJR ;PASS IF NOT, N* READ 04E9 3AF5CF LDA CPMTRK ;IF SO, IS TRACK 0 OR 1? 04EC FE02 CPI 2 04EE DAF106 JC DJRD ;NORMAL SECTOR SIZE IF SO ; 04F1 3E02 NOTJR: MVI A,WRUAL 04F3 3232CC STA WRTYPE ;TREAT AS UNALLOC 04F6 3231CC STA READOP ;READ OPERATION 04F9 C37005 JMP ALLOC ;GO END UNALLOC SECTORS ; AND FORCE READ ; 04FC 3AF609 DSKWR: LDA SECSHF ;SEE IF DEBLOCKING 04FF B7 ORA A 0500 CAEA06 JZ DJWR ;MUST BE JADE IF NOT 0503 3AE709 LDA SEKDSK ;IF SO, SEE IF JADE ANYWAY 0506 FE02 CPI 2 0508 DA1305 JC NOTJW ;PASS IF NOT, N* WRITE 050B 3AF5CF LDA CPMTRK ;IF SO, IS TRACK 0 OR 1? 050E FE02 CPI 2 0510 DAEA06 JC DJWR ;NORMAL SECTOR SIZE IF SO ; 0513 AF NOTJW: XRA A 0514 3231CC STA READOP ;NOT A READ OPERATION 0517 79 MOV A,C ;WRITE TYPE IN C 0518 3232CC STA WRTYPE 051B FE02 CPI WRUAL ;WRITE UNALLOCATED? 051D C23205 JNZ CHKUNA ;CHECK FOR UNALLOC ; ; WRITE TO UNALLOCATED, SET PARAMETERS ; 0520 3AF409 LDA UNAVAL ;NEXT UNALLOC RECS 0523 32F009 STA UNACNT 0526 2AE709 LHLD SEKDSK ;PICK UP SEKDSK AND CPMTRK 0529 22F109 SHLD UNADSK ;UNADSK=SEKDSK, UNATRK=CPMTRK 052C 3AF3CF LDA CPMSEC 052F 32F309 STA UNASEC ;UNASEC = CPMSEC ; ; CHECK FOR WRITE TO UNALLOCATED SECTOR ; 0532 3AF009 CHKUNA: LDA UNACNT ;ANY UNALLOC REMAIN? 0535 B7 ORA A 0536 CA7005 JZ ALLOC ;SKIP IF NOT ; ; MORE UNALLOCATED RECORDS REMAIN ; 0539 3D DCR A ;UNACNT = UNACNT - 1 053A 32F009 STA UNACNT 053D 3AE709 LDA SEKDSK ;SAME DISK? 0540 21F109 LXI H,UNADSK 0543 BE CMP M ;SEKDSK = UNADSK? 0544 C27005 JNZ ALLOC ;SKIP IF NOT ; CP/M RMAC ASSEM 1.1 #018 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; DISKS ARE THE SAME, CHECK TRACKS ; 0547 3AF5CF LDA CPMTRK 054A 21F209 LXI H,UNATRK 054D BE CMP M ;CPMTRK = UNATRK? 054E C27005 JNZ ALLOC ;SKIP IF NOT ; ; TRACKS ARE THE SAME, CHECK SECTORS ; 0551 3AF3CF LDA CPMSEC 0554 21F309 LXI H,UNASEC 0557 BE CMP M ;CPMSEC = UNASEC? 0558 C27005 JNZ ALLOC ;SKIP IF NOT ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; 055B 34 INR M ;UNASEC = UNASEC+1 055C 3AF509 LDA CPMSPT ;CHECK FOR END OF TRACK 055F BE CMP M 0560 D26905 JNC NOOVF ;SKIP IF STILL ON TRACK ; ; OVERFLOW TO NEXT TRACK ; 0563 3601 MVI M,1 ;UNASEC = 1 0565 21F209 LXI H,UNATRK 0568 34 INR M ;UNATRK = UNATRK+1 ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; 0569 AF NOOVF: XRA A 056A 3230CC STA RSFLAG ;RSFLAG = 0 056D C37805 JMP RWOPER ;GO DO WRITE ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; 0570 AF ALLOC: XRA A 0571 32F009 STA UNACNT ;UNACNT = 0 0574 3C INR A 0575 3230CC STA RSFLAG ;RSFLAG = 1 ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; 0578 AF RWOPER: XRA A 0579 3206CC STA ERFLAG ;NO ERRORS (YET) 057C 3AF609 LDA SECSHF ;GET SECTOR SHIFT COUNT 057F 47 MOV B,A ; IN COUNT REG 0580 3AF3CF LDA CPMSEC ;COMPUTE HOST SECTOR 0583 3D DCR A ;ADJUST FOR 1-ORIGIN ; 0584 B7 RWOPSH: ORA A ;CARRY = 0 0585 1F RAR ;SHIFT RIGHT 0586 05 DCR B ;COUNT OFF A SHIFT 0587 C28405 JNZ RWOPSH ;LOOP IF MORE 058A 32EA09 STA SEKHST ;HOST SECTOR TO SEEK ; ; ACTIVE HOST SECTOR? CP/M RMAC ASSEM 1.1 #019 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; 058D 21EB09 LXI H,HSTACT ;HOST ACTIVE FLAG 0590 7E MOV A,M 0591 3601 MVI M,1 ;ALWAYS BECOMES 1 0593 B7 ORA A ;WAS IT ALREADY? 0594 CAC105 JZ FILHST ;FILL HOST IF NOT ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; 0597 3AE709 LDA SEKDSK 059A 2103CC LXI H,HSTDSK ;SAME DISK? 059D BE CMP M ;SEKDSK = HSTDSK? 059E C2B505 JNZ NOMATCH ; ; SAME DISK, CHECK TRACK ; 05A1 3AF5CF LDA CPMTRK 05A4 2104CC LXI H,HSTTRK 05A7 BE CMP M ;CPMTRK = HSTTRK? 05A8 C2B505 JNZ NOMATCH ; ; SAME DISK AND TRACK, CHECK SECTOR ; 05AB 3AEA09 LDA SEKHST 05AE 2105CC LXI H,HSTSEC 05B1 BE CMP M ;SEKHST = HSTSEC? 05B2 CA0606 JZ MATCH ;SKIP IF MATCH ; ; MUST FLUSH HOST BUFFER FOR NEW SECTOR ; 05B5 3AEC09 NOMATCH: LDA HSTWRT ;HOST WRITTEN? 05B8 B7 ORA A 05B9 C45A06 CNZ WRITEHST ;CLEAR HOST BUFFER 05BC 3A06CC LDA ERFLAG ;CHECK FOR ERROR 05BF B7 ORA A 05C0 C0 RNZ ;RETURN ERROR IF SO ; 05C1 2AE709 FILHST: LHLD SEKDSK ;MAY HAVE TO FILL HOST BUFFER 05C4 2203CC SHLD HSTDSK ;HSTDSK=SEKDSK,HSTTRK=CPMTRK 05C7 3AEA09 LDA SEKHST 05CA 3205CC STA HSTSEC 05CD AF XRA A 05CE 32EC09 STA HSTWRT ;NO PENDING WRITE 05D1 3A30CC LDA RSFLAG ;NEED TO READ? 05D4 B7 ORA A 05D5 CA0606 JZ MATCH ;NO IF FLAG ZERO 05D8 3A03CC LDA HSTDSK ;SEE WHICH DISK 05DB FE02 CPI 2 ;IF C: OR D:, JADE 05DD D2FE05 JNC NOTNSR ;BRANCH IF JADE 05E0 CD35CC CALL READHST ;IF A: OR B:, READ N* 05E3 3A06CC LDA ERFLAG ;CHECK FOR ERRORS 05E6 B7 ORA A 05E7 C0 RNZ ;NO MORE IF SO 05E8 CDD506 CALL GNSDEN ;CHECK DENSITY 05EB 212CCC LXI H,NSDENS 05EE BE CMP M ;IS DENSITY RIGHT? CP/M RMAC ASSEM 1.1 #020 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 05EF CA0606 JZ MATCH ;OK IF SO 05F2 218008 LXI H,SDEMSG ;ERROR IF NOT 05F5 CDC1CD CALL DSKERR ;REPORT IT 05F8 3E05 MVI A,5 05FA 3206CC STA ERFLAG 05FD C9 RET ;RET NZ ACC TO CALLER ; U05FE CD0000 NOTNSR: CALL JHREAD ;READ JADE DISK 0601 3A06CC LDA ERFLAG ;READ ERROR? 0604 B7 ORA A 0605 C0 RNZ ;LEAVE BUF ALONE IF SO ; ; COPY DATA TO OR FROM BUFFER ; 0606 3AF709 MATCH: LDA SECMSK ;GET MASK 0609 67 MOV H,A ; INTO TEMP REG 060A 3AF3CF LDA CPMSEC ;MASK SECTOR BUFFER NUMBER 060D 3D DCR A ;ADJUST FOR 1-ORIGIN 060E A4 ANA H ;LEAST SIGNIF BITS 060F 1F RAR ;GET VALUE SHIFTED 0610 67 MOV H,A ; LEFT 7 IN HL 0611 3E00 MVI A,0 0613 1F RAR 0614 6F MOV L,A ; ; HL CONTAINS RELATIVE HOST BUFFER ADDRESS ; 0615 11F3CD LXI D,HSTBUF ;ASSUME USING N* BUFFER 0618 3A03CC LDA HSTDSK ;CHECK DISK SELECTED 061B FE02 CPI 2 061D DA2806 JC NJBUF ;RIGHT IF NOT JADE DISK U0620 3E00 MVI A,DCMB1 ;USING JADE BUFFER, U0622 D300 OUT DPORT ; SWITCH BANK ONE IN 0624 EB XCHG ;PUT OFFSET IN DE NOW U0625 2A0000 LHLD DADDR ;PT HL AT BUFFER ; 0628 19 NJBUF: DAD D ;HL = HOST ADDRESS 0629 EB XCHG ;NOW IN DE 062A 2A3D07 LHLD CPMDMA ;GET/PUT CP/M DATA 062D 0E80 MVI C,SECSZ ;LENGTH OF MOVE 062F 3A31CC LDA READOP ;WHICH WAY? 0632 B7 ORA A 0633 C23B06 JNZ RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; 0636 3C INR A ;ACC KNOWN ZERO ABOVE 0637 32EC09 STA HSTWRT ;HSTWRT = 1 063A EB XCHG ;SOURCE/DEST SWAP ; 063B 1A RWMOVE: LDAX D ;SOURCE CHARACTER 063C 13 INX D 063D 77 MOV M,A ;TO DEST 063E 23 INX H 063F 0D DCR C ;LOOP 128 TIMES 0640 C23B06 JNZ RWMOVE CP/M RMAC ASSEM 1.1 #021 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 0643 3A03CC LDA HSTDSK ;IS THIS JADE DISK? 0646 FE02 CPI 2 U0648 D40000 CNC DSKOUT ;FIX MEM STATUS IF SO ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER ; 064B 3A32CC LDA WRTYPE ;WRITE TYPE 064E FE01 CPI WRDIR ;TO DIRECTORY? 0650 3E00 MVI A,0 ;NO ERROR AT THIS PT 0652 C0 RNZ ;RET IF NOT DIR WRITE ; ; CLEAR HOST BUFFER FOR DIRECTORY WRITE ; 0653 CD5A06 CALL WRITEHST 0656 3A06CC LDA ERFLAG 0659 C9 RET ; ; WRITEHST PERFORMS THE PHYSICAL WRITE TO THE ; NORTH STAR DISK. ON ENTRY, DRIVE IS IN HSTDSK, ; TRACK IS IN HSTTRK, SECTOR IS IN HSTSEC. ON ; EXIT, ERROR FLAG IS IN ERFLAG (ZERO IF NONE). ; ; IT IS ASSUMED INTERRUPTS ARE DISABLED AT ; THIS POINT. IF NOT, I/O MAY BE DISRUPTED. ; WRITEHST: ;WRITE HOST 065A AF XRA A ;BUFFER WILL BE CLEARED 065B 32EC09 STA HSTWRT 065E 3A03CC LDA HSTDSK ;SEE IF N* DISK SELECTED 0661 FE02 CPI 2 U0663 D20000 JNC JHWRIT ;IF NOT, DO JADE WRITE 0666 CDD506 CALL GNSDEN ;GET DENSITY BASED ON ID 0669 322DCC STA NSCNT ;SET WRITE BYTE COUNT 066C CDBACC CALL SETUP ;SELECT DRIVE AND ; SEEK TO TRACK 066F 3A06CC LDA ERFLAG ;CHECK FOR ERRORS 0672 B7 ORA A 0673 C0 RNZ ;INDEX PULSE NOT FOUND IS FATAL 0674 CD44CD CALL POSEC ;POSITION TO SECTOR 0677 C289CC JNZ SNFERR ;OUT ON ERROR 067A 3A20EB LDA CCMND+20H ;GET B-STATUS 067D E602 ANI 02H ;IS DISK WRITE-PROTECTED? 067F 3E06 MVI A,6 ;ASSUME SO, ERROR CODE 6 0681 3206CC STA ERFLAG 0684 C2CF06 JNZ WPERR ;WRITE ALWAYS FAILS IF SO 0687 2A01CC LHLD HSTADR ;GET ADDRESS TO WRITE FROM 068A 061F MVI B,31 ;ASSUME DOUBLE DENSITY 068C 1E02 MVI E,2 068E 3A2DCC LDA NSCNT ;CHECK 0691 4F MOV C,A ;SAVE COUNT FOR LATER 0692 B7 ORA A 0693 CA9906 JZ WRIT5 ;GO ON IF COUNTS RIGHT 0696 060F MVI B,15 ;CORRECT FOR SINGLE DENS 0698 1D DCR E ; 0699 3A16EB WRIT5: LDA CCMND+16H ;INITIATE SECTOR WRITE CP/M RMAC ASSEM 1.1 #022 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; 069C 3A15EB WRIT10: LDA CCMND+15H ;KEEP MOTORS RUNNING, GET A-STAT 069F E608 ANI 08H ;MUST LOOP UNTIL 96 USEC WINDOW 06A1 C29C06 JNZ WRIT10 ; PAST, SO LOOP WHILE WI TRUE ; ; NOW WRITE THE 31 OR 15 BYTES OF LEADING ZEROES ON THE SECTOR ; 06A4 3A00E9 WRIT15: LDA WDATA+00H ;WRITE A BYTE OF ZEROES 06A7 00 NOP ;KILL TIME 06A8 16E9 MVI D,WDATA SHR 8 ;KILL TIME BY LOADING D FOR LATER 06AA 05 DCR B ;COUNT OFF A ZERO BYTE 06AB C2A406 JNZ WRIT15 ;DO THEM ALL ; ; FOLLOW WITH ONE OR TWO SYNCH BYTES ; 06AE 3AFBE9 WRIT17: LDA WDATA+0FBH ;WRITE A SYNCH BYTE 06B1 1D DCR E ;CHECK FOR 2ND NEEDED 06B2 C2AE06 JNZ WRIT17 ;GO BACK IF SO ; ; NOW WRITE OUT 256 OR 512 BYTES. DO THIS TWO AT A ; TIME SO WE CAN USE A SINGLE PRECISION COUNTER. B IS ; ZERO FROM ABOVE TO INIT THE CRC BYTE. ; 06B5 7E WRIT20: MOV A,M ;GET NEXT BYTE TO OUTPUT 06B6 5F MOV E,A ; IN OUTPUT REG 06B7 A8 XRA B ;ADD INTO CHECKSUM 06B8 07 RLC 06B9 47 MOV B,A ;LEAVE CHECKSUM IN B 06BA 1A LDAX D ;WRITE DATA BYTE TO DISK 06BB 23 INX H ;BOP BUF PTR 06BC 7E MOV A,M ;REPEAT FOR NEXT BYTE 06BD 5F MOV E,A 06BE A8 XRA B 06BF 07 RLC 06C0 47 MOV B,A 06C1 1A LDAX D 06C2 23 INX H 06C3 0D DCR C ;COUNT OFF LAST PAIR OF BYTES 06C4 C2B506 JNZ WRIT20 ;GO BACK IF MORE TO WRITE 06C7 58 MOV E,B ;IF NOT, TIME TO WRITE CHECKSUM 06C8 03 INX B ;KILL TIME 06C9 1A LDAX D ; THEN WRITE THE BYTE 06CA AF XRA A ;DONE, INDICATE NO ERROR 06CB 3206CC STA ERFLAG 06CE C9 RET ;RETURN TO CALLER ; 06CF 217908 WPERR: LXI H,WPEMSG ;WRITE PROTECT ERROR 06D2 C3C1CD JMP DSKERR ;TELL OPERATOR ON WAY OUT ; ; GNSDEN IS CALLED BY N* I/O ROUTINES TO DETERMINE THE ; DENSITY OF THE CURRENT BLOCK BASED ON THE DENSITY OF ; THE ID BLOCK. THAT IS DETERMINED BY TAKING ADVANTAGE ; OF THE FACT THAT THE HOST DISK HAS NO TRANSLATE TABLE ; IF SINGLE DENSITY. ; 06D5 219F09 GNSDEN: LXI H,D0DPH ;ASSUME A: CP/M RMAC ASSEM 1.1 #023 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 06D8 3A03CC LDA HSTDSK ;NOW CHECK 06DB B7 ORA A 06DC CAE206 JZ GNSDA ;GO ON IF SO 06DF 21AF09 LXI H,D1DPH ;B: IF NOT 06E2 7E GNSDA: MOV A,M ;SEE IF GOT XLATE TABLE 06E3 23 INX H 06E4 B6 ORA M ;IF NOT, SINGLE DENSITY 06E5 3E80 MVI A,80H ;ASSUME SINGLE 06E7 C8 RZ ;DONE IF RIGHT 06E8 AF XRA A ;CORRECT IF DOUBLE DENSITY 06E9 C9 RET ************************************************************* * * * DISK JOCKY 2D/B READ AND WRITE ROUTINES * * * * 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. * * * ************************************************************* 06EA 79 DJWR MOV A,C ;SAVE WRITE COMMAND TYPE 06EB 325407 STA WRITTYP 06EE 3E01 MVI A,1 ;SET WRITE COMMAND 06F0 06 DB (MVI) OR (B*8) ;THIS "MVI B" INSTRUCTION ; CAUSES THE FOLLOWING ; "XRA A" TO BE SKIPPED OVER. ************************************************************* * * * 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. * * * ************************************************************* 06F1 AF DJRD XRA A ;SET THE COMMAND TYPE TO READ 06F2 324007 STA RDWR ;SAVE COMMAND TYPE ************************************************************* * * * REDWRT CALCULATES THE PHYSICAL SECTOR ON THE DISK THAT * * CONTAINS THE DESIRED CP/M SECTOR, THEN CHECKS IF IT IS * * THE SECTOR CURRENTLY IN THE BUFFER. IF NO MATCH IS MADE, * * THE BUFFER IS FLUSHED IF NECESSARY AND THE CORRECT SECTOR * * READ FROM THE DISK. * CP/M RMAC ASSEM 1.1 #024 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 * * ************************************************************* 06F5 0600 REDWRT MVI B,0 ;THE 0 IS MODIFIED TO CONTAIN 06F6 = SECSIZ EQU $-1 ; THE LOG2 OF THE PHYSICAL ; SECTOR SIZE/128 ON THE ; CURRENTLY SELECTED DISK. 06F7 3AF3CF LDA CPMSEC ;GET THE DESIRED CP/M SECTOR # 06FA F5 PUSH PSW ;TEMPORARY SAVE 06FB E680 ANI 80H ;SAVE ONLY THE SIDE BIT 06FD 4F MOV C,A ;REMEMBER THE SIDE 06FE F1 POP PSW ;GET THE SECTOR BACK 06FF E67F ANI 7FH ;FORGET THE SIDE BIT 0701 3D DCR A ;TEMPORARY ADJUSTMENT 0702 05 DIVLOOP DCR B ;UPDATE REPEAT COUNT 0703 CA0B07 JZ DIVDONE 0706 B7 ORA A ;CLEAR THE CARRY FLAG 0707 1F RAR ;DIVIDE THE CP/M SECTOR # BY ; THE SIZE OF THE PHYSICAL ; SECTORS 0708 C30207 JMP DIVLOOP ; 070B 3C DIVDONE INR A 070C B1 ORA C ;RESTORE THE SIDE BIT 070D 32F6CF STA TRUESEC ;SAVE THE PHYSICAL SECTOR ; NUMBER 0710 21F4CF LXI H,CPMDRV ;POINTER TO DESIRED DRIVE, ; AND SECTOR 0713 11F7CF LXI D,BUFDRV ;POINTER TO BUFFER DRIVE, ; TRACK AND SECTOR 0716 0604 MVI B,4 ;COUNT LOOP 0718 05 DTSLOP DCR B ;TEST IF DONE WITH COMPARE 0719 CA2707 JZ SECMOV ;YES, MATCH. GO MOVE THE DATA 071C 1A LDAX D ;GET A BYTE TO COMPARE 071D BE CMP M ;TEST FOR MATCH 071E 23 INX H ;BUMP POINTERS TO NEXT DATA ; ITEM 071F 13 INX D 0720 CA1807 JZ DTSLOP ;MATCH, CONTINUE TESTING ************************************************************* * * * IF DRIVE, TRACK, AND SECTOR DON'T MATCH, THEN FLUSH THE * * BUFFER IF NECESSARY AND THEN REFILL. * * * ************************************************************* 0723 CDA807 CALL FILL ;FILL THE BUFFER WITH CORRECT ; PHYSICAL SECTOR 0726 D8 RC ;NO GOOD, RETURN WITH ERROR ; INDICATION ************************************************************* * * * SECMOV HAS BEEN MODIFIED TO CAUSE EITHER A TRANSFER INTO * * OR OUT OF THE BUFFER. * * * CP/M RMAC ASSEM 1.1 #025 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ************************************************************* 0727 3AF3CF SECMOV LDA CPMSEC ;GET THE CP/M SECTOR TO ; TRANSFER 072A 3D DCR A ;ADJUST TO PROPER SECTOR IN ; BUFFER 072B E600 ANI 0 ;STRIP OFF HIGH ORDERED BITS 072C = SECPSEC EQU $-1 ;THE 0 IS MODIFIED TO ; REPRESENT THE # OF ; CP/M SECTORS PER PHYSICAL ; SECTOR 072D 6F MOV L,A ;PUT INTO HL 072E 2600 MVI H,0 0730 29 DAD H ;FORM OFFSET INTO BUFFER 0731 29 DAD H 0732 29 DAD H 0733 29 DAD H 0734 29 DAD H 0735 29 DAD H 0736 29 DAD H 0737 11FACF LXI D,BUFFER ;BEGINNING ADDRESS OF BUFFER 073A 19 DAD D ;FORM BEGINNING ADDRESS OF ; SECTOR TO TRANSFER 073B EB XCHG ;DE = ADDRESS IN BUFFER 073C 210000 LXI H,0 ;GET DMA ADDRESS, THE 0 IS ; MODIFIED TO ; CONTAIN THE DMA ADDRESS 073D = CPMDMA EQU $-2 073F 3E00 MVI A,0 ;THE ZERO GETS MODIFIED TO ; CONTAIN A ZERO IF A READ, ; OR A 1 IF WRITE 0740 = RDWR EQU $-1 0741 A7 ANA A ;TEST WHICH KIND OF OPERATION 0742 C24A07 JNZ INTO ;TRANSFER DATA INTO THE BUFFER 0745 CD6E00 OUTOF CALL MOVER 0748 AF XRA A 0749 C9 RET 074A EB INTO XCHG ; 074B CD6E00 CALL MOVER ;MOVE THE DATA, HL = DESTINATION ; DE = SOURCE 074E 3E01 MVI A,1 0750 325D07 STA BUFWRTN ;SET BUFFER WRITTEN INTO FLAG 0753 3E00 MVI A,0 ;CHECK FOR DIRECTORY WRITE 0754 = WRITTYP EQU $-1 0755 3D DCR A 0756 3E00 MVI A,0 0758 325407 STA WRITTYP ;SET NO DIRECTORY WRITE 075B C0 RNZ ;NO ERROR EXIT ************************************************************* * * * FLUSHA WRITES THE CONTENTS OF THE BUFFER OUT TO THE DISK * * IF IT HAS EVER BEEN WRITTEN INTO. * * * ************************************************************* CP/M RMAC ASSEM 1.1 #026 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 075C 3E00 FLUSHA MVI A,0 ;THE 0 IS MODIFIED TO REFLECT ; IF THE BUFFER HAS BEEN ; WRITTEN INTO 075D = BUFWRTN EQU $-1 075E A7 ANA A ;TEST IF WRITTEN INTO 075F C8 RZ ;NOT WRITTEN, ALL DONE 0760 2118E4 LXI H,DJWRITE ;WRITE OPERATION ************************************************************* * * * PREP PREPARES TO READ/WRITE THE DISK. RETRIES ARE * * ATTEMPTED.UPON ENTRY, H&L MUST CONTAIN THE READ OR WRITE * * OPERATION ADDRESS. * * * ************************************************************* 0763 AF PREP XRA A ;RESET BUFFER WRITTEN FLAG 0764 325D07 STA BUFWRTN 0767 229A07 SHLD RETRYOP ;SET UP THE READ/WRITE ; OPERATION 076A 060A MVI B,RETRIES ;MAXIMUM NUMBER OF RETRIES ; TO ATTEMPT 076C C5 RETRYLP PUSH B ;SAVE THE RETRY COUNT 076D 3AF7CF LDA BUFDRV ;GET DRIVE NUMBER INVOLVED ; IN THE OPERATION 0770 4F MOV C,A 0771 CD5A00 CALL DJDRV ;SELECT THE DRIVE 0774 3AF8CF LDA BUFTRK 0777 A7 ANA A ;TEST FOR TRACK ZERO 0778 4F MOV C,A 0779 C5 PUSH B 077A CC09E4 CZ DJHOME ;HOME THE DRIVE IF TRACK 0 077D C1 POP B ;RESTORE TRACK # 077E CD0CE4 CALL DJTRK ;SEEK TO PROPER TRACK 0781 3AF9CF LDA BUFSEC ;GET SECTOR INVOLVED ; IN OPERATION 0784 F5 PUSH PSW ;SAVE THE SECTOR # 0785 07 RLC ;BIT 0 OF A EQUALS SIDE # 0786 E601 ANI 1 ;STRIP OFF UNNECESSARY BITS 0788 4F MOV C,A ;C <- SIDE # 0789 CD30E4 CALL DJSIDE ;SELECT THE SIDE 078C F1 POP PSW ;A <- SECTOR # 078D E67F ANI 7FH ;STRIP OFF SIDE BIT 078F 4F MOV C,A ;C <- SECTOR # 0790 CD0FE4 CALL DJSEC ;SET THE SECTOR TO TRANSFER 0793 01FACF LXI B,BUFFER ;SET THE DMA ADDRESS 0796 CD12E4 CALL DJDMA 0799 CD15E4 CALL DJREAD ;THE READ OPERATION IS ; MODIFIED TO WRITE 079A = RETRYOP EQU $-2 079C C1 POP B ;RESTORE THE RETRY COUNTER 079D 3E00 MVI A,0 ;NO ERROR EXIT STATUS 079F D0 RNC ;RETURN NO ERROR 07A0 05 DCR B ;UPDATE THE RETRY COUNTER 07A1 37 STC ;ASSUME RETRY COUNT EXPIRED CP/M RMAC ASSEM 1.1 #027 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 07A2 3EFF MVI A,0FFH ;ERROR RETURN 07A4 C8 RZ 07A5 C36C07 JMP RETRYLP ;TRY AGAIN ************************************************************* * * * FILL FILLS THE BUFFER WITH A NEW SECTOR FROM THE DISK. * * * ************************************************************* 07A8 CD5C07 FILL CALL FLUSHA ;FLUSH BUFFER FIRST 07AB D8 RC ;CHECK FOR ERROR 07AC 11F4CF LXI D,CPMDRV ;UPDATE THE DRIVE, TRACK, ; AND SECTOR 07AF 21F7CF LXI H,BUFDRV 07B2 0603 MVI B,3 ;NUMBER OF BYTES TO MOVE U07B4 CD0000 CALL MOVLOP ;COPY THE DATA 07B7 2115E4 LXI H,DJREAD 07BA C36307 JMP PREP ;SELECT DRIVE, TRACK, AND ; SECTOR. THEN READ THE ; ; ; HERE TO REPORT DISK NOT READY. TELL CONSOLE WHICH ; DISK IT WAS, THEN SOLICIT REPLY. IF CTRL-C, WARM ; BOOT TO A:, ELSE RETURN TO CALLER. ; 07BD 3AE709 NOTRDY: LDA SEKDSK ;STUFF DISK 07C0 C641 ADI 'A' 07C2 32BC08 STA NRD ; INTO MSG 07C5 21B508 LXI H,NRDMSG 07C8 CD6A08 CALL MSGOT ;REPORT TO OPERATOR 07CB CD1204 CALL CONIN ;GET REPLY 07CE D603 SUI 3 ;IS ANSWER CTRL-C? 07D0 C0 RNZ ;RETURN TO CALLER IF NOT 07D1 320400 STA DEFDSK ;SELECT A: IF SO, ; THEN WARM BOOT IT ; ; WARM BOOT ENTRY. LOAD CCP/BDOS AND INITIALIZE ; 07D4 F3 WBOOT: DI ;NO PROCESSOR INTS DURING BOOT 07D5 3A0400 LDA DEFDSK ;GET CURRENT DEFAULT DISK 07D8 47 MOV B,A ;SAVE IT 07D9 E6F0 ANI 0F0H ;GET USER # 07DB 4F MOV C,A ;SAVE THAT 07DC 78 MOV A,B 07DD E60F ANI 00FH ;ISOLATE DISK # 07DF FE04 CPI MAXDISK ;IS IT LEGAL? 07E1 DAE607 JC WRMOK ;GO ON IF SO 07E4 AF XRA A ;BACK TO DRIVE ZERO IF NOT 07E5 4F MOV C,A ;USER # PROB BAD TOO 07E6 B1 WRMOK: ORA C ;COMBINE WITH USER # 07E7 32E309 STA DFIMG ;PUT TO BASE PAGE IMAGE 07EA 31F3CF LXI SP,HSTBUF+HSTSIZ ;SET SP TO SCRATCH RAM 07ED 2103AC LXI H,CCP+3 ;CP/M WARM START ADDR 07F0 E5 PUSH H ; CP/M RMAC ASSEM 1.1 #028 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; MERGE HERE FROM COLD BOOT ; CPMLD: 07F1 010800 LXI B,8 ;MOVE ZERO PAGE STUFF 07F4 110000 LXI D,0 ; DOWN TO ZERO 07F7 21DF09 LXI H,BSIMG 07FA CD8000 CALL BLOCK 07FD 215959 LXI H,05959H ;FORCE HOME OF N* DRIVES 0800 222ECC SHLD NSTRK ; A, B 0803 7C MOV A,H ;MAKE SURE NEW DISK SELECTED 0804 3207CC STA CURDSK 0807 AF XRA A ;DRIVE ZERO VALUE 0808 3203CC STA HSTDSK 080B 32EB09 STA HSTACT ;HOST BUFFER INACTIVE 080E 32EC09 STA HSTWRT ;NO HOST WRITE PENDING 0811 32F009 STA UNACNT ;CLEAR UNALLOC COUNT 0814 2100AC LXI H,CCP ;CP/M CCP ADDRESS 0817 2201CC SHLD HSTADR ;READ INTO THERE 081A 3C INR A ;GET 1 IN ACC 081B 3204CC STA HSTTRK ;READ FROM TRACK ONE 081E CD5508 CALL WSETUP ;KICK MOTORS AND SEEK TRK 0821 AF XRA A ;SECTOR ZERO ; ; READ ALL TEN SECTORS FROM TRACK ONE THEN ONE SECTOR ; FROM TRACK ZERO (SECTOR 3). ; 0822 3205CC WREAD: STA HSTSEC ;SET CURRENT SECTOR TO READ 0825 CD5B08 CALL WRMRD ;READ SECTOR AND CHK STATUS 0828 110002 LXI D,HSTSIZ ;SECTOR SIZE 082B 2A01CC LHLD HSTADR ;CALC NEW ADDRESS 082E 19 DAD D 082F 2201CC SHLD HSTADR 0832 3A05CC LDA HSTSEC ;BOP SECTOR # 0835 3C INR A 0836 FE0A CPI 10 ;OFF END OF TRACK ONE? 0838 C22208 JNZ WREAD ;GO GET NEXT SECTOR IF NOT 083B AF XRA A ;TO TRACK ZERO, 083C 3204CC STA HSTTRK 083F CD5508 CALL WSETUP 0842 3E03 MVI A,3 ; SECTOR 3 IF SO 0844 3205CC STA HSTSEC 0847 CD5B08 CALL WRMRD ;READ THE LAST SECTOR 084A 21F3CD LXI H,HSTBUF ;NOW READ AND WRITE 084D 2201CC SHLD HSTADR ; USING DEBLOCK BUFFER 0850 3AE309 LDA DFIMG ;RETRIEVE LAST USED DRIVE 0853 4F MOV C,A ; FOR BDOS 0854 C9 RET ; THEN GO TO CP/M ; 0855 CDBACC WSETUP: CALL SETUP ;KICK MOTORS AND SEEK TRK 0858 C35E08 JMP WECHK ; 085B CD42CC WRMRD: CALL READNS ;READ HOST SECTOR 085E 3A06CC WECHK: LDA ERFLAG ;CHECK FOR ERROR 0861 B7 ORA A 0862 C8 RZ ;RETURN IF NONE 0863 21CB08 LXI H,MSGLE ;GET ERROR MESSAGE CP/M RMAC ASSEM 1.1 #029 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 0866 CD6A08 CALL MSGOT ;TYPE IT 0869 76 HLT ; THEN GIVE UP ; ; MSGOT DISPLAYS STRING OF CHARS PT'ED AT BY HL ON ; CONSOLE, UNTIL CHAR WITH PARITY BIT SET IS OUTPUT. ; 086A F5 MSGOT: PUSH PSW ;SAVE CALLER FLAGS 086B 4E MSGL: MOV C,M ;LOAD CHAR 086C E5 PUSH H ;SAVE HL 086D CD1E04 CALL CONOUT ;OUTPUT CHAR IN C 0870 E1 POP H ;RESTORE HL 0871 7E MOV A,M ;GET CHAR BACK TO LOOK AT 0872 23 INX H ;LEAVE PTR ON NEXT CHAR 0873 17 RAL ;IS HIGH BIT ON? 0874 D26B08 JNC MSGL ;GO BACK IF NOT 0877 F1 POP PSW ; ELSE RESTORE FLAGS 0878 C9 RET ; AND RETURN ; ; DISK ERROR MESSAGES ; 0879 50726F7465WPEMSG: DB 'Protec','t'+80H 0880 44656E7369SDEMSG: DB 'Densit','y'+80H 0887 414352C3 RERMSG: DB 'ACR','C'+80H 088B 53796EE3 SYEMSG: DB 'Syn','c'+80H 088F 496E6465F8NIPMSG: DB 'Inde','x'+80H 0894 536563746FSNFMSG: DB 'Secto','r'+80H 089A 0D0A4A6164JIOMSG: DB ACR,ALF,'Jade DD',' '+80H ; 08A4 2065727220ERRMSG: DB ' err ' 08A9 203A207472ASCDSK: DB ' : trk',' '+80H 08B0 20736563A0SECMSG: DB ' sec',' '+80H 08B5 0D0A446973NRDMSG: DB ACR,ALF,'Disk ' 08BC 203A206E6FNRD: DB ' : not ready',' '+80H 08C9 0D8A CRLF: DB ACR,ALF+80H ; 08CB 0D0A426F6FMSGLE: DB ACR,ALF,'Boot er','r'+80H ; ; JADE ID LABEL DEFINITIONS ; 08D5 4A61646520JADEID: DB 'Jade DD ' ;ID LABEL 0008 = IDSZE EQU $-JADEID ;LABEL SIZE ; ; NORTH STAR DD SECTOR TRANSLATE TABLE. AFTER ; DEBLOCKING, WORKS OUT TO SKEW FACTOR OF 5. ; 08DD 01020304 TRAN5D: DB 01,02,03,04 08E1 15161718 DB 21,22,23,24 08E5 05060708 DB 05,06,07,08 08E9 191A1B1C DB 25,26,27,28 08ED 090A0B0C DB 09,10,11,12 08F1 1D1E1F20 DB 29,30,31,32 08F5 0D0E0F10 DB 13,14,15,16 08F9 21222324 DB 33,34,35,36 08FD 11121314 DB 17,18,19,20 0901 25262728 DB 37,38,39,40 ; CP/M RMAC ASSEM 1.1 #030 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; NORTH STAR DD DISK PARAMETER BLOCK. THIS IS OUR ; NORMAL DPB, AND IS COMPATIBLE WITH LIFEBOAT CP/M 1.4 ; DISKS. ; 0905 2800 DPBNSD: DW 40 ;SECTORS PER TRACK 0907 03 DB 3 ;BLOCK SHIFT FACTOR 0908 07 DB 07H ;BLOCK MASK 0909 00 DB 0 ;EXM MASK 090A A400 DW 165-1 ;DISK SIZE - 1 090C 3F00 DW 63 ;DIRECTORY MAX 090E C0 DB 11000000B ;ALLOC 0 090F 00 DB 0 ;ALLOC 1 0910 1000 DW 16 ;CHECK SIZE 0912 0200 DW 2 ;TRACK OFFSET ; ; THE NEXT BYTE IS ONE WE HAVE ADDED SPECIFICALLY ; FOR THIS BIOS TO CONVENIENCE OUR DEBLOCKING ROUTINES. ; IT IS A SECTOR SHIFT MASK, AND EACH DISK PARAMETER ; BLOCK HAS ONE IN THIS POSITION. THE ALLOWABLE VALUES ; ARE AS FOLLOWS: ; ; 1000B ;1024 BYTES/SECTOR ; 0100B ; 512 BYTES/SECTOR ; 0010B ; 256 BYTES/SECTOR ; 0000B ; 128 BYTES/SECTOR ; ; FOR THE NORTH STAR DD DISKS, 512 IS HARD-CODED. FOR ; THE NORTH STAR SD DISKS, 256 IS HARD-CODED. FOR ; JADE DISKS, THE VALUE IS READ IN FROM THE ID SECTOR. ; IF THE ID LOOKS BOGUS, THE STANDARD 8" DPB IS USED, ; WHICH HAS 128 CANNED-IN. ; 0914 04 DB 0100B ;512 BYTES/SECTOR ; ; NORTH STAR DD DISK PARAMETER BLOCK, SET UP ; FOR COMPATIBILITY WITH LIFEBOAT CP/M 2.X ; FORMAT DISKS. ; 0915 2800 DPBNSL: DW 40 ;SECTORS PER TRACK 0917 04 DB 4 ;BLOCK SHIFT FACTOR 0918 0F DB 0FH ;BLOCK MASK 0919 01 DB 1 ;EXM MASK 091A 5100 DW 82-1 ;DISK SIZE - 1 091C 3F00 DW 63 ;DIRECTORY MAX 091E 80 DB 10000000B ;ALLOC 0 091F 00 DB 0 ;ALLOC 1 0920 1000 DW 16 ;CHECK SIZE 0922 0200 DW 2 ;TRACK OFFSET 0924 04 DB 0100B ;512 BYTES/SECTOR ; ; THERE IS NO NORTH STAR SINGLE DENSITY TRANSLATE ; TABLE. ; 0000 = TRAN5S: EQU 0 ;TELL SECTRAN TO JUST ADD 1 ; ; NORTH STAR SD DISK PARAMETER BLOCK CP/M RMAC ASSEM 1.1 #031 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; 0925 1400 DPBNSS: DW 20 ;SECTORS PER TRACK 0927 03 DB 3 ;BLOCK SHIFT FACTOR 0928 07 DB 07H ;BLOCK MASK 0929 00 DB 0 ;EXM MASK 092A 4F00 DW 80-1 ;DISK SIZE - 1 092C 3F00 DW 63 ;DIRECTORY MAX 092E C0 DB 11000000B ;ALLOC 0 092F 00 DB 0 ;ALLOC 1 0930 1000 DW 16 ;CHECK SIZE 0932 0300 DW 3 ;TRACK OFFSET 0934 02 DB 0010B ;256 BYTES/SECTOR ; ; STANDARD 8" SECTOR TRANSLATE TABLE ; 0935 01070D1319TRAN8: DB 1,7,13,19,25,5,11,17,23 093E 03090F1502 DB 3,9,15,21,2,8,14,20,26 0947 060C121804 DB 6,12,18,24,4,10,16,22 ; ; STANDARD 8" DISK PARAMETER BLOCK ; 094F 1A00 DPB8: DW 26 0951 03 DB 3 0952 07 DB 7 0953 00 DB 0 0954 F200 DW 242 0956 3F00 DW 63 0958 C0 DB 0C0H 0959 00 DB 0 095A 1000 DW 16 095C 0200 DW 2 ; 095E 00 DB 0000B ;128 BYTES/SECTOR ; ; 1024 BYTES/SECTOR TRANSLATE TABLE ; 095F 0102030405TRN124: DB 1,2,3,4,5,6,7,8 0967 191A1B1C1D DB 25,26,27,28,29,30,31,32 096F 3132333435 DB 49,50,51,52,53,54,55,56 0977 090A0B0C0D DB 9,10,11,12,13,14,15,16 097F 2122232425 DB 33,34,35,36,37,38,39,40 0987 393A3B3C3D DB 57,58,59,60,61,62,63,64 098F 1112131415 DB 17,18,19,20,21,22,23,24 0997 292A2B2C2D DB 41,42,43,44,45,46,47,48 ; ; DRIVE PARAMETER HEADER AREA ; ; DRIVES A: AND B: ARE NORTH STAR 5" ; 099F 0000 D0DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 09A1 0000 DW 0 ;SCRATCH 09A3 0000 DW 0 ;SCRATCH 09A5 0000 DW 0 ;SCRATCH 09A7 8B00 DW DIRBUF ;DIRECTORY BUFFER 09A9 0000 DW 0 ;DRIVE PARAM BLK SET BY SETDRV 09AB 2201 DW D0CHK ;DRIVE CHANGE BLK CP/M RMAC ASSEM 1.1 #032 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 09AD 0B01 DW D0ALL ;DRIVE ALLOCATION ; 09AF 0000 D1DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 09B1 0000 DW 0 ;SCRATCH 09B3 0000 DW 0 ;SCRATCH 09B5 0000 DW 0 ;SCRATCH 09B7 8B00 DW DIRBUF ;DIRECTORY BUFFER 09B9 0000 DW 0 ;DRIVE PARAM BLK SET BY SETDRV 09BB 4901 DW D1CHK ;DRIVE CHANGE BLK 09BD 3201 DW D1ALL ;DRIVE ALLOCATION ; ; ; DRIVES C: AND D: ARE JADE 8" SHUGART ; 09BF 0000 D2DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 09C1 0000 DW 0 ;SCRATCH 09C3 0000 DW 0 ;SCRATCH 09C5 0000 DW 0 ;SCRATCH 09C7 8B00 DW DIRBUF ;DIRECTORY BUFFER 09C9 F809 DW D2DPB ;DRIVE PARAM BLK SET BY SETDRV 09CB EF01 DW D2CHK ;DRIVE CHANGE BLK 09CD 5901 DW D2ALL ;DRIVE ALLOCATION ; ; 09CF 0000 D3DPH: DW 0 ;SECTOR TRAN TBL SET BY SETDRV 09D1 0000 DW 0 ;SCRATCH 09D3 0000 DW 0 ;SCRATCH 09D5 0000 DW 0 ;SCRATCH 09D7 8B00 DW DIRBUF ;DIRECTORY BUFFER 09D9 0ACC DW D3DPB ;DRIVE PARAM BLK SET BY SETDRV 09DB C502 DW D3CHK ;DRIVE CHANGE BLK 09DD 2F02 DW D3ALL ;DRIVE ALLOCATION ; ; ; ZERO PAGE IMAGE -- BLOCK MOVED TO BASE PAGE ; 09DF C303C2 BSIMG: JMP BIOS+03H ;WARM BOOT VECTOR 09E2 IOIMG: DS 1 ;IOBYTE NOT USED 09E3 00 DFIMG: DB 0 ;DEFAULT DISK -- ZERO ; AFTER COLD BOOT 09E4 C306B4 JMP BDOS+06H ;BDOS CALL VECTOR ; ; BIOS VARIABLE STORAGE ; 09E7 00 SEKDSK: DB 0 ;DRIVE NUMBER P09E8 CPMTRK: DS 1 ;TRACK NUMBER (MUST IMM FOLLOW ; SEKDSK FOR LHLD) P09E8 CPMSEC: DS 1 ;SECTOR NUMBER P09E8 SEKHST: DS 1 ;SEEK SHR SECSHF P09E8 HSTACT: DS 1 ;HOST ACTIVE FLAG P09E8 HSTWRT: DS 1 ;HOST WRITTEN FLAG P09E8 0000 DTPTR: DW 0 ;DRIVE TABLE PTR P09EA 00 LOGFLG: DB 0 ;NON-ZERO IF SETDRV ; LOGGED ON JADE DISK ; P09EB UNACNT: DS 1 ;UNALLOC REC CNT CP/M RMAC ASSEM 1.1 #033 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 P09EB UNADSK: DS 1 ;LAST UNALLOC DISK P09EB UNATRK: DS 1 ;LAST UNALLOC TRACK (MUST IMM ; FOLLOW UNADSK FOR LHLD) P09EB UNASEC: DS 1 ;LAST UNALLOC SECTOR ; ; DEBLOCKING INFO ABOUT THE CURRENTLY-SELECTED DISK ; P09EB UNAVAL: DS 1 ;# UNALLOC RECS/GROUP P09EB CPMSPT: DS 1 ;# CP/M SECTORS/TRACK P09EB SECSHF: DS 1 ;SECTOR SHIFT COUNT, ; LOG2 (# CP/M SECTORS/HOST BLOCK) P09EB SECMSK: DS 1 ;SECTOR MASK, # CP/M ; SECTORS/HOST BLOCK - 1 ; ; ; RESERVE DRIVE PARAMETER BLOCKS FOR JADE DRIVES ; 0010 = DPBSZ EQU 16 ;SIZE IS 16 BYTES P09EB D2DPB: DS DPBSZ ;RESERVE 16 BYTES/DISK C-D ; ; EVERYTHING FROM THIS POINT FOR THE NEXT ; 512 BYTES IS READ INTO MEMORY BY THE NORTH ; STAR BOOT PROM. OUR GOAL HERE IS TO GET ; A REASONABLE AMOUNT OF NORMAL BIOS CODE IN, ; BUT AT THE SAME TIME WE NEED THE PORTIONS ; THAT CAN READ THE DISK. ; ; IF THIS SECTION OVERLAYS PREVIOUS BIOS CODE ; OR DATA SPACE, THE PRECEDING BIOS MUST BE ; TRIMMED DOWN. ; P09EB = PRVCHK EQU $ ;** MUST NOT EXCEED BOOTA ** ; CC00 ORG BIOS+(HSTSIZ*5) ;ORG TO COLD BOOT ; ECC00 00 BOOTA: DB BOOTA SHR 8 ;TELL PROM LOAD ADDR ; ; THE NEXT NINE LOCATIONS ARE SKIPPED OVER ; BY THE BOOT PROM, WHICH READS THIS SECTOR ; THEN JUMPS TO BOOTA+0AH, SO PUT USEFUL VARIABLES ; HERE. NOTE THAT ALL VARIABLES IN THIS SECTOR ; WITH GENNED-IN VALUES ARE SET UP FOR COLD ; BOOT LOADING OF BIOS. ; CC01 00C2 HSTADR: DW BIOS ;READ BIOS INTO HERE TO START, ; BUT NORMALLY PTS TO HSTBUF CC03 00 HSTDSK: DB 0 ;HOST DISK NUMBER CC04 00 HSTTRK: DB 0 ;HOST TRACK NUMBER (MUST IMM ; FOLLOW HSTDSK FOR LHLD) CC05 05 HSTSEC: DB 5 ;HOST SECTOR NUMBER CC06 00 ERFLAG: DB 0 ;ERROR REPORTING CC07 59 CURDSK: DB 059H ;CURRENT ACTIVE DISK, ; GENNED-IN FORCE SELECT CC08 01 COLDB: DB 1 ;COLD BOOT WHEN NON-ZERO CC09 ERSEC: DS 1 ;SECTOR IN ERROR ; CP/M RMAC ASSEM 1.1 #034 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; THIS IS THE SECTION OF THE COLD BOOT THAT ; READS IN THE REST OF BIOS. ON MORE CONVENTIONAL ; CP/M SYSTEMS, THIS WOULD BE THE BLOCK ZERO ; BOOT. READ BIOS INTO MEMORY, THEN JUMP TO ; IT TO FINISH COLD BOOTING. ; CC0A = D3DPB: EQU $ ;*** OVERLAY N* COLD BOOT *** ; CC0A F3 BOOT: DI ;ALLOW NO PROCESSOR INTERRUPTS CC0B 31F3CF LXI SP,HSTBUF+HSTSIZ ;SET SP TO SCRATCH RAM CC0E CDBACC CALL SETUP ;GIVE MOTORS EXTRA KICK ; AND SEEK TRK 0 ; CC11 CD42CC BOOTL: CALL READNS ;READ NEXT SECTOR OF BIOS ;WITH COLDB NON-ZERO, NO ; RETURN IF I/O ERROR CC14 2105CC LXI H,HSTSEC ;IF OK, BOP SEC NUM CC17 34 INR M CC18 2A01CC LHLD HSTADR ; AND ADVANCE READ ADDR CC1B 110002 LXI D,HSTSIZ CC1E 19 DAD D CC1F 2201CC SHLD HSTADR ECC22 3E00 MVI A,BOOTA SHR 8 ;SEE IF READ ENUFF CC24 BC CMP H CC25 C211CC JNZ BOOTL ;LOOP IF NOT CC28 C38B00 JMP INIT ;GO START BIOS IF SO ; ; REMAINING NEEDED VARIABLES ; CC2B RTCNT: DS 1 ;ERROR RETRY COUNTER CC2C NSDENS: DS 1 ;DENSITY OF LAST NS DISK BLOCK ; READ, SD=128, DD=0 CC2D 00 NSCNT: DB 00H ;COUNT AND DENSITY FLAG, SET ; BY WRITEHST TO MATCH ID SECTOR ; ; NORTH STAR CURRENT TRACK TABLE ; CC2E 59 NSTRK: DB 059H ;NO CURRENT TRACK YET CC2F 59 DB 059H ;EACH ENTRY CONTAINS ; DB 059H ; THE LAST TRACK POSITION ; DB 059H ; FOR THE UNIT 1-4 ; ; OTHER VARIABLES HERE BECAUSE THERE IS SPACE, CAN ; BE MOVED IF NECESSARY ; CC30 RSFLAG: DS 1 ;READ SECTOR FLAG CC31 READOP: DS 1 ;1 IF READ OPERATION CC32 WRTYPE: DS 1 ;WRITE OPERATION TYPE ;;CPMDMA: DS 2 ;LAST DMA ADDRESS CC33 0000 ENTPSW: DW 0 ;ENTRY PSW AT DISK READ/WRITE ; ; READHST PERFORMS THE PHYSICAL READ FROM THE ; NORTH STAR DISK. ON ENTRY, DRIVE IS IN HSTDSK, ; TRACK IS IN HSTTRK, SECTOR IS IN HSTSEC. ON ; EXIT, ERROR FLAG IS IN ERFLAG (ZERO IF NONE). ; CP/M RMAC ASSEM 1.1 #035 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; *** INTERRUPTS MUST BE DISABLED HERE *** ; READHST: CC35 3E0A MVI A,10 ;RETRY COUNT ON ERROR CC37 322BCC STA RTCNT ; CC3A CDBACC READRT: CALL SETUP ;SELECT DRIVE AND ; SEEK TO TRACK CC3D 3A06CC LDA ERFLAG ;CHECK FOR ERRORS CC40 B7 ORA A CC41 C0 RNZ ;INDEX PULSE NOT FOUND IS FATAL ; ; HERE TO READ NORTH STAR WITHOUT TRACK SEEK FOR SPEED ; CC42 CD44CD READNS: CALL POSEC ;POSITION TO OUR SECTOR CC45 C289CC JNZ SNFERR ;ERROR IF NOT FOUND CC48 068C MVI B,08CH ;COUNT FOR SYNC CHAR LOOP CC4A 1140EB LXI D,CCMND+40H ;SET UP READ DATA REGS ; ; WAIT FOR RE SO WE CAN DO SECTOR READ, AND TEST ; THE DOUBLE DENSITY BIT. ; CC4D 3A10EB WAITRE: LDA CCMND+10H ;GET A-STATUS CC50 E604 ANI 04H ;CHECK RE CC52 CA4DCC JZ WAITRE ;LOOP UNTIL RE TRUE CC55 E3 XTHL ;KILL TIME TO GET INTO ZEROES CC56 E3 XTHL CC57 E3 XTHL CC58 E3 XTHL CC59 E3 XTHL CC5A E3 XTHL CC5B E3 XTHL CC5C E3 XTHL CC5D 3A10EB LDA CCMND+10H ;GET A-STATUS AGAIN CC60 E620 ANI 20H ;ARE WE READING DOUBLE DENS? CC62 17 RAL ;MAKE 80H IF NOT, ZERO IF SO CC63 17 RAL CC64 EE80 XRI 80H CC66 322CCC STA NSDENS ;SAVE DENSITY FOR CALLER ; ; NOW WAIT FOR SYNC CHAR DETECTED. ERROR IF WE HAVE TO ; WAIT TOO LONG. ; CC69 3A10EB READ5: LDA CCMND+10H ;WAIT FOR SYNC CHAR DETECTED CC6C 0F RRC ;CHECK BIT CC6D DA92CC JC READ15 ;OUT IF GOT IT CC70 05 DCR B ;COUNT DOWN IF NOT CC71 C269CC JNZ READ5 ;GO BACK IF STILL OK CC74 3E01 MVI A,1 ;SYNC ERROR IF WAITED TOO LONG CC76 218B08 LXI H,SYEMSG ;SYNC ERROR MESSAGE ; CC79 3206CC RERR: STA ERFLAG ;STORE ERROR CODE CC7C 3A2BCC LDA RTCNT ;COUNT OFF A RETRY CC7F 3D DCR A CC80 322BCC STA RTCNT CC83 C23ACC JNZ READRT ;IF COUNT LEFT, GO RETRY CP/M RMAC ASSEM 1.1 #036 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 ; ; READ ERROR RETRIES FAILED. FLAG ERROR. ; CC86 C3C1CD JMP DSKERR ;TELL OPERATOR OF ERROR THEN OUT ; CC89 3206CC SNFERR: STA ERFLAG ;SET ERROR FLAG CC8C 219408 LXI H,SNFMSG CC8F C3C1CD JMP DSKERR ;REPORT ERROR ON WAY OUT ; ; READ THE DATA INTO HSTBUF ; CC92 2A01CC READ15: LHLD HSTADR ;READ INTO HERE CC95 0600 MVI B,0 ;INIT CHECKSUM BYTE CC97 3A2CCC LDA NSDENS ;GET # BYTES TO READ CC9A 4F MOV C,A ;PUT READ COUNT IN C-REG ; CC9B 1A READ20: LDAX D ;READ NEXT DATA BYTE CC9C 77 MOV M,A ; AND PUT IT IN BUFFER CC9D A8 XRA B ;ADD TO CHECKSUM CC9E 07 RLC CC9F 47 MOV B,A CCA0 23 INX H ;BOP BUFFER PTR CCA1 00 NOP ;KILL TIME CCA2 1A LDAX D ;GET NEXT BYTE CCA3 77 MOV M,A CCA4 A8 XRA B CCA5 07 RLC CCA6 47 MOV B,A CCA7 23 INX H CCA8 0D DCR C ;COUNT OFF LAST PAIR CCA9 C29BCC JNZ READ20 ;GO BACK IF MORE TO DO CCAC 1A LDAX D ; ELSE READ CRC BYTE CCAD A8 XRA B ; AND CHECK IT AGAINST OURS CCAE 3206CC STA ERFLAG ;IF OK, ZERO EFLAG CCB1 C8 RZ ; AND RETURN TO CALLER CCB2 3E02 MVI A,2 ; ELSE FLAG CHECKSUM ERROR CCB4 218708 LXI H,RERMSG ;MESSAGE IF NEEDED CCB7 C379CC JMP RERR ;GO MAYBE RETRY ; ; SETUP SELECTS THE UNIT CORRESPONDING TO HSTDSK, ; THEN SEEKS TO THE TRACK SPECIFIED BY HSTTRK. ; WRITE PRECOMPENSATION IS SET IF REQUIRED AS ; WELL. ON ERROR, ERFLAG CONTAINS A NON-ZERO ; VALUE ON RETURN. ONLY UNITS 1 AND 2 ARE SUPPORTED ; TO SAVE SPACE. ; CCBA 3A2DCC SETUP: LDA NSCNT ;GET DENSITY FLAG CCBD EE80 XRI 80H ;INVERT TO SET DD CCBF 4F MOV C,A ;SAVE MASK CCC0 3A03CC LDA HSTDSK ;WANT THIS DISK CCC3 3C INR A ;REMAP TO CONTROLLER MASK ; CPI 03H ;IF UNIT 1 OR 2, ; JC SET0 ; GOT CORRECT MASK ; RAL ;IF 3 OR 4, MUST MAP ; ANI 0CH ; TO 4 OR 8 RESPECTIVELY ;SET0: CP/M RMAC ASSEM 1.1 #037 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 CCC4 B1 ORA C ;OR IN DENSITY MASK CCC5 4F MOV C,A ;SAVE IN REG C CCC6 CDADCD CALL WAIT1S ;WAIT A SECTOR TIME, GET A-STAT CCC9 E610 ANI 10H ;ARE MOTORS ALREADY ON? CCCB 3A15EB LDA CCMND+15H ;GIVE THEM EXTRA KICK ANYWAY CCCE C2D9CC JNZ SET5 ;BRANCH IF SO CCD1 1617 MVI D,17H ;WAIT FOR MOTORS TO CCD3 CDAFCD CALL SCWAIT ; COME UP TO SPEED IF NOT CCD6 C3E0CC JMP SET10 ; THEN GO SELECT DRIVE ; CCD9 3A07CC SET5: LDA CURDSK ;IS THIS THE CURRENT DISK? CCDC B9 CMP C CCDD CA10CD JZ SET20 ;GO SEEK TO TRACK IF SO ; ; MUST SELECT NEW DISK ; CCE0 79 SET10: MOV A,C CCE1 3207CC STA CURDSK ;NEW CURRENT DISK CCE4 06EA MVI B,CORDER SHR 8 ;SET UP FOR SELECT CCE6 0A LDAX B ; AND DO IT CCE7 1602 MVI D,2 ;WAIT TWO SECTOR TIMES CCE9 CDAFCD CALL SCWAIT ; BEFORE LOOKING FOR INDEX CCEC 060C MVI B,12 ;DON'T LOOK TOO LONG ; CCEE CDADCD SET15: CALL WAIT1S ;WAIT A SECTOR TIME, GET A-STAT CCF1 E640 ANI 40H ;INDEX HOLE SEEN? CCF3 C210CD JNZ SET20 ;CAN GO SEEK NOW IF SO CCF6 05 DCR B ;COUNT DOWN IF NOT CCF7 C2EECC JNZ SET15 ; AND MAYBE GO LOOK AGAIN ; ; INDEX HOLE NOT FOUND. DISK IS PROBABLY NOT LOADED. ; CCFA 3E04 MVI A,4 ;NO INDEX PULSE CCFC 3206CC STA ERFLAG CCFF 218F08 LXI H,NIPMSG CD02 CDC1CD CALL DSKERR ;TELL OPERATOR CD05 CDBD07 CALL NOTRDY ; AND CLAIM DISK NOT READY CD08 3E59 MVI A,059H ;FORCE RESELECT OF DISK CD0A 3207CC STA CURDSK CD0D C3BACC JMP SETUP ;TRY TO GET DISK AGAIN ; ; SEEK TO TRACK SPECIFIED BY HSTTRK NOW, AND SET ; WRITE PRECOMPENSATION IF APPROPRIATE. ; CD10 3A03CC SET20: LDA HSTDSK ;GET NSTRK INDEX CD13 4F MOV C,A CD14 0600 MVI B,0 CD16 212ECC LXI H,NSTRK ;PT AT TABLE CD19 09 DAD B ; THEN AT CORRECT ENTRY CD1A 7E MOV A,M ;GET CURRENT TRACK CD1B E5 PUSH H ;SAVE NSTRK PTR CD1C EE59 XRI 59H ;DISK EVER ACCESSED? CD1E CC5DCD CZ SEEK ;IF NOT, HOME DRIVE CD21 E1 POP H ;RESTORE NSTRK PTR CD22 3A04CC LDA HSTTRK ;SEEK TO THIS TRACK CD25 F5 PUSH PSW ;SAVE OVER CALL CP/M RMAC ASSEM 1.1 #038 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 CD26 CD5DCD CALL SEEK ;DO FINAL SEEK CD29 F1 POP PSW ;GET HSTTRK BACK CD2A FE15 CPI 14H+1 ;ARE WE BEYOND TRACK 14H? CD2C DA3FCD JC SET25 ;GO ON IF NOT CD2F 3A2DCC LDA NSCNT ;SEE IF DD OR SD CD32 B7 ORA A CD33 C23FCD JNZ SET25 ;NO PRECOMP IF SD CD36 3A07CC LDA CURDSK ;IF SO, GET CURRENT MASK CD39 F620 ORI 20H ; AND SET PRECOMP BIT CD3B 26EA MVI H,CORDER SHR 8 CD3D 6F MOV L,A CD3E 7E MOV A,M ;SET BIT IN CONTROLLER ; CD3F AF SET25: XRA A CD40 3206CC STA ERFLAG ;NO ERRORS CD43 C9 RET ; ; POSEC IS CALLED TO POSITION TO HSTSEC WITHIN ; THE CURRENT TRACK. ERROR IS RETURNED BY NON-ZERO ; IF WE CAN'T FIND THE SECTOR AFTER 30 TRIES. ; CD44 3A05CC POSEC: LDA HSTSEC ;GET TARGET SECTOR CD47 4F MOV C,A ;IN C CD48 3209CC STA ERSEC ;SET UP FOR POSSIBLE ERROR CD4B 061E MVI B,30 ;LOOK AT THIS MANY SECTORS ; CD4D CDADCD POSC5: CALL WAIT1S ;WAIT FOR NEXT SECTOR CD50 3A35EB LDA CCMND+35H ;KICK MOTORS AND GET SECNUM CD53 E60F ANI 0FH ;STRIP NON-SECTOR BITS CD55 91 SUB C ;IS THIS THE TARGET SECTOR? CD56 C8 RZ ;OUT IF GOT IT CD57 05 DCR B ;COUNT OFF IF DIDN'T CD58 C24DCD JNZ POSC5 ;GO BACK IF NOT GIVING UP CD5B 04 INR B ;SET NON-ZERO IF NOT FOUND CD5C C9 RET ; ; SEEK TO TRACK SPECIFIED BY ACC. CURRENT PTR INTO ; NSTRK TABLE IS GIVEN BY HL. IF TRACK SPECIFIED IS ; ZERO, SEEK WILL BE DONE UNTIL TRACK ZERO FLAG IS ; SEEN, REGARDLESS OF CURRENT POSITION, UNLESS ; WE ARE ALREADY THERE, SINCE NO SEEK IS DONE ; IF ALREADY AT THE DESIRED TRACK. ; CD5D 47 SEEK: MOV B,A ;SAVE TARGET TRK # CD5E 96 SUB M ;SEE HOW FAR AWAY WE ARE ; FROM TARGET TRACK CD5F 70 MOV M,B ; BUT ALWAYS SET NEW TRACK CD60 C8 RZ ;IF THERE, DONE CD61 2130EA LXI H,CORDER+30H ;ASSUME STEPPING IN CD64 4F MOV C,A ;SAVE STEP COUNT CD65 F273CD JP STEPIN ;BRANCH IF RIGHT CD68 2F CMA ;IF WRONG, NEGATE COUNT CD69 3C INR A CD6A 4F MOV C,A ; THEN SAVE THAT CD6B 3A20EB LDA CCMND+20H ;GET B-STATUS CD6E E601 ANI 01H ;ARE WE ON TRACK ZERO? CP/M RMAC ASSEM 1.1 #039 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 CD70 C0 RNZ ;MUST BE DONE IF SO CD71 2E10 MVI L,10H ;IF NOT, STEPPING OUT ; CD73 3A07CC STEPIN: LDA CURDSK ;GET CURRENT UNIT MASK CD76 B5 ORA L ;FORM FINAL CORDER VALUE CD77 6F MOV L,A CD78 56 MOV D,M ;SET THE STEP FLIP-FLOP CD79 F610 ORI 10H CD7B 6F MOV L,A CD7C 56 MOV D,M ;SET IT AGAIN FOR SOME REASON CD7D EE10 XRI 10H CD7F 6F MOV L,A CD80 56 MOV D,M ;NOW RESET THE STEP FLIP-FLOP ; ; WAIT WHILE HEAD STARTS MOVING ; CD81 3E14 MVI A,14H CD83 1638 STEPW1: MVI D,38H CD85 15 STEPW2: DCR D ;KILL TIME CD86 C285CD JNZ STEPW2 CD89 3D DCR A CD8A C283CD JNZ STEPW1 ; ; THE STEP RATE DETERMINES HOW LONG TO WAIT. ONE SECTOR ; TIME IS 20 MSEC. A SLOW SHUGART SA400 MAY REQUIRE 40 ; MSEC, OR TWO SECTOR TIMES. MOST TYPICAL SA400'S WILL ; WORK WITH 20 MSEC, SO THAT'S WHAT WE'LL USE HERE. WE ; WILL CALL SCWAIT INSTEAD OF WAIT1S IN CASE WE NEED TO ; PATCH THIS VALUE. ; CD8D 1601 MVI D,1 ;NOW WAIT 20 MSEC ; MVI D,2 ;NOW WAIT 40 MSEC CD8F CDAFCD CALL SCWAIT CD92 3A25EB LDA CCMND+25H ;GET B-STATUS AND KICK MOTORS CD95 E601 ANI 01H ;ARE WE AT TRACK ZERO? CD97 C2ADCD JNZ WAIT1S ;DONE STEPPING IF SO CD9A 0D DCR C ; ELSE COUNT OFF LAST TRACK CD9B C273CD JNZ STEPIN ;GO BACK IF MORE TO DO CD9E CDADCD CALL WAIT1S ;WAIT ONE MORE SECTOR TIME ; TO MAKE SURE DONE STEPPING CDA1 04 INR B ;SEEK TO TRACK ZERO? CDA2 05 DCR B CDA3 C0 RNZ ;DONE IF NOT CDA4 3A25EB LDA CCMND+25H ;MUST HAVE TRK ZERO FLAG IF SO CDA7 E601 ANI 01H CDA9 C0 RNZ ;OK IF SO CDAA C373CD JMP STEPIN ;GO STEP MORE IF NOT ; ; SECTOR WAIT. ON ENTRY, # SECTORS TO WAIT IS IN D. ; ON EXIT, D=0 AND ACC=A-STATUS. CALL WAIT1S TO WAIT ; ONE SECTOR TIME. ; CDAD 1601 WAIT1S: MVI D,1 ;WAIT ONE SECTOR TIME ; CDAF 3A11EB SCWAIT: LDA CCMND+11H ;RESET SECTOR FLAG CDB2 3A10EB SCW5: LDA CCMND+10H ;GET A-STATUS CP/M RMAC ASSEM 1.1 #040 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 CDB5 B7 ORA A ;CHECK SECTOR FLAG CDB6 F2B2CD JP SCW5 ;WAIT FOR IT IF NOT UP CDB9 3A11EB LDA CCMND+11H ; ELSE RESET SECTOR FLAG CDBC 15 DCR D ;COUNT DOWN WAIT COUNTER CDBD C2B2CD JNZ SCW5 ;GO BACK IF MORE TO DO CDC0 C9 RET ; ELSE RETURN A-STATUS IN ACC ; ; DISK ERRORS REPORTED HERE, BECAUSE STUPID BDOS GIVES ; NO USEFUL INFORMATION. ; CDC1 3A08CC DSKERR: LDA COLDB ;IN COLD BOOT? CDC4 B7 ORA A ;IF SO, CONOUT NOT IN MEM YET CDC5 C200E8 JNZ CBOOT ;BACK TO N* BOOT ROM ON SAME CDC8 E5 PUSH H ;SAVE BODY ADDRESS CDC9 21C908 LXI H,CRLF ;EJECT LINE CDCC CD6A08 CALL MSGOT CDCF E1 POP H CDD0 CD6A08 CALL MSGOT ;REPORT BODY CDD3 3A03CC LDA HSTDSK ;THIS DISK ; ; ENTER HERE AFTER JADE DD I/O ERROR ; CDD6 C641 JAERR: ADI 'A' CDD8 32A908 STA ASCDSK CDDB 21A408 LXI H,ERRMSG CDDE CD6A08 CALL MSGOT CDE1 3A04CC LDA HSTTRK ;THIS TRACK CDE4 CD9B04 CALL HXBOT CDE7 21B008 LXI H,SECMSG CDEA CD6A08 CALL MSGOT CDED 3A09CC LDA ERSEC ;THIS SECTOR CDF0 C39B04 JMP HXBOT ;OFF TO HXBOT TO FINISH ; CDF2 = EBOOT EQU $-1 ;LAST USED COLD BOOT BYTE ; ; ; NORTH STAR HOST SECTOR BUFFER ; CDF3 HSTBUF: DS HSTSIZ ;HOST BUFFER ; ************************************************************* * * * CBIOS RAM LOCATIONS THAT DON'T NEED INITIALIZATION. * * * ************************************************************* CFF3 00 CPMSEC DB 0 ;CP/M SECTOR # CFF4 00 CPMDRV DB 0 ;CP/M DRIVE # CFF5 00 CPMTRK DB 0 ;CP/M TRACK # CFF6 00 TRUESEC DB 0 ;DISK JOCKEY SECTOR THAT ; CONTAINS CP/M SECTOR CFF7 00 BUFDRV DB 0 ;DRIVE THAT BUFFER BELONGS TO CFF8 00 BUFTRK DB 0 ;TRACK THAT BUFFER BELONGS TO CFF9 00 BUFSEC DB 0 ;SECTOR THAT BUFFER BELONGS TO CP/M RMAC ASSEM 1.1 #041 BIOS - NORTH STAR DD CP/M 3.0 OF 29 AUG 97 CFFA BUFFER DS 1024 ;MAXIMUM SIZE BUFFER FOR 1K ; SECTOR ; D3F9 = LAST EQU $-1 ;LAST USED BYTE IN MEM ; D3FA END