several fixes

This commit is contained in:
2024-11-30 15:41:09 +01:00
parent 1ed6034d99
commit a5f5c6b9ef
227 changed files with 769511 additions and 94738 deletions

View File

@@ -0,0 +1 @@
kbdtest*

View File

@@ -0,0 +1,640 @@
;This file is generated by the build script.
;Do not make any changes here!
?a0000 equ 0x14C3
?a0001 equ 0x1580
ADDR_RTC equ 0xD0
A_RTS_OFF equ 0x1DA
A_RTS_ON equ 0x1E3
BOOT_PHASE0 equ 0x86
BOOT_PHASE1 equ 0xB7
BOOT_PHASE1_LOOP equ 0xC0
BOOT_PHASE2 equ 0xCB
B_BEEP equ 0x50
B_DSKSEL equ 0x74
B_FATCD equ 0x7D
B_FATCREATE equ 0x80
B_FATOPEN equ 0x77
B_FATREAD equ 0x7A
B_FATWRITE equ 0x83
B_IICRECV equ 0x56
B_IICSEND equ 0x53
B_KEYREAD equ 0x6B
B_KEYREADASCII equ 0x6E
B_KEYSEND equ 0x71
B_PRINTAHEX equ 0x62
B_PRINTCHAR equ 0x59
B_PRINTINLINE equ 0x5F
B_PRINTLN equ 0x65
B_PRINTSTR equ 0x5C
B_READCHAR equ 0x68
COMMAND equ 0x1AA4
COMMAND_ABORT equ 0x1AA1
COMMAND_BACKSPACE equ 0x1AE5
COMMAND_LUT equ 0x1A0F
COMMAND_PROCESS equ 0x1B0B
COMMAND_PROCESS_FOUND equ 0x1B46
COMMAND_PROCESS_LOOP equ 0x1B0E
COMMAND_PROCESS_LOOP_STR1 equ 0x1B17
COMMAND_PROCESS_LOOP_STR2 equ 0x1B2D
COMMAND_PROCESS_NEXT_ENTRY equ 0x1B32
COMMAND_PROCESS_NEXT_ENTRYI equ 0x1B31
COMMAND_PROCESS_NOT_FOUND equ 0x1B3D
COMMAND_READ equ 0x1AB6
CONSOLE_INIT equ 0xEF
CS_APU_CTRL equ 0xF9
CS_APU_DATA equ 0xF8
CS_BANK equ 0x00
CS_CTC_0 equ 0x04
CS_CTC_1 equ 0x05
CS_CTC_2 equ 0x06
CS_CTC_3 equ 0x07
CS_DIP equ 0x01
CS_PIA_CR equ 0x33
CS_PIA_PA equ 0x30
CS_PIA_PB equ 0x31
CS_PIA_PC equ 0x32
CS_PIO_AC equ 0xF6
CS_PIO_AD equ 0xF4
CS_PIO_BC equ 0xF7
CS_PIO_BD equ 0xF5
CS_SIO_A_C equ 0x09
CS_SIO_A_D equ 0x08
CS_SIO_B_C equ 0x0B
CS_SIO_B_D equ 0x0A
CS_VT82C42_CTRL equ 0xF1
CS_VT82C42_DATA equ 0xF0
DHEX_TO_BYTE equ 0x251
DHEX_TO_BYTE_FAILED equ 0x26D
ERR_SYNTAX equ 0x1B5C
EXEC_RST_08 equ 0xDF1
EXEC_RST_10 equ 0xDF5
EXEC_RST_18 equ 0xE01
HEX_TO_BIN equ 0x271
HEX_TO_BIN_2 equ 0x27F
HEX_TO_INVALID_2 equ 0x286
IDE_CMD_IDENT equ 0xEC
IDE_CMD_READSEC equ 0x20
IDE_CMD_WRITESEC equ 0x30
IDE_DEV_TABLE equ 0x1325
IDE_RD equ 0x40
IDE_REG_ALTSTS equ 0x16
IDE_REG_CMDSTS equ 0x0F
IDE_REG_DATA equ 0x08
IDE_REG_DRVADDR equ 0x17
IDE_REG_ERROR equ 0x09
IDE_REG_HCYL equ 0x0D
IDE_REG_HEAD equ 0x0E
IDE_REG_LBA0 equ 0x0B
IDE_REG_LBA1 equ 0x0C
IDE_REG_LBA2 equ 0x0D
IDE_REG_LBA3 equ 0x0E
IDE_REG_LCYL equ 0x0C
IDE_REG_SECTOR equ 0x0A
IDE_REG_SSECTOR equ 0x0B
IDE_RST equ 0x80
IDE_WR equ 0x20
IIC_CLK equ 0x01
IIC_DATA equ 0x02
INT_PIO_ADDRC equ 0xF6
INT_PIO_ADDRD equ 0xF4
INT_VEC equ 0x1B
INT_VEC_TABLE equ 0x4000
IO_AY0_ADDR equ 0x40
IO_AY0_DATA equ 0x41
IO_AY1_ADDR equ 0x42
IO_AY1_DATA equ 0x43
IO_REG0 equ 0x20
IO_RTC_AMPM equ 0x25
IO_RTC_CTR_D equ 0x2D
IO_RTC_CTR_E equ 0x2E
IO_RTC_CTR_F equ 0x2F
IO_RTC_DAY0 equ 0x26
IO_RTC_DAY1 equ 0x27
IO_RTC_HOUR equ 0x24
IO_RTC_MIN0 equ 0x22
IO_RTC_MIN1 equ 0x23
IO_RTC_MON0 equ 0x28
IO_RTC_MON1 equ 0x29
IO_RTC_SEC0 equ 0x20
IO_RTC_SEC1 equ 0x21
IO_RTC_WEEK equ 0x2C
IO_RTC_YEAR1 equ 0x2B
IO_RTC_YERR0 equ 0x2A
MEM_FAT_AMOUNT equ 0x45BC
MEM_FAT_CLUSTERLEN equ 0x45BF
MEM_FAT_COUNT1 equ 0x45C0
MEM_FAT_CURDIR equ 0x45E3
MEM_FAT_CURRDIR equ 0x4643
MEM_FAT_DATASTART equ 0x45C5
MEM_FAT_DIRSEC equ 0x45D1
MEM_FAT_EXEC_COUNT equ 0x4649
MEM_FAT_EXEC_CURR equ 0x4647
MEM_FAT_EXEC_START equ 0x464B
MEM_FAT_FILEREMAIN equ 0x45CD
MEM_FAT_OF0_ATTRIBUTE equ 0x4633
MEM_FAT_OF0_CCLUST equ 0x4635
MEM_FAT_OF0_DATREM equ 0x463F
MEM_FAT_OF0_DATSEC equ 0x463B
MEM_FAT_OF0_FATSEC equ 0x4637
MEM_FAT_RESERVED equ 0x45BA
MEM_FAT_ROOTSTART equ 0x45C9
MEM_FAT_SECTORS equ 0x45BD
MEM_FAT_TMPFNAME equ 0x45D3
MEM_FAT_TMPPOINTER equ 0x45C1
MEM_IDE_BUFFER equ 0x43BA
MEM_IDE_DEVICE equ 0x42CF
MEM_IDE_DEV_TABLE equ 0x42D9
MEM_IDE_FSBUFFER equ 0x45BA
MEM_IDE_PARTITION equ 0x42D1
MEM_IDE_POINTER equ 0x42D5
MEM_IDE_SELECTED equ 0x4319
MEM_IDE_STATUS equ 0x42D0
MEM_IDE_STRING_0 equ 0x431A
MEM_IDE_STRING_1 equ 0x4342
MEM_IDE_STRING_2 equ 0x436A
MEM_IDE_STRING_3 equ 0x4392
MSG_CLEAR equ 0x1D2
NOT_IMPLEMENTED equ 0x1B55
OP_CALL equ 0x1BB7
OP_CD equ 0x1F87
OP_CLR equ 0x1D4B
OP_DASM equ 0x1C38
OP_DIR equ 0x1F83
OP_DUMP equ 0x1BD7
OP_EXEC equ 0x1B9E
OP_FSEXEC equ 0x1FA4
OP_IIC_IN equ 0x1CFF
OP_IIC_OUT equ 0x1C9F
OP_IO_IN equ 0x1C68
OP_IO_OUT equ 0x1C7E
OP_LSDSK equ 0x1F60
OP_RTIME equ 0x1D4F
OP_SELDSK equ 0x1F64
OP_SET equ 0x1C07
OP_STIME equ 0x1EE7
POST_CHECK_APU equ 0x1FDD
POST_CHECK_IDE_30 equ 0x2008
POST_CHECK_IDE_40 equ 0x201B
POST_CHECK_PIO equ 0x1FB8
POST_START equ 0x1FA8
POST_TEST_RTC equ 0x2035
PRG_RAM_START equ 0x4110
PRG_RAM_TOP equ 0xFF00
PRINTINLINE equ 0x1EC
PROG_MEM_START equ 0x4000
PROG_ROM_START equ 0x100
RST_00 equ 0x00
RST_08 equ 0x08
RST_10 equ 0x10
RST_18 equ 0x18
STACK_RAM_TOP equ 0xFFFF
START_ADDR equ 0x8000
START_ROM equ 0x00
STRCONV_BYTES_TO_HEX equ 0x288
STRCONV_BYTES_TO_HEX_1 equ 0x297
STRCONV_BYTES_TO_HEX_2 equ 0x2A1
STR_Banner_Start equ 0x27E9
STR_PD_HEADER equ 0x19C8
STR_keyboard_init_err equ 0x8123
STR_keyboard_init_failed equ 0x8147
STR_keyboard_init_missing equ 0x8169
STR_keyboard_init_okay equ 0x8108
SYS_BUF_START equ 0x4010
SYS_RAM_START equ 0x4000
VAR_CONSOLE_BAUD equ 0x18
VAR_CONSOLE_CONF equ 0x0F
VDP_MEM equ 0x80
VDP_REG equ 0x81
_COMMAND_PROCESS_FOUND equ 0x1B54
_OP_CALL equ 0x1BD6
_OP_IIC_ACK_ERR equ 0x1CE4
_OP_IIC_ACK_ERR_str equ 0x1CEB
_OP_IIC_IN_LOOP equ 0x1D31
_OP_IIC_IN_LOOP_TEXT equ 0x1D3E
_OP_IIC_OUT_LOOP equ 0x1CB5
_OP_IIC_OUT_SEND equ 0x1CD1
_OP_RTIME_NN equ 0x1D52
_OP_RTIME_RD_CMD equ 0x1E0A
_OP_SELDSK_INVALID equ 0x1F73
_OP_SELDSK_INVALID_STR equ 0x1F8B
_OP_SET_LOOP equ 0x1C1F
_OP_STIME_INVALID equ 0x1EAD
_OP_STIME_PROMPT equ 0x1EC4
_OP_STIME_PROMPT_ERR equ 0x1EDC
_OP_STIME_STR_DAY equ 0x1E0B
_OP_STIME_STR_HOUR equ 0x1E5C
_OP_STIME_STR_MIN equ 0x1E77
_OP_STIME_STR_MON equ 0x1E26
_OP_STIME_STR_SEC equ 0x1E92
_OP_STIME_STR_YEAR equ 0x1E41
_POST_CHECK_APU_FAILED equ 0x1FFC
_POST_CHECK_IDE_FAILED equ 0x202E
_POST_CHECK_PIO_FAILED equ 0x1FD1
_POST_TEST_RTC_INVALID equ 0x206F
_POST_TEST_RTC_NOTFOUND equ 0x2068
_STR_NOT_FOUND equ 0x1B77
_STR_NOT_IMPLEMENTED equ 0x1B63
_STR_SYNTAX equ 0x1B8B
_beep_pause_l1 equ 0xE1F
_compare_filename_loop equ 0x24AA
_compare_filename_nomatch equ 0x24B8
_eof equ 0x818F
_fat_cd_navigate equ 0x265F
_fat_cd_navigate_end equ 0x26A5
_fat_cd_navigate_errfile equ 0x26CD
_fat_cd_navigate_errfile_str equ 0x26FF
_fat_cd_navigate_error equ 0x26B7
_fat_cd_navigate_error_str equ 0x26D5
_fat_cd_navigate_findsec equ 0x2664
_fat_cd_navigate_findsec_skipslash equ 0x2690
_fat_cd_navigate_goback_fl equ 0x261B
_fat_cd_navigate_inerror equ 0x26C5
_fat_cd_navigate_inerrorS equ 0x26BF
_fat_cd_navigate_inerrore equ 0x26C6
_fat_cd_navigate_inputerr_str equ 0x26EC
_fat_cd_navigate_l2 equ 0x2696
_fat_exec_notexec equ 0x27C5
_fat_exec_notfound equ 0x27AC
_fat_exec_read_done equ 0x2794
_fat_exec_readloop1 equ 0x2776
_fat_get_root_table_invalid equ 0x229A
_fat_getfatsec_notroot equ 0x22D9
_fat_increment_32 equ 0x2430
_fat_lfs_loop equ 0x23A6
_fat_lfs_loop_compare_end equ 0x23E2
_fat_lfs_loop_compare_match equ 0x23E6
_fat_lfs_loop_compare_next_sector equ 0x23B8
_fat_math_add32 equ 0x2444
_fat_math_mul32 equ 0x2475
_fat_math_mul32_l equ 0x247C
_fat_math_mul32_noadd equ 0x2489
_fat_math_sector_add_16 equ 0x241C
_fat_print_directory_dir equ 0x259A
_fat_print_directory_loop equ 0x252D
_fat_print_directory_loop_break equ 0x25F9
_fat_print_directory_loop_file equ 0x2549
_fat_print_directory_loop_next equ 0x25C5
_fat_print_directory_loop_next_sector equ 0x25D0
_format_filename_fat16_clean equ 0x24C1
_format_filename_fat16_loop equ 0x24C8
_format_filename_fat16_loop_copy equ 0x24DB
_format_filename_fat16_loop_skip_8 equ 0x24D2
_ide_readsector_512_floop equ 0xE7B
_ideif_drv_sel_fail equ 0x15F0
_ideif_drv_sel_fstr0 equ 0x16AD
_ideif_drv_sel_pstr equ 0x16A4
_ideif_drv_sel_sstr0 equ 0x16BB
_ideif_drv_sel_syn equ 0x16C8
_ideif_init_drive_charloop equ 0x14B7
_ideif_init_drive_found equ 0x1499
_ideif_init_drive_loop equ 0x1481
_ideif_init_drive_nodrv equ 0x1494
_ideif_init_drive_prt_fnd equ 0x1515
_ideif_init_drive_prt_l1 equ 0x1503
_ideif_init_drive_prt_ln equ 0x150D
_ideif_prnt_devtable_hdr equ 0x1630
_ideif_prnt_devtable_l1 equ 0x1391
_ideif_prnt_devtable_l1_e2 equ 0x1457
_ideif_prnt_devtable_l1_es equ 0x13D6
_ideif_prnt_devtable_l1_ms equ 0x1454
_ideif_prnt_devtable_l1_nxt equ 0x139E
_ideif_prnt_devtable_l1_s00 equ 0x13C4
_ideif_prnt_devtable_l1_s01 equ 0x13C9
_ideif_prnt_devtable_l1_s02 equ 0x13CE
_ideif_prnt_devtable_l1_sFF equ 0x13D3
_ideif_prnt_devtable_l1_sel equ 0x139C
_ideif_prnt_devtable_master equ 0x1694
_ideif_prnt_devtable_s00 equ 0x1668
_ideif_prnt_devtable_s01 equ 0x1673
_ideif_prnt_devtable_s02 equ 0x167E
_ideif_prnt_devtable_sFF equ 0x1689
_ideif_prnt_devtable_slave equ 0x169C
_int_invalid_int equ 0x185A
_intctrl_init_fill_loop equ 0x183B
_isr_pio equ 0x184E
_isr_pio_test equ 0x8181
_keyb_cmd_rd_l1 equ 0x80E0
_keyb_enable_int_flush_buffer equ 0x80CF
_keyb_wr_wait_ack_l1 equ 0x80FD
_keyboard_init_dev_missing equ 0x80AA
_keyboard_init_failed equ 0x80A3
_keyboard_init_flush_buffer equ 0x8065
_keyboard_init_okay equ 0x80B1
_read_bcd_invalid equ 0x165
_shift4 equ 0x1F5B
_str_invalid_interrupt equ 0x1864
_str_pio_interrupt equ 0x189B
beep equ 0xE04
beep_loop equ 0xE07
beep_pause equ 0xE1E
com_header equ 0x8000
com_prg equ 0x8040
compare_filename equ 0x24A6
con_rb_init equ 0x18E
con_rb_read equ 0x199
con_rb_read_empty equ 0x1B6
con_rb_write equ 0x1BF
consio_init_a equ 0x18CE
consio_init_a_int equ 0x1906
consio_init_a_sio equ 0x18D5
consio_init_ctc_a equ 0x191D
consio_isr equ 0x1960
consio_rx_a equ 0x1933
consio_rx_a_sts equ 0x1956
consio_rx_rts_a_off equ 0x194D
consio_rx_rts_a_on equ 0x1944
consio_tx_a equ 0x1926
consio_tx_a_waitout equ 0x1928
dasm_00 equ 0xA09
dasm_01 equ 0xCF5
dasm_02 equ 0xA8F
dasm_03 equ 0xCC7
dasm_08 equ 0xB0C
dasm_09 equ 0xC9A
dasm_0A equ 0xA71
dasm_0B equ 0xCDE
dasm_10 equ 0xA51
dasm_12 equ 0xA9A
dasm_18 equ 0xA14
dasm_1A equ 0xA7B
dasm_20 equ 0xA2E
dasm_22 equ 0xD3B
dasm_27 equ 0xAD4
dasm_28 equ 0xA27
dasm_2A equ 0xD0C
dasm_2F equ 0xAD8
dasm_30 equ 0xA1F
dasm_32 equ 0xAA5
dasm_37 equ 0xAE4
dasm_38 equ 0xA18
dasm_3A equ 0xA85
dasm_3F equ 0xAE0
dasm_76 equ 0xAE8
dasm_80C6 equ 0xB65
dasm_BE equ 0xB02
dasm_C3 equ 0xA0D
dasm_C88E equ 0xB8B
dasm_C9 equ 0xA5D
dasm_CD equ 0xA57
dasm_D9 equ 0xB19
dasm_DD equ 0xA3F
dasm_DD_01 equ 0xCFC
dasm_DD_09 equ 0xCB5
dasm_DD_22 equ 0xD51
dasm_DD_23 equ 0xCCC
dasm_DD_2A equ 0xD23
dasm_DD_2B equ 0xCE3
dasm_DD_34 equ 0xC65
dasm_DD_35 equ 0xC82
dasm_DD_86 equ 0xB6D
dasm_DD_8E equ 0xB93
dasm_DD_96 equ 0xBB6
dasm_DD_9E equ 0xBD6
dasm_DD_A6 equ 0xBF7
dasm_DD_AE equ 0xC2E
dasm_DD_B6 equ 0xC13
dasm_DD_BE equ 0xC4A
dasm_DD_E1 equ 0xDA3
dasm_DD_E3 equ 0xB29
dasm_DD_E5 equ 0xD8D
dasm_DD_F9 equ 0xD73
dasm_E1 equ 0xD9D
dasm_E3 equ 0xB1D
dasm_E5 equ 0xD87
dasm_E9 equ 0xA36
dasm_ED_42 equ 0xCAC
dasm_ED_43 equ 0xD47
dasm_ED_44 equ 0xADC
dasm_ED_45 equ 0xA67
dasm_ED_46 equ 0xAF3
dasm_ED_4A equ 0xCA3
dasm_ED_4B equ 0xD18
dasm_ED_4D equ 0xA62
dasm_ED_56 equ 0xAF8
dasm_ED_5E equ 0xAFD
dasm_ED_A0 equ 0xB41
dasm_ED_A1 equ 0xB53
dasm_ED_A8 equ 0xB4A
dasm_ED_A9 equ 0xB5C
dasm_ED_B0 equ 0xB45
dasm_ED_B1 equ 0xB57
dasm_ED_B8 equ 0xB4E
dasm_ED_B9 equ 0xB60
dasm_F3 equ 0xAED
dasm_F9 equ 0xD69
dasm_FB equ 0xAF0
dasm_FD equ 0xA48
dasm_FD_01 equ 0xD04
dasm_FD_09 equ 0xCBE
dasm_FD_22 equ 0xD5D
dasm_FD_23 equ 0xCD5
dasm_FD_2A equ 0xD2F
dasm_FD_2B equ 0xCEC
dasm_FD_34 equ 0xC71
dasm_FD_35 equ 0xC8E
dasm_FD_86 equ 0xB7C
dasm_FD_8E equ 0xBA2
dasm_FD_96 equ 0xBC2
dasm_FD_9E equ 0xBE4
dasm_FD_A6 equ 0xC03
dasm_FD_AE equ 0xC3A
dasm_FD_B6 equ 0xC1E
dasm_FD_BE equ 0xC55
dasm_FD_E1 equ 0xDAB
dasm_FD_E3 equ 0xB35
dasm_FD_E5 equ 0xD95
dasm_FD_F9 equ 0xD7D
dasm_FF equ 0xA6C
dasm_UU equ 0xDB3
dasm_UW equ 0xDB7
dasm__AND equ 0xBF2
dasm__CP equ 0xC46
dasm__DEC equ 0xC7D
dasm__ED_47 equ 0xAC4
dasm__ED_4F equ 0xACC
dasm__ED_57 equ 0xAB4
dasm__ED_5F equ 0xABC
dasm__INC equ 0xC60
dasm__LD equ 0xAB0
dasm__OR equ 0xC0F
dasm__SBC equ 0xBCE
dasm__SUB equ 0xBB1
dasm__XOR equ 0xC29
dasm_opcode_table equ 0x5B1
dasm_print16hex_addr equ 0x3DE
dasm_print8hex equ 0x3F6
dasm_printFlags_table equ 0xDBC
dasm_printRegister8_table equ 0xDCC
dasm_printRegister8_table_HL equ 0xDEC
dasm_printRegisterIX_table equ 0xDD4
dasm_printRegisterIY_table equ 0xDDC
dasm_printRegisterSP_table equ 0xDE4
disassemble equ 0x2A2
disassemble_continue equ 0x388
disassemble_err equ 0x378
disassemble_next equ 0x2A6
disassemble_print_opcode_params_end equ 0x375
disassemble_print_opcode_params_loop equ 0x321
disassemble_print_opcode_raw equ 0x2E3
disassemble_print_opcode_raw_fill equ 0x2F7
disassemble_table_first_match equ 0x3BA
disassemble_table_found equ 0x3D4
disassemble_table_notfound equ 0x3D8
disassemble_table_seek equ 0x396
disassemble_table_seek_loop equ 0x39A
dump_pretty equ 0x196D
dump_pretty_ascii equ 0x1997
dump_pretty_ascii_cont equ 0x19B5
dump_pretty_ascii_loop equ 0x199F
dump_pretty_ascii_none equ 0x19B0
dump_pretty_col equ 0x198A
dump_pretty_end equ 0x19C7
dump_pretty_nextrow equ 0x19BB
dump_pretty_row equ 0x1975
endPrint equ 0x1FA
fat_cd_single equ 0x25FB
fat_copy_lba_pointer equ 0x249D
fat_exec equ 0x2716
fat_get_root_table equ 0x21CD
fat_getfatsec equ 0x22C2
fat_openfile equ 0x2377
fat_openfile_noprepare equ 0x237F
fat_print_directory equ 0x24E2
fat_readfilesec equ 0x234A
fat_reset_pointer equ 0x248E
format_filename_fat16 equ 0x24BC
ide_printerror equ 0xEB2
ide_readsector_512_fast equ 0xE67
ide_readsector_timeout equ 0xE9C
ide_regread_8 equ 0xE51
ide_regwrite_8 equ 0xE37
ide_reset equ 0xE2B
ide_writesector_256 equ 0xEB1
ideif_drv_sel equ 0x15B8
ideif_get_drv_pointer equ 0x1558
ideif_init_all equ 0x156C
ideif_init_devtable equ 0x1365
ideif_init_drive equ 0x1478
ideif_prnt_devtable equ 0x1383
iic_init equ 0x173A
iic_read_ack equ 0x1781
iic_receive_buffer equ 0x170B
iic_receive_buffer_done equ 0x172E
iic_receive_buffer_err equ 0x1734
iic_receive_buffer_loop equ 0x171C
iic_receive_byte equ 0x1807
iic_receive_byte_loop equ 0x1814
iic_send_ack equ 0x17A7
iic_send_buffer equ 0x16E1
iic_send_buffer_done equ 0x16FF
iic_send_buffer_err equ 0x1705
iic_send_buffer_loop equ 0x16F1
iic_send_byte equ 0x17E1
iic_send_byte_loop equ 0x17ED
iic_send_ebit equ 0x1760
iic_send_nack equ 0x17C4
iic_send_sbit equ 0x1747
initctrl_int_abandon equ 0x184E
initctrl_int_register equ 0x184E
intctrl_init equ 0x182E
interrupt_vectors equ 0x4000
keyb_cmd_enable equ 0x80B8
keyb_cmd_rd equ 0x80DE
keyb_cmd_wr equ 0x80D8
keyb_enable_int equ 0x80C8
keyb_wait_ibf_empty equ 0x80EB
keyb_wait_obf equ 0x80F2
keyb_wr_wait_ack equ 0x80F8
keyboard_init equ 0x805D
mon_var_template equ 0x44
mon_var_template_end equ 0x613
mon_var_template_sof equ 0x444
nxtILC equ 0x1EF
param_01 equ 0x404
param_02 equ 0x42B
param_03 equ 0x448
param_03_done equ 0x480
param_03_neg equ 0x469
param_04 equ 0x484
param_04_i equ 0x494
param_05 equ 0x49A
param_06 equ 0x4A7
param_07 equ 0x4C1
param_08 equ 0x4CE
param_09 equ 0x4E3
param_09_0A equ 0x4E9
param_0A equ 0x4DA
param_10 equ 0x4F8
param_11 equ 0x508
param_11_12 equ 0x517
param_11_12_all equ 0x537
param_11_12_def equ 0x52A
param_11_12_ix equ 0x52F
param_11_12_iy equ 0x534
param_12 equ 0x510
param_13 equ 0x548
param_80 equ 0x567
param_80_seek equ 0x56E
param_81 equ 0x55E
param_comma equ 0x5A2
param_printRegister equ 0x57D
param_printRegisterA equ 0x59B
param_printRegisterHL equ 0x593
print_16_hex equ 0x181
print_32_hex equ 0x168
print_a_hex equ 0x122
print_bcd equ 0x134
print_char equ 0xF6
print_clear equ 0x105
print_newLine equ 0x10C
print_reg equ 0x1FF
print_str equ 0xFC
print_str_fixed equ 0x1A07
print_wait_out equ 0x117
read_bcd equ 0x14F
read_char equ 0x14C
read_char_raw equ 0x13A
read_lba_sector equ 0x157F
str_dev_done equ 0x1628
str_dev_waitready equ 0x1610
str_error_start equ 0xEE7
str_error_start1 equ 0xF04
str_error_start2 equ 0xF0D
str_error_time equ 0xF16
str_post_apu equ 0x20C7
str_post_ide_30 equ 0x2076
str_post_ide_40 equ 0x2091
str_post_nd equ 0x20FD
str_post_ok equ 0x2135
str_post_pio equ 0x20AC
str_post_rtc equ 0x20E2
str_post_rtc_iv equ 0x210B
var_apu_present equ 0x420E
var_buffer_conin_data equ 0x4100
var_buffer_conin_in equ 0x4200
var_buffer_conin_out equ 0x4201
var_buffer_conin_sts equ 0x4202
var_buffer_conout equ 0x4203
var_buffer_len equ 0x4204
var_bytes_count equ 0x411A
var_curserchar equ 0x420A
var_curserlastaddr equ 0x420B
var_curseron equ 0x4209
var_curserstate equ 0x4208
var_curserx equ 0x4206
var_cursery equ 0x4207
var_dir equ 0x422F
var_idebuffer equ 0x42CF
var_input equ 0x427F
var_last_char equ 0x4205
var_opcode equ 0x4114
var_opcode_length equ 0x4116
var_opcode_pcount equ 0x4119
var_opcode_start equ 0x4110
var_opcode_string equ 0x4117
var_opcode_table equ 0x4112
var_opcode_x equ 0x4115
var_pio_present equ 0x420D
var_ps2mem equ 0x421F
var_scratch equ 0x420F

