From f1028e86ad809ab57fcb08df9dbc988fd0f618e1 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 12 Jun 2025 12:25:06 +0200 Subject: [PATCH] DM logo timer and compile from source --- art/DM_logo_src/digital_melody_logo.asm | 293 +++++++++++++++ art/DM_logo_src/digital_melody_logo.fad | 164 +++++++++ art/DM_logo_src/digital_melody_logo.fnt | Bin 0 -> 1024 bytes art/DM_logo_src/digital_melody_logo.h | 275 ++++++++++++++ art/DM_logo_src/digital_melody_logo.pmf | 466 ++++++++++++++++++++++++ art/DM_logo_src/digital_melody_logo.scr | Bin 0 -> 1200 bytes art/digital_melody_logo.xex | Bin 2572 -> 0 bytes lumber.asm | 6 + lumber.xex | Bin 35513 -> 38097 bytes timberman.xex | Bin 38085 -> 0 bytes 10 files changed, 1204 insertions(+) create mode 100644 art/DM_logo_src/digital_melody_logo.asm create mode 100644 art/DM_logo_src/digital_melody_logo.fad create mode 100644 art/DM_logo_src/digital_melody_logo.fnt create mode 100644 art/DM_logo_src/digital_melody_logo.h create mode 100644 art/DM_logo_src/digital_melody_logo.pmf create mode 100644 art/DM_logo_src/digital_melody_logo.scr delete mode 100644 art/digital_melody_logo.xex delete mode 100644 timberman.xex diff --git a/art/DM_logo_src/digital_melody_logo.asm b/art/DM_logo_src/digital_melody_logo.asm new file mode 100644 index 0000000..2efb39e --- /dev/null +++ b/art/DM_logo_src/digital_melody_logo.asm @@ -0,0 +1,293 @@ +/***************************************/ +/* Use MADS http://mads.atari8.info/ */ +/* Mode: DLI (char mode) */ +/***************************************/ + + icl "digital_melody_logo.h" + + org $f0 + +fcnt .ds 2 +fadr .ds 2 +fhlp .ds 2 +cloc .ds 1 +regA .ds 1 +regX .ds 1 +regY .ds 1 + +WIDTH = 40 +HEIGHT = 30 + +; --- BASIC switch OFF + org $2000\ mva #$ff portb\ rts\ ini $2000 + +; --- MAIN PROGRAM + org $2000 +ant dta $42,a(scr) + dta $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02 + dta $02,$02,$02,$02,$02,$02,$02,$02,$82,$04,$02,$02,$22 + dta $41,a(ant) + +scr ins "digital_melody_logo.scr" + + .ds 0*40 + + .ALIGN $0400 +fnt ins "digital_melody_logo.fnt" + + ift USESPRITES + .ALIGN $0800 +pmg .ds $0300 + ift FADECHR = 0 + SPRITES + els + .ds $500 + eif + eif + +main +; --- init PMG + ift USESPRITES + mva >pmg pmbase ;missiles and players data address + mva #$03 pmcntl ;enable players and missiles + eif + + lda:cmp:req $14 ;wait 1 frame + + sei ;stop IRQ interrupts + mva #$00 nmien ;stop NMI interrupts + sta dmactl + mva #$fe portb ;switch off ROM to get 16k more ram + + mwa #NMI $fffa ;new NMI handler + + mva #1 vscrol + + mva #$c0 nmien ;switch on NMI+DLI again + + ift CHANGES ;if label CHANGES defined + +_lp lda trig0 ; FIRE #0 + beq stop + + lda trig1 ; FIRE #1 + beq stop + + lda consol ; START + and #1 + beq stop + + lda cloc + cmp #200 ; timer - 4s. + bcs stop + + lda skctl + and #$04 + bne _lp ;wait to press any key; here you can put any own routine + + els + +null jmp DLI.dli1 ;CPU is busy here, so no more routines allowed + + eif + + +stop + mva #0 dmactls ; dark screen + sta dmactl + mva #$00 pmcntl ;PMG disabled + tax + sta:rne hposp0,x+ + + mva #$ff portb ;ROM switch on + mva #$40 nmien ;only NMI interrupts, DLI disabled + cli ;IRQ enabled + + rts ;return to ... DOS + +; --- DLI PROGRAM + +.local DLI + + ?old_dli = * + + ift !CHANGES + +dli1 lda trig0 ; FIRE #0 + beq stop + + lda trig1 ; FIRE #1 + beq stop + + lda consol ; START + and #1 + beq stop + + lda skctl + and #$04 + beq stop + + lda vcount + cmp #$02 + bne dli1 + + :3 sta wsync + + DLINEW dli4 + + eif + +dli_start + +dli4 + sta regA + stx regX + sty regY + +c9 lda #$38 +c10 ldx #$04 +c11 ldy #$0E + sta wsync ;line=208 + sta color0 + stx color1 + sty color2 +c12 lda #$82 + sta color3 + lda #$01 + sta gtictl + + lda regA + ldx regX + ldy regY + rti + + +.endl + +; --- + +CHANGES = 1 +FADECHR = 0 + +SCHR = 127 + +; --- + +.proc NMI + + bit nmist + bpl VBL + + jmp DLI.dli_start +dliv equ *-2 + +VBL + sta regA + stx regX + sty regY + + sta nmist ;reset NMI flag + + mwa #ant dlptr ;ANTIC address program + + mva #@dmactl(standard|dma|lineX1|players|missiles) dmactl ;set new screen width + + inc cloc ;little timer + +; Initial values + + lda >fnt+$400*$00 + sta chbase +c0 lda #$0E + sta colpm0 +c1 lda #$38 + sta colpm1 +c2 lda #$04 + sta colpm2 +c3 lda #$0E + sta colpm3 +c4 lda #$82 + sta color0 +c5 lda #$02 + sta color1 +c6 lda #$56 + sta color2 +c7 lda #$86 + sta color3 +c8 lda #$0E + sta colbak + lda #$02 + sta chrctl + lda #$81 + sta gtictl +x0 lda #$00 + sta hposp0 + sta hposp1 + sta hposp2 + sta hposp3 + sta hposm0 + sta hposm1 + sta hposm2 + sta hposm3 + sta sizep0 + sta sizep1 + sta sizep2 + sta sizep3 + sta sizem + + mwa #DLI.dli_start dliv ;set the first address of DLI interrupt + +;this area is for yours routines + +quit + lda regA + ldx regX + ldy regY + rti + +.endp + +; --- + ini main +; --- + + opt l- + +.MACRO SPRITES +missiles + .ds $100 +player0 + .ds $100 +player1 + .ds $100 +player2 + .ds $100 +player3 + .ds $100 +.ENDM + +USESPRITES = 0 + +.MACRO DLINEW + mva <:1 NMI.dliv + ift [>?old_dli]<>[>:1] + mva >:1 NMI.dliv+1 + eif + + ift :2 + lda regA + eif + + ift :3 + ldx regX + eif + + ift :4 + ldy regY + eif + + rti + + .def ?old_dli = * +.ENDM + diff --git a/art/DM_logo_src/digital_melody_logo.fad b/art/DM_logo_src/digital_melody_logo.fad new file mode 100644 index 0000000..a1798ad --- /dev/null +++ b/art/DM_logo_src/digital_melody_logo.fad @@ -0,0 +1,164 @@ +; --- +; --- FADE +; --- +.local FADE + + stx jsr+1 + sty jsr+2 + + ldx #6 + jsr wait + + mva #16 cnt + +lcol mva tcol fcnt+1 + + ldx #2 + jsr wait + +jsr jsr $ffff + + dec cnt + bne lcol + + ldx #6 + +wait lda:cmp:req cloc + dex + bne wait + rts + +cnt brk +.end + + +; --- +; --- FADE IN +; --- +.local FADE_IN + + ldx fade + jmp :fade + +fade ldy #0 + mva (fcnt),y fadr + + iny + lda (fcnt),y + sne:rts + + sta fadr+1 + + lda (fadr),y + tax + + iny + eor (fcnt),y + beq skp + + dey + + pha + + and #$f0 + beq plus1 + +plus16 txa + add #$10 + tax + +plus1 pla + and #$0f + seq + inx + + txa + sta (fadr),y + +skp adw fcnt #3 + + jmp fade +.end + + +; --- +; --- FADE OUT +; --- +.local FADE_OUT + + ldx fade + jmp :fade + +fade ldy #0 + mva (fcnt),y fadr + + iny + lda (fcnt),y + sne:rts + + sta fadr+1 + + lda (fadr),y + tax + + and #$0f + beq skp0 + + dex +skp0 + txa + and #$f0 + beq skp1 + + txa + sub #$10 + tax +skp1 + txa + + sta (fadr),y + + adw fcnt #3 + + jmp fade +.end + + +; --- +; --- SAVE COLOR +; --- +.local SAVE_COLOR + + mva fade.lcol+1 fcnt + mva fade.hcol+1 fcnt+1 + +loop ldy #0 + mva (fcnt),y fadr + + iny + lda (fcnt),y + sne:rts + + sta fadr+1 + + lda (fadr),y + + iny + sta (fcnt),y + + dey + mva #0 (fadr),y ; black screen (all colors = $00) + + adw fcnt #3 + + jmp loop +.end + + .use DLI,NMI +tcol + dta t(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9) + dta t(c10,c11,c12) + dta t(0) diff --git a/art/DM_logo_src/digital_melody_logo.fnt b/art/DM_logo_src/digital_melody_logo.fnt new file mode 100644 index 0000000000000000000000000000000000000000..d8538f878c507efe2bd26f1a2e0263386c46ee5a GIT binary patch literal 1024 zcmeH@p>D%46h$pXbBVQTFl67*C^SmRKA@yvEGVU8W7VvJlK#!mn5EFS<`*Ja>Tnfg zwtH=t4G#7w(z||szSpr*iKomq^PcH5FBxucGSm+lx=^x5eVbwZbB}|7XSh#N=hovY z`owm&-mVhss*Y5?E3gNXZ%V6!*S{v*k5*P+NYK2I~PRMYJWVbjPBQlDd&g1wk tBD>4w2MIf`^`MmYu2T+CPCq_t!u(eE4Ju{Rb+``tyz`y=3;fp$`~qUjfA9bR literal 0 HcmV?d00001 diff --git a/art/DM_logo_src/digital_melody_logo.h b/art/DM_logo_src/digital_melody_logo.h new file mode 100644 index 0000000..1f20bfa --- /dev/null +++ b/art/DM_logo_src/digital_melody_logo.h @@ -0,0 +1,275 @@ + opt l- + +.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) ;screen 48b +scr40 = @dmactl(standard|dma|players|missiles|lineX1) ;screen 40b +scr32 = @dmactl(narrow|dma|players|missiles|lineX1) ;screen 32b + +.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 + + +* --------------------------------------------------------------------------------------------- +* --- OS +* --------------------------------------------------------------------------------------------- + +ramlo = $04 ; (2) wektor RAM dla testu wielko?ci pami?ci + +warmst = $08 ; znacznik gor?cego startu +boot? = $09 ; znacznik odczytu wst?pnego +dosvec = $0A ; (2) wektor startowy programu dyskowego +dosini = $0C ; (2) wektor inicjacji po odczycie z dyskietki + +rtclok = $12 ; (3) zegar czasu rzeczywistego + +lmargin = $52 +rmargin = $53 +rowcrs = $54 ; wiersz kursora +colcrs = $55 ; (2) Kolumna kursora + +keydef = $79 ; (2) tablica konwersji kod?w klawiatury na ATASCII + + +vdslst = $0200 ; (2) wektor przerwa? NMI listy displejowej +timcnt3 = $021C ; trzeci licznik systemu +vvblki = $0222 ; (2) wektor NMI natychmiastowego VBI +vvblkd = $0224 ; (2) wektor NMI op??nionego VBI +timflg3 = $022a ; znacznik wyzerowania licznika TIMCNT3 + +colpf0s = $02C4 ; rejestr-cie? COLPF0 +colpf1s = $02C5 ; rejestr-cie? COLPF1 +colpf2s = $02C6 ; rejestr-cie? COLPF2 +colpf3s = $02C7 ; rejestr-cie? COLPF3 +colbaks = $02C8 ; rejestr-cie? COLBAK + +dsctln = $02D5 ; (2) Disk sector size register; default of 128 ($80) bytes +dvstat = $02EA ; (4) device status + +crsinh = $02F0 ; znacznik widoczno?ci kursora +chact = $02F3 ; rejestr cien CHRCTL +chbas = $02F4 ; rejestr cien CHBASE + +atachr = $02Fb ; numer koloru dla PLOT, DRAW (kod ATASCII znaku) +kbcodes = $02Fc ; kod ostatnio naci?ni?tego klawisza, $ff je?li ?aden nie zosta? naci?ni?ty (KBCODE) +fildat = $02Fd ; numer koloru dla FILL +chart = $02F3 ; cie? rejestru kontroli wy?wietlania znak?w (CHRCTL) + +ddevic = $0300 ; Device Control Block, identyfikator urz?dzenia +dunit = $0301 ; Numer urz?dzenia; w przypadku stacji dysk?w numer nap?du +dcmnd = $0302 ; Komenda dla urz?dzenia. +dstats = $0303 ; Przed wywo?aniem SIO nale?y ustawi? tu rodzaj operacji ($40 odczyt, $80 zapis, $C0 zapis i odczyt, $00 brak transferu danych). Po powrocie z systemu znajduje si? tu status operacji (kod b??du). +dbufa = $0304 ; (2) Adres bufora. Przy operacji zapisu i odczytu jednocze?nie (DSTATS = $C0) bufor na odczytywane dane znajduje si? w tym samym miejscu, co bufor danch przeznaczonych do zapisu. +dtimlo = $0306 ; Czas oczekiwania na pozytywn? odpowied? urz?dzenia, tzw. timeout, najczesciej = 7 +dunuse = $0307 ; Bajt nieu?ywany, zarezerwowany do przysz?ych zastosowa?. +dbyt = $0308 ; (2) Wielko?? bufora; musi by? zgodna z wielko?ci? transmitowanego bloku danych. Zero oznacza 64 kilobajty. +daux1 = $030A ; Pierwszy bajt pomocniczy. W operacjach dyskowych m?odszy bajt numeru sektora. +daux2 = $030B ; Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora. +casflg = $030F ; When set to zero, the current operation is a standard SIO operation; when non-zero, it is a cassette operation. + +hatabs = $031A ; tabela wektor?w procedur obs?ugi + +iocb = $0340 ; IOCB 0..7 ($340, $350, $360 ...) +iocom = iocb+2 ; Komenda dla IOCB +ioadr = iocb+4 ; (2) Adres bufora dla IOCB +ioaux1 = iocb+10 ; Bajt pomocniczy 1 IOCB +ioaux2 = iocb+11 ; Bajt pomocniczy 2 IOCB + +icchid = $0340 +icdno = $0341 +iccmd = $0342 ; kod rozkazu operacji I/O +icstat = $0343 ; status operacji I/O +icbufa = $0344 ; (2) adres bufora danych dla operacji I/O +icputb = $0346 ; (2) adres procedury przesy?ania danych +icbufl = $0348 ; (2) d?ugo?? bufora danych dla operacji I/O +icax1 = $034A ; rejestr pomocniczy dla operacji I/O +icax2 = $034B ; rejestr pomocniczy dla operacji I/O +icax3 = $034C ; rejestr pomocniczy dla operacji I/O +icax4 = $034D ; rejestr pomocniczy dla operacji I/O +icax5 = $034E ; rejestr pomocniczy dla operacji I/O +icax6 = $034F ; rejestr pomocniczy dla operacji I/O + +casbuf = $0400 ; bufor magnetofonu +casben = $047F ; koniec bufora magnetofonu + +setvbv = $E45C +xitvbv = $E462 +ciov = $E456 ; Wektor do CIOMAIN +jsioint = $E459 ; Wektor do SIO +jdskint = $E453 ; Wektor do sterownika dyskowego + +* --------------------------------------------------------------------------------------------- +* --- KEY ($d209) +* --------------------------------------------------------------------------------------------- + +key_esc = 28 +key_space = 33 + +key_a = 63 +key_b = 21 +key_d = 58 +key_m = 37 +key_n = 35 +key_v = 16 +key_o = 8 +key_p = 10 +key_s = 62 +key_w = 46 + +* --------------------------------------------------------------------------------------------- +* --- GTIA +* --------------------------------------------------------------------------------------------- + +hposp0 = $D000 ; pozioma pozycja gracza 0 (Z) +hposp1 = $D001 ; pozioma pozycja gracza 1 (Z) +hposp2 = $D002 ; pozioma pozycja gracza 2 (Z) +hposp3 = $D003 ; pozioma pozycja gracza 3 (Z) +hposm0 = $D004 ; pozioma pozycja pocisku 0 (Z) +hposm1 = $D005 ; pozioma pozycja pocisku 1 (Z) +hposm2 = $D006 ; pozioma pozycja pocisku 2 (Z) +hposm3 = $D007 ; pozioma pozycja pocisku 3 (Z) +sizep0 = $D008 ; poziomy rozmiar gracza 0 (Z) +sizep1 = $D009 ; poziomy rozmiar gracza 1 (Z) +sizep2 = $D00A ; poziomy rozmiar gracza 2 (Z) +sizep3 = $D00B ; poziomy rozmiar gracza 3 (Z) +sizem = $D00C ; poziomy rozmiar pocisk?w (Z) +grafp0 = $D00D ; rejestr grafiki gracza 0 (Z) +grafp1 = $D00E ; rejestr grafiki gracza 1 (Z) +grafp2 = $D00F ; rejestr grafiki gracza 2 (Z) +grafp3 = $D010 ; rejestr grafiki gracza 3 (Z) +grafm = $D011 ; rejestr grafiki pocisk?w (Z) +colpm0 = $D012 ; rejestr koloru gracza i pocisku 0 (Z) +colpm1 = $D013 ; rejestr koloru gracza i pocisku 1 (Z) +colpm2 = $D014 ; rejestr koloru gracza i pocisku 2 (Z) +colpm3 = $D015 ; rejestr koloru gracza i pocisku 3 (Z) +colpf0 = $D016 ; rejestr koloru pola gry 0 (Z) +colpf1 = $D017 ; rejestr koloru pola gry 1 (Z) +colpf2 = $D018 ; rejestr koloru pola gry 2 (Z) +colpf3 = $D019 ; rejestr koloru pola gry 3 (Z) +colpf4 = $D01A +colbak = $D01A ; rejestr koloru t?a (Z) + +color0 = colpf0 +color1 = colpf1 +color2 = colpf2 +color3 = colpf3 + +kolm0pf = $D000 ; kolizja pocisku 0 z polem gry (O) +kolm1pf = $D001 ; kolizja pocisku 1 z polem gry (O) +kolm2pf = $D002 ; kolizja pocisku 2 z polem gry (O) +kolm3pf = $D003 ; kolizja pocisku 3 z polem gry (O) +kolp0pf = $D004 ; kolizja gracza 0 z polem gry (O) +kolp1pf = $D005 ; kolizja gracza 1 z polem gry (O) +kolp2pf = $D006 ; kolizja gracza 2 z polem gry (O) +kolp3pf = $D007 ; kolizja gracza 3 z polem gry (O) +kolm0p = $D008 ; kolizja pocisku 0 z graczem (O) +kolm1p = $D009 ; kolizja pocisku 1 z graczem (O) +kolm2p = $D00A ; kolizja pocisku 2 z graczem (O) +kolm3p = $D00B ; kolizja pocisku 3 z graczem (O) +kolp0p = $D00C ; kolizja gracza 0 z innym graczem (O) +kolp1p = $D00D ; kolizja gracza 1 z innym graczem (O) +kolp2p = $D00E ; kolizja gracza 2 z innym graczem (O) +kolp3p = $D00F ; kolizja gracza 3 z innym graczem (O) +trig0 = $D010 ; stan przycisku joysticka 0 (O) +trig1 = $D011 ; stan przycisku joysticka 1 (O) +trig3 = $D013 ; znacznik do??czenia cartridge-a (O) +pal = $D014 ; znacznik systemu TV (O) PAL = 1, NTSC = 15 + +gtictl = $D01B ; rejestr kontroli uk?adu GTIA +gtiactl = gtictl + +vdelay = $D01C ; licznik op??nienia pionowego P/MG +pmcntl = $D01D ; rejestr kontroli graczy i pocisk?w +hitclr = $D01E ; rejestr kasowania rejestr?w kolizji +consol = $D01F ; rejestr stanu klawiszy konsoli + +* --------------------------------------------------------------------------------------------- +* --- POKEY +* --------------------------------------------------------------------------------------------- + +irqens = $0010 ; rejestr-cie? IRQEN +irqstat = $0011 ; rejestr-cie? IRQST + +audf1 = $d200 ; cz?stotliwo?? pracy generatora 1 (Z) +audc1 = $d201 ; rejestr kontroli d?wi?ku generatora 1 (Z) +audf2 = $d202 ; cz?stotliwo?? pracy generatora 2 (Z) +audc2 = $d203 ; rejestr kontroli d?wi?ku generatora 2 (Z) +audf3 = $d204 ; cz?stotliwo?? pracy generatora 3 (Z) +audc3 = $d205 ; rejestr kontroli d?wi?ku generatora 3 (Z) +audf4 = $d206 ; cz?stotliwo?? pracy generatora 4 (Z) +audc4 = $d207 ; rejestr kontroli d?wi?ku generatora 4 (Z) + +audctl = $D208 ; rejestr kontroli generator?w d?wi?ku (Z) +stimer = $D209 ; rejestr zerowania licznik?w (Z) +kbcode = $D209 ; kod ostatnio naci?ni?tego klawisza (O) +skstres = $D20A ; rejestr statusu z??cza szeregowego (Z) +random = $D20A ; rejestr liczby losowej (O) +serout = $D20D ; szeregowy rejestr wyj?ciowy (Z) +serin = $D20D ; szeregowy rejestr wej?ciowy (O) +irqen = $D20E ; zezwolenie przerwa? IRQ (Z) +irqst = $D20E ; status przerwa? IRQ (O) +skctl = $D20F ; rejestr kontroli z??cza szeregowego (Z) +skstat = $D20F ; rejestr statusu z??cza szeregowego (O) + +* --------------------------------------------------------------------------------------------- +* --- PIA +* --------------------------------------------------------------------------------------------- + +porta = $D300 ; port A uk?adu PIA +portb = $D301 ; port B uk?adu PIA +pactl = $D302 ; rejestr kontroli portu A +pbctl = $D303 ; rejestr kontroli portu B + +* --------------------------------------------------------------------------------------------- +* --- ANTIC +* --------------------------------------------------------------------------------------------- + +dmactl = $D400 ; rejestr kontroli dost?pu do pami?ci +chrctl = $D401 ; rejestr kontroli wy?wietlania znak?w +dlptr = $D402 ; adres programu ANTIC-a +hscrol = $D404 ; znacznik poziomego przesuwu obrazu +vscrol = $D405 ; znacznik pionowego przesuwu obrazu +pmbase = $D407 ; adres pami?ci graczy i pocisk?w +chbase = $D409 ; adres zestawu znak?w +wsync = $D40A ; znacznik oczekiwania na synchronizacj? poziom? +vcount = $D40B ; licznik linii obrazu +lpenh = $D40C ; poziome po?o?enie pi?ra ?wietlengo +lpenv = $D40D ; pionowe po?o?enie pi?ra ?wietlnego +nmien = $D40E ; rejestr zezwole? na przerwania NMI +nmist = $D40F ; rejestr statusu przerwa? NMI + +* --------------------------------------------------------------------------------------------- +* --- HARDWARE +* --------------------------------------------------------------------------------------------- + +nmivec = $FFFA ; wektor przerwania NMI +resetvec= $FFFC ; wektor przerwania RESET +irqvec = $FFFE ; wektor przerwania IRQ + + opt l+ diff --git a/art/DM_logo_src/digital_melody_logo.pmf b/art/DM_logo_src/digital_melody_logo.pmf new file mode 100644 index 0000000..5742cf7 --- /dev/null +++ b/art/DM_logo_src/digital_melody_logo.pmf @@ -0,0 +1,466 @@ +// Player-Missile Fade +// v2.5 (26.07.2010 - 12.08.2013) + + .ifndef pmg +pmg = $0000 + eif + +mapBits = pmg+$100 + + ert 0 + +// ----------------------------------------------------------- + +.local fade_chars + + color + +cont ldx #0 + ldy #0 + + ift FADECHR = 1 + box #WIDTH #HEIGHT + eli FADECHR = 2 + random + eli FADECHR = 3 + left_right + eli FADECHR = 4 + plasma + eif + +wait lda:cmp:req cloc + rts + +.proc color (.byte a) .reg + beq color0 + +color1 mva #{lda $ffff,y} plot.src + rts + +color0 mva #{bit $ffff} plot.src + rts +.endp + +// ----------------------------------------------------------- + + ift FADECHR = 4 +.proc plasma + +loop mwa #hmap src + + ldx #HEIGHT-1 +lpy + ldy #WIDTH-1 + +lpx lda $ffff,y +src equ *-2 + cmp #0 +hmax equ *-1 + sne + + jsr plot + + dey + bpl lpx + + adw src #48 + + dex + bpl lpy + + jsr wait + +incdec inc hmax + lda hmax + bmi stop_p + cmp #$3f+1 + bcs stop_m + + jmp loop + +stop_p lda #{inc*} + dta {bit*} +stop_m lda #{dec*} + sta incdec + rts + +hmap .he 28 2E 33 39 3F 3B 35 2F 29 24 1F 1A 16 12 0F 0B 09 07 05 05 04 05 06 07 09 0C 0F 12 16 1B 1F 24 + .he 29 2E 33 38 3C 3F 3B 38 35 34 33 33 34 36 38 3B 2D 33 39 3F 3A 34 2E 28 23 1E 18 14 0F 0B 08 05 + .he 03 01 00 00 00 00 01 02 04 07 0A 0E 13 18 1C 21 26 2C 32 37 3B 3F 3B 37 34 33 32 32 33 35 37 39 + .he 33 39 3F 3B 34 2E 28 23 1D 18 12 0E 0A 06 02 00 01 04 05 05 05 04 03 01 01 03 07 0B 0F 14 1A 1F + .he 25 2A 30 35 3B 3F 3A 37 33 32 30 31 32 33 35 38 38 3E 3B 35 2F 29 23 1D 18 12 0D 09 05 01 02 05 + .he 07 09 0A 0A 0A 09 07 05 03 00 03 08 0C 11 16 1C 23 28 2E 34 3A 3F 3A 36 33 30 2F 2F 30 32 34 37 + .he 3D 3D 37 30 2B 24 1F 19 13 0E 09 03 00 03 06 09 0B 0D 0E 0E 0E 0D 0B 09 06 02 00 05 09 0F 14 1A + .he 20 26 2D 33 3A 3E 3B 37 33 31 30 2F 30 32 34 37 3E 39 32 2C 26 21 1A 15 0F 09 05 00 04 07 0A 0C + .he 0F 10 11 11 11 10 0E 0C 09 05 01 02 07 0C 11 18 1E 24 2B 31 38 3E 3C 38 34 31 2F 30 30 32 34 37 + .he 3B 35 2F 29 23 1D 17 12 0C 07 02 02 06 0A 0C 0F 11 13 14 14 13 12 11 0E 0B 08 04 00 05 0A 10 15 + .he 1B 22 29 2F 35 3B 3D 39 35 32 31 30 31 34 36 38 38 32 2C 27 20 1A 15 0F 09 04 00 05 09 0C 0F 12 + .he 13 15 16 16 15 14 13 10 0D 0A 06 02 02 08 0D 14 1A 20 26 2D 33 39 3E 3C 37 35 33 33 34 35 37 39 + .he 35 2F 2A 24 1E 18 13 0D 08 03 02 06 09 0D 10 13 15 16 17 17 16 15 14 12 0F 0B 07 03 01 06 0C 11 + .he 17 1D 24 2A 30 36 3C 3F 3C 38 37 37 36 38 39 3C 34 2E 28 23 1D 17 11 0C 07 02 02 07 0A 0D 11 13 + .he 15 16 17 17 17 16 14 12 0F 0C 08 04 00 04 0A 10 15 1B 21 27 2D 33 38 3C 3F 3C 3B 3A 3A 3B 3D 3E + .he 32 2D 28 22 1C 16 11 0C 07 02 02 06 0A 0D 10 13 14 16 17 17 16 15 14 12 0F 0C 09 05 00 04 08 0E + .he 13 19 1F 24 2A 30 34 38 3C 3E 3F 3E 3E 3F 3F 3E 32 2D 28 22 1D 17 12 0D 08 03 01 04 09 0C 10 11 + .he 13 15 15 15 15 15 13 11 0F 0C 09 04 01 03 07 0D 12 17 1C 22 26 2B 30 34 37 39 3C 3D 3D 3C 3C 3A + .he 33 2E 28 23 1E 19 13 0E 09 04 00 03 07 0A 0D 10 12 13 13 13 14 13 11 10 0D 0A 07 04 00 02 07 0C + .he 10 15 19 1F 23 28 2C 2F 33 35 37 38 38 38 38 37 33 2F 2A 24 20 1A 15 10 0B 07 03 01 05 08 0B 0D + .he 0E 0F 11 11 11 10 0F 0E 0B 09 07 03 00 03 07 0B 0F 14 18 1C 20 24 28 2B 2E 31 32 33 34 34 34 33 + .he 35 30 2C 27 22 1C 18 13 0E 0A 06 02 01 04 07 09 0B 0C 0D 0E 0E 0D 0C 0A 09 07 04 01 00 04 07 0B + .he 0E 12 16 1A 1E 21 24 27 2A 2C 2E 2F 30 30 30 30 36 33 2E 2A 25 20 1B 17 13 0E 0A 06 02 00 03 04 + .he 06 08 09 09 09 09 08 07 06 04 02 00 01 05 08 0B 0E 11 14 18 1B 1E 21 23 26 28 2A 2B 2C 2C 2C 2C + .he 39 35 32 2D 29 24 20 1B 17 12 0E 0A 07 04 02 00 02 03 04 05 05 04 04 03 02 00 00 02 04 07 09 0B + .he 0E 10 13 16 19 1B 1E 20 23 24 26 27 28 29 29 29 3C 39 35 31 2D 29 24 20 1C 17 13 10 0D 0A 07 05 + .he 03 02 01 00 00 00 00 01 01 02 04 05 06 08 0A 0C 0E 11 13 15 17 1A 1B 1E 1F 21 23 24 24 25 26 26 + .he 3F 3D 39 36 31 2E 29 25 21 1D 19 16 12 0F 0C 0A 09 08 06 05 05 05 06 06 07 07 08 09 0A 0B 0C 0E + .he 0F 11 12 14 16 18 19 1B 1D 1E 20 20 22 22 23 24 3C 3E 3E 3A 37 33 2F 2B 27 23 1F 1C 19 16 13 11 + .he 0F 0E 0D 0C 0C 0B 0B 0C 0C 0C 0D 0D 0D 0E 0F 0F 10 11 12 14 15 16 18 19 1B 1C 1D 1E 1F 20 21 21 + .he 37 3A 3C 3F 3C 38 34 30 2D 29 25 22 1F 1C 1A 18 15 15 13 12 12 12 12 12 12 12 12 12 11 12 11 11 + .he 12 12 13 14 15 15 16 18 19 1A 1B 1C 1D 1E 1E 20 33 35 37 3A 3D 3E 3B 37 33 2F 2C 28 25 23 20 1E + .he 1D 1B 1A 19 19 19 18 18 18 17 17 16 16 15 15 14 13 13 14 14 14 15 15 16 18 18 19 1A 1B 1D 1D 1F + .he 2E 30 32 35 37 3B 3E 3D 39 35 32 2F 2C 29 27 25 23 22 21 21 20 1F 1F 1F 1E 1D 1D 1C 1A 19 17 17 + .he 16 15 15 14 14 14 15 15 16 17 18 19 1A 1B 1C 1D 2A 2B 2D 2F 31 35 38 3C 3F 3C 38 35 32 2F 2D 2B + .he 2A 29 28 27 27 26 26 25 24 23 22 20 1E 1D 1B 19 18 16 16 15 15 15 15 15 15 16 17 18 19 1B 1B 1C + .he 26 27 28 29 2C 2F 32 36 3A 3D 3F 3B 38 36 33 31 31 2F 2E 2E 2D 2C 2D 2B 2B 2A 28 26 24 21 1E 1C + .he 1A 19 17 16 15 15 15 15 15 16 17 18 19 1A 1B 1D 22 22 23 25 26 29 2D 30 34 37 3B 3E 3E 3B 39 37 + .he 36 35 34 34 34 33 32 31 30 2F 2C 2A 28 24 22 1F 1D 1A 18 17 17 16 15 15 15 16 17 18 19 1A 1C 1D + .he 1E 1E 1E 1F 21 24 28 2B 2F 32 36 39 3C 3E 3E 3D 3C 3B 3A 3A 39 39 38 36 36 34 31 2E 2B 28 25 22 + .he 1F 1C 1A 19 17 17 16 16 16 17 17 18 1A 1B 1C 1E 1B 1B 1B 1B 1E 20 23 27 2A 2E 31 35 38 3A 3C 3E + .he 3F 3F 3F 3F 3D 3D 3C 3B 39 38 35 32 2E 2A 27 24 21 1E 1C 1A 19 18 18 17 18 18 19 19 1B 1C 1E 1F + .he 19 18 17 19 1A 1D 20 23 27 2A 2E 31 34 36 39 3A 3A 3C 3C 3D 3D 3E 3F 3E 3D 3A 37 33 31 2D 29 26 + .he 22 20 1E 1C 1A 1A 19 18 19 19 1A 1B 1C 1D 1F 21 18 16 16 17 18 1B 1D 21 25 28 2B 2F 31 34 35 37 + .he 38 39 39 3A 3B 3C 3E 3F 3E 3C 39 35 32 2E 2B 27 24 21 1F 1E 1C 1B 1A 1A 1A 1B 1C 1D 1E 1F 22 24 + +.endp + eif + +// ----------------------------------------------------------- + + ift FADECHR = 3 +.proc left_right + + mva #WIDTH/2 cnt + + mva #0 x0 + mva #WIDTH-1 x1 + +loop ldy #0 +x0 equ *-1 + jsr column + + ldy #0 +x1 equ *-1 + jsr column + + :2 inc x0 + :2 dec x1 + + dec cnt + bne loop + rts + +column ldx #HEIGHT-1 +draw jsr plot + dex + bpl draw + jmp wait + +cnt brk + +.endp + eif + +// ----------------------------------------------------------- + + ift FADECHR = 2 +.proc random + + mwa #0 cnt + +loop lda $d20a ; y + and #$f + cmp #15 + bcs loop + asl @ + sta py + + :2 asl @ + sta bmap + +ret lda $d20a ; x + lsr @ + and #$1f + cmp #WIDTH/2 + bcs ret + asl @ + sta px + + :3 lsr @ + tax + + lda px + and #7 + tay + + jsr mapByte + and mask,y + bne loop + + jsr mapByte + ora mask,y + + mvy #{sta $ffff,x} mapByte + jsr mapByte + mvy #{lda $ffff,x} mapByte + + ldy #0 +px equ *-1 + ldx #0 +py equ *-1 + + jsr plot + iny + jsr plot + inx + jsr plot + dey + jsr plot + + inw cnt + + cpw cnt #(WIDTH/2)*15 + jne loop + + ldx #$7f + lda #0 + sta:rpl mapBits,x- + +mapByte lda mapBits,x +bmap equ *-2 + rts + +mask dta $80,$40,$20,$10,$08,$04,$02,$01 + +cnt dta a(0) +.endp + eif + +// ----------------------------------------------------------- + + ift FADECHR = 1 +.proc box (.byte width, height) .var + +loop mva width w + dec w +l0 jsr plot + iny + dec w + bne l0 + + mva height h + dec h +l1 jsr plot + inx + dec h + bne l1 + + mva width w + dec w +l2 jsr plot + dey + dec w + bne l2 + + mva height h + dec h +l3 jsr plot + dex + dec h + bne l3 + + :2 dec width + :2 dec height + + inx + iny + + jsr wait + + cpy #15 + bne loop + + rts + +w brk +h brk + +width brk +height brk + +.endp + eif + +// ----------------------------------------------------------- + +.proc movfil (.word fadr, fhlp, fcnt .byte fill+1) .var + + sta fill_+1 + + LDY #0 + LDX fcnt+1 + BEQ MD2 +MD1 LDA (fadr),y ; move the remaining bytes + STA (fhlp),y +fill lda #0 + sta (fadr),y + INY + BNE MD1 + INC fadr+1 + INC fhlp+1 + DEX + BNE MD1 +MD2 LDX fcnt + BEQ MD4 +MD3 LDA (fadr),y ; move the remaining bytes + STA (fhlp),y +fill_ lda #0 + sta (fadr),y + INY + DEX + BNE MD3 +MD4 RTS + +.endp + +init movfil #scr #scrn #WIDTH*HEIGHT #SCHR + + ldy #0 + tya +pmgClr sta pmg+$300,y + sta pmg+$400,y + sta pmg+$500,y + sta pmg+$600,y + sta pmg+$700,y + iny + bne pmgClr + rts + +// ----------------------------------------------------------- + +.proc plot (.byte x,y) .reg + + stx rx ; Y char position + sty ry ; X char position + + mva lmul,x fadr + mva hmul,x fadr+1 + + lda fadr + add scrn +_sta1 sta src+2 + + adw fadr #scr dst+1 + + lda #SCHR + +src lda $ffff,y +dst sta $ffff,y + + jsr pmg_plot + + ldx #0 +rx equ *-1 + ldy #0 +ry equ *-1 + + rts + +.local pmg_plot + + mva lcol,y fcnt + mva hcol,y fcnt+1 + + txa + asl @ + tay + + asl @ + asl @ + add #8 + tax + + lda (fcnt),y + sta fadr + iny + lda (fcnt),y + sta fadr+1 + + ldy #0 + +loop lda (fadr),y +src equ *-2 + sta tmp + + beq stop + + jmi _mis +p0 asl tmp + jmi _pl0 +p1 asl tmp + jmi _pl1 +p2 asl tmp + jmi _pl2 +p3 asl tmp + jmi _pl3 + +stop rts + +tmp brk + +_mis @plot $300 + jmp p0 + +_pl0 @plot $400 + jmp p1 + +_pl1 @plot $500 + jmp p2 + +_pl2 @plot $600 + jmp p3 + +_pl3 @plot $700 + rts + +.macro @plot (player) + .rept 8 + iny + lda pmg+%%player+#,x + eor (fadr),y + sta pmg+%%player+#,x + .endr +.endm + +.endl + +lcol :WIDTH dta l(col%%1) +hcol :WIDTH dta h(col%%1) + + .rept WIDTH,# +col%%1 dta a(c%%1r0),a(c%%1r1),a(c%%1r2),a(c%%1r3),a(c%%1r4) + dta a(c%%1r5),a(c%%1r6),a(c%%1r7),a(c%%1r8),a(c%%1r9) + dta a(c%%1r10),a(c%%1r11),a(c%%1r12),a(c%%1r13),a(c%%1r14) + dta a(c%%1r15),a(c%%1r16),a(c%%1r17),a(c%%1r18),a(c%%1r19) + dta a(c%%1r20),a(c%%1r21),a(c%%1r22),a(c%%1r23),a(c%%1r24) + dta a(c%%1r25),a(c%%1r26),a(c%%1r27),a(c%%1r28),a(c%%1r29) + .endr + +lmul :HEIGHT dta l(#*WIDTH) +hmul :HEIGHT dta h(#*WIDTH) +.endp + +.endl + +scrn .ds WIDTH*HEIGHT diff --git a/art/DM_logo_src/digital_melody_logo.scr b/art/DM_logo_src/digital_melody_logo.scr new file mode 100644 index 0000000000000000000000000000000000000000..79eea16a5ac00ba848b16bffc2f84affcfde2cbd GIT binary patch literal 1200 zcmchT=~BZm420$N5hqSUX@OF%LJPFq_xryZ5+P&SaT)(8D4y8zd|Itcw6#zwPimEm z8PL^hO=QfvRxW3))LKiVwfupuQqDgkhcm`nsRp!`T`6Of5`U|a%gKb@l)XpE)}3`s z4kzxSoBoCRJ$lULV#Rh&aD_*SiV!Nex{)-ci~!GH*&;B?i<4hCAHKPrOk9B&Lc-jxv#fi=e&5B8im`y tC0hK$)xr31a&$a7IX#=6k1uBP%d6|f^5*vL{^9ZI`Q`QP{o@Zzd;->f3Vr|p literal 0 HcmV?d00001 diff --git a/art/digital_melody_logo.xex b/art/digital_melody_logo.xex deleted file mode 100644 index 834c26cd0bf02ac35e6acc005b3de42986b512a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2572 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�^t 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