CodeMonkey666 Posted June 22, 2004 Share Posted June 22, 2004 I am trying to assemble that calculator program for the Atari 2600, using DASM and Notepad as my text editor. Now, I am not quite sure what I am doing, so here's what I did (but it isn't working). I saved the calculator program. I saved it in the directory DASMbinDOS in the dasm22007 file. I then went as far into this directory as DOS in the command prompt window. I then typed in: dasm clock003.asm -f3 -oclock.bin . I have the calculator code saved as "clock003." The computer said, "Warning: Unable to open 'clock003.asm.' " And then, "Complete," on the next line. It made a .bin file called clock.bin, like the guide I'm using says, but this .bin file contains 0 kilobytes. What am I doing that is wrong? I also tried renaming the clock file as "clock003.asm" but that just gave the same result. Quote Link to comment Share on other sites More sharing options...
CodeMonkey666 Posted June 22, 2004 Author Share Posted June 22, 2004 Oh, whups, I notice that this should have gone into the 2600 Programming for Newbies Section; oh well, I don't think it matters Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted June 22, 2004 Share Posted June 22, 2004 I saved the calculator program. I saved it in the directory DASMbinDOS in the dasm22007 file. Following your description you should have saved it as clock003.asm. Quote Link to comment Share on other sites More sharing options...
CodeMonkey666 Posted June 23, 2004 Author Share Posted June 23, 2004 Okay, thanx, that fixes the problem, however, now it won't work. I get a 4 KB BIN file, so I click and then drag the BIN file over the Z26.exe thing and then the screen goes black but that's it. And then that's it, just a black screen. There's no clock or anything. What am I doing wrong now? Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted June 23, 2004 Share Posted June 23, 2004 ...so I click and then drag the BIN file over the Z26.exe thing... What exactly are you doing here? Quote Link to comment Share on other sites More sharing options...
Nukey Shay Posted June 23, 2004 Share Posted June 23, 2004 Sounds like he's using Windows to open Z26. But I just associate the .bin extention to open with Z26 as one of it's options...so I can just right-click/open a .bin file without dragging anything. @CodeMonkey666 Can you post the .asm? If all you get is a blank screen, the code probably has something wrong with it or otherwise was not compiled correctly by Dasm. Quote Link to comment Share on other sites More sharing options...
CodeMonkey666 Posted June 23, 2004 Author Share Posted June 23, 2004 The digital clock program was written by Chris Cracknell. What I did is I went to the site with it and copied all the code from top to bottom. I then went and pasted it in Notepad and then saved it as "clock003.asm." I then went and through the command prompt, I used the DASM assembler to assemble the program. It did so and a 4 KB file named "clock.bin" appeared in the DOS folder, since that is where the DASM assembler itself is located and where I had the "clock003.asm" file saved. I then right-clicked on the clock.bin file, clicked copy, then I went into the Z26 folder, clicked paste, and the clock.bin file appeared in that folder as well. I then clicked and dragged the clock.bin file over the z26 exe file. The screen went all dark. I waited and waited but then when I clicked ctr-alt-del to bring up the Windows Task Manager, it said that z26 was "Not Responding" and so I shut it down. So I dunno what is wrong; if I am at fault or the code is. For emulators like SNES9x or ZSNES or Nestopia, I always just open/start up the emulator and then I open the game file from within the emulator and start it up; I tried that with z26 but it didn't work. I read somewhere where it said about dragging game files over the z26 exe to make them work (I think), so that's why I tried that. Here is the code: ;--------------------------------------------------------------------------- ; * Subject: [stella] 2600 Digital Clock (source code) ; * From: crackers@hwcn.org ; * Date: Sun, 5 Oct 1997 14:31:50 -0400 (EDT) ;--------------------------------------------------------------------------- ; Here's the source code for that final digital clock programme. ; Feel free to employ and distribute this code however you may wish. ; Both the source code and the binary are public domain. ; ----------------------------------------------------------------------------- processor 6502 VSYNC = $00 VBLANK = $01 WSYNC = $02 NUSIZ0 = $04 NUSIZ1 = $05 COLUPF = $08 COLUBK = $09 PF0 = $0D PF1 = $0E PF2 = $0F SWCHA = $280 INTIM = $284 TIM64T = $296 CTRLPF = $0A COLUP0 = $06 COLUP1 = $07 GP0 = $1B GP1 = $1C HMOVE = $2a RESP0 = $10 RESP1 = $11 ;RAM TEMP = $80 ;2 bytes for temporary data SECS = $82 ;seconds counter MINS = $83 ;minutes counter HOURS = $84 ;hours counter JOYDEL = $85 ;joystick delay variable JOY1ST = $86 ;joystick first move variable SPRITEA = $87 ;8 bytes for the first sprite SPRITEB = $8F ;8 bytes for the second sprite RMINS = $97 ;real minutes RHOURS = $98 ;real hours FRAMES = $99 ;frames counter org $F000 start SEI CLD LDX #$FF TXS LDA #$00 zero STA $00,X ;looks familiar, right? DEX ;typical zeroing routine BNE zero lda #$01 ;now we set up all our variables sta CTRLPF lda #$0C ;set our starting time at 12:00 sta HOURS ;just like a VCR, eh? Except it doesn't blink lda #$3C ;00 minutes sta MINS lda #$ca ;nice pretty green for our sprites sta COLUP0 sta COLUP1 lda #$07 ;make them good and fat sta NUSIZ0 sta NUSIZ1 lda #$3C ;initialize the frame and seconds counters sta FRAMES sta SECS main JSR vertb ;main loop JSR time JSR draw JSR clear JMP main vertb LDX #$00 ;vertical blank, We all know what this is about LDA #$02 STA WSYNC STA WSYNC STA WSYNC STA VSYNC STA WSYNC STA WSYNC LDA #$2C STA TIM64T LDA #$00 STA WSYNC STA VSYNC RTS time ldy #06 ;just load Y ahead of time for #of sprite lines lda #$3C ;60 sec sbc MINS ;subtract the clock minutes from 60 to get the sta RMINS ;real minutes since clock counts down cmp #$00 ;see if it's 00 minutes beq min0 cmp #$32 ;see if it's more than 50 minutes bpl min5 cmp #$28 ;see if it's more than 40 minutes bpl min4 cmp #$1E ;see if it's more than 30 minutes bpl min3 cmp #$14 ;see if it's more than 20 minutes bpl min2 cmp #$0A ;see if it's more than 10 minutes bpl min1 min0 lda zeros,y ;minutes must be less than 10 so load 00 sprite and #$F0 ;strip the first 4 bits sta SPRITEA,y ;store it to sprite A memory dey bpl min0 ;get next sprite line lda #$00 ;less than 10 minutes jmp minload ;go to where we load the first 4 bits of sprite min5 lda fives,y ;minutes must be 50+ so load 55 sprite and #$F0 ;strip 1st four bits sta SPRITEA,y ;store it to sprite A memory dey bpl min5 ;get next sprite line lda #$32 ;50+ minutes - you'll need this number later to jmp minload ;load the second half the sprite data min4 lda fours,y ;minutes must be 40+ and #$F0 sta SPRITEA,y dey bpl min4 lda #$28 ;40+ minutes jmp minload min3 lda threes,y ;minutes must be 30+ and #$F0 sta SPRITEA,y dey bpl min3 lda #$1E ;30+ minutes jmp minload min2 lda twos,y ;minutes must be 20+ and #$F0 sta SPRITEA,y dey bpl min2 lda #$14 jmp minload ;20+ minutes min1 lda ones,y ;minutes must be 10+ and #$F0 sta SPRITEA,y dey bpl min1 lda #$0A ;10+ minutes minload STA TEMP ;the accumulator had the 10s of minutes LDA RMINS ;now we subtract the 10s minutes from the real sec ;minutes to get the 1s minutes to act as a pointer SBC TEMP ;for the data tables for 2nd half of sprite ASL ;double the number TAX LDA numblk,x ;load the first half of the sprite data address sta TEMP lda numblk+1,x ;load the second half of the sprite table address sta TEMP+1 ldy #$06 ;number of lines in the sprite (-1) msload lda (TEMP),y ;get the sprite data and #$0F ;strip off the last 4 bits ora SPRITEA,y ;combine the 1st half with the 2nd half sta SPRITEA,y ;put it back in the sprite memory dey bpl msload ;get the next line of data ldy #$06 ;preload number of sprite lines (-1) lda #$18 ;24 hours sec SBC HOURS ;subtract the counter hours to get STA RHOURS ;the real hours value cmp #$00 ;see if it's 12:00 am beq hour0 cmp #$14 ;see if it's 20+ hours bpl hour2 cmp #$0A ;see if it's 10+ hours bpl hour1 hour0 lda zeros,y ;load the zeros sprite data and #$F0 ;strip the 1st four bits sta SPRITEB,y ;store to the 2nd sprite memory dey bpl hour0 lda #$00 ;same deal as with the minutes jmp loadhrs ;but now we load the second half of the hours data hour1 lda ones,y and #$F0 sta SPRITEB,y dey bpl hour1 lda #$0A jmp loadhrs hour2 lda twos,y and #$F0 sta SPRITEB,y dey bpl hour2 lda #$14 jmp loadhrs loadhrs STA TEMP LDA RHOURS sec SBC TEMP asl tax lda numblk,x sta TEMP lda numblk+1,x sta TEMP+1 ldy #$06 hsload lda (TEMP),y and #$0F ora SPRITEB,y sta SPRITEB,y dey bpl hsload rts numblk .word zeros ;where all the sprites are at .word ones .word twos .word threes .word fours .word fives .word sixes .word sevens .word eights .word nines draw LDA INTIM ;check to see if it's time to draw a frame BNE draw sta WSYNC sta HMOVE sta VBLANK ;turn the screen on! ;insert display kernal ldx #$3F ;okay, this display kernal sucks, but I'm not doing blow1 sta WSYNC ;much here so I didn't go for anything fancy since dex ;this is just a demo. This wouldn't be the way you bpl blow1 ;do things in a game, but it works for this. sta WSYNC nop ;See... you'd never do something weenie like this nop ;in a real programme nop ; nop ; nop ;but when I was experimenting with this programme nop ;I just had a whole bunch of ";nop" lines here nop ;and I removed the ";" until I got the spacing more nop ;or less where I wanted it nop nop nop nop nop nop nop sta RESP0 nop nop nop nop nop nop nop sta RESP1 ldy #$06 sload lda SPRITEB,y sta GP0 lda SPRITEA,y sta GP1 sta WSYNC ;you wouldn't do something weenie like this sta WSYNC ;either in a real programme, but it was an sta WSYNC ;easy way to make each sprite 8 lines high sta WSYNC ;and I was more concerned with making a working sta WSYNC ;and accurate clock than a nice display. sta WSYNC sta WSYNC sta WSYNC dey bpl sload lda #$00 sta GP0 sta GP1 ldx #$48 blow2 sta WSYNC ;now we just blow the rest of the unused scanlines. dex bpl blow2 rts clear LDA #$24 ;set timer for overscan STA TIM64T LDA #$02 ;clear the screen and turn off the video STA WSYNC STA VBLANK LDA #$00 STA PF0 STA PF1 STA PF2 sta COLUPF sta COLUBK LDA #$3C ;this is the clock routine itself. it counts DEC FRAMES ;down from 60 frames, and then decreases the bne joy ;seconds, which count down the minutes and then lda #$3C ;the hours.. etc. For whatever reason my 2600 STA FRAMES ;wasn't running at exactly 60 frames a second DEC SECS ;so there were two lines inserted to correct bne joy ;timing accuracy problems STA SECS DEC SECS ;here's one. Kept me from losing a second every DEC MINS ;minute bne joy STA MINS LDA #$18 INC SECS ;here's the other. It kept me from gaining a DEC HOURS ;second every hour. bne joy STA HOURS ;now my timing inaccuracies may have been caused ;by either my V-blank, V-sync, Overscan, or ;display being a few scanlines too long or short. ;theoretically if all my lines were bang on, ;I wouldn't have needed those two seconds counter ;corrections. But with them inplace, it allows me ;to be a little looser with my code which works for ;me. It may still gain or lose a second every 60 ;hours, but I can live with that. And since I'll ;be employing this clock in a virtual pet game and ;not a swiss made olympic time piece, a little ;inaccuracy won't matter. joy lda SWCHA ;load joysticks ora #$0f ;strip the data for player #2 joystick cmp #$ef ;up beq up cmp #$df ;down beq down cmp #$bf ;left beq left cmp #$7f ;right beq right lda #$00 ;no movement sta JOYDEL ;reset the joystick delay variable lda #$01 ;reset the first move variable sta JOY1ST jmp oscan ;finish off the overscan up lda HOURS ;check to see if we've run out our hours cmp #$01 beq oscan ;yep, then ignore the movement inc JOYDEL ;increase the joystick delay variable lda JOY1ST ;check to see if this is the first move in this cmp #$01 ;direction. beq now1 ;if it is then change the variable now lda #$1E ;nope then see if there's been enough of a delay cmp JOYDEL ;to change the variable yet. bne oscan now1 lda #$00 ;reset the joystick delay and set the first move sta JOY1ST ;indicator to "no" sta JOYDEL dec HOURS ;decrease the hours counter jmp oscan down lda HOURS cmp #$18 beq oscan inc JOYDEL lda JOY1ST cmp #$01 beq now2 lda JOYDEL cmp #$1E bne oscan now2 lda #$00 sta JOY1ST sta JOYDEL inc HOURS ;increase the hours counter jmp oscan left lda MINS cmp #$01 beq oscan inc JOYDEL lda JOY1ST cmp #$01 beq now3 lda #$1E cmp JOYDEL bne oscan now3 lda #$00 sta JOY1ST sta JOYDEL dec MINS ;decrease the minutes counter jmp oscan right lda MINS cmp #$3c beq oscan inc JOYDEL lda JOY1ST cmp #$01 beq now4 lda #$1E cmp JOYDEL bne oscan now4 lda #$00 sta JOY1ST sta JOYDEL inc MINS ;increase the minutes counter oscan lda INTIM ;see if the timer has run out BNE oscan STA WSYNC RTS zeros .byte %11100111 ;sprites are stored upsidedown, and there .byte %10100101 ;are two copies of each number in each sprite .byte %10100101 ;location. The unwanted number is stripped .byte %10100101 ;with the AND command (AND #$0F for the right .byte %10100101 ;number stripped, AND #F0 for the left) .byte %10100101 ;then any two numbers can be combined with an .byte %11100111 ;OR command. Neat huh? ones .byte %11100111 .byte %01000010 .byte %01000010 .byte %01000010 .byte %01000010 .byte %11000110 .byte %01000010 twos .byte %11100111 .byte %10000100 .byte %10000100 .byte %11100111 .byte %00100001 .byte %00100001 .byte %11100111 threes .byte %11100111 .byte %00100001 .byte %00100001 .byte %11100111 .byte %00100001 .byte %00100001 .byte %11100111 fours .byte %00100001 .byte %00100001 .byte %00100001 .byte %11100111 .byte %10100101 .byte %10100101 .byte %10000100 fives .byte %11100111 .byte %00100001 .byte %00100001 .byte %11100111 .byte %10000100 .byte %10000100 .byte %11100111 sixes .byte %11100111 .byte %10100101 .byte %10100101 .byte %11100111 .byte %10000100 .byte %10000100 .byte %11000110 sevens .byte %10000100 .byte %10000100 .byte %10000100 .byte %01000010 .byte %00100001 .byte %00100001 .byte %11100111 eights .byte %11100111 ;This code is ©1997 by Chris "Crackers" Cracknell .byte %10100101 ;and is placed in the Public Domain by the author. .byte %10100101 ;Anyone is free to employ and distribute this code .byte %11100111 ;as they see fit. .byte %10100101 ; .byte %10100101 ; .byte %11100111 ; ; nines .byte %00100001 ;Well... if you're going to use this code in a .byte %00100001 ;"Doomsday Machine" to destroy the world, then .byte %00100001 ;I would rather you didn't. But otherwise, knock .byte %11100111 ;yourself out with it. .byte %10100101 ; .byte %10100101 ;Actually... if the "Doomsday Machine" is just in .byte %11100111 ;a game, then it's okay to use the code. ; org $FFFC ;Unless it's like the movie "War Games" where the .word start ;computer running the game is hooked up to a real .word start ;"Doomsday Machine" then it wouldn't be a good idea. Quote Link to comment Share on other sites More sharing options...
CodeMonkey666 Posted June 23, 2004 Author Share Posted June 23, 2004 http://www.atariage.com/2600/programming/2...in/clock003.asm ---Oh and here is the link to the source code in case it came out fuzzy in the last post--- Quote Link to comment Share on other sites More sharing options...
Thomas Jentzsch Posted June 23, 2004 Share Posted June 23, 2004 http://www.atariage.com/2600/programming/2600_101/bin/clock003.asm Compiles perfect here. I suppose you don't start the resulting ROM correctly. Do other game ROMs work? Quote Link to comment Share on other sites More sharing options...
Nukey Shay Posted June 23, 2004 Share Posted June 23, 2004 That would be my next guess...since Z26 (on my computer) seems to have problems with folders that contain spaces in the name. Try putting the rom file in Z26's folder before running it. Quote Link to comment Share on other sites More sharing options...
CodeMonkey666 Posted June 24, 2004 Author Share Posted June 24, 2004 I did do that. I copied the ROM file over into z26 and tried to use it there, but it didn't work. I'll get some game roms though and try those; maybe the emulator itself is screwy for some reason. Quote Link to comment Share on other sites More sharing options...
vb_master Posted June 24, 2004 Share Posted June 24, 2004 Try PCAE 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.