@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr program queens(inPUT,outPUT);type cl = array[0..8] of integer;var col:cl; i, j, row, QUEEN,N, SOLN } :integer; PT, GO, DONE :BOOLEAN;#I D2:POS.Ifunction try(row, queen:integer; col: cl):boolean; var i}:integer; tri:boolean;BEGIN i := 1; tri := true;  while (i <= queen-1) and tri do begin if col[i] = }row then tri := false else if (col[i] = row + queen - i) or (col[i] = ROW - QUEEN + i) then tri := false; } i := i + 1 end;TRY := TRIEND;(***********)(* DISPLAY *)(***********)PROCEDURE DISPLAY(COL:CL; SOLN:INTEGER); } VAR I:INTEGER;BEGIN WRITELN(CHR(125)); POSITION(20,2); WRITELN('SOLUTION NUMBER: ',SOLN); POSITION(2,0); for } i := 1 to 8 do begin writeln('*':col[i]) endend;(***************)(* MAIN LOOP *)(***************)be }gin WRITELN(CHR(125)); WRITELN('SOLVING THE EIGHT QUEENS PROBLEM'); for j := 0 to 8 do (* initialize the arrays }*)  col[j] := 0;row := 1;queen := 1;col[queen] := 1;PT := FALSE;SOLN := 0;DONE := FALSE;WHILE NOT DONE DOBEGI }Nwhile (queen <= 8) AND (QUEEN > 0) do begin  while (ROW <= 8) and not PT do begin if try(row,queen,c}ol) then begin col[queen] := row; PT := true; end else row := row + 1 end;} if not PT  then begin row := col[queen - 1] + 1; queen := queen - 1 end else begin} row := 1; queen := queen + 1; PT := false; end END;SOLN := SOLN + 1;IF QUEEN >} 0THEN DISPLAY(COL,SOLN)ELSE DONE := TRUE;N := 8;GO := FALSE;WHILE (NOT GO) AND (NOT DONE) DOIF COL[N] <> 8THEN  }BEGIN ROW := COL[N] + 1; QUEEN := N; GO := TRUE ENDELSE N := N - 1END (* NOT DONE *)end.>>>>>>>>>>>>>>>>>>>>>}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>H@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h- 00010 ;SAVE"D:BASIC.SYN 00020 .LI OFF 00030 ; This program checks the OS/A+ 00040 ; command input buffer, and }00050 ; then either removes or 00060 ; installs the BASIC rom on 00070 ; XL series computers. It 00080 ; does this by set}ting BASICF 00090 ; then executing a warmstart, 00100 ; to reset the OS variables for 00110 ; the correct RAM size. 00120} ; 00130 ; TYPE: 00140 ; BASIC I for BASIC in. 00150 ; BASIC O for BASIC out. 00160 ; 00170 ****************}************** 00180 * Daniel L. Moore 03/17/84 * 00190 ****************************** 00200 ; 00210 BOOT .EQ $9 0}0220 DOSVEC .EQ $A 00230 DOSINI .EQ $C 00240 ; 00250 LOADFLG .EQ $CA rev A,B BASIC 00260 ; 00270 VECTMP .EQ $D4 }FP register 0 00280 INITMP .EQ $D6 00290 ; 00300 BASICF .EQ $3F8 00310 ; 00320 DOSINIT .EQ $7E0 for FMS v.2 00330 }; OS/A+ equates. 00340 CPBUFP .EQ $A next char. 00350 CPCMDB .EQ $3F command buff. 00360 ; 00370 .OR $400}0 00380 ; 00390 ; Test for XL series computer 00400 START LDA $FCD8 00410 CMP #$A2 00420 BEQ DOS 0}0430 ; Save run vector 00440 LDA DOSVEC 00450 STA VECTMP 00460 LDA DOSVEC+1 00470 STA} VECTMP+1 00480 ; Save init vector. 00490 LDA DOSINI 00500 STA INITMP 00510 LDA DOSINI+1 0052}0 STA INITMP+1 00530 ; Check the command input 00540 ; buffer for an 'I or 'O. 00550 LDX #1 assume OUT  }00560 LDY #CPBUFP 00570 LDA (DOSVEC),Y 00580 CLC 00590 ADC #CPCMDB+1 00600 T!}AY 00610 LDA (DOSVEC),Y 00620 CMP #'O out? 00630 BEQ SET.IT 00640 DEX 00650 "} CMP #'I in? 00660 BEQ SET.IT 00670 ; Not 'I or 'O, exit to CP/A. 00680 RTS 00690 ; Set BAS#}IC in/out. 00700 SET.IT STX BASICF 00710 LDA #$32 clear cmnd 00720 STA (DOSVEC),Y 00730 ; Set init/r$}un vector to 00740 ; continuation code. 00750 LDA #CONT 00760 STA DOSVEC 00770 STA DOSINI 007%}80 LDA /CONT 00790 STA DOSVEC+1 00800 STA DOSINI+1 00810 ; Set BOOT to succesfull disk 00820 ;&} boot so SynAssembler will not 00830 ; attempt to run. 00840 LDA #01 00850 STA BOOT 00860 ; Let the OS '}switch BASIC, 00870 ; reset the memory size, and 00880 ; open E: at the new RAMTOP. 00890 JMP $E474 Warmstart (}00900 ; 00910 ; Restore init/run vectors. 00920 CONT LDA VECTMP 00930 STA DOSVEC 00940 LDA VECTMP+1)} 00950 STA DOSVEC+1 00960 LDA INITMP 00970 STA DOSINI 00980 LDA INITMP+1 00990 *} STA DOSINI+1 01000 ; Init DOS ($7E0 for FMS.) 01010 ; If you are running OS/A+ v.4 01020 ; add DOSINIT JMP (DOSINI) 0+}1030 ; after the label DOS, and 01040 ; delete the DOSINIT equate 01050 ; above. 01060 JSR DOSINIT 01070 ; If BA,}SIC IN, then set BASIC 01080 ; 'load in progress' flag, so 01090 ; all BASIC work areas will be 01100 ; cleared. (force a-} NEW) 01110 LDA BASICF 01120 BNE DOS 01130 LDA #$FF 01140 STA LOADFLG 01150 ; Return.} to DOS. 01160 DOS JMP (DOSVEC) 01170 ; 01180 ; 01190 END .LI ON I 1 h0ߢ 0.P5 X*SAVE#D:BUSYBUD.M65X*ASM,#-,#D:BUSYBUD.COMFX* Busy Buddy XE by Mat*RatX* Ctrl-Shft-> BUSY ONX* Ctrl-S0}hft-< BUSY OFF$X*. FOURSEC;;ACTUALLY 3.5 SEC8!X; 3.5 SECONDS * 256 (MAXTIME)BX; EQUALS ABOUT 15 MINUTESL JIFFY1}V BUSYON`BUSYOFFjVVBLKD$t CH~SPACE!;;INTERNAL CODE BS4SAVMSCX;; screen ptrX* Operat2}ing system equates: CIOV ICCOMB ICBALD ICBAHE ICBLLH ICBLHI ICAX1J ICAX2K 3}PUTBIN X* @INITQVVBLKD;; installPVEXIT;; Busy Buddy(QVVBLKD;; Express2PVEXIT;; VBI routine< Q4}>4STARTF %>5STARTP $JIFFYZHOLD(JIFFY;; Sync up sodFHOLD;; a VBI won'tnPVVBLKD;; crash thex'VVBLKD;; inst5}allationQ>SPACE;; procedurePBACKUP;; Iniz variablesQ>FOURSEC;; dela timerPTIMER;; of 3.5 secondsQ>;; Bus6}y controlPBUSYCTL;; OFF for now>Q>PUTBIN;; print titlePICCOM;; screenQLEN PICBLL &ICBLH Q>4TITLE7} PICBAL Q>5TITLE PICBAH" CIO,:;; Back to DOS6 TITLE A}A; AA=@ ABY Mat*Rat - fro8}m ANAE AALOGA==J APress CTRL-SHIFT-INSEAO ART to enableA=T A CTRL-SHIFT-CLEAAY AR to disableA=^9} AWhen active, Busy BudAc A will auto-A=h Atimeout after 15 minuAm AtesA=r Ato prevent MA-BELL Aw A:}ˠ!A==|LEN TITLEX*X* Busy Buddy VBI codeX* installed.X* Actual program appears X* below.X*;}VEXIT ;; VBI exit vectorTIMER ;; 3.5 Sec timerBACKUP ;; Space or BSBUSYCTL ;; control flgMAXTIM <};; 15 min timerSTART6;; VBI starts here5;; save all statsQBUSYCTL;; and regsHTIMIT;;ON& TESTONQCH;;Busy on =}request?0 R>BUSYON:HEXIT;; No, no changeD#BUSYCTL;;OFF, TURN IT ONNQ>XPMAXTIM;; 256*3.5 = 15minb BPR;; Show>} ON char lEXIT7;; Restore statsv8;; and reg & exit !@VEXIT:TIMITQCH;; Busy onR>BUSYOFF;; turn it off?HT?}IM1;; No, time it out CANCELQ>;; yes, toggle ctl PBUSYCTL BPR;; show Clear stat !EXIT TIM1"TIMER;; 15 minu@}te timeHEXIT;; limit? "MAXTIMFCANCEL;; yes, cancelQ>FOURSEC;; NO, resetPTIMER;; the timer QBACKUP;; SenA}d the SPACEPCH;; or BS character R>BS;; and set BACKUP*FPUTSP;; variable for4Q>BS;; next time.> PBACKUPH !EXB}ITRPUTSPQ>SPACE\ PBACKUPf !EXITpBPRC;; Show a orz5;; status char%>(;; near top left Q>C ;;; oC}f displaySBUSYCTL;; by poking P@SAVMSC77;; to screen RAM?:;; iniz addr INIT;; for LOAD99999999D}999999999999999999999999999999999999999999999999999999999999999HIB V L1 ,} 1 70,L.  ?PROCEDURE Center(Line : String; VAR xpos : Integer; ypos : Integer); (* by Erik C. Warren, 14 January, 1987 for UPDATE. F}..KYAN, Jan./Feb. '87 Prior to calling this routine, you must have declared: CONST MaxString = n; (n is a number of G} your choice) TYPE String = ARRAY[1..MaxString] OF Char; You must also have included the files "POSITION.I" and " H}LENGTH.I" from the K.P. disk, side two. xpos must be passed by reference as a VARiable, not as a value parameter; i I}t will be changed to reflect the horizontal position at which the string is written to. ypos is the vertical position J} you want the string to be written at. *) CONST MaxCols = 40; (* or 80 if your system has the capability *) BEGIN (* Calcul K}ate new x *) xpos := MaxCols DIV 2 - 1 - (Length(Line) DIV 2); IF xpos < 0 THEN xpos := 0; (* range check *) Position(x L}pos,ypos); (* Goto X,Y cursor coordinates *) Write(Line) (* Write string, no CR *) END; (* Center *) `轤{NAME gCIO EQUATES FILE While you program with your Atari, you will frequently use input and output operations, and you will invarN}iably use CIO to do these operations (except for specialized operations, in which case you may use something like SIO). CIO}O has many labels associated with it such as ICCMD and ICAX1, which you will use often. But if you EQUate these labels in P}different routines, the Kyan Macro Assembler (AS) will hand you a 'multiply defined label' error, so you must equate these Q} labels globally (which means right after your global VARiable declarations). I have created an include file, CIOEqu.i, to R}make these global equates, which may then be used by assembly language routines throughout your program. It is not an all-S} encompassing file--that is, it does not contain equates for every CIO label and command number, just most of the more commT}only encountered ones. You may, of course, add missing labels and commands to this file. This file should generally be theU} first one that you include after your global VARiable declarations, since its labels may be used by other included routineV}s. The function GetCha is a routine that makes use of CIOEqu.i. It is available in this data library under the filenames W}GETCHR.DOC and GETCHR.PAS. (CIOEQU.PAS should be renamed to CIOEQU.I after you download it.) 9 '98? :`;WL`; 9`#A ;_________CIO equates file__________ ; ;-->cio labels: ICCMD EQU $0342 ;command byte ICCOM EQU $0342 ;cover both bases ICSY}TA EQU $0343 ;status ICBAL EQU $0344 ;LSB for buffer ICBAH EQU $0345 ;MSB " " ICBLL EQU $0348 ;buffer length LSB ICBLH EQZ}U $0349 ; " " MSB ICAX1 EQU $034A ;auxillary byte one ICAX2 EQU $034B ; " " two CIOV EQU $E456 ;The big v[}ector! ; ;-->iocb numbers: iocb0 EQU $00 iocb1 EQU $10 iocb2 EQU $20 iocb3 EQU $30 iocb4 EQU $40 iocb5 EQU $50 iocb6 EQU $60\} iocb7 EQU $70 ; ;-->cio commands: open EQU $03 getrec EQU $05 getch EQU $07 putrec EQU $09 putch EQU $0B close EQU $0C statu]}s EQU $0 ; ;-->fms commands rename EQU $20 delete EQU $21 protect EQU $23 unprotect EQU $24 point EQU $25 note EQU $26 format^} EQU $FE ; ;-->S: display commands draw EQU $11 fill EQU $12 ; ;-->aux commands read EQU 4 conread EQU 5 readdir EQU 6 write _}EQU 8 append EQU 9 update EQU 12 conrw EQU 13 ; ;This is not an 'Omni-File'...Only the ;more commonly used CIO things are ;in`}cluded. You may add to it without ;any problems. # Ҡ9FKN6-$S .4(* CIOLib.i ________ (C) 1986 Erik C. Warren Routines to access CIO calls. Last Upb}dated: 30 July, 1986 These routines are in the public domain and may not be sold, except for the price of the software c}media, with- out the expressed, written permission of the author. *) FUNCTION Close(IOCB_Num: Inted}ger): Integer; BEGIN Close:= 1; IOCB_Num:= IOCB_Num * 16; #A stx _t ldy #7 lda (_sp),y ;IOCB tax lda #1e}2 ;close command sta $342,x jsr $e456 ;ciov tya ;same as icsta ldy #5 sta (_sp),y ;store in f}Close ldx _t # END;(* Close *) FUNCTION Open(IOCB_Num,Ax1,Ax2: Integer; VAR Dev: Device_String) g} : Integer; BEGIN Open:= 1; IOCB_Num:= IOCB_Num * 16; (* stack: opn num ax1 ax2 dev 5 13 h} 11 9 7 *) #A stx _t ldy #13 lda (_sp),y ;IOCB tax lda #3 ;open command sta $342,x dey dey i} ;11 lda (_sp),y ;icax1 sta $34a,x dey dey ;9 lda (_sp),y ;icax2 sta $34b,x dey ;8 j} lda (_sp),y ;dev MSB sta $345,x ;icbah dey ;7 lda (_sp),y ;icbal sta $344,x jsr $e456 ;ciov tya k} ;same as icsta ldy #5 sta (_sp),y ;store in Open ldx _t # END;(* Open *) FUNCTION Get_Byte(IOCB_Num: Intl}eger; VAR GB: Integer) : Integer; VAR TB: Integer; BEGIN TB:= 0; Get_Byte:= 1; m} GB:= 0; IOCB_Num:= IOCB_Num * 16; (* stack: get num gb tb 7/8 11/12 9/10 5/6 *) #A stx _t ldyn} #11 lda (_sp),y ;IOCB tax lda #7 ;get char command sta $342,x lda #$00 ;zero out the unused sta $348,o}x ;store in accumulator sta $349,x ;...after CIOV jump jsr $e456 sty _t+1 ;hold temporarily ldy #5 sta (_spp}),y ;put byte in GB lda _t+1 ;get status back ldy #7 sta (_sp),y ;store in Get_Byte ldx _t # GB:= TB END;(* q}Get_Byte *) FUNCTION Put_Byte(IOCB_Num: Integer; PB: Integer) : Integer; BEGINr} Put_Byte:= 1; IOCB_Num:= IOCB_Num * 16; (* stack: put num pb 5 9 7 *) #A stx _t s}ldy #9 lda (_sp),y ;IOCB tax lda #11 ;put char command sta $342,x lda #$00 ;zero out the unused sta $34t}8,x ;put from accumulator sta $349,x ldy #7 lda (_sp),y ;put PB in accumulator jsr $e456 tya ;same as iu}csta ldy #5 sta (_sp),y ;store in Put_Byte ldx _t # END;(* Put_Byte *) ++ $&$ + +++ ! + >:Q(* FILELIB.I - Routines to allow the use of standard ATARI I/O calls in KYAN Pascal programs. FileOpen - Exactly liw}ke the ATARI Basic OPEN command. FileClose - Exactly like the ATARI Basic CLOSE command. FileGet - Replace the pax}rameters REC and RECLEN with the name and length of your record and this routine will read one record from ty}he file. FileGetChar - Reads one character from the file. FilePut - The inverse of FileGet. Filz}ePutChar - The inverse of FileGetChar. FileNote - Exactly like the ATARI Basic NOTE command. FilePoint - Exactly l{}ike the ATARI Basic POINT command. I don't recommend that you mix these routines with the standard Pascal I/O routines|}. They were written for use in a small database program that DEMANDED true random access files. Use them with care as no}}ne of the protection provided by Pascal is present here. *)Procedure FileOpen(IOCBnum,IOdir~},Auxbyte : Integer; Var FileName : String15);Begin#aICHID EQU $0340ICDNO EQU $0341ICCMD EQU $0342I}CSTA EQU $0343ICBAL EQU $0344ICBAH EQU $0345ICPTL EQU $0346ICPTH EQU $0347ICBLL EQU $0348ICBLH EQU $0349ICAX1 EQU $034}AICAX2 EQU $034BICAX3 EQU $034CICAX4 EQU $034DICAX5 EQU $034EICAX6 EQU $034FCIOV EQU $E456; _T = LSB of ^FileName}; _T+1 = MSB of ^FileName; _T+2 = LSB of AuxByte; _T+3 = MSB of AuxByte (Unused); _T+4 = LSB of IOdir; _T+5 = MSB of IOd}ir (Unused); _T+6 = LSB of IOCBnum; _T+7 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX }#7 ;Copy heap LDY #12CL1 LDA (_SP),Y STA _T,X DEY DEX BPL CL1 LDA _T+6 ;Get IOC}B # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #3 } ;Open command STA ICCMD,X LDA _T ;Filename address STA ICBAL,X LDA _T+1 STA ICBAH,X} LDA _T+4 ;Data direction STA ICAX1,X LDA _T+2 ;Aux byte STA ICAX2,X JSR CIOV ;Do t}he I/O PLA ;Restore X register TXA#End; (* FileOpen *)Procedure FileClose(IOCBnum : Integer);Beg}in#a; _T = LSB of IOCBnum; _T+1 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #1 } ;Copy heap LDY #6CL2 LDA (_SP),Y STA _T,X DEY DEX BPL CL2 LDA _T ;Get IOCB # } ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #12 } ;Close command STA ICCMD,X JSR CIOV ;Do the I/O PLA ;Restore X register TAX#End; (*} FileClose *)Procedure FileGet(IOCBnum : Integer; Var Rec : RecType; RecLen : Integer});Begin#a; _T = LSB of RecLen; _T+1 = MSB of RecLen; _T+2 = LSB of ^Rec; _T+3 = MSB of ^Rec; _T+4 = LSB of IOCBnum}; _T+5 = MSB of IOCBnum (Unused) TXA ;Saved X register PHA LDX #5 ;Copy heap LDY #10}CL3 LDA (_SP),Y STA _T,X DEY DEX BPL CL3 LDA _T+4 ;Get IOCB # ASL A ;Multiply }by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #7 ;Get record command S}TA ICCMD,X LDA _T+2 ;Data address STA ICBAL,X LDA _T+3 STA ICBAH,X LDA _T ;Data length} STA ICBLL,X LDA _T+1 STA ICBLH,X JSR CIOV ;Do the I/O PLA ;Restore X register } TAX#End; (* FileGet *)Procedure FileGetChar(IOCBnum : Integer; Var Byte : Char);Begin#a; _T} = LSB of ^Byte; _T+1 = MSB of ^Byte; _T+2 = LSB of IOCBnum; _T+3 = MSB of IOCBnum TXA ; Save X registe}r PHA LDX #3 ; Copy heap LDY #8CL4 LDA (_SP),Y STA _T,X DEY DEX BPL CL4 LDA} _T+2 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X r}egister LDA #7 ;Get Record command STA ICCMD,X LDA #0 ;Single byte get STA ICBLL,X S}TA ICBLH,X JSR CIOV ;Do the I/O LDY #0 ;Store the byte in STA (_T),Y ; 'Byte' PLA } ;Restore X register TAX#End; (* FileGetChar *)Procedure FilePut(IOCBnum : Integer; Var Re}c : RecType; RecLen : Integer);Begin#a; _T = LSB of RecLen; _T+1 = MSB of RecLen; _T+2 = LSB of ^}Rec; _T+3 = MSB of ^Rec; _T+4 = LSB of IOCBnum; _T+5 = MSB of IOCBnum TXA ;Save X register PHA }LDX #5 ;Copy heap LDY #10CL5 LDA (_SP),Y STA _T,X DEY DEX BPL CL5 LDA _T+4 ;Get} IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA} #11 ;Put record command STA ICCMD,X LDA _T+2 ;Data address STA ICBAL,X LDA _T+3 STA IC}BAH,X LDA _T ;Data length STA ICBLL,X LDA _T+1 STA ICBLH,X JSR CIOV ;Do the I/O P}LA ;Restore X register TAX#End; (* FilePut *)Procedure FilePutChar(IOCBnum : Integer; } Byte : Char);Begin#a; _T = Byte; _T+1 = LSB of IOCBnum; _T+2 = MSB of IOCBnum TXA ; Save X reg}ister PHA LDX #3 ; Copy heap LDY #8CL6 LDA (_SP),Y STA _T,X DEY DEX BPL CL6 } LDA _T+1 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to} X register LDA #11 ;Put Record command STA ICCMD,X LDA #0 ;Single byte put STA ICBLL,X } STA ICBLH,X LDA _T ;Put Byte in ACC JSR CIOV ;Do the I/O PLA ;Restore X register } TAX#End; (* FilePutChar *)Procedure FileNote(IOCBnum : Integer; Var Sector,Byte : Integer);Beg}in#a; _T = LSB of ^Byte; _T+1 = MSB of ^Byte; _T+2 = LSB of ^Sector; _T+3 = MSB of ^Sector; _T+4 = LSB of IOCBnum; }_T+5 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #5 ;Copy heap LDY #10CL7} LDA (_SP),Y STA _T,X DEY DEX BPL CL7 LDA _T+4 ;Get IOCB # ASL A ;Multiply by 1}6 ASL A ASL A ASL A PHA ;Save for later TAX ;Move to X register LDA #38 } ;Note command STA ICCMD,X JSR CIOV ;Do the I/O PLA ;Get IOCB # X 16 TAX } ;Move to X register LDY #0 LDA ICAX5,X ;Get LSB of Byte STA (_T),Y LDA ICAX3,X ;Get LSB of Sector} STA (_T+2),Y INY LDA #0 ;MSB of Byte STA (_T),Y LDA ICAX4,X ;Get MSB of Sector STA (}_T+2),Y PLA ;Restore X register TAX#End; (* FileNote *)Procedure FilePoint(IOCBnum,Sector,Byte : I}nteger);Begin#a; _T = LSB of Byte; _T+1 = MSB of Byte (Unused); _T+2 = LSB of Sector; _T+3 = MSB of Sector; _T+4 =} LSB of IOCBnum; _T+5 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #5 ;Copy hea}p LDY #10CL8 LDA (_SP),Y STA _T,X DEY DEX BPL CL8 LDA _T+4 ;Get IOCB # ASL A } ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #37 ;Point comma}nd STA ICCMD,X LDA _T+2 ;LSB of Sector STA ICAX3,X LDA _T+3 ;MSB of Sector STA ICAX4,X } LDA _T ;LSB of Byte STA ICAX5,X JSR CIOV ;Do the I/O PLA ;Restore X register } TAX#End; (* FilePoint *)````````````````````````````````̠ӛZZ6.Phhhhhhhؠ ͑i=1000 .TITLE "CX85 NUMERIC KEYPAD HANDLER - Mac65 version" 1010 .PAGE "Dissasembled by Rich Andrews, Lockport, Il." }1020 ; 1030 ;There was no copyright notice in the original 1040 ; code but one must assume it is public domain 1050 ;and w }as probably written by Atari Inc. 1060 ;(no one else would have bothered!) 1070 ;once called by Basic do not call again 10 }80 ; 1090 ; 1100 .PAGE "CX-85 EQUATES" 1110 ;****************************** 1120 ;System equates used 1130 ;******** }********************** 1140 ATRACT = $4D 1150 VVBLKD = $0224 1160 STRIG0 = $0284 1170 STRIG1 = $0285 1180 CH = $02FC } 1190 ALLPOT = $D208 1200 PORTA = $D300 1210 SETVBV = $E45C 1220 XITVBV = $E462 1230 ; 1240 ;*************************** }** 1250 ;End of system equates 1260 ;***************************** 1270 ;The following is the keycode 1280 ;equates which } are from CH. As 1290 ;per the Atari hardware manual. 1300 ;***************************** 1310 ; 1320 ; 1330 ESC = $1C } 1340 SPC = $21 1350 DEL = $34 1360 Y = $2B 1370 ZERO = $32 1380 ONE = $1F 1390 TWO = $1E 1400 THREE = $1 }A 1410 FOUR = $18 1420 FIVE = $1D 1430 SIX = $1B 1440 SEVEN = $33 1450 EIGHT = $35 1460 NINE = $30 1470 PERIOD = }$22 1480 MINUS = $0E 1490 CR = $0C 1500 ; 1510 .PAGE "CX-85 HANDLER INSTALLATION ROUTINE" 1520 ;***************** }************* 1530 ;This is the start of the installation routine 1540 ;****************************** 1550 ; 1560 ; 157 }0 .ORG $7F00 ;Start code just below GR.0 screen. 1580 PLA ;This routine is to be called by basic hence the }PLA 1590 ;Remove the PLA instruction for a stand alone file 1600 LDA VVBLKD ;Call with X=USR(32512) 1610 ;The install }ation routine could also be a M/L string with the rest 1620 ;of the code previously loaded in via DOS. 1630 STA EXIT+1 } 1640 LDA VVBLKD+1 1650 STA EXIT+2 1660 LDY # VBICODE 1680 LDA #$07 ;Command }to reset vbi pointers. 1690 JSR SETVBV ;Install vbi routine into interrupt chain. 1700 RTS ;Return to call }er. 1710 .PAGE "CX85 HANDLER LOOKUP TABLE" 1720 ;****************************** 1730 LOOKUP ; This is the looku }p table. This portion can be located 1740 ;in a different area in memory than the Main routine or the 1750 ;installation r }outine. 1760 ;****************************** 1770 .BYTE $0C,ESC 1780 .BYTE $14,SPC,$10,DEL,$18,Y 1790 .BYTE $ }1C,ZERO,$19,ONE,$1A,TWO 1800 .BYTE $1B,THREE,$11,FOUR,$12 1810 .BYTE FIVE,$13,SIX,$15,SEVEN 1820 .BYTE $16,EIG }HT,$17,NINE,$1D 1830 .BYTE PERIOD,$1F,MINUS,$1E 1840 .BYTE CR 1850 BRK ;End of table delimiter 1860 ; }***************************** 1870 ;By changing the table one could define 1880 ;the keys on the CX85 to mean anything! 18 }90 ;How about some new functions to be accessed 1900 ;through a wedge of some sort? Terminal 1910 ;program phone dialer? }Maybe a bookkeeping 1920 ;program? As long as it is a printable 1930 ;character it will work. Rich A. 1940 .PAGE "CX-8 }5 HANDLER MAIN VBI ROUTINE" 1950 ;***************************** 1960 ;The vbi routine starts here. 1970 ;***************** }************ 1980 ;This portion can be located anywhere in memory. 1990 ;***************************** 2000 VBICODE 2010 } LDA STRIG1 ;trigger pressed? 2020 BNE SET2BYE ;no-go clr buffer #2+exit. 2030 LDA #$00 2040 STA ATRACT ; }kill attract mode 2050 LDA PORTA ;lets get some bits 2060 LSR A ;divide by 2 2070 LSR A ;divide }it again 2080 LSR A ;ditto 2090 LSR A ;one more time (Sam?) 2100 STA BUFR1 ;now stuff it in buff }er 1 2110 LDA ALLPOT ;read all the pot lines 2120 AND #$08 ;if it is >=8,then make it 0 2130 EOR #$08 ; }if it is <8 then make it 8 2140 ASL A ;times 2 2150 ORA BUFR1 2160 LDY #$00 2170 ;********************* }********** 2180 FINDIT 2190 CMP LOOKUP,Y 2200 BEQ FOUND 2210 INY 2220 INY 2230 LDX LOOKUP,Y 2240 } BEQ EXIT 2250 BNE FINDIT 2260 ;****************************** 2270 FOUND 2280 TAX 2290 INY 2300 }LDA LOOKUP,Y 2310 CMP BUFR2 2320 BEQ PUTCHR 2330 STA BUFR2 2340 STA CH 2350 LDA #$30 2360 STA B }UFR3 2370 BNE EXIT ;always exit 2380 ;****************************** 2390 SET2BYE 2400 LDA #$C0 ;when trig1 } is not pressed 2410 STA BUFR2 ;read will come back with $C0 2420 BNE EXIT ;always exit 2430 ;*************** }*************** 2440 PUTCHR 2450 LDX BUFR3 2460 DEX 2470 BNE SET3BYE 2480 STA CH 2490 LDA #$06 25 }00 STA BUFR3 2510 BNE EXIT 2520 ;********************* 2530 SET3BYE 2540 STX BUFR3 2550 ;******************* }** 2560 EXIT 2570 JMP XITVBV ;see you next vbi 2580 ;********************* 2590 BUFR1 2600 .DS 1 ;reserve } 1 byte 2610 ;********************* 2620 BUFR2 2630 .DS 1 ;reserve 1 byte 2640 ;********************* 2650 BUF }R3 2660 .DS 1 ;reserve 1 byte 2670 ;********************* 2680 .END 2690 ;The original key layout is as 2 }700 ;follows 2710 ;----------------------- 2720 ; | 2730 ;  7 8 9 - | 2740 ; N 4 5 6 } r | 2750 ; 1 2 3 e | 2760 ; Y 0 . t | 2770 ; | 2780 ;------------- }----------  !"#$%@&@' 100 REM <<< PERCOM DISK CONTROL >>> 105 REM <<< SAMPLE PROGRAM >>> 110 REM REVISED TO WORK W/2 DRIVE SYS. 120 DIM BUF$}$(12):REM OPTION TABLE 125 DIM R$(1):REM RESPONSES GO HERE 130 Z=ADR(" ") 140 DATA 104,76,89,228 150 FOR I=0 TO 3 160$} READ X 170 POKE Z+I,X 180 NEXT I 190 DCB=768 200 DATA 49,1,78,64,0,0,1,0,12,0,1,0 210 REM DEVICE,UNIT,COMMAND,STATUS(DI$}R), 220 REM BUFFER ADDR,TIMEOUT,SECTOR ADDR 230 FOR I=0 TO 11:REM BUILD THE DCB 240 READ X 250 POKE DCB+I,X 260 NEXT I $}270 A=ADR(BUF$):REM INSERT BUFFER ADDRESS 280 X=INT(A/256) 290 POKE DCB+5,X 300 POKE DCB+4,A-X*256 301 SETCOLOR 4,9,4:? "$}}":? :? 302 PRINT "DRIVE NUMBER";:INPUT I 304 POKE DCB+1,I:REM SET DRIVE IN DCB 310 X=USR(Z):REM READ THE OPTION TABLE 3$}20 PRINT "DRIVE NUMBER OF TRACKS=";PEEK(A) 330 PRINT "DRIVE STEP RATE CODE=";PEEK(A+1) 340 PRINT "DRIVE SECTORS/TRACK=";PEE$}K(A+3) 350 PRINT PEEK(A+4)+1;" SIDED DRIVE" 360 IF PEEK(A+5)=0 THEN PRINT "SINGLE DENSITY":GOTO 380 370 IF PEEK(A+5)=4 THE$}N PRINT "DOUBLE DENSITY" 380 PRINT PEEK(A+6)*256+PEEK(A+7);" BYTES/SECTOR" 390 PRINT 400 PRINT "Make it single (S) or dou$}ble (D)" 410 PRINT " density";:INPUT R$ 420 IF ASC(R$)=ASC("D") THEN 470 430 POKE A+5,0:REM MAKE SINGLE DENSITY 440 POKE$} A+6,0 450 POKE A+7,128 455 POKE 4880+I,1:REM PATCH TO CTRL D2 460 GOTO 500 470 POKE A+5,4:REM MAKE DOUBLE DENSITY 480 P$}OKE A+6,1 490 POKE A+7,0 495 POKE 4880+I,2:REM PATCH TO CTRL D2 500 POKE DCB+3,128:REM SET DIRECTION FOR WRITE 510 POKE D$}CB+2,79:REM SET COMMAND (WRITE OPTION) 520 X=USR(Z):REM UPDATE DRIVE OPTIONS 530 END 100 REM <<< PERCOM DISK CONTROL >>> $} 105 REM <<< SAMPLE PROGRAM >>> 110 REM REVISED TO WORK W/2 DRIVE SYS. 120 DIM BUF$(12):REM OPTION TABLE 125 DIM R$(1$}):REM RESPONSES GO HERE 130 Z=ADR(" ") 140 DATA 104,76,89,228 150 FOR I=0 TO 3 160 READ X 170 POKE Z+I,X 180 NEXT I $} 190 DCB=768 200 DATA 49,1,78,64,0,0,1,0,12,0,1,0 210 REM DEVICE,UNIT,COMMAND,STATUS(DIR), 220 REM BUFFER ADDR,TIMEOUT,SEC$}TOR ADDR 230 FOR I=0 TO 11:REM BUILD THE DCB 240 READ X 250 POKE DCB+I,X 260 NEXT I 270 A=ADR(BUF$):REM INSERT BUFFER AD$}DRESS 280 X=INT(A/256) 290 POKE DCB+5,X 300 POKE DCB+4,A-X*256 301 SETCOLOR 4,9,4:? "}":? :? 302 PRINT "DRIVE NUMBER";:$}INPUT I 304 POKE DCB+1,I:REM SET DRIVE IN DCB 310 X=USR(Z):REM READ THE OPTION TABLE 320 PRINT "DRIVE NUMBER OF TRACKS=";P$}EEK(A) 330 PRINT "DRIVE STEP RATE CODE=";PEEK(A+1) 340 PRINT "DRIVE SECTORS/TRACK=";PEEK(A+3) 350 PRINT PEEK(A+4)+1;" SIDE$}D DRIVE" 360 IF PEEK(A+5)=0 THEN PRINT "SINGLE DENSITY":GOTO 380 370 IF PEEK(A+5)=4 THEN PRINT "DOUBLE DENSITY" 380 PRINT $}PEEK(A+6)*256+PEEK(A+7);" BYTES/SECTOR" 390 PRINT 400 PRINT "Make it single (S) or double (D)" 410 PRINT " density";:INP$}UT R$ 420 IF ASC(R$)=ASC("D") THEN 470 430 POKE A+5,0:REM MAKE SINGLE DENSITY 440 POKE A+6,0 450 POKE A+7,128 455 POKE 4$}880+I,1:REM PATCH TO CTRL D2 460 GOTO 500 470 POKE A+5,4:REM MAKE DOUBLE DENSITY 480 POKE A+6,1 490 POKE A+7,0 495 POKE $}4880+I,2:REM PATCH TO CTRL D2 500 POKE DCB+3,128:REM SET DIRECTION FOR WRITE 510 POKE DCB+2,79:REM SET COMMAND (WRITE OPTIO$}N) 520 X=USR(Z):REM UPDATE DRIVE OPTIONS 530 END  $Π堪((((Z$5FUNCTION Frac(Num : Real) : Real; (* by Erik C. Warren, 13 January, 1986 for UPDATE...KYAN's Jan./Feb. issue *) BEGIN F(}rac := Num - Trunc(Num) END; (* Frac *) 'AB@*&AB@$##Ҡ(((FUNCTION GetChar(VAR Key : Char; Wr : Boolean): Integer; (* by Erik Warren *) BEGIN GetChar := 1;(* Keep ISO happy *) #A -} STX _t ;hold X temporarily GC EQU 5 ;MSB 6 Wr EQU 7 ;this is _sp stuff Key EQU 8 ;MSB 9 LDY #Ke-}y ;stack pointer offset LDA (_sp),y ;pull from stack STA _t+1 ;...and store temp. INY ;do same f-}or MSB LDA (_sp),y STA _t+2 LDX #iocb1 LDA #close STA iccmd,x JSR ciov ;jump and close IOCB LDA #open STA iccm-}d,x LDA #read ;open for read only STA icax1,x LDA #$00 ;zero out auxillary two STA icax2,x LDA #>GC.Name ;LS-}B put in buffer STA icbal,x ;...pointer for CIO LDA #:@Q,>:@,6-%A$@@-@96-%%-@A00 REM Diskette Label Maker for the C.Itoh Prowriter 1 REM By John Snell 1/18/83 2 ? "}" 5 DIM NAME$(13),ANSWER$(1),DNAME$(5}135),MARGIN$(3) 6 LN=1:MARGIN$="000" 25 ? "Do you wish to give this diskette a special name";:INPUT ANSWER$ 30 IF ANSWER5}$="Y" OR ANSWER$="y" THEN 100 35 OPEN #1,6,0,"D:*.*" 40 TRAP 90:INPUT #1;NAME$ 60 IF NAME$(11,13)="SYS" OR NAME$(11,13)="S5}AV" OR NAME$(11,13)="CAT" THEN 40 61 IF NAME$(3,6)="MENU" THEN 40 62 IF NAME$(5,8)="FREE" THEN 90 70 LPRINT CHR$(27);CHR$(5}81);CHR$(27);CHR$(76);MARGIN$;NAME$:LN=LN+1 80 IF LN=5 THEN MARGIN$="016":GOSUB 200 81 IF LN=9 THEN MARGIN$="032":GOSUB 2005} 82 IF LN=13 THEN MARGIN$="048":GOSUB 200 83 IF LN=17 THEN MARGIN$="064":GOSUB 200 84 IF LN=21 THEN GOSUB 1000 85 IF LN<25}1 THEN GOTO 40 86 ? "Advance Printer to Next Label, Hit ANY KEY When Ready" 87 LN=0:POKE 764,255 88 IF PEEK(764)=255 THEN 5}GOTO 88 89 GOTO 40 90 CLOSE #1:ANSWER$="Q":POKE 764,255:? "Want to do another one";:INPUT ANSWER$ 91 IF ANSWER$="Y" OR ANS5}WER$="y" THEN RUN 92 END 100 INPUT DNAME$ 102 GOSUB 1000 110 LPRINT CHR$(27);CHR$(81);CHR$(27);CHR$(88);DNAME$;CHR$(27)5};CHR$(34);CHR$(27);CHR$(89) 120 GOTO 35 200 LPRINT CHR$(27);CHR$(91);CHR$(27);CHR$(114):LPRINT :LPRINT :LPRINT :LPRINT :LPR5}INT CHR$(27);CHR$(102);CHR$(27);CHR$(93) 210 RETURN 1000 MARGIN$="000" 1001 LPRINT CHR$(27);CHR$(81);CHR$(27);CHR$(76);MA5}RGIN$:RETURN 堪A`Aa@@9A @&'A9A410 REM PROGRAM LISTER 20 REM BY DANA NOONAN 30 REM COPYRIGHT 1982 40 REM SET-UP PROGRAM 50 DIM A$(500),F$(15),B$(20),R$(49!}),L$(12),Y$(1),D$(20),S$(30) 60 B$=" ":R$="REM " 70 OPEN #2,4,0,"K:":GOSUB 650 80 CLOSE #2:PK=PEEK(559):POKE 559"}9,0 90 TRAP 720:OPEN #1,4,0,F$:OPEN #4,8,0,"P:":INPUT #1;A$ 100 ? #4;CHR$(T);B$;F$;B$(7);"PAGE ";PG;B$(7);D$:? #4:? #4 1109#} ? #4;B$;"| | = Inverse";B$(7);"[ ] = Control";B$(7);"< > = Control Inverse":? #4:L=5:PG=PG+1:GOTO 140 120 REM GET DATA 1309$} TRAP 720:INPUT #1,A$ 140 C=LEN(A$):RF=0:QF=0:S=0:LL=65*(T=18)+120*(T=15) 150 REM CHECK REMS, QUOTES, AND LINE NUMBERS 1609%} FOR I=1 TO C:A=ASC(A$(I,I)) 170 IF A=34 OR A>159 THEN QF=1:GOTO 190 180 NEXT I 190 FOR N=2 TO 6:IF ASC(A$(N))<>32 THEN NE9&}XT N 200 TRAP 210:IF A$(N+1,N+4)<>R$ THEN RF=1:TRAP 40000 210 IF RF=0 THEN ? #4:L=L+1 220 S=6-N:? #4;B$(12-S);CHR$(158);A$9'}(1,N);" ";:N=N+1 230 IF QF=0 AND C(LL+7) THEN ? #4;CHR$(155);B$(5);:L=L+1:LL=LL+65*(T=18)+120*(T=15) 300 IF A>31 AND A<125 THEN 560 310 9)}IF A>159 AND A<254 THEN 490 320 IF A>127 AND A<155 THEN 430 330 IF A<27 THEN 460 340 RESTORE 350 READ D,DL,L$ 360 IF D<9*}>A THEN GOTO 350 365 IF (II+DL)>(LL+7) THEN ? #4;CHR$(155);B$(5);:L=L+1:LL=LL+65*(T=18)+120*(T=15) 370 ? #4;"[";L$;"]";:II=9+}II+DL:NEXT I 380 DATA 27,8,ESCAPE,28,4,UP,29,6,DOWN,30,6,LEFT,31,7,RIGHT 390 DATA 125,7,CLEAR,126,10,BACK SPACE,127,5,TAB 9,}400 DATA 156,13,DELETE LINE,157,13,INSERT LINE,158,11,CLEAR TAB,159,9,SET TAB 410 DATA 253,6,BELL,254,8,DELETE,255,8,INSERT 9-} 420 REM INVERSE CONTROL CHARACTERS 430 IF A=128 THEN ? #4;"<,>";:II=II+3:NEXT I 440 A=A-64:? #4;"<";CHR$(A);">";:II=II+2:N9.}EXT I 450 REM CONTROL CHARACTERS 460 IF A=0 THEN ? #4;"[,]";:II=II+3:NEXT I 470 A=A+64:? #4;"[";CHR$(A);"]";:II=II+2:NEXT 9/}I 480 REM INVERSE NORMAL CHARACTERS 490 IF A=253 THEN ? #4;"<;>";:II=II+3:NEXT I 500 A=A-128:? #4;"|";CHR$(A);:II=II+2 5190}0 TRAP 540:I=I+1:II=II+1:A=ASC(A$(I,I)):IF II>(LL+7) THEN ? #4;CHR$(155);B$(5);:L=L+1:LL=LL+65*(T=18)+120*(T=15) 520 IF A>1591}9 AND A<253 THEN A=A-128:? #4;CHR$(A);:GOTO 510 530 ? #4;"|";:II=II+1:GOTO 295 540 TRAP 830:? #4;"|";:? #4:L=L+1:GOTO 590 92}550 REM PRINT LINE AND GET NEXT ONE 560 IF A=96 THEN ? #4;"[.]";:II=II+2:NEXT I 570 IF A=123 THEN ? #4;"[;]";:II=II+2:NEXT 93}I 580 ? #4;CHR$(A);:NEXT I:? #4 590 L=L+1:IF L<60 THEN GOTO 130 600 FOR NN=1 TO 6-(L-60):? #4:NEXT NN 610 ? #4;B$;F$;B$(794});"PAGE ";PG:? #4:? #4:PG=PG+1:L=3:GOTO 130 620 REM END 630 ? #4:POKE 559,PK:GRAPHICS 0:POSITION 12,8:? "COPY COMPLETE":CLO95}SE #1:CLOSE #4:CLR :END 650 GRAPHICS 0:? :? " PROGRAM LISTER" 660 ? :? :? " ENTER FILE NAME:";:INPUT F$ 665 IF F96}$(2,2)<>":" OR F$(3,3)<>":" THEN D$(20)=" ":D$(2)=D$ 670 ? :? " DATE";:INPUT D$ 680 ? :? " SOURCE";:INPUT S$ 690 ? :? 97}" CONDENSED PRINT (Y OR N)";:INPUT Y$:IF Y$<>"Y" AND Y$<>"N" THEN GOTO 690 700 IF Y$="Y" THEN T=15:LL=120:PG=1:RETURN 7198}0 IF Y$="N" THEN T=18:LL=65:PG=1:RETURN 720 REM ERROR TRAPPING 730 IF PEEK(195)=136 THEN 620 740 TRAP 830:CLOSE #1:CLOSE 99}#4:POKE 559,PK:OPEN #2,4,0,"K:" 750 IF PEEK(195)=170 THEN 790 760 IF PEEK(195)=138 THEN 810 770 ? CHR$(125):POSITION 7,10:9:}? "CANNOT PRINT THIS LISTING" 780 POSITION 7,12:? "PRESS RETURN TO TRY AGAIN":GET #2,Q:CLR :RUN 790 IF PEEK(195)=170 THEN 9;}? CHR$(125):POSITION 10,10:? "NO FILE BY THAT NAME" 800 POSITION 7,12:? "PRESS RETURN TO TRY AGAIN":GET #2,Q:CLR :RUN 810 9<}? CHR$(125):POSITION 5,10:? "CHECK PRINTER AND PRESS RETURN":GET #2,Q:GOTO 80 820 ? #4;">";:LN=LN-1:GOTO 300 I@LVCe8o0 REM ******************************* 1 REM * FROM 'COMPUTE!'S SECOND BOOK* 2 REM * OF ATARI.' THIS PGM WILL * 3 REM * =>}PUT A MENU ON THE SCREEN & * 4 REM * LOAD BINARY DOS FILES FROM * 5 REM * BASIC. COMBINED WITH THE * 6 REM * 'AUTORN.=?}ATR' IT MAKES A NICE* 7 REM * SYSTEM FOR YOUNG CHILDREN TO* 8 REM * PICK A PROGRAM AND RUN IT. * 9 REM ******************=@}************* 10 REM LOADIT DEMO MENU 20 REM BY ROBERT E. ALLEGER 30 DIM LINE$(15),DIR$(12*64),DRIVE$(3) 40 REM * INITIAL=A}IZATION * 50 GRAPHICS 0:POKE 752,1 60 DRIVE$="D1:" 70 ? ,"MENU FOR DRIVE ";DRIVE$:? 80 GOSUB 5000:REM STORE LOADIT.OBJ =B}90 LINE$=DRIVE$:LINE$(4)="*.*" 100 DIR$(1,1)=" ":DIR$(12*64)=" " 110 DIR$(2)=DIR$ 120 CLOSE #1:OPEN #1,6,0,LINE$ 130 TRAP=C} 380:ENTRY=1:LINEFLAG=1 140 REM * READ THE DIRECTORY * 150 FOR FILENUMBER=1 TO 64 160 INPUT #1,LINE$ 170 IF LINE$(2,2)<>"=D} " THEN 380 180 PD=ENTRY 190 REM * SCAN FILE NAME * 200 FOR PS=3 TO 10 210 IF LINE$(PS,PS)=" " THEN 240 220 DIR$(PD,PD=E})=LINE$(PS,PS) 230 PD=PD+1:NEXT PS 240 REM * CHECK FOR EXTENSION * 250 IF LINE$(11,11)=" " THEN 320:REM NO EXTENSION 260 =F}DIR$(PD,PD)=".":REM APPEND DOT 270 PD=PD+1 280 REM * SCAN FILE EXTENSION * 290 FOR PS=11 TO 13 300 DIR$(PD,PD)=LINE$(PS,P=G}S) 310 PD=PD+1:NEXT PS 320 REM * DISPLAY FILE NAME.EXT * 330 IF LINEFLAG=3 THEN PRINT :LINEFLAG=1 340 IF FILENUMBER<10 TH=H}EN PRINT " "; 350 ? FILENUMBER;" ";DIR$(ENTRY,ENTRY+11);" "; 360 LINEFLAG=LINEFLAG+1 370 ENTRY=ENTRY+12:NEXT FILENUMBER =I}380 REM * CHOOSE ONE * 390 PRINT :? "ENTER NUMBER OF FILE TO LOAD: "; 400 TRAP 390:INPUT N 410 IF N<1 OR N>FILENUMBER-1 TH=J}EN 390 420 LINE$=DRIVE$ 430 LINE$(4)=DIR$(N*12-11,N*12) 440 GRAPHICS 0:POSITION 2,10 450 ? " LOADING ";LINE$ 460 R=K}EM * SEE IF MACHINE LANGUAGE * 470 FOR PS=4 TO 12 480 IF LINE$(PS,PS+3)=".OBJ" THEN 540 490 NEXT PS 500 REM * LOAD BASIC =L}PROGRAM 510 TRAP 530 520 RUN LINE$ 530 ERROR=PEEK(195):GOTO 560 540 REM * LOAD M.L. PROGRAM * 550 ERROR=USR(1536,ADR(LIN=M}E$)) 560 REM * SHOULDN'T BE HERE !! * 570 ? "ERROR #";ERROR;" ENCOUNTERED DURING LOAD" 580 END 5000 FOR A=1536 TO 1717:R=N}EAD B:POKE A,B:NEXT A 5001 DATA 162,16,32,173,6,134,207,104,104,157,69,3,104,157,68,3,169,4,157,74,3,169,3,157,66 5002 DATA=O} 3,32,86,228,16,3,76,166,6,169,203,157,68,3,169,0,157,69,3,169,2,157,72,3,169 5003 DATA 0,157,73,3,169,7,157,66,3,32,86,228,=P}16,6,192,136,240,92,208,96,169,255,197,203,208 5004 DATA 4,197,204,240,210,169,205,157,68,3,169,0,157,69,3,32,86,228,16,2,48=Q},69,165,207,240 5005 DATA 14,165,203,141,224,2,165,204,141,225,2,169,0,133,207,165,203,157,68,3,165,204,157,69,3 5006 DATA =R}165,205,56,229,203,157,72,3,165,206,229,204,157,73,3,254,72,3,208,3,254,73,3,32,86 5007 DATA 228,16,137,192,3,240,133,76,166=S},6,32,173,6,108,224,2,152,133,212,169,0,133,213,169,12 5008 DATA 157,66,3,32,86,228,96 5009 RETURN Uh**("}And now, <g0100 .OPT NUM 0110 .TITLE "Null Device Handler" 7/31/86 0120 ; 0130 ; 0140 ; 0150 ; AU} (C) 1986 by Paul B. Loux 0160 ; 0170 ; Permission is granted to 0180 ; distributAV}e on a non-profit 0190 ; basis provided that this 0200 ; header remains. 0210 ; 0220 AW} ; 0230 ; Null Device handler, installs 0240 ; a device "N:" into the device 0250 ; AX} handler table. The null device 0260 ; is a no-op handler useful for 0270 ; for debuggiAY}ng I/O routines. 0280 ; It always returns a status 0290 ; of "1" (no error), and the 0300 AZ}; Accumulator is loaded with 0310 ; $9B (return) to facilitate 0320 ; record I/O throA[}ugh CIO. The 0330 ; handler supports all CIO and 0340 ; XIO command types, and 0350 ; A\} occupies only 82 bytes. It 0360 ; protects itself from RESET. 0370 ; 0380 ; 0390 ; A]} 0400 ; System Equates 0410 ; ______________ 0420 ; 0430 DOSVEC = $0A 0440 DOSINI =A^} $0C 0450 SPBYT1 = $CB 0460 SPBYT2 = $CC 0470 RUNAD = $02E0 0480 INITAD = $02E2 0490 SAFETY = $02F5 0500 MEMLO = $02E7 A_} 0510 HATABS = $031A 0520 COLDSV = $E477 0530 ; 0540 ; 0550 ; Re-install Code 0560 ; A`} _______________ 0570 ; 0580 ; (keep RESET-proof) 0590 ; 0600 *= $1EA1 0610 STARTAa} 0620 JSR $FFFF 0630 SETVEX 0640 LDA # MEMADJ 0670 STA MEMLO+1 Ab}0680 LDA #$FF 0690 STA SAFETY 0700 ; 0710 ; 0720 ; Vector setup 0730 ; Ac} ____________ 0740 ; 0750 NSETUP 0760 LDA #'N 0770 STA TEMP 0780 LDX #$00 0790 SERCH 0800 LDAAd} HATABS,X 0810 CMP TEMP 0820 BEQ FOUND 0830 CMP #$00 0840 BEQ FOUND 0850 INX 0860 INX 0870 Ae} INX 0880 BNE SERCH 0890 RTS ; Error 0900 FOUND 0910 LDA #'N 0920 STA HATABS,X 0930 LDA Af}# NDRIVER+1 0960 STA HATABS+2,X 0970 RTS 0980 ; 0990 Ag} ; N: Vector Table 1000 ; _______________ 1010 ; 1020 NDRIVER 1030 .WORD NOPEN-1 ; OAq}?B8QUEEN PASBBASIC ASMB/BUSYBU M65BECENTER PASB MCIOEQU DOCB XCIOEQU PASBaCIOLIB PASB@vCIOPAS XMOB-CX85 M65BDSKCTR ATRBFRAC PASB GETCHR PASB HANOI PASB LABLR ATRB LISTER ATRB=LOADIT ATRBTNULL2 M65B |PCOPY ATRB PRINTF PASB1QSET ASMBXRAM14K ASMB /RDEFML M65B9RPMCHK ATRB HSCOFF ASMBQSET ASMBoSIOFIX ASMBSTAUT2 ATRBSTRUTI PASB WEDGE ATRpen 1040 .WORD NCLOS-1 ; Close 1050 .WORD NGETC-1 ; Read 1060 .WORD NPUTC-1 ; Write 1070 .WORD NSTAT-1 ; Ar}Status 1080 .WORD NSPEC-1 ; Special 1090 .BYTE $4C 1100 .WORD NINIT ; Init 1110 ; 1120 NOPEN ; As} All no-ops 1130 NCLOS 1140 NGETC 1150 NPUTC 1160 NSTAT 1170 NSPEC 1180 NINIT 1190 LDA #$9B ; EOL 1200 LDAt}Y #$01 ; Success flag 1210 RTS 1220 ; 1230 ; Working variables 1240 ; ________Au}_________ 1250 ; 1260 TEMP .BYTE 0 1270 INIDOS .WORD 0 1280 ; 1290 ; 1300 MEMADJ = * ; Re-setAv} Memlo pointer 1310 ; 1320 ; Install Code 1330 ; ____________ 1340 ; 1350 LOADAw} 1360 LDA DOSINI 1370 STA START+1 1380 STA INIDOS 1390 LDA DOSINI+1 1400 STA START+2 1410 STA IAx}NIDOS+1 1420 LDA # START 1450 STA DOSINI+1 1460 RTS 1470 ; Ay} 1480 ; Set Load-n-Go 1490 ; _____________ 1500 ; 1510 *= INITAD 1520 .WORAz}D LOAD 1530 *= RUNAD 1540 .WORD SETVEX 1550 ; 1560 ; 1570 ; End 1580 ; A{} ___ 1590 .END >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>G K,-@,( !#$@Z10 GOTO 375 15 GRAPHICS K0:? "POLYCOPY - ATARI v 2.0" 20 ? "Space for ";INT(BUFF/125);" sectors":? :IP=-K1 25 GOSUB 250:IFE}} IP=DSN THEN 40 30 IF IPYES THEN 235 45 IP=K0:OP=K0:SPLIT=HI:APND=HI:GOTO 55 50 ? :GOSUB 325 55 ADDR=ADR(Y$):ROOM=BUFF 60 IF IP>MAE}X THEN IP=IP-K1:GOSUB 145:GOTO 240 65 Y=IP:GOSUB 230:TRAP 80:OPEN #K1,K4,K0,DSN$:TRAP TOFF 70 IF SPLIT<>IP THEN ? "LOADING E}";DSN$;:GOTO 100 75 TRAP 80:POINT #K1,SEC,BYTE:TRAP TOFF:APND=IP:? "Contin'g ";DSN$;:GOTO 100 80 TRAP TOFF:Z=PEEK(195):CLOSE}E #K1:IF Z<>170 THEN 110 85 ? :? DSN$;" not found,":? "Want to try another disk?"; 90 GOSUB 350:? :IF Z=YES THEN ? "Insert E}new disk";:GOSUB 330:GOTO 65 95 X(IP,K0)=K0:IP=IP+K1:GOTO 60 100 X(IP,K0)=ADDR 105 SIZE=USR(CIO,K1,7,ADDR,ROOM):Z=PEEK(851E}):IF Z<128 OR Z=136 THEN 115 110 CLOSE #K1:? :GOSUB 370:GOTO 95 115 ? " size = ";SIZE;:X(IP,K1)=SIZE:IF Z=136 THEN 125 120E} ? "/";:NOTE #K1,SEC,BYTE:SPLIT=IP 125 ? :CLOSE #K1 130 ADDR=ADDR+SIZE:ROOM=ROOM-SIZE:IF ROOM>K0 THEN IP=IP+K1:GOTO 60 135E} GOSUB 145:IF SPLIT<>IP THEN IP=IP+K1:IF IP>MAX THEN 60 140 GOTO 50 145 IF ROOM=BUFF THEN RETURN 150 ? :? "Insert destinaE}tion disk";:GOSUB 330 155 ADDR=X(OP,K0):SIZE=X(OP,K1):IF ADDR=K0 THEN 220 160 Y=OP:GOSUB 230:Z=8:IF APND=OP THEN Z=Z+K1 16E}5 TRAP 185:OPEN #K2,Z,K0,DSN$:TRAP TOFF:IF APND=OP THEN ? "Append'g ";:GOTO 175 170 ? "Writing "; 175 ? DSN$;" size = ";SIZE}E 180 Z=USR(CIO,K2,11,ADDR,SIZE) 185 Z=PEEK(867) 190 TRAP 190:CLOSE #K2:TRAP TOFF:IF Z<128 THEN 220 195 IF Z<>162 THEN GOE}SUB 370:GOTO 220 200 ? "Disk full, try another?";:GOSUB 335:IF Z<>YES THEN 235 205 TRAP 210:XIO 33,#K2,K0,K0,DSN$ 210 TRAPE} TOFF:IF APND<>OP THEN ? "Insert new disk";:GOSUB 330:GOTO 155 215 IP=OP:SPLIT=HI:APND=HI:POP :GOTO 50 220 IF OP to continue'); readln(s); WRITELN('1) PRINTER'I}); WRITELN('2) SCREEN '); Readln(ANS); printer := ans; if printer = 0 Then goto 1; write('FILENAME? ');readln(I}s); if printer = 1 Then toprinter; if printer = 2 then toscreen; Writeln; Writeln('press to continue'); I} readln(s); GOTO 1; end. I} !"#$%&H .TITLE "PERCOM QUICK SET 05-27-85" ; ;SAVE#D:QSET.M65 ; ; This program switches the density for ; PERCOM cM}ompatible drives. ; Drive numbers allowed are 1 through 8. ; Allowed settings are: ; S = single ; E = enhanced (1050) M}; D = double ; DD = double sided, double density ; Command format example: ; ; QSET 1D 7E 3DD ; ; At least one space aM}fter QSET is ; required. The rest of the command line ; ignores anything other than a number ; in the range 1 through 8 foM}llowed by ; an upper case D, E, or S. Thus, ; equivalent examples are: ; ; QSET 1D7E3DD ; QSET 31DXYZ7E 3DD ; M} ; When the program terminates, it echoes ; to the screen the valid portions of ; the command line. The last example ; wouM}ld echo: ; ; 1D 7E 3DD ; ; If a drive cannot be configured, the ; last letter is replaced with a ; questionM} mark. ; ; NOTES: ; 1. Enhanced (1050) allows ; you to read or write 1050 ; density disks, but does ; noM}t allow you to format ; disks in that density. ; 2. As with any other SIO ; use, the 28 second timeout ; may M}occasionally occur. ; ; I wish to credit DANIEL L. MOORE ; for his SET.ASM, from which the ; central routine of this progM}ram was ; adapted. ; ****************************** * * * Josef W. Segur 05/27/85 * * M} * ****************************** ; DOSVEC = $0A DOSINIT = $07E0 FMS v. 2 FR0 = $M}D4 FP register 0 DENSITY = FR0+2 ; ; OS/A+ equates CPBUFP = $0A next char. CPCMDB = $3F command bM}uff. ; SIO equates DDEVIC = $0300 DUNIT = $0301 DCOMND = $0302 DSTATS = $0303 DBUFLO = $0304 DBYTM}LO = $0308 ; Data direction control IN = $40 OUT = $80 ; CIO equates ICHID = $0340 ICCOM = M} $0342 ICBAL = $0344 ICBAH = $0345 ICBLL = $0348 ICBLH = $0349 ; PUTBYTS = $0B ; PERCOM drive tM}able READ = $4E WRITE = $4F LENGTH = 12 FM = 0 FM recording MFM = 4 MFM recordM}ing SID1 = 0 One side SID2 = 1 Two sides ; CIO = $E456 SIO = $E459 ; EOL = M} $9B End of line char. ; *= $4000 ; START CLC LDY #CPBUFP LDA (DOSVEC),Y M} ADC #CPCMDB+1 ;skip 1st space STA CMDBIX STA FIRSTX SEC LDA # EBUF SBC #0 STA FR0+1 LDA #EOL STA EBUF LOOM}P LDY CMDBIX INC CMDBIX BMI DOS ;out if too long LDA (DOSVEC),Y ;Get char CMPM} #EOL BEQ DOS ;out if end STA (FR0),Y ;save for echo? ; Test for drive 1 to 8. EOR #'0 M} CMP #$09 BCC NUM ;BR if 1 - 8 SPLP LDA #32 ;Else space STA (FR0),Y JMP LOOPM} ;and check next NUM STA DUNIT LDA #$31 STA DDEVIC ; Test for S(0), E(1), D(2), DD(3) M} LDX #0 INY LDA (DOSVEC),Y CMP #EOL BEQ DOS ;out if end CMP #'S M} BEQ SETIT INX CMP #'E BEQ SETIT INX CMP #'D BEQ SECD ;ChM}k 2nd D DEY ;letter bad BNE SPLP ;clr number & next SECD STA (FR0),Y INY M} LDA (DOSVEC),Y CMP #'D BEQ DDYS DEY ;whoops LDA #'D BNE SETIT M} DDYS INX BNE SETIT ; DOS LDA #EOL STA (FR0),Y STY CMDBIX JSR DOSINIT ;reM}init for all changes LDA ICHID BMI DRTS ;BR IOCB#0 not open LDA #PUTBYTS STA ICCOMM} ;Else echo cmds LDA # EBUF STA ICBAH M} LDX #0 SEC LDA CMDBIX SBC FIRSTX STA ICBLL ;len end - start STX ICBLH M} JSR CIO DRTS RTS ; SETIT STX DENSITY STA (FR0),Y ;save letter INY STY CMDBM}IX ;& index past it ; First read in the current ; control table. LDA #IN STA DSTATS LDA #REAM}D STA DCOMND LDA #LENGTH STA DBYTLO LDA #0 STA DBYTLO+1 LDA # TABLE STA DBUFLO+1 JSR SIO BPL DENS cont if no errM}or LDY CMDBIX DEY LDA #'? STA (FR0),Y else insert ? JMP LOOP and loop fM}or more ; ; Modify the control bytes ; First recording technique DENS LDA DENSITY BNE SET.MFM LDXM} #FM BEQ SET SET.MFM LDX #MFM SET STX TABLE+5 ; Then set the sector length CMP #2 BCS M}S.256 LDX #$80 128 bytes LDY #$00 BEQ SETLEN S.256 LDX #$00 256 bytes LDY #M}$01 SETLEN STY TABLE+6 High byte STX TABLE+7 Low byte ; Then set the number of ; sectors per track. M}CMP #1 BEQ S.26 LDX #18 18 sectors BNE SETSECT S.26 LDX #26 26 sectors SETSECT SM}TX TABLE+3 ; Set the number of sides CMP #3 BEQ S.DBL LDX #SID1 BEQ SETSID S.DBL M} LDX #SID2 SETSID STX TABLE+4 ; Then write the table out. LDA #OUT STA DSTATS LDA #WRITE M} STA DCOMND JSR SIO ; Loop for any more requests JMP LOOP ; CMDBIX = * ;reserve indexM} byte store *= *+1 ; FIRSTX = * ;reserve start index store *= *+1 ; ; DRIVE table. TABLEM} = * *= *+LENGTH ; EBUF = * *= *+128 ;reserve ; END .OPT LIST ^^^^^^^^^^^^^^^^^^M}^^^^^^^^^^^^^^^^7&,(!6-%@6-!67,.2QA@dQ6-?:> sync with VQ}BI 1650 PIABPORT = $D301 ; master bank selector, etc. 1660 DCBSEC = $030A ; sector number in DCB 1670 ZTEMP1 = $43 ; zeroQ} page temporary loc'n 1680 E.NAK = $8B ; "NAK" error code from "drive" 1690 ; 1700 ; Equates used to call CIO 1710 ; 1720Q} XIO.FMT = 254 ; Format command 1730 IOCB = $0340 ; address of first IOCB 1740 IOCB.CMD = IOCB+2 ; where command goes inQ} IOCB 1750 IOCB.BUF = IOCB+4 ; buffer (or name) address 1760 IOCB.AUX1 = IOCB+10 ; Auxilliary byte 1 1770 IOCB.AUX2 = IOCB+11Q} ; Auxilliary byte 2 1780 ; 1790 CIOV = $E456 ; the classic location 1800 ; 1810 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Q};; 1820 .PAGE ". Generate Small Patches" 1830 ; 1840 ; First, we generate the single byte patches 1850 ; 1860 *= Q}FASTRAM 1870 .BYTE 0 ; set flag to say we need 1880 ; synchronized transfers 1890 ; 1900 *= DPATCHQ}1 1910 .BYTE RAM.DRIVE.NUM ; we use "-1" as a flag to the 1920 ; BASIC program...it MUST be 1930 ; Q} replaced with a number from 2 to 8 1940 ; 1950 *= DPATCH2 1960 .BYTE RAM.DRIVE.NUM ; ditto 1970 ; 1980 *= Q} DRV.MEMDUP 1990 .BYTE '1 ; forces MEM.SAV and DUP.SYS 2000 ; to reside on physical drive 1 2010 ; 2020 Q}; 2030 ; 2040 ; 2050 ; Patch to RAMIO: 2060 ; 2070 ; At the beginning of RAMIO, DOS 2.5 validates 2080 ; the sector number Q}to be sure it gets a valid 2090 ; bank number 2100 ; 2110 ; If the bank number is bad, the Y-register 2120 ; is given an Q}error code indicating the 2130 ; "disk" returned a "NAK" code. 2140 ; 2150 ; We patch in where the bank number is being 216Q}0 ; checked...it used to be checked via 2170 ; a "CMP #4" but now we have a smaller "DISK". 2180 ; 2190 *= RAMIO.PATQ}CH 2200 CMP #3 ; sector must be in banks 0,1,2 2210 BCC SECOK ; it is...assume it is okay 2220 PLP Q} ; needed to clean up stack 2230 LDY #E.NAK ; too bad...give error 2240 RTS ; used to be "BNE" to a RTS...duQ}mb! 2250 ; 2260 SECOK 2270 JSR RAMSYNC ; synchronize and select bank 2280 LDA ZTEMP1 ; get sector # times 2 2290 Q} LSR A ; now sector # 2300 LSR A ; now sector # divided by 2 2310 ORA #$C0 ; ensure address is in rangQ}e ($C000-$FFFF) 2320 ; 2330 ; rest of code is okay! 2340 ; 2350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2360 ; 2370 ; PaQ}tch to SETBANK: 2380 ; 2390 ; The entire routine is replaced 2400 ; 2410 ; ENTER: A-register = 0,1,2,3,4 2420 ; If 4Q}, then Main Memory is needed (ROMs) 2430 ; Else, RAM is needed. 2440 ; 2450 *= SETBANK 2460 ROR A ; IfQ} A-register was 4 on entry... 2470 ROR A ; ...then these 3 ROR's... 2480 ROR A ; ...will set the carry biQ}5z}2490 PHP ; so save the carry for a nonce 2500 LDA PIABPORT ; and get current bank select info 2510 LSRQ} A ; strip it of its LSBit 2520 PLP ; recover the carry... 2530 ROL A ; ...and carry becomes ROM R}select!!! 2540 STA PIABPORT ; changes RAM to ROM or v.v. 2550 RTS ; saved a byte, actually! 2560 ; 2570 .R}PAGE ". The FORMAT fixer-upper" 2580 ; 2590 ; Up until now, we have just patched DOS 2.5. 2600 ; 2610 ; Now, we must do seR}veral steps: 2620 ; 2630 ; 1. Reinitialize DOS 2640 ; 2. FORMAT the RamDisk 2650 ; 3. Alter the VTOC 2660 ; 2670 ; Step 3 R}is necessary because DOS 2.5's 2680 ; FORMAT routine assumes (A) that a disk 2690 ; is large enough that the VTOC and 270R}0 ; DIRECTORY can occupy sectors $168 to 2710 ; $170 and (B) that (except for the boot 2720 ; sectors and the VTOC and R}DIRECTORY) 2730 ; available sector are continuous from 2740 ; 1 to the max sector number. 2750 ; We set bits to zero inR} the VTOC to 2760 ; inform DOS 2.5 that the corresponding 2770 ; sectors are not really there! 2780 ; 2790 *= $8000 R} ; my favorite place 2800 ; 2810 ; begin the actual code: 2820 ; 2830 DOPATCH 2840 LDA DRIVE.MASK ; to active drives... R}2850 ORA #$80 ; ...include this drive 2860 STA DRIVE.MASK ; and update the mask 2870 ; 2880 JSR INITDOS ; becaR }use the load process 2890 ; changed several things, possibly 2900 ; including the drive table, etR }c. 2910 ; 2920 ; now set up for the XIO for format 2930 ; 2940 LDX #$70 ; we will use channel 7 for this 2950 LDA R }#XIO.FMT ; the format command 2960 STA IOCB.CMD,X ; is first item on agenda! 2970 LDA #DRV.NAME&$FF ; LSB of address R }of drive name 2980 STA IOCB.BUF,X ; to IOCB 2990 LDA #DRV.NAME/$0100 ; then MSB 3000 STA IOCB.BUF+1,X ; also to IR }OCB 3010 LDA #0 3020 STA IOCB.AUX1,X ; probably unnecessary... 3030 STA IOCB.AUX2,X ; but best to simulate BASIC R}call 3040 JSR CIOV ; call CIO to FORMAT the disk 3050 BMI OOPS ; but we can't handle an error! (do nothing) 306R}0 ; 3070 ; okay...time to patch the VTOC 3080 ; 3090 LDY #SIZE.RVTOC 3100 LOOP 3110 LDA NEW.RVTOC,Y ; get a byte of mR}odified VTOC 3120 STA (VTOCPTR),Y ; and put it into system VTOC 3130 DEY ; more to do? 3140 BPL LOOP ;R} yep 3150 ; 3160 JSR WRTVTOC ; so write out the modified VTOC 3170 OOPS 3180 RTS ; and we are done! 3190 ; 32R}00 ; A string to hold drive name for XIO command 3210 ; 3220 DRV.NAME 3230 .BYTE "D" ; We want "D2:" through "D8:" 3240R} .BYTE '0+RAM.DRIVE.NUM ; flag for BASIC DATA stmts 3250 .BYTE ":" ; end of string... 3260 .BYTE 0 ; exceptR} for this 3270 ; 3280 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 3290 ; 3300 .PAGE ". New VTOC layout for 14KB RamDR}isk" 3310 *= $8100 ; (no reason...just to look pretty) 3320 ; 3330 ; Following are 74 bytes which define the appearancR}e 3340 ; of the VTOC for our 14KB RamDisk 3350 ; 3360 ; Some sneakies to observe: 3370 ; even though we only use sector nR}umbers 3380 ; from $01 to $7F, we mark $68 through 3390 ; $6B as being in use...this is because 3400 ; our bank select R}routine maps sectos 3410 ; $168 through $16B to the same memory 3420 ; locations as those containing $68-$6B. 3430 ; $1R}68 is the VTOC, as is standard with 3440 ; all DOS 2 versions, and $169 to $16B 3450 ; are the directory. Note that $16R}9 to 3460 ; $170 are normally used for directory, 3470 ; but we have opted for a shortened directory 3480 ; in order toR} give more file space... 3490 ; our directory still allows 24 files... 3500 ; surely more than enough for what is now 351R}0 ; a 13KB RamDisk. 3520 ; 3530 NEW.RVTOC 3540 .BYTE 2 ; DOS "2" family 3550 .WORD 128-16-1-3-3 ; 128 sectors iR}n 16KBytes, 3560 ; less 16 sectors for 2KB I/O "hole" 3570 ; less 1 sector for VTOC 3580 ; R} less 3 sectors for shortened directory 3590 ; less 3 sectors for BOOT (useless but needed) 3600 ; (all R}this to find max # of sectors on disk) 3610 .WORD 128-16-1-3-3 ; ditto...but this is "available" sectors 3620 ; 3630 R }.BYTE 0,0,0,0,0 ; 5 dummy bytes 3640 .BYTE $0F ; sectors 0,1,2,3 in use 3650 ; 4-7 available 3660 .BYR!}TE $FF,$FF,$FF ; sectors 8-$1f available 3670 ; which uses memory: $C000 to $CFFF 3680 .BYTE 0,0 ; sectorR"}s $20-$2F 3690 ; were $D000 to $D7FF, but that 3700 ; is I/O area!! 3710 .BYTE $FF,$FF ; sectR#}ors $30-$3f 3720 ; memory $D800 to $DFFF 3730 .BYTE $FF,$FF,$FF,$FF ; sectors $40-$5F 3740 ; R$}memory $E000 to $EFFF 3750 .BYTE $FF ; sectors $60-$67 3760 .BYTE $0F ; sectors $68-$6B marked as in use 3770 R%} ; because $168 to $16F are mapped to this 3780 ; same bank, and we have chosen to allow 3790 ; R&} up to 24 files in the RamDisk 3800 ; so we need 4 "holes" for the 3810 ; VTOC and 3 direR'}ctory sectors 3820 .BYTE $FF,$FF ; sectors $70-$7F 3830 ; sectors $60-$7F = memory $F000-$FFFF 3840 ; 3850 R(} .BYTE $80 ; sector $80 is same as sector $00... 3860 ; ...at memory location $C000.. 3870 ; R)} ...but sector $00 is not used, so we 3880 ; ...CAN use sector $80!! 3890 ; 3900 .BYTE 0,0,0,0,0,0,0 3910 R*} .BYTE 0,0,0,0,0,0,0,0 ; to sector $FF 3920 .BYTE 0,0,0,0,0,0,0,0 3930 .BYTE 0,0,0,0,0,0,0,0 ; to sector $17F 3940 R+} .BYTE 0,0,0,0,0,0,0,0 3950 .BYTE 0,0,0,0,0,0,0,0 ; to sector $1FF ... 3960 ; end of normal RamDisk 3970R,} ; 3980 SIZE.RVTOC = *-NEW.RVTOC 3990 .PAGE ". Initialization Vector and Symbol Table" 4000 ; 4010 *= $02E0 ; sR-}o DOS knows where this thing runs from 4020 .WORD DOPATCH ; doit toit 4030 ; 4040 .TITLE "DOS 2.5 Patch for 14K Byte R.}RamDisk" 4050 .END DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDA@ -@0@PTM X;X;quick and dirty DEFAULTSX;(!X;don lebow pbp maui 2/1/872X;< CASINIF BOOT? P LMARGNRZ CRV0}d FR0n TXTx BAKKRPDELKEYREPX;%;;middle of the stack RESETQ>;;set colorsV1}%> PTXT'BAKQ>PLMARGN;;set marginQ>;;speed up keyboard%> PKRPDEL 'KEYREPQ>;;insure veV2}ctor" PBOOT?, :;;done!6X;@,X;end reset ram...next segment expendableJX;TYX;init routine..default values POKEd from BV3}asic, then called by USR ("pla,jmp install"^X;h INSTALLrQ>4RESET;;trap RESET| %>5RESET%PCASINI;;with least compliV4}cations'CASINI4Q;;we ALWAYS access the OS via vector tables!!,O>PPUTCHAR;;to programQO>V5}PPUTCHAR RESET;;do itX;X;print default registersX;%>;;start PRLOOPQMSTART8;;character&FPRDV6}ONE;;done?0 'FR0;;no: PUTCHARD ;;call osN%FR0;;retrieve indexX3bHPRLOOP;;moichidol PRDONEv :;;bye! X;meV7}ssage MSTARTR }=AText-294 Screen-296 Margin-304A=CR=ADelay-308 Repeat-310A=CR=CR=MENDQQQQQQQQQQQQQQQQQQQQV8}QQQQQQQQQQQQQQQQQQQQQQQQQQQ@-A -@ %%2AP%@%'@!!2@@T0 REM FROM GREKELCOM -- 405-722-5056 30 REM DISK DRIVE TEST SPEED CHECK BASED ON A CONCEPT FROM THE MAY 82 COMPUTE Z:}& REVISED BY A.C.A.O.C. 40 REM RPM SPEEDS UNDER 285 ARE TOO SLOW AND NEED ADJUSTMENT. SPEEDS 285- 290 ARE OK. LEAVZ;}E AS THEY ARE. 50 REM SPEEDS OVER 290 ARE TOO FAST. 51 REM THIS TEST PROGRAM ASSUMES THAT 288 RPM IS PERFECT, ALTHOUGH TZ<}HERE IS AN ACCEPTABLE RANGE THAT WORKS. 52 REM UNLIKE MY FIRST DISKRPM PROGRAM DONATION, THIS ONE WORKS WITH THE NEZ=}W FAST FORMATTING DRIVE CHIPS. 53 REM LET THE DISK RUN UNTIL YOU GET SEVERAL READINGS TO GIVE YOU AN IDEA WHAT YOURZ>} DRIVE DOES WHEN ON. 60 REM REVISED & DONATED BY FRED WARD 100 POKE 82,10:POKE 752,1 110 ? " " 120 POKE 709,0:POKE 710,1Z?}2:POKE 712,12 130 FOR I=0 TO 72 140 READ A:POKE 1536+I,A:NEXT I 160 ? " DISK SPEED READER" 170 ? :? :? " PUSH SYSTEM REZ@}SET" 190 ? :? " TO TERMINATE TEST":? :? :? 210 ? "TESTING WHICH DRIVE NUMBER"; 220 OPEN #1,4,0,"K:":GET #1,K:CLOSE #1 2ZA}30 D=K-48:IF D<1 OR D>4 THEN 220 240 ? D:? 250 ? " RPM READING: " 260 POKE 1610,D 270 X=USR(1536) 280 A=PEEK(1611):B=ZB}PEEK(1612) 290 M=(256*B+A)/3600 300 R=INT(100/M+0.5) 310 SOUND 1,50,10,15 320 FOR A=1 TO 100 330 POSITION 26,12:? R;" " ZC} 340 NEXT A:SOUND 1,0,0,0:? :? :? :? 370 ? " SPEED IS "; 380 POSITION 20,17 390 IF R<285 THEN ? " TOO SLOW":GOTO 27ZD}0 400 IF R>290 THEN ? " TOO FAST":GOTO 270 410 IF R=288 THEN ? "PERFECT ":GOTO 270 420 ? "O.K. ":GOTO 270 430 DATA 10ZE}4,169,1,141,10,3,169,0 440 DATA 141,11,3,141,4,3,169,5 450 DATA 141,5,3,173,74,6,141,1 460 DATA 3,169,82,141,2,3,169,5 47ZF}0 DATA 141,73,6,32,83,228,206,73 480 DATA 6,208,248,169,100,141,73,6 490 DATA 169,0,133,19,133,20,32,83 500 DATA 228,206,7ZG}3,6,208,248,165,20 510 DATA 164,19,141,75,6,140,76,6,96 ands & adds ten newones: circles, squares, patterned fills& more!X:;scoff - supercart off ;aycock, 9/87 ; ; *=$5555 ;out of the way ; ; dosvec = $A rtclok = $14 ramtop = $6A statsav = ^I}$100 iccom = $342 icbal = $344 icbah = $345 icax1 = $34A basicf = $3F8 cintlk = $3FA crtstat = $AFFF portb ^J} = $D301 ossoff = $D508 ciov = $E456 ; ; .byte $60 ;RTS for no re-entry ; ; edev .byte "E:",$9B ;in a safe place ;^K} ; ; START ;THE ENTRY POINT... ; ldx #0 ;close E: lda #12 sta iccom jsr ciov ; lda rtclok ;wait for c^L}lock CHK ; to change cmp rtclok beq CHK ; sei ;disable interrupts and lda crtstat ; the supercart ^M} sta statsav sta ossoff lda #0 sta cintlk ; lda #1 ;disable builtin basic sta basicf lda portb ora #2 sta port^N}b ; lda #$C0 ;reset ramtop sta ramtop ; cli ;enable interrupts and ldx #0 ; reopen E: lda #3 sta ^O}iccom lda #edev & $FF sta icbal lda #edev / $100 sta icbah lda #12 sta icax1 jsr ciov ; jmp (dosvec) ; back to Dos! ^P}; ; INIT VECTOR ; *=$2E2 ; .word START Back Side of Disk(NOTE: These programs should be loadedw/o BASIC to insure prope\) 00010 ;SAVE"D:SET.SYN 00020 ; .LI OFF 00030 ; This program switches the 00040 ; density for one PERCOM 00050 ; cbR}ompatible drive. The 00060 ; allowed settings are: 00070 ; S=single, D=double, E=1050. 00080 ; Command format is: 00090 bS}; SET 1D 00091 ; 00092 ; NOTE: The 1050 format allows 00093 ; you to read or write 1050 00094 ; density disks, but does bT}00095 ; not allow you to format disks 00096 ; in that density. 00100 ; 00110 ****************************** 00120 * DanibU}el L. Moore 03/19/84 * 00130 ****************************** 00140 ; 00150 DOSVEC .EQ $A 00160 DOSINIT .EQ $7E0 FMS bV}v. 2 00170 DENSITY .EQ $D4 FP register 0 00180 ; 00190 ; OS/A+ equates 00200 CPBUFP .EQ $A next char. 00210 CPCMDB bW} .EQ $3F command buff. 00220 ; SIO equates 00230 DDEVIC .EQ $300 00240 DUNIT .EQ $301 00250 DCOMND .EQ $302 002bX}60 DSTATS .EQ $303 00270 DBUFLO .EQ $304 00280 DBYTLO .EQ $308 00290 ; Data direction control 00300 IN .EQ $4bY}0 00310 OUT .EQ $80 00320 ; PERCOM drive table 00330 READ .EQ $4E 00340 WRITE .EQ $4F 00350 LENGTH .EQ 12 bZ} 00360 FM .EQ 0 FM recording 00370 MFM .EQ 4 MFM recording 00380 ; 00390 SIO .EQ $E459 00400 ; 00410 b[} .OR $4000 00420 ; 00430 START CLC 00440 LDY #CPBUFP 00450 LDA (DOSVEC),Y 00460 ADCb\} #CPCMDB+1 00470 TAY 00480 LDA (DOSVEC),Y drive # 00490 ; Test for drive 1 to 8. 00500 CMP #'1b]} 00510 BCC DOS 00520 CMP #'9 00530 BCS DOS 00540 CLC 00550 SBC #'0-1 00560b^} STA DUNIT 00570 LDA #$31 00580 STA DDEVIC 00590 ; Test for S(0), D(1), E(2) 00600 LDb_}X #0 00610 INY 00620 LDA (DOSVEC),Y 00630 CMP #'S 00640 BEQ SETIT 00650 INXb`} 00660 CMP #'D 00670 BEQ SETIT 00680 INX 00690 CMP #'E 00700 BEQ SETIT 007ba}10 DOS RTS 00720 ; 00730 SETIT STX DENSITY 00740 ; First read in the current 00750 ; control table. 00760 bb} LDA #IN 00770 STA DSTATS 00780 LDA #READ 00790 STA DCOMND 00800 LDA #LENGTH 00810bc} STA DBYTLO 00820 LDA #0 00830 STA DBYTLO+1 00840 LDA #TABLE 00850 STA DBUFLbd}O 00860 LDA /TABLE 00870 STA DBUFLO+1 00880 JSR SIO 00890 BMI DOS exit if error 009be}00 ; Then modify the control bytes 00910 ; First recording technique 00920 LDA DENSITY 00930 BNE SET.MFMbf} 00940 LDX #FM 00950 BEQ SET 00960 SET.MFM LDX #MFM 00970 SET STX TABLE+5 00980 ; Then set the sbg}ector length 00990 CMP #1 01000 BEQ S.256 01010 LDX #$80 128 bytes 01020 LDY #$00bh} 01030 BEQ SETLEN 01040 S.256 LDX #$00 256 bytes 01050 LDY #$01 01060 SETLEN STY TABLE+6 Highbi} byte 01070 STX TABLE+7 Low byte 01080 ; Then set the number of 01090 ; sectors per track. 01100 CMP #bj}2 01110 BEQ S.26 01120 LDX #18 18 sectors 01130 BNE SETSECT 01140 S.26 LDX #26 26 bk}sectors 01150 SETSECT STX TABLE+3 01160 ; Then write the table out. 01170 LDA #OUT 01180 STA DSTATS 0bl}1190 LDA #WRITE 01200 STA DCOMND 01210 JSR SIO 01220 ; Init DOS for the current 01230 ; densitbm}y. 01240 JSR DOSINIT 01250 ; Then return to DOS. 01260 RTS 01270 ; 01280 ; DRIVE table. 01290 TABLE bn} .EQ * 01300 ; 01310 END .LI ON `); ---------------------------------------------------------------- ; 1027 Printer Timeout Fix (Ver. 2) fp} (AUTORUN.SYS) ; Joe Miller 10 Mar 1985 ; ; This patch corrects the 1027 printer timeout problem by prevefq}nt- ; ing the Operating System from generating an incorrect Data Frame ; checksum. It consists of two logical mofr}dules. The first module ; is executed once (at initialization) to chain into the "serial ; output ready" IRQ profs}cess. The second module is invoked when an ; IRQ is generated for each serial output byte. It checks to see ; ift}f an invalid checksum is going to be sent for the current data ; frame, and, if so, prevents it from happening. ; ; fu} NOTE: This code is implemented as a standard "AUTORUN.SYS" file ; so that it may be used with any version ofv}f ATARI DOS. ; With some care, it may also be embedded directly within ; your own application progrfw}am. Note usage of cassette ; buffer. Assemble with AMAC. ; ---------------------------------------------fx}------------------- FIXORG EQU $0480 ; Location of SIO patch VSEROR EQU $020C ; Serial Outpfy}ut Ready IRQ vector CHKSUM EQU $0031 ; SIO checksum accumulator BUFRLO EQU $0032 ; SIO output bfz}uffer pointer ORG FIXORG ; Start SIO patch PHP ; Save processor status f{} SEI ; Disable IRQs for a moment LDA VSEROR ; Save current SIO output ready adf|}dress STA UVSER LDA VSEROR+1 STA UVSER+1 LDA #low SIOFIX ; Chain our fix f}}into IRQ process STA VSEROR LDA #high SIOFIX STA VSEROR+1 PLP f~} ; Re-enable interrupts RTS ; Return to OS --> YSAVE DS 1 ; Temporary for f}Y-register UVSER DS 2 ; Serial Output Ready IRQ chain address SIOFIX LDA CHKSUM ; For ef}ach SIO 'Output Ready' interrupt BNE SIOJMP ; If current checksum is zero, then STY YSAVE f} ; Save Y register LDY #0 ; Initialize index LDA (BUFRLO),Y ; Get ff}irst buffer byte BEQ YRESTR ; If 1st byte <> 0, then PLA ; This datf}a frame would cause timeout STA CHKSUM ; Save stacked byte in checksum INY f} ; Bump output buffer index CLC ; 'Pre-calculate' corrected checksum LDA f} (BUFRLO),Y ; Add second byte in output buffer ADC CHKSUM ; To first byte (alreadf}y sent) ADC #0 ; Including possible carry PHA ; Save it on sf}tack (NOT in CHKSUM!!) ; Endif YRESTR LDY YSAVE ; Restore Y-register f} ; Endif SIOJMP JMP (UVSER) ; Chain into system's interrupt server END f} FIXORG ; End ---------------------------------- d= 10 REM SETAUTO2.BAS:4-24-82 15 DIM AR$(121) 20 GRAPHICS 1:SETCOLOR 2,0,0:? #6 30 ? #6;" SETAUTO2 WITH 850 BOOj}T" 40 ? #6:? #6;" COPYRIGHT (c) 1982 JAMES STEINBRECHER" 50 ? #6:? #6;" USE TO CREATE" 60 ? #6;" AUTORUN.SYS" 70 ? j}#6:? #6;" FOR BASIC PROGRAM" 80 ? #6:? #6;" or" 90 ? #6:? #6;" ASSEMBLY COMMANDS" 100 ? #6:? #6;" or" 110j} ? #6:? #6;"ANY VALID BASIC LINE" 120 OPEN #1,4,0,"K:" 200 FOR I=1536 TO 1696 210 READ D:POKE I,D 220 NEXT I 300 ? " j} PLACE DISKETTE IN D1," 310 ? " AND DEPRESS: RETURN WHEN READY "; 320 GET #1,C:? 390 TRAP 440 400 OPEN #2,12,0,"D:AUj}TORUN.SYS" 410 CLOSE #2 420 ? " HAVE AUTORUN.SYS!" 430 GOTO 500 440 IF PEEK(195)<>170 THEN 900 445 CLOSE #2 450j} ? " NO AUTORUN.SYS" 500 ? " WANT NEW AUTORUN.SYS? "; 510 GET #1,C:IF C=78 OR C=110 THEN 900 520 IF C=89 THj}EN 550 530 GOTO 510 550 GRAPHICS 0:SETCOLOR 2,2,2 560 ? :? " ENTER NEW AUTORUN AS A BASIC LINE" 570 ? " UP TO 120 CHARACTj}ORS:" 580 ? :? " EXAMPLE;" 590 ? :? " PRINT FRE(0):RUN";CHR$(34);"D:MENU";CHR$(34);":REM GAMES" 600 ? :INPUT AR$ 610 IF Lj}EN(AR$)>120 THEN AR$=AR$(1,120) 620 AR$(LEN(AR$)+1)=CHR$(155) 630 FOR I=1 TO LEN(AR$) 640 POKE 1536+127+I,ASC(AR$(I,I)) 6j}50 NEXT I 660 OPEN #2,8,0,"D:AUTORUN.SYS" 670 GOSUB 1500 700 ? "WRITING COMMAND LINE":? AR$ 710 PUT #2,255:PUT #2,255 72j}0 PUT #2,0:PUT #2,6 730 PUT #2,255:PUT #2,6 750 FOR I=1536 TO 1536+255 760 PUT #2,PEEK(I) 770 NEXT I 800 PUT #2,224:PUT j}#2,2 810 PUT #2,225:PUT #2,2 820 PUT #2,0:PUT #2,6 900 CLOSE #2 910 CLOSE #1 920 GRAPHICS 0 930 END 1000 DATA 76,82,6j},83,58,0,72,162 1020 DATA 96,169,12,157,66,3,32,86 1040 DATA 228,162,96,169,3,157,66,3 1060 DATA 169,3,157,68,3,169,6,157 j} 1080 DATA 69,3,104,157,75,3,41,240 1100 DATA 73,16,9,12,157,74,3,76 1120 DATA 86,228,134,85,169,0,133,86 1140 DATA 132,84j},96,72,32,50,6,162 1160 DATA 96,169,11,157,66,3,169,0 1180 DATA 157,72,3,157,73,3,104,76 1200 DATA 86,228,169,0,32,6,6,162j} 1220 DATA 0,142,125,6,174,125,6,189 1240 DATA 126,6,201,155,240,10,160,2 1260 DATA 32,59,6,238,125,6,208,236 1280 DATA 1j}62,2,160,0,32,50,6,169 1300 DATA 12,141,252,2,96,12,32,32 1320 DATA 82,85,78,34,68,58,77,69 1340 DATA 78,85,155,32,32,32,3j}2,32 1360 DATA 32,32,32,32,32,32,32,32 1380 DATA 32,32,32,32,32,32,32,32 1400 DATA 32,32,32,32,32,32,32,32 1500 ? :? "DO j}YOU WANT 850 BOOT "; 1510 GET #1,ANS:? CHR$(ANS):IF ANS=78 OR ANS=110 THEN RETURN 1520 IF ANS=89 THEN 1540 1530 GOTO 1500j} 1540 RESTORE 1600:? "WRITING 850 BOOT" 1550 FOR I=1 TO 88 1560 READ D:PUT #2,D 1570 NEXT I 1580 ? :RETURN 1590 REM WIj}LL LOAD AT STEP 14336 IN DOS 1600 DATA 255,255,0,56,75,56,169,80 1610 DATA 141,0,3,169,1,141,1,3,169 1620 DATA 63,141,2,3,j}169,64,141,3,3 1630 DATA 169,5,141,6,3,141,5,3,169 1640 DATA 0,141,4,3,141,9,3,141,10 1650 DATA 3,141,11,3,169,12,141,8,3 j} 1660 DATA 32,89,228,16,1,96,162,11 1670 DATA 189,0,5,157,0,3,202,16,247 1680 DATA 32,89,228,48,6,32,6,5,108 1690 DATA 12,j}0,96 1700 DATA 226,2,227,2,0,56 h"PROCEDURE Lowerize(VAR Str : String); VAR L,V : Integer; BEGIN FOR L := 1 TO MaxString DO BEGIN V := Ord(Str[L]n}); IF (91 > V) AND (V > 64) THEN Str[L] := Chr(V + 32) END END;(* letters to lower case *) PROCEDURE Uppern}ize(VAR Str : String); VAR L,V : Integer; BEGIN FOR L := 1 TO MaxString DO BEGIN V := Ord(Str[L]); IF (12n}3 > V) AND (V > 96) THEN Str[L] := Chr(V - 32) END END;(* letters to upper case *) PROCEDURE Invertize(VAR Str :n} String); VAR L,V : Integer; BEGIN FOR L := 1 TO MaxString DO BEGIN V := Ord(Str[L]); Str[L] := Chr(V + 128) n} END END;(* all of string to inverse *) PROCEDURE Purge(VAR Str : String); VAR L,V : Integer; BEGIN FOR L := 1 TO MaxStn}ring DO BEGIN V := Ord(Str[L]); IF (V < 32) OR (V > 122) THEN Str[L] := Chr(32) END END; lm100 REM WEDGE BASIC LOADER 110 GRAPHICS 0:? "Insert a DOS 2.0S diskette" 120 ? "with DOS.SYS in drive 1" 130 ? :? "Press Rr}ETURN when you have done this" 140 IF PEEK(764)<>12 THEN 140 150 POKE 764,255 160 ? :? "Now writing the wedge AUTORUN.SYS r} file." 170 TRAP 190 180 OPEN #1,8,0,"D:AUTORUN.SYS":TRAP 40000:GOTO 200 190 CLOSE #1:? :? "Can't open AUTORUN.SYS for r}write":END 200 PUT #1,255:PUT #1,255:REM $FFFF HEADER 210 PUT #1,0:PUT #1,31:REM $1F00 START 220 PUT #1,74:PUT #1,33:REM r}$214A END 230 FOR I=7936 TO 8522+6:REM INCLUDE 6 BYTE AUTORUN 240 READ A:TRAP 310:PUT #1,A:TRAP 40000 250 CKSUM=CKSUM+A 2r}60 NEXT I 270 IF CKSUM<>60435 THEN ? "}Bad number in DATA statements.":ERR=1 280 CLOSE #1 290 IF NOT ERR THEN ? :? "DATA r}ok,write successful." 300 END 310 ? :? "Error-";PEEK(195);" when attempting disk write.":CLOSE #1:END 7936 DATA 104,165,r}12,141,37,31 7942 DATA 165,13,141,38,31,169 7948 DATA 36,133,12,169,31,133 7954 DATA 13,32,43,31,32,92 7960 DATA 31,169,7r}5,141,231,2 7966 DATA 169,33,141,232,2,96 7972 DATA 32,64,21,32,11,31 7978 DATA 96,169,80,141,68,3 7984 DATA 169,31,141,6r}9,3,169 7990 DATA 0,141,73,3,169,12 7996 DATA 141,72,3,169,11,141 8002 DATA 66,3,162,0,32,86 8008 DATA 228,152,48,1,96,76r} 8014 DATA 55,33,65,116,97,114 8020 DATA 105,32,87,101,100,103 8026 DATA 101,155,160,0,185,26 8032 DATA 3,201,69,240,7,20r}0 8038 DATA 200,192,34,208,243,96 8044 DATA 200,169,165,153,26,3 8050 DATA 200,169,31,153,26,3 8056 DATA 162,0,189,0,228,r}157 8062 DATA 165,31,232,224,16,208 8068 DATA 245,169,184,141,169,31 8074 DATA 169,31,141,170,31,24 8080 DATA 173,4,228,1r}05,1,141 8086 DATA 186,31,173,5,228,105 8092 DATA 0,141,187,31,169,0 8098 DATA 133,203,96,251,243,51 8104 DATA 246,184,31r},163,246,51 8110 DATA 246,60,246,76,228,243 8116 DATA 56,1,1,125,32,32 8122 DATA 62,246,8,201,155,240 8128 DATA 4,230,203r},40,96,140 8134 DATA 181,31,142,182,31,165 8140 DATA 203,240,86,169,51,133 8146 DATA 205,169,32,133,206,160 8152 DATA 0,1r}77,205,217,128,5 8158 DATA 208,12,200,177,205,240 8164 DATA 40,196,203,208,240,76 8170 DATA 37,32,201,255,240,53 8176 DATr}A 160,0,177,205,240,9 8182 DATA 230,205,144,2,230,206 8188 DATA 76,242,31,24,165,205 8194 DATA 105,3,133,205,144,2 8200 Dr}ATA 230,206,76,215,31,200 8206 DATA 132,204,177,205,141,183 8212 DATA 31,200,177,205,141,184 8218 DATA 31,108,183,31,160,0r} 8224 DATA 169,46,153,128,5,169 8230 DATA 0,133,203,169,155,172 8236 DATA 181,31,174,182,31,40 8242 DATA 96,68,73,82,0,12r}5 8248 DATA 32,83,67,82,65,84 8254 DATA 67,72,0,22,33,76 8260 DATA 79,67,75,0,27,33 8266 DATA 85,78,76,79,67,75 8272 DATr}A 0,32,33,82,69,78 8278 DATA 65,77,69,0,37,33 8284 DATA 75,73,76,76,0,42 8290 DATA 33,255,155,50,54,32 8296 DATA 70,82,69r},69,32,83 8302 DATA 69,67,84,79,82,83 8308 DATA 155,155,0,0,68,58 8314 DATA 42,46,42,162,80,169 8320 DATA 12,157,66,3,32,r}86 8326 DATA 228,162,80,169,3,157 8332 DATA 66,3,169,6,157,74 8338 DATA 3,169,120,157,68,3 8344 DATA 169,32,157,69,3,32 r}8350 DATA 86,228,152,16,3,76 8356 DATA 55,33,162,80,169,5 8362 DATA 157,66,3,169,100,157 8368 DATA 68,3,141,68,3,169 8374r} DATA 32,157,69,3,141,69 8380 DATA 3,169,20,157,72,3 8386 DATA 141,72,3,32,86,228 8392 DATA 152,48,13,169,9,141 8398 DATAr} 66,3,162,0,32,86 8404 DATA 228,76,166,32,162,80 8410 DATA 169,12,157,66,3,32 8416 DATA 86,228,76,30,32,162 8422 DATA 80,r}157,66,3,169,0 8428 DATA 157,73,3,164,203,153 8434 DATA 128,5,56,152,229,204 8440 DATA 157,72,3,24,169,128 8446 DATA 101,r}204,157,68,3,169 8452 DATA 5,105,0,157,69,3 8458 DATA 32,86,228,152,16,3 8464 DATA 76,55,33,76,30,32 8470 DATA 169,33,76,r}229,32,169 8476 DATA 35,76,229,32,169,36 8482 DATA 76,229,32,169,32,76 8488 DATA 229,32,173,37,31,133 8494 DATA 12,173,38r},31,133,13 8500 DATA 76,116,228,72,162,80 8506 DATA 169,12,157,66,3,32 8512 DATA 86,228,104,162,255,154 8518 DATA 133,185r},76,64,185 9000 REM DATA FOR AUTORUN ADDRESS 9010 DATA 224,2,225,2,1,31 9020 REM END OF DATA STATEMENTS pl