@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u .OPT NO LIST,NO EJECT .OPT NO MLIST,NO CLIST; SAVE #D1:CART.M65;;; SAVE #D2:CART.M65;;; PRINT #D1:CART.SRC;;;T}; ASM ,,#D1:CART.COM;; .TITLE "CART.COM";; Programmed by John Picken; last revision: 19 Nov 93;; Controls OSS caU}rtridge; and/or Basic rom;; Syntax: (SpartaDOS);; CART /B enable Basic; CART /C enable Cartridge; CART /D disableV} both;LNFLG = $00TRAMSZ = $06WARMST = $08BOOT? = $09DOSVEC = $0ADOSINI = $0CRTCLOK = $12RAMTOP = $6A;COLDST = $024W}4COLOR1 = $02C5INITAD = $02E2RAMSIZ = $02E4MEMTOP = $02E5;ICCOM = $0342ICBAL = $0344ICBAH = $0345ICBLL = $0348ICBLHX} = $0349;BASICF = $03F8 Zero = OnGINTLK = $03FA One = OnCARTCK = $03EBACMVAR = $03EDCARINI = $BFFETRIG3 = $D013POY}RTB = $D301CIOV = $E456WARMSV = $E474COLDSV = $E477; .MACRO PRINT LDY #%1 JSR PRINT .ENDM; *= $B0ZPORTB *= Z}*+1 entry valueZCSTAT *= *+1 n=cart v=onZSDOS *= *+1 n=not 0=spartaZBASIC *= *+1ZINDEX *= *+2ZPAGES[} *= *+1ZSTACK *= *+2ZCOLRS *= *+10; *= $3000;START LDA #$60 STA START PRINT JKPMSG x=0; SEI LDY $AFFF\} Save cart bank STA $D500 Enable any cart LDA GINTLK Was it on? PHA CMP #1 BCS GOTBNK Yes; LDY #8 Ban]}k=cart off LDA TRIG3 a=1 if any cart;GOTBNK ROR A ROR A n=cart v=is on STA ZCSTAT c=0; LDA PORTB STA ^}ZPORTB LDA #$FD Ensure os on STA PORTB for chksum; TXACSLOOP ADC $BFF0,X INX BNE CSLOOP; STA CARTCK S_}TA $D508 Kill any cart; LDA $A000 See if any Basic INC $A000 CMP $A000 BEQ GOTBAS; STA $A000 CLC;GOTBAS `} STA $D500,Y Restore any cart PLA a=gintlk ROL A a=gintlk*2+cy;; cart+bas: a=3 cart only: a=2; bas onlya}: a=1 no roms: a=0; only 1 is valid for basic on; TAX ASL A AND #$02 If rom a=2 EOR #$02 If rom a=0 else b} STA ZBASIC no rom flag=2; LDA #$02 For basic flag STA ZPAGES DEX Check gintlk/bas BNE FLAGIT combinatic}on; AND ZPORTB If was on a=0;FLAGIT STA BASICF on=0 off=2 ORA ZPORTB If off set b1=1 STA ZPORTB Fix Portb lated}r; LDX #$FF STX ZSDOS LDA # >$0700 STA ZINDEX+1; LDY $0700 CPY #'S BEQ SDOS;; look for jump table in v2.3;e} LDY #$0BV23CHK CMP $0700,Y BNE OVRSTK DEY DEY BPL V23CHK;SDOS INX x=0 STX ZSDOS STX ZINDEX;; f}Find Lda Address,X;GETLDA LDA (ZINDEX,X) x=0 thruout CMP #$BD BEQ GOTLDA;NXTBYT INC ZINDEX BNE GETLDA INC ZINg}DEX+1 DEC ZPAGES BPL GETLDA BMI OVRSTK Abort, not found;; Check next op is Sta Portb;GOTLDA LDY #5STAPB? LDA h}(ZINDEX),Y CMP PBREST-3,Y Go back if BNE NXTBYT any fail test DEY else check CPY #2 all 3 bytes BNE Si}TAPB?;; Get stack address; LDA (ZINDEX),Y msb STA ZSTACK+1 DEY LDA (ZINDEX),Y lsb STA ZSTACK;; Correct all eigj}ht values; LDY #7FIXSTK LDA (ZSTACK),Y ORA BASICF STA (ZSTACK),Y DEY BPL FIXSTK;OVRSTK LDA ZPORTB restore k}fixedPBREST STA PORTB value in portb CLI LDX ZSDOS BEQ SPARTA; PRINT KEYMSG x=0; LDX #9KLOOP LDA KEYDAT,l}X STA ICCOM+$70,X DEX BPL KLOOP JSR CLOSE7 Close #7 LDA #3 JSR SETCOM Open #7,4,0,"K:" LDA #7 JSR SETCOM Gm}et #7,key BPL GOTKEY Go if not Break;EXIT CLI LDA RTCLOK+2WAIT2 CMP RTCLOK+2 BEQ WAIT2; LDA ZSDOS BNE CLOSn}E7; JMP (DOSVEC);CLOSE7 LDX #$70 LDA #12SETCOM STA ICCOM,XGOCIO JSR CIOV CPY #0 RTS; ---------SPARTA Lo}DY #4 LDA (DOSVEC),Y Get address of STA GOZCR+1 ZCrname routine INY and place in LDA (DOSVEC),Y code below p}STA GOZCR+2 JSR GOZCR Get parameter BNE GOTPAR error if none;SYNERR LDY #SYNMSG BPL PEXIT;GOTPAR CMP #'/ Bq}NE SYNERR; JSR NEXT Get letter;GOTKEY LDX RTCLOK+2WAIT1 CPX RTCLOK+2 BEQ WAIT1 SEI LDX #2 Basic flag r}"off"; ORA #$20 Make lower case CMP #'d BNE B?;DISABL LDY #$C0 Ramtop TXA ORA ZPORTB a=portb brom off s} JSR GRAPHZ LDY #OFFMSG BPL PEXIT; ------------B? LDY #$A0 Ramtop CMP #'b BNE C?;BASICON LDX ZBASIC is 0 t}if rom BEQ HAVBAS present else 2; LDY #NAVMSG BNE PEXIT;HAVBAS LDA ZPORTB AND #$FD JSR GRAPHZ LDY #BASMSG;u}PEXIT JSR PRINT BNE EXIT always; --------------------------C? CMP #'c BEQ DOCART; LDA ZSDOS BEQ SYNERR Bv}NE EXIT;DOCART BIT ZCSTAT BVS CARXIT Already on BMI M65?; LDY #NOCMSG BNE PEXIT;M65? STA $D500 Enable banw}k 0 TXA ORA ZPORTB JSR GR02 return x=0; LDA CARTCK CMP #$A4 Mac/65? BNE NOTMAC No;; Simulate cold startx} to; initialize cartridge; STX BOOT? STX WARMST DEX STX COLDST JSR INICAR;NOTMAC LDX #1 STX BOOT? DEX Sy}TX COLDST;CARXIT LDY #CARMSG BPL PEXIT; -------------INICAR JMP (CARINI); -------------GRAPHZ STA $D508 Kill z}cart;GR02 STX BASICF STY RAMTOP STA PORTB LDA TRIG3 STA GINTLK LDX #10GRLOOP LDA COLOR1-1,X STA ZCOLRS-1,X{} LDA GR0DAT-1,X STA ICCOM-1,X DEX BNE GRLOOP JSR CIOV LDA #3 JSR SETCOM LDX #4RELOOP LDA ZCOLRS-1,X STA |}COLOR1-1,X DEX BNE RELOOP x=0 RTS returns z; -------------GOZCR JSR $FFFF Get next param BEQ CREXIT e}}xit if none LDY #35 ignore Dn:NEXT INY LDA (DOSVEC),YCREXIT RTS; -------------PRINT LDA #11 STA ICCOM L~}DA ALTABL,Y STA ICBAL LDA AHTABL,Y STA ICBAH LDA LLTABL,Y STA ICBLL LDX #0 STX ICBLH JMP CIOV; -------------}GR0DAT .WORD 12 .WORD E .WORD 0 .WORD 0 .WORD 12KEYDAT .WORD 12 .WORD K .WORD 0 .WORD 0 .WORD 4E .BY}TE 'EK .BYTE 'K;ALTABL .BYTE M.CREDIT .BYTE >M.SYNTAX .BYTE >M.CART .BYTE >M.BAS .BY}TE >M.OFF .BYTE >M.NOBAS .BYTE >M.KEY .BYTE >M.NOCARLLTABL .BYTE L.CREDIT .BYTE L.SYNTAX .BYTE L.CART .BYT}E L.BAS .BYTE L.OFF .BYTE L.NOBAS .BYTE L.KEY .BYTE L.NOCAR;MSGNUM .= -1MSGNUM .= MSGNUM+1JKPMSG = MSGNUMM.C}REDIT .BYTE 155,127 .BYTE "CART.COM - jkp Nov '93" .BYTE 155L.CREDIT = *-M.CREDIT;MSGNUM .= MSGNUM+1SYNMSG = MSGN}UMM.SYNTAX .BYTE 155,127,127 .BYTE "Syntax" .BYTE 155,155,127 .BYTE "CART /B Basic on" .BYTE 155,155,127 .BYTE} "CART /C Cartridge on" .BYTE 155,155,127 .BYTE "CART /D Disable both" .BYTE 155,155L.SYNTAX = *-M.SYNTAX;MSGNUM} .= MSGNUM+1CARMSG = MSGNUMM.CART .BYTE 155,127 .BYTE "Cartridge enabled" .BYTE 155L.CART = *-M.CART;MSGNUM .=} MSGNUM+1BASMSG = MSGNUMM.BAS .BYTE 155,127 .BYTE "Basic enabled" .BYTE 155L.BAS = *-M.BAS;MSGNUM .= MSGNUM+1OF}FMSG = MSGNUMM.OFF .BYTE 155,127 .BYTE "Cartridge/Basic disabled" .BYTE 155L.OFF = *-M.OFF;MSGNUM .= MSGNUM+1NAV}MSG = MSGNUMM.NOBAS .BYTE 155,127 .BYTE "Basic not available" .BYTE 155L.NOBAS = *-M.NOBAS;MSGNUM .= MSGNUM+1KEY}MSG = MSGNUMM.KEY .BYTE 155,127,127 .BYTE "Select:" .BYTE 155,155,127 .BYTE "[]asic on" .BYTE 155,155,127 .BYTE} "[]artridge on" .BYTE 155,155,127 .BYTE "[]isable both" .BYTE 155,155,127 .BYTE "Any other key exits" .BYTE 155}L.KEY = *-M.KEY;MSGNUM .= MSGNUM+1NOCMSG = MSGNUMM.NOCAR .BYTE 155,127 .BYTE "No cartridge installed" .BYTE 155L}.NOCAR = *-M.NOCAR; *= INITAD .WORD START .OPT NO LIST .ENDE 155,127 .BYTE "No cartridge installed" .BYTE 155LEPP`PS%PI PP! 0xԭH)ӢPhӎXuPDE IBLVSt }art Batch File -- Installed DisabNot SpartaDOS 2.5+8`L! 0 2ȱ 3l2hӎXuPDE IBLVSt [th File -- Installed DisabNot SpartaDOS 2.5+8`L! 0 2ȱ 3l2hӎXuPDE IBLVStNew Utilities For Your XL/XE(Part 4)by John PickenThis final segment of the series presents some miscellaneous programs, }some of which I've released in the past. Most of them will work on unexpanded XL's. In addition, the first two will provide y}ou with a simple way to produce conditional branching in batch files.ABAT.COMICD's (now FTe's) AUTOBAT allows you to pres}elect a batch file to run following Reset but it has a couple of problems. The first is that you can't turn it off which make}s the second more serious. It parks itself on page six, a location frequently used by many other programs. Even if not altere}d by a program, it can be corrupted by overflow from the BASIC buffer. No matter how the area is overwritten, DOS still jumps} there on a Reset if you used AUTOBAT even once. This usually results in a lockup but could cause something as disastrous as }a disk format.ABAT is a replacement. I took the name and syntax from Ed Bachman's Wedge so users need not rewrite batch fil}es when working without the Wedge. I moved the Reset handler to the bottom of page one and, in three years of use, have never} encounterd a problem with the new location nor have I ever had a lockup due to ABAT. Further testing has been carried out by} Bob Nex, SysOp of the Pothole who uses it regularly to reset his BBS.You enable ABAT as you would AUTOBAT, i.e. "ABAT [Dn:}][path>]filename[.ext]". To disable it, call it with no filespec.WARM.COMWARM produces a system Reset identical to pressi}ng the key. Why would you want to waste two sectors on a file that simply replaces a key press? Exactly because it is a file.}Unlike DOSXL which aborts batch processing on error, Sparta simply reports the error and continues on to the next command (}just try [Break]ing out of a Sparta batch). This means you can use WARM to produce conditional batch file branching. Here's a}n example in a startup batch file:RD D4: /ND4:WARMSCOPY RDFILE D4: /RExplanation: The RD is installed without format. T}hen, if the RD has been previously set up, WARM aborts the batch so it is not re-formatted. If however you're on a power-up b}oot, you get a "file not found error message" and SCOPY proceeds to format, set up and load the RD.To add real power and co}nvenience, team WARM up with ABAT in something like:RD D4: /ND4:ABAT D4:ISSETUPD4:WARMSCOPY RDFILE D4: /R-ISSETUPHere}, if the RD is set up, the warm start will result in branching to a final batch (ISSETUP.BAT) which might be something like:}TDLINED4:DATETIMEABAT RESETSince you could end up here in either of two ways, it is important to either turn off ABAT }or specify another batch file.TURBOFIX.LST and TB800.LSTTURBOFIX will modify Turbo BASIC XL or TB32Q.COM (Tom Hunt's Spar}taDOS version) so that time functions work correctly on North American Atari's. TB800FIX will do the same thing for the Atari} 800 version of Turbo (the one that has DOS 2 built in) and will allow you to change write with verify as well as fix a bug i}n DOS 2.Additionally they will change the prompt from "READY" to "TURBO" with the XL version or to "Turbo" with the Sparta }and 800 ones to identify the revised file. (You can change the prompt by reading the REMs.)They will change the autorun fil}espec from "D:AUTORUN.BAS" to "D1:*?????.ARB" or anything else you want. I use "ARB" to stand for AutoRunBasic. The advantage} is that you can have several optional autoruns on the same disk. The one that will execute will be the first one in the dire}ctory with the ARB extender. You can also change this by reading the REMs.The programs are in LIST format and must be ENTER}ed and RUN under Turbo. TB800FIX must be RUN under the 800 version. TURBOFIX can be run under any version as long as DOS can }find and read the file to be modified.TSETUSR.LST and TSETUSR.OBJThese are simply a demo and the required USR code to run} it, of how to set time and date in XL2 from BASIC. (Requires MYDOS or SpartaDOS).ly a demo and the required USR code to runSThis is a last minute upgradereplacement for RDNUMBER.COM (found inRD.ARC). The way it now works is,if Dx: is the RD and y}our currentcommand drive and directory path issomething like Dx:>A>BB>CCC>the command RDNUMBER Dy: will resultin the numb}er change and your commanddrive and working directory willautomatically change to Dy:>A>BB>CCC>If you don't like this fea}ture, useRDNUMBER from RD.ARC. and working directory willautomatically change to Dy:>A>BB>CCC>If you don't like this fea 02x`0R 0 6i 8ȱ 7i9 61081$ i? 0 0ȱ 0 0, 0RX`" 19}16 0 62 0D2EH2I0 112 )6, 11)68o1f116 6Lb0L 1D}1E1HI BLVg`1110M13RAMdisk Renumber UtilityVer. 4.5 by John Pickenuse with Mega XE RD v4.5 Syntax: } RDNUMBER Dx: where x is drive (1-8)RAMdisk responds as D1:Drive redirection is ON Ġ I1L}118 `1@D1: responds as D1:Drive redirection is ON Ġ I1L.VERS = $45 .OPT NO LIST,NO MLIST .OPT NO CLIST,NO EJECT; SAVE #D1:RDNUMBER.M65;;; SAVE #D2:RDNUMBER.M65;;; ASM , },#D1:RDNUMBER.COM; .TITLE "RDNUMBER.COM";; RD renumber utility; by John Picken; last revision: 03 Sep 93;; Moved han }dler ref to end; of code to allow for rd; revs. Otherwise, over-; write of print routines; occurs if length changes.;; }Could replace ref code; with .Include of handler; but makes much longer file.;; Added version to title to; match rd vers }ion to ensure; correct com used.;; 26 May 94; If current command drive; is the main rd then change; it and curren }t path for; the new rd number; .IF .NOT .DEF PORTB .INCLUDE #D1:RDEQUATE.M65; *= $30ZPBSAV *= *+1 Portb entry }ZAUXRD *= *+1 Flag aux ramdiskZBUFLO *= *+2 User bufr addrZRVLO *= *+1 Ramdisk addressZRVHI *= *+1ZVEC * }= *+2ZVEC2 *= *+2 .ENDIF; *= $3000START SEI LDA #$60 STA START LDA #8 STA LMARGN LDY #M.HELLO JSR PRIN }T; LDY #LSIO Point to rd DEC DOSVEC+1 handler LDA (DOSVEC),Y STA ZVEC CLC ADC #ISDISK-RDSIO and to STA ZVEC }2 later portion INY LDA (DOSVEC),Y STA ZVEC+1 ADC #0 STA ZVEC2+1 INC DOSVEC+1;; Compare with what it sh }ould be; LDY #JMPSIO-RDSIOTEST1 LDA (ZVEC),Y Compare first CMP RDSIO,Y eight bytes BNE NOFIND DEY BPL TEST1 }; LDY #RSRVD-1-ISDISKTEST2 LDA (ZVEC2),Y and another CMP ISDISK,Y eight just BNE NOFIND in case DEY BPL TEST }2; LDY #BUFOFF LDA (DOSVEC),Y CLC ADC #LBUF TAY LDA (DOSVEC),Y BMI PERROR No drive number; LDY #ZCRNAME+ }1 LDA (DOSVEC),Y STA GOZCR+1 INY LDA (DOSVEC),Y STA GOZCR+2 JSR GOZCR BEQ SETNUM Want no params;PERROR L }DY #M.SYNERR SKIPW;NOFIND LDY #M.NOFIND;EXIT JSR PRINT LDA #2 STA LMARGN CLI RTS;SETNUM LDY #COMFNAM+1 }Get new rd number LDA (DOSVEC),Y Validate it CMP #'1 and place it BCC PERROR CMP #'8+1 BCS PERROR STA DN } into message; LDY #SDRIVE-RDSIO Get current LDA (ZVEC),Y rd number and ORA #'0 convert to ascii; }LDY #143 Compare to CMP (DOSVEC),Y command drive BNE NODCHG Skip if not equal; STA RESTORE+1 Curdrv to }filespec LDA #12 Close #2 JSR EXCIOV x=$20; LDA # RESTORE STA } ICBAH,X LDA # PATHBF STA ICBLH,X LDA #48 Execute ?dir J }SR GOCIO into path buffer;; Execute cwd to new drive; on old path (xio 44); LDA DN Change filespec STA RES }TORE+1 LDY #143 Change command STA (DOSVEC),Y drive AND #$0F LDY #SDRIVE-RDSIO Set new STA (ZVEC),Y rd numb }er LDA #44 Cwd command JSR GOCIO;NODCHG LDA DN AND #$0F LDY #SDRIVE-RDSIO Set new STA (ZVEC),Y rd nu }mber LDX #SEC Redirection on CMP #1 Drive 1? BEQ SETDRV; LDX #CLC Redirection off LDY #'o STY ONOFF } LDY #'f Fix message STY ONOFF+1 STY ONOFF+2;SETDRV LDY #SDRIVE-RDSIO STA (ZVEC),Y TXA and adj }ust LDY #REDIR-RDSIO redirection STA (ZVEC),Y; LDY #M.RENUM BPL EXIT Go always; -----------------GOZCR } JMP $FFFF; -----------------EXCIOV LDX #$20 BPL GOCIO; -----------------PRINT LDA MSGAL,Y STA ICBAL LDA MSGA }H,Y STA ICBAH LDA MSGLL,Y STA ICBLL LDX #0 STX ICBLH LDA #11GOCIO STA ICCOM,X JMP CIOV;MSGAL .BYTE HELLO .BYTE >SYNERR .BYTE >RENUM .BYTE >NOFIND;MSGL }L .BYTE = max BCS NOTAUX then no } aux rd CPY #8 else if it's D8: BEQ SETUP it's the aux rdNOTAUXSDRIVE = *+1 Set on install CPY #1 go }if main rd BEQ SETUPMREDIR = * Not ramdisk SEC Opcode is Clc if BCC JMPSIO rd is not D1: DEC DUNIT }Redir to D(y-1):JSRSIO JSR $FFFF Execute INC DUNIT restore dcb TYA reset s flag RTS for callerS }ETUPM DEC ZAUXRD Flag main rd TAX main min=aux maxBANKS = *+1 set on install LDA #64 a=main maxSETUP };RESTORE .BYTE "D1:"PATHBF .BYTE 0 *= *+59; .OPT NO LIST .END set on install LDA #64 a=main maxSETUP LThis disk contains program and text files created or modified by John Picken of the Garden City Atari Computer Enthusiasts, V$}ictoria, B.C. Canada. If you have questions or comments regarding these programs, John can be reached at the following addres$}s.John Picken2214 Belmont AvenueVictoria, British ColumbiaCANADA V8R 3Z8ms, John can be reached at the following addres$N .OPT NO LIST,NO MLIST .OPT NO CLIST,NO EJECT; SAVE #D1:MDUP.M65; last rev 21 Nov 93;; PRINT #D1:MDUP.S(}RC;; All mods and patches are; controlled by this file.; Regardless of version,; MDOS.OBJ remains unchanged;; Asse(}mbly Control?NOMOD = 0 unmodified?XL = 1 xl rd + extras?XE = 2 xe rd + extras;?MOD (} = 0 Select version;; The original source files; LOAD #D1:DUPEQ.M65; LOAD #D1:MDUP1.M65; LOAD #D1:MDUP2.M65(}; LOAD #D1:MDUP3.M65; LOAD #D1:MDUP4.M65; LOAD #D1:MDOS5.M65; LOAD #D1:MDUP6.M65; LOAD #D1:MDOS7.M65;; This req'd(} for either mod; LOAD #D1:PATCHES.M65;; Both these req'd for xl mod; LOAD #D1:XLRD.M65; LOAD #D1:XLSETUP.M65;; All (}these req'd for xe mod; LOAD #D1:XEFIX.M65; LOAD #D1:XERD.M65; LOAD #D1:XESETUP.M65; ------------------------;; MYDO(}S 4.51 Source Code;; Copyright (C) 1988, 1989 by; WORDMARK Systems and the authors:;; Charles Marslett; 2705 Pinewood D(}r.; Garland, TX 75042; CIS: 73317,3662; UseNet: CHASM@KILLER.DALLAS.TX.US;; and;; Robert Puff; Suite 222; 2117 Buffa(}lo Rd.; Rochester, NY 14624; GEnie: BOB.PUFF;; This software may be freely used; and distributed provided that this; co(}pyright notice is left intact,; and provided that:;; (1) The source code in machine; readable form is provided with; any(} binary distribution, or made; available at no additional cost; to the recipients of the binary; distribution.;; (2) A b(}inary version of a; derivative work may be sold for; a reasonable distribution charge; (less than $50), and the source; c(}ode in machine readable format; must be available.;; (3) A derivative work may not; impose any restriction on the free; (}distribution of the source code.;; Modifications for ramdisks; and rom control by John Picken; .TITLE "MYDOS 4.5(}1 - DISK UTILITY"; .IF .NOT .DEF PORTB .INCLUDE #D1:DUPEQ.M65 .INCLUDE #D1:MACROS.M65 (} .ENDIF ;; Patches linking mdup into mdos; *= $070C .WORD RESEND start free memory; *= $0(}85E JMP INIT dup init entry point; *= ORIGIN LIST 0 .INCLUDE #D1:MDUP1.M65FNAME (} .BYTE 0 Allow for 40 *= *+39 char def dir;?FIXLEN .= 0 In case no patch .IF ?MOD=(}?XE .INCLUDE #D1:XEFIX.M65 .ENDIF ;; This portion moved from Mdup1; to permit the above mod. If the(}; above is not included, there; will be no changes from Resend; to Msbase inclusive;RESEND *= *+$0300 Allow 3 f(}ile buffers;; Subtract patch len from res; drivers so Dup org unchanged; *= *+$0800-?FIXLEN;MSBASE = *;(} LIST 0 .INCLUDE #D1:MDUP2.M65 LIST 0 .INCLUDE #D1:MDUP3.M65 LIST 0 )} .INCLUDE #D1:MDUP4.M65 LIST 0 .INCLUDE #D1:MDUP5.M65 LIST 0 .INCLUDE #D1:MDUP6.M65)} LIST 0 .INCLUDE #D1:MDUP7.M65DUPEND = *; .IF ?MOD .INCLUDE #D1:PATCHES.M65 )} .IF ?MOD=?XL LIST 0 .INCLUDE #D1:XLRD.M65 LIST 0 .INCLUDE #D1:)}XLSETUP.M65 .ELSE LIST 0 .INCLUDE #D1:XERD.M65 LIST 0 .)}INCLUDE #D1:XESETUP.M65 .ENDIF .ENDIF OFF ;?TBFREE = $2080-[RESEND+$0300]DUPLEN )}= DUPEND-DUPBASEMSLEN = DUPEND-MSBASE .OPT LIST ;XX .= ?FIXLEN memlo increaseXX .= ?TBFRE)}E room under Turbo .OPT NO LIST ; *= $02E0 .WORD MENUSL .END reaseXX .= ?TBFRE(d OFF; SAVE #D1:MDUP1.M65;;; SAVE #D2:MDUP1.M65;;; PRINT #D1:MDUP1.SRC;;;; LOAD #D1:MDUP2.M65 ON; Resident m-}dup code; Initialize mydos interface;INIT LDA # >DUPENT STA DOSVEC+1 LDA # =4.3 dO-}S;AFN .BYTE "D1:AUTORUN.SYS",$9B;; Open file;; Calling sequence:; JSR SOPEN; .BYTE AUX; .BYTE CMD; .WORD BUFFER A-}DDRESS;SOPEN SEC .BYTE $A9 Lda #imm opcode;; Do a read/write type i/o request;; Calling sequence:; JSR DOIO; .B-}YTE IOCBNO; .WORD BUFFER LENGTH; .BYTE CMD; .WORD BUFFER ADDRESS;DOIO CLC PLA STA RAMLO PLA STA RAMLO+1 LDY -}#1 LDA (RAMLO),Y BCC DOIO1; STA IAUX,X BCS XTRCB;DOIO1 TAX INY LDA (RAMLO),Y STA ILEN,X INY LDA (RAMLO-}),Y STA ILEN+1,X;XTRCB INY LDA (RAMLO),Y STA ICMD,X INY LDA (RAMLO),Y STA IBUF,X INY LDA (RAMLO),Y STA -}IBUF+1,X TYA CLC ADC RAMLO TAY LDA #0 ADC RAMLO+1 PHA TYA PHA JMP CIOV do i/o request;; If no dup.sy-}s, increment drive no.;RETRYOS INC DUPSYS+1 LDA DUPSYS+1 AND #$0F CMP #9 BCC RTYOSV; BNE GOTO1; CMP RAMDKU-} BEQ RTYOSV;GOTO1 LDA #'1 STA DUPSYS+1;RTYOSV TAX LDA DKTYPE-'1,X BEQ RETRYOS; BNE NOWMS;; Load program f-}unction;LDFILE JSR LDMEM LDX #$10 JSR TOVECT Load program or go to it .BYTE $2C Skip the ldy #1 instruction;; -}Standard exit point for programs;; Restore dos/dup init vector;DUPENT LDY #1;SAVERR STY CBSAV BIT STATE BVS GOD-}OS; BPL NOWMS; JSR CLOS10 JSR SOPEN .BYTE $08 Write mem.sav file .BYTE OPEN .WORD NMSAV BMI NOWMS; JSR D-}OIO .BYTE $10 .WORD MSLEN .BYTE PUTCHR .WORD MSBASE;NOWMS JSR CLOS10 JSR SOPEN Get dup.sys into memory .BYT-}E $06 .BYTE 39 .WORD DUPSYS BMI RETRYOS; LDA DOSINI STA INISAV LDA DOSINI+1 STA INISAV+1;GODOS JSR CLOSX -} JMP DOSOS Then start it up;; Save memory subroutine: write file body, init and run vectors;WDR JSR LDMEM Load mem-}.sav if need be;WDR1 LDX #$10 Write text to disk file JSR CIOV;WRERRO BMI SAVERR; LDX # IN-}ITAD STA VECTOR+1 STA VECTOR+3 (x,a)=middle word STX VECTOR+2;WR6BYT JSR DOIO .BYTE $10 .WORD 6 .BYTE PUTCHR- } .WORD VECTOR BMI WRERRO;RTS2 RTS;; Run at address;TOVECT JMP (VECTOR) To run at address;; Load mem.sav if nee-!}d be;LDMEM BIT STATE Load mem.sav? BPL NOLDMS; LDX #$20 JSR SOPEN .BYTE $04 .BYTE OPEN .WORD NMSAV BMI N-"}OLDMS; JSR DOIO .BYTE $20 .WORD MSLEN .BYTE GETCHR .WORD MSBASE;NOLDMS JMP CLOS20;NMSAV .BYTE "D1:MEM.SAV"-#},$9BEC .BYTE "E:"DUPSYS .BYTE "D1:DUP.SYS",$9BOPT .BYTE 0DUPFLAG .BYTE 0 Dup resident = $80INISAV .WORD MD-$}INITCBSAV .BYTE 0 Error code from prog executed;; Following moved to MDUP.M65; to allow inclusion of ramfix jkp;;-%}FNAME; .BYTE 0; *= *+39;RESEND; *= *+$0300;DRIVERS; *= *+$0800 MDUP.M65; to allow inclusion of ramfix jkp;;,M OFF; SAVE #D1:MDUP2.M65;;; SAVE #D2:MDUP2.M65;;; PRINT #D1:MDUP2.SRC;;;; LOAD #D1:MDUP3.M65 ON; Start of n1'}onresident portion of dup.sys;DATA *= *+80 Allocate buffer for bit map, etc.DELIM *= *+1PAR2 *= *+20 Par* buffers e1(}xpanded to 80 bytes from 32PAR3 *= *+80 by bob puff, version 4.5 (par2 was ok)BOOTBUF *= *+384 space for 3 boot sector1)}sTEMPBUF *= *+128 Temporary buffer for file open density init.;; *= DATA+512 use this org only if above allocs < 512 byt1*}es;UNNO *= *+1PTR *= *+1PTRSAV *= *+1IPTR *= *+1IPSAV *= *+1CBYTE *= *+1SECTOR *= *+2CSRC *= *+1CDES *= *+1CPYTYP 1+}*= *+1SWPFLG *= *+1RCNT *= *+1SECSIZ *= *+2FNPT *= *+1FNPT2 *= *+1PAR *= *+80 Real parameter (last)DUPBASE = *DOSS1,}YS .BYTE "D1:DOS.SYS",$9B;; Close (brutally) all iocbs and reopen screen;INITIO JSR CIOINV LDX #0 JSR SOPEN Ope1-}n screen as iocb #0 .BYTE $0C .BYTE OPEN .WORD ECJKP1 STX CDTMV3 Clear timer #3 STX CDTMV3+1 LDY #1 LDA #3 1.}STA CDTMF3 Set timer not done flag JSR SETVBV;WAITIM LDA CDTMF3 Done? BNE WAITIM No, continue looping RTS;; Di1/}sk utility program entry;DOSOS CLC CLD LDX #-3;HATLP INX INX INX LDA HATABS,X Reinstall E: handler to CMP10} #'E avoid deleting basiC programs BNE HATLP Started up by autorun.sys; LDA # EDITRV Removed by bob puff in 4.5 Change for scripts STA HATABS+2,X LDX #$FF STX BRKKEY Enable bre12}ak key; LDA # >MDINIT STA DOSINI+1 LDA # FNAME JSR PRTMSG;1>} JSR PRINT .BYTE $9B,$9B .BYTE "1-8.Dir of D1:-D8: *. Dir of D:",$9B .BYTE "A. Disk Directory K. Save Memory",$9B .1?}BYTE "B. Run Cartridge L. Load Memory",$9B .BYTE "C. Copy File(s) M. Run at Address",$9B .BYTE "D. Delete File(s) N1@}. Load MEM.SAV",$9B .BYTE "E. Rename File(s) "JKP4 .BYTE "O. Change Config.",$9B .BYTE "F. Lock File(s) P. Set Den1A}sity",$9B .BYTE "G. Unlock File(s) Q. Make Directory",$9B .BYTE "H. Write DOS Files R. Pick Directory",$9B .BYTE "I. I1B}nitialize Disk S. Set RAMdisk #",$9B .BYTE "J. Duplicate Disk V. Set Verify Flag",$9B .BYTE " ",$9B,0; LDY CBSAV BP1C}L MENUSL; JSR CIOER1 If load error, report it;; Select menu function;MENUSL LDX #$FF TXS INX STX OPT opt=1D}00 if no options STX SWPFLG STX CBSAV For dir scans, skip no extns. JSR CLOSX Close iocbS 1 and 2 LDX #$30 JSR 1E}CLOS2 and iocb 3 JSR PRINT .BYTE "Select Item ("JKP3 .BYTE "" .BYTE " for menu):",0 LDA #$40 Force uppe1F}r case STA SHFLOK ORA STATE STA STATE Say dup.sys in memory JSR CHRGET ** patch loc? CMP #$9B BNE CKITEM; J1G}MP SHMEN;CKFDIR CMP #'1 BCC CKFDD; JMP FASTDIR;CKFDD CMP #'* BNE BADITM; JMP FASTDD;CKITEM CMP #'9+1 1H}BCC CKFDIR; CMP #'A+NFUNC BCS BADITM; SBC #'A-1 BCS ITEMV;BADITM LDA #NFUNC;ITEMV ASL A TAY LDA DUPJT,Y1I} STA RAMLO LDA DUPJT+1,Y STA RAMLO+1 JMP PRTMEN Go to menu exit (with message);TCOMND = *UCOMND = *;NSI .BYTE1J} "No such item!",$9B,0 JMP MENUSL;DUPJT .WORD DIRLST-1,STCAR-1 .WORD CPYFIL-1,DELFIL-1 .WORD RENFIL-1,LKFIL-1 .WO1K}RD ULKFIL-1,WBOOT-1 .WORD FMTDSK-1,DUPDSK-1 .WORD SAVFIL-1,LDFIL-1 .WORD BRUN-1,MEMSAV-1 .WORD CONFGR-1,CHDISK-1 .W1L}ORD MKDIR-1,SETDIR-1 .WORD RAMDRV-1,TCOMND-1 .WORD UCOMND-1,VERIFY-1NFUNC = [*-DUPJT]/2 .WORD NSI-1GR-1,CHDISK-1 .W0k OFF; SAVE #D1:MDUP3.M65;;; SAVE #D2:MDUP3.M65;;; PRINT #D1:MDUP3.SRC;;;; LOAD #D1:MDUP4.M65 ON; * and 1-8.5N} fast directory list;FASTDD STA PAR+2 LDA #': STA PAR+1 BNE DOFDD;FASTDIR STA PAR+1 LDA #': STA PAR+2;DO5O}FDD LDA #'* STA PAR+3 STA PAR+4 LDA #'D STA PAR LDA #$9B STA PAR+5 ;fix the 174 errors in menu [Bob Puff ST5P}A CPYTYP STA DELIM BNE DODIRL;; A. Directory list;DIRLST .BYTE "Files to list, Destination?",$9B,0 LDA #$9B STA5Q} CPYTYP JSR GETFN JSR DEFPAR;DODIRL LDA # PAR JSR DBUF10 LDX #$10 STX CSRC Iocb1 is source J5R}SR OPDIR Open iocb1 as directory; LDA # >TEMPBUF+1 STA BUFAD+1 LDA # DELMSG LDA #DELE5X}TE BNE DOCMD;; F. Lock files;LKFIL .BYTE "Lock which file?",$9B,0 LDY # LKMSG LDA #LOCK BNE DOC5Y}MD Get file name then lock it;; G. Unlock files;ULKFIL .BYTE "Unlock which file?",$9B,0 LDY # ULMSG5Z} LDA #UNLOCK;DOCMD STY SECSIZ STX SECSIZ+1 PHA JSR GETFN JSR CKDSK LDX OPT CPX #'N If /N then do it the5[} easy way BEQ AFTCHK; JSR PRINT .BYTE "Answer ",$27,"Y",$27 .BYTE " or ",$27,"N",$27,$9B,0 PLA JSR SETSCN;RDFN5\} JSR SCNDIR BCS DELX If end of directory; LDA SECSIZ LDX SECSIZ+1 JSR PRTMSG LDA # PAR JSR PR5]}TMSG JSR PRINT .BYTE '?,0 JSR CHRGET CMP #'Y BNE NODELT; LDX #$20 JSR CIOCL Delete the file then;NODELT 5^}JMP RDFN;SMPLCMD PHA JSR GETFN Get file name JSR CKDSK Verify a disk file;AFTCHK PLA;ISSCMD STA ICMD+$105_} LDX #$10 JSR CIOCL LDA ICMD+$10 CMP #41 BEQ SETFNJ;DELX JMP MENUSL;SETFNJ JMP SETFNM;JCANTDV JMP CANTDV5`};JBADRN JMP BADRN;; E. Rename file(s);RENFIL .BYTE "File to rename, new name?",$9B,0 JSR GETFN JSR CKDSK LDY 5a}PTR LDA DELIM CMP #', BEQ CKNAM2; CMP #32 BNE JBADRN;CKNAM2 INY LDA (FNPTR),Y CMP #': BEQ JCANTDV; CM5b}P #'> check for sparta type BEQ JCANTDV; CMP #'0 BCC DOREN; CMP #'z+1 BCC CKNAM2;DOREN LDA #RENAME BNE 5c}ISSCMD;; Q. Make a directory;MKDIR .BYTE "Full directory name?",$9B,0 LDX #8 STX IAUX+$10 LDA #34 Make dir. c5d}ommand JMP SMPLCMD;; R. Set directory;SETDIR .BYTE "Directory to be used as ",$27,"D:",$27,"?",$9B,0 JSR GETFN JS5e}R CKDSK LDY PTR Drive or null? CPY #4 BCC CPYDNE; LDA #41 JMP ISSCMD;SETFNM LDX #0 LDA PTR EOR #4 BE5f}Q ZAPNAM; LDY #1 LDA #': CMP (FNPTR),Y BNE ALLNEW If not subdirectory;FNDEND INX LDY FNAME-1,X BNE FNDEND 5g}End of old dir?; STA FNAME-1,X;ALLNEW INY BEQ CPYDNE; CMP (FNPTR),Y BNE ALLNEW; DEX point back at ':5q}B%DOS SYSB*)DUP SYSB<SCART SRCBABAT COMBWARM COMB MISC TX3BRDNUMBERDOCBRDNUMBERCOMB+RDNUMBERSRCBREADME BMDUP SRCBMDUP1 SRCB'&MDUP2 SRCB;MMDUP3 SRCB5MDUP4 SRCBMDUP5 SRCB:MDUP6 SRCB_MDUP7 SRCByDUPEQ SRCBMACROS SRCB PATCHES SRCB XEFIX SRCBXERD SRCSXESETUP SRC+XLRD SRCA=XLSETUP SRC BEQ CPY1ST if start, no : to preserve;CPYNAM INX;CPY1ST INY LDA (FNPTR),Y;ZAPNAM STA FNAME,X BNE CPYNAM;5r} JMP MENUSL;CPYDNE JSR ERRXIT .BYTE "Invalid directory!",$9B,0;; Single file (device) copy;TOERR1 JMP CIOER1;5s}SGCOPY LDX #$10 STX CSRC Source is iocb1 JSR SOPEN .BYTE 4 input .BYTE OPEN open function .WORD PAR Inp5t}ut device name BMI TOERR1; JMP SGFCPY;; C. Copy files;DUPFIL = *CPYFIL .BYTE "File source, destination?",$9B,0 5u}LDA #32 STA PAR3+2 Define char 3 of device name LDA #$9B STA CPYTYP JSR GETFN Get source file name; LDA # >DUPE5v}ND STA BUFAD+1 LDA # DUPEND5w} STA BUFLEN+1; JSR DEFPAR LDA DELIM BMI SFNAME; JSR GETFN2 LDA #0;SFNAME STA SWPFLG ASL WARMST LDA FNPT5x}R+1 STA IBUF+1+$20 LDA FNPTR STA IBUF+$20 LDA PAR Disk device? CMP #'D BNE SGCOPY; LDA # PAR5y} JSR DBUF10; LDA #'? LDY #11;QQQ STA PAR2-1,Y DEY BNE QQQ; JSR CWFSD LDX #$10 JSR OPDIR Open iocb1 as5z} directory; LDY #$FF;CPSCL1 INY LDA (FNPTR),Y STA PAR3,Y BNE CPSCL1;CPSCL2 DEY LDA (FNPTR),Y CMP #'> 5{} account for sparta type BEQ CPSCL3; CMP #': BNE CPSCL2;CPSCL3 INY STY FNPT2 LDA (FNPTR),Y BEQ OPINP; LDX5|} #0 Scan -par- starting at 1st byte;MYMSK LDA (FNPTR),Y BMI WCOPYB ;1 filespec copy??; CMP #'* BEQ MVNML; 5}} CMP #'. BCC WCOPYB; BNE DOSTOR; LDA #32 DEY;DOSTOR STA PAR2,X INY;MVNML INX CPX #8 BCC MYMSK;SKPPR5~}D INY;MVEXT LDA (FNPTR),Y BEQ WCOPYB; CMP #'. BEQ SKPPRD If a period, skip over it; CMP #'* BEQ OPINP; 5}CMP #32 BEQ WCOPYB; CMP #', BEQ WCOPYB; CMP #$9B BEQ WCOPYB; INY;SAVBLK STA PAR2,X INX CPX #11 BCC M5}VEXT; BCS OPINP;WCOPY JSR CWFSD;OPINP JSR SCNDIR BIT CBYTE BMI OPINP; BCC WCNEXT; JMP MENUSL;WCOPYB 5}LDA #32 BNE SAVBLK;WCNEXT LDA # >PAR3 STA IBUF+$30+1 LDA # PAR JSR PRTMSG JSR PRINT .BYTE "-- >",0 LDA # PAR3 JSR PRTMSG LDA OPT CMP #'Q BNE DOONE; JSR CHRGET CMP #'Y BNE SKPCOP;DOONE LDA IAUX+5+$105} STA IAUX+5+$20 LDX #$20 STX CSRC LDA #4 STA IAUX,X LDA # PAR JSR DEFBUF LDA #OPEN JSR SCMD 5} Open the source file BMI CPYERR; LDX #7;CKFDOS LDA CKDTST-1,X File name = dos.sys? CMP PAR3+2,X BNE NOXDOS No,5} handle it normally then DEX BNE CKFDOS;; Copying dos.sys, set up for rename and load boot sectors; LDA PAR3+1 STA5} DOSRNM+1 Stash the unit number in the rename buffer STA DOSSYS+1 LDA #$60 Change destination name to diamond-OS STA5} PAR3+3; CLC Read boot sectors JSR DOBOOT Do boot i/o;; This really copies the file;NOXDOS LDA # >PAR3 5}STA IBUF+$30+1 LDA # PAR STA IBUF+$109}+1 LDA # DOSSYS JSR D9}BUF10 LDA #8 Open output=write dos.sys STA IAUX+$10 JSR ANYDEN Open and write dos.sys (any density) JSR CLOS109} PLA STA NMSAV+1 STA DUPSYS+1;; Write dup.sys here; LDY #$70 LDA # DUPBASE JSR D2B8A; LDA 9}# >DUPFNM STA IBUF+$10+1 LDA # DUPEND-1 STA HDBUF+3 LDA # DUPLEN STA HDBUF+5 LDA # DATA+10 STA BUFAD+1 LDA # DUPEND BCS E9}NUF;JNOMEM JSR ERRXIT .BYTE "Not enough memory!",$9B,0;NXTSCT BCS D272E; STA (BUFAD),Y LDA #$FE INC BUFAD 9}BNE D272E; INC BUFAD+1;D272E INC DATA+5 BNE D2736; INC DATA+6;D2736 RTS;ENUF LDA PTR BEQ SKRDVT If pos9}, skip reading vtoc; LDA # <360 LDX # >360 STA DAUX STX DAUX+1 LDA # DATA STA DBUF STX DBUF+1 9} JSR RSEC1 BPL NOERFD; JMP CIOER1;NOERFD CLC LDA DATA+1 ADC #12 Add in the boot, map and dir sectors STA D9}ATA+1 BCC CK2BIT Then take care of second bit map if nec.; INC DATA+2 Else, bump upper byte;CK2BIT LDA DATA CMP 9}#4 BCC SKRDVT If single sector, skip reading second; INC DATA+1 CLC LDA DBUF ADC DLEN STA DBUF LDA DBUF+1 A9}DC DLEN+1 STA DBUF+1 DEC DAUX JSR RSEC1;SKRDVT LDA #0 STA DAUX+1 LDA #1 STA DAUX LDA DATA+10 STA CBYTE 9}LDA #8 STA IPTR LDA # >DATA+10 STA VECTOR+1 LDA # DUPEND STA DBUF+1 LDA # DOSSYS JSR DEFBUF LDA #FORMAT STA ICMD+$20 LDA CDES ORA #'0 Convert drive no. 9}to ascii STA DOSSYS+1 JSR CIOCL;NOFORM DEC CPYTYP then, make a write LDA PTRSAV STA VECTOR LDA PTR STA VECTO9}R+1 LDA SECTOR STA DAUX LDA SECTOR+1 STA DAUX+1 LDA IPSAV STA IPTR LDA CBSAV STA CBYTE JMP LRS STA VECTO8q OFF; SAVE #D1:MDUP5.M65;;; SAVE #D2:MDUP5.M65;;; PRINT #D1:MDUP5.SRC;;;; LOAD #D1:MDUP6.M65 ON; K. Save fi=}le command;SAVFIL .BYTE "SAVE:filename,start,end(,init(,run))",$9B,0 JSR GETFN STY IBUF+$10 STA IBUF+1+$10 LDA OP=}T PHA JSR GETNO2 CPX # >DUPEND LDY #$70 BCS DSLMFG; LDY #$60 Force mem.sav to memory before saving image;DS=}LMFG JSR D2B8A JSR GETNO2 STA HDBUF+2 STX HDBUF+3 SEC SBC HDBUF STA HDBUF+4 TXA SBC HDBUF+1 BPL ADDOK; =} JSR ERRXIT .BYTE "Invalid START-END range!",$9B,0;ADDOK STA HDBUF+5 INC HDBUF+4 BNE INCOK; INC HDBUF+5;INCOK=} LDA #0 CPY #CR BEQ NINTAD; JSR GETNO2 STA INITAD STX INITAD+1 ORA INITAD+1 BEQ NINTAD; LDA #1 Set go=}t init flag;NINTAD STA TEMP CPY #CR BEQ NRUNAD; JSR GETNO2 STA RUNAD STX RUNAD+1 ORA RUNAD+1 BEQ NRUNAD;=} INC TEMP INC TEMP set got run flag;NRUNAD PLA;WRDUP LDY #0 STY OPT DEY STY VECTOR STY VECTOR+1;; Ope=}n the program file; LDY #8 CMP #'A BNE OPTOK1; DEC OPT INY;OPTOK1 STY IAUX+$10 LDX #$10 JSR ANYDEN Open =}file output/any density BMI KIOERR; LDA OPT BEQ FULHDR If no append; JSR DOIO Write short header .BYTE $10 =}.WORD 4 .BYTE PUTCHR .WORD VECTOR+2 BMI KIOERR;KEXIT LDA HDBUF+4 STA ILEN+$10 LDA HDBUF+5 STA ILEN+1+$10 LD=}A HDBUF STA IBUF+$10 LDA HDBUF+1 STA IBUF+1+$10 BIT STATE BMI KMSAV; JMP WDR1;KMSAV JMP WDR;FULHDR JSR W=}R6BYT BPL KEXIT;KIOERR JMP CIOER1;D2B8A STA HDBUF STX HDBUF+1 STY STATE RTS;; N. Load program into mem.sav=};MEMSAV .BYTE "Load MEM.SAV from what file?",$9B,0 LDA STATE ORA #$80 Turn on mem.sav flag BMI LOADIT;TOMEN J=}MP MENUSL;; L. Load user file function;BDLDFL LDY #180;BLOWUP JMP CIOER1;LDFIL .BYTE "Load from what file?",$9B=},0 LDA STATE AND #$7F Turn off mem.sav flag;LOADIT STA STATE JSR GETFN STY IBUF+$10 STA IBUF+1+$10 LDX DAT=}A+3 Just a cr? BEQ TOMEN; LDA #4 STA IAUX+$10 LDX #$10 JSR ANYDEN JSR DOIO .BYTE $10 .WORD 2 .BYTE GETCHR=} .WORD DATA BMI BLOWUP; LDA DATA AND DATA+1 CMP #$FF BNE BDLDFL; LDA DATA+3 BEQ TOMEN; LDA OPT EOR #'N=} BEQ GOTN; LDA #0 STA WARMST LDA #3;GOTN EOR #7 STA IAUX+$10 LDA #39 STA ICMD+$10 LDA # C=}IOV BNE BRUN1;; B. Run cartridge;STCAR .BYTE 0 LDA $BFFD EOR #$AA STA $BFFD CMP $BFFD BNE NORAM If addres=}s space is not ram EOR #$AA STA $BFFD If ram, no cartridge;NOCART JSR ERRXIT .BYTE "NO CARTRIDGE!",$9B,0;NORAM=} LDX $BFFC BNE NOCART If not atari cartridge; LDA CARTST LDX CARTST+1;BRUN1 STA VECTOR STX VECTOR+1 LDA INIS=}AV STA DOSINI LDA INISAV+1 STA DOSINI+1 LDA STATE AND #$BF STA STATE JMP LDFILE;; M. Run at address;BRUN =}.BYTE "Run from what address?",0 JSR GETLIN LDA (FNPTR),Y CMP #$9B No address? BEQ BRUN2 If so, abort; JSR GE=}TNO2 CPY #$9B BNE BRUN2; LDY #0 STY WARMST BEQ BRUN1;BRUN2 JSR ERRXIT .BYTE "Address must be 1-4 hex digits!=}",$9B,0PY #$9B BNE BRUN2; LDY #0 STY WARMST BEQ BRUN1;BRUN2 JSR ERRXIT .BYTE "Address must be 1-4 hex digits!< OFF; SAVE #D1:MDUP6.M65;;; SAVE #D2:MDUP6.M65;;; PRINT #D1:MDUP6.SRC;;;; LOAD #D1:MDUP7.M65 ON; P. Change A}disk format;CHDISK .BYTE "Drive, new density:",0 JSR GETDN Get drive no. LDA DELIM CMP #$9B Drive number only?A} BNE CHDSK2 If so, change default;BADPCMD JSR ERRXIT .BYTE "Drive unchanged.",$9B,0;CHDSK2 LDY PTR LDA (FNPTR)A},Y TAX LDY #1 LDA (FNPTR),Y CMP #'9 BCS BADPCMD; SBC #'1-1 BCC BADPCMD; TAY INY STY UNNO LDA #1 CPXA} #'S BEQ TOSGL; CPX #'D BNE BADPCMD; ASL A;TOSGL STA DKTYPE-1,Y JSR DOFSIN JMP SHMEN Then show changed meA}nu;; O. Configure system or disk drive;CKBANKS SEI was Chkbanks LDY #0 This is bob code STY $D40E unA}commented as STY $D20E per usual LDA $D301 PHA We validate the memory mapping ability LDX #$FF of the boA}x we are running in;CKBL1 STY $D301 LDA $4000 STA MAPBUF,Y STX $4000 TXA STA MAPBUF+256,Y INY BNE CKBL1 DA}EX STX $D301 STX 0 STX $4000 STX $8000 STX $C000; LDX #0;CKBL2 STY $D301 LDA $4000 CMP #$FF BNE CKBNOTA} INX STX $4000 TXA;CKBNOT STA MAPBUF+256,Y INY BNE CKBL2 STX RDKLMT; LDX #1;CKBL8 TXA LDY #$FF;CKBA}L6 CMP MAPBUF+256,Y BEQ CKBFO DEY CPY #$FF BNE CKBL6;;; NOP was a deyCKBL9 STY $D301 LDA MAPBUF,Y STA $40A}00 DEY CPY #$FF BNE CKBL9 PLA STA $D301 LDA #$C0 STA $D40E LDA $10 STA $D20E CLI RTS;CKBFO TYA STA}A MAPAGE-1,X INX CPX #65 BCC CKBL8; LDY #$FE BNE CKBL9;SPCPORT JSR PRINT Handle non-standard port addressesA} .BYTE "Control Address(HEX)?",0 JSR GETLIN JSR GETNO2 TAY ORA VECTOR+1 BNE SAVADR; BEQ RAMDSU If < $0100, askA} again!; JMP SAVADR Stash the specified address;; Test for ramdisk, and configure it;GETRDK JSR PRINT .BYTE "RAMA} disk present?",0 JSR CHRGET LDY #$FF CMP #'N BNE RAMDSU; JMP NOFAST;RAMDSU JSR PRINT .BYTE "[A]xlon, [X]E oA}r [C]ustom RAMdisk?",0 JSR CHRGET CMP #'C BEQ SPCPORT; LDY # <$D301 LDX # >$D301 CMP #'A BNE SAVADR; LDY # A}<$CFFF LDX # >$CFFF CMP #'X BNE RAMDSU Keep on trying!;SAVADR STY RDAD1 STY RDAD2 STY RDAD3 STX RDAD1+1 STA}X RDAD2+1 STX RDAD3+1 CMP #'X BNE OKP0; JSR CKBANKS LDA RDKLMT BNE OKP1 JSR PRINT .BYTE "No extra memory avaA}ilable!",$9B,0 LDY #0 JMP NOFAST;OKP0 JMP RMDSU2;OKP1 LDX #0 STX NMLMAP STX FR0+1 ASL A ASL A ROL FR0+1A} ASL A ROL FR0+1 ASL A STA FR0 ROL FR0+1 JSR IFP JSR FASCII JSR PRINT .BYTE "Use default config for ",0 LA}DY #0;OKP2 LDA (INBUFF),Y BMI OKP3; INY BNE OKP2;OKP3 AND #$7F STA (INBUFF),Y INY LDA #0 STA (INBUFF),A}Y LDA INBUFF LDX INBUFF+1 JSR PRTMSG JSR PRINT .BYTE "K?",0 JSR CHRGET CMP #'N BEQ RMDSU2; JMP DVNOQ;RMDA}SU2 JSR PRINT .BYTE "Size(K)?",0 JSR GETLIN JSR GETNUM LSR VECTOR+1 ROR A LSR VECTOR+1 ROR A LSR VECTOR+1 A} ROR A LSR VECTOR+1 ROR A BNE SAVRDS LDA #4;SAVRDS STA RDKLMT;GETSEQN JSR PRINT .BYTE "Page sequence?",0 A}JSR GETLIN JSR GETNO2 CPY #CR BNE FSNUM; BEQ RSEQ;DVNOQ JSR PRINT .BYTE "RAM disk drive no?",0;GETRDRV JSRA} CHRGET LDY #9 ;ASSUME 9 CMP #'0 BCC NOFAST if digit, change ramdisk code; CMP #'9 BCS NOFAST; AND #$0F A} TAY;NOFAST STY RAMDKU Set ramdisk unit no. RTS;RSEQ TAY LDX PGMAP,Y STX NMLMAP CPY #3 BCS CPAXSQ; LDA A}SQMAP,Y LDX #0;CPY0 ROL A ROL A PHA ROL A ROL A ROL A AND #$0C TAY;CPY1 LDA SQTAB,Y STA MAPAGE,X A}INX INY TXA AND #3 BNE CPY1; PLA CPX #16 BNE CPY0;CPSEQ LDA SQTAB,X STA MAPAGE,X INX CPX #64 BNE CA}PSEQ; BEQ DVNOQ;CPAXSQ LDX #64;AXSQL DEX TXA STA MAPAGE,X BNE AXSQL; BEQ DVNOQ;FSNUM LDX #0 PHA TA}XA;FSNCL STA DATA+256,X INX BNE FSNCL; PLA;FSLP1 STX UNNO CPY #CR BEQ TONML; STA DATA+256-64,X TAX B}LDA DATA+256,X BNE BADSEQ; DEC DATA+256,X LDY PTR LDA (FNPTR),Y CMP #CR BNE FSLP4; JSR GETLIN;FSLP4 JSR GB}ETNO2 LDX UNNO INX CPX #64 BNE FSLP1;TONML CPX RDKLMT BNE WRONG; STA NMLMAP;UPDLP1 DEX LDA DATA+256-64B},X STA MAPAGE,X TXA BNE UPDLP1; JMP DVNOQ;BADSEQ JSR PRINT .BYTE "Duplicated sequence number!",$9B,0 JMP GETB}SEQN;WRONG JSR PRINT .BYTE "Wrong number of entries!",$9B,0 JMP GETSEQN;PGMAP .BYTE $00,$00,$00,$FF,$FF,$FFSQMAPB} .BYTE $9C,$D8,$4B,$FF,$FF,$00;SQTAB .BYTE $A3,$A7,$AB,$AF .BYTE $C3,$C7,$CB,$CF .BYTE $E3,$E7,$EB,$EF .BYTE $83,B}$87,$8B,$8F; .BYTE $A1,$A5,$A9,$AD .BYTE $C1,$C5,$C9,$CD .BYTE $E1,$E5,$E9,$ED .BYTE $81,$85,$89,$8D; .BYTE $A2,$B}A6,$AA,$AE .BYTE $C2,$C6,$CA,$CE .BYTE $E2,$E6,$EA,$EE .BYTE $82,$86,$8A,$8E; .BYTE $A0,$A4,$A8,$AC .BYTE $C0,$C4,B}$C8,$CC .BYTE $E0,$E4,$E8,$EC .BYTE $80,$84,$88,$8C;CONSYS JSR PRINT .BYTE "Verify WRITEs?",0 JSR DOVRFY JSR PRB}INT .BYTE "Number of File Buffers?",0 JSR GETLIN JSR GETNUM TAX BEQ SKPFCT; CMP #17 BCS SKPFCT; STA FILES B } Set number of files (0-16);SKPFCT JSR GETRDK JSR MDINIT Reinitialize dos3 JMP DOSOS;ZAPDRV LDA #$D2 .BYTE $2CB } Skip 2 bytes;SET52 LDA #$52 LDY UNNO STA DRVDEF-1,Y JSR CLRHDS;CONXIT JMP MENUSL;CONFGR .BYTE "Drive numB }ber or " .BYTE "" .BYTE ':,0 JSR CHRGET Get drive number CMP #$9B If return, go to system configuration BB }NE CONDRIV; JMP CONSYS;CONDRIV CMP #'9 BCC SAVDVN;TOBADP JMP BADPCMD;SAVDVN SBC #'1-1 BCC TOBADP; TAY B } INY STY UNNO LDA #0 Then zero configuration byte STA DRVDEF-1,Y; JSR PRINT .BYTE "Remove drive?",0 JSR CHRB}GET CMP #'Y BEQ ZAPDRV; JSR PRINT .BYTE "Is drive configurable?",0 JSR CHRGET CMP #'Y If no, set to $52 and B}exit BNE SET52; JSR PRINT .BYTE "High capacity drive?",0 JSR CHRGET CMP #'Y BEQ GETHCD; JSR PRINT .BYTE "IsB} drive double sided?",0 JSR CHRGET CMP #'Y BNE SETSS; LDA #$01 JSR ORDRV;SETSS JSR PRINT .BYTE "Tracks/side?B}",0 JSR GETLIN JSR GETNUM CMP #35 BEQ SET35; TAY LDA #$30 CPY #77 BEQ SETTKS; LDA #$20 CPY #80 BEQ SEB}TTKS; LDA #$10 CPY #40 BNE SETSS;SETTKS JSR ORDRV;SET35 JSR PRINT .BYTE "Step rate?",0 JSR CHRGET CMP #'B}4 BCS SET35; SBC #'0-1 BCC SET35; ASL A JSR ORDRV JSR CLRHDS JMP MENUSL;GETHCD JSR PRINT .BYTE "Drive sB}ize (in sectors)?",0 JSR GETLIN JSR GETNUM CPX #0 BEQ GETHCD Invalid size; PHA LDY UNNO LDA #$12 STA DRVDEFB}-1,Y LDA #2 STA DKTYPE-1,Y PLA JSR SETHDS JMP MENUSL;; S. Set Ramdisk Drive Number;RAMDRV .BYTE "RAM disk driB}ve no?",0JKP6 JSR GETRDRV JMP MENUSL;; V. Set Verify Flag on or off;VERIFY .BYTE "Verify WRITEs?",0 JSR DOVRFY B} JMP MENUSL;DOVRFY JSR CHRGET LDX #'W Assume yes! CMP #'N BNE DOVFY; LDX #'P;DOVFY STX WRCMD Save the B}write command in dos RTS;ORDRV LDY UNNO ORA DRVDEF-1,Y STA DRVDEF-1,Y RTS;CLRHDS LDX #0 TXA;SETHDS LDY B}UNNO STA HDTAB-1,Y TXA STA HDTAB+8-1,Y JMP DOFSIN-1,Y STA DRVDEF-1,Y RTS;CLRHDS LDX #0 TXA;SETHDS LDY @: OFF; SAVE #D1:MDUP7.M65;;; SAVE #D2:MDUP7.M65;;; PRINT #D1:MDUP7.SRC;;;; LOAD #D1:MDUP.M65 ON; Put a singlF}e character on the screen;CHRPUT LDX #PUTCHR STX ICMD LDX #0 STX ILEN STX ILEN+1 JMP CIOV;; Put message to thF}e screen;PRTMSG STA RAMLO STX RAMLO+1;PRTNXT LDX #0 LDA (RAMLO,X) BEQ PRTXIT; JSR CHRPUT;PRTENT INC RAMLF}O BNE PRTNXT; INC RAMLO+1 BNE PRTNXT;PRTXIT RTS;; Print an in-line string;PRINT PLA STA RAMLO PLA STA F}RAMLO+1;PRTMEN JSR PRTENT LDA RAMLO+1 PHA LDA RAMLO PHA RTS;; Read a byte from the keyboard;CHRGET JSR XEF}424 fetch the byte CPY #0 BMI KILLRD if break or eof, abort command; CMP #'z+1 ;> lower case z? BCS NCHGCS CMF }P #'a ;< lower case a? BCC NCHGCS; SBC #$20 convert to upper case;NCHGCS PHA save it CMP #$9B BEQF!} CHRXIT if eol, echo it; JSR CHRPUT else, echo it LDA #$9B followed by eol;CHRXIT JSR CHRPUT PLA RestF"}ore for program RTS then exit;KILLRD JSR CHRPUT Move to next line and JMP MENUSL exit without return to comF#}mand;XE424 LDX #$70 Get a character from the keyboard [Bob Puff] JSR CLOS2 Close iocb7; JSR SOPEN Open iocb7 F$}for keyboard input .BYTE 4 .BYTE OPEN .WORD KDEV; JSR DOIO get a character .BYTE $70 iocb7 .WORD 0 BuffF%}er length (0=return 1 byte in ACC) .BYTE GETCHR .WORD 0 Buffer address (unused) PHA save the character for F&}a sec.; LDX #$70 JSR CLOS2 Close iocb7 again; PLA get character back RTS that's all, folks!;KDEF'}V .BYTE "K:",$9B Keyboard handler addr.;CLOSE7 JSR DOIO close iocb #7 .BYTE $70 .WORD 0 .BYTE $0C .WORD 0 F(}RTS;; Raw sector read/write functions;RSEC1 LDA CSRC;RSEC2 CLC;SECTIO STA DUNIT LDX SECSIZ+1 INX STX SECDF)}AT;BOOT1 LDX #3 STX RCNT;CLD1 LDX SECDAT PHP JSR DKIO2 BPL DRTS; CMP #$80 BEQ TOERR2; PLP DEC RCNTF*} BPL CLD1; PHP;TOERR2 PLP JMP CIOER1;DRTS PLP RTS;; Boot sector i/o routine (used to copy dos.sys);DOBOOTF+} LDA # >BOOTBUF-128 STA DBUF+1 LDA # IDD JSR PRTMSG JSR CHRGET LDX CDES JSR RESET;WRFILE LDX CDES BNE DOWRFI; F3} JSR CLEARIT LDX #$00;DOWRFI LDA IOCB,X open? BPL PUTOUT yes, write next block; LDX OPT LDA #8 CPX #'A aF4}ppend? BNE DOPO1; LDA #9;DOPO1 LDX CDES STA IAUX,X JSR ANYDEN open the output file BMI TOCIOR;PUTOUT LDX F5}CDES LDY CSRC LDA ILEN,Y STA ILEN,X LDA ILEN+1,Y STA ILEN+1,X LDA IBUF,Y STA IBUF,X LDA IBUF+1,Y STA IBUF+1F6},X LDA #PUTCHR STA ICMD,X JSR CIOCL write next block of data;NOOUTP LDX CSRC LDA ISTAT,X eof? CMP #$88 BEQ F7}CPYXIT; LDA SWPFLG BPL RECOPY; LDA # ISD JSR PRTMSG JSR CHRGET LDX CSRC JSR RESET JMP RECOPYF8};COPYF LDX CSRC STA ICMD,X LDA #$9B STA TOGGL;RECOPY LDX CSRC LDA #0 STA TEMPBUF+22 LDA BUFAD LDY BUFAD+F9}1 JSR DEFBUF LDA BUFLEN STA ILEN,X LDA BUFLEN+1 STA ILEN+1,X JSR CIOV Read directory data BPL TOCPFL; CPYF:} #$88 End of file? BNE TOCIOR If error, abort;TOCPFL JMP COPYFL;TOCIOR JMP CIOER1;CPYXIT LDX CDES BEQ NOTF;}CL; JSR CLOS2;NOTCL LDX CSRC JMP CLOS2;; Fix up dos copy operation;DLKMSK = *-1 .BYTE $03,$FFDLKLOC = *-1 F<}.BYTE $7D,$FD;FIXUPDOS LDX SECDAT Stash sector size info STX SECDAT-$0700+BOOTBUF LDA DLKLOC,X Stash link location iF=}n the sector STX DLINK-$0700+BOOTBUF LDY #$14;NOTRITE LDA #$29 And command code;FNDAND INY BMI NOAND; CMPF>} BOOTBUF-1,Y BNE FNDAND; LDA BOOTBUF,Y CMP #$03 BEQ ANDOK; CMP #$FF BNE NOTRITE;ANDOK LDA DLKMSK,X Stash thF?}e mask for 10 bit or 16 bit links STA BOOTBUF,Y;NOAND SEC Write boot sectors JSR DOBOOT Do boot i/o LDX #$F@}30 Use the destination iocb ($30 is always ok) JSR SOPEN If copying dos.sys (really 'diamond'os.sys) .BYTE 0 AuxFA} .BYTE DELETE Cmd .WORD DOSSYS Filename -- delete existing dos.sys; LDX #$30 Use the destination iocb ($30 is alwayFB}s ok) JSR SOPEN .BYTE 0 .BYTE RENAME .WORD DOSRNM Make new one RTS;; Scan directory and build the next file nameFC}; exit with not-equal if at end;SCNDIR LDA # DATA JSR DBUF10 LDA #GETREC STA ICMD+$10 LDA #32 STFD}A ILEN+$10 LDA #0 STA ILEN+1+$10 STA CBYTE Assume not a directory JSR CIOCL Read a file name LDA DATA+1 CMP #FE}': BCS NOTDIR; CMP #'0 BCS SCNDX;NOTDIR BEQ GOTSPC; LDA DATA+10 CMP CBSAV BNE NOTSYS;GOTSPC DEC CBYTE;FF}NOTSYS LDX FNPT LDY #2;MDN1 LDA DATA,Y CMP #32 BEQ MDN2; STA PAR,X INX INY CPY #10 BCC MDN1;MDN2 FG}LDA #'. STA PAR,X INX LDY #10;MDN3 LDA DATA,Y CMP #32 BEQ MDN4; STA PAR,X INY INX CPY #13 BCC MDN3;FH}MDN4 LDA #'. CMP PAR-1,X BNE MDN5 DEX;MDN5 LDA #0 Terminate file name STA PAR,X CLC;SCNDX RTS;GETFI}LIN LDA # DATA+3 STA FNPTR+1 STA IBUF+1 LDA #GETREC STA ICMD LDX #1 STXFJ} ILEN+1 DEX STX ILEN LDY #0 STY PTR;CIOCL JSR CIOV TYA BMI CIOER1; RTS;CIOER1 STY FR0 LDA #0 STA FFK}R0+1 JSR IFP JSR FASCII LDY #0 LDA (INBUFF),Y STA CIERC INY LDA (INBUFF),Y STA CIERC+1 INY LDA (INBUFF),YFL} AND #$7F STA CIERC+2 JSR ERRXIT .BYTE "Error -- ";CIERC .BYTE "000",$9B,0;HEXDEF LDY DATA+3 CPY #$9B BNEFM} GETNO2 RTS;GETNUM CLC .BYTE $24 Skip single byte;GETNO2 SEC ROR TEMP2 JSR NXTFLD STY VECTOR STY VECTORFN}+1;GETND LDA (FNPTR),Y INY CMP #'F+1 Is it a digit BCS GETNDE; SBC #'0-1 Note that cy=0 BCC GETND1; CMPFO} #10 ;0-9? BIT TEMP2 BPL GOT10; BCC GOT1 Yes, shift into number; CMP #17 A-F? BCS GOT16 Yes, handle FP}it;GETND1 SEC ADC #'0-1;GETNDE STY PTR TAY LDA VECTOR LDX VECTOR+1 RTS;GOT10 BCS GETND1; PHA ASL VFQ}ECTOR ROL VECTOR+1 LDA VECTOR LDX VECTOR+1 ASL VECTOR ROL VECTOR+1 ASL VECTOR ROL VECTOR+1 CLC ADC VECTOR FR} STA VECTOR PLA PHP CLC Bob Puff ADC VECTOR STA VECTOR TXA ADC VECTOR+1 PLP ADC #0 STA VECTOR+1 FS} JMP GETND;GOT16 SBC #7;GOT1 ASL VECTOR ROL VECTOR+1 ASL VECTOR ROL VECTOR+1 ASL VECTOR ROL VECTOR+1 ASL FT}VECTOR ROL VECTOR+1 ORA VECTOR STA VECTOR JMP GETND;; Getfn -- read a line, get filename from it;GETFN LDA #0 FU} STA DOSRNM+1 JSR GETLIN BEQ WCTSTL;; Getfn2 -- extract a filename from a line already read in; x is the offset in theFV} buffer;GETFN2 JSR NXTFLD;WCTSTL LDA (FNPTR),Y INY CMP #'? BEQ SETWC If ? or * found,; CMP #'* BNE CKEOFFW}N Set flag, find first match;SETWC LDA #0 STA CPYTYP BEQ WCTSTL;CKEOFN CMP #$9B If eol, continue with single FX}file BEQ FNSET; CMP #'. BEQ WCTSTL; CMP #'/ BCC FNSET; BNE WCTSTL;SLSHLP LDA (FNPTR),Y CMP #'S BNE NCPFY}SYS; STA CBSAV BEQ SAVED;NCPSYS CMP #'X BNE NOTSWP; LDA #$80 STA SWPFLG BMI SAVED;NOTSWP STA OPT SaFZ}ve option code;SAVED DEY LDA #0 STA (FNPTR),Y INY INY LDA (FNPTR),Y INY CMP #'/ BEQ SLSHLP; CMP #'. F[}BCC FNSET; CMP #$9B BEQ FNSET; DEY;FNSET STY PTR Save pointer to second arg. DEY LDA (FNPTR),Y STA DELIF\}M LDA #0 STA (FNPTR),Y TAY LDA (FNPTR),Y CMP #'0 BCC DEFDRV; CMP #': BEQ DEFDRV; INY BCS LKFCOL; TAXF]} LDA #': CMP (FNPTR),Y BEQ DBEFOR; DEY STA (FNPTR),Y TXA BNE DGTCOD;LKFCOL LDA (FNPTR),Y Scan for drive idF^} BEQ DEFDRV; CMP #': BEQ DEVINC Device included; INY LDA (FNPTR),Y CMP #': BEQ DEVINC;DEFDRV LDA #':;DF_}GTCOD JSR DECFNP;DBEFOR LDA #'D JSR DECFNP;DEVINC LDY FNPTR LDA FNPTR+1 RTS;NXTFLD CLC LDA PTR MoveF`} index to a ADC FNPTR STA FNPTR LDA #0 TAY ADC FNPTR+1 STA FNPTR+1 RTS;DECFNP LDY FNPTR BNE DECFP1; DEFa}C FNPTR+1;DECFP1 DEC FNPTR INC PTR LDY #0 STA (FNPTR),Y;GETDN1 RTS;; Require a disk drive (no file specificatFb}ion);GETDN2 JSR GETFN2 Get next file name JMP GETDNE Then check for drive only;GETDN JSR GETFN;GETDNE STY IBUFc}F+$10 STA IBUF+1+$10 LDY #$FF;GETDNL INY TAX LDA (FNPTR),Y BNE GETDNL; CPX #': Any file name included? Fd} BEQ GETDN1 No, then return; JSR ERRXIT .BYTE "File name not allowed!",$9B,0;; Update density of disk in drive;GETDFe}EN CMP #': BNE GTDEN2 LDA DFUNIT;GTDEN2 AND #$0F Make unit binary LDX #0 STX DAUX+1 INX STX DAUX LDX #Ff} TEMPBUF STX DBUF+1 JSR RSEC2 BMI GETDN3; JMP RDCONF;; Require a disk file name, saviFg}ng the pointer in iocb1;CKDSK STY IBUF+$10 STA IBUF+1+$10 LDY #0 LDA (FNPTR),Y CMP #'D BEQ GETDN3; JSR ERRXIFh}T .BYTE "Not a disk file!",$9B,0;; Wait for source disk;CWFSD LDA SWPFLG BMI WFSD;GETDN3 RTS If no waitFi} required;WFSD JSR PRINT;ISD .BYTE "Insert SOURCE disk, press " .BYTE "" .BYTE 0 JSR CHRGET BIT SWPFLGFj} BVS GETDN3 If in dup-disk; LDX CSRC;RESET LDY IOCB+1,X STY UNNO LDA IAUX+5,X BEQ NOCHG; CMP #3 BCS NOCHGFk};SETDEN STA DKTYPE-1,Y LDX #15;SAVMAP LDA MAPBUF,X STA SAXMAP,X DEX BPL SAVMAP; JSR DOFSIN LDX #15;RSTFl}MAP LDA SAXMAP,X STA MAPBUF,X DEX BPL RSTMAP;NOCHG RTS;SAXMAP .BYTE 0,0,0,0,0,0,0,0 .BYTE 0,0,0,0,0,0,0,0;Fm}; Reconfigure density or configuration;DOFSIN LDX #9;DOFLOP LDA WOTDCB,X STA DUNIT+1,X DEX BPL DOFLOP; LDX Fn}#$31 STX DUNIT-1 LDX UNNO STX DUNIT Tell sio drive to configure LDY DKTYPE-1,X Get density/sector size LDA DRVDEFFo}-1,X Get drive specification JMP CONFIGR Go configure drive;; Set up par and iocb1 for a directory scan (multi-file activFp}ity);SETSCN STA ICMD+$20 LDA # PAR STA IBUF+$20 STX IBUF+1+$20 JSR SETPTR LDX #$10 Open iocb1 Fq}as directory;OPDIR LDA #6 Open iocb as directory STA IAUX,X;; Open a file independent of drive density;ANYDENFr} LDA #0 STA IAUX+1,X STA IAUX+5,X LDA #OPEN JSR SCMD BPL SAVDEN; JMP CIOER1;SAVDEN LDY DUNIT LDA DKTYPE-1Fs},Y STA IAUX+5,X RTS;; Set up par for a wild card copy;DEFPAR JSR SETPTR LDA (FNPTR),Y BNE DEFPX; STA CPYTYPFt} STA PAR+2,Y LDA #'* STA PAR,Y STA PAR+1,Y LDA #$9B termination STA PAR+2,Y;DEFPX RTS;SETPTR LDY #$FF;Fu}SETLP1 INY LDA (FNPTR),Y STA PAR,Y BNE SETLP1;SETLP2 DEY LDA PAR,Y CMP #'> account for sparta type BEQFv} SETLP3; CMP #': BNE SETLP2;SETLP3 INY STY FNPT RTS;; Report error, then return to menu;ERRXIT PLA STA RFw}AMLO PLA STA RAMLO+1 JSR PRTENT Write error message following jsr errxit JMP MENUSL Then return to menu;DOSRNM Fx}.BYTE "D",0,":",$60,"OS.SYS,"CKDTST .BYTE "DOS.SYS",0e following jsr errxit JMP MENUSL Then return to menu;DOSRNM D9; SAVE #D1:DUPEQ.M65;;; SAVE #D2:DUPEQ.M65;;; PRINT #D1:DUPEQ.SRC; .MACRO SKIPB .BYTE $24 .ENDM; .MACRO SKIJz}PW .BYTE $2C .ENDM;; Defined values;CR = 155SPC = 32EOF = 136;OPEN = 3GETREC = 5GETCHR = 7PUTCHR = 11CLOSE = J{}12RENAME = 32DELETE = 33LOCK = 35UNLOCK = 36FORMAT = 254;PORTB = $D301MAPREG = $D301NMIEN = $D40ETRIG3 = $D013;CAJ|}RTST = $BFFACARINI = $BFFE Init addressCARCTL = $D500 Cart controlCARBNK = $AFFF Cart bank idGRACTL = $D01D TriggJ}}er latchAUDF1 = $D200AUDCTL = $D208SKRES = $D20ASERIN = $D20DSEROUT = $D20DIRQEN = $D20ESKCTL = $D20FPBCTL = $D303FAJ~}SC = $D8E6FASCII = $D8E6IFP = $D9AAEDITRV = $E400DSKIO = $E453CIOV = $E456SIOV = $E459SETVBV = $E45CCIOINV = $E46E;J}TRAMSZ = $06WARMST = $08BOOT? = $09DOSVEC = $0ADOSINI = $0CPOKMSK = $10BRKKEY = $11RTCLOK = $12RAMLO = $1ADUNITZ = $J}21DCMDZ = $22DBUFZ = $24DLENZ = $28DAUX1Z = $2AICAX1Z = $2ADAUX2Z = $2BICAX2Z = $2BDAUX3Z = $2CCURFCB = $2ESOUNDR =J} $41FMSBPT = $46LMARGN = $52RMARGN = $53RAMTOP = $6A;FR0 = $D4VECTOR = $D4HDBUF = $D6BUFAD = $DABUFLEN = $DCFNPTR J}= $DETEMP = $E0TEMP2 = $E1INBUFF = $F3;VSERIN = $020AVIMIRQ = $0216CDTMV3 = $021CCDTMF3 = $022ACOLDST = $0244SHFLOKJ} = $02BECOLOR1 = $02C5COLOR2 = $02C6COLOR4 = $02C8NOCLIK = $02DBRUNAD = $02E0INITAD = $02E2MEMTOP = $02E5MEMLO = $02EJ}7DVSTAT = $02EA Status bufferCH = $02FC;DDEVIC = $0300DUNIT = $0301DCMD = $0302DSTAT = $0303DSTATS = $0303DBUF = $J}0304DBUFLO = $0304DBUFHI = $0305DTIMEO = $0306DLEN = $0308DAUX = $030ADAUX1 = $030ADAUX2 = $030BHATABS = $031A;IOCBJ} = $0340ICDNO = $0341ICCOM = $0342ICMD = $0342ISTAT = $0343ICBAL = $0344IBUF = $0344ICBLL = $0348ILEN = $0348IAUX = J}$034A;CARTCK = $03EB ChecksumGINTLK = $03FA Shadow Trig3BASICF = $03F8 Is 0 if basic on;; Starting location for tJ}he mdup code;ORIGIN = $1AE0 first byte after mdos (19CE - 4.00);FILES = $0709 max open filesRAMDKU = $070A ram disJ}k drive noDFUNIT = $070B current unit numberSECDAT = $070E sector size 1=sd 2=ddDLINK = $0711 offset to link fieldAJ}NDCD = $0734 offset to mask; extracting next sector bitsDKIO2 = $0769 sector i/o subr entryWRCMD = $0779 aJ}ddress of write cmdSTATE = $07BE current state of; dup/mem/autorunDKTYPE = $07C4 sector size tableDRVDEJ}F = $07CC floppy configuration; table (8-bytes)MDINIT = $07E0 dos init codeMAPBUF = $0908 512-byte bufJ}ferHDTAB = $0B15 hard drive size table (0 = floppy)WOTDCB = $0B25 prototype drive mode set table;CONFIGR = $0B2F coJ}nfigure drive subroutine entrySTEPBP = $0C5D step to the next boot sector buffer addressCDIREC = $07BB;; Ram disk locatJ}ions;RDCONF = $0B9A Patch into RDMAPAGE = $0BBA handler in DOS;RDKLMT = $0C3A Size of ram diskRDAD1 = $0C0D ThrJ}ee locations where the control addressRDAD2 = $0C19 needs to be storedRDAD3 = $0C4CNMLMAP = $0C14 Mask (1=part of mappJ}ing register);RDKIO1 = $168F For new handlersRAMFMT = $1137CLRDL2 = $1252= $0C4CNMLMAP = $0C14 Mask (1=part of mappHP; SAVE #D1:MACROS.M65;;; SAVE #D2:MACROS.M65;;; PRINT #D1:MACROS.SRC;;;; LOAD #D1:XESETUP.M65;; Macros for lisN}ting control;; LIST use current value of @LF;; LIST n set @LF=n and execute; 0=no list; 1=list; 2=liN}st+mlist; 3=list+mlist+clist; .MACRO LIST .OPT NO LIST,NO MLIST ; .OPT NO CLIST .IF .NOT .DEF @LF@LF .= 0 N}.ENDIF .IF %0=1@LF .= %1 .ENDIF .IF @LF>2 .OPT CLIST .ENDIF .IF @LF>1 .OPT MLIST .ENDIF .IF @LF .OPT LISN}T ; .ENDIF .ENDM;; Unconditional listing off; .MACRO OFF .OPT NO LIST ; .ENDM;; Restore previous status; N}.MACRO ON LIST @LF .ENDMonditional listing off; .MACRO OFF .OPT NO LIST ; .ENDM;; Restore previous status; L OFF; SAVE #D1:PATCHES.M65;;; SAVE #D2:PATCHES.M65;;; PRINT #D1:PATCHES.SRC;;;; LOAD #D1:MDUP.M65 ON;; PatR}ches into dos and ; dup for both mods;; Intercept ramdisk calls *= RDKIO1 JMP ?RDKIO;; Restore user colors and; updR}ate status - patches; into graphics 0 call in dup; *= JKP1 JSR ?COLRES;; Redirect RD number call (S.); *= JKP6 JR}SR ?GETRDRV;; Change Autorun filespec here; if desired *= AFN .BYTE "D1:AUTORUN.SYS",155;; Menu changes to indicate R}mod; and report rom + memlo status *= JKP2 .BYTE "MYDOS 4.51x" .IF ?MOD=?XE .BYTE 'e .ELSE .BYTE 'l .ENDIFR} .BYTE " "?BSTAT .BYTE "BcO " rom status?LOMEM .BYTE "1FCA WORDMARK 1989";; Indicate major change area; *= JKPR}4 .BYTE "O ";; Change prompt to normal video; so any inverse acts as warning; *= JKP3 .BYTE "Return"R};; Change write command default; to no verify if Return pressed; *= DOVRFY JSR CHRGET LDX #'P CMP #'Y BNE ?DOVFR}Y LDX #'W?DOVFY STX WRCMD RTS;; Entry to major new code; at old RD setup call; *= SKPFCT JMP ?ROMCTLBNE ?DOVFPt OFF; SAVE #D1:XEFIX.M65;;; SAVE #D2:XEFIX.M65;;; PRINT #D1:XEFIX.SRC;; last rev 20 Nov 93; ON; Ensure Portb V}and flags correct; for 512k+ before BasicXE loads; extentions into wrong banks;?ORG .= * *= $07E0+2 Patch into JSR ?RV}OMCHK init routine *= ?ORG?ROMCHK STA CDIREC Opcode replaced LDA PORTB STA $40 Cassette page 0 LDY #8 AsV}sume no cart LDX GINTLK Check gintlk BEQ ?GOTBNK Go if off/none; LDY $AFFF Save bank;?GOTBNK SEI Kill vV}blank2 STA $D508 Kill cart LDA #$FD Enable basic rom STA PORTB LDA $A000 See if any Basic INC $A000 CMP $AV}000 BEQ ?GOTBAS; STA $A000 CLC;?GOTBAS STA $D500 Enable any cart LDA TRIG3 Get trig3 STA $D500,Y Restore cV}art ROR A ROR A STA ?RMSTAT b7=cart b6=basic PHA LDA #$02 Deflt basic flag PLP clears int flag BVC ?V}FLAGIT; DEX gintlk-1 BEQ ?FLAGIT cart was on; AND $40 If on, a=0;?FLAGIT STA BASICF Set basic flag V} ORA $40 and corrected STA PORTB portb RTS?RMSTAT *= *+1 Status byte for dup?FIXLEN .= *-?ROMCHKic flag Tt .OPT NO LIST,NO MLIST ; .OPT NO CLIST,NO EJECT; SAVE #D1:XERD.M65;;; SAVE #D2:XERD.M65;;; PRINT #D1:XERD.SRZ}C;; RD handler code for MYDOS 4.51; to allow access of Sparta RD.; last rev. 22 Nov 93; *= $30?ZRDLO *= *+1 ramdiZ}sk vector?ZRDHI *= *+1?ZBFLO *= *+1 buffer vector?ZBFHI *= *+1; .IF .NOT .DEF DUNIT?TRIAL .= 1MAPAGE = $0BBACURFZ}CB = $2EDSTATS = $0303DBUFLO = $0304DAUX1 = $030AMAPREG = $D301NMIEN = $D40E .ELSE?TRIAL .= 0 LIST ; defaultZ} @LF *= RAMFMT+4 ADC ?RDKLMT .ENDIF;; Access table at same org as; original. Dup will set it up; *= MAPAGEZ} *= *+$40;; Ramdisk entry: x=dunit; a=msb secnum y=lsb secnum; flags on stack: c=putsec; Returns: status in a,y, dstZ}ats; with s valid, curfcb in x;?RDKIO STY DAUX1 For format CPY #0 Count secs from BNE ?OVRSUB zero; SBC #Z}1 Cpy sets carry;?OVRSUB DEY STY ?ZRDHI;; Calculate 16k ram bank; ASL ?ZRDHI ROL A;?RDRSRV = *+1 Ref for Z}dup.sys ADC #0 to set this;; Check maximum sector number;?RDKMAX = *+1 Ref for dup.sys CMP #8 to set this Z} BCS ?NAKRET c=1 if too high;; Copy buffer address to page 0; LDY #2?LOOP1 LDX DBUFLO-1,Y STX ?ZBFLO-1,Y DEY BNZ}E ?LOOP1; STY ?ZRDLO Clear this TAX Save bank in x LDA ?ZRDHI Convert to page LSR A in a with offsetZ} LSR A for odd numbered ROR ?ZRDLO sector in ?Zrdlo ORA #$40 Offset to $4000 STA ?ZRDHI; LDA MAPAGE,X RdZ} access value LDX MAPREG Save Portb in x STA MAPREG Enable rd bank; PLP Get direction SEI Kill allZ} STY NMIEN interrupts; BCS ?PUTSEC Go if write;; Copy rd sector to user buffer;?GETSEC LDA (?ZRDLO),Y STA (?ZBZ}FLO),Y INY BPL ?GETSEC Rd is always BMI ?SUCRET single density;; Copy user buffer to rd sector;?PUTSEC LDA (?ZBFLZ}O),Y STA (?ZRDLO),Y INY BPL ?PUTSEC;?SUCRET STX MAPREG Normal ram LDY #1 .BYTE $2C Skip two bytes;?NAKRETZ} LDY #139 Sec# too high; LDX CURFCB Restore fcb addr STY DSTATS LDA #$E0 STA NMIEN Re-enable CLI inZ}terrupts TYA RTS;?RDKLMT .BYTE 0 Size for format; NOP Spare byte;; ----------------------------?SPAZ}RE .= $0C5D-* .IF ?SPARE .IF ?SPARE&$FF00 .ERROR "RD too long"XX .= [$0100-[?SPARE&$FF]] .OPT LIST?OVER .Z}= XX .OPT NO LIST .ELSE .ERROR "RD too short"XX .= ?SPARE .OPT LIST?UNDER .= XX .OPT NO LIST Z} .ENDIF .ENDIF .IF ?TRIAL!?SPARE .OPT NO LIST .END .ENDIFE .OPT LIST?UNDER .= XX .OPT NO LIST XI .OPT NO LIST,NO EJECT ;; assembly control flag?TRIAL .= 0; use 0 for real assemnly; 1 for test no list; 2^} for test list; .OPT NO MLIST,NO CLIST; SAVE #D1:XESETUP.M65; last rev 09 May 94;; SAVE #D2:XESETUP.M65;;; PRI^}NT #D1:XESETUP.SRC;; Major changes to Dup.sys; in rd setup area include:; ROM control code; Code to save user colors^}; Code to set sio noise on/off; RD setup code to match; new handler in dos; .IF ?TRIAL?PS .= ?PS+1 .IF ?PS<^}2CKBANKS = $39FA Patch addrCONSYS = $3D31 Patch end+1 .INCLUDE #D1:MACROS.M65 .INCLUDE #D1:DUPEQ.M65;; Dummy labels^} to avoid; assembly errors on test; *= $EEEE Allow for +1 etcDUPSYS?RDKMAX?RDRSRV?RDKLMTNMSAVFNAMEITEMVJKP2MENU^}SLCLOS2?RMSTATINITIOGETNUMGETNO2GETLINPRINTCHRGETNCHGCSCHRPUTXE424PRTMSGERRXITBADITMSTCARJNOMEMNOCART?BSTAT^}?LOMEMINISAVINITJKP9 .ENDIF; LIST ?TRIAL-1 .ENDIF ON;; Point Mem.sav and Dup.sys to; RD before writing dos f^}iles; *= JKP9 JSR ?SETFNM;; -------------------------------; Cartridge/Basic Control *= CKBANKS;?ROMCTL JSR ^}?WATROM PHA;; When pulled to flags:; s=cart present; v=basic present; c=gintlk; z=0 (not equal); i=0 (ints clea^}red); JSR PRINT .BYTE 155,127 .BYTE "asic art one eset?",0 JSR CHRGET CMP #'R BNE ?N?;; Ensure no vblank c^}ode set up to; retake dosini until reset kills it; STX NMIEN x=0 from cio DEX STX PORTB Force os on LDA # <$07E^}0 STA DOSINI LDA # >$07E0 STA DOSINI+1 JMP ($FFFC) do hardware reset;?N? CMP #'N BNE ?C?; PLP Clear ^}stack LDY #$C0 Set ramtop LDX #$08 and cart bank (off) BNE ?BFOFF;?C? LDY #$A0 Ramtop for either rom CMP^} #'C BNE ?B?; PLP Check status BCS ?ROMCTL Already on BMI ?BFOFF Else turn it one;?NOROM JMP NOCART To^} no cart msg (turkey);?BFOFF LDA #$02 basicf BNE ?GRAPHZ;?B? PLP CMP #'B BNE ?COLOR BVC ?NOROM No basic r^}om!;?BASICON TXA basicf LDX #$08 cart bank;?GRAPHZ STY RAMTOP Ram limit STA BASICF Basic flag SEI ^} Kill vblank2 STA CARCTL,X Set cart bank; LDA PORTB AND #$FD ORA BASICF PHA ORA #$01 Ensure os on ST^}A PORTB for csum; LDX TRIG3 Skip csum if STX GINTLK cartidge off BEQ ?NOTMAC;; Ensure checksum correct for; Re^}set, if not os cold starts.; CLC Do it this way DEX to allow for TXA custom rom chip?CSLOOP ^} ADC $BFF0,X INX BNE ?CSLOOP; STA CARTCK;; Cartck Mac/65 = $A4; Action = $5D; Bxe = $9A CMP #$A4 ^} Mac/65? BNE ?NOTMAC No;; Simulate cold start to; initialize Mac/65; STX BOOT? DEX STX COLDST JSR ?INICAR;?N^}OTMAC PLA STA PORTB os per entry;; Restore proper settings; (Cart plays with some); LDX #1 STX BOOT? DEX ST^}X WARMST STX COLDST;; Back to Dup to do graphics 0; for new Ramtop. Vblank2 must; be enabled for this (timer 3); CLI^} Vblank2 now ok JSR INITIO returns a=0 y=1 STY BOOT? cart may change this JMP ?ROMCTL go always; ----------^}---------------------?COLOR JSR PRINT .BYTE 155 .BYTE "Set color?",0 JSR ?GETY BNE ?NOISE?; JSR PRINT .BYTE 1^}55,127 .BYTE "nc. ec. ext ave",155,0;?GETKEY JSR XE424 Get char, no echo LDY COLOR2 CMP #'I BEQ ?SCRINC; ^} CMP #'D BEQ ?SCRDEC; CMP #'T BNE ?SAVE?; INC COLOR1 SKIPB;?SCRDEC DEY SKIPB;?SCRINC INY;?COLSET ST^}Y COLOR2 BCS ?GETKEY Go always;?SAVE? CMP #'S save colors? BNE ?NOISE? no;; Set values in restore subrtn;?SVC^}OL LDA COLOR1 STA ?COL1+1 STY ?COL2+1; -------------------------------?NOISE? JSR PRINT .BYTE "SIO noise?",0 JS^}R ?GETY BNE ?SETSDR Default off; DEX;?SETSDR STX SOUNDR STX ?COL3+1; -------------------------------; Ramdis^}k setup to match; new handler in dos; -------------------------------?GETRDK JSR PRINT .BYTE 155 .BYTE "Setup RD^}?",0 JSR ?GETY BEQ ?RTEST; JMP MENUSL;; Ram bank test;?RTEST SEI STX NMIEN x=0 from cio;; Next required fo^}r Rambo etc.; which enable main banks in; place of extra ram with Newell; values. eg. $83 enables main; bank 0 at $4000. ^}We don't worry; about $5000 or $9000, and $D000; is just a player missile register; LDA $1000 PHA LDA PORTB PHA;^} LDX #63?SAVE5 LDY ?BTABLE,X Save original STY PORTB contents from LDA $5000 each bank. Use STA MAPBUF,X ; $500^}0 to DEX catch selftest BPL ?SAVE5 rom; LDX #63?FILL5 LDY ?BTABLE,X Store unique STY PORTB test value ^}in STY $5000 each bank DEX BPL ?FILL5; STX PORTB Main ram INX x=0 STX ?RDRSRV Default reserve STX ^}$1000 Ensure no STX $5000 false match STX $9000 with 256xl;; Test stored values against; what they should be; ^} LDY #0 Dest. index?TEST5 LDA ?BTABLE,X Get access/ STA PORTB test value STA MAPAGE,Y To handler INY CMP $5^}000 Check against BEQ ?PASS value stored;; If any 16k bank fails,; skip complete 64k block; TYA Drop y ba^}ck AND #$FC to start of TAY 64k block;?PASS LDA MAPBUF,X Restore entry STA $5000 values INX CPX #6^}4 BCC ?TEST5 y=banks found; PLA STA PORTB PLA STA $1000 DEC NMIEN Nmien=$FF CLI TYA Banks found ^} BNE ?TELL Continue if any;; Error out to not enough memory; message in load file code;?NOMEM JMP JNOMEM;; Report ^}ram found and set; default maximum (minimum set above);?TELL STA ?RDKMAX Maximum LDX #32 Space char. for message ^} LSR A Convert to LSR A 64k blocks CMP #9+1 BCC ?USE; SBC #10 LDX #'1;?USE ORA #'0 STX ?TOT ST^}A ?TOT+1 JSR PRINT?TOT .BYTE " ",0 JSR ?PR64 JSR PRINT .BYTE 126,126 .BYTE " found. Use all?",0 JSR ?GETY A^}ccept only Y BEQ ?SETLIM to use all ram;; Manual RD setup; JSR PRINT .BYTE "Reserve",0 JSR ?GET64 CMP ?RDKMAX ^}BCS ?NOMEM Abort! Too many; STA ?RDRSRV Reserve block(s) JSR PRINT .BYTE " Assign",0 JSR ?GET64 c=0; BEQ ?SETLI^}M If 0 (cr) or ADC ?RDRSRV too much, use CMP ?RDKMAX all remaining BCS ?SETLIM; STA ?RDKMAX;; Set size for Dos for^}mat code; else sector count will be; incorrect if any reserved blocks;?SETLIM SEC LDA ?RDKMAX SBC ?RDRSRV STA ?RD^}KLMT;; Simulate user press of [S]; to get rd number;?DRIVE LDA #'S-'A JMP ITEMV;; Comes right back to here;?GETR^}DRV JSR CHRGET LDX #8 Default 8. If CMP #'0 a digit, change BCC ?SETNO ramdisk code If CMP #'9+1 invali^}d number BCS ?SETNO leave it D8:; AND #$0F TAX;?SETNO STX RAMDKU Set num in Dos;; Patch entry from mdup4 to se^}t; rd drvnum into dup and mem; filenames a='1 on arrival from; write dos routine. This slows; down power up boot but make^}s; soft boots much faster and; indicates if rd needs format; (assuming dup in rd);?SETFNM LDX RAMDKU If invalid numbe^}r CPX #1 BCC ?USE1 skip it CPX #9+1 BCS ?USE1; TXA Else use rd ORA #'0 for dup/mem;?USE1 STA D^}UPSYS+1 STA NMSAV+1 RTS; -------------------------------; Subroutines; -------------------------------; Subr^}tn: print 64k block msg;?PR64 JSR PRINT .BYTE " 64k blocks? ",0 RTS;; Subrtn: get 64k block input;?GET64 JSR ?P^}R64 JSR GETLIN JSR GETNUM ASL A multiply by ASL A by 4 to get RTS 16k banks;; Subrtn: Get cha^}racter and; test if 'Y; Returns char in a, x=0,;?GETY JSR CHRGET CMP #'Y RTS;; Subrtn: init cartridge;?INICAR ^} JMP (CARINI);; Patch to restore user colors and; Sio noise default when menu called.; Replaces a Stx Cdtmv3 (x=0) in cod^}e;?COLRES JSR ?WATROM Update stats x=0?COL1 LDA #12 Value set above STA COLOR1 Text?COL2 LDA #0 Value s^}et above STA COLOR2 Screen STA COLOR4 Border?COL3 LDA #0 Value set above STA SOUNDR Sio noise STX CDTMV3 ^}Do op replaced RTS by jsr ?colres;; Subrtn: Determine rom status and; adjust and print menu status line;?WATRO_}M LDX #4 Insert current LDA MEMLO memlo in hex JSR ?B2H LDA MEMLO+1 JSR ?B2H x now = 0; LDA PORTB;; _}Flag os: O=rom =ram; EOR #$01 Invert os bit LSR A move to carry LDA #'O*2 ROR A Clears carry STA ?_}BSTAT+2;; Get status byte set by Dos; on boot and resets; LDA ?RMSTAT ORA GINTLK Add cart status PHA For c_}aller PHA For cart stat;; Flag cart: c=none, C=off =on; LDA #'C*2 PLP Gintlk to cy BMI ?GOTCAR Ha_}ve one; ORA #[$20*2] make lower case;?GOTCAR ROR A Clears carry STA ?BSTAT+1;; Flag basic as for cart; LD_}A #'b Assume no basic BVC ?NOBAS v still valid; LDA #'B*2 CPX BASICF c=1 if basic on ROR A;?NOBAS STA ?BST_}AT;; Print just first line of menu; LDA # JKP2-1 STA ICBAL+1_} LDA #9 print to cr STA ICCOM STA ICBLL+1 enough length JSR CIOV leave x=0 PLA rom status byte RT_}S for caller;; Subrtn: Convert bin to ascii; hex, store in status line;?B2H PHA AND #$0F JSR ?CODE low n_ }ybble PLA LSR A LSR A LSR A LSR A high nybble;?CODE CMP #9+1 BCC ?ISDEC decimal 0-9;; add offset for_ } A-F (+ carry); ADC #6;?ISDEC ADC #'0 STA ?LOMEM-1,X DEX RTS;; Access table for all possible; banks from 64 t_ }o 1024k;?BTABLE .BYTE $E3,$E7,$EB,$EF 130xe .BYTE $C3,$C7,$CB,$CF .BYTE $A3,$A7,$AB,$AF Newell n/a .BYTE $83,$87,$8_ }B,$8F Rambo n/a; .BYTE $E1,$E5,$E9,$ED .BYTE $C1,$C5,$C9,$CD .BYTE $A1,$A5,$A9,$AD .BYTE $81,$85,$89,$8D; .BYTE $_ }63,$67,$6B,$6F .BYTE $43,$47,$4B,$4F .BYTE $23,$27,$2B,$2F .BYTE $03,$07,$0B,$0F; .BYTE $61,$65,$69,$6D .BYTE $41,_}$45,$49,$4D .BYTE $21,$25,$29,$2D .BYTE $01,$05,$09,$0D;; 8 Spare bytes; .BYTE $EA,$EA,$EA,$EA .BYTE $EA,$EA,$EA,$_}EA;?SPARE .= CONSYS-* .IF ?SPARE .IF ?SPARE&$FF00 .ERROR "Code too long"XX .= [$0100-[?SPARE&$FF]] .OPT LIST ;_}?OVER .= XX OFF ; .ELSE .ERROR "Code too short" .OPT LIST ;?UNDER .= ?SPARE OFF ; .ENDIF .ENDIF ._}IF ?TRIAL .OR ?SPARE OFF ; .END .ENDIF too short" .OPT LIST ;?UNDER .= ?SPARE OFF ; .ENDIF .ENDIF .\/ .OPT NO LIST,NO EJECT; SAVE #D1:XLRD.M65;;; SAVE #D2:XLRD.M65;;; PRINT #D1:XLRD.SRC;;;; LOAD #D1:MDUP.M65;;c} 64k XL/XE RAMdisk for MYDOS 4.5+;; by John Picken; last rev 13 May 94;; This mod to MYDOS 4.51 provides; a smallc} RD for 64k xl/xe's. It; has 4 possible configurations:;; Format: single enhanced; files/free files/free;c} normal 64 103 8 110; basicxe 64 54 8 61;; Selection of Normal/BasicXE is; by Dup item O. There isc} no error; check on the 8 file limit in the; enhanced modes.; --------------------------------; VTOC Layout/RAM Usage (c}hex);; Bytes (offset from $F400); -----; 00 type flag; 01-02 usable sector count; 02-03 free sector count;; Bytes c}Sectors Status Ram Addr.; ----- ------- ------ ---------; 05-09 unused in use; 0A-29 000-0FF in use; 2A-2D 100-11F free c}- C000-CFFF; 2E-2F 120-12F in use D000-D7FF; 30-31 130-13F free - D800-DFFF; 32-35 140-15F free E000-EFFF; 36 160-16c}7 free F000-F3FF; 37 168 vtoc F400-F47F; 37 169 dir F480-F4FF; 37 16A-16F dir + F500-F7FF; 38c} 170 dir + F800-F87F; 38 171-177 free F880-FBFF; 39 178-17E free FC00-FF7F; 39 17F free - FF80-FFFFc}; 40-63 180-2CF in use; 64-7F in use; - in use if basicxe; + free if enhanced density; --------------c}------------------RTCLOK = $12 *= $30 Sio zero page?ZRDLO *= *+1 Ramdisk vector?ZRDHI *= *+1?ZBFLO *= *+1 Bc}uffer vector?ZBFHI *= *+1?PORTB *= *+1 Portb entry .IF .NOT .DEF DUNIT?TRIAL .= 1ICAX1Z = $2AICAX2Z = $2BCURFCB =c} $2EFMSBPT = $46DSTATS = $0303DBUFLO = $0304DBUFHI = $0305DAUX1 = $030AMAPREG = $D301NMIEN = $D40EMAPAGE = $0BBAPORTc }B = $D301RAMDKU = $070ARAMFMT = $1137CLRDL2 = $1252RDKIO1 = $168F .OPT LIST,NO CLIST .ELSE?TRIAL .= 0 LIST .ENDIc!}F *= RAMDKU Show ramdisk .BYTE 8 present as D8:;; Format entry: 13 bytes here; a=$ff x=curfcb y=dunit c=1; *= c"}RAMFMT LDA #$F4 Set vector for STA ?ZRDHI format LDY #0 STY ?ZRDLO LDX #4 Will clear 5 pages JMP MAPAGE c#} i.e. 10 sectors; *= MAPAGE;; Format: a=$F4 x=4 y=0 c=1; zrdlo/hi set to $f400; Clear vtoc and directory; Jc$}SR ?KILL Kill ints enable ram?FLOOP STA (?ZRDLO),Y a=0 from ?kill INY BNE ?FLOOP INC ?ZRDHI Next page DEX BPLc%} ?FLOOP leave a=y=0 x=$ff c=?;; Free all rd sectors (including; those in hardware range if; normal rd). Code adjusted byc&} Dup.;?RDLIM LDX #[$80/8]-1 bxe: #[$40/8]-1?FLOOP2 DEC $F42A,X bxe: Dec $F432,x DEX BPL ?FLOOP2 leave a=y=0 x=$ffc'}; ----------------------------; Following 6 bytes set by Dup;; If normal, code is:;?OPTION STY $F42E Unfree sectorsc(} STY $F42F in hardware range;; Else bxe code is:;; ASL $F439 Show last sect in use; NOP because of nmi vectc)}or; NOP set by Bxe; NOP; ----------------------------; Mark vtoc and dirsecs in; use and set sector counts; c*}a=y=0 x=$ff c=1;?DEFED LDA #112 Set total secs (set STA $F401 by Dup, is #63 if bxe) SEC SBC #2 0ne dir sc+}ec+vtoc in use DEC ICAX1Z If icax1=1 then BEQ ?ENH enhanced format; SBC #7 else 7 more dirsecs LSR $F438 c,}incl. sec# 368 in use INX and make x=0;?ENH STA $F403 Set free secs TXA x=$ff if ed else x=0 LSR c-}A LSR A a=$00 or a=$3F STA $F437 Vtoc/dir usage LDA #2 Flag Dos 2 disk STA $F400 JSR ?SUCRET Restore Oc.}s and ints STY FMSBPT Set status for dos JMP CLRDL2+8 Format exit; --------------------------;; Ramdisk sector entry:c/};; a = msb sec# x = dunit; y = lsb sec# c = 1; flags on stack (cy=1=write);; Check sector in range. Shouldn't; bec0} necessary but....;?RDKIO TAX Msb must be 1 DEX BNE ?NAKRET TYA BMI ?NAKRET Lsb must be <$80 AND #$F0 c1} and lsb must not EOR #$20 be $20-$2F or in BNE ?INRNG hardware range;?NAKRET PLP Clear stack LDY #139c2} and error out BMI ?EXIT;; a=? x=0 y=lsb secnum c=1;?INRNG STX ?ZRDLO TYA Recover lsb LSR A Two c3}secs/page ROR ?ZRDLO Any cy makes $80 ORA #$C0 Add offset to page STA ?ZRDHI Set rd vector LDA DBUFLO Copy userc4} buffer STA ?ZBFLO address to LDA DBUFHI page zero STA ?ZBFHI JSR ?KILL returns a=0 TAY PLP Read/writc5}e flag BCC ?GETLOOP;?WRTLOOP LDA (?ZBFLO),Y Write rd sector STA (?ZRDLO),Y INY BPL ?WRTLOOP BMI ?SUCRET;?GETLc6}OOP LDA (?ZRDLO),Y Read rd sector STA (?ZBFLO),Y INY BPL ?GETLOOP;?SUCRET LDY #1 Status ok INC PORTB Os c7}on DEC NMIEN Ints on CLI;?EXIT LDX CURFCB This needed for dos STY DSTATS This just in case... TYA Makc8}e flags valid RTS That's it.;; Subr: kill ints, enable OS ram; Return a=0 x,y unchanged c=?;?KILL LDA RTCLOKc9}+2?WAIT1 CMP RTCLOK+2 BEQ ?WAIT1 SEI LDA #0 STA NMIEN DEC PORTB RTS; NOP Spare bytes NOP NOP; c:}-----------------------?SPARE .= $0C5D-* .IF ?SPARE .IF ?SPARE&$FF00 .ERROR "RD too long"XX .= [$0100-[?SPARE&$FF]]c;} .OPT LIST?OVER .= XX .OPT NO LIST .ELSE .ERROR "RD too short"XX .= ?SPARE .OPT LIST?UNDER .= XX .OPT NOc<} LIST .ENDIF .ENDIF .IF ?TRIAL!?SPARE .OPT NO LIST .END .ENDIFXX .= ?SPARE .OPT LIST?UNDER .= XX .OPT NO`L .OPT NO LIST,NO EJECT ;; Assembly control flag?TRIAL .= 0; use 0 for real assemnly; 1 for test no list; g>} 2 for listed test; .OPT NO MLIST,NO CLIST; SAVE #D1:XLSETUP.M65; last rev 14 May 94;; SAVE #D2:XLSETUP.M65;;;g?} PRINT #D1:XLSETUP.SRC;; Major changes to Dup.sys; in rd setup area include:; ROM control code; Code to save user cog@}lors; RD setup code to match; new handler in dos; .IF ?TRIAL?PS .= ?PS+1 Pass counter .IF ?PS<2CKBANKS = $39FgA}A Patch addrCONSYS = $3D31 Patch end+1 .INCLUDE #D1:MACROS.M65 .INCLUDE #D1:DUPEQ.M65;; Dummy labels to avoid; assegB}mbly errors on test; *= $EEEE Allow for +1 etcDUPSYS?DEFED?RDLIM?OPTION?FLOOP2NMSAVFNAMEITEMVJKP2MENUSLCLOS2?gC}RMSTATINITIOGETNUMGETNO2GETLINPRINTCHRGETNCHGCSCHRPUTXE424PRTMSGERRXITBADITMSTCARJNOMEMNOCART?BSTAT?LOMEMINgD}ISAVINITJKP9 .ENDIF LIST ?TRIAL-1 .ENDIF ON;; Patch into Dup in RAM test area; *= CKBANKS;; Cartridge/BasicgE} Control;?ROMCTL JSR ?WATROM PHA;; When pulled to flags:; s= cart present; v= basic present; b=0 d=0 i=0 z=0; gF} c= gintlk; JSR PRINT .BYTE 155,127 .BYTE "asic art one eset?",0 JSR CHRGET CMP #'R BNE ?N?;; Ensure no vbgG}lank code set up to; retake dosini 'til reset kills it; STX NMIEN x=0 from cio DEX STX PORTB force rom on LDA #gH} <$07E0 STA DOSINI LDA # >$07E0 STA DOSINI+1 JMP ($FFFC) do hardware reset;?N? CMP #'N Kill cart and basic? gI} BNE ?C? No; PLP Dump status byte LDY #$C0 Select ramtop LDX #$08 and cart bank BNE ?BFOFF AlwaysgJ};?C? LDY #$A0 Ramtop for either CMP #'C BNE ?B? Go if not cartridge; PLP Check status BCS ?ROMCTLgK} Already on, exit BMI ?BFOFF Got one; JMP NOCART To no cart msg;?BFOFF LDA #$02 Flag Basic off BNE ?GRAPHZ AlgL}ways;?B? PLP CMP #'B BNE ?COLOR Invalid key, ignore;?BASICON TXA basicf (x=0 from cio) LDX #$08 cargM}t bank (off);?GRAPHZ STY RAMTOP Ram limit STA BASICF Basic flag SEI Kill vblank2 STA CARCTL,X Set cart bagN}nk; LDA $40 Portb shadow AND #$FD ORA BASICF PHA ORA #$01 Ensure os on STA PORTB for csum; LDX TRIG3gO} Skip csum if STX GINTLK cartidge off BEQ ?NOTMAC;; Ensure checksum correct for; Reset, if not os cold starts.; gP}CLC Do it this way DEX to allow for TXA custom rom chip?CSLOOP ADC $BFF0,X INX BNE ?CSLOOPgQ}; STA CARTCK;; Cartck Mac/65 = $A4; Action = $5D; Bxe = $9A CMP #$A4 Mac/65? BNE ?NOTMAC No;; SgR}imulate cold start to; initialize Mac/65; STX BOOT? DEX STX COLDST JSR ?INICAR;?NOTMAC PLA STA PORTB os pergS} entry;; Restore proper settings; (Cart plays with some); LDX #1 STX BOOT? DEX STX WARMST STX COLDST;; Back tgT}o Dup to do graphics 0; for new Ramtop. Vblank2 must; be enabled for this (timer 3); CLI Vblank2 on JSR INITIOgU} returns a=0 y=1 STY BOOT? Cart may change this JMP ?ROMCTL;?COLOR JSR PRINT .BYTE 155 .BYTE "Set color?",0 gV}JSR CHRGET CMP #'Y BNE ?NOISE?; JSR PRINT .BYTE 155,127 .BYTE "nc. ec. ext ave",155,0;?GETKEY JSR XE424 gW}Get char, no echo LDY COLOR2 CMP #'I BEQ ?SCRINC; CMP #'D BEQ ?SCRDEC; CMP #'T BNE ?SAVE?; INC COLOR1 SKgX}IPB;?SCRDEC DEY SKIPB;?SCRINC INY;?COLSET STY COLOR2 BCS ?GETKEY Go always;?SAVE? CMP #'S Save colorsgY}? BNE ?NOISE? No;; Set values in restore subrtn;?SVCOL LDA COLOR1 STA ?COL1+1 STY ?COL2+1; ---------------------gZ}----------?NOISE? JSR PRINT .BYTE "SIO noise?",0 JSR CHRGET CMP #'Y BNE ?SETSDR Default off; DEX;?SETSDR STg[}X SOUNDR STX ?COL3+1; -------------------------------; Ramdisk setup to match; new handler in dos; ------------g\}-------------------?GETRDK LDA ?BSTAT+2 If ram os BMI ?TOMENU no rd possible; JSR PRINT .BYTE 155 .BYTE "Set up Rg]}D?",0 JSR CHRGET CMP #'Y BEQ ?RDTYP;?TOMENU JMP MENUSL;?RDTYP JSR PRINT .BYTE 155 .BYTE "RD type: ormal org^} BasicE?",0 JSR CHRGET CMP #'N BNE ?X?; LDY #0 index into data BEQ ?SETIT Always;?X? CMP #'X BNE ?TOMg_}ENU Go if invalid key; LDY #9 index into data;?SETIT LDA ?NOBXE,Y Modify code STA ?OPTION,X for rd type INY g`} INX CPX #6 BCC ?SETIT LDA ?NOBXE,Y STA ?DEFED+1 INY LDA ?NOBXE,Y STA ?RDLIM+1 INY LDA ?NOBXE,Y STA ?FLOOga}P2+1; JSR PRINT Just a reminder .BYTE 155 .BYTE "Limit 8 files in ",34 .BYTE "Enhanced",34 .BYTE " density",155,gb}155,0;; Simulate user press of [S]; to get rd number;?NUM LDA #'S-'A JMP ITEMV;; comes right back to here;?GETRDgc}RV JSR CHRGET LDX #8 Default 8. If CMP #'0 a digit, change BCC ?SETNO ramdisk code. If CMP #'9+1 invaligd}d number BCS ?SETNO use default; AND #$0F TAX;?SETNO STX RAMDKU Set rd num in Dos RTS;; Subrtn: init cartridge}ge;?INICAR JMP (CARINI);; Subrtn: set user colors and Sio; noise when menu called. Replaces; a Stx Cdtmv3 (x=0) in cogf}de;?COLRES JSR ?WATROM Update status x=0?COL1 LDA #12 Value set above STA COLOR1 text?COL2 LDA #0 Valuegg} set above STA COLOR2 screen STA COLOR4 border?COL3 LDA #0 Value set above STA SOUNDR screen STX CDTMV3 Dgh}o op replaced RTS by jsr ?colres;; Subrtn: Determine rom status; and adjust menu status line; Then print it.;gi}?WATROM LDX #4 Insert current LDA MEMLO memlo in hex JSR ?B2H into status line LDA MEMLO+1 JSR ?B2H x gj}now = 0 LDA PORTB STA $40;; Flag os: O=rom =ram; EOR #$01 Invert os bit LSR A move to carry LDA #'O*2gk} ROR A Clears carry STA ?BSTAT+2 BPL ?CART? Go if os in rom; STX RAMDKU Kill any rd;?CART? LDY #8 Asgl}sume no cart LDA GINTLK Check gintlk BEQ ?GOTBNK Go if off or none; LDY $AFFF Save cart bank;?GOTBNK SEI gm} Kill deferred vblank STA $D508 Kill cart LDA #$FD Enable basic rom STA PORTB LDA $A000 See if any Basic INgn}C $A000 CMP $A000 BEQ ?GOTBAS; STA $A000 No, restore ram CLC;?GOTBAS STA $D500 Enable any cart LDA TRIG3 go} Get trig3 STA $D500,Y Restore cart status ROR A ROR A ORA GINTLK b7=cart b6=basic PHA b0=cart is on PHAgp};; Flag cart: c=none, C=off =on; LDA #'c*2 assume no cart PLP BPL ?GOTCAR Have cart status; LDA #'C*2 Cart pgq}resent;?GOTCAR ROR A Add in gintlk STA ?BSTAT+1 clear any carry;; Note overflow flag still valid; BVC ?NOROMgr} If no basic BPL ?BASIC? If cart off is basic on?;?NOROM LDA #$02 Turn basic off ORA $40 in portb shadow STgs}A $40;?BASIC? LDA $40 STA PORTB AND #$02 STA BASICF; LDA #'b Assume no rom BVC ?GOTBAS got status if so;gt} LDA #'B*2 CPX BASICF c=1 if basic on ROR A;?NOBAS STA ?BSTAT;; Print just first line of menu; LDA # JKP2-1 STA ICBAL+1 LDA #9 print to cr STA ICCOM STA ICBLL+1 enogv}ugh length JSR CIOV leave x=0 PLA Rom status byte RTS for caller;; Subrtn: Convert bin to ascii; gw}hex and store in status line;?B2H PHA AND #$0F JSR ?CODE low nybble PLA LSR A LSR A LSR A LSR A higgx}h nybble;?CODE CMP #9+1 BCC ?ISDEC go if decimal 0-9;; Add offset for A-F (plus carry); ADC #6;?ISDEC ADC #'0gy} add ascii offset STA ?LOMEM-1,X DEX RTS;; Code copied into handler;?NOBXE STY $F42E if normal rd STY $F4gz}2F .BYTE 112 .BYTE [$80/8]-1 .BYTE $2A; ASL $F439 if bxe NOP NOP NOP .BYTE 63 .BYTE [$40/8]-1 .BYTE $3g{}2;?SPARE .= CONSYS-*?OVER .= 0 .IF ?SPARE .IF ?SPARE&$FF00 .ERROR "Code too long"XX .= [$0100-[?SPARE&$FF]] .OPg|}T LIST ;?OVER .= XX OFF ; .ELSE .OPT LIST ;?UNDER .= ?SPARE OFF ; .ENDIF .ENDIF .IF ?TRIAL .OR ?OVg}}ER OFF ; .END .ENDIF ; .ELSE .OPT LIST ;?UNDER .= ?SPARE OFF ; .ENDIF .ENDIF .IF ?TRIAL .OR ?OVd