
; Macro um aus der Z80 Emulation Biosroutinen aufzurufen, => V20

calln  macro  nr
       db 0edh,0edh
       db nr
endm

; Macros fuer Z80 Sprunganweisungen, die TASM nicht kennt

z80jp  macro  labl
       db 0c3h
       dw offset labl
endm

z80ret macro
       db 0c9h
endm

; naechste Zeilen orginal aus DR's CBIOS.ASM

;
MSIZE  equ    20     ;cp/m version memory size in kilobytes
;
;  "BIAS" is address offset from 3400h for memory systems
;  than 16k (referred to as "b" throughout the text).
;
BIAS   equ    (MSIZE-20)*1024


IOBYTE equ 3  ;intel i/o byte
CDISK  equ 4  ;current disk number 0=a,...,15=p


;       org    bios   ;origin of this program

zbiosbeg equ this byte                 ; start of z80 bios

;  jump vector fuer einzelne Ups
       z80jp    zboot+ZBIOSDISPL   ;cold start
wboote equ this byte
       z80jp    zwboot+ZBIOSDISPL  ;warm start
       z80jp    zconst+ZBIOSDISPL  ;console status
       z80jp    zconin+ZBIOSDISPL  ;console character in
       z80jp    zconout+ZBIOSDISPL ;console character out
       z80jp    zlist+ZBIOSDISPL   ;list character out
       z80jp    zpunch+ZBIOSDISPL  ;punch character out
       z80jp    zreader+ZBIOSDISPL ;reader character out
       z80jp    zhome+ZBIOSDISPL   ;move head to home position
       z80jp    zseldsk+ZBIOSDISPL ;select disk
       z80jp    zsettrk+ZBIOSDISPL ;set track number
       z80jp    zsetsec+ZBIOSDISPL ;set sector number
       z80jp    zsetdma+ZBIOSDISPL ;set dma address
       z80jp    zread+ZBIOSDISPL   ;read disk
       z80jp    zwrite+ZBIOSDISPL  ;write disk
       z80jp    zlistst+ZBIOSDISPL ;return list status
       z80jp    zsectran+ZBIOSDISPL       ;sector translate
       rept 25-16-1
         z80jp    zwboot+ZBIOSDISPL
       endm
       z80jp    zmove+ZBIOSDISPL
       z80jp    ztime+ZBIOSDISPL
zvecend equ this byte

zboot  equ this byte
        calln 0
       z80ret
zwboot equ this byte
        calln 1
       db 31h,80h,00h    ; ld sp,80h
       z80ret
zconst equ this byte
       calln 2
       z80ret
zconin equ this byte
       calln 3
       z80ret
zconout equ this byte
       calln 4
       z80ret
zlist  equ this byte
       calln 5
       z80ret
zpunch equ this byte
       calln 6
       z80ret
zreader equ this byte
       calln 7
       z80ret
zhome   equ this byte
       calln 8
       z80ret
zseldsk equ this byte
       calln 9
       z80ret
zsettrk equ this byte
       calln 10
       z80ret
zsetsec equ this byte
       calln 11
       z80ret
zsetdma equ this byte
       calln 12
       z80ret
zread   equ this byte
       calln 13
       z80ret
zwrite  equ this byte
       calln 14
       z80ret
zlistst equ this byte
       calln 15
       z80ret
zsectran equ this byte
       calln 16
       z80ret
zmove equ this byte     ; number as in cp/m plus
       calln 25
       z80ret
ztime equ this byte     ; number as in cp/m plus
       calln 26
       z80ret

LAST_TRCK0 equ 39  ; track = 0..39
LAST_SEC0  equ 35  ; sektor = 0..35

LAST_SEC1  equ 31

XLT0       equ 0
XLT1       equ 0

; datas cpc system format

                    ; blocksize bls=1024
       SPTC equ 24h ;
       BSHC equ 3   ; log2(bls/128)=3
       BLMC equ 7   ; bls/128-1
       EXMC equ 0   ; (bls/1024)-1
       DSMC equ 168 ; disksize-1
       DRMC equ 63  ; direntrys-1
       AL0C equ 11000000b
       AL1C equ 00000000b
       CKSC equ 16
       OFFC equ 2


