diff --git a/lib/5200MACRO.ASM b/lib/5200MACRO.ASM new file mode 100644 index 0000000..58431b2 --- /dev/null +++ b/lib/5200MACRO.ASM @@ -0,0 +1,146 @@ +;------------------------------------- + .MACRO ROLW + ROL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO ASLW + ASL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO RORW + ROR :1+1 + ROR :1 + .ENDM +;------------------------------------- + .MACRO LSRW + LSR :1+1 + ROR :1 + .ENDM + +;------------------------------------- + .MACRO VMAIN +; VMAIN #WORD,interrupt.vector +; interrupt.vector: +; 0 - VIMIRQ +; 1 - TIMCNT1 +; 2 - TIMCNT2 +; 3 - TIMCNT3 +; 4 - TIMCNT4 +; 5 - TIMCNT5 +; 6 - VVBLKI +; 7 - VVBLKD +; 8 - TIMVEC1 +; 9 - TIMVEC2 +; Initialises Vertical Blank Interrupts +; (works only with system interrupts ON) +;---------- +; on 5200 it sets up deferred VBL ONLY for now + sei + lda #$00 ;Disable all interruptes + sta nmien + sta irqen + +@ lda vcount + bne @- + mwa #:1 VVBLKD + lda #$40 ;Enable IRQ interrupts + sta pokmsk + sta irqen + cli + + .ENDM +;------------------------------------- + .MACRO VDLI +; VDLI #WORD +; Initialises Display List Interrupts + mwa #:1 VDSLST + mva #$C0 NMIEN + .ENDM +;------------------------------------- + .MACRO halt +?stop + lda RANDOM + and #$05 + sta COLBAK + jmp ?stop + .ENDM +;------------------------------------- + .MACRO KEY +; KEY +; waits for releasing and pressing "any key" + + .ENDM +;------------------------------------- + .MACRO WAIT +; WAIT +; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) +?zero LDA VCOUNT + beq ?zero + bpl ?WA + sbc #10 ; last lines correction +?WA cmp VCOUNT + beq ?WA + bcc ?WA +?WFRAME cmp VCOUNT + beq ?nowait + bcs ?WFRAME +?nowait + .ENDM +;------------------------------------- + .macro negw + ; negate the given word (0-a) +;------------------------------------- + sec + lda #$00 + sbc :1 + sta :1 + lda #$00 + sbc :1+1 + sta :1+1 + .endm +;------------------------------------- + .macro randomize + ;usage: randomize floor ceiling + ;returns (in A) a random .byte between "floor" and "ceiling" + .if :2 < :1 + .error "floor higher than ceiling" + .endif +?rand + lda random + cmp #:1 ;floor + bcc ?rand + cmp #:2+1 ;ceiling + bcs ?rand + .endm +;------------------------------------- + .macro phx + txa + pha + .endm +;------------------------------------- + .macro phy + tya + pha + .endm +;------------------------------------- + .macro plx + pla + tax + .endm +;------------------------------------- + .macro ply + pla + tay + .endm +;------------------------------------- + .macro pause + ;waits :1 number (byte) of frames + ldx #:1 +?PAUSELOOP + wait + dex + bne ?PAUSELOOP + .ENDM + diff --git a/lib/5200SYS.ASM b/lib/5200SYS.ASM index 5ae6b4a..017dbab 100644 --- a/lib/5200SYS.ASM +++ b/lib/5200SYS.ASM @@ -2,6 +2,8 @@ ;* ATARI 5200 CONSOLE * ;* SYSTEM EQUATES * ;**************************************************************************** +; based on https://web.archive.org/web/20200831200348/http://www.atarimuseum.com/videogames/consoles/5200/conv_to_5200.html +; ; OS VARIABLES FOR 5200 ; ; PAGE 0 @@ -9,14 +11,9 @@ POKMSK = $00 ;pokmsk at $00 on Atari 5200 instead of $10 on Atari RTCLOK = $01 ;Actually $01/$02 CRITIC = $03 ATRACT = $04 ;attact at $04 on Atari 5200 instead of $4D on Atari XL - -; PAGE 2 DLPTRS = $05 ;sdlstl at $05/$06 on Atari 5200 instead of $230 on Atari XL DMACTLS = $07 ;sdmactl at $07 on Atari 5200 instead of $22f on Atari XL SSKCTL = skctl ;There is no shadow on Atari 5200 -STICK0 = $278 ;There is no stick0 but we will make the analog stick look like a digital one and store it here -STRIG0 = $284 ;There is no strig0 but we will make this the shadow of the TRIG0 ($c010) of GITA - PCOLR0 EQU $08 ;P0 COLOR PCOLR1 EQU $09 ;P1 COLOR PCOLR2 EQU $0a ;P2 COLOR @@ -27,6 +24,36 @@ COLOR2 EQU $0e COLOR3 EQU $0f COLOR4 EQU $10 COLBAKS EQU COLOR4 +PADDL0 EQU $11 +PADDL1 EQU $12 +PADDL2 EQU $13 +PADDL3 EQU $14 +PADDL4 EQU $15 +PADDL5 EQU $16 +PADDL6 EQU $17 +PADDL7 EQU $18 +STICK0 = $19 ;There is no stick0 but we will make the analog stick look like a digital one and store it here +STRIG0 = $1a ;There is no strig0 but we will make this the shadow of the TRIG0 ($c010) of GTIA +chbas = $1b ;There is no strig0 but we will make this the shadow of the CHBASE + +; PAGE 2 +VIMIRQ EQU $0200 ;IMMED IRQ VECTOR +VVBLKI EQU $0202 ;IMM VBLK NMI VECTOR +VVBLKD EQU $0204 ;DEF VBLK NMI VECTOR +VDSLST EQU $0206 ;DSP LIST NMI VECTOR +VKEYBD EQU $0208 ;POKEY KB IRQ VECTOR +VKEYCNT EQU $020A ;Keypad routine continuation vector +BRKKY EQU $023C ;BREAK KEY VECTOR +VBREAK EQU $020E ;BRK INST IRQ VECTOR +VSERIN EQU $0210 ;POKEY INPUT RDY IRQ +VSEROR EQU $0212 ;POKEY OUTPUT RDY +VSEROC EQU $0214 ;POKEY OUTPUT DONE +VTIMR1 EQU $0216 ;POKEY TIMER 1 IRQ +VTIMR2 EQU $0218 ;POKEY TIMER 2 IRQ +VTIMR4 EQU $021A ;POKEY TIMER 4 IRQ + + +ROM_SETTINGS = $bfe8 ; game ROM info start (24 bytes total, 20b title, 2b year, 2b start vector) ; HARDWARE REGISTERS @@ -108,6 +135,7 @@ COLPF2 EQU GTIA+$18 COLPF3 EQU GTIA+$19 COLBAK EQU GTIA+$1a PRIOR EQU GTIA+$1b +GPRIOR = PRIOR ; no PRIOR shadow (GPRIOR) VDELAY EQU GTIA+$1c GRACTL EQU GTIA+$1d HITCLR EQU GTIA+$1e diff --git a/lib/macro.hea b/lib/MACRO.ASM similarity index 100% rename from lib/macro.hea rename to lib/MACRO.ASM diff --git a/scorch.asm b/scorch.asm index 091c9d3..e73184c 100644 --- a/scorch.asm +++ b/scorch.asm @@ -5,10 +5,13 @@ ;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 ;Miami & Warsaw 2022 +;--------------------------------------------------- +.def target = 5200 ; or 800 +;--------------------------------------------------- + OPT r+ ; saves 12 bytes :O -.def target = 800 ;5200 ; or 800 - +;--------------------------------------------------- .macro build dta d"1.15" ; number of this build (4 bytes) .endm @@ -18,8 +21,9 @@ jsr RMTSongSelect .endm +;--------------------------------------------------- icl 'definitions.asm' - +;--------------------------------------------------- .zpvar xdraw .word = $64 ;variable X for plot .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) @@ -122,17 +126,21 @@ displayposition = modify LineAddress4x4 = temp -;------------------------------- +;----------------------------------------------- +; libraries +;----------------------------------------------- .IF TARGET = 5200 icl 'lib/5200SYS.ASM' + icl 'lib/5200MACRO.ASM' .ELSE icl 'lib/ATARISYS.ASM' + icl 'lib/MACRO.ASM' icl 'artwork/Scorch50.asm' ; splash screen and musix .ENDIF - icl 'lib/macro.hea' - - ; variable declarations in RAM (no code) +;----------------------------------------------- +; variable declarations in RAM (no code) +;----------------------------------------------- ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) icl 'variables.asm' @@ -142,10 +150,10 @@ WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' + ;----------------------------------------------- ;Screen displays go here to avoid crossing 4kb barrier ;----------------------------------------------- - DisplayCopyRom = * org display, DisplayCopyRom DisplayCopyStart @@ -460,13 +468,6 @@ SettingEnergies jsr SetMainScreen jsr ColorsOfSprites -; lda #90 ; barrel fully erect -; ldx #MaxPlayers-1 -;@ sta previousBarrelAngle,x -; dex -; bpl @- - - jsr drawmountains ;draw them jsr drawtanks ;finally draw tanks @@ -635,11 +636,6 @@ ShootNow jsr Explosion continueMainRoundLoopAfterSeppuku - ;here we clear offensive text (after a shoot) - ;ldy TankNr - ;mva #0 plot4x4color - ;jsr DisplayOffensiveTextNr - AfterExplode jsr SoilDown2 ; allways @@ -659,7 +655,6 @@ NoExistNoFall mvx tempor2 TankNr missed - ; TODO: IS IT OK??? possibly a fix here needed for #56 ldy WeaponDepleted bne @+ ldx TankNr @@ -668,7 +663,6 @@ missed @ ;here we clear offensive text (after a shoot) - ;shit -- it's second time, but it must be like this ldy TankNr mva #$00 plot4x4color jsr DisplayOffensiveTextNr @@ -740,7 +734,6 @@ NoPlayerNoDeath ;clear NoDeathCounter here sta noDeathCounter - ; display defensive text here (well, defensive ; is not the real meaning, it should be pre-death, ; but I am too lazy to change names of variables) @@ -754,7 +747,7 @@ NoPlayerNoDeath inc CurrentResult mva #sfx_death_begin sfx_effect -;RandomizeDeffensiveText + ; RandomizeDeffensiveText randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) sta TextNumberOff ldy TankTempY @@ -1243,7 +1236,16 @@ exitVBL ply plx pla - jmp XITVBV + .IF target = 5200 + pla + tay + pla + tax + pla + rti + .ELSE + jmp XITVBV + .ENDIF .endp ;---------------------------------------------- .proc RandomizeSequence0 @@ -1462,7 +1464,7 @@ Bubble BubbleBobble lda TempResults,x cmp TempResults+1,x - beq nextishigher ; this is to block hangs when 2 same values meet + beq nextishigher ; this is to block hangs when 2 equal values meet bcc nextishigher ;here we must swap values ;because next is smaller than previous @@ -1713,15 +1715,18 @@ MODULEND font4x4 ins 'artwork/font4x4s.bmp',+62 - - .IF target = 5200 - org $bfe8 +;---------------------------------------------- + .IF target = 5200 + .IF * > ROM_SETTINGS-1 + .ERROR 'Code too long to fit in 5200' + .ENDIF + org ROM_SETTINGS ; 5200 ROM settings address $bfe8 ; "01234567890123456789" .byte " SCORCH 5200 v" ;20 characters title build ; " " .byte " " - .byte '22' ;2 characters year + .byte '7A' ;2 characters year .. 1900 + $7A = 2020 .word FirstSTART - .ELSE - run FirstSTART - .ENDIF \ No newline at end of file + .ELSE + run FirstSTART + .ENDIF \ No newline at end of file diff --git a/scorch.xex b/scorch.xex index 10e9927..abeb3f2 100644 Binary files a/scorch.xex and b/scorch.xex differ