2IMGAPSX@@@ 8L2C)pJJJJ IH(ȱH:=IH[H`@HcH  $ +   I/H`JLNGȄBȄF aK  haaFF  mJm# KKJ UJ )J ۈ) ;J3ȱJFȱJGJKaȄM  aaNNJFLGJL L? &PRODOS `DaElH$?EGvѶK+`L HHLy XP LM ŠϠĠӠS)*+,+`F)) (*=GJFjJJA QE'+ '== `@ STSP8QSS8 m P o R(8RSBKUP' @COMMONSHELL_COPYKITSHUTTLE_DIAGS MENUBKUP$ kCOMMONuHUSTON!' ^'&PRMENU  %RWTSE q&SSUTES8CALLDOSt%SWAP1o&SWAP2E #*FINDMTAREA#Qj'EQUATES'U%RWOTS5$lE(SWITCHESY#+GETPRINSLOTgqTEXTSWAPj2g SBTL .PRINT A SCREEN. ********************************************************** * * * PRMENU - print a menu on screen * * * * This module displays a series of centered lines on * * the screen. On entry, the X and Y registers must * * point to a parameter list containing the text, and * * a list of the vertical spacing between the lines. * * The text must  consist of strings of Ascii separated * * by hex zeroes. The vertical spacing list is a * * series of hex values, one per line of text, each of * * which specifies the distance of that line from the * * line above. A negative value signals the end of the * * list. If a value is zero, the corresponding line * * of text is not printed. (This gives software a con- * * venient way to erase menu lines during execution.) * * * * This module is used for all the Copykit and Shuttle * * menus. It is generally used in conjunction with the * * GETSR.A module which displays the cursor bar and * * reads the keyboard for the user's selections. * ********************************************************** * * ;X INDEXES TABLES, Y INDEXES MSGS ********************************************************** SKP 3 PRMENU2 EQU * ;LOAD PARMLIST STY LISTPTR ;PTR TO PARMLIST STX LISTPTR+1 LDY #3 PLOOP1 EQU * ;COPY.TO.THIS.ROUTINE'S.INPUT LDA (LISTPTR),Y STA MSGTOP,Y DEY BPL PLOOP1 ;COPY 2 ADDRS SKP 2 INC WNDWDTH ;SO NO CR AFTER 40 CHARS LDX #0 ;INDEXES STX VCURSOR ;PUT CRSR.AT.TOP.OF.PAGE MENULOOP EQU * ;X IS INDEX INTO VERT SPACING TABLE TXA TAY ;BCS INDIRECT USES Y LDA (VERTPTR),Y ;# OF LINES TO MOVE DOWN FROM LAST MSG: FB=VERTPTR STA TEMP1 BMI NOMORE ;NEG TAG MEANS NO MORE CLC ;CLR CARRY ADC VCURSOR STA VCURSOR ;MOVE CURSOR DOWN DO 1 LDA #1 ;LEFT MARG +1 STA HCURSOR ELSE JSR DISPMARGIN FIN JSR DISPMSG ;DISPLAY IT INX JMP MENULOOP ;DO ANOTHER MSG NOMORE EQU * DEC WNDWDTH ;RESTORE RTS SKP 1 DO SHUTTLE ELSE DISPMARGIN EQU * LDA WNDWDTH ;=41 STA HCURSOR LDY #$FF LLOOP EQU * ; DEC HCURSOR INY LDA (MSGTOP),Y ;GET NEXT CHAR: F9=MSGTOP BNE LLOOP ;IF ITS NOT NULL, LLOOPEND EQU * LSR HCURSOR ;40-TXT LENGTH /2 RTS FIN SKP 1 SKP 1 DISPMSG EQU * ;DISPLAY MESSAGE LDA VCURSOR JSR BASCALC ;SET SCR VECTOR LOOP89 LDY #0 LDA ($F9),Y ;F9=MSGTOP BEQ MSGEND ;IF CHAR=NULL,EXIT LDY TEMP1 BEQ SKIPCOUT2 ;IF VERT=0, DONT SHOW LINE JSR SAVE ;save all regs DO SHUTTLE CMP #SHOWNAMEFLAG ;is it the 'show name' marker? BNE NOTSN LDX CURRENTPROGNO JSR SHOWNAME ;display name of current prog JMP SKIPCOUT NOTSN EQU * ;else display character CMP #SHOWWSFLAG ;is it the 'print "WORKSPACE"' flag? BNE NOTSWS JSR WSMSG ;'Workspace' JMP SKIPCOUT NOTSWS EQU * FIN JSR XLATE JSR COUT1 ;DISPLAY CHAR SKIPCOUT EQU * JSR RESTORE ;restore all regs SKIPCOUT2 EQU * JSR INCTOP ;INCREMENT MSGTOP POINTER JMP LOOP89 ;GET NEXT CHAR MSGEND EQU * JSR INCTOP ;POINT TO HEAD OF NEXT MSG RTS INCTOP EQU * INC MSGTOP ;INC LOW-ORDER BYTE BNE NOPAGE6 INC MSGTOP+1 ;HIGH IF NECC NOPAGE6 EQU * RTS SBTL .POINT REGISTERS, CALL DOS. ;THIS ROUTINE CALLS DOS TO READ/WRITE A SECTOR. IF NO ERROR OCCURED, "ERROR" IS SET TO ZERO. ; AND CARRY IS CLR. IF ERROR OCCURRED, CARRY IS SET AND "ERROR" CONTAINS CODE. ; ;THIS ROUTINE PROVIDES THE I/O BLOCK OF INPUT/OUTPUT PARAMETERS ;REQUIRED BY RWTS. ; ;PLEASE NOTE THE IMPORTANT MODIFICATIONS TO THE ASSOCIATED ;VERSION OF RWTS: ; 1. IT IS MUCH SHORTER: $BB00 TO START OF THIS ROUTINE. ; 2. IT READS AND WRITES BUT CANNOT FORMAT A DISK. ; 3. IT DOES NOT USE THE 'SCRATCHPAD' SPACE IN PAGES 4-7. ; 4. IT USES PAGES 4 AND 5 AS 'NIBBLE BUFFERS' DURING ; DISK I/O. THIS WILL APPEAR AS TRASH ON THE TEXT SCREEN. ; IF YOU DON'T LIKE THIS, YOU MAY SWITCH TO GRAPHICS, USE A ; STANDARD RWTS, OR CHANGE THE REFERENCES TO $0400 AND $0500 TO ; OTHER ADDRESSES. ALLOW $100 FOR THE FIRST BUFFER AND $56 FOR ; THE SECOND ONE. ; 5. IF YOU PUT A PAGE OF DATA INTO THE FIRST NIBBLE BUFFER, YOU ; MAY WRITE IT OUT TO DISK (ALTHOUGH THE DATA IN MEMORY WILL ; BE TRASHED.) LIKEWISE, YOU MAY READ A SECTOR INTO THE FIRST ; NIBBLE BUFFER FROM DISK. THIS IS NOT POSSIBLE IN APPLE'S ; STANDARD DOS 3.3 RWTS. ; ; RWTSE EQU * LDA #IOB ;(LOW BYTH OF ADDR) DO UNIDISK LDX ISITUNI ;=0 if floppy, else anything BEQ DOFLOPPY JSR RWTSPRO ;access unidisk JMP FLOPPYORUNI DOFLOPPY EQU * FIN JSR RWTS ;CALL DOS ROUTINE FLOPPYORUNI EQU * BCS RETURNN ;IF CARRY IS NOT SET, LDA #0 ;THEN ERROR CODE IS GARBAGE STA ERROR ;SO CLEAR IT. RETURNN EQU * RTS *********************************** * * * I/O BLOCK * * * ********************************** SKP 1 SKP 1 IOB DFB 01 ;IOB TYPE DOSSLOT EQU $5F8 ;DOS.SLOT.#*10 SLOT DFB $60 ;SLOT # TIMES 16 DRIVE DFB 1 ;DRIVE # XVOL DFB 0 ;VOLUME # TRACK DFB 0 SECTOR DFB 0 DCTAD DW DCT ;ADDRESS (LO,HI) OF DEVICE TABLE BUFFADDR DFB 0,0 ;ADDR OF DATA BUFFER DFB 0,0 ;UNUSED COMMAND DFB 0 ;COMMAND: * 0 = START DRIVE ONLY * 1 = READ SECTOR * 2 = WRITE SECTOR * 4 = FORMAT DISKETTE ERROR DFB 0 ;ERROR CODE (ONLY APPLIES IF RWTS SETS THE CARRY FLAG): WRTERR EQU $10 = WRITE-PROTECTED DISKETTE VOLERR EQU $20 = UNSPECIFIED VOLUME # DRVERR EQU $40 = DRIVE ERROR (VERY ODD) READERR EQU $80 = READ ERROR (UNABLE TO READ SECTOR) VOLUME DFB 0 ;VOL # FOUND BY RWTS LSLOT DFB $60 ;LAST SLOT ACCESSED BEFORE THIS ONE, TIMES 16 LDRIVE DFB 1 ;LAST DRIVE ACCESSED SKP 1 ; ********************************* * * ASSOCIATED PARAMETERS * ********************************* ; REALPAGE DFB 0 ;HOME OF PAGE IN RAM SBTL .SNAPSHOT UTILITIES. CHECK.FLAG EQU 77 ;=."LOOK.AT.FLAG2" FLAG1 EQU $6000 RUNCOPY EQU 1 ;="RUN.COPY.PGM" RUNCOMPRESS EQU 3 ;='RUN COMPRESS PGM' RUNCONFIG EQU 5 ;='RUN SHUTTLE CONFIG PGM' FLAG2 EQU $6001 DOT EQU 46+128 ;ASCII FOR . BASIC EQU $E003 * ; ; ; SSUTES EQU * * ******************************** * *..IF.FLAGS.ARE.SET,.RUN.THE. *...COPY.PROGRAM.OR.COMPRESSOR. * ******************************** * JSR HOME LDA KBD ;C000 CMP #ESCAPE BEQ GOCONFIG ;RUN CONFIGURE ; ; LDA #CHECK.FLAG CMP FLAG1 ;SHOULD.FLAG2.BE.CHECKED? BNE NOCOPY ;IF NOT,EXIT INC FLAG1 ;CLOBBER FLAG JSR INIT ;reset soft switches LDA FLAG2 DO SHUTTLE+SHELL ELSE CMP #RUNCOPY ;RUN.QUIKCOPY? BEQ GOCOPY ;IF SO,BRANCH CMP #RUNCOMPRESS BEQ GOCOMPRESS FIN CMP #RUNCONFIG BEQ GOCONFIG DO SHUTTLE ELSE JMP NOCOPY * GOCOPY EQU * LDX #COPYMSG JSR CALLDOS ;RUN QUIKCOPY COPYMSG EQU * DFB CR,CTRL.D ASC .BRUN COPYDISK. DFB CR DFB 00 ; FIN ; ; NOCOPY RTS * DO COPYKIT GOCOMPRESS EQU * LDX #CMPRSSMSG JSR CALLDOS ;RUN QUIKCMPRSS CMPRSSMSG EQU * DFB CR,CTRL.D ASC .RUN C1. DFB CR DFB 00 ; FIN * GOCONFIG EQU * LDX #CONFIGMSG JSR CALLDOS ;RUN CONFIGUTE CONFIGMSG EQU * DFB CR,CTRL.D ASC .RUN CONFIGURE. DFB CR DFB 00 ; SBTL .SEND A MSG TO DOS. *CALLDOS: ASSUMES.POINTER.TO.MSG.IS.IN.X.AND.Y.;USES.($FE,$FF) MSGPTR EQU $FE ;PTR TO MSG TO DOS * CALLDOS EQU * STY MSGPTR STX MSGPTR+1 LDY #0 LOUP EQU * TYA PHA ;SAVE.Y LDA (MSGPTR),Y ;GET.CHAR.OF.MSG BEQ LOUPEXIT ;EXIT.IF.NULL JSR COUT ;SEND.IT.TO.DOS PLA TAY ;RESTORE Y INY ;INCREMENT.Y BNE LOUP ;ALWAYS.LOUP LOUPEXIT EQU * PLA RTS SBTL .SWAP: PAGE SWAP UTILITY. SWAP1 EQU * * *.SWAPS.TWO.BLOCKS.OF.PAGES. *.DOES.NOT.USE.PAGE.0 *.BEFORE.SWAP,.RESTORES.STACK *.TO.PRE-JSR.CONDITION. * *.INPUT:..X.AND.Y.=.1ST.PAGE.OF *...EACH.BLOCK *...ACCUM.=.NO.OF.PAGES.TO.SWAP * * CLC SWAP1WAY EQU * ;ENTER.WITH.CARRY.SET....MOVES.FROM.X.TO.Y ; ; ; STX A1H11 STX A1H21 STY A2H11 STY A2H21 STA PAGECOUNTER1 * PLA ;SAVE RETURN ADDR LOCALLY TAX PLA TAY INX BNE NTPAGEBOUND INY NTPAGEBOUND EQU * STX RETURNVECTOR1 STY RETURNVECTOR1+1 * LDY #0 * SWLOOP1 EQU * ;SWAP TWO BYTES LDA ZERO,Y A1H11 EQU *-1 BCS JUSTONEWAY TAX LDA ZERO,Y A2H11 EQU *-1 STA ZERO,Y A1H21 EQU *-1 TXA JUSTONEWAY EQU * STA ZERO,Y A2H21 EQU *-1 INY BNE SWLOOP1 ;LOOP TIL A PAGE IS SWAPPED INC A1H11 INC A1H21 INC A2H11 INC A2H21 DEC PAGECOUNTER1 BNE SWLOOP1 JMP (RETURNVECTOR1) ;BACK TO CALLER * PAGECOUNTER1 DFB 0 ;NUMBER OF PAGES YET 2B SWAPPED RETURNVECTOR1 DFB 0,0 ;RETURN ADDR * * SBTL .SWAP2E: PAGE SWAP UTILITY. SWAP2EX EQU * * *.SWAPS.TWO.BLOCKS.OF.PAGES. *.DOES.NOT.USE.PAGE.0.OR.1.INTERNALLY *ASSUMES.ENTRY.VIA.JSR;..RETURNS.VIA.RTS * *.INPUT:..X.AND.Y.=.1ST.PAGE.OF *...EACH.BLOCK *...Y=.COPYKIT-TYPE.BANKED.PAGE.NUM. *...ACCUM.=.NO.OF.PAGES.TO.SWAP * *SWAP1WAY2E.ENTRY.POINT.MOVES.FROM.SSRAM.TO.NORMAL.RAM.ONLY * * DO SHUTTLE ELSE CLC BCC SWAP2EY SWAP1WAY2E EQU * SEC SWAP2EY EQU * FIN STX A1H1 STX A1H2 STA P0TEMP1 ;PAGECOUNTER STY P0TEMP2 ;SSRAMPAGE * * * LDY #0 * SWL!OOP EQU * ;SWAP.A.PAGE LDA P0TEMP2 ;SSRAMPAGE STA $C0A0 DEVVEC1 EQU *-2 SWLOOPI EQU * LDA ZERO,Y A1H1 EQU *-1 TAX LDA ZERO,Y RAMVEC1 EQU *-2 STA ZERO,Y A1H2 EQU *-1 TXA DO SHUTTLE ELSE BCS ONEWAY FIN STA ZERO,Y RAMVEC2 EQU *-2 ONEWAY EQU * INY BNE SWLOOPI ;LOOP TIL A PAGE IS SWAPPED INC A1H1 INC A1H2 INC P0TEMP2 ;SSRAMPAGE DEC P0TEMP1 ;PAGECOUNTER BNE SWLOOP RTS * SBTL .FIND UNUSED AREA. ; RANGETOP EQU $A7 ;RANGE WITHIN WHICH ENTIRE EMPTY AREA MMUST FALL RANGEBOTTOM EQU $08 EMPTYPTR EQU $FB ;2-BYTE PTR TO CURRENT PAGE ; DO SHUTTLE EMPTYSIZE EQU $4 ;AT LEAST 4 CONSECUTIVE PAGES REQD MTDEFAULT EQU $0 ;0=NO MTAREA FOUND FIN ; DO COPYKIT EMPTYSIZE EQU $9 MTDEFAULT EQU $20 ;CURRENTLY THE BEST LOC WE'VE FOUND FOR STANDALONE FIN ; ; ; ***INPUT: NONE ***OUTPUT: MTAREA CONTAINS ADDR OF A N-PAGE BLOCK OF ZEROES. *=** ***VOLATILE: ALL. NOTE THAT X-REG "$%IS USED AS A COUNTER THROUGHOUT. ; ; ; EMPTYPAGECTR DFB 0 FINDMTAREA EQU * LDA #$0 STA EMPTYPAGECTR STA MTAREA LDX #RANGETOP MTLOOP EQU * JSR ISPAGEEMPTY ; THEN IF PAGE IS UNUSED BNE NOTEMPTY INC EMPTYPAGECTR ; THEN INCR EMPTY-PAGE-COUNTER LDA #EMPTYSIZE ; IF COUNTER=N CMP EMPTYPAGECTR BNE MTEXIT STX MTAREA ; THEN MARK EMPTY-AREA-FOUND WITH CURRENT PAGE NO. BEQ MTFOUND ;SPACE FOUND OK NOTEMPTY EQU * ; ELSE ZERO EMPTY-PAGE COUNTER LDA #0 STA EMPTYPAGECTR MTEXIT EQU * DEX CPX #RANGEBOTTOM BCS MTLOOP LDA #MTDEFAULT STA MTAREA MTFOUND EQU * RTS ; ISPAGEEMPTY EQU * ;RETURN '=' IF PAGE IS ALL ZEROS STX EMPTYPTR+1 LDY #0 TYA STA EMPTYPTR EMPTYLOOP EQU * ORA (EMPTYPTR),Y BNE ENDMTLOOP ;BNCH IF ONE NON-ZERO BYTE FOUND IN A PAGE DEY BNE EMPTYLOOP ENDMTLOOP EQU * RTS MSB ON ;PRODOS DEFAULTS MSB OFF SBTL .EQUATES. HAN3SSRAMPG EQU $19 ;where nmihandler3 is stashed FIRST8SSPAGE EQU $18 ;IRST8LEN EQU 8 * STACK EQU $100 ;WAPSSPAGE EQU 1 ;PAGE CORRESP TO DRIVER+$100 ;WAPLEN EQU $17 ;NOT.INCL.P0 BASL EQU $28 STASH EQU $400 STASH2 EQU $500 BUFF512 EQU 5 ;page 5-6 buff for prodos access BUFF80 EQU 4 ;PAGE 4 BUFF FOR 80-COL DEFAULTAREA EQU $28 ;default loc for standalone if all else fails RAMINFOAREA EQU $04D0 ;TO DF - USED BY SHUTTLE FLAGPAGE EQU $04 FLAGAREA EQU $04E8 ; FTR&()*+,-./0123ACK EQU $02 FSECTOR EQU $0F STATUSCOMMAND EQU $00 READCOMMAND EQU $01 WRITECOMMAND EQU $02 FORMATCOMMAND EQU $03 ; ; DO SHUTTLE ELSE KORG EQU $0230 ;ORG OF OBJ CODE K. ;KLOADADDR EQU $0C00+KORG ;POSITION OF K (WITHIN LOAD MODULE) WHEN LOAD MODULE IS LOADED AT $804. FIN ; ; ; RESET EQU $3F2 PWREDUP EQU $3F4 ;POWER-UP BYTE DOSRESET EQU $9DBF ;normal value at $3F2,3F3. ; PRBL2 EQU $F94A ;print x blanks HOME EQU $FC58 RDKEY EQU $FD0C ;VECTORS THRU KSW TO KEYIN KEYIN EQU $FD1B ;'KEYIN' DEVROOT EQU $C080 ;SS.CONTROL.ADDR IOAREA EQU $C000 ;$C000.FOR.REAL NMI EQU $FFFA ;NMI VECTOR FAKEADDR EQU $C03E ;ADDR.PUT.ON.BUS.AT.NMI.TIME SETINV EQU $FE80 ;VIDEO MODE COUT EQU $FDED COUT1 EQU $FDF0 ;VIDEO OUTPUT ROUTINE BASCALC EQU $FBC1 ;USES VCURSOR VALUE TO PREPARE COUT INSDS1 EQU $F882 RGDSP1 EQU $FADA ;SHOW REGS MON EQU $FF65 ;MONITOR ;TESTCARD EQU $CB24 ;2E-ONLY MONITOR ROUTINE:IS THERE AN 80-COL CARD? BEEP EQU $FBDD GETLN EQU $FD6A PRERR EQU $FF2D INIT EQU $FB2F SETVID EQU $FE93 SETKBD EQU $FE89 MONITOR EQU $FF59 SETNORM EQU $FE84 CROUT EQU $FD8E COLDSTART EQU $FAA6 TABV EQU $FB5B OUTPORT EQU $FE95 SETPWRC EQU $FB6F WAIT EQU $FCA8 ; ***** KEYS ***** ESC EQU $9B ESCAPE EQU $9B LARROW EQU $88 RARROW EQU $95 UPARROW EQU $8B DNARROW EQU $8A RETURN EQU $8D CR EQU $8D LF EQU $8A CTRL.D EQU $84 BLANK EQU $A0 ASTERISK EQU $AA CTRLY EQU $99 CTRLQ EQU $91 CTRLU EQU $15 EIGHT EQU $B8 FOUR EQU $B4 ; ;***** SCREEN CHARS ***** CURSOR EQU $20 ;INVERSE SPACE ***** TEXT SCREEN PARAMS ***** CV EQU $25 CHAR VERT POSITION CH EQU $24 HORZ TOPEDGE EQU $22 ;TOP EDGE OF WINDOW STORED HERE. WNDBTM EQU $23 ;bottom edge of window storeed here ; ***** I/O LOCATIONS ***** SPEAKER EQU $C030 OPENAPPLE EQU $C061 CLOSEDAPPLE EQU $C062 ;neg when pressed CSWL EQU $36 KSWL EQU $38 WNDWDTH EQU $21 ;WINDOW WIDTH PROMPT EQU $33 ;CHAR DISPLAYED ; *****PAGE ZERO LOCAL STORAGE TEMP1 EQU $CE TEMP2 EQU $CF TBLPTR EQU $EE ;POINTER TO TABLE OF I/O AREAS PTBLPTR EQU $EB ;AND $EC PAGEINDEX EQU $ED ;BLOCKIO COUNTER PAGE0TEMP1 EQU $FC PAGE0TEMP2 EQU $FD PAGE0TEMP3 EQU $FE PAGE0TEMP4 EQU $FF RPTDPAGECTR EQU $F9 ;USED BY FINDRPTDAREA,STASH80 RPTDAREALEN EQU $FA ;AS PRECEDING. RAMPTR EQU $FE ;-$FF: UTILITY FOR INNER LOOPS TO RAM LMARGIN EQU $FF RMARGIN EQU $FE ;TEMPS USED BY GETNAME ; VCURSOR EQU $25 ;OUTPUT CURSOR LOC HCURSOR EQU $24 ;LIKEWISE, HORIZ. MSGTOP EQU $F9 ;VECTOR TO 1ST CHAR OF CURRENT MSG VERTPTR EQU $FB ;VECTOR TO TABLE OF VER LINE SPACINGS BEFORE MSGS LISTPTR EQU $FD ;VEC TO PARMLIST ; ;zero page used by rwtspro: SLOTPTR EQU $1B ;ptr to CN00 for unidisk ;zero page used by prodos device drivers: PCOMMAND EQU $42 ;status, read,write, or format UNIT.NUM EQU $43 ; DR SLOT SLOT SLOT UNUSED UNUSED UNUSED UNUSED BUFF512PTR EQU $44 BLOCK.NUM EQU $46 ;block number on device ; ;device driver error codes: IOERROR EQU $27 NODEVICE EQU $28 ;no device connected WRITEPROTECTD EQU $2B ; ;device driver ROM code locations (begin with $CN) TOTALBLOCKS EQU $FC ;num of blocs on device; 00 = check STATUS to find out STATUSBYTE EQU $FE ENTRYPTR EQU $FF ;points to entry location for driver routines ; ; ;NOTE THAT 6-9 ARE USED BY SAVE/RESTORE ; ; ; ; *SUBJECT PROGRAM *CONFIGURATION DETAILS ('CONFIGUR') *BIT0= *BIT1= 'USES A MOUSE (to generate vbl interrupts)' *BIT2= 'USES 2E-TYPE 128K' ' *BIT3= 'MADE ON A 2E' *BITS 4-6 = ID OF 80-COL CARD LAST USED BY PGM *BIT7= 'USES AN 80-COL CARD' ******** ; ; *PRESENT HARDWARE *CONFIGURATION DETAILS ('MACHINEID') *BIT0= *BIT1= 'HAS A MOUSE' *BIT2= 'HAS 2E-TYPE 128K' ' *BIT3= 'IS A 2E' *BITS 4-6 = ID OF 80-COL CARD USER SAYS IS PRESENT *BIT7= 'HAS AN 80-COL CARD' *************** ; MOUSEBIT EQU $02 BIT2E EQU $08 BITAUXMEM EQU $04 BITSID80COL EQU $70 BIT80COL EQU $80 ; ID2E80COL EQU $10 IDVIDEX EQU $20 IDVISION80 EQU $40 IDSUPRTERM EQU $60 IDOTHER EQU $70 ; ; *************** ; * SCREENHOLES ; VIDEXSTART EQU $6FB ;SCRN START MODE80 EQU $4FB ;when ANDed with #$D6, 0 means 80-col active. ; ; ****************OP CODES BITZ EQU $24 ;bit a z-page operand RTS EQU $60 CLI EQU $58 SEI EQU $78 ; ****************RAMCARD IDS ; IDSATURN EQU 1 IDROCON EQU 2 IDLEGEND EQU 3 IDRAMWORKS EQU 4 IDNEPTUNE EQU 5 IDAUXMEM EQU 6 IDSLINKY EQU 7 IDBIGBOARD EQU 8 ; RAMWORKSADDR EQU $C073 NEPTUNEADDR EQU $C071 ;control addr AUXMEMADDR EQU $C030 ;DUMMY ADDR AUX0ACCESS EQU 0 ;bank no of default bank in ramworks & neptune SLINKYLOW EQU $C080 SLINKYMED EQU $C081 SLINKYHIGH EQU $C082 SLINKYDATA EQU $C083 BIGBOARDADDR EQU $C08C ; BITRW EQU $80 ;BIT'S VALUE SHOWS WHETHER TO RD OR WT TO BANK-SWITCH CARD BITAUX EQU $40 ;bit in typetbl is on if card is in aux slot ; MAXQUANT EQU 4 ;max no of workspaces ********************************** ; AUXMOVE PARMS ; A1L EQU $3C A1H EQU $3D A2L EQU $3E A2H EQU $3F A4L EQU $42 A4H EQU $43 AUXMOVE EQU $C311 ; ; ********************************** ; MISC PARAMS SHOWNAMEFLAG EQU $40 ;to prmenu, means 'show name' SHOWWSFLAG EQU $41 ;'Workspace' NAMELEN EQU 9 ;LENGTH OF SHUTTLE NAMES NAMEVERT EQU 2 ;line on which names appear VINT EQU 2 ;vert drop btw lines on shuttle menu DO APPLE2E MSGAREA EQU 16 ;VERTICAL DROP TO TOP OF MENU MESSAGEAREA. ELSE MSGAREA EQU 17 FIN DISKMSGS EQU 22 ;DISK ERROR MESSAGE LINE ZERO EQU $0000 KBD EQU $C000 CLEARKBD EQU $C010 RCARDOFF EQU $C082 RMWMB2 EQU $C082 RPWMB2 EQU $C080 RPWMB1 EQU $C088 RPWPB1 EQU $C08B RPWPB2 EQU $C083 SWAPALLAREA EQU $6800 SWAPALLFIRST8 EQU SWAPALLAREA+$1800 IRQFLAG EQU $04 ;irq disable flag within status reg * * APPLE VARIETIES' IDs IDBYTE EQU $FBB3 APPLE2EID EQU $06 ; ; ; ;mouse params MOUSEMODE EQU $07FC SETMS EQU $12 SERVEMS EQU $13 READMS EQU $14 CLEARMS EQU $15 POSMS EQU $16 CLAMPMS EQU $17 HOMEMS EQU $18 INITMS EQU $19 ; ; SBTL "DOS 3.3 RWTS" ENDCODE EQU * ENDPAGE EQU ?@ABCDEFGHIJKLMNOPQRSTUVWMEL EQU $46 SYNCNT EQU $45 DTRACK EQU $44 DVOLUME EQU $41 IOBPH EQU $49 IOBPL EQU $48 ROM EQU $C081 PHASEOFF EQU $C080 LC08F EQU $C08F LC08E EQU $C08E LC08D EQU $C08D LC08C EQU $C08C LC08B EQU $C08B LC08A EQU $C08A LC089 EQU $C089 LC088 EQU $C088 XBASIC EQU $E000 SETVIDD EQU $FE93 ; DO SCRATCHPAD ;USING.PP.4-7? ; CURTRK EQU $478 DRV0TRK EQU $478 SEEKCNT EQU $4F8 DRV1TRK EQU $4F8 RETRYCNT EQU $578 DSLOT EQU $5F8 DSLOTABS EQU $678 RECALCNT EQU $6F8 FIN ; DO WRITE ; ; PRENIBBLIZE ROUTINE ; ; CONVERTS 256 BYTES POINTED AT BY ; BUFADR TO 342 6-BIT NIBBLES ; OF THE FORM 00XXXXXX ; ;Put resulting 342 nibbles into two buffers: NBUF1 (one page long) ;and NBUF2 ($56 bytes long). ;Method: make one long pass thru BUFFADR from BUFFADDR,$FF thru ;BUFFADDR,$00. Make concurrent pass thru NBUF1 $FF thru $00 and ;three passes thru NBUF2: $2 thru $55, $0 thru $55, $0 thru $55. ;At each step, take the rightmost two bits off BUFFADDR, shift them into ;NBUF2, and copy the remaining 00xxxxxx from BUFFADDR to NBUF1. ; Thus each byte of NBUF2 gets three pairs of bits, each pair from source ;bytes $56 bytes apart from the next pair's source byte. ; ;march 85: the first two lines of the routine are changed from standard, ;to make it possible for BUFFADDR and NBUF1 to be overlaid. The replaced ;code read BUFFADDR in two passes, $2 thru $0 and $FF thru $0, which ;trashed the first two bytes of BUFFADDR in case of an overlay. ; ; PRENIB16 LDX #2 ;(changed from #0 ; RPS 3/85) LDY #0 ;(changed from #2 ; RPS 3/85) ; ; Get next user byte ; PRENIB1 DEY LDA (BUFADR),Y ; ; Shift L.O. two bits into ; NBUF2. ; LSR A ROL NBUF2,X LSR A ROL NBUF2,X ; ; Put H.O. six bits (shifted right) ; into NBUF1. ; STA NBUF1,Y INX CPX #$56 BCC PRENIB1 ; ; ; Done yet? ; LDX #0 TYA ;just to set '=' flag BNE PRENIB1 ; ; ; strip H.O. two bits of NBUF2. ; LDX #$55 PRENIB2 LDA NBUF2,X AND #$3F STA NBUF2,X DEX BPL PRENIB2 RTS ; ; ; Write subroutine ; ; Writes prenibbilized data in ; NBUF1 and NBUF2 to disk. ; ; note: this stuff is all time ; critical. ; ; watch page boundries, don't ; remove NOP's, etc. ; ; ; WRITE16 SEC ;anticipate write protect STX DSLOTZ STX DSLOTABS LDA LC08D,X LDA LC08E,X ;sense write protect BMI WEXIT LDA NBUF2 STA WTEMP LDA #$FF ;sync byte STA LC08F,X ;write 1st nibble ORA LC08C,X PHA PLA NOP LDY #4 ; ; ; Write the sync byte ; WSYNC PHA PLA JSR WNIBL7 DEY BNE WSYNC LDA #$D5 ;first data mark JSR WNIBL9 LDA #$AA ;2nd data mark JSR WNIBL9 LDA #$AD ;3rd data mark JSR WNIBL9 TYA ;clear checksum LDY #$56 ;NBUF2 index BNE X1 ;always taken ; ; ; WDATA0 LDA NBUF2,Y ;get prior 6-bit nibble X1 EOR NBUF2-1,Y ;and XOR with current nibble TAX LDA NIBL,X LDX DSLOTZ STA LC08D,X ;write nibble LDA LC08C,X DEY ;next nibble BNE WDATA0 ; ; ; ; now handle NBUF1. ; ; ; get prior nibble ; LDA WTEMP NOP ; ; loop to write out data in NBUF1 ; WDATA2 EOR NBUF1,Y TAX LDA NIBL,X LDX DSLOTABS STA LC08D,X ;write nibble LDA LC08C,X LDA NBUF1,Y INY BNE WDATA2 TAX LDA NIBL,X ; ; write checksum ; LDX DSLOTZ JSR WNIBL ; ; write epilog to data ; LDA #$DE ;DM4, bit slip mark JSR WNIBL9 LDA #$AA ;DM5, bsm JSR WNIBL9 LDA #$EB ;DM6, bsm JSR WNIBL9 ; ; All done, close up the shop! ; LDA #$FF JSR WNIBL9 ; ; turn off the write mode ; LDA LC08E,X ; ; and back to the read mode ; WEXIT LDA LC08C,X RTS ; ; ; ; WNIBL9 9 cycles, then write ; WNIBL9 CLC ; ; WNIBL7 7 cycles, then write ; WNIBL7 PHA PLA ; ; ; write nibble to disk ; WNIBL STA LC08D,X ORA LC08C,X RTS ; FIN ; ; ; ; Post nibblize routine. ; ; converts 342 nibbles of the form ; ; 00xxxxxx ; ; to eight bit bytes. ; ; The nibbles are stored in NBUF1 ; and NBUF2, the 8-bit bytes will ; be stored at (BUFADR). ; ;Makes one pass thru (BUFFADDR) and NBUF1 from $0 to $FF, ; and 3 passes thru NBUF2: $55 to 0, $55 to 0, $55 to 2. ; ; POSTNB16 LDY #0 POST1 LDX #$56 POST2 DEX BMI POST1 ; ; get byte and shift in L.O. two ; bits from NBUF2 ; LDA NBUF1,Y LSR NBUF2,X ROL A LSR NBUF2,X ROL A ; ; store in user buffer ; STA (BUFADR),Y INY CPY TO BNE POST2 RTS ; ; ; READ routine, reads a sector ; from the disk and stores the ; data in NBUF1 and NBUF2. ; READ16 LDY #$20 ; ; get sync bytes ; RSYNC DEY BEQ RDERR ; ; wait until a byte is recieved ; from the disk drive. ; X2 LDA LC08C,X BPL X2 ; ; byte recieved, check for DM1 ; RSYNC1 EOR #$D5 BNE RSYNC NOP ; ; get next byte and check for ; DM2 ; X3 LDA LC08C,X BPL X3 CMP #$AA BNE RSYNC1 LDY #$56 ; ; Check for DM3 ; X4 LDA LC08C,X BPL X4 CMP #$AD BNE RSYNC1 ; ; Read the data from the sector ; LDA #0 ;init checksum ; ; Read stuff into NBUF2 ; RDATA1 DEY STY IDX X5 LDY LC08C,X BPL X5 EOR MSWAIT,Y LDY IDX STA NBUF2,Y BNE RDATA1 ; ; Read stuff into NBUF1 ; RDATA2 STY IDX X6 LDY LC08C,X BPL X6 EOR MSWAIT,Y LDY IDX STA NBUF1,Y INY BNE RDATA2 ; ; get and check the checksum byte ; X7 LDY LC08C,X BPL X7 CMP MSWAIT,Y BNE RDERR ; ; check for DM4 ; X8 LDA LC08C,X BPL X8 CMP #$DE BNE RDERR NOP ; ; check for DM5 ; X9 LDA LC08C,X BPL X9 CMP #$AA BEQ RDADRX RDERR SEC RTS ; ; ; Read address field. ; ; Reads starting address marks ; ($D5, $AA, $96), address info ; (volume/track/sector/checksum), ; and closing address marks ; ($DE, $AA) ; RDADR16 LDY #$FC STY COUNT RDASYN INY BNE Y0 INC COUNT BEQ RDERR ; ; Read first address mark ($D5) ; Y0 LDA LC08C,X BPL Y0 RDASYN1 CMP #$D5 BNE RDASYN NOP ; ; Read next address mark ; Y1 LDA LC08C,X BPL Y1 CMP #$AA BNE RDASYN1 LDY #3 ; ; Read last address mark ; Y2 LDA LC08C,X BPL Y2 CMP #$96 BNE RDASYN1 ; ; init checksum and read the ; address data field (four bytes) ; LDA #0 RDAFLD STA CSUM ; ; Read 'odd' bit nibble ; Y3 LDA LC08C,X BPL Y3 ROL A STA LAST ; ; Read even bit nibble. ; Y4 LDA LC08C,X BPL Y4 ; ; Merge the two. ; AND LAST ; ; store the data byte, update ; checksum, and repeat until ; entire address field is read. ; STA DSLOTEMP+1,Y EOR CSUM DEY BPL RDAFLD ; ; Checksum (in acc) must be 0. ; TAY BNE RDERR ; ; Read first epilogue byte ($DE) ; Y5 LDA LC08C,X BPL Y5 CMP #$DE BNE RDERR NOP ; ; Read second epilogue byte ($AA) ; Y6 LDA LC08C,X BPL Y6 CMP #$AA BNE RDERR RDADRX CLC RTS ; ; ; SEEKABS routine, moves the ; disk head over the desired ; track. ; SEEKABS STX DSLOTEMP STA TRKN CMP DRV0TRK BEQ RTS0 LDA #0 STA TRKCNT MOVEHEAD LDA DRV0TRK STA PRIOR SEC SBC TRKN BEQ ISTHERE BCS Z0 EOR #$FF INC DRV0TRK BCC Z1 Z0 ADC #$FE DEC DRV0TRK Z1 CMP TRKCNT BCC Z2 LDA TRKCNT Z2 CMP #$C BCS Z3 TAY Z3 SEC JSR CHKPOS LDA ONTBL,Y JSR MSWAIT LDA PRIOR CLC JSR CHKPOS2 LDA OFFTBL,Y JSR MSWAIT INC TRKCNT BNE MOVEHEAD ISTHERE JSR MSWAIT CLC CHKPOS LDA DRV0TRK CHKPOS2 AND #3 ROL A ORA DSLOTEMP TAX LDA PHASEOFF,X LDX DSLOTEMP RTS0 RTS TAX LDY #$A0 ; ; ; Head move delay subroutine ; delays ACC*100 usec ; ; MSWAIT LDX #$11 A2 DEX ;delay 86 usec BNE A2 INC MONTIMEL BNE A3 INC MONTIMEH A3 SEC SBC #1 BNE MSWAIT RTS ; ; ; PHASEON/PHASEOFF tables ; ONTBL DFB 01,$30 DFB $28,$24,$20,$1E,$1D,$1C,$1C,$1C,$1C,$1C OFFTBL DFB $70,$2C,$26,$22,$1F,$1E,$1D,$1C,$1C,$1C,$1C,$1C ; ; ; ; DO WRITE ; ; ; Write translate tables ; NIBL DFB $96,$97,$9A,$9B,$9D,$9E,$9F,$A6,$A7,$AB,$AC,$AD,$AE,$AF,$B2,$B3 DFB $B4,$B5,$B6,$B7,$B9,$BA,$BB,$BC,$BD,$BE,$BF,$CB,$CD,$CE,$CF,$D3 DFB $D6,$D7,$D9,$DA,$DB,$DC,$DD,$DE,$DF,$E5,$E6,$E7,$E9,$EA,$EB,$EC DFB $ED,$EE,$EF,$F2,$F3,$F4,$F5,$F6,$F7,$F9,$FA,$FB,$FC,$FD,$FE,$FF ; ; FIN ; ; Interleave remapping table ; INTRLEAV DFB $D0,$AD,$7B,$49,$17,$E5,$B3,$81,$5E,$2C,$FA,$C8,$96,$64,$32,$0F ; ; This routine sets the slot ; dependant track location ; SETTRK PHA LDY #2 LDA (IOBPL),Y ROR A ROR DRIVNO JSR XTOY PLA ASL A BIT DRIVNO BMI ONDRV0 STA DRV1TRK,Y BPL RTS3 ONDRV0 STA DRV0TRK,Y RTS3 RTS ; ; ; ORG MSWAIT+$96 ; ; DFB 00,$01,$98,$99,$02,$03,$9C,$04,$05,$06,$A0,$A1,$A2,$A3,$A4,$A5 DFB 07,$08,$A8,$A9,$AA,$09,$0A,$0B,$0C,$0D,$B0,$B1,$0E,$0F,$10,$11 DFB $12,$13,$B8,$14,$15,$16,$17,$18,$19,$1A,$C0,$C1,$C2,$C3,$C4,$C5 DFB $C6,$C7,$C8,$C9,$CA,$1B,$CC,$1C,$1D,$1E,$D0,$D1,$D2,$1F,$D4,$D5 DFB $20,$21,$D8,$22,$23,$24,$25,$26,$27,$28,$E0,$E1,$E2,$E3,$E4,$29 DFB $2A,$2B,$E8,$2C,$2D,$2E,$2F,$30,$31,$32,$F0,$F1,$33,$34,$35,$36 DFB $37,$38,$F8,$39,$3A,$3B,$3C,$3D,$3E,$3F ; ; ; ; nibble buffers, must be in this ; order! ; NBUF1 EQU STASH NBUF2 EQU STASH2 ; ; ; DO INITIALZ ; ; ; Write an address field routine ; ; WRADR16 SEC ;assume W/P error LDA LC08D,X LDA LC08E,X BMI WPERROR ; ; output sync byte ; LDA #$FF STA LC08F,X CMP LC08C,X PHA PLA FRMSYNC JSR WAIT12 JSR WAIT12 STA LC08D,X CMP LC08C,X NOP DEY BNE FRMSYNC ; ; output data marks ; LDA #$D5 JSR WBYTE9 LDA #$AA JSR WBYTE9 LDA #$96 JSR WBYTE9 ; ; output volume track sector ; and checksum ; LDA DVOLUME JSR WBYTE LDA DTRACK JSR WBYTE LDA BUFADR+1 JSR WBYTE LDA DVOLUME EOR DTRACK EOR BUFADR+1 PHA LSR A ORA BUFADR STA LC08D,X LDA LC08C,X PLA ORA #$AA JSR WBYTE11 ; ; output data marks 4,5, and 6 ; LDA #$DE JSR WBYTE9 LDA #$AA JSR WBYTE9 LDA #$EB JSR WBYTE9 CLC WPERROR LDA LC08E,X LDA LC08C,X WAIT12 RTS ; ; ; Write a byte as two four bit ; nibbles to the disk. ; WBYTE PHA LSR A ORA BUFADR ; ; write odd bits ; STA LC08D,X CMP LC08C,X PLA NOP NOP NOP ORA #$AA WBYTE11 NOP WBYTE9 NOP PHA PLA ; ; write even bits ; STA LC08D,X CMP LC08C,X RTS ; ; ; FIN DO INITIALZ ; ; FORCE RWTS TO PAGE BOUNDRY ; DS 33 ; ; FIN ; ; ; ; ; RWTS entry point ; ; RWTS EQU * ; ; upon entry, A AND Y point at IOB ; STY IOBPL STA IOBPH ; ; set up for one recal and 4 seeks ; LDY #2 STY RECALCNT LDY #4 STY SEEKCNT ; ; get slot # ; LDY #1 LDA (IOBPL),Y TAX ; ; ; see if slot # was changed ; LDY #$F CMP (IOBPL),Y BEQ SAMEDSLOT ; ; if so, turn off old drive ; TXA PHA LDA (IOBPL),Y TAX PLA PHA STA (IOBPL),Y LDA LC08E,X ; ; delay until data is constant ; STILLON LDY #8 LDA LC08C,X NOTSURE CMP LC08C,X BNE STILLON DEY BNE NOTSURE PLA TAX ; ; ; start the motor up ; SAMEDSLOT LDA LC08E,X LDA LC08C,X LDY #8 NOTSURE2 LDA LC08C,X PHA PLA PHA PLA STX DSLOT CMP LC08C,X BNE B3 DEY BNE NOTSURE2 B3 PHP LDA LC089,X ; ; move necessary pointers to ; page zero ; LDY #6 PTRMOVE LDA (IOBPL),Y STA PTRSDEST,Y INY CPY #$A BNE PTRMOVE ; ; get other parameters ; LDY #3 LDA (DEVCTBL),Y STA MONTIMEH LDY #2 LDA (IOBPL),Y LDY #$10 CMP (IOBPL),Y BEQ C4 STA (IOBPL),Y PLP LDY #0 PHP C4 ROR A BCC C5 LDA LC08A,X BCS DRVSEL C5 LDA LC08B,X ; ; save which drive is being used ; DRVSEL ROR DRIVNO PLP PHP BNE NOWAIT LDY #7 ; ; wait 100 usec for old drive's ; timing capacitor to discharge ; STEPWAIT JSR MSWAIT DEY BNE STEPWAIT LDX DSLOT NOWAIT LDY #4 LDA (IOBPL),Y JSR MYSEEK PLP BNE TRYTRK LDY MONTIMEH BPL TRYTRK ; ; wait for motor to come up to ; speed. ; MOTOROFF LDY #$12 C6 DEY BNE C6 INC MONTIMEL BNE MOTOROFF INC MONTIMEH BNE MOTOROFF ; ; disk is now up to speed. ; if not format operation, ; position the head over the ; proper track ; TRYTRK LDY #$C LDA (IOBPL),Y BEQ GALLDONE DO INITIALZ CMP #4 BEQ FORMDSK FIN ; ROR A PHP ;save R/W status BCS TRYTRK2 ; ; if a read operation, must ; prenibblize first. ; JSR PRENIB16 ; ; ; set up for a maximum of 48 ; retries. ; TRYTRK2 LDY #$30 STY RETRYCNT TRYADR LDX DSLOT JSR RDADR16 BCC RDRIGHT TRYADR2 DEC RETRYCNT BPL TRYADR ; ; recalibrate disk head ; RECAL LDA CURTRK PHA LDA #$60 JSR SETTRK DEC RECALCNT BEQ DRVERROR LDA #4 STA SEEKCNT LDA #0 JSR MYSEEK PLA RESEEK JSR MYSEEK JMP TRYTRK2 ; ; ; We have just read an address ; field, now check for desired ; track, sector, and volume ; RDRIGHT LDY TRKFND CPY CURTRK BEQ RTTRK ; ; ;DO ANYSECTOR ;TYA ;PHA ;JSR CROUT1 ;PLA ;TAY ;FIN ; ; ; ; Save dest track value ; LDA CURTRK PHA TYA JSR SETTRK PLA DEC SEEKCNT BNE RESEEK BEQ RECAL ; ; Bad drive error. ; DRVERROR PLA LDA #$40 ; ; JMPTO1 PLP JMP HNDLERR GALLDONE BEQ ALLDONE ; DO INITIALZ FORMDSK JMP DSKFORM FIN ; ; ; Drive is on the right track, ; now check for a vol mismatch ; RTTRK EQU * ;DO ANYSECTOR ;ELSE ;LDY #3 ;LDA (IOBPL),Y ;get desired volume ;PHA ; ; Save volume actually found in ; RWTS IOB. ; ;LDA VOLFND ;LDY #$E ;STA (IOBPL),Y ; ; If volume specified was zero, ; no error. ; ;PLA ;BEQ CRCTVOL ; ; Otherwise, check for a volume ; mismatch error. ; ;CMP VOLFND ;BEQ CRCTVOL ;LDA #$20 ;BNE JMPTO1 ;FIN ; ; DO ANYSECTOR CRCTVOL EQU * ;DISPLAY FOUND SECTOR NUMBER (HARD) LDA SECFND ;SECTOR FOUND ;JSR PRBYTE ;JSR PRBLNK ;OUTPUT A SPACE SECSTORE EQU * STA $0300 ;LIST SECTORS IN PAGE 3 INC SECSTORE+1 ELSE ; ; ; now check for the correct sector ; CRCTVOL LDY #5 LDA (IOBPL),Y ;get the sector # ; ; Convert to a "soft" sector ; number by applying the software ; interleave. ; TAY LDA INTRLEAV,Y ; DO AUXINTRLEAV PHA LDA DISKAUXFLAG ;CHECK IF AUX MEM BEING DUMPED OR LOADED BEQ NORMINTRLEAV PLA LSR A LSR A ;GET AUX INTERLEAVE VALUE LSR A LSR A PHA NORMINTRLEAV EQU * PLA FIN ; AND #$F ;ZERO LEFT NIBBLE ; ; Are we at that sector yet? ; CMP SECFND BNE TRYADR2 ; FIN ; ; ; If so, see if we are doing a ; read or a write. ; PLP BCC WRIT ; ; Reading, so read in the 256 ; bytes of data that follow. ; JSR READ16 PHP BCS TRYADR2 PLP LDX #0 STX TO ; ; Convert the nibbles to bytes. ; JSR POSTNB16 LDX DSLOT ALLDONE CLC DFB $24 ;BIT L38 HNDLERR SEC ;OPCODE SKIPPED BY BIT L38 LDY #$D STA (IOBPL),Y LDA LC088,X RTS ; ; DO WRITE ; ; ; ; Performing a write, write the ; data (already nibblized) to ; the following data sector. ; WRIT JSR WRITE16 BCC ALLDONE LDA #$10 BCS HNDLERR ; ; FIN ; ; ; ; DO INITIALZ ; ; ; ; This is the disk formatter ; routine. ; DSKFORM LDY #3 LDA (IOBPL),Y STA DVOLUME ; ; Save timing constant in zero ; page (for time critical section) ; LDA #$AA STA BUFADR LDY #$56 ; ; Set up to start a track zero. ; LDA #0 STA DTRACK ; ; ; zero secondary buffer. ; C9 STA NBUF2-1,Y DEY BNE C9 ; ; zero primary buffer. ; D0 STA NBUF1,Y DEY BNE D0 ; ; Pretend we are at track 40 ; (acc=2*maxtracks) ; LDA #$50 JSR SETTRK ; ; Start with 40 bytes of self ; sync bytes. ; LDA #$28 STA SYNCNT ; ; Got to the track and format it. ; NXTTRK LDA DTRACK JSR MYSEEK JSR DISKF2 ; ; Init in case of DISK I/O error. ; LDA #8 BCS HNDERR LDA #$30 STA RETRYCNT ; ; Verify the track just formatted. ; NOGOOD SEC DEC RETRYCNT BEQ HNDERR ; ; Read the address field. ; JSR RDADR16 BCS NOGOOD ;something wrong? ; LDA SECFND BNE NOGOOD ; ; Read the data and see if it's ; ok. ; JSR READ16 BCS NOGOOD ; ; A-OK, move on to the next track. ; INC DTRACK ; ; At the last track yet? ; LDA DTRACK CMP #$23 BCC NXTTRK ; ; Force error flag (carry) off. ; CLC BCC DONEDSK ; ; ; Store error code in IOB. ; HNDERR LDY #$D STA (IOBPL),Y SEC ; ; Turn the disk off. ; DONEDSK LDA LC088,X RTS ; ; Format the current track. ; DISKF2 LDA #0 ;init sector # STA BUFADR+1 LDY #$80 ;begin track with 128 sync bytes ; BNE D33 ; ; TRKFRM LDY SYNCNT D33 JSR WRADR16 ;write an address field BCS DELAY12 ; ; Write a data field. ; JSR WRITE16 BCS DELAY12 ; ; Increment the sector number ; and see if it is 16 yet. ; INC BUFADR+1 LDA BUFADR+1 CMP #$10 BCC TRKFRM ; ; Reset sector # to 15 ; LDY #$F STY BUFADR+1 ; ; mark the current track as ; formatted. ; LDA #$30 STA RETRYCNT INITIALZMAP STA SECMAP,Y DEY BPL INITIALZMAP LDY SYNCNT DELAY JSR DELAY12 JSR DELAY12 JSR DELAY12 PHA PLA NOP DEY BNE DELAY JSR RDADR16 BCS DOAGAIN LDA SECFND BEQ ITSGOOD LDA #$10 CMP SYNCNT LDA SYNCNT SBC #1 STA SYNCNT CMP #5 BCS DOAGAIN SEC RTS NXTSEC JSR RDADR16 BCS NXTTRY ITSGOOD JSR READ16 BCC MARKMAP NXTTRY DEC RETRYCNT BNE NXTSEC DOAGAIN JSR RDADR16 BCS ERRCNT LDA SECFND CMP #$F BNE ERRCNT JSR READ16 BCC DISKF2 ERRCNT DEC RETRYCNT BNE DOAGAIN SEC DELAY12 RTS MARKMAP LDY SECFND LDA SECMAP,Y BMI NXTTRY LDA #$FF STA SECMAP,Y DEC BUFADR+1 BPL NXTSEC LDA DTRACK BNE TRKDONE LDA SYNCNT CMP #$10 BCC DELAY12 DEC SYNCNT DEC SYNCNT TRKDONE CLC RTS ; ; ; ; SECMAP- used to mark initialized ; sectors. ; SECMAP DFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; ; ; FIN ; ; ; MYSEEK is the seek routine, ; it seeks track 'N' in slot ; X/16 ; ; If DRIVNO is negative - drive 0 ; If DRIVNO is positive - drive 1 ; MYSEEK PHA LDY #1 LDA (DEVCTBL),Y ROR A PLA BCC SEEK1 ASL A JSR SEEK1 LSR CURTRK RTS SEEK1 STA TRKN JSR XTOY LDA DRV0TRK,Y BIT DRIVNO BMI WASDO LDA DRV1TRK,Y WASDO STA DRV0TRK LDA TRKN BIT DRIVNO BMI ISDRV0 STA DRV1TRK,Y BPL GOSEEK ISDRV0 STA DRV0TRK,Y GOSEEK JMP SEEKABS XTOY TXA LSR A LSR A LSR A LSR A TAY RTS ; ; ; DO PATCH ; ; DOS 3.3 patches. WARNING! These ; are addressed by object code ; and should not be moved without ; careful thought. ; JSR SETVIDD LDA ROM LDA ROM LDA #0 STA XBASIC JMP RESTART ; ; UNUSED ; DS 3 ; ; STA TEMP111 STA BYTVAL STA BYTVAL+1 RTS JSR RSET0 STY RUNINTRC RTS JSR SAVFMW LDX STKSAVE TXS JSR CLOSEALL TSX STX STKSAVE LDA #9 JMP SETERROR ; ; FIN ; ; DO SCRATCHPAD ;USING.PP.4-7? ELSE ; *SCRATCHPAD ADDRS TO BE COPIED TO INTERNAL SCRATCHPAD OLDDRV0TRK EQU $478 OLDDRV1TRK EQU $4F8 ; CURTRK EQU * DRV0TRK DFB $B ;TRACK 'B' DS 7 SEEKCNT EQU * DRV1TRK DFB $B DS 7 RETRYCNT DFB 0 DSLOT DFB 0 DSLOTABS DFB 0 RECALCNT DFB 0 FIN SBTL .GET CURRENT SOFTSWITCH VALUES. * ; ; ; ; ; ; ROMENABLE EQU $C081 ROM1ENABLE EQU $C089 ROM1PROTECT EQU $C08A ROM2ENABLE EQU $C081 ROM2PROTECT EQU $C082 RAM1ENABLE EQU $C08B RAM2ENABLE EQU $C083 ; *...ADDRS.TO.SET.SOFT.SWITCHES SW80STORE EQU $C000 SWRAMRD EQU $C002 SWRAMWRT EQU $C004 SWSLOTSDISABL EQU $C006 SWAUXZP EQU $C008 SWSLOT3ENABLE EQU $C00A SW80COL EQU $C00C SWALTCHARSET EQU $C00E SWTEXT EQU $C050 SWMIXED EQU $C052 SWPAGE2 EQU $C054 SWHIRES EQU $C056 SWSOFTSET EQU $C020 ;FAKE.ADDR=CAXZ[\]^_`abcdeSSETTE.TOGGLE ANNUNC3 EQU $C05E ; ; *...ADDRS.TO.READ.SOFT.SWITCHES RDLCBNK2 EQU $C011 RDLCRAM EQU $C012 RAMWRT EQU $C014 RAMRD EQU $C013 AUXZP EQU $C016 SLOT3ENABLE EQU $C017 SLOTSDISABL EQU $C015 READSWITCH EQU $C018 X80STORE EQU $C018 X80COL EQU $C01F ALTCHARSET EQU $C01E PAGE2 EQU $C01C ; ; *ADDR IDENTIFYING //E INTERNAL ROM AT C800: C8IDADDR EQU $C801 C8IDVAL EQU $4A ;VALUE AT THAT ADDR ; ; DO SHELL LST ON FIN ; *BIT.POSITIONS * *..SOFT: *...0=80STORE *...1=SOFTSET..SHOWS SOFT HAS BEEN GIVEN A VALUE *...2=TEXT *...3=MIXED *...4=PAGE2 *...5=HIRES *...6=ALTCHARSET *...7=80COL * * * * *..FFEXSTOW: (USED ON //E ONLY) *...0=DISABLESLOTS (ENABLE INTERNAL ROM) *...1=RAMRD auxiliary RAM enabled for reading *...2=RAMWRT aux RAM enabled for writing *...3=SLOT3ENABLE (ENABLE REAR SLOT 3 ON //E) *.....(SET 'OFF' BY PRESENCE OF //E 80-COL CARD AT POWER-ON) *...4=ENABLE C800 INTERNAL ROM (CAN BE DISABLED BY CFFF) *...5=AUXZP (auxiliary zeropage/stack) is enabled *...7=ENABLESLOTS(BEFORE.VERS.7.0F) DO SHELL LST OFF FIN X80STOREBIT EQU $01 SOFTSETBIT EQU $02 TEXTBIT EQU $04 MIXEDBIT EQU $08 PAGE2BIT EQU $10 HIRESBIT EQU $20 ALTCHARSETBIT EQU $40 X80COLBIT EQU $80 ; *2+.TYPE.MODE SWITCHES TEXT1 EQU $24 TEXT2 EQU $34 HIRES1 EQU $20 HIRES2 EQU $30 LORES1 EQU $00 LORES2 EQU $10 HIMIXED1 EQU $28 HIMIXED2 EQU $38 LOMIXED1 EQU $08 LOMIXED2 EQU $18 ; *..FFEXSTOW BIT VALUES: SLOTSDISBIT EQU $01 ENAC800BIT EQU $10 ; ; ; SWTABLE EQU * ;SWITCH.WRITE.ADDRS.IN.ORDER.0-7.OF.BITS.IN.SOFT DFB >SW80STORE DFB >SWSOFTSET DFB >SWTEXT DFB >SWMIXED DFB >SWPAGE2 DFB >SWHIRES DFB >SWALTCHARSET DO SHUTTLE ELSE SW80COLADDR EQU * FIN DFB >SW80COL MACHINID DFB 0 ; ; * SETBOOTSOFT EQU * ;set screenswitches to default values LDA #TEXT1 BNE SETSOFT ; * RESETSOFT EQU * ;CLEAR SOFT SWITCHES to values for snapshot menus LDA #TEXT1+ALTCHARSETBIT ;TEXT.PAGE1.40-COL * *SET SOFT SWITCHES TO VAL IN ACCUM ;VOLATILE: A,TEMP1,TEMP2 ; ; SETSOFT EQU * STA P0TEMP2 TYA PHA TXA PHA LDY SOFTMASK ;WHICH.SWITCHES.USED.ON.THIS.TYPE.OF.APPLE? STY P0TEMP1 LDX #7 ;BIT.NO SETLOOP EQU * ROL P0TEMP2 ;GET LEFT BIT LDY SWTABLE,X ;GET 'TURN SWITCH OFF' ADDR BCC SWOFF ;BCH IF SW IS TO BE TURNED OFF INY ;'TURN SWITCH ON' ADDR SWOFF EQU * ROL P0TEMP1 ;GET LEFT BIT BCC NOTUSED ;BCH IF NO SUCH SWITCH ON THIS MACHINE STA $C000,Y ;SET SWITCH NOTUSED EQU * DEX BPL SETLOOP PLA TAX PLA TAY RTS ; * GETSOFT EQU * ;...READ.2E.SOFT.SWITCHES.AND.PUT.VALS.INTO.SUCCESSIVE.BITS.OF.ACCUM LDA #0 DO SHUTTLE2+COPYKIT2 ELSE JSR ISITA2E ;IF NOT A 2E, DON'T TEST SWITCHES BNE SKIPGET LDX #7 NEXTSWITCH EQU * ROL READSWITCH,X ROL A ;MOVE.CARRY.INTO.ACCUM DEX BPL NEXTSWITCH ORA #SOFTSETBIT ;ALWAYS ON SKIPGET EQU * FIN RTS ; ; DO SHELL+COPYKIT2E ;tests for //e-type card only HAY80COL EQU * ;RETURNS.=.IF.CARD.PRESENT LDA MACHINID ;SETUP BY LOADER AND #BIT80COL ;80COLCARD? EOR #BIT80COL ;COMES OUT EQUAL IF TRUE RTS FIN ; ***RETURNS EQUALS FLAG ON IF IT'S A 2E ***RETURNS SOFT SWITCH MASK IN Y-REG ***VOLATILE: Y-REG ISITA2E EQU * DO SHUTTLE2+COPYKIT2 LDY #1 ;set <> for testing 2+ shuttle on //e ELSE LDY APPLETYPE FIN PHP LDY SOFTMASK PLP RTS APPLETYPE DFB 0 SOFTMASK DFB $FF ; ; LCSTATES DFB $89,$81,$8B,$83 ;ROMB1,ROMB2,RAMB1,RAMB2 ; DO SHUTTLE2E+COPYKIT2E ; ISRCARDON EQU * LDA #0 ROL RDLCRAM ROL A ROL RDLCBNK2 ROL A TAX LDA LCSTATES,X STA MEMSTATUS RTS ; ELSE ; ; ISRCARDON EQU * JSR EOR.AREA ;HASH.RAMCARD.SPACE STA PAGE0TEMP3 LDX #3 ;no. of poss lang card states NEXTLCSTATE EQU * LDY LCSTATES,X ;get a state's address LDA $C000,Y ;set the lang card JSR SAVE JSR EOR.AREA ;hash lang card space CMP PAGE0TEMP3 ;same hash as it was at interrupt? PHP JSR RESTORE ;restore regs PLP BEQ ISREND ;bnch if same DEX BNE NEXTLCSTATE ;get next state ; ISREND EQU * STY MEMSTATUS ;SAVE RESULT RTS ; ; ; ; EOR.AREA EQU * ;HASH.RAMCARD.ADDRESS.SPACE LDA #$FF ;POINT.TO.TOP.PAGE LDY #$30 ;NO OF PAGES TO HASH JSR EORPAGES RTS ; EORPAGES EQU * STY PAGE0TEMP1 STA EORPTR3 ;PAGE POINTER LDA #0 ;HASH EORS INTO ACCUM EORPGLOOP EQU * JSR EORPAGE ;HASH ONE PAGE DEC EORPTR3 DEC PAGE0TEMP1 ;PAGE COUNTER BNE EORPGLOOP ;DO MORE PAGES RTS ; EORPAGE EQU * LDY #0 EORRANGE EQU * EOR $1000,Y EORPTR3 EQU *-1 DEY BEQ EORRANGE RTS ; FIN ; ; * TEXTDEFAULT EQU * ;DEFAULT SOFT VALUE LDA SOFT AND #SOFTSETBIT BNE ALREADYSET LDA #TEXTBIT+SOFTSETBIT+HIRESBIT STA SOFT ALREADYSET EQU * RTS ; DO APPLE2E ; ISIT128K2E EQU * ; LDA MACHINID ;SETUP BY LOADER AND #BIT80COL+BIT2E+BITAUXMEM CMP #BIT80COL+BIT2E+BITAUXMEM RTS ; FIN ; ; FIXROMS EQU * ;RE-ENABLE C800 ROM ON ACTIVE PERIPHERAL CARD OR 2E'S INTERNAL ROM ; (SEE APPLE 2+ REF. MANUAL, P. 85) ; ; ; ; DO 0 LDA FFEXSTOW AND #ENAC800BIT ;was internal c800 on? BEQ NOTINTC8 LDA #3 STA SLOTROM NOTINTC8 EQU * FIN ; ;NEWER VERSION ;(PRECEDING PART KEPT FOR COMPAT WITH OLDER VERSIONS, PRE-8.4) LDA SLOTROM BNE BITSLOT LDA #3 ;DEFAULT for compat with older versions BITSLOT EQU * ;ENABL ROM OF SLOT IN ACCUM BIT $CFFF ;ALL REST OFF! ORA #$C0 ;READY TO BIT CN00 STA BITROMS+2 BITROMS BIT $C000 RTS ; * ; ***FIND OUT WHICH SLOT'S ROM IS ACTIVE, SAVE IT IN 'SLOTROM'. GETSLOTROM EQU * JSR HASHC8 ;CURRENT HASH STA PAGE0TEMP3 LDX #7 ;TOP SLOT SLOTLOOP EQU * BIT $CFFF ;ALL OFF! TXA JSR BITSLOT ;BIT CNOO JSR HASHC8 CMP PAGE0TEMP3 ;THIS ONE? BEQ GOTROM ;GOT IT! DEX ;ELSE TRY NEXT SLOT BNE SLOTLOOP GOTROM EQU * ;ENTRY FROM 'LOAD' STX SLOTROM BIT $CFFF RTS ; HASHC8 EQU * ;HASH C800 PAGE DO SHUTTLE2E+COPYKIT2E LDA #0 TAY C82ELOOP EQU * EOR $C800,Y DEY BNE C82ELOOP ; ELSE ; LDA #$C8 LDY #1 JSR EORPAGES FIN RTS * SBTL .GET PRINTER SLOT FOR SCREENDUMP. ;WHICH PRINTER SLOT MESSAGE. ;ROUTINE CALLED 'GETPRINSLOT' ;INCORPORATES GET PRINTER READY MESSAGE ; GETPRINSLOT EQU * LDX #0 LDY #5 JSR MSGOUT1 DO GERMAN PREADYMSG ASC .DRUCKER ANGESCHALTET ("ON-LINE")?. DFB 0 ELSE PREADYMSG ASC .Please make sure the printer is on line!. DFB 0 FIN RTS ; ; ; ; DOBOTHMSG EQU * JSR HOME LDX #BRINREADY ;REQUEST JSR PRMENU2 RTS BRINREADY DW BREADYMSG DW BRVERTS DO GERMAN BREADYMSGfhi ASC .STEUERZEICHEN FUER DIE INTERFACE-. DFB 0 ASC .KARTE, DAS DEN AUSDRUCK. DFB 0 ASC .AKTIVIERT:. ELSE BREADYMSG ASC .Please type any commands. DFB 0 ASC .your printer card requires. DFB 0 ASC .(Press . DFB 5,$13,3 ASC . twice to halt activity). FIN DFB 0 BRVERTS DFB 11,1,8,$FF ;SPACING FOR MESSAGE ; ; ; DOGRAPHMSG EQU * LDX #GRINREADY JSR PRMENU2 RTS GRINREADY DW GREADYMSG DW GRVERTS DO GERMAN GREADYMSG ASC .STEUERZEICHEN FUER DIE INTERFACE-. DFB 0 ASC .???????DAS DEN AUSDRUCK. DFB 0 ASC .AKTIVIERT:. ELSE GREADYMSG ASC .to print graphics. FIN DFB 0 GRVERTS DFB 13,$FF ;SPACING FOR MESSAGE ; ; ; ; DOTEXTMSG EQU * ;FOR TEXT DUMPS LDX #TRINREADY JSR PRMENU2 RTS TRINREADY DW TREADYMSG DW GRVERTS DO GERMAN TREADYMSG ASC .STEUERZEICHEN FUER DIE INTERFACE-. DFB 0 ASC .???????DAS DEN AUSDRUCK. DFB 0 ASC .AKTIVIERT:. ELSE TREADYMSG ASC .or press space bar to begin printing. FIN DFB 0 ; SBTL .TEXTSWAP COPIES TEXT2 TO TEXT1. ******************************* * SWAP USER TEXT PAGES 1 & 2 ******************************* DO 0 SWAPTEXT12 LDY #$1C LDX #$8 LDA #$4 JMP SWAP2E ;SWAP2E TAKES CARE OF THE RTS ; FIN ; DO SHELL TEXT1WAY EQU * LDY #$1C LDX #4 TXA JSR SWAP1WAY2E RTS FIN ; *SCREENDUMPm k7EOR.LOGOwƪ%CLEARytGET.FLAGPAGE|n#+CHANGEDRIVE~hyESCMSGQtVIDEX.0t'DETVIDAA 5'GETSR.AD B'SWAPAUX(  'BLOCKIO$LOAD %TABLEqs SBTL .OUTPUT TEXT TO PRINTER UTILITY. DISABLEEXPROM EQU $CFFF * RASL EQU $FE ;FE,FF POINT TO TXT * SKP 3 HEX60 DFB $60 PRINSLOT EQU 1 PRINVEC DFB 0 ;LO-ORDER OF VECTOR TO PRINTER SCREENDUMP EQU * JSR HOME ;CLEAR SCREEN JSR ESCMSG ;ESC TO RETURN TO MENU ; LDA #PRINSLOT ;WHAT SLOT? KNOWNSLOT EQU * JSR OUTPORT ;SET CSWL TO $CN00 BEFORE NEXT INST ; CHANGES IT TO CNXX LDA PRINVEC ;USE VECTOR USED LAST TIME (DEFAULT=00) STA CSWL ;IN OUTPUT VECTOR ; ; JSR DOMSGS ;STUFF ON SCREEN * * ***SEND CTRLlnopqrstuv SEQS UNTIL ESC OR CR * SENDCTRL EQU * JSR KEYIN ;GET A KEY CMP #ESCAPE BNE NOTESC1 ***ESC WAS PRESSED, SO SEE IF NEXT KEY IS ESC BEFORE OUTPUTTING. JSR KEYIN CMP #ESCAPE BEQ ENDPRT2 ;EXIT PHA LDA #ESCAPE JSR COUT ;ELSE SEND THE ESC PLA ;AND RESTORE THE 2ND KEY * NOTESC1 EQU * CMP #SPACE ;SPACE BAR BNE NOTSP LDA SOFT AND #TEXTBIT ;IS IT TEXT? BNE GOTSP ;BCH IF TEXT LDA #SPACE ;RESTORE ACCUM NOTSP EQU * BIT SPEAKER ;CLICK! JSR COUT JSR DOMSGS ;RENEW SCREEN BIT SPEAKER JMP SENDCTRL ;LOOP ; GOTSP EQU * DO COPYKIT2 ;on //e, dont worry about 2+ type 80-col cards. LDA #ID2E80COL+BIT80COL ;if 80-col driver CMP ID80COL ;is other than '2e' or 'none' BCS NONO80INQ BIT CONFIGUR ;and if 80-col card is active BPL NONO80INQ JSR PRINTEXTOVLY ;then print text using overlaid driver JMP ENDPRT FIN NONO80INQ EQU * JSR PRINTEXT ;normal print for 40- or //e80- columns ENDPRT EQU * JSR CROUT ;FINISH LAST LINE ENDPRT2 EQU * LDA DISABLEEXPROM ;CFFF LDA CSWL ;GET VEC TO PRINTER STA PRINVEC ;SAVE IT FOR NEXT TIME JSR SETVID ;PR#0 RTS ; ; ; ; ******************************* ; DOMSGS EQU * ;SHOW INSTRUCTIONS JSR DOBOTHMSG ;'PLS TYPE ANY CMDS YR PRINTER CARD REQS' LDA SOFT AND #TEXTBIT ;IS IT GRAPHICS? BNE NOTGRAPHICS ;BCH IF TEXT JSR DOGRAPHMSG RTS ; NOTGRAPHICS EQU * JSR DOTEXTMSG RTS ; ; ; *************************** *** MOVE TEXT INTO PLACE *** AND PRINT IT *************************** * PRINTEXT EQU * * JSR ISITTEXT2 ;TEXT.SCREEN.2.ON? BNE DOTEXT1 ;BRCH IF TEXT1 JSR DUMPTEXT8 ;TEXT IS IN PLACE ON PAGE 8 JMP PRINTDONE ; ; DOTEXT1 EQU * JSR SWAPTEXT12 ;SWAP USR TEXT1 AND TEXT2 (DOESN'T AFFECT 0400 AREA) JSR DUMPTEXT8 JSR SWAPTEXT12 ;SWAP IT BACK PRINTDONE EQU * RTS ; ; ******************************** *** DUMP TEXT TO PRINTER ****** *** FROM PAGES 0800-0BFF****** ******************************** DUMPTEXT8 EQU * LDX #0 ;START AT TOP ROW TXA JSR TABV * *LOOP XEQTED FOR EACH LINE D1 JSR CROUT ;INITIALIZE PRINTER/CR ; LDY #0 ;START AT LEFT EDGE TXA ;CURRENT VERT POS JSR TABV ;SET BASL FOR ROW LDA BASL+1 ;TRANSPOSE ROW ADC #4 ;ADDRESS UP FOUR PAGES STA RASL+1 LDA BASL STA RASL ; ; ***INNER LOOP FOR EACH CHAR D2 JSR OUTPUTCHAR ESCHECK EQU * LDA KBD ;LOOK AT KEYBOARD CMP #ESCAPE ;SEE IF ESC IS PRESSED BEQ NOPRINT ;QUIT IF IT IS. INY CPY #40 BCC D2 ;NOT YET AT RIGHT EDGE INX CPX #24 BCC D1 ;NOT YET AT BOTTOM OF SCREEN ; ***EXIT*** NOPRINT EQU * STA CLEARKBD ;RESET STROBE RTS ;SCREENDUMP ENDED OR ABORTED * * ******************************** * GET A CHAR FROM TEXT SCREEN * (AND POSS FROM AUX TEXT SCREEN) * AND OUTPUT IT. ******************************** * OUTPUTCHAR EQU * LDA (RASL),Y ;PICK UP SCREEN CHARACTER PHA ;SAVE IT LDA SOFT AND #X80COLBIT ;BIT 7 OF SOFT SHOWS 80COL BEQ CHAROUT LDA #TEXTBIT+PAGE2BIT+X80STOREBIT JSR SETSOFT LDA (BASL),Y ;PICK UP 80COL CHAR PHA ;SAVE AUX CHAR JSR RESETSOFT PLA ;RETRIEVE AUX CHAR JSR OUTCHAR ;PRINT.CHAR.FROM.AUX.MEMORY CHAROUT EQU * PLA ;GET.CHAR.FROM.MAIN.SCREEN JSR OUTCHAR ;PRINT IT RTS ******************************** ******************************** * * IF BIT 7 OFF, THEN * * IF (ALTCHARSET ON, AND LOW- * ERCASE INVERSE) * THEN SET HI BIT ON * * ELSE * TURN ON BITS 6 & 7 * * IF BIT 5 IS ON * THEN TURN BIT 6 OFF. * * PRINT CHAR VIA COUT. * * OUTCHAR EQU * ;PRINT.ONE.CHARACTER PHA LDA #$0 STA HCURSOR ;ZERO HORIZONTAL CHARPOSITION PLA *** TURN OFF HI BIT. IF BITS 5+6 ARE OFF, TURN ON BIT 6. AND #$7F ;HI BIT OFF BIT HEX60 ;BIT 5 OR 6 ON? BNE D3 ;BRCH IF NOT ORA #$40 ;BIT 6 ON D3 JSR COUT ;PRINT THE CHARACTER TXA JSR TABV ;REINSTATE CV RTS ; ISITTEXT2 EQU * ;is text page 2 being shown? ; if so turn = flag on. Note that if 80store switch is on, ; then text page 2 is never visible. ; Set = flag if text AND page2 BUT NOT 80store. ; LDA SOFT AND #TEXTBIT+PAGE2BIT+X80STOREBIT ;isolate bits CMP #TEXTBIT+PAGE2BIT ;set = flag ; RTS ; ; SBTL .TEXTSWAP COPIES TEXT2 TO TEXT1. ******************************* * SWAP USER TEXT PAGES 1 & 2 ******************************* SWAPTEXT12 LDY #$1C LDX #$8 LDA #$4 JMP SWAP2EX ;SWAP2E TAKES CARE OF THE RTS ; ; SBTL .EOR A RANGE OF BYTES. EOR.LOGOX EQU * STX RAMPTR+1 ;PTR HI STA RAMPTR ;PTR LO LDY #LOGOLEN-1 ;LEN OF LOGO LDA #0 ;INIT VALUE EORLOOP EQU * EOR (RAMPTR),Y DEY BPL EORLOOP CMP LOGOHASH ;same as 'sposed to be? RTS * DO SHELL LOGO EQU * ASC .TOHSPANS. LOGOEND EQU * FIN LOGOLEN EQU 8 ;LENGTH LOGOHASH DFB 0 ;TEMP STASH FOR EXPECTED LOGO VALUE SHUTTLEID EQU $67 COPYKITID EQU $0C ;EXPECTED VALUE OF LOGO HASH SBTL .CLEAR RAM. CLEAR EQU * ;clear 64k to zeroes (except clear pages 0-7 to $a0.) JSR GET64KTBL JSR GET1STMBPAGE ;POINT TO RAM IN 64K CLRLOOP1 EQU * JSR CLEAR1PAGE ;ZERO A PAGE JSR GETNEXTMBPAGE ;NEXT PAGE BCC CLRLOOP1 ;UNTIL NO PAGES LEFT RTS ; CLEAR1PAGE EQU * JSR SETRAMPTR ;point (RAMPTR) to page and zero Y and A LDX #7 CPX REALPAGE ;if page is 0-7 BCC NOTLOWMEM LDA #$A0 ;clear it to blanks (so slinky wont reformat) NOTLOWMEM EQU * CLLOOP EQU * STA (RAMPTR),Y DEY BNE CLLOOP RTS * ; ; xz{DO SHUTTLE CLEARWKSPACE EQU * ;ask permission then close a ws and free its ram and clear its name and redraw menu JSR ERASEMSG BCS SKIPCLEARR CLEARWKSPACE1 EQU * ;dont ask permission, just do it. LDA CURRENTPROGNO JSR CLOSEAWS ;clear status and de-assign partitions JSR CLEARNAME JSR SHOWPROGNO JSR SHOWMENU ;WITH NAME CLEARED SKIPCLEARR EQU * RTS ; OPENCLEAR EQU * ;LEARWKSPACE2 EQU * ;JSR CLEARMSG JSR WAITMSG2 ;'please wait' JSR CLEAR RTS ; DO COPYKIT+PRINTERRUPT CLEARMSG EQU * ;issue 'clearing' message ;JSR CLRMSGAREA LDX #11 LDY #MSGAREA+2 JSR MSGOUT1 CLMSG ASC ,Clearing Memory..., DFB 0 RTS FIN ; ; SBTL .LOAD BACKUP PARAMETERS. ; ; ; GET.FLAGPAGE EQU * LDA #READCOMMAND DO COPYKIT BNE DOFLAGPAGE ;ALWAYS ; ;SECOND ENTRY POINT PUT.FLAGPAGE EQU * LDA #WRITECOMMAND ; DOFLAGPAGE EQU * FIN STA COMMAND LDA #FLAGPAGE STA BUFFADDR+1 LDA #FTRACK STA TRACK LDA #FSECTOR STA SECTOR JSR RWTSE ;GET THE PAGE ; ;NOTE: RWTSE SETS CARRY IF I/O ERROR ; RTS ; ; ; *****CHECK 'FIN'S CAREFULLY FOR DEAD CODE FOR EACH MODULE. SBTL .CHANGE LOAD/DUMP SLOT. ; DO SHELL ELSE ; CHANGEDRIVE EQU * JSR ESCMSG ;"RESET.TO.CANCEL" ;DO COPYKIT ;JSR INSERTMSG ;FIN JSR PRDISKSLOT ;INQUIRE JSR GETSLOT1 ;GET SLOTIN ACCUM ORA #$30 ;MAKE SCREEN CHAR STA MENUSLOT ;PUT IN MENU STA INSSLOT ;AND IN 'INSERT' MSG JSR MULT10 ;MULT.BY.#$10 STA SLOT ;PUT IN IOBLOCK STA LSLOT ;ALSO IOBLOCK JSR PRDRIVE ;MAKE DRIVE INQUIRY JSR GETSLOT1 ;GET A KEY JSR MAKENUM ;MAKE IT NUMERIC STA DR}IVE ;PUT IN IOBLOCK STA LDRIVE ;ALSO IOBLOCK ORA #$30 ;SCREEN CHAR STA MENUDRIVE ;PUT IN MENU STA INSDRIVE ;AND IN 'INSRT' MSG DO UNIDISK JSR SETUNIFLAG ;if a unidisk, set flag FIN RTS ; FIN ; ; SKP 1 PRDISKSLOT EQU * PRSLOT EQU * LDX #0 ;WAS 8 LDY #MSGAREA+3 JSR MSGOUT1 ASC .Disk Slot? (1 to 7) . DFB CURSOR DFB CR,CR DFB 0 RTS MULT10 EQU * ;MULTIPLY ACCUM BY #$10 ASL A ASL A ASL A ASL A RTS ; ; DO COPYKIT GETSLOT EQU * ;INQUIRE,.GET.SLOT.NUMBER.IN.ACCUM JSR PRSLOT ;ASK "WHICH SLOT?" FIN * * *GET SLOT NUM IN ACCUM (1-7). GETSLOT1 EQU * ;get a nonzero numeric 1-7 in accum JSR GETSLOTORRET BEQ GETSLOT1 ;REPEAT IF RTS ; ; GETSLOTORRET EQU * *GET A SLOT NUMBER OR RETURN=0 JSR GETAKEY ; JSR EXITIFESC CMP #RETURN BNE NOTRETN LDA #0 RTS ; NOTRETN EQU * CMP #$AF ;IF KEY<1 BCC GETSLOTORRET ;TRY AGAIN CMP #$B8 ;IF KEY>=8 BCS GETSLOTORRET ;TRY AGAIN JSR MAKENUM ;MAKE IT NUMERIC RTS ; MAKENUM EQU * AND #07 RTS SKP 2 * ; DO COPYKIT INSERTMSG EQU * LDX #0 LDY #3 JSR MSGOUT1 ASC .Insert Snapshot Disk in any drive. DFB 0 RTS FIN ; PRDRIVE EQU * LDX #0 LDY #MSGAREA+5 JSR MSGOUT1 ASC .Disk Drive? (1 or 2) . DFB CURSOR DFB 0 RTS ; ; ; DO 0 SETUNIFLAG EQU * ;if a unidisk, set flag JSR SETSLOTPTR ;put CN00 into SLOTPTR LDY #$FF ;get CNFF (its 00 for a disk II) LDA (SLOTPTR),Y STA ISITUNI RTS ISITUNI DFB 0 FIN SBTL .SHOW 'ESC TO ABORT' MESSAGE. ESCMSG EQU * DO SHELL ELSE JSR CLRMSGAREA ;ERASE MSG AREA FIN ESCMSG2 EQU * ;no dashed line LDY #23 ;VERTICAL TAB LDX #1 ;HORIZONTAL TAB JSR MSGOUT1 DO GERMAN RMSG ASC . BRICHT DIE OPTION AB UND RUFT. ELSE RMSG ASC .(or press . ASC .. ASC . to return to menu). FIN DFB 0 RTS X`Y`H.x, ) hJ̐Ȅ(H ȌHJJJJ h Ȍ`Ȍ`{Pb) SBTL .PUT A VIDEO SHADOW IN ACCUM. ; ; DO SHUTTLE2E ELSE BITS2E DFB 0 ; DETVIDA EQU * PHA AND #ALTCHARSETBIT+X80COLBIT STA BITS2E ;2E-ONLY BITS, BUT NOT 80STORE JSR GETESCARRRET2 ;GET KEY JSR EXITIFESC JSR SWAPTEXT ;SWAP MENU FOR TARGET TEXT * PLA ;RESTORE A JSR MAKEGOOD ;MAKE A A LEGIT SHADOW COMBINATION DETVIDALOOP EQU * PHA ;SAVE A JSR SETSOFT ;SET VIDEO SWITCHES TO MATCH SHADOWS GETAGAIN EQU * JSR GETESCARRRET2 ;GET ESC OR RET KEY OR ARROWS BEQ GETAGAIN ;IGNORE.RET.KEY CMP #ESCAPE ;ESC.KEY? BEQ DVEXIT ;GOTO.MENU PHA PLA ;TEST.STATUS.OF.ACCUM BMI BACKONE ;LEFT.ARROW PLA ;LOAD SHADOW JSR NEXTSHADOW JMP ENDDVLOOP BACKONE EQU * PLA ;LOAD SHADOW JSR PREVSHADOW ENDDVLOOP EQU * JMP DETVIDALOOP * PREVSHADOW EQU * LDX #9 JSR LOOP17 ;GET.INDEX,RANGE.0-9 INX SEC BCS LOADSHADOW * ; ; ***EXIT.FROM.MODULE DVEXIT EQU * JSR RESETSOFT ;TURN.OFF.80COL.AND.ALTCHARSET JSR SWAPTEXT ;RESTORE MENU PAGE PLA ;POP SHADOW RTS SKP 1 MAKEGOOD EQU * JSR FINDSHADOW SEC BCS LOADSHADOW SKP 1 NEXTSHADOW EQU * *INPUT AND OUTPUT IN A. JSR FINDSHADOW ;GET SHADOW'S INDEX DEX ;SET A TO LOADSHADOW EQU * LDA COMBS,X ;NEXT COMBO DOWN ORA BITS2E ;ALTCHARSET AND 80-COL ON RTS SKP 1 COMBS EQU * ;COMBOS OF SHADOW SWITCHES DFB TEXT1 ;REPEAT TOP OF CYCLE DFB LOMIXED2,LOMIXED1,HIMIXED2,HIMIXED1,LORES2,LORES1,HIRES2,HIRES1,TEXT2,TEXT1 * SKP 2 * * FINDSHADOW EQU * ;RETURN,IN.X,SHADOW'S.INDEX.IN.LIST...IF.NOT.PRESENT,RETURN.LAST.INDEX LDX #10 LOOP17 EQU * AND #TEXTBIT+PAGE2BIT+HIRESBIT+MIXEDBIT ;TURN OFF ALL BUT 2+ BITS CMP COMBS,X ;COMPARE CURRENT SHADOW WITH EACH POSSIBLE SHADOW BEQ FOUNDIT DEX BPL LOOP17 LDX #10 ;NOT.THERE:X:=10 FOUNDIT EQU * RTS ; FIN * SWAPTEXT EQU * JSR RESETSOFT SWAPTEXTX EQU * LDA #4 ;NO. OF PAGES TO SWAP TAX ;1ST PAGE OF TEXT SCREEN LDY #FIRST8SSPAGE+4 ;SWAP SCREEN JSR SWAP2EX RTS ; GETAKEY EQU * ;GET KEY IN ACCUM BIT CLEARKBD KBDLOOP EQU * DO SHELL ELSE JSR RESETSSRAM ;set card to an odd page, so FFFX intercept is disabled FIN LDA KBD BPL KBDLOOP BIT CLEARKBD RTS * GETESCARRRET2 EQU * *WAIT FOR.KEYPRESS.;RETURN.0.IF.RET,-1.IF.LEFT.ARROW.,+1.IF.RT.ARROW,2.IF.ESC *DONT ACCEPT ANY OTHER KEY *USES A AND Y JSR GETESCARRRET3 ;GET A KEY BCS GETESCARRRET2 ;RPT IF NOT ON LIST RTS ; ; GETESCARRRET3 EQU * ;IF KEY NOT ON LIST, SEC AND LEAVE KEY IN ACCUM JSR GETAKEY LDY #LISTLEN-1 GLOOP EQU * CMP KEYLIST,Y ;IS KEY ON LIST? BEQ GOTIT ;BRCH IF SO DEY BPL GLOOP CMP #CTRLY ;$99 BNE NOTYY JMP MON ;IF CTRL-Y, GOTO MONITOR NOTYY EQU * SEC RTS GOTIT EQU * CLC LDA CODELIST,Y ;GET CORRESPONDING.CODE RTS * KEYLIST EQU * DFB LARROW,RETURN,RARROW,ESCAPE,UPARROW,DNARROW CODELIST EQU * DFB $FF,0,1,ESCAPE,$FF,1 LISTLEN EQU *-CODELIST * DO SHUTTLE+COPYKIT ELSE EXITIFESC EQU * CMP #ESCAPE ;ESCAPE.KEY? BEQ GORESET RTS GORESET EQU * JMP (RESET) ;JMP.VIA.RESET.VECTOR FIN SBTL .GET A SUBROUTINE ADDR FROM OPER. INVBIT EQU $00 NORMBIT EQU $80 ;BIT.ON.FOR.NORMAL.SCRN.CHARS SPACE EQU $A0 ;BLANK SPACE(VIDEO) ; SAVEDX DFB 0 ; GETSR.A EQU * LDX SAVEDX BNE GETSRLOOP ;USE.RECENT.CRSR.POSITION JSR WRAPAROUND ;FIND.FIRST.LINE.WITH.NONZERO.SUBROUTINE.ADDR *AND.SET.CURSOR.THERE.(X-REG.IS. *RELATIVE.LINE.#,..VCURSOR.IS.ABSOLUTE.LINE.#) GETSRLOOP EQU * JSR GETVCURSOR ;get vert cursor value corresp. to this x JSR WRITECRSRS ;SHOW CURSORS DO SHUTTLE JSR GETESCARRRET3 ;GET KEY..0=RTN,-1=<-,1=->,2=ESC BCS OTHERKEY ; ELSE JSR GETESCARRRET2 ;ONLY RETURNS WITH 1 OF 4 KEYS FIN ; BEQ OUTSRLOOP ;BRCH.IF.RETURN.KEY BMI UPONE ;LEFT ARROW OR ESCAPE JSR WRITECRSRS ;ERASE PREVIOUS CURSORS JSR NEXTLINE ;MOVE TO NEXT LINE JMP ENDSRLOOP * UPONE EQU * JSR WRITECRSRS ;ERASE CURSORS JSR PREVLINE ;GO.UP.ONE.LINE * ENDSRLOOP EQU * JMP GETSRLOOP ;BOTTOM.OF.LOOP * OUTSRLOOP EQU * JSR GETVECTOR ;GET ADDR OF SUBROUTINE SELECTED RTS ;AND RETURN IT TO CALLER SKP 1 ; DO SHUTTLE ; ACCEPT ALPHA KEY ENTRY FOR PGM NAME OTHERKEY EQU * LDY #PROGSWAP STY SRVECTOR RTS FIN ; SKP 1 WRITECRSRS EQU * LDA VCURSOR JSR BASCALC ;STORE.ADDR.OF.LEFT.END.OF.LINE.IN.BASL,H LDY #39 ;LAST COLUMN * *FOR EACH CHAR ON THE LINE: FLIP BIT 7. IF BIT 5 IS ZERO (ITS A UPCASE LETTER) THEN FLIP BIT 6 AS WELL. INVLOOP EQU * LDA (BASL),Y ;JSR FLIP6IF5IS0 ;NOPED ON //E JSR XLATEINV STA (BASL),Y DEY BPL INVLOOP RTS SKP 1 ; DO 0 FLIP6IF5IS0 EQU * ;on 2+, set inverse STA PAGE0TEMP1 AND #$20 EOR #$20 ASL A ;if bit 5 was off, flip bit 6 EOR PAGE0TEMP1 RTS FIN ; WRAPAROUND EQU * ;BACK TO TOP OF SCREEN LDX #$FF ;READY TO INC TO 0 NEXTLINE EQU * INX ;POINT TO NEXT MSG LDA VERTS,X ;IF.NEXT.MSG.IS.NONEXISTENT BEQ NEXTLINE ;OR NULLED BMI WRAPAROUND ;START AGAIN STX SAVEDX ;SAVE.CURRENT.CRSR.POS JSR GETVECTOR ;FETCH VECTOR FOR SR BEQ NEXTLINE ;GOTO NEXT LINE RTS * PREVLINE EQU * LDA #$FE ;SET.COUNTER.TO.-1 STA PAGE0TEMP2 ;COUNTS.#.OF.LINES.IN.FULL.CYCLE STX PAGE0TEMP1 ;CURRENT.LINE.# NEXTAGAIN1 EQU * JSR NEXTLINE ;DN.1.LINE INC PAGE0TEMP2 ;INCR.COUNT CPX PAGE0TEMP1 BNE NEXTAGAIN1 ;LOOP.TIL.CYCLED.THRU.ALL.LINES NEXTAGAIN2 EQU * ;LOOP.TO.PRECEDING.LINE JSR NEXTLINE DEC PAGE0TEMP2 BPL NEXTAGAIN2 RTS * * * GETVECTOR EQU * TXA CLC ROL A ;TIMES 2 TAY LDA VECTORS,Y STA SRVECTOR ;MOVE VECTOR LDA VECTORS+1,Y ;TO SUB- STA SRVECTOR+1 ;ROUTINE CALL RTS SKP 1 GETVCURSOR EQU * ;get vert displacement for this x STX PAGE0TEMP1 LDA #0 LDY #$FF GVCLOOP EQU * INY CLC ADC VERTS,Y CPY PAGE0TEMP1 BNE GVCLOOP STA VCURSOR RTS SBTL .SWAP //E AUX 64K WITH MAIN RAM. ; ; ********************************** ; SWAPAUX EQU * ; ***THIS ROUTINE SWAPS ALL 64K AUX RAM WITH THE MAIN 64K SNAPSHOTTED PGM ; ; JSR COPYSWAPAUX48 ;COPY ROUTINE TO PAGE 0 JSR GET64KTBL ;point to table of page locations JSR GET1STMBPAGE ;GET FIRST PAGE FROM MB SAMPLOOP EQU * LDA BUFFADDR+1 ;MB PAGE LDY REALPAGE ;AUX PAGE JSR SWAPAUXMAINPG ;SWAP IT WITH AUX PG JSR GETNEXTMBPAGE BCC SAMPLOOP ;LOOP UNTIL NO MORE RTS ********************************** ; SWAPAUXMAINPG EQU * ; ;THIS ROUTINE SWAPS ANY PAGE OF MAIN RAM (MOTHERBOARD) ; (EXCEPT THE STACK) ;WITH ANY PAGE OF AUXILIARY RAM (//E 64K CARD) ; ***ON ENTRY: * A-REG = MAIN PAGE NO * Y-REG = AUX PAGE NO ; ; ;(implementation notes): for pages 2-BF of aux ram, use a straight- ; forward swapping routine located momentarily in page zero. ; Avoid Auxmove (in ROM) for speed. ; For pages 0-1 and D0-FF of aux ram, use a straight-forward swapping ; routine. ; CPY #2 ;AUX PAGE = 0 OR 1? BCC SWAPAUXZP ;SPECIAL ROUTINE FOR SWAPPING VERY LOW AUX CPY #$D0 ;AUX PAGE >=$D0? BCS SWAPAUXZP ;SPECIAL ROUTINE FOR VERY HIGH AUX ; JSR SWAPAUX48DEST ;COPY OF SWAP ROUTINE IN PAGE ZERO RTS ; SWAPAUXZP EQU * JSR SWAPAUXZP1 RTS ; ; ********************************** ; SETAUXPARMS EQU * ; SET UP PARMS FOR USE BY MONITOR'S AUXMOVE ROUTINE ; REG USE: A=SOURCE PAGE ; Y=DEST PAGE ; X IS CLOBBERED LDX #0 STX A1L STX A4L DEX STX A2L STA A1H STA A2H STY A4H RTS ********************************** ; SWAPAUX48 EQU * ; SWAPAUX48DEST EQU $60 ;EXECUTING ADDR OF SWAPAUX48 SWAPAUX48DISP EQU SWAPAUX48-SWAPAUX48DEST ;DISPLACEMENT ;SWAP A PAGE IN AUX48 RAM WITH ANY PAGE IN MAIN 64K (EXCEPT THE STACK) ;AUX48 RAM IS AUX RAM BTWEEN 200-BFFF. ;ON ENTRY: A=MAIN PAGE NO, Y= AUX PAGE NO ; STA MAINCTR1+2-SWAPAUX48DISP STA MAINCTR2+2-SWAPAUX48DISP STY AUXCTR1+2-SWAPAUX48DISP STY AUXCTR2+2-SWAPAUX48DISP ; LDY #0 ;LOOP CTR ; AUXSWLOOP EQU * MAINCTR1 LDA $1000,Y ; STA SWRAMRD+1 ;AUX MEM STA SWRAMWRT+1 AUXCTR1 LDX $1000,Y AUXCTR2 STA $1000,Y STA SWRAMRD ;BACK TO MOTHERBOARD RAM STA SWRAMWRT TXA MAINCTR2 STA $1000,Y ; DEY BNE AUXSWLOOP RTS ; SWAPAUX48END EQU * ; ; COPYSWAPAUX48 EQU * LDX #SWAPAUX48END-SWAPAUX48-1 LOOPA48 EQU * LDA SWAPAUX48,X STA SWAPAUX48DEST,X DEX BPL LOOPA48 RTS ; SBTL .BLOCKIO TRANSFER TO/FROM DISK. ;*************************************************** ;ON ENTRY: (TBLPTR) contains pointer to controlling ; table. Must have same format as iotables, ending ; in $ff. Continues returning ptrs to successive ; pages with clc, until table exhausted or 64k ; returned, wherepon returns a sec (and no ptr.) ;*************************************************** ; ; ; YETTODO DFB 0 ;NUMBER OF PAGES YET TO BE DONE ; ; ; ; GET1STMBPAGE EQU * ;POINT TO A PAGE OF RAM AND CORRESP DISK SECTOR LDY #0 ;COUNT THE PAGES, UPWARDS FROM 0. STY PAGEINDEX BEQ GETNXTBUNDLE ; ; GETNEXTMBPAGE EQU * ;GET ANOTHER PAGE; SEC WHEN ALL 64K EXHAUSTED JSR RESETACCESS INC PAGEINDEX BEQ DONE64K ;BNCH IF NEW INDEX = 0 JSR DECPAGE ;NEXT PAGE IN SAME BUNDLE BNE SOMELEFT ;BNCH UNLESS BUNDLE EXHAUSTED LDY NEXTBUNDDISP ;GET DISPLACEMENT OF POINTER TO NEXT BUNDLE GETNXTBUNDLE EQU * JSR GETBUNDLE ;GET POINTERS BCS ENDOFTABLE ;BNCH IF NO MORE BUNDLES STY NEXTBUNDDISP ;SAVE LOC OF PNTRS TO FOLLOWING BUNDLE SOMELEFT EQU * JSR GETACCESS CLC ;NDICATE MORE FOUND RTS DONE64K EQU * ENDOFTABLE EQU * SEC RTS ; ; NEXTBUNDDISP DFB 0 ; ; RESETACCESS EQU * ;UNDO BANK SWITCHING ; CLOBBERS CARRY AND REGS SEC BCS ABRANCH1 ; ; GETACCESS EQU * ;DO BNK SWTCHNG TO ACCESS THIS BUNDLE CLC ABRANCH1 LDA #0 ABRANCH BEQ ACCOKASIS ;GETBUNDLE HAS MOD-ED CODE WITH LOC OF ACCESS ROUTINE ; ; ABASE EQU * ;BASE FOR DISPLACEMENTS ********ACCESS ROUTINES********** ; MUST BE BRANCHABLE FROM ABRANCH ; ACCOKASIS EQU * ;RAM ALREADY ACCESSIBLE CLC RTS ; ; ; ; ; ACCBANK1 EQU * ;LANGCARD BANK 1 BCS ACCROM BIT RPWPB1 ;READ+,WRITE+,BANK1 BIT RPWPB1 CLC RTS ACCBANK2 EQU * BCS ACCROM BIT RPWPB2 BIT RPWPB2 CLC RTS ACCROM EQU * ;LANGCARD OFF BIT RMWMB2 CLC RTS ; DO COPYKIT ; SWAPALL EQU * ;WAPALLAREA EQU $6800 ;WAPALLFIRST8 EQU SWAPALLAREA+$1800 LDX #BADLIST ;"WRONG DISK!" LDX #ERR10LIST LDX #ERR40LIST LDX #ERR80LIST LDX #. DFB 0 RTS ; DO SHUTTLE SHUTTLEWORD EQU * ;INSERT WORD 'SHUTTLE' INTO MSG LDX #7 LDY #21 JSR MSGOUT1 ASC .Shuttle. DFB 0 RTS FIN SKP 2 SBTL .TABLE OF COPY PARAMETERS. ;EACH ROW DESCRIBES ONE BUNDLE OF PAGES. ;EACH.ROW.HAS.6.BYTES: ;.LENGTH.(IN.PAGES),.I/O.PAGE, ;TRACK,.SECTOR ;REAL LOCATION OF PAGE IN RAM WHEN SUBJECT PGM IS RUNNING ;LOCATION OF ROUTINE TO MAKE SNAPSHOTTED RAM ACCESSIBLE (E.G. BY BANK SW.) * * Note that the iopage, track, sector, etc. is the HIGHEST-valued * page etc. in that bundle. The values given are decremented until * the length is reduced to zero. * *** NOTE THAT THE ACCESS ROUTINE MUST BE ENTERED WITH CLC. *** SEC WILL UNDO THE ACCESSABILITY. ; ; ;IF.TRACK...VALUE.IS.$FF.THEN.NEXT AVAILABLE.SECTOR.IS.USED. ; ; ; ; SCANTABLE EQU * ;LAST IOTABLE ENTRY WRAPPED AROUND TO HERE ; FOR GREATER SPEED WHEN JUST EXAMINING MEMORY FOR MT PAGES TABLEW EQU * DFB $18,$C4,$0B,$F,$BF,>ACCESSSSRAM-ABASE TABLEX EQU * ;A7-30 DFB $78,$A7,$0A,$7,$A7,>ACCOKASIS-ABASE ; ; ; ; SKP 1 IOTABLES EQU * ; ; TABLE1 EQU * ;2F-08 DFB $28,$2F,$22,$F,$2F,>ACCOKASIS-ABASE ; ; TABLE2 EQU * ;07-00 DFB $8 ;8 PAGES LONG DFB $C5,$20,7,7,>ACCESSSSRAM-ABASE ; ; TABLE3 EQU * ;FF-D0(2) DFB $30,$FF,$0F,$F,$FF,>ACCBANK2-ABASE ; ; TABLE4 EQU * ;DF-D0(1) DFB $10,$DF,$0C,$F,$DF,>ACCBANK1-ABASE ; ; TABLE5 EQU * ;BF-A8 DFB $18 ;18 PAGES OF SUBJ PGM'S DISPLACED A8-BF RAM DFB $C5,$0B,$F,$BF,>ACCESSSSRAM-ABASE ; TABLE6 EQU * ;A7-30 DFB $78,$A7,$0A,$7,$A7,>ACCOKASIS-ABASE ; ; ; ; DFB $FF ;END OF TABLE k&MSGOUT8 ̬GETAKEYg&DETVIDU(VISION80l۬%VIDEX)SET80CARDv(V2E80COLĪFIXPERIPHV$DUMP VISION80.0۬VOTHERqjVOTHER.0 R%VNONEe SBTL .MESSAGE OUTPUT ROUTINE. ******************************** * GEN. PURPOSE MESSAGE OUTPUT * * ROUTINE. Call via a JSR * * MSGOUT followed by the text * * terminated with a zero byte. * * will return to code following* * the message. * ******************************** * *ADDITIONAL ENTRY POINT MSGOUT1: * * USES X AND Y REGS CONTENTS * AS COORDS OF THE START OF THE * MSG ON THE SCREEN * X=HORZ, Y=VERT. * ******************************** * ; MSGLSB EQU $FE ;LSB OF POINTER TO TEXT MSGMSB EQU MSGLSB+1 ;MSB ; MSGOUT1 EQU * BIT $C081 ;ROM on STX CH TYA JSR TABV ;SETS CV=Y AND CALLS BASCALC ; MSGOUT PLA ;PULL LO BYTE OF RTS OFF STACK STA MSGLSB ;SAVE IT PLA ;PULL HI BYTE STA MSGMSB ;AND SAVE IT TOO LDY #0 ;TO INDEX STRING LOOP INC MSGLSB ;ADVANCE RTS ADR FOR EACH CHR BNE SKIPADD ;IF IT'S ZERO THEN WE GOTTA INC MSGMSB ;INCREMENT THE HI BYTE SKIPADD EQU * LDY #0 LDA (MSGLSB),Y ;GET A CHR FROM ASCII STRING BEQ MSGRTS ;IF CHR=0, END OF STRING JSR XLATE ;make char appropriate for this Apple JSR COUT1 ;OUTPUT THE CHR JMP LOOP ;GET A NEW CHR MSGRTS LDA MSGMSB ;GET HI BYTE OF RTS PHA ;PUSH IT BACK ON STACK LDA MSGLSB ;FETCH NEW LO BYTE OF RTS PHA ;AND PUT IT ON THE STACK RTS ;NOW WE KNOW WHERE WE'RE GOING ; XLATEINV EQU * SEC DFB BITZ ;bit operand for z-page, to skip next op XLATE EQU * CLC STX TEMP2 PHA ROR A LSR LSR LSR LSR TAX PLA AND #$1F ;left 3 bits off ORA XLATETBL,X ;replace them LDX TEMP2 ;restore x RTS XLATETBL EQU * ;translation table for screen chars, top 3 bits only DFB 0 ;inverse upper -> inverse upper DFB $20 ;inverse special -> inverse special DFB 0 ;mousetext -> inverse upper CNVRTFLG2 EQU * DFB $60 ;inverse lower -> inverse lower DFB $80 ;control -> control DFB $A0 ;special -> special DFB $C0 ;upper -> upper CNVRTFLG EQU * DFB $E0 ;lower -> lower ;next part of table does inversions DFB $C0 ;inverse upper -> upper DFB $A0 ;inverse special -> special DFB $C0 ;mousetext -> upper DFB $E0 ;inverse lower -> lower DFB $80 ;control ->control DFB $20 ;special -> inverse special DFB $00 ;upper -> inverse upper DFB $60 ;lower -> inverse lower ; ;LOADER must patch table for 2+ to convert lower -> upper and ; inverse lower -> inverse upper. CNVRTFLG1 EQU *-1 ;shd be set to 7 on II+ to cnvrt lower to upper. DO 0 ;Convert lower to upper case; NOP'd on //e LOWERTOUPPER EQU * ;LDY CNVRTFLG ;does apple require uppercase? ;BEQ NOTCNVRT ;branch if not CMP #$E0 ;is it 11100000 or greater (lower case)? BCC NOTCNVRT EOR #$20 ;if so, change to 110nnnnn CNVRTFLG EQU *-1 NOTCNVRT EQU * RTS FIN GETAKEY EQU * ;GET KEY IN ACCUM KBD EQU $C000 ;KEYBOARD OUTPUT CLEARKBD EQU $C010 ;KBD CLEAR BIT CLEARKBD KBDLOOP EQU * LDA KBD BPL KBDLOOP BIT CLEARKBD RTS * SBTL .DETVID SET VIDEO SHADOW SWITCHES. DETVID EQU * DO SHELL ELSE JSR CLRMSGAREA JSR VIDMSG ;DISPLAY INSTRUCTIONS FIN LDA SOFT JSR DETVIDA ;PUT DESIRED SHADOW IN ACCUM. ORA #SOFTSETBIT ;INDICATE SOFT HAS BEEN SET ; DO APPLE2E ;IF TEXT IS ON, RESTORE 80STORE AS IT WAS. TAX LDA #X80STOREBIT BIT SOFT ;IF 80STORE WAS ON BEQ X80STOREOFF TXA ORA #X80STOREBIT ;TURN BIT ON AND #$FF-PAGE2BIT ;TURN BIT OFF TAX LDA #PAGE2BIT AND SOFT ;GET BIT FROM SOFT STX SOFT ORA SOFT ;PUT IT INTO NEW SOFT FIN TAX X80STOREOFF EQU * STX SOFT ; ;FOR A 2E, SET 80COL BIT OF CONFIGUR TO MATCH 80COL BIT OF SOFT DO APPLE2E-SHELL ;not for shell JSR SET80CONFIG2E FIN RTS ; ; ; ; ; ; ; DO 0 PYKIT ;NO BOOTSOFT FOR SHUTTLE ; SBTL .DETBOOTVID GET SHADOW FOR BOOT. DETBOOTVID EQU * JSR VIDMSG ;DISPLAY INSTRUCTIONS LDA BOOTSOFT JSR DETVIDA ;PUT DESIRED SHADOW IN ACCUM. STA BOOTSOFT ;SET SHADOW SWITCHES AND #$FF-TEXTBIT ;GRAPHICS ONLY RTS ; FIN ; ; SBTL .DISPLAY MSG TO SET SHADOW SWITCHES. VIDMSG EQU * LDX #0 LDY #MSGAREA+2 ;WHERE TO SHOW IT JSR MSGOUT1 DO 0 ASC .BENUTZEN SIE DIE PFEILTASTEN, BIS DER. DFB CR ASC .BILDSCHIRM SO AUSSIEHT WIE ZUM ZEIT-. DFB CR ASC .PUNKT DER UNTERBRECHUNG. DFB CR ASC .WENN DER BILDMODUS GESETZT IST,. DFB CR ASC .BENUTZEN SIE , UM DAS MENU WIEDER. DFB CR ASC .AUFZURUFEN. ; FIN DO SHUTTLE ;not used by //e shuttle ASC .Use arrows to select screen. ELSE ASC .Press the arrow keys until the screen. DFB CR ASC .looks as it should,. ASC . then press the . ASC .key to return to the menu. FIN DFB 0 ;END OF MESSAGE RTS ; SKP 1 LST ON SHUTTLE EQU 0 APPLE2E EQU 0 INCLUDE EQUATES ; ; ******************************** * SNAPSHOT 80-COL SUPPORT * ******************************** CURSADRL EQU $A806 CURSADRH EQU $A807 BUFF EQU $400 ;dummy value: real value passed in reg. VEC EQU $00 ;2 byte pointer adress ; ORG $300 ; ID80COL DFB IDVISION80+BIT80COL ;WHICH CARD? ; SHOW40 BIT $C0B4 ; flip the soft switch to turn on APPLE video RTS ; ; SHOW80 BIT $C0B5 ;then switch screen on RTS ;and return to caller ; LEN80COL DFB 8 ;CARD HOLDS 8 PAGES ; DOAPAGE PHP ;save the flags so we can look at them later STY BUFFREAD+2 STY BUFFWRITE+2 ;MOD CODE with i/o page number BIT $CFFF ;turn off all $C800 ROMS BIT $C300 ;enable slot 3 $C800 BIT $C0B2 ;select RAM CLC ADC #$C8 ;cos screen ram starts at $C800 STA VEC+1 ;setup high byte of from address LDY #$0 ;low byte (always doing a full page) STY VEC PLP ;get flags back to look at carry BCC GETAPAGE PUTAPAGE EQU * JSR SETREGS LDY #0 READLOOP EQU * BIT $C0B2 ;RAM on BUFFREAD LDA BUFF,Y ;get a byte from buffer PWAIT LDX $C0B0 ;look at RAM status BPL PWAIT ;loop if it's not readable STA (VEC),Y ;put the byte to video RAM LDX $C0B0 ;see if RAM is still O.K. BPL PWAIT ;if not then try again INY ;next byte in buffer BNE READLOOP BIT $C0B3 ;turn ROM back on RTS GETAPAGE EQU * BIT $C0B2 ;RAM on LDX $C0B0 ;see if video RAM ready to read BPL GETAPAGE ;if not then wait LDA (VEC),Y ;get a byte from video RAM LDX $C0B0 ;see if it's still ready BPL GETAPAGE ;if it's not then get char again BUFFWRITE STA BUFF,Y ;if we got the byte O.K. then put it in buffer INY ;and go to next byte along BNE GETAPAGE ;until done whole page BIT $C0B3 ;then turn the ROM back on LDY #$0E STY $C0B0 LDA $C0B1 ;read cursor hi STA CURSADRH INY STY $C0B0 LDA $C0B1 ;and cursor lo STA CURSADRL RTS SETREGS LDY #$0D SETREG LDA REGTAB,Y STY $C0B0 STA $C0B1 DEY ;until restored all the registers BPL SETREG LDY #$0E ;then restore the cursor position STY $C0B0 LDA CURSADRH STA $C0B1 INY STY $C0B0 LDA CURSADRL STA $C0B1 RTS ; ; REGTAB DFB $7F,$50,$60,$29,$1B,04,$18,$18,00,$A,$20,$B,00,00,00,00 ENDCODE EQU * LST OFF INCLUDE EQUATES LST ON ; MISC80COL EQU $A805 ;FIXED ADDR ; ; ******************************** * VIDEX SUPPORT - FOR SNAPSHOT * ******************************** * * SOFTWARE TO HANDLE DATA TO AND FROM 80 COL * * Enter with page (0 to 7) required in A reg * And with buffer page in Y-reg. * carry set to store buffer to screen * carry clear to read from screen to buffer * CURSADRL EQU $A806 CURSADRH EQU $A807 BUFF EQU $400 ;dummy value; real value passed in reg. VEC EQU $0 ;2 byte pointer to point to screen page DEV0 EQU $C0B0 DEV1 EQU $C0B1 ; ORG $300 ; ; ID80COL DFB IDVIDEX+BIT80COL ;WHICH CARD? ; SHOW40 STA $C058 ;flip annunciator 0 for Apple video RTS ; ; SHOW80 STA $C059 ;switch in the 80 col video RTS ; LEN80COL DFB 8 ;CARD HOLDS 8 PAGES ; DOAPAGE PHP ;so we can look at the carry later on PHA ;save the page No too STY BUFFREAD+2 ;MODIFY CODE (naughty!) STY BUFFWRITE+2 ;with i/o page number BIT $C300 ;ENABLE CARD ASL ; 0abc ---> abc0 AND #$0C ; ---> ab00 TAY ;use in index to select bank LDA DEV0,Y PLA ;back to 0abc LSR ;bit c in carry flag LDY #$CC ;default to even page ($CC00) BCC THISPAG INY ;odd page ($cd00) if necessary THISPAG STY VEC+1 ;set msb of pointer LDY #$0 STY VEC ;and lsb = 0 PLP ;get the old carry flag back BCC GETAPAGE ; PUTAPAGE EQU * BUFFREAD LDA BUFF,Y ;get from buffer STA (VEC),Y ;put it on the screen INY BNE PUTAPAGE ;loop until done whole page LDY #$0D SETREG LDA REGTAB,Y STY DEV0 STA DEV1 ;send the data for that reg DEY BPL SETREG ;until done all regs LDY #$0E STY DEV0 ;and the cursor address LDA CURSADRH STA DEV1 INY STY DEV0 LDA CURSADRL STA DEV1 LDA MISC80COL ;get screen start / 16 PHA ;save for later LSR ;divide by 16 to get the MSB LSR ;of start *16 LSR LSR LDY #$0C STY DEV0 STA DEV1 PLA ASL ASL ASL ;* 16 to get the LSB ASL INY STY DEV0 STA DEV1 RTS ; GETAPAGE LDA (VEC),Y ;get from screen BUFFWRITE STA BUFF,Y ;put in buffer INY ;next byte along BNE GETAPAGE ;until done whole page LDY #$0E STY DEV0 LDA DEV1 STA CURSADRH INY STY DEV0 LDA DEV1 STA CURSADRL RTS ; ; ; REGTAB DFB $7B,$50,$62,$29,$1B,$08,$18,$19,$00,$08,$C0,$08,00,00 ENDCODE EQU * * DO SHUTTLE+COPYKIT2 ISIT80DISK EQU * ;IS IT AN 80-COL DUMP THAT IS COMPAT WITH THIS MACHINE'S CARD? LDA CONFIGUR AND #BITSID80COL+BIT80COL CMP ID80COL RTS ; FIN DO SHUTTLE2+COPYKIT2 * ACTIVATE80 EQU * LDA MACHINID ;IF THERE IS A CARD AND CONFIGUR ;AND SUBJ PGM NEEDS A CARD AND #BIT80COL ; BEQ END80 ; *THEN ACTIVATE THE CARD: ; JSR ISIT80DISK ;DOES PGM NEED EXISTING CARD? BNE SETOUTPORT CMP #IDOTHER ;AND <>'OTHER' CARD BEQ SETOUTPORT ;THEN JSR SHOW80 ;TURN ON CARD END80 EQU * RTS ;ELSE SETOUTPORT EQU * JSR SWAP1ST8 LDA #3 JSR OUTPORT ;SET CSWL=C300 JSR SWAP1ST8 RTS ; USETEMPCONFIG EQU * ; IF USER SPECIFIED 80-COL ON OR OFF, OVERRIDE EXISTING. LDA #ID2E80COL+BIT80COL CMP ID80COL ;IF 80-COL DRIVER IS OTHER THAN 2E OR 'NONE', BCC OVERRIDE RTS OVERRIDE EQU * OVERRIDE DISK WITH USER'S SELECTION OF ; WHETHER 80-COL CARD IS IN USE LDA TEMPCONFIGUR ROL A ;ADJUST CARRY JMP SETLOADCONFIG ; SET80CONFIG EQU * ;AFTER NMI, PUT 80-COL ID INTO CONFIG LDA CONFIGUR AND #$FF-BITSID80COL ;ID BITS OFF ORA ID80COL ;GET DRIVER'S ID BITS ROL A ROL CONFIGUR ROR A STA CONFIGUR ;SET LEFT BIT TO MATCH CONFIGUR'S ;DROP THRU FIN ; ; SET80CONFIG2E EQU * ;ON A 2E CARD, WE AUTO. KNOW IF PGM USES 80COL, FOR SETTING CONFIG. ;FOR A 2E, SET 80COL BIT OF CONFIGUR TO MATCH 80COL BIT OF SOFT ;AND SET 80-COL-CARD ID IN CONFIGUR TO '2E-TYPE CARD' IN CASE ;THIS IS A BACKUP DISK THAT PREDATES USE OF CARD IDS (VERS 8.1 ; OR EARLIER) ; DO SHUTTLE2E+COPYKIT2E+SHELL LDA SOFT ROL CONFIGUR ROL A ROR CONFIGUR BPL XNOT2E ;IF LDA CONFIGUR AND #$FF-BITSID80COL ;TURN OFF 80COL CARD ID ORA #ID2E80COL ;TURN ON 2E 80COL ID STA CONFIGUR XNOT2E EQU * FIN RTS ; DO SHUTTLE2+COPYKIT2 ; SET80USE EQU * ; FIND OUT WHETHER THIS PGM USES 80-COL CARD. JSR WILLMSG JSR MSGOUT ASC .your 80-column card?. ASC . (Y/N) . DFB CURSOR DFB 0 ; JSR GETYESNO1 ;CLC = YES SETLOADCONFIG EQU * PHP LDA CONFIGUR ROL A PLP ROR A STA TEMPCONFIGUR EOR #$80 ;BIT IS WRONG WAY UP - FIX IT STA CONFIGUR NO80USED EQU * RTS ; TEMPCONFIGUR DFB 0 ; FIN ; WILLMSG EQU * JSR CLRMSGAREA JSR MSGOUT DFB CR,CR ASC .Will this program use. DFB CR DFB 0 RTS SBTL .V2E80COL - R/W //E 80-COL CARD * **** NOTE: ALL 80-COL CARD DRIVERS MUST HAVE ENTRY POINTS AT SAME ADDRS: * ORG $300 *0300: ID BYTE OF CARD (10=2E) +80='THERE IS AN 80-COL CARD' *0301: SHOW 40 COLS (4 BYTES) *0305: SHOW 80 COLS (4 BYTES) *0309: NUMBER OF PAGES ONE CAN R/W IN THIS CARD *030A: R/W A PAGE OF 80-COL MEMORY * * ; ID80COL DFB ID2E80COL+BIT80COL ;SIGNIFIES //E CARD ; SHOW40 EQU * NOP NOP NOP RTS ; SHOW80 EQU * NOP NOP NOP RTS ; LEN80COL DFB 8 ;CARD HOLDS 8 PAGES: 4 IN AUX MEM, 4 IN MAIN MEM (CONSIDERRED AS PART OF CARD, FOR SHUTTLE'S PURPOSES.) ; RW80COLX EQU * **** ON ENTRY, A=PAGE TO BE XFERRED, SEC=STORE TO CARD, CLC=READ CARD. **** and Y = main RAM i/o page. * * PHP CPY RAMVEC1+1 ;if ram is on sscard, then BNE NOBUFF1 PHA JSR SWAPSSTOBUFF ;swap ram to buffer in main ram PLA LDY #BUFF80 PLP JSR NOBUFF ;move buff to/from 80-col card JSR SWAPSSTOBUFF ;swap buffer back to ssram RTS ; NOBUFF1 EQU * PLP NOBUFF EQU * PHP CMP #4 ;TEXT SCR PAGE 0-3 OR 4-7? BCS PAGES4TO7 ADC #$1C ;convert 0-3 ie 4-7 to corresp JSR SETSSRAM LDA RAMVEC1+1 ;=$CN = PAGE SPACE OF SS RAM ; PAGES4TO7 EQU * PLP ; ; ; ; ; RUNAUXMOVE EQU * ;move an aux page to main page or vice versa. ; enter with carry set = to aux, clear = from aux. ; Accum=main ram page, y-reg = aux ram page. ; Note that SSram is visible as main or aux ram. ; BCC SETPARMS ; ; reverse A and Y TAX TYA PHA TXA TAY PLA ; SETPARMS EQU * JSR SETAUXPARMS ;A=SOURCE PAGE, Y=DEST PAGE PHP ;SAVE STATE OF CARRY JSR GETSOFT ;STATE OF SOFT SWITCHES PLP ;RESTORE CARRY PHA ;SAVE SOFT SWITCHES STATE JSR AUXMOVE PLA JSR SETSOFT ;RESTORE SOFT SWITCHES RTS ; SWAPSSTOBUFF EQU * ;swap ssram page to buffer ; input: ssram page in Realpage. Uses all registers. JSR ACCESSSSRAMR ;if so, point to that ram LDA #BUFF80 LDY RAMVEC1+1 JSR SWAP1PAGE ;and swap it to buff80 RTS ; ; ; ; DO 0 ; MOVEPAGE EQU * LDA PAGE0TEMP2 ;PAGES 0-3? BEQ MOVEMAIN JSR AUXMOVE ;4-7, SO GET FROM 80-COL IN AUXMEM RTS ; MOVEMAIN EQU * JSR SWAPALL ;MAKE SUBJ TEXT PG AVAILABLE JSR COPYPAGE ;LIKE AUXMOVE JSR SWAPALL ;RESTORE RTS ; COPYPAGE EQU * SET UP BY SETAUXPARMS LDY #0 COPLOOP EQU * LDA (A1L),Y STA (A4L),Y DEY BNE COPLOOP RTS ; FIN * * * ACTIVATE PERIPHERAL FIXPERIPH EQU * LDA PERIPHERAL BEQ NOPER ;NONE.SELECTED JSR OUTPORT ;SET CSWL:=$CN00 NOPER EQU * RTS ; SBTL .DUMP: COPY RAM TO DISK. ; DO COPYKIT ; DUMP EQU * JSR INSRTCOPYKIT BCS ABORTDUMP JSR PREPLOAD BCS ABORTDUMP LDA #2 ;"WRITE" CMD JSR LOADDUMP ;DO.THE.DUMP BCS ABORTDUMP ;ERROR JSR TEXTDEFAULT ;IF.SOFT.HAS.NOT.BEEN.SET,SET.SOFT=TEXT.MODE LDA #9 ;NEED 9 REPEATED PAGES JSR FINDRPTDAREA JSR GET.FLAGPAGE JSR WRITEFLAGS ;FLAGS TO PAGE 2 JSR PUT.FLAGPAGE ABORTDUMP EQU * RTS * * * * * WRITEFLAGS EQU * LDY #SAVESIZE-1 FLAGLOOP2 EQU * LDA SAVEAREA,Y STA FLAGAREA,Y DEY BPL FLAGLOOP2 RTS ; FIN ; ; GETSCANTBL EQU * ;POINT TO LIST OF BUNDLES OF PAGES LDY #>SCANTABLE LDX #IOTABLES PUTTBL EQU * STX TBLPTR+1 STY TBLPTR RTS ; ; ************************************************************** * * This routine called by 'LOAD' or 'DUMP' to xfer 64 or * 128k to/from disk. * ************************************************************** LOADDUMP EQU * ;COPY.BACKUP.TO/FROM.RAM STA COMMAND ;.ENTER.WITH.COMMAND ; DO APPLE2E LDA #0 STA DISKAUXFLAG ;INDICATE WE ARE I/OING MAIN MEM FIN JSR GET64KTBL ;POINTERS TO MOTHERBOARD 64K RAM JSR LOADDUMPTBL1 ;I/O 64K BCS SKIPIT ;BNCH IF ABORTING ; ;;;;DO 2ND 64K IF NECC DO SHUTTLE2E JSR GETCURPARTNO ;are we loading into a 128k workspace? BVC SKIP128 FIN DO COPYKIT2E JSR ISIT128K2E BNE SKIP128 FIN DO APPLE2E LDA CONFIGUR ;if its a 128k pgm AND MACHINID ;and a 128k apple AND #BITAUXMEM ;(isolate the 128k bit) BEQ SKIP128 ;then a dump/load of aux mem is necc STA DISKAUXFLAG ;tell rwts to use auxmem sectoring JSR SPINDRIVE ;keep drive turning to save time JSR SWAPAUX ;SWAP MAIN 64K WITH AUX 64K JSR GET64KTBL ;POINTERS TO MB 64K RAM JSR LOADDUMPTBL1 ;I/O 64K ;PHP ;SAVE ABORT FLAG JSR SWAPAUX ;PLP LDA #0 STA DISKAUXFLAG ;INDICATE MAIN MEM ;BCS SKIPIT ;IN CASE OF ABORT JMP NOXFER80 ;80col info is imbedded in aux mem dump SKIP128 EQU * FIN ; *** LOAD/DUMP 80-COLUMN CARD ; XFER80IFNECC EQU * ;if necc, load/dump 80col contents. JSR ISIT80DISK ;does configur say that this pgm uses 80-card, and if ; so, does the required card = the existing card? BNE NOXFER80 DO APPLE2E LDA CONFIGUR ;if pgm is 64K AND #BITAUXMEM BEQ PGMIS64K ;then brnch & load trk 2 80-col info, JSR XFER80A ;else get 80col info from trk 10 JMP SKIPIT ;done PGMIS64K EQU * FIN JSR XFER80 NOXFER80 EQU * ; ; SKIPIT EQU * RTS ; ; ; ; LOADDUMPTBL1 EQU * ;COPY RAM TO/FROM DISK ; ASSUMES POINTER TO TABLE IS IN TBLPTR JSR GET1STMBPAGE GNMPLOOP EQU * JSR IOPAGE ;READ/WRITE DISK BCS SKIPIT1 ;BNCH TO ABORT JSR GETNEXTMBPAGE ;POINT TO ANOTHER RAM PAGE BCC GNMPLOOP ;LOOP UNTIL NO PAGES LEFT CLC ;INDICATE ALL WENT OK SKIPIT1 EQU * PHP ;SAVE ABORT FLAG JSR RESETACCESS ;RESTORE BANKED/SWAPPED RAM PLP RTS * * * * * DO 0 ;OLD CODE *SWAP80COL EQU * STA SW80STORE+1 STA SWPAGE2+1 LDX #4 ;TEXT.PAGE LDY #0 ;SSRAM.PAGE LDA #4 ;NO,OF.PAGES JSR SWAP2E STA SWPAGE2 STA SW80STORE RTS FIN ; ; * ********************************* * * COPY 80-COL CARD TO/FROM DISK * *(THIS IS FOR ANY 80-COL CARD) * * * COPY ONE PAGE AT A TIME, BUFFER- * ING VIA PAGE 4. * ON LOAD: READ FROM DISK, THEN * WRITE TO CARD * ON DUMP: READ FROM CARD, THEN * WRITE TO DISK * ********************************* * DO APPLE2E XFER80A EQU * JSR POINTTABLE80A JMP XFER80CONT FIN ; * XFER80 EQU * JSR POINTTABLE80 ;POINT TO TBL XFER80CONT EQU * JSR GETBUNDLE ;COPY PTRS FRM TBL TO IOB ; DO APPLE2E ;IF 2E80COLCARD, THEN ONLY DUMP/LOAD 4 PAGES OF TEXT. LDA #4 STA YETTODO FIN ; ; LOOP80 EQU * LDA #BUFF80 ;PAGE 4=BUFFER STA BUFFADDR+1 ;ADDR IN DISK IOBLK LDX COMMAND ;LOAD OR DUMP? DEX BEQ LOAD80 ;BNCH IF LOAD ; ;FOR A DUMP... LDA REALPAGE LDY #BUFF80 ;PAGE 4 CLC ;GET PAGE FROM 80-COL JSR RW80COLX ;80-COL ROUTINE JSR IOPAGE ;DUMP TO DISK BCS BAD80 BCC GOON80 ; ;OR FOR A LOAD... LOAD80 EQU * JSR IOPAGE BCS BAD80 LDA REALPAGE ;0-7 OF CARD RAM LDY #BUFF80 ;PAGE 4 SEC ;PUT PAGE TO 80-COL JSR RW80COLX ;FROM PAGE 4 ; GOON80 EQU * JSR DECPAGE ;PNT TO NXT PG BNE LOOP80 ;BCH IF MORE YETTODO CLC RTS ; BAD80 EQU * SEC RTS ; DO APPLE2E POINTTABLE80A EQU * LDX #TBL80COLA JMP PTB80 FIN ; POINTTABLE80 EQU * LDX #TBL80COL PTB80 EQU * STX TBLPTR+1 STY TBLPTR LDY #0 RTS ; TBL80COL EQU * ;SAME FORMAT AS MAIN TABLES DFB 8,2,2,$D,7,>ACCOKASIS-ABASE ; DO APPLE2E TBL80COLA EQU * ;SAME FORMAT AS MAIN TABLES DFB 8,2,$10,$7,7,>ACCOKASIS-ABASE ; SPINDRIVE EQU * LDX SLOT LDA $C089,X ;TURN ON MOTOR RTS FIN * ,`,`0U,,,iȅ( r,,`,,Ȍ` Ȍ`P`) ***DRIVER FOR 'OTHER' 80-COL CARD *****(MIGHT BE VIDEX-LIKE)******* ; INCLUDE EQUATES ; ORG $300 ; ; ID80COL DFB IDOTHER+BIT80COL ;WHICH CARD? ; SHOW40 STA $C058 ;flip annunciator 0 for Apple video RTS ; ; SHOW80 STA $C059 ;switch in the 80 col video RTS ; LEN80COL DFB 0 ;WE CAN R/W 0 PAGES OF THE CARD ; DOAPAGE RTS X`Y`` SBTL .VNONE - dummy 80-col I/O routine. * **** NOTE: ALL 80-COL CARD DRIVERS MUST HAVE ENTRY POINTS AT SAME ADDRS: * ORG $300 *0300: ID BYTE OF CARD (10=2E) +80='THERE IS AN 80-COL CARD' *0301: SHOW 40 COLS (4 BYTES) *0305: SHOW 80 COLS (4 BYTES) *0309: NUMBER OF PAGES ONE CAN R/W IN THIS CARD *030A: R/W A PAGE OF 80-COL MEMORY * * ; ID80COL DFB 0 ;SIGNIFIES NO CARD ; SHOW40 EQU * NOP NOP NOP RTS ; SHOW80 EQU * NOP NOP NOP RTS ; LEN80COL DFB 0 ;CARD HOLDS 0 PAGES ; RW80COLX EQU * **** ON ENTRY, A=PAGE TO BE XFERRED, SEC=STORE TO CARD, CLC=READ CARD. **** and Y = main RAM i/o page. * * RTS QVNONE.0 RSWAPALLGnVECTORS)OLDRESUME |)GOMONITORo'PRMENU2 k)BOOTADISK  CLRMSGAREAaq(GETSR.A2 k&LOADER(YL̬)SWAP1PAGEC:̬(MAINLINEH JɬOLDC800BITP```; SWAPALL EQU * LDX #SWSLOTSDISABL JSR INYNEXTBIT STY ENDISABLEADDR LDY #>SWRAMRD JSR INYNEXTBIT STY ENDISRAMRD LDY #>SWRAMWRT JSR INYNEXTBIT STY ENDISRAMWRT LDY #>SWSLOT3ENABLE ;SHOULD SLOT 3 BE ENABLED UPON RESUME? JSR INYNEXTBIT STY ENDISSLOT3 ;MOD INSTRUCTION THAT EN/DSABLES IT ;LDY #0 ROR A ;STY IFTOHITC300+1 LDY #>SWAUXZP JSR INYNEXTBIT STY ENDISAUXZP NO2ESTUFF EQU * RTS ; INYNEXTBIT EQU * ;ROR THEN INY IF BIT 0 WAS ON ROR A BCC BITSOFF INY BITSOFF EQU * RTS * * * ; SETINC EQU * ;CREATE.AN.OPERAND.THAT.MAKES.THE FINAL 'INC' INSTRUCTION.SET.N.AND.Z.FLAGS.TO.THE.VALUE.THEY.HAD.IN.USER'S.P-REG LDA STATSTOW ;GET.P-REG BMI NFLAGON ROR A ROR A ;GET.Z.FLAG.INTO.CARRY BCS ZFLAGON ;NO.FLAGS.ON LDA #1 ;INC.#1.WILL.TURN.FLAGS.OFF BNE SETOPERAND ZFLAGON EQU * LDA #$FF BNE SETOPERAND NFLAGON EQU * LDA #$FE SETOPERAND EQU * STA INCOPERAND RTS ; ; ; ; * * ; SBTL .JUMP TO MONITOR ; GOMONITOR EQU * TSX STX TEMPSTK JSR HOME ;SAVE STACK PTR AND CLR SCREEN ; JSR ESCMSG ;'PRESS TO RETURN TO MENU' ; ;SET OWN KEYIN ROUTINE TO WATCH FOR ESC JSR SETFILTER * * LDA #0 STA SWAPFLAG ; *SET.UP.REGS.AT.INTERRUPT.TO.BE.DISPLAYED.ON.SCREEN LDX XSTOW ;X-REG SAVED BY SHELL LDY YSTOW LDA ASTOW JSR SAVE ;SAVE 3 REGS IN OLDMON'S AREA LDA STATSTOW ;STATUS REG SAVED BY SHELL STA STATUS ;SAVE STATUS LDA STACKPTR STA SPNT ;SAVE PTR LDA RHSTOW STA PCH ;SAVE PC LDA RLSTOW STA PCL ;DISPLAY REGS AND GO TO MONITOR LDX #0 ;left margin LDY #0 ;top of screen JSR MSGOUT1 ASC .Registers:. DFB 0 JSR INSDS1 ;SHOW ADDR JSR RGDSP1 ;AND REGS JSR MSGOUT DFB CR ASC .Entering monitor:. DFB 0 JMP MON ; * * KEYFILTER EQU * ;INTERCEPT.KBD.CALLS JSR KEYIN ;GET A KEY CMP #ESC ;ESCAPE? BEQ GOTESC CMP #$82 ;CTRL-B BEQ GOTESC CMP #$83 ;CTRL-C BEQ GOTESC CMP #$99 ;CTRL-Y BNE NOTCTRLY JSR CTRLYPGM JMP KEYFILTER ;LOOP FOR NEXT CHAR NOTCTRLY EQU * RTS ; ; GOTESC EQU * LDA SWAPFLAG ;IS SSRAM SWAPPED OUT? BEQ DONTSWAP JSR CTRLYPGM DONTSWAP EQU * ; ****EXIT TO CALLER ; LDX TEMPSTK ;RESTORE STACK PTR TXS ;AS IT WAS AT ENTRY RTS ;AND RETURN TO USER PGM TEMPSTK DFB 0 ;TEMP STACK CACHE * SETFILTER EQU * ;POINT KBD VECTOR TO KEYFILTER LDA #>KEYFILTER STA KSWL LDA #. ASC . to return to menu). DFB 0 RTS SBTL .EQUATES. BASL EQU $28 RESET EQU $3F2 PWREDUP EQU $3F4 ;POWER-UP BYTE ; HOME EQU $FC58 RDKEY EQU $FD0C ;VECTORS THRU KSW TO KEYIN KEYIN EQU $FD1B ;'KEYIN' DEVROOT EQU $C080 ;SS.CONTROL.ADDR IOAREA EQU $C000 ;$C000.FOR.REAL NMI EQU $FFFA ;NMI VECTOR FAKEADDR EQU $C03E ;ADDR.PUT.ON.BUS.AT.NMI.TIME SETINV EQU $FE80 ;VIDEO MODE COUT1 EQU $FDF0 ;VIDEO OUTPUT ROUTINE BASCALC EQU $FBC1 ;USES VCURSOR VALUE TO PREPARE COUT INSDS1 EQU $F882 RGDSP1 EQU $FADA ;SHOW REGS MON EQU $FF65 ;MONITOR TESTCARD EQU $CB24 ;2E-ONLY MONITOR ROUTINE:IS THERE AN 80-COL CARD? BEEP EQU $FBDD GETLN EQU $FD6A PRERR EQU $FF2D INIT EQU $FB2F SETVID EQU $FE93 SETKBD EQU $FE89 MONITOR EQU $FF59 SETNORM EQU $FE84 CROUT EQU $FD8E COLDSTART EQU $FAA6 TABV EQU $FB5B OUTPORT EQU $FE95 SETPWRC EQU $FB6F ; ***** KEYS ***** ESC EQU $9B ESCAPE EQU $9B LARROW EQU $88 RARROW EQU $95 UPARROW EQU $8B DNARROW EQU $8A RETURN EQU $8D CR EQU $8D CTRL.D EQU $84 BLANK EQU $A0 ASTERISK EQU $AA CTRLY EQU $99 CTRLQ EQU $91 CTRLU EQU $15 EIGHT EQU $B8 FOUR EQU $B4 ; ;***** SCREEN CHARS ***** CURSOR EQU $20 ;INVERSE SPACE ***** TEXT SCREEN PARAMS ***** CV EQU $25 CHAR VERT POSITION CH EQU $24 HORZ TOPEDGE EQU $22 ;TOP EDGE OF WINDOW STORED HERE. ; ***** I/O LOCATIONS ***** SPEAKER EQU $C030 CSWL EQU $36 KSWL EQU $38 WNDWDTH EQU $21 ;WINDOW WIDTH PROMPT EQU $33 ;CHAR DISPLAYED ; *****PAGE ZERO LOCAL STORAGE TEMP1 EQU $CE TEMP2 EQU $CF TBLPTR EQU $EE ;POINTER TO TABLE OF I/O AREAS PTBLPTR EQU $EB ;AND $EC PAGEINDEX EQU $ED ;BLOCKIO COUNTER PAGE0TEMP1 EQU $FC PAGE0TEMP2 EQU $FD PAGE0TEMP3 EQU $FE PAGE0TEMP4 EQU $FF RPTDPAGECTR EQU $F9 ;USED BY FINDRPTDAREA,STASH80 RPTDAREALEN EQU $FA ;AS PRECEDING. RAMPTR EQU $FE ;-$FF: UTILITY FOR INNER LOOPS TO RAM LMARGIN EQU $FF RMARGIN EQU $FE ;TEMPS USED BY GETNAME ; ; ; ; ; ********************************************************** * * * PRMENU - print a menu on screen * * * * This module displays a series of centered lines on * * the screen. On entry, the X and Y registers must * * point to a parameter list containing the text, and * * a list of the vertical spacing between the lines. * * The text must consist of strings of Ascii separated * * by hex zeroes. The vertical spacing list is a * * series of hex values, one per line of text, each of * * which specifies the distance of that line from the * * line above. A negative value signals the end of the * * list. If a value is zero, the corresponding line * * of text is not printed. (This gives software a con- * * venient way to erase menu lines during execution.) * * * * This module is used for all the Copykit and Shuttle * * menus. It is generally used in conjunction with the * * GETSR.A module which displays the cursor bar and * * reads the keyboard for the user's selections. * ********************************************************** * * * SAMPLE CALLING ROUTINE * * * * LDX #MENUPARMS * * JSR PRMENU2 * * RTS * *MENUPARMS DW MESSAGES * * DW VERTS * *VERTS EQU * * * DFB 2,2,2,2,$FF ;FOUR LINES, DOUBLE SPACED * *MESSAGES EQU * * * ASC .THIS IS THE FIRST LINE. * * DFB 0 * * ASC .AND THIS IS THE SECOND. * * DFB 0 * * ASC .THEY WILL ALL BE CENTERED. * * DFB 0 * * ASC .ON THIS SIMPLE MENU. * * DFB 0 * * * ********************************************************* * ;X INDEXES TABLES, Y INDEXES MSGS VCURSOR EQU $25 ;OUTPUT CURSOR LOC HCURSOR EQU $24 ;LIKEWISE, HORIZ. MSGTOP EQU $F9 ;VECTOR TO 1ST CHAR OF CURRENT MSG VERTPTR EQU $FB ;VECTOR TO TABLE OF VER LINE SPACINGS BEFORE MSGS LISTPTR EQU $FD ;VEC TO PARMLIST ********************************************************** SKP 3 PRMENU2 EQU * ;LOAD PARMLIST STY LISTPTR ;PTR TO PARMLIST STX LISTPTR+1 LDY #3 PLOOP1 EQU * ;COPY.TO.THIS.ROUTINE'S.INPUT LDA (LISTPTR),Y STA MSGTOP,Y DEY BPL PLOOP1 ;COPY 2 ADDRS SKP 2 INC WNDWDTH ;SO NO CR AFTER 40 CHARS LDX #0 ;INDEXES STX VCURSOR ;PUT CRSR.AT.TOP.OF.PAGE MENULOOP EQU * ;X IS INDEX INTO VERT SPACING TABLE TXA TAY ;BCS INDIRECT USES Y LDA (VERTPTR),Y ;# OF LINES TO MOVE DOWN FROM LAST MSG: FB=VERTPTR STA TEMP1 BMI NOMORE ;NEG TAG MEANS NO MORE CLC ;CLR CARRY ADC VCURSOR STA VCURSOR ;MOVE CURSOR DOWN JSR DISPMARGIN JSR DISPMSG ;DISPLAY IT INX JMP MENULOOP ;DO ANOTHER MSG NOMORE EQU * DEC WNDWDTH ;RESTORE RTS SKP 1 DISPMARGIN EQU * LDA WNDWDTH ;=41 STA HCURSOR LDY #$FF LLOOP EQU * ; DEC HCURSOR INY LDA ($F9),Y ;GET NEXT CHAR: F9=MSGTOP BNE LLOOP ;IF ITS NOT NULL, LLOOPEND EQU * LSR HCURSOR ;40-TXT LENGTH /2 RTS SKP 1 SKP 1 DISPMSG EQU * ;DISPLAY MESSAGE LDA VCURSOR JSR BASCALC ;SET SCR VECTOR LOOP89 LDY #0 LDA ($F9),Y ;F9=MSGTOP BEQ MSGEND ;IF CHAR=NULL,EXIT LDY TEMP1 BEQ SKIPCOUT ;IF VERT=0, DONT SHOW LINE JSR COUT1 ;DISPLAY CHAR SKIPCOUT EQU * JSR INCTOP ;INCREMENT MSGTOP POINTER JMP LOOP89 ;GET NEXT CHAR MSGEND EQU * JSR INCTOP ;POINT TO HEAD OF NEXT MSG RTS INCTOP EQU * INC MSGTOP ;INC LOW-ORDER BYTE BNE NOPAGE6 INC MSGTOP+1 ;HIGH IF NECC NOPAGE6 EQU * RTS SBTL .BOOT A SPECIMEN DISK. ; ; BOOTADISK EQU * DO COPYKIT+SHUTTLE JSR ERASEIFOK ;'ok to erase?' BCS NOTBOOT JSR GETCONFIGINFO ;ask pgm size and 80-col use BCS NOTBOOT FIN ;DO SHUTTLE ;JSR SHOWSCRN ;JSR CLEARWKSPACE2 ;FIN DO SHUTTLE+COPYKIT JSR ESCMSG JSR BOOTMSG ;JSR PRDISKSLOT ;ENQUIRE JSR GETSLOTORRET ;ENQUIRE.&.GET.SLOT# BNE BOOTACCUM LDA LSLOT ;LAST SLOT USED LSR A LSR A LSR A LSR A FIN ; BOOTACCUM EQU * ;BOOT SLOT WHOSE VALUE IS IN ACCUM. DO SHELL TAY BNE BOOTACCUM2 JSR SWAP1ST8   DEC PWREDUP JSR SWAP1ST8 LDA $FFFD LDX $FFFC STA RHSTOW STX RLSTOW LDA #0 BEQ BOOTACCUM3 BOOTACCUM2 EQU * FIN ; ORA #$C0 ;CN,WHERE.N.IS.SLOT.# STA RHSTOW ;RETURN.ADDR.=.$CN00 LDA #0 STA RLSTOW ;LO-ORDER BOOTACCUM3 EQU * STA FFEXSTOW ;TURN.ON.SLOTS.BEFORE.BOOTING STA MEMSTATUS ;BANKED.MEM.OFF STA SLOTROM ;NO C800 ROM ON ('RESUME' WILL DO CFFF) STA STATSTOW ;STATUS BYTE OFF TO ENABLE INTERRUPTS LDA #TEXT1+SOFTSETBIT STA SOFT ;80-COL.SWITCHES.OFF ; JMP BOOTRESUME ; NOTBOOT RTS ; GETCONFIGINFO EQU * ;ask if pgm uses 128k or 80-col card. DO SHUTTLE JSR GETNAME FIN DO SHUTTLE2E+COPYKIT2E JSR ISIT128K2E SEC ;default is 64K BNE NOSIZEINQ JSR SETPGMSIZE ;64K OR 128K? SEC if 64K NOSIZEINQ EQU * FIN DO SHUTTLE2E BCS ITS64K JSR OPEN128 ;open a 128k workspace BCS NOBOOT ;abort if not opened ;JSR CLEAR ;JSR SWAPAUX ;move cleared area to auxram BCC SIZEDONE ; ITS64K EQU * FIN DO SHUTTLE JSR OPEN64 ;open a 64k ws BCS NOBOOT ;abort SIZEDONE EQU * ;endif ;JSR CLEAR ;clear 64k ; FIN DO 0 JSR SHOWBARMENU ;just in case, to clear buffer junk from screen FIN ; DO SHUTTLE2+COPYKIT2 LDA ID80COL ;IF 80-COL DRIVER BEQ NO80INQ ;IS OTHER THAN '2E' OR 'NONE' JSR SET80USE ;ASK IF 80COL IN USE. NO80INQ EQU * FIN CLC ;CLR FLAG TO SHOW 'OK' DO SHUTTLE+COPYKIT NOBOOT RTS ; FIN ; ERASEIFOK EQU * ;USED BY BOOT AND LOAD ROUTINES DO SHUTTLE+COPYKIT JSR CLRMSGAREA FIN DO SHUTTLE JSR GETCURPARTNO BPL OKTOERASE ;PLUS IF NOT IN USE JSR ERASEMSG ;'OK TO ERASE?' BCS NOBOOT1 OKTOERASE EQU * FIN DO SHUTTLE JSR CLEARWKSPACE1 ;CLEARMSG, RAM, STATUS FIN DO COPYKIT JSR CLEARMSG ;'CLEARING MEMORY' JSR CLEAR ;ZERO SUBJECT RAM ;JSR CLEARSTATUS ;CLEAR PGM STATUS INFO FIN ;turn off all bits except //e and 80-col ID (if on) ; in backup's requirements description. DO SHUTTLE+COPYKIT LDA MACHINID AND #BIT2E+BITSID80COL STA CONFIGUR CLC NOBOOT1 EQU * RTS FIN ; SKP 2 DO SHELL ELSE BOOTMSG EQU * ;ISSUE MSG LDX #1 HORZ TAB LDY #MSGAREA+1 ;VERT CHAR POSITION JSR MSGOUT1 ;SHOW FOLLOWING TEXT SKP 2 ;DO GERMAN ;BMSG ASC .PROGRAMMDISK IN DRIVE 1 EINLEGEN. ;ELSE MSB OFF ;inverse lettering ASC .Press to boot . MSB ON FIN DO SHUTTLE DFB 0 LDX CURRENTPROGNO JSR SHOWNAME JSR MSGOUT FIN DO SHELL ELSE DFB CR ASC . (or press disk slot number). DFB 0 RTS ;NEEDED BY MSGOUT ;BVERTS DFB 5,$FF FIN ; SHOWBARMENU EQU * JSR SHOWSCRN LDX SAVEDX ;which option is active? JSR GETVCURSOR ;find its vtab JSR WRITECRSRS ;and invert the line of text JSR SHOWMENU ;then re-type text over it, leaving end bars RTS SBTL .CLEAR MESSAGE AREA. CLRMSGAREA EQU * LDA #MSGAREA STA TOPEDGE ;LIMIT WINDOW JSR TABV ;PUT CURSOR WITHIN WINDOW JSR HOME ;CLEAR WINDOW LDA #0 STA TOPEDGE ;RESTORE DO COPYKIT SHOWDASHES EQU * STA CH ;LEFT EDGE OF SCREEN LDA #MSGAREA-1 JSR TABV ;SET CV AND BASL,H LDY #39 DASHLOOP EQU * LDA #'-' JSR COUT DEY BPL DASHLOOP FIN RTS ; SBTL .GET A SUBROUTINE ADDR FROM OPER. ****************************************************************** * * GETSR.A - get a selection from the operator * * This routine works in conjunction with the parameter list * used by PRMENU. It places the 'magic bar' cursor on the screen * and lets the operator control it with the arrow keys. When the * operator presses , it selects the address of the corres- * ponding subroutine from a list, and saves it (usually in a JSR * instruction) and exits. Note that this assumes that a //e is * in alternate character set mode, to provide inverse lower case * under the cursor. On a 2+, upper case only is assumed, because * of the variety of 2+ lower case chips. * * This routine uses some of the equates found in the first part of * PRMENU2. Unresolved addresses should be sought there. * ******************************************************************* * INVBIT EQU $00 NORMBIT EQU $80 ;BIT.ON.FOR.NORMAL.SCRN.CHARS SPACE EQU $A0 ;BLANK SPACE(VIDEO) VECTORS EQU * ;TABLE OF VECTORS TO THE SUBROUTINES CORRESPONDING * TO THE MENU OPTIONS DW FIRSTROUTINE ;FOR THE FIRST LINE OF THE MENU DW SECONDROUTINE ;FOR THE SECOND LINE DW 0 ;THE THIRD LINE WILL BE SKIPPED, BECAUSE THE ADDR IS ZERO. DW FOURTHROUTINE ;BUT THIS LINE WILL BE DISPLAYED. ; ; ; SAVEDX DFB 0 ; GETSR.A EQU * LDX SAVEDX BNE GETSRLOOP ;USE.RECENT.CRSR.POSITION JSR WRAPAROUND ;FIND.FIRST.LINE.WITH.NONZERO.SUBROUTINE.ADDR *AND.SET.CURSOR.THERE.(X-REG.IS. *RELATIVE.LINE.#,..VCURSOR.IS.ABSOLUTE.LINE.#) GETSRLOOP EQU * JSR GETVCURSOR ;get vert cursor value corresp. to this x JSR WRITECRSRS ;SHOW CURSORS JSR GETESCARRRET2 ;ONLY RETURNS WITH 1 OF 4 KEYS ; BEQ OUTSRLOOP ;BRCH.IF.RETURN.KEY BMI UPONE ;LEFT ARROW OR ESCAPE JSR WRITECRSRS ;ERASE PREVIOUS CURSORS JSR NEXTLINE ;MOVE TO NEXT LINE JMP ENDSRLOOP * UPONE EQU * JSR WRITECRSRS ;ERASE CURSORS JSR PREVLINE ;GO.UP.ONE.LINE * ENDSRLOOP EQU * JMP GETSRLOOP ;BOTTOM.OF.LOOP * OUTSRLOOP EQU * JSR GETVECTOR ;GET ADDR OF SUBROUTINE SELECTED RTS ;AND RETURN IT TO CALLER SKP 1 ; ; SKP 1 WRITECRSRS EQU * LDA VCURSOR JSR BASCALC ;STORE.ADDR.OF.LEFT.END.OF.LINE.IN.BASL,H LDY #39 ;LAST COLUMN * *FOR EACH CHAR ON THE LINE: FLIP BIT 7. IF BIT 5 IS ZERO (ITS A UPCASE LETTER) THEN FLIP BIT 6 AS WELL. INVLOOP EQU * LDA (BASL),Y EOR #$80 JSR FLIP6IF5IS0 ;DELETE THIS LINE ON A //E!! STA (BASL),Y DEY BPL INVLOOP RTS SKP 1 ; FLIP6IF5IS0 EQU * ;on 2+, set inverse STA PAGE0TEMP1 AND #$20 EOR #$20 ASL A ;if bit 5 was off, flip bit 6 EOR PAGE0TEMP1 RTS ; WRAPAROUND EQU * ;BACK TO TOP OF SCREEN LDX #$FF ;READY TO INC TO 0 NEXTLINE EQU * INX ;POINT TO NEXT MSG LDA VERTS,X ;IF.NEXT.MSG.IS.NONEXISTENT BEQ NEXTLINE ;OR NULLED BMI WRAPAROUND ;START AGAIN STX SAVEDX ;SAVE.CURRENT.CRSR.POS JSR GETVECTOR ;FETCH VECTOR FOR SR BEQ NEXTLINE ;GOTO NEXT LINE RTS * PREVLINE EQU * LDA #$FE ;SET.COUNTER.TO.-1 STA PAGE0TEMP2 ;COUNTS.#.OF.LINES.IN.FULL.CYCLE STX PAGE0TEMP1 ;CURRENT.LINE.# NEXTAGAIN1 EQU * JSR NEXTLINE ;DN.1.LINE INC PAGE0TEMP2 ;INCR.COUNT CPX PAGE0TEMP1 BNE NEXTAGAIN1 ;LOOP.TIL.CYCLED.THRU.ALL.LINES NEXTAGAIN2 EQU * ;LOOP.TO.PRECEDING.LINE JSR NEXTLINE DEC PAGE0TEMP2 BPL NEXTAGAIN2 RTS * * * GETVECTOR EQU * TXA CLC ROL A ;TIMES 2 TAY LDA VECTORS,Y STA SRVECTOR ;MOVE VECTOR LDA VECTORS+1,Y ;TO SUB- STA SRVECTOR+1 ;ROUTINE CALL RTS SKP 1 GETVCURSOR EQU * ;get vert displacement for this x STX PAGE0TEMP1 LDA #0 LDY #$FF GVCLOOP EQU * INY CLC ADC VERTS,Y CPY PAGE0TEMP1 BNE GVCLOOP STA VCURSOR RTS *********************************NEW ORG AT $0804******************************* ; ; ; SBTL .LOAD SNAPSHOT SOFTWARE TO CARD. * * MSB ON ;PRODOS DEFAULTS TO MSBOFF SETDOSHOOKS EQU $A851 LOWPAGESBUFF EQU $3100 STANDALONE EQU $2800 STANDALONEFLAG EQU 1 PRELOAD EQU $1000 ;DRIVER INITIALLY LOADED HERE; 'STAGING AREA' NOPCODE EQU $EA ;'NOP' OPCODE SAFE EQU $0001 * ********************************* * * *** LOADER *** * * THE JOB OF THIS MODULE IS TO * TAKE THE LOAD MODULE THAT IS * BLOADED IN !"#$%&'()*+,-./0123456789:;<=>?@ATO RAM WHEN THE * DISK IS BOOTED, BREAK IT INTO * ITS CONSTITUENT PARTS (OF WHICH * 'LOADER' IS ONE), MOVE THEM INTO * THEIR 'HOMES' (ORG AREAS), MODI- * FY THEM TO FIT THE HARDWARE CON- * FIGURATION, AND MOVE THEM TO THE * SNAPSHOT CARD. * * ******************************** ; LOADER EQU * * JMP PASTDFB DO SHUTTLE CONFIGDATA EQU * ;stored here by CONFIGURE; copied to tables DFB -1,0,0,0,0,0,0,0 DFB 0,0,0,0,0,0,0,0 SSSLOTX DFB 0 FIN RAMVEC DW $0000 DEVVEC DW DEVROOT SLOTX10 DFB 0 PASTDFB EQU * * JSR HOME ; ; ******************************* ****** TESTING UNDER PRODOS? ** ******************************* ; *IF SO, MAKE LOADER THINK ITS DOS JSR PRODOSFIX ;SET DOS VALUES BEQ NOPATCHES ; ******************************* ****** UNDO EFFECTS OF FASTLOAD ******************************* ; *PATCH DOS AFTER FASTLOAD *IN CASE OF A LATER INIT DO 0 ;knocked out since we no longer fastload. LDA #$A9 STA $9E41 LDA #$34 STA $9E42 LDA #$D0 STA $9E43 FIN LDA #$0 ;ZERO OUT $800-$803 LDX #3 Z800LOOP EQU * STA $800,X DEX BPL Z800LOOP ; ; JSR SETDOSHOOKS ;RESET DOS SCREEN/KEYBOARD VECTORS ; NOPATCHES EQU * ******************************** * IF 'COPY' OR OTHER UTILITY * PGM WAS REQUESTED, RUN IT. ******************************** ; DO SHUTTLE ELSE JSR SSUTES ;CHECK.FOR.'COPY'.REQUEST FIN ; ; ******************************** * MOVE SOFTWARE TO ITS HOME * SO IT CAN BE USED BY LOADER ******************************** ; ;DO SHELL ;JSR SWAPRESET ;SAVERESET VECTOR ;FIN * *PART OF THE LOAD MODULE HAS ITS HOME ON PAGES 2-3. *MOVE IT THERE. JSR SWAPK ; *MOVE THE *BIG* PROGRAM INTO ITS HOME AT A800. ; JSR SWAPDOS ;MOVE DOS TO SAFETY LDX # inverse upper LDA #$C0 STA CNVRTFLG ;lower -> upper LOWEROK EQU * ; **PAGE 0 MODS LDA #CURSOR ;INVERSE SPACE STA PROMPT ;IS PROMPT CHARACTER ; ;JSR SETPWRC ;MON ROUTINE TO GENERATE POWER-UP BYTE ; DO ISRWOTS ;ONLY IF RWOTS EXISTS JSR COPYSCRATCH ;COPY DOS SCRATCHPAD ($4F8,ETC.) TO RWOTS INTERNAL SCRATCHPAD ; SO THAT RWOTS KNOWS WHERE DISK HEAD IS ; ; NOP NOP NOP ;just to keep listing in line ;JSR SETSLOTT ;PUT.BOOT.SLOT.INTO.IOB FIN ;END DO ISRWOTS ; ; JSR INITMOUSE1 ;if mouse present, init it. ; DO COPYKIT ; LDA PRODOSFIXFLAG ;IS THIS PRODOS? BEQ PRODOS1 IF SO, NOT A BACKUP JSR GET.FLAGPAGE ;GET DUMPED PGM'S ESSENTIAL PARAMS ; AND CONFIGURATION INFORMATION ; (CAUSES GLITCH ON TEXT SCREEN) JSR READFLAGS ;COPY PARAMS/FLAGS TO MAIN SAVEAREA IN HI CORE PRODOS1 EQU * FIN ;ENDDO ; ; ; ; ; DO SHUTTLE ;ONLY USED BY SHUTTLE JSR COPYRAMINFO ;COPY INFO ON RAM CARDS ; FROM LOADER TO INTERNAL TABLES FIN ; DO SHUTTLE ELSE JSR HOME JSR PRLOGO ;SHOW COPYRIGHT NOTICE FIN DO COPYKIT2 ;copykit on //e is not configurable ELSE JSR PRCONFIG ;"PRESS TO CONFIGURE DISK" FIN ; DO COPYKIT ;ONLY USED BY COPYKIT LDA RCARDOFF LDA PRODOSFIXFLAG ;IS IT PRODOS? BEQ NOAUTO ;IF SO, ITS A MASTER JSR ISITAMASTER ;NOT AN AUTOBOOT? BEQ NOAUTO LDA #$80 STA AUTOBOOTFLAG ;LET.DRIVER.KNOW.IT'S.AN.AUTOBOOT ; ; *JSR BYPASS.TEST ;SHOULD.BACKUP.BE.RUN.WITHOUT.FURTHER.ADO? ;SHOW NOTICE SAYING 'BACKUP COPY' AND 'IF SS IS NOT INSTALLED....' JSR PRIFNOCARD ;DISPLAY.MSG *JSR PRBYPASSMSG ; FIN ; NOAUTO EQU * ; DO SHUTTLE LDA SSSLOTX ;if slot already set BNE GOTSLOT ;then no need to ask FIN JSR PRKITSLOT LDY #1 ;tell setconfig to JSR SETRESET ; point reset vec to "RUN CONFIGURE" JSR GETSLOTORRET ;WHAT.SLOT.IS.SS2E.IN....PUT.NUMBER.IN."SLOT" GOTSLOT EQU * PHA LDY #5 JSR SETRESET ;point reset vec to menu PLA TAX ;SET.FLAG BNE HAYCARD ;BNCH IF SLOT <>0 DO COPYKIT ; ELSE CONTINUE WITH STANDALONE RUN (NO CARD) JMP NOCARD ELSE JMP NOAUTO ;try again FIN ; HAYCARD EQU * ;CARD.EXISTS STA SSSLOTX JSR MULT10 ;MULT SLOT TIMES 10 STA SLOTX10 ;SLOT.TIMES.$10 ORA DEVVEC ;8+10*N STA DEVVEC * LDA SSSLOTX ORA #TABLES JSR PUTTBL ;put in pointer LDA #1 ;'read' STA COMMAND JSR LOADDUMPTBL1 ;load ramcard into place; load 0-1 to 3100. JSR XFER80IFNECC ;load 80-col if present. JMP STANDALONE TABLES EQU * DFB $02,ACCOKASIS-ABASE ;READS IN PAGES 0 & 1 DFB $30,$FF,$0F,$F,$FF,>ACCBANK2-ABASE DFB $10,$DF,$0C,$F,$DF,>ACCBANK1-ABASE ;DFB $01,$10,$02,$F,0,>ACCOKASIS-ABASE ;RE-READS FLAGPAGE INTO $1000 DFB $FF TABLEEND EQU * ******************************** * * END OF STANDALONE! * RESUME NON-STANDALONE CODE * ******************************** ; ; FIN ; ; ; ISITAMASTER EQU * LDA SOFT AND #SOFTSETBIT RTS ; ; ; ; PRLOGO EQU * LDX #LOGOLIST JSR PRMENU2 RTS ; LOGOLIST DW LOGOMSG DW LOGOVERTS LOGOMSG EQU * ASC . . ASC .**********THE . DO PRINTERRUPT ASC .PRINTERRUPT. FIN DO SHELL-PRINTERRUPT ;if shell but not p'rupt ASC .SHELL. FIN DO SHUTTLE ASC .SHUTTLE. FIN DO COPYKIT ASC .COPYKIT. FIN ASC . ***********. DFB 0 ASC . . ASC .Copyright 1984 Dark Star Systems. DFB 0 ASC . . ;lst on ASC .Version 11. DFB $AE ASC .0 . DO PRINTERRUPT ASC ./2F. FIN ;lst off DFB 0 LOGOVERTS EQU * DFB 1,1,1,$FF ; TRIGGERMSG EQU * DO SHUTTLE ELSE JSR HOME FIN LDX #TGLIST JSR PRMENU2 RTS TGLIST EQU * DW TGMSG DW TGVERTS DO GERMAN TGMSG ASC .DRUECKEN SIE DEN SNAPSHOT-SCHALTER. ELSE TGMSG ASC .Please press the Snapshot trigger. FIN DFB 0 TGVERTS DFB 12,$FF ; ; ; DO COPYKIT PRIFNOCARD EQU * LDX #IFNOLIST JSR PRMENU2 RTS ; IFNOLIST DW IFNOMSG DW IFNOVERTS IFNOMSG EQU * FIN DO GERMAN*COPYKIT ASC .. DFB 0 FIN DO ENGLISH*COPYKIT ASC .If your Snapshot card is present,. DFB 0 FIN DO GERMAN ASC .(0 = KEINE SNAPSHOT-KARTE EINGEBAUT). FIN DO ENGLISH*COPYKIT ASC .(Press 0 if Snapshot is not installed). FIN DFB 0 DO GERMAN*COPYKIT ASC .SICHERHEITSKOPIE. FIN DO COPYKIT*ENGLISH ASC .Backup Copy. FIN DO COPYKIT DFB 0 ; IFNOVERTS DFB 6,10,07,$FF FIN ; ; DO 0 ; PRBYPASSMSG EQU * LDX #PRBYLIST JSR PRMENU2 RTS ; PRBYLIST DW PRBYMSG DW PRBYVERTS PRBYMSG EQU * ASC .(PRESS 8 TO SKIP THIS SCREEN IN FUTURE). DFB 0 ; PRBYVERTS DFB 15,$FF PRB2PASSMSG EQU * LDX #PRB2LIST JSR PRMENU2 RTS ; PRB2LIST DW PRB2MSG DW PRB2VERTS PRB2MSG EQU * ASC . THIS OPTION ALTERS THE BACKUP DISK. DFB 0 ASC .SO THAT WHEN THE DISK IS BOOTED,. DFB 0 ASC .IT WILL RUN AS THOUGH THERE WERE NO. DFB 0 ASC .SNAPSHOT CARD PRESENT. DFB 0 ASC .MOST (BUT NOT ALL) BACKUPS WILL RUN. DFB 0 ASC .WITHOUT A SNAPSHOT CARD PRESENT. DFB 0 ASC .PRESS RETURN TO ALTER THE BACKUP DISK. DFB 0 ASC .OR PRESS ESC TO SKIP THIS CHANGE. DFB 0 DFB 0 ; PRB2VERTS DFB 03,1,1,1,1,1,2,$FF ; FIN ; ; DO ISRWOTS SETSLOTT EQU * ;PUT.BOOT.SLOT.INTO.IOB LDA DOSSLOT STA SLOT STA LSLOT ;LAST.SLOT.USED RTS FIN ; SWAPDOS EQU * LDX #$A8 LDY #$60 LDA #$18 ;SWAP BOTH WAYS A800-BFFF WITH 6000-77FF JSR SWAP1 RTS ; ; SETAPPLETYPE EQU * LDX #$4 LDA $FBB3 ;MONITOR ID BYTE NEXTTYPE EQU * ;LOOP THRU TABLE TIL ID MATCHES CMP ROMIDS,X BEQ GOTTYPE DEX BNE NEXTTYPE GOTTYPE EQU * LDA CODETBL,X CMP #BASISTYPE ;A BASIS? BNE NOTBASIS ;FIND OUT WHICH ROM THE BASIS HAS. LDX #7 ;NEXTPART OF LIST LDA $FEEB ;GET BASIS ID BYTE 2 NEXTBASIS EQU * CMP ROMIDS,X BEQ GOTBASIS DEX BNE NEXTBASIS ; GOTBASIS EQU * NOTBASIS EQU * LDA CODETBL,X STA APPLETYPE LDA SOFTMASKTBL,X STA SOFTMASK RTS ROMIDS EQU * DFB 0 DFB $06 ;2E DFB $EA ;2+ OR ACE 100 V.2.1 DFB $10 ;BASIS DFB $C1 ;ACE 100 V2.0 DFB $A5 ;BASIS ROM 25-86 DFB $F0 ;BASIS 25-46 DFB $20 ;BASIS 25-120 CODETBL EQU * DFB 1 ;DEFAULT = 2+ DFB $0 ;2E DFB $1 ;2+ OR ACE 100 V.2.1 BASISTYPE EQU 8 DFB BASISTYPE ;BASIS DFB $2 ;ACE 100 V2.0 DFB $8 ;BASIS 25-86 DFB $9 ;BASIS 25-46 DFB $A ;BASIS 25-120 ; OLD2BITS EQU $3C ; SOFTMASKTBL EQU * DFB OLD2BITS ;JUST TRADITIONAL HIRES,TEXT,PAGE,MIXED DFB $FD ;ALL SWITCHES USABLE DFB OLD2BITS DFB OLD2BITS DFB OLD2BITS DFB OLD2BITS DFB OLD2BITS DFB OLD2BITS ; ; PATCHSOFTS EQU * LDA #NOPCODE LDX #2 PATCHLOOP EQU * STA X2EONLY1,X STA X2EONLY2,X STA X2EONLY3,X STA X2EONLY4,X STA X2EONLY5,X STA X2EONLY6,X STA X2EONLY7,X DEX BPL PATCHLOOP RTS ; ; REP 40 ;FOLOWING ROUTINE ADAPTED FROM EXTENDED 2E REFERENCE MANUAL ;FUNCTION: DETERMINE WHETHER THIS IS AN APPLE 2E, WITH/OUT ; 80-COL CARD AND EXTRA 64K. ;IF SO, RETURNS ACCUM WITH ANY/ALL ; OF FOLLOING BITS SET: ;BIT80COL, BIT2E,BITAUXMEM. ; ;If it's a 2e, then if there is a //e 80-col card, ; then mark accum with 80-col-card-ID byte from driver ; else set 80-col-card-ID byte in driver to 0 ; ;If not a 2e, ; then mark accum with 80-col-card-ID byte from driver ; (which may have value of 'no card'). ; ;note that the id in the driver has the 80-col bit set 'on'. ; SETMACHID EQU * ;SET HARDWARE IDENT CODES JSR SET2EID ;GET //E HARDWARE CONFIGURATON DO SHELL ELSE PHA AND #BIT2E ;is it a //e? BEQ MARKACCUM ;if not, mark accum with driver 80-col id PLA PHA AND #BIT80COL ;is there a //e 80-col-card? BNE MARKACCUM ;if so, mark accum with driver 80-col id LDA #0 STA ID80COL ;else mark driver id as 'no card' STA LEN80COL ;and length as 0 MARKACCUM EQU * PLA ORA ID80COL ;include bits from driver FIN PHA JSR ISMOUSE ;is there a mouse? BEQ NOTMOUSE PLA ORA #MOUSEBIT ;'there is a mouse' bit PHA NOTMOUSE EQU * PLA RTS ; SET2EID EQU * PHP SEI LDA $FBB3 ;2E MARKER DO SHUTTLE2 ELSE ;for testing 2+ software on //e CMP #$6 FIN BNE OWT1 ;IF NOT #$6 THEN NOT A 2E LDA $C017 ;WAS 80COL FOUND DURING STARTUP BMI OWT2 ;IF MINUS THEN NO 80COL LDY #ENDED-BEGUN MV LDX BEGUN-1,Y ;SWAP SECTION OF ZP WITH LDA SAFE-1,Y STX SAFE-1,Y ;CODE NEEDING SAFE LOCATION DURING STA BEGUN-1,Y LREAD AUX MEM DEY BNE MV JMP SAFE ;JUMP TO SAFE AREA ON PHP ;BACK FROM SAFE GROUND. SAVE STATUS LDY #ENDED-BEGUN MV2 LDA BEGUN-1,Y STA SAFE-1,Y DEY BNE MV2 PLA BCS OWT3 ;CARRY SET SO NO AUX MEM OWT4 LDA #BIT80COL+BIT2E+BITAUXMEM JMP OWT OWT3 LDA #BIT80COL+BIT2E JMP OWT OWT2 LDA #BIT2E JMP OWT OWT1 LDA #$0 ;NOT 2E JMP OWT OWT EQU * PLP ;RESET INTERRUPTS RTS *ROUTINE RUN IN SAFE AREA OF PAGE 0 BEGUN LDA #$EE ;TRY STORING IN AUX MEM STA SWRAMWRT+1 ;WRITE TO AUX WHILE ON MAIN ZP STA SWRAMRD+1 ;SET TO READ AUX RAM STA $800 ;CHECK FOR SPARSE MEM MAPPING LDA $C00 ;SEE IF SPARSE MEMORY -SAME VALUE CMP #$EE ;1K AWAY BNE AUXMM ASL $C00 ;CHANGE VALUE IN CASE OF LDA $800 ;COINCIDENCE CMP $C00 BNE AUXMM SEC ;SPARSE MAPPING SO NO AUX MEM BCS BAC AUXMM CLC ;THERE IS AUX MEM BAC STA $C004 ;SWITCH BACK TO WRITE MAIN RAM STA $C002 ;SWITCH BACK MAIN RAM READ JMP ON ;CONTINUE PROGRAM IN LOADER ENDED NOP ;END OF RELOCATED PROGRAM MARKER ; ; ; ; ; ; PRKITSLOT EQU * LDX #KSLIST JSR PRMENU2 RTS KSLIST DW KITSLOTMSG DO GERMAN DW GSLOTVERTS ELSE DW SLOTVERTS SLOTVERTS DFB 8,$FF FIN KITSLOTMSG EQU * DO GERMAN ASC .. DFB 0 ASC .SLOTNUMMER DER SNAPSHOT-KARTE? (1-7). ELSE ASC .Which slot is Snapshot in? (1 to 7). FIN DFB 0 GSLOTVERTS EQU * DFB 7,1,$FF ; DO ISRWOTS ; *COPY SCRATCHPAD COPYSCRATCH EQU * LDX #$7 CSLOOP EQU * LDA OLDDRV0TRK,X STA DRV0TRK,X LDA OLDDRV1TRK,X STA DRV1TRK,X DEX BPL CSLOOP RTS ; FIN ; PRODOSFIX EQU * ;LDA 253 ;RAM SLOT NO ;STA RAMSLOT LDA $BF00 ;get mli vector jmp CMP #$4C if it's a jump ; THEN THIS MUST BE PRODOS, SO SET FLAG AND DONT PATCH DOS. BNE NOTIT DO ISRWOTS LDA #$60 ;PUT SLOT 6 STA DOSSLOT WHERE DOS WOULD FIN DEC PRODOSFIXFLAG ;PRODOS IS HERE NOTIT EQU * RTS PRODOSFIXFLAG DFB 1 ;1=NOT PRODOS RAMSLOT DFB 0 ; ; ;LST ON DO SHUTTLE ;ONLY USED BY SHUTTLE COPYRAMINFO EQU * ;COPY INFO ON RAM CARDS CONFIGURATION TO INTERNAL TABLES ; FROM FLAGPAGE I/O BUFFER LDX #PARTTBLSEND-PARTTBLS-1 CRILOOP EQU * LDA CONFIGDATA,X STA PARTTBLS,X DEX BNE CRILOOP ;dont copy 1st byte of 1st table ; ; ;SET PARTQUANT:=NO OF PARTITIONS (INCLUDING M'BOARD). ;IF PROGQUANT=0, RUN CONFIGURE. LDY #PARTACCESTBL-PARTTYPETABLE-1 PARTCOUNTLOOP EQU * ;HOW MANY PARTITIONS? LDX PARTTYPETABLE,Y BEQ NOPART INC PARTQUANT ;count of partitions TYA PHA TAX JSR GETPARTTBLX LDX PARTSLOT ;what slot is it in? INC SLOTQUANT,X PLA TAY NOPART EQU * DEY BNE PARTCOUNTLOOP LDX PARTQUANT ;if no partitions except m'board, BNE DONTRUNCONFIG ;RUN CONFIG PGM JMP GORUNCONFIG DONTRUNCONFIG EQU * INC PARTQUANT ;add one for m'board RTS ; ;UXRAMPARTNO DFB 0 ; SHOWCONFIG EQU * DISPLAY CONFIGURATION ON SCREEN LDX #0 STX CH LDA #18 JSR TABV STA TABV JSR MSGOUT ASC .Memory for the Shuttle's use:. DFB CR DFB 0 LDX #7 SCFLOOP EQU * LDA SLOTQUANT,X BEQ NOQUANT ;brnch if no ram in slot x JSR SHOWSLOT ;display msg NOQUANT EQU * DEX BPL SCFLOOP RTS ; ; SHOWSLOT EQU * ;show msg about ram in slot x TXA BNE NOTZEROSLOT JSR MSGOUT ASC .Aux Slot . DFB 0 JMP PASTSNUM NOTZEROSLOT EQU * JSR MSGOUT ASC .Slot . DFB 0 TXA ORA #$B0 ;make slot numeris JSR COUT1 JSR MSGOUT ASC . . DFB 0 PASTSNUM EQU * LDA SLOTQUANT,X ;no. of 64k chunks ORA #$B0 ;make numeric JSR COUT1 JSR MSGOUT ASC . x 64k Ram. DFB 0 LDA #CR JSR COUT1 RTS ; SLOTQUANT DFB 0,0,0,0,0,0,0,0 FIN ; ;LST OFF ; SWAPK EQU * LDA #2 ;COPY 2 PAGES LDX #PRCMSG JSR PRMENU2 RTS PRCMSG DW PRCTEXT DW PRCVERTS PRCTEXT EQU * ASC .(press to reconfigure the disk). DFB 0 ; PRCVERTS DFB 16,$FF ; INITMOUSE1 EQU * ;is there a mouse? JSR ISMOUSE ;returns Cn in accum, n is slot ;returns 0 if no mouse STA MOUSECN1 STA MOUSECN2 STA MOUSECN3 PHA AND #$0F ;0N where n is slot CLC ADC #$F8 ; STA MOUSEMODEHOLE ;e.g 07FC for slot 4 PLA ASL ASL ASL ASL STA MOUSEN0 ;$40 for slot 4, etc. BNE MOUSEOK LDA #RTS ;op code STA DOMOUSEFIRM ;clobber the only routines that call the mouse firmware MOUSEOK EQU * LDY #INITMS ;'initmouse' entry point in table JSR DOMOUSEFIRM ;initialize mouse to default values RTS ; ISMOUSE EQU * ;look for mouse card LDA #0 STA PAGE0TEMP1 LDX #$C7 ISMLOOP EQU * STX PAGE0TEMP2 JSR CHECKASLOT BCC FOUNDMOUSE LDX PAGE0TEMP2 DEX CPX #$C0 BNE ISMLOOP LDA #0 ;NO CARD FOUND RTS ; FOUNDMOUSE LDA PAGE0TEMP2 ;GET Cn RTS ; ; CHECKASLOT EQU * ;mouse in current slot? LDX #VALLIST-DISPLIST-1 NEXTVAL EQU * LDY DISPLIST,X ;displacement into card ROM LDA (PAGE0TEMP1),Y ;get next id byte CMP VALLIST,X ;and cmp it to expected id value BNE NOTTHISSLOT DEX BPL NEXTVAL ;chk next id byte ;found them all! CLC RTS NOTTHISSLOT EQU * SEC RTS DISPLIST DFB $05,$07,$0B,$0C,$FB VALLIST DFB $38,$18,$01,$20,$D6 SBTL .SWAP 1 PAGE. *********************************** ; DO UNIDISK COPY1PAGE EQU * PHA LDA #$40 PHA PLP ;overflow on, carry off PLA BVS PASTENTRY2 FIN ; ********************************** ; DO APPLE2E SWAPAUXZP1 EQU * ; ;SWAP A PAGE IN AUXZP RAM WITH ANY PAGE IN MAIN 64K (EXCEPT THE STACK) ;ON ENTRY: A=MAIN PAGE NO, Y= AUX PAGE NO ; SEC DFB BITZ ;op code for bit (zero-page) ; FIN ; ********************************** ; SWAP1PAGE EQU * ;SWAP ANY 2 PAGES IN MAIN 64K (EXCEPT THE STACK) ;ON ENTRYBDEF: PAGE NOS IN A AND Y REGS ; DO APPLE2E CLC FIN ; ********************************** ; ;BODY OF ROUTINE WITH ABOVE 2 ENTRY POINTS ; PASTENTRY2 EQU * STA MAINCOUNTER1+2 STA MAINCOUNTER2+2 STY AUXCOUNTER1+2 STY AUXCOUNTER2+2 STY AUXCOUNTER3+2 ; LDY #0 ;LOOP COUNTER DO APPLE2E BCC NOAUX1 STA SWAUXZP+1 ;TURN ON AUX NOAUX1 EQU * FIN ; AUXSWAPLOOP EQU * AUXCOUNTER1 LDA $1000,Y AUXCOUNTER2 CMP $1000,Y ;READ IT TWICE BNE BADREAD ;THE SAME WAY DO APPLE2E STA SWAUXZP ;TURN OFF AUX MEM FIN MAINCOUNTER1 LDX $1000,Y MAINCOUNTER2 STA $1000,Y DO APPLE2E BCC NOAUX2 STA SWAUXZP+1 ;TURN ON AUX MEM NOAUX2 EQU * FIN ; DO UNIDISK BVS COPYONLY FIN TXA AUXCOUNTER3 STA $1000,Y COPYONLY EQU * ; DEY BNE AUXSWAPLOOP DO APPLE2E STA SWAUXZP ;TURN OFF AUX FIN RTS ; ;RPT 40 ; BADREAD EQU * BIT $C030 DO 0 INC ERRORCOUNT FIN JMP AUXCOUNTER1 ;CLICK THEN TRY AGAIN! ; DO 0 ERRORCOUNT DFB 0 ; RAMERROR EQU * LDX #23 ;vert position LDY #13 ;horz position JSR MSGOUT1 MSB OFF ;inverse ASC .RAMCARD ERROR!. MSB ON DFB 0 JSR BEEP JSR PAUSE JSR PAUSE RTS ; FIN SBTL .HIGHEST-LEVEL ROUTINE IN SNAPSHOT. ; ; MAINLINE ALWAYS RECEIVES CONTROL SHORTLY AFTER AN INTERRUPT, ; AFTER THE NMIHANDLER1, 2, AND 3 ROUTINES HAVE ; DONE THE INITIAL TIME-AND-SPACE-CRITICAL ; SAVING OF REGISTERS AND SWAPPING OF SNAPSHOT FROM THE CARD ; TO THE MOTHERBOARD. ; MAINLINE THEN ; SAVES THE SOFT SWITCHES AND BANK SWITCHES, ; DISPLAYS THE MENU, AND RUNS A SMALL MENU-DRIVEN LOOP. ; SKP 2 * ; ; ; ; ; MAINLINE EQU * * * * CLD * JSR CHIME JSR ISRCARDON ;RAM.CARD.ON? LDA ROMENABLE ;TGIJKLMNOURN.OFF.RAMCARD ; ; JSR ISITA2E ;IF.A.2E BNE NOT2E ;THEN JSR GETSOFT ;GET.VALS.OF.2E.SOFT.SWITCHES STA SOFT ;SAVE.VALS.TO.RESTORE.UPON.RESUME DO SHELL+SHUTTLE2E+COPYKIT2E JSR SET80CONFIG2E ;set CONFIGUR's 80-col bit to match SOFT. ELSE JSR SET80CONFIG FIN JMP PASTSOFT NOT2E EQU * ;ELSE ; ; ; ; * * ; ; LDA #0 ;GET.VALS.THAT.WILL.WORK.IF.BACKUP.IS.RUN.ON.A.2E STA FFEXSTOW JSR TEXTDEFAULT ;IF SOFT NOT ALREADY SET, SET TO DEFAULT PASTSOFT EQU * ;ENDIF JSR SWAPTEXT ;swap text page 1 to safety; does a resetsoft first ; * * *SEE WHICH SLOT OWNS ACTIVE C800 ROM, SAVE RESULT IN 'SLOTROM' JSR GETSLOTROM ; * * DO SHELL ELSE ;SHELL DOESNT SUPPORT 80COL JSR SHOW40 ;TURN OFF 80-COL CD FIN ; * LDA RCARDOFF ;TURN.IT.OFF ; LDA MACHINID AND #MOUSEBIT ;is there a mouse? BEQ NOTC400 ;if not, nmi didnt interrupt mouse firmware LDA RHSTOW ;resume addr hi CMP MOUSECN1 nmi'd in mouse firmware? BNE NOTC400 JMP RESUME NOTC400 EQU * JSR ISMOUSEON ;check whether mouse is issuing interrupts ;and if so set Configur to show it. STA CONFIGUR ; LDA #0 LDY #SETMS ;index of 'setmouse' routine JSR DOMOUSEFIRM ;turn off mouse LDY #SERVEMS ;clear any pending irq from mouse ; (may have arisen since nmi was issued) JSR DOMOUSEFIRM ; ; INITMENU EQU * JSR INITAPPLE ;INIT.SCREEN,KBD,ETC. ; ; ; ; ; ; ;SSSLOT DFB 0 ;SLOT10 DFB 0 ; ; SKP 1 MENU EQU * ;DISPLAY MENU JSR RESETSOFT ;SET TEXT MODE JSR HOME ; DO SHELL JSR JUSERPGM ;GO TO USER PGM JMP RESUME FIN ; ; DO COPYKIT LDA AUTOBOOTFLAG BNE LOADRESUME ;IF.IT'S.AN.AUTOBOOT(BACKUP),LOAD.AND.RESUME.IT FIN ; DO SHUTTLE JSR MASKRESUME ;IF NO PGM IN WORKSPACE, DISABLE 'RESUME' OPTION & 'CLEAR' OPTION AND ERASE NAME. FIN JSR SHOWSCRN ;SHOW MENU DO COPYKIT+SHUTTLE JSR GETSR.A ;GET ADDR OF SUBROUTINE TO BE CALLED PHA JSR SHOWMENU ;OVERWRITE MENU, LEAVING EDGES OF CURSOR BAR. PLA JSR 0 ;CALL SUBROUTINE SRVECTOR EQU *-2 ;FILL IN SR ADDR JMP MENU SKP 1 ; FIN ; DO COPYKIT LOADRESUME EQU * *...INVOKED.FROM.WITHIN.MAINLINE...DOES.LGO48.REQUIRE.THIS.2B.HERE? LDA #0 STA AUTOBOOTFLAG JSR LOADAUTO JSR RESUME AUTOBOOTFLAG DFB 0 ; FIN ; DO COPYKIT+SHUTTLE SHOWMENU EQU * ;SET POINTERS TO MENU TEXT LDX #MENUPARMS JSR PRMENU2 RTS SKP 1 ; FIN ; ; ; CHIME EQU * LDY #$40 TONE DURATION CHILOOP EQU * TYA JSR TOGGLE EOR #$FF JSR TOGGLE DEY BNE CHILOOP RTS ; TOGGLE EQU * TAX TOGLOOP EQU * NOP DEX BNE TOGLOOP BIT $C030 RTS ; ; INITAPPLE EQU * ;INIT.SCREEN,KBD JSR SETNORM ;SET SCREEN SWTCHS JSR INIT ;INIT KEYBD/SCREEN JSR SETVID JSR HOME ;CLEAR SCREEN,HOME.CURSOR JSR SETKBD ; RTS ; ; ; DO SHUTTLE MASKRESUME EQU * JSR GETCURPARTNO ;IS THERE A PGM? BMI NOMASK ;BCH IF SO JSR CLEARNAME JSR CLOSEAWS ;clear status and free partitions LDA #0 TAX BEQ SETMASK NOMASK EQU * LDA #VINT ;vert spacing FIN DO SHUTTLE2E LDX #2 ELSE LDX #3 ;SAVEDX VALUE FOR 'RESUME' LINE FIN DO SHUTTLE SETMASK EQU * STX SAVEDX STA RESUMEVERT STA CLEARVERT RTS ; FIN ; SHOWSCRN EQU * JSR HOME DO SHUTTLE JSR SHOWPROGNO JSR SHOWNAMES JSR SHOWDASHES FIN ; DO COPYKIT+SHUTTLE JSR SHOWMENU RTS FIN ; ; **IF OBSOLETE BIT SET IN FFEXSTOW **INDICATING //E C800 INTERNAL ROM **ENABLED, THEN SET SLOTROM TO ENA- **BLE IT AT RESUME TIME. ; OLDC800BIT EQU * LDA FFEXSTOW AND #C800ENABIT ;BIT ON? BEQ NOC8 ;BNCH IF NOT LDA #3 STA SLOTROM NOC8 EQU * ; RTS EXITIFESCRm+NMIHANDLER2T+NMIHANDLER1cyu+NMIHANDLER3gr SET40COLnU+CODEINSTACKpC+GETESCARRETtgSETPGMSIZEvB,FINDRPTDAREAxGtCHOICEMSG|^n)VSUPRTERM~!VSUPRTERM.0^s'V80DUMP~EXITIFESC EQU * CMP #ESCAPE ;ESCAPE.KEY? BEQ GORESET RTS GORESET EQU * JMP (RESET) ;JMP.VIA.RESET.VECTOR SBTL .PAGE 0 OF SS RAM. * *** This is the second routine in the interrupt-handling * sequence, and the next to last in the subject-program-resuming * sequence. ; ********************************************************************* **************** OVERVIEW OF MODULE STRUCTURE *********************** ********************************************************************* ; ;Equates ;Savearea ; ;Entry from Nmihandler1 ;Save regs and switches ;Swapself ;Button released? ;Jsr SWAPHAN3 ;at endSUVWXYZ[\]^_`a of swaphan3 exit to nmihandler3 ; ;above executes at nmi time; below executes at resume time ; ;Reenter2 equ * ;entry from nmihandler3 ;SWAPHAN3 ;JSR SWAPSELF ;restore status reg and repair damage to stack ;set soft switches RAMRD etc. ;go to nmihandler1 ; ********************************************************************** ********************************************************************** * ORG $A800 * * * DRIVER EQU * ; SAVEAREA EQU * DFB 0 ;FIXED ADDR FOR PASSING INFO TO OVERLAYS DFB 0 DFB 0 DFB 0 DFB 0 FLAGSP0 EQU * ;START OF FLAGAREA USED BY SHUTTLE MISC80COL DFB 0 ;misc II+ card param ;not used by shell CURSADRL DFB 0 ;80col card cursor ;not used by shell CURSADRH DFB 0 ;80col card cursor ;not used by shell DO SHELL LST ON FIN STACKPTR DFB 0 ;Stack register of subj pgm CONFIGUR DFB 0 ;not used by shell (hardware reqs of copykit backup) BOOTSOFT DFB HIMIXED1 ;not used by shell SLOTROM DFB 0 ;number of slot with enabled C800 ROM FFEXSTOW DFB 0 ;state of subj pgm's bank-switches (//e only) RPTDAREA EQU * ;not used by shell MTAREA DFB 0 ;not used by shell MEMSTATUS DFB 0 ;status of 'language-card' bank switches SOFT DFB 04 ;status of video screen soft switches ASTOW DFB 0 ;subj pgm's accumulator at interrupt XSTOW DFB 0 ;subj pgm's x-register YSTOW DFB 0 ;subj pgm's y-register RHSTOW DFB 0 ;addr at which interrupt occurred (hi-order) RLSTOW DFB 0 ;addr at which interrupt occurred (lo-order) STATSTOW DFB 0 ;subj pgm's status register DO SHELL LST OFF FIN * SAVEAREAEND EQU * SAVESIZE EQU SAVEAREAEND-SAVEAREA ; FLAGSP0END EQU * FLAGSP0LEN EQU *-FLAGSP0 DO 0 ;DIFFERENT FOR EACH PGM SAVEDX DFB 0 SAVEVCURSOR DFB 0 ELSE P0TEMP3 DFB 0 P0TEMP4 DFB 0 ;necc to keep the a83e org in place FIN ; * **************************END OF PARAMETER SAVE AREA*************** ; NMIHANDLER2 EQU * ; STA ASTOW RAMVECA EQU *-1 STX XSTOW RAMVECX EQU *-1 STY YSTOW RAMVECY EQU *-1 ; ROR A ;capture carry bit ROL RAMRD ;Aux RAM readable? ROR A ROL RAMWRT ;Aux RAM writeable? ROR A ROL SLOT3ENABLE ;Slot 3 internal ROM? ROR A DO 0 ;PROBABLY UNNECC? LDX C8IDADDR ;get byte from c800 ROM CPX #C8IDVAL ;if it's what it shd be (same w new ROMS?????) SEC BEQ NOTC8ROM FIN ; NOTC8ROM EQU * LSR A ; save a bit for the C800 state ROL AUXZP ;aux zeropage/stack enabled? ROR A LSR A LSR A ;2 left bits are zero STA FFEXSTOW ;save state of bank-switches RAMVEC98 EQU *-1 ; *FIX.MEM.SOFT.SWITCHES * X2EONLY1 EQU * ;2E ONLY:TURN OFF AUX STA SWRAMRD ;READ.MAIN.MEM X2EONLY2 EQU * ;2E ONLY: TURN OFF AUX STA SWRAMWRT ;WRITE.MAIN.MEM * * ******************************** *2+.VECTOR.MUST.RESIDE.AT.$CN3E ******************************** IFNE $A83E-* FAIL 3,.2+ VECTOR NOT AT CN3E. FIN RAMVEC3 DW COMEIN ;FFFX.VEC.FOR.A2+.MODE ; * ; * * *COPY P0 TO DRIVER AREA (MUST PRECEDE ALL UNRELOCATED ADDRS) SEC ; ****************************** ********SUBROUTINE************ ****************************** * * *SWAP.THIS.PAGE.AND.CONTINUE SWAPSELF EQU * LDA #0 ;SW.TO.PAGE.0 DEVVEC3 STA $C000 ; * LDY #>SWAPCONT ;SWAP.EVERYTHING.BELOW.SWAPCONT SWLOOPX EQU * LDA ZERO,Y RAMVEC4 EQU *-2 TAX LDA DRIVER,Y STA ZERO,Y RAMVEC5 EQU *-2 TXA STA DRIVER,Y INY BNE SWLOOPX * *JMP.TO.DEST BCC JMPSS JMP SWAPCONT JMPSS JMP >SWAPCONT RAMVEC6 EQU *-2 * SWAPCONT EQU * LDY #>SWAPCONT ;SWAP.EVERYTHING.ABOVE.SWAPCONT * SWLOOP2 EQU * DEY LDA ZERO,Y RAMVEC7 EQU *-2 TAX LDA DRIVER,Y STA ZERO,Y RAMVEC8 EQU *-2 TXA STA DRIVER,Y TYA BNE SWLOOP2 * BCC CONTINUE2 ; ELSE DROP THRU * ********************************* *********END SUBROUTINE********** ********************************* * REP 40 * *...HAS.BUTTON.BEEN.RELEASED? ;...IF.DIFF.PAGES.ARE.ACCESSIBLE.THEN.BUTTON.IS.RELEASED ;...FIND.DISTINCT.PAGES.1600.TIMES ; LDX #$15 ;OUTER.LOOP.COUNTER.AND.SS.PAGE.SELECTOR ;P0TEMP1.IS.INNER.LOOP.COUNTER...CAN.START.WITH.ANY.VALUE ;Y.CAN.START.WITH.ANY.VALUE BUTLOOP EQU * INY * LDA #$16 ;SEE.SS.RAM.PAGE.CONTAINING.TOP.OF.RWTS DEVVEC4 STA DEVROOT ; LDA ZERO,Y ;GET.RANDOM.BYTE.FROM.IT RAMVEC41 EQU *-2 DEVVEC5 STX DEVROOT ;ANY.OTHER.PAGE ; CMP ZERO,Y ;CMP.TO.CORRESP.BYTE.ON.OTHER.PAGE RAMVEC42 EQU *-2 BEQ BUTLOOP ;IF.THEY.ARE.THE.SAME,SUSPECT.BUTTON.IS.STILL.FORCING.PAGE.0.ACTIVE INC P0TEMP1 ;ELSE.INC.NUMBER.OF.TIMES.2.DIFF.PAGES.WERE.FOUND BNE BUTLOOP DEX ;OUTER.LOOP.COUNTER BNE BUTLOOP ;TO.PAGE.0 ; ******END OF ROUTINE TO DEBOUNCE PUSHBUTTON * * * ; * *Pull from stack the 3 bytes pushed onto it by the NMI, PLA STA STATSTOW PLA STA RLSTOW PLA STA RHSTOW ;TSX ;STX STACKPTR ; ; ; * * * SEC ;SHOWS THAT THIS AN NMI SEQUENCE ; * * ******************************************************* * ENTRY POINT DURING 'RESUME SUBJECT PGM' SEQUENCE. * NMIHANDLER3 JUMPS TO HERE. THE CARRY MUST BE CLEARED * BY NMIHANDLER3, TO DISTINGUISH THIS FROM A NMI * SEQUENCE FALLING THRU FROM ABOVE. ******************************************************* ***ENTRANCE FROM NMIHANDLER3 REENTRY2 EQU * ; ; ****************************** ********SUBROUTINE************ ****************************** ; ;copy nmihandler3 btw ssram and a900 (fall thru routine) SWAPHAN3 EQU * LDA #HAN3SSRAMPG STA $C0D0 ;set ssram to page stash of nmihandler3 DEVVEC171 EQU *-2 LDX #0 NHCLOOP EQU * LDA NMIHANDLER3,X LDY $C500,X RAMVEC180 EQU *-1 STA $C500,X RAMVEC182 EQU *-1 TYA STA NMIHANDLER3,X DEX BNE NHCLOOP ; ****************************** ****END SWAPHAN3 SUBROUTINE*** ****************************** ; *************************************************** *IF THIS IS AN NMI SEQUENCE, EXIT TO NMIHANDLER3. BCS NMIHANDLER3 *************************************************** * ;(falls thru if carry clear, i.e. during RESUME sequence.) * *COPY P0 BACK TO SSRAM * BCC SWAPSELF ;always ; *CONTINUATION.OF.RESUME.ROUTINE * CONTINUE2 EQU * * ; ;RESTORE.STATUS.REG LDX STACKPTR RAMVEC276 EQU *-1 TXS LDY $0100,X ;temp save byte below stack LDA STATSTOW RAMVEC288 EQU *-1 ORA #IRQFLAG ;turn on irq mask, so mouse doesnt int this sequence PHA ;restore status byte PLP TYA ;and restore STA $0100,X ;the byte below stack. ; * X2EONLY4 EQU * ;SET MAIN 64K OR AUX 64K STA SWRAMRD ENDISRAMRD EQU *-2 X2EONLY3 EQU * STA SWRAMWRT ENDISRAMWRT EQU *-2 * * *TURN.OFF.CARD.PENDING.NEXT.STACK.PUSH LDA #$20 NOTURNOFF EQU *-1 DEVVEC40 STA $C000 ; ;SET.REGS.AND.RESUME.SUBJECT.PGM LDA ASTOW RAMVEC302 EQU *-1 GOTOGOOUT JMP GOOUT-DRIVER+$FF00 * * P0TEMP1 DFB 0 P0TEMP2 DFB 0 * * SBTL .NMIhandler1. * This is the first bit of code executed when an NMI occurs. * The second half is the last bit executed when Snapshot returns * control to a subject program. * On the 2+, it lives at CNE0-CNFF in Snapshot's RAM. On the //e * it is first visible at FFE0-FFFF: The code has to be executed * in that address space so that it can tell the //e to enable * slot memory instead of internal ROM from C100-CFFF. On the * return trip, it lives there so it can tell the //e to turn off * the slobdet memory space (if necc.) * ; IFGT *-$A8E0 ;RETROGRADE ORG? FAIL 3,.TOO MUCH CODE BEFORE A8E0. FIN ; ; ORG DRIVER+$E0 ; COMEIN EQU * NOP ;SPARE BYTE X2EONLY5 EQU * ROL SLOTSDISABL ;MINUS.IF.SLOTS OFF : sets carry X2EONLY6 EQU * STA SWSLOTSDISABL ;SET.SLOTS ON JMP NMIHANDLER2 RAMVEC10 EQU *-2 * **************************** * *ABOVE.IS.VERY.FIRST.CODE.AFTER *NMI.....BELOW.IS.VERY.LAST.CODE *BEFORE.RESUMING.SUBJECT.PROGRAM * **************************** * GOOUT EQU * LDX XSTOW RAMVECXX EQU *-1 LDY YSTOW RAMVECYY EQU *-1 INC INCOPERAND ;SET.N,Z.FLAGS RAMVECFFEX EQU *-2 X2EONLY7 EQU * STA SWSLOTSDISABL ENDISABLEADDR EQU *-2 ;SOFT.SW JMP $100 RESUMEADDR EQU *-2 ; * INCOPERAND DFB 0 ;WHEN.THIS.VALUE.IS.INC-ED,N.Z.FLAGS.ARE.RESTORED.TO.VALUES.BEFORE.NMI ; ***VECTORS.AT.FFFA-FFFF * ORG DRIVER+$FA DW COMEIN-DRIVER+$FF00 ;to FFE0 (COMEIN) DW $FA62 RESET DW $FA40 * SBTL .STAGE 3 OF INTERRUPT HANDLING. ; NMIHANDLER3 EQU * * DO 0 *Pull from stack the 3 bytes pushed onto it by the NMI, PLA STA STATSTOW PLA STA RLSTOW PLA STA RHSTOW FIN ; TSX STX STACKPTR ; ; *Repair 3 bytes of stack damaged by NMI. ; Copy corresp 3 bytes of stack follower to stack. ; Note that this must use the actual stack (whether main or aux) ; that the subj pgm was using at interrupt. ; LDA #01 STA $C0D0 ;SWITCH SSRAM TO STACK FOLLOWER DEVVEC112 EQU *-2 LDY #3 DAMAGELOOP EQU * TSXfhijklm LDA $C500,X RAMVEC119 EQU *-1 PHA DEY BNE DAMAGELOOP ; ; STA SWAUXZP ;switch off aux zerpage/stack ; if it was on. ; *Copy main stack to stack follower for safekeeping. ; Note that this must sav main stack only, since Snapshot ; code uses main stack and would damage it. ; It doesn't matter whether subj pgm was using main stack or ; aux stack. LDX #0 COPYSTACKLOOP EQU * LDA $0100,X STA $C500,X ;copy main stack to ssram RAMVEC12 EQU *-1 DEX BNE COPYSTACKLOOP ; LDA VIDEXSTART ;Loc of start of videx screen within videx ram STA MISC80COL ; JSR SWAP1ST4 ;pages btw snapshot ram and subj pgm ; JSR SWAPTOP16 ;SWAP AA00-BFFF TO SSRAM ; JMP MAINLINE ; ; ********************************************************* ********************************************************* ; *RE-ENTRY ON WAY BACK TO SUBJECT PROGRAM. REENTRY3X EQU * JSR SWAPTOP16 *** DO NOT USE AA00-BFFF AFTER THIS POINT ; ;Copy subj pgm's main stack back into place LDA #1 STA $C0D0 ;set ssram to page 1 DEVVEC51 EQU *-2 LDX #0 COPYSTCKLOOP2 EQU * LDA $C500,X RAMVEC45 EQU *-1 STA $0100,X DEX BNE COPYSTCKLOOP2 ; STA SWAUXZP ;Turn on or off aux zp/stack ENDISAUXZP EQU *-2 * * * ;FINAL EXIT TO SUBJECT PGM MUST BE BY A JMP. ; WHICH MUST RESIDE EITHER IN SNAPSHOT RAM OR IN STACK. ; DO CODEINSTACK ; ***COPY THE JUMP-TO-SUBJECT-PGM * ROUTINE TO THE STACK * LDA RLSTOW STA LASTINSTR+1 LDA RHSTOW ;POINT BIT OF CODE TO SUBJ PGM STA LASTINSTR+2 ; LDA STACKPTR SEC SBC #$10 ;GO 10 BELOW STACK BCS SPOK ;BRCH IF SUBTRACT OK LDA #$F0 ;ELSE WE'VE HIT BOTTOM OF PAGE 1, SO WRAPAROUND. SPOK EQU * TAY STA STACKCODE+1 ;INSTR MUST POINT TO SELF ; STA RESUMEADDR ;END OF 'RESUME' MUST POINT TO BIT OF CODE IN STACK LDX #0 ;COPY BIT OF CODE TO STACK GETGETSTK LDA STACKCODE,X STA STACK,Y INY INX CPX #STACKCODEEND-STACKCODE ;LENGTH OF BIT OF CODE BNE GETGETSTK * ; ELSE LDA RLSTOW STA RESUMEADDR ;PSEUDO-RTI LDA RHSTOW STA RESUMEADDR+1 ; FIN ; ; BIT $C0E0 ;slow down accelerator for .5 sec CLC ;MUST BE DONE BEFORE ENTERING NMIHANDLER2 JMP REENTRY2 * * *************************************************************** * ;(Swap subj pgm's bottom 8 pgs with snapshot's, skipping stack.) SWAP1ST8 EQU * JSR SWAPTEXTX ;swap pp. 4-7 (uses routine in top 16 pp.) SWAP1ST4 EQU * LDX #0 LDY #$18 ;PAGE 0 STASHED HERE IN SSRAM LDA #1 ;ONE PAGE ONLYY JSR SWAP2EX LDX #2 ;START WITH PAGE 2 LDY #$1A ;PAGE 2 STASHED HERE IN SSRAM LDA #2 ;DO TWO PAGES (2-3) JSR SWAP2EX RTS ; SWAPTOP16 EQU * ;(swap aa00-bfff btw driver and ssram) LDX #$AA LDY #$02 ;PG 2 OF SS RAM LDA #$16 ;NO OF PAGES JSR SWAP2EX RTS ****** *THIS BIT OF CODE GETS COPIED INTO THE SUBJECT PGMS STACK STACKCODE EQU * STA $100 ;DO A STORE TO PG 1 TO TURN OFF FAR LED (AND INCIDENTALLY CLOBBER THIS OPCODE) CLRIRQ CLI ;set/clr irq mask flag LASTINSTR JMP $0000 ;LAST INSTR BEFORE SUBJ PGM RESUMES CONTROL STACKCODEEND EQU * * LDA #ESCAPE JSR COUT1 LDA #FOUR JSR COUT1 ;DEACTIVATE 80-COL (WHAT EFFECT ON 2+)? LDA #CTRLQ JSR COUT LDA #CTRLU JSR COUT ;LDA #0 ;JSR OUTPORT PREPRESUM EQU * ;FINAL EXIT TO SUBJECT PGM MUST BE BY A JMP. ; WHICH MUST RESIDE EITHER IN SNAPSHOT RAM OR IN STACK. ; DO CODEINSTACK ; ***COPY THE JUMP-TO-SUBJECT-PGM * ROUTINE TO THE STACK * LDA RLSTOW STA LASTINSTR+1 LDA RHSTOW ;POINT BIT OF CODE TO SUBJ PGM STA LASTINSTR+2 ; TXA ;STACK POINTER SEC SBC #$10 ;GO 10 BELOW STACK BCS SPOK ;BRCH IF SUBTRACT OK LDA #$F0 ;ELSE WE'VE HIT BOTTOM OF PAGE 1, SO WRAPAROUND. SPOK EQU * TAY STA STACKCODE+1 ;INSTR MUST POINT TO SELF ; oqrSTA RESUMEADDR ;END OF 'RESUME' MUST POINT TO BIT OF CODE IN STACK LDA #1 ;SWITCH SSRAM TO STACK FOLLOWER STA $C0D0 DEVVEC159 EQU *-2 LDX #0 ;COPY BIT OF CODE TO STACK GETGETSTK LDA STACKCODE,X PUTGETSTK STA $C500,Y RAMVEC161 EQU *-1 INY INX CPX #STACKCODEEND-STACKCODE ;LENGTH OF BIT OF CODE BNE GETGETSTK RTS ****** *THIS BIT OF CODE GETS COPIED INTO THE SUBJECT PGMS STACK STACKCODE EQU * STA $100 ;DO A STORE TO PG 1 TO TURN OFF FAR LED (AND INCIDENTALLY CLOBBER THIS OPCODE) LASTINSTR JMP $0000 ;LAST INSTR BEFORE SUBJ PGM RESUMES CONTROL STACKCODEEND EQU * * ; ELSE LDA RLSTOW STA RESUMEADDR ;PSEUDO-RTI LDA RHSTOW STA RESUMEADDR+1 RTS ; FIN ; GETESCARRRET2 EQU * *WAIT FOR.KEYPRESS.;RETURN.0.IF.RET,-1.IF.LEFT.ARROW.,+1.IF.RT.ARROW,2.IF.ESC *DONT ACCEPT ANY OTHER KEY *USES A AND Y JSR GETESCARRRET3 ;GET A KEY BCS GETESCARRRET2 ;RPT IF NOT ON LIST RTS ; ; GETESCARRRET3 EQU * ;IF KEY NOT ON LIST, SEC AND LEAVE KEY IN ACCUM JSR GETAKEY LDY #LISTLEN-1 GLOOP EQU * CMP KEYLIST,Y ;IS KEY ON LIST? BEQ GOTIT ;BRCH IF SO DEY BPL GLOOP CMP #CTRLY ;$99 BNE NOTYY JMP MON ;IF CTRL-Y, GOTO MONITOR NOTYY EQU * SEC RTS GOTIT EQU * CLC LDA CODELISsuT,Y ;GET CORRESPONDING.CODE RTS * KEYLIST EQU * DFB LARROW,RETURN,RARROW,ESCAPE,UPARROW,DNARROW CODELIST EQU * DFB $FF,0,1,ESCAPE,$FF,1 LISTLEN EQU *-CODELIST * SBTL .SETPGMSIZE - SET PROGRAM SIZE. SETPGMSIZE EQU * JSR WILLMSG JSR MSGOUT DFB CR ASC . 1) 64K. DFB CR ASC . 2) 128K. DFB CR DFB 0 JSR CHOICEMSG ;'YOUR CHOICE' GET1OR2 EQU * JSR GETSLOT1 ;GET NUMBER CMP #3 ;is it >=3 ? BCS GET1OR2 ROR A ;SEC=64K DO COPYKIT LDA CONFIGUR ;get hardware needed by backup AND #$FF-BITAUXMEM ;turn off 128k bit BCS JUST64K ;bnch if 64k selected ORA #BITAUXMEM ;else specify '128k' JUST64K EQU * STA CONFIGUR FIN RTS SBTL .FIND UNUSED AREA. ; ***INPUT: ACCUM CONTAINS A NUMBER 'N' ***OUTPUT: RPTDAREA CONTAINS INDEX OF LAST PAGE OF A N-PAGE BLOCK OF REPEATED PAGES. *(NOTE THAT INDEX IS A COUNT MADE BY GETNEXTMBPAGE.) *(LAST PAGE IS GENERALLY LOWEST-ADDRESS PAGE.) * ***OUTPUT (COPYKIT): PAGE ADDR OF LAST/LOWEST PAGE *=** ; ; ; FINDRPTDAREA EQU * STA RPTDAREALEN ;NO OF PAGES NEEDED STA RPTDPAGECTR JSR GETSCANTBL ;PTRS TO 64K (OPTIMIZED FOR SCANNING) JSR GET1STMBPAGE ;POINT TO 1ST RAM PAGE JSR COPYTOSwyz{TASH2 COPY 1ST PAGE TO BUFFER JSR GETNEXTMBPAGE ;POINT TO NEXT PAGE RPTDLOOP EQU * JSR ISPAGERPTD BNE NOTRPTD DEC RPTDPAGECTR BEQ RPTDFOUND ;IF SO EXIT BNE ANOTHER ;ELSE KEEP COUNTING ; NOTRPTD EQU * JSR COPYTOSTASH2 ;copy current pg to buffer LDA RPTDAREALEN ;START COUNTING AGAIN STA RPTDPAGECTR ANOTHER EQU * JSR GETNEXTMBPAGE ;GET ANOTHER PAGE BCC RPTDLOOP ;UNTIL PAGES EXHAUSTED ;DROP OUT OF LOOP IF NO SERIES FOUND RPTDFOUND EQU * LDA PAGEINDEX ;ZERO IF NO SERIES FOUND DO COPYKIT ;convert index no to page no BEQ NORFOUND ;bnch if no series found CMP #$C0 ;MAXIMUM INDEX ALLOWED + 1 BCC INRANGE ;BNCH IF A<= MAX ALLOWED NORFOUND EQU * LDA #DEFAULTAREA STA REALPAGE INRANGE EQU * LDA REALPAGE FIN STA RPTDAREA JSR RESETACCESS ;UNDO BANK-SWITCHING RTS ; ; ISPAGERPTD EQU * ;RETURN '=' IF PAGE IS IDENTICAL TO PRECEDING PAGE JSR SETRAMPTR RPTLOOP EQU * LDA (RAMPTR),Y CMP STASH2,Y ;each byte same as page in buffer? BNE ENDRPTDLOOP ;BNCH IF ONE NON-ZERO BYTE FOUND IN A PAGE DEY BNE RPTLOOP ENDRPTDLOOP EQU * RTS ; ; SETRAMPTR EQU * LDA BUFFADDR+1 STA RAMPTR+1 LDY #0 TYA STA RAMPTR RTS ; COPYTOSTASH2 EQU * JSR SETRAMPTR CTNBLOOP EQU * LDA (RAMPTR),Y STA STASH2,Y DEY BNE CTNBLOOP EQU * RTS COPYFROMSTASH2 EQU * JSR SETRAMPTR CFNBLOOP EQU * LDA STASH2,Y STA (RAMPTR),Y DEY BNE CFNBLOOP EQU * RTS CHOICEMSG EQU * JSR MSGOUT DFB CR ASC .Your choice? (1 or 2). DFB CURSOR DFB 0 RTS ; * * SUP'RTERM SUPPORT - AS YET UNTESTED * INCLUDE /S/COMMON/EQUATES * ORG $0300 ; ID80COL DFB IDSUPRTERM+BIT80COL ;SIGNIFIES SUPRTERM ; SHOW40 STA $C058 ;JUST IN CASE ANYONE HAS VIDEX SOFT SWITCH RTS SHOW80 STA $C059 RTS ; LEN80COL DFB 8 ;8 PAGES OF VIDEO RAM TOTAL * * **** ON ENTRY, A=PAGE TO BE XFERRED, SEC=STORE TO CARD, CLC=READ CARD. **** and Y = main RAM i/o page. ; DOAPAGE PHP ;SAVE FLAGS FOR LATER STY BUFFADDR2+2 STY BUFFADDR+2 BIT $CFFF BIT $C0B4 ;SELECT VIDEO RAM, SLOT 3 CLC ADC} #$C8 ;COS VIDEO RAM STARTS AT $C800 STA VEC+2 STA VEC2+2 PLP BCC GETAPAGE PUTAPAGE CMP #$CF ;IS THIS THE FIRST PAGE? BNE SKINIT ;SKIP INIT IF NOT LDX #$C3 ;SET UP LIKE PASCAL INIT CALL ($CN IN X) LDY #$30 ;$N0 IN Y REG BIT $CFFF ;TURN ALL ROMS OFF BIT $C300 ;SLOT 3 ROM ON JSR $C800 ;CALL PASCAL 1.0 INIT ROUTINE BIT $CFFF ;ROMS OFF BIT $C0B4 ;VIDEO RAM ON SKINIT EQU * LDY #$0 ;MAKE SURE THE INDEX IS ZERO AT START BUFFADDR LDA $0100,Y ;addr modified above. VEC STA $C800,Y INY BNE BUFFADDR BIT $CFFF BIT $C300 ;TURN ROM BACK ON BEFORE WE QUIT RTS GETAPAGE EQU * LDY #0 VEC2 LDA $C800,Y BUFFADDR2 STA $0100,Y ;addr modified avove. INY BNE VEC2 BIT $CFFF BIT $C300 ;ROM ON AGAIN RTS ;THEN RETURN * * NOTE: UNFORTUNATELY CANNOT READ CURSOR REGS * ; SHOW80SPR EQU * BIT $CFFF X`Y`S>,,iȍAP()à0,, ,,,,`ș,,` INCLUDE EQUATES ORG $BA00 ************************* * VISION-80 SCREEN DUMP * ************************* VBASL EQU PAGE0TEMP1 ;any 2 spare zp locations VBASH EQU VBASL+1 * assumes COUT has already been set for printer DUMP EQU * JSR CROUT LDA #0 ;start at top line VISLIN PHA ;save current line JSR VBASCALC ;calc base address LDY #0 ;start at left edge NEXTCH JSR GETCH80 ;get char, convert, print INY ;next char to right CPY #$50 ;at right edge yet? BCC NEXTCH ;if not then keep going JSR CROUT ;send a CR,LF PLA ;get line No. from stack CLC ;don't assume state of carry ADC #1 ;down one line CMP #$18 ;until we get to the bottom BCC VISLIN RTS GETCH80 BIT $CFFF ;turn off printer card ROM BIT $C300 ;enable Vision-80 BIT $C0B2 ;bank in video RAM RWAIT LDX $C0B0 ;see if ram ready BPL RWAIT ;if not then wait LDA (VBASL),Y ;get char from screen LDX $C0B0 ;see if RAM still valid BPL RWAIT ;if not then try again BIT $C0B3 ;re-enable ROM AND #$7F ;knock off hi-bit JMP COUT ;give it to the printer VBASCALC LDX #0 STX VBASL LDX #$C8 STX VBASH ;start counting from $C800 CLC ;ready for the add TAX ;to use as a counter BEQ DUNCALC ;if on row 0 VLUP LDA VBASL ADC #$50 ;add 80 for each line STA VBASL LDA VBASH ADC #0 STA VBASH DEX BNE VLUP ;finished yet? DUNCALC RTS Q)VIDEXDUMP~)VSUPRDUMPtPCROUT8tVIDEXDUMP.0_~V80DUMP.0X~VSUPRDUMP.0St&RESUME #RWTSSWITCHES(VERSIONS?ڬ+OLDV2E80COLdêDCTƪ+RWOTS1.10.2ʪ+RWOTS2.10.2'#ʪ INCLUDE EQUATES ORG $BA00 ************************* * VIDEX U80 COLUMN DUMP * ************************* * MISC EQUATES WERE TAKEN CARE OF IN PUTAPAGE etc DEV0 EQU $C0B0 DEV1 EQU $C0B1 DSP0 EQU $CC00 DSP1 EQU $CD00 MISC80COL EQU $A505 ;VIDEX START; SAVED FROM SCRPAD *START EQU $6FB VBASL EQU PAGE0TEMP1 VBASH EQU VBASL+1 ;any 2 spare zp locations DUMP80 EQU * JSR CROUT LDA #0 ;start at top VISLIN PHA ;save line # on stack JSR VBASCALC ;calc 2k hypothetical base address LDX #0 ;start line at left edge NEXTCH TXA PHA ;save horizontal pos on stack JSR GETCH80 ;gt char AND #$7F ;knock off hi bit JSR COUT ;give it to the printer PLA TAX INX ;next char to right CPX #$50 BCC NEXTCH ;until end of line JSR CROUT ;send CR,LF to printer PLA CLC ADC #1 ;next line down CMP #$18 BCC VISLIN ;until we get to the bottom RTS GETCH80 CLC TXA ADC VBASL PHA LDA #0 ADC VBASH PHA ASL AND #$0C TAX LDA DEV0,X ;select bank PLA LSR PLA TAX BCS READ1 LDA DSP0,X RTS READ1 LDA DSP1,X RTS VBASCALC STA PAGE0TEMP3 ;save it somewhere ASL ASL ;*4 ADC PAGE0TEMP3 ;*5 ADC MISC80COL ;(FROM SCRATCHPAD) PHA LSR LSR LSR LSR ;*16 TO GIVE MSB STA VBASH PLA ASL ASL ASL ASL ;/16 TO GIVE LSB STA VBASL RTS INCLUDE EQUATES ORG $BA00 ************************* * SUP'RTERM SCREEN DUMP * ************************* VBASL EQU PAGE0TEMP1 ;any 2 spare zp locations VBASH EQU VBASL+1 * assumes COUT has already been set for printer * also assumes a routine PCROUT to send CR,LF to printer DUMP80 LDA #0 ;start at top line VISLIN PHA ;save current line JSR VBASCALC ;calc base address LDY #0 ;start at left edge NEXTCH JSR GETCH80 ;get char, convert, print INY ;next char to right CPY #$50 ;at right edge yet? BCC NEXTCH ;if not then keep going JSR PCROUT ;send a CR,LF PLA ;get line No. from stack CLC ;don't assume state of carry ADC #1 ;down one line CMP #$18 ;until we get to the bottom BCC VISLIN RTS GETCH80 BIT $CFFF ;turn all roms (& RAM) off BIT $C0B4 ;enable video ram LDA (VBASL),Y ;get char from screen BIT $CFFF ;turn RAM off again AND #$7F ;knock off hi-bit JMP COUT ;give it to the printer VBASCALC LDX #0 STX VBASL LDX #$C8 STX VBASH ;start counting from $C800 CLC ;ready for the add TAX ;to use as a counter BEQ DUNCALC ;if on row 0 VLUP LDA VBASL ADC #$50 ;add 80 for each line STA VBASL LDA VBASH ADC #0 STA VBASH DEX BNE VLUP ;finished yet? DUNCALC RTS INCLUDE PCROUT PCROUT EQU * LDA #CR JSR COUT LDA #LF JSR COUT RTS H GH () hP hi`eHeH ) hJh`` emHJJJJh ` H < P hi`,,,,)LȆiPi`H , P Hhi`,,,)LȆiPi` ` SBTL .RESUME XEQTION OF PGM IN MEMORY. BOOTRESUME EQU * ;ENTRY FROM BOOTADISK ROUTINE JSR SWAP1ST8 ;MOVE USR'S PP 0-8 INTO PLACE JSR INITAPPLE ;INITIALIZE THEM LDA #$FF STA MODE80 ;screenhole showing 40 column mode JSR SWAP1ST8 ;MOVE THEM BACK SEC ;set flag to show called for boot DFB $90 ;thats a BCC opcode ; RESUME CLC ;clear the BOOT flag PHP ;save BOOT flag on stack for now ; DO SHELL ELSE ; STA CLEARKBD ;CLEAR KEYBOARD JSR SETBOOTSOFT ;SET.2E.SOFT.SWITCHES.TO.CONVENIENT.VALUES JSR HOME ;CLEAR SCREEN ; FIN ; * * JSR SETINC ;SET.UP.INC.INSTRUCTION.TO.SET.N,Z FLAGS.IN.STATUS.BYTE JSR FIXGOOUT ;PATCH CODE TO SET BANK SWITCHES JSR FIXIRQFLG ;set CLI or SEI as appropriate JSR FIXROMS ;ENABLE PROPER C800 ROMS ; * - THIS BIT MODIFIED FOR COPYKIT 8.5 , Andy 28/3/85 PLP ;get boot flag back off stack DO SHUTTLE2+COPYKIT2 ;only use it if shuttle or copykit BCS NOACT80 ;if this is a boot then skip ACTIVATE80 JSR ACTIVATE80 ;turn on 80 col if necessary NOACT80 EQU * ;need this inside the DO loop FIN DO SHUTTLE JSR MARKCURINUSE ;MARK IT 'IN USE' FIN ; JSR TEXTDEFAULT ;IF SOFT=0,SOFT:=TEXT JSR CHIME ; JSR SWAPTEXTX ;swap 4-7 (must be done before resetsoft) LDA SOFT JSR SETSOFT ;SET.SOFT.SWITCHES JSR SETDBL ;set double hires if necc. * * * STA SWSLOT3ENABLE ;SET SLOT3 SOFT SWITCH ENDISSLOT3 EQU *-2 ; JSR RESUMEMOUSE JSR SETMEM ;TURN.ON.RAMCARD.IF.NECC JSR SWAP1ST4 ;swap pp 0 and 2-3 JMP REENTRY3X ;TO NMIHANDLER3 * * * * * ; ; * SETMEM EQU * LDA MEMSTATUS TAX AND #$F0 CMP #$80 BNE NOMEMCHANGE HITC0XX LDA $C000,X LDA $C000,X NOMEMCHANGE EQU * RTS ; ; FIXGOOUT EQU * ; ; PATCH.CODE.TO.EN-.OR.DIS-ABLE.SLOTS, INTERNAL ROM, AUXILIARY RAM JSR ISITA2E BNE NO2ESTUFF LDA FFEXSTOW BPL NEWVERSION LDA #01 ;DISABLE SLOTS, ENABLE EVERYTHING ELSE NORMAL. NEWVERSION EQU * LDY #>SWSLOTSDISABL JSR INYNEXTBIT STY ENDISABLEADDR LDY #>SWRAMRD JSR INYNEXTBIT STY ENDISRAMRD LDY #>SWRAMWRT JSR INYNEXTBIT STY ENDISRAMWRT LDY #>SWSLOT3ENABLE ;SHOULD SLOT 3 BE ENABLED UPON RESUME? JSR INYNEXTBIT STY ENDISSLOT3 ;MOD INSTRUCTION THAT EN/DSABLES IT ;LDY #0 ROR A ;STY IFTOHITC300+1 LDY #>SWAUXZP JSR INYNEXTBIT STY ENDISAUXZP NO2ESTUFF EQU * RTS ; INYNEXTBIT EQU * ;ROR THEN INY IF BIT 0 WAS ON ROR A BCC BITSOFF INY BITSOFF EQU * RTS * * * ; SETINC EQU * ;CREATE.AN.OPERAND.THAT.MAKES.THE FINAL 'INC' INSTRUCTION.SET.N.AND.Z.FLAGS.TO.THE.VALUE.THEY.HAD.IN.USER'S.P-REG LDA STATSTOW ;GET.P-REG BMI NFLAGON ROR A ROR A ;GET.Z.FLAG.INTO.CARRY BCS ZFLAGON ;NO.FLAGS.ON LDA #1 ;INC.#1.WILL.TURN.FLAGS.OFF BNE SETOPERAND ZFLAGON EQU * LDA #$FF BNE SETOPERAND NFLAGON EQU * LDA #$FE SETOPERAND EQU * STA INCOPERAND RTS ; ; FIXIRQFLG EQU * ;set CLI or SEI at end to enable mouse. ;When nmihandler restores registers prior to a resumption, ;it nevertheless always leaves the IRQ mask bit on. ;this prevents a (mouse-caused) IRQ before the resume process ;is complete. At the very last instant, a SEI or CLI is done ;to restore the flag to the state it had before the NMI. ;this routine selects whether to do an SEI or CLI. LDX #CLI ;op code LDA STATSTOW AND #IRQFLAG ;was it set? BEQ CLRIT ;no, so leave clr in accum LDX #SEI CLRIT EQU * STX CLRIRQ ;patch exit code RTS ; ; * * ;RESUMEMOUSE2 EQU * ;try again if first setmouse failed ;LDY #INITMS ;JSR DOMOUSEFIRM ; RESUMEMOUSE EQU * ;restore mouse mode LDA RHSTOW ;where did nmi occur CMP MOUSECN1 ;if during mouse firmware BEQ DONEMS ;then dont call firmware routines LDY #POSMS ;set mouse internal position to match mouseholes JSR DOMOUSEFIRM LDA CONFIGUR AND #MOUSEBIT ;does pgm use mouse in vbl-irq mode? ASL ASL ;shift it to line up with 'enable vbl-irq' bit ORA #7 ;right 3 bits on AND MOUSEMODE ;mode as possibly saved by pgm MOUSEMODEHOLE EQU *-2 LDY #SETMS ;get displacement in table JSR DOMOUSEFIRM ;do 'setmouse' ;JSR ISMOUSEON ;was vbl-irq successfully turned on/off? ;CMP CONFIGUR ;BNE RESUMEMOUSE2 ;if not, INITMOUSE and try again DONEMS EQU * RTS ; DOMOUSEFIRM EQU * ;utility to make calls to mouse firmware ; on entry, Y contains displ of byte in table of entry points LDX $C400,Y MOUSECN1 EQU *-1 ;Cn set by loader STX MOUSEJUMP ;displ in firmware of entry point LDX #$C4 ;mouse firmware demands registers be set at entry MOUSECN2 EQU *-1 LDY #$40 MOUSEN0 EQU *-1 JMP $C400 MOUSEJUMP EQU *-2 MOUSECN3 EQU *-1 ; ; ISMOUSEON EQU * ;is mouse issuing irqs? ;input: none ;output: accum contains CONFIGUR with mousebit turned on if ; irqs, off if not. ; TSX ;save stack ptr STX PAGE0TEMP1 LDA MACHINID AND #MOUSEBIT BEQ MSOFF ;if no mouse present branch CLI ;enable irq's LDA #150 JSR WAIT ;wait for 30 ms ;if an irq occurred, it will branch during the wait to MSON MSOFF EQU * ;no irq LDA CONFIGUR ;what hardware does pgm use AND #$FF-MOUSEBIT ;say 'it doesnt use vbl-irq' MSSET EQU * SEI LDX PAGE0TEMP1 ;restore stack ptr TXS RTS MSON EQU * irq occurred LDA CONFIGUR ;what hardware does pgm use ORA #MOUSEBIT ;'uses vbl-irq as well' BNE MSSET ;always ; ; ; turns on double hi res if program was using ; 80COL + HIRES + NOMIX + NOTEXT ; and workspace was 128K. ; SETDBL EQU * DO SHUTTLE2E JSR GETCURPARTNO BVC NOTDBL ;bnch if just 64k, so cant be dbl hi-res FIN DO COPYKIT2E LDA CONFIGUR AND #BITAUXMEM ;a 128K pgm? BEQ NOTDBL ;if not, then not dbl hi-res FIN DO SHUTTLE2E+COPYKIT2E+SHELL LDA SOFT EOR #$0C ;flip bits 2 + 3 AND #$AC ;isolate 4 bits CMP #$AC ;and test them PHP PLA ;get Z flag into accum ROR A ROR A ROR A ;bring Z flag around to N. EOR OPENAPPLE ;flip flag if openapple is pressed. BPL NOTDBL ;bnch if flag low, i.e. not dbl hires ITSDBL EQU * BIT ANNUNC3 ;reset annunciator3 = dbl hires RTS NOTDBL EQU * BIT ANNUNC3+1 ;turn on annunciator3 = not dbl hires FIN RTS ; ENDCODE EQU * ENDPAGE EQU XLATE STA CSW LDA # inverse upper DFB $20 ;inverse special -> inverse special DFB 0 ;mousetext -> inverse upper DFB $00 ;inverse lower -> inverse UPPER DFB $80 ;control -> control DFB $A0 ;special -> special DFB $C0 ;upper -> upper DFB $C0 ;lower -> UPPER STST`HJJJJJh)L4 RESTORE EQU * LDA 09 PHA LDA 06 LDX 07 LDY 08 PLP RTS SBTL .RWTSPRO r/w a sector to a prodos interface. ;IN: values in dumpnum, track, sector, slot, drive, buffptr ;OUT: CLC or SEC, error code in ERROR (if CLC, ERROR may be nonzero) ; ; RWTSPRO EQU * JSR SETSLOTPTR ;set up vector to device driver LDY #$FF LDA (SLOTPTR),Y STA SLOTPTR JSR SET.UNIT.NUM ;set up unit number param JSR GETSTATUS BCS RWTSPROEXIT ;exit if bad JSR GENBLOCKNUM ;convert trk/sec num to a block num PHP ;save carry: indicates whether 1st or 2nd page of block LDA #BUFF512 STA B UFF512PTR+1 LDA #0 STA BUFF512PTR JSR READPRO ;read block to Buff512 (assumes data is not there!) BCS BADPLAEXIT LDA #WRITECOMMAND CMP COMMAND BNE NOTAWRT PLP JSR COPYTO512 ;for a write, copy info to buff512 JSR WRITEPRO ;and write buff512 to disk JMP RWTSPROEXIT NOTAWRT EQU * PLP JSR COPYFROM512 CLC RWTSPROEXIT EQU * RTS BADPLAEXIT EQU * PLA ;just to get rid of extra byte on stack RTS ; ; SETSLOTPTR EQU * LDA SLOT LSR LSR LSR LSR ORA #$C0 ;=Cn STA SLOTPTR+1 LDA #0 STA SLOTPTR RTS ; GETSTATUS EQU * LDA #STATUSCOMMAND BEQ DOCOMMAND ; WRITEPRO EQU * LDA #WRITECOMMAND BNE DOCOMMAND ; READPRO EQU * LDA #READCOMMAND ; DOCOMMAND EQU * STA PCOMMAND JSR JMPTODRIVER STA ERROR ;save error code RTS ; JMPTODRIVER JMP (SLOTPTR) ; GENBLOCKNUM EQU * ;create block number ;block number: ; HIGH BYTE LOW BYTE CARRY ; 0 0 0 0 d2 d1 d0 t5 t4 t3 t2 t1 t0 s3 s2 s1 s0 ; dump num track number sector number ; ;note: does IOBLOCK contain true t/s for aux transfers? ;assume so CLC LDA TRACK DUMPNUM EQU 0 LDY #DUMPNUM STY BLOCK.NUM+1 ;construct block number here ROL A ROL A ROL A ROL BLOCK.NUM+1 ROL A ORA SECTOR ROR A STA BLOCK.NUM RTS ; ; SET.UNIT.NUM EQU * LDA DRIVE ROR A ROR A AND #$80 ;hi bit on if drive 1 EOR #$80 ;hi bit off if drive 1 ORA SLOT STA UNIT.NUM RTS ; ; COPYTO512 EQU * LDY BUFFADDR+1 ;source LDA BUFF512PTR+1 ;dest BCC FIRSTPG ;1st pg of block TAX INX TXA FIRSTPG EQU * JSR COPY1PAGE RTS COPYFROM512 EQU * LDA BUFFADDR+1 ;dest LDY BUFF512PTR+1 ;source BCC FIRSTPGX ;1st pg of block INY FIRSTPGX EQU * JSR COPY1PAGE RTS ̠ӠӢŠՠŠՠōǠՠūԠİŠǿ̠ϠȠŠŠӮ΍ǠҫϠōŠōӠӠĠԠٍҠϠԠӍƠŠ͠؍砳Ʊ積Ʋ穮亠ҠҬƠҬƱƠ 䍻ƲҬƲ砰ҠƱƲ卻󠤵宍蠸䬍ҠƱ䮠䍻Ҡ󬠤䠤Ơ蠍Ҡ±ؠӠ٠Ӡ卻±ٍҩٍ̮ϮƲҠ̠Ʋ؍Ҡ̠Ʋ؍ȮϮƱƱٍ؍ؠà±ؠ獠Š±ȮϮƲؠ²Ʋ؍ĠƍƲ؍؍̠²Ӎ卻ƱƲ뮍庠卻쮍􍻠Ч㮍űàؠڍؠӍðĬ؍ðŬؠɠԍƲЍƠ占ðƬؠ報占ðì؍Ѝ٠卻àҠ̷ٍŠÍĵ덠Ҡ̹덠Ҡ̹Ġ덠Ҡ̹퍠٠ƲŠرƲ٠򠶭رҠƲ٠Ҡ占؍̬؍ؠڍðĬؠ占ðì؍٠占ŠƱ卻ЍЍƱҠƱٍ؍̬؍ؠӍðĬؠ占ðì؍ƱٍٍŠ؍̬؍퍻ؠڍҠ̍፻Šʹ덠Ҡ̹͵퍠Ҡ̹ Ͷ퍠Ҡ̹嬠𡍻ƍҠ̹卻ðŬ؍卻Ԡðì؍Ӎ̹卻̹Í̷卻̷덻̠ðĬ؍ðì؍Ӎ΍宍󠳴퍻󮍻ƱƲ堸썻ҩҩƱƬ䠳Ʋ±٠ԱؠԲ؍ɠԱ̮ϮƲƱٍҠƲ؍̠ҠƲ؍̠򍻍ҩٍٍ٠ύŠԲӍĠ嬠򍻠卻ƱƲı٠󍻍àٍѠҍ䍻宍زðì؍̠ز䬠ͱñҠĵŠÍЍ򍻠Ͳسðì؍̠سРŠñ٠ͳشðì؍̠شРčŠñ򍻍퍻Ʋٍ٠؍ص٠ðì؍̠صҠԬٍ٠؍ƲٍŠƱ٠؍ض٠ðì؍̠ضҠԬٍ٠؍ƱٍٍŠ卻ط٠ðì؍̠طРԬٍŠҍʹظðì؍̠ظРōŠҍЍ͵عðì؍̠عРѠ؍ҠÍӍ䮍󍻠ĵ󍻠Ŭұ٠Í٠ԍΠٍŠٰàԍѠҍ련ĵٰðì؍ٰ̠αРĵŠ΍Ѝ덻ٱðì؍̠ٱРŠα٠덻ٲðì؍̠ٲРŠα卻䠨󩍻Ġ͍䠧䧠卻ٳðì؍̠ٳ̠ԍ宍ٴðì؍̠ٴﮍĠԍ嬠卻썻䮍ЫٍҠٍ͍̠č㩠堰ٍŠҍ堨ũٵðì؍̠ٵРōŠҍЍ堨ٶðì؍̠ٶРŠҍؠÍӍӠ嬠卻䍻뮍ӠؠЍ΍РְˍѠӰԍĠְˍҍÍà΍ѠōӠڰҠƍàְˍàڱڰàōàְˍڱРԍàڲԍڲРÍӠڳٍڳÍҠӍٍ̬ҠԍҍÍҠӲٍ̬ҠԍàԍŠčŠҠԍÍӠְˍӲĠ̠Ѝ؍Ƭ؍ؠЍӰӍ؍٠卻ê㍻Ԡؠؠ㍠Šà̍ŠàȍÍàŠԍӍίƠ󍻍̠  ŬĬììììÍ̠ ìƬŬĬììììÍϠō󍻍̠ ¬ĬŬƬ¬ìĬŬƬ²³ ´µ¶·¹¬ìĬŬƬ¬ĬŬƬij ĶķŬìĬŬƬŵŶŷŹ¬Í ĬŬƬƲƳƴƵƶƷƹ¬ìĬŬƍ΍卻֠ İĬ¬ŵ³Ŭìøƍ􍻠ˠōҠҠύҠٍ̠Ԡύɠְֱˬٍ̠ӳְְˬٍӳӍǠԫ ì ¬ìĬ°±ŬƬ ¸ðñòóôõ ö÷øù¬ììĬŬİıIJƬĴĵ ĸŰűŲųŴ ¬ŸìĬŬƬưƱ Ƹ¬ìĬŬƍ󍻠򡍻ƱՠȍƲՠȲϠڍ卻ұàׯРðĬ؍ðŬ؍ɠҍ卻ƍðƬ؍Рðì؍àҠԱҠԱðĬ؍Рðì؍ЍٍŠÍ󍻍ĵҠŹҠŹҠŹ򍻠퍻ōҠ!#$%&'()*+,-./0123ōˍҠōҫҠōōҠˍҠҫҠҍðĬ؍ðì؍Ҡű󠴬䠶ōҠŹҠŹҠŹÍҠðŬ؍ðì؍ԱӍ􍻠뮍ŠҠҍ󍻍ðĬ؍Рðì؍ЍЍЍűЍŹЍ󍻍ðĬ؍Рðì؍Ӎ΍ϠڍŠӠϠŠٍӠ΍Ӡ􍻍Ӡՠ䠴󍻍٠٠ԍ٠٠ԍؠԍϠ䍻٠ƍРٍ̩Ѡԍﬠ卻ٍ̩؍ٍ̩ðŬ؍􍻍Π٠ðì؍ŠРðì؍Š΍ٍŠō؍΍Š Ҡàõðؠ Ӡ̰õՠð¬ؠ ̰ՠ 占Ҡύðؠ ԠðŬ؍ðì؍٠Ųðì؍ؠԍРðì؍ ³ٍѠŲ Ѝ ð؍٠Š¬٠ « « ҍԬٍٍ٠Šō󍻍ĸ ԍȍōϠРōѠôōЍ٠ЍôҠàõð؍Ӡ̍õð¬؍䍻̠ҠύЍЍŠԍ٠󍻠卻ԠҠԍٍŠԍؠԍԠՠ΍ˍҠˍϠЍŠˍ٠ȍ̠ˍ䮍Ơ٠öٍŠöà̍ŠƍàȍŠƍ䮍΍卻덻ˠՠčѠōϠڍРѠˍ΍ҠРүנӠ˲ 􍻠Ҡ±栴󮍻˲٠٠ԍҠؠԍҠұàԍҲàԍ̠ҍ䍻̠ˍҠˍàԍѠҍԍҠˍˠҠˍР˲󍻠䬠䍻묠卻Ԡ٠č٠ˍѠˍϠҍҠԱٍ΍卻ˍҠˍàԍŠˍѠ̍򮍻ҠϱЍРҍŠѠōϠڍˠР͍΍묍荻ˠՠϠҍō٠̩٠卻Ӡ®č٠ōٍ̩﬍򮍻Ѡ̍嬠卻򮍻РčѠ̍Šϱ΍Ϡҍ̠ՠ٠ĠҠҠĩĠҠčҠōҠˠԠōŠՠԠӠΠŠàūō򍻍̠ՠҠ ᠢ򍻠卻宍ٍٍ֬Ϡ֍ǠˠƠؠ͠ǠĠҠčѠ֍ҠҠԠؠŠōҠҠ֠ՠ΍ĠƠϠԠōРčŠҲ΍ﬠ፻宍Ѝàԍ笠堲ҠıЍӠҲЍؠؠύ󮍻Ҡ±ؠԍŠÍ Ԡ̳ҠàŠĠ٠Ԡ̳ҍð؍ӍϠō嬠卻ᠨ䩠򮍻ԠҠűàōӠҍ΍Ϡڍ򍻠宍̍͠ō堨ҍ٠ﮍˍ򮍻ùƲٍٍŠù򮍻İƱٍٍŠİ렴㽲󩍻Ҡˍ蠴捻󮍻ԍˠˍҠˍҠƲˠɯϠ򮍻Ӡҍԍ䮍ĠÍàԍѠҍ䮍ҠұӠĠ翍čŠč󍻠뮍ҠıӠčˬ뮍àˍˍРàˍ砨殍Íàˍ®Ҡ٠čٍ̩Í殍ˠð؍Ӎ뮍Ʋ򠣍ҫ٠蠱󍻍Šij͠٠ԍijҠұ䍠Ӡٱ䮍ҠűӠٱ򍻠󠱶àҫҫРà͍򠣠٠ƍ٠ҫ󠍻䮍ԍРЬٍٍ̠Ѝ٠ԍ٠ҠٱҠٱҠٱЍٍŠٍҠұӠ΍čѠčРԍԍàԍРӠ΍ÍӍàҠұӠٍĠҠıàЍ٠àԍŠÍΠҠұӠԍčРƍŠԍҠıàƲԠàԍŠ΍ÍٱӍР٠čЬٍɠٍƍЬٍàҫ̠ÍˍŠōԍРàٱàԍàԍŠÍӍЭ䍻󮍻Р ƬƬƬƬƬƬƬƬƬƬƬƬƬƬƬƍ΍ˠ嬍 􍻠دϠ堭堰Ϡ堭報ˠՠ̠ ύҠ˱ҠˍӍ˱΍Ҡ٠ẽְˬٍԠύɠύֱˬٍϠְˍ΍Ԡύɠְֱˬٍ̠ˍְְˬٍˠРӍ٠ҠҠҠҠٍӍϠȍӠǡ卻卻􍻠Ҡč͍͍ÍРԍčӠб̫̍ӍҠ԰٠ÍӍҠ׍ؠōӍҠ̍؍ؠōРҍ΍ϠĠǮЮōĠӠϠŠĠϠ̠čְˠՠֱˠՠƸˠՠְˠ  ˠ§ӠԠՠֱˠ ӠԠ Ԡ Ӡ Ԡ ΍; PRBLNK EQU $F948 ANYSECTOR EQU 0 WRITE EQU 1 INITIALZ EQU 0 PATCH EQU 0 SCRATCHPAD EQU 0 ;USING.SCRATCHPAD.ON.PAGES.4-7? ; DSLOTZ EQU $27 CSUM EQU $27 PRIOR EQU $27 WTEMP EQU $26 TO EQU $26 IDX EQU $26 COUNT EQU $26 LAST EQU $26 TRKCNT EQU $26 VOLFND EQU $2F TRKFND EQU $2E SECFND EQU $2D DSLOTEMP EQU $2B TRKN EQU $2A PTRSDEST EQU $36 DRIVNO EQU $35 BUFADR EQU $3E DEVCTBL EQU $3C MONTIMEH EQU $47 MONTIMEL EQU $46 SYNCNT EQU $45 DTRACK EQU $44 DVOLUME EQU $41 IOBPH EQU $49 IOBPL EQU $48 ROM EQU $C081 PHASEO46FF EQU $C080 LC08F EQU $C08F LC08E EQU $C08E LC08D EQU $C08D LC08C EQU $C08C LC08B EQU $C08B LC08A EQU $C08A LC089 EQU $C089 LC088 EQU $C088 XBASIC EQU $E000 SETVIDD EQU $FE93 ; DO SCRATCHPAD ;USING.PP.4-7? ; CURTRK EQU $478 DRV0TRK EQU $478 SEEKCNT EQU $4F8 DRV1TRK EQU $4F8 RETRYCNT EQU $578 DSLOT EQU $5F8 DSLOTABS EQU $678 RECALCNT EQU $6F8 FIN ; ź 卪 뮍 덪 宍&RWOTS1:y&RWOTS2K#VONLY]#جTEMP^ج SBTL "DOS 3.3 RWTS" ENDCODE EQU * ENDPAGE EQU ?@ABCDEFGHIhru $00 and ;three passes thru NBUF2: $2 thru $55, $0 thru $55, $0 thru $55. ;At each step, take the rightmost two bits off BUFFADDR, shift them into ;NBUF2, and copy the remaining 00xxxxxx from BUFFADDR to NBUF1. ; Thus each byte of NBUF2 gets three pairs of bits, each pair from source ;bytes $56 bytes apart from the next pair's source byte. ; ;march 85: the first two lines of the routine are changed from standard, ;to make it possible for BUFFADDR and NBUF1 to be overlaid. The replaced ;code read BUFFADDR in two passes, $2 thru $0 and $FF thru $0, which ;trashed the first two bytes of BUFFADDR in case of an overlay. ; ; PRENIB16 LDX #2 ;(changed from #0 ; RPS 3/85) LDY #0 ;(changed from #2 ; RPS 3/85) ; ; Get next user byte ; PRENIB1 DEY LDA (BUFADR),Y ; ; Shift L.O. two bits into ; NBUF2. ; LSR A ROL NBUF2,X LSR A ROL NBUF2,X ; ; Put H.O. six bits (shifted right) ; into NBUF1. ; STA NBUF1,Y INX CPX #$56 BCC PRENIB1 ; ; ; Done yet? ; LDX #0 TYA ;just to set '=' flag BNE PRENIB1 ; ; ; strip H.O. two bits of NBUF2. ; LDX #$55 PRENIB2 LDA NBUF2,X AND #$3F STA NBUF2,X DEX BPL PRENIB2 RTS ; ; ; Write subroutine ; ; Writes prenibbilized data in ; NBUF1 and NBUF2 to disk. ; ; note: this stuff is all time ; critical. ; ; watch page boundries, don't ; remove NOP's, etc. ; ; ; WRITE16 SEC ;anticipate write protect STX DSLOTZ STX DSLOTABS LDA LC08D,X LDA LC08E,X ;sense write protect BMI WEXIT LDA NBUF2 STA WTEMP LDA #$FF ;sync byte STA LC08F,X ;write 1st nibble ORA LC08C,X PHA PLA NOP LDY #4 ; ; ; Write the sync byte ; WSYNC PHA PLA JSR WNIBL7 DEY BNE WSYNC LDA #$D5 ;first data mark JSR WNIBL9 LDA #$AA ;2nd data mark JSR WNIBL9 LDA #$AD ;3rd data mark JSR WNIBL9 TYA ;clear checksum LDY #$56 ;NBUF2 index BNE X1 ;always taken ; ; ; WDATA0 LDA NBUF2,Y ;get prior 6-bit nibble X1 EOR NBUF2-1,Y ;and XOR with current nibble TAX LDA NIBL,X LDX DSLOTZ STA LC08D,X ;write nibble LDA LC08C,X DEY ;next nibble BNE WDATA0 ; ; ; ; now handle NBUF1. ; ; ; get prior nibble ; LDA WTEMP NOP ; ; loop to write out data in NBUF1 ; WDATA2 EOR NBUF1,Y TAX LDA NIBL,X LDX DSLOTABS STA LC08D,X ;write nibble LDA LC08C,X LDA NBUF1,Y INY BNE WDATA2 TAX LDA NIBL,X ; ; write checksum ; LDX DSLOTZ JSR WNIBL ; ; write epilog to data ; LDA #$DE ;DM4, bit slip mark JSR WNIBL9 LDA #$AA ;DM5, bsm JSR WNIBL9 LDA #$EB ;DM6, bsm JSR WNIBL9 ; ; All done, close up the shop! ; LDA #$FF JSR WNIBL9 ; ; turn off the write mode ; LDA LC08E,X ; ; and back to the read mode ; WEXIT LDA LC08C,X RTS ; ; ; ; WNIBL9 9 cycles, then write ; WNIBL9 CLC ; ; WNIBL7 7 cycles, then write ; WNIBL7 PHA PLA ; ; ; write nibble to disk ; WNIBL STA LC08D,X ORA LC08C,X RTS ; FIN ; ; ; ; Post nibblize routine. ; ; converts 342 nibbles of the form ; ; 00xxxxxx ; ; to eight bit bytes. ; ; The nibbles are stored in NBUF1 ; and NBUF2, the 8-bit bytes will ; be stored at (BUFADR). ; ;Makes one pass thru (BUFFADDR) and NBUF1 from $0 to $FF, ; and 3 passes thru NBUF2: $55 to 0, $55 to 0, $55 to 2. ; ; POSTNB16 LDY #0 POST1 LDX #$56 POST2 DEX BMI POST1 ; ; get byte and shift in L.O. two ; bits from NBUF2 ; LDA NBUF1,Y LSR NBUF2,X ROL A LSR NBUF2,X ROL A ; ; store in user buffer ; STA (BUFADR),Y INY CPY TO BNE POST2 RTS ; ; ; READ routine, reads a sector ; from the disk and stores the ; data in NBUF1 and NBUF2. ; READ16 LDY #$20 ; ; get sync bytes ; RSYNC DEY BEQ RDERR ; ; wait until a byte is recieved ; from the disk drive. ; X2 LDA LC08C,X BPL X2 ; ; byte recieved, check for DM1 ; RSYNC1 EOR #$D5 BNE RSYNC NOP ; ; get next byte and check for ; DM2 ; X3 LDA LC08C,X BPL X3 CMP #$AA BNE RSYNC1 LDY #$56 ; ; Check for DM3 ; X4 LDA LC08C,X BPL X4 CMP #$AD BNE RSYNC1 ; ; Read the data from the sector ; LDA #0 ;init checksum ; ; Read stuff into NBUF2 ; RDATA1 DEY STY IDX X5 LDY LC08C,X BPL X5 EOR MSWAIT,Y LDY IDX STA NBUF2,Y BNE RDATA1 ; ; Read stuff into NBUF1 ; RDATA2 STY IDX X6 LDY LC08C,X BPL X6 EOR MSWAIT,Y LDY IDX STA NBUF1,Y INY BNE RDATA2 ; ; get and check the checksum byte ; X7 LDY LC08C,X BPL X7 CMP MSWAIT,Y BNE RDERR ; ; check for DM4 ; X8 LDA LC08C,X BPL X8 CMP #$DE BNE RDERR NOP ; ; check for DM5 ; X9 LDA LC08C,X BPL X9 CMP #$AA BEQ RDADRX RDERR SEC RTS ; ; ; Read address field. ; ; Reads starting address marks ; ($D5, $AA, $96), address info ; (volume/track/sector/checksum), ; and closing address marks ; ($DE, $AA) ; RDADR16 LDY #$FC STY COUNT RDASYN INY BNE Y0 INC COUNT BEQ RDERR ; ; Read first address mark ($D5) ; Y0 LDA LC08C,X BPL Y0 RDASYN1 CMP #$D5 BNE RDASYN NOP ; ; Read next address mark ; Y1 LDA LC08C,X BPL Y1 CMP #$AA BNE RDASYN1 LDY #3 ; ; Read last address mark ; Y2 LDA LC08C,X BPL Y2 CMP #$96 BNE RDASYN1 ; ; init checksum and read the ; address data field (four bytes) ; LDA #0 RDAFLD STA CSUM ; ; Read 'odd' bit nibble ; Y3 LDA LC08C,X BPL Y3 ROL A STA LAST ; ; Read even bit nibble. ; Y4 LDA LC08C,X BPL Y4 ; ; Merge the two. ; AND LAST ; ; store the data byte, update ; checksum, and repeat until ; entire address field is read. ; STA DSLOTEMP+1,Y EOR CSUM DEY BPL RDAFLD ; ; Checksum (in acc) must be 0. ; TAY BNE RDERR ; ; Read first epilogue byte ($DE) ; Y5 LDA LC08C,X BPL Y5 CMP #$DE BNE RDERR NOP ; ; Read second epilogue byte ($AA) ; Y6 LDA LC08C,X BPL Y6 CMP #$AA BNE RDERR RDADRX CLC RTS ; ; ; SEEKABS routine, moves the ; disk head over the desired ; track. ; SEEKABS STX DSLOTEMP STA TRKN CMP DRV0TRK BEQ RTS0 LDA #0 STA TRKCNT MOVEHEAD LDA DRV0TRK STA PRIOR SEC SBC TRKN BEQ ISTHERE BCS Z0 EOR #$FF INC DRV0TRK BCC Z1 Z0 ADC #$FE DEC DRV0TRK Z1 CMP TRKCNT BCC Z2 LDA TRKCNT Z2 CMP #$C BCS Z3 TAY Z3 SEC JSR CHKPOS LDA ONTBL,Y JSR MSWAIT LDA PRIOR CLC JSR CHKPOS2 LDA OFFTBL,Y JSR MSWAIT INC TRKCNT BNE MOVEHEAD ISTHERE JSR MSWAIT CLC CHKPOS LDA DRV0TRK CHKPOS2 AND #3 ROL A ORA DSLOTEMP TAX LDA PHASEOFF,X LDX DSLOTEMP RTS0 RTS TAX LDY #$A0 ; ; ; Head move delay subroutine ; delays ACC*100 usec ; ; MSWAIT LDX #$11 A2 DEX ;delay 86 usec BNE A2 INC MONTIMEL BNE A3 INC MONTIMEH A3 SEC SBC #1 BNE MSWAIT RTS ; ; ; PHASEON/PHASEOFF tables ; ONTBL DFB 01,$30 DFB $28,$24,$20,$1E,$1D,$1C,$1C,$1C,$1C,$1C OFFTBL DFB $70,$2C,$26,$22,$1F,$1E,$1D,$1C,$1C,$1C,$1C,$1C ; ; ; ; DO WRITE ; ; ; Write translate tables ; NIBL DFB $96,$97,$9A,$9B,$9D,$9E,$9F,$A6,$A7,$AB,$AC,$AD,$AE,$AF,$B2,$B3 DFB $B4,$B5,$B6,$B7,$B9,$BA,$BB,$BC,$BD,$BE,$BF,$CB,$CD,$CE,$CF,$D3 DFB $D6,$D7,$D9,$DA,$DB,$DC,$DD,$DE,$DF,$E5,$E6,$E7,$E9,$EA,$EB,$EC DFB $ED,$EE,$EF,$F2,$F3,$F4,$F5,$F6,$F7,$F9,$FA,$FB,$FC,$FD,$FE,$FF ; ; FIN ; ; Interleave remapping table ; INTRLEAV DFB $D0,$AD,$7B,$49,$17,$E5,$B3,$81,$5E,$2C,$FA,$C8,$96,$64,$32,$0F ; ; This routine sets the slot ; dependant track location ; SETTRK PHA LDA DRIVE ROR A ROR DRIVNO JSR XTOY PLA ASL A BIT DRIVNO BMI ONDRV0 STA DRV1TRK,Y BPL RTS3 ONDRV0 STA DRV0TRK,Y RTS3 RTS ; ; ; ORG MSWAIT+$96 ; ; DFB 00,$01,$98,$99,$02,$03,$9C,$04,$05,$06,$A0,$A1,$A2,$A3,$A4,$A5 DFB 07,$08,$A8,$A9,$AA,$09,$0A,$0B,$0C,$0D,$B0,$B1,$0E,$0F,$10,$11 DFB $12,$13,$B8,$14,$15,$16,$17,$18,$19,$1A,$C0,$C1,$C2,$C3,$C4,$C5 DFB $C6,$C7,$C8,$C9,$CA,$1B,$CC,$1C,$1D,$1E,$D0,$D1,$D2,$1F,$D4,$D5 DFB $20,$21,$D8,$22,$23,$24,$25,$26,$27,$28,$E0,$E1,$E2,$E3,$E4,$29 DFB $2A,$2B,$E8,$2C,$2D,$2E,$2F,$30,$31,$32,$F0,$F1,$33,$34,$35,$36 DFB $37,$38,$F8,$39,$3A,$3B,$3C,$3D,$3E,$3F ; ; ; nibble buffers, must be in this ; order! ; NBUF1 EQU STASH NBUF2 EQU STASH2 ; ; ; DO INITIALZ ; ; ; Write an address field routine ; ; WRADR16 SEC ;assume W/P error LDA LC08D,X LDA LC08E,X BMI WPERROR ; ; output sync byte ; LDA #$FF STA LC08F,X CMP LC08C,X PHA PLA FRMSYNC JSR WAIT12 JSR WAIT12 STA LC08D,X CMP LC08C,X NOP DEY BNE FRMSYNC ; ; output data marks ; LDA #$D5 JSR WBYTE9 LDA #$AA JSR WBYTE9 LDA #$96 JSR WBYTE9 ; ; output volume track sector ; and checksum ; LDA DVOLUME JSR JLMNOPQRSTUVWXYZ[\WBYTE LDA DTRACK JSR WBYTE LDA BUFADR+1 JSR WBYTE LDA DVOLUME EOR DTRACK EOR BUFADR+1 PHA LSR A ORA BUFADR STA LC08D,X LDA LC08C,X PLA ORA #$AA JSR WBYTE11 ; ; output data marks 4,5, and 6 ; LDA #$DE JSR WBYTE9 LDA #$AA JSR WBYTE9 LDA #$EB JSR WBYTE9 CLC WPERROR LDA LC08E,X LDA LC08C,X WAIT12 RTS ; ; ; Write a byte as two four bit ; nibbles to the disk. ; WBYTE PHA LSR A ORA BUFADR ; ; write odd bits ; STA LC08D,X CMP LC08C,X PLA NOP NOP NOP ORA #$AA WBYTE11 NOP WBYTE9 NOP PHA PLA ; ; write even bits ; STA LC08D,X CMP LC08C,X RTS ; ; ; FIN DO INITIALZ ; ; FORCE RWTS TO PAGE BOUNDRY ; DS 33 ; ; FIN ; ; ; ; ; RWTS entry point ; ; RWTS EQU * ; ; ; set up for one recal and 4 seeks ; LDY #2 STY RECALCNT LDY #4 STY SEEKCNT ; ; get slot # ; LDX SLOT DO 0 TXA ; ; ; see if slot # was changed ; LDY #$F CMP (IOBPL),Y BEQ SAMEDSLOT ; ; if so, turn off old drive ; TXA PHA LDA (IOBPL),Y TAX PLA PHA STA (IOBPL),Y LDA LC08E,X ; ; delay until data is constant ; STILLON LDY #8 LDA LC08C,X NOTSURE CMP LC08C,X BNE STILLON DEY BNE NOTSURE PLA TAX ; FIN ; LDA DRIVE ;SELET DRIVE 1 OR 2 ROR A BCC C5 LDA LC08A,X ;drive 1 BCS DRVSEL0 C5 EQU * LDA LC08B,X ;drive 2 DRVSEL0 EQU * ; ROR DRIVNO ;save which drv is in use ; LDA LC089,X ;motor on ; ; SAMEDSLOT LDA LC08E,X LDA LC08C,X LDY #8 NOTSURE2 LDA LC08C,X PHA PLA PHA PLA STX DSLOT CMP LC08C,X ;BNE B3 ;DEY BEQ NOTSURE2 ;3 PHP ;LDA LC089,X ; ; move necessary pointers to ; page zero ; LDY #6 PTRMOVE LDA IOB,Y STA PTRSDEST,Y INY CPY #$A BNE PTRMOVE ; ; get other parameters ; LDA #$D8 ;motor on time count STA MONTIMEH LDA DRIVE ; DO 0 ; LDA (IOBPL),Y LDY #$10 CMP (IOBPL),Y BEQ C4 STA (IOBPL),Y PLP LDY #0 PHP C4 ROR A BCC C5 LDA LC08A,X BCS DRVSEL C5 LDA LC08B,X ; ; save which drive is being used ; DRVSEL ROR DRIVNO PLP PHP BNE NOWAIT LDY #7 ; ; wait 100 usec for old drive's ; timing capacitor to discharge ; STEPWAIT JSR MSWAIT DEY BNE STEPWAIT LDX DSLOT NOWAIT LDY #4 ; FIN ; LDA TRACK JSR MYSEEK ; DO 0 ; PLP BNE TRYTRK LDY MONTIMEH BPL TRYTRK ; ; wait for motor to come up to ; speed. ; MOTOROFF LDY #$12 C6 DEY BNE C6 INC MONTIMEL BNE MOTOROFF INC MONTIMEH BNE MOTOROFF ; ; disk is now up to speed. ; FIN ; ; if not format operation, ; position the head over the ; proper track ; TRYTRK EQU * LDA COMMAND BEQ GALLDONE DO INITIALZ CMP #4 BEQ FORMDSK FIN ; ROR A PHP ;save R/W status BCS TRYTRK2 ; ; if a write operation, must ; prenibblize first. ; JSR PRENIB16 ; ; ; set up for a maximum of 48 ; retries. ; TRYTRK2 LDY #$30 STY RETRYCNT TRYADR LDX DSLOT JSR RDADR16 BCC RDRIGHT TRYADR2 DEC RETRYCNT BPL TRYADR ; ; recalibrate disk head ; RECAL LDA CURTRK PHA LDA #$60 JSR SETTRK DEC RECALCNT BEQ DRVERROR LDA #4 STA SEEKCNT LDA #0 JSR MYSEEK PLA RESEEK JSR MYSEEK JMP TRYTRK2 ; ; ; We have just read an address ; field, now check for desired ; track, sector, and volume ; RDRIGHT LDY TRKFND CPY CURTRK BEQ RTTRK ; ; ;DO ANYSECTOR ;TYA ;PHA ;JSR CROUT1 ;PLA ;TAY ;FIN ; ; ; ; Save dest track value ; LDA CURTRK PHA TYA JSR SETTRK PLA DEC SEEKCNT BNE RESEEK BEQ RECAL ; ; Bad drive error. ; DRVERROR PLA LDA #$40 ; ; JMPTO1 PLP JMP HNDLERR GALLDONE BEQ ALLDONE ; DO INITIALZ FORMDSK JMP DSKFORM FIN ; ; ; Drive is on the right track, ; now check for a vol mismatch ; RTTRK EQU * ;DO ANYSECTOR ;ELSE ;LDY #3 ;LDA (IOBPL),Y ;get desired volume ;PHA ; ; Save volume actually found in ; RWTS IOB. ; ;LDA VOLFND ;LDY #$E ;STA (IOBPL),Y ; ; If volume specified was zero, ; no error. ; ;PLA ;BEQ CRCTVOL ; ; Otherwise, check for a volume ; mismatch error. ; ;CMP VOLFND ;BEQ CRCTVOL ;LDA #$20 ;BNE JMPTO1 ;FIN ; ; ;DO ANYSECTOR ;CRCTVOL EQU * ;DISPLAY FOUND SECTOR NUMBER (HARD) ;LDA SECFND ;SECTOR FOUND ;JSR PRBYTE ;JSR PRBLNK ;OUTPUT A SPACE ;SECSTORE EQU * ;STA $0300 ;LIST SECTORS IN PAGE 3 ;INC SECSTORE+1 ;ELSE ; ; ; now check for the correct sector ; CRCTVOL EQU * LDA SECTOR ;get the sector # ; ; Convert to a "soft" sector ; number by applying the software ; interleave. ; TAY LDA INTRLEAV,Y ; DO AUXINTRLEAV PHA LDA DISKAUXFLAG ;CHECK IF AUX MEM BEING DUMPED OR LOADED BEQ NORMINTRLEAV PLA LSR A LSR A ;GET AUX INTERLEAVE VALUE LSR A LSR A PHA NORMINTRLEAV EQU * PLA FIN ; AND #$F ;ZERO LEFT NIBBLE ; ; Are we at that sector yet? ; CMP SECFND BNE TRYADR2 ; ;FIN ; ; ; If so, see if we are doing a ; read or a write. ; PLP BCC WRIT ; ; Reading, so read in the 256 ; bytes of data that follow. ; JSR READ16 PHP BCS TRYADR2 PLP LDX #0 STX TO ; ; Convert the nibbles to bytes. ; JSR POSTNB16 LDX DSLOT ALLDONE CLC DFB $24 ;BIT L38 HNDLERR SEC ;OPCODE SKIPPED BY BIT L38 ;LDY #$D STA ERROR LDA LC088,X RTS ; ; DO WRITE ; ; ; ; Performing a write, write the ; data (already nibblized) to ; the following data sector. ; WRIT JSR WRITE16 BCC ALLDONE LDA #$10 BCS HNDLERR ; ; FIN ; ; ; ; DO INITIALZ ; ; ; ; This is the disk formatter ; routine. ; DSKFORM LDY #3 LDA (IOBPL),Y STA DVOLUME ; ; Save timing constant in zero ; page (for time critical section) ; LDA #$AA STA BUFADR LDY #$56 ; ; Set up to start a track zero. ; LDA #0 STA DTRACK ; ; ; zero secondary buffer. ; C9 STA NBUF2-1,Y DEY BNE C9 ; ; zero primary buffer. ; D0 STA NBUF1,Y DEY BNE D0 ; ; Pretend we are at track 40 ; (acc=2*maxtracks) ; LDA #$50 JSR SETTRK ; ; Start with 40 bytes of self ; sync bytes. ; LDA #$28 STA SYNCNT ; ; Got to the track and format it. ; NXTTRK LDA DTRACK JSR MYSEEK JSR DISKF2 ; ; Init in case of DISK I/O error. ; LDA #8 BCS HNDERR LDA #$30 STA RETRYCNT ; ; Verify the track just formatted. ; NOGOOD SEC DEC RETRYCNT BEQ HNDERR ; ; Read the address field. ; JSR RDADR16 BCS NOGOOD ;something wrong? ; LDA SECFND BNE NOGOOD ; ; Read the data and see if it's ; ok. ; JSR READ16 BCS NOGOOD ; ; A-OK, move on to the next track. ; INC DTRACK ; ; At the last track yet? ; LDA DTRACK CMP #$23 BCC NXTTRK ; ; Force error flag (carry) off. ; CLC BCC DONEDSK ; ; ; Store error code in IOB. ; HNDERR EQU * STA ERROR SEC ; ; Turn the disk off. ; DONEDSK LDA LC088,X RTS ; ; Format the current track. ; DISKF2 LDA #0 ;init sector # STA BUFADR+1 LDY #$80 ;begin track with 128 sync bytes ; BNE D33 ; ; TRKFRM LDY SYNCNT D33 JSR WRADR16 ;write an address field BCS DELAY12 ; ; Write a data field. ; JSR WRITE16 BCS DELAY12 ; ; Increment the sector number ; and see if it is 16 yet. ; INC BUFADR+1 LDA BUFADR+1 CMP #$10 BCC TRKFRM ; ; Reset sector # to 15 ; LDY #$F STY BUFADR+1 ; ; mark the current track as ; formatted. ; LDA #$30 STA RETRYCNT INITIALZMAP STA SECMAP,Y DEY BPL INITIALZMAP LDY SYNCNT DELAY JSR DELAY12 JSR DELAY12 JSR DELAY12 PHA PLA NOP DEY BNE DELAY JSR RDADR16 BCS DOAGAIN LDA SECFND BEQ ITSGOOD LDA #$10 CMP SYNCNT LDA SYNCNT SBC #1 STA SYNCNT CMP #5 BCS DOAGAIN SEC RTS NXTSEC JSR RDADR16 BCS NXTTRY ITSGOOD JSR READ16 BCC MARKMAP NXTTRY DEC RETRYCNT BNE NXTSEC DOAGAIN JSR RDADR16 BCS ERRCNT LDA SECFND CMP #$F BNE ERRCNT JSR READ16 BCC DISKF2 ERRCNT DEC RETRYCNT BNE DOAGAIN SEC DELAY12 RTS MARKMAP LDY SECFND LDA SECMAP,Y BMI NXTTRY LDA #$FF STA SECMAP,Y DEC BUFADR+1 BPL NXTSEC LDA DTRACK BNE TRKDONE LDA SYNCNT CMP #$10 BCC DELAY12 DEC SYNCNT DEC SYNCNT TRKDONE CLC RTS ; ; ; ; SECMAP- used to mark initialized ; sectors. ; SECMAP DFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; ; ; FIN ; ; ; MYSEEK is the seek routine, ; it seeks track 'A' in slot ; X/16 ; ; If DRIVNO is negative - drive 0 ; If DRIVNO is positive - drive 1 ; MYSEEK EQU * ASL A JSR SEEK1 LSR CURTRK RTS SEEK1 STA TRKN JSR XTOY ;y:=a:=x/16 LDA DRV0TRK,Y BIT DRIVNO BMI WASDO LDA DRV1TRK,Y WASDO STA DRV0TRK LDA TRKN BIT DRIVNO BMI ISDRV0 STA DRV1TRK,Y BPL GOSEEK ISDRV0 STA DRV0TRK,Y GOSEEK JMP SEEKABS XTOY TXA LSR A LSR A LSR A LSR A TAY RTS ; ; ; DO PATCH ; ; DOS 3.3 patches. WARNING! These ; are addressed by object code ; and should not be moved without ; careful thought. ; JSR SETVIDD LDA ROM LDA ROM LDA #0 STA XBASIC JMP RESTART ; ; UNUSED ; DS 3 ; ; STA TEMP111 STA BYTVAL STA BYTVAL+1 RTS JSR RSET0 STY RUNINTRC RTS JSR SAVFMW LDX STKSAVE TXS JSR CLOSEALL TSX STX STKSAVE LDA #9 JMP SETERROR ; ; FIN ; ; DO SCRATCHPAD ;USING.PP.4-7? ELSE ; *SCRATCHPAD ADDRS TO BE COPIED TO INTERNAL SCRATCHPAD OLDDRV0TRK EQU $478 OLDDRV1TRK EQU $4F8 ; CURTRK EQU * DRV0TRK DFB $B ;TRACK 'B' DS 7 SEEKCNT EQU * DRV1TRK DFB $B DS 7 RETRYCNT DFB 0 DSLOT DFB 0 DSLOTABS DFB 0 RECALCNT DFB 0 FIN INCLUDE EQUATES INCLUDE VISION80 ORG $300 LDA $300 ROR A SHELLuHUSTON!' '&SHELLTa a_)JUMPTABLEj_SWAPALLl\k_)GOMONITORn j_Kt0a_!Lva_NOEGG.0yn_(PR.VIS80{ 2_!Ma_'LISTINGp-)_!NYa_GOMONITOR.0j_ SBTL .VERSION NUMBER. ********9.0 SHELL ****** ;LST ON,NOVSYM,ASYM LST OFF,NOVSYM,NOASYM * * ********************************* * * SNAPSHOT SHELL TOP LEVEL--- * * THIS FILE CONTAINS THE * 'INCLUDES' FOR THE ENTIRE REST * OF THE SHELL. TO ASSEMBLE IT * TYPE 'PFX /S/SHELL : ASM * SHELLT,K'. * ALL ';LST' AND 'ORG' STATE- * MENTS SHOULD BE IN THIS FILE. * LST ON ********************************* * * OBJECT CODE MODULE STRUCTURE -------- * * This code assembles into 3 object files: L(oader), M(ainli`bcdefghne), * and K (a satellite of M). They are bundled together by LINKKLM into * the load module SHELL, which is CONVERTed to the distributed disk * (along with K, for the Printerrupt disk.) * * FILE ORG LOAD POINT * in SHELL file * * K 230 E30 80-column driver; subroutines of M * L 804 804 Loads K&M into snapshot card, then dies. * M A800 1000 main code kept in snapshot card * ********************************** * LST OFF * SHUTTLE EQU 0 SHUTTLE2 EQU 0 SHUTTLE2E EQU 0 COPYKIT EQU 0 COPYKIT2E EQU 0 COPYKIT2 EQU 0 PRINTERRUPT EQU 0 ;set to 1 for the P'rupt's shell only. affects msgs. SHELL EQU 1 ISRWOTS EQU 0 ENGLISH EQU 1 GERMAN EQU 0 AUXINTRLEAV EQU 0 DIAGNOSTICS EQU 0 GOMON EQU 1 CODEINSTACK EQU 1 ; INCLUDE /S/COMMON/EQUATES ORG KORG ;LEAVE ROOM FOR ONE LINE OF KEYBD BUFFER KSTART EQU * NOP ;DUMMY PAGE 2 SECTION ORG KSTART+$D0 ;=0300 PAGE3 EQU * YY11 EQU * INCLUDE /S/COMMON/MSGOUT YY10 EQU * XX11 EQU *-YY11 INCLUDE /S/COMMON/DETVID YY9 EQU * XX10 EQU *-YY10 YY8 EQU * XX9 EQU *-YY9 ; LST ON ENDCODE3 EQU * IFGT *-$3F2 ;DOES PRECEDING CODE CLOBBER RESET VECTOR? FAIL 3,.TOO MUCH CODE BEFORE $03F2 RESET VECTOR. FIN ; LST OFF ORG PAGE3+$F2 INCLUDE /S/COMMON/VECTORS ; ORG $804 ;****** OBJ CODE MODULE 'L' STARTS HERE ****** INCLUDE /S/COMMON/LOADER INCLUDE /S/COMMON/SSUTES INCLUDE /S/COMMON/CALLDOS INCLUDE /S/COMMON/SWAP1 INCLUDE /S/COMMON/PRMENU INCLUDE /S/COMMON/CHANGEDRIVE ;;LST OFF ENDCODEF EQU * IFGT *-$E30 ;DOES PRECEDING CODE CLOBBER NMIHANDLER2? FAIL 3,.TOO MUCH CODE BEFORE $0E30 IN CKCODE FIN INCLUDE /S/COMMON/NMIHANDLER2 INCLUDE /S/COMMON/NMIHANDLER1 INCLUDE /S/COMMON/NMIHANDLER3 INCLUDE /S/COMMON/SWAP2E YY7 EQU * XX8 EQU *-YY8 INCLUDE /S/COMMON/TEXTSWAP YY6 EQU * XX7 EQU *-YY7 INCLUDE /S/COMMON/SAVE ENDPAGEA9 EQU * IFGT *-$AA00 ;DOES PRECEDING CODE OVERSHOOT PG A9? FAIL 3,.TOO MUCH CODE ON PAGE A9!. FIN ;LST OFF ;LST OFF LST ON ORG DRIVER+$200 ;=$AA00 LST ON INCLUDE JUMPTABLE LST OFF ;;LST OFF YY5 EQU * XX6 EQU *-YY6 INCLUDE /S/COMMON/MAINLINE INCLUDE /S/COMMON/BOOTADISK INCLUDE /S/COMMON/RESUME YY4 EQU * XX5 EQU *-YY5 INCLUDE /S/COMMON/SWITCHES YY3 EQU * XX4 EQU *-YY4 YY2 EQU * XX3 EQU *-YY3 INCLUDE /S/COMMON/DETVIDA YY1 EQU * XX2 EQU *-YY2 XX1 EQU *-YY1 INCLUDE SWAPALL LST ON ************************************************ * * * NOTE THE ADDRESS IN THE LEFTMOST COLUMN. * * THIS IS THE ADDRESS AT WHICH THE SHELL * * ENDS (IN THIS VERSION OF THE SHELL). * * IF THE EGG IS TOO BIG TO BEGIN AT $B000, * * IT MAY SAFELY BEGIN HERE. YOU MUST CHANGE * * THE JMP AT $AA00 TO JUMP TO THE EGG'S TRUE * * START ADDRESS. * * * ************************************************ * * LST OFF ORG DRIVER+$800 RTS DO PRINTERRUPT RWTSE EQU * ;dummy label ELSE INCLUDE /S/COMMON/RWOTS ;LST OFF LST ON INCLUDE /S/COMMON/RWTSE INCLUDE /S/COMMON/DCT ;LST OFF FIN ENDCODEBF EQU * IFGT *-$C000 ;DOES PRECEDING CODE EXTEND INTO C000? FAIL 3,.TOO MUCH CODE BEFORE $C000 FIN ;LST OFF,NOVSYM,ASYM ;LST OFF,NOVSYM,NOASYM LST ON,VSYM,ASYM SBTL .VECTORS FOR INTRFACE WITH USER PGM. ; JUSERPGM JMP $B000 ;BEGINNING OF USER PGM JRESUME JMP RESUME ;RESUME INTERRUPTED PGM JMP DETVID ;GET VIDEO MODE FROM USER, PUT IN 'SOFT' JMP SETSOFT ;SET SOFT SWITCHES TO MATCH ACCUM. JMP GETSOFT ;GET CURRENT S.SWITCH VALUES IN ACCUM JMP ISIT128K2E ;SET '=' FLAG IF 128K //E JMP HAY80COL ;SET '=' FLAG IF THERE'S ; AN 80-COL CARD JMP ISITA2E ;SET '=' FLAG IF IT'S A //E JMP TEXT1WAY ;COPY INTERRUPTED PGM'S TEXT PG 1 TO 0400 JMP MSGOUT ;SCRN OikUTPUT ROUTINE ; JMP RWTSE ;ENTRY TO RWTS JMP BOOTADISK ;RESUME AT CN00 WHERE N IS VALUE IN ACCUM. ; IF ACCUM=0, COLDSTART APPLE. JMP MSGOUT1 ;LIKE MSGOUT, BUT ON ENTRY X- AND Y- ; REGISTERS SPECIFY HORIZ AND VERT CURSOR POSITION JMP SWAPALL ;COPY INTERRUPTED PGM'S PAGES A8-BF AND ; 0-7 TO PGS 68-7F AND 80-87 DW CNVRTFLG ;ADDRESS OF FLAG TESTED BY MSGOUT. IF FLAG IS NONZERO, ; MSGOUT CONVERTS LOWERCASE TO UPPERCASE. ; AT LOAD TIME, FLAG IS SET ZERO FOR //E, NONZERO FOR II+. SWAPALL EQU * LDX # TO RETURN TO MENU' ; ;SET OWN KEYIN ROUTINE TO WATCH FOR ESC JSR SETFILTER * * LDA #0 STA SWAPFLAG ; *SET.UP.REGS.AT.INTERRUPT.TO.BE.DISPLAYED.ON.SCREEN LDX XSTOW ;X-REG SAVED BY SHELL LDY YSTOW LDA ASTOW JSR SAVE ;SAVE 3 REGS IN OLDMON'S AREA LDA STATSTOW ;STATUS REG SAVED BY SHELL STA STATUS ;SAVE STATUS LDA STACKPTR STA SPNT ;SAVE PTR LDA RHSTOW STA PCH ;SAVE PC LDA RLSTOW STA PCL ;DISPLAY REGS AND GO TO MONITOR JSR INSDS1 ;SHOW ADDR JSR RGDSP1 ;AND REGS JMP MON ; * * KEYFILTER EQU * ;INTERCEPT.KBD.CALLS JSR KEYIN ;GET A KEY CMP #ESC ;ESCAPE? BEQ GOTESC CMP #$82 ;CTRL-B BEQ GOTESC CMP #$83 ;CTRL-C BEQ GOTESC CMP #$99 ;CTRL-Y BNE NOTCTRLY JSR CTRLYPGM JMP KEYFILTER ;LOOP FOR NEXT CHAR NOTCTRLY EQU * RTS ; ; GOTESC EQU * LDA SWAPFLAG ;IS SSRAM SWAPPED OUT? BEQ DONTSWAP JSR CTRLYPGM DONTSWAP EQU * ; ****EXIT TO CALLER ; LDX TEMPSTK ;RESTORE STACK PTR TXS ;AS IT WAS AT ENTRY RTS ;AND RETURN TO USER PGM TEMPSTK DFB 0 ;TEMP STACK CACHE * SETFILTER EQU * ;POINT KBD VECTOR TO KEYFILTER LDA #>KEYFILTER STA KSWL LDA #. ASC . to return to menu). DFB 0 RTS MSB ON ;PRODOS DEFAULTS MSB OFF ꀠ頠蠠渰ˠ堠栠堷ՠ𠰠󠠠堠젠ˠ㠠ŀ쭩ᠠ$ [hh , LHH`8$HjJJJJh)?` ` ` , )睊- ` 䬠堼þ`ŠƪyL|L  X b A4BЍC Q F t @  J ( m BF 3 X -  H hLo      ƩJQ`fm騍 7?٨쨍嗀<è D}W ը6  ܨ #)x 8 (8 )8  Hh @   | Lv 0`)` ` Š̠ X  uwx ` , 6 `: <  ` `x   x  v w`  <<<<<<<8;Ϩ̨᨝䨝` H  h Hh`x60,*  L* hL L L L (`   8L 5 `; 9 M Lr `8 ` XM``L m ` `  o` y ` 㾠  ԫ٫ޫ ۫`ҫ ҫ`dž ) ``< A `8` 8 Xɛ0M`(` /`L n Πˍ` ΠōH hh` hhȎ  l !%0e%%$ 7 L !`!$$ȱF$`%  , \ L< \ ``  ` ` ` ӭɍ`ɯɸ `)` 忠򠲩 ` X $ՠŠԠĠҠŭŠ͠ΠӍ٠ƠŠ̍ŠŠŠ̠̠κנϠԠΠǠΠŠ̢þ,ɛ,`LŰLLLuLLLL O݈ƛ$$,--'ةō oQT6789a, 9 X ŠԠéˠҠ A QTR  ZɈ ɕɍ"  L, H+H HH`#ԳbN^DZ $ȱ$ɱ `H h` Ԡ נϠ Р ԠРz|}~ РϠ Š ԠŠϠ Š͠Π!/@Rd| ӯԯ űŲگԮԯԮ ̯ ϭůŭůԭ  ϭدүүį /L_ % $ ӠӺҮōԠō٠H h`8f>h $i$>?,2jɯ > (L X ӠŠϠΠϠլ٠ҠӠϠԠŮӠ̠ŠԠӠĮ ZWRH b Zɛ hiLŰ f~ f ~LWRfPP T~U@` 8h $ۑ('ݑ( ZɛQɈɕɠ(ɍ$ ! Ƣ  !  L 8figf L !L,((`aM0,c@H,0h` $h ,`,` pfL~ Ǹ(,P,- 3 *H yh 0ɛLƵ`(8)(H$-0(y(*y*L)y)+y+*++())hhhhLh( ӷL~L* Ḭ( j+) j,+ Ḭ( j.) j/`(H)@ @(h`~L* Ḭ(+(),(+ Ḭ(.()/(`ن`,- *H h 0ɛLTQ`!0â!H$-0!y!"y"%y%LH#y#$y$&y&%&*&#!#"$#$ hhhhhhL¶h! ӷL¶%!"  ̷&#$  ̷%#$  ̷&!" 0L]0` ɛ)` ɍ ,X @ L X ҠҠԭРǠΠӠ3 g) MLŰ pfL&ɠ&** ~L Ǹ*H ( ) h+i`(), @LM M-LK`)(')()(` ~)i)`, M`jjjŲ3'~ ,@ 5 $L;LL\ % b  HI` bh 8&`<=8#!>$"? !" S ** `/ . %*I&/Ls!" S #$ S   HI` h 8+*J@0Lӹ`<=?8&%> %0* 2&`/ . %*I&/F*@*L:Ls#$ S !" S  HI` h 8+* Ȅ0Lq`<=?8&%> &0* Ѻ%L`/ . %*I&/**Ls+0,`&H H'I`'hhQ&`h&`h1&`h`H)&JJ&&h' &' &' f&')'`#i媽s0*` @, F/*/H/'/&/)U&/I&/)U- Mh`ɩ0 0$00 M` d& i =-.8-e>-.e?. - M.LM-.L`,H,P.) M(` @A A@`(Ȇ)(iP()i)`*H Y ( ) h+i` ߼)LM* Y( ) + Y ( ߼I,Ϯî(,`,Ϯî(```H h`(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L, ŝ8𨍙,L   ` `XL8ݨިިިݨ` `hH (` H(`LLLOL*LRLݬLeLmL٩LL4LLLۭF x m RLL Ь #) ԫL ߫  ҫ ҫ ( X L @ I `,0` / X ` X x x   &L` x  x8 E ( Ь  * 4 {L0)ɀ` m0  { {ͨ {Ш {&j {D`j`0 jj`X)x` ҫԫ ҫ ) - ҫ ߫ `ĎݫĠ@Lĺ#)X )x` I )ɬhjjjMa,^`,_` PRTV $dިHHwݨ.ި.ݨhh` m >* `#)I`vw(`   `0 `ˬ Ǭˬ`Y`)&`#)Ɍ` , ,` ,ϊ  ,`Ƞ `H) ӭ h cH * ɛHh0h iLOh RL3 8 ( h` 8 ʽt `$8(0 4$ )IOB ;(LOW BYTH OF ADDR) B638:20 AA B3 29 JSR RWTS ;CALL DOS ROUTINE B63B:B0 05 B642 30 BCS RETURNN ;IF CARRY IS NOT SET, B63D:A9 00 31 LDA #0 ;THEN ERROR CODE IS GARBAGE B63F:8D 50 B6 32 STA ERROR ;SO CLEAR IT. B642: B642 33 RETURNN EQU * B642:60 34 RTS B643: 35 *********************************** B643: 36 * * B643: 37 * I/O BLOCK * B643: 38 * * B643: 39 ********************************** B643:01 42 IOB DFB 01 ;IOB TYPE B644: 05F8 43 DOSSLOT EQU $5F8 ;DOS.SLOT.#*10 B644:60 44 SLOT DFB $60 ;SLOT # TIMES 16 B645:01 45 DRIVE DFB 1 ;DRIVE # B646:00 46 XVOL DFB 0 ;VOLUME # B647:00 47 TRACK DFB 0 B648:00 48 SECTOR DFB 0 B649:55 B6 49 DCTAD DW DCT ;ADDRESS (LO,HI) OF DEVICE TABLE B64B:00 00 50 BUFFADDR DFB 0,0 ;ADDR OF DATA BUFFER B64D:00 00 51 DFB 0,0 ;UNUSED B64F:00 52 COMMAND DFB 0 ;COMMAND: B650: 53 * 0 = START DRIVE ONLY B650: 54 * 1 = READ SECTOR B650: 55 * 2 = WRITE SECTOR B650: 56 * 4 = FORMAT DISKETTE B650:00 57 ERROR DFB 0 ;ERROR CODE (ONLY APPLIES IF RWTS SETS THE CARRY FLAG): B651: 0010 58 WRTERR EQU $10 = WRITE-PROTECTED DISKETTE B651: 0020 59 VOLERR EQU $20 = UNSPECIFIED VOLUME # 26 /S/COMMON/RWTSE POINT REGISTERS, CALL DOS 09-SEP-85 PAGE 7 B651: 0040 60 DRVERR EQU $40 = DRIVE ERROR (VERY ODD) B651: 0080 61 READERR EQU $80 = READ ERROR (UNABLE TO READ SECTOR) B651:00 62 VOLUME DFB 0 ;VOL # FOUND BY RWTS B652:60 63 LSLOT DFB $60 ;LAST SLOT ACCESSED BEFORE THIS ONE, TIMES 16 B653:01 64 LDRIVE DFB 1 ;LAST DRIVE ACCESSED B654: 66 ; B654: 67 ********************************* B654: 68 * B654: 69 * ASSOCIATED PARAMETERS B654: 70 * B654: 71 ********************************* B654: 72 ; B654:00 73 REALPAGE DFB 0 ;HOME OF PAGE IN RAM B655: 159 INCLUDE /S/COMMON/DCT B655: 1 ********************************* B655: 2 *DEVICE CHARACTERISTICS TABLE * B655: 3 ********************************* B655:00 5 DCT DFB 0 ;DEVICE TYPE 0: DISK II DRIVE B656:01 6 PPTC DFB 1 ;#OF PHASES PER TRACK B657:EF D8 7 MONTC DFB $EF,$D8 ;MOTOR ON TIME COUNT COMPLETED, IN 100 MCS INTERVALS B659: 160 ;LST OFF B659: 161 FIN B659: B659 162 ENDCODEBF EQU * B659: F659 163 IFGT *-$C000 ;DOES PRECEDING CODE EXTEND INTO C000? S 164 FAIL 3,.TOO MUCH CODE BEFORE $C000 B659: 165 FIN B659: 166 ;LST OFF,NOVSYM,ASYM ** SUCCESSFUL ASSEMBLY := NO ERRORS ** ASSEMBLER CREATED ON 14-DEC-83 15:21 ** TOTAL LINES ASSEMBLED 5521 ** FREE SPACE PAGE COUNT 44 >J>J>VU)?`8'x0|&HhHh VY)'&Y)xꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*xS&x'8*3Ixix&& 8  '  & x)*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 -h $50x`  !"#$%&'()*+,-./0123456789:;<=>?80^݌Hh m m݌   A nD n? nAEDE?HJ>h ~   `HJ>݌h Hh݌`ɠîРŠHIHHHHhHH݌hHhHh݌H6 VDP y(ED N$0x8x D- ܰDD# H8`?E k *f???0x鵈E ȵ ȵ ȵHh D#-EEE8` D ܰx D - ܰx8`-0ݩ?ʥD EEE`H to return to menu)`_#KLM, n_NOEGGMSG.0k_%NOEGGn_MAKE.CKCODE|n_MAKE.SHELLn_'LINKKLM_%SHELL, a_L  X k A4BЍC Q O } I  S ` 뭩ﭩ 3 X 6  H hLo      ƩJQ`fm騍 7?٨쨍嗀<è D}W ը6  ܨ [)x 8 (8 )8  Hh  I   | Lv 0`)` ` ŠԠį X  ` 5 ? `C E  ` `݁   ݁  `  <<<<<<<8;Ϩ̨᨝䨝` H  h Hh`x60,* L* hL L L L (`   8L > `D B M L{ `8 ` XM``L   ` `  o`  ` 㾠   `  `dž 2 ``E J `8` 8 Xɛ-M`%``L t Πˍ` ΠōH hh` hhȎ  l !%0e%%$ = L !`!$$ȱF$`%   խ  b LB b ``  ` ` ` h ɍ`ɯɸ `)` 忠򠲩 ` l ``L  ΠƲ` ΠñH hƠϠàӈӠɠϠŠĠ̠͠ҠҠàƠϠ̠Ӡנ̠Š̠֠֠͠ҠƠϠ࠯ӠРҠϠŠΠ̠͠ҠӠàƠϠ x x   &L,`  L\  \ 0[)  L<     ` X L< @ I `,0` / X ` XhH (` H(`ŠΠ͠L1(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L< ŝ8𨍙,L _  ` `XL8ݨިިިݨ` `ҠנàƠӠLL* `[)I`(` 嫅   `0 ` `Y`)&`[)Ɍ` , .,` O,ϊ $ O ,`Ƞ ` , )睊- ` 䬠堼þ`H) t \h 1H b tɛHh0h 7Lh L O8 ` \h` M8 MʽB `$8(0 4$ )H hɠ ),0 y,0L! Ȳ,  Lj ϥ6 ` Q) ` ۵`  L  ` [ [)i( Ѷɛ (ٍ`H) C(H Ah h `H$h),  @ [`)`LC0 bdZŸ堨庠亠庠61Ӡ㬠련LǸ` "M` X © H X AhLM` 9`ԠԠˠΠŠ &ր!!I & L ^蝩j`AwwL$ d  ֬  A`  u L>J>J>VU)?`8'0|&HhHh VY)'&Y)ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*͇S&'8*3Ii·&& 8  '  & )*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 h $50`  !"#$%&'()*+,-./0123456789:;<=>?HIHHHHhHH݌hHhHh݌H6 -*^>-*>&` aI꽌ɪVɭ&Y>,&>-&Y>,&*>, 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*/S&/'8*3I/i/&& 8 ,,O, >,' /,[, >,& >,/)*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 .h $50//`  !"#$%&'()*+,-./0123456789:;<=>?HI//HHHHhHH݌hHhHh/݌H6 ,/H .(G FG HSj0// +$//H` w,/(/ .h .LI..//H w,h/h@(L. Hg,)-Ю( +(& +/$8 H`H to return tothe interrupted program),ɛ,` SBTL .PUT 'NO EGG PRESENT' MSG ON SCREEN' SKP 1 ***EQUATES TO ADDRS WITHIN SHELL ; MSB ON ; STACKPTR EQU $A808 ASTOW EQU $A810 XSTOW EQU $A811 YSTOW EQU $A812 RHSTOW EQU $A813 RLSTOW EQU $A814 STATSTOW EQU $A815 ; MSGOUT1 EQU $AA24 SWAPALL EQU $AA27 ; ***MONITOR ADDRS BREAK2 EQU $FA96 ;MONITOR ROUTINES AND VARIABLES SAVE EQU $FF4A SPNT EQU $49 ;STACK PTR STATUS EQU $48 KSWH EQU $39 OLDBRK EQU $FA59 PCL EQU $3A PCH EQU $3B CTRLYVEC EQU $3F9 ; SBTL .EQUATES. HOME EQU $FC58 RDKEY EQU $FD0C ;VECTORS THRU KSW TO KEYIN KEYIN EQU $FD1B ;'KEYIN' INSDS1 EQU $F882 RGDSP1 EQU $FADA ;SHOW REGS MON EQU $FF65 ;MONITOR ; ***** KEYS ***** ESC EQU $9B ESCAPE EQU $9B LARROW EQU $88 RARROW EQU $95 UPARROW EQU $8B DNARROW EQU $8A RETURN EQU $8D CR EQU $8D CTRL.D EQU $84 BLANK EQU $A0 ASTERISK EQU $AA CTRLY EQU $99 CTRLQ EQU $91 CTRLU EQU $15 EIGHT EQU $B8 FOUR EQU $B4 ; ;***** SCREEN CHARS ***** CURSOR EQU $20 ;INVERSE SPACE ***** TEXT SCREEN PARAMS ***** CV EQU $25 CHAR VERT POSITION CH EQU $24 HORZ TOPEDGE EQU $22 ;TOP EDGE OF WINDOW STORED HERE. ; ***** I/O LOCATIONS ***** SPEAKER EQU $C030 CSWL EQU $36 KSWL EQU $38 WNDWDTH EQU $21 ;WINDOW WIDTH PROMPT EQU $33 ;CHAR DISPLAYED ; ; ORG $B000 ; JSR HOME LDY #10 ;VERTICAL TAB LDX #0 ;HORIZONTAL TAB JSR MSGOUT1 ASC .YOU HAVE NOT INSTALLED YOUR MACHINE-. DFB CR,CR ASC .LANGUAGE PROGRAM IN THIS. DFB CR,CR ASC .COPY OF THE SHELL. DFB CR,CR ASC .PLEASE SEE THE SHELL MANUAL SECTION: DFB CR,CR ASC ."HOW TO PUT AN EGG IN THE SHELL". DFB CR,CR RMSG ASC .(Press . ASC .. ASC . to return to. DFB CR ASC .the interrupted program). DFB 0 BIT $C010 ;CLEAR KEYBD GETESC EQU * LDA $C000 ;READ KEYBD CMP #ESCAPE BNE GETESC BIT $C010 ;CLEAR KEYBD RTS :"MON C,I,O"+ "UNLOCK CKCODE"D"BLOAD KLM,A$1000"g"BSAVE CKCODE,A$1000,L$2C80"z("DELETE KLM":"MON C,I,O"* "UNLOCK SHELL"C"BLOAD KLM,A$1000"e"BSAVE SHELL,A$1000,L$2C80"x("DELETE KLM"2"DELETE MAKE.SHELL"100: GET AND SET PREFIXI(4);"BLOAD /S/COPYKIT/CKCODE,A$C04"c (4);"BLOADM,A$1400"X$"SHELL"ĺ(4);"BLOAD NOEGG.0,A$1C00"X$"SHUTTLE"ĺ(4)"BLOAD K,A$1210":22(4);"BLOADK,A$1230"(4);"BLOAD L,A$C04"6 X$"COPYKIT"X$"copykit"İ4000: BLOAD STANDALONE MODULEY ((4);"BSAVE"Y$",A$C04,L$2C80"r F(4);"PREFIX /MENU" K(4);"-STARTUP" P d n"COPYKIT, SHUTTLE2E, SHUTTLE2, OR SHELL";X$ qY$X$ s(X$,7)"SHUTTLE"Y$X$:X$"SHUTTLE" x(4);"PREFIX /S/"X$ & , P (4);"BLOAD /S/STAND/O,A$2C00"y (4);"BLOAD /S/STAND/P,A$2CFE,TREL" (4);"BLOAD N,A$2600": PRINT SCREEN DRIVER  L  X b A4BЍC Q F t @  J ( m BF 3 X -  H hLo      ƩJQ`fm騍 7?٨쨍嗀<è D}W ը6  ܨ #)x 8 (8 )8  Hh @   | Lv 0`)` ` Š̠ X   ` , 6 `: <  ` `x   x  v w`  <<<<<<<8;Ϩ̨᨝䨝` H  h Hh`x60,*  L* hL L L L (`   8L 5 `; 9 M Lr `8 ` XM``L m ` `  o` y ` 㾠  ԫ٫ޫ ۫`ҫ ҫ`dž ) ``< A `8` 8 Xɛ0M`(` /`L n Πˍ` ΠōH hh` hhȎ  l !%0e%%$ 7 L !`!$$ȱF$`%  , \ L< \ ``  ` ` ` ӭɍ`ɯɸ `)` 忠򠲩 ` ; MAY WRITE IT OUT TO DISK (ALTHOUGH THE DATA IN MEMORY WILL ; BE TRASHED.) LIKEWISE, YOU Mꀠ頠蠠渰ˠ堠栠堷ՠ𠰠󠠠堠젠ˠ㠠ŀ쭩ᠠ$ [hh , LHH`8$HjJJJJh)?` ` ` , )睊- ` 䬠堼þ`ŠƪyL|(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L, ŝ8𨍙,L   ` `XL8ݨިިިݨ` `hH (` H(`LLLOL*LRLݬLeLmL٩LL4LLLۭF x m RLL Ь #) ԫL ߫  ҫ ҫ ( X L @ I `,0` / X ` X x x   &L` x  x8 E ( Ь  * 4 {L0)ɀ` m0  { {ͨ {Ш {&j {D`j`0 jj`X)x` ҫԫ ҫ ) - ҫ ߫ `ĎݫĠ@Lĺ#)X )x` I )ɬhjjjMa,^`,_` PRTV $dިHHwݨ.ި.ݨhh` m >* `#)I`vw(`   `0 `ˬ Ǭˬ`Y`)&`#)Ɍ` , ,` ,ϊ  ,`Ƞ `H) ӭ h cH * ɛHh0h iLOh RL3 8 ( h` 8 ʽt `$8(0 4$ )@Աӱ@б@e@@jЩ$# {  { / XXύX?klmnÍoL) !6L'!(0`670! = ***)<JJH !h穖tp% !Z/݀!!' ! !5).莀/ ! !!!!! !!$ ! "<" !!뭳!!!!ILYL 8!9!詍` ! !x!STARTUP/pŠϠŠà͠ӠàԠŬH06172839h` 97L75v^͘ ?/( ?LKLLɍ$?`? ɍɥAH93827160hH46576879h`,C Lޛ $0. ɍ  ,S0 ?@ L L 왻ɠ, XLޭBDEF޾ p 7 ޾ p($ذ (0 U( L?ԦʚLeةީ s +  L ,FL,DLE,C0!3 > Ɉ 3ɾL(3ɾ;Ƀ UB94 % ʽ  ٚ,S` w $݅3`(l8L"3L>(Ƀ,`3,G0]ɾ ` w`پ_پ p _پ׾`>( p۾m׾) W)ʩ@`ɾ>(O puȾ ɾ-O c־Jjjj `O>0O  矢POپھ p AH־Ǿh۰8L"־Jjjjɾ)Ⱦ8 + OL L$L>(F`־ؾپھ׾` Ʉ +KDEF L LK KɍKL"?`  L@3 @LtJ)s@J % `͘?s?,E30ɍФ3 +E3HD F3 Ʉ%h3 M +E  LthɍLL3`3,A0s0% Ipn + {pnI:L ؅30,3L]8^933LAAJL ةޘг uv $ 8LЌ Le p>?@`>?@`BQ8`e 矮K ⟩ 䟢 춼LK  z KK`JJJJ8`轚K)` 7#hhL"Jپھ pHJh` {!hgt}~p  `~t}p8n~ni}tpi~~tsLo8pinii>j?k̈́>~|p|Ii||̈́ ҡl 4 j `>i>?Ek?!>Q>>>̀ `` > ̀ `e>>?́?>?Emn(>e>ȱ>e?>Q>ؠ> ie>>?`|;}=:<~:<=;`||m};>:8o>oȑ>ppȑ>> :op` {KpnͶ @p;=po:i>?Ek?>Q>> 5L壥>  5e>>?́?`>ȥj>>m>` T`m8injkiljo풼S ?@$I0 U)VJ *T)`l8`a HbIJhjǾȾɾ p٭b=a to boot ` c ܳ ` ```̞H >h(  >`(i ﯭ(Hh r (H h ` ѯ _`  J | b `а `` ]`=?C`py|`*`` C ˍˍ j )  `̠ۢXL[L  X M  Q 5 d     8 CG 3 ; b   O X b    H hL      JQ`fm騍 7?٨쨍嗀<è D}p ը6  ܨ R o )x 8 (8 )8  Hh `    L 0`` o )x 8 R , 7 N L(1 0  )` ` \ ŠԠ X k `o ` 󠰠 `` `: B  : B AJ B`  <<<<<<<8;Ϩ̨᨝䨝` H)hH)h H h Hh`x60,* L* hL L L L (`   8L  `  x`ML`b `8 ` XM``L `  o`o X ` 㾠 H)ih ` `dž  ``+ 0 `8` 8 XɛIM`0` /`  -Lv e Πˍ` ~ Πñ ΠōH hh` hhȎ  l (j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H \ oL oŝ,L 챢  ` `XL8ݨިިިݨ` 詠 þ`" [ X"$ [' ` G 8 L( Y ) ͘L̪   X dH h L[  ̪7 `@ I `,0` / X ` X ` Y  Y8 X Q  h n( Y 챭 ī w  \L0)ɀ` 80  L Lͨ LШ Lj LD`j`0 jj`X)x|`͘ ) - `ĎĠ@Lĺ)X )x`  )I )ɬhjjjMa,^`,_` PRTV $dިHHBݨ.ި櫐.ݨhh` 8 >* `)I`AB(`.*.*C`)&`)Ɍ` , ,` ,ϊ u  ,`YȈ`!%0e%%$ L!`!$$ȱF$`%  b - , L ``   S Y  8 ``` J , f ) J J  J( 0 ` | %  (` 󯩐{  % %8  `8``  v   O , S ` a 7  @ @ 78`h n` P P``a_Ǡˡ 詢 PLEASE WAIT`_WRITE-PROTECTEDDISK_DRIVEERROR_DISK READ ERROR` 詢 ˠٯΩ ` 8`` ! r` 詢 ATTENTION!報ξ`   `8`8`,,`,,`,`h `i)I ﯭ` `80,{ȱȱ) ȱȱȱ` U MFH, 7h@ɀ28[8 ( ®(`8`{`ɛ`` &x (/"/ &0   &x   { , )睊-  ,` 䬠堼þ`ɛ`lH)z  r h H ɛHh0h ıLh L ܱ8 h` ڱ8 ڱʽϱ z`$8(0 4$ )<ϱ `  `, ,` ` % əLe8`+` c 0QR ײ 0TZ`  ` ` c ` rɍ`ɯɸ `)` ` 忠򠲩 ` J |  ` :` 詢  `. *n  )  ` `c ܳ 0 L Ll ˳`% '( +(`;0c ˳` `*IrJs`y;%` D | E , E ( ` :`` :` :`8$x{  `,0Lv 忠򠲩 ` X 5 ( bHI;: H#Le ɛɂɃ ə )L`( )#l89`(I( į` ` ` ` X `  ` " `&` X  L6 ɛ ɛ)H hɠ ),0 ,0L` ϥ6L ` ) ` ` 0 ʶLɶ 8 ʶ 8` [ [)i( ɛ (ٍ`H) (H h h `H$h),K @ [`)`LLH` ϮM` X p c H X hLL`x `|ԠԠˠΠŠ į&ր!!I & įL̪ į^蝩j`AwwL 1 7 N `  u  H(`c;0Ӱ̪M1۷AF堨庠亠庠61Ӡ㬠련 u``q`$ [hh - LHH`8$HjJJJJh)@` ` `Qa`hH (`ؠjf5HhHh݌﹙6 ؅G dVj 0 D$Φ󭖻H` yΩ( dh dLҺ.̖H yhΞh@(LS.iHhJJJJHh)-Т( ܽ(& ½$8` * lN`* $50*$50LJJJJ` Ӯ ҐĦ̦âѠڮϢզĮ̦Š̢ϮǦҢԐզԶՀԮ֦ϦצڦӠڦӦӦɦͦڢԀզĶŀ֮ϠצڮӦ¢ϢӢզ>J>J>VU)?`8'0|&HhHh VY)'&Y)ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*͖S&'8*3IiΖ&& 8  '  & )*++`FG8`0($ p,&"Э{I峁^,Ȗd2Hjf5 h $50`Ϧ  !"#$%&'()*+,-./0123456789:;<=>? SBTL .COPYKIT TOP LEVEL. LST OFF,NOVSYM,NOASYM ;LST ON,VSYM,ASYM * * ********************************* * * SNAPSHOT COPYKIT TOP LEVEL--- * * THIS FILE CONTAINS THE * 'INCLUDES' FOR THE ENTIRE REST * OF THE COPYKIT. TO ASSEMBLE IT * TYPE 'PFX /S/COPYKIT : ASM * COPYKITT,K'. * ALL 'LST' AND 'ORG' STATE- * MENTS SHOULD BE IN THIS FILE. * ********************************* * * OBJECT CODE MODULE STRUCTURE -------- * * This code assembles into 4 object files: L(oader), M(ainline), * K (a satellite of M), and N (a dummy print dump driver). * LINKKLM bundles them together into /S/COPYKIT/KLM. It, K, and N are * then CONVERTed to a Copykit disk, where MAKE CKCODE is run to over- * lay them onto the former CKCODE. * * FILE ORG LOAD POINT * in KLM * * K 230 E30 suboutines of M; 80-col driver * 300 F00 80-col-card driver overlays * L 804 804 Loads K&M into snapshot card, then dies. * M A800 1000 main code kept in snapshot card * N BA00 2200 80-col print screen driver overlay * O 2800 2800 standalone loader (fixed part) * P 2900 2900 standalone loader (relocatable part) * ********************************** * * COPYKIT EQU 1 COPYKIT2 EQU 0 COPYKIT2E EQU 1 APPLE2E EQU 1 SHUTTLE EQU 0 SHUTTLE2 EQU 0 SHUTTLE2E EQU 0 SHELL EQU 0 UNIDISK EQU 0 ISRWOTS EQU 1 ENGLISH EQU 1 GERMAN EQU 0 PRINTERRUPT EQU 0 AUXINTRLEAV EQU 1 DIAGNOSTICS EQU 0 GOMON EQU 0 CODEINSTACK EQU 0 ; INCLUDE /S/COMMON/EQUATES ORG KORG ;LEAVE ROOM FOR ONE LINE OF KEYBD BUFFER KSTART EQU * INCLUDE /S/COMMON/BOOTADISK INCLUDE /S/COMMON/GET.FLAGPAGE DO COPYKIT2 ENDCODE2 EQU * IFGT *-$2FF ;DOES PRECEDING CODE CLOBBER PAGE 3? FAIL 3,.TOO MUCH CODE ON PAGE TWO. FIN DO COPYKIT2 ORG KSTART+$D0 ;=0300 FIN PAGE3 EQU $0300 INCLUDE /S/COMMON/V2E80COL INCLUDE /S/COMMON/SWAPAUX INCLUDE /S/COMMON/SETPGMSIZE ; ENDCODE3 EQU * IFGT *-$3F2 ;DOES PRECEDING CODE CLOBBER RESET VECTOR? FAIL 3,.TOO MUCH CODE BEFORE $03F2 RESET VECTOR. FIN ; DO SHUTTLE2 ORG PAGE3+$F2 ;reset vector begins at 03F2 ELSE ORG KSTART+$1C2 ;assumes KORG is 0230. FIN INCLUDE /S/COMMON/VECTORS ; ORG $804 ;****** OBJ CODE MODULE 'L' STARTS HERE ****** INCLUDE /S/COMMON/LOADER INCLUDE /S/COMMON/SSUTES INCLUDE /S/COMMON/CALLDOS INCLUDE /S/COMMON/SWAP1 ;LST ON ENDCODEF EQU * IFGT *-$E30 ;DOES PRECEDING CODE CLOBBER NMIHANDLER2? FAIL 3,.TOO MUCH CODE BEFORE $E300 IN CKCODE FIN INCLUDE /S/COMMON/NMIHANDLER2 INCLUDE /S/COMMON/NMIHANDLER1 INCLUDE /S/COMMON/NMIHANDLER3 INCLUDE /S/COMMON/SWAP2E ;LST OFF INCLUDE /S/COMMON/ESCMSG INCLUDE /S/COMMON/CLRMSGAREA ;LST ON INCLUDE /S/COMMON/MAINLINE ;LST OFF INCLUDE /S/COMMON/RESUME INCLUDE /S/COMMON/SWITCHES ;LST OFF INCLUDE /S/COMMON/PRMENU ;LST ON INCLUDE /S/COMMON/DUMP INCLUDE /S/COMMON/LOAD INCLUDE /S/COMMON/BLOCKIO INCLUDE /S/COMMON/TABLE ;LST OFF INCLUDE /S/COMMON/DETVID INCLUDE /S/COMMON/EXITIFESC INCLUDE /S/COMMON/DETVIDA INCLUDE /S/COMMON/CHANGEDRIVE INCLUDE /S/COMMON/CLEAR DO 1 INCLUDE /S/COMMON/SET80CARD ELSE INCLUDE /S/COMMON/WILLMSG FIN INCLUDE /S/COMMON/GETSR.A INCLUDE /S/COMMON/FINDRPTDAREA LST ON INCLUDE /S/COMMON/SWAP1PAGE INCLUDE /S/COMMON/CHOICEMSG DO UNIDISK INCLUDE /S/COMMON/RWTSPRO LST OFF ELSE INCLUDE GOMONITOR INCLUDE /S/COMMON/GETPRINSLOT INCLUDE /S/COMMON/SCREENDUMP INCLUDE COPYDISK INCLUDE GOBASIC FIN INCLUDE /S/COMMON/RESTORE INCLUDE MENUTABLES LST ON INCLUDE /S/COMMON/RWTSE LST OFF DO COPYKIT2 ;not on //e LST ON ;**** END OF CODE BEFORE $BA00 (PRINT DRIVER) *********** IFGT *-$BA00 ;DOES PRECEDING CODE EXTEND INTO BA00? FAIL 3,.TOO MUCH CODE BEFORE $BA00 FIN LST OFF ; DO COPYKIT2 ORG DRIVER+$12E0 ;leave space for screen dump drivers FIN INCLUDE /S/COMMON/MSGOUT INCLUDE /S/COMMON/EOR.LOGO INCLUDE /S/COMMON/SAVE LST ON ;ADDR AT LEFT IS JUST BEFORE RWOTS FILES LST OFF INCLUDE /S/COMMON/DCT INCLUDE /S/COMMON/RWOTSEQUATES INCLUDE /S/COMMON/RWOTS2 LST OFF,NOVSYM,ASYM ENDCODEBD00 EQU * IFGT *-$BD00 ;DOES PRECEDING CODE EXTEND INTO C000? FAIL 3,.TOO MUCH CODE BEFORE $BD00 FIN LST ON ;END OF CODE UNTIL BD00 ENDDCODEBD00 EQU * LST OFF INCLUDE /S/COMMON/RWOTS1 ENDCODEBF EQU * IFGT *-$C000 ;DOES PRECEDING CODE EXTEND INTO C000? FAIL 3,.TOO MUCH CODE BEFORE $C000 FIN SPACELEFT EQU $BD00-ENDDCODEBD00 ;free space remaining!!!!!!!!! ;LST ON,VSYM,ASYM LST ON,VSYM,ASYM DO COPYKIT2 ORG $BA00 INCLUDE PRINTEXTOVLY FIN SOURCE FILE #01 =>COPYKIT INCLUDE FILE #02 =>/S/COMMON/EQUATES INCLUDE FILE #03 =>/S/COMMON/BOOTADISK INCLUDE FILE #04 =>/S/COMMON/V2E80COL INCLUDE FILE #05 =>/S/COMMON/SWAPAUX INCLUDE FILE #06 =>/S/COMMON/SETPGMSIZE INCLUDE FILE #07 =>/S/COMMON/GET.FLAGPAGE INCLUDE FILE #08 =>/S/COMMON/VECTORS INCLUDE FILE #09 =>/S/COMMON/LOADER INCLUDE FILE #10 =>/S/COMMON/SSUTES INCLUDE FILE #11 =>/S/COMMON/CALLDOS INCLUDE FILE #12 =>/S/COMMON/SWAP1 INCLUDE FILE #13 =>/S/COMMON/NMIHANDLER2 INCLUDE FILE #14 =>/S/COMMON/NMIHANDLER1 INCLUDE FILE #15 =>/S/COMMON/NMIHANDLER3 INCLUDE FILE #16 =>/S/COMMON/SWAPALL INCLUDE FILE #17 =>/S/COMMON/SWAP2E INCLUDE FILE #18 =>/S/COMMON/ESCMSG INCLUDE FILE #19 =>/S/COMMON/CLRMSGAREA INCLUDE FILE #20 =>/S/COMMON/MAINLINE INCLUDE FILE #21 =>/S/COMMON/RESUME INCLUDE FILE #22 =>/S/COMMON/SWITCHES INCLUDE FILE #23 =>/S/COMMON/PRMENU INCLUDE FILE #24 =>/S/COMMON/DUMP INCLUDE FILE #25 =>/S/COMMON/LOAD INCLUDE FILE #26 =>/S/COMMON/BLOCKIO INCLUDE FILE #27 =>/S/COMMON/TABLE INCLUDE FILE #28 =>/S/COMMON/DETVID INCLUDE FILE #29 =>/S/COMMON/EXITIFESC INCLUDE FILE #30 =>/S/COMMON/DETVIDA INCLUDE FILE #31 =>/S/COMMON/CHANGEDRIVE INCLUDE FILE #32 =>/S/COMMON/CLEAR INCLUDE FILE #33 =>/S/COMMON/SET80CARD INCLUDE FILE #34 =>/S/COMMON/GETSR.A INCLUDE FILE #35 =>/S/COMMON/FINDRPTDAREA INCLUDE FILE #36 =>/S/COMMON/SWAP1PAGE INCLUDE FILE #37 =>GOMONITOR INCLUDE FILE #38 =>/S/COMMON/CHOICEMSG INCLUDE FILE #39 =>/S/COMMON/GETPRINSLOT INCLUDE FILE #40 =>/S/COMMON/SCREENDUMP INCLUDE FILE #41 =>MENUTABLES INCLUDE FILE #42 =>COPYDISK INCLUDE FILE #43 =>GOBASIC INCLUDE FILE #44 =>/S/COMMON/RWOTS INCLUDE FILE #45 =>/S/COMMON/RWTSE INCLUDE FILE #46 =>/S/COMMON/MSGOUT INCLUDE FILE #47 =>/S/COMMON/EOR.LOGO 01 COPYKIT VERSION NUMBER 14-MAR-85 PAGE 2 0000: 2 ********8.5 COPYKIT ****** INCLUDE FILE #02 =>/S/COMMON/EQUATES INCLUDE FILE #03 =>/S/COMMON/BOOTADISK INCLUDE FILE #04 =>/S/COMMON/V2E80COL INCLUDE FILE #05 =>/S/COMMON/SWAPAUX INCLUDE FILE #06 =>/S/COMMON/SETPGMSIZE INCLUDE FILE #07 =>/S/COMMON/GET.FLAGPAGE INCLUDE FILE #08 =>/S/COMMON/VECTORS INCLUDE FILE #09 =>/S/COMMON/LOADER INCLUDE FILE #10 =>/S/COMMON/SSUTES INCLUDE FILE #11 =>/S/COMMON/CALLDOS INCLUDE FILE #12 =>/S/COMMON/SWAP1 INCLUDE FILE #13 =>/S/COMMON/NMIHANDLER2 INCLUDE FILE #14 =>/S/COMMON/NMIHANDLER1 INCLUDE FILE #15 =>/S/COMMON/NMIHANDLER3 INCLUDE FILE #16 =>/S/COMMON/SWAPALL INCLUDE FILE #17 =>/S/COMMON/SWAP2E INCLUDE FILE #18 =>/S/COMMON/ESCMSG INCLUDE FILE #19 =>/S/COMMON/CLRMSGAREA INCLUDE FILE #20 =>/S/COMMON/MAINLINE INCLUDE FILE #21 =>/S/COMMON/RESUME INCLUDE FILE #22 =>/S/COMMON/SWITCHES INCLUDE FILE #23 =>/S/COMMON/PRMENU INCLUDE FILE #24 =>/S/COMMON/DUMP INCLUDE FILE #25 =>/S/COMMON/LOAD INCLUDE FILE #26 =>/S/COMMON/BLOCKIO INCLUDE FILE #27 =>/S/COMMON/TABLE INCLUDE FILE #28 =>/S/COMMON/DETVID INCLUDE FILE #29 =>/S/COMMON/EXITIFESC INCLUDE FILE #30 =>/S/COMMON/DETVIDA INCLUDE FILE #31 =>/S/COMMON/CHANGEDRIVE INCLUDE FILE #32 =>/S/COMMON/CLEAR INCLUDE FILE #33 =>/S/COMMON/SET80CARD INCLUDE FILE #34 =>/S/COMMON/GETSR.A INCLUDE FILE #35 =>/S/COMMON/FINDRPTDAREA INCLUDE FILE #36 =>/S/COMMON/SWAP1PAGE INCLUDE FILE #37 =>GOMONITOR INCLUDE FILE #38 =>/S/COMMON/CHOICEMSG INCLUDE FILE #39 =>/S/COMMON/GETPRINSLOT INCLUDE FILE #40 =>/S/COMMON/SCREENDUMP INCLUDE FILE #41 =>MENUTABLES INCLUDE FILE #42 =>COPYDISK INCLUDE FILE #43 =>GOBASIC INCLUDE FILE #44 =>/S/COMMON/RWOTS INCLUDE FILE #45 =>/S/COMMON/RWTSE INCLUDE FILE #46 =>/S/COMMON/MSGOUT INCLUDE FILE #47 =>/S/COMMON/EOR.LOGO ** SUCCESSFUL ASSEMBLY := NO ERRORS ** ASSEMBLER CREATED ON 14-DEC-83 15:21 ** TOTAL LINES ASSEMBLED 7412 ** FREE SPACE PAGE COUNT 34 Lе PAGE PRINTEXTOVLY EQU * JMP PRINTEXT * * * * * !(4);"BLOAD CKCODE,A$1804"; (4);"BLOADM,A$2000"AJ200e(4);"BLOAD L,A$1804"#(4);"BSAVE CKCODE,A$1804,L$2C40"$(4);"PR#6"2Z ***************************::::::::::::::::::::::::: 80-COL LOADER LOAD DEFAULT FIRST$ N1:260< THEN LOAD OVERLAYD :Y "1: //E 80-COL"r "2: VIDEX VIDEOTERM "3: VISION-80 "5: OTHER "6: NONE "WHICH ONE?";N  N1V$"K":330 "N2V$"VIDEX" ,N3V$"VISION80" ; N5V$"VOTHER"% @N6V$"VNONE"4 EV$V$".0"V J:(4);"BLOAD ";V$;",A$1F00"\ ^ L SKP 2 MENUPARMS DW MESSAGES DW VERTS VERTS EQU * *VERTICAL.SPACING.BEFORE.EACH.LINE *LAST VALUE MUST BE >127 DFB 1 BOOTADISK DFB 2 DETVID DFB 2 DUMP DFB 3 LOAD DFB 2 RESUME DO UNIDISK DFB 0,0,1,0,0,0,0,0 ELSE DFB 2 SCREENDUMP DFB 2 GOMONITOR DFB 1 CHANGEDRIVE DFB 1 DOSLOAD DFB 1 GOBASICDOS DFB 1 GOBASIC DFB 1 COMPRESS DFB 1 COPYDISK FIN DFB 255 MARK END OF LIST VECTORS EQU * *VECS TO SUBRTN NAMED BY EACH LINE DW BOOTADISK DW DETVID ;DETERMINE VIDEO MODE DW DUMP DW LOAD DW RESUME DW SCREENDUMP DW GOMONITOR DW CHANGEDRIVE DW DOSLOAD DW GOBASICDOS DW GOBASIC DW COMPRESS DW COPYDISK MESSAGES EQU * DO GERMAN ASC .PROGRAMMDISKETTE BOOTEN. DFB 0 ASC .BILDMODUS SETZEN (PROGRAMMABLAUF). DFB 0 ASC .BILDMODUS SETZEN (PROGRAMM-BOOT). DFB 0 ASC .DUMP:PROGRAMM AUF DISKETTE SPEICHERN. DFB 0 TOGMSGSTART EQU * ASC .(. TOGGLEMSG EQU * ASC .64 . ASC .K). DFB 0 ASC .LOAD:PROGRAMMKOPIE VON DISKETTE LADEN. DFB 0 ASC .RESUME:PROGRAM IM SPEICHER FORTSETZEN. DFB 0 ASC .BILDSCHIRM AUSDRUCKEN. DFB 0 CHANGESIZESTART EQU * ASC .SPEICHERGROESSE 64K ODER 128K. CHANGESIZEEND EQU * DFB 0 ASC .MONITOR AUFRUFFEN. DFB 0 ASC .ZUSATZKARTE ODER 80Z KARTE ANSCHALTEN. MENUPERIPH EQU * ASC . . DFB 0 ASC .BACKUP WIRD GESPEICHERT AUF: S. MENUSLOT DFB $B6 ;"6" ASC . D. MENUDRIVE DFB $B1 ;"1" DFB 0 ASC ,NORMALES DOS 3.3 VON DISKETTE LADEN, DFB 0 ASC .START VON BASIC, DOS AKTIVIERT. DFB 0 ASC .START VON BASIC. DFB 0 ASC .BACKUP AUF DISKETTE KOMPRIMIEREN. DFB 0 ASC .STANDARD-DISKETTE KOPIEREN. DFB 0 ELSE ASC .Boot a Disk to be Studied/Copied. DFB 0 ASC .Set Video Mode (Automatic on //e). DFB 0 ASC .Save: Copy Program from Memory to Disk. DFB 0 ASC .Load: Copy Backup from Disk to Memory. DFB 0 ASC .Resume Running Program in Memory. DFB 0 ASC .Print Screen. DFB 0 ASC .Exit to Monitor. DFB 0 ASC .Specify Backup Disk Drive: Now S. MENUSLOT DFB $36 ;"6" ASC . D. MENUDRIVE DFB $31 ;"1" DFB 0 ASC /Load a Normal DOS 3.3 from Disk/ DFB 0 ASC .Exit to Basic, Connecting DOS. DFB 0 ASC .Exit to Basic. DFB 0 ASC .Compress Backup on Disk. DFB 0 ASC .Copy an Unprotected Disk (like COPYA). DFB 0 FIN SBTL .JUMP TO MONITOR SKP 1 BREAK2 EQU $FA96 SPNT EQU $49 ;STACK PTR STATUS EQU $48 KSWH EQU $39 OLDBRK EQU $FA59 PCL EQU $3A PCH EQU $3B CTRLYVEC EQU $3F9 ; ; GOMONITOR EQU * DO SHELL TSX STX TEMPSTK FIN JSR HOME ; JSR ESCMSG2 JSR REGMSG ; ;SET OWN KEYIN ROUTINE TO WATCH FOR ESC JSR SETFILTER * * LDA #0 STA SWAPFLAG ; *SET.UP.REGS.AT.INTERRUPT.TO.BE.DISPLAYED.ON.SCREEN LDX XSTOW LDY YSTOW LDA ASTOW JSR SAVE ;SAVE 3 REGS IN OLDMON'S AREA LDA STATSTOW STA STATUS ;SAVE STATUS LDA STACKPTR STA SPNT ;SAVE PTR LDA RHSTOW STA PCH ;SAVE PC LDA RLSTOW STA PCL ;DISPLAY REGS AND GO TO MONITOR JSR INSDS1 ;SHOW ADDR JSR RGDSP1 ;AND REGS JSR MONMSG DEC WNDBTM ;raise bottom of window, to freeze ESC msg JMP MON ; * * KEYFILTER EQU * ;INTERCEPT.KBD.CALLS JSR KEYIN ;GET A KEY CMP #ESC ;ESCAPE? BEQ GOTESC CMP #$82 ;CTRL-B BEQ GOTESC CMP #$83 ;CTRL-C BEQ GOTESC CMP #$99 ;CTRL-Y BNE NOTCTRLY JSR CTRLYPGM JMP KEYFILTER ;LOOP FOR NEXT CHAR NOTCTRLY EQU * RTS ; ; GOTESC EQU * LDA SWAPFLAG ;IS SSRAM SWAPPED OUT? BEQ DONTSWAP JSR CTRLYPGM DONTSWAP EQU * ; ****EXIT TO CALLER ; INC WNDBTM ;restore screen height DO SHELL LDX TEMPSTK ;RESTORE STACK PTR TXS ;AS IT WAS AT ENTRY RTS ;AND RETURN TO USER PGM TEMPSTK DFB 0 ;TEMP STACK CACHE ELSE JMP (RESET) ;VIA.PAGE.3 FIN * SETFILTER EQU * ;POINT KBD VECTOR TO KEYFILTER LDA #>KEYFILTER STA KSWL LDA #  j   ߭ X " j f ıH hL      MTcip訍 ):?Ψ먍K G~ ʨCE ~  Ѩ s <)x <8 h (8 h )8 h  Hh #  L 0`` <)x - ~ s ֬  L(1 0  )` !"#$%&'()*+,-./0ĠͬĠά * 9`. } ŠԠ X 9` 9`  󠰠 `` g `[ c  [ c k `  <<<<<<<;@Ĩਝ㨝` `x60,* L* hL L L L (`   8L `  9`  x`k ML`j `8 h ` XM``L ~ ȿ` `H h `w 9` 㾠 XɛFM`-``  -L'  Q Πˍ` / Q Πñ @ Q ΠōH hh` hhȎ  ή l h h  l ``L  ΠƲ` ΠñH h }3 i. ©  ıjjjj   &L`   Ȳ` " A )<)x ` ¿ξ``` i B( Z k(H h C @`  Ϯ J ծ`а `` '`=?C`py|`*j``  ȿˠˍ  j )  ` `?L?h C(j.j.j.jj.jjj)? ਍8dLdLdd7ȩҨ8ŝŘQH( L.LLb@hhhH e xL x eŝL  ` `L8ҨӨӨӨҨ`  ¿þ`" [ X"$ [' ` o ~ k L0 A   A Xf "H gh L?f  9`@ ~I ~`,0` / X ` X g` e e = X  Ѫ h 諭 C oL<)ɀ` ~0   ¨ Ũ ɪj S`j`0 jj` PRTV $dӨHHҨ.Ө4.Ҩhh` ~ >* `(` ë« ë« ë« ë«`0 ˫`Ҩ㫩 ߫Ҩ`Y`)&`<)Ɍ` , ,` 1«,ϊ  1« ,`Ƞ ˫`!%0e%% g wLM!`!$$ȱF$`%  L| `` j  ۬ 諩  ``آ`ׯ Ҭ ,  )ׯ 5 Ҭ  5(ׯ _ ,` Ϯ x ծ (` p Fή  x x8  `8`{`  } j ߭  ۬ A`  ȭ @ 8`h C ` ׭ ׭` ```Ǡˡ  ¿PLEASE WAIT``  ¿ˠٯΩ Y` + 8`` t + `  ¿ATTENTION!報ξ`  F `8`8`,,`,,`,`h `i)I B``80,ήȱȱׯ) ȱȱȱ` ί8 ί0)H, h8뢭 9( © (`8`εαΰή`ɛ`` &x (/"/ &0   &x  8 , )睊-  ` ¿䬠堼þ`ɛ`lH) 7 h H C 7ɛHh0h Lh Lİ 8 A h` 8 ʽ `$8(0 4$ )< ` A `,,` =` +X əLe8`^` © 01 ݱ 04` ¿ ` ` ı` + ɍ`ɯɸ ݱ`)` ¿` ¿忠򠲩 ` Ҭ Ϯ 8 ծ` `  ¿` )`<- ) _p ` e e``*Lﲭ ) *. j . *n  )  `  ȿ򠸰俠ٯΩ Y *(jI `` ȿ`! k M 70 M mLF M ~L* `% '(I a(`) I E`0! ` m m`*)V*W`y%` ̬ Ϯ  ծ   ծ( ` `` ` `8NQCFZ  ` X ũ ڴ Ĵʹ JHI;: Le ɛɂɃ ə δL`ʹ δl89`ʹIʹ ` ¿` ȿ` ȿ忠򠲩 ` ¿` X\ 9``  9`ǵٵ 9`ٵ` X © 6 y ɛ ɛ>H hɠ ),0 y,0L! Ȳ,  Lj ϥ6 ` Q) ` ۵`  L  ` [ [)i( Ѷɛ (ٍ`H) C(H Ah h `H$h),  @ [`)`LC0 bdZŸ堨庠亠庠61Ӡ㬠련LǸ` "M` X © H X AhLM` 9`ԠԠˠΠŠ &ր!!I & L ^蝩j`AwwL$ d  ֬  A`  u L>J>J>VU)?`8'0|&HhHh VY)'&Y)ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*͇S&'8*3Ii·&& 8  '  & )*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 h $50`  !"#$%&'()*+,-./0123456789:;<=>?HIHHHHhHH݌hHhHh݌H6 -*^>-*>&` aI꽌ɪVɭ&Y>,&>-&Y>,&*>, 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*/S&/'8*3I/i/&& 8 ,,O, >,' /,[, >,& >,/)*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 .h $50//`  !"#$%&'()*+,-./0123456789:;<=>?HI//HHHHhHH݌hHhHh/݌H6 ,/H .(G FG HSj0// +$//H` w,/(/ .h .LI..//H w,h/h@(L. Hg,)-Ю( +(& +/$8 H`HULIST JSR PRMENU2 RTS ULIST DW UMSG DW UVERTS UMSG EQU * DO GERMAN ASC .SNAPSHOT-DISK IN DRIVE 1 EINLEGEN. ELSE ASC .INSERT SNAPSHOT DISK IN DRIVE 1. FIN DFB 0 UVERTS EQU * DFB 5,$FF SBTL .GOBASIC: WARMSTART BASIC. GOBASIC EQU * WARMBASIC EQU $E003 ;BASIC WARMSTART ENTRY POINT (DOESN'T CONNECT DOS) ; JSR SWAPALL ;MAKE.FIRST.8.PAGES.ACCESSIBLE ; *POINT TO BASIC WARMSTART LDA #WARMBASIC SETEXIT EQU * *SET TEXT MODE LDY #TEXT1+SOFTSETBIT STY SOFT *TURN.OFF."UNLISTABLE".FLAG LDY #0 STY SWAPALLFIRST8+$00D6 *POKE $800,0 STY SWAPALLFIRST8+$800 *POKE 33,33 LDY #33 STY SWAPALLFIRST8+33 *PUT.BASIC.ADDR.IN.RETURNVECTOR.AND.RESET.VECTOR STA RHSTOW STA RE5789SET+1+SWAPALLFIRST8 EOR #$A5 STA RESET+2+SWAPALLFIRST8 STX RLSTOW STX RESET+SWAPALLFIRST8 LDA #0 STA MEMSTATUS ;R.CARD.2.B.OFF STA FFEXSTOW ;EXIT.WITH.SLOTS.ON LDA #TEXT1+SOFTSETBIT ; STA SOFT ;80-COL OFF JSR SWAPALL ;RESTORE.CONTENTS.OF.SSRAM JMP RESUME ;SWITCH TO ROM AND RTI * * GOBASICDOS EQU * ;WARMSTART BASIC, CONNECTING DOS * ; JSR SWAPALL ; *DOS MODS LDA #$5E STA $9DE8 ;DOS MUST WARMSTART BASIC EVEN THO DOS IS COLD, TO KEEP USER PGM LDA #1 STA $AAB1-DRIVER+SWAPALLAREA ;MAXFILES=1 DEFAULT LDA #$60 ;=RTS STA $9E41 ;DONT RUN HELLO PGM LDA SLOT STA $B7E9-DRIVER+SWAPALLAREA ;CURRENT SLOT*16 LDA DRIVE STA $B7EA-DRIVER+SWAPALLAREA ;CURRENT DRIVE LDA #COLDDOS JMP SETEXIT COLDDOS EQU $9D84 ;DOS COLDSTART * * DOSLOAD EQU * ;LOAD DOS FROM DISK TO RAM JSR CHANGEDRIVE JSR SETSCRN ;HIRES MIXED & MSG LDA #1 STA COMMAND LDX #DOSTABLE JSR PUTTBL ;save in table pointer JSR LOADDUMPTBL1 JSR RESETSOFT ;TEXT MODE RTS DOSTABLE EQU * ;LOAD PARAMS DFB $A,<$BF00-DRIVER+SWAPALLAREA,0,9,0,>SWAPALL-ABASE DFB 14,<$B500-DRIVER+SWAPALLAREA,2,4,0,>SWAPALL-ABASE DFB 11,$A7,$1,06,$A7,ACCOKASIS-ABASE DFB $FF L  X L  Q ? c   ~  = "& 3 : a   ^ X a    H hL      JQ`fm騍 7?٨쨍嗀<è D}p ը6  ܨ Q n )x 8 (8 )8  Hh _    L 0`` n )x = Q ; F S L(1 0  )` ` [ :<=>?@ABCDEFGHIJKLMNOPQŠԠ X j `n ` 󠰠  `` `9 A  9 A FI G`  <<<<<<<8;Ϩ̨᨝䨝` H)hH)h H  h Hh`x60,* L* hL L L L (`   8L `  xۼ`ML`a `8 ` XM``L = 溑` `  o`n X ` 㾠  H)ih ` `dž " ``5 : `8` 8 XɛIM`0` /`  -L o Πˍ` Πñ ΠōH hh` hhȎ  lVAR  [z CALL y8 n3   JJJJ   &L` k8 ` ޮ  )x ` Press to boot `  ```̞H 1h(  1`(i (Hh e "(H h ` ௩ n`  O  U `а `` l`=?C`py|`*u`` R 溍ˍˍ R j )  `XL[«(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H \ oL oŝ,L   ` `XL8ݨިިިݨ` 詠 ຨþ`" [ X"$ [' ` L = "L( ^ ) ͝L̪   X sH h L[  ̪P `@ I `,0` / X ` X ` Y  Y8 X Q  h s( ^  ɫ |  \L0)ɀ` =0  L Lͨ LШ Lj LD`j`0 jj`X)x|` ͝ ) - `ĎĠ@Lĺ)X )x`  )I )ɬhjjjMa,^`,_` PRTV $dިHHGݨ.ި뫐.ݨhh` = >* `)I`FG(`.*.*H`)&`)Ɍ` , ,` ,ϊ z  ,`YȈ`!%0e%%$ Lì!`!$$ȱF$`%  A L `` & & X ^  = ``` O / k" )  = O  =( 5 ` 4  (`    4 48  `8`` ` y & & ^ ; X ` @ F  O @ F8`h }` / /``pnǠˡ 詢 PLEASE WAIT`nWRITE-PROTECTEDDISKnDRIVEERRORnDISK READ ERROR` 詢 ˠٯΩ `  8`` 0  ` 詢 ATTENTION!報ξ`   `8`8`,,`,,`,`h `i)I ` `80,ȱȱ) ȱȱȱ` U M FH, Fh@ɀ28j8 ( Ѯ(`8`Ί`ɛ`` &x (/"/ &0   &x   , )睊-  ;` 䬠堼þ`ɛ`lH)  h ͱH ɛHh0h ӱLh L 8 h` 8 ʽޱ `$8(0 4$ )<ޱ `  `, ,` ` 4 əLe8`:` r 0ja  0mi`  ` ` r `  ɍ`ɯɸ `)` ` 忠򠲩 ` O  ` I` 詢  `. *n  )  ` 溍`r 0 L óL{ ڳ`% '( (`T0r ڳ` `*brcs`yT%` I T ; T ( ` I`` I` I`8$  `,0L X (  AHI;: ;#Le ɛɂɃ ə L` #l89`I ӯ` ` 溍` 溍忠򠲩 ` ` X `  `' 1 `5'` X  [6 ɛ ɛ)H hɠ ),0 ,0Lo Ķ ϥ6[ ` ) ` )` ? ٶLض G ٶ G` [ [)i( ɛ (ٍ`H) (H h (h (`H$h),Z @ [`)`L|T0̪\@V堨庠亠庠61Ӡ㬠련L` ޮM` X ( r H X hLO`0 `4TԠԠˠΠŠ ӯ&ր!!I & ӯL̪ ӯ^蝩j`AwwL] @ F S `  u  H(` T ``P`$ [hh LHH`8$HjJJJJh)` ` `Q@`hH (`؄HI㼠HHHHhHH݌hHhHh݌H6 J>J>VU)?`8'0|&HhHh VY)'&Y)ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*ۼS&ۼ'8*3Iۼiۼ&& 8  '  & ۼ)*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 Լh $50ۼ`  !"#$%&'()*+,-./0123456789:;<=>?//2 *(L2Q8) (( (i ((i),(j0#p  (LE( ( (LE( -(ȱ ( (LE(ȱ ( (LE(`mm`((`Q ))?) D)):) D)0011L/./" )ȱPȱ)ȱ )ȱ)ȩ )ɛ* ) ) )) -))))`))2)``HHH) -)hhh``)`V0*^>-*^>-*>&` aI꽌ɪVɭ&Y>,&>-&Y>,&*>, 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*/S&/'8*3I/i/&& 8 ,,O, >,' /,[, >,& >,/)*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 .h $50//`  !"#$%&'()*+,-./0123456789:;<=>?HI//HHHHhHH݌hHhHh/݌H6 ,/H .(G FG HSj0// +$//H` w,/(/ .h .LI..//H w,h/h@(L. Hg,)-Ю( +(& +/$8 H`H 0 EG 128K DUMP/LOAD LDA BUFFADDR+1 LDY #$2 JSR SETAUXPARMS LDX COMMAND CPX #$1 BEQ AUXLOADMOVE ;SKIP AUXMOVE IF ON LOAD CLC ;FROM AUXMEMORY TO MAINMEMORY JSR AUXMOVE ;MOVE A PAGE ROUTINE IN SLOT MONITOR AUXLOADMOVE EQU * JSR RWTSE PHP ;SAVE ERROR RESULT FROMM RWTSE TAY LDA #$2 JSR SETAUXPARMSUW LDX COMMAND CPX #$2 BEQ AUXDUMPMOVE ;SKIP AUXMOVE IF ON DUMP SEC JSR AUXMOVE ;MOVE PAGE BACK AUXDUMPMOVE EQU * PLP RTS ; ; SETAUXPARMS EQU * LDX #0 STX A1L STX A4L DEX STX A2L STA A1H STA A2H STY BUFFADDR+1 STY A4H RTS CHN RWOTS  A$(100): 100 LINES MAX6D$(4): CONTROL-DUR$(13): CARRIAGE RETURN](:2" TEXT FILE CREATOR"<:"TO ADD A LINE:"F:" ENTER CHARACTERS, AND PRESS RETURN"P:"TO END:" Z:" PRESS RETURN ON AN EMPTY LINE" d:34,6: SET WINDOW0 nII1:I;": ";: x1000M A$(I)""110k "SAVE TO WHAT FILE? ";N$} (N$)0ī230 D$;"OPEN ";N$ D$;"WRITE ";N$ J1I1 :A$(J) J D$;"CLOSE ";N$ : C$:C$; C$R$ı A$(Y[I)A$(I)C$ 1000  150(A$(100): 100 LINES MAX4D$(4)A(R$(13)I2:i<"LIST WHAT TEXT FILE? ";N$F:"TYPE: CONTROL-S TO STOP LISTING"P" ANY KEY TO CONTINUE"Z::34,6dD$;"OPEN ";N$nD$;"READ ";N$xI1100 I;": ";:1000 I, :D$;"CLOSE ";N$4 :A C$:C$;N C$R$ıa A$(I)A$(I)C$k 1000SHUTTLEuHUSTON!' 0')AUTOCYCLEa_CONFIGUREcs_CURRENT.CONFIGd_DISKAUXeH_*FINDMTAREAgq_(FLAGSWAPk/ʪ_'GETNAMEot_%HELLOt_Kx_!Lz_'LINKKLM~_MAKE.SHUTTLEn_ SBTL .AUTO CYCLE THRU PGMS. AUTOCYCLE EQU * ;IF ESC PRESSED, GO TO MENU. ;ELSE IF NUMBER PRESSED, RESUME THAT PROGRAM. ;ELSE RESUME NEXT PROGRAM (SKIP PGM NUMBERS NOT IN USE) ; LDA KBD BPL GOCYCLE ;NO KEY PRESSED CMP #ESCAPE BEQ GOMENU ;ESC PRESSED JSR VALIDPROGKEY ;IF USABLE PROG KEY, RETURNS PROGNO IN ACCUM BCS GOCYCLE ;BRCH IF NOT USABLE JSR PROGSWAP ;SWAP PGM TO BOARD BCS GOMENU ;BRCH IF PGM NO NOT IN USE JMP RESUME ; GOMENU EQU * STA CLEARKBD RTS PROGNO DFB 0 ;LOCAL STORAGE FOR PROGNO ; ;`b GOCYCLE EQU * LDA CURRENTPROGNO STA PROGNO INC PROGNO TAX CYCLEAGAIN EQU * INY TYA JSR VALIDPROGNO ;RETURNS CLC IF OK BCS CYCLEAGAIN PHA JSR GETPARTNO PLA BCS CYCLEAGAIN ;PROGNO NOT IN USE JSR PROGSWAP JMP RESUME F set lomem to $4000; poke 0 into $4000 to make basic feel good.q 104,64:16384,0:(4)"RUN SCONFIGURE"DISKAUXFLAG DFB 0 ;NONZERO MEANS I/OING TRACKS HOLDING DUMP OF AUX MEM. SBTL .FIND UNUSED AREA. ; ***INPUT: ACCUM CONTAINS A NUMBER 'N' ***OUTPUT: MTAREA CONTAINS INDEX OF A N-PAGE BLOCK OF ZEROES. *(NOTE THAT INDEX IS A COUNT MADE BY GETNEXTMBPAGE.) *=** ; ; ; FINDMTAREA EQU * STA MTAREALEN ;NO OF PAGES NEEDED STA EMPTYPAGECTR JSR GETSCANTBL ;PTRS TO 64K (OPTIMIZED FOR SCANNING) JSR GET1STMBPAGE ;POINT TO 1ST RAM PAGE MTLOOP EQU * JSR ISPAGEEMPTY BNE NOTEMPTY DEC EMPTYPAGECTR BEQ MTFOUND ;IF SO EXIT BNE ANOTHER ;ELSE KEEP COUNTING ; NOTEMPTY EQU *fhi LDA MTAREALEN ;START COUNTING AGAIN STA EMPTYPAGECTR ANOTHER EQU * JSR GETNEXTMBPAGE ;GET ANOTHER PAGE BCC MTLOOP ;UNTIL PAGES EXHAUSTED ;DROP OUT OF LOOP IF NO SERIES FOUND MTFOUND EQU * LDA PAGEINDEX ;ZERO IF NO SERIES FOUND STA MTAREA JSR RESETACCESS ;UNDO BANK-SWITCHING RTS ; ; ISPAGEEMPTY EQU * ;RETURN '=' IF PAGE IS ALL ZEROS LDA BUFFADDR+1 ;PAGE NO STA RAMPTR+1 LDY #0 TYA STA RAMPTR EMPTYLOOP EQU * ORA (RAMPTR),Y BNE ENDMTLOOP ;BNCH IF ONE NON-ZERO BYTE FOUND IN A PAGE DEY BNE EMPTYLOOP ENDMTLOOP EQU * RTS ; SBTL .SWAP FLAGS BEWTWEEN PROGS. ; ; ; ; * *SWAPFLAGS ROUTINE. GIVEN PARTNO *WILL EXCHANGE FLAGS WITH CURRENT *PROGRAM. * * SWAPFLAGS EQU * LDA NEWPROGNO ASL ;DOUBLE IT TAY LDA CURRENTPROGNO ASL TAX LDA FLAGPTRLST+1,Y STA RAMPTR+1 STA FLAGPTRLST+1,X ;point current prog to flag area where new prog was LDA FLAGPTRLST,Y STA RAMPTR ;SET UP ZERO PAGE READY STA FLAGPTRLST,X *RAMPTR CAN USE 'DEST' LOCS LDY #FLAGSP0LEN-1 FLAGSLOOP EQU * LDA (RAMPTR),Y TAX LDA FLAGSP0,Y STA (RAMPTR),Y TXA STA FjlmLAGSP0,Y DEY BPL FLAGSLOOP RTS ;RETURN TO RAMDUMP CALLER ;PARTNO DFB 0 * * ; FLAGPTRLST EQU *-2 DW FLAGSP0 DW FLAGSP1 DW FLAGSP2 DW FLAGSP3 ; ; *PROGRAM 1 FLAG AREA * FLAGSP1 EQU * DFB 0 DFB 0 DFB 0 DFB 0 DFB 0 DFB $20 DFB 0 DFB 0 DFB $20 DFB $82 ;DEFAULT SELECTS ROM DFB $04 DFB 0 DFB 0 DFB 0 DFB $FF ;DEFAULT RESUME DFB $69 ;IN MONITOR DFB 0 ; * *PROGRAM 2 FLAGS * FLAGSP2 EQU * DFB 0 DFB 0 DFB 0 DFB 0 DFB 0 DFB $20 DFB 0 DFB 0 DFB $20 DFB $82 ;DEFAULT SELECTS ROM DFB $04 DFB 0 DFB 0 DFB 0 DFB $FF ;DEFAULT RESUME DFB $69 ;IN MONITOR DFB 0 ; ; *PROGRAM 3 FLAGS * ; ; FLAGSP3 EQU * DFB 0 DFB 0 DFB 0 DFB 0 DFB 0 DFB $20 DFB 0 DFB 0 DFB $20 DFB $82 ;DEFAULT SELECTS ROM DFB $04 DFB 0 DFB 0 DFB 0 DFB $FF ;DEFAULT RESUME DFB $69 ;IN MONITOR DFB 0 ; * * SBTL .INTERP ALPHANUM KEY ENTRY. CLEARNAME EQU * LDX #0 BEQ CLRENTRY ;PRETEND GETLN RETURNED A LEN OF ZERO... ; ; GETNAME EQU * * ; JSR NAMEMSG ;'ENTER PGM NAME' JSR GETLN+5 ;GET LINE: RETURNS LINE IN 0200, LENGTH IN X-REG ;THE '+5' SKIPS THE PRINTING OF THE PROMPT. CLRENTRY EQU * TXA ;length CMP #10 ;10 or more? BCC X9ORLESS ;bnch if len < 10 LDA #9 X9ORLESS EQU * LDX CURRENTPROGNO LDY NAMEIXTBL,X STA NAMESLIST+9,Y ;save name length LDX #0 CPYTONMSLOOP EQU * LDA $0200,X STA NAMESLIST,Y ;copnpqry name to name list INY INX CPX #9 BNE CPYTONMSLOOP RTS ; ; ; ; ; ; NAMEIXTBL EQU *-1 ;HOW FAR ALONG THE LINE IS EACH PGM NAME ON SCREEN? DFB 0 DFB 10 DFB 20 DFB 30 ; ; ; NAMEMSG EQU * JSR CLRMSGAREA LDX #0 LDY #MSGAREA+1 JSR MSGOUT1 EPN EQU * ASC .Enter Program Name -----> . EPNEND EQU * ASC ,........., DFB 0 LDX #EPNEND-EPN STX CH ;SET CURSOR POSITION RTS ; ; SHOWNAMES EQU * ; display 4 names ; LDA #NAMEVERT JSR TABV ;set vertical tab LDX PROGQUANT STX PAGE0TEMP4 ;counter of names NEXTNAME EQU * LDX PAGE0TEMP4 LDY NAMEIXTBL,X ;get tab of name field STY CH ;set tab JSR CALCMARGIN ;how long is right margin before name? TAX ;set flagx BEQ NOMARGIN JSR PRBL2 ;mon routine sends X blanks to cout (at least 1) NOMARGIN EQU * LDX PAGE0TEMP4 JSR SHOWNAME ;send current name to cout, inv if current prog DEC PAGE0TEMP4 BNE NEXTNAME ;loop until all shown RTS ; CALCMARGIN EQU * LDA #9 SEC SBC NAMESLIST+9,Y ;9-length LSR ;(9-length)/2 RTS ; SHOWNAME EQU * ;send current name to cout without padding. ;Input is in X. LDY NAMEIXTBL,X ;index within name list LDA NAMESLIST+9,Y ;length STA PAGE0TEMP3 BEQ ENDSNLOOP ;if len=0, skip cout SNLOOP EQU * LDA NAMESLIST,Y CPX CURRENTPROGNO BNE NOXLATEINV ;only current name is in inverse JSR XLATEINV NOXLATEINV EQU * JSR COUT1 INY DEC PAGE0TEMP3 BNE SNLOOP ENDSNLOOP EQU * RTS ; NAMESLIST EQU * DS 9 DFB 0 DS 9 DFB 0 DS 9 DFB 0 DS 9 DFB 0 ; =2: THIS IS THE HELLO PROGRAM FOR ALL SNAPSHOT DISKSV(4);"SAVE HELLO":COPYKIT1:PRNTERRUPT2:SHELL3:ZHUTTLE4:E206: //E IDPGM4: WHICH PGM IS IT? D$(4) ID(49281):ID(64435): READ ROM AND GET DEVICE ID 1000: LOAD LOGOF ((PGMCOPYKIT)(IDE2))ī65: SKIP CONFIGg PGMSHELLī65: SKIP CONFIG <100: RUN CONFIG? A N PPGM4100,4200,4300,4400: RUN THE MAIN PROGRAM b c d n RUN CONFIG? pF124576:F224577: 'RsuvwUN CONFIG' FLAGS- qESC155: ESCAPE KEY G r IS ESC KEY PRESSED?^ s(49152)ESCī185 w HAVE 'RUN CONFIG' FLAGS BEEN SET BY PRECEDING PGM? x(F1)77(F2)5ī185 185 D$"VERIFY CURRENT.CONFIG" 216,0: CLEAR ONERR :  F1,0: TURN OFF FLAG: 216,0: CLEAR ONERRS (4)"RUN CONFIGURE"Y a + q  LOAD LOGO ID(64435) ID06İ5000: ACTIVATE 80-COL FIRMWARE ID06Ĺ49167,0: set altcharset( ID06ĺ(17);(13);(24): set 40-cols so HGR is ok, return, disable mouse chars3 I14: NT A(N): SET SWITCHES[ Ia  :23:PGM3100,3200,3300,3400  1 I(49234): NOMIX (4);"BLOAD SNAPSHOT.LOGO,A$2000" $I(49235): NOMIX  8 49235,49239,49236,49232/ = MIXED,HIRES,PAGE1,GRAPHICS5 B> K F M  g & "COPYKIT VERSION 10"m ~ u  | "PRINTERRUPT VERSION 10.1 " "SHELL VERSION 10.0" F G H M ID06ĺ" ";R "SHUTTLE VERSION 11.0"% 0 7 =SD$"BRUN COPYKIT"Yf`g fhrD$"BRUN PRINTERRUPT"  D$"BRUN SHELL"./ 0 :ID6ĺD$"BRUN SHUTTLE2E,A$804"DD$"BRUN SHUTTLE2,A$804" 0 ACTIVATE 80-COL FIRMWARE@C3(49175)mC3128C31:5035: 80COL CARD PRESENTvC30|C3ĺ(4)"PR#3":  g5 K0 ө  (JJJJ   &LϪ` r8   `  Q v )x ` Press to boot G ` & ٲ q`" [ X"` `̐``̹H Gh(  G`(i (Hh { 1(H h ` y `  / k 5`а `` `=?C`py|`*`` ˍˍ O "j` H(`TLWӫL X  Q a G   Q  |  D IM 3  K  (H hLo   JQ`fm騍 7?٨쨍嗀<èD}e ը6  ܨ )x X 8 (8 )8  Hh G   L 0`)` `  ŠŠy{|  ` : ``  `     M N`  <<<<<<<8;Ϩ̨᨝䨝` H)hH) h H h Hh`x60,*  L* hL L L L (`   8L S `Y W x`L`΢ `H =Y h箝Ll `$ [[ 庍Y   ` L= Y `8 ` XM``L `  o`l T ` 㾠 H)ih ` `dž  ``( - `8` 8 XɛM` ` /`` X i ΠōH hh` hhȎ  l 100: GET AND SET PREFIXI(4);"BLOAD /S/COPYKIT/CKCODE,A$C04"c (4);"BLOADM,A$1400"X$"SHELL"ĺ(4);"BLOAD NOEGG.0,A$1C00"X$"SHUTTLE"ĺ(4)"BLOAD K,A$1210":22(4);"BLOADK,A$1230"(4);"BLOAD L,A$C04"6 X$"COPYKIT"X$"copykit"İ4000: BLOAD STANDALONE MODULEL #X$"SHUTTLE"ī40Y &Y$"KLM"| ((4);"BSAVE"Y$",A$C04,L$2C80" ) F(4);"PREFIX /MENU" P d n"COPYKIT, SHUTTLE2E, SHUTTLE2, OR SHELL";X$ s(X$,7)"SHUTTLE"Y$X$:X$"SHUTTL}E" x(4);"PREFIX /S/"X$$ * 0 6 Z (4);"BLOAD /S/STAND/O,A$2C00" (4);"BLOAD /S/STAND/P,A$2CFE,TREL" (4);"BLOAD N,A$2600": PRINT SCREEN DRIVER  :"MON C,I,O", "UNLOCK SHUTTLE"E"BLOAD KLM,A$1000"i"BSAVE SHUTTLE,A$1000,L$2C80"|("DELETE KLM"2"DELETE MAKE.SHUTTLE"_*MENUTABLES#_!M _!N _-OLDCHANGEPROG r_*OLDGETNAME_,OLDSETSLINKY>_)OPENCLOSE H_(PROGSWAP _(RAMCARDSM ì_RESETMSGD_&RUNKLMHn_+SCONFIGURE1<$@_+SCONFIGURE2)@_ SBTL .TEXT FOR SHUTTLE MENU. *** IF VERT IS 0, MESSAGE IS NOT SHOWN. *** IF VECTOR IS 0, CURSOR-BAR WILL NOT MOVE TO THAT MSG. SKP 2 MENUPARMS DW MESSAGES DW VERTS VERTS EQU * *VERTICAL.SPACING.BEFORE.EACH.LINE *LAST VALUE MUST BE >127 DFB 5 ;BOOT DO SHUTTLE2E ELSE DFB VINT ;MODE FIN ;DFB 0 ;DUMP DFB VINT ;LOAD RESUMEVERT DFB VINT ;RESUME CLEARVERT DFB VINT ;CLEAR WS DFB VINT ;SETSLOT DO GOMON DFB VINT ;MONITOR ELSE FIN DFB 255 VECTORS EQU * *VECS TO SUBRTN NAMED BY EACH LINE *IF DW 0, GETSR.A WILL SKIP LINE. DW BOOTADISK DO SHUTTLE2E ELSE DW DETVID ;DETERMINE VIDEO MODE FIN ;DW 0 ;DUMP TEMPORARILY EXCISED DW LOAD DW RESUME DW CLEARWKSPACE DW CHANGEDRIVE DO GOMON DW GOMONITOR ELSE FIN MESSAGES EQU * ASC .Boot a Disk into. DFB SHOWWSFLAG DFB 0 DO SHUTTLE2E ELSE ASC .Set Video Mode . DFB 0 FIN DO 0 ASC .Dump: Copy Program from Memory to Disk. DFB 0 FIN ASC .Load a Backup Disk into. DFB SHOWWSFLAG DFB 0 ASC .Resume Running . DFB SHOWNAMEFLAG ;means 'show pgm name here' DFB 0 ASC .Clear . DFB SHOWWSFLAG DFB 0 ASC .Set Shuttle Disk Drive: Currently S. MENUSLOT DFB $36 ;'6' ASC . D. MENUDRIVE DFB $31 ;'1' DFB 0 DO GOMON ASC .MON. DFB 0 FIN ; WSMSG EQU * JSR MSGOUT ASC . Workspace . MENUNUM1 ASC .1 . DFB 0 RTS (j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L ŝ8𨍙,L ~  ` `XLݨިިިݨ`  þ` y S D 1 L$ e { ) ͮLߪ    X H qh LW( `@ I `,0` / X ` Q0 ./` X ?  | q` x  x8  X g , ~ z( e e y ~ ګ  {L0)ɀ` D0  b bͨ bШ b j bD`j`0 jj`X)x`ͮ ) - `ĎĠ@Lĺ)X )x`  QPI )ɬhjjjMa,^`,_` PRTV $dިHHNݨ.ި.ݨhh` D >* `MN(`.*.*O`)&`)Ɍ` , ,` ,ϊ  ,`YȈ`!%0e%%$ Lʬ!`% -# к@ GLA L 3  !L !``<,ߪ˱AA@A庠61 報`JV`I > QP$ -)I S  SIL  ) ,L 2` / Ͱ 5 T(` oL5 v .  Ͱ Ͱ8  )`8`Lz` 󺽉` g K    ɭ e `g g ޮ   @ ߰8`h ` V V``Ǡˡ  PLEASE WAIT`0WRITE-PROTECTEDDISKIDRIVEERRORYDISK READ ERROR`  ['$ 䠭˿ٯΩ ` 8`` į ñ`  ATTENTION!報ξ` ` T ) S S W`8`8`,,`,,`,`i)I ` `80,.ȱȱI) ȱȱȱ[` @U @MFH, ޮh@ɀ288,EU ( ө i(`8`.`ɛ`` x (/"/ 0   x   `, ,` ` ٷ əLe8``ɛ`l ө " 0  D " A 0`  ` ` (` ñɍ`ɯɸ A`)` 忠򠲩 ` / r 5` ` v ? q`  c` & ٲ 0 ٲ LDz ٲ L `m8l`% '( 1(`,0 ` `*2l3m`y,%` 0͚+ T n y X` r )H ޮ @ ڳF QP S ڳ5 S  "3 ' ޴ q` q`  q k`8`  ޹ ` į  ñ` NOT ENOUGH MEMORY TO SAVE SCREEN DATA덠 忠򠲩 ` /m   5Lr ' 5 ʆ( ( 3 5( T` ~ ޮ8 k Q) S`    ޴`H v h  =` oC8 a@ % o- 2 / >L - ,  ` o a` Ԡ i il `` r   %8``ٝ ١8` Q0  / > ,``H H a(h ah`H ޮ h`  G ` `8 Q0 D` D` ͵ `$` ` Q)`)`)` o  ⶙ne `   堭$` [ⶄ$ ? J G` 8nJ`ⶹne욶 1 `ӠӠΠΠà `ҷ i i iɱ ɵ )̜8`{ | = D /  H 5; S` Ը X ฌX`8H h  %`  % `< :` %` <`= ,ŭC`А W TC`BA`<AȱBȱ``0FFέ> Ϊ` \: CB Y`CYM> mrxUd j j`퍁<`{H)?hH)@@h):;H) JJJJ=: ̹͹`sq0 / ' 5  ' 5 T` `` ` ` [$ H TP h 욶 $i윶`$ [' `8$º  `,0LhH (`ة h``ߺ`,$ [hh 3 LHH`8$HjJJJJh)F` ` `Qg`jf5HhHh݌6 ؅G WVj 0 D$Ι󭉼H` yΜ( Wh WLŻ.̉H yhΑh@(LF.iHIhJJJJHh)-Т( ܽ(& ½$8` * _N`* $50*$50LJJJJ` 򶠠 Ӡ͠ )`. *n  )  `  `Ԡ̠àРɠ>J>J>VU)?`8'0|&HhHh VY)'&Y)ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*͉S&'8*3IiΉ&& 8  '  & )*++`FG8`0($ p,&"Э{I峁^,Ȗd2Hjf5 h $50`à  !"#$%&'()*+,-./0123456789:;<=>?(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L ŝ8𨍙,L Ɫ  ` `XL8ݨިިިݨ`  Fþ`  G = * L* ߱ ) ƫL ѫ  ī ī X Ū H wh L]X `@ I `,0` / X ` F0 ݵ_`` X Թ F  w` x  x8 X r 7 ( Z  Ɑ  & {L0)ɀ` =0  m mͨ mШ mj mD`j`0 jj`X)x` īƫ ī ) - ī ѫ `ĎϫĠ@Lĺ)X )x` ` PRTV $dިHHFݨ.ި.ݨhh` = >* `F(` | | | |`0 ` Κ`Y`)&` , ,` ެ,ϊ ެ ,`Ƞ `!%0e%%$ L!`% -# @ rLDA LD r QL Q``o\B߲/AA@A庠61 L報`?K`@>  % y 9` $ ° * I(` q =@E ° °E8 `8`|` 5` h T   뮩 Z `g Ӯ  ܮ @ ԰8`h  `  ``Ǡˡ  FPLEASE WAIT`%WRITE-PROTECTEDDISK>DRIVEERRORNDISK READ ERROR`  ['$ L䠭˿ٯΩ ` 8`` '`  FATTENTION!報ξ` F` I  H H L`8`8`,,`,,`,`Ei)I =` `80,#ȱ=ȱ>) 8ȱ9ȱEȱP` 5U % 5MAFH, Ӯh@ɀ288!:J ( ٩ ^(`8`=998E#`ɛ`` x (/"/ 0   x H)p ' ߱h H  ɛHh0h Lh L ұ8 ߱h` б8 бʽű p`$8(0 4$ )<ű `  `, ,` ` 뱠 əLe8`!`ɛ`l ٩ a 0歍 5C 6D 0魍` F ` ` ` 'ɍ`ɯɸ `)` F忠򠲩 `  $ ֲ *` ` k ݵ Թ w` Dz`   F宮` j X 0 X lLF X }L( `sr`% '( p(`\0 ` l l`*crds`y\%` 0͏+ I  ˵   X` )8 Ӯ 0 D6 Ū  ] 3 P ' > f` f`  f մ`8`  s `  '` FNOT ENOUGH MEMORY TO SAVE SCREEN DATA덠 L忠򠲩 ` $m   *Lܴ * ʆ=( ( ȹ *( I` s Ӯ8 մ` ~  P  >`H@ q h 8 ?`   ˵ ` FԠ ^ ^l `` 8``ّ ٕ8` F 0 3``H H (h h`H Ӯ h` F r L`$` ` F)`)`)`NOJJJJ)PN նֶ`sq0  o   `   F堭$` [ $ j J r` 8J` 쏶 p `ɠҠʀΠ̃ 㷅㷹ⷅⷠ` i i iɱ ɵ )̑8`  T $  X *` ø h ϸh`8$H ON0 0h 0` 0 `=А L=  IS`=S`RQ`OQȱRȱp`KK0KKέO)Ϊ` lN SR  i`SOCO)chpKZ ` ``퍁O)` $ *  * I` `=` ` ` [$ H IP h 쏶 $i쑶`$ [' `4 A```$ [hh r LTHH`8$HjJJJJh)` ` `Qͦ`HIA6HHHHhHH݌hHhHh?݌H6 ? D$>.H` yA(6 h L_...H yh6h@(L/HiH>hJJJJHh)-С( ܽ(& ½?$8 H` *HJ>J>VU)?`8'@0|&HhHh VY)'&Y)@ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*.S&.'8*3I.i.&& 8  '  & .)*++`FG8`0($ p,&"Э{I峁^,Ȗd2HHjf5 'h $506.`Š  !"#$%&'()*+,-./0123456789:;<=>? SBTL .INTERP ALPHANUM KEY ENTRY. CHANGEPROG EQU * ;ALTER PGM MARKINGS OR SELECT PGM *** * * INPUT IN ACCUM: * ALPHA = PGM NAME LETTER * NUM = SHUTTLE TO DIFF PROG * *** * ; JSR VALIDPROGKEY BCS NOSELECT JSR PROGSWAP RTS NOSELECT EQU * ;JSR PUTNAME ;PUT ALPHA CHAR INTO NAME IN MENU RTS ; PUTNAME EQU * DO 0 CMP #$A0 BEQ BLANKOK ;BLANKS PASS. CMP #$C0 ;IS IT ALPHA? BCC NOTALPHA AND #$FF-$20 ;CONVERT TO lowercase by turning off 20-bit BLANKOK EQU * FIN PHA JSR GETNAMEINDEX LDY #$0 SHIFTLOOP EQU * LDA NAMEINPUT+1,X STA NAMEINPUT,X INX INY CPY #8 BNE SHIFTLOOP PLA STA NAMEINPUT,X RTS ; COPYNAME EQU * ;COPY CURRENT NAME TO OTHER PLACES ON MENU JSR GETNAMEINDEX LDY #0 CPNLOOP EQU * LDA NAMEINPUT,X STA NAMEINPUT,Y STA MENUNAM1,Y ;STA MENUNAM3,Y INX INY CPY #9 BNE CPNLOOP RTS ; ; ; ; GETNAMEINDEX EQU * LDX CURRENTPROGNO PUTNAME2 EQU * ;XTERNAL ENTRY FROM CLEARNAME CLC LDA #0 ADDLOOP EQU * DEX BEQ ENOUGH ADC #10 ;MOVE 10 CHARS ALONG LINE BNE ADDLOOP ;ALWAYS ENOUGH EQU * TAX RTS SBTL .INTERP ALPHANUM KEY ENTRY. CLEARNAME EQU * LDX #0 BEQ CLRENTRY ;PRETEND GETLN RETURNED A LEN OF ZERO... ; ; GETNAME EQU * * ; JSR NAMEMSG ;'ENTER PGM NAME' JSR GETLN+5 ;GET LINE: RETURNS LINE IN 0200, LENGTH IN X-REG ;THE '+5' SKIPS THE PRINTING OF THE PROMPT. CLRENTRY EQU * CLC ;TELLS COPYNAME THIS IS A NEW NAME STX RMARGIN ;LENGTH OF NAME BCC COPYNAME200 ; ; COPYNAME EQU * ;COPY CURRENT NAME TO OTHER PLACES ON MENU ; FROM 'NAMES' LINE. SEC ;JUST TO SET C FLAG ; COPYNAME200 EQU * ;ENTRY PT USED WHEN COPYING NEW NAME FROM 0200 ; PHP LDA #9 SEC SBC RMARGIN ;9-LENGTH BPL NOTLONG LDA #0 NOTLONG EQU * LSR STA LMARGIN CLC ADC RMARGIN ;RIGHT MARGIN STA RMARGIN LDY CURRENTPROGNO GET INDEX OF THIS NAME IN 'NAMES' LDX NAMEIXTBL,Y LDY #0 STY NCOUNTER+1 CPNLOOP EQU * LDA #BLANK CPY LMARGIN BCC PAD CPY RMARGIN BCS PAD NCOUNTER LDA $0200 INC NCOUNTER+1 PAD EQU * CMP #$E1 ;'a' BCC NOTLOWER AND #$FF-$20 ;CONVERT TO UPPER CASE NOTLOWER EQU * PLP BCS RECOPYNM ;BNCH IF NOT NEW NAME STA NAMES,X RECOPYNM EQU * PHP LDA NAMES,X STA MENUNAM1,Y STA BOOTNAME,Y ;STA MENUNAM3,Y INX INY CPY #9 BNE CPNLOOP PLP ANYRTS RTS ; ; ; ; NAMEIXTBL EQU *-1 ;HOW FAR ALONG THE LINE IS EACH PGM NAME ON SCREEN? DFB 0 DFB 10 DFB 20 DFB 30 ; ; ; NAMEMSG EQU * JSR CLRMSGAREA LDX #0 LDY #MSGAREA+1 JSR MSGOUT1 EPN EQU * ASC .Enter Program Name -----> . EPNEND EQU * ASC ,........., DFB 0 LDX #EPNEND-EPN STX CH ;SET CURSOR POSITION RTS ; ; DO 0 SLINKYSWAPPG EQU * ;swap pg btw mb and slinky ram LDA BUFFADDR+1 ;mboard page to swap STA MBPG+2 STA MBPG2+2 ;mod swap loop code LDA PARTACCESS AND #$70 ; =N0 where N=slot TAX ;slot-dependent displacement for C0NX addresses LDA #0 STA SLINKYLOW,X JSR SETSLINKYMEDHI ;point slinky to right page LDY #0 SSWAPLOOP EQU * LDA SLINKYDATA,X PHA DEC SLINKYLOW,X TYA AND #$7F ;did the load or the dec flip counter? CMP #$7F BNE NOCARRY JSR SETSLINKYMEDHI ;repair slinky addr counter NOCARRY EQU * MBPG LDA $1000,Y STA SLINKYDATA,X PLA MBPG2 STA $1000,Y INY BNE SSWAPLOOP RTS SETSLINKYMEDHI EQU * LDA PAGEINDEX STA SLINKYMED,X LDA PARTACCESS ;which 64K bank of slinky? AND #$0F ;get rid of slot info STA SLINKYHIGH,X RTS FIN SBTL .Open and close workspaces. ; DO SHUTTLE2E ; OPEN128 EQU * ;Create a new 128K WS ; JSR GETFREE ;get free partition BCS NOTENUF ;bnch if none found SEC ;chunk 2 LDY CURRENTPROGNO ; JSR ASSIGNAPART ;assign free part to chunk2 LDA #USES2PARTSBIT ;mark this ws as 128K STA STATUSTBL,Y JSR ISAUXFREE ;find a part to assign to chunk1. try auxmem first. BEQ FOUNDPARTA ;brnch if auxmem avail. JSR GETFREE ;else try any other part, then auxmem BCS NOTENUF ;brnch if no more parts avail. FOUNDPARTA EQU * JSR ASSIGNFREETO1 JSR SWAP2TOMB ;swap chunk 2 to motherboard if it isnt there JSR OPENCLEAR ;clear the chunk JSR SWAPMBTOAUX JMP OPENDONE ; FIN ; OPEN64 EQU * ;create a new 64K ws JSR GETFREEFOR1 ;get free part for chunk1 OPENDONE EQU * JSR SWAP1TOMB ;swap it to mboard JSR OPENCLEAR JSR RESETSOFT ;show text screen JSR SHOWBARMENU ;redraw menu CLC RTS ; GETFREEFOR1 EQU * ;find and assign a free part to chunk 1 JSR GETFREE ;get a free partition BCS NOTENUF ;brch if none found ASSIGNFREETO1 EQU * assign a free part to chunk 1 CLC ;chunk 1 LDY CURRENTPROGNO JSR ASSIGNAPART ;assign free part to chunk1 RTS ; ; NOTENUF EQU * LDY #21 ;vert tab LDX #10 JSR MSGOUT1 ASC .INSUFFICIENT MEMORY. DFB 0 JSR BEEP JSR PAUSE JSR PAUSE JMP (RESET) ; ; ; ; ASSIGNAPART EQU * ;assign a given partition to a given WS and chunk. ;Input: X = new partition ; Y = (as output from GETOWNER) ; CARRY = (as output from GETOWNER) ;output: entry in parttbl is altered. Y,X unchanged. A altered. TYA BEQ UNOWNED TXA DO SHUTTLE2E BCC ITSINTABLE1 STA PART2TBL,Y RTS FIN ITSINTABLE1 EQU * STA PART1TBL,Y UNOWNED EQU * RTS ; GETFREE EQU * ;get a free partition. try partition 0 (mboard) first, ;then anything but auxmem, then auxmem. ;input: none ;output: x = partition number ; a,y indeterminate ; SEC if no part was found. ; LDX #0 ;m'board part no GETNEXTFREE EQU * ;Part no in x-reg DO SHUTTLE2E CPX #1 ;is it aux? (aux is always part 1) BNE NOTAUX JSR ISIT128K2E ;(on a 128k //e) BEQ SKIPPART ;if its aux, skip it til later NOTAUX EQU * FIN LDA PARTTYPETABLE,X ;is there a part. with this number? BEQ SKIPPART ;bnch if not TXA JSR GETOWNER ;which ws owns this part? put in Y BEQ PARTFREE SKIPPART EQU * INX CPX #8 ;keep searching thru part 8 BCC GETNEXTFREE DO SHUTTLE2E JSR ISAUXFREE BEQ PARTFREE ;is aux mem free? FIN SEC ;no free partition RTS PARTFREE EQU * CLC RTS ; ; GETOWNER EQU * ;if partitition is owned, return ws number in y; else return 0 in y. ;Input: A = partition no. ;Output: X unchanged ; A = Y = WS no. (=0 if partition is unowned) ; Carry = clr if chunk1 owns partition, set if chunk2 owns it. ; '=' flag set if partition is unowned ; LDY PROGQUANT NEXTOWNER EQU * CMP PART1TBL,Y CLC BEQ GOTOWNER DO SHUTTLE2E CMP PART2TBL,Y ;is it owned by 2nd chunk of this WS? SEC BEQ GOTOWNER FIN DEY ;next WS BNE NEXTOWNER GOTOWNER EQU * TYA ;set 'not equal' flag RTS ; ; POSITIONWS EQU * ;move a WS to centre stage DO APPLE2E JSR GETCURPARTNO LDX PAGE0TEMP2 ;where is aux chunk of WS? BMI POSITIONCHNK1 ;there is no chunk 2 (64k pgm) CPX #1 BEQ POSITIONCHNK1 ;chunk2 is already in aux ; JSR SWAP2TOMB ;swap chunk 2 to mb if necc. ; JSR SWAPMBTOAUX ;swap chunk 2 to aux ; POSITIONCHNK1 EQU * ;move ws's main 64k into motherboard FIN ;DROP THRU FROM ABOVE - NOT A 64K PGM ; JSR SWAP1TOMB ;swap chunk 1 to mb if necc ; RTS ; ; ; CLOSEAWS EQU * LDY CURRENTPROGNO ;get current ws no. CLOSEANYWS EQU * LDA #0 STA STATUSTBL,Y ;clear status LDA #$FF STA PART1TBL,Y DO SHUTTLE2E STA PART2TBL,Y FIN RTS ; DO 0 MSGINGWS EQU * JSR MSGOUT ASC .ing workspace. DFB 0 RTS FIN ; SWAPASSIGN EQU * ;Input: X = Part no ;Output: Part 0 and Part X swap assignments, ; i.e. each is assigned to the other's WS. ; X is unchanged. ; TXA PHA JSR GETOWNER ;who owns X? TYA PHA PHP LDA #0 JSR GETOWNER ;who owns 0? JSR ASSIGNAPART ;assign it X PLP PLA TAY LDX #0 JSR ASSIGNAPART ;assign it 0. PLA TAX RTS ; SWAPMSG EQU * TXA PHA JSR SETSCRN JSR IFREQMSG PLA TAX RTS IFREQMSG EQU * LDY #22 ;VERT LDX #0 ;HORZ JSR MSGOUT1 ASC .If . DFB 0 LDX NEWPROGNO JSR SHOWNAME JSR MSGOUT ASC . requires disks, insert them. DFB 0 RTS ; ; DO SHUTTLE2E ISAUXFREE EQU * LDA #1 TAX JSR GETOWNER ;set '=' if aux partition is free RTS FIN ; SWAP1TOMB EQU * ;swap chunk 1 to mb and clear it CLC BCC SWAPTOMB SWAP2TOMB EQU * ;ditto chunk 2 SEC SWAPTOMB EQU * JSR GETCURPARTNO ;where are the chunks? BCC CHUNK1ISINX LDX PAGE0TEMP2 CHUNK1ISINX EQU * ;selected chunk's part is in X TXA BMI NOCHUNK ;if chunk doesnt exist, skip it. JSR SWAPX NOCHUNK EQU * RTS ; DO SHUTTLE2E SWAPMBTOAUX EQU * LDX #1 JSR SWAPX RTS FIN ; SWAPX EQU * TXA BEQ SWAPXSKIP ;dont swap if already in mboard JSR SWAPASSIGN JSR SWAPMSG JSR SWAPPART ;swap part x with mboard ram SWAPXSKIP EQU * RTS SBTL .SWAP PGM TO MBOARD BASED ON PGM NO. PROGSWAP EQU * ; ;SWAP PROGRAM IN MEMORY FOR ;REQUESTED PROGRAM, WHETHER ;CHOSEN BY USER OR BY AUTOCYCLE ; ;CALLS GETPARTNO,SWAPPART, SWAPFLAGS, STASH80COL, STASHAUXMEM, ;AND SHOWPROGNO ; ; INPUT: 'A' CONTAINS PROGNO ; JSR VALIDPROGKEY ;IF KEY IS VALID NUMBER KEY, ; CONVERT TO A NUMBER AND CLC. BCS PROGSWAPEND CMP CURRENTPROGNO ;ALREADY IN MOTHERBOARD? BEQ PROGSWAPEND STA NEWPROGNO LDA CURRENTPROGNO JSR ISITAVAIL ;IS THERE A PGM? BPL OKNOTTOSTASH JSR STASH80COL ;STASH 80-COL SCREEN IF NECC BCS PROGSWAPEND OKNOTTOSTASH EQU * JSR SWAPFLAGS LDX CURRENTPROGNO STX OLDPROGNO LDX NEWPROGNO STX CURRENTPROGNO JSR POSITIONWS ;put new WS into place. JSR UNSTASH ;RESTORE 80-COL CARD ; JSR CHIME JSR HOME ; PROGSWAPEND EQU * RTS ; ; ; ; ; STASH80COL EQU * ; PUT 80-COL SCREEN AWAY IN HOLES IN ACTIVE PGM IF POSS. DO APPLE2E JSR ISIT128K2E ;ON 128K 2E, STASH TEXT SCREEN EVEN IF IT'S A 40-COL PGM BEQ DOSTASH ;TO PROTECT IT WHEN IT'S SWAPPED OUT TO AUXMEM. FIN LDA CONFIGUR ; IF SUBJ PGM NEEDS A CARD AND #BIT80COL BEQ NOSTASHNEEDED ;bcs no 80-col card. DOSTASH EQU * JSR SETSCRN ;MIXED SCREEN LDX LEN80COL ;HOW MANY PAGES IN THIS 80-COL CARD? BEQ NOSTASHNEEDED ;bcs no 80-col card present. JSR FINDSTASHAREA ;find room in subj pgm's ram for 80-col data BNE GOTSTASHAREA ;brnch if found DO APPLE2E JSR GETCURPARTNO ;is this a 128k pgm? BVC NOSTASHFOUND ;bnch if not JSR SWAPAUX ;swap chunk2 with chunk1 JSR FINDSTASHAREA ;and look for room in chunk2 BNE GOTAUXSTASH ;bnch if found. JSR SWAPAUX ;else swap back FIN NOSTASHFOUND EQU * ;NO STASH AREA FOUND, SO ;INVITE SAVE TO DISK JSR SHOWSCRN ;SHOW MENU SCREEN PENDING COMPLETION OF OPERATION JSR CLRMSGAREA JSR BUFFERMSG JSR GETSLOT1 ;GET '1' OR '2' BCS BADSAVE ;ESC was pressed CMP #1 BNE NOSTASHNEEDED ;discard 80-col info JSR INSRTETC ;MSG, GETKEY, WAITMSG JSR PREPLOADSH ;HIRESMIXED WITH 'PLEASE WAIT' AND ESC MSG BCS BADSAVE ;IF PROBLEM WITH DISK, GO BACK AND REPEAT MSG. LDA CURRENTPROGNO LDX #2 ;'WRITE' COMMAND JSR SAVEBUFFER BCS BADSAVE LDA #BUFFERBIT ;note disk save JSR MARKSTASHTYPE CLC RTS NOSTASHNEEDED EQU * LDA #NOSTASH JSR MARKSTASHTYPE ;mark status byte CLC RTS DO APPLE2E GOTAUXSTASH EQU * LDA #AUXSTASHBIT+STASHBIT BNE GOTSTASHAREA2 FIN ; GOTSTASHAREA EQU * LDA #STASHBIT GOTSTASHAREA2 EQU * JSR MARKSTASHTYPE CLC JSR RPTD80XFER ;transfer 80-col info to stash area CLC RTS ; ; BADSAVE EQU * ;save to disk failed, or ESC was pressed SEC RTS ; ; FINDSTASHAREA EQU * LDX LEN80COL ;size of 80-col card INX TXA JSR FINDRPTDAREA LDA RPTDAREA RTS ; INSRTETC EQU * ;JSR HOME JSR INSRTMSG ;clr msg area and 'press return' JSR SHUTTLEWORD JSR GETAKEY JSR EXITIFESC RTS ; ; ; BUFFERMSG EQU * LDY #20 LDX #0 JSR MSGOUT1 MSB OFF ;ASC .WARNING!. ;DFB CR ;MSB ON ASC .NOT ENOUGH MEMORY TO SAVE SCREEN DATA. MSB ON DFB CR ASC . 1) Save it on a Shuttle Disk. DFB CR ASC . 2) Discard it. DFB 0 CHOICEMSG EQU * JSR MSGOUT DFB CR ASC .Your choice? (1 or 2). DFB CURSOR DFB 0 RTS ; ; RPTD80XFER EQU * ***XFER CONTENTS OF 80-COL CARD TO/FROM RPTDAREA. ; ;SEC restores 80-card from mtarea, CLC stashes card in mtarea. ; ;GET 1ST PG OF RPTDAREA PHP JSR GETSCANTBL JSR GET1STMBPAGE ISITRPTDAREA EQU * LDA PAGEINDEX ;COUNT OF PAGES GOTTEN CLC ADC LEN80COL ;RPTDAREA IS INDEX OF LAST OF 9 RPTD PAGES CMP RPTDAREA BEQ HERESRPTDAREA JSR GETNEXTMBPAGE ;NEXT PAGE OF MB JMP ISITRPTDAREA ; HERESRPTDAREA EQU * ; JSR COPYTOSTASH2 ;copy 1st page (of blk of repeated pages) to buffer JSR GETNEXTMBPAGE ;point to following page in block ; LDX LEN80COL ;no of pages DEX ;origin 0 STX RPTDPAGECTR ;counter ; STASHLOOP EQU * LDA RPTDPAGECTR ;PG OF CARD 2B XFERRED LDY BUFFADDR+1 ;PG OF RAM PLP ;carry flag shows direction PHP JSR RW80COLX ;xfer it PLP PHP BCC NOTUNSTASH JSR COPYFROMSTASH2 ;80-COL info has been released from page, so restore it to its former state: repeat of 1st page of block. NOTUNSTASH EQU * JSR GETNEXTMBPAGE ;next page of ram DEC RPTDPAGECTR BPL STASHLOOP ; PLP JSR RESETACCESS ;fix bank-swithching RTS ; ; UNSTASH EQU * ;RESTORE 80-COL CONTENTS FROM RPTDAREA JSR ISMARKSTASH ;is there a stash? BNE NOUNSTASH JSR SETSCRN ;mixed graphics SEC ;unstash JSR RPTD80XFER DO APPLE2E ; if stash was in chunk2 then chunk2 and chunk1 have been reversed. JSR GETCURPARTNO ;get status byte in accum AND #AUXSTASHBIT ;stashed in aux? BEQ NOTASB ;bnch if not JSR SWAPAUX FIN NOTASB EQU * RTS ; NOUNSTASH EQU * JSR ISMARKBUFFER ;ON BUFFER DISK? BNE NOBUFFR JSR WASOLDBUFFERD ;DID OLD PGM USE DISK TO BUFFER? BEQ NOINSRTMSG ;IF SO NOT NECC TO WAIT DOINSRTMSG EQU * JSR INSRTETC ;INSER MSG AND GETKEY AND WAIT NOINSRTMSG EQU * JSR PREPLOADSH ;SET SCREEN AND TEST DISK BCS DOINSRTMSG LDA CURRENTPROGNO LDX #1 'READ' JSR SAVEBUFFER NOBUFFR EQU * RTS ; ; ; SAVEBUFFER EQU * PHA ;SAVE PROGRAM NO STX COMMAND JSR POINTTABLE80 JSR GETBUNDLE ;COPY PTRS FROM TABLE TO IOB PLA ORA #8 ;USE TRACKS $9 TO $C STA TRACK JSR LOOP80 ;IN 'DUMP' RTS ; Apple Extended 80-Column Card,6,1,0,0,0,0,0,0,0,0,00000000,1,64 Apple II Memory Expansion Card,7,3,131,130,129,128,0,0,0,0,00000000,0,256 Apple II Memory Expansion Card,7,7,135,134,133,132,131,130,129,128,00000000,0,512 Apple II Memory Expansion Card,7,7,139,138,137,136,135,134,133,132,00000000,0,768 Apple II Memory Expansion Card,7,7,143,142,141,140,139,138,137,136,00000000,0,1024 Cirtech Flipper/Flipster,7,8,143,142,141,140,139,138,137,136,00000000,0,1024 A.P.P.L.E. Co-op Big Board,8,4,3,2,1,0,0,0,0,0,00000000,0,256 A.P.P.L.E. Co-op Big Board,8,8,7,6,5,4,3,2,1,0,00000000,0,512 A.P.P.L.E. Co-op Big Board,8,8,11,10,9,8,7,6,5,4,00000000,0,768 A.P.P.L.E. Co-op Big Board,8,8,15,14,13,12,11,10,9,8,00000000,0,1024 Vision 256K,1,4,135,143,135,143,0,0,0,0,00110000,0,256 Ramrod 128K,1,2,135,143,0,0,0,0,0,0,00000000,0,128 Vision 128K,1,2,135,143,0,0,0,0,0,0,00000000,0,128 Saturn/Titan 128K,1,2,135,143,0,0,0,0,0,0,00000000,0,128 Ramex 128,1,2,135,143,0,0,0,0,0,0,00000000,0,128 U-Ram 128,1,2,135,143,0,0,0,0,0,0,00000000,0,128 Intelligence Research 64K,1,1,135,0,0,0,0,0,0,0,00000000,0,64 Glanmire 512K,4,7,0,3,4,7,8,11,12,0,00000000,1,512 Ramworks,4,2,0,3,0,0,0,0,0,0,00000000,1,128 Ramworks,4,4,0,7,4,3,0,0,0,0,00000000,1,256 Ramworks,4,8,0,15,12,11,8,7,4,3,00000000,1,512 Ramworks,4,8,0,6,5,2,1,15,12,11,00000000,1,768 Ramworks,4,8,0,14,13,10,9,6,5,2,00000000,1,1024 Ramworks II,4,4,0,3,2,1,0,0,0,0,00000000,1,256 Ramworks II,4,8,0,7,6,5,4,3,2,1,00000000,1,512 Ramworks II,4,8,0,11,10,9,8,7,6,5,00000000,1,768 Ramworks II,4,8,0,15,14,13,12,11,10,9,00000000,1,1024 Ramworks II,4,8,0,19,18,17,16,15,14,13,00000000,1,1280 Ramworks II,4,8,0,23,22,21,20,19,18,17,00000000,1,1536 Ramworks II,4,8,0,27,26,25,24,23,22,21,00000000,1,1792 Ramworks II,4,8,0,31,30,29,28,27,26,25,00000000,1,2048 Checkmate MultiRam,4,4,0,5,4,3,0,0,0,0,00000000,1,256 Checkmate MultiRam,4,8,0,8,7,6,1,5,4,3,00000000,1,512 Checkmate MultiRam,4,8,0,11,10,9,2,8,7,6,00000000,1,768 Titan Neptune,6,1,0,0,0,0,0,0,0,0,00000000,1,64 Titan Neptune,5,2,3,0,0,0,0,0,0,0,00000000,1,128 Titan Neptune,5,3,5,3,0,0,0,0,0,0,00000000,1,192 *,0,0,0,0,0,0,0,0,0,0,00000000,0,0 Format of entries: Name Device type code Number of 64K blocks that Shuttle can use (8 fields) control code for each block, padded with zeroes (blocks are allocated and used in the order given). (string of 8 flags) which fields require a store instead of a read (flag) does card live in aux slot? size of card in K Note:even though Shuttle only can use 7 blocks, control codes for 8 blocks (if card has 512k or more) are included, for future expansion of Shuttle's features.uttle's features.res.s. SBTL .SHOW 'ESC TO ABORT' MESSAGE. RESETMSG EQU * LDX #PLIST98 JSR PRMENU1 RTS SKP 2 PLIST98 DW RMSG ;PARMLIST DW RVERTS SKP 2 RMSG ASC .(PRESS . DFB 5,$13,3 ;"ESC" ASC . TO HALT ACTIVITY. DFB 0 ASC .AND RETURN TO MENU). DFB 0 RVERTS DFB 20,1,$FF CHN GETSR.A ;CHANGED FROM GOBASIC FOR SHUTTLE (4);"PR#3"(100: SET PREFIXB (4);"BLOADM,A$1000"oX$"SHELL"ĺ(4);"BLOAD NOEGG.0,A$1800"u200: LOAD K, THEN OVERLAY IT WITH 80-COL ROUTINEX$"S8.3"X$"SHUTTLE"X$"shuttle"İ400% X$"COPYKIT"X$"copykit"ĺ(4);"BLOAD N,A$2200":80-COL PRINT DRIVERX 255,77:254,76: LET L KNOW ITS A PRODOS TESTk (4);"BRUN L"q 2 Z *************************** b c d n"COPYKIT, S8.3, SHUTTLE, OR SHELL?";X$ x(4);"PREFIX /S/"X$  :::::::::::::::::::::::::$ 80-COL LOADERS X$"SHUTTLE"ĺ:(4);"BLOAD K,A$E10":210l LOAD DEFAULT FIRST :(4);"BLOAD K,A$E30" THEN LOAD OVERLAY : "1: //E 80-COL" "2: VIDEX VIDEOTERM "3: VISION-80 "5: OTHER "6: NONE "WHICH ONE?";N 5 N1V$"K":350I "N2V$"VIDEX"` ,N3V$"VISION80"u ;N5V$"VOTHER" @N6V$"VNONE" EV$"/S/COMMON/"V$".0" J:(4);"BLOAD ";V$;",A$F00" ^  : ABORT THIS GOSUB : "WHICH SLOT IS YOUR 128K CARD IN";# N5 N0N7ī410@ 253,NF  @2|@(4);"SAVE SCONFIGURE":: SHUTTLE CONFIGURE; CONFIGURES EITHER SHUTTLE2 OR SHUTTLE2E. FILE NAME UNCHANGED.@KBD49152:A(KBD16): CLR KBD@(104)64ĺ"RUN 'CONFIGURE' FIRST!":@FD$(4):BELL$(7)AK3700: WRITE PROTECTED?4APINIT768:FETCH786:PUT810:ERR830:ID838:N0?AZF1241cAdNC40: NO. OF RAM CARDS AnRNAME$(NC),TYPE(NC),BLOCKS(NC),B(NC,7),RW$(NC)ApAUX(NC),SIZE(NC)AqDT$(8),DF$(8),SC(7)ArNAME$(NC)AxD$"BLOADSHCON.MC"!BID:E2(3):C8(4):EX(5):GET HARDWARE IDENTSBBE2İ13200: LOWER CASE OK?XBC8ĺ:(4)"PR#3"`B23B8)"LOADING CONFIGURATION DATA"B1B READ FROM DATA STATEMENTS AT ENDBDT$(N),DF$(N):DT$(N)"*"NN1:140BLDN1BD$"OPENRAMCARDS"CD$"READRAMCARDS"CN0CC READ RAMCARDS DATA (ORIGIN=0)CRNAME$(N),TYPE(N),BLOCKS(N),B(N,0),B(N,1),B(N,2),B(N,3),B(N,4),B(N,5),B(N,6),B(N,7),RW$(N),AUX(N),SIZE(N)CRNAME$(N)"*"NN1:190C FIRST CARD IS 0.CLCN1:LAST CARD DD$"CLOSE"D D268 TO START AGAIN.":F:"MEMORY FOR USE BY THE SHUTTLE..."F1000: DISPLAY CONFIGFFF::"IS THE ENTERED DATA CORRECT? (Y/N) ";R$)G(R$,1)"Y"(R$,1)"y"Ĺ34,3:2605GTRACE _GC8DT1:610: '//E HAS 80-COL CARD'|GX GET 80COL CARD INTO DTGb:10:"SAVING CONFIGURED SHUTTLE TO DISK"Gl:" PLEASE WAIT...GqE21XS$"SHUTTLE2E":629GsXS$"SHUTTLE2"HuHvD$"BLOAD"XS$",A$804"MHx1800: CONSTRUCT RAMCARD PARAMS IN LOADERHz //E 80-COL DRIVER IS ALREADY IMBEDDED IN SHUTTLE2EH{E2ĺD$"BLOAD"DF$(DT)",A$F00": 80-COL DRIVER FOR 2+HD$"BSAVE"XS$", A$804,L$2C80"HI2052: RUN SHUTTLEI:(4);"RUN SHELLO"8I * GET SLOT INFO * @I nI GET SIZE IF NECC AND SAVE INFO IN TABLEINAME$(N)NAME$(N1)İ8000: GET SIZEISC(SLOT)N: -1=>NO CARDII I IJ:"Snapshot card is in slot ";CU(3);"." J:"Built-in memory ";?JE2ĺ"and Language Card";MJ"...64K"]J:SLOT07sJSC(SLOT)0ī1090JSLOT0ĺ"Auxiliary Slot";:1043J"SLOT "SLOT;JNSC(SLOT): WHICH CARD IS IN SLOTJNN0:8600: SAY K OR MEG K$"..."NAME$(SC(SLOT))KBSLOTYKEXTĺ"(The Shuttle has been assigned its maximum of ";MEMRY;"K."KGXTĺ"It will only use ";XM;"K of the ";NAME$(XNAME);".)"KLK K sSave card info for aux ramKEX0ı: no //e extndd 64kKSLOT0LN0:790: SAVE CARD INFO LWL CONSTRUCT RAMCARD PARAMS AND INSERT INTO LOADERL SB20523: $804+3 = LOAD LOC OF RAMCARD INFO IN SHUTTLEL MP3L EXMP7: MAX PARTITION: HIGHEST PART NUM THAT SHUTTLE CAN USEMNP1: NEXT PARTIT AVAIL FOR NEW RAMCARDFMMEMRY64: SUM TOTAL OF RAM AVAILABLE (M'BOARD)TM&SLOT07nM0NSC(SLOT):N0ī1950M1XNN: ID OF LAST CARD ASSIGNEDM3HPNPBLOCKS(N)1:HPMPHPMP: HIGHEST PART ASSGN'D TO THIS RAMCARDM5CPNP: CURRENT PARTITION)N7NBHPNP1: NUM OF BLKS TO BE ASSIGNEDSN:B0NB1: FOR EACH 64K BLOCKfNNMEMRYMEMRY64NXB1TYPE(N):(RW$(N),B1,1)"1"B1B1128: SET BIT 7 IF WRITE ONLYNbAUX(N)1B1B164: SET BIT 6 IF AUX SLOT3OlB2B(N,B):AUX(N)0B2B2SLOT16: INSERT SLOT NUM INTO PARTITION ACCESS CODEgOvSBCP,B1:SB8CP,B2: POKE CODES INTO LOADEROxCPCP1: POINT TO NEXT PART.OCPMPī1970: MAX NO. OF PARTS ALLOCATED TO SHUTTLEOB: UNTIL DONE ALL BLOCKS ON THIS RAMCARDPNPHP1: POINT TO NEXT AVAILABLE PART&PSLOT,PVPNPMPāINPMP:SBI,0:SBI8,0:IzPSB16,CU(3): SAVE SS SLOT NUMPXT0:NB64SIZE(XN)XT1:XMNB64PQ NO 80-COLUMN CARD,VNONE.0,VISION-80 OR VISTA,VISION80.0,VIDEX VIDEOTERM,VIDEX.0 &Q SUP'R'TERMINAL,VSUPRTERM.0KQ OTHER 80-COLUMN CARD,VOTHER.0UQ *,*]Q Q set I=1 if enough mem or operator says no more.Q:Q"Do you have any more memory cards? ";K$QI1Q(K$,1)"Y"(K$,1)"y"I0QR ;R GET RAMCARD INFO TO CONFIG TABLE AND GET 80-COL INFOnR N07:SC(N)1:N: DECLARE ALL SLOTS EMPTY R 44000: get 80-col cardR 44700: COPY NAMES TO SCRATCH ARRAYR 1200: SAVE CARD INFO FOR AUX RAM R 50500: get a ramcard=S NCU(MENU): N IS FOR USE, CU(MENU) WILL BE SAVED ON CUR.FILE.VS 4000: CLEAR WINDOWkS 2900: get slotS (KBD)ESCAPEĺBEEP$;BEEP$;BEEP$:2780S 790: SAVE CARDINFO IN TABLESS 2000: set I=1 if enough mem or if oper says no more cards. T I1ī2750T TS -TT Get slot infoDTh AUX(N)1SLOT0:LT :qT "What slot is the card in? ";K$T (K$)0SLOT1:T SLOT(K$)48T SLOT1SLOT7ĺBEEP$:2960T T T GET SNAPSHOT SLOTT! CR$(13)T& :8&U0 "What slot is your Snapshot card in? ";K$0U2 3160:U5 SS$;IU8 " ":3142bU: CU(3)0Ğ:CU(3);:xU? CU(3)0Ğ:" ":UD 8:36,(SS$)2UF 49168,0: CLEAR KBD UI K$:49168,0:3150UJ (16384)UK K$((16384)128):16368,0VN K$CR$CU(3)0ı$VX CU(3)(K$):CU(3)7ī31457Vb CU(3)1ī3145AV : IVs OVtUVv`Vy3750V~(4);"RENAME HELLO,HELLO"V216,0: RESTORE ONERRVV:::"Please remove the write-protect tab from":"your disk and re-boot the disk.":WWWWNDHEIGHTTWINDOWGWCLTWINDOW1āI0CLTWINDOW2::IfWTWINDOW2:34,TWINDOW1:lWtW {W@ WJ::"How much memory is on this card?"WTNN0W^8500: PRINT LINE OF SIZE REQWhNNNN1:NAME$(N)NAME$(NNN)ī8030Xr:10:"Enter a letter: ";K$HX|K(K$):K90KK32: MAKE UPPERCASEjXK("A")K("A")NN1ī8050zXNNK("A")X NNNN: WHERE NN=0 FOR LOWEST SIZEXk X3! X4!X>!10:(("A")NN);": ";:8600:XR! Y!SIZE(NNN)1000ĺ" ";SIZE(NNN);"K";@Y!SIZE(NNN)1000ĺ" ";SIZE(NNN)1000;" Meg";FY!NY'# VY3 \Y3Y3:"DOES YOUR APPLE HAVE AN 80-COLUMN CARD? ";Y3K$Y3K$"Y"K$"y"ĺ(4)"PR#3":Y3:"CAN YOUR APPLE DISPLAY LOWER CASE? (Y/N)"Z3K$:K$"N"K$"n"ī13230/Z3:"CAN IT DISPLAY IT NOW? (Y/N)"HZ3K$:K$"Y"K$"y"ıkZ3:(4)"BLOAD XLATE.0": 0280Z3640: CONVERT OUTPUT TO UPPER CASE Z3Z3 Zૉ:ZDMENU1: ID OF 1ST MENU ZvE2C8CU(1)1:IX1:44600[E2CU(1)0:IX0:44600: //E WITHOUT 80-COL1[WNDHEIGHTLD3e[ 49600: COPY RAMCARD NAMES INTO SCRATCH AREA}[pC$"80-COLUMN CARD"[ԭ50500: GET WHICH 80COL IN USE [8I8IX:[ [C$"MEMORY CARD"[MENU2: ID OF 2ND MENU [dWNDHEIGHT17#\ȯ49600: COPY CARD NAMES TO SCRATCH )\0\+ M\,50500: CHOOSE RAMCARDW\IRIXp\貰61900: NORM WINDOW\lD$"OPEN CURRENT.CONFIG":D$"WRITE CURRENT.CONFIG"\жMENU13:CU(MENU):MENU\4D$"CLOSE CURRENT.CONFIG"\\ \\`*] COPY CURRENT MENU LIST TEXT TO SCRATCH7]$I0100S]­MENU1NAME$(I)DT$(I)r]­MENU2NAME$(I)RNAME$(I)]íNAME$(I)"*"50300]ĂI]|ı]IJ ]IJ DRAW WINDOW, SHOW LIST, GET USER'S SELECTION IN CU(MENU)]DŲ]Ű59500: draw window(^ ư62000: CENTRAL WINDOW C^pIX0: CURRENT INDEXg^CLTWINDOW1: CUR LINE NO ~^8ǰ60700: SHOW LIST^jǭCU(MENU)IXİ51500:51050^ǢCL:"->"^dȹ16368,0:16384,128^I(16384):16368,0:I13128ī52000: GET_Ȱ51500:51100: _,ɢCL:" "Q_IXIX1:NAME$(IX)"*"IX0:61200: SCROLL _ɭIX0ĭNAME$(IX)NAME$(IX1)ī51600: DONT SHOW SUCCESSIVE LINES WITH SAME NAME_ɭCLMIDLINEİ61200: SCROLL_XʭCLMIDLINECLCL1_ʢCL:"->"_ʱ_˲ $` CU(MENU)IX: VALUE TO BE RECORDED@`˞:CL:3:NAME$(IX)::G`˲ `"//E 80 COLUMN CARD","//E","VIDEX VIDEOTERM","VIDEX","VISION-80","VIS80"`@"M&R SUP'R'TERMINAL","SUP'R","U-MICROCUMPUTER U-TERM","SUP'R"` "NONE OF THE ABOVE","//E"a*,*ak 2al draw dashed window and ask questionKa61900: NORM WINDOWQa4_aTWINDOW3aMIDLINE(WNDHEIGHT2TWINDOW)a`"WHAT "C$;" DO YOU HAVE?"a60600a(WNDHEIGHTTWINDOW1a60600: LINE OF DASHES b"SPACE BAR MOVES - RETURN KEY SELECTS"bTTWINDOW2:%b AbI038:"-";:I:"-":Hb Xb SHOW LIST^bbLASTSHOWN1:SHOW LIST FROM TOPbHI0(WNDHEIGHT2):61200:I: SCROLL bb b SCROLLbtLASTSHOWNLASTSHOWN1TcLASTSHOWN0ĭNAME$(LASTSHOWN)NAME$(LASTSHOWN1)ī61300: DONT SHOW SUCCESSIVE LINES WITH SAME NAMEkcWNDHEIGHTTWINDOWc' TO START AGAIN.":5000:F1000: DISPLAY CONFIGFG6G::"IS THE ENTERED DATA CORRECT? (Y/N) ";R$`G(R$,1)"Y"(R$,1)"y"Ĺ34,3:260lGTRACE GC8DT1:610: '//E HAS 80-COL CARD'GX GET 80COL CARD INTO DTGb:10:"SAVING CONFIGURED SHUTTLE TO DISK"Hl:" PLEASE WAIT...!HqE21XS$"SHUTTLE2E":6294HsXS$"SHUTTLE2":HuTHvD$"BLOAD"XS$",A$804"Hx1800: CONSTRUCT RAMCARD PARAMS IN LOADERHz //E 80-COL DRIVER IS ALREADY IMBEDDED IN SHUTTLE2EH{E2ĺD$"BLOAD"DF$(DT)",A$F00": 80-COL DRIVER FOR 2+ID$"BSAVE"XS$", A$804,L$2C80"#I;I2052: RUN SHUTTLETI:(4);"RUN SHELLO"oI * GET SLOT INFO * wI I GET SIZE IF NECC AND SAVE INFO IN TABLEINAME$(N)NAME$(N1)İ8000: GET SIZEISC(SLOT)N: -1=>NO CARDIJ J JR OTHER 80-COLUMN CARD,VOTHER.0HR *,*PR R set I=1 if enough mem or operator says no more.R:R"Do you have any more memory cards? ";K$RI1R(K$,1)"Y"(K$,1)"y"I0RR .S GET RAMCARD INFO TO CONFIG TABLE AND GET 80-COL INFOaS N07:SC(N)1:N: DECLARE ALL SLOTS EMPTY ~S 44000: get 80-col cardS 44700: COPY NAMES TO SCRATCH ARRAYS 1200: SAVE CARD INFO FOR AUX RAM S 50500: get a ramcard1T NCU(MENU): N IS FOR USE, CU(MENU) WILL BE SAVED ON CUR.FILE.JT 4000: CLEAR WINDOW_T 2900: get slotT (KBD)ESCAPEĺBEEP$;BEEP$;BEEP$:2780T 790: SAVE CARDINFO IN TABLEST 2000: set I=1 if enough mem or if oper says no more cards.T I1ī2750U US !UT Get slot info8Uh AUX(N)1SLOT0:@U :eU "What slot is the card in? ";K$|U (K$)0SLOT1:U SLOT(K$)48U SLOT1SLOT7ĺBEEP$:2960U U U GET SNAPSHOT SLOTU! CR$(13)U& :8V0 "What slot is your Snapshot card in? ";K$9VX CU(3)(K$):CU(3)7ī3100LVb CU(3)1ī3100VV : ^Vs dVtjVvuVy3750V~(4);"RENAME HELLO,HELLO"V216,0: RESTORE ONERRVW:::"Please remove the write-protect tab from":"your disk and re-boot the disk.":WW3WWNDHEIGHTTWINDOW\WCLTWINDOW1āI0CLTWINDOW2::I{WTWINDOW2:34,TWINDOW1:WWWE21W"PART 1 ";WS$"begins right here and carries on for a ways until it gets too long at which point "X5000X"PART 2 "; X5000XS$"begins and carries on for quite a while, meandering madly across the page until it runs out of steam."X5000X: XXCO39XHZ36: PLACE WHERE HORZ CURSR POS IS STOREDYC9İ5220: AN 80-COL CARD HAS BEEN SWITCHED ONMYE2((48183)127)İ5200: IN 80COL ON A //ESYiY(S$)0ı: DONEY5300: GET WORD INTO SS$ AND CHOP FROM S$Y(SS$)0ıY5400: IF WORD WOULD EXTEND OFF LINE THEN ISSUE CR.YSS$;Z(HZ)COĺ" ";: PUT SPACE AFTER WORD#Z5060*ZO TZP SET VALUES FOR //E 80-COL OPERATION`ZZHZ1403yZdCO79: RIGHT COLUMNZnZ Z GET LEFTMOST WORD OFF S$ INTO SS$Z(S$,1)" "ĭ(S$)1S$(S$,(S$)1)Z(S$)0SS$"":[I1: COUNTER ALONG STRING6[(S$,I,1)" "ĭI(S$)II1:5340a[I(S$)ĭ(S$,I1,1)" "II1:5350q[SS$(S$,I)[(S$)IS$(S$,(S$)I):5370[S$""[[ [["((HZ)(SS$))COĺ: GO TO NEXT LINE[,[|\"ABCDEFGHIJKLMNO";\I(36)2\(36);" ";(53);" ";(1403)8\@\ G\@ s\J::"How much memory is on this card?"|\TNN0\^8500: PRINT LINE OF SIZE REQ\hNNNN1:NAME$(N)NAME$(NNN)ī8030\r:10:"Enter a letter: ";K$]|K(K$):K90KK32: MAKE UPPERCASE6]K("A")K("A")NN1ī8050F]NNK("A")o] NNNN: WHERE NN=0 FOR LOWEST SIZEu]k |]3! ]4!]>!10:(("A")NN);": ";:8600:]R!]!SZSIZE(NNN)]!SZ1024S2(SZ1024):" ";S2;" Meg";:SZSZS21024^!SZ0ĺ" ";SZ;"K";^!^'# '^3 -^3`^3:"DOES YOUR APPLE HAVE AN 80-COLUMN CARD? ";h^3K$^3K$"Y"K$"y"ĺ(4)"PR#3":C91:^3:"CAN YOUR APPLE DISPLAY LOWER CASE? (Y/N)"^3K$:K$"N"K$"n"ī13230_3:"CAN IT DISPLAY IT NOW? (Y/N)"_3K$:K$"Y"K$"y"ıA_3:(4)"BLOAD XLATE.0": 0280m_3640: CONVERT OUTPUT TO UPPER CASE s_3{_3 _ૉ:_DMENU1: ID OF 1ST MENU _vE2C8CU(1)1:IX1:44600_E2CU(1)0:IX0:44600: //E WITHOUT 80-COL`WNDHEIGHTLD3;` 49600: COPY RAMCARD NAMES INTO SCRATCH AREAS`pC$"80-COLUMN CARD"z`ԭ50500: GET WHICH 80COL IN USE `8I8IX:` `C$"MEMORY CARD"`MENU2: ID OF 2ND MENU `dWNDHEIGHT17`ȯ49600: COPY CARD NAMES TO SCRATCH `a+ #a,50500: CHOOSE RAMCARD-aIRIXFa貰61900: NORM WINDOW}alD$"OPEN CURRENT.CONFIG":D$"WRITE CURRENT.CONFIG"aжMENU13:CU(MENU):MENUa4D$"CLOSE CURRENT.CONFIG"aa aa`b COPY CURRENT MENU LIST TEXT TO SCRATCH b$I0100)b­MENU1NAME$(I)DT$(I)Hb­MENU2NAME$(I)RNAME$(I)`bíNAME$(I)"*"50300gbĂImb|ıtbIJ bIJ DRAW WINDOW, SHOW LIST, GET USER'S SELECTION IN CU(MENU)bDŲbŰ59500: draw windowb ư62000: CENTRAL WINDOW cpIX0: CURRENT INDEX=cCLTWINDOW1: CUR LINE NO Tc8ǰ60700: SHOW LISTscjǭCU(MENU)IXİ51500:51050cǢCL:"->";cȞc2ȾK$c<ȝcFȺ""cPI(K$):51450cȭI13ī52000: GETcɰ51500:51100: c,ɢCL:" "%dIXIX1:NAME$(IX)"*"IX0:61200: SCROLL }dɭIX0ĭNAME$(IX)NAME$(IX1)ī51600: DONT SHOW SUCCESSIVE LINES WITH SAME NAMEdɭCLMIDLINEİ61200: SCROLLdXʭCLMIDLINECLCL1dʢCL:"->"dʱd˲ d CU(MENU)IX: VALUE TO BE RECORDEDeˢCL:4::NAME$(IX)::e˲ je"//E 80 COLUMN CARD","//E","VIDEX VIDEOTERM","VIDEX","VISION-80","VIS80"e@"M&R SUP'R'TERMINAL","SUP'R","U-MICROCUMPUTER U-TERM","SUP'R"e "NONE OF THE ABOVE","//E"e*,*ek fl draw dashed window and ask question f61900: NORM WINDOW&f44fTWINDOW3WfMIDLINE(WNDHEIGHT2TWINDOW)vf`"WHAT "C$;" DO YOU HAVE?"f60600f(WNDHEIGHTTWINDOW1f60600: LINE OF DASHESf"SPACE BAR MOVES - RETURN KEY SELECTS"fTTWINDOW2:f gI038:"-";:I:"-":g -g SHOW LIST3gXgLASTSHOWN1:SHOW LIST FROM TOPgHI0(WNDHEIGHT2):61200:I: SCROLL gg g SCROLLgtLASTSHOWNLASTSHOWN1)hLASTSHOWN0ĭNAME$(LASTSHOWN)NAME$(LASTSHOWN1)ī61300: DONT SHOW SUCCESSIVE LINES WITH SAME NAME@hWNDHEIGHTTWINDOWshNO CARDJJ J !10:(("A")NN);": ";:8600:_R!_!SZSIZE(NNN)_!SKSZ_!SZ1024S2(SZ1024):S2;" Meg";:SKSZS21024`!SK0ĺ" ";SK;"K"; `!`'# `3 #`3V`3:"DOES YOUR APPLE HAVE AN 80-COLUMN CARD? ";^`3K$`3K$"Y"K$"y"ĺ:(4)"PR#3":C91:`3:"CAN YOUR APPLE DISPLAY LOWER CASE? (Y/N)"`3K$:K$"N"K$"n"ī13230`3:"CAN IT DISPLAY IT NOW? (Y/N)"a3K$:K$"Y"K$"y"ı9a3:(4)"BLOAD XLATE.0": 0280ea3640: CONVERT OUTPUT TO UPPER CASE ka3sa3 {aૉ:aDMENU1: ID OF 1ST MENU av IF E2 AND C8 THEN CU(1) = 1:IX = 1: GOTO 44600aE2CU(1)0:IX0:44600: //E bWNDHEIGHTLD3>b 49600: COPY RAMCARD NAMES INTO SCRATCH AREAVbpC$"80-COLUMN CARD"}bԭ50500: GET WHICH 80COL IN USE b8I8IX:b bC$"MEMORY CARD"bMENU2: ID OF 2ND MENU bdWNDHEIGHT17bȯ49600: COPY CARD NAMES TO SCRATCH c c+ &c,50500: CHOOSE RAMCARD0cIRIXIc貰61900: NORM WINDOWclD$"OPEN CURRENT.CONFIG":D$"WRITE CURRENT.CONFIG"cжMENU13:CU(MENU):MENUc4D$"CLOSE CURRENT.CONFIG"cc cc`d COPY CURRENT MENU LIST TEXT TO SCRATCHd$I0100,d­MENU1NAME$(I)DT$(I)Kd­MENU2NAME$(I)RNAME$(I)cdíNAME$(I)"*"50300jdĂIpd|ıwdIJ dIJ DRAW WINDOW, SHOW LIST, GET USER'S SELECTION IN CU(MENU)dDŲdŰ59500: draw windowe ư62000: CENTRAL WINDOW epIX0: CURRENT INDEX@eCLTWINDOW1: CUR LINE NO We8ǰ60700: SHOW LISTvejǭCU(MENU)IXİ51500:51050eǢCL:"->";eȞe2ȾK$e<ȝeFȺ""ePI(K$):51450eȭI13ī52000: GETeɰ51500:51100: e,ɢCL:" "(fIXIX1:NAME$(IX)"*"IX0:61200: SCROLL fɭIX0ĭNAME$(IX)NAME$(IX1)ī51600: DONT SHOW SUCCESSIVE LINES WITH SAME NAMEfɭCLMIDLINEİ61200: SCROLLfXʭCLMIDLINECLCL1fʢCL:"->"fʱf˲ f CU(MENU)IX: VALUE TO BE RECORDEDgˢCL:4:52200:NAME$(IX)::$g˲ ?g˲ INVERSE IF POSSIBLE|g˭E2C8Ĺ50,127:49167,0:: DISPLAY MASK AND ALTCHARSETg̞:gB̲ g"//E 80 COLUMN CARD","//E","VIDEX VIDEOTERM","VIDEX","VISION-80","VIS80"h@"M&R SUP'R'TERMINAL","SUP'R","U-MICROCUMPUTER U-TERM","SUP'R"NO CARDII I J display configurationFJ"The Snapshot card is in slot ";CU(3);"."qJ:"MEMORY FOR USE BY THE SHUTTLE";CO$J:"Built-in memory";JE2ĺ" and Language Card";JCO$;:E2Ė27JMMERY64: ACCUMULATE TOTAL MEMORYJ"64K"JSLOT07KSC(SLOT)0ī1090K""BKSLOT0S$"Auxiliary Slot":1043YKS$"Slot "(SLOT)KNSC(SLOT): WHICH CARD IS IN SLOTKS$S$CO$K5000: PRINT ITK25KNN0:8600: SAY K OR MEGKMMERYMMERYSZK40:" ";L$S$NAME$(SC(SLOT))L.5000?L8E2(MMERY512)ī1091: MAX IS ALLOCATED [L:E2(MMERY256)ī1091eLBSLOTtLCXTī1100|LD:LES$"(The Shuttle has been assigned its maximum of "(MEMRY)"K."MGS$S$" It will only use the last "(XM)"K of the "NAME$(XNAME)".",MHS$S$" The remaining"^MI5000:SZSIZE(XNAME)XM:8605: PRINT SIZE MKS$" is available for expanded programs or ramdisks.)"ML5000MM M sSave card info for aux ramMEX0ı: no //e extndd 64kNSLOT0$NN0:790: SAVE CARD INFO *N1N kN CONSTRUCT RAMCARD PARAMS AND INSERT INTO LOADERN SB20523: $804+3 = LOAD LOC OF RAMCARD INFO IN SHUTTLEN MP3N EXMP7: MAX PARTITION: HIGHEST PART NUM THAT SHUTTLE CAN USE$ONP1: NEXT PARTIT AVAIL FOR NEW RAMCARDZOMEMRY64: SUM TOTAL OF RAM AVAILABLE (M'BOARD)hO&SLOT07O0NSC(SLOT):N0ī1950O1XNN: ID OF LAST CARD ASSIGNEDO3HPNPBLOCKS(N)1:HPMPHPMP: HIGHEST PART ASSGN'D TO THIS RAMCARDP5CPNP: CURRENT PARTITION?P7NBHPNP1: NUM OF BLKS TO BE ASSIGNEDiP:B0NB1: FOR EACH 64K BLOCK|PNMEMRYMEMRY64PXB1TYPE(N):(RW$(N),B1,1)"1"B1B1128: SET BIT 7 IF WRITE ONLYPbAUX(N)1B1B164: SET BIT 6 IF AUX SLOTIQlB2B(N,B):AUX(N)0B2B2SLOT16: INSERT SLOT NUM INTO PARTITION ACCESS CODE}QvSBCP,B1:SB8CP,B2: POKE CODES INTO LOADERQxCPCP1: POINT TO NEXT PART.QCPMPī1970: MAX NO. OF PARTS ALLOCATED TO SHUTTLERB: UNTIL DONE ALL BLOCKS ON THIS RAMCARD2RNPHP1: POINT TO NEXT AVAILABLE PART!10:(("A")NN);": ";:8600:^R!^!SZSIZE(NNN)^!SKSZ!_!SZ1024S2(SZ1024):S2;" Meg";:SKSZS210248_!SK0ĺ" ";SK;"K";>_!F_'# N_3 T_3_3:"DOES YOUR APPLE HAVE AN 80-COLUMN CARD? ";_3K$_3K$"Y"K$"y"ĺ(4)"PR#3":C91:_3:"CAN YOUR APPLE DISPLAY LOWER CASE? (Y/N)"`3K$:K$"N"K$"n"ī13230,`3:"CAN IT DISPLAY IT NOW? (Y/N)"E`3K$:K$"Y"K$"y"ıh`3:(4)"BLOAD XLATE.0": 0280`3640: CONVERT OUTPUT TO UPPER CASE `3`3 `ૉ:`DMENU1: ID OF 1ST MENU `vE2C8CU(1)1:IX1:44600aE2CU(1)0:IX0:44600: //E WITHOUT 80-COL.aWNDHEIGHTLD3ba 49600: COPY RAMCARD NAMES INTO SCRATCH AREAzapC$"80-COLUMN CARD"aԭ50500: GET WHICH 80COL IN USE a8I8IX:a aC$"MEMORY CARD"aMENU2: ID OF 2ND MENU adWNDHEIGHT17 bȯ49600: COPY CARD NAMES TO SCRATCH &b-b+ Jb,50500: CHOOSE RAMCARDTbIRIXmb貰61900: NORM WINDOWblD$"OPEN CURRENT.CONFIG":D$"WRITE CURRENT.CONFIG"bжMENU13:CU(MENU):MENUb4D$"CLOSE CURRENT.CONFIG"bb bb`'c COPY CURRENT MENU LIST TEXT TO SCRATCH4c$I0100Pc­MENU1NAME$(I)DT$(I)oc­MENU2NAME$(I)RNAME$(I)cíNAME$(I)"*"50300cĂIc|ıcIJ cIJ DRAW WINDOW, SHOW LIST, GET USER'S SELECTION IN CU(MENU)cDŲcŰ59500: draw window%d ư62000: CENTRAL WINDOW @dpIX0: CURRENT INDEXddCLTWINDOW1: CUR LINE NO {d8ǰ60700: SHOW LISTdjǭCU(MENU)IXİ51500:51050dǢCL:"->";dȞd2ȾK$d<ȝdFȺ""dPI(K$):51450dȭI13ī52000: GET eɰ51500:51100: e,ɢCL:" "LeIXIX1:NAME$(IX)"*"IX0:61200: SCROLL eɭIX0ĭNAME$(IX)NAME$(IX1)ī51600: DONT SHOW SUCCESSIVE LINES WITH SAME NAMEeɭCLMIDLINEİ61200: SCROLLeXʭCLMIDLINECLCL1eʢCL:"->"eʱe˲ f CU(MENU)IX: VALUE TO BE RECORDED`=`B@`ة,0 m `(~~`   8Lm SBTL .SHOW PGM NAMES. ; NLINENO EQU 1 ;SCREEN LINE GAPLEFT EQU 0 ;SPACE ON LEFT GAPRIGHT EQU 0 PRBL2 EQU $F94C ;PRINT 'X' SPACES ; SHOWNAMES EQU * LDA #NLINENO ;WHICH SCREEN LINE? STA VCURSOR JSR BASCALC LDY #0 STY HCURSOR STY TEMPY SHOWNLOOP EQU * ;EACH LOOP SHOWS ONE NAME, TEMPY IS COUNTER INC TEMPY ;LDX #GAPLEFT ;JSR PRBL2 ;SHOW X BLANKS JSR SHOW1NAME ;LDX #GAPRIGHT ;JSR PRBL2 LDY TEMPY CPY PROGQUANT ;ALL PROGS SHOWN? BNE SHOWNLOOP ;BNCH IF NOT RTS ; SHOW1NAME EQU * ;DISPLAY ONE NAME LDA #',./ ' ;BLANK STA LEFT1 ;TO BRACKET NAME STA RIGHT1 ;LDA TEMPY ;PROGRAM NO ;JSR PROGFIND ;GET PARTITION NO ;BCC LOADED ;JSR CLEARNAME ;NO PGM IN THAT PARTITION ;LDA #0 ;SO NOT ON HOLD ;OADED EQU * ;AND #$80 ;HI BIT ON? ;BEQ NOPARENS ;BRCH IF SO ;LDA #'(' ;ELSE USE PARENS ;STA LEFT1 ;LDA #')' ;STA RIGHT1 ;OPARENS EQU * LDA LEFT1 JSR COUT JSR COUTNAME ;SHOW NAME LDA RIGHT1 ;RT PAREN OR BLANK JSR COUT RTS ; TEMPY DFB 0 LEFT1 DFB 0 ;BLANK OR LEFT PAREN RIGHT1 DFB 0 ;BLAND OR RIGHT PAREN NAMES ASC . . ; COUTNAME EQU * ;SEND NAME TO COUT LDX TEMPY ;GET PROG NO DEX TXA ASL A ASL A ASL A TAX LDY #8 COUTLOOP EQU * LDA NAMES,X JSR COUT INX DEY BNE COUTLOOP ;OUTPUT 8 CHARS RTS SBTL .SHOW PROGRAM NO ON MENU. SHOWPROGNO EQU * ;HILITES SELECTED PROGRAM IN MENU LINENO EQU 0 NOSEP EQU 9 ; LDA #LINENO JSR TABV DO APPLE2E LDA #3 ELSE LDA #4 FIN LDX #0 SHOWLOOP EQU * INX STA HCURSOR JSR SETNORM TXA ;PROG NO TO SHOW ; DO APPLE2E ;PGM TO SHOW STARRED OR NOT AT ALL? PHA ;SAVE IT JSR GETPARTNO1 LDA #BLANK BVC NOSTAR ;BNCH IF NOT DOUBLE WS LDA #ASTERISK NOSTAR EQU * JSR COUT ;PRINT * PLA ;RESTORE TAX FIN ; ORA #$B0 ;MAKE IT A SCREEN CHAR CPX CURRENTPROGNO BNE STI02LLNORM STA MENUNUM1 JSR SETINV STILLNORM EQU * JSR COUT ;SKIPCOUTT EQU * JSR SETNORM LDA HCURSOR CLC DO APPLE2E ADC #NOSEP-1 ;MOVE TO RIGHT ELSE ADC #NOSEP FIN CPX PROGQUANT BNE SHOWLOOP RTS ; SHOWDASHES EQU * LDA #0 STA CH ;LEFT EDGE OF SCREEN LDA #MSGAREA-1 JSR TABV ;SET CV AND BASL,H LDY #39 DASHLOOP EQU * LDA #'-' JSR COUT DEY BPL DASHLOOP RTS ; SBTL .VERSION NUMBER. ********10.0 SHUTTLE ****** LST OFF,NOVSYM,NOASYM ;LST ON,VSYM,ASYM * * ********************************* * * SNAPSHOT SHUTTLE TOP LEVEL--- * * THIS FILE CONTAINS THE * 'INCLUDES' FOR THE ENTIRE REST * OF THE SHUTTLE. TO ASSEMBLE IT * TYPE 'PFX /S/SHUTTLE : ASM * SHUTTLE,K'. * ALL 'LST' AND 'ORG' STATE- * MENTS SHOULD BE IN THIS FILE. * *It is necessary to set the flags SHUTTLE2E,SHUTTLE2, and APPLE2E *to the correct values depending on whether you are assembling the *II+ or the356789:;< //e version of the shuttle. After assembly, use LINKKLM *to link the files. ********************************* * * OBJECT CODE MODULE STRUCTURE -------- * * This code assembles into 3 object files: L(oader), M(ainline), * and K (a satellite of M). They are bundled together by LINKKLM into * the load module SHUTTLE2 or SHUTTLE2E. * * FILE ORG LOAD POINT * in SHUTTLE2 OR SHUTTLE2E * * K 210 E10 80-column driver; subroutines of M * V--- 300 F00 Any one of the 80-column card overlays (added * at configuration time) * L 804 804 Loads K&M into snapshot card, then dies. * M A800 1000 main code kept in snapshot card * (to 2800) * ********************************** * * SHUTTLE EQU 1 SHUTTLE2 EQU 0 ;for code needed on 2+ but not //e SHUTTLE2E EQU 1 ;for code needed on //e but not //+ APPLE2E EQU 1 COPYKIT EQU 0 COPYKIT2E EQU 0 COPYKIT2 EQU 0 SHELL EQU 0 UNIDISK EQU 0 ISRWOTS EQU 1 ENGLISH EQU 1 GERMAN EQU 0 PRINTERRUPT EQU 0 AUXINTRLEAV EQU 1 DIAGNOSTICS EQU 0 GOMON EQU 0 CODEINSTACK EQU 1 ; INCLUDE /S/COMMON/EQUATES ORG $210 ;LEAVE ROOM FOR ONE LINE OF KEYBD BUFFER KSTART EQU * INCLUDE /S/COMMON/BOOTADISK INCLUDE /S/COMMON/CLRMSGAREA INCLUDE /S/COMMON/GET.FLAGPAGE ENDCODE2 EQU * IFGT *-$2FF ;DOES PRECEDING CODE CLOBBER PAGE 3? FAIL 3,.TOO MUCH CODE ON PAGE TWO. FIN ORG KSTART+$F0 ;=0300 PAGE3 EQU * DO SHUTTLE2 INCLUDE /S/COMMON/VNONE ;dummy 80-col cad driver ORG PAGE3+$A6 ;leave room for V*** overlays INCLUDE /S/COMMON/SWAP1PAGE INCLUDE /S/COMMON/DCT ELSE INCLUDE /S/COMMON/V2E80COL INCLUDE /S/COMMON/SWAPAUX INCLUDE /S/COMMON/SETPGMSIZE FIN INCLUDE /S/COMMON/RESTORE ; ENDCODE3 EQU * IFGT *-$3F2 ;DOES PRECEDING CODE CLOBBER RESET VECTOR? FAIL 3,.TOO MUCH CODE BEFORE $03F2 RESET VECTOR. FIN ; ORG PAGE3+$F2 INCLUDE /S/COMMON/VECTORS ; ORG $804 ;****** OBJ CODE MODULE 'L' STARTS HERE ****** INCLUDE /S/COMMON/LOADER INCLUDE /S/COMMON/SSUTES INCLUDE /S/COMMON/CALLDOS INCLUDE /S/COMMON/SWAP1 ;LST ON ENDCODEF EQU * IFGT *-$E10 ;DOES PRECEDING CODE CLOBBER NMIHANDLER2? FAIL 3,.TOO MUCH CODE BEFORE $E300 IN CKCODE FIN INCLUDE /S/COMMON/NMIHANDLER2 INCLUDE /S/COMMON/NMIHANDLER1 INCLUDE /S/COMMON/NMIHANDLER3 INCLUDE /S/COMMON/SWAP2E INCLUDE /S/COMMON/ESCMSG INCLUDE /S/COMMON/MAINLINE INCLUDE /S/COMMON/RESUME INCLUDE /S/COMMON/SWITCHES INCLUDE /S/COMMON/PRMENU INCLUDE MENUTABLES INCLUDE /S/COMMON/DUMP INCLUDE /S/COMMON/LOAD ;LST OFF ;LST ON INCLUDE /S/COMMON/BLOCKIO INCLUDE /S/COMMON/TABLE ;LST OFF INCLUDE /S/COMMON/DETVIDA INCLUDE /S/COMMON/EXITIFESC INCLUDE /S/COMMON/CHANGEDRIVE INCLUDE /S/COMMON/CLEAR INCLUDE /S/COMMON/GETSR.A ;INCLUDE /S/COMMON/GETPRINSLOT ;LST ON INCLUDE PROGSWAP ;LST OFF ;LST ON INCLUDE OPENCLOSE INCLUDE SHUTTLETABLES ;LST OFF ;LST ON INCLUDE GETNAME ;LST OFF INCLUDE FLAGSWAP INCLUDE VALIDPROGKEY ;SCMSG JSR CLRMSGAREA ;RTS ;LST ON INCLUDE SWAPPART ;LST OFF INCLUDE /S/COMMON/FINDRPTDAREA ;LST OFF INCLUDE SHOWPROGNO DO SHUTTLE2E INCLUDE /S/COMMON/SWAP1PAGE FIN INCLUDE /S/COMMON/SAVE DO GOMON INCLUDE /S/COMMON/GOMONITOR FIN DO SHUTTLE2E INCLUDE /S/COMMON/DCT FIN INCLUDE /S/COMMON/RWTSE INCLUDE /S/COMMON/MSGOUT INCLUDE /S/COMMON/EOR.LOGO ;INCLUDE /S/COMMON/SAVE ;LST OFF INCLUDE /S/COMMON/RWOTSEQUATES INCLUDE /S/COMMON/RWOTS2 DO SHUTTLE2 INCLUDE /S/COMMON/DETVID ELSE ;INCLUDE SET128 FIN INCLUDE /S/COMMON/SET80CARD ENDCODEBD00 EQU * IFGT *-$BD00 ;DOES PRECEDING CODE EXTEND INTO C000? FAIL 3,.TOO MUCH CODE BEFORE $BD00 FIN LST ON ;END OF CODE UNTIL BD00 ENDDCODEBD00 EQU * LST OFF INCLUDE /S/COMMON/RWOTS1 LST ON ENDCODEBF EQU * IFGT *-$C000 ;DOES PRECEDING CODE EXTEND INTO C000? FAIL 3,.TOO MUCH CODE BEFORE $C000 FIN SPACELEFT EQU $BD00-ENDDCODEBD00 ;free space remaining!!!!!!!!! ;LST ON,VSYM,ASYM ;LST ON,VSYM,NOASYM LST OFF,NOVSYM,NOASYM m; Q6 ٩  #JJJJ   &LϪ` 8   /`  E q {)x ` ξ q `" [ X"` `̠``̽H Gh(  G`(i (Hh { >(H h ` t N`  ͭ * k 0`а `` L`=?C`py|`*`` ޼ ˍˍ p j`ŠTLWLF#"!  X  Q a G   Q  |  D IM 3  K  (H hLo   JQ`fm騍 7?٨쨍嗀<èD}e ը6  ܨ )x X 8 (8 )8  Hh G   L 0`)` `  ŠŠ>@ABCDEFGHIJKLMNOPQRSTU  ` : ``  `     M N`  <<<<<<<8;Ϩ̨᨝䨝` H)hH) h H h Hh`x60,*  L* hL L L L (`   8L S `Y W x`L`΢ `H =Y h箝Ll `$ [[ 庍Y   ` L= Y `8 ` XM``L `  o`l T ` 㾠 H)ih ` `dž  ``( - `8` 8 XɛM` ` /`` X i ΠōH hh` hhȎ  l able dbl hires on a 64K pgm. * * Shuttle 9.0D * further solution to p g5 K0 ө  (JJJJ   &LϪ` r8   `  Q v )x ` Press to boot G ` & ٲ q`" [ X"` ```̹H Gh(  G`(i (Hh { 1(H h ` y `  / k 5`а `` `=?C`py|`*`` ˍˍ O "j` H(`TLWӫ(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L ŝ8𨍙,L ~  ` `XLݨިިިݨ`  þ` y S D 1 L$ e { ) ͮLߪ    X H qh LW( `@ I `,0` / X ` Q0 ./` X ?  | q` x  x8  X g , ~ z( e e y ~ ګ  {L0)ɀ` D0  b bͨ bШ b j bD`j`0 jj`X)x`ͮ ) - `ĎĠ@Lĺ)X )x`  QPI )ɬhjjjMa,^`,_` PRTV $dިHHNݨ.ި.ݨhh` D >* `MN(`.*.*O`)&`)Ɍ` , ,` ,ϊ  ,`YȈ`!%0e%%$ Lʬ!`% -# к@ GLA L 3  !L !``<,ߪ˱AA@A庠61 報`JV`I > QP$ -)I S  SIL  ) ,L 2` / Ͱ 5 T(` oL5 v .  Ͱ Ͱ8  )`8`Lz` 󺽉` g K    ɭ e `g g ޮ   @ ߰8`h ` V V``Ǡˡ  PLEASE WAIT`0WRITE-PROTECTEDDISKIDRIVEERRORYDISK READ ERROR`  ['$ 䠭˿ٯΩ ` 8`` į ñ`  ATTENTION!報ξ` ` T ) S S W`8`8`,,`,,`,`i)I ` `80,.ȱȱI) ȱȱȱ[` @U @MFH, ޮh@ɀ288,EU ( ө i(`8`.`ɛ`` x (/"/ 0   x   `, ,` ` ٷ əLe8``ɛ`l ө " 0  D " A 0`  ` ` (` ñɍ`ɯɸ A`)` 忠򠲩 ` / r 5` ` v ? q`  c` & ٲ 0 ٲ LDz ٲ L `m8l`% '( 1(`,0 ` `*2l3m`y,%` 0͚+ T n y X` r )H ޮ @ ڳF QP S ڳ5 S  "3 ' ޴ q` q`  q k`8`  ޹ ` į  ñ` NOT ENOUGH MEMORY TO SAVE SCREEN DATA덠 忠򠲩 ` /m   5Lr ' 5 ʆ( ( 3 5( T` ~ ޮ8 k Q) S`    ޴`H v h  =` oC8 a@ % o- 2 / >L - ,  ` o a` Ԡ i il `` r   %8``ٝ ١8` Q0  / > ,``H H a(h ah`H ޮ h`  G ` `8 Q0 D` D` ͵ `$` ` Q)`)`)` o  ⶙ne `   堭$` [ⶄ$ ? J G` 8nJ`ⶹne욶 1 `۠͠Ҡՠՠ֠ΠΠ͠ `ҷ i i iɱ ɵ )̜8`{ | = D /  H 5; S` Ը X ฌX`8H h  %`  % `< :` %` <`= ,ŭC`А W TC`BA`<AȱBȱ``0FFέ> Ϊ` \: CB Y`CYM> mrxUd j j`퍁<`{H)?hH)@@h):;H) JJJJ=: ̹͹`sq0 / ' 5  ' 5 T` `` ` ` [$ H TP h 욶 $i윶`$ [' `8$º  `,0LhH (`ة h``ߺ`,$ [hh 3 LHH`8$HjJJJJh)F` ` `Qg`jf5HhHh݌6 ؅G WVj 0 D$Ι󭉼H` yΜ( Wh WLŻ.̉H yhΑh@(LF.iHIhJJJJHh)-Т( ܽ(& ½$8` * _N`* $50*$50LJJJJ` ۠ )`. *n  )  `  `Р̠۠֠͠ɠנۢ>J>J>VU)?`8'0|&HhHh VY)'&Y)ꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*͉S&'8*3IiΉ&& 8  '  & )*++`FG8`0($ p,&"Э{I峁^,Ȗd2Hjf5 h $50`  !"#$%&'()*+,-./0123456789:;<=>?;>:8o>oȑ>ppȑ>> :op` {KpnͶ @p;=po:i>?Ek?>Q>> 5L壥>  5e>>?́?`>ȥj>>m>` T`m8injkiljo풼S ?@$I0 U)VJ *T)`l8`a HbIJhjǾȾɾ p٭b=a to boot 9 B` Dz M q`" [ X"`30+, `Ϊծ```ƪɮͮƢɱ߮Ůۭ߮ծ߮׮Ծ̮ۮϮͮƮɪɪ׮ݮůӮ̮ծ߮Ϯ̮ˮӮϮƮԮ`,0Lإ H(`̮ԮTLWث(j.j.j.jJ.jJJ 8aLaLaaCȩݨhhh8ŝŘH H( L.LLb@H { L ŝ8𨍙,L   ` `XLݨިިިݨ`  9þ` y (   DL$ n ) ͳLߪ   X ȲH qh LW' `@ I `,0` / X ` 0 Y kDz./` X ǹ q` x  x8 X l 1 {(   n y  ߫ {L0)ɀ` 0  g gͨ gШ gj gD`j`0 jj`X)x`ͳ ) - `ĎĠ@Lĺ)X )x` ` PRTV $dިHH#ݨ.ިૐ.ݨhh``#(` K$ K (`0 S`i ei`Y`)&` , ,` ,ϊ  ,`Ƞ S`!%0e%%$ Lɬ!`% -# @ 9 LA L h  L ``>+һLߪAA@A庠61 B報``3 ҭ ﭰ  `   (` ; S038   88  `8`F`  ] K r v  ۭ  5 `g   @ 8`h ͮ`  ``Ǡˡ  9PLEASE WAIT`设WRITE-PROTECTEDDISKDRIVEERRORDISK READ ERROR`  ['$ B䠭˿ٯΩ a` 8`` | `  9ATTENTION!報ξ` 9`  S `8`8`,,`,,`,`8i)I O0` `80,ȱ0ȱ) +ȱ,ȱ8ȱ` U  M4FH, h@ɀ288䢮  ( ө !(`8`0,,+8`ɛ`` x (/"/ 0   x H)3 h wH ɛHh0h }Lch fLG 8 h` 8 ʽ 3`$8(0 4$ )<݈ `  `, M,` ñ` ޱ əLe8``ɛ`l ө $ I 0 D(6 k I h)7 0` 9 ` ` O` ɍ`ɯɸ h`)` 9忠򠲩 ` ҭ ` 8` .9 k Y ǹ q` Ю `Dz  M ñ0 L %Lв <`m_l`% '( f(`+0Dz <`  `*2l3m`y+%` 09+89   ,9:89 g y X` )8 0 2   I/ r#9 ⴰ ` `  y`8`  f ` | ֯ ` 9NOT ENOUGH MEMORY TO SAVE SCREEN DATA덠 B忠򠲩 ` ̭ 篥m   L ʆ0( ( ( `  8 y` ( 3 r9 `H3 ; Sh + `  ѵ ` C9 ;` 9Ԡ ! !l<`I Y8``;<` ѵ`9D<`H YH Y ;(h ;h`H h` 98 B`8 0 ` y `9@D<$`9D D` )D`9D)`9D)`: o  9  `   9堭$` [;$ ޶ J ` 8 J` 9 f `ͮմ˪֮8 9 WWVV``q i i iɱ ɵ );8`  ҭ ̷ з ` \ h`8H A h *` * A`ķ ·` *` ķ`ŷ 9,ŭ0˷`0А 0  ˷`ʷɷ`ķɷȱʷȱ`0FFέƷ Ϊ` ䷭· ˷ʷ  `˷ḍոƷ ݸ  `퍁ķ`IH)ǷhH)@ȷh)·Q÷H) ķhȷ)pƷJJJJŷ· TU`}}}sq0} ̭  ` `0` ` ` [$ 9ȭ $i ;`$ [' `hH (`' 4```,$ [hh h LJHH`8$HjJJJJh){` ` `Q͜`ѻƻ()jf5HhHhϻ݌'6 ؅G)+ 3Vj 0λϻ D$λ󭾻H` yѻ(ƻ h L.̾H yhƻh@(L{.,iHhJJJJHh)-Т( ܽ(& ½ϻ$84` * N`* $50ƻ*$50ƻLJJJJ` ծ  廭 4 ` 9` )`- ) p ` x x``*L| ) *. j ` B򠸰俠ٯΩ a *(jI `  B`ήݮ̮ծĮ̮̾ۮ׮֮ɮ>J>J>VU)?`8'л0|&HhHh VY)'&Y)лꪽ)' `Hh`V0^*^*>&` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`&&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*;S&'8*3Iiξ&& 8  '  & )*++`FG8`0($ p,&"Э{I峁^,Ȗd2H)jf5 h $50ƻ`  !"#$%&'()*+,-./0123456789:;<=>?;>:8o>oȑ>ppȑ>> :op` {KpnͶ @p;=po:i>?Ek?>Q>> 5L壥>  5e>>?́?`>ȥj>>m>` T`m8injkiljo풼S ?@$I0 U)VJ *T)`l8`a HbIJhjǾȾɾ p٭b=ac~? cx~q@|p~`~|C?C<`xp0|~qp~c~cqvxyz{|}~c}?@G~c`?@x?~q@{|@?|~Gx`?|p`pO x~c?|p~xGq~OB""$@H@  #@BF BDxcxFcx?x~qcc|c~Gq? cx~qxCC~a?`8xcxFx? ~qcFc~Gqcx~q|@|xp!x@xaGcx?|~qc~c~? cx~q@|@x~`~|C?C<`c{??@G~s`@x?q@y~@`?|g;~Gx`?|`bpO\@~889\?.`\~}q8>x~}c_?|p~xGq~O <Ng`q~}N;x8`9:~>xcxFcx?p~qccxc~Gq? cx~qxCC~a?`8x``p< ~qp@`x~q|@|xp!x@xCGcx?|~qc~c~? cx~qq~?|G@~~p|~C?@?<pqs_c```x@q@x`~@`?|s{|Gx`?|0pcpoxb` QDH$1@Bb "BDx||GOxp~xGqo~ x`x|>x|`cxFx?p~qcxc~Gqcx~qxa~a@8x```<~q`@ `x~q|C|?xp0xCxCGcx?|~qc~c~? cx~qGc??|@C@x~qgoo~c``?@Gx~q@x@~@`?|}{yGx`?|pcp/A@QH !@B"yx?xq`?|p`g?||@x`x <~px`cxFx?`~qcpc~Gqcx~q`a|~a@8`p``<~q`` `x~q||C|?xp0xCxGcx?|~qcc~c~q? cx~qc?@G~~@A@q_~qOow~c?@`Cxp?~q@x~@`x~~{c?|`?|pcO?|p/gyDGGQ( @By@x`~?@Cxx`p <~px`cxFx?`~qcpc~Gqcx~qpp~|@88xGcx?<~qcc~? cx~q`?~~~?|a~|C?x0xaxGcx?|~qcc~c~q? cx~qc?@G~~@@qos~c?|@x@?~q@x~~@`x>wc?|p~xq~/"#BL&Bg|Bs @>|xA>yxpp>@pxpcxFx?@~qc`c~Gqcx~q|p@~|@8|xpGcx?<~qc c~? cx~q@|?|a~{|C?x8Xax `0|~q`~c~ c~qc?@G~@@qfx|c?|@?|?Gx@x~@`|x~oc?|p~xGq~/x""$$B^$@ Hypp0|p~`c|pa~|C?`xpcxFx?D~qcbc~Gqcx~qpx~|!xpxpGcx?|~qc> c~? cx~q@|@~`~|C?C8`x `0|~q`~c~ c~qc~?@G~C@@q?$|~c?|@?|Gx`?|x~`px~_c?|p~xGq~o""$DAP@ D!@By` `0| `~@ c| @ D$(4)"@D$"PREFIX/MENU"9@D$"-BASIC.SYSTEM"(SWAPPART9%̬_SWAPPART2"_$TEMP>_VALIDPROGKEY_VERSIONn_VISION80.0~_VNONE.0 R_WILLMSGhʪ_XLATE.06_(XLISTING,_ SBTL .SWAP MBOARD 64K WITH ANY PARTITION. ; ; Enter with partition number in X-reg. SWAPPART EQU * STX PARTITION JSR GETPARTTBL ;get ptrs for this part. JSR GET64KTBL ;get ptrs for motherboard ram DO APPLE2E LDA PARTSLOT ;aux slot = 0 BEQ MULTIAUX ;bnch if an aux slot card FIN ; JSR GET1STPARTPG ;point to page in ramcard JSR GET1STMBPAGE ;and to page in m'board PSWAPLOOP EQU * JSR SWAPPARTPG ;swap the 2 pages JSR GETNEXTPARTPG ;point to next page JSR GETNEXTMBPAGE BCC PSWAPLOOP ;bnch if more pages found DO APPLE2E BCS SWAPEND ; ; MULTIAUX EQU * ;swap a partition with 'slot 3' type ramcard ; like glanmire, neptune, ramworks. LDY #0 LDA PARTACCESS ;which 64k bank to enable? STA (PTBLPTR),Y ;set control address JSR SWAPAUX ;swap main and auxiliary ram LDY #0 LDA #AUX0ACCESS ;reset normal aux bank STA (PTBLPTR),Y SWAPEND EQU * FIN DO 0 ;until more space is made LDA ERRORCOUNT BEQ SWAPEND1 ;bnch if no errors JSR RAMERROR SWAPEND1 EQU * FIN RTS ; ; ; ;format of PARTTYPE: type number of the partition's card, ; plus high bit set if control address should be written to ; rather than read, e.g. for Vision-256 cards. ;Aux-slot type cards have BITAUX set. ; ;Format of PARTACCESSTBL entry follows. Note that this value ;is analysed and derivative values stored in the following ;table of parameters. ;format for aux-slot cards: bank number within card. ;format of Saturn-type access addr: NX where N is slot+8, and ; C0NX is the addr to be accessed. ; The addr is that of the highest of the 4 switches, ; or the highest of the 4 control values (on Big Board) ; that select the 16-K blocks in the partition. ;Whole value is stored in PARTACCESS. ;right nibble is stored in PARTACCESS4. ;bits 4-6 are stored in PARTSLOT16 and (right-just.) in PARTSLOT. ;(These values are zero for aux-slot cards.) ; ;format of Slinky access addr: ; eight bits: 7 654 3210 ; 1 SSS BBBB ; | | |___ 64K bank within card ; | |___________ slot number ; |________________ always 1 ; PARTTYPE DFB 0 ;card id as specified in EQUATES PARTACCESS DFB 0 ;partition access code copied from PARTACCESTBL PARTACCESS4 DFB 0 PARTSLOT DFB 0 PARTSLOT16 DFB 0 PARTRWFLAG DFB 0 ;nonzero if vision256 reqs a write to control addrr PARTAUXFLAG DFB 0 ;nonzero if card is in aux slot PYETTODO DFB 0 ;# OF PGS TO SWAP PARTPAGE DFB 0 ;NXT PG 2 B SWAPPED MBPAGE DFB 0 ;ACTUAL PAGE OF MBRAM PROVIDED TO SWAP BY ACCESS ROUTINES ; GET1STPARTPG EQU * LDY #0 ;table top BEQ PGETNXTBUNDLE ;point to next bundle of pages GETNEXTPARTPG EQU * JSR PDECPAGE ;next pg in same bundle BNE PSOMELEFT ;bnch unless bundle exhausted LDY PNEXTBUNDDISP ;get disp into table ; PGETNXTBUNDLE EQU * JSR PGETBUNDLE ;get ptrs from tble STY PNEXTBUNDDISP ;save loc of next ptrs PSOMELEFT EQU * CLC RTS ; PNEXTBUNDDISP DFB 0 PRESETACCESS EQU * ; CLOBBERS CARRY AND REGS SEC BCS PABRANCH1 ;UNDO ACCESS SWITCHING ; PGETACCESS EQU * ;DO BNK SWTCHNG TO ACCESS THIS BUNDLE CLC PABRANCH1 LDA #0 PABRANCH BEQ BANKSOFF ;GETBUNDLE HAS MOD-ED CODE WITH LOC OF ACCESS ROUTINE ; ; PBASE EQU * ;BASE FOR DISPLACEMENTS ********ACCESS ROUTINES********** ; MUST BE BRANCHABLE FROM ABRANCH ; ;these are accessed before and after every page-swap. ;For the saturn type cards, the logic is: ;before swap: ; mb ram is already bank-switched and r/w-able. ; if mb ram is in lang-card addr space, ; then do ; swap mb ram down to page 2. ; turn off lang-card ram. ; note ram's new location in page 2. ; enddo; ; bank-switch 16k bank of saturn. ; bank-switch 2k bank of saturn and enable saturn. ; rts. ; ;after swap: ; disable saturn. ; if mb ram is in lang-card addr space ; then do ; (as above). ; enddo; ; rts. ; ;note that this may turn on the lang card when its already on, ; and turn it off at the end unneccessarily. ; ; BANK1ON EQU * LDA #RPWPB1 ;LOWER BYTE OF C08X BNE BANKON ;ALWAYS ; BANK2ON EQU * ; TURN ON LANG CARD BANK, AND MOVE PAGE TO 0200 IF NECC, ; FOR BENEFIT OF SATURN-TYPE CARD. LDA #RPWPB2 BANKON EQU * BCS BANKSOFF ;SET IF RESETTING ACCESS PHA JSR SWAP2IFNECC ;resolve addr space conflict JSR SET16KBANK ;turn on appropriate 16K bank. PLA JSR ADJSLOT ;mod addr for card's slot JSR HITC0XX ;turn on card ram with 2k bank RTS ; BANKSOFF EQU * LDA #RMWMB2 ;C081 JSR ADJSLOT JSR HITC0XX JSR SWAP2IFNECC ;SWAP PG 2 BACK INTO l.card if necc RTS ; SET16KBANK EQU * LDA PARTACCESS4 JSR ADJSLOT ;x:=(n+8)A LDY PARTTYPE ;hi bit set: it's a vision-256 BPL READCTRL ;bnch if not STA $C000,X ;write any old value to ctrl addr RTS READCTRL EQU * CPY #IDBIGBOARD ;if its a big board, branch BEQ BIGBD JSR HITC0XX ;TURN ON 16K BANK RTS ; BIGBD EQU * LDA #BIGBOARDADDR ;control addr for board JSR ADJSLOT ;adjusted for slot no. LDA PARTACCESS4 ;get bank no. to specify STA $C000,X ;store it to control addr RTS ; ; SLINKYACC EQU * ;slinky just needs page put in 'mbpage'. LDA PARTSLOT ORA #$C0 STA SLINKENABLE+2 SLINKENABLE BIT $C500 ;turn on card after a reset LDA BUFFADDR+1 ;PAGE TO BE SWAPPED STA MBPAGE ;OF MOTHERBOARD ROCONCONT EQU * RTS ; SWAP2IFNECC EQU * ; IF MB PAGE = LC AREA, TURN ON LC,SWAP PG TO PG2,TURN OFF LC. LDA BUFFADDR+1 ;MB PG CMP #$D0 ;LC? BCC NOTNECC JSR GETACCESS ;ENABLE LC LDY #2 LDA BUFFADDR+1 SWAP LC PG JSR SWAP1PAGE ;DOWN TO 0200 JSR RESETACCESS ;TURN OFF LC LDA #2 NOTNECC EQU * ;EXIT STA MBPAGE RTS ; ; ; ROCONACC EQU * ; ; DO 0 ;temp disable rocon compat, for space ; ; BCS ROCONCONT ;RESETACCESS JUST RETURNS. ; FORMAT OF ACCESS ADDR : 7 6 5 4 3 2 1 0 ; ..................... 1 SLOTNO 0 0 0 64KBANKNO LDA #01 JSR ADJSLOT ;MAKE (C0)N1 LDA PARTACCESS ;BANK 0 OR 1 STA $C000,X LDA #00 JSR ADJSLOT ;MAKE (C0)N0 LDA PAGEINDEX ;SERIAL NO OF PAGE STA $C000,X ;BANK-SW TO PAGE LDA PARTSLOT ;SLOT NO ORA #$C0 ;CN(00) STA PARTPAGE ;ADDR OF PAGE 2B SWAPPED ; FIN ; ; ; *******END OF ACCESS ROUTINES ***************************** ; ; PDECPAGE EQU * ;NXT PG IN BUNDLE DEC PARTPAGE DEC PYETTODO RTS ; ; REPEATTABLE EQU * DEC PARTACCESS4 ;MOVE TO NEXT 16K BLOCK DOWN WITHIN SAME 64K LDY #0 ; PGETBUNDLE EQU * LDA (PTBLPTR),Y BEQ REPEATTABLE ;WRAP AROUND TO TOP OF TABLE STA PYETTODO ;BUNDLE LENGTH INY LDA (PTBLPTR),Y STA PARTPAGE ;PAGE ADDR INY LDA (PTBLPTR),Y STA PABRANCH+1 ;ACCESS ROUTINE INY RTS ; ROCONTBL EQU * ;TBL FOR ROCON128 CARDS DO 0 DFB $FF,0,>ROCONACC-PBASE ;256 PAGES LONG, DUMMY ADDR, ACCESS RTN. DFB 1,0,>ROCONACC-PBASE ;NECC BCS PREV LINE CANT HAVE $100 PAGES LONG. DFB 0 ; FIN ; LEGENDTBL EQU * SATURNTBL EQU * ;TBL FOR SATURN CARDS DFB $30,$FF,>BANK2ON-PBASE DFB $10,$DF,>BANK1ON-PBASE DFB 0 ;END OF TABLE ; SLINKYTBL EQU * ;table for slinkies DFB $FF,$00,>SLINKYACC-PBASE DFB $01,$00,>SLINKYACC-PBASE DFB 0 ;end of table ; ADJSLOT EQU * ADJUST CONTROL ADDR FOR SLOT STA TEMP1 LDA PARTSLOT16 ;slot*16 ORA #$80 ;hi bit on ORA TEMP1 ;ADD RT NIBBLE TAX RTS ; ; SWAPPARTPG EQU * ;swap a page btw motherboard 64k and card 64k JSR PGETACCESS ;enable card ram, & handle addr space conflicts btw pages to be swapped LDA PARTTYPE CMP #IDSLINKY ;if its a slinky BEQ SLINKYSWAPPG ;use speciial swap routine LDA MBPAGE LDY PARTPAGE ;addr of page on card JSR SWAP1PAGE ;BTW Y AND A REGS JSR PRESETACCESS ;disable card ram RTS ; ; ; SLINKYSWAPPG EQU * ;swap pg btw mb and slinky ram LDA MBPAGE ;mboard page to swap STA MBPG+2 STA MBPG2+2 ;mod swap loop code LDA PARTSLOT16 ORA #$80 ;=(N+8)0 TAX STX SLOW+1 INX STX SMED+1 INX STX SHI+1 INX STX SDATA+1 STX SDATA2+1 JSR SETSLINKY ;set slinky addr register LDY #0 SSWAPLOOP EQU * MBPG2 LDA $1000,Y STA $0400,Y ;copy main ram page to buffer INY BNE SSWAPLOOP SSWAPLOOP2 EQU * SDATA LDA SLINKYDATA MBPG STA $1000,Y ;copy slinky page to main ram INY BNE SSWAPLOOP2 JSR SETSLINKY ;repair slinky addr counter SSWAPLOOP3 EQU * LDA $0400,Y SDATA2 STA SLINKYDATA ;copy buffer to slinky INY BNE SSWAPLOOP3 RTS ; SETSLINKY EQU * LDA #0 SLOW STA SLINKYLOW ;which byte within page LDA PAGEINDEX SMED STA SLINKYMED ;which page LDA PARTACCESS4 ;which 64K bank of slinky? SHI STA SLINKYHIGH RTS ; ; PARTITION DFB 0 ;WORK ADDR FOR PART TO SWAP ; ; ; GETPARTTBL EQU * ;get ptrs for this part. ; Input: partition type and access code (from tables) ; Output: partition type, codes, slot, and access table. ; (PARTTYPE, PARTACCESS4, PARTSLOT, PARTSLOT16, PTBLPTR) LDX PARTITION GETPARTTBLX EQU * LDA PARTTYPETABLE,X PHA AND #BITRW ;requires a write to control address on vision-256? STA PARTRWFLAG PLA PHA AND #BITAUX STA PARTAUXFLAG PLA AND #$F STA PARTTYPE TAY LDA PARTACCESTBL,X STA PARTACCESS ;raw code for this part. PHA AND #$F ;isolate right nibble CPY #IDBIGBOARD BNE NOTBB ;if big board then ASL ASL ORA #$3 ;times 4, then add 3. NOTBB EQU * STA PARTACCESS4 PLA LDY PARTAUXFLAG ;is card in aux slot? BEQ NOTAUXSLOT LDA #0 ;specify slot = 0 NOTAUXSLOT EQU * AND #$70 ;01110000 STA PARTSLOT16 LSR LSR LSR LSR STA PARTSLOT LDA PARTTYPE ASL A ;MULT BY 2 TAX LDA TBLTBL,X STA PTBLPTR LDA TBLTBL+1,X STA PTBLPTR+1 RTS ; ;Addrs of tables of info on cards, indexed ;by partition type code. (saturn=1). ;The table addrs for slot 3 - type cards ;point directly to control addrs. TBLTBL EQU *-2 DW SATURNTBL ;parttype 1 DW ROCONTBL DW LEGENDTBL DW RAMWORKSADDR DW NEPTUNEADDR ;control address DW AUXMEMADDR DW SLINKYTBL ;parttype 7 DW SATURNTBL ;bigboard = type 8 ; ; PARTITION DFB 0 ;WORK ADDR FOR PART TO SWAP ; ; ; GETPARTTBL EQU * ;get ptrs for this part. LDX PARTITION GETPARTTBL2 EQU * LDA PARTTYPETBL,X STA PARTTYPE LDA PARTACCESSTBL,X STA PARTACCESS LSR LSR LSR LSR AND #7 ;generate slot number STA PARTSLOT LDA PARTTYPE ASL A ;MULT BY 2 TAX LDA TBLTBL,X STA PTBLPTR LDA TBLTBL+1,X STA PTBLPTR+1 RTS ; ;Addrs of tables of info on cards, indexed ;by partition type code. (saturn=1). ;The table addrs for slot 3 - type cards ;point directly to control addrs. TBLTBL EQU *-2 DW SATURNTBL ;parttype 1 DW ROCONTBL DW LEGENDTBL DW RAMWORKSADDR DW NEPTUNEADDR ;control address DW AUXMEMADDR DW SLINKYTBL ;parttype 7 DW SATURNTBL ;bigboard = type 8 ; ; SBTL .WAS A VALID PGM NUMBER SELECTED?. VALIDPROGKEY EQU * ; ;IF KEY IN 'A' IS VALID PGM NO., ;PASS BACK PROGRAM NO. AND CLEAR ;CARRY. ; CMP #$B1 BCC NOGOODV CMP #$B5 BCS NOGOODV AND #$0F TAY DEY CPY PROGQUANT BCC VEXIT NOGOODV EQU * SEC VEXIT EQU * TAY RTS ,`,`-O,,,iȅ( l`,Ȍ` Ȍ`P`) ```; WILLMSG EQU * JSR CLRMSGAREA JSR MSGOUT DFB CR,CR ASC .Will this program use. DFB CR DFB 0 RTS STST`HJJJJJh)L4 SOURCE FILE #01 =>SHUTTLE INCLUDE FILE #02 =>/S/COMMON/EQUATES INCLUDE FILE #03 =>/S/COMMON/BOOTADISK INCLUDE FILE #04 =>/S/COMMON/CLRMSGAREA INCLUDE FILE #05 =>/S/COMMON/GET.FLAGPAGE INCLUDE FILE #06 =>/S/COMMON/V2E80COL INCLUDE FILE #07 =>/S/COMMON/SWAPAUX INCLUDE FILE #08 =>/S/COMMON/SETPGMSIZE INCLUDE FILE #09 =>/S/COMMON/VECTORS INCLUDE FILE #10 =>/S/COMMON/LOADER INCLUDE FILE #11 =>/S/COMMON/SSUTES INCLUDE FILE #12 =>/S/COMMON/CALLDOS INCLUDE FILE #13 =>/S/COMMON/SWAP1 INCLUDE FILE #14 =>/S/COMMON/NMIHANDLER2 INCLUDE FILE #15 =>/S/COMMON/NMIHANDLER1 INCLUDE FILE #16 =>/S/COMMON/NMIHANDLER3 INCLUDE FILE #17 =>/S/COMMON/SWAP2E INCLUDE FILE #18 =>/S/COMMON/ESCMSG INCLUDE FILE #19 =>/S/COMMON/MAINLINE INCLUDE FILE #20 =>/S/COMMON/RESUME INCLUDE FILE #21 =>/S/COMMON/SWITCHES INCLUDE FILE #22 =>/S/COMMON/PRMENU INCLUDE FILE #23 =>MENUTABLES INCLUDE FILE #24 =>/S/COMMON/DUMP INCLUDE FILE #25 =>/S/COMMON/LOAD INCLUDE FILE #26 =>/S/COMMON/BLOCKIO INCLUDE FILE #27 =>/S/COMMON/TABLE INCLUDE FILE #28 =>/S/COMMON/DETVIDA INCLUDE FILE #29 =>/S/COMMON/EXITIFESC INCLUDE FILE #30 =>/S/COMMON/CHANGEDRIVE INCLUDE FILE #31 =>/S/COMMON/CLEAR INCLUDE FILE #32 =>/S/COMMON/GETSR.A INCLUDE FILE #33 =>PROGSWAP INCLUDE FILE #34 =>OPENCLOSE INCLUDE FILE #35 =>SHUTTLETABLES INCLUDE FILE #36 =>GETNAME INCLUDE FILE #37 =>FLAGSWAP INCLUDE FILE #38 =>VALIDPROGKEY INCLUDE FILE #39 =>SWAPPART INCLUDE FILE #40 =>/S/COMMON/FINDRPTDAREA INCLUDE FILE #41 =>SHOWPROGNO INCLUDE FILE #42 =>/S/COMMON/SWAP1PAGE INCLUDE FILE #43 =>/S/COMMON/DCT INCLUDE FILE #44 =>/S/COMMON/RWTSE INCLUDE FILE #45 =>/S/COMMON/MSGOUT INCLUDE FILE #46 =>/S/COMMON/EOR.LOGO INCLUDE FILE #47 =>/S/COMMON/RWOTSEQUATES INCLUDE FILE #48 =>/S/COMMON/RWOTS2 INCLUDE FILE #49 =>WILLMSG INCLUDE FILE #50 =>/S/COMMON/RWOTS1 01 SHUTTLE VERSION NUMBER 07-AUG-85 PAGE 2 0000: 2 ********8.9F SHUTTLE ****** INCLUDE FILE #02 =>/S/COMMON/EQUATES INCLUDE FILE #03 =>/S/COMMON/BOOTADISK INCLUDE FILE #04 =>/S/COMMON/CLRMSGAREA INCLUDE FILE #05 =>/S/COMMON/GET.FLAGPAGE INCLUDE FILE #06 =>/S/COMMON/V2E80COL INCLUDE FILE #07 =>/S/COMMON/SWAPAUX INCLUDE FILE #08 =>/S/COMMON/SETPGMSIZE INCLUDE FILE #09 =>/S/COMMON/VECTORS INCLUDE FILE #10 =>/S/COMMON/LOADER INCLUDE FILE #11 =>/S/COMMON/SSUTES INCLUDE FILE #12 =>/S/COMMON/CALLDOS INCLUDE FILE #13 =>/S/COMMON/SWAP1 INCLUDE FILE #14 =>/S/COMMON/NMIHANDLER2 INCLUDE FILE #15 =>/S/COMMON/NMIHANDLER1 INCLUDE FILE #16 =>/S/COMMON/NMIHANDLER3 INCLUDE FILE #17 =>/S/COMMON/SWAP2E INCLUDE FILE #18 =>/S/COMMON/ESCMSG INCLUDE FILE #19 =>/S/COMMON/MAINLINE INCLUDE FILE #20 =>/S/COMMON/RESUME INCLUDE FILE #21 =>/S/COMMON/SWITCHES ACB5: 104 LST ON ACB5: 105 INCLUDE /S/COMMON/PRMENU 22 PRMENU PRINT A SCREEN 07-AUG-85 PAGE 3 ACB5: 2 ********************************************************** ACB5: 3 * * ACB5: 4 * PRMENU - print a menu on screen * ACB5: 5 * * ACB5: 6 * This module displays a series of centered lines on * ACB5: 7 * the screen. On entry, the X and Y registers must * ACB5: 8 * point to a parameter list containing the text, and * ACB5: 9 * a list of the vertical spacing between the lines. * ACB5: 10 * The text must consist of strings of Ascii separated * ACB5: 11 * by hex zeroes. The vertical spacing list is a * ACB5: 12 * series of hex values, one per line of text, each of * ACB5: 13 * which specifies the distance of that line from the * ACB5: 14 * line above. A negative value signals the end of the * ACB5: 15 * list. If a value is zero, the corresponding line * ACB5: 16 * of text is not printed. (This gives software a con- * ACB5: 17 * venient way to erase menu lines during execution.) * ACB5: 18 * * ACB5: 19 * This module is used for all the Copykit and Shuttle * ACB5: 20 * menus. It is generally used in conjunction with the * ACB5: 21 * GETSR.A module which displays the cursor bar and * ACB5: 22 * reads the keyboard for the user's selections. * ACB5: 23 ********************************************************** ACB5: 24 * ACB5: 25 * ACB5: 26 ;X INDEXES TABLES, Y INDEXES MSGS ACB5: 27 ********************************************************** ACB5: ACB5 29 PRMENU2 EQU * ;LOAD PARMLIST ACB5:84 FD 30 STY LISTPTR ;PTR TO PARMLIST ACB7:86 FE 31 STX LISTPTR+1 ACB9:A0 03 32 LDY #3 ACBB: ACBB 33 PLOOP1 EQU * ;COPY.TO.THIS.ROUTINE'S.INPUT ACBB:B1 FD 34 LDA (LISTPTR),Y ACBD:99 F9 00 35 STA MSGTOP,Y ACC0:88 36 DEY ACC1:10 F8 ACBB 37 BPL PLOOP1 ;COPY 2 ADDRS ACC3:E6 21 39 INC WNDWDTH ;SO NO CR AFTER 40 CHARS ACC5:A2 00 40 LDX #0 ;INDEXES ACC7:86 25 41 STX VCURSOR ;PUT CRSR.AT.TOP.OF.PAGE ACC9: ACC9 42 MENULOOP EQU * ACC9: 43 ;X IS INDEX INTO VERT SPACING TABLE ACC9:8A 44 TXA ACCA:A8 45 TAY ;BCS INDIRECT USES Y ACCB:B1 FB 46 LDA (VERTPTR),Y ;# OF LINES TO MOVE DOWN FROM LAST MSG: FB=VERTPTR ACCD:85 CE 47 STA TEMP1 ACCF:30 10 ACE1 48 BMI NOMORE ;NEG TAG MEANS NO MORE ACD1:18 49 CLC ;CLR CARRY ACD2:65 25 50 ADC VCURSOR ACD4:85 25 51 STA VCURSOR ;MOVE CURSOR DOWN ACD6: 0001 52 DO SHUTTLE ACD6:A9 01 53 LDA #1 ;LEFT MARG +1 ACD8:85 24 54 STA HCURSOR ACDA: 55 ELSE S 56 JSR DISPMARGIN 22 PRMENU PRINT A SCREEN 07-AUG-85 PAGE 4 ACDA: 57 FIN ACDA:20 E4 AC 58 JSR DISPMSG ;DISPLAY IT ACDD:E8 59 INX ACDE:4C C9 AC 60 JMP MENULOOP ;DO ANOTHER MSG ACE1: ACE1 61 NOMORE EQU * ACE1:C6 21 62 DEC WNDWDTH ;RESTORE ACE3:60 63 RTS ACE4: 0001 65 DO SHUTTLE ACE4: 66 ELSE S 67 DISPMARGIN EQU * S 68 LDA WNDWDTH ;=41 S 69 STA HCURSOR S 70 LDY #$FF S 71 LLOOP EQU * ; S 72 DEC HCURSOR S 73 INY S 74 LDA (MSGTOP),Y ;GET NEXT CHAR: F9=MSGTOP S 75 BNE LLOOP ;IF ITS NOT NULL, S 76 LLOOPEND EQU * S 77 LSR HCURSOR ;40-TXT LENGTH /2 S 78 RTS ACE4: 79 FIN ACE4: ACE4 82 DISPMSG EQU * ;DISPLAY MESSAGE ACE4:A5 25 83 LDA VCURSOR ACE6:20 C1 FB 84 JSR BASCALC ;SET SCR VECTOR ACE9:A0 00 85 LOOP89 LDY #0 ACEB:B1 F9 86 LDA ($F9),Y ;F9=MSGTOP ACED:F0 2D AD1C 87 BEQ MSGEND ;IF CHAR=NULL,EXIT ACEF:A4 CE 88 LDY TEMP1 ACF1:F0 23 AD16 89 BEQ SKIPCOUT2 ;IF VERT=0, DONT SHOW LINE ACF3:20 4A FF 90 JSR SAVE ;save all regs ACF6: 0001 91 DO SHUTTLE ACF6:C9 40 92 CMP #SHOWNAMEFLAG ;is it the 'show name' marker? ACF8:D0 09 AD03 93 BNE NOTSN ACFA:AE A3 B6 94 LDX CURRENTPROGNO ACFD:20 84 B7 95 JSR SHOWNAME ;display name of current prog AD00:4C 13 AD 96 JMP SKIPCOUT AD03: AD03 97 NOTSN EQU * ;else display character AD03:C9 41 98 CMP #SHOWWSFLAG ;is it the 'print "WORKSPACE"' flag? AD05:D0 06 AD0D 99 BNE NOTSWS AD07:20 C7 AD 100 JSR WSMSG ;'Workspace' AD0A:4C 13 AD 101 JMP SKIPCOUT AD0D: AD0D 102 NOTSWS EQU * AD0D: 103 FIN AD0D:20 88 BA 104 JSR XLATE AD10:20 F0 FD 105 JSR COUT1 ;DISPLAY CHAR AD13: AD13 106 SKIPCOUT EQU * AD13:20 3F FF 107 JSR RESTORE ;restore all regs AD16: AD16 108 SKIPCOUT2 EQU * AD16:20 20 AD 109 JSR INCTOP ;INCREMENT MSGTOP POINTER AD19:4C E9 AC 110 JMP LOOP89 ;GET NEXT CHAR AD1C: AD1C 111 MSGEND EQU * AD1C:20 20 AD 112 JSR INCTOP ;POINT TO HEAD OF NEXT MSG AD1F:60 113 RTS AD20: AD20 114 INCTOP EQU * 22 PRMENU PRINT A SCREEN 07-AUG-85 PAGE 5 AD20:E6 F9 115 INC MSGTOP ;INC LOW-ORDER BYTE AD22:D0 02 AD26 116 BNE NOPAGE6 AD24:E6 FA 117 INC MSGTOP+1 ;HIGH IF NECC AD26: AD26 118 NOPAGE6 EQU * AD26:60 119 RTS INCLUDE FILE #23 =>MENUTABLES INCLUDE FILE #24 =>/S/COMMON/DUMP INCLUDE FILE #25 =>/S/COMMON/LOAD INCLUDE FILE #26 =>/S/COMMON/BLOCKIO INCLUDE FILE #27 =>/S/COMMON/TABLE INCLUDE FILE #28 =>/S/COMMON/DETVIDA INCLUDE FILE #29 =>/S/COMMON/EXITIFESC INCLUDE FILE #30 =>/S/COMMON/CHANGEDRIVE INCLUDE FILE #31 =>/S/COMMON/CLEAR INCLUDE FILE #32 =>/S/COMMON/GETSR.A INCLUDE FILE #33 =>PROGSWAP INCLUDE FILE #34 =>OPENCLOSE INCLUDE FILE #35 =>SHUTTLETABLES INCLUDE FILE #36 =>GETNAME INCLUDE FILE #37 =>FLAGSWAP INCLUDE FILE #38 =>VALIDPROGKEY INCLUDE FILE #39 =>SWAPPART INCLUDE FILE #40 =>/S/COMMON/FINDRPTDAREA INCLUDE FILE #41 =>SHOWPROGNO INCLUDE FILE #42 =>/S/COMMON/SWAP1PAGE INCLUDE FILE #43 =>/S/COMMON/DCT INCLUDE FILE #44 =>/S/COMMON/RWTSE INCLUDE FILE #45 =>/S/COMMON/MSGOUT INCLUDE FILE #46 =>/S/COMMON/EOR.LOGO INCLUDE FILE #47 =>/S/COMMON/RWOTSEQUATES INCLUDE FILE #48 =>/S/COMMON/RWOTS2 INCLUDE FILE #49 =>WILLMSG BC78: 162 LST ON BC78: 163 ;END OF CODE UNTIL BD00 BC78: BC78 164 ENDDCODEBD00 EQU * INCLUDE FILE #50 =>/S/COMMON/RWOTS1 ** SUCCESSFUL ASSEMBLY := NO ERRORS ** ASSEMBLER CREATED ON 14-DEC-83 15:21 ** TOTAL LINES ASSEMBLED 8314 ** FREE SPACE PAGE COUNT 25 DIAGSuHUSTON!' 'LONG.TESTGxLONGTEST#%PART2 M+SUBROUTINES%ERROR FFFALOOPxFFFAPx*LONGTEST.0 T8000x+NOISETEST.04 /DEALERS.READ.MEb&PRMENUq (17) :'"BLOAD FFFA"?"BRUN LONGTEST.0"E LST OFF ORG $2000 CHN LONGTEST2 PAGE SBTL .MAINLINE EXECUTED AFTER NMI. * * ; ;NOTE.WHICH.NMI.VECTOR.WAS.ACTUALLY.USED...SAVE.ITS.VALUE.IN.NMIOUGHT.AND.A.CODE.FOR.IT.IN.VECROUTE VECROUTE DFB 0 NMIOUGHT DW 0 * ROMVEC EQU * ;REACHED.IF.NMI.VECTORED.THRU.APPLE.ROM LDA #$FF ;INDICATES.VEC.VIA.ROM STA VECROUTE JMP ISBUTOFF * * * RAMVEC EQU * ;REACHED.IF.NMI.VECTORED.THRU.APPLE.RAM LDA #1 ;INDICATES.VECTOR.VIA.RAM STA VECROUTE JMP ISBUTOFF * * * TWOPLUSVEC EQU * LDA #2 STA VECROUTE LDA #>TWOPLUSVEC STA NMIOUGHT LDA #SSVEC STA NMIOUGHT LDA #NMILOOP BNE BADNMI PLA CMP #BLANK JSR PRMENU1 RTS * * * SHOWANYKEY EQU * ;DISPLAY MSG 'PRESS ANY KEY TO CONTINUE' JSR SETINV LDA DISPLAYLINENO PHA LDA #22 STA DISPLAYLINENO LDX #ANYKEY JSR PRMENU1 DO USER ;MSG FOR TECHIES ONLY, NOT USERS ELSE LDA #23 STA DISPLAYLINENO LDX #SPECIALKEYS JSR PRMENU1 FIN PLA STA DISPLAYLINENO RTS * * * SHOWSAMELINE EQU * PHP JSR SHOWLINE LDA CURRENT ;SS.RAM.PAGE JSR PRBYTE ;PRINT.PAGE.NO JSR PRDASH LDA YCACHE JSR PRBYTE JSR PRDASH LDA XCACHE JSR PRBYTE PLP JSR CHECKKEY ;NEW.KEYBD.ENTRY? RTS * * SHOWLINE EQU * * * * *MESSAGE.IS.PRINTED.IN.INVERSE.IF .CARRY.WAS.SET *MESSAGE PRINTED IN ANY CASE **(IF 'USER' FLAG IS ON, CLC SKIPS MSG, AND MSGS ARE 'ERROR NN') * * BCC SETNORMAL JSR BELL JSR SETINV ;SET INVERSE DISPLAY INC ERRORCOUNT ;IT'S AN ERROR JMP PASTSET SETNORMAL EQU * JSR SETNORM DO USER JMP SKIPDISPLAY FIN ;USERS DONT SEE NON-INVERSE LINES PASTSET EQU * * * * * * *PRINT.MESSAGE.APPROPRIATE.TO.THIS.LINE LDA DISPLAYLINENO CLC ROL A ;MULT BY 2 TAX LDY VECTORSS,X LDA VECTORSS+1,X TAX JSR PRMENU1 SKIPDISPLAY EQU * RTS * * CHECKKEY EQU * PHP LDA $C000 ;KEYBD CMP #FKEY BEQ NOPAUSE ;"FAST".MODE:.PLOW.ON.THRU CMP #SKEY BEQ PAUSE ;"STEP-BY-STEP" PLP PHP BCC NOPAUSE ;NO ERROR PAUSE EQU * JSR SHOWANYKEY ;SHOW.MSG.AT.BOTTOM DO USER ELSE ;DONT PAUSE FOR USERS JSR GETAKEY ;WAIT.FOR.KEYPRESS FIN NOPAUSE EQU * PLP ;JUST.TO.RESTORE.STACK CMP #MKEY BEQ GOMONITOR ;TO.JMP.TO.MONITOR CMP #RKEY BEQ GORESTART ;BEGIN.TESTS.AGAIN. RTS * * * GETAKEY EQU * STA $C010 ;CLEAR KBD GETAKEYLOOP EQU * LDA $C000 BPL GETAKEYLOOP RTS * * GOMONITOR JMP $FF59 GORESTART JMP TEST2E * * VECTORSS EQU * ;VECTOR TO SUBRTN NAMED BY EACH LINE DW NOROM DW NORAM DW FOLLOWING DW NOTOFF DW NOPATTERN DW PUSHBUTTON DW BLANK DW ALTERED1 DW VIAROMVEC DW VIARAMVEC DW VIA2PLUSVEC DW VIA2EVEC DW BADDNMI DW NOPATTERN DW NOPSEUDO DW OFFTIME DW NOTOFF DW NOERRORR DW ANYKEY * * NOROM EQU * DW NOROMMSG DW ALLVERTS NORAM DW NORAMMSG DW ALLVERTS FOLLOWING DW FOLLOWINGMSG DW ALLVERTS NOTOFF DW NOTOFFMSG DW ALLVERTS PUSHBUTTON DW PUSHBUTTONMSG DW ALLVERTS BLANK DW BLANKMSG DW ALLVERTS VIAROMVEC DW VIAROMVECMSG DW ALLVERTS VIARAMVEC DW VIARAMVECMSG DW ALLVERTS VIA2PLUSVEC DW VIA2PLUSVECMSG DW ALLVERTS VIA2EVEC DW VIA2EVECMSG DW ALLVERTS BADDNMI DW BADDNMIMSG DW ALLVERTS ALTERED1 DW ALTERED1MSG DW ALLVERTS NOPATTERN DW NOPATTERNMSG DW ALLVERTS NOPSEUDO DW NOPSEUDOMSG DW ALLVERTS OFFTIME DW OFFTIMEMSG DW ALLVERTS NOERRORR DW NOERRORMSG DW ALLVERTS ANYKEY DW ANYKEYMSG DW ALLVERTS SPECIALKEYS DW SPECIALMSG DW ALLVERTS * * ALLVERTS EQU * DISPLAYLINENO DFB 0,$FF ;LINE NUMBER ON WHICH MSG APPEARS * DO USER ;THIS SECTION IS FOR TECHIES ELSE * **MESSAGES.TEXT * NOROMMSG ASC .1: COULD NOT READ MONITOR ROM (PAGE FF). DFB 0 NORAMMSG ASC .2: COULD NOT READ RAMCARD RAM (PAGE FF). DFB 0 FOLLOWINGMSG ASC .3: PAGE 1 FOLLOWER NOT FOLLOWING. DFB 0 NOTOFFMSG ASC .4: SNAPSHOT RAM DOES NOT TURN OFF. DFB 0 PAGEACCESSMSG ASC .5: BAD RAM PAGE/BYTE/OUGHT . DFB 0 PUSHBUTTONMSG ASC .PLEASE PRESS THE TRIGGER. DFB 0 BLANKMSG ASC . . DFB 0 VIAROMVECMSG ASC .7: ERROR: VECTORED VIA MOTHERBOARD ROM. DFB 0 VIARAMVECMSG ASC .8: ERROR: VECTORED VIA MOTHERBOARD RAM. DFB 0 VIA2PLUSVECMSG ASC .OK: VECTORED CORRECTLY APPLE 2+ MODE. DFB 0 VIA2EVECMSG ASC .OK: VECTORED CORRECTLY APPLE 2E MODE. DFB 0 BADDNMIMSG ASC .9: NMI PUT BAD ADDRESS ON STACK. DFB 0 ALTERED1MSG ASC .10: PAGE 1 OF SS RAM WAS ALTERED BY NMI. DFB 0 NOPATTERNMSG ASC .11: BAD RAM PAGE/BYTE/OUGHT . DFB 0 NOPSEUDOMSG ASC .12: CANNOT ACCESS PSEUDO-FFFA RAM. DFB 0 OFFTIMEMSG ASC .13: SSRAM TURNED OFF: TIME UNITS = . DFB 0 FIN * * NOERRORMSG ASC .NO ERRORS FOUND. DFB 0 ANYKEYMSG ASC .PRESS ANY KEY TO CONTINUE. DFB 0 SPECIALMSG ASC .'F'=FAST, 'S'=SLOW, 'M'=MONITOR. DFB 0 ASC .EXTRA LINE 1. DFB 0 ASC .EXTRA LINE 2. DFB 0 * DO USER ;THIS VERSION IS FOR USERS * **MESSAGES.TEXT * NOROMMSG ASC .ERROR CODE 1. DFB 0 NORAMMSG ASC .ERROR CODE 2: COULD NOT FIND RAMCARD. DFB 0 FOLLOWINGMSG ASC .ERROR CODE 3. DFB 0 NOTOFFMSG ASC .ERROR CODE 4. DFB 0 PAGEACCESSMSG ASC .ERROR CODE 5 . DFB 0 PUSHBUTTONMSG ASC .PLEASE PRESS THE TRIGGER. DFB 0 BLANKMSG ASC . . DFB 0 VIAROMVECMSG ASC .ERROR CODE 7. DFB 0 VIARAMVECMSG ASC .ERROR CODE 8. DFB 0 VIA2PLUSVECMSG ASC .OK: SNAPSHOT IS IN APPLE 2+ MODE. DFB 0 VIA2EVECMSG ASC .OK: SNAPSHOT IS IN APPLE 2E MODE. DFB 0 BADDNMIMSG ASC .ERROR CODE 9. DFB 0 ALTERED1MSG ASC .ERROR CODE 10. DFB 0 NOPATTERNMSG ASC .ERROR CODE 11 . DFB 0 NOPSEUDOMSG ASC .ERROR CODE 12. DFB 0 OFFTIMEMSG ASC .ERROR CODE 13. DFB 0 * FIN * * * CHN SWAP SBTL .LOOP AROUND FFFA. *** PRNTAX EQU $F941 PRBLNK EQU $F948 PRBL2 EQU $F94A *** ORG $5000 SEC LOOPTOPP EQU * LDX $FFFA LDA $FFFB JSR PRNTAX LDX #4 ;OUTPUT.4.BLANKS JSR PRBL2 JMP LOOPTOPP BRK 8 A JLP X % "$ X,II8 #,,I8, #,, ,  "H "hIH "h8 # " ^"8 #$ " "8 #]" # ",,L " ȩ!>ȩ ` L! L! L! ! ,L!!=!C!A!G!! !ȩ !!!띀0@L!8 # 8 # 8 # 8]" # 8]" #8hhh  #$ "L" " 51\"8 " " " " "\" #L" # " ^"H #hHh8 #]"8 #$$]" # #L 芑ʊ(ȱ芑ʊ(` 띀`띀ʈ 띀("""띀8 ;#띀"""ʈ $ #`  `$ [#( #`$ [#(`$# &` $H$$ &h$` [# " " ( #` ]"Lo# L#$*## &` ( ##( ``LYL ####$########$$ $#$$$$$$$$$$$$$$$$%$%$5%$V%$c%$q%$%$%$$$,$$F$$ϠӠӠ٠٠ϠƧԬӧ׬ͧŠŠҠŠҠŠĠԠĠҠŠҠŠҠŠŠӠŠҠŠҠŠ˺ԠӠΠŠ˺ԠӠΠŠŠҠŠҠŠҠŠҠŠҠŠ%%%%%h%h%%%%%%%l% X & &  `&2 &`&6 &`)****` & # &ɯɸ /&`)`:&&{&&ȠԠӠҠԠοϠӠàϠĠԩȠŠӠԠοҠ ɛ`, & ΠЍ%0e%% & & 'L&`L&`($8$j$`% 'L' '`` X' & %'P X' &LM' X' & ''' 'ͱ' ''ΰ' ' (L`'` A JH}'h'`ȠӠΠŠĠԠŠЍ''$''(ŠҠ̺ #ɛ` HhL& SBTL .TEST PAGE CHANGING FACILITY. *****RUNS.TESTOBJ0'S.PATTERN.TEST,THEN.ROTATES.PAGES.CHECKING.CORRECT.PAGE.WAS.SELECTED.UNTIL.FAILURE.OCCURS PAGE * ORG $8000 JSR $6210 ;MAKEPATTERN.AND.TESTPATTERN FIRSTPAGE EQU * LDY #0 TURNON EQU * TYA STA $C0A0 JSR $FDDA JSR WHATPAGE CPY THISPAGE BNE BREAK INY CPY #$20 BNE TURNON BEQ FIRSTPAGE BREAK DFB 0 THISPAGE DFB 0 * WHATPAGE EQU * LDX #0 LDA $C200 STA THISPAGE RTS * L)' X % "$ X,II8 #,,I8, #,, ,  "H "hIH "h8 # " a"8 #$ " "8 #`" # ",,L " ȩ!>ȩ ` L! L! L! ! ,L$!@!F!D!J!"!#!ȩ#!"!"!띀0@L!8 # 8 # 8 # 8`" # 8`" #8hhh  #$ "L" " 51_"8 " " " " "_" #L" # " a"H #hHh8 #`"8 #$$`" # #L 芑ʊ(ȱ芑ʊ(` 띀`띀ʈ 띀("""띀8 >#띀"""ʈ $ #`  `$ ^#( #`$ ^#(`$# &` $H$$ &h$` ^# " " ( #` `"Lr# L#$*## &` ( &#( ``LYL ####$##$#####$ $ $#$$$$$$$$$$$$$$$$ %$%$8%$Y%$f%$t%$%$%$$$/$$I$$ϠӠӠ٠٠ϠƧԬӧ׬ͧŠŠҠŠҠŠĠԠĠҠŠҠŠҠŠŠӠŠҠŠҠŠ˺ԠӠΠŠ˺ԠӠΠŠŠҠŠҠŠҠŠҠŠҠŠ%%%%%h%h%%%%%%%l% X & &  `&5 &`&9 &`)****` & # &ɯɸ 2&`)`=&&~&&ȠԠӠҠԠοϠӠàϠĠԩȠŠӠԠοҠ ɛ`, & ΠЍ%0e%% & & 'L&`L&`($8$j$`% "'L' "'`` X' & %'V X' & !(LP' X' & ''' 'ͷ' ''ζ' ' !(Lf'` A JH}'h'`ȠӠΠŠĠԠŠЍ''$''(ӠàϠĠԩŠҠ̺ɛ` HhL&Note to dealers and distributors: The General Diagnostics test for the Snapshot card gives only error code numbers when errors are encountered. The intention is that users will report the error numbers to repair persons. If you want to test a Snapshot card and see full error messages, run "DEALER.VERSION" on this disk. NOTE: this version displays the full text of all error messages whether or not the error was actually en- countered. When an error is encountered, the error message appears in inverse video. Our experience shows that the great majority of user problems can be solved if the user reads the manual carefully. If a user reports a problem, please urge him/her to read the manual carefully. Send him/her a copy of the Snapshot Fault Report form and the appendices that accompany it. Read it yourself. Very often a careful reading of the Fault Report will induce the user to solve the problem. The Snapshot Fault Report has been provided to you (or your distributor) on a Wordstar text disk. Dont forget to include the appendices, which are on separate files called NOISEFIX, INVASIVE, and RP2. SBTL .PRINT A SCREEN. ;X INDEXES TABLES, Y INDEXES MSGS SKP 3 PRMENU1 EQU * ;LOAD PARMLIST STY LISTPTR ;PTR TO PARMLIST STX LISTPTR+1 LDY #3 PLOOP1 EQU * ;COPY.TO.THIS.ROUTINE'S.INPUT LDA (LISTPTR),Y STA MSGTOP,Y DEY BPL PLOOP1 ;COPY 2 ADDRS SKP 2 PRMENU EQU * ;PRINT MENU LDX #0 LDY #0 STY VCURSOR ;PUT CRSR.AT.TOP.OF.PAGE MENULOOP EQU * TXA TAY ;INDEX INTO VERT SPACING TABLE LDA ($FB),Y ;# OF LINES TO MOVE DOWN FROM LAST MSG: FB=VERTPTR BMI NOMORE ;NEG TAG MEANS NO MORE CLC ;CLR CARRY ADC VCURSOR STA VCURSOR ;MOVE CURSOR DOWN JSR GETLENGTH ;OF MSG IN Y JSR DISPMARGIN JSR DISPMSG ;DISPLAY IT INX JMP MENULOOP ;DO ANOTHER MSG NOMORE EQU * RTS SKP 1 GETLENGTH EQU * *INITIAL: MSGTOP.POINTS.TO.BEGINNING.OF.MSG...FINAL: MSGTOP.UNCHANGED,.Y=LENGTH.OF.MSG,.A SCRAMBLED LDY #0 LLOOP EQU * ; LDA ($F9),Y ;GET NEXT CHAR: F9=MSGTOP BEQ LLOOPEND ;IF ITS NOT NULL, INY ;MOVE ON TO NEXT CHAR JMP LLOOP LLOOPEND EQU * RTS SKP 1 DISPMARGIN EQU * ;INITIAL:Y=LENGTH,...FINAL:HCURSOR=MARGIN,A.USED,Y=UNCHANGED LDA #SCRWIDTH ;WIDTH OF SCREEN SCRWIDTH EQU 40 STY HCURSOR ;SUBTRACT MSG LENGTH SEC SBC HCURSOR ;FROM WIDTH CLC ROR A ;MARGIN =(SCRWIDTH-Y)/2 STA HCURSOR ;SET MARGIN RTS SKP 1 DISPMSG EQU * ;DISPLAY MESSAGE LDA VCURSOR JSR BASCALC ;SET SCR VECTOR LDY #0 LOOP89 LDA ($F9),Y ;F9=MSGTOP BEQ MSGEND ;IF CHAR=NULL,EXIT JSR COUT1 ;DISPLAY CHAR JSR INCTOP ;INCREMENT MSGTOP POINTER JMP LOOP89 ;GET NEXT CHAR MSGEND EQU * JSR INCTOP ;POINT TO HEAD OF NEXT MSG RTS INCTOP EQU * INC MSGTOP ;INC LOW-ORDER BYTE BNE NOPAGE6 INC MSGTOP+1 ;HIGH IF NECC NOPAGE6 EQU * RTS CHN NOISETEST2 COPY.ROMuxCOPY8PAGESxTYPEM!P $SWAP*x(SETDRIVE'STARTUPMENUEQUSn,INSTRUCTIONS]&TECHIE  TEMP"NOISETEST.DEALER.VERSIONy*NOISETEST2 SBTL .COPY MONITOR FROM ROM TO RAM. ORG $2100 PAGENO EQU $F9 ;VECTOR TO CURRENT PAGE FIRSTPG EQU $D0 ;FIRST PAGE 2B COPIED LDA #FIRSTPG STA PAGENO+1 LDY #0 ;POINT TO RELATIVE BYTE WITHIN PAGE STY PAGENO ;LSB LOOP LDA (PAGENO),Y STA (PAGENO),Y ;COPY A BYTE INY ;NEXT BYTE BNE LOOP ;TIL PAGE ENDS INC PAGENO+1 ;NEXT PAGE BNE LOOP ;TIL PAGE NO WRAPS AROUND RTS SBTL .COPY 0-7FF TO E000-E7FF. ORG $2000 DUM EQU $0 ;1ST PAGE OF ONE BLOCK DEE EQU $E0 ;1ST PAGE OF THE OTHER BLOCK. PAGES EQU $8 ;NO. OF PAGES PER BLK. *INTERNAL POINTERS DUMPTR EQU $FB DEEPTR EQU $FD PAGECTR EQU $FF * LDA #0 STA DEEPTR STA DUMPTR LDA #DEE STA DEEPTR+1 LDA #DUM STA DUMPTR+1 LDA #PAGES STA PAGECTR ;COUNT PAGES 2B SWAPPED LDY #00 SWAPLOOP EQU * LDA (DUMPTR),Y STA (DEEPTR),Y INY BNE SWAPLOOP INC DEEPTR+1 INC DUMPTR+1 DEC PAGECTR BNE SWAPLOOP RTS X RP0) OPPBCQ? ,`Š䍊嬠㮊8Llm ٹNPQRTUS` B ξtϾ pL о־޾׾پھؾ p  Lp ɛ۾TYPE SBTL .SWAP: PAGE SWAP UTILITY. SWAP EQU * * *.SWAPS.TWO.BLOCKS.OF.PAGES. *.DOES.NOT.USE.PAGE.0 *.BEFORE.SWAP,.RESTORES.STACK *.TO.PRE-JSR.CONDITION. * *.INPUT:..X.AND.Y.=.1ST.PAGE.OF *...EACH.BLOCK *...ACCUM.=.NO.OF.PAGES.TO.SWAP * STX A1H1 STX A1H2 STY A2H1 STY A2H2 STA PAGECOUNTER * PLA ;SAVE RETURN ADDR LOCALLY STA RETURNVECTOR PLA STA RETURNVECTOR+1 INC RETURNVECTOR ;COMPENSATE FOR RTS * LDY #0 * SWLOOP EQU * ;SWAP TWO BYTES LDA ZERO,Y A1H1 EQU *-1 TAX LDA ZERO,Y A2H1 EQU *-1 STA ZERO,Y A1H2 EQU *-1 TXA STA ZERO,Y A2H2 EQU *-1 INY BNE SWLOOP ;LOOP TIL A PAGE IS SWAPPED INC A1H1 INC A1H2 INC A2H1 INC A2H2 DEC PAGECOUNTER BNE SWLOOP JMP (RETURNVECTOR) ;BACK TO CALLER * PAGECOUNTER DFB 0 ;NUMBER OF PAGES YET 2B SWAPPED RETURNVECTOR DFB 0,0 ;RETURN ADDR * CHN SETDRIVE CHANGEDRIVE EQU * JSR HOME CHANGEDRIVE2 EQU * JSR GETSLOT ;GET SLOTIN ACCUM STA SLOT JSR MULT10 ;MULT.BY.#$10 STA SLOT10 ;PUT IN IOBLOCK LDA SLOT ORA #SLIST JSR PRMENU1 RTS PRDRIVE EQU * LDX #DLIST JSR PRMENU1 RTS MULT10 EQU * ;MULTIPLY ACCUM BY #$10 CLC ;MULT BY $10 AND #$07 ;ZERO LEFT NYBBLE ROL A ROL A ROL A ROL A RTS GETSLOT EQU * ;INQUIRE,.GET.SLOT.NUMBER.IN.ACCUM JSR PRSLOT ;ASK "WHICH SLOT?" JSR GETAKEY ; JSR EXITIFESC CMP #$AF ;IF KEY<0 BCC GETSLOT ;TRY AGAIN CMP #$B8 ;IF KEY>=8 BCS GETSLOT ;TRY AGAIN JSR MAKENUM ;MAKE IT NUMERIC RTS MAKENUM EQU * AND #07 RTS SKP 2 SLIST DW SLOTMSG DW SLOTVERTS SKP 1 DLIST DW DRIVEMSG DW DRIVEVERTS SLOTMSG EQU * ASC .WHICH SLOT IS YOUR SNAPSHOT IN? (1 TO 7). DFB 0 ASC .(PRESS ESC TO END TEST). DFB 0 DRIVEMSG EQU * ASC .WHICH DRIVE IS IT IN? (1 OR 2) . DFB 0 SLOTVERTS EQU * DFB 8,3,$FF DRIVEVERTS EQU * DFB 10,$FF SKP 2 EXITIFESC EQU * CMP #ESCAPE ;ESCAPE.KEY? BEQ EXIT RTS EXIT EQU * BIT $C010 ;clr kbd LDX #CMDEND-CMDBEGIN-1 CMDLOOP EQU * LDA CMDBEGIN,X ;copy command STA $0200,X ;to kbd buffer DEX BPL CMDLOOP JSR $BE03 ;call BI's command handler DFB 0 ;in case of error CMDBEGIN EQU * ASC .RUN STARTUP. DFB CR CMDEND EQU * ; RESET EQU $FFFC * CHN PRMENU  :-" SNAPSHOT CARD TESTS"7::Y("1: GENERAL DIAGNOSTIC TEST"{2:"2: ELECTRICAL NOISE TEST"<:"3: INSTRUCTIONS FOR RUNNING TESTS"F::" YOUR CHOICE? (1-3) "PK$dK$"1"ī1000nK$"2"ī2000 K$"3"ī3000 80  LONG TEST< (17): 40 COLS ON //EB Y (4);"BLOAD FFFA"u (4);"BRUN LONGTEST.0"}   NOISE TEST (4);"BRUN NOISETEST.0"  INSTRUCTIONS (4);"BRUN TYPE" :(4)"PR#3" (4);"TYPE INSTRUCTIONS" VCURSOR EQU $25 ;OUTPUT CURSOR LOC HCURSOR EQU $24 ;LIKEWISE, HORIZ. **NOTE THAT VERTPTR MUST = MSGTOP+2 (SEE FIRST ROUTINE) MSGTOP EQU $F9 ;VECTOR TO 1ST CHAR OF CURRENT MSG VERTPTR EQU $FB ;VECTOR TO TABLE OF VER LINE SPACINGS BEFORE MSGS LISTPTR EQU $FD ;VEC TO PARMLIST COUT1 EQU $FDF0 ;VIDEO OUTPUT ROUTINE BASCALC EQU $FBC1 ;USES VCURSOR VALUE TO PREPARE COUT To use the General Diagnostic test: follow the on-screen instructions. When the test pauses, press any key to continue. Cycle through the test 5 or 6 times. If any error codes appear, report them to your Snapshot dealer. To use the Noise Test: Both switches on the card must be up (even on a II+). Run the test. Follow the on-screen instructions. The card will begin detecting electrical noise in your Apple. Errors caused by the noise will cause numbers greater than 0000 to appear. Let the test run for five or ten minutes. If the numbers are greater than 0000, you have a possible fault. If the tests show a problem with your Snapshot card, ask whoever sold you the card to send you a Snapshot Fault Report form. Do not send the card back to them until you are asked to do so. The reason for this is that the card may be responding to peculiarities of your own computer system. It will be far easier for Dark Star's engineers to diagnose the problem if you can try a few more simple tests with Snapshot in your computer. Those tests are described in the Fault Report form. X & ")$ X,,РЩ0 &,II8 #,,I8 #  "H "hIH "h8 # " a"8 #)$ " "8 #`" # "L " ȩ!>ȩ ` L! L! L! ! L!!=!C!A!G!! !ȩ !!!띀0@L!8 # 8 # 8 # 8`" # 8`" #8hhh  #)$ "L" " 51_"8 " " "  " "_" #L" # " a"H #hH h8 #`"8 #)$)$`" # #L 芑ʊ(ȱ芑ʊ(` 띀`띀ʈ 띀("""띀8 J#띀"""ʈ )$ #`  `)$ j#( #`)$ j#(`)$# '` )$H)$$! ')$$% 'h)$` j# " " ( #` `"L{# )$*## '`( &# #( ``LYL ####$## $##$$ $$$$#$!$+$)$S$)${$)$$)$$)$$)$$)$ %)$G%)$l%)$%)$%)$%)$%)$&)$<&)$L&)$f&)$ĠԠĠҠ͠ŠƩĠԠĠĠ͠ŠƩŠҠԠԠ͠ӠԠΠĠ͠ůůԠŠӠŠҺĠĠҺĠĠ˺Ġ٠Š˺Ġ٠ŠŠɠԠĠӠΠŠƠӠ͠ӠĠ٠Ġ͠ůůԠԠӠϭ͠ĠƺŠӠϠӠӠ٠٠ϠƧԬӧ׬ͧŠŠ&&&&&h&h&&&&&&&l& X ' '  `'6 '`': '`)****` ' # 'ɯɸ 3'`)`>''g''ȠԠӠҠԠοϠȠŠӠԠοҠ ɛ`l%0e%% ' ' 'L'`L'`($8$j$`% 'L' '`` X( ' &( X( 'L( X( ' f(~(}( f(~( T(|(}( ](L0(` A JH}(h(`ȠӠΠŠĠԠŠЍ(($(((ŠҠ̺ JSR GETSLOT ;WHAT.SLOT.IS.SS2E.IN....PUT.NUMBER.IN."SLOT" STA SLOT JSR MULT10 ;MULT SLOT TIMES 10 STA SLOT10 ;SLOT.TIMES.$10 LDA SLOT ORA #PUSHSWITCH JSR PRMENU1 ;display msg JSR CHANGEDRIVE2 ;find out what slot card is in ; LDA #0 TAY STA (DEVVEC),Y ;TURN PAGE 0 ON = C0N0 LDA #
MAIN DEY STA (PAGEVEC),Y ;=CNFA ; ; JSR HOME LDX #PUSHBUTTN JSR PRMENU1 ;display msg LOOP EQU * ;loop until trigger pressed JSR CHECKESC ;exit if ESC JMP LOOP ; MAIN EQU * JSR HOME LDX #<ERRORCOUN LDY #>ERRORCOUN JSR PRMENU1 JSR ADDROUTINE ;total contents of FFFA-E STA TOTAL ;save original total RIGHTTOP EQU * LDA #$F ;no. of times to repeat big loop/$100 STA COUNTH LDA #0 TAX TAY RIGHT JSR ADDROUTINE ;take total again CMP TOTAL ;compare new total BEQ OK JSR ERRORINC ;if different, increment error counter OK INC COUNTL ;increment loop counter (2 bytes) BNE RIGHT DEC COUNTH BNE RIGHT ; ;drop out of loop after $10000 iterations JSR PRINTERRORS ;display error count on screen JSR CHECKESC ;exit if esc was pressed JMP RIGHTTOP ;repeat big loop ; ERRORINC INX ;note that x,y is input to PRINTERRORS BNE OUT INY BNE OUT ;prevent wraparound of error count: set to FFFF DEY DEX OUT RTS PRINTERRORS TYA JSR $F941 ;print error count on screen LDX #4 JSR $F94A ADDROUTINE EQU * TXA PHA LDA #0 LDX #$1F ;count from 1F to 0 CLC TOTALLOOP EQU * ADC $FFE0,X ;ADD TO TOTAL DEX BPL TOTALLOOP STA TEMP PLA TAX LDA TEMP RTS COUNTL DFB 0 COUNTH DFB 0 TOTAL DFB 0 TEMP DFB 0 ; PUSHSWITCHMSG EQU * ASC .BOTH SWITCHES ON THE CARD MUST BE UP. DFB CR DFB CR DFB 0 PUSHSWITCH DW PUSHSWITCHMSG DW PSWVERTS PUSHBUTTN DW PUSHBUTTONMSG DW PSBVERTS PSWVERTS DFB 3,$FF PSBVERTS DFB 14,$FF ; ERRORCOUN EQU * DW ERRORMSG DW ERRORVERT ERRORMSG EQU * ASC .(PRESS ESC TO END TEST). DFB 0 ASC .NOISE ERROR LEVEL: . DFB CR DFB 0 ERRORVERT DFB 0,3,$FF CHECKESC EQU * ;exit if ESC LDA $C000 CMP #ESCAPE BEQ GOESC RTS GOESC EQU * LDA #$20 LDY #0 STA (DEVVEC),Y ;TURN CARD OFF PHA PLA JMP EXIT )LONGTEST2 7 SBTL .TEST A 2E CARD. *** TO ASSEMBLE: Under the Prodos toolkit assembler, type ASM LONGTEST * * USER EQU 1 ;SET TO 1 FOR USER'S VERSION (GIVES ERROR GODE NUMBERS, NOT FULL DIAGNOSTIC MESSAGES) ****VERSION 11 * VCURSOR EQU $25 ;OUTPUT CURSOR LOC HCURSOR EQU $24 ;LIKEWISE, HORIZ. **NOTE THAT VERTPTR MUST = MSGTOP+2 (SEE FIRST ROUTINE) MSGTOP EQU $F9 ;VECTOR TO 1ST CHAR OF CURRENT MSG VERTPTR EQU $FB ;VECTOR TO TABLE OF VER LINE SPACINGS BEFORE MSGS LISTPTR EQU $FD ;VEC TO PARMLIST COUT1 EQU $FDF0 ;VIDEO OUT !"#PUT ROUTINE BASCALC EQU $FBC1 ;USES VCURSOR VALUE TO PREPARE COUT * *CHANGE.THIS.LINE.IF.YOU.WANT.TO.TEST.SOMEWHERE.OTHER.THAN.$CN00 DEVVEC EQU $00 ;VECTOR.TO.CNTRL.ADDR DEVADDR EQU $C080 ;SS.CONTROL.ADDR IOAREA EQU $C000 ;$C000.FOR.REAL NMI EQU $FFFA ;NMI VECTOR FAKEADDR EQU $C03E ;ADDR.PUT.ON.BUS.AT.NMI.TIME PAGE3NMI EQU $3FC ;NMI VECTOR PAGEVEC EQU $EE ;POINTER.TO.CN00.WHERE.N.IS.SLOT CURRENT EQU $ED ;CURRENTLY.ACTIVE.SS2E.RAM.PAGE SLOT EQU $EC ;SLOT CARD IS IN SLOT10 EQU $EB ;SLOT.TIMES.$10 HOME EQU $FC58 ;CLEAR.SCREEN * * MSB ON TEST2E EQU * JSR HOME JSR CHANGEDRIVE2 ;WHAT.SLOT.IS.SS2E.IN....PUT.NUMBER.IN."SLOT" JSR TURNSSOFF ;TURN OFF CARD * * LDA #$FF ;WILL.BE.INCREMENTED.BEFORE.USE STA DISPLAYLINENO * JSR HOME * *COPY.ROM.TO.PARALLEL.RAM ;BIT $C081 ;R-W+B2 ;BIT $C081 ;LDX #$D0 ;COPY FROM ;LDY #$D0 ;COPY TO ;LDA #$30 ;NO..OF.PAGES.TO.SWAP ;JSR SWAP * * *TRY TO READ ROM BIT $C082 ;R-W-B2 LDA $FFFA EOR #$FF STA $FFFA EOR #$FF CMP $FFFA CLC BEQ NOERROR1 SEC ;SET.CARRY.IF.ERROR NOERROR1 EQU * JSR SHOWNEXTLINE * * * *TURN.ON.RAM/LANGUAGE.CARD BIT $C083 BIT $C083 * * *TEST.THAT.HIGH.RAM.IS.THERE LDA NMI EOR #$FF STA NMI CMP NMI CLC BEQ NOERROR2 SEC NOERROR2 EQU * BIT $C082 ;turn off ram JSR SHOWNEXTLINE * * *WRITE.A.VECTOR.TO.HIGH.RAM BIT $C083 BIT $C083 LDA #RAMVEC STA NMI BIT $C082 ;ram off * * *PUT.A.VECTOR.IN.PAGE.3.NMI.VEC LDA #ROMVEC STA PAGE3NMI * * * * LDX #$80 TXS ;SET STACK POINTER * * *TEST PAGE 1 FOLLOWER LDA #01 JSR TURNSSON LDY #0 LDA (PAGEVEC),Y ;=$CN00 PHA JSR TURNSSOFF PLA EOR #$FF PHA STA $0100 ;SAVE.ON.P1 LDA #1 JSR TURNSSON ;TURN.PAGE.1.ON PLA LDY #0 CMP (PAGEVEC),Y ;DID.IT.SHOW.UP.ON.SS.PAGE.1? CLC BEQ NOERROR3 SEC NOERROR3 EQU * JSR SHOWNEXTLINE * * *.TURN.OFF.SS.,TEST.THAT.IT'S.OFF JSR TURNSSOFF JSR ISSSON CLC BNE OFFXX ;BRANCH.IF.OFF SEC OFFXX EQU * JSR SHOWNEXTLINE * * * * *.TEST.ALL.PAGES.OF.SS2E.RAM.BY.WRITING.AND.READING.A.PATTERN INC DISPLAYLINENO ;NEXT.LINE.DOWN LDA #0 ;BEGINNING.PAGE STA CURRENT JSR MAKEPATTERN * * *SAY "PUSH BUTTON" JSR TURNSSOFF LDA $C010 SEC JSR SHOWNEXTNOKEY DEC ERRORCOUNT CLC JSR SHOWNEXTLINE ;BLANK * * * JSR SETNMI ;CREATE.NMI.VEC.IN.SS.RAM * JSR TURNSSOFF * * * * *FILL STACK WITH 01010101... LDY #0 LDA #1 LOOP0101 EQU * STA $0100,Y DEY BNE LOOP0101 * * *LOOP.UNTIL.NMI.OCCURS BIT $C083 BIT $C083 ;ram on NMILOOP JMP NMILOOP ; ; ; ********************************* * *....END.OF.MAINLINE.BEFORE.NMI * ********************************* * SETNMI EQU * * *SET.VECTOR.IN.SS.RAM.PAGE.ZERO.FOR.NMI ***ON.THE.APPLE2+,.THE.NMI.VECTOR.IS.NOT.FOUND.AT.FFFA,.BUT.AT.A.FAKE.ADDR.NEAR.THE.SPEAKER LDA #0 JSR TURNSSON LDY #>NMI ;ADDR.IN.PAGE.ZERO.WHERE.VECTOR.RESIDES LDA #>SSVEC ;ADDR.TO.WHICH.VECTORS STA (PAGEVEC),Y INY LDA #FAKEADDR ;LO-ORDER.OF.FAKE.ADDR.NEAR.SPEAKER LDA #>TWOPLUSVEC ;ROUTINE.TO.WHICH.VECS.ON.TWOPLUS STA (PAGEVEC),Y INY LDA # Ɉ 3ɾL(3ɾ;Ƀ UB94 % ʽ  ٚ,S` w $݅3`(l8L"3L>(Ƀ,`3,G0]ɾ ` w`پ_پ p _پ׾`>( p۾m׾) W)ʩ@`ɾ>(O puȾ ɾ-O c־Jjjj `O>0O  矢POپھ p AH־Ǿh۰8L"־Jjjjɾ)Ⱦ8 + OL L$L>(F`־ؾپھ׾` Ʉ +KDEF L LK KɍKL"?`  L@3 @LtJ)s@J % `͘?s?,E30ɍФ3 +E3HD F3 Ʉ%h3 M +E  LthɍLL3`3,A0s0% Ipn + {pnI:L ؅30,3L]8^933LAAJL ةޘг uv $ 8LЌ Le p>?@`>?@`BQ8`e 矮K ⟩ 䟢 춼LK  z KK`JJJJ8`轚K)` 7#hhL"Jپھ pHJh` {!hgt}~p  `~t}p8n~ni}tpi~~tsLo8pinii>j?k̈́>~|p|Ii||̈́ ҡl 4 j `>i>?Ek?!>Q>>>̀ `` > ̀ `e>>?́?>?Emn(>e>ȱ>e?>Q>ؠ> ie>>?`|;}=:<~:<=;`||m};>:8o>oȑ>ppȑ>> :op` {KpnͶ @p;=po:i>?Ek?>Q>> 5L壥>  5e>>?́?`>ȥj>>m>` T`m8injkiljo풼S ?@$I0 U)VJ *T)`l8`a HbIJhjǾȾɾ p٭b=aIe f`8` yP־ǾҾ,G0C =W)_``\"׾پӾؾھ pD`־ǾY׾ؾOW)ݩȾɾʾ pD`8`W)CB) ۵ 5W) )W)@! pZ}ȾȾ󰹩 p` y־ǾҾ,G 8`׾ؾ  p жۥs׾tؾE` y ( о(־Ǿ,G 8`_`W)H־Jjjjh p̭ L;Ǿ ..8 ۭ (8mȾȾmɾɾʾiʾ` Lpl8l:/[ҝƬƀ#(ZZV4D\-:% >M CgIY2m*b6>BSAVERIFYBLOADELETECATALOGOPENWRITEXECREATEFRESTORENAMEBRUNLOCKCHAIN#FLUSHREADPOSITIONOMONPR#PREFIXCLOSEAPPENDx{[{0ǭ0hЫ}wA Xw­孶׭fl@@ -!S    !C- !ABELSDFRV@@ !$(19@EüϠž(+@ABCDEFGHIKLMNPSV     T[fouu~ՠٯ* PWN*]ĿNTz @n6VC/+A>@I5gN Oz @n[Dz @nd0,~z @`$仫@v$⩔,C[B?I>孓`仫6VtCicQĿUKqtVt Nʮq$6,⨁ K6, VtI=v!gNVt Vt  lg~TŠӠŠҠL5LLL"L  KN)_ `@S8` ԠŬLL<L@ĮǠ٠ĮϠŭĬŠТΠΠĮǮĮǍԠéΠčŠӬîĠҠà͠ů@尰 ~@ 8s tTȅ A  / A @L@/  > A @L@ 8e/ ` ȱ 8 ȩX  e ȱ e `L$) @ :LBBB LAAꍉsAtUU IUUUUUVߢA XAA ӢE@ stVVLlPL{=L XLEB I 9U U {FLDU)U:<=>?@ABCDEFG#L{FxȘȑ F0: lP0\X R WWWWL&BGFFs,V,(L/EEɛ/ɜ7ɬv 78LآGFLLB A L ALB J BhhLץ UH UH`LPv F,UP F,U I 6DUi ISU8 mIvxuw Kuvwx $ C nC$U{U{U QEUɃ 5IL =DɍU 5ILaB``:  慤 C C"`H Ch8Єτ ,0 ,0Ɗ0 CLC C CH$ {$hL\NU`aUUUx {FLDbU H {FUUU`bɈ,ɕɋjɊyɼ$ɬ ɮ<ɾ8ɠb`U`8.U`UU8UUULDUحUʹU I XUiLDͷU HUηULDU H获U [ L U= 5I L##ʊ [! F'( UʹU%U H I XL5ILGU,U0yz S,s TLEUʹU \C,T-T I 'F c, yz Wۢ0M:, \Ɗ J \ {$0 4 E%$!{! WLlE \FLeC CLE<=<  < 8劅 =۠<LJ! K `U؍U؍VUU2T3TuvUU`UحUUVUUuv`U %H L "# HU [ Bh [`ȥe*T )TUUUVV`0XjM \C Rm/T0Tij 'FU gݩU \F eCLeG eCLF eCLeG RuWЙvWВWWWЅW KX OR: 88 sآxc{UU H A \CͯU ͰULJHȱ wx K FLHh:g6䰰1 H K$c R > WۦPQ $ C vCPQwx zH,ɓɠ ɠ<Ɉ ɕɃ-UU KLeC$c0$c0cx : K FLG$c0LF IA,ULI LJŸ幐QPLHPwQx`{$`PQP IV VU IͰU ͯU FL IPQ`UU8VV`LFU %UUʆ%U2UU{U#U{%L[ U"U!!!U$U{U{## [L LU U8U!# HU" [ LLK U2U{UU{U e!U`U0 6DƊ` =:U-Ѹ U줊 U U `8`湄``U \C J8UU  :LqJU mK`Hɀ[ J EM7 M= M N M'LGL C  : MLfO L`LOL M` N MLM8` 6TH5THLLJ GL: M M M M M O`LGLLO LLOҐЪ8`簤8`ׅҥPQ $UUUU CοU2̾U?2UUU$0U CLKLKYU T LLK 2H2 h2{$` ` M* GL%LM M MLLȐ͐ M ~M` LJ( Lܰ6 M O VM QK M M N ML~L M ~M M` Mu MLL L,PQ]HPHQHPQ hQhPhB8` 2/ ^& &^ &^e^e&e  ` L MLL EM M N`І GLؤЦф RJLM M M` 5N 5N M` 9M MLhM M ME M M M` M M M` M M M` M M` M N cK !L &N`,,,,,%,$,,,(,),.,,,φ 8` O0:LLJ" LJ&"LLJ M GL MLM EM M N`A[LLJ GL MLYO EMLL EM J M GLɢ MLGL YO MLGL M YO M` M M M LL M LLL J֢: M` N; M N M` EM M M N` NLM M ML^O L M M L` EM` N$ MLL M M` GL M M8` L M` MLL GL MLGL LJ L` M; M M` EM M` L` YOLM YO MLGL EM M M N M` LRJ LRJ M EM M EM MLJ M΢LMץHH S ]JL PJ Thh` P&Q PPPQP)TQ*T)8)TPHP*TQH8Q hVhVULFL,U T P 6Db`3 T`Lޠ: VV,U ILDL", AND UP & DOWN ARROWS ACTIVATE TRACE FIRST NO ERRORS.?BCHHL,yrs / X -r LeH! L;!`ӠҭҠҠŠŠĠӠ΍ĭͭ (2?lkBЅC ,`rs X -Le / 6Llk@h =EFD  :Lw? ` Ƹ` Ʋ`  0NH 6h(`  ` Ʋ`@LrL,8`LQ @|º} F LrĺQ`) A@`~ {Lr` Lr`H h` Һ` ` ` ` ˉ` Э`L |)& Ǹ _ ʁL 8` ѻ,$ͅ톺Ά΅(`8`HJJJJ h) 0:i`$S S 踩 |L Ǹ ə㩀SL˱  Aay Р@EDASM.EDEDASM.ASMBASIC.SYSTEM1 3>P )?>2!4K>3!EY>Q :DAP Q{>1!s>F q2!IX!>X >T!΢>T!>1!>L`?T`>E >D!Ȣ>W!ܢ?P ޢAET!?E &?1!2?P =?5!mH?3 _I7!}^?F!A?M ?K!!?1!{@C!ӤIFS!?2 @R!ңGF!裌C2!@E!1DS!?1 %\MP!@C2!0R!XYZh[hh) JQJJJ}Ѕ]]Ѕ\l\Ѕ]`Ѕ\J)l\[HXYZ(lRƼ+F}df/YbLҵLХLХLСLеLРLСLХLеLеLР8iLХuuiLТeeLаLАLеLе0LеLеLе5ILе5IбLТQSTUVWXYZ[\]^_`aLб8eL8iLТeeL |L L˱ú% ӺI-úպ ` |íú) ' { H 9hY ҭº АL˱$1A!2A "q#R L˱L -& &L$s0 ԩ`{*; _Ѕ`ȦaOP' 9Ѕ`a$^)_!`0` h80a  CLӥ^ G; _{y{^{,{0 $s0_ )_ I@?2 C2Lc C8ee `l;3 C )ȹ )79L8 ԩ?3 릩) `hhL˱ Ԡ C ` +: а2d1*: $0I0 C0f֩ LCDl %9+1;)` 'd tt . / L˱L%27QbrL˱sL& N+(P (@)@ YL˱LPLyL˱ ԩ= C$ C 9L˱Za:xL˱ :L˱ 7L˱ l;8 hhL˱Ll8( d8 )`@ 76ȹ@ @ CLL9 9 = +)L, C OLF ^ 7AY` ':7L} 7AY`ʆ` L ):(; LJl4 $;LCe 9 = ';Ş x &;О xԠ R 1'; xԩ C ! / / /  {ԩ$ C 6 6  {L˱tB,%q'qBQt&Y L˱t  `   ׆t ,c9c67%: J CRL˱ %9':&7 } ,'r&r t c5c7l; )8l+; )3:l; )(1*2 ^ qL˱ f = LU  )4$( J$1I ɃL !$9 Lf)2  `Jsa {L u SAfc զ%ʆbg f )IQJQ!:BQ$~q*q%H h%b ~a9a:$c ^L˱Y N uL. *4 $9Y C/ CN C H |  |h` C CLCBZ lq ; Ԣ ٰmmʆL˱L8  L0'qJ  ȱ %:'9 ):(; )9 QL˱ |3Lậº⺥Q亩Í㺩庍 L ǸLڢ Ǹyz _L ٭ L  IAYA!:JLO):I J *9`ffgL.ۥgb 6۩ CL=Ӆ% ka` fإyzy _ۥzy LD۩ga 9L_ۥ%b 6 9b 6  )3CQHH hhLڠedeH   ۤeh ܤe 'I$dHehe L ,eLFdL L H hLh fdLHhe% 8`  uL ۥzyhhhhL˱  `, He`J 0 zkmlnoL'H WhLɓ,Ƀ8`ɠ` ܰ`L `)_`t h _`Y$- , @!@@Y@L˱L2h)2 (:YlRL_L˱$ |L Ǹ #魀2 * ܰ C7L2 LLL  0 "$ "$NPD" Z( \L R.4*̲  &Jң6FH, 28:< X>@ B &T  V(2`Ւ}xeA֦Vyț$ֱP)?ۑ;ݠվյu}Ղ:7` `81 %\MP!@C2!0R! fPe t f= eeɘh&&&&ee&&eLe`XhhL:0)`8` {` tL , L L L ʠ! L` , ?, L +L ץ LL֙   {LL{ }} t } r}0ɠ0۩ { { L t8-L{L A t LL`L A t L$L t ` t -&&&&LӚL f G A)`8` B 39l  :9%2r |L ĺL #7Lm;:l :l99'9)9 B  L QڥQ |ʺܺ ӺӺºԺ L˱ B l[99 ِLL˱l:l9 Qکֺ |ʺܺ׺غÍպӺºԺ L˱LC H ChLCtL` ~)q'q*q~惥~ŀ~ 7` C` {hL{CMD SYNTAXNUMERIC OVERFLOWPARAMETER(S) OMITTEDUNKNOWN COMMANDMULTI BUFFEREXEC NESTBAD LINE#/RANGE ERROR $0EDASM.AUTOST^1ș癅ș|l~ŝt`Νҝ֝ LINE# > .STRING. .OLDSTR.NEWSTR. PATHNAME<#> # OLDPATHNAME NEWPATHNAME[A<$>ADRS][A<$>ADRSL<$>LGTH]A<$>ADRSL<$>LGTHd*`iH)JJJJ 0h) 0`-fj:q nm  n)? !rs) !opJ !klH) !deh)(jJJJgJmgʠ`fʈ`BYTES USED BYTES REMAINING BYTES USED BY NON TEXT DATA = XSAVE FILE TYPE = XSAVE AUX TYPE ə` 1` |GLQ亩 纩Í㺭ậº 纪L˱ PRODOS EDITOR-ASSEMBLER // RELEASE 1.0 14-DEC-83 BY JOHN ARKLEY COPYRIGHT (C) 1983 APPLE COMPUTER INC. @ )p Ŕ(L2թTL˱t  CL9 2P(TD D1Q |(Ǻ Ţ Ǹ+ ʝLd 9/ CEA' F 9 ' 9 9d bA) 9 ܐ L˱f Cf`0 ŔfAa)B/AA  |E 5>衙źƺ= Ⱥɺ& ź8ȺHƺɺh 9 9`A NAME TYPE BLOCKS MODIFIED CREATED ENDFILE SUBTYPEBLOCKS FREE: BLOCKS USED: TOTAL BLOCKS:  C,P ȹ C`AH)AB CAhA`$d ʥ8` ʝLLdd d`5/( /LL΢L˱(ȹ !ʎ _ ǵL̀ CLޢ 9L˱ 'RL 9)dPfS Cdɀ)pJJJJ 0 C, CD C1(2 C C= C C/ C Cf 9d)iЗL˱ 5A)AQ ! Ӥ\Hh,PIN'RH`a L㣩AH` Ӥa Ӥ=IXVWF = 1TU _)*!, 1`@`BJAH)h****)  md8`DHC< ˤ:h  ( ˤ\쑥-Lid `H) ޤhJJJJ 0:i$`  0 `...8 ` O` JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC(UNKBADPCDPTXTXTPDABINFNTGRFBA3DA3WPFSOS$0D$0EDIR$U0$U1$U2$U3$U4$U5$U6$U7$U8$U9INTIVRBASVARRELSYS$(, 4),`HH(h0h(hN OH?%Oh,(,`l8%u,uu` 5 H`)$u0Z_VH,,h1][? @ | @LI $up,c  @ :8` 78``, .   C =\ C 93 C,,0 ?L 5,)$(0 ) Њ CL9é,)   Ɂɏ`PP767 CP998`7/ Ɂ, ,L, ,@ 7٢6789`ii 9 8eT  ܐL˱L֧ȱ1) CL(Lܪ89H) ChLL91 ݀O2 ݊O5!ݔO4!3 T`߭IWPHHHAHHHHLaVEWLӿ0`$v$iP)iͽ΢ dѝ qѝ]efe$0dc҅ӄ#cȱcȘe҅ҐȘeccdedf̤Ӧʆefcdcd$ eey}fiz~ LYxL$0 ȱ ~Iȱȱyȑy$ ȥyȥy ѐyzyyz$ Ƙ$iP ѝg$LЩi`SYMBOL TABLESORTED BY SYMBOLADDRESSie憥yŇz到$ eyyz檥ef`Ff`8姅娅膣eebdefghijklmnopqrstuvwxyz{|}~6$6eufu$2eeeeѱ L҈ѯ0ȱѱ210(8%8姅娅0L椥Ŧ LѥţL s LYx}ȱ}Lҩ jƚ*~*,z?,zX,zN ȱȱ$0 L= D D   LU yӰ日ś 3zLL`$ e}}~}~`*255 EXTRNS/ENTRYSDUPLICATE EXT/ENTSWEET16 OPCODEEXTRN USED AS ZXTRNORG MUST BE > $1006502X ADRS MODE/OPCODE----- NEXT OBJECT FILE NAME IS SOURCE FILE # INCLUDE FILE #ة٠ ؠ ٠  $#*).meiu}yqar-%)5=91!2 ,$4<0PpX:ʈMEIU]YQARLl| NFJV^  HZh(z.&*6>nfjv~@`8xdt     `@ 0Pp)))))))))))))))))))))))))))))))))))CCCCCCCCCC@@@@@@BBBBBBBBBB@@@@@@ADAD@AN ASÀsASBHBCBCBEBGBIB`BLBHBMHBMBNHBN BNMHBNHBHBP!BHBR"BR #BRXBHBSXBV$BV%BHCH΀.CHҀjCL &CL 'CL (CL )CM*CPIPCP@CP3CP6DATŀD€[DCɀDC@DD€nDE9DEƁDENĀ0DE >DE ?DF€[DρYDӁDSECԀD׀ELSŀmENTRفEO@EQՁEXTR΁JFAÌFI΀yIBUFSIځsIDNÙIFEсIFGŁIFGԁIFNŁYIFLŁIFLԁINIINCLUDŀIN@INTERЁIN NIN OJMPJSSL@LDTLD@LD@LD@LD']LDcLSLShLSԀoMACLI€AMS€NO mOBʁ>ORnORǁPAGŀPAUSŀPH wPH xPH yPH zPL {PL |PL }PL ~PO@POP@REƁJRÈREЀGROROR`RT RT`#RT SBSBT̀SBUFSIځvSE SE SE SEoSKЀS@STST@ST@ST@STҀ9STST STSU@SYӁSW1TA TA TIMŀTRTSTS TX TX TY X650ZDEƁZREƁFZXTR΁F.ASCIɀs.BLOCˁ.BYTŀ[.DBYTŀn.DEƁ.EQՁ.INCLUDŀ.LISԀ.NOLISԀ.ORǁ.PAGŀ.REƁJ.SKIЀ.TITLŀ.WORĀ1ވڦ< p|ܷ*_14-DEC-8315:21 peNNO(`JNKOL ;ް/  0P L8 | ZߠJ`L@!ȱ@" Lx,14-DEC-83 15:21 x zrx x { 0~    I I I w$sf Ѕftu y x s$ `r z x`sİ$w0 ( ( #, , zL-xxxxxI`ILi 3zb`a Z= _yuat`u Z _yLy _yX _yx  3z _y`ab Z 3zq _yf`ab Z 3z`  L3z YRAMMUS RORRE s 3z ry ``ab kzO F   D 3zȄ LyhhLix$`J8ei$ 8zLzƬ z 8z z  L 3zHq* hvŌ , ,Lfz )~KӅٽӅژH  J q(h LZ8ettuiu` @#!Hm)~a`Ȅh`@,,_ޔ_,`xP)6e(Ơwtu |„]iklovsjȄh(*; ̞ ͩ |?   CDcedf | )}ԥՠ`mm,,`ab`0 y z?  …셺}~ |`ѩ0`8fȹ! %~?ȹ yLx Ȅ`ҹ@)" %~͞ȹ !@L|Ҏ̞L(} ̞ ̞̞?/̞Ƭ̞.ș̞0ș̞̞`@v` L|v )ps Ňsn@(E'. ۝v 76ȹ@^ L }nL}P }oL}$p ȹ@-@ џП = `ȹ@I0 ȹ@I0 }`L|.OBJ0 `a{)`g ,| `y{z| Lx$0P  뀰Ly*;LI ` " a)0  yL~) $0 ȥ}ȥ~L~ $ϩ G yee  ( -  y$P$ V ? L@~g*h 3z ,|ɀ  `Ȅy{z|$0P F 뀐 y*;  ( -  yLo,ɃLɁ녙Lo ',z!C yK Я?)   )e؅$0 H yLs膧,z"ţ 襠覣EA 2Lo 􂦧)栥& y襠$$$$ $h R V ? L-Lx$0pP zģ$p ``$0p急ŕ喰`LzLvxyHzH ) ځ H + .8hzhyx`FINELSE$0`H8ԥեeԥfՐ yLxʊ 0 @  heԩeԈ 0ґ`$`aiii`i`aiaإg$h0 (`y ȱy `y  `ȱyH()`ȱyH()`y eyyezz`y eyyezz`e}}~`eL~倐6 yLxŕ喰`0`Ƀw8`gɈ ƒƓɕ 擥(ɠɏ8fh`ɎFh``, # ,ɍ #`8壪8}~`` 4<:Zdtz .h@8@ ޅ8` Q Ȑ  xȱHȱHx``08Șe憠 Q ť 0  yL8`$ " _!4 H@¦ ӃL쌩âr ( y ,Ùrå  `ȱȱ ($0W,X,zX 鄰xՄ %)Մi$c  ) ) â y0pC=9 )膣 g$"ɴ yLń,zфȄ` @4 y8` ݀&ɠ y0(L舽 p p٥)4H yh8`J` JȰp_H^H p`e))8`E yp`A 8`$0υ ځy<>- c0mȱy%g $ L: LՅڦ0ҥ Jɀ`υЩϽ,H3H c`hh$  J (,)` H ELy80e( ` H  eheHhL&` "` a602)$ @ y)) g ȱ`g,z L G`'ȱy Lȱy'`* ϥ}~`%2$@H8 P4:ŧ* &&֢ y` P` L HJ uv` H&&&8寪尐柈`EЅϥII8 υee`+-*/!^|SF9`%%`EE` =܄ݠȱߩe憠  х)х ޤ8`0 )H) υh`H )J&J&ۥH  hhHy) L)J&J&J&hEH h ) f f fFhE ۪h` ,Ly X AY 8``H 8h`۽ eۅܩiݘeeܘȑef܈eeef e e)ehɁ @eȥ}eȥ~eef8eeefeԥfՐ yLx`g  g $, y`,z@)ϑȥȑL ɥťg$0 L$pL" $F y w )Qchi cL۝$ z zhAҩׅ ~ͅҩ ~ 3zL"8}~HH -L DhhL"$pL"8僨儰 yLx$ii 횥}~L$0 P)?`8` L$p9-$8 yLeşf堰ԥՅ ~LgHg hg` - ,$ yL8f5HH hhLf𥟅( yhhe}e~g7$0$0 ʀƠƟL Dh R}~L䌥` ʀƠƟLD` p pgpxҢ 2ҦpxI 6LҌȱy!л Hg ʍ L_ Lg VL쌥g R V`eӅө`!҆` xg  2xILȱy! Hg ʍLÌL L]L ځ Hgf!ȱyŅ 숄 H ʍ  ℈$0 ʍL hɂ$ RLVȱyŅ VL쌥H xhL ځO! NF  ,LL ځ HyŅ LgLʠ!L ځ bO YN g 3z8FGfhLȎ 8N /O+ "ҕ ,L6L8fhLCUEWGAVSg $h LL쌩@ig7 ځ . HpȱyŅ ]#ȩ]i LpLgL$h Z 5 ځ  Ņ  L쌥gL$h 3zhh ? L-  8` gLe!ąd솣 ʍL؏ ʍL䌢 Lď0F}~ة}~L쌥}~؅gFL쌢 yL g@LEJL쌩L @ 30ҥ "0 0 0ЧСL68fL쌩L쌩L쌩gBF ( D ". a6ϩ GL,z$,z) L $,>,@, yLg\ ( "K a#}H~H~} ϩ0 Gh~h}#0)Щ,zХ 0ȥȩL ځ L63 I1g>ȱy, H 3z>   y  zgLL:ERULIAF g قL (&" I _8f8emm LL@ ˈˠ  %~ @ ۝ȑ@ ˨ `g$h0gpצ`ׅ҄Ӣ ~m D = > ˪8iҤ̐Ȅ ~ !` ( (˪ȱ (`LT0 ( " L?yHzHH ?ƥy/z0hhzhy`¥g'dfceLrԅL쌢,g/H h&$&&8H}FFheddfňL}D8:|Dx||?``|@xAx?p `U l! ex@? `? T"U*Q*@? D$DD?``@xAx? ~*Q"(yp x@*U("*U*U*u} p @?~N@?~ DH Tb@@ U*U*A (~ x U*~~ c@A?8pU*U*U*U*UxU*Ux pp T*EH`?pp@ ~Q*A*x | |o)9*@`*E @?*U*U*|? p ~G*U*U Q |P$DD @TxU*U*U*  |'%(U*#A*U*Ux |~ U*U*U*p ?``|@xAx?p pUn) e `?@U*U*U*`? >D88?``|@xAx?r ~? U*(U* |` x(U*U"U*@"U*U*| pyp a<?~L@?~pc y U `P U*U*q*~? p E @~ acGpI8pU*U*UU*U|U*Ux ` P*QJ.ep@P*U*x x ~o)9*P`(E*`*U*U*|?  S*U*U Q ~%|8|?~N@?~ ~'eP X#*U*Ur |*U*U*U*x ?``@xAx?~ pQ\{.( e~ @?`E U*U*` ?``|@xAx? ~?*U*~?` p(U*U U*U*E  U*~`G P U*U*x*~? `?@ `? acG| 9pQ*U*U*~ U*Ux | P 'upB?T*U*x `? o)( |?` U*pO*U*U*|? x @Q**U* Q(&DDd@ *~)U U*U*@ D(D?~O?@??~ ~'EA\#(U*Ub x@?(U*U*U*x ><88?``@xAx?~@@ xT \{* e~ p@T*E*U p ?p`~@|A|?pcyx *E*U*@ `(U*U(Q U*e?  * U*|`C P" U*T*|*|? @@ x cS|+ 9p UD*U x ~ ~?*'q@p@bU*U*x  @U p `U*|C*U*U*|?  @T*(U* Q*@$DDDD *?(U*U*U*@ DD?~@O?@?~p 'A{ (U@*Ej{ x`(U*U"U*| DDDD?``@xAx?~  1 xT X{@  e?| yTT(TU"x ?~`O@A?~ D (A*U*p @ @?@*pH U*E*p  P*!U*y`*U@*U*U ~(T*|? @ ~ DPx#U*y?p(UT(E?*Ux x ?*~"ypp@@ xU*U*x | `!U*(@? `@*U ~Q*U*U*~? x `?T**U* U*p?D>8x8 (E*U*U*U*@ <)yxp(@ |#U*Ux p p?(U* Q~ `@*U T*U*U*~? ~ pU*U*U* U x ~?`O*U*U*U*` D|d?~`O@A?~ @'@{$ U@ j?` p| U*U*U*~ <D88 @@*UB?T(U*U*~  xU*U*U*A"U(| ~?pO*U*U*U*` DDD?p`~@|A|?b `'`%UP b`? p~ U*U*U* DD@?``@xAx?~pp |@*U*U qap |P*U U*D*U*| xqx 8?~O?@??~ D( @OU*U*~  ~U*)| ? L ~Ѕ L ~Ѕ L`,0 ~  ~  ~ L,X L J   J  J {`ҺӠĠ` `(4);"PR#3"(100: SET PREFIXB (4);"BLOADM,A$1000"oX$"SHELL"ĺ(4);"BLOAD NOEGG.0,A$1800"u200: LOAD K, THEN OVERLAY IT WITH 80-COL ROUTINEX$"S8.3"X$"SHUTTLE"X$"shuttle"İ40023- X$"COPYKIT"X$"copykit"ĺ(4);"BLOAD N,A$2200":80-COL PRINT DRIVER3 f 255,77:254,76: LET L KNOW ITS A PRODOS TESTy (4);"BRUN L" 2 Z *************************** b c d i"1. COPYKIT" n"2. SHUTTLE" s"3. SHELL" x:" CHOOSE ONE..."; N N1N3ī1001 N1X$"COPYKIT"G N2X$"SHUTTLE"[ N3X$"SHELL"u (4);"PREFIX /S/"X${ ::::::::::::::::::::::::: 80-COL LOADER X$"SHUTTLE"ĺ:(4);"BLOAD K,A$E10":210 LOAD DEFAULT FIRST :(4);"BLOAD K,A$E30"* THEN LOAD OVERLAY3 350; :P "1: //E 80-COL"i "2: VIDEX VIDEOTERM| "3: VISION-80 "5: OTHER "6: NONE "WHICH ONE?";N  N1V$"K":350 "N2V$"VIDEX" ,N3V$"VISION80" ;N5V$"VOTHER" @N6V$"VNONE"8 EV$"/S/COMMON/"V$".0"Y J:(4);"BLOAD ";V$;",A$F00"_ ^f   : ABORT THIS GOSUB : "WHICH SLOT IS YOUR 128K CARD IN"; N N0N7ī410 253,N  100: GET AND SET PREFIX9 (4);"BLOADM,A$1400"fX$"SHELL"ĺ(4);"BLOAD NOEGG.0,A$1C00"X$"SHUTTLE"ĺ(4)"BLOAD K,A$1210":22(4);"BLOADK,A$1230"(4);"BLOAD L,A$C04" X$"COPYKIT"X$"copykit"İ4000: BLOAD STANDALONE MODULE/ ((4);"BSAVE"Y$",A$C04,L$2C80"H F(4);"PREFIX /MENU"] K(4);"-STARTUP"c Pi d n"COPYKIT2, COPYKIT2E, SHUTTLE2E, SHUTTLE2, OR SHELL? ";X$ qY$X$ s(X$,7)"SHUTTLE"Y$X$:X$"SHUTTLE"4 u(X$,7)"COPYKIT"X$"COPYKIT"N x(4);"PREFIX /S/"X$T Z ` f  (4);"BLOAD /S/STAND/O,A$2C00" (4);"BLOAD /S/STAND/P,A$2CFE,TREL" Y$"COPYKIT2E"ī4035 (4);"BLOAD N,A$2600": PRINT SCREEN DRIVER    X RP0) OPPBCQ? ,`Š䍊嬠㮊8Llm ٹNPQRTUS` B ξtϾ pL о־޾׾پھؾ p  Lp ɛ۾TYPE  L Ɋ @" L 8@ L !=0?C> ) } } } H }hߦ$( $`12 l0N Z+07 Zp ꎌ Z ^ ꎌ D]IIƍI2$3p ͔1L (ɬ ɮ ɬ ɢ `ʨ`hh N E` ҎL Ҏ ɠiɺ>F=E攍甩$3pDоɍH J攢L ɠɰɺ8``ɯɍ`1̎ɮ <1`  1`n< ,&` ɢɢ `8 v ` bEHȹɿh` bh` Eɠ`AɀeE*EEAʈAIȹEEA`C }LwE z`N ёCEEɛ@  }Lȏُ `DH hhhNꔦCLȏHH`ʩ Lȏ8 ґɠE CH vh } $><  EH딥3ɾɪ$@ɢE@@$@0 )ߝh` bL/EEC 듈L N 듩EE I LZE v CLȏ$8f< bNꔨE ,$<CC zCE?AC8A v Z b ,ǘL֏ DA DA`$>I 8LE? s ZLY ? ?Lw sCC ` LȏH@ɠ$@ ɢE@@EE=h`$(,L  nP蔭$ b,-Ɂ,$0$,c0 ې II Hɛ,0 .LՑ, b0 ؔߔ LՑ0ɕ `JN,019F`$,0(H @))(hL Ӓ,ɧ Ӓ#ɧɝ` .Lb 0 H h`hNNɝ```? ? 0` ? ,0n` c)`ꔍ픥? H h0ED l z`ɠ\,LH)? h`, 3ɍN,0ɍ3 ɛɓ 8II蔐婍, Nꔝ ,LLL,F,AHHɓ4ɛ0ɐ,Ƀ ɘ9 LKFhh`n8©é0nLً, :/8`|̃m9&GVHNNggԠƌ԰ɠE`ܢŠé̠Πִ", ˨˨6ΏŮƺƲŠ àŠàōĠƠàĠƠĠƠŠŠİĠƸŠŠŠàİ̷ Рŧ˨űű˨ ŠЧűű 4Рŧűű [\_: T@ı IJ 4ӵ Ӷ 8̭ ,:.@A›BÛCěDśEƛFȧ ĠŠĠŠù°Ơù ŹùĠİĠàààưĠàƸàƠ̷ ɛʛ˛Ľ ͛Χ ң ң ѧ ԍŭ ҧƸ͍ ֧ų اô±ưŶİƸŶİƴŵŵ̷ӠŢ ߃ T˨ ŠЧűű 4 ŠЧűű 4" ôǝŢ ߃  ORG $280 PRBL2 EQU $F94A ;PRINT X BLANKS RAMON EQU $C083 WENABLE EQU $C083 CROUT EQU $FD8E RENABLE EQU $C080 BANK1 EQU $C08B RAMOFF EQU $C081 BANK2 EQU $C083 COUT EQU $FDF0 ;ACTUALLY COUT1 PRBYTE EQU $FDDA ;MEM FILL AND CHECK ROUTINES ;OCCUPIES P0-3 AND DOES NOT ;CHECK THESE PAGES ;***************************** LDA #$00 TAX TAY STA $00 ;THIS FILLS $400 TO $C000 LDA #$4 STA $1 AGAIN LDA $1 CMP #$C0 BEQ RAMCARD JSR FILL INC $1 JMP AGAIN ;*************************** RAMCARD EQU * LDA #>BANK1 JSR SETMEM LDA #$D0 STA $1 AGAINB LDA $1 BEQ RAMCARD2 JSR FILL INC $1 JMP AGAINB RAMCARD2 EQU * LDA #>BANK2 JSR SETMEM LDA #$D0 STA $1 AGAINC LDA $1 CMP #$E0 BEQ NOMOREFILL JSR FILL INC $1 JMP AGAINC ;*************************** ;ON ENTRY A=PAGE NUMBER TO FILL FILL LDY #$00 STA $1 TAX PUT TXA STA ($0),Y INX INY BNE PUT RTS * **************************** NOMOREFILL EQU * STARTCHK EQU * BIT $C030 ;click! LDA #>RAMOFF JSR SETMEM LDA #$00 TAY TAX STA $0 ;OK NOW BEGIN AN ENDLESS CHECK LDX #$8 CHKNEXT EQU * JSR CHKAPAGE ;CHK PAGE WHO'S NUM IS IN X-REG LDX $1 ;GET PAGE NO INX CPX #$C0 ;STEP THRU PAGES TO $BF BNE CHKNEXT ; LDA #>BANK1 JSR SETMEM ;WHOOPS LOOKS A LITTLE UNSTRUCTURED ;BUT THEN WHO CARES LDX #$D0 CHKBANK1 EQU * JSR CHKAPAGE LDX $1 INX CPX #$00 ;DONE YET? BNE CHKBANK1 CHKRAMB EQU * LDA #>BANK2 JSR SETMEM LDX #$D0 ;STARTING PAGE CHKBANK2 EQU * JSR CHKAPAGE LDX $1 INX CPX #$E0 BNE CHKBANK2 JMP STARTCHK ERRORHDLR EQU * BIT $C081 ;TURN ON ROM STX $3 STY $4 STA $5 LDX #$00 GET LDA ERRORTXT,X BEQ DONETXT JSR COUT INX JMP GET DONETXT EQU * JSR CROUT LDX #10 JSR PRBL2 LDA $1 JSR PRBYTE LDA $4 JSR PRBYTE LDX #6 JSR PRBL2 LDA $5 JSR PRBYTE LDX #8 JSR PRBL2 LDA $3 JSR PRBYTE JSR CROUT JSR RESETMEM ;TURN LANG CARD BACK ON IF NECC LDX $3 LDY $4 ;RESTORE Y RTS ERRORTXT EQU * MSB ON ASC .ERROR: ADDRESS FOUND EXPECTED. DFB $0 RESETMEM EQU * ;RESTORE MEM STATE TO PREVIOUS VALUE LDA MEMSTATE ; SETMEM EQU * ;SELECT LANG CARD BANK ; ENTRY: ACCUM = LOW BYTE OF SWITCH ADDR (C0XX) TAX LDA $C000,X LDA $C000,X STX MEMSTATE RTS ; MEMSTATE DFB $81 ;REMEMBERED LANG CARD STATE * * * CHKAPAGE EQU * ;CHECK A PAGE, SHOW MSG IF A VAL IS WRONG. ; INPUT: X-REG CONTAINS PAGE NO STX $1 LDY #0 GETABYTE LDA ($0),Y STA $2 CPX $2 BEQ OK JSR ERRORHDLR OK EQU * INX INY BNE GETABYTE RTS $REMOVE.GPLEr!p $+ESCAPE.SAVE,!4 $ESCAPE.PRINTERX!o $NICE+ɬ$'STARTUP$+CONFIG.GPLE !R4$8©é0ĩLIpHJJJh)I*=XXpq ,0 L L ESCAPE SAVE _::(12)::(104)8Ĺ103,1:104,8:2048,0:(4)"RUN ESCAPE.SAVE""***************************************"("* *"2"* GLOBAL PLE ESCAPE SAVE PROGRAM *" <"* *"L F"***************************************": P(1007)1ĺ(7);"GPLE NOT CURRENTLY IN MEMORY": Z:"GPLE FILE NAME: ";:657:A$"":X512767:(X)141A$A$((X)128):X _(A$)20 d(4)"BLOAD ";A$;",A$2000"h nA8192:(A)1(A1)1ĺ:(7);"NOT A GPLE FILE":23:7:"PRESS TO CONTINUE ";:A$: xI768796:V:I,V::768 169,128,133,60,169,149,133,61,169,255,133,62,169,153,133,63,169,128,133,66,169,44,133,67,160,0,76,44,254 (4)"BSAVE ";A$;",A$2000,L$1100"* :"DONE":N %: H %0$'  JH ɠ h`LC SET SOFT SWITCHES TO NICE SETTINGS (CORRECT HAL'S ERROR)T (4);"PR#3"j I15:J:J,0:I 49236,49164,49152,49154,49156 Page1,40col,80store(off),ramrd(off),ramwrt(off).  I13:J:(J);:I: 145,141,24: CTRL-Q,RETURN,DISABLE MOUSE CHARS (  2'(4);"SAVE /MENU/STARTUP"-73000r(49175)128ĺ(4);"PR#3":"ACTIVATING C300 FIRMWARE"(4);"VERIFY /S,S7,D2":(4);"PREFIX/MENU"("SELECT THE PROGRAM YOU WISH TO USE "2<" 2. CONVERT"F" 3. FILER" P" 4. EXIT TO BASIC"* U" 5. MEMTEST4"< Z" 6. RUNKLM"O _" 7. MEMTEST"b `" 8. COMPARE"u a" 9. LINKKLM" b"10. GPLE" d"11. COPY II PLUS" f"12. MERLIN" g"13. EDASM.SYSTEM" h"14. DIAGNOSTICS" i"15. SHUTTLE" j"16. BASIC.SYSTEM" k"17. D.BUG"" lA$. nA(A$)< oA0ī108V pA1ľA$:A10A(A$)] qAh xA4Ā A16F$"BASIC.SYSTEM" A13F$"EDASM.SYSTEM" A14ĺ(4);"PREFIX /S/DIAGS":F$"/S/DIAGS/DIAGS.MENU" A15ĺ(4);"PREFIX /S/SHUTTLE":F$"HELLO" A2F$"CONVERT"4 A3F$"FILER"B A5ī500W A6F$"RUNKLM"o A7F$"MEMTEST.0" A8F$"COMPARE" A9F$"LINKKLM" A10ī1200 A17ī1220 A11F$"COPYIIPLUS/UTIL.SYSTEM" A12F$"MERLIN/MERLIN.SYSTEM" F$""100$ A$(27)Ā5 (4);"-";F$; A k (4);"BRUN /S/UTES/MEMTEST4.0,A$800"q  (4);"BRUN GPLE":(24)  (4);"BRUN D.BUG":(24)  :RETURN SET SOFT SWITCHES TO NICE SETTINGS (CORRECT HAL'S ERROR) I15:J:J,0:IB 49236,49164,49152,49154,49156y Page1,40col,80store(off),ramrd(off),ramwrt(off). I13:J:(J);:I: 145,141,24: CTRL-Q,RETURN,DISABLE MOUSE CHARS  # DON'T MODIFY THIS PROGRAM 8 CONFIG GPLE 350:::(12)::(104)8Ĺ103,1:104,8:2048,0:(4)"RUN CONFIG.GPLE""***************************************"("* *" 2"* GLOBAL PLE CONFIGURATION PROGRAM *"B <"* *"q F"***************************************" P:" GPLE FILE NAME: ";:657:A$"":X512767:(X)141A$A$((X)128):X Z(A$)Ĭ d(4)"BLOAD ";A$;",A$2000"X nA8192:(A)1(A1)1ĺ:(7);"NOT A GPLE FILE":23:7:"PRESS TO CONTINUE ";:A$: x:" 1. 40 COLUMN OR APPLE //E 80 COLUMN":" 2. VIDEX VIDEOTERM":" 3. M&R SUP'R TERM":" 4. ALS SMARTERM":" 5. VISTA VISION-80":" 6. WESPER WIZARD-80":" 7. OTHER"J 16::" SELECT: ";(8);:B$:B$" "ĺB$a B$"1"B$"7"130 B$"7"Ĺ779,(B$)14:768:200 16::" DRIVER FILE NAME: ";:657:B$"":X512767:(X)141B$B$((X)128):X (B$)160M " INSERT DISK & HIT RETURN ";:C$::18:" "l (4)"BLOAD ";B$;",A$2100" 18::" DEFAULT 40 COLUMNS (Y/N)? ";:B$:B$"Y"B$"N"200 B$:V255:B$"Y"V127 8448,V " ENABLE TYPE-AHEAD (Y/N)? "; B$:B$"Y"B$"N"2407 B$:V0:B$"Y"V128C 8449,Vn " ENABLE CONTROL-A SHIFT (Y/N)? "; B$:B$"Y"B$"N"280 "B$:V0:B$"Y"V128 ,8450,V6:" INSERT DISK & HIT RETURN ";:B$::23:" "4@(4)"BSAVE ";A$;",A$2000,L$1100"[J23:" CONFIGURATION COMPLETE";aT|^I768792:V:I,V::h169,0,133,60,133,66,169,255,133,62,169,16,133,61,133,63,169,33,133,67,160,0,76,44,254L!LULaLXH?2hH U2h`,066LU,`Í676LL 0)`,0L  ˊ(+ H h`,p{؊HJhxTUp(P(,T(؊`hp(`(`HÍhLÍI,I@`NO`L>LL{LHLԊhϊ6H7Hъ6Ҋ7ϊ 6ъh7h6ϊ`)Mӊ2,0ӊ Lӊ8H9HÍҊъ h9h8`,( H H`H hh`LЊ{m{HmH ) hJh̐I0)Њ`  hH   h`L!LULXLH?2hH U2h`,0,,, N,LtÅ76 å6V`L,0L t)( H wh`H8{m{Ǎ h`,,,({){(  `L!LFLIL}H?2hH F2h`,0 e`0Í17 å6G`L,0L e)( H hh`H{ h` ), `{m{i`L!L[L^LH?2hH [2h`,0 z,,,C쩴,H [h08nCÅ76 å6\`L,0L z)( H }h`H Ί(m)i) h`̊ Ί,,(,,,_)`,,å% e%H e (hJJJJ(iȅ)`L!LILOLtH?2hH I2h`,0 g`Í076 G6K`H h`,0L g( H ih`H h` mH m{hJJJJ(mHm{hi) @), `