Browse Source

Merge pull request #111 from wwarthen/dev

Dev
pull/117/head
b1ackmai1er 6 years ago
committed by GitHub
parent
commit
13e6712721
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      Doc/ChangeLog.txt
  2. 6
      Source/Apps/Tune/Build.cmd
  3. 14
      Source/Apps/Tune/Makefile
  4. 584
      Source/Apps/Tune/Tune.asm
  5. 33
      Source/Apps/Tune/cli.inc
  6. 4
      Source/Apps/Tune/cpm.inc
  7. 15
      Source/Apps/Tune/hbios.inc
  8. 175
      Source/Apps/Tune/printing.inc
  9. 39
      Source/Apps/Tune/strings.inc
  10. 60
      Source/Apps/Tune/timing.inc
  11. 4
      Source/Apps/Tune/tune.inc
  12. 42
      Source/CBIOS/cbios.asm
  13. 1
      Source/HBIOS/cfg_dyno.asm
  14. 1
      Source/HBIOS/cfg_ezz80.asm
  15. 1
      Source/HBIOS/cfg_master.asm
  16. 1
      Source/HBIOS/cfg_mk4.asm
  17. 1
      Source/HBIOS/cfg_n8.asm
  18. 1
      Source/HBIOS/cfg_rcz180.asm
  19. 1
      Source/HBIOS/cfg_rcz80.asm
  20. 1
      Source/HBIOS/cfg_sbc.asm
  21. 1
      Source/HBIOS/cfg_scz180.asm
  22. 1
      Source/HBIOS/cfg_zeta.asm
  23. 1
      Source/HBIOS/cfg_zeta2.asm
  24. 2
      Source/HBIOS/cvdu.asm
  25. 4
      Source/HBIOS/hbios.asm
  26. 12
      Source/HBIOS/romldr.asm
  27. 2
      Source/HBIOS/sn76489.asm
  28. 1
      Source/HBIOS/std.asm
  29. 88
      Source/HBIOS/tms.asm
  30. 2
      Source/HBIOS/vdu.asm
  31. 2
      Source/HBIOS/vga.asm
  32. BIN
      Source/Images/d_cpm22/u0/KERCPM22.COM
  33. BIN
      Source/Images/d_cpm3/u0/KERCPM3.COM
  34. BIN
      Source/Images/d_nzcom/u0/KERCPM22.COM
  35. BIN
      Source/Images/d_zpm3/u15/kercpm3.com
  36. BIN
      Source/Images/d_zsdos/u0/KERCPM22.COM
  37. 20
      Tools/Makefile.inc

18
Doc/ChangeLog.txt

@ -9,9 +9,11 @@ Version 3.1
- WBW: Support use of CTC for SIO baud rate divisors
- WBW: Updated IDE and PPIDE drivers to improve old CF Card compatibility
- WBW: Support TIMER mode in CTC driver
- D?N: Added sound driver support
- D?N: Added SN76489 sound chip driver
- DEN: Added sound driver support
- DEN: Added SN76489 sound chip driver
- M?O: RomWBW Disk Catalog document
- DEN: Updated TMS to optionally trigger SYSTIMER interrupt (TMSTIMENABLE)
- J?M: Updated KERMIT applications with VT100 terminal support
Version 3.0.1
-------------
@ -283,7 +285,7 @@ Version 2.0
- DWG: Entire new suite of Apps written in Aztec C
- DWG: BANKER.COM - displays bank identification and version information
- DWG: CPMNAME.COM - displays CBIOS header data and SYSCFG data, names and vaues
- DWG: CHARS.COM - displays ascii map as reference
- DWG: CHARS.COM - displays ascii map as reference
- DWG: CLS.COM - clears screen
- DWG: LABEL.COM - displays and changes drive labels for drives with reserved tracks
- DWG: MAP.COM - like old map command, displays drives and logical unit labels and changes LU values
@ -315,7 +317,7 @@ Version 1.5.1
- WBW: Added ZSDOS clock drivers (see Support\Clock)
- WBW: Overhaul of ZSystem ROM Disk (see Doc\ZSystem.txt)
- WBW: Update PropIO ANSI emulation for compatiblity with ASSIGN
- DWG: Added version tags to all applications, and IDENT program to
- DWG: Added version tags to all applications, and IDENT program to
check version of utilities.
- DWG: Added MULTIFMT program which prepares new media for use by
initializing the metadata and clearing the directory sectors of
@ -325,8 +327,8 @@ Version 1.5.1
- DWG: ANALYSE and HELLO programs removed from ROM due space concerns
- DWG: Additional macro librarties added supporting program identification
(IDENTITY.LIB/ASM) and access to drive metadata (METADATA.LIB/ASM),
and realtime selection of logical units from within new application
programs (LOGICALS.LIB/ASM).
and realtime selection of logical units from within new application
programs (LOGICALS.LIB/ASM).
- DWG: Added TERM_VT52 for VDU compatbility, all apps now compliant
- DGG: Contributed Linux build (see Doc\BuildLinux.txt)
@ -354,7 +356,7 @@ Version 1.4
- DWG: Add various .SUB files used for application maintenance
- DWG: Enhanced utility building .SUB files to only contain libs utilitized
- DWG: Add BUILD.SUB to build all applications and DEVFILES.LBR
- DWG: Add/update RMAC macro libraries used in Apps -
- DWG: Add/update RMAC macro libraries used in Apps -
- DWG: BIOSHDR, STDLIB, STRCPY, STRLEN, CPMBIOS, CPMBDOS, TERMINAL, HARDWARE,
- DWG: CPMAPPL, GLOBALS, ATOI, LUBIND, APPLVERS, MEMORY(memcpy,memset), PORTAB
- DWG: Add/Repair BIOS support for Boot Drive login during CP/M Coldstart
@ -373,7 +375,7 @@ Version 1.4
- DWG: Add LABEL utility to insert label into drive/slice metadata
- DWG: Add 16 char label field to metadata
- DWG: ASSIGN utility displays and manipulates DPH/DPB & logical unit parameters
- DWG/WBW: Collaborated on design of Logical Unit DPH enhancemnt
- DWG/WBW: Collaborated on design of Logical Unit DPH enhancemnt
- WBW: Proposed MAP utility functionality
- WBW: Implement slice selection API for DSK devices
- WBW: Record boot drive in config memory at load time

6
Source/Apps/Tune/Build.cmd

@ -5,9 +5,11 @@ set TOOLS=../../../Tools
set PATH=%TOOLS%\tasm32;%PATH%
set TASMTABS=%TOOLS%\tasm32
tasm -t180 -g3 -fFF Tune.asm Tune.com Tune.lst
tasm -t180 -g3 -fFF -dWBW Tune.asm Tune.com Tune.lst
tasm -t180 -g3 -fFF -dZX Tune.asm Tunezx.com Tunezx.lst
tasm -t180 -g3 -fFF -dMSX Tune.asm Tunemsx.com Tunemsx.lst
if errorlevel 1 goto :eof
copy /Y Tune.com ..\..\..\Binary\Apps\
copy /Y Tune*.com ..\..\..\Binary\Apps\
copy /Y Tunes\*.* ..\..\..\Binary\Apps\Tunes\

14
Source/Apps/Tune/Makefile

@ -1,11 +1,19 @@
OBJECTS = Tune.com
OBJECTS = Tune.com Tunezx.com Tunemsx.com
DEST = ../../../Binary/Apps
TOOLS = ../../../Tools
include $(TOOLS)/Makefile.inc
Tune.com: Tune.asm
$(TASM) Tune.asm Tune.com
DEPS := Tune.asm $(shell find . -name '*.inc')
Tune.com: $(DEPS)
$(TASM) -dWBW Tune.asm Tune.com
Tunezx.com: $(DEPS)
$(TASM) -dZX Tune.asm Tunezx.com
Tunemsx.com: $(DEPS)
$(TASM) -dMSX Tune.asm Tunemsx.com
all::
mkdir -p $(DEST)/Tunes

