diff --git a/audiotest/audiotest/Makefile b/audiotest/audiotest/Makefile new file mode 100644 index 0000000..1497e9e --- /dev/null +++ b/audiotest/audiotest/Makefile @@ -0,0 +1,251 @@ +# +# Makefile +# Apple2BuildPipelineSample +# +# Part of a sample build pipeline for Apple II software development +# +# Created by Quinn Dunki on 8/15/14. +# One Girl, One Laptop Productions +# http://www.quinndunki.com +# http://www.quinndunki.com/blondihacks +# + +include make/head.mk + +# Customize this file to control what gets built, what machines to +# target, where in memory to put it, etc. + +# The name of your system or binary file to build goes here: +PGM=audiotest + +# Uncomment the one you want below (the first one is the default): +# MACHINE = apple2 +# MACHINE = apple2-dos33 +# MACHINE = apple2-system +# MACHINE = apple2-loader +# MACHINE = apple2-reboot + MACHINE = apple2enh +# MACHINE = apple2enh-dos33 +# MACHINE = apple2enh-system +# MACHINE = apple2enh-loader +# MACHINE = apple2enh-reboot + +# Uncomment the appropriate project type. If your entry point is +# main() in a .c file, then your project type is cc65. If your +# entry point is in an assembly file, then you project type is +# ca65: +# PROJECT_TYPE = cc65 +PROJECT_TYPE = ca65 + +# Uncomment and set this to your starting address in Apple II memory +# if necessary: + START_ADDR = 8000 + +# Set the default CPU to assemble for. You can change this in the +# body of a .s file using control commands like ".PC02". Uncomment +# the one you want below (the first one is the default): +# CPU = 6502 +# CPU = 65SC02 + CPU = 65C02 +# CPU = 65816 +# Note: You can assemble for 65816 in 16-bit mode but the C compiler +# will only produce 8-bit code. + +# Add any other directories where you are putting C or assembly source +# files to this list: +SRCDIRS+= + +# If you have a non-standard cc65 install, you may need to change +# some of these. Uncomment the following line and change it to the +# correct path to CC65_HOME if the default is not correct. If you +# are using cc65 v2.13.3, the default is: +# /usr/local/lib/cc65 +# If you are using cc65 v2.17, the default is: +# /usr/local/share/cc65 +# export CC65_HOME := /path/to/your/cc65/directory +# +# If the path to the cc65 binaries is not correct, uncomment this +# line and change it: +# CC65_BIN = /usr/local/bin + +# If you want to add arguments to the compile commandline, add them +# to this variable: +# CFLAGS += -Os + +# If you want to add arguments to the assembly commandline, add them +# to this variable: +# ASMFLAGS += -g + +# If you want to add arguments to the link commandline, add them to +# this variable: +# LDFLAGS += -v + LDFLAGS += -Wl --dbgfile,audiotest.dbg + +# If you want to add arguments to the BASIC tokenizer commandline, +# add them to this valiable: +# BASICFLAGS += --optimize + +# If you want to link the lores graphics driver with your executable, +# uncomment the next line. +# DRIVERS += loresgr +# +# To use the lores driver, add code which looks like this to your +# project: +# +# #include "drivers/a2_lores_drv.h" +# int main(void) +# { +# tgi_install(&a2_lores_drv); +# tgi_init(); +# // Use the graphics driver +# tgi_uninstall(); +# } +# +# Read the $CC65_HOME/include/tgi.h file to see what the +# driver interface provides. Also check out +# $CC65_HOME/include/apple2.h to see the colour definitions. + +# If you want to link the hires graphics driver with your executable, +# uncomment the next line. +# DRIVERS += hiresgr +# +# To use the hires driver, add code which looks like this to your +# project: +# +# #include "drivers/a2_hires_drv.h" +# int main(void) +# { +# tgi_install(&a2_hires_drv); +# tgi_init(); +# // Use the graphics driver +# tgi_uninstall(); +# } +# +# Read the $CC65_HOME/cc65/include/tgi.h file to see what the +# driver interface provides. Also check out +# $CC65_HOME/include/apple2.h to see the colour definitions. + +# If you want to link the extended memory driver with your executable, +# uncomment the next line. +# DRIVERS += auxmem +# +# To use the auxmem driver, add code which looks like this to your +# project: +# +# #include "drivers/a2_auxmem_drv.h" +# int main(void) +# { +# em_install(&a2_auxmem_drv); +# // Use the auxmem driver +# em_uninstall(); +# } +# +# Read the $CC65_HOME/include/em.h file to see what the +# driver interface provides. + +# If you want to link the joystick driver with your executable, +# uncomment the next line. +# DRIVERS += joystick +# +# To use the joystick driver, add code which looks like this to your +# project: +# +# #include "drivers/a2_joystick_drv.h" +# int main(void) +# { +# joy_install(&a2_joystick_drv); +# // Use the joystick driver +# joy_uninstall(); +# } +# +# Read the $CC65_HOME/include/joystick.h file to see what the +# driver interface provides. + +# If you want to link the mouse driver with your executable, +# uncomment the next line. +# DRIVERS += mouse +# +# To use the mouse driver, add code which looks like this to your +# project: +# +# #include "drivers/a2_mouse_drv.h" +# int main(void) +# { +# mouse_install(&mouse_def_callbacks, &a2_mouse_drv); +# // Use the mouse driver +# mouse_uninstall(); +# } +# +# Read the $CC65_HOME/include/mouse.h file to see what the +# driver interface provides. + +# If you want to link the serial driver with your executable, +# uncomment the next line. +# DRIVERS += serial +# +# To use the serial driver, add code which looks like this to your +# project: +# +# #include "drivers/a2_serial_drv.h" +# int main(void) +# { +# ser_install(&a2_serial_drv); +# // Use the serial driver +# ser_uninstall(); +# } +# +# Read the $CC65_HOME/include/serial.h file to see what the +# driver interface provides. + +# If you have java installed in a non-standard location, you can set +# the path to it by uncommenting the following line: +# export JAVA=/usr/bin/java + +# If you want to copy one or more files or directories to the target disk +# image, add the root directory to this variable. All files will be +# copied from the source to the target using the same path from the source. +# +# For example, if you set COPYDIRS to dir and in your project you have +# the following files: +# dir/mySystemFile +# dir/newDir/anotherFile +# +# Then, during the copy phase, mySystemFile will be copied into the root +# of the disk and anotherFile will be copied into a directory named +# newDir. The newDir directory will be created if it does not already +# exist. +# +# The name of the file to copy is checked and if it ends in: +# .as - It assumes the file is in AppleSingle format. The .as +# suffix is stripped from the name when copied to the +# disk image. +# . - If the file ends with a single character which matches +# a DOS 3.3 file type (A, B, T, etc) it uses that value as +# the file type of the file copied to the disk image. The +# single character is removed from the file name. +# . - If the file ends with a three letter alpha extension, it +# uses that TLA as the file type of the file copied to the +# disk image. The TLA is removed from the file name. +# +# If you do not provide any type information for your filenames, +# it will be copied as a binary. +# +COPYDIRS= + +# Add any rules you want to execute before any compiles or assembly +# commands are called here, if any. You can generate .c, .s or .h +# files for example. You can generate data files. Whatever you +# might need. +# +# All of your commands associated with a rule _must_ start with a tab +# character. Xcode makes it a bit tough to type a tab character by +# default. Press option-tab within Xcode to insert a tab character. +gen: + +# For any files you generated in the gen target above, you should +# add rules in genclean to remove those generated files when you +# clean your build. +genclean: + +# Do not change anything else below here... +include make/tail.mk diff --git a/audiotest/audiotest/main.s b/audiotest/audiotest/main.s new file mode 100644 index 0000000..f676523 --- /dev/null +++ b/audiotest/audiotest/main.s @@ -0,0 +1,1281 @@ +; +; main.s +; audiotest +; +; Created by Kris Kennaway on 07/01/2019. +; Copyright © 2019 Kris Kennaway. All rights reserved. +; + +.include "apple2.inc" + +.org $8000 +.proc main + +TICK = $c030 + +zpdummy = $00 +dummy = $ffff + +; Write symbol table to object file +.DEBUGINFO + +; TCP SOCKET DEMO FOR W5100/UTHERNET II +; BY D. FINNIGAN +; OCTOBER 2015 +; +; UPDATED 09 JAN 2016 6* +; UPDATED 13 FEB 2017, C. TORRENCE +; -REMOVED SEPARATE PATH FOR WRAP, ADD DEBUG PRINT + +; SLOT 1 I/O ADDRESSES FOR THE W5100 +WMODE = $C094 +WADRH = $C095 +WADRL = $C096 +WDATA = $C097 + +; W5100 LOCATIONS +MACADDR = $0009 ; MAC ADDRESS +SRCIP = $000F ; SOURCE IP ADDRESS +RMSR = $001A ; RECEIVE BUFFER SIZE + +; SOCKET 0 LOCATIONS + +S0MR = $0400 ; SOCKET 0 MODE REGISTER +S0CR = $0401 ; COMMAND REGISTER +S0IR = $0402 ; INTERRUPT REGISTER +S0SR = $0403 ; STATUS REGISTER +S0LOCALPORT = $0404 ; LOCAL PORT +S0FORADDR = $040C ; FOREIGN ADDRESS +S0FORPORT = $0410 ; FOREIGN PORT +S0MSS = $0412 ; MAX SEGMENT SIZE +S0PROTO = $0414 ; IP PROTOCOL +S0TOS = $0415 ; DS/ECN (FORMER TOS) +S0TTL = $0416 ; IP TIME TO LIVE +S0TXFSR = $0420 ; TX FREE SIZE REGISTER +S0TXRR = $0422 ; TX READ POINTER REGISTER +S0TXWR = $0424 ; TX WRITE POINTER REGISTER +S0RXRSR = $0426 ; RX RECEIVED SIZE REGISTER +S0RXRD = $0428 ; RX READ POINTER REGISTER + +; SOCKET 0 PARAMETERS +RXBASE = $6000 ; SOCKET 0 RX BASE ADDR +RXMASK = $1FFF ; SOCKET 0 8KB ADDRESS MASK +TXBASE = $4000 ; SOCKET 0 TX BASE ADDR +TXMASK = RXMASK ; SOCKET 0 TX MASK + +; SOCKET COMMANDS +SCOPEN = $01 ; OPEN +SCLISTEN = $02 ; LISTEN +SCCONNECT = $04 ; CONNECT +SCDISCON = $08 ; DISCONNECT +SCCLOSE = $10 ; CLOSE +SCSEND = $20 ; SEND +SCSENDMAC = $21 ; SEND MAC +SCSENDKEEP = $22 ; SEND KEEP ALIVE +SCRECV = $40 ; RECV + +; SOCKET STATUS +STCLOSED = $00 +STINIT = $13 +STLISTEN = $14 +STESTABLISHED = $17 +STCLOSEWAIT = $1C +STUDP = $22 +STIPRAW = $32 +STMAXRAW = $42 +STPPOE = $5F + +; MONITOR SUBROUTINES +KBD = $C000 +KBDSTRB = $C010 +COUT = $FDED +PRBYTE = $FDDA +PRNTAX = $F941 + +; ZERO-PAGE STORAGE +PTR = $06 ; 2 BYTES FOR APPLE BUFFER +GETSIZE = $08 ; 2 BYTES FOR RX_RSR +GETOFFSET = $0A ; 2 BYTES FOR OFFSET ADDR +GETSTARTADR = $0C ; 2 BYTES FOR PHYSICAL ADDR + +hgr = $f3e2 +gr = $c050 +text = $c051 +fullscr = $c052 +tick = $c030 + +; RESET AND CONFIGURE W5100 + LDA #6 ; 5 RETRIES TO GET CONNECTION + STA PTR ; NUMBER OF RETRIES + BPL RESET ; ALWAYS TAKEN + +SRCADDR: .byte $C0,$A8,$01,147 ; 192.168.2.5 W5100 IP +FADDR: .byte $C0,$A8,$01,15 ; 192.168.2.1 FOREIGN IP +FPORT: .byte $4E,$20 ; 20000 FOREIGN PORT +MAC: .byte $00,$08,$DC,$01,$02,$03 ; W5100 MAC ADDRESS + +RESET: + LDA #$80 ; reset + STA WMODE + LDA #3 ; CONFIGURE WITH AUTO-INCREMENT + STA WMODE + +; ASSIGN MAC ADDRESS + LDA #>MACADDR + STA WADRH + LDA #S0MR + STA WADRH + LDA #RXMASK + STA GETOFFSET+1 + LDA WDATA ; LOW BYTE + ; why is this not 0? + ;BEQ @L ; XXX assert 0 + ;BRK +@L: + AND #RXBASE + STA GETSTARTADR+1 + + ; SET BUFFER ADDRESS ON W5100 + ;JSR DEBUG ; UNCOMMENT FOR W5100 DEBUG INFO + LDA GETSTARTADR+1 ; HIGH BYTE FIRST + STA WADRH + + LDA GETSTARTADR + STA WADRL + + ; restore content + PLA + ; fall through + LDX #$00 +;4 stores: +;- 73 cycles +;- 14364 Hz +;- 57456 stores/sec +;- 7.5 full screen frames/sec +;- 4 .. 70 opcodes = 32 opcodes/page +;- 5 bit DAC +;- 53 bytes/opcode +;- 53*32*32 = 54272 bytes. Just enough to fit in AUX? +;- 0x800..0x1fff, 0x4000...0xffff = 55294 bytes + +; XXX should fall through to op_tick_36? Since this is the 50% duty cycle case + +op_nop: + LDY WDATA + STY @D+2 + LDY WDATA + STY @D+1 +@D: + JMP op_nop + +;4+(4)+2+4+4+4+5+4+5+4+5+4+5+4+4+4+4+3=73 +op_tick_4: + BIT tick ; 4 + BIT tick ; 4 + + NOP ; 2 + STA dummy ; 4 + + LDA WDATA ; 4 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(2+4)+4+4+4+5+4+5+4+5+4+5+4+4+4+4+3 +op_tick_6: + BIT tick ; 4 + NOP ; 2 + BIT tick ; 4 + + STA dummy ; 4 + + LDA WDATA ; 4 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_8: + + BIT tick ; 4 + LDA WDATA ; 4 + BIT tick ; 4 + + NOP ; 2 + STA dummy ; 4 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_10: + BIT tick ; 4 + LDA WDATA ; 4 + NOP ; 2 + BIT tick ; 4 + STA dummy ; 4 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_12: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + BIT tick ; 4 + + NOP ; 2 + STA dummy ; 4 + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + + +op_tick_14: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + NOP ; 2 + BIT tick ; 4 + + STA dummy ; 4 + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + + +op_tick_16: + BIT tick ; 4 + LDA WDATA ; 4 + STA dummy ; 4 + LDY WDATA ; 4 + BIT tick ; 4 + + NOP ;2 + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_18: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + BIT tick ; XXX off by one ; 5 !!! together these two offset the need for the NOP + + STA dummy,X ; 5 !!! + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(4+4+5+2+5)+3+4+5+4+5+4+5+4+4+4+4+3=73 +op_tick_20: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + NOP ; 2 + BIT tick ; XXX off by one ; 5 !!! together these offset the STA dummy + + STY zpdummy ; 3 cycles !!! + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +; 4+(4+4+5+4+5)+5+5+4+5+4+5+4+4+4+4+3=73 +op_tick_22: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + BIT tick ; XXX off by one ; 5 !!! + + STA dummy,X ; 5 !!! + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(4+4+5+4+2+5)+3+5+4+5+4+5+4+4+4+4+3 +op_tick_24: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + NOP ; 2 + BIT tick ; XXX off by one ; 5 !!! + + STY zpdummy ; 3 !!! + + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +; 4+(4+4+5+4+5+4)+4+4+5+4+5+4+4+4+4+3 +op_tick_26: ; repeats from op_tick_8 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + BIT tick; 4 + + NOP + STA dummy ; 4 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +; 4+(4+2+4+5+4+5+4)+4+4+5+4+5+4+4+4+4+3 +op_tick_28: ; repeats from op_tick_10 + BIT tick ; 4 + LDA WDATA ; 4 + NOP ; 2 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + BIT tick ; 4 + + STA dummy ; 4 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(4+4+5+4+5+4+4)+2+4+5+4+5+4+4+4+4+3 +op_tick_30: ; repeats from op_tick_12 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + BIT tick ; 4 + + NOP ; 2 + STA dummy ; 4 + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_32: ; repeats from op_tick_14 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + NOP ; 2 + BIT tick ; 4 + + STA dummy ; 4 + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_34: ; repeats from op_tick_16 + BIT tick ; 4 + LDA WDATA ; 4 + STA dummy ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + BIT tick ; 4 + + NOP ;2 + + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_36: ; repeats from op_tick_18 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + BIT tick ; XXX off by one ; 5 !!! together these two offset the need for the NOP + + STA dummy,X ; 5 !!! + + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_38: ; repeats from op_tick_20 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + NOP ; 2 + BIT tick ; XXX off by one ; 5 !!! together these offset the STA dummy + + STY zpdummy ; 3 cycles !!! + + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_40: ; repeats from op_tick_22 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + BIT tick ; XXX off by one ; 5 !!! + + STA dummy,X ; 5 !!! + + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(4+4+5+4+5+4+5+4+2+5)+3+5+4+4+4+4+3 +op_tick_42: ; repeats from op_tick_24 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + NOP ; 2 + BIT tick ; XXX off by one ; 5 !!! + + STY zpdummy ; 3 !!! + + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_44: ; repeats from op_tick_26 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + BIT tick; 4 + + NOP + STA dummy ; 4 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + + +;4+(4+2+4+5+4+5+4+5+4+5+4)+4+4+4+4+4+3 +op_tick_46: ; repeats from op_tick_28 + BIT tick ; 4 + LDA WDATA ; 4 + NOP ; 2 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + BIT tick ; 4 + + STA dummy ; 4 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_48: ; repeats from op_tick_30 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + BIT tick ; 4 + + NOP ; 2 + STA dummy ; 4 + + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_50: ; repeats from op_tick_32 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + NOP ; 2 + BIT tick ; 4 + + STA dummy ; 4 + + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_52: ; repeats from op_tick_34 + BIT tick ; 4 + LDA WDATA ; 4 + STA dummy ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + BIT tick ; 4 + + NOP ;2 + + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +; 4 + (4+4+5+4+5+4+5+5+4+5+4+5)+4+4+4+3 +op_tick_54: ; repeats from op_tick_36 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + STA dummy,X ; 5 !!! + + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + BIT TICK ; 5 !!! XXX off by one together these two offset the need for the NOP + + STY @D+2 ; 4 + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +; 4+(4+4+5+4+5+4+5+4+5+4+4+3+5)+2+4+4+3 +op_tick_56: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + + STY zpdummy ; 3 cycles !!! + BIT tick ; XXX off by one ; 5 !!! together these offset the STA dummy + + NOP ; 2 + + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(4+4+5+4+5+4+5+4+5+4+4+5+5)+4+4+3 +op_tick_58: ; repeats from op_tick_40 + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + + STA dummy,X ; 5 !!! + BIT tick ; XXX off by one ; 5 !!! + + LDY WDATA ; 4 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +; 4+(4+4+5+4+5+4+5+4+5+4+4+4+3+5)+2+4+3 +op_tick_60: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + + STY zpdummy ; 3 !!! + BIT tick ; XXX off by one ; 5 !!! + + NOP ; 2 + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +op_tick_62: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + + STY zpdummy ; 3 !!! + NOP ; 2 + BIT tick ; XXX off by one ; 5 !!! + + STY @D+1 ; 4 +@D: + JMP op_nop ; 3 + +;4+(4+4+5+4+5+4+5+4+5+4+4+4+3+4+5)+2+3 +op_tick_64: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + + STY zpdummy ; 3 !!! + STY @D+1 ; 4 + BIT tick ; XXX off by one ; 5 !!! + NOP ; 2 + +@D: + JMP op_nop ; 3 + +op_tick_66: + BIT tick ; 4 + LDA WDATA ; 4 + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STA $2000,Y ; 5 + LDY WDATA ; 4 + STA $2000,Y ; 5 + + LDY WDATA ; 4 + STY @D+2 ; 4 + LDY WDATA ; 4 + + STY zpdummy ; 3 !!! + STY @D+1 ; 4 + NOP ; 2 + BIT tick ; XXX off by one ; 5 !!! + +@D: + JMP op_nop ; 3 + +op_ack: +; MOVE ADDRESS POINTER 1 page further in socket buffer +; LDX WADRH ; socket pointer +; INX + +; UPDATE REXRD TO REFLECT DATA WE JUST READ + +; TODO: be careful about which registers we stomp here +; UPDATERXRD: + + BIT tick + + CLC + LDA #>S0RXRD ; NEED HIGH BYTE HERE + STA WADRH + LDA #S0CR ; HIGH BYTE NEEDED + STA WADRH + LDA # +@OUT: + JMP COUT ; THIS WILL DO THE RTS + +; DEBUG - PRINT W5100 STARTADR AND SIZE +DEBUG: + LDA #$A0 ; " " + JSR COUT + LDA #$A4 ; "$" + JSR COUT + LDA GETOFFSET+1 + LDX GETOFFSET + JSR PRNTAX + + LDA #$A0 ; " " + JSR COUT + LDA #$A4 ; "$" + JSR COUT + LDA GETSTARTADR+1 + LDX GETSTARTADR + JSR PRNTAX + + LDA #$A0 ; " " + JSR COUT + LDA #$A4 ; "$" + JSR COUT + LDA GETSIZE+1 + LDX GETSIZE + JSR PRNTAX + LDA #$8D + JMP COUT ; THIS WILL DO THE RTS + +.endproc