View File

@@ -0,0 +1,293 @@
.include "extern_symbols.s" ;include monitor symbols.
START_ADDR .EQU 0x8000
org START_ADDR
com_header:
jp com_prg
db 0x00
dw 0x00, 0x00, 0x00 ;always 0
dw [START_ADDR] ;start addr
dw [_eof] ;end of file
dw [_eof - START_ADDR] ;length
dc 48,0x00
com_prg:
; Program start
VDP_REGISTER .EQU 0xE1
VDP_RAM .EQU 0xE0
VDPR_MODE0 .EQU 0
VDPR_MODE1 .EQU 1
VDPR_MODE2 .EQU 8
VDPR_MODE3 .EQU 9
VDPR_COLOR .EQU 7
VDPR_PATNMEBASE .EQU 2
VDPR_PATGENBASE .EQU 4
VDPR_COLTBBASE0 .EQU 3
VDPR_COLTBBASE1 .EQU 10
TmsTransparent: equ 0
TmsBlack: equ 1
TmsMediumGreen: equ 2
TmsLightGreen: equ 3
TmsDarkBlue: equ 4
TmsLightBlue: equ 5
TmsDarkRed: equ 6
TmsCyan: equ 7
TmsMediumRed: equ 8
TmsLightRed: equ 9
TmsDarkYellow: equ 0ah
TmsLightYellow: equ 0bh
TmsDarkGreen: equ 0ch
TmsMagenta: equ 0dh
TmsGray: equ 0eh
TmsWhite: equ 0fh
TMS_R8_MS equ 128 ;Mouse: when set to 1, sets the color bus into input mode and enables mouse. If set to 0, sets color bus into output mode and disables mouse
TMS_R8_LP equ 64 ;Light pen: when set to 1, enables light pen
TMS_R8_TP equ 32 ;Sets the color of code 0 to the color of the palette
TMS_R8_CB equ 16 ;Color bus: when set to 1, sets color bus into input mode. If set to 0, sets color bus into output mode
TMS_R8_VR equ 8 ;If set to 1, VRAM is 64Kx1Bit or 64Kx4bits. If set to 0, VRAM is 16Kx1Bit or 16Kx4Bits
TMS_R8_SPD equ 2 ;if set to 1, sprites are not displayed and related VRAM reads are not performed
TMS_R8_BW equ 1 ;if set to 1, output is grayscale in 32 tones
call tms_init_text2
ret
; Set a VDP Register (dircet access)
; a = data
; e = register
tms_setregister:
out (VDP_REGISTER), a
ld a,e
or 80h
out (VDP_REGISTER), a
ret
; ahl contains pointer to VRAM address
tms_mem_setpointer_rd:
rlc h
rla
rlc h
rla
srl h
srl h
out (VDP_REGISTER),a
ld a,14 + 128
out (VDP_REGISTER),a
ld a,l
out (VDP_REGISTER),a
ld a,h
out (VDP_REGISTER),a
ret
; ahl contains pointer to VRAM address
tms_mem_setpointer_wr:
rlc h
rla
rlc h
rla
srl h
srl h
out (VDP_REGISTER),a
ld a,14 + 128
out (VDP_REGISTER),a
ld a,l
out (VDP_REGISTER),a
ld a,h
or 64
out (VDP_REGISTER),a
ret
;b back, c: front
tms_set_color
ld a,c ;load front color to a
rlca
rlca
rlca
rlca
or b ;combine back color
ld e, VDPR_COLOR
jp tms_setregister
tms_init_text2:
; init vdp (80col text)
ld e, VDPR_MODE0
ld a, 00000100b ;TEXT2
call tms_setregister
ld e, VDPR_MODE1 ;blank screen wit 64K enabled
ld a, 00001000b
call tms_setregister
ld e, VDPR_MODE2
ld a, TMS_R8_SPD
call tms_setregister
ld e, VDPR_MODE3
ld a, 00000010b
call tms_setregister
; set memory layout
; set pattern name table
ld e, VDPR_PATNMEBASE
ld a, 00000011b
call tms_setregister
ld e, VDPR_PATGENBASE
ld a, 00000010b
call tms_setregister
ld e, VDPR_COLTBBASE0
ld a, 00101111b
call tms_setregister
ld e, VDPR_COLTBBASE1
ld a, 00000000b
call tms_setregister
;enable cpu wait
ld e,25
ld a,4
call tms_setregister
;setup cursor:
ld e, 13 ; set blink rate
ld a, 0x22
call tms_setregister
ld e, 12 ; set blink color
ld a, 0xFF
call tms_setregister
ld de, 0x0000
ld bc, 0x2000
ld a, 0
call tms_fill_data
;load font
ld hl, [TmsFont]
ld bc, 256*8
ld de, 0x1000
call tms_load_data
ld e, VDPR_MODE1 ;enable screen wit 64K enabled
ld a, 01010000b
call tms_setregister
;WRITE CHAR
ld hl, 0
ld a,0
call tms_mem_setpointer_wr
ld a,'R'
call VTERM_INIT
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
call VTERM_CURSOR_ON
ld b, TmsBlack
ld c, TmsWhite
call tms_set_color
TEST_ECHO:
call read_char
jp z, TEST_ECHO
call VTERM_PRINT
jr TEST_ECHO
ret
STR_Banner_Start_Test:
db 10,13,"Z8C Monitor V2.1 by Dennis Gunia (2022-2024)",10,13,"TEST",10,13,"NEW LINE",10,13,"LOLLOLLLOLOLOLOLOL",0
;hl location in sysram
;de location in vram (destination)
;bc amount of bytes (byte counter)
tms_load_data:
;setup address
push hl
ex de,hl
ld a,0
call tms_mem_setpointer_wr
pop hl
;load data
tms_load_data_loop:
ld a,(hl) ;load byte from system
inc hl
out (VDP_RAM),a
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, tms_load_data_loop ;if not loop
ret ;else exit
tms_read_statusreg:
out (VDP_RAM),a
ld a,15 + 128
out (VDP_RAM),a
in a,(VDP_RAM)
ex af,af'
xor a ; ld a,0
out (VDP_RAM),a
ld a,15 + 128
out (VDP_RAM),a
ex af,af'
ret
;a bytes to fill
;de location in vram (destination)
;bc amount of bytes (byte counter)
tms_fill_data:
;setup address
push af
ex de,hl
call tms_mem_setpointer_wr
tms_fill_data_loop:
pop af
out (VDP_RAM),a
push af
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, tms_fill_data_loop ;if not loop
pop af
ret ;else exit
.include "font80.s"
.include "vdpterm.s"
;
;hl location in sysmem
;de location in vram (destination)
;bc amount of bytes (byte counter)
tms_read_data:
push hl
push bc
ex de,hl
call tms_mem_setpointer_rd
pop bc
pop hl
tms_read_data_loop:
in a,(VDP_RAM)
ld (hl),a
inc hl
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, tms_read_data_loop ;if not loop
ret ;else exit
_eof:

