OSS ASCII-ATASCII Text File Converter Copyrith (C) 1986 by OSS, Inc. and Christopher M. Kelley#

Taken from the OSS Newsletter-Fall 1986: Christopher M. Kelley wrote a program, which converts ASCII to ATASCII and vice versa.

ATR-Image#

Source Code#

1000 ;LIST#D:CONVERT.M65
1010 ;
1020 ;
1030 ;
1040 ;ASM,,#D:CONVERT.COM
1050 ;
1060 ; ===========================
1070 ;  ASCII - ATASCII Converter
1080 ;  by: Christopher M. Kelley
1090 ;  for: OSS, Inc. Newsletter
100 ; ===========================
110 ;
120     .OPT NO LIST
130 ;
140 ;Labels
150 ;
160 DOSVEC = $0A
170 LMARGN = $52
180 SAVLOC = $CB
190 INVFLG = $02B6
1200 SHFLOK = $02BE
1210 ICCOM = $0342
1220 ICBAL = $0344
1230 ICBAH = $0345
1240 ICBLL = $0348
1250 ICBLH = $0349
1260 ICAX1 = $034A
1270 CIOV =  $E456
1280 ;
1290 ;Start
1300 ;
1310     *=  $4000
1320 BEGIN
1330     JMP START
1340 ;
1350 ;Text
1360 ;
1370 TEXT
1380     .BYTE $7D,$9B,"   ASCII/ATASCII Text File Converter",$9B
1390     .BYTE " (c)1986 Christopher M. Kelley and
OSS.",$9B,$9B,$9B,$9B
1400     .BYTE $7F,"Conversion Type:",$9B
1410     .BYTE $7F,"  [1]ASCII To ATASCII",$9B
1420     .BYTE $7F,"  [2]ATASCII To ASCII",$9B
1430     .BYTE $7F,"  [Q]Quit",$9B,$9B,$9B
1440 ;
1450 QUSTN
1460     .BYTE $1C,$9C,$7F,"Please Choose:",$00
1470 ;
1480 RETURN
1490     .BYTE $9B,$9B,$00
1500 ;
1510 INFILE
1520     .BYTE $1C,$9C,"    File To Convert:",$00
1530 ;
1540 OUTFILE
1550     .BYTE $1C,$9C,"    Output File:",$00
1560 ;
1570 DONE
1580     .BYTE $9B,$9B,$7F,"DONE! - [RETURN] To Continue",$00 $
1590 ;
1600 ERR
1610     .BYTE $7F,"ERROR - [RETURN] To Retry",$00
1620 ;
1630 EDIT
1640     .BYTE "E:"
1650 ;
1660 INNAME
1670     .BYTE "D:               "
1680 ;
1690 OUTNAME
1700     .BYTE "D:               "
1710 ;
1720 ANSWER
1730     .BYTE $00,$00
1740 ;
1750 FLAG
1760     .BYTE $00,$00,$00
1770 ;
1780 TLEN
1790     .BYTE $00
1800 ;
1810 ATRET
1820     .BYTE $9B
1830 ;
1840 ASCRET
1850     .BYTE $0D,$0A
1860 ;
1870 SAVLM
1880     .BYTE $00
1890 ;
1900 ;Open Channel 1 To E:
1910 ;
1920 START
1930     LDA LMARGN  ;SAVE ORIGINAL
1940     STA SAVLM   ;LEFT MARGIN
1950     LDA #$00
1960     STA LMARGN
1970 ;
1980     LDX #$10    ;CHANNEL 1
1990     LDA #$0C    ;CLOSE
2000     STA ICCOM,X ;JUST IN CASE
2010     JSR CIOV
2020 ;
2030     LDX #$10    ;CHANNEL 1
2040     LDA #$03    ;OPEN
2050     STA ICCOM,X ;EDITOR
2060     LDA # <EDIT
2070     STA ICBAL,X
2080     LDA # >EDIT
2090     STA ICBAH,X
2100     LDA #$0C    ;READ,WRITE
2110     STA ICAX1,X
2120     JSR CIOV    ;DO IT
2130 ;
2140 ;Print Text
2150 ;
2160 PRG
2170     LDA # <TEXT ;HOLD ADDR OF
2180     STA SAVLOC  ;TEXT FOR USE
2190     LDA # >TEXT
2200     STA SAVLOC+1
2210     JSR PRNTIC1
2220 ;
2230 ;Get Answer
2240 ;
2250 GETNUM
2260     LDA # <ANSWER ;HOLD ADDR OF
2270     STA SAVLOC  ;ANSWER FOR USE
2280     LDA # >ANSWER
2290     STA SAVLOC+1
2300     LDA #$02    ;ANSWER LENGTH
2310     STA TLEN
2320     JSR GETIC1
2330 ;
2340     LDA ANSWER  ;FIND OUT WHAT
2350     CMP #$31    ;ANSWER WAS
2360     BNE TRY2    ;NOT 1
2370     LDA #$00    ;IT IS 1
2380     STA FLAG    ;SET FLAG FOR
2390     JMP CONVRT  ;ASCII - ATASCII
2400     LDA #$40    ;SET UP CAPS
2410     STA SHFLOK
2420 ;
2430 TRY2
2440     CMP #$32
2450     BNE TRYQ    ;NOT 2
2460     LDA #$01    ;IT IS 2
2470     STA FLAG    ;SET FLAG FOR
2480     JMP CONVRT  ;ATASCII - ASCII
2490 ;
2500 TRYQ
2510     CMP #$51
2520     BNE TRYAGN  ;NOT Q
2530     LDA SAVLM   ;RESTORE LEFT
2540     STA LMARGN  ;MARGIN
2550     JMP (DOSVEC) ;BACK TO DOS
2560 ;
2570 TRYAGN
2580     LDA # <QUSTN ;REPRINT JUST
2590     STA SAVLOC  ;THE QUESTION
2600     LDA # >QUSTN
2610     STA SAVLOC+1
2620     JSR PRNTIC1 ;PRINT IT
2630     JMP GETNUM  ;TRY AGAIN
2640 ;
2650 ;Print Routine
2660 ;
2670 PRNTIC1
2680     LDY #$00
2690     LDA (SAVLOC),Y ;$00=TEXT END
2700     CMP #$00    ;SAVLOC=ADDR OF
2710     BEQ ENDPRNT ;TEXT
2720     LDX #$10    ;CHANEL 1
2730     LDA #$0B    ;PUT BINARY REC
2740     STA ICCOM,X
2750     LDA SAVLOC  ;TEXT ADDR
2760     STA ICBAL,X
2770     LDA SAVLOC+1
2780     STA ICBAH,X
2790     LDA #$01    ;1 CHAR ONLY
2800     STA ICBLL,X
2810     LDA #$00
2820     STA ICBLH,X
2830     JSR CIOV    ;DO IT
2840     INC SAVLOC  ;NEXT CHAR
2850     BNE PRNTIC1
2860     INC SAVLOC+1
2870     JMP PRNTIC1 ;DO IT AGAIN
2880 ENDPRNT
2890     RTS 
2900 ;
2910 ;Get Answer
2920 ;
2930 GETIC1
2940     LDA #$00    ;SET NO INVERSE
2950     STA INVFLG
2960     LDX #$10    ;CHANNEL 1
2970     LDA #$05    ;GET TEXT REC
2980     STA ICCOM,X
2990     LDA SAVLOC  ;BUFFER ADDR
3000     STA ICBAL,X
3010     LDA SAVLOC+1
3020     STA ICBAH,X
3030     LDA TLEN    ;GET LENGTH
3040     STA ICBLL,X
3050     LDA #$00
3060     STA ICBLH,X
3070     JSR CIOV    ;DO IT
3080     RTS 
3090 ;
3100 ;Get Filenames
3110 ;
3120 CONVRT
3130     LDA # <RETURN ;HOLD ADDR OF
3140     STA SAVLOC  ;TEXT FOR USE
3150     LDA # >RETURN
3160     STA SAVLOC+1
3170     JSR PRNTIC1
3180 ;
3190 GETIN
3200     LDA # <INFILE ;PRINT SOME
3210     STA SAVLOC  ;MORE TEXT
3220     LDA # >INFILE
3230     STA SAVLOC+1
3240     JSR PRNTIC1
3250 ;
3260     LDA #$00
3270     TAX 
3280 ;
3290 CLRIN
3300     STA INNAME+2,X
3310     INX 
3320     CPX #$0F
3330     BNE CLRIN
3340 ;
3350     LDA # <INNAME+2 ;GET
3360     STA SAVLOC  ;FILE TO CONVERT
3370     LDA # >INNAME+2
3380     STA SAVLOC+1
3390     LDA #$0F    ;TEXT LENGTH
3400     STA TLEN
3410     JSR GETIC1
3420 ;
3430     LDA INNAME+3 ;FIND COLON
3440     CMP #$3A
3450     BNE TRYNXT
3460     LDA #$00    ;FOUND IT, SET
3470     STA FLAG+1  ;FLAG
3480     JMP OPENIN
3490 ;
3500 TRYNXT
3510     LDA INNAME+4 ;TRY AGAIN FOR
3520     CMP #$3A    ;COLON
3530     BNE NOTHERE
3540     LDA #$00    ;FOUNT IT, SET
3550     STA FLAG+1  ;FLAG
3560     JMP OPENIN
3570 ;
3580 NOTHERE
3590     LDA #$01    ;IT'S NOT HERE
3600     STA FLAG+1  ;SET FLAG
3610 ;
3620 OPENIN
3630     LDX #$20    ;CHANNEL 2
3640     LDA #$0C    ;CLOSE - JUST
3650     STA ICCOM,X ;IN CASE
3660     JSR CIOV
3670 ;
3680     LDX #$20    ;CHANNEL 2
3690     LDA #$03    ;OPEN
3700     STA ICCOM,X
3710     LDA FLAG+1  ;CHECK FLAG
3720     CMP #$00
3730     BNE NOTSET
3740     LDA # <INNAME+2 ;FILENAME
3750     STA ICBAL,X ;ADDR
3760     LDA # >INNAME+2
3770     STA ICBAH,X
3780     JMP CONT
3790 ;
3800 NOTSET
3810     LDA # <INNAME ;FILENAME ADDR
3820     STA ICBAL,X
3830     LDA # >INNAME
3840     STA ICBAH,X
3850 ;
3860 CONT
3870     LDA #$04    ;READ FILE
3880     STA ICAX1,X
3890     JSR CIOV
3900     BPL GETOUT  ;IT WORKED
3910     JMP GETIN   ;FAILED - RETRY
3920 ;
3930 GETOUT
3940     LDA # <RETURN ;HOLD ADDR OF
3950     STA SAVLOC  ;TEXT FOR USE
3960     LDA # >RETURN
3970     STA SAVLOC+1
3980     JSR PRNTIC1
3990 ;
4000 GETOUT1
4010     LDA # <OUTFILE ;PRINT SOME
4020     STA SAVLOC  ;MORE TEXT
4030     LDA # >OUTFILE
4040     STA SAVLOC+1
4050     JSR PRNTIC1
4060 ;
4070     LDA #$00
4080     TAX 
4090 ;
4100 CLROUT
4110     STA OUTNAME+2,X
4120     INX 
4130     CPX #$10
4140     BNE CLROUT
4150 ;
4160     LDA # <OUTNAME+2 ;GET
4170     STA SAVLOC  ;FILE TO CONVERT
4180     LDA # >OUTNAME+2
4190     STA SAVLOC+1
4200     LDA #$0F    ;TEXT LENGTH
4210     STA TLEN
4220     JSR GETIC1
4230 ;
4240     LDA OUTNAME+3 ;FIND COLON
4250     CMP #$3A
4260     BNE TRYNXT1
4270     LDA #$00    ;FOUND IT, SET
4280     STA FLAG+2  ;FLAG
4290     JMP OPENOUT
4300 ;
4310 TRYNXT1
4320     LDA OUTNAME+4 ;TRY AGAIN FOR
4330     CMP #$3A    ;COLON
4340     BNE NOTHERE1
4350     LDA #$00    ;FOUNT IT, SET
4360     STA FLAG+2  ;FLAG
4370     JMP OPENOUT
4380 ;
4390 NOTHERE1
4400     LDA #$01    ;IT'S NOT HERE
4410     STA FLAG+2  ;SET FLAG
4420 ;
4430 OPENOUT
4440     LDX #$30    ;CHANNEL 3
4450     LDA #$0C    ;CLOSE - JUST
4460     STA ICCOM,X ;IN CASE
4470     JSR CIOV
4480 ;
4490     LDX #$30    ;CHANNEL 2
4500     LDA #$03    ;OPEN
4510     STA ICCOM,X
4520     LDA FLAG+2  ;CHECK FLAG
4530     CMP #$00
4540     BNE NOTSET1
4550     LDA # <OUTNAME+2 ;FILENAME
4560     STA ICBAL,X ;ADDR
4570     LDA # >OUTNAME+2
4580     STA ICBAH,X
4590     JMP CONT1
4600 ;
4610 NOTSET1
4620     LDA # <OUTNAME ;FILENAME
4630     STA ICBAL,X ;ADDR
4640     LDA # >OUTNAME
4650     STA ICBAH,X
4660 ;
4670 CONT1
4680     LDA #$08    ;WRITE FILE
4690     STA ICAX1,X
4700     JSR CIOV
4710     BPL DOIT
4720     JMP GETOUT1
4730 ;
4740 ;Do Conversion
4750 ;
4760 DOIT
4770     LDA FLAG    ;FIND OUT WHICH
4780     CMP #$00    ;CONVERSION
4790     BEQ ASCAT
4800     JMP ATASC
4810 ;
4820 ASCAT
4830     LDA # <ANSWER ;STORE ADDR
4840     STA SAVLOC
4850     LDA # >ANSWER
4860     STA SAVLOC+1
4870     JSR GETIC2
4880     BPL GETCHAR
4890     JMP END
4900 ;
4910 GETCHAR
4920     LDA ANSWER  ;IS IT CTRL-M?
4930     CMP #$0D
4940     BEQ GOTIT   ;YES, REPLACE IT
4950     LDA # <ANSWER ;NO, PUT CHAR
4960     STA SAVLOC  ;BACK
4970     LDA # >ANSWER
4980     STA SAVLOC+1
4990     LDA #$01
5000     STA TLEN
5010     JSR PUTIC3
5020     BPL ASCAT
5030     JMP ERROR
5040 ;
5050 GOTIT
5060     LDA # <ANSWER ;YES, GET
5070     STA SAVLOC  ;SECOND PART
5080     LDA # >ANSWER
5090     STA SAVLOC+1
5100     JSR GETIC2
5110 ;
5120     LDA # <ATRET ;PUT ATASCII
5130     STA SAVLOC  ;C/R TO OUTPUT
5140     LDA # >ATRET
5150     STA SAVLOC+1
5160     LDA #$01
5170     STA TLEN
5180     JSR PUTIC3
5190     BPL ASCAT
5200     JMP ERROR
5210 ;
5220 GETIC2
5230     LDX #$20    ;CHANNEL #2
5240     LDA #$07    ;GET BINARY REC
5250     STA ICCOM,X
5260     LDA SAVLOC  ;BUFFER ADDR
5270     STA ICBAL,X
5280     LDA SAVLOC+1
5290     STA ICBAH,X
5300     LDA #$01    ;LENGTH = 1
5310     STA ICBLL,X
5320     LDA #$00
5330     STA ICBLH,X
5340     JSR CIOV
5350     RTS 
5360 ;
5370 PUTIC3
5380     LDX #$30    ;CHANNEL #3
5390     LDA #$0B    ;PUT BINARY REC
5400     STA ICCOM,X
5410     LDA SAVLOC  ;TEXT ADDR
5420     STA ICBAL,X
5430     LDA SAVLOC+1
5440     STA ICBAH,X
5450     LDA TLEN    ;TEXT LENGTH
5460     STA ICBLL,X
5470     LDA #$00
5480     STA ICBLH,X
5490     JSR CIOV
5500     RTS 
5510 ;
5520 ATASC
5530     LDA # <ANSWER ;STORE ADDR
5540     STA SAVLOC
5550     LDA # >ANSWER
5560     STA SAVLOC+1
5570     JSR GETIC2
5580     BPL GETCHAR1
5590     JMP END
5600 ;
5610 GETCHAR1
5620     LDA ANSWER
5630     CMP #$9B    ;IS IT C/R?
5640     BEQ GOTIT1  ;YES, REPLACE IT
5650     LDA # <ANSWER ;NO, PUT IT
5660     STA SAVLOC  ;BACK
5670     LDA # >ANSWER
5680     STA SAVLOC+1
5690     LDA #$01
5700     STA TLEN
5710     JSR PUTIC3
5720     BPL ATASC
5730     JMP ERROR
5740 ;
5750 GOTIT1
5760     LDA # <ASCRET ;PUT ASCII
5770     STA SAVLOC  ;C/R,LF PAIR IN
5780     LDA # >ASCRET
5790     STA SAVLOC+1
5800     LDA #$02
5810     STA TLEN
5820     JSR PUTIC3
5830     BPL ATASC
5840     JMP ERROR
5850 ;
5860 ;End Of Run
5870 ;
5880 END
5890     LDX #$20    ;CHANNEL 2
5900     LDA #$0C    ;CLOSE
5910     STA ICCOM,X
5920     JSR CIOV
5930 ;
5940     LDX #$30    ;CHANNEL 3
5950     LDA #$0C    ;CLOSE
5960     STA ICCOM,X
5970     JSR CIOV
5980 ;
5990     LDA # <DONE ;LET USER KNOW
6000     STA SAVLOC
6010     LDA # >DONE
6020     STA SAVLOC+1
6030     JSR PRNTIC1
6040 ;
6050     LDA # <ANSWER ;GET C/R
6060     STA SAVLOC
6070     LDA # >ANSWER
6080     STA SAVLOC+1
6090     LDA #$02
6100     STA TLEN
6110     JSR GETIC1
6120 ;
6130     JMP PRG
6140 ;
6150 ERROR
6160     LDX #$20    ;CHANNEL 2
6170     LDA #$0C    ;CLOSE
6180     STA ICCOM,X
6190     JSR CIOV
6200 ;
6210     LDA #$30    ;CHANNEL 3
6220     LDA #$0C    ;CLOSE
6230     STA ICCOM,X
6240     JSR CIOV
6250 ;
6260     LDA # <ERR  ;THERE'S A PROB
6270     STA SAVLOC
6280     LDA # >ERR
6290     STA SAVLOC+1
6300     JSR PRNTIC1
6310 ;
6320     LDA # <ANSWER ;GET C/R
6330     STA SAVLOC
6340     LDA # >ANSWER
6350     STA SAVLOC+1
6360     LDA #$02
6370     STA TLEN
6380     JSR GETIC1
6390 ;
6400     JMP PRG
6410 ;
6420 ;End Of Program
6430 ;
6440     *=  $02E0
6450     .WORD BEGIN
6460 ;
6470     .END