584
Source/Apps/Tune/Tune.asm

@ -39,6 +39,7 @@
; 2019-11-21 [WBW] Added table-driven configuration
; 2020-02-11 [WBW] Made hardware config & detection more flexible
; 2020-03-29 [WBW] Fix error in Z180 I/O W/S bracketing
; 2020-04-25 [DEN] Added support to use HBIOS Sound driver
;_______________________________________________________________________________
;
; ToDo:
@ -49,43 +50,63 @@
; Main program
;===============================================================================
;
RESTART .EQU $0000 ; CP/M restart vector
BDOS .EQU $0005 ; BDOS invocation vector
;
IDENT .EQU $FFFE ; loc of RomWBW HBIOS ident ptr
;
RMJ .EQU 3 ; intended CBIOS version - major
RMN .EQU 1 ; intended CBIOS version - minor
;
BF_SYSVER .EQU $F1 ; BIOS: VER function
BF_SYSGET .EQU $F8 ; HBIOS: SYSGET function
;
FCB .EQU $5C ; Location of default FCB
;
#include "hbios.inc"
#include "cpm.inc"
#include "tune.inc"
HEAPEND .EQU $C000 ; End of heap storage
;
TYPPT2 .EQU 1 ; FILTYP value for PT2 sound file
TYPPT3 .EQU 2 ; FILTYP value for PT3 sound file
TYPMYM .EQU 3 ; FILTYP value for MYM sound file
;
;
;
;Conditional assembly - use -D switch on TASM or uz80as assembler to control
_ZX .EQU 0 ; 1) Version of ROUT (ZX or MSX standards)
_MSX .EQU 0
_WBW .EQU 0
HBIOS .EQU 0
#IFDEF ZX
_ZX .SET 1
#ELSE
#IFDEF MSX
_MSX .SET 1
#ELSE
_WBW .SET 1
#ENDIF
#ENDIF
CurPosCounter .EQU 0 ; 2) Current position counter at (START+11)
ACBBAC .EQU 0 ; 3) Allow channels allocation bits at (START+10)
LoopChecker .EQU 1 ; 4) Allow loop checking and disabling
Id .EQU 1 ; 5) Insert official identificator
#DEFINE Release "1" ; Release number
.ORG $0100
;
CALL CRLF
LD DE,MSGBAN ; Point to banner message
CALL PRTSTR ; Print message
;
; Check BIOS and version
PRTCRLF
PRTSTRDE(MSGBAN) ; Print to banner message
CALL CLI_ABRT_IF_OPT_FIRST
CALL CLI_HAVE_HBIOS_SWITCH
JP CONTINUE
CONTINUE:
; Check BIOS and version
CALL IDBIO ; Identify hardware BIOS
CP 1 ; RomWBW HBIOS?
JP NZ,ERRBIO ; If not, handle BIOS error
LD A,RMJ << 4 | RMN ; Expected HBIOS ver
JP NZ, ERRBIO ; If not, handle BIOS error
LD A, RMJ << 4 | RMN ; Expected HBIOS ver
CP D ; Compare with result above
JP NZ,ERRBIO ; Handle BIOS error
LD A,L ; Platform id to A
JP NZ, ERRBIO ; Handle BIOS error
LD A, L ; Platform id to A
LD (CURPLT),A ; Save as current platform id
;
LD A, (HBIOSMD)
OR A
JR NZ, TSTTIMER ; skip hardware check if using hbios
LD HL,CFGTBL ; Point to start of config table
CFGSEL:
LD A,$FF ; End of table marker
@ -111,7 +132,7 @@ CFGSEL:
LD C,A ; Put in C for I/O
LD A,$FF ; Value to activate card
OUT (C),A ; Write value to ACR
;
;
PROBE:
; Test for hardware (sound chip detection)
LD DE,(PORTS) ; D := RDAT, E := RSEL
@ -137,21 +158,9 @@ MAT:
LD DE,(DESC) ; Load hardware description pointer
CALL PRTSTR ; Print description
;
; Test for timer running to determine if it can be used for delay
LD B,BF_SYSGET ; HBIOS: GET function
LD C,$D0 ; TIMER subfunction
RST 08 ; DE:HL := current tick count
LD A,L ; DE:HL == 0?
OR H
OR E
OR D
LD A,0 ; Assume no timer
LD DE,MSGDLY ; Delay mode msg
JR Z,SETDLY ; If tick count is zero, no timer active
LD A,$FF ; Value for timer active
LD DE,MSGTIM ; Timer mode msg
SETDLY:
LD (WMOD),A ; Save wait mode
TSTTIMER:
CALL PROBETIMER
CALL PRTSTR ; Print it
;
; Get CPU speed & type from RomWBW HBIOS and compute quark delay factor
@ -170,7 +179,7 @@ SETDLY:
LD DE,HEAP+1 ; Set dest to next byte
LD BC,HEAPEND-HEAP-1 ; Size of heap except first byte
LDIR ; Propagate zero to rest of heap
;
;
; Check sound filename (must be *.PT2, *.PT3, or *.MYM)
LD A,(FCB+1) ; Get first char of filename
CP ' ' ; Compare to blank
@ -179,7 +188,7 @@ SETDLY:
CP ' ' ; is blanks
JR NZ,HASEXT ; then assume
LD A,'P' ; type PT3.
LD (FCB+9),A
LD (FCB+9),A
LD A,'T' ; Fill in
LD (FCB+10),A ; the file
LD A,'3' ; extension
@ -214,13 +223,15 @@ CHKMYM LD A,(FCB+9) ; Extension char 1
_SET LD A,C ; Get file type value
LD (FILTYP),A ; Save file type value
;
CALL CLI_ABRT_UNSUPPFILTYP
; Load sound file
_LD0 LD C,15 ; CPM Open File function
LD DE,FCB ; FCB
CALL BDOS ; Do it
INC A ; Test for error $FF
JP Z,ERRFIL ; Handle file error
;
;
LD A,(FILTYP) ; Get file type
LD HL,MDLADDR ; Assume load address
LD (DMA),HL ; ... for PTx files
@ -240,19 +251,19 @@ _LD LD HL,(DMA) ; Get load address
POP DE ; Restore current DMA to DE
LD C,26 ; CPM Set DMA function
CALL BDOS ; Read next 128 bytes
;
;
LD C,20 ; CPM Read Sequential function
LD DE,FCB ; FCB
CALL BDOS ; Read next 128 bytes
OR A ; Set flags to check EOF
JR NZ,_LDX ; Non-zero is EOF
JR Z,_LD ; Load loop
;
;
_LDX LD C,16 ; CPM Close File function
LD DE,FCB ; FCB
CALL BDOS ; Do it
;
; Play loop
;
; Play loop
CALL CRLF2 ; Formatting
LD DE,MSGPLY ; Playing message
CALL PRTSTR ; Print message
@ -319,7 +330,7 @@ waitvb call WAITQ
ld (played),a
;call PRTDOT
jr mymlp
;
;
EXIT CALL START+8 ; Mute audio
;CALL NORMCPU
;CALL CRLF2 ; Formatting
@ -327,43 +338,12 @@ EXIT CALL START+8 ; Mute audio
CALL PRTSTR ; Print message
CALL CRLF ; Formatting
JP 0 ; Exit the easy way
;
; Wait for quark play time. Can use hardware timer if
; supported by hardware or simple delay loop otherwise.
; Delay loop requires QDLY to be pre-set to to achieve
; optimal 20ms wait time.
;
WAITQ LD A,(WMOD) ; Get delay mode
OR A ; Set flags
JR Z,DLY ; Delay mode
;
; Timer loop
CALL TIM2 ; Read timer LSB into A
LD C,A ; Init prev value
TIM1 PUSH BC ; Save prev value
CALL TIM2 ; Read timer LSB into A
POP BC ; Recover prev value
CP C ; Compare to prev
RET NZ ; Done if changed
JR TIM1 ; Else, loop
;
TIM2 LD B,$F8 ; BIOS SYSGET function
LD C,$D0 ; TIMER sub-function
RST 08 ; Call BIOS
LD A,L ; MSB to A
RET ; Return to loop
;
; Delay spin loop (40 tstates per loop)
DLY LD BC,(QDLY) ; Load quark delay factor
DLY1 DEC BC ; [6]
NOP ; [4]
NOP ; [4]
NOP ; [4]
NOP ; [4]
LD A,B ; [4]
OR C ; [4]
JP NZ,DLY1 ; [10]
RET
#include "timing.inc"
#include "strings.inc"
#include "cli.inc"
#include "printing.inc"
;
; Get a keystroke from CPM
;
@ -410,7 +390,7 @@ IDBIO1:
LD B,BF_SYSVER ; HBIOS: VER function
LD C,0 ; required reserved value
RST 08 ; DE := version, L := platform id
;
;
LD A,1 ; HBIOS BIOS id = 1
RET ; and done
;
@ -482,190 +462,7 @@ NORMIO:
LD A,(DCSAV) ; Get saved DCNTL value
OUT (C),A ; And restore it
RET
;
; Print character in A without destroying any registers
;
PRTCHR:
PUSH BC ; save registers
PUSH DE
PUSH HL
LD E,A ; character to print in E
LD C,$02 ; BDOS function to output a character
CALL BDOS ; do it
POP HL ; restore registers
POP DE
POP BC
RET
;
PRTDOT:
;
; shortcut to print a dot preserving all regs
PUSH AF ; save af
LD A,'.' ; load dot char
CALL PRTCHR ; print it
POP AF ; restore af
RET ; done
;
PRTCR:
;
; shortcut to print a dot preserving all regs
PUSH AF ; save af
LD A,13 ; load CR value
CALL PRTCHR ; print it
POP AF ; restore af
RET ; done
;
; Print a zero terminated string at (DE) without destroying any registers
;
PRTSTR:
PUSH DE
;
PRTSTR1:
LD A,(DE) ; get next char
OR A
JR Z,PRTSTR2
CALL PRTCHR
INC DE
JR PRTSTR1
;
PRTSTR2:
POP DE ; restore registers
RET
;
; Print the value in A in hex without destroying any registers
;
PRTHEX:
PUSH AF ; save AF
PUSH DE ; save DE
CALL HEXASCII ; convert value in A to hex chars in DE
LD A,D ; get the high order hex char
CALL PRTCHR ; print it
LD A,E ; get the low order hex char
CALL PRTCHR ; print it
POP DE ; restore DE
POP AF ; restore AF
RET ; done
;
; print the hex word value in bc
;
PRTHEXWORD:
PUSH AF
LD A,B
CALL PRTHEX
LD A,C
CALL PRTHEX
POP AF
RET
;
; print the hex dword value in de:hl
;
PRTHEX32:
PUSH BC
PUSH DE
POP BC
CALL PRTHEXWORD
PUSH HL
POP BC
CALL PRTHEXWORD
POP BC
RET
;
; Convert binary value in A to ascii hex characters in DE
;
HEXASCII:
LD D,A ; save A in D
CALL HEXCONV ; convert low nibble of A to hex
LD E,A ; save it in E
LD A,D ; get original value back
RLCA ; rotate high order nibble to low bits
RLCA
RLCA
RLCA
CALL HEXCONV ; convert nibble
LD D,A ; save it in D
RET ; done
;
; Convert low nibble of A to ascii hex
;
HEXCONV:
AND $0F ; low nibble only
ADD A,$90
DAA
ADC A,$40
DAA
RET
;
; Print value of A or HL in decimal with leading zero suppression
; Use prtdecb for A or prtdecw for HL
;
PRTDECB:
PUSH HL
LD H,0
LD L,A
CALL PRTDECW ; print it
POP HL
RET
;
PRTDECW:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL PRTDEC0
POP HL
POP DE
POP BC
POP AF
RET
;
PRTDEC0:
LD E,'0'
LD BC,-10000
CALL PRTDEC1
LD BC,-1000
CALL PRTDEC1
LD BC,-100
CALL PRTDEC1
LD C,-10
CALL PRTDEC1
LD E,0
LD C,-1
PRTDEC1:
LD A,'0' - 1
PRTDEC2:
INC A
ADD HL,BC
JR C,PRTDEC2
SBC HL,BC
CP E
RET Z
LD E,0
CALL PRTCHR
RET
;
; Start a new line
;
CRLF2:
CALL CRLF ; two of them
CRLF:
PUSH AF ; preserve AF
LD A,13 ; <CR>
CALL PRTCHR ; print it
LD A,10 ; <LF>
CALL PRTCHR ; print it
POP AF ; restore AF
RET
;
; ADD HL,A
;
; A REGISTER IS DESTROYED!
;
ADDHLA:
ADD A,L
LD L,A
RET NC
INC H
RET
;
ERRBIO: ; Invalid BIOS or version
LD DE,MSGBIO
@ -712,28 +509,28 @@ CFGSIZ .EQU 8
CFGTBL: ; PLT RSEL RDAT RIN Z180 ACR
; DESC
.DB $01, $9A, $9B, $9A, $FF, $9C ; SBC W/ SCG
.DW HWSTR_SCG
;
.DW HWSTR_SCG
;
.DB $04, $9C, $9D, $9C, $40, $FF ; N8 W/ ONBOARD PSG
.DW HWSTR_N8
;
.DW HWSTR_N8
;
.DB $05, $9A, $9B, $9A, $40, $9C ; MK4 W/ SCG
.DW HWSTR_SCG
;
.DW HWSTR_SCG
;
.DB $07, $D8, $D0, $D8, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (EB)
.DW HWSTR_RCEB
;
.DW HWSTR_RCEB
;
.DB $07, $D1, $D0, $D0, $FF, $FF ; RCZ80 W/ RC SOUND MODULE (MF)
.DW HWSTR_RCMF
;
;
.DB $08, $68, $60, $68, $C0, $FF ; RCZ180 W/ RC SOUND MODULE (EB)
.DW HWSTR_RCEB
;
.DW HWSTR_RCEB
;
.DB $08, $61, $60, $60, $C0, $FF ; RCZ180 W/ RC SOUND MODULE (MF)
.DW HWSTR_RCMF
;
.DB $09, $D8, $D0, $D8, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB)
.DW HWSTR_RCEB
.DW HWSTR_RCEB
;
.DB $09, $D1, $D0, $D0, $FF, $FF ; EZZ80 W/ RC SOUND MODULE (EB)
.DW HWSTR_RCMF
@ -765,15 +562,17 @@ CMRSAV .DB 0 ; for saving original Z180 CMR value
;
DMA .DW 0 ; Working DMA
FILTYP .DB 0 ; Sound file type (TYPPT2, TYPPT3, TYPMYM)
;
TMP .DB 0 ; work around use of undocumented Z80
;
MSGBAN .DB "Tune Player for RomWBW v2.5, 29-Mar-2020",0
TMP .DB 0 ; work around use of undocumented Z80
HBIOSOPT: .DB "--HBIOS", 0
HBIOSMD .DB 0 ; NON-ZERO IF USING HBIOS SOUND DRIVER, ZERO OTHERWISE
MSGBAN .DB "Tune Player for RomWBW v3.1, 25-Apr-2020",0
MSGUSE .DB "Copyright (C) 2020, Wayne Warthen, GNU GPL v3",13,10
.DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10
.DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10
.DB "Usage: TUNE <filename>.[PT2|PT3|MYM]",0
.DB "Usage: TUNE <filename>.[PT2|PT3|MYM] [--hbios]",0
MSGBIO .DB "Incompatible BIOS or version, "
.DB "HBIOS v", '0' + RMJ, ".", '0' + RMN, " required",0
MSGPLT .DB "Hardware error, system not supported!",0
@ -785,11 +584,14 @@ MSGTIM .DB ", timer mode",0
MSGDLY .DB ", delay mode",0
MSGPLY .DB "Playing...",0
MSGEND .DB " Done",0
MSGERR .DB "App Error", 0
;
HWSTR_SCG .DB "SCG ECB Board",0
HWSTR_N8 .DB "N8 Onboard Sound",0
HWSTR_RCEB .DB "RC2014 Sound Module (EB)",0
HWSTR_RCMF .DB "RC2014 Sound Module (MF)",0
MSGUNSUP .db "MYM FILES NOT SUPPORTED YET\r\n", 0
;
;===============================================================================
; PTx Player Routines
@ -799,23 +601,6 @@ HWSTR_RCMF .DB "RC2014 Sound Module (MF)",0
;(c)2004-2007 S.V.Bulba <vorobey@mail.khstu.ru>
;http://bulba.untergrund.net (http://bulba.at.kz)
;Release number
;Release .EQU "1"
#DEFINE Release "1"
;Conditional assembly
;1) Version of ROUT (ZX or MSX standards)
ZX .EQU 0
MSX .EQU 0
WBW .EQU 1
;2) Current position counter at (START+11)
CurPosCounter .EQU 0
;3) Allow channels allocation bits at (START+10)
ACBBAC .EQU 0
;4) Allow loop checking and disabling
LoopChecker .EQU 1
;5) Insert official identificator
Id .EQU 1
;Features
;--------
@ -843,7 +628,7 @@ Id .EQU 1
;into RAM or INIT subprogram was not called before.
;Call MUTE or INIT one more time to mute sound after stopping
;playing
;playing
;ORG $C000
;Test codes (commented)
@ -1128,7 +913,7 @@ TP_2 LD A,H
#IF CurPosCounter
LD (CurPos),A
#ENDIF
#ENDIF
LD HL,VARS
@ -1441,7 +1226,7 @@ PD_VOL RRCA
RRCA
LD (IX-12+Volume),A
JR PD_LP2
PD_EOff LD (IX-12+Env_En),A
LD (IX-12+PsInOr),A
JR PD_LP2
@ -1660,7 +1445,7 @@ C_DELAY LD A,(BC)
INC BC
LD (Delay),A
RET
SETENV LD (IX-12+Env_En),E
LD (AYREGS+EnvTp),A
LD A,(BC)
@ -1783,7 +1568,7 @@ CH_SMPS LD (IX+PsInSm),A
;Convert PT2 sample to PT3
;PT2 PT3
SamCnv POP HL ;BIT 2,C JR e_
POP HL
POP HL
LD H,B
JR NZ,$+8
EX DE,HL
@ -2130,14 +1915,14 @@ RxCA2 OR E
ABC
#ENDIF
#IF ZX
#IF _ZX
XOR A
LD DE,$FFBF
LD BC,$FFFD
LD HL,AYREGS
LOUT OUT (C),A
LD B,E
OUTI
OUTI
LD B,D
INC A
CP 13
@ -2151,14 +1936,14 @@ LOUT OUT (C),A
RET
#ENDIF
#IF MSX
#IF _MSX
;MSX version of ROUT (c)Dioniso
XOR A
LD C,$A0
LD HL,AYREGS
LOUT OUT (C),A
INC C
OUTI
OUTI
DEC C
INC A
CP 13
@ -2172,32 +1957,113 @@ LOUT OUT (C),A
RET
#ENDIF
#IF WBW
#IF _WBW
ISHBIOS
JR NZ, PLAYVIAHBIOS
DI
CALL SLOWIO
LD DE,(PORTS) ; D := RDAT, E := RSEL
XOR A ; start with reg 0
LD C,E ; point to address port
LD HL,AYREGS ; start of value list
LOUT OUT (C),A ; select register
LD C,D ; point to data port
OUTI ; write (HL) to data port, bump HL
LD C,E ; point to address port
INC A ; next register
CP 13 ; reg 13?
JR NZ,LOUT ; if not, loop
OUT (C),A ; select register 13
LD A,(HL) ; get value for register 13
AND A ; set flags
JP M,LOUT2 ; if bit 7 set, return w/o writing value
LD C,D ; select data port
OUT (C),A ; write value to register 13
CALL SLOWIO
LD DE, (PORTS) ; D := RDAT, E := RSEL
XOR A ; START WITH REG 0
LD C, E ; POINT TO ADDRESS PORT
LD HL, AYREGS ; START OF VALUE LIST
LOUT OUT (C), A ; SELECT REGISTER
LD C, D ; POINT TO DATA PORT
OUTI ; WRITE (HL) TO DATA PORT, BUMP HL
LD C, E ; POINT TO ADDRESS PORT
INC A ; NEXT REGISTER
CP 13 ; REG 13?
JR NZ, LOUT ; IF NOT, LOOP
OUT (C), A ; SELECT REGISTER 13
LD A, (HL) ; GET VALUE FOR REGISTER 13
AND A ; SET FLAGS
JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE
LD C, D ; SELECT DATA PORT
OUT (C), A ; WRITE VALUE TO REGISTER 13
LOUT2
CALL NORMIO
CALL NORMIO
EI
RET ; And done
RET ; AND DONE
PLAYVIAHBIOS:
LD B, BF_SNDVOL
LD C, 0
LD H, 0
LD A, (AYREGS + AmplA)
AND $0F
rlca
rlca
rlca
rlca
LD L, A
RST 08
LD B, BF_SNDPIT
LD C, 0
LD HL, (AYREGS+TonA)
ld a, h
AND $3F
LD H, A
RST 08
LD B, BF_SNDPLAY
LD C, 0
LD D, 0
RST 08
LD B, BF_SNDVOL
LD C, 0
LD H, 0
LD A, (AYREGS + AmplB)
AND $0F
rlca
rlca
rlca
rlca
LD L, A
RST 08
LD B, BF_SNDPIT
LD C, 0
LD HL, (AYREGS+TonB)
ld a, h
AND $3F
LD H, A
RST 08
LD B, BF_SNDPLAY
LD C, 0
LD D, 1
RST 08
LD B, BF_SNDVOL
LD C, 0
LD H, 0
LD A, (AYREGS + AmplC)
AND $0F
rlca
rlca
rlca
rlca
LD L, A
RST 08
LD B, BF_SNDPIT
LD C, 0
LD HL, (AYREGS+TonC)
ld a, h
AND $3F
LD H, A
RST 08
LD B, BF_SNDPLAY
LD C, 0
LD D, 2
RST 08
RET
#ENDIF
#IF ACBBAC
CHTABLE .EQU $-4
.DB 4,5,15,%001001,0,7,7,%100100
@ -2518,7 +2384,7 @@ endext: ld (dest1),ix
ld bc,(rows)
or a
sbc hl,bc
; jr c,noend ; If rows>played rows then exit
; exx ; Otherwise restart
; ld e,1
@ -2553,9 +2419,16 @@ zero: djnz onebit
ret
; *** Update PSG registers
upsg: ld a,(WMOD) ; if WMOD = 1, CPU is z180
upsg:
ISHBIOS
JR Z, upsg0
ERRWITHMSG(MSGERR)
upsg0:
ld a,(WMOD) ; if WMOD = 1, CPU is z180
or a ; set flags
jr z,upsg1 ; skip z180 stuff
di
call SLOWIO
@ -2563,29 +2436,29 @@ upsg1: ld hl,(psource)
ld de,(PORTS) ; E := RSEL, D := RDAT
xor a
psglp: ld c,e ; C := RSEL
out (c),a ; Select register
ld c,d ; C := RDAT
psglp: ld c, e ; C := RSEL
out (c), a ; Select register
ld c, d ; C := RDAT
outi ; Set register value
inc a ; Next register
ld bc,(3*FRAG)-1 ; Bytes to skip before next reg-1
add hl,bc ; Update HL
cp REGS-1 ; Check for next to last register?
jr nz,psglp ; If not, loop
inc a ; Next register
ld bc, (3 * FRAG) - 1 ; Bytes to skip before next reg-1
add hl, bc ; Update HL
cp REGS-1 ; Check for next to last register?
jr nz,psglp ; If not, loop
ld a,$FF ; Prepare to check for $FF value
ld a, $FF ; Prepare to check for $FF value
cp (hl) ; If last reg (13) is $FF
jr z,notrig ; ... then don't output
ld a,13 ; Register 13
ld c,e ; C := RSEL
out (c),a ; Select register
ld c,d ; C := RDAT
jr z, notrig ; ... then don't output
ld a, 13 ; Register 13
ld c, e ; C := RSEL
out (c), a ; Select register
ld c, d ; C := RDAT
outi ; Set register value
notrig: ld hl,(psource)
notrig: ld hl,(psource)
inc hl
ld (psource),hl
ld a,(played)
or a
jr z,endint
@ -2593,9 +2466,10 @@ notrig: ld hl,(psource)
ld (played),a
endint: call NORMIO
ei
ei
ret ; And done
;
; *** Program data
played .db 0 ; VBI counter
dest1 .dw 0 ; Uncompress destination 1

