sound chips added to pld file and added sn76489 test
This commit is contained in:
@@ -23,19 +23,25 @@ $(BUILDDIR)/bios.bin: bios.asm tape.asm $(BUILDDIR)/memory.inc
|
|||||||
basic:
|
basic:
|
||||||
$(MAKE) -C apps/basic $(or $(MAKECMDGOALS),all) --no-print-directory
|
$(MAKE) -C apps/basic $(or $(MAKECMDGOALS),all) --no-print-directory
|
||||||
|
|
||||||
|
sn76489:
|
||||||
|
$(MAKE) -C apps/sn76489 $(or $(MAKECMDGOALS),all) --no-print-directory
|
||||||
|
|
||||||
$(BUILDDIR)/memory.inc: memory.mk
|
$(BUILDDIR)/memory.inc: memory.mk
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@awk 'BEGIN { print "; Generated from rom_layout.mk; do not edit." } \
|
@awk 'BEGIN { print "; Generated from rom_layout.mk; do not edit." } \
|
||||||
/^[A-Z][A-Z0-9_]*[[:space:]]*:=[[:space:]]*/ { print $$1 " .equ " $$3 }' $< > $@
|
/^[A-Z][A-Z0-9_]*[[:space:]]*:=[[:space:]]*/ { print $$1 " .equ " $$3 }' $< > $@
|
||||||
|
|
||||||
$(BUILDDIR)/rom.bin: $(BUILDDIR)/bios.bin basic
|
$(BUILDDIR)/rom.bin: $(BUILDDIR)/bios.bin basic sn76489
|
||||||
echo "bios: $(shell wc -c < $(BUILDDIR)/bios.bin) / $$(($(BIOS_ROM_SIZE)+0))"
|
echo "bios: $(shell wc -c < $(BUILDDIR)/bios.bin) / $$(($(BIOS_ROM_SIZE)+0))"
|
||||||
echo "basic: $(shell wc -c < $(BUILDDIR)/basic.bin) / $$(($(BASIC_ROM_SIZE)+0))"
|
echo "basic: $(shell wc -c < $(BUILDDIR)/basic.bin) / $$(($(BASIC_ROM_SIZE)+0))"
|
||||||
|
echo "sn76489: $(shell wc -c < $(BUILDDIR)/sn76489.bin) / $$(($(SN76489_ROM_SIZE)+0))"
|
||||||
objcopy --pad-to=$$(($(BIOS_ROM_START)+$(BIOS_ROM_SIZE))) \
|
objcopy --pad-to=$$(($(BIOS_ROM_START)+$(BIOS_ROM_SIZE))) \
|
||||||
-I binary $(BUILDDIR)/bios.bin -O binary $(BUILDDIR)/bios_padded.bin
|
-I binary $(BUILDDIR)/bios.bin -O binary $(BUILDDIR)/bios_padded.bin
|
||||||
objcopy --pad-to=$(BASIC_ROM_SIZE) \
|
objcopy --pad-to=$(BASIC_ROM_SIZE) \
|
||||||
-I binary $(BUILDDIR)/basic.bin -O binary $(BUILDDIR)/basic_padded.bin
|
-I binary $(BUILDDIR)/basic.bin -O binary $(BUILDDIR)/basic_padded.bin
|
||||||
cat $(BUILDDIR)/bios_padded.bin $(BUILDDIR)/basic_padded.bin > $(BUILDDIR)/rom.bin
|
objcopy --pad-to=$(SN76489_ROM_SIZE) \
|
||||||
|
-I binary $(BUILDDIR)/sn76489.bin -O binary $(BUILDDIR)/sn76489_padded.bin
|
||||||
|
cat $(BUILDDIR)/bios_padded.bin $(BUILDDIR)/basic_padded.bin $(BUILDDIR)/sn76489_padded.bin > $(BUILDDIR)/rom.bin
|
||||||
|
|
||||||
|
|
||||||
.PHONY: $(TOPTARGETS) $(SUBDIRS) basic
|
.PHONY: $(TOPTARGETS) $(SUBDIRS) basic sn76489
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
.SILENT:
|
||||||
|
ASM := zasm
|
||||||
|
ASMFLAGS := -w -b
|
||||||
|
BUILDDIR := ../../build
|
||||||
|
|
||||||
|
TOPTARGETS := all clean
|
||||||
|
$(TOPTARGETS): $(SUBDIRS)
|
||||||
|
|
||||||
|
all: $(BUILDDIR) $(BUILDDIR)/sn76489.bin
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILDDIR)
|
||||||
|
|
||||||
|
$(BUILDDIR):
|
||||||
|
mkdir -p $(BUILDDIR)
|
||||||
|
|
||||||
|
$(BUILDDIR)/sn76489.bin: main.asm psglib_zasm.asm $(BUILDDIR)/memory.inc
|
||||||
|
echo '>$<'
|
||||||
|
$(ASM) $(ASMFLAGS) $< $@
|
||||||
|
|
||||||
|
.PHONY: $(TOPTARGETS) $(SUBDIRS)
|
||||||
|
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
#include "../../build/memory.inc"
|
||||||
|
#include "../../bios.inc"
|
||||||
|
#include "../../hardware.inc"
|
||||||
|
|
||||||
|
CTC_BASE .equ 020h
|
||||||
|
CTC_CHANNEL_0 .equ CTC_BASE+000h
|
||||||
|
CTC_CHANNEL_1 .equ CTC_BASE+001h
|
||||||
|
CTC_CHANNEL_2 .equ CTC_BASE+002h
|
||||||
|
CTC_CHANNEL_3 .equ CTC_BASE+003h
|
||||||
|
|
||||||
|
RAM_TOP .equ 0xbfff
|
||||||
|
; workspace variables here vv
|
||||||
|
; ------------------------ ^^
|
||||||
|
SAVED_SP .equ RAM_TOP-0x02 ; word
|
||||||
|
STACK_TOP .equ RAM_TOP-0x100
|
||||||
|
|
||||||
|
; -------------------------------------------------------
|
||||||
|
; Entry
|
||||||
|
; -------------------------------------------------------
|
||||||
|
.org SN76489_ROM_START
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
|
||||||
|
ld hl, 0
|
||||||
|
add hl, sp ; get sp
|
||||||
|
ld (SAVED_SP), hl ; save sp for later
|
||||||
|
ld hl, STACK_TOP
|
||||||
|
ld sp, hl ; use own stack
|
||||||
|
|
||||||
|
ld hl,str_header
|
||||||
|
call BIOS_PUTS
|
||||||
|
|
||||||
|
ld hl,SHARED_MEM_START+042h
|
||||||
|
ld bc, ctc_interrupt ; install own ctc isr
|
||||||
|
ld (hl), bc
|
||||||
|
|
||||||
|
di
|
||||||
|
|
||||||
|
call PSGInit ; Initialize psglib
|
||||||
|
ld a,10100111b ; interrupts enabled
|
||||||
|
; timer mode
|
||||||
|
; prescaler 256
|
||||||
|
; automatic trigger
|
||||||
|
; time constant follows
|
||||||
|
; reset
|
||||||
|
; control word
|
||||||
|
out (CTC_CHANNEL_1), a
|
||||||
|
ld a,78 ; 50Hz
|
||||||
|
out (CTC_CHANNEL_1), a
|
||||||
|
|
||||||
|
; music must be loaded from 8000
|
||||||
|
ld hl, 0x8000
|
||||||
|
call PSGPlayNoRepeat
|
||||||
|
|
||||||
|
ei
|
||||||
|
|
||||||
|
exit:
|
||||||
|
ld hl, (SAVED_SP)
|
||||||
|
ld sp, hl ; restore original stack
|
||||||
|
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
ret
|
||||||
|
|
||||||
|
; -------------------------------------------------------
|
||||||
|
; CTC CHAN 1 interrupt handler
|
||||||
|
; -------------------------------------------------------
|
||||||
|
ctc_interrupt:
|
||||||
|
push af
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
|
||||||
|
call PSGFrame
|
||||||
|
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
pop af
|
||||||
|
reti
|
||||||
|
|
||||||
|
; -------------------------------------------------------
|
||||||
|
; Strings
|
||||||
|
; -------------------------------------------------------
|
||||||
|
str_header: .db "SN76489 test",00dh,00ah,000h
|
||||||
|
|
||||||
|
#include "psglib_zasm.asm"
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -145,6 +145,7 @@ init:
|
|||||||
ei
|
ei
|
||||||
|
|
||||||
call tape_init
|
call tape_init
|
||||||
|
call psg_silence
|
||||||
|
|
||||||
; Print header message
|
; Print header message
|
||||||
ld hl,msg_header
|
ld hl,msg_header
|
||||||
@@ -272,6 +273,13 @@ release_daisy_chain:
|
|||||||
ctc_uart_init:
|
ctc_uart_init:
|
||||||
; Reset CTC channels
|
; Reset CTC channels
|
||||||
ld a,003h
|
ld a,003h
|
||||||
|
; A channel may still be waiting for a time constant after a warm boot.
|
||||||
|
; In that state the first byte is consumed as the constant, so send the
|
||||||
|
; reset control word again to guarantee the unused channel is disabled.
|
||||||
|
out (CTC_CHANNEL_0),a
|
||||||
|
out (CTC_CHANNEL_1),a
|
||||||
|
out (CTC_CHANNEL_2),a
|
||||||
|
out (CTC_CHANNEL_3),a
|
||||||
out (CTC_CHANNEL_0),a
|
out (CTC_CHANNEL_0),a
|
||||||
out (CTC_CHANNEL_1),a
|
out (CTC_CHANNEL_1),a
|
||||||
out (CTC_CHANNEL_2),a
|
out (CTC_CHANNEL_2),a
|
||||||
@@ -557,6 +565,20 @@ delay_ms:
|
|||||||
jp nz,1$ ; 10T
|
jp nz,1$ ; 10T
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; -------------------------------------------------------
|
||||||
|
; Silence all audio generators
|
||||||
|
; -------------------------------------------------------
|
||||||
|
psg_silence:
|
||||||
|
ld a,0x9f ; mute tone 0
|
||||||
|
out (SN_PORT),a
|
||||||
|
ld a,0xbf ; mute tone 1
|
||||||
|
out (SN_PORT),a
|
||||||
|
ld a,0xdf ; mute tone 2
|
||||||
|
out (SN_PORT),a
|
||||||
|
ld a,0xff ; mute noise
|
||||||
|
out (SN_PORT),a
|
||||||
|
ret
|
||||||
|
|
||||||
; -------------------------------------------------------
|
; -------------------------------------------------------
|
||||||
; Strings
|
; Strings
|
||||||
; -------------------------------------------------------
|
; -------------------------------------------------------
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ BANK_ENABLE_BIT .equ 004h
|
|||||||
BANK_MODE_CLEAR_MASK .equ 0f9h
|
BANK_MODE_CLEAR_MASK .equ 0f9h
|
||||||
|
|
||||||
TAPE_PORT .equ 018h
|
TAPE_PORT .equ 018h
|
||||||
|
SN_PORT .equ 019h
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
Name casette;
|
|
||||||
PartNo 00;
|
|
||||||
Date 2026-10-03;
|
|
||||||
Revision 01;
|
|
||||||
Designer joppe;
|
|
||||||
Company unknown;
|
|
||||||
Assembly None;
|
|
||||||
Location unknown;
|
|
||||||
Device g22v10;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
|
||||||
Constants
|
|
||||||
------------------------------------------------------------ */
|
|
||||||
|
|
||||||
ar = 'b'0;
|
|
||||||
sp = 'b'0;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
|
||||||
Pin assignments
|
|
||||||
|
|
||||||
Physical signals IOSEL, RD and WR are active-low.
|
|
||||||
Their polarity is expressed in the equations with !.
|
|
||||||
------------------------------------------------------------ */
|
|
||||||
|
|
||||||
/* inputs */
|
|
||||||
|
|
||||||
PIN 1 = CLK;
|
|
||||||
|
|
||||||
PIN 2 = A1;
|
|
||||||
PIN 3 = A2;
|
|
||||||
|
|
||||||
PIN 4 = IOSEL;
|
|
||||||
PIN 5 = RD;
|
|
||||||
PIN 6 = A0;
|
|
||||||
|
|
||||||
PIN 7 = COMP;
|
|
||||||
PIN 8 = WR;
|
|
||||||
|
|
||||||
|
|
||||||
/* data bus */
|
|
||||||
|
|
||||||
PIN 14 = D0;
|
|
||||||
PIN 15 = D1;
|
|
||||||
PIN 16 = D2;
|
|
||||||
PIN 17 = D3;
|
|
||||||
PIN 18 = D4;
|
|
||||||
PIN 19 = D5;
|
|
||||||
PIN 20 = D6;
|
|
||||||
PIN 21 = D7;
|
|
||||||
|
|
||||||
|
|
||||||
/* registered output */
|
|
||||||
|
|
||||||
PIN 22 = LED;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
|
||||||
Read register at offset 0
|
|
||||||
|
|
||||||
Conditions:
|
|
||||||
|
|
||||||
/IOSEL = 0
|
|
||||||
/RD = 0
|
|
||||||
/WR = 1
|
|
||||||
A2:A0 = 000
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
D0 = COMP
|
|
||||||
D7..D1 = 0
|
|
||||||
------------------------------------------------------------ */
|
|
||||||
|
|
||||||
D0 = COMP;
|
|
||||||
|
|
||||||
D1 = 'b'0;
|
|
||||||
D2 = 'b'0;
|
|
||||||
D3 = 'b'0;
|
|
||||||
D4 = 'b'0;
|
|
||||||
D5 = 'b'0;
|
|
||||||
D6 = 'b'0;
|
|
||||||
D7 = 'b'0;
|
|
||||||
|
|
||||||
|
|
||||||
D0.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D1.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D2.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D3.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D4.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D5.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D6.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
D7.OE =
|
|
||||||
!IOSEL
|
|
||||||
& !RD
|
|
||||||
& WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
|
||||||
Writable LED register
|
|
||||||
|
|
||||||
Write conditions:
|
|
||||||
|
|
||||||
/IOSEL = 0
|
|
||||||
/RD = 1
|
|
||||||
/WR = 0
|
|
||||||
A2:A0 = 000
|
|
||||||
|
|
||||||
During such a write:
|
|
||||||
|
|
||||||
LED.D = D0
|
|
||||||
|
|
||||||
Otherwise:
|
|
||||||
|
|
||||||
LED.D = LED
|
|
||||||
|
|
||||||
Pin 1 (CLK) clocks the registered macrocell.
|
|
||||||
------------------------------------------------------------ */
|
|
||||||
|
|
||||||
LED.D =
|
|
||||||
(
|
|
||||||
!IOSEL
|
|
||||||
& RD
|
|
||||||
& !WR
|
|
||||||
& !A2
|
|
||||||
& !A1
|
|
||||||
& !A0
|
|
||||||
& D0
|
|
||||||
)
|
|
||||||
|
|
||||||
#
|
|
||||||
|
|
||||||
(
|
|
||||||
(
|
|
||||||
IOSEL
|
|
||||||
# !RD
|
|
||||||
# WR
|
|
||||||
# A2
|
|
||||||
# A1
|
|
||||||
# A0
|
|
||||||
)
|
|
||||||
& LED
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
LED.ar = ar;
|
|
||||||
LED.sp = sp;
|
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
CUPL(WM) 5.0a Serial# MW-10400000
|
||||||
|
Device g22v10 Library DLIB-h-40-1
|
||||||
|
Created Sat Oct 17 12:42:37 2026
|
||||||
|
Name acc
|
||||||
|
Partno 00
|
||||||
|
Revision 01
|
||||||
|
Date 2026-10-11
|
||||||
|
Designer Joppe Blondel
|
||||||
|
Company unknown
|
||||||
|
Assembly unknown
|
||||||
|
Location unknown
|
||||||
|
*QP24
|
||||||
|
*QF5892
|
||||||
|
*G0
|
||||||
|
*F0
|
||||||
|
*L00416 00000000000000000000000011111111
|
||||||
|
*L00448 11111111111111111111111111111111
|
||||||
|
*L00480 11111111101110111011011110111111
|
||||||
|
*L00512 10111111110111111111111011110111
|
||||||
|
*L00544 11111111111111111111111111111111
|
||||||
|
*L00576 11101111111110111111111111111111
|
||||||
|
*L00608 11111111111111101111111111111111
|
||||||
|
*L00640 11110111111111111111111111101111
|
||||||
|
*L00672 11111111011111111111111111111111
|
||||||
|
*L00704 11110110111111111111111111111111
|
||||||
|
*L00736 11111111111111111110011111111111
|
||||||
|
*L00768 11111111111111111111111100000000
|
||||||
|
*L03648 00001111111111111111111111111111
|
||||||
|
*L03680 11111111111111111111011110111011
|
||||||
|
*L03712 10111011111101111111111111111111
|
||||||
|
*L03744 01111011101101110111111110111111
|
||||||
|
*L03776 11111111000000000000000000000000
|
||||||
|
*L04288 00000000000000000000000011111111
|
||||||
|
*L04320 11111111111111111111111111111111
|
||||||
|
*L04352 11111111011110111011011111111111
|
||||||
|
*L04384 10111111111111110000000000000000
|
||||||
|
*L04864 00000000000000000000111111111111
|
||||||
|
*L04896 11111111111111111111111111111111
|
||||||
|
*L04928 11111011101110110111011111111011
|
||||||
|
*L04960 11111111111100000000000000000000
|
||||||
|
*L05344 00000000000000000000000011111011
|
||||||
|
*L05376 10111011101110111111011111111111
|
||||||
|
*L05408 11111111111111111111111111110111
|
||||||
|
*L05440 11111111111111110000000000000000
|
||||||
|
*L05792 00000000000000000010000000001111
|
||||||
|
*L05824 01110011000000110000000000000000
|
||||||
|
*C5C1A
|
||||||
|
*46C6
|
||||||
Binary file not shown.
@@ -0,0 +1,297 @@
|
|||||||
|
|
||||||
|
*******************************************************************************
|
||||||
|
acc
|
||||||
|
*******************************************************************************
|
||||||
|
|
||||||
|
CUPL(WM) 5.0a Serial# MW-10400000
|
||||||
|
Device g22v10 Library DLIB-h-40-1
|
||||||
|
Created Sat Oct 17 12:42:37 2026
|
||||||
|
Name acc
|
||||||
|
Partno 00
|
||||||
|
Revision 01
|
||||||
|
Date 2026-10-11
|
||||||
|
Designer Joppe Blondel
|
||||||
|
Company unknown
|
||||||
|
Assembly unknown
|
||||||
|
Location unknown
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Expanded Product Terms
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
AYADDRWRITE =>
|
||||||
|
A0 & A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
AYBC1 =>
|
||||||
|
!A0 & A1 & !A2 & !IOSELN & !RDN & WRN
|
||||||
|
# A0 & A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
AYBDIR =>
|
||||||
|
A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
AYDATAREAD =>
|
||||||
|
!A0 & A1 & !A2 & !IOSELN & !RDN & WRN
|
||||||
|
|
||||||
|
AYDATAWRITE =>
|
||||||
|
!A0 & A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
COUT.d =>
|
||||||
|
!A0 & !A1 & !A2 & D0 & !IOSELN & RDN & !WRN
|
||||||
|
# COUT & IOSELN
|
||||||
|
# COUT & !RDN
|
||||||
|
# COUT & WRN
|
||||||
|
# A0 & COUT
|
||||||
|
# A1 & COUT
|
||||||
|
# A2 & COUT
|
||||||
|
|
||||||
|
COUT.ar =>
|
||||||
|
0
|
||||||
|
|
||||||
|
COUT.sp =>
|
||||||
|
0
|
||||||
|
|
||||||
|
D0 =>
|
||||||
|
COMP
|
||||||
|
|
||||||
|
D0.oe =>
|
||||||
|
!A0 & !A1 & !A2 & !IOSELN & !RDN & WRN
|
||||||
|
|
||||||
|
SNWEN =>
|
||||||
|
A0 & !A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
ar =>
|
||||||
|
0
|
||||||
|
|
||||||
|
sp =>
|
||||||
|
0
|
||||||
|
|
||||||
|
AYBC1.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
AYBDIR.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
COUT.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
SNWEN.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Symbol Table
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
Pin Variable Pterms Max Min
|
||||||
|
Pol Name Ext Pin Type Used Pterms Level
|
||||||
|
--- -------- --- --- ---- ------ ------ -----
|
||||||
|
|
||||||
|
A0 6 V - - -
|
||||||
|
A1 2 V - - -
|
||||||
|
A2 3 V - - -
|
||||||
|
AYADDRWRITE 0 I 1 - -
|
||||||
|
AYBC1 17 V 2 14 1
|
||||||
|
AYBDIR 16 V 1 12 1
|
||||||
|
AYDATAREAD 0 I 1 - -
|
||||||
|
AYDATAWRITE 0 I 1 - -
|
||||||
|
CLK 1 V - - -
|
||||||
|
COMP 7 V - - -
|
||||||
|
COUT 22 V - - -
|
||||||
|
COUT d 22 X 7 10 1
|
||||||
|
COUT ar 22 X 1 1 1
|
||||||
|
COUT sp 22 X 1 1 1
|
||||||
|
D0 14 V 1 8 1
|
||||||
|
D0 oe 14 X 1 1 1
|
||||||
|
IOSELN 4 V - - -
|
||||||
|
RDN 5 V - - -
|
||||||
|
SNWEN 15 V 1 10 1
|
||||||
|
WRN 8 V - - -
|
||||||
|
ar 0 I 1 - -
|
||||||
|
sp 0 I 1 - -
|
||||||
|
AYBC1 oe 17 D 1 1 0
|
||||||
|
AYBDIR oe 16 D 1 1 0
|
||||||
|
COUT oe 22 D 1 1 0
|
||||||
|
SNWEN oe 15 D 1 1 0
|
||||||
|
|
||||||
|
|
||||||
|
LEGEND D : default variable F : field G : group
|
||||||
|
I : intermediate variable N : node M : extended node
|
||||||
|
U : undefined V : variable X : extended variable
|
||||||
|
T : function
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Fuse Plot
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
SP
|
||||||
|
05764 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
|
||||||
|
AR
|
||||||
|
00000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
|
||||||
|
Pin #23 05808 Mode xx
|
||||||
|
00044 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00088 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00132 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00176 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00220 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00264 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00308 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00352 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00396 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #22 05810 Mode -x
|
||||||
|
00440 --------------------------------------------
|
||||||
|
00484 -----x---x---x--x----x-------x--------x-----
|
||||||
|
00528 -------x----x-------------------------------
|
||||||
|
00572 -------x---------x--------------------------
|
||||||
|
00616 -------x--------------------x---------------
|
||||||
|
00660 -------x------------x-----------------------
|
||||||
|
00704 ----x--x------------------------------------
|
||||||
|
00748 -------xx-----------------------------------
|
||||||
|
00792 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00836 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00880 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #21 05812 Mode xx
|
||||||
|
00924 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
00968 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01012 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01056 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01100 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01144 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01188 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01232 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01276 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01320 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01364 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01408 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01452 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #20 05814 Mode xx
|
||||||
|
01496 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01540 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01584 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01628 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01672 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01716 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01760 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01804 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01848 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01892 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01936 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
01980 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02024 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02068 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02112 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #19 05816 Mode xx
|
||||||
|
02156 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02200 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02244 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02288 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02332 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02376 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02420 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02464 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02508 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02552 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02596 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02640 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02684 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02728 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02772 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02816 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02860 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #18 05818 Mode xx
|
||||||
|
02904 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02948 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
02992 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03036 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03080 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03124 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03168 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03212 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03256 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03300 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03344 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03388 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03432 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03476 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03520 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03564 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03608 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #17 05820 Mode --
|
||||||
|
03652 --------------------------------------------
|
||||||
|
03696 ----x----x---x---x---x------x---------------
|
||||||
|
03740 ----x----x---x--x---x--------x--------------
|
||||||
|
03784 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03828 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03872 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03916 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
03960 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04004 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04048 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04092 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04136 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04180 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04224 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04268 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #16 05822 Mode --
|
||||||
|
04312 --------------------------------------------
|
||||||
|
04356 ----x----x---x--x------------x--------------
|
||||||
|
04400 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04444 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04488 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04532 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04576 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04620 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04664 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04708 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04752 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04796 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
04840 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #15 05824 Mode x-
|
||||||
|
04884 --------------------------------------------
|
||||||
|
04928 -----x---x---x--x---x--------x--------------
|
||||||
|
04972 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05016 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05060 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05104 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05148 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05192 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05236 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05280 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05324 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
Pin #14 05826 Mode --
|
||||||
|
05368 -----x---x---x---x---x------x---------------
|
||||||
|
05412 ------------------------x-------------------
|
||||||
|
05456 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05500 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05544 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05588 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05632 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05676 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
05720 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
|
||||||
|
|
||||||
|
LEGEND X : fuse not blown
|
||||||
|
- : fuse blown
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
Chip Diagram
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
______________
|
||||||
|
| acc |
|
||||||
|
CLK x---|1 24|---x Vcc
|
||||||
|
A1 x---|2 23|---x
|
||||||
|
A2 x---|3 22|---x COUT
|
||||||
|
IOSELN x---|4 21|---x
|
||||||
|
RDN x---|5 20|---x
|
||||||
|
A0 x---|6 19|---x
|
||||||
|
COMP x---|7 18|---x
|
||||||
|
WRN x---|8 17|---x AYBC1
|
||||||
|
x---|9 16|---x AYBDIR
|
||||||
|
x---|10 15|---x SNWEN
|
||||||
|
x---|11 14|---x D0
|
||||||
|
GND x---|12 13|---x
|
||||||
|
|______________|
|
||||||
|
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
LISTING FOR LOGIC DESCRIPTION FILE: audio_casette_card.pld Page 1
|
||||||
|
|
||||||
|
CUPL(WM): Universal Compiler for Programmable Logic
|
||||||
|
Version 5.0a Serial# MW-10400000
|
||||||
|
Copyright (c) 1983, 1998 Logical Devices, Inc.
|
||||||
|
Created Sat Oct 17 12:42:37 2026
|
||||||
|
|
||||||
|
1:Name acc;
|
||||||
|
2:PartNo 00;
|
||||||
|
3:Date 2026-10-11;
|
||||||
|
4:Revision 01;
|
||||||
|
5:Designer Joppe Blondel;
|
||||||
|
6:Company unknown;
|
||||||
|
7:Assembly unknown;
|
||||||
|
8:Location unknown;
|
||||||
|
9:Device g22v10;
|
||||||
|
10:
|
||||||
|
11:/* Constants */
|
||||||
|
12:ar = 'b'0;
|
||||||
|
13:sp = 'b'0;
|
||||||
|
14:
|
||||||
|
15:/* Pin assignments */
|
||||||
|
16:/* inputs */
|
||||||
|
17:PIN 1 = CLK;
|
||||||
|
18:PIN 2 = A1;
|
||||||
|
19:PIN 3 = A2;
|
||||||
|
20:PIN 4 = IOSELN;
|
||||||
|
21:PIN 5 = RDN;
|
||||||
|
22:PIN 6 = A0;
|
||||||
|
23:PIN 7 = COMP;
|
||||||
|
24:PIN 8 = WRN;
|
||||||
|
25:/* outputs */
|
||||||
|
26:PIN 14 = D0;
|
||||||
|
27:PIN 15 = SNWEN;
|
||||||
|
28:PIN 16 = AYBDIR;
|
||||||
|
29:PIN 17 = AYBC1;
|
||||||
|
30:PIN 22 = COUT;
|
||||||
|
31:
|
||||||
|
32:/* Read reg0 */
|
||||||
|
33:/* places comparator output on D0 when reading addr0 */
|
||||||
|
34:D0 = COMP;
|
||||||
|
35:D0.OE = !IOSELN & !RDN & WRN & !A0 & !A1 & !A2;
|
||||||
|
36:
|
||||||
|
37:/* Write reg0 */
|
||||||
|
38:/* writes D0 to casette output port */
|
||||||
|
39:/* during a write COUT.D=D0 otherwise COUT.D = COUT */
|
||||||
|
40:COUT.D = (!IOSELN & RDN & !WRN & !A0 & !A1 & !A2 & D0) #
|
||||||
|
41: ((IOSELN # !RDN # WRN # A0 # A1 # A2) & COUT);
|
||||||
|
42:COUT.ar = ar;
|
||||||
|
43:COUT.sp = sp;
|
||||||
|
44:
|
||||||
|
45:/* Write to SN76489 at addr 1 */
|
||||||
|
46:SNWEN = !(!IOSELN & RDN & !WRN & A0 & !A1 & !A2);
|
||||||
|
47:
|
||||||
|
48:/* AY-3-8910 access at addr 2 (data) addr 3 (adress) */
|
||||||
|
49:AYDATAREAD = !IOSELN & !RDN & WRN & !A0 & A1 & !A2;
|
||||||
|
50:AYDATAWRITE = !IOSELN & RDN & !WRN & !A0 & A1 & !A2;
|
||||||
|
51:AYADDRWRITE = !IOSELN & RDN & !WRN & A0 & A1 & !A2;
|
||||||
|
52:AYBDIR = AYDATAWRITE # AYADDRWRITE;
|
||||||
|
53:AYBC1 = AYDATAREAD # AYADDRWRITE;
|
||||||
|
|
||||||
|
LISTING FOR LOGIC DESCRIPTION FILE: audio_casette_card.pld Page 2
|
||||||
|
|
||||||
|
CUPL(WM): Universal Compiler for Programmable Logic
|
||||||
|
Version 5.0a Serial# MW-10400000
|
||||||
|
Copyright (c) 1983, 1998 Logical Devices, Inc.
|
||||||
|
Created Sat Oct 17 12:42:37 2026
|
||||||
|
|
||||||
|
54:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Jedec Fuse Checksum (5c1a)
|
||||||
|
Jedec Transmit Checksum (46c6)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
Name acc;
|
||||||
|
PartNo 00;
|
||||||
|
Date 2026-10-11;
|
||||||
|
Revision 01;
|
||||||
|
Designer Joppe Blondel;
|
||||||
|
Company unknown;
|
||||||
|
Assembly unknown;
|
||||||
|
Location unknown;
|
||||||
|
Device g22v10;
|
||||||
|
|
||||||
|
/* Constants */
|
||||||
|
ar = 'b'0;
|
||||||
|
sp = 'b'0;
|
||||||
|
|
||||||
|
/* Pin assignments */
|
||||||
|
/* inputs */
|
||||||
|
PIN 1 = CLK;
|
||||||
|
PIN 2 = A1;
|
||||||
|
PIN 3 = A2;
|
||||||
|
PIN 4 = IOSELN;
|
||||||
|
PIN 5 = RDN;
|
||||||
|
PIN 6 = A0;
|
||||||
|
PIN 7 = COMP;
|
||||||
|
PIN 8 = WRN;
|
||||||
|
/* outputs */
|
||||||
|
PIN 14 = D0;
|
||||||
|
PIN 15 = SNWEN;
|
||||||
|
PIN 16 = AYBDIR;
|
||||||
|
PIN 17 = AYBC1;
|
||||||
|
PIN 22 = COUT;
|
||||||
|
|
||||||
|
/* Read reg0 */
|
||||||
|
/* places comparator output on D0 when reading addr0 */
|
||||||
|
D0 = COMP;
|
||||||
|
D0.OE = !IOSELN & !RDN & WRN & !A0 & !A1 & !A2;
|
||||||
|
|
||||||
|
/* Write reg0 */
|
||||||
|
/* writes D0 to casette output port */
|
||||||
|
/* during a write COUT.D=D0 otherwise COUT.D = COUT */
|
||||||
|
COUT.D = (!IOSELN & RDN & !WRN & !A0 & !A1 & !A2 & D0) #
|
||||||
|
((IOSELN # !RDN # WRN # A0 # A1 # A2) & COUT);
|
||||||
|
COUT.ar = ar;
|
||||||
|
COUT.sp = sp;
|
||||||
|
|
||||||
|
/* Write to SN76489 at addr 1 */
|
||||||
|
SNWEN = !(!IOSELN & RDN & !WRN & A0 & !A1 & !A2);
|
||||||
|
|
||||||
|
/* AY-3-8910 access at addr 2 (data) addr 3 (adress) */
|
||||||
|
AYDATAREAD = !IOSELN & !RDN & WRN & !A0 & A1 & !A2;
|
||||||
|
AYDATAWRITE = !IOSELN & RDN & !WRN & !A0 & A1 & !A2;
|
||||||
|
AYADDRWRITE = !IOSELN & RDN & !WRN & A0 & A1 & !A2;
|
||||||
|
AYBDIR = AYDATAWRITE # AYADDRWRITE;
|
||||||
|
AYBC1 = AYDATAREAD # AYADDRWRITE;
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
%SIGNAL
|
||||||
|
PIN 6 = A0
|
||||||
|
PIN 2 = A1
|
||||||
|
PIN 3 = A2
|
||||||
|
PIN 17 = AYBC1
|
||||||
|
PIN 16 = AYBDIR
|
||||||
|
PIN 1 = CLK
|
||||||
|
PIN 7 = COMP
|
||||||
|
PIN 22 = COUT
|
||||||
|
PIN 14 = D0
|
||||||
|
PIN 4 = IOSELN
|
||||||
|
PIN 5 = RDN
|
||||||
|
PIN 15 = SNWEN
|
||||||
|
PIN 8 = WRN
|
||||||
|
%END
|
||||||
|
|
||||||
|
%FIELD
|
||||||
|
%END
|
||||||
|
|
||||||
|
%EQUATION
|
||||||
|
AYADDRWRITE =>
|
||||||
|
A0 & A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
AYBC1 =>
|
||||||
|
!A0 & A1 & !A2 & !IOSELN & !RDN & WRN
|
||||||
|
# A0 & A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
AYBDIR =>
|
||||||
|
A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
AYDATAREAD =>
|
||||||
|
!A0 & A1 & !A2 & !IOSELN & !RDN & WRN
|
||||||
|
|
||||||
|
AYDATAWRITE =>
|
||||||
|
!A0 & A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
COUT.d =>
|
||||||
|
!A0 & !A1 & !A2 & D0 & !IOSELN & RDN & !WRN
|
||||||
|
# !COUT & IOSELN
|
||||||
|
# !COUT & !RDN
|
||||||
|
# !COUT & WRN
|
||||||
|
# A0 & !COUT
|
||||||
|
# A1 & !COUT
|
||||||
|
# A2 & !COUT
|
||||||
|
|
||||||
|
COUT.ar =>
|
||||||
|
0
|
||||||
|
|
||||||
|
COUT.sp =>
|
||||||
|
0
|
||||||
|
|
||||||
|
D0 =>
|
||||||
|
COMP
|
||||||
|
|
||||||
|
D0.oe =>
|
||||||
|
!A0 & !A1 & !A2 & !IOSELN & !RDN & WRN
|
||||||
|
|
||||||
|
SNWEN =>
|
||||||
|
A0 & !A1 & !A2 & !IOSELN & RDN & !WRN
|
||||||
|
|
||||||
|
ar =>
|
||||||
|
0
|
||||||
|
|
||||||
|
sp =>
|
||||||
|
0
|
||||||
|
|
||||||
|
AYBC1.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
AYBDIR.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
COUT.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
SNWEN.oe =>
|
||||||
|
1
|
||||||
|
|
||||||
|
%END
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
|
|
||||||
CUPL(WM) 5.0a Serial# MW-10400000
|
|
||||||
Device g22v10 Library DLIB-h-40-1
|
|
||||||
Created Sat Oct 03 16:22:02 2026
|
|
||||||
Name casette
|
|
||||||
Partno 00
|
|
||||||
Revision 01
|
|
||||||
Date 2026-10-03
|
|
||||||
Designer joppe
|
|
||||||
Company unknown
|
|
||||||
Assembly None
|
|
||||||
Location unknown
|
|
||||||
*QP24
|
|
||||||
*QF5892
|
|
||||||
*G1
|
|
||||||
*F0
|
|
||||||
*L00416 00000000000000000000000011111111
|
|
||||||
*L00448 11111111111111111111111111111111
|
|
||||||
*L00480 11111111101110111011011110111111
|
|
||||||
*L00512 10111111110111111111111011110111
|
|
||||||
*L00544 11111111111111111111111111111111
|
|
||||||
*L00576 11101111111110111111111111111111
|
|
||||||
*L00608 11111111111111101111111111111111
|
|
||||||
*L00640 11110111111111111111111111100111
|
|
||||||
*L00672 11111111111111111111111111111111
|
|
||||||
*L00704 11110110111111111111111111111111
|
|
||||||
*L00736 11111111111111111110111111111111
|
|
||||||
*L00768 01111111111111111111111100000000
|
|
||||||
*L00896 00000000000000000000000000001111
|
|
||||||
*L00928 10111011101110111011111101111111
|
|
||||||
*L00960 11111111000000000000000000000000
|
|
||||||
*L01472 00000000000000000000000011111011
|
|
||||||
*L01504 10111011101110111111011111111111
|
|
||||||
*L01536 11110000000000000000000000000000
|
|
||||||
*L02144 00000000000011111011101110111011
|
|
||||||
*L02176 10111111011111111111111100000000
|
|
||||||
*L02880 00000000000000000000000011111011
|
|
||||||
*L02912 10111011101110111111011111111111
|
|
||||||
*L02944 11110000000000000000000000000000
|
|
||||||
*L03648 00001111101110111011101110111111
|
|
||||||
*L03680 01111111111111110000000000000000
|
|
||||||
*L04288 00000000000000000000000011111011
|
|
||||||
*L04320 10111011101110111111011111111111
|
|
||||||
*L04352 11110000000000000000000000000000
|
|
||||||
*L04864 00000000000000000000111110111011
|
|
||||||
*L04896 10111011101111110111111111111111
|
|
||||||
*L05344 00000000000000000000000011111011
|
|
||||||
*L05376 10111011101110111111011111111111
|
|
||||||
*L05408 11111111111111111111111111110111
|
|
||||||
*L05440 11111111111111110000000000000000
|
|
||||||
*L05792 00000000000000000010111111111111
|
|
||||||
*L05824 11110011000000110000000000000000
|
|
||||||
*C5BE4
|
|
||||||
*6A87
|
|
||||||
Executable
+2
@@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
/opt/packages/wincupl/cupl -jaxfl g22v10 audio_casette_card.pld
|
||||||
@@ -16,6 +16,9 @@ BIOS_ROM_SIZE := 0x0780
|
|||||||
BASIC_ROM_START := 0x0800
|
BASIC_ROM_START := 0x0800
|
||||||
BASIC_ROM_SIZE := 0x2200
|
BASIC_ROM_SIZE := 0x2200
|
||||||
|
|
||||||
|
SN76489_ROM_START := 0x2a00
|
||||||
|
SN76489_ROM_SIZE := 0x1000
|
||||||
|
|
||||||
BIOS_RAM_START := 0xc000
|
BIOS_RAM_START := 0xc000
|
||||||
BIOS_WP_RAM_START := 0xc800
|
BIOS_WP_RAM_START := 0xc800
|
||||||
BASIC_RAM_START := 0xce00
|
BASIC_RAM_START := 0xce00
|
||||||
|
|||||||
+20
-8
@@ -106,11 +106,10 @@ class PulseWriter:
|
|||||||
self.bytes(struct.pack("<H", crc16(block_data)))
|
self.bytes(struct.pack("<H", crc16(block_data)))
|
||||||
self.byte(0x00) # Make sure the last byte has its last edge
|
self.byte(0x00) # Make sure the last byte has its last edge
|
||||||
|
|
||||||
def header(pulses: PulseWriter, path:Path) -> None:
|
def header(pulses: PulseWriter, path:Path, file_size: int) -> None:
|
||||||
fname = path.name
|
fname = path.name
|
||||||
fsize = os.path.getsize(path)
|
|
||||||
data = (
|
data = (
|
||||||
struct.pack("<HH", math.ceil(fsize/BLOCK_SIZE), fsize)
|
struct.pack("<HH", math.ceil(file_size/BLOCK_SIZE), file_size)
|
||||||
+ fname.encode()[:32].ljust(32, b' ')
|
+ fname.encode()[:32].ljust(32, b' ')
|
||||||
)
|
)
|
||||||
pulses.block(TYPE_BINARY, data)
|
pulses.block(TYPE_BINARY, data)
|
||||||
@@ -126,6 +125,12 @@ def main() -> None:
|
|||||||
)
|
)
|
||||||
parser.add_argument("input", type=Path, help="input file to encode")
|
parser.add_argument("input", type=Path, help="input file to encode")
|
||||||
parser.add_argument("output", type=Path, help="output WAV file")
|
parser.add_argument("output", type=Path, help="output WAV file")
|
||||||
|
parser.add_argument(
|
||||||
|
"--max-size",
|
||||||
|
type=int,
|
||||||
|
metavar="BYTES",
|
||||||
|
help="encode at most this many bytes from the input file",
|
||||||
|
)
|
||||||
parser.add_argument("--sample-rate", type=int, default=48_000)
|
parser.add_argument("--sample-rate", type=int, default=48_000)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--t-short",
|
"--t-short",
|
||||||
@@ -152,6 +157,13 @@ def main() -> None:
|
|||||||
parser.error("--t-short must be less than --t-long")
|
parser.error("--t-short must be less than --t-long")
|
||||||
if not 0.0 <= args.amplitude <= 1.0:
|
if not 0.0 <= args.amplitude <= 1.0:
|
||||||
parser.error("--amplitude must be between 0 and 1")
|
parser.error("--amplitude must be between 0 and 1")
|
||||||
|
if args.max_size is not None and args.max_size < 0:
|
||||||
|
parser.error("--max-size must not be negative")
|
||||||
|
|
||||||
|
input_size = os.path.getsize(args.input)
|
||||||
|
encoded_size = (
|
||||||
|
input_size if args.max_size is None else min(input_size, args.max_size)
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
pulses = PulseWriter(
|
pulses = PulseWriter(
|
||||||
@@ -165,14 +177,14 @@ def main() -> None:
|
|||||||
|
|
||||||
# create header block
|
# create header block
|
||||||
pulses.space(5.0)
|
pulses.space(5.0)
|
||||||
header(pulses, args.input)
|
header(pulses, args.input, encoded_size)
|
||||||
pulses.space(1.0)
|
pulses.space(1.0)
|
||||||
with open(args.input, "rb") as f:
|
with open(args.input, "rb") as f:
|
||||||
while True:
|
remaining = encoded_size
|
||||||
data = f.read(BLOCK_SIZE)
|
while remaining:
|
||||||
if not len(data):
|
data = f.read(min(BLOCK_SIZE, remaining))
|
||||||
break
|
|
||||||
raw(pulses, data)
|
raw(pulses, data)
|
||||||
|
remaining -= len(data)
|
||||||
|
|
||||||
pulses.space(1.0)
|
pulses.space(1.0)
|
||||||
with wave.open(str(args.output), "wb") as wav:
|
with wave.open(str(args.output), "wb") as wav:
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user