Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: awanderin Newsgroups: comp.sys.apple2.programmer Subject: Re: Call Address to Print BASIC Error Message Date: Sat, 02 Feb 2019 11:32:39 -0700 Organization: A noiseless patient Spider Lines: 60 Message-ID: References: <2b9c4542-55b8-4f71-97d1-e0b5ad57b5b4@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: reader02.eternal-september.org; posting-host="89554e2849d440b9323ce27b36b577ac"; logging-data="18569"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19G7x75DRwdvMzW2ntDPxD33x4I5CK0SIA=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) Cancel-Lock: sha1:pYpqlIDhukH+dQy65uGvO3ULHr8= sha1:/VJ59hCV4Kt0kPAW08I6CMN1L3A= Xref: csiph.com comp.sys.apple2.programmer:4994 Michael Pohoreski writes: > = Demo = > > 1 DATA 32,251,218,32,90,219,166,222,189,96,210,72,9,128,32,237,253,232,104,16,243,169,80,160,211,76,58,219 > 2 FOR I = 0 TO 27: READ B: POKE 768+I,B:NEXT > 3 REM REPLACE 0 WITH APPROX. ERROR MESG OFFSET SUCH AS 42 > 4 POKE 222,0 > 10 CALL 768 > > > = ML = > > We can use this ML helper/utility to replicate the Applesoft error printing: > > ORG $300 > 300 JSR CRDO > JSR OUTQUES > LDX ERRSTK-1 > 308 LDA ERROR.MESG,X > PHA > ORA #$80 > JSR COUT > INX > PLA > BPL $308 > LDA #$50 ; Address of > LDX #$D3 ; ERROR^G > JMP STROUT > > = How it was made = > > We can convert the assembly HEX to DATA decimal statements via this JS snippet: > > var asc ="20 FB DA 20 5A DB A6 DE BD 60 D2 48 09 80 20 ED FD E8 68 10 F3 A9 50 A0 D3 4C 3A DB "; > var n = asc.length, text = "1 DATA "; > for( var i = 0; i < n; i += 3 ) > text += parseInt( "0x" + asc.substr( i, 2 ), 16 ) + ','; > console.log( text ); > console.log( "FOR I = 0 TO " + ((i/3)-1) ); > Here's an all-Applesoft way to do it. Substitute your choice of error on line 20... 10 ONERR GOTO 1000 20 PRINT 1 / 0 : REM Generate error 30 END 1000 BE = 53856 1010 EA = BE + PEEK (222) 1015 GOSUB 1050 1020 EA = BE + 240: GOSUB 1050 1030 PRINT " IN LINE " PEEK (218) + 256 * PEEK (219) 1040 END 1050 C = PEEK (EA): IF C > 0 AND C < 128 THEN PRINT CHR$ (C);:EA = EA + 1: GOTO 1050 1055 IF C > = 128 THEN PRINT CHR$ (C); 1060 RETURN -- Jerry awanderin at gmail dot com