33
Source/Apps/Tune/cli.inc

@ -0,0 +1,33 @@
CLI_ABRT_IF_OPT_FIRST:
LD A, (FCB+1)
CP '-' ; OPTION FIRST OR - MISSING FILENAME?
JP Z, ERRCMD ; SHOW USAGE
RET
CLI_HAVE_HBIOS_SWITCH:
LD HL, CLIARGS ; TEST FOR --HBIOS ON COMNMAND LINE
LD DE, HBIOSOPT
CALL STRINDEX
JR NZ, CLI_HAVE_HBIOS_SWITCH1
OR $FF ; IS NOT HBIOS
LD (HBIOSMD), A
RET
CLI_HAVE_HBIOS_SWITCH1:
AND 0 ; IS HBIOS
LD (HBIOSMD), A
RET
CLI_ABRT_UNSUPPFILTYP:
PUSH AF
ISHBIOS
JR Z, CLI_ABRT_UNSUPPFILTYP1
POP AF
CP TYPMYM
RET NZ
ERRWITHMSG(MSGUNSUP) ; EXIT WITH UNSUPPORTED FILE TYPE MESSAGE
CLI_ABRT_UNSUPPFILTYP1:
POP AF
RET

4
Source/Apps/Tune/cpm.inc

@ -0,0 +1,4 @@
CLIARGS .EQU $81
RESTART .EQU $0000 ; CP/M restart vector
BDOS .EQU $0005 ; BDOS invocation vector
FCB .EQU $5C ; Location of default FCB

