@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED697 FREE SECTORS COPYING---D8:COPY32.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8 uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8 u0&78v0w0υШȄ΢x̩0 L00 L0eТ D00 L00ϱ`ΥЅϥ Υ Θ Ѕ lT} L  H  {hL -8` - 80n )Q) U}rșT `UP Lr8 j  0 `Ӡ `" +  L V}+荼 +  LL|`"и+)I*+L  H h̻W} H h ̾ H hL H̽ HI h   {L  -X}`!  /   `!!H") h!`A AHA! hA!`H/Y} ݍ  h j+ɛ q )P ) H^ qh @/    -Z} 렊`J`)`1H0H `"K` P S E ̽[}̙͠ҍ )zE S +FG j *) aO    )\} L jS F GE LL;9+LL/]}LL+)*)    )  L    ɛЭ ЩH ,hL,^}AU ɛ ,U.    ɛU  ,J`%H$H_}`x`X` O>'ESPͽݤU̸HPJJJJ PH) h hT̷ H `}hRSR̺H) ` RJJJJ p hS̿H) SJJJJ h`/ԽTURSa}` `MӢ8ӌӢ<`0ԽTURS]0100 .OPT NOEJECT0110 DOSINI=$0C0120 IN=$CC0130 OUT=$CE0140 OFFSET=$D00150 MEMTOP=$2E50160 CBEGIN=LENGTH+20170 *=$30 c}000180 ENTER SEC0190 LDA MEMTOP0200 SBC LENGTH0210 LDA MEMTOP+10220 SBC LENGTH+10230 STA OUT+10240 STA OFFSET02 d}50 TAY0260 DEY0270 STY MEMTOP+10280 LDY #$FF0290 STY MEMTOP0300 INY0310 STY OUT0320 LDX #000330 LDA #CBEGIN& e}$FF0340 STA IN0350 LDA #CBEGIN/2560360 STA IN+10370 JSR MOVI0380 HERE TAX0390 BMI MORE0400 JSR MOVI0410 CLC04 f}20 ADC OFFSET0430 LDX #000440 JSR MOV0450 BMI HERE0460 MORE INX0470 BEQ OVER0480 DEX0490 JSR MOVI0500 BMI HER g}E0510 MOV STA (OUT),Y0520 INC OUT0530 BNE MOVI0540 INC OUT+10550 MOVI LDA (IN),Y0560 INC IN0570 BNE MOVO0580 IN h}C IN+10590 MOVO DEX0600 BPL MOV0610 ARND RTS0620 OVER LDA #010630 STA OUT0640 LDA OFFSET0650 STA OUT+10660 LDA D i}OSINI0670 STA (OUT),Y0680 INC OUT0690 LDA DOSINI+10700 STA (OUT),Y0710 INC OUT0720 TYA0730 STA DOSINI0740 LDA j} OFFSET0750 STA DOSINI+10760 JMP (OUT)0770 LENGTH=*0700 STA (OUT),Y0710 INC OUT0720 TYA0730 STA DOSINI0740 LDA 90100 ;.OPT NOLIST0110 .OPT NOEJECT0120 ;0130 BASE=$60000140 ;0150 ;CHAR EQUATES0160 ;0170 LF=100180 CR=130190 ESC=$l}1B0200 SPACE=$200210 CNTL=$5E0220 CLS=$7D0230 EOL=$9B0240 ;0250 ;80 COL COMMANDS0260 ;0270 XCH80=$500280 LMG80=$600m}290 LMH80=$700300 YCR80=$800310 SGR80=$990320 PAG80=$9A0330 RMG80=$A00340 RMH80=$B00350 GET80=$C00360 CUR80=$C10370 Rn}ST80=$C20380 PST80=$C30390 CLR80=$C40400 LIS80=$D00410 SCR80=$D20420 SCB80=$D30430 GRF80=$D40440 ICM80=$D50450 PAL80=o}$D70460 CRS80=$D90470 MCF80=$DB0480 PNT80=$DD0490 ;0500 ;MEMORY EQUATES0510 ;0520 DOSINI=$0C0530 ICDNOZ=$210540 ICCOp}MZ=$220550 ICAX1Z=$2A0560 ICAX2Z=$2B0570 ICIDNO=$2E0580 LMARGN=$520590 RMARGN=$530600 VCP=$540610 HCP=$550620 IN=$CCq}0630 CDTMV3=$21C0640 SDMCTL=$22F0650 KEYDEL=$2D90660 KEYREP=$2DA0670 DVSTAT=$2EA0680 CRSINH=$2F00690 CHBAS=$2F40700 LIr}STF=$2FE0710 SFLAG=$2FF0720 HATABS=$31A0730 ICDNO=$3410740 ICCOM=$3420750 PAL=$D0140760 IRQEN=$D20E0770 SKSTAT=$D20F0s}780 PORTA=$D3000790 PACTL=$D3020800 DMACTL=$D4000810 WSYNC=$D40A0820 VCOUNT=$D40B0830 NMIEN=$D40E0840 ;0850 *=BASE-2t}0860 ;0870 .WORD CEND-BEGIN ;RELOCATER INFO0880 ;0890 BEGIN JSR ERTS ;DOSINI VECTOR0900 JMP CINIT ;RELOCATER JUMP0910 u};0920 PAUX1 .BYTE 00930 PAUX2 .BYTE 00940 ;0950 READ JSR DISAB;DISABLE IRQ INTS0960 LDA #GET800970 JSR CINP ;REQUEST,v} GET CHAR0980 PHA ;SAVE CHAR0990 JSR INPUT ;GET CURS1000 JSR CURCK ;CHECK FOR X>$4F1010 PLA ;RESTORE CHAR1020 JMP Ew}NAB1030 ;1040 CINP JSR CMD1050 INPUT LDA #00 ;TIME CRITICAL CODE1060 TAX ;MUST NOT CROSS A1070 LDY #31 ;PAGE BOUNDARYx}1080 STA DATIN1090 IN0 LDA PORTA ;41100 AND INMSK ;41110 BEQ IN01 ;3 IF A 0, 2 IF NOT1120 DEX1130 BNE IN01140 DEYy} ;TIMEOUT LOOPS1150 BNE IN01160 SEC ;NO RESPONSE1170 RTS1180 IN01 LDX #081190 LDY #12 ;21200 IN1 DEY1210 BNE IN1 z};5*Y-11220 NOP ;21230 IN10 LDY #15 ;2 MAIN DLY COUNT1240 IN2 DEY1250 BNE IN2 ;5*Y-11260 LDA PORTA ;4 GET BYTE1270 A{}ND INMSK ;4 GET BIT1280 CLC ;21290 BEQ IN25 ;0=3,1=21300 SEC ;1=21310 IN25 BCC IN26 ;0=3,1=21320 IN26 DEX ;2 DEC COUN|}T1330 BMI IN3 ;2 (3 DONE)1340 ROR DATIN ;6 SHIFT IN BIT1350 BCC IN10 ;3 ALWAYS1360 IN3 LDY #15 ;DELAY 1/2 BIT1370 IN3}}3 DEY1380 BNE IN331390 LDA DATIN ;GET CHAR (Y=0)1400 BCC I5 ;RETURN IF CHAR1410 BPL I0 ;HORIZ WITH NO VERT1420 AND ~}#$7F ;CLEAR UPPER FLAG1430 CMP #$51 ;TEST HORIZ/VERT1440 BCC I00 ;HORIZONTAL1450 AND #$1F ;CLEAR MID FLAG1460 BCS I01} ;SAVE VERT1470 I00 JSR I0 ;SAVE HORIZ1480 BCC INPUT ;GET VERT1490 I0 INY ;OFFSET FOR HORIZ1500 I01 STA VCP,Y ;CURS POSI}TION1510 STA VCS,Y ;CURS SHADOW1520 CLC ;INDICATE RESPONSE1530 I5 RTS1540 ;1550 CURCK LDA HCP ;CHECK HORIZ CURSOR1560} CMP #$50 ;FOR >$4F1570 BCC I5 ;IF NOT1580 LDA #CUR80 ;GO GET REAL VALUE1590 JSR CINP1600 JMP I0 ;AND STORE IT (Y=0)}1610 ;1620 CMD SEC ;THIS CODE MUST NOT1630 BCS OUT ;CROSS A PAGE BOUNDARY1640 OUTPUT CLC ;CMD FLAG=0 FOR CHAR1650 OUT L}DY #001660 JSR SEND ;SEND START BIT1670 LDX #08 ;SETUP BIT COUNT OF 91680 NOP1690 NOP1700 NOP ;2+2+2+2=81710 OUT0 }ROR A ;PUT BIT INTO CARRY1720 BCS HI1730 BCC LO ;2+3=5 CYCLES TO LO1740 LO LDY #00 ;5+2 CYCLES TO JSR1750 JSR SEND ;SE}ND A 01760 BCC OUT1 ;3 CYCLES1770 HI LDY OUTMS ;3+4 CYCLES TO JSR1780 JSR SEND ;SEND A 11790 BCS OUT1 ;3 CYCLES1800 O}UT1 DEX ;NEXT BIT 2 CYC1810 BPL OUT0 ;MORE 3 OR 2 CYC1820 BMI OUT2 ;SEND STOP BIT 3 CYC1830 OUT2 LDY OUTMS ;SEND A 1184}0 BNE OUT31850 OUT3 JSR SEND ;2+3+4+3=121860 RTS1870 SEND STY PORTA ;OUTPUT BIT1880 LDY #12 ;TIMER FOR 15.7KB1890 S1 }DEY1900 BNE S1 ;5*Y-1 CYCLES1910 BEQ S2 ;31920 S2 NOP1930 NOP1940 NOP1950 NOP ;2+2+2+2=81960 S3 RTS ;6 CYCLES197}0 ;1980 COM LDA ICCOMZ ;GET COM BYTE1990 CMP #$14 ;CHECK DEBUG OUT2000 BNE COM1 ;TRY NEXT XIO2010 LDA ICAX2Z ;GET AUX }22020 COMSD JSR DISAB ;STOP INTERRUPTS2030 JSR CMD ;GO SEND2040 JMP ENAB ;ENABLE AND NORM EXIT2050 COM1 CMP #$15 ;TEST }VALID2060 BNE COM2 ;NEXT2070 LDA ICAX2Z ;GET AUX 22080 BNE COMBR ;GO DO BURST2090 STA MODE ;MAKE NORMAL2100 LDA #SC}R80 ;GET CMD2110 BNE COMSD ;GO SEND2120 COMBR STA MODE ;MAKE BURST2130 LDA #SCB80 ;GET CMD2140 BNE COMSD ;GO SEND2150} COM2 CMP #$16 ;CHECK DEBUG IN2160 BNE COM3 ;NEXT2170 LDA ICAX2Z ;GET BYTE TO SEND2180 JSR DISAB2190 JSR CINP ;REQUES}T, GET CHAR2200 STA DVSTAT+1 ;FOR NOW2210 JMP ENAB2220 COM3 CMP #$19 ;CHECK 80/402230 BNE COM42240 JMP XIO19 ;DO IT}2250 COM4 RTS2260 ;2270 PCOM LDA ICCOMZ ;GET CMD2280 CMP #$17 ;TEST VALID2290 BNE S3 ;NO MORE FOR NOW2300 LDA ICAX2Z };GET AUX 22310 CMP #08 ;CHECK RESERVED2320 BCS S3 ;NO GOOD2330 AND #03 ;CHECK 3 AND 72340 EOR #032350 BEQ S3 ;NOT A}LLOWED2360 LDA ICAX1Z ;GET AUX12370 CMP #08 ;CHECK UPPER LIMIT2380 BCS S3 ;NO GOOD2390 STA PAUX12400 LDA ICAX2Z ;GE}T AUX 22410 STA PAUX22420 JMP EXIT2430 ;2440 WRITE LDY SFLAG ;CHECK CNTL 12450 BNE WRITE ;IF ON2460 JSR DISAB2470 } LDY DEV ;ARE WE SCREEN?2480 BEQ WR2 ;YES2490 PHA2500 LDA #002510 STA DEV2520 LDA #SCR802530 JSR CMD2540 PLA25}50 WR2 LDY LISTF ;CHECK LIST FLAG2560 CPY LISTS2570 BEQ WR32580 STY LISTS ;SAVE NEW VALUE2590 PHA2600 TYA2610 BEQ} WR252620 LDA #01 ;FORCE LSB2630 WR25 ORA #LIS802640 JSR CMD ;SEND NEW VALUE2650 PLA2660 WR3 JSR ALIGN ;SET PARMS267}0 LDY CHBAS ;CHECK CHAR SET2680 CPY CHSH2690 BEQ WR52700 CPY #$E02710 BNE WR42720 STY CHSH2730 PHA2740 LDA #GR}F802750 WR35 JSR CMD2760 PLA2770 JMP WR52780 WR4 CPY #$CC2790 BNE WR52800 STY CHSH2810 PHA2820 LDA #ICM802830 } BNE WR352840 WR5 LDY CRSINH ;CHECK CURS FLAG2850 CPY CRSS2860 BEQ WR62870 STY CRSS2880 PHA2890 TYA2900 BEQ WR55}2910 LDA #012920 WR55 EOR #CRS80 ;CURSOR ON/OFF2930 JSR CMD2940 PLA2950 WR6 JSR OUTPUT ;SEND CHAR2960 LDA MODE ;TES}T FOR BURST2970 BNE WWAT ;IF SO2980 JSR INPUT ;GET NEW CURSOR2990 JSR CURCK ;CHECK FOR X>$4F3000 JMP ENAB3010 WWAT J}SR ENAB ;ENABLE INTS3020 LDY #25 ;OR SUCH3030 JSR S13040 WW1 LDA PORTA3050 AND INMSK3060 BEQ WW13070 WW2 LDY #0130}80 RTS3090 ;3100 POPEN STX TIOCB3110 LDX ICDNOZ3120 JSR MATRIX3130 BCS HANDGO3140 LDY SDMCTL3150 BNE WW23160 L}DA #PST803170 JSR DISAB3180 JSR CINP ;REQUEST, GET CHAR3190 BNE POP13200 LDA #139 ;NOBODY HOME3210 POP1 JSR ENAB322}0 TAY3230 RTS3240 ;3250 HANDGO LDA ICDNOZ3260 STX ICDNOZ3270 PHA3280 LDA ICCOMZ3290 AND #083300 TAX3310 JSR }HAND3320 PLA3330 STA ICDNOZ3340 RTS3350 ;3360 PWRT TAY ;SAVE CHAR3370 STX TIOCB3380 LDA ICDNO,X3390 TAX3400 J}SR MATRIX3410 TYA3420 BCC PWP3430 STA TCHAR ;SAVE CHAR FOR CALL3440 LDY TIOCB ;GET UNIT #3450 LDA ICDNO,Y3460 PHA} ;SAVE UNIT #3470 TXA ;GET NEW VALUE3480 STA ICDNO,Y ;REPLACE WITH NEW3490 STA ICDNOZ ;AND ZERO PAGE3500 LDX #063510} JSR HAND ;GO PRINT3520 PLA ;RESTORE UNIT #3530 LDX TIOCB ;GET POINTER3540 STA ICDNO,X ;RESTORE OLD3550 STA ICDNOZ3}560 RTS3570 PWP LDY DEV ;CHECK OUTPUT DEV3580 BNE PW03590 PHA3600 LDY SDMCTL3610 BEQ PW23620 PW1 LDY VCOUNT3630 }CPY #1293640 BNE PW13650 PW2 JSR DISAB3660 LDA #PNT803670 STA DEV3680 JSR CMD3690 JSR ENAB3700 PLA ;RESTORE CHAR}3710 PW0 TAY ;SAVE CHAR3720 LDA PAUX2 ;GET CNTL3730 ROR A ;CHECK NO XLATE3740 TYA ;RESTORE CHAR3750 BCS DOIT ;DONT X}LATE3760 CMP #EOL ;CHECK EOL3770 BNE XLATE ;XLATE IF NOT3780 LDA #CR ;REPLACE WITH CR3790 JSR DOIT ;SEND3800 LDA PA}UX2 ;GET CNTL3810 AND #04 ;CHECK NO APPEND3820 BNE WGDS ;DONT APPEND3830 LDA #LF ;GET LF3840 BNE DOIT ;SEND3850 XLAT}E LDA PAUX2 ;GET CNTL3860 CMP #02 ;CHECK LIGHT XLATE3870 TYA ;RESTORE CHAR3880 BCC DOIT ;DONE WITH XLATE3890 AND #$7F} ;REMOVE MSB3900 CMP #$20 ;CHECK ASCII CHAR3910 BCS DOIT ;GO PRINT ASCII3920 PHA ;SAVE CHAR3930 LDA #CNTL ;GET "CNTL"} CHAR3940 JSR DOIT ;SEND3950 PLA ;RESTORE CHAR3960 ORA #$40 ;MAKE ALPHA3970 DOIT LDY SDMCTL3980 BEQ DO13990 DO0 LDY} VCOUNT4000 CPY #1294010 BNE DO04020 DO1 JSR DISAB4030 JSR OUTPUT4040 JSR ENAB4050 WAIT LDY #25 ;FOR NOW4060 JSR }S14070 LDY #024080 W0 LDX #255 ;FOR NOW4090 STX CDTMV3 ;SETUP VBLANK COUNT4100 W1 LDA PORTA4110 AND INMSK4120 BNE W}GDS ;AVAILABLE4130 LDA CDTMV3 ;CHECK COUNTDOWN4140 BNE W14150 DEY4160 BNE W04170 WTMO LDY #138 ;DO TIMEOUT4180 BNE} WRTS ;COULD DO BRKKEY ALSO4190 WGDS LDY #014200 WRTS RTS4210 ;4220 MATRIX CPX #024230 BEQ PNEXT4240 BCS POVER4250 }LDA PAUX14260 LSR A4270 POVER RTS4280 PNEXT LDA #034290 CMP PAUX14300 BCC POVER4310 LDA PAUX14320 AND #024330 B}EQ POVER4340 DEX4350 RTS4360 ;4370 HAND LDA $E431,X4380 PHA4390 LDA $E430,X4400 PHA4410 LDA TCHAR ;RESTORE CHAR}4420 LDX TIOCB ;GET IOCB POINTER4430 RTS ;CALL PRINTER HANDLER4440 ;4450 FORCOM LDA ICCOMZ4460 CMP #$184470 BEQ XIO}184480 RTS4490 ;4500 CINIT LDA #004510 STA TOGGLE4520 JSR JINIT4530 LDA #$504540 LDY #024550 JSR FSET4560 LDA} #$534570 JSR FIND4580 LDA HATABS+1,X4590 STA TEMPSV4600 LDA HATABS+2,X4610 STA TEMPSV+14620 LDA #$454630 JSR F}IND4640 LDA HATABS+1,X4650 STA IN4660 LDA HATABS+2,X4670 STA IN+14680 LDY #154690 C003 LDA (IN),Y4700 STA TMTAB,}Y4710 DEY4720 BPL C0034730 LDA #FORCOM-1&$FF4740 STA TMTAB+104750 LDA #FORCOM-1/2564760 STA TMTAB+114770 LDA SK}STAT4780 AND #084790 BEQ C0044800 XIO18 LDA #$454810 LDY #004820 JSR FSET4830 LDA #$534840 LDY #014850 JSR FSE}T4860 LDA #WRITE-1&$FF4870 STA $3464880 LDA #WRITE-1/2564890 STA $3474900 EOPEN LDX #004910 JSR FESUB4920 LDA IC}AX1Z ;GET AUX 14930 AND #32 ;CHECK CLEAR BIT4940 BNE C005 ;DONT DO RESET4950 LDA #004960 LDX #064970 C0035 STA VCS,X}4980 DEX4990 BPL C00355000 LDA #$E05010 STA CHSH5020 LDA #$4F5030 STA RMARGS5040 STA COMPOS5050 JSR DISAB506}0 IO00 LDA #RST80 ;RESET 80 COL5070 JSR CINP ;REQUEST, GET CHAR5080 BCC IO01 ;GOT IT5090 JSR JTOGL ;SWITCH PORTS5100 }BNE IO00 ;DO IT AGAIN5110 IO01 LDA PAL ;CHECK COMPUTER TYPE5120 AND #$0E5130 BNE IOP15140 LDA #PAL805150 JSR CMD ;SE}T 80 COL TO 50HZ5160 IOP1 JMP ENAB5170 ;5180 XIO19 LDX #065190 JSR FESUB5200 LDA #$535210 JSR FIND5220 LDA TEMPSV}5230 STA HATABS+1,X5240 LDA TEMPSV+15250 STA HATABS+2,X5260 LDA TMTAB+65270 STA $3465280 LDA TMTAB+75290 STA $34}75300 C004 LDA #$455310 LDY #035320 JSR FSET5330 JMP EXIT5340 C005 LDA #SCR80 ;IN CASE A PRINT5350 JMP COMSD ;HAS O}CCURED5360 ;5370 EDTAB .WORD EOPEN-1 ;OPEN5380 .WORD EXIT-1 ;CLOSE5390 .WORD EGET-1 ;GET LINE OF TEXT5400 .WORD WRITE}-1 ;PUT (NO CURS)5410 .WORD EXIT-1 ;STATUS5420 .WORD COM-1 ;SPECIAL (CMD OUT)5430 JMP EXIT ;INIT5440 .BYTE 05450 ;5}460 PRTAB .WORD POPEN-1 ;OPEN5470 .WORD EXIT-1 ;CLOSE5480 .WORD ERTS-1 ;GET5490 .WORD PWRT-1 ;PUT5500 .WORD POPEN-1 ;}STATUS5510 .WORD PCOM-1 ;SPECIAL5520 JMP EXIT ;INIT5530 .BYTE 05540 ;5550 SCTAB .WORD SOPEN-1 ;OPEN5560 .WORD EXIT-}1 ;CLOSE5570 .WORD SREAD-1 ;GET-LOCATE5580 .WORD SWRIT-1 ;PUT-PLOT5590 .WORD EXIT-1 ;STATUS5600 .WORD ERTS-1 ;SPECIAL}5610 SCT1 JMP EXIT ;INIT5620 .BYTE 05630 ;5640 TMTAB .WORD EXIT-1,EXIT-15650 .WORD EXIT-1,EXIT-15660 .WORD EXIT-1,EX}IT-15670 JMP EXIT5680 .BYTE 05690 ;5700 SOPEN LDA ICAX2Z5710 AND #085720 BEQ SCT15730 LDA ICAX1Z5740 AND #1657}50 BNE SCT15760 LDA #00 ;SEND 05770 JSR DISAB5780 JSR OUTPUT5790 JSR INPUT5800 LDA #SGR80 ;SET GRAPHICS5810 JSR }CMD5820 LDA PAL5830 AND #$0E5840 BNE SOP15850 LDA #PAG805860 JSR CMD5870 SOP1 LDA #CLR80 ;FILL WITH 0 SENT5880 J}SR CINP ;REQUEST, GET CHAR5890 LDA #015900 JMP COMBR5910 ;5920 SREAD JSR DISAB5930 JSR ALIGN ;SET PARMS5940 JSR REA}D ;GET CHAR5950 CMP #EOL ;CHECK EOL5960 BNE SCT1 ;RETURN NORMAL5970 LDA #SPACE ;REPLACE WITH SPACE5980 BNE SCT1 ;RETU}RN NORMAL5990 ;6000 SWRIT PHA ;SAVE CHAR6010 LDA #ESC ;FORCE PRINT6020 JSR WRITE6030 PLA ;RESTORE CHAR6040 JMP WRIT}E ;SEND IT6050 ;6060 EGET LDA COMPOS6070 BEQ EBACK6080 LDA HCP6090 STA HCPS6094 STA HCPE6100 EG1 JSR KCALL ;GET KB} BYTE6110 CMP #EOL6120 BEQ EGBAK6130 JSR WRITE ;SEND TO 80 COL6132 LDY HCP ;THIS CODE IS FOR6134 CPY HCPE ;SPECIAL }CASE LINES6140 BCC EG1 ;DONT UPDATE IF LESS6142 STY HCPE6144 BCS EG16150 EGBAK STY KSTAT ;SAVE STATUS6160 CPY #$80 ;}CHECK STAT6170 BCS EBA0 ;DO EOL IF EOF/BREAK6180 JSR DISAB ;DISAB FOR CMD6190 LDA #006200 STA COMPOS6210 LDA MODE6}220 BEQ EG26230 LDA #006240 BEQ EG36250 EG2 LDA HCPS6260 EG3 JSR CMD ;X CURS TO OLD VAL6270 LDA #MCF80 ;Y CURS TO FI}RST6280 JSR CMD6290 EBACK JSR READ ;GO GET A CHAR6300 CMP #EOL6310 BNE EGXT ;NOT DONE YET6312 LDY HCP6314 CPY HCPE} ;CHECK RIGHTMOST6315 BCS EBA0 ;CURSOR POSITION6316 LDA #SPACE ;IF NOT THERE6318 BNE EGXT ;THEN FAKE SPACE6320 EBA0 ST}A COMPOS ;SET NON 06330 JSR WRITE6340 LDA #EOL ;RETURN WITH EOL6350 EGXT LDY KSTAT ;GET STATUS6360 RTS6370 ;6380 KCA}LL LDA $E4256390 PHA6400 LDA $E4246410 PHA6420 RTS6430 ;6440 DISAB LDY #006450 STY NMIEN6460 SEI6470 RTS6480} ;6490 ENAB LDY #$C06500 STY NMIEN6510 CLI6520 EXIT LDY #016530 ERTS RTS6540 ;6550 VCS .BYTE 06560 HCS .BYTE 06570} DEV .BYTE 06580 LMARGS .BYTE 06590 LISTS .BYTE 06600 MODE .BYTE 06610 CRSS .BYTE 06620 ;6630 CHSH .BYTE 06640 RMARGS }.BYTE 06650 COMPOS .BYTE 06660 ;6670 DATIN .BYTE 06680 HCPS .BYTE 06685 HCPE .BYTE 06690 KSTAT .BYTE 06700 INMSK .BYTE} 06710 OUTMS .BYTE 06720 TOGGLE .BYTE 06730 TIOCB .BYTE 06740 TCHAR .BYTE 06750 ;6760 TEMPSV .WORD 06770 ;6780 INMST }.BYTE 02,$206790 OUTMT .BYTE 01,$106800 ;6810 FETAB .BYTE 0,0,0,$4F,24,36820 .BYTE 62,0,2,39,30,66830 ;6840 LOOKUP .BY}TE "ESP"6850 LOWAD .BYTE EDTAB&$FF,SCTAB&$FF,PRTAB&$FF,TMTAB&$FF6860 ;6870 ALIGN LDY HCP ;GET HCURS6880 CPY HCS ;COMPARE} TO SHADOW6890 BEQ A1 ;NO CHANGE6900 STY HCS ;SAVE NEW VALUE6910 PHA ;SAVE CHAR6920 TYA6930 CMP #$506940 BCC A00}6950 LSR A6960 LSR A6970 LSR A6980 LSR A6990 ORA #XCH807000 PHA7010 TYA7020 AND #$0F7030 JSR CMD7040 PLA7}050 A00 JSR CMD ;SEND NEW CURSOR7060 PLA7070 A1 LDY VCP ;GET VCURS7080 CPY #25 ;CHECK UPPER LIMIT7090 BCC A157100 LD}Y #24 ;STATUS LINE7110 A15 CPY VCS ;COMPARE TO SHADOW7120 BEQ A2 ;NO CHANGE7130 STY VCS ;SAVE NEW VALUE7140 PHA ;SAVE }CHAR7150 TYA7160 ORA #YCR80 ;SET CMD BIT7170 JSR CMD ;SEND NEW CURSOR7180 PLA7190 A2 LDY LMARGN7200 CPY RMARGN721}0 BCC A247220 LDY #007230 STY LMARGN7240 A24 CPY LMARGS7250 BEQ A37260 STY LMARGS7270 PHA7280 TYA7290 AND #$0}F7300 ORA #LMG807310 JSR CMD7320 LDA LMARGN7330 LSR A7340 LSR A7350 LSR A7360 LSR A7370 BEQ A257380 ORA #LM}H807390 JSR CMD7400 A25 PLA7410 A3 LDY RMARGN7420 CPY RMARGS7430 BEQ A47440 STY RMARGS7450 PHA7460 TYA7470 AN}D #$0F7480 ORA #RMG807490 JSR CMD7500 LDA RMARGN7510 LSR A7520 LSR A7530 LSR A7540 LSR A7550 CMP #047560 BE}Q A357570 ORA #RMH807580 JSR CMD7590 A35 PLA7600 A4 RTS7610 ;7620 FESUB LDA FETAB,X7630 STA SDMCTL7640 STA DMACTL}7650 LDA FETAB+1,X7660 STA VCP7670 LDA FETAB+2,X7680 STA HCP7690 STA LMARGN7700 LDA FETAB+3,X7710 STA RMARGN77}20 LDA FETAB+4,X7730 STA KEYDEL7740 LDA FETAB+5,X7750 STA KEYREP7760 RTS7770 ;7780 FIND LDX #007790 F1 CMP HATABS},X7800 BEQ F27810 INX7820 INX7830 INX7840 BNE F17850 ;7860 FSET JSR FIND7870 SET LDA LOWAD,Y7880 STA HATABS+1,}X7890 LDA #EDTAB/2567900 STA HATABS+2,X7910 F2 RTS7920 ;7930 JTOGL LDA #017940 EOR TOGGLE7950 STA TOGGLE7960 JINI}T LDX TOGGLE7970 LDY INMST,X7980 STY INMSK7990 LDY OUTMT,X8000 STY OUTMS8010 LDA #$FF8020 STA PORTA8030 LDX #$3}88040 STX PACTL8050 STY PORTA8060 LDX #$3C8070 STX PACTL8080 RTS8090 ;8100 CEND=*8110 ;8120 .END8030 LDX #$3pACMFULOCHVAN@ @ } @y @!d80 COLUMN DEMO TEXTx;AV, (}UR(J HELLO, I'M THE NEWEST PRODUCT IN ATAR}I'S EVER-GROWING XE PRODUCT LINE U(85(- << THE XEP80 >>8(QQ(I I provide 80 COLUMN d}isplay and CENTRONICS PARALLEL printer output to@=(5 ALL ATARI 8 bit computers !!!!!!@(SS(K } My DISK-BASED handler immediately gives YOU an 80 COLUMN DISPLAY on aSS(K host of software products. With my INDUSTRY S}TANDARD printer port you canTT(L now use a wide variety of printers with your XE and XL computers; no longer**(" need}ing the 850 interface module.UU(M Now you can view text as it will appear on your printer. Spreadsheets SS(K an}d telecommunications products now become more powerful and professional.SS(K Many ATARI and 3rd party software products a}re being enhanced to take full""( advantage of the XEP80.==(5 As Always ATARI CORP. Brings You }77(/ POWER WITHOUT THE PRICE A XI(A} The XEP80 Supports the Atari Graphi}cs Character SetX( TT(K..(%}nn(e } II(@ MM(D} MM(D }44(+4{69`A<<(3    33(* }         ''(  A  (}5( ( 5@ @}@AE:DD(< The Atari International Character Set,-@&((>}:, , ,-@'A$((>:, , ,-A%A'((>:, ,  ( ( A }++@ @@AE:MM(E} The XEP80 Also Supports All Atari Screen Editing Functions(} A ;1(( INSERT CHARACTERS; A .$6.SEVERAL. A A} A(7(+ DELETE A LOT OF TEXTA A +!6.+ A A }5( (( INSERT+( LINES5 A  116.' MANY MANY MANY  Ai_(V } DELETEASMANYLINESASYOULIKEi A I6. A$ }A ,6.6 A@ A I6.G A A 6.) A3 A = AG A 0[([6}.N OR JUSTPUT TEXTANYWHEREYOU LIKE2 A6 A XZ=( >:}AU,=@ @@ADE:[=( >:AU,=@ @@AEE:\E( >:A}`%@,E@ @@A7E:^HH(@} THE SCREEN CAN BE CHANGED TO BLACK ON WHIT}E_ A `E( >:A`%@,E@ @@A7E:b(((~ THE CURSOR MAY BLINKc} A jH( ( >:A`%@,H@ @@A7E:l##(~ OR REMAIN STEADYm }A vH( ( >:A`%@,H@ @@A7E:xHH(@~ THE SCREEN CAN BE }CHANGED TO WHITE ON BLACKz A ~E( >:A`%@,E@ @@A7E:##(~ B }LINKING CURSOR A H( ( >:A`%@,H@ @@A7E:""(~ CONSTAN }T CURSOR A @@(8} Many New Text Options Are Supported A P((( >:AU& }@&@,P@ @@AEE:DD(<~ HOW ABOUT ĠϠՠ ̠ŠנɠĠŠ FOR EXAMPLE? } A X(0( >:AU&@&@&@,X@ @@AEE:>(~ >:AU,> }@ @@ADE:))(!~ BLINKING EVEN? A H( ( >:AU&@,H}@ @@AEE:&&(~ OR INVERSE? A P((( >:AU&@&@},P@ @@AEE:$$(~ BLINKING? A  A EE(= } The XEP80 also supports several more features:H%( UNDERLINED TEXTH( DOUBLE HIGH TEXT ..(}& TRUE BIT MAPPED GRAPHICS  A  @(( >:AU,@@ @@AEE: @(}( >:AU,@@ @@ADE: AMAIN LOOP-@B:,(7<, A 0} $(-@@ ! A % ($$ A  A ! A $$(-@@! A 0% ($}-@@ $D:DEMO80($$ A  A ! A $$(-@@! A 0% ($/ghx  ARELOB1OB2OUTGRARENWRITLOOTRENPULIDATENFILFAICOUNADSPOTTTHLSTARFENTME} }} ! ""RELOCATING PROGRAM FOR XEP80==TO USE THIS PROGRAM THE FOLLOWING CRITERIA MUST BE MET:CC. THE HAN}DLER SOURCE CODE MUST BE ASSEMBLED TWICE, THE FIRST(??. ASSEMBLY AT ANY CHOSEN START ADDRESS AND THE SECOND AT2@@. TH}AT ADDRESS+$100. THE FIRST OBJECT CODE WILL BE CALLED<??. H6000.OBJ AND THE SECOND OBJECT CALLED H6100.OBJ. THE F@@. }RELOCATER CODE MUST BE ASSEMBLED AS FILE MOVE.OBJ. THISPAA. PROGRAM WILL READ IN MOVE.OBJ THEN COMPARE BYTES BETWEENZ@@}. H6000.OBJ AND H6100.OBJ AND CREATE A LINKED RELOCATABLEd>>. STRING. THIS STRING IS APPENDED TO THE MOVE.OBJ STRINGi+}+. THEN WRITTEN TO DISK AS AUTORUN.SYSn;A H,x11;@,;@,;@,;@,6. D:MOVE.O}BJ6. D:H6000.OBJ6. D:H6100.OBJ6. D:AUTORUN.SYS'6-A06-A5'6-A@6-AP}6-B'h6-@,, @@,6-@6 6-@ B"@ A@D6 }7<,.>:,E J A T@^  @@ @@ 6!}-;-@#6-@' 36-@7 ; 7-@#6-@' 36-@7 "}67<,.>:,  6- 6- !A' A)6-@ "@) AP #}6-6-@ 6-  A67<,.>:,6-%@ A@67<,.>:A(, A $}67<,.>:,)6-&@)SHOULD READ FROM FILE67<,.>:,  A &67<,.>:,'67<%},.>:,( )67<,.>:AU,*@@0;;6-@:7@<@,,%@:7@<@,,$AV&}:6-%&@D$6-P:'AV,$6-&$AVN767@<@,.>:,767@<@,.>:,O! !67'}<%@,.0X STOP @@(@@ &EETHIS SECTION CAN BE (}ENABLED TO OUTPUT A HEX VERSION OF THE FILE';@,'6.0123456789ABCDEF-B:,&@o6-P:'A)}V,$6-&$AV56-P:'@,E6-&$@S6-%@a6-%@o6-%@ (7<,7<,7<,*} !!6-@:7%@<%@,,@6-P:'@,$6-&$@26-%@@6-%@(7<,7<, +}& ) $ 6-@$6-%@$ D:MAKER.BAS@6-%@(7<,7<, Q A W dATTRIBUTES EXAMPLEnAATO SET ATTRIBUTES USE FOLLOWING DEFINITIONS TO FORM COMMANDx55. THE-} XEP80 CONTAINS TWO ATTRIBUTE REGISTERS EE. REGISTER A IS USED WHEN A CHARACTER ASCII VALUE IS BELOW 128EE. REGISTE.}R B IS USED WHEN A CHARACTER ASCII VALUE IS ABOVE 12799. EACH REGISTER REMAINS CONSTANT ACROSS THE SCREENEE. THAT I/}S, NO MATTER WHERE A CHARACTER IS PLACED ON THE SCREENAA. ITS ATTRIBUTES WILL REMAIN THE SAME ##0}. REGISTER BIT DEFINITIONS:!!. BIT EFFECT IF A 0!!. 0 REVERSE VIDEO. 1 NO EFFECT1}. 2 BLINKING. 3 NO EFFECT . 4 DOUBLE WIDE. 5 UNDERLINE.2} 6 BLANK)). 7 SPECIAL TEXT GRAPHICS... TO ISSUE A COMMAND DO THE FOLLOWING:". 1) PRINT 3}CHR$(27);,CC. 2) PRINT CHR$(VALUE DERIVED FROM ABOVE BIT DEFINITIONS);6!!. 3) XIO 20,#1,12,A,"E:"@AA. WH4}ERE A=244 FOR REGISTER A AND A=245 FOR REGISTER BJDD. THEN PRINT CHARACTERS ON THE SCREEN, EITHER WITH BIT 7 OFFT??. 5} TO USE REGISTER A, OR WITH BIT 7 ON TO USE REGISTER BK (}-@(@9(E ؠA ͠P ̠E T ŠX ԠKAR@6} A !!SOME ATTRIBUTE COMBINATIONSL$(>:@',>:AU&@,L@ @@AE7}E:L$(>:@',>:AU&@,L@ @@AEE: A  REVERSE VIDEO &L$(>:@'8},>:AU&@,L@ @@ADE:0L$(>:@',>:AU&@,L@ @@9}AEE:D A BLINKINGXL$(>:@',>:AU&@,L@ @@ADE:bL$(>:@':},>:AU&@,L@ @@AEE:v A  SOME DOUDLE WIDED(>:@',>:AU,D;}@ @@ADE:T,(>:@',>:AU&@&@,T@ @@AEE:<}" A "OTHERS DOUBLE WIDEL$(>:@',>:AU&@,L@ @@ADE:T,(>:@',>=}:AU&@&@,T@ @@AEE:  A ALL DOUBLE WIDE L$(>:@',>:AU&>}A(,L@ @@ADE:*T,(>:@',>:AU&A(&@,T@ @@AE?}E:> A ALL GRAPHICSRD(>:@',>:AU,D@ @@ADE:\D(>:@',>:A@}U,D@ @@AEE:p A BACK TO NORMALAR& (~~-A}A # &$D:ATRIBUTE.BASEE:p A BACK TO NORMALAR& (~~-$  22FDECO@@@AvdSCROLLING WINDOW EXAMPLEiFFSCROLL LEFT AND RIGHT WITH!C} JOYSTICK, WHEN FINISHED PRESS TRIGGERk)B7t@d)DISABLE BREAK KEYnF@AU'AR@FSET !D}RIGHT MARGIN, CURSOR OFFpE'-@$@W@W1 APECLEAR ALL WINDOWSr>(>:A%, !6-!E}+ AP>SET FIRST WINDOWxA(>:A%,#-@ A(USE JOYSTICK TO SCROLL}$$(PRESS T!F}O EXIT:-@+-$@@:(COLUMN 3 A!-@@3ALLOW SCROLLINGD-$@!G}%@2(P:H:,$A,DMAKE UP A VALUE. A.ALLOW SCROLLING WHILE PRINTING   K A!H}* A&T:@,$@KALLOW SCROLLING, CHECK TRIGGERo-@ #(>:AS,K@ @@!I}A E:]@@yoAR(B7tA(ENABLE BREAK KEYAAWINDOW TO LEFT EDGE, RESE!J}T RIGHT MARGIN, CURSOR ON, EXITJOYSTICK ROUTINEL6-R:@,36-%N:+"@,&+"@,,LGET DIRECTION AND !K}MOVEJ46-$+!6@* Aw,%+"Aw,$AvJLIMITS OF SCROLLINGE-@ (>:AS,E@ @!L}@A E:$AALINE 1050 SETS THE NEW CURSOR AND ISSUES THE SCROLL COMMANDB$ D:WINDOW.BAS@ r.@@@@@d80 COLUMN DISPLAY EXAMPLEf5@'@@y%N}5SET MARGINSiCAR@(}' A`CCLEAR SCREEN, DO TOP LINEn; (-@'(|%O}+ ;DO RIGHT EDGExA-@)-@2(|6 ANOW LEFT?-@!(& A`-(%P}?NOW BOTTOM LINEE-@ A) AP=-@E(,-@(( %Q}, !(~~! AP/  A0 A% A/ A0G6-@#-@%R}- A1 =6-@G AB (AR BCORSOR ON AND OUT OF GRID, EXIT, (-%S}@6/(  ,(~~/$J (-@T/(  ,(~~%T}/$^(-@! A% ($h%-@w(" %$| (|-@+( %U} | || (( | |+$5-@+-@5 A@$  6-@! A@$$%V}O%-$@%$@%%@L(P:H:,$@%@,00O$77LINE 440 PRINTS RANDOM DATA IN APPROPRIATE%W} PLACES D:EIGHTY.BAS@L(P:H:,$@%@,00O$77LINE 440 PRINTS RANDOM DATA IN APPROPRIATE$pGDX((@@@3@T@S?P ((( )Y}7 A7KEEP TIME DEPENDENT CODE NEAR BEGINNING e-@#6-/6-A(C-@K6)Z}-%eLOOPS FOR CIRCLE LIMITSZ%6-%$+$%$$@0 A%,36-'@7 E6-%@ZCIRCLE CALCULATIONB)[}%67%@<%@,.>:,BSET BITS FOR OUTPUT STRING(,  ( Ap,PRINT OUTPUT STRINGd--GRAPHICS DISP)\}LAY EXAMPLE TO DRAW CIRCLEnOAR@#(>:A%,;;@@,;@@,OCURSOR OFF oH(H(= PRESS A)]}NY KEY TO BEGIN GRAPHICS PLOTTING (TOTAL TIME 5 MIN)pI(I(> WHEN PLOT IS FINISHED PRESS ANY KEY TO RETURN TO TEXT SCREEN)^}q F:Ad,"AUAr2AdAU2RESET CHARACTER INPUT BYTEs[6.>:,*67@@,.>:,)_}967@,.K+@%@[INIT STRING u)B7t@d)DISABLE BREAK KEYx--6@2@2-VERTICAL )`}AXIS LOOP; 6.6-6@P @;GO TO TIME CRITICAL CODE . F:Ad,"AUA.HOLD SCREEN()a}B7tA(ENABLE BREAK KEY`AdAU5@@E:GARJ`RESTORE TEXT)b} SCREEND:GRAPHICS.BASAK KEY`AdAU5@@E:GARJ`RESTORE TEXT(WAINOUTSTARSTENd##PRINTER CONFIGURATI-d}ON PROGRAMn9&;A H,;@,;@,9ALLOCATE STRINGSx(6. D:AUTORUN.SYS(READ THIS FILE(6. D:PRINT.-e}SYS(CREATE THIS FILE! B !IF NO AUTORUN.SYS @@ ATO CATCH EOFK6-%-f}@)@,67<,.>:,6 ApKBUILD INPUT STRING@76-A6( AUX1 VALUE#7PRINTER -g}AUX1 BYTE67<,.>:,76-A7( AUX2 VALUE#7PRINTER AUX2 BYTE67<,.>:, @@-q}ZB%DOS SYSB*)DUP SYSBSAUTORUN SYSB bRELOC SRCBkXEP80HANSRCB+DEMO80 BASBMAKER BASB,ATRIBUTEBASB BWINDOW BASB MEIGHTY BASB XGRAPHICSBASBcPRINTER BASBrXEP80 DOC<(@@<WRITE MODIFIED STRING TO FILE}(FILE NOT FOUND D:PRINTER.BAS,s Product Specification For XEP80 80 Column and Parallel Printer Board1s} 01/26/87 XEP80 Firmware - Rev 41.1 1t} 6502 XE Handler - Rev 70.0 Table of Contents 1.0 Gene1u}ral Description .................... 2.0 Physical Interface ..................... 3.0 Software Interface ..........1v}........... 4.0 Communications Interface ............... Appendix A Application Notes ............... Appendix 1w}B Relocater Format ................ Appendix C Contents of System Disk .........1x} Page 1 1.0 General Description 1.1 Packaging Info1y}rmation The XEP80 package consists of the following parts: 1. Owners Manual 2. RCA type video cable1z} assembly 3. XEP80 System Diskette 4. Warranty Card 5. XEP80 Unit 6. Two End Caps 1{} 7. Power Adapter - 2600 Game Type 8. Box for Power Adapter 9. Gift Box 1.2 Statistics XEP80 Cur1|}rent Draw 400mA Power Supply 500mA 9V DC Physical Dimensions - 40mmH 240mmL 142mmW Video Output - NTSC C1}}omposite Monochrome Video Display: Text - 80 columns by 25 lines Graphics - 320 dots by 200 lines 1~} Parallel Port: Pin information - 8 data bits, strobe, busy, ground Connector - DB25 female1} Page 2 1.3 General Information The XEP80 is a video output1} device that also supports an 8 bit type parallel port. The video hardware generates an 80 column by 25 line text display1} through a video connector/cable plugged into a separately purchased monitor. The monitor can be any Composite Video input 1}type, although for the best display a monochrome is strongly advised. Internally, the XEP80 is a 256 character wide b1}y 25 line high storage device with an 80 column wide display window. Characters may be placed anywhere within the device 1}independent of the window location. The window may be scrolled across the 256 column wide field. Optionally, the XEP81}0 may be placed into Pixel Graphics mode. This mode supports a bit mapped (pixel) screen of 320 dots (40 bytes) horizontal1} by 200 dots (lines) vertical. The output window displayed is approximately half the size of the text window. Commun1}ication to and from the XEP80 is established through a joystick type cable that extends from the back of the unit. This cab1}le will plug into either joystick port (1 or 2) on all Atari 8 bit computers. Through this cable the XEP80 receives comma1}nds and data from the computer and sends them to either the screen or the printer. The 8 bit parallel port allows Eps1}on, Centronics, etc. type printers to be connected to the XEP80, which means the Atari Computer may now output to these p1}rinters. The parallel connector is a female 25 pin D type. Audio may be supplied via a video cable from the Atari com1}puter DIN plug to any suitable audio speaker input. This is required for any SOUND commands or keypresses. Software1} is provided on diskette in the form of a DOS binary file named AUTORUN.SYS. This file is automatically loaded into memory 1}and initialized by the DOS at boot (power on) time. NOTE: The "*" character used throughout this document means tha1}t a 0 or 1 may be substituted. In the case of an 8 bit value, the description "0 0 * * * * * *" will allow 00 through $3F1} as valid input. Page 3 2.0 Physical In1}terface The Joystick port will use two lines for interfacing. One PIA line for input from the XEP80 and one PIA line1} for output to XEP80. Both the XEP80 and computer will share a common ground line. Either joystick port (1 or 2) may be u1}sed with the supplied software. MALE (XE/XL/800/400) COMMUNICATION PORT PIN CONFIGURATIONS: JOYSTICK 1 1} JOYSTICK 2 ______________________ ______________________ \ 1 2 3 4 5 / \ 10 111} 12 13 14 / \ / \ / \ 6 7 8 9 / \ 15 16 17 18 /1} \______________/ \______________/ PIN FUNCTION 1 Data to XEP80 21} Data from XEP80 3-7 Not Used 8 Common Ground 9 Not Used 10 Da1}ta to XEP80 11 Data from XEP80 12-16 Not Used 17 Common Ground 18 Not Us1}ed FEMALE (XEP80) PARALLEL PRINTER PORT PIN CONFIGURATION: __________________________________________ \ 1}13 12 11 10 9 8 7 6 5 4 3 2 1 / \ 25 24 23 22 21 20 19 18 17 16 15 14 / \___________________________1}_________/ PIN FUNCTION 1 Strobe 2-9 Parallel Data 10 Not Used 1} 11 Busy 12-17 Not Used 18-25 Ground Page 41} 3.0 Software Interface 3.1 General Description The software interface to the XEP80 on the 81} bit computer side is a disk booted handler. This handler replaces the E:, S:, and P: vectors in the Handler Address Tabl1}e ($31A). Loading of the handler is as follows: A DOS disk containing the handler must be in drive 1. The computer is1} powered on, causing a disk boot. The DOS is loaded in and initialized. The DOS init code looks for the file AUTORUN.SYS 1}on the boot disk and loads it. The XEP80 handler must be named AUTORUN.SYS to be loaded at boot time. The handler file is1} loaded into RAM at address $3000 and continuing upward approximately 1.5K bytes. The file consists of a relocater po1}rtion followed by the actual XEP80 handler. After the file is in memory, DOS causes the init code of the handler to execu1}te. This init code is the relocater which uses a variable called MEMTOP ($2E5,2E6) to find the last address of user (non-1}system) RAM. MEMTOP is then decremented by the relocater to point to an address about 1.5K below its old value. This will m1}ake room for the handler portion to be moved to those addresses. This address space into which the handler will be loaded1} is just below the normal screen RAM and display list address space. While the relocater moves the handler to its pro1}per location, it resolves all absolute address references within the handler code. Thus the handler code comes from disk 1}in a relocating format (see Appendix B). After the handler has been moved, the relocater sets the DOSINI vector ($0C) to 1}point to the handler init code, sets an address within the handler to point to the old DOSINI code, then jumps to the handl1}er init code. The handler init sequence sets up the PIA registers to communicate to the XEP80, modifies the Handler1} Address Table (HATABS $31A), sets new screen margins, and determines whether the system is NTSC (60 Hz) or PAL (50 Hz). 1}At this point the init code checks the position of the SHIFT key. If the key is pressed the code leaves the 40 column scree1}n on and exits. If the key is not pressed the code then disables the ANTIC chip from display so that XEP80 I/O can begin.1} The handler now exits back to DOS, which then exits back to the OS, which then decides which application to run (for1} example the BASIC cartridge) and jumps to that code. As long as the application makes I/O calls for the screen and print1}er through the normal OS CIO calling conventions, the XEP80 handler will intercept them and pass data on to the XEP80 dev1}ice. Page 5 3.2 Functional Description 3.2.1 Screen Operations1} The handler will monitor and communicate the following locations to the XEP80 and will update them if the XEP80 cause1}s a change: $055 Cursor X Position COLCRS (low byte) $056 Cursor X Position (high) for range checking 1} $054 Cursor Y Position ROWCRS The following locations will be monitored and communicated to the XEP80: 1} Default: Optional: $2FE List Flag DSPFLG ............ $00 (OFF) 1} $01 (ON) $2F0 Cursor On/Off Flag CRSINH ... $00 (ON) $01 (OFF) $052 Cursor Left Margin LMARGN ... 1}$00 (XEP80) $XX (ANY) $053 Cursor Right Margin RMARGN .. $4F (XEP80) $XX (ANY) $2F4 Character Base 1}CHBAS ........ $E0 (ATASCII) $CC (ICM) The following locations will be monitored and acted upon by the handler to 1}emulate screen editor operations: $2FF Start/Stop Screen Output Flag Y Reg EOF Status (CNTL 3 Keystroke) 1}and BREAK Key Logical lines of text on the screen may encompass more than one physical line. The length of each phys1}ical line within a logical line is determined by the left and right margins. Up to 24 physical lines may be included with1}in one logical line. Tabs are set at 2,7,15,23,31,39,47,55,63,71,79,87,95,103,111,119, 127,135,143,151,159,167,175,11}83,191,199,207,215,223,231,239,247,255. These are the default settings and may be changed with the set and clear tab cont1}rol characters. Tab values only apply to physical lines, thus a logical line of two or more physical lines will have its ta1}b stops repeated on each physical line. The 40 column ANTIC screen may be enabled with a command in the event the 1}user wishes color graphics, 40 column text, or has no 80 column monitor. The parallel printer is still operational in this 1}mode. Graphics is enabled by a special OPEN command to "S:". In this mode the screen is 320 dots (40 bytes) by 200 l1}ines. The cursor will be in the upper left hand corner of the screen awaiting data transfer. Each character sent to the X1}EP80 will be displayed in sequence; all 8 bits will correspond to consecutive dots across a scan line. The MSB will be di1}splayed first and the LSB is last. The status line is Y cursor value 24. This line may be used for input or output, 1}however control characters do not edit, but only print in this line. One control is allowed, SHIFT DELETE. The line does no1}t scroll. Be careful not to accidently POSITION or POKE the cursor into this line while the BASIC command line processor 1}is active as it may require use of the Reset key to recover from a lockup that can occur on this line. 1} Page 6 3.2.1.1 Editor Screen "E:" Handler The following functions will be supported by 1}the supplied handler and will emulate the 8 bit screen handler (editor): Open Assign edit handler to IOCB #N 1}and clear screen. If AUX1 is $2C screen will not be cleared. Close Unassign handler from IOCB #1}N. Get Char Get line of text until EOL (INPUT in Basic). The special read mode (read a line of the1} screen without keyboard input) is also supported by setting AUX1 of calling IOCB to $0D.1} Put Char Put a character to the screen or do editing functions (PRINT or PUT in Basic). See chart1} below. Get Status Return default "on line" status Special Send commands to and receive status from XEP80. 1} (XIO in Basic). AUX1 byte must be $0C, AUX2 is code to send, CMD below. Put Charact1}er Values ATASCII FUNCTION $1B Escape - Print next char even if a control char $1C Cursor1} Up $1D Cursor Down $1E Cursor Left $1F Cursor Right $7D Clear Screen 1} $7E Backspace $7F Tab $9B Atari EOL (CR/LF) $9C Delete Line $9D 1} Insert Line $9E Clear Tab $9F Set Tab $FD Sound Bell - Not Available (See item 6 belo1}w) $FE Delete Character $FF Insert Character Items: 1) Put Char will advance cursor. 1}2) Get Char will advance cursor. 3) At logical end of line a new line will be inserted. 4) At non EOL put1} will overwrite characters. 5) The XEP80 E: handler may be disabled by pressing the SHIFT key at power1} on or during RESET. 6) The bell sound has been disabled by the handler to improve the speed of charac1}ter output to the XEP80. An application may, however, use any of the SOUND statements (or the assem1}bly language equivalents) to generate noise, notes, etc. Page 71} Special Commands to "E:" CMD AUX1 AUX2 Function $14 $0C CMD - send command ($00-BF,D0-DF) to XEP81}0 (see 4.3.2) $15 $0C 00 - set normal character transmit mode $15 $0C 01 - set burst character transmit m1}ode $16 $0C CMD - send input command ($C1-C6) to XEP80 (see 4.3.4) response is stored in loca1}tion $2EB $18 $0C 00 - exit 40 col screen, enter and clear XEP80 screen $18 $2C 00 - exit 40 col screen, 1}enter 80 with no clear screen $19 $0C 00 - exit XEP80 screen, enter 40 col screen 3.2.1.2 Static Screen "S:"1} Handler Open Assign screen handler to IOCB #N (Graphics see below) Close Unassign handler from IOC1}B #N Get Char Get a character and advance cursor (Basic LOCATE) Put Char Put a character to the screen - no1} editing functions Get Status Return default "on line" status Special No action Items: 1) Put char will 1}advance cursor and possibly insert lines. 2) Get char will advance cursor but not insert lines. 3) Get char1} over blank will return $20 (SPACE). 4) Put EOL ($9B) will move cursor to left margin of next line. 5) A GR1}APHICS 8+16 will set graphics mode on the XEP80. Or if IOCB #N is opened with AUX1=$1C and AUX2=08. 6) W1}hen in graphics mode on the XEP80 the cursor is initially in the upper left hand corner of the graphics window. E1}ach byte sent to the XEP80 will be placed on the screen as a series of 8 dots (MSB to LSB) correspond1}ing to the binary value of the byte or ATASCII value of the character. The cursor then moves over 8 d1}ots to the right to show where the next byte will be placed. When the cursor reaches the right edge o1}f the window it moves to the left edge and down one line. 7) Currently Put char sends ESC followed by th1}e character. This will give two bytes per put in graphics mode. Therefore use Put char through E: whe1}n transmitting graphics data. 8) The graphics mode command automatically sets burst mode. 9) The handler wi1}ll support standard ANTIC graphics calls while in 40 col mode, provided enough room has been allocated in 1} RAM. For normal boot environments this means GRAPHICS 1,2, 3,4 only. 1} Page 8 3.2.2 Printer Operations The XEP80 will also output single characters to the printer port thr1}ough a 2K internal buffer. Data presented to the printer by the handler may be interpreted in one of three ways: No 1}Translation - All 8 data bits of character information will be passed to the printer port. Light Translation - ATASC1}II EOL ($9B) is translated by the printer handler to the CR and LF characters before transmission to the printer. This is1} the default printer mode. Optionally, only the CR may be sent for EOL. Heavy Translation - Light translation plus A1}SCII characters below $20 will be translated to a "^" character (for CONTROL) followed by the corresponding letter before1} being sent to the printer. The MSB will be set to 0. The printer output may be directed to either the XEP80 (parall1}el) or serial ports or both. The unit number (such as P2:) may be kept or altered depending upon the need. See chart belo1}w. Calls to "P:" Open Assign printer handler to IOCB #N and issue status request to pri1}nter. AUX1 must be 08 (Write only). Close unassign handler from IOCB #N Get Char Not supported Put1} Char Send a character to the printer port Get Status Returns status of printer BUSY line, 1=available, 1} 139=busy or off line. Special Configure printers and select translate mode (see chart belo1}w). Do before OPEN to printer. Page 9 Special Configur1}ation Command to P: Command byte =$17 Configuration Byte Assignments for AUX1 +-+-+-+-+-+-+-+-+ |7|6|5|4|31}|2|1|0| Bit positions +-+-+-+-+-+-+-+-+ 0 0 0 0 0 * * 0 P1: - Parallel Port 0 0 0 0 0 * * 1 P1}1: - Serial Port as P1: 0 0 0 0 0 0 0 * P2: - Serial Port as P2: 0 0 0 0 0 0 1 * P2: - Serial Port as P1}1: 0 0 0 0 0 1 0 * Reserved 0 0 0 0 0 1 1 * P2: - Parallel Port 0 0 0 0 1 * * * Reserved 2} 0 0 0 1 * * * * " 0 0 1 * * * * * " 0 1 * * * * * * " 1 * * * * * * * " Configu2}ration Byte Assignments for AUX2 0 0 0 0 0 0 0 0 Light translation - EOL to CR/LF 0 0 0 0 0 0 0 1 No t2}ranslation 0 0 0 0 0 0 1 0 Heavy translation - EOL to CR/LF 0 0 0 0 0 0 1 1 Reserved 0 0 0 0 0 12} 0 0 Light translation - EOL to CR 0 0 0 0 0 1 0 1 No translation 0 0 0 0 0 1 1 0 Heavy translation2} - EOL to CR 0 0 0 0 0 1 1 1 Reserved 0 0 0 0 1 * * * " 0 0 0 1 * * * * " 0 0 1 * * *2} * * " 0 1 * * * * * * " 1 * * * * * * * " Note - P3 through P15 are not alterable; they rem2}ain unaffected by the handler and are directed only over the serial bus. 2} Page 10 4.0 Communications Interface 4.1 Communication Fundamentals Communication 2}with the XEP80 will be handled by sending serialized data over bit 0 or 4 (JOY0,JOY1) and receiving serialized data over bi2 }t 1 or 5 (JOY0,JOY1) of the PIA A I/O register. Data will be shifted at 15.7KB. Transmitted and received data will each c2 }ontain 9 bits of infor- mation . Data will be shifted out as follows: a start bit of value zero, followed by bits D0 thro2 }ugh D7, followed next by a control bit to indicate whether data (0) or command (1) information has been sent, then terminat2 }ed with a stop bit of value 1. Currently the supplied handler will provide data shifting on the computer end. Any applica2 }tions that do not use the handler or drive the XEP80 at a different baud rate must provide code for this. It must be unde2}rstood that this code is time critical in operation, so all 6502/ANTIC cycles must be accounted for during data shifting.2} An alternate transmit/receive mode, "burst mode", allows faster transmit times. The XEP80 to computer data line (rece2}ive line) is high (1) when characters may be sent and it is a low (0) when the XEP80 is busy. Thus no cursor information 2}is returned. This mode applies only to characters to be sent to the screen (including control characters) and characters se2}nt to the printer (the only mode for the printer). Burst mode does not apply to commands of any sort. Any custom h2}andler that sets burst mode must be aware of how to handle communication from that point. When waiting for a cursor o2}r character (non burst mode) monitor the data-in line immediately after transmitting a byte. When in burst mode wait 2}at least 90 usec before testing the data-in line for 0 (busy) or 1 (ready). Do not allow any 6502 interrupts when tra2}nsmitting or receiving the serialized data, as this will modify the baud rate timings. Interrupts may be allowed whil2}e waiting for the XEP80 to go ready in burst mode. Thus other interrupt driven processes such as a modem handler will not2} lose characters. Page 11 4.2 Communication Protocol 2} Characters sent to the XEP80 will cause a 1 or 2 byte cursor to be returned - see 4.3.1 and 4.3.6 Commands ar2}e subdivided into three groups: 1) Stand alone commands - no response expected - see 4.3.2 2) Get Character - c2}haracter and cursor returned - see 4.3.3 3) Get Data commands - data byte only returned - see 4.3.4 Cursor value2}s returned from XEP80 are determined by following logic: 1) If only Y cursor has changed, only Y is returned 2)2} If only X cursor has changed, only X is returned 3) If both have changed both are returned (X is returned first) 2} 4) If neither changes only X is returned COMPUTER XEP80 1 CMD--> Stand alone command 2}2 CMD--> Get data command <--CHAR Return value 3 CMD--> Get charact2 }er command <--CHAR Return character <--CURSOR X and X cursor 4 CMD--> 2!} Get character command <--CHAR Return character <--CURSOR Y and Y cursor 5 2"}CMD--> Get character command <--CHAR Return character <--CURSOR X and X a2#}nd Y cursor <--CURSOR Y 6 CHAR-> Output character <--CURSOR X Return X c2$}ursor 7 CHAR-> Output character <--CURSOR Y Return Y cursor 8 CHAR-> 2%} Output character <--CURSOR X Return X and Y cursor <--CURSOR Y 9 CHAR-> 2&} Burst Mode - send character ___. .___ High (1) Ready |_____| Low (0) Busy 2'} Page 12 4.3 Command/Data Values 4.3.1 Data Output - Return Cursor +-+-+-2(}+-+-+-+-+-+-+ |8|7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+-+ 0 * * * * * * * * Character to be output ($00-FF2)}) (3.2.1.1, 3.2.2) 4.3.2 Stand Alone Command - No Information Returned +-+-+-+-+-+-+-+-+-+ |8|7|6|5|4|3|2|1|2*}0| +-+-+-+-+-+-+-+-+-+ 1 0 0 * * * * * * Horizontal Cursor Position ($00-3F) 1 0 1 0 0 * * * * Hor2+}izontal Cursor Position ($40-4F) 1 0 1 0 1 * * * * Horiz Curs Pos High Nibble - for wide screen 1 0 1 1 0 * 2,}* * * Left Margin Low Nibble - sets high nibble to 00 1 0 1 1 1 * * * * Left Margin High Nibble 1 1 0 0 02-} * * * * Vertical Cursor Position ($00-0F) 1 1 0 0 1 0 * * * Vertical Cursor Position ($10-17) 1 1 0 0 1 2.}1 0 0 0 Set Cursor to Status Row ($18) See caution, Pg. 6 1 1 0 0 1 1 0 0 1 Set Graphics to 60 Hz 1 1 0 02/} 1 1 0 1 0 Modify Graphics to 50 Hz 1 1 0 0 1 1 0 1 1 Reserved 1 1 0 0 1 1 1 * * Reserved 1 1 020} 1 0 * * * * Right Margin Low Nibble - sets high nibble to 04 1 1 0 1 1 * * * * Right Margin High Nibble 21}1 1 1 0 1 0 0 0 0 Clear List Flag 1 1 1 0 1 0 0 0 1 Set List Flag 1 1 1 0 1 0 0 1 0 Set Screen Normal 22}Mode - cursor returned each char 1 1 1 0 1 0 0 1 1 Set Screen Burst Mode - no cursor returned 1 1 1 0 1 0 1 23}0 0 Select Character Set A - Atari graphics (ATASCII) 1 1 1 0 1 0 1 0 1 Select Character Set B - Atari internati24}onal 1 1 1 0 1 0 1 1 0 Select XEP80 Internal Character Set 1 1 1 0 1 0 1 1 1 Modify Text to 50 Hz Operati25}on 1 1 1 0 1 1 0 0 0 Cursor Off 1 1 1 0 1 1 0 0 1 Cursor On Continuous 1 1 1 0 1 1 0 1 0 Cursor26} On Blink 1 1 1 0 1 1 0 1 1 Move Cursor to Start of Logical Line 1 1 1 0 1 1 1 0 0 Set Scroll Window to C27}ursor X Value 1 1 1 0 1 1 1 0 1 Set Printer Output 1 1 1 0 1 1 1 1 0 Select White Characters on Black Bac28}kground 1 1 1 0 1 1 1 1 1 Select Black Characters on White Background 1 1 1 1 * * * * * Reserved29} Page 13 4.3.3 Get Character Command - Data byte and cursor returned (4.3.5, 42:}.3.6) +-+-+-+-+-+-+-+-+-+ |8|7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+-+ 1 1 1 0 0 0 0 0 0 Get Charact2;}er from XEP80 at cursor (and advance) 4.3.4 Get Data Command - Data byte returned (4.3.5) +-+-+-+-+-+-+-+-+-+ 2<} |8|7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+-+ Command Function for XEP80 Byte Returned 1 1 1 0 0 0 0 0 1 R2=}equest Horizontal Cursor X Cursor Value 1 1 1 0 0 0 0 1 0 Master Reset 01 1 1 1 0 0 0 02>} 1 1 Printer Port Status 00=busy 01=on line 1 1 1 0 0 0 1 0 0 Fill RAM with previous char 01 2?}1 1 1 0 0 0 1 0 1 Fill RAM with space ($20) 01 1 1 1 0 0 0 1 1 0 Fill RAM with EOL ($9B) 01 1 12@} 1 0 0 0 1 1 1 Reserved 1 1 1 0 0 1 * * * " 2A} Page 14 4.3.5 Received Data - Normal Communication Mode +-+-+-+-+-+-+-+-+-+ |8|7|6|5|4|3|2|1|0| 2B} +-+-+-+-+-+-+-+-+-+ 0 * * * * * * * * Character from Screen or H. Cursor if requested 4.3.6 Received Cursor 2C}- Normal Communication Mode +-+-+-+-+-+-+-+-+-+ |8|7|6|5|4|3|2|1|0| +-+-+-+-+-+-+-+-+-+ 1 0 0 * * 2D}* * * * H. Cursor Position ($00-3F) Vert does not follow 1 0 1 0 0 * * * * H. Cursor Position ($40-4F) Vert does2E} not follow 1 0 1 0 1 0 0 0 0 H. Curs Pos >4F No Vert Follows - see note 1 0 1 0 1 0 0 0 1 Reserved 2F} 1 0 1 0 1 0 0 1 * Reserved 1 0 1 0 1 0 1 * * Reserved 1 0 1 0 1 1 * * * Reserved 1 0 1 1 * * 2G}* * * Reserved 1 1 0 * * * * * * H. Cursor Position ($00-3F) Vert follows 1 1 1 0 0 * * * * H. Cursor 2H}Position ($40-4F) Vert follows 1 1 1 0 1 0 0 0 0 H. Curs Pos >4F Vert Follows - see note 1 1 1 0 1 0 0 0 1 2I} Reserved 1 1 1 0 1 0 0 1 * Reserved 1 1 1 0 1 0 1 * * Reserved 1 1 1 0 1 1 * * * Reserved 2J} 1 1 1 1 0 * * * * V. Cursor Position ($00-0F) 1 1 1 1 1 0 * * * V. Cursor Position ($10-17) 1 1 1 1 12K} 1 0 0 0 V. Cursor Position for Status Line ($18) 1 1 1 1 1 1 0 0 1 Reserved 1 1 1 1 1 1 0 1 * Reserve2L}d 1 1 1 1 1 1 1 * * Reserved Note - when "Horizontal Cursor Position Greater Than $4F" byte is received, t2M}he computer may obtain the actual value with the "Request Horizontal Cursor from XEP80" command. 2N} Page 15 Appendix A Application Notes 1) Characters may be printed over EOL2O}s in the right margin column without causing insert lines to occur by setting the right margin at least one more column t2P}o the right. 2) The firmware of the XEP80 uses just under 2K of the available address space - thus allowing rom replac2Q}ements to incorporate additional features. 3) Debug mode allows reading of the parallel port so with the addition of a2R} latch on the XEP80 board the port becomes bidirectional. 4) If large text screen (greater than 80 columns wide) needs t2S}o be erased use the Fill XEP80 RAM with EOL command rather than the Clear Screen char. Clear Screen only clears the curre2T}nt 80 column 24 line high window. 5) X Cursor > $4F is handled by the handler. The handler automatically sends the Req2U}uest Horizontal Cursor command to the XEP80 whenever a $50 cursor X value is returned. 6) When using the XEP80 Interna2V}l Character Set issue the Fill XEP80 RAM with Space command to blank the screen. However, when sending characters to the 2W}XEP80 screen, either precede each one with an ESC character or set the LIST flag so that screen edits do not occur. 7)2X} Graphics 8 screen dumps will require a short discussion. Since the OS requires 8K RAM to set up a mode 8 screen the handle2Y}r cannot reside in its standard address space. An appended AUTORUN.SYS file must first set the MEMTOP pointer to 8K below2Z} the top of RAM (check actual mode 8 value). Then the relocater will move the handler below this point. After entering 40 c2[}ol mode the GRAPHICS 8 call may be made. Plotting etc. to the screen is through the normal S: interface of the OS. When d2\}one the application will set XEP80 mode then set XEP80 graphics, then read from the ANTIC screen RAM and output to the XE2]}P80. 8) Changing default printer configuration at boot time is shown by disk program PRINTER.BAS on the system diskett2^}e. Page 16 Appendix B Relocater Format for XEP80 Ha2_}ndler Values in Boxes are in HEX Format AUTORUN.SYS File Format Relocating Format of Handler 2`}+-------+ +----+ | FF,FF | DOS Load File +--| XX | Link byte to first +-------+ 2a} | +----+ Relocate byte | 00,30 | Start Address=$3000 | : : +-------+ 2b} | : : Valid 6502 Code | LO,HI | End Address | +----+ +-------+ +->|2c} XX | High Byte to relocate : : Relocater +----+ add offset : : Code 2d} +--| XX | Link byte to second +-------+ | +----+ Relocate byte | LO,HI | Handler Lengt2e}h | : : +-------+ | : : Valid 6502 Code | 20 | JSR Instruction | +2f}----+ +-------+ for DOSINI set +->| XX | High Byte to relocate | LO,HI | by Relocater +----+ 2g} add offset +-------+ +--| 00 | Example Link of 0 | 4C | JMP Instruction | +----+2h} following byte is +-------+ to INIT code +->| XX | High byte to relocate | LO,HI | set by Relocater 2i} +----+ +-------+ +--| 80 | Special Case 80 means | 00,00 | Printer Aux bytes | 2j}+----+ skip 127 data bytes +-------+ | : : then treat byte 128 : : XEP 80 Han2k}dler | : : as the next link : : Code in +->+----+ : : Relocating Format 2l} +--| XX | Link +-------+ | +----+ | E2,02 | INIT Vector | | | Valid 6502 C2m}ode +-------+ | +----+ | E3,02 | for DOS +->| 00 | Dummy byte to Relocate 2n} +-------+ +----+ to maintain links | 00,30 | RUN Address | FF | Special Cas2o}e FF means +-------+ +----+ end of File 2p} Page 17 Appendix C Contents of System Diskette DOS.SYS DOS 2.5 DUP.SYS 2q} AUTORUN.SYS XEP80 Relocater and Handler XEP80.DOC This Document XEP80HAN.SRC Handl2r}er in assembly source RELOC.SRC Relocater in assembly source MAKER.BAS Program to generate 2s}AUTORUN.SYS WINDOW.BAS Examples for Owners Manual EIGHTY.BAS PRINTER.BAS GRAPHICS.BAS2t} DEMO80.BAS Demonstration program for XEP80 2u} Page 18 Demonstration program for XEP80 0