1
0
mirror of https://github.com/stid/woz64.git synced 2024-05-28 22:41:29 +00:00
woz64/screen.asm

324 lines
8.3 KiB
NASM
Raw Normal View History

2019-11-06 04:31:17 +00:00
#importonce
#import "math.asm"
#import "mem_map.asm"
2019-11-18 03:28:54 +00:00
#import "memory.asm"
2019-11-06 04:31:17 +00:00
// -----------------------
// MACROS
// -----------------------
2019-11-16 22:09:22 +00:00
* = * "Screen Routines"
2019-11-10 03:10:52 +00:00
2019-11-06 04:31:17 +00:00
.macro print(stringAddr) {
lda #<stringAddr // Low byte
ldx #>stringAddr // High byte
jsr Screen.print
}
2019-11-10 03:10:52 +00:00
.macro cPrint() {
2019-11-18 03:28:54 +00:00
jsr Screen.printPetChar
2019-11-10 03:10:52 +00:00
}
2019-11-06 04:31:17 +00:00
.macro ClearScreen(screen, clearByte) {
2019-11-18 03:28:54 +00:00
lda #clearByte
ldx #0
2019-11-06 04:31:17 +00:00
!loop:
2019-11-18 03:28:54 +00:00
sta screen, x
sta screen + $100, x
sta screen + $200, x
sta screen + $300, x
2019-11-06 04:31:17 +00:00
inx
2019-11-18 03:28:54 +00:00
bne.r !loop-
2019-11-06 04:31:17 +00:00
}
.macro ClearColorRam(clearByte) {
2019-11-18 03:28:54 +00:00
lda #clearByte
ldx #0
2019-11-06 04:31:17 +00:00
!loop:
2019-11-18 03:28:54 +00:00
sta $D800, x
sta $D800 + $100, x
sta $D800 + $200, x
sta $D800 + $300, x
2019-11-06 04:31:17 +00:00
inx
2019-11-18 03:28:54 +00:00
bne.r !loop-
2019-11-06 04:31:17 +00:00
}
.macro SetBorderColor(color) {
2019-11-18 03:28:54 +00:00
lda #color
sta $d020
2019-11-06 04:31:17 +00:00
}
.macro SetBackgroundColor(color) {
2019-11-18 03:28:54 +00:00
lda #color
sta $d021
2019-11-06 04:31:17 +00:00
}
.macro SetMultiColor1(color) {
2019-11-18 03:28:54 +00:00
lda #color
sta $d022
2019-11-06 04:31:17 +00:00
}
.macro SetMultiColor2(color) {
2019-11-18 03:28:54 +00:00
lda #color
sta $d023
2019-11-06 04:31:17 +00:00
}
.macro SetMultiColorMode() {
lda $d016
ora #16
sta $d016
}
.macro SetScrollMode() {
2019-11-18 03:28:54 +00:00
lda $D016
eor #%00001000
sta $D016
2019-11-06 04:31:17 +00:00
}
.filenamespace Screen
// -----------------------
// CONSTANTS
// -----------------------
2019-11-18 03:28:54 +00:00
.const VIDEO_ADDR = $0400
.const COLUMN_NUM = 40
.const ROWS_NUM = 25
2019-11-21 06:18:23 +00:00
.const CR = $8e
.const BS = $95
2019-11-06 04:31:17 +00:00
// -----------------------
// CODE
// -----------------------
init: {
2019-11-18 03:28:54 +00:00
lda #$00
sta MemMap.SCREEN.CursorCol
sta MemMap.SCREEN.CursorRow
rts
}
scrollUp: {
pha
clone(VIDEO_ADDR+40, VIDEO_ADDR+(COLUMN_NUM*(ROWS_NUM)), VIDEO_ADDR)
lda #32
ldx #00
!:
sta VIDEO_ADDR+(COLUMN_NUM*(ROWS_NUM-1)), x
inx
cpx #40
bne !-
dec MemMap.SCREEN.CursorRow
pla
rts
}
printPetChar: {
pha
stx MemMap.SCREEN.PrintPetCharX
sty MemMap.SCREEN.PrintPetCharY
jsr Screen.petToScreen
jsr Screen.printChar
ldy MemMap.SCREEN.PrintPetCharY
ldx MemMap.SCREEN.PrintPetCharX
pla
rts
2019-11-06 04:31:17 +00:00
}
printChar: {
2019-11-18 03:28:54 +00:00
stx MemMap.SCREEN.tempX
2019-11-06 04:31:17 +00:00
// New Line
2019-11-21 06:18:23 +00:00
cmp #CR
2019-11-18 03:28:54 +00:00
bne.r !+
jsr screenNewLine
2019-11-06 04:31:17 +00:00
iny
2019-11-21 06:18:23 +00:00
jmp exit
!:
cmp #BS
bne.r !+
ldx MemMap.SCREEN.CursorCol
cmp #0
beq exit
dec MemMap.SCREEN.CursorCol
2019-11-06 04:31:17 +00:00
!:
// Store Base Video Address 16 bit
2019-11-18 03:28:54 +00:00
ldx #<VIDEO_ADDR // Low byte
stx MemMap.SCREEN.TempVideoPointer
ldx #>VIDEO_ADDR // High byte
stx MemMap.SCREEN.TempVideoPointer+1
2019-11-06 04:31:17 +00:00
// Temp Save Y
2019-11-18 03:28:54 +00:00
sty MemMap.SCREEN.tempY
2019-11-06 04:31:17 +00:00
// CursorRow * 40
2019-11-18 03:28:54 +00:00
ldy MemMap.SCREEN.CursorRow
sty MemMap.MATH.factor1
ldy #COLUMN_NUM
sty MemMap.MATH.factor2
jsr Math.multiply
2019-11-06 04:31:17 +00:00
// Add mul result to TempVideoPointer
clc
pha
2019-11-18 03:28:54 +00:00
lda MemMap.MATH.result
adc MemMap.SCREEN.TempVideoPointer+1
sta MemMap.SCREEN.TempVideoPointer+1
lda MemMap.MATH.result+1
adc MemMap.SCREEN.TempVideoPointer
sta MemMap.SCREEN.TempVideoPointer
ldy MemMap.SCREEN.CursorCol
cpy #COLUMN_NUM // Is this > col num?
bcc.r noEndOfLine
jsr screenNewLine // Yes? Add new list first
ldy #1
cpy MemMap.SCREEN.ScrollUpTriggered
bne noScrollTriggered
2019-11-21 06:18:23 +00:00
// Compensate Scroll
2019-11-18 03:28:54 +00:00
sec
lda MemMap.SCREEN.TempVideoPointer
sbc #1
sta MemMap.SCREEN.TempVideoPointer
bcs !+
dec MemMap.SCREEN.TempVideoPointer+1
2019-11-21 06:18:23 +00:00
!:
2019-11-18 03:28:54 +00:00
noScrollTriggered:
noEndOfLine:
2019-11-06 04:31:17 +00:00
pla
2019-11-21 06:18:23 +00:00
// This is a backspace
cmp #BS
bne !+
lda #' '
sta (MemMap.SCREEN.TempVideoPointer), y
jmp exit
!:
2019-11-18 03:28:54 +00:00
// insert into screen
sta (MemMap.SCREEN.TempVideoPointer), y
ldy MemMap.SCREEN.tempY
2019-11-06 04:31:17 +00:00
iny
2019-11-18 03:28:54 +00:00
inc MemMap.SCREEN.CursorCol
2019-11-06 04:31:17 +00:00
2019-11-18 03:28:54 +00:00
exit:
ldx MemMap.SCREEN.tempX
2019-11-06 04:31:17 +00:00
rts
}
//
// print
//
//
// preparatory ops: .a: low byte string address
// .x: high byte string address
//
// returned values: none
//
print: {
2019-11-18 03:28:54 +00:00
ldy #$00
sta MemMap.SCREEN.TempStringPointer
stx MemMap.SCREEN.TempStringPointer+1
2019-11-06 04:31:17 +00:00
printLoop:
2019-11-18 03:28:54 +00:00
lda (MemMap.SCREEN.TempStringPointer), y
cmp #0
beq exit
jsr Screen.printChar
jmp printLoop
2019-11-06 04:31:17 +00:00
exit:
rts
}
2019-11-21 06:18:23 +00:00
2019-11-06 04:31:17 +00:00
screenNewLine: {
2019-11-18 03:28:54 +00:00
pha
lda #0
sta MemMap.SCREEN.CursorCol
lda #ROWS_NUM-1
cmp MemMap.SCREEN.CursorRow // Are we at the screen bottom?
bne noScrollUp
jsr Screen.scrollUp
lda #1 // Yes - Scroll up
sta MemMap.SCREEN.ScrollUpTriggered
jmp done
noScrollUp:
lda #0
sta MemMap.SCREEN.ScrollUpTriggered
done:
inc MemMap.SCREEN.CursorRow
pla
2019-11-06 04:31:17 +00:00
rts
}
2019-11-16 22:09:22 +00:00
//
// petToScreen
//
//
// preparatory ops: .a: pet byte to convert
//
// returned values: .a: conv SCREEN char
//
petToScreen: {
// $00-$1F
2019-11-18 03:28:54 +00:00
cmp #$1f
bcs !+
sec
adc #128
jmp convDone
2019-11-16 22:09:22 +00:00
// $20-$3F
!:
2019-11-18 03:28:54 +00:00
cmp #$3f
bcs !+
jmp convDone
2019-11-16 22:09:22 +00:00
// $40-$5F
!:
2019-11-18 03:28:54 +00:00
cmp #$5f
bcs !+
sec
sbc #$40
jmp convDone
2019-11-16 22:09:22 +00:00
// $60-$7F
!:
2019-11-18 03:28:54 +00:00
cmp #$7F
bcs !+
sec
sbc #32
jmp convDone
2019-11-16 22:09:22 +00:00
// $80-$9F
!:
2019-11-18 03:28:54 +00:00
cmp #$9F
bcs !+
sec
adc #64
jmp convDone
2019-11-16 22:09:22 +00:00
// $A0-$BF
!:
2019-11-18 03:28:54 +00:00
cmp #$BF
bcs !+
sec
sbc #64
jmp convDone
2019-11-16 22:09:22 +00:00
// $C0-$DF
// $E0-$FE
!:
2019-11-18 03:28:54 +00:00
cmp #$FE
bcs !+
sec
sbc #128
jmp convDone
2019-11-16 22:09:22 +00:00
// $FF
!:
2019-11-18 03:28:54 +00:00
lda $5E
2019-11-16 22:09:22 +00:00
convDone:
2019-11-18 03:28:54 +00:00
rts
2019-11-16 22:09:22 +00:00
}