› ›PROC SIO=$E453() ››MODULE ››; The purpose of this program is to read›; ATARI DOS 3 files and convert them to›; ATARI DOS 2 files.››BYTE ARRAY Buffer_in(128)=$8000›BYTE ARRAY Buffer_out(125)=$8080›BYTE Ddevic=$300, ; device serial bus id D1-D4 ($31-$34)› Dunit=$301, ; disk or device #› Dcomnd=$302, ; operation command code $52=get sector $50=put sector› Dstats=$303, ; status & operation info $40=read $80=write› Dbuflo=$304, ; buffer low address› Dbufhi=$305, ; buffer hi address› Dbytlo=$308, ; bytes to be transferred low address› Dbythi=$309, ; bytes to be transferred hi address› Daux1=$30A, ; sector address low to be read/written› Daux2=$30B, ; sector address hi to be read/written› SHFLOK=$2BE, ; Flag for shift lock› CONSOL=$D01F, ; Address for Option/Select/Start Keys› CRSINH=$2F0, ; Cursor inhibit flag› CH=$2FC ; Internal hardware vale›BYTE I,M›CARD Sector ›BYTE ARRAY filename_in(16) ›BYTE ARRAY filename_out(16) ›BYTE Byte_count›CARD Sectors_to_read, ; total sectors in file› Sector_count ; counter to match total sectors›BYTE dev,cmd,aux1,aux2›CARD addr,size,target_sector›BYTE max_bytes_in_last_sector›BYTE Number_drives›BYTE First_pass›CARD Total_bytes_in_buffer›BYTE Stop_at_end_of_buffer›BYTE POINTER Big_buff›BYTE Yes›BYTE An_error›BYTE Startup=[0]››;****************************************************************›MODULE ; BLKIO.ACT››; (c) 1983 ACS››; Copyright (c) 1983›; by Action Computer Services (ACS)›;›; This software may be incorporated in›; other software packages providing›; that this copyright notice is also›; incorporated as well.››; version 1.0›; last modified August 25, 1983››BYTE CIO_status››;***************************************************************›CHAR FUNC CIO=*(BYTE dev, CARD addr,› size, BYTE cmd, aux1, aux2)›; see hardware manual for description›; of CIOV.›; IOCB# = dev›; ICCOM = cmd›; ICBA = addr›; ICBL = size›; ICAX1 = aux1›; ICAX2 = aux2›; ICAX1 and ICAX2 are not set if aux1=0›; The first byte of addr is passed to›; CIO in the A register. The status›; on return from CIO is stored in›; CIO_status. If status=$88 then›; EOF(dev) is set to a non-zero value.›; No other error checking is performed›; and the result of the CIOV call is›; returned as the result of this FUNC.›[$29$F$85$A0$86$A1$A$A$A$A$AA$A5$A5›$9D$342$A5$A3$9D$348$A5$A4$9D$349›$A5$A6$F0$8$9D$34A$A5$A7$9D$34B$98›$9D$345$A5$A1$9D$344$20$E456›$8C CIO_status$C0$88$D0$6$98$A4$A0›$99 EOF$60]›››;***************************************************************›CARD FUNC ReadBlock=*(BYTE dev,› CARD addr, size)›; Reads size bytes from dev into addr.›; Returns number of bytes read (may›; be < size if EOF). Set EOF flag if›; EOF is encountered. Status is ›; saved in CIO_status.›[$48$A9$7$85$A5$A9$0$85$A6$A5$A3$5$A4›$D0$6$85$A0$85$A1$68$60$68$20 CIO›$BD$348$85$A0$BD$349$85$A1$60]››;***************************************************************›PROC WriteBlock=*(BYTE dev,› CARD addr, size)›; Writes size bytes from addr to dev.›; Status is saved in CIO_status.›[$48$A9$B$85$A5$A9$0$85$A6$A5$A3$5$A4›$D0$2$68$60$68$4C CIO]››MODULE ; end BLKIO.ACT››;****************************************************************›PROC Input_disk()›› Put($7D) ; Clear screen› PrintE("}") ; get users attention› SetColor(2,3,4) ; Color is Red-orange› Position(1,10)› PrintE("Insert input DOS3 disk into drive 1")› PrintE(" Push RETURN when disk is ready")› M=InputB()› SetColor(2,9,4) ; return color to blue› › RETURN›;***************************************************************›PROC Output_disk()›› Put($7D) ; Clear screen› PrintE("}") ; get users attention› SetColor(2,12,4) ; Color is Green› Position(1,10)› PrintE("Insert output DOS2 disk into drive 1")› PrintE(" Push RETURN when disk is ready")› M=InputB()› SetColor(2,9,4) ; return color to blue› › RETURN››;***************************************************************›PROC Read_Sector()›Ddevic=$31›Dunit=1›Dcomnd=$52 ; read command›Dstats=$40 ; set 2 way status to a read›Dbuflo=$00 ; setting buffer address lo›Dbufhi=$80 ; setting buffer address hi›Dbytlo=$80 ; set number of bytes to be transfered to 128›Dbythi=$00››Daux2=Sector/256›Daux1=Sector-Daux2*256››SIO() ; call serial I/O routine››IF Sector>24 THEN›Position(10,13)›Print("Sector read=======>")›PrintCE(Sector)›Position(10,14)›Print("target end sector=>")›PrintCE(target_sector)››Sector==+1›FI››IF Dstats=1 THEN RETURN FI› › PutE()› Print("Error in read sector. Error code=")› PrintBE(Dstats)›› Close(1)› Close(2)›› Break()››;***************************************************************›PROC Scroll_colors()›BYTE wsync=54282,› vcount=54283,› clr=53272,› ctr,› chgclr,› incclr›› CH=$FF› › DO› FOR ctr=1 TO 4› DO› incclr=chgclr ; set base color to increment› DO› wsync=0 ; wait for end of scan line› clr=incclr ; change displayed color› incclr==+1 ; change luminance› UNTIL vcount&128 ; end of screen test› OD› OD› chgclr==+1› UNTIL CH<>$FF› OD›› RETURN›;***************************************************************›PROC Print_directory()›BYTE ARRAY directory(17)›BYTE I,J,K,L,M,N,II››Put($7D) ; Clear screen››› PrintE(" <====== Directory ======>")›› FOR I=16 TO 23› DO› Sector=I› Read_Sector()› FOR J=1 TO 8› DO› K=(J-1)*16 › L=K+15› N=1› FOR M=K TO L› DO› directory(N)=Buffer_in(M) › N==+1› OD›› IF directory(1)<>$00 AND › directory(1)<>$80 THEN› Print(" ")› FOR II=2 TO 12› DO› PrintF("%C",directory(II))› OD› PrintE(" ")› FI› OD› OD›› PutE() PutE()›› Print(" Push RETURN to continue")›› Scroll_colors()›› SetColor(2,9,4) ; return color to blue›› RETURN››;***************************************************************›PROC See_if_again()›› Put($7D) ; Clear screen› PrintE("}") ; get users attention› SetColor(2,15,4) ; Color is Lt. Orange› Position(1,10)› PrintE(" Shall we start again?")› PrintE(" Input a Y to restart")›› CH=$FF›› DO› UNTIL CH<>$FF› OD›› Yes=CH›› RETURN››;***************************************************************›PROC Start_screen()› BYTE Do_directory›› Put($7D) ; Clear screen› PrintE("}") ; get users attention› SetColor(2,1,4) ; Color is Gold› Position(1,10)› PrintE("Push START for directory")› PrintE(" or any other key to continue")›› Do_directory=0›› CH=$FF› CONSOL=$08›› DO› IF CONSOL=6 THEN Do_directory=1 FI› UNTIL Do_directory=1 OR CH<>$FF› OD›› IF Do_directory=1 THEN Print_directory() FI›› Put($7D) ; Clear screen› CH=$FF›› SetColor(2,9,4) ; return color to blue› › RETURN››;***************************************************************›PROC Write_Sector()› › dev=2 ; device number› cmd=$0B ; command byte › aux1=0› aux2=0›› IF Number_drives=1 THEN› IF First_pass=0 THEN› Open(2,filename_out,8,0)› ELSE› Open(2,filename_out,9,0)› FI› FI›› WriteBlock(dev,addr,size)››First_pass=1›Byte_count=0››IF CIO_status=1 THEN› IF Number_drives=1 THEN Close(2) FI› RETURN› FI›› PutE()› Print("Error in write sector. Error code=")› PrintBE(CIO_status)›› Close(1)› Close(2)› ›Break()››;***************************************************************›PROC Fill_big_buff()›BYTE i››FOR i=0 TO 124› DO› Big_buff^=Buffer_out(i)› Big_buff=$8100+Total_bytes_in_buffer+› i+1› OD›› Total_bytes_in_buffer==+125› Byte_count=0› › IF Total_bytes_in_buffer=6000 THEN› size=6000› Output_disk()› Write_Sector()› Total_bytes_in_buffer=0› Big_buff=$8100› Input_disk()› FI›› RETURN››;*************************************************************›PROC Fill_Buffer_Out()››DO›Buffer_out(Byte_count)=Buffer_in(I)›I==+1›Byte_count==+1›IF Byte_count=125 THEN› IF Number_drives=2 THEN› Write_Sector()› ELSE› Fill_big_buff()› FI› FI› UNTIL I=128 OR I=Stop_at_end_of_buffer›OD››I=0› ›RETURN››;***************************************************************›PROC Read_directory()›BYTE ARRAY directory(17),check_directory(13)›BYTE I,J,K,L,M,N,II››An_error=0›FOR I=0 TO 12›DO›check_directory(I)=$20›OD››J=filename_in(0) ; Length of string›K=1›FOR I=3 TO J›DO›IF filename_in(I)<>$2E THEN ; Search for "."› check_directory(K)=filename_in(I)› K==+1› ELSE K=9 FI›OD››› FOR I=16 TO 23› DO› Sector=I› Read_Sector()› FOR J=1 TO 8› DO› K=(J-1)*16 › L=K+15› N=1› FOR M=K TO L› DO› directory(N)=Buffer_in(M) › N==+1› OD› › L=0›› FOR K=2 TO 12› DO› IF directory(K)<>check_directory(K-1) THEN L=1 FI› UNTIL L=1› OD›› IF L=0 THEN› Sector=directory(14)*8+25 ; start sector› Sectors_to_read=directory(16)*2+1› max_bytes_in_last_sector=directory(15)› IF max_bytes_in_last_sector>128 THEN› max_bytes_in_last_sector==-128› Sectors_to_read==+1 › FI›› Put($7D) ; Clear screen›› Print("For file=")› PrintE(filename_in)› Print("Sectors to read=")› PrintCE(Sectors_to_read)› Print("Bytes in last sector read=")› PrintBE(max_bytes_in_last_sector)› target_sector=Sector+Sectors_to_read-1› RETURN› FI› OD› OD›› An_error=1› PrintE("Error**** file not found")› Close(1)› Close(2)› RETURN››;***************************************************************›PROC Set_one(BYTE ARRAY filename)› BYTE M› FOR M=1 TO 13› DO› filename(15-M)=filename(13-M)› OD› filename(1)=$44 ; "D"› filename(2)=$3A ; ":"› filename(0)==+2 ; increase length pointer›› RETURN››;***************************************************************›PROC Set_two(BYTE ARRAY filename)› BYTE M› FOR M=1 TO 12› DO› filename(16-M)=filename(13-M)› OD› filename(1)=$44 ; "D"› filename(2)=$32 ; "2"› filename(3)=$3A ; ":"› filename(0)==+3 ; increase length pointer› › RETURN››;***************************************************************›PROC Get_number_of_drives()› ›DO›PutE()›PutE()›PrintE("DOS 3 to 2 Convertor")›Print("Number of drives (1-2)=>")›Number_drives=InputB()››IF Number_drives<1 OR Number_drives>2› THEN Put($7D)› PrintE("===========================")› PrintE("===========================")› PrintE("===========================")› PrintE("===========================")› PrintE(" ")› PrintE("Incorrect number of drives ")› Print(" Input a 1 or 2, not a ")› PrintBE(Number_drives)› PrintE(" ")› PrintE("===========================")› PrintE("===========================")› PrintE("===========================")› PrintE("===========================")› FI› UNTIL Number_drives=1 OR Number_drives=2› OD›› RETURN››;***************************************************************›PROC main()›BYTE Last_byte_count››Yes=$2B››DO ; Start of loop until Yes<>$2B "Y"››Poke($779,$50) ; turn off write verify››Put($7D) ; Clear screen››Close(1)›Close(2)››SHFLOK=$40 ; Set as upper case››IF Startup=0 THEN › Get_number_of_drives() FI› ›Startup=1›Yes=0››FOR I=0 TO 14›DO›filename_in(I)=$20›OD››Sector_count=0›Total_bytes_in_buffer=0›Stop_at_end_of_buffer=128›First_pass=0››Start_screen()››Print("Filename for input=D1:")›InputS(filename_in)›Set_one(filename_in)›› IF Number_drives=1 THEN› Print("Filename for output=D1:")› InputS(filename_out)› Set_one(filename_out)› Big_buff=$8100› addr=$8100› Input_disk()› ELSE› Print("Filename for output=D2:")› InputS(filename_out)› Set_two(filename_out)› addr=$8080› size=125› Open(2,filename_out,8,0) ; open for output› FI››; Find input file's first sector and›; number of sectors in file››Read_directory()››IF An_error=0 THEN › ›CRSINH=1 ; turn off cursor›Byte_count=0›I=0››DO ››Sector_count==+1››Read_Sector() ; call serial I/O routine››Fill_Buffer_Out()›› UNTIL Sectors_to_read-1=Sector_count›OD››Read_Sector() ; call serial I/O routine››Stop_at_end_of_buffer=max_bytes_in_last_sector››Fill_Buffer_Out()››IF Byte_count=0 AND Number_drives=2 THEN› CRSINH=0 ; turn on cursor› RETURN FI› ›IF Total_bytes_in_buffer=0 AND› Number_drives=1 AND Byte_count=0 THEN CRSINH=1 ; turn on cursor› CRSINH=0 ; turn on cursor› RETURN FI››IF Number_drives=2 THEN›size=Byte_count›Write_Sector()› ELSE›Last_byte_count=Byte_count›Output_disk()›size=Total_bytes_in_buffer›Write_Sector() ; Write big buffer›; write remaining in little buffer›addr=$8080›size=Last_byte_count›Write_Sector()› FI››Close(1)›Close(2)› FI ; End of An_error=0 loop›› CRSINH=0 ; turn on cursor››See_if_again()›› UNTIL Yes<>$2B › ›OD ; End of Main loop› ›SetColor(2,9,4) ; return color to blue›Put($7D) ; Clear screen›CH=$FF››RETURN››