Search the Community
Showing results for tags 'coding'.
-
Announcing Bobbin v0.4, an Apple Emulator. Why Yet Another Emulator? What does Bobbin do that Nintendon’t? Bobbin: Runs entirely in your terminal, using either standard input/output, or a curses screen display Can be used in shell scripts to accept typed text from standard input, and emit program output to standard output Can watch a program binary file for changes, and reload itself with the new program binary when it does, greatly accelerating development cycles for software on the 8-bit Apple Get it at https://github.com/micahcowan/bobbin/releases/tag/v0.4 Bobbin is distributed in source form only; you must be comfortable building software via ./configure && make && make install. I will not make myself available to help you build and install (unless it’s due to a bug). You also really want to have ncurses installed, unless you only want to use the standard input/output interface (no screen representation). Bobbin is written in C for modern, standards-conformant Unix OSes. It is tested on MacOS Ventura, and on Ubuntu Linux running under Windows WSL. Here are a couple of videos (of older versions) in action, demonstrating some key features:
-
I'm trying to get back to writing for Atari 8 bit. However, using the emulator on my laptop seems to be a bit silly. In this day and age I should be able to just write code on my laptop and run it on simulator. It's possible to run Atari800MacX from CLI, to fire up a piece of code - or even run its generic - non macOS specific version (yay true opensource) atari800. But I don't know what workflow folks use for making software under such conditions. What compiler would you use? Are there scripts out there already? Please share. Windows users seem to be using VSCode and Altirra , but the latter is very much a monolithic piece of software that cannot be easily made cross platform. Not to mention it's not developed in the open, even tho its source code is available. So it's clearly not the right avenue to pursue. And no, I am not going back to using windows, thanksverymuch
- 14 replies
-
- 1
-
- macos
- development
-
(and 6 more)
Tagged with:
-
The following tutorial walks through the steps of building a simple program in assembler to be deployed to a cartridge for Atari 8 bit computer using the CA65 assembler. Source The newest and all historic version of the source code can be downloaded from SourceForge. Main source Complete source code: HelloWorld.s. Header The header of an contains the includes as well as the exports and imports. The main source for cartridges needs to export the cartstart and cartinit procedures. cartinit is called before the OS is initialised and should return with an RTS. cartstart is jumped to after the OS is initialised and either should not return or exit with jmp (DOSVEC). .FILEOPT compiler, "ca65 V2.19 - N/A" .FILEOPT author, "Martin Krischik «krischik@users.sourceforge.net»" .FILEOPT comment, "this Atari assembly CAR program will print the “hello world” message to the screen" .INCLUDE "atari.inc.s" .INCLUDE "OS.inc.s" .MACPACK atari .SETCPU "6502" .DEBUGINFO off .EXPORT cartstart, cartinit Read only data When using the CA65 you don't need to set absolute addresses for your data. You just specify which data your want to store and how long the data is. RODATA will be stored in the ROM itself. ;; ; Our message ; .SEGMENT "RODATA" Message: .BYTE "Hello World!",EOL .BYTE "(using a cartridge in assember)",EOL Message_Len = * - Message Read/Write data If you want to write to the data you use the DATA segment which will be place in ram staring at address $2000. ;; ; Text returned from keyboard ; .SEGMENT "DATA" Input: .RES 1 Input_Len = * - Input If you want to store data in the zero page you can use the ZEROPAGE segment. Program The actual program consist of a put string which write the text „Hello World!“ and a get string to wait for a key press. It ends with a jump to DOSVEC. Put_String and Get_String are macros explained later. ;; ; main procedure ; .SEGMENT "CODE" .ORG OS::LC_8K ;; ; the main method of a cartridges does not return. ; .proc cartstart: near Put_String Message,Message_Len Get_String Input,Input_Len jmp (DOSVEC) .endproc ;; ; cartridges have an init function which is called ; before the operating system is initialized. ; .proc cartinit: near RTS ; Continue with initialisation .endproc OS macro include Complete source code: OS.inc.s Put_String This is setting all the parameters for an PUTCHR operation using I/O block 0 which by default uses the "E:" editor device. .macro Put_String Text,Len LDX #CIO::Console ;Use IOCB 0 / Console LDA #PUTCHR ; Command Put Text Record STA ICCOM,X LDA #<(Text) ; Set low byte of message STA ICBAL,X LDA #>(Text) ; Set high byte of message STA ICBAH,X LDA #<(Len) ; Set low byte of message length STA ICBLL,X LDA #>(Len) ; Set high byte of message length STA ICBLH,X JSR CIOV ;Call cio .endmacro Get_String This is setting all the parameters for an `GETCHR` operation using I/O block 0. .macro Get_String Buffer,Len LDX #CIO::Console ;Use IOCB 0 / Console LDA #GETCHR ; Command Get Text Record STA ICCOM,X LDA #<(Buffer) ; Set low byte of buffer STA ICBAL,X LDA #>(Buffer) ; Set high byte of buffer STA ICBAH,X LDA #<(Len) ; Set low byte of buffer length STA ICBLL,X LDA #>(Len) ; Set high byte of buffer length STA ICBLH,X JSR CIOV ;Call cio .endmacro Cartridge Header Complete source code: CAR_Header.s: The cartridge header are a few bytes at the end of the cartridge. This file tells the linker what to put into the header. The header is exported as __CART_HEADER__ so the linker know that this is indeed the cartridge header. .EXPORT __CART_HEADER__: absolute = 1 .IMPORT __CARTSIZE__, __CARTFLAGS__, cartinit, cartstart ;; ; set init and main run addresses ; .SEGMENT "CARTHDR" .ORG CARTCS ; cartridge start address .WORD cartstart .ORG CART ; cartridge present indicator .BYTE $00 .ORG CARTFG .BYTE <(__CARTFLAGS__) ; Init and start cartridge, no disk, no diagnostic. .ORG CARTAD ; cartridge initialise vector .WORD cartinit .assert (__CARTSIZE__ = $2000 || __CARTSIZE__ = $4000), error, "Cartridge size must either be $2000 or $4000" Makefile Complete source code: Makefile Variables A few variables describing the current project. Package_Name := Hello_World App_Name := HELLO_A Exe_File := target/$(App_Name).CAR Object_Files := target/obj/HelloWorld.o target/obj/CAR_Header.o Map_File := target/$(App_Name).MAP Include_Dir := ../../Library Assemble The assemble command needs are passed the following options: The platform you assemble for: --target atari Where include files are located: --include-dir $(Include_Dir) Creating a listing of actual code is always helpful: --listing $(basename $(@)).lst The current output file -o $(@) And the first input file $(<) target/obj/%.o: src/main/asm/%.s ca65 \ --target atari \ --include-dir $(Include_Dir) \ --listing $(basename $(@)).lst \ -o $(@) \ $(<) Link The link command needs are passed the following options: The size of the cartridge, 8k in our case: -D__CARTSIZE__=0x2000 The cartridge flags: -D__CARTFLAGS__=0x4 The platform you assemble with indication that we want a cartridge: -C atari-cart.cfg Creating a memory mapp file of linked code is always helpful: --mapfile ${Map_File} The current output file -o $(@) All the input file $(+) $(Exe_File): ${Object_Files} ld65 \ -D__CARTSIZE__=0x2000 \ -D__CARTFLAGS__=0x4 \ -C atari-cart.cfg \ --mapfile ${Map_File} \ -o $(@) \ $(+) Run on Emulator For testing and debugging the use of an emulator like the Atari800 is recommended. Deploying is much faster and can be automated inside the makefile so a simple `make run` will start the application. Note that you need to adjust the directory and file names to your system. Atari800_System := /opt/local/share/atari800 Atari800_User := "$(HOME)/Library/Application Support/Atari800" Atari800_Exe := "/usr/local/bin/atari800" Atari800_Window := -video-accel -pal -win-height 1120 -win-width 1680 Atari800_Cart = -cart-type 1 -cart "$(Exe_File)" Atari800_Option = -autosave-config -320xe -nobasic -config "$(CURDIR)/target/$(App_Name).cfg" -xlxe_rom "$(Atari800_System)/ATARIXL.ROM" run: $(Exe_File) $(Atari800_Exe) \ $(Atari800_Cart) \ $(Atari800_Option) \ $(Atari800_Window) The Atari800 emulator also has a system monitor with single step debugger and disassembler included which makes debugging that much easier. Run on device To run the application on a real Atari a hardware cartridge is needed. The best option is a modern cartridge like Side3 which uses SD cards and flash memory as ROM storage. A Side3 cost a little more then $€£100. A classic cartridge using EEPROMs will also work but is more work to setup and only slightly cheaper. For the Side3 all you need to do is to copy the CAR file onto the SD card. This operation which can be automated using make. Side3_Deploy := /Volumes/SIDE3 side3: $(Exe_File) mkdir -p "${Side3_Deploy}/${Package_Name}" cp "$(<)" "${Side3_Deploy}/${Package_Name}"
- 2 replies
-
- 5
-
- development
- assembler
-
(and 5 more)
Tagged with:
-
Having gotten myself acquainted with the logic for what triggers the "kill screen" on both the arcade and NES versions of Donkey Kong, may I ask you how you guys have managed to come up with a fix for Level 133 on the latter version? For your information, these are the links I visited to get this info: http://www.donhodges.com/how_high_can_you_get.htm (arcade version) http://metopal.com/2012/03/24/porting-the-kill-screen/ (NES version) What I wish to do to correct the kill screen for the NES DK is to make a similar fix as to what Don Hodges did for the arcade version. Here's the original NES version code for the kill screen: CB7E A4 54 LDY $54 ; loads current level number into Y CB80 C8 INY ; increment level number by 1 CB81 20 D1 F4 JSR $F4D1 ; jump to subroutine to calculate level number tile CB84 A9 00 LDA #$00 ; set sign of bonus number as positive CB86 85 2C STA $2C ; store this number in variable CB88 A9 80 LDA #$80 ; load A with max bonus timer value (8000 bonus points) CB8A 88 DEY ; decrement variable in Y by 1 CB8B C0 04 CPY #$04 ; check if level number < 5 CB8D 10 03 BPL $CB92 ; check for negative flag CB8F B9 07 C2 LDA $C207,Y ; load bonus timer value from memory CB92 85 2E STA $2E ; store in bonus timer value queue My proposed fix for this, based on Hodges' fix for the arcade version: CB7E A4 54 LDY $54 ; loads current level number into Y CB80 C0 03 CPY #$03 ; check if level number >= 4 CB82 90 02 BCC $CB86 ; if level 1, 2 or 3 (variables $00 thru $02), continue with code normally CB84 A0 03 LDY #$03 ; otherwise, load Y with #$03 (level 4) CB86 C8 INY ; increment level number by 1 (only if for level variables $00 thru $02) CB87 20 D1 F4 JSR $F4D1 ; jump to subroutine to calculate level number tile CB8A A9 00 LDA #$00 ; set sign of bonus number as positive CB8C 85 2C STA $2C ; store this number in variable CB8E B9 07 C2 LDA $C207,Y ; load bonus timer value from memory CB91 85 2E STA $2E ; store in bonus timer value queue What I want to do is make it check the level number right after it's loaded into the variable that is stored at $0054 in the game's RAM. We want to compute the bonus timer based on the level number, so that level 4 and up will always start with 8000 points on the bonus timer. If the level number is 4 or higher, then we set a carry flag for, and this means we also only want it to increment the level number if we're on levels 1, 2 or 3 (variables $00 thru $02). The subroutine jump to $F4D1, which follows the INY, must also be modified for a check to see if the level number is 9 or higher, and if we're at level 9, to keep it there via a similar carry flag. ~Ben
-
- donkey kong
- nes
-
(and 1 more)
Tagged with:
-
To whom it may concern, a small and fast snippet useful for bullet aiming and other game mechanics. The code is fully tested and optimized, ready to be used by coders in the IntyBASIC Programming Contest 2018. PS The post is about the function ATAN2(), sine and cosine come for free. '''''''''''''''''''''''''''''''''''''''''''''''' ' ;;;;;;;; atan(2^(x/32))*128/pi ;;;;;;;; atan_tab: data $20,$20,$20,$21,$21,$22,$22,$23,$23,$23,$24,$24,$25,$25,$26,$26 data $26,$27,$27,$28,$28,$28,$29,$29,$2A,$2A,$2A,$2B,$2B,$2C,$2C,$2C data $2D,$2D,$2D,$2E,$2E,$2E,$2F,$2F,$2F,$30,$30,$30,$31,$31,$31,$31 data $32,$32,$32,$32,$33,$33,$33,$33,$34,$34,$34,$34,$35,$35,$35,$35 data $36,$36,$36,$36,$36,$37,$37,$37,$37,$37,$37,$38,$38,$38,$38,$38 data $38,$39,$39,$39,$39,$39,$39,$39,$39,$3A,$3A,$3A,$3A,$3A,$3A,$3A data $3A,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3B,$3C,$3C,$3C,$3C data $3C,$3C,$3C,$3C,$3C,$3C,$3C,$3C,$3C,$3D,$3D,$3D,$3D,$3D,$3D,$3D data $3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3D,$3E,$3E,$3E,$3E data $3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E data $3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3E,$3F,$3F,$3F,$3F data $3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F data $3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F data $3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F data $3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F data $3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F,$3F ' ;;;;;;;; log2(x)*32 ;;;;;;;; log2_tab: data $00,$00,$20,$32,$40,$4A,$52,$59,$60,$65,$6A,$6E,$72,$76,$79,$7D data $80,$82,$85,$87,$8A,$8C,$8E,$90,$92,$94,$96,$98,$99,$9B,$9D,$9E data $A0,$A1,$A2,$A4,$A5,$A6,$A7,$A9,$AA,$AB,$AC,$AD,$AE,$AF,$B0,$B1 data $B2,$B3,$B4,$B5,$B6,$B7,$B8,$B9,$B9,$BA,$BB,$BC,$BD,$BD,$BE,$BF data $C0,$C0,$C1,$C2,$C2,$C3,$C4,$C4,$C5,$C6,$C6,$C7,$C7,$C8,$C9,$C9 data $CA,$CA,$CB,$CC,$CC,$CD,$CD,$CE,$CE,$CF,$CF,$D0,$D0,$D1,$D1,$D2 data $D2,$D3,$D3,$D4,$D4,$D5,$D5,$D5,$D6,$D6,$D7,$D7,$D8,$D8,$D9,$D9 data $D9,$DA,$DA,$DB,$DB,$DB,$DC,$DC,$DD,$DD,$DD,$DE,$DE,$DE,$DF,$DF data $DF,$E0,$E0,$E1,$E1,$E1,$E2,$E2,$E2,$E3,$E3,$E3,$E4,$E4,$E4,$E5 data $E5,$E5,$E6,$E6,$E6,$E7,$E7,$E7,$E7,$E8,$E8,$E8,$E9,$E9,$E9,$EA data $EA,$EA,$EA,$EB,$EB,$EB,$EC,$EC,$EC,$EC,$ED,$ED,$ED,$ED,$EE,$EE data $EE,$EE,$EF,$EF,$EF,$EF,$F0,$F0,$F0,$F1,$F1,$F1,$F1,$F1,$F2,$F2 data $F2,$F2,$F3,$F3,$F3,$F3,$F4,$F4,$F4,$F4,$F5,$F5,$F5,$F5,$F5,$F6 data $F6,$F6,$F6,$F7,$F7,$F7,$F7,$F7,$F8,$F8,$F8,$F8,$F9,$F9,$F9,$F9 data $F9,$FA,$FA,$FA,$FA,$FA,$FB,$FB,$FB,$FB,$FB,$FC,$FC,$FC,$FC,$FC data $FD,$FD,$FD,$FD,$FD,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF data $FF ' trick to cope with 256 '----------------------------------------------- ' Source: https://www.msx.org/forum/msx-talk/development/8-bit-atan2?page=0 ' 8-bit atan2 ' Calculate the angle, in a 256-degree circle. ' The trick is to use logarithms to get the y/x ratio and ' integrate the power function into the atan table. ' input ' #dx_in, #dy_in in -256,255 ' ' output ' angle in 0-255 ' ^ ' q1 | q0 '------+------> ' q3 | q2 ' | signed #dx_in signed #dy_in atan2: procedure if (#dy_in>0) then if (#dx_in>0) then gosub atan2_q0 ' q0 else #dx_in=-#dx_in ' q1 gosub atan2_q0 angle = (-angle) and $7F return end if else if (#dx_in>0) then #dy_in=-#dy_in ' q2 gosub atan2_q0 angle = -angle return else #dx_in=-#dx_in ' q3 #dy_in=-#dy_in gosub atan2_q0 angle = angle + 128 return end if end if return end atan2_q0: procedure if (#dx_in>=#dy_in) then angle = (-atan_tab(log2_tab(#dx_in)-log2_tab(#dy_in))) and $3F else angle = atan_tab(log2_tab(#dy_in)-log2_tab(#dx_in)) end if return end ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ' input ' angle in 0-255 ' ' output ' #dy_out = sin(angle) in -256,256 ' #dx_out = cos(angle) in -256,256 getsincos: procedure #dy_out = #sin_table(angle) #dx_out = #cos_table(angle) end #sin_table: data 0, 6, 12, 18, 25, 31, 37, 43, 49, 56, 62, 68, 74, 80, 86, 92 data 97, 103, 109, 115, 120, 126, 131, 136, 142, 147, 152, 157, 162, 167, 171, 176 data 181, 185, 189, 193, 197, 201, 205, 209, 212, 216, 219, 222, 225, 228, 231, 234 data 236, 238, 241, 243, 244, 246, 248, 249, 251, 252, 253, 254, 254, 255, 255, 255 #cos_table: data 256, 255, 255, 255, 254, 254, 253, 252, 251, 249, 248, 246, 244, 243, 241, 238 data 236, 234, 231, 228, 225, 222, 219, 216, 212, 209, 205, 201, 197, 193, 189, 185 data 181, 176, 171, 167, 162, 157, 152, 147, 142, 136, 131, 126, 120, 115, 109, 103 data 97, 92, 86, 80, 74, 68, 62, 56, 49, 43, 37, 31, 25, 18, 12, 6 data 0, -6, -12, -18, -25, -31, -37, -43, -49, -56, -62, -68, -74, -80, -86, -92 data -97, -103, -109, -115, -120, -126, -131, -136, -142, -147, -152, -157, -162, -167, -171, -176 data -181, -185, -189, -193, -197, -201, -205, -209, -212, -216, -219, -222, -225, -228, -231, -234 data -236, -238, -241, -243, -244, -246, -248, -249, -251, -252, -253, -254, -254, -255, -255, -255 data -256, -255, -255, -255, -254, -254, -253, -252, -251, -249, -248, -246, -244, -243, -241, -238 data -236, -234, -231, -228, -225, -222, -219, -216, -212, -209, -205, -201, -197, -193, -189, -185 data -181, -176, -171, -167, -162, -157, -152, -147, -142, -136, -131, -126, -120, -115, -109, -103 data -97, -92, -86, -80, -74, -68, -62, -56, -49, -43, -37, -31, -25, -18, -12, -6 data 0, 6, 12, 18, 25, 31, 37, 43, 49, 56, 62, 68, 74, 80, 86, 92 data 97, 103, 109, 115, 120, 126, 131, 136, 142, 147, 152, 157, 162, 167, 171, 176 data 181, 185, 189, 193, 197, 201, 205, 209, 212, 216, 219, 222, 225, 228, 231, 234 data 236, 238, 241, 243, 244, 246, 248, 249, 251, 252, 253, 254, 254, 255, 255, 255
-
Hello Everyone! This is my first blog post ever here on AtariAge, and I'm excited to be on here! Let me introduce myself. My name is Chase, and I am a seventeen year from Ohio. I have been playing and collecting Atari 2600 games for 3 years now and I have never felt more passionate and happy playing simple games compared to the high resolution, highly complicated games of today. The 2600 seems to pull me in with simplicity and the appeal of playing games that have shaped the game industry into how it is today. I have used my Atari 2600 (a four switch Woody) more than my Ps4, and I actually love my Atari more than my PlayStation. I want to start up a YouTube channel reviewing games and potentially talk to the people who programmed them. I hope to have a fun time on here and I can't wait to share my passion with others and hear stories from others who grew up with the console I love. I will mostly will be talking about the 2600 on this blog, mostly about games. Which ones I love, which ones I think are ok, and which ones I don't really like. I might also dabble in the 5200, 7800 and the Lynx and Jaguar. And one question to end this blog: Which Atari 2600 launch title is your favorite? Mine is Indy 500, followed by Surround.
- 2 comments
-
- first entry
- Atari
- (and 8 more)
-
Hi guys ! Anybody knows how to stop RMT music play but keep sfx playing ? I've tried stopping music, disabling irq (that calls music play), but I either get music+sfx or nothing... I would like to turn of music so it doesn't waste cpu time, but keep possibility of playing sfx when needed. Any help appreciated ! Vladimir
-
This next section is a big one. Wouldn't it be great if you could test code as you programmed it? Well that's where Code-As-You-Go comes into play. The mode can be accessed with a dedicated button on a keyboard. It's labeled "CAYG." Take a look at this: That's the code as you go screen. On the panel at the right, you can enter the data you want to test. On the upper right of the screen is the address that the code will assemble to. In this example, the written code will compile at address $001404. You could instead have it display which line of the source code the code will go in. First, give the subroutine a name. In this example, we have a routine called "TetrisLFSR." This will be a Motorola 68000 version of the NES Tetris RNG routine. The NES version of Tetris iterates its RNG (a 16-bit LFSR) in the following manner: Set the output bit to the XOR of bits 1 and 9, and right-shift that input into the RNG. We will replicate this routine as we enter the code. For this test, enter the input in d0. We need to enter a 16-bit value. Using a mouse, click on the fourth-to-last digit of the d0 register, then type "7259." The digit highlighted in green is the cursor. Note that the register values are displayed in hexadecimal. If you enter an invalid hexadecimal digit, nothing happens. When you enter the last digit, the cursor stays there. (If it were an A-register, the cursor would be red.) Now, time for the first instruction. Type "move.b", tab, then "d0,d2", and hit Enter (if you hit Space, it will tab for you). When you press Enter, the last line of code you wrote is automatically executed in the CAYG window, and its machine language code appears in the window as well. In M68K assembly, the instruction "move.b d0,d2" is represented by $1400. The screen looks like this: Note that after you typed the code line, that instruction automatically executed. The last byte of d0 is $59, so the last byte of d2 is now also $59. The next two instructions are "move.w d0,d1" and "lsr.w #8,d1". These are necessary to retrieve the upper byte of a 16-bit value in d1. After the second line was typed, d1 became $7259. After the third line, it became $0072. In the machine code box is E049, which is the code for "lsr.w #8,d1." Remember, only the compiled code for the last line you typed appears in the machine code box. Next, we want to take the XOR of bits 1 and 9 of the bytes in d1 and d2. Since 1 and 9 differ by exactly 8, no shifting of either byte is needed. Just XOR the bytes by typing "eor.b d2,d1", then pressing Enter. Register d1 is now equal to $2B, which is the XOR of $72 and $59. It is bit 1 from this value we need to extract and get into the X (extend) flag. To do this, type "lsr.b #2,d1", and press Enter. The value in d1 became $0A. But more importantly, look at the X and C flags. They lit up, so their value is 1. Any flag that is clear appears as white-on-black, while a set flag is indicated by the opposite color scheme. Since the XOR of bits 1 and 9 of our 16-bit value was 1, a 1 will be right-shifted in to get the new RNG value. Here is the last piece of the puzzle. Now that we have our output bit in X (and C), we can use a "roxr" instruction to shift it in. Type "roxr.w #1,d0", and hit Enter. And there you have it. The new RNG value is $B92C. With the ability to see the code execute as you type it, coding will become as easy as pie. You could also toggle register updating off/on, and you could also move your cursor to any line in the code, and press a certain button to step through the code and see the results. After finishing the code, press the CAYG button again. All the code you wrote in the CAYG screen will be placed at the place in the source code you were at when you went to this screen. You can then edit it, delete it, or change it as normal. All in all, the code-as-you-go feature could be a breakthrough for future assemblers. No matter whether it's 6502, M68K, Z80, or anything else, it's the next innovation in coding.
-
What do we struggle with the most when creating a new ColecoVision homebrew project? Of course, the answers depend on the person experience, the game idea, the tools and materials available, and so on. I would like this poll to show a full view of a game project from start to finish. Since a conversion doesn't worry about the game idea and most of its code and data, try to think about a ColecoVision project made from scratch and what is most troublesome in a full project. Let's exchange on this topic, give tips and tricks, perhaps find ways to reduce the bottleneck time parts. Maybe this can show where we should focus our effort on, even find or make some missing tools in our toolbox. Vote and reply why you voted that way! Let's begin our talk!
- 15 replies
-
- 1
-
- time
- management
-
(and 6 more)
Tagged with:
-
Keys are: cursor arrows - move cursor 0-9,A-F - choose color space - plot by current color R - fill screen with current color P - pick color under cursor Z - (freeZe) - draw plots Save/Load coming soon. seems there are no routines for disk operations.
-
I'm in starting phase of making an engine/game maker for 8-bit Ataris and would like to hear your thoughts. There are couple of routes it could take and I don't won't to make something no one would use Please answer the poll if topic interests you and you think you have a game in you that's just waiting to come out. Notes: - Plan is to make PC version first (Win,Linux, Mac) and later maybe native 8-bit version if there's interest in it. You write scripts, edit sprites, tiles, map, sfx, music on PC. Press a key and emulator starts your game. - Scrolling is tougher to make so first version will be single screens. If people ask for scrolling we'll see what can be done. - Most important question for me is if there are more coders or users interested in something like this. Game makers like Shoot'm'up construction set on C64 or AGD on Spectrum have almost no scripting capabilities and are limited to a certain types of games. AGD is better as it allows more freedom but still something better for coders exists. Good example is Pico 8 "Fantasy console". It's basically a simple 128x128x16 colors graphis engine with support for sprites, sound fx, music and player input. What makes it great is scripting based on Lua language. So you can make any kind of game you can stick inside memory limitations. - Graphics engine will be simple and probably slow at first with more graphics modes, sprites and speed later. ps. Here is a good article on Pico 8: http://www.indieretronews.com/2015/10/pico-8-8-bit-fantasy-console-from.html Thanks ! Vladimir.
-
So I'm tinkering with batari for the first time, and have gotten past the ENORMOUS headache of compiling issues to actually be able to make some neat little things. one of my sprites i.e. the player is even animated and looks awesome. I've got a second sprite however, that is making me go crazy. I am 100% new to coding in general, but this is something that I really want to successfully accomplish. Anyway.. the whole thing I want the main player to be able to do is chase mice and "munch" on them to earn as many points as possible before a timer runs out(I'll figure that out later) So far I've gotten my cat to be able to move everywhere flawlessly. the mouse just shows up right now and is chilling out. my question: How can I make it so that when the cat comes in contact with the mouse the player gets their points/ How can I get the mouse to "run away" from the cat and re-spawn when "eaten"? Forgive me for being a complete noob, but I'm at the point where I'm completely stuck, and google has run out of answers. The attached file is what I've come up with so far. Thanks!!!default.bas
- 7 replies
-
- batari basic
- batari
-
(and 8 more)
Tagged with:
-
Just a small demo to celebrate New Year! Enjoy! where_is_the_snow.xex ps. Hope it won't induce any headaches
-
Finally managed to finish what I started many months ago Screen is hexagonal grid of characters (every second row is scrolled half a character to the right). All 128 chars are used for smoothing of edges. Each blob moves in random direction. If it touches another, it gets stuck to it and doesn't let go Question is: what now ? Any ideas how this could be improved to be more interesting or used for something completely different ? ps. Music is not playing from Atari liquid.xex.zip
-
I was starting to procrastinate again due to the anticipated complexity of swapping out the old Action RPG object slot variables with the new more generalized object slot variables. Finally forced myself to sit down today, despite how that's been hurting my lower back mysteriously this last week, and ironed it out. Funny enough, it went by a lot faster than I had feared it would. In the system now there's only 7 active objects possible instead of the previous 8. Before I consider this version finished however, I'm going to be adding in the Inactive Object list and hopefully get it working. Objects are classified as Monsters and Items. Items left behind on a screen when the player leaves it will fall from the active objects into the inactive objects list. No AI is done for it while it is there and for most objects the longer it stays off the screen, the greater chance it will be deleted permanently. Some objects however have a degree of permanency. They won't be removed from the objects list unless you leave a realm (Regional Objects) or never at all! (Global Objects) Monsters don't fall to this inactive list. They'll remain in the active list all the time (global monster), until you leave a realm or it dies (Regional monster) or if it stays off the screen too long or too many monsters are expected to be loaded from the new room. This means you won't be 100% free from a "local monster" (Wandering Monsters really) just because you manage to flee the room. Anyway here's a rom of the new object slots in action. I've also tweaked the Heart Placing routine to try to make use of all empty object slots available to it. In this case a maximum of 6 since one of the slots will always hold the black key for now. (That'll change when the key can drop to the inactive list later!) Later I'll be converting the Heart Placer to be a sample Room AI routine which will help litter the inactive list with hearts to test those things out.
-
- maze realms
- 2600
-
(and 1 more)
Tagged with: