Browse Source

Merge pull request #14 from b1ackmai1er/master

Add BASIC support through usage of empty ROM bank
pull/23/head
Wayne Warthen 7 years ago
committed by GitHub
parent
commit
2c5f0ee332
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      Source/HBIOS/Build.ps1
  2. 3
      Source/HBIOS/cfg_sbc.asm
  3. 4
      Source/HBIOS/hbios.asm
  4. 10
      Source/HBIOS/hbios.inc
  5. 12
      Source/HBIOS/imgpad.asm
  6. 12
      Source/HBIOS/imgpad0.asm
  7. 4424
      Source/HBIOS/nascom.asm
  8. 350
      Source/HBIOS/pio.asm
  9. 153
      Source/HBIOS/romldr.asm
  10. 20
      Source/HBIOS/std.asm
  11. 1795
      Source/HBIOS/tastybasic.asm

9
Source/HBIOS/Build.ps1

@ -163,6 +163,10 @@ Copy-Item '..\zsdos\zsdos.bin' 'zsdos.bin'
Asm 'dbgmon'
Asm 'prefix'
Asm 'romldr'
Asm 'nascom'
Asm 'tastybasic'
Asm 'imgpad'
Asm 'imgpad0'
if ($Platform -ne "UNA")
{
Asm 'hbios' '-dROMBOOT' -Output 'hbios_rom.bin' -List 'hbios_rom.lst'
@ -185,7 +189,8 @@ Concat 'prefix.bin','cpm.bin' 'cpm.sys'
Concat 'prefix.bin','zsys.bin' 'zsys.sys'
# Build 32K OS chunk containing the loader, debug monitor, and OS images
Concat 'romldr.bin', 'dbgmon.bin','cpm.bin','zsys.bin' osimg.bin
Concat 'romldr.bin', 'dbgmon.bin','cpm.bin','zsys.bin', 'imgpad.bin' osimg.bin
Concat 'nascom.bin', 'tastybasic.bin', 'imgpad0.bin' osimg1.bin
#
# Now the ROM disk image is created. This is done by starting with a
@ -229,7 +234,7 @@ if ($Platform -eq "UNA")
}
else
{
Concat 'hbios_rom.bin','osimg.bin','osimg.bin','osimg.bin',$RomDiskFile $RomFile
Concat 'hbios_rom.bin','osimg.bin','osimg1.bin','osimg.bin',$RomDiskFile $RomFile
Concat 'hbios_app.bin','osimg.bin' $ComFile
Concat 'hbios_img.bin','osimg.bin' $ImgFile
}

3
Source/HBIOS/cfg_sbc.asm

@ -92,3 +92,6 @@ ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABL
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
PIOENABLE .EQU FALSE ; TRUE FOR ZILOG PIO SUPPORT
PIOMODE .EQU PIOMODE_ZP ; PIOMODE_ZP=ECB-ZILOG PERIPHERALS BOARD PIOMODE_4P=ECB-4PIO

4
Source/HBIOS/hbios.asm

@ -1099,7 +1099,7 @@ INITSYS3:
;
#IFDEF ROMBOOT
; PERFORM BANK CALL TO OS IMAGES BANK IN ROM
LD A,BID_OSIMG ; CHAIN TO OS IMAGES BANK
LD A,BID_BIOSIMG ; CHAIN TO OS IMAGES BANK
LD HL,0 ; ENTER AT ADDRESS 0
CALL HBX_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK!
@ -1322,7 +1322,7 @@ CIO_ADDENT:
; WORD UNIT SPECIFIC DATA (TYPICALLY A DEVICE INSTANCE DATA ADDRESS)
;
CIO_FNCNT .EQU 7 ; NUMBER OF CIO FUNCS (FOR RANGE CHECK)
CIO_MAX .EQU 16 ; UP TO 16 UNITS
CIO_MAX .EQU 32 ; UP TO 32 UNITS
CIO_SIZ .EQU CIO_MAX * 4 ; EACH ENTRY IS 4 BYTES
;
.DB CIO_FNCNT ; CIO FUNCTION COUNT (FOR RANGE CHECK)

10
Source/HBIOS/hbios.inc