15
Source/Apps/Tune/hbios.inc

@ -0,0 +1,15 @@
IDENT .EQU $FFFE ; loc of RomWBW HBIOS ident ptr
;
RMJ .EQU 3 ; intended CBIOS version - major
RMN .EQU 1 ; intended CBIOS version - minor
;
BF_SYSVER .EQU $F1 ; BIOS: VER function
BF_SYSGET .EQU $F8 ; HBIOS: SYSGET function
;
BF_SND .EQU $50
BF_SNDRESET .EQU BF_SND + 0 ; RESET SOUND SYSTEM
BF_SNDVOL .EQU BF_SND + 1 ; REQUEST SOUND VOL - D IS CHANNEL, E CONTAINS VOLUME (255 MAX, 0 SILENT) - SCALED AS REQUIRED BY DRIVER (EG: MAPS TO JUST 4 BIT RESOLUTION FOR SN76489)
BF_SNDPIT .EQU BF_SND + 2 ; REQUEST SOUND PITCH - D IS CHANNEL, HL CONTAINS PITCH (0 LOWEST NOTE, FFFF HIGHEST NOTE) - SCALED BY DRIVER (EG: MAPS TO JUST 10 BITS FOR SN76489 )
BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND
BF_SNDQUERY .EQU BF_SND + 5 ; D IS CHANNEL, E IS SUBCOMMAND

