#@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr at2a atoi.c unsan atoi.c at2a fopen.c unsan fopen.c at2a isascii.c unsan isascii.c at2a ispunct.c unsan ispunct.c at2}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 fprintf}.c unsan fprintf.c at2a isatty.c unsan isatty.c at2a isspace.c unsan isspace.c at2a itox.c unsan itox.c at2a startup.}c unsan startup.c at2a delete.c unsan delete.c at2a fputs.c unsan fputs.c at2a iscntrl.c unsan iscntrl.c at2a isupper}.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 unsan } fread.c at2a iscons.c unsan iscons.c at2a isxdigit.c unsan isxdigit.c at2a otoi.c unsan otoi.c at2a strcmp.c unsan s }trcmp.c at2a fclose.c unsan fclose.c at2a fwrite.c unsan fwrite.c at2a isgraph.c unsan isgraph.c at2a itoab.c unsan i }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.}m65 unsan bzero.m65 at2a cputc.m65 unsan cputc.m65 at2a heap.m65 unsan heap.m65 at2a itoa.m65 unsan itoa.m65 at2a std}io.m65 unsan stdio.m65 at2a write.m65 unsan write.m65 at2a cgetc.m65 unsan cgetc.m65 at2a fdelete.m65 unsan fdelete.m6}5 at2a isalpha.m65 unsan isalpha.m65 at2a parselin.m65 unsan parselin.m65 at2a strchr.m65 unsan strchr.m65 at2a cgets.}m65 unsan cgets.m65 at2a frename.m65 unsan frename.m65 at2a isdigit.m65 unsan isdigit.m65 at2a read.m65 unsan read.m65} 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}cations etc. ; ; VECTOR TABLE EDITRV =$E400 ;EDITOR SCRENV =$E410 ;TELEVISION SCREEN KEYBDV =$E420 ;KEYBOARD }PRINTV =$E430 ;PRINTER CASETV =$E440 ;CASSETTE ; JUMP VECTOR TABLE DISKIV =$E450 ;DISK INITIALIZATION DSKINV =$}E453 ;DISK INTERFACE CIOV =$E456 ;CIO ROUTINE SIOV =$E459 ;SIO ROUTINE SETVBV =$E45C ;SET VERTICAL BLANK VECTORS }SYSVBV =$E45F ;SYSTEM VERTICAL BLANK ROUTINE XITVBV =$E462 ;EXIT VERTICAL BLANK ROUTINE SIOINV =$E465 ;SIO INIT SEND}EV =$E468 ;SEND ENABLE ROUTINE INTINV =$E46B ;INTERRUPT HANDLER INIT CIOINV =$E46E ;CIO INIT BLKBDV =$E471 ;BLACKB}OARD MODE WARMSV =$E474 ;WARM START ENTRY POINT COLDSV =$E477 ;COLD START ENTRY POINT RBLOKV =$E47D ;CASSETTE READ B}LOCK VECTOR DSOPIV =$E480 ;CASSETTE OPEN FOR INPUT VECTOR ; SOME USEFUL INTERNAL ROUTINES ;KGETCH =$F6E2 ;GET CHAR} FROM KEYBOARD only on 800 EOUTCH =$F6A4 ;OUTPUT CHAR TO SCREEN PUTLIN =$F385 ;OUTPUT LINE TO IOCB#0 ; COMMAND CODES } FOR IOCB OPEN =$03 ;OPEN FOR INPUT/OUTPUT GETREC =$05 ;GET RECORD (TEXT) GETCHR =$07 ;GET CHARACTER(S) PUTREC =$!}09 ;PUT RECORD (TEXT) PUTCHR =$0B ;PUT CHARACTER(S) CLOSE =$0C ;CLOSE DEVICE STATIS =$0D ;STATUS REQUEST SPECIL ="}$0E ;SPECIAL ENTRY COMMANDS ; SPECIAL ENTRY COMMANDS DRAWLN =$11 ;DRAW LINE FILLIN =$12 ;DRAW LINE WITH RIGHT FI#}LL RENAME =$20 ;RENAME DISK FILE DELETE =$21 ;DELETE DISK FILE FORMAT =$22 ;FORMAT DISK LOCKFL =$23 ;LOCK FILE (R$}EAD ONLY) UNLOCK =$24 ;UNLOCK FILE POINT =$25 ;POINT SECTOR NOTE =$26 ;NOTE SECTOR CCIO =$28 ;CONCURRENT I/O MO%}DE IOCFRE =$FF ;IOCB "FREE" ; AUX1 VALUES FOR OPEN APPEND =$01 ;OPEN FOR APPEND DIRECT =$02 ;OPEN FOR DIRECTO&}RY ACCESS OPNIN =$04 ;OPEN FOR INPUT OPNOT =$08 ;OPEN FOR OUTPUT OPNINO =OPNIN!OPNOT ;OPEN FOR INPUT/OUTPUT MXDMOD ='}$10 ;OPEN FOR MIXED MODE INSCLR =$20 ;OPEN WITHOUT CLEARING SCREEN ; OS STATUS CODES SUCCES =$01 ;SUCCESSFUL OPE(}RATION BRKABT =$80 ;(128) BREAK KEY ABORT PRVOPN =$81 ;(129) IOCB ALREADY OPEN NONDEV =$82 ;(130) NON-EX DEVICE WRO)}NLY =$83 ;(131) IOCB OPENED FOR WRITE ONLY NVALID =$84 ;(132) INVALID COMMAND NOTOPN =$85 ;(133) DEVICE OR FILE NOT O*}PEN BADIOC =$86 ;(134) INVALID IOCB NUMBER RDONLY =$87 ;(135) IOCB OPENED FOR READ ONLY EOFERR =$88 ;(136) END OF FI+}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 ;0}CASSETTE INIT LOC RAMLO =$04 ;RAM POINTER FOR MEM TEST TRAMSZ =$06 ;TEMP LOC FOR RAM SIZE TSTDAT =$07 ;RAM TEST DATA1} LOC ; CLEARED ON COLDSTART ONLY WARMST =$08 ;WARM START FLAG BOOTQ =$09 ;SUCCESSFUL BOOT FLAG DOSVEC =$0A ;DO2}S START VECTOR DOSINI =$0C ;DOS INIT ADDRESS APPMHI =$0E ;APPLICATION MEM HI LIMIT ; CLEARED ON COLD OR WARM START 3} INTZBS =$10 ; START OF OS RAM CLEAR LOC => $7F POKMSK =$10 ;SYSTEM MASK FOR POKEY IRQ ENABLE BRKKEY =$11 ;BREAK KE4}Y FLAG RTCLOK =$12 ;REAL TIME CLOCK (60HZ OR 16.66666 MS) ; 3 bytes; hi order, medium, low BUFADR =$15 ;INDIRECT B5}UFFER ADDRESS REG ICCOMT =$17 ;COMMAND FOR VECTOR HANDLER DSKFMS =$18 ;DISK FILE MANAGER POINTER DSKUTL =$1A ;DISK U6}TILITIES POINTER PTIMOT =$1C ;PRINTER TIME OUT REGISTER PBPNT =$1D ;PRINT BUFFER POINTER PBUFSZ =$1E ;PRINT BUFFER S7}IZE PTEMP =$1F ;TEMP REG ZIOCB =$20 ;PAGE 0 I/O CONTROL BLOCK IOCBSZ =16 ;NUMBER OF BYTES / IOCB MAXIOC =8*IOCBSZ 8};LENGTH OF IOCB AREA IOCBAS =ZIOCB ICHIDZ =$20 ;HANDLER INDEX NUMBER ($FF := IOCB FREE) ICDNOZ =$21 ;DEVICE NUMBER (9}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 NOCKSMA} =$3C ;NO CHECKSUM FOLLOWS DATA FLAG BPTR =$3D ;BUFFER POINTER (CASSETTE) FTYPE =$3E ;FILE TYPE (SHORT IRG/LONG IRGB}) FEOF =$3F ;END OF FILE FLAG (CASSETTE) FREQ =$40 ;FREQ COUNTER FOR CONSOLE SPEAKER SOUNDR =$41 ;NOISY I/O FLAG. (ZC}ERO IS QUIET) CRITIC =$42 ;CRITICAL CODE IF NON-ZERO) FMSZPG =$43 ;DISK FILE MANAGER SYSTEM STORAGE (7 BYTES) CKEYD} =$4A ;SET WHEN GAME START PRESSED CASSBT =$4B ;CASSETTE BOOT FLAG DSTAT =$4C ;DISPLAY STATUS ATRACT =$4D ;ATTRACTE} MODE FLAG DRKMSK =$4E ;DARK ATTRACT MASK COLRSH =$4F ;ATTRACT COLOR SHIFTER (XOR'D WITH PLAYFIELD) TMPCHR =$50 ;TF}EMP CHAR STORAGE (DISPLAY HANDLER) HOLD1 =$51 ;TEMP STG (DISPLAY HANDLER) LMARGN =$52 ;LEFT MARGIN RMARGN =$53 ;RIGHG}T MARGIN ROWCRS =$54 ;CURSOR COUNTERS COLCRS =$55 DINDEX =$57 ;DISPLAY INDEX (VARIOUS QUANTS) SAVMSC =$58 OLDROW =$5H}A ;PREVIOUS ROW/COL OLDCOL =$5B OLDCHR =$5D ;DATA UNDER CURSOR OLDADR =$5E NEWROW =$60 ;POINT DRAWS TO HERE NEWCOLI} =$61 LOGCOL =$63 ;POINTS AT COLUMN IN LOGICAL LINE ADRESS =$64 ;INDIRECT POINTER MLTTMP =$66 ;MULTIPLY TEMP OPNTMPJ} =MLTTMP ;FIRST BYTE IS USED IN OPEN AS TEMP SAVADR =$68 RAMTOP =$6A ;RAM SIZE DEFINED BY POWER ON LOGIC BUFCNT =$6B K} ;BUFFER COUNT BUFSTR =$6C ;EDITOR GETCH POINTER BITMSK =$6E ;BIT MASK SHFAMT =$6F ;OUTCHR SHIFT ROWAC =$70 ;USL}ED BY "DRAW" COLAC =$72 ENDPT =$74 DELTAR =$76 DELTAC =$77 ROWINC =$79 COLINC =$7A SWPFLG =$7B ;NON-0 IF TXT AND RAMM} SWAPPED HOLDCH =$7C ;CH BEFORE CNTL & SHFT PROCESSING IN KGETCH INSDAT =$7D ;INSERT CHAR SAVE COUNTR =$7E ;DRAW COUN}NTER ;;; $80 TO $FF ARE RESERVED FOR USER APPLICATIONS ; PAGE 2 LOCATIONS INTABS =$200 ;INTERRUPT TABLE VDSLST =$O}200 ;DISPLAY LIST NMI VECTOR VPRCED =$202 ;PROCEED LINE IRQ VECTOR VINTER =$204 ;INTERRUPT LINE IRQ VECTOR VBREAK =$P}206 ;"BRK" VECTOR VKEYBD =$208 ;POKEY KEYBOARD IRQ VECTOR VSERIN =$20A ;POKEY SERIAL INPUT READY VSEROR =$20C ;POKQ}EY SERIAL OUTPUT READY VSEROC =$20E ;POKEY SERIAL OUTPUT DONE VTIMR1 =$210 ;POKEY TIMER 1 IRQ VTIMR2 =$212 ;POKEY TIR}MER 2 IRQ VTIMR4 =$214 ;POKEY TIMER 4 IRQ (DO NOT USE) VIMIRQ =$216 ;IMMEDIATE IRQ VECTOR CDTMV1 =$218 ;COUNT DOWN TS}IMER 1 CDTMV2 =$21A ;COUNT DOWN TIMER 2 CDTMV3 =$21C ;COUNT DOWN TIMER 3 CDTMV4 =$21E ;COUNT DOWN TIMER 4 CDTMV5 =$T}220 ;COUNT DOWN TIMER 5 VVBLKI =$222 ;IMMEDIATE VERTICAL BLANK NMI VECTOR VVBLKD =$224 ;DEFERRED VERTICAL BLANK NMI VU}ECTOR CDTMA1 =$226 ;COUNT DOWN TIMER 1 JSR ADDRESS CDTMA2 =$228 ;COUNT DOWN TIMER 2 JSR ADDRESS CDTMF3 =$22A ;COUNT V}DOWN TIMER 3 FLAG SRTIMR =$22B ;SOFTWARE REPEAT TIMER CDTMF4 =$22C ;COUNT DOWN TIMER 4 FLAG INTEMP =$22D ;IAN'S TEMPW} (???) CDTMF5 =$22E ;COUNT DOWN TIMER 5 FLAG SDMCTL =$22F ;SAVE DMACTL REGISTER DMACTL =$D400 ; the real DMA controlX} reg SDLSTL =$230 ;SAVE DISPLAY LIST (LOW) SDLSTH =$231 ;SAVE DISPLAY LIST (HIGH) SSKCTL =$232 ;SKCTL REGISTER RAM Y} LPENH =$234 ;LIGHT PEN HORIZ VALUE LPENV =$235 ;LIGHT PEN VERT VALUE ; ($236 - $239 SPARE) CDEVIC =$23A ;COMMAZ}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 SHADOWa} STICK3 =$27B ;JOYSTICK 3 SHADOW PTRIG0 =$27C ;PADDLE 0 TRIGGER PTRIG1 =$27D ;PADDLE 1 TRIGGER PTRIG2 =$27E ;PADDb}LE 2 TRIGGER PTRIG3 =$27F ;PADDLE 3 TRIGGER PTRIG4 =$280 ;PADDLE 4 TRIGGER PTRIG5 =$281 ;PADDLE 5 TRIGGER PTRIG6 =$c}282 ;PADDLE 6 TRIGGER PTRIG7 =$283 ;PADDLE 7 TRIGGER STRIG0 =$284 ;JOYSTICK 0 TRIGGER STRIG1 =$285 ;JOYSTICK 1 TRId}GGER STRIG2 =$286 ;JOYSTICK 2 TRIGGER STRIG3 =$287 ;JOYSTICK 3 TRIGGER CSTAT =$288 ;(UNUSED) WMODE =$289 ;R/W Fe}LAG FOR CASSETTE BLIM =$28A ;BUFFER LIMIT (CASSETTE) ;($28B - $28F SPARE) TXTROW =$290 ;TEXT ROWCRS TXTCOL =$291 f} ;TEXT ROWCOL TINDEX =$293 ;TEXT INDEX TXTMSC =$294 ;FOOLS CONVRT INTO NEW MSC TXTOLD =$296 ;OLDROW & OLDCOL FOR TEg}XT (AND THEN SOME) TMPX1 =$29C HOLD3 =$29D SUBTMP =$29E HOLD2 =$29F DMASK =$2A0 TMPLBT =$2A1 OSESCFLG =$2A2 ;ESCAPE h}FLAG TABMAP =$2A3 ;TAB BUFFER LOGMAP =$2B2 ;LOGICAL LINE START BIT MAP INVFLG =$2B6 ;INVERSE VIDEO FLAG (ATARI KEY) i} FILFLG =$2B7 ;RIGHT FILL FLAG FOR DRAW TMPROW =$2B8 TMPCOL =$2B9 SCRFLG =$2BB ;SET IF SCROLL OCCURS HOLD4 =$2BC ;Mj}ORE DRAW TEMPS HOLD5 =$2BD SHFLOK =$2BE ;SHIFT LOCK KEY BOTSCR =$2BF ;BOTTOM OF SCREEN (24 NORM, 4 SPLIT) PCOLR0 =$k}2C0 ;P0 COLOR PCOLR1 =$2C1 ;P1 COLOR PCOLR2 =$2C2 ;P2 COLOR PCOLR3 =$2C3 ;P3 COLOR COLOR0 =$2C4 ;COLOR 0 COLORl}1 =$2C5 COLOR2 =$2C6 COLOR3 =$2C7 COLOR4 =$2C8 ;BACKGROUND ;($2C9 - $2DF SPARE) GLBABS =$2E0 ;GLOBAL VARIABLES m} ;($2E0 - $2E3 SPARE) RAMSIZ =$2E4 ;RAM SIZE (HI BYTE ONLY) MEMTOP =$2E5 ;TOP OF AVAILABLE MEMORY MEMLO =$2E7 ;BOn}TTOM OF AVAILABLE MEMORY ;($2E9 SPARE) DVSTAT =$2EA ;STATUS BUFFER CBAUDL =$2EE ;CASSETTE BAUD RATE (LO BYTE) CBAo}UDH =$2EF ; " " " (HI BYTE) CRSINH =$2F0 ;CURSOR INHIBIT (00 = CURSOR ON) KEYDEL =$2F1 ;KEY DELAY CH1 =$p}2F2 CHACT =$2F3 ;CHACTL REGISTER (SHADOW) CHBAS =$2F4 ;CHBAS REGISTER (SHADOW) ;($2F5 - $2F9 SPARE) OSCHAR =$2FA q} ATACHR =$2FB ;ATASCII CHARACTER CH =$2FC ;GLOBAL VARIABLE FOR KEYBOARD FILDAT =$2FD ;RIGHT FILL DATA (DRAW) DSPFLG r}=$2FE ;DISPLAY FLAG: DISP CONTROLS IF NON-ZERO SSFLAG =$2FF ;START/STOP FLAG (CNTL-1) FOR PAGING ; PAGE 3 LOCATIONS s} DCB =$300 ;DEVICE CONTROL BLOCK DDEVIC =$300 ;BUS I.D. NUMBER DUNIT =$301 ;UNIT NUMBER DCOMND =$302 ;BUS COMMANDt} DSTATS =$303 ;COMMAND TYPE/STATUS RETURN DBUFLO =$304 ;DATA BUFFER POINTER DBUFHI =$305 ; ... DTIMLO =$306 ;DEVIu}CE TIME OUT IN 1 SEC. UNITS DUNUSE =$307 ;UNUSED DBYTLO =$308 ;BYTE COUNT DBYTHI =$309 ; ... DAUX1 =$30A ;COMMANDv} AUXILLARY BYTES DAUX2 =$30B ; ... TIMER1 =$30C ;INITIAL TIMER VALUE ADDCOR =$30E ;ADDITION CORRECTION CASFLG =$3w}0F ;CASSETTE MODE WHEN SET TIMER2 =$310 ;FINAL TIME VALUE (USED TO COMPUTE BAUD RATE) TEMP1 =$312 ;TEMP LOCATIONS TEx}MP2 =$314 ; ... TEMP3 =$315 ; ... SAVIO =$316 ;SAVE SERIAL IN DATA PORT TIMFLG =$317 ;TIME OUT FLAG FOR BAUD RATE y}CORRECTION STACKP =$318 ;SIO STACK POINTER SAVE LOC TSTAT =$319 ;TEMP STATUS LOC HATABS =$31A ;HANDLER ADDRESS TABz}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 ; fr0Ca2at 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 software }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'); return (sign * n); } : |#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 islowel; ; 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: (}. ldauysp: . :40 1989 (Jrd at local) * runtime.m65: Add new routines: ldaui: load A (unsigned) from (AX) ldauidx: (; ; This module courtesy Charles Green (c3pe) ; ; status=cio(iocb) ; iocb is index (iocbnum << 4) ; ciov = $e456 .globl _cio,} _cio: jsr popax ; get iocb index tax ; in x jsr ciov tax tya rts is index (iocbnum << 4) ; ciov = $e456 .globl _cio,I; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; 0}; ; close an iocb ; .globl _cclose _cclose: .globl _close _close: jsr popax ; get iocb num tax lda #close st0}a iccom,x jsr ciov tya bmi *+5 ldx #0 rts ldx #$FF rts se: jsr popax ; get iocb num tax lda #close st0F; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; 4}; ; close all iocbs ; .globl _closeall _closeall: ldx #$10 lda #close sta iccom,x jsr ciov txa clc adc #$14}0 tax cpx #$80 bcc _closeall+2 rts _closeall: ldx #$10 lda #close sta iccom,x jsr ciov txa clc adc #$14,-*- Mode: Text -*- This is the copyright notice for RA65, LINK65, LIBR65, and other Atari 8-bit programs. Said progra8}ms are Copyright 1989, by John R. Dunning. All rights reserved, with the following exceptions: Anyone may copy or re8}distribute these programs, provided that: 1: You don't charge anything for the copy. It is permissable to charge a8} nominal fee for media, etc. 2: All source code and documentation for the programs is made available as part of the 8}distribution. 3: This copyright notice is preserved verbatim, and included in the distribution. You are allo8}wed to modify these programs, and redistribute the modified versions, provided that the modifications are clearly noted. 8} There is NO WARRANTY with this software, it comes as is, and is distributed in the hope that it may be useful. T8}his copyright notice applies to any program which contains this text, or the refers to this file. This copyright noti8}ce is based on the one published by the Free Software Foundation, sometimes known as the GNU project. The idea is the same8} as theirs, ie the software is free, and is intended to stay that way. Everybody has the right to copy, modify, and re- di8}stribute this software. Nobody has the right to prevent anyone else from copying, modifying or redistributing it. re- di8u; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; <}; ; cputc(ch, iocb) ; .globl _fputc _fputc: .globl _cputc _cputc: jsr popax ; get iocb sta tmp1 jsr popax ; g<}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 <} 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 @0 /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */D} /* delete a file */ int delete(name) char * name; { char buf[80]; fn_default(name, 0, buf); strcat(buf, "D}\n"); return(fdelete(buf)); } (name) char * name; { char buf[80]; fn_default(name, 0, buf); strcat(buf, "D% /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */H} This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */H; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; L}#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include P} /* dtoi -- convert signed decimal string to integer nbr returns field length, else ERR on error */ dtoi(deP}cstr, nbr) char *decstr; int *nbr; { int len, s; if((*decstr)=='-') {s=1; ++decstr;} else s=0; if((len=utoi(decstP}r, nbr))<0) return ERR; if(*nbr<0) return ERR; if(s) {*nbr = -*nbr; return ++len;} else return len; } (len=utoi(decstPn#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include T} /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. *T}/ /* Close fd Entry: fd = File descriptor for file to be closed. Returns NULL for success, otherwise ERR */ T} fclose(fd) int fd; { /* if (close(fd) >= 0) return(NULL); else return(ERR); ... we can do better thanT} that... */ return(close(fd) >= 0 ? NULL : ERR); } urn(NULL); else return(ERR); ... we can do better thanT<; ; This software is copyright 1989 by John Dunning. See the file ; 'COPYLEFT.JRD' for the full copyright notice. ; X}; ; delete file. ; fdelete(str); ; xcb: .byte 0 .globl _fdelete _fdelete: jsr findiocb ; find a free iocb stx xcX}b ; save it jsr popax ; get the name string ldy xcb sta icbal,y ; store str\ txa sta icbah,y ; store str^ tyaX} tax ; get iocb in x lda #delete ; get rename opcode sta iccom,x lda #0 sta icax1,x sta icax2,x jsr ciov bX}pl del0 jmp ioreturn ; common error handling code del0: tya ldx #0 rts ; sta icax1,x sta icax2,x jsr ciov bXT#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include \} /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. *\}/ /* Gets an entire string (including its newline terminator) or size-1 characters, whichever comes first. The\} input is terminated by a null character. Entry: str = Pointer to destination buffer. size = Size of the dest\}ination buffer. fd = File descriptor of pertinent file. Returns str on success, else NULL. */ fgets(str, s\}ize, fd) char * str; int size, fd; { int ch; char * retval; retval = NULL; /* default */ for ( ; --size > 0\} ; ) { ch = fgetc(fd); /* get one */ if (ch == EOF) break; if (!retval) retval = str; *str++ = ch; /* store\} 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 #defi`}ne O_WRONLY 0x08 #define O_CREAT 0x08 #define O_TRUNC 0x08 O in AUX1, when opening */ #define O_RDONLY 0x04 #defi`>foreach c { startup atoi fputs fgets gets fprintf reverse iscntrl isprint itox atoib isalnum iscons ispunct itoab otoi strcmpe} dtoi isspace itod pmalloc utoi fclose isascii isgraph isupper itoo time xtoi fopen isatty islower isxdigit itou toascii opene} rename delete fname fread fwrite readargs strcat } cp \a8\cc8\lib\$c.c . endfor foreach m65 { stdio frename fdelete ce}lose closeall cputc cgetc cgets read write rwcommon tprintf heap itoa isalpha isodigit isdigit iswhite bzero bcopy strchr gete}ch parselin tolower toupper } cp \a8\cc8\lib\$m65.m65 . endfor isalpha isodigit isdigit iswhite bzero bcopy strchr getdFatoi.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 i} 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.ci} fwrite.c isgraph.c itoab.c pmalloc.c time.c fgets.c gets.c islower.c itod.c readargs.c toascii.c fname.c isalnui}m.c isprint.c itoo.c rename.c utoi.c atari.m65 close.m65 getch.m65 isodigit.m65 runtime.m65 toupper.m65 bcopy.m65 i } closeall.m65 global.m65 iswhite.m65 rwcommon.m65 tprintf.m65 bzero.m65 cputc.m65 heap.m65 itoa.m65 stdio.m65 writei }.m65 cgetc.m65 fdelete.m65 isalpha.m65 parselin.m65 strchr.m65 cgets.m65 frename.m65 isdigit.m65 read.m65 tolower.mi }65 ctype.h file.h stdio.h isalpha.m65 parselin.m65 strchr.m65 cgets.m65 frename.m65 isdigit.m65 read.m65 tolower.mh /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */m } /* handy util for fixing up file names */ fn_default(name, ext, target) char * name; char * ext; char * targm}et; { char buf[80]; /* temp storage */ /* this is bummed for space, not speed; it'll copy the data around even whm}en it doesn't have to... */ if (!strchr(name, ':')) { strcpy(buf, "D:"); strcat(buf, name); stm}rcpy(target, buf); } else strcpy(target, name); if (ext) if (!strchr(target, '.')) { strcat(tarm}get, ext); } } } else strcpy(target, name); if (ext) if (!strchr(target, '.')) { strcat(tarl#define NOARGC /* no argument count passing */ #define FIXARGC /* don't expect arg counts passed in */ #include q} /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. *q}/ /* Open file indicated by fn. Entry: fn = ASCIIZ file name. May be prefixed by letter of driq}ve. mode = "a" - append "r" - read "w" - write "u" - updq}ate (some of those might not work on atari -- jrd) Returns a file descriptor on success, else NULL. */ FILE * fopenq}(fn, mode) char * fn, * mode; { int iocb; iocb = copen(fn, *mode); if (iocb < 0) { errno = iocb; return(q}0); } return(iocb); /* just return it as a (FILE * ) */ } n, *mode); if (iocb < 0) { errno = iocb; return(pD/* #define NOARGC /* no argument count passing */ /* This software is copyright 1989 by John Dunning. See the file 'u}COPYLEFT.JRD' for the full copyright notice. */ #include /* fprintf(fd, ctlstring, arg, arg, ...) - Formatted pru}int. Operates as described by Kernighan & Ritchie. b, c, d, o, s, u, and x specifications are supported. Note: b (biu}nary) is a non-standard extension. */ fprintf(argc) int argc; { int dummy[1]; int * nxtarg; /* nxtarg = CCARGC() + &argu}c; */ nxtarg = &argc + dummy[1] - 1; return(_pfguts(*nxtarg, --nxtarg)); } /* printf(ctlstring, arg, arg, ...) - Formu}atted print. Operates as described by Kernighan & Ritchie. b, c, d, o, s, u, and x specifications are supported. Notu}e: b (binary) is a non-standard extension. */ printf(args) int args; { int dummy[1]; /* tprintf("printf: &args=%x &aru }gc=%x argc=%d\n", &args, &dummy[1], dummy[1]); */ return(_pfguts(stdout, &args + dummy[1] - 1)); } /* _pfguts(fd, ctlstu!}ring, arg, arg, ...) Called by fprintf() and printf(). */ _pfguts(fd, nxtarg) int fd; int * nxtarg; { int arg, left, pu"}ad, cc, len, maxchr, width; char * ctl, * sptr, str[17]; cc = 0; ctl = *nxtargu#}--; while(*ctl) { if(*ctl!='%') { fputc(*ctl++, fd); ++cc; continue; } else ++u$}ctl; if(*ctl=='%') { fputc(*ctl++, fd); ++cc; continue; } if(*ctl=='-') { left = 1; ++ctl; } else left u%}= 0; if(*ctl=='0') pad = '0'; else pad = ' '; if(isdigit(*ctl)) { width = atoi(ctlu&}++); while(isdigit(*ctl)) ++ctl; } else width = 0; if(*ctl=='.') { maxchr = atoi(++ctl); u'} while(isdigit(*ctl)) ++ctl; } else maxchr = 0; arg = *nxtarg--; sptr = str; switch(tolower(*ctl++)u(}) { case 'c': str[0] = arg; str[1] = NULL; break; case 's': sptr = arg; break; case 'd': itoa(arg,str); break;u)} case 'b': itoab(arg,str,2); break; case 'o': itoab(arg,str,8); break; case 'u': itoab(arg,str,10); break; case 'x': itu*}oab(arg,str,16); break; default: return (cc); } len = strlen(sptr); /* tprintf(" pf: str '%s' len %d wid %d\nu+}", sptr, len, width); */ if(maxchr && maxchrlen) width = width - len; else u,}width = 0; /* tprintf(" pf: str '%s' len %d wid %d iocb %x\n", sptr, len, width, fd); */ if(!left) while(widthu-}--) { /* tprintf(" pf: pad, iocb %x, %d remaining\n", fd, width); */ fputc(pad,fd); ++cc; } while(leu.}n--) { fputc(*sptr++,fd); ++cc; } if(left) while(width--) { /* tprintf(" pf: fin, %d remaining\n", wiu/}dth); */ fputc(pad,fd); ++cc; } } return(cc); } th--) { /* tprintf(" pf: fin, %d remaining\n", witC#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* This software iy1}s copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */ #include y2}/* Write a string to fd. Entry: string = Pointer to null-terminated string. fd = File descriptor of py3}ertinent file. */ fputs(string,fd) char *string; int fd; { /* we can do better than this ... while(*string) if(fputy4}c(*string++,fd)==EOF) return(EOF); */ write(fd, string, strlen(string)); return(0); } while(*string) if(fputxa#define NOARGC /* no arg count passing */ #define FIXARGC /* don't expect arg counts passed in */ /* Item-stream read }6}from fd. Entry: buf = address of target buffer sz = size of items in bytes n = number of items t}7}o read fd = file descriptor Returns a count of the items actually read. Use feof() and ferror() to determ}8}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 toA} write fd = file descriptor Returns a count of the items actually written or zero if an error occurred. B} May use ferror(), as always, to detect errors. */ fwrite(buf, sz, n, fd) char * buf; int sz, n, fd; { if (writeC}(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 #0E} ; so we can zap X before cmp #0 ; (setting cond codes and) rts ; returning k: lda keybdv+5 pha lda keybdv+F}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 iH}s copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */ /* Gets an entirI}e string from stdin (excluding its newline terminator) or size-1 characters, whichever comes first. The input is termJ}inated by a null character. The user buffer must be large enough to hold the data. Entry: str = Pointer to destinatiK}on buffer. Returns str on success, else NULL. */ #include gets(str) char *str; { return (fgets(str, 32L}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 leveN}l locations ; like the stack ptr etc. ; sp = $80 ; stack pointer sreg = $82 ; secondary register argcnt = $82 ; same O}slot; temp for vararg funcs tmpptr = $84 ; pointer to random frob fntemp = $86 ; pointer to file name svax = $88 ; slotP} to save/rest AX into origsp = $8A ; original system sp ptr1 = $8C ptr2 = $8E ptr3 = $90 tmp1 = $92 tmp2 = $93 tmp3 =Q} $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 unalloT}cated. ; .globl __himem __himem: .word __FREEMEM ; defined by linker, top of executable ; ; C variable (memblock * U})_freelst. contains head of linked list ; of blocks of mem that have been freed ; .globl __freelst __freelst: .word 0V} ; 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 X}c is alphanumeric */ isalnum(c) int c; { return ((c<='z' && c>='a') || (c<='Z' && c>='A') || (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[]; /a}* 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}c is a control character (0-31 or 127) */ iscntrl(c) char * c; { /* c is a simulated unsigned integer */ retud}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 /* f} Determine if fd is the console. */ iscons(fd) int fd; { return(fd == 0); /* kludge. need a way to tell what iocg}b is open on */ } s the console. */ iscons(fd) int fd; { return(fd == 0); /* kludge. need a way to tell what ioc BASCII BATB{ATARI M65BATASCII BATBATOI C BATOIB C BBCOPY M65BBZERO M65BCQFILES LSTBCGETC M65BCGETS M65BCHANGELO BCIO M65BCLOSE M65BCLOSEALLM65B COPYLEFTJRDBCPUTC M65BCTYPE H BDELETE C BDISCLAIMH BDISCLAIMM65BDTOI C BFCLOSE C BFDELETE M65BFGETS C BFILE H BFILES G BFILES LSTB FNAME C BFOPEN C BFPRINTF C B0FPUTS C B5FREAD C B9FRENAME M65B?FWRITE C BDGETCH M65BGGETS C BMGLOBAL M65BRHQFILES LSTBSHEAP M65BWISALNUM C BZISALPHA M65B]ISASCII C B`ISATTY C BbISCNTRL C BeISCONS C BqISDIGIT M65BsISGRAPH C BuISLOWER C BwISODIGITM65ByISPRINT C B{ISPUNCT C B~ISSPACE C BISUPPER C BISWHITE M65BISXDIGITC BITOA M65BITOAB C BITOD C BITOO C BITOU C BITOX C BMQFILES LSTBMAKEFILE BOLD ; isdigit(c) -- decimal-p .globl _isdigit _isdigit: jsr popax ; get the char cmp #'0' ; < '0'? bcc ret0 ; less, rr}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 t}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 v}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, x}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 z}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 i}s 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 <= ' ' && (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) - Conve}rt "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; } wh}ile(n /= b); *ptr = 0; reverse (s); } + lowbit; if(*ptr < 10) *ptr += '0'; else *ptr += 55; ++ptr; } wh+#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 /* This software is copyright 1989 by John Dunning. See the file 'COPYLEFT.JRD' for the full copyright notice. */ /}* open kludge */ #include int old_open(name, mode) char * name; int mode; { char copen_mode; if (mode & O_RDO}NLY) copen_mode = 'r'; else if (mode & O_WRONLY) copen_mode = 'w'; else /* error */ return(-1); return(copen(}name, copen_mode)); } else if (mode & O_WRONLY) copen_mode = 'w'; else /* error */ return(-1); return(copen(/