<H h =JJJJ97 _> 浭 굠9:a {)_:슙:ݹ !޹ d߹.习ٹ乭߭ m乪轌⹌㹭HHl * 8 ߹L ׵幹:  h? L ͺ¹ ? U0V ׵ b: 浭 )`Ȣ( h . hL  0 L`4L W U0O ַݹ: < 7߹ 8޹% 깍߹ɹ U ַ L> *L4L z r m ַ S 0E @0Dm鹍鹭빌 '빬i 0`L Ub L  H ׵h)_Y L 0 =02 ׵ O 0"( h 0ޢ `L)4L ˷ ַ  Ϸ =0ح빬 % O L0L LlLh ߹ 8޹ L¹ Lϵڹ¹ =L̵ ˷ % O ͇̈̈ Ol0jµ * ߹ ߹ɹٹ : (:)( ׵ ޹ L *LJL 浩 C = 9 5 1-)%!  L߹8޹޹L ٹ ` L ` ׵ !iA繌 °H; h @ 浭: 浬蹮``߹`H߹ݹ h )Hȹ:: h޹h߹ȩ u*? u :Hh.# u*? u ݹh ȹ?`: `: =.: ;<>`L(L%߹8޹L ׵蹹 h`빌`ɹɹ`ɹ깍߹` ߹g񹨹$ȹ N Đ İA8)Hmmhm𹐲ЭL¹ `L8LLLL޲LL[L{LZLLLNO SPACECAN NOT CLOSEALL FILES (Y/N)?READ ERRORNOT FOUNDFILE EXISTSLOAD ERRORCAN NOT OPENWRITE ERRORDIR SAVE ERA TYPE REN GO LOAD COM ؍ōŌŌŎ$PV 뼩ŭ mŪxyŌŭHHŬlōŌŭ ō , 뼩Ŭŭ`LLݼLLLLLL!L,LLLL-L4LLLLL?` ,é ­͘9 4Lvéŭō ¬ Lf^H8hΟ @ 08nŭō l sĭH8ō hLí: ĭ; L IL lí8 4L l sLȑHŠqh ¬ű L캠Lé L,é ,é L,íōũHhο`ȘH L| 7H 4é 4hL40:8` ĐAG`빬i빐Ȍ`빬칍ČĢ(`LKLDLULLL4L - R/O$ - BAD SECTOR TO IGNORE -- TO ABORT$ PEM ERROR ON $ - INVALID DRIVE$@  @?LaLL+L;LL%``LLLLLLLȩ``` (  C64 52K DOS/65 2.15 SIM 3.04 X   B Ȣr̎s̽Ɲ( ȭiLLLة(p̩$ ȩ&ǩ(nj)ǭ$Ǭ% ȭ&Ǭ' ȭ(Ǭ) )0p"(i(ǐ)&ǭ&"&$зi̍xLl* )*` +)*H*ǩ̩ ǩ h ۰8A [i ``HA)Rh G ǩ ǩ5 -  ǩ" ɝɀ HhHh `A[ a{)_` `A` `Ȍȭ L`HA)A)h LAh Hhk̭k  k L jȐk` ȭA)   L)i ȼ`v̌w`̌`ťu`M[i̽`jr`s莆̎莇Lɍ ̢̭$i̽ȍs̭̎t̬ṷ̍̌v̬w̭̍̌sys̭intfu^vVwṊi ȼȍ}Ɍ~ɠ͈̭̩̐̍s莅 ̩̭v̬w̍}̌~ J N~n}rHrh0ix ytzu}{~|9j ʭi̍x̭t̬u̍y̌z̭}̬~̍{̌|̭ ˍ̩j̩ʍ kʊ-v̪iʭimʍʩmʍʭʍʭʍʭ̍ʍʭ̍ʍʠj̹0  j ʭ` =ˍ`xi̭y̭̭̍{̍`xll ` ˩1 m -̢ k k` L@  C̠  8̢ 2˭ ˎˍ˭ ˎˍ˩k C̠  k L˩k k`U1:2 0 TT SS #B-P 2 0 Iآ08 i:` ̠ ՠ  ̠ ̠ L ˢ 0` ˢ ` ˢ ` ˢ `"?̇"?KKKKC64S304 ASM012489:;COPY COMDEBUG COMC64S304 ASMe<=>?@ABCKLMNOSYSSTAT BAS ALLOC COMEDIT COM#COMPILE COMM !"#$RUN COMV%&'()*+,-./SYSGEN COM:QSTUVWXYMAKECOM COM3FILESTATBAS+67`abcCOMPARE COM5ASM COM3DEFGHIJC64B211 ASM Z[C64L210 ASM\]^_FILESTATINTdjMORE COMRSYSSTAT INT C64S304 KIM!PefghC64B211 KIMiL(COPYRIGHT (C) 2008 - RICHARD A. LEARY_ 8   8  =H ]O W '0/ȱȱ Hehe=Ax "ȱp L Ll L L в   8 i l      IRQ/BRK VECTOR SET$CAN NOT SET IRQ/BRK VECTOR$ȱ`Hh`h``l(   ?L F  -  2깴a {)_슙 I L' XL: } L=L 9L* L LوL L ȭ LI-   ` [ [ [ [ [ H RhL' 9R L F L' D5 hmiL  L[ ' F   iL' S/  L' L  g   L' F(L x g    L' L3  ? +L' L   + L' GL L  L 2  ,0  a   = EL L  ,0,  a   = E a    = EHHH@L'   T)ȹ:ȹ6. 1 .ȹ  `L  L|mmHhL iȌL  L L 8逍H `h ` `  g $b^; U  mHmhHhLmL     L  `L` [ a  l   [   -  )!.     -`  l  a  [ ( *. a{)_ *L g  LL ` 8 '`  a J J") JJJJJ))) JJJ ȈH  ` Ȑh<.*i  詹  `  ` +Ș `L`  l-  `8m`  /, *ȹ,  ,L,L `( %"?*=_.: ;<>`L.....` L(KKKK()`   *`L00":0 A0Gi *****..`8`) 0:0iLHJJJJ RhLR `L````````` ? L' ` `   H ,h`(L:) l gL` `L`` g zȢ `HH)hh(lhh(hhh8% m 8L iHHHL=`<8` ;!A` F ?8 8`  AXYSNV@BDIZC@E@ 0"E3@ @E3@ @E@ "D3ЌD"D3ЌD"D3@ "D3@ bx!YMJؤ#;dos/65 system interface module (sim) ;for C64 and SYSGEN 2.15 ;version 3.04 ;based on my S-100 6502 SIM 3.01 and both BIOS65.ASM & BIOS80.ASM ;as well as C64S302.ASM. ;for the C64 CP/M cartridge. ;released: 5 april 2008 ;last revision: ; 5 april 2008 ; corrected linefeed character ; changed to 40 char per line ; changed to 25 lines per screen ; made iotype initialized to 1 & in fixed location ; eliminated use of data in conout ; corrected error near end of conin ; added jsr clall at cold boot start ; forced function keys to return space ; corrected error in read code after la3f ; corrected & added drive select logic ; increased to 10 pages ; modified console in & out for delete & bs ; changed key code for DEL ; removed conin test for BS ; modified warm boot to use full sim deblocking ; corrected one entry in key code table for "=" ; corrected track numbering ; reduced allocation map to 17 bytes (8*17=136) ; changed CDB entries & conout code ; 6 april 2008 ; in]#)i#$S#$S[[i$$)|mi)S4i#bZH&bTDThDt(ntJrtttrDh2"&&rr&HDDCOM NEXT ADDRESS= * A X Y S NV?BDIZC ` NEXT ADDRESS= * A X Y S NV?BDIZC `0F611C9000A0D ;180D88D009ADB414ACB5144C620DC901F0034CAE1120F40EADB4140A8A ;180DA0ACB51438E9808DB414B004888CB51448982037116820371109D9 ;180DB820EA1160A9808DB9140A8DBA14203E1220C210C924F062C90AAA ;180DD01AF05EC93BD0F120E710F0558DBB1420E7108DB51420E7100C5E ;180DE8186DB0148DB41448ADB5146DB1148DB514A86848C90098E90B93 ;180E000268B0034CAE11186DBB149001C8CD561398ED571390034C08FF ;180E18AE1120E71020B314209011CEBB14D0F220E71020E7104CC80A5D ;180E300D20F40EADB514203711ADB4144C3711208311905B2038120775 ;180E48ADcreased to 52K ; 7 april 2008 ; changed from internal keyboard scanning to use of kernel ; enabled interrupts ; reintroduced flashing control ; added quote mode control to conout ; 9 april 2008 ; added blank dcb table entries for drives 2-7 (c-h) ;base addresses msize = 52 ;memory size in 1k blocks pages = 10 ;pages in sim wbtjmp = $100 ;warm boot entry pemjmp = $103 ;pem entry iostat = $106 ;io status byte dflbuf = $128 ;default buffer ;C64 KERNAL (kernel) entry points & assigned memeory flash = $cc ;enable cursor flas if 0 cursor = $cf ;cursor chaaracter (BLNON in PRG) qtsw = $d4 ;quote mode 0=no SETLFS = $FFBA ;set LA, FA, SA SETNAM = $FFBD ;set length & file name address OPEN = $FFC0 ;open logical file CLOSE = $FFC3 ;close logical file CHKIN = $FFC6 ;set channel in CKOUT = $FFC9 ;set channel out CLRCH = $FFCC ;restore default channel BASIN = $FFCF ;input from channel BSOUT = $FFD2 ;output to channel GETIN = $FFE4 ;get a character (normally keyboard) CLA8) 8  i i ? L0 L0 L0    $0   $ & L0 !  !  L0 ! L0  < q $ ! L0 +  !  `LLLLLLLL۠ ` ` ` L   &  L0 `iڥ `   ` ! L0 iDOS Error - Aborting$ :݈ ݽ ` ܪȘ :݊L: Fݩ- ݢ `KKKKrem basic-e/65 system status routine for dos/65 rem Version 2.17 rem Yes, I know it is slow but it sure is easier to write rem released: rem 10 april 2008 rem last revision: rem constant definitions rem tea must be set to correct address for system tea=2048 rem following five lines calculate and save special rem i/o links in RUN.COM pem=tea+9 sim=tea+12 a.reg=tea+15 y.reg=tea+16 x.reg=tea+17 rem these two parameters are the same for all versions pem.entry=259 dfl.buf=296 e5=229 rem set up block size array dim blk.size$(5) blk.size$(0)="1KB " blk.size$(1)="2KB " blk.size$(2)="4KB " blk.size$(3)="8KB " blk.size$(4)="16KB " rem set up hex digit array dim hex$(16) hex$(0)="0" hex$(1)="1" hex$(2)="2" hex$(3)="3" hex$(4)="4" hex$(5)="5" hex$(6)="6" hex$(7)="7" hex$(8)="8" hex$(9)="9" hex$(10)="A" hex$(11)="B" hex$(12)="C" hex$(13)="D" hex$(14)="E" hex$(15)="F" rem set up 2**n array for hex conversion dim bin.mod(4) bin.mod(0)=1 bin.mod(1)=16 bin.mod(2)=256 bin.mod(3)=4096 rem set up dcb address table dim dcb.tbl(8) rem set up dcb contents table dim dcb(8,8) print "DOS/65 System Status - V2.10-A" rem first display TEA start a=tea gosub 9070 print "TEA set to ";tea;"or ";a$ rem now display PEM start address pem.start=peek(pem.entry+1)+(256*peek(pem.entry+2)) a=pem.start gosub 9070 print "PEM starts at ";pem.start;"or ";a$ rem calculate amount of free memory from TEA to PEM free=pem.start-tea a=free gosub 9070 print "Available memory is ";free;"or ";a$ rem determine how many disks are defined rem first get and save default drive poke x.reg,25 rem get default dfl.drv=call(pem) and 255 poke x.reg,13 rem reset system dummy=call(pem) rem now try to select all eight drives allowed through SIM num.drvs=0 for i=0 to 7 a=i gosub 9010 dcb.tbl(i)=dcb.addr if dcb.addr <>0 then num.drvs=num.drvs+1 next i rem reset drive to default a=dfl.drv gosub 9000 rem print number of drives defined print num.drvs;"drives defined" rem populate dcb table with dcb contents for i=0 to 7 if dcb.tbl(i)<>0 \ then \ dcb(i,0)=peek(dcb.tbl(i))+(256*peek(dcb.tbl(i)+1)): \ dcb(i,1)=peek(dcb.tbl(i)+2)+(256*peek(dcb.tbl(i)+3)): \ dcb(i,2)=peek(dcb.tbl(i)+4)+(256*peek(dcb.tbl(i)+5)): \ dcb(i,3)=peek(dcb.tbl(i)+6): \ dcb(i,4)=peek(dcb.tbl(i)+7)+(256*peek(dcb.tbl(i)+8)): \ dcb(i,5)=peek(dcb.tbl(i)+9)+(256*peek(dcb.tbl(i)+10)): \ dcb(i,6)=peek(dcb.tbl(i)+11): \ dcb(i,7)=peek(dcb.tbl(i)+12)+(256*peek(dcb.tbl(i)+13)) next i rem print dcb contents for i=0 to 7 if dcb.tbl(i)<>0 \ then \ print tab(2);"Drive ";i;"has": \ print tab(5);dcb(i,0)+1;blk.size$(dcb(i,3));"blocks,": \ print tab(5);dcb(i,1);"records per track,": \ print tab(5);dcb(i,2);"system tracks, and": \ print tab(5);dcb(i,4)+1;"directory entries" next i stop rem subroutines 9000 rem set drive to value in a through pem poke a.reg,a poke x.reg,14 dummy=call(pem) return 9010 rem set drive to value in a through sim rem and get dcb address poke a.reg,a poke x.reg,27 dcb.addr=call(sim) return 9050 rem restore default drive a=dfl.drv gosub 9000 return 9070 rem convert decimal number in a to rem hexadecimal mnumber in $a. rem if a<0 or >65535 print error rem message and abort program if (a<0) or (a>65535) \ then \ print "Illegal 16 bit number aborting": \ stop a$="$" rem do four digits for i=1 to 4 for j=1 to 16 a=a-bin.mod(4-i) if a<0 \ then \ a=a+bin.mod(4-i): \ a$=a$+hex$(j-1): \ goto 9071 next j 9071 next i return KKKK end  if a<0 \ then \ a=a+bin.mod(4-i): \ a$=a$+hex$(j-1): \ goto 9071 next j 9071 next i return 1$0$2048$9$12$15$16$17$259$296$229$5$2$3$4$16$2$3$4$5$6$7$8$9$10$11$12$13$14$15$4$16$2$256$3$4096$8$8$8$256$2$25$255$13$7$7$256$2$256$3$2$4$256$5$3$6$4$7$256$8$5$9$256$10$6$11$7$12$256$13$7$2$5$3$5$5$2$5$4$14$27$65535$4$16$4$4$*........ .  . [ .[ !1KB .[ !2KB . [ !4KB . [ !8KB .[ !16KB  .[ .[ !0.[ !1.[ !2.[ !3.[ !4.[ !5.[ !6.[ !7.[ !8.[ !9.[ !A.[ !B.[ !C.[ !D.[ !E.[ !F .[ .[ !..[ !.. [ !.!."[ !.# .$[  .%[.&[ DOS/65 System Status - V2.10-A$46TEA set to $#or $$4.P.'.(P6PEM starts at $#or $$46Available memory is $#or $$4.)[[(Y.* .+[[(Y..6.,. 7[ !.7.6#drives defined$4.6.-. 7[ !.7[.[ ![ !P..[ !.P[.[ ![ !./P.0[ !.1P[.2[ ![ !.3P.4[ !.5P[.6[ ![ !.7P[.8[ ![ !.9P.:[ !.;P[.<[ ![ !.=P.>[ !.?P[.@[ ![ !.AP[.B[ ![ !.CP.D[ !.EP6ۀ.6/.F. 7[ !.7.GJDrive $#has$4.HJ[.[ !.#[.I[ ![ !$blocks,$4.JJ[.[ !#records per track,$4.KJ[.L[ !#system tracks, and$4.MJ[.N[ !.#directory entries$46[[(.O[[(Y[[(.P[[(Y..Q 7iIllegal 16 bit number aborting$4$.6.R. 7.6.S. 7.T[ !.7.U[ !.[ !666x$.6.R. 7.6.S$hn$ ~$`  H h$$ " 07$$$ $H $hQ-$? H $hϭ$`$$.$.$$-$ $$` $η$m$ ,$ H$ $hη$ LB!  !HH## hh$0 !8n$ ~$`$ 0* i)LL = $FFE7 ;close all files & channels ;pem constants on entry to write wrall = 0 ;write to allocated wrdir = 1 ;write to directory wrual = 2 ;write to unallocated ;module addresses memlng = msize*1024 ;memory length in bytes simlng = pages*256 ;sim length in bytes pemlng = 3072 ;pem length in bytes ccmlng = 2048 ;ccm length in bytes pem = memlng-simlng-pemlng ;pem start ccm = pem-ccmlng ;ccm start length = ccmlng+pemlng ;length less sim nsects = length/128 ;number sectors ;fixed parameters cr = $d ;carriage return lf = $a ;linefeed ;main program *= memlng-simlng ;start of sim ;jump vector used by pem sim jmp boot ;from cold start wboote jmp wboot ;from warm boot jmp const ;check for input jmp conin ;get input jmp conout ;send to terminal jmp list ;printer output nop ;punch output - dummy for now nop rts nop ;reader input - dummy for now nop rts jmp home ;home drive jmp seldsk ;select disk jmp seltrk ;set track jmp selsec ;set sector jmp setdma ;set buffer address jmp read ;read sector jmp write ;write sector lda #1 ;printer always ready rts ldx #128 ;clock entry rts ;translate record number ;input: ay = logical record number ;return: ay = logical record number if no translation or interleave ; physical sector number if translation nop ;translate - do not change logical # nop rts ;console definition block ;some do not fully implement the functions: ; clear to eol is a lf as recommended by SIG ; clear to eos is not implemented .byte 0 ;scratch .byte 8 ;backspace .byte 10 ;clear to end of line .byte 29 ;forward space .byte 1 ;normal video .byte 18 ;invert video .byte 25 ;lines per screen .byte 40 ;char per line .byte 12 ;formfeed .byte 19 ;home .byte 0 ;clear to end of screen ;I/O control byte ;as implemented there is no code in SIM to alter this but it is placed in a fixed location ;after CDB to allow for future changes by external or internal code ;bit 0 = ;bit 1 = ;bi  (2063)x6   ޠ  8逍de  =6: 01710 2eЬl   `U1:2 0 1 0 #KKt 2 = printer type - 0 if 1515, 1 if 4022 ;bit 3 = ;bit 4 = ;bit 5 = ;bit 6 = ;bit 7 = iotype .byte 1 ;opening id message opnmsg .byte cr,lf,"C64 52K DOS/65 2.15 " .byte "SIM 3.04",0 ;cold entry from loader boot ;first clear all files and channels jsr clall ;loader should do this but make sure ;now send a series of characters to screen to set it up lda #' ' ;set cursor sta cursor ;to space ;now enable interrupts and set up screen cli ;enable interrupts LDA #9 ;enable char set change JSR BSOUT ;output to channel LDA #14 ;switch to upper/lower case JSR BSOUT ;output to channel LDA #8 ;disable char set change JSR BSOUT ;output to channel LDA #147 ;clear & home JSR BSOUT ;output to channel LDA #CR ;return & do line feed JSR BSOUT ;output to channel ;next section addresses C64 specific setup lda #opnmsg jsr outmsg ;send it ;set up jumps into dos/65 in page one setup ldx #0 ;clear index ;first clear key dba &    8) " i ȱi    z = 0  1  Ω  )о z Lb z z      L8  ' i i'  t 8  i i h 8 d id h 8 i h Lt  0 ` L@ 1$2$4$8$16$ K BLOCKS FREE OF $ TOTAL$EAC142EAD14CAD0EBADBC148DB014ADBD140B57 ;1810B88DB1148EBC148EBD1460AEB914101720F611F00EC901F0030AD3 ;1810D04CAE11A91A8D2801A900AA8EB914EEB914BD2801297F60A90A7C ;1810E8008DBC148DBD1420F21020C210200111B004ADBC14604CAE099C ;18110011C9303022C93A300BC941301AC94710161869092A2A2A2A067F ;181118A2042A2EBC142EBD14B004CAD0F4603860290F0930C93A3008EC ;181130031869074CD811484A4A4A4A202911684C2911ADB5142037069E ;18114811ADB4144C3711ADAC14ACAD148DB4148CB51460ADAE14AC0A8A ;181160AF148DB4148CB51460ADB014ACB1148DB4148L(COPYRIGHT (C) 2008 - RICHARD A. LEARY6  : .; /9 08 17 2 U58 !  Lx LxHh5 ' ) Z 0  Ld Z  :Lx   k) + Z) + k) +) :Ld ""L Hޠ h ]^ ٠  z *? #Ġ   q L E # LdH # LIL f  ʆ L    L!   L! ? z  " L! f 3  f 833 z 3L!  L!  L!  L! L! L!   L!  L O 1LRLe    L ]L     ]L*  L   LS L Q 1 ) +Ld "-  z#  zL U f BI" jL C  jL D  L K  L L eL T L  * e " L $0 L A/ j   LI  jL F  L Le M5 1     $%L S-   L 8++J W L Xq    +L  + :Lx ,-,-, ,-$0 L:  5Lx #L L L 4  F4`2 2L 1L ` @ gL L L > 4 8 `H/  L h @ .L )` $4`LL LHH hhL  ` `LLL `L ` `LLL Z +5 ZL   ) # Ld(` Z.L_` Z(L_  0`(```` ` `````````ɮ `` `$ .`  Lp 7`  L$ .` L 7` L  Z _ 0LxLiLH  5Lxh.``)9` f `H #h` h    H hY`0`:)8``  U`H "*#&e"e#he zLi `   L LJdL `L L ` ` `  (2063)x6   ۠  8逍de  =6: 01710 2eЬl   `U1:2 0 1 0 #KKKL @L  ` Z8鮅"#F#f""`  _) 5Lxi"L "H h`8) gL ) #Lx k  Z)) B  k Z)LBa{8`` )_` / GL $%$%$$%L `$ L$  * e   f ( g g` Lj"#"2`  `   L$0*8 ɯ""`ee  !`$KȆ ` L`ʆɮ"` ץͥ`" j  !  H gh ڥ`Lj R`L  $ &'L &'&'&&  &'&'`&H h&' GL ()()L()()J(+ j`` +`BAK$$$EDIT - VERSION 2.03-A $COMMAND SUMMARY - s is sign - n is number [type # for max] sn to move right [s=+] or left [s=-] n lines and type line nA to Append n lines sB to move to Beginning [s=+] or end [s=-] snC to move n Characters right or left$ snD to Delete n characters right or left E to Exit nFstring to Find nth occurence of string H to return to Head of file I to Insert text snK to Kill n lines right or left snL to move n lines right or left$ nM to do Macro n times O to restart with Original file Q to Quit without altering file Rname to Read library file nSstring1[ctl-z]string2 to Substitute string2 for string1 snT to type n lines right or left$ nW to Write n lines nX to store n lines in temp buffer $NEW FILE$-(Y/N)?$PEM FILE ERROR (FULL?)$ AT $BREAK - $DESTINATION FILE EXISTS$MEMORY BUFFER FULL$LIBRARY FILE ERROR$CAN NOT DO COMMAND SPECIFIED TIMES$UNRECOGNIZED COMMAND$%HLIBX$$$$$$$LIBLIB11203910ADF514C9010A32 ;180A90F0034CD711ADFA14C92AD00620E2114CF20AADD914F0034C0B91 ;180AA8D711A200A000ADFA14D98813F00EC008B001E8C8C8C016D00CB8 ;180AC0F04CD711E004F009ADD8149DE8144CF20AC8ADD814F00DC90D84 ;180AD801F0034CD711B988138DD814B9881349FF2DEC140DD8148D0B3E ;180AF0EC14A200BD8F14F006200112E8D0F5ADE714206011ADE6140BCA ;180B08205B12ADE814205B12ADE914205B12ADEA14205B12ADEB140909 ;180B20205B12A208ADEC140A48A9009002A90120521168CAD0F14C0920 ;180B38270A203910AEF514ADDA14C952D00DE00290034CD7112046094E other variables stx hstact ;host buffer inactive stx unacnt ;clear unalloc count setupl lda inttbl,x ;get byte sta $100,x ;insert at start inx cpx #6 bne setupl ;loop until done lda #dflbuf ;and high jsr setdma ;and set lda sekdsk ;get disk jmp ccm ;and go to ccm ;initialization table inttbl .byte $4c .word wboote .byte $4c .word pem ;warm boot-read dos/65 back except sim and then ; jump to ccm. wboot ldx #$ff ;set stack txs ;pointer cld ;set binary mode ;set up parameters for warm boot lda #nsects ;get number sectors sta count ;and set count lda #0 ;set zero sta wbtrk ;clear track jsr seldsk ;and select drive zero lda #1 sta wbsec ;first record lda #ccm sta wbdma sty wbdma+1 ;first dma address ;the following uses SIM deblocking rdblk lda wbtrk ;get track ldy wbtrk+1 jsr seltrk ;and set lda wbsec ;get sector ldy wbsec+1 jsr selsec ;and set lda wbdma ;get dma address ldy wbdma+1 jsr setdma ;and set jsr read ;then do read and #$ff ;test for error bne rderr ;if error handle it ;first see if more dec count ;drop record count beq aldon ;done if zero ;adjust parameters for next record ;first do dma address clc ;clear carry lda wbdma ;get buffer address adc #128 ;and raise it sta wbdma bcc nodmaw ;skip if no carry inc wbdma+1 ;bump high ;now do sector but assume records per track = 34 nodmaw inc wbsec ;dump sector lda wbsec ;get new l  (2063)x6      8逍gh  B;: 01710 2gЬhЧl   `U1:2 0 1 0 #KKow cmp #34 ;see if past last bne rdblk ;if not record OK & track unchanged ;we now must reset record and increase track lda #0 ;starting record =0 after track 0 sta wbsec ;save it inc wbtrk ;bump track (0 to 1) bne rdblk ;loop always aldon lda sekdsk ;set default drive sta hstdsk jmp setup ;go setup rderr jmp ($fffc) ;go to kernel ;warm boot variables wbtrk .word 0 ;track (0 logical - SIM will translate to C64) wbsec .word 1 ;record (0 = BOOT, 1 = first CCM) wbdma .word ccm ;address ;character save chrsav .byte 0 ;saves last character from keyboard 0=none ;console status ;input: none ;return: a<>0 if character ready, a=0 if not const lda chrsav ;see if character still there bne constx ;done if one there jsr getin ;else try to get char and #%11111111 ;see if any bits set beq constx ;done if none sta chrsav ;save but do not convert constx rts ;console input - waits for character to be typed ;this routine should not display the character entered ;input: none ;return: character in a conin lda #0 ;turn on flash sta flash coninl jsr const ;check status and #%11111111 ;see if something there beq coninl ;loop if nothing lda chrsav ;get character pha ;save it lda #0 ;clear save sta chrsav lda #%00000001 ;turn off flash sta flash lda #' ' ;send space jsr conout lda #157 ;cursor left command jsr conout ;bypass filter pla ;get character back ;start processing character to get normal ASCII for most keys cmp #20 ;see iLCOPYRIGHT - RICHARD A. LEARY - 2008L .L O LO ,.0LL >//)`H @/h `/`STU/8SST'TSiSTi'T SSTTSiSTiT SdSTTSidS S Si S 0SLO $U00U O/8`  $` O  L - L-'j0  &0`-L  -0`L ,.` ...*. - -L ` ...`,.`0  -L j0L2 H h220` &L `Q j1`01 p4 O Oj1 O3 4 :4` p  -j05 j 6R6 j1 016ʆ3. 6 ` `5j0`55 ` j `  ` \`  L 86777   L ,-C,.0 ? O- O- O7 0- OL ^ O 48 Z-[-  4.L ,- *. " ./016 5:4+.$D+. :A-C.E.F.ҠB.DÌ..L $.` e )? `.` L L 0:`` a{`` .`` -.` )_ ` ` A[`` ` `L ` L%  .`;.@/C.L w/x/FG7/8/OP<.B/E.N w/x/JK7/8/QR=.A/D.M w/x/HI`H; hw/x/`H Q  2 QFG ,.0`.geȥhe`2  ń Lv$. LrL .  1 ; ? & QL/Ņ  &L$ &pqpqL/,.C1+L ,L C1$L @J`#L B `JKgh gh NN QL8B JKgh D LD1EN) NJ EEL B N  OPgh QL/E) B E)@2L 1L ,-0`= /  Q D  2BL x---- x p 4 ? x  L L PPQPPPPPPPPPPPPPPPPPPPPPPPPPPPPP P!P,7PPINSu   P )<aPPPPP P&22P,PP7<KPd zo]wPPPPP>C`; ?' @ Qrs LJrs  2LJ*4LJ:4LJ L`B`JKL8 `AL L ]L ` L ` L `C1AL Ai 1L `C1L `L `0L `L `L `L @L FGLADL ;L,. JKgh B Q A! L < ? & ghL 6QROPLu 6L; ?L gh gh &L CJJ)L LdL L L L L L egȱeh@J Q A @J Q 8  @J- 8  88  89 7 eHȱeh /reȥse`6 eHȱeh /reȥse`.8eeyffzy)y i`L egȱeh Q 8 . L/Ll[ ^  QL/ l6 LD2 7 L `JKghA 2   Ll6 ; EHC gh ,-0hLgh rsLL < E1 FG A-L L8 JKgh`< E ,-  2,- Q  Q 8 ghL C2 [ @L ,. > .`' ` L? .`4L .[ &L .[  [ %L ,.`5L zLl  Q 8`  L] L BL  `1DCL[  [ (L L L ,-3-i  i* rsi) / / QL/   L  N  p-  4L/L ML 9: *ili$m kH kh``9:iWi'`;; `L $> >`?/?e`L \ L -.:45ؠ-  4 ,-0,-0L>.y9:;?.,.ԩx9:L ; 9/:/ HXY  oeXZeY[Z[ZZX[YXi_Yi`_ W?;.^ ^^; . /X _Y*`_i_`i `_9ȱ_:>Z[XYLXZ Y[ XYLK9:Ls oX8;X<Ȅ=89 ,.0L<; HXY;.? /Z/[]Xc \Z[ XYL'X _Y*`_i_`i#`_9ȱ_:9.L 9:U HXY ]Xi̅_Yi`_\ XYLX _Y*`_i}_`i"`_9ȱ_:L   oH; h// H9:L . -L1 124561  124561245664 412456 4112 12456  11#$%&(*+,-.01341 4 4  !)!$+ ! !! ! ! !!'!)!!  #$%&(*+,-.034#$%&(*+,-.0344  "   1 "4 412 "  " !!!!!'!!!!!  4  " 4    7i / "$&(bdfgrt.!?    #/7ceij' cj(>JJFIK!!*!&O@ G  "H}~R&JQTUE. HJ %'<$% =>?S  "H}~R&JQTU  "H}~R&JQTU-|z {  NM##''()+,L112233445579:;B4D,E+F-H(LL)MM5NNTT8UUUWWPXX*YY6[]]9^^ _A`Baace:::fhijmnopqsuvvvvvvvvwwx"G bPZ\SVJKROQI. A DCBA DCBB DCBTBL DEVICE DFLBUF (DMAADR ENDMVE ERFLAG FILHST IFLASH GETMSG JGETSPT HCOM HITKO K /HOME HOMED HSTACT HSTBUF .HSTDSK HSTSEC HSTTRK HSTWRT INTTBL IOSTAT IOTYPE AKEY KEYTBL KYBDMD = KYCHAR LA3F RLA49   (2063)x6      ^_v ii  :: 01710 2Lz l   `U1:2 0 1 0 #1@@0@@0@@0rt<?=/ lkA$#g3d8>C0D6C"$   !"#$%-/02<=>?@$BCCCCCEFYZZZ[\Y%]^_`aaabcdgldddosvz~ddddddd$$  #&),/3579;=?ACFILOSVY\^adfhkmptvy{}2/7!;22 $$%%''))+++++---22555577BBCCDDEEFFHHHHHHHHHIJKLLMMMNNOPQRSSTTUVVWXXYZZ[]]^__``abbcccffggghhiijjllmnnopqqsttvvxxyyz{|}~                 #'(+7Uaceiju <(+*)-,=/;>:#^IFTOGOONOREQLTGTLEGENEFORLETREMDIMDEFNOTANDTANSINCOSSQRTABLOGLENFREATNABSEXPINTENDPOSRNDSGNASCVALXORSUBPEEKPOKETHENREADGOTOELSENEXTSTOPDATAFILECHR$MID$STEPSTR$CALLSINHPRINTINPUTGOSUBCLOSELEFT$RETURNRIGHT$REMARKRESTORERANDOMIZE    HEFIJNTLGAKBOCDQX! P)&$"%(c#RU'WYZ-,+*S.V03%v 5EJMNNAFGFADUPLICATE LABELS OR SYNCHRONIZATION ERROR$IDENTIFIER IN DIM PREVIOUSLY DEFINED$PREDEFINED FUNCTION NAME PREVIOUSLY DEFINED$FOR LOOP INDEX NOT SIMPLE FLOATING POINT VARIABLE$INCORRECT NUMBER OF PARAMETERS IN FUNCTION REFERENCE$INVALID PARAMETER TYPE IN FUNCTION REFERENCE$UNDEFINED FUNCTION$INVALID CHARACTER$EXPRESSION IN IF STATEMENT NOT FLOATING POINT$ILLEGAL FLOATING POINT FORMAT$SUBSCRIPTED VARIABLE NOT PREVIOUSLY DIMENSIONED$ARRAY NAME USED AS SIMPLE VARAIBLE$STRING EXPRESSION NOT ALLOWED$MIXED MODE (STRING - FLOATING) EXPRESSION$NEXT VARIABLE DOES NOT MATCH FOR$NO PRODUCTION EXISTS$NEXT STATEMENT WITHOUT MATCHING FOR$INCORRECT NUMBER OF SUBSCRIPTS$COMPILER STACK OVERFLOW$SYMBOL TABLE OVERFLOW$UNDEFINED LABEL$VARC TABLE OVERFLOW$UNTERMINATED STRING$INVALID TYPE IN FILE IDENTIFIER$FOR WITHOUT MATCHING NEXT$&*P*u***+5+H+Z+++++,A,b,w,,,,,, - -@-PROD $ ERRORS DETECTED$DISK ERROR - ABORTING $BASNO SOURCE - ABORTING $END BASIC-E/65 COMPILER - VERSION 2.03-A$INT ,,, - -@-PROD $ ERRORS DETECTED$DISK ERROR - ABORTING $BASNO SOURCE - ABORTING $END BASIC-E/65 COMPILER - VERSION 2.03-A$#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkL0LpLvLzLCOPYRIGHT - RICHARD A. LEARY - 2008a{)_``N` ` `jk`aihʆnobi`dpcȄeqbc^_i\Ȅ]`:0./mc,md-8f:g0 |8pf6qg7fg ders8rȭrrrHȱrhrsrȑrȥdrȥer`  P/L'? ; ;y/ J ${/ Fz/z/ z/`8zz/`` RAB`a L;+nonbocLn``C(PDL iDz/ ] L`L L `D 0 C z/EFLr  EFLr  noEF0 ",1 L "1 CEF 0 0 1  D 0 L 1 " 0 , L 2 Di Kiȅ./EF,-D |\ȥ\ D` 2 DEF !\] LCL \``!u`!u` D )` D LI D )LI D J)` D )LI D LI D LI D **)`$uȥu`wxLwx`Ȅa67\]89^_ŀ D  I  L;+ wLs L : s uiu` N 5 D ) u8u D ) I L \  k L> : `yz``: ;``H ] <=:<;=L G   d  u8uhLT \ L` /u/vu L\ 0w0x`uvi&Ȅiy ĝĝ ĝÝ J NnH莱h0ͷ ͳʹͺͻ9 ĝ  RÝ⚍ kʊ-i⚭i.m⚍⚩m㚍㚭⚍ꚭ㚍뚭ɝߚ횭ʝ ŝ莥0 Ɲ Ý Ý`  xÝ`i˝̝̝̝͝͝񭺝Νϝ`ͫ ` C1 h . ` L{ C ~ X s. 2̝ Ν  ~  X Ϊ Lț `U1:2 0 TT SS #B-P 2 0 Iآ08 i:` ˝   ˝  L  0` : ` : `  `"?Н"?@  33#3wWWaAA44$4zZZsSSeEE55%5rRRdDD66&6cCCfFFtTTxXX77'7yYYgGG88({bBBhHHuUUvVV99)}iII jJJ 000mMM kKK oOOnNN++++pPPlLL ----..>}::[{@@@`,,<{\\\|****;;]};===^^^~//?\11!1____22"2 qQQ D65SPT DATȄz"u:ȱu;ȱuȱu ?u@L/ 8 "    8n?` e  L` +)=%_!.:;<>  *?`L // Kuv //uvi&Ȅ  u\ȱ\ ȱ:) eAI)u8 i L    e.̓ ^ uL0 ̓  e ^ uLM N : uv$uȊu R\ȱ\#uuLR\]67^_89` <=>LR ] L $ L8\\ȱ\\ { k  :;23  )eȪʆ `3),?)? ` ` u4ȱu5 nL 4uȥ5u N  uLR2&3&4&5` G   d   `  ` ,,>0, k L>\ ȱ\ ΕL" k ͔ "L k L" k LR  nLuvL`H /u/vu hL$ " $ 4LH^_ h)L   Hȱh *ȱʆ8 Hȱh  8 Q@i KH\/h\.,-i |\ȱ\ʆi\],- ./LrJK {\]LM^_NOP`P/ iȅ23JK JK\ȭK\ RPLBLM\]NO^_`i QJK mQ KLM`ȑP`Pi\ȱ\ RPL L\ȭM\`i`  R RSTPTP+ R 2ȱ3  mRRmSSPL) RȭSLRS eeiȘ\\` e`eaʆ`aLR  LR RLR { `a`\` )` L ``) \`\`L` $ 3 LR  iG   HmGI I K./^,ȱ^-G |\,ȱ\-,-mG.Ȅ/H |  R \ȥ\IʊL  RL\i` $ \]L\ȱ\ 3 ^_L^ȱ^͵( ` `L `-0 B  L \0 R   0  R \ȑ\`   801\- 1i\L1\- ./L m1Ȍ/8\./L m08././,-  K./  |\ R \ȥ\L ; ,0LLHH  LMhh LuvLuvLuvLuvLuvLuv LL LUVpq"#YZ"#o"Z"ȱ"8"#8]^mYYmZZU V%UViȍ[\][^\"#`"ȱ""#LU VLYZ`UV V`U "#"UVie"&e#'"&ȱ"&"Hȱ"hiȅ()&"(ȥ'"(&&i&'"&ȥ#&UV67"i"## "#`8 W!X 4 i ! Hȱ h !!` ` 4 !WX` *ȱ +**`*`* Hȱ* hi*Ȅ+ *ȥ!*`,.`_`_ ``_`_,.,-./L & &`6766%7`L / / lmX+ lmi  @ L@   /8   '  i  i'       i  i   d    id    i  0 L@ , 0 0  @/8`H D+ h LH M+ hL\0``^0``)\`^\`\^`\``^``\\``^^``\^\^`^_\]8^_b_c`8d^e_``a`\]^_i\Ȅ]de`bc\]`{d{{e{`|}|ȱ| |~ȱ|~*~*fe~|Ȋeg|`\]  ,-\]./Lr^Hȱ^h`\Hȱ\h``Hȱ`h` 4t` q !/ //// /ˑ\ȩ/\`\ȱ\%``` ;tt $`Ls`01452J 4e045e15f5f4f3f223` q  x  \\\\`^_L\]  . QO$LʆK@A LB`^_L \] @LKLI*QO y@AL rLx q^_ ] x  R`  R` R`\]L\]L^_L^_L$? \Ȅ?QPO`COt#t$ Iہ51r8;5I?R5Dzh(Fy`'dVv"8@t.@w.Opzn|*~P׺&d#4X]Ix;J{n|/}1t}Z=~~LlML8KNQOL~OIOLILMIMNINQIQQ NML`K O*`BC NBMBO %LBKBQ`@A@N@M@O L@KQ`@A@U@T@VEO[V S@R`VOUNTMSLRKQ` OVNUMTLSKRQ` OIOEV[LHLWQPi0QH)Vvvhj`BCBȪLBEOLKB LȱBM ȩQBN`OILHڠ/ hLI*KMNQ  9729 WBOOT L^LL+LLܗL^``LLϘLLݘLL L``` ^(  C64 DOS/65 2.15 SIM 3.01D ϩ   (B D( 䘭LLLة(% Ϙ')*%&  똭'( ݘ)* )0ί")i)*''"'%зLl1 ӗ) I: =ͨ`H 2 ӗhͭ捨@ߩݩ +))) mɀ H̩ h` ō`HA):h # /     ɀHh `A[ a{)_` `A` `KL ܗKLLJ`HA)A)h #Lzh 9Hh  L ` A)   L)  ``ɝʝ````ŝĝƝL홍Ɲ ƝŝƝ$yβ;nͳfʹ^͵VͶN 󘍪ǝǝȝO yڠ/L  KL(QERR8K+KVOIiEKL?Q LQQV m$[LKRR8IeEQNML L>MLNMQNQi KO`eEQNeUNMeTMLeSLLiQ&N&M&L8KIiK K fLfMfNfQ`?`KOIO`K Q  `ReK00 iK[O`hhKO`LqJ ZeUZYeTYXeSXfXfYfZfQJ` AKi [ K`?` K. XYZQ %N %M %L *XLYMZNL~` A[ L Kn8KK K[SL TMUN* Z@,( U&T&S0਩QUNUTMTSLSL Q(L?`>`KLMN`8$O P K P`O)FLLL mP`Kɘ . QOOI*KN9Ly`:;ڠ/ ڠ/ m ڠ/Lm:;ޠ/ :<:;:; m:i::; ޠ/<`DDY/:`0`8`F eF DyY/80F`!!LY/Y/ FD +-J H$GH Ph) L7!.,E. -+ fI  Lh!$I8FL!fG$GPF8HF FL! PFJ KOIO` $O-/ODȩ0KL"  mH   PH Hܩ  . Hi0 i8FHD.ș/0ș/DNyNMyMLyL00ነIi i/Ȅ=DȪ)/H.ș/D=I)вD/0.ȩ+F-8F-/E//8 i:///`//`  m NLNLOKQK ~L U0SQNML) KɁKL`8KHKڠ ʠ   ] Π h ҠLm?`ڠ/ ֠ mKɈ $O:KO` g 9i)H  Ҡ mڠ/ ]  [h `?`Ơ  AV[ޠ   A g [ ` ]OH O0 8I8  h 6L OH KHɁ  K hɁƠ ]hL``# `\`)?ȑ\`   { {LI$ $$$$ $ {LI$LO%b%u%%%%%%& &&&-&D&[&f&Ri&Bo&z&&&&&&&&& ' '%'.'7'@'F'R'h'p'x'}' ''''N%N%$''' (((+(e(((((((((()c)o){))))))*****N*g*y***++"+` q^_   RL q^_ ]  RL q^_ m  RL   q^_   RL  )^0  L  #\] m i#  RL HLL H H H H H \I\L  \1^^ RL  \^^ RL R LRhh` L R RLR LL     ɩ R RLR  {`\ȥa\`e``aL { `aiHȘ\h\`ȱ`a`` 8`aLR  L , aLR a LR  L L  L ` `'a'^ RLRCL CL LL  {`,ȱ`-\]./ rL{ihʆno` q  xL  L tpL$ ;t8t` `i`aLR LRC`aABLz CL CL ]  i L ] (8:;)(*(<)(=*( k LB( k k L \ //00LR\)\` q g xL " Lx H I hL'` q # xL q # xL q $ xL   ( R (  L BL% q$O L # m i# xL \Ʌ<ȱ\78\'\t\  $\ ;t\tLRt ;LRL q i# xL  LBL" q # xL tiLB  ))LB LH hLB  K\ȑ\\LL2  H hLBL2L2 ,/iH K./\ȥ/\ˠ/,-h |L   i ! Lx  t*u* LB qK`/  i#/ /   i# /  m xL^8^*8\Ͷ*L R\i*\ m*\`  \Q^^ RL { 00 {LR lmLR ejHek\h\` 4 g I$LFERROR - $WARNING - $ IN LINE $NULL STRING PASSED AS PARAMETER TO ASC FUNCTION$ERROR WHILE CLOSING A FILE$DISK READ ERROR - UNWRITTEN DATA IN RANDOM ACCESS$DISK WRITE ERROR$DIVISION BY ZERO$EOF FOR DISK FILE AND NO ACTION SPECIFIED$RECORD SIZE EXCEEDED FOR BLOCKED FILE$INVALID INPUT FROM CONSOLE$INVALID RECORD IN RANDOM ACCESS$ACCESSING AN UNOPENED FILE$ERROR WHILE CREATING FILE$FILE IDENTIFIER TOO LARGE OR ZERO$ATTEMPT TO RAISE A NEGATIVE NUMBER TO A POWER$NO INT FILE FOUND IN DIRECTORY$ATTEMPT TO READ PAST END OF DATA AREA$ERROR WHILE OPENING A FILE$INDEX IN ON STATEMENT OUT OF BOUNDS$ATTEMPT TO READ PAST END OF RECORD ON BLOCKED FILE$UNBLOCKED FILE USED WITH RANDOM ACCESS$ARRAY SUBSCRIPT OUT OF BOUNDS$STRING LENGTH EXCEEDS 255$SECOND PARAMETER OF MID IS NEGATIVE$ATTEMPT TO EVALUATE TANGENT OF PI OVER TWO$OUT OF MEMORY$ATTEMPT TO WRITE A QUOTE TO DISK$DISK DATA FIELD TOO LONG DURING READ$OVERFLOW IN ARITHMETIC OPERATION$ILLEGAL TAB ARGUMENT$ `i•HÕ Õ Õ Yh•Ș)`  n ҒL슮I-` 'LQ eݕ * n Ғ LLi ҒiAL,ĕ•`Hh ` )  L슩``   `ےܒ $ Ȍ `, ,0H h` ÒH; 4^ h @ ,:L4 ,)`H h H,0 h &9!Θ7Θ0` >?` , ͘9 4Lv Lf^H8hΟ @ 08n l sH8  hL: ; L IL l8 4L l sLȑHqh  L슠L L, , L,Hhο`ȘH L| 7H 4 4hL40:8` AG`뉬i뉐Ȍ`뉬쉍۔ܔ (`LKLDLULLL4Lϕ - R/O$ - BAD SECTOR TO IGNORE -- TO ABORT$ PEM ERROR ON $ - INVALID DRIVE$@  @? 9ILLEGAL CHARACTER IN FILE NAME$b+++++,+,Q,l,,,,,-0-V-q---- .'.K.v...../PINT 0` LLbb Z0(`b(` c0b(a` 0 0`i` 0H 0h`b @e2  4 :02膇8:c0d 0Y/*0 0Y/$Y/ ! iL0 0epeq8pchqdi8cjdk 0ehfeigfgL 0bcb&cb&cbefbcegc 0L5+3 0ppqL1ɀ x0 c0 x0L1* x0b( x0 0 x0iL1 x0a6 7^) 0ȱejekʘ 0L1.L1 0 ȱ* *i:i0 0L1BASIC-E/65 INTERPRETER - VERSION 2.05-A$*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"f unshifted DEL bne cin1 ;is not so try next lda #127 ;get normal delete bne coninx ;and return cin1 cmp #193 ;see if < shift-A bcc cin2 ;is so jump ahead cmp #219 ;see if > shift-Z bcs cin2 ;is so jump ahead ;character is shifted a-z so adjust sec ;subtract 128 sbc #128 ;is now upper case a-z bne coninx ;so return that code ;character is anything except DEL & shift a-z ;first see if unshifted a-z cin2 cmp #65 ;see if < A bcc cin3 ;is so jump ahead cmp #91 ;see if > Z bcs cin3 ;is so jump ahead ;character is unshifted A-Z so adjust clc ;add 32 adc #32 ;to make lower case bne coninx ;and return that code ;any remaining characters > 95 are ignored by following section ;this may get changed in later versions cin3 cmp #96 ;see if > 95 bcs conin ;if so loop for another ;any other character < 128 is then returned coninx rts ;console output of char in a conout pha ;save char lda iotype ;get config and #%00010000 ;if bit 4 set print as received bne cout5 pla ;get char back jsr swap ;swap upper & lower case ;start testing for special functions cmp #12 ;see if clear screen bne cout1 ;is not lda #147 ;is so get Commodore clear cmd bne coutdo ;and go send cout1 cmp #8 ;see if backspace bne cout2 ;is not lda #157 ;go left jsr coutdo ;and send to screen lda #32 ;now send space jsr coutdo lda #157 ;go left again bne coutdo ;and send cout2 cmp #lf ;see if linefeed bne cout3 ;is not lda #17 ;get Commodore linefeed bne coutdo ;and send it cout3 cmp #cr ;see if cr bne cout4 ;is not jsr coutdo ;send that lda #145 ;now up 1 line due to auto lf bne coutdo ;and send cout4 cmp #18 ;see if reverse on beq coutdo ;is so send cmp #1 ;see if normal video bne cout6 ;not so try next lda #146 ;get C64 normal bne coutdo ;and send it cout6 cmp #19 ;see if home beq coutdo ;if so send it cmp #29 ;see if forward space beq coutdo ;if so send it cmp #' ' ;see if other control char bcc coutx ;ignore if is cmp #157 ;see if left beq coutdo ;if so send cmp #128 ;see if not ASCII bcs coutx ;done if not ASCII pha ;save for the moment cout5 pla ;get character back coutdo pha ;save char lda #0 ;turn off quote mode sta qtsw pla ;get it back jsr BSOUT ;output to channel coutx rts ;swap upper and lower case for C64 swap cmp #'A' ;see if < A bcc swapx ;done if is cmp #'Z'+1 ;see if upper case bcc swap1 ;is so handle cmp #'a' ;see if under lc a bcc swapx ;done if is cmp #'z'+1 ;see if lower case bcs swapx ;if not done swap4 and #%01011111 ;clear bit 5 swapx rts swap1 ora #%00100000 ;turn on bit 5 rts ;similar for printer swap2 cmp #'A' ;see if < A bcc swapx ;done if is cmp #'a'-1 ;see if < a bcs swap4 ;not so convert ora #%10000000 ;is so make > 128 rts ;print of message ;the call to outmsg passes address in ay, ;binary zero as the end. outmsg sta getmsg+1 ;address into sty getmsg+2 ;operand getmsg lda $fff͕ٕ͕ؕ̕̕̕̕ ͕ŕ̕ƕȕJn͕͕̕̕ g͕̕̕̕ ͕ ݑ "0 Lg` ӕԕLNjNjΕͦ!mѕmҕΕLΕmӕΕmԕ 8ѕҕ8 3L!HFjmؕmٕh)z` 31` 3I1` 3` `q`-` `芠 `  02 ) Ș)   `  0  H hn ~`  H ݑ h "07 H hQ-ߕ? H hϭ`ȕ..Ǖ- ` ηm , H hη LB  HH딬씅 hh0 ! 8n ~` 0* i)   L ` `H֕ͱוhLݑ) hLa HJJJJ hL (<LD #  LD  `i Lc Lc u Lc B L: INPUT ERROR$OUTPUT ERROR$BAD SEQUENCE ERROR$INVALID CHARACTER$ ` H h`   L ) LX i  L KIMCOM NEXT ADDRESS=$ BYTES READ=$ RECORDS WRITTEN=$R$BAD SEQUENCE ERROR$INVALID CHARACTER$ ` H h`   L ) LX i f ;get the char beq n3 ;branch if done jsr conout ;print char lpnext inc getmsg+1 ;bump the pointer bne getmsg ;no carry so loop inc getmsg+2 ;bump high byte jmp getmsg ;go back for more n3 rts ;return past mess. ;send char in a to printer ;should be able to move the LA9F routine up to be in line list pha ;save char lda iotype ;get config and #%00000100 ;0 if 1515, 1 if 4022 bne list2 ;jump if no swap lda iotype ;get config back and #%00001000 ;see what kind of swap bne list1 ;4022 swap pla ;get char jsr swap ;regular swap jmp list21 ;and go send list1 pla ;get char back jsr swap2 ;do 4022 swap pha ;save char list2 pla ;get char back list21 sta data ;save LA9F LDA DATA ;get character CMP #LF ;see if line feed beq lac5 ;if is do nothing LAA7 LDX #4 ;else set channel out to 4 JSR CKOUT ;set channel out BCS LAB7 ;if error try to fix LDA DATA ;if OK get character again JSR BSOUT ;output to channel LAB4 JMP CLRCH ;restore defa MM < W  , , - 5  , a h   W  W L ~   ` ͠ W Lt $ 0 W Lt W L`  '    d   0LR 8    e e e 8f$ 0 R ` LM , LL LL Ll ,   d W L`    \ B " $  `L    \ I " 0   ` L M`M`M `M`i`i`File Comparison Routine Version 2.02-A$ One of the files does not exist!$ $ Files match - length is $ (decimal)$ Files are unequal at byte $ EOF on file 1 but not file 2$ EOF on file 2 but not file 1$exist!$ $ Files match - length is $ (decimal)$ Files are unequal at byte $ EOF on file 1 but not file 2$ EOF on file 2 but rem basic-e/65 file status routine for dos/65 rem Version 2.17 rem Yes, I know it is slow but it sure is easier to write rem released: rem 13 August 1981 rem last revision: rem 5 October 1981 rem mod for Version 1.2 rem 17 October 1982 rem mod for Version 2.0 rem 28 december 1985 rem eliminated redo path rem 22 may 1996 rem modified for DOS/65 2.14 rem corrected major logic errors rem 4 april 2008 rem modified for c64 screen rem 6 april 2008 rem modified to handle empty dir rem 8 april 200 2008 rem added opening banner rem added remark about setting tea rem constant definitions rem tea must be set to correct address for system tea=2048 rem following five lines calculate and save special rem i/o linksin RUN.COM pem=tea+9 sim=tea+12 a.reg=tea+15 y.reg=tea+16 x.reg=tea+17 rem these two parameters are the same for all versions dfl.buf=296 e5=229 rem set up block size array dim blk.size$(5) blk.size$(0)="1KB " blk.size$(1)="2KB " blk.size$(2)="4KB " blk.size$(3)="8KB " blk.size$(4)="16KB " rem set up extent mask table dim exm(5) exm(0)=0 exm(1)=1 exm(2)=3 exm(3)=7 exm(4)=15 print "DOS/65 File Status - V2.17-A" a=dfl.buf gosub 9030 rem set buffer to default 0028 OPE؍ᕎ$PV 댩 mxyHHl  , 댩`LL݌LLLLLL!L,LҒLLL-L4LLLLL"H") \ then \ print "Illegal drive": \ stop a=asc(a$)-65 poke x.reg,13 rem reset system dummy=call(pem) gosub 9000 rem set drive to a track=peek(dcb.addr+4)+peek(dcb.addr+5)*256 rem find number \ system tracks sector=0 n=0 max.dir=peek(dcb.addr+7)+peek(dcb.addr+8)*256 rem find dir \ length num.dir=max.dir+1 dim name.ext$(num.dir),extent(num.dir),records(num.dir) blk.code=peek(dcb.addr+6) exm.index=blk.code if peek(dcb.addr+1) <> 0 then exm.index=exm.index-1 num.sec=peek(dcb.addr+2)+peek(dcb.addr+3)*256 rem first read directory into arrays for i=ult channel & exit LAB7 CMP #3 ;see if not opened BNE LAC0 ;some other error so exit JSR LAC6 ;try to open printer BCC LA9F ;successful so try again LAC0 LDA #$FF ;put error code STA DATA ;in data for Z80 LAC5 RTS ;open printer channel LAC6 LDY #7 ;SA =7 prints in upper & lower case JSR LADE ;close & open printer channel LDA IOTYPE ;get I/O type AND #$02 BEQ LAC5 ;if 1515 then done LDX #4 ;set LA as 4 JSR CKOUT ;set channel out LDA #CR ;send a CR JSR BSOUT ;output to channel LDY #0 ;set SA to 0 ;close printer and then open LADE LDA #4 ;logical file 4 JSR CLOSE ;close logical file LDA #4 ;now set LA to 4 LDX #4 ;and device FA to 4 JSR SETLFS ;set LA, FA, SA LDA #0 ;zero length name JSR SETNAM ;set length & file name address JMP OPEN ;open logical file ;select disk ;input: a = drive number (0 to 7) ;return: ay = address of dcb for drive ; 0 if drive not present seldsk and #7 ;three lsbs only sta sekdsk ;save for later asl a ;multiply by two tax ;make an undex lda dcbtbl,x ;get address ldy dcbtbl+1,x rts ;set sector number ;input: ay = physical record number ;return: none selsec sta seksec ;save low and high sty seksec+1 rts ;set buffer address ;input: ay = starting address of record ;return: none setdma sta dmaadr ;store low sty dmaadr+1 ;and high rts ;set track ;input: ay = track number ;return: none seltrk sta sektrk ;save number sty sektrk+1 rts ;table of dcb addresses dcbtbl .word dcba .word dcbb .word 0 .word 0 .word 0 .word 0 .word 0 .word 0 ;see if deblocking required for sekdsk ;returns number of dos/65 sectors per physical ;sector in a and ;returns z=1 if no deblocking reguired else z=0 tstdbl ldx sekdsk ;get desired disk ;see if deblocking required for disk x tstdbx lda spttbl,x ;get dos/65 sectors/host cmp #1 ;test for no deblock rts ;table containing number of dos/65 sectors ;per host physical sector. if entry is 1 ;then deblocking is skipped. spttbl .byte 2,2 ;table of records/block rbltbl .byte 8,8 ;home the selected disk ;input: none ;return: none home lda hstwrt ;check for pending write bne homed ;there is so skip sta hstact ;clear host active flag homed rts ;do nothing ;the read entry point takes the place of ;the previous sim definition for read. ;read the selected dos/65 sector ;input: none ;return: a=0 if read OK ; <> 0 if error read ldx #0 ;x <-- 0 stx unacnt ;clear unallocated count inx ;x <-- 1 stx readop ;say is read operation stx rsflag ;must read data inx ;x <-- wrual stx wrtype ;treat as unalloc jmp rwoper ;to perform the read ;The write entry point takes the place of ;the previous sim defintion for write. ;write the selected dos/65 sector ;input: a=0 if write to allocated block ; =1 if write to directory ; =2 if write to unallocated block write sta wrtype ;save param from pem jsr tstdbl ;see if one rec/sec bne usewrt ;if not use type passed lda #wrdir ;if is say directory sta wrtype ;to force write usewrt ldx #0 ;say is stx readop ;not a read operation lda wrtype ;get write type back cmp #wrual ;write unallocated? bne chkuna ;check for unalloc ;write to unallocated, set parameters ldx sekdsk ;get next disk number lda rbltbl,x ;get records/block sta unacnt stx unadsk ;unadsk <-- sekdsk lda sektrk ldy sektrk+1 sta unatrk ;unatrk <-- sectrk sty unatrk+1 lda seksec ldy seksec+1 sta unasec ;unasec <-- seksec sty unasec+1 ;check for write t-)%!  L߉8މމL ى ` L ` ׅ !iA牌 ÒH; h @ 慭: 慬艮``߉`H߉݉ h )Hȹ:: hމh߉ȩ u*? u :Hh.# u*? u ݉h ȹ?`: `: =.: ;<>`L(L%߉8މL ׅ艹 h`뉌`ɉɉ`ɉꉍ߉` ߉g񉨹$ȹ N  A8)HmmhmЭL‰ `L8LLLLނLL[L{LZLLLNO SPACECAN NOT CLOSEALL FILES (Y/N)?READ ERRORNOT FOUNDFILE EXISTSLOAD ERRORCAN NOT OPENWRITE ERRORDIR SAVE ERA TYPE REN GO LOAD  9B04 NODMAW 9705 NOOFF 9AA4 NOOVF 99D3 NOREAD 9A75 NOSHIF 9A0E NOUNSC COM4  o unallocated sector chkuna lda unacnt ;any unalloc remain? beq alloc ;skip if not ;more unallocated records remain dec unacnt ;unacnt <-- unacnt-1 lda sekdsk cmp unadsk ;sekdsk = unadsk? bne alloc ;skip if not ;disks are the same lda unatrk ;sektrk = unatrk? cmp sektrk bne alloc ;no so skip lda unatrk+1 cmp sektrk+1 bne alloc ;skip if not ;tracks are the same lda unasec ;seksec = unasec? cmp seksec bne alloc ;no so skip lda unasec+1 cmp seksec+1 bne alloc ;skip if not ;match, move to next sector for future ref inc unasec ;unasec = unasec+1 bne nounsc inc unasec+1 ;calculate dos/65 sectors/track nounsc lda sekdsk ;get disk number asl a ;mult by two tax ;make an index lda dcbtbl,x ;get dcb start ldy dcbtbl+1,x sta getspt+1 ;set low operand sty getspt+2 ;then high operand ;point has address now get spt at byte 2,3 ldy #2 ;start at byte 2 ldx #0 ;start save in low getspt lda $ffff,y ;get value sta d65spt,x ;and save iny inx cpx #2 ;see if done bne getspt ;loop if not ;check for end of track lda unasec ;end of track? cmp d65spt ;count dos/65 sectors lda unasec+1 sbc d65spt+1 bcc noovf ;skip if no overflow ;overflow to next track lda #0 ;unasec <-- 0 sta unasec sta unasec+1 inc unatrk ;unatrk <-- unatrk+1 bne noovf inc unatrk+1 ;match found, mark as unnecessary read noovf lda #0 ;0 to accumulator sta rsflag ;rsflag <-- 0 beq rwoper ;to perform the write ;not an unallocated record, requires pre-read alloc ldx #0 ;x <-- 0 stx unacnt ;unacnt <-- 0 ;say preread required inx ;x <-- 1 stx rsflag ;rsflag <-- 1 ;check for single record/sector - and if so ;then say preread not required. jsr tstdbl ;test bne rwoper ;more than one lda #0 ;say no preread sta rsflag ;common code for read and write follows ;enter here to perform the read/write rwoper lda #0 ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector ldy seksec+1 sta sekhst sty sekhst+1 jsr tstdbl ;get records/sector lsr a ;divide by two tax ;make a counter beq noshif ;done if zero shflpe lsr sekhst+1 ;do high ror sekhst ;then low dex bne shflpe ;loop if more ;active host sector? ;at this point x=0 noshif lda hstact ;host active flag pha ;save inx ;x <-- 1 stx hstact pla ;get flag back beq filhst ;fill host if not active ;host buffer active, same as seek buffer? lda sekdsk cmp hstdsk ;same disk? bne nmatch ;same disk, same track? lda hsttrk ;sektrk = hsttrk? cmp sektrk bne nmatch ;no lda hsttrk+1 cmp sektrk+1 bne nmatch ;same disk, same track, same sector? lda sekhst ;sekhst = hstsec? cmp hstsec bne nmatch ;no lda sekhst+1 cmp hstsec+1 beq match ;skip if match ;proper disk, but not correct sector nmatch lda hstwrt ;host written? beq filhst ;skip if was jsr writeh ;else clear host buff ;may have to fill the host buffer ;so set host parameters filhst lda sekdsk sta hstdsk lda sektrk ldy sektrk+1 sta hsttrk sty hsttrk+1 lda sekhst ldy sekhst+1 sta hstsec sty hstsec+1 lda rsflag ;need to read? beq noread ;no ;read desired physical sector from host jsr hcom ;set parameters jsr la3f ;to rom sta erflag ;save result noread lda #0 ;0 to accum sta hstwrt ;no pending write ;copy data to or from buffer match lda #0 ;clear write move pointer sta wmoved+1 ;later we'll set read read sta wmoved+2 jsr tstdbl ;get records/sector beq endmve ;done if no deblocking tax ;drop by one dex txa and seksec ;mask sector number tax ;make a counter beq nooff ;done if zero clcpnt clc lda wmoved+1 adc #128 sta wmoved+1 lda wmoved+2 adc #0 sta wmoved+2 dex bne clcpnt ;loop if more ;operand has relative host buffer address nooff clc ;add hstbuf lda #hstbuf adc wmoved+2 sta wmoved+2 ;at this point wmove operand contains the address of the ;sector of interest in the hstbuf buffer. ;so now set the operands for the possible read move lda wmoved+1 sta rmove+1 lda wmoved+2 sta rmove+2 ;now set address of record in associated operands lda dmaadr sta wmove+1 sta rmoved+1 lda dmaadr+1 sta wmove+2 sta rmoved+2 ;at this poH h =JJJJ97 _> 慭 ꅠ9:a {)_:슙:݉ !މ d߉.䉠ٹ䉭߭ m䉪轌≌㉭HHl * 8 ߉L ׅ剹:  h? L ͺ‰ ? U0V ׅ b: 慭 )`Ȣ( h . hL  0 L`4L W U0O և݉: < 7߉ 8މ% ꉍ߉ɉ U և L> *L4L z r m և S  0E @0Dm鉍鉭뉌 ̔ '뉬i 0`L Ub L  H ׅh)_Y L 0 =02 ׅ O 0"( h 0ޢ `L)4L ˇ և  χ =0ح뉬 % O L0L  LlLh ߉ 8މ L‰ Lυډ‰ =L̅ ˇ % O ͇̈̈ Ol0j… * ߉ ߉ɉى : (:)( ׅ މ L *LJL 慩 C = 9 5 1ADOS/65 DISK651ADOS65SYSTEM START START START1 START2 START3KKint the pointers are all set for read or write ldy #127 ;length of move - 1 ldx readop ;which way? bne rmove ;skip if read ;write operation so move from dmaadr inx ;x <-- 1 stx hstwrt ;hstwrt <-- 1 wmove lda $ffff,y wmoved sta $ffff,y dey bpl wmove ;loop if more bmi endmve ;else done ;read operation so move to dmaadr rmove lda $ffff,y rmoved sta $ffff,y dey bpl rmove ;loop if more ;data has been moved to/from host buffer endmve lda wrtype ;write type cmp #wrdir ;to directory? bne nodir ;done if not ;clear host buffer for directory write lda erflag ;get error flag bne nodir ;done if errors sta hstwrt ;say buffer written jsr writeh nodir lda erflag rts ;writeh performs the physical write to ;the host disk. writeh jsr hcom ;setup params jsr la57 ;to kernal sta erflag ;save result rts ;set parameters for host (physical) read/write ;as coded this is limited to reading or writing to the c64 cp/m ;disk format for the 1541, i.e., ;1541 drive numbers are ; drive 0 --> device 8 ; drive 1 --> device 9 ;1541 track numbers go from 1 to 35 however 1541 track ; number 18 is reserved for the 1541 directory ; and can not be used by cp/m or dos/65. Net ; result is that dos/65 track must be increased by ; one and if track is 18 or more it is increased by one ; more to skip directory track ;1541 sector numbers go from 0 to 16 hcom lda hstdsk ;get disk number ;now calculate device number clc ;by adding "8" adc #8 ;to drive number sta device ;ignore high byte of track and sector for 1541 lda hsttrk sta phytrk inc phytrk ;bump track by one lda phytrk ;now check for 18 cmp #18 ;since that is reserved bcc nobump ;if < 18 do nothing inc phytrk ;else bump 18-->19, 19-->20 etc nobump lda hstsec ;then sector sta physec rts ;done ;following section contains core C64 I/O routines ;change drive by sensing new drive and then closing 15 & 2 ;and then reopening 15 & 2 with new device number chkdrv lda hstdsk ;get new drive number cmp lstdrv ;see if same as last beq chkdrx ;done if is sta lstdrv ;save new for next jsr lb97 chkdrx rts ;read sector ;returns a=0 if ok else a<>0 with flags set appropriately ;as currently implemented it should never return an error code LA3F jsr chkdrv ;check & change drive LDA #'1' ;"1" in "U1" JSR LAF2 ;set up USER 1 mode JSR LBDE ;set up read from LA 2 LDX #0 ;do full 256 bytes LA49 JSR BASIN ;input from channel STA HSTBUF,X ;& put in host buffer INX ;go to next BNE LA49 ;loop if more stx data ;set return jsr clrch ;restore default lda data ;get error code rts ;exit always ;do sector write but first initialize diskette LA54 JSR LB97 ;initialize diskette jmp la571 ;skip drive check ;write sector ;returns a=0 if ok else a<>0 with flags set appropriately LA57 jsr chkdrv ;check and change drive la571 JSR LBF4 ;set up to write to command channel LDY #8 ;8 characters LA5C LDA LB80,X ;send block command JSR BSOUT ;output to channel INX DEY BNE LA5C JSR CLRCH ;restore default channel JSR LBCE ;read command results BNE LA54 ;error so initialize JSR CLRCH ;restore default channel JSR LBE9 ;set up write to channel 2 LDX #0 LA76 LDA HSTBUF,X ;get byte from buffer JSR BSOUT ;output to channel INX BNE LA76 ;loop until all 256 written JSR CLRCH ;restore default channel LDA #'2' ;"2" in "U2", block write ;set up user mode ;error return: a=$ff & z=0 else a=0 & z=1 ;returns: a LAF2 STA LB62+1 ;save "1" or "2" for mode LDA phytrk ;now get track number JSR LB89 ;convert to ASCII STX LB62+7 ;and store in string STA LB62+8 LDA physec ;once more for sector JSR LB89 ;convert to ASCII STX LB62+10 ;and store in string STA LB62+11 LDA #2 ;set DATA for 2 tries STA DATA LB1B JSR LBF4 ;set up command channel LDY #13 ;string is 13 characters LB20 LDA LB62,X ;get character and JSR BSOUT ;output to channel INX DEY BNE LB20 JSR CLRCH ;restore default channel JSR LBCE ;read error channel BEQ LB3D ;if no error say so & exit DEC DATA ;else drop counter BEQ LB45 ;if everything tested then error JSR LB97 ;else initialize diskette JMP LB1B ;and try again LB3D LDA #0 ;set flag for no error LB3F STA DATA ;inKKLDCOPYRIGHT (C) 2008 - RICHARD A. LEARYAI)`& P+`"   L `yzy$` 󩏠 PL;!`=!`^!` L\! L Ld8u%vFvfuu`  L  hLiuߩ%`$~0"$}L?  -H ! h  `8 w )xFxfww` ` L  hL i  wߩ) `) 0:i`HJJJJ } h i  )H h`Hno$ onh(`HJJJJ i h i L HJJJJ i ?h i L? L ? L?ImKJiLKiKL``H I J.- IKȱIHKIhKȄHKILJ .--å.$H`(`%`&8`?iB@iA8&B&%A%0 8`0`(0 (- !8` `# (- =;ʆ"8``'#̦ (.-' -' - ) , ` ] `-A[`8`-0:`8` / W `-o. o.ߩ%&6%=< X`+- `1=23 X`<2>3 `= l  L $L @L %L ] G 8` { L p u+*&%1+=  XL<=`* 54['` `-' %-'54 2-' &-'=` `= W `0  m`24 34541+:&e5&%e4%* L L %L L -A&85&%4%*  %L L ?%E?L L *Nqp ( @HF4f5 qe&qpe%p&&%hq&p%  %L  .L /<=`qp ( @54<=`8&5&%4%qp( X-iiإ+-% LL@  .-- `. Q),  NP z  ȱ mi.Т-L* S` $ c@% c    P 8`l-mEFCH Q A A QhH,B X XL 8LH0l A Qlm, (0 X  ,h%Le$C s) $`M EOkFNjEk LYFjM-PkjMs`H hkOjNLyihM`; M  t MiMrrM  t rMh t i t L Heiihh`{{ . L`$0` s XD0 QL ^ >  sL L Q Q Q L L L K- ʆ( . .({Lii L. l ' -; !L.!-.LG*L#  L./ {  # L)з) ] ѭp. o.AX YSPL$o.H#H" -=G 45L245 !$LL* $ L!-=L* L! L 60  L L**%! L1 %&L1h#ho. 4%5&$L.%4&5 L!/ { - Lo. li0ɥ) > L+ L 6[] +&-%ș-)  % +!L+  (-, LL1 L!-'" !+ H  h+=L L#-ŀ -ŀЅ -LU L!/ { Lj Ls &)L)L  @)L  )L )  L-, L:9;7-8L" "L.-;LA (- 80 e7-LL# L[(:! L! 60\: 6L8= =L-'/ L#- &%% -  =L.;9  W-)::7LL L!-, -,7LL L!-X:LKY L::%7L:9Lé - г;N98?@ L%: L%9:i: L:i :e8.;9L9:8 :L9L9:i :Le7-;0ȥ&-ȥ9%KK- %9ȩL9%9L-) `% i` P?!=!^!0L ; )! .Z8f0 )=! X8f}0Z8f~0 )^!  T $0  `  T  \}~0  `  To.m Ȅ 8 8  Ѡ P 6? PM(!)!LB88 JSR SETNAM ;set length & file name address ;now open JSR OPEN ;open logical file ;if logical file 2 is open close it LBB1 LDA #2 ;logical file (LA) = 2 JSR CLOSE ;close logical file ;now open logical file 2 LDA #2 ;logical file (LA) 2 LDX device ;device per hcom to (FA) LDY #2 ;secondary address (SA) 2 JSR SETLFS ;set LA, FA, SA LDA #1 ;single character LDX #KKLB6F JSR SETNAM ;set length & file name address JMP OPEN ;open logical file ;initialize and then set input to command channel LBCB JSR LB97 ;initialize diskette ;set input to command channel and check for errors LBCE LDX #15 ;logical address = 15 JSR CHKIN ;set channel in BCS LBCB ;if error try to initialize JSR BASIN ;input from channel CMP #'0' ;test error code "0" RTS ;close and open LA 2 and then LBDB JSR LBB1 ;set for random access ;set up read from channel 2 LBDE LDX #2 ;channel 2 JSR CHKIN ;set channel in BCS LBDB ;if error try to initialize RTS ;close and open LA 2 and then LBE6 JSR LBB1 ;set for random access ;set up write to channel 2 LBE9 LDX #2 ;channel 2 JSR CKOUT ;set channel out BCS LBE6 ;if error close and open RTS ;initialize diskette then set up for command channel write LBF1 JSR LB97 ;initialize disk - ignore errors ;set up for write to command channel ;error return: none ;return: x=0 LBF4 LDX #15 ;LA 15 for command channel JSR CKOUT ;set channel out BCS LBF1 ;if error initialize LDX #0 ;x = 0 to start transfer after RTS RTS ;disk control blocks ;both for C64 1541 ;drive a dcba .word 135 ;max block number .word 34 ;records per track .word 2 ;number system tracks .byte 0 ;block size = 1024 .word 63 ;max directory number .word almpa ;address of map for a .byte 0 ;do checksums .word ckmpa ;checksum map ;drive b dcbb .word 135 ;max block number .word 34 ;records per track .word 2 ;number system tracks .byte 0 ;block size = 1024 .word 63 ;max directory number .word almpb ;address of map for a .byte 0 ;do checksums .word ckmpb ;checksum map ;data area sekdsk .byte 0 ;seek disk number hstwrt .byte 0 ;0=written,1=pending host write data .byte 0 ;io data lstdrv .byte 8 ;last drive used - start as illegal ;allocate the following data areas to unused ram space contmp ;temp in conin *= *+1 kychar ;keyboard character *= *+1 savsec ;save sector for warm boot *= *+1 count ;counter in warm boot *= *+1 temp ;save hstdsk for warm boot *= *+1 hstact ;host active flag *= *+1 unacnt ;unalloc rec cnt *= *+1 sektrk ;seek track number *= *+2 seksec ;seek sector number *= *+2 hstdsk ;host disk number *= *+1 hsttrk ;host track number *= *+2 hstsec ;host sector number *= *+2 sekhst ;seek shr secshf *= *+2 unadsk ;last unalloc disk *= *+1 unatrk ;last unalloc track *= *+2 unasec ;last unalloc sector *= *+2 erflag ;error reporting *= *+1 rsflag ;read sector flag *= *+1 readop ;1 if read operation *= *+1 wrtype ;write operation type *= *+1 d65spt ;dos/65 records/track *= *+2 dmaadr ;record address *= *+2 device ;c64 iec bus device *= *+1 phytrk ;physical track *= *+2 physec ;physical sector *= *+2 ;allocation maps ;drive a almpa *= *+17 ;drive b almpb *= *+17 ;checksum maps ;drive a ckmpa *= *+16 ;drive b ckmpb *= *+16 ;deblocking buffer for dba hstbuf *= *+256 ;256 byte sectors .end  a almpa *= *+17 ;drive b almpb *= *+17 ;checksum maps ;drive a ckmpa *= *+16 ;drive b ckmpb *= *+16 ;deblockin *= *+1 sektrk ;seek track number *= *+2 seksec ;seek sector number *= *+2 hstdsk ;host disk number *= *+1 hsttrk ;host track number *= *+2 hstsec ;host sector number *= *+2 sekhst ;seek shr secshf *= *+2 unadsk ;l;18C6004C61C64CAFC64C2BC74C3BC74C85C74C25C8EAEA60EAEA600DD7 ;18C6184CD6C84C96C84CB2C84CA4C84CABC84CDFC84CF2C8A901600ECA ;18C630A28060EAEA6000080A1D011219280C1300010D0A43363420064B ;18C64835324B20444F532F363520322E31352053494D20332E3034064C ;18C6600020E7FFA92085CF58A90920D2FFA90E20D2FFA90820D2FF0DA6 ;18C678A99320D2FFA90D20D2FFA942A0C6200BC8A2008E72CC8E730DDD ;18C690CCBDA9C69D0001E8E006D0F5A928A00120ABC8AD69CC4C000DCA ;18C6A8B24C03C64C00BAA2FF9AD8A9288D70CCA9008D24C72096C80D9F ;18C6C0A9018D26C7A900A0B28D28C78C29C7AD24C7AC25C720B2C80D7F ;18C6D8AD26C7AC27C720A4C8AD28C7AC29C720ABC820DFC829FFD00F00 ;18C6F030CE70CCF02218AD28C769808D28C79003EE29C7EE26C7AD0E2C ;18C70826C7C922D0C1A9008D26C7EE24C7D0B7AD69CC8D78CC4C890E5B ;18C720C66CFCFF0000010000B200AD2AC7DKK00A20E4FF29FFF0038D0C02 ;18C7382AC760A90085CC202BC729FFF0F9AD2AC748A9008D2AC7A90D3B ;18C7500185CCA9202085C7A99D2085C768C914D004A97FD01EC9C10D21 ;18C7689009C9DBB00538E980D011C9419009C95BB005186920D0040BAC ;18C780C960B0B76048AD41C62910D0526820EAC7C90CD00L(COPYRIGHT (C) 2008 - RICHARD A. LEARY .,8&' {  !  &8*+F+f* S ((&)e(e)8*͎+NL 8  ? o ֠ { AI)8 ȹ  2 { L ȱ ȱȱ -) )i8Nji 8   ^ ,!L  { L  e e `LLLL!L$L3 *)`nL   "#-$%$%  i$%"#""#`נ {    `L  { )% &'II  `Lh = ]  '0/ȱȱ& Hehe`     P a {)_슙 ` { L 0:`8`S { G $1 ) ȹ ` G ) ȹ` { LZ { G 37/0+) ȹ G 1665 ) ȹ` { L 蹒)ȹ:ȹ a( [   7 m  LMORE V2.01-A $ ?`N [ 8`NAME IS AMBIGUOUS!$ ` ! 0` [ 8`CAN NOT OPEN! $b e <=:; ` ( ZV f ) # / c (   H h h @ h  h L`L  ! ()`H [ 8` FILE READ ERROR!$ LL L H ` h `AN NOT OPEN! $b e <=:; ` ( ZV f ) # / c ( ert binary in A to ASCII in X (upper) and A (lower) ;this assumes maximum value of binary is 99 LB89 CLD LDX #'0' ;set upper to zero SEC LB8D SBC #10 ;A-10 to A BCC LB94 ;less than zero so done INX ;X+1 to X BCS LB8D ;and try again LB94 ADC #'0'+10 ;add 10 back & convert RTS ;Diskette initialization & set up for direct access ;error return: c=1 ;return: a = error code ;start by closing command channel LB97 LDA #15 ;logical file (LA) 15 JSR CLOSE ;close logical file ;now open  `8`    f L  L $a];  T    eHehH hL e8L     LA `8` `$ !?*=.: ;<>`` j L (()`8`   ( `00 :0 A0Gi *****&&`8` H w h`(#L   LKIMSYSGEN VERSION 2.15-A$ ENTER MEMORY SIZE IN DECIMAL K BYTES (K=1024) $ ENTER DRIVE AND NAME FIELD FOR BOOT .KIM FILE $ ILLEGAL FILE NAME, BAD DATA OR ILLEGAL ADDRESS IN INPUT FILE - ABORTING$ ENTER SIM LENGTH IN DECIMAL PAGES (PAGE=256) (1 TO 99) $ ENTER DRIVE AND NAME FIELD FOR SIM .KIM FILE $ILLEGAL INPUT - REENTER $ INSERT DISKETTE THEN ENTER DESTINATION DRIVE (A-H) $ NOT ENOUGH SYSTEM TRACKS - ABORTING$ INVALID DRIVE - TRY AGAIN$ SYSTEM IS TOO LONG - ABORTING$ ERROR DURING WRITE - ABORTING$ H h =%JJJJ97 _>  9:a {)_:슙:  ! d.ٹ߭ m轌HHl * 8 L :  h? L   ͺ ?  U0V  b:  )`Ȣ( h . hL   0  L`4L W   U0O : < 7 8%   U  L> *L4L z r m    S     0E @0Dm #  'i  0`L Ub L    H h)_Y L  0 =02  O 0"( h 0ޢ `L)4L         =0ح % O #L0L  KKLlLh  8 L L =L  % O #͇̈̈  Ol0j *   : (:)(    L *LJL  C = 9 5 1-)%!  L8L   ` L  `  !iA !H;% h @ :% ```H h )Hȹ:: hhȩ u*? u :Hh.# u*? u h ȹ?`: `: =.: ;<>`L(L%8L  h````  g$ȹ N # #A8)HmmhmЭL `L8LLLLLL[L{LZLLLNO SPACECAN NOT CLOSEALL FILES (Y/N)?READ ERRORNOT FOUNDFILE EXISTSLOAD ERRORCAN NOT OPENWRITE ERRORDIR SAVE ERA TYPE REN GO LOAD COM ؍$$$$$$PV$$ $$ m$xy$$#H#H$$l$$$$ $$ ,$ $$$`LLL"L%L%L%L!L!L,L!L"L!L-%L4LLLLL<LLDLLLL4L0LL%LoL8LLLLLL3%$`$`,$ $L% 0%$$$)$`$)$`no``$$``$`$`$`  L  $ͺ$ɀ` $ $ $` b  %?%$` ," !$͘$9% 4"Lv"$$$ !$ Lf#^H8hΟ$ @ 08n$$$ l" s#$H8$$$$ #$h$L":% #;% # #L" $I$L" l"8% 4"L" l" s#L"ȑH$qh !$ LL" L," ," L,"$$Hhο$`ȘH !L|# 7%H 4" 4"hL4"0:8` #AG`iȌ`##(`LKLD$LU$L#L$L4$L$ - R/O$ - BAD SECTOR TO IGNORE -- TO ABORT$ PEM ERROR ON $ - INVALID DRIVE$@  @?KKad operation *= *+1 wrtype ;write operation type *= *+1 d65spt ;dos/65 records/track *= *+2 dmaadr ;record address *= *+2 device ;c64 iec bus device *= *+1 phytrk ;physical track *= *+2 physec ;physical sector *= *+2 ;allocation maps ;drive a almpa *= *+17 ;drive b almpb *= *+17 ;checksum maps ;drive a ckmpa *= *+16 ;drive b ckmpb *= *+16 ;deblocking buffer for dba hstbuf *= *+256 ;256 byte sectors .end  .byte $30,$30,$30,$00 ;0 - 0 0 0 NUL .byte $6d,$4d,$4d,cr ;M - m M M CR .byte $6b,$4b,$4b,$0b ;K - k K K cntrl-K .byte $6f,$4f,$4f,$0f ;O - o O O cntrl-O .byte $6e,$4e,$4e,$0e ;N - n N N cntrl-N .byte $2b,$2b,$2b,$2b ;+ - + + + + .byte $70,$5;C64BOOT ;128 byte record that is loaded by C64LOAD to pass addresses and ;record count for DOS/65 CCM, PEM, & SIM ;Version 2.11 ;released 27 March 2008 ;last revision: ; 6 april 2008 ; increased to 52K ;C64LOAD does not know anything about load address or ;amount to load except as provided by this record ; ;data that is used to derive other information ;CCM & PEM length are fixed for DOS/65 2.1 CCMLNG = 2048 ;length of CCM in bytes PEMLNG = 3072 ;length of PEM in bytes ;memory size assumes kernel rom & IO space are not used MEMSIZ = 53248 ;last useable RAM+1 ;SIM length depends on code included and will ;change as features are added or changed ;for C64 maximum SIM length is 3456 bytes given ;capacity of first two tracks on 1541 diskette ;Initial release is 10 pages long. SIMLNG = 2560 ;length of SIM in bytes ;following fields contain the data needed by C64LOAD to load DOS/65 ;start address for CCM START .word MEMSIZ-CCMLNG-PEMLNG-SIMLNG ;number of 128 byte records to load LENGTH .byte CCMLNG+PEMLNG+SIMLNG/128 ;cold boot entry point CBOOT .word MEMSIZ-SIMLNG ;rest of 128 byte record is ignored .end D to load DOS/65 ;start address for CCM START .word MEMSIZ-CCMLNG-PEMLNG-SIMLNG ;number of 128 byte records to load LENGTH . ;host active flag *= *+1 unacnt ;unalloc rec cnt *= *+1 sektrk ;seek track number *= *+2 seksec ;seek sector number *= *+2 hstdsk ;host disk number *= *+1 hsttrk ;host track number *= *+2 hstsec ;host sector number *= *+2 sekhst ;seek shr secshf *= *+2 unadsk ;last unalloc disk *= *+1 unatrk ;last unalloc track *= *+2 unasec ;last unalloc sector *= *+2 erflag ;error reporting *= *+1 rsflag ;read sector flag *= *+1 readop ;1 if read operation *= *+1 wrtype ;write operation type *= *+1 d65spt ;dos/65 records/track *= *+2 dmaadr ;record address *= *+2 device ;c64 iec bus device *= *+1 phytrk ;physical track *= *+2 physec ;physical sector *= *+2 ;C64LOAD ;C64 file that is loaded and executed to start DOS/65 ;Version 2.10 ;released 28 march 2008 ;miscellaneous definitions CR = $0D ;carriage return ;C64 KERNAL entry points SETLFS = $FFBA ;set LA, FA, SA SETNAM = $FFBD ;set length & file name address OPEN = $FFC0 ;open logical file CHKIN = $FFC6 ;set channel in CKOUT = $FFC9 ;set channel out CLRCH = $FFCC ;restore default channel BASIN = $FFCF ;input from channel BSOUT = $FFD2 ;output to channel CLALL = $FFE7 ;close all files & channels ;start of actual load ;This is in BASIC data area so it must be loaded as a BASIC ;file at $0800 that then jumps to $080F *= $80F SEI ;disable interrupts ;set up C64 memory by disabling BASIC ROM & Character ROM ;by writing to second 6510 I/O port LDA #%00110110 STA 1 ;close everything - including whatever BASIC did or user did JSR CLALL ;close all files & channels ;set up read from drive 8 ;first open command channel LDA #15 ;logical file number 15 LDX #8 ;device 8 LDY #15 ;secondary address 15 JSR SETLFS ;set LA, FA, SA LDA #0 ;zero length file name JSR SETNAM ;set length & file name address JSR OPEN ;open logical file ;now set up for random access for file 2 LDA #2 ;logical file number 2 LDX #8 ;device 8 LDY #2 ;secondary address 2 JSR SETLFS ;set LA, FA, SA LDA #1 ;name is one char long LDX #L8B5 JSR SETNAM ;set length & file name address JSR OPEN ;open logical file ;set up address and operation and set x=0 JSR SETUP ;fiKrst read 128 byte record containing data needed ;for rest of load process as well as first record of CCM BLOOP JSR BASIN ;input from channel STA START,X ;and save INX BNE BLOOP ;loop until one sector done ;at this point we know where and how much to load ;set up address and count for remaining but SEC ;back up 128 bytes LDA START ;set up store SBC #128 STA MSTORE+1 LDA START+1 SBC #0 STA MSTORE+2 ;set up pointer & counter for main read loop ;first increase records by one to reflect re-read of boot INC LENGTH ;now read and store rest of CCM, PEM, & SIM MAIN JSR SETUP ;setup & set x=0 MLOOP JSR BASIN ;input from channel MSTORE STA $FFFF,X ;and save INX BEQ ONESEC ;one sector done if x=0 ;x is either 1-127 or 128-255 ;see if 1-127 and if so loop BPL MLOOP ;loop until >=128 ;x is 128-255 CPX #128 ;see if record done BNE MLOOP ;if not loop until one record done DEC LENGTH ;drop length BEQ DONE ;done if zero BNE MLOOP ;else loop ;now see if done from record count decrement ONESEC DEC LENGTH BEQ DONE ;bump sector number ENDSEC INC SECTOR+1 ;bump sector number LDA SECTOR+1 CMP #'9'+1 ;see if rollover BNE NO10 LDA #'0' ;reset units STA SECTOR+1 LDA #'1' ;set tens STA SECTOR ;now check for track rollover NO10 LDA SECTOR+1 CMP #'7' BNE NOTRK LDA SECTOR CMP #'1' BNE NOTRK ;set for sector 0 of track 2 LDA #'0' STA SECTOR+1 LDA #' ' STA SECTOR LDA #'2' STA TRACK ;uses self modifying code NOTRK INC MSTORE+2 ;bump load high byte BNE MAIN ;should never be 0 so loop ;load is done - get ready to do cold boot entry DONE JMP (CBOOT) ;jump to SIM cold boot entry ;set up address and operation SETUP LDX #15 ;set 15 as active channel out JSR CKOUT ;set channel out LDX #0 LDY #12 ;name is 12 characters long OP1 LDA L8AA,X ;point to character in name JSR BSOUT ;output to channel INX DEY BNE OP1 ;loop until last character sent JSR CLRCH ;restore default channel LDX #2 ;set 2 as active channel in JSR CHKIN ;set channel in LDX #0 RTS ;data area ;start reading at track 1 and sector 0 L8AA .byte "U1:2 0 " TRACK .byte "1 " SECTOR .byte " 0",CR L8B5 .byte "#" ;file name for random access ;128 byte data area for BOOT record ;start address START *= *+2 ;number records LENGTH *= *+1 ;SIM cold boot entry CBOOT *= *+2 .end 0",CR L8B5 .byte "#" ;file name for random access ;128 byte data area for BOOT record ;start address START *= *+2 ;number0 to int(max.dir/4) gosub 9010 rem set track high=int(sector/256) poke a.reg,sector-high*256 poke y.reg,high poke x.reg,51 dummy=call(sim) rem translate sector gosub 9020 rem then set it gosub 9040 rem read sector for j=0 to 3 dir.start=dfl.buf+(j*32) if peek(dir.start)<>e5 \ then \ n=n+1: \ gosub 8000 rem build array entry next j sector=sector+1 if sector=num.sec then \ sector=0 : \ track=track+1 next i print "There are ";n;"entries in the directory" n.files=n rem if directory empty then make sure first name is null if n=0 \ then name.ext$(1)="" rem if only zero or one entry then skip combining if n<=1 \ then goto 3000 rem combine entries for i=1 to n-1 if name.ext$(i)="" \ then goto 2000 for j=i+1 to n if name.ext$(i)=name.ext$(j) \ then \ name.ext$(j)="": \ n.files=n.files-1: \ extent(i)=extent(i)+extent(j): \ records(i)=records(i)+records(j) next j 2000 next i 3000 print "consisting of ";n.files;"files" print heading$="NAME EX RECORDS" print heading$ print for i=1 to n name$=name.ext$(i) if name$<>"" \ then \ print tab(1);name$;tab(14);extent(i);tab(17);\ records(i) next i print poke x.reg,27 map.addr=call(pem) rem allocation map address total=0 num.alloc.byt=int((peek(dcb.addr)+peek(dcb.addr+1)*256)/8) for i=0 to num.alloc.byt byte=peek(map.addr+i) for j=1 to 8 byte=byte*2 if byte>255 \ then \ total=total+1: \ byte=byte-256 next j next i print total;blk.size$(blk.code);"blocks allocated of "; num.blocks=peek(dcb.addr)+peek(dcb.addr+1)*256 print num.blocks+1 gosub 9050 rem restore default stopK rem subroutines 8000 rem extract directory entry and stuff in array name$="" for k=1 to 8 char$=chr$(peek(dir.start+k)) if char$<>" " \ then name$=name$+char$ next k name$=name$+"." for k=9 to 11 char$=chr$(peek(dir.start+k)) if char$<>" " \ then name$=name$+char$ next k name.ext$(n)=name$ extents=(peek(dir.start+12) and exm(exm.index)) + 1 extent(n)=extents records(n)=0 for l=1 to extents if l < extents \ then records(n)=records(n)+128 if l = extents \ then records(n)=records(n)+peek(dir.start+15) next l return 9000 rem set drive to value in a poke a.reg,a poke x.reg,14 dummy=call(pem) poke x.reg,34 dcb.addr=call(pem) return 9010 rem set track to value in track high=int(track/256) poke a.reg,track-high*256 poke x.reg,30 poke y.reg,high dummy=call(sim) return 9020 rem set sector to value in registers poke x.reg,33 dummy=call(sim) return 9030 rem set buffer to value in a high=int(a/256) if high>255 \ then \ print "Illegal buffer address": \ gosub 9050: \ stop poke y.reg,high poke a.reg,a-high*256 poke x.reg,36 dummy=call(sim) return 9040 rem read sector into buffer poke x.reg,39 if call(sim) and 255 \ then \ print "Directory read error!": \ gosub 9050: \ stop return 9050 rem restore default drive a=dfl.drv gosub 9000 return 9060 rem get left digit and make uppercase a$=left$(a$,1) if (a$>="a") and (a$<="z") \ then a$=chr$(asc(a$)-32) return end  a=dfl.drv gosub 9000 return 9060 rem get left digit and make uppercase a$=left$(a$,1) if (a$>="a") and (a$<="z") \ .[[( YՀ.P.P....P.P..[ [ [ .P.P.7.. P.!P.".6.#B. 7.$B.%[[([[(.&[[( Y-.6B.'. 7f.(P7c.62.7..6There are $#entries in the directory$4.7.[!. 76v.6.. 7v[!76s.6 . 7s[![!1$0$2048$9$12$15$16$17$296$229$5$2$3$4$5$2$3$3$7$4$15$25$255$65$13$4$5$256$7$8$256$6$2$3$256$4$256$256$51$3$32$14$17$27$256$8$8$2$255$256$256$8$9$11$12$128$15$14$34$256$256$30$33$256$255$256$36$39$255$32$**........ . [ .[!1KB .[!2KB . [!4KB . [!8KB . [!16KB  .[ .[ !..[ !..[ !..[ !..[ !.DOS/65 File Status - V2.17-A$4 ].[[( Y. What drive$; 1' A H 7BIllegal drive$4 Q..[[( Y.P.P....P.P..[ [ [ .P.P.7݀.. P.!P.".6.#B. 7.$B.%[[([[(.&[[( YM.6b.'. 7.(P7.6R.7..6There are $#entries in the directory$4.7.[!. 76.6.. 7[!7%6.4A993D00D94 ;18C79847C908D00EA99D20E0C7A92020E0C7A99DD035C90AD004A90DA5 ;18C7B011D02DC90DD00720E0C7A991D022C912F01EC901D004A9920CFF ;18C7C8D016C913F012C91DF00EC9209013C99DF006C980B00B48680CEB ;18C7E048A90085D46820D2FF60C941900EC95B900BC9619006C97B0D2D ;18C7F8B002295F60092060C94190F8C960B0F20980608D12C88C130C46 ;18C810C8ADFFFFF00E2085C7EE12C8D0F3EE13C84C11C86048AD410EDC ;18C828C62904D013AD41C62908D0076820EAC74C41C8682000C8480AC0 ;18C840688D6BCCAD6BCCC90AF01EA20420C9FFB009AD6BCC20D2FF0E2D ;18C8584CCCFFC903D005206AC890E0A9FF8D6BCC60A0072082C8AD0E3C ;18C87041C62902F0F3A20420C9FFA90D20D2FFA000A90420C3FFA90D72 ;18C88804A20420BAFFA90020BDFF4CC0FF29078D69CC0AAABDB9C80D5F ;18C8A0BCBAC8608D76CC8C77CC608D8ACC8C8BCC608D74CC8C75CC0FDC ;18C8B8604DCC5BCC000000000000000000000000AE69CCBDD2C8C9093B ;18C8D0016002020808AD6ACCD0038D72CC60A2008E73CCE88E86CC0C3D ;18C8E88E85CCE88E87CC4CC0C98D87CC20C9C8D005A9018D87CCA20FD7 ;18C900008E86CCAD87CCC902D024AE69CCBDD4C88D73CC8E7FCCAD0F0E ;18C91874CCAC75CC8D80CC8C81CCAD76CCKAC77CC8D82CC8C83CCAD1019 ;18C93073CCF079CE73CCAD69CCCD7FCCD06EAD80CCCD74CCD066AD10E7 ;18C94881CCCD75CCD05EAD82CCCD76CCD056AD83CCCD77CCD04EEE10FA ;18C96082CCD003EE83CCAD69CC0AAABDB9C8BCBAC88D7DC98C7EC91057 ;18C978A002A200B9FFFF9D88CCC8E8E002D0F4AD82CCCD88CCAD8310E7 ;18C990CCED89CC9010A9008D82CC8D83CCEE80CCD003EE81CCA9000F70 ;18C9A88D85CCF013A2008E73CCE88E85CC20C9C8D005A9008D85CC0EAD ;18C9C0A9008D84CCAD76CCAC77CC8D7DCC8C7ECC20C9C84AAAF0090F4F ;18C9D84E7ECC6E7DCCCAD0F7AD72CC48E88E72CC68F030AD69CCCD10B7 ;18C9F078CCD020AD79CCCD74CCD018AD7ACCCD75CCD010AD7DCCCD1090 ;18CA087BCCD008AD7ECCCD7CCCF039AD6ACCF00320DBCAAD69CC8D0F48 ;18CA2078CCAD74CCAC75CC8D79CC8C7ACCAD7DCCAC7ECC8D7BCC8C1010 ;18CA387CCCAD85CCF00920E5CA2017CB8D84CCA9008D6ACCA9008D0DA9 ;18CA50B5CA8DB6CA20C9C8F06BAACA8A2D76CCAAF01418ADB5CA690F92 ;18CA68808DB5CAADB6CA69008DB6CACAD0EC18A9D36DB5CA8DB5CA108B ;18CA80A9CC6DB6CA8DB6CAADB5CA8DBDCAADB6CA8DBECAAD8ACC8D11E3 ;18CA98B2CA8DC0CAAD8BCC8DB3CA8DC1CAA07FAE86CCD00FE88E6A1111 ;18CAB0CCB9FFFF99FFFF8810F73009B9FFFF99FFFF8810F7AD87CC1251 ;18CAC8C901D00BAD84CCD0068D6ACC20DBCAAD84CC6020E5CA203D0E33 ;18CAE0CB8D84CC60AD78CC1869088D8CCCAD79CC8D8DCCEE8DCCAD0FF5 ;18CAF88DCCC9129003EE8DCCAD7BCC8D8FCC60AD78CCCD6CCCF0061010 ;18CB108D6CCC20E4CB602008CBA931206DCB202DCCA20020CFFF9D0C52 ;18CB28D3CCE8D0F78E6BCC20CCFFAD6BCC6020E4CB4C40CB2008CB0F66 ;18CB402043CCA008BDCDCB20D2FFE888D0F620CCFF201DCCD0E0200F3A ;18CB58CCFF2038CCA200BDD3CC20D2FFE8D0F720CCFFA9328DC0CB10A6 ;18CB70AD8DCC20D6CB8EC6CB8DC7CBAD8FCC20D6CB8EC9CB8DCACB1165 ;18CB88A9028D6BCC2043CCA00DBDBFCB20D2FFE888D0F620CCFF200F2F ;18CBA01DCCF00BCE6BCCF01220E4CB4C8DCBA9008D6BCC20CCFFAD0EE6 ;18CBB86BCC60A9FFD0F255313A3220302054542053530D23422D500A5B ;18CBD0203220300D49D8A23038E90A9003E8B0F9693A60A90F20C30B42 ;18CBE8FFA90FAE8CCCA00F20BAFFA901A2D5A0CB20BDFF20C0FFA91000 ;18CC000220C3FFA902AE8CCCA00220BAFFA901A2CCA0CB20BDFF4C0D9F ;18CC18C0FF20E4CBA20F20C6FFB0F620CFFFC9306020FFCBA202200EBB ;18CC30C6FFB0F66020FFCBA20220C9FFB0F66020E4CBA20F20C9FF0FC3 ;18CC48B0F6A20060870022000200003F0091CC00B3CC87002200020845 ;0DCC6000003F00A2CC00C3CC00000008047D ;00 CC18C0FF20E4CBA20F20C6FFB0F620CFFFC9306020FFCBA202200EBB ;18CC30C6FFB0F66020FFCBA20220C9FFB0F66020E4CBA20F20C9FF0FC3 ;18CC48B0;05000000B23C00C601B9 D to load DOS/65 ;start address for CCM START .word MEMSIZ-CCMLNG-PEMLNG-SIMLNG ;number of 128 byte records to load LENGTH .6@. 7[![!7[!.[![![![![![!616consisting of $#files$44NAME EX RECORDS$44.6. 7" [! 7.J $.)J[!#.*J[!#464.+[[(K!Y".#P.P.,.-B.6g#. 7$!P.6... 7$$./$.07"".$$.16y6X"#[!$blocks allocated of $%P.P.2%.#4 &.6.3&.& 7/'&PR' 7, '6 .&.46Q.5&.& 7o'&PR' 7l '6A[! (.6P[ ! .[!([!.).6().) 7)(7[![!.7)(7[![!.8P6 [[(.9[[( Y.:[[(Y.;B.<[[(.=[[([[( Y.>[[( Y .?B.@7Illegal buffer address$4[[( .A[[(.B[[( Y.C[[(Y.D 7Directory read error!$4  .S a z 7 Q.ER .A[[(.B[[KK