175
Source/Apps/Tune/printing.inc

@ -0,0 +1,175 @@
;
; Print character in A without destroying any registers
;
PRTCHR:
PUSH BC ; save registers
PUSH DE
PUSH HL
LD E,A ; character to print in E
LD C,$02 ; BDOS function to output a character
CALL BDOS ; do it
POP HL ; restore registers
POP DE
POP BC
RET
;
PRTDOT:
;
; shortcut to print a dot preserving all regs
PUSH AF ; save af
LD A,'.' ; load dot char
CALL PRTCHR ; print it
POP AF ; restore af
RET ; done
;
PRTCR:
;
; shortcut to print a dot preserving all regs
PUSH AF ; save af
LD A,13 ; load CR value
CALL PRTCHR ; print it
POP AF ; restore af
RET ; done
;
; Print a zero terminated string at (DE) without destroying any registers
;
PRTSTR:
PUSH DE
;
PRTSTR1:
LD A,(DE) ; get next char
OR A
JR Z,PRTSTR2
CALL PRTCHR
INC DE
JR PRTSTR1
;
PRTSTR2:
POP DE ; restore registers
RET
;
; Print the value in A in hex without destroying any registers
;
PRTHEX:
PUSH AF ; save AF
PUSH DE ; save DE
CALL HEXASCII ; convert value in A to hex chars in DE
LD A,D ; get the high order hex char
CALL PRTCHR ; print it
LD A,E ; get the low order hex char
CALL PRTCHR ; print it
POP DE ; restore DE
POP AF ; restore AF
RET ; done
;
; print the hex word value in bc
;
PRTHEXWORD:
PUSH AF
LD A,B
CALL PRTHEX
LD A,C
CALL PRTHEX
POP AF
RET
;
; print the hex dword value in de:hl
;
PRTHEX32:
PUSH BC
PUSH DE
POP BC
CALL PRTHEXWORD
PUSH HL
POP BC
CALL PRTHEXWORD
POP BC
RET
;
; Convert binary value in A to ascii hex characters in DE
;
HEXASCII:
LD D,A ; save A in D
CALL HEXCONV ; convert low nibble of A to hex
LD E,A ; save it in E
LD A,D ; get original value back
RLCA ; rotate high order nibble to low bits
RLCA
RLCA
RLCA
CALL HEXCONV ; convert nibble
LD D,A ; save it in D
RET ; done
;
; Convert low nibble of A to ascii hex
;
HEXCONV:
AND $0F ; low nibble only
ADD A,$90
DAA
ADC A,$40
DAA
RET
;
; Print value of A or HL in decimal with leading zero suppression
; Use prtdecb for A or prtdecw for HL
;
PRTDECB:
PUSH HL
LD H,0
LD L,A
CALL PRTDECW ; print it
POP HL
RET
;
PRTDECW:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL PRTDEC0
POP HL
POP DE
POP BC
POP AF
RET
;
PRTDEC0:
LD E,'0'
LD BC,-10000
CALL PRTDEC1
LD BC,-1000
CALL PRTDEC1
LD BC,-100
CALL PRTDEC1
LD C,-10
CALL PRTDEC1
LD E,0
LD C,-1
PRTDEC1:
LD A,'0' - 1
PRTDEC2:
INC A
ADD HL,BC
JR C,PRTDEC2
SBC HL,BC
CP E
RET Z
LD E,0
CALL PRTCHR
RET
;
; Start a new line
;
CRLF2:
CALL CRLF ; two of them
CRLF:
PUSH AF ; preserve AF
LD A,13 ; <CR>
CALL PRTCHR ; print it
LD A,10 ; <LF>
CALL PRTCHR ; print it
POP AF ; restore AF
RET

