diff --git a/CREDITS.md b/CREDITS.md index c1a3082a..dce673d1 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -26,8 +26,10 @@ ## other -* Gábor Lénárt - for his work on [XEMU Mega65 emulator](https://github.com/lgblgblgb/xemu) +* Gábor Lénárt - for [his work](https://github.com/lgblgblgb/xemu) on XEMU Mega65 emulator +* Hernán Di Pietro - for [his work](https://github.com/hernandp/xemu) on XEMU Mega65 emulator * Mads Nielsen - for the [Kick Assembler](http://www.theweb.dk/KickAssembler/Main.html#frontpage) +* Simon Jameson - for his Kick Assembler [pseudocommands](https://github.com/smnjameson/M65_KickAsm_PseudoCommands) for Mega65 CPU support
diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index 9d36e083..f1ad4b98 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -268,6 +268,85 @@ } +// Others, taken from https://github.com/smnjameson/M65_KickAsm_PseudoCommands + +.const z = -999 // allows (base page),z addressing mode +.const sy = -998 // allows (base page, s),y addressing mode +.const AT_IZEROPAGEZ = 13 // adds a pseudo addressing mode +.const AT_INDIRECTX = -5 // adds a pseudo addressing mode + +.function GetAdressingModeType(arg) { + .if(arg == AT_NONE) .return "AT_NONE" + .if(arg == AT_IMMEDIATE) .return "AT_IMMEDIATE" + .if(arg == AT_INDIRECT) .return "AT_INDIRECT" + .if(arg == AT_INDIRECTX) .return "AT_INDIRECTX" + .if(arg == AT_ABSOLUTE) .return "AT_ABSOLUTE" + .if(arg == AT_ABSOLUTEX) .return "AT_ABSOLUTEX" + .if(arg == AT_ABSOLUTEY) .return "AT_ABSOLUTEY" + .if(arg == AT_IZEROPAGEX) .return "AT_IZEROPAGEX" + .if(arg == AT_IZEROPAGEY) .return "AT_IZEROPAGEY" + .if(arg == AT_IZEROPAGEZ) .return "AT_IZEROPAGEZ" + .return arg +} + +.pseudocommand cpz arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type == AT_IMMEDIATE) { + .byte $C2, value + } else .if(type == AT_ABSOLUTE) { + .if(value <= $FF ) { + .byte $D4, value + } else { + .byte $DC, value + } + } else { + .error "Invalid adressingmode. 'cpz' doesn't support "+GetAdressingModeType(type)+" mode" + } +} + +.pseudocommand lda arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "':lda' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "':lda ($nn),z' requires zeropage address" + .byte $B2, value +} + +.pseudocommand ldz arg +{ + .var value = arg.getValue() + .var type = arg.getType() + .if(type == AT_IMMEDIATE) { + .byte $A3, value + } else .if(type == AT_ABSOLUTE) { + .byte $AB, value + } else .if(type == AT_ABSOLUTEX) { + .byte $BB, value + } else { + .error "Invalid adressingmode. 'ldz' doesn't support "+GetAdressingModeType(type)+" mode" + } +} + +.pseudocommand sta arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "':sta' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "':sta ($nn),z' requires zeropage address" + .byte $92, value +} + +// Flat memory access support + +.pseudocommand sta_lp arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "'sta_lp' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "'sta_lp' requires zeropage address" + nop + .byte $92, value +} + #endif diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 537c54a8..921bd319 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -10,7 +10,7 @@ // Page 0 - reused LDTB1 // - // $D9 -- UNUSED -- + .label M65_TMP__K1 = $D9 // $D9 -- UNUSED -- temporary value for various Kernal routines .label M65_LPNT_BAS1 = $DA // $DA-$DD 4-byte pointer for temporary usage within BASIC .label M65_LPNT_BAS2 = $DE // $DE-$E1 4-byte pointer for temporary usage within BASIC .label M65_LPNT_SCR = $E2 // $E2-$E5 4-byte pointer for temporary usage within BASIC and screen editor @@ -18,7 +18,7 @@ .label M65_MAGICSTR = $E7 // $E7-$E9 if equals 'M65' it means we are in native mode .label M65_LPNT_IRQ = $EA // $EA-$ED 4-byte pointer for temporary usage within interrupts .label M65_LPNT_KERN = $EE // $EE-$F1 4-byte pointer for temporary usage by KERNAL - // $F2 -- UNUSED -- + .label M65_TMP__K2 = $F2 // $F2 -- UNUSED -- temporary value for various Kernal routines // // Pages 4-7 - reused screen memory @@ -30,9 +30,13 @@ // $580-$5FF - reserved for KERNAL - .label M65_SCRMODE = $580 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) - .label M65_SCRTXTBASE = $581 // $581-$584 base address of the screen memory for text modes - .label M65_SCRGFXBASE = $585 // $585-$588 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes - // $589-$5FF -- UNUSED -- + .label M65_SCRTXTBASE = $580 // $580-$583 base address of the screen memory for text modes + .label M65_SCRGFXBASE = $584 // $584-$587 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes + .label M65_SCRMODE = $588 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) + .label M65_TXTWIN_X0 = $589 // text window - top-left X coordinate, starting from 0 + .label M65_TXTWIN_Y0 = $58A // text window - top-left Y coordinate, starting from 0 + .label M65_TXTWIN_X1 = $58B // text window - bottom-right X coordinate + 1 + .label M65_TXTWIN_Y1 = $58C // text window - bottom-right Y coordinate + 1 + // $58D-$5FF -- UNUSED -- .label M65_RS232_INBUF = $600 // $600-$6FF -- reserved for RS-232 input buffer -- .label M65_RS232_OUTBUF = $700 // $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/basic/basic_commands/cmd_rem.s b/src/basic/basic_commands/cmd_rem.s index 3247ab0f..ea139303 100644 --- a/src/basic/basic_commands/cmd_rem.s +++ b/src/basic/basic_commands/cmd_rem.s @@ -7,6 +7,8 @@ cmd_rem: + // XXX do we need these PHA's? + pha pha jmp execute_statements_end_of_line diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index c6680565..6e6a7dd5 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -23,6 +23,8 @@ .label VK1__M65_MODE65 = $4000 + 2 * 9 .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 .label VK1__M65_SCRMODESET = $4000 + 2 * 11 + .label VK1__M65_CLRSCR = $4000 + 2 * 12 + .label VK1__M65_CLRWIN = $4000 + 2 * 13 #else @@ -61,6 +63,8 @@ .word M65_MODE64 .word M65_MODE65 .word M65_SCRMODEGET - .word M65_SCRMODESET + .word M65_SCRMODESET + .word M65_CLRSCR + .word M65_CLRWIN #endif diff --git a/src/kernal/board_m65/mega65_redirect_api.s b/src/kernal/board_m65/mega65_redirect_api.s index ed681163..8c47f81c 100644 --- a/src/kernal/board_m65/mega65_redirect_api.s +++ b/src/kernal/board_m65/mega65_redirect_api.s @@ -9,22 +9,39 @@ M65_MODE64: jsr map_KERNAL_1 jsr_ind VK1__M65_MODE64 - jmp map_NORMAL + bra m65_api_end M65_MODE65: jsr map_KERNAL_1 jsr_ind VK1__M65_MODE65 - jmp map_NORMAL + bra m65_api_end M65_SCRMODEGET: jsr map_KERNAL_1 jsr_ind VK1__M65_SCRMODEGET - jmp map_NORMAL + bra m65_api_end M65_SCRMODESET: jsr map_KERNAL_1 jsr_ind VK1__M65_SCRMODESET + bra m65_api_end + +M65_CLRSCR: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_CLRSCR + bra m65_api_end + +M65_CLRWIN: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_CLRWIN + + // FALLTROUGH + +m65_api_end: + jmp map_NORMAL diff --git a/src/kernal/board_m65/mega65_redirect_screen.s b/src/kernal/board_m65/mega65_redirect_screen.s index f875e0f6..9ca9c889 100644 --- a/src/kernal/board_m65/mega65_redirect_screen.s +++ b/src/kernal/board_m65/mega65_redirect_screen.s @@ -12,4 +12,3 @@ m65_chrout_screen: jsr_ind VK1__m65_chrout_screen jsr map_NORMAL jmp chrout_done_success - diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index 8faae9c8..8f11f632 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -25,3 +25,9 @@ M65_JFAST: M65_JSELDEV: jsr SELDEV + +M65_JCLRSCR: + jsr M65_CLRSCR + +M65_JCLRWIN: + jsr M65_CLRWIN diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s deleted file mode 100644 index 97da032e..00000000 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ /dev/null @@ -1,9 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - - -M65_CLRSCR: - - // XXX impplement this - - rts diff --git a/src/kernal/screen_m65/mega65_clrscr_clrwin.s b/src/kernal/screen_m65/mega65_clrscr_clrwin.s new file mode 100644 index 00000000..a5876e2f --- /dev/null +++ b/src/kernal/screen_m65/mega65_clrscr_clrwin.s @@ -0,0 +1,83 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_CLRSCR: + + // Set the text window to whole screen area + + lda #$00 + sta M65_TXTWIN_X0 + sta M65_TXTWIN_Y0 + + ldx M65_SCRMODE + + lda m65_scrtab_txtwidth, X + sta M65_TXTWIN_X1 + lda m65_scrtab_txtheight, X + sta M65_TXTWIN_Y1 + + // FALLTROUGH + +M65_CLRWIN: + + // To clear the window, two zeropage long pointers will be used: + // - M65_LPNT_SCR for screen memory + // - M65_LPNT_KERN for colour memory (starts from $FF80000) + + // First initialize both pointers + + ldx #$03 +!: + lda M65_SCRTXTBASE,x + sta M65_LPNT_SCR,x + lda #$00 + sta M65_LPNT_KERN,x + dex + bpl !- + + lda #$0F + sta M65_LPNT_KERN+2 + lda #$F8 + sta M65_LPNT_KERN+1 + + // Go trough all the rows + + phz + ldy #$00 + + // FALLTROUGH + +m65_clrwin_loop: + + // Check if .Y cordinate is not below the window + + cpy M65_TXTWIN_Y0 + bcc m65_clrwin_loop_next // branch if we should skip this row + + // Clear the row + + ldz M65_TXTWIN_X0 +!: + lda #$20 + sta_lp (M65_LPNT_SCR),z + lda #$00 + sta_lp (M65_LPNT_KERN),z + inz + cpz M65_TXTWIN_X1 + bne !- + + // FALLTROUGH + +m65_clrwin_loop_next: + + iny + + // XXX + + plz + + + // XXX implement this + + rts diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 85ce9336..3a071a2b 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -2,10 +2,20 @@ // #LAYOUT# * * #IGNORE -// Table of parameters for VIC control register B - -m65_scrtab_vic_ctrlb: +m65_scrtab_vic_ctrlb: // parameters for VIC control register B .byte %00100000 // 40x25 + extended attributes .byte %10100000 // 80x25 + extended attributes .byte %10100100 // 80x50 + extended attributes + +m65_scrtab_txtwidth: // width of the text screen + + .byte 40 + .byte 80 + .byte 80 + +m65_scrtab_txtheight: // height of the text screen + + .byte 25 + .byte 25 + .byte 50