View File

@@ -0,0 +1 @@
../../../monitor_v2/zout/symbols.s

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
INT_VEC_TABLE .equ [interrupt_vectors]
INT_PIO_ADDRD .equ CS_PIO_AD
INT_PIO_ADDRC .equ CS_PIO_AC
; jumps to isr. MUST be exited with RETI opcode!
_isr_pio_test:
di
ld hl, [_str_pio_interrupt]
call print_str
;get int from pio
in a,(INT_PIO_ADDRD)
call print_a_hex
reti

View File

@@ -0,0 +1,254 @@
;; VDP Terminal Driver
__VDPBUFFER_COUNTER equ var_idebuffer + 767
__VDPBUFFER_CURSORADDR equ var_idebuffer + 768
__VDPBUFFER_LINE equ var_idebuffer + 770
__VTERM_MAX_LINES equ 23
__VTERM_MAX_CPL equ 81
VTERM_INIT:
; init variables
xor a
ld (var_curserx),a
ld (var_cursery),a
ld (var_curseron),a
ld hl, 0x0A00
ld (__VDPBUFFER_CURSORADDR),hl
call _VTERM_SET_CURSORADDR
ret
; --- Console enable cursor ---
; destroy a
VTERM_CURSOR_ON:
push hl
push bc
push de
ld a,1
ld (var_curseron),a
call _VTERM_MOVE_CURSOR
pop de
pop bc
pop hl
ret
; --- Console disable cursor ---
; destroy a
VTERM_CURSOR_OFF:
push hl
push bc
xor a
ld (var_curseron),a
ld hl,(__VDPBUFFER_CURSORADDR)
call VDP_RAMADDR_WR
xor a
out (VDP_RAM),a ;clear old cursor
call _VTERM_SET_CURSORADDR
pop bc
pop hl
ret
; --- Console print string (null terminated) ---
; inputs: hl (pointer to string)
; modify hl
; destroy a
VTERM_PRINT_STR:
ld a,(hl)
or a
ret z
call VTERM_PRINT
inc hl
jr VTERM_PRINT_STR
; --- Console print char ---
; inputs: a (ascii char)
VTERM_PRINT:
push af
push bc
push de
push hl
push af
call print_a_hex
pop af
cp 0x08
jp z,_VTERM_PRINT_BACKSPC
cp 13
jp z, _VTERM_PRINT_CR
cp 10
jp z, _VTERM_PRINT_LF
; else print a
call _VTERM_CHAROUT
_VTERM_PRINT_END:
call _VTERM_MOVE_CURSOR
pop hl
pop de
pop bc
pop af
ret
_VTERM_PRINT_BACKSPC:
call _VTERM_CURSOR_BACK
ld a,' '
out (VDP_RAM),a
jp _VTERM_PRINT_END
_VTERM_PRINT_CR:
call _VTERM_CURSOR_START
jp _VTERM_PRINT_END
_VTERM_PRINT_LF:
call _VTERM_CURSOR_NEWLINE
jp _VTERM_PRINT_END
; only called by VTERM_PRINT
; destroys af,bc,de,hl
_VTERM_CHAROUT:
push af ;store char
ld a,(var_curserx) ;test for line wrap
inc a
cp __VTERM_MAX_CPL +1
jr nz, __VTERM_CHAROUT_NOBREAK ; if linewrap:
call _VTERM_CURSOR_START ; do new line
call _VTERM_CURSOR_NEWLINE
__VTERM_CHAROUT_NOBREAK: ; if not linewrap
ld a,(var_curserx) ; move curser by one
inc a
ld (var_curserx),a
pop af
out (VDP_RAM),a
ret
; destroys af,bc,de,hl
_VTERM_CURSOR_BACK:
ld a,(var_curserx)
or a
ret z;if line wrap, ignore
dec a
ld (var_curserx),a
jp _VTERM_MOVE_CURSOR
; --- Move cursor to start of line ---
; destroys af,bc,de,hl
_VTERM_CURSOR_START:
xor a
ld (var_curserx),a
jp _VTERM_MOVE_CURSOR
; --- Move cursor to next line ---
; destroys af,bc,de,hl
_VTERM_CURSOR_NEWLINE:
ld a,(var_cursery)
cp __VTERM_MAX_LINES
jp z, _VTERM_SCROLL
inc a
ld (var_cursery),a
jp _VTERM_MOVE_CURSOR
; --- Calculate 16bit VRAM adress of current char ---
; destroy AF,DE
; outputs HL
_VTERM_CALC_CURSORADDR:
ld d,0
ld a,(var_cursery)
ld e,a
ld hl,0
add hl, de ; Y x 1
add hl, hl ; Y x 2
add hl, hl ; Y x 4
add hl, de ; Y x 5
add hl, hl ; Y x 10
add hl, hl ; Y x 20
add hl, hl ; Y x 40
add hl, hl ; Y x 80
ld a,(var_curserx)
ld e,a
add hl, de ; add X for final address
ret
; destroy AF,DE,HL
_VTERM_SET_CURSORADDR:
call _VTERM_CALC_CURSORADDR
jp VDP_RAMADDR_WR
; destroy AF,DE,HL
_VTERM_SET_CURSORADDR_RD:
call _VTERM_CALC_CURSORADDR
jp VDP_RAMADDR_RD
; destroys af,bc,de,hl
_VTERM_MOVE_CURSOR:
ld a,(var_curseron)
or a
jp z, _VTERM_SET_CURSORADDR ;if cursor disable, only set new memory location
;if cursor is enabled
ld hl,(__VDPBUFFER_CURSORADDR)
call VDP_RAMADDR_WR
xor a
out (VDP_RAM),a ;clear old cursor
; calulate new position
call _VTERM_CALC_CURSORADDR
ld a,l ;load lower byte
and 0x07 ;mask lower 3 bits
ld b,a ;save lower 3 bits
srl h
rr l
srl h
rr l
srl h
rr l
ld de,0x0A00
add hl,de
ld (__VDPBUFFER_CURSORADDR), hl
call VDP_RAMADDR_WR
ld a,128
_VTERM_MOVE_CURSOR_LOOP:
rrca
djnz _VTERM_MOVE_CURSOR_LOOP
out (VDP_RAM),a
jp _VTERM_SET_CURSORADDR
; --- Memory Scroll ---
_VTERM_SCROLL:
;COPY / Scroll up using VDP commands
ld e,15 ;select status register
ld a,2
call VDP_SETREG
in a,(VDP_REGISTER)
and 0x40 ;Vertical retrace flag
jr z, _VTERM_SCROLL; if not loop
; else setup address
xor a
ld (var_curserx),a
ld (__VDPBUFFER_COUNTER),a
_VTERM_SCROLL_LINE:
ld a,(__VDPBUFFER_COUNTER) ;set next line
inc a
ld (var_cursery),a
call _VTERM_SET_CURSORADDR_RD
ld b,__VTERM_MAX_CPL
ld hl,__VDPBUFFER_LINE ;buffer location
ld c, VDP_RAM
_VTERM_SCROLL_LINE_L1:
ini ;load 80 bytes to ram
jr nz, _VTERM_SCROLL_LINE_L1
;setup target row
ld a,(__VDPBUFFER_COUNTER) ;set next line
ld (var_cursery),a
call _VTERM_SET_CURSORADDR
ld b,__VTERM_MAX_CPL
ld hl,__VDPBUFFER_LINE ;buffer location
_VTERM_SCROLL_LINE_L2:
outi ;store to vdp ram
jr nz, _VTERM_SCROLL_LINE_L2
;done with one line
ld a,(__VDPBUFFER_COUNTER)
inc a
ld (__VDPBUFFER_COUNTER),a
cp __VTERM_MAX_LINES
jp nz, _VTERM_SCROLL_LINE
ld (var_cursery),a
call _VTERM_SET_CURSORADDR
;fill
ld b,__VTERM_MAX_CPL
_VTERM_SCROLL_LINE_FILL:
xor a
out (VDP_RAM),a
djnz _VTERM_SCROLL_LINE_FILL
jp _VTERM_SET_CURSORADDR

View File