39
Source/Apps/Tune/strings.inc

@ -0,0 +1,39 @@
STRINDEX: ; SEARCH FOR STRING AT DE WITHIN STRING AT HL
LD B, 0
LD C, 0
TRYNEXT:
PUSH HL
PUSH DE
CALL STRCMP
POP DE
POP HL
RET Z
INC HL
INC BC
LD A, (HL)
OR A
JR NZ, TRYNEXT
OR $FF ; RETURN NZ
RET
STRCMP: ; COMPARE STRING AT HL WITH DE - RETURN Z IF LIKE
LD A, (DE)
OR A
RET Z
LD B, A
LD A, (HL)
OR A
JR NZ, STRCMP1
OR $FF ; END OF STRING HL - SO NOT FOUND
RET
STRCMP1
CP B
RET NZ
INC HL
INC DE
JR STRCMP

60
Source/Apps/Tune/timing.inc

@ -0,0 +1,60 @@
;
; Wait for quark play time. Can use hardware timer if
; supported by hardware or simple delay loop otherwise.
; Delay loop requires QDLY to be pre-set to to achieve
; optimal 20ms wait time.
;
WAITQ LD A,(WMOD) ; Get delay mode
OR A ; Set flags
JR Z,DLY ; Delay mode
;
; Timer loop
CALL TIM2 ; Read timer LSB into A
LD C,A ; Init prev value
TIM1 PUSH BC ; Save prev value
CALL TIM2 ; Read timer LSB into A
POP BC ; Recover prev value
CP C ; Compare to prev
RET NZ ; Done if changed
JR TIM1 ; Else, loop
;
TIM2 LD B,$F8 ; BIOS SYSGET function
LD C,$D0 ; TIMER sub-function
RST 08 ; Call BIOS
LD A,L ; MSB to A
RET ; Return to loop
;
; Delay spin loop (40 tstates per loop)
DLY LD BC,(QDLY) ; Load quark delay factor
DLY1 DEC BC ; [6]
NOP ; [4]
NOP ; [4]
NOP ; [4]
NOP ; [4]
LD A,B ; [4]
OR C ; [4]
JP NZ,DLY1 ; [10]
RET
;
; Test for timer running to determine if it can be used for delay
; Return string message in DE
; Assigned (WMOD) with 0 if no hardware time, 1 if hardware timer found
;
PROBETIMER:
LD B,BF_SYSGET ; HBIOS: GET function
LD C,$D0 ; TIMER subfunction
RST 08 ; DE:HL := current tick count
LD A,L ; DE:HL == 0?
OR H
OR E
OR D
LD A,0 ; Assume no timer
LD DE,MSGDLY ; Delay mode msg
JR Z,SETDLY ; If tick count is zero, no timer active
LD A,$FF ; Value for timer active
LD DE,MSGTIM ; Timer mode msg
SETDLY:
LD (WMOD),A ; Save wait mode
RET

4
Source/Apps/Tune/tune.inc

@ -0,0 +1,4 @@
#DEFINE ISHBIOS LD A, (HBIOSMD) \ OR A
#DEFINE PRTSTRDE(X) LD DE, X \ CALL PRTSTR
#DEFINE PRTCRLF CALL CRLF
#DEFINE ERRWITHMSG(X) LD DE, X \ JP ERR

42
Source/CBIOS/cbios.asm

@ -2045,7 +2045,7 @@ DEV_INIT:
; PATCH IN CRT: DEVICE
LD A,(HCB + HCB_CRTDEV) ; GET CONSOLE DEVICE
CP $FF ; NUL MEANS NO CRT DEVICE
JR Z,DEV_INIT00 ; IF SO, LEAVE IT ALONE
JR Z,DEV_INIT000 ; IF SO, LEAVE IT ALONE
LD (DEVMAP + 1),A ; CONSOLE CRT
LD (DEVMAP + 13),A ; LIST CRT
;
@ -2054,31 +2054,43 @@ DEV_INIT:
LD B,A ; SAVE IN B
LD A,(HCB + HCB_CONDEV) ; GET CONSOLE DEVICE
CP B ; COMPARE
JR NZ,DEV_INIT00 ; IF DIFFERENT (CRT NOT ACTIVE), LEAVE IOBYTE ALONE
JR NZ,DEV_INIT000 ; IF DIFFERENT (CRT NOT ACTIVE), LEAVE IOBYTE ALONE
LD A,1 ; IF SAME (CRT ACTIVE), SET IOBYTE FOR CON: = CRT:
LD (IOBYTE),A ; STORE IN IOBYTE
LD HL,DEV_INIT1 ; INIT FIRST DEV ASSIGN ADR
JR DEV_INIT00 ; SKIP AHEAD
;
DEV_INIT000:
; CONSOLE IS NOT THE CRT, SO
; ASSIGN CURRENT CONSOLE AS TTY
LD A,(HCB + HCB_CONDEV) ; GET CONSOLE DEVICE
CALL DEV_INIT1 ; ASSIGN AS TTY
;
DEV_INIT00:
; LOOP THRU DEVICES ADDING NON-CRT DEVICES TO DEVMAP
; LOOP THRU DEVICES ADDING DEVICES TO DEVMAP
; CONSOLE DEVICE WAS ALREADY DONE, SO IT IS SKIPPED HERE
LD B,BF_SYSGET ; HBIOS FUNC: GET SYS INFO
LD C,BF_SYSGET_CIOCNT ; SUBFUNC: GET CIO UNIT COUNT
RST 08 ; E := SERIAL UNIT COUNT
LD B,E ; COUNT TO B
LD C,0 ; UNIT INDEX
LD HL,DEV_INIT1 ; POINTER FOR FIRST ENTRY FOUND
DEV_INIT0:
PUSH BC ; SAVE LOOP CONTROL
PUSH HL ; SAVE TARGET
LD B,BF_CIODEVICE ; HBIOS FUNC: GET DEVICE INFO
RST 08 ; D := DEVICE TYPE, E := PHYSICAL UNIT NUMBER
POP HL ; RESTORE TARGET
LD A,D ; DEVICE TYPE TO A
; FIX: BELOW SHOULD TEST THE "TERMINAL" BIT INSTEAD OF CHECKING DEVICE NUMBER
CP CIODEV_TERM ; COMPARE TO FIRST VIDEO DEVICE
POP BC ; RESTORE LOOP CONTROL
;PUSH BC ; SAVE LOOP CONTROL
;PUSH HL ; SAVE TARGET
;LD B,BF_CIODEVICE ; HBIOS FUNC: GET DEVICE INFO
;RST 08 ; D := DEVICE TYPE, E := PHYSICAL UNIT NUMBER
;POP HL ; RESTORE TARGET
;LD A,D ; DEVICE TYPE TO A
;; FIX: BELOW SHOULD TEST THE "TERMINAL" BIT INSTEAD OF CHECKING DEVICE NUMBER
;CP CIODEV_TERM ; COMPARE TO FIRST VIDEO DEVICE
;POP BC ; RESTORE LOOP CONTROL
;LD A,C ; UNIT INDEX TO ACCUM
;;CALL C,JPHL ; DO IT IF DEVICE TYPE < VDU
LD A,(HCB + HCB_CONDEV) ; CURRENT CONSOLE UNIT
CP C ; IS CURRENT CONSOLE?
LD A,C ; UNIT INDEX TO ACCUM
;CALL C,JPHL ; DO IT IF DEVICE TYPE < VDU
CALL JPHL ; DO FOR ANY CHARACTER DEVICE TYPE
CALL NZ,JPHL ; DO IF NOT CURRENT CONSOLE
INC C ; NEXT UNIT
DJNZ DEV_INIT0 ; LOOP TILL DONE
RET ; ALL DONE

