@L|}6CD l0C)HCC WhL/h `CmCDiD`  R@W1  Y0@R !L` D  C D     )16CS S)  C)D1 p p 0 C9DI pCDL~CiCDiD` D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&0") $G% }H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0 })8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH) }  hyhyB q L> Lm JJ  Ln*` dB%' }8  H H` 1 { LL   !L     Hh SY?  q  1L }  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}} HE |||DDOS DOSDOS SYS }}}} ??}CDOS SYS} 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU  } L ? .  t`GBJ V~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI   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;DELV䌚 !B y`@ʆ 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 V (` 9 V⪍ ઍ  -'}LLu DEHILV 9 .l 9 .l  `` s$B VBH(}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL)}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e*}1i1232435ޥ<<8} 3E:}DISK OPERATING SYSTEM II VERSION 2.0SCOPYRIGHT 1980 ATARIA. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDGE J. D,}UPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRESSF. LOCK F-}ILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES9!&x#!7&p))'&X*./)L''-؆莟.}R'S  vW DEHHI 1A#! @ ~0ɛ8A0.) ȅ 1 1i/}il ! 1L NO SUCH ITEMSELECT ITEM OR FOR MENU! 0 .{z:*{}.|~ 1 0 00}JB 18L^%|DLl%DIRECTORY--SEARCH SPEC,LIST FILE? # 0 0 n&|D! 1L NOT A DISK FILE1}N !B 1L " 1 !BDED:}:1BJ|DE 1DEBH2}I 1 h0ߢ 0.  0?詛 1 ~0YЛ 1 "L<" "L 3} BL1TYPE "Y" TO DELETE...DELETE FILE SPECCOPY--FROM, TO?OPTION NOT ALLOWED COPYING---DN:4}# 0|D .L$A#B#C#JB|DE 1BHIDD#E 1D#0: B5} 1L B#C#C#B# B 1N#$0SYS1}:e#D# d# D# .d#ȽD# d# 𩛙d#X# 1,A#6}PdD#ELO- A.BJdD#E 1 1HH 0hh|DL^%1}:e# Lt% e#dD#EL%7} 1 0 . .0% 1L WILD CARDS NOT ALLOWED IN DESTINATION 0 A.|K@C}//3Hu ξL/L DRIVE TO WRITE DOS FILES TO?WRITING NEW DOS FILESTYPE "Y" TO WRITE DOS TO DRIVE 2.?}D2:DOS.SYSERROR - NOT VERSION 2 FORMAT. , &* բ( 1L `[) 0NΞ 0 L1M) 1@} L BAD LOAD FILELOAD FROM WHAT FILE?) 0 0#B 1L WHAT FILE TO LOCK?) 0 0$B 1L WHAT FILE TO UNLOCK?DUA}P DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO USE PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV. h  ,B}  `)  <0 2 2 0  ,   ,,ޢ* 1L ,K* 1 ~0 0C}FINSERT BOTH DISKS, TYPE RETURNERROR - DRIVES INCOMPATIBLE., 1 ~038  , 1L D}, &*  Lz+, 0 , 1 ~0 + Y,0!,0 ,L+ ,mm  v,"ǭE}0Ξ, 05,Lt+L +,Hh` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNF}INSERT DESTINATION DISK,TYPE RETURN`    `L,8,0( rG}L1(`ߢ) 1* 1 ~0Y`hhL S SL1) 8`NAME OF FILE TO MOVE?- 0 0|DLtH}% A., 1 <0 0 .@L# .BJ 1  DEHIB V L1 ,5 1 <0,L. I} JB|,A#Pd#DE 1 HI BDEHHII 1 B 1 , 1 <0,0Lf- B VJ},A#P, 1 <0 0L#L ߢ) 1* 1 ~0Yj383}mm ݭK}}`8}``|* ? ɛ,`|:(|/ 1L `DESTINATION CANT L}BE DOS.SYS0 0H{ $22Δ $28/L /) $2 Π $2 0 ξM}hAΞB,0 J 1 BޝDEHI,HDE 1HIHIDELSAVE-N}GIVE FILE,START,END(,INIT,RUN)O X0 1`BDEPHI V` X0H 1 L O}0 0 1L0`PLEASE TYPE 1 LETTER,0`hhL <0 1L0LA1 ,;ɛ7,"ɛ:ݦ1ݥP}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{Q}NAME TOO LONG B VL ` L1I H1EӝDL1|mDiE` V0`8d/8 i:"2!22 1R} L ERROR- 128ɛ+,' 20*.. өw2 1``2TOO MANY DIGITSINVALIDS} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4uT} HEXADECIMAL PARAMETER800 0 8 00`,0'D800H,ɛh`2L1NEED D1 THRU D4upppBBBA}File loaded OK. Blocks: Load addr: $ Init addr: $E:S:K: V}Mantis 1.0 (C)1982 John Howard Palevich Load,Save,Read,Write,Go,Cont,Modify,Dos Enter address, any non-hex char ends. addrW} 08 19 2a 3b 4c 5d 6e 7f 01234567 #### aa aa aa aa aa aa aa aa ........ B VBED JK V B VX}B EDJK V` B VBEDJK V䩲ੈj⩅( (ee01ȱY}01 BEDIH Vੈ⩅( D@0Lቩ:Z} ( ʗੈB⩅( DL-ee8 ݚ [} BEDIH V Ȏ  )  l BEDIH\} VLPardon?ߊߊߊ0kߊߊߊߊߊߊtpߊߊߊߊq,ߊߊߊߊߊߊߊߊߊߊߊ Mod: 0-9,A-F,<>@?./; ]}䍒)卓Hੋ⩇( :ੈ⩇( LH hL䋅h⭓ 3  eL 0^}:mmL-=+* <>~.fbੈ⩇( 䍒卓) _}䭓   LIHੋ⩇( L@"୓)ȱL?Lh⭓ 3ee 3L`}ee@! BEXDIH VL 3ũee 3HeehТ⍒)㍑LDidn'ta} find it./&⭓ 3I emmL;#⭓ emmLH" ? ?h ? BEDb}IH VL" isn't a Modify mode command.͑4͐*୑ee͓͒L)Lc})8xLТ B V` B V B VBED JK V䭲`l ȎÏBED(Hd}I V0`쎮ɛ8L` ,8`` 펐`  펰 `E SK``BHILe}VH BHIhLV K 80+ B VBEDJK V0L / [LMissing file nameď BEDf}IH VL N05 N0-- N0 N0 N NL叩`File I/O Error H [ BE DIH Vh g}ZL? BLVNot a load file. BEeDIH V [L NLLv NLLv N: BEh}DIH V [LBad boot tape format. N0[ N0S N0KͧЦͨО N03 N0+ B VBEi}DJK VL  LL@[ BEDIH V䮧 - ?  ? [LData block outj} of range:L@Luͨͧ⭨ NL eͩ ͪL_eeL [ BEDIk}H V䭯 Z BEϝDI H V䮫  BEܝDI H V䮭  ?)Ll} LďL 80( B VBEDJK VL⭬ 3 `L0L [L Lď m}W ! BEwDIH VL8LNeed begin AND end addr.L⭬ 80( B Vn}䴓BEDJK VL ` ` ` `e `(e `L= BE!DIH VLHaven't loao}ded program yet.Ѝ ʗ ą ą 8 > ʗ BEDIH VLsecond stage boot abortep}d l iiHH`l ݚ)l ʗ BEDIH VLReset ʗ BE)DIHq} VLDosvec ʗl BEaDIH VLCan't continue. Lď 80( B VBEDJr}K VL N0 N0󍯄 N0덫 N0㍬ N0ۍ N0Ӎ$LFile has blocksRe-reading. . . BE۝DI H s}V䭯 Z BEDIH V BEϝDI H V䮫  BEܝDI H V䮭  Bt}EDIH V 80( B VBEDJK VL⭬eDeDE HIBu} VLLH !hHJJJJ -hL-) i7L?i0L?>H BHIh V>` Ϡd8dH -h 8 H -hLv}- )䭯J)` `H)`JJJJJh)Ɨ`@ `ҍԥDDDDDDDDDDw}DDD lD lF> lҩ@`઱x}0Ll`>/ԩЩЈЭ⭑ 32eel੅⭑ y}ee ęeeeeee 3H͒ ͓h ęeeàez}eee 3 ee&ee eeL`ÙHJJJJ ܙh) ܙÙ` iWLi0 {}`0#:80`AG87`a g8W`8` BIH V䮯`@⬯`eDeHe⩼ehL@H|}@hL@eDehe⩼eL@ 펐`  ` 펰 `Heeh䬽`@j}} B VBED JK V`ڈ}File loaded OK. Blocks: Load addr: $ Init addr: $E:S:K: 3@( V`ڈ}File loaded OK. Blocks: Load addr: $ Init addr: $E:S:K: *P`<L/This Character ->!<- is the one =! =L/HHI Bh V`oad addr: $ Init addr: $E:S:K: W;Example Boot file source for Atari;Macro Assembler. Part of the Mantis;Boot Tape Development System (C) 1982; by John H.} Palevichorg $700zzzbegdb 0,[zzzend-zzzbeg]/128+1dw zzzbeg,zzziniclc;second stage bootrtszzzinilda #$3C;turn} off cass.sta $D302jmp startdb 'This character ->'chardb '!' ;char to be printeddb '<- is the one'startlda #27}jsr printclda charjsr printcjmp startprintcpha;save charldx #0txasta $348sta $349lda #11sta $342pla}jsr $e456rtszzzendendAtari;Macro Assembler. Part of the Mantis;Boot Tape Development System (C) 1982; by John H.;Mantis -- a powerful boot;tape debugger for disk based sytems.;(C)1982 John Howard Palevich;Runs on 40K or larger Atari P}CS;with DOS 2.0 (or OS/A+).;Comes in two files:;MANTIS.MAC -- main prog, modify;MANFIO.MAC -- file i/o, Go, Continue.;As}semble with AMAC command line:;D:MANTIS.MAC;;This is MANTIS.MACciov= $e456ICCOM= $342ICBAL= $344ICBAH= $345ICBLL}= $348ICBLH= $349icax1= $34aicax2= $34bpokmsk= $10nmires= $D40Fvvblki= $222irqen= $D20ENMIEN= $D40Ehposp0}= $d000pmbase= $d407gractl= $d01dsdmctl= $22feol= 155open= 3getrec= 5getchr= 7putchr= 11close= 12file_i=} 1buf= $4000al= $e0ah= $e1bl= $e2bh= $e3cl= $e4ch= $e5chr= $2FCdadimacro sum,const%Llda #low [%2]clc}adc %1sta %1lda #high [%2]adc %1+1sta %1+1ENDMdldimacro dest,src%Llda #low [%2]sta %1lda #high [%2]sta }%1+1ENDMdldmacro dest,source%Llda %2sta %1lda %2+1sta %1+1ENDMprintmacro str%Lldx #0lda #putchrsta ic}com,xlda #high %1_msta icbah,xlda #low %1_msta icbal,xlda #high %1_lsta icblh,xlda #low %1_lsta icbll,xjsr }ciovENDMopencmacro iocb,ax1,ax2,fn%Lldx #$10*%1lda #closesta iccom,xjsr ciovlda #opensta iccom,xlda #high }%4sta icbah,xlda #low %4sta icbal,xlda #%2sta icax1,xlda #%3sta icax2,xjsr ciovENDMshowMACRO dest,mess,s}ize%Ldldi al,%2dldi bl,%1ldy #%3jsr showmENDMorg $8480dlistdb $70,$70,$70db $42dw cmsgdb 0,2,0db 2,2,}2,2, 2,2,2,2db 2,2,2,2, 2,2,2,2db 0,$42edscpdw 0db 2,2,2,0,$42dw menudb $41dw dlistassert */1024=dlist/1024}p0b= $9c00offset= $4400offlen= $4000badldb 0badhdb 0eadldb 0eadhdb 0begldb 0beghdb 0inildb 0inihdb 0}blocksdb 0bm_nocdb 0nofiledb 0 ;nz if no file yetsaf_retdb 0 ;nz if never run.can_condb 0 ;nz if can continuecp}_mdb $7dcp_l= *-cp_mprompt= 31pr_mdb 27,promptpr_l= *-pr_mdn_mdb 'File loaded OK. Blocks: 'dn_l= *-dn_mdn_}bg_mdb eol,'Load addr: $'dn_bg_l= *-dn_bg_mdn_in_m db ' Init addr: $'dn_in_l = *-dn_in_meddb 'E:',eolscdb 'S:',eol}kbdb 'K:',eolfnds 40cmsgds 40headrds 40mapds 16*40menuds 40assert */4096=cmsg/4096cpmsdb ' Mantis 1.0 (C)19}82 John Howard Palevich'mmmsdb ' Load,Save,Read,Write,Go,Cont,Modify,Dos'admodedb ' Enter address, any non-hex char en}ds. 'hemsdb ' addr 08 19 2a 3b 4c 5d 6e 7f 01234567'blmapdb ' #### aa aa aa aa aa aa aa aa ........'apeopenc 0,12,}0,edopenc 2,4,0,kbopenc 6,28,1,scdldi al,blmapdldi bl,mapldx #16mapdlldy #40jsr showmlda #40clcadc bl}sta bllda #0adc bhsta bhdexbne mapdldld al,560ldy #26lda (al),ysta edscpinylda (al),ysta edscp+1dl}di 560,dlistprint cp;put copyright message on scrshow cmsg,cpms,40;Copy Low 16Kdldi al,0dldi bl,offsetdldi cl},offlenldy #0clsxlda (al),ysta (bl),yinc albne clsx1inc ahclsx1inc blbne clsx2inc bhclsx2lda clbne cl}sx3dec chbmi clsxqclsx3dec cljmp clsx;now swap, setup, & swap (back)clsxqshow menu,mmms,40jsr swapshow headr},hems,40;get rid of disk, etc.ldx #0kill_slda $31a,xcmp #'D'beq kill_qinxinxinxjmp kill_s;Kill all handl}ers after D:kill_qlda #0sta $31a,xinxsta $31a,xinxsta $31a,xinxlda $31a,xbne kill_q;reset MEMLOWlda #}0sta $2e7lda #7sta $2e8dldi al,$700clrmlplda #0taysta (al),ydadi al,1lda ahcmp #$38bcc clrmlp;Re-ope}n screenjsr hackmjsr swap;set up memory maplda #1sta nofilesta saf_retlda #0sta can_condldi where,$700}dld top,where;get next commandpr_lpjsr updateprint prjsr getlnjsr getccmp #promptbne pr_drjsr getc ;get n}ext charpr_drand #$1fasl ataylda com_tab,ysta allda com_tab+1,ysta ahjmp (al)no_opprint huhjmp pr_lp}huh_mdb 'Pardon?',eolhuh_l= *-huh_mcom_tabdw no_op ;@dw no_op ;Adw no_op ;Bdw cm_cont ;Continuedw cm_dos ;Dos}dw no_op ;Edw no_op ;Fdw cm_go ;Godw no_op ;Hdw no_op ;Idw no_op ;Jdw no_op ;Kdw cm_load ;Loaddw cm_mod ;Modi}fydw no_op ;Ndw no_op ;Odw no_op ;Pdw no_op ;Qdw cm_read ;Readdw cm_save ;Savedw no_op ;Tdw no_op ;Udw no_o}p ;Vdw cm_writ ;Writedw no_op ;Xdw no_op ;Ydw no_op ;Zdw no_op ;[dw no_op ;\dw no_op ;]dw no_op ;^dw no_op };_;memory modify commandmodmndb ' Mod: 0-9,A-F,',28,30,31,29,'<>@?./; 'cm_modjsr getadbcs cmmd1 ;no h}ex addrlda clsta whereand #$f8sta toplda chsta where+1sta top+1cmmd1show menu,modmn,40cmmodljsr update};wait for keystrokejsr getkcmp #27 ;escape?bne cmmod1show menu,mmms,40jmp pr_lpcmmod1phajsr atohbcc cmmohx}plajmp cmmod3cmmohxsta al ;temppla;clean up stackdld bl,wherejsr getbasl a ! asl aasl a ! asl aora aljsr} putbjmp cmmodlcmmod3ldx #cdirtncmmd3lcmp cdirt,xbeq cmmd3fdexbpl cmmd3lbmi cmmod4;found a cursor cont char}cmmd3flda cdirtl,xclcadc wheresta wherelda cdirth,xadc where+1sta where+1jmp sonscrcdirtdb '-=+* <>',$7E,28},29,30,31cdirtn= *-cdirt-1cdirtldb -8,8,-1,1,1,-128,128,-1,-8,8,-1,1cdirthdb -1,0,-1,0,0,-1,0,-1,-1,0,-1,0cmmod4 cmp} #'.'bne cmmod5show menu,admode,40lda #0sta clsta chcmenadld where,cllda where+1sta top+1lda whereand #}$f8sta topjsr updatedld cl,wherejsr getk ;wait for a charjsr atoh ;convert to hexbcs cmenaq ;not hexjsr ct16j}mp cmenacmenaqshow menu,modmn,40jmp cmmodlcmmod5cmp #'@'bne cmmod6;goto address under cursordld al,whereldy #0}lda (al),ysta whereand #$F8sta topinylda (al),ysta where+1sta top+1jmp cmmodlcmmod6cmp #'?'beq search}jmp cmmod7;search for two bytes under cursorsearchdld bl,wherejsr getbsta cldadi bl,1jsr getbsta chjmp serlp}2 ;start w/o incserlpdadi bl,1lda bhcmp #$40bcc serlp2print dnfjmp cmmodlserlp2jsr getbcmp clbne serlpd}adi bl,1jsr getbphadadi bl,-1placmp chbne serlp;found it.lda blsta whereand #$F8sta toplda bhsta top}+1sta where+1jmp cmmodldnfmdb 'Didn''t find it.',eoldnfl= *-dnfmcmmod7cmp #'/'bne cmmod8;Compliment byte at cu}rsor, inc cursordld bl,wherejsr getbeor #$ffjsr putbdadi where,1jmp sonscrcmmod8cmp #';'bne cmmod9;clear by}te at cursor, inc cursordld bl,wherelda #0jsr putbdadi where,1jmp sonscr;Not foundcmmod9phalda #'"'jsr putc}lda #27jsr putcplajsr putcprint bacjmp cmmodlbacmdb '" isn''t a Modify mode command.',eolbacl= *-bacm;Stay} on screensonscrlda where+1cmp top+1bcc sonsubne sonsc2lda wherecmp topbcc sonsusonsc2dld al,topdadi al,12}7lda ahcmp where+1bcc sonsdbne sonsc3lda alcmp wherebcc sonsd;cursor still on screensonsc3jmp cmmodl;Cur}sor moved up.sonsulda whereand #$F8sta toplda where+1sta top+1jmp cmmodl;Cursor moved dn.sonsdlda whereand }#$F8secsbc #120sta toplda where+1sbc #0sta top+1jmp cmmodl;cm_dos go back to DOScm_doslda #0sta hposp0}ldx #$20lda #closesta iccom,xjsr ciov ;close keyboardldx #$60lda #closesta iccom,xjsr ciov ;close screenope}nc 0,12,0,edlda saf_retbeq cm_dossrts ;back to dos.cm_dossjmp ($A) ;Safe (slow) returninclude D:MANFIO.MACshowm}lda (al),yjsr atobsta (bl),ydeybpl showmrtsatobydb 0atobphasty atobyand #$60lsr alsr alsr alsr a}lsr atayplaand #$9Fora atobt,yldy atobyrtsatobtdb $40,0,$20,$60;Swap low & middle banks while;interrupts a}re disabledswaplda #0sta irqensta nmienlda alldx al+offsetsta al+offsetstx allda ahldx ah+offsetsta ah}+offsetstx ahlda blldx bl+offsetsta bl+offsetstx bllda bhldx bh+offsetsta bh+offsetstx bh } lda clldx cl+offsetsta cl+offsetstx cllda chldx ch+offsetsta ch+offsetstx chdldi al,0dldi bl,offset}dldi cl,alldy #0jsr swapldldi al,ch+1dldi bl,offset+ch+1dldi cl,$FF-chjsr swapldldi al,$200dldi bl,offse}t+$200dldi cl,offlen-$200jsr swapllda pokmsksta irqenlda #$40sta nmienrtsswapllda (al),ytaxlda (bl),y}sta (al),ytxasta (bl),yinc albne swap1inc ahswap1inc blbne swap2inc bhswap2lda clbne swap3dec chbmi }swapqswap3dec cljmp swaplswapqrts;top of memory map pointertopdw 0;where is the cursorwheredw 0;what type of c}haracter displayctypedb 0;mask for reverse video cursormmaskdb 0mcountdb 0;update screen;set up player 0updateld}a #$3Esta sdmctllda #high p0b-4sta pmbaselda #3sta gractllda #0ldy #7uppmcsta hposp0,ydeybpl uppmclda }#168sta hposp0dld bl,topldy #0tyauppclsta p0b,ydeybne uppclldy #0uppmjsr getbsta p0b+50,ydadi bl,1i}nycpy #128bcc uppmdldi al,map+2 ;hack addrs 1stldx #16dld bl,topupallda bhjsr puthb ;high addr bytedadi al},2lda bljsr puthb ;low addr bytedadi al,24dadi bl,8ldy #7upbldadi bl,-1 ;cleverly --jsr getbphalda blcmp} wherebne upbl2lda bhcmp where+1bne upbl2;this is the cursor's poslda #$80sta mmaskupbl2plajsr puthb ;byte} at addrlda #0sta mmaskdadi al,-3deybpl upblldy #7dld cl,aldadi cl,28dadi bl,7upcljsr getbjsr atob}sta (cl),ydadi bl,-1deybpl upcldadi al,38dadi bl,9dexbeq upalqjmp upalupalqrts;Put byte in A onto scree}n at (al)puthbydb 0puthbsty puthbyldy #0phalsr a ! lsr alsr a ! lsr ajsr puthcinyplaand #$fjsr puthc}ldy puthbyrtsputhccmp #$Abcc puthc1clcadc #'a'-10jmp puthc2puthc1adc #48puthc2jsr atobora mmasksta (al),}yrts;Char in A to hex nybble, or SEC.atohcmp #'0'bcc atohqcmp #'9'+1bcs atoh2secsbc #'0'clcrtsatoh2cmp }#'A'bcc atohqcmp #'F'+1bcs atoh3secsbc #55clcrtsatoh3cmp #'a'bcc atohqcmp #'f'+1bcs atohqsecsbc #87}clcrtsatohqsecrts;get character from keyboardgetkstx atobyldx #$20lda #getchrsta iccom,xlda #0sta ic}blh,xsta icbll,xjsr ciovldx atobyrts;getb -- get byte from (bl)getbsty atobyldy #0lda bhcmp #high offlenb}cc getb1 ;in offset regionlda (bl),ygetbqldy atobyrtsgetb1dadi bl,offsetlda (bl),yphadadi bl,-offsetplajmp }getbq;putb -- put A into (bl)putbsty atobyldy #0phalda bhcmp #high offlenbcc putb1plasta (bl),yjmp getbq}putb1dadi bl,offsetplasta (bl),ydadi bl,-offsetjmp getbq;try to get hex address from fngetadjsr getcbcc getad1}rts ;no wordgetad1jsr twsbcc getadldx #0stx clstx chjsr atohbcc getad2rts ;no hex digetsgetad2jsr ct16}jsr getcbcs getadqjsr atohbcc getad2getadqclcrts;multiply C times 16 & add Act16ydb 0ct16phasty ct16yl}dy #3ct16lclclda cladc clsta cllda chadc chsta chdeybpl ct16lplaora clsta clldy ct16yrts;hackmlda #64sta 106sta $2E4sta $2e6lda #0sta $2E5openc 0,12,0,edrtsend apeer Atari Ps10 *= $70020 ZZZBEG .BYTE 0,ZZZEND-ZZZBEG/128+130 .WORD ZZZBEG,ZZZINI40 CLC50 RTS60 ZZZ}INI LDA #$3C70 STA $D30280 JMP START90 ;0100 .BYTE "This Character ->"0110 CHAR .BYTE "!"01}20 .BYTE "<- is the one"0130 ;0140 START LDA #270150 JSR PRINTC0160 LDA CHAR0170 JSR P}RINTC0180 JMP START0190 ;0200 PRINTC PHA0210 LDX #00220 TXA0230 STA $3480240 }STA $3490250 LDA #110260 STA $3420270 PLA0280 JSR $E4560290 RTS0300 ;0310 ZZZE}ND .END *= $70020 ZZZBEG .BYTE 0,ZZZEND-ZZZBEG/128+130 .WORD ZZZBEG,ZZZINI40 CLC50 RTS60 ZZZ ;Mantis -- a powerful boot;tape debugger for disk based sytems.;(C)1982 John Howard Palevich;Runs on 40K or larger Atari P }CS;with DOS 2.0 (or OS/A+).;Comes in two files:;MANTIS.MAC -- main prog, modify;MANFIO.MAC -- file i/o, Go, Continue.;As }semble with AMAC command line:;D:MANTIS.MAC;;This is MANFIO.MAC;get line from usercxdb 0wdds 20getlnldx #0stx c }xlda #getrecsta iccom,xlda #high fnsta icbah,xlda #low fnsta icbal,xlda #40sta icbll,xlda #0sta icblh,x }jsr ciovbmi getlnrts;getc get char from fn[cx++], return;cs if eol, else ccgetcxdb 0getcstx getcxldx cxlda fn, }xcmp #eolbne getcgsecjmp getcqgetcginc cxclcgetcqldx getcxrts;tws returns CS if A not white space.twscmp }#' 'beq twsycmp #','beq twsysecrtstwsyclcrts;getwd gets word from fn[cx];returns CS if can't getwd.getwdjs }r getcbcc getwd2rts ;no chars leftgetwd2jsr twsbcc getwd ;just white space.ldx #0getwd3sta wd,xinxcpx #19 }bcs getwdf ;too long a wordjsr getcbcs getwdf ;end of linejsr twsbcs getwd3 ;still part of wdgetwdflda #eolsta w }d,xclcrts;examine file name.f_examlda wdcmp #'E'beq f_openqcmp #'S'beq f_openqcmp #'K'beq f_openqlda #0 }rtsf_openqtaylda #$ff ;set Nrts;Get character from filefgetcldx #filei*$10lda #getchrsta iccom,xlda #0st }a icbll,xsta icblh,xjmp ciov;Put char to filefputcldx #filei*$10phalda #putchrsta iccom,xlda #0sta icbll,x }sta icblh,xplajmp ciovcm_loadjsr getwd ;get file namebcs no_fnjsr f_exambmi er_quitopenc filei,4,0,wdbmi e }r_quit ;couldn't openjmp pr_b ;ok, load.er_quitjsr fioerjsr fclosejmp pr_lpnofnmdb 'Missing file name',eolnofnl }= *-nofnmno_fnprint nofnjmp pr_lp;get address from load file.fgetajsr fgetcbmi fgetaqsta badljsr fgetcbmi f }getaqsta badhand badlcmp #$ffbeq fgeta ;is it $FFFF?jsr fgetcbmi fgetaqsta eadljsr fgetcbmi fgetaqsta }eadhlda badhcmp #3bcs fgetagjsr fgetc ;get load addrjsr fgetcjmp fgetafgetaglda #1tayfgetaqrts;bad file }fioer_mdb 'File I/O Error 'fioer_l= *-fioer_mfioertya ;i/o errorphajsr fcloseprint fioerplajsr putdlda #eo }ljmp putc;close filefcloseldx #file_i*$10lda #closesta iccom,xjmp ciov;bad load fileblf_mdb 'Not a load file. }',eolblf_l= *-blf_mblfprint blfjsr fclosejmp pr_lp;good file;now find start addr of tapepr_bjsr fgetcbpl pr_ }b2jmp er_quitpr_b2cmp #$ffbeq pr_cjmp blf ;no ffpr_cjsr fgetcbpl pr_cgjmp er_quitpr_cgcmp #$ffbeq pr_djm }p blf ;no ffpr_djsr fgetajsr fgetccmp #0beq pr_ebbtfprint bbtfjsr fclosejmp pr_lpbbtfmdb 'Bad boot tape fo }rmat.',eolbbtfl= *-bbtfmpr_ejsr fgetcbmi preersta blocks ;# blocks of tapejsr fgetcbmi preersta begljsr fge }tcbmi preersta begh;check if lf-load-addr = bt-load-addr;sure sign of legal boot tape load filelda beglcmp badlb }ne bbtflda beghcmp badhbne bbtfjsr fgetcbmi preersta iniljsr fgetcbmi preersta inih;got size, etc, so re }-readopenc file_i,4,0,wdbpl rd_lppreerjmp er_quit;read in file to bufferrd_lpjsr fgetabpl rd_acpy #136bne r }d_lpejmp rd_dnrd_lpejmp er_quitrd_alda badhcmp #$40bcc rd_aa;bad or out-of-range beg/end addrsbeoorprint oor }ldx badlldy badhjsr putalda #'-'jsr putcldx eadlldy eadhjsr putalda #eoljsr putcjsr fclosejmp pr_lp !} oormdb 'Data block out of range:'oorl= *-oormrd_aqjmp er_quitrd_aalda eadhcmp #$40bcc rd_aa2rd_orjmp beoor!}rd_aa2cmp badhbcc beoorbne rd_aglda eadlcmp badlbcc rd_or;load in a block from bad to ead.rd_agdld bl,badl!}rd_agljsr fgetcbpl rd_ag2jmp er_quitrd_ag2jsr putb ;store in bllda blcmp eadlbne rd_ag3lda bhcmp eadhbn!}e rd_ag3jmp rd_lp ;hit end, so looprd_ag3dadi bl,1jmp rd_agl;done filerd_dnlda #0sta nofile ;we have a filejsr!} fcloseprint dnlda blocksjsr putdprint dn_bgldx beglldy beghjsr putaprint dn_inldx inilldy inihjsr put!}alda #eoljsr putcdld where,begllda begland #$F8sta toplda beghsta top+1jmp pr_lp;Write boot tape;W fn!}cm_writjsr getwdbcc wb1jmp no_fnwb1lda nofilebeq wb3 ;but we have loadedjmp no_gowb3jsr f_exambmi wb3erope!}nc file_i,8,128,wdbpl wb4wb3erjmp er_quitwb4dld bl,begljsr getsizwb5ljsr getbjsr fputcbpl wb6jmp er_quitw!}b6inc blbne wb62inc bhwb62lda clbne wb7dec chbmi wbqwb7dec cljmp wb5lwbqjsr fclosejmp pr_lp;save load! } filecm_savejsr getwdbcc sa1jmp no_fnsa1jsr getadbcs sa2 ;no addrdld bl,cljsr getadbcc sa11 ;got 2nd addrp! }rint wsadjmp pr_lpsa11seclda clsbc blsta cllda chsbc bhsta chjmp sawwsadmdb 'Need begin AND end addr.',! }eolwsadl= *-wsadmsa2lda nofilebeq sa3 ;have a filejmp nogosa3dld bl,begljsr getsizsawjsr f_exambmi sawero! }penc filei,8,0,wdbpl sawgdsawerjmp er_quitsawgdlda #$ffjsr fputcjsr fputclda bljsr fputclda bhjsr fputcc! }lclda bladc clphpjsr fputcplplda bhadc chjsr fputcjmp wb5l ;write data like ;boot tape.;;;;cm_go!}lda nofilebeq cm_go2no_goprint nogojmp pr_lpnogomdb 'Haven''t loaded program yet.',eolnogol= *-nogomcm_go2lda !}#0sta hposp0 ;move player offsta saf_ret ;can't returnsta can_conjsr swaplda #2 ;booted tapesta 9 ;bootqdldi $2!},reset ;casinidldi $a,dosvec ;dos vectordldi $c,reset ;dosini;Jsr indirect second stage bootsecjsr ssbgbcc cm_go_!}onjsr swapprint abgojmp pr_lpabgomdb 'second stage boot aborted',eolabgol= *-abgomcm_goonjsr initjmp ($A)ss!}bglda beglclcadc #5taxlda beghadc #0phatxaphartsinitjmp ($2) ;essentially (inil);return from resetre!}setjsr hackmlda $D20Fand #$08 ;shift keybeq reset2jmp (inil) ;fake casinireset2jsr swaplda #1sta can_conpri!}nt bfrjmp pr_lpbfrmdb 'Reset',eolbfrl= *-bfrmdosvecjsr swaplda #0sta can_conprint dosjmp pr_lpdosmdb 'Do!}svec',eoldosl= *-dosm;continue (from a reset)cm_contlda can_conbeq cm_con1lda #0sta hposp0jsr swapjmp (inil) !};carry oncm_con1print cncjmp pr_lpcncmdb 'Can''t continue.',eolcncl= *-cncm;read boot tape filecm_readjsr getw!}dbcc rb1jmp no_fn ;no file namerb1jsr f_exambmi rb1eropenc filei,4,128,wdbpl rb2rb1erjmp er_quitrb2jsr fget!}cbmi rb1erjsr fgetc ;byte #bmi rb1ersta blocksjsr fgetcbmi rb1ersta begljsr fgetcbmi rb1ersta beghj!}sr fgetcbmi rb1ersta iniljsr fgetcbmi rb1ersta inihbpl rb3jmp er_quitrer1mdb 'File has 'rer1l= *-rer1mr!}er2mdb ' blocks'rer2l= *-rer2mrerdmdb eol,'Re-reading. . .',eolrerdl= *-rerdmrb3print rer1lda blocksjsr putdp!}rint rer2print dn_bgldx beglldy beghjsr putaprint dn_inldx inilldy inihjsr putaprint rerdjsr f_exambm!}i rerqopenc filei,4,128,wdbpl rb4rerqjmp er_quitrb4dld bl,begldadi bl,offset ;load up in memldx #$10lda blst!}a icbal,xlda bhsta icbah,xjsr getsizlda clsta icbll,xlda chsta icblh,xlda #getchrsta iccom,xjsr ciov!}bpl rb5jmp er_quitrb5jmp rd_dn;Print YX (word) on E:putatxaphatyajsr putbepla;print A (byte) on E:putbe!}phalsr a! lsr a! lsr a! lsr ajsr puthplajmp puth;Print A on E: as a 1 diget hex #puthand #$fcmp #10bcc puth_! }aclcadc #'A'-10jmp putcputh_aadc #'0'jmp putcputcxdb 0putcstx putcxldx #0phalda #putchrsta iccom,xld!!}a #0sta icbll,xsta icblh,xplajsr ciovldx putcxrts;Print decimal #putdcmp #10bcc puthldy #0putdhlcmp #10!"}0bcc putdhqsecsbc #100inybne putdhlputdhqcpy #0beq putdhnphatyajsr puthplaputdhnldy #0putdtlcmp !#}#10bcc putdtqsecsbc #10inybne putdtlputdtqcpy #0beq putdtnphatyajsr puthplaputdtnjmp puth;get size!$} (of boot tape) to cgetsizlda blocksasl a ! asl a ! asl a ! asl aasl a ! asl a ! asl aand #$80sta cllda blocks!%}lsr aand #$7Fsta chrts;end of fiofor disk based sytems.;(C)1982 John Howard Palevich;Runs on 40K or larger Atari P *APX-20143MANTISJOHN H. PALEVICH10/25/8285285NAMING PROCESS COMPLETEDD2:TITLE! INPUT MASTER DISK TO N$.B'DOS SYSB*+DUP SYSB)UMANTIS B~MEDITMACECFBBOOT OBJBBOOT MACBYMANTIS MACBBOOT AEDBBMANFIO MACB&DISKNAMEDAT