zbyti Posted October 2, 2020 Share Posted October 2, 2020 (edited) Little explanatory of two useful directives: SET $E = $2000 SET $491 = $2000 $E holds address of our code base (our code start here after compilation) $491 sets LOMEM. The other words our XEX will be written (monitor W "H1:FILE.XEX") from that address to the end of our compiled code. In most of the cases above addresses should be the same. EDIT: Absolutely must to read: https://atariwiki.org/wiki/Wiki.jsp?page=Getting in on the Action 1 https://atariwiki.org/wiki/Wiki.jsp?page=Getting in on the Action 2 Edited October 3, 2020 by zbyti must to read 1 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 3, 2020 Share Posted October 3, 2020 (edited) CMC music in Action! ;------------------------------------------------------------------------------ ; CMC VBLANK ROUTINE ;------------------------------------------------------------------------------ DEFINE ADDRMUS="$2000",ADDRPLA="$2696", JMP="$4C",XITVBV="$E462" SET $E=ADDRMUS SET $491=ADDRMUS ; Andrzej Kidaj - Acces PROC MUSIC=*()[ ; DATA ] SET $E=ADDRPLA PROC PLAYER=*()[ ; DATA ] PROC COMM=ADDRPLA+3(BYTE A, CARD XY) PROC TRACK=ADDRPLA+6() PROC SETVBLV=$E45C(BYTE A,X,Y) PROC VPLAY=*() TRACK() [JMP XITVBV] PROC SETVPLAY(CARD ADDR) BYTE POINTER P=0 SETVBLV(7,P(@ADDR+1),P(@ADDR)) RETURN PROC MAIN=*() BYTE CH=$2FC COMM($70,MUSIC) COMM(0,0) SETVPLAY(VPLAY) WHILE CH=$FF DO OD SETVPLAY(XITVBV) ; STOP COMM($40,0) ; VBLK MUSIC RETURN Edited October 3, 2020 by zbyti template only 1 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 3, 2020 Share Posted October 3, 2020 (edited) CMC player routine by Marek "Marok" Sasnal MAROKCMC.ACT MAROKCMC.XEX Edited October 3, 2020 by zbyti 2 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 3, 2020 Share Posted October 3, 2020 (edited) MPT in Action! Adam Bienias - Vroom Intro DEFINE ADDRPLA="$2000",ADDRMUS="$3000", RBARON="[$A9$E$8D$0A$D4$8D$1A$D0]",RBAROFF="[$A9$0$8D$1A$D0]" SET $E=ADDRPLA SET $491=ADDRPLA PROC PLAYER=*()[ ; DATA ] ; Adam Bienias - Vroom Intro SET $E=ADDRMUS PROC MUSIC=*()[ ; DATA ] PROC COMM=ADDRPLA(BYTE A) PROC TAKT=ADDRPLA+3() PROC MAIN() BYTE CH=$2FC,VCOUNT=$D40B COMM(0) ; INIT DO IF VCOUNT=$10 THEN RBARON TAKT() RBAROFF FI UNTIL CH#255 OD COMM(1) ; STOP RETURN MPTMUSIC.ACT MPTMUSIC.XEX Edited October 3, 2020 by zbyti MPT Player 2 1 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 4, 2020 Share Posted October 4, 2020 Let our Powers Combine! foxdos-slidemus.atr SLIDEMUS.ACT 1 Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 9, 2020 Author Share Posted October 9, 2020 I will have a long weekend ahead so I will have time to go over the examples you sent. I tried one so far Then hopefully I have a theme for the next articles.. Cheers 1 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 10, 2020 Share Posted October 10, 2020 (edited) Refactored SYSOFF ;------------------------------------------------------------------------------ ; System Off in Action! ; by @zbyti ;------------------------------------------------------------------------------ ; STABLE APPMHI CODEBASE CODEOFF SET $495=8 SET $E=$1000 SET $491=$1000 ;SET $B5=$FA00 ; offset for F0x Dos set CODEBASE to $0A00 ;------------------------------------------------------------------------------ DEFINE PHR="[$48$8A$48$98$48]",PLR="[$68$A8$68$AA$68]", PHA="[$48]",PLA="[$68]",SEI="[$78]", RTI="[$40]",RTS="[$60]",OFFJMP="NMI+21" ;------------------------------------------------------------------------------ PROC NMI=*()[ $2C $0F $D4 ;BIT $D40F ;NMIST $10 $03 ;BPL $4C OFFJMP ;JMP VDSLST $E6 $14 ;INC $14 ;RTCLOK+2 $D0 $06 ;BNE $E6 $13 ;INC $13 ;RTCLOK+1 $D0 $02 ;BNE $E6 $12 ;INC $12 ;RTCLOK $4C OFFJMP ;JMP VBIVEC $40 ;OFFJMP ] PROC WAIT=*(BYTE F)[$18$65$14$C5$14$D0$FC$60] ;------------------------------------------------------------------------------ MODULE BYTE COLPF2=$D018,PORTB=$D301, WSYNC=$D40A,NMIEN=$D40E, CARTOFF=$D508,RTCLOK2=$14 CARD DLIST=$D402,NMIVEC=$FFFA,LMS=$E000, VDSLST=NMI+6,VBIVEC=NMI+19 PROC SYSTEMOFF=*() SEI NMIEN=0 PORTB=$FE NMIVEC=NMI NMIEN=$40 RTS ;------------------------------------------------------------------------------ ; some example of display list and interrupts ;------------------------------------------------------------------------------ PROC DL=*()[ $70 $70 $70 $42 LMS 2 2 $F0 2 2 2 $F0 2 2 2 $41 DL ] PROC DLI2=*() PHA COLPF2=RTCLOK2 PLA RTI PROC DLI1=*() PHA COLPF2=$DE WSYNC=$DE VDSLST=DLI2 PLA RTI PROC VBI=*() PHR COLPF2=RTCLOK2 VDSLST=DLI1 PLR RTI ;------------------------------------------------------------------------------ PROC MAIN=*() ; CARTOFF=1 disable Action! 3.6 cartridge SYSTEMOFF() WAIT(50) DLIST=DL WAIT(100) VBIVEC=VBI WAIT(100) VDSLST=DLI1 NMIEN=$C0 WAIT(255) VBIVEC=OFFJMP VDSLST=OFFJMP DO OD RTS Edited October 10, 2020 by zbyti typo 1 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 10, 2020 Share Posted October 10, 2020 My SYSOFF project template. Action_SYSOFF_Template.zip 1 Quote Link to comment Share on other sites More sharing options...
funkheld Posted October 11, 2020 Share Posted October 11, 2020 can you please do that in source asm? I do not understand what you are writing. greeting --------------------------- BYTE FUNC Peek=*(CARD a) [$85$A2$86$A3$A0$00$B1$A2$85$A0$60] CARD FUNC PeekC=*(CARD a) [$85$A2$86$A3$A0$00$B1$A2$85$A0$C8$B1 $A2$85$A1$60] PROC Poke=*(CARD a BYTE v) [$85$A0$86$A1$98$A0$00$91$A0$60] PROC PokeC=*(CARD a, v) [$20 Poke $C8$A5$A3$91$A0$60] PROC MoveBlock=*(BYTE POINTER d,s CARD l) [$A085$A186$A284$A0$0$A5A5$16F0$A2B1$A091$C8$F9D0 $A1E6$A3E6$A5C6$F1D0$5F0$A2B1$A091$C8$A4C4$F7D0$60] PROC SetBlock=*(BYTE POINTER a CARD s BYTE v) [$A085$A186$A284$A0$0$A4A5$A3A6$10F0$A091$C8$FBD0 $A1E6$A3C6$F5D0$3F0$A091$C8$A2C4$F9D0$60] -------------------------------- Quote Link to comment Share on other sites More sharing options...
funkheld Posted October 11, 2020 Share Posted October 11, 2020 please implement this too: ---------------------------- PROC PAUSE=*()[$A5$14$C5$14$F0$FC$60] PROC WAIT=*(BYTE F)[$18$65$14$C5$14$D0$FC$60] PROC RSYNC=*(BYTE L)[$CD$0B$D4$D0$FB$60] --------------------------- greeting Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 11, 2020 Share Posted October 11, 2020 (edited) Compile program and use ? PROCNAME in monitor then read the address of the procedure and check memory: diss.mp4 Edited October 11, 2020 by zbyti add video - go to fullscreen 1 Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 16, 2020 Author Share Posted October 16, 2020 On 10/11/2020 at 7:20 AM, zbyti said: Compile program and use ? PROCNAME in monitor then read the address of the procedure and check memory: diss.mp4 651.92 kB · 2 downloads @zbyti I was looking at the video . When you launch the atari800 emulator, the command "C H:program.act" is injected automatically or you are typing it? If the first, how are you doing that. I couldn't find a way to do that with Atari800... Thanks Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 16, 2020 Share Posted October 16, 2020 (edited) @pedgarcia I'm using the emulator save state with typed C "H6:MAIN.ACT". In Sublime syntax highlighting package I have action.sublime-build: { "shell_cmd": "xfce4-terminal -x atari800 -H1 . -state /home/zbyti/Retro/Atari/a8s/action-compile.a8s", "selector": "source.action" } I can compile only MAIN.ACT from given folder, in other case I run (custom key binding) Action! and type in filename by hand. Edited October 16, 2020 by zbyti action.sublime-build 1 Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 16, 2020 Author Share Posted October 16, 2020 Save state!? That's ingenious! I haven't thought of that at all. Thanks! 1 Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 17, 2020 Share Posted October 17, 2020 (edited) I started using Action! (April this year) due to one of his last evangelists. He claimed that Action! in many cases it is as fast as ML. My many tests shows that the single-pass Action! compiler reaches at most half the speed of the ML. Here is an example of code (fire effect) that should be executed in one frame. Frame synchronization turned off. ;------------------------------------------------------------------------------ ; Fire by koalka/bbsl/karzelki ; Action! version by zbyti ;------------------------------------------------------------------------------ ; APPMHI CODEBASE SET $E=$2000 SET $491=$2000 ;------------------------------------------------------------------------------ DEFINE CHARSET="$6000",CHARSETH="$60",SCREEN="$6400", LDA="$A5",STA="$85",LSR="$4A",RTS="[$60]" BYTE SDMCTL=$22F,GPRIOR=$26F,COLOR4=$2C8, COLBK=$D01A,RANDOM=$D20A BYTE B0I=$CA,B1I=$CB,TMP=$CC BYTE POINTER P=0,PCHARSET=CHARSET CARD VDSLST=$200,SDLSTL=$230,CHBAS=$2F4 PROC DL=*()[ $42 SCREEN 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 $41 DL ] PROC PAUSE=*()[$A5$14$C5$14$F0$FC$60] PROC MAIN=*() COLOR4=$20 TMP=0 SDLSTL=DL CHBAS=CHARSETH GPRIOR=$40 SDMCTL=$21 B0I=0 DO P(SCREEN+B0I)=0 P(SCREEN+$100+B0I)=0 P(SCREEN+$200+B0I)=0 P(SCREEN+$300+B0I)=0 B0I==+1 UNTIL B0I=0 OD B0I=0 DO B1I=0 DO PCHARSET(B1I)=TMP B1I==+1 UNTIL B1I=8 OD PCHARSET==+8 TMP==+$11 B0I==+1 UNTIL B0I=$10 OD DO B0I=0 DO TMP=P(SCREEN-1+B0I) TMP==+P(SCREEN+B0I) TMP==+P(SCREEN+1+B0I) TMP==+P(SCREEN+32+B0I) [LDA TMP LSR LSR STA TMP] P(SCREEN-31+B0I)=TMP TMP=P(SCREEN-1+$100+B0I) TMP==+P(SCREEN+$100+B0I) TMP==+P(SCREEN+1+$100+B0I) TMP==+P(SCREEN+32+$100+B0I) [LDA TMP LSR LSR STA TMP] P(SCREEN-31+$100+B0I)=TMP TMP=P(SCREEN-1+$200+B0I) TMP==+P(SCREEN+$200+B0I) TMP==+P(SCREEN+1+$200+B0I) TMP==+P(SCREEN+32+$200+B0I) [LDA TMP LSR LSR STA TMP] P(SCREEN-31+$200+B0I)=TMP B0I==+1 UNTIL B0I=0 OD ;COLBK=10 ;PAUSE() B0I=$1F DO P(SCREEN+$2E0+B0I)=RANDOM&15 B0I==-1 UNTIL B0I=$FF OD OD RTS Even after replacing the body of extensively used loops by ML it is still insufficient and whole loop would have to be replaced with branch jump - DIY ;------------------------------------------------------------------------------ ; Fire by koalka/bbsl/karzelki ; Action! version by zbyti ;------------------------------------------------------------------------------ ; APPMHI CODEBASE SET $E=$2000 SET $491=$2000 ;------------------------------------------------------------------------------ DEFINE CHARSET="$6000",CHARSETH="$60",SCREEN="$6400",RTS="[$60]", LDA="$AD",LDAX="$BD",STAX="$9D",LSR="$4A",CLC="$18",ANDI="$29", ADCX="$7D",LDX="$A6",INC="$E6",DEC="$C6" BYTE SDMCTL=$22F,GPRIOR=$26F,COLOR4=$2C8, COLBK=$D01A,RANDOM=$D20A BYTE B0I=$CA,B1I=$CB,TMP=$CC BYTE POINTER P=0,PCHARSET=CHARSET CARD VDSLST=$200,SDLSTL=$230,CHBAS=$2F4 PROC DL=*()[ $42 SCREEN 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 $41 DL ] PROC PAUSE=*()[$A5$14$C5$14$F0$FC$60] PROC MAIN=*() COLOR4=$20 TMP=0 SDLSTL=DL CHBAS=CHARSETH GPRIOR=$40 SDMCTL=$21 B0I=0 DO P(SCREEN+B0I)=0 P(SCREEN+$100+B0I)=0 P(SCREEN+$200+B0I)=0 P(SCREEN+$300+B0I)=0 B0I==+1 UNTIL B0I=0 OD B0I=0 DO B1I=0 DO PCHARSET(B1I)=TMP B1I==+1 UNTIL B1I=8 OD PCHARSET==+8 TMP==+$11 B0I==+1 UNTIL B0I=$10 OD DO B0I=0 DO [ LDX B0I LDAX $63FF CLC ADCX SCREEN ADCX $6401 ADCX $6420 LSR LSR STAX $63E1 LDAX $64FF CLC ADCX SCREEN+$100 ADCX $6501 ADCX $6520 LSR LSR STAX $64E1 LDAX $65FF CLC ADCX SCREEN+$200 ADCX $6601 ADCX $6620 LSR LSR STAX $65E1 INC B0I ] UNTIL B0I=0 OD ;COLBK=10 ;PAUSE() B0I=$1F DO [ LDX B0I LDA RANDOM ANDI $F STAX $66E0 DEC B0I ] UNTIL B0I=$FF OD OD RTS FIREFAST.XEX FIRESLOW.XEX Edited October 17, 2020 by zbyti add xex 1 Quote Link to comment Share on other sites More sharing options...
Alfred Posted October 17, 2020 Share Posted October 17, 2020 All those pointer references (P(Screen)) are killing you. Quote Link to comment Share on other sites More sharing options...
zbyti Posted October 17, 2020 Share Posted October 17, 2020 (edited) 4 hours ago, Alfred said: All those pointer references (P(Screen)) are killing you. Do you know a faster way? Pointer produce huge code but peek&poke as subroutines are not a solution in speed department. I know what's killing me but do you have the cure? If you can write a faster code, I'd love to see it Edited October 17, 2020 by zbyti faster code Quote Link to comment Share on other sites More sharing options...
8bit-Dude Posted October 18, 2020 Share Posted October 18, 2020 On 12/3/2019 at 1:14 PM, pedgarcia said: Today, I decided to start looking into it again with the objective to write some articles for my website about it and also finally learn something about Atari 8-bit programming in general. Since your aim is to write some articles, how about something new, that has not been covered yet? If you are familiar with C, then I invite you to try 8bit-unity. Not only does it contain a super simple API, but also all the tools you need to create and package your assets (bitmaps, sprite, music). It also has some advantages, like ability to display 10 sprites (by VBI flicker), without requiring you to do anything. I posted some info here today: 1 Quote Link to comment Share on other sites More sharing options...
funkheld Posted October 18, 2020 Share Posted October 18, 2020 hmmmm .... it's not that easy with the program for atarixl: 8bit-unity greeting Quote Link to comment Share on other sites More sharing options...
8bit-Dude Posted October 18, 2020 Share Posted October 18, 2020 2 hours ago, funkheld said: hmmmm .... it's not that easy with the program for atarixl: 8bit-unity Hey Funk! Can you please explain what is the problem? (I am interested to understand which areas of the SDK need improvement). Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 18, 2020 Author Share Posted October 18, 2020 This looks fantastic @8bit-Dude! I will take a serious look, and also if you want to use Vintage Is The New Old yourself to write about it, let me know. Cheers Quote Link to comment Share on other sites More sharing options...
8bit-Dude Posted October 18, 2020 Share Posted October 18, 2020 1 hour ago, pedgarcia said: if you want to use Vintage Is The New Old yourself to write about it, let me know. Thanks for the offer Paulo! How would we go about organizing it? Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 18, 2020 Author Share Posted October 18, 2020 6 hours ago, 8bit-Dude said: Thanks for the offer Paulo! How would we go about organizing it? @8bit-Dude We can talk via email. I sent you a PM with my contact. Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 19, 2020 Author Share Posted October 19, 2020 On 10/16/2020 at 3:29 AM, zbyti said: @pedgarcia I'm using the emulator save state with typed C "H6:MAIN.ACT". In Sublime syntax highlighting package I have action.sublime-build: { "shell_cmd": "xfce4-terminal -x atari800 -H1 . -state /home/zbyti/Retro/Atari/a8s/action-compile.a8s", "selector": "source.action" } I can compile only MAIN.ACT from given folder, in other case I run (custom key binding) Action! and type in filename by hand. I am curious. Do you save the file like a regular text file? Doesn't Action! complain about the format? Quote Link to comment Share on other sites More sharing options...
pedgarcia Posted October 19, 2020 Author Share Posted October 19, 2020 Never mind. I realized you are using H6: which forces the use of \n instead of the ATASCII equivalent to new line. 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.