@@ -0,0 +1,151 @@
;----------------------------------------------------------------
;Keyboard interface driver for Z8C
;Controller used: vt82c42
;Datasheet: http://www.s100computers.com/My%20System%20Pages/MSDOS%20Board/vt82c42%20PC%20Keyboard%20conrtroller.pdf
;by Dennis Gunia (04/2022)
;----------------------------------------------------------------
;================================================================
; I/O registers
;================================================================
CS_VT82C42_DATA .EQU 0xF0
CS_VT82C42_CTRL .EQU 0xF1
;================================================================
; I/O access functions
;================================================================
keyboard_init:
ld a, 0xA7 ;Disable Mouse
out (CS_VT82C42_CTRL), A
ld a, 0xAD ;Disable Keyboard
out (CS_VT82C42_CTRL), A
_keyboard_init_flush_buffer:
in a,(CS_VT82C42_DATA) ;Read buffer
in a,(CS_VT82C42_CTRL) ;Read status byte
bit 0,a ;Test if buffer is empty
jr nz, _keyboard_init_flush_buffer
;buffer is now flushed. Now set the Controller Configuration Byte
ld a, 0x60 ;next byte is command byte register write
ld b, 11111100b ;Disable bits 0,1,6 (disable IRQ and Translation)
call keyb_cmd_wr
;Perform Controller Self Test
ld a, 0xAA
call keyb_cmd_rd
cp 0x55
jr nz, _keyboard_init_failed
;Perform Interface Tests
ld a, 0xAB
call keyb_cmd_rd
or a
jr nz, _keyboard_init_failed
;Enable Devices
ld a,0xAE
out (CS_VT82C42_CTRL), A
call keyb_wait_ibf_empty
;Test if device is present Devices
ld a,0xEE
out (CS_VT82C42_DATA), A ;Send echo to keboard (0xEE command)
call keyb_wait_ibf_empty
call keyb_wait_obf
in a,(CS_VT82C42_DATA)
cp a, 0xEE
jr z, _keyboard_init_okay ; 0xFC -> Success. Init done!
;Else device error
ld hl, [STR_keyboard_init_failed]
call print_str
ret
_keyboard_init_failed:
LD HL, [STR_keyboard_init_err]
CALL print_str
RET
_keyboard_init_dev_missing:
LD HL, [STR_keyboard_init_missing]
CALL print_str
RET
_keyboard_init_okay:
LD HL, [STR_keyboard_init_okay]
CALL print_str
RET
keyb_cmd_enable:
ld a, 0xF4
call keyb_wr_wait_ack
ld a, 0xED
call keyb_wr_wait_ack
ld a, 0x02
call keyb_wr_wait_ack
ret
keyb_enable_int:
ld a, 0x60 ;next byte is command byte register write
ld b, 00000001b ;Disable bits 0,1,6 (disable IRQ and Translation)
call keyb_cmd_wr
_keyb_enable_int_flush_buffer:
in a,(CS_VT82C42_DATA) ;Read buffer
in a,(CS_VT82C42_CTRL) ;Read status byte
bit 0,a ;Test if buffer is empty
jr nz, _keyb_enable_int_flush_buffer
ret
; a contains command
; b conatins data
keyb_cmd_wr:
out (CS_VT82C42_CTRL),a ;write command byte
ld a, b
out (CS_VT82C42_DATA),a
ret
; a contains command
; a returns data
keyb_cmd_rd:
out (CS_VT82C42_CTRL),a ;write command byte
_keyb_cmd_rd_l1:
in a, (CS_VT82C42_CTRL) ;read status
call print_a_hex
rra
jr nc, _keyb_cmd_rd_l1 ;wait until OBF is set (data avail)
in a, (CS_VT82C42_DATA)
ret
keyb_wait_ibf_empty:
in a, (CS_VT82C42_CTRL) ;read status
rra
rra
jr c, keyb_wait_ibf_empty ;if IBF, wait
ret
keyb_wait_obf:
in a, (CS_VT82C42_CTRL) ;read status
rra
jr nc, keyb_wait_obf ;if IBF, wait
ret
; a data
; z is 0 if success
keyb_wr_wait_ack:
out (CS_VT82C42_DATA),a ;write command byte
call keyb_wait_obf ;wait until sent
_keyb_wr_wait_ack_l1: ;wait for reponse
in a, (CS_VT82C42_CTRL) ;read status
bit 1,a ;check input buffer full
jr nz, _keyb_wr_wait_ack_l1
in a, (CS_VT82C42_DATA)
cp 0xFA
ret
;Status message strings
STR_keyboard_init_okay:
.BYTE "PS/2 Keyboard initialized.",0
STR_keyboard_init_err:
.BYTE "PS/2 Controller error! System HALT!",0
STR_keyboard_init_failed:
.BYTE "PS/2 Keyboard error! System HALT!",0
STR_keyboard_init_missing:
.BYTE "PS/2 no keyboard found!",0

View File

@@ -0,0 +1,256 @@
;----------------------------------------------------------------
;BIOS Driver for VDP V9958
;by Dennis Gunia (07/2024)
;----------------------------------------------------------------
;================================================================
; I/O registers
;================================================================
VDP_REGISTER .EQU 0xE1
VDP_RAM .EQU 0xE0
;================================================================
; VDP Registers
;================================================================
; registers
VDPR_MODE0 .EQU 0
VDPR_MODE1 .EQU 1
VDPR_MODE2 .EQU 8
VDPR_MODE3 .EQU 9
VDPR_COLOR .EQU 7
VDPR_PATNMEBASE .EQU 2
VDPR_PATGENBASE .EQU 4
VDPR_COLTBBASE0 .EQU 3
VDPR_COLTBBASE1 .EQU 10
; register bits
TMS_R8_MS .EQU 128 ;Mouse: when set to 1, sets the color bus into input mode and enables mouse. If set to 0, sets color bus into output mode and disables mouse
TMS_R8_LP .EQU 64 ;Light pen: when set to 1, enables light pen
TMS_R8_TP .EQU 32 ;Sets the color of code 0 to the color of the palette
TMS_R8_CB .EQU 16 ;Color bus: when set to 1, sets color bus into input mode. If set to 0, sets color bus into output mode
TMS_R8_VR .EQU 8 ;If set to 1, VRAM is 64Kx1Bit or 64Kx4bits. If set to 0, VRAM is 16Kx1Bit or 16Kx4Bits
TMS_R8_SPD .EQU 2 ;if set to 1, sprites are not displayed and related VRAM reads are not performed
TMS_R8_BW .EQU 1 ;if set to 1, output is grayscale in 32 tones
; colors
TmsTransparent .EQU 0
TmsBlack .EQU 1
TmsMediumGreen .EQU 2
TmsLightGreen .EQU 3
TmsDarkBlue .EQU 4
TmsLightBlue .EQU 5
TmsDarkRed .EQU 6
TmsCyan .EQU 7
TmsMediumRed .EQU 8
TmsLightRed .EQU 9
TmsDarkYellow .EQU 0ah
TmsLightYellow .EQU 0bh
TmsDarkGreen .EQU 0ch
TmsMagenta .EQU 0dh
TmsGray .EQU 0eh
TmsWhite .EQU 0fh
;================================================================
; I/O access functions
;================================================================
;------------------------------------------------------------------------------
; set vdp register
;
; inputs: a (value), e (register)
;------------------------------------------------------------------------------
VDP_SETREG:
out (VDP_REGISTER), a
ld a,e
or 80h
out (VDP_REGISTER), a
ret
;------------------------------------------------------------------------------
; read vdp status register
;
; inputs: a (register)
;------------------------------------------------------------------------------
VDP_STS:
out (VDP_RAM),a ;write addr
ld a,15 + 128
out (VDP_RAM),a ;selct reg for read
in a,(VDP_RAM)
ret
;------------------------------------------------------------------------------
; set vdp ram pointer for read
;
; inputs: ahl (address)
;------------------------------------------------------------------------------
VDP_RAMADDR_RD:
rlc h
rla
rlc h
rla
srl h
srl h
out (VDP_REGISTER),a
ld a,14 + 128
out (VDP_REGISTER),a
ld a,l
out (VDP_REGISTER),a
ld a,h
out (VDP_REGISTER),a
ret
;------------------------------------------------------------------------------
; set vdp ram pointer for write
;
; inputs: ahl (address)
;------------------------------------------------------------------------------
VDP_RAMADDR_WR:
rlc h
rla
rlc h
rla
srl h
srl h
out (VDP_REGISTER),a
ld a,14 + 128
out (VDP_REGISTER),a
ld a,l
out (VDP_REGISTER),a
ld a,h
or 64
out (VDP_REGISTER),a
ret
;------------------------------------------------------------------------------
; set vdp console color
;
; inputs: b (back color), c (front color)
; destroys: e, af
;------------------------------------------------------------------------------
VDP_COLOR:
ld a,c ;load front color to a
rlca
rlca
rlca
rlca
or b ;combine back color
ld e, VDPR_COLOR
call VDP_SETREG
; set blink color
ld e, 12 ; set blink color
ld a,b ;load front color to a
rlca
rlca
rlca
rlca
or c ;combine back color
call VDP_SETREG
ret
;------------------------------------------------------------------------------
; copy block of memory to vdp
;
; inputs: hl (source in local ram)
; de (destination in vram)
; bc (byte counter)
; destroys: af
;------------------------------------------------------------------------------
VDP_LOADRAM:
;setup address
push hl
ex de,hl
ld a,0
call VDP_RAMADDR_WR
pop hl
_VDP_LOADRAM_LOOP:
ld a,(hl) ;load byte from system
inc hl
out (VDP_RAM),a
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, _VDP_LOADRAM_LOOP ;if not loop
ret ;else exit
;------------------------------------------------------------------------------
; fill block of memory in vdp
;
; inputs: a (value to write)
; de (destination in vram)
; bc (byte counter)
; destroys: hl
;------------------------------------------------------------------------------
VDP_FILL:
push af
ex de,hl
call VDP_RAMADDR_WR
_VDP_FILL_LOOP:
pop af
out (VDP_RAM),a
push af
dec bc ;decrement counter
ld a,b ;check if zero
or c
jr nz, _VDP_FILL_LOOP ;if not loop
pop af
ret
;================================================================
; Init screen modes
;================================================================
VDP_INIT_TEXT2:
; init vdp (80col text)
ld e, VDPR_MODE0
ld a, 00000100b ;TEXT2
call VDP_SETREG
ld e, VDPR_MODE1 ;blank screen wit 64K enabled
ld a, 00001000b
call VDP_SETREG
ld e, VDPR_MODE2
ld a, TMS_R8_SPD
call VDP_SETREG
ld e, VDPR_MODE3
ld a, 00000010b
call VDP_SETREG
; set memory layout
; set pattern name table
ld e, VDPR_PATNMEBASE
ld a, 00000011b
call VDP_SETREG
ld e, VDPR_PATGENBASE
ld a, 00000010b
call VDP_SETREG
ld e, VDPR_COLTBBASE0
ld a, 00101111b
call VDP_SETREG
ld e, VDPR_COLTBBASE1
ld a, 00000000b
call VDP_SETREG
;enable cpu wait (for fast writes. Required!!!!)
ld e,25
ld a,4
call VDP_SETREG
;setup cursor:
ld e, 13 ; set blink rate
ld a, 0x22
call VDP_SETREG
;fill nametable to 0
ld de, 0x0000
ld bc, 0x2000
ld a, 0
call VDP_FILL
;load font
ld hl, [VDP_FONT_6x8_80COL]
ld bc, 256*8
ld de, 0x1000
call VDP_LOADRAM
;enable screen wit 64K enabled
ld e, VDPR_MODE1
ld a, 01010000b
call VDP_SETREG
ret
;================================================================
; Fonts
;================================================================
VDP_FONT_6x8_80COL:
.include "font80.s"

View File

@@ -0,0 +1,5 @@
;----------------------------------------------------------------
;Ringbuffer data structure
;by Dennis Gunia (07/2024)
;----------------------------------------------------------------

View File