@ -83,7 +83,7 @@ BF_SYSINT_INFO .EQU $00 ; GET INTERRUPT SYSTEM INFO
BF_SYSINT_GET .EQU $10 ; GET INT VECTOR ADDRESS
BF_SYSINT_SET .EQU $20 ; SET INT VECTOR ADDRESS
;
; SERIAL DEVICE IDS
; CHAR DEVICE IDS
;
CIODEV_UART .EQU $00
CIODEV_ASCI .EQU $10
@ -93,6 +93,14 @@ CIODEV_PPPCON .EQU $40
CIODEV_SIO .EQU $50
CIODEV_ACIA .EQU $60
CIODEV_CONSOLE .EQU $D0
CIODEV_PIO .EQU $70
;
; SUB TYPES OF CHAR DEVICES
;
;00 RS-232
;01 TERMINAL
;02 PARALLEL PORT
;03 UNUSED
;
; DISK DEVICE IDS
;

12
Source/HBIOS/imgpad.asm

@ -0,0 +1,12 @@
#INCLUDE "std.asm"
;
SLACK .EQU ($8000-LDR_SIZ-MON_SIZ-SYS_SIZ-SYS_SIZ)
.FILL SLACK,00H
;
MON_STACK .EQU $
;
.ECHO "Padspace space created: "
.ECHO SLACK
.ECHO " bytes.\n"
.END

12
Source/HBIOS/imgpad0.asm

@ -0,0 +1,12 @@
#INCLUDE "std.asm"
;
SLACK .EQU ($8000-BAS_SIZ-TBC_SIZ)
.FILL SLACK,00H
;
MON_STACK .EQU $
;
.ECHO "Padspace space created: "
.ECHO SLACK
.ECHO " bytes.\n"
.END

4424
Source/HBIOS/nascom.asm

File diff suppressed because it is too large

350
Source/HBIOS/pio.asm

