|
- ; 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
- lda #>frame_enter
- sta fl_enter+1
- lda #<frame_leave
- sta fl_leave
- lda #>frame_leave
- sta fl_leave+1
- lda #<frame_discard
- sta fl_discard
- lda #>frame_discard
- sta fl_discard+1
- lda #<frame_push_byte
- sta fl_push
- lda #>frame_push_byte
- sta fl_push+1
- lda #<frame_push_word
- sta fl_push_word
- lda #>frame_push_word
- sta fl_push_word+1
-
- lda #<name_src
- ldx #>name_src
- ldy #name_src_len
- jsr src_load
- cmp #$00
- ON_ZERO @fail_load
-
- jsr names_init
- lda #<name_src
- ldx #>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
- ldx #>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
|