├── .gitignore ├── AVR ├── .gitignore ├── blink-atmega8535 │ ├── main.c │ └── makefile ├── blink-mega2560-usbasp │ ├── main.c │ └── makefile ├── blink-mega2560 │ ├── main.c │ └── makefile ├── debug-atmega8535 │ ├── main.c │ ├── main.h │ ├── makefile │ ├── uart.c │ └── uart.h ├── pov-toy-atmega168-usbasp │ ├── main.c │ └── makefile ├── programmer-atmega644 │ ├── 28c256.c │ ├── 28c256.h │ ├── main.c │ ├── main.h │ ├── makefile │ ├── pinout.h │ ├── shell.c │ ├── shell.h │ ├── uart.c │ ├── uart.h │ ├── xmodem.c │ └── xmodem.h └── usart-atmega8535 │ ├── main.c │ ├── main.h │ ├── makefile │ ├── uart.c │ └── uart.h ├── Arduino ├── 6502-mega-debugger │ └── 6502-mega-debugger │ │ └── 6502-mega-debugger.ino ├── 6502-monitor │ └── 6502-monitor.ino ├── 6522-monitor │ └── 6522-monitor.ino ├── LCD_test │ └── LCD_test.ino ├── README.md ├── address-decoder-test-pld │ └── address-decoder-test-pld.ino ├── address-decoder-test │ └── address-decoder-test.ino ├── bounce_counter │ └── bounce_counter.ino ├── handshake_4313 │ └── handshake_4313.ino ├── handshake_test │ └── handshake_test.ino ├── irq_4313 │ └── irq_4313.ino ├── irq_test │ └── irq_test.ino ├── keyboard_4313 │ └── keyboard_4313.ino ├── keyboard_detect_mega │ └── keyboard_detect_mega.ino ├── keyboard_mega │ └── keyboard_mega.ino ├── keyboard_test_4313 │ └── keyboard_test_4313.ino ├── keyboard_test_mega │ └── keyboard_test_mega.ino └── serial_4313 │ └── serial_4313.ino ├── Datasheets ├── 28c256.pdf ├── 74hc00.pdf ├── 74lvc1g126gv.pdf ├── 74lvc1g157gv.pdf ├── ATF22V10C-15PU.pdf ├── DS_FT230X.pdf ├── HD44780.pdf ├── R6551_Rockwell.pdf ├── atmega644pa.pdf ├── atmega8535.pdf ├── hm62256b.pdf ├── sn74hc595.pdf ├── w65c02s.pdf ├── w65c22.pdf └── w65c51s.pdf ├── LICENSE ├── README.md ├── Schematics ├── .gitignore ├── 555_troubleshoot │ ├── 555_troubleshoot-cache.lib │ ├── 555_troubleshoot.kicad_pcb │ ├── 555_troubleshoot.pro │ └── 555_troubleshoot.sch ├── 65C02_Computer │ ├── 6502.dcm │ ├── 6502.lib │ ├── 6502_IO.sch │ ├── 65C02_Computer-cache.lib │ ├── 65C02_Computer.kicad_pcb │ ├── 65C02_Computer.net │ ├── 65C02_Computer.pdf │ ├── 65C02_Computer.pretty │ │ ├── SSOP-16_3.9x4.9mm_P0.635mm_long_pads.kicad_mod │ │ └── mini_din-6.kicad_mod │ ├── 65C02_Computer.pro │ ├── 65C02_Computer.sch │ ├── Gerbers │ │ ├── 65C02_Computer-B_Cu.gbl │ │ ├── 65C02_Computer-B_Mask.gbs │ │ ├── 65C02_Computer-B_SilkS.gbo │ │ ├── 65C02_Computer-Edge_Cuts.gm1 │ │ ├── 65C02_Computer-F_Cu.gtl │ │ ├── 65C02_Computer-F_Mask.gts │ │ ├── 65C02_Computer-F_SilkS.gto │ │ └── 65C02_Computer.drl │ ├── fp-info-cache │ ├── fp-lib-table │ └── sym-lib-table ├── ATMega_Programmer │ ├── 74LVC1G.dcm │ ├── 74LVC1G.lib │ ├── ATMega_Programmer-cache.lib │ ├── ATMega_Programmer.kicad_pcb │ ├── ATMega_Programmer.pro │ ├── ATMega_Programmer.sch │ └── sym-lib-table ├── Address_decoder_basic │ ├── Address_decoder_basic-cache.lib │ ├── Address_decoder_basic.kicad_pcb │ ├── Address_decoder_basic.pro │ └── Address_decoder_basic.sch ├── Address_decoder_basic_v2 │ ├── Address_decoder_basic_v2-cache.lib │ ├── Address_decoder_basic_v2.kicad_pcb │ ├── Address_decoder_basic_v2.pro │ └── Address_decoder_basic_v2.sch ├── Address_decoder_extended │ ├── Address_decoder_extended-cache.lib │ ├── Address_decoder_extended.kicad_pcb │ ├── Address_decoder_extended.pro │ └── Address_decoder_extended.sch ├── Clock_module │ ├── Clock_module-cache.lib │ ├── Clock_module.kicad_pcb │ ├── Clock_module.net │ ├── Clock_module.pdf │ ├── Clock_module.pro │ ├── Clock_module.sch │ ├── Gerbers │ │ ├── Clock_module-B_Cu.gbl │ │ ├── Clock_module-B_Mask.gbs │ │ ├── Clock_module-B_SilkS.gbo │ │ ├── Clock_module-Edge_Cuts.gm1 │ │ ├── Clock_module-F_Cu.gtl │ │ ├── Clock_module-F_Mask.gts │ │ ├── Clock_module-F_SilkS.gto │ │ └── Clock_module.drl │ └── fp-info-cache ├── DB6502BOM.xlsx ├── DB6502BOMSortedQty.xlsx ├── DB6502_v002 │ ├── 6502.dcm │ ├── 6502.lib │ ├── DB6502_v002-cache.lib │ ├── DB6502_v002.kicad_pcb │ ├── DB6502_v002.pro │ ├── DB6502_v002.sch │ └── sym-lib-table ├── DUART_expansion │ ├── DUART.dcm │ ├── DUART.lib │ ├── DUART_expansion-cache.lib │ ├── DUART_expansion.kicad_pcb │ ├── DUART_expansion.pro │ ├── DUART_expansion.sch │ └── sym-lib-table └── README.md ├── Software ├── .gitignore ├── README.md ├── common │ ├── firmware.basic.cfg │ ├── firmware.ext.cfg │ ├── include │ │ ├── acia.h │ │ ├── acia.inc │ │ ├── blink.h │ │ ├── blink.inc │ │ ├── clock.inc │ │ ├── core.h │ │ ├── core.inc │ │ ├── keyboard.h │ │ ├── keyboard.inc │ │ ├── lcd.h │ │ ├── lcd.inc │ │ ├── macros.inc │ │ ├── menu.h │ │ ├── menu.inc │ │ ├── modem.h │ │ ├── modem.inc │ │ ├── parse.h │ │ ├── parse.inc │ │ ├── string.h │ │ ├── string.inc │ │ ├── sys_const.inc │ │ ├── syscalls.inc │ │ ├── sysram_map.inc │ │ ├── tty.h │ │ ├── tty.inc │ │ ├── utils.h │ │ ├── utils.inc │ │ ├── via.inc │ │ ├── via_const.inc │ │ ├── via_utils.h │ │ ├── via_utils.inc │ │ └── zeropage.inc │ ├── load.cfg │ ├── loadtrim.py │ ├── makefile │ ├── none.lib │ └── source │ │ ├── acia.s │ │ ├── blink.s │ │ ├── core.s │ │ ├── crt0.s │ │ ├── keyboard.s │ │ ├── lcd.s │ │ ├── lcd4bit.s │ │ ├── lcd8bit.s │ │ ├── loadlib.s │ │ ├── menu.s │ │ ├── modem.s │ │ ├── parse.s │ │ ├── string.s │ │ ├── syscalls.s │ │ ├── sysram_map.s │ │ ├── tty.s │ │ ├── utils.s │ │ ├── via.s │ │ ├── via_utils.s │ │ └── zeropage.s ├── load │ ├── 01_blink_test │ │ ├── blink_test.s │ │ └── makefile │ ├── 02_hello_world │ │ ├── hello_world.s │ │ └── makefile │ ├── 03_string_test │ │ ├── makefile │ │ └── string_test.s │ ├── 04_blink_large │ │ ├── blink_test.s │ │ └── makefile │ ├── 05_simple_shell │ │ ├── makefile │ │ └── simple_shell.s │ ├── 06_memdump │ │ ├── makefile │ │ └── memdump.s │ ├── 07_keyboard_test │ │ ├── keyboard_test.s │ │ └── makefile │ ├── 08_system_break_test │ │ ├── makefile │ │ └── system_break_test.s │ ├── 09_monitor │ │ ├── makefile │ │ └── monitor.s │ ├── 10_menu │ │ ├── makefile │ │ └── menu_test.s │ ├── 11_disasm │ │ ├── disasm.s │ │ ├── makefile │ │ └── opcodes.s │ ├── 12_custom_chars │ │ ├── custom_chars.s │ │ └── makefile │ ├── 13_custom_chars_c │ │ ├── custom_chars.c │ │ └── makefile │ ├── 14_offset_math │ │ ├── makefile │ │ └── offset_test.s │ ├── 15_menu_in_c │ │ ├── makefile │ │ └── menu.c │ ├── 16_microchess │ │ ├── makefile │ │ └── microchess.s │ ├── 17_basic │ │ ├── basic.s │ │ ├── basic_parser.s │ │ ├── basic_program.s │ │ ├── basic_runner.s │ │ ├── makefile │ │ ├── tokens.inc │ │ └── tokens.s │ ├── 18_hello_world │ │ ├── hello_world.s │ │ └── makefile │ ├── 19_hello_world_c │ │ ├── hello.c │ │ └── makefile │ ├── 20_lcd_bug │ │ ├── lcd_bug.s │ │ └── makefile │ ├── 21_sysinfo │ │ ├── makefile │ │ └── sysinfo.s │ ├── 22_msbasic │ │ ├── README.txt │ │ ├── TODO.txt │ │ ├── array.s │ │ ├── basic_zp.s │ │ ├── chrget.s │ │ ├── db6502_extra.s │ │ ├── defines.s │ │ ├── defines_db6502.s │ │ ├── error.s │ │ ├── eval.s │ │ ├── extra.s │ │ ├── float.s │ │ ├── flow1.s │ │ ├── flow2.s │ │ ├── header.s │ │ ├── init.s │ │ ├── inline.s │ │ ├── input.s │ │ ├── iscntc.s │ │ ├── loadsave.s │ │ ├── macros.s │ │ ├── makefile │ │ ├── memory.s │ │ ├── message.s │ │ ├── misc1.s │ │ ├── misc2.s │ │ ├── misc3.s │ │ ├── msbasic.s │ │ ├── os1_todo.txt │ │ ├── poke.s │ │ ├── print.s │ │ ├── program.s │ │ ├── rnd.s │ │ ├── string.s │ │ ├── token.s │ │ ├── trig.s │ │ └── var.s │ ├── 23_t1_test │ │ ├── makefile │ │ └── t1_test.s │ ├── 24_user_irq_test │ │ ├── makefile │ │ └── user_irq_test.s │ ├── 25_user_irq_c │ │ ├── makefile │ │ └── user_irq.c │ ├── 26_duart_sync │ │ ├── duart_sync.s │ │ └── makefile │ └── 27_duart_async │ │ ├── duart_async.s │ │ └── makefile ├── makefile └── rom │ ├── 01_nop_fill │ ├── makefile │ └── nop_fill.s │ ├── 02_nop_fffc │ ├── makefile │ └── nop_fffc.s │ ├── 03_first_code │ ├── first_code.s │ └── makefile │ ├── 04_blink_s │ ├── blink.s │ └── makefile │ ├── 05_knight_rider │ ├── knight_rider.s │ └── makefile │ ├── 06_lcd_test │ ├── lcd_test.s │ └── makefile │ ├── 07_mem_test │ ├── makefile │ └── mem_test.s │ ├── 08_stack_test │ ├── makefile │ └── stack_test.s │ ├── 09_serial_test │ ├── makefile │ └── serial_test.s │ ├── 10_blink_c │ ├── blink.c │ ├── makefile │ └── start.s │ ├── 11_int_test │ ├── int_test.s │ └── makefile │ ├── 12_handshake_test │ ├── handshake_test.s │ └── makefile │ ├── 13_4bit_lcd │ ├── lcd_test.s │ └── makefile │ ├── 14_irq_test │ ├── irq_test.s │ └── makefile │ ├── 15_serial_irq │ ├── makefile │ └── serial_irq.s │ ├── 16_delay_test │ ├── delay.s │ └── makefile │ ├── 17_blink_test │ ├── blink.s │ └── makefile │ ├── 18_core_program │ ├── main.s │ └── makefile │ ├── 19_keyboard_test │ ├── keyboard_test.s │ └── makefile │ ├── 20_convert_test │ ├── convert_test.s │ └── makefile │ ├── 21_serial_load_test │ ├── main.s │ └── makefile │ ├── 22_modem_test │ ├── makefile │ └── modem_test.s │ ├── 23_blink_test │ ├── blink_test.s │ └── makefile │ ├── 24_serial_wdc │ ├── makefile │ └── serial_wdc.s │ ├── 25_serial_wdc_irq │ ├── makefile │ └── serial_wdc_irq.s │ ├── microsoft_basic │ ├── README.txt │ ├── TODO.txt │ ├── apple_extra.s │ ├── apple_iscntc.s │ ├── apple_loadsave.s │ ├── applesoft.cfg │ ├── array.s │ ├── basic_zp.s │ ├── cbm1_patches.s │ ├── cbm_iscntc.s │ ├── cbmbasic1.cfg │ ├── cbmbasic2.cfg │ ├── chrget.s │ ├── db6502_extra.s │ ├── defines.s │ ├── defines_apple.s │ ├── defines_cbm1.s │ ├── defines_cbm2.s │ ├── defines_db6502.s │ ├── defines_kbd.s │ ├── defines_kim.s │ ├── defines_microtan.s │ ├── defines_osi.s │ ├── error.s │ ├── eval.s │ ├── extra.s │ ├── float.s │ ├── flow1.s │ ├── flow2.s │ ├── header.s │ ├── init.s │ ├── inline.s │ ├── input.s │ ├── iscntc.s │ ├── kb9.cfg │ ├── kbd_extra.s │ ├── kbd_iscntc.s │ ├── kbd_loadsave.s │ ├── kbdbasic.cfg │ ├── kim_extra.s │ ├── kim_iscntc.s │ ├── kim_loadsave.s │ ├── loadsave.s │ ├── macros.s │ ├── make.sh │ ├── makefile │ ├── memory.s │ ├── message.s │ ├── microtan.cfg │ ├── microtan_extra.s │ ├── microtan_iscntc.s │ ├── microtan_loadsave.s │ ├── misc1.s │ ├── misc2.s │ ├── misc3.s │ ├── msbasic.s │ ├── osi.cfg │ ├── osi_iscntc.s │ ├── poke.s │ ├── print.s │ ├── program.s │ ├── regress.sh │ ├── rnd.s │ ├── string.s │ ├── token.s │ ├── trig.s │ └── var.s │ ├── minimal_bootloader │ ├── makefile │ └── minimal_bootloader.s │ └── os1 │ ├── makefile │ ├── monitor.s │ ├── opcodes.s │ ├── os1.s │ └── shell.s └── WinCUPL ├── DB6502.PLD ├── DB6502.abs ├── DB6502.doc ├── DB6502.jed ├── DB6502.pdf ├── DB6502.si ├── DB6502.sim ├── DB6502.so └── DB6502.wo /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vscode 3 | -------------------------------------------------------------------------------- /AVR/.gitignore: -------------------------------------------------------------------------------- 1 | build -------------------------------------------------------------------------------- /AVR/blink-atmega8535/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(void) 5 | { 6 | // Configure PB5 as an output using the Port B Data Direction Register (DDRB) 7 | DDRB |= _BV(DDB0); 8 | 9 | // Loop forever 10 | while (1) 11 | { 12 | // Set PB5 high using the Port B Data Register (PORTB) 13 | PORTB |= _BV(PORTB0); 14 | 15 | // Wait 500ms 16 | _delay_ms(200); 17 | 18 | // Set PB5 low using the Port B Data Register (PORTB) 19 | PORTB &= ~_BV(PORTB0); 20 | 21 | // Wait 500ms 22 | _delay_ms(200); 23 | } 24 | } -------------------------------------------------------------------------------- /AVR/blink-atmega8535/makefile: -------------------------------------------------------------------------------- 1 | NAME := main 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega8535 11 | MCU_AVRDUDE := atmega8535 12 | PARTNO := stk500v1 13 | DEVICE := /dev/cu.usbserial-1410 14 | BAUDRATE := 19200 15 | AVRDUDE_FLAGS := -F -v 16 | 17 | CC := avr-gcc 18 | OBJCOPY := avr-objcopy 19 | SIZE := avr-size -A 20 | 21 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=16000000UL 22 | 23 | all: $(HEX) $(BUILD_FOLDER) 24 | 25 | clean: 26 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 27 | 28 | $(BUILD_FOLDER): 29 | mkdir $(BUILD_FOLDER) 30 | 31 | flash: $(HEX) 32 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -b $(BAUDRATE) -U flash:w:$(HEX) 33 | 34 | $(HEX): $(OUT) 35 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 36 | 37 | $(OUT): $(OBJECTS) 38 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 39 | @echo 40 | @$(SIZE) $@ 41 | @echo 42 | 43 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 44 | $(CC) $(CFLAGS) -c -o $@ $< 45 | 46 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 47 | $(CC) $(CFLAGS) -E -o $@ $< 48 | 49 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 50 | $(CC) $(CFLAGS) -E $< -------------------------------------------------------------------------------- /AVR/blink-mega2560-usbasp/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(void) 5 | { 6 | // Configure PB5 as an output using the Port B Data Direction Register (DDRB) 7 | DDRB |= _BV(DDB7); 8 | 9 | // Loop forever 10 | while (1) 11 | { 12 | // Toggle PB5 using the Port B Input Pin Register (PINB) 13 | PINB = _BV(PINB7); 14 | 15 | // Wait 500ms 16 | _delay_ms(500); 17 | } 18 | } -------------------------------------------------------------------------------- /AVR/blink-mega2560-usbasp/makefile: -------------------------------------------------------------------------------- 1 | NAME := main 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega2560 11 | MCU_AVRDUDE := m2560 12 | PARTNO := usbasp-clone 13 | DEVICE := usb 14 | AVRDUDE_FLAGS := -F -V -D -v 15 | 16 | CC := avr-gcc 17 | OBJCOPY := avr-objcopy 18 | SIZE := avr-size -A 19 | 20 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=16000000UL 21 | 22 | all: $(HEX) $(BUILD_FOLDER) 23 | 24 | clean: 25 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 26 | 27 | $(BUILD_FOLDER): 28 | mkdir $(BUILD_FOLDER) 29 | 30 | flash: $(HEX) 31 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -U flash:w:$(HEX) 32 | 33 | $(HEX): $(OUT) 34 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 35 | 36 | $(OUT): $(OBJECTS) 37 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 38 | @echo 39 | @$(SIZE) $@ 40 | @echo 41 | 42 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 43 | $(CC) $(CFLAGS) -c -o $@ $< 44 | 45 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 46 | $(CC) $(CFLAGS) -E -o $@ $< 47 | 48 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 49 | $(CC) $(CFLAGS) -E $< -------------------------------------------------------------------------------- /AVR/blink-mega2560/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(void) 5 | { 6 | // Configure PB5 as an output using the Port B Data Direction Register (DDRB) 7 | DDRB |= _BV(DDB7); 8 | 9 | // Loop forever 10 | while (1) 11 | { 12 | // Toggle PB5 using the Port B Input Pin Register (PINB) 13 | PINB = _BV(PINB7); 14 | 15 | // Wait 500ms 16 | _delay_ms(500); 17 | } 18 | } -------------------------------------------------------------------------------- /AVR/blink-mega2560/makefile: -------------------------------------------------------------------------------- 1 | NAME := main 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega2560 11 | MCU_AVRDUDE := m2560 12 | PARTNO := wiring 13 | # Windows 14 | #DEVICE := COM5 15 | # MacOS 16 | DEVICE := /dev/tty.usbmodem14201 17 | BAUDRATE := 115200 18 | AVRDUDE_FLAGS := -F -V -D -v 19 | 20 | CC := avr-gcc 21 | OBJCOPY := avr-objcopy 22 | SIZE := avr-size -A 23 | 24 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=16000000UL 25 | 26 | all: $(HEX) $(BUILD_FOLDER) 27 | 28 | clean: 29 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 30 | 31 | $(BUILD_FOLDER): 32 | mkdir $(BUILD_FOLDER) 33 | 34 | flash: $(HEX) 35 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -b $(BAUDRATE) -U flash:w:$(HEX) 36 | 37 | $(HEX): $(OUT) 38 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 39 | 40 | $(OUT): $(OBJECTS) 41 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 42 | @echo 43 | @$(SIZE) $@ 44 | @echo 45 | 46 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 47 | $(CC) $(CFLAGS) -c -o $@ $< 48 | 49 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 50 | $(CC) $(CFLAGS) -E -o $@ $< 51 | 52 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 53 | $(CC) $(CFLAGS) -E $< -------------------------------------------------------------------------------- /AVR/debug-atmega8535/main.h: -------------------------------------------------------------------------------- 1 | int main(void); 2 | void processUserInput(void); 3 | -------------------------------------------------------------------------------- /AVR/debug-atmega8535/makefile: -------------------------------------------------------------------------------- 1 | NAME := debug_m8535 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega8535 11 | MCU_AVRDUDE := atmega8535 12 | PARTNO := stk500v1 13 | DEVICE := /dev/cu.usbserial-1410 14 | BAUDRATE := 19200 15 | AVRDUDE_FLAGS := -F -v 16 | 17 | CC := avr-gcc 18 | OBJCOPY := avr-objcopy 19 | SIZE := avr-size -A 20 | 21 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=16000000UL 22 | 23 | all: $(HEX) $(BUILD_FOLDER) 24 | 25 | clean: 26 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 27 | 28 | $(BUILD_FOLDER): 29 | mkdir $(BUILD_FOLDER) 30 | 31 | flash: $(HEX) 32 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -b $(BAUDRATE) -U flash:w:$(HEX) 33 | 34 | $(HEX): $(OUT) 35 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 36 | 37 | $(OUT): $(OBJECTS) 38 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 39 | @echo 40 | @$(SIZE) $@ 41 | @echo 42 | 43 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 44 | $(CC) $(CFLAGS) -c -o $@ $< 45 | 46 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 47 | $(CC) $(CFLAGS) -E -o $@ $< 48 | 49 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 50 | $(CC) $(CFLAGS) -E $< 51 | -------------------------------------------------------------------------------- /AVR/debug-atmega8535/uart.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | void uart_init(unsigned long baud) 5 | { 6 | unsigned int ubrr; 7 | ubrr = (((F_CPU / (baud * 16UL))) - 1); 8 | UBRRH = (unsigned char)(ubrr >> 8); 9 | UBRRL = (unsigned char)ubrr; 10 | 11 | // This is extremaly important - writing to UCSRC will overwrite 12 | // UBRRH unless URSEL bit is set in the value 13 | // Honestly WTF?! 14 | UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); /* 8-bit data */ 15 | UCSRB = _BV(RXEN) | _BV(TXEN); /* Enable RX and TX */ 16 | } 17 | 18 | int uart_putchar(char c, FILE *stream) 19 | { 20 | if (c == '\n') 21 | { 22 | uart_putchar('\r', stream); 23 | } 24 | loop_until_bit_is_set(UCSRA, UDRE); 25 | UDR = c; 26 | return 0; 27 | } 28 | 29 | int uart_getchar(FILE *stream) 30 | { 31 | loop_until_bit_is_set(UCSRA, RXC); 32 | return UDR; 33 | } 34 | -------------------------------------------------------------------------------- /AVR/debug-atmega8535/uart.h: -------------------------------------------------------------------------------- 1 | int uart_putchar(char c, FILE *stream); 2 | int uart_getchar(FILE *stream); 3 | 4 | void uart_init(unsigned long baud); 5 | 6 | /* http://www.ermicro.com/blog/?p=325 */ 7 | 8 | FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); 9 | FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); 10 | -------------------------------------------------------------------------------- /AVR/pov-toy-atmega168-usbasp/main.c: -------------------------------------------------------------------------------- 1 | // POV toy demo framework // 2 | // ------- Preamble -------- // 3 | #include 4 | #include 5 | // -------- Functions --------- // 6 | void POVDisplay(uint8_t oneByte) { 7 | PORTB = oneByte; 8 | _delay_ms(2); 9 | } 10 | 11 | int main(void) { 12 | DDRB = 0xff; 13 | while (1) { 14 | POVDisplay(0b00001110); 15 | POVDisplay(0b00011000); 16 | POVDisplay(0b10111101); 17 | POVDisplay(0b01110110); 18 | POVDisplay(0b00111100); 19 | POVDisplay(0b00111100); 20 | POVDisplay(0b00111100); 21 | POVDisplay(0b01110110); 22 | POVDisplay(0b10111101); 23 | POVDisplay(0b00011000); 24 | POVDisplay(0b00001110); 25 | PORTB = 0; 26 | _delay_ms(10); 27 | } 28 | return (0); 29 | } -------------------------------------------------------------------------------- /AVR/pov-toy-atmega168-usbasp/makefile: -------------------------------------------------------------------------------- 1 | NAME := main 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega168pa 11 | MCU_AVRDUDE := m168p 12 | PARTNO := usbasp 13 | DEVICE := usb 14 | AVRDUDE_FLAGS := -v 15 | 16 | CC := avr-gcc 17 | OBJCOPY := avr-objcopy 18 | SIZE := avr-size -A 19 | 20 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=8000000UL 21 | 22 | all: $(HEX) $(BUILD_FOLDER) 23 | 24 | clean: 25 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 26 | 27 | $(BUILD_FOLDER): 28 | mkdir $(BUILD_FOLDER) 29 | 30 | flash: $(HEX) 31 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -U flash:w:$(HEX) 32 | 33 | $(HEX): $(OUT) 34 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 35 | 36 | $(OUT): $(OBJECTS) 37 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 38 | @echo 39 | @$(SIZE) $@ 40 | @echo 41 | 42 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 43 | $(CC) $(CFLAGS) -c -o $@ $< 44 | 45 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 46 | $(CC) $(CFLAGS) -E -o $@ $< 47 | 48 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 49 | $(CC) $(CFLAGS) -E $< -------------------------------------------------------------------------------- /AVR/programmer-atmega644/28c256.h: -------------------------------------------------------------------------------- 1 | #ifndef __28C256_H__DEFINED 2 | #define __28C256_H__DEFINED 3 | 4 | #define WRITE_FAIL 0x00 5 | #define WRITE_OK 0x01 6 | 7 | #define SDP_FAILED 0x00 8 | #define SDP_DISABLED 0x01 9 | #define SDP_ENABLED 0x02 10 | 11 | #define PAGE_SIZE 64 12 | 13 | #define ROM_START 0x8000 14 | #define ROM_SIZE 0x8000 15 | 16 | uint8_t readSingleByte(const uint16_t address); 17 | uint8_t writeSingleByte(const uint16_t address, const uint8_t data); 18 | uint8_t writePage(const uint16_t address, uint8_t* data_ptr); 19 | uint8_t eraseChip(void); 20 | uint8_t disableDataProtection(void); 21 | uint8_t enableDataProtection(void); 22 | 23 | uint8_t checkDataProtection(void); 24 | 25 | 26 | #endif /* __28C256_H__DEFINED */ -------------------------------------------------------------------------------- /AVR/programmer-atmega644/main.h: -------------------------------------------------------------------------------- 1 | int main(void); 2 | void initSystem(void); 3 | void initTimer(void); 4 | void assumeBusControl(void); 5 | void returnBusControl(void); 6 | void updateControlRegister(void); 7 | uint32_t getSystemTime(void); -------------------------------------------------------------------------------- /AVR/programmer-atmega644/makefile: -------------------------------------------------------------------------------- 1 | NAME := programmer-atmega644 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega644pa 11 | MCU_AVRDUDE := m644p 12 | PARTNO := stk500v1 13 | # MacOS 14 | DEVICE := /dev/cu.usbserial-14120 15 | # Windows10/CygWin 16 | # DEVICE := COM8 17 | BAUDRATE := 19200 18 | AVRDUDE_FLAGS := -F -v 19 | 20 | CC := avr-gcc 21 | OBJCOPY := avr-objcopy 22 | SIZE := avr-size -A 23 | 24 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=20000000UL 25 | 26 | all: $(HEX) $(BUILD_FOLDER) 27 | 28 | clean: 29 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 30 | 31 | $(BUILD_FOLDER): 32 | mkdir $(BUILD_FOLDER) 33 | 34 | flash: $(HEX) 35 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -b $(BAUDRATE) -U flash:w:$(HEX) 36 | 37 | bridge: 38 | socat -v -x /dev/cu.usbserial-DN5B2BNG,ispeed=230400,ospeed=230400,raw,echo=0 PTY,link=/tmp/ttyV0,raw,echo=0 2>~/serial.log 39 | 40 | $(HEX): $(OUT) 41 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 42 | 43 | $(OUT): $(OBJECTS) 44 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 45 | @echo 46 | @$(SIZE) $@ 47 | @echo 48 | 49 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 50 | $(CC) $(CFLAGS) -c -o $@ $< 51 | 52 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 53 | $(CC) $(CFLAGS) -E -o $@ $< 54 | 55 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 56 | $(CC) $(CFLAGS) -E $< 57 | -------------------------------------------------------------------------------- /AVR/programmer-atmega644/pinout.h: -------------------------------------------------------------------------------- 1 | #ifndef __PINOUT_H__DEFINED 2 | #define __PINOUT_H__DEFINED 3 | 4 | #define ADDRMSB_DDR DDRC 5 | #define ADDRLSB_DDR DDRA 6 | #define DATA_DDR DDRB 7 | #define CONTROL_DDR DDRD 8 | 9 | #define ADDRMSB_POUT PORTC 10 | #define ADDRLSB_POUT PORTA 11 | #define DATA_POUT PORTB 12 | #define CONTROL_POUT PORTD 13 | 14 | #define ADDRMSB_PIN PINC 15 | #define ADDRLSB_PIN PINA 16 | #define DATA_PIN PINB 17 | #define CONTROL_PIN PIND 18 | 19 | #define SR_DAT _BV(PD2) 20 | #define SR_CLK _BV(PD3) 21 | #define SR_OUT _BV(PD4) 22 | 23 | #define CLK_BIT _BV(PD5) 24 | #define RW_BIT _BV(PD6) 25 | #define SYNC_BIT _BV(PD7) 26 | 27 | #define CLKSEL_BIT _BV(0) 28 | #define BE_BIT _BV(1) 29 | #define RDY_BIT _BV(2) 30 | #define RESET_BIT _BV(7) 31 | 32 | #define ALL_INPUT 0x00 33 | #define ALL_OUTPUT 0xff 34 | #define ALL_PULL_UP 0xff 35 | 36 | #endif -------------------------------------------------------------------------------- /AVR/programmer-atmega644/shell.h: -------------------------------------------------------------------------------- 1 | #ifndef __SHELL_H__DEFINED 2 | #define __SHELL_H__DEFINED 3 | 4 | void runShell(); 5 | 6 | #endif -------------------------------------------------------------------------------- /AVR/programmer-atmega644/uart.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "uart.h" 4 | 5 | #define BAUD 230400 6 | #include 7 | 8 | void uart_init() 9 | { 10 | UBRR0H = UBRRH_VALUE; 11 | UBRR0L = UBRRL_VALUE; 12 | #if USE_2X 13 | UCSR0A |= (1 << U2X0); 14 | #else 15 | UCSR0A &= ~(1 << U2X0); 16 | #endif 17 | 18 | UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data, async, no parity, 1 stop bit */ 19 | UCSR0B = _BV(RXEN0) | _BV(TXEN0); /* Enable RX and TX */ 20 | } 21 | 22 | int uart_putchar(char c, FILE *stream) 23 | { 24 | if (c == '\n') 25 | { 26 | uart_putchar('\r', stream); 27 | } 28 | uart_send(c); 29 | return 0; 30 | } 31 | 32 | int uart_getchar(FILE *stream) 33 | { 34 | return uart_recv(); 35 | } 36 | 37 | void uart_send(char c) { 38 | loop_until_bit_is_set(UCSR0A, UDRE0); 39 | UDR0 = c; 40 | } 41 | 42 | char uart_recv(void) { 43 | loop_until_bit_is_set(UCSR0A, RXC0); 44 | return UDR0; 45 | } 46 | 47 | uint8_t uart_peek(void) { 48 | if (UCSR0A & _BV(RXC0)) { 49 | return UART_DATA_AVAILABLE; 50 | } 51 | return UART_NO_DATA; 52 | } 53 | -------------------------------------------------------------------------------- /AVR/programmer-atmega644/uart.h: -------------------------------------------------------------------------------- 1 | #ifndef __UART_H__DEFINED 2 | #define __UART_H__DEFINED 3 | 4 | #define UART_NO_DATA 0x00 5 | #define UART_DATA_AVAILABLE 0x01 6 | 7 | int uart_putchar(char c, FILE *stream); 8 | int uart_getchar(FILE *stream); 9 | 10 | void uart_send(char c); 11 | char uart_recv(void); 12 | uint8_t uart_peek(void); 13 | 14 | void uart_init(); 15 | 16 | #endif /* __UART_H__DEFINED */ -------------------------------------------------------------------------------- /AVR/programmer-atmega644/xmodem.h: -------------------------------------------------------------------------------- 1 | #ifndef __XMODEM_H__DEFINED 2 | #define __XMODEM_H__DEFINED 3 | 4 | // Callback types for receive and send operations 5 | typedef uint8_t (*packet_func)(uint16_t packet_no, uint8_t* buffer, uint16_t size); 6 | 7 | // Function will receive file block by block, calling callbacks after each of them 8 | uint8_t receiveFile(packet_func packet_callback); 9 | 10 | // Function will send file block by block, calling callbacks before each of them 11 | uint8_t sendFile(packet_func packet_callback); 12 | 13 | #endif /* __XMODEM_H__DEFINED */ -------------------------------------------------------------------------------- /AVR/usart-atmega8535/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Demonstration on how to redirect stdio to UART. 3 | * 4 | * http://appelsiini.net/2011/simple-usart-with-avr-libc 5 | * 6 | * To compile and upload run: make clean; make; make program; 7 | * Connect to serial with: screen /dev/tty.usbserial-* 8 | * 9 | * Copyright 2011 Mika Tuupola 10 | * 11 | * Licensed under the MIT license: 12 | * http://www.opensource.org/licenses/mit-license.php 13 | * 14 | */ 15 | 16 | #include 17 | 18 | #include "main.h" 19 | #include "uart.h" 20 | 21 | int main(void) 22 | { 23 | 24 | uart_init(19200); 25 | stdout = &uart_output; 26 | stdin = &uart_input; 27 | 28 | char input; 29 | 30 | while(1) { 31 | puts("Hello world!"); 32 | input = getchar(); 33 | printf("You wrote %c\n", input); 34 | } 35 | 36 | return 0; 37 | } 38 | -------------------------------------------------------------------------------- /AVR/usart-atmega8535/main.h: -------------------------------------------------------------------------------- 1 | int main(void); 2 | -------------------------------------------------------------------------------- /AVR/usart-atmega8535/makefile: -------------------------------------------------------------------------------- 1 | NAME := usart_m8535 2 | BUILD_FOLDER=build 3 | HEX := $(BUILD_FOLDER)/$(NAME).hex 4 | OUT := $(BUILD_FOLDER)/$(NAME).out 5 | MAP := $(BUILD_FOLDER)/$(NAME).map 6 | SOURCES := $(wildcard *.c) 7 | HEADERS := $(wildcard *.h) 8 | OBJECTS := $(patsubst %.c,$(BUILD_FOLDER)/%.o,$(SOURCES)) 9 | 10 | MCU := atmega8535 11 | MCU_AVRDUDE := atmega8535 12 | PARTNO := stk500v1 13 | DEVICE := /dev/cu.usbserial-1410 14 | BAUDRATE := 19200 15 | AVRDUDE_FLAGS := -F -v 16 | 17 | CC := avr-gcc 18 | OBJCOPY := avr-objcopy 19 | SIZE := avr-size -A 20 | 21 | CFLAGS := -Wall -pedantic -mmcu=$(MCU) -std=c99 -g -Os -DF_CPU=16000000UL 22 | 23 | all: $(HEX) $(BUILD_FOLDER) 24 | 25 | clean: 26 | rm -rf $(HEX) $(OUT) $(MAP) $(OBJECTS) $(BUILD_FOLDER) 27 | 28 | $(BUILD_FOLDER): 29 | mkdir $(BUILD_FOLDER) 30 | 31 | flash: $(HEX) 32 | avrdude $(AVRDUDE_FLAGS) -c $(PARTNO) -p $(MCU_AVRDUDE) -P $(DEVICE) -b $(BAUDRATE) -U flash:w:$(HEX) 33 | 34 | $(HEX): $(OUT) 35 | $(OBJCOPY) -R .eeprom -O ihex $< $@ 36 | 37 | $(OUT): $(OBJECTS) 38 | $(CC) $(CFLAGS) -o $@ -Wl,-Map,$(MAP) $^ 39 | @echo 40 | @$(SIZE) $@ 41 | @echo 42 | 43 | $(BUILD_FOLDER)/%.o: %.c $(HEADERS) $(BUILD_FOLDER) 44 | $(CC) $(CFLAGS) -c -o $@ $< 45 | 46 | $(BUILD_FOLDER)/%.pp: %.c $(BUILD_FOLDER) 47 | $(CC) $(CFLAGS) -E -o $@ $< 48 | 49 | $(BUILD_FOLDER)/%.ppo: %.c $(BUILD_FOLDER) 50 | $(CC) $(CFLAGS) -E $< 51 | -------------------------------------------------------------------------------- /AVR/usart-atmega8535/uart.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | void uart_init(unsigned int baud) 5 | { 6 | unsigned int ubrr; 7 | ubrr = (((F_CPU / (baud * 16UL))) - 1); 8 | UBRRH = (unsigned char)(ubrr >> 8); 9 | UBRRL = (unsigned char)ubrr; 10 | 11 | // This is extremaly important - writing to UCSRC will overwrite 12 | // UBRRH unless URSEL bit is set in the value 13 | // Honestly WTF?! 14 | UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); /* 8-bit data */ 15 | UCSRB = _BV(RXEN) | _BV(TXEN); /* Enable RX and TX */ 16 | } 17 | 18 | int uart_putchar(char c, FILE *stream) 19 | { 20 | if (c == '\n') 21 | { 22 | uart_putchar('\r', stream); 23 | } 24 | loop_until_bit_is_set(UCSRA, UDRE); 25 | UDR = c; 26 | return 0; 27 | } 28 | 29 | int uart_getchar(FILE *stream) 30 | { 31 | loop_until_bit_is_set(UCSRA, RXC); 32 | return UDR; 33 | } 34 | -------------------------------------------------------------------------------- /AVR/usart-atmega8535/uart.h: -------------------------------------------------------------------------------- 1 | int uart_putchar(char c, FILE *stream); 2 | int uart_getchar(FILE *stream); 3 | 4 | void uart_init(unsigned int baud); 5 | 6 | /* http://www.ermicro.com/blog/?p=325 */ 7 | 8 | FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); 9 | FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); 10 | -------------------------------------------------------------------------------- /Arduino/6502-monitor/6502-monitor.ino: -------------------------------------------------------------------------------- 1 | const char ADDR[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52}; 2 | const char DATA[] = {39, 41, 43, 45, 47, 49, 51, 53}; 3 | #define CLOCK 2 4 | #define READ_WRITE 3 5 | 6 | int clockCycle = 0; 7 | 8 | void setup() { 9 | for (int n = 0; n < 16; n += 1) { 10 | pinMode(ADDR[n], INPUT); 11 | } 12 | for (int n = 0; n < 8; n += 1) { 13 | pinMode(DATA[n], INPUT); 14 | } 15 | pinMode(CLOCK, INPUT); 16 | pinMode(READ_WRITE, INPUT); 17 | 18 | attachInterrupt(digitalPinToInterrupt(CLOCK), onClock, RISING); 19 | 20 | Serial.begin(57600); 21 | } 22 | 23 | void onClock() { 24 | char output[15]; 25 | 26 | sprintf(output, "%06u ", clockCycle); 27 | 28 | Serial.print(output); 29 | 30 | unsigned int address = 0; 31 | for (int n = 0; n < 16; n += 1) { 32 | int bit = digitalRead(ADDR[n]) ? 1 : 0; 33 | Serial.print(bit); 34 | address = (address << 1) + bit; 35 | } 36 | 37 | Serial.print(" "); 38 | 39 | unsigned int data = 0; 40 | for (int n = 0; n < 8; n += 1) { 41 | int bit = digitalRead(DATA[n]) ? 1 : 0; 42 | Serial.print(bit); 43 | data = (data << 1) + bit; 44 | } 45 | 46 | sprintf(output, " %04x %c %02x", address, digitalRead(READ_WRITE) ? 'r' : 'W', data); 47 | Serial.println(output); 48 | clockCycle ++; 49 | } 50 | 51 | void loop() { 52 | } 53 | -------------------------------------------------------------------------------- /Arduino/6522-monitor/6522-monitor.ino: -------------------------------------------------------------------------------- 1 | char MODE[] = {52, 50, 48}; 2 | char DATA[] = {46, 44, 42, 40, 38, 36, 34, 32}; 3 | #define CLOCK 2 4 | 5 | void setup() { 6 | for (int n = 0; n < 3; n += 1) { 7 | pinMode(MODE[n], INPUT); 8 | } 9 | for (int n = 0; n < 8; n += 1) { 10 | pinMode(DATA[n], INPUT); 11 | } 12 | pinMode(CLOCK, INPUT); 13 | 14 | attachInterrupt(digitalPinToInterrupt(CLOCK), onClock, RISING); 15 | 16 | Serial.begin(57600); 17 | } 18 | 19 | void onClock() { 20 | char output[15]; 21 | 22 | unsigned int data = 0; 23 | for (int n = 7; n >=0; n--) { 24 | int bit = digitalRead(DATA[n]) ? 1 : 0; 25 | Serial.print(bit); 26 | data = (data << 1) + bit; 27 | } 28 | 29 | sprintf(output, " %c %c %c %02x", digitalRead(MODE[0]) ? 'D' : 'C', 30 | digitalRead(MODE[1]) ? 'r' : 'W', 31 | digitalRead(MODE[2]) ? 'E' : 'e', 32 | data); 33 | Serial.println(output); 34 | } 35 | 36 | void loop() { 37 | // Serial.print('Clock: '); 38 | // onClock(); 39 | // delay(50); 40 | } 41 | -------------------------------------------------------------------------------- /Arduino/bounce_counter/bounce_counter.ino: -------------------------------------------------------------------------------- 1 | int counter = 0; 2 | int last_counter = 0; 3 | 4 | #define BUTTON 2 5 | 6 | void setup() { 7 | pinMode(BUTTON, INPUT); 8 | 9 | attachInterrupt(digitalPinToInterrupt(BUTTON), onButton, RISING); 10 | 11 | Serial.begin(57600); 12 | } 13 | 14 | void onButton() { 15 | counter ++; 16 | } 17 | 18 | void loop() { 19 | // put your main code here, to run repeatedly: 20 | if (last_counter 2 | 3 | const char DATA[] = {39, 41, 43, 45, 47, 49, 51, 53}; 4 | 5 | #define HS_DATA_TAKEN 2 6 | #define HS_DATA_READY 4 7 | 8 | const int DataPin = 3; 9 | const int IRQpin = 2; 10 | 11 | PS2Keyboard keyboard; 12 | 13 | void setup() { 14 | 15 | for (int n = 0; n < 8; n += 1) { 16 | pinMode(DATA[n], OUTPUT); 17 | digitalWrite(DATA[n], LOW); 18 | } 19 | 20 | pinMode(HS_DATA_TAKEN, INPUT_PULLUP); 21 | pinMode(HS_DATA_READY, OUTPUT); 22 | digitalWrite(HS_DATA_READY, HIGH); 23 | 24 | //attachInterrupt(digitalPinToInterrupt(HS_DATA_TAKEN), onDataTaken, FALLING); 25 | //detachInterrupt(digitalPinToInterrupt(HS_DATA_TAKEN)); 26 | 27 | //delay(1000); 28 | keyboard.begin(DataPin, IRQpin); 29 | Serial.begin(57600); 30 | Serial.println("Keyboard Test:"); 31 | } 32 | 33 | void loop() { 34 | if (keyboard.available()) { 35 | 36 | // read the next key 37 | char c = keyboard.read(); 38 | // check for some of the special keys 39 | if (c == PS2_ENTER) { 40 | Serial.println(); 41 | } else if (c == PS2_TAB) { 42 | Serial.print("[Tab]"); 43 | } else if (c == PS2_ESC) { 44 | Serial.print("[ESC]"); 45 | } else if (c == PS2_PAGEDOWN) { 46 | Serial.print("[PgDn]"); 47 | } else if (c == PS2_PAGEUP) { 48 | Serial.print("[PgUp]"); 49 | } else if (c == PS2_LEFTARROW) { 50 | Serial.print("[Left]"); 51 | } else if (c == PS2_RIGHTARROW) { 52 | Serial.print("[Right]"); 53 | } else if (c == PS2_UPARROW) { 54 | Serial.print("[Up]"); 55 | } else if (c == PS2_DOWNARROW) { 56 | Serial.print("[Down]"); 57 | } else if (c == PS2_DELETE) { 58 | Serial.print("[Del]"); 59 | } else { 60 | 61 | // otherwise, just print all normal characters 62 | Serial.print(c); 63 | } 64 | Serial.println(); 65 | //sendChar(c); 66 | } 67 | } 68 | 69 | void sendChar(char c) 70 | { 71 | char msg[64]; 72 | char bitbuffer[9]; 73 | bitbuffer[8]=0; 74 | 75 | digitalWrite(HS_DATA_READY, HIGH); 76 | 77 | int mask = 1; 78 | for (int i=0; i<8; i++) { 79 | int bit = c & mask; 80 | if (bit) { 81 | bitbuffer[7-i]='1'; 82 | } else { 83 | bitbuffer[7-i]='0'; 84 | } 85 | digitalWrite(DATA[i], bit ? HIGH : LOW); 86 | mask = mask << 1; 87 | } 88 | sprintf(msg, "Writing %c (%s) to data bus...", c, bitbuffer); 89 | Serial.print(msg); 90 | 91 | digitalWrite(HS_DATA_READY, LOW); 92 | digitalWrite(HS_DATA_READY, HIGH); 93 | Serial.println("done."); 94 | } 95 | -------------------------------------------------------------------------------- /Arduino/keyboard_test_mega/keyboard_test_mega.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | const int DataPin = 4; 4 | const int IRQpin = 2; 5 | const int LedPin = 6; 6 | 7 | PS2Keyboard keyboard; 8 | 9 | void setup() { 10 | 11 | pinMode(LedPin, OUTPUT); 12 | digitalWrite(LedPin, LOW); 13 | 14 | delay(1000); 15 | keyboard.begin(DataPin, IRQpin); 16 | Serial.begin(19200); 17 | Serial.println("Ready!"); 18 | } 19 | 20 | void loop() { 21 | if (keyboard.available()) { 22 | 23 | // read the next key 24 | char c = keyboard.read(); 25 | digitalWrite(LedPin, HIGH); 26 | delay(500); 27 | digitalWrite(LedPin, LOW); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Arduino/serial_4313/serial_4313.ino: -------------------------------------------------------------------------------- 1 | void setup() { 2 | // put your setup code here, to run once: 3 | Serial.begin(19200); 4 | } 5 | 6 | void loop() { 7 | // put your main code here, to run repeatedly: 8 | Serial.println("Hello!"); 9 | delay(2000); 10 | } 11 | -------------------------------------------------------------------------------- /Datasheets/28c256.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/28c256.pdf -------------------------------------------------------------------------------- /Datasheets/74hc00.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/74hc00.pdf -------------------------------------------------------------------------------- /Datasheets/74lvc1g126gv.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/74lvc1g126gv.pdf -------------------------------------------------------------------------------- /Datasheets/74lvc1g157gv.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/74lvc1g157gv.pdf -------------------------------------------------------------------------------- /Datasheets/ATF22V10C-15PU.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/ATF22V10C-15PU.pdf -------------------------------------------------------------------------------- /Datasheets/DS_FT230X.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/DS_FT230X.pdf -------------------------------------------------------------------------------- /Datasheets/HD44780.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/HD44780.pdf -------------------------------------------------------------------------------- /Datasheets/R6551_Rockwell.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/R6551_Rockwell.pdf -------------------------------------------------------------------------------- /Datasheets/atmega644pa.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/atmega644pa.pdf -------------------------------------------------------------------------------- /Datasheets/atmega8535.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/atmega8535.pdf -------------------------------------------------------------------------------- /Datasheets/hm62256b.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/hm62256b.pdf -------------------------------------------------------------------------------- /Datasheets/sn74hc595.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/sn74hc595.pdf -------------------------------------------------------------------------------- /Datasheets/w65c02s.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/w65c02s.pdf -------------------------------------------------------------------------------- /Datasheets/w65c22.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/w65c22.pdf -------------------------------------------------------------------------------- /Datasheets/w65c51s.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Datasheets/w65c51s.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Dawid Buchwald 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Schematics/.gitignore: -------------------------------------------------------------------------------- 1 | */*.sch-bak 2 | */*.kicad_pcb-bak 3 | */*.bck 4 | */*.bak 5 | -------------------------------------------------------------------------------- /Schematics/555_troubleshoot/555_troubleshoot.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/555_troubleshoot/555_troubleshoot.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /Schematics/65C02_Computer/6502.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP 28C256 4 | F http://ww1.microchip.com/downloads/en/DeviceDoc/doc0006.pdf 5 | $ENDCMP 6 | # 7 | $CMP 62256 8 | F https://www.alliancememory.com/wp-content/uploads/pdf/AS6C62256.pdf 9 | $ENDCMP 10 | # 11 | $CMP 65C02S 12 | F https://www.westerndesigncenter.com/wdc/documentation/w65c02s.pdf 13 | $ENDCMP 14 | # 15 | $CMP 65C22S 16 | F https://www.westerndesigncenter.com/wdc/documentation/w65c22.pdf 17 | $ENDCMP 18 | # 19 | $CMP 65C51N 20 | F https://www.westerndesigncenter.com/wdc/documentation/w65c51n.pdf 21 | $ENDCMP 22 | # 23 | $CMP FT230XS 24 | F https://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT230X.pdf 25 | $ENDCMP 26 | # 27 | $CMP USB_B 28 | D USB Type B connector 29 | K connector USB 30 | F ~ 31 | $ENDCMP 32 | # 33 | #End Doc Library 34 | -------------------------------------------------------------------------------- /Schematics/65C02_Computer/65C02_Computer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Schematics/65C02_Computer/65C02_Computer.pdf -------------------------------------------------------------------------------- /Schematics/65C02_Computer/65C02_Computer.pretty/mini_din-6.kicad_mod: -------------------------------------------------------------------------------- 1 | (module mini_din-6 (layer F.Cu) (tedit 58E946D2) 2 | (descr "A footprint for the generic 6 pin Mini-DIN through hole connector with shell.") 3 | (tags "mini din 6pin connector socket") 4 | (fp_text reference REF** (at -1.27 -6.35) (layer F.SilkS) 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | ) 7 | (fp_text value Connector_Mini-DIN_Female_6Pin_2rows (at -0.03 10.15) (layer F.Fab) 8 | (effects (font (size 1 1) (thickness 0.15))) 9 | ) 10 | (fp_line (start 7.19 9) (end -9.81 9) (layer F.CrtYd) (width 0.05)) 11 | (fp_line (start 7.19 9) (end 7.19 -5.05) (layer F.CrtYd) (width 0.05)) 12 | (fp_line (start -9.81 -5.05) (end -9.81 9) (layer F.CrtYd) (width 0.05)) 13 | (fp_line (start -9.81 -5.05) (end 7.19 -5.05) (layer F.CrtYd) (width 0.05)) 14 | (fp_line (start -9.4 8.6) (end 6.8 8.6) (layer F.SilkS) (width 0.12)) 15 | (fp_line (start -9.4 -4.4) (end 6.8 -4.4) (layer F.SilkS) (width 0.12)) 16 | (fp_line (start -9.4 -4.4) (end -9.4 8.6) (layer F.SilkS) (width 0.12)) 17 | (fp_line (start 6.8 -4.4) (end 6.8 8.6) (layer F.SilkS) (width 0.12)) 18 | (fp_line (start -9.3 -4.3) (end 6.7 -4.3) (layer F.Fab) (width 0.1)) 19 | (fp_line (start -9.3 8.5) (end -9.3 -4.3) (layer F.Fab) (width 0.1)) 20 | (fp_line (start 6.7 8.5) (end -9.3 8.5) (layer F.Fab) (width 0.1)) 21 | (fp_line (start 6.7 -4.3) (end 6.7 8.5) (layer F.Fab) (width 0.1)) 22 | (fp_text user %R (at -1.27 -6.35) (layer F.Fab) 23 | (effects (font (size 1 1) (thickness 0.15))) 24 | ) 25 | (pad 7 thru_hole oval (at -1.3 3.65) (size 4 2) (drill oval 3 1) (layers *.Cu *.Mask)) 26 | (pad 6 thru_hole circle (at -4.7 -2.8) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 27 | (pad 5 thru_hole circle (at 2.1 -2.8) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 28 | (pad 4 thru_hole circle (at -4.7 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 29 | (pad 3 thru_hole circle (at 2.1 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 30 | (pad 2 thru_hole circle (at -2.6 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 31 | (pad 1 thru_hole rect (at 0 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)) 32 | (pad 7 thru_hole oval (at 5.55 2.85) (size 2 3.5) (drill oval 1 2.5) (layers *.Cu *.Mask)) 33 | (pad 7 thru_hole oval (at -8.15 2.85) (size 2 3.5) (drill oval 1 2.5) (layers *.Cu *.Mask)) 34 | ) 35 | -------------------------------------------------------------------------------- /Schematics/65C02_Computer/Gerbers/65C02_Computer-B_SilkS.gbo: -------------------------------------------------------------------------------- 1 | G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.5-0-10_14)* 2 | G04 #@! TF.CreationDate,2020-02-23T22:57:03+01:00* 3 | G04 #@! TF.ProjectId,65C02_Computer,36354330-325f-4436-9f6d-70757465722e,rev?* 4 | G04 #@! TF.SameCoordinates,Original* 5 | G04 #@! TF.FileFunction,Legend,Bot* 6 | G04 #@! TF.FilePolarity,Positive* 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2020-02-23 22:57:03* 10 | %MOMM*% 11 | %LPD*% 12 | G04 APERTURE LIST* 13 | G04 APERTURE END LIST* 14 | M02* 15 | -------------------------------------------------------------------------------- /Schematics/65C02_Computer/Gerbers/65C02_Computer-Edge_Cuts.gm1: -------------------------------------------------------------------------------- 1 | G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.5-0-10_14)* 2 | G04 #@! TF.CreationDate,2020-02-23T22:57:03+01:00* 3 | G04 #@! TF.ProjectId,65C02_Computer,36354330-325f-4436-9f6d-70757465722e,rev?* 4 | G04 #@! TF.SameCoordinates,Original* 5 | G04 #@! TF.FileFunction,Profile,NP* 6 | %FSLAX46Y46*% 7 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 8 | G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2020-02-23 22:57:03* 9 | %MOMM*% 10 | %LPD*% 11 | G04 APERTURE LIST* 12 | %ADD10C,0.050000*% 13 | G04 APERTURE END LIST* 14 | D10* 15 | X17780000Y-162560000D02* 16 | X17780000Y-27940000D01* 17 | X213360000Y-170180000D02* 18 | X25400000Y-170180000D01* 19 | X220980000Y-27940000D02* 20 | X220980000Y-162560000D01* 21 | X25400000Y-20320000D02* 22 | X213360000Y-20320000D01* 23 | X25400000Y-170180000D02* 24 | G75* 25 | G02X17780000Y-162560000I0J7620000D01* 26 | G01* 27 | X220980000Y-162560000D02* 28 | G75* 29 | G02X213360000Y-170180000I-7620000J0D01* 30 | G01* 31 | X213360000Y-20320000D02* 32 | G75* 33 | G02X220980000Y-27940000I0J-7620000D01* 34 | G01* 35 | X17780000Y-27940000D02* 36 | G75* 37 | G02X25400000Y-20320000I7620000J0D01* 38 | G01* 39 | M02* 40 | -------------------------------------------------------------------------------- /Schematics/65C02_Computer/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name 65C02_Computer)(type KiCad)(uri ${KIPRJMOD}/65C02_Computer.pretty)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /Schematics/65C02_Computer/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name 6502)(type Legacy)(uri ${KIPRJMOD}/6502.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /Schematics/ATMega_Programmer/74LVC1G.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /Schematics/ATMega_Programmer/74LVC1G.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # 74LVC1G07 5 | # 6 | DEF 74LVC1G07 U 0 40 Y Y 1 F N 7 | F0 "U" 0 350 50 H V C CNN 8 | F1 "74LVC1G07" 0 250 50 H V C CNN 9 | F2 "Package_TO_SOT_SMD:SOT-353_SC-70-5_Handsoldering" -50 -250 50 H I C CNN 10 | F3 "" -50 -100 50 H I C CNN 11 | DRAW 12 | S -250 200 250 -200 0 1 0 f 13 | X NC 1 -350 100 100 R 50 50 1 1 N 14 | X A 2 -350 0 100 R 50 50 1 1 I 15 | X GND 3 -350 -100 100 R 50 50 1 1 I 16 | X Y 4 350 -100 100 L 50 50 1 1 O 17 | X VCC 5 350 100 100 L 50 50 1 1 W 18 | ENDDRAW 19 | ENDDEF 20 | # 21 | # 74LVC1G125 22 | # 23 | DEF 74LVC1G125 U 0 40 Y Y 1 F N 24 | F0 "U" 0 350 50 H V C CNN 25 | F1 "74LVC1G125" 0 250 50 H V C CNN 26 | F2 "Package_SO:SC-74-6_1.5x2.9mm_P0.95mm" -50 -250 50 H I C CNN 27 | F3 "" -50 -100 50 H I C CNN 28 | DRAW 29 | S -250 200 250 -200 0 1 0 f 30 | X ~OE 1 -350 100 100 R 50 50 1 1 I 31 | X A 2 -350 0 100 R 50 50 1 1 I 32 | X GND 3 -350 -100 100 R 50 50 1 1 I 33 | X Y 4 350 -100 100 L 50 50 1 1 O 34 | X VCC 5 350 100 100 L 50 50 1 1 W 35 | ENDDRAW 36 | ENDDEF 37 | # 38 | # 74LVC1G157 39 | # 40 | DEF 74LVC1G157 U 0 40 Y Y 1 F N 41 | F0 "U" 0 350 50 H V C CNN 42 | F1 "74LVC1G157" 0 250 50 H V C CNN 43 | F2 "Package_SO:SC-74-6_1.5x2.9mm_P0.95mm" -50 -250 50 H I C CNN 44 | F3 "" -50 -100 50 H I C CNN 45 | DRAW 46 | S -250 200 250 -200 0 1 0 f 47 | X I1 1 -350 100 100 R 50 50 1 1 I 48 | X GND 2 -350 0 100 R 50 50 1 1 I 49 | X I0 3 -350 -100 100 R 50 50 1 1 I 50 | X Y 4 350 -100 100 L 50 50 1 1 O 51 | X VCC 5 350 0 100 L 50 50 1 1 W 52 | X S 6 350 100 100 L 50 50 1 1 I 53 | ENDDRAW 54 | ENDDEF 55 | # 56 | #End Library 57 | -------------------------------------------------------------------------------- /Schematics/ATMega_Programmer/ATMega_Programmer.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/ATMega_Programmer/ATMega_Programmer.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /Schematics/ATMega_Programmer/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name 74LVC1G157)(type Legacy)(uri ${KIPRJMOD}/74LVC1G157.lib)(options "")(descr "")(disabled)) 3 | (lib (name 74LVC1G126)(type Legacy)(uri ${KIPRJMOD}/74LVC1G126.lib)(options "")(descr "")(disabled)) 4 | (lib (name 74LVC1G)(type Legacy)(uri ${KIPRJMOD}/74LVC1G.lib)(options "")(descr "")) 5 | ) 6 | -------------------------------------------------------------------------------- /Schematics/Address_decoder_basic/Address_decoder_basic.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/Address_decoder_basic/Address_decoder_basic.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /Schematics/Address_decoder_basic_v2/Address_decoder_basic_v2.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/Address_decoder_basic_v2/Address_decoder_basic_v2.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /Schematics/Address_decoder_extended/Address_decoder_extended.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/Address_decoder_extended/Address_decoder_extended.pro: -------------------------------------------------------------------------------- 1 | update=22/05/2015 07:44:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | -------------------------------------------------------------------------------- /Schematics/Clock_module/Clock_module.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Schematics/Clock_module/Clock_module.pdf -------------------------------------------------------------------------------- /Schematics/Clock_module/Gerbers/Clock_module-B_SilkS.gbo: -------------------------------------------------------------------------------- 1 | G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.5-0-10_14)* 2 | G04 #@! TF.CreationDate,2020-02-23T22:31:09+01:00* 3 | G04 #@! TF.ProjectId,Clock_module,436c6f63-6b5f-46d6-9f64-756c652e6b69,rev?* 4 | G04 #@! TF.SameCoordinates,Original* 5 | G04 #@! TF.FileFunction,Legend,Bot* 6 | G04 #@! TF.FilePolarity,Positive* 7 | %FSLAX46Y46*% 8 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2020-02-23 22:31:09* 10 | %MOMM*% 11 | %LPD*% 12 | G04 APERTURE LIST* 13 | G04 APERTURE END LIST* 14 | M02* 15 | -------------------------------------------------------------------------------- /Schematics/Clock_module/Gerbers/Clock_module-Edge_Cuts.gm1: -------------------------------------------------------------------------------- 1 | G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.5-0-10_14)* 2 | G04 #@! TF.CreationDate,2020-02-23T22:31:09+01:00* 3 | G04 #@! TF.ProjectId,Clock_module,436c6f63-6b5f-46d6-9f64-756c652e6b69,rev?* 4 | G04 #@! TF.SameCoordinates,Original* 5 | G04 #@! TF.FileFunction,Profile,NP* 6 | %FSLAX46Y46*% 7 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 8 | G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2020-02-23 22:31:09* 9 | %MOMM*% 10 | %LPD*% 11 | G04 APERTURE LIST* 12 | %ADD10C,0.050000*% 13 | G04 APERTURE END LIST* 14 | D10* 15 | X166370000Y-99060000D02* 16 | X166370000Y-33020000D01* 17 | X172720000Y-105410000D02* 18 | G75* 19 | G02X166370000Y-99060000I0J6350000D01* 20 | G01* 21 | X261620000Y-105410000D02* 22 | X172720000Y-105410000D01* 23 | X267970000Y-99060000D02* 24 | G75* 25 | G02X261620000Y-105410000I-6350000J0D01* 26 | G01* 27 | X267970000Y-33020000D02* 28 | X267970000Y-99060000D01* 29 | X261620000Y-26670000D02* 30 | G75* 31 | G02X267970000Y-33020000I0J-6350000D01* 32 | G01* 33 | X172720000Y-26670000D02* 34 | X261620000Y-26670000D01* 35 | X166370000Y-33020000D02* 36 | G75* 37 | G02X172720000Y-26670000I6350000J0D01* 38 | G01* 39 | M02* 40 | -------------------------------------------------------------------------------- /Schematics/DB6502BOM.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Schematics/DB6502BOM.xlsx -------------------------------------------------------------------------------- /Schematics/DB6502BOMSortedQty.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Schematics/DB6502BOMSortedQty.xlsx -------------------------------------------------------------------------------- /Schematics/DB6502_v002/6502.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | $CMP 22V10C 4 | F http://www.farnell.com/datasheets/1627189.pdf 5 | $ENDCMP 6 | # 7 | $CMP 74HC238 8 | D Decoder 3 to 8 active high outputs 9 | $ENDCMP 10 | # 11 | #End Doc Library 12 | -------------------------------------------------------------------------------- /Schematics/DB6502_v002/DB6502_v002.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/DB6502_v002/DB6502_v002.pro: -------------------------------------------------------------------------------- 1 | update=09.09.2020 17:35:53 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | [schematic_editor] 35 | version=1 36 | PageLayoutDescrFile= 37 | PlotDirectoryName= 38 | SubpartIdSeparator=0 39 | SubpartFirstId=65 40 | NetFmtName= 41 | SpiceAjustPassiveValues=0 42 | LabSize=50 43 | ERC_TestSimilarLabels=1 44 | -------------------------------------------------------------------------------- /Schematics/DB6502_v002/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name 6502)(type Legacy)(uri ${KIPRJMOD}/6502.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /Schematics/DUART_expansion/DUART.dcm: -------------------------------------------------------------------------------- 1 | EESchema-DOCLIB Version 2.0 2 | # 3 | #End Doc Library 4 | -------------------------------------------------------------------------------- /Schematics/DUART_expansion/DUART.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.4 2 | #encoding utf-8 3 | # 4 | # SC26C92 5 | # 6 | DEF SC26C92 U 0 40 Y Y 1 F N 7 | F0 "U" 0 -100 50 H V C CNN 8 | F1 "SC26C92" 0 100 50 H V C CNN 9 | F2 "" 0 0 50 H I C CNN 10 | F3 "" 0 0 50 H I C CNN 11 | DRAW 12 | P 6 0 1 0 -700 550 -700 -700 700 -700 700 700 -550 700 -700 550 f 13 | X NC 1 0 800 100 D 50 50 1 1 N 14 | X RDN 10 -800 200 100 R 50 50 1 1 I I 15 | X RxDB 11 -800 100 100 R 50 50 1 1 I 16 | X NC 12 -800 0 100 R 50 50 1 1 N 17 | X TxDB 13 -800 -100 100 R 50 50 1 1 O 18 | X OP1 14 -800 -200 100 R 50 50 1 1 O 19 | X OP3 15 -800 -300 100 R 50 50 1 1 O 20 | X OP5 16 -800 -400 100 R 50 50 1 1 O 21 | X OP7 17 -800 -500 100 R 50 50 1 1 O 22 | X D1 18 -500 -800 100 U 50 50 1 1 B 23 | X D3 19 -400 -800 100 U 50 50 1 1 B 24 | X A0 2 -100 800 100 D 50 50 1 1 I 25 | X D5 20 -300 -800 100 U 50 50 1 1 B 26 | X D7 21 -200 -800 100 U 50 50 1 1 B 27 | X VSS 22 -100 -800 100 U 50 50 1 1 O 28 | X NC 23 0 -800 100 U 50 50 1 1 N 29 | X INTRN 24 100 -800 100 U 50 50 1 1 O I 30 | X D6 25 200 -800 100 U 50 50 1 1 B 31 | X D4 26 300 -800 100 U 50 50 1 1 B 32 | X D2 27 400 -800 100 U 50 50 1 1 B 33 | X D0 28 500 -800 100 U 50 50 1 1 B 34 | X OP6 29 800 -500 100 L 50 50 1 1 O 35 | X IP3 3 -200 800 100 D 50 50 1 1 I 36 | X OP4 30 800 -400 100 L 50 50 1 1 O 37 | X OP2 31 800 -300 100 L 50 50 1 1 O 38 | X OP0 32 800 -200 100 L 50 50 1 1 O 39 | X TxDA 33 800 -100 100 L 50 50 1 1 O 40 | X NC 34 800 0 100 L 50 50 1 1 N 41 | X RxDA 35 800 100 100 L 50 50 1 1 I 42 | X X1/CLK 36 800 200 100 L 50 50 1 1 I C 43 | X X2 37 800 300 100 L 50 50 1 1 O 44 | X RESET 38 800 400 100 L 50 50 1 1 I 45 | X CEN 39 800 500 100 L 50 50 1 1 I I 46 | X A1 4 -300 800 100 D 50 50 1 1 I 47 | X IP2 40 500 800 100 D 50 50 1 1 I 48 | X IP6 41 400 800 100 D 50 50 1 1 I 49 | X IP5 42 300 800 100 D 50 50 1 1 I 50 | X IP4 43 200 800 100 D 50 50 1 1 I 51 | X VCC 44 100 800 100 D 50 50 1 1 W 52 | X IP1 5 -400 800 100 D 50 50 1 1 I 53 | X A2 6 -500 800 100 D 50 50 1 1 I 54 | X A3 7 -800 500 100 R 50 50 1 1 I 55 | X IP0 8 -800 400 100 R 50 50 1 1 I 56 | X WRN 9 -800 300 100 R 50 50 1 1 I I 57 | ENDDRAW 58 | ENDDEF 59 | # 60 | #End Library 61 | -------------------------------------------------------------------------------- /Schematics/DUART_expansion/DUART_expansion.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 4) (host kicad "dummy file") ) 2 | -------------------------------------------------------------------------------- /Schematics/DUART_expansion/DUART_expansion.pro: -------------------------------------------------------------------------------- 1 | update=20.07.2020 18:48:42 2 | version=1 3 | last_client=kicad 4 | [general] 5 | version=1 6 | RootSch= 7 | BoardNm= 8 | [pcbnew] 9 | version=1 10 | LastNetListRead= 11 | UseCmpFile=1 12 | PadDrill=0.600000000000 13 | PadDrillOvalY=0.600000000000 14 | PadSizeH=1.500000000000 15 | PadSizeV=1.500000000000 16 | PcbTextSizeV=1.500000000000 17 | PcbTextSizeH=1.500000000000 18 | PcbTextThickness=0.300000000000 19 | ModuleTextSizeV=1.000000000000 20 | ModuleTextSizeH=1.000000000000 21 | ModuleTextSizeThickness=0.150000000000 22 | SolderMaskClearance=0.000000000000 23 | SolderMaskMinWidth=0.000000000000 24 | DrawSegmentWidth=0.200000000000 25 | BoardOutlineThickness=0.100000000000 26 | ModuleOutlineThickness=0.150000000000 27 | [cvpcb] 28 | version=1 29 | NetIExt=net 30 | [eeschema] 31 | version=1 32 | LibDir= 33 | [eeschema/libraries] 34 | [schematic_editor] 35 | version=1 36 | PageLayoutDescrFile= 37 | PlotDirectoryName= 38 | SubpartIdSeparator=0 39 | SubpartFirstId=65 40 | NetFmtName= 41 | SpiceAjustPassiveValues=0 42 | LabSize=50 43 | ERC_TestSimilarLabels=1 44 | -------------------------------------------------------------------------------- /Schematics/DUART_expansion/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name DUART)(type Legacy)(uri ${KIPRJMOD}/DUART.lib)(options "")(descr "")) 3 | ) 4 | -------------------------------------------------------------------------------- /Software/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /Software/common/firmware.basic.cfg: -------------------------------------------------------------------------------- 1 | MEMORY 2 | { 3 | ZP: start=$0000, size=$0100, type=rw; 4 | SYS_RAM: start=$0200, size=$0d00, type=rw, define=yes, fill=yes, fillval=$00, file=""; 5 | USERRAM: start=$1000, size=$3000, type=rw, define=yes, fill=yes, fillval=$00, file=""; 6 | VIA1: start=$6000, size=$2000, type=rw, define=yes, file=""; 7 | VIA2: start=$6000, size=$2000, type=rw, define=yes, file=""; 8 | ACIA: start=$6c00, size=$0200, type=rw, define=yes, file=""; 9 | ROM: start=$8000, size=$8000, type=ro, define=yes, fill=yes, fillval=$ea, file=%O; 10 | BAS_DUM: start=$0000, size=$00ff, file=""; 11 | } 12 | 13 | SEGMENTS 14 | { 15 | ZEROPAGE: load=ZP, type=ZP, define=yes; 16 | SYSRAM: load=SYS_RAM, type=rw, define=yes, align=$0100, optional=yes; 17 | BSS: load=SYS_RAM, type=bss, define=yes; 18 | STARTUP: load=ROM, type=ro, define=yes, optional=yes; 19 | CODE: load=ROM, type=ro, define=yes; 20 | DATA: load=ROM, type=rw, define=yes, run=SYS_RAM; 21 | RODATA: load=ROM, type=ro, define=yes, optional=yes; 22 | BAS_VEC: load=ROM, type=ro optional=yes; 23 | BAS_KEY: load=ROM, type=ro, optional=yes; 24 | BAS_ERR: load=ROM, type=ro, optional=yes; 25 | RODATA_PA: load=ROM, type=ro, define=yes, optional=yes, align=$0100; 26 | SYSCALLS: load=ROM, type=ro, define=yes, offset=$7800, optional=yes; 27 | VECTORS: load=ROM, type=ro, define=yes, offset=$7ffa, optional=yes; 28 | BAS_DUM: load=BAS_DUM, optional=yes; 29 | } 30 | -------------------------------------------------------------------------------- /Software/common/firmware.ext.cfg: -------------------------------------------------------------------------------- 1 | MEMORY 2 | { 3 | ZP: start=$0000, size=$0100, type=rw; 4 | SYS_RAM: start=$0200, size=$0d00, type=rw, define=yes, fill=yes, fillval=$00, file=""; 5 | USERRAM: start=$1000, size=$7000, type=rw, define=yes, fill=yes, fillval=$00, file=""; 6 | VIA1: start=$9000, size=$1000, type=rw, define=yes, file=""; 7 | VIA2: start=$8800, size=$0800, type=rw, define=yes, file=""; 8 | ACIA: start=$8400, size=$0400, type=rw, define=yes, file=""; 9 | FILLER: start=$8000, size=$2000, type=rw, fill=yes, fillval=$ea, file=%O; 10 | ROM: start=$a000, size=$6000, type=ro, define=yes, fill=yes, fillval=$ea, file=%O; 11 | BAS_DUM: start=$0000, size=$00ff, file=""; 12 | } 13 | 14 | SEGMENTS 15 | { 16 | ZEROPAGE: load=ZP, type=ZP, define=yes; 17 | SYSRAM: load=SYS_RAM, type=rw, define=yes, align=$0100, optional=yes; 18 | BSS: load=SYS_RAM, type=bss, define=yes; 19 | STARTUP: load=ROM, type=ro, define=yes, optional=yes; 20 | CODE: load=ROM, type=ro, define=yes; 21 | DATA: load=ROM, type=rw, define=yes, run=SYS_RAM; 22 | RODATA: load=ROM, type=ro, define=yes, optional=yes; 23 | BAS_VEC: load=ROM, type=ro optional=yes; 24 | BAS_KEY: load=ROM, type=ro, optional=yes; 25 | BAS_ERR: load=ROM, type=ro, optional=yes; 26 | RODATA_PA: load=ROM, type=ro, define=yes, optional=yes, align=$0100; 27 | SYSCALLS: load=ROM, type=ro, define=yes, offset=$5800, optional=yes; 28 | VECTORS: load=ROM, type=ro, define=yes, offset=$5ffa, optional=yes; 29 | BAS_DUM: load=BAS_DUM, optional=yes; 30 | } 31 | -------------------------------------------------------------------------------- /Software/common/include/acia.h: -------------------------------------------------------------------------------- 1 | #ifndef __ACIA_H 2 | #define __ACIA_H 3 | 4 | #define ACIA_DATA_AVAILABLE 1 5 | #define ACIA_NO_DATA_AVAILABLE 0 6 | 7 | extern void __fastcall__ acia_init(void); 8 | extern unsigned char __fastcall__ acia_is_data_available(void); 9 | extern unsigned char __fastcall__ acia_read_byte(void); 10 | extern void __fastcall__ acia_write_byte(const unsigned char c); 11 | extern void __fastcall__ acia_write_string(const unsigned char string[]); 12 | 13 | #endif -------------------------------------------------------------------------------- /Software/common/include/acia.inc: -------------------------------------------------------------------------------- 1 | .include "zeropage.inc" 2 | 3 | .import _acia_init 4 | .import _handle_acia_irq 5 | .import _acia_is_data_available 6 | .import _acia_read_byte 7 | .import _acia_write_byte 8 | .import _acia_write_string 9 | .import ACIA_STATUS 10 | 11 | ACIA_DATA_AVAILABLE = $01 12 | ACIA_NO_DATA_AVAILABLE = $00 13 | 14 | .macro write_acia string 15 | pha 16 | phx 17 | .if (.match (.left (1, {string}), #)) 18 | ; immediate mode 19 | lda #<(.right (.tcount ({string})-1, {string})) 20 | ldx #>(.right (.tcount ({string})-1, {string})) 21 | .else 22 | ; assume absolute or zero page 23 | lda string 24 | ldx 1+(string) 25 | .endif 26 | jsr _acia_write_string 27 | plx 28 | pla 29 | .endmacro 30 | -------------------------------------------------------------------------------- /Software/common/include/blink.h: -------------------------------------------------------------------------------- 1 | #ifndef __BLINK_H 2 | #define __BLINK_H 3 | 4 | #define BLINK_LED_ON 1 5 | #define BLINK_LED_OFF 0 6 | 7 | extern void __fastcall__ blink_init(void); 8 | extern void __fastcall__ blink_led(unsigned char on); 9 | extern void __fastcall__ strobe_led(void); 10 | 11 | #endif 12 | -------------------------------------------------------------------------------- /Software/common/include/blink.inc: -------------------------------------------------------------------------------- 1 | .import _blink_init 2 | .import _blink_led 3 | .import _strobe_led 4 | 5 | BLINK_LED_ON = $01 6 | BLINK_LED_OFF = $00 -------------------------------------------------------------------------------- /Software/common/include/clock.inc: -------------------------------------------------------------------------------- 1 | ; Translate clock mode flag to compilation parameters 2 | .if clock_mode_flag=0 ; slow 3 | fastclock=0 4 | clock_mhz=0 5 | clock_divider=0 6 | .else 7 | fastclock=1 8 | .if clock_mode_flag=1 ; 250k 9 | clock_mhz=0 10 | clock_divider=1 11 | .else 12 | clock_divider=0 13 | .if clock_mode_flag=2 ; 1m 14 | clock_mhz=1 15 | .elseif clock_mode_flag=3 ; 2m 16 | clock_mhz=2 17 | .elseif clock_mode_flag=4 ; 4m 18 | clock_mhz=4 19 | .elseif clock_mode_flag=5 ; 8m 20 | clock_mhz=8 21 | .endif 22 | .endif 23 | .endif 24 | -------------------------------------------------------------------------------- /Software/common/include/core.h: -------------------------------------------------------------------------------- 1 | #ifndef __CORE_H 2 | #define __CORE_H 3 | 4 | extern void __fastcall__ register_user_break(void (*user_break_handler)(void)); 5 | extern void __fastcall__ deregister_user_break(void); 6 | extern void __fastcall__ register_user_irq(void (*user_irq_handler)(void)); 7 | extern void __fastcall__ deregister_user_irq(void); 8 | 9 | #endif -------------------------------------------------------------------------------- /Software/common/include/core.inc: -------------------------------------------------------------------------------- 1 | .import _system_init 2 | .import _interrupt_handler 3 | .import _register_system_break 4 | .import _register_user_break 5 | .import _deregister_user_break 6 | .import _register_user_irq 7 | .import _deregister_user_irq 8 | 9 | .macro register_system_break address 10 | .if (.match (.left (1, {address}), #)) 11 | ; immediate mode 12 | lda #<(.right (.tcount ({address})-1, {address})) 13 | ldx #>(.right (.tcount ({address})-1, {address})) 14 | .else 15 | ; assume absolute or zero page 16 | lda address 17 | ldx 1+(address) 18 | .endif 19 | jsr _register_system_break 20 | .endmacro 21 | 22 | .macro register_user_break address 23 | .if (.match (.left (1, {address}), #)) 24 | ; immediate mode 25 | lda #<(.right (.tcount ({address})-1, {address})) 26 | ldx #>(.right (.tcount ({address})-1, {address})) 27 | .else 28 | ; assume absolute or zero page 29 | lda address 30 | ldx 1+(address) 31 | .endif 32 | jsr _register_user_break 33 | .endmacro 34 | 35 | .macro register_user_irq address 36 | .if (.match (.left (1, {address}), #)) 37 | ; immediate mode 38 | lda #<(.right (.tcount ({address})-1, {address})) 39 | ldx #>(.right (.tcount ({address})-1, {address})) 40 | .else 41 | ; assume absolute or zero page 42 | lda address 43 | ldx 1+(address) 44 | .endif 45 | jsr _register_user_irq 46 | .endmacro -------------------------------------------------------------------------------- /Software/common/include/keyboard.h: -------------------------------------------------------------------------------- 1 | #ifndef __KEYBOARD_H 2 | #define __KEYBOARD_H 3 | 4 | #define KEYBOARD_NO_DATA_AVAILABLE 0 5 | #define KEYBOARD_DATA_AVAILABLE 1 6 | 7 | #define KEYBOARD_NOT_CONNECTED 0 8 | #define KEYBOARD_CONNECTED 1 9 | 10 | #define KEY_SPACE 0x20 11 | #define KEY_ENTER 0x0d 12 | #define KEY_ESCAPE 0x1b 13 | #define KEY_BACKSPACE 0x7f 14 | #define KEY_ARROW_UP 0x0b 15 | #define KEY_ARROW_DOWN 0x0a 16 | #define KEY_ARROW_LEFT 0x08 17 | #define KEY_ARROW_RIGHT 0x15 18 | #define KEY_TAB 0x09 19 | #define KEY_PAGE_UP 0x19 20 | #define KEY_PAGE_DOWN 0x1a 21 | #define KEY_CTRL_X 0x18 22 | 23 | extern void __fastcall__ keyboard_init(void); 24 | extern unsigned char __fastcall__ keyboard_is_connected(void); 25 | extern unsigned char __fastcall__ keyboard_is_data_available(void); 26 | extern unsigned char __fastcall__ keyboard_read_char(void); 27 | 28 | #endif -------------------------------------------------------------------------------- /Software/common/include/keyboard.inc: -------------------------------------------------------------------------------- 1 | .import _keyboard_init 2 | .import _handle_keyboard_irq 3 | .import _keyboard_is_connected 4 | .import _keyboard_is_data_available 5 | .import _keyboard_read_char 6 | 7 | KEY_SPACE = $20 8 | KEY_ENTER = $0d 9 | KEY_ESCAPE = $1b 10 | KEY_BACKSPACE = $7f 11 | KEY_ARROW_UP = $0b 12 | KEY_ARROW_DOWN = $0a 13 | KEY_ARROW_LEFT = $08 14 | KEY_ARROW_RIGHT = $15 15 | KEY_TAB = $09 16 | KEY_PAGE_UP = $19 17 | KEY_PAGE_DOWN = $1a 18 | KEY_CTRL_X = $18 19 | 20 | KEYBOARD_NOT_CONNECTED = $00 21 | KEYBOARD_CONNECTED = $01 22 | 23 | KEYBOARD_NO_DATA_AVAILABLE = $00 24 | KEYBOARD_DATA_AVAILABLE = $01 -------------------------------------------------------------------------------- /Software/common/include/lcd.h: -------------------------------------------------------------------------------- 1 | #ifndef __LCD_H 2 | #define __LCD_H 3 | 4 | #define LCD_DM_CURSOR_NOBLINK 0b00000000 5 | #define LCD_DM_CURSOR_BLINK 0b00000001 6 | #define LCD_DM_CURSOR_OFF 0b00000000 7 | #define LCD_DM_CURSOR_ON 0b00000010 8 | #define LCD_DM_DISPLAY_OFF 0b00000000 9 | #define LCD_DM_DISPLAY_ON 0b00000100 10 | 11 | extern void __fastcall__ lcd_init(void); 12 | extern void __fastcall__ lcd_print(const unsigned char string[]); 13 | extern void __fastcall__ lcd_print_char(const unsigned char c); 14 | extern void __fastcall__ lcd_clear(void); 15 | extern void __fastcall__ lcd_backspace(void); 16 | extern void __fastcall__ lcd_newline(void); 17 | extern void __fastcall__ lcd_display_mode(const unsigned char mode); 18 | extern void __fastcall__ lcd_scroll_up(void); 19 | extern void __fastcall__ lcd_scroll_down(void); 20 | extern void __fastcall__ lcd_get_position(unsigned char* x_pos, unsigned char* y_pos); 21 | extern void __fastcall__ lcd_set_position(unsigned char x_pos, unsigned char y_pos); 22 | extern void __fastcall__ lcd_define_char(const unsigned char c, const unsigned char map[]); 23 | 24 | #endif -------------------------------------------------------------------------------- /Software/common/include/lcd.inc: -------------------------------------------------------------------------------- 1 | .include "zeropage.inc" 2 | .import _lcd_init 3 | .import _lcd_print 4 | .import _lcd_print_char 5 | .import _lcd_clear 6 | .import _lcd_get_position 7 | .import lcd_get_position 8 | .import _lcd_set_position 9 | .import lcd_set_position 10 | .import _lcd_backspace 11 | .import _lcd_newline 12 | .import _lcd_display_mode 13 | .import _lcd_scroll_up 14 | .import _lcd_scroll_down 15 | .import _lcd_define_char 16 | .import lcd_define_char 17 | 18 | ; Display mode command parameters 19 | LCD_DM_CURSOR_NOBLINK = %00000000 20 | LCD_DM_CURSOR_BLINK = %00000001 21 | LCD_DM_CURSOR_OFF = %00000000 22 | LCD_DM_CURSOR_ON = %00000010 23 | LCD_DM_DISPLAY_OFF = %00000000 24 | LCD_DM_DISPLAY_ON = %00000100 25 | 26 | .macro write_lcd string 27 | pha 28 | phx 29 | .if (.match (.left (1, {string}), #)) 30 | ; immediate mode 31 | lda #<(.right (.tcount ({string})-1, {string})) 32 | ldx #>(.right (.tcount ({string})-1, {string})) 33 | .else 34 | ; assume absolute or zero page 35 | lda string 36 | ldx 1+(string) 37 | .endif 38 | jsr _lcd_print 39 | plx 40 | pla 41 | .endmacro 42 | 43 | .macro lcd_define_char code, char_map 44 | pha 45 | .if (.match (.left (1, {char_map}), #)) 46 | ; immediate mode 47 | lda #<(.right (.tcount ({char_map})-1, {char_map})) 48 | sta ptr1 49 | lda #>(.right (.tcount ({char_map})-1, {char_map})) 50 | sta ptr1+1 51 | .else 52 | ; assume absolute or zero page 53 | lda string 54 | sta ptr1 55 | lda 1+(string) 56 | sta ptr1+1 57 | .endif 58 | lda #(code) 59 | jsr lcd_define_char 60 | pla 61 | .endmacro -------------------------------------------------------------------------------- /Software/common/include/menu.h: -------------------------------------------------------------------------------- 1 | #ifndef __MENU_H 2 | #define __MENU_H 3 | 4 | typedef struct _menuitem 5 | { 6 | unsigned char* cmd; 7 | unsigned char argc; 8 | unsigned char* desc; 9 | void (*function)(unsigned char tokens_buffer[]); 10 | unsigned char size; 11 | } menuitem; 12 | 13 | extern void __fastcall__ run_menu(menuitem menu[], const unsigned char prompt[]); 14 | extern void __fastcall__ setup_menuitem(menuitem* item, const unsigned char cmd[], const unsigned char argc, 15 | const unsigned char desc[], void (*function)(unsigned char tokens_buffer[])); 16 | 17 | #endif -------------------------------------------------------------------------------- /Software/common/include/menu.inc: -------------------------------------------------------------------------------- 1 | .import _run_menu 2 | .import run_menu 3 | .import _setup_menuitem 4 | 5 | .macro menuitem cmd, argc, desc, function 6 | .local start_item 7 | .local next_item 8 | start_item: 9 | .word cmd 10 | .byte argc 11 | .word desc 12 | .word function 13 | .byte next_item - start_item 14 | next_item: 15 | .endmacro 16 | 17 | .macro endmenu 18 | .byte $00, $00, $ff 19 | .endmacro 20 | 21 | .macro run_menu menu, prompt 22 | .if (.match (.left (1, {menu}), #)) 23 | ; immediate mode 24 | lda #<(.right (.tcount ({menu})-1, {menu})) 25 | sta ptr1 26 | lda #>(.right (.tcount ({menu})-1, {menu})) 27 | sta ptr1+1 28 | .else 29 | ; assume absolute or zero page 30 | lda menu 31 | sta ptr1 32 | lda 1+(menu) 33 | sta menu+1 34 | .endif 35 | .if (.match (.left (1, {prompt}), #)) 36 | ; immediate mode 37 | lda #<(.right (.tcount ({prompt})-1, {prompt})) 38 | sta ptr2 39 | lda #>(.right (.tcount ({prompt})-1, {prompt})) 40 | sta ptr2+1 41 | .else 42 | ; assume absolute or zero page 43 | lda prompt 44 | sta ptr2 45 | lda 1+(prompt) 46 | sta ptr2+1 47 | .endif 48 | jsr run_menu 49 | .endmacro 50 | -------------------------------------------------------------------------------- /Software/common/include/modem.h: -------------------------------------------------------------------------------- 1 | #ifndef __MODEM_H 2 | #define __MODEM_H 3 | 4 | #define MODEM_RECEIVE_FAILED 0 5 | #define MODEM_RECEIVE_SUCCESS 1 6 | #define MODEM_RECEIVE_CANCELLED 2 7 | 8 | extern unsigned char __fastcall__ modem_send(void); 9 | extern unsigned char __fastcall__ modem_receive(void); 10 | 11 | #endif -------------------------------------------------------------------------------- /Software/common/include/modem.inc: -------------------------------------------------------------------------------- 1 | .import _modem_send 2 | .import _modem_receive 3 | 4 | MODEM_RECEIVE_FAILED = $00 5 | MODEM_RECEIVE_SUCCESS = $01 6 | MODEM_RECEIVE_CANCELLED = $02 -------------------------------------------------------------------------------- /Software/common/include/parse.h: -------------------------------------------------------------------------------- 1 | #ifndef __PARSE_H 2 | #define __PARSE_H 3 | 4 | #define PARSE_SUCCESS 1 5 | #define PARSE_FAILED 0 6 | 7 | extern unsigned char __fastcall__ parse_onoff(unsigned char token[], unsigned char buffer[]); 8 | extern unsigned char __fastcall__ parse_hex_byte(unsigned char token[], unsigned char buffer[]); 9 | extern unsigned char __fastcall__ parse_hex_word(unsigned char token[], unsigned char buffer[]); 10 | extern unsigned char __fastcall__ parse_dec_word(unsigned char token[], unsigned char buffer[]); 11 | 12 | #endif -------------------------------------------------------------------------------- /Software/common/include/parse.inc: -------------------------------------------------------------------------------- 1 | .import _parse_onoff 2 | .import parse_onoff 3 | .import _parse_hex_byte 4 | .import parse_hex_byte 5 | .import _parse_hex_word 6 | .import parse_hex_word 7 | .import _parse_dec_word 8 | .import parse_dec_word 9 | 10 | .macro parse_onoff token 11 | phx 12 | .if (.match (.left (1, {token}), #)) 13 | ; immediate mode 14 | lda #<(.right (.tcount ({token})-1, {token})) 15 | ldx #>(.right (.tcount ({token})-1, {token})) 16 | .else 17 | ; assume absolute or zero page 18 | lda token 19 | ldx 1+(token) 20 | .endif 21 | jsr parse_onoff 22 | plx 23 | .endmacro 24 | 25 | .macro parse_hex_byte token 26 | phx 27 | .if (.match (.left (1, {token}), #)) 28 | ; immediate mode 29 | lda #<(.right (.tcount ({token})-1, {token})) 30 | ldx #>(.right (.tcount ({token})-1, {token})) 31 | .else 32 | ; assume absolute or zero page 33 | lda token 34 | ldx 1+(token) 35 | .endif 36 | jsr parse_hex_byte 37 | plx 38 | .endmacro 39 | 40 | .macro parse_hex_word token 41 | .if (.match (.left (1, {token}), #)) 42 | ; immediate mode 43 | lda #<(.right (.tcount ({token})-1, {token})) 44 | ldx #>(.right (.tcount ({token})-1, {token})) 45 | .else 46 | ; assume absolute or zero page 47 | lda token 48 | ldx 1+(token) 49 | .endif 50 | jsr parse_hex_word 51 | .endmacro 52 | 53 | .macro parse_dec_word token 54 | .if (.match (.left (1, {token}), #)) 55 | ; immediate mode 56 | lda #<(.right (.tcount ({token})-1, {token})) 57 | ldx #>(.right (.tcount ({token})-1, {token})) 58 | .else 59 | ; assume absolute or zero page 60 | lda token 61 | ldx 1+(token) 62 | .endif 63 | jsr parse_dec_word 64 | .endmacro 65 | -------------------------------------------------------------------------------- /Software/common/include/string.h: -------------------------------------------------------------------------------- 1 | #ifndef __STRING_H 2 | #define __STRING_H 3 | 4 | extern void __fastcall__ strcopy(const unsigned char input[], unsigned char output[]); 5 | extern unsigned char __fastcall__ strcompare(const unsigned char string1[], const unsigned char string2[]); 6 | extern unsigned char __fastcall__ strlength(const unsigned char string[]); 7 | extern void __fastcall__ strtoupper(unsigned char string[]); 8 | extern void __fastcall__ strtolower(unsigned char string[]); 9 | extern void __fastcall__ strtriml(unsigned char string[]); 10 | extern void __fastcall__ strtrimr(unsigned char string[]); 11 | extern unsigned char __fastcall__ strtokenize(const unsigned char string[], unsigned char buffer[]); 12 | extern unsigned char* __fastcall__ strgettoken(const unsigned char tokens_buffer[], unsigned char n); 13 | 14 | #endif __STRING_H -------------------------------------------------------------------------------- /Software/common/include/sys_const.inc: -------------------------------------------------------------------------------- 1 | ACIA_RX_BUFFER_SIZE = 256 2 | ACIA_TX_BUFFER_SIZE = 256 3 | KEYBOARD_BUFFER_SIZE = 64 4 | 5 | LCD_COLUMNS = 20 6 | LCD_ROWS = 4 7 | 8 | CHAR_END_OF_STRING = $00 9 | CHAR_SPACE = $20 10 | CHAR_TAB = $09 11 | CHAR_DOUBLEQUOTE = $22 12 | CHAR_BACKSLASH = $5c 13 | -------------------------------------------------------------------------------- /Software/common/include/sysram_map.inc: -------------------------------------------------------------------------------- 1 | .forceimport acia_rx_buffer 2 | .forceimport acia_tx_buffer 3 | .forceimport keyboard_buffer 4 | .forceimport lcd_line_buffer 5 | -------------------------------------------------------------------------------- /Software/common/include/tty.h: -------------------------------------------------------------------------------- 1 | #ifndef __TTY_H 2 | #define __TTY_H 3 | 4 | extern void __fastcall__ tty_init(const unsigned char mode); 5 | extern void __fastcall__ tty_write(const unsigned char string[]); 6 | extern void __fastcall__ tty_writeln(const unsigned char string[]); 7 | extern void __fastcall__ tty_write_hex(const unsigned char c); 8 | extern void __fastcall__ tty_send_newline(void); 9 | extern void __fastcall__ tty_read_line(unsigned char buffer[], const unsigned char size); 10 | extern void __fastcall__ tty_send_character(const unsigned char c); 11 | 12 | #endif -------------------------------------------------------------------------------- /Software/common/include/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef __UTILS_H 2 | #define __UTILS_H 3 | 4 | extern void __fastcall__ delay_ms(const unsigned char ms); 5 | extern void __fastcall__ delay_sec(const unsigned char sec); 6 | extern void __fastcall__ convert_to_hex(const unsigned char c, unsigned char buffer[]); 7 | extern void __fastcall__ convert_hex_to_dec(const unsigned char hex[], unsigned char buffer[]); 8 | 9 | #endif -------------------------------------------------------------------------------- /Software/common/include/utils.inc: -------------------------------------------------------------------------------- 1 | .import _delay_ms 2 | .import _delay_sec 3 | .import _convert_to_hex 4 | .import convert_to_hex 5 | .import _convert_hex_to_dec 6 | .import convert_hex_to_dec 7 | 8 | .macro convert_hex_to_dec hex_num, dec_buffer 9 | .if (.match (.left (1, {dec_buffer}), #)) 10 | ; immediate mode 11 | lda #<(.right (.tcount ({dec_buffer})-1, {dec_buffer})) 12 | sta ptr1 13 | lda #>(.right (.tcount ({dec_buffer})-1, {dec_buffer})) 14 | sta ptr1+1 15 | .else 16 | ; assume absolute or zero page 17 | lda dec_buffer 18 | sta ptr1 19 | lda 1+(dec_buffer) 20 | sta ptr1+1 21 | .endif 22 | .if (.match (.left (1, {hex_num}), #)) 23 | ; immediate mode 24 | lda #<(.right (.tcount ({hex_num})-1, {hex_num})) 25 | ldx #>(.right (.tcount ({hex_num})-1, {hex_num})) 26 | .else 27 | ; assume absolute or zero page 28 | lda hex_num 29 | ldx 1+(hex_num) 30 | .endif 31 | jsr convert_hex_to_dec 32 | .endmacro 33 | -------------------------------------------------------------------------------- /Software/common/include/via.inc: -------------------------------------------------------------------------------- 1 | .import VIA1_PORTB 2 | .import VIA1_PORTA 3 | .import VIA1_DDRB 4 | .import VIA1_DDRA 5 | .import VIA1_T1CL 6 | .import VIA1_T1CH 7 | .import VIA1_T1LL 8 | .import VIA1_T1LH 9 | .import VIA1_T2CL 10 | .import VIA1_T2CH 11 | .import VIA1_SR 12 | .import VIA1_ACR 13 | .import VIA1_PCR 14 | .import VIA1_IFR 15 | .import VIA1_IER 16 | .import VIA1_PANH 17 | 18 | .import VIA2_PORTB 19 | .import VIA2_PORTA 20 | .import VIA2_DDRB 21 | .import VIA2_DDRA 22 | .import VIA2_T1CL 23 | .import VIA2_T1CH 24 | .import VIA2_T1LL 25 | .import VIA2_T1LH 26 | .import VIA2_T2CL 27 | .import VIA2_T2CH 28 | .import VIA2_SR 29 | .import VIA2_ACR 30 | .import VIA2_PCR 31 | .import VIA2_IFR 32 | .import VIA2_IER 33 | .import VIA2_PANH 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Software/common/include/via_utils.inc: -------------------------------------------------------------------------------- 1 | .import via2_get_register 2 | .import _via2_get_register 3 | .import via2_set_register 4 | .import _via2_set_register 5 | 6 | 7 | .macro via2_get_register reg 8 | ldx #reg 9 | jsr via2_get_register 10 | .endmacro 11 | 12 | .macro via2_set_register reg, value 13 | ldx #reg 14 | lda value 15 | jsr via2_set_register 16 | .endmacro 17 | -------------------------------------------------------------------------------- /Software/common/include/zeropage.inc: -------------------------------------------------------------------------------- 1 | .globalzp sp 2 | .globalzp sreg 3 | .globalzp regsave 4 | .globalzp tmp1 5 | .globalzp tmp2 6 | .globalzp tmp3 7 | .globalzp tmp4 8 | .globalzp ptr1 9 | .globalzp ptr2 10 | .globalzp ptr3 11 | .globalzp ptr4 12 | .globalzp lcd_temp_char1 13 | .globalzp lcd_temp_char2 14 | .globalzp lcd_temp_char3 15 | .globalzp acia_rx_rptr 16 | .globalzp acia_rx_wptr 17 | .globalzp acia_tx_rptr 18 | .globalzp acia_tx_wptr 19 | .globalzp keyboard_conn 20 | .globalzp keyboard_rptr 21 | .globalzp keyboard_wptr 22 | .globalzp tty_config 23 | .globalzp system_break_flag 24 | .globalzp system_break_address 25 | .globalzp system_break_sp 26 | .globalzp user_break_address 27 | .globalzp user_break_sp 28 | .globalzp user_irq_address 29 | 30 | -------------------------------------------------------------------------------- /Software/common/load.cfg: -------------------------------------------------------------------------------- 1 | MEMORY 2 | { 3 | ZP: start=$0000, size=$0100, type=rw; 4 | SYS_RAM: start=$0200, size=$0d00, type=rw, define=yes, fill=yes, fillval=$00, file=""; 5 | LOADAREA: start=$1000, size=$2000, type=rw, fill=yes, fillval=$00, define=yes, file=%O; 6 | USERRAM: start=$3000, size=$5000, type=rw, fill=yes, fillval=$00, define=yes, file=""; 7 | VIA1: start=$9000, size=$1000, type=rw, define=yes, file=""; 8 | VIA2: start=$8800, size=$0800, type=rw, define=yes, file=""; 9 | ACIA: start=$8400, size=$0400, type=rw, define=yes, file=""; 10 | ROM: start=$8000, size=$8000, type=ro, define=yes, fill=yes, fillval=$ea, file=""; 11 | BAS_DUM: start=$0000, size=$00ff, file=""; 12 | } 13 | 14 | SEGMENTS 15 | { 16 | ZEROPAGE: load=ZP, type=ZP, define=yes; 17 | SYSRAM: load=SYS_RAM, type=rw, define=yes, align=$0100, optional=yes; 18 | STARTUP: load=LOADAREA, type=ro, define=yes, optional=yes; 19 | CODE: load=LOADAREA, type=ro, define=yes; 20 | RODATA: load=LOADAREA, type=ro, define=yes, optional=yes; 21 | BAS_VEC: load=LOADAREA, type=ro optional=yes; 22 | BAS_KEY: load=LOADAREA, type=ro, optional=yes; 23 | BAS_ERR: load=LOADAREA, type=ro, optional=yes; 24 | RODATA_PA: load=LOADAREA, type=ro, define=yes, optional=yes, align=$0100; 25 | BSS: load=USERRAM, type=bss, define=yes; 26 | DATA: load=USERRAM, type=rw, define=yes, optional=yes; 27 | SYSCALLS: load=ROM, type=ro, define=yes, offset=$7800, optional=yes; 28 | VECTORS: load=ROM, type=ro, define=yes, offset=$7ffa, optional=yes; 29 | BAS_DUM: load=BAS_DUM, optional=yes; 30 | } 31 | -------------------------------------------------------------------------------- /Software/common/loadtrim.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | in_file=open(sys.argv[1], "rb") 4 | 5 | binary_input=in_file.read() 6 | in_file.close() 7 | 8 | nonzero_index = len(binary_input)-1 9 | 10 | while (ord(binary_input[nonzero_index]) == 0): 11 | nonzero_index=nonzero_index-1 12 | 13 | binary_output = bytearray([0x00] * (nonzero_index+4)) 14 | 15 | for copy_index in range(nonzero_index+2): 16 | binary_output[copy_index+2] = binary_input[copy_index] 17 | 18 | binary_output[0x0000]=0x00 19 | binary_output[0x0001]=0x10 20 | 21 | out_file=open(sys.argv[2], "wb") 22 | 23 | out_file.write(binary_output) 24 | 25 | out_file.close() 26 | 27 | 28 | -------------------------------------------------------------------------------- /Software/common/none.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/Software/common/none.lib -------------------------------------------------------------------------------- /Software/common/source/blink.s: -------------------------------------------------------------------------------- 1 | .include "via.inc" 2 | .include "utils.inc" 3 | 4 | .export _blink_init 5 | .export _blink_led 6 | .export _strobe_led 7 | 8 | BLINK_LED_ON = $01 9 | BLINK_LED_OFF = $00 10 | 11 | .code 12 | ; POSITIVE C COMPLIANT 13 | ; Initialize DDRB bit to output 14 | _blink_init: 15 | pha 16 | lda VIA1_DDRB 17 | ora #%00000001 18 | sta VIA1_DDRB 19 | pla 20 | rts 21 | 22 | ; POSITIVE C COMPLIANT - input in A 23 | ; no return value, no temp variables 24 | _blink_led: 25 | ; store current value of accumulator 26 | pha 27 | cmp #(BLINK_LED_OFF) 28 | beq @disable_led 29 | ; if carry clear - disable LED 30 | ; enable LED otherwise 31 | lda VIA1_PORTB 32 | ora #%00000001 33 | bra @send_signal 34 | @disable_led: 35 | ; send signal 36 | lda VIA1_PORTB 37 | and #%11111110 38 | @send_signal: 39 | sta VIA1_PORTB 40 | ; restore accumulator value 41 | pla 42 | rts 43 | 44 | ; POSITIVE C COMPLIANT 45 | ; Short "on/off" blink 46 | _strobe_led: 47 | pha 48 | lda #(BLINK_LED_ON) 49 | jsr _blink_led 50 | lda #150 51 | jsr _delay_ms 52 | lda #(BLINK_LED_OFF) 53 | jsr _blink_led 54 | lda #150 55 | jsr _delay_ms 56 | pla 57 | rts -------------------------------------------------------------------------------- /Software/common/source/crt0.s: -------------------------------------------------------------------------------- 1 | .include "zeropage.inc" 2 | .import _main 3 | .import copydata 4 | .import zerobss 5 | 6 | .export __STARTUP__ : absolute = 1 7 | 8 | .segment "STARTUP" 9 | init: 10 | jsr zerobss 11 | jsr copydata 12 | jsr _main 13 | rts 14 | 15 | 16 | -------------------------------------------------------------------------------- /Software/common/source/sysram_map.s: -------------------------------------------------------------------------------- 1 | .include "sys_const.inc" 2 | 3 | .export acia_rx_buffer 4 | .export acia_tx_buffer 5 | .export keyboard_buffer 6 | .export lcd_line_buffer 7 | 8 | .segment "SYSRAM" 9 | .align 256 10 | 11 | acia_rx_buffer: 12 | .res ACIA_RX_BUFFER_SIZE 13 | acia_tx_buffer: 14 | .res ACIA_TX_BUFFER_SIZE 15 | keyboard_buffer: 16 | .res KEYBOARD_BUFFER_SIZE 17 | lcd_line_buffer: 18 | .res LCD_COLUMNS 19 | 20 | -------------------------------------------------------------------------------- /Software/common/source/via.s: -------------------------------------------------------------------------------- 1 | .include "via_const.inc" 2 | 3 | .import __VIA1_START__ 4 | .import __VIA2_START__ 5 | 6 | .export VIA1_PORTB 7 | .export VIA1_PORTA 8 | .export VIA1_DDRB 9 | .export VIA1_DDRA 10 | .export VIA1_T1CL 11 | .export VIA1_T1CH 12 | .export VIA1_T1LL 13 | .export VIA1_T1LH 14 | .export VIA1_T2CL 15 | .export VIA1_T2CH 16 | .export VIA1_SR 17 | .export VIA1_ACR 18 | .export VIA1_PCR 19 | .export VIA1_IFR 20 | .export VIA1_IER 21 | .export VIA1_PANH 22 | 23 | .export VIA2_PORTB 24 | .export VIA2_PORTA 25 | .export VIA2_DDRB 26 | .export VIA2_DDRA 27 | .export VIA2_T1CL 28 | .export VIA2_T1CH 29 | .export VIA2_T1LL 30 | .export VIA2_T1LH 31 | .export VIA2_T2CL 32 | .export VIA2_T2CH 33 | .export VIA2_SR 34 | .export VIA2_ACR 35 | .export VIA2_PCR 36 | .export VIA2_IFR 37 | .export VIA2_IER 38 | .export VIA2_PANH 39 | 40 | VIA1_PORTB = __VIA1_START__ + VIA_REGISTER_PORTB 41 | VIA1_PORTA = __VIA1_START__ + VIA_REGISTER_PORTA 42 | VIA1_DDRB = __VIA1_START__ + VIA_REGISTER_DDRB 43 | VIA1_DDRA = __VIA1_START__ + VIA_REGISTER_DDRA 44 | VIA1_T1CL = __VIA1_START__ + VIA_REGISTER_T1CL 45 | VIA1_T1CH = __VIA1_START__ + VIA_REGISTER_T1CH 46 | VIA1_T1LL = __VIA1_START__ + VIA_REGISTER_T1LL 47 | VIA1_T1LH = __VIA1_START__ + VIA_REGISTER_T1LH 48 | VIA1_T2CL = __VIA1_START__ + VIA_REGISTER_T2CL 49 | VIA1_T2CH = __VIA1_START__ + VIA_REGISTER_T2CH 50 | VIA1_SR = __VIA1_START__ + VIA_REGISTER_SR 51 | VIA1_ACR = __VIA1_START__ + VIA_REGISTER_ACR 52 | VIA1_PCR = __VIA1_START__ + VIA_REGISTER_PCR 53 | VIA1_IFR = __VIA1_START__ + VIA_REGISTER_IFR 54 | VIA1_IER = __VIA1_START__ + VIA_REGISTER_IER 55 | VIA1_PANH = __VIA1_START__ + VIA_REGISTER_PANH 56 | 57 | VIA2_PORTB = __VIA2_START__ + VIA_REGISTER_PORTB 58 | VIA2_PORTA = __VIA2_START__ + VIA_REGISTER_PORTA 59 | VIA2_DDRB = __VIA2_START__ + VIA_REGISTER_DDRB 60 | VIA2_DDRA = __VIA2_START__ + VIA_REGISTER_DDRA 61 | VIA2_T1CL = __VIA2_START__ + VIA_REGISTER_T1CL 62 | VIA2_T1CH = __VIA2_START__ + VIA_REGISTER_T1CH 63 | VIA2_T1LL = __VIA2_START__ + VIA_REGISTER_T1LL 64 | VIA2_T1LH = __VIA2_START__ + VIA_REGISTER_T1LH 65 | VIA2_T2CL = __VIA2_START__ + VIA_REGISTER_T2CL 66 | VIA2_T2CH = __VIA2_START__ + VIA_REGISTER_T2CH 67 | VIA2_SR = __VIA2_START__ + VIA_REGISTER_SR 68 | VIA2_ACR = __VIA2_START__ + VIA_REGISTER_ACR 69 | VIA2_PCR = __VIA2_START__ + VIA_REGISTER_PCR 70 | VIA2_IFR = __VIA2_START__ + VIA_REGISTER_IFR 71 | VIA2_IER = __VIA2_START__ + VIA_REGISTER_IER 72 | VIA2_PANH = __VIA2_START__ + VIA_REGISTER_PANH 73 | -------------------------------------------------------------------------------- /Software/common/source/via_utils.s: -------------------------------------------------------------------------------- 1 | .include "via_const.inc" 2 | .include "macros.inc" 3 | .include "zeropage.inc" 4 | 5 | .import __VIA2_START__ 6 | .export via2_get_register 7 | .export _via2_get_register 8 | .export via2_set_register 9 | .export _via2_set_register 10 | 11 | .code 12 | 13 | ; NEGATIVE C COMPLIANT 14 | via2_get_register: 15 | ; ; DUMB Code left here for reference. This is possibly the 16 | ; ; most idiotic code I have written in years 17 | ; pha 18 | ; lda #<__VIA2_START__ 19 | ; sta ptr1 20 | ; lda #>__VIA2_START__ 21 | ; sta ptr1+1 22 | ; pla 23 | ; clc 24 | ; adc ptr1 25 | ; sta ptr1 26 | ; lda #$00 27 | ; adc ptr1+1 28 | ; sta ptr1+1 29 | ; lda (ptr1) 30 | ; rts 31 | lda __VIA2_START__,X 32 | rts 33 | 34 | ; C version of the set register routine 35 | _via2_get_register: 36 | tax 37 | lda __VIA2_START__,X 38 | rts 39 | 40 | ; NEGATIVE C COMPLIANT 41 | via2_set_register: 42 | ; ; DUMB Code left here for reference. This is possibly the 43 | ; ; most idiotic code I have written in years 44 | ; pha 45 | ; lda #<__VIA2_START__ 46 | ; sta ptr1 47 | ; lda #>__VIA2_START__ 48 | ; sta ptr1+1 49 | ; pla 50 | ; clc 51 | ; adc ptr1 52 | ; sta ptr1 53 | ; lda #$00 54 | ; adc ptr1+1 55 | ; sta ptr1+1 56 | ; txa 57 | ; sta (ptr1) 58 | ; rts 59 | sta __VIA2_START__,X 60 | rts 61 | 62 | ; C version of the set register routine 63 | _via2_set_register: 64 | pha 65 | lda (sp) 66 | tax 67 | pla 68 | sta __VIA2_START__,X 69 | inc_ptr sp 70 | rts -------------------------------------------------------------------------------- /Software/common/source/zeropage.s: -------------------------------------------------------------------------------- 1 | .include "zeropage.inc" 2 | 3 | .zeropage 4 | 5 | sp: .res 2 6 | sreg: .res 2 7 | regsave: .res 4 8 | ptr1: .res 2 9 | ptr2: .res 2 10 | ptr3: .res 2 11 | ptr4: .res 2 12 | tmp1: .res 1 13 | tmp2: .res 1 14 | tmp3: .res 1 15 | tmp4: .res 1 16 | lcd_temp_char1: .res 1 17 | lcd_temp_char2: .res 1 18 | lcd_temp_char3: .res 1 19 | acia_rx_rptr: .res 1 20 | acia_rx_wptr: .res 1 21 | acia_tx_rptr: .res 1 22 | acia_tx_wptr: .res 1 23 | keyboard_conn: .res 1 24 | keyboard_rptr: .res 1 25 | keyboard_wptr: .res 1 26 | tty_config: .res 1 27 | system_break_flag: .res 1 28 | system_break_address: .res 2 29 | system_break_sp: .res 1 30 | user_break_address: .res 2 31 | user_break_sp: .res 1 32 | user_irq_address: .res 2 33 | -------------------------------------------------------------------------------- /Software/load/01_blink_test/blink_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "blink.inc" 3 | .include "utils.inc" 4 | 5 | .segment "VECTORS" 6 | 7 | .word $0000 8 | .word init 9 | .word $0000 10 | 11 | .code 12 | init: 13 | jsr _blink_init 14 | ldx #10 15 | main_loop: 16 | lda #(BLINK_LED_ON) 17 | jsr _blink_led 18 | lda #250 19 | jsr _delay_ms 20 | lda #(BLINK_LED_OFF) 21 | jsr _blink_led 22 | lda #250 23 | jsr _delay_ms 24 | dex 25 | bne main_loop 26 | rts 27 | -------------------------------------------------------------------------------- /Software/load/01_blink_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=01_blink_test 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=blink_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/02_hello_world/hello_world.s: -------------------------------------------------------------------------------- 1 | .include "lcd.inc" 2 | .include "utils.inc" 3 | 4 | .segment "VECTORS" 5 | 6 | .word $0000 7 | .word init 8 | .word $0000 9 | 10 | .code 11 | init: 12 | jsr _lcd_init 13 | write_lcd #message 14 | lda #$03 15 | jsr _delay_sec 16 | jsr _lcd_clear 17 | rts 18 | 19 | .segment "RODATA" 20 | message: .byte "Hello World from loadable module!", $00 21 | -------------------------------------------------------------------------------- /Software/load/02_hello_world/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=02_hello_world 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=hello_world.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/03_string_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=03_string_test 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=string_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/04_blink_large/blink_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "blink.inc" 3 | .include "utils.inc" 4 | 5 | .segment "VECTORS" 6 | 7 | .word $0000 8 | .word init 9 | .word $0000 10 | 11 | .code 12 | init: 13 | jsr _blink_init 14 | ldx #10 15 | main_loop: 16 | lda #(BLINK_LED_ON) 17 | jsr _blink_led 18 | lda #250 19 | jsr _delay_ms 20 | lda #(BLINK_LED_OFF) 21 | jsr _blink_led 22 | lda #250 23 | jsr _delay_ms 24 | dex 25 | bne main_loop 26 | rts 27 | -------------------------------------------------------------------------------- /Software/load/04_blink_large/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=04_blink_large 2 | BUILD_TYPE=load 3 | LOAD_LINK=static 4 | 5 | ASM_SOURCES=blink_test.s 6 | C_SOURCES= 7 | 8 | include ../../common/makefile 9 | 10 | -------------------------------------------------------------------------------- /Software/load/05_simple_shell/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=05_simple_shell 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=simple_shell.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/05_simple_shell/simple_shell.s: -------------------------------------------------------------------------------- 1 | .include "string.inc" 2 | .include "utils.inc" 3 | .include "zeropage.inc" 4 | .include "tty.inc" 5 | .include "menu.inc" 6 | .include "lcd.inc" 7 | 8 | .code 9 | init: 10 | jsr _lcd_clear 11 | 12 | lda #(TTY_CONFIG_INPUT_SERIAL | TTY_CONFIG_INPUT_KEYBOARD | TTY_CONFIG_OUTPUT_SERIAL | TTY_CONFIG_OUTPUT_LCD) 13 | ; lda #(TTY_CONFIG_INPUT_SERIAL | TTY_CONFIG_INPUT_KEYBOARD | TTY_CONFIG_OUTPUT_SERIAL) 14 | jsr _tty_init 15 | ; Display hello messages 16 | writeln_tty #msghello1 17 | 18 | run_menu #menu, #simpleprompt 19 | 20 | lda #(TTY_CONFIG_INPUT_SERIAL | TTY_CONFIG_INPUT_KEYBOARD | TTY_CONFIG_OUTPUT_SERIAL) 21 | jsr _tty_init 22 | 23 | jsr _lcd_clear 24 | rts 25 | 26 | _display_load_message: 27 | writeln_tty #msgload 28 | rts 29 | 30 | .segment "RODATA" 31 | msghello1: 32 | .asciiz "OS/1 Mini Shell" 33 | msgload: 34 | .asciiz "Loading now..." 35 | simpleprompt: 36 | .asciiz "OS/1 MS>" 37 | menu: 38 | menuitem load_cmd, 1, load_desc, _display_load_message 39 | endmenu 40 | load_cmd: 41 | .asciiz "LOAD" 42 | load_desc: 43 | .asciiz "LOAD - load program" -------------------------------------------------------------------------------- /Software/load/06_memdump/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=06_memdump 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=memdump.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/06_memdump/memdump.s: -------------------------------------------------------------------------------- 1 | .include "string.inc" 2 | .include "utils.inc" 3 | .include "zeropage.inc" 4 | .include "tty.inc" 5 | 6 | .segment "VECTORS" 7 | 8 | .word $0000 9 | .word init 10 | .word $0000 11 | 12 | .macro hex_to_buffer 13 | jsr convert_to_hex 14 | txa 15 | ldx tmp1 16 | sta dump_line,x 17 | inx 18 | tya 19 | sta dump_line,x 20 | inx 21 | stx tmp1 22 | .endmacro 23 | 24 | .code 25 | init: 26 | lda #$00 27 | sta ptr3 28 | 29 | lda #$10 30 | sta ptr3+1 31 | 32 | @line_loop: 33 | lda #04 34 | sta tmp1 35 | lda ptr3+1 36 | hex_to_buffer 37 | lda ptr3 38 | hex_to_buffer 39 | inc tmp1 40 | inc tmp1 41 | @byte_loop: 42 | lda (ptr3) 43 | hex_to_buffer 44 | inc tmp1 45 | inc ptr3 46 | bne @next_item 47 | inc ptr3+1 48 | lda ptr3+1 49 | cmp #$20 50 | beq @exit 51 | @next_item: 52 | lda ptr3 53 | and #%00000111 54 | bne @byte_loop 55 | inc tmp1 56 | lda ptr3 57 | and #%00001111 58 | bne @byte_loop 59 | writeln_tty #dump_line 60 | bra @line_loop 61 | @exit: 62 | rts 63 | 64 | .segment "RODATA" 65 | dump_line: 66 | .byte "0000xxxx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx", $00 -------------------------------------------------------------------------------- /Software/load/07_keyboard_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=07_keyboard_test 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=keyboard_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/08_system_break_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=08_system_break_test 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=system_break_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/08_system_break_test/system_break_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "tty.inc" 3 | 4 | init: 5 | writeln_tty #msgblocked 6 | 7 | infinite_loop: 8 | jmp infinite_loop 9 | 10 | .segment "RODATA" 11 | msgblocked: 12 | .byte "Running CPU blocking process.", $00 13 | -------------------------------------------------------------------------------- /Software/load/09_monitor/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=09_monitor 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=monitor.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/10_menu/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=10_menu 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=menu_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/11_disasm/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=11_disasm 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=disasm.s opcodes.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/12_custom_chars/custom_chars.s: -------------------------------------------------------------------------------- 1 | .include "lcd.inc" 2 | .include "utils.inc" 3 | 4 | CHAR_MOUTH_OPEN = $00 5 | CHAR_MOUTH_CLOSED = $01 6 | 7 | .code 8 | init: 9 | jsr _lcd_clear 10 | ; post character 11 | lcd_define_char CHAR_MOUTH_OPEN, #mouth_open_map 12 | lcd_define_char CHAR_MOUTH_CLOSED, #mouth_closed_map 13 | 14 | ldx #$05 15 | ldy #$01 16 | jsr lcd_set_position 17 | write_lcd #blahmsg 18 | 19 | stz counter 20 | 21 | @main_loop: 22 | 23 | ldx #$03 24 | ldy #$01 25 | jsr lcd_set_position 26 | lda #(CHAR_MOUTH_OPEN) 27 | jsr _lcd_print_char 28 | 29 | lda #200 30 | jsr _delay_ms 31 | 32 | ldx #$03 33 | ldy #$01 34 | jsr lcd_set_position 35 | lda #(CHAR_MOUTH_CLOSED) 36 | jsr _lcd_print_char 37 | 38 | lda #150 39 | jsr _delay_ms 40 | 41 | inc counter 42 | lda counter 43 | cmp #$10 44 | bne @main_loop 45 | 46 | jsr _lcd_clear 47 | rts 48 | 49 | .segment "BSS" 50 | counter: 51 | .res 1 52 | 53 | .segment "RODATA" 54 | blahmsg: 55 | .asciiz "Blah blah..." 56 | 57 | mouth_open_map: 58 | .byte %00001110 59 | .byte %00011111 60 | .byte %00010101 61 | .byte %00011111 62 | .byte %00010001 63 | .byte %00001110 64 | .byte %00000000 65 | .byte %00000000 66 | 67 | mouth_closed_map: 68 | .byte %00001110 69 | .byte %00011111 70 | .byte %00010101 71 | .byte %00011111 72 | .byte %00011111 73 | .byte %00000000 74 | .byte %00000000 75 | .byte %00000000 76 | 77 | ; safeguarding from trim operation 78 | .byte $ff 79 | 80 | -------------------------------------------------------------------------------- /Software/load/12_custom_chars/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=12_custom_chars 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=custom_chars.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/13_custom_chars_c/custom_chars.c: -------------------------------------------------------------------------------- 1 | #include "blink.h" 2 | #include "lcd.h" 3 | #include "utils.h" 4 | 5 | #define CHAR_MOUTH_OPEN 0x00 6 | #define CHAR_MOUTH_CLOSED 0x01 7 | 8 | static const unsigned char open_mouth_map[] = {0b00001110, 9 | 0b00011111, 10 | 0b00010101, 11 | 0b00011111, 12 | 0b00010001, 13 | 0b00001110, 14 | 0b00000000, 15 | 0b00000000}; 16 | 17 | static const unsigned char closed_mouth_map[] = {0b00001110, 18 | 0b00011111, 19 | 0b00010101, 20 | 0b00011111, 21 | 0b00011111, 22 | 0b00000000, 23 | 0b00000000, 24 | 0b00000000}; 25 | 26 | static unsigned char counter = 0; 27 | 28 | void main(void) { 29 | blink_init(); 30 | blink_led(BLINK_LED_ON); 31 | delay_ms(250); 32 | blink_led(BLINK_LED_OFF); 33 | 34 | lcd_clear(); 35 | 36 | lcd_define_char(CHAR_MOUTH_OPEN, open_mouth_map); 37 | lcd_define_char(CHAR_MOUTH_CLOSED, closed_mouth_map); 38 | 39 | lcd_set_position(5, 1); 40 | lcd_print("Blah blah"); 41 | 42 | counter=0; 43 | 44 | while (counter<10) { 45 | 46 | lcd_set_position(3, 1); 47 | lcd_print_char(CHAR_MOUTH_OPEN); 48 | 49 | delay_ms(200); 50 | 51 | lcd_set_position(3, 1); 52 | lcd_print_char(CHAR_MOUTH_CLOSED); 53 | 54 | delay_ms(150); 55 | 56 | ++counter; 57 | } 58 | 59 | lcd_clear(); 60 | } -------------------------------------------------------------------------------- /Software/load/13_custom_chars_c/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=13_custom_chars_c 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES= 5 | C_SOURCES=custom_chars.c 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/14_offset_math/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=14_offset_math 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=offset_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/15_menu_in_c/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=15_menu_in_c 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES= 5 | C_SOURCES=menu.c 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/15_menu_in_c/menu.c: -------------------------------------------------------------------------------- 1 | #include "utils.h" 2 | #include "menu.h" 3 | #include "tty.h" 4 | #include "string.h" 5 | #include "parse.h" 6 | 7 | static menuitem menu[3]; 8 | 9 | void process_cmenu(unsigned char tokens_buffer[] __attribute__((unused))) { 10 | tty_writeln("Menu item activated!"); 11 | } 12 | 13 | void process_caddr(unsigned char tokens_buffer[]) { 14 | unsigned char address[2]; 15 | if (parse_hex_word(strgettoken(tokens_buffer, 1), address)) { 16 | tty_write("Parsed successfully: 0x"); 17 | tty_write_hex(address[1]); 18 | tty_write_hex(address[0]); 19 | tty_send_newline(); 20 | } else { 21 | tty_writeln("Unable to parse address"); 22 | } 23 | } 24 | 25 | void process_cdec(unsigned char tokens_buffer[]) { 26 | unsigned char address[2]; 27 | if (parse_dec_word(strgettoken(tokens_buffer, 1), address)) { 28 | tty_write("Parsed successfully: 0x"); 29 | tty_write_hex(address[1]); 30 | tty_write_hex(address[0]); 31 | tty_send_newline(); 32 | } else { 33 | tty_writeln("Unable to parse address"); 34 | } 35 | } 36 | 37 | void main(void) { 38 | setup_menuitem(&(menu[0]), "CMENU", 1, "CMENU - Sample C menu entry", &process_cmenu); 39 | setup_menuitem(&(menu[1]), "CADDR", 2, "CADDR xxxx - Parameterized entry", &process_caddr); 40 | setup_menuitem(&(menu[2]), "CDEC", 2, "CDEC xxxx - Parameterized entry", &process_cdec); 41 | setup_menuitem(&(menu[3]), 0x0000, 0, 0x0000, 0x0000); 42 | 43 | run_menu(menu, "OS/1 C Menu>"); 44 | } -------------------------------------------------------------------------------- /Software/load/16_microchess/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=16_microchess 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=microchess.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/17_basic/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=17_basic 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=basic.s basic_parser.s basic_program.s basic_runner.s tokens.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/17_basic/tokens.inc: -------------------------------------------------------------------------------- 1 | .import cmd_new 2 | .import cmd_list 3 | .import cmd_print 4 | .import cmd_goto 5 | .import cmd_run 6 | .import cmd_exit 7 | .import cmd_mem 8 | 9 | TOKEN_ERROR = $00 10 | TOKEN_LIST = $01 11 | TOKEN_RUN = $02 12 | TOKEN_PRINT = $03 13 | TOKEN_GOTO = $04 14 | TOKEN_EXIT = $05 15 | TOKEN_NEW = $06 16 | TOKEN_MEM = $07 -------------------------------------------------------------------------------- /Software/load/17_basic/tokens.s: -------------------------------------------------------------------------------- 1 | .export cmd_new 2 | .export cmd_list 3 | .export cmd_print 4 | .export cmd_goto 5 | .export cmd_run 6 | .export cmd_exit 7 | .export cmd_mem 8 | 9 | .segment "RODATA" 10 | 11 | cmd_new: 12 | .asciiz "NEW" 13 | cmd_list: 14 | .asciiz "LIST" 15 | cmd_print: 16 | .asciiz "PRINT" 17 | cmd_goto: 18 | .asciiz "GOTO" 19 | cmd_run: 20 | .asciiz "RUN" 21 | cmd_exit: 22 | .asciiz "EXIT" 23 | cmd_mem: 24 | .asciiz "MEM" -------------------------------------------------------------------------------- /Software/load/18_hello_world/hello_world.s: -------------------------------------------------------------------------------- 1 | .include "tty.inc" 2 | 3 | .code 4 | 5 | init: 6 | writeln_tty #message 7 | rts 8 | 9 | .segment "RODATA" 10 | 11 | message: .asciiz "Hello World from 6502 (asm)!" 12 | -------------------------------------------------------------------------------- /Software/load/18_hello_world/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=18_hello_world 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=hello_world.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/19_hello_world_c/hello.c: -------------------------------------------------------------------------------- 1 | #include "tty.h" 2 | 3 | void main(void) { 4 | tty_writeln("Hello world from 6502 (C)!"); 5 | } 6 | -------------------------------------------------------------------------------- /Software/load/19_hello_world_c/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=19_hello_world_c 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES= 5 | C_SOURCES=hello.c 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/20_lcd_bug/lcd_bug.s: -------------------------------------------------------------------------------- 1 | .include "lcd.inc" 2 | .include "utils.inc" 3 | 4 | .code 5 | init: 6 | jsr _lcd_clear 7 | lda #200 8 | jsr _delay_ms 9 | write_lcd #message 10 | lda #100 11 | jsr _delay_ms 12 | jsr _lcd_scroll_down 13 | lda #100 14 | jsr _delay_ms 15 | jsr _lcd_scroll_down 16 | rts 17 | 18 | .segment "RODATA" 19 | message: .byte "@ABCDEFGHIJKLMNO0123456789:;<=>?", $00 20 | -------------------------------------------------------------------------------- /Software/load/20_lcd_bug/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=20_lcd_bug 2 | BUILD_TYPE=load 3 | LOAD_LINK=static 4 | 5 | ASM_SOURCES=lcd_bug.s 6 | C_SOURCES= 7 | 8 | include ../../common/makefile 9 | 10 | -------------------------------------------------------------------------------- /Software/load/21_sysinfo/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=21_sysinfo 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=sysinfo.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/README.txt: -------------------------------------------------------------------------------- 1 | look into msbasic.s for the README 2 | visit www.pagetable.com for more info 3 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/TODO.txt: -------------------------------------------------------------------------------- 1 | * convert messy init code into completely different 2 | files without ifdefs (not much in common!) 3 | * move all machine specific code into separate files 4 | * rename all labels that point to RTS to RTSn 5 | * add AppleSoft comments 6 | * look for all " $", i.e. (zeropage) constants, replace them 7 | with symbols 8 | * convert platform ifdefs in generic files into feature ifdefs or macros 9 | * reconstruct pre-CBM1, i.e. CBM1 without the patches 10 | * add some comments to every file 11 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/chrget.s: -------------------------------------------------------------------------------- 1 | .ifndef DB6502 2 | .segment "CHRGET" 3 | RAMSTART1: 4 | GENERIC_CHRGET: 5 | inc TXTPTR 6 | bne GENERIC_CHRGOT 7 | inc TXTPTR+1 8 | GENERIC_CHRGOT: 9 | GENERIC_TXTPTR = GENERIC_CHRGOT + 1 10 | lda $EA60 11 | .ifdef KBD 12 | jsr LF430 13 | .endif 14 | cmp #$3A 15 | bcs L4058 16 | GENERIC_CHRGOT2: 17 | cmp #$20 18 | beq GENERIC_CHRGET 19 | sec 20 | sbc #$30 21 | sec 22 | sbc #$D0 23 | L4058: 24 | rts 25 | .else 26 | .segment "CODE" 27 | CHRGET: 28 | inc TXTPTR 29 | bne CHRGOT 30 | inc TXTPTR+1 31 | CHRGOT: 32 | lda (TXTPTR) 33 | cmp #$3A 34 | bcs L4058 35 | CHRGOT2: 36 | cmp #$20 37 | beq CHRGET 38 | sec 39 | sbc #$30 40 | sec 41 | sbc #$D0 42 | L4058: 43 | rts 44 | .endif -------------------------------------------------------------------------------- /Software/load/22_msbasic/db6502_extra.s: -------------------------------------------------------------------------------- 1 | .include "acia.inc" 2 | 3 | .segment "CODE" 4 | ISCNTC: 5 | jmp MONISCNTC 6 | ;!!! *used*to* run into "STOP" 7 | 8 | init: 9 | stz EXITFLAG 10 | 11 | ; Display startup message 12 | ShowStartMsg: 13 | writeln_tty #StartupMessage 14 | 15 | ; Wait for a cold/warm start selection 16 | WaitForKeypress: 17 | JSR MONRDKEY 18 | BCC WaitForKeypress 19 | 20 | AND #$DF ; Make upper case 21 | CMP #'W' ; compare with [W]arm start 22 | BEQ WarmStart 23 | 24 | CMP #'C' ; compare with [C]old start 25 | BNE ShowStartMsg 26 | 27 | JMP COLD_START ; BASIC cold start 28 | 29 | WarmStart: 30 | JMP RESTART ; BASIC warm start 31 | 32 | MONCOUT: 33 | 34 | jsr _tty_send_character 35 | RTS 36 | 37 | MONRDKEY: 38 | 39 | jsr _acia_is_data_available 40 | ; skip, no data available at this point 41 | cmp #(ACIA_NO_DATA_AVAILABLE) 42 | beq NoDataIn 43 | jsr _acia_read_byte 44 | sec 45 | rts 46 | NoDataIn: 47 | clc 48 | RTS 49 | 50 | MONISCNTC: 51 | JSR MONRDKEY 52 | BCC NotCTRLC ; If no key pressed then exit 53 | CMP #3 54 | BNE NotCTRLC ; if CTRL-C not pressed then exit 55 | SEC ; Carry set if control C pressed 56 | RTS 57 | NotCTRLC: 58 | CLC ; Carry clear if control C not pressed 59 | RTS 60 | 61 | StartupMessage: 62 | .byte "Cold [C] or warm [W] start?",$0D,$0A,$00 63 | 64 | LOAD: 65 | RTS 66 | 67 | SAVE: 68 | RTS 69 | 70 | .segment "STARTUP" 71 | jmp init 72 | 73 | .segment "SYSRAM" 74 | TXTBUFFER: 75 | .res 64 -------------------------------------------------------------------------------- /Software/load/22_msbasic/defines.s: -------------------------------------------------------------------------------- 1 | .if .def(cbmbasic1) 2 | CBM1 := 1 3 | .include "defines_cbm1.s" 4 | .elseif .def(osi) 5 | OSI := 1 6 | .include "defines_osi.s" 7 | .elseif .def(applesoft) 8 | APPLE := 1 9 | .include "defines_apple.s" 10 | .elseif .def(kb9) 11 | KIM := 1 12 | .include "defines_kim.s" 13 | .elseif .def(cbmbasic2) 14 | CBM2 := 1 15 | .include "defines_cbm2.s" 16 | .elseif .def(kbdbasic) 17 | KBD := 1 18 | .include "defines_kbd.s" 19 | .elseif .def(microtan) 20 | MICROTAN := 1 21 | .include "defines_microtan.s" 22 | .elseif .def(aim65) 23 | AIM65 := 1 24 | .include "defines_aim65.s" 25 | .elseif .def(sym1) 26 | SYM1 := 1 27 | .include "defines_sym1.s" 28 | .elseif .def(db6502) 29 | DB6502 := 1 30 | .include "defines_db6502.s" 31 | .endif 32 | 33 | .ifdef CONFIG_2C 34 | CONFIG_2B := 1 35 | .endif 36 | .ifdef CONFIG_2B 37 | CONFIG_2A := 1 38 | .endif 39 | .ifdef CONFIG_2A 40 | CONFIG_2 := 1 41 | .endif 42 | .ifdef CONFIG_2 43 | CONFIG_11A := 1 44 | .endif 45 | .ifdef CONFIG_11A 46 | CONFIG_11 := 1 47 | .endif 48 | .ifdef CONFIG_11 49 | CONFIG_10A := 1 50 | .endif 51 | 52 | .ifdef CONFIG_SMALL 53 | BYTES_FP := 4 54 | CONFIG_SMALL_ERROR := 1 55 | .else 56 | BYTES_FP := 5 57 | .endif 58 | 59 | .ifndef BYTES_PER_ELEMENT 60 | BYTES_PER_ELEMENT := BYTES_FP 61 | .endif 62 | BYTES_PER_VARIABLE := BYTES_FP+2 63 | MANTISSA_BYTES := BYTES_FP-1 64 | BYTES_PER_FRAME := 2*BYTES_FP+8 65 | FOR_STACK1 := 2*BYTES_FP+5 66 | FOR_STACK2 := BYTES_FP+4 67 | 68 | .ifndef MAX_EXPON 69 | MAX_EXPON = 10 70 | .endif 71 | 72 | STACK := $0100 73 | .ifndef STACK2 74 | STACK2 := STACK 75 | .endif 76 | 77 | .ifdef INPUTBUFFER 78 | .if INPUTBUFFER >= $0100 79 | CONFIG_NO_INPUTBUFFER_ZP := 1 80 | .endif 81 | .if INPUTBUFFER = $0200 82 | CONFIG_INPUTBUFFER_0200 := 1 83 | .endif 84 | .endif 85 | INPUTBUFFERX = INPUTBUFFER & $FF00 86 | 87 | CR=13 88 | LF=10 89 | 90 | .ifndef CRLF_1 91 | CRLF_1 := CR 92 | CRLF_2 := LF 93 | .endif 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/defines_db6502.s: -------------------------------------------------------------------------------- 1 | .import __USERRAM_START__ 2 | 3 | ; configuration 4 | CONFIG_2C := 1 5 | 6 | CONFIG_DATAFLG := 1 7 | CONFIG_NULL := 1 8 | CONFIG_PRINT_CR := 0 ; print CR when line end reached 9 | CONFIG_SCRTCH_ORDER := 3 10 | CONFIG_SMALL := 1 11 | 12 | ; zero page 13 | ZP_START1 = $00 14 | ZP_START2 = $0D 15 | ZP_START3 = $5B 16 | ZP_START4 = $65 17 | 18 | ;extra ZP variables 19 | USR := $000A 20 | 21 | ; inputbuffer 22 | INPUTBUFFER := $0900 23 | STACK2 := TXTBUFFER 24 | ; constants 25 | ; STACK_TOP := $FC 26 | SPACE_FOR_GOSUB := $33 27 | NULL_MAX := $0A 28 | WIDTH := 72 29 | WIDTH2 := 56 30 | 31 | ; memory layout 32 | RAMSTART2 := __USERRAM_START__ 33 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/error.s: -------------------------------------------------------------------------------- 1 | init_error_table 2 | 3 | .ifdef CONFIG_SMALL_ERROR 4 | define_error ERR_NOFOR, "NF" 5 | define_error ERR_SYNTAX, "SN" 6 | define_error ERR_NOGOSUB, "RG" 7 | define_error ERR_NODATA, "OD" 8 | define_error ERR_ILLQTY, "FC" 9 | define_error ERR_OVERFLOW, "OV" 10 | define_error ERR_MEMFULL, "OM" 11 | define_error ERR_UNDEFSTAT, "US" 12 | define_error ERR_BADSUBS, "BS" 13 | define_error ERR_REDIMD, "DD" 14 | define_error ERR_ZERODIV, "/0" 15 | define_error ERR_ILLDIR, "ID" 16 | define_error ERR_BADTYPE, "TM" 17 | define_error ERR_STRLONG, "LS" 18 | define_error ERR_FRMCPX, "ST" 19 | define_error ERR_CANTCONT, "CN" 20 | define_error ERR_UNDEFFN, "UF" 21 | .else 22 | define_error ERR_NOFOR, "NEXT WITHOUT FOR" 23 | define_error ERR_SYNTAX, "SYNTAX" 24 | define_error ERR_NOGOSUB, "RETURN WITHOUT GOSUB" 25 | define_error ERR_NODATA, "OUT OF DATA" 26 | define_error ERR_ILLQTY, "ILLEGAL QUANTITY" 27 | .ifdef CBM1 28 | .byte 0,0,0,0,0 29 | .endif 30 | define_error ERR_OVERFLOW, "OVERFLOW" 31 | define_error ERR_MEMFULL, "OUT OF MEMORY" 32 | define_error ERR_UNDEFSTAT, "UNDEF'D STATEMENT" 33 | define_error ERR_BADSUBS, "BAD SUBSCRIPT" 34 | define_error ERR_REDIMD, "REDIM'D ARRAY" 35 | define_error ERR_ZERODIV, "DIVISION BY ZERO" 36 | define_error ERR_ILLDIR, "ILLEGAL DIRECT" 37 | define_error ERR_BADTYPE, "TYPE MISMATCH" 38 | define_error ERR_STRLONG, "STRING TOO LONG" 39 | .ifdef CONFIG_FILE 40 | .ifdef CBM1 41 | define_error ERR_BADDATA, "BAD DATA" 42 | .else 43 | define_error ERR_BADDATA, "FILE DATA" 44 | .endif 45 | .endif 46 | define_error ERR_FRMCPX, "FORMULA TOO COMPLEX" 47 | define_error ERR_CANTCONT, "CAN'T CONTINUE" 48 | define_error ERR_UNDEFFN, "UNDEF'D FUNCTION" 49 | .endif -------------------------------------------------------------------------------- /Software/load/22_msbasic/extra.s: -------------------------------------------------------------------------------- 1 | .segment "EXTRA" 2 | 3 | .ifdef KIM 4 | .include "kim_extra.s" 5 | .endif 6 | 7 | .ifdef CONFIG_CBM1_PATCHES 8 | .include "cbm1_patches.s" 9 | .endif 10 | 11 | .ifdef KBD 12 | .include "kbd_extra.s" 13 | .endif 14 | 15 | .ifdef APPLE 16 | .include "apple_extra.s" 17 | .endif 18 | 19 | .ifdef MICROTAN 20 | .include "microtan_extra.s" 21 | .endif 22 | 23 | .ifdef AIM65 24 | .include "aim65_extra.s" 25 | .endif 26 | 27 | .ifdef SYM1 28 | .byte 0,0,0 29 | .endif 30 | 31 | .ifdef DB6502 32 | .include "db6502_extra.s" 33 | .endif -------------------------------------------------------------------------------- /Software/load/22_msbasic/header.s: -------------------------------------------------------------------------------- 1 | .segment "HEADER" 2 | .ifdef KBD 3 | jmp LE68C 4 | .byte $00,$13,$56 5 | .endif 6 | .ifdef AIM65 7 | jmp COLD_START 8 | jmp RESTART 9 | .word AYINT,GIVAYF 10 | .endif 11 | .ifdef SYM1 12 | jmp PR_WRITTEN_BY 13 | .endif 14 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ; ---------------------------------------------------------------------------- 3 | ; SEE IF CONTROL-C TYPED 4 | ; ---------------------------------------------------------------------------- 5 | .ifdef CONFIG_CBM_ALL 6 | .include "cbm_iscntc.s" 7 | .endif 8 | .ifdef KBD 9 | .include "kbd_iscntc.s" 10 | .endif 11 | .ifdef OSI 12 | .include "osi_iscntc.s" 13 | .endif 14 | .ifdef APPLE 15 | .include "apple_iscntc.s" 16 | .endif 17 | .ifdef KIM 18 | .include "kim_iscntc.s" 19 | .endif 20 | .ifdef MICROTAN 21 | .include "microtan_iscntc.s" 22 | .endif 23 | .ifdef AIM65 24 | .include "aim65_iscntc.s" 25 | .endif 26 | .ifdef SYM1 27 | .include "sym1_iscntc.s" 28 | .endif 29 | ;!!! runs into "STOP" -------------------------------------------------------------------------------- /Software/load/22_msbasic/loadsave.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | 3 | .ifdef APPLE 4 | .include "apple_loadsave.s" 5 | .endif 6 | .ifdef KIM 7 | .include "kim_loadsave.s" 8 | .endif 9 | .ifdef MICROTAN 10 | .include "microtan_loadsave.s" 11 | .endif 12 | .ifdef AIM65 13 | .include "aim65_loadsave.s" 14 | .endif 15 | .ifdef SYM1 16 | .include "sym1_loadsave.s" 17 | .endif -------------------------------------------------------------------------------- /Software/load/22_msbasic/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=22_msbasic 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=msbasic.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/message.s: -------------------------------------------------------------------------------- 1 | ; global messages: "error", "in", "ready", "break" 2 | 3 | .segment "CODE" 4 | 5 | QT_ERROR: 6 | .ifdef KBD 7 | .byte " err" 8 | .else 9 | .ifdef APPLE 10 | .byte " ERR" 11 | .byte $07,$07 12 | .else 13 | .byte " ERROR" 14 | .endif 15 | .endif 16 | .byte 0 17 | 18 | .ifndef KBD 19 | QT_IN: 20 | .byte " IN " 21 | .byte $00 22 | .endif 23 | 24 | .ifdef KBD 25 | .byte $54,$D2 ; ??? 26 | OKPRT: 27 | jsr PRIMM 28 | .byte CR,CR,">>",CR,LF 29 | .byte 0 30 | rts 31 | nop 32 | .else 33 | .ifndef AIM65 34 | QT_OK: 35 | .ifdef CONFIG_CBM_ALL 36 | .byte CR,LF,"READY.",CR,LF 37 | .else 38 | .ifdef APPLE 39 | ; binary patch! 40 | .byte CR,0,0,"K",CR,LF 41 | .else 42 | .byte CR,LF,"OK",CR,LF 43 | .endif 44 | .endif 45 | .byte 0 46 | .endif 47 | .endif 48 | QT_BREAK: 49 | 50 | .ifdef KBD 51 | .byte CR,LF," Brk" 52 | .byte 0 53 | .byte $54,$D0 ; ??? 54 | .elseif .def(MICROTAN) || .def(AIM65) 55 | .byte CR,LF," BREAK" 56 | .byte 0 57 | .else 58 | .byte CR,LF,"BREAK" 59 | .byte 0 60 | .endif 61 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/misc3.s: -------------------------------------------------------------------------------- 1 | ; KBD specific patches 2 | 3 | .segment "CODE" 4 | 5 | .ifdef KBD 6 | VARTAB_MINUS_2_TO_AY: 7 | lda VARTAB 8 | sec 9 | sbc #$02 10 | ldy VARTAB+1 11 | bcs LF42C 12 | dey 13 | LF42C: 14 | rts 15 | 16 | ; ---------------------------------------------------------------------------- 17 | GET_UPPER: 18 | lda INPUTBUFFERX,x 19 | LF430: 20 | cmp #'a' 21 | bcc LF43A 22 | cmp #'z'+1 23 | bcs LF43A 24 | LF438: 25 | sbc #$1F 26 | LF43A: 27 | rts 28 | 29 | ; ---------------------------------------------------------------------------- 30 | GETLN: 31 | ldx #$5D 32 | LF43D: 33 | txa 34 | and #$7F 35 | cmp $0340 36 | beq LF44D 37 | sta $0340 38 | lda #$03 39 | jsr LDE48 40 | LF44D: 41 | jsr LDE7F 42 | bne RTS4 43 | cpx #$80 44 | bcc LF44D 45 | RTS4: 46 | rts 47 | 48 | ; ---------------------------------------------------------------------------- 49 | LF457: 50 | lda TXTTAB 51 | ldx TXTTAB+1 52 | LF45B: 53 | sta JMPADRS+1 54 | stx JMPADRS+2 55 | ldy #$01 56 | lda (JMPADRS+1),y 57 | beq LF438 58 | iny 59 | iny 60 | lda (JMPADRS+1),y 61 | dey 62 | cmp LINNUM+1 63 | bne LF472 64 | lda (JMPADRS+1),y 65 | cmp LINNUM 66 | LF472: 67 | bcs LF43A 68 | dey 69 | lda (JMPADRS+1),y 70 | tax 71 | dey 72 | lda (JMPADRS+1),y 73 | bcc LF45B 74 | LF47D: 75 | jmp (JMPADRS+1) 76 | .endif 77 | -------------------------------------------------------------------------------- /Software/load/22_msbasic/os1_todo.txt: -------------------------------------------------------------------------------- 1 | 1. (DONE) Remove self-modyfying code 2 | 2. (POSTPONED) Remove dependency on custom memory segments 3 | 3. (DONE) Add Exit keyword 4 | 4. Case-insensitive comparison for tokens 5 | 5. (DONE) Disable clear at startup 6 | 6. Reduce ZP footprint (optional) 7 | 7. (DONE) Correct segment alignment 8 | 8. Fix issue with non-page aligned INPUTBUFFER 9 | 9. Make INPUTBUFFER allocation by linker 10 | 11 | -------------------------------------------------------------------------------- /Software/load/23_t1_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=23_t1_test 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=t1_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/23_t1_test/t1_test.s: -------------------------------------------------------------------------------- 1 | .include "via_const.inc" 2 | .include "via_utils.inc" 3 | 4 | .code 5 | init: 6 | via2_set_register VIA_REGISTER_ACR, #(VIA_ACR_T1_CONT_SQUARE_PB7) 7 | via2_set_register VIA_REGISTER_T1CL, #$ff 8 | via2_set_register VIA_REGISTER_T1CH, #$ff 9 | 10 | loop: 11 | nop 12 | jmp loop 13 | -------------------------------------------------------------------------------- /Software/load/24_user_irq_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=24_user_irq_test 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=user_irq_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/24_user_irq_test/user_irq_test.s: -------------------------------------------------------------------------------- 1 | .include "via_const.inc" 2 | .include "via_utils.inc" 3 | .include "core.inc" 4 | .include "blink.inc" 5 | .include "utils.inc" 6 | 7 | .code 8 | init: 9 | stz irq_counter 10 | 11 | register_user_irq #service_irq 12 | 13 | via2_set_register VIA_REGISTER_ACR, #(VIA_ACR_T1_CONT_NO_PB7 | VIA_ACR_T2_TIMED | VIA_ACR_SR_DISABLED | VIA_ACR_PB_LATCH_DISABLE | VIA_ACR_PA_LATCH_DISABLE) 14 | via2_set_register VIA_REGISTER_IER, #(VIA_IER_SET_FLAGS | VIA_IER_TIMER1_FLAG) 15 | via2_set_register VIA_REGISTER_T1CL, #250 16 | via2_set_register VIA_REGISTER_T1CH, #200 17 | 18 | lda #5 19 | jsr _delay_sec 20 | ; disable interrupt 21 | via2_set_register VIA_REGISTER_IER, #(VIA_IER_CLEAR_FLAGS | VIA_IER_TIMER1_FLAG) 22 | rts 23 | 24 | service_irq: 25 | ; No need to save registers, it's done automatically 26 | ; phx 27 | ; pha 28 | via2_get_register VIA_REGISTER_IFR 29 | bpl @exit 30 | via2_get_register VIA_REGISTER_T1CL 31 | inc irq_counter 32 | bne @exit 33 | jsr _strobe_led 34 | @exit: 35 | ; pla 36 | ; plx 37 | rts 38 | 39 | .segment "BSS" 40 | irq_counter: 41 | .res 1 -------------------------------------------------------------------------------- /Software/load/25_user_irq_c/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=25_user_irq_c 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES= 5 | C_SOURCES=user_irq.c 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/25_user_irq_c/user_irq.c: -------------------------------------------------------------------------------- 1 | #include "blink.h" 2 | #include "utils.h" 3 | #include "via_utils.h" 4 | #include "core.h" 5 | 6 | void user_irq_handler(void); 7 | 8 | unsigned char irq_counter=0; 9 | 10 | void main(void) { 11 | irq_counter=0; 12 | 13 | register_user_irq(user_irq_handler); 14 | 15 | via2_set_register(VIA_REGISTER_ACR, VIA_ACR_T1_CONT_NO_PB7 | VIA_ACR_T2_TIMED | VIA_ACR_SR_DISABLED | VIA_ACR_PB_LATCH_DISABLE | VIA_ACR_PA_LATCH_DISABLE); 16 | via2_set_register(VIA_REGISTER_IER, VIA_IER_SET_FLAGS | VIA_IER_TIMER1_FLAG); 17 | via2_set_register(VIA_REGISTER_T1CL, 250); 18 | via2_set_register(VIA_REGISTER_T1CH, 200); 19 | 20 | delay_sec(5); 21 | 22 | via2_set_register(VIA_REGISTER_IER, VIA_IER_CLEAR_FLAGS | VIA_IER_TIMER1_FLAG); 23 | } 24 | 25 | void user_irq_handler(void) { 26 | unsigned char ifr = via2_get_register(VIA_REGISTER_IFR); 27 | if (ifr & 0x80) { 28 | via2_get_register(VIA_REGISTER_T1CL); 29 | if (!(++irq_counter)) { 30 | strobe_led(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /Software/load/26_duart_sync/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=26_duart_sync 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=duart_sync.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/load/27_duart_async/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=27_duart_async 2 | BUILD_TYPE=load 3 | 4 | ASM_SOURCES=duart_async.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/01_nop_fill/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=01_nop_fill 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=nop_fill.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | -------------------------------------------------------------------------------- /Software/rom/01_nop_fill/nop_fill.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | 3 | .code -------------------------------------------------------------------------------- /Software/rom/02_nop_fffc/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=02_nop_fffc 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=nop_fffc.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | -------------------------------------------------------------------------------- /Software/rom/02_nop_fffc/nop_fffc.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | 3 | .segment "VECTORS" 4 | 5 | .word $eaea 6 | .word init 7 | .word $eaea 8 | 9 | .code 10 | 11 | init: -------------------------------------------------------------------------------- /Software/rom/03_first_code/first_code.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | 3 | .segment "VECTORS" 4 | 5 | .word $eaea 6 | .word init 7 | .word $eaea 8 | 9 | .code 10 | 11 | init: 12 | lda #$42 13 | sta $6000 14 | -------------------------------------------------------------------------------- /Software/rom/03_first_code/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=03_first_code 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=first_code.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | -------------------------------------------------------------------------------- /Software/rom/04_blink_s/blink.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | 4 | .segment "VECTORS" 5 | 6 | .word $eaea 7 | .word init 8 | .word $eaea 9 | 10 | .code 11 | 12 | init: 13 | lda #$ff 14 | sta VIA2_DDRB 15 | loop: 16 | lda #$55 17 | sta VIA2_PORTB 18 | lda #$aa 19 | sta VIA2_PORTB 20 | jmp loop 21 | -------------------------------------------------------------------------------- /Software/rom/04_blink_s/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=04_blink_s 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=blink.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/05_knight_rider/knight_rider.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | 4 | .segment "VECTORS" 5 | 6 | .word $0000 7 | .word init 8 | .word $0000 9 | 10 | .code 11 | 12 | init: 13 | lda #$ff 14 | sta VIA2_DDRB 15 | lda #$01 16 | sta VIA2_PORTB 17 | loop_l: 18 | rol A 19 | bcs loop_r 20 | sta VIA2_PORTB 21 | jmp loop_l 22 | loop_r: 23 | ror A 24 | bcs loop_l 25 | sta VIA2_PORTB 26 | jmp loop_r 27 | -------------------------------------------------------------------------------- /Software/rom/05_knight_rider/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=05_knight_rider 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=knight_rider.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | -------------------------------------------------------------------------------- /Software/rom/06_lcd_test/lcd_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | 4 | COMMAND_MODE = %00000000 5 | DATA_MODE = %00100000 6 | WRITE_MODE = %00000000 7 | READ_MODE = %01000000 8 | PULSE = %10000000 9 | 10 | NPULSE = %01111111 11 | 12 | .segment "VECTORS" 13 | 14 | .word $0000 15 | .word init 16 | .word $0000 17 | 18 | .code 19 | 20 | init: 21 | lda #%11100000 ; PA5, PA6 and PA7 are outputs 22 | sta VIA2_DDRA 23 | lda #%11111111 ; PORTB is all output 24 | sta VIA2_DDRB 25 | lda #%00000000 ; Initialize port outputs with $00 26 | sta VIA2_PORTA 27 | sta VIA2_PORTB 28 | ldx #$00 ; Initialize counter (register X) 29 | loop_init_seq: 30 | lda lcd_init_sequence,x ; Fetch data from address lcd_init_sequence + x 31 | beq data_display ; If fetched $00 (end of stream), move to data transmission 32 | sta VIA2_PORTB ; Send data to PORTB 33 | lda #(COMMAND_MODE | WRITE_MODE | PULSE) ; Set write command mode with active pulse 34 | sta VIA2_PORTA 35 | and #NPULSE ; Disable pulse bit (E) and send to LCD 36 | sta VIA2_PORTA 37 | inx ; Increase counter 38 | jmp loop_init_seq ; Keep looping over init sequence 39 | 40 | data_display: 41 | ldx #$00 ; Initialize counter 42 | loop_data: 43 | lda data,x ; Load data bytes from address data + x 44 | beq end_prog ; On end of stream move to end of program 45 | sta VIA2_PORTB 46 | lda #(DATA_MODE | WRITE_MODE | PULSE) ; Set write data mode with active pulse 47 | sta VIA2_PORTA 48 | and #NPULSE ; Disable pulse bit (E) 49 | sta VIA2_PORTA 50 | inx ; Increase counter 51 | jmp loop_data 52 | end_prog: 53 | jmp end_prog 54 | 55 | lcd_init_sequence: 56 | .byte %00111100 57 | .byte %00001100 58 | .byte %00000110 59 | .byte %00000001 60 | .byte %00000000 61 | 62 | data: 63 | .byte "Merry Christmas!",$00 64 | -------------------------------------------------------------------------------- /Software/rom/06_lcd_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=06_lcd_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=lcd_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/07_mem_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=07_mem_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=mem_test.s 5 | C_SOURCES= 6 | COMMON_DEPS=via.o 7 | 8 | include ../../common/makefile 9 | 10 | -------------------------------------------------------------------------------- /Software/rom/07_mem_test/mem_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | 4 | COMMAND_MODE = %00000000 5 | DATA_MODE = %00100000 6 | WRITE_MODE = %00000000 7 | READ_MODE = %01000000 8 | PULSE = %10000000 9 | 10 | NPULSE = %01111111 11 | 12 | .segment "VECTORS" 13 | 14 | .word $0000 15 | .word init 16 | .word $0000 17 | 18 | .code 19 | 20 | init: 21 | lda #%11100000 ; PA5, PA6 and PA7 are outputs 22 | sta VIA2_DDRA 23 | lda #%11111111 ; PORTB is all output 24 | sta VIA2_DDRB 25 | lda #%00000000 ; Initialize port outputs with $00 26 | sta VIA2_PORTA 27 | sta VIA2_PORTB 28 | ldx #$00 ; Initialize counter (register X) 29 | copymem: 30 | lda data,x ; Copy data to RAM 31 | sta buffer,x 32 | beq lcd_init ; Exit after $00 copied 33 | inx ; Increase copy counter 34 | jmp copymem ; Loop 35 | lcd_init: 36 | ldx #$00 ; Initialize counter (register X) 37 | loop_init_seq: 38 | lda lcd_init_sequence,x ; Fetch data from address lcd_init_sequence + x 39 | beq data_display ; If fetched $00 (end of stream), move to data transmission 40 | sta VIA2_PORTB ; Send data to PORTB 41 | lda #(COMMAND_MODE | WRITE_MODE | PULSE) ; Set write command mode with active pulse 42 | sta VIA2_PORTA 43 | and #NPULSE ; Disable pulse bit (E) and send to LCD 44 | sta VIA2_PORTA 45 | inx ; Increase counter 46 | jmp loop_init_seq ; Keep looping over init sequence 47 | 48 | data_display: 49 | ldx #$00 ; Initialize counter 50 | loop_data: 51 | lda buffer,x ; Load data bytes from address data + x 52 | beq end_prog ; On end of stream move to end of program 53 | sta VIA2_PORTB 54 | lda #(DATA_MODE | WRITE_MODE | PULSE) ; Set write data mode with active pulse 55 | sta VIA2_PORTA 56 | and #NPULSE ; Disable pulse bit (E) 57 | sta VIA2_PORTA 58 | inx ; Increase counter 59 | jmp loop_data 60 | end_prog: 61 | jmp end_prog 62 | 63 | lcd_init_sequence: 64 | .byte %00111100 65 | .byte %00001100 66 | .byte %00000110 67 | .byte %00000001 68 | .byte %00000000 69 | 70 | .segment "RODATA" 71 | data: 72 | .byte "Merry Christmas!",$00 73 | 74 | .segment "BSS" 75 | buffer: 76 | .res 256 -------------------------------------------------------------------------------- /Software/rom/08_stack_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=08_stack_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=stack_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/08_stack_test/stack_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | 4 | COMMAND_MODE = %00000000 5 | DATA_MODE = %00100000 6 | WRITE_MODE = %00000000 7 | READ_MODE = %01000000 8 | PULSE = %10000000 9 | 10 | NPULSE = %01111111 11 | 12 | .segment "VECTORS" 13 | 14 | .word $0000 15 | .word init 16 | .word $0000 17 | 18 | .code 19 | 20 | init: 21 | lda #%11100000 ; PA5, PA6 and PA7 are outputs 22 | sta VIA2_DDRA 23 | lda #%11111111 ; PORTB is all output 24 | sta VIA2_DDRB 25 | lda #%00000000 ; Initialize port outputs with $00 26 | sta VIA2_PORTA 27 | sta VIA2_PORTB 28 | ldx #$00 ; Initialize counter (register X) 29 | loop_init_seq: 30 | lda lcd_init_sequence,x ; Fetch data from address lcd_init_sequence + x 31 | beq data_display ; If fetched $00 (end of stream), move to data transmission 32 | jsr send_command 33 | inx ; Increase counter 34 | jmp loop_init_seq ; Keep looping over init sequence 35 | 36 | data_display: 37 | ldx #$00 ; Initialize counter 38 | loop_data: 39 | lda data,x ; Load data bytes from address data + x 40 | beq end_prog ; On end of stream move to end of program 41 | jsr send_data 42 | inx ; Increase counter 43 | jmp loop_data 44 | end_prog: 45 | jmp end_prog 46 | 47 | lcd_init_sequence: 48 | .byte %00111100 49 | .byte %00001100 50 | .byte %00000110 51 | .byte %00000001 52 | .byte %00000000 53 | 54 | send_command: 55 | sta VIA2_PORTB ; Send data to PORTB 56 | lda #(COMMAND_MODE | WRITE_MODE | PULSE) ; Set write command mode with active pulse 57 | sta VIA2_PORTA 58 | and #NPULSE ; Disable pulse bit (E) and send to LCD 59 | sta VIA2_PORTA 60 | rts 61 | 62 | send_data: 63 | sta VIA2_PORTB 64 | lda #(DATA_MODE | WRITE_MODE | PULSE) ; Set write data mode with active pulse 65 | sta VIA2_PORTA 66 | and #NPULSE ; Disable pulse bit (E) 67 | sta VIA2_PORTA 68 | rts 69 | 70 | data: 71 | .byte "Merry Christmas!",$00 72 | -------------------------------------------------------------------------------- /Software/rom/09_serial_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=09_serial_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=serial_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/10_blink_c/blink.c: -------------------------------------------------------------------------------- 1 | #include "via_utils.h" 2 | 3 | int main() { 4 | via2_set_register(VIA_REGISTER_DDRB, 0xff); 5 | 6 | while (1) { 7 | via2_set_register(VIA_REGISTER_PORTB, 0x55); 8 | via2_set_register(VIA_REGISTER_PORTB, 0xaa); 9 | } 10 | 11 | return 0; 12 | } -------------------------------------------------------------------------------- /Software/rom/10_blink_c/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=10_blink_c 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=start.s 5 | C_SOURCES=blink.c 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/10_blink_c/start.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | 3 | .export __STARTUP__ : absolute = 1 4 | 5 | .segment "VECTORS" 6 | 7 | .word $eaea 8 | .word init 9 | .word $eaea 10 | 11 | .import _main 12 | 13 | .segment "STARTUP" 14 | 15 | init: 16 | cld 17 | ldx #$ff 18 | txs 19 | 20 | jsr _main 21 | -------------------------------------------------------------------------------- /Software/rom/11_int_test/int_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | .include "via_const.inc" 4 | 5 | COMMAND_MODE = %00000000 6 | DATA_MODE = %00100000 7 | WRITE_MODE = %00000000 8 | READ_MODE = %01000000 9 | PULSE = %10000000 10 | 11 | NPULSE = %01111111 12 | 13 | .segment "VECTORS" 14 | 15 | .word $0000 16 | .word init 17 | .word handle_irq 18 | 19 | .code 20 | 21 | init: 22 | lda #%11100000 ; PA5, PA6 and PA7 are outputs 23 | sta VIA2_DDRA 24 | lda #%11111111 ; PORTB is all output 25 | sta VIA2_DDRB 26 | lda #%00000000 ; Initialize port outputs with $00 27 | sta VIA2_PORTA 28 | sta VIA2_PORTB 29 | ldx #$00 ; Initialize counter (register X) 30 | 31 | init_timer: 32 | lda #(VIA_ACR_T1_CONT_NO_PB7 | VIA_ACR_T2_TIMED | VIA_ACR_SR_DISABLED | VIA_ACR_PB_LATCH_DISABLE | VIA_ACR_PA_LATCH_DISABLE) ; T1 continuous, disable PB7 33 | sta VIA2_ACR 34 | lda #(VIA_IER_SET_FLAGS | VIA_IER_TIMER1_FLAG) ; Enable T1 interrupt 35 | sta VIA2_IER 36 | lda #50 ; Every 50 clocks 37 | sta VIA2_T1CL 38 | lda #0 39 | sta VIA2_T1CH ; Enable timer 40 | cli 41 | 42 | loop_init_seq: 43 | lda lcd_init_sequence,x ; Fetch data from address lcd_init_sequence + x 44 | beq data_display ; If fetched $00 (end of stream), move to data transmission 45 | sta VIA2_PORTB ; Send data to PORTB 46 | lda #(COMMAND_MODE | WRITE_MODE | PULSE) ; Set write command mode with active pulse 47 | sta VIA2_PORTA 48 | and #NPULSE ; Disable pulse bit (E) and send to LCD 49 | sta VIA2_PORTA 50 | inx ; Increase counter 51 | jmp loop_init_seq ; Keep looping over init sequence 52 | 53 | data_display: 54 | ldx #$00 ; Initialize counter 55 | loop_data: 56 | lda data,x ; Load data bytes from address data + x 57 | beq end_prog ; On end of stream move to end of program 58 | sta VIA2_PORTB 59 | lda #(DATA_MODE | WRITE_MODE | PULSE) ; Set write data mode with active pulse 60 | sta VIA2_PORTA 61 | and #NPULSE ; Disable pulse bit (E) 62 | sta VIA2_PORTA 63 | inx ; Increase counter 64 | jmp loop_data 65 | end_prog: 66 | jmp end_prog 67 | 68 | handle_irq: 69 | pha 70 | lda VIA2_PORTA 71 | eor #%00000001 72 | sta VIA2_PORTA 73 | lda VIA2_T1CL 74 | pla 75 | rti 76 | 77 | lcd_init_sequence: 78 | .byte %00111100 79 | .byte %00001100 80 | .byte %00000110 81 | .byte %00000001 82 | .byte %00000000 83 | 84 | data: 85 | .byte "Merry Christmas!",$00 86 | -------------------------------------------------------------------------------- /Software/rom/11_int_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=11_int_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=int_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/12_handshake_test/handshake_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "via.inc" 4 | .include "via_const.inc" 5 | .include "lcd.inc" 6 | .segment "VECTORS" 7 | 8 | .word $0000 9 | .word init 10 | .word read_data 11 | 12 | .code 13 | 14 | init: 15 | ldx #$ff 16 | txs 17 | 18 | handshake_init: 19 | stz VIA1_DDRA ; VIA2 PORTA is all input 20 | stz VIA1_PORTA 21 | ; define read handshake on VIA2 CA1/CA2 22 | lda #(VIA_PCR_CA1_INTERRUPT_NEGATIVE | VIA_PCR_CA2_OUTPUT_PULSE | VIA_PCR_CB1_INTERRUPT_NEGATIVE | VIA_PCR_CB2_OUTPUT_HIGH) 23 | sta VIA1_PCR 24 | ; enable interrupt from VIA2 on CA1 (Data ready) 25 | lda #(VIA_IER_SET_FLAGS | VIA_IER_CA1_FLAG) 26 | sta VIA1_IER 27 | 28 | jsr _lcd_init 29 | 30 | lda #$ff 31 | jsr _delay_ms 32 | lda VIA1_IFR 33 | lda VIA1_PORTA 34 | 35 | cli ; enable interrupt processing 36 | 37 | lda #('?') 38 | jsr _lcd_print_char 39 | lda #(' ') 40 | jsr _lcd_print_char 41 | 42 | program_loop: 43 | jmp program_loop 44 | 45 | read_data: 46 | pha 47 | lda VIA1_PORTA ; should trigger data taken signal 48 | jsr _lcd_print_char 49 | read_data_end: 50 | pla 51 | rti 52 | -------------------------------------------------------------------------------- /Software/rom/12_handshake_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=12_handshake_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=handshake_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/13_4bit_lcd/lcd_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "lcd.inc" 3 | 4 | .segment "VECTORS" 5 | 6 | .word $0000 7 | .word init 8 | .word $0000 9 | 10 | .code 11 | 12 | init: 13 | jsr _lcd_init 14 | 15 | write_lcd #hello_msg 16 | 17 | ldx #$00 18 | char_loop: 19 | lda chars_msg,x 20 | beq end_loop 21 | jsr _lcd_print_char 22 | inx 23 | bra char_loop 24 | end_loop: 25 | bra end_loop 26 | 27 | .segment "RODATA" 28 | 29 | hello_msg: 30 | .byte "Hello 4-bit!", $00 31 | chars_msg: 32 | .byte " Chars!",$00 -------------------------------------------------------------------------------- /Software/rom/13_4bit_lcd/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=13_4bit_lcd 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=lcd_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/14_irq_test/irq_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "via.inc" 3 | .include "via_const.inc" 4 | .segment "VECTORS" 5 | 6 | .word $0000 7 | .word init 8 | .word irq_handler 9 | 10 | .code 11 | 12 | init: 13 | irq_init: 14 | lda #(VIA_ACR_T1_CONT_NO_PB7) 15 | sta VIA2_ACR 16 | lda #(VIA_IER_SET_FLAGS | VIA_IER_TIMER1_FLAG) 17 | sta VIA2_IER 18 | 19 | lda #$30 20 | sta VIA2_T1CL 21 | lda #$00 22 | sta VIA2_T1CH 23 | cli 24 | 25 | program_loop: 26 | jmp program_loop 27 | 28 | irq_handler: 29 | pha 30 | lda VIA2_T1CL 31 | pla 32 | rti 33 | -------------------------------------------------------------------------------- /Software/rom/14_irq_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=14_irq_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=irq_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/15_serial_irq/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=15_serial_irq 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=serial_irq.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/16_delay_test/delay.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "via.inc" 5 | 6 | .segment "VECTORS" 7 | 8 | .word $0000 9 | .word init 10 | .word $0000 11 | 12 | .code 13 | 14 | init: 15 | lda #$01 16 | sta VIA1_DDRB 17 | lda #$01 18 | sta VIA1_PORTB 19 | jsr _lcd_init 20 | 21 | write_lcd #hello_msg 22 | 23 | lda #$03 24 | jsr _delay_sec 25 | ldx #$00 26 | jsr _lcd_clear 27 | lda #$02 28 | jsr _delay_sec 29 | ldx #05 30 | ldy #01 31 | jsr lcd_set_position 32 | ldx #$00 33 | char_loop: 34 | lda chars_msg,x 35 | beq end_loop 36 | jsr _lcd_print_char 37 | inx 38 | bra char_loop 39 | end_loop: 40 | bra end_loop 41 | 42 | .segment "RODATA" 43 | 44 | hello_msg: 45 | .byte "Hello 4-bit! Long text kept here for testing purposes of the LCD implementation including full word wrap", $00 46 | chars_msg: 47 | .byte "Single chars!",$00 48 | -------------------------------------------------------------------------------- /Software/rom/16_delay_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=16_delay_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=delay.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/17_blink_test/blink.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "via.inc" 5 | .include "blink.inc" 6 | 7 | .segment "VECTORS" 8 | 9 | .word $0000 10 | .word init 11 | .word $0000 12 | 13 | .code 14 | 15 | init: 16 | jsr _lcd_init 17 | 18 | write_lcd #blink_msg 19 | 20 | lda #$01 21 | jsr _delay_sec 22 | lda VIA1_DDRB 23 | ora #%00000001 24 | sta VIA1_DDRB 25 | lda #$ff 26 | sta VIA2_DDRA 27 | sta VIA2_DDRB 28 | blink_loop: 29 | ; enable LED 30 | lda #(BLINK_LED_ON) 31 | jsr _blink_led 32 | ; blink VIA2 port A 33 | lda #$ff 34 | sta VIA2_PORTA 35 | ; disable VIA2 port B 36 | lda #$00 37 | sta VIA2_PORTB 38 | ; delay 1s 39 | lda #$01 40 | jsr _delay_sec 41 | ; disable LED 42 | lda #(BLINK_LED_OFF) 43 | jsr _blink_led 44 | ; disable VIA2 port A 45 | lda #$00 46 | sta VIA2_PORTA 47 | ; enable VIA2 port B 48 | lda #$ff 49 | sta VIA2_PORTB 50 | ; delay another second 51 | lda #$01 52 | jsr _delay_sec 53 | ; repeat 54 | bra blink_loop 55 | 56 | .segment "RODATA" 57 | 58 | blink_msg: 59 | .byte "Blink test", $00 60 | -------------------------------------------------------------------------------- /Software/rom/17_blink_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=17_blink_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=blink.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/18_core_program/main.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "core.inc" 5 | .include "acia.inc" 6 | 7 | .segment "VECTORS" 8 | 9 | .word $0000 10 | .word init 11 | .word _interrupt_handler 12 | 13 | .code 14 | 15 | init: 16 | ; Set up stack 17 | ldx #$ff 18 | txs 19 | ; Run setup routine 20 | jsr _system_init 21 | 22 | wait_for_acia_input: 23 | jsr _acia_is_data_available 24 | cmp #(ACIA_NO_DATA_AVAILABLE) 25 | beq wait_for_acia_input 26 | 27 | ldx #00 28 | prompt_loop: 29 | lda prompt,x 30 | beq main_loop 31 | jsr _acia_write_byte 32 | inx 33 | bra prompt_loop 34 | 35 | main_loop: 36 | 37 | ldx #00 38 | ldy #01 39 | jsr lcd_set_position 40 | lda acia_tx_rptr 41 | jsr convert_to_hex 42 | txa 43 | jsr _lcd_print_char 44 | tya 45 | jsr _lcd_print_char 46 | 47 | ldx #03 48 | ldy #01 49 | jsr lcd_set_position 50 | lda acia_tx_wptr 51 | jsr convert_to_hex 52 | txa 53 | jsr _lcd_print_char 54 | tya 55 | jsr _lcd_print_char 56 | 57 | ldx #06 58 | ldy #01 59 | jsr lcd_set_position 60 | lda acia_rx_rptr 61 | jsr convert_to_hex 62 | txa 63 | jsr _lcd_print_char 64 | tya 65 | jsr _lcd_print_char 66 | 67 | ldx #09 68 | ldy #01 69 | jsr lcd_set_position 70 | lda acia_rx_wptr 71 | jsr convert_to_hex 72 | txa 73 | jsr _lcd_print_char 74 | tya 75 | jsr _lcd_print_char 76 | 77 | jsr _acia_is_data_available 78 | cmp #(ACIA_NO_DATA_AVAILABLE) 79 | beq main_loop 80 | jsr _acia_read_byte 81 | ldx #08 82 | ldy #00 83 | jsr lcd_set_position 84 | jsr _lcd_print_char 85 | lda #200 86 | jsr _delay_ms 87 | bra main_loop 88 | 89 | prompt: 90 | .byte "OS/1 >>", $0a, $0d, $00 -------------------------------------------------------------------------------- /Software/rom/18_core_program/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=18_core_program 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=main.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/19_keyboard_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=19_keyboard_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=keyboard_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/20_convert_test/convert_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .segment "VECTORS" 4 | 5 | .word $0000 6 | .word init 7 | .word $0000 8 | 9 | .code 10 | 11 | init: 12 | ldx #$ff 13 | txs 14 | 15 | loop: 16 | lda #$61 17 | jsr convert_to_hex 18 | stx $2000 19 | sty $2001 20 | lda #$2a 21 | jsr convert_to_hex 22 | stx $2002 23 | sty $2003 24 | lda #$47 25 | jsr convert_to_hex 26 | stx $2004 27 | sty $2005 28 | bra loop 29 | -------------------------------------------------------------------------------- /Software/rom/20_convert_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=20_convert_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=convert_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/21_serial_load_test/main.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "core.inc" 5 | .include "acia.inc" 6 | 7 | .segment "VECTORS" 8 | 9 | .word $0000 10 | .word init 11 | .word _interrupt_handler 12 | 13 | .code 14 | 15 | init: 16 | ; Set up stack 17 | ldx #$ff 18 | txs 19 | ; Run setup routine 20 | jsr _system_init 21 | 22 | stz bytescount 23 | stz bytescount+1 24 | 25 | wait_for_acia_input: 26 | jsr _acia_is_data_available 27 | cmp #(ACIA_NO_DATA_AVAILABLE) 28 | beq wait_for_acia_input 29 | 30 | ldx #00 31 | prompt_loop: 32 | lda prompt,x 33 | beq main_loop 34 | jsr _acia_write_byte 35 | inx 36 | bra prompt_loop 37 | 38 | main_loop: 39 | 40 | ldx #00 41 | ldy #01 42 | jsr lcd_set_position 43 | lda acia_tx_rptr 44 | jsr convert_to_hex 45 | txa 46 | jsr _lcd_print_char 47 | tya 48 | jsr _lcd_print_char 49 | 50 | ldx #03 51 | ldy #01 52 | jsr lcd_set_position 53 | lda acia_tx_wptr 54 | jsr convert_to_hex 55 | txa 56 | jsr _lcd_print_char 57 | tya 58 | jsr _lcd_print_char 59 | 60 | ldx #06 61 | ldy #01 62 | jsr lcd_set_position 63 | lda acia_rx_rptr 64 | jsr convert_to_hex 65 | txa 66 | jsr _lcd_print_char 67 | tya 68 | jsr _lcd_print_char 69 | 70 | ldx #09 71 | ldy #01 72 | jsr lcd_set_position 73 | lda acia_rx_wptr 74 | jsr convert_to_hex 75 | txa 76 | jsr _lcd_print_char 77 | tya 78 | jsr _lcd_print_char 79 | 80 | ldx #00 81 | ldy #02 82 | jsr lcd_set_position 83 | lda bytescount+1 84 | jsr convert_to_hex 85 | txa 86 | jsr _lcd_print_char 87 | tya 88 | jsr _lcd_print_char 89 | 90 | lda bytescount 91 | jsr convert_to_hex 92 | txa 93 | jsr _lcd_print_char 94 | tya 95 | jsr _lcd_print_char 96 | 97 | jsr _acia_is_data_available 98 | cmp #(ACIA_NO_DATA_AVAILABLE) 99 | beq main_loop 100 | jsr _acia_read_byte 101 | ldx #08 102 | ldy #00 103 | jsr lcd_set_position 104 | jsr _lcd_print_char 105 | inc bytescount 106 | bne not_full 107 | inc bytescount+1 108 | not_full: 109 | lda #5 110 | jsr _delay_ms 111 | 112 | jmp main_loop 113 | 114 | .segment "BSS" 115 | bytescount: 116 | .res 2 117 | lastdata: 118 | .res 1 119 | 120 | .segment "RODATA" 121 | prompt: 122 | .byte "OS/1 >>", $0a, $0d, $00 -------------------------------------------------------------------------------- /Software/rom/21_serial_load_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=21_serial_load_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=main.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/22_modem_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=22_modem_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=modem_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/22_modem_test/modem_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "core.inc" 5 | .include "acia.inc" 6 | .include "modem.inc" 7 | .include "syscalls.inc" 8 | 9 | .segment "VECTORS" 10 | 11 | .word $0000 12 | .word init 13 | .word _interrupt_handler 14 | 15 | .code 16 | 17 | init: 18 | ; Set up stack 19 | ldx #$ff 20 | txs 21 | ; Run setup routine 22 | jsr _system_init 23 | ; lda #$03 24 | ; jsr _delay_sec 25 | 26 | wait_for_acia_input: 27 | jsr _acia_is_data_available 28 | cmp #(ACIA_NO_DATA_AVAILABLE) 29 | beq wait_for_acia_input 30 | jsr _acia_read_byte 31 | 32 | ldx #00 33 | prompt_loop: 34 | lda prompt,x 35 | beq main_loop 36 | jsr _acia_write_byte 37 | inx 38 | bra prompt_loop 39 | 40 | main_loop: 41 | jsr _modem_receive 42 | cmp #(MODEM_RECEIVE_SUCCESS) 43 | bne main_loop 44 | jsr $1000 45 | jmp main_loop 46 | 47 | .segment "RODATA" 48 | prompt: 49 | .byte "OS/1 Boot", $0a, $0d, $00 -------------------------------------------------------------------------------- /Software/rom/23_blink_test/blink_test.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "blink.inc" 3 | .include "utils.inc" 4 | 5 | .segment "VECTORS" 6 | 7 | .word $0000 8 | .word init 9 | .word $0000 10 | 11 | .code 12 | init: 13 | jsr _blink_init 14 | ldx #10 15 | main_loop: 16 | lda #(BLINK_LED_ON) 17 | jsr _blink_led 18 | lda #250 19 | jsr _delay_ms 20 | lda #(BLINK_LED_OFF) 21 | jsr _blink_led 22 | lda #250 23 | jsr _delay_ms 24 | dex 25 | bne main_loop 26 | rts 27 | -------------------------------------------------------------------------------- /Software/rom/23_blink_test/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=23_blink_test 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=blink_test.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/24_serial_wdc/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=24_serial_wdc 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=serial_wdc.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/25_serial_wdc_irq/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=25_serial_wdc_irq 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=serial_wdc_irq.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/README.txt: -------------------------------------------------------------------------------- 1 | look into msbasic.s for the README 2 | visit www.pagetable.com for more info 3 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/TODO.txt: -------------------------------------------------------------------------------- 1 | * convert messy init code into completely different 2 | files without ifdefs (not much in common!) 3 | * move all machine specific code into separate files 4 | * rename all labels that point to RTS to RTSn 5 | * add AppleSoft comments 6 | * look for all " $", i.e. (zeropage) constants, replace them 7 | with symbols 8 | * convert platform ifdefs in generic files into feature ifdefs or macros 9 | * reconstruct pre-CBM1, i.e. CBM1 without the patches 10 | * add some comments to every file 11 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/apple_iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ISCNTC: 3 | lda $C000 4 | cmp #$83 5 | beq L0ECC 6 | rts 7 | L0ECC: 8 | jsr RDKEY 9 | cmp #$03 10 | ;!!! runs into "STOP" -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/apple_loadsave.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | 3 | SAVE: 4 | jsr L0F42 5 | jsr LFECD 6 | jsr L0F51 7 | jmp LFECD 8 | LOAD: 9 | jsr L0F42 10 | jsr LFEFD 11 | jsr L0F51 12 | jsr LFEFD 13 | lda #QT_LOADED 15 | jsr STROUT 16 | jmp FIX_LINKS 17 | QT_LOADED: 18 | .byte 0 ; XXX PATCHED 19 | .byte "OADED" 20 | .byte 0 21 | L0F42: 22 | lda #$6C 23 | ldy #$00 24 | sta $3C 25 | sty $3D 26 | lda #$6E 27 | sta $3E 28 | sty $3F 29 | rts 30 | L0F51: 31 | lda $6A 32 | ldy $6B 33 | sta $3C 34 | sty $3D 35 | lda $6C 36 | ldy $6D 37 | sta $3E 38 | sty $3F 39 | rts 40 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/applesoft.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $0800, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/cbm1_patches.s: -------------------------------------------------------------------------------- 1 | .segment "INIT" 2 | 3 | PATCH1: 4 | clc 5 | jmp CONTROL_C_TYPED 6 | PATCH2: 7 | bit FAC+4 8 | bpl LE1AA 9 | cmp #$54 10 | bne LE1AA 11 | jmp LCE3B 12 | LE1AA: 13 | rts 14 | PATCH3: 15 | bit FAC+4 16 | bmi LE1B2 17 | jmp LCE90 18 | LE1B2: 19 | cmp #$54 20 | beq LE1B9 21 | jmp LCE82 22 | LE1B9: 23 | jmp LCE69 24 | PATCH4: 25 | sta CHARAC 26 | inx 27 | jmp LE1D9 28 | PATCH5: 29 | bpl LE1C9 30 | lda Z8C 31 | ldy Z8C+1 32 | rts 33 | LE1C9: 34 | ldy #$FF 35 | rts 36 | PATCH6: 37 | bne LE1D8 38 | LE1CE: 39 | inc POSX 40 | bne LE1D8 41 | lda $E2 42 | sta POSX 43 | bne LE1CE 44 | LE1D8: 45 | rts 46 | LE1D9: 47 | stx TXTPTR 48 | pla 49 | pla 50 | tya 51 | jmp L2B1C 52 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/cbm_iscntc.s: -------------------------------------------------------------------------------- 1 | ; nothing - ISCNTC is a KERNAL function -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/cbmbasic1.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $C000, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/cbmbasic2.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $C000, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/chrget.s: -------------------------------------------------------------------------------- 1 | .segment "RODATA" 2 | RAMSTART1: 3 | GENERIC_CHRGET: 4 | inc TXTPTR 5 | bne GENERIC_CHRGOT 6 | inc TXTPTR+1 7 | GENERIC_CHRGOT: 8 | GENERIC_TXTPTR = GENERIC_CHRGOT + 1 9 | lda $EA60 10 | .ifdef KBD 11 | jsr LF430 12 | .endif 13 | cmp #$3A 14 | bcs L4058 15 | GENERIC_CHRGOT2: 16 | cmp #$20 17 | beq GENERIC_CHRGET 18 | sec 19 | sbc #$30 20 | sec 21 | sbc #$D0 22 | L4058: 23 | rts 24 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines.s: -------------------------------------------------------------------------------- 1 | .if .def(cbmbasic1) 2 | CBM1 := 1 3 | .include "defines_cbm1.s" 4 | .elseif .def(osi) 5 | OSI := 1 6 | .include "defines_osi.s" 7 | .elseif .def(applesoft) 8 | APPLE := 1 9 | .include "defines_apple.s" 10 | .elseif .def(kb9) 11 | KIM := 1 12 | .include "defines_kim.s" 13 | .elseif .def(cbmbasic2) 14 | CBM2 := 1 15 | .include "defines_cbm2.s" 16 | .elseif .def(kbdbasic) 17 | KBD := 1 18 | .include "defines_kbd.s" 19 | .elseif .def(microtan) 20 | MICROTAN := 1 21 | .include "defines_microtan.s" 22 | .elseif .def(db6502) 23 | DB6502 := 1 24 | .include "defines_db6502.s" 25 | .endif 26 | 27 | .ifdef CONFIG_2C 28 | CONFIG_2B := 1 29 | .endif 30 | .ifdef CONFIG_2B 31 | CONFIG_2A := 1 32 | .endif 33 | .ifdef CONFIG_2A 34 | CONFIG_2 := 1 35 | .endif 36 | .ifdef CONFIG_2 37 | CONFIG_11A := 1 38 | .endif 39 | .ifdef CONFIG_11A 40 | CONFIG_11 := 1 41 | .endif 42 | .ifdef CONFIG_11 43 | CONFIG_10A := 1 44 | .endif 45 | 46 | .ifdef CONFIG_SMALL 47 | BYTES_FP := 4 48 | .else 49 | BYTES_FP := 5 50 | .endif 51 | 52 | .ifndef BYTES_PER_ELEMENT 53 | BYTES_PER_ELEMENT := BYTES_FP 54 | .endif 55 | BYTES_PER_VARIABLE := BYTES_FP+2 56 | MANTISSA_BYTES := BYTES_FP-1 57 | BYTES_PER_FRAME := 2*BYTES_FP+8 58 | FOR_STACK1 := 2*BYTES_FP+5 59 | FOR_STACK2 := BYTES_FP+4 60 | 61 | .ifndef MAX_EXPON 62 | MAX_EXPON = 10 63 | .endif 64 | 65 | STACK := $0100 66 | 67 | .ifdef INPUTBUFFER 68 | .if INPUTBUFFER >= $0100 69 | CONFIG_NO_INPUTBUFFER_ZP := 1 70 | .endif 71 | .if INPUTBUFFER = $0200 72 | CONFIG_INPUTBUFFER_0200 := 1 73 | .endif 74 | .endif 75 | INPUTBUFFERX = INPUTBUFFER & $FF00 76 | 77 | CR=13 78 | LF=10 79 | 80 | .ifndef CRLF_1 81 | CRLF_1 := CR 82 | CRLF_2 := LF 83 | .endif 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_apple.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | CONFIG_11 := 1 3 | 4 | APPLE_BAD_BYTE := 1 5 | CONFIG_IO_MSB := 1 ; all I/O has bit #7 set 6 | CONFIG_PRINT_CR := 1 ; print CR when line end reached 7 | CONFIG_SAFE_NAMENOTFOUND := 1 8 | CONFIG_SCRTCH_ORDER := 3 9 | 10 | BYTES_PER_ELEMENT := 6 ; XXX override 11 | 12 | ; zero page 13 | ZP_START1 = $00 14 | ZP_START2 = $4F 15 | ZP_START3 = $0D 16 | ZP_START4 = $55 17 | 18 | ;extra ZP variables 19 | USR := $000A 20 | 21 | ; inputbuffer 22 | INPUTBUFFER := $0200 23 | 24 | ; constants 25 | STACK_TOP := $F8 26 | SPACE_FOR_GOSUB := $36 27 | CRLF_1 := CR 28 | CRLF_2 := $80 29 | WIDTH := 40 30 | WIDTH2 := 14 31 | 32 | ; memory layout 33 | RAMSTART2 := $2A00 34 | 35 | ; monitor functions 36 | MONRDKEY := $FD0C 37 | MONCOUT := $FDED 38 | LF689 := $F689 39 | LF800 := $F800 40 | LF819 := $F819 41 | LF828 := $F828 42 | LF864 := $F864 43 | TEX := $FB2F 44 | LFB40 := $FB40 45 | LFD0C := $FD0C 46 | LFD6A := $FD6A 47 | LFECD := $FECD 48 | LFEFD := $FEFD 49 | 50 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_cbm1.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | ; oldest known version, no CONFIG_n 3 | 4 | CONFIG_CBM_ALL := 1 5 | CONFIG_CBM1_PATCHES := 1 ; ** don't turn off! ** 6 | 7 | CONFIG_DATAFLG := 1 8 | CONFIG_FILE := 1; support PRINT#, INPUT#, GET#, CMD 9 | CONFIG_NO_CR := 1; terminal doesn't need explicit CRs on line ends 10 | CONFIG_NO_LINE_EDITING := 1; support for "@", "_", BEL etc. 11 | CONFIG_PRINTNULLS := 1; whether PRINTNULLS does anything 12 | CONFIG_SCRTCH_ORDER := 2 13 | 14 | ; zero page 15 | ZP_START1 = $00 16 | ZP_START2 = $04 17 | ZP_START3 = $5A 18 | ZP_START4 = $65 19 | 20 | ; extra ZP variables 21 | CURDVC := $0003 22 | TISTR := $0200 23 | Z96 := $020C 24 | USR := GORESTART 25 | 26 | ; constants 27 | SPACE_FOR_GOSUB := $36 28 | STACK_TOP := $FC 29 | NULL_MAX := $0A 30 | MAX_EXPON := 12 ; XXX override 31 | 32 | RAMSTART2 := $0400 33 | 34 | ; magic memory locations 35 | ENTROPY = $9044 36 | 37 | ; monitor functions 38 | OPEN := $FFC0 39 | CLOSE := $FFC3 40 | CHKIN := $FFC6 41 | CHKOUT := $FFC9 42 | CLRCH := $FFCC 43 | CHRIN := $FFCF 44 | CHROUT := $FFD2 45 | LOAD := $FFD5 46 | SAVE := $FFD8 47 | VERIFY := $FFDB 48 | SYS := $FFDE 49 | ISCNTC := $FFE1 50 | GETIN := $FFE4 51 | CLALL := $FFE7 52 | LE7F3 := $E7F3; for CBM1 53 | MONCOUT := CHROUT 54 | MONRDKEY := GETIN 55 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_cbm2.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | CONFIG_2A := 1 3 | 4 | CONFIG_CBM_ALL := 1 5 | 6 | CONFIG_DATAFLG := 1 7 | CONFIG_EASTER_EGG := 1 8 | CONFIG_FILE := 1; support PRINT#, INPUT#, GET#, CMD 9 | CONFIG_NO_CR := 1; terminal doesn't need explicit CRs on line ends 10 | CONFIG_NO_LINE_EDITING := 1; support for "@", "_", BEL etc. 11 | CONFIG_NO_READ_Y_IS_ZERO_HACK := 1 12 | CONFIG_PEEK_SAVE_LINNUM := 1 13 | CONFIG_SCRTCH_ORDER := 2 14 | 15 | ; zero page 16 | ZP_START1 = $00 17 | ZP_START2 = $0D 18 | ZP_START3 = $03 19 | ZP_START4 = $13 20 | 21 | ; extra/override ZP variables 22 | CURDVC := $000E 23 | TISTR := $008D 24 | Z96 := $0096 25 | POSX := $00C6 26 | TXPSV := LASTOP 27 | USR := GORESTART ; XXX 28 | 29 | ; inputbuffer 30 | INPUTBUFFER := $0200 31 | 32 | ; constants 33 | SPACE_FOR_GOSUB := $3E 34 | STACK_TOP := $FA 35 | WIDTH := 40 36 | WIDTH2 := 30 37 | 38 | RAMSTART2 := $0400 39 | 40 | ; magic memory locations 41 | ENTROPY = $E844 42 | 43 | ; monitor functions 44 | OPEN := $FFC0 45 | CLOSE := $FFC3 46 | CHKIN := $FFC6 47 | CHKOUT := $FFC9 48 | CLRCH := $FFCC 49 | CHRIN := $FFCF 50 | CHROUT := $FFD2 51 | LOAD := $FFD5 52 | SAVE := $FFD8 53 | VERIFY := $FFDB 54 | SYS := $FFDE 55 | ISCNTC := $FFE1 56 | GETIN := $FFE4 57 | CLALL := $FFE7 58 | LE7F3 := $E7F3; for CBM1 59 | MONCOUT := CHROUT 60 | MONRDKEY := GETIN 61 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_db6502.s: -------------------------------------------------------------------------------- 1 | .import __USERRAM_START__ 2 | 3 | ; configuration 4 | CONFIG_2C := 1 5 | 6 | CONFIG_DATAFLG := 1 7 | CONFIG_NULL := 1 8 | CONFIG_PRINT_CR := 0 ; print CR when line end reached 9 | CONFIG_SCRTCH_ORDER := 3 10 | CONFIG_SMALL := 1 11 | 12 | ; zero page 13 | ZP_START1 = $00 14 | ZP_START2 = $0D 15 | ZP_START3 = $5B 16 | ZP_START4 = $65 17 | 18 | ;extra ZP variables 19 | USR := $000A 20 | 21 | ; inputbuffer 22 | INPUTBUFFER := $0900 23 | 24 | ; constants 25 | STACK_TOP := $FC 26 | SPACE_FOR_GOSUB := $33 27 | NULL_MAX := $0A 28 | WIDTH := 72 29 | WIDTH2 := 56 30 | 31 | ; memory layout 32 | RAMSTART2 := __USERRAM_START__ 33 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_kbd.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | CONFIG_2B := 1 3 | 4 | CONFIG_NO_POKE := 1 5 | CONFIG_NO_READ_Y_IS_ZERO_HACK := 1 6 | CONFIG_SAFE_NAMENOTFOUND := 1 7 | CONFIG_SCRTCH_ORDER := 3 8 | CONFIG_SMALL := 1 9 | 10 | ; zero page 11 | ZP_START1 = $00 12 | ZP_START2 = $0F 13 | ZP_START3 = $06 14 | ZP_START4 = $15 15 | 16 | ; extra/override ZP variables 17 | TXPSV := $0049 18 | JMPADRS := $0093 19 | LOWTRX := $0094 ; $AB also EXPSGN? 20 | Z96 := $0096 21 | Z17 := $06FC 22 | Z18 := $06FD 23 | 24 | ; inputbuffer 25 | INPUTBUFFER := $0700 26 | 27 | ; constants 28 | STACK_TOP := $FE 29 | SPACE_FOR_GOSUB := $49 30 | CRLF_1 := LF 31 | CRLF_2 := CR 32 | 33 | ; magic memory locations 34 | L06FE := $06FE 35 | L6874 := $6874 36 | 37 | ; memory layout 38 | RAMSTART2 := $0300 39 | CONST_MEMSIZ := $3FFF 40 | 41 | ; monitor functions 42 | MONCOUT := $FDFA 43 | LC000 := $C000 44 | LC009 := $C009 45 | LDE24 := $DE24 46 | PRIMM := $DE42 47 | LDE48 := $DE48 48 | LDE53 := $DE53 49 | LDE7F := $DE7F 50 | LDE8C := $DE8C 51 | 52 | 53 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_kim.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | CONFIG_11A := 1 3 | 4 | CONFIG_MONCOUT_DESTROYS_Y := 1 5 | CONFIG_NULL := 1 6 | CONFIG_PRINT_CR := 1 ; print CR when line end reached 7 | CONFIG_RAM := 1 8 | CONFIG_ROR_WORKAROUND := 1 9 | CONFIG_SAFE_NAMENOTFOUND := 1 10 | CONFIG_SCRTCH_ORDER := 2 11 | 12 | ; zero page 13 | ZP_START1 = $00 14 | ZP_START2 = $15 15 | ZP_START3 = $0A 16 | ZP_START4 = $63 17 | 18 | ; constants 19 | STACK_TOP := $FC 20 | SPACE_FOR_GOSUB := $36 21 | NULL_MAX := $F2 ; probably different in original version; the image I have seems to be modified; see PDF 22 | WIDTH := 72 23 | WIDTH2 := 56 24 | 25 | ; magic memory locations 26 | L1800 := $1800 27 | L1873 := $1873 28 | 29 | ; monitor functions 30 | MONRDKEY := $1E5A 31 | MONCOUT := $1EA0 32 | 33 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_microtan.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | CONFIG_2C := 1 3 | 4 | CONFIG_NULL := 1 5 | CONFIG_MONCOUT_DESTROYS_Y := 1 6 | CONFIG_PEEK_SAVE_LINNUM := 1 7 | CONFIG_PRINT_CR := 1 ; print CR when line end reached 8 | CONFIG_ROR_WORKAROUND := 1 9 | CONFIG_SAFE_NAMENOTFOUND := 1 10 | CONFIG_SCRTCH_ORDER := 1 11 | 12 | ; zero page 13 | ZP_START1 = $17 14 | ZP_START2 = $2F 15 | ZP_START3 = $24 16 | ZP_START4 = $85 17 | 18 | ;extra ZP variables 19 | USR := $0021 20 | TXPSV := $00BA 21 | 22 | ; constants 23 | STACK_TOP := $FE 24 | SPACE_FOR_GOSUB := $3E 25 | NULL_MAX := $F0 26 | WIDTH := 80 27 | WIDTH2 := 56 28 | ; memory layout 29 | RAMSTART2 := $0400 30 | 31 | ; monitor functions 32 | MONRDKEY := $E210 33 | MONRDKEY2 := $E213 34 | MONCOUT := $E216 35 | LF000 := $F000 36 | LF003 := $F003 37 | LF006 := $F006 38 | LF009 := $F009 39 | LF00C := $F00C 40 | LF00F := $F00F 41 | LF018 := $F018 42 | LF01B := $F01B 43 | LF01E := $F01E 44 | LF021 := $F021 45 | LFDFA := $FDFA 46 | LFE73 := $FE73 47 | LFE75 := $FE75 48 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/defines_osi.s: -------------------------------------------------------------------------------- 1 | ; configuration 2 | CONFIG_10A := 1 3 | 4 | CONFIG_DATAFLG := 1 5 | CONFIG_NULL := 1 6 | CONFIG_PRINT_CR := 1 ; print CR when line end reached 7 | CONFIG_SCRTCH_ORDER := 3 8 | CONFIG_SMALL := 1 9 | 10 | ; zero page 11 | ZP_START1 = $00 12 | ZP_START2 = $0D 13 | ZP_START3 = $5B 14 | ZP_START4 = $65 15 | 16 | ;extra ZP variables 17 | USR := $000A 18 | 19 | ; constants 20 | STACK_TOP := $FC 21 | SPACE_FOR_GOSUB := $33 22 | NULL_MAX := $0A 23 | WIDTH := 72 24 | WIDTH2 := 56 25 | 26 | ; memory layout 27 | RAMSTART2 := $0300 28 | 29 | ; magic memory locations 30 | L0200 := $0200 31 | 32 | ; monitor functions 33 | MONRDKEY := $FFEB 34 | MONCOUT := $FFEE 35 | MONISCNTC := $FFF1 36 | LOAD := $FFF4 37 | SAVE := $FFF7 38 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/error.s: -------------------------------------------------------------------------------- 1 | init_error_table 2 | 3 | .ifdef CONFIG_SMALL 4 | define_error ERR_NOFOR, "NF" 5 | define_error ERR_SYNTAX, "SN" 6 | define_error ERR_NOGOSUB, "RG" 7 | define_error ERR_NODATA, "OD" 8 | define_error ERR_ILLQTY, "FC" 9 | define_error ERR_OVERFLOW, "OV" 10 | define_error ERR_MEMFULL, "OM" 11 | define_error ERR_UNDEFSTAT, "US" 12 | define_error ERR_BADSUBS, "BS" 13 | define_error ERR_REDIMD, "DD" 14 | define_error ERR_ZERODIV, "/0" 15 | define_error ERR_ILLDIR, "ID" 16 | define_error ERR_BADTYPE, "TM" 17 | define_error ERR_STRLONG, "LS" 18 | define_error ERR_FRMCPX, "ST" 19 | define_error ERR_CANTCONT, "CN" 20 | define_error ERR_UNDEFFN, "UF" 21 | .else 22 | define_error ERR_NOFOR, "NEXT WITHOUT FOR" 23 | define_error ERR_SYNTAX, "SYNTAX" 24 | define_error ERR_NOGOSUB, "RETURN WITHOUT GOSUB" 25 | define_error ERR_NODATA, "OUT OF DATA" 26 | define_error ERR_ILLQTY, "ILLEGAL QUANTITY" 27 | .ifdef CBM1 28 | .byte 0,0,0,0,0 29 | .endif 30 | define_error ERR_OVERFLOW, "OVERFLOW" 31 | define_error ERR_MEMFULL, "OUT OF MEMORY" 32 | define_error ERR_UNDEFSTAT, "UNDEF'D STATEMENT" 33 | define_error ERR_BADSUBS, "BAD SUBSCRIPT" 34 | define_error ERR_REDIMD, "REDIM'D ARRAY" 35 | define_error ERR_ZERODIV, "DIVISION BY ZERO" 36 | define_error ERR_ILLDIR, "ILLEGAL DIRECT" 37 | define_error ERR_BADTYPE, "TYPE MISMATCH" 38 | define_error ERR_STRLONG, "STRING TOO LONG" 39 | .ifdef CONFIG_FILE 40 | .ifdef CBM1 41 | define_error ERR_BADDATA, "BAD DATA" 42 | .else 43 | define_error ERR_BADDATA, "FILE DATA" 44 | .endif 45 | .endif 46 | define_error ERR_FRMCPX, "FORMULA TOO COMPLEX" 47 | define_error ERR_CANTCONT, "CAN'T CONTINUE" 48 | define_error ERR_UNDEFFN, "UNDEF'D FUNCTION" 49 | .endif -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/extra.s: -------------------------------------------------------------------------------- 1 | .segment "EXTRA" 2 | 3 | .ifdef KIM 4 | .include "kim_extra.s" 5 | .endif 6 | 7 | .ifdef CONFIG_CBM1_PATCHES 8 | .include "cbm1_patches.s" 9 | .endif 10 | 11 | .ifdef KBD 12 | .include "kbd_extra.s" 13 | .endif 14 | 15 | .ifdef APPLE 16 | .include "apple_extra.s" 17 | .endif 18 | 19 | .ifdef MICROTAN 20 | .include "microtan_extra.s" 21 | .endif 22 | 23 | .ifdef DB6502 24 | .include "db6502_extra.s" 25 | .endif -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/header.s: -------------------------------------------------------------------------------- 1 | .segment "HEADER" 2 | .ifdef KBD 3 | jmp LE68C 4 | .byte $00,$13,$56 5 | .endif 6 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ; ---------------------------------------------------------------------------- 3 | ; SEE IF CONTROL-C TYPED 4 | ; ---------------------------------------------------------------------------- 5 | .ifndef CONFIG_CBM_ALL 6 | .include "cbm_iscntc.s" 7 | .endif 8 | .ifdef KBD 9 | .include "kbd_iscntc.s" 10 | .endif 11 | .ifdef OSI 12 | .include "osi_iscntc.s" 13 | .endif 14 | .ifdef APPLE 15 | .include "apple_iscntc.s" 16 | .endif 17 | .ifdef KIM 18 | .include "kim_iscntc.s" 19 | .endif 20 | .ifdef MICROTAN 21 | .include "microtan_iscntc.s" 22 | .endif 23 | ;!!! runs into "STOP" -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kb9.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $2000, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kbd_iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ISCNTC: 3 | jsr LE8F3 4 | bcc RET1 5 | LE633: 6 | jsr LDE7F 7 | beq STOP 8 | cmp #$03 9 | bne LE633 10 | ;!!! runs into "STOP" -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kbd_loadsave.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | SLOD: 3 | ldx #$01 4 | .byte $2C 5 | PLOD: 6 | ldx #$00 7 | ldy CURLIN+1 8 | iny 9 | sty JMPADRS 10 | jsr LFFD3 11 | jsr VARTAB_MINUS_2_TO_AY 12 | ldx #$02 13 | jsr LFF64 14 | ldx #$6F 15 | ldy #$00 16 | jsr LE39A 17 | jsr LE33D 18 | jmp CLEARC 19 | .byte $FF,$FF,$FF 20 | 21 | ; ---------------------------------------------------------------------------- 22 | VER: 23 | lda #$13 24 | ldx FAC 25 | beq LE397 26 | lda $DFF9 27 | LE397: 28 | jmp FLOAT 29 | LE39A: 30 | lda VARTAB,x 31 | clc 32 | adc $051B,y 33 | sta VARTAB,y 34 | lda VARTAB+1,x 35 | adc $051C,y 36 | sta VARTAB+1,y 37 | ; !!! next instruction is an RTS! -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kbdbasic.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $E000, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kim_extra.s: -------------------------------------------------------------------------------- 1 | .segment "EXTRA" 2 | 3 | RAMSTART2: 4 | .byte $08,$29,$25,$20,$60,$2A,$E5,$E4 5 | .byte $20,$66,$24,$65,$AC,$04,$A4 6 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kim_iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ISCNTC: 3 | lda #$01 4 | bit $1740 5 | bmi RET2 6 | ldx #$08 7 | lda #$03 8 | clc 9 | cmp #$03 10 | ;!!! runs into "STOP" -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/kim_loadsave.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | SAVE: 3 | tsx 4 | stx INPUTFLG 5 | lda #$37 6 | sta $F2 7 | lda #$FE 8 | sta $17F9 9 | lda TXTTAB 10 | ldy TXTTAB+1 11 | sta $17F5 12 | sty $17F6 13 | lda VARTAB 14 | ldy VARTAB+1 15 | sta $17F7 16 | sty $17F8 17 | jmp L1800 18 | ldx INPUTFLG 19 | txs 20 | lda #QT_SAVED 22 | jmp STROUT 23 | QT_LOADED: 24 | .byte "LOADED" 25 | .byte $00 26 | QT_SAVED: 27 | .byte "SAVED" 28 | .byte $0D,$0A,$00,$00,$00,$00,$00,$00 29 | .byte $00,$00,$00,$00,$00,$00,$00,$00 30 | .byte $00,$00,$00,$00,$00,$00,$00 31 | LOAD: 32 | lda TXTTAB 33 | ldy TXTTAB+1 34 | sta $17F5 35 | sty $17F6 36 | lda #$FF 37 | sta $17F9 38 | lda #L27A6 40 | sta GORESTART+1 41 | sty GORESTART+2 42 | jmp L1873 43 | L27A6: 44 | ldx #$FF 45 | txs 46 | lda #RESTART 48 | sta GORESTART+1 49 | sty GORESTART+2 50 | lda #QT_LOADED 52 | jsr STROUT 53 | ldx $17ED 54 | ldy $17EE 55 | txa 56 | bne L27C2 57 | nop 58 | L27C2: 59 | nop 60 | stx VARTAB 61 | sty VARTAB+1 62 | jmp FIX_LINKS 63 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/loadsave.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | 3 | .ifdef APPLE 4 | .include "apple_loadsave.s" 5 | .endif 6 | .ifdef KIM 7 | .include "kim_loadsave.s" 8 | .endif 9 | .ifdef MICROTAN 10 | .include "microtan_loadsave.s" 11 | .endif 12 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/macros.s: -------------------------------------------------------------------------------- 1 | ; htasc - set the hi bit on the last byte of a string for termination 2 | ; (by Tom Greene) 3 | .macro htasc str 4 | .repeat .strlen(str)-1,I 5 | .byte .strat(str,I) 6 | .endrep 7 | .byte .strat(str,.strlen(str)-1) | $80 8 | .endmacro 9 | 10 | ; For every token, a byte gets put into segment "DUMMY". 11 | ; This way, we count up with every token. The DUMMY segment 12 | ; doesn't get linked into the binary. 13 | .macro init_token_tables 14 | .segment "BAS_VEC" 15 | TOKEN_ADDRESS_TABLE: 16 | .segment "BAS_KEY" 17 | TOKEN_NAME_TABLE: 18 | .segment "BAS_DUM" 19 | DUMMY_START: 20 | .endmacro 21 | 22 | ; optionally define token symbol 23 | ; count up token number 24 | .macro define_token token 25 | .segment "BAS_DUM" 26 | .ifnblank token 27 | token := <(*-DUMMY_START)+$80 28 | .endif 29 | .res 1; count up in any case 30 | .endmacro 31 | 32 | ; lay down a keyword, optionally define a token symbol 33 | .macro keyword key, token 34 | .segment "BAS_KEY" 35 | htasc key 36 | define_token token 37 | .endmacro 38 | 39 | ; lay down a keyword and an address (RTS style), 40 | ; optionally define a token symbol 41 | .macro keyword_rts key, vec, token 42 | .segment "BAS_VEC" 43 | .word vec-1 44 | keyword key, token 45 | .endmacro 46 | 47 | ; lay down a keyword and an address, 48 | ; optionally define a token symbol 49 | .macro keyword_addr key, vec, token 50 | .segment "BAS_VEC" 51 | .addr vec 52 | keyword key, token 53 | .endmacro 54 | 55 | .macro count_tokens 56 | .segment "BAS_DUM" 57 | NUM_TOKENS := <(*-DUMMY_START) 58 | .endmacro 59 | 60 | .macro init_error_table 61 | .segment "BAS_ERR" 62 | ERROR_MESSAGES: 63 | .endmacro 64 | 65 | .macro define_error error, msg 66 | .segment "BAS_ERR" 67 | error := <(*-ERROR_MESSAGES) 68 | htasc msg 69 | .endmacro 70 | 71 | ;--------------------------------------------- 72 | ; set the MSB of every byte of a string 73 | .macro asc80 str 74 | .repeat .strlen(str),I 75 | .byte .strat(str,I)+$80 76 | .endrep 77 | .endmacro 78 | 79 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/make.sh: -------------------------------------------------------------------------------- 1 | if [ ! -d tmp ]; then 2 | mkdir tmp 3 | fi 4 | 5 | for i in cbmbasic1 cbmbasic2 kbdbasic osi kb9 applesoft microtan; do 6 | 7 | echo $i 8 | ca65 -D $i msbasic.s -o tmp/$i.o && 9 | ld65 -C $i.cfg tmp/$i.o -o tmp/$i.bin -Ln tmp/$i.lbl 10 | 11 | done 12 | 13 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=microsoft_basic 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=msbasic.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/message.s: -------------------------------------------------------------------------------- 1 | ; global messages: "error", "in", "ready", "break" 2 | 3 | .segment "CODE" 4 | 5 | QT_ERROR: 6 | .ifdef KBD 7 | .byte " err" 8 | .else 9 | .ifdef APPLE 10 | .byte " ERR" 11 | .byte $07,$07 12 | .else 13 | .byte " ERROR" 14 | .endif 15 | .endif 16 | .byte 0 17 | 18 | .ifndef KBD 19 | QT_IN: 20 | .byte " IN " 21 | .byte $00 22 | .endif 23 | 24 | .ifdef KBD 25 | .byte $54,$D2 ; ??? 26 | OKPRT: 27 | jsr PRIMM 28 | .byte CR,CR,">>",CR,LF 29 | .byte 0 30 | rts 31 | nop 32 | .else 33 | QT_OK: 34 | .ifdef CONFIG_CBM_ALL 35 | .byte CR,LF,"READY.",CR,LF 36 | .else 37 | .ifdef APPLE 38 | ; binary patch! 39 | .byte CR,0,0,"K",CR,LF 40 | .else 41 | .byte CR,LF,"OK",CR,LF 42 | .endif 43 | .endif 44 | .byte 0 45 | .endif 46 | 47 | QT_BREAK: 48 | 49 | .ifdef KBD 50 | .byte CR,LF," Brk" 51 | .byte 0 52 | .byte $54,$D0 ; ??? 53 | .elseif .def(MICROTAN) 54 | .byte CR,LF," BREAK" 55 | .byte 0 56 | .else 57 | .byte CR,LF,"BREAK" 58 | .byte 0 59 | .endif 60 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/microtan.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $C000, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/microtan_iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ISCNTC: 3 | lda $01 4 | cmp #$03 5 | beq LC6EF 6 | lda #$01 7 | rts 8 | LC6EF: 9 | nop 10 | nop 11 | cmp #$03 12 | ;!!! runs into "STOP" -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/microtan_loadsave.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | 3 | SAVE: 4 | ldy #$00 5 | beq LC74D 6 | LC74B: 7 | ldy #$01 8 | LC74D: 9 | ldx #$4C 10 | LC74F: 11 | lda $13,x 12 | pha 13 | dex 14 | bpl LC74F 15 | ldx #$03 16 | LC757: 17 | lda TXTTAB,x 18 | sta GOSTROUT+2,x 19 | dex 20 | bpl LC757 21 | jmp LE219 22 | nop 23 | nop 24 | nop 25 | LC764: 26 | tya 27 | pha 28 | ldy $03 29 | lda #$FF 30 | sta ($0A),y 31 | pla 32 | tay 33 | jsr LFDFA 34 | lda $01 35 | jsr LC7A5 36 | rts 37 | .byte "DED" 38 | .byte $0D,$0A 39 | .byte "OK" 40 | .byte $0D,$0A,$00 41 | .byte "SAVED" 42 | .byte $0D,$0A,$00 43 | LOAD: 44 | jsr LC74B 45 | ldx #$FF 46 | tsx 47 | lda #$4F 48 | jsr LFE75 49 | lda #$4B 50 | jsr LFE75 51 | jsr LFE73 52 | lda VARTAB 53 | tax 54 | ldy VARTAB+1 55 | jmp FIX_LINKS 56 | nop 57 | LC7A5: 58 | pha 59 | cmp #$0A 60 | beq LC7AD 61 | jsr LFE75 62 | LC7AD: 63 | tya 64 | pha 65 | ldy $03 66 | lda #$20 67 | sta ($0A),y 68 | pla 69 | tay 70 | pla 71 | rts 72 | inc $8A17 73 | stx VARTAB 74 | sty VARTAB+1 75 | jmp FIX_LINKS 76 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/misc3.s: -------------------------------------------------------------------------------- 1 | ; KBD specific patches 2 | 3 | .segment "CODE" 4 | 5 | .ifdef KBD 6 | VARTAB_MINUS_2_TO_AY: 7 | lda VARTAB 8 | sec 9 | sbc #$02 10 | ldy VARTAB+1 11 | bcs LF42C 12 | dey 13 | LF42C: 14 | rts 15 | 16 | ; ---------------------------------------------------------------------------- 17 | GET_UPPER: 18 | lda INPUTBUFFERX,x 19 | LF430: 20 | cmp #'a' 21 | bcc LF43A 22 | cmp #'z'+1 23 | bcs LF43A 24 | LF438: 25 | sbc #$1F 26 | LF43A: 27 | rts 28 | 29 | ; ---------------------------------------------------------------------------- 30 | GETLN: 31 | ldx #$5D 32 | LF43D: 33 | txa 34 | and #$7F 35 | cmp $0340 36 | beq LF44D 37 | sta $0340 38 | lda #$03 39 | jsr LDE48 40 | LF44D: 41 | jsr LDE7F 42 | bne RTS4 43 | cpx #$80 44 | bcc LF44D 45 | RTS4: 46 | rts 47 | 48 | ; ---------------------------------------------------------------------------- 49 | LF457: 50 | lda TXTTAB 51 | ldx TXTTAB+1 52 | LF45B: 53 | sta JMPADRS+1 54 | stx JMPADRS+2 55 | ldy #$01 56 | lda (JMPADRS+1),y 57 | beq LF438 58 | iny 59 | iny 60 | lda (JMPADRS+1),y 61 | dey 62 | cmp LINNUM+1 63 | bne LF472 64 | lda (JMPADRS+1),y 65 | cmp LINNUM 66 | LF472: 67 | bcs LF43A 68 | dey 69 | lda (JMPADRS+1),y 70 | tax 71 | dey 72 | lda (JMPADRS+1),y 73 | bcc LF45B 74 | LF47D: 75 | jmp (JMPADRS+1) 76 | .endif 77 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/osi.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | ZP: start = $0000, size = $0100, type = rw; 3 | BASROM: start = $A000, size = $3F00, fill = no, file = %O; 4 | DUMMY: start = $0000, size = $00FF, file = ""; 5 | } 6 | 7 | SEGMENTS { 8 | ZEROPAGE: load = ZP, type = zp; 9 | HEADER: load = BASROM, type = ro; 10 | VECTORS: load = BASROM, type = ro; 11 | KEYWORDS: load = BASROM, type = ro; 12 | ERROR: load = BASROM, type = ro; 13 | CODE: load = BASROM, type = ro; 14 | CHRGET: load = BASROM, type = ro; 15 | INIT: load = BASROM, type = ro; 16 | EXTRA: load = BASROM, type = ro; 17 | DUMMY: load = DUMMY; # don't include 18 | } 19 | 20 | -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/osi_iscntc.s: -------------------------------------------------------------------------------- 1 | .segment "CODE" 2 | ISCNTC: 3 | jmp MONISCNTC 4 | nop 5 | nop 6 | nop 7 | nop 8 | lsr a 9 | bcc RET2 10 | jsr GETLN 11 | cmp #$03 12 | ;!!! *used*to* run into "STOP" -------------------------------------------------------------------------------- /Software/rom/microsoft_basic/regress.sh: -------------------------------------------------------------------------------- 1 | if [ ! -d orig ]; then 2 | echo Please first run make.sh on the original .s files, create 3 | echo the directory \"orig\", and copy all .bin files from \"tmp\" 4 | echo into \"orig\". 5 | exit; 6 | fi 7 | 8 | for i in cbmbasic1 cbmbasic2 kbdbasic osi kb9 applesoft microtan; do 9 | 10 | echo $i 11 | ca65 -D $i msbasic.s -o tmp/$i.o && 12 | ld65 -C $i.cfg tmp/$i.o -o tmp/$i-new.bin -Ln tmp/$i.lbl && 13 | xxd -g 1 orig/$i.bin > tmp/$i.bin.txt 14 | xxd -g 1 tmp/$i-new.bin > tmp/$i-new.bin.txt 15 | diff -u tmp/$i.bin.txt tmp/$i-new.bin.txt | head 16 | 17 | done 18 | -------------------------------------------------------------------------------- /Software/rom/minimal_bootloader/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=minimal_bootloader 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=minimal_bootloader.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/minimal_bootloader/minimal_bootloader.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "core.inc" 5 | .include "acia.inc" 6 | .include "keyboard.inc" 7 | .include "modem.inc" 8 | .include "syscalls.inc" 9 | 10 | .segment "VECTORS" 11 | 12 | .word $0000 13 | .word init 14 | .word _interrupt_handler 15 | 16 | .code 17 | 18 | init: 19 | ; Set up stack 20 | ldx #$ff 21 | txs 22 | ; Run setup routine 23 | jsr _system_init 24 | @main_loop: 25 | ; Display hello message 26 | write_lcd #welcome_message 27 | ; Display keyboard status 28 | ldx #$00 29 | ldy #$01 30 | jsr lcd_set_position 31 | lda #1 32 | jsr _delay_sec 33 | jsr _keyboard_is_connected 34 | cmp #(KEYBOARD_NOT_CONNECTED) 35 | beq @no_keyboard 36 | write_lcd #keyboard_connected 37 | bra @wait_for_3s 38 | @no_keyboard: 39 | write_lcd #keyboard_disconnected 40 | @wait_for_3s: 41 | lda #02 42 | jsr _delay_sec 43 | 44 | jsr _lcd_clear 45 | write_lcd #instruction 46 | jsr _keyboard_is_connected 47 | cmp #(KEYBOARD_NOT_CONNECTED) 48 | beq @wait_for_acia 49 | write_lcd #instruction_keyboard 50 | @wait_for_keyboard_input: 51 | jsr _keyboard_read_char 52 | cmp #(KEY_ENTER) 53 | bne @wait_for_keyboard_input 54 | bra @receive_file 55 | @wait_for_acia: 56 | write_lcd #instruction_serial 57 | @wait_for_acia_input: 58 | jsr _acia_is_data_available 59 | cmp #(ACIA_NO_DATA_AVAILABLE) 60 | beq @wait_for_acia_input 61 | jsr _acia_read_byte 62 | 63 | @receive_file: 64 | jsr _modem_receive 65 | cmp #(MODEM_RECEIVE_SUCCESS) 66 | bne @receive_file 67 | jsr $1000 68 | jsr _lcd_clear 69 | jmp @main_loop 70 | 71 | .segment "RODATA" 72 | 73 | welcome_message: 74 | .byte "OS/1 Bootloader", $00 75 | keyboard_disconnected: 76 | .byte "No keyboard", $00 77 | keyboard_connected: 78 | .byte "Keyboard connected", $00 79 | instruction: 80 | .byte "Connect serial port (19200 N8S1 CTS/RTS) and press enter",$00 81 | instruction_keyboard: 82 | .byte " on the keyboard",$00 83 | instruction_serial: 84 | .byte " in terminal window", $00 85 | -------------------------------------------------------------------------------- /Software/rom/os1/makefile: -------------------------------------------------------------------------------- 1 | PROJECT_NAME=os1 2 | BUILD_TYPE=rom 3 | 4 | ASM_SOURCES=os1.s shell.s monitor.s opcodes.s 5 | C_SOURCES= 6 | 7 | include ../../common/makefile 8 | 9 | -------------------------------------------------------------------------------- /Software/rom/os1/os1.s: -------------------------------------------------------------------------------- 1 | .setcpu "65C02" 2 | .include "utils.inc" 3 | .include "lcd.inc" 4 | .include "core.inc" 5 | .include "acia.inc" 6 | .include "keyboard.inc" 7 | .include "syscalls.inc" 8 | 9 | .import _run_shell 10 | .export os1_version 11 | 12 | .segment "VECTORS" 13 | 14 | .word $0000 15 | .word init 16 | .word _interrupt_handler 17 | 18 | .code 19 | 20 | init: 21 | ; clean up stack and zeropage 22 | ldx #$00 23 | @clean_stack_loop: 24 | stz $0100,x 25 | stz $00,x 26 | inx 27 | bne @clean_stack_loop 28 | ; Set up stack 29 | ldx #$ff 30 | txs 31 | ; Run setup routine 32 | jsr _system_init 33 | ; Display hello message 34 | write_lcd #os1_version 35 | ; Display keyboard status 36 | ldx #$00 37 | ldy #$01 38 | jsr lcd_set_position 39 | lda #1 40 | jsr _delay_sec 41 | jsr _keyboard_is_connected 42 | cmp #(KEYBOARD_NOT_CONNECTED) 43 | beq @no_keyboard 44 | write_lcd #keyboard_connected 45 | bra @wait_for_1s 46 | @no_keyboard: 47 | write_lcd #keyboard_disconnected 48 | @wait_for_1s: 49 | lda #01 50 | jsr _delay_sec 51 | jsr _lcd_newline 52 | 53 | write_lcd #instruction 54 | @wait_for_acia_input: 55 | jsr _acia_is_data_available 56 | cmp #(ACIA_NO_DATA_AVAILABLE) 57 | beq @check_keyboard 58 | jsr _acia_read_byte 59 | bra @run_shell 60 | @check_keyboard: 61 | jsr _keyboard_is_data_available 62 | cmp #(KEYBOARD_NO_DATA_AVAILABLE) 63 | beq @wait_for_acia_input 64 | jsr _keyboard_read_char 65 | @run_shell: 66 | jsr _lcd_clear 67 | write_lcd #shell_connected 68 | jsr _run_shell 69 | ; Disable interrupt processing during init 70 | sei 71 | jmp init 72 | 73 | .segment "RODATA" 74 | 75 | os1_version: 76 | .asciiz "OS/1 version 0.3.0C" 77 | keyboard_disconnected: 78 | .asciiz "No keyboard" 79 | keyboard_connected: 80 | .asciiz "Keyboard connected" 81 | instruction: 82 | .asciiz "Connect serial port (19200 N8S1 CTS/RTS) and press any key in terminal window" 83 | shell_connected: 84 | .asciiz "Shell connected" 85 | -------------------------------------------------------------------------------- /WinCUPL/DB6502.abs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dbuchwald/6502/d1194eb0162b50493e9f32f2d46c190da779da66/WinCUPL/DB6502.abs -------------------------------------------------------------------------------- /WinCUPL/DB6502.si: -------------------------------------------------------------------------------- 1 | Name DB6502 Address Decoder; 2 | PartNo DB6502; 3 | Date 09/09/2020; 4 | Revision 01; 5 | Designer Dawid Buchwald; 6 | Company ; 7 | Assembly None; 8 | Location Poland; 9 | Device p22v10; 10 | 11 | 12 | ORDER: CLK, %2, RW, %5, EXRAM, %1, Address, %3, WE, %3, OE, %5, RAM1_CS, %5, RAM2_CS, %4, ROM_CS, %2, IO_CS; 13 | 14 | 15 | VECTORS: 16 | $MSG " Address decoder test "; 17 | $MSG " CLK RW EXRAM ADDRESS WE# OE# RAM1# RAM2# ROM# IO "; 18 | $MSG " --- -- ----- -------- --- --- ----- ----- ---- -- "; 19 | 000 '00' HHLHHL 20 | 010 '00' HHLHHL 21 | 100 '00' LHLHHL 22 | 110 '00' HLLHHL 23 | 000 '01' HHLHHL 24 | 010 '01' HHLHHL 25 | 100 '01' LHLHHL 26 | 110 '01' HLLHHL 27 | 000 '02' HHHHHH 28 | 010 '02' HHHHHH 29 | 100 '02' LHHHHH 30 | 110 '02' HLHHHH 31 | 000 '03' HHLHHL 32 | 010 '03' HHLHHL 33 | 100 '03' LHLHHL 34 | 110 '03' HLLHHL 35 | 000 '7F' HHLHHL 36 | 010 '7F' HHLHHL 37 | 100 '7F' LHLHHL 38 | 110 '7F' HLLHHL 39 | 000 '80' HHHHLL 40 | 010 '80' HHHHLL 41 | 100 '80' LHHHLL 42 | 110 '80' HLHHLL 43 | 000 'BF' HHHHLL 44 | 010 'BF' HHHHLL 45 | 100 'BF' LHHHLL 46 | 110 'BF' HLHHLL 47 | 000 'C0' HHHHLL 48 | 010 'C0' HHHHLL 49 | 100 'C0' LHHHLL 50 | 110 'C0' HLHHLL 51 | 000 'FF' HHHHLL 52 | 010 'FF' HHHHLL 53 | 100 'FF' LHHHLL 54 | 110 'FF' HLHHLL 55 | 001 '00' HHLHHL 56 | 011 '00' HHLHHL 57 | 101 '00' LHLHHL 58 | 111 '00' HLLHHL 59 | 001 '01' HHLHHL 60 | 011 '01' HHLHHL 61 | 101 '01' LHLHHL 62 | 111 '01' HLLHHL 63 | 001 '02' HHHHHH 64 | 011 '02' HHHHHH 65 | 101 '02' LHHHHH 66 | 111 '02' HLHHHH 67 | 001 '03' HHLHHL 68 | 011 '03' HHLHHL 69 | 101 '03' LHLHHL 70 | 111 '03' HLLHHL 71 | 001 '7F' HHLHHL 72 | 011 '7F' HHLHHL 73 | 101 '7F' LHLHHL 74 | 111 '7F' HLLHHL 75 | 001 '80' HHHLHL 76 | 011 '80' HHHLHL 77 | 101 '80' LHHLHL 78 | 111 '80' HLHLHL 79 | 001 'BF' HHHLHL 80 | 011 'BF' HHHLHL 81 | 101 'BF' LHHLHL 82 | 111 'BF' HLHLHL 83 | 001 'C0' HHHHLL 84 | 011 'C0' HHHHLL 85 | 101 'C0' LHHHLL 86 | 111 'C0' HLHHLL 87 | 001 'FF' HHHHLL 88 | 011 'FF' HHHHLL 89 | 101 'FF' LHHHLL 90 | 111 'FF' HLHHLL 91 | -------------------------------------------------------------------------------- /WinCUPL/DB6502.sim: -------------------------------------------------------------------------------- 1 | %SIGNAL 2 | PIN 11 = A8 3 | PIN 10 = A9 4 | PIN 9 = A10 5 | PIN 8 = A11 6 | PIN 7 = A12 7 | PIN 6 = A13 8 | PIN 5 = A14 9 | PIN 4 = A15 10 | PIN 1 = CLK 11 | PIN 3 = EXRAM 12 | PIN 18 = IO_CS 13 | PIN 22 = OE 14 | PIN 21 = RAM1_CS 15 | PIN 20 = RAM2_CS 16 | PIN 19 = ROM_CS 17 | PIN 2 = RW 18 | PIN 23 = WE 19 | %END 20 | 21 | %FIELD 22 | FIELD Address = A15,A14,A13,A12,A11,A10,A9,A8 23 | %END 24 | 25 | %EQUATION 26 | IO_CS => 27 | !A8 & A9 & !A10 & !A11 & !A12 & !A13 & !A14 & !A15 28 | 29 | IO_SHADOW => 30 | !A8 & A9 & !A10 & !A11 & !A12 & !A13 & !A14 & !A15 31 | 32 | !OE => 33 | CLK & RW 34 | 35 | RAM => 36 | !A15 37 | 38 | !RAM1_CS => 39 | A14 & !A15 40 | # A13 & !A15 41 | # A12 & !A15 42 | # A11 & !A15 43 | # A10 & !A15 44 | # !A9 & !A15 45 | # A8 & !A15 46 | 47 | !RAM2_CS => 48 | !A14 & A15 & EXRAM 49 | 50 | RAM_EXTRA => 51 | !A14 & A15 52 | 53 | ROM => 54 | A15 55 | 56 | !ROM_CS => 57 | A15 & !EXRAM 58 | # A14 & A15 59 | 60 | !WE => 61 | CLK & !RW 62 | 63 | IO_CS.oe => 64 | 1 65 | 66 | OE.oe => 67 | 1 68 | 69 | RAM1_CS.oe => 70 | 1 71 | 72 | RAM2_CS.oe => 73 | 1 74 | 75 | ROM_CS.oe => 76 | 1 77 | 78 | WE.oe => 79 | 1 80 | 81 | %END 82 | -------------------------------------------------------------------------------- /WinCUPL/DB6502.wo: -------------------------------------------------------------------------------- 1 | #WAVEFORM 2 | #H Name DB6502 Address Decoder; 3 | #H PartNo DB6502; 4 | #H Date 09/09/2020; 5 | #H Revision 01; 6 | #H Designer Dawid Buchwald; 7 | #H Company ; 8 | #H Assembly None; 9 | #H Location Poland; 10 | #H Device p22v10; 11 | #H 12 | #H 13 | #F Address = [A15,A14,A13,A12,A11,A10,A9,A8]; 14 | 15 | #H ORDER: CLK, %2, RW, %5, EXRAM, %1, Address, %3, WE, %3, OE, %5, RAM1_CS, %5, RAM2_CS, %4, ROM_CS, %2, IO_CS; 16 | #H 17 | #H 18 | #V 0001 00000000000HHLHHL 19 | #V 0002 01000000000HHLHHL 20 | #V 0003 10000000000LHLHHL 21 | #V 0004 11000000000HLLHHL 22 | #V 0005 00000000001HHLHHL 23 | #V 0006 01000000001HHLHHL 24 | #V 0007 10000000001LHLHHL 25 | #V 0008 11000000001HLLHHL 26 | #V 0009 00000000010HHHHHH 27 | #V 0010 01000000010HHHHHH 28 | #V 0011 10000000010LHHHHH 29 | #V 0012 11000000010HLHHHH 30 | #V 0013 00000000011HHLHHL 31 | #V 0014 01000000011HHLHHL 32 | #V 0015 10000000011LHLHHL 33 | #V 0016 11000000011HLLHHL 34 | #V 0017 00001111111HHLHHL 35 | #V 0018 01001111111HHLHHL 36 | #V 0019 10001111111LHLHHL 37 | #V 0020 11001111111HLLHHL 38 | #V 0021 00010000000HHHHLL 39 | #V 0022 01010000000HHHHLL 40 | #V 0023 10010000000LHHHLL 41 | #V 0024 11010000000HLHHLL 42 | #V 0025 00010111111HHHHLL 43 | #V 0026 01010111111HHHHLL 44 | #V 0027 10010111111LHHHLL 45 | #V 0028 11010111111HLHHLL 46 | #V 0029 00011000000HHHHLL 47 | #V 0030 01011000000HHHHLL 48 | #V 0031 10011000000LHHHLL 49 | #V 0032 11011000000HLHHLL 50 | #V 0033 00011111111HHHHLL 51 | #V 0034 01011111111HHHHLL 52 | #V 0035 10011111111LHHHLL 53 | #V 0036 11011111111HLHHLL 54 | #V 0037 00100000000HHLHHL 55 | #V 0038 01100000000HHLHHL 56 | #V 0039 10100000000LHLHHL 57 | #V 0040 11100000000HLLHHL 58 | #V 0041 00100000001HHLHHL 59 | #V 0042 01100000001HHLHHL 60 | #V 0043 10100000001LHLHHL 61 | #V 0044 11100000001HLLHHL 62 | #V 0045 00100000010HHHHHH 63 | #V 0046 01100000010HHHHHH 64 | #V 0047 10100000010LHHHHH 65 | #V 0048 11100000010HLHHHH 66 | #V 0049 00100000011HHLHHL 67 | #V 0050 01100000011HHLHHL 68 | #V 0051 10100000011LHLHHL 69 | #V 0052 11100000011HLLHHL 70 | #V 0053 00101111111HHLHHL 71 | #V 0054 01101111111HHLHHL 72 | #V 0055 10101111111LHLHHL 73 | #V 0056 11101111111HLLHHL 74 | #V 0057 00110000000HHHLHL 75 | #V 0058 01110000000HHHLHL 76 | #V 0059 10110000000LHHLHL 77 | #V 0060 11110000000HLHLHL 78 | #V 0061 00110111111HHHLHL 79 | #V 0062 01110111111HHHLHL 80 | #V 0063 10110111111LHHLHL 81 | #V 0064 11110111111HLHLHL 82 | #V 0065 00111000000HHHHLL 83 | #V 0066 01111000000HHHHLL 84 | #V 0067 10111000000LHHHLL 85 | #V 0068 11111000000HLHHLL 86 | #V 0069 00111111111HHHHLL 87 | #V 0070 01111111111HHHHLL 88 | #V 0071 10111111111LHHHLL 89 | #V 0072 11111111111HLHHLL 90 | --------------------------------------------------------------------------------