Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Using ZXbasic to add page banked IM music
#1
Hi,

As a small challange I wanted to see if I could add music to games written with ADG by Jonathan Caudwell. ADG games usually take around 30k of memory starting from around 32000 so this leaves no room for music and playback.

My idea was that I would swap in bank 4 (@49152) and set up my music and then an IM routine at 25500. The IM routine swaps to bank 4, plays a frame of music and swaps the bank back to 0 and allows the game to continue. Here's the code I came up with (the music routine and data have been compressed with zx7 to take up less space)

An working example can be seen here with : http://torinak.com/qaop#128#l=http://zxbasic.uk/uploads/monty_tls.z80


Code:
#include <memcopy.bas> ' REM IM music for ADG v1 ' monty border 0 paper 0 ink 6 cls ASM di ; disable intsd LD A,(23388) AND 248 OR 4 ; select bank 4 LD BC,32765 LD (23388),A OUT (C),A EI END ASM ' the playsoutine expects the music to be at 51310, so lets copy the music there zx7Unpack(@music, 51310) ' The play routine expects to be at 49152, so lets copy it there zx7Unpack(@ayplay, 49152) ' This is routine that will be called every frame, lets copy it to its correct location memcopy(@Ints, $6060, 60) ' we need to init our play routine, so call it randomize usr 49152 randomize USR @IMStart ' Start ADG game 'randomize usr 32000 END ayplay: asm incbin "vt49152.bin.zx7" END asm music: asm incbin "intro.pt3.zx7" END asm musicend: Ints: asm di ; disable interrupts push af ; save all std regs push bc push de push hl push ix push iy ex af, af' ; and shadow af push af ; swap to bank 4 LD A,(23388) ; load a with previos port value AND 248 OR 4 ; bank 4 LD BC,32765 LD (23388),A OUT (C),A call 49157 ; play the current tune ;swap back to bank 0 LD A,(23388) AND 248 OR 0 LD BC,32765 LD (23388),A OUT (C),A pop af ex af, af' ; restore af pop iy pop ix ; restore ix & iy pop hl pop de pop bc pop af ; restore all std regs ei ; enable interrupts jp 56 END asm IMStart: asm DI ; swap to bank 4 before IM start LD A,(23388) AND 248 OR 4 LD BC,32765 LD (23388),A OUT (C),A ; this code creates a 256 byte vector table at $FE00, then sets IM2 ld hl, $5e00 ld de, $5e01 ld bc, 256 ld a, h ld i, a ld a, $60 ld (hl), a ldir im 2 ; now swap back to 0 LD A,(23388) AND 248 OR 0 LD BC,32765 LD (23388),A OUT (C),A ei ret END asm IMOff: ASM DI IM 1 EI RET END ASM
Reply
#2
OMG! I overlooked this msg!! Confusedhock:
This is awesome, and I actually thinking of using it. :!:
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)