@ -0,0 +1,350 @@
PIO0A .EQU ; ECB-ZP
PIO0B .EQU ; ECB-ZP
PIO1A .EQU ; ECB-ZP
PIO1B .EQU ; ECB-ZP
PIO2A .EQU ; ECB-4PIO
PIO2B .EQU ; ECB-4PIO
PIO3A .EQU ; ECB-4PIO
PIO3B .EQU ; ECB-4PIO
PIO4A .EQU ; ECB-4PIO
PIO4B .EQU ; ECB-4PIO
PIO5A .EQU ; ECB-4PIO
PIO5B .EQU ; ECB-4PIO
PIO_Input .EQU $0000
PIO_Output .EQU $0001
PIO_BiDir .Equ $0002
DEFPIOCFGA .EQU $8000 + PIO_Input
DEFPIOCFGB .EQU $8000 + PIO_Output
DEFPIOCFGX .EQU $8000 + PIO_BiDir
PIO_NONE .EQU 0
PIO_ZPIO .EQU 1
PIO_8255 .EQU 2
;
PIO_PREINIT:
;
; SETUP THE DISPATCH TABLE ENTRIES
;
LD B,PIO_CNT ; LOOP CONTROL
LD C,0 ; PHYSICAL UNIT INDEX
XOR A ; ZERO TO ACCUM
LD (PIO_DEV),A ; CURRENT DEVICE NUMBER
PIO_PREINIT0:
PUSH BC ; SAVE LOOP CONTROL
LD A,C ; PHYSICAL UNIT TO A
RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES)
RLCA ; ...
RLCA ; ... TO GET OFFSET INTO CFG TABLE
LD HL,PIO_CFG ; POINT TO START OF CFG TABLE
CALL ADDHLA ; HL := ENTRY ADDRESS
PUSH HL ; SAVE IT
PUSH HL ; COPY CFG DATA PTR
POP IY ; ... TO IY
CALL PIO_INITUNIT ; HAND OFF TO GENERIC INIT CODE
POP DE ; GET ENTRY ADDRESS BACK, BUT PUT IN DE
POP BC ; RESTORE LOOP CONTROL
;
LD A,(IY+1) ; GET THE PIO TYPE DETECTED
OR A ; SET FLAGS
JR Z,PIO_PREINIT2 ; SKIP IT IF NOTHING FOUND
;
PUSH BC ; SAVE LOOP CONTROL
LD BC,PIO_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL NZ,CIO_ADDENT ; ADD ENTRY IF PIO FOUND, BC:DE
POP BC ; RESTORE LOOP CONTROL
;
PIO_PREINIT2:
INC C ; NEXT PHYSICAL UNIT
DJNZ PIO_PREINIT0 ; LOOP UNTIL DONE
;
;#IF (INTMODE == 1)
; ; ADD IM1 INT CALL LIST ENTRY IF APPROPRIATE
; LD A,(SIO_DEV) ; GET NEXT DEVICE NUM
; OR A ; SET FLAGS
; JR Z,PIO_PREINIT3 ; IF ZERO, NO SIO DEVICES
; LD HL,PIO_INT ; GET INT VECTOR
; CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
;#ENDIF
;
;#IF (INTMODE == 2)
; ; SETUP SIO INTERRUPT VECTOR IN IVT
; LD HL,INT_PIO
; LD (HBX_IVT + IVT_SER0),HL
;#ENDIF
;
PIO_PREINIT3:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
PIO_INITUNIT:
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
PIO_INIT:
LD B,PIO_CNT ; COUNT OF POSSIBLE SIO UNITS
LD C,0 ; INDEX INTO SIO CONFIG TABLE
PIO_INIT1:
PUSH BC ; SAVE LOOP CONTROL
LD A,C ; PHYSICAL UNIT TO A
RLCA ; MULTIPLY BY CFG TABLE ENTRY SIZE (8 BYTES)
RLCA ; ...
RLCA ; ... TO GET OFFSET INTO CFG TABLE
LD HL,PIO_CFG ; POINT TO START OF CFG TABLE
CALL ADDHLA ; HL := ENTRY ADDRESS
PUSH HL ; COPY CFG DATA PTR
POP IY ; ... TO IY
LD A,(IY+1) ; GET PIO TYPE
OR A ; SET FLAGS
CALL NZ,PIO_PRTCFG ; PRINT IF NOT ZERO
POP BC ; RESTORE LOOP CONTROL
INC C ; NEXT UNIT
DJNZ PIO_INIT1 ; LOOP TILL DONE
;
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
PIO_LPT:
IN A,($F6) ; get device status
AND $20 ; device ready?
JR Z,PIO_LPT ; no, busy wait
IN A,($F5) ; get transmit buffer register status ready?
AND $20 ; ready?
JR Z,PIO_LPT ; no, busy wait
LD A,C ; ready, char A for output through data port
OUT ($F0),A ; output char
RET
;
; PIO PORT TABLE
;
PIO_CFG:
; PIO CHANNEL A
.DB 0 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB PIOBASE+2 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGA ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 1 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB PIOBASE+3 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 2 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB PIOBASE+6 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGA ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 3 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB PIOBASE+7 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
; PIO CHANNEL A
.DB 4 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+2 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGX ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 5 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+3 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 6 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+6 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGA ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 7 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+7 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 8 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+10 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGA ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 9 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+11 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 10 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+14 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGA ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 11 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+15 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL A
.DB 12 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_ZPIO ; PIO TYPE (SET DURING INIT)
.DB 0 ; PIO CHANNEL (A)
.DB 4PIOBASE+14 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGA ; LINE CONFIGURATION
.DW SIOA_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
; PIO CHANNEL B
.DB 13 ; DEVICE NUMBER (SET DURING INIT)
.DB PIO_8255 ; PIO TYPE (SET DURING INIT)
.DB 1 ; PIO CHANNEL (B)
.DB 4PIOBASE+15 ; BASE PORT (CMD PORT)
.DW DEFPIOCFGB ; LINE CONFIGURATION
.DW SIOB_RCVBUF ; POINTER TO RCV BUFFER STRUCT
;
;
PIO_CNT .EQU ($ - PIO_CFG) / 8
;
; DRIVER FUNCTION TABLE
;
PIO_FNTBL:
.DW PIO_IN
.DW PIO_OUT
.DW PIO_IST
.DW PIO_OST
.DW PIO_INITDEV
.DW PIO_QUERY
.DW PIO_DEVICE
#IF (($ - PIO_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID SIO FUNCTION TABLE ***\n"
#ENDIF
;
PIO_OUT:
XOR A ; SIGNAL SUCCESS
RET
;
PIO_IN:
XOR A ; SIGNAL SUCCESS
RET
;
PIO_IST:
RET
;
PIO_OST:
RET
;
; PIO_INITDEV - Configure device.
; If DE = FFFF then extract the configuratio information from the table of devices and program the device using those settings.
; Otherwise use the configuration information in DE to program those settings and save them in the device table
PIO_INITDEV:
XOR A ; SIGNAL SUCCESS
RET
;
PIO_QUERY:
LD E,(IY+4) ; FIRST CONFIG BYTE TO E
LD D,(IY+5) ; SECOND CONFIG BYTE TO D
XOR A ; SIGNAL SUCCESS
RET
;
;
;TTY_DEVICE:
; LD D,CIODEV_TERM ; TYPE IS TERMINAL
; LD A,(TTY_DEVNUM) ; GET DEVICE NUMBER
; LD E,A ; PUT IT IN E
; LD A,(TTY_VDAUNIT) ; GET VDA UNIT NUM
; SET 7,A ; SET BIT 7 TO INDICATE TERMINAL TYPE
; LD C,A ; PUT IT IN C
; XOR A ; SIGNAL SUCCESS
; RET
;
;
PIO_DEVICE:
LD D,CIODEV_PIO ; D := DEVICE TYPE
LD E,(IY) ; E := PHYSICAL UNIT
LD A,E
SET 7,A
LD C,A
XOR A ; SIGNAL SUCCESS
RET
;
PIO_PRTCFG:
; ANNOUNCE PORT
CALL NEWLINE ; FORMATTING
PRTS("PIO$") ; FORMATTING
LD A,(IY) ; DEVICE NUM
CALL PRTDECB ; PRINT DEVICE NUM
PRTS(": IO=0x$") ; FORMATTING
LD A,(IY+3) ; GET BASE PORT
CALL PRTHEXBYTE ; PRINT BASE PORT
;
; PRINT THE PIO TYPE
CALL PC_SPACE ; FORMATTING
LD A,(IY+1) ; GET PIO TYPE BYTE
RLCA ; MAKE IT A WORD OFFSET
LD HL,PIO_TYPE_MAP ; POINT HL TO TYPE MAP TABLE
CALL ADDHLA ; HL := ENTRY
LD E,(HL) ; DEREFERENCE
INC HL ; ...
LD D,(HL) ; ... TO GET STRING POINTER
CALL WRITESTR ; PRINT IT
;
; ALL DONE IF NO PIO WAS DETECTED
LD A,(IY+1) ; GET SIO TYPE BYTE
OR A ; SET FLAGS
RET Z ; IF ZERO, NOT PRESENT
;
PRTS(" MODE=$") ; FORMATTING
LD E,(IY+4) ; LOAD CONFIG
LD D,(IY+5) ; ... WORD TO DE
CALL PS_PRTPC0 ; PRINT CONFIG
;
XOR A
RET
;
; WORKING VARIABLES
;
PIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT
;
PIO_TYPE_MAP:
.DW PIO_STR_NONE
.DW PIO_STR_PIO
.DW PIO_STR_8255
PIO_STR_NONE .DB "<NOT PRESENT>$"
PIO_STR_PIO .DB "Zilog PIO$"
PIO_STR_8255 .DB "i8255 PIO$"