@@ -0,0 +1,706 @@
; TMS9918A graphics subroutines
; Copyright 2018-2020 J.B. Langston
;
; Permission is hereby granted, free of charge, to any person obtaining a
; copy of this software and associated documentation files (the "Software"),
; to deal in the Software without restriction, including without limitation
; the rights to use, copy, modify, merge, publish, distribute, sublicense,
; and/or sell copies of the Software, and to permit persons to whom the
; Software is furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
; DEALINGS IN THE SOFTWARE.
; VDP Programmer's Guide: http://map.grauw.nl/resources/video/ti-vdp-programmers-guide.pdf
phase 0xE400
; ---------------------------------------------------------------------------
; configuration parameters; can be changed at runtime
TmsPort:
defb 0xE0 ; port for TMS vram (reg is 1 higher)
TmsWait:
defb 64 ; iterations to wait after ram access
TmsMode:
defw 0 ; mode registers
TmsNameAddr:
defw 3800h ; name table address (multiples of 400H)
TmsColorAddr:
defw 2000h ; color table address (multiples of 40H)
TmsPatternAddr:
defw 0 ; pattern table (multiples of 800H)
TmsSpritePatternAddr:
defw 1800h ; sprite attribute table (multiples of 80H)
TmsSpriteAttrAddr:
defw 3bc0h ; sprite pattern table (multiples of 800H)
TmsScreenColors:
defb 0 ; background (low nybble), text color (high nybble)
; ---------------------------------------------------------------------------
; register constants
dephase
setup_vars:
ld a,0xE0
ld (TmsPort),a
ld a,2
ld (TmsWait),a
ld a,0
ld (TmsMode),a
ld a,0
ld (TmsMode+1),a
ld a,0
ld (TmsNameAddr),a
ld a,38h
ld (TmsNameAddr+1),a
ld a,0
ld (TmsPatternAddr),a
ld a,0
ld (TmsPatternAddr+1),a
ld a,0
ld (TmsColorAddr),a
ld a,20h
ld (TmsColorAddr+1),a
ld a,0
ld (TmsSpritePatternAddr),a
ld a,0x18
ld (TmsSpritePatternAddr+1),a
ld a,0xc0
ld (TmsSpriteAttrAddr),a
ld a,0x3b
ld (TmsSpriteAttrAddr+1),a
ret
TmsWriteBit: equ 40h ; bit to indicate memory write
; Registers
TmsCtrl0Reg: equ 80h
TmsCtrl1Reg: equ 81h
TmsNameReg: equ 82h
TmsColorTableReg: equ 83h
TmsPatternReg: equ 84h
TmsSpriteAttrReg: equ 85h
TmsSpritePatternReg: equ 86h
TmsColorReg: equ 87h
; Control Register Bits
TmsM3: equ 200h
TmsExtVideo: equ 100h
Tms16k: equ 80h
TmsDisplayEnable: equ 40h
TmsIntEnableBit: equ 20h
TmsM1: equ 10h
TmsM2: equ 8
TmsSprite32: equ 2
TmsSpriteMag: equ 1
; ---------------------------------------------------------------------------
; table lengths
TmsTileNameLen: equ 300h
TmsTextNameLen: equ 3c0h
TmsTileColorLen: equ 20h
TmsBitmapColorLen: equ 800h
TmsTilePatternLen: equ 800h
TmsTextPatternLen: equ 800h
TmsMulticolorPatternLen: equ 600h
TmsBitmapPatternLen: equ 1800h
; ---------------------------------------------------------------------------
; color constants
TmsTransparent: equ 0
TmsBlack: equ 1
TmsMediumGreen: equ 2
TmsLightGreen: equ 3
TmsDarkBlue: equ 4
TmsLightBlue: equ 5
TmsDarkRed: equ 6
TmsCyan: equ 7
TmsMediumRed: equ 8
TmsLightRed: equ 9
TmsDarkYellow: equ 0ah
TmsLightYellow: equ 0bh
TmsDarkGreen: equ 0ch
TmsMagenta: equ 0dh
TmsGray: equ 0eh
TmsWhite: equ 0fh
; ---------------------------------------------------------------------------
; port I/O routines
; These routines access the ports configured in TmsPort.
; These memory locations can be set at runtime to support different hardware
; configurations from the same binary. TmsProbe automatically detects the
; TMS9918A on common ports.
; The TMS9918A RAM must not be accessed more than once every 8 us or display
; corruption may occur. During vblank and with the display disabled,
; accesses can be 2 us apart, but we will always use 8 us minimum delay.
; TmsRamIn/TmsRamOut include a configurable delay loop, which waits for the
; configured iterations between VRAM writes to work properly with faster CPUs
; Minimum time to execute each procedure call:
; Z80: 88 cycles, 8.8 us @ 10 MHz
; Z180: 80 cycles, 8.64 us @ 9.216 MHz, 4.32 us @ 18.432, 2.16 us @ 36.864
;
; Additional delay per djnz iteration:
; Z80: 8 cycles * (iterations - 1)
; 0.8 us @ 10 MHz
; Z180: 7 cycles * (iterations - 1)
; 0.756 us @ 9.216 MHz, 0.378 us @ 18.432, 0.189 us @ 36.864
; Delay loop iterations required for different CPU speeds:
; Z80 @ 10 MHz or less: 1
; Z180 @ 9.216 MHz or less: 1
; Z180 @ 18.432 MHz: 10
; Z180 @ 36.864 MHz: 31
TmsWaits: defb 1, 10, 31 ; wait iterations to add for different CPU speeds
; set up wait time based on clock multiplier in E
TmsSetWait:
ld a,1
ld (TmsWait), a
ret
; try to find TMS9918A on common ports
TmsProbe:
ld hl, TmsPorts
ld b, TmsNumPorts
TmsProbeNext:
ld a, (hl)
ld (TmsPort), a
call TmsRegIn ; clear vsync bit
call TmsRegIn ; check it again
jp m, TmsProbeFailed ; if still set, not a TMS9918A
ld de, 0ffffh ; long enough for another vsync
TmsProbeWait:
call TmsRegIn ; check vsync bit again
ret m ; if set, it's a TMS9918A (and Z is clear)
dec de ; otherwise, keep waiting
ld a, e
or d
jp nz, TmsProbeWait
TmsProbeFailed:
inc hl ; if still clear after this long, try next port
djnz TmsProbeNext
xor a ; set Z if we ran out of ports to check
ret
TmsPorts: ; List of ports to probe:
defb 0x80 ; ColecoVision / SG-1000
defb 98h ; MSX
defb 10h ; Sord M5 (conflicts with z80ctrl SIO port)
;defb 8 ; Tatung Einstein (conflicts with z80ctrl drive ports)
;defb 1 ; MTX (not supported by TMS9918A video card)
; add additional ports to check here
TmsNumPorts: equ $ - TmsPorts
; set a single register value
; A = register value
; E = register to set
TmsSetReg:
call TmsRegOut
ld a, e
; fallthrough to TmsRegOut
; write to configured register port
; parameters:
; A = value to write
TmsRegOut:
push bc
ld bc, (TmsPort)
inc c
out (c), a
pop bc
ret
; read from configured register port
; returns:
; A = value read
TmsRegIn:
push bc
ld bc, (TmsPort)
inc c
in a, (c)
pop bc
ret
; write to configured VRAM port
; parameters:
; A = value to write
; Z80 | Z180 cycles...
TmsRamOut: ; 17 | 16 (call)
push bc ; 11 | 11
ld bc, (TmsPort) ; 20 | 18
out (c), a ; 12 | 10
TmsRamOutDelay:
djnz TmsRamOutDelay ; 8 | 7 plus (13 | 9) * (iterations-1)
pop bc ; 10 | 9
ret ; 10 | 9
; read from configured VRAM port
; returns:
; A = value read
TmsRamIn:
push bc
ld bc, (TmsPort)
TmsRamInDelay:
djnz TmsRamInDelay
in a, (c)
ld bc, (TmsPort)
TmsRamInDelay2:
djnz TmsRamInDelay2
pop bc
ret
; ---------------------------------------------------------------------------
; register configuration routines
; set the background color
; A = requested color
TmsBackground:
and 0fh
ld b, a
ld a, (TmsScreenColors)
and 0f0h
or b
ld (TmsScreenColors), a
ld e, TmsColorReg
jp TmsSetReg
; set the sprite configuration
; A = sprite options
TmsSpriteConfig:
and TmsSprite32|TmsSpriteMag
ld b, a
ld a, (TmsMode)
and ~(TmsSprite32|TmsSpriteMag)
or b
ld (TmsMode), a
ld e, TmsCtrl1Reg
jp TmsSetReg
; enable vblank interrupts
TmsIntEnable:
ld a, (TmsMode)
or TmsIntEnableBit
ld (TmsMode), a
ld e, TmsCtrl1Reg
jp TmsSetReg
; disable vblank interrupts
TmsIntDisable:
ld a, (TmsMode)
and ~TmsIntEnableBit
ld (TmsMode), a
ld e, TmsCtrl1Reg
jp TmsSetReg
; ---------------------------------------------------------------------------
; initialization routines
TmsBlankFlags: equ Tms16k
TmsTileFlags: equ Tms16k | TmsDisplayEnable
TmsTextFlags: equ Tms16k | TmsDisplayEnable | TmsM1
TmsMulticolorFlags: equ Tms16k | TmsDisplayEnable | TmsM2
TmsBitmapFlags: equ Tms16k | TmsDisplayEnable | TmsM3
; reset registers and clear all 16KB of video memory
TmsReset:
ld hl, TmsBlankFlags ; blank the screen with 16KB enabled
ld (TmsMode), hl
ld a, l
ld e, TmsCtrl1Reg
call TmsSetReg
ld a, h
ld e, TmsCtrl0Reg
call TmsSetReg
ld a, TmsTransparent
call TmsBackground
ld a, TmsTransparent
call TmsTextColor
ld de, 0 ; clear entire VRAM
ld bc, 4000h
ld a, 0
call TmsFill
ret
; initialize for multicolor mode
TmsMulticolor:
call TmsReset
ld de, (TmsNameAddr)
call TmsWriteAddr
ld d, 6 ; name table has 6 sections
ld e, 0 ; lines in first section start at 0
TmsSectionLoop:
ld c, 4 ; each section has 4 identical lines
TmsLineLoop:
ld b, 32 ; each line is 32 bytes long
ld a, e ; same starting value for each line in section
TmsByteLoop:
call TmsRamOut
inc a ; byte value
djnz TmsByteLoop
dec c ; line counter
jp nz, TmsLineLoop
ld e, a ; next starting value = current + 32
dec d ; section counter
jp nz, TmsSectionLoop
ld hl, TmsMulticolorFlags
ld (TmsMode), hl
jp TmsInitNonBitmap
; initialize for tiled graphics
TmsTile:
call TmsReset
ld hl, TmsTileFlags
ld (TmsMode), hl
jp TmsInitNonBitmap
; initialize for text mode
; HL = address of font to load
TmsTextMode:
push hl
call TmsReset
pop hl
ld de, (TmsPatternAddr) ; load font from address in hl
ld bc, TmsTextPatternLen
call TmsWrite
ld hl, TmsTextFlags
ld (TmsMode), hl
; fallthrough to TmsInitNonBitmap
; non-bitmap color and pattern table configuration
TmsInitNonBitmap:
; set up color table address (register = address / 400H)
ld a, (TmsColorAddr)
and 0c0h
ld (TmsColorAddr), a
ld d, a
ld a, (TmsColorAddr+1)
and 3fh
ld (TmsColorAddr+1), a
rl d
rla
rl d
rla
ld e, TmsColorTableReg
call TmsSetReg
; set up pattern table address (register = address / 800H)
xor a
ld (TmsPatternAddr), a
ld a, (TmsPatternAddr+1)
and 38h
ld (TmsPatternAddr+1), a
rrca
rrca
rrca
ld e, TmsPatternReg
call TmsSetReg
jp TmsInitCommon
; initialize for bitmapped graphics
TmsBitmap:
call TmsReset
ld de, (TmsNameAddr) ; initialize name table with 3 sets
call TmsWriteAddr ; of 256 bytes ranging from 00-FF
ld b, 3
xor a
TmsBitmapLoop:
call TmsRamOut
inc a
jp nz, TmsBitmapLoop
djnz TmsBitmapLoop
ld hl, TmsBitmapFlags
ld (TmsMode), hl
; set up color table at 0H (register = 7FH) or 2000H (register = 0FFH)
xor a
ld (TmsColorAddr), a
ld (TmsPatternAddr), a
ld a, (TmsColorAddr+1)
and 20h
ld (TmsColorAddr+1), a
ld a, 0ffh ; color table at 2000H
jp nz, TmsColorTableHigh
ld a, 7fh ; color table at 0H
TmsColorTableHigh:
ld e, TmsColorTableReg
call TmsSetReg
; set up pattern table at 0H (register = 3) or 2000H (register = 7)
ld a, (TmsPatternAddr+1)
and 20h
ld (TmsPatternAddr+1), a
ld a, 7 ; pattern table at 2000H
jp nz, TmsPatternTableHigh
ld a, 3 ; pattern table at 0H
TmsPatternTableHigh:
ld e, TmsPatternReg
call TmsSetReg
; fall through to TmsInitCommon
; common initialization for all modes
TmsInitCommon:
; set up name table address (register = address / 400H)
xor a
ld (TmsNameAddr), a
ld a, (TmsNameAddr+1)
and 3ch
ld (TmsNameAddr+1), a
rrca
rrca
ld e, TmsNameReg
call TmsSetReg
; set up sprite pattern table address (register = address / 80H)
ld a, (TmsSpriteAttrAddr)
and 80h
ld (TmsSpriteAttrAddr), a
ld d, a
ld a, (TmsSpriteAttrAddr+1)
and 7fh
rl d
rla
ld e, TmsSpriteAttrReg
call TmsSetReg
; set up sprite attribute table address (register = address / 800H)
xor a
ld (TmsSpritePatternAddr), a
ld a, (TmsSpritePatternAddr+1)
and 38h
ld (TmsSpritePatternAddr+1), a
rrca
rrca
rrca
ld e, TmsSpritePatternReg
call TmsSetReg
; set up control registers
ld e, TmsCtrl1Reg
ld a, (TmsMode)
call TmsSetReg
ld a, (TmsMode+1)
ld e, TmsCtrl0Reg
jp TmsSetReg
; ---------------------------------------------------------------------------
; memory access routines
; set the next address of vram to write
; DE = address
TmsWriteAddr:
ld a, e ; send lsb
call TmsRegOut
ld a, d ; mask off msb to max of 16KB
and 3fh
or TmsWriteBit ; indicate that this is a write
call TmsRegOut
ret
; set the next address of vram to read
; DE = address
TmsReadAddr:
ld a, e ; send lsb
call TmsRegOut
ld a, d ; mask off msb to max of 16KB
and 3Fh
call TmsRegOut
ret
; copy bytes from ram to vram
; HL = ram source address
; DE = vram destination address
; BC = byte count
TmsWrite:
call TmsWriteAddr
TmsWriteLoop:
ld a, (hl)
call TmsRamOut
inc hl
dec bc
ld a, b
or c
jp nz, TmsWriteLoop
ret
; fill a section of memory with a single value
; A = value to fill
; DE = vram destination address
; BC = byte count
TmsFill:
push af
call TmsWriteAddr
pop af
TmsFillLoop:
call TmsRamOut
dec c
jp nz, TmsFillLoop
djnz TmsFillLoop
ret
; ---------------------------------------------------------------------------
; text routines
; set text color
; A = requested color
TmsTextColor:
add a, a ; text color into high nybble
add a, a
add a, a
add a, a
ld b, a ; save for later
ld a, (TmsScreenColors) ; get current colors
and 0fh ; mask off old text color
or b ; set new text color
ld (TmsScreenColors), a
ld e, TmsColorReg
jp TmsSetReg ; save it back
; set the address to place text at X/Y coordinate
; A = X
; E = Y
TmsTextPos:
ld d, 0
ld hl, 0
add hl, de ; Y x 1
add hl, hl ; Y x 2
add hl, hl ; Y x 4
add hl, de ; Y x 5
add hl, hl ; Y x 10
add hl, hl ; Y x 20
add hl, hl ; Y x 40
ld e, a
add hl, de ; add X for final address
ld de, (TmsNameAddr) ; add name table base address
add hl, de
ex de, hl
jp TmsWriteAddr
; copy a null-terminated string to VRAM
; HL = ram source address
TmsStrOut:
ld a, (hl)
cp 0 ; return when NULL is encountered
ret z
call TmsRamOut
inc hl
jp TmsStrOut
; repeat a character a certain number of times
; A = character to output
; B = count
TmsRepeat:
call TmsRamOut
djnz TmsRepeat
ret
; output a character
; A = character to output
TmsChrOut: equ TmsRamOut
; ---------------------------------------------------------------------------
; bitmap routines
TmsClearPixel: equ 0A02Fh ; cpl, and b
TmsSetPixel: equ 0B0h ; nop, or b
; set operation for TmsPlotPixel to perform
; HL = pixel operation (TmsClearPixel, TmsSetPixel)
TmsPixelOp:
ld (TmsPixelOpPlaceHolder), hl
ret
; set or clear pixel at X, Y position
; B = Y position
; C = X position
TmsPlotPixel:
ld a, b ; bail out if Y coord > 191
cp 192
ret nc
call TmsXYAddr ; get address in DE for X/Y coord in BC
ld a, c ; get lower 3 bits of X coord
and 7
ld b, 0
ld c, a
ld hl, TmsMaskLookup ; address of mask in table
add hl, bc
ld b, (hl) ; save mask in B
ld hl, (TmsPatternAddr) ; get base address for pattern table
add hl, de
ex de, hl
call TmsReadAddr ; set read within pattern table
call TmsRamIn
TmsPixelOpPlaceHolder:
or b ; mask bit in previous byte
nop ; place holder for 2 byte mask operation
push af
call TmsWriteAddr ; set write address within pattern table
pop af
jp TmsRamOut
TmsMaskLookup:
defb 80h, 40h, 20h, 10h, 8h, 4h, 2h, 1h
; set the color for a block of pixels in bitmap mode
; B = Y position
; C = X position
; A = foreground/background color to set
TmsPixelColor:
push af
ld a, b ; bail out if Y coord > 191
cp 192
ret nc
call TmsXYAddr ; get address in DE for X/Y coord in BC
ld hl, (TmsColorAddr) ; add the color table base address
add hl, de
ex de, hl
call TmsWriteAddr ; set write address within color table
pop af
jp TmsRamOut
; calculate address byte containing X/Y coordinate
; B = Y position
; C = X position
; returns address in DE
TmsXYAddr:
ld a, b ; d = (y / 8)
rrca
rrca
rrca
and 1fh
ld d, a
ld a, c ; e = (x & f8)
and 0f8h
ld e, a
ld a, b ; e += (y & 7)
and 7
or e
ld e, a
ret

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,43 @@
.include "extern_symbols.s" ;include monitor symbols.
START_ADDR .EQU 0x8000
org START_ADDR
com_header:
jp com_prg
db 0x00
dw 0x00, 0x00, 0x00 ;always 0
dw [START_ADDR] ;start addr
dw [_eof] ;end of file
dw [_eof - START_ADDR] ;length
dc 48,0x00
com_prg:
; Program start
ld hl, [_isr_pio_test]
ld (INT_VEC_TABLE + 2), hl
;setup PIO
ld a, 11001111b ;setup as controll port
out (INT_PIO_ADDRC), a
ld a, 11110111b ;set all as inputs
out (INT_PIO_ADDRC), a
ld a, 00000010b ;set interrupt vector
out (INT_PIO_ADDRC), a
ld a, 11010111b ;enable interrupt; logic or, mask follows
out (INT_PIO_ADDRC), a
ld a, 00001011b ;set interrupt mask
;out (INT_PIO_ADDRC), a
;in a,(INT_PIO_ADDRD); clear buffer
ld a, 10000011b ;enable interrupt
out (INT_PIO_ADDRC), a
;call keyboard_init
;call keyb_cmd_enable
;call keyb_enable_int
ret
.include "kdrv_vt82c42.s"
.include "kdrv_int.s"
_eof:

