or d\r
jr z,d$init$next ; if null, no drive\r
push hl ; save @drv pointer\r
- if 0\r
- ex de,hl ; XDPH address in <HL>\r
- dec hl\r
- dec hl\r
- ld b,(hl) ; get relative drive code\r
- ld (@ADRV),bc ; save absolute and relative drive code\r
- dec hl ; point to init pointer\r
- ld d,(hl)\r
- dec hl\r
- ld e,(hl) ; get init pointer\r
- ex de,hl\r
- call ipchl ; call init routine\r
- else\r
push de\r
- pop ix\r
+ pop ix ; XDPH address in <DE>\r
ld b,(ix-2)\r
ld (@ADRV),bc ; save absolute and relative drive code\r
ld l,(ix-4)\r
ld h,(ix-3) ; get init pointer\r
call ipchl ; call init routine\r
- endif\r
pop hl ; recover @drv pointer\r
d$init$next:\r
pop bc ; recover counter and drive #\r
include z180reg.inc\r
\r
\r
-bdos equ 5\r
-\r
ccpsize equ 0c80h\r
\r
+ ; CP/M BDOS Function Interfaces\r
+\r
+resetdsk equ 13\r
+open equ 15\r
+read equ 20\r
+setdma equ 26\r
+setmulti equ 44\r
+bdos equ 5\r
+\r
+\r
if banked\r
tpa$bank equ 1\r
else\r
\r
?ldccp:\r
; First time, load the A:CCP.COM file into TPA\r
- call resetdsk\r
+ ld c,resetdsk\r
+ call bdos\r
xor a\r
ld (ccp$fcb+15),a ; zero extent\r
ld hl,0\r
ld (fcb$nr),hl ; start at beginning of file\r
ld de,ccp$fcb\r
- call open ; open file containing CCP\r
+ ld c,open ; open file containing CCP\r
+ call bdos\r
inc a\r
jp z,no$ccp ; error if no file...\r
ld de,0100h\r
- call setdma ; start of TPA\r
+ ld c,setdma ; start of TPA\r
+ call bdos\r
ld de,128\r
- call setmulti ; allow up to 16k bytes\r
+ ld c,setmulti ; allow up to 16k bytes\r
+ call bdos\r
ld de,ccp$fcb\r
- call read ; load the thing\r
+ ld c,read ; load the thing\r
+ call bdos ; read records\r
; now,\r
; copy CCP to bank 0 for reloading\r
ld hl,0100h\r
call ?bnksl ; select extra bank\r
pop af\r
ld (hl),a ; save the byte\r
- inc hl\r
- dec bc ; bump pointer, drop count\r
- ld a,b\r
- or c ; test for done\r
- jp nz,ld$1\r
+ cpi ; bump pointer, drop count\r
+ jp pe,ld$1\r
pop af\r
call ?bnksl ; restore original bank\r
ret\r
ret\r
\r
\r
- ; CP/M BDOS Function Interfaces\r
-\r
-resetdsk:\r
- ld c,13\r
- jp bdos ; reset disk system\r
-\r
-open:\r
- ld c,15\r
- jp bdos ; open file control block\r
-\r
-setdma:\r
- ld c,26\r
- jp bdos ; set data transfer address\r
-\r
-setmulti:\r
- ld c,44\r
- jp bdos ; set record count\r
-\r
-read:\r
- ld c,20\r
- jp bdos ; read records\r
-\r
-\r
-\r
ccp$fcb:db 1,'CCP ','COM',0,0,0,0\r
ds 16\r
fcb$nr: db 0,0,0\r
mkbuf ci.fifo_id, ci.fifo, ci.fifo_len\r
mkbuf co.fifo_id, co.fifo, co.fifo_len\r
\r
-ici equ ci.fifo_id * 3\r
-ico equ co.fifo_id * 3\r
+ici equ ci.fifo_id * 2\r
+ico equ co.fifo_id * 2\r
\r
\r
;--------------------------------------------------------------\r
jp bufinit\r
\r
;--------------------------------------------------------------\r
+; Input status\r
+; buffer is empty, if output index and input index are the same\r
\r
cseg\r
ff.ist:\r
ret\r
\r
\r
+;--------------------------------------------------------------\r
+; Output status\r
+; buffer is full, if output index is one behind input index\r
+\r
ff.in:\r
push ix\r
ld ix,(fifolst+ici) ;\r
\r
buf.get:\r
- ld a,(ix+o.out_idx) ;\r
+ push ix\r
+ pop hl\r
+ ld c,(ix+o.out_idx) ;\r
+ ld b,0\r
+ add hl,bc\r
+ ld a,c\r
bg.wait:\r
cp (ix+o.in_idx) ;\r
jr z,bg.wait\r
-\r
- push hl ;\r
- push ix\r
- pop hl\r
- add a,l\r
- ld l,a\r
- jr nc,bg.nc\r
- inc h\r
-bg.nc:\r
- ld l,(hl)\r
-\r
- ld a,(ix+o.out_idx) ;\r
+ ld b,(hl)\r
+ ld a,c ;\r
inc a\r
and (ix+o.mask)\r
ld (ix+o.out_idx),a\r
-\r
- ld a,l\r
- pop hl\r
+ ld a,b\r
pop ix\r
ret\r
\r
;--------------------------------------------------------------\r
+; Output status\r
+; buffer is full, if output index is one behind input index\r
\r
ff.ost:\r
push ix\r
- ld ix,(fifolst+ico) ;\r
+ ld ix,(fifolst+ico) ;\r
\r
buf.full:\r
ld a,(ix+o.in_idx) ;\r
ret\r
\r
\r
- if 1\r
-ff.out:\r
- push ix ;15\r
- ld ix,(fifolst+ico) ;\r
-\r
-buf.put:\r
- push hl ;11\r
- push bc ;11\r
- push ix ;15\r
- pop hl ;10\r
- ld a,c ;4\r
- ld c,(ix+o.in_idx) ;19\r
- ld b,0 ;7\r
- add hl,bc ;11\r
- ld (hl),a ;7\r
- ld b,a ;4\r
-\r
- ld a,c ;4\r
- inc a ;4\r
- and (ix+o.mask) ;19\r
-bp.wait:\r
- cp (ix+o.out_idx) ;19\r
- jr z,bp.wait ;12/7\r
- ld (ix+o.in_idx),a ;19\r
-\r
- out (AVRINT6),a ;11\r
- ld a,b ;4\r
- pop bc ;10\r
- pop hl ;10\r
- pop ix ;14\r
- ret ;10\r
-\r
- else\r
+;--------------------------------------------------------------\r
+; put character in c in buffer\r
+; destroys hl, bc\r
+; returns output char in a\r
\r
ff.out:\r
- push ix ;15\r
- ld ix,co.fifo ;14\r
-\r
+ push ix ;\r
+ ld ix,(fifolst+ico) ;\r
buf.put:\r
- push hl ;11\r
- push ix ;15\r
- pop hl ;10\r
- ld a,(ix+o.in_idx) ;19\r
- add a,l ;4\r
- ld l,a ;4\r
- jr nc,bp.1 ;12/7\r
- inc l ;4\r
- ld (hl),c ;7\r
- ld a,(ix+o.in_idx) ;19\r
- inc a ;4\r
- and (ix+o.mask) ;19\r
-bp.wait:\r
- cp (ix+o.out_idx) ;19\r
- jr z,bp.wait ;12/7\r
- ld (ix+o.in_idx),a ;19\r
-\r
- out (AVRINT6),a ;11\r
- ld a,c ;4\r
- pop hl ;10\r
- pop ix ;14\r
- ret ;10 |\r
-\r
- endif\r
-\r
-;--------------------------------------------------------------\r
+ push ix ;\r
+ pop hl ; get buffer start address\r
+\r
+ ld a,c ;\r
+ ld c,(ix+o.in_idx) ; add input index\r
+ ld b,0 ;\r
+ add hl,bc ;\r
+ ld (hl),a ; one place is allways free\r
+ ld b,a ;\r
+\r
+ ld a,c ; bump input index\r
+ inc a ;\r
+ and (ix+o.mask) ;\r
+bp.wait: ; do\r
+ cp (ix+o.out_idx) ;\r
+ jr z,bp.wait ; while new input idx == ouput idx\r
+ ld (ix+o.in_idx),a ;\r
+\r
+ out (AVRINT6),a ; tell monitor\r
+ ld a,b ;\r
+ pop ix ;\r
+ ret ;\r
\r
end\r
- global intinit
- global bufinit
- global cpu_frq
+ public intinit
+ public bufinit
+ public cpu_frq
+ public get_tmr
- global fifolst
+ public fifolst
extrn div32_r,?pmsg
extrn msg.sm,msg.recv,hwl2phy
ld hl,0
ld d,h
ld e,l
- call get_timer
+ call get_tmr
push de
push hl
pop hl
pop de
- call get_timer
+ call get_tmr
ld b,h
ld c,l
;--------------------------------------------------------------------
-get_timer:
+ dseg
+get_tmr:
push de
push hl
- ld hl,1*256 + 3 ; d = subcommand, e = command
+ ld hl,1*256 + 3 ; h = subcommand, l = command
push hl
ld hl,0
add hl,sp
fifolst:
rept 4
dw 0
- db 0
endm
;--------------------------------------------------------------------
dseg
bufinit:
+ 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
-
- 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
+ ret z
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
+ 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
-
;----------------------------------------------------------------------
public _b0call
_b0call:
+ push af
+ in0 a,(bbr)
+ jr nz,b0c_doit
+ pop af
+ ex (sp),hl ;16
+ push de
+ ld e,(hl)
+ inc hl
+ ld d,(hl)
+ inc hl
+ ld (b0c_fast_go),de
+ pop de
+ ex (sp),hl ;16
+b0c_fast_go equ $+1
+ jp 0
+
+b0c_doit:
ld (b0_save_hl),hl
ld (b0_save_de),de
- push af
pop hl
ld (b0_save_af),hl
ld sp,bs$stack ;
push hl ;save user stack pointer
- in0 h,(cbar) ;
+
+ in0 h,(bbr) ;
push hl ;
ld hl,b0c_ret
push hl
- ld a,SYS$CBAR ;
- out0 (cbar),a ;
+ xor a
+ out0 (bbr),a ;
ex de,hl ;ptr
ld e,(hl) ;get 'function address'
inc hl ;
ld (b0_save_hl),hl
pop hl ;
- out0 (cbar),h ;
+ out0 (bbr),h ;
pop hl ;
ld sp,hl ;
ld hl,(b0_save_hl)
; global msg.sout\r
global msg.sm,msg.recv\r
\r
- extrn bufinit\r
+ extrn bufinit,hwl2phy\r
extrn fifolst\r
\r
include config.inc\r
mkbuf 0,mtx.fifo,mtx.fifo_len\r
mkbuf 1,mrx.fifo,mrx.fifo_len\r
\r
-;txfifo_addr equ fifolst + (0*3)\r
-;rxfifo_addr equ fifolst + (1*3)\r
+;txfifo_addr equ fifolst + (0*2)\r
+;rxfifo_addr equ fifolst + (1*2)\r
\r
-itx equ 0*3\r
-irx equ 1*3\r
+itx equ 0*2\r
+irx equ 1*2\r
\r
;--------------------------------------------------------------\r
;\r
-; Init mssage fifos\r
+; Init message fifos\r
;\r
dseg\r
\r
jr nz,msgi_1\r
\r
ld hl,(040h)\r
+;TODO: physical to logical address translation\r
ld a,l\r
or h\r
jr z,msgi_1\r
\r
ld de,fifolst\r
- ld bc,4*3\r
+ ld bc,4*2\r
ldir\r
ret\r
\r
msgi_1:\r
+ ld a,(043h)\r
+;TODO: value should be 0\r
ld ix,mtx.fifo\r
call bufinit\r
+\r
+ ld hl,fifolst\r
+ call hwl2phy\r
+ ld (040h),hl\r
+ ld (040h+2),a\r
+ ld a,0ffh\r
+ ld (043h),a\r
+ out (AVRINT5),a\r
+wait:\r
+ ld a,(043h)\r
+ or a\r
+ jr nz,wait\r
+\r
ld ix,mrx.fifo\r
jp bufinit\r
\r
add hl,bc ;low x + y/2
pop bc
jr nc,div_r1
- inc hl
+ inc de
div_r1:
;fall thru