153
Source/HBIOS/romldr.asm

@ -7,12 +7,37 @@
;
#INCLUDE "std.asm"
;
MONIMG .EQU $1000
CPMIMG .EQU $2000
ZSYSIMG .EQU $5000
; osimg.bin
;
;LDRIMG .EQU $0000 ;SIZE 0A00 > 0000-0A00
MONIMG .EQU $0A00 ;SIZE 1000 > 0A00-1A00
CPMIMG .EQU $1A00 ;SIZE 3000 > 1A00-4A00
ZSYSIMG .EQU $4A00 ;SIZE 3000 > 4A00-7A00
;
; osimg1.bin
;
BASIMG .EQU $0000 ;SIZE 2000 > 0000-2000
TBCIMG .EQU $2000 ;SIZE 0900 > 2000-2900
;
INT_IM1 .EQU $FF00
;
;----------------------------------------------------------
; NAME NAME OF ROM 8 CHAR
; BANK WHICH ROM BANK THE IMAGE IS IN.
; IMAGE LOCATION OF IMAGE IN 32K ROM BANK.
; LOCATION WHERE IMAGE NEEDS TO BE COPIED TO IN RAM.
; EXECUTE ADDRESS TO START EXECUTING.
;
;ROMTBL .DB "B","BASIC $", 0, BASIMG, BAS_LOC, BAS_SIZ, BASE_LOC
; .DB "C","CP/M $", 0,
; .DB "F","FORTH $", 1,
; .DB "Z","ZSYSTEM$", 1,
;
;
; .DB "MONITOR$", 0,
;
.ORG 0
;
;==================================================================================================
@ -62,6 +87,7 @@ INT_IM1 .EQU $FF00
; BANNER
LD DE,STR_BANNER
CALL WRITESTR
;
#IF (PLATFORM != PLT_UNA)
CALL DELAY_INIT ; INIT DELAY FUNCTIONS
@ -122,9 +148,11 @@ INT_IM1 .EQU $FF00
;________________________________________________________________________________________________________________________________
;
DOBOOTMENU:
CALL NEWLINE
LD DE,STR_BOOTMENU
; CALL NEWLINE
LD DE,STR_BOOTMENU
CALL WRITESTR
CALL PRTALL
CALL PC_COLON
#IF (DSKYENABLE)
LD HL,BOOT ; POINT TO BOOT MESSAGE
@ -144,14 +172,18 @@ DB_BOOTLOOP:
OR A
JP Z,DB_CONEND
CALL CINUC
CP 'M' ; MONITOR
JP Z,GOMONSER
CP 'B' ; NASCOM BASIC
JP Z,GOBASIC
CP 'C' ; CP/M BOOT FROM ROM
JP Z,GOCPM
CP 'M' ; MONITOR
JP Z,GOMONSER
; CP 'L' ; LIST DRIVES
; JP Z,GOLIST
CP 'T' ; TASTY BASIC
JP Z,GOTBAS
CP 'Z' ; ZSYSTEM BOOT FROM ROM
JP Z,GOZSYS
CP 'L' ; LIST DRIVES
JP Z,GOLIST
CP '0' ; 0-9, DISK DEVICE
JP C,DB_INVALID
CP '9' + 1
@ -202,14 +234,18 @@ DB_DSKYEND:
; TIMEOUT EXPIRED, PERFORM DEFAULT BOOT ACTION
LD A,BOOT_DEFAULT
CP 'M' ; MONITOR
JP Z,GOMON
CP 'B' ; NASCOM BASIC
JP Z,GOBASIC
CP 'C' ; CP/M BOOT FROM ROM
JP Z,GOCPM
CP 'M' ; MONITOR
JP Z,GOMONSER
; CP 'L' ; LIST DRIVES
; JP Z,GOLIST
CP 'T' ; TASTY BASIC
JP Z,GOTBAS
CP 'Z' ; ZSYSTEM BOOT FROM ROM
JP Z,GOZSYS
CP 'L' ; LIST DRIVES
JP Z,GOLIST
CP '0' ; 0-9, DISK DEVICE
JP C,DB_INVALID
CP '9' + 1
@ -227,6 +263,70 @@ DB_INVALID:
CALL WRITESTR
JP DOBOOTMENU
;
GOBASIC:
LD DE,STR_BOOTBAS ; DE POINTS TO MESSAGE
CALL WRITESTR ; WRITE IT TO CONSOLE
; COPY BASIC FROM BASIC FROM OSIMG0 IN ROM BANK TO THIS RAM BANKS
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
LD D,BID_USR ; D = DEST BANK = USER BANK
LD E,BID_OSIMG ; E = SRC BANK = BIOS BANK
LD HL,BAS_SIZ ; HL = COPY LEN = 1 PAGE = 256 BYTES
RST 08 ; DO IT
LD DE,STR_LOADING
CALL WRITESTR ; WRITE IT TO CONSOLE
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
LD HL,BASIMG ; COPY FROM
LD DE,BAS_LOC ; COPY TO
RST 08 ; DO IT
LD DE,STR_LAUNCH
CALL WRITESTR
LD HL,BAS_LOC
JP CHAIN
; LD HL,BAS_LOC
; PUSH HL
; LD DE,STR_BOOTBAS ; DE POINTS TO MESSAGE
; CALL WRITESTR ; WRITE IT TO CONSOLE
; ; COPY IMAGE TO EXEC ADDRESS
; LD HL,BASIMG ; HL := BASIC IMAGE ADDRESS
; LD DE,BAS_LOC ; DE := BASIC EXEC ADDRESS
; LD BC,BAS_SIZ ; BC := BASIC SIZE
; LDIR ; COPY BASIC CODE TO EXEC ADDRESS
; POP HL ; RECOVER ENTRY ADDRESS
; JR CHAIN ; AND CHAIN TO IT
GOTBAS:
LD DE,STR_BOOTTBC ; DE POINTS TO MESSAGE
CALL WRITESTR ; WRITE IT TO CONSOLE
; COPY BASIC FROM BASIC FROM OSIMG0 IN ROM BANK TO THIS RAM BANKS
LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY
LD D,BID_USR ; D = DEST BANK = USER BANK
LD E,BID_OSIMG ; E = SRC BANK = BIOS BANK
LD HL,TBC_SIZ ; HL = COPY LEN = 1 PAGE = 256 BYTES
RST 08 ; DO IT
LD DE,STR_LOADING
CALL WRITESTR ; WRITE IT TO CONSOLE
LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY
LD HL,TBCIMG ; COPY FROM
LD DE,TBC_LOC ; COPY TO
RST 08 ; DO IT
LD DE,STR_LAUNCH
CALL WRITESTR
LD HL,TBC_LOC
JP CHAIN
; LD HL,TBC_LOC
; PUSH HL
; LD DE,STR_BOOTTBC ; DE POINTS TO MESSAGE
; CALL WRITESTR ; WRITE IT TO CONSOLE
; ; COPY IMAGE TO EXEC ADDRESS
; LD HL,TBCIMG ; HL := BASIC IMAGE ADDRESS
; LD DE,TBC_LOC ; DE := BASIC EXEC ADDRESS
; LD BC,TBC_SIZ ; BC := BASIC SIZE
; LDIR ; COPY BASIC CODE TO EXEC ADDRESS
; POP HL ; RECOVER ENTRY ADDRESS
; JR CHAIN ; AND CHAIN TO IT
GOMONSER:
LD HL,MON_SERIAL ; MONITOR SERIAL INTERFACE ENTRY ADDRESS TO HL
JR GOMON ; LOAD AND RUN MONITOR
@ -295,8 +395,8 @@ CHAIN:
RST 08
;
LD A,BID_USR ; ACTIVATE USER BANK
POP HL ; RECOVER ENTRY ADDRESS
DI ; ENTER WITH INTS DISABLED
POP HL ; RECOVER ENTRY ADDRESS
DI ; ENTER WITH INTS DISABLED
CALL HB_BNKCALL ; AND GO
HALT ; WE SHOULD NEVER RETURN!!!
#ENDIF
@ -601,7 +701,7 @@ PRTDRV:
CALL COUT ; PRINT IT
LD A,')' ; DRIVE LETTER COLON
CALL COUT ; PRINT IT
CALL PC_SPACE
; CALL PC_SPACE
POP DE ; RECOVER DISK TYPE
LD A,D ; DISK TYPE TO A
CP $40 ; RAM/ROM?
@ -637,7 +737,7 @@ PRTDRV2: ; PRINT DEVICE
LD A,B ; UNIT TO A
ADD A,'0' ; MAKE IT PRINTABLE NUMERIC
CALL COUT ; PRINT IT
LD A,':' ; DEVICE NAME COLON
LD A,',' ; DEVICE NAME SEPARATOR
CALL COUT ; PRINT IT
RET ; DONE
;
@ -672,7 +772,7 @@ PRTALL1:
CALL COUT ; PRINT IT
LD A,')' ; FORMATTING
CALL COUT ; PRINT IT
CALL PC_SPACE ; SPACING
; CALL PC_SPACE ; SPACING
PUSH BC ; SAVE LOOP CONTROL
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
RST 08 ; CALL HBIOS
@ -708,7 +808,7 @@ PRTDRV:
LD A,E ; LOAD DRIVER MODE/UNIT
AND $0F ; ISOLATE UNIT
CALL PRTDECB ; PRINT IT
CALL PC_COLON ; FORMATTING
CALL PC_SPACE ; FORMATTING
;LD A,E ; LOAD LU
;CALL PRTDECB ; PRINT IT
RET
@ -746,7 +846,9 @@ DEV15 .EQU DEVUNK
;
STR_BOOTDISK .DB "BOOT FROM DISK\r\n$"
STR_BOOTDISK1 .DB "\r\nReading disk information...$"
STR_BOOTMON .DB "START MONITOR\r\n$"
STR_BOOTMON .DB "START MONITOR FROM ROM\r\n$"
STR_BOOTBAS .DB "START BASIC FROM ROM\r\n$"
STR_BOOTTBC .DB "START TASTYBASIC FROM ROM\r\n$"
STR_BOOTCPM .DB "BOOT CPM FROM ROM\r\n$"
STR_BOOTZSYS .DB "BOOT ZSYSTEM FROM ROM\r\n$"
STR_LIST .DB "LIST DEVICES\r\n$"
@ -758,16 +860,19 @@ STR_CPMEND .DB "END=$"
STR_CPMENT .DB "ENT=$"
STR_LABEL .DB "LABEL=$"
STR_DRVLIST .DB "\r\nDisk Devices:\r\n$"
STR_PREFIX .DB "\r\n $"
STR_PREFIX .DB "($"
;STR_PREFIX .DB "\r\n $"
STR_LOADING .DB "\r\nLoading...$"
STR_NODISK .DB "\r\nNo disk!$"
STR_NOBOOT .DB "\r\nDisk not bootable!$"
STR_BOOTERR .DB "\r\nBoot failure!$"
STR_ITSRAM .DB "\r\n\RAM$"
STR_LAUNCH .DB "\r\nLaunching ...$"
;
STR_BANNER .DB "\r\n", PLATFORM_NAME, " Boot Loader$"
STR_BOOTMENU .DB "\r\n"
.DB "Boot: (C)PM, (Z)System, (M)onitor,\r\n"
.DB " (L)ist disks, or Disk Unit # ===> $"
.DB "\r\nROM Boot: (B)ASIC, (C)PM, (M)onitor, (T)ASTYBASIC, (Z)System.\r\n"
.DB "Disk Boot: $"
;
.IF DSKYENABLE
BOOT:
@ -931,7 +1036,7 @@ CINUC:
; FILL REMAINDER OF BANK
;==================================================================================================
;
SLACK: .EQU ($1000 - $)
SLACK: .EQU ($LDR_SIZ - $)
.FILL SLACK
;
.ECHO "LOADER space remaining: "