View File

@@ -0,0 +1,323 @@
IDE_CMD_WRITESEC .EQU 0x30
.include "extern_symbols.s" ;include monitor symbols.
START_ADDR .EQU 0x8000
org START_ADDR
com_header:
jp com_prg
db 0x00
dw 0x00, 0x00, 0x00 ;always 0
dw [START_ADDR] ;start addr
dw [_eof] ;end of file
dw [_eof - START_ADDR] ;length
dc 48,0x00
com_prg:
; Program starts here
call TermInit
ret
;-------------------------------------------------
; Z8C/MEGA80 VDP Console IO Functions
; by Dennis Gunia 2022/02
; Version 0.1
;
; For Z8C Monitor
;-------------------------------------------------
; Constant Values
TermVarMemoryLocation equ 0x7000
; Dynamic VARs
TermVarTemplate:
phase TermVarMemoryLocation ;Change pointers to this template to the specified location
TermCurrentX: ; Start sector
defb 0x01
TermCurrentY: ; Start sector
defb 0x04
TermCursorState:
defb 0x00
TermCursorEnabled:
defb 0x00
TermVarTemplateEnd:
dephase
TermInit:
; Copy TermVarTemplate to memory
LD HL, TermVarMemoryLocation ;Load destination into HL
LD BC, [TermVarTemplate] ;Load source into BC
LD DE, [TermVarTemplateEnd] ;Load end into DE
TermInit_copy_loop:
LD A,(BC) ;Copy value
LD (HL),A
INC BC ;Increment pointers
INC HL
PUSH HL ;Backup HL
SBC HL,DE ;Check if next pointer matches end
POP HL ;Restore HL
JP NZ, TermInit_copy_loop ;Loop if pointer != end
; template copy done
; install font
call setup_vars
ld hl, TmsFont
call TmsTextMode ; initialize text mode
ld a, TmsDarkRed ; set colors
call TmsBackground
ld a, TmsWhite
call TmsTextColor
ld a, 0 ; put title at 11, 1
ld e, 0
call TmsTextPos
ld hl, TitleMessage ; output title
call TmsStrOut
ld a, 0 ; put title at 11, 1
ld e, 4
call TmsTextPos
ret
TermSetCursor:
ld a, (TermCurrentY)
ld e, a
ld a, (TermCurrentX)
call TmsTextPos
ret
TermPrintStr:
; BC contains String offset
; Prints null terminated string
PUSH AF
PUSH BC
TermPrintStr_LOOP:
LD A,(BC)
; Return if nullbyte
OR 0
JR Z, TermPrintStr_EXIT
; Print Char
CALL TermPrintChar
; INC BC and JP start of loop
INC BC
jp TermPrintStr_LOOP
TermPrintStr_EXIT:
POP BC
POP AF
RET
TermPrintChar:
push AF
push BC
push DE
push HL
; check if special char
cp 0x7F ; Backspace
jp z, TermPrintCharSPDelete
cp 13
jp z, TermPrintCharSPCR
cp 10
jp z, TermPrintCharSPLF
; a has char
call TmsChrOut
ld a,(TermCurrentX)
inc a
cp 39
jp z,TermPrintCharWrap; if line end
jp nc,TermPrintCharWrap; if line end
ld (TermCurrentX), a
call TermSetCursor
jp TermPrintCharDone
TermPrintCharWrap:
xor a
ld (TermCurrentX), a
ld a,(TermCurrentY)
cp 23 ; if already last line
jp z, TermPrintCharSPLFScroll
inc a
ld (TermCurrentY),a
call TermSetCursor
jp TermPrintCharDone
TermPrintCharSPDelete:
ld a,(TermCurrentX)
and a
jp z, TermPrintCharSPDeleteWrap ; if at pos X 0 then go previous line
dec a ; else decrement X
ld (TermCurrentX), a
call TermSetCursor
ld a, " "
call TmsChrOut
call TermSetCursor
jp TermPrintCharDone
TermPrintCharSPDeleteWrap:
ld a,39
ld (TermCurrentX), a
ld a,(TermCurrentY)
dec a
ld (TermCurrentY),a
call TermSetCursor
ld a, " "
call TmsChrOut
call TermSetCursor
jp TermPrintCharDone
TermPrintCharSPLF: ; linefeed
ld a,(TermCurrentY)
cp 23 ; if already last line
jp z, TermPrintCharSPLFScroll
inc a
ld (TermCurrentY),a
call TermSetCursor
jp TermPrintCharDone
TermPrintCharSPLFScroll:
call TermScroll
ld a,23
ld (TermCurrentY),a
call TermSetCursor
jp TermPrintCharDone
TermPrintCharSPCR: ; linefeed
xor a
ld (TermCurrentX),a
call TermSetCursor
jp TermPrintCharDone
TermPrintCharDone:
pop HL
pop DE
pop BC
pop AF
ret
TermScroll:
ld bc, 0x3800 ; load start of text-buffer into pointer
TermScrollLine:
ld h,b
ld l,c
ld de, 40 ; line width
add hl, de
ld a,l ; setup VDP address
out (0x81),a
ld a,h
and 3fh
out (0x81),a
call VDPWait
in a, (0x80) ; read byte
push af
ld a,c ; setup VDP address
out (0x81),a
ld a,b
and 3fh
or 40h ; write bit
out (0x81),a
pop af
call VDPWait
out (0x80),a
inc bc
ld h,b
ld l,c
ld de, VDPTextBufferEnd ; buffer end
sbc hl, de
jp nz, TermScrollLine
; clear last line
ld bc,920
ld a,c ; setup VDP address
out (0x81),a
ld a,b
and 3fh
or 40h ; write bit
out (0x81),a
ld c,40
TermScrollClearLine:
ld bc, 0x3800 + 920
TermScrollClearLineLoop:
ld a,c ; setup VDP addressh
out (0x81),a
ld a,b
and 3fh
or 40h ; write bit
out (0x81),a
ld a, ' '
out (0x80),a
call VDPWait
inc bc
ld h,b
ld l,c
ld de, 0x3800 + 960 ; buffer end
sbc hl, de
jp nz, TermScrollClearLineLoop
ret
VDPWait:
nop
nop
nop
nop
ret
VDPTextBufferStart equ 0
VDPTextBufferEnd equ 0x3800 + 920
TitleMessage:
db ' Z8C Mk IV - A Z80 Homebrew Computer '
db ' ROM Ver. 1.0 by Dennis Gunia (2024) '
db ' 64k RAM - 10MHz Z80 CPU ',0
TmsSubs:
.include "tms.s" ; TMS graphics routines
; .include "utility.s" ; BDOS utility routines
.include "font1.s"
TermClear:
ld bc, 0x3800
TermClearLoop:
ld a,c ; setup VDP addressh
out (0x81),a
ld a,b
and 3fh
or 40h ; write bit
out (0x81),a
ld a, ' '
out (0x80),a
call VDPWait
inc bc
ld h,b
ld l,c
ld de, 0x3800 + 960 ; buffer end
sbc hl, de
jp nz, TermClearLoop
xor a
ld (TermCurrentX), a
ld (TermCurrentY), a
call TermSetCursor
ret
; Program ends here
_eof:

View File

@@ -0,0 +1,62 @@
.include "extern_symbols.s" ;include monitor symbols.
START_ADDR .EQU 0x8000
org START_ADDR
com_header:
jp com_prg
db 0x00
dw 0x00, 0x00, 0x00 ;always 0
dw [START_ADDR] ;start addr
dw [_eof] ;end of file
dw [_eof - START_ADDR] ;length
dc 48,0x00
com_prg:
; Program start
call VDP_INIT_TEXT2
call VTERM_INIT
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
ld hl,[STR_Banner_Start_Test]
call VTERM_PRINT_STR
call VTERM_CURSOR_ON
ld b, TmsBlack
ld c, TmsWhite
call VDP_COLOR
TEST_ECHO:
call read_char
jp z, TEST_ECHO
call VTERM_PRINT
jr TEST_ECHO
ret
STR_Banner_Start_Test:
db 10,13,"Z8C Monitor V2.1 by Dennis Gunia (2022-2024)",10,13,"TEST",10,13,"NEW LINE",10,13,"TEST > ",0
.include "kdrv_vdpterm.s"
.include "krdv_vdp.s"
.include "kdrv_vt82c42.s"
.include "kdrv_int.s"
_eof:

View File

@@ -0,0 +1 @@
main*

View File

