X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/d12d8b38ea365a5878a5c9d74bf76de0a87dce33..3ba537752998f2d8554cecee5d586fd1a70256b6:/cbios/misc.180 diff --git a/cbios/misc.180 b/cbios/misc.180 index 5d68374..d39f632 100644 --- a/cbios/misc.180 +++ b/cbios/misc.180 @@ -1,174 +1,17 @@ - global add_hla,div32_16 - global ioiniml,ioini1l - global intinit - global bufinit - global cpu_frq + public intinit + public bufinit + public cpu_frq + public get_tmr - global fifolst + public fifolst - extrn ?pmsg + extrn div32_r,?pmsg extrn msg.sm,msg.recv,hwl2phy include config.inc include z180reg.inc -;-------------------------------------------------------------- -; -; add a to hl -; -; return: -; hl = hl + a -; Flags undefined - - cseg ; (common. TODO: check for banked) - -add_hla: - add a,l - ld l,a - ret nc - inc h - ret - -;-------------------------------------------------------------------- -; Divide 32 bit by 16 -; -; HLDE: Divident (x) -; BC: Divisor (y) -; -; return: -; HLDE: Quotient -; BC: Reminder - - cseg ; common area -div32_16: - exx ;low - push de ;save alternate registers (de,bc) - push bc - exx ;high - push de ;low x - push bc ;low y - ld bc,0 ;bc = high y = 0 - ld d,b ;de = high r = 0 - ld e,c - ex de,hl ;de = x, hl = r - exx ;low - pop bc ;bc' = low y - ex (sp),hl ;hl' = low x, save alternate hl - ld de,0 ;de' = low r = 0 - ex de,hl ;de = x, hl = r - exx ;high - ld a,32 ;count -; -; divide x/y -; x: hl -; y: de -; result: -; x/y: hl -; rem: de -div_lp: ;do - exx ; low - ex de,hl ; x - add hl,hl ; x <<= 1 - exx ; high - ex de,hl ; x - adc hl,hl ; x <<= 1 - exx ; low - ex de,hl ; r - adc hl,hl ; r <<= 1 - exx ; high - ex de,hl ; r - adc hl,hl ; r <<= 1 - exx ; low - inc de ; x/q += 1 - or a ; - sbc hl,bc ; - exx ; high - sbc hl,bc ; - jr nc,div_no_restore - exx ; low - dec de ; - add hl,bc ; r += y - exx ; high - adc hl,bc ; - -div_no_restore: ; - dec a ; - jr nz,div_lp ;while (--count) - - ex de,hl ; q - exx ;low - ex de,hl ; q - - ex (sp),hl ;low q - push de ;low r - exx ;high - pop bc ;bc = r - pop de ;de = low q - - exx ;low - pop bc ;restore alternate registers - pop de - exx ;high - ret - -;---------------------------------------------------------------------- - - ; output bytes to consecutive portaddresses - ; - ; hl: table with following structure: - ; db n, port1, val1, val2,... valn - ; db m, port1, val1, val2,... valm - ; ... - ; db 0 ; Terminate table - - - cseg ; (common for now) - -ioiniml: - push bc - xor a -ioml_lp: - ld b,(hl) - inc hl - cp b - jr z,ioml_e - - ld c,(hl) - inc hl - otimr - jr ioml_lp -ioml_e: - pop bc - ret - -;---------------------------------------------------------------------- - - ; output bytes to ports - ; - ; hl: tables of port,value pairs: - ; db n, port1,val1, port2,val2,... portn,valn - ; ... - ; db 0 ; Terminate table - - cseg ; (common for now) - -ioini1l: - push bc - jr io1_nxt -io1_lp: - ld c,(hl) ;port address - inc hl - otim - jr nz,io1_lp -io1_nxt: - ld b,(hl) ;count - inc hl - inc b - djnz io1_lp - - pop bc - ret ;---------------------------------------------------------------------- @@ -249,39 +92,33 @@ spi$nr: db '0' dseg cpu_frq: - ld hl,tmr_rcv_msg_1 - call get_timer + ld hl,0 + ld d,h + ld e,l + call get_tmr + push de + push hl ; delay ~8ms @ 18.432MHz --> 147456 clock cycles ; delay ~10ms @ 18.432MHz --> 184320 clock cycles ; ; ld hl,8192 ; 147456/18 - ld hl,10240 ; 184320/18 + ld hl,(10240-100)*5 ; 184320/18 ld de,1 or a dly_lp: sbc hl,de ; 10 - jr nz,dly_lp ; 6/8 -> 18 + jr nz,dly_lp ; 6/8 -> 18 cycles - ld hl,tmr_rcv_msg_2 - call get_timer + pop hl + pop de + call get_tmr - ld hl,(stamp2) - ld de,(stamp1) - or a - sbc hl,de -; ld de,4 ; round - ld de,5 ; round - add hl,de - ex de,hl - ld hl,0 - ld bc,10 - call div32_16 - ld b,d - ld c,e - ld hl,00119h ;18432000/(2**16) - ld de,04000h ;18432000%(2**16) + ld b,h + ld c,l + ld de,036EEh ;18432000/(2**16) * 50 + ld hl,08000h ;18432000%(2**16) * 50 ld a,b or a @@ -290,53 +127,42 @@ dly_lp: cp 2 jr c,cpuf_done cpuf_div: - call div32_16 + call div32_r cpuf_done: ret ;-------------------------------------------------------------------- -get_timer: + dseg +get_tmr: + push de + push hl + ld hl,1*256 + 3 ; h = subcommand, l = command push hl - ld hl,timer_msg - ld b,timer_msg_len + ld hl,0 + add hl,sp + ld b,6 call msg.sm - pop hl - ld b,tmr_rcv_msg_len ; max receive message len - jp msg.recv - - -timer_msg: - db 3 ; timer/clock command - db 1 ; subcommand (get timer) -timer_msg_len equ $ - timer_msg - - -tmr_rcv_msg_1: - ds 1 ; len - ds 1 ; command - ds 1 ; subcommand -stamp1: - ds 4 ; return value -tmr_rcv_msg_len equ $ - tmr_rcv_msg_1 - + dec sp + ld hl,0 + add hl,sp + ld b,7 ; max receive message len + call msg.recv -tmr_rcv_msg_2: - ds 1 ; len - ds 1 ; command - ds 1 ; subcommand -stamp2: - ds 4 ; return value + pop bc + inc sp + pop hl + pop de + ret ;-------------------------------------------------------------------- - cseg + dseg fifolst: rept 4 dw 0 - db 0 endm ;-------------------------------------------------------------------- @@ -344,87 +170,46 @@ fifolst: dseg bufinit: - ld c,a + ld (ix+o.in_idx),0 ;reset pointers (empty fifo) + ld (ix+o.out_idx),0 ld a,(ix+o.id) - cp 4 - jr nc,bfi_doit2 - ld hl,fifolst ld e,a ld d,0 add hl,de add hl,de - add hl,de - - if 0 - ld e,(hl) - inc hl - ld d,(hl) - dec hl - ld a,e - or d - jr z,bfi_doit - -; TODO: address translation - push de - pop ix - ret - endif - -bfi_doit: push ix pop de -; TODO: address translation + cp 4 + jr nc,bfi_skip + ld (hl),e inc hl ld (hl),d - ld a,(ix+o.id) - or a - jr nz,bfi_doit2 - - ld hl,fifolst - ld (040h),hl - ld (040h+2),a - -bfi_doit2: - ld (ix+o.in_idx),0 ;reset pointers - ld (ix+o.out_idx),0 - ld (ix+o.mask),c ;reset "size" - push ix ;get phys. address of fifo - pop hl - call hwl2phy +bfi_skip: ex de,hl + call hwl2phy ;get phys. address of fifo ld c,a ld a,(ix+o.id) ;fifo id or a ;test if fifo 0 - jr nz,bfi_1 - - out (AVRINT5),a - ret - -bfi_1: - ld hl,bfi_msg_end - ld (hl),c - dec hl - ld (hl),d - dec hl - ld (hl),e - dec hl - ld (hl),a - dec hl - ld b,bfi_msg_len + ret z + + ld b,a + push bc ;c: bank-addr, b: ignored + push hl ;address + ld c,0 + push bc ;c: function, b:subf + ld b,5 + ld h,c + ld l,c + add hl,sp call msg.sm + pop hl + pop hl + pop hl ret -bfi_msg: - db 0 ;function: 0 - db 0 ;subfunc: gets overwritten with buf id - dw 0 ;physical - db 0 ; address -bfi_msg_len equ $ - bfi_msg -bfi_msg_end equ $ - 1 - ;----------------------------------------------------------------------