|
- ; E04-S05: print and fault runtime test in x128.
- ;
- ; Runs in the D129 generated-program mapping (CR=$0E), where the KERNAL and
- ; I/O are visible and $B800-$BFFF is RAM; all code and BSS stay below $4000.
- ; The screen is cleared first, then:
- ;
- ; NOVA128 PRINT TEST
- ; TEXT OK
- ; BYTE 0 7 255
- ; WORD 0 12345 65535
- ; INT -1 -32768 32767
- ; BOOL FALSE TRUE
- ; CHAR A
- ; RUNTIME FAULT R001 .. R005
- ;
- ; The faults run last, so the mailbox ends in MB_ST_FAIL with code 5 and
- ; address $1234. The host checks the screen rows and the mailbox fields.
-
- .setcpu "6502"
- .include "../../src/common/c128.inc"
- .include "../../src/common/mailbox.inc"
- .include "../../src/common/print.inc"
- .include "../../src/common/faults.inc"
-
- .import pr_char, pr_cr, pr_text, pr_byte, pr_word, pr_int, pr_bool
- .import flt_report
-
- .segment "LOADADDR"
- .word $1C01
-
- .segment "EXEHDR"
- .word basic_end
- .word 10
- .byte $9E
- .byte "7181"
- .byte $00
- basic_end:
- .word $0000
-
- .segment "MAILBOX"
- .res MB_SIZE
-
- .macro TEXT text, len
- lda #<text
- ldx #>text
- ldy #len
- jsr pr_text
- .endmacro
-
- .macro SPACE
- lda #PR_SPACE
- jsr pr_char
- .endmacro
-
- .segment "STARTUP"
- .export test_entry, test_end
- test_entry:
- php
- sei
- ldx #MB_SIZE - 1
- lda #$00
- @clr: sta MB_BASE,x
- dex
- bpl @clr
- lda #MB_MAGIC0_VALUE
- sta MB_MAGIC0
- lda #MB_MAGIC1_VALUE
- sta MB_MAGIC1
- lda #MB_PROD_PROGRAM
- sta MB_PRODUCER
- lda #MB_ST_RUNNING
- sta MB_STATUS
-
- lda MMU_CR
- sta saved_cr
- lda MMU_RCR
- sta saved_rcr
- lda #CR_RAM0_KERNAL
- sta MMU_CR
-
- lda #PR_CLEAR
- jsr pr_char
-
- ; ------------------------------------------------------- print tests
- TEXT title, 18
- jsr pr_cr
- TEXT text_ok, 7
- jsr pr_cr
-
- TEXT label_byte, 5
- lda #0
- jsr pr_byte
- SPACE
- lda #7
- jsr pr_byte
- SPACE
- lda #255
- jsr pr_byte
- jsr pr_cr
-
- TEXT label_word, 5
- lda #0
- ldx #0
- jsr pr_word
- SPACE
- lda #<12345
- ldx #>12345
- jsr pr_word
- SPACE
- lda #$FF
- ldx #$FF
- jsr pr_word
- jsr pr_cr
-
- TEXT label_int, 4
- lda #$FF ; -1
- ldx #$FF
- jsr pr_int
- SPACE
- lda #$00 ; -32768
- ldx #$80
- jsr pr_int
- SPACE
- lda #$FF ; 32767
- ldx #$7F
- jsr pr_int
- jsr pr_cr
-
- TEXT label_bool, 5
- lda #$00
- jsr pr_bool
- SPACE
- lda #$01
- jsr pr_bool
- jsr pr_cr
-
- TEXT label_char, 5
- lda #$41 ; 'A'
- jsr pr_char
- jsr pr_cr
-
- ; ------------------------------------------------------- fault tests
- lda #FLT_NULL
- ldx #$11
- ldy #$22
- jsr flt_report
- lda #FLT_BOUNDS
- ldx #$22
- ldy #$33
- jsr flt_report
- lda #FLT_DIV0
- ldx #$33
- ldy #$44
- jsr flt_report
- lda #FLT_STACK
- ldx #$44
- ldy #$55
- jsr flt_report
- lda #FLT_HEAP
- ldx #$34
- ldy #$12
- jsr flt_report
-
- ; The print and fault calls must not disturb the generated-program map.
- lda #$00
- sta MB_DATA
- lda MMU_CR
- cmp #CR_RAM0_KERNAL
- bne @map_done
- lda MMU_RCR
- cmp saved_rcr
- bne @map_done
- lda #$01
- sta MB_DATA
- @map_done:
- lda saved_cr
- sta MMU_CR
- plp
- rts
-
- .segment "RODATA"
- title: .byte "NOVA128 PRINT TEST"
- text_ok: .byte "TEXT OK"
- label_byte: .byte "BYTE "
- label_word: .byte "WORD "
- label_int: .byte "INT "
- label_bool: .byte "BOOL "
- label_char: .byte "CHAR "
-
- .segment "BSS"
- saved_cr: .res 1
- saved_rcr: .res 1
- test_end:
|