; ;HARD DISK LOADER UTILITY PROGRAM ;WRITTEN BY P. LEDBETTER IN OCTOBER, 1983 ; WARMBT EQU 01H ;LOC. WHERE WARM BOOT ADDR IS RAMOFF EQU 043H ;OFFSET VALUE TO TABLE WHICH CONTAINS RAM AREA ADDR DATYOFF EQU 03FH ;OFFSET VALUE TO TABLE WHICH CONTAINS RAMDATY PTR ; BDOS EQU 05H ; CR EQU 0DH CRWH EQU 8DH LF EQU 0AH TAB EQU 09H ESC EQU 1BH CLSCR EQU 1AH BELL EQU 07H ; RESET EQU 03H PRINT EQU 09H CONIN EQU 01H DRVRST EQU 0DH SETDMA EQU 1AH FILECHK EQU 11H ; REVOFF EQU 03CH IMSFLG EQU 040H ;IMS ACTIVE FLAG IMSBUF EQU 080H ;IMS BUFFER NOT EMPTY FLAG AFLAG EQU 041H ;APPLICATION FLAG CFLAG EQU 040H ;COPY FLAG FLOPPY EQU 03H PARAM EQU 5DH ; .Z80 CSEG JP MAIN ;JUMP TO THE START OF MAIN PROGRAM ; HEADER: DB CR,LF,' HARD DISK LOADER UTILITY PROGRAM',1AH ; MAIN: LD A,(PARAM) CP 'I' JP Z,EXINIT ;CHECK WHETHER INIT. IS ASKED LD A,(CFLAG) CP 0FEH JP Z,COPY ;CHECK FOR FIRST TIME INSTALLATION LD A,(AFLAG) CP 00 ;COPYING APPL. COMPLETE ? JP Z,CHAIN ;YES, THEN CHAIN TO INIT. PROGRAM LD A,(CFLAG) ;CHECK WHETHER APPL. COPY WAS IN PROGRESS CP 0FFH JP Z,COPY LD A,'1' LD (AFLAG),A JP COPY ;APPLICATION LOAD ASKED. SET UP FLAG & COPY ; EXINIT: LD C,PRINT LD DE,IMSG CALL BDOS ;PRINT INITIALIZATION MESSAGE LD C,CONIN CALL BDOS AND 5FH CP 'Y' JP NZ,EXIT LD HL,INIT LD A,0FEH LD (CFLAG),A ;ACTIVATE COPY FLAG LD A,'1' LD (AFLAG),A ;ACTIVATE APPL. FLAG JP EXIMS ;PROCEED TO INITIALIZE ; CHAIN: LD A,55H LD (CFLAG),A LD (AFLAG),A LD HL,PRKHD JP EXIMS ; ; EXIT: JP WARMBT-1 ;EXIT TO CP/M ; COPY: LD A,(AFLAG) ;GET APPLICATION FLAG CP '1' LD HL,BUFF1 JR Z,MOVE ;COPY WORDSTAR DISK CP '2' LD HL,BUFF2 JR Z,MOVE ;COPY LOGICALC DISK CP '3' LD HL,BUFF3 JR Z,MOVE ;COPY CORRECT-IT DISK CP '4' LD HL,BUFF4 JR Z,MOVE ;COPY MBASIC-80 DISK CP '5' LD HL,BUFF5 JR Z,MOVE ;COPY 1ST DISK OF PERSONAL PEARL CP '6' LD HL,BUFF6 JR Z,MOVE ;COPY 2ND DISK OF PERSONAL PEARL CP '7' LD HL,BUFF7 JR Z,MOVE ;COPY 1ST DISK OF QUEST CP '8' LD HL,BUFF8 JR Z,MOVE ;COPY 2ND DISK OF QUEST CP '9' LD HL,BUFF9 JR Z,MOVE ;COPY 3RD DISK OF QUEST CP ':' LD HL,BUFFA JR Z,MOVE ;COPY BACKFIELD DISK LD C,PRINT LD DE,MSG3 CALL BDOS ;APPLICATION COPY ALL DONE LD C,CONIN CALL BDOS LD A,00 LD (CFLAG),A ;CLEAR COPY FLAG LD (AFLAG),A ;CLEAR APPL. FLAG JP MAIN ;RETURN TO MAIN MENU ; ; MOVE: LD C,11 LD B,0 LD A,FLOPPY LD (FCB),A LD DE,FCB+1 ;CONSTRUCT FCB LDIR LD A,0 LD (FCB+12),A ;SET UP FCB EXTENT LD C,24 LD B,0 LD DE,NAME ;CONSTRUCT APPL. NAME STRING LDIR LD C,PRINT LD DE,CMSG CALL BDOS LD C,PRINT LD DE,DUMMSG CALL BDOS REPMPT: LD C,PRINT LD DE,PMPT1 CALL BDOS LD C,CONIN CALL BDOS CP CR JP NZ,REPMPT LD C,SETDMA LD DE,DMAADR CALL BDOS ;SET DMA ADDRESS CHKDSK: LD C,DRVRST CALL BDOS LD C,FILECHK LD DE,FCB CALL BDOS ;CHECK FOR THE PROPER DISK CP 0FFH JP Z,ERROR ;IF NOT THE RIGHT DISK, ISSUE AN ERROR LD A,0FFH LD (CFLAG),A ;ACTIVATE COPY FLAG LD A,(AFLAG) CP '7' LD HL,Q1STR ;IF QUEST 1 OF 1 DISK, PASS IN DIFF. IMS STRING JP Z,EXIMS CP ':' LD HL,BKSTR ;IF BACKFIELD DISK, PASS IN DIFF. IMS STRING JP Z,EXIMS LD HL,STR ; EXIMS: LD C,(HL) ;GET THE LENGTH OF IMS STRING LD B,0 INC HL ;HL POINTS TO IMS STRING IMS: PUSH HL ;SAVE IMS STRING PUSH BC ;SAVE STRING LENGTH LOOP: LD A,(HL) CP '|' ; '|' ENTERED ? JR NZ,LOOP1 LD (HL),CRWH ;THEN REPLACE THAT WITH CR WITH HIGH BIT ON JP LOOP2 LOOP1: CP '/' ; '/' ENTERED ? JR NZ,LOOP2 LD (HL),CR ;IF YES, REPLACE THAT WITH CR LOOP2: INC HL ;PICK UP NEXT CHAR DEC C ;DECREMENT COUNTER JR NZ,LOOP LD HL,(WARMBT) LD DE,RAMOFF ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ;HL=ADDR OF RAM AREA LD A,0FFH CALL FIND ;FIND FREE SPACE POP BC PUSH BC LD A,C LD B,A ;GET THE LENGTH OF USER STRING LD C,A ;SAVE IT IN B AND C DEC A CP E ;DOES THE STRING FIT INTO FREE SPACE ? JR C,CONT ;YES,THEN CONTINUE ON LD A,D CP 1 JP C,ERR2 ;OTHERWISE ISSUE AN ERROR CONT: DEC DE DEC B ;SUBTRACT STRING LENGTH FROM FREE SPACE LENGTH JR NZ,CONT DEC HL LD (HL),E INC HL LD (HL),D ;STORE NEW LENGTH INC HL ADD HL,DE ;ADJUST POINTERS FOR FREE SPACE AND IMS BUFFER BLOCKS LD A,0FDH LD (HL),A ;PLUG IMS BUFFER MARKER INC HL LD (HL),C INC HL LD (HL),00H ;PLUG THE LENGTH OF STRING INC HL LD E,L ;IMS BUFFER ADDR IN DE LD D,H POP BC ;RESTORE THE LENGTH OF IMS STRING POP HL ;RESTORE IMS STRING CONTENT LDIR ;TRANSFER IMS STRING TO IMS BUFFER LD HL,(WARMBT) LD DE,REVOFF ADD HL,DE LD A,(HL) ;GET REVISION NO. OF BIOS CP 80H JP NC,ERR3 JP Z,ERR3 ;CHECK FOR NON-IMS SYSTEM CP 40H JP NC,WRTFLAG JP Z,WRTFLAG ;CHECK FOR MD11 LD A,0BH LD (DFLAG),A ;STORE DISK FLAG OFFSET FOR MD3 CONT1: LD HL,(WARMBT) LD DE,DATYOFF ADD HL,DE LD A,(HL) INC HL LD H,(HL) LD L,A ;HL=RAMDATY ADDRESS LD A,(DFLAG) LD C,A LD B,0 ADD HL,BC LD A,(HL) ;GET THE DISK FLAG OR IMSFLG+IMSBUF ;SET UP IMS FLAG (IMS ACTIVE & IMS BUFFER NOT EMPTY) LD (HL),A ;STORE THE FLAG JP WARMBT-1 ;EXIT TO CCP ; FIND: CP (HL) ;SEE IF HEADER CODE MATCHES INC HL ;INCREMENT POINTER LD E,(HL) ;GET OFFSET TO NEXT BLOCK INC HL LD D,(HL) RET Z ;RETURN IF BLOCK FOUND INC HL ;SET POINTER TO NEXT BLOCK ADD HL,DE JR FIND ;KEEP LOOKING ; ; WRTFLAG:LD A,12H LD (DFLAG),A ;STORE DISK FLAG OFFSET FOR MD11 JP CONT1 ; ERROR: LD C,PRINT LD DE,EMSG1 CALL BDOS ;PRINT THE ERROR LD C,PRINT LD DE,NAME CALL BDOS LD C,PRINT LD DE,EMSG0 CALL BDOS LD C,CONIN CALL BDOS ;GET THE USER RESPONSE CP CR JP Z,CHKDSK ;IF CR ENTERED, JUMP TO CHECK FOR RIGHT DISK AGAIN JP ERROR ;REPROMPT FOR INVALID RESPONSE ; ERR1: LD C,PRINT LD DE,EMSG3 CALL BDOS JP WARMBT-1 ; ERR2: LD C,PRINT LD DE,EMSG2 CALL BDOS JP WARMBT-1 ; ERR3: LD C,PRINT LD DE,EMSG4 CALL BDOS JP WARMBT-1 ; ;IMS COMMAND STRING BUFFER AREA ; INIT: DB STR-INIT-1,'FORMAT B/CONTINUE/MOVCPMH * */SYSGEN//B//AUTO *B IMS ;~AUTO;HDLOAD;/PIP B:=A:*.*[V]/BOOTHD/' STR: DB BKSTR-STR-1,'PIP A:=C:*.*[V]/NEXT/HDLOAD/' BKSTR: DB Q1STR-BKSTR-1,'PIP/A:=C:?B.COM/A:=C:*.OVL/A:=C:RESTORE.COM/A:=C:SELECT.COM/' DB 'A:=C:BFDIR.COM/A:=C:CRC.COM/A:=C:CHANGE.COM/A:=C:COMPARE.COM/A:=C:README//NEXT/HDLOAD/' Q1STR: DB PRKHD-Q1STR-1,'ERA C:PIP.COM/PIP A:=C:*.*[V]/NEXT/HDLOAD/' PRKHD: DB MSG3-PRKHD-1,'AUTO PILOT INIT/PARK/' ; ;MESSAGE AREA ; MSG3: DB CLSCR,CR,LF,LF,LF,TAB,'Completed copying application programs.' DB CR,LF,TAB,'Press RETURN to invoke initialization program.$' ; DUMMSG: DB ' diskette.$' ; PMPT1: DB CR,LF,LF,'Insert the above diskette in the floppy drive.' DB CR,LF,'Press RETURN when ready.$' ; IMSG: DB CLSCR,CR,LF,LF,TAB,TAB,TAB,'CP/M Distribution Disk' DB CR,LF,LF,'------------------------ This is your master disk ------------------------' DB CR,LF,LF,'WARNING: This disk automatically erases your hard disk, and' DB CR,LF,'reloads it with the original programs.' DB CR,LF,LF,'WARNING: All of your data on the hard disk will be erased.' DB CR,LF,LF,'Do you wish to erase your hard disk and start all over again? ' DB CR,LF,LF,'Answer "Y" to continue or anything else to quit: $' ; ; EMSG1: DB CLSCR,CR,LF,LF,'This is not the correct diskette.' DB CR,LF,LF,'Insert the $' EMSG0: DB ' diskette in the drive.' DB CR,LF,'Press RETURN when ready. $' ; EMSG2: DB CLSCR,CR,LF,LF,LF,'IMS input buffer string too long; try again.$' EMSG3: DB CLSCR,CR,LF,LF,'Range error for application program.$' EMSG4: DB CLSCR,CR,LF,LF,'IMS logic not implemented on this system.$' ; ; PROGRAM BUFFER AREA ; BUFF1: DB 'WSU COM','WORDSTAR$ ' BUFF2: DB 'LC COM','LOGICALC$ ' BUFF3: DB 'CORRECT COM','CORRECT-IT$ ' BUFF4: DB 'MBASIC COM','MBASIC$ ' BUFF5: DB 'WELCOME COM','PERSONAL PEARL 1 OF 2$ ' BUFF6: DB 'PEARLFM COM','PERSONAL PEARL 2 OF 2$ ' BUFF7: DB 'KP COM','QUEST 1 OF 3$ ' BUFF8: DB 'KARP COM','QUEST 2 OF 3$ ' BUFF9: DB 'KACD COM','QUEST 3 OF 3$ ' BUFFA: DB 'QB COM','BACKFIELD$ ' ; DFLAG: DS 1 FCB: DS 13 CMSG: DB CLSCR,CR,LF,LF,LF,BELL,BELL,'Copying --- ' NAMEš DS 24 DMAADR: DS 128 ; END MAIN