; CP/M-80 BIOS emulator for Z80PicCompact
; Ver 0.01 2023/01/14 by skyriver
; based on CP/M-80 bios for Z80GAL
; Ver 0.01 2020/11/07 by skyriver
; Ver 0.02 2021/10/02 by skyriver
; save BC-reg at CONOUT
; test for Emurate CP/M BIOS environment 2023/05/15
; change for HD64180Compact
;++++ CP/M parameter ++++
0006 MAXDSK EQU 6 ;number of drives.
0040 MAX_SEC EQU 64 ;sectors/track
0006 MAX_SIF EQU 6 ; MAX_SEC = 1 << MAX_SIF
0040 MSIZE EQU 64 ;size of available RAM in KB
B000 BIAS EQU (MSIZE-20) * 1024
E400 CCP EQU 3400H+BIAS ;base of cpm ccp
EC06 BDOS EQU CCP+806H ;base of bdos
FA00 BIOS EQU CCP+1600H ;base of bios
0004 CDISK EQU 0004H ;current disk number (0 ... 15)
0003 IOBYTE EQU 0003H ;intel iobyte
0080 BUFF EQU 0080H ;default buffer address
000D CR EQU 13
000A LF EQU 10
0080 SECSIZE EQU 128 ; sector size
0800 CPMBKSZ EQU 2048 ; CP/M block size
0200 SDBLKSZ EQU 512 ; SD card block size
0038 RSTAD EQU 038H ; interrupt entry adr
0100 CPM_AP EQU 0100H ; CP/M app entry
.LIST
.Z80
0000' ASEG
ORG BIOS
FA00 C3 FA56 JP BOOT
FA03 WBOOTE:
FA03 C3 FAA0 JP WBOOT
FA06 C3 FA87 JP CONST
FA09 C3 FA8F JP CONIN
FA0C C3 FA92 JP CONOUT
FA0F C3 FAA1 JP LIST
FA12 C3 FAA1 JP PUNCH
FA15 C3 FAA1 JP READER
FA18 C3 FAA1 JP HOME
FA1B C3 FAA1 JP SELDSK
FA1E C3 FAA1 JP SETTRK
FA21 C3 FAA1 JP SETSEC
FA24 C3 FAA1 JP SETDMA
FA27 C3 FAA1 JP READ
FA2A C3 FAA1 JP WRITE
FA2D C3 FAA1 JP LISTST
FA30 C3 FAA1 JP SECTRAN
FA33 StMsg:
FA33 0D 0A 36 DB CR,LF,MSIZE/10+'0'
FA36 34 DB (MSIZE mod 10) + '0'
FA37 6B 20 43 50 DB 'k CP/M Ver 2.2 BIOS Emulator'
FA3B 2F 4D 20 56
FA3F 65 72 20 32
FA43 2E 32 20 42
FA47 49 4F 53 20
FA4B 45 6D 75 6C
FA4F 61 74 6F 72
FA53 0D 0A 00 DB CR,LF,0
FA56 F3 BOOT: DI
FA57 ED 56 IM 1
FA59 31 0100 LD SP,CPM_AP
FA5C AF XOR A
FA5D 32 0080 LD (BUFF),A ; clear command line
OUT0 (HDDCNTL),Areg ; set wait mem:0 IO:0
FA60 ED 39 32 + DB 0EDH,(Areg shl 3) OR 1,(HDDCNTL)
FA63 3E C9 LD A,0C9H
FA65 32 0038 LD (RSTAD),A
FA68 21 FA33 LD HL,StMsg
FA6B CD FA96 CALL Puts
;; JR GOCPM
FA6E GOCPM:
FA6E 3E C3 LD A,0C3H
FA70 32 0000 LD (0),A
FA73 21 FA03 LD HL,WBOOTE
FA76 22 0001 LD (1),HL
FA79 32 0005 LD (5),A
FA7C 21 EC06 LD HL,BDOS
FA7F 22 0006 LD (6),HL
FA82 36 C9 LD (HL),0C9H ; return code
FA84 C3 0100 JP CPM_AP
;
; check console key data
; A -> 0ffh:data exist 00h:none
FA87 CONST:
FA87 DB FF IN A,(CMDPORT) ; get status
FA89 E6 01 AND RXRDY_B
FA8B C8 RET Z ; no data
FA8C 3E FF LD A,0FFH
FA8E C9 RET
;
; input console
; A -> key data
FA8F DB FE CONIN: IN A,(DATPORT)
FA91 C9 RET
; out console
; C <- data
FA92 79 CONOUT: LD A,C
FA93 D3 FE OUT (DATPORT),A
FA95 C9 RET
; print string
; HL <- string addr
FA96 Puts:
FA96 7E LD A,(HL)
FA97 B7 OR A
FA98 C8 RET Z
FA99 4F LD C,A
FA9A CD FA92 CALL CONOUT
FA9D 23 INC HL
FA9E 18 F6 JR Puts
FAA0 76 WBOOT: HALT
FAA1 LIST:
FAA1 PUNCH:
FAA1 READER:
FAA1 HOME:
FAA1 SELDSK:
FAA1 SETTRK:
FAA1 SETSEC:
FAA1 SETDMA:
FAA1 READ:
FAA1 WRITE:
FAA1 LISTST:
FAA1 SECTRAN:
FAA1 C9 RETURN: RET
END
|