Jump to content



0

Question on assembling first 2600 program


11 replies to this topic

#1 CodeMonkey666 OFFLINE  

CodeMonkey666

    Chopper Commander

  • 203 posts

Posted Tue Jun 22, 2004 10:08 AM

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.

#2 CodeMonkey666 OFFLINE  

CodeMonkey666

    Chopper Commander

  • 203 posts

Posted Tue Jun 22, 2004 11:16 AM

Oh, whups, I notice that this should have gone into the 2600 Programming for Newbies Section; oh well, I don't think it matters

#3 Thomas Jentzsch OFFLINE  

Thomas Jentzsch

    Thrust, Jammed, SWOOPS!

  • 16,745 posts
  • Always left from right here!
  • Location:Düsseldorf, Germany

Posted Tue Jun 22, 2004 12:09 PM

CodeMonkey666 said:

I saved the calculator program. I saved it in the directory DASMbinDOS in the dasm22007 file.
:idea: Following your description you should have saved it as clock003.asm.

#4 CodeMonkey666 OFFLINE  

CodeMonkey666

    Chopper Commander

  • 203 posts

Posted Tue Jun 22, 2004 10:28 PM

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?

#5 Thomas Jentzsch OFFLINE  

Thomas Jentzsch

    Thrust, Jammed, SWOOPS!

  • 16,745 posts
  • Always left from right here!
  • Location:Düsseldorf, Germany

Posted Wed Jun 23, 2004 2:12 AM

CodeMonkey666 said:

...so I click and then drag the BIN file over the Z26.exe thing...
What exactly are you doing here? :?

#6 Nukey Shay OFFLINE  

Nukey Shay

    Sheik Yerbouti

  • 20,458 posts
  • Location:The land of Gorch

Posted Wed Jun 23, 2004 2:39 AM

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.

#7 CodeMonkey666 OFFLINE  

CodeMonkey666

    Chopper Commander

  • 203 posts

Posted Wed Jun 23, 2004 4:34 AM

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.

#8 CodeMonkey666 OFFLINE  

CodeMonkey666

    Chopper Commander

  • 203 posts

Posted Wed Jun 23, 2004 4:39 AM

http://www.atariage....in/clock003.asm

---Oh and here is the link to the source code in case it came out fuzzy in the last post---

#9 Thomas Jentzsch OFFLINE  

Thomas Jentzsch

    Thrust, Jammed, SWOOPS!

  • 16,745 posts
  • Always left from right here!
  • Location:Düsseldorf, Germany

Posted Wed Jun 23, 2004 4:15 PM

CodeMonkey666 said:

Compiles perfect here.

I suppose you don't start the resulting ROM correctly. Do other game ROMs work?

#10 Nukey Shay OFFLINE  

Nukey Shay

    Sheik Yerbouti

  • 20,458 posts
  • Location:The land of Gorch

Posted Wed Jun 23, 2004 4:31 PM

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.

#11 CodeMonkey666 OFFLINE  

CodeMonkey666

    Chopper Commander

  • 203 posts

Posted Wed Jun 23, 2004 8:29 PM

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.

#12 vb_master OFFLINE  

vb_master

    Stargunner

  • 1,770 posts
  • Location:At my computer, where else?

Posted Wed Jun 23, 2004 8:40 PM

Try PCAE




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users