; datas cpc data format

                    ; blocksize bls=1024
       SPTD equ 24h ;
       BSHD equ 3   ; log2(bls/128)=3
       BLMD equ 7   ; bls/128-1
       EXMD equ 0   ; (bls/1024)-1
       DSMD equ 177 ; disksize-1
       DRMD equ 63  ; direntrys-1
       AL0D equ 11000000b
       AL1D equ 00000000b
       CKSD equ 16
       OFFD equ 0


; datas fuer CP/M 86 SS

                    ; blocksize bls=1024
       SPT0 equ 32  ;
       BSH0 equ 3   ; log2(bls/128)=3
       BLM0 equ 7   ; bls/128-1
       EXM0 equ 0   ; (bls/1024)-1
       DSM0 equ 152 ; disksize-1
       DRM0 equ 63  ; direntrys-1
       AL00 equ 11000000b
       AL10 equ 00000000b
       CKS0 equ 16
       OFF0 equ 1

; datas fuer CP/M 86 DS

                    ; blocksize bls=1024
       SPT1 equ 32  ;
       BSH1 equ 4   ; log2(bls/128)=3
       BLM1 equ 15  ; bls/128-1
       EXM1 equ 1   ; (bls/1024)-1
       DSM1 equ 157 ; disksize-1
       DRM1 equ 63  ; direntrys-1
       AL01 equ 10000000b
       AL11 equ 00000000b
       CKS1 equ 16
       OFF1 equ 1

;
; disc parameter data Ramdisk
;

                    ; blocksize bls=1024
       SPTR equ 32   ; 4K
       BSHR equ 3   ; log2(bls/128)=3
       BLMR equ 7   ; bls/128-1
       EXMR equ 0   ; (bls/1024)-1
       DSMR equ 63  ; disksize-1
       DRMR equ 31  ; direntrys+1
       AL0R equ 10000000b
       AL1R equ 00000000b
       CKSR equ 0
       OFFR equ 0

;
; structure fuer disc parameter headers
;
dph struc
    dw 0                            ; xlt
    dw 0                            ; scratch pads
    dw 0
    dw 0
    dw ?                            ; dirbuf
    dw ?                            ; dpb
    dw ?                            ; csv
    dw ?                            ; alv
dph ends

;
; structure fuer disc parameter blocks
;

dpb   struc
    spt dw ?
    bsh db ?
    blm db ?
    exm db ?
    dsm dw ?
    drm dw ?
    al0 db ?
    al1 db ?
    cks dw ?
    off dw ?
dpb  ends

; drive a:

dph_base equ this byte  ; disk parameter base

dph0  dph <XLT0,0,0,0,offset dirbuf+ZBIOSDISPL,offset dpb0+ZBIOSDISPL,offset csv0+ZBIOSDISPL,offset alv0+ZBIOSDISPL>
dph1  dph <XLT1,0,0,0,offset dirbuf+ZBIOSDISPL,offset dpb1+ZBIOSDISPL,offset csv1+ZBIOSDISPL,offset alv1+ZBIOSDISPL>

dpb0  dpb <SPTC,BSHC,BLMC,EXMC,DSMC,DRMC,AL0C,AL1C,CKSC,OFFC>

dpb1  dpb <SPTR,BSHR,BLMR,EXMR,DSMR,DRMR,AL0R,AL1R,CKSR,OFFR>

dirbuf db 128 dup (?)   ; fuer alle Laufwerke gemeinsam

csv0   db (DRMC+1)/4 dup (?)
alv0   db (DSMC/8)+1 dup (?)

csv1   db (DRMR+1)/4 dup (?)
alv1   db (DSMR/8)+1 dup (?)

@date dw (?)
@hour db (?)
@min  db (?)
@sec  db (?)

zbiosend equ this byte
