.z80\r
\r
\r
- global $coninit\r
- global $cists,$ci\r
- global $co\r
+; iobyte:\r
+; 0 = console on AVR-System\r
+; 1 = console on SIO/ASCI\r
\r
\r
- extrn ser.init,ser.ist,ser.in,ser.ost,ser.out\r
+ extrn iobyte\r
extrn ff.init,ff.i.st,ff.in\r
extrn ff.o.st,ff.out\r
+ if CPU_Z180\r
+ extrn as0init,as0ista,as0inp,as0osta,as0out\r
+ extrn as1init,as1ista,as1inp,as1osta,as1out\r
+ else\r
+ extrn ser.init,ser.ist,ser.in,ser.ost,ser.out\r
+ endif\r
\r
+ public charini\r
+ public ?const,?conin\r
+ public ?conos,?cono\r
\r
include config.inc\r
+ if CPU_Z180\r
include z180reg.inc\r
+ endif\r
\r
cseg\r
-;\r
-;\r
\r
-$coninit:\r
+ if CPU_Z180\r
+charini:\r
+ call ff.init\r
+ call as0init\r
+ jp as1init\r
+\r
+?const:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.i.st\r
+ dec a\r
+ jp z,as0ista\r
+ dec a\r
+ jp z,as1ista\r
+ jr nullstatus\r
+\r
+?conin:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.in\r
+ dec a\r
+ jp z,as0inp\r
+ dec a\r
+ jp z,as1inp\r
+ jr nullinput\r
+\r
+?conos:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.o.st\r
+ dec a\r
+ jp z,as0osta\r
+ dec a\r
+ jp z,as1osta\r
+ jr rettrue\r
+\r
+?cono:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.out\r
+ dec a\r
+ jp z,as0out\r
+ dec a\r
+ jp z,as1out\r
+ jr nulloutput\r
+\r
+ else\r
+\r
+charini:\r
call ff.init\r
+ ld c,0\r
call ser.init\r
+ ld c,1\r
+ jp ser.init\r
+\r
+?const:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.i.st\r
+ dec a\r
+ ld b,a\r
+ jp ser.ist\r
+\r
+?conin:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.in\r
+ dec a\r
+ ld b,a\r
+ jp ser.in\r
+\r
+?conos:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.o.st\r
+ dec a\r
+ ld b,a\r
+ jp ser.ost\r
+\r
+?cono:\r
+ ld a,(iobyte)\r
+ and 03h\r
+ jp z,ff.out\r
+ dec a\r
+ ld b,a\r
+ jp ser.out\r
+ endif\r
+\r
+\r
+nullinput:\r
+ ld a,1Ah\r
ret\r
- \r
-$cists:\r
- call ff.i.st\r
- ret nz\r
- call ser.ist\r
+\r
+nulloutput:\r
+ ld a,c\r
ret\r
- \r
-$ci:\r
- call ff.i.st\r
- jp nz,ff.in\r
- call ser.ist\r
- jp nz,ser.in\r
- jr $ci\r
- \r
-;$costs:\r
-; jp f.o.st\r
- \r
-$co:\r
- call ff.out\r
- jp ser.out\r
- \r
+\r
+rettrue:\r
+ or 0FFh\r
+ ret\r
+\r
+nullstatus:\r
+ xor a\r
+ ret\r
+\r
end\r
\r
--- /dev/null
+ page 255\r
+ .z80\r
+\r
+ extrn ddtz,bpent\r
+ extrn $stack\r
+ extrn charini,?const,?conin\r
+ extrn ?cono,?conos\r
+\r
+ extrn romend\r
+\r
+ global iobyte\r
+ global isv_sw\r
+\r
+ include config.inc\r
+\r
+\r
+\r
+\r
+;----------------------------------------------------------------------\r
+\r
+ cseg\r
+romstart equ $\r
+\r
+ org romstart+0\r
+ jp start\r
+\r
+iobyte: db 0\r
+\r
+; restart vectors\r
+\r
+rsti defl 1\r
+ rept 7\r
+\r
+ org 8*rsti + romstart\r
+ jp bpent\r
+rsti defl rsti+1\r
+ endm\r
+\r
+;----------------------------------------------------------------------\r
+ \r
+ org romstart+40h\r
+\r
+ dw 0\r
+ db 0\r
+\r
+ cseg\r
+\r
+ if ROMSYS\r
+$crom: defb c$rom ;\r
+ else\r
+ db 0 ;\r
+ endif\r
+\r
+\r
+hwini0:\r
+ db 0 ;count\r
+; db rcr,CREFSH ;configure DRAM refresh\r
+; db dcntl,INIWAITS ;wait states\r
+; db cbar,SYS$CBAR\r
+\r
+\r
+;----------------------------------------------------------------------\r
+\r
+ org romstart+50h\r
+\r
+start:\r
+ jp cstart\r
+ jp wstart\r
+ jp ?const\r
+ jp ?conin\r
+ jp ?cono\r
+ jp ?conos\r
+ jp charini\r
+\r
+cstart:\r
+ di\r
+\r
+ xor a\r
+ ld (@cbnk),a\r
+\r
+; search warm start mark\r
+\r
+ ld ix,mark_55AA ; top of common area\r
+ ld a,0aah ;\r
+ cp (ix+000h) ;\r
+ jr nz,kstart ;\r
+ cp (ix+002h) ;\r
+ jr nz,kstart ;\r
+ cpl ;\r
+ cp (ix+001h) ;\r
+ jr nz,kstart ;\r
+ cp (ix+003h) ;\r
+ jr nz,kstart ;\r
+ ld sp,$stack ; mark found, check\r
+; call checkcrc_alv ;\r
+ jp z,wstart ; check ok,\r
+\r
+;\r
+; ram not ok, initialize -- kstart --\r
+\r
+kstart:\r
+ ld sp,$stack ;01e1\r
+\r
+; Clear RAM \r
+\r
+; Init bank manager\r
+\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+ ld hl,055AAh ;set warm start mark\r
+ ld (mark_55AA),hl ;\r
+ ld (mark_55AA+2),hl;\r
+\r
+;\r
+; -- wstart --\r
+;\r
+wstart:\r
+ call sysram_init ;027f\r
+ call ivtab_init\r
+\r
+ call charini\r
+ call bufferinit\r
+\r
+ ld c,0\r
+ call selbnk\r
+\r
+\r
+ im 2 ;?030e\r
+ ei ;0282\r
+\r
+ call ?const ;0284\r
+ call ?const ;0287\r
+ or a ;028a\r
+ call nz,?conin ;028d\r
+\r
+;;; ld a,(banktab) ;\r
+;;; ld e,a ;\r
+ jp ddtz ;0290\r
+\r
+\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+;TODO: Make a ringbuffer module.\r
+\r
+ global buf.init\r
+\r
+buf.init:\r
+ ld (ix+o.in_idx),0\r
+ ld (ix+o.out_idx),0\r
+ ld (ix+o.mask),a\r
+ ret\r
+\r
+;----------------------------------------------------------------------\r
+\r
+\r
+ extrn msginit,msg.sout\r
+ extrn mtx.fifo,mrx.fifo\r
+ extrn co.fifo,ci.fifo\r
+\r
+\r
+bufferinit:\r
+ call msginit\r
+\r
+ ld hl,buffers\r
+ ld b,buftablen\r
+bfi_1:\r
+ ld a,(hl)\r
+ inc hl\r
+ ld (bufdat+0),a\r
+ ld e,(hl)\r
+ inc hl\r
+ ld d,(hl)\r
+ inc hl\r
+ ex de,hl\r
+\r
+ or a\r
+ jr nz,bfi_2\r
+\r
+ ld a,(@cbnk)\r
+ call bnk2phys\r
+\r
+ ld (40h+0),hl\r
+ ld (40h+2),a\r
+ out (AVRINT5),a\r
+ jr bfi_3\r
+bfi_2:\r
+\r
+ ld a,(@cbnk)\r
+ call bnk2phys\r
+\r
+ ld (bufdat+1),hl\r
+ ld (bufdat+3),a\r
+ ld hl,inimsg\r
+ call msg.sout\r
+bfi_3:\r
+ ex de,hl\r
+ djnz bfi_1\r
+ ret\r
+\r
+\r
+buffers:\r
+ db 0\r
+ dw mtx.fifo\r
+ db 1\r
+ dw mrx.fifo\r
+ db 2\r
+ dw co.fifo\r
+ db 3\r
+ dw ci.fifo\r
+buftablen equ ($ - buffers)/3\r
+\r
+inimsg:\r
+ db inimsg_e - $ -1\r
+ db 0AEh\r
+ db inimsg_e - $ -1\r
+ db 0\r
+bufdat:\r
+ db 0\r
+ dw 0\r
+ db 0\r
+inimsg_e:\r
+\r
+\r
+;\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+bnk2phys:\r
+ sla h\r
+ jr nc,b2p_1 ;A15=1 --> common\r
+ ld a,3\r
+b2p_1:\r
+ srl a\r
+ rr h\r
+ ret\r
+\r
+;\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+sysram_init:\r
+ ld hl,sysramw\r
+ ld de,topcodsys\r
+ ld bc,sysrame-sysramw\r
+ ldir\r
+\r
+ ret\r
+\r
+;----------------------------------------------------------------------\r
+\r
+ivtab_init:\r
+ ld hl,ivtab ;\r
+ ld a,h ;\r
+ ld i,a ;\r
+; out0 (il),l ;\r
+\r
+; Let all vectors point to spurious int routines.\r
+\r
+ ld d,high sp.int0\r
+ ld a,low sp.int0\r
+ ld b,9\r
+ivt_i1:\r
+ ld (hl),a\r
+ inc l\r
+ ld (hl),d\r
+ inc l\r
+ add a,sp.int.len\r
+ djnz ivt_i1\r
+ ret\r
+\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+ global io.ini\r
+ \r
+io.ini:\r
+ push bc\r
+\r
+ if CPU_Z180\r
+\r
+ ld b,0 ;high byte port adress\r
+ ld a,(hl) ;count\r
+ inc hl\r
+ or a\r
+ jr z,ioi_e\r
+ioi_1:\r
+ ld c,(hl) ;port address\r
+ inc hl\r
+ outi\r
+ inc b ;outi decrements b\r
+ dec a\r
+ jr nz,ioi_1\r
+\r
+ else\r
+ jr ioi_nxt\r
+ioi_l:\r
+ ld c,(hl) ;port address\r
+ inc hl\r
+ otir\r
+ioi_nxt:\r
+ ld b,(hl) ;count\r
+ inc hl\r
+ inc b\r
+ djnz ioi_l\r
+ endif\r
+ioi_e: \r
+ pop bc\r
+ ret\r
+\r
+ if CPU_Z180\r
+io.ini.m:\r
+ push bc\r
+ ld b,(hl)\r
+ inc hl\r
+ ld c,(hl)\r
+ inc hl\r
+ otimr\r
+ pop bc\r
+ ret\r
+ endif\r
+\r
+io.ini.l:\r
+;\r
+\r
+\r
+;----------------------------------------------------------------------\r
+;\r
+;return:\r
+; hl = hl + a\r
+; Flags undefined\r
+;\r
+\r
+add_hl_a:\r
+ add a,l\r
+ ld l,a\r
+ ret nc\r
+ inc h\r
+ ret\r
+\r
+; ---------------------------------------------------------\r
+\r
+sysramw:\r
+\r
+ .phase isvsw_loc\r
+topcodsys:\r
+\r
+; Trampoline for interrupt routines in banked ram.\r
+; Switch stack pointer to "system" stack in top ram\r
+\r
+; todo: z80 bank switch\r
+\r
+isv_sw: ;\r
+ ex (sp),hl ; save hl, return adr in hl\r
+ push de ;\r
+ push af ;\r
+ ex de,hl ;\r
+ ld hl,0 ;\r
+ add hl,sp ;\r
+ ld a,h ;\r
+ cp 0f8h ;\r
+ jr nc,isw_1 ;\r
+ ld sp,$stack ;\r
+isw_1:\r
+ push hl ;\r
+ ; save current bank\r
+; in0 h,(cbar) ;\r
+ push hl ;\r
+ ; switch to system bank\r
+; ld a,SYS$CBAR ;\r
+; out0 (cbar),a ; \r
+ ex de,hl ;\r
+ ld e,(hl) ;\r
+ inc hl ;\r
+ ld d,(hl) ;\r
+ ex de,hl ;\r
+ push bc ;\r
+ call jphl ;\r
+\r
+ pop bc ;\r
+ pop hl ; restore bank\r
+; out0 (cbar),h ;\r
+ pop hl ;\r
+ ld sp,hl ;\r
+ pop af ;\r
+ pop de ;\r
+ pop hl ;\r
+ ei ;\r
+ ret ;\r
+jphl:\r
+ jp (hl) ;\r
+\r
+; ---------------------------------------------------------\r
+\r
+sp.int0:\r
+ ld a,0d0h\r
+ jr sp.i.1\r
+sp.int.len equ $-sp.int0\r
+ ld a,0d1h\r
+ jr sp.i.1\r
+ ld a,0d2h\r
+ jr sp.i.1\r
+ ld a,0d3h\r
+ jr sp.i.1\r
+ ld a,0d4h\r
+ jr sp.i.1\r
+ ld a,0d5h\r
+ jr sp.i.1\r
+ ld a,0d6h\r
+ jr sp.i.1\r
+ ld a,0d7h\r
+ jr sp.i.1\r
+ ld a,0d8h\r
+sp.i.1:\r
+; out (80h),a\r
+ halt\r
+\r
+; ---------------------------------------------------------\r
+\r
+; Get IFF2\r
+; This routine may not be loaded in page zero\r
+;\r
+; return Carry clear, if INTs are enabled.\r
+;\r
+ global getiff\r
+getiff:\r
+ xor a ;clear accu and carry\r
+ push af ;stack bottom := 00xxh\r
+ pop af\r
+ ld a,i ;P flag := IFF2\r
+ ret pe ;exit carry clear, if enabled\r
+ dec sp\r
+ dec sp ;has stack bottom been overwritten?\r
+ pop af\r
+ and a ;if not 00xxh, INTs were\r
+ ret nz ;actually enabled\r
+ scf ;Otherwise, they really are disabled\r
+ ret\r
+\r
+;----------------------------------------------------------------------\r
+\r
+ global selbnk\r
+\r
+; a: bank (0..2)\r
+\r
+selbnk:\r
+ push bc\r
+ ld c,a\r
+ call getiff\r
+ push af\r
+\r
+ ld a,c\r
+ di\r
+ ld (@cbnk),a\r
+ ld a,5\r
+ out (SIOAC),a\r
+ ld a,(mm_sio0)\r
+ rla\r
+ srl c\r
+ rra\r
+ out (SIOAC),a\r
+ ld (mm_sio0),a\r
+\r
+ ld a,5\r
+ out (SIOBC),a\r
+ ld a,(mm_sio1)\r
+ rla\r
+ srl c\r
+ rra\r
+ out (SIOBC),a\r
+ ld (mm_sio1),a\r
+ pop af\r
+ pop bc\r
+ ret c ;INTs were disabled\r
+ ei\r
+ ret\r
+\r
+;----------------------------------------------------------------------\r
+\r
+; c: bank (0..2)\r
+\r
+ if 0\r
+\r
+selbnk:\r
+ ld a,(@cbnk)\r
+ xor c\r
+ and 3\r
+ ret z ;no change\r
+\r
+ call getiff\r
+ push af\r
+ ld a,c\r
+ di\r
+ ld (@cbnk),a\r
+ ld a,5\r
+ out (SIOAC),a\r
+ ld a,(mm_sio0)\r
+ rla\r
+ srl c\r
+ rra\r
+ out (SIOAC),a\r
+ ld (mm_sio0),a\r
+\r
+ ld a,5\r
+ out (SIOBC),a\r
+ ld a,(mm_sio1)\r
+ rla\r
+ srl c\r
+ rra\r
+ out (SIOBC),a\r
+ ld (mm_sio1),a\r
+ pop af\r
+ ret nc ;INTs were disabled\r
+ ei\r
+ ret\r
+\r
+ endif\r
+\r
+;----------------------------------------------------------------------\r
+\r
+ if 0\r
+ ex af,af'\r
+ push af\r
+ ex af,af'\r
+\r
+ rra\r
+ jr nc,stbk1\r
+ ex af,af'\r
+ ld a,5\r
+ out (SIOAC),a\r
+ ld a,(mm_sio0)\r
+ rla\r
+ srl c\r
+ rra\r
+ out (SIOAC),a\r
+ ld (mm_sio1),a\r
+ ex af,af'\r
+\r
+stbk1:\r
+ rra\r
+ jr nc,stbk2\r
+ ex af,af'\r
+ ld a,5\r
+ out (SIOBC),a\r
+ ld a,(mm_sio1)\r
+ rla\r
+ srl c\r
+ rra\r
+ out (SIOBC),a\r
+ ld (mm_sio1),a\r
+ ex af,af'\r
+\r
+stbk2:\r
+ endif\r
+\r
+ global @cbnk\r
+ global mm_sio0, mm_sio1\r
+\r
+@cbnk: db 0 ; current bank (0..2)\r
+mm_sio0:\r
+ ds 1\r
+mm_sio1:\r
+ ds 1\r
+\r
+;----------------------------------------------------------------------\r
+\r
+curph defl $\r
+ .dephase\r
+sysrame:\r
+ .phase curph\r
+tim_ms: db 0\r
+tim_s: dw 0\r
+ .dephase\r
+\r
+;-----------------------------------------------------\r
+\r
+ cseg\r
+\r
+ ;.phase 0ffc0h\r
+;ivtab equ 0ffc0h ; 0ffc0h ;int vector table\r
+ ;.dephase\r
+\r
+ ;.phase 0fffch\r
+mark_55AA equ 0fffch\r
+ ;ds 4 ; 0fffch\r
+ ;.dephase\r
+\r
+\r
+ end\r
+\r