]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - Z180/r3init.180
check in Z180 subtree
[z180-stamp.git] / Z180 / r3init.180
diff --git a/Z180/r3init.180 b/Z180/r3init.180
new file mode 100644 (file)
index 0000000..c99b624
--- /dev/null
@@ -0,0 +1,875 @@
+       page    255\r
+       .z80\r
+\r
+       extrn ddtz,bpent\r
+       extrn $stack\r
+       extrn $coninit,$cists,$ci\r
+\r
+       extrn romend\r
+\r
+\r
+       global  isv_sw\r
+\r
+       include config.inc\r
+       include z180reg.inc\r
+       include z180.lib\r
+       \r
+CR     equ     0dh\r
+\r
+\r
+\r
+;----------------------------------------------------------------------\r
+\r
+       cseg\r
+\r
+       jp start                \r
+\r
+; restart vectors\r
+\r
+rsti   defl    1\r
+       rept    7\r
+        db 0, 0, 0, 0, 0\r
+        jp bpent\r
+rsti    defl rsti+1\r
+       endm\r
+\r
+;----------------------------------------------------------------------\r
+\r
+       if ROMSYS\r
+$crom:  defb c$rom             ;\r
+       else\r
+        db     0               ;\r
+       endif\r
+\r
+dmclrt:                                ;clear ram per dma\r
+       db      dmct_e-dmclrt-2 ;\r
+       db      sar0l           ;first port\r
+       dw      nullbyte        ;src (fixed) \r
+nullbyte:\r
+       db      000h            ;src\r
+       dw      romend          ;dst (inc), start after "rom" code\r
+       db      00h             ;dst\r
+       dw      0-romend        ;count (64k)\r
+dmct_e:\r
+\r
+\r
+INIWAITS defl  CWAITIO\r
+       if      ROMSYS\r
+INIWAITS defl  INIWAITS+CWAITROM\r
+       endif\r
+\r
+hwini0:\r
+       db      3               ;count\r
+       db      rcr,CREFSH      ;configure DRAM refresh\r
+       db      dcntl,INIWAITS  ;wait states\r
+       db      cbar,SYS$CBAR\r
+\r
+;----------------------------------------------------------------------\r
+\r
+start:\r
+       push af                 ;003c\r
+       in0 a,(itc)             ;003d   Illegal opcode trap?\r
+       jp p,??st01             ;0040\r
+       pop af                  ;0043\r
+       jp bpent                ;0044     yes, handle\r
+\r
+??st01:\r
+       ld a,i                  ;0047   I register == 0 ? \r
+       jr z,??st02             ;004b     yes, harware reset\r
+       pop af                  ;004d   \r
+       jp bpent                ;004e     no, allready set up\r
+\r
+??st02:\r
+       di                      ;0058\r
+       ld      a,CREFSH\r
+       out0    (rcr),a         ;       configure DRAM refresh\r
+       ld      a,CWAITIO\r
+       out0    (dcntl),a       ;       wait states\r
+\r
+; search warm start mark\r
+\r
+       ld ix,mark_55AA         ;00b8   ; top of common area\r
+       ld a,SYS$CBAR           ;\r
+       out0 (cbar),a           ;\r
+       ld a,071h               ;00bc\r
+       ex af,af'               ;00be   ;for cbr = 0x70 downto 0x40\r
+swsm_l:\r
+       ex af,af'               ;00bf   \r
+       dec a                   ;00c0\r
+       cp 03fh                 ;00c1\r
+       jr z,kstart             ;00c3   ;  break (mark not found)\r
+       out0 (cbr),a            ;00c5\r
+       ex af,af'               ;00c8\r
+       ld a,0aah               ;00c9\r
+       cp (ix+000h)            ;00cb\r
+       jr nz,swsm_l            ;00ce\r
+       cp (ix+002h)            ;00d0\r
+       jr nz,swsm_l            ;00d3\r
+       cpl                     ;00d5\r
+       cp (ix+001h)            ;00d6\r
+       jr nz,swsm_l            ;00d9\r
+       cp (ix+003h)            ;00db\r
+       jr nz,swsm_l            ;00de\r
+       ld sp,$stack            ;00e0   mark found, check\r
+       call checkcrc_alv       ;00e3\r
+       jp z,wstart             ;00e6   check ok,\r
+\r
+;\r
+; ram not ok, initialize    --  kstart --\r
+\r
+kstart:\r
+\r
+       ld      a,088h          ;00e9   0000-7fff: common 0\r
+       out0    (cbar),a        ;00eb   8000-ffff: common 1\r
+       ld      ix,08000h       ;00f3\r
+       ld      a,0             ;00f1   start at 008000 (2. phys. 32k block)\r
+??f_0:\r
+       out0    (cbr),a         ;00f9\r
+\r
+       ld      (ix+0),a        ;0103   \r
+       cpl\r
+       ld      (ix+1),a        ;0103   \r
+       cpl\r
+       add     a,8             ;010a   next 'bank'\r
+       cp      078h            ;010c   stop at 078000\r
+       jr      nz,??f_0        ;010e\r
+\r
+       ld      de,8000h        ;0114   first block not tested, but mark as ok\r
+       ld      a,0             ;00f1   start at 008000 (2. phys. 32k block)\r
+??cp_0:\r
+       out0    (cbr),a         ;011c\r
+       ld      c,a\r
+       xor     (ix+0)\r
+       ld      b,a\r
+       ld      a,c\r
+       cpl\r
+       xor     (ix+1)\r
+       or      b\r
+       jr      nz,??cp_1\r
+       scf\r
+??cp_1:\r
+       rr      d\r
+       rr      e\r
+       ld      a,c\r
+       add     a,8\r
+       cp      078h            ;       stop at 078000\r
+       jr      nz,??cp_0\r
+       \r
+;\r
+;  ram test found 1 or more error free blocks (32k)\r
+;\r
+\r
+ramok:\r
+       ld      a,SYS$CBAR      ;01c8\r
+       out0    (cbar),a        ;01ca\r
+       ld      h,d\r
+       ld      l,e\r
+       ld      c,070h          ;01ce   highest block\r
+       ld      b,15            ;01d0\r
+??sr_1:\r
+       add     hl,hl\r
+       jr      c,alloc         ;01d4   highest "error free" block\r
+       ld      a,c             ;01d6\r
+       sub     008h            ;01d7\r
+       ld      c,a             ;01d9\r
+       djnz    ??sr_1          ;01da\r
+\r
+       slp                     ;01dc   should never be reached\r
+\r
+alloc:\r
+       out0    (cbr),c         ;01de\r
+       ld      sp,$stack       ;01e1\r
+       \r
+; Clear RAM using DMA0\r
+\r
+       ld      hl,dmclrt       ;load DMA registers\r
+       call    io.ini.m\r
+       ld      a,0cbh          ;01ef   dst +1, src fixed, burst\r
+       out0    (dmode),a       ;01f1\r
+\r
+       ld      b,512/64\r
+       ld      a,062h          ;01f4   enable dma0, \r
+??cl_1:\r
+       out0    (dstat),a       ;01f9   clear (up to) 64k\r
+       djnz    ??cl_1          ;       end of RAM?\r
+       \r
+; Init bank manager\r
+       \r
+       ld      hl,banktabsys   ;020f\r
+       ld      (hl),c          ;       Common area\r
+       inc     hl              ;0213\r
+       ld      (hl),c          ;       System work area\r
+       inc     hl              ;0215   Point to bank 0 entry\r
+       ld      b,BANKS         ;0216\r
+l0218h:\r
+       ld      (hl),0ffh       ;0218   Mark all banks as unassigned\r
+       inc     hl              ;021a\r
+       djnz    l0218h          ;021b\r
+\r
+       ld      hl,memalv       ;\r
+       ld      b,8             ;       8*4k ie. first 32k\r
+??a_0:\r
+       ld      (hl),0e0h       ;       mark as sys ("rom"/monitor)\r
+       inc     hl\r
+       djnz    ??a_0\r
+       \r
+       rr      d               ;       shift out bit for block 0\r
+       rr      e               ;\r
+       ld      c,15            ;022c   15*32k remaining blocks\r
+l022eh:\r
+       ld      a,0feh          ;       0xfe == block with error(s)\r
+       rr      d               ;\r
+       rr      e\r
+       adc     a,0             ;       ==> 0xff : block ok\r
+       ld      b,32/4          ;       32k == 8 * 4k   \r
+l0236h:\r
+       ld      (hl),a          ;\r
+       inc     hl              ;\r
+       djnz    l0236h          ;\r
+       dec     c               ;\r
+       jr      nz,l022eh       ;next 32k block\r
+       \r
+       ld      hl,memalv+0ch   ;memalv+0ch\r
+       ld      a,(banktabsys)  ;\r
+       call    add_hl_a\r
+       ld      b,3             ;\r
+l024ah:\r
+       ld      (hl),0ech       ;alloc system ram\r
+       inc     hl              ;\r
+       djnz    l024ah          ;\r
+       ld      (hl),0efh       ;alloc common\r
+       call    gencrc_alv\r
+\r
+       ld      hl,0000h        ;bank # \r
+       ld      bc,0f0fh        ;  size (?) (4k blocks)\r
+       xor     a               ;\r
+       call    sub_0420h       ;alloc mem for bank 0\r
+       ld      c,l             ;\r
+       or      a               ;\r
+       call    z,sub_04b5h     ;\r
+\r
+       ld      hl,0101h        ;\r
+       ld      bc,0f0fh        ;\r
+       xor     a               ;\r
+       call    sub_0420h       ;\r
+       ld      c,l             ;\r
+       or      a               ;\r
+       call    z,sub_04b5h     ;\r
+\r
+       ld      hl,055AAh       ;set warm start mark\r
+       ld      (mark_55AA),hl  ;\r
+       ld      (mark_55AA+2),hl;\r
+\r
+;\r
+; crc ok       --  wstart  --\r
+;\r
+wstart:\r
+       call    sysram_init     ;027f\r
+       call    ivtab_init\r
+\r
+       call    prt0_init\r
+\r
+\r
+       call    bufferinit\r
+\r
+\r
+       call    $coninit\r
+\r
+\r
+\r
+\r
+       im 2                    ;?030e\r
+       ei                      ;0282\r
+\r
+       call $cists             ;0284\r
+       call $cists             ;0287\r
+       or a                    ;028a\r
+       call nz,$ci             ;028d\r
+       \r
+       ld a,(banktab)          ;       \r
+       ld e,a                  ;       \r
+       jp ddtz                 ;0290\r
+       \r
+\r
+;\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+       extrn   msginit,msg.sout,msg_fifo\r
+       extrn   tx.buf,rx.buf\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
+bufferinit:\r
+       call     msginit\r
+       \r
+       ld      hl,buffers\r
+       ld      bc,0300h\r
+bfi_1:\r
+       ld      e,(hl)\r
+       inc     hl\r
+       ld      d,(hl)\r
+       inc     hl\r
+       push    hl\r
+       in0     a,cbr\r
+       call    log2phys\r
+       ld      (bufdat+1),hl\r
+       ld      (bufdat+3),a\r
+       ld      a,c\r
+       ld      (bufdat+0),a\r
+       ld      hl,inimsg\r
+       call    msg.sout\r
+       pop     hl\r
+       inc     c\r
+       djnz    bfi_1\r
+       ret\r
+\r
+       rept    20\r
+       db      0\r
+       endm\r
+       \r
+buffers:\r
+       dw      msg_fifo\r
+       dw      tx.buf\r
+       dw      rx.buf\r
+       \r
+inimsg:        \r
+       db      inimsg_e - $ -2\r
+       db      PMSG\r
+       db      81h\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
+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
+prt0_init:\r
+       ld      a,i\r
+       ld      h,a\r
+       in0     a,(il)\r
+       and     0E0h\r
+       or      IV$PRT0\r
+       ld      l,a\r
+       ld      (hl),low  iprt0\r
+       inc     hl\r
+       ld      (hl),high iprt0\r
+       ld      hl,prt0itab\r
+       call    io.ini.m\r
+       ret\r
+       \r
+prt0itab:\r
+       db      prt0it_e-prt0itab-2\r
+       db      tmdr0l\r
+       dw      PRT_TC10MS\r
+       dw      PRT_TC10MS\r
+       db      M_TIE0+M_TDE0   ;enable timer 0 interrupt and down count.\r
+prt0it_e:\r
+\r
+;\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+io.ini:\r
+       push    bc\r
+       ld      b,0             ;high byte port adress\r
+       ld      a,(hl)          ;count\r
+       inc     hl\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
+       pop     bc\r
+       ret\r
+\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
+       \r
+io.ini.l:\r
+;\r
+\r
+;----------------------------------------------------------------------\r
+;\r
+\r
+; compute crc\r
+; hl: start adr\r
+; bc: len\r
+; bc returns crc val\r
+\r
+do_crc16:\r
+       ld      de,0FFFFh\r
+crc1:\r
+       ld      a,(hl)\r
+       xor     e\r
+       ld      e,a\r
+       rrca\r
+       rrca\r
+       rrca\r
+       rrca\r
+       and     0Fh\r
+       xor     e\r
+       ld      e,a\r
+       rrca\r
+       rrca\r
+       rrca\r
+       push    af\r
+       and     1Fh\r
+       xor     d\r
+       ld      d,a\r
+       pop     af\r
+       push    af\r
+       rrca\r
+       and     0F0h\r
+       xor     d\r
+       ld      d,a\r
+       pop     af\r
+       and     0E0h\r
+       xor     e\r
+       ld      e,d\r
+       ld      d,a\r
+       cpi\r
+       jp      pe,crc1\r
+       or      e               ;z-flag\r
+       ret\r
+\r
+\r
+gencrc_alv:\r
+       push hl                 ;03f6\r
+       push de                 ;03f7\r
+       push bc\r
+       push af                 ;03f8\r
+       ld hl,banktabsys        ;03f9\r
+       ld bc,crc_len           ;03fc\r
+       call do_crc16           ;03ff\r
+       ld (hl),e\r
+       inc hl\r
+       ld (hl),d\r
+       pop af                  ;0406\r
+       pop bc\r
+       pop de                  ;0407\r
+       pop hl                  ;0408\r
+       ret                     ;0409\r
+\r
+checkcrc_alv:\r
+       push hl                 ;040a\r
+       push de\r
+       push bc                 ;040b\r
+       ld hl,banktabsys        ;040d\r
+       ld bc,crc_len+2         ;0410\r
+       call do_crc16           ;0413\r
+       pop bc                  ;041d\r
+       pop de\r
+       pop hl                  ;041e\r
+       ret                     ;041f\r
+\r
+;\r
+;  alloc\r
+;\r
+;      h:      max bank #\r
+;      l:      min bank #\r
+;      b:      max size\r
+;      c:      min size\r
+;\r
+;    ret:\r
+;      a:      0  == ok\r
+;              1  == \r
+;              2  == no bank # in requested range\r
+;              ff == crc error\r
+;\r
+\r
+sub_0420h:\r
+       call checkcrc_alv       ;0420\r
+       jr nz,l049ch            ;0424   crc error, tables corrupt\r
+       \r
+       call sub_049dh          ;0427   bank # in req. range available?\r
+       jr c,l0499h             ;042a\r
+       push ix                 ;042c\r
+       push iy                 ;042e\r
+       push de                 ;0430\r
+       push hl                 ;0431\r
+       push bc                 ;0432\r
+       ld c,b                  ;0433\r
+       ld b,alv_len+1          ;0434\r
+       ld d,0                  ;0436\r
+       ld hl,memalv-1          ;0438\r
+       jr l0441h               ;043b\r
+\r
+; find free blocks\r
+\r
+l043dh:\r
+       ld a,(hl)               ;043d\r
+       inc a                   ;043e   free blocks are marked 0ffh\r
+       jr z,l0446h             ;043f\r
+l0441h:\r
+       inc hl                  ;0441\r
+       djnz l043dh             ;0442\r
+       jr l0464h               ;0444\r
+l0446h:\r
+       push hl                 ;0446   \r
+       pop ix                  ;0447   free blocks start here\r
+       ld e,000h               ;0449\r
+       jr l0451h               ;044b\r
+l044dh:                                ;       count free blocks\r
+       ld a,(hl)               ;044d\r
+       inc a                   ;044e\r
+       jr nz,l0457h            ;044f\r
+l0451h:\r
+       inc e                   ;0451\r
+       inc hl                  ;0452\r
+       djnz l044dh             ;0453\r
+       jr l0464h               ;0455\r
+\r
+; end of free blocks run. \r
+\r
+l0457h:\r
+       ld a,d                  ;0457\r
+       cp e                    ;0458   nr of blocks >= requested ?\r
+       jr nc,l0441h            ;0459   \r
+\r
+       ld d,e                  ;045b\r
+       push ix                 ;045c\r
+       pop iy                  ;045e\r
+       ld a,d                  ;0460\r
+       cp c                    ;0461\r
+       jr c,l0441h             ;0462\r
+l0464h:\r
+       pop bc                  ;0464\r
+       ld a,d                  ;0465\r
+       cp b                    ;0466\r
+       jr c,l046ch             ;0467\r
+       ld d,b                  ;0469\r
+       jr l0471h               ;046a\r
+l046ch:\r
+       cp c                    ;046c\r
+       jr nc,l0471h            ;046d\r
+       ld d,000h               ;046f\r
+l0471h:\r
+       ld a,d                  ;0471\r
+       push iy                 ;0472\r
+       pop hl                  ;0474\r
+       ld de,memalv            ;0475\r
+       or a                    ;0478\r
+       sbc hl,de               ;0479\r
+       ld b,l                  ;047b\r
+       ld c,a                  ;047c\r
+       pop hl                  ;047d\r
+l047eh:\r
+       or a                    ;047e\r
+       jr z,l0489h             ;047f\r
+       ld (iy+0),l             ;0481\r
+       inc iy                  ;0484\r
+       dec a                   ;0486\r
+       jr l047eh               ;0487\r
+l0489h:\r
+       pop de                  ;0489\r
+       pop iy                  ;048a\r
+       pop ix                  ;048c\r
+       call gencrc_alv         ;048e\r
+       ld a,c                  ;0491\r
+       or a                    ;0492\r
+       ld a,000h               ;0493\r
+       ret nz                  ;0495\r
+       or 001h                 ;0496\r
+       ret                     ;0498\r
+\r
+l0499h:\r
+       ld a,2                  ;0499\r
+l049ch:\r
+       or a\r
+       ret                     ;049c\r
+\r
+\r
+; search a free bank number in range\r
+;      h: max #\r
+;      l: min #\r
+;    ret:\r
+;      l: bank number available\r
+;      nc, if found, bank nr. in l\r
+;      cy, if none found\r
+\r
+sub_049dh:\r
+       push de                 ;049d\r
+       push bc                 ;049e\r
+       ex de,hl                ;049f\r
+       dec e                   ;04a0\r
+l04a1h:\r
+       inc e                   ;04a1   test next #\r
+       ld a,d                  ;04a2\r
+       cp e                    ;04a3\r
+       jr c,l04b1h             ;04a4   \r
+       ld a,e                  ;04a6\r
+       ld hl,memalv            ;04a7\r
+       ld bc,alv_len           ;04aa\r
+       cpir                    ;04ad   bank# allready allocated?\r
+       jr z,l04a1h             ;04af   if yes, search for next\r
+l04b1h:\r
+       ex de,hl                ;04b1\r
+       pop bc                  ;04b2\r
+       pop de                  ;04b3\r
+       ret                     ;04b4\r
+\r
+\r
+sub_04b5h:\r
+       ld a,l                  ;04b5\r
+       cp 012h                 ;04b6\r
+       ccf                     ;04b8\r
+       ret c                   ;04b9\r
+       push hl                 ;04ba\r
+       ld hl,banktab           ;04bb\r
+       call add_hl_a\r
+       ld (hl),b               ;04c3\r
+       call gencrc_alv         ;04c4\r
+       pop hl                  ;04c7\r
+       or a                    ;04c8   clear carry\r
+       ret                     ;04c9\r
+\r
+\r
+;--------------------------------------------------------------\r
+;\r
+; de: Log. Address\r
+;  a: Bank number\r
+;\r
+;out ahl: Phys. (linear) Address\r
+\r
+\r
+bnk2phys:\r
+       push    hl\r
+       ld      hl,banktab\r
+       call    add_hl_a\r
+       ld      a,(hl)\r
+       pop     hl\r
+\r
+       ; fall thru\r
+;--------------------------------------------------------------\r
+;\r
+; de: Log. Address\r
+;  a: Bank (bbr)\r
+;\r
+; OP: ahl = (a<<12) + (d<<8) + e\r
+;\r
+;out ehl: Phys. (linear) Address\r
+\r
+\r
+log2phys:\r
+       push    bc              ;\r
+       ld      c,a             ;\r
+       ld      b,16            ;\r
+       mlt     bc              ;bc = a<<4\r
+       ld      l,d             ;\r
+       ld      h,0             ;\r
+       add     hl,bc           ;bc + d == a<<4 + d \r
+       ld      a,h             ;\r
+       ld      h,l             ;\r
+       ld      l,e             ;\r
+       pop     bc              ;\r
+       ret                     ;\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
+; Save cbar\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
+       in0 h,(cbar)            ;\r
+       push hl                 ;\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                  ;\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
+iprt0:\r
+       push    af\r
+       push    hl\r
+       in0     a,(tcr)\r
+       in0     a,(tmdr0l)\r
+       in0     a,(tmdr0h)\r
+       ld      a,(tim_ms)\r
+       inc     a\r
+       cp      100\r
+       jr      nz,iprt_1\r
+       xor     a\r
+       ld      hl,(tim_s)\r
+       inc     hl\r
+       ld      (tim_s),hl\r
+iprt_1:\r
+       ld      (tim_ms),a\r
+       pop     hl\r
+       pop     af\r
+       ei\r
+       ret\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
+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
+       dseg\r
+\r
+       ds      1\r
+banktabsys:\r
+       ds      1       ;0c001h\r
+       ds      1       ;0c002h\r
+banktab:\r
+       ds      BANKS   ;0c003h\r
+memalv:\r
+       ds      512/4           ;Number of 4k blocks\r
+alv_len        equ     $-memalv\r
+crc_len        equ     $-banktabsys\r
+\r
+crc_memalv:    \r
+       ds      2       ;\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