20
Source/HBIOS/std.asm

@ -77,7 +77,13 @@ DSRTCMODE_MFPIC .EQU 2 ; MF/PIC VARIANT
SIOMODE_NONE .EQU 0
SIOMODE_RC .EQU 1 ; RC2014 SIO MODULE (SPENCER OWEN)
SIOMODE_SMB .EQU 2 ; RC2014 SIO MODULE (SCOTT BAKER)
SIOMODE_ZP .EQU 3 ; ZILOG PERIPHERALS BOARD
SIOMODE_ZP .EQU 3 ; ECB-ZILOG PERIPHERALS BOARD
;
; PIO MODE SELECTIONS
;
PIOMODE_NONE .EQU 0
PIOMODE_4P .EQU 1 ; ECB-4PIO BOARD
PIOMODE_ZP .EQU 2 ; ECB-ZILOG PERIPHERALS BOARD
;
; TYPE OF CONSOLE BELL TO USE
;
@ -319,7 +325,7 @@ BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
BID_BOOT .EQU BID_ROM0 ; BOOT BANK
;BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
@ -358,10 +364,20 @@ CBIOS_LOC .EQU CBIOS_END - CBIOS_SIZ ; START OF CBIOS
CPM_ENT .EQU CBIOS_LOC ; CPM ENTRY POINT (IN CBIOS)
LDR_SIZ .EQU $0A00
MON_LOC .EQU $C000 ; LOCATION OF MONITOR FOR RUNNING SYSTEM
MON_SIZ .EQU $1000 ; SIZE OF MONITOR BINARY IMAGE
MON_END .EQU MON_LOC + MON_SIZ ; END OF MONITOR
BAS_LOC .EQU $0A00 ; NASCOM BASIC
BAS_SIZ .EQU $2000
BAS_END .EQU BAS_LOC + BAS_SIZ
TBC_LOC .EQU $0A00 ; TASTYBASIC
TBC_SIZ .EQU $0900
TBC_END .EQU TBC_LOC + TBC_SIZ
MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY)
MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT)
;

1795
Source/HBIOS/tastybasic.asm

File diff suppressed because it is too large
Loading…
Cancel
Save