@@ -0,0 +1,595 @@
;This file is generated by the build script.
;Do not make any changes here!
?a0000 equ 0x14A5
?a0001 equ 0x1562
ADDR_RTC equ 0xD0
A_RTS_OFF equ 0x1BE
A_RTS_ON equ 0x1C7
BOOT_PHASE0 equ 0x83
BOOT_PHASE1 equ 0xA5
BOOT_PHASE1_LOOP equ 0xAE
BOOT_PHASE2 equ 0xB9
B_BEEP equ 0x50
B_DSKSEL equ 0x71
B_FATCD equ 0x7A
B_FATCREATE equ 0x7D
B_FATOPEN equ 0x74
B_FATREAD equ 0x77
B_FATWRITE equ 0x80
B_IICRECV equ 0x56
B_IICSEND equ 0x53
B_KEYREAD equ 0x6B
B_KEYSEND equ 0x6E
B_PRINTAHEX equ 0x62
B_PRINTCHAR equ 0x59
B_PRINTINLINE equ 0x5F
B_PRINTLN equ 0x65
B_PRINTSTR equ 0x5C
B_READCHAR equ 0x68
COMMAND equ 0x1944
COMMAND_BACKSPACE equ 0x1985
COMMAND_LUT equ 0x18B2
COMMAND_PROCESS equ 0x19AB
COMMAND_PROCESS_FOUND equ 0x19E6
COMMAND_PROCESS_LOOP equ 0x19AE
COMMAND_PROCESS_LOOP_STR1 equ 0x19B7
COMMAND_PROCESS_LOOP_STR2 equ 0x19CD
COMMAND_PROCESS_NEXT_ENTRY equ 0x19D2
COMMAND_PROCESS_NEXT_ENTRYI equ 0x19D1
COMMAND_PROCESS_NOT_FOUND equ 0x19DD
COMMAND_READ equ 0x1956
CONSOLE_INIT equ 0xDC
CONSOLE_INIT_CTC equ 0xDC
CONSOLE_INIT_SIO equ 0xE4
CS_APU_CTRL equ 0xF9
CS_APU_DATA equ 0xF8
CS_BANK equ 0x00
CS_CTC_0 equ 0x04
CS_CTC_1 equ 0x05
CS_CTC_2 equ 0x06
CS_CTC_3 equ 0x07
CS_DIP equ 0x01
CS_PIA_CR equ 0x33
CS_PIA_PA equ 0x30
CS_PIA_PB equ 0x31
CS_PIA_PC equ 0x32
CS_PIO_AC equ 0xF6
CS_PIO_AD equ 0xF4
CS_PIO_BC equ 0xF7
CS_PIO_BD equ 0xF5
CS_SIO_A_C equ 0x09
CS_SIO_A_D equ 0x08
CS_SIO_B_C equ 0x0B
CS_SIO_B_D equ 0x0A
DHEX_TO_BYTE equ 0x235
DHEX_TO_BYTE_FAILED equ 0x251
ERR_SYNTAX equ 0x19FC
EXEC_RST_08 equ 0xDD5
EXEC_RST_10 equ 0xDD9
EXEC_RST_18 equ 0xDE5
HEX_TO_BIN equ 0x255
HEX_TO_BIN_2 equ 0x263
HEX_TO_INVALID_2 equ 0x26A
IDE_CMD_IDENT equ 0xEC
IDE_CMD_READSEC equ 0x20
IDE_DEV_TABLE equ 0x1307
IDE_RD equ 0x40
IDE_REG_ALTSTS equ 0x16
IDE_REG_CMDSTS equ 0x0F
IDE_REG_DATA equ 0x08
IDE_REG_DRVADDR equ 0x17
IDE_REG_ERROR equ 0x09
IDE_REG_HCYL equ 0x0D
IDE_REG_HEAD equ 0x0E
IDE_REG_LBA0 equ 0x0B
IDE_REG_LBA1 equ 0x0C
IDE_REG_LBA2 equ 0x0D
IDE_REG_LBA3 equ 0x0E
IDE_REG_LCYL equ 0x0C
IDE_REG_SECTOR equ 0x0A
IDE_REG_SSECTOR equ 0x0B
IDE_RST equ 0x80
IDE_WR equ 0x20
IIC_CLK equ 0x01
IIC_DATA equ 0x02
INT_VEC equ 0x1B
IO_AY0_ADDR equ 0x40
IO_AY0_DATA equ 0x41
IO_AY1_ADDR equ 0x42
IO_AY1_DATA equ 0x43
IO_REG0 equ 0x20
IO_RTC_AMPM equ 0x25
IO_RTC_CTR_D equ 0x2D
IO_RTC_CTR_E equ 0x2E
IO_RTC_CTR_F equ 0x2F
IO_RTC_DAY0 equ 0x26
IO_RTC_DAY1 equ 0x27
IO_RTC_HOUR equ 0x24
IO_RTC_MIN0 equ 0x22
IO_RTC_MIN1 equ 0x23
IO_RTC_MON0 equ 0x28
IO_RTC_MON1 equ 0x29
IO_RTC_SEC0 equ 0x20
IO_RTC_SEC1 equ 0x21
IO_RTC_WEEK equ 0x2C
IO_RTC_YEAR1 equ 0x2B
IO_RTC_YERR0 equ 0x2A
MEM_FAT_AMOUNT equ 0x44B8
MEM_FAT_CLUSTERLEN equ 0x44BB
MEM_FAT_COUNT1 equ 0x44BC
MEM_FAT_CURDIR equ 0x44DF
MEM_FAT_CURRDIR equ 0x453F
MEM_FAT_DATASTART equ 0x44C1
MEM_FAT_DIRSEC equ 0x44CD
MEM_FAT_EXEC_COUNT equ 0x4545
MEM_FAT_EXEC_CURR equ 0x4543
MEM_FAT_EXEC_START equ 0x4547
MEM_FAT_FILEREMAIN equ 0x44C9
MEM_FAT_OF0_ATTRIBUTE equ 0x452F
MEM_FAT_OF0_CCLUST equ 0x4531
MEM_FAT_OF0_DATREM equ 0x453B
MEM_FAT_OF0_DATSEC equ 0x4537
MEM_FAT_OF0_FATSEC equ 0x4533
MEM_FAT_RESERVED equ 0x44B6
MEM_FAT_ROOTSTART equ 0x44C5
MEM_FAT_SECTORS equ 0x44B9
MEM_FAT_TMPFNAME equ 0x44CF
MEM_FAT_TMPPOINTER equ 0x44BD
MEM_IDE_BUFFER equ 0x42B6
MEM_IDE_DEVICE equ 0x41CB
MEM_IDE_DEV_TABLE equ 0x41D5
MEM_IDE_FSBUFFER equ 0x44B6
MEM_IDE_PARTITION equ 0x41CD
MEM_IDE_POINTER equ 0x41D1
MEM_IDE_SELECTED equ 0x4215
MEM_IDE_STATUS equ 0x41CC
MEM_IDE_STRING_0 equ 0x4216
MEM_IDE_STRING_1 equ 0x423E
MEM_IDE_STRING_2 equ 0x4266
MEM_IDE_STRING_3 equ 0x428E
MSG_CLEAR equ 0x1B6
NOT_IMPLEMENTED equ 0x19F5
OP_CALL equ 0x1A57
OP_CD equ 0x1E27
OP_CLR equ 0x1BEB
OP_DASM equ 0x1AD8
OP_DIR equ 0x1E23
OP_DUMP equ 0x1A77
OP_EXEC equ 0x1A3E
OP_FSEXEC equ 0x1E44
OP_IIC_IN equ 0x1B9F
OP_IIC_OUT equ 0x1B3F
OP_IO_IN equ 0x1B08
OP_IO_OUT equ 0x1B1E
OP_LSDSK equ 0x1E00
OP_RTIME equ 0x1BEF
OP_SELDSK equ 0x1E04
OP_SET equ 0x1AA7
OP_STIME equ 0x1D87
POST_CHECK_APU equ 0x1E7D
POST_CHECK_IDE_30 equ 0x1EA8
POST_CHECK_IDE_40 equ 0x1EBB
POST_CHECK_PIO equ 0x1E58
POST_START equ 0x1E48
POST_TEST_RTC equ 0x1ED5
PRG_RAM_START equ 0x4110
PRG_RAM_TOP equ 0xFF00
PRINTINLINE equ 0x1D0
PRINTSPEED equ 0x7FFE
PROG_MEM_START equ 0x4000
PROG_ROM_START equ 0x100
RST_00 equ 0x00
RST_08 equ 0x08
RST_10 equ 0x10
RST_18 equ 0x18
STACK_RAM_TOP equ 0xFFFF
START_ROM equ 0x00
STRCONV_BYTES_TO_HEX equ 0x26C
STRCONV_BYTES_TO_HEX_1 equ 0x27B
STRCONV_BYTES_TO_HEX_2 equ 0x285
STR_Banner_Start equ 0x2689
STR_PD_HEADER equ 0x186B
SYS_BUF_START equ 0x4010
SYS_RAM_START equ 0x4000
VAR_CONSOLE_BAUD equ 0x18
VAR_CONSOLE_CONF equ 0x0F
VDP_MEM equ 0x80
VDP_REG equ 0x81
_COMMAND_PROCESS_FOUND equ 0x19F4
_OP_CALL equ 0x1A76
_OP_IIC_ACK_ERR equ 0x1B84
_OP_IIC_ACK_ERR_str equ 0x1B8B
_OP_IIC_IN_LOOP equ 0x1BD1
_OP_IIC_IN_LOOP_TEXT equ 0x1BDE
_OP_IIC_OUT_LOOP equ 0x1B55
_OP_IIC_OUT_SEND equ 0x1B71
_OP_RTIME_NN equ 0x1BF2
_OP_RTIME_RD_CMD equ 0x1CAA
_OP_SELDSK_INVALID equ 0x1E13
_OP_SELDSK_INVALID_STR equ 0x1E2B
_OP_SET_LOOP equ 0x1ABF
_OP_STIME_INVALID equ 0x1D4D
_OP_STIME_PROMPT equ 0x1D64
_OP_STIME_PROMPT_ERR equ 0x1D7C
_OP_STIME_STR_DAY equ 0x1CAB
_OP_STIME_STR_HOUR equ 0x1CFC
_OP_STIME_STR_MIN equ 0x1D17
_OP_STIME_STR_MON equ 0x1CC6
_OP_STIME_STR_SEC equ 0x1D32
_OP_STIME_STR_YEAR equ 0x1CE1
_POST_CHECK_APU_FAILED equ 0x1E9C
_POST_CHECK_IDE_FAILED equ 0x1ECE
_POST_CHECK_PIO_FAILED equ 0x1E71
_POST_TEST_RTC_INVALID equ 0x1F0F
_POST_TEST_RTC_NOTFOUND equ 0x1F08
_STR_NOT_FOUND equ 0x1A17
_STR_NOT_IMPLEMENTED equ 0x1A03
_STR_SYNTAX equ 0x1A2B
_beep_pause_l1 equ 0xE01
_compare_filename_loop equ 0x234A
_compare_filename_nomatch equ 0x2358
_fancy_print_beep_pause equ 0x806A
_fancy_print_delay_loop equ 0x8076
_fat_cd_navigate equ 0x24FF
_fat_cd_navigate_end equ 0x2545
_fat_cd_navigate_errfile equ 0x256D
_fat_cd_navigate_errfile_str equ 0x259F
_fat_cd_navigate_error equ 0x2557
_fat_cd_navigate_error_str equ 0x2575
_fat_cd_navigate_findsec equ 0x2504
_fat_cd_navigate_findsec_skipslash equ 0x2530
_fat_cd_navigate_goback_fl equ 0x24BB
_fat_cd_navigate_inerror equ 0x2565
_fat_cd_navigate_inerrorS equ 0x255F
_fat_cd_navigate_inerrore equ 0x2566
_fat_cd_navigate_inputerr_str equ 0x258C
_fat_cd_navigate_l2 equ 0x2536
_fat_exec_notexec equ 0x2665
_fat_exec_notfound equ 0x264C
_fat_exec_read_done equ 0x2634
_fat_exec_readloop1 equ 0x2616
_fat_get_root_table_invalid equ 0x213A
_fat_getfatsec_notroot equ 0x2179
_fat_increment_32 equ 0x22D0
_fat_lfs_loop equ 0x2246
_fat_lfs_loop_compare_end equ 0x2282
_fat_lfs_loop_compare_match equ 0x2286
_fat_lfs_loop_compare_next_sector equ 0x2258
_fat_math_add32 equ 0x22E4
_fat_math_mul32 equ 0x2315
_fat_math_mul32_l equ 0x231C
_fat_math_mul32_noadd equ 0x2329
_fat_math_sector_add_16 equ 0x22BC
_fat_print_directory_dir equ 0x243A
_fat_print_directory_loop equ 0x23CD
_fat_print_directory_loop_break equ 0x2499
_fat_print_directory_loop_file equ 0x23E9
_fat_print_directory_loop_next equ 0x2465
_fat_print_directory_loop_next_sector equ 0x2470
_format_filename_fat16_clean equ 0x2361
_format_filename_fat16_loop equ 0x2368
_format_filename_fat16_loop_copy equ 0x237B
_format_filename_fat16_loop_skip_8 equ 0x2372
_ide_readsector_512_floop equ 0xE5D
_ideif_drv_sel_fail equ 0x15D2
_ideif_drv_sel_fstr0 equ 0x168F
_ideif_drv_sel_pstr equ 0x1686
_ideif_drv_sel_sstr0 equ 0x169D
_ideif_drv_sel_syn equ 0x16AA
_ideif_init_drive_charloop equ 0x1499
_ideif_init_drive_found equ 0x147B
_ideif_init_drive_loop equ 0x1463
_ideif_init_drive_nodrv equ 0x1476
_ideif_init_drive_prt_fnd equ 0x14F7
_ideif_init_drive_prt_l1 equ 0x14E5
_ideif_init_drive_prt_ln equ 0x14EF
_ideif_prnt_devtable_hdr equ 0x1612
_ideif_prnt_devtable_l1 equ 0x1373
_ideif_prnt_devtable_l1_e2 equ 0x1439
_ideif_prnt_devtable_l1_es equ 0x13B8
_ideif_prnt_devtable_l1_ms equ 0x1436
_ideif_prnt_devtable_l1_nxt equ 0x1380
_ideif_prnt_devtable_l1_s00 equ 0x13A6
_ideif_prnt_devtable_l1_s01 equ 0x13AB
_ideif_prnt_devtable_l1_s02 equ 0x13B0
_ideif_prnt_devtable_l1_sFF equ 0x13B5
_ideif_prnt_devtable_l1_sel equ 0x137E
_ideif_prnt_devtable_master equ 0x1676
_ideif_prnt_devtable_s00 equ 0x164A
_ideif_prnt_devtable_s01 equ 0x1655
_ideif_prnt_devtable_s02 equ 0x1660
_ideif_prnt_devtable_sFF equ 0x166B
_ideif_prnt_devtable_slave equ 0x167E
_read_bcd_invalid equ 0x18D
_shift4 equ 0x1DFB
beep equ 0xDE8
beep_loop equ 0xDEA
beep_pause equ 0xE00
compare_filename equ 0x2346
dasm_00 equ 0x9ED
dasm_01 equ 0xCD9
dasm_02 equ 0xA73
dasm_03 equ 0xCAB
dasm_08 equ 0xAF0
dasm_09 equ 0xC7E
dasm_0A equ 0xA55
dasm_0B equ 0xCC2
dasm_10 equ 0xA35
dasm_12 equ 0xA7E
dasm_18 equ 0x9F8
dasm_1A equ 0xA5F
dasm_20 equ 0xA12
dasm_22 equ 0xD1F
dasm_27 equ 0xAB8
dasm_28 equ 0xA0B
dasm_2A equ 0xCF0
dasm_2F equ 0xABC
dasm_30 equ 0xA03
dasm_32 equ 0xA89
dasm_37 equ 0xAC8
dasm_38 equ 0x9FC
dasm_3A equ 0xA69
dasm_3F equ 0xAC4
dasm_76 equ 0xACC
dasm_80C6 equ 0xB49
dasm_BE equ 0xAE6
dasm_C3 equ 0x9F1
dasm_C88E equ 0xB6F
dasm_C9 equ 0xA41
dasm_CD equ 0xA3B
dasm_D9 equ 0xAFD
dasm_DD equ 0xA23
dasm_DD_01 equ 0xCE0
dasm_DD_09 equ 0xC99
dasm_DD_22 equ 0xD35
dasm_DD_23 equ 0xCB0
dasm_DD_2A equ 0xD07
dasm_DD_2B equ 0xCC7
dasm_DD_34 equ 0xC49
dasm_DD_35 equ 0xC66
dasm_DD_86 equ 0xB51
dasm_DD_8E equ 0xB77
dasm_DD_96 equ 0xB9A
dasm_DD_9E equ 0xBBA
dasm_DD_A6 equ 0xBDB
dasm_DD_AE equ 0xC12
dasm_DD_B6 equ 0xBF7
dasm_DD_BE equ 0xC2E
dasm_DD_E1 equ 0xD87
dasm_DD_E3 equ 0xB0D
dasm_DD_E5 equ 0xD71
dasm_DD_F9 equ 0xD57
dasm_E1 equ 0xD81
dasm_E3 equ 0xB01
dasm_E5 equ 0xD6B
dasm_E9 equ 0xA1A
dasm_ED_42 equ 0xC90
dasm_ED_43 equ 0xD2B
dasm_ED_44 equ 0xAC0
dasm_ED_45 equ 0xA4B
dasm_ED_46 equ 0xAD7
dasm_ED_4A equ 0xC87
dasm_ED_4B equ 0xCFC
dasm_ED_4D equ 0xA46
dasm_ED_56 equ 0xADC
dasm_ED_5E equ 0xAE1
dasm_ED_A0 equ 0xB25
dasm_ED_A1 equ 0xB37
dasm_ED_A8 equ 0xB2E
dasm_ED_A9 equ 0xB40
dasm_ED_B0 equ 0xB29
dasm_ED_B1 equ 0xB3B
dasm_ED_B8 equ 0xB32
dasm_ED_B9 equ 0xB44
dasm_F3 equ 0xAD1
dasm_F9 equ 0xD4D
dasm_FB equ 0xAD4
dasm_FD equ 0xA2C
dasm_FD_01 equ 0xCE8
dasm_FD_09 equ 0xCA2
dasm_FD_22 equ 0xD41
dasm_FD_23 equ 0xCB9
dasm_FD_2A equ 0xD13
dasm_FD_2B equ 0xCD0
dasm_FD_34 equ 0xC55
dasm_FD_35 equ 0xC72
dasm_FD_86 equ 0xB60
dasm_FD_8E equ 0xB86
dasm_FD_96 equ 0xBA6
dasm_FD_9E equ 0xBC8
dasm_FD_A6 equ 0xBE7
dasm_FD_AE equ 0xC1E
dasm_FD_B6 equ 0xC02
dasm_FD_BE equ 0xC39
dasm_FD_E1 equ 0xD8F
dasm_FD_E3 equ 0xB19
dasm_FD_E5 equ 0xD79
dasm_FD_F9 equ 0xD61
dasm_FF equ 0xA50
dasm_UU equ 0xD97
dasm_UW equ 0xD9B
dasm__AND equ 0xBD6
dasm__CP equ 0xC2A
dasm__DEC equ 0xC61
dasm__ED_47 equ 0xAA8
dasm__ED_4F equ 0xAB0
dasm__ED_57 equ 0xA98
dasm__ED_5F equ 0xAA0
dasm__INC equ 0xC44
dasm__LD equ 0xA94
dasm__OR equ 0xBF3
dasm__SBC equ 0xBB2
dasm__SUB equ 0xB95
dasm__XOR equ 0xC0D
dasm_opcode_table equ 0x595
dasm_print16hex_addr equ 0x3C2
dasm_print8hex equ 0x3DA
dasm_printFlags_table equ 0xDA0
dasm_printRegister8_table equ 0xDB0
dasm_printRegister8_table_HL equ 0xDD0
dasm_printRegisterIX_table equ 0xDB8
dasm_printRegisterIY_table equ 0xDC0
dasm_printRegisterSP_table equ 0xDC8
disassemble equ 0x286
disassemble_continue equ 0x36C
disassemble_err equ 0x35C
disassemble_next equ 0x28A
disassemble_print_opcode_params_end equ 0x359
disassemble_print_opcode_params_loop equ 0x305
disassemble_print_opcode_raw equ 0x2C7
disassemble_print_opcode_raw_fill equ 0x2DB
disassemble_table_first_match equ 0x39E
disassemble_table_found equ 0x3B8
disassemble_table_notfound equ 0x3BC
disassemble_table_seek equ 0x37A
disassemble_table_seek_loop equ 0x37E
dump_pretty equ 0x1810
dump_pretty_ascii equ 0x183A
dump_pretty_ascii_cont equ 0x1858
dump_pretty_ascii_loop equ 0x1842
dump_pretty_ascii_none equ 0x1853
dump_pretty_col equ 0x182D
dump_pretty_end equ 0x186A
dump_pretty_nextrow equ 0x185E
dump_pretty_row equ 0x1818
endPrint equ 0x1DE
fancy_print equ 0x8000
fancy_print_beep equ 0x8051
fancy_print_beep_lp equ 0x8053
fancy_print_beep_pause equ 0x8069
fancy_print_char equ 0x803D
fancy_print_delay equ 0x8076
fancy_print_demo_text equ 0x8080
fancy_print_loop equ 0x8013
fancy_print_loop_char equ 0x8038
fancy_print_loop_speed equ 0x8021
fancy_print_loop_wait equ 0x802D
fat_cd_single equ 0x249B
fat_copy_lba_pointer equ 0x233D
fat_exec equ 0x25B6
fat_get_root_table equ 0x206D
fat_getfatsec equ 0x2162
fat_openfile equ 0x2217
fat_openfile_noprepare equ 0x221F
fat_print_directory equ 0x2382
fat_readfilesec equ 0x21EA
fat_reset_pointer equ 0x232E
format_filename_fat16 equ 0x235C
ide_printerror equ 0xE94
ide_readsector_512_fast equ 0xE49
ide_readsector_timeout equ 0xE7E
ide_regread_8 equ 0xE33
ide_regwrite_8 equ 0xE19
ide_reset equ 0xE0D
ide_writesector_256 equ 0xE93
ideif_drv_sel equ 0x159A
ideif_get_drv_pointer equ 0x153A
ideif_init_all equ 0x154E
ideif_init_devtable equ 0x1347
ideif_init_drive equ 0x145A
ideif_prnt_devtable equ 0x1365
iic_init equ 0x171C
iic_read_ack equ 0x1763
iic_receive_buffer equ 0x16ED
iic_receive_buffer_done equ 0x1710
iic_receive_buffer_err equ 0x1716
iic_receive_buffer_loop equ 0x16FE
iic_receive_byte equ 0x17E9
iic_receive_byte_loop equ 0x17F6
iic_send_ack equ 0x1789
iic_send_buffer equ 0x16C3
iic_send_buffer_done equ 0x16E1
iic_send_buffer_err equ 0x16E7
iic_send_buffer_loop equ 0x16D3
iic_send_byte equ 0x17C3
iic_send_byte_loop equ 0x17CF
iic_send_ebit equ 0x1742
iic_send_nack equ 0x17A6
iic_send_sbit equ 0x1729
interrupt_vectors equ 0x4000
mon_var_template equ 0x44
mon_var_template_end equ 0x50F
nxtILC equ 0x1D3
param_01 equ 0x3E8
param_02 equ 0x40F
param_03 equ 0x42C
param_03_done equ 0x464
param_03_neg equ 0x44D
param_04 equ 0x468
param_04_i equ 0x478
param_05 equ 0x47E
param_06 equ 0x48B
param_07 equ 0x4A5
param_08 equ 0x4B2
param_09 equ 0x4C7
param_09_0A equ 0x4CD
param_0A equ 0x4BE
param_10 equ 0x4DC
param_11 equ 0x4EC
param_11_12 equ 0x4FB
param_11_12_all equ 0x51B
param_11_12_def equ 0x50E
param_11_12_ix equ 0x513
param_11_12_iy equ 0x518
param_12 equ 0x4F4
param_13 equ 0x52C
param_80 equ 0x54B
param_80_seek equ 0x552
param_81 equ 0x542
param_comma equ 0x586
param_printRegister equ 0x561
param_printRegisterA equ 0x57F
param_printRegisterHL equ 0x577
print_16_hex equ 0x1A9
print_32_hex equ 0x190
print_a_hex equ 0x143
print_bcd equ 0x155
print_char equ 0x115
print_clear equ 0x126
print_newLine equ 0x12D
print_reg equ 0x1E3
print_str equ 0x11D
print_str_fixed equ 0x18AA
print_wait_out equ 0x138
read_bcd equ 0x177
read_char equ 0x15B
read_in_sts equ 0x16D
read_lba_sector equ 0x1561
str_dev_done equ 0x160A
str_dev_waitready equ 0x15F2
str_error_start equ 0xEC9
str_error_start1 equ 0xEE6
str_error_start2 equ 0xEEF
str_error_time equ 0xEF8
str_post_apu equ 0x1F67
str_post_ide_30 equ 0x1F16
str_post_ide_40 equ 0x1F31
str_post_nd equ 0x1F9D
str_post_ok equ 0x1FD5
str_post_pio equ 0x1F4C
str_post_rtc equ 0x1F82
str_post_rtc_iv equ 0x1FAB
var_apu_present equ 0x410A
var_buffer_len equ 0x4100
var_bytes_count equ 0x411A
var_curserchar equ 0x4106
var_curserlastaddr equ 0x4107
var_curseron equ 0x4105
var_curserstate equ 0x4104
var_curserx equ 0x4102
var_cursery equ 0x4103
var_dir equ 0x412B
var_idebuffer equ 0x41CB
var_input equ 0x417B
var_last_char equ 0x4101
var_opcode equ 0x4114
var_opcode_length equ 0x4116
var_opcode_pcount equ 0x4119
var_opcode_start equ 0x4110
var_opcode_string equ 0x4117
var_opcode_table equ 0x4112
var_opcode_x equ 0x4115
var_pio_present equ 0x4109
var_ps2mem equ 0x411B
var_scratch equ 0x410B

