From 94a699119aa25baab58379dac49440ecce4be4df Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 23 Dec 2020 20:23:17 +0100 Subject: [PATCH] BIOS now attached to BOOTCPM command, fixed another screen editor bug --- Makefile | 2 +- src/kernal/board_m65/mega65_bootcpm.s | 13 +++- src/kernal/board_m65/mega65_imports_C.s | 8 +++ src/kernal/board_m65/mega65_map_helpers.s | 19 ++++++ src/kernal/board_m65/mega65_proxies_zvm.s | 17 +++++ .../mega65_chrout_screen_control_2.s | 8 +-- src/zvm_m65/z80_instr_load_8bit.s | 10 ++- src/zvm_m65/zvm_bios.s | 3 + src/zvm_m65/zvm_core.s | 64 ++++++++++++------- src/zvm_m65/zvm_imports.s | 41 ++++++++++++ 10 files changed, 151 insertions(+), 34 deletions(-) create mode 100644 src/kernal/board_m65/mega65_proxies_zvm.s create mode 100644 src/zvm_m65/zvm_imports.s diff --git a/Makefile b/Makefile index d825cadc..1a01ffcd 100644 --- a/Makefile +++ b/Makefile @@ -382,7 +382,7 @@ $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combine $(DIR_M65)/mon.seg_1 $(DIR_M65)/MON_1_combined.vs $(DIR_M65)/MON_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_MON_M65) $(CFG_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/zvm.seg_1 $(DIR_M65)/ZVM_1_combined.vs $(DIR_M65)/ZVM_1_combined.sym: \ - $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_ZVM_M65) $(CFG_M65) $(DIR_M65)/KERNAL_0_combined.sym + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_ZVM_M65) $(CFG_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/KERNAL_C_combined.sym $(DIR_X16)/basic.seg_1 $(DIR_X16)/BASIC_1_combined.vs $(DIR_X16)/BASIC_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_X16) $(GEN_STR_X16) $(DIR_X16)/KERNAL_0_combined.sym $(DIR_X16)/BASIC_0_combined.sym diff --git a/src/kernal/board_m65/mega65_bootcpm.s b/src/kernal/board_m65/mega65_bootcpm.s index 8c2f5501..859b3163 100644 --- a/src/kernal/board_m65/mega65_bootcpm.s +++ b/src/kernal/board_m65/mega65_bootcpm.s @@ -4,6 +4,13 @@ BOOTCPM: - ; jsr map_MON_1 - ; XXX implement system startupo - jmp BOOTCPM + jsr CLALL + clc + jsr M65_MODESET + + jsr viciv_init ; do it now, later it will not be safe anymore + lda #$01 + jsr M65_SCRMODESET + + jsr map_ZVM_1 + jmp ($2000) diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s index 4e0c8a92..bfe90027 100644 --- a/src/kernal/board_m65/mega65_imports_C.s +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -15,3 +15,11 @@ ;; #ALIAS# __kb_matrix_alwaysrepeat_end = KERNAL_0.__kb_matrix_alwaysrepeat_end ;; #ALIAS# kb_matrix_joy_status = KERNAL_0.kb_matrix_joy_status ;; #ALIAS# kb_matrix_joy_keytab_idx = KERNAL_0.kb_matrix_joy_status + +; +; Definitions needed to perform proxy functionality for Z80 Virtual Machione +; + +;; #ALIAS# CHROUT = KERNAL_0.CHROUT + +;; #ALIAS# map_ZVM_1 = KERNAL_0.map_ZVM_1 diff --git a/src/kernal/board_m65/mega65_map_helpers.s b/src/kernal/board_m65/mega65_map_helpers.s index d5bb88cc..0c9005bf 100644 --- a/src/kernal/board_m65/mega65_map_helpers.s +++ b/src/kernal/board_m65/mega65_map_helpers.s @@ -10,6 +10,8 @@ ; - KERNAL_1 - for calling KERNAL_1 segment code ; - DOS_1 - for swiching to DOS context ; - NORMAL_from_DOS_1 - for switching bact from DOS context +; - MON_1 - for the monitor +; - ZVM_1 - for Z80 virtual machine map_NORMAL: @@ -117,3 +119,20 @@ map_MON_1: map bra map_end + +map_ZVM_1: + + php + pha + phx + phy + phz + + lda #$00 + tay + taz + + ldx #$E3 ; $2000 <- map 24KB from $32000 + + map + bra map_end diff --git a/src/kernal/board_m65/mega65_proxies_zvm.s b/src/kernal/board_m65/mega65_proxies_zvm.s new file mode 100644 index 00000000..f8166f40 --- /dev/null +++ b/src/kernal/board_m65/mega65_proxies_zvm.s @@ -0,0 +1,17 @@ +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Proxies for calling MEGA65 segment KERNAL_0 routines from ZVM_1 +; + + +proxy_Z1_CHROUT: + + jsr CHROUT + + ; FALLTROUGH + +proxy_Z1_end: + + jmp map_ZVM_1 diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index b3895d31..f0d235f2 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -72,23 +72,23 @@ m65_chrout_screen_HOME: ; Character set switching -m65_chrout_screen_GFX: +m65_chrout_screen_TXT: lda VIC_CHARPTR+1 ora #%00001000 ; FALLTROUGH -m65_chrout_screen_GFX_cont: +m65_chrout_screen_GFXTXT_cont: sta VIC_CHARPTR+1 bra m65_chrout_screen_ctrl2_end -m65_chrout_screen_TXT: +m65_chrout_screen_GFX: lda VIC_CHARPTR+1 and #%11110111 - bra m65_chrout_screen_GFX_cont + bra m65_chrout_screen_GFXTXT_cont ; INS key diff --git a/src/zvm_m65/z80_instr_load_8bit.s b/src/zvm_m65/z80_instr_load_8bit.s index e3b0bc68..1258b049 100644 --- a/src/zvm_m65/z80_instr_load_8bit.s +++ b/src/zvm_m65/z80_instr_load_8bit.s @@ -277,18 +277,22 @@ Z80_instr_ED_5F: ; LD A,R ora REG_IFF2 sta REG_F + clc lda REG_R06 ; register R only simulates random numbers + bpl @1 + sec +@1: + rol eor VIC_RASTER - adc TIME+2 eor VIC_XPOS sta REG_R06 and #%01111111 eor REG_R7 ; not 'ora', we want to reuse the 'garbage' sta REG_A - bpl @1 + bpl @2 +Z80_PUT_1_SF -@1: +@2: +bne ZVM_next +Z80_PUT_1_ZF jmp ZVM_next diff --git a/src/zvm_m65/zvm_bios.s b/src/zvm_m65/zvm_bios.s index 17cd7405..c8d73d83 100644 --- a/src/zvm_m65/zvm_bios.s +++ b/src/zvm_m65/zvm_bios.s @@ -71,6 +71,9 @@ zvm_BIOS_00_BOOT: ; Cold start dew REG_AF ; AF and SP have $FFFF value on start dew REG_SP + lda TIME+2 ; give a little initial randomness to register R + sta REG_R06 + ; XXX load CPM3.SYS ; FALLTROUGH diff --git a/src/zvm_m65/zvm_core.s b/src/zvm_m65/zvm_core.s index aeaedb17..6974e18d 100644 --- a/src/zvm_m65/zvm_core.s +++ b/src/zvm_m65/zvm_core.s @@ -5,7 +5,47 @@ ZVM_entry: - ; XXX mark that this is the first start of CP/M iin the lifecycle, display BIOS information + ; Reset stack pointer - this routine will never return + + ldx #$FF + txs + + ; Skip the IRQ processing, even if Kernal reenables it + + sei + lda #return_from_interrupt + sta CINV+1 + + ; Make sure $C000-$CFFF ROM is mapped-in, we keep our proxies there + + lda VIC_CTRLA + ora #%00100000 + sta VIC_CTRLA + + ; Setup colours, print welcome message + + lda #$00 + sta VIC_EXTCOL + sta VIC_BGCOL0 + + jsr PRIMM + !byte KEY_GREEN, KEY_ESC, 'o', KEY_CLR, KEY_C65_SHIFT_ON, KEY_TXT, KEY_C65_SHIFT_OFF + !pet "Open ROMs MEGA65 BIOS for CP/M", $0D + !pet "Zilog Z80 to 45GS02 translator", $0D + !byte $0D,$0D + !byte 0 + + ; XXX code is not ready to progress further + + jsr PRIMM + !byte $0D + !pet "* Implementation not finished yet - system HALTED *" + !byte 0 +@1 + bra @1 + jmp zvm_BIOS_00_BOOT ZVM_store_next: @@ -71,28 +111,6 @@ Z80_instr_FD: +ZVM_DISPATCH Z80_vectab_FD_0, Z80_vectab_FD_1 ; - - - - - - - - - - - - - - - - - - - - - - ; ; Not implemented yet - XXX implement them! ; diff --git a/src/zvm_m65/zvm_imports.s b/src/zvm_m65/zvm_imports.s new file mode 100644 index 00000000..92d77b53 --- /dev/null +++ b/src/zvm_m65/zvm_imports.s @@ -0,0 +1,41 @@ + +;; #IMPORT# KERNAL_0 = KERNAL_0_combined.sym +;; #IMPORT# KERNAL_C = KERNAL_C_combined.sym + +; +; Definitions for calling MEGA65 segment KERNAL_0 routines from ZVM_1 +; + +;; #ALIAS# CHROUT = KERNAL_C.proxy_Z1_CHROUT + +;; #ALIAS# return_from_interrupt = KERNAL_0.return_from_interrupt + + +; 'Print immediate', original implementation by Mike Barry, adapted to 65CE02, modified to preserve .Y +; see http://www.6502.org/source/io/primm.htm + +PRIMM: + + pla ; get low part of (string address-1) + sta PTR1 + pla ; get high part of (string address-1) + sta PTR2 + phy + +bra @2 +@1: + jsr CHROUT ; output a string char +@2: + inc PTR1 ; advance the string pointer + bne @3 + inc PTR2 +@3: + ldy #$00 + lda (PTR1), y ; get string char + bne @1 ; output and continue if not NUL + ply + lda PTR2 + pha + lda PTR1 + pha + + rts