pio_pa_ctrl: equ 0xfc pio_pb_ctrl: equ 0xfd pio_pa_data: equ 0xfe pio_pb_data: equ 0xff pio_ctrl: equ pio_pa_ctrl pio_data: equ pio_pa_data prgstrtaddr: equ 0x2000 vectorarea: equ 0x3000 msb_vector: equ (vectorarea >> 8) none_lsb_vector: equ 0x20 pa_lsb_vector: equ 0x50 pb_lsb_vector: equ 0x60 org ( prgstrtaddr - 0x80 ) db 0x01 ; 16 znaku + 0x0d db "IM2 TEST " db 0x0d dw (prgend - prgstart) ; size dw prgstart ; start dw prgstart ; exec org prgstrtaddr prgstart: ; inicializace MZ800 di im 2 ld a,0x00 ; mz800 320x200@4A out (0xce),a ; dolni RAM out (0xe0),a ; inicializace CTC0 ;call ctc0_out1 ;call ctc0_out0 call pio_pa4_0 ; call pio_pa4_1 ; inicializace CTC2 call ctc2_out0 ; inicializujeme ruseni z 8255 call pio8255_init ; zkusime vynechat inicializaci PIO-Z80 if 1 ; PIO-Z80 - PA reset xor a out (pio_pa_data), a ld c,pio_pa_ctrl call pioz80_reset ; PIO-Z80 - PB reset xor a out (pio_pb_data), a ld c,pio_pb_ctrl call pioz80_reset endif ; horni cast interrupt vectoru ;ld a,0x30 ld a,msb_vector ld i,a ; PIO-Z80 vector ld a,0x50 out (pio_pa_ctrl),a ld a,0x60 out (pio_pb_ctrl),a ; povolime ruseni z PIO-Z80 ld a,0x83 ; zakazeme ruseni z PIO-Z80 ; ld a,0x03 out (pio_pa_ctrl),a out (pio_pb_ctrl),a ; pripravime si prostor s vectory vsude 0x0000 ld hl,vectorarea push hl pop de inc de xor a ld (hl),a ld bc,0x0100 ldir ; na 0x0000: jp bordint1 ld hl,bordint1 ld a,0xc3 ld ix,0x0000 ld (ix + 0), a ld (ix + 1), l ld (ix + 2), h ; pokud tuto cast vynechame, tak vsechny vectory vedou na adresu 0x0000 (modry border) if 1 ; kdyz nam nikdo neda vector, tak se cte z adresy 0x..20 (proc???) ; ; cerveny border ld hl,bordint2 ld ix,vectorarea + none_lsb_vector ld (ix + 0), l ld (ix + 1), h ; vector PIO-Z80 PA ; ; fialovy border ld hl,bordint3 ld ix,vectorarea + pa_lsb_vector ld (ix + 0), l ld (ix + 1), h ; vector PIO-Z80 PB ; ; zeleny border ld hl,bordint4 ld ix,vectorarea + pb_lsb_vector ld (ix + 0), l ld (ix + 1), h endif ; dame si cas na spusteni sigma analyzeru call wait ; spousteci trigger analyzeru ld a, 0x00 out (pio_pa_data), a out (pio_pb_data), a ei if 0 ; spustit INT z CTC0 (pres PIO-Z80 PA4 - pokud je povoleno) nop call pio_pa4_1 call pio_pa4_0 nop endif if 0 ; spustit INT z PIO-Z80 PA nop ld a,0xff out (pio_pa_data),a ; call pio_pa4_0 ; call pio_pa4_1 ; ld a,0x00 ; out (pio_pa_data),a ; ld a,0xff ; out (pio_pa_data),a ; call pio_pa4_0 ; call pio_pa4_1 nop endif if 0 ; spustit INT z PIO-Z80 PB nop ld a,0xff out (pio_pb_data),a nop endif if 1 ; spustit INT z CTC2 nop call ctc2_out1 call ctc2_out0 nop endif stop: di halt bordint1: ld a,0x01 ; modra jr setborder bordint2: ld a,0x02 ; cervena jr setborder bordint3: ld a,0x03 ; fialova jr setborder bordint4: ld a,0x04 ; zelena setborder: ld bc,0x06cf out (c),a di halt wait: ld bc,0x06cf ld de,0x0000 ld l,0x10 ; necelych 10 sekund xor a wait_loop: cpl out (c), a dec e jr nz,wait_loop dec d jr nz,wait_loop dec l jr nz,wait_loop ret ; ; Celou branu nastavime do MODE3-OUT a interrupt povolime na vsechny piny. ; Interrupt budeme spoustet pomoci data output registru. ; Klidovy stav: 0x00 ; Interrupt: cokoliv co neni 0x00 ; pioz80_reset: ; xor a ; pokud se cekalo na masku, tak dokoncujeme jeji zapis, jinak nastavujeme vector ; out (c),a ld a,0xcf ; mode3 + vsechny piny vystupni out (c),a ; ld a,0x3f ld a,0x00 out (c),a ld a,0xb7 ; povol ruseni, OR, HIGH, reset aktualnich preruseni + zapnuti sledovani vsech pinu out (c),a ; ld a,0x6f ld a,0x00 out (c),a ret ; ; v i8255 povolime volani interruptu z CTC2 ; pio8255_init: ld a,0x8a ; MODE0, PortA: out, PortC_up: in, PortB: in, PortC_down: out out (0xd3), a ld a, 0x05 out (0xd3), a ret ctc0_out0: ld a,0x30 ; CTC0, MODE0, LSB + MSB jr ctc_ctrl_wr ctc0_out1: ld a,0x32 ; CTC0, MODE1, LSB + MSB jr ctc_ctrl_wr ctc2_out0: ld a,0xb0 ; CTC2, MODE0, LSB + MSB jr ctc_ctrl_wr ctc2_out1: ld a,0xb2 ; CTC2, MODE1, LSB + MSB ctc_ctrl_wr: out (0xd7),a ret ; vystup z CTC0 do PIOZ80 PA4 je invertovany pio_pa4_0: equ ctc0_out1 pio_pa4_1: equ ctc0_out0 prgend: