; E04-S08: parse args.n8 and run Calc.twice, which pushes one byte argument, ; enters a sized frame in Calc.scale, and returns a byte. ; ; The first emitted body is Calc.twice at cg_code+0. The fixture supplies the ; frame runtime entry points, so the prologue emitted at the start of twice ; calls frame_enter(0), and scale reads its parameter at FP+2. twice returns ; self.scale(3); scale returns n + 3, so the expected result is 6. ; ; Mailbox data: +0 diagnostics, +1 em_bad, +2 result, +3 cg_len, +4 cg_err, ; +5 fl_err. FAIL stage: 1 load, 2 diagnostics, 3 emitter, 4 result. .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 src_load, src_dos_code, src_kernal_err .import names_init .import diag_init, diag_finish, diag_screen .import parse_file_framed .import em_on, em_bad .import cg_code, cg_len, cg_err .import fl_err, fl_enter, fl_leave, fl_discard, fl_push, fl_push_word .import frame_init, frame_enter, frame_leave, frame_discard .import frame_push_byte, frame_push_word .macro ON_ZERO target beq :+ jmp target : .endmacro .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_COMPILER sta MB_PRODUCER lda #MB_ST_RUNNING sta MB_STATUS jsr mmu_init jsr mmu_bank0 lda #frame_enter sta fl_enter+1 lda #frame_leave sta fl_leave+1 lda #frame_discard sta fl_discard+1 lda #frame_push_byte sta fl_push+1 lda #frame_push_word sta fl_push_word+1 lda #name_src ldy #name_src_len jsr src_load cmp #$00 ON_ZERO @fail_load jsr names_init lda #name_src ldy #name_src_len jsr diag_init lda #$00 sta diag_screen lda #$01 sta em_on jsr parse_file_framed jsr diag_finish sta MB_DATA+0 lda em_bad sta MB_DATA+1 lda cg_len sta MB_DATA+3 lda cg_err sta MB_DATA+4 lda fl_err sta MB_DATA+5 lda MB_DATA+0 ON_ZERO @fail_diag lda em_bad ON_ZERO @fail_emit lda cg_err ON_ZERO @fail_cg lda fl_err ON_ZERO @fail_cg jmp @run @fail_cg: lda #3 jmp @fail @run: jsr frame_init ldx #3 ; descriptor + zeroed byte field lda #$00 @obj: sta object,x dex bpl @obj lda #object jsr cg_code sta MB_DATA+2 cmp #$06 beq @pass lda #4 jmp @fail @fail_load: sta MB_DATA+4 lda src_dos_code sta MB_DATA+5 lda src_kernal_err sta MB_DATA+6 lda #1 jmp @fail @fail_diag: lda #2 jmp @fail @fail_emit: lda #3 @fail: sta MB_CODE lda #$00 sta MB_CODE+1 lda #MB_ST_FAIL sta MB_STATUS jmp @done @pass: lda #MB_ST_PASS sta MB_STATUS @done: jsr mmu_shutdown plp rts .segment "RODATA" name_src: .byte "ARGS.N8" name_src_len = * - name_src .segment "BSS" object: .res 4