From f2ab52c0ae40932a9aac81b9a8f0e0638e194a3f Mon Sep 17 00:00:00 2001 From: mooz Date: Mon, 19 Nov 2018 23:16:33 +0100 Subject: [PATCH] Added Plogue uPD1771C Tester by David Viens (@plgDavid). --- samples/scv_plogue_tester.l65 | 498 ++++++++++++++++++++++++++++++++++ 1 file changed, 498 insertions(+) create mode 100644 samples/scv_plogue_tester.l65 diff --git a/samples/scv_plogue_tester.l65 b/samples/scv_plogue_tester.l65 new file mode 100644 index 0000000..1135397 --- /dev/null +++ b/samples/scv_plogue_tester.l65 @@ -0,0 +1,498 @@ +---------------------------------------------------------------- +-- Plogue uPD1771C Tester +-- BY David Viens january 2010 chipsounds R&D +-- (from Hello World! Program Ver 1.1 by) Programmed By Enri +-- haxored to emit 7801 instructions using +-- Macro Assembler AS V1.42's 7810 mode +-- http://john.ccac.rwth-aachen.de:8000/as +-- Converted to l65 +---------------------------------------------------------------- + +require 'scv' +location(0x8000, 0x9fff) +section{"rom", org=0x8000} + dc.b 'H' -- Headder + +-- 0FF8X seems reserved, but not FF9X +local PARAMS = 0xFF90 +local ACTIVE_PARAM = 0xFF9A +local PLAYING = 0xFF9B + +------------------------- +-- Clear Text All Area -- +------------------------- + calt 0x8c -- bios function!!! + +------------- +-- Set VDC -- +------------- + lxi hl,VDC_DATA + lxi de,0x3400 + mvi c,0x03 + block + +--------------------- +-- Set INITIAL RAM -- +--------------------- + lxi hl,INITIAL_RAM + lxi de,PARAMS + mvi c,0x0F + block + +-------------------------------------------------------------- +----------------- END INITIALISATION POUTINE ----------------- +-------------------------------------------------------------- + +------------------------- +-- Print Screen Format -- +------------------------- + lxi hl,DISPLAY_DATA + lxi de,0x3040 -- Text RAM Address + lxi bc,0x0180 +@LOOP0 + block + dcr b + jr LOOP0 + +-------------------------------------------------------------- +------------------------- MAIN LOOP ------------------------- +-------------------------------------------------------------- +@LOOPN + -- reposition pointer to current param + lxi hl,PARAMS + mov b,(ACTIVE_PARAM) + dcx hl +@POSITIONLOOP + inx hl + dcr b + jmp POSITIONLOOP + + + lxi de,0x3090 + -- SLEEP before note + mvi c,0x10 -- wait 1 second of vblanks + call SLEEPFUNC + + + mvi a,0xFD -- we want to store that into PA so that portB can be later scanned i guess like the vic/c64 kb + mov pa,a + mov a,pb -- see which are closed upon return + + oni a,2 + jr RIGHT_DOWN + jr RIGHT_END +@RIGHT_DOWN + ldax (hl) + adi a,1 + stax (hl) + + -- if playing replay patter + mov a,(PLAYING) + eqi a,1 + jmp ALL_DONE + -- fake not already playing + mvi a,0 + mov (PLAYING),a -- ON + call PLAY_PATTERN + jmp ALL_DONE + +@RIGHT_END + + oni a,1 + jr DOWN_DOWN + jr DOWN_END +@DOWN_DOWN + mov a,(ACTIVE_PARAM) + adi a,1 + mov (ACTIVE_PARAM),a + jmp ALL_DONE +@DOWN_END + + mvi a,0xFE + mov pa,a -- fill port with voltages + mov a,pb -- see which are closed upon return + + oni a,1 + jr LEFT_DOWN + jr LEFT_END +@LEFT_DOWN + ldax (hl) + sui a,1 + stax (hl) + + -- if playing replay patter + mov a,(PLAYING) + eqi a,1 + jmp ALL_DONE + -- fake not already playing + mvi a,0 + mov (PLAYING),a -- OFF + call PLAY_PATTERN + jmp ALL_DONE +@LEFT_END + + oni a,2 + jr UP_DOWN + jr UP_END +@UP_DOWN + mov a,(ACTIVE_PARAM) + sui a,1 + mov (ACTIVE_PARAM),a + jmp ALL_DONE +@UP_END + + oni a,4 + jr BUTTON_DOWN + jr BUTTON_UP +@BUTTON_DOWN + call PLAY_PATTERN + jmp ALL_DONE +@BUTTON_UP + call STOP_PATTERN + jr BUTTON_END +@BUTTON_END + +@ALL_DONE + + -- check bounds on active param + mov a,(ACTIVE_PARAM) + lti a,0x0A + jr ACT_GREATER + jr ACT_DONE +@ACT_GREATER + mvi a,0x00 + mov (ACTIVE_PARAM),a + jr ACT_DONE +@ACT_DONE + + -- print where we at! + call DISPLAY_LOOP + + jmp LOOPN + +------------------------------------------------------------------------- +-- Display init data +------------------------------------------------------------------------- +@VDC_DATA + dc.b 0xC0,0x00,0x00,0xF1 -- 0F1 -> black + +------------------------------------------------------------------------- +-- lame sleep (with C param) +------------------------------------------------------------------------- +section{"SLEEPFUNC", org=0x8100} +-- sleep the amount of time depending on C + push bc +@SLOOP + mvi b,0xff +@SLEEP0 + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + dcr b + jr SLEEP0 + dcr c + jr SLOOP + pop bc + ret + +------------------------------------------------------------------------- +-- wait on VBLANK +------------------------------------------------------------------------- +section{"WVBLANK", org=0x8200} + skit f2 -- wait until acknowledged + jr WVBLANK + ret + +------------------------------------------------------------------------- +-- wait on D1771g (wait until INT1=1) +------------------------------------------------------------------------- +section{"WD1771G", org=0x8220} + skit f1 + jr WD1771G + ret + +------------------------------------------------------------------------- +-- Print ONE UINT8_T on screen as HEX (two screen chars printed) +-- +-- A should contain the hex value to print (A returns unchanged) +-- D should contain the screen value to dump the high part (D returns unchanged) +-- V is thrashed (used as temporary val) +------------------------------------------------------------------------- +section{"PRINT_HEX", org=0x8240} + mvi v,0 -- trick to do V=A + add v,a -- trick to do V=A + + ani a,0xF0 -- a = a & 0x0f; + clc -- clear carry so not to fuck up the following right shifts + rlr a -- + rlr a -- + rlr a -- + rlr a -- ok we got the HEX value for the up 4bits + + gti a,0x09 + jr HIGH_GREATER + jr HIGH_LOWER +@HIGH_GREATER + adi a,0x30 -- a+='0' (ascii) + jr HIGH_DONE +@HIGH_LOWER + adi a,0x37 -- a+=('A'-10) (ascii) + jr HIGH_DONE +@HIGH_DONE + + staxi (de) -- + + mvi a,0 -- trick to do A=V + add a,v -- trick to do A=V + ani a,0x0F -- a = a & 0x0f + + gti a,0x09 + jr LOW_GREATER + jr LOW_LOWER +@LOW_GREATER + adi a,0x30 -- a+='0' (ascii) + jr LOW_DONE +@LOW_LOWER + adi a,0x37 -- a+=('A'-10) (ascii) + jr LOW_DONE +@LOW_DONE + + staxd (de) -- + mvi a,0 -- trick to do A=V + add a,v -- trick to do A=V + ret + +------------------------------------------------------------------------- +-- Prints all current param values +------------------------------------------------------------------------- +section{"DISPLAY_LOOP", org=0x8280} + mvi b,0x0B + lxi de,0x3090 + lxi hl,PARAMS +@DLOOP + + -- if b==ACTIVE_PARAM show arrow + -- else show space + mvi a,0x0B + mov c,(ACTIVE_PARAM) + sub a,c + + eqa a,b + jr NOCURSOR + mvi a,0x1C + stax (de) + jr CURSDONE +@NOCURSOR + mvi a,0x20 + stax (de) +@CURSDONE + -- print all ram + ldaxi (hl) + -- increase D pos to display in hex + inx de + inx de + inx de + call PRINT_HEX + dcx de + dcx de + dcx de + + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + inx de + + dcr b + jmp DLOOP + ret + +------------------------------------------------------------------------- +-- Stop current pattern +------------------------------------------------------------------------- +section{"STOP_PATTERN", org=0x82d0} + -- if (!playing) return; + mov a,(PLAYING) + eqi a,1 + jr STOP_DONE + + mvi a,0 + mov (PLAYING),a -- OFF + + di + lxi hl,0x3600 -- SOUND REGISTER in H + call WVBLANK -- cwait on intf2 + skit f1 + nop + + mvix (hl),0x00 -- note OFF + + ei + +@STOP_DONE + ret + +------------------------------------------------------------------------- +-- Plays current pattern +-- Start with beep please +------------------------------------------------------------------------- +section{"PLAY_PATTERN", org=0x82f0} + mov a,(PLAYING) + eqi a,0 + jmp PLAY_DONE + + -- setting variable true! + mvi a,1 + mov (PLAYING),a -- ON + + lxi de,PARAMS + lxi hl,0x3600 -- SOUND REGISTER in H + + + ldaxi (de) + eqi a,1 + jmp PLAY_TONE + jmp PLAY_NOISE + +@PLAY_TONE + ------------------------ Tone Start ------------------------ + di + call WVBLANK + skit f1 + nop + -- instrument params start + mvi a,2 -- tone! + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WVBLANK -- cwait on intf2 + -- instrument params end + ei + jmp PLAY_DONE + +@PLAY_NOISE + ------------------------ Tone Start ------------------------ + di + call WVBLANK -- cwait on intf2 + skit f1 + nop + -- instrument params start + mvi a,1 -- NOISE + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WD1771G -- cwait on intf1 + ldaxi (de) + stax (hl) + call WVBLANK -- cwait on intf2 + -- instrument params end + ei + jmp PLAY_DONE + +@PLAY_DONE + ret + +------------------------------------------------------------------------- +-- Message Data1 +-- this version has left+audio changes working +------------------------------------------------------------------------- +@DISPLAY_DATA + dc.b " Plogue uPD1771C Tester " + dc.b " v0.0018 " + dc.b " Param[0]: ( ) " + dc.b " Param[1]: ( ) " + dc.b " Param[2]: ( ) " + dc.b " Param[3]: ( ) " + dc.b " Param[4]: ( ) " + dc.b " Param[5]: ( ) " + dc.b " Param[6]: ( ) " + dc.b " Param[7]: ( ) " + dc.b " Param[8]: ( ) " + dc.b " Param[9]: ( ) " + + -- go to [FF90;FF9F] +@INITIAL_RAM + -- params + dc.b 0x02 + dc.b 0x80 + dc.b 0xFF + dc.b 0x1F + + dc.b 0xAB + dc.b 0xFE + dc.b 0xCD + dc.b 0xDC + dc.b 0x45 + dc.b 0x01 + + dc.b 0x00 -- FF9A curent param + dc.b 0x00 -- FF9B BOOL note on + dc.b 0x83 -- misc + dc.b 0x39 -- misc + dc.b 0x44 -- misc + dc.b 0x36 -- misc + +writebin(filename..'.bin', genbin(0xff))