Files
Digital-Research-Source-Code/CONTRIBUTIONS/z80em86/bios/chario.mac
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

306 lines
6.4 KiB
Plaintext

;**************************************************************************
;* CP/M 3 BIOS for Z80em86 Z80 CPU emulator *
;* *
;* Character I/O driver *
;* *
;* Copyright (C) 1992-2009 Stewart Kay *
;**************************************************************************
;
; ChangeLog (most recent entries are at top)
; ------------------------------------------
; v1.0.0 - 16 February 2009, S.J.Kay
; - Prepare for public release.
;
; v1.00 - 17 April 1995, S.J.Kay
; - Undocumented changes.
;
; v0.00 - 1992, S.J.Kay
; - Initial creation date.
.z80
;
maclib MODEBAUD.LIB
maclib TPORTS.LIB
;
public ?cinit, ?cist, ?cost, ?co, ?ci
public @ctbl
;
crt1 equ 0 ;CRT #1 O
crt2 equ 1 ;CRT #2 O
kbd1 equ 2 ;KBD #1 I
kbd2 equ 3 ;KBD #2 I
com1 equ 4 ;COM #1 IO
com2 equ 5 ;COM #2 IO
com3 equ 6 ;COM #3 IO
com4 equ 7 ;COM #4 IO
lpt1 equ 8 ;LPT #1 O
lpt2 equ 9 ;LPT #2 O
lpt3 equ 10 ;LPT #3 O
;
cseg ;common memory
;
; Initialize character devices
?cinit: ld a,c
cp crt1
jp z,cr1int ;CRT #1 initialize
cp crt2
jp z,cr2int ;CRT #2 initialize
cp kbd1
jp z,kb1int ;KBD #1 initialize
cp kbd2
jp z,kb2int ;KBD #2 initialize
cp com1
jp z,comint ;COM #1 initialize
cp com2
jp z,comint ;COM #2 initialize
cp com3
jp z,comint ;COM #3 initialize
cp com4
jp z,comint ;COM #4 initialize
cp lpt1
jp z,lptint ;LPT #1 initialize
cp lpt2
jp z,lptint ;LPT #2 initialize
cp lpt3
jp z,lptint ;LPT #3 initialize
ret ;return if no device
;
; Console input status
?cist: ld a,b
cp kbd1
jp z,kb1ist ;KBD #1 input status
cp kbd2
jp z,kb2ist ;KBD #2 input status
cp com1
jp z,comips ;COM #1 input status
cp com2
jp z,comips ;COM #2 input status
cp com3
jp z,comips ;COM #3 input status
cp com4
jp z,comips ;COM #4 input status
xor a
ret ;return if no device
;
; Console input
?ci: ld a,b
cp kbd1
jp z,kb1ip ;KBD #1 input
cp kbd2
jp z,kb2ip ;KBD #2 input
cp com1
jp z,comip ;COM #1 input
cp com2
jp z,comip ;COM #2 input
cp com3
jp z,comip ;COM #3 input
cp com4
jp z,comip ;COM #4 input
xor a
ret ;return if no device
;
; Console output status
?cost: ld a,b
cp crt1
jp z,cr1ost ;CRT #1 output status
cp crt2
jp z,cr2ost ;CRT #2 output status
cp com1
jp z,comops ;COM #1 output status
cp com2
jp z,comops ;COM #2 output status
cp com3
jp z,comops ;COM #3 output status
cp com4
jp z,comops ;COM #4 output status
cp lpt1
jp z,lptost ;LPT #1 output status
cp lpt2
jp z,lptost ;LPT #2 output status
cp lpt3
jp z,lptost ;LPT #3 output status
ld a,0ffh
ret ;return if no device
;
; Console output
?co: ld a,b
cp crt1
jp z,cr1out ;CRT #1 output
cp crt2
jp z,cr2out ;CRT #2 output
cp com1
jp z,comop ;COM #1 output
cp com2
jp z,comop ;COM #2 output
cp com3
jp z,comop ;COM #3 output
cp com4
jp z,comop ;COM #4 output
cp lpt1
jp z,lptop ;LPT #1 output
cp lpt2
jp z,lptop ;LPT #2 output
cp lpt3
jp z,lptop ;LPT #3 output
ret ;return if no device
;
kb1int: out (kbd1in),a ;keyboard #1 initialize
ret
kb1ist: out (kbd1st),a ;keyboard #1 status
ret
kb1ip: out (kbd1ip),a ;keyboard #1 input
ret
;
kb2int: out (kbd2in),a ;keyboard #2 initialize
ret
kb2ist: out (kbd2st),a ;keyboard #2 status
ret
kb2ip: out (kbd2ip),a ;keyboard #2 input
ret
cr1int: out (crt1in),a ;CRT #1 initialize
ret
cr1ost: out (crt1st),a ;CRT #1 status
ret
cr1out: out (crt1op),a ;CRT #1 output
ret
;
cr2int: out (crt2in),a ;CRT #2 initialize
ret
cr2ost: out (crt2st),a ;CRT #2 status
ret
cr2out: out (crt2op),a ;CRT #2 output
ret
;
comint: ld bc,com1bd
cp com2
jp c,fndbdr
ld bc,com2bd
jp z,fndbdr
ld bc,com3bd
cp com4
jp c,fndbdr
ld bc,com4bd
fndbdr: sub com1
ld d,0 ;COM port # to DE (DX in Z80 emulator)
ld e,a
ld hl,bdrtbl
ld a,(bc) ;get CP/M baud rate code from control table
push de
ld d,0
ld e,a
add hl,de
pop de
ld a,(hl) ;get IBM baud rate code from IBM table
sla a
jr c,badbdr ;baud rate not allowed if C flag set
or 00000011b ;parity none, 1 stop bit, 8 data bits
out (comini),a ;COM initialize
ret
badbdr: xor a
ld (bc),a ;kill baud rate in table
ret
comops: sub com1
ld d,0 ;COM port # to DE (DX in Z80 emulator)
ld e,a
out (comost),a ;COM output status
ret
comop: sub com1
ld d,0 ;COM port # to DE (DX in Z80 emulator)
ld e,a
out (comout),a ;COM output
ret
comips: sub com1
ld d,0 ;COM port # to DE (DX in Z80 emulator)
ld e,a
out (comist),a ;COM input status
ret
comip: sub com1
ld d,0 ;COM port # to DE (DX in Z80 emulator)
ld e,a
out (cominp),a ;COM input
ret
;
lptint: sub lpt1
ld d,0 ;LPT port # to DE (DX in Z80 emulator)
ld e,a
out (lptini),a ;LPT initialize
ret
lptost: sub lpt1
ld d,0 ;LPT port # to DE (DX in Z80 emulator)
ld e,a
out (lptsta),a ;LPT status
ret
lptop: sub lpt1
ld d,0 ;LPT port # to DE (DX in Z80 emulator)
ld e,a
out (lptout),a ;LPT output
ret
;
bdrtbl: db 10000000b ;-- no baud rate
db 10000000b ;50 baud n/a
db 10000000b ;75 baud n/a
db 00000000b ;110 baud - IBM
db 10000000b ;134 baud n/a
db 00010000b ;150 baud - IBM
db 00100000b ;300 baud - IBM
db 00110000b ;600 baud - IBM
db 01000000b ;1200 baud - IBM
db 10000000b ;1800 baud n/a
db 01010000b ;2400 baud - IBM
db 10000000b ;3600 baud n/a
db 01100000b ;4800 baud - IBM
db 10000000b ;7200 baud n/a
db 01110000b ;9600 baud - IBM
db 10000000b ;19200 baud n/a
;
@ctbl: db 'CRT1 ' ;Dev 0, CRT #1 driver
db mb$output
db baud$none
;
db 'CRT2 ' ;Dev 1, CRT #2 driver
db mb$output
db baud$none
;
db 'KBD1 ' ;Dev 2, KBD #1 Keyboard
db mb$input
db baud$none
;
db 'KBD2 ' ;Dev 3, KBD #2 Keyboard
db mb$input
db baud$none
;
db 'COM1 ' ;Dev 4, serial via COM #1
db mb$input+mb$output+mb$serial+mb$soft$baud
com1bd: db baud$9600
;
db 'COM2 ' ;Dev 5, serial via COM #2
db mb$input+mb$output+mb$serial+mb$soft$baud
com2bd: db baud$9600
;
db 'COM3 ' ;Dev 6, serial via COM #3
db mb$input+mb$output+mb$serial+mb$soft$baud
com3bd: db baud$9600
;
db 'COM4 ' ;Dev 7, serial via COM #4
db mb$input+mb$output+mb$serial+mb$soft$baud
com4bd: db baud$9600
;
db 'LPT1 ' ;Dev 8, Centronics via LPT#1
db mb$output
db baud$none
;
db 'LPT2 ' ;Dev 9, Centronics via LPT#2
db mb$output
db baud$none
;
db 'LPT3 ' ;Dev 10, Centronics via LPT#3
db mb$output
db baud$none
;
db 0 ;marks end of table
;
end