LBSOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUNDINVALID KERNEL FILExةw,@  4  J  ȱ⩤i8#) ) 8Le From: Chris Acreman I was reading through some of the back issues of TAUTALES available from the TAU disc library and came across this intriguing item in the "This Month from CompuServe" column in Volume 3, No. 10, June 1985: "Applewriter /// -SUPER.AW.FIX2n5 +RENAMER.PGM ':!&UI *MENU.MAKER 3 z'4&%SEG.T j'4Ÿ/ /MERGE.QUICKFILE-MORE.ON.FONTSy8 m,-PROGRAM.6502t t -SUPER.AW.FIX1n5III.INF.13.087Bu' -AW.ASCII.NULL/BACKUP.PROBLEMSD:3n9/CODEFILE.REVIEW=j  ,DISKNAME.DAT'n9')EZP.FIXESV33+EZP.FORMATS m#im#iЛ#Lȱ  6L憦  Lsmm l y` @8(Je稽 ʈas you may know will not take an ASCII Null (Decimal 0) as a control character. Synergistics has a patch to correct this". Does anybody have any idea how I might pursue this. Thanks. Chris From: Ed Gooding C ultiple record layout. SRL: Data base single record layout. RAC: Review/Add/Change screen. 1W: Shorthand for "one word." You will also see references to bytes, in the form "3B", for example. 1BI: One byte integer. B: The most significant byte of a word. Its address will be one higher than the address of the LSB, in memory, and on disk. If the total value of a word is less than decimal-256, this byte will be zero. MRL: Data base me formats. DEFINITIONS: LSB: The least significant byte of a word. It is also the "left byte", the "first byte off the disk," and the "lower address in memory." As you can see, we're going to try to explain our buzzwords. MS  !"#$%&'()*+,-./01formats for Appleworks and /// E-Z Pieces as of 2/3/84. This is not confidential information, and may be copied as necessary. This document may be revised from time to time to correct errors, clarify ambiguous definitions, or to report changes in the fil FILE FORMATS FOR /// E-Z PIECES Written By: Rupert (Bob) Lissner 2/84 Modified By: Robert Lissner 3/86 ----------------------------------------------------------------------------- This document describes the file Don wrote in the 2/85 issue of InCider. The tutorial was a very informative and practical piece on using glossaries in Applewriter. Hope this helps you out.....Ed om: Ed Gooding P.S. to Chris: Found it!! Don Lancaster's company is called Synergistics, 746 First Street, Box 809, Thatcher, AZ 85552, (602) 428-4073 from 8 AM to 5 PM MST. I got this info from the author's bio portion of an Applewriter tutorial that ted to the Applewriter //e, but the concepts apply in the /// version, too. If I'm not mistaken, he used to offer patch disks for sale to help you customize and optimize Applewriter. I'll get back to you later if I can find the info. Take care.....Ed Frfound him. If I do, I'll get back to you, but you may be able to get his address on the Apple ][ forum. He has written some very informative books available at places like B. Dalton and Waldenbooks, that really explain Applewriter. They are usually orienhris: The all-world guru for Applewriter is a guy named Don Lancaster. He operates out of Arizona, but I'm not sure if the name of his company is Synergistics. I've been frantically searching through magazines for the last couple of minutes, but haven't Values from 0 to decimal-255. A value of decimal-50 will be stored as hex-32. 1WI: One word integer. Bit 80 of the LSB has a value of decimal-128. Bit 80 of the MSB is the sign bit. Bit 01 of the MSB has a value of decimal-256. Boolean: A single byte that either is zero ("false") or has the rightmost bit turned on ("true"). If the rightmost bit is on ("true"), there may also be other bits on. These additional bits have no meanin What direction should the cursor go when you press Return in the MRL? D)own or R)ight. +032 - 033 Ignore these bytes. +034 Style of display that Review/Add/Change was using when the file w the disk. +002 - 029 Ignore these bytes. +030 Cursor direction when Return is pressed in SRL. 1H: Order in which you defined categories, or 2H: Left to right, top to bottom. +031 tion ----------------- ---------------------------------------------------------- +000 - 001 1WI that is the number of bytes in the remainder of the Header Record. Use this count for your next SOS read fromiable length information for each "record." The Header contains category names, record selection rules, counts, screen positioning information and all other information that is not specific to one record. Relative Position Definiit is likely that the wrong letters will be lower case. DATA BASE FILES: Data Base files start with a variable length Header, followed by 600 bytes for each report format (if any), the "standard values" record, and then varormation from the directory "file entry" are used to determine which characters should be lower case, and which periods should be displayed as spaces. If you use the auxiliary type bytes for a different purpose, 3EZ will still display the file names, but r to upper case. 3. Examine the file name for spaces. If a space is found, change to "1" the corresponding bit of the auxiliary type word, and change the space to a period. When files are read from disk, the file name and the auxiliary type infsteps when it saves one of its files to disk: 1. Zero all 16 bits of the auxiliary type word. 2. Examine the file name for lower case letters. If one is found, change to "1" the corresponding bit in the auxiliary type word and change the letteirectory auxiliary type word (+1FH) is used by 3EZ to control upper/lower case display of file names. Bit 80 of the LSB refers to the first character of the file name, bit 02 of the MSB refers to the 15th character, and so on. 3EZ performs the following refer to Apple's SOS Reference Manual, Volume 1, page 100. Three file types are reserved for 3EZ files: File type 19H, which are data base files. File type 1AH, which are word processing files. File type 1BH, which are spreadsheet files. The volume/subdmal numbers will be shown with a trailing H as in 1CH. Decimal numbers may sometimes be shown with a trailing D. Numbers without a D or an H are decimal values. DISK DIRECTORY INFORMATION: You may wish to htmost bit. "+": All addresses within an area will be relative to the first byte of the area. For example, the first byte of the area will be referred to as "Byte +0," the 10th byte would be "Byte +9." Hex/dec: All hexadecis Spreadsheet. WP: AppleWorks and/or /// E-Z Pieces Word Processor. 3EZ: AppleWorks and/or /// E-Z Pieces Bit 80: All bits are referred to by their hexadecimal value (base 16). 80 is the leftmost bit in a byte, 01 is the rigg. String: A 1BI followed by a number of characters equal to the value of the 1BI. PRODOS: All references to ProDOS apply equally to SOS. DB: AppleWorks and/or /// E-Z Pieces Data Base. SS: AppleWorks and/or /// E-Z Pieceas saved - R:SRL. /:MRL. +035 1BI Number of Categories per record. Values from 01H to 1EH. +036 - 037 1WI Number of records in file. +038 1BI number of reports in this file, (maximum of 8). +039 - 041 Ignore these bytes. +042 - 071 1BI for each of up to 30 columns, showing the number of spaces used for this column on the MRL. Be sure that you understand that categories may have been rearran record will end here. +379 - 400 Name of the second category, if any. This area will not be on the Header Record if there is only one category. +401... Additional 22 byte entries for all remaining categoe these bytes. ---- End of constant part of Header Record, variable length part follows ---- +357 - 378 Name of the first category. A string, maximum length is 20 bytes. If the file has only one category, the header ro.) +241 - 272 String, max length of 30 bytes. Comparison information for first line RAC selection rules. +273 - 304 Comparison for second line. +305 - 336 Comparison for third line. +337 - 356 Ignor 1WI continuation code for first line: 1:And, 2:Or, 3:Through. +237 - 238 1WI continuation code for second line. +239 - 240 1WI continuation code for third line. (not possible, so its always zeof the tests is to be applied. 1 means "equals", 2 means "greater than", and so on. +231 - 232 Test for second line of rules, if any. +233 - 234 Test for third line of rules, if any. +235 - 236 Zero means that there is only one line. +227 - 228 1WI category name for third line of RAC selection rules. Zero means that there is no third line. +229 - 230 1WI for first line of RAC rules, which ection rules. Zero means no selection rules apply, any other value refers to the category name that is tested. MSB will always be zero. +225 - 226 1WI category name for second line of RAC selection rules. MRL. Will be less than, or equal to the number of categories in the file. SRL displays all categories, so there is no equivalent number for SRL. +223 - 224 1WI for first line of RAC selappears in this position. These change as a result of changing the SRL. This number refers to the category names listed below. +216 - 221 Ignore these bytes. +222 1BI number of categories on 50 - 179 1BI for up to 30 categories on the SRL, the vertical screen position. +180 - 185 Ignore these bytes. +186 - 215 1BI for up to 30 categories on the SRL, which of the category names changing the layout of the SRL. 3EZ makes sure that these entries, and the vertical screen positions, are kept in order from left to right within top to bottom. +144 - 149 Ignore these bytes. +1ult of changing the layout of the MRL. +108 - 113 Ignore these bytes. +114 - 143 1BI for up to 30 categories on the SRL, the horizontal screen position. These are changed as a result of rs in each position. Byte +078 is the leftmost column of the MRL, and has a value from 01H to 1EH that defines which of the category names appears in this position. These numbers change as a resged on the MRL. Byte +042 refers to the leftmost column on the MRL. +072 - 077 Ignore these bytes. +078 - 107 For up to 30 categories on the MRL, the defined category that appearies. The size of this part of the Header Record depends on the number of categories. Space is not maintained past the last actual category. Note: The 22 byte category names break down as follows: +000 - 001 Length byte for each category record. +002 Control Byte - When the value in this byte is less than 128 it indicates how many bytes of data follow. If the value is greater than 1t, boolean (0 or 1) whether or not category names are to be printed. +161 - 163 Ignore these bytes. +164 - 196 For up to 33 columns of tables style: 99H means left justified, 0H 160 For up to 33 columns of tables style: 99H means no foot totals, 0 through 4 means the number decimal places for a foot total. For labels style: For up to 30 categories on the repor 80H, 81H, and 82H are the three calculated categories, from left to right. For labels style: same as tables style, minus the calculated categories. +125 - 127 Ignore these bytes. +128 - report. +089 - 091 Ignore these bytes. +092 - 124 For up to 33 columns of tables style: Values from 1 to 30D refer to which category name appears in this column on the report. Values ofght of justified columns. For labels style: vertical position on the report for each of up to 30 categories. 1BI. A value of 1 means that category is on the first line of a labels style at has the horizontal position of each category, relative to the left margin. +053 - 055 Ignore these bytes. +056 - 088 For tables style: number of spaces to be printed at the rie +020 is for the leftmost column on a tables style report. There can be up to 30 categories from the file, plus 3 more calculated columns. For labels style report formats, the value is a 1BI thytes, so the length can vary from 0 to 4800 bytes for these types of records. +000 - 019 String data containing the report name. +020 - 052 Column width (1BI) for up to 33 columns in a tables style report format. Byt--------- End of Data Base header type data -------------------- Report Records follow the Header Record. One of the Header Record categories (+038) tells you how many Report Records to expect. The number will be from 0 to 8. Each Report Record is 600 bte of 157 (128 + 29), followed by a length_word indicating the length of the data in category 30, followed by that data, containing a record-ending Control_Byte with a value of 255. -------------al byte is a 255, indicating all remaining categories are blank. A record with 30 categories, all blank but the last, would begin with two length bytes, then have a control by A completely blank record will take up three bytes of space no matter how many categories there are. The first two bytes indicate the number of bytes in the rest of the record, and the fin it means all remaining categories are blank and you have reached the end of the record. If there are no blank categories at the end of the record, there will still be a 255 marker. 28, it means that the next x categories are blank, where x = Control_Byte - 128. This will tell you the number of following blank categories to skip over. If the value is 255,through 4H means right justified with 0 to 4 decimal places. For up to 30 categories of labels style: Boolean (0 or 1) whether or not to float (OA-J) this category up against the category to its left on a label line. +197 - 199 Ignore these bytes. +200 1BI. Number of categories on report. Includes calculated categories, if any. +201 Tables style. If there is at least oin the same order that the category names appear in the Header Record. Bytes +0 and +1 are a Word that contains a count of the number of bytes in the remainder of the record. Byte +2 of each record will always be a control byte. Other control bytes withta Records follow the Report Records. The first Data Record contains the standard values. Each following Data Record corresponds to one data base "record." These records contain all of the categories within one stream of data. The category entries are . +479 - 592 Record selection rules. Exact same format as described in the Header Record section above. +593 - 599 Ignore these bytes. -------------------------- End of Report Record definition ------------------ Dad calculated category, if any. +464 - 477 If user has specified "Send special codes to printer," this is a 13 byte string containing those codes. +478 Boolean: Print a dash when entry is blankte string. Calculation rules for first calculated category, if any. +356 - 409 Tables style. Name and rules for second calculated category, if any. +410 - 463 Tables style. Name and rules for thir within each record.i +220 - 301 80 byte string. Title line for report, if any. +302 - 323 Tables style: 20 byte string. Name of first calculated category, if any. +324 - 355 Tables style: 30 byp totals, Boolean: just print the group totals. +218 Labels style: Boolean, omit line when all entries on line are blank. +219 Labels style: Boolean, keep number of lines the same Spacing. S(ingle, D(ouble, or T(riple. Expect these three values (S,D,T), even in the European versions. +216 Print report heading (Boolean - 0 or 1) +217 Tables style: If user has specified grou Top margin value. +211 Bottom margin value. +212 Lines per inch. 1BI - 6H or 8H. +213 Not relevant. Probably always a "C". +214 Type of report format. H: tables style, V:labels style. +215 or 50H. +206 Left margin value. All inches values are in 10ths. +207 Right margin value. +208 Characters per inch. 1BI. +209 Paper length value. 10ths of an inch. +210 ing which of the category names is used as a basis. Values from 1D to 30D. +205 Platen width value, in 10ths of an inch. For example, a value of 8.0 inches entered by the user will show as 80D Tables style: Same as +201, but for the third calculated category, if any. Labels style: not used. +204 Tables style only: If there is a group total column, a 1BI stat line on the screen that says "Each record will print NN lines." +202 Tables style: Same as +201, but for the second calculated category, if any. Labels style: not used. +203 ne calculated category, this is a 1BI containing values from 1H to 33D: to show which column of the report to print it on. Labels style: 1BI. Values from 3H to 21D. Position of in each record define the contents of the record. Control bytes may be: 01 - 7F (hex) This is a count of the number of following bytes that are the contents of a category. 81 - 9E This (minus 80) is a count of the number of categories to be skipped. For example, 82H means skip two categories. FF This indicates the end of the record. The information in individual categories may have some special coding so that date and time entries can be arranged (sorted)I);v:520: 500THPOS=4:I/2=I/2)I=I-1I=IBOTM THPOS=44:I/2<>I/2)I=I+1I2=-1:I=I-2:IBOTM<30THPOS=44I=IBOTM/2)*2:=+IBOTM/2)-1:0"PRINT.ALL": OA+P 3HA=(81+UCA)A=(81+LCA):::: OA+Q Quits 3IA=(83+LCA)A=(83+UCA)"PRINT.SHOW": OA+S 2JA=(68+LCA)A=(68+UCA)/Screen.Savers/HELLON=THPOS:B$(I);XA<8A>11540bA-7640,660,690,720l:=THPOS:B$(00 =Q:WW=0A=:A=21A=9&oldprefix$=40A=31410: Control C "aborts" program to Basic(:A=13770: Return Selects a file *DA=27:50: Escape to change disks/FA=324000: back out one directory level 3GA=(80+UCA)A=(80+LCA)SIC 0":150A$="TEXT 0":150A$="CAT 0":150A$="FONT 0":150A$="FOTO 0":150A$(L),"BLOCKS")510*=27:=19:"FREE MEMORY AVAILABLE: ";=7:=20:"80C";A$(L);$:=5:THPOS=4:I=1:IBOTM=J-1:620Q=:=26:=21:16; +Q Quits."r12);::"80C";a$;:+w#9,"DISKNAME.DAT":#9;DISKNAME$:#9|d$=DISKNAME$$=23:=0::"80C";d$;::12)201M=3:=14:"This /// SIG Disk is \^ 19";Р,2)", Washington Apple `, Ltd."=4:B$(1)="":B$(2)=""A$="BA16,B) THEN 240 #1, d$="":=10:"80C";d$ ž#1300I=0"I=I+1:#1;A$(I):290,#1 6L=I-1@j=1:same=0 J:SEG=0 Tœ2030^CT<1CT=1:CT>13000Zha$="{,|,~,}; selects; to new disk; J/2)=4:=+1:ۙ=44B$(J);:J=J+1I:1,180,22:2,280,21:2,2380,23:8A$(1000),B$(1000),C%(511),C$(20),name$(20):=10:=0UCA=128:LCA=UCA+32CT=15 IF PREFIX$= PREFIX$+MID$(B$(I),2456789:VOLUME NAME (/DISKNAME) OR DEVICE NAME (.Dx)"P12);::"80C";a$;:Zb$="CHANGING DISKS"$d=23:=0::"80C";b$;::12).n=12:=20:"MAKE A NEW MENU FOR DISK: ";N$xN$)<2110=N$ :210 I=1L(A$(I),A$))200B$0 WAP /// SIG MENU.MAKER PROGRAM (v. 6.2) =".D1"210: Coldstart (320: Warmstart &*X=11000: TEXT SLOW-DOWN LOOP ,X.1 CHANGE DISK SUBROUTINE23œ202:2200<RFa$=" YOU MAY SELECT YOUR DISK BY 9. --------------- This is the end of the Data Base file layout----------------- ill have the following format: +000 D4H (212D). Identifies a time entry. +001 Ascii hour code. A = 00 (the hour after midnight). X = 23, the hour before midnight. +002 - 003 Ascii minute code. Values from 00 to 5. Date entries will have the following format: +000 C0H (192D). Identifies a date entry. +001 - 002 Ascii year code, like 84. +003 Ascii month code. A = January, L = December +004 - 005 Ascii day of the month. Time entries w=+IBOTM/2-.5):I=IBOTM:I/2=I/2)I=I-1 œ2120B=B$(I),16)," ")-1 B$(I),"BASIC 0")850B$(I),"TEXT 0")890 B$(I),"CAT 0")1140*B$(I),"FONT 0")18504B$(I),"FOTO 0")1930>B$(I),"PASTXT 0")2070H540R\A$="RUNNING "+B$(I),16,B)f"79C";A$;:=0pB$(I),16,B) z::SEG=1".D1/SEG.T"t=+B$(I),16,B) yCT=CT+1~240:=24:=0:"@ ..... "DATE.TIME.LINE" ....JM=Ҡ,4,2))BTM1630,1640,1650,166 powers. The program comes as a boot-disk, making it useful directly as a utility. Boot it up, pick your poison from the first menu, and follow the prompts. Here is an example of what you get: ENCODER FILE prep.filetype 4 507265706172696E672046494C455 (3) find out the exact filetype of any SOS/ProDOS file; (4) change the filetype of any SOS/ProDOS file (which may or may not make the file useful within some other program); (5) allow you to construct other Business Basic programs incorporating these get it. Enter CODEFILE TRANSMITTER, a utility which: (1) can encode ANY SOS file, including driver, code, binary, etc, as an ASCII textfile; (2) decode that file and put it back onto disk in its original form, perhaps after downloading from a BBS;<>?@ABading that you wind up with a textfile calling for some hocus-pocus to make that program operable, and normal for terminal programs to only handle ASCII textfiles, so you really can't download a program or codefile directly. As for nifty driver files, for 08/15/1985 23:01:56 CODEFILE TRANSMITTER Length: 3000 chars. A public domain utility for the Apple /// Review by Michael Corbin It is typical of BBS's offerring public domain programs for downlo the program, so you only have to space out the direct reference to .D1/ and the program will access the default directory (which you should have set to a sub-directory on your hard disk) for the Startup program. This way, you can leave the drive door to How to Zap Super Applewriter to look for the STARTUP program on a hard disk: By: Ed Gooding You can easily zap Super Applewriter with a block editor so that it will NOT automatically access .D1 for the Applewriter Startup program. This is hard coded in G$:::320H: Error Routine 202:U=11:"79C";"BAD PATH ERROR (NO DISK IN DISK DRIVE OR DESIRED FILE NOT FOUND.)"X=11000:X:::210Z a$="{,|,~,}; selects; back 1 level;1600 &:WW=1:0 :SEG=1;".D1/S EG.F" SEG=1".D1/SEG.G"diskname$=3802  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T READ PASCAL TEXT FILES."04=10:"78C"NOVEMBER":1750M$="DECEMBER":1750826);"-";M$;" ";Ѡ,2));", ";"19";Р,2);" ";/П,2))=>13П,2))-12;џ,6);:1780$П,2))=0"12";џ,6);:ٟ;$П,2))=>12" PM-":" AM-" 1830WW=1530 =26:=21 0,1670,1680,1690,1700,1710,1720,1730,1740^M$="JANUARY":1750hM$="FEBRUARY":1750rM$="MARCH":1750|M$="APRIL":1750M$="MAY":1750M$="JUNE":1750M$="JULY":1750M$="AUGUST":1750M$="SEPTEMBER":1750M$="OCTOBER":1750M$=45950452E534F5552434520666F7220 5061 7363616C20456469746F7220616E6420417373656D626C65720D0D312E20 4672 6F6D207468652050617363616C20636F6D6D616E64206C696E6520656E74 6572 2074686520456469746F722077697468203C453E2E0D322E205479706520 696E 20746865206E616D65206F6620746865207265636F7264696E672066696C 6520 666F6C6C6F776564206279206120706572696F642E205468650D20202070 6572 696F642074656C6C732074686520456469746F7220746F206C6F6F6B2066 6F72 20616E2041534349492066696C652E0D332E205768656E20746865206669 6C65 (This ie, right? Wrong. I'm sitting here now, backups all done, hard disk volume reformatted, ready to restore my data files, my AR and Customer files, all this month's invoices... ... and Backup /// refuses to recognize the first disk of 16. Ik up all the files and reformat the volume, see if that chases the bad address away... only I don't have enough space on the other hard disk volumes for the data files, just for the program files. Okay, so I'll use Backup/// for them, always worked beforler's B)ad Blocks. Zero. Weird. There was some thunderstorm activity in the area, and the system has had spurious errors before in such situations, but powering down and back up has always fixed them. This time it didn't. So I figure, ok, I'll bacead a file from the AR volume, and it had never crashed before... but I ran DCHECK on the volume and it reported no block conflicts, no bitmap errors, no problem. Weird. So I ran Systems Utilities Verify Volume. 0 Bad Blocks. Same with the Pascal Fi an AR Aging report, an old and reliable program, and it suddenly crashed with an 'I/O error #64, device error - bad address or data on diskette'; this had never happened before. I ran the delivery routing program, it crashed with the same error when it rCEFGHIJKLMNOPQRSears, with nary a problem. Once in a while a bug pops up in the software, a little bad data sneaks past the data-entry routines, but I flush it out, close the loophole, and everything's fine. Until today. It started about noon. We were running Life without data, or... I HAVE TRUSTED THIS PROGRAM ONE TIME TOO MANY. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ I thought I had it all aced out. I've been running this system for almost three yvenue Lynchburg, VA 24503 (804) 845-0613 rs it for $10, and to spur its use here on ///'s Company, I'll make a copy of it for you for the same price. I think it might also be available off The Source. Michael Corbin 2904 Rivermont A download someone's latest creation, I can't always make use of it. I also can't send or receive those modified SOS system files, either.... OH, YEAH. There are at least two sources for CODFILE TRANSMITTER: Frank Moore, of /// Newsletter fame offeto see public domain and free programs (except, perhaps WPL, which is always a textfile anyway) materials available in this format. I don't have Business Basic, Pascal, or any other language. I don't CARE to become a programmer. As a result, while I cans truncated, but you get the idea.) The encoded file exists as an ASCII textfile, and contains all the information needed for the DECODER program to regenerate the original file. Just boot the disk at the other end, and decode it. I would like try copying the disk volume using System Utilities. No go. I try using the Pascal Filer. No go. I try using EDD. No go. I scream at the top of my lungs. About twenty-five minutes later, after I have tried all five machines in the house with no success, I get on the telephone. It's 8:30 on a Sunday night. Rod Whitten's home, he suggests Ed Gooding. Ed isn't home, so I leave a message. I try Daryl Andersen... he isn't home either, I leave a message. I try Ron Malpin in Austin, TX. I nevery night. 06/20/1987 22:24:29 After reading the Backup warning, I hesitate to use Backup ///. Any other suggestions? Steve Fleming 06/21/87 08:06:40 Steve: You really have no other choice at this time. I know of two developers who say they are develnd the cash. I would again implore all of you to never, NEVER trust Backup /// for important data... it may work once or twice or a hundred times, but that one time will come when it won't, for no particular reason... and you'll be crying like I was Sunda that have yet to be reposted before our AR files are back almost the way they were before this thing started. I'm pushing the boss to let us spend the $2500 it would cost for an Infax system from Darryl Anderson, and I have his agreement, just have to filizing all my AR files... and left here 36 hours after I had come in, with enough of the customer file re-entered to be able to enter the next day's orders. After my 12 hours sleep, I came in, and am now taking a break from entering the 300 or so invoicesn Martin was very kind to me Sunday night, and transmitted his Brainsurgeon program to me at 11:30, and coached me through its use... unfortunately it didn't work with my Corvus and Disk /// combination (he uses a CMC and A-143's) so I did end up re-initia do not have the combination, so that I will never again be able to rashly decide to use it. Anybody have a Megaflex card for sale? I hear those big old Shugart 8" drives are really reliable... Tom Betz 06/02/1987 19:57:01 From: Tom Betz Da Backup/// formatted disk in the house, I will delete the Backup/// program from my hard disk and my Catalyst menu, and reformat all but two copies of Backup///, just in case I might have missed something. These copies will be placed in a safe for which In this thing is over, and I have reconstructed my data files, I am going to try to restore on regular floppies or hard disk every file I now have stored in Backup/// format. Those disks I can not restore will be reformatted. When I have gone through everyfor an hour and a half, after moving and backing up files for the five hours before that. I still have no answers... ...except that I know I'll be here all night, because Apple Computer abandoned us with shoddy backup software... and I know that whe don't mind reconstructing... it's a minor auditing file, a convenience, on which nothing depends... but because I trusted Backup/// for it and 10 other files, those 10 files are lost to me forever. It's now 10:00 PM. I've struggled with the question constructing the AR and Customer indexes and product preferences and on and on... I have sixteen disks here. Backup/// reported that all the disks formatted and verified correctly , I know, I watched. The first disk is covered entirely by a file I be closing out the month, so that I can begin the long hours of data entry from paper invoices and old posting journals and statements that I will need to re-construct the Customer file, the Invoice files, the AR Open Invoices file, and then more hours reem a bit, and gives me Chris' number, but Chris won't be there until Monday... I thank him, but I know in my heart that tomorrow will be too late. I know in my heart that I'm going to have re-initialize all my data files very early tomorrow when I should talked to Ron before, picked his name out of OnThree, but he's a real nice guy, and tries to help. He commiserates, says he doesn't use Backup ///, doesn't trust it, I say (bitterly) neither do I anymore, and he says Chris Acreman's messed with this probloping an alternative to Backup ///, but for now, "it's the only poker game in town." There are a few things that you can do to lower the risk of being bitten, however. One, download a Pascal program from the Programming/Pascal/Sample.progs.4 section called Disk.Map.Check. Convert it to a codefile as follows: 1) Read the Disk.map.pas file into Applewriter and remove the comments at the beginning of the program. With the comments, the source code is greater than 32K, and the Pascal E)ditor will gning clock, Set_Time stores the contents of the buffer as the last valid time, to be returned on the next Get_Time call. Required Parameters: Time:pointer This is a pointer to an 18-byte buffer containing the current date and time. The information is sity of Colorado Health Sci. Center 01/07/88 18:55:33 Mark: You address the clock chip via two SOS calls: Set_Time SOS call $62 This call sets the system clock to the contents of a buffer located at the specified address. If the system has no functio tell the 6502 to set the chip? I do not know the address for the chip. Does anyone out there know? Also how does the Apple /// address the expansion slots? I know the address for the Apple II, $CN00, what is it for the Apple ///? Mark Segall UniversTVWXYZ[\]^_`abct learning how to program the 6502. I have installed a MM58167A clock chip in the space for the clock chip that was supposed to come with the Apple ///. This chip can be programmed to send an interrupt signal to the 6502. What I need to know is, How do I Title: How do I address the clock and slots? - Created by SYSOP file <%AJ89083331> 01/19/1989 08:33:30 Does anybody know how to address the add-on clock chip for the apple ///? I put in a MM58167A chip, how does an assembly program access it? I am jusany disk drive accesses. To do this, you use the L)ink function from the Pascal command line. For the first prompt, key disk.map.code. For the second prompt, key disk.map.link. For the 3rd and 4th prompts, just key a carriage return. For tt to the printer if you would like to see what a 6502 program listing looks like. 6) Now, we need to put the Pascal codefile and the 6502 codefile together in one program so that the Pascal part can call the 6502 part whenever it wants to do used for the user interface and the printing, etc. This is a good way to write professional programs and makes them run really fast. For the input prompt, key disk.map.asm, for the output file key disk.map.link. You can also direct the outpu the Error file prompt since we know that the program will compile cleanly. 5) When that finishes, you will need to A)ssemble the disk.map.asm file into a 6502 codefile. This codefile does most of the disk drive handling, the Pascal code ishe input prompt, key Disk.map (you can leave off the text, the compiler will automatically append it.) For the output prompt, key Disk.map.code. If you want a printout of the compile, then key .printer to that prompt. You can press return atto disk as Disk.map.text again. 3) Read Disk.map.asm into the Pascal E)ditor and convert it to Pascal Text as in step 2 above. 4) Next, C)ompile Disk.map.text into a pascal codefile. For compile options, key an exclamation point (!). For tag on it. Save it back to disk as disk.map.text. 2) Read Disk.map.text into the Pascal E)ditor and convert it to a Pascal Text file by the use of the S)et E)nvironment A)scii F)alse CONTROL/C key sequence. Then press Q)uit and S)ave it back pecified as an 18-byte ASCII string whose format is: Y Y Y Y M M D D X H H N N S S X X X The meaning of each field is as below: Field Meaning Minimum Value Maximum Value ----------------------------------------------------------------- YYYY Year 1900 1999 MM Month 00 or 01 12 (December) DD Day 00 or 01 28, 30, or 31 X N/A HH Hour 00 (Midnight) 23 (11:00 PM) NN Minute 00 ch 6502 programming on the ///, you would be well advised to pick up a set (2) of these manuals. Regards.......Ed Gooding, Sysop P.S. As regards addressing the slots, you need to acquire another /// manual, titled, "The Device Driver Writers Guide". Thie that the buffer pointed to by the time can hold all 18 ($12) bytes to avoid overwriting other data or program instructions. ERRORS: No errors are possible. Mark, this info is direct from pages 95-98 of the SOS Reference Manual. If you intend to do muth is 2; February 29 will NEVER be generated by a system with a functioning clock. A system without a functioning clock can return February 29 if that month and date have been set by a Set_Time call. The clock does NOT roll over the year. You must ensur Get_Time returns a string of 18 ASCII zeros. SOS calculates the day of the week from the year, month, and day. The clock will only generate days in the range 1...30 if the month is 4,6,9, or 11. It will only generate days in the range 1...28 if the monample, Friday, March 21, 1980 at 1:27:41 PM, would be returned as: 198003216132741001 COMMENTS: If the hardware clock is not operational, the utility manager retrieves the last known valid time from system RAM. If no last known valid time is stored, W Day 01 (Sunday) 07 (Saturday) HH Hour 00 (Midnight) 23 (11:00 PM) NN Minute 00 59 SS Second 00 59 UUU Millisecond 000 999 For exnimum Value Maximum Value ----------------------------------------------------------------- YYYY Year 1900 1999 MM Month 00 or 01 12 (December) DD Day 00 or 01 28, 30, or 31er This is a pointer to an 18-byte buffer containing the current date and time. The information is specified as an 18-byte ASCII string whose format is: Y Y Y Y M M D D X H H N N S S X X X The meaning of each field is as below: Field Meaning Mie. Get_Time SOS call $63 This call reads the time from the system clock and returns it to the buffer located at the specified address. If the system has no functioning clock, Get_Time returns the last known valid time. Required Parameters: Time:pointctioning. IMPORTANT NOTE: The clock does NOT roll over the year!! The format of the Set_Time string is the same as that of the Get_Time result, except that Set_Time ignores the day of the week and the millisecond fields. ERRORS: No errors are possiblttempts to set the hardware clock, whether or not it is present and functioning. It also stores the new time in system RAM as the last known valid time; this time will be returned by all subsequent Get_Time calls if the hardware clock is missing or malfuneral restrictions: it rejects any invalid combination of month and date. The clock only accepts days in the range 1...30 if the month is 4,6,9, or 11; it only accepts days in the range 1...28 if the month is 2; February 29 is ALWAYS REJECTED! Set_Time aes the day of the week and the millisecond. SOS calculates the day from the year, month, and date (probably using Zeller's Congruence). SOS does not check the validity of the input data to make sure each field is in the proper range. The clock makes sev 59 SS Second 00 59 XXX N/A For example, December 29, 1980 at 9:30 AM would be specified by the string: 198012290093000000 COMMENTS: On input, SOS replaces the first two digits of the year with "19" and ignors will give you all the info you need to address the 4 slots. You can also download and study some of the driver programs here to see how others have done this. 01/08/1988 09:58:31 For a quick answer, the Apple 3 slots use the same addresses as the Apple // slots: Cn00-CnFF for the ROM, and C0x0-C0xF for the I/O, where n is the slot number and x is the slot number + 8. The expansion ROM at C800-CFFF is also available. All of these are compatible with the Apple // so that emulation mode will work. Bu personally find very frustrating, so I would recommend using .CONSOLE status calls to detect and clear the keypress. BTW, to disable the keyboard interrupt, write $01 to $FFEE; to enable it again, write $81 to $FFEE. Rick From: Robert L. Consorti Mr. that interrupt, $C010 is the correct location to clear the keyboard strobe---but make sure that you clear it before reenabling the keyboard interrupt or the .CONSOLE driver will catch it then. Note that this will prevent any type-ahead by the user, which Ith also)? Thanks in advance! Don From: Rick Sidwell Actually, I am a bit surprised that you can detect keypresses like that; they normally cause an interrupt which the .CONSOLE driver handles by reading the key and clearing the strobe. If you disable dfghit a key by reading $C000 but have been unable to clear the keyboard strobe at $C010. I have tried playing with the environment register but have had no luck. Does any one know how to clear the keyboard strobe (from assm of course but would be useful in For Title: How do I clear the keyboard strobe? - Created by SYSOP file <%AJ89083048> 01/19/1989 08:30:47 From: Donald Short I am writing Desktop Manager modules and wish to exit with an Escape key without actually reading from the .console. I can detec Mark Segall ll help me set the interrupt mode. (I haven't yet loaded Reid Trimble's program, but that's next.) Mark Segall Do you want to read replies to this file? -> p the other device drivers. I want to thank Reid Trimble for sending me a copy of the Jeppson article that gives the clock address. It will help me set the interrupt mode. (I haven't yet loaded Reid Trimble's program, but that's next.) wtown Square, PA, 19073, USA; 215-353-2203). It is a card designed for the Apple II, that takes in 16 channels and costs $299. It has worked in the apple II emulation mode. I now need to develop a device driver for the Apple ///; I certainly will look uS is located in the memory shared with it). Rick Sidwell 01/26/1988 20:05:27 Thanks for the information. I'm setting up an Apple /// to collect data via an analog/digital card. The card is the AI02 from DAISI Electronics Inc., (Post Office Box K, Neh those on the CPU). But as Ed recommended, you really should get the device drivers writers guide if you need to do I/O directly with the slots (and do that I/O from a device driver--SOS might get upset if you leave the I/O space enabled since part of SOt, before you can use them in native mode, you must play with the environment register--the I/O space must be enabled (otherwise these locations will simply address RAM), and 1 MHz. mode must be set (so that the timing signals on the slots are in synch witShort, It is possible to read from the keyboard strobes directly, but I have to ask why? If your accessory needs to be processing something and leave when the ESC key is pressed, simply go into one or two-byte no-wait mode and read from the console - legally. On entry to your accessory the X register contains the reference number of an open .CONSOLE. We took great pains in designing The Desktop Manager so that you would be assured of having an open .CONSOLE without having to open it yourself. If you conpqr the Desktop Manager's Cut & Paste function, and Don Short's soon to be released File Type Changer DM module: SOS/PRODOS File Types File Type Description --------- ------------------------------ $00 Typless File $01 Bad Block Title: What are legal file type codes? - Created by SYSOP file <%AI89222834> 01/18/1989 22:28:33 From: Weber Baker Does anyone have a list of the valid SOS and PRODOS file types available? Weber: Here is a list that I compiled with the help of If it is a character, I have not been able to identify it. It is not a series of underscores, across the "bottom" of the line of characters. It looks more like a series of hyphens, across the "middle" of the line, except the hyphens span the full widt August 21, 1986 File Length: 7,000 chars. From: Chris Acreman Does anybody know how programs like System Utilities and Backup // draw those horizontal lines across the screen? They don't use the GRAFIX driver. 00-BFFF is interpreter space. C011-C02F, C031-C03F are all softswitches and accessing them will give you a variety of beeps, clicks, and system failures. I can't recommend you using any of these memory locations. They are NOT really "free". - Tim Do y Weber From: Tim Harrington Weber: I can't remember what those other locations are but C800-CFFF is temporary memory for interface cards. Only interface cards are suppose to use this memory. You CANNOT use any of the memory you asked about. A0jle are a number of memory areas that are marked 'open' (such as addresses A000-BFFF) or not used (as C011-C02f, C031-C03f). Are these useable for anything. Also, addresses C800-CFFF is marked for 'expansion ROM Firmware'. Is there any use for this either. Title: Are there some unused memory areas? - Created by SYSOP file <%AJ89082840> 01/19/1989 08:28:38 From: Weber Baker Looking through the /// Tech manual at the major memory address for info dealing with the RS232 port I noticed some things: Ther working properly. - Bob Consorti - Do you want to read replies to this file? -> uld drop me a note on the application or type of mode your accessory needs to be in, I'll be glad to help you in putting the right code together so you won't have to circumvent SOS. When you read directly, you mess-up any chance of macros and other things File $02 Pascal Code File $03 Pascal Text File $04 ASCII Text File $05 Pascal Data File $06 General Binary File $07 Font File $08 Graphics Screen File $09 Business Basic Program File $0A ig file (well, I'll use includes but even then I'm not looking forward to the turn-around time for changes). - gary - 04/03/1987 00:58:50 Gary, you can split your code files up and then just merge them together when you're all dn (at the start of the file). Steven From: Gary Kato Steve, Thanks, but I was wondering if there were a way to allow me to keep my code in several separately assembled files that get linked later. I have a feeling I'll have to just assemble it as one b .end Hope this is helpful. When assembled, the value of codelen (at the end of the file) is calculated by subtracting the value of start ($9000) from the current value of the location counter ($90F0). The result ($00F0) is assigned to codeletable code starts at this point, we'll leave it out for brevity and resume with how the variable codelen is used to get the length of the code portion} 90F0| 00F0 codelen .equ *-start ;calculate #bytes in program 90F0| .ascii "SOS NTRP" ;label for SOS.INTERP 8FFA| 0000 .word 0000 ;optional code length = 0 8FFC| 0090 .word start ;loading address 8FFE| **** .word codelen ;code length 9000| {execusuvwxcommends it be done. Following example courtesy of SOS Reference Manual, volume 1 -- 0000| 9000 start .equ 9000 ;code begins at $9000 0000| .org start-0e ;leave 12 bytes for header 8FF2| 8FF2| 53 4F 53 Title: How do I calc. the size of my program? - Created by SYSOP file <%AI89222516> 01/18/1989 22:25:15 From: Steven Brineaux Gary, regarding your question about how to calculate the length of a code file -- I'm transmitting an example of how Apple reFile (EDASM) $FF ProDOS System File ------------------------------------------------------------------------------ - Do you want to read replies to this file? -> File $F1-$F8 ProDOS User Defined Files 1-4 $F9 ProDOS Reserved $FA Integer Basic Program File $FB Integer Basic Variables File $FC Applesoft Program File $FD Applesoft Variables File $FE Relocatable Code 20 Global File (Desktop Mgr) $25 Desktop Manager $26 Desktop Manager Option $27 Note Pad File (Desktop Mgr) $28 SubLoad File (Desktop Mgr) $29-$EE Reserved $EF Pascal Area $F0 ProDOS Added Command File $14 AppleFile Report Format File $15 Screen Library File $16-$18 SOS Reserved $19 AppleWorks/3EZP Data Base File $1A AppleWorks/3EZP Word Proc File $1B AppleWorks/3EZP Sprdsheet File $1C-$1F Reserved $ Business Basic Data File $0B Word Processor File $0C SOS System File $0D- $0E SOS Reserved $0F Directory File $10 RPS Data File $11 RPS Index File $12 AppleFile Discard File $13 AppleFile Modelone. That way your assembly time goes way down. The only problem is that you have to have an easy way to equate labels from one file so that another file knows where to jump to get to the code in one of your other files. The easiest way to do this is pick one spot in memory that you put all the necessary jump tables. That way you can have one include file that jumps to the different routines through this table. This will allow you to have one include file with the jump vectors equated out to their correhe output file prompt, key disk.map.code (yep, same as the first prompt.) When the link finishes, you will have an eX)ecutable Pascal program. I installed this as a separate entry on my Catalyst menu. See the directions for installing si DATA to FONT, and finally used ON THREE's FONTDEMO program (in BASIC) to look at the complete character set: Nothing there that would satisfy your question. I know that's no help in identifying how it IS done . . . - Bart Cable Chris/Ed/Harry/Bart/All, Those lines you're asking about don't seem to be any special characters in the character font--I've used the FONT CAPTURE program in DL7 to extract the character set from a SOS boot disk, then used the ENCD3.BAS program to change the filetype from PASCALg it from the Pascal system (i.e., not as the SYSTEM.STARTUP program, then using Control-\ to break out of the program. The characters will be intact. (Sorry, I can't remember where they are--try the highest control characters). Rick Sidwell Chris - ofile as a normal Pascal program. The .CONSOLE driver has a control call for downloading a few characters. System Utilities redefines a few characters for its `graphics', and restores the original characters when you exit. If you have Pascal, try runninore details; this was news to me, also. Thanks, Rick. Ed Chris/Ed/Harry: The underscore-like characters are made with custom characters, but they are not in the font on the system utilities disk--otherwise, how could you run system utilities from your Prarry: See Rick Sidwell's response to Chris below. I was wrong about the font, it is done differently. It appears to be done exactly the way you want to replace your font characters and then restore them. I suggest that you get in touch with Rick for mfonts from within a Pascal Program? I.e. - can you modify specific characters or completely replace the entire font setup. I want my application to use a custom font set and then set it back to normal when the program terminates. Thanks. Harry Baya He here in ///'s Company for a Pascal program that will extract the font from any boot disk for you and save it in a separate file, from which you can then install it on any boot disk of your choice by using the SCP. ....Ed Ed, Is it possible to change n to look at it. It is possible that these are characters that are assigned to Ascii 0-32, i.e. control characters. Capn Magneto works off this principle. Weber Baker Chris: I believe both programs are using a custom font. I have the source codh of the character. If that is an ASCII character, I haven't found it. Thanks for any help you may offer. Chris Chris; If you have a program for font editing like Fontwriter or Draw On ///, you can load the entire font imz{|}~ct values that you can use with all your assemblies. Of course this only allows you to split your assemblies up into major chunks, but in the right circumstances, it can be useful. Obviously this only applies to absolute code. - Tim Do you want to mple Pascal programs in the Catalyst docs. 7) Ok, now for what this program does.......of course, read the docs file by loading them into Applewriter and printing them out for a full explanation.....but, basically this program waltzes through your Profile, checking the bit map of every single file, making sure that there are no blown bitmaps, making sure that two files don't think they own the same block, and lot's of other goodies. It will also AUTOMATICALLY FIX a lot of data inttz I have resolved never to use that sucker again... but then, I have a business doing my buying here. We have ordered, and should receive today or tomorrow, an INFAX 20-Meg Bernoulli-type device from D.A. Datasystems, and will use it to make file-by-filPascal/Sample.progs.4 section. e) It probably wouldn't hurt to offer a prayer to whomever you choose to worship before backing up, and definitely before you try to restore. Good luck.......Ed Gooding, Sysop 07/09/1987 14:12:58 FROM: Tom Beyou to extract important files from Backup /// diskettes. This may save you from having to do a lot of data entry into your /// if all of the above fails. The Brain.Surgeon program is also in the Apple.iii.help/Programming/ore generation, if that one fails, you can go back one generation further. If that one fails, all is not necessarily lost. Dan Martin has uploaded a program here named Brain.Surgeon that, when used with a block editor, will allow the first session. For the fifth backup session, use the backup diskettes from the second session, and so on. This way, you will always have 3 full sets of backup disks. If your most current set fails, then you can go back one mettes. It works like this: For the first backup, use a fresh set of formatted diskettes. For the second and third backup sessions, use fresh disk- ettes, also. For the fourth backup session, use the backup diskettes frome disk drive hub. If it's not, then you may not be able to read tomorrow what you write today. d) Use a generation system of backup disks, with at least two generations Three is even better, even if it does tie up a lot of diskctually, you should get used to doing this on ANY diskette that you write. Insert the disk into the drive and close the door, then re-open the door, and close it again. This will ensure that the diskette is properly centered on the Program to check the speed of the floppy drive that you are going to backup to so that you know that the drive is within specs. c) When you run Backup ///, make sure that you double clamp the disk drive door on every disk. Aram here on ///'s Company called Disk.Cleaner. It is in the Public.domain/Utilities/Section.3 area. Do a good clean job on the floppy to which you are going to backup your Profile. It would also be a good idea to use the Confidenc// will backup up garbaged data from your hard disk, and never say a word to you about it, UNTIL you try to restore it back (nice, huh?). b) Use a commercial floppy disk driver cleaner disk in conjunction with a Bus. Basic progs return at the prompt for where to send the output. 8) Ok, now back to how we improve our odds of getting a good Backup /// run: a) Run Disk.map.code against your hard disk to ensure that what you are backing up has integrity. Backup /to go in with a disk block editor to salvage or repair a file manually. It will be slow running to print all this out to your printer, but I would recommend doing it every 6 months or so. For weekly use, you can use the verbo=0 level and presegrity errors, without any intervention from you. Also, if you choose the verbosity level=4, and send the output to your printer, it will print a disk map that shows every block that each files occupies on your profile, handy if you ever have e backups from here on out. That way, barring a real stupid screwup, the worst a bad block or bad data can do is destroy one file. This is an expensive ($2400) solution, but that's a cheap price to pay for real data security. I would also advise anyone buying his first hard disk that this is a wise investment >instead< of a hard disk, because you can have another ten megs anytime for 59.95 from Lyben Computers, and have complete backup for that ten megs for another $59.95. If I could just get it to work The assembler preserves the sign bit when it divides, so x/256.&0FF extracts the high byte only if x is positive. If x is negative, try this incantation: ~x/256.^0FF. By the way, why did you add one before dividing by 256 in your example? Rick From: Ga then the immediate operand to the lda assembles as it should, the high byte of the address start. If x >= 8, then the immediate operand assembles as the high byte of the address start PLUS one. Can anyone think of a reason for this? From: Rick Sidwell Title: A discussion of using absolute code - Created by SYSOP file <%AI89222117> 01/18/1989 22:21:16 From: Gary Kato Here's the program: .absolute .proc foo .org 0x000 start lda #start + 1 / 256. & 0ff end If x <8, Pascal device numbers. Do you want to read replies to this file? -> c., until you get an error, when you can stop. Now, to correct the small lie above. If you are using Pascal, you can use UNITSTATUS(0,data,0) as described on page 125 of the Pascal Programmer's Manual, Volume 2 to get the SOS numbers corresponding to theo 24 ($01 to $18 hex). You will get an invalid device number error for each one which does not exist. I am fairly sure (but not positive, so check it) that the driver numbers are consecutive, with no holes, so you can call D_INFO for device 1, then 2, ett the drivers load into the highest bank below the interpreter -- but beyond that I'm stuck. Steven From: Rick Sidwell This must be done from assembly language, with a SOS call. Just do a D_INFO call for each possible device number; they range from 1 t Title: How do I tell which drivers are loaded? Created by SYSOP file <%AI89222219> 01/18/1989 22:22:18 From: Steven Brineaux Ok, I give up! How does my program find out what drivers are loaded into the system? I've been studying this and I know tha on our Constellation II network, i'd be in hog heaven. ry Kato Rick, What do you mean by preserving the sign bit? If you mean it sign extends, then the & 0FF should take care of that. What happens is instead of getting A0, I get A1 as the high byte for something at A000. That is most obviously wrong no matter what kind of math is used. I added one because the address is to a string (byte count, then the chars). I was using a macro to do a Write to the Console and have to skip past the byte count. - gary - From: Rick Sidwell Actuallizontal bars, and curved corners. You can also do left and right arrows, etc. Save the character set to a file name to be loaded later by a Pascal program. 2. Set up your program to read the font file from step 1 above and send it to th System Utilities, they exist in the ASCII values from 16 to 31. To do this yourself, you will need to perform the following: 1. Use a font (character set editor) to create your own character set which contains special charcters for vertical and hor The characters which do the borders in System Utilities and similar packages are special characters which are downloaded AT THE TIME THE APPLICATION IS STARTED. They appear to be within the program code itself, and are not a separate character set. Forl. Do you want to read replies to this file? -> to play along with the assembler, and use the kludge of storing important addresses in a seperate location--not strictly necessary for absolute mode programs, but that's how the assembler works since it is necessary for the relocation scheme used by Pascahere is no reason that part of the interpreter MUST go into A000-B7FF, but SOS puts the interpreter from whereever the beginning address is to B7FF, so even if no physical code is there, that space is considered to be part of the interpreter. My advice isute operands, which include operands defined with .equ and addresses in absolute mode which were defined BEFORE you use it. Too bad there isn't a better assembler available. By the way, I am convinced that SOS was not written using the UCSD assembler. Tdocs, some part of the interpreter must have to go into A000-B7FF. - gary - From: Rick Sidwell The more I use the Pascal assembler in absolute mode, the more I am convinced that that mode was added as an afterthought. You can use any operators on absolter has enough code to enable the data to assemble at < 8000 Damn these MONNCIs! but your code reaches into A000. I tried assembling up at 2000 (and 4000), but when I try to execute from Catalyst it says "Interpreter too large". From what I can see in the tways it gives me an ill-formed expression error. I thought when using .absolute one could use any operators. Sigh. The lesson here is to put your data structures in front of the code (except for the header for interpreters). This works if your interpre(e.g., /256.&0FF). Rick From: Gary Kato Rick, Thanks for explaining it to me. Wish there were something built into the assembler to extract the high byte of an address. BTW, the ~ operator seems to work on constants but not on addresses. Leasn unsigned number is FFA1. There are two ways around this problem: take the one's complement before dividing and again afterward (done most efficently by ~x/256.^0FF since you and the result with FF) or make sure the low byte is zero before the division y, x/256.&0FF works fine for A000; the problem you are having occurs only when the low order byte is non-zero. Take, for example, A001, which is actually -5FFF. Now, -5FFF/256. is -5F (since the remainder of FF is discarded), but converting -5F back to ae console driver. See the Pascal Programmer's Manual Volume 1 (pg 211 - UNITSTATUS) and the Standard Device Drivers Manual (pg 70 - Control code 16 [Download Character Set]). 3. Use the UNITWRITE procedure (see Pascal Programmer's Manual Volume 1 - page 207) to send the character values to the screen to create the "box" where you want it or to send any other of the special characters to the screen. As I remember, you have to add 128 to the value of each such character so that use the normal character set. This isn't very difficult to do, but it requires the use of assembly language, and is thus a bit tricky. For purposes of this discussion, let's use Pascal. Similar techniques can be used with other languages. To begin witch uses custom characters to draw boxes around things and display arrows as they appear on the keyboard to help the user. However, any program which changes the system character set should be careful to restore it before exiting so that other programs canto change the character set used to display characters on the screen easily from a program. A program can define its own characters to perform special effects such as drawing graphics on the text screen. A good example is the System Utilities program whiontributed by Rick Sidwell, and answers the questions posed above about manipulating characters sets from within an application program: DOWNLOADING APPLE /// CHARACTER SETS One of the powerful features of the Apple /// is the ability ly: 10 INVOKE "download.inv" 20 DIM a%(512):array$="a%" 30 INPUT"What font do you want to use? ";a$ 40 expr$=CHR$(34)+a$+CHR$(34) 50 PERFORM getfont(@expr$,@array$) 60 PERFORM loadfont(@array$) 70 END --Erik Olbrys 09/12/86 13:13:36 The following was c Thanks, Harry To All: Just about everything you want to know about loading fonts: "The Changing Character(s) of the Apple ///" by John Jeppson Softalk, April 1982. Pages 135-142 The program in the article is in MAUG's DL7 under the name "JEP" brief sample code to modify fonts from within a program. It could be as short as just the lines to cause the actual change - without a good demo program - or whatever you want. Have a good vacation and I and Chris will remind you, gently, when you get back. eturn, I WILL bug you about this, gently of course. I will very much appreciate your help since I know boobkis about assembly language. Thanks for your tips and I'll look forward to that "tutorial". -- Chris Rick, I too would greatly appreciate somee changing it in the first place. The current character set is stored at locations $C00-$FFF. You will need an assembly language procedure to access these locations from Pascal. Rick Sidwell Dear Rick, Please do enjoy your vacation, but when you racation). You use the CONSOLE driver control code 16 (for the entire character set) or 17 (for just a few characters) to change the character set to what you want. To restore it, you use the same codes! The trick is to save the original characters beforo show the control characters, and implement it within System Utilities. Hope this helps. Best Regards, Milt Johnson To All: I'll tell you how to do it, but I won't have time for a couple of weeks to come up with some code to do it (I'm going on vharacters. If you have Daryl Anderson's Ascii Chart module you can view the characters used in System Utilities by activating it within System Utilities. If you have Desktop Manager, ask Bob Consorti for a copy of his Ascii Chart module that I modified tr as specified in the Standard Device Drivers Manual. As an alternative to step 1 you can define bit patterns for the characters you wish to modify in your Pascal program and use the Control Code 17 (Load Partial Character Set) to create the special c it will not be interpreted by the console driver as a control character. For example, if ASCII 16 is a horizontal bar you have to send the ASCII value 144 to the console to get the character, rather than the control effect of setting the coloh, we need to have a TYPE for character sets: Type Charset = Packed Array [0..127, 0..7] of 0..255; A character set consists of 128 characters (numbered 0 through 127), each consisting of 8 rows. Next, we need a procedure to download character sets. Referring to the Standard Device Drivers manual, pages 70 and 169-171, the following procedure will do the trick: Procedure LoadCharset(C:Charset); Var RequestCode: Packed Record Channel: 0..1; then link it into your program. It defines a procedure called SysCharset which copies the current character set into a Pascal variable. Here is an example program to demonstrate its use: Program TestCharset; Type Charset = Packed Array [0..127, 0..7] r those familiar with assembly code; the only tricky part is saving the X-byte of the variable we use to access system memory (SysSet) and restoring it before returning so that Pascal will not get confused. To use it, copy it into a file, assemble it, andif we reached $1000) CMP #10 BCC NxtChr PLA ;Restore X-byte for Pascal STA SysSet+1601 PUSH Return RTS .END The code is straightforward foChr LDA (SysSet),Y ;Copy a character STA (Ptr),Y INY ;Do next one BNE NxtChr INC Ptr+1 INC SysSet+1 LDA SysSet+1 ;See if done ( STA SysSet LDA #0C STA SysSet+1 LDA SysSet+1601 ;Save old X-byte PHA LDA #8F ;System charset is in system bank STA SysSet+1601 LDY #0 Nxt .proc SysCharset,1 POP Return ;Save return address POP Ptr ;Get location to put charset LDA #00 ;Set up pointer to system charset PHA .ENDM ; Some zero page temporaries Return .EQU 0E0 ;To save return address Ptr .EQU 0E2 ;Pointer to user's variable SysSet .EQU 0E4 ;Pointer to system charset face: Procedure SysCharset(Var C:Charset); ; Some standard macros .MACRO POP PLA STA %1 PLA STA %1+1 .ENDM .MACRO PUSH LDA %1+1 PHA LDA %1 or the convenience of programmers not proficient in assembly language in the Apple ///, here is a complete assembly language procedure which copies the character set. ; Assembly procedure to copy the system character set to a user variable ; Pascal interyone can read this character set, but only the .CONSOLE driver should modify it so that it remains consistent with the character set displayed on the text screen. Copying data from system memory to Pascal memory can be done only from assembly language. Fs stored in system memory at locations $C00-$FFF. The .CONSOLE driver stores the new character set here as well as loading it into the character generator so that the .GRAFIX driver can use it for drawing characters onto the graphics screen. Note that an, so good; now for the tricky part: restoring the system character set. To do this, we need to copy the system character set before we download our own; restoring it when we are done is as easy as another call to LoadCharset. The current character set i RequestCode.Stat_or_Ctrl := 1; RequestCode.Request_Num := 16; UnitStatus(1,C,RequestCode); End { LoadCharset }; This just performs a UnitStatus to the .CONSOLE driver with a request code to download a character set. So far Stat_or_Ctrl: 0..1; Request_Num: 0..255; Reserved: 0..63; End; Begin { LoadCharset } RequestCode.Channel := 0; RequestCode.Reserved := 0; of 0..255; Var SysSet: Charset; C: Char; S: String; F: File of Charset; Procedure SysCharset(Var C:Charset); External; { The assembly language program to get the system character set } Procedure LoadCharset(C:Charset); { Loads the character set C into the character generator } Var RequestCode: Packed Record Channel: 0..1; Stat_or_Ctrl: 0..1; Request_Num: 0..255; Reserved: 0..63; End; Begin { LoadChais 6502 PRIMS2 library unit (LINKED INTRINSIC) {$p---------------------------------------------------------* | PRIMS2 - String Version of Primitives - Updated 08/28/83 | *----------------------------------------------------------*} bout C to make a meaningful comparison. I'd be interested in comments... if you like, I'll run Codefile Transmitter over the Unit and upload it... what do you think? Tom Betz Segment #38: System version = A3/2.0, code type ovided by LIBMAP.CODE; some interesting routines named here, as well as the major control characters defined as constants. Anybody have any ideas what they are? I have heard them mentioned in terms of Kernigan and Ritchie.. don't know enough a will find the file, as I prepared it for upload: Tom Betz ---------------------------------------------------------------- Friends and fellow ///ers! As promised so long ago, here's the INTERFACE section to the PRIMS2 Library Unit, as prth a little experimentation, one or more ingenious hacker could figure a way to load ANY character set using them. As a side benefit, of course, one also has the handy file selection and keyboard I/O capabilities provided by Dirstuff available. Below youalso used to examine System Utilities... got the unit names, but no interface there) and provide here for your perusal. Note that these routines do all those things WITHOUT requiring the .GRAFIX driver... they are entirely self contained, and I am sure wiATUNC, and that documentation also covers some of the Prims2 routines, although it never specifically mentions them as Prims2. The only documentation for Prims2 is the comments in the INTERFACE section, which I have extracted using LIBMAP.CODE (which I runched" into the SYSTEM.STARTUP codefile using a Library Kruncher program, which strips away the interfaces and binds the units together with the codefile. The Dirstuff unit is well documented in the "Pascal Programmer's Toolkit Manual" available from t this discussion has been going on here... I was just about to upload a related file, so I will do it here. System Utilities uses to handle its windows, horizontal lines, etc. characters established by the Dirstuff and Prims2 units, wwhich have been "Kess Basic so that programmers can write Basic programs which use custom fonts but restore the system font before exiting. ------------------------------------------------------------------------------- 10/03/1986 01:31:18 I find it very interesting thaERCISES 1. It is often not necessary to download a complete character set. The System Utilities program, for example, downloads only a few characters so that it can draw boxes and arrows. Explain how to do this. 2. Write an invokable module for Businnew character set } For C:=' ' to '~' Do Write(C); Writeln; { Wait until the user is ready to exit } Write('Press return to exit. '); Readln; { Restore the old character set before exiting } LoadCharset(SysSet); End. EXt(SysSet); { Ask the user for a file with a new character set } Write('Character set to load: '); Readln(S); Reset(F,S); { Load the user's character set and close the file } LoadCharset(F^); Close(F); { Put some characters on the screen to show off the rset } RequestCode.Channel := 0; RequestCode.Reserved := 0; RequestCode.Stat_or_Ctrl := 1; RequestCode.Request_Num := 16; UnitStatus(1,C,RequestCode); End { LoadCharset }; Begin { Main program } { First, save the system character set in SysSet } SysCharse USES sosio, chainstuff; CONST {[j=13/40]} max_open = 12; {max number of open files allowed} ioread = 0; {read mode for a file} iowrite = 1; {write mode for a file} f_avail = 0; {file types} f_text = 1; {} f_ascii = 2; {} f_char = 3; {} f_code = 4; {} maxstr = 132; r of arguments} options: setofchar; {command options} ret_to_shell: boolean; {true==>return to shell} shell_name: string; {shell name (default *shell/shell.code)} stdin: filedesc; ACKED ARRAY [0..2048] OF char; {big buffer for screen} setofchar = SET OF char; {a parameter type to some Primitives} VAR {[j=15/40]} {$p} nargs: integer; {total numbe end_of_file: boolean; END; io_blk_ptr = ^io_blk; {pointer to standard I/O blocks} io_blk = PACKED ARRAY [0..511] OF 0..255; {a standard I/O block} cons_buffer = P; line_cp: integer; pvt_bufr: boolean; buffer: bufr_ptr; bufr_cp: 0..1025; bufr_size: 0..1024; ct: (c_console, c_printer, c_silent, c_other); mode: ioread..iowrite; filename: strng; curr_line: strng; line_len: integerf_entry_bufr = PACKED ARRAY [0..38] OF 0..255; {file entry buffers} fct = RECORD {File Control Table} ref_nbr: integer; ft: f_avail..f_code; = string[140]; {string format} bufr_ptr = ^io_buffer; {I/O buffer pointers} io_buffer = PACKED ARRAY [0..1025] OF char; {I/O buffers with 2 nulls at 1024-5} rd of "more" for "more below"} down3 = 154; {3rd third of "more" for "more below"} TYPE {$p} filedesc = integer; {file descriptors - NOT SOS ref num} strng 50; {2nd third of "more" for "more above"} up3 = 151; {3rd third of "more" for "more above"} down1 = 152; {1st third of "more" for "more below"} down2 = 153; {2nd thi char} up_arrow = 147; {up arrow char for "more above"} down_arrow = 148; {down arrow char for "more below"} up1 = 149; {1st third of "more" for "more above"} up2 = 1 = 143; {bottom right corner for window frames} bar = 144; {vertical bars on window frames} dash = 145; {1st char of the right arrow} right_arrow = 146; {2nd right arrowection} top_left = 140; {top left corner for window frames} top_right = 141; {top right corner for window frames} bot_left = 142; {bottom left corner for window frames} bot_right 136; {left arrow used in error msg} err_r_arrow = 137; {right arrow used in error msg} left_side = 138; {left side bar/dash intersection} right_side = 139; {right side bar/dash inters {max length of a "strng"} {Special font characters defined by define_new_font} err_u_arrow = 134; {up arrow used in error msg} err_d_arrow = 135; {down arrow used in error msg} err_l_arrow = {standard input file descriptor} stdout: filedesc; {standard output file descriptor} console: integer; {.CONSOLE SOS I/O ref nbr} cons_d_num: integer; {device number for console} curr_prefix: string; {current Pascal system filename prefix} exec_prefix: string; {executing program prefix} must_prefix: strng; {"$" prefix for mustopen and mustcreate} must_suffix: strng; {"$: char; fd: filedesc): char; PROCEDURE putcf(c: char; fd: filedesc); FUNCTION getline(VAR s: strng; fd: filedesc): boolean; PROCEDURE closef(fd: filedesc); PROCEDURE remove(name: strng); FUNledesc; bufr: bufr_ptr; VAR size: integer; VAR eoff: boolean); PROCEDURE flush_buffer(fd: filedesc); PROCEDURE put_out_line(fd: filedesc; VAR line: strng; len: integer); FUNCTION getcf(VAR c(VAR name: strng; VAR ftype: integer); FUNCTION openf(VAR name: strng; mode: integer; bufr: bufr_ptr): filedesc; FUNCTION createf(VAR name: strng; mode: integer; bufr: bufr_ptr): filedesc; PROCEDURE next_page(fd: fiir_name: strng; bufr: io_blk_ptr): integer; PROCEDURE close_directory; FUNCTION next_dir_entry(VAR file_entry: f_entry_bufr): boolean; FUNCTION dev_or_vol(name: strng): boolean; PROCEDURE setup_filenameAR s: string); [NOTE: Here's ^ the very devil that causes my incompatibility problems!] PROCEDURE trim_blanks(leading: boolean; VAR s: strng; trailing: boolean); PROCEDURE get_td(VAR s: string); FUNCTION open_directory(d[1..max_open] OF fct; {File Control Tables} {$p-----------* | Primitives | *------------*} PROCEDURE str(n: integer; V have_error: boolean; {true==>and error was detected} cons_bufr: ^cons_buffer; {ptr to big console buffer} cons_len: integer; {number of bytes in "cons_bufr"} open_tbl: ARRAY , a_dc2 { 18 } , a_dc3 { 19 } , a_dc4 { 20 } , a_nak { 21 } , a_syn { 22 } , a_etb { 23 } , a_can { 24 } , a_em { 25 } , a_sub { 26 } , a_esc { 27 } , a_fs { 28 } , a_gs { 29 } , a_rs { 30 } , a_us { 31 } , a_sp { 32 } : char; 1 } , a_stx { 02 } , a_etx { 03 } , a_eot { 04 } , a_enq { 05 } , a_ack { 06 } , a_bel { 07 } , a_bsp { 08 } , a_ht { 09 } , a_lf { 10 } , a_vt { 11 } , a_ff { 12 } , a_cr { 13 } , a_so { 14 } , a_si { 15 } , a_dle { 16 } , a_dc1 { 17 } char; {$09 tab character} newline: char; {$0D new line character} escape: char; {'\' special char trigger} {Ascii codes $00 to $32} {[j=0/0,f-]} a_nul { 00 } , a_soh { 0ars} {Universal Character Constants} endstr: char; {$00 end of string char} endfile: char; {$03 end of file char} backspace: char; {$08 backspace char} tab: true==>let write_error ring the bell} dot_text_code: boolean; {true==>add .text/.code if required} codef_setup: boolean; {true==>setting up a codefile} valid_chars: setofchars; {valid read_keyboard chmenu_y: integer; {selector menu x/y coordinates} sel_menu_len: integer; {nbr of names shown in menu at any time} lib_sw: boolean; {true==>treat '*' as *system.library.} err_bell_sw: boolean; {" suffix for mustopen and mustcreate} must_x, must_y: integer; {screen x/y set by mustgetarg which are used by mustopen and mustcreate} sel_menu_x, sel_CTION set_echo(on_or_off: boolean; fd: filedesc): boolean; FUNCTION have_input(fd: filedesc): boolean; FUNCTION getc(VAR c: char): char; PROCEDURE putc(c: char); PROCEDURE putstr(s: strng; fd: filedesc); PROCEDURE putline(VAR s: strng; fd: filedesc); PROCEDURE get_sos_error(sos_rc: integer; VAR msg: strng); PROCEDURE p_error(msg: strng); PROCEDURE p_message(s: strng; fd: filedesc); FUNCTIO8 26-Sep-85 Subject: 3E-Z PIECES PROBLEM From: Jerry Bacon Thanks to everyone for your help in solving my 3E-Z Pieces Driver problem (3EZ was not recognizing the printer. Ed). With all your help I finally got the problem solved after two weeks o Tom Betz e target of many hours of interesting experimentation! I recommend getting the Toolkit and docs from ATUNC (sysop's note: Apple Three Users of Northern California - see the III.User.Groups/ directory) for all you Pascal hackers out there... Regards,P-Code (least sig. 1st) PRIMS2 data segment ---------------------------------------------------------------------- You will note that for windowing, horiz lines, etc, you need nothing more than this.... This library unit could easily be th_file: strng; get_args: boolean; in_bufr, out_bufr: bufr_ptr); PROCEDURE end_cmd; ---------------------------------------------------------------------- Segment #39: System version = A3/2.0, code type is VAR max_selected, rc: integer): boolean; PROCEDURE get_options(valid_options: setofchar; options_file: strng; VAR options: setofchar); PROCEDURE init_cmd(valid_options: setofchar; optionsmpt: strng; VAR x, y: integer; VAR fname: strng; curs_at_eol: boolean): boolean; FUNCTION search_directory(VAR name: strng; VAR selections: bytestream; nteger; bufr: bufr_ptr; prompt: strng): filedesc; FUNCTION mustcreate(VAR name: strng; mode: integer; bufr: bufr_ptr; prompt: strng): filedesc; FUNCTION prompt_for_filename(pro VAR fname, prefix, suffix: strng): boolean; PROCEDURE must_get_arg(n: integer; filename: boolean; prompt: strng; VAR arg: strng); FUNCTION mustopen(VAR name: strng; mode: i VAR resp: char); PROCEDURE clear_error; FUNCTION getarg(n: integer; VAR s: strng): boolean; FUNCTION get_arg_value(n: integer): integer; FUNCTION expand_filename(prompt: strng; VAR x, y: integer; , y: integer); PROCEDURE set_window(x1, y1, x2, y2: integer); PROCEDURE frame_window(x1, y1, x2, y2: integer); PROCEDURE write_error(line1, line2, line3, line4: strng; responses: setofchar;ger); FUNCTION define_new_font: boolean; PROCEDURE restore_orig_font; PROCEDURE write_screen; PROCEDURE put_out_str(s: strng); PROCEDURE put_out_c(c: integer); PROCEDURE point(xan; PROCEDURE read_keyboard(VAR line: strng; delimiters: setofchar; VAR delim: char; curs_at_eol: boolean); PROCEDURE getxy(VAR x, y: integer); PROCEDURE get_viewport_limit(VAR x, y: inteN open_odometer(name: string; x, y: integer): integer; PROCEDURE display_odometer(od: integer); PROCEDURE set_odometer(n, od: integer); PROCEDURE close_odometer(od: integer); FUNCTION interrupted: boolef trial and error. Thought some might like to know how! The solution was kind of complex since my other programs worked fine with the printer driver I was using. I tried the suggestion to change type $40 to $41 and sub-type $01 to $03 but the Pkaso d creates a new file. You must create a new file, though: you can't jump right into an existing file, since the EXEC mechanism cannot recognize and record the OA-I you need in order to go into Insert Mode. Don't terminate (%%) the EXEC file until QuickFilee files you want to combine are printed to diskette, use AppleWriter, Pascal Editor, or a similar text editor to combine the files and re-save them to diskette as one file. Apple /// users with Pascal can then make an EXEC file that starts up QuickFile anins and no headers. This will result in a file of contiguous, identically-structured records. Be sure that the files have the same number of fields in each record; control this number with the report format. The names of the fields are irrelevant. After thskette. To merge files in QuickFile: First, design a "labels" format that prints each field of a record one below the other, with no blank lines between labels. Even if a field is blank, choose to print lines on continuous paper with no top or bottom marg Title: How to merge files in Quickfile - Created by: SYSOP on: 01/18/1989 15:19:21 QuickFile: Merging Files Even though QuickFile doesn't offer you the option of merging files, it does give you a foot in the door by letting you print reports to dierwise I would get 1/4 page of printout from 3EZP and then pure garbage. Jeff Fritz ial driver (.printer) is sensitive to where the modem eliminator cable is placed (this maybe more hardware than anything). I cured some printer problems merely by placing the modem eliminator cable on the COMPUTER side rather than the PRINTER side. Othmay never figure out! If my other programs had not have printed correctly, I might have checked this out sooner. You can be sure that I will keep a check on all my slots card from now on. Again, thanks for all the help! Jerry 03/19/1986 The serheck for loose cards. Yes! I found the Pkaso card had moved upward a slight amount out of the slot. This with the other suggestions finally solved my problem. How my other programs printed correctly with a loose Pkaso card and 3E-Z Pieces would not - I other programs and it still worked fine with all of them but not with 3E-Z Pieces - still printed junk on my Apple DMP. I tried different arrangements of the printer driver for three or four more days. I finally decided to go into slots of my apple /// cdriver or .Printer still could not be found by 3E-Z Pieces program. Then I tried another suggestion; to delete some of the other *.printer drivers. Now the 3E-Z Pieces program could find the .Printer but printed junk. I then tried the .Printer with my is waiting for input of the first field of the first record of the new file. After terminating the EXEC file, quit QuickFile. Don't save this new file, though. Using your text editor again, load the EXEC file, and then load your combined file (see above) into the position just before the "%%%%". Again save the file. Executing this file will cause a new QuickFile file to be created, and all of your data will be "typed" in by the disk drive. Updated January 20,1986 Title: How can I learn to program in 6502? - Created by SYSOP file <%AJ89083642> 01/19/1989 08:36:41 From: Weber Baker Ed; how did you go aboout learning to program the /// in 6502 Assembler language? Weber From: Ed Gooding Hi Weber: I t u -TITAN.RAMDISK t u -UNUSED.MEMORYkt u -WHICH.DRIVERSt u PROGRAM.6502vt '  '-ABSOLUTE.CODE tu -CALC.PGM.SIZEt t u .CLEAR.KEYBOARDe(t u -CLOCK.N.SLOTSU"t u *FILE.TYPESo{t u ,LEARN.TO.PGMEAD PASCAL TEXT FILES."04=10:"78C";"ANY KEY RETURNS TO THE MENU."!>G$:::".D1/MENU.MAKER",320R",220(204::"79A";""; 2D=1:F=1 <#4;a$ FD=D+1 P#5;a$ZD=60#5;12)dD=60D=1nF=F+1::d$;::Y=1100:Y x13402  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T R".D1/MENU.MAKER",220 d$="" A$="PRINTING "+B$(I),16,B)=01:=0::"80C";A$;:#3,B$(I),16,B)Z=1#3;b$:"78A";b$Z=Z+1:Z=18:1290 1260 #4,B$(I),16,B)#5,".PRINTER"+ž#4#5;12):::".D1/MENU.MAKE30C$="N"C$="n"1160;:=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING": $1020.202 8::Z=1B::=23:=0::"79C";"WOULD YOU LIKE A PRINTED COPY?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"1170*C$="N"C$="n"79C";"PRESS ANY KEY TO HALT LISTING"::202 1020#2,B$(I),16,B)ž#242:::1160Z=1#2;A$:"78A";A$Z=Z+1:Z>1842:::Z=1980*:=23:=0::"79C";"CONTINUE...?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"10 MENU.MAKER TEXT MODULESEG=0"MENU.MAKER"890&*X=11000: TEXT SLOW-DOWN LOOP ,X.1,180,22:2,280,21:2,2380,23:z:A$="LISTING "+B$(I),16,B)$=01:=0::"80C";A$;::12)>=23:=0::"a$,1)="/"5060:s=s-1 5030=a$240 MENU.MAKER 6.2 * Thanks to C.M.Davidson for his help!have been teaching myself 6502 by doing the following: First, I have to admit that I used to be an assem. language programmer on mainframe computers. I was a Systems and Telecommunications Programmer in the late 60's and early 70's before I was convertedt comes on, its a great feeling. The more code you figure out, the more comfortable you'll get. You'll also eventually figure out that you really don't have to understand how to do extended indirect addressing via the zero page to write very full functioes in, the previous steps are quite boring, to be honest. But, when you start following through code written by Rob Turner, or Tim, or Bob C., or Daryl and you scramble back to your SOS manual, or one of the previously mentioned manuals, and then the lighas I could get my hands on. In all modesty, I feel that I've got an awesome assemblage (no pun intended) of assembly language source code on ///'s Company. There is some very good stuff that you can learn a lot from. This step is where the excitement coms in there. 3. The best way to help the above steps sink in is to start going through all the 6502 source code you can get your hands on. This is where ///'s Company can be a benefit. As I've been learning, I've also been accumulating as much 6502 code Reference Manual and the Device Driver Writers Guide. You don't have to have the Driver Writers Guide if you don't intend to write drivers, but as far as I'm concerned that's one of the reasons I wanted to learn 6502. Also, you can learn from the examplehat it does, addressing modes, and affected flags. It offers this info in a descriptive and easy to read format, as well. Step 2 will get you into 6502, but the next step is learning how to apply it on the ///. This means more books, specifically the SOSode certain routines because his book has a lot of "here's how you code this function". As a straignt programming reference, I find myself going back to Mansfield's book, because in the ref. section, it gives the following info on each op code: op code, wt comes with The Visible Computer is very good on its own without the software. Obviously, there is a lot of redundant info in all of these, but I find that I use different ones for different problems. For instance, I use Zak's book to figure out how to cthe ///, they are ][ oriented, but they are very helpful in learning 6502. They are: "Programming the 6502" by Rodnay Zaks, "Assembly Lines: The Book" by Roger Wagner, and "Apple Machine Language for Beginners" by Richard Mansfield. Also, the manual tha updates a visual display of the various registers and the accumulator so you can gain an understanding of just what the heck your little program is doing inside there. 2. I purchased 3 books, all of which I use at various times. None of them deal with 6502 programming in a very nice way, in my opinion. It is a lab oriented self teaching aid that uses the computer along with the manual to teach you the principles of 6502 code. You type in small programs and step through them, and as you do the program transfer 132 bytes of one field to another field and branching, all with a single op code. Anyway, here's the steps that I've been taking: 1. My oldest son gave me a program a year or so ago called The Visible Computer, that teaches the fundamentals of to COBOL. I'll hasten to add that the 6502 is not quite up to the power of what I used to deal with, even WAY back then. I had a real hard time accepting the fact that I could only deal with a byte at a time, especially after being used to being able toned assem. programs. You can write very effective code with very simplistic techniques. The various 6502 heavies might laugh their heads off if they saw some of my routines and techniques, but hey....the stuff is working....I'll learn to refine my style and technique after I master the basics. The next thing to do to learn is ask questions. I bug the hell out of Tim Harrington and Bob Consorti at ON Three with them. I don't call them up and disturb them while they are trying to earn a living, I just le 100 REM Program Name: Renamer By: Ed Gooding August 1985 120 REM Go to Line 1000- for documentation. 139 :: 140 QTY.DATAS=19 141 :: 145 QTY.DATAS.LESS.ONE=QTY.DATAS-1 150 DIM PATHNAMES$(QTY.DATAS,2) 250 BEEP$=CHR$(7)d, Robert Howe (Dvorak Keyboard guy) here. I've been looking for help in how to get started in assembly language and this looks like what I needed. I'll get ahold of these books, etc soon. Thanks for having such a great BB. RH 1/29/88 29/88 Do yo the many 6502 programs here on ///'s Company, assemble them, and study them. It's one of the best ways to learn. As you figure out how these programs process, your knowledge will increase in leaps and bounds. Regards......Ed 01/30/1988 02:17:16 Hi Eto 6502 programming. If you want to take the info further and use it in the /// environment, then the SOS Reference Manuals and even the Device Driver Writers Guide will become necessary acquisitions for you. The next best thing you can do is to downloadarious assembly language books. Thanks John: I too thought The Visible Computer:6502 to be very informative, and even fun to play with while learning 6502 programming. Even though it doesn't cover SOS calls and related /// topics, it is a good intro inuage programmer, I strongly recommend the purchase of this software. It really gave me a good insight into how a computer works from all those little hex numbers. I learned a lot more in an hour with this software than I had in many attempts at reading vl and sludge through. Weber 16-Jan-88 From: John Lomartire Ed, as a result of your comment about using THE VISIBLE COMPUTER:6502 to do some assembly language programming, I went ahead and got a copy. Although I will never be an assembly langm eternally stuck on chapter 5. If I could take my /// to work where I sit for 5-6 hours and do nothing I could whip through it, but working at home is almost impossible. Anyway thanks for the advice. I guess I'll just have to unplug the phone and door belu have any other questions, get back to me......Ed From: Weber Baker Ed; thanks for all the info. I finally got the Visible Computer a couple of weeks ago, but every time I sit down with it something keeps me from finishing the chapter I'm in, thus I a You don't have to key these in. Reid Trimble, a regular ///'s Company caller, and a very solid Pascal and 6502 programmer has keyed them in and generously donated them here, so go ahead and download them if you decide to pursue this. Whewwww.......if yoced. Last note, if you do get the SOS Ref. manual and/or the Device Driver Writers manual, you will note that there is a sample interpreter in the SOS Ref. manual, and sample block device and character device drivers in the Device Drivers Writers manual. ines, input routines, error trapping and reporting routines, and foreground screen restoration routines. All you have to code is your application specific stuff, and all your modules will come out looking like the modules that Rob, Bob, and Tim have produhe greatest in my opinion. I just got the DM Toolkit, and its the best $20 you could spend, if you want to write DM modules. They have taken some of the hardest and most tedious work out of programming for you. You are provided with folder/windowing routave them email, and when they get time they get back to me (probably after they stop laughing). They have been very supportive. Also, if you have Desktop Manager, it is EXTREMELY easy to write assem. programs that can be available at any time, which is t 260 TURN.SCREEN.OFF$=CHR$(14) 270 CLEAR.END.LINE$=CHR$(31) 280 P$= PREFIX$ 289 :: 290 PREFIX$=".PRO2/" 291 :: 300 HOME:TEXT 310 VPOS=4:HPOS=10:PRINT"1. Shorten Pathnames Prior to Backing Up Your Files." 320 VPOS=5:HPOS=10:PRINT 1009 REM How to customize for your own use: 1010 REM 1. Modify my DATA statements to correspond to the pathnames 1011 REM in your system. 1012 REM 2. Change the assigned value in line 40, QTY.DATAS to equal 1013 REMtions: 1- Shorten pathnames prior to backing up. 1006 REM 2- Lengthen pathnames after backing up. 1007 REM 3- Exit program and return to Catalyst, or reboot. 1008 REM 4- Exit program and enter Business Basic. vels of sub-directories so that they can then be 1002 REM backed up using Pascal programs such as Sys. Utilities 1003 REM and Backup ///, which have 64 character limits on path- 1004 REM names. 1005 REM FuncGS.1,N/B/I/S/T 880 DATA N/B/I/S/SAMPLE.PROGS.2,N/B/I/S/T2 998 :: 999 REM ------------------------------------------------------------------ 1000 REM Purpose: To shorten long pathnames created by the use of multiple 1001 REM le/I/J/SAMPLE.PROGS.2,N/B/I/J/M 820 DATA N/B/I/ASSEM.6502,N/B/I/O 830 DATA N/B/I/O/DISASSEMBLIES,N/B/I/O/P 840 DATA N/B/I/O/DRIVERS,N/B/I/O/Q 850 DATA N/B/I/O/MISC.TOPICS.1,N/B/I/O/R 860 DATA N/B/I/PASCAL,N/B/I/S 870 DATA N/B/I/S/SAMPLE.PRON/B/C/D/E/PRODUCT.INFO.2,N/B/C/D/E/G 760 DATA N/B/C/D/E/TECH.NOTES,N/B/C/D/E/H 770 DATA N/B/PROGRAMMING,N/B/I 780 DATA N/B/I/BUS.BASIC,N/B/I/J 790 DATA N/B/I/J/DOCUMENTATION,N/B/I/J/K 800 DATA N/B/I/J/SAMPLE.PROGS.1,N/B/I/J/L 810 DATA N/B 640 PREFIX$=P$ 650 END 651 :: 652 :: 700 DATA N/APPLE.III.HELP,N/B 710 DATA N/B/SOFTWARE,N/B/C 720 DATA N/B/C/REVIEWS.1,N/B/C/D 730 DATA N/B/C/D/DA.DATASYSTEMS,N/B/C/D/E 740 DATA N/B/C/D/E/PRODUCT.INFO.1,N/B/C/D/E/F 750 DATA (LOOP.CONTROL,0) 600 LOCK PATHNAMES$(LOOP.CONTROL,0) 610 PRINT PATHNAMES$(LOOP.CONTROL,1);:HPOS=25:PRINT" =======> ";PATHNAMES$(LOOP.CONTROL,0) 620 NEXT LOOP.CONTROL 630 PRINT:PRINT:PRINT"Directory names have been restored and locked." X=0 TO QTY.DATAS.LESS.ONE 530 FOR Y=0 TO 1 540 READ PATHNAMES$(X,Y) 550 NEXT Y 560 NEXT X 570 FOR LOOP.CONTROL=QTY.DATAS.LESS.ONE TO 0 STEP-1 580 PRINT TURN.SCREEN.OFF$; 590 RENAME PATHNAMES$(LOOP.CONTROL,1),PATHNAMES$.NAME$;:HPOS=25:PRINT" =======> ";SHORT.NAME$ 480 NEXT LOOP.CONTROL 490 PRINT:PRINT:PRINT"Directory names are now shortened for backup purposes." 500 PREFIX$=P$ 510 END 511 :: 512 REM Lengthen pathnames routine. 513 :: 520 FOR20 417 :: 418 REM Shorten pathnames routine. 419 :: 420 FOR LOOP.CONTROL=1 TO QTY.DATAS 430 PRINT TURN.SCREEN.OFF$; 440 READ LONG.NAME$,SHORT.NAME$ 450 UNLOCK LONG.NAME$ 460 RENAME LONG.NAME$,SHORT.NAME$ 470 PRINT LONG4 To Select Function: "; 360 GET SELECTION:PRINT SELECTION 370 IF SELECTION<1 OR SELECTION>4 THEN PRINT BEEP$:GOTO 350 380 PRINT 390 IF SELECTION=3 THEN PREFIX$=P$:BYE 400 IF SELECTION=4 THEN PREFIX$=P$:END 410 IF SELECTION=2 THEN GOTO 5"2. Lengthen Pathanmes To Original Size After Backing Up." 330 VPOS=6:HPOS=10:PRINT"3. Exit This Program to Catalyst." 340 VPOS=7:HPOS=10:PRINT"4. Exit This Program to Business Basic." 350 VPOS=9:HPOS=10:PRINT CLEAR.END.LINE$;:PRINT"Enter 1 - the final number of DATA statements that you end up with. 1014 REM 3. Change the device prefix in line 290 to match the name of 1015 REM the device you are backing up. 1020 REM 1021 REM Compliments of ///'s Company 804-747-8752 1022 REM 300/1200 baud, 7 or 8 bits, odd parity, full duplex 1023 REM 24 hours a day, 7 days a week, 365 days a year 1030 REM ------------------------------------------------------------------ e. 5025 REM - The user can also change the decimal addresses at lines 610 5030 REM - and 710 to accomodate an individual printer for an OKIDATA m92 5035 REM printer and are double strike 5040 REM - commands. If the commands are unnecessar pages of labels that are three labels wide by eleven labels 5010 REM - long. The program also allows the user to print either PICA or 5015 REM - ELITE pitch labels. PICA allows 22 characters per line. ELITE 5020 REM - allows 28 characters per linof the same labels 4300 GOTO 9998:REM User wants to quit 4400 REM 4500 REM 4600 REM ************************************************************ ***** 5000 REM - I have edited Bob's program to enable the user to make use 5005 REM - oflabels" 4245 PRINT"2. Print more of the same" 4250 PRINT"3. Quit" 4260 PRINT:INPUT"Your choice?";i$ 4270 i=VAL(i$):IF i<1 OR i>3 THEN 4220 4280 IF i=1 THEN CLEAR:GOTO 10:REM User wants to do new labels 4290 IF i=2 THEN 400:REM print more 92 CLOSE#2 4194 GOTO 4200 4196 REM 4197 REM - ***************************************bel-printing to do? 4210 WINDOW 10,7 TO 80,24:REM protect top 7 lines of text and move in a bit 4220 HOME 4230 VPOS= VPOS+3 4240 PRINT"1. Print new -wide. 4155 FOR i=1 TO qty 4160 FOR j=1 TO 5 4170 PRINT#2 USING form$;line$(j);:PRINT#2" "; 4171 PRINT#2 USING form$;line$(j);:PRINT#2" "; 4172 PRINT#2 USING form$;line$(j) 4180 NEXT j 4185 PRINT#2 4190 NEXT i 41XT j 4095 PRINT#2 4100 NEXT i 4110 CLOSE#2 4120 REM 4122 ********** 4124 REM 4125 GOTO 4200 4150 IF format=1 THEN form$="28a":ELSE IF format=2 THEN form$="28c" 4151 ELSE form$="28r":REM provide extra room at edges by going 2822r":REM provide extra room at edges by going 22-wide. 4055 FOR i=1 TO qty 4060 FOR j=1 TO 5 4070 PRINT#2 USING form$;line$(j);:PRINT#2" "; 4071 PRINT#2 USING form$;line$(j);:PRINT#2" ";:PRINT#2 USING form$;line$(j) 4090 NEmp to Pica or Elite Print Routine @@@@@ 4029 REM 4030 IF A2" THEN GOTO 4150 4036 REM 4037 REM - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4038 REM 4050 IF format=1 THEN form$="22a":ELSE IF format=2 THEN form$="22c" 4051 ELSE form$="ter." 3207 REM 3208 REM - ++++++++++++++++++++++++++++++++++++++++++++++ 3209 REM 3210 PRINT:INPUT"Press RETURN when ready to begin printing.";i$ 4000 REM Printing the labels 4010 OPEN#2 AS OUTPUT,driver$ 4027 REM 4028 REM - @@@@ JuT driver$ 3187 REM reprint last response if RETURN was pressed en ready to start printing 3202 REM 3203 REM - ++++++++++++++++++++++++++++++++++++++++++++++ 3204 REM 3205 HOME 3206 PRINT:PRINT:PRINT"Position the sheet of labels in your prinnd labels to? 3160 PRINT:PRINT:PRINT"Send output to what device? ";:PRINT driver$; 3170 HPOS= HPOS-(LEN(driver$)) 3180 INPUT"";i$ 3184 IF i$<>"" THEN driver$=i$:REM Assign new response to variable 3186 IF i$="" THEN VPOS= VPOS-1:HPOS=29:PRIN 3000 REM How many labels to print 3010 PRINT CHR$(1ing WINDOW 3020 HOME 3030 VPOS=5:INPUT"How many labels (verticle) to print?";i$ 3040 i=VAL(i$):IF i<1 THEN 3020 3050 qty=i:REM assign variable to QTY 3100 REM What output device to sey to set up the printer, 5045 REM - they can be deleted by entering 'REM' for lines 605 through 715. 5050 REM - The default print device can be altered by changing the 5055 REM - entry at line 12 of the program. 5060 REM - If you have any suggestions for further changes to this 5065 REM - program, or can improve on my crude attempts to expand its use, 5070 REM - please leave 5075 REM - Phone (Modem) 1-804-747-8752. Jerry Treich. 5080 REM 5085 REM ************************** iles up to full memory capacity in size) has a bug in its handling of the SINGLE PAGE printer option. Although I do not use this feature I was recently dis-assembling S-AW with the Source Window program and noted a peculiarity that seemed related to the SP A Fix for the Super AppleWriter Single-Page Print Bug From: Daryl Anderson Date: Feb 14, 1986 A number of folks have noted that the so-called "Super Applewriter" program (the version which allows editing fn" prompt. I VB - View the bottom half of the block. CX,194,20202020 - change .D1/ to spaces. WB - write the block back to the diskette. QT - quit Disk Window /// NO - respond to the "Run agair, and leave the drive door to .D1 up. You should be pleased to notice that the program now doesn't access .D1 at all. 5. If you are using Disk Window from DA DataSystems, here's the recipe for the fix: RB,11 - Read block 11 k at offset $190. You should see DO.D1/STARTUP. 3. Change .D1/ to spaces and write the block back out. 4. Copy the zapped SOS.INTERP back to your Super Applewriter disk or hard disk directory. Boot Catalyst or the Selector, chose Super Applewrite to a completely blank disk. This will make it easy to find the reference to: DO.D1/STARTUP, which is what you will be looking for. By copying to a blank disk, my block references should be the same for your disk. 2. Read in block 11 and loo.D1 open when booting Super AW from Catalyst or Selector. Here's how I did it using Disk Window /// from DA DataSystems: NOTE: Try this first with a backup copy before making it permanent!! 1. First, copy the SOS.INTERP from the Super Applewriter disk; 10020 right%=right%-margin% 10030 bottom%=bottom%+margin% 10040 top%=top%-margin% 10050 RETURN 11000 REM 11100 left%=140:right%=420:bottom%=94:top%=1s high 11999 RETURN ********************************** ** 5090 REM 9998 PERFORM release:TEXT:HOME:RUN "MENU.MAKER" 9999 REM release graphics memory, clear screen, and end 10000 REM subroutine to change left,right,bottom and top margins 10010 left%=left%+margin% option. So I loaded up my S-AW and set SP=1 and printed a document. Sure enough, the message "[ Insert Sheet, Press RETU" appeared followed by garbage, and the appropriate pause DID NOT take place. The problem is very simple. S-AW, as a standalone appli...... 030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ This means that the SOS.INTERP file is spread over blocks 07, 09, 0A, etc, up to 25. (Note that on a large follows : (I've trimmed the display a bit) 000 07 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 ................ 010 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 00 00 ........ !"#$%.. 020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..........e first letter in the file name (e.g. the first "S" in SOS.INTERP) indicates the file's "Keyblock", which contains a list of block numbers comprising the file. In this case it is 0008. So we read in block #8 which appears as 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Enter command selection...delimit with commas...then ===> 2T Command : RB,2 (3) : The word just below th00 00 00 00 00 00 00 ................ 0B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0E0 00 ............. 070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0A0 00 00 00 00 00 00 00 00 00 54 45 52 50 00 00 00 00 00 0C 08 00 1F 00 INTERP.......... 040 14 3A 00 48 AC 33 0E 00 00 E3 00 00 83 A9 08 16 .:.H.3.......... 050 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... I S K W I N D O W I I I v-1.2 000 00 00 03 00 FB 42 49 47 2E 41 57 33 2E 46 49 58 .....BIG.AW3.FIX 010 00 00 00 00 75 00 00 00 00 00 00 00 00 00 00 00 ....u........... 020 00 00 C3 27 0D 01 00 06 00 18 01 2A 53 4F 53 2E ...'.......*SOS. 030 49 4Ehile not necessary it is usually easier (and safer) to do disk block 'hacking' on a spare and on a floppy. (2) : Read in the main volume header block (number 2) which should look something like the following : sn-0999 Dmy company sells - others will serve equally well I'm sure. Specific formats shown here are those of DW///. Screen dumps courtesy of Power Keys - Cut & Paste /// module. (1) : Make a copy of your S-AW SOS.INTERP on a blank formatted floppy. Wsure many of the groups and organizations that currently distribute S-AW will incorporate the fix into their own versions - but if you would like to do it on your own copy here's how... Requires : Disk Block Editor program such as Disk Window /// which e the end of string. The fix is equally simple. Using a DISK BLOCK EDITOR you merely alter one byte of the header length field to tell SOS to load an extra 16 bytes. Works like a charm. This requires changing the 13th byte in the file from 00 to 16. I'm header is a tad less than the actual length of the INTERP program. And guess what's at the very end of the program - the text string "[ Insert Sheet, Press RETURN " followed by a null value which the S-AW "print to console" routine apparently uses to senscation, is an SOS.INTERP file. Such files contain at their beginning ("header") information that tells the Operating System what memory location to load the program at and also how long the program is (e.g. how much to load). The LENGTH value in the S-AW capacity disk the values in the 'bottom half of the block (100-1FF) will give the high byte of the file block number - so if 100 contained x'12 the first block of the file would be 1207. In this case they were all 00's since we're working with the first file on a floppy) We are only interested in the first block of the SOS.INTERP which contains the header so we read in block #07 and see the following : 000 53 4F 53 20 4E 54 52 50 00 00 00 58 00 3A A0 00 SOS NTRP...X.:.. 010 98 99 00 16 88 D0 FA A0THE BEST OF THREE'S COMPANY BBS - DISK2me$=34)+D$+34) GLOAD.D$16);1) GRAFIXONX=12000:X::RELEASE:#530) Frankly its quite reasonable to change the length from 3A00 to 3AF2 to include the remainder of the 512 bytes in this last block. If anyone finds that this changes anything please let me know. -da 00 ................ Given a length of x'3A00 for the INTERP, SOS would only load up to the point indicated by the arrow. Adding the additional 16 bytes incorporates the rest of the display string and the crucial x'00 terminator (plus a few spare bytes. | v 000 65 74 2C 20 70 72 65 73 73 20 52 45 54 55 52 4E et, press RETURN 010 20 5D 20 00 00 00 00 00 00 00 00 00 00 00 00 00 ] ............. 020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 he altered version will manage the SINGLE PAGE PAUSE correctly. If you are curious you might take a gander at the last block in the file, in this case x'25 and note the incorrect trimming that was taking place : 6 bytes, hex'10. So we want 3A10 and must change the byte at offset 00C from 00 to 10. With Disk Window the command CX,0C,10 suffices. (5) : We now write the corrected block back out to disk (Disk Window command is WB) and we're done. T^Y HY OY (4) : The header information is all in the first line. Note the "SOS NTRP literal. The load address is 0058 (e.g. 5800) and the length is given as 003A (e.g. hex'3A00 or decimal'14848 bytes). We want to bump this value up by 1 02 20 E2 59 A9 15 20 E2 59 A9 0F 20 .Y.. .Y.. .Y.. 0D0 E2 59 20 01 6D A9 0C 4C E2 59 A0 FF C8 B9 29 59 .Y .m..L.Y....)Y 0E0 99 00 B0 D0 F7 20 CE 6F AC E2 AF 88 C0 0F 90 02 ..... .o........ 0F0 A0 0E 8C 5D 59 A9 9F 8D 5E 59 20 48 59 20 4F 59 ...]Y...0 6E 7E . X .. .bL.k n~ 090 00 C8 A0 58 AD A3 58 8D 08 5A 8D 95 5A 8D 0B 5B ...X..X..Z..Z..[ 0A0 20 05 5B 20 64 59 A9 80 20 1C 5B 4C B0 58 04 A7 .[ dY.. .[L.X.. 0B0 58 00 00 00 00 08 2E 43 4F 4E 53 4F 4C 45 A9 10 X......CONSOLE.. 0C0 20 E2 59 A9 D0 F6 A2 00 8A 95 80 9D 80 A1 E8 10 F8 A9 0D 8D ................ 060 80 B0 20 7F 58 20 43 5B 20 E2 69 20 CC 58 20 63 .. X C[ .i .X c 070 5C 20 82 5C A5 86 85 F9 A5 87 85 FA AD 87 16 85 \ .\............ 080 FB 20 7F 58 20 EF 81 20 D6 62 4C A9 6B 2 00 84 7A 8C 00 A1 8C 00 ..........z..... 020 B1 8C 80 AE 8C C0 AE 8C 40 AF 8C 80 AD 8C C0 AD ........@....... 030 8C 00 AE 8C 40 AE 8C 00 A4 8C 00 94 84 7B 84 00 ....@........{.. 040 A9 9C 85 01 A2 04 A9 00 91 00 C8 D0 FB E6 01 CA ................ 050hines in the house with no success, I get on the telephone. It's 8:30 on a Sunday night. Rod Whitten's home, he suggests Ed Gooding. Ed isn't home, so I leave a message. I try Daryl Andersen...he isn't home either, I leave a message. I try Ron Malpin iID................. 1.0.0 Good luck on figuring out why it won't work with less than 128K. You might want to give Daryl Anderson a call at DA DataSystems and ask him. He is obviously very knowledgable about the Titan card and the drivers needed to utili, Write Formatter present; NonRemovable Device Subtype............. $00 Unit Number................ $00 Manufacturer ID............ $0000 Block Count................ $0118 (280) Version Device Name................ .RAM 2 - Driver Status.............. ACTIVE 3 - Slot Number................ 3 4 - Comment Titan ///+][ RAM disk driver - for System 1 only Non-changeable information: Device Type................ $D0 Block, Reade to confirm it? At any rate, I am happy to hear that you have it working now that you have upgraded your Titan card to a full 128K of RAM. Below is the SCP display from the Titan ramdisk driver that I have: item field value 1 - lement this feature and gave up. I suspect that it might have something to do with Mother SOS. I have been told that she expects ALL block devices to have a minimum of 128K. Have you ever heard of this "law of block devices" before, I have never been ablhe SOS ramdisk would only work with 128K systems, in fact they would not even sell you the ramdisk unless you bought the 128K version from them. I have to assume from this that they intended to support variable amounts of memory, but were never able to imp-------------------------------- 02/09/87 12:21:08 Reid: In spite of the fact that the source code seems to address (no pun intended) the situation of having variable amounts of memory on the Titan board, Titan warned buyers of their ///+][ board that tce (.RAM) has 152 blocks, 145 available. Looks to me like the INIT and (some of the) READ sections are working. Any assembly language jocks want to help take a wack at this? Sigh -- Reid Trimble ----------------------------------------------ock scan (0 errors). I wrote a little program that uses UNITREAD to look at individual blocks and everything in the directory structure and bit map look fine!!! What's going ON??? PS: I'm using a 64K Titan 3+2 board, so the catalog listing says the deviirectory? I tried; although it assembles with no errors and can be installed in my driver file, I can't transfer any files to it. (It dies with a "SOS I/O Error 45" - illegal block number.) You can however, list the directory (it's empty) and do a bad bl Title: My Titan ramdisk won't work with 64K! - Created by SYSOP file <%AJ89083559> 01/19/1989 08:35:58 02/09/87 12:31:17 I was wondering if anyone has sucessfully assembled and used the TITAN.RAMDISK program in the Programming/Assem.6502/Drivers.2 dn Austin, TX. I never talked to Ron before, picked his name out of OnThree, but he's a real nice guy, and tries to help. He commiserates, says he doesn't use Backup ///, doesn't trust it, I say (bitterly) neither do I anymore, and he says Chris Acreman's ze it properly. I really like his version of the Titan ramdisk, since it preserves the ramdisk's contents when switching programs. Regards......Ed ...Ed Do you want to read replies to this file? ->