1
Source/HBIOS/cfg_dyno.asm

@ -90,6 +90,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

1
Source/HBIOS/cfg_ezz80.asm

@ -115,6 +115,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

1
Source/HBIOS/cfg_master.asm

@ -152,6 +152,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG/N8]
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;

1
Source/HBIOS/cfg_mk4.asm

@ -107,6 +107,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8]
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;

1
Source/HBIOS/cfg_n8.asm

@ -110,6 +110,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG/N8]
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;

1
Source/HBIOS/cfg_rcz180.asm

@ -118,6 +118,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

1
Source/HBIOS/cfg_rcz80.asm

@ -124,6 +124,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

1
Source/HBIOS/cfg_sbc.asm

@ -111,6 +111,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8]
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43]
;

1
Source/HBIOS/cfg_scz180.asm

@ -113,6 +113,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

1
Source/HBIOS/cfg_zeta.asm

@ -88,6 +88,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

1
Source/HBIOS/cfg_zeta2.asm

@ -98,6 +98,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM)
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM)
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM)
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM)
TMSTIMENABLE .EQU FALSE ; TMS: INTERRUPTS NOT ENABLED
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM)
;
SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM)

2
Source/HBIOS/cvdu.asm

@ -96,7 +96,7 @@ CVDU_FNTBL:
.DW KBD_READ
#IF (($ - CVDU_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID CVDU FUNCTION TABLE ***\n"
FAIL
!!!!!
#ENDIF
CVDU_VDAINI:

4
Source/HBIOS/hbios.asm

@ -1255,6 +1255,7 @@ HB_CPU2:
;
#ENDIF
;
;
; INITIALIZE HEAP STORAGE
;
; INITIALIZE POINTERS
@ -1654,6 +1655,9 @@ HB_PCINITTBL:
#IF (UFENABLE)
.DW UF_PREINIT
#ENDIF
#IF (TMSENABLE)
.DW TMS_PREINIT
#ENDIF
HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2)
;==================================================================================================

12
Source/HBIOS/romldr.asm

@ -282,7 +282,7 @@ runcmd:
cp 'R' ; R = reboot system
jp z,reboot ; if so, do it
#if (BIOS == BIOS_WBW)
cp 'C' ; C = set console unit
cp 'I' ; C = set console interface
jp z,setcon ; if so, do it
#endif
;
@ -426,7 +426,7 @@ devlst:
call pstr ; display it
jp prtall ; do it
;
; Set console unit
; Set console interface unit
;
#if (BIOS == BIOS_WBW)
;
@ -462,6 +462,12 @@ setcon:
ld e,a ; Char unit value
ld hl,HCB_LOC + HCB_CONDEV ; Con unit num in HCB
rst 08 ; do it
;
; Display loader prompt on new console
call nl2 ; formatting
ld hl,str_banner ; display boot banner
call pstr ; do it
;
ret ; done
;
#endif
@ -1489,7 +1495,7 @@ str_help .db "\r\n"
.db "\r\n D - Disk Device Inventory"
.db "\r\n R - Reboot System"
#if (BIOS == BIOS_WBW)
.db "\r\n C <u> - Set Console Unit"
.db "\r\n I <u> - Set Console Interface"
#endif
.db "\r\n <u>[.<s>] - Boot Disk Unit/Slice"
.db 0

2
Source/HBIOS/sn76489.asm

@ -304,7 +304,7 @@ SN7_FNTBL:
#IF (($ - SN7_FNTBL) != (SND_FNCNT * 2))
.ECHO "*** INVALID SND FUNCTION TABLE ***\n"
FAIL
!!!!!
#ENDIF
PENDING_PITCH

1
Source/HBIOS/std.asm

@ -186,6 +186,7 @@ AYMODE_RCZ180 .EQU 4 ; RC2014 SOUND MODULE BY ED BRINDLEY ON Z180
TMSMODE_NONE .EQU 0
TMSMODE_SCG .EQU 1 ; SCG ECB BOARD
TMSMODE_N8 .EQU 2 ; N8 BUILT-IN VIDEO
TMSMODE_RC .EQU 3 ; RC2014 BUILT-IN VIDEO
;
; SERIAL DEVICE CONFIGURATION CONSTANTS
;

88
Source/HBIOS/tms.asm

