þþ¦èX;SAVE #D2:DUPSUB.M65òA”RESIDENT SUBROUTINESAü2X; **** SUBROUTINES FOR RESIDENT DUP ****X;X;6X; ROUTINE TESTS IF MEM.SAV IS PRESENT ON THE$(X; RETURNS - MINUS IF NOT THERE./X; PLUS IF MEM.SAV IS THERE8X;= …@ORG sB"†MEMSVQ †CLOS20;;CLOSE IOCB # 2L Q>„OPENV P…ICCOM9` Q>4„NAMEj P…ICBAL9t Q>5„NAME~ P…ICBAH9ˆ Q>†ORDWRT’2P…ICAX19;;TRY TO OPEN D1:MEM.SAV FOR READ/WRITEœ †CIOOPN¦6;;SAVE STATUS° †CLOS20;;CLOSE MEM.SAVº8;;RESTORE STATUSÄ:ÎX;ØX;âGX; SAVE FILE SUBROUTINE - WRITE FILE BODY, INIT, & RUN VECTORSìX;ö+„WDR1Q>;;THIS IMMEDIATE VALUE MODIFIED2F„WDR2;;BR IF MEM FILE DOESNT HAVE TO BE LOADED  …LDMEM „WDR2$>& ƒCIO;;DO SAVE - WRITE BODY TO DISK(3…INITQQ>;;THIS IMMED VALUE CHANGED DURING SAVE22F„RUNQ;;SET TO FF WHEN AN INIT VECTOR IS PRESNT< #…INITQF Q†INITADP+P…VECTR;;IF INIT VECTOR FOR FILE SAVE ITZQ†INITADd P…VECTRn Q>4†INITADx>‚ P„LDSTŒ Q>5†INITAD– …WRVEC +„RUNQQ>;;THIS IMMEDIATE VALUE MODIFIEDª3F†NORNAD;;SET TO FF WHEN A RUN VECTOR IS PRESENT´ #„RUNQ¾ Q…RUNADÈ*P…VECTR;;IF RUN VECTOR FOR FILE SAVE ITÒ Q…RUNADÜ P…VECTRæ Q>4…RUNADð>ú P„LDST Q>5…RUNAD …WRVEC#†NORNAD …CLOSX;;CLOSE IOCBS 1 &2" Q†MEMFLG, M„WDR16 F†DRRDUP@/#„WDR1;;RESET MEM.NEEDS TO BE LOADED FLAGJ!†RRDUP1;;RELOAD & RUN DUPT)†DRRDUP!…DOSOS;;RUN THE SWAPPED IN DUP^X;hX;rX;|…WRVECP„LDST†2 &„LDNDš P„LDND¤$>® Q>4„LDST¸ P…ICBAL9 Q>5„LDSTÌ P…ICBAH9ÖQ>à P…ICBLL9êQ>ô P…ICBLH9þ#!ƒCIO;;WRITE INIT OR RUN ADDRESSX;X;X; JUMP TO CARTRIDGE&X;0†CLMJMP …LDMEM:%Q>;;SHOW DUP NO LONGER IN MEMORYD P†DUPFLGN* †RELDIN;;RESTORE DOS INIT VECTOR SAVEDX !@†CARTST:;;JUMP TO CARTRIDGEbX;lX;v=X; LOAD MEM.SAV (IF IT EXISTS) BEFORE RUN AT ADDRESS€X;Š+„LMTR …LDMEM;;LOAD MEM.SAVE IF IT EXISTS”*Q>;;SHOW THAT DUP NO LONGER IN MEMORYž P†DUPFLG¨* †RELDIN;;RESTORE DOS INIT VECTOR SAVED²!@…RAMLO:;;RUN AT ADDRESS¼X;Æ5X; RESTORE DOSINI VECTOR FROM SAVED LOCATIONÐX;Ú†RELDINQ†INISAVä P†DOSINIîQ†INISAVøP†DOSINI: X;X; X; SUBROUTINE - LDMEM*%X; LOAD MEM.SAV IF IT EXISTS4X;>…LDMEMQ†MEMFLGH'H†LDMEM1;;BRANCH IF MEMORY WAS SAVEDR:\†LDMEM1 †MEMSVQf.I†LDMEM2;;BRANCH IF MEM.SAV FILE DOES EXISTp%Q>;;TELL CART PGM AREA CLOBBEREDz P†WARMST„"F…CLOS2;;GO CLOSE AND GOTO CARTŽX;˜†LDMEM2Q>„OPEN¢ P…ICCOM9¬ †CIOOPN;;REOPEN MEM.SAV¶ Q>†GETCHRÀ P…ICCOM9ÊQ>4„MLEN Ô P…ICBLL9Þ Q>5„MLENè P…ICBLH9ò Q>4„NDOSü P…ICBAL9 Q>5„NDOS P…ICBAH9  ƒCIO$ …CLOS2Q>…CLOSE. P…ICCOM98 !ƒCIO;;CLOSE MEM.SAVB X;L ;X; CLOSE ALL IOCBS & RE-OPEN ZERO AS SCREEN EDITORV X;` 2†INITIO †CIOINV;;THIS ROUTINE CLOSES ALL IOCB'Sj #;THEN REOPENS THE SCREEN EDITORt $>~ Q>„OPENˆ P…ICCOM9’ Q>4‚ECœ P…ICBAL9¦ Q>5‚EC° P…ICBAH9º Q>†ORDWRTÄ P…ICAX19Î !ƒCIOØ X;â X; CLOSX - CLOSE IOCBS 10,20ì X;ö …CLOSXQ>…CLOSE $> P…ICCOM9  ƒCIO X;( (X; ENTRY TO CLOSE IOCB # 2 ONLY2 X;< †CLOS20$> F Q>…CLOSEP P…ICCOM9Z †:GOCIO!ƒCIOd X;n X; SUBROUTINE - PRNTMSGx KX; PUTS A CHARACTER STRING TERMINATED BY A CARRIAGE RETURN CHAR TO‚ X; SCREEN EDITOR.Œ X;– 0X; ENTRY - REG A : LOW BYTE MSG ADDRESS  /X; REG X : HI BYTE MSG ADDRESSª X;´ =X; PUT PARAMS IN IOCB - USE IOCB 0 FOR SCREEN EDITOR¾ X;È 2‡PRNTMSGP…ICBAL;;SET MSG ADDR IN IOCB BUFF ADDRÒ &…ICBAHÜ X;æ X; SET UP REST OF IOCBð X;ú $>;;SET IN BUFFER LENGTH !&…ICBLH;;ASSUME 256+ BYTES MAX 0" Q>†PUTREC;;PUT MSG, P…ICCOM1 42 46 X;@ IX; TEST IF DUP IS RESIDENT - IF IS THEN USE INDIRECT CIO ROUTINEJ 'X; TO TEST FOR BREAK KEY ABORTT X;^ 1Q†DUPFLG;;=ZERO IF NON-RESIDENT DUP NOT IN MEMh 1F†:GOCIO;;IN MEMORY THEN USE INDIRECT CIO CALLm ‡@ALIGN ¾r ?ˆOLDPRMSG!†CHK2.5;; Go to insure that dup.sys is version 2.5| X;† X; „SAVH ÿ=ÿš „LDST¤ „LDND® …VECTR¸ X; ,X; Allow for 3 VTOC buffers of 144 bytes.Ì )X; (128 bytes plus 3 VTOCs w/ 16 bytesÖ (X; extra data in comparison to 2.0s)à …@ORG |€ê …MDEND ô  þ / …MDEND;;SET END ADDR IN FMS PAST RES DUP SO >X; ;BUFFERS DON'T CLOBBER IT. „STAK