@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 1.?}D1: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 D4u10 TAPE = 0;0=24K disk,1=16K tape20 ;Chameleon 2.0 TTY Emulator30 ; (c) 1981 John Howard Palevich40 ;TVBL -- vertical blaV}nk handler50 ;This cluster sets up & maintains60 ;everything the user sees -- i.e.70 ;the screen, menu, and cursor.80 ;ItW} does this by hanging from the90 ;immediate vblank hook in the OS,0100 ;which means the screen is0110 ;updated every 60th X}of a second0120 .OPT NOLIST0130 ORG=TAPE*$E000+$30000140 MSCR=ORG0150 BEGORG=ORG+$1800 ;beg cluster0160 CRSORG=ORG+$C00Y} ;cursor base0170 MP3=CRSORG+$380 ;player 3's base (cursor is player 3)0180 VBLORG=ORG+$2700 ;vbl cluster0190 VBLANI=VBLORZ}G ;vbl init point0200 PUTCHR=VBLORG+3 ;A -> (X,Y)0210 LCLEAR=VBLORG+6 ;clear (X,Y) to (79,Y)0220 LSWAP =VBLORG+9 ;Swap lin[}e X with line Y0230 MOVEUP=VBLORG+12 ;scroll up one line0240 MOVEDN=VBLORG+15 ;scroll down one line0250 STATLN=VBLORG+18 ;\}(YX)-> 20 characters (ascii) to make up new status line0260 CRITIC = $420270 SETVBV=$E45C ;see OS listing0280 SETIMM=6029]}0 SETDEF=70300 SYSVBV=$E45F0310 XITVBL=$E4620320 CDTMA2=$2280330 SDMCTL=$22F0340 SDLSTL=$2300350 SDLSTH=$2310360 GPRIO^}R=$26F0370 PADDL0=$2700380 STICK0=$2780390 PTRIG0=$27C0400 STRIG0=$2840410 PCOLR0=$2C00420 PCOLR3=$2C30430 COLOR0=$2C4_}0440 COLOR1=$2C50450 COLOR2=$2C60460 COLOR3=$2C70470 COLOR4=$2C80480 CHBAS=$2F40490 POKEY=$D2000500 ALLPOT=POKEY+8051`}0 KBCODE=POKEY+90520 RANDOM=POKEY+100530 IRQST=POKEY+140540 SKSTAT=POKEY+150550 AUDF1=POKEY+00560 AUDC1=POKEY+10570 AUDa}F2=POKEY+20580 AUDC2=POKEY+30590 AUDF3=POKEY+40600 AUDC3=POKEY+50610 AUDF4=POKEY+60620 AUDC4=POKEY+70630 AUDCTL=POKEY+8b}0640 STIMER=POKEY+90650 SKRES=POKEY+100660 POTGO=POKEY+110670 SEROUT=POKEY+130680 IRQEN=POKEY+140690 SKCTL=POKEY+15070c}0 CTIA=$D0000710 HPOSP0=CTIA+00720 HPOSP3=CTIA+30730 HPOSM0=CTIA+40740 SIZEP0=CTIA+80750 SIZEM=CTIA+120760 GRAFP0=CTIA+d}130770 GRAFM=CTIA+170780 VDELAY=CTIA+280790 GRACTL=CTIA+290800 HITCLR=CTIA+300810 GETSW=BEGORG+150820 M0PF=CTIA+00830 e}P0PF=CTIA+40840 M0PL=CTIA+80850 P0PL=CTIA+120860 PAL=CTIA+200870 ANTIC=$D4000880 HSCROL=ANTIC+40890 VSCROL=ANTIC+50900f} PMBASE=ANTIC+70910 WSYNC=ANTIC + 100920 VCOUNT=ANTIC + 110930 NMIEN=ANTIC + 140940 NMIRES=ANTIC + 150950 NMIST=ANTIC + g}150960 PMLF=$240970 PMRT=$DD0980 PMDM=$1800990 PMDP0=$2001000 PMDP1=$2801010 PMDP2=$3001020 PMDP3=$3801030 SWSTRT=11h}040 SWSEL = 21050 SWOPT = 41060 ;1070 ;user page zero1080 TEMPX = $C01090 TEMPY = $C11100 AL = $D61110 AH = $D71120 Ci}X=$E4 ;cursor x pos1130 CY=$E51140 FLASH=$E71150 SOUFLG=$E81160 MENFLG=$EB1170 *=VBLANI1180 JMP VBINIT1190 JMP VPUTj}CH ;put character1200 JMP XLCLEA ;clear to eol1210 JMP VLSWAP ;swap two lines1220 JMP VMOVEU ;move up lines1230 JMP Vk}MOVED ;move down lines1240 JMP VSTATL ;display status line for 15 seconds1250 JMP GETC ;get character1260 ;Since n*80 isl} not a trivial operation, 96 bytes have been sacrificed to1270 ;make a lookup table.1280 YTABL=*1290 .BYTE 0*80+MSCR&$FF,m}1*80+MSCR&$FF,2*80+MSCR&$FF,3*80+MSCR&$FF1300 .BYTE 4*80+MSCR&$FF,5*80+MSCR&$FF,6*80+MSCR&$FF,7*80+MSCR&$FF1310 .BYTE 8*8n}0+MSCR&$FF,9*80+MSCR&$FF,10*80+MSCR&$FF,11*80+MSCR&$FF1320 .BYTE 12*80+MSCR&$FF,13*80+MSCR&$FF,14*80+MSCR&$FF,15*80+MSCR&$Fo}F1330 .BYTE 16*80+MSCR&$FF,17*80+MSCR&$FF,18*80+MSCR&$FF,19*80+MSCR&$FF1340 .BYTE 20*80+MSCR&$FF,21*80+MSCR&$FF,22*80+MSCp}R&$FF,23*80+MSCR&$FF1350 .BYTE 24*80+MSCR&$FF,25*80+MSCR&$FF,26*80+MSCR&$FF,27*80+MSCR&$FF1360 .BYTE 28*80+MSCR&$FF,29*80q}+MSCR&$FF,30*80+MSCR&$FF,31*80+MSCR&$FF1370 .BYTE 32*80+MSCR&$FF,33*80+MSCR&$FF,34*80+MSCR&$FF,35*80+MSCR&$FF1380 .BYTE 3r}6*80+MSCR&$FF,37*80+MSCR&$FF,38*80+MSCR&$FF,39*80+MSCR&$FF1390 .BYTE 40*80+MSCR&$FF,41*80+MSCR&$FF,42*80+MSCR&$FF,43*80+MSCs}R&$FF1400 .BYTE 44*80+MSCR&$FF,45*80+MSCR&$FF,46*80+MSCR&$FF,47*80+MSCR&$FF1410 YTABH=*1420 .BYTE 0*80+MSCR/256,1*80+MSCt}R/256,2*80+MSCR/256,3*80+MSCR/2561430 .BYTE 4*80+MSCR/256,5*80+MSCR/256,6*80+MSCR/256,7*80+MSCR/2561440 .BYTE 8*80+MSCR/2u}56,9*80+MSCR/256,10*80+MSCR/256,11*80+MSCR/2561450 .BYTE 12*80+MSCR/256,13*80+MSCR/256,14*80+MSCR/256,15*80+MSCR/2561460 v}.BYTE 16*80+MSCR/256,17*80+MSCR/256,18*80+MSCR/256,19*80+MSCR/2561470 .BYTE 20*80+MSCR/256,21*80+MSCR/256,22*80+MSCR/256,23w}*80+MSCR/2561480 .BYTE 24*80+MSCR/256,25*80+MSCR/256,26*80+MSCR/256,27*80+MSCR/2561490 .BYTE 28*80+MSCR/256,29*80+MSCR/25x}6,30*80+MSCR/256,31*80+MSCR/2561500 .BYTE 32*80+MSCR/256,33*80+MSCR/256,34*80+MSCR/256,35*80+MSCR/2561510 .BYTE 36*80+MSCy}R/256,37*80+MSCR/256,38*80+MSCR/256,39*80+MSCR/2561520 .BYTE 40*80+MSCR/256,41*80+MSCR/256,42*80+MSCR/256,43*80+MSCR/25615z}30 .BYTE 44*80+MSCR/256,45*80+MSCR/256,46*80+MSCR/256,47*80+MSCR/2561540 ;--- The magic display list ---1550 ;(The actual {}locations to DMA1560 ;memory from are filled in every1570 ;vblank. . . .)1580 ;1590 MDMA .BYTE $70,$70,$60 ;23 Blank line|}s.1600 ;THINL either jumps (1 scan line)1610 ;to rest of display list or it1620 ;displays (8 scan lines) status1630 ;line}}.1640 THINL .BYTE 0,0,01650 ;DMAR (rest of display list) has1660 ;24 lines of GR. 0 text, and a1670 ;jump&wait back to th~}e top of the1680 ;dlist. . . .1690 DMAR .BYTE $42,0,0,$42,0,0,$42,0,01700 .BYTE $42,0,0,$42,0,0,$42,0,01710 .BYTE $42,0},0,$42,0,0,$42,0,01720 .BYTE $42,0,0,$42,0,0,$42,0,01730 .BYTE $42,0,0,$42,0,0,$42,0,01740 .BYTE $42,0,0,$42,0,0,$42,0,}01750 .BYTE $42,0,0,$42,0,0,$42,0,01760 .BYTE $42,0,0,$42,0,0,$42,0,01770 .BYTE $411780 .WORD MDMA1790 ;1800 STAB *}=*+48 ;array used to hold pointers showing which physical lines are where in the logical screen1810 ;in general, YTAB[STAB[2}4+CY]]+CX is the physical memory location1820 ;pointed to by the cursor. To scroll the screen up one line, all1830 ;that w}e have to do is move the 48 bytes in STAB left one byte1840 ;(wrap around, natch) and clear the line now pointed to by STAB[}47].1850 ;This is about 100 times faster than a block move of 4K.1860 ;If the display list were not so flexible, we couldn'}t get away with1870 ;this(!). The normal page is always STAB[24-47]. The previous page is1880 ;always STAB[0-23]. I thin}k that this is a total win.1890 ;1900 MSTAT *=*+20 ;status line1910 CURLOK .BYTE 0 ;nz for curlok1920 CURLTO .BYTE 0 ;nz }if curlok just pressed1930 VBINIT LDX #01940 STA CURLTO1950 STX CURLOK ;no cursor lock1960 INITL TXA1970 STA STAB,X ;}set up STAB to 0-47.1980 LDA YTABH,X1990 STA AH2000 LDA YTABL,X2010 STA AL2020 LDA #02030 LDY #02040 INITLL STA }(AL),Y ;clear line of screen2050 INY2060 CPY #802070 BNE INITLL2080 INX2090 CPX #482100 BNE INITL2110 LDA #MDMA}&$FF ;set up display list2120 STA SDLSTL2130 LDA #MDMA/2562140 STA SDLSTH2150 ;color the screen2160 LDA #$CA ;lt let}ters2170 STA COLOR12180 LDA #04 ;dk backround (grey is easy to read on my TVs).2190 STA COLOR22200 ;put cursor behind }letters.2210 LDA #$08 ;but in front of back.2220 STA GPRIOR2230 LDA #0 ;zero hor. offset2240 STA XLEF2250 STA FLASH} ;and backround color 2260 LDA #24 ;start looking at normal page.2270 STA YTOP2280 LDX #VBLANK/256 ;set up} our vblank handler2290 LDY #VBLANK&$FF2300 LDA #6 ;Vblank imm.2310 JSR SETVBV2320 ;2330 ;setup cursor2340 LDA #$C8}2350 STA PCOLR3 ;cursor lt blue2360 LDA #22370 STA GRACTL ;enable player graphics2380 LDA #$2A2390 STA SDMCTL ;ditt}o2400 LDY #1272410 LDA #02420 INIT1 STA MP3,Y ;erase cursor's player.2430 DEY2440 BPL INIT12450 LDA #CRSORG/256 ;S}et pmbase2460 STA PMBASE2470 LDA #02480 STA OLDCY ;cursor "used to be" at top of range.2490 LDA #1 ;jump (no status l}ine)2500 STA THINL2510 LDA #DMAR&$FF2520 STA THINL+12530 LDA #DMAR/2562540 STA THINL+22550 LDA #02560 STA CYOFF} ;no status line so no need to add anything to cursor's Y pos.2570 RTS2580 ;2590 ;Ahem -- cursor has two meanings -- One,} (CX,CY) used by non-vblank routines2600 ;And two, the graphic representation of that logical cursor, which is2610 ;drawn a}nd re-drawn each vblank. The second meaning is what we care about2620 ;here. This cursor is a player (p0), colored light b}lue, and usually2630 ;shaped like a National Geographic cover (i.e. it borders the letter on2640 ;all four sides). When th}e cursor is off screen, however, the cursor turns2650 ;into an arrow pointing in the direction of where the cursor should26}60 ;truely lie. All these shapes are in the table below.2670 ;cursor patterns2680 CPAT .BYTE $7E,$42,$42,$42,$42,$7E ;norm}al N.G.Box2690 .BYTE $00,$00,$00,$42,$42,$3C ;arror down2700 .BYTE $20,$40,$C0,$C0,$40,$20 ;arrow left2710 .BYTE $00,$0}0,$00,$40,$40,$70 ;arrow down-left2720 .BYTE $04,$02,$03,$03,$02,$04 ;arrow right2730 .BYTE $00,$00,$00,$02,$02,$0E ;srro}w down-right2740 XLEF .BYTE 0 ;left offset (0-40) of left hand position of screen.2750 YTOP .BYTE 0 ;y offset -- 0 == previ}ous page, 24 == current page.2760 YACC .BYTE 0 ;used to inc ytop2770 OLDCY .BYTE 0 ;used to erase previously drawn cursor.}2780 ;2790 ;2800 ;2810 VBLANK LDA FLASH ;bell in progress?2820 BEQ VBLAN1 ;No.2830 DEC FLASH ;Yes, so subtract one284}0 LDA FLASH2850 STA COLOR4 ;and color backround2860 VBLAN1 LDA MENFLG ;menu mode?2870 ORA CRITIC ;or critical system?2}880 BEQ VBLA11 ;no2890 LDA #0 ;yes,2900 STA HPOSP3 ;cursor off screen2910 JMP SYSVBV ;and quit2920 VBLA11 LDA SOUFLG };can we check switches?2930 BNE VB1 ;NO.2940 ;check switches2950 JSR GETSW2960 CMP #5 ;just select2970 BNE VSW12980} LDA SKSTAT2990 AND #83000 BNE VSW13010 LDA CURLTO3020 BNE VB1 ;keep from ghosting sel3030 JSR TOGSL3040 LDA #4}3050 STA CURLTO3060 JMP VB1 ;keep from fake select3070 VSW1 LDA CURLTO3080 BEQ VSW113090 DEC CURLTO3100 VSW11 LDY #2}43110 JSR GETSW3120 AND #23130 BNE VSW23140 LDY #03150 VSW2 STY YTOP3160 LDX XLEF3170 JSR GETSW3180 AND #1319}0 BNE VB1 ;start not pressed down3200 LDA SKSTAT3210 AND #8 ;shift key down?3220 BEQ VB3 ;no3230 CPX #403240 BCS V}B2 ;hit right side3250 INX3260 JMP VB23270 VB3 CPX #03280 BEQ VB2 ;hit left side3290 DEX3300 VB2 STX XLEF3310 JMP} VB11 ;punt curslock3320 VB1 LDA CURLOK ;Cursor lock on?3330 BEQ VB11 ;No.3340 LDA CX3350 SEC3360 SBC XLEF3370 BMI} VB1R3380 CMP #403390 BCC VB11 ;in range3400 INC XLEF ;roll right3410 JMP VB113420 VB1R DEC XLEF ;roll left3430 VB1}1 LDA YTOP ;So now we write the new phisical memory addresses into the display list.3440 STA YACC3450 LDX #03460 VBLC1 L}DY YACC3470 INC YACC3480 LDA STAB,Y ;low <- YTABL[STAB[YACC]] + XLEF3490 TAY3500 LDA YTABL,Y3510 CLC3520 ADC XLEF}3530 STA DMAR+1,X3540 LDA #03550 ADC YTABH,Y ;high <- Carry + YTABH[STAB[YACC]]3560 STA DMAR+2,X3570 INX ;point to }next address3580 INX3590 INX3600 CPX #72 ;Hit end of display list?3610 BCC VBLC13620 ;3630 ;cursor drawing3640 CUR}SOR LDA CX3650 SEC3660 SBC XLEF3670 BCC TOLEFT ;cursor really to left of screen3680 CMP #403690 BCS TORIGH ;cursor }really to right of screen3700 ASL A ;4 dots high3710 ASL A3720 CLC3730 ADC #$30-2 ;ofset to left edge of standard pla}ying field3740 STA HPOSP3 ;Into player 3 (hee, hee, I guess it's always been P3).3750 LDX #0 ;cursor pattern 0-13760 JM}P UPDATE3770 TOLEFT LDA #$30-2 ;stick on left3780 STA HPOSP33790 LDX #2 ;cursor 2-33800 JMP UPDATE3810 TORIGH LDA #$D}0-73820 STA HPOSP33830 LDX #4 ;cursor 4-53840 JMP UPDATE3850 OLDY .BYTE 03860 CYOFF .BYTE 0 ;0 or 4 via STATUS line h}ackery3870 VTEMPX .BYTE 0 ;temp for use during vblank3880 UPDATE LDY OLDY3890 LDA #03900 STX VTEMPX3910 LDX #6 ;erase} the old cursor3920 UPDAT1 STA MP3,Y3930 INY3940 DEX3950 BNE UPDAT13960 LDX VTEMPX3970 LDA YTOP3980 BNE UPDAT23}990 LDA #107 ;put cursor at bottom of screen, and select odd (add one to)pattern4000 CLC4010 ADC CYOFF4020 TAY4030 }INX4040 JMP UPDAT34050 UPDAT2 LDA CY ;compute y pos4060 ASL A4070 ASL A ;*44080 CLC4090 ADC #15 ;+15 (to top of }screen)4100 ADC CYOFF ;for status line4110 TAY4120 UPDAT3 STY OLDY4130 TXA4140 ASL A4150 STA VTEMPX4160 ASL A41}70 CLC4180 ADC VTEMPX4190 TAX4200 LDA #6 ;draw new cursor.4210 STA VTEMPX4220 UPDAT4 LDA CPAT,X4230 STA MP3,Y42}40 INX4250 INY4260 DEC VTEMPX4270 BNE UPDAT44280 JMP SYSVBV ;and exit verticle blank interrupt4290 ;4300 ;swap lin}e4310 ;X with Y4320 VLSWAP PHA4330 LDA STAB+24,X4340 PHA4350 LDA STAB+24,Y4360 STA STAB+24,X4370 PLA4380 STA ST}AB+24,Y4390 PLA4400 RTS4410 ;4420 ;moveup.4430 VMOVEX .BYTE 04440 VMOVEY .BYTE 04450 VMOVEU PHA4460 STY VMOVEY447}0 STX VMOVEX4480 LDY #04490 LDX #04500 JSR VLCLEA ;clear all of top line (soon to be bottom line)4510 LDY #14520 L}DA STAB ;STAB[0]4530 PHA4540 MOVEU1 LDA STAB,Y4550 STA STAB-1,Y ;move up. . .4560 INY4570 CPY #484580 BNE MOVEU14}590 PLA4600 STA STAB+47 ;put old top line on the bottom4610 PLA4620 LDX VMOVEX4630 LDY VMOVEY4640 RTS4650 ;clear }(X,Y+24) -> (79,Y+24)4660 LCLEAY .BYTE 04670 XLCLEA STY LCLEAY4680 PHA4690 TYA4700 CLC4710 ADC #244720 TAY4730 }PLA4740 JSR VLCLEA4750 LDY LCLEAY4760 RTS4770 ;4780 ;clear (x,y) -> (79,y)4790 VLCLEA PHA4800 STY TEMPY4810 LDA }STAB,Y ;find physical address4820 TAY4830 LDA YTABL,Y4840 STA AL4850 LDA YTABH,Y4860 STA AH4870 TXA4880 TAY489}0 LDA #04900 CEOLL STA (AL),Y ;clear to end of line.4910 INY4920 CPY #804930 BNE CEOLL4940 LDY TEMPY4950 PLA4960} RTS4970 ;4980 ;putchar A -> (X,Y)4990 VPUTCH PHA5000 JSR ASTOIN5010 PHA5020 STY TEMPY5030 LDA STAB+24,Y ;look up} physical address (on normal screen)5040 TAY5050 LDA YTABL,Y5060 STA AL5070 LDA YTABH,Y5080 STA AH5090 TXA5100 }TAY5110 PLA5120 STA (AL),Y ;store the character into the screen memory5130 PLA5140 LDY TEMPY5150 RTS5160 ;5170 ;m}ove down one line;identicle in theory to VMOVEU.5180 VMOVED PHA5190 STY VMOVEY5200 STX VMOVEX5210 LDY #23 ;(!) line at} bottom of previous screen & just above top line of normal screen.5220 LDX #05230 JSR VLCLEA5240 LDY #465250 LDA STAB}+475260 PHA5270 MOVED1 LDA STAB,Y ;block move down5280 STA STAB+1,Y5290 DEY5300 CPY #$FF5310 BNE MOVED15320 PLA}5330 STA STAB ;& roll around5340 PLA5350 LDX VMOVEX ;restore state & return5360 LDY VMOVEY5370 RTS5380 ;5390 ;540}0 ;5410 ;convert atascii to internal5420 ;-- gleaned from OS listing.5430 ASTOIY .BYTE 05440 ASTOIN STY ASTOIY5450 PHA}5460 AND #$60 ;bit 6-55470 LSR A ;shift to bit 1-05480 LSR A5490 LSR A5500 LSR A5510 LSR A5520 TAY5530 PLA554}0 AND #$9F ;6-5 off5550 ORA ASTAB,Y5560 LDY ASTOIY5570 RTS5580 ASTAB .BYTE 64,0,32,965590 ;status line hacks5600 ST}L *=*+20 ;actual buffer for status (menu/error) line text5610 VSTATL STX AL ;text is 20 bytes from YX on up.5620 STY AH56}30 PHA5640 LDY #195650 STATL LDA (AL),Y5660 JSR ASTOIN ;convert to internal character set.5670 STA STL,Y5680 DEY56}90 BPL STATL5700 LDA #$46 ;turn THINL into a display 8 scan lines double wide letters at STL command5710 STA THINL5720 } LDA #STL&$FF5730 STA THINL+15740 LDA #STL/2565750 STA THINL+25760 LDA #4 ;so the cursor has to be lower5770 STA CY}OFF5780 LDA #STATC&$FF ;set up a count down timer to go off in 15 seconds & turn off the display.5790 STA CDTMA25800 LD}A #STATC/2565810 STA CDTMA2+15820 LDX #35830 LDY #1325840 LDA #25850 JSR SETVBV5860 PLA5870 LDX AL5880 LDY AH}5890 RTS5900 STATC PHA ;take the status line off of the display.5910 LDA #15920 STA THINL5930 LDA #DMAR&$FF5940 ST}A THINL+15950 LDA #DMAR/2565960 STA THINL+25970 LDA #05980 STA CYOFF5990 PLA6000 RTS6010 ;get character from dis}play6020 ; (X,Y) -> A6030 GETC LDA STAB+24,Y6040 TAY6050 LDA YTABL,Y6060 STA AL6070 LDA YTABH,Y6080 STA AH6090 }TXA6100 TAY6110 LDA (AL),Y6120 ;fall through to intoas6130 ;internal to ascii6140 INTOAS PHA6150 AND #$606160 LSR }A6170 LSR A6180 LSR A6190 LSR A6200 LSR A6210 TAY6220 PLA6230 AND #$9F6240 ORA INTAB,Y6250 RTS6260 INTAB .}BYTE 32,64,0,966270 ;toggle cursor-lock6280 LOKAN .BYTE "OFFON "6290 LOKLN .BYTE "CURSOR LOCK XXX "6300 TOGSL LDA CUR}LOK6310 EOR #$FF6320 STA CURLOK6330 LDX #56340 CMP #06350 BNE TOGSL16360 LDX #26370 TOGSL1 LDY #26380 TOGSL2 LD}A LOKAN,X6390 STA LOKLN+12,Y6400 DEX6410 DEY6420 BPL TOGSL26430 LDX #LOKLN&$FF6440 LDY #LOKLN/2566450 JMP STATL}N6460 .OPT LISTdisk,1=16K tape20 ;Chameleon 2.0 TTY Emulator30 ; (c) 1981 John Howard Palevich40 ;TVBL -- vertical bla10 TAPE = 0 ;0=24K disk,1=16K tape20 ;Chameleon TTY Emulator 2.030 ; (c) 1981 John Howard Palevich40 ;TBEG -- main loop5 }0 ;Inits all sorts of things, then60 ;calls the menu, then acts as the70 ;main keyboard loop. Break and80 ;keyboard handl }ed here, too.90 .OPT NOLIST0100 ORG = TAPE*$E000+$30000110 BEGORG = ORG+$1800 ;beg cluster0120 MENORG = ORG+$1B00 ;men c }luster0130 MENIN = MENORG+0 ;init menu0140 MENU = MENORG+3 ;menu with user0150 OPENR = MENORG+6 ;reopen RS2320160 CLOSER }= MENORG+90170 SOPORG = ORG+$2200 ;sop cluster0180 SOPIN = SOPORG+00190 SHOPT = SOPORG+6 ;typed S-OPT0200 VBLORG = ORG+$2 }700 ;vbl cluster0210 PUTORG = ORG+$2C00 ;put cluster0220 PUTI = PUTORG ;init cursor, etc.0230 PUTNEW = PUTORG+3 ;change tt }y0240 PUTS = PUTORG+6 ;put char0250 VBLANI = VBLORG ;vbl init point0260 STATLN = VBLORG+18 ;menu line display entry point }0270 PUTR = BEGORG+3 ;put char to R: entry point0280 SIOV = $E459 ;see OS listing0290 CIOV = $E456 ;& manual0300 SETVBV = }$E45C0310 SETIMM = 60320 SETDEF = 70330 SYSVBV = $E45F0340 XITVBL = $E4620350 OPEN = 30360 GETREC = 50370 GETCHR = 70 }380 PUTREC = 90390 PUTCHR = 110400 CLOSE = 120410 STATIS = 130420 DRAWLN = 170430 FILLIN = 180440 OPNIN = 40450 OPNOT }= 80460 OPNINO = 120470 JIFFY = $140480 CH = $2FC0490 ICCOM = $3420500 ICBAL = $3440510 ICBAH = $3450520 ICBLL = $348 }0530 ICBLH = $3490540 ICAX1 = $34A0550 ICAX2 = $34B0560 POKEY = $D2000570 SKSTAT = POKEY+150580 CTIA = $D0000590 CONSOL } = CTIA+310600 EOL = $9B0610 PUTLIN = $F3850620 XVB = $E7D10630 ;0640 ;supdup equates0650 ONE = $50 ;iocb for keyboard }0660 TWO = $60 ;iocb for rs-232c0670 VIDEOL = $CC ;pointer to current0680 VIDEOH = $CD ;video routine0690 TEMPX = $C0 ;mic }ro stack0700 TEMPY = $C10710 CX = $E4 ;cursor x position (0-79)0720 CY = $E5 ;cursor y pos (0-23)0730 SOUFLG = $E8 ;not z }ero when consol speaker making sound (& consol switches un-readable)0740 DUPLEX = $E9 ;duplex0750 ECPLEX = $EA ;echoplex07 }60 MENFLG = $EB0770 BLANK = 32 ;ascii space0780 ;0790 *=BEGORG ;start of begin cluster0800 JMP BEGIN ;enter main tty lo }op. No args. called by hel.0810 JMP BPUTR ;A register has character to send to R:. called by put0820 JMP GETR0830 JMP G }ETK0840 JMP ECIOV0850 JMP GETSW ;Gets switches to A0860 ;Keyboard name0870 KEY .BYTE "K:",EOL0880 RS .BYTE "R1:",EOL0 }890 ;0900 BEGIN JSR VBLANI ;init vbl (i.e. screen0910 JSR PUTI ;home cursor. . . .0920 JSR MENIN ;init menu0930 JSR SO }PIN ;init shift-option0940 LDA #0 ;no sound at start0950 STA SOUFLG ;so zero soundflag0960 ;open keyboard0970 LDX #ONE } ;open K:0980 LDA #CLOSE0990 STA ICCOM,X1000 JSR CIOV1010 LDA #OPEN1020 STA ICCOM,X1030 LDA #KEY&$FF1040 STA IC }BAL,X1050 LDA #KEY/2561060 STA ICBAH,X1070 LDA #41080 STA ICAX1,X1090 JSR CIOV1100 ;call menu routine1110 JSR ME }NU1120 JSR CLOSER1130 LDX #TWO1140 LDA #34 ;control rs-232c1150 STA ICCOM,X1160 LDA #RS&$FF1170 STA ICBAL,X1180 } LDA #RS/2561190 STA ICBAH,X1200 LDA #$F0 ;turns on DTR & CTS1210 STA ICAX1,X1220 LDA #01230 STA ICAX2,X1240 JSR }ECIOV1250 JSR OPENR1260 ;1270 ;Main Loop1280 ;1290 BEG5 LDA CH ;is character on K:?1300 CMP #2551310 BEQ BEG161 ;no } char1320 AND #$3F ;ignore ctrl & shift1330 CMP #$27 ;shift atari key1340 BNE BEG511350 JMP BREAK ;send .5 secs break } signal1360 BEG51 CMP #$3C ;caps lock1370 BNE BEG521380 JMP CAPS1390 BEG52 JSR GETK ;get K: to A1400 PHA ;save A1410 } BIT DUPLEX1420 BVC BEG160 ; not to R:1430 JSR PUTR ;put A to R:1440 BEG160 PLA1450 BIT DUPLEX1460 BPL BEG161 ;not }to S:1470 JSR PUTS ;send to S:1480 BEG161 LDX #TWO ;check R:1490 LDA #STATIS1500 STA ICCOM,X1510 JSR ECIOV ;get stat }us1520 LDA 747 ;input buffer count1530 ORA 748 ;hi byte of same1540 BEQ BEG6 ;no chars. . . .1550 JSR GETR ;get R:15 }60 PHA1570 BIT ECPLEX1580 BVC BEG710 ;not to S:1590 JSR PUTS1600 BEG710 PLA1610 BIT ECPLEX1620 BPL BEG6 ;not to R }:1630 JSR PUTR ;echo to R:1640 ;check keys1650 BEG6 JSR GETSW1660 AND #4 ;Option key only1670 BNE BEGLP ;no. . . loop }1680 LDA SKSTAT1690 AND #81700 BEQ BEG7 ;shift down1710 JSR MENU ;user wants menu1720 JMP BEG5 ;loop1730 BEG7 JSR }GETSW1740 CMP #71750 BNE BEG7 ;wait till he lets go.1760 LDA JIFFY1770 CLC1780 ADC #3 ;wait 3 jiffies1790 BEG8 CMP } JIFFY1800 BNE BEG81810 JSR SHOPT ;signal menu1820 BEGLP JMP BEG5 ;loop1830 ;get keyboard1840 ;getk gets a character f }rom the1850 ;keyboard. some hacks to get1860 ;ascii out of atascii. . . :1870 ;1880 ;atascii ascii1890 ;1900 ;return } cr1910 ;tab tab1920 ;back s del1930 ;C-; l-brace1940 ;clear r-brace1950 ;c-delete tilde1960 ;c-. g }rave accent1970 ;c-, nul1980 ;c-up ^\1990 ;c-down ^]2000 ;c-left ^^2010 ;c-right ^_2020 ;2030 GETK LDA # }12040 STA SOUFLG2050 LDX #ONE2060 LDA #GETCHR2070 STA ICCOM,X2080 LDA #02090 STA ICBLL,X2100 STA ICBLH,X2110 }JSR CIOV2120 CMP #1552130 BNE GETK22140 LDA #13 ;eol->cr2150 JMP GETK12160 GETK2 CMP #1272170 BNE GETK32180 LDA }#9 ;tab2190 JMP GETK12200 GETK3 CMP #1262210 BNE GETK12220 LDA #127 ;BACK S-> DEL2230 GETK1 LDX #02240 STX SOUFLG2 }250 RTS2260 ;2270 ;putR - put to rs-232c2280 BPUTR STX TEMPX2290 STY TEMPY2300 PHA2310 LDX #TWO2320 LDA #PUTCHR2 }330 STA ICCOM,X2340 LDA #02350 STA ICBLL,X2360 STA ICBLH,X2370 PLA2380 PHA2390 JSR ECIOV ;put character2400 PL }A2410 LDX TEMPX2420 LDY TEMPY2430 RTS2440 ;2450 ;get from rs-232c to A2460 GETR STX TEMPX2470 STY TEMPY2480 LDX }#TWO2490 LDA #GETCHR2500 STA ICCOM,X2510 LDA #02520 STA ICBLL,X2530 STA ICBLH,X2540 JSR ECIOV2550 LDX TEMPX256 }0 LDY TEMPY2570 RTS2580 ;2590 ;ERROR routine. display error2600 ;code & message.2610 ERRMSG .BYTE "CAN'T HACK RS-232C: }#"2620 ERROR STY ERRMSG+192630 LDA #02640 STA MENFLG2650 LDY #ERRMSG/2562660 LDX #ERRMSG&$FF2670 ERLP JSR STATLN ;d }isplay error message2680 LDA 19 ;4 sec clock2690 ERWLP CMP 192700 BEQ ERWLP2710 JMP ERLP2720 ECIOV JSR CIOV ;ciov wit }h error report (but an error stops you dead)2730 CPY #12740 BEQ ECIOV12750 JMP ERROR2760 ECIOV1 RTS2770 ;2780 ;break } asked for.2790 ;generate .5 seconds break2800 BREAK JSR CLICK2810 LDA CH2820 CMP #$67 ;shift atari?2830 BEQ GBREAK ; }Yes.2840 LDA $2B6 ;No. reverse video2850 EOR #$80 ;and DON'T wait for2860 STA $2B6 ;next character.2870 JMP CAPSQ288 }0 ;2890 ;2900 ;caps detected.2910 ;Do it. . . . and return2920 CAPS JSR CLICK2930 LDA CH2940 AND #$C02950 CMP #$C0 }2960 BEQ CAPSQ2970 STA $2BE2980 CAPSQ LDA #$FF2990 STA CH ;no "real" character pressed.3000 JMP BEG161 ;so go on.301 }0 ;3020 ;generate break for .5 seconds3030 ;3040 GBREAK JSR CLOSER ;disable conc. I/O3050 LDX #TWO3060 LDA #34 ;turn b }reak on.3070 STA ICCOM,X3080 LDA #RS/2563090 STA ICBAH,X3100 LDA #RS&$FF3110 STA ICBAL,X3120 LDA #23130 STA ICA }X1,X3140 JSR ECIOV3150 ;now wait .5 seconds3160 LDA 203170 CLC3180 ADC #323190 GBRL CMP 203200 BNE GBRL3210 ;now } stop break3220 LDA #34 ;turn break off3230 STA ICCOM,X3240 LDA #33250 STA ICAX1,X3260 JSR ECIOV3270 JSR OPENR ;t }o re-open rs-232c3280 JMP CAPSQ3290 ;3300 ;click -- give aural feed-back to those poor lost souls with Atari 400s when th }ey press Atari or caps keys.3310 ;This routine used to jump to3320 ;an un-supported OS routine. Since it might get changed } in future ROM3330 ;upgrades, the routine was changed.3340 CLICK LDA #0 ;Won't affect consol switch input3350 STA CONSOL }3360 RTS3370 ; GETSW gets consol switches to3380 ; A, or claims that they are off3390 ; if SOUFLG is enabled. . . .3400 }GETSW LDA SOUFLG3410 BEQ GETSW1 ;no sound3420 LDA #7 ;sound, so lie.3430 RTS3440 GETSW1 LDA #83450 STA CONSOL ;to ma }ke OS-B happy3460 LDA CONSOL3470 RTSameleon TTY Emulator 2.030 ; (c) 1981 John Howard Palevich40 ;TBEG -- main loop5 )10 TAPE=0 ;0=24K disk,1=16K tape20 ;Chameleon 2.0 TTY Emulator30 ; (c) 1981 John Howard Palevich40 ;TPUT--video drivers }for terminals50 ;PUTNEW--called with terminal type60 ; in A. (0-3)70 ;80 ; PUTS -- will process characters by jumping to }(VIDEOL)90 ; which makes keyboard type-in during escape sequences possible0100 ; -- note that VT-52 lacks the funny graphic}s characters, and that0110 ; the more obscure losses of the ADM-3A are not supported.0120 .OPT NOLIST0130 ORG = TAPE*$E00}0+$30000140 BEGORG = ORG+$18000150 VBLORG = ORG+$27000160 PUTORG = ORG+$2C000170 VBLANI = VBLORG0180 PUTC = VBLORG+3019}0 LCLEAR = VBLORG+60200 LSWAP = VBLORG+90210 MOVEUP = VBLORG+120220 MOVEDN = VBLORG+150230 PUTR = BEGORG+30240 ;supdup  }equates0250 VIDEOL = $CC0260 VIDEOH = $CD0270 TEMPX = $C00280 AL = $D60290 AH = $D70300 VADH = $CF0310 JPL = $DF0320 !}JPH = $E00330 CX = $E40340 CY = $E50350 FLASH = $E7 ;video bell0360 MARGIN = $EC0370 BLANK = 320380 *=PUTORG0390 JMP"} PUTI ;one time init0400 JMP PUTNEW ;put init point0410 JMP (VIDEOL) ;put to screen0420 ADTAB .WORD VT52,VT52,ADM3A,IMAG#}E ;glass and vt52 have same entry point0430 TTYPE .BYTE 0 ;0=glass,1=vt52,2=adm3a0440 PUTI LDA #0 ;Zero cursor0450 STA CX$}0460 STA CY0470 RTS0480 PUTNEW STA TTYPE ;intitialize terminal type0490 STX TEMPX0500 ASL A0510 TAX0520 LDA ADTA%}B,X ;set up indirect jump0530 STA VIDEOL0540 LDA ADTAB+1,X0550 STA VIDEOH0560 LDA TTYPE0570 LDX TEMPX0580 RTS059&}0 VT52 CMP #32 ;space0600 BCS GLASS ;character >= " "0610 JMP GLASSC ;control character0620 ;image mode prints everythin'}g0630 IMAGE LDY CY0640 LDX CX0650 JSR PUTC0660 INC CX0670 LDX CX0680 CPX MARGIN0690 BCS IMAGE10700 RTS0710 ;w(}ent over margin, so cr/lf0720 IMAGE1 JSR CR0730 JMP LF0740 ; ordinary ascii. put on screen0750 ; @(CX, CY). cx<-cx+1, wr)}ap same0760 ; line on write off end.0770 ;0780 GLASS CMP #1270790 BNE GLASS10800 RTS ;don't print DEL's0810 GLASS1 LD*}Y CY0820 LDX CX0830 JSR PUTC0840 INC CX0850 LDA CX0860 CMP MARGIN0870 BCS CHOVER ; X >= margin0880 RTS0890 CHO+}VER LDA #0 ;so wrap to 0.0900 STA CX0910 LDA MARGIN0920 CMP #800930 BEQ CHOVE10940 JMP LF0950 CHOVE1 RTS0960 ; ha,}ndle glass & VT-52 control characters0970 GLASSC ASL A ;code*20980 TAY ; used to index into dispatch table for address of -}routine to handle control char (32 way if).0990 LDA GCTAB,Y1000 STA JPL1010 LDA GCTAB+1,Y1020 STA JPH1030 JMP (JPL).}1040 ; control code dispatch table1050 GCTAB .WORD NOP ;^@1060 .WORD NOP ;^A1070 .WORD NOP ;^B1080 .WORD NOP ;^C1090/} .WORD NOP ;^D1100 .WORD NOP ;^E1110 .WORD NOP ;^F1120 .WORD BEL ;^G1130 .WORD BS ;^H1140 .WORD TAB ;^I1150 .WO0}RD LF ;^J1160 .WORD NOP ;^K1170 .WORD CLR ;^L1180 .WORD CR ;^M1190 .WORD NOP ;^N1200 .WORD NOP ;^O1210 .WORD NO1}P ;^P1220 .WORD NOP ;^Q1230 .WORD NOP ;^R1240 .WORD NOP ;^S1250 .WORD NOP ;^T1260 .WORD NOP ;^U1270 .WORD NOP ;^V2}1280 .WORD NOP ;^W1290 .WORD NOP ;^X1300 .WORD NOP ;^Y1310 .WORD NOP ;^Z1320 .WORD ESC ;^[1330 .WORD NOP ;^\13403} .WORD NOP ;^]1350 .WORD NOP ;^^1360 .WORD NOP ;^_1370 ;null routine for illegal control characters (or escape1380 ; c4}haracters . . . .)1390 NOP RTS ;that was easy, hunh?1400 ;esc -- handle escape codes1410 ESC LDA TTYPE ;terminal in glass 5}mode?1420 BNE ESC1 ; No. (must be vt-52)1430 RTS ; Yes. treat like NOP.1440 ESC1 LDY #ESCA/256 ;reset video jump address6} to the escape code handler (so that keyboard still works).1450 LDX #ESCA&$FF ;fall through to SETVID1460 ;1470 ; setvid 7}-- set video jump addr.1480 SETVID STY VIDEOH1490 STX VIDEOL1500 RTS1510 ; esca - handle escaped characters1520 ESCA C8}MP #$41 ;"A"1530 BCS ESCA2 ; character >= "A"1540 ESCA1 JMP ENDIT ;= Z+1, punt1570 SEC1580 SBC #$41 ; ascii for "A"1590 ASL A ;*21600 TAY ; 26 way if test1610 LDA ESCTAB,Y1620 :} STA JPL1630 LDA ESCTAB+1,Y1640 STA JPH1650 LDX #VT52&$FF ;most escape character codes are letter, so, since this;} is letter, we want to treat1660 ; the next character normally.1670 LDY #VT52/2561680 JSR SETVID1690 JMP (JPL) ;jump t<}o handler for that particular escape code.1700 ENDIT LDA TTYPE1710 ASL A ; universal reset-to-normal for that terminal end=} point.1720 TAX1730 LDA ADTAB,X1740 STA VIDEOL1750 LDA ADTAB+1,X1760 STA VIDEOH1770 RTS1780 ;1790 ESCTAB .WORD >}CURU ;$A1800 .WORD CURD ;$B1810 .WORD CURR ;$C1820 .WORD CURL ;$D1830 .WORD NOP ;$E1840 .WORD NOP ;$F1850 .WORD?} NOP ;$G1860 .WORD HOME ;$H1870 .WORD RLF ;$I1880 .WORD CEOS ;$J1890 .WORD CEOL ;$K1900 .WORD NOP ;$L1910 .WOR@}D NOP ;$M1920 .WORD NOP ;$N1930 .WORD NOP ;$O1940 .WORD NOP ;$P1950 .WORD NOP ;$Q1960 .WORD NOP ;$R1970 .WOA}RD NOP ;$S1980 .WORD NOP ;$T1990 .WORD NOP ;$U2000 .WORD NOP ;$V2010 .WORD NOP ;$W2020 .WORD NOP ;$X2030 .WB}ORD DCA ;$Y2040 .WORD ID ;$Z2050 ;escape codes.2060 CURU LDA CY ;cursor up one line2070 BEQ CURU12080 SEC2090 SBC}C #12100 STA CY2110 CURU1 RTS2120 ;2130 ; cursor down one line2140 CURD LDA CY2150 CMP #232160 BEQ CURD12170 CLCD}2180 ADC #12190 STA CY2200 CURD1 RTS2210 ;2220 ; cursor right one character2230 CURR LDX CX2240 INX2250 CMP MARGINE}2260 BEQ CURR12270 STX CX2280 CURR1 RTS2290 ;2300 ; cursor left one character2310 CURL LDA CX2320 BEQ CURL12330 SF}EC2340 SBC #12350 STA CX2360 CURL1 RTS2370 ;2380 ; home cursor to (0,0)2390 HOME LDA #02400 STA CX2410 STA CY242G}0 RTS2430 ;2440 ;direct cursor addressing2450 DCA LDY #DCA1/256 ;takes more arguements so needs to snarf next character2H}460 LDX #DCA1&$FF2470 JMP SETVID2480 ;2490 DCA1 SEC ;character is new Y + 32.2500 SBC #322510 CMP #242520 BCC DCA1I}Q2530 LDA #232540 DCA1Q STA CY2550 LDY #DCA2/256 ;snarf one more character (x)2560 LDX #DCA2&$FF2570 JMP SETVID2580J} ;2590 DCA2 SEC ;character is X + 32.2600 SBC #322610 CMP MARGIN2620 BCC DCA2Q2630 LDA MARGIN2640 SBC #1 ;carry muK}st be set2650 DCA2Q STA CX2660 JMP ENDIT ;back to normal mode2670 ;2680 ;send VT-52 i.d. code2690 ID LDA #27 ;esc2700 L} JSR PUTR2710 LDA #47 ;/2720 JSR PUTR2730 LDA #90 ;Z2740 JMP PUTR2750 ;2760 ; clear (X,Y) to (79,23)2770 CEOS LDY M}CY2780 LDX #02790 INY2800 CEOS1 CPY #24 ;off screen?2810 BEQ CEOL ;yes, so clear to end of line cursor is on2820 JSRN} CLINE2830 INY2840 JMP CEOS12850 ;2860 ; clear (X,Y) to (79,Y)2870 CEOL LDX CX2880 LDY CY2890 JMP CLINE2900 ;291O}0 ; control codes2920 ;2930 ; bell.2940 ; -- the R: device playes with the sound registers in funny ways, especially at hiP}gh baud rates.2950 ; So, I've decided to make the bell a purely visual one -- flash backround. . . .2960 ; Sorry about thatQ}.2970 BEL LDA #152980 STA FLASH2990 RTS3000 ;3010 ;3020 ; back space3030 BS LDX CX3040 BNE BS23050 LDX MARGIN30R}60 LDY CY3070 BEQ BS23080 DEC CY3090 BS2 DEX3100 STX CX3110 RTS3120 ;3130 ; tab3140 TAB LDA CX3150 CLC3160 AS}DC #83170 CMP MARGIN3180 BCC TAB23190 ;ran over margin3200 LDA #03210 STA CX3220 LDA #803230 CMP MARGIN3240 BET}Q TAB13250 JMP LF3260 TAB2 AND #$F83270 STA CX3280 TAB1 RTS3290 ;3300 ;line feed3310 LF LDA CY3320 CMP #233330 BU}CS LF1 ;CY >= 233340 INC CY3350 LFQ RTS3360 LF1 JMP MOVEUP3370 ;3380 ;reverse line feed3390 RLF LDA CY3400 BEQ RLF1 V};CY == 03410 DEC CY3420 JMP LFQ3430 RLF1 JMP MOVEDN3440 ; clear screen3450 CLR LDY #233460 LDX #03470 CLR1 JSR CLINW}E3480 DEY3490 BNE CLR13500 JSR CLINE3510 JMP HOME3520 ;3530 ; car return -- some software thinks is should be treatX}ed (if VT-52) as CEOL, CR -- but I don't.3540 CR LDA TTYPE3550 CMP #1 ;VT-523560 BNE CR1 ;No.3570 ; -- uncomment for CEY}OL on VT-52 CR JSR CEOL ;Yes, so CEOL3580 CR1 LDA #03590 STA CX3600 RTS3610 ;3620 ;clear from x to 79 in line y.3630 Z}CLINE JMP LCLEAR3640 ADM3A CMP #323650 BCC ADMC3660 JMP GLASS3670 ; control character3680 ACTAB .WORD NOP ;^@3690 .W[}ORD NOP ;^A3700 .WORD NOP ;^B3710 .WORD NOP ;^C3720 .WORD NOP ;^D3730 .WORD NOP ;^E3740 .WORD NOP ;^F3750 .WORD B\}EL ;^G3760 .WORD BS ;^H3770 .WORD NOP ;^I3780 .WORD LF ;^J3790 .WORD CURU;^K3800 .WORD CURR;^L3810 .WORD CR ;^]}M3820 .WORD NOP ;^N3830 .WORD NOP ;^O3840 .WORD NOP ;^P3850 .WORD NOP ;^Q3860 .WORD NOP ;^R3870 .WORD NOP ;^S388^}0 .WORD NOP ;^T3890 .WORD NOP ;^U3900 .WORD NOP ;^V3910 .WORD NOP ;^W3920 .WORD NOP ;^X3930 .WORD NOP ;^Y3940 .W_}ORD CLR ;^Z3950 .WORD AESC;^[3960 .WORD NOP ;^\3970 .WORD NOP ;^]3980 .WORD HOME;^^3990 .WORD NOP ;^_4000 ;4010 ;`} cursor addressing =4020 AESC LDX #AESC1&$FF4030 LDY #AESC1/2564040 JMP SETVID4050 ;4060 AESC1 CMP #6a}1 ;=4070 BEQ AESC24080 JMP ENDIT4090 ;4100 AESC2 JMP DCA ;like vt524110 ; ADM-3A control characters (like glassc, onlyb} a different dispatch table).4120 ADMC ASL A4130 TAY4140 LDA ACTAB,Y4150 STA JPL4160 LDA ACTAB+1,Y4170 STA JPH418c}0 JMP (JPL)4190 .OPT LIST ;last used byten 2.0 TTY Emulator30 ; (c) 1981 John Howard Palevich40 ;TPUT--video drivers -10 TAPE=0 ;0=24K disk,1=16K tape20 ;Chameleon 2.0 CRT TTY Emulator30 ; (C) 1981 John Howard Palevich40 ; Menu module50 ;Te}his module lets the user select60 ;various options from a full page70 ;menu, then opens the R: device,80 ;notifies the SOPf} and PUT modules,90 ;and opens the up/down/dump file.0100 ;NOTE that the cassette is treated0110 ;specially, and that S,E,g} and K0120 ;are forbidden! Opening&Closing0130 ;the R device are entry points.0140 .OPT NOLIST0150 ORG = TAPE*$E000+$300q}+B'DOS SYSB*+DUP SYSBUTVBL B@TBEG BJTPUT BodTMEN BMTSOP B)LIZARD B>7TTY B-uTHEL BAUTORUN SYSCDISKNAMEDATCDISKNAMEDATCDISKNAMEDATBDISKNAMEDAT00160 MENORG = ORG+$1B000170 BEGORG = ORG+$18000180 PUTR = BEGORG+30190 GETR = BEGORG+60200 GETK = BEGORG+90210 ECIOV =r} BEGORG+120220 PUTORG = ORG+$2C000230 PUTNEW = PUTORG+30240 VBLORG = ORG+$27000250 STATLN = VBLORG+180260 GETC = VBLORG+s}210270 SOPORG = ORG+$22000280 SOPNEW = SOPORG+30290 MBUF = ORG+$10000300 MLEN = $3FF0310 ;zero page0320 POKMSK = $1003t}30 BRKKEY = $110340 JIFFY = $140350 DUPLEX = $E90360 ECPLEX = $EA0370 MENFLG = $EB0380 TEMPX = $C00390 TEMPY = $C10400u} SOUFLG = $E80410 ;os variables0420 PACTL = $D3020430 POKEY = $D2000440 SEROUT = POKEY+130450 IRQEN = POKEY+140460 SKSTv}AT = POKEY+150470 GETSW=BEGORG+150480 ANTIC = $D4000490 SDLSTL = $2300500 DLISTL = ANTIC+20510 SDLSTH = $2310520 DLISTHw} = ANTIC+30530 INVFLAG = $2B60540 SHFLOK = $2BE0550 MARGIN = $EC0560 EOL = $9B0570 BACKS = $7E0580 TWO = $60 ;rs-232c ix}cob0590 FILE = $70 ;file iocb0600 CIOV = $E4560610 OPEN = 30620 GETREC = 50630 GETCHR = 70640 PUTREC = 90650 PUTCHR = y}$B0660 CLOSE = 120670 ICCOM=$3420680 ICBAL=$3440690 ICBAH=$3450700 ICBLL=$3480710 ICBLH=$3490720 ICAX1=$34A0730 ICAX2z}=$34B0740 *=MENORG0750 JMP MENIN0760 JMP MENU0770 JMP OPENR0780 JMP CLOSER0790 ;menu disp list (can't cross 1K)08{}00 TEXTD .BYTE $70,$70,$700810 .BYTE $46,TEXT&$FF,TEXT/2560820 .BYTE $70,6,$70,6,$70,6,$70,60830 .BYTE $70,6,$70,6,$70,|}6,$70,60840 .BYTE $70,6,$70,6,$70,60850 .BYTE $41,TEXTD&$FF,TEXTD/2560860 ;menu text (can't cross 4K)0870 TEXT .BYTE " }} CRT TYPE 123456789"0880 .BYTE " INPUT PARITY 56789"0890 .BYTE " OUTPUT PARITY 6789"0900 .BYTE " BAUD RATE 23456789"~}0910 .BYTE " DUPLEX 90123456789"0920 .BYTE " ECHOPLEX 123456789"0930 .BYTE " MARGINS 0123456789"0940 .BYTE " F D1}:ABCDEFGH.IJK "0950 .BYTE " TRANSLATION 456789"0960 .BYTE " FTP 67890123456789"0970 .BYTE " USE OPTION & SELECT"0980} .BYTE " THEN START TO GO ON"0990 SAVED .WORD 01000 ;file name buffer1010 FNAME *=*+161020 ;default file name (printer)}1030 DFAULT .BYTE "P:",EOL1040 ;file name offset1050 FNOFF = 41060 ;1070 ;data for menu selections1080 LINES .WORD L1,L2},L3,L4,L5,L6,L71090 .WORD 0,L9,L101100 ;menu data base ::=1110 ; 1120 ; 1130 ; 1140 ; 1150 ; 1160 ; } etc.1170 ;tty type1180 L1 .BYTE 0,0,4,111190 .BYTE "GLASS TTY",EOL1200 .BYTE "VT-52",EOL1210 .BYTE "ADM-3A",EOL1220} .BYTE "TEST",EOL1230 ;input parity1240 L2 .BYTE 0,0,4,151250 .BYTE "NONE",EOL1260 .BYTE "ODD",EOL1270 .BYTE "EVEN",}EOL1280 .BYTE "OFF",EOL1290 ;output parity1300 L3 .BYTE 0,0,4,161310 .BYTE "NONE",EOL1320 .BYTE "ODD",EOL1330 .BYTE} "EVEN",EOL1340 .BYTE "ON",EOL1350 ;baud rate1360 L4 .BYTE 0,4,11,121370 .BYTE "75",EOL,"110",EOL1380 .BYTE "134.5",E}OL1390 .BYTE "150",EOL,"300",EOL1400 .BYTE "600",EOL,"1200",EOL1410 .BYTE "1800",EOL,"2400",EOL1420 .BYTE "4800",EOL,}"9600",EOL1430 ;duplex1440 L5 .BYTE 0,1,4,91450 .BYTE "NONE",EOL1460 .BYTE "FULL",EOL1470 .BYTE "LOCAL",EOL1480 .BY}TE "HALF",EOL1490 ;echoplex1500 L6 .BYTE 0,1,4,111510 .BYTE "NONE",EOL1520 .BYTE "FULL",EOL1530 .BYTE "REMOTE",EOL15}40 .BYTE "HALF",EOL1550 ;margins1560 L7 .BYTE 0,1,2,101570 .BYTE "FORTY",EOL1580 .BYTE "EIGHTY",EOL1590 ;translation}1600 L9 .BYTE 0,1,2,141610 .BYTE "NONE",EOL1620 .BYTE "CR=EOL",EOL1630 ;^s^q1640 L10 .BYTE 0,0,4,61650 .BYTE "DISABLE}D",EOL1660 .BYTE "UPLOAD",EOL1670 .BYTE "DOWNLOAD",EOL1680 .BYTE "SCREEN DUMP",EOL1690 ;menu equates1700 LASTLN = 10}1710 ;rs-232c device file name1720 RS .BYTE "R1:",EOL1730 ;menu init (called once)1740 MENIN LDX #01750 STA SAVELN1760 }MENILP TXA1770 ASL A1780 TAY1790 LDA LINES,Y1800 STA TEMPX1810 LDA LINES+1,Y1820 STA TEMPY1830 LDY #11840 LDA} (TEMPX),Y1850 DEY1860 STA (TEMPX),Y1870 INX1880 CPX #LASTLN1890 BCC MENILP1900 ;convert menu to internal1910 ;fo}rmat. . . .1920 LDA #239 ;end of screen1930 STA LINE ;poor use of temp1940 MENI3 LDX LINE1950 LDA TEXT,X1960 JSR AST}OIN1970 ORA #$C0 ;color PF 31980 LDX LINE1990 STA TEXT,X2000 DEC LINE2010 CPX #02020 BNE MENI32030 ;init fname2}040 LDX #02050 MENIFN LDA DFAULT,X2060 STA FNAME,X2070 INX2080 CMP #EOL2090 BNE MENIFN2100 LDA #02110 STA MENFL}G2120 STA DUPLEX2130 STA ECPLEX2140 RTS2150 ;main menu2160 LINE .BYTE 02170 THISLN .BYTE 02180 SAVELN .BYTE 02190 }MAGICLN = 72200 MENU LDA #12210 STA MENFLG2220 JSR CLOSER2230 LDX #FILE2240 LDA #CLOSE2250 STA ICCOM,X2260 JSR C}IOV2270 LDA SDLSTL2280 STA SAVED2290 LDA SDLSTH2300 STA SAVED+12310 LDA #TEXTD&$FF2320 STA SDLSTL2330 LDA #TEXT}D/2562340 STA SDLSTH2350 LDA #02360 STA LINE2370 LDA SAVELN2380 STA THISLN2390 INLP JSR UPDATE2400 INC LINE2410} LDA LINE2420 CMP #LASTLN2430 BCC INLP2440 ;main menu loop2450 MENLP LDA THISLN2460 STA LINE2470 JSR UPDATE2480 }JSR DEBOUN2490 MENLP1 JSR GETSW2500 CMP #72510 BEQ MENLP12520 CMP #62530 BNE MEN12540 JSR DEBOUN2550 JMP MENUQ ;}start so exit2560 MEN1 CMP #52570 BNE MEN52580 ;select pressed2590 LDA THISLN2600 CMP #MAGICLN2610 BNE MEN82620 J}MP GETFN ;selected File Name2630 MEN8 LDA SKSTAT2640 AND #82650 BEQ MEN2 ;shift-select2660 ;inc2670 LDY #02680 LDA }(TEMPX),Y2690 CLC2700 ADC #12710 STA (TEMPX),Y2720 LDY #22730 CMP (TEMPX),Y2740 BCC MEN3 ;legal2750 LDA #0 ;ove}rflow, wrap around2760 TAY2770 STA (TEMPX),Y2780 MEN3 JMP MENLP2790 ;dec2800 MEN2 LDY #02810 LDA (TEMPX),Y2820 BNE} MEN4 ;legal2830 LDY #2 ;underflow, wrap around2840 LDA (TEMPX),Y2850 LDY #02860 MEN4 SEC2870 SBC #12880 STA (TEMP}X),Y2890 JMP MENLP2900 MEN5 CMP #32910 BNE MENLP ;not anything2920 ;option pressed2930 LDA SKSTAT2940 AND #82950 }BEQ MEN6 ;shift down2960 ;down one line2970 INC THISLN2980 LDA THISLN2990 CMP #LASTLN3000 BCC MEN73010 LDA #0 ;wra}p around3020 STA THISLN3030 JMP MEN73040 ;up one line3050 MEN6 LDX THISLN3060 BNE MEN103070 LDX #LASTLN3080 MEN10 }DEX3090 STX THISLN3100 MEN7 JSR UPDATE3110 JMP MENLP3120 ;input file name3130 GETFN LDA SHFLOK3140 PHA3150 LDA INV}FLAG3160 PHA3170 GETFNR LDA #FNOFF3180 STA CURSOR3190 LDA #03200 STA SCOUNT3210 GETFN1 LDY CURSOR3220 LDA #$BF32}30 STA (DUPLEX),Y3240 LDA #$403250 STA SHFLOK3260 LDA #03270 STA INVFLAG3280 JSR GETK3290 CMP #127 ;del3300 BE}Q GETFNB3310 CMP #13 ;c/r3320 BEQ GETFNE3330 CMP #323340 BCC GETFN13350 CMP #963360 BCC GETFN23370 SEC3380 SB}C #323390 JMP GETFN23400 GETFNB LDY CURSOR3410 LDA #03420 STA (DUPLEX),Y3430 DEC CURSOR3440 DEC SCOUNT3450 LDA S}COUNT3460 CMP #$FF3470 BNE GETFN13480 JMP GETFNR3490 GETFN2 LDY SCOUNT3500 STA FNAME,Y3510 JSR UPCHAR3520 INC SC}OUNT3530 LDA CURSOR3540 CMP #203550 BCC GETFN13560 DEC CURSOR3570 DEC SCOUNT3580 JMP GETFN13590 ;handle eol3600} GETFNE LDY SCOUNT3610 LDA #EOL3620 STA FNAME,Y3630 LDY CURSOR3640 LDA #03650 STA (DUPLEX),Y3660 PLA3670 STA IN}VFLAG3680 PLA3690 STA SHFLOK3700 JMP MENLP3710 ;table to not have to *203720 OFTAB .WORD TEXT3730 .WORD 20+TEXT,40+}TEXT,60+TEXT3740 .WORD 80+TEXT,100+TEXT,120+TEXT3750 .WORD 140+TEXT,160+TEXT3760 .WORD 180+TEXT,200+TEXT3770 .WORD 22}0+TEXT3780 ;cursor x position3790 CURSOR .BYTE 03800 ;charc moves name to screen3810 CHARC .BYTE 03820 ;scount used to f}ind right name3830 SCOUNT .BYTE 03840 ;update line of menu3850 UPDATE LDA LINE3860 ASL A3870 TAY3880 LDA LINES,Y389}0 STA TEMPX3900 LDA LINES+1,Y3910 STA TEMPY3920 LDA OFTAB,Y3930 STA DUPLEX3940 LDA OFTAB+1,Y3950 STA ECPLEX3960} LDA #03970 STA CURSOR3980 LDA LINE3990 CMP THISLN4000 BEQ UP14010 LDA #324020 JSR UPCHAR4030 LDA #324040 JS}R UPCHAR4050 JMP UP24060 UP1 LDA #$AD4070 JSR UPCHAR4080 LDA #$BE4090 JSR UPCHAR4100 UP2 LDA LINE4110 CMP #MAGICL}N4120 BNE UP34130 ;put file name to screen4140 LDA #FNOFF4150 STA CURSOR4160 LDA #04170 STA SCOUNT4180 UPFN1 LDY }SCOUNT4190 LDA FNAME,Y4200 CMP #EOL4210 BEQ UPFN24220 JSR UPCHAR4230 INC SCOUNT4240 JMP UPFN14250 UPFN2 JMP UP8}4260 UP3 LDY #34270 LDA (TEMPX),Y ;get tab4280 STA CURSOR4290 LDY #04300 LDA (TEMPX),Y4310 STA SCOUNT4320 LDY #4}4330 UP4 LDA SCOUNT4340 BEQ UP6 ;found item4350 UP5 LDA (TEMPX),Y ;char4360 INY4370 CMP #EOL4380 BNE UP54390 DEC S}COUNT4400 JMP UP44410 ;found word, put to screen4420 UP6 TYA4430 STA CHARC4440 UP7 LDY CHARC4450 INC CHARC4460 LDA} (TEMPX),Y4470 CMP #EOL4480 BEQ UP84490 JSR UPCHAR ;put on screen4500 JMP UP74510 ;now blank rest of line4520 UP8 L}DA CURSOR4530 CMP #20 ;hit eol?4540 BEQ UP94550 LDA #$204560 JSR UPCHAR ;put blank4570 JMP UP84580 UP9 RTS4590 ;a}stoin converts A to internal4600 ;fries X4610 ASTOIN PHA4620 AND #$60 ;6,54630 LSR A ;5,44640 LSR A ;4,34650 LSR A };3,24660 LSR A ;2,14670 LSR A ;1,04680 TAX4690 PLA4700 AND #$9F ;zero 6,54710 ORA TDEX,X4720 RTS4730 ;upchar p}uts A on screen,4740 ;updates cursor4750 UPCHAR JSR ASTOIN4760 LDY CURSOR4770 INC CURSOR4780 STA (DUPLEX),Y4790 RTS}4800 ;tdex has the f'ing scrambled4810 ;bits to convert ascii to4820 ;screen internal format4830 TDEX .BYTE $40,$00,$20,$}604840 ;debounce console switches4850 ;--Waits 1/30th sec after no4860 ;keys are pressed4870 DEBOUN JSR GETSW4880 CMP #}74890 BNE DEBOUN4900 LDA #24910 CLC4920 ADC JIFFY4930 DEBOUL CMP JIFFY4940 BNE DEBOUL4950 RTS4960 ;menu clean-u}p and quit4970 ;routine4980 ;direction to open file io4990 DIRTAB .BYTE 0,4,8,85000 ;direction of first block5010 ;to/fr}om C: device.5020 CDIRTB .BYTE 0,GETCHR,PUTCHR,PUTCHR5030 ;bad file name message5040 BADMSG .BYTE "CAN'T OPEN IO FILE:#"5}050 GOODMS .BYTE " NO ERRORS IN SETUP "5060 ;5070 MENUQ LDA THISLN5080 STA SAVELN5090 LDA SAVED5100 STA SDLSTL5110 }STA DLISTL5120 LDA SAVED+15130 STA SDLSTH5140 STA DLISTH5150 ;hack tty type5160 LDA L15170 JSR PUTNEW5180 ;set du}plex and echoplex5190 LDA L5 ;duplex5200 CLC5210 ROR A5220 ROR A5230 ROR A5240 STA DUPLEX5250 LDA L6 ;echoplex}5260 CLC5270 ROR A5280 ROR A5290 ROR A5300 STA ECPLEX5310 ;set margins5320 LDX #405330 LDA L75340 BEQ MENUQ1}5350 LDX #805360 MENUQ1 STX MARGIN5370 LDA L105380 PHA5390 LDX L95400 JSR SOPNEW5410 PLA5420 TAY5430 BEQ MENU}QQ5440 ;test file device for ones5450 ;that will fry chameleon5460 ;like E: S: K:5470 ;or ones that I don't know5480 ;ho}w to handle, like C:5490 LDX #05500 JMP MENUQT5510 ;table of bad devices5520 BADDEV .BYTE "KES",05530 MENUQT LDA BADDE}V,X5540 BEQ MENUQG5550 INX5560 CMP FNAME5570 BNE MENUQT5580 TAY5590 JMP MENUQB5600 ;check for cassette opened fo}r5610 ;not-upload5620 ;open file named in menu5630 MENUQG LDX #FILE5640 LDA DIRTAB,Y5650 STA ICAX1,X5660 LDA #OPEN5}670 STA ICCOM,X5680 LDA #FNAME&$FF5690 STA ICBAL,X5700 LDA #FNAME/2565710 STA ICBAH,X5720 LDA #05730 STA ICAX2,X}5740 LDA #1 ;set sound flag5750 STA SOUFLG ;cause C: feeps5760 JSR CIOV5770 LDA #0 ;reset sound flag5780 STA SOUFLG} ;after open5790 CPY #1285800 BCS MENUQB5810 ;good open, now see if C:5820 LDA FNAME5830 CMP #$435840 BNE MENUQQ ;}nope5850 ;yep, read/write block of 0s5860 LDA #1285870 STA SCOUNT5880 MENQ3 LDY L105890 LDA CDIRTB,Y5900 STA ICCOM,}X5910 LDA #05920 STA ICBLL,X ;get/put char5930 STA ICBLH,X ;to/from A5940 ;just in case of put, A5950 ;has a EOL in i}t.5960 LDA #EOL5970 JSR CIOV5980 BMI MENUQB ;error, die5990 DEC SCOUNT6000 BNE MENQ36010 ;well, menuq was successf}ul6020 MENUQQ LDX #GOODMS&$FF6030 LDY #GOODMS/2566040 JSR STATLN6050 JMP MENUQF6060 ;couldn't open file6070 MENUQB S}TY BADMSG+196080 LDX #BADMSG&$FF6090 LDY #BADMSG/2566100 JSR STATLN6110 LDA #06120 JSR SOPNEW6130 MENUQF LDA #061}40 STA MENFLG6150 ;fall through to openr6160 ;open rs-232c so OS is happy6170 OPENR SEI6180 ;disable break key6190 LDA} #$7F6200 AND POKMSK6210 STA POKMSK6220 STA IRQEN6230 ;clear break flag6240 LDA #$806250 STA BRKKEY6260 CLI6270} LDX #TWO6280 LDA #OPEN6290 STA ICCOM,X6300 LDA #RS&$FF6310 STA ICBAL,X6320 LDA #RS/2566330 STA ICBAH,X6340 LD}A #136350 STA ICAX1,X6360 LDA #06370 STA ICAX2,X6380 JSR ECIOV6390 ;now set parity6400 LDA L26410 ASL A6420 AS}L A6430 CLC6440 ADC L36450 ADC #32 ;no trans.6460 STA ICAX1,X6470 LDA #2556480 STA ICAX2,X6490 LDA #386500 ST}A ICCOM,X6510 JSR ECIOV6520 ;set baud rate6530 LDA L46540 CLC6550 ADC #46560 STA ICAX1,X6570 LDA #06580 STA IC}AX2,X6590 LDA #366600 STA ICCOM,X6610 JSR ECIOV6620 ;start concurent i/o6630 LDA #406640 STA ICCOM,X6650 LDA #MB}UF&$FF6660 STA ICBAL,X6670 LDA #MBUF/2566680 STA ICBAH,X6690 LDA #MLEN&$FF6700 STA ICBLL,X6710 LDA #MLEN/2566720} STA ICBLH,X6730 LDA #136740 STA ICAX1,X6750 JSR ECIOV6760 RTS6770 ;close rs232c6780 CLOSER LDX #TWO6790 LDA #CL}OSE6800 STA ICCOM,X6810 JSR CIOV6820 ;enable break key6830 SEI6840 LDA #$806850 ORA POKMSK6860 STA POKMSK6870 }STA IRQEN6880 CLI6890 RTS6900 .OPT LIST 2.0 CRT TTY Emulator30 ; (C) 1981 John Howard Palevich40 ; Menu module50 ;T.10 TAPE=0 ;0=24K disk,1=16K tape20 ;Chameleon 2.0 CRT TTY Emulator30 ; (C) 1981 Hackerjack Palevich40 ; Shift-option modul}e50 ;When luser in crt mode presses60 ;Shift-Option, up/down/dump to70 ;file via this module. This is80 ;done by dispatc}hing via SHOPT to90 ;UP, DOWN, or DUMP (or SONO if0100 ;ftp is disabled). If up/downing0110 ;doesn't work with your system},0120 ;this is the place to change.0130 ;If you have more than 16/24K0140 ;you ought to fiddle with BBEG0150 ;and BEND to} give you a larger0160 ;buffer space. BFUL should be0170 ;hacked to give you enough extra0180 ;space to store characters }sent0190 ;to you befor the host computer0200 ;sees the XOFF & stops sending0210 ;you characters. . . .0220 ;(eol) <--> (c}r,lf) translation0230 ;is done in UP and DOWN subrs.0240 ;Good Luck with your OS!0250 .OPT NOLIST0260 ORG = TAPE*$E000+$}30000270 MENORG = ORG+$1B000280 OPENR = MENORG+60290 CLOSER = MENORG+90300 BEGORG = ORG+$18000310 PUTR = BEGORG+30320 G}ETR = BEGORG+60330 GETK = BEGORG+90340 ECIOV = BEGORG+120350 VBLORG = ORG+$27000360 STATLN = VBLORG+180370 GETC = VBLORG}+210380 SOPORG = ORG+$22000390 PUTORG = ORG+$2C000400 PUTS = PUTORG+60410 MBUF = ORG+$10000420 MLEN = $3FF0430 ;zero pa}ge0440 JIFFY = $140450 DUPLEX = $E90460 BUFL = $ED0470 BUFH = $EE0480 BUF = BUFL0490 ;os variables0500 SKSTAT = $D20F}0510 CONSOL = $D01F0520 ANTIC = $D4000530 SDLSTL = $2300540 DLISTL = ANTIC+20550 SDLSTH = $2310560 DLISTH = ANTIC+30570} CH = $2FC0580 MARGIN = $EC0590 EOL = $9B0600 EOF = 1360610 BACKS = $7E0620 TWO = $60 ;rs-232c icob0630 FILE = $70 ;fil}e iocb0640 CIOV = $E4560650 OPEN = 30660 GETREC = 50670 GETCHR = 70680 PUTREC = 90690 PUTCHR = $B0700 CLOSE = 120710 }STATIS = 130720 ICCOM=$3420730 ICBAL=$3440740 ICBAH=$3450750 ICBLL=$3480760 ICBLH=$3490770 ICAX1=$34A0780 ICAX2=$34B0}790 LF = 100800 CR = 130810 XON = 17 ;^q0820 XOFF = 19 ;^s0830 *=SOPORG0840 JMP SOPIN0850 JMP SOPNEW0860 JMP SHOPT}0870 LINE .BYTE 00880 SCOUNT .BYTE 00890 TRANS .BYTE 00900 TIMOUT .BYTE 00910 BBEG *=*+300 ;300 char buffer0920 BFUL = }BBEG+200 ;full after 2000930 BEND = BBEG+299 ;last char0940 ;init sop module0950 SOPIN LDA #00960 STA SODISP0970 STA T}RANS0980 RTS0990 ;change shift option handler1000 ;to whats in A1010 SOPNEW ASL A1020 STA SODISP1030 STX TRANS1040 } RTS1050 SODISP .BYTE 01060 SOTAB .WORD SONO,UP,DOWN,DUMP1070 ;handle shift option1080 SHOPT LDY SODISP1090 LDA SOTAB,Y}1100 STA BUFL1110 LDA SOTAB+1,Y1120 STA BUFH1130 JMP (BUF)1140 ;no use for shift option1150 NOMSG .BYTE "PUNT;FTP I}S DISABLED"1160 SONO LDX #NOMSG&$FF1170 LDY #NOMSG/2561180 JMP STATLN1190 DUMPMS .BYTE "DUMPING SCREEN 4 YOU"1200 ;s-o} screen dump1210 DUMP JSR CLOSER1220 LDX #DUMPMS&$FF1230 LDY #DUMPMS/2561240 JSR STATLN1250 LDA #01260 STA LINE12}70 ;for each line1280 DUMP1 LDA #01290 STA SCOUNT1300 DUMPM1 LDX SCOUNT1310 CPX #801320 BEQ DUMPM21330 LDY LINE134}0 JSR GETC1350 LDX SCOUNT1360 STA BBEG,X1370 INC SCOUNT1380 JMP DUMPM11390 ;find last non-space1400 DUMPM2 LDX #79}1410 DUMP2 LDA BBEG,X1420 CMP #$201430 BNE DUMP31440 DEX1450 CPX #$FF1460 BNE DUMP21470 DUMP3 INX1480 LDA #EOL}1490 STA BBEG,X ;end of line1500 INX ;number of chars to write1510 TXA1520 ;A now has # of chars to save1530 LDX #FIL}E1540 STA ICBLL,X1550 LDA #01560 STA ICBLH,X1570 LDA #PUTREC1580 STA ICCOM,X1590 LDA #BBEG&$FF1600 STA ICBAL,X}1610 LDA #BBEG/2561620 STA ICBAH,X1630 JSR ICIOV1640 BCS DUMPQ ;error. quit.1650 ;so loop till screen saved1660 INC} LINE1670 LDA LINE1680 CMP #241690 BCC DUMP11700 ;done, so return1710 LDX #TTMSG&$FF1720 LDY #TTMSG/2561730 JSR }STATLN1740 DUMPQ JMP OPENR1750 ;iobuf1760 ICIOMS .BYTE "FILE I/O ERROR WAS:#"1770 ICIOV JSR CIOV1780 CPY #1281790 BCS} ICIOVE1800 RTS1810 ICIOVE STY ICIOMS+191820 LDA #CLOSE1830 STA ICCOM,X1840 JSR CIOV1850 LDX #ICIOMS&$FF1860 LDY} #ICIOMS/2561870 JSR STATLN1880 JSR SOPIN ;disable ftp.1890 SEC1900 RTS1910 ;download with xon-xoff protocol1920 FI}LMSG .BYTE "FILE I/O IN PROGRESS"1930 DOMSG .BYTE "TYPE ANY KEY TO STOP"1940 PAKMSG .BYTE "TYPE CHAR TO SEND..."1950 TTMSG} .BYTE "QUITTING TO TTY MODE"1960 DOWN LDX #PAKMSG&$FF1970 LDY #PAKMSG/2561980 JSR STATLN1990 LDA CH2000 CMP #25520}10 BEQ DOWN2020 JSR GETK2030 JSR PUTR2040 DOBLP LDA #BBEG/2562050 STA BUFH2060 LDA #BBEG&$FF2070 STA BUFL2080 L}DX #DOMSG&$FF2090 LDY #DOMSG/2562100 JSR STATLN2110 DOLP LDA CH2120 CMP #2552130 BEQ DO12140 ;user aborted2150 JS}R FLUSH2160 LDX #TTMSG&$FF2170 LDY #TTMSG/2562180 JMP STATLN2190 DO1 JSR CAPR2200 LDA BUFH2210 CMP #BFUL/2562220 } BCC DOLP2230 BNE DO22240 LDA BUFL2250 CMP #BFUL&$FF2260 BCC DOLP2270 ;buffer full -- send xoff2280 DO2 LDA #XOFF2}290 JSR PUTR2300 DOW LDA JIFFY2310 CLC2320 ADC #602330 STA TIMOUT2340 ;wait a second2350 DOW2 LDA JIFFY2360 CMP T}IMOUT2370 BEQ DO32380 JSR CAPR2390 BCS DOW ;got a character2400 JMP DOW22410 ;flush buffer and send xon2420 DO3 JSR} FLUSH2430 PHP2440 LDA #XON2450 JSR PUTR2460 PLP2470 BCC DOBLP2480 ;error in flushing2490 RTS2500 ;flush -- clo}se rs-232, write2510 ; buffer, open rs-232, return2520 ; carry clear if no error.2530 FLUSH JSR SETFIO2540 LDX #FILE255}0 LDA #PUTCHR2560 STA ICCOM,X2570 LDA #BBEG&$FF2580 STA ICBAL,X2590 LDA #BBEG/2562600 STA ICBAH,X2610 SEC2620 }LDA BUFL2630 SBC #BBEG&$FF2640 STA ICBLL,X2650 LDA BUFH2660 SBC #BBEG/2562670 STA ICBLH,X2680 JSR ICIOV2690 PHP }2700 JSR OPENR2710 PLP2720 RTS2730 ;setfio sets up for file i/o2740 ; by closing rs-232c & sending2750 ; message276 }0 SETFIO JSR CLOSER2770 LDX #FILMSG&$FF2780 LDY #FILMSG/2562790 JMP STATLN2800 ;capr captures rs232c to buffer,2810 ; } performing cr,lf->eol trans.2820 CAPR JSR QR2830 BNE CAPR1 ;chars in buffer2840 CLC2850 RTS2860 CAPR1 JSR GETR2870  } PHA2880 JSR PUTS2890 PLA2900 LDX TRANS2910 BEQ CAPR3 ;no translation2920 ;translate the darn thing2930 CMP #CR29 }40 BNE CAPR102950 LDA #EOL2960 JMP CAPR32970 CAPR10 CMP #LF2980 BNE CAPR32990 CLC3000 RTS ;ignore line feeds (tsk})3010 ;check if the buffer overflowed3020 CAPR3 TAX3030 LDA BUFH3040 CMP #BEND/2563050 BCC CAPR43060 BNE CAPR53070} LDA BUFL3080 CMP #BEND&$FF3090 BCC CAPR43100 BNE CAPR53110 CAPR4 TXA3120 LDY #03130 STA (BUF),Y3140 INC BUFL3}150 BCC CAPR23160 INC BUFH3170 CAPR2 SEC3180 RTS3190 ; buffer overflowed3200 BOFMSG .BYTE "DA BUFFER OVERFLOWED"3210} CAPR5 LDX #BOFMSG&$FF3220 LDY #BOFMSG/2563230 JMP STATLN3240 ENDL .BYTE 03250 ENDH .BYTE 03260 UPMSG .BYTE " TYPE KE}Y TO ABORT "3270 WMSG .BYTE " WAITING FOR AN XON "3280 ;upload file to remote computer3290 EOFFLG .BYTE 03300 UP LDA #03}310 STA EOFFLG3320 UPLP JSR STUFF3330 BCC UP13340 BCS UPQ3350 ;quit uploading cause user said3360 UPQK LDX #TTMSG&$FF}3370 LDY #TTMSG/2563380 JSR STATLN3390 ;fall thru to upq3400 UPQ JMP SOPIN ;so no mo' ftp-ing3410 UP1 LDX #UPMSG&$FF3}420 LDY #UPMSG/2563430 JSR STATLN3440 LDA BUFH3450 CMP ENDH3460 BCC UP23470 BNE UPR3480 LDA BUFL3490 CMP ENDL}3500 BCC UP23510 UPR LDA JIFFY3520 CLC3530 ADC #240 ;lcd programing3540 ;wait so as to get possible XOFF3550 ;and so }lasc char clears3560 UPW CMP JIFFY3570 BNE UPW3580 JSR PROC3590 BCS UPQ3600 JMP UPLP3610 UP2 LDA CH3620 CMP #255}3630 BNE UPQK3640 JSR PROC3650 BCS UPQK3660 LDY #03670 LDA (BUF),Y3680 LDX TRANS3690 BEQ UP33700 CMP #EOL3710} BNE UP33720 LDA #CR ;eol to cr3730 UP3 PHA3740 BIT DUPLEX3750 BPL UP4 ;full - don't echo3760 JSR PUTS ;half - do e}cho3770 UP4 PLA3780 JSR PUTR3790 INC BUFL3800 BNE UP13810 INC BUFH3820 JMP UP13830 ;handle XON/XOFF3840 ;carry s}et if aborted3850 PROC JSR QR3860 BNE PROC13870 CLC3880 RTS3890 ;there are chars waiting3900 ;process them3910 PROC}1 JSR GR3920 CMP #XOFF3930 BNE PROC3940 ; xoff sent. wait for abort or3950 ; xon3960 LDX #WMSG&$FF3970 LDY #WMSG/25}63980 JSR STATLN3990 PROCW LDA CH4000 CMP #2554010 BEQ PROCW14020 SEC4030 RTS4040 PROCW1 JSR QR4050 BEQ PROCW4}060 JSR GR4070 CMP #XON4080 BNE PROCW4090 LDX #UPMSG&$FF4100 LDY #UPMSG/2564110 JSR STATLN4120 JMP PROC4130 ;qu}erry rs-232c port4140 QR LDX #TWO4150 LDA #STATIS4160 STA ICCOM,X4170 JSR CIOV4180 LDA 7474190 CMP 7484200 RTS4 }210 ;get rs-232c character4220 GR JSR GETR4230 PHA4240 JSR PUTS4250 PLA4260 RTS4270 ;stuff buffer from file4280 ;c!}arry set if eof/error4290 STUFF JSR SETFIO4300 LDX #FILE4310 LDA #GETCHR4320 STA ICCOM,X4330 LDA #BBEG&$FF4340 STA"} ICBAL,X4350 LDA #BBEG/2564360 STA ICBAH,X4370 LDA #BEND-BBEG&$FF4380 STA ICBLL,X4390 LDA #BEND-BBEG/2564400 STA #}ICBLH,X4410 JSR CIOV4420 BPL STUFFG ;no error4430 CPY #EOF4440 BEQ STUFFX ;or EOF4450 STY ICIOMS+194460 LDX #ICIO$}MS&$FF4470 LDY #ICIOMS/2564480 JSR STATLN4490 STUFFE JSR OPENR4500 SEC4510 RTS4520 ;first eof%}4530 ;is O.K. others are not.4540 STUFFX LDA EOFFLG4550 BNE STUFX14560 STY EOFFLG4570 JMP STUFFG4580 STUFX1 LDX #TTM&}SG&$FF4590 LDY #TTMSG/2564600 JSR STATLN4610 JMP STUFFE4620 STUFFG CLC4630 LDA #BBEG&$FF4640 STA BUFL4650 ADC IC'}BLL,X4660 STA ENDL4670 LDA #BBEG/2564680 STA BUFH4690 ADC ICBLH,X4700 STA ENDH4710 JSR OPENR4720 CLC4730 RTS(}4740 .OPT LIST disk,1=16K tape20 ;Chameleon 2.0 CRT TTY Emulator30 ; (C) 1981 Hackerjack Palevich40 ; Shift-option modulPQBEGBEGENDENDGETCHICOBICCOICSTICBAICBAICBLICBLBBLBLDUMMYVAJJAVAU@f*}AU@@AHAP AQ AR AS AV AWAv@0+}A""(C) 1981 Hackerjack Palevich LOADS TTY INTO RAMTHEN RUNS IT. A 6-AV`( ,}( (((;($If the computer stalls at this point`( Re-boot the system and try again-@A - @@-}-@@R:A@c+# @P(N*("}Couldn't open the RS-232C device.N(.}Maybe you forgot to turn on the)++(#850 before you turned on the Atari?,$$(You need an 850, DOS II, and-M(( AUTORU/}N.SYS to use this program.M( See the manual for more details./2@6(O.K. Wait a sec.<: @a00}@@D:TTY: @f=(Couldn't open D:TTYB A F)@)@P)@1})@T1!"AU*"AU@1concatinationU (Z)@)@_ (`(u2}-@x))6-@$%@$@%@6-%@6-%@6-%@6-%@6-3}%@6-%@ 6-$%&+$%,%@6-P:',6-&$set up ciov call   4}  36-?:C:hhhLV,<@,3" @@++(#Hold your breath '5}cause here we go!@A6-+6-@$@%@A$4200 is init point6-?:$%,,,(6}$}Chameleon 1.0 Basic & DOS II Loader&&( (c) 1981 Hackerjack Palevich$ D:LIZARD2VAU@fcB_D }B0DE }B1EF }B2FG }B3GBGBGBGBGD0B1!"8}LH|B****)|B)B`@ `0  `0000`6lpppB0ABXOFF< BNE PROCF# ; xoff se"9}nt. wait for abort orP ; xonZ LDX #WMSG&$FFd LDY #WMSG/256n JSR STATLNx PROCW LDA CH CMP #255 BEQ":} PROCW1 SEC RTS PROCW1 JSR QR BEQ PROCW JSR GR CMP #XON BNE PROCW LDX #UPMSG&$FF ";}LDY #UPMSG/256| Chameleon TTY Emulator Version 2.0 || (C) 1981 John Howard Pa"<}levich || invokes selected FTP || moves to menu screen || toggles cursor lo"=}ck || displays previous page || rolls screen left || rolls screen right ">} || To get : type | To get : type || ` : CTRL-. | @ : CTRL-, || ~ :CTRL-back| \ : CTRL- || "?} { : CTRL-; | ] : CTRL- || } : clear | ^ : CTRL- || RUBOUT : back s | _ : CTRL- ||"@}󠰮|| When viewing the Menu Screen: || ԭ moves up one line || "A} moves down one line|| ԭ decrements the item || increments the item || "B}quits to CRT TTY page || Use , Backs & Return to edit fname| STA BUFL  ADC IC"C}BLL,X STA ENDL  LDA #BBEG/256*LHLILZLYLZLZLZL=[P@0 p`P@0 p`P@0 p`00001112223334445555666777888999::::;;;<<<===>"c}>>pp`BBBBBBBBBBBBBBBBBBBBBBBBAxW"d}X XWHW׽W֩P0x0W1ʍoXXXé \ȍЩ*"e}/?<ԩX{W~|WW}WY`~BBBB~BB< @@ @@pBL_X H)"f}XE }[XL8YXX H)XX H))( L2YʎXLRY X8X0 ( XLRYοXXXXXWWm"g}XWyHWWHݥ8X( i.ТLY.ТLYɍТLYYY?YX kmYLY imYY Y m"h}YYX?άYL_HWHWWhWh`HZZ OZWHWW0hWhZZ`=ZHih OZ=Z`HWWֹHW׊"i}Ph`H ZHWWֹHW׊hh`HZZ OZ.WHWWhWhZZ`ZH)`JJJJJh)ZZ`@ `"j}քH ZZF{WӍ|WZ}WY&([) \h֤`H{W~|WW}WYh`WWֹHW׊H)`JJJJJh)_["k}` @`OFFON CURSOR LOCK XXX XI Xc[u[ʈi[LW"l}L\L\l0\0\^7\`\ \̽ \ͭ\` Lp\ W` ^L]` "m}W`PL]` \߹\l\\\\\\\]]]]\]^\\\\\\\\\\\\\\\\\\`\`\τ͆`AL"n}\[8A ]߹]0\ \l\ \̽ \`7]A]M]W]\\\a]]]]\\\\\\\\\\\\\h]]8`i`"o}`8``]oL\8 ]L\8 L\ H/ HZLH ^L]L^`ʆ`"p}i PL])``L WL]LW ^ ^La]\`LW TLM\\\\\\\\]]\]7]M]^\\\\\"q}\\\\\\\]e^\\a]\l^L\=L\Lh] %^߹&^l"r}"s}"t}3GBGBGBGBGD0B1! =10 TAPE = 020 ;Chameleon 2.0 TTY Emulator30 ; (c) 1981 Hackerjack Palevich40 ;THEL -- instruction page,char set50 ;and,&v} optionally, boot tape.60 ;This cluster is where the program70 ;starts. It relocates the instruc-80 ;tion page (which is i&w}n the ram90 ;where the character set goes) to0100 ;the 1st screen of the tty dis-0110 ;play, moves the Atari defs down012&x}0 ;to the RAM character set,rede-0130 ;fines the l-brace,r-brace,tilda0140 ;and grave-accent mark to ascii0150 ;standards,&y} displays the screen0160 ;until the user types a space0170 ;then jumps to the beginning0180 ;of the main loop.0190 .OPT &z}NOLIST0200 ORG=TAPE * $E000 + $30000210 ;on this all things depend0220 MSCR=ORG0230 MCHR = ORG+$1400 ;RAM char set0240 B&{}EGIN = ORG+$1800 ;start of TBEG0250 CHAR = $E000 ; ROM character set0260 ;system display list pointer0270 SDLSTL = $23002&|}80 SDLSTH = $2310290 ;start of this,the Hello cluster0300 HELORG = ORG+$12000310 ;OS character definition pointer0320 CHB&}}AS = $2F40330 CH=$2FC ; RAW keyboard data0340 *=HELORG ; Here we go!0350 ;this boot-tape code is assembled0360 ;only if &~}TAPE is one.0370 .IF TAPE-1@TAPE10380 ;dos vector is what DOS command0390 ; or no-ROM-PAC jumps thru.0400 DOSVEC = $A04&}10 .BYTE 0,60 ;60 128 byte blocks0420 .WORD HELORG ;load at helorg0430 .WORD INIT ;call init to init!0440 CLC0450 RT&}S ;no errors0460 INIT LDA #$3C ;stop C: motor0470 STA $D3020480 ;patch dos vector0490 LDA #RESTRT&$FF0500 STA DOSVEC&}0510 LDA #RESTRT/2560520 STA DOSVEC+10530 LDA #$200540 STA $6A ;ram top0550 RTS0560 ;non-tape code starts here0570&} ;0580 TAPE10590 RESTRT LDX #0 ; 256 times:0600 MOVLP LDA MCHR,X ; get hello screen character0610 JSR ASTOIN ;conver&}t to internal character0620 STA MSCR,X ;put on first page0630 LDA CHAR,X ; get ROM character data0640 STA MCHR,X ;put i&}n RAM character data0650 LDA MCHR+$100,X ;Do same for 2nd page0660 JSR ASTOIN0670 STA MSCR+$100,X0680 LDA CHAR+$100,X&}0690 STA MCHR+$100,X0700 LDA MCHR+$200,X ;Do same for 3rd0710 JSR ASTOIN0720 STA MSCR+$200,X0730 LDA CHAR+$200,X07&}40 STA MCHR+$200,X0750 LDA MCHR+$300,X0760 JSR ASTOIN0770 STA MSCR+$300,X ;and 4th page0780 LDA CHAR+$300,X0790 ST&}A MCHR+$300,X0800 INX0810 BNE MOVLP ;and do it 'till 0.0820 ; now re-define characters0830 LDX #70840 DEFLP LDA DF,X&}0850 STA MCHR+$300,X ;Back-quote0860 LDA DF+8,X0870 STA MCHR+$3D8,X ;L-brace0880 LDA DF+$10,X0890 STA MCHR+$3E8,X ;R&}-brace0900 LDA DF+$18,X0910 STA MCHR+$3F0,X ;Tilde0920 DEX0930 BPL DEFLP0940 ; now re-define character set.0950 LD&}A #MCHR/2560960 STA CHBAS0970 ; now set up display list0980 LDA #DLIST&$FF0990 STA SDLSTL1000 LDA #DLIST/2561010 S&}TA SDLSTH1020 ; now wait for the luser to press1030 ; the space bar.1040 WAIT LDA CH1050 CMP #$21 ;internal code for bar&}1060 BNE WAIT1070 LDA #$FF ;clear out space code1080 STA CH1090 JMP BEGIN ;and jump to TBEG1100 ;1110 ; ascii to in&}ternal1120 ; smashes X1130 ACHR .BYTE 01140 ASTOIN STA ACHR1150 ROL A ;isolate b6-b5 -> b1-b01160 ROL A1170 ROL A11&}80 ROL A1190 AND #31200 TAY1210 LDA ACHR1220 AND #$9F1230 ORA ATAB,Y1240 RTS1250 ATAB .BYTE $40,0,$20,$601260 &}; character re-defs1270 ; grave accent ($60)96.1280 DF .BYTE $00 ;grave accent1290 .BYTE $00 ;1300 .BYTE $30 ;1310 .&}BYTE $18 ;1320 .BYTE $00 ;1330 .BYTE $00 ;1340 .BYTE $00 ;1350 .BYTE $00 ;1360 ;1370 .BYTE $06 ;l-brace1380 .BYT&}E $0C ;1390 .BYTE $0C ;1400 .BYTE $18 ;1410 .BYTE $0C ;1420 .BYTE $0C ;1430 .BYTE $06 ;1440 .BYTE $00 ;1450 ;14&}60 .BYTE $60 ;r-brace1470 .BYTE $30 ;1480 .BYTE $30 ;1490 .BYTE $18 ;1500 .BYTE $30 ;1510 .BYTE $30 ;1520 .BYTE &}$60 ;1530 .BYTE $00 ;1540 ;1550 .BYTE $00 ;tilde1560 .BYTE $00 ;1570 .BYTE $00 ;1580 .BYTE $36 ;1590 .BYTE $6C ;&}1600 .BYTE $00 ;1610 .BYTE $00 ;1620 .BYTE $00 ;1630 ;1640 ; this is the display list1650 DLIST .BYTE $70,$70,$70,$4&}21660 .WORD MSCR1670 .BYTE 2,2,2,2,2,2,21680 .BYTE 2,2,2,2,2,2,21690 .BYTE 2,2,2,2,2,2,21700 .BYTE 2,2,$411710 .W&}ORD DLIST1720 ;1730 *=MCHR1740 .BYTE ""1750 .BYTE "| Chameleon TTY Emulator &}Version 2.0 |"1760 .BYTE "| (C) 1981 John Howard Palevich |"1770 .BYTE "| invokes selected FTP |"&}1780 .BYTE "| moves to menu screen |"1790 .BYTE "| toggles cursor lock |"1800 .BYTE "| &} displays previous page |"1810 .BYTE "| rolls screen left |"1820 .BYTE "| ro&}lls screen right |"1830 .BYTE "| To get : type | To get : type |"1840 .BYTE "| ` : CTRL-. | @ : &}CTRL-, |"1850 .BYTE "| ~ :CTRL-back| \ : CTRL- |"1860 .BYTE "| { : CTRL-; | ] : CTRL- |"1870 &} .BYTE "| } : clear | ^ : CTRL- |"1880 .BYTE "| RUBOUT : back s | _ : CTRL- |"1890 .BYTE "|&}󠰮|"1900 .BYTE "| When viewing the Menu Screen: |"1910 .BYTE "| ԭ moves&} up one line |"1920 .BYTE "| moves down one line|"1930 .BYTE "| ԭ decrements the item &} |"1940 .BYTE "| increments the item |"1950 .BYTE "| quits to CRT TTY page |"1960 .BYT&}E "| Use , Backs & Return to edit fname|"1970 .BYTE ""1980 .OPT LIST ;to find &}out last bytes used. . . ..0 TTY Emulator30 ; (c) 1981 Hackerjack Palevich40 ;THEL -- instruction page,char set50 ;and,$8K8P?@     Y`  Y0 l `8-- instruction page,char set50 ;and,(XAPX-20058TERMINAL EMULATORJOHN PALEVICH9/18/8185NAMING PROCESS COMPLETEDD2:TITLE! INPUT MASTER DISK TO N05APX-20058TERMINAL EMULATORJOHN PALEVICH9/18/8185NAMING PROCESS COMPLETEDD2:TITLE! INPUT MASTER DISK TO N85