@ -14,6 +14,24 @@
; TMS DRIVER - CONSTANTS
;======================================================================
;
TMSCTRL1: .EQU 1 ; CONTROL BITS
TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT
#IF TMSTIMENABLE
.ECHO "TMS INTERRUPTS ENABLED"
#ENDIF
#IF (TMSMODE == TMSMODE_RC)
TMS_DATREG .EQU $BE ; READ/WRITE DATA
TMS_CMDREG .EQU $BF ; READ STATUS / WRITE REG SEL
TMS_PPIA .EQU 0 ; PPI PORT A
TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
#ENDIF
#IF (TMSMODE == TMSMODE_N8)
TMS_DATREG .EQU $98 ; READ/WRITE DATA
@ -62,6 +80,14 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
; TMS DRIVER - INITIALIZATION
;======================================================================
;
TMS_PREINIT:
; DISABLE INTERRUPT GENERATION
LD A, (TMS_INIT9918_REG_1)
RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT
LD (TMS_INIT9918_REG_1), A
LD C, TMSCTRL1
JP TMS_SET
;
TMS_INIT:
#IF (CPUFAM == CPU_Z180)
CALL TMS_Z180IO
@ -93,6 +119,17 @@ TMS_INIT1:
#IF (TMSMODE == TMSMODE_N8)
CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER
#ENDIF
#IF (INTMODE == 1 & TMSTIMENABLE)
; ADD IM1 INT CALL LIST ENTRY
LD HL, TMS_TSTINT ; GET INT VECTOR
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
LD A, (TMS_INIT9918_REG_1)
SET TMSINTEN, A ; SET INTERRUPT ENABLE BIT
LD (TMS_INIT9918_REG_1), A
LD C, TMSCTRL1
CALL TMS_SET
#ENDIF
;
; ADD OURSELVES TO VDA DISPATCH TABLE
LD BC,TMS_FNTBL ; BC := FUNCTION TABLE ADDRESS
@ -107,7 +144,13 @@ TMS_INIT1:
;
XOR A ; SIGNAL SUCCESS
RET
;
#IF TMSTIMENABLE
; DISABLE INTERRUPT
TMS_INT_DIS:
#ENDIF
;
;======================================================================
; TMS DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
;======================================================================
@ -136,7 +179,7 @@ TMS_FNTBL:
#ENDIF
#IF (($ - TMS_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID TMS FUNCTION TABLE ***\n"
FAIL
!!!!!
#ENDIF
TMS_VDAINI:
@ -170,19 +213,19 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION
DEC A
LD (TMS_CURSAV),A
CALL TMS_SETCUR ; SET CURSOR
XOR A ; SIGNAL SUCCESS
RET
TMS_VDADEV:
LD D,VDADEV_TMS ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
XOR A ; SIGNAL SUCCESS
RET
TMS_VDASCS:
CALL PANIC ; NOT IMPLEMENTED (YET)
TMS_VDASCP:
#IF (CPUFAM == CPU_Z180)
CALL TMS_Z180IO
@ -192,15 +235,15 @@ TMS_VDASCP:
CALL TMS_SETCUR
XOR A ; SIGNAL SUCCESS
RET
TMS_VDASAT:
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
RET
TMS_VDASCO:
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
RET
TMS_VDAWRC:
#IF (CPUFAM == CPU_Z180)
CALL TMS_Z180IO
@ -211,7 +254,7 @@ TMS_VDAWRC:
CALL TMS_SETCUR
XOR A ; SIGNAL SUCCESS
RET
TMS_VDAFIL:
#IF (CPUFAM == CPU_Z180)
CALL TMS_Z180IO
@ -239,7 +282,7 @@ TMS_VDACPY:
CALL TMS_SETCUR
XOR A
RET
TMS_VDASCR:
#IF (CPUFAM == CPU_Z180)
CALL TMS_Z180IO
@ -294,7 +337,7 @@ TMS_SET:
OUT (TMS_CMDREG),A ; WRITE IT
TMS_IODELAY
LD A,C ; GET THE DESIRED REGISTER
OR $80 ; SET BIT 7
OR $80 ; SET BIT 7
OUT (TMS_CMDREG),A ; SELECT THE DESIRED REGISTER
TMS_IODELAY
RET
@ -398,7 +441,7 @@ TMS_LOADFONT:
LD (TMS_STACK),SP ; SAVE STACK
LD HL,(TMS_STACK) ; AND SHIFT IT
LD DE,$2000 ; DOWN 4KB TO
CCF ; CREATE A
CCF ; CREATE A
SBC HL,DE ; DECOMPRESSION BUFFER
LD SP,HL ; HL POINTS TO BUFFER
EX DE,HL ; START OF STACK BUFFER
@ -597,7 +640,7 @@ TMS_SCROLL1:
INC DE
DJNZ TMS_SCROLL1
POP HL ; RECOVER THE DESTINATION
;
;
; WRITE THE BUFFERED LINE TO CURRENT DESTINATION
CALL TMS_WR ; SET UP TO WRITE
LD DE,TMS_BUF
@ -733,7 +776,7 @@ TMS_Z180IO:
OUT0 (Z180_DCNTL),A ; IMPLEMENT IT
POP AF ; RESTORE AF
; BACK TO CALLER
TMS_Z180IOR .EQU $+1
TMS_Z180IOR .EQU $+1
JP $0000 ; BACK TO CALLER
;
TMS_Z180IOX:
@ -745,6 +788,20 @@ TMS_Z180IOX:
RET ; DONE
;
#ENDIF
#IF (INTMODE == 1 & TMSTIMENABLE)
TMS_TSTINT:
IN A, (TMS_CMDREG) ; TEST FOR INT FLAG
AND $80
JR NZ, TMS_INTHNDL
AND $00 ; RETURN Z - NOT HANDLED
RET
TMS_INTHNDL:
CALL HB_TIMINT ; RETURN NZ - HANDLED
OR $FF
RET
#ENDIF
;
;==================================================================================================
; TMS DRIVER - DATA
@ -798,6 +855,7 @@ TMS_BUF .FILL 256,0 ; COPY BUFFER
;
TMS_INIT9918:
.DB $00 ; REG 0 - NO EXTERNAL VID
TMS_INIT9918_REG_1:
.DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1
.DB $00 ; REG 2 - PATTERN NAME TABLE := 0
.DB $00 ; REG 3 - NO COLOR TABLE

2
Source/HBIOS/vdu.asm

@ -150,7 +150,7 @@ VDU_FNTBL:
.DW PPK_READ
#IF (($ - VDU_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VDU FUNCTION TABLE ***\n"
FAIL
!!!!!
#ENDIF
VDU_VDAINI:

2
Source/HBIOS/vga.asm

@ -163,7 +163,7 @@ VGA_FNTBL:
.DW KBD_READ
#IF (($ - VGA_FNTBL) != (VDA_FNCNT * 2))
.ECHO "*** INVALID VGA FUNCTION TABLE ***\n"
FAIL
!!!!!
#ENDIF
VGA_VDAINI:

BIN
Source/Images/d_zsdos/u0/KERMIT.COM → Source/Images/d_cpm22/u0/KERCPM22.COM

Binary file not shown.

BIN
Source/Images/d_cpm22/u0/KERMIT.COM → Source/Images/d_cpm3/u0/KERCPM3.COM

Binary file not shown.

BIN
Source/Images/d_nzcom/u0/KERMIT.COM → Source/Images/d_nzcom/u0/KERCPM22.COM

Binary file not shown.

BIN
Source/Images/d_cpm3/u0/KERMIT.COM → Source/Images/d_zpm3/u15/kercpm3.com

Binary file not shown.

BIN
Source/Images/d_zpm3/u15/kermit.com → Source/Images/d_zsdos/u0/KERCPM22.COM

Binary file not shown.

20
Tools/Makefile.inc

@ -24,7 +24,7 @@ RELPATH := $(subst $(TREEROOT),,$(HERE))
#
# where's a copy of this tree for windows so we can diff binaries
#
WINROOT = $(TREEROOT)/../RomWBW.windows
WINROOT = $(TREEROOT)/../RomWBW.windows
DIFFTO := $(shell if [ -d $(WINROOT) ] ; then cd $(WINROOT); pwd; fi)
DIFFPATH := $(DIFFTO)/$(RELPATH)
@ -57,7 +57,7 @@ CPM=$(TOOLS)/cpm/bin
%.hex: %.asm
$(ZXCC) $(CPM)/MAC -$< -$$PO ; \
%.bin: %.ASM
$(ZXCC) $(CPM)/MAC -$< -$$PO
$(ZXCC) $(CPM)/MLOAD25 -tmp.bin=$*.hex
@ -67,7 +67,7 @@ CPM=$(TOOLS)/cpm/bin
%.com: %.z80
$(ZXCC) $(CPM)/Z80ASM -$(basename $<)/F ; \
mv $$($(CASEFN) $@) tmp.com ; mv tmp.com $@
%.bin: %.asm
$(TASM) $< $@
@ -77,10 +77,10 @@ CPM=$(TOOLS)/cpm/bin
%.rel: %.z80
$(ZXCC) $(CPM)/Z80ASM -$(basename $<)/MF
%.hex: %.180
%.hex: %.180
$(ZXCC) $(CPM)/SLR180 -$(basename $<)/HF
%.rel: %.azm
%.rel: %.azm
$(ZXCC) $(CPM)/ZSM =$<
%.bin: %.rel
@ -143,7 +143,7 @@ clobber:: clean
# the same objects
#
diff::
ifneq ($(DIFFTO),)
ifneq ($(DIFFTO),)
@for dir in $(SUBDIRS) ; do \
( echo "diff in $(HERE)/$$dir" ; cd "$$dir" ; make diff ) ; \
done
@ -166,8 +166,8 @@ ifneq ($(DIFFTO),)
if [ ! -f "$$df" ] ; then echo $(DIFFPATH)/$$i missing ; fi ; \
fi ; \
done
endif
vdiff:
make VERBOSEDIFF=2 diff
endif
vdiff:
make VERBOSEDIFF=2 diff

Loading…
Cancel
Save