@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uat2a atoi.c unsan atoi.c at2a fopen.c unsan fopen.c at2a isascii.c unsan isascii.c at2a ispunct.c unsan ispunct.c at2T}a itou.c unsan itou.c at2a reverse.c unsan reverse.c at2a xtoi.c unsan xtoi.c at2a atoib.c unsan atoib.c at2a fprintfU}.c unsan fprintf.c at2a isatty.c unsan isatty.c at2a isspace.c unsan isspace.c at2a itox.c unsan itox.c at2a startup.V}c unsan startup.c at2a delete.c unsan delete.c at2a fputs.c unsan fputs.c at2a iscntrl.c unsan iscntrl.c at2a isupperW}.c unsan isupper.c at2a open.c unsan open.c at2a strcat.c unsan strcat.c at2a dtoi.c unsan dtoi.c at2a fread.c unsanX} fread.c at2a iscons.c unsan iscons.c at2a isxdigit.c unsan isxdigit.c at2a otoi.c unsan otoi.c at2a strcmp.c unsan sY}trcmp.c at2a fclose.c unsan fclose.c at2a fwrite.c unsan fwrite.c at2a isgraph.c unsan isgraph.c at2a itoab.c unsan iZ}toab.c at2a pmalloc.c unsan pmalloc.c at2a time.c unsan time.c at2a fgets.c unsan fgets.c at2a gets.c unsan gets.c a[}t2a islower.c unsan islower.c at2a itod.c unsan itod.c at2a readargs.c unsan readargs.c at2a toascii.c unsan toascii.c\} at2a fname.c unsan fname.c at2a isalnum.c unsan isalnum.c at2a isprint.c unsan isprint.c at2a itoo.c unsan itoo.c a]}t2a rename.c unsan rename.c at2a utoi.c unsan utoi.c at2a atari.m65 unsan atari.m65 at2a close.m65 unsan close.m65 at^}2a getch.m65 unsan getch.m65 at2a isodigit.m65 unsan isodigit.m65 at2a runtime.m65 unsan runtime.m65 at2a toupper.m65 _}unsan toupper.m65 at2a bcopy.m65 unsan bcopy.m65 at2a closeall.m65 unsan closeall.m65 at2a global.m65 unsan global.m65 `} at2a iswhite.m65 unsan iswhite.m65 at2a rwcommon.m65 unsan rwcommon.m65 at2a tprintf.m65 unsan tprintf.m65 at2a bzero.a}m65 unsan bzero.m65 at2a cputc.m65 unsan cputc.m65 at2a heap.m65 unsan heap.m65 at2a itoa.m65 unsan itoa.m65 at2a stdb}io.m65 unsan stdio.m65 at2a write.m65 unsan write.m65 at2a cgetc.m65 unsan cgetc.m65 at2a fdelete.m65 unsan fdelete.m6c}5 at2a isalpha.m65 unsan isalpha.m65 at2a parselin.m65 unsan parselin.m65 at2a strchr.m65 unsan strchr.m65 at2a cgets.d}m65 unsan cgets.m65 at2a frename.m65 unsan frename.m65 at2a isdigit.m65 unsan isdigit.m65 at2a read.m65 unsan read.m65e} at2a tolower.m65 unsan tolower.m65 at2a ctype.h unsan ctype.h at2a file.h unsan file.h at2a stdio.h unsan stdio.h 5|; ; Defs for Atari OS. These defs were stolen from ALBUG's SYSMAC.SML. ; This file generates no code, just contains rom lo g}cations etc. ; ; VECTOR TABLE EDITRV =$E400 ;EDITOR SCRENV =$E410 ;TELEVISION SCREEN KEYBDV =$E420 ;KEYBOARD h}PRINTV =$E430 ;PRINTER CASETV =$E440 ;CASSETTE ; JUMP VECTOR TABLE DISKIV =$E450 ;DISK INITIALIZATION DSKINV =$ i}E453 ;DISK INTERFACE CIOV =$E456 ;CIO ROUTINE SIOV =$E459 ;SIO ROUTINE SETVBV =$E45C ;SET VERTICAL BLANK VECTORS j}SYSVBV =$E45F ;SYSTEM VERTICAL BLANK ROUTINE XITVBV =$E462 ;EXIT VERTICAL BLANK ROUTINE SIOINV =$E465 ;SIO INIT SEND k}EV =$E468 ;SEND ENABLE ROUTINE INTINV =$E46B ;INTERRUPT HANDLER INIT CIOINV =$E46E ;CIO INIT BLKBDV =$E471 ;BLACKB l}OARD MODE WARMSV =$E474 ;WARM START ENTRY POINT COLDSV =$E477 ;COLD START ENTRY POINT RBLOKV =$E47D ;CASSETTE READ B m}LOCK VECTOR DSOPIV =$E480 ;CASSETTE OPEN FOR INPUT VECTOR ; SOME USEFUL INTERNAL ROUTINES ;KGETCH =$F6E2 ;GET CHAR n} FROM KEYBOARD only on 800 EOUTCH =$F6A4 ;OUTPUT CHAR TO SCREEN PUTLIN =$F385 ;OUTPUT LINE TO IOCB#0 ; COMMAND CODES o} FOR IOCB OPEN =$03 ;OPEN FOR INPUT/OUTPUT GETREC =$05 ;GET RECORD (TEXT) GETCHR =$07 ;GET CHARACTER(S) PUTREC =$ p}09 ;PUT RECORD (TEXT) PUTCHR =$0B ;PUT CHARACTER(S) CLOSE =$0C ;CLOSE DEVICE STATIS =$0D ;STATUS REQUEST SPECIL = q}$0E ;SPECIAL ENTRY COMMANDS ; SPECIAL ENTRY COMMANDS DRAWLN =$11 ;DRAW LINE FILLIN =$12 ;DRAW LINE WITH RIGHT FI r}LL RENAME =$20 ;RENAME DISK FILE DELETE =$21 ;DELETE DISK FILE FORMAT =$22 ;FORMAT DISK LOCKFL =$23 ;LOCK FILE (R s}EAD ONLY) UNLOCK =$24 ;UNLOCK FILE POINT =$25 ;POINT SECTOR NOTE =$26 ;NOTE SECTOR CCIO =$28 ;CONCURRENT I/O MO t}DE IOCFRE =$FF ;IOCB "FREE" ; AUX1 VALUES FOR OPEN APPEND =$01 ;OPEN FOR APPEND DIRECT =$02 ;OPEN FOR DIRECTO u}RY ACCESS OPNIN =$04 ;OPEN FOR INPUT OPNOT =$08 ;OPEN FOR OUTPUT OPNINO =OPNIN!OPNOT ;OPEN FOR INPUT/OUTPUT MXDMOD = v}$10 ;OPEN FOR MIXED MODE INSCLR =$20 ;OPEN WITHOUT CLEARING SCREEN ; OS STATUS CODES SUCCES =$01 ;SUCCESSFUL OPE w}RATION BRKABT =$80 ;(128) BREAK KEY ABORT PRVOPN =$81 ;(129) IOCB ALREADY OPEN NONDEV =$82 ;(130) NON-EX DEVICE WRO x}NLY =$83 ;(131) IOCB OPENED FOR WRITE ONLY NVALID =$84 ;(132) INVALID COMMAND NOTOPN =$85 ;(133) DEVICE OR FILE NOT O y}PEN BADIOC =$86 ;(134) INVALID IOCB NUMBER RDONLY =$87 ;(135) IOCB OPENED FOR READ ONLY EOFERR =$88 ;(136) END OF FI z}LE TRNRCD =$89 ;(137) TRUNCATED RECORD TIMOUT =$8A ;(138) DEVICE TIMEOUT DNACK =$8B ;(139) DEVICE DOES NOT ACK COMMA {}ND FRMERR =$8C ;(140) SERIAL BUS FRAMING ERROR CRSROR =$8D ;(141) CURSOR OUT OF RANGE OVRRUN =$8E ;(142) SERIAL BUS |}DATA OVERRUN CHKERR =$8F ;(143) SERIAL BUS CHECKSUM ERROR DERROR =$90 ;(144) DEVICE ERROR (OPERATION INCOMPLETE) BADMO }}D =$91 ;(145) BAD SCREEN MODE NUMBER FNCNOT =$92 ;(146) FUNCTION NOT IN HANDLER SCRMEM =$93 ;(147) INSUFFICIENT MEMOR ~}Y FOR SCREEN MODE ; PAGE 0 LOCATIONS LINZBS =$00 ;LINBUG STORAGE ; THESE LOCS ARE NOT CLEARED CASINI =$02 ; }CASSETTE INIT LOC RAMLO =$04 ;RAM POINTER FOR MEM TEST TRAMSZ =$06 ;TEMP LOC FOR RAM SIZE TSTDAT =$07 ;RAM TEST DATA } LOC ; CLEARED ON COLDSTART ONLY WARMST =$08 ;WARM START FLAG BOOTQ =$09 ;SUCCESSFUL BOOT FLAG DOSVEC =$0A ;DO }S START VECTOR DOSINI =$0C ;DOS INIT ADDRESS APPMHI =$0E ;APPLICATION MEM HI LIMIT ; CLEARED ON COLD OR WARM START } INTZBS =$10 ; START OF OS RAM CLEAR LOC => $7F POKMSK =$10 ;SYSTEM MASK FOR POKEY IRQ ENABLE BRKKEY =$11 ;BREAK KE }Y FLAG RTCLOK =$12 ;REAL TIME CLOCK (60HZ OR 16.66666 MS) ; 3 bytes; hi order, medium, low BUFADR =$15 ;INDIRECT B }UFFER ADDRESS REG ICCOMT =$17 ;COMMAND FOR VECTOR HANDLER DSKFMS =$18 ;DISK FILE MANAGER POINTER DSKUTL =$1A ;DISK U }TILITIES POINTER PTIMOT =$1C ;PRINTER TIME OUT REGISTER PBPNT =$1D ;PRINT BUFFER POINTER PBUFSZ =$1E ;PRINT BUFFER S }IZE PTEMP =$1F ;TEMP REG ZIOCB =$20 ;PAGE 0 I/O CONTROL BLOCK IOCBSZ =16 ;NUMBER OF BYTES / IOCB MAXIOC =8*IOCBSZ };LENGTH OF IOCB AREA IOCBAS =ZIOCB ICHIDZ =$20 ;HANDLER INDEX NUMBER ($FF := IOCB FREE) ICDNOZ =$21 ;DEVICE NUMBER ( }DRIVE NUMBER) ICCOMZ =$22 ;COMMAND CODE ICSTAZ =$23 ;STATUS OF LAST IOCB ACTION ICBALZ =$24 ;BUFFER ADDRESS (LOW) I }CBAHZ =$25 ; " " (HIGH) ICPTLZ =$26 ;PUT BYTE ROUTINE ADDRESS - 1 ICPTHZ =$27 ICBLLZ =$28 ;BUFFER LENGTH (LOW) }ICBLHZ =$29 ; " " (HIGH) ICAX1Z =$2A ;AUX INFO ICAX2Z =$2B ICSPRZ =$2C ;SPARE BYTES (CIO LOCAL USE) ICIDNO =I }CSPRZ+2 ;IOCB LUMBER * 16 CIOCHR =ICSPRZ+3 ;CHARACTER BYTE FOR CURRENT OPERATION OSSTATUS =$30 ;INTERNAL STATUS STORA }GE OSCHKSUM =$31 ;CHECKSUM (SINGLE BYTE SUM WITH CARRY) BUNRLO =$32 ;POINTER TO DATA BUFFER (LO BYTE) BUFRHI =$33 ;P }OINTER TO DATA BUFFER (HI BYTE) BFENLO =$34 ;NEXT BYTE PAST END OF BUFFER (LO BYTE) BNENHI =$35 ;NEXT BYTE PAST END OF }BUFFER (HI BYTE) CRETRY =$36 ;NUMBER OF COMMAND FRAM RETRIES DRETRY =$39 ;NUMBER OF DEVICE RETRIES BUFRFL =$38 ;DATA } BUFFER FULL FLAG RECVDN =$39 ;RECEIVE DONE FLAG XMTDON =$3A ;XMIT DONE FLAG CHKSNT =$3B ;CHECKSUM SENT FLAG NOCKSM } =$3C ;NO CHECKSUM FOLLOWS DATA FLAG BPTR =$3D ;BUFFER POINTER (CASSETTE) FTYPE =$3E ;FILE TYPE (SHORT IRG/LONG IRG }) FEOF =$3F ;END OF FILE FLAG (CASSETTE) FREQ =$40 ;FREQ COUNTER FOR CONSOLE SPEAKER SOUNDR =$41 ;NOISY I/O FLAG. (Z }ERO IS QUIET) CRITIC =$42 ;CRITICAL CODE IF NON-ZERO) FMSZPG =$43 ;DISK FILE MANAGER SYSTEM STORAGE (7 BYTES) CKEY } =$4A ;SET WHEN GAME START PRESSED CASSBT =$4B ;CASSETTE BOOT FLAG DSTAT =$4C ;DISPLAY STATUS ATRACT =$4D ;ATTRACT } MODE FLAG DRKMSK =$4E ;DARK ATTRACT MASK COLRSH =$4F ;ATTRACT COLOR SHIFTER (XOR'D WITH PLAYFIELD) TMPCHR =$50 ;T }EMP CHAR STORAGE (DISPLAY HANDLER) HOLD1 =$51 ;TEMP STG (DISPLAY HANDLER) LMARGN =$52 ;LEFT MARGIN RMARGN =$53 ;RIGH }T MARGIN ROWCRS =$54 ;CURSOR COUNTERS COLCRS =$55 DINDEX =$57 ;DISPLAY INDEX (VARIOUS QUANTS) SAVMSC =$58 OLDROW =$5 }A ;PREVIOUS ROW/COL OLDCOL =$5B OLDCHR =$5D ;DATA UNDER CURSOR OLDADR =$5E NEWROW =$60 ;POINT DRAWS TO HERE NEWCOL } =$61 LOGCOL =$63 ;POINTS AT COLUMN IN LOGICAL LINE ADRESS =$64 ;INDIRECT POINTER MLTTMP =$66 ;MULTIPLY TEMP OPNTMP } =MLTTMP ;FIRST BYTE IS USED IN OPEN AS TEMP SAVADR =$68 RAMTOP =$6A ;RAM SIZE DEFINED BY POWER ON LOGIC BUFCNT =$6B } ;BUFFER COUNT BUFSTR =$6C ;EDITOR GETCH POINTER BITMSK =$6E ;BIT MASK SHFAMT =$6F ;OUTCHR SHIFT ROWAC =$70 ;US }ED BY "DRAW" COLAC =$72 ENDPT =$74 DELTAR =$76 DELTAC =$77 ROWINC =$79 COLINC =$7A SWPFLG =$7B ;NON-0 IF TXT AND RAM } SWAPPED HOLDCH =$7C ;CH BEFORE CNTL & SHFT PROCESSING IN KGETCH INSDAT =$7D ;INSERT CHAR SAVE COUNTR =$7E ;DRAW COU }NTER ;;; $80 TO $FF ARE RESERVED FOR USER APPLICATIONS ; PAGE 2 LOCATIONS INTABS =$200 ;INTERRUPT TABLE VDSLST =$ }200 ;DISPLAY LIST NMI VECTOR VPRCED =$202 ;PROCEED LINE IRQ VECTOR VINTER =$204 ;INTERRUPT LINE IRQ VECTOR VBREAK =$ }206 ;"BRK" VECTOR VKEYBD =$208 ;POKEY KEYBOARD IRQ VECTOR VSERIN =$20A ;POKEY SERIAL INPUT READY VSEROR =$20C ;POK }EY SERIAL OUTPUT READY VSEROC =$20E ;POKEY SERIAL OUTPUT DONE VTIMR1 =$210 ;POKEY TIMER 1 IRQ VTIMR2 =$212 ;POKEY TI }MER 2 IRQ VTIMR4 =$214 ;POKEY TIMER 4 IRQ (DO NOT USE) VIMIRQ =$216 ;IMMEDIATE IRQ VECTOR CDTMV1 =$218 ;COUNT DOWN T }IMER 1 CDTMV2 =$21A ;COUNT DOWN TIMER 2 CDTMV3 =$21C ;COUNT DOWN TIMER 3 CDTMV4 =$21E ;COUNT DOWN TIMER 4 CDTMV5 =$ }220 ;COUNT DOWN TIMER 5 VVBLKI =$222 ;IMMEDIATE VERTICAL BLANK NMI VECTOR VVBLKD =$224 ;DEFERRED VERTICAL BLANK NMI V }ECTOR CDTMA1 =$226 ;COUNT DOWN TIMER 1 JSR ADDRESS CDTMA2 =$228 ;COUNT DOWN TIMER 2 JSR ADDRESS CDTMF3 =$22A ;COUNT }DOWN TIMER 3 FLAG SRTIMR =$22B ;SOFTWARE REPEAT TIMER CDTMF4 =$22C ;COUNT DOWN TIMER 4 FLAG INTEMP =$22D ;IAN'S TEMP } (???) CDTMF5 =$22E ;COUNT DOWN TIMER 5 FLAG SDMCTL =$22F ;SAVE DMACTL REGISTER DMACTL =$D400 ; the real DMA control } reg SDLSTL =$230 ;SAVE DISPLAY LIST (LOW) SDLSTH =$231 ;SAVE DISPLAY LIST (HIGH) SSKCTL =$232 ;SKCTL REGISTER RAM } LPENH =$234 ;LIGHT PEN HORIZ VALUE LPENV =$235 ;LIGHT PEN VERT VALUE ; ($236 - $239 SPARE) CDEVIC =$23A ;COMMA }ND FRAME BUFFER - DEVICE CCOMND =$23B ;COMMAND CAUX1 =$23C ;COMMAND AUX BYTE 1 CAUX2 =$23D ;COMMAND AUX BYTE 2 TEMP } =$23E ;YES ERRFLG =$23F ;ERROR FLAG - ANY DEVICE ERROR EXCEPT TIMEOUT DFLAGS =$240 ;DISK FLAGS FROM SECTOR ONE DB }SECT =$241 ;NUMBER OF DISK BOOT SECTORS BOOTAD =$242 ;ADDRESS FOR DISK BOOT LOADER COLDST =$244 ;COLDSTART FLAG (1 = }DOING COLDSTART) ;($245 SPARE) DSKTIM =$246 ;DISK TIME OUT REG LINBUF =$247 ;CHAR LINE BUFFER (40 BYTES) GPRIOR } =$26F ;GLOBAL PRIORITY CELL PADDL0 =$270 ;POT 0 SHADOW PADDL1 =$271 ;POT 1 SHADOW PADDL2 =$272 ;POT 2 SHADOW PAD }DL3 =$273 ;POT 3 SHADOW PADDL4 =$274 ;POT 4 SHADOW PADDL5 =$275 ;POT 5 SHADOW PADDL6 =$276 ;POT 6 SHADOW PADDL7 = }$277 ;POT 7 SHADOW STICK0 =$278 ;JOYSTICK 0 SHADOW STICK1 =$279 ;JOYSTICK 1 SHADOW STICK2 =$27A ;JOYSTICK 2 SHADOW } STICK3 =$27B ;JOYSTICK 3 SHADOW PTRIG0 =$27C ;PADDLE 0 TRIGGER PTRIG1 =$27D ;PADDLE 1 TRIGGER PTRIG2 =$27E ;PADD }LE 2 TRIGGER PTRIG3 =$27F ;PADDLE 3 TRIGGER PTRIG4 =$280 ;PADDLE 4 TRIGGER PTRIG5 =$281 ;PADDLE 5 TRIGGER PTRIG6 =$ }282 ;PADDLE 6 TRIGGER PTRIG7 =$283 ;PADDLE 7 TRIGGER STRIG0 =$284 ;JOYSTICK 0 TRIGGER STRIG1 =$285 ;JOYSTICK 1 TRI }GGER STRIG2 =$286 ;JOYSTICK 2 TRIGGER STRIG3 =$287 ;JOYSTICK 3 TRIGGER CSTAT =$288 ;(UNUSED) WMODE =$289 ;R/W F }LAG FOR CASSETTE BLIM =$28A ;BUFFER LIMIT (CASSETTE) ;($28B - $28F SPARE) TXTROW =$290 ;TEXT ROWCRS TXTCOL =$291 } ;TEXT ROWCOL TINDEX =$293 ;TEXT INDEX TXTMSC =$294 ;FOOLS CONVRT INTO NEW MSC TXTOLD =$296 ;OLDROW & OLDCOL FOR TE }XT (AND THEN SOME) TMPX1 =$29C HOLD3 =$29D SUBTMP =$29E HOLD2 =$29F DMASK =$2A0 TMPLBT =$2A1 OSESCFLG =$2A2 ;ESCAPE }FLAG TABMAP =$2A3 ;TAB BUFFER LOGMAP =$2B2 ;LOGICAL LINE START BIT MAP INVFLG =$2B6 ;INVERSE VIDEO FLAG (ATARI KEY) } FILFLG =$2B7 ;RIGHT FILL FLAG FOR DRAW TMPROW =$2B8 TMPCOL =$2B9 SCRFLG =$2BB ;SET IF SCROLL OCCURS HOLD4 =$2BC ;M }ORE DRAW TEMPS HOLD5 =$2BD SHFLOK =$2BE ;SHIFT LOCK KEY BOTSCR =$2BF ;BOTTOM OF SCREEN (24 NORM, 4 SPLIT) PCOLR0 =$ }2C0 ;P0 COLOR PCOLR1 =$2C1 ;P1 COLOR PCOLR2 =$2C2 ;P2 COLOR PCOLR3 =$2C3 ;P3 COLOR COLOR0 =$2C4 ;COLOR 0 COLOR }1 =$2C5 COLOR2 =$2C6 COLOR3 =$2C7 COLOR4 =$2C8 ;BACKGROUND ;($2C9 - $2DF SPARE) GLBABS =$2E0 ;GLOBAL VARIABLES } ;($2E0 - $2E3 SPARE) RAMSIZ =$2E4 ;RAM SIZE (HI BYTE ONLY) MEMTOP =$2E5 ;TOP OF AVAILABLE MEMORY MEMLO =$2E7 ;BO }TTOM OF AVAILABLE MEMORY ;($2E9 SPARE) DVSTAT =$2EA ;STATUS BUFFER CBAUDL =$2EE ;CASSETTE BAUD RATE (LO BYTE) CBA }UDH =$2EF ; " " " (HI BYTE) CRSINH =$2F0 ;CURSOR INHIBIT (00 = CURSOR ON) KEYDEL =$2F1 ;KEY DELAY CH1 =$ }2F2 CHACT =$2F3 ;CHACTL REGISTER (SHADOW) CHBAS =$2F4 ;CHBAS REGISTER (SHADOW) ;($2F5 - $2F9 SPARE) OSCHAR =$2FA } ATACHR =$2FB ;ATASCII CHARACTER CH =$2FC ;GLOBAL VARIABLE FOR KEYBOARD FILDAT =$2FD ;RIGHT FILL DATA (DRAW) DSPFLG }=$2FE ;DISPLAY FLAG: DISP CONTROLS IF NON-ZERO SSFLAG =$2FF ;START/STOP FLAG (CNTL-1) FOR PAGING ; PAGE 3 LOCATIONS } DCB =$300 ;DEVICE CONTROL BLOCK DDEVIC =$300 ;BUS I.D. NUMBER DUNIT =$301 ;UNIT NUMBER DCOMND =$302 ;BUS COMMAND } DSTATS =$303 ;COMMAND TYPE/STATUS RETURN DBUFLO =$304 ;DATA BUFFER POINTER DBUFHI =$305 ; ... DTIMLO =$306 ;DEVI }CE TIME OUT IN 1 SEC. UNITS DUNUSE =$307 ;UNUSED DBYTLO =$308 ;BYTE COUNT DBYTHI =$309 ; ... DAUX1 =$30A ;COMMAND } AUXILLARY BYTES DAUX2 =$30B ; ... TIMER1 =$30C ;INITIAL TIMER VALUE ADDCOR =$30E ;ADDITION CORRECTION CASFLG =$3 }0F ;CASSETTE MODE WHEN SET TIMER2 =$310 ;FINAL TIME VALUE (USED TO COMPUTE BAUD RATE) TEMP1 =$312 ;TEMP LOCATIONS TE }MP2 =$314 ; ... TEMP3 =$315 ; ... SAVIO =$316 ;SAVE SERIAL IN DATA PORT TIMFLG =$317 ;TIME OUT FLAG FOR BAUD RATE }CORRECTION STACKP =$318 ;SIO STACK POINTER SAVE LOC TSTAT =$319 ;TEMP STATUS LOC HATABS =$31A ;HANDLER ADDRESS TAB }LE MAXDEV =$21 ;MAXIMUM HANDLER ADDRESS INDEX ; IOCB OFFSETS IOCB =$340 ;I/O CONTROL BLOCKS ICHID =$340 ;HAND }LER INDEX ($FF = FREE) ICDNO =$341 ;DEVICE NUMBER (DRIVE NUMBER) ICCOM =$342 ;COMMAND CODE ICSTA =$343 ;STATUS ICBA }L =$344 ;BUFFER ADDRESS ICBAH =$345 ; ... ICPTL =$346 ;PUT BYTE ROUTINE ADDRESS - 1 ICPTH =$347 ; ... ICBLL =$348 } ;BUFFER LENGTH ICBLH =$349 ; ... ICAX1 =$34A ;AUXILLARY INFO ICAX2 =$34B ; ... ICSPR =$34C ;4 SPARE BYTES P }RNBUF =$3C0 ;PRINTER BUFFER ;($3EA - $3FC SPARE) ; PAGE 4 LOCATIONS CASBUF =$3FD ;CASSETTE BUFFER ; USER AR }EA STARTS HERE AND GOES TO THE END OF PAGE 5 USAREA =$480 ; ; Other random stuff ; CONSOL = $D01F ; console switche }s start, select, option ;ATASCII CHARACTER DEFS ATCLR =$7D ;CLEAR SCREEN CHARACTER ATRUB =$7E ;BACK SPACE (RUBOUT) }ATTAB =$7F ;TAB ATEOL =$9B ;END-OF-LINE ATDELL =$9C ; Delete line ATBEL =$FD ;CONSOLE BELL ATURW =$1C ;UP-ARROW } ATDRW =$1D ;DOWN-ARROW ATLRW =$1E ;LEFT-ARROW ATRRW =$1F ;RIGHT-ARROW ; USEFUL VALUES LEDGE =2 ;LMARGN'S IN }ITIAL VALUE REDGE =39 ;RMARGN'S INITIAL VALUE ; ; End of SYSMAC.SML ;------------------------------------------------ }---------------- ; ; defs from sysequ.asm ; ; ; EXECUTE FLAG DEFINES ; EXCYES = $80 ; EXECUTE IN PROGRESS EXCSCR = } $40 ; ECHO EXCUTE INPUT TO SCREEN EXCNEW = $10 ; EXECUTE START UP MODE EXCSUP = $20 ; COLD START EXEC FLAG ; ; MISC ADDR }ESS EQUATES ; CPALOC = $0A ; POINTER TO CP/A WARMST = $08 ; WARM START (0=COLD) MEMLO = $2E7 ; AVAIL MEM (LOW) PTR MEMTO }P = $2E5 ; AVAIL MEM (HIGH) PTR APPMHI = $0E ; UPPER LIMIT OF APPLICATION MEMORY INITADR = $2E2 ; ATARI LOAD/INIT ADR GOAD }R = $2E0 ; ATARI LOAD/GO ADR CARTLOC = $BFFA ; CARTRIDGE RUN LOCATION CIO = $E456 ; CIO ENTRY ADR EOL = $9B ; END OF LINE }CHAR ; ; ; CP/A FUNCTION AND VALUE DISPLACEMSNT ; (INDIRECT THROUGH CPALOC) ; IE. (CPALOC),Y ; CPGNFN = } 3 ; GET NEXT FILE NAME CPDFDV = $07 ; DEFAULT DRIVE (3 BYTES) CPBUFP = $0A ; CMD BUFF NEXT CHAR POINTR (1 BYTE) CPEXFL = }$0B ; EXECUTE FLAG CPEXFN = $0C ; EXECUTE FILE NAME (16 BYTES) CPEXNP = $1C ; EXECUTE NOTE/POINT VALUES CPFNAM = $21 ; FIL }ENAME BUFFER RUNLOC = $3D ; CP/A LOAD/RUN ADR CPCMDB = $3F ; COMMAND BUFFER (60 BYTES) ;CPCMDGO = -6 ; CP SUBROUTINE VECT }OR ; ;---------------------------------------------------------------- ; ; Floating point defs ; fr0 = $D4 ; float reg } 0 fr1 = $E0 ; float reg 1 flptr = $FC ; pointer to a fp num inbuff = $F3 ; pointer to ascii num ifp = $D9AA ; int }in fr0 -> float in fr0 fpi = $D9D2 ; float in fr0 -> int in fr0 fasc = $D8E6 ; fr0 -> (inbuff) fmove = $DDB6 ; fr0 -> f }r1 fadd = $DA66 ; fr0 + fr1 -> fr0 fsub = $DA60 ; fr0 - fr1 -> fr0 fmul = $DADB ; fr0 * fr1 -> fr0 fdiv = $DB28 ; fr0 } / fr1 -> fr0 fld1r = $DD98 ; fr1 <- (XY) ; end of atari.m65 fr0 fmul = $DADB ; fr0 * fr1 -> fr0 fdiv = $DB28 ; fr0 Ca2at atoi.c sanitize atoi.c a2at fopen.c sanitize fopen.c a2at isascii.c sanitize isascii.c a2at ispunct.c sanitize is}punct.c a2at itou.c sanitize itou.c a2at reverse.c sanitize reverse.c a2at xtoi.c sanitize xtoi.c a2at atoib.c saniti}ze atoib.c a2at fprintf.c sanitize fprintf.c a2at isatty.c sanitize isatty.c a2at isspace.c sanitize isspace.c a2at it}ox.c sanitize itox.c a2at startup.c sanitize startup.c a2at delete.c sanitize delete.c a2at fputs.c sanitize fputs.c }a2at iscntrl.c sanitize iscntrl.c a2at isupper.c sanitize isupper.c a2at open.c sanitize open.c a2at strcat.c sanitize} strcat.c a2at dtoi.c sanitize dtoi.c a2at fread.c sanitize fread.c a2at iscons.c sanitize iscons.c a2at isxdigit.c s}anitize isxdigit.c a2at otoi.c sanitize otoi.c a2at strcmp.c sanitize strcmp.c a2at fclose.c sanitize fclose.c a2at fw}rite.c sanitize fwrite.c a2at isgraph.c sanitize isgraph.c a2at itoab.c sanitize itoab.c a2at pmalloc.c sanitize pmall}oc.c a2at time.c sanitize time.c a2at fgets.c sanitize fgets.c a2at gets.c sanitize gets.c a2at islower.c sanitize is}lower.c a2at itod.c sanitize itod.c a2at readargs.c sanitize readargs.c a2at toascii.c sanitize toascii.c a2at fname.c} sanitize fname.c a2at isalnum.c sanitize isalnum.c a2at isprint.c sanitize isprint.c a2at itoo.c sanitize itoo.c a2a}t rename.c sanitize rename.c a2at utoi.c sanitize utoi.c a2at atari.m65 sanitize atari.m65 a2at close.m65 sanitize clo}se.m65 a2at getch.m65 sanitize getch.m65 a2at isodigit.m65 sanitize isodigit.m65 a2at runtime.m65 sanitize runtime.m65 } a2at toupper.m65 sanitize toupper.m65 a2at bcopy.m65 sanitize bcopy.m65 a2at closeall.m65 sanitize closeall.m65 a2at g}lobal.m65 sanitize global.m65 a2at iswhite.m65 sanitize iswhite.m65 a2at rwcommon.m65 sanitize rwcommon.m65 a2at tprint}f.m65 sanitize tprintf.m65 a2at bzero.m65 sanitize bzero.m65 a2at cputc.m65 sanitize cputc.m65 a2at heap.m65 sanitize }heap.m65 a2at itoa.m65 sanitize itoa.m65 a2at stdio.m65 sanitize stdio.m65 a2at write.m65 sanitize write.m65 a2at cget}c.m65 sanitize cgetc.m65 a2at fdelete.m65 sanitize fdelete.m65 a2at isalpha.m65 sanitize isalpha.m65 a2at parselin.m65 } sanitize parselin.m65 a2at strchr.m65 sanitize strchr.m65 a2at cgets.m65 sanitize cgets.m65 a2at frename.m65 sanitize }frename.m65 a2at isdigit.m65 sanitize isdigit.m65 a2at read.m65 sanitize read.m65 a2at tolower.m65 sanitize tolower.m65} a2at ctype.h sanitize ctype.h a2at file.h sanitize file.h a2at stdio.h sanitize stdio.h wer.m65 sanitize tolower.m65`#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* This softw}are is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */ /* atoi(s) }- convert s to integer. */ atoi(s) char *s; { int sign, n; while(isspace(*s)) ++s; sign = 1; switch(*s) } { case '-': sign = -1; case '+': ++s; } n = 0; while(isdigit(*s)) n = 10 * n + *s++ - '0'; retu}rn (sign * n); } sign = -1; case '+': ++s; } n = 0; while(isdigit(*s)) n = 10 * n + *s++ - '0'; retu#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* atoib(s,b) -} Convert s to "unsigned" integer in base b. NOTE: This is a non-standard function. */ atoib(s, b) char *}s; int b; { int n, digit; n = 0; while(isspace(*s)) ++s; while((digit = (127 & *s++)) >= '0') { if}(digit >= 'a') digit -= 87; else if(digit >= 'A') digit -= 55; else digit -= '0'; } if(digit >= b) break; n = b * n + digit; } return (n); } 5; else digit -= '0'; N; ; bcopy(p1, p2, nbytes) ; .globl _bcopy _bcopy: jsr popax ; get nbytes sta tmp1 stx tmp1+1 jsr popax ; p2 }sta ptr2 stx ptr2+1 jsr popax ; p1 sta ptr1 stx ptr1+1 bc1: lda tmp1+1 ; nbytes^ beq bc3 ldy #0 ; set up to} move 256 bc2: lda (ptr1),y ; get a byte sta (ptr2),y ; store it iny bne bc2 inc ptr1+1 ; bump ptrs inc ptr2+1 } dec tmp1+1 jmp bc1 ; do another block bc3: ldy #0 ; set up for last section of < 256 bc4: cpy tmp1 ; done yet? } beq bc5 ; yup, exit lda (ptr1),y ; get a byte sta (ptr2),y ; store it iny bne bc4 bc5: rts ; done! ;ne yet? t; ; bzero(ptr, nbytes) ; .globl _bzero _bzero: jsr popax ; get nbytes sta tmp1 stx tmp2 jsr popax ; get ptr !}sta ptr1 stx ptr1+1 lda #0 bz1: ldx tmp2 ; get nbytes^ beq bz3 ; zero, try lo ldy #0 bz2: sta (ptr1),y ; zap !}a byte iny bne bz2 inc ptr1+1 ; bump ptr^ dec tmp2 ; dec nbytes^ bne bz1 ; around again bz3: ldy tmp1 beq b!}z5 ldy #0 bz4: sta (ptr1),y ; zap a byte iny cpy tmp1 ; done? bne bz4 bz5: rts again bz3: ldy tmp1 beq b _atoi.c fopen.c isascii.c ispunct.c itou.c reverse.c xtoi.c atoib.c fprintf.c isatty.c isspace.c itox.c% } startup.c delete.c fputs.c iscntrl.c isupper.c open.c strcat.c dtoi.c fread.c iscons.c isxdig% }it.c otoi.c strcmp.c fclose.c fwrite.c isgraph.c itoab.c pmalloc.c time.c fgets.c gets.c islowe% }r.c itod.c readargs.c toascii.c fname.c isalnum.c isprint.c itoo.c rename.c utoi.c gets.c islowe$l; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; )}; ; cgetc(iocb) ; .globl _fgetc _fgetc: .globl _cgetc _cgetc: jsr popax ; get iocb tax lda #0 sta icbll,x )}sta icblh,x sta icbal,x sta icbah,x lda #getchr sta iccom,x jsr ciov bpl getc9 cpy #EOFERR ; EOF? beq getceo)}f jmp ioreturn ; go return error getc9: ldx #0 ; return hi byte 0 rts getceof: lda #$FF tax rts ; beq getceo(s; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; -}; ; simple version of fgets ; cgets(str, size, iocb) ; char *str; ; int size, iocb; ; .globl _cgets _cgets: jsr pop-}ax ; get iocb sta tmp1 ; stash iocb here jsr popax ; get size stx tmp2 ; save x ldx tmp1 ; get iocb sta icbll,-}x ; store size lo lda tmp2 sta icblh,x ; store size hi jsr popax ; get buf addr stx ptr2+1 ; save x sta ptr2 ;-} and a, we'll return it if not eof ldx tmp1 ; get iocb sta icbal,x ; store size lo lda tmp2 sta icbah,x ; store si-}ze hi lda #getrec ; get a line sta iccom,x jsr ciov cpy #0 bmi return0 ldx ptr2+1 ; return the pointer lda pt-}r2 rts return0: lda #0 ; return NULL tax rts ov cpy #0 bmi return0 ldx ptr2+1 ; return the pointer lda pt,8 Nov 18 22:29:40 1989 (Jrd at local) * runtime.m65: Add new routines: ldaui: load A (unsigned) from (AX) ldauidx: 1}. ldauysp: . :40 1989 (Jrd at local) * runtime.m65: Add new routines: ldaui: load A (unsigned) from (AX) ldauidx: 0; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; 5}; ; close an iocb ; .globl _cclose _cclose: .globl _close _close: jsr popax ; get iocb num tax lda #close st5}a iccom,x jsr ciov tya bmi *+5 ldx #0 rts ldx #$FF rts se: jsr popax ; get iocb num tax lda #close st4F; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; 9}; ; close all iocbs ; .globl _closeall _closeall: ldx #$10 lda #close sta iccom,x jsr ciov txa clc adc #$19}0 tax cpx #$80 bcc _closeall+2 rts _closeall: ldx #$10 lda #close sta iccom,x jsr ciov txa clc adc #$18,-*- Mode: Text -*- This is the copyright notice for RA65, LINK65, LIBR65, and other Atari 8-bit programs. Said progra=!}ms are Copyright 1989, by John R. Dunning. All rights reserved, with the following exceptions: Anyone may copy or re="}distribute these programs, provided that: 1: You don't charge anything for the copy. It is permissable to charge a=#} nominal fee for media, etc. 2: All source code and documentation for the programs is made available as part of the =$}distribution. 3: This copyright notice is preserved verbatim, and included in the distribution. You are allo=%}wed to modify these programs, and redistribute the modified versions, provided that the modifications are clearly noted. =&} There is NO WARRANTY with this software, it comes as is, and is distributed in the hope that it may be useful. T='}his copyright notice applies to any program which contains this text, or the refers to this file. This copyright noti=(}ce is based on the one published by the Free Software Foundation, sometimes known as the GNU project. The idea is the same=)} as theirs, ie the software is free, and is intended to stay that way. Everybody has the right to copy, modify, and re- di=*}stribute this software. Nobody has the right to prevent anyone else from copying, modifying or redistributing it. re- di<u; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; A,}; ; cputc(ch, iocb) ; .globl _fputc _fputc: .globl _cputc _cputc: jsr popax ; get iocb sta tmp1 jsr popax ; gA-}et char ldx tmp1 pha lda #0 sta icbll,x sta icblh,x sta icbal,x sta icbah,x lda #putchr sta iccom,x pla A.} jsr ciov bpl putc9 jmp ioreturn ; do common error stuff putc9: tya ldx #0 rts lda #putchr sta iccom,x pla @[ /* nothing here? */ extern int iswhite(); error stuff putc9: tya ldx #0 rts lda #putchr sta iccom,x pla D0 /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */I1} /* delete a file */ int delete(name) char * name; { char buf[80]; fn_default(name, 0, buf); strcat(buf, "I2}\n"); return(fdelete(buf)); } (name) char * name; { char buf[80]; fn_default(name, 0, buf); strcat(buf, "H% /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */M4} This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */L; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; P}#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include U7} /* dtoi -- convert signed decimal string to integer nbr returns field length, else ERR on error */ dtoi(deU8}cstr, nbr) char *decstr; int *nbr; { int len, s; if((*decstr)=='-') {s=1; ++decstr;} else s=0; if((len=utoi(decstU9}r, nbr))<0) return ERR; if(*nbr<0) return ERR; if(s) {*nbr = -*nbr; return ++len;} else return len; } (len=utoi(decstTn#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include Y;} /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. *Y<}/ /* Close fd Entry: fd = File descriptor for file to be closed. Returns NULL for success, otherwise ERR */ Y=} fclose(fd) int fd; { /* if (close(fd) >= 0) return(NULL); else return(ERR); ... we can do better thanY>} that... */ return(close(fd) >= 0 ? NULL : ERR); } urn(NULL); else return(ERR); ... we can do better thanX<; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; ]@}; ; delete file. ; fdelete(str); ; xcb: .byte 0 .globl _fdelete _fdelete: jsr findiocb ; find a free iocb stx xc]A}b ; save it jsr popax ; get the name string ldy xcb sta icbal,y ; store str\ txa sta icbah,y ; store str^ tya]B} tax ; get iocb in x lda #delete ; get rename opcode sta iccom,x lda #0 sta icax1,x sta icax2,x jsr ciov b]C}pl del0 jmp ioreturn ; common error handling code del0: tya ldx #0 rts ; sta icax1,x sta icax2,x jsr ciov b\T#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include aE} /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. *aF}/ /* Gets an entire string (including its newline terminator) or size-1 characters, whichever comes first. TheaG} input is terminated by a null character. Entry: str = Pointer to destination buffer. size = Size of the destaH}ination buffer. fd = File descriptor of pertinent file. Returns str on success, else NULL. */ fgets(str, saI}ize, fd) char * str; int size, fd; { int ch; char * retval; retval = NULL; /* default */ for ( ; --size > 0aJ} ; ) { ch = fgetc(fd); /* get one */ if (ch == EOF) break; if (!retval) retval = str; *str++ = ch; /* storeaK} it */ if (ch == '\n') break; /* stop at EOL */ } *str = '\0'; return(retval); } ; *str++ = ch; /* store`c /* defs for file opening. these are the values passed to CIO in AUX1, when opening */ #define O_RDONLY 0x04 #defieM}ne O_WRONLY 0x08 #define O_CREAT 0x08 #define O_TRUNC 0x08 O in AUX1, when opening */ #define O_RDONLY 0x04 #defid>foreach c { startup atoi fputs fgets gets fprintf reverse iscntrl isprint itox atoib isalnum iscons ispunct itoab otoi strcmpiO} dtoi isspace itod pmalloc utoi fclose isascii isgraph isupper itoo time xtoi fopen isatty islower isxdigit itou toascii openiP} rename delete fname fread fwrite readargs strcat } cp \a8\cc8\lib\$c.c . endfor foreach m65 { stdio frename fdelete ciQ}lose closeall cputc cgetc cgets read write rwcommon tprintf heap itoa isalpha isodigit isdigit iswhite bzero bcopy strchr getiR}ch parselin tolower toupper } cp \a8\cc8\lib\$m65.m65 . endfor isalpha isodigit isdigit iswhite bzero bcopy strchr gethFatoi.c fopen.c isascii.c ispunct.c itou.c reverse.c xtoi.c atoib.c fprintf.c isatty.c isspace.c itox.c startup.c mT} delete.c fputs.c iscntrl.c isupper.c open.c strcat.c dtoi.c fread.c iscons.c isxdigit.c otoi.c strcmp.c fclose.cmU} fwrite.c isgraph.c itoab.c pmalloc.c time.c fgets.c gets.c islower.c itod.c readargs.c toascii.c fname.c isalnumV}m.c isprint.c itoo.c rename.c utoi.c atari.m65 close.m65 getch.m65 isodigit.m65 runtime.m65 toupper.m65 bcopy.m65 mW} closeall.m65 global.m65 iswhite.m65 rwcommon.m65 tprintf.m65 bzero.m65 cputc.m65 heap.m65 itoa.m65 stdio.m65 writemX}.m65 cgetc.m65 fdelete.m65 isalpha.m65 parselin.m65 strchr.m65 cgets.m65 frename.m65 isdigit.m65 read.m65 tolower.mmY}65 ctype.h file.h stdio.h isalpha.m65 parselin.m65 strchr.m65 cgets.m65 frename.m65 isdigit.m65 read.m65 tolower.ml /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */q[} /* handy util for fixing up file names */ fn_default(name, ext, target) char * name; char * ext; char * targq\}et; { char buf[80]; /* temp storage */ /* this is bummed for space, not speed; it'll copy the data around even whq]}en it doesn't have to... */ if (!strchr(name, ':')) { strcpy(buf, "D:"); strcat(buf, name); stq^}rcpy(target, buf); } else strcpy(target, name); if (ext) if (!strchr(target, '.')) { strcat(tarq_}get, ext); } } } else strcpy(target, name); if (ext) if (!strchr(target, '.')) { strcat(tarp#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include ua} /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. *ub}/ /* Open file indicated by fn. Entry: fn = ASCIIZ file name. May be prefixed by letter of driuc}ve. mode = "a" - append "r" - read "w" - write "u" - updud}ate (some of those might not work on atari -- jrd) Returns a file descriptor on success, else NULL. */ FILE * fopenue}(fn, mode) char * fn, * mode; { int iocb; iocb = copen(fn, *mode); if (iocb < 0) { errno = iocb; return(uf}0); } return(iocb); /* just return it as a (FILE * ) */ } n, *mode); if (iocb < 0) { errno = iocb; return(tD/* #define NOARGC /* no argument count passing */ /* This software is copyright 1989 by John Dunning. See the file yq}B%DOS SYSB*)DUP SYSBSASCII BATB{fATARI M65BATASCII BATBATOI C BATOIB C BBCOPY M65BBZERO M65B C_FILES LSTB CGETC M65BCGETS M65BCHANGELO BCLOSE M65BCLOSEALLM65B COPYLEFTJRDB+CPUTC M65B/CTYPE H B0DELETE C B3DISCLAIMH B5DISCLAIMM65B6DTOI C B:FCLOSE C B?FDELETE M65BDFGETS C BLFILE H BNFILES G BSFILES LSTBZFNAME C B`FOPEN C BgFPRINTF C BFPUTS C BFREAD C BFRENAME M65BFWRITE C BGETCH M65BGETS C BGLOBAL M65BH_FILES LSTBHEAP M65BISALNUM C BISALPHA M65BISASCII C BISATTY C BISCNTRL C BISCONS C BISDIGIT M65BISGRAPH C BISLOWER C BISODIGITM65BISPRINT C BISPUNCT C BISSPACE C BISUPPER C BISWHITE M65BISXDIGITC BITOA M65BITOAB C BITOD C BITOO C BITOU C BITOX C BM_FILES LSTBMAKEFILE 'COPYLEFT.JRD' for the full copyright notice. */ #include /* fprintf(fd, ctlstring, arg, arg, ...) - Formyr}atted print. Operates as described by Kernighan & Ritchie. b, c, d, o, s, u, and x specifications are supported. ys}Note: b (binary) is a non-standard extension. */ fprintf(argc) int argc; { int dummy[1]; int * nxtarg; /* nxtargyt} = CCARGC() + &argc; */ nxtarg = &argc + dummy[1] - 1; return(_pfguts(*nxtarg, --nxtarg)); } /* printf(ctlstrinyu}g, arg, arg, ...) - Formatted print. Operates as described by Kernighan & Ritchie. b, c, d, o, s, u, and x specificatyv}ions are supported. Note: b (binary) is a non-standard extension. */ printf(args) int args; { int dummy[1]; yw} /* tprintf("printf: &args=%x &argc=%x argc=%d\n", &args, &dummy[1], dummy[1]); */ return(_pfguts(stdout, &args + dummy[1yx}] - 1)); } /* _pfguts(fd, ctlstring, arg, arg, ...) Called by fprintf() and printf(). */ _pfguts(fd, nxtarg) iyy}nt fd; int *nxtarg; { int arg, left, pad, cc, len, maxchr, width; char *ctl, *sptr, str[17]; cc = 0; yz} ctl = *nxtarg--; while(*ctl) { if(*ctl!='%') { fputc(y{}*ctl++, fd); ++cc; continue; } else ++ctl; if(*ctl=='%') { fputc(*ctl++, fd); ++cc; continue; } if(*ctl=='y|}-') { left = 1; ++ctl; } else left = 0; if(*ctl=='0') pad = '0'; else pad = ' '; if(isdiy}}git(*ctl)) { width = atoi(ctl++); while(isdigit(*ctl)) ++ctl; } else width = 0; if(*cy~}tl=='.') { maxchr = atoi(++ctl); while(isdigit(*ctl)) ++ctl; } else maxchr = 0y}; arg = *nxtarg--; sptr = str; switch(tolower(*ctl++)) { case 'c': str[0] = arg; str[1] = NULL; y}break; case 's': sptr = arg; break; case 'd': itoa(arg,str); break; case 'b': itoab(arg,str,2y}); break; case 'o': itoab(arg,str,8); break; case 'u': itoab(arg,str,10); break; case 'x': itoab(arg,sy}tr,16); break; default: return (cc); } len = strlen(sptr); /* tprintf(" pf: str '%s' len %d wid %d\n", y}sptr, len, width); */ if(maxchr && maxchrlen) width = width - len; else width = 0; /y}* tprintf(" pf: str '%s' len %d wid %d iocb %x\n", sptr, len, width, fd); */ if(!left) while(width--) { /* tprintf(" y}pf: pad, iocb %x, %d remaining\n", fd, width); */ fputc(pad,fd); ++cc;} while(len--) {fputc(*sptr++,fd); ++cc; } y} if(left) while(width--) { /* tprintf(" pf: fin, %d remaining\n", width); */ fputc(pad,fd); ++cc;} } rety}urn(cc); } e(width--) { /* tprintf(" pf: fin, %d remaining\n", width); */ fputc(pad,fd); ++cc;} } retx#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* This software i}}s copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */ #include }}/* Write a string to fd. Entry: string = Pointer to null-terminated string. fd = File descriptor of p}}ertinent file. */ fputs(string,fd) char *string; int fd; { /* we can do better than this ... while(*string) if(fput}}c(*string++,fd)==EOF) return(EOF); */ write(fd, string, strlen(string)); return(0); } while(*string) if(fput|a#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* Item-stream read }from fd. Entry: buf = address of target buffer sz = size of items in bytes n = number of items t}o read fd = file descriptor Returns a count of the items actually read. Use feof() and ferror() to determ}ine file status. */ fread(buf, sz, n, fd) char * buf; int sz, n, fd; { return (read(fd, buf, n * sz) / sz); } rm{; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; }; ; rename file. ; frename(str); ; str is already in the form needed by ataridos, ie ; "d:foo.bar,baz.txt" ; xcb: .b}yte 0 .globl _frename _frename: jsr findiocb ; find a free iocb stx xcb ; save it jsr popax ; get the name string } ldy xcb sta icbal,y ; store str\ txa sta icbah,y ; store str^ tya tax ; get iocb in x lda #rename ; get re}name opcode sta iccom,x lda #0 sta icax1,x sta icax2,x jsr ciov bpl ren0 jmp ioreturn ren0: tya ldx #0 r}ts ; code sta iccom,x lda #0 sta icax1,x sta icax2,x jsr ciov bpl ren0 jmp ioreturn ren0: tya ldx #0 r#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* Item-stream write} to fd. Entry: buf = address of source buffer sz = size of items in bytes n = number of items to} write fd = file descriptor Returns a count of the items actually written or zero if an error occurred. } May use ferror(), as always, to detect errors. */ fwrite(buf, sz, n, fd) char * buf; int sz, n, fd; { if (write}(fd, buf, n*sz) <= 0) return (0); return (n); } fwrite(buf, sz, n, fd) char * buf; int sz, n, fd; { if (write7; ; get a kbd char. ; assemble with atari.m65 ; .globl _kbdchar _kbdchar: jsr k ; call the internal routine ldx #0} ; so we can zap X before cmp #0 ; (setting cond codes and) rts ; returning k: lda keybdv+5 pha lda keybdv+}4 pha rts ap X before cmp #0 ; (setting cond codes and) rts ; returning k: lda keybdv+5 pha lda keybdv+#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* This software i}s copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */ /* Gets an entir}e string from stdin (excluding its newline terminator) or size-1 characters, whichever comes first. The input is term}inated by a null character. The user buffer must be large enough to hold the data. Entry: str = Pointer to destinati}on buffer. Returns str on success, else NULL. */ #include gets(str) char *str; { return (fgets(str, 32}767, stdin)); } ns str on success, else NULL. */ #include gets(str) char *str; { return (fgets(str, 32; ; this file must be assembled into all files that you expect to ; use as parts of C programs. it defines common low leve}l locations ; like the stack ptr etc. ; sp = $80 ; stack pointer sreg = $82 ; secondary register argcnt = $82 ; same }slot; temp for vararg funcs tmpptr = $84 ; pointer to random frob fntemp = $86 ; pointer to file name svax = $88 ; slot} to save/rest AX into origsp = $8A ; original system sp ptr1 = $8C ptr2 = $8E ptr3 = $90 tmp1 = $92 tmp2 = $93 tmp3 =} $94 tmp4 = $95 ; end global.m65 original system sp ptr1 = $8C ptr2 = $8E ptr3 = $90 tmp1 = $92 tmp2 = $93 tmp3 =&ctype.h file.h stdio.h global.m65 original system sp ptr1 = $8C ptr2 = $8E ptr3 = $90 tmp1 = $92 tmp2 = $93 tmp3 =; ; heap defs for malloc and pmalloc ; ; ; C variable (char * )_himem. contains pointer to next piece of ; mem unallo}cated. ; .globl __himem __himem: .word __FREEMEM ; defined by linker, top of executable ; ; C variable (memblock * })_freelst. contains head of linked list ; of blocks of mem that have been freed ; .globl __freelst __freelst: .word 0} ; nil to start with ; ; that's all for here. see pmalloc.c and malloc.c for code that uses them ; __freelst: .word 0i#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is alphanumeric */ isalnum(c) int c; { return ((c<='z' && c>='a') || (c<='Z' && c>='A') || (c<}='9' && c>='0')); } isalnum(c) int c; { return ((c<='z' && c>='a') || (c<='Z' && c>='A') || (c<; ; return t if char is alpha ; .globl _isalpha _isalpha: jsr popax ; get the char cmp #'A' bcc nope ; if less t}han 'A', return 0 cmp #'Z+1 bcc yup cmp #'a bcc nope cmp #'z+1 bcs nope yup: lda #1 rts nope: lda #0 rt}s A', return 0 cmp #'Z+1 bcc yup cmp #'a bcc nope cmp #'z+1 bcs nope yup: lda #1 rts nope: lda #0 rt#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is an ASCII character (0-127) */ isascii(c) char * c; { /* c is a simulated unsigned integer */ return (c <= 12}7); } ASCII character (0-127) */ isascii(c) char * c; { /* c is a simulated unsigned integer */ return (c <= 12#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ extern int Udevice[]; /}* Return "true" if fd is a device, else "false" */ isatty(fd) int fd; { return (Udevice[fd]); } Udevice[]; /o#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is a control character (0-31 or 127) */ iscntrl(c) char * c; { /* c is a simulated unsigned integer */ retu}rn ((c <= 31) || (c == 127)); } or 127) */ iscntrl(c) char * c; { /* c is a simulated unsigned integer */ retu"#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include /* } Determine if fd is the console. */ iscons(fd) int fd; { return(fd == 0); /* kludge. need a way to tell what ioc}b is open on */ } s the console. */ iscons(fd) int fd; { return(fd == 0); /* kludge. need a way to tell what ioc; isdigit(c) -- decimal-p .globl _isdigit _isdigit: jsr popax ; get the char cmp #'0' ; < '0'? bcc ret0 ; less, r}eturn 0 cmp #'9'+1 ; >= '8'? bcs ret0 ; yes, return 0 lda #1 ; no, return a 1 rts ret0: txa rts 0 ; less, rq#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is a graphic character (33-126) */ isgraph(c) int c; { return (c>=33 && c<=126); } /* return 'true' if d#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is lower-case alphabetic */ islower(c) int c; { return (c<='z' && c>='a'); ssed in */ /* return 'true' if Y; isodigit(c) -- octal-p .globl _isodigit _isodigit: jsr popax ; get the char cmp #'0' ; < '0'? bcc ret0 ; less, }return 0 cmp #'8' ; >= '8'? bcs ret0 ; yes, return 0 lda #1 ; no, return a 1 rts ret0: txa rts et0 ; less, p#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is a printable character (32-126) */ isprint(c) int c; { return (c>=32 && c<=126); } * return 'true' if f#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is a punctuation character (all but control and alphanumeric) */ ispunct(c) int c; { return (!isalnum(c) && !i}scntrl(c)); } on character (all but control and alphanumeric) */ ispunct(c) int c; { return (!isalnum(c) && !i#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is a white-space character */ isspace(c) int c; { /* first check gives quick exit in most cases */ return(c<=' }' && (c==' ' || (c<=13 && c>=9))); } (c) int c; { /* first check gives quick exit in most cases */ return(c<=' )#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is upper-case alphabetic */ isupper(c) int c; { return (c<='Z' && c>='A'); } sed in */ /* return 'true' if Z; iswhite(c) -- whitespace-p .globl _iswhite _iswhite: jsr popax ; get the char and #$7F ; mask hi bit beq ret0 }cmp #$21 ; <= space? bcc ret1 ; less, return 1 cmp #$7F ; >= rubout? bcs ret1 ; yes, return 1 ret0: txa ; no, }return a 0 rts ret1: lda #1 rts , return 1 cmp #$7F ; >= rubout? bcs ret1 ; yes, return 1 ret0: txa ; no, (#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* return 'true' if }c is a hexadecimal digit (0-9, A-F, or a-f) */ isxdigit(c) int c; { return ((c<='f' && c>='a') || (c<}='F' && c>='A') || (c<='9' && c>='0')); } xdigit(c) int c; { return ((c<='f' && c>='a') || (c<7; ; itoa(i, s); ; .globl _itoa _itoa: jsr popax ; get string addr sta ptr1 stx ptr1+1 jsr popax ; get number} sta fr0 stx fr0+1 ; set up to floatify cpx #0 ; neg? bpl itoa_1 jsr negax sta fr0 ; store it again stx f}r0+1 lda #'- ldy #0 sta (ptr1),y ; stuff the neg sign inc ptr1 bne itoa_1 inc ptr1+1 itoa_1: jsr ifp ; floa}tify it jsr fasc ; ascify it ldy #0 itoa_2: lda (inbuff),y ; get a byte bmi itoa_3 ; hi bit set? ok, done sta} (ptr1),y ; stash in caller's buffer iny jmp itoa_2 itoa_3: and #$7F ; mask it sta (ptr1),y ; stash it lda #0 } iny sta (ptr1),y rts 's buffer iny jmp itoa_2 itoa_3: and #$7F ; mask it sta (ptr1),y ; stash it lda #0 #define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* itoab(n,s,b) - Co}nvert "unsigned" n to characters in s using base b. NOTE: This is a non-standard function. */ itoab(n, s}, b) int n; char *s; int b; { char *ptr; int lowbit; ptr = s; b >>= 1; do { lowbit = n & 1; }n = (n >> 1) & 32767; *ptr = ((n % b) << 1) + lowbit; if(*ptr < 10) *ptr += '0'; else *ptr += 55; ++ptr; }} while(n /= b); *ptr = 0; reverse (s); } owbit; if(*ptr < 10) *ptr += '0'; else *ptr += 55; ++ptr; 4#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include /* } itod -- convert nbr to signed decimal string of width sz right adjusted, blank filled; returns str } if sz > 0 terminate with null byte if sz = 0 find end of string if sz < 0 use last byte for data */} itod(nbr, str, sz) int nbr; char str[]; int sz; { char sgn; if(nbr<0) {nbr = -nbr; sgn='-';} else sgn=}' '; if(sz>0) str[--sz]=NULL; else if(sz<0) sz = -sz; else while(str[sz]!=NULL) ++sz; while(sz) { str[}--sz]=(nbr%10+'0'); if((nbr=nbr/10)==0) break; } if(sz) str[--sz]=sgn; while(sz>0) str[--sz]=' '; return s}tr; } br%10+'0'); if((nbr=nbr/10)==0) break; } if(sz) str[--sz]=sgn; while(sz>0) str[--sz]=' '; return s#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* itoo -- converts }nbr to octal string of length sz right adjusted and blank filled, returns str if sz > 0 terminate wit}h null byte if sz = 0 find end of string if sz < 0 use last byte for data */ itoo(nbr, str, sz) }int nbr; char str[]; int sz; { int digit; if(sz>0) str[--sz]=0; else if(sz<0) sz = -sz; else while(str[s}z]!=0) ++sz; while(sz) { digit=nbr&7; nbr=(nbr>>3)&8191; str[--sz]=digit+48; if(nbr==0) break; }} while(sz) str[--sz]=' '; return str; } &7; nbr=(nbr>>3)&8191; str[--sz]=digit+48; if(nbr==0) break; }0#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include /* } itou -- convert nbr to unsigned decimal string of width sz right adjusted, blank filled; returns str } if sz > 0 terminate with null byte if sz = 0 find end of string if sz < 0 use last byte for data }*/ itou(nbr, str, sz) int nbr; char str[]; int sz; { int lowbit; if(sz>0) str[--sz]=NULL; else if(sz<0)} sz = -sz; else while(str[sz]!=NULL) ++sz; while(sz) { lowbit=nbr&1; nbr=(nbr>>1)&32767; /* divide by }2 */ str[--sz]=((nbr%5)<<1)+lowbit+'0'; if((nbr=nbr/5)==0) break; } while(sz) str[--sz]=' '; return str;} } str[--sz]=((nbr%5)<<1)+lowbit+'0'; if((nbr=nbr/5)==0) break; } while(sz) str[--sz]=' '; return str;#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* itox -- converts }nbr to hex string of length sz right adjusted and blank filled, returns str if sz > 0 terminate with }null byte if sz = 0 find end of string if sz < 0 use last byte for data */ itox(nbr, str, sz) in}t nbr; char str[]; int sz; { int digit, offset; if(sz>0) str[--sz]=0; else if(sz<0) sz = -sz; else while}(str[sz]!=0) ++sz; while(sz) { digit=nbr&15; nbr=(nbr>>4)&4095; if(digit<10) offset=48; else offset=55; } str[--sz]=digit+offset; if(nbr==0) break; } while(sz) str[--sz]=' '; return str; } 8; else offset=55; hatari.m65 close.m65 getch.m65 isodigit.m65 runtime.m65 toupper.m65 bcopy.m65 closeall.m65 global.m65 iswhite}.m65 rwcommon.m65 tprintf.m65 bzero.m65 cputc.m65 heap.m65 itoa.m65 stdio.m65 write.m65 cgetc.m65 fd}elete.m65 isalpha.m65 parselin.m65 strchr.m65 cgets.m65 frename.m65 isdigit.m65 read.m65 tolower.m65 fdw# # makefile for CC65 runtime library # .SUFFIXES: .com .ttp .o .obj .m65 .c .c.obj: cc65 -O -a $< ra65 $*.m65 }Rm $*.m65 libr65 a c.olb $@ .m65.obj: ra65 -o $@ atari.m65 global.m65 $< libr65 a c.olb $@ C_OBJS = startup.obj a}toi.obj fputs.obj fgets.obj gets.obj fprintf.obj \ reverse.obj iscntrl.obj isprint.obj itox.obj atoib.obj isalnum.obj \ i}scons.obj ispunct.obj itoab.obj otoi.obj strcmp.obj dtoi.obj \ isspace.obj itod.obj pmalloc.obj utoi.obj fclose.obj isascii}.obj \ isgraph.obj isupper.obj itoo.obj time.obj xtoi.obj fopen.obj \ isatty.obj islower.obj isxdigit.obj itou.obj toasci}i.obj open.obj \ rename.obj delete.obj fname.obj fread.obj fwrite.obj readargs.obj \ strcat.obj M65_OBJS = stdio.obj f}rename.obj fdelete.obj close.obj closeall.obj cputc.obj \ cgetc.obj cgets.obj read.obj write.obj rwcommon.obj tprintf.obj \} heap.obj itoa.obj isalpha.obj isodigit.obj isdigit.obj iswhite.obj \ bzero.obj bcopy.obj strchr.obj getch.obj parselin.o}bj tolower.obj \ toupper.obj all : c.olb runtime.obj c.olb : $(C_OBJS) $(M65_OBJS) Echo Done runtime.obj : runt }ime.m65 atari.m65 global.m65 ra65 -o runtime.obj atari.m65 global.m65 runtime.m65 clean: Rm startup.m65 atoi.m65 fputs }.m65 fgets.m65 gets.m65 fprintf.m65 Rm reverse.m65 iscntrl.m65 isprint.m65 itox.m65 atoib.m65 isalnum.m65 Rm iscons.m65 } ispunct.m65 itoab.m65 otoi.m65 strcmp.m65 dtoi.m65 Rm isspace.m65 itod.m65 pmalloc.m65 utoi.m65 fclose.m65 isascii.m65 } Rm isgraph.m65 isupper.m65 itoo.m65 time.m65 xtoi.m65 fopen.m65 Rm isatty.m65 islower.m65 isxdigit.m65 itou.m65 toascii.m }65 open.m65 Rm rename.m65 delete.m65 fname.m65 fread.m65 fwrite.m65 readargs.m65 Rm strcat.m65 Rm $(C_OBJS) RM $(M6}5_OBJS) 65 Rm rename.m65 delete.m65 fname.m65 fread.m65 fwrite.m65 readargs.m65 Rm strcat.m65 Rm $(C_OBJS) RM $(M6