View File

@@ -0,0 +1 @@
../../../monitor_v2/zout/symbols.s

View File

@@ -0,0 +1,134 @@
CS_PIO_BD .EQU 0xF5
CS_PIO_BC .EQU 0xF7
CS_PIO_AD .EQU 0xF4
CS_PIO_AC .EQU 0xF6
.include "extern_symbols.s" ;include monitor symbols.
.org 0x8000
PRINTSPEED .EQU 0x7FFE
fancy_print:
call print_clear
ld bc, 65535
call fancy_print_delay
ld hl,[fancy_print_demo_text]
ld bc, 4500
ld (PRINTSPEED), bc
fancy_print_loop:
ld a,(hl)
inc hl
or a
ret z
cp 0xFE
jr z, fancy_print_loop_wait
cp 0xFD
jr z, fancy_print_loop_speed
jr fancy_print_loop_char
fancy_print_loop_speed:
ld a,(hl)
inc hl
ld c,a
ld a,(hl)
inc hl
ld b,a
ld (PRINTSPEED), bc
jr fancy_print_loop
fancy_print_loop_wait:
ld a,(hl)
inc hl
ld c,a
ld a,(hl)
inc hl
ld b,a
call fancy_print_delay
jr fancy_print_loop
fancy_print_loop_char:
call fancy_print_char
jr fancy_print_loop
fancy_print_char:
call print_char
ld DE, 0xA0
ld bc, 12
call fancy_print_beep
ld bc, (PRINTSPEED)
call fancy_print_delay
ret
fancy_print_beep:
push AF
push DE
fancy_print_beep_lp:
LD A,0x08
OUT (CS_PIO_AD), A
call fancy_print_beep_pause
LD A,0x00
OUT (CS_PIO_AD), A
call fancy_print_beep_pause
DEC DE
ld A,D
or E
jr NZ, fancy_print_beep_lp
pop de
pop af
ret
fancy_print_beep_pause:
PUSH BC
_fancy_print_beep_pause:
NEG ; 8 T-states
NEG ; 8 T-states
DEC BC ; 6 T-states
LD A,C ; 9 T-states
OR B ; 4 T-states
JP NZ,_fancy_print_beep_pause ; 10 T-states
POP BC
RET ; Pause complete, RETurn
; bc contians length
fancy_print_delay:
_fancy_print_delay_loop:
push AF
pop AF
push AF
pop AF
dec bc
ld a,b
or c
jr nz, _fancy_print_delay_loop
ret
;; 0x00 exits the print
;; 0xFE <uint16: delay> pauses the print
;; 0xFD <uint16: delay> changes the print speed
fancy_print_demo_text:
db "Hello Dennis ... ",0xFE
dw 65535
db "It's been a ", 0xFD
dw 24500
db "long long time.", 0xFD
dw 4500
db 10,13,0xFE
dw 65535
db 0xFE
dw 65535
db "I almost thought",0xFE
dw 65535
db 0xFD
dw 50000
db " ... ", 0xFD
dw 4500
db "you forgot me ...",0xFE
dw 65535
db 0xFE
dw 65535
db 10,13
db 10,13
db "I'm glad you are back!"
db 10,13
db 10,13
db 0

View File

@@ -0,0 +1 @@
../../../monitor_v2/zout/symbols.s

View File

@@ -0,0 +1,100 @@
IDE_CMD_WRITESEC .EQU 0x30
.include "extern_symbols.s" ;include monitor symbols.
START_ADDR .EQU 0x8000
org START_ADDR
com_header:
jp com_prg
db 0x00
dw 0x00, 0x00, 0x00 ;always 0
dw [START_ADDR] ;start addr
dw [_eof] ;end of file
dw [_eof - START_ADDR] ;length
dc 48,0x00
com_prg:
; Program starts here
;------------------------------------------------------------------------------
; write_lba_sector
;
; Writes A*512 byte sector ro disk
; HL contains pointer to LBA address
; DE contains data location
; A contains sector count
;------------------------------------------------------------------------------
write_lba_sector:
push af
ide_wait_rdy
pop af
;setup registers
LD B,IDE_REG_SECTOR ;amount of sectores
CALL ide_regwrite_8
LD A,(HL)
LD B,IDE_REG_LBA0
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_LBA1
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_LBA2
CALL ide_regwrite_8
INC HL
LD A,(HL)
AND 00001111b
OR 11100000b
LD B,IDE_REG_LBA3
CALL ide_regwrite_8
LD A,IDE_CMD_WRITESEC ;send read command
LD B,IDE_REG_CMDSTS
CALL ide_regwrite_8
jp ide_writesector_512_fast
ide_writesector_512_fast:
ld b, IDE_REG_CMDSTS ;check status
call ide_regread_8
bit 0,a ;Error Bit set
jp nz, ide_printerror ;then abort
bit 3,a ;wait for drq
jr z,ide_writesector_512_fast
ld b,0 ;256x
ld a, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out
out (CS_PIA_CR), a ;Set Data direction to IN
_ide_writesector_512_loop:
ld a, IDE_REG_DATA ;CS0 and A=0 -> I/O register
out (CS_PIA_PC), a ;set register
ld a,(hl)
out (CS_PIA_PA),a
inc hl
ld a,(hl)
out (CS_PIA_PB),a
inc hl
or IDE_WR ;Set Read bit
out (CS_PIA_PC), a ;Write Read to bit controll lines
ld a, IDE_REG_DATA ;CS0 and A=0 -> I/O register
out (CS_PIA_PC), a ;set register
djnz _ide_writesector_512_loop ; loop for 512 bytes
_ide_writesector_512_waitready:
ld b, IDE_REG_CMDSTS;check drive status
call ide_regread_8
bit 0,a ;Error Bit set
jp nz, ide_printerror ;then abort
bit 7,a ;test if data is written
jp nz _ide_writesector_512_waitready ; if still writing, loop
bit 3,a ;test if drive awaits next sector
jp nz, ide_writesector_512_fast
ret z
; Program ends here
_eof: