diff --git a/core/boot.asm b/core/boot.asm index 71d99ae..3825e0c 100644 --- a/core/boot.asm +++ b/core/boot.asm @@ -29,62 +29,15 @@ coldStart: { txs cld stx Vic.CR2 // Set Video Bits - jsr Boot.initIRQ // Prepare IRQ + jsr Cia.init + jsr Sid.init + jsr MC6502.init jsr Ram.init // Init memory. jsr Vic.init // Init video cli jmp warmStart } -// -------------------------------------------------------- -// initIRQ - -// Initialize Interrupt states after a cold start. -// Should never be executed as standard Init and should -// always be before it. This is extracted by c64 kernel -// routine IOINIT. -// -------------------------------------------------------- -initIRQ: { - lda #$7F // KILL INTERRUPTS - sta Cia.C1ICR - sta Cia.C2ICR - - sta Cia.C1PRA // TURN ON STOP KEY - - lda #%00001000 // SHUT OFF TIMERS - sta Cia.C1CRA - sta Cia.C2CRA - sta Cia.C1CRB - sta Cia.C2CRB - - // CONFIGURE PORTS - ldx #$00 // SET UP KEYBOARD INPUTS - stx Cia.C1DDRB // KEYBOARD INPUTS - stx Cia.C2DDRB // USER PORT (NO RS-232) - - stx Sid.FMVC // TURN OFF SID - - dex // set X = $FF - - stx Cia.C1DDRA // KEYBOARD OUTPUTS - - lda #%00000111 // SET SERIAL/VA14/15 (CLKHI) - sta Cia.C2PRA - - lda #%00111111 // ;SET SERIAL IN/OUT, VA14/15OUT - sta Cia.C2DDRA - - // SET UP THE 6510 LINES - lda #%00110111 // MOTOR OFF, HIRAM LOWRAM CHAREN HIGH - sta MC6502.ZR1 // set 1110 0111, motor off, enable I/O, enable KERNAL, Enable BASIC - - lda #%00101111 // set 0010 1111, 0 = input, 1 = output - sta MC6502.ZR0 // save the 6510 I/O port direction register - - rts -} - - - // -------------------------------------------------------- // warmStart - // Restore pressed or program restart after first Power ON diff --git a/core/pseudo.asm b/core/pseudo.asm index e7e35ef..1c120dd 100644 --- a/core/pseudo.asm +++ b/core/pseudo.asm @@ -3,6 +3,34 @@ #import "../core/module.asm" +// ======================================================== +// ////// PSEUDO MACROS /////////////////////////////////// +// ======================================================== + +.macro bitSet(bitMask, address) { + lda #bitMask + ora address + sta address +} + +.macro bitClear(bitMask, address) { + lda #~bitMask + and address + sta address +} + +.macro bitToggle(bitMask, address) { + lda #bitMask + eor address + sta address +} + +.macro bitTest(bitMask, address) { + lda #bitMask + bit address +} + + // ======================================================== // ////// PSEUDO COMMANDS ///////////////////////////////// // ======================================================== diff --git a/devices/video.asm b/devices/video.asm index cbc0cd4..c245d39 100644 --- a/devices/video.asm +++ b/devices/video.asm @@ -142,6 +142,8 @@ init: { lda #$00 sta MemMap.VIDEO.CursorCol sta MemMap.VIDEO.CursorRow + lda #%00000000 + sta MemMap.VIDEO.StatusBitsA rts } @@ -229,10 +231,15 @@ sendChar: { bcc noEndOfLine jsr screenNewLine // Yes? Add new line first - lda #1 - cmp MemMap.VIDEO.ScrollUpTriggered + bitTest(%00000001, MemMap.VIDEO.StatusBitsA) + //lda #%00000001 + //bit MemMap.VIDEO.StatusBitsA bne noScrollTriggered + // lda #1 + // cmp MemMap.VIDEO.ScrollUpTriggered + // bne noScrollTriggered + // Compensate Scroll sec lda MemMap.VIDEO.TempVideoPointer @@ -245,7 +252,6 @@ sendChar: { noScrollTriggered: noEndOfLine: pla - // This is a backspace cmp #BS bne !+ @@ -253,7 +259,6 @@ sendChar: { sta (MemMap.VIDEO.TempVideoPointer), y ply jmp exit - !: // insert into screen sta (MemMap.VIDEO.TempVideoPointer), y @@ -280,12 +285,27 @@ screenNewLine: { cmp MemMap.VIDEO.CursorRow // Are we at the screen bottom? bne noScrollUp jsr Video.scrollUp - lda #1 // Yes - Scroll up - sta MemMap.VIDEO.ScrollUpTriggered + + bitSet(%00000001, MemMap.VIDEO.StatusBitsA) + + + //lda #%00000001 + //ora MemMap.VIDEO.StatusBitsA + //sta MemMap.VIDEO.StatusBitsA + + // lda #1 // Yes - Scroll up + // sta MemMap.VIDEO.ScrollUpTriggered jmp done noScrollUp: - lda #0 - sta MemMap.VIDEO.ScrollUpTriggered + + bitClear(%00000001, MemMap.VIDEO.StatusBitsA) + + // lda #%11111110 + // and MemMap.VIDEO.StatusBitsA + // sta MemMap.VIDEO.StatusBitsA + + //lda #0 + //sta MemMap.VIDEO.ScrollUpTriggered done: inc MemMap.VIDEO.CursorRow pla diff --git a/hardware/cia.asm b/hardware/cia.asm index 0a794d5..f80cedc 100644 --- a/hardware/cia.asm +++ b/hardware/cia.asm @@ -1,5 +1,7 @@ #importonce +#import "../hardware/sid.asm" + .filenamespace Cia // https://www.c64-wiki.com/wiki/CIA @@ -207,3 +209,45 @@ // %11 = Timer counts underflow of timer A if the CNT-pin is high // Bit 7: 0 = Writing into the TOD register sets the clock time, 1 = Writing into the TOD register sets the alarm time. + + +// ======================================================== +// ////// METHODS ///////////////////////////////////////// +// ======================================================== + + +* = * "CIA HW" + +init: { + lda #$7F // KILL INTERRUPTS + sta Cia.C1ICR + sta Cia.C2ICR + + sta Cia.C1PRA // TURN ON STOP KEY + + lda #%00001000 // SHUT OFF TIMERS + sta Cia.C1CRA + sta Cia.C2CRA + sta Cia.C1CRB + sta Cia.C2CRB + + // CONFIGURE PORTS + ldx #$00 // SET UP KEYBOARD INPUTS + stx Cia.C1DDRB // KEYBOARD INPUTS + stx Cia.C2DDRB // USER PORT (NO RS-232) + + stx Sid.FMVC // TURN OFF SID + + dex // set X = $FF + + stx Cia.C1DDRA // KEYBOARD OUTPUTS + + lda #%00000111 // SET SERIAL/VA14/15 (CLKHI) + sta Cia.C2PRA + + lda #%00111111 // ;SET SERIAL IN/OUT, VA14/15OUT + sta Cia.C2DDRA + + rts +} + diff --git a/hardware/mc6502.asm b/hardware/mc6502.asm index 7cca51f..5cbafb3 100644 --- a/hardware/mc6502.asm +++ b/hardware/mc6502.asm @@ -22,4 +22,23 @@ https://sta.c64.org/cbm64mem.html // Bit #3: Datasette output signal level. // Bit #4: Datasette button status; 0 = One or more of PLAY, RECORD, F.FWD or REW pressed; 1 = No button is pressed. // Bit #5: Datasette motor control; 0 = On; 1 = Off. - // Default: $37, %00110111. \ No newline at end of file + // Default: $37, %00110111. + +// ======================================================== +// ////// METHODS ///////////////////////////////////////// +// ======================================================== + + +* = * "mc6502 HW" + +init: { + // SET UP THE 6510 LINES + lda #%00110111 // MOTOR OFF, HIRAM LOWRAM CHAREN HIGH + sta MC6502.ZR1 // set 1110 0111, motor off, enable I/O, enable KERNAL, Enable BASIC + + lda #%00101111 // set 0010 1111, 0 = input, 1 = output + sta MC6502.ZR0 // save the 6510 I/O port direction register + rts +} + + diff --git a/hardware/mem_map.asm b/hardware/mem_map.asm index 438c8e1..fbb9b6d 100644 --- a/hardware/mem_map.asm +++ b/hardware/mem_map.asm @@ -24,7 +24,9 @@ TempVideoPointer: .word 0 // Pointer to video mem used to target char pos CursorCol: .byte 0 // Actual cursor column position CursorRow: .byte 0 // Actual cursor row position - ScrollUpTriggered: .byte 0 // Set to 1 if a scroll up was triggered + StatusBitsA: .byte 0 // Status Bits + // Bit0: ScrollUpTriggred if ON + } .namespace MATH { diff --git a/hardware/sid.asm b/hardware/sid.asm index f9ad755..20bed07 100644 --- a/hardware/sid.asm +++ b/hardware/sid.asm @@ -22,4 +22,17 @@ https://www.c64-wiki.com/wiki/SID +// ======================================================== +// ////// METHODS ///////////////////////////////////////// +// ======================================================== + + +* = * "SID HW" + +init: { + ldx #$00 + stx Sid.FMVC // TURN OFF SID + rts +} + diff --git a/hardware/vic.asm b/hardware/vic.asm index d4b1857..0cb3519 100644 --- a/hardware/vic.asm +++ b/hardware/vic.asm @@ -9,7 +9,10 @@ .label VICREG = $D000 -.label CR2 = $D016 // Control register 2 +.label CR2 = $D016 // Control register 2 +.label INTE = $D01A // Interrupt enabled +.label RCNT = $D012 // Raster counter + * = * "VIC Functions" diff --git a/progs/woz_shell.asm b/progs/woz_shell.asm index 8ce2acf..e17072b 100644 --- a/progs/woz_shell.asm +++ b/progs/woz_shell.asm @@ -3,7 +3,9 @@ #import "../core/system.asm" #import "../libs/print.asm" #import "../core/module.asm" +#import "../hardware/vic.asm" #import "../devices/keyboard.asm" +#import "../hardware/mem_map.asm" .filenamespace WozShell @@ -35,9 +37,49 @@ start: { PrintLine(lineString) PrintLine(aboutString) PrintLine(lineString) + + //jsr WozShell.startCursor jmp WozShell.loop } +startCursor: { + sei + lda #$01 + sta Vic.INTE + + lda #cursortInt + + sta $314 // store in $314/$315 + stx $315 + + lda #$00 + sta Vic.RCNT + + lda $d011 + and #$7f + sta $d011 + + cli + + rts + + cursortInt: { + dec $d019 // ACK INT + + + + pla + tay + pla + tax + pla + rti + } +} + + + //------------------------------------------------------------------------------------ loop: { jsr Keyboard.waitForKey @@ -291,7 +333,6 @@ wozExec: { !: PrintChar() rts - } @@ -301,7 +342,7 @@ wozExec: { * = * "WozShell Data" module_type: .byte Module.TYPES.PROG -version: .byte 1, 2, 0 +version: .byte 1, 5, 0 .encoding "screencode_mixed" module_name: @@ -321,7 +362,7 @@ helpString: .byte $8e, 0 aboutString: - .text "woz64 mon - v 1.2.0" + .text "woz64 mon - v 1.5.0" .byte $8e, 0 lineString: .text "----------------------------------------"