`CmCDi R@P1  C D     C)D1 p p  C9DI pCDL~CiCDi  C D     C)D1 p p  C9DI pCDL~CiCDi !  L   $G% ȱG   Gȭ Gȭ GG}GHi G$H% `(0 })8` d)L ݆  LGȘ ݆LL d  ! LL d)N>Q  HH) Ln H H` 1 { LL   !L     Hh S }  !? S   q 1 L   Ll  Lg E`L   q 1L N݆LLLNLMLHG!@ Ed E7 GȌd q q G  8    `D 0.. , 0%n ?A[ : L`L  `, 0`Y   0$L GGȽG  hEEEiEȱEi J E8  . m  i   8 rii `дCD    ]   TL ]L!T  ɐ     ]H\H` 18:LAMOC.REMCARENDSCRNOSRENPROUNPSAVLOARUNERADIRTYP) @15= #$!  \LA   L 6: *79.8 L !)ύ! 2L % " H & " L2 h0,!p 0 `7 B  . Ԍ ` U U  ` b?hh` ?? h?` BLV b? V? h? V? b?`8` `CmCDi R@P1 D 343 C`Dp  LCiCDi ( (,C LL C ΨLL )N>@}Q ͫ HH) Υ 1 ի,hyhyB JJ. - ,L *` B%'8  HH`S۩$LL: 4 CL Ψ ® @4 ֪ ®,Hh z 6 SL,) `L讽0AML  NLꮝLL஽NLMLD}HG!@%1F  Ed E7 GȌ6,d G : ,L媮(`LH}  `,30``)-.p,.,i--H   0$L1 ("G GȽG 6 ,G)ȱGȱGHh0})Hh hEEEiEL}Ei 4J3E83 .3m43i   8 rii `%дCDO}  C  L` Ϯ`DOS SYS IIIIIIIIIIIIIII(C'(/`0( P} ɐ   ɜ  HH`h g  1T}:LMOC.REMCARENDSCRNOSRENPROUNPSAVLOARUNERADIRTYP) G26۴Ŵ:W#$!  L |  L@U} |: *. L@ )ύ L % ݶ ӶH & ݶ Y}L ۶h0,p 0 ۶e `  e .f e e Ԍe f ` `ɛ, `ɦ [\  B V` @  ? ? ?hh`l `CmCDi R@Pc}1  `;LHLL L L L D1: hs ht u Lu t Hs H ~ ` j L j L j W ~ ` v j `l v j j}`l v j `l DRIVE NUMBER ERRORNO BUFFERSDISK FULLI/O ERRORSYSTEM ERRORINVALID FILE NAMEFTe DOS XL - ATARI versionk} 2.30X Copyright (C) 1994 by FTe FILE PROTECTEDWRITE PROTECTEDDIRECTORY FULLFILE NOT FOUNDADR RANGE ERRORBREAKl} KEY ABORTINVALID DEVICENO CARTRIDGE * VL5 * YL5 H HHH h`H)h`e * D 343 C`Dp CDLCiCDi Q( (,POCL ݞLL C LL )N>Q v}HH) 1 ,hyMMhyNNBL ,L HH`S$LL: 4 CL  @4 ,PHOh z 6Ly} SL,L) `L}0AMݢLݡ  NݞLLL⦅NLMLHz}G!@%1F  Ed E7 GȌ6,MNd G : ,L(`L  ~}`,30``)-.p,.,i--H  0$L1 ("GGȽG 6 hEEEiEȱEi 4J3E83 .3m43i   8 rii `%дCD  C  L` `DOS SYS IIIIIIIIIIIIIII(C'(/`0( } n H  0 `  L D:STARTUP.EXCD:DOSXL.SYSD:AUTORUN.SYSD:ME}NU.COM L  L L Wl  @]8ʈl 08a{)(`l HH`o n   o Lv `  LD 1 : LMOC.REMCARENDSCRNOSRENPROUNPSAVLOARUNERADIRTYP) Z"} 2#$!  L W  wL W : * .  rL ɛ p W rL }L 5 0 p 5 ` WLL ɛ L W r0'  0L L W L}  L IɅ Ɉ q L L`  L Ȍ WH hm  )@ L )ύ   L % H & L  h0, p 0 l l `  m 8 0$  l .m l l Ԍ l m ` }`ɛ, `ɦ &'  * 7 I *  + q 8fP dP ȱ ePP bP cP P LP P P`PHPH`FTCDEIPURSLGXQPQQCQ{QiQQQQQR'R#<-R+R0 :[L~]` A%[! i? <>Ș8?0 L\ }[H hA [[0 :[L\[ \i6 0 ! 6\0 iZ fX (YL^ }Z X 9X fX )X OX Z X 9X fX )X OX^ OX iZ 9X fX )X X X Z OX X X }X XL^ Z OX Z X 9X fX )X X X Z X 9X fX )X X OX Z X 9X fX )X OX Z X X Z OX X X X XL_\ OXN iZ OXA iZ fX Y fX )X X OX Z X fX )X OX [ pZ]h OX ] pZ Z X OX pZ` 8嵅嶅$8峅崅 @} eeFf&⥱` D iD i D D D 0! :8`ȱ >#<-R+R}0 :UCLD` A%[! i? <>Ș8?0 L'D UCH hA ['C0 :RCL'DUC }DiVC 0 ! C0 L B2 B` B P@ @ @ @ @ }@ P@: B g@ ALkFL:F }@ @ P@ B @ P@ B P@ @ @ @ @ g@ *@ @ @L@M } g@ AL+OLO B P@ N @ P@Y B g@ A P@ B @ P@y B g@ A g@ A}L$P B A B` B P@ B P@ N @ B @ P@Y B g@ A P@ B @ P@y B g@ A g@ AL>}T_e`e P@ @B` aED N i?΅̥ i iΥ i;}l mPPL{PP iΥ i 5 r'5 '544 44  2 2 244 1 2  2 2 2 23)L0 2 2Y 4L}0` Ȍ4d)4445 5֬445464`45 6 4 LX2 r0L2 2 2L 6  L28 r0` 4D4E 2` 5 r5 544 44  2 2 244 1 2  2 2 2 23)L0 2 2Y 4L}0` Ȍ4d)4445 5֬445464`45 6 4 r0Ly2 2 2L %M}6 8 r0ۭ 4D4E 2` 4 LF@L@L@L@l  @ @ AL uBDvBE @` 8嵅嶅$8峅崅 @ eeFf&⥱` sB 8@ @B` HED ȱB    Y` 8P    YLM8 8C i L8` 󚅇`65`6`65`6`Hlh`8񐕀~}񐕁`a{)`ɀɶ ii }  x x x d B x x x x x x Mx x x x x x f g x x x x x lx x x x ix x x x c ` x x x x x Ox x x x j}x x x x e h x x x x x nx x x x x x x x Vx ux x x x wvx x x }x  x x s rx x x x Ptx x x x x Z Ux x x x x Nx x x }x x x x Y ax x x x x mx x x x o c0F LӨ_ ƂƃL $ @} oL!  奤   Ƥ L` # 拱ň恥ТL) } R#Rh v0`    ~ }~ SLKii  Ƴƴ` L寢 Lp `hhLL =L` HH`   +37AGKWh hhhhlhhhhhh) #򚅈󚅉 Vцц`Lh @)? vLc)L*Lj }Ƴei  % E` L } 6L  H h  ` Ƚ0*ܱ ɛ DHC}H`xllfflfifiof~ Lִ Lƶ Lƶ G 9 + ԶHӶH`#'7AAEIMS[l = !Lִ ܩ} 1L @ # `H L 0 :)LL: }aZ 0< ִLi慦  }h 6/ L 查 0  ? 0}  .津 ` i? "800 8}&e؅ե ح٥ AYou must include SYSEQU.M65 ahead of th=}is!!AX;$6X; These macros are called by the actual I/O macros.9X; to perform the rudimentary register load functions.=}8X;BX;LX; MACRO: @CHVX;`6X; Loads IOCB number (parameter 1) into X register.jX;t 7 then a memory location1X; is assumed to=} contain the channel number.X; @CH   Q T?T?T?T?>  $> (X;2X;<X; MAC=}RO: @CVFX;P:X; Loads Constant or Value into accumultor (A-register)ZX;d+X; If value of parameter 1 is 0-255, @CVn+X; =}assumes it's an (immediate) constant.xX;'X; Otherwise the value is assumed to+X; be a memory location (non-zero page).=}X;X;X; @CV      @F = AXIO: wrong number o=}f argumentsA  @CH   @CV *PICCOM9;; COMMAND4   OPEN   AOPEN: wrong number of argumentsA    X; MACROS: BGET and BPUT X; X; FORM: BGET ch,buf,len X; BPUT ch,buf,le=}n( X;2 %X; ch is given as in the @CH macro< .X; len is ALWAYS assumed to be an immediateF 1X; and actual value...never a m=}emory addressP /X; buf must be the address of an appropriateZ X; buffer in memoryd X;n +X; puts or gets length bytes to/f=}rom thex 0X; specified buffer, uses binary read/write X; X; X; first: a common macro X; @GP @CH  Q> =} PICCOM9 Q>4  PICBADR9 Q>5  PICBADR9 Q>4  PICBLEN9 Q>5  PICBLEN9"  CIO, 6 X;@ B=}GET J   ABGET: wrong number of parametersA^ h @GP = = =CGBINRr |  X; BPUT   AB=}PUT: wrong number of parametersA  @GP = = =CPBINR   X; A PRINT macroA X; X; MACRO: PRINT =}X; (X; FORM: PRINT ch[,buffer[,length]] X; !X; ch is as given in @CH macro& (X; if no buffer, prints just a RETURN0 %X;=} if no length given, 255 assumed: X;D 8X; used to print text. To print text without RETURN,N -X; length must be given. See=} OS/A+ manualX X;b 2X; EXCEPTION: second parameter may be a literall .X; string (e.g., PRINT 0,"test"), in whichv -X; case=} the length (if given) is ignored. X; PRINT   APRINT: wrong number of parametersA    =}  !   @IO = @GP =@IO= =CPTXTR     @GP = =}= =CPTXTR  * 4 ! > @IO H @GP =@IO==CPTXTRR \ f p X;z A INPUT macroA X; X; MACRO:>} }2490 ;2500 ; now we join up with mode 4 open2510 ;2520 OPENFORREAD2530 LDA MSTART ; simply move the2540 STA MCURRENT J }; ...start pointer2550 LDA MSTART+1 ; ...to the current2560 STA MCURRENT+1 ; ...pointer, both bytes2570 ;2580 LDY #STAJ }TUSOK2590 RTS ; we don't acknowledge failure2600 ;2610 ;2620 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2630 ;2640 ; the routine J }for CLOSE of M:2650 ;2660 MCLOSE2670 LDA ICAUX1,X ; check mode of open2680 AND #OPOUT ; was for output?2690 BEQ MCLREJ}AD ; no...close input 'file'2700 ;2710 LDA MCURRENT ; we establish our2720 STA MSTOP ; ...limit so that2730 LDA MCURREJ}NT+1 ; ...next use can't2740 STA MSTOP+1 ; ...go too far2750 ;2760 MCLREAD2770 LDY #STATUSOK2780 RTS ; and guaranteedJ} to be ok2790 ;2800 ;2810 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2820 ;2830 ; This routine puts one byte2840 ; to the memory forJ} later2850 ; retrieval.2860 ;2870 MPUTB2880 PHA ; save the byte to be PUT2890 JSR MOVECURRENT ; get ptr to zero page2J}900 PLA ; the byte again2910 LDY #02920 STA (FR1),Y ; put the byte, indirectly2930 JSR DECCURRENT ; point to nxt byteJ}2940 RTS ; that's all2950 ;2960 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2970 ;2980 ; routine to get a byte put2990 ; in memory befJ}ore.3000 ;3010 MGETB3020 JSR MSTATUS ; any more bytes?3030 BCS MGETRTS ; no...error3040 LDY #03050 LDA (FR1),Y ; yeJ}s...get a byte3060 JSR DECCURRENT ; and point to next byte3070 MGETRTS3080 RTS3090 ;3100 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;J};;3110 ;3120 ; check the status of the driver3130 ;3140 ; this routine is only valid3150 ; when READing the 'file'...31J}60 ; "M:" never gets errors when3170 ; writing.3180 ;3190 MSTATUS3200 JSR MOVECURRENT ; current ptr to zero page3210 CJ}MP MSTOP ; any more bytes to get?3220 BNE MSTOK ; yes3230 CPY MSTOP+1 ; double chk3240 BNE MSTOK ; yes, again3250 LDYJ} #STATUSEOF ; oops...3260 SEC ; no more bytes3270 RTS3280 ;3290 MSTOK3300 LDY #STATUSOK ; all is okay3310 CLC ; flaJ}g for MGETB3320 RTS3330 .PAGE "Miscellaneous subroutines"3340 ;3350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3360 ;3370 ; finalJ}ly, we have a couple of3380 ; short and simple routines to3390 ; manipulate MCURRENT, the ptr3400 ; to the currently accesJ}sed byte3410 ;3420 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3430 ;3440 ; MOVECURRENT simply moves3450 ; MCURRENT to the floatingJ}3460 ; point register, FR1, in3470 ; zero page. FR1 is always3480 ; safe to use except in the3490 ; middle of an exprJ}ession.3500 ;3510 MOVECURRENT3520 LDA MCURRENT3530 STA FR1 ; notice that we use3540 LDY MCURRENT+1 ; both the A and3J}550 STY FR1+1 ; Y registers...this3560 RTS ; is for MSTATUS use3570 ;3580 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3590 ;3600 ;J } DECCURRENT simply does a two3610 ; byte decrement of the MCURRENT3620 ; pointer and returns with the3630 ; Y register J!}indicating OK status.3640 ; NOTE that the A register is3650 ; left undisturbed.3660 ;3670 DECCURRENT3680 LDY MCURRENT J"}; check LSB's value3690 BNE DECLOW ; if non-zero, MSB is ok3700 DEC MCURRENT+1 ; if zero, need to bump MSB3710 DECLOW37J#}20 DEC MCURRENT ; now bump the LSB3730 LDY #STATUSOK ; as promised3740 RTS3750 .PAGE "RAM usage and clean up"3760 ;3J$}770 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3780 ;3790 ; END OF CODE3800 ;3810 ;3820 ; Now we define our storage3830 ; locations.J%}3840 ;3850 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3860 ;3870 ;3880 ; MCURRENT holds the pointer to3890 ; the next byte to be PUTJ&} or GET3900 MCURRENT .WORD 03910 ;3920 ; MSTOP is set by CLOSE to point3930 ; to the last byte PUT, so GET3940 ; won't tJ'}ry to go past the end3950 ; of data.3960 MSTOP .WORD 03970 ;3980 ; MSTART is derived from MEMTOP3990 ; and points to theJ(} first byte4000 ; stored. The bytes are stored4010 ; in descending addresses until4020 ; MSTOP is set by CLOSE.4030 MSTAJ)}RT .WORD 04040 ;4050 ; DRIVERTOP becomes the new4060 ; contents of MEMLO4070 DRIVERTOP = *+$FF&$FF004080 ; (sets to nextJ*} page boundary)4090 ;4100 ;4110 ; The following is how you make4120 ; a LOAD-AND-GO file under4130 ; Atari's DOS 24140 J+};4150 *= $2E04160 .WORD LOADANDGO4170 ;4180 ;4190 .END driver for Atari's OS"1000 .PAGE "--- general remarks -H Ȃ8嵅嶅$8峅崅 @ ix i z w z !! :8`ȱ -0.:*ɂ` A R6}[|숭|L!ɂ {iʂ 0 ! 0 HH RE}L^LH Ɛ ݟ zH %h  c $p əLHL ݟ H %h RF}@ ) %H$H`͒I9Ɛ ȱ8e`8`LISԠNEבDE̘FIRK}NIJASSAVLOAENTEBLOABSAVNUPRINRE΢REРSIZLOME͠BYŠCРDO TEX  RM}8` ۹ɛg+< ۩, Aλ߻A A $%! 3" 2=_  W @   ɛ;ė(` -Є 5ɛș I hh ` ۤЄѱ RU}>  &𥐪 @ @񊨱ɁȱAх`? [``.8` i L@0:`󙋻ə25 IF/ENDIF STAC NESTED MACRO DE PHASE ERRO*= EXP UNDESYNTAXR} O'FLODUP MACRO NAMLINE # >6553MISSING .ENDNO *NUM/REN O'FLONESTED INCLUDLIST O'FLONOT SAVE FILLOAD TOO BIR}NOT BINARY FILINVALID .SETOO MANY X-REFTOO MANY LOCAL FIELDUNDEFINED MACRMACRO NESTIN BAD PARAMETE!NOT F.P. NOR} DEV HANDLE҉TRUNCATED REÊTIMEOUԋNAːWRITE PROTECTEĒBAD DEV CMĠDRIVE TOO MANY OPEN FILEӢDISK FUL̥FILE NAMŧLOCKEĪFILR}E NOT FN   װLH`H H 0 0 Ĺ `0ע 0 0i~i ) `Ԣ  L8 财 xIiH {h {LR} { {ȹ8 {9 {̚ Ȋ ``l `H ն R} նhJ S)` 0` LQՆ gФб$0R} (` LH shHJJJJ ~h)L0123456789ABCDEF s )LL mL殤 (` L0)   X; X; FORM: INPUT ch,buf,len X; %X; ch is given as in the @CH macro )X; buf MUST be a proper buffer address>} 6X; len may be omitted, in which case 255 is assumed X; ,X; gets a line of text input to the given 'X; buffer, maximu>}m of length bytes X; INPUT   AINPUT: wrong number of parametersA$     ACLOSE: wrong number of par>}ametersA @CH   PICCOM9 CIO(2X;<-X;;;;;;;;;;; END OF IOMAC.LIB ;;;;;;;;;;;;FX;d of th< ;; SAVE CURRENT ORG+X;.@;;START OF SYSTEM IOCBS3IOCB8X;B-ICHID ;;DEVICE HANDLER IS (SET BY OS)L)ICDNV}O ;;DEVICE NUMBER (SET BY OS)VICCOM ;;I/O COMMAND`ICSTA ;;I/O STATUSjICBADR ;;BUFFER ADDRESSt&ICPUV}T ;;DH PUT ROUTINE (ADR-1)~ICBLEN ;;BUFFER LENGTHICAUX1 ;;AUX 1ICAUX2 ;;AUX 2ICAUX3 ;;AUX V}3ICAUX4 ;;AUX 4ICAUX5 ;;AUX 5ICAUX6 ;;AUX 6X;'IOCBLEN IOCB;;LENGTH OF ONE IOCBX; X; IOCV}B COMMAND VALUE EQUATESX;COPN;;OPEN CGTXTR;;GET TEXT RECORD CPBINR ;;PUTV} BINARY RECORDCPTXTR ;;PUT TEXT RECORD(CCLOSE ;;CLOSE 2CSTAT ;;GET STATUS<X;F7X; DEVICE DEPENDENT COMMAND V}EQUATES FOR FILE MANAGERPX;ZCREN ;;RENAMEdCERA!;;ERASEnCPRO#;;PROTECTxCUNP$;;UNPROTECTCPOINT%;;POV}INTCNOTE&;;NOTEX;X; AUX1 VALUES REQD FOR OPENX;OPIN;;OPEN INPUTOPOUT;;OPEN OUTPUTOPUPD ;;OV}PEN UPDATEOPAPND ;;OPEN APPENDOPDIR;;OPEN DIRECTORYX;X;X; EXECUTE FLAG DEFINESX;#EXCYESV};; EXECUTE IN PROGRESS"+EXCSCR@;; ECHO EXCUTE INPUT TO SCREEN,%EXCNEW;; EXECUTE START UP MODE6$EXCSUP ;; COLD STV}ART EXEC FLAG@X;JX; MISC ADDRESS EQUATESTX;^CPALOC ;; POINTER TO CP/Ah#WARMST;; WAR, START (0=COLD)r#MEMLOV};; AVAIL MEM (LOW) PTR|%MEMTOP;; AVAIL MEM (HIGH) PTR1APPMHI;; UPPER LIMIT OF APPLICATION MEMORY%INITADRV};; ATARI LOAD/INIT ADR!GOADR;; ATARI LOAD/GO ADR(CARTLOC;; CARTRIDGE RUN LOCATIONCIOV;;CIO ENTRY ADRV}EOL;; END OF LINE CHARX;+X; CP/A FUNCTION AND VALUE DISPLACEMSNT#X; (INDIRECT THROUGH CPALOC)X; V}IE. (CPALOC),YX;"CPGNFN;; GET NEXT FILE NAME'CPDFDV;; DEFAULT DRIVE (3 BYTES)2CPBUFP ;; CMD BUFF NEXT CHAV}R POINTR (1 BYTE)CPEXFL ;; EXECUTE FLAG,CPEXFN ;; EXECUTE FILE NAME (16 BYTES)&)CPEXNP;; EXECUTE NOTE/POINT VV}ALUES0CPFNAM!;; FILENAME BUFFER:!RUNLOC=;; CP/A LOAD/RUN ADRD)CPCMDB?;; COMMAND BUFFER (60 BYTES)NCPCMDGOXV}X;bSAVEPC;; RESTORE PClX;ATARIAX;X; FILE = #DN:SYSEQU.ASMX;X;X; I/O CONTROL BLOCK EQUATES$X;)SAVT SAMPLEL !AROUND;; skip buffers, etc.VX;`BUFFER  MESSAGE1Z}MESSAGE2 AHi there, AM2LENGTH MESSAGE2X;X; BEGIN ACTUAL CODEX; AROUNDOPEN == PRINT  3PRINT =AAlZ}so, we send it to the printer...A BPUT =MESSAGE2=M2LENGTHPRINT =BUFFER(!PRINT  CZ}LOSE <:FEIPOGRAM USING IOMAC.LIBAEI>D:SYSEQU.M65>D:IOMAC.LIBI5A [end of equates and librariX H H^} 奤   Ƥ L` # SAMPLEL !AROUND;; skip buffers, etc.VX;`BUFFER  MESSAGE1Z}MESSAGE2 AHi there, AM2LENGTH MESSAGE2X;X; BEGIN ACTUAL CODEX; AROUNDOPEN == PRINT  3PRINT =AAlZ}so, we send it to the printer...A BPUT =MESSAGE2=M2LENGTHPRINT =BUFFER(!PRINT  CZ}LOSE <:FEIPOGRAM USING IOMAC.LIBAEI>D:SYSEQU.M65>D:IOMAC.LIBI5A [end of equates and librariX H H^} 奤   Ƥ L` #