; ; HL400 車載用音声ユニット ; ; ;DEBUG equ 1 ; TWORDS equ 1000h ZERO equ 8h ; ; nmienb macro exx ld de,8800h exx ld a,88h ld (8800h),a endm exit macro jp exit endm ; cseg ; ; RESET START ; org 0 ; ld hl,0 1$ dec hl ld a,h or l jp NZ,1$ ld iy,step0 ld ix,MASKI ld hl,PROG0 ld c,FNXT NMIENB loop or 55h halt jp loop ; recover ld iy,step0 ld ix,MASKI ld hl,PROG0 next: ld c,FNXT exit: pop af ld a,0aah jp loop ; ; NMI ; FNXT equ 2 FNXS equ 3 FPLY equ -2 FPLS equ -3 FPSE equ 80h CPAUSE equ 20 ; update pop de pop bc pop hl exx ld c,FPLS EXIT sp_end ld a,ZERO ld (8800h),a exx ld c,FNXS EXIT ; org 66h ; inc a jp NZ,recover dec c jp P,2$ exx bit 7,e jp NZ,sp_end ldi jp PO,update dec e 1$ exx 2$ jp (iy) ; ;** (0) PAUSE COUNT step0: ld iy,step1 inc c jp PO,adjst exx djnz 1$ ld b,CPAUSE ;BASETIME = 1.25ms x CPAUSE dec c jp NZ,1$ exx jp next 1$ exx EXIT adjst bit 0,c jp Z,normal res 0,c ;フラグを元に戻す(FPLS->FPLY,FNXS->FNXT) ld iy,step2 normal EXIT ;** (1) タイミング調整 step1: ld iy,step2 inc c EXIT ;** (2) ポート入力 step2: ld iy,step3 inc c in a,(0) cp d jp Z,equal ld d,a ld e,0 EXIT equal inc e jp NZ,exst2 dec e exst2 EXIT ;** (3) 入力ビット操作 step3: ld iy,step4 inc c ld a,d cpl and 1fh ld b,a bit 0,a jp Z,1$ res 1,b 1$ and 0ch cp 0ch jp NZ,exst3 ld a,2ch xor b ld b,a exst3 EXIT ;** (4) 入力立ち下がりチェック step4: ld iy,step5 inc c ld a,b and (ix+1) jp NZ,exit ld a,e cp (ix+2) jp C,exit ld ix,MASKN ld hl,PROG0 jp next ;** (5) 入力立ち上がりチェック step5: ld iy,step6 inc c ld a,b and (ix) ld b,a jp Z,1$ ld a,e cp NINT jp NC,1$ ld b,0 1$ EXIT ;** (6) プログラム実行 1 step6: ld iy,step7 inc c bit 0,b jp NZ,2$ bit 1,b jp Z,exit ld ix,MASK2 ld hl,PROG2 jp next 2$ ld ix,MASK1 ld hl,PROG1 jp next ;** (7) プログラム実行 2 step7: ld iy,step8 inc c bit 2,b jp NZ,2$ bit 3,b jp Z,exit ld ix,MASK4 ld hl,PROG4 jp next 2$ ld ix,MASK3 ld hl,PROG3 jp next ;** (8) プログラム実行 3 step8: ld iy,step9 inc c bit 4,b jp NZ,2$ bit 5,b jp Z,exit ld ix,MASK6 ld hl,PROG6 jp next 2$ ld ix,MASK5 ld hl,PROG5 jp next ;** (9) コマンド解釈 4 step9: ld iy,stepa inc c EXIT ;** (A) コマンド解釈 1 ;** (0:WRD) 単語再生(予めADRマクロによってSPが設定されていること) ;引き数 なし stepa: ld iy,stepb inc c jp M,1$ ld a,(hl) cp PWRD ;0 jp NZ,1$ inc hl exx pop de ;D=bank(b0-2) E=endflag(b7) pop bc ;B=count H C=count H pop hl ;HL=adress res 7,e ld a,ZERO ld (de),a exx ld c,FPLY 1$ EXIT ;** (B) コマンド解釈 2 ;** (1:PSE) ポーズ ** ;引き数 1 [Duration] stepb: ld iy,stepc inc c jp M,1$ ld a,(hl) cp PPSE ;1 jp NZ,1$ inc hl ld a,(hl) inc hl exx ld c,a ld b,CPAUSE exx ld c,FPSE 1$ EXIT ;** (C) コマンド解釈 3 ;** (2:ADR) 音声パラメータ設定 ** ;引き数 1 [WordNumber] stepc: ld iy,stepd inc c jp M,1$ ld a,(hl) cp PADR ;2 jp NZ,1$ inc hl ld a,(hl) inc hl exx sla a ld h,HIGH TWORDS ld l,a ld sp,hl pop hl ld sp,hl exx 1$ EXIT ;** (D) コマンド解釈 4 stepd: ;** (3:JMP) 絶対ジャンプ ** ;引き数 2 [ADR_H][ADR_L] ld iy,stepe inc c jp M,1$ ld a,(hl) cp PJMP ;3 jp NZ,1$ inc hl ld a,(hl) inc hl ld l,(hl) ld h,a 1$ EXIT ;** (E) コマンド解釈 5 ;** (4:CTL) 6585resetの制御 ** ;引き数 2 [ControlWord] stepe: ld iy,stepf inc c jp M,1$ ld a,(hl) cp PCTL ;4 jp NZ,1$ inc hl ld a,(hl) inc hl exx ld c,2 ld (8800h),a ld b,CPAUSE exx ld c,FPSE 1$ EXIT ;** (F) コマンド解釈 6 ;** (7:TRP) 入力条件トラップ ;引き数 0 stepf: ld iy,step0 inc c jp M,exit ld a,(hl) cp PTRP ;4 jp NZ,exit inc hl ld b,(hl) inc hl ld c,(hl) inc hl ld ix,0 add ix,bc jp next ; ; APPLICATION ; PWRD equ 0 PPSE equ 1 PADR equ 2 PJMP equ 3 PCTL equ 4 PTRP equ 7 PEND equ -1 ; ; ; MACRO (level1) ; init macro db PCTL,0,PCTL,8 endm fini macro db PCTL,88h endm word macro %1 db PADR,%1,PWRD endm pause macro %1 db PPSE,%1 endm mask macro %1 db PTRP,HIGH %1,LOW %1 endm jump macro %1 db PJMP,HIGH %1,LOW %1 endm ifa macro %1,%2,%3 db PIFA,%1,%2,HIGH %3,LOW %3 endm ifna macro %1,%2,%3 db PINA,%1,%2,HIGH %3,LOW %3 endm ; ; MACROs (LEVEL 2) ; wait macro jump $ endm ; ; MASKs ; NINT equ 50 NRES equ 254 MASKI: db 000001b,000011b,NRES MASKN: db 111110b,000001b,NRES MASK1: db 000000b,000001b,NRES MASK2: db 000001b,000010b,NRES MASK3: db 111010b,000100b,NRES MASK4: db 110110b,001000b,NRES MASK5: db 000000b,010000b,NINT MASK6: db 011110b,100000b,NRES ; ; APPLICATION PROGRAM ; PROG0: FINI JUMP PROG0 PROG1: INIT WORD 0 PAUSE 10 WORD 1 FINI MASK MASKN WAIT PROG2: INIT WORD 2 FINI WAIT PROG3: INIT WORD 3 PAUSE 10 WORD 4 FINI WAIT PROG4: init WORD 5 PAUSE 10 WORD 4 fini WAIT PROG5: init WORD 6 PAUSE 10 WORD 4 fini ; MASK MASK5E WAIT PROG6: init WORD 7 fini WAIT ; ;*** END *** ;