; SoundFinder ; Version 0.90 ; Copyright (C) 2006 Mark Guttenbrunner ;-------------------------------------------------------------------- cpu 8048 org 400h jmp start ; RESET $400 jmp intr ; interrupt $402 -> my own interrupt start ;--------------------------------------------------------- ; system init ;--------------------------------------------------------- en i ; interrupts off call 00F1h ; reset the O2 call extramInit ; init Extram orl p1,#00010100b ; vdc on anl p1,#11110111b mov r0,#0A0h mov a,#00000000b ; vdc off movx @r0,a mov a,#00000000b mov r1,#0A3h movx @r1,a ; screen color black loop ;------------------------------------------------------------ ; do all the work here (get joysticks and calculate positions) ;------------------------------------------------------------ ;-------------------------------------- ; setup extram access for calculations ;-------------------------------------- orl p1,#00001100b ; extram on anl p1,#10101111b Call CalcSound ; Calc DisplayDigits from Memory Locations mov r0,#070h mov r6,#000h call CalcDisplayDigits mov r0,#071h mov r6,#010h call CalcDisplayDigits mov r0,#072h mov r6,#020h call CalcDisplayDigits mov r0,#073h mov r6,#030h call CalcDisplayDigits ;--------------------------------------------------------- ; wait for VSYNC ;--------------------------------------------------------- waitForVSYNC jf1 VSYNC jmp waitForVSYNC VSYNC clr f1 ;--------------------------------------------------------------- ; draw the characters ;--------------------------------------------------------------- ;------------------------- ; setup vdc, extram, copy ;------------------------- orl p1,#01100100b ; extram on, copy on, vdc on, keyboard off anl p1,#11100111b mov r0,#0A0h clr a ; vdc off movx @r0,a mov r0,#3Eh mov a,@r0 jz NoPlaySound clr a mov @r0,a call PlaySound NoPlaySound call DrawChars mov r0,#073h movx a,@r0 cpl a mov r4,#String_Empty & 0ffh; Position of Chars jb4 noNoiseSet mov r4,#String_Noise & 0ffh; Position of Chars noNoiseSet mov r0,#040h ; VDC-Register mov r1,#098h ; Y-Position mov r2,#020h ; X-Position mov r3,#007h ; Color white mov r7,#04 ; display 1 quadchar call Scrolltext mov r0,#073h movx a,@r0 cpl a mov r4,#String_983 & 0ffh; Position of Chars jb5 noShiftSet mov r4,#String_3933 & 0ffh; Position of Chars noShiftSet mov r0,#050h ; VDC-Register mov r1,#0A8h ; Y-Position mov r2,#020h ; X-Position mov r3,#007h ; Color white mov r7,#04 ; display 1 quadchar call Scrolltext mov r0,#073h movx a,@r0 cpl a mov r4,#String_Empty & 0ffh; Position of Chars jb6 noLoopSet mov r4,#String_Loop & 0ffh; Position of Chars noLoopSet mov r0,#060h ; VDC-Register mov r1,#0B8h ; Y-Position mov r2,#020h ; X-Position mov r3,#007h ; Color white mov r7,#04 ; display 1 quadchar call Scrolltext mov r0,#073h movx a,@r0 cpl a mov r4,#String_Off & 0ffh; Position of Chars jb7 noOnSet mov r4,#String_On & 0ffh; Position of Chars noOnSet mov r0,#070h ; VDC-Register mov r1,#0C8h ; Y-Position mov r2,#020h ; X-Position mov r3,#007h ; Color white mov r7,#04 ; display 1 quadchar call Scrolltext mov r0,#0A0h mov a,#00100000b ; control register: foreground objects on movx @r0,a ; turn vdc back on ;--------------------------------------------------------- ; wait until 2 x VSYNC is over before we start again ;--------------------------------------------------------- mov r7,#2 waitForVSYNC2 jf1 VSYNC2 jmp waitForVSYNC2 VSYNC2 clr f1 djnz r7,WaitForVSYNC2 jmp loop ;--------------------------------------------------------- ; PlaySound from Extram 070h ;--------------------------------------------------------- PlaySound mov r0,#0A0h clr a movx @r0,a mov r0,#0A7h mov r1,#070h mov r7,#4 FillSound movx a,@r1 movx @r0,a inc r1 inc r0 djnz r7,fillSound mov r0,#030h mov a,@r0 inc a mov @r0,a retr ;================================================================================================================ ;= Sound Calculation = ;= Stick 0: up / down Byte 1, left /right Byte 2, button up/down Byte 3 = ;= button + left / sound off ;= button + right / sound on ;= Stick 1: up = noise off ;= down = noise on ;= left = shift 0 ;= right = shift 1 ;= button+left = play once ;= button+right = loop ;= button+up/down = volume ;= ;= = ;================================================================================================================ align 256 ;--------------------------------------------------------- ; r7 = Char (0 oder 1) ;--------------------------------------------------------- calcSound mov r0,#073h movx a,@r0 ; Register AA mov r6,a mov r7,#0 mov r1,#0 call 038Fh ; read Joystick0 mov a,r7 orl a,r3 orl a,r2 mov r7,a mov a,r3 cpl a inc a mov r3,a jf0 FirePressed1 mov r0,#070h ; up/down movx a,@r0 add a,r3 movx @r0,a inc r0 ; left/right movx a,@r0 add a,r2 movx @r0,a jmp NoFire1 FirePressed1 mov r0,#072h ; up/down movx a,@r0 add a,r3 movx @r0,a mov a,r2 jz noFire1 ; no left/right anl a,#010b ; in bit 1 is now 0 (=up) or 1 (=down) rr a ; bit 1 rr a ; bit 8 mov r3,a mov a,r6 anl a,#01111111b orl a,r3 mov r6,a ; shift bit changed NoFire1 ;------------------------------------------------------ mov r1,#1 call 038Fh ; read Joystick1 mov a,r7 orl a,r3 orl a,r2 mov r7,a mov a,r3 cpl a inc a mov r3,a ; invert a mov a,r6 jf0 FirePressed2 mov a,r3 jz noNoise ; no up/down anl a,#010b ; in bit 1 is now 0 (=up) or 1 (=down) rl a ; bit 2 rl a ; bit 3 rl a ; bit 4 mov r3,a mov a,r6 anl a,#11101111b orl a,r3 mov r6,a ; noise bit changed NoNoise mov a,r2 jz noShift ; no left/right anl a,#010b ; in bit 1 is now 0 (=up) or 1 (=down) rl a ; bit 2 rl a ; bit 3 rl a ; bit 4 rl a ; bit 5 mov r3,a mov a,r6 anl a,#11011111b orl a,r3 mov r6,a ; shift bit changed NoShift jmp NoFire2 FirePressed2 mov r6,a add a,r3 anl a,#00Fh ; volume mov r5,a mov a,r6 anl a,#0F0h orl a,r5 ; set volume into AA mov r6,a ; volume changed mov a,r2 jz noFire2 ; no left/right anl a,#010b ; in bit 1 is now 0 (=up) or 1 (=down) rl a ; bit 2 rl a ; bit 3 rl a ; bit 4 rl a ; bit 5 rl a ; bit 6 mov r3,a mov a,r6 anl a,#10111111b orl a,r3 mov r6,a ; shift bit changed NoFire2 mov a,r6 mov r0,#073h movx @r0,a ; Register AA ; set a to "change" ; a mov a,r7 mov r0,#3Eh mov @r0,a retr ;------------------------------------------------- ; DrawChars: r0 VDC, r1 intram ;------------------------------------------------- DrawChars mov r0,#010h mov r1,#000h mov r7,#8 ; draw 8 chars loopWriteChar movx a,@r1 movx @r0,a ; Y Pos rr a ; calculation for Charpointer: Y / 2 -> rotate right and anl a,#01111111b ; clear highest bit cpl a ; complement and add 1 inc a ; to get a negative number mov r2,a ; R2 = -Y/2 inc r0 inc r1 movx a,@r1 movx @r0,a ; X Pos inc r0 inc r1 movx a,@r1 add a,r2 ; A-Y/2 movx @r0,a ; Charpointer Pos mov r3,#1 jnc notCarry mov r3,#0 notCarry: inc r0 inc r1 movx a,@r1 xrl a,r3 mov r2,a inc r1 movx a,@r1 rl a orl a,r2 movx @r0,a ; Color inc r0 inc r1 inc r1 inc r1 inc r1 djnz r7,loopWriteChar retr ;-------------------------------------------------------------- ; r0 = Pointer to Memory to display, r6 = BaseAdrDigits ;-------------------------------------------------------------- CalcDisplayDigits ;--- Digit 1 mov a,r6 add a,#02h ; charpoint first digit mov r1,a movx a,@r0 anl a,#00Fh ; low 8 bits call getDigitPointer mov r6,#0 jnc notCarry1 mov r6,#1 ; set carry-flag notCarry1 movx @r1,a ; write low part inc r1 mov a,r6 ; write high part movx @r1,a ;--- Digit 2 mov a,r1 ; go to next digit (+7) add a,#7 mov r1,a movx a,@r0 swap a anl a,#00Fh ; high 8 bits call getDigitPointer mov r6,#0 jnc notCarry2 mov r6,#1 ; set carry-flag notCarry2 movx @r1,a ; write low part inc r1 mov a,r6 ; write high part movx @r1,a retr getDigitPointer add a,#DigitTable & 0ffh movp a,@a rlc a ; x2 rlc a ; x4 rlc a ; x8 ret DigitTable db 0,1,2,3,4,5,6,7,8,9,32,37,35,26,18,27 ; <0-9,A-F> ;================================================================================================================ ;= = ;= Page 3: Init Data = ;= = ;================================================================================================================ align 256 ;--------------------------------------------------------- ; EXTRAM init ;--------------------------------------------------------- ;here's what we do in extram: ;each character: ´ ;char 1 00 01 02 03 04 ;char 2 08 09 0A 0B 0C ;from here digits 10 11 12 13 14 ;--------------------------------------------------------- extramInit orl p1,#00001100b ; extram on anl p1,#10101111b mov r0,#000h mov r1,#InitRamData & 0ffh mov r2,#64 loopCopy mov a,r1 movp a,@a movx @r0,a inc r0 inc r1 djnz r2,loopCopy mov r0,#070h clr a movx @r0,a inc r0 movx @r0,a inc r0 movx @r0,a inc r0 mov a,#0EFh movx @r0,a retr InitRamData db 34,110,00h,00h,004h,00h,00h,00h ; char 1 digit 2 00h db 34,102,00h,00h,004h,00h,00h,00h ; char 1 digit 1 08h db 50,110,00h,00h,004h,00h,00h,00h ; char 2 digit 2 10h db 50,102,00h,00h,004h,00h,00h,00h ; char 2 digit 1 18h db 66,110,00h,00h,004h,00h,00h,00h ; char 3 digit 2 20h db 66,102,00h,00h,004h,00h,00h,00h ; char 3 digit 1 28h db 82,110,00h,00h,007h,00h,00h,00h ; char 4 digit 2 30h db 82,102,00h,00h,007h,00h,00h,00h ; char 4 digit 1 38h ;----------------------------------------------------------------------- ; my interrupt routine -> set f1 ;----------------------------------------------------------------------- intr clr f1 ; we set only the f1-flag cpl f1 retr ;================================================================================================================ ;= = ;= Page 4: Text on Screen = ;= = ;================================================================================================================ align 256 ;------------------------------------------------------------------------------------------- ; Scrolltext: Y-Position in Scrolloffset in Scrollpointer in Register in ;------------------------------------------------------------------------------------------- Scrolltext mov a,r2 sel rb0 mov r1,a sel rb1 mov a,r0 sel rb0 mov r2,a sel rb1 loopScrollText mov a,r1 ; Ypos movx @r0,a inc r0 rr a ; calculation for Charpointer: Y / 2 -> rotate right and anl a,#01111111b ; clear highest bit cpl a ; complement and add 1 inc a ; to get a negative number mov r5,a ; R2 = -Y/2 mov a,r2 ; Xpos movx @r0,a add a,#16 mov r2,a inc r0 mov a,r4 movp a,@a rlc a ; x2 rlc a ; x4 rlc a ; x8 mov r6,#1 jnc CarryMultScroll mov r6,#0 CarryMultScroll add a,r5 ; A-Y/2 movx @r0,a ; Charpointer Pos jnc notCarryScroll mov a,r6 xrl a,#1 mov r6,a notCarryScroll: inc r4 inc r0 mov a,r3 ; Color + Charpointer rl a orl a,r6 movx @r0,a inc r0 djnz r7,loopScrollText ; fill X-Registers sel rb0 mov a,r2 inc a sel rb1 mov r0,a sel rb0 mov a,r1 sel rb1 mov r6,#2 quadsScroll mov r7,#4 charsInQuadScroll movx @r0,a inc r0 inc r0 inc r0 inc r0 djnz r7,charsInQuadScroll add a,#64 djnz r6,quadsScroll ret Logo1 db 25,23,21,45,26,12,12,12 ; "SOUND " Logo2 db 27,22,45,26,18,19,12,12 ; "FINDER " String_Empty db 12,12,12,12 ;" " String_Noise db 45,23,22,25 ;"NOIS" String_Loop db 14,23,23,15 ;"LOOP" String_983 db 9,8,3,12 ;"983" String_3933 db 3,9,3,3 ;"3933" String_On db 23,45,12,12 ;"ON" String_Off db 23,27,27,12 ;"OFF" db "Manopac 2006" end