; SYSGEN Program to put the CP/M system on a double density ; disk; track 0. The system may already be in core or ; it may be read from the disk. The user specifies which. ; See the CP/M manual for further instructions. ; ; BY C.A. CALKINS 09/08/79 ; modified 09/13/80 for ByteMaster ; rev.01 5/30/81 -check for valid drive request -db ; NBLOCKS EQU 80 ;SECTORS TO READ/WRITE NWARM EQU 44 ;SECTORS TO WRITE FOR A WARM-ONLY BOOT ; ORG 100H STACK LXI SP,STACK LXI D,MESG1 ;ASK FOR SOURCE DISK CALL ASK CPI 13 ;A RETURN MEANS SOURCE IS IN CORE JZ WRT STA MESG1B ;store drive name SUI 'A' ;CONVERT TO BINARY FROM ASCII LETTER jc stack ;invalid response cpi 2h jnc stack ;'B' is last valid drive PUSH PSW LXI D,MESG1A ; Ask user to put disk in CALL ASK POP PSW MOV C,A ;AND SELECT THIS DISK CALL SELDSK ;GETTING DPT INTO HL MVI B,0 MVI C,0AH ;OFFSET TO DPB DAD B ;Add to HL MOV A,M ;LD HL,(HL) INX H MOV H,M MOV L,A MOV A,M ;Get sectors per track INR A STA MAXSEC LXI H,900H ;PUT SOURCE HERE SHLD DMA MVI A,1 ;SECTOR 1 STA SECT MVI A,0 ;TRACK 0 STA TRACK STA BLOCK ;INITIAL BLOCK NUMBER RDLP LDA TRACK ;SETUP ALL PARAMETERS MOV C,A MVI B,0 CALL SETTRK LDA SECT MOV C,A CALL SETSEC LHLD DMA MOV B,H MOV C,L CALL SETDMA CALL READ ;AND READ THIS SECTOR LHLD DMA ;UPDATE DMA ADDRESS LXI D,128 DAD D SHLD DMA LDA BLOCK ;COUNT ALL 128 BYTE BLOCKS READ INR A STA BLOCK CPI NBLOCKS ;ONLY THIS LONG JZ WRT LDA SECT ;AND SECTOR INR A STA SECT PUSH PSW LDA MAXSEC MOV C,A POP PSW CMP C ;NEXT TRACK REQUIRED? JNZ RDLP MVI A,1 ;YES, START OVER STA SECT ;WITH NEXT ONE LDA TRACK INR A STA TRACK JMP RDLP ; ; ALL DONE, TELL USER TO READY THE OUTPUT DEVICE ; WRT MVI A,NBLOCKS STA NWRITE LXI D,MESG2 CALL ASK CPI 13 ;RE-BOOT ON A (CR). JZ 0 cpi 'A' jc wrt ;invalid response cpi 'C' jnc wrt ;'B' is last valid drive STA DRIVE LXI D,MESG3 ;TELL USE TO READY DISK CALL ASK LDA DRIVE ;RETRIEVE DRIVE NAME SUI 'A' ;CHANGE ASCII INTO BINARY MOV C,A ;AND SELECT THIS DISK CALL SELDSK MVI B,0 MVI C,0AH ;OFFSET TO DPB DAD B ;Add to HL MOV A,M ;LD HL,(HL) INX H MOV H,M MOV L,A MOV A,M ;Get sectors per track INR A STA MAXSEC MVI B,0 MVI C,0DH ;GET OFFSET OF 'OFF' IN DPB DAD B ;POINT TO IT MOV B,M ;GET 'OFF' INTO B MOV C,A DCR C MVI A,0 MULLP ADD C ;Multiply 'off' by SPT DCR B ; A = B * C BY REPEATED SUMMINGS JNZ MULLP CPI NWARM JP LP1 MOV D,A PUSH D LXI D,NOGO ;NO GOOD! MVI C,9 CALL CPM POP D JMP WRT LP1 CPI NBLOCKS JP LP2 MVI A,NWARM STA NWRITE LXI D,WONLY ;WARM BOOT ONLY MVI C,9 CALL CPM LP2 LXI H,900H ;SETUP DMA ADDRESS SHLD DMA MVI A,1 ;AND SECTOR STA SECT MVI A,0 ;AND TRACK STA TRACK STA BLOCK ;AND NUMBER OF BLOCKS WTLP LHLD DMA ;WRITE LOOP, SETUP PARAMETERS MOV B,H MOV C,L CALL SETDMA LDA SECT MOV C,A CALL SETSEC LDA TRACK MOV C,A MVI B,0 CALL SETTRK ; MVI C,1 ;DIRECTORY WRITE (CPM 2.00 REQ) MVI C,2 ;write to unallocated (faster) CALL WRITE ;WRITE THIS SECTOR NOW LHLD DMA ;UPDATE PARAMETERS LXI D,128 DAD D SHLD DMA LDA BLOCK ;COUNT ALL 128 BYTE BLOCKS WRITTEN INR A STA BLOCK MOV C,A LDA NWRITE CMP C JZ WRT ;ONLY THIS LONG LDA SECT INR A STA SECT PUSH PSW LDA MAXSEC MOV C,A POP PSW CMP C ;NEXT TRACK REQUIRED? JNZ WTLP MVI A,1 STA SECT LDA TRACK INR A STA TRACK JMP WTLP ; ; ROUTINE TO ASK A MESSAGE AND GET THE RESPONSE ; ASK MVI C,9 CALL CPM MVI C,1 CALL CPM ani 5fh ;convert to upper case RET ; ; MESSAGES ; MESG1 DB 13,10,'SYSGEN System generation routine Version 2.02' DB 13,10,'For Shoebox 1/13/87' DB 13,10,'Source drive name (or return to skip) $' MESG1A DB 13,10,'Source on ' MESG1B DB ' , then type return$' MESG2 DB 13,10,'Destination drive name (or return to reboot) $' MESG3 DB 13,10,'Destination on ' DRIVE DB ' , then type return$' NOGO DB 13,10,'ERROR - No room on disk for CCP and BDOS$' WONLY DB 13,10,'WARNING - This will be a warm-boot only disk$' ; ; ; INTERFACE WITH CPM BIOS ROUTINES. ; SELDSK LXI D,1BH-3 ;OFFSET FOR OUR FUNCTION GO LHLD 1 ;ADDRESS OF START OF BIOS DAD D PCHL ;EXECUTE IT ; SETTRK LXI D,1EH-3 JMP GO ; SETSEC LXI D,21H-3 JMP GO ; SETDMA LXI D,24H-3 JMP GO ; READ LXI D,27H-3 JMP GO ; WRITE LXI D,2AH-3 JMP GO ; ; STORAGE SPACE ; MAXSEC DB 0 NWRITE DB 0 DMA DW 0 TRACK DB 0 SECT DB 0 BLOCK DB 0 ; ; EQUATES ; CPM EQU 5 ; END 100H