woz64/libs/print.asm

191 lines
6.3 KiB
NASM

#importonce
#import "math.asm"
#import "../core/screen.asm"
#import "../libs/module.asm"
* = * "Print Lib"
// ------------------------------------
// MACROS
// ------------------------------------
.macro PrintLine(stringAddr) {
lda #<stringAddr // Low byte
ldx #>stringAddr // High byte
jsr Print.printLine
}
.macro PrintChar() {
jsr Print.printPetChar
}
.macro PrintNewLine() {
jsr Screen.screenNewLine
}
.filenamespace Print
// ------------------------------------
// METHODS
// ------------------------------------
//------------------------------------------------------------------------------------
init: {
rts
}
//------------------------------------------------------------------------------------
toDebug: {
ModuleDefaultToDebug(module_name, version)
rts
}
//------------------------------------------------------------------------------------
printPetChar: {
pha
stx MemMap.SCREEN.PrintPetCharX
sty MemMap.SCREEN.PrintPetCharY
jsr Print.petCharToScreenChar
jsr Screen.sendChar
ldy MemMap.SCREEN.PrintPetCharY
ldx MemMap.SCREEN.PrintPetCharX
pla
rts
}
//
// printLine
//
//
// preparatory ops: .a: low byte string address
// .x: high byte string address
//
// returned values: none
//
printLine: {
ldy #$00
sta MemMap.SCREEN.TempStringPointer
stx MemMap.SCREEN.TempStringPointer+1
printLoop:
lda (MemMap.SCREEN.TempStringPointer), y
cmp #0
beq exit
jsr Screen.sendChar
jmp printLoop
exit:
rts
}
//
// btohex
//
//
// preparatory ops: .a: byte to convert
//
// returned values: .a: msn ascii char
// .x: lsn ascii char
// .y: entry value
//
byteToHex: {
pha //save byte
and #%00001111 //extract lsn
tax //save it
pla //recover byte
lsr //extract...
lsr //msn
lsr
lsr
pha //save msn
txa //lsn
jsr binhex1 //generate ascii lsn
tax //save
pla //get msn & fall thru
//
// convert nybble to hex ascii equivalent...
binhex1: cmp #$0a
bcc binhex2 //in decimal range
sbc #$09 //hex compensate
rts
binhex2: eor #%00110000 //finalize nybble
rts //done
}
//
// petToScreen
//
//
// preparatory ops: .a: pet byte to convert
//
// returned values: .a: conv SCREEN char
//
petCharToScreenChar: {
// $00-$1F
cmp #$1f
bcs !+
sec
adc #128
jmp convDone
// $20-$3F
!:
cmp #$3f
bcs !+
jmp convDone
// $40-$5F
!:
cmp #$5f
bcs !+
sec
sbc #$40
jmp convDone
// $60-$7F
!:
cmp #$7F
bcs !+
sec
sbc #32
jmp convDone
// $80-$9F
!:
cmp #$9F
bcs !+
sec
adc #64
jmp convDone
// $A0-$BF
!:
cmp #$BF
bcs !+
sec
sbc #64
jmp convDone
// $C0-$DF
// $E0-$FE
!:
cmp #$FE
bcs !+
sec
sbc #128
jmp convDone
// $FF
!:
lda $5E
convDone:
rts
}
// ------------------------------------
// DATA
// ------------------------------------
* = * "Print Lib Data"
version: .byte 1, 0, 0
.encoding "screencode_mixed"
module_name:
.text "lib:print"
.byte 0
#import "../core/mem_map.asm"