; E04-S01: PRG/MAP writer test in x128. ; ; The fixture runs in the compiler mapping and writes GENERATE.PRG/MAP with ; the fixed startup, a PAD section at $1C80, then checks: ; +0 out_finish result (0) ; +1 collision result (OUT_ERR_EXISTS) ; +2 section-order result (OUT_ERR_ORDER) ; +3 abort result (0) ; COLLIDE.PRG/MAP already exist on the test disk; the host verifies they are ; unchanged. ABORT and ORDER must leave no output behind. .setcpu "6502" .include "../../src/common/c128.inc" .include "../../src/common/mailbox.inc" .include "../../src/common/formats.inc" .import mmu_init, mmu_bank0, mmu_shutdown .import out_begin, out_startup, out_section, out_end_section .import out_byte, out_bytes, out_finish, out_abort .import out_load, out_entry, out_start, out_err .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 .segment "STARTUP" .export test_entry 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_PLATFORM sta MB_PRODUCER lda #MB_ST_RUNNING sta MB_STATUS lda #$00 sta fail_mask sta MB_DATA+0 sta MB_DATA+1 sta MB_DATA+2 sta MB_DATA+3 jsr mmu_init jsr mmu_bank0 lda #PRG_LOAD_ADDR sta out_load+1 lda #PRG_ENTRY_ADDR sta out_entry+1 ; ------------------------------------------------ successful output lda #name_generate ldy #name_generate_len jsr out_begin bcs @gen_fail jsr out_startup bcs @gen_fail lda #$80 sta out_start lda #$1C sta out_start+1 lda #name_pad ldy #3 jsr out_section bcs @gen_fail lda #pad_bytes ldy #4 jsr out_bytes bcs @gen_fail jsr out_end_section jsr out_finish bcs @gen_fail lda out_err sta MB_DATA+0 cmp #OUT_OK beq @gen_done lda #$01 jsr fail jmp @gen_done @gen_fail: lda out_err sta MB_DATA+0 lda #$01 jsr fail jsr out_abort @gen_done: ; ---------------------------------------------------- collision lda #name_collide ldy #name_collide_len jsr out_begin bcc @coll_unexpected lda out_err sta MB_DATA+1 cmp #OUT_ERR_EXISTS beq @coll_ok lda #$02 jsr fail jmp @coll_abort @coll_unexpected: lda #$02 jsr fail jmp @coll_abort @coll_ok: @coll_abort: jsr out_abort @coll_done: ; ------------------------------------------------ section order lda #name_order ldy #name_order_len jsr out_begin bcs @order_begin_fail lda #$00 sta out_start lda #$1C sta out_start+1 lda #name_bad ldy #3 jsr out_section bcc @order_unexpected lda out_err sta MB_DATA+2 cmp #OUT_ERR_ORDER beq @order_abort lda #$04 jsr fail jmp @order_abort @order_begin_fail: lda out_err sta MB_DATA+2 lda #$04 jsr fail jmp @order_done @order_unexpected: lda #$04 jsr fail jmp @order_abort @order_abort: jsr out_abort @order_done: ; -------------------------------------------------------- abort lda #name_abort ldy #name_abort_len jsr out_begin bcs @abort_fail lda #$01 sta out_start lda #$1C sta out_start+1 lda #name_x ldy #1 jsr out_section bcs @abort_fail lda #$AA jsr out_byte bcs @abort_fail jsr out_abort bcs @abort_fail lda out_err sta MB_DATA+3 cmp #OUT_OK beq @abort_done @abort_fail: lda out_err sta MB_DATA+3 lda #$08 jsr fail jsr out_abort @abort_done: jsr mmu_shutdown lda fail_mask sta MB_CODE lda #$00 sta MB_CODE+1 lda #MB_ST_FAIL ldx fail_mask bne @status lda #MB_ST_PASS @status: sta MB_STATUS ldy #$00 @print: lda message,y beq @end sty print_y jsr CHROUT ldy print_y iny bne @print @end: rts .segment "CODE" fail: ora fail_mask sta fail_mask rts .segment "RODATA" name_generate: .byte "GENERATE.N8" name_generate_len = * - name_generate name_collide: .byte "COLLIDE.N8" name_collide_len = * - name_collide name_order: .byte "ORDER.N8" name_order_len = * - name_order name_abort: .byte "ABORT.N8" name_abort_len = * - name_abort name_pad: .byte "PAD" name_bad: .byte "BAD" name_x: .byte "X" pad_bytes: .byte $DE, $AD, $BE, $EF message: .byte "NOVA128 OUTPUT TEST DONE", $0D, $00 .segment "BSS" fail_mask: .res 1 print_y: .res 1