6 extrn charini,?const,?conin
23 ;----------------------------------------------------------------------
42 ;----------------------------------------------------------------------
60 INIWAITS defl INIWAITS+CWAITROM
63 ;----------------------------------------------------------------------
75 ;----------------------------------------------------------------------
80 db rcr,CREFSH ;configure DRAM refresh
81 db dcntl,INIWAITS ;wait states
88 dmclrt: ;clear ram per dma
91 dw nullbyte ;src (fixed)
94 dw romend ;dst (inc), start after "rom" code
96 dw 0-romend ;count (64k)
106 in0 a,(itc) ;Illegal opcode trap?
108 ld a,i ;I register == 0 ?
109 jr z,hw_reset ; yes, harware reset
115 pop af ;restore registers
121 out0 (rcr),a ; configure DRAM refresh
123 out0 (dcntl),a ; wait states
125 ld a,M_NCD ;No Clock Divide
127 ; ld a,M_X2CM ;X2 Clock Multiplier
135 ; check warm start mark
137 ld ix,mark_55AA ; top of common area
148 ld sp,$stack ; mark found, check
149 jp z,wstart ; check ok,
151 ; ram not ok, initialize -- kstart --
163 ; Clear RAM using DMA0
168 ld hl,dmclrt ;load DMA registers
170 ld a,0cbh ;01ef dst +1, src fixed, burst
174 ld a,062h ;01f4 enable dma0,
176 out0 (dstat),a ;01f9 clear (up to) 64k
177 djnz ??cl_1 ; end of RAM?
182 ld hl,055AAh ;set warm start mark
203 ld a,INIDONEVAL ;tell others (CP/M) that hardware and fifos
204 ld (INIDONE),a ; are allready initialized
228 ;----------------------------------------------------------------------
234 ld (ix+o.in_idx),0 ;reset pointers (empty fifo)
253 call hwl2phy ;get phys. address of fifo
255 ld a,(ix+o.id) ;fifo id
260 push bc ;c: bank-addr, b: ignored
263 push bc ;c: function, b:subf
280 ;----------------------------------------------------------------------
283 extrn msginit,msg.sout
284 extrn mtx.fifo,mrx.fifo
285 extrn ff.init,co.fifo,ci.fifo
338 ;----------------------------------------------------------------------
344 ld bc,sysrame-sysramw
349 ;----------------------------------------------------------------------
359 ; Let all vectors point to spurious int routines.
373 ;----------------------------------------------------------------------
375 ; Reload value for 10 ms Int. (0.1KHz):
376 ; tc10ms = phi/prescale/0.1KHz = phi / (prescale/10)
378 PRT_TC10MS equ 18432 / (PRT_PRE/10)
397 db prt0it_e-prt0itab-2
401 db M_TIE0+M_TDE0 ;enable timer 0 interrupt and down count.
408 ;----------------------------------------------------------------------
415 ld b,0 ;high byte port adress
422 ld c,(hl) ;port address
426 inc b ;outi decrements b
439 ld c,(hl) ;port address
443 dec c ;otim increments c
449 inc b ;stop if count == 0
462 ld c,(hl) ;port address
474 ;----------------------------------------------------------------------
503 ;----------------------------------------------------------------------
507 ;--------------------------------------------------------------------
508 ; Return the BBR value for the given bank number
515 ret z ; Bank 0 is at physical address 0
526 ;--------------------------------------------------------------
531 ;out ahl: Phys. (linear) Address
538 ;--------------------------------------------------------------
545 ; hl hhhhhhhhllllllll
548 ; OP: ahl = (a<<12) + (h<<8) + l
550 ;out ahl: Phys. (linear) Address
566 ;--------------------------------------------------------------
571 ; OP: ahl = (bankbase<<12) + (d<<8) + e
573 ;out ahl: Phys. (linear) Address
581 or 00fh ; log. addr in common1?
585 in0 a,(cbr) ; yes, cbr is address base
588 ld b,16 ; log. address in baked area?
593 in0 a,(bbr) ; yes, bbr is address base
600 pop bc ; bank part is 0, no translation
607 ;----------------------------------------------------------------------
612 jr nc,b2p_1 ;A15=1 --> common
621 ;--------------------------------------------------------------
635 ; ---------------------------------------------------------
642 ; Trampoline for interrupt routines in banked ram.
643 ; Switch stack pointer to "system" stack in top ram
647 ex (sp),hl ;save hl, 'return adr' in hl
650 ex de,hl ;'return address' in de
655 jr nc,isw_1 ;stack allready in top ram
658 push hl ;save user stack pointer
684 ; ---------------------------------------------------------
711 ; ---------------------------------------------------------
716 sp.int.len equ $-sp.int0
736 ; ---------------------------------------------------------
741 ; This routine may not be loaded in page zero
743 ; return Carry clear, if INTs are enabled.
747 xor a ;clear accu and carry
748 push af ;stack bottom := 00xxh
750 ld a,i ;P flag := IFF2
751 ret pe ;exit carry clear, if enabled
753 dec sp ;has stack bottom been overwritten?
755 and a ;if not 00xxh, INTs were
756 ret nz ;actually enabled
757 scf ;Otherwise, they really are disabled
760 ;----------------------------------------------------------------------
794 ret c ;INTs were disabled
798 ;----------------------------------------------------------------------
833 ret nc ;INTs were disabled
839 ;----------------------------------------------------------------------
877 global mm_sio0, mm_sio1
879 @cbnk: db 0 ; current bank (0..2)
888 ;----------------------------------------------------------------------
898 ;-----------------------------------------------------
904 ;ivtab equ 0ffc0h ; 0ffc0h ;int vector table
908 mark_55AA equ 0 - 2 - 4 ;2 byte for trap stack