PAGE * * * * * THIS ROUTINE "HALTS" OUT MEMORY PRIOR TO EXIT * RETIT LXI H,0 REHLT MVI M,76H HALT INSTRUCTION INX H MOV A,H CPI RETIT JNZ REHLT RET . AND RETURN TO CALLER * * * TEST FOR ESCAPE * ESCST CALL CONTST RZ CALL CONIN ANI 7FH RNZ * DRRET CALL OUST DB CR,LF ASC 'Operation aborted' DB CR,LF DB 0 JMP SYRET * * TRACK ERROR CAN'T CONTINUE * COABT CALL OUST DB CR,LF ASC "Can't read track DB 0 JMP DRRET * * * COME HERE WHEN THE COPY IS COMPLETE * COPDN CALL OUST DB CR,LF ASC 'Copy complete' DB CR,LF DB 0 JMP SYRET * * * ERASE COMPLETE * ERDON CALL OUST DB CR,LF ASC 'Initialization complete' DB CR,LF DB 0 JMP SYRET * * * COME HERE AFTER A VERIFY IS COMPLETE * VEDON LDA INUNT CHECK IF ONE OR TWO UNITS LXI H,OTUNT CMP M JNZ VEDO1 * CALL OUST WE ONLY VERIFIED ONE UNIT DB CR,LF ASC 'Unit ' DB 0 LDA INUNT CALL UNOUT CALL OUST ASC ' verifies' DB CR,LF DB 0 JMP SYRET * VEDO1 CALL OUST DB CR,LF ASC "Units " DB 0 LDA INUNT CALL UNOUT OUTPUT THE UNIT NUMBER CALL OUST ASC ' and ' DB 0 LDA OTUNT CALL UNOUT CALL OUST ASC ' are identical' DB CR,LF DB 0 JMP SYRET RETURN TO THE SYSTEM * * * LOAD COMPLETE * * LDR60 CALL OUST DB CR,LF CRLF ASC 'Data load complete on unit ' DB 0 LDA TUNIT CALL UNOUT CALL OUST DB CR,LF AGAIN DB 0 * * THIS IS THE MAIN SYSTEM RETURN POINT * SYRET CALL DDRI RETURN ASSOCIATED DRIVES TO ZERO CALL RETIT HALT IT ALL OUT CALL SYS DB RETOP AND RETURN * PAGE * * ************************************ * * * * SYSTEM FILE INFORMATION * * * DIRECTORY INFORMATION * IDDIR EQU 2 DIRECTORY FILE ID DIRDS EQU 0 SECTOR AND DIRDT EQU 25 TRACK OF DIRECTORY * NMLEN EQU 8 NAME LENGTH DREMS EQU 12 MAX ENTRIES PER SECTOR DICNT EQU 16 NUMBER OF DIRECTORY SECTORS * * * SYSTEM GLOBAL FILE * DASPS EQU 13 SECTOR ADDRESS DASPT EQU 1 TRACK ADDRESS IDSPA EQU 5 FILE ID * * * FSM (FREE SPACE MAP) INFORMATION * IDFSM EQU 1 FSM FILE ID DAFSS EQU 0 SECTOR AND DAFST EQU 26 TRACK OF FSM * * * NEXT FILE ID FILE INFORMATION * IDNID EQU 3 NEXT ID FILE ID DANIS EQU 1 DISK ADDRESS OF DANIT EQU 26 NEXT ID FILE NIDBC EQU 2 BYTE COUNT OF BLOCK * * * BOOTSTRAP FILE * DABOS EQU 0 DISK DABOT EQU 0 ADDRESS IDBOT EQU 6 FILE ID BOCNT EQU 333H LENGTH OF FILE * * FILE STRUCTURE LINKAGE VALUES * BOFCD EQU 65535 BOF CODE IN BACK POINTER EOFCD EQU 32768 EOF BIT IN FORE POINTER * * * DEFINE FILE TYPES * SYSIM EQU 00H SYSTEM IMAGE TYPE --(I00) BNTYP EQU 80H BINARY DATA FILE --(00) UTTYP EQU 01H UTILITY TYPE * IMTYPE EQU 80H IMAGE FILE MASK (OFF IS IMAGE!!) * PAGE * * * * DATA DISK LOADER * * THIS SET OF ROUTINES WHOSE STARTING ADDRESS * IS LISTED ABOVE ESTABLISHES AN INITIAL SYSTEM * ON A PRE-WRITTEN DISK IN THE SELECTED UNIT. * * * * WRITE OUT SYSTEM GLOBAL AREA * FMDON LXI D,LSGL CALL LPTD SET TRANSFER DESCRIPTOR LXI D,LSGLH CALL LPHD1 SET OUTGOING HEADER * * WRITE OUT BOOTSTRAP * LXI D,LBOO CALL LPTD SET TRANSFER DESCRIPTOR LXI D,LBOOH CALL LPHD1 SET OUTGOING HEADER * * WRITE NEXT ID FILE * LXI D,LNIF CALL LPTD SET TRANSFER DESCRIPTOR LXI D,LNIFH CALL LPHD1 SET OUTGOING HEADER * * INITIALIZE EMBRYONIC DIRECTORY * * WRITE FIRST SECTOR * LXI D,LDS0 CALL LPTD SET TRANSFER DESCRIPTOR LXI D,LDS0H CALL LPHD1 SET OUTGOING HEADER * * LOOP AND WRITE REST OF DIRECTORY * MVI A,DICNT-2 STA LDCNT SET COUNT OF REMAINING SECTORS * * SET HEADERS * LXI D,LDS1 CALL LPTD SET TRANSFER DESCRIPTOR LXI D,LDS1H CALL LPHD SET OUTGOING HEADER LHLD TBCNT SHLD TRSIZ CALL XDSKH WRITE THE HEADER JMP LDERR ERROR CALL WDSK JMP LDERR * * IF LAST SECTOR, SET EOF * LDR20 LDA LDCNT ORA A =O? JNZ LDR30 NO, NOT LAST SECTOR * * SET EOF * LXI H,EOFCD LXI D,SECTSZ DAD D EOF+COUNT SHLD TRFOR SET IN FORE PTR. * LDR30 LHLD TBCNT WRITE SHLD TRSIZ CALL XDSKH JMP LDERR CALL WDSK JMP LDERR * * UPDATE POINTERS * LXI H,TTSEC PTR TO SECTOR ADDRESS INR M LXI H,TRFOR PTR TO SECTOR FORE PTR INR M LXI H,TRBAK PTR TO SECTOR BACK PTR INR M * * CHECK COUNT * LDA LDCNT ORA A JZ LDR40 DCR A NOPE STA LDCNT JMP LDR20 DO NEXT SECTOR. * LDR40 MVI B,77+77 XRA A LXI H,FMBF * * WRITE OUT FSM * LDR42 LXI D,LFSM CALL LPTD SET TRANSFER DESCRIPTOR LXI D,LFSMH CALL LPHD1 WRITE IT OUT JMP LDR60 ALL DONE * * * PREPARE TRANSFER DESCRIPTOR * LPTD LXI H,TDAD MVI C,9 CALL HDSE1 RET * * PREPARE OUTGOING HEADER * LPHD LXI H,TRFOR MVI C,7 CALL HDSE1 RET * LPHD1 CALL LPHD LHLD TBCNT SHLD TRSIZ CALL XDSKH JMP LDERR CALL WDSK JMP LDERR RET * * LDERR CALL OUST DB CR,LF ASC "Error while writing to data disk" DB CR,LF ASC "use erase before a retry" DB CR,LF DB 0 JMP DRRET * PAGE * * ******************************************* * * * * * THESE TABLES DESCRIBE THE MODULES TO BE LOADED * * * BOOTLOAD * BOLEN EQU 333H THREE SECTORS WORTH * LBOO DB DABOS SECTOR DB DABOT TRACK DW 380H LENGTH DW IDBOT ID DW BOOT ADDRESS DB 0 UNIT * LBOOH DW EOFCD+BOCNT FORE DW BOFCD BACK DW IDBOT ID DB 0 PROTECTION * * THIS IS THE DATA DISK BOOTLOAD * BOOT DW 032AH DW 4 HLT HLT HLT HLT * ****************** * * * SYSTEM GLOBAL * LNSPA EQU 268H LENGTH OF GLOBAL SP1 EQU 09AE2H FIRST ADDRESS OF GLOBAL * LSGL DB DASPS SECTOR DB DASPT TRACK DW LNSPA COUNT DW IDSPA ID DW SP1 MEMORY ADDRESS DB 0 UNIT * LSGLH DW LNSPA+EOFCD DW BOFCD BACK DW IDSPA ID DB 0 PROT. * ****************** * * * NEXT ID FILE * LNIF DB DANIS SECTOR DB DANIT TRACK DW NIDBC COUNT DW IDNID ID DW LIDBF ADDRESS DB 0 UNIT * LNIFH DW EOFCD+NIDBC FORE DW BOFCD BACK DW IDNID ID DB 0 PROT. * ****************** * * * FSM * LFSM DB DAFSS SECTOR DB DAFST TRACK DW 77+77 LENGTH DW IDFSM ID DW FMBF ADDR DB 0 UNIT * LFSMH DW EOFCD+77+77 FORE DW BOFCD BACK DW IDFSM ID DB 0 PROTECT * ****************** * * * DIRECTORY SECTOR 0 * LDS0 DB DIRDS SECTOR DB DIRDT TRACK DW SECTSZ SIZE DW IDDIR ID DW DS0 ADDRESS DB 0 UNIT * LDS0H DB DIRDS+1 FORE DB DIRDT POINTER DW BOFCD BACK POINTER DW IDDIR ID DB 0 PROT. * ****************** * * * DIRECTORY SECTORS 1 TO 15 * LDS1 DB DIRDS+1 SECTOR DB DIRDT TRACK DW SECTSZ SIZE DW IDDIR ID DW DS1 ADDRESS DB 0 UNIT * LDS1H DB DIRDS+2 FORE DB DIRDT POINTER DB DIRDS BACK DB DIRDT POINTER DW IDDIR ID DB 0 UNIT * ******************************************* * * * * INITIAL DIRECTORY * * FIRST SECTOR * * DS0 DB 5 NUMBER OF ENTRIES DB DS0N-DS0 NEXT ENTRY DISPLACEMENT * ASC 'DIRECTRY' DB BNTYP TYPE DW SECTSZ BLOCK SIZE DB PKIL+PWRI+PFINF+PATR+PNAT DW IDDIR ID DW 0 INDEX FILE POINTER DB DIRDS DISK DB DIRDT ADDRESS DW DICNT BLOCK COUNT DB 'P' * ASC 'NEXTID' DB 0 DB 0 DB BNTYP TYPE DW NIDBC BLOCK SIZE DB PKIL+PWRI+PATR+PNAT+PFINF DW IDNID ID DW 0 INDEX DB DANIS FBA DB DANIT DW 1 BLOCK COUNT DB 'T' * ASC 'FSMAP' DB 0 DB 0 DB 0 DB BNTYP TYPE DW 77+77 BLOCK SIZE DB PKIL+PWRI+PATR+PNAT+PFINF DW IDFSM ID DW 0 INDEX DB DAFSS DA DB DAFST DW 1 BLOCK COUNT DB 'C' * ASC 'BOOTLOAD' DB SYSIM TYPE DW 380H BLOCK SIZE DB PKIL+PWRI+PATR+PNAT+PFINF DW IDBOT ID DW 0 INDEX DB DABOS DISK DB DABOT ADDRESS DW 1 BLOCK COUNT DB 'O' * ASC 'SYSGLOBL' DB BNTYP TYPE DW LNSPA BLOCK SIZE DB PKIL+PWRI+PATR+PNAT+PFINF DW IDSPA ID DW 0 INDEX DB DASPS DISK DB DASPT ADDRESS DW 1 BLOCK COUNT DS0L DB 'R' * * DS0N EQU DS0L+1 DISPLACEMENT TO NEXT ENTRY * * * * IMAGE OF REMAINDER OF DIRECTORY SECTORS * * DS1 DB 0 NUMBER OF ENTRIES DB 2 NEXT ENTRY DISPLACEMENT DW 0 * STBUF ASC '(C) 1978 Processor Technology Corp' DB CR,LF ASC 'This is a system created DATA DISK DB CR,LF ASC 'All rights to code on this disk which is provided ASC ' by Processor Technology Corp are reserved by ASC ' Processor Technology Corp. * * * NEXT ID FILE IMAGE * LIDBF DW 15H NEXT FILE ID. * * * TEMP STORAGE FOR LOADER * * LDCNT DB 0 DIRECTORY ENTRY COUNTER UPFLG DB 1 * * * THIS IS THE FREE SPACE MAP FOR THE DATA DISK * FMBF EQU $ BEGINNING OF 77+77 BUFFER * DB 1FH,255,255,0F8H,255,255,255,255,255,255,255,255 DB 255,255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,0,0,3FH,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,255,255,255,255,255,255,255,255,255,255,255 DB 255,255,255 DB 255,255,255,255,255,255,255,255,255,255 * PAGE * * * * * STANDARD HEADER * * STDHD DW 0 FOR SECTOR AND TRACK STFOR DW 32768 FIRST SECTOR eg. NONE BEFORE STBAK DW 65535 LAST SECTOR eg. NONE AFTER STFID DW 0 ZERO = NO FILE STPRO DB 1 PROTECT STATUS & NUMBER OF SECTORS STSIZ DW 256 BLOCK SIZE TSSPR DW 'TP' P.T. OF COURSE * * * * SYSTEM PARAMETER AND GLOBAL AREA * OFNUM DB 0 SYSTEM OUTPUT FILE NUMBER DTUNT DB 0 SYSTEM DEFAULT UNIT NUMBER * * THE FOLLOWING THREE ENTRIES MUST REMAIN IN THE * SAME RELATIVE POSITION TO EACH OTHER * OTUNT DB 0 OUTPUT UNIT INUNT DB 0 INPUT UNIT MXUNT DB 0 MAXIMUM ALLOWABLE UNIT * OPFLG DB 0 OPTIONS SELECTED FLAG WAFLG DB 0 WAIT FLAG FMONL DB 0 FORMAT ONLY FLAG VEONL DB 0 VERIFY ONLY FLAG ERFLG DB 0 INITIALIZE ONLY FLAG DELMT DB 0 DELIMITER TBUFP DW TKBUF TRACK BUFFER POINTER IBEND DW 0 TKBUF END OBEND DW 0 VEBUF END CBUFP DW 0 ADDRESS OF CURRENT TRACK BUFFER * * * UNIT AND TRACK COUNT KEEPER * RUNIT DB 0DFH MAXZT DB 7 CUNIT DB 0 CTRCK DB 0 UNTAB DW 0 DW 0 * * * DISK DRIVER PARAMETERS * DTRIES DB 0 DSECN DB 0 DNERR DB 0 DTERR DB 0 DRLEN DW 0 DOPER DB 0 * * * * TRANSFER DESCRIPTOR * TDAD EQU $ * TTSEC DB 0 SECTOR TETRK DB 0 TRACK TBCNT DW 0 BYTE COUNT TFID DW 0 FILE ID TBUF DW 0 BUFFER ADDRESS TUNIT DB 0 UNIT * * * * WRITE HEADER FROM HERE * TRBUF EQU $ * TRSEC DB 0 TRTRK DB 0 TRFOR DW 0 TRBAK DW 0 TRFID DW 0 TRPRO DB 0 TRSIZ DW 0 SPARE DW 'TP' TWO BYTES FOR EXPANSION * * * * FORMAT HEADERS ARE READ TO HERE * TXBUF EQU $ * TXSEC DB 0 TXTRK DB 0 TXFOR DW 0 TXBAK DW 0 TXFID DW 0 TXPRO DB 0 TXSIZ DW 0 TXSPR DW 0 * * INCOMMING HEADER BUFFER * IHEAD EQU $ * IHSEC DB 0 IHTRK DB 0 IHFOR DW 0 IHBAK DW 0 IHFID DW 0 IHPRO DB 0 IHSIZ DW 0 IHSPR DW 0 * * * OUTGOING HEADER * OHEAD EQU $ * OHSEC DB 0 OHTRK DB 0 OHFOR DW 0 OHBAK DW 0 OHFID DW 0 OHPRO DB 0 OHSIZ DW 0 OHSPR DW 0 * *********************** * * * * SYSTEM BUFFER FOR PSCAN * NBPTR DS 20 * * * THEN THE STACK * DS 60 FOR THE STACK * STACK EQU $ * * * * THE TRACK IS WOUND AND UNWOUND TO THIS BUFFER * HEADR EQU 13*4 FOUR HEADERS MXTRK EQU 4095+380H MAXIMUM DATA MARKR EQU 4 NUMBER OF MARKERS TKBUF DS HEADR+MXTRK+MARKR MAX SIZE OF IT VEBUF DS HEADR+MXTRK+MARKR VERIFY BUFFER * PGEND EQU $ WE NEED THIS MUCH MEMORY * PAGE * * ******************************************* * * * ORG TKBUF * * * * START UP AND SCAN THE OPTIONS * * NOTE !!!! * * THIS CODE GETS EATEN AFTER THE OPTIONS TEST * * * GET THE SYSTEM STUFF * CSTRT LHLD SYSGLO GET GLOBAL AREA LXI D,GLUNI DAD D MOV A,M STA DTUNT DEFAULT UNIT FOR CHECK LATER * * * GET FIRST UNIT (REQUIRED) * GUNT1 CALL FUNGT CALL GET UNIT ONLY CC ER1 UNIT SPEC OUT OF RANGE CZ ER0 NO PARAMS GIVEN * STA INUNT THIS IS THE IN-UNIT STA OTUNT JUST IN CASE ONLY ONE UNIT IS SPECIFIED CALL DLMCK CHECK IF ONLY ONE UNIT CZ ER2 NO OPTIONS ERROR * * TEST FOR SECOND UNIT (OPTIONAL) * CALL FUNGT GET NEXT UNIT IF ANY JNC GUNT2 BRANCH IF THERE WAS * LDA NBPTR GET FIRST CHR FROM BUFFER CPI 'a' JC SGET CPI 'z' JNC SGET XRI 20H UPSHIFT FOR LOWER CASE SGET CPI 'S' SET OPTIONS? JZ OPNTN NO SECOND UNIT....START OPTIONS CALL ER2 BAD OPTION PARAMETER, UNIDENTIFIED * * GUNT2 STA OTUNT SAVE AS THE OUTPUT UNIT * * * SCAN FOR OPTIONS IF ANY * OPNGT CALL FLMCK FALLS THROUGH IF NO OPTIONS MVI A,PSOPT READ THEM ALL IN LXI D,NBPTR CALL PSCAN STA DELMT SAVE THE DELIMITER CC ER7 PSCAN ERROR JZ OPNGT NO CHRS IN BUFFER * OPNTN LXI H,NBPTR POINT TO START OF BUFFER MOV A,M GET FIRST CHR FROM BUFFER CPI 'a' JC OPNT0 CPI 'z' JNC OPNT0 XRI 20H OPNT0 PUSH PSW SAVE FOR LATER * OPN1A ORA A HAVE WE REACHED THE DELIMITER? CZ ER8 BAD OPTIONS CPI '=' SCAN PAST EQUALS INX H MOV A,M GET NEXT CHR JNZ OPN1A * * PROCESS THE LOT OF THEM * POP PSW GET BACK FIRST CHR CPI 'S' SWITCH? CNZ ER2 NOPE LDA OPFLG GET OPTION PROCESSED FLAG ORA A CNZ ER3 ALREADY PROCESSED THE OPTIONS INR A STA OPFLG SET OPTIONS PROCESSED * * PROCESS S="F","V" AND "-W" TYPES * SOPNT MOV A,M GET NEXT CHR CPI 'a' JC SOPNX CPI 'z'+1 JNC SOPNX XRI 20H UPSHIFT ASCII * SOPNX INX H BUMP THE POINTER CPI 'F' JZ SEFMT SET FORMAT ONLY CPI 'V' JZ SEVRF SET VERIFY ONLY CPI 'I' JZ SEERA SET INITIALIZE ONLY #### ORA A JZ OPNGT NOW GO BACK CPI '+' PLUS SIGN? JZ SOPNT CPI '-' CNZ ER2 BAD OPTION IDENT * * PROCESS THE CHR FOLLOWING THE MINUS SIGN * MOV A,M GET IT CPI 'W' JZ SWAIN CPI 'w' CNZ ER2 WRONG FOLLOWING PARAMETER SWAIN INX H STA WAFLG SET NO WAIT FLAG JMP SOPNT * SEFMT STA FMONL FORMAT ONLY JMP SOPNT * SEVRF STA VEONL VERIFY ONLY JMP SOPNT * SEERA STA ERFLG INITIALIZE #### JMP SOPNT * * *************************** * * * * GET UNIT NUMBER FROM PSCAN * FUNGT LXI D,NBPTR MVI A,PSOPT SCAN OPTIONS ONLY CALL PSCAN DO THE SCAN STA DELMT SAVE THE DELIMITER CC ER7 ERROR? RZ . NO CHRS WERE GIVEN * LXI H,NBPTR MOV A,M GET FIRST CHR CPI '/' JNZ FUNG1 DEFAULT TO ACTUAL UNIT NUMBER INX H SKIP OVER THE SLASH * FUNG1 MOV A,M GET CHR SUI '0' REMOVE BIAS RC . TOO SMALL CPI 8 TOO BIG? CMC RET . TEST IN HAND * * * CHECK FOR CR OR ; DELIMITER * DLMCK LDA DELMT GET DELIMITER CPI 0DH RZ . CPI ';' RET * * * CHECK FOR CR OR ; AND TERMINATE SCAN IF RECEIVED * FLMCK CALL DLMCK RNZ . WASN'T THE RIGHT ONE JMP COPY1 * * ERROR HANDLING * ER0 LXI H,MES0 MESG MOV A,M ORA A JZ DRRET CALL CONOUT INX H JMP MESG * ER1 LXI H,MES1 JMP MESG ER2 LXI H,MES2 JMP MESG ER3 LXI H,MES3 JMP MESG ER4 LXI H,MES4 JMP MESG ER5 LXI H,MES5 JMP MESG ER7 LXI H,MES7 JMP MESG ER8 LXI H,MES8 JMP MESG ER9 LXI H,MES9 JMP MESG ER10 LXI H,MES10 JMP MESG * * MES0 ASC "Unit parameter required" DB 0 MES1 ASC "Unit out of range" DB 0 MES2 ASC "Error in command syntax" DB CR,LF ASC "DISKCOPY fromunit{,tounit}{,S=options} DB CR,LF ASC 'options = V Verify disk(s) DB CR ASC ' I Initialize disk DB CR ASC ' F Generate a data disk DB CR ASC " -W Do not wait for carriage return DB 0 MES3 ASC "Options specified twice" DB 0 MES4 ASC "Default unit specified for output" DB 0 MES5 ASC "Unit 0 specified for output" DB 0 MES7 ASC "System scan error DB 0 MES8 ASC "Options expected '='" DB 0 MES9 ASC "System locked" DB 0 MES10 ASC "In and Out units can't be the same" DB 0 *