From 6fc2882a6ecf64b85ecd44beae64c62d53f5948b Mon Sep 17 00:00:00 2001 From: pkali Date: Sat, 17 Sep 2022 23:31:12 -0400 Subject: [PATCH] WIP: 5200 port (not yet working) --- artwork/talk.asm | 2 +- lib/5200SYS.ASM | 224 +++++++++++++++++++++++++++++++++++++++++++++++ scorch.asm | 55 +++++++----- scorch.xex | Bin 48734 -> 48681 bytes 4 files changed, 258 insertions(+), 23 deletions(-) create mode 100644 lib/5200SYS.ASM diff --git a/artwork/talk.asm b/artwork/talk.asm index ba3bfcf..f60451e 100644 --- a/artwork/talk.asm +++ b/artwork/talk.asm @@ -1,6 +1,6 @@ .proc talk ; Maximum text length is 63 characters!!! -L0 dta d"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW." +L0 dta d"CTO XYEB" L1 dta d"DIE!" L2 dta d"EAT MY SHORTS!" L3 dta d"YOU'RE TOAST!" diff --git a/lib/5200SYS.ASM b/lib/5200SYS.ASM new file mode 100644 index 0000000..ab5d98e --- /dev/null +++ b/lib/5200SYS.ASM @@ -0,0 +1,224 @@ +;**************************************************************************** +;* ATARI 5200 CONSOLE * +;* SYSTEM EQUATES * +;**************************************************************************** +; OS VARIABLES FOR 5200 +; +; PAGE 0 +POKMSK = $00 ;pokmsk at $00 on Atari 5200 instead of $10 on Atari XL +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 +PCOLR3 EQU $0b ;P3 COLOR +COLOR0 EQU $0c ;COLOR 0 +COLOR1 EQU $0d +COLOR2 EQU $0e +COLOR3 EQU $0f +COLOR4 EQU $10 +COLBAKS EQU COLOR4 + +; HARDWARE REGISTERS + +; GTIA +CONSOL = $280 ;There are no console keys on Atari 5200, so we replace console h/w reads with a new shadow based on the keypad keys +consol_reset = $07 ;The constant value representing that no consol key is pressed +; --------------------------------------------------------------------------- +POKEY EQU $EB200 +; --------------------------------------------------------------------------- +; +; READ +; +POT0 EQU POKEY+$00 +POT1 EQU POKEY+$01 +POT2 EQU POKEY+$02 +POT3 EQU POKEY+$03 +POT4 EQU POKEY+$04 +POT5 EQU POKEY+$05 +POT6 EQU POKEY+$06 +POT7 EQU POKEY+$07 +ALLPOT EQU POKEY+$08 +KBCODE EQU POKEY+$09 +RANDOM EQU POKEY+$0a +POTGO EQU POKEY+$0b +SERIN EQU POKEY+$0d +IRQST EQU POKEY+$0e +SKSTAT EQU POKEY+$0f +; +; WRITE +; +AUDF1 EQU POKEY+$00 +AUDC1 EQU POKEY+$01 +AUDF2 EQU POKEY+$02 +AUDC2 EQU POKEY+$03 +AUDF3 EQU POKEY+$04 +AUDC3 EQU POKEY+$05 +AUDF4 EQU POKEY+$06 +AUDC4 EQU POKEY+$07 +AUDCTL EQU POKEY+$08 +STIMER EQU POKEY+$09 +SKRES EQU POKEY+$0a +SEROUT EQU POKEY+$0d +IRQEN EQU POKEY+$0e +SKCTL EQU POKEY+$0f +; +; +; +; --------------------------------------------------------------------------- +GTIA EQU $C000 +; --------------------------------------------------------------------------- +; +; WRITE +; +HPOSP0 EQU GTIA+$00 +HPOSP1 EQU GTIA+$01 +HPOSP2 EQU GTIA+$02 +HPOSP3 EQU GTIA+$03 +HPOSM0 EQU GTIA+$04 +HPOSM1 EQU GTIA+$05 +HPOSM2 EQU GTIA+$06 +HPOSM3 EQU GTIA+$07 +SIZEP0 EQU GTIA+$08 +SIZEP1 EQU GTIA+$09 +SIZEP2 EQU GTIA+$0a +SIZEP3 EQU GTIA+$0b +SIZEM EQU GTIA+$0c +GRAFP0 EQU GTIA+$0d +GRAFP1 EQU GTIA+$0e +GRAFP2 EQU GTIA+$0f +GRAFP3 EQU GTIA+$10 +GRAFM EQU GTIA+$11 +COLPM0 EQU GTIA+$12 +COLPM1 EQU GTIA+$13 +COLPM2 EQU GTIA+$14 +COLPM3 EQU GTIA+$15 +COLPF0 EQU GTIA+$16 +COLPF1 EQU GTIA+$17 +COLPF2 EQU GTIA+$18 +COLPF3 EQU GTIA+$19 +COLBAK EQU GTIA+$1a +PRIOR EQU GTIA+$1b +VDELAY EQU GTIA+$1c +GRACTL EQU GTIA+$1d +HITCLR EQU GTIA+$1e +;CONSOL EQU GTIA+$1f ; no CONSOL in 5200 +; +; READ +; +M0PF EQU GTIA+$00 +M1PF EQU GTIA+$01 +M2PF EQU GTIA+$02 +M3PF EQU GTIA+$03 +P0PF EQU GTIA+$04 +P1PF EQU GTIA+$05 +P2PF EQU GTIA+$06 +P3PF EQU GTIA+$07 +M0PL EQU GTIA+$08 +M1PL EQU GTIA+$09 +M2PL EQU GTIA+$0a +M3PL EQU GTIA+$0b +P0PL EQU GTIA+$0c +P1PL EQU GTIA+$0d +P2PL EQU GTIA+$0e +P3PL EQU GTIA+$0f +TRIG0 EQU GTIA+$10 +TRIG1 EQU GTIA+$11 +TRIG2 EQU GTIA+$12 +TRIG3 EQU GTIA+$13 +PAL EQU GTIA+$14 +; +; +; --------------------------------------------------------------------------- +ANTIC EQU $D400 +; --------------------------------------------------------------------------- +; +DMACTL EQU ANTIC+$00 +CHACTL EQU ANTIC+$01 +DLPTR EQU ANTIC+$02 +;DLISTH EQU ANTIC+$03 +HSCROL EQU ANTIC+$04 +VSCROL EQU ANTIC+$05 +PMBASE EQU ANTIC+$07 +CHBASE EQU ANTIC+$09 +WSYNC EQU ANTIC+$0a +VCOUNT EQU ANTIC+$0b +PENH EQU ANTIC+$0c +PENV EQU ANTIC+$0d +NMIEN EQU ANTIC+$0e +NMIRES EQU ANTIC+$0f +NMIST EQU ANTIC+$0f +; +; --------------------------------------------------------------------------- +; Atari ANTIC chip display list equates +; --------------------------------------------------------------------------- +; +JUMP EQU $01 ; display list jump instruction (3 byte) +JVB EQU $41 ; display list jump and wait for vblank instruction (3) +; +SCH EQU $10 ; display list horizontal scrolling +SCV EQU $20 ; display list vertical scrolling +LMS EQU $40 ; display list load memory scan instruction (3 byte) +DLII EQU $80 ; display list interrupt instruction +; +SKIP1 EQU $00 ; display list skip 1 scan line instruction +SKIP2 EQU $10 ; display list skip 2 scan lines instruction +SKIP3 EQU $20 ; display list skip 3 scan lines instruction +SKIP4 EQU $30 ; display list skip 4 scan lines instruction +SKIP5 EQU $40 ; display list skip 5 scan lines instruction +SKIP6 EQU $50 ; display list skip 6 scan lines instruction +SKIP7 EQU $60 ; display list skip 7 scan lines instruction +SKIP8 EQU $70 ; display list skip 8 scan lines instruction +; +MODE2 EQU $02 ; display list mode 2 +MODE4 EQU $04 ; display list mode 4 +MODE8 EQU $08 ; display list mode 8 +MODEE EQU $0E ; display list mode E +MODEF EQU $0F ; display list mode F +; --------------------------------------------------------------------------- +; ENUMS +; --------------------------------------------------------------------------- + +.enum @dmactl + blank = %00 + narrow = %01 + standard= %10 + wide = %11 + missiles= %100 + players = %1000 + lineX1 = %10000 + lineX2 = %00000 + dma = %100000 +.ende + +scr48 = @dmactl(wide|dma|players|missiles|lineX1) +scr40 = @dmactl(standard|dma|players|missiles|lineX1) +scr32 = @dmactl(narrow|dma|players|missiles|lineX1) + +.enum @pmcntl + missiles= %1 + players = %10 + trigs = %100 +.ende + +.enum @gtictl + prior0 = %0 + prior1 = %1 + prior2 = %10 + prior4 = %100 + prior8 = %1000 + ply5 = %10000 ; Fifth Player Enable + mlc = %100000 ; Multiple Color Player Enable + mode9 = %01000000 + mode10 = %10000000 + mode11 = %11000000 +.ende diff --git a/scorch.asm b/scorch.asm index 684c5c7..091c9d3 100644 --- a/scorch.asm +++ b/scorch.asm @@ -2,13 +2,15 @@ ;Atari 8-bit Scorched Earth source code ;--------------------------------------------------- ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski -;Warsaw 2000,2001,2002,2003,2009,2012,2013 +;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 ;Miami & Warsaw 2022 + OPT r+ ; saves 12 bytes :O + .def target = 800 ;5200 ; or 800 .macro build - dta d"1.15" ; number of this build (3 bytes) + dta d"1.15" ; number of this build (4 bytes) .endm .macro RMTSong @@ -121,19 +123,22 @@ LineAddress4x4 = temp ;------------------------------- - - icl 'lib/ATARISYS.ASM' + .IF TARGET = 5200 + icl 'lib/5200SYS.ASM' + .ELSE + icl 'lib/ATARISYS.ASM' + icl 'artwork/Scorch50.asm' ; splash screen and musix + .ENDIF + icl 'lib/macro.hea' - .IF target !=5200 - ;splash screen and musix - icl 'artwork/Scorch50.asm' - .ENDIF - - ;Game loading address - ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) - icl 'variables.asm' - ORG $4000 + ; variable declarations in RAM (no code) + ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) + icl 'variables.asm' + + ; Game loading address + ORG $4000 + ;opt f+ ; single block WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' @@ -1698,19 +1703,25 @@ TankFont ;RMT PLAYER and song loading shenaningans icl 'artwork/sfx/rmtplayr_modified.asm' -MODUL equ $b000 ;address of RMT module - opt h- ;RMT module is standard Atari binary file already - ins "artwork/sfx/scorch_str6.rmt" ;include music RMT module - opt h+ + org $b000 +MODUL ; equ $b000 ;address of RMT module + ;opt h- ;RMT module is standard Atari binary file already + ins "artwork/sfx/scorch_str6.rmt",+6 ;include music RMT module + ;opt h+ MODULEND ;---------------------------------------------- - org $bf80 font4x4 ins 'artwork/font4x4s.bmp',+62 - - - - + .IF target = 5200 + org $bfe8 + ; "01234567890123456789" + .byte " SCORCH 5200 v" ;20 characters title + build ; " " + .byte " " + .byte '22' ;2 characters year + .word FirstSTART + .ELSE run FirstSTART + .ENDIF \ No newline at end of file diff --git a/scorch.xex b/scorch.xex index e8ef541c68e28f20f6175ecbd3280cb0c8b08e52..10e992788fddbad55839b98c0630e677ba128f45 100644 GIT binary patch delta 6172 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 delta 6446 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