IMD 1.16: 31/08/2008 23:28:17 93064-01e0 f06401 mass binary dump/verify program source diskette 3/14/79    @0|)v1uo)  " }jA cMZOS4 MOS790314140030OS790314140030 790314140030F06401    ZZM@jjggg@ o G`k򞽢_C# b# }B u[ ]e JRiCp@=<; G9P@ G=y;<": 06OS:: SYS ϣÈ̿: 8 4/+*' %ɣ 㯀: ÓG! R# J{4RgVUy!l "#C @Hǩ@N2@ TITL **********M B D P ********** TITL REL 0 MBDPS EQU $ START MBDP XA EQU :6 SBIT XA,S MAIN EQU $ JMP CRTINP OBTAIN ERROR FREE USER INPUT DATA INPRC EQU $ JST INPROC SET UP BOOT AND DRIVER POINTERS & CTRL BLK JST DUMP DUMP BOOTSTRAP & USER DATA TO DISK JST VERIFY VERIFY DUMP (COMPARE WITH MEMORY) JMP MAIN LPOOL TITL C R T I N P D I S K I N P U T P A R A M E T E R S CRTINP EQU $ PROMP EQU PROMPT-THISAD SUB Q,Q  INITIALIZE COPY Q,TEMP COPY Q,AFLAG JST $+1 THISAD WORD 0 COPY $-1,Y  COPY =PROMP,X ADD X,Y COPY =:18,Q JST MESOUT OUTPUT USER PROMPT JST CRLF COPY ='*',A INPUT PROMPT * JST TYPCRT OUTPUT * * DISCOD EQU $ JST RKB  GET THE D OR M COPY =:D,Q CSN A,Q A CR ON FIRST INPUT IS ERROR OR DONE JMP  TRFLAG JMP TYPDSK TRFLAG COPY CRFLAG,A COPY =0,Q CSN A,Q JMP RUNERR   JMP INPRC RETURN CRFLAG WORD 0 (0,IF NO PREVIOUS EXECUTION, THIS SESSION) * RUNERR EQU $  COPY =8,Y * JMP ERRS TITL DTYPE WORD 0 DISK TYPE (0-FLOPPY) (1-MINE-FLOPPY) * TYPDSK COPY  =0,X BYTE CT IS -20 COPY =1,Y MINI FLOPPY COPY ='M',Q IS IT 'M' CSN A,Q JMP DISK YES,'M'-- GET DISK TYPE, DTYPE TO 1 COPY ='D',Q NOT 'M' CSN A,Q  IS IT A "D" JMP DISK1 YES SET DTYPE TO ZERO JMP DISKER A DISK ERROR-- NEITHER 'M' OR 'Q' DISK1 COPY X,Y SET DTYPE TO ZERO (FLOPPY) DISK COPY Y,DTYPE * FLOG EQU $ JST RKB GET THE F COPY ='F',Y CSN A,Y JMP NDRIVE * JMP SYNERR LPOOL  TITL DN WORD 0 DRIVE # (0-4) UN WORD 0 DRIVE # 0/2 & UNIT 0 OR DRIVE # 1/3 & UN 1 * NDRIVE EQU $ JST RKB GET THE DRIVE NO SUB =:30,A CONVERT ASCII VALUE TO CHARACTER JLT A,DISKER GO TO ERROR IF ILLEGAL CHARACTER COPY A,DN SAVE IT IN DRIVE NUMBER SUB  =:3,A JGT A,DISKER IT IS ERROR IF BIGGER THAN 3 NCHAC EQU $ SUB Q,Q COPY Q,TEMP  CLEAR TEMP LOCATION FOR INPUT JST RKB GET ONE CHARACTER INPUT COPY =',',Q COMMA CHECK  CSN A,Q JMP LOCCHK YES, GO TO GET MORE INPUT JMP SYNERR NO, IT'S ERROR * DISKER EQU $  COPY =0,Y JMP ERRS LPOOL TITL C R T I N P L O C A T I O N I N P U T P A R A M E T . FINGER EQU PNTR-THISAD TTSIZE EQU MBDPE-MBDPS+63 TOTAL MEMORY LOCATIONS NEEDED BY PROGRAM LOCCHK EQU $ JST RKB GET THE ADDRESS DIGIT COPY THISAD,Y COPY =FINGER,X ADD X,Y COPY A,0(Y) SAVE INPUT DATA INTO PNTR * COPY =',',Q COMMA CHECK CSN A,Q JMP SFLB9 IT IS COMMA, GO TO STORE DATA COPY =:D,Q CARRIAGE RETURN CHECK CSN A,Q JMP SFLB9 IT'S CR. GO TO STORE DATA AHEX SUB =:3A,A CHECK FOR ILLEGAL INPUT JLT A,ADD10 IT'S NUMERIC, GO TO SAVE IT  SUB =:7,A CHECK FOR HEX INPUT JLT A,JSYN IT IS NOT HEX CODE COPY A,Q COPY DATA INTO Q REG SUB =:7,Q IS DATA ILLEGAL LETTER? JGE Q,JSYN GO TO ERROR * ADD10 ADD =:A,A  CONVERT CHARACER INTO VALUE JLT A,JSYN INVALID CHARACTER, GO TO ERROR COPY TEMP,Q COPY TEMP INTO Q REG SHIFT Q,L,4 SHIFT IT 1 BYTE LEFT ADD A,Q ADD THE LAST INPUT INTO Q COPY Q,TEMP  SAVE IT BACK INTO TEMP JMP LOCCHK GO BACK TO GET MORE INPUT TEMP WORD 0 TEMPORARY STORE LOCATION FOR LOCATION CONC PNTR BYTE 'LR' TITL ADDERR EQU $ COPY =1,Y 'OUT OF RANGE' JMP ERRS JUMP TO ERROR ROUTINE JSYN EQU $ SYNERR EQU $ COPY =3,Y 'SYNTAX ERROR' JMP ERRS JUMP TO  ERROR ROUTINE * AFLAG WORD 0 ADDRESS INPUT FLAG FLB9 WORD 0 START LOC USER DATA (INPUT) * SFLB9  EQU $ STORE STARTING ADDRESS COPY AFLAG,Y COPY ADDRESS INPUT FLAG INTO Y COPY =1,X LET X EQUAL TO 1 ADD X,Y INCREMENT Y REG BY 1 COPY Y,AFLAG SAVE Y BACK INTO ADDRESS INPUT FLAG  CSN X,Y COMPARE Y REG WITH 1 JMP SFLB90 IT IS STARTING ADDRESS JMP SFLB15 INPUT MUST BE EITHER ENDING ADDRESS OR TRANSFER ADDR. * SFLB90 COPY TEMP,Q SAVE DATA IN TEMP INTO PERMANENT LOC. COPY  Q,FLB9 COPY =0,Q CLEAR TEMPARARY LOC COPY Q,TEMP JMP LOCCHK LPOOL TITL FLB14 WORD 0 TRANSFER LOC AFTER AUTOLOAD & BOOT FLB15 WORD 0 END LOC USER DATA ( INPUT) FLB8 WORD 0 LENGTH OF USER DATA TFLAG WORD 0 TRANSFER ADDRESS FLAG * SFLB15 EQU $ COPY =2,X  ADDRESS INPUT FLAG=2 MEANS INPUT IS ENDING ADDR CSN X,Y COMPARE Y WITH 2 JMP SFLB1 IT IS ENDING ADDRESS, GO TO SAVE IT JMP SFLB14 IT'S TRANSFER ADDRESS * SFLB1 COPY TEMP,Q SAVE THE DATA IN TEMP  COPY Q,FLB15 INTO PERMANENT LOC COPY =0,Q CLEAR THE TEMP LOC COPY Q,TEMP * COPY A,TFLAG CLEAR THE TRANSFER ADDRESS FLAG COPY FLB15,Q COPY END LOC INTO Q COPY FLB9,A  COPY START LOC INTO A JST OUTLIM CHECK IF END LOC IS BIGGER THEN START * SUB A,Q SUBTRACT END LOC TO START LOC ADD =1,Q ADD 1 TO IT FOR START LOC COPY Q,FLB8 BECOMES THE LENGTH OF USER'S DATA * COPY THISAD,Y COPY =FINGER,X ADD X,Y COPY 0(Y),A GET THE LAST INPUT CHARACTER COPY =',',Q CHECK IF THAT IS COMMA CSN A,Q JMP LOCCHK YES, GO BACK TO GET TRANSFER ADDRESS JMP SETDSK A CR -- WE ARE DONE TITL SFLB14 EQU $ COPY TEMP,Q STORE TRANSFER ADDRESS INTO COPY Q,FLB14 PERMANENT LOCATION COPY =0,Q COPY Q,TEMP CLEAR TEMP COPY =1,A COPY A,TFLAG SET TRANSFER FLAG TO 1 JMP SETDSK END OF INPUT, GO TO INITIATE IOB OUTLIM ENT CSM Q,A Q=END ADDR; A= START ADD JMP ADDERR END ADDR. < START ADDR. GO TO ERROR NOP COPY =:FFBF,X CSM X,Q JMP ADDERR END ADDR. EXCEEDS X ADDR NOP JMP *OUTLIM WE ARE OK ADDRESSES OK-WITHIN RANGE LPOOL TITL C R T I N P C A P A C I T Y C H E C K * LENB WORD 0 LENGTH OF BOOTSTRAP SECLIM WORD 0 SECTORS TO PROCESS * SETDSK EQU $ COPY =1,A FIRST ONE SECTOR FOR BOOT COPY A,SECLIM INITIALIZE NO OF SECT.TO 1 COPY FLB8,Q COPY THE LENGTH OF USER'S DATA INTO Q * SUBSEC SUB =64,Q 1 SECTOR=64 WORDS JLE Q,DCAP SUB 64 WORDS FROM LENGTH OF USER DATA IMS SECLIM INCREMENT NO SECTORS TO PROCESS J MP SUBSEC GO TO SUBTACT AGAIN DCAP COPY DTYPE,X CHECK DISK CAPACITY COPY =0,Y COPY =1976,A FLOPPY DISK CAP IS 26 SECTORS CSN X,Y FLOPPY OR MINI-FLOPPY JMP CMPRIT COPY TO FLOPPY * COPY =560,A MINI-FLOPPY SECTOR CAPACITY IS 35 TRACKS CMPRIT COPY SECLIM,Q SET Q TO NO OF SECT. SUB A,Q MINUS DISK CAPACITY JLE Q,CHKMEM IT IS SAVE,GO TO CKECK MEM. * DISKOV EQU $ COPY =2,Y 'DISK CAPACITY EXCEEDED' JMP ERRS LPOOL TITL CHKMEM EQU $ COPY FLB8,A COPY LENGTH OF USER DATA INTO A ADD =TTSIZE,A ADD LENGTH OF MBDP JT CY,MEMOV WHEN CARRY BIT SET ON MEANS MEM. OV * COPY =1,A SET CARRY FLAG TO ONE COPY A,CRFLAG WHICH MEAN JMP INPRC RETURN * MEMOV EQU $ COPY =9,Y 'MEMORY OVERFLOW(OV)' JMP  ERRS JUMP TO ERROR ROUTINE * * PGMERR EQU $ COPY =10,Y 'PROGRAM ERROR' JMP ERRS JUMP TO ERROR ROUTINE LPOOL TITL C R T I N P S U B R O U T I N E S TITL E0 EQU ERR0-THISAD E1  EQU ERR1-THISAD E2 EQU ERR2-THISAD E3 EQU ERR3-THISAD E4 EQU ERR4-THISAD E5 EQU ERR5-THISAD E6 EQU ERR6-THISAD E7 EQU ERR7-THISAD E8 EQU ERR8-THISAD E9 EQU ERR9-THISAD E10 EQU ERR10-THISAD ER EQU ER0-THISAD * ERRS EQU $ * COPY =ER,Q COPY THE ERROR CODE TO Q COPY THISAD,X ADD Q,X COPY THISAD,Q * WHICH SUB =1,Y JLT Y,JUMP ADD =2,X  JMP WHICH JUMP JMP 0(X) * TITL ER0 COPY =E0,Y JMP PRINTR ER1 COPY =E1,Y  JMP PRINTR ER2 COPY =E2,Y JMP PRINTR ER3 COPY =E3,Y JMP PRINTR ER4 COPY =E4,Y  JMP PRINTR ER5 COPY =E5,Y JMP PRINTR ER6 COPY =E6,Y JMP PRINTR ER7 COPY =E7,Y  JMP PRINTR ER8 COPY =E8,Y JMP PRINTR ER9 COPY =E9,Y JMP PRINTR ER10 COPY =E10,Y * PRINTR ADD Q,Y COPY =1,Q JST MESOUT JMP CRTINP * PROMPT BYTE 'DFN,START,END,XFR(IF ANY)' BYTE '0' ERR0 BYTE 'DE' UNDEFINED DEVICE OR DRIVE NO ERR1 BYTE 'AE' ADDRESS ERROR -- OUT OF RANGE ERR2 BYTE 'DO' DISK OVERFLOW -- DISK CAPACITY EXCEEDED ERR3 BYTE 'SY' SYNTAX ERROR -- GARBAGE INPUT-- ERR4 BYTE 'WP' WRITE PROTECTED--DISK IS WRITE PROTECTED ERR5 BYTE 'NR' NOT READY--DISK IS IMPROPERLY POSITIONED ERR6 BYTE 'IO' I/O--I/O ERROR ERR7 BYTE 'VE' VERIFY ERROR--MISCOMPARE--DISK & MEM DISAG ERR8 BYTE 'RE' RUN FLAG--RUN FLAG IS ZERO UNDEFINED INPUT ERR9 BYTE 'MO' MEMORY OVERFLOW --MPDP+USER+64>65535 ERR10 BYTE 'PE' PROGRAM ERROR LPOOL TITL MESOUT ENT ENTER WITH NO. CHARS TO BE OUTPUT IN Q & STRING LOC Y JST CRLF CRLF SUB X,X CLEAR X OFFSET G ETUM SBIT 2,S COPY 0(X,Y),A GET CHAR IN A REG RBIT 2,S JST TYPCRT OUTPUT TO CRT ADD =1,X INCREMENT MESSAGE LOC POINTER OFFSET JNED Q,GETUM ANYMORE CHARACTERS TO OUTPUT? * * RBIT 2,S DONE--BACK TO WRD MODE JMP *MESOUT RETURN * * REGA WORD 0 REGQ WORD 0 REGX WORD 0 REGY WORD 0 * PUSHEM ENT COPY A,REGA COPY Q,REGQ COPY X,REGX  COPY Y,REGY JMP *PUSHEM * POPEM ENT COPY REGA,A COPY REGQ,Q COPY REGX,X COPY REGY,Y JMP *POPEM * TITL D8612 WORD :8612 (TYPCRT) DIOTY WORD :F8 TTY/CRT DIO ADDR= :F , CHANNEL # =4 RKB SAVEA WORD 0 A SLOT (CRLF) STORE WORD 0 A SLOT (CRLF) SAVES WORD 0 A SLOT(RKB) D8610 WORD :8610 D8618 WORD :8618 START ECHO (RKB) D100 WORD :100 RESET COMMAND WORD (RKB) (TYPCRT) ASV WORD 0 SAVE REG A FOR HEX ROUTINE (HEX) VALU WORD 0 A SLOT (TYPECRT(HEX) CR EQU :D CARRIAGE RETURN LF EQU :A LINE FEED BLANK  EQU :20 BLANK CHAR * CRLF ENT CARRIAGE RET LINE FEED JST PUSHEM COPY A,SAVEA COPY =CR,A CR JST TYPCRT TYPE (TYPCRT) COPY =0,A JST TYPCRT  COPY =0,A EXCH A,STORE CLEAR STORE FLAG & GET OLD ONE JEQ A,$+3 COPY ='*',A  INSERT * IF LAST OPERATION INVOLVED JMP +2 MEMORY ALTERATION COPY =BLANK,A JST TYPCRT TYPE COPY =LF,A LF JST TYPCRT COPY SAVEA,A RESTORE A JST  POPEM JMP *CRLF LPOOL TITL TYPCRT ENT OUTPUT CHAR FROM REG A JST PUSHEM COPY DIOTY,Q GET DIO ADDRESS 8 CHANNEL NO (CRT=:F8) COPY A,VALU STORE VALUE TO BE PRINTED COPY D8612,X START,REQUEST TO SEND, NO INTERRUPT XNX Q Q+OUT X,1 EXECUTED OUT X,1 (INITIALIZE) XNX Q Q+OUT A,0 EXECUTED OUT A,0 SEND A CHAR  COPY D100,X RESET CODE XNX Q IN 1,A INPUT TTY STATUS WORD SHIFT A,RO,5  SHIFT TRANSMITTER BIT IN OV JT OV,$-3 LOOP TILL CHAR IS TRANSMITTED XNX Q IN  1,A INPUT STATUS AGAIN SHIFT A,RO,5 JF OV,$-3 LOOP TILL TTY/CRT READY TO RECEIVE  XNX Q OUT X,1 RESET PICO COPY VALU,A RESTORE VALUE TO BE PRINTED JST POPEM JMP *TYPCRT BACK TO CALLER * LPOOL TITL RKB ENT COPY DIOTY,Q GET INPUT DEVICE ADDR 8 CHANNEL NO CRT=:F8 COPY S,X COPY X,SAVES RBIT 8,S COPY D100,X RESET TTY CODE COPY D8618,A START,ECHO,NO INTERRUPT COMMAND XNX Q OUT A,1 OUTP UT INITIAL CONTROL FUNCTION XNX Q IN 1,A INPUT TTY STATUS CONTROL FUNCTION SHIFT A,RO,4 SHIFT DATA READY BIT IN OV JF OV,$-3 LOOP TILL DATA(1 CHAR IS AVAILABLE) XNX Q  IN 0,A GET A CHARACTER XNX Q OUT X,1 RESET TTY CONTROL FUNCTION AND =:7F,A AND OFF BIT 7 JMP *RKB RETURN TO CALLER WITH INPUT CHARACTER LPOOL TITL  I N P R O C * INPROC ENT * *THIS PROC INITIALIZES THE APPROPRIATE POINTERS AND BOOTSTRAP CONTROL *BLK DEPENDING ON WHETHER DISK IS FLOPPY OR MINI-FLOPPY. DISTINCT HARD- *WARE FOR EACH TYPE REQUIRES SEPARATE DRIVERS & BOOTSTRAPS * FBLOC EQU FBLOCK-THISAD FDRIV EQU FDRIVE-THISAD FLBOO EQU FLBOOT-THISAD DLBB EQU DLB3-THISAD FLT10 EQU FLT100-THISAD MBLOC EQU MBLOCK-THISAD MDRIV EQU MDRIVE-THISAD MBOO EQU MBOOT-THISAD MLBB EQU MLB34-THISAD MLT10 EQU MLT100-THISAD * COPY =0,A COPY A,UN SET THE HEAD OF UNIT TO 0 COPY A,CYLTMP CLEAR THE SECOND RUN SWITCH * COPY THISAD,Y COPY DTYPE,A FLOPPY (DTYPE=0) OR MINI FLOPPY JNE A,MINIT * COPY =DLB16,A COPY THE END LOC OF BOOT COPY A,ENDBOT INTO TEMP LOCATION COPY =FBLOC,A ADD Y,A COPY A,SETBLK * COPY =FDRIV,A ADD Y,A COPY A,DISKIO *  COPY =FLBOO,A ADD Y,A COPY A,FLBTAD * COPY =DLBB,A ADD Y,A COPY A,IOB COPY =9,A INITIAL BOOT CTRL BLK FOR SEEK -- COPY FLB9,Q SO WE DON'T HAVE TO DO IT IN THE BOOTSTRAP COPY SECLIM,X JST FBLOCK DO IT. * COPY =0,A INIT BOOT UNIT # TO 0  COPY A,DLB4 COPY =3,A SET FLOPPY BOOT SECT. START TO 3 COPY A,DLB7 COPY =64,A  SET THE WORD COUNT IN BOOT INTO 64 (=:40) COPY A,DLB8 * COPY FLB14,A TRANSFER ADDR COPY A,DLB14 * COPY FLB15,A GET RELOCATED BOOT START ADD =:41,A COPY A,DLB16 * * COPY TFLAG,A TRANSFER FLAG COPY A,DLB15 * COPY =FLT10,A COPY THISAD,Y ADD Y,A COPY A,IOB * JMP FMINIT LPOOL TITL * MINIT COPY =MBLOC,A ADD Y,A COPY A,SETBLK * * COPY =MDRIV,A ADD Y,A COPY A,DISKIO * COPY =MBOO,A ADD Y,A  COPY A,FLBTAD COPY =START,A STORE THE END LOCATION OF BOOT COPY A,ENDBOT INTO TEMP LOCATION * COPY =MLBB,A COPY THE ADDRESS OF MINI-FLOPPY ADD Y,A DRIVER IOB INTO 'IOB'  COPY A,IOB * TITL COPY =9,A INIT BOOT CTRL BLK OF A READ -- COPY FLB9,Q SO WE DON'T HAVE TO DO IT IN THE BOOTSTRAP COPY SECLIM,X JST MBLOCK DO IT * SUB X,X COPY  =1,Q COPY IOB,Y * COPY =2,Q SET THE SECTOR NO TO 2 IN MINI-BOOT COPY UN,A SBI T 2,S COPY A,HEA(X,Y) HEAD NO IS ALWAYS 0 COPY Q,SECT(X,Y) RBIT 2,S * COPY =:40,A  SET BOOTSTRAP SO THAT IT CAN BRING COPY A,BEGLOC(Y) IN SECOND SECTOR OF THE BOOT. * COPY FLB9,A  COPY THE STARTING LOCATION COPY A,START TO TEMP FOR BOOT TO USE * COPY FLB14,A TRANSF LOC  COPY A,MLB13 * COPY FLB15,A ADD =:41,A COPY A,UPMLB SAVE THE LOCATION OF RELOCATED BOOT * COPY TFLAG,A TRANSFER FLAG NEG A,A COPY A,MLB9 * COPY =MLT10,A  COPY THISAD,Y ADD Y,A COPY A,IOB * COPY IOB,Y SET Y REG TO IOB OF MINI-FLOPPY  COPY DN,X THE DRIVE NO COPY UN,A COPY HEAD NO TO A REG SBIT 2,S COPY X,DRIV(Y) COPY A,HEA(Y) HEAD NO IS ALWAYS 0 RBIT 2,S TITL * FMINIT COPY FLBTAD,A VERIFY PARAMETERS  COPY A,FLRMEM FIRST MEMORY POINTER (BOOT) * COPY =BUFF,A SET THE BUFF ADDRESS COPY A,FLRCMP * COPY =-64,A WORD COUNTER COPY A,FLRCNT * JMP *INPROC * IOB WORD 0  DRIVER CTRL BLK LOC * FLRMEM WORD 0 CURRENT LOC IN MEM BEING COMPARED TO BUFFR FLRCMP WORD 0  START OF COMPARE BUFFER(LAST USER LOC+Y) FLRCNT WORD -64 CURRENT COUNT OF WORDS OFF DISK,MATCH MEM FLBTAD WORD 0 LOC BOOT, ITSELF ENDBOT WORD 0 THE END LOCATION OF BOOTSTRAP * * LPOOL TITL D U M P * *THIS ROUTINE DUMPS THE BOOTSTRAP,FOLLOWED BY THE USER DATA *****PARAMETERS FLBTAD,SETBLK AND DISKIO CONTAIN PREVIOUSLY INITIALIZED *****POINTERS TO BOOTSTRAP AND CTRL BLK INIT.ROUTINE & DRIVERS ALL SET * DUMP ENT COPY =9,A  SET UP SEEK OP CODE COPY =0,Q SET START LOC TO ZERO COPY =1,X SECTORS TO PROCESS IS 1 JST *SETBLK INITIALIZE THE CONTROL BLOCK JST *DISKIO DO THE SEEK AND RESTORE * COPY =1,X COPY X,NUMSEC(Y) INITIALIZE NO OF SECTOR TO 1 COPY =3,A SET UP CONTROL BLOCK TO DUMP BOOT (WRITE) COPY FLBTAD,Q START LOC BOOT IN FLBTAD COPY =2,X SECTORS TO PROCESS IS 2  JST *SETBLK SET UP THE CONTROL BLOCK--SETBLK HAS DR AD JST *DISKIO DUMP THE BOOT -- DISKIO CONTAINS DRIVER AD * COPY =3,A SET UP CONTROL BLOCK TO DUMP USER DATA COPY FLB9,Q START USER DATA  COPY SECLIM,X SECTORS TO PROCESS IS SECLIM JST *SETBLK SET UP CONTROL BLOCK PER SETBLK  JST *DISKIO DUMP USER DATA * JMP *DUMP RETURN LPOOL * DISKIO WORD 0 LOC DRIVER, ITSELF SETBLK WORD 0 LOC CTRL BLK INIT ROUTINE * TITL F L O P P Y B O O T S T R A P * *THIS IS THE FLOPPY DISK BOOT STRAP. IT SETS UP THE TRAP FOR MEMORY *OVERFLOW, RELOCATES THE BOOT-- THE BOOT THEN PULLS IN THE USER DATA * *FLOPPY DIST BOOTGSTRAP CONTROL BLOCK OFFSETS * OFF1 EQU SECOUT-DLB20 TRANS EQU 11 FLGT EQU 12 FLBLEN   EQU DLB16-SECOUT * FLBOOT EQU $ COPY QUITIT,A * SBIT XA,S COPY A,*DLB20 * JST $+1 DLB20 WORD :86 COPY $-1,Y THIS ADDRESS IN Y COPY =OFF1,Q ADD Q,Y  AUTOLOAD LOCATION OF SECOUT--BOOT DRIVER * COPY DLB16,X USER LWA+1--START OF BOOT DRIVER COPY =FLBLEN,A * FETCH COPY 0(Y),Q SOURCE WORD FROM Y LOC INTO Q COPY Q,0(X) SOURCE WORD FROM Y LOC INTO X DESTINATION JNED A,NEXTUN DECREM BOOT LENGTH IN A & SET UP GET WRD JMP *0(Y) H84 WORD :84 * NEXTUN ADD =1,Y INC SOURCE LOC. WRD TO BE MOVED COPY X,*H84 BLOW UP ADDRESS IN TRAP ADD  =1,X INC DEST LOC(WRD TO BE MOVED INTO) JMP FETCH GET NEXT WORD TITL * *THE FLOPPY BOOTSTRAP WHICH PULLS IN USER DATA FROM DISK * DA EQU :88 DEVICE ADDR :11 SHIFTED L 3 BITS * SECOUT EQU $ SUB  =:D,X COPY X,Y * SELP A,DA+4 INI.CONTROLLER(IGNORE A REG) COPY =2,A SET REL SEEK TO 2 COPY A,DLB6 MOVE THE HEAD INTO DISK JST IOBST DO SEEK COPY =-80,A RESTORE REL SEEK COUNT TO 80 COPY A,DLB6 AND DO IT AGAIN JST IOBST JST STATU DO THE STATUS CHECK COPY =0,A RESET REL SEEK TO 0 COPY A,DLB6 COPY =7,Q SET THE OP CODE TO READ COPY Q,DLB3 * REAFLP EQU $ JST IOBST DO I/O JST STATU DO THE STATUS CHECK * NULOC COPY DLB9,A COMPUTE AND SAVE NEW STARTING LOC ADD =64,A COPY A,DLB9 SUB A,A COPY A,DLB6 * DLB211 IMS DLB7 INCERMENT SECTOR COUNT COPY DLB7,A COPY =27,Q  TEST SECTOR CSN A,Q JMP NUCYL NEXT CYL * MORE IMS DLB13 ARE WE DONE? JMP  REAFLP * FLAGTS COPY FLGT(Y),A TEST THE TRANSFER FLAG JEQ A,QUITIT JMP *TRANS(Y) * NUCYL IMS DLB5 INCREMENT CYLINDER NUMBER COPY =1,A COPY A,DLB7 SET SECTORS BACK TO 1 COPY A,DLB6 COPY DLB3,Q SAVE THE CURRENT OP CODE COPY =9,A COPY A,DLB3 SET OP CODE TO SEEK(=9) JST IOBST DO SEEK NEXT CYLINDER COPY =0,A RESET REL SEEK TO 0 COPY A,DLB6 COPY Q,DLB3 STORE BACK THE OLD OP CODE JMP MORE * STATU ENT THIS ROUTINE CHECKS THE STATUS OF HARDWARE COPY =:FF,A DONE--TEST STATUS WITH :FF AND DLB12,A MASK OFF UPPER BYTE OF STATUS JEQ A,STATEN IF :FF AND STATUS IS ZERO CONTINUE QUITIT HLT OOPS WE HAVE AN ERROR STATEN JMP *STATU * IOBST ENT DLB2 SST DA+0 BUSY?? JMP DLB2 YES--TRY AGAIN * WRDOUT EQU $ OUT Y,DA READ IN THE SECTOR, PER CTRL BLK * DLB23 SST DA+0 DONE? JMP DLB23 NO -- TEST AGAIN ENDIO JMP *IOBST DONE I/O PROCESSING * DLB3 WORD 7 OP CODE DLB4 WO RD 0 UNIT # (0 OR 1) DLB5 WORD 0 CYL NO DLB6 WORD 0 REL SEEK CT DLB7 WORD 3 SECTOR NO. DLB8 WORD 64 WORD COUNT DLB9 WORD 0 START LOC TO READ IN DATA DLB10 WORD 0 INTERRUPT DLB11 WORD 0 NO WRDS PROCESSED DLB12 WORD 0 STATUS DLB13  WORD 0 SECTORS TO PROCESS DLB14 WORD 0 TRANSFER ADDRESS DLB15 WORD 0 TRANSFER FLAG (0 OR 1) DLB16 WORD 0 USER LWA+41--START RELOCATED BOOT DRIVER TITL V E R I F Y * *THE VERIFY PROCEDURE WILL CAUSE ONE SECTOR AT A TIME TO BE READ FROM *DISK INTO SECTOR MEMORY, JUST ABOVE USER DATA,AND COMPARED WORD FOR *WORD WITH CORRESPONDING MEMORY LOCATIONS * VERIFY ENT COPY =9,A SET UP FOR SEEK COPY =0,Q  START ADDR SEEK 0 COPY =1,X SECTORS TO PROCESS IS 1 JST *SETBLK INITIALIZE CONTROL BLOCK FOR SEEK JST *DISKIO DO IT -- GET DISK HEAD ON CYL 0 * COPY =1,A COPY A,NUMSEC(Y) INITIALIZE NO OF SECTOR TO 1 SUB Q,Q COPY Q,CYLTMP BLKSET COPY =7,A SET UP TO READ BOOT COPY  FLRCMP,Q START ADDR READ INTO DLB15+1 COPY =1,X SECOTRS TO PROCESS IS 1 JST *SETBLK  INIT. CTRL BLK JST *DISKIO DO IT-- READ BOOT OFF DISK COPY =1,A SET SECOND RUN SWITCH TO RONE COPY A,CYLTMP * COPY FLRMEM,X GET MEMORY ADDRESS AND BUFFER ADDRESS IN COPY FLRCMP,Y  X AND Y CMPWRD COPY 0(X),Q GET ACTUAL MEMORY WORD IN Q COPY 0(Y),A GET ACTUAL BUFFER WORD IN Y  CSN A,Q DOES MEMORY AGREE WITH BUFFER JMP BUMPIT YES,THEY ARE EQUAL. GET NEXT WORDS *  JMP VERERR OOPS THEY ARE NOT EQUAL --ERROR * BUMPIT ADD =1,X ADD =1,Y COPY =MBDPS,Q  COPY THE START ADDRESS OF MBDP TO A REG COPY X,A CSK A,Q JMP INCRES WE ARE IN THE USER DATA JMP UDATA YES, REINIT MEMORY COMPARE POINTER JMP *VERIFY DONE -- BACK TO MAIN PROGRAM * INCRES EQU $ IMS FLRCNT INCREMENT WRD CNTR JMP CMPWRD WRD CTR ZERO--DONE WITH THIS SECTOR * NOT DONE YET--COMPARE THESE WORDS NEXSEC COPY =-64,A REINITIALIZE WRD CTR TO -64 FOR NEXT SECTR COPY A,FLRCNT COPY X,FLRMEM SET MEMORY POINTER TO LAST COMPARE LOCATION JMP  BLKSET NOT DONE GET NEXT BLK * UDATA EQU $ COPY ENDBOT,Q IS IT END OF BOOTSTRAP? CSN X,Q JMP $+2 JMP INCRES NOT DONE WITH BOOTSTRAP COPY FLB9,X JMP NEXSEC REINIT CTRL BLK $ READ IN NEXT SECTOR * CYLTMP WORD 0 * VERERR EQU $ COPY =7,Y JMP ERRS * LPOOL  TITL F B L O C K * * THIS ROUTINE INITIALIZES THE CONTROL BLOCKS FOR THE I/O DRIVER AND * BOOTSTRAP ROUTINE FOR FLOPPY DISK ***** SETBLK CONTAINS FBLOCKS ADDRESS. FBLOCK IS CALLED WITH OPCODE IN ***** A REG. AND STARTING LOC. IN Q REG (0,FLBTAD O  R FLB9) ***** Y REG WITH SECTORS TO PROCESS (0,1,SECLIM FOR SEEK,BOOT,USER PROC) * FBLOCK ENT * COPY IOB,Y GET START OF BLOCK IN Y REG * COPY A,OPERAT(Y) SET OP CODE IN REGISTER A COPY Q,USTART(Y) INITIALIZE STARTING ADDRESS * NEG X,X NEGATE AND STORE SECTOR COUNTER COPY X,SCTRP(Y) * COPY DN,A INITIALIZE DRIVE NO. COPY A,NDRIV(Y) * COPY =0,A SET STATUS WORD TO ZERO COPY A,STATIS(Y) COPY A,INHIBI(Y) COPY CYLTMP,A COPY =1,Q CSN A,Q IS IT SECOND RUN  JMP $+3 YES, DON'T RESET CYLINDER NO COPY =0,A COPY A,CYLN(Y) RESET CYLINDER NO -- DISABLE INT * COPY OPERAT(Y),A COPY =9,X CSN A,X JMP SETSK THIS IS A SEEK OPERATION- OP CODE =9 JMP SETIO NOT A SEEK OPERATION TITL SETSK COPY =2,A INITIALIZE RELATIVE SEEK COUNT COPY A,RESEEK(Y) * COPY =0,A COPY A,WRDPRC(Y) COPY A,COUNTW(Y) INITIALIZE WORD COUNT COPY =1,A COPY A,NUMSEC(Y) JMP *FBLOCK RETURN * SETIO COPY =0,A COPY A,RESEEK(Y) RESET RELATIVE SEEK COUNBT COPY =64,A WORDS PER SECTOR COPY A,WRDPRC(Y)  COPY A,COUNTW(Y) INITIALIZE WORD COUNT JMP *FBLOCK RETURN LPOOL TITL M B L O C K TITL * *THIS ROUTINE INITIALIZES THE FIRST 6 WORDS OF THE CONTROL BLOCKS OF THE *MBLOCK INITIALIZES THE CTRDL BLK *MINI-FLOPPY DISK,EXCEPT THAT THE DRIVE NUMBER IN THE BOOTSTRAP BLOCK *WILL BE SET TO UNIT NO BY INPROC ROUTINE * MBLOCK ENT * COPY IOB,Y SET UP CONTROL BLK ADDR IN Y * COPY Q,BEGLOC(Y) STARTING ADDR OF PROCESSESSING * NEG X,X  SECTORS TO PROCESS COPY X,PROSEC(Y) * COPY FLB15,Q LAST USER LOC COPY Q,ENDU(Y) * * COPY TFLAG,Q COPY Q,TRANSS(Y) * COPY CYLTMP,Q IT IS THE SECOND RUN OF VERIFY?  SBIT 2,S BYTE MODE JGT Q,SKIPCN YES, DON'T SET TRACK NO COPY =0,Q COPY Q,TRAC(Y)  RESET TRACK NO -- DISABLE INT SKIPCN EQU $ COPY A,OPCOD(Y) RBIT 2,S WORD MODE * COPY =1,Q COPY =9,X SBIT 2,S CSN A,X COPY Q,SECT(Y) INIT SECTOR NO. TO ZERO  COPY Q,DRE(Y) DRIVE ENABLE IS ZERO FOR SEEK * RBIT 2,S WORD MODE JMP *MBLOCK RET LPOOL TITL F L O P P Y D R I V E R * *FLOPPY DISK DRIVER CONTROL BLOCK OFFSETS * OPERAT  EQU 0 NDRIV EQU 1 CYLN EQU 2 RESEEK EQU 3 NUMSEC EQU 4 COUNTW EQU 5 USTART EQU 6 INHIBI EQU 7 INTERRUPT DISABLE WRDPRC EQU 8 STATIS EQU 9 * SCTRP EQU 10 DA EQU :88 DEVICE ADDRESS::11 SHIFTED LEFT 3 BITS ERRSWT WORD 0 OPETMP WORD 0 * FDRIVE ENT RETURN ADDRESS HERE (JST+1) * SST  DA+4 SENSE AND SKIP IF CONTROLLER PRESENT JMP FLERR NO CONTROLLER--PRINT ERROR SELP A  ,DA+4 INIT CONTROLLER (IGNORE A REG) LOOP EQU $ JST IORTN DO I/O *  4=FUNCTION CODE SUB A,A COPY A,RESEEK(Y) SEEK CT=0 * COPY USTART(Y),Q NEXT STARTING ADRESS COPY =64,A SAVE NEXT START ADDR AT FLT106 ADD Q,A BUMP OLD LOCATION BY 1 SECTOR COPY A,USTART(Y) * IMS NUMSEC(Y) INCREMENT SECTOR NO COPY NUMSEC(Y),Q  COPY =27,A LAST SECTOR THIS CYLINDER?? CSN A,Q TEST SECTOR # JMP NEWCYL  NEXT CYLINDER, WE ARE DONE JMP ALLDON * NEWCYL IMS CYLN(Y) NEXT CYLINDER COPY =1,A COPY A,NUMSEC(Y) COPY A,RESEEK(Y) COPY OPERAT(Y),Q SAVE CURRECT OPERATION CODE COPY Q,OPETMP  COPY =9,A SET OPERATION CODE TO SEEK COPY A,OPERAT(Y) COPY =0,A RESET SECTOR AND ERRORSWITCH COPY A,STATIS(Y) COPY A,INHIBI(Y) JST IORTN GO TO DO I/O COPY =0,A  COPY A,RESEEK(Y) COPY OPETMP,A COPY A,OPERAT(Y) RESTORE OPERATION CODE * ALLDON IMS SCTRP(Y) SECTORS TO GO TO ZERO JMP LOOP DUMP ONLY JMP *FDRIVE SEEK, BOOT & VERIFY EXIT -- EVENTUALLY DMP * IORTN ENT CSBUSY SST DA+0 IS CONTROLLER STILL BUSY -- IF SO, CHECK JMP CSBUSY AGAIN. *  COPY IOB,Y IOB CONTAINS STARTING LOC CTRL BLK,FLT100 * DOIT OUT Y,DA+0 * IDLE SST DA+0  IS CONTROLLER IDLE-IF NOT, JMP IDLE TRY AGAIN * COPY =2,Q COPY RESEEK(Y),A ARE WE IN SEEK MODE CSN A,Q REL SEEK CT= 2 ? JMP RESTOR YES, NOW RESTORE JMP CHEKIT NO - IN READ OR WRITE MODE-- * RESTOR COPY =-80,A RESTORE COPY A,RESEEK(Y) REL SEEK TO 80  JMP CSBUSY AND DO IT AGAIN * CHEKIT COPY =:FF,A CHECK STATUS, FLT109 AND STATIS(Y),A JNE A,FLERR NON ZERO -- ERROR JMP *IORTN RETURN * FLT100 WORD 9 OP CODE FOR SEEK FLT101 WORD 0 DRIVE NO INITIALIZED BY INPUT PROC FLT102 WORD 0 CYLINDER NO FLT103 WORD 2  REL SEEK CT FLT104 WORD 1 SECTOR NO FLT105 WORD 0 WORD CT (WILL BE 64 WRDS FOR I/O) FLT106 WORD 0 START LOC USER DATA FLT107 WORD 0 INTERRUPT DISABLED FLT108 WORD 0 NO WORDS PROCESSED FLT109 WORD 0 STATUS TO BE ANDED WITH :FF FLT110 WORD 0 SECTORS TO PROCESS LPOOL TITL FLERR EQU $ COPY STATIS(Y),A SHIFT A,RO,1 TEST FOR NR - BIT 1 SET - A = 1 JT OV,ERRNR BIT 15 IS SET SHIFT A,RO,3 TEST FOR WP - BIT 3 SET - A = 8 JT OV,ERRWP JMP ERRIO ALL OTHER ERRORS * ERRWP EQU $ COPY =4,Y JMP ERRS * ERRNR EQU $ COPY =5,Y  JMP ERRS * ERRIO EQU $ COPY =6,Y JMP ERRS TITL M I N I - D R I V E R *THIS IS THE DR  IVER FOR THE MINI-FLOPPY DISK. IT IS USED BY BOTH DUMP *AND VERIFY ROUTINES, TO WRITE TO OR READ FROM MINI FLOPPY DISK * *MINI-FLOPPY DISK DIRVER CONTROL BLOCK OFFSETS OPCOD EQU 0 DRIV EQU 1 TRAC EQU 2 HEA EQU 3 SECT EQU 4 DRE EQU 5 TRANSS EQU 3 ENDU EQU 6 * PICODA EQU :FC DEVICE ADDRESS:FC --MINI FLOPPY CONTROLLER * MDRIVE ENT * CONOUT EQU $ COPY IOB,Y BEGLOC EQU 4 PROSEC EQU 5 SUB X,X COPY =5,Q CONTROL BYTE COUNTER MAX OF 6 * SBIT 2,S BYTE MODE LOOPN COPYB 0(X,Y),A OUT  A,PICODA OUTPUT CONTROL BYTE ADD =1,X JNED Q,LOOPN RBIT 2,S CLEAR BYTE MODE  COPY COMAND,A OUT A,PICODA+1 OUTPUT COMMAND SIGNAL * JST WAIT JST GSTAT  CHECK FOR STATUS * SBIT 2,S SET BYTE MODE COPY 0(Y),A RBIT 2,S BYTE MODE * SUB X,X * *SEEK=9=1001 READ=7=0111 WRITE=3=0011 * COPY =:80,Q SHIFT A,RO,3 BIT 2 ON IS A READ JT OV,INLOOP READ IS 7=0111 SHIFT A,RO,1 SEEK=9=1001 JT OV,SECNT *  COPY MLT106,Y SBIT 2,S BYTEMODE SENDIT COPYB 0(X,Y),A OUT A,PICODA OUTPUT RIGHT BYTE TO DISK ADD =1,X JNED Q,SENDIT RBIT 2,S COPY COMAND,A OUT A,PICODA+1 * JST WAIT JST GSTAT JMP SWORD * INLOOP EQU $ COPY MLT106,Y SBIT 2,S INREGA IN PICODA,A INPUT TO A COPYB A,0(X,Y) ADD =1,X JNED Q,INREGA RBIT  2,S * SWORD EQU $ ADD =:40,Y COPY Y,MLT106 * SETSEC EQU $ COPY IOB,Y SBIT 2,S BYTE MODE--ASSUMES SECTOR COMPARED OK) COPY SECT(Y),A ADD =1,A COPY A,SECT(Y) RBIT 2,S NEW SECTOR NO IN A * COPY =17,Q LAST SECTOR IN CYL CSN A,Q  JMP NTRACK JMP SECNT WE ARE DONE PROCESSING NTRACK COPY =1,A SBIT 2,S COPY A,SECT(Y) * COPY TRAC(Y),Q ADD A,Q COPY Q,TRAC(Y) RBIT 2,S SECNT IMS PROSEC(Y)  JMP CONOUT DUMP USER JMP *MDRIVE WE ARE DONE PROCESSING * WAIT ENT GET IN PICODA+1,A ROTATE A,RO,2 ROTATE STATUS IN A,RIGHT 2 PLACES 0T0OV JT OV,GET JMP *WAIT * GSTAT ENT ROTATE A,LO,1 GET LAST STATUS ROTATED RITE JT OV,ERRHLT JMP *GSTAT * ERRHLT SELP A,4 COPY A,Q COPY STATUS TO Q JMP MINERR OUTPUT ERROR MESSAGE TO CRT *  MINI-FLOPPY CONTROL BLOCK MLT100 WORD 0 OP CODE (L), DRIVE NO (R) MLT101 WORD 0  TRACK (L), HEAD (R) MLT102 WORD 0 SECTOR (L), DRIVE EN (R) MLT105 WORD 0 TRANSFER FLAG MLT106  WORD 0 STRTING LOCATION MLT108 WORD 0 SECTORS TO PROCESS MLT110 WORD 0 FINAL USE  R ADDRESS COMAND WORD :200 LPOOL TITL M I N I - B O O T S T R A P * *MINI FLOPPY BOOTSTRAP--SETS UP TRAP FOR MEMORY OVERFLOW; RELOCATES *BOOT; TRANSFERS CONTROL TO BOOT; PULLS IN USER DATA * * *MINI-FLOPPY BOOTSTRAP CONTROL BLOCK OFFSETS * TRAN EQU :6 MOFF1 EQU MLB34-MBOOT MFBLEN EQU EXCUTE-MLB34 THE LENGTH OF BOOT TO BE MOVED * MBOOT  COPY STOPIT,A * COPY =MOFF1,Y SET Y REG TO IOB COPY Y,MLB14 SBIT XA,S COPY A,*TRAP * JST MINIIO TO SEEK THE FIRST CYLINDER COPY MLB34,A COPY OP CODE TO A REG WHICH IS 9 (SEEK) XOR HE00,A CHANGE IT TO 6, WHICH COPY A,MLB34 IS READ JMP CBOUT BRING UP THE SECOND SECTOR FOR BOOT * TRAP WORD :86 TITL * MLB34 WORD 0 OP CODE (L), DRIVE NO (R) MLB56 WORD  0 TRACK (L), HEAD SELECT (R) MLB78 WORD 0 SECTOR (L), DRIVE NO (R) MLB9 WORD 0 TRANSFERFLAG MLB10 WORD 0 STARTING LOCATION MLB12 WORD 0 SECTORS TO PROCESS MLB13 WORD 0  TRANSFER ADDRESS MLB14 WORD 0 USER LWA+41--START RELOCATED BOOT DRIVER * HE00 WORD :E00 C200  WORD :200 * CBOUT EQU $ JST MINIIO * * GETSEC COPY MLB10,Y SUB X,X COPY =:80,Q  SBIT 2,S BYTE MODE LOOPIN IN PICODA,A READ IN A BYTE COPYB A,0(X,Y) ADD =1,X JNED Q,LOOPIN LOOP TILL 128 BYTES TRANSFERRED & STORED RBIT 2,S WORD MODE ADD  =:40,Y COPY Y,MLB10 COPY MLB14,Y * SBIT 2,S BYTE MODE COPY SECT(Y),Q INCREMENT THE SECTOR NO BY 1 ADD =1,Q COPY Q,SECT(Y) RBIT 2,S * COPY =MOFF1,A SET A REG TO LOC OF LOWER BOOT DRIVER CSN A,Y IS BOOT STILL IN LOWER MEMORY JMP MLB20 YES, GO TO MOVE THE BOOT TO UPPER MEM. XOR =17,Q TEST FOR END OF TRACK JNE Q,SMORE NO, CONTINUE TO READ JMP NUTRK GO TO INCREMENT 1 TRACK * MINIIO ENT SUB X,X * COPY =5,Q BYTE COUNTER IN Q (6 CTRL BYTES) SBIT 2,S BYTE MODE LOOPM COPYB 0(X,Y),A OUT A,PICODA SEND OUT CTRL BYTE ADD =1,X JNED Q,LOOPM LOOP TILL ALL 6 CTRL BYTES OUT RBIT 2,S WORD MODE COPY C200,A OUT A,PICODA+1 * STAT1 EQU $ IN PICODA+1,A GET THE STATUS AT :FD  ROTATE A,RO,2 TEST BIT 1 OF STATUS JT OV,STAT1 BUSY -- BACK TO CHECK AGAIN ROTATE A,LO,1 TEST BIT 0 JT OV,STOPIT IF BIT ZERO IS SET, WE HAVE AN ERROR JMP *MINIIO STOPIT HLT * NUTRK EQU $ INCREMENT 1 TRACK AND RESET SEC.NO TO 1 SBIT 2,S COPY =1,A COPY A,SECT(Y) RESET SEC. NO TO 1 COPY TRAC(Y),Q ADD A,Q INCREMENT TRACE NO BY 1 COPY Q,TRAC(Y)  STORE IT BACK TO IOB * SMORE RBIT 2,S WORD MODE IMS PROSEC(Y) INCREMENT SECTORS TO GO   JMP CBOUT COPY TRANSS(Y),A COPY TRANSFER FLAG TO A REG JEQ A,STOPIT NOT SET. GO TO HALT EXCUTE  JMP *TRAN(Y) * MLB20 COPY =0,X COPY START,A STORE THE STARTING LOCATION OF COPY A,MLB10  USER'SPROGRAM INTO IOB COPY UPMLB,Y STORE RELOCATED BOOT DRIVER BACK COPY Y,MLB14 START LOADED BOOT DRIVER COPY =MFBLEN,A REST OF BOOT LENGTH * MOVIT COPY MOFF1(X),Q COPY Q,0(X,Y) ADD =1,X JNED A,MOVIT JMP :A(Y) GO TO LOAD USER'S PROGRAM * UPMLB WORD 0 START WORD 0 TITL * MINERR SHIFT Q,RO,2 ENTRY MDRIVE - MINI JT OV,NREADY 'NOT READY' SHIFT Q,RO,1 JT OV,WRITEP 'WRITE PROTECT' JMP ERRIO ALL OTHER ERRORS * NREADY JMP ERRNR WRITEP JMP ERRWP *  LPOOL BUFF RES 64 MBDPE EQU $ END MBDP END MAIN Q COPY Q,0(X,Y) ADD =1,X JNED A,MOVIT JMP :A(Y) GO TO LOAD USER'S PROGRAM * UPMLB WORD 0 START WORD 0 TITL * MINERR SHIFT Q,RO,2 ENTRY MDRIVE - MINI JT OV,NREADY 'NOT READY' SHIFT Q,RO,1 JT ZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZ  ZZZZZZZZZZZZZZZZZZZZZZZZZZ! ZZZZZZZZZZZZZZZZZZZZZZZZZZ" ZZZZZZZZZZZZZZZZZZZZZZZZZZ# ZZZZZZZZZZZZZZZZZZZZZZZZZZ$ ZZZZZZZZZZZZZZZZZZZZZZZZZZ% ZZZZZZZZZZZZZZZZZZZZZZZZZZ& ZZZZZZZZZZZZe; 790314140030790314140030790314140030e@790314140030790314140030790314140030e:' 790314140030790314140030790314140030e790314140030790314140030790314140030790314140030790314140030790314140030eS7903141409045079031414094225d( ) * + , - . / 0 . MBDP ASM1 ZZZZZZZZZZZZZZZZZZZZ2 ZZZZZZZZZZZZZZZZZZZZZZZZZZ3 ZZZZZZZZZZZZZZZZZZZZZZZZZZ4 ZZZZZZZZZZZZZZZZZZZZZZZZZZ5 ZZZZZZZZZZZZZZZZZZZZZZZZZZ6 ZZZZZZZZZZZZZZZZZZZZZZZZZZ7 ZZZZZZZZZZZZZZZZZZZZZZZZZZ8 ZZZZZZZZZZZZZZZZZZZZZZZZZZ9 ZZZZZZZZZZZZZZZZZZZZZZZZZZ: ZZZZZZZZZZZZZZZZZZZZZZZZZZ; ZZZZZZZZZZZZZZZZZZZZZZZZZZ< ZZZZZZZZZZZZZZZZZZZZZZZZZZ= ZZZZZZZZZZZZZZZZZZZZZZZZZZ> ZZZZZZZZZZZZZZZZZZZZZZZZZZ? ZZZZZZZZZZZZZZZZZZZZZZZZZZ@ ZZZZZZZZZZZZZZZZZZZZZZZZZZA ZZZZZZZZZZZZZZZZZZZZZZZZZZB ZZZZZZZZZZZZZZZZZZZZZZZZZZC ZZZZZZZZZZZZZZZZZZZZZZZZZZD ZZZZZZZZZZZZZZZZZZZZZZZZZZE ZZZZZZZZZZZZZZZZZZZZZZZZZZF ZZZZZZZZZZZZZZZZZZZZZZZZZZG ZZZZZZZZZZZZZZZZZZZZZZZZZZH ZZZZZZZZZZZZZZZZZZZZZZZZZZI ZZZZZZZZZZZZZZZZZZZZZZZZZZJ ZZZZZZZZZZZZZZZZZZZZZZZZZZK ZZZZZZZZZZZZZZZZZZZZZZZZZZL ZZZZZZZZZZZZZZZZZZZZZZZZZZ