; THIS IS THE CP/M BOOTSTRAP FOR THE SINGLE USER SYSTEM. ; I HAVE WRITTEN IT IN SUCH A WAY THAT IT IS INDEPENDENT ; OF THE PROM CODE, EVEN THOUGH THIS MEANS MORE PROGRAMMING ; OF THE DMA. OTHERWISE, WE WOULD BE FORCED TO MODIFY THE ; PROM CODE EVERY TIME WE WANTED TO MOVE CP/M AROUND IN ; RAM. THE BOOTSTRAP IS OTHERWISE STRAIGHTFORWARD AND ; REQUIRES NO SPECIAL EXPLANATION. IT IS DESIGNED TO BE ; LOADED AND EXECUTED AT 4000H, THE FIRST LOCATION OF NON- ; SWAPPABLE DYNAMIC RAM. ; 7-8-81 SUNG WOO LEE ; MODIFIED BIOS LENGTH FROM 0600H TO 0D00H FOR INCREASED BIOS LOADING TITLE TSFBOOT.MAC--TELEVIDEO SYSTEM TS-802 BOOTSTRAP--JULY 1, 1981 .Z80 CSEG .PHASE 4000H BOOT: OUT (ENDRAM),A ; NO STACK OPERATIONS BEFORE HERE LD SP,BOOT ; INITIALIZE THE STACK POINTER ; REPROGRAM THE DMA DESTINATION ADDRESS BOOT10: LD C,DMA ; PORT ADDRESS LD A,10000011B ; DISABLE COMMAND OUT (C),A LD A,11001101B ; BURST MODE, CHANGE B ADDRESS OUT (C),A LD HL,CPMBAS ; NEW TRANSFER ADDRESS OUT (C),L OUT (C),H LD A,11001111B ; LOAD DMA REGISTERS OUT (C),A LD A,10000111B ; ENABLE THE DMA OUT (DMA),A ; HOME THE HEAD TO TRACK 0 LD A,RESCMD ; RESTORE COMMAND OUT (FDCCMD),A CALL WAIT ; WAIT FOR COMPLETION AND SEEMSK JR NZ,BOOT10 ; SEEK ERROR, TRY AGAIN ; INITIAL VALUES FOR TRACK, SECTOR, AND SECTOR COUNT LD L,0 ; START ON TRACK 0 LD E,2 ; SECTOR 2 LD B,CPMSEC ; NO. OF SECTORS IN CP/M BOOT20: LD A,E CP SPCYL+1 ; TIME TO MOVE TO NEXT TRACK JR C,BOOT30 ; NO. ; MOVE TO NEXT TRACK AND SEEK. INC L ; BUMP TRACK NO. LD E,1 ; RESET SECTOR NO. LD A,L OUT (FDCDAT),A ; WRITE TRACK TO DATA REGISTER LD A,SEECMD OUT (FDCCMD),A ; SEEK. CALL WAIT ; WAIT FOR COMPLETION AND SEEMSK ; STRIP OFF NON-SIGNIFICANT BITS JR NZ,BOOT10 ; BOOT ERROR, TRY AGAIN BOOT30: LD A,L ; UPDATE TRACK REGISTER OUT (FDCTRK),A LD A,E ; UPDATE SECTOR REGISTER CP (SPCYL/2)+1 ; WHICH SIDE? LD C,00010010B JR C,BOOT40 ; SIDE 0, (PRIMARY) LD C,00010110B ; SIDE 1, (SECONDARY) SUB (SPCYL/2) BOOT40: OUT (FDCSEC),A LD A,C ; CHOOSE SIDE OUT (FDD),A ; WRITE TO FLOPPY SELECT LATCH LD A,RDSCMD ; READ SECTOR COMMAND OUT (FDCCMD),A CALL WAIT ; WAIT FOR COMPLETION JR NZ,BOOT10 ; READ ERROR, START OVER INC E ; BUMP SECTOR NUMBER LD A,10000011B ; DISABLE THE DMA OUT (DMA),A LD A,11010011B ; CONTINUE OPERATION OUT (DMA),A ; SUBSTITUTE FOR LOAD LD A,10000111B ; ENABLE THE DMA OUT (DMA),A DJNZ BOOT20 ; LOOP ON NEXT SECTOR JP CPMBOO ; JUMP TO CBIOS BOOT ADDRESS ; THIS ROUTINE LOOPS UNTIL THE FDC IS ; IN A NON-BUSY STATE, OR UNTIL A NOT- ; READY CONDITION IS DETECTED. WAIT: LD A,15 ; WE MUST DELAY ABOUT WAIT10: DEC A ; 60 USECS BEFORE READING JR NZ,WAIT10 ; THE STATUS. WAIT20: IN A,(FDCCMD) ; READ THE FDC STATUS BIT FDCRDY,A ; IS THE DEVICE NOT READY? RET NZ ; YES, THIS IS AN ERROR BIT FDCBSY,A ; ARE WE PROCESSING A COMMAND? JR NZ,WAIT20 ; YES, LOOP UNTIL NOT BUSY AND ERRMSK ; MASK OFF NON-ERROR BITS RET .DEPHASE ; FDC EQUATES FDCCMD EQU 14H ; FDC STATUS AND COMMAND PORT FDCTRK EQU 15H ; FDC TRACK PORT FDCSEC EQU 16H ; FDC SECTOR PORT FDCDAT EQU 17H ; FDC DATA PORT ; DMA PORT ADDRESS DMA EQU 10H ; DMA PORT ADDRESS FDD EQU 18H ; FLOPPY SELECT LATCH ENDRAM EQU 04H ; PROM DISABLE PORT ; FDC STATUS BITS FDCBSY EQU 0 ; FDC BUSY IS BIT 0 FDCIND EQU 1 ; FDC INDEX HOLE DETECTED FDCTR0 EQU 2 ; FDC TRACK 0 DETECTED FDCCRC EQU 3 ; FDC CRC ERROR ENCOUNTERED FDCSEE EQU 4 ; FDC SEEK ERROR ENCOUNTERED FDCHLD EQU 5 ; FDC HEAD LOAD ACK. FDCPRT EQU 6 ; FDC DISK IS WRITE PROTECTED FDCRDY EQU 7 ; FDC DISK NOT READY BIT ; FDC STATUS BYTE MASKS ERRMSK EQU 11011100B ; MASK OFF INSIGNIFICANT BITS SEEMSK EQU 10011000B ; CHECK THE NOT READY BIT DNRMSK EQU 10000000B ; DRIVE NOT READY MASK ; FDC COMMAND BYTES RESCMD EQU 00000111B ; HOME HEAD COMMAND SEECMD EQU 00010111B ; SEEK TRACK COMMAND HDSCMD EQU 00110111B ; HEAD STEP, PREVIOUS DIRECTION HSICMD EQU 01010111B ; HEAD STEP IN, TOWARD HUB. HSOCMD EQU 01110111B ; HEAD STEP OUT, TOWARD EDGE. RDSCMD EQU 10000000B ; READ SECTOR WTSCMD EQU 10100000B ; WRITE SECTOR RDACMD EQU 11000000B ; READ SECTOR ADDRESS RDTCMD EQU 11100000B ; READ TRACK WTTCMD EQU 11110000B ; WRITE TRACK FRCCMD EQU 11010000B ; FORCE TERMINATION ; DISK CONFIGURATION EQUATES NUMTRK EQU 40 ; NUMBER OF TRACKS ON DISKETTES MAXTRK EQU NUMTRK-1 ; NUMBER STARTS AT 0 MINTRK EQU 0 ; WHERE TO BEGIN SEEK TEST SPT EQU 18 ; SECTORS PER TRACK SPCYL EQU SPT*2 ; SECTORS PER CYLINDER BPSEC EQU 100H ; BYTE PER SECTOR ; ********************************************* ; * FOLLOWING CPMBAS(CCP ENTRY POINT ADDRESS) * ; * HAS TO BE CONSULTED WITH 802FBIOS.MAC FOR * ; * FUTURE MOVCPM GENERATION. * ; ********************************************* CPMBAS EQU 0DC00H ; CCP ADDRESS FOR 62K SYSTEM CPMLN EQU 1600H ; CP/M SIZE = CCP + BDOS = 1600H BIOSLN EQU 0D00H ; CP/M BIOS SIZE (VARIES) CPMSEC EQU (0FFFFH-CPMBAS)/256+1 ; NUMBER OF SECTORS FOR TVI CP/M CPMBOO EQU CPMBAS+CPMLN ; CBIOS COLD START ENTRY POINT END