spookt Posted January 22, 2009 Share Posted January 22, 2009 (edited) Hey - gotta love providence. I was patiently scanning through this a page at a time on my flatbed when guess what rolls up in the office? A brand spanking new colour copier / fax / digital sender / laser printer ! OK, I entrusted the manual to the sheet feed, tapped in my email address and ... presto PDF file. (Well actually 14 PDF files with 10 pages in each - need to find that setting and change it) And no bleed through ! So after stitching it together and having made a quick check here at last is the complete PL65 Programming Manual: PL65.pdf Happy reading ! Edited January 22, 2009 by spookt 1 Quote Link to comment Share on other sites More sharing options...
spookt Posted January 22, 2009 Author Share Posted January 22, 2009 Oops, uploaded this in a hurry. Didn't realise it was 6Mb ! Here's a zipped version (roughly half the download size): PL65.pdf.zip Quote Link to comment Share on other sites More sharing options...
UNIXcoffee928 Posted January 22, 2009 Share Posted January 22, 2009 WOW, this language looks cool! I wish that I had known about this language when it came out! & the editor looks like it would be great... Can someone post the ATR of the last version? I presume that there is a non-copy protected version out there, right? Are there any additional toolkits, user contributed libraries, or example source listings out there? Quote Link to comment Share on other sites More sharing options...
spookt Posted January 22, 2009 Author Share Posted January 22, 2009 It's here. I have an original disk from the same collection as the manual but it's bad - boots to the menu but the editor doesn't load If anyone wants a label scan for that true authentic looks gimme a shout Quote Link to comment Share on other sites More sharing options...
Tickled_Pink Posted January 23, 2009 Share Posted January 23, 2009 (edited) I don't believe it. I'm not alone!! I've got the original disk and a happied backup somewhere (both still worked last time I tried them). Unfortunately it looked like my parents threw out the manual before I could retrieve it, so I'm sooo happy someone else has scanned it. And how the hell did I miss this old thread? Didn't know that someone had actually cracked PL65, presumably from one of the uncracked/half cracked disk images I posted some time ago? PL65 is my favourite 8-bit language. The compiler is a little slow because it seems to work its way compiling a function/procedure at a time before saving it, producing a compound file as it goes. If anyone could come up with a tool to convert the compound file into one contiguous block so that it could be run from a ROM cart then that would be 0 If anyone seriously wants to have a go at the language and needs any help then feel free to PM me. Although I haven't access to my 8-bits at the minute, I used this language so much that I should be able to remember most of it. It was my first introduction to pointers, long before I came across C/C++. Edited January 23, 2009 by Tickled_Pink Quote Link to comment Share on other sites More sharing options...
+MrFish Posted January 23, 2009 Share Posted January 23, 2009 (edited) @ spookt: Thanks a lot for scanning the manual! I'd never heard of this language before. I assumed I had the disk for it, but alas not to be. Good to see that the program has been cracked already. I didn't catch the thread about that being done before either. The language looks great. On first review, it looks to be much better than Turbo-BASIC XL. No line numbers, PMG Library, Assembly functions, better constructs/functionality, etc. @ Tickled_Pink: In the PL65 Cracked thread, the author of the language claims to have written a defragmenter for the executables. Unfortunately he says, "God knows if you would ever find this". BTW: Now I know why you said, "I can't vote. My primary language has never been any of those." in the Programming Languages Poll. I thought you were making a joke, as I had assumed I hadn't forgotten any major languages (arrogant). You may soon have more company in your language choice. Edited January 23, 2009 by MrFish Quote Link to comment Share on other sites More sharing options...
dwhyte Posted January 23, 2009 Share Posted January 23, 2009 OPTION-ESC... Finally now I know how to exit the editor!!! Many thanks spookt for taking the time to scan this manual... Quote Link to comment Share on other sites More sharing options...
Tickled_Pink Posted January 23, 2009 Share Posted January 23, 2009 @ Tickled_Pink: In the PL65 Cracked thread, the author of the language claims to have written a defragmenter for the executables. Unfortunately he says, "God knows if you would ever find this". The guy who made the post wasn't the author (and didn't claim to be). I remember writing a letter to Noahsoft once and got a reply from someone with an Eastern European surname. I might have a stab at doing a similar program myself. Wanted to do one for years but never got around to it. As it's all just stripping headers, it can't be too difficult to do. Quote Link to comment Share on other sites More sharing options...
Fujix Posted January 23, 2009 Share Posted January 23, 2009 Spookt: many thanks for PDFing and posting the manual. Tickled_pink: yes, I cracked and posted PL65 using one of your images -- for which, thank you. Now we can all enjoy what is surely the most obscure of the available 8-bit languages... Quote Link to comment Share on other sites More sharing options...
Tickled_Pink Posted January 23, 2009 Share Posted January 23, 2009 How did you crack it in the end? Do you remember what you did? When I made my attempt I only half did the job - I could get the compiler to load and run, but anything I tried compiling with it wouldn't run. Quote Link to comment Share on other sites More sharing options...
ddez Posted January 24, 2009 Share Posted January 24, 2009 I had problems with compiled programs not running with the cracked PL65 version from the other thread. What I found is that there is code (Location $3637) that runs when you press 1 to start the compiler, this code does a checksum of the copy protection code. Since the copy protection code was modifed to bypass the bad sector check the checksum no longer matches. This in turn triggers code at $3649 that XORs the first $80 bytes of the runtime with $AA rendering the compiled program unusable. The version in the attached ATR has all of the code mentioned above removed and produces compiled code that runs now. pl65fix.zip 1 Quote Link to comment Share on other sites More sharing options...
+MrFish Posted January 25, 2009 Share Posted January 25, 2009 (edited) Completely bookmarked now... EDIT: i forgot to say, text searchable too... PL65___Manual.pdf Edited January 25, 2009 by MrFish Quote Link to comment Share on other sites More sharing options...
flashjazzcat Posted January 25, 2009 Share Posted January 25, 2009 Completely bookmarked now...PL65___Manual.pdf Great work! This looks like a really intriguing language. 1 Quote Link to comment Share on other sites More sharing options...
spookt Posted January 25, 2009 Author Share Posted January 25, 2009 Completely bookmarked now... EDIT: i forgot to say, text searchable too...PL65___Manual.pdf Excellent! Thanks. I was intending to go back and do that this week but you've saved me some work. Quote Link to comment Share on other sites More sharing options...
+MrFish Posted January 25, 2009 Share Posted January 25, 2009 A few corrections: PL65___Manual.pdf Quote Link to comment Share on other sites More sharing options...
+MrFish Posted January 25, 2009 Share Posted January 25, 2009 (edited) I had problems with compiled programs not running with the cracked PL65 version from the other thread. What I found is that there is code (Location $3637) that runs when you press 1 to start the compiler, this code does a checksum of the copy protection code. Since the copy protection code was modifed to bypass the bad sector check the checksum no longer matches. This in turn triggers code at $3649 that XORs the first $80 bytes of the runtime with $AA rendering the compiled program unusable. The version in the attached ATR has all of the code mentioned above removed and produces compiled code that runs now. Yes, compiled programs run now. Great work! Many thanks. Edited January 25, 2009 by MrFish Quote Link to comment Share on other sites More sharing options...
Tickled_Pink Posted January 28, 2009 Share Posted January 28, 2009 (edited) I had problems with compiled programs not running with the cracked PL65 version from the other thread. What I found is that there is code (Location $3637) that runs when you press 1 to start the compiler, this code does a checksum of the copy protection code. Since the copy protection code was modifed to bypass the bad sector check the checksum no longer matches. This in turn triggers code at $3649 that XORs the first $80 bytes of the runtime with $AA rendering the compiled program unusable. The version in the attached ATR has all of the code mentioned above removed and produces compiled code that runs now. That's great. I suspected that something was affecting the runtime code rather than the user compiled program. Nice to see a few interested people downloading the manual too. BTW: Can't remember if this is in the manual, but here's a little tip. If you're finding the compilation process a little slow and just want to do some syntax checking, just type in the source filename and press return for all the others the compiler prompts for. That way it'll just read the source, compile it, but won't save anything to disk. Edited January 28, 2009 by Tickled_Pink Quote Link to comment Share on other sites More sharing options...
+Allan Posted December 2, 2014 Share Posted December 2, 2014 Tickled_Pink, Do you mind if I put this on Atarimania? Allan Quote Link to comment Share on other sites More sharing options...
Alfred Posted August 3, 2016 Share Posted August 3, 2016 I've done a little reversing of the compiler, and it seems it has at least one bad bug. Use of the builtin variables like XSAVE, PUSH etc. will fail because there is a bug in the table scanner, it's off by one. So references to STACK will work, but nothing after that should be found. The compiler code is so odd that I remain convinced that it was written itself in either PL65 or something like it. For sure it was not written in Action!, it doesn't have any of the watermarks you'd see if that was used. Quote Link to comment Share on other sites More sharing options...
atx4us Posted August 5, 2016 Share Posted August 5, 2016 Wow - I just found out about this language today! Have there been any familiar programs that were developed on this language? Quote Link to comment Share on other sites More sharing options...
576XE Posted June 20, 2017 Share Posted June 20, 2017 Hi Friends!I bring to your kind attention and to your free disposal Memory Allocation Library for PL65 compiler.It is fully working.Just to ensure the clarity of the text I added some primitive functions to work with free-list in structs/records oriented manner.You know of course that PL65 lacks of structs and records.To my great surprise, this innovation made programming much easier.Here are the code of library itself and program for debugging.ALLOC.LIB !====================================! ! ALLOC.LIB Memory allocation library ! for PL65 compiler ! ! First-fit algorythm for malloc/free !------------------------------------! ! by Evgeny Zolotarev (aka 576XE),2017 !====================================! CONST NULL=0,FRED=1,USED=0 CONST MEMSTART=$4000,MEMEND=$BC00 CONST MEMSIZ=MEMEND-MEMSTART CONST METALEN=6,BYTSZ=1,INTSZ=2 !------------------------------------! POINTER gpP INT gpV BASED gpP POINTER freList !------------------------------------! FUNC getFlag(INT adr) BEGIN gpP=adr END gpV !------------------------------------! FUNC getSize(INT adr) BEGIN gpP=adr+2 END gpV !------------------------------------! FUNC getNext(INT adr) BEGIN gpP=adr+4 END gpV !------------------------------------! PROC setFlag(INT adr,flag) BEGIN gpP=adr gpV=flag END !------------------------------------! PROC setSize(INT adr,size) BEGIN gpP=adr+2 gpV=size END !------------------------------------! PROC setNext(INT adr,next) BEGIN gpP=adr+4 gpV=next END !------------------------------------! PROC memInit() BEGIN setFlag(freList,FRED) setSize(freList,MEMSIZ-METALEN) setNext(freList,NULL) END !------------------------------------! PROC split(POINTER fits INT size) POINTER new INT blkSiz BEGIN blkSiz=METALEN+size new=fits+blkSiz setFlag(new,FRED) setSize(new,getSize(fits)-blkSiz) setNext(new,getNext(fits)) setFlag(fits,USED) setSize(fits,size) setNext(fits,new) END !------------------------------------! FUNC alloc(INT nBytes) POINTER curr,result BEGIN IF (getSize(freList)=0) THEN memInit() WRTLN("Memory initialized") CR() ENDIF curr=freList WHILE ((getSize(curr)<nBytes OR getFlag(curr)=USED) AND getNext(curr)<>NULL) DO curr=getNext(curr) WRTLN("- Search for fitting block...") ENDWHILE IF getSize(curr)=nBytes THEN setFlag(curr,USED) result=curr+METALEN WRTLN("+ Exact fitting block allocated") RETURN result ENDIF IF getSize(curr)>nBytes+METALEN THEN split(curr,nBytes) result=curr+METALEN BASE=16 WRTSTR("Block $") WRITE(result) WRTSTR("-$") WRITE(result+nBytes) WRTSTR(" size=") BASE=10 WRITE(getSize(curr)) WRTLN(" allocated") RETURN result ELSE result=NULL WRTLN("- No sufficient memory to allocate") ENDIF END result !------------------------------------! PROC merge() POINTER curr INT size,next BEGIN curr=freList WHILE getNext(curr)<>NULL DO IF (getFlag(curr) AND getFlag(getNext(curr))) THEN size=getSize(curr)+getSize(getNext(curr))+METALEN setSize(curr,size) next=getNext(getNext(curr)) setNext(curr,next) ENDIF curr=getNext(curr) ENDWHILE END !------------------------------------! PROC free(POINTER ptr) POINTER curr BEGIN IF ptr>=MEMSTART AND ptr<=MEMEND THEN curr=ptr curr=curr-METALEN setFlag(curr,FRED) merge() WRTLN("+ Block freed, space merged") ELSE WRTLN("Please provide a valid allocated pointer") ENDIF END !====================================! ! End of Library ENDFILE ALLOC.PRG INCLUDE TERMINAL.LIB INCLUDE ALLOC.LIB MAIN() POINTER p,r,k POINTER q,w BEGIN freList=MEMSTART p=alloc(100*INTSZ) q=alloc(250*BYTSZ) r=alloc(1000*INTSZ) free(p) w=alloc(700) free(r) k=alloc(500*INTSZ) CR() WRTLN("Allocation and deallocation") WRTLN("are done successfully!") END And here is the result of allocations and deallocations of memory with related atr.ALLOC in use PL65 Compiler SpDOSx33a 360.atr There is no simple way without using of monitor to find the beginning of heap, but you can use an arbitrary value after looking at XREF table. You can freely delete debugging messages, of courseBest wishes from Moscow.ez 2 Quote Link to comment Share on other sites More sharing options...
576XE Posted June 20, 2017 Share Posted June 20, 2017 Hi there, atx4us. As I can remember KED - (PL65 full featured editor) was written in PL65. Also I know that KrisCross by Simon Trew was written in PL65 too. Quote Link to comment Share on other sites More sharing options...
576XE Posted November 28, 2020 Share Posted November 28, 2020 (edited) Hello, friends. Recently I wrote simple bank-switching routine in PL/65. !====================================! ! BANKS.PRG ! ! Using 130XE Extended Banks in ! ! PL65 Programming Language ! !------------------------------------! ! Evgeny Zolotarev,(aka 576XE), 2020 ! !====================================! INCLUDE TERMINAL.LIB !- CONSTANTS & VARIABLES: BYTE PORTB=$D301 INT bkNum !- DUMMY array representing ---------! !- selected BANKs slice ------------! BYTE bkMem[$4000]=$4000 !- Bank Selector Values -------------! !- Emulator ONLY(Sic.) Atari 576XE --! BYTE bkSel[33] DATA $91, $81,$83,$85,$87,$89,$8B,$8D,$8F, $A1,$A3,$A5,$A7,$A9,$AB,$AD,$AF, $C1,$C3,$C5,$C7,$C9,$CB,$CD,$CF, $E1,$E3,$E5,$E7,$E9,$EB,$ED,$EF; ! String VAR to store in all BANKS STRING inp$[4+27] DATA "==> User DATA from Bank #00"; ! Set string as VAR for appending STRING out$[4+27] DATA " "; !- PROCEDURES: !- Clear Screen Procedure -----------! PROC clrScr() CONST clr=255 BEGIN WRTSTR(CHR$(125)) END !- Wait for Any Key Pressed ---------! PROC anyKey() CONST none=255 BYTE CH=764 BEGIN WRTSTR("Wait for a Key...") CR() WHILE CH=none DO ENDWHILE CH=none END !- Place bkSel Tags into PORTB ------! PROC setBank(INT bkNum) CONST bkMask=%10010001 BYTE bkTag BEGIN bkTag=bkSel[bkNum] LDA PORTB AND bkMask OR bkTag STA PORTB END !- Writes to Bank -------------------! PROC writBk() BEGIN FOR bkNum=1 TO 32 DO WRTSTR("Writing to BANK #") WRITE(bkNum) CR() IF bkNum<10 THEN inp$[25,25]=STR$(0) inp$[26,26]=STR$(bkNum) ELSE inp$[25]=STR$(bkNum) ENDIF out$=inp$ setBank(bkNum) MOVE(.out,LEN(out$),.bkMem) NEXT END !- Reads from Bank ------------------! PROC readBk() BEGIN FOR bkNum=1 TO 32 DO WRTSTR("Reading BANK #") WRITE(bkNum) CR() setBank(bkNum) MOVE(.bkMem,LEN(out$),.out) WRTSTR(out$) CR() NEXT END !------------------------------------! MAIN() BEGIN clrScr() anyKey() writBk() anyKey() clrScr() readBk() END ! >>> EOF <<< ! This routine uses 576KiB RAM extension scheme of emulator ONLY! It works perfectly while traversing EXTMEM only i.e. [1..32] but if I try to traverse from MAIN bank to EXTMEM [0..32] it simply clears the screen for a moment and skips one or two strings of output or crashes. Nevertheless the DATA in all banks stays written firmly. I can see it reading emulator's monitor. The routine itself is clear and understandable but I still can not glue what's wrong. PL65 SD_X33A.atr Obviously you can use all codes at your disposal zen Edited November 28, 2020 by 576XE 1 Quote Link to comment Share on other sites More sharing options...
Preppie Posted November 28, 2020 Share Posted November 28, 2020 I still have the disk & manual for this but unfortunatly the disk won't load :( Quote Link to comment Share on other sites More sharing options...
+DjayBee Posted November 28, 2020 Share Posted November 28, 2020 33 minutes ago, Preppie said: unfortunatly the disk won't load Post an ATR. Perhaps it can be repaired. And with a lot of luck it is a different version. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.