You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

4381 lines
195 KiB

0001 0000 ;__________________________________________________________________________________________________
0002 0000 ;
0003 0000 ; CBIOS FOR N8VEM
0004 0000 ;
0005 0000 ; BY ANDREW LYNCH, WITH INPUT FROM MANY SOURCES
0006 0000 ; ROMWBW ADAPTATION BY WAYNE WARTHEN
0007 0000 ;__________________________________________________________________________________________________
0008 0000 ;
0009 0000 ; The std.asm file contains the majority of the standard equates
0010 0000 ; that describe data structures, magic values and bit fields used
0011 0000 ; by the CBIOS.
0012 0000 ;
0013 0000 ;
0014 0000 ;
0015 0000 ; IOBYTE INIT
0016 0000 ; CIO ASSIGNMENTS
0017 0000 ; CRT SETUP
0018 0000 ;
0019 0000
0020 0000 #INCLUDE "std.asm"
0001+ 0000 ; ~/RomWBW/branches/s100/Source/std.asm 1/19/2013 dwg -
0002+ 0000 ;
0003+ 0000
0004+ 0000 ; The purpose of this file is to define generic symbols and to include
0005+ 0000 ; the appropriate std-*.inc file to bring in platform specifics.
0006+ 0000
0007+ 0000 ; There are four classes of systems supported by N8VEM.
0008+ 0000 ; 1. N8VEM Platforms that include ECB interface
0009+ 0000 ; 2. ZETA Genrally N8VEM-like, but no ECB
0010+ 0000 ; 3. N8 Generally N8VEM-like bt 180 and extra embedded devices
0011+ 0000 ; 4. S100 Assumes Z80 Master CPU Card
0012+ 0000
0013+ 0000 ; All the classes require certain generic definitions, and these are
0014+ 0000 ; defined here prior to the inclusion of platform specific .inc files.
0015+ 0000
0016+ 0000 ; It is unfortunate, but all the possible config items must be defined
0017+ 0000 ; here because the config gets read before the specific std-*.inc's
0018+ 0000
0019+ 0000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0020+ 0000 ;
0021+ 0000 TRUE .EQU 1
0022+ 0000 FALSE .EQU 0
0023+ 0000 ;
0024+ 0000 ; PRIMARY HARDWARE PLATFORMS
0025+ 0000 ;
0026+ 0000 PLT_N8VEM .EQU 1 ; N8VEM ECB Z80 SBC
0027+ 0000 PLT_ZETA .EQU 2 ; ZETA Z80 SBC
0028+ 0000 PLT_N8 .EQU 3 ; N8 (HOME COMPUTER) Z180 SBC
0029+ 0000 PLT_MK4 .EQU 4
0030+ 0000 PLT_S2I .EQU 5 ; SCSI2IDE
0031+ 0000 PLT_S100 .EQU 6 ; S100COMPUTERS Z80 based system
0032+ 0000 PLT_UNA .EQU 7 ; UNA BIOS
0033+ 0000 ;
0034+ 0000 ; RAM DISK INITIALIZATION OPTIONS
0035+ 0000 ;
0036+ 0000 CLR_NEVER .EQU 0 ; NEVER CLEAR RAM DISK
0037+ 0000 CLR_AUTO .EQU 1 ; CLEAR RAM DISK IF INVALID DIR ENTRIES
0038+ 0000 CLR_ALWAYS .EQU 2 ; ALWAYS CLEAR RAM DISK
0039+ 0000 ;
0040+ 0000 ; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL)
0041+ 0000 ;
0042+ 0000 FDM720 .EQU 0 ; 3.5" FLOPPY, 720KB, 2 SIDES, 80 TRKS, 9 SECTORS
0043+ 0000 FDM144 .EQU 1 ; 3.5" FLOPPY, 1.44MB, 2 SIDES, 80 TRKS, 18 SECTORS
0044+ 0000 FDM360 .EQU 2 ; 5.25" FLOPPY, 360KB, 2 SIDES, 40 TRKS, 9 SECTORS
0045+ 0000 FDM120 .EQU 3 ; 5.25" FLOPPY, 1.2MB, 2 SIDES, 80 TRKS, 15 SECTORS
0046+ 0000 FDM111 .EQU 4 ; 8" FLOPPY, 1.11MB, 2 SIDES, 74 TRKS, 15 SECTORS
0047+ 0000 ;
0048+ 0000 ; MEDIA ID VALUES
0049+ 0000 ;
0050+ 0000 MID_NONE .EQU 0
0051+ 0000 MID_MDROM .EQU 1
0052+ 0000 MID_MDRAM .EQU 2
0053+ 0000 MID_RF .EQU 3
0054+ 0000 MID_HD .EQU 4
0055+ 0000 MID_FD720 .EQU 5
0056+ 0000 MID_FD144 .EQU 6
0057+ 0000 MID_FD360 .EQU 7
0058+ 0000 MID_FD120 .EQU 8
0059+ 0000 MID_FD111 .EQU 9
0060+ 0000 ;
0061+ 0000 ; CONSOLE TERMINAL TYPE CHOICES
0062+ 0000 ;
0063+ 0000 TERM_TTY .EQU 0
0064+ 0000 TERM_ANSI .EQU 1
0065+ 0000 TERM_WYSE .EQU 2
0066+ 0000 TERM_VT52 .EQU 3
0067+ 0000 ;
0068+ 0000 ; EMULATION TYPES
0069+ 0000 ;
0070+ 0000 EMUTYP_NONE .EQU 0
0071+ 0000 EMUTYP_TTY .EQU 1
0072+ 0000 EMUTYP_ANSI .EQU 2
0073+ 0000 ;
0074+ 0000 ; SYSTEM GENERATION SETTINGS
0075+ 0000 ;
0076+ 0000 SYS_CPM .EQU 1 ; CPM (IMPLIES BDOS + CCP)
0077+ 0000 SYS_ZSYS .EQU 2 ; ZSYSTEM OS (IMPLIES ZSDOS + ZCPR)
0078+ 0000 ;
0079+ 0000 DOS_BDOS .EQU 1 ; BDOS
0080+ 0000 DOS_ZDDOS .EQU 2 ; ZDDOS VARIANT OF ZSDOS
0081+ 0000 DOS_ZSDOS .EQU 3 ; ZSDOS
0082+ 0000 ;
0083+ 0000 CP_CCP .EQU 1 ; CCP COMMAND PROCESSOR
0084+ 0000 CP_ZCPR .EQU 2 ; ZCPR COMMAND PROCESSOR
0085+ 0000 ;
0086+ 0000 ; CONFIGURE DOS (DOS) AND COMMAND PROCESSOR (CP) BASED ON SYSTEM SETTING (SYS)
0087+ 0000 ;
0088+ 0000 #IFNDEF BLD_SYS
0089+ 0000 SYS .EQU SYS_CPM
0090+ 0000~ #ELSE
0091+ 0000~ SYS .EQU BLD_SYS
0092+ 0000 #ENDIF
0093+ 0000 ;
0094+ 0000 #IF (SYS == SYS_CPM)
0095+ 0000 DOS .EQU DOS_BDOS
0096+ 0000 CP .EQU CP_CCP
0097+ 0000 #DEFINE OSLBL "CP/M-80 2.2"
0098+ 0000 #ENDIF
0099+ 0000 ;
0100+ 0000~ #IF (SYS == SYS_ZSYS)
0101+ 0000~ DOS .EQU DOS_ZSDOS
0102+ 0000~ CP .EQU CP_ZCPR
0103+ 0000~ #DEFINE OSLBL "ZSDOS 1.1"
0104+ 0000 #ENDIF
0105+ 0000 ;
0106+ 0000 ; INCLUDE VERSION AND BUILD SETTINGS
0107+ 0000 ;
0108+ 0000 #INCLUDE "ver.inc" ; ADD BIOSVER
0001++ 0000 #DEFINE RMJ 2
0002++ 0000 #DEFINE RMN 7
0003++ 0000 #DEFINE RUP 0
0004++ 0000 #DEFINE RTP 0
0005++ 0000 #DEFINE BIOSVER "2.7.0"
0006++ 0000 #DEFINE BIOSBLD "Build 0 Developmental"
0007++ 0000 #DEFINE REVISION 500
0109+ 0000 ;
0110+ 0000 #INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
0001++ 0000 ; RomWBW Configured for N8VEM simh, 2015-02-14T09:50:52
0002++ 0000 ;
0003++ 0000 #DEFINE TIMESTAMP "14-Feb-2015"
0004++ 0000 ;
0005++ 0000 PLATFORM .EQU PLT_N8VEM ; HARDWARE PLATFORM
0006++ 0000 ROMSIZE .EQU 512 ; SIZE OF ROM IN KB
0007++ 0000 ;
0008++ 0000 ; INCLUDE PLATFORM SPECIFIC DEVICE DEFINITIONS
0009++ 0000 ;
0010++ 0000 #INCLUDE "std-n8vem.inc"
0001+++0000 ;
0002+++0000 ; CHARACTER DEVICES
0003+++0000 ;
0004+++0000 CIODEV_UART .EQU $00
0005+++0000 CIODEV_ASCI .EQU $10
0006+++0000 CIODEV_VDU .EQU $20
0007+++0000 CIODEV_CVDU .EQU $30
0008+++0000 CIODEV_UPD7220 .EQU $40
0009+++0000 CIODEV_N8V .EQU $50
0010+++0000 CIODEV_PRPCON .EQU $60
0011+++0000 CIODEV_PPPCON .EQU $70
0012+++0000 CIODEV_CONSOLE .EQU $C0
0013+++0000 CIODEV_CRT .EQU $D0
0014+++0000 CIODEV_BAT .EQU $E0
0015+++0000 CIODEV_NUL .EQU $F0
0016+++0000 ;
0017+++0000 ; DISK DEVICES (ONLY FIRST NIBBLE RELEVANT, SECOND NIBBLE RESERVED FOR UNIT)
0018+++0000 ;
0019+++0000 DIODEV_MD .EQU $00
0020+++0000 DIODEV_FD .EQU $10
0021+++0000 DIODEV_RF .EQU $20
0022+++0000 DIODEV_IDE .EQU $30
0023+++0000 DIODEV_ATAPI .EQU $40
0024+++0000 DIODEV_PPIDE .EQU $50
0025+++0000 DIODEV_SD .EQU $60
0026+++0000 DIODEV_PRPSD .EQU $70
0027+++0000 DIODEV_PPPSD .EQU $80
0028+++0000 DIODEV_HDSK .EQU $90
0029+++0000 ;
0030+++0000 ; VDA DEVICES (VIDEO DISPLAY ADAPTER)
0031+++0000 ;
0032+++0000 VDADEV_NONE .EQU $00 ; NO VDA DEVICE
0033+++0000 VDADEV_VDU .EQU $10 ; ECB VDU - 6545 CHIP
0034+++0000 VDADEV_CVDU .EQU $20 ; ECB COLOR VDU - 8563 CHIP (NOT IMP)
0035+++0000 VDADEV_UPD7220 .EQU $30 ; ECB uP7220 (NOT IMPLEMENTED)
0036+++0000 VDADEV_N8V .EQU $40 ; N8 ONBOARD VDA SUBSYSTEM
0011++ 0000 ;
0012++ 0000 #INCLUDE "config.asm"
0001+++0000 ;
0002+++0000 ;==================================================================================================
0003+++0000 ; ROMWBW 2.X CONFIGURATION FOR SIMH EMULATOR
0004+++0000 ;==================================================================================================
0005+++0000 ;
0006+++0000 ; BUILD CONFIGURATION OPTIONS
0007+++0000 ;
0008+++0000 DEFCON .EQU CIODEV_UART ; DEFAULT CONSOLE DEVICE (LOADER AND MONITOR): CIODEV_UART, CIODEV_CRT, CIODEV_PRPCON, CIODEV_PPPCON
0009+++0000 ;
0010+++0000 RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
0011+++0000 CLRRAMDISK .EQU CLR_ALWAYS ; CLR_ALWAYS, CLR_NEVER, CLR_AUTO (CLEAR IF INVALID DIR AREA)
0012+++0000 ;
0013+++0000 ;DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
0014+++0000 ;
0015+++0000 DEFIOBYTE .EQU $00 ; DEFAULT INITIAL VALUE FOR CP/M IOBYTE, $00=TTY, $01=CRT (MUST HAVE CRT HARDWARE)
0016+++0000 ALTIOBYTE .EQU DEFIOBYTE ; ALT INITIAL VALUE (USED WHEN CONFIG JUMPER SHORTED)
0017+++0000 WRTCACHE .EQU TRUE ; ENABLE WRITE CACHING IN CBIOS (DE)BLOCKING ALGORITHM
0018+++0000 DSKTRACE .EQU FALSE ; ENABLE TRACING OF CBIOS DISK FUNCTION CALLS
0019+++0000 ;
0020+++0000 #DEFINE AUTOCMD "" ; AUTO STARTUP COMMAND FOR CP/M
0013++ 0000 ;
0111+ 0000 ;
0112+ 0000 ; INCLUDE PLATFORM SPECIFIC HARDWARE DEFINITIONS
0113+ 0000 ;
0114+ 0000 #IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA))
0115+ 0000 #INCLUDE "n8vem.inc"
0001++ 0000 ;
0002++ 0000 ; N8VEM HARDWARE IO PORT ADDRESSES AND MEMORY LOCATIONS
0003++ 0000 ;
0004++ 0000 RTC .EQU $70 ; ADDRESS OF RTC LATCH AND INPUT PORT
0005++ 0000 ;
0006++ 0000 ; MEMORY BANK CONFIGURATION
0007++ 0000 ;
0008++ 0000 BID_ROM0 .EQU $00
0009++ 0000 BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1))
0010++ 0000 BID_RAM0 .EQU $80
0011++ 0000 BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1))
0012++ 0000
0013++ 0000 BID_BOOT .EQU BID_ROM0 ; BOOT BANK
0014++ 0000 BID_BIOSIMG .EQU BID_ROM0 + 1 ; BIOS IMAGE BANK
0015++ 0000 BID_OSIMG .EQU BID_ROM0 + 2 ; ROM LOADER AND IMAGES BANK
0016++ 0000 BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK
0017++ 0000 BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK
0018++ 0000 BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK
0019++ 0000
0020++ 0000 BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK
0021++ 0000 BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK
0022++ 0000 BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.)
0023++ 0000 BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK
0024++ 0000 BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.)
0025++ 0000 BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K
0116+ 0000 #ENDIF
0117+ 0000 ;
0118+ 0000~ #IF (PLATFORM == PLT_S2I)
0119+ 0000~ #INCLUDE "s2i.inc"
0120+ 0000 #ENDIF
0121+ 0000 ;
0122+ 0000~ #IF (PLATFORM == PLT_N8)
0123+ 0000~ #INCLUDE "n8.inc"
0124+ 0000 #ENDIF
0125+ 0000 ;
0126+ 0000~ #IF (PLATFORM == PLT_MK4)
0127+ 0000~ #INCLUDE "mk4.inc"
0128+ 0000 #ENDIF
0129+ 0000 ;
0130+ 0000~ #IF (PLATFORM == PLT_UNA)
0131+ 0000~ #INCLUDE "una.inc"
0132+ 0000 #ENDIF
0133+ 0000 ;
0134+ 0000 ; CHARACTER DEVICE FUNCTIONS
0135+ 0000 ;
0136+ 0000 CF_INIT .EQU 0
0137+ 0000 CF_IN .EQU 1
0138+ 0000 CF_IST .EQU 2
0139+ 0000 CF_OUT .EQU 3
0140+ 0000 CF_OST .EQU 4
0141+ 0000 ;
0142+ 0000 ; DISK OPERATIONS
0143+ 0000 ;
0144+ 0000 DOP_READ .EQU 0 ; READ OPERATION
0145+ 0000 DOP_WRITE .EQU 1 ; WRITE OPERATION
0146+ 0000 DOP_FORMAT .EQU 2 ; FORMAT OPERATION
0147+ 0000 DOP_READID .EQU 3 ; READ ID OPERATION
0148+ 0000 ;
0149+ 0000 ; BIOS FUNCTIONS
0150+ 0000 ;
0151+ 0000~ #IF (PLATFORM == PLT_UNA)
0152+ 0000~ BF_CIO .EQU $10
0153+ 0000~ BF_CIOIN .EQU BF_CIO + 1 ; CHARACTER INPUT
0154+ 0000~ BF_CIOOUT .EQU BF_CIO + 2 ; CHARACTER OUTPUT
0155+ 0000~ BF_CIOIST .EQU BF_CIO + 3 ; CHARACTER INPUT STATUS
0156+ 0000~ BF_CIOOST .EQU BF_CIO + 4 ; CHARACTER OUTPUT STATUS
0157+ 0000~ ;
0158+ 0000~ BF_DIO .EQU $40
0159+ 0000~ BF_DIORD .EQU BF_DIO + 2 ; DISK READ
0160+ 0000~ BF_DIOWR .EQU BF_DIO + 3 ; DISK WRITE
0161+ 0000 #ELSE
0162+ 0000 BF_CIO .EQU $00
0163+ 0000 BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT
0164+ 0000 BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT
0165+ 0000 BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS
0166+ 0000 BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS
0167+ 0000 BF_CIOCFG .EQU BF_CIO + 4 ; CHARACTER I/O CONFIG
0168+ 0000 ;
0169+ 0000 BF_DIO .EQU $10
0170+ 0000 BF_DIORD .EQU BF_DIO + 0 ; DISK READ
0171+ 0000 BF_DIOWR .EQU BF_DIO + 1 ; DISK WRITE
0172+ 0000 BF_DIOST .EQU BF_DIO + 2 ; DISK STATUS
0173+ 0000 BF_DIOMED .EQU BF_DIO + 3 ; DISK MEDIA
0174+ 0000 BF_DIOID .EQU BF_DIO + 4 ; DISK IDENTIFY
0175+ 0000 BF_DIOGETBUF .EQU BF_DIO + 8 ; DISK GET BUFFER ADR
0176+ 0000 BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
0177+ 0000 BF_DIODEVCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
0178+ 0000 BF_DIODEVINF .EQU BF_DIO + 11 ; DISK DEVICE INFO
0179+ 0000 ;
0180+ 0000 BF_RTC .EQU $20
0181+ 0000 BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
0182+ 0000 BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME
0183+ 0000 BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX
0184+ 0000 BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX
0185+ 0000 BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK
0186+ 0000 BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK
0187+ 0000 ;
0188+ 0000 BF_EMU .EQU $30
0189+ 0000 BF_EMUIN .EQU BF_EMU + 0 ; EMULATOR CHARACTER INPUT
0190+ 0000 BF_EMUOUT .EQU BF_EMU + 1 ; EMULATOR CHARACTER OUTPUT
0191+ 0000 BF_EMUIST .EQU BF_EMU + 2 ; EMULATOR CHARACTER INPUT STATUS
0192+ 0000 BF_EMUOST .EQU BF_EMU + 3 ; EMULATOR CHARACTER OUTPUT STATUS
0193+ 0000 BF_EMUCFG .EQU BF_EMU + 4 ; EMULATOR CHARACTER I/O CONFIG
0194+ 0000 BF_EMUINI .EQU BF_EMU + 8 ; INITIALIZE EMULATION
0195+ 0000 BF_EMUQRY .EQU BF_EMU + 9 ; QUERY EMULATION STATUS
0196+ 0000 ;
0197+ 0000 BF_VDA .EQU $40
0198+ 0000 BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU
0199+ 0000 BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS
0200+ 0000 BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU
0201+ 0000 BF_VDASCS .EQU BF_VDA + 3 ; SET CURSOR STYLE
0202+ 0000 BF_VDASCP .EQU BF_VDA + 4 ; SET CURSOR POSITION
0203+ 0000 BF_VDASAT .EQU BF_VDA + 5 ; SET CHARACTER ATTRIBUTE
0204+ 0000 BF_VDASCO .EQU BF_VDA + 6 ; SET CHARACTER COLOR
0205+ 0000 BF_VDAWRC .EQU BF_VDA + 7 ; WRITE CHARACTER
0206+ 0000 BF_VDAFIL .EQU BF_VDA + 8 ; FILL
0207+ 0000 BF_VDACPY .EQU BF_VDA + 9 ; COPY
0208+ 0000 BF_VDASCR .EQU BF_VDA + 10 ; SCROLL
0209+ 0000 BF_VDAKST .EQU BF_VDA + 11 ; GET KEYBOARD STATUS
0210+ 0000 BF_VDAKFL .EQU BF_VDA + 12 ; FLUSH KEYBOARD BUFFER
0211+ 0000 BF_VDAKRD .EQU BF_VDA + 13 ; READ KEYBOARD
0212+ 0000 ;
0213+ 0000 BF_SYS .EQU $F0
0214+ 0000 BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK
0215+ 0000 BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK
0216+ 0000 BF_SYSCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
0217+ 0000 BF_SYSXCPY .EQU BF_SYS + 3 ; EXTENDED COPY SETUP
0218+ 0000 BF_SYSATTR .EQU BF_SYS + 4 ; GET/SET SYSTEM ATTRIBUTE VALUE
0219+ 0000 ;BF_SYSXXXX .EQU BF_SYS + 5 ;
0220+ 0000 BF_SYSGETVER .EQU BF_SYS + 6 ; GET VERSION OF HBIOS
0221+ 0000 #ENDIF
0222+ 0000 ;
0223+ 0000 ; SYSTEM ATTRIBUTE IDS
0224+ 0000 ;
0225+ 0000 AID_BOOTVOL .EQU 0 ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU
0226+ 0000 AID_BOOTROM .EQU 0 ; BANK ID OF ROM PAGE BOOTED
0227+ 0000 ;
0228+ 0000 ; MEMORY LAYOUT
0229+ 0000 ;
0230+ 0000 SYS_SIZ .EQU $3000 ; COMBINED SIZE OF SYSTEM AREA (OS + HBIOS PROXY)
0231+ 0000 HBBUF_SIZ .EQU 1024 ; INVARIANT HBIOS PHYSICAL DISK BUFFER, 1K
0232+ 0000 HBX_SIZ .EQU $200 ; HBIOS PROXY SIZE (SUBJECT TO CHANGE)
0233+ 0000 CPM_SIZ .EQU SYS_SIZ - HBX_SIZ ; NET SIZE OF ALL OS COMPONENTS (EXCLUDING HBIOS PROXY)
0234+ 0000 CCP_SIZ .EQU $800 ; INVARIANT SIZE OF CCP
0235+ 0000 BDOS_SIZ .EQU $E00 ; INVARIANT SIZE OF BDOS
0236+ 0000 CBIOS_SIZ .EQU CPM_SIZ - CCP_SIZ - BDOS_SIZ ; CBIOS IS THE REMAINDER
0237+ 0000
0238+ 0000 MEMTOP .EQU $10000 ; INVARIANT TOP OF Z80 ADDRESSABLE MEMORY
0239+ 0000 BNKTOP .EQU $8000 ; BANK MEMORY BARRIER
0240+ 0000
0241+ 0000 HBBUF_IMG .EQU BNKTOP - HBBUF_SIZ ; LOC OF DISK BUFFER IN HBIOS IMAGE BANK
0242+ 0000 HBX_IMG .EQU BNKTOP - HBX_SIZ ; LOC OF HBX IMAGE IN HBIOS IMAGE BANK
0243+ 0000
0244+ 0000 HBBUF_END .EQU BNKTOP ; END OF PHYSICAL DISK BUFFER IN HBIOS
0245+ 0000 HBBUF_LOC .EQU HBBUF_END - HBBUF_SIZ ; START OF PHYSICAL DISK BUFFER
0246+ 0000 HBX_END .EQU MEMTOP ; END OF HBIOS PROXY
0247+ 0000 HBX_LOC .EQU HBX_END - HBX_SIZ ; START OF HBIOS PROXY
0248+ 0000 CPM_END .EQU HBX_LOC ; END OF CPM COMPONENTS (INCLUDING CBIOS)
0249+ 0000 CPM_LOC .EQU CPM_END - CPM_SIZ ; START OF CPM COMPONENTS
0250+ 0000 CBIOS_END .EQU HBX_LOC ; END OF CBIOS
0251+ 0000 CBIOS_LOC .EQU CBIOS_END - CBIOS_SIZ ; START OF CBIOS
0252+ 0000 BDOS_END .EQU CBIOS_LOC ; END OF BDOS
0253+ 0000 BDOS_LOC .EQU BDOS_END - BDOS_SIZ ; START OF BDOS
0254+ 0000 CCP_END .EQU BDOS_LOC ; END OF CCP
0255+ 0000 CCP_LOC .EQU CCP_END - CCP_SIZ ; START OF CCP
0256+ 0000
0257+ 0000 CPM_ENT .EQU CBIOS_LOC ; CPM ENTRY POINT (IN CBIOS)
0258+ 0000 CCP_ENT .EQU CPM_LOC ; COMMAND PROCESSOR ENTRY POINT (IN CCP)
0259+ 0000
0260+ 0000 MON_LOC .EQU $C000 ; LOCATION OF MONITOR FOR RUNNING SYSTEM
0261+ 0000 MON_SIZ .EQU $1000 ; SIZE OF MONITOR BINARY IMAGE
0262+ 0000 MON_END .EQU MON_LOC + MON_SIZ ; END OF MONITOR
0263+ 0000
0264+ 0000 MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY)
0265+ 0000 MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT)
0266+ 0000
0267+ 0000 CBIOS_BOOT .EQU CBIOS_LOC + (0 * 3)
0268+ 0000 CBIOS_WBOOT .EQU CBIOS_LOC + (1 * 3)
0269+ 0000 CBIOS_CONST .EQU CBIOS_LOC + (2 * 3)
0270+ 0000 CBIOS_CONIN .EQU CBIOS_LOC + (3 * 3)
0271+ 0000 CBIOS_CONOUT .EQU CBIOS_LOC + (4 * 3)
0272+ 0000 CBIOS_LIST .EQU CBIOS_LOC + (5 * 3)
0273+ 0000 CBIOS_PUNCH .EQU CBIOS_LOC + (6 * 3)
0274+ 0000 CBIOS_READER .EQU CBIOS_LOC + (7 * 3)
0275+ 0000 CBIOS_HOME .EQU CBIOS_LOC + (8 * 3)
0276+ 0000 CBIOS_SELDSK .EQU CBIOS_LOC + (9 * 3)
0277+ 0000 CBIOS_SETTRK .EQU CBIOS_LOC + (10 * 3)
0278+ 0000 CBIOS_SETSEC .EQU CBIOS_LOC + (11 * 3)
0279+ 0000 CBIOS_SETDMA .EQU CBIOS_LOC + (12 * 3)
0280+ 0000 CBIOS_READ .EQU CBIOS_LOC + (13 * 3)
0281+ 0000 CBIOS_WRITE .EQU CBIOS_LOC + (14 * 3)
0282+ 0000 CBIOS_LISTST .EQU CBIOS_LOC + (15 * 3)
0283+ 0000 CBIOS_SECTRN .EQU CBIOS_LOC + (16 * 3)
0284+ 0000 ;
0285+ 0000 CDISK: .EQU 4 ; LOC IN PAGE 0 OF CURRENT DISK NUMBER 0=A,...,15=P
0286+ 0000 IOBYTE: .EQU 3 ; LOC IN PAGE 0 OF I/O DEFINITION BYTE
0287+ 0000 ;
0288+ 0000 ; HBIOS PROXY COMMON DATA BLOCK
0289+ 0000 ; EXACTLY 32 BYTES AT $FFE0-$FFFF
0290+ 0000 ;
0291+ 0000 HBX_XFC .EQU $10000 - $20 ; HBIOS PROXY INTERFACE AREA, 32 BYTES FIXED
0292+ 0000 ;
0293+ 0000 HBX_XFCDAT .EQU HBX_XFC ; DATA PORTION OF HBIOX PROXY INTERFACE AREA
0294+ 0000 HB_CURBNK .EQU HBX_XFCDAT + 0 ; CURRENTLY ACTIVE LOW MEMORY BANK ID
0295+ 0000 HB_PRVBNK .EQU HBX_XFCDAT + 1 ; PREVIOUS BANK (BANK SELECTED PRIOR TO CURRENT BANK)
0296+ 0000 HB_SRCADR .EQU HBX_XFCDAT + 2 ; BNKCPY: DESTINATION BANK ID
0297+ 0000 HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID
0298+ 0000 HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS
0299+ 0000 HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS
0300+ 0000 HB_CNT .EQU HBX_XFCDAT + 8 ; BNKCPY: COUNT
0301+ 0000 ;
0302+ 0000 HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA
0303+ 0000 HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION
0304+ 0000 HB_BNKSEL .EQU HBX_XFCFNS + (1 * 3) ; SELECT LOW MEMORY BANK ID
0305+ 0000 HB_BNKCPY .EQU HBX_XFCFNS + (2 * 3) ; INTERBANK MEMORY COPY
0306+ 0000 HB_BNKCALL .EQU HBX_XFCFNS + (3 * 3) ; INTERBANK FUNCTION CALL
0307+ 0000 HB_LOC .EQU HBX_XFCFNS + 12 ; ADDRESS OF HBIOS PROXY START
0308+ 0000 HB_IDENT .EQU HBX_XFCFNS + 14 ; POINTER TO HBIOS IDENT DATA BLOCK
0021 0000 ;
0022 E600 .ORG CBIOS_LOC ; DEFINED IN STD.ASM
0023 E600 ;
0024 E600 STACK .EQU CBIOS_END ; USE SLACK SPACE FOR STACK AS NEEDED
0025 E600 ;
0026 E600 ;==================================================================================================
0027 E600 ; CP/M JUMP VECTOR TABLE FOR INDIVIDUAL SUBROUTINES
0028 E600 ;==================================================================================================
0029 E600 ; These jumps are defined in the CP/M-80 v2.2 system guide and comprise
0030 E600 ; the invariant part of the BIOS.
0031 E600 ;
0032 E600 C3 65 E6 JP BOOT ; #0 - COLD START
0033 E603 C3 7F E6 WBOOTE JP WBOOT ; #1 - WARM START
0034 E606 C3 E4 E6 JP CONST ; #2 - CONSOLE STATUS
0035 E609 C3 EB E6 JP CONIN ; #3 - CONSOLE CHARACTER IN
0036 E60C C3 F2 E6 JP CONOUT ; #4 - CONSOLE CHARACTER OUT
0037 E60F C3 FD E6 JP LIST ; #5 - LIST CHARACTER OUT
0038 E612 C3 13 E7 JP PUNCH ; #6 - PUNCH CHARACTER OUT
0039 E615 C3 24 E7 JP READER ; #7 - READER CHARACTER IN
0040 E618 C3 93 E7 JP HOME ; #8 - MOVE HEAD TO HOME POSITION
0041 E61B C3 90 E7 JP SELDSK ; #9 - SELECT DISK
0042 E61E C3 9F E7 JP SETTRK ; #10 - SET TRACK NUMBER
0043 E621 C3 A4 E7 JP SETSEC ; #11 - SET SECTOR NUMBER
0044 E624 C3 AC E7 JP SETDMA ; #12 - SET DMA ADDRESS
0045 E627 C3 B1 E7 JP READ ; #13 - READ DISK
0046 E62A C3 B5 E7 JP WRITE ; #14 - WRITE DISK
0047 E62D C3 03 E7 JP LISTST ; #15 - RETURN LIST STATUS
0048 E630 C3 A9 E7 JP SECTRN ; #16 - SECTOR TRANSLATE
0049 E633 ;
0050 E633 ;==================================================================================================
0051 E633 ; CBIOS STAMP FOR ROMWBW
0052 E633 ;==================================================================================================
0053 E633 ;
0054 E633 ; RomWBW CBIOS places the following stamp data into page zero
0055 E633 ; at address $40. The address range $40-$4F is reserved by CP/M
0056 E633 ; as a scratch area for CBIOS. This data below is copied there at
0057 E633 ; every warm start. It allows applications to identify RomWBW CBIOS.
0058 E633 ; Additionally, it contains a pointer to additional CBIOS extension
0059 E633 ; data (CBX) specific to RomWBW CBIOS.
0060 E633 ;
0061 E633 ; RomWBW CBIOS page zero stamp starts at $40
0062 E633 ; $40-$41: Marker ('W', ~'W')
0063 E633 ; $42-$43: Version bytes: major/minor, update/patch
0064 E633 ; $44-$45: CBIOS Extension Info address
0065 E633 ;
0066 E633 STPLOC .EQU $40
0067 E633 57 A8 STPIMG: .DB 'W',~'W' ; MARKER
0068 E635 27 .DB RMJ << 4 | RMN ; FIRST BYTE OF VERSION INFO
0069 E636 00 .DB RUP << 4 | RTP ; SECOND BYTE OF VERSION INFO
0070 E637 39 E6 .DW CBX ; ADDRESS OF CBIOS EXT DATA
0071 E639 STPSIZ .EQU $ - STPIMG
0072 E639 ;
0073 E639 ; The following section contains key information and addresses for the
0074 E639 ; RomWBW CBIOS. A pointer to the start of this section is stored with
0075 E639 ; with the ZPX data in page zero at $44 (see above).
0076 E639 ;
0077 E639 CBX:
0078 E639 40 E6 DEVMAPADR .DW DEVMAP ; DEVICE MAP ADDRESS
0079 E63B 00 00 DRVMAPADR .DW 0 ; DRIVE MAP ADDRESS (FILLED IN LATER)
0080 E63D 51 E6 DPBMAPADR .DW DPBMAP ; DPB MAP ADDRESS
0081 E63F ;
0082 E63F CBXSIZ .EQU $ - CBX
0083 E63F .ECHO "CBIOS extension info occupies "
0084 E63F .ECHO CBXSIZ
0085 E63F .ECHO " bytes.\n"
0086 E63F ;
0087 E63F ;==================================================================================================
0088 E63F ; CHARACTER DEVICE MAPPING
0089 E63F ;==================================================================================================
0090 E63F ;
0091 E63F ; MAP LOGICAL CHARACTER DEVICES TO PHYSICAL CHARACTER DEVICES
0092 E63F ;
0093 E63F~ #IF (PLATFORM == PLT_UNA)
0094 E63F~
0095 E63F~ LD_TTY .EQU 0
0096 E63F~ LD_CRT .EQU 0
0097 E63F~ LD_BAT .EQU CIODEV_BAT
0098 E63F~ LD_UC1 .EQU 0
0099 E63F~ LD_PTR .EQU 0
0100 E63F~ LD_UR1 .EQU 0
0101 E63F~ LD_UR2 .EQU 0
0102 E63F~ LD_PTP .EQU 0
0103 E63F~ LD_UP1 .EQU 0
0104 E63F~ LD_UP2 .EQU 0
0105 E63F~ LD_LPT .EQU 0
0106 E63F~ LD_UL1 .EQU 0
0107 E63F~
0108 E63F #ELSE
0109 E63F
0110 E63F~ #IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
0111 E63F~ TTYDEV .EQU CIODEV_ASCI
0112 E63F #ELSE
0113 E63F TTYDEV .EQU CIODEV_UART
0114 E63F #ENDIF
0115 E63F ;
0116 E63F LD_TTY .EQU TTYDEV
0117 E63F LD_CRT .EQU TTYDEV
0118 E63F LD_BAT .EQU CIODEV_BAT
0119 E63F LD_UC1 .EQU TTYDEV
0120 E63F LD_PTR .EQU TTYDEV
0121 E63F LD_UR1 .EQU TTYDEV
0122 E63F LD_UR2 .EQU TTYDEV
0123 E63F LD_PTP .EQU TTYDEV
0124 E63F LD_UP1 .EQU TTYDEV
0125 E63F LD_UP2 .EQU TTYDEV
0126 E63F LD_LPT .EQU TTYDEV
0127 E63F LD_UL1 .EQU TTYDEV
0128 E63F ;;
0129 E63F ;#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
0130 E63F ;LD_UC1 .SET CIODEV_ASCI + 1
0131 E63F ;LD_PTR .SET CIODEV_ASCI + 1
0132 E63F ;LD_PTP .SET CIODEV_ASCI + 1
0133 E63F ;#ENDIF
0134 E63F ;;
0135 E63F ;#IF (UARTENABLE & (UARTCNT >= 2))
0136 E63F LD_UC1 .SET CIODEV_UART + 1
0137 E63F LD_PTR .SET CIODEV_UART + 1
0138 E63F LD_PTP .SET CIODEV_UART + 1
0139 E63F ;#ENDIF
0140 E63F ;
0141 E63F ;#IF (VDUENABLE | CVDUENABLE | N8VENABLE)
0142 E63F LD_CRT .SET CIODEV_CRT
0143 E63F ;#ENDIF
0144 E63F ;#IF (PRPENABLE & PRPCONENABLE)
0145 E63F ;LD_CRT .SET CIODEV_PRPCON
0146 E63F ;#ENDIF
0147 E63F ;#IF (PPPENABLE & PPPCONENABLE)
0148 E63F ;LD_CRT .SET CIODEV_PPPCON
0149 E63F ;#ENDIF
0150 E63F
0151 E63F #ENDIF
0152 E63F ;
0153 E63F 10 .DB DEVCNT
0154 E640 DEVMAP:
0155 E640 ;
0156 E640 ; CONSOLE
0157 E640 00 .DB LD_TTY ; CON:=TTY: (IOBYTE XXXXXX00)
0158 E641 D0 .DB LD_CRT ; CON:=CRT: (IOBYTE XXXXXX01)
0159 E642 E0 .DB LD_BAT ; CON:=BAT: (IOBYTE XXXXXX10)
0160 E643 01 .DB LD_UC1 ; CON:=UC1: (IOBYTE XXXXXX11)
0161 E644 ; READER
0162 E644 00 .DB LD_TTY ; RDR:=TTY: (IOBYTE XXXX00XX)
0163 E645 01 .DB LD_PTR ; RDR:=PTR: (IOBYTE XXXX01XX)
0164 E646 00 .DB LD_UR1 ; RDR:=UR1: (IOBYTE XXXX10XX)
0165 E647 00 .DB LD_UR2 ; RDR:=UR2: (IOBYTE XXXX11XX)
0166 E648 ; PUNCH
0167 E648 00 .DB LD_TTY ; PUN:=TTY: (IOBYTE XX00XXXX)
0168 E649 01 .DB LD_PTP ; PUN:=PTP: (IOBYTE XX01XXXX)
0169 E64A 00 .DB LD_UP1 ; PUN:=UP1: (IOBYTE XX10XXXX)
0170 E64B 00 .DB LD_UP2 ; PUN:=UP2: (IOBYTE XX11XXXX)
0171 E64C ; LIST
0172 E64C 00 .DB LD_TTY ; LST:=TTY: (IOBYTE 00XXXXXX)
0173 E64D D0 .DB LD_CRT ; LST:=CRT: (IOBYTE 01XXXXXX)
0174 E64E 00 .DB LD_LPT ; LST:=LPT: (IOBYTE 10XXXXXX)
0175 E64F 00 .DB LD_UL1 ; LST:=UL1: (IOBYTE 11XXXXXX)
0176 E650 ;
0177 E650 DEVCNT .EQU ($ - DEVMAP)
0178 E650 .ECHO DEVCNT
0179 E650 .ECHO " Input/Output devices defined.\n"
0180 E650 ;
0181 E650 ;==================================================================================================
0182 E650 ; DRIVE MAPPING TABLE
0183 E650 ;==================================================================================================
0184 E650 ;
0185 E650 ; Disk mapping is done using a drive map table (DRVMAP) which is built
0186 E650 ; dynamically at cold boot. See the DRV_INIT routine. This table is
0187 E650 ; made up of entries as documented below. The table is prefixed with one
0188 E650 ; byte indicating the number of entries. The index of the entry indicates
0189 E650 ; the drive letter, so the first entry is A:, the second entry is B:, etc.
0190 E650 ;
0191 E650 ; BYTE: DEVICE/UNIT (OR JUST UNIT FOR UNA)
0192 E650 ; BYTE: SLICE
0193 E650 ; WORD: ADDRESS OF DPH FOR THE DRIVE
0194 E650 ;
0195 E650 ;==================================================================================================
0196 E650 ; DPB MAPPING TABLE
0197 E650 ;==================================================================================================
0198 E650 ;
0199 E650 ; MAP MEDIA ID'S TO APPROPRIATE DPB ADDRESSEES
0200 E650 ; THE ENTRIES IN THIS TABLE MUST CONCIDE WITH THE VALUES
0201 E650 ; OF THE MEDIA ID'S (SAME SEQUENCE, NO GAPS)
0202 E650 ;
0203 E650 0A .DB DPBCNT
0204 E651 ;
0205 E651 DPBMAP:
0206 E651 00 00 .DW 0 ; MID_NONE (NO MEDIA)
0207 E653 D2 EB .DW DPB_ROM ; MID_MDROM
0208 E655 E6 EB .DW DPB_RAM ; MID_MDRAM
0209 E657 FA EB .DW DPB_RF ; MID_RF
0210 E659 0E EC .DW DPB_HD ; MID_HD
0211 E65B 22 EC .DW DPB_FD720 ; MID_FD720
0212 E65D 36 EC .DW DPB_FD144 ; MID_FD144
0213 E65F 4A EC .DW DPB_FD360 ; MID_FD360
0214 E661 5E EC .DW DPB_FD120 ; MID_FD120
0215 E663 72 EC .DW DPB_FD111 ; MID_FD111
0216 E665 ;
0217 E665 DPBCNT .EQU ($ - DPBMAP) / 2
0218 E665 ;
0219 E665 ;==================================================================================================
0220 E665 ; BIOS FUNCTIONS
0221 E665 ;==================================================================================================
0222 E665 ;
0223 E665 ;__________________________________________________________________________________________________
0224 E665
0225 E665 BOOT:
0226 E665 ; STANDARD BOOT INVOCATION
0227 E665 F3 DI
0228 E666 ED 56 IM 1
0229 E668 31 00 FE LD SP,STACK ; STACK FOR INITIALIZATION
0230 E66B ;
0231 E66B CD C1 ED CALL INIT ; EXECUTE COLD BOOT CODE ROUTINE
0232 E66E ;
0233 E66E 31 00 01 LD SP,$100 ; MOVE STACK SO WE CAN INIT BUFFER AREA
0234 E671 21 C1 ED LD HL,INIT ; INIT BUFFERS AREA
0235 E674 01 3F 10 LD BC,CBIOS_END - INIT ; SIZE OF BUFFER SPACE
0236 E677 CD 1C EB CALL FILL ; DO IT
0237 E67A ;
0238 E67A 31 00 FE LD SP,STACK ; PUT STACK BACK WHERE IT BELONGS
0239 E67D 18 1A JR GOCPM ; THEN OFF TO CP/M WE GO...
0240 E67F ;
0241 E67F ;__________________________________________________________________________________________________
0242 E67F WBOOT:
0243 E67F F3 DI
0244 E680 ED 56 IM 1
0245 E682 ;
0246 E682 31 00 FE LD SP,STACK ; STACK FOR INITIALIZATION
0247 E685 ;
0248 E685~ #IF (PLATFORM == PLT_UNA)
0249 E685~ ; RESTORE COMMAND PROCESSOR FROM UNA BIOS CACHE
0250 E685~ LD BC,$01FB ; UNA FUNC = SET BANK
0251 E685~ LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC)
0252 E685~ RST 08 ; DO IT
0253 E685~ PUSH DE ; SAVE PREVIOUS BANK
0254 E685~
0255 E685~ LD HL,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
0256 E685~ LD DE,CPM_LOC ; ADDRESS IN HI MEM OF CCP
0257 E685~ LD BC,CCP_SIZ ; SIZE OF CCP
0258 E685~ LDIR ; DO IT
0259 E685~
0260 E685~ LD BC,$01FB ; UNA FUNC = SET BANK
0261 E685~ POP DE ; RECOVER OPERATING BANK
0262 E685~ RST 08 ; DO IT
0263 E685 #ELSE
0264 E685 ; RESTORE COMMAND PROCESSOR FROM CACHE IN HB BANK
0265 E685 06 F3 LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
0266 E687 16 8E LD D,BID_USR ; D = DEST BANK = USR BANK = TPA
0267 E689 1E 8D LD E,BID_BIOS ; E = SRC BANK = HB BANK
0268 E68B CF RST 08 ; SET BANKS FOR INTERBANK COPY
0269 E68C 06 F2 LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
0270 E68E 2A 9B EB LD HL,(CCPBUF) ; COPY FROM FIXED LOCATION IN HB BANK
0271 E691 11 00 D0 LD DE,CPM_LOC ; TO CCP LOCATION IN USR BANK
0272 E694 DD 21 00 08 LD IX,CCP_SIZ ; COPY CONTENTS OF COMMAND PROCESSOR
0273 E698 CF RST 08 ; DO IT
0274 E699 #ENDIF
0275 E699 ;
0276 E699 ; FALL THRU TO INVOKE CP/M
0277 E699 ;
0278 E699 ;__________________________________________________________________________________________________
0279 E699 GOCPM:
0280 E699~ #IF (PLATFORM == PLT_UNA)
0281 E699~ ; USE A DEDICATED BUFFER FOR UNA PHYSICAL DISK I/O
0282 E699~ LD HL,SECBUF ; ADDRESS OF PHYSICAL SECTOR BUFFER
0283 E699~ LD (BUFADR),HL ; SAVE IT IN BUFADR FOR LATER
0284 E699 #ELSE
0285 E699 ; CALL BF_DIOSETBUF WITH A PARM OF ZERO TO CAUSE IT TO RESET
0286 E699 ; THE PHYSICAL DISK BUFFER TO THE DEFAULT LOCATION PRE-ALLOCATED
0287 E699 ; INSIDE OF THE HBIOS BANK. THE ADDRESS IS RETURNED IN HL AND SAVED.
0288 E699 06 19 LD B,BF_DIOSETBUF ; GET DISK BUFFER ADR IN HBIOS DRIVER BANK
0289 E69B 21 00 00 LD HL,0
0290 E69E CF RST 08 ; MAKE HBIOS CALL
0291 E69F 22 A2 EB LD (BUFADR),HL ; RECORD THE BUFFER ADDRESS
0292 E6A2 #ENDIF
0293 E6A2 ;
0294 E6A2 3E C3 LD A,$C3 ; LOAD A WITH 'JP' INSTRUCTION (USED BELOW)
0295 E6A4 ;
0296 E6A4 ; CPU RESET / RST 0 / JP 0 -> WARM START CP/M
0297 E6A4 32 00 00 LD ($0000),A ; JP OPCODE GOES HERE
0298 E6A7 21 03 E6 LD HL,WBOOTE ; GET WARM BOOT ENTRY ADDRESS
0299 E6AA 22 01 00 LD ($0001),HL ; AND PUT IT AT $0001
0300 E6AD
0301 E6AD ; ; INT / RST 38 -> INVOKE MONITOR
0302 E6AD ; LD ($0038),A
0303 E6AD ; LD HL,GOMON
0304 E6AD ; LD ($0039),HL
0305 E6AD
0306 E6AD ; ; INT / RST 38 -> PANIC
0307 E6AD ; LD ($0038),A
0308 E6AD ; LD HL,PANIC ; PANIC ROUTINE ADDRESS
0309 E6AD ; LD ($0039),HL ; POKE IT
0310 E6AD
0311 E6AD ; CALL 5 -> INVOKE BDOS
0312 E6AD 32 05 00 LD ($0005),A ; JP OPCODE AT $0005
0313 E6B0 21 06 D8 LD HL,BDOS_LOC + 6 ; GET BDOS ENTRY ADDRESS
0314 E6B3 22 06 00 LD ($0006),HL ; PUT IT AT $0006
0315 E6B6 ;
0316 E6B6 ; INSTALL ROMWBW CBIOS PAGE ZERO STAMP AT $40
0317 E6B6 21 33 E6 LD HL,STPIMG ; FORM STAMP DATA IMAGE
0318 E6B9 11 40 00 LD DE,STPLOC ; TO IT'S LOCATION IN PAGE ZERO
0319 E6BC 01 06 00 LD BC,STPSIZ ; SIZE OF BLOCK TO COPY
0320 E6BF ED B0 LDIR ; DO IT
0321 E6C1 ;
0322 E6C1 ; RESET (DE)BLOCKING ALGORITHM
0323 E6C1 CD C2 E7 CALL BLKRES
0324 E6C4 ;
0325 E6C4 ; DEFAULT DMA ADDRESS
0326 E6C4 01 80 00 LD BC,$80 ; DEFAULT DMA ADDRESS IS $80
0327 E6C7 CD AC E7 CALL SETDMA ; SET IT
0328 E6CA ;
0329 E6CA ; ENSURE VALID DISK AND JUMP TO CCP
0330 E6CA 3A 04 00 LD A,(CDISK) ; GET CURRENT USER/DISK
0331 E6CD E6 0F AND $0F ; ISOLATE DISK PART
0332 E6CF 4F LD C,A ; SETUP C WITH CURRENT USER/DISK, ASSUME IT IS OK
0333 E6D0 CD 7F E9 CALL DSK_STATUS ; CHECK DISK STATUS
0334 E6D3 28 05 JR Z,CURDSK ; ZERO MEANS OK
0335 E6D5 3A 9A EB LD A,(DEFDRIVE) ; CURRENT DRIVE NOT READY, USE DEFAULT
0336 E6D8 18 03 JR GOCCP ; JUMP TO COMMAND PROCESSOR
0337 E6DA CURDSK:
0338 E6DA 3A 04 00 LD A,(CDISK) ; GET CURRENT USER/DISK
0339 E6DD GOCCP:
0340 E6DD 4F LD C,A ; SETUP C WITH CURRENT USER/DISK, ASSUME IT IS OK
0341 E6DE C3 00 D0 JP CCP_ENT ; JUMP TO COMMAND PROCESSOR
0342 E6E1 ;
0343 E6E1 ;__________________________________________________________________________________________________
0344 E6E1 GOMON:
0345 E6E1 CD 66 EA CALL PANIC
0346 E6E4 ;
0347 E6E4 ; DI
0348 E6E4 ; IM 1
0349 E6E4 ;
0350 E6E4 ; LD SP,STACK
0351 E6E4 ;
0352 E6E4 ; ; RELOAD MONITOR INTO RAM (IN CASE IT HAS BEEN OVERWRITTEN)
0353 E6E4 ; CALL ROMPGZ
0354 E6E4 ; LD HL,MON_IMG
0355 E6E4 ; LD DE,MON_LOC
0356 E6E4 ; LD BC,MON_SIZ
0357 E6E4 ; LDIR
0358 E6E4 ; CALL RAMPGZ
0359 E6E4
0360 E6E4 ; ; JUMP TO MONITOR WARM ENTRY
0361 E6E4 ; JP MON_UART
0362 E6E4 ;
0363 E6E4 ;
0364 E6E4 ;==================================================================================================
0365 E6E4 ; CHARACTER BIOS FUNCTIONS
0366 E6E4 ;==================================================================================================
0367 E6E4 ;
0368 E6E4 ;__________________________________________________________________________________________________
0369 E6E4 ;
0370 E6E4 ;__________________________________________________________________________________________________
0371 E6E4 CONST:
0372 E6E4 ; CONSOLE STATUS, RETURN $FF IF CHARACTER READY, $00 IF NOT
0373 E6E4 ;
0374 E6E4 06 02 LD B,BF_CIOIST ; B = FUNCTION
0375 E6E6 21 3E E7 LD HL,CIOST ; HL = ADDRESS OF COMPLETION ROUTINE
0376 E6E9 18 0B JR CONIO
0377 E6EB ;
0378 E6EB ;__________________________________________________________________________________________________
0379 E6EB CONIN:
0380 E6EB ; CONSOLE CHARACTER INTO REGISTER A
0381 E6EB ;
0382 E6EB 06 00 LD B,BF_CIOIN ; B = FUNCTION
0383 E6ED 21 3B E7 LD HL,CIOIN ; HL = ADDRESS OF COMPLETION ROUTINE
0384 E6F0 18 04 JR CONIO
0385 E6F2
0386 E6F2 ;__________________________________________________________________________________________________
0387 E6F2 CONOUT:
0388 E6F2 ; CONSOLE CHARACTER OUTPUT FROM REGISTER C
0389 E6F2 ;
0390 E6F2 06 01 LD B,BF_CIOOUT ; B = FUNCTION
0391 E6F4 E1 POP HL ; NO COMPLETION ROUTINE, SETUP DIRECT RETURN TO CALLER
0392 E6F5 59 LD E,C ; E = CHARACTER TO SEND
0393 E6F6 ; JR CONIO ; COMMENTED OUT, FALL THROUGH OK
0394 E6F6 ;
0395 E6F6 ;__________________________________________________________________________________________________
0396 E6F6 CONIO:
0397 E6F6 ;
0398 E6F6 3A 03 00 LD A,(IOBYTE) ; GET IOBYTE
0399 E6F9 E6 03 AND $03 ; ISOLATE RELEVANT IOBYTE BITS FOR CONSOLE
0400 E6FB ; OR $00 ; PUT LOGICAL DEVICE IN BITS 2-3 (CON:=$00, RDR:=$04, PUN:=$08, LST:=$0C
0401 E6FB 18 46 JR CIO_DISP
0402 E6FD ;
0403 E6FD ;__________________________________________________________________________________________________
0404 E6FD LIST:
0405 E6FD ; LIST CHARACTER FROM REGISTER C
0406 E6FD ;
0407 E6FD 06 01 LD B,BF_CIOOUT ; B = FUNCTION
0408 E6FF E1 POP HL ; NO COMPLETION ROUTINE, SETUP DIRECT RETURN TO CALLER
0409 E700 59 LD E,C ; E = CHARACTER TO SEND
0410 E701 18 05 JR LISTIO
0411 E703 ;
0412 E703 ;__________________________________________________________________________________________________
0413 E703 LISTST:
0414 E703 ; RETURN LIST STATUS (0 IF NOT READY, 1 IF READY)
0415 E703 ;
0416 E703 06 03 LD B,BF_CIOOST ; B = FUNCTION
0417 E705 21 3E E7 LD HL,CIOST ; HL = ADDRESS OF COMPLETION ROUTINE
0418 E708 ; JR LISTIO ; COMMENTED OUT, FALL THROUGH OK
0419 E708 ;
0420 E708 ;__________________________________________________________________________________________________
0421 E708 LISTIO:
0422 E708 ;
0423 E708 3A 03 00 LD A,(IOBYTE) ; GET IOBYTE
0424 E70B 07 RLCA ; SHIFT RELEVANT BITS TO BITS 0-1
0425 E70C 07 RLCA
0426 E70D E6 03 AND $03 ; ISOLATE RELEVANT IOBYTE BITS FOR LST:
0427 E70F F6 0C OR $0C ; PUT LOGICAL DEVICE IN BITS 2-3 (CON:=$00, RDR:=$04, PUN:=$08, LST:=$0C
0428 E711 18 30 JR CIO_DISP
0429 E713 ;
0430 E713 ;__________________________________________________________________________________________________
0431 E713 PUNCH:
0432 E713 ; PUNCH CHARACTER FROM REGISTER C
0433 E713 ;
0434 E713 06 01 LD B,BF_CIOOUT ; B = FUNCTION
0435 E715 E1 POP HL ; NO COMPLETION ROUTINE, SETUP DIRECT RETURN TO CALLER
0436 E716 59 LD E,C ; E = CHARACTER TO SEND
0437 E717 ; JR PUNCHIO ; COMMENTED OUT, FALL THROUGH OK
0438 E717 ;
0439 E717 ;__________________________________________________________________________________________________
0440 E717 PUNCHIO:
0441 E717 ;
0442 E717 3A 03 00 LD A,(IOBYTE) ; GET IOBYTE
0443 E71A 07 RLCA ; SHIFT RELEVANT BITS TO BITS 0-1
0444 E71B 07 RLCA
0445 E71C 07 RLCA
0446 E71D 07 RLCA
0447 E71E E6 03 AND $03 ; ISOLATE RELEVANT IOBYTE BITS FOR PUN:
0448 E720 F6 08 OR $08 ; PUT LOGICAL DEVICE IN BITS 2-3 (CON:=$00, RDR:=$04, PUN:=$08, LST:=$0C
0449 E722 18 1F JR CIO_DISP
0450 E724 ;
0451 E724 ;__________________________________________________________________________________________________
0452 E724 READER:
0453 E724 ; READ CHARACTER INTO REGISTER A FROM READER DEVICE
0454 E724 ;
0455 E724 06 00 LD B,BF_CIOIN ; B = FUNCTION
0456 E726 21 3B E7 LD HL,CIOIN ; HL = ADDRESS OF COMPLETION ROUTINE
0457 E729 18 05 JR READERIO
0458 E72B ;
0459 E72B ;__________________________________________________________________________________________________
0460 E72B READERST:
0461 E72B ; RETURN READER STATUS (0 IF NOT READY, 1 IF READY)
0462 E72B ;
0463 E72B 06 02 LD B,BF_CIOIST ; B = FUNCTION
0464 E72D 21 3E E7 LD HL,CIOST ; HL = ADDRESS OF COMPLETION ROUTINE
0465 E730 ; JR READERIO ; COMMENTED OUT, FALL THROUGH OK
0466 E730 ;
0467 E730 ;__________________________________________________________________________________________________
0468 E730 READERIO:
0469 E730 ;
0470 E730 3A 03 00 LD A,(IOBYTE) ; GET IOBYTE
0471 E733 0F RRCA ; SHIFT RELEVANT BITS TO BITS 0-1
0472 E734 0F RRCA
0473 E735 E6 03 AND $03 ; ISOLATE RELEVANT IOBYTE BITS FOR RDR:
0474 E737 F6 04 OR $04 ; PUT LOGICAL DEVICE IN BITS 2-3 (CON:=$00, RDR:=$04, PUN:=$08, LST:=$0C
0475 E739 18 08 JR CIO_DISP
0476 E73B ;
0477 E73B ;__________________________________________________________________________________________________
0478 E73B CIOIN:
0479 E73B ; COMPLETION ROUTINE FOR CHARACTER INPUT FUNCTIONS
0480 E73B ;
0481 E73B 7B LD A,E ; MOVE CHARACTER RETURNED TO A
0482 E73C C9 RET ; FALL THRU
0483 E73D ;;
0484 E73D ;;__________________________________________________________________________________________________
0485 E73D ;CIOOUT:
0486 E73D ;; COMPLETION ROUTINE FOR CHARACTER OUTPUT FUNCTIONS
0487 E73D ;;
0488 E73D C9 RET
0489 E73E ;
0490 E73E ;__________________________________________________________________________________________________
0491 E73E CIOST:
0492 E73E ; COMPLETION ROUTINE FOR CHARACTER STATUS FUNCTIONS (IST/OST)
0493 E73E ;
0494 E73E~ #IF (PLATFORM == PLT_UNA)
0495 E73E~ LD A,E
0496 E73E #ENDIF
0497 E73E B7 OR A ; SET FLAGS
0498 E73F C8 RET Z ; NO CHARACTERS WAITING (IST) OR OUTPUT BUF FULL (OST)
0499 E740 F6 FF OR $FF ; $FF SIGNALS READY TO READ (IST) OR WRITE (OST)
0500 E742 C9 RET
0501 E743 ;
0502 E743 ;==================================================================================================
0503 E743 ; CHARACTER DEVICE INTERFACE
0504 E743 ;==================================================================================================
0505 E743 ;
0506 E743 ; ROUTING FOR CHARACTER DEVICE FUNCTIONS
0507 E743 ; A = INDEX INTO DEVICE MAP BASED ON IOBYTE BIOS REQUEST
0508 E743 ; B = FUNCTION REQUESTED: BF_CIO(IN/OUT/IST/OST)
0509 E743 ; E = CHARACTER (IF APPLICABLE TO FUNCTION)
0510 E743 ; HL = ADDRESS OF COMPLETION ROUTINE
0511 E743 ;
0512 E743 CIO_DISP:
0513 E743 E5 PUSH HL ; PUT COMPLETION ROUTINE ON STACK
0514 E744
0515 E744 ; LOOKUP IOBYTE MAPPED DEVICE CODE
0516 E744 E6 0F AND $0F ; ISOLATE INDEX INTO DEVICE MAP
0517 E746
0518 E746 21 40 E6 LD HL,DEVMAP ; HL = ADDRESS OF DEVICE MAP
0519 E749 CD 0B EB CALL ADDHLA ; ADD OFFSET
0520 E74C
0521 E74C 7E LD A,(HL) ; LOOKUP DEVICE CODE
0522 E74D~ #IF (PLATFORM == PLT_UNA)
0523 E74D~ LD C,B ; MOVE FUNCTION TO C
0524 E74D~ LD B,A ; DEVICE GOES IN B
0525 E74D #ELSE
0526 E74D 4F LD C,A ; SAVE IN C FOR BIOS USAGE
0527 E74E #ENDIF
0528 E74E
0529 E74E FE E0 CP CIODEV_BAT ; CHECK FOR SPECIAL DEVICE (BAT, NUL)
0530 E750 30 02 JR NC,CIO_DISP1 ; HANDLE SPECIAL DEVICE
0531 E752 CF RST 08 ; RETURN VIA COMPLETION ROUTINE SET AT START
0532 E753 C9 RET
0533 E754
0534 E754 CIO_DISP1:
0535 E754 ; HANDLE SPECIAL DEVICES
0536 E754 E6 F0 AND $F0 ; ISOLATE DEVICE
0537 E756 FE E0 CP CIODEV_BAT ; BAT: ?
0538 E758 28 07 JR Z,CIO_BAT ; YES, GO TO BAT DEVICE HANDLER
0539 E75A FE F0 CP CIODEV_NUL ; NUL: ?
0540 E75C 28 18 JR Z,CIO_NUL ; YES, GO TO NUL DEVICE HANDLER
0541 E75E CD 66 EA CALL PANIC ; SOMETHING BAD HAPPENED
0542 E761 ;
0543 E761 ; BAT: IS A PSEUDO DEVICE REDIRECTING INPUT TO READER AND OUTPUT TO LIST
0544 E761 ;
0545 E761 CIO_BAT:
0546 E761 4B LD C,E ; PUT CHAR BACK IN C
0547 E762 78 LD A,B ; GET REQUESTED FUNCTION
0548 E763 FE 00 CP BF_CIOIN ; INPUT?
0549 E765 28 BD JR Z,READER ; -> READER
0550 E767 FE 02 CP BF_CIOIST ; INPUT STATUS?
0551 E769 28 C0 JR Z,READERST ; -> READER
0552 E76B FE 01 CP BF_CIOOUT ; OUTPUT?
0553 E76D 28 8E JR Z,LIST ; -> LIST
0554 E76F FE 03 CP BF_CIOOST ; OUTPUT STATUS?
0555 E771 28 90 JR Z,LISTST ; -> LIST
0556 E773 CD 66 EA CALL PANIC ; SOMETHING BAD HAPPENED
0557 E776 ;
0558 E776 ; NUL: IS A DUMMY DEVICE THAT DOES NOTHING
0559 E776 ;
0560 E776 CIO_NUL:
0561 E776 78 LD A,B ; FUNCTION
0562 E777 FE 00 CP BF_CIOIN
0563 E779 28 0F JR Z,NUL_IN
0564 E77B FE 02 CP BF_CIOIST
0565 E77D 28 0E JR Z,NUL_IST
0566 E77F FE 01 CP BF_CIOOUT
0567 E781 28 09 JR Z,NUL_OUT
0568 E783 FE 03 CP BF_CIOOST
0569 E785 28 06 JR Z,NUL_OST
0570 E787 CD 66 EA CALL PANIC
0571 E78A ;
0572 E78A NUL_IN:
0573 E78A 1E 1B LD E,$1B ; RETURN EOF
0574 E78C NUL_OUT:
0575 E78C C9 RET
0576 E78D ;
0577 E78D NUL_IST:
0578 E78D NUL_OST:
0579 E78D F6 FF OR $FF ; A=$FF & NZ SET
0580 E78F C9 RET
0581 E790 ;
0582 E790 ;==================================================================================================
0583 E790 ; DISK BIOS FUNCTIONS
0584 E790 ;==================================================================================================
0585 E790 ;
0586 E790 ;__________________________________________________________________________________________________
0587 E790 SELDSK:
0588 E790 ; SELECT DISK NUMBER FOR SUBSEQUENT DISK OPS
0589 E790~ #IF DSKTRACE
0590 E790~ CALL PRTSELDSK ; *DEBUG*
0591 E790 #ENDIF
0592 E790 ;
0593 E790 C3 3C E9 JP DSK_SELECT
0594 E793 ;
0595 E793 ;__________________________________________________________________________________________________
0596 E793 HOME:
0597 E793 ; SELECT TRACK 0 (BC = 0) AND FALL THRU TO SETTRK
0598 E793~ #IF DSKTRACE
0599 E793~ CALL PRTHOME ; *DEBUG*
0600 E793 #ENDIF
0601 E793 ;
0602 E793 3A A1 EB LD A,(HSTWRT) ; CHECK FOR PENDING WRITE
0603 E796 B7 OR A ; SET FLAGS
0604 E797 20 03 JR NZ,HOMED ; BUFFER IS DIRTY
0605 E799 32 C4 EB LD (HSTACT),A ; CLEAR HOST ACTIVE FLAG
0606 E79C ;
0607 E79C HOMED:
0608 E79C 01 00 00 LD BC,0
0609 E79F ;
0610 E79F ;__________________________________________________________________________________________________
0611 E79F SETTRK:
0612 E79F ; SET TRACK GIVEN BY REGISTER BC
0613 E79F ED 43 A5 EB LD (SEKTRK),BC
0614 E7A3 C9 RET
0615 E7A4 ;
0616 E7A4 ;__________________________________________________________________________________________________
0617 E7A4 SETSEC:
0618 E7A4 ; SET SECTOR GIVEN BY REGISTER BC
0619 E7A4 ED 43 A7 EB LD (SEKSEC),BC
0620 E7A8 C9 RET
0621 E7A9 ;
0622 E7A9 ;__________________________________________________________________________________________________
0623 E7A9 SECTRN:
0624 E7A9 ; SECTOR TRANSLATION FOR SKEW, HARD CODED 1:1, NO SKEW IMPLEMENTED
0625 E7A9 60 LD H,B
0626 E7AA 69 LD L,C
0627 E7AB C9 RET
0628 E7AC ;
0629 E7AC ;__________________________________________________________________________________________________
0630 E7AC SETDMA:
0631 E7AC ED 43 9F EB LD (DMAADR),BC
0632 E7B0 C9 RET
0633 E7B1 ;
0634 E7B1 ;__________________________________________________________________________________________________
0635 E7B1 READ:
0636 E7B1 3E 00 LD A,DOP_READ
0637 E7B3 18 08 JR READWRITE
0638 E7B5 ;
0639 E7B5 ;__________________________________________________________________________________________________
0640 E7B5 WRITE:
0641 E7B5 79 LD A,C
0642 E7B6 32 9E EB LD (WRTYPE),A ; SAVE WRITE TYPE
0643 E7B9 3E 01 LD A,DOP_WRITE
0644 E7BB 18 00 JR READWRITE
0645 E7BD ;
0646 E7BD ;__________________________________________________________________________________________________
0647 E7BD READWRITE:
0648 E7BD 32 9D EB LD (DSKOP),A ; SET THE ACTIVE DISK OPERATION
0649 E7C0 18 14 JR BLKRW
0650 E7C2 ;
0651 E7C2 ;==================================================================================================
0652 E7C2 ; BLOCKED READ/WRITE (BLOCK AND BUFFER FOR 512 BYTE SECTOR)
0653 E7C2 ;==================================================================================================
0654 E7C2 ;
0655 E7C2 ;__________________________________________________________________________________________________
0656 E7C2 ;
0657 E7C2 ; RESET (DE)BLOCKING ALGORITHM - JUST MARK BUFFER INVALID
0658 E7C2 ; NOTE: BUFFER CONTENTS INVALIDATED, BUT RETAIN ANY PENDING WRITE
0659 E7C2 ;
0660 E7C2 BLKRES:
0661 E7C2 AF XOR A
0662 E7C3 32 C4 EB LD (HSTACT),A ; BUFFER NO LONGER VALID
0663 E7C6 32 CA EB LD (UNACNT),A ; CLEAR UNALLOC COUNT
0664 E7C9
0665 E7C9 C9 RET
0666 E7CA
0667 E7CA ;__________________________________________________________________________________________________
0668 E7CA ;
0669 E7CA ; FLUSH (DE)BLOCKING ALGORITHM - DO PENDING WRITES
0670 E7CA ;
0671 E7CA BLKFLSH:
0672 E7CA ; CHECK FOR BUFFER WRITTEN (DIRTY)
0673 E7CA 3A A1 EB LD A,(HSTWRT) ; GET BUFFER WRITTEN FLAG
0674 E7CD B7 OR A
0675 E7CE C8 RET Z ; NOT DIRTY, RETURN WITH A=0 AND Z SET
0676 E7CF
0677 E7CF ; CLEAR THE BUFFER WRITTEN FLAG (EVEN IF A WRITE ERROR OCCURS)
0678 E7CF AF XOR A ; Z = 0
0679 E7D0 32 A1 EB LD (HSTWRT),A ; SAVE IT
0680 E7D3
0681 E7D3 ; DO THE WRITE AND RETURN RESULT
0682 E7D3 C3 8C E9 JP DSK_WRITE
0683 E7D6
0684 E7D6 #IF WRTCACHE
0685 E7D6
0686 E7D6 WRT_ALC .EQU 0 ; WRITE TO ALLOCATED
0687 E7D6 WRT_DIR .EQU 1 ; WRITE TO DIRECTORY
0688 E7D6 WRT_UNA .EQU 2 ; WRITE TO UNALLOCATED
0689 E7D6
0690 E7D6 ;
0691 E7D6 ;__________________________________________________________________________________________________
0692 E7D6 ;
0693 E7D6 ; (DE)BLOCKING READ/WRITE ROUTINE. MANAGES PHYSICAL DISK BUFFER AND CALLS
0694 E7D6 ; PHYSICAL READ/WRITE ROUTINES APPROPRIATELY.
0695 E7D6 ;
0696 E7D6 BLKRW:
0697 E7D6~ #IF DSKTRACE
0698 E7D6~ CALL PRTDSKOP ; *DEBUG*
0699 E7D6 #ENDIF
0700 E7D6
0701 E7D6 ; FIX!!! WE ABORT ON FIRST ERROR, DRI SEEMS TO PASS ERROR STATUS TO THE END!!!
0702 E7D6
0703 E7D6 ; IF WRITE OPERATION, GO TO SPECIAL WRITE PROCESSING
0704 E7D6 3A 9D EB LD A,(DSKOP) ; GET REQUESTED OPERATION
0705 E7D9 FE 01 CP DOP_WRITE ; WRITE
0706 E7DB 28 09 JR Z,BLKRW1 ; GO TO WRITE PROCESSING
0707 E7DD
0708 E7DD ; OTHERWISE, CLEAR OUT ANY SEQUENTIAL, UNALLOC WRITE PROCESSING
0709 E7DD ; AND GO DIRECTLY TO MAIN I/O
0710 E7DD AF XOR A ; ZERO TO A
0711 E7DE 32 9E EB LD (WRTYPE),A ; SET WRITE TYPE = 0 (WRT_ALC) TO ENSURE READ OCCURS
0712 E7E1 32 CA EB LD (UNACNT),A ; SET UNACNT TO ABORT SEQ WRITE PROCESSING
0713 E7E4
0714 E7E4 18 24 JR BLKRW4 ; GO TO I/O
0715 E7E6
0716 E7E6 BLKRW1:
0717 E7E6 ; WRITE PROCESSING
0718 E7E6 ; CHECK FOR FIRST WRITE TO UNALLOCATED BLOCK
0719 E7E6 3A 9E EB LD A,(WRTYPE) ; GET WRITE TYPE
0720 E7E9 FE 02 CP WRT_UNA ; IS IT WRITE TO UNALLOC?
0721 E7EB 20 07 JR NZ,BLKRW2 ; NOPE, BYPASS
0722 E7ED
0723 E7ED ; INITIALIZE START OF SEQUENTIAL WRITING TO UNALLOCATED BLOCK
0724 E7ED ; AND THEN TREAT SUBSEQUENT PROCESSING AS A NORMAL WRITE
0725 E7ED CD 49 E8 CALL UNA_INI ; INITIALIZE SEQUENTIAL WRITE TRACKING
0726 E7F0 AF XOR A ; A = 0 = WRT_ALC
0727 E7F1 32 9E EB LD (WRTYPE),A ; NOW TREAT LIKE WRITE TO ALLOCATED
0728 E7F4
0729 E7F4 BLKRW2:
0730 E7F4 ; IF WRTYPE = WRT_ALC AND SEQ WRITE, GOTO BLKRW7 (SKIP READ)
0731 E7F4 B7 OR A ; NOTE: A WILL ALREADY HAVE THE WRITE TYPE HERE
0732 E7F5 20 0F JR NZ,BLKRW3 ; NOT TYPE = 0 = WRT_ALC, SO MOVE ON
0733 E7F7
0734 E7F7 CD 6D E8 CALL UNA_CHK ; CHECK FOR CONTINUATION OF SEQ WRITES TO UNALLOCATED BLOCK
0735 E7FA 20 0A JR NZ,BLKRW3 ; NOPE, ABORT
0736 E7FC
0737 E7FC ; WE MATCHED EVERYTHING, TREAT AS WRITE TO UNALLOCATED BLOCK
0738 E7FC 3E 02 LD A,WRT_UNA ; WRITE TO UNALLOCATED
0739 E7FE 32 9E EB LD (WRTYPE),A ; SAVE WRITE TYPE
0740 E801
0741 E801 CD 7F E8 CALL UNA_INC ; INCREMENT SEQUENTIAL WRITE TRACKING
0742 E804 18 04 JR BLKRW4 ; PROCEED TO I/O PROCESSING
0743 E806
0744 E806 BLKRW3:
0745 E806 ; NON-SEQUENTIAL WRITE DETECTED, STOP ANY FURTHER CHECKING
0746 E806 AF XOR A ; ZERO
0747 E807 32 CA EB LD (UNACNT),A ; CLEAR UNALLOCATED WRITE COUNT
0748 E80A
0749 E80A ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0750 E80A ; IS A FLUSH NEEDED HERE???
0751 E80A ; FLUSH CURRENT BUFFER CONTENTS IF NEEDED
0752 E80A ;CALL BLKFLSH ; FLUSH PENDING WRITES
0753 E80A ;RET NZ ; ABORT ON ERROR
0754 E80A ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0755 E80A
0756 E80A BLKRW4:
0757 E80A ; START OF ACTUAL I/O PROCESSING
0758 E80A CD 9E E8 CALL BLK_XLT ; DO THE LOGICAL TO PHYSICAL MAPPING: SEK... -> XLT...
0759 E80D CD C6 E8 CALL BLK_CMP ; IS THE DESIRED PHYSICAL BLOCK IN BUFFER?
0760 E810 28 19 JR Z,BLKRW6 ; BLOCK ALREADY IN ACTIVE BUFFER, NO READ REQUIRED
0761 E812
0762 E812 ; AT THIS POINT, WE KNOW WE NEED TO READ THE TARGET PHYSICAL SECTOR
0763 E812 ; IT MAY ACTUALLY BE A PREREAD FOR A SUBSEQUENT WRITE, BUT THAT IS OK
0764 E812
0765 E812 ; FIRST, FLUSH CURRENT BUFFER CONTENTS
0766 E812 CD CA E7 CALL BLKFLSH ; FLUSH PENDING WRITES
0767 E815 C0 RET NZ ; ABORT ON ERROR
0768 E816
0769 E816 ; IMPLEMENT THE TRANSLATED VALUES
0770 E816 CD BA E8 CALL BLK_SAV ; SAVE XLAT VALUES: XLT... -> HST...
0771 E819
0772 E819 ; IF WRITE TO UNALLOC BLOCK, BYPASS READ, LEAVES BUFFER UNDEFINED
0773 E819 3A 9E EB LD A,(WRTYPE)
0774 E81C FE 02 CP 2
0775 E81E 28 0B JR Z,BLKRW6
0776 E820
0777 E820 ; DO THE ACTUAL READ
0778 E820 CD 88 E9 CALL DSK_READ ; READ PHYSICAL SECTOR INTO BUFFER
0779 E823 28 06 JR Z,BLKRW6 ; GOOD READ, CONTINUE
0780 E825
0781 E825 ; IF READ FAILED, RESET (DE)BLOCKING ALGORITHM AND RETURN ERROR
0782 E825 F5 PUSH AF ; SAVE ERROR STATUS
0783 E826 CD C2 E7 CALL BLKRES ; INVALIDATE (DE)BLOCKING BUFFER
0784 E829 F1 POP AF ; RECOVER ERROR STATUS
0785 E82A C9 RET ; ERROR RETURN
0786 E82B
0787 E82B BLKRW6:
0788 E82B ; CHECK TYPE OF OPERATIONS, IF WRITE, THEN GO TO WRITE PROCESSING
0789 E82B 3A 9D EB LD A,(DSKOP) ; GET PENDING OPERATION
0790 E82E FE 01 CP DOP_WRITE ; IS IT A WRITE?
0791 E830 28 05 JR Z,BLKRW7 ; YES, GO TO WRITE PROCESSING
0792 E832
0793 E832 ; THIS IS A READ OPERATION, WE ALREADY DID THE I/O, NOW JUST DEBLOCK AND RETURN
0794 E832 CD ED E8 CALL BLK_DEBLOCK ; EXTRACT DATA FROM BLOCK
0795 E835 AF XOR A ; NO ERROR
0796 E836 C9 RET ; ALL DONE
0797 E837
0798 E837 BLKRW7:
0799 E837 ; THIS IS A WRITE OPERATION, INSERT DATA INTO BLOCK
0800 E837 CD D6 E8 CALL BLK_BLOCK ; INSERT DATA INTO BLOCK
0801 E83A
0802 E83A ; MARK THE BUFFER AS WRITTEN
0803 E83A 3E 01 LD A,TRUE ; BUFFER DIRTY = TRUE
0804 E83C 32 A1 EB LD (HSTWRT),A ; SAVE IT
0805 E83F
0806 E83F ; CHECK WRITE TYPE, IF WRT_DIR, FORCE THE PHYSICAL WRITE
0807 E83F 3A 9E EB LD A,(WRTYPE) ; GET WRITE TYPE
0808 E842 FE 01 CP WRT_DIR ; 1 = DIRECTORY WRITE
0809 E844 CA CA E7 JP Z,BLKFLSH ; FLUSH PENDING WRITES AND RETURN STATUS
0810 E847
0811 E847 AF XOR A ; ALL IS WELL, SET RETURN CODE 0
0812 E848 C9 RET ; RETURN
0813 E849 ;
0814 E849 ;__________________________________________________________________________________________________
0815 E849 ;
0816 E849 ; INITIALIZE TRACKING OF SEQUENTIAL WRITES INTO UNALLOCATED BLOCK
0817 E849 ; SETUP UNA... VARIABLES
0818 E849 ;
0819 E849 UNA_INI:
0820 E849 ; COPY SEKDSK/TRK/SEC TO UNA...
0821 E849 21 A4 EB LD HL,SEK
0822 E84C 11 C5 EB LD DE,UNA
0823 E84F 01 05 00 LD BC,UNASIZ
0824 E852 ED B0 LDIR
0825 E854
0826 E854 ; SETUP UNACNT AND UNASPT
0827 E854 2A AA EB LD HL,(SEKDPH) ; HL POINTS TO DPH
0828 E857 11 0A 00 LD DE,10 ; OFFSET OF DPB ADDRESS IN DPH
0829 E85A 19 ADD HL,DE ; DPH POINTS TO DPB ADDRESS
0830 E85B 7E LD A,(HL)
0831 E85C 23 INC HL
0832 E85D 66 LD H,(HL)
0833 E85E 6F LD L,A ; HL POINTS TO DPB
0834 E85F 4E LD C,(HL)
0835 E860 23 INC HL
0836 E861 46 LD B,(HL) ; BC HAS SPT
0837 E862 ED 43 CB EB LD (UNASPT),BC ; SAVE SECTORS PER TRACK
0838 E866 2B DEC HL
0839 E867 2B DEC HL ; HL POINTS TO RECORDS PER BLOCK (BYTE IN FRONT OF DPB)
0840 E868 7E LD A,(HL) ; GET IT
0841 E869 32 CA EB LD (UNACNT),A ; SAVE IT
0842 E86C
0843 E86C C9 RET
0844 E86D ;
0845 E86D ;__________________________________________________________________________________________________
0846 E86D ;
0847 E86D ; CHECK FOR CONTINUATION OF SEQUENTIAL WRITES TO UNALLOCATED BLOCK
0848 E86D ; SEE IF UNACNT > 0 AND UNA... VARIABLES MATCH SEK... VARIABLES
0849 E86D ;
0850 E86D UNA_CHK:
0851 E86D 3A CA EB LD A,(UNACNT) ; GET THE COUNTER
0852 E870 B7 OR A
0853 E871 20 02 JR NZ,UNA_CHK1 ; IF NOT DONE WITH BLOCK, KEEP CHECKING
0854 E873
0855 E873 ; CNT IS NOW ZERO, EXHAUSTED RECORDS IN ONE BLOCK!
0856 E873 3D DEC A ; HACK TO SET NZ
0857 E874 C9 RET ; RETURN WITH NZ
0858 E875
0859 E875 UNA_CHK1:
0860 E875 ; COMPARE UNA... VARIABLES WITH SEK... VARIABLES
0861 E875 21 A4 EB LD HL,SEK
0862 E878 11 C5 EB LD DE,UNA
0863 E87B 06 05 LD B,UNASIZ
0864 E87D 18 4F JR BLK_CMPLOOP
0865 E87F ;
0866 E87F ;__________________________________________________________________________________________________
0867 E87F ;
0868 E87F ; INCREMENT THE SEQUENTIAL WRITE TRACKING VARIABLES
0869 E87F ; TO REFLECT THE NEXT RECORD (TRK/SEC) WE EXPECT
0870 E87F ;
0871 E87F UNA_INC:
0872 E87F ; DECREMENT THE BLOCK RECORD COUNT
0873 E87F 21 CA EB LD HL,UNACNT
0874 E882 35 DEC (HL)
0875 E883
0876 E883 ; INCREMENT THE SECTOR
0877 E883 ED 5B C8 EB LD DE,(UNASEC)
0878 E887 13 INC DE
0879 E888 ED 53 C8 EB LD (UNASEC),DE
0880 E88C
0881 E88C ; CHECK FOR END OF TRACK
0882 E88C 2A CB EB LD HL,(UNASPT)
0883 E88F AF XOR A
0884 E890 ED 52 SBC HL,DE
0885 E892 C0 RET NZ
0886 E893
0887 E893 ; HANDLE END OF TRACK
0888 E893 22 C8 EB LD (UNASEC),HL ; SECTOR BACK TO 0 (NOTE: HL=0 AT THIS POINT)
0889 E896 2A C6 EB LD HL,(UNATRK) ; GET CURRENT TRACK
0890 E899 23 INC HL ; BUMP IT
0891 E89A 22 C6 EB LD (UNATRK),HL ; SAVE IT
0892 E89D
0893 E89D C9 RET
0894 E89E~ #ELSE
0895 E89E~ ;
0896 E89E~ ;__________________________________________________________________________________________________
0897 E89E~ ;
0898 E89E~ ; (DE)BLOCKING READ/WRITE ROUTINE. MANAGES PHYSICAL DISK BUFFER AND CALLS
0899 E89E~ ; PHYSICAL READ/WRITE ROUTINES APPROPRIATELY.
0900 E89E~ ;
0901 E89E~ BLKRW:
0902 E89E~ #IF DSKTRACE
0903 E89E~ CALL PRTDSKOP ; *DEBUG*
0904 E89E~ #ENDIF
0905 E89E~
0906 E89E~ CALL BLK_XLT ; SECTOR XLAT: SEK... -> XLT...
0907 E89E~ CALL BLK_CMP ; IN BUFFER?
0908 E89E~ JR Z,BLKRW1 ; YES, BYPASS READ
0909 E89E~ CALL BLK_SAV ; SAVE XLAT VALUES: XLT... -> HST...
0910 E89E~ LD A,FALSE ; ASSUME FAILURE, INVALIDATE BUFFER
0911 E89E~ LD (HSTACT),A ; SAVE IT
0912 E89E~ CALL DSK_READ ; READ PHYSICAL SECTOR INTO BUFFER
0913 E89E~ RET NZ ; BAIL OUT ON ERROR
0914 E89E~
0915 E89E~ BLKRW1:
0916 E89E~ LD A,(DSKOP) ; GET PENDING OPERATION
0917 E89E~ CP DOP_WRITE ; IS IT A WRITE?
0918 E89E~ JR Z,BLKRW2 ; YES, GO TO WRITE ROUTINE
0919 E89E~
0920 E89E~ CALL BLK_DEBLOCK ; EXTRACT DATA FROM BLOCK
0921 E89E~ XOR A ; NO ERROR
0922 E89E~ RET ; ALL DONE
0923 E89E~
0924 E89E~ BLKRW2:
0925 E89E~ CALL BLK_BLOCK ; INSERT DATA INTO BLOCK
0926 E89E~ CALL DSK_WRITE ; WRITE PHYSICAL SECTOR FROM BUFFER
0927 E89E~ RET NZ ; BAIL OUT ON ERROR
0928 E89E~
0929 E89E~ LD A,TRUE ; BUFFER IS NOW VALID
0930 E89E~ LD (HSTACT),A ; SAVE IT
0931 E89E~
0932 E89E~ XOR A ; ALL IS WELL, SET RETURN CODE 0
0933 E89E~ RET ; RETURN
0934 E89E #ENDIF
0935 E89E ;
0936 E89E ;__________________________________________________________________________________________________
0937 E89E ;
0938 E89E ; TRANSLATE FROM CP/M DSK/TRK/SEC TO PHYSICAL
0939 E89E ; SEK... -> XLT...
0940 E89E ;
0941 E89E BLK_XLT:
0942 E89E ; FIRST, DO A BYTE COPY OF SEK... TO XLT...
0943 E89E 21 A4 EB LD HL,SEK
0944 E8A1 11 AF EB LD DE,XLT
0945 E8A4 01 0B 00 LD BC,XLTSIZ
0946 E8A7 ED B0 LDIR
0947 E8A9
0948 E8A9 ; NOW UPDATE XLTSEC BASED ON (DE)BLOCKING FACTOR (ALWAYS 4:1)
0949 E8A9 ED 4B A7 EB LD BC,(SEKSEC) ; SECTOR IS FACTORED DOWN (4:1) DUE TO BLOCKING
0950 E8AD CB 38 SRL B ; 16 BIT RIGHT SHIFT TWICE TO DIVIDE BY 4
0951 E8AF CB 19 RR C
0952 E8B1 CB 38 SRL B
0953 E8B3 CB 19 RR C
0954 E8B5 ED 43 B2 EB LD (XLTSEC),BC
0955 E8B9
0956 E8B9 C9 RET
0957 E8BA ;
0958 E8BA ;__________________________________________________________________________________________________
0959 E8BA ;
0960 E8BA ; SAVE RESULTS OF TRANSLATION: XLT... -> HST...
0961 E8BA ; IMPLICITLY SETS HSTACT TO TRUE!
0962 E8BA ;
0963 E8BA BLK_SAV:
0964 E8BA 21 AF EB LD HL,XLT
0965 E8BD 11 BA EB LD DE,HST
0966 E8C0 01 0B 00 LD BC,XLTSIZ
0967 E8C3 ED B0 LDIR
0968 E8C5 C9 RET
0969 E8C6 ;
0970 E8C6 ;__________________________________________________________________________________________________
0971 E8C6 ;
0972 E8C6 ; COMPARE RESULTS OF TRANSLATION TO CURRENT BUF (XLT... TO HST...)
0973 E8C6 ; NOTE THAT HSTACT IS COMPARED TO XLTACT IMPLICITLY! XLTACT IS ALWAYS TRUE, SO
0974 E8C6 ; HSTACT MUST BE TRUE FOR COMPARE TO SUCCEED.
0975 E8C6 ;
0976 E8C6 BLK_CMP:
0977 E8C6 21 AF EB LD HL,XLT
0978 E8C9 11 BA EB LD DE,HST
0979 E8CC 06 0B LD B,XLTSIZ
0980 E8CE BLK_CMPLOOP:
0981 E8CE 1A LD A,(DE)
0982 E8CF BE CP (HL)
0983 E8D0 C0 RET NZ ; BAD COMPARE, RETURN WITH NZ
0984 E8D1 23 INC HL
0985 E8D2 13 INC DE
0986 E8D3 10 F9 DJNZ BLK_CMPLOOP
0987 E8D5 C9 RET ; RETURN WITH Z
0988 E8D6 ;
0989 E8D6 ;__________________________________________________________________________________________________
0990 E8D6 ;
0991 E8D6 ; BLOCK DATA - INSERT CPM DMA BUF INTO PROPER PART OF PHYSICAL SECTOR BUFFER
0992 E8D6 ;
0993 E8D6 BLK_BLOCK:
0994 E8D6~ #IF (PLATFORM == PLT_UNA)
0995 E8D6~ CALL BLK_SETUP
0996 E8D6~ EX DE,HL
0997 E8D6~ LD BC,128
0998 E8D6~ LDIR
0999 E8D6~ RET
1000 E8D6 #ELSE
1001 E8D6 06 F3 LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
1002 E8D8 1E 8E LD E,BID_USR ; E=SRC=USER BANK=TPA
1003 E8DA 16 8D LD D,BID_BIOS ; D=DEST=HBIOS
1004 E8DC CF RST 08 ; SET BANKS FOR INTERBANK COPY
1005 E8DD CD 03 E9 CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
1006 E8E0 06 F2 LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
1007 E8E2 EB EX DE,HL ; SWAP HL/DE FOR BLOCK OPERATION
1008 E8E3 DD E5 PUSH IX ; SAVE IX
1009 E8E5 DD 21 80 00 LD IX,128 ; DMA BUFFER SIZE
1010 E8E9 CF RST 08 ; DO IT
1011 E8EA DD E1 POP IX ; RESTORE IX
1012 E8EC C9 RET
1013 E8ED #ENDIF
1014 E8ED ;
1015 E8ED ;__________________________________________________________________________________________________
1016 E8ED ;
1017 E8ED ; DEBLOCK DATA - EXTRACT DESIRED CPM DMA BUF FROM PHYSICAL SECTOR BUFFER
1018 E8ED ;
1019 E8ED BLK_DEBLOCK:
1020 E8ED~ #IF (PLATFORM == PLT_UNA)
1021 E8ED~ CALL BLK_SETUP
1022 E8ED~ LD BC,128
1023 E8ED~ LDIR
1024 E8ED~ RET
1025 E8ED #ELSE
1026 E8ED 06 F3 LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
1027 E8EF 1E 8D LD E,BID_BIOS ; C=SRC=HBIOS
1028 E8F1 16 8E LD D,BID_USR ; B=DEST=USER BANK=TPA
1029 E8F3 CF RST 08 ; DO IT
1030 E8F4 CD 03 E9 CALL BLK_SETUP ; SETUP SOURCE AND DESTINATION
1031 E8F7 06 F2 LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
1032 E8F9 DD E5 PUSH IX ; SAVE IX
1033 E8FB DD 21 80 00 LD IX,128 ; DMA BUFFER SIZE
1034 E8FF CF RST 08 ; DO IT
1035 E900 DD E1 POP IX ; RESTORE IX
1036 E902 C9 RET
1037 E903 #ENDIF
1038 E903 ;
1039 E903 ;__________________________________________________________________________________________________
1040 E903 ;
1041 E903 ; SETUP SOURCE AND DESTINATION POINTERS FOR BLOCK COPY OPERATION
1042 E903 ; AT EXIT, HL = ADDRESS OF DESIRED BLOCK IN SECTOR BUFFER, DE = DMA
1043 E903 ;
1044 E903 BLK_SETUP:
1045 E903 ED 4B A7 EB LD BC,(SEKSEC)
1046 E907 79 LD A,C
1047 E908 E6 03 AND 3 ; A = INDEX OF CPM BUF IN SEC BUF
1048 E90A 0F RRCA ; MULTIPLY BY 64
1049 E90B 0F RRCA
1050 E90C 5F LD E,A ; INTO LOW ORDER BYTE OF DESTINATION
1051 E90D 16 00 LD D,0 ; HIGH ORDER BYTE IS ZERO
1052 E90F 2A A2 EB LD HL,(BUFADR) ; HL = START OF SEC BUF
1053 E912 19 ADD HL,DE ; ADD IN COMPUTED OFFSET
1054 E913 19 ADD HL,DE ; HL NOW = INDEX * 128 (SOURCE)
1055 E914 ED 5B 9F EB LD DE,(DMAADR) ; DE = DESTINATION = DMA BUF
1056 E918 C9 RET
1057 E919 ;
1058 E919 ;==================================================================================================
1059 E919 ; PHYSICAL DISK INTERFACE
1060 E919 ;==================================================================================================
1061 E919 ;
1062 E919 ; LOOKUP DISK INFORMATION BASED ON CPM DRIVE IN C
1063 E919 ; ON RETURN, D=DEVICE/UNIT, E=SLICE, HL=DPH ADDRESS
1064 E919 ;
1065 E919 DSK_GETINF:
1066 E919 2A 3B E6 LD HL,(DRVMAPADR) ; HL := START OF UNA DRIVE MAP
1067 E91C 2B DEC HL ; POINT TO DRIVE COUNT
1068 E91D 79 LD A,C ; A := CPM DRIVE
1069 E91E BE CP (HL) ; COMPARE TO NUMBER OF DRIVES CONFIGURED
1070 E91F 30 14 JR NC,DSK_GETINF1 ; IF OUT OF RANGE, GO TO ERROR RETURN
1071 E921 23 INC HL ; POINT TO START OF DRIVE MAP
1072 E922 ;
1073 E922 07 RLCA ; MULTIPLY A BY 4...
1074 E923 07 RLCA ; TO USE AS OFFSET INTO ???? MAP
1075 E924 CD 0B EB CALL ADDHLA ; ADD OFFSET
1076 E927 56 LD D,(HL) ; D := DEVICE/UNIT
1077 E928 23 INC HL ; BUMP TO SLICE
1078 E929 5E LD E,(HL) ; E := SLICE
1079 E92A 23 INC HL ; POINT TO DPH LSB
1080 E92B 7E LD A,(HL) ; A := DPH LSB
1081 E92C 23 INC HL ; POINT TO DPH MSB
1082 E92D 66 LD H,(HL) ; H := DPH MSB
1083 E92E 6F LD L,A ; L := DPH LSB
1084 E92F 7C LD A,H ; TEST FOR INVALID DPH
1085 E930 B5 OR L ; ... BY CHECKING FOR ZERO VALUE
1086 E931 28 02 JR Z,DSK_GETINF1 ; HANDLE ZERO DPH, DRIVE IS INVALID
1087 E933 AF XOR A ; SET SUCCESS
1088 E934 C9 RET
1089 E935 ;
1090 E935 DSK_GETINF1: ; ERROR RETURN
1091 E935 AF XOR A
1092 E936 67 LD H,A
1093 E937 6F LD L,A
1094 E938 57 LD D,A
1095 E939 5F LD E,A
1096 E93A 3C INC A
1097 E93B C9 RET
1098 E93C ;
1099 E93C ;
1100 E93C ;
1101 E93C DSK_SELECT:
1102 E93C 43 LD B,E ; SAVE E IN B FOR NOW
1103 E93D CD 19 E9 CALL DSK_GETINF ; GET D=DEVICE/UNIT, E=SLICE, HL=DPH ADDRESS
1104 E940 C0 RET NZ ; RETURN IF INVALID DRIVE (A=1, NZ SET, HL=0)
1105 E941 C5 PUSH BC ; WE NEED B LATER, SAVE ON STACK
1106 E942 ;
1107 E942 ; SAVE ALL THE NEW STUFF
1108 E942 79 LD A,C ; A := CPM DRIVE NO
1109 E943 32 A4 EB LD (SEKDSK),A ; SAVE IT
1110 E946 7A LD A,D ; A := DEVICE/UNIT
1111 E947 32 A9 EB LD (SEKDU),A ; SAVE DEVICE/UNIT
1112 E94A 22 AA EB LD (SEKDPH),HL ; SAVE DPH POINTER
1113 E94D ;
1114 E94D ; UPDATE OFFSET FOR ACTIVE SLICE
1115 E94D ; A TRACK IS ASSUMED TO BE 16 SECTORS
1116 E94D ; THE OFFSET REPRESENTS THE NUMBER OF BLOCKS * 256
1117 E94D ; TO USE AS THE OFFSET
1118 E94D 26 41 LD H,65 ; H = TRACKS PER SLICE, E = SLICE NO
1119 E94F CD 10 EB CALL MULT8 ; HL := H * E (TOTAL TRACK OFFSET)
1120 E952 22 AC EB LD (SEKOFF),HL ; SAVE NEW TRACK OFFSET
1121 E955 ;
1122 E955 ; RESTORE DE TO BC (FOR ACCESS TO DRIVE LOGIN BIT)
1123 E955 C1 POP BC ; GET ORIGINAL E INTO B
1124 E956 ;
1125 E956 #IF (PLATFORM != PLT_UNA)
1126 E956 ;
1127 E956 ; CHECK IF THIS IS LOGIN, IF NOT, BYPASS MEDIA DETECTION
1128 E956 ; FIX: WHAT IF PREVIOUS MEDIA DETECTION FAILED???
1129 E956 CB 40 BIT 0,B ; TEST DRIVE LOGIN BIT
1130 E958 20 20 JR NZ,DSK_SELECT2 ; BYPASS MEDIA DETECTION
1131 E95A ;
1132 E95A ; DETERMINE MEDIA IN DRIVE
1133 E95A 3A A9 EB LD A,(SEKDU) ; GET DEVICE/UNIT
1134 E95D 4F LD C,A ; STORE IN C
1135 E95E 06 13 LD B,BF_DIOMED ; DRIVER FUNCTION = DISK MEDIA
1136 E960 CF RST 08
1137 E961 B7 OR A ; SET FLAGS
1138 E962 21 00 00 LD HL,0 ; ASSUME FAILURE
1139 E965 C8 RET Z ; BAIL OUT IF NO MEDIA
1140 E966 ;
1141 E966 ; A HAS MEDIA ID, SET HL TO CORRESPONDING DPBMAP ENTRY
1142 E966 21 51 E6 LD HL,DPBMAP ; HL = DPBMAP
1143 E969 07 RLCA ; DPBMAP ENTRIES ARE 2 BYTES EACH
1144 E96A CD 0B EB CALL ADDHLA ; ADD OFFSET TO HL
1145 E96D ;
1146 E96D ; LOOKUP THE ACTUAL DPB ADDRESS NOW
1147 E96D 5E LD E,(HL) ; DEREFERENCE HL...
1148 E96E 23 INC HL ; INTO DE...
1149 E96F 56 LD D,(HL) ; DE = ADDRESS OF DESIRED DPB
1150 E970 ;
1151 E970 ; PLUG DPB INTO THE ACTIVE DPH
1152 E970 2A AA EB LD HL,(SEKDPH)
1153 E973 01 0A 00 LD BC,10 ; OFFSET OF DPB IN DPH
1154 E976 09 ADD HL,BC ; HL := DPH.DPB
1155 E977 73 LD (HL),E ; SET LSB OF DPB IN DPH
1156 E978 23 INC HL ; BUMP TO MSB
1157 E979 72 LD (HL),D ; SET MSB OF DPB IN DPH
1158 E97A #ENDIF
1159 E97A ;
1160 E97A DSK_SELECT2:
1161 E97A 2A AA EB LD HL,(SEKDPH) ; HL = DPH ADDRESS FOR CP/M
1162 E97D AF XOR A ; FLAG SUCCESS
1163 E97E C9 RET ; NORMAL RETURN
1164 E97F ;
1165 E97F ;
1166 E97F ;
1167 E97F DSK_STATUS:
1168 E97F~ #IF (PLATFORM == PLT_UNA)
1169 E97F~ XOR A ; ASSUME OK FOR NOW
1170 E97F~ RET ; RETURN
1171 E97F #ELSE
1172 E97F ; C HAS CPM DRIVE, LOOKUP DEVICE/UNIT AND CHECK FOR INVALID DRIVE
1173 E97F CD 19 E9 CALL DSK_GETINF ; B = DEVICE/UNIT
1174 E982 C0 RET NZ ; INVALID DRIVE ERROR
1175 E983
1176 E983 ; VALID DRIVE, DISPATCH TO DRIVER
1177 E983 4A LD C,D ; C := DEVICE/UNIT
1178 E984 06 12 LD B,BF_DIOST ; B := FUNCTION: STATUS
1179 E986 CF RST 08
1180 E987 C9 RET
1181 E988 #ENDIF
1182 E988 ;
1183 E988 ;
1184 E988 ;
1185 E988 DSK_READ:
1186 E988 ; SET B = FUNCTION: READ
1187 E988 06 10 LD B,BF_DIORD
1188 E98A 18 04 JR DSK_IO
1189 E98C ;
1190 E98C ;
1191 E98C ;
1192 E98C DSK_WRITE:
1193 E98C ; SET B = FUNCTION: WRITE
1194 E98C 06 11 LD B,BF_DIOWR
1195 E98E 18 00 JR DSK_IO
1196 E990 ;
1197 E990 ;
1198 E990 ;
1199 E990~ #IF (PLATFORM == PLT_UNA)
1200 E990~
1201 E990~ DSK_IO:
1202 E990~ DSK_IO1:
1203 E990~ PUSH BC
1204 E990~ LD DE,(HSTTRK) ; GET TRACK INTO HL
1205 E990~ LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS
1206 E990~ DSK_IO2:
1207 E990~ SLA E ; SHIFT DE LEFT BY 4 BITS
1208 E990~ RL D
1209 E990~ DJNZ DSK_IO2 ; LOOP TILL ALL BITS DONE
1210 E990~ LD A,(HSTSEC) ; GET THE SECTOR INTO A
1211 E990~ AND $0F ; GET RID OF TOP NIBBLE
1212 E990~ OR E ; COMBINE WITH E
1213 E990~ LD E,A ; BACK IN E
1214 E990~ LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA
1215 E990~ ; APPLY OFFSET NOW
1216 E990~ ; OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO OFFSET!
1217 E990~ LD A,(HSTOFF) ; LSB OF SLICE OFFSET TO A
1218 E990~ ADD A,D ; ADD WITH D
1219 E990~ LD D,A ; PUT IT BACK IN D
1220 E990~ LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A
1221 E990~ CALL ADDHLA ; ADD OFFSET
1222 E990~ POP BC ; RECOVER FUNCTION IN B
1223 E990~ LD A,(HSTDU) ; GET THE DEVICE/UNIT VALUE
1224 E990~ LD C,A ; PUT IT IN C
1225 E990~ ; DISPATCH TO DRIVER
1226 E990~ PUSH BC
1227 E990~ EX DE,HL ; DE:HL NOW HAS LBA
1228 E990~ LD B,C ; UNIT TO B
1229 E990~ LD C,$41 ; UNA SET LBA
1230 E990~ RST 08 ; CALL UNA
1231 E990~ CALL NZ,PANIC
1232 E990~ POP BC ; RECOVER B=FUNC, C=UNIT
1233 E990~ LD E,C ; UNIT TO E
1234 E990~ LD C,B ; FUNC TO C
1235 E990~ LD B,E ; UNIT TO B
1236 E990~ LD DE,(BUFADR) ; SET BUFFER ADDRESS
1237 E990~ LD HL,1 ; 1 SECTOR
1238 E990~
1239 E990~ RST 08
1240 E990~ CALL NZ,PANIC
1241 E990~ XOR A ; SET FLAGS BASED ON RESULT
1242 E990~ RET
1243 E990~
1244 E990 #ELSE
1245 E990
1246 E990 DSK_IO:
1247 E990 3A BF EB LD A,(HSTDU) ; GET ACTIVE DEVICE/UNIT BYTE
1248 E993 E6 F0 AND $F0 ; ISOLATE DEVICE PORTION
1249 E995 FE 10 CP DIODEV_FD ; FLOPPY?
1250 E997 20 13 JR NZ,DSK_IO1 ; NO, USE LBA HANDLING
1251 E999 ; SET HL=TRACK (ADD IN TRACK OFFSET)
1252 E999 ED 5B C2 EB LD DE,(HSTOFF) ; DE = TRACK OFFSET FOR LU SUPPORT
1253 E99D 2A BB EB LD HL,(HSTTRK) ; HL = TRACK #
1254 E9A0 19 ADD HL,DE ; APPLY OFFSET FOR ACTIVE SLICE
1255 E9A1 ; SET DE=SECTOR
1256 E9A1 ED 5B BD EB LD DE,(HSTSEC) ; DE = SECTOR #
1257 E9A5 ; SET C = DEVICE/UNIT
1258 E9A5 3A BF EB LD A,(HSTDU) ; LOAD DEVICE/UNIT VALUE
1259 E9A8 4F LD C,A ; SAVE IN C
1260 E9A9 ; DISPATCH TO DRIVER
1261 E9A9 CF RST 08
1262 E9AA B7 OR A ; SET FLAGS BASED ON RESULT
1263 E9AB C9 RET
1264 E9AC ; NEW LBA HANDLING
1265 E9AC ; COERCE TRACK/SECTOR INTO HL:DE AS 0000:TTTS
1266 E9AC DSK_IO1:
1267 E9AC C5 PUSH BC
1268 E9AD ED 5B BB EB LD DE,(HSTTRK) ; GET TRACK INTO HL
1269 E9B1 06 04 LD B,4 ; PREPARE TO LEFT SHIFT BY 4 BITS
1270 E9B3 DSK_IO2:
1271 E9B3 CB 23 SLA E ; SHIFT DE LEFT BY 4 BITS
1272 E9B5 CB 12 RL D
1273 E9B7 10 FA DJNZ DSK_IO2 ; LOOP TILL ALL BITS DONE
1274 E9B9 3A BD EB LD A,(HSTSEC) ; GET THE SECTOR INTO A
1275 E9BC E6 0F AND $0F ; GET RID OF TOP NIBBLE
1276 E9BE B3 OR E ; COMBINE WITH E
1277 E9BF 5F LD E,A ; BACK IN E
1278 E9C0 21 00 00 LD HL,0 ; HL:DE NOW HAS SLICE RELATIVE LBA
1279 E9C3 ; APPLY OFFSET NOW
1280 E9C3 ; OFFSET IS EXPRESSED AS NUMBER OF BLOCKS * 256 TO OFFSET!
1281 E9C3 3A C2 EB LD A,(HSTOFF) ; LSB OF SLICE OFFSET TO A
1282 E9C6 82 ADD A,D ; ADD WITH D
1283 E9C7 57 LD D,A ; PUT IT BACK IN D
1284 E9C8 3A C3 EB LD A,(HSTOFF+1) ; MSB OF SLICE OFFSET TO A
1285 E9CB CD 0B EB CALL ADDHLA ; ADD OFFSET
1286 E9CE C1 POP BC ; RECOVER FUNCTION IN B
1287 E9CF 3A BF EB LD A,(HSTDU) ; GET THE DEVICE/UNIT VALUE
1288 E9D2 4F LD C,A ; PUT IT IN C
1289 E9D3 ; DISPATCH TO DRIVER
1290 E9D3 CF RST 08
1291 E9D4 B7 OR A ; SET FLAGS BASED ON RESULT
1292 E9D5 C9 RET
1293 E9D6
1294 E9D6 #ENDIF
1295 E9D6 ;
1296 E9D6 ;==================================================================================================
1297 E9D6 ; UTILITY FUNCTIONS
1298 E9D6 ;==================================================================================================
1299 E9D6 ;
1300 E9D6 #DEFINE CIOMODE_CBIOS
1301 E9D6 ORG_UTIL .EQU $
1302 E9D6 #INCLUDE "util.asm"
0001+ E9D6 ;
0002+ E9D6 ;==================================================================================================
0003+ E9D6 ; UTILITY FUNCTIONS
0004+ E9D6 ;==================================================================================================
0005+ E9D6 ;
0006+ E9D6 ;
0007+ E9D6 CHR_CR .EQU 0DH
0008+ E9D6 CHR_LF .EQU 0AH
0009+ E9D6 CHR_BS .EQU 08H
0010+ E9D6 CHR_ESC .EQU 1BH
0011+ E9D6 ;
0012+ E9D6 ;__________________________________________________________________________________________________
0013+ E9D6 ;
0014+ E9D6 ; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS
0015+ E9D6 ;
0016+ E9D6 PC_SPACE:
0017+ E9D6 F5 PUSH AF
0018+ E9D7 3E 20 LD A,' '
0019+ E9D9 18 3C JR PC_PRTCHR
0020+ E9DB
0021+ E9DB PC_PERIOD:
0022+ E9DB F5 PUSH AF
0023+ E9DC 3E 2E LD A,'.'
0024+ E9DE 18 37 JR PC_PRTCHR
0025+ E9E0
0026+ E9E0 PC_COLON:
0027+ E9E0 F5 PUSH AF
0028+ E9E1 3E 3A LD A,':'
0029+ E9E3 18 32 JR PC_PRTCHR
0030+ E9E5
0031+ E9E5 PC_COMMA:
0032+ E9E5 F5 PUSH AF
0033+ E9E6 3E 2C LD A,','
0034+ E9E8 18 2D JR PC_PRTCHR
0035+ E9EA
0036+ E9EA PC_LBKT:
0037+ E9EA F5 PUSH AF
0038+ E9EB 3E 5B LD A,'['
0039+ E9ED 18 28 JR PC_PRTCHR
0040+ E9EF
0041+ E9EF PC_RBKT:
0042+ E9EF F5 PUSH AF
0043+ E9F0 3E 5D LD A,']'
0044+ E9F2 18 23 JR PC_PRTCHR
0045+ E9F4
0046+ E9F4 PC_LT:
0047+ E9F4 F5 PUSH AF
0048+ E9F5 3E 3C LD A,'<'
0049+ E9F7 18 1E JR PC_PRTCHR
0050+ E9F9
0051+ E9F9 PC_GT:
0052+ E9F9 F5 PUSH AF
0053+ E9FA 3E 3E LD A,'>'
0054+ E9FC 18 19 JR PC_PRTCHR
0055+ E9FE
0056+ E9FE PC_LPAREN:
0057+ E9FE F5 PUSH AF
0058+ E9FF 3E 28 LD A,'('
0059+ EA01 18 14 JR PC_PRTCHR
0060+ EA03
0061+ EA03 PC_RPAREN:
0062+ EA03 F5 PUSH AF
0063+ EA04 3E 29 LD A,')'
0064+ EA06 18 0F JR PC_PRTCHR
0065+ EA08
0066+ EA08 PC_ASTERISK:
0067+ EA08 F5 PUSH AF
0068+ EA09 3E 2A LD A,'*'
0069+ EA0B 18 0A JR PC_PRTCHR
0070+ EA0D
0071+ EA0D PC_CR:
0072+ EA0D F5 PUSH AF
0073+ EA0E 3E 0D LD A,CHR_CR
0074+ EA10 18 05 JR PC_PRTCHR
0075+ EA12
0076+ EA12 PC_LF:
0077+ EA12 F5 PUSH AF
0078+ EA13 3E 0A LD A,CHR_LF
0079+ EA15 18 00 JR PC_PRTCHR
0080+ EA17
0081+ EA17 PC_PRTCHR:
0082+ EA17 CD B6 EA CALL COUT
0083+ EA1A F1 POP AF
0084+ EA1B C9 RET
0085+ EA1C
0086+ EA1C NEWLINE:
0087+ EA1C CD 0D EA CALL PC_CR
0088+ EA1F CD 12 EA CALL PC_LF
0089+ EA22 C9 RET
0090+ EA23 ;
0091+ EA23 ; PRINT THE HEX BYTE VALUE IN A
0092+ EA23 ;
0093+ EA23 PRTHEXBYTE:
0094+ EA23 F5 PUSH AF
0095+ EA24 D5 PUSH DE
0096+ EA25 CD 3E EA CALL HEXASCII
0097+ EA28 7A LD A,D
0098+ EA29 CD B6 EA CALL COUT
0099+ EA2C 7B LD A,E
0100+ EA2D CD B6 EA CALL COUT
0101+ EA30 D1 POP DE
0102+ EA31 F1 POP AF
0103+ EA32 C9 RET
0104+ EA33 ;
0105+ EA33 ; PRINT THE HEX WORD VALUE IN BC
0106+ EA33 ;
0107+ EA33 PRTHEXWORD:
0108+ EA33 F5 PUSH AF
0109+ EA34 78 LD A,B
0110+ EA35 CD 23 EA CALL PRTHEXBYTE
0111+ EA38 79 LD A,C
0112+ EA39 CD 23 EA CALL PRTHEXBYTE
0113+ EA3C F1 POP AF
0114+ EA3D C9 RET
0115+ EA3E ;
0116+ EA3E ; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
0117+ EA3E ;
0118+ EA3E HEXASCII:
0119+ EA3E 57 LD D,A
0120+ EA3F CD 4D EA CALL HEXCONV
0121+ EA42 5F LD E,A
0122+ EA43 7A LD A,D
0123+ EA44 07 RLCA
0124+ EA45 07 RLCA
0125+ EA46 07 RLCA
0126+ EA47 07 RLCA
0127+ EA48 CD 4D EA CALL HEXCONV
0128+ EA4B 57 LD D,A
0129+ EA4C C9 RET
0130+ EA4D ;
0131+ EA4D ; CONVERT LOW NIBBLE OF A TO ASCII HEX
0132+ EA4D ;
0133+ EA4D HEXCONV:
0134+ EA4D E6 0F AND 0FH ;LOW NIBBLE ONLY
0135+ EA4F C6 90 ADD A,90H
0136+ EA51 27 DAA
0137+ EA52 CE 40 ADC A,40H
0138+ EA54 27 DAA
0139+ EA55 C9 RET
0140+ EA56 ;
0141+ EA56 ; OUTPUT A '$' TERMINATED STRING
0142+ EA56 ;
0143+ EA56 WRITESTR:
0144+ EA56 F5 PUSH AF
0145+ EA57 WRITESTR1:
0146+ EA57 1A LD A,(DE)
0147+ EA58 FE 24 CP '$' ; TEST FOR STRING TERMINATOR
0148+ EA5A CA 64 EA JP Z,WRITESTR2
0149+ EA5D CD B6 EA CALL COUT
0150+ EA60 13 INC DE
0151+ EA61 C3 57 EA JP WRITESTR1
0152+ EA64 WRITESTR2:
0153+ EA64 F1 POP AF
0154+ EA65 C9 RET
0155+ EA66 ;
0156+ EA66 ; PANIC: TRY TO DUMP MACHINE STATE AND HALT
0157+ EA66 ;
0158+ EA66 PANIC:
0159+ EA66 E5 PUSH HL
0160+ EA67 D5 PUSH DE
0161+ EA68 C5 PUSH BC
0162+ EA69 F5 PUSH AF
0163+ EA6A 11 D7 EA LD DE,STR_PANIC
0164+ EA6D CD 56 EA CALL WRITESTR
0165+ EA70 11 EC EA LD DE,STR_AF
0166+ EA73 CD 56 EA CALL WRITESTR
0167+ EA76 C1 POP BC ; AF
0168+ EA77 CD 33 EA CALL PRTHEXWORD
0169+ EA7A 11 F1 EA LD DE,STR_BC
0170+ EA7D CD 56 EA CALL WRITESTR
0171+ EA80 C1 POP BC ; BC
0172+ EA81 CD 33 EA CALL PRTHEXWORD
0173+ EA84 11 F6 EA LD DE,STR_DE
0174+ EA87 CD 56 EA CALL WRITESTR
0175+ EA8A C1 POP BC ; DE
0176+ EA8B CD 33 EA CALL PRTHEXWORD
0177+ EA8E 11 FB EA LD DE,STR_HL
0178+ EA91 CD 56 EA CALL WRITESTR
0179+ EA94 C1 POP BC ; HL
0180+ EA95 CD 33 EA CALL PRTHEXWORD
0181+ EA98 11 00 EB LD DE,STR_PC
0182+ EA9B CD 56 EA CALL WRITESTR
0183+ EA9E C1 POP BC ; PC
0184+ EA9F CD 33 EA CALL PRTHEXWORD
0185+ EAA2 11 05 EB LD DE,STR_SP
0186+ EAA5 CD 56 EA CALL WRITESTR
0187+ EAA8 21 00 00 LD HL,0
0188+ EAAB 39 ADD HL,SP ; SP
0189+ EAAC 44 LD B,H
0190+ EAAD 4D LD C,L
0191+ EAAE CD 33 EA CALL PRTHEXWORD
0192+ EAB1
0193+ EAB1 FF RST 38
0194+ EAB2
0195+ EAB2 76 HALT
0196+ EAB3
0197+ EAB3 C3 00 00 JP 0
0198+ EAB6 ;
0199+ EAB6 ;==================================================================================================
0200+ EAB6 ; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED)
0201+ EAB6 ;==================================================================================================
0202+ EAB6 ;
0203+ EAB6 ; OUTPUT CHARACTER FROM A
0204+ EAB6 COUT:
0205+ EAB6 F5 PUSH AF
0206+ EAB7 C5 PUSH BC
0207+ EAB8 D5 PUSH DE
0208+ EAB9 E5 PUSH HL
0209+ EABA 4F LD C,A
0210+ EABB CD 0C E6 CALL CBIOS_CONOUT
0211+ EABE E1 POP HL
0212+ EABF D1 POP DE
0213+ EAC0 C1 POP BC
0214+ EAC1 F1 POP AF
0215+ EAC2 C9 RET
0216+ EAC3 ;
0217+ EAC3 ; INPUT CHARACTER TO A
0218+ EAC3 ;
0219+ EAC3 CIN:
0220+ EAC3 C5 PUSH BC
0221+ EAC4 D5 PUSH DE
0222+ EAC5 E5 PUSH HL
0223+ EAC6 CD 09 E6 CALL CBIOS_CONIN
0224+ EAC9 E1 POP HL
0225+ EACA D1 POP DE
0226+ EACB C1 POP BC
0227+ EACC C9 RET
0228+ EACD ;
0229+ EACD ; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING)
0230+ EACD ;
0231+ EACD CST:
0232+ EACD C5 PUSH BC
0233+ EACE D5 PUSH DE
0234+ EACF E5 PUSH HL
0235+ EAD0 CD 06 E6 CALL CBIOS_CONST
0236+ EAD3 E1 POP HL
0237+ EAD4 D1 POP DE
0238+ EAD5 C1 POP BC
0239+ EAD6 C9 RET
0240+ EAD7 ;
0241+ EAD7 0D 0A 0D 0A STR_PANIC .DB "\r\n\r\n>>> FATAL ERROR:$"
0241+ EADB 3E 3E 3E 20
0241+ EADF 46 41 54 41
0241+ EAE3 4C 20 45 52
0241+ EAE7 52 4F 52 3A
0241+ EAEB 24
0242+ EAEC 20 41 46 3D STR_AF .DB " AF=$"
0242+ EAF0 24
0243+ EAF1 20 42 43 3D STR_BC .DB " BC=$"
0243+ EAF5 24
0244+ EAF6 20 44 45 3D STR_DE .DB " DE=$"
0244+ EAFA 24
0245+ EAFB 20 48 4C 3D STR_HL .DB " HL=$"
0245+ EAFF 24
0246+ EB00 20 50 43 3D STR_PC .DB " PC=$"
0246+ EB04 24
0247+ EB05 20 53 50 3D STR_SP .DB " SP=$"
0247+ EB09 24
0248+ EB0A ;
0249+ EB0A ; INDIRECT JUMP TO ADDRESS IN HL
0250+ EB0A ;
0251+ EB0A ; MOSTLY USEFUL TO PERFORM AN INDIRECT CALL LIKE:
0252+ EB0A ; LD HL,xxxx
0253+ EB0A ; CALL JPHL
0254+ EB0A ;
0255+ EB0A E9 JPHL: JP (HL)
0256+ EB0B ;
0257+ EB0B ; ADD HL,A
0258+ EB0B ;
0259+ EB0B ; A REGISTER IS DESTROYED!
0260+ EB0B ;
0261+ EB0B
0262+ EB0B ADDHLA:
0263+ EB0B 85 ADD A,L
0264+ EB0C 6F LD L,A
0265+ EB0D D0 RET NC
0266+ EB0E 24 INC H
0267+ EB0F C9 RET
0268+ EB10 ;
0269+ EB10 ; MULTIPLY 8-BIT VALUES
0270+ EB10 ; IN: MULTIPLY H BY E
0271+ EB10 ; OUT: HL = RESULT, E = 0, B = 0
0272+ EB10 ;
0273+ EB10 MULT8:
0274+ EB10 16 00 LD D,0
0275+ EB12 6A LD L,D
0276+ EB13 06 08 LD B,8
0277+ EB15 MULT8_LOOP:
0278+ EB15 29 ADD HL,HL
0279+ EB16 30 01 JR NC,MULT8_NOADD
0280+ EB18 19 ADD HL,DE
0281+ EB19 MULT8_NOADD:
0282+ EB19 10 FA DJNZ MULT8_LOOP
0283+ EB1B C9 RET
0284+ EB1C ;
0285+ EB1C ; FILL MEMORY AT HL WITH VALUE A, LENGTH IN BC, ALL REGS USED
0286+ EB1C ; LENGTH *MSUT* BE GREATER THAN 1 FOR PROPER OPERATION!!!
0287+ EB1C ;
0288+ EB1C FILL:
0289+ EB1C 54 LD D,H ; SET DE TO HL
0290+ EB1D 5D LD E,L ; SO DESTINATION EQUALS SOURCE
0291+ EB1E 77 LD (HL),A ; FILL THE FIRST BYTE WITH DESIRED VALUE
0292+ EB1F 13 INC DE ; INCREMENT DESTINATION
0293+ EB20 0B DEC BC ; DECREMENT THE COUNT
0294+ EB21 ED B0 LDIR ; DO THE REST
0295+ EB23 C9 RET ; RETURN
0296+ EB24 ;
0297+ EB24 ; SET A BIT IN BYTE ARRAY AT HL, INDEX IN A
0298+ EB24 ;
0299+ EB24 BITSET:
0300+ EB24 CD 36 EB CALL BITLOC ; LOCATE THE BIT
0301+ EB27 B6 OR (HL) ; SET THE SPECIFIED BIT
0302+ EB28 77 LD (HL),A ; SAVE IT
0303+ EB29 C9 RET ; RETURN
0304+ EB2A ;
0305+ EB2A ; CLEAR A BIT IN BYTE ARRAY AT HL, INDEX IN A
0306+ EB2A ;
0307+ EB2A BITCLR:
0308+ EB2A CD 36 EB CALL BITLOC ; LOCATE THE BIT
0309+ EB2D 2F CPL ; INVERT ALL BITS
0310+ EB2E A6 AND (HL) ; CLEAR SPECIFIED BIT
0311+ EB2F 77 LD (HL),A ; SAVE IT
0312+ EB30 C9 RET ; RETURN
0313+ EB31 ;
0314+ EB31 ; GET VALUE OF A BIT IN BYTE ARRAY AT HL, INDEX IN A
0315+ EB31 ;
0316+ EB31 BITTST:
0317+ EB31 CD 36 EB CALL BITLOC ; LOCATE THE BIT
0318+ EB34 A6 AND (HL) ; SET Z FLAG BASED ON BIT
0319+ EB35 C9 RET ; RETURN
0320+ EB36 ;
0321+ EB36 ; LOCATE A BIT IN BYTE ARRAY AT HL, INDEX IN A
0322+ EB36 ; RETURN WITH HL POINTING TO BYTE AND A WITH MASK FOR SPECIFIC BIT
0323+ EB36 ;
0324+ EB36 BITLOC:
0325+ EB36 F5 PUSH AF ; SAVE BIT INDEX
0326+ EB37 CB 3F SRL A ; DIVIDE BY 8 TO GET BYTE INDEX
0327+ EB39 CB 3F SRL A ; "
0328+ EB3B CB 3F SRL A ; "
0329+ EB3D 4F LD C,A ; MOVE TO BC
0330+ EB3E 06 00 LD B,0 ; "
0331+ EB40 09 ADD HL,BC ; HL NOW POINTS TO BYTE CONTAINING BIT
0332+ EB41 F1 POP AF ; RECOVER A (INDEX)
0333+ EB42 E6 07 AND $07 ; ISOLATE REMAINDER, Z SET IF ZERO
0334+ EB44 47 LD B,A ; SETUP SHIFT COUNTER
0335+ EB45 3E 01 LD A,1 ; SETUP A WITH MASK
0336+ EB47 C8 RET Z ; DONE IF ZERO
0337+ EB48 BITLOC1:
0338+ EB48 CB 27 SLA A ; SHIFT
0339+ EB4A 10 FC DJNZ BITLOC1 ; LOOP AS NEEDED
0340+ EB4C C9 RET ; DONE
0341+ EB4D ;
0342+ EB4D ; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION
0343+ EB4D ;
0344+ EB4D PRTDECB:
0345+ EB4D E5 PUSH HL
0346+ EB4E F5 PUSH AF
0347+ EB4F 6F LD L,A
0348+ EB50 26 00 LD H,0
0349+ EB52 CD 58 EB CALL PRTDEC
0350+ EB55 F1 POP AF
0351+ EB56 E1 POP HL
0352+ EB57 C9 RET
0353+ EB58 ;
0354+ EB58 ; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION
0355+ EB58 ;
0356+ EB58 PRTDEC:
0357+ EB58 C5 PUSH BC
0358+ EB59 D5 PUSH DE
0359+ EB5A E5 PUSH HL
0360+ EB5B 1E 30 LD E,'0'
0361+ EB5D 01 F0 D8 LD BC,-10000
0362+ EB60 CD 7F EB CALL PRTDEC1
0363+ EB63 01 18 FC LD BC,-1000
0364+ EB66 CD 7F EB CALL PRTDEC1
0365+ EB69 01 9C FF LD BC,-100
0366+ EB6C CD 7F EB CALL PRTDEC1
0367+ EB6F 0E F6 LD C,-10
0368+ EB71 CD 7F EB CALL PRTDEC1
0369+ EB74 1E 00 LD E,0
0370+ EB76 0E FF LD C,-1
0371+ EB78 CD 7F EB CALL PRTDEC1
0372+ EB7B E1 POP HL
0373+ EB7C D1 POP DE
0374+ EB7D C1 POP BC
0375+ EB7E C9 RET
0376+ EB7F PRTDEC1:
0377+ EB7F 3E 2F LD A,'0' - 1
0378+ EB81 PRTDEC2:
0379+ EB81 3C INC A
0380+ EB82 09 ADD HL,BC
0381+ EB83 38 FC JR C,PRTDEC2
0382+ EB85 ED 42 SBC HL,BC
0383+ EB87 BB CP E
0384+ EB88 28 05 JR Z,PRTDEC3
0385+ EB8A 1E 00 LD E,0
0386+ EB8C CD B6 EA CALL COUT
0387+ EB8F PRTDEC3:
0388+ EB8F C9 RET
0389+ EB90 ;
0390+ EB90 ;==================================================================================================
0391+ EB90 ; DATA
0392+ EB90 ;==================================================================================================
0393+ EB90 ;
0394+ EB90 3C 45 4D 50 STR_EMPTY .TEXT "<EMPTY>$"
0394+ EB94 54 59 3E 24
1303 EB98 SIZ_UTIL .EQU $ - ORG_UTIL
1304 EB98 .ECHO "UTIL occupies "
1305 EB98 .ECHO SIZ_UTIL
1306 EB98 .ECHO " bytes.\n"
1307 EB98 ;
1308 EB98 ;==================================================================================================
1309 EB98 ; DIAGNOSTICS
1310 EB98 ;==================================================================================================
1311 EB98 ;
1312 EB98~ #IF DSKTRACE
1313 EB98~ ;__________________________________________________________________________________________________
1314 EB98~ PRTSELDSK:
1315 EB98~ CALL NEWLINE
1316 EB98~ PUSH BC
1317 EB98~ PUSH DE
1318 EB98~ LD B,E
1319 EB98~ LD DE,STR_SELDSK
1320 EB98~ CALL WRITESTR
1321 EB98~ CALL PC_SPACE
1322 EB98~ LD DE,STR_DSK
1323 EB98~ LD A,C
1324 EB98~ CALL PRTHEXBYTE
1325 EB98~ CALL PC_SPACE
1326 EB98~ CALL PC_LBKT
1327 EB98~ LD A,B
1328 EB98~ CALL PRTHEXBYTE
1329 EB98~ CALL PC_RBKT
1330 EB98~ POP DE
1331 EB98~ POP BC
1332 EB98~ RET
1333 EB98~ ;
1334 EB98~ ;__________________________________________________________________________________________________
1335 EB98~ PRTHOME:
1336 EB98~ CALL NEWLINE
1337 EB98~ LD DE,STR_HOME
1338 EB98~ CALL WRITESTR
1339 EB98~ RET
1340 EB98~ ;
1341 EB98~ ;__________________________________________________________________________________________________
1342 EB98~ PRTDSKOP:
1343 EB98~
1344 EB98~ LD (XSTKSAV),SP
1345 EB98~ LD SP,XSTK
1346 EB98~
1347 EB98~ CALL NEWLINE
1348 EB98~ LD A,(DSKOP)
1349 EB98~ LD DE,STR_READ
1350 EB98~ CP DOP_READ
1351 EB98~ CALL Z,WRITESTR
1352 EB98~ LD DE,STR_WRITE
1353 EB98~ CP DOP_WRITE
1354 EB98~ CALL Z,WRITESTR
1355 EB98~ LD A,C
1356 EB98~ CALL Z,PRTHEXBYTE
1357 EB98~ LD DE,STR_DSK
1358 EB98~ CALL WRITESTR
1359 EB98~ LD A,(SEKDSK)
1360 EB98~ CALL PRTHEXBYTE
1361 EB98~ LD DE,STR_TRK
1362 EB98~ CALL WRITESTR
1363 EB98~ LD BC,(SEKTRK)
1364 EB98~ CALL PRTHEXWORD
1365 EB98~ LD DE,STR_SEC
1366 EB98~ CALL WRITESTR
1367 EB98~ LD BC,(SEKSEC)
1368 EB98~ CALL PRTHEXWORD
1369 EB98~
1370 EB98~ LD SP,(XSTKSAV)
1371 EB98~
1372 EB98~ RET
1373 EB98~
1374 EB98~ RET
1375 EB98~
1376 EB98~ XSTKSAV .DW 0
1377 EB98~ .FILL $20
1378 EB98~ XSTK .EQU $
1379 EB98~ ;
1380 EB98~ STR_SELDSK .DB "SELDSK$"
1381 EB98~ STR_HOME .DB "HOME$"
1382 EB98~ STR_READ .DB "READ$"
1383 EB98~ STR_WRITE .DB "WRITE$"
1384 EB98~ STR_DSK .DB " DSK=$"
1385 EB98~ STR_TRK .DB " TRK=$"
1386 EB98~ STR_SEC .DB " SEC=$"
1387 EB98~ ;
1388 EB98 #ENDIF
1389 EB98 ;
1390 EB98 ;==================================================================================================
1391 EB98 ; DATA
1392 EB98 ;==================================================================================================
1393 EB98 ;
1394 EB98 ;STR_READONLY .DB "\r\nCBIOS Err: Read Only Drive$"
1395 EB98 ;STR_STALE .DB "\r\nCBIOS Err: Stale Drive$"
1396 EB98 ;
1397 EB98 00 00 SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE
1398 EB9A 00 DEFDRIVE .DB 0 ; DEFAULT DRIVE
1399 EB9B 00 70 CCPBUF .DW $7000 ; ADDRESS OF CCP BUF IN BIOS BANK
1400 EB9D ;
1401 EB9D ; DOS DISK VARIABLES
1402 EB9D ;
1403 EB9D 00 DSKOP: .DB 0 ; DISK OPERATION (DOP_READ/DOP_WRITE)
1404 EB9E 00 WRTYPE: .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK)
1405 EB9F 00 00 DMAADR: .DW 0 ; DIRECT MEMORY ADDRESS
1406 EBA1 00 HSTWRT: .DB 0 ; TRUE = BUFFER IS DIRTY
1407 EBA2 00 7C BUFADR: .DW $8000-$0400 ; ADDRESS OF PHYSICAL SECTOR BUFFER (DEFAULT MATCHES HBIOS)
1408 EBA4 ;
1409 EBA4 ; DISK I/O REQUEST PENDING
1410 EBA4 ;
1411 EBA4 SEK:
1412 EBA4 00 SEKDSK: .DB 0 ; DISK NUMBER 0-15
1413 EBA5 00 00 SEKTRK: .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
1414 EBA7 00 00 SEKSEC: .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
1415 EBA9 00 SEKDU: .DB 0 ; DEVICE/UNIT
1416 EBAA 00 00 SEKDPH: .DW 0 ; ADDRESS OF ACTIVE (SELECTED) DPH
1417 EBAC 00 00 SEKOFF: .DW 0 ; TRACK OFFSET IN EFFECT FOR LU
1418 EBAE 01 SEKACT: .DB TRUE ; ALWAYS TRUE!
1419 EBAF ;
1420 EBAF ; RESULT OF CPM TO PHYSICAL TRANSLATION
1421 EBAF ;
1422 EBAF XLT:
1423 EBAF 00 XLTDSK .DB 0
1424 EBB0 00 00 XLTTRK .DW 0
1425 EBB2 00 00 XLTSEC .DW 0
1426 EBB4 00 XLTDU .DB 0
1427 EBB5 00 00 XLTDPH .DW 0
1428 EBB7 00 00 XLTOFF: .DW 0
1429 EBB9 01 XLTACT .DB TRUE ; ALWAYS TRUE!
1430 EBBA ;
1431 EBBA XLTSIZ .EQU $ - XLT
1432 EBBA ;
1433 EBBA ; DSK/TRK/SEC IN BUFFER (VALID WHEN HSTACT=TRUE)
1434 EBBA ;
1435 EBBA HST:
1436 EBBA 00 HSTDSK .DB 0 ; DISK IN BUFFER
1437 EBBB 00 00 HSTTRK .DW 0 ; TRACK IN BUFFER
1438 EBBD 00 00 HSTSEC .DW 0 ; SECTOR IN BUFFER
1439 EBBF 00 HSTDU .DB 0 ; DEVICE/UNIT IN BUFFER
1440 EBC0 00 00 HSTDPH .DW 0 ; CURRENT DPH ADDRESS
1441 EBC2 00 00 HSTOFF .DW 0 ; TRACK OFFSET IN EFFECT FOR LU
1442 EBC4 00 HSTACT .DB 0 ; TRUE = BUFFER HAS VALID DATA
1443 EBC5 ;
1444 EBC5 ; SEQUENTIAL WRITE TRACKING FOR UNALLOCATED BLOCK
1445 EBC5 ;
1446 EBC5 UNA:
1447 EBC5 00 UNADSK: .DB 0 ; DISK NUMBER 0-15
1448 EBC6 00 00 UNATRK: .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL)
1449 EBC8 00 00 UNASEC: .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL)
1450 EBCA ;
1451 EBCA UNASIZ .EQU $ - UNA
1452 EBCA ;
1453 EBCA 00 UNACNT: .DB 0 ; COUNT DOWN UNALLOCATED RECORDS IN BLOCK
1454 EBCB 00 00 UNASPT: .DW 0 ; SECTORS PER TRACK
1455 EBCD ;
1456 EBCD ;==================================================================================================
1457 EBCD ; DISK CONTROL STRUCTURES (DPB, DPH)
1458 EBCD ;==================================================================================================
1459 EBCD ;
1460 EBCD RAMBLKS .EQU (((BID_RAMDN - BID_RAMD0 + 1) * 32) / 2)
1461 EBCD CKS_RAM .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
1462 EBCD ALS_RAM .EQU ((RAMBLKS + 7) / 8) ; ALS: BLKS / 8 (ROUNDED UP)
1463 EBCD ;
1464 EBCD ROMBLKS .EQU (((BID_ROMDN - BID_ROMD0 + 1) * 32) / 2)
1465 EBCD CKS_ROM .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
1466 EBCD ALS_ROM .EQU ((ROMBLKS + 7) / 8) ; ALS: BLKS / 8 (ROUNDED UP)
1467 EBCD ;
1468 EBCD CKS_FD .EQU 64 ; CKS: DIR ENT / 4 = 256 / 4 = 64
1469 EBCD ALS_FD .EQU 128 ; ALS: BLKS / 8 = 1024 / 8 = 128
1470 EBCD ;
1471 EBCD CKS_HD .EQU 0 ; CKS: 0 FOR NON-REMOVABLE MEDIA
1472 EBCD ALS_HD .EQU 256 ; ALS: BLKS / 8 = 2048 / 8 = 256 (ROUNDED UP)
1473 EBCD ;
1474 EBCD ;
1475 EBCD ; DISK PARAMETER BLOCKS
1476 EBCD ;
1477 EBCD ; BLS BSH BLM EXM (DSM<256) EXM (DSM>255)
1478 EBCD ; ---------- --- --- ------------- -------------
1479 EBCD ; 1,024 3 7 0 N/A
1480 EBCD ; 2,048 4 15 1 0
1481 EBCD ; 4,096 5 31 3 1
1482 EBCD ; 8,192 6 63 7 3
1483 EBCD ; 16,384 7 127 15 7
1484 EBCD ;
1485 EBCD ; AL0/1: EACH BIT SET ALLOCATES A BLOCK OF DIR ENTRIES. EACH DIR ENTRY
1486 EBCD ; IS 32 BYTES. BIT COUNT = (((DRM + 1) * 32) / BLS)
1487 EBCD ;
1488 EBCD ; CKS = (DIR ENT / 4), ZERO FOR NON-REMOVABLE MEDIA
1489 EBCD ;
1490 EBCD ; ALS = TOTAL BLKS (DSM + 1) / 8
1491 EBCD ;__________________________________________________________________________________________________
1492 EBCD ;
1493 EBCD ; ROM DISK: 64 SECS/TRK (LOGICAL), 128 BYTES/SEC
1494 EBCD ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
1495 EBCD ; ROM DISK SIZE = TOTAL ROM - 32K RESERVED FOR SYSTEM USE
1496 EBCD ;
1497 EBCD 00 00 .DW CKS_ROM
1498 EBCF 18 00 .DW ALS_ROM
1499 EBD1 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1500 EBD2 DPB_ROM:
1501 EBD2 40 00 .DW 64 ; SPT: SECTORS PER TRACK
1502 EBD4 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1503 EBD5 0F .DB 15 ; BLM: BLOCK MASK
1504 EBD6 #IF ((ROMBLKS - 1) < 256)
1505 EBD6 01 .DB 1 ; EXM: EXTENT MASK
1506 EBD7~ #ELSE
1507 EBD7~ .DB 0 ; EXM: EXTENT MASK
1508 EBD7 #ENDIF
1509 EBD7 BF 00 .DW ROMBLKS - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1
1510 EBD9 FF 00 .DW 255 ; DRM: DIR ENTRIES - 1 = 255
1511 EBDB F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1512 EBDC 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1513 EBDD 00 00 .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
1514 EBDF 00 00 .DW 0 ; OFF: ROM DISK HAS NO SYSTEM AREA
1515 EBE1 ;__________________________________________________________________________________________________
1516 EBE1 ;
1517 EBE1 ; RAM DISK: 64 SECS/TRK, 128 BYTES/SEC
1518 EBE1 ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
1519 EBE1 ; RAM DISK SIZE = TOTAL RAM - 64K RESERVED FOR SYSTEM USE
1520 EBE1 ;
1521 EBE1 00 00 .DW CKS_RAM
1522 EBE3 18 00 .DW ALS_RAM
1523 EBE5 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1524 EBE6 DPB_RAM:
1525 EBE6 40 00 .DW 64 ; SPT: SECTORS PER TRACK
1526 EBE8 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1527 EBE9 0F .DB 15 ; BLM: BLOCK MASK
1528 EBEA #IF ((RAMBLKS - 1) < 256)
1529 EBEA 01 .DB 1 ; EXM: EXTENT MASK
1530 EBEB~ #ELSE
1531 EBEB~ .DB 0 ; EXM: EXTENT MASK
1532 EBEB #ENDIF
1533 EBEB BF 00 .DW RAMBLKS - 1 ; DSM: TOTAL STORAGE IN BLOCKS - 1
1534 EBED FF 00 .DW 255 ; DRM: DIR ENTRIES - 1 = 255
1535 EBEF F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1536 EBF0 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1537 EBF1 00 00 .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
1538 EBF3 00 00 .DW 0 ; OFF: RESERVED TRACKS = 0 TRK
1539 EBF5 ;__________________________________________________________________________________________________
1540 EBF5 ;
1541 EBF5 ; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
1542 EBF5 ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
1543 EBF5 ; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255)
1544 EBF5 ;
1545 EBF5 00 00 .DW CKS_HD
1546 EBF7 00 01 .DW ALS_HD
1547 EBF9 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1548 EBFA DPB_RF:
1549 EBFA 00 04 .DW 1024 ; SPT: SECTORS PER TRACK
1550 EBFC 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1551 EBFD 0F .DB 15 ; BLM: BLOCK MASK
1552 EBFE 00 .DB 0 ; EXM: EXTENT MASK
1553 EBFF FF 07 .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = (4MB / 2K BLS) - 1 = 2047
1554 EC01 FF 00 .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
1555 EC03 F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1556 EC04 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1557 EC05 00 00 .DW 0 ; CKS: ZERO FOR NON-REMOVABLE MEDIA
1558 EC07 00 00 .DW 0 ; OFF: RESERVED TRACKS = 0 TRK
1559 EC09 ;__________________________________________________________________________________________________
1560 EC09 ;
1561 EC09 ; GENERIC HARD DISK DRIVE (8MB DATA SPACE + 128K RESERVED SPACE)
1562 EC09 ; LOGICAL: 1040 TRKS (16 RESERVED), 64 SECS/TRK, 128 BYTES/SEC
1563 EC09 ; PHYSICAL: 65 CYLS (1 RESERVED), 16 HEADS/CYL, 16 SECS/TRK, 512 BYTES/SEC
1564 EC09 ; BLOCKSIZE (BLS) = 4K, DIRECTORY ENTRIES = 512
1565 EC09 ;
1566 EC09 00 00 .DW CKS_HD
1567 EC0B 00 01 .DW ALS_HD
1568 EC0D 20 .DB (4096 / 128) ; RECORDS PER BLOCK (BLS / 128)
1569 EC0E DPB_HD:
1570 EC0E 40 00 .DW 64 ; SPT: SECTORS PER TRACK
1571 EC10 05 .DB 5 ; BSH: BLOCK SHIFT FACTOR
1572 EC11 1F .DB 31 ; BLM: BLOCK MASK
1573 EC12 01 .DB 1 ; EXM: EXTENT MASK
1574 EC13 FF 07 .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 = (8MB / 4K BLS) - 1 = 2047
1575 EC15 FF 01 .DW 511 ; DRM: DIR ENTRIES - 1 = 512 - 1 = 511
1576 EC17 F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1577 EC18 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1578 EC19 00 00 .DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
1579 EC1B 10 00 .DW 16 ; OFF: RESERVED TRACKS = 16 TRKS * (16 TRKS * 16 HEADS * 16 SECS * 512 BYTES) = 128K
1580 EC1D ;__________________________________________________________________________________________________
1581 EC1D ;
1582 EC1D ; IBM 720KB 3.5" FLOPPY DRIVE, 80 TRKS, 36 SECS/TRK, 512 BYTES/SEC
1583 EC1D ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 128
1584 EC1D ;
1585 EC1D 40 00 .DW CKS_FD
1586 EC1F 80 00 .DW ALS_FD
1587 EC21 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1588 EC22 DPB_FD720:
1589 EC22 24 00 .DW 36 ; SPT: SECTORS PER TRACK
1590 EC24 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1591 EC25 0F .DB 15 ; BLM: BLOCK MASK
1592 EC26 00 .DB 0 ; EXM: EXTENT MASK
1593 EC27 5E 01 .DW 350 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((720K - 18K OFF) / 2K BLS) - 1 = 350
1594 EC29 7F 00 .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
1595 EC2B C0 .DB 11000000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1596 EC2C 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1597 EC2D 20 00 .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
1598 EC2F 04 00 .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
1599 EC31 ;__________________________________________________________________________________________________
1600 EC31 ;
1601 EC31 ; IBM 1.44MB 3.5" FLOPPY DRIVE, 80 TRKS, 72 SECS/TRK, 512 BYTES/SEC
1602 EC31 ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
1603 EC31 ;
1604 EC31 40 00 .DW CKS_FD
1605 EC33 80 00 .DW ALS_FD
1606 EC35 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1607 EC36 DPB_FD144:
1608 EC36 48 00 .DW 72 ; SPT: SECTORS PER TRACK
1609 EC38 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1610 EC39 0F .DB 15 ; BLM: BLOCK MASK
1611 EC3A 00 .DB 0 ; EXM: EXTENT MASK
1612 EC3B C6 02 .DW 710 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,440K - 18K OFF) / 2K BLS) - 1 = 710
1613 EC3D FF 00 .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
1614 EC3F F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1615 EC40 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1616 EC41 40 00 .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
1617 EC43 02 00 .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 72 SEC/TRK) = 18K
1618 EC45 ;__________________________________________________________________________________________________
1619 EC45 ;
1620 EC45 ; IBM 360KB 5.25" FLOPPY DRIVE, 40 TRKS, 9 SECS/TRK, 512 BYTES/SEC
1621 EC45 ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 128
1622 EC45 ;
1623 EC45 40 00 .DW CKS_FD
1624 EC47 80 00 .DW ALS_FD
1625 EC49 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1626 EC4A DPB_FD360:
1627 EC4A 24 00 .DW 36 ; SPT: SECTORS PER TRACK
1628 EC4C 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1629 EC4D 0F .DB 15 ; BLM: BLOCK MASK
1630 EC4E 01 .DB 1 ; EXM: EXTENT MASK
1631 EC4F AA 00 .DW 170 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((360K - 18K OFF) / 2K BLS) - 1 = 170
1632 EC51 7F 00 .DW 127 ; DRM: DIR ENTRIES - 1 = 128 - 1 = 127
1633 EC53 F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1634 EC54 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1635 EC55 20 00 .DW 32 ; CKS: DIRECTORY CHECK VECTOR SIZE = 128 / 4
1636 EC57 04 00 .DW 4 ; OFF: RESERVED TRACKS = 4 TRKS * (512 B/SEC * 36 SEC/TRK) = 18K
1637 EC59 ;__________________________________________________________________________________________________
1638 EC59 ;
1639 EC59 ; IBM 1.20MB 5.25" FLOPPY DRIVE, 80 TRKS, 15 SECS/TRK, 512 BYTES/SEC
1640 EC59 ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
1641 EC59 ;
1642 EC59 40 00 .DW CKS_FD
1643 EC5B 80 00 .DW ALS_FD
1644 EC5D 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1645 EC5E DPB_FD120:
1646 EC5E 3C 00 .DW 60 ; SPT: SECTORS PER TRACK
1647 EC60 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1648 EC61 0F .DB 15 ; BLM: BLOCK MASK
1649 EC62 00 .DB 0 ; EXM: EXTENT MASK
1650 EC63 4F 02 .DW 591 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,200K - 15K OFF) / 2K BLS) - 1 = 591
1651 EC65 FF 00 .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
1652 EC67 F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1653 EC68 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1654 EC69 40 00 .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
1655 EC6B 02 00 .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
1656 EC6D ;__________________________________________________________________________________________________
1657 EC6D ;
1658 EC6D ; IBM 1.11MB 8" FLOPPY DRIVE, 77 TRKS, 15 SECS/TRK, 512 BYTES/SEC
1659 EC6D ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
1660 EC6D ;
1661 EC6D 40 00 .DW CKS_FD
1662 EC6F 80 00 .DW ALS_FD
1663 EC71 10 .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
1664 EC72 DPB_FD111:
1665 EC72 3C 00 .DW 60 ; SPT: SECTORS PER TRACK
1666 EC74 04 .DB 4 ; BSH: BLOCK SHIFT FACTOR
1667 EC75 0F .DB 15 ; BLM: BLOCK MASK
1668 EC76 00 .DB 0 ; EXM: EXTENT MASK
1669 EC77 39 02 .DW 569 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((1,155K - 15K OFF) / 2K BLS) - 1 = 569
1670 EC79 FF 00 .DW 255 ; DRM: DIR ENTRIES - 1 = 256 - 1 = 255
1671 EC7B F0 .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE
1672 EC7C 00 .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE
1673 EC7D 40 00 .DW 64 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4
1674 EC7F 02 00 .DW 2 ; OFF: RESERVED TRACKS = 2 TRKS * (512 B/SEC * 60 SEC/TRK) = 15K
1675 EC81 ;
1676 EC81~ #IF (PLATFORM == PLT_UNA)
1677 EC81~ SECBUF .FILL 512,0 ; PHYSICAL DISK SECTOR BUFFER
1678 EC81 #ENDIF
1679 EC81 ;
1680 EC81 ;==================================================================================================
1681 EC81 ; CBIOS BUFFERS
1682 EC81 ;==================================================================================================
1683 EC81 ;
1684 EC81 ;BUFFERS:
1685 EC81 ;
1686 EC81 BUFPOOL .EQU $ ; START OF BUFFER POOL
1687 EC81 ;
1688 EC81 ;==================================================================================================
1689 EC81 ; COLD BOOT INITIALIZATION
1690 EC81 ;
1691 EC81 ; THIS CODE IS PLACED IN THE BDOS BUFFER AREA TO CONSERVE SPACE. SINCE
1692 EC81 ; COLD BOOT DOES NO DISK IO, SO THIS IS SAFE.
1693 EC81 ;
1694 EC81 ;==================================================================================================
1695 EC81 ;
1696 EC81 00 00 00 00 .FILL 16 * 4,0 ; RESERVED FOR DRVMAP TABLE
1696 EC85 00 00 00 00
1696 EC89 00 00 00 00
1696 EC8D 00 00 00 00
1696 EC91 00 00 00 00
1696 EC95 00 00 00 00
1696 EC99 00 00 00 00
1696 EC9D 00 00 00 00
1696 ECA1 00 00 00 00
1696 ECA5 00 00 00 00
1696 ECA9 00 00 00 00
1696 ECAD 00 00 00 00
1696 ECB1 00 00 00 00
1696 ECB5 00 00 00 00
1696 ECB9 00 00 00 00
1696 ECBD 00 00 00 00
1697 ECC1 00 00 00 00 .FILL 16 * 16,0 ; RESERVED FOR DPH TABLE
1697 ECC5 00 00 00 00
1697 ECC9 00 00 00 00
1697 ECCD 00 00 00 00
1697 ECD1 00 00 00 00
1697 ECD5 00 00 00 00
1697 ECD9 00 00 00 00
1697 ECDD 00 00 00 00
1697 ECE1 00 00 00 00
1697 ECE5 00 00 00 00
1697 ECE9 00 00 00 00
1697 ECED 00 00 00 00
1697 ECF1 00 00 00 00
1697 ECF5 00 00 00 00
1697 ECF9 00 00 00 00
1697 ECFD 00 00 00 00
1697 ED01 00 00 00 00
1697 ED05 00 00 00 00
1697 ED09 00 00 00 00
1697 ED0D 00 00 00 00
1697 ED11 00 00 00 00
1697 ED15 00 00 00 00
1697 ED19 00 00 00 00
1697 ED1D 00 00 00 00
1697 ED21 00 00 00 00
1697 ED25 00 00 00 00
1697 ED29 00 00 00 00
1697 ED2D 00 00 00 00
1697 ED31 00 00 00 00
1697 ED35 00 00 00 00
1697 ED39 00 00 00 00
1697 ED3D 00 00 00 00
1697 ED41 00 00 00 00
1697 ED45 00 00 00 00
1697 ED49 00 00 00 00
1697 ED4D 00 00 00 00
1697 ED51 00 00 00 00
1697 ED55 00 00 00 00
1697 ED59 00 00 00 00
1697 ED5D 00 00 00 00
1697 ED61 00 00 00 00
1697 ED65 00 00 00 00
1697 ED69 00 00 00 00
1697 ED6D 00 00 00 00
1697 ED71 00 00 00 00
1697 ED75 00 00 00 00
1697 ED79 00 00 00 00
1697 ED7D 00 00 00 00
1697 ED81 00 00 00 00
1697 ED85 00 00 00 00
1697 ED89 00 00 00 00
1697 ED8D 00 00 00 00
1697 ED91 00 00 00 00
1697 ED95 00 00 00 00
1697 ED99 00 00 00 00
1697 ED9D 00 00 00 00
1697 EDA1 00 00 00 00
1697 EDA5 00 00 00 00
1697 EDA9 00 00 00 00
1697 EDAD 00 00 00 00
1697 EDB1 00 00 00 00
1697 EDB5 00 00 00 00
1697 EDB9 00 00 00 00
1697 EDBD 00 00 00 00
1698 EDC1 ;
1699 EDC1 INIT:
1700 EDC1 ; THIS INIT CODE WILL BE OVERLAID, SO WE ARE GOING
1701 EDC1 ; TO MODIFY THE BOOT ENTRY POINT TO CAUSE A PANIC
1702 EDC1 ; TO EASILY IDENTIFY IF SOMETHING TRIES TO INVOKE
1703 EDC1 ; THE BOOT ENTRY POINT AFTER INIT IS DONE.
1704 EDC1 3E CD LD A,$CD ; "CALL" INSTRUCTION
1705 EDC3 32 65 E6 LD (BOOT),A ; STORE IT BOOT ENTRY POINT
1706 EDC6 21 66 EA LD HL,PANIC ; ADDRESS OF PANIC ROUTINE
1707 EDC9 22 66 E6 LD (BOOT+1),HL ; STORE IT AT BOOT ENTRY + 1
1708 EDCC
1709 EDCC~ #IF (PLATFORM == PLT_UNA)
1710 EDCC~ ; MAKE SURE UNA EXEC PAGE IS ACTIVE
1711 EDCC~ LD BC,$01FB ; UNA FUNC = SET BANK
1712 EDCC~ LD DE,BID_USR ; SWITCH BACK TO EXEC BANK
1713 EDCC~ CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
1714 EDCC~
1715 EDCC~ ; INSTALL UNA INVOCATION VECTOR FOR RST 08
1716 EDCC~ LD A,$C3 ; JP INSTRUCTION
1717 EDCC~ LD (8),A ; STORE AT 0x0008
1718 EDCC~ LD HL,($FFFE) ; UNA ENTRY VECTOR
1719 EDCC~ LD (9),HL ; STORE AT 0x0009
1720 EDCC #ELSE
1721 EDCC ; MAKE SURE USER BANK IS ACTIVE
1722 EDCC 06 F0 LD B,BF_SYSSETBNK
1723 EDCE 0E 8E LD C,BID_USR
1724 EDD0 CD F0 FF CALL $FFF0
1725 EDD3
1726 EDD3 ; INSTALL HBIOS INVOCATION VECTOR FOR RST 08
1727 EDD3 3E C3 LD A,$C3 ; JP INSTRUCTION
1728 EDD5 32 08 00 LD (8),A ; STORE AT 0x0008
1729 EDD8 2A F1 FF LD HL,($FFF1) ; HBIOS ENTRY VECTOR
1730 EDDB 22 09 00 LD (9),HL ; STORE AT 0x0009
1731 EDDE #ENDIF
1732 EDDE
1733 EDDE ; PARAMETER INITIALIZATION
1734 EDDE 3E 00 LD A,DEFIOBYTE ; LOAD DEFAULT IOBYTE
1735 EDE0 32 03 00 LD (IOBYTE),A ; STORE IT
1736 EDE3
1737 EDE3 #IF ((PLATFORM != PLT_N8) & (PLATFORM != PLT_MK4) & (PLATFORM != PLT_S100) & (PLATFORM != PLT_UNA))
1738 EDE3 DB 70 IN A,(RTC) ; RTC PORT, BIT 6 HAS STATE OF CONFIG JUMPER
1739 EDE5 CB 77 BIT 6,A ; BIT 6 HAS CONFIG JUMPER STATE
1740 EDE7 3E 00 LD A,DEFIOBYTE ; ASSUME WE WANT DEFAULT IOBYTE VALUE
1741 EDE9 20 02 JR NZ,INIT1 ; IF BIT6=1, NOT SHORTED, CONTINUE WITH DEFAULT
1742 EDEB 3E 00 LD A,ALTIOBYTE ; LOAD ALT IOBYTE VALUE
1743 EDED INIT1:
1744 EDED 32 03 00 LD (IOBYTE),A ; SET THE ACTIVE IOBYTE
1745 EDF0 #ENDIF
1746 EDF0
1747 EDF0 ; INIT DEFAULT DRIVE TO A: FOR NOW
1748 EDF0 AF XOR A ; ZERO
1749 EDF1 32 9A EB LD (DEFDRIVE),A ; STORE IT
1750 EDF4
1751 EDF4 ; STARTUP MESSAGE
1752 EDF4 CD 1C EA CALL NEWLINE ; FORMATTING
1753 EDF7 11 51 EE LD DE,STR_BANNER ; POINT TO BANNER
1754 EDFA CD 56 EA CALL WRITESTR ; DISPLAY IT
1755 EDFD CD 1C EA CALL NEWLINE ; FORMATTING
1756 EE00
1757 EE00~ #IF (PLATFORM == PLT_UNA)
1758 EE00~ ; SAVE COMMAND PROCESSOR IMAGE TO MALLOCED CACHE IN UNA BIOS PAGE
1759 EE00~ LD C,$F7 ; UNA MALLOC
1760 EE00~ LD DE,CCP_SIZ ; SIZE OF CCP
1761 EE00~ RST 08 ; DO IT
1762 EE00~ CALL NZ,PANIC ; BIG PROBLEM
1763 EE00~ LD (CCPBUF),HL ; SAVE THE ADDRESS (IN BIOS MEM)
1764 EE00~
1765 EE00~ LD BC,$01FB ; UNA FUNC = SET BANK
1766 EE00~ LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC)
1767 EE00~ RST 08 ; DO IT
1768 EE00~ PUSH DE ; SAVE PREVIOUS BANK
1769 EE00~
1770 EE00~ LD HL,CPM_LOC ; ADDRESS IN HI MEM OF CCP
1771 EE00~ LD DE,(CCPBUF) ; ADDRESS OF CCP BUF IN BIOS MEM
1772 EE00~ LD BC,CCP_SIZ ; SIZE OF CCP
1773 EE00~ LDIR ; DO IT
1774 EE00~
1775 EE00~ LD BC,$01FB ; UNA FUNC = SET BANK
1776 EE00~ POP DE ; RECOVER OPERATING BANK
1777 EE00~ RST 08 ; DO IT
1778 EE00 #ELSE
1779 EE00 ; SAVE COMMAND PROCESSOR TO DEDICATED CACHE IN RAM BANK 1
1780 EE00 06 F3 LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
1781 EE02 1E 8E LD E,BID_USR ; E = SRC BANK = USR BANK = TPA
1782 EE04 16 8D LD D,BID_BIOS ; D = DEST BANK = HB BANK
1783 EE06 CF RST 08 ; DO IT
1784 EE07 06 F2 LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
1785 EE09 21 00 D0 LD HL,CPM_LOC ; COPY FROM CCP LOCATION IN USR BANK
1786 EE0C ED 5B 9B EB LD DE,(CCPBUF) ; TO FIXED LOCATION IN HB BANK
1787 EE10 DD 21 00 08 LD IX,CCP_SIZ ; COPY CONTENTS OF COMMAND PROCESSOR
1788 EE14 CF RST 08 ; DO IT
1789 EE15 #ENDIF
1790 EE15
1791 EE15 ; DISK SYSTEM INITIALIZATION
1792 EE15 CD C2 E7 CALL BLKRES ; RESET DISK (DE)BLOCKING ALGORITHM
1793 EE18 CD 84 EE CALL MD_INIT ; INITIALIZE MEMORY DISK DRIVER (RAM/ROM)
1794 EE1B CD B2 EE CALL DRV_INIT ; INITIALIZE DRIVE MAP
1795 EE1E CD 00 EF CALL DPH_INIT ; INITIALIZE DPH TABLE AND BUFFERS
1796 EE21 CD 1C EA CALL NEWLINE ; FORMATTING
1797 EE24 ;
1798 EE24 ; DISPLAY FREE MEMORY
1799 EE24 11 A8 F0 LD DE,STR_LDR ; FORMATTING
1800 EE27 CD 56 EA CALL WRITESTR ; AND PRINT IT
1801 EE2A 21 00 FE LD HL,CBIOS_END ; SUBTRACT HIGH WATER
1802 EE2D ED 5B 8C F0 LD DE,(BUFTOP) ; ... FROM TOP OF CBIOS
1803 EE31 B7 OR A ; ... WITH CF CLEAR
1804 EE32 ED 52 SBC HL,DE ; ... SO HL GETS BYTES FREE
1805 EE34 CD 58 EB CALL PRTDEC ; PRINT IT
1806 EE37 11 6A EE LD DE,STR_MEMFREE ; ADD DESCRIPTION
1807 EE3A CD 56 EA CALL WRITESTR ; AND PRINT IT
1808 EE3D ;
1809 EE3D 3A 9A EB LD A,(DEFDRIVE) ; GET DEFAULT DRIVE
1810 EE40 32 04 00 LD (CDISK),A ; ... AND SETUP CDISK
1811 EE43 ;
1812 EE43 ; SETUP AUTOSTART COMMAND
1813 EE43 21 4F EE LD HL,CMD ; ADDRESS OF STARTUP COMMAND
1814 EE46 11 07 D0 LD DE,CCP_LOC + 7 ; START OF COMMAND BUFFER IN CCP
1815 EE49 01 02 00 LD BC,CMDLEN ; LENGTH OF AUTOSTART COMMAND
1816 EE4C ED B0 LDIR ; INSTALL IT
1817 EE4E ;
1818 EE4E C9 RET
1819 EE4F ;
1820 EE4F 01 CMD .DB CMDLEN - 1
1821 EE50 #IFDEF AUTOCMD
1822 EE50 .TEXT AUTOCMD
1823 EE50 #ENDIF
1824 EE50 00 .DB 0
1825 EE51 CMDLEN .EQU $ - CMD
1826 EE51 ;
1827 EE51 43 50 2F 4D STR_BANNER .DB OSLBL, " CBIOS v", BIOSVER, "$"
1827 EE55 2D 38 30 20
1827 EE59 32 2E 32 20
1827 EE5D 43 42 49 4F
1827 EE61 53 20 76 32
1827 EE65 2E 37 2E 30
1827 EE69 24
1828 EE6A 20 44 69 73 STR_MEMFREE .DB " Disk Buffer Bytes Free\r\n$"
1828 EE6E 6B 20 42 75
1828 EE72 66 66 65 72
1828 EE76 20 42 79 74
1828 EE7A 65 73 20 46
1828 EE7E 72 65 65 0D
1828 EE82 0A 24
1829 EE84 ;
1830 EE84 ;
1831 EE84 ;__________________________________________________________________________________________________
1832 EE84 MD_INIT:
1833 EE84 ;
1834 EE84~ #IF (PLATFORM == PLT_UNA)
1835 EE84~ ;
1836 EE84~ ; INITIALIZE RAM DISK BY FILLING DIRECTORY WITH 'E5' BYTES
1837 EE84~ ; FILL FIRST 8K OF RAM DISK TRACK 1 WITH 'E5'
1838 EE84~ ;
1839 EE84~ #IF (CLRRAMDISK != CLR_NEVER)
1840 EE84~ LD BC,$01FB ; UNA FUNC = SET BANK
1841 EE84~ LD DE,BID_RAMD0 ; FIRST BANK OF RAM DISK
1842 EE84~ CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
1843 EE84~
1844 EE84~ #IF (CLRRAMDISK == CLR_AUTO)
1845 EE84~ ; CHECK FIRST 32 DIRECTORY ENTRIES. IF ANY START WITH AN INVALID
1846 EE84~ ; VALUE, INIT THE RAM DISK. VALID ENTRIES ARE E5 (EMPTY ENTRY) OR
1847 EE84~ ; 0-15 (USER NUMBER).
1848 EE84~ LD HL,0
1849 EE84~ LD DE,32
1850 EE84~ LD B,32
1851 EE84~ CLRRAM0:
1852 EE84~ LD A,(HL)
1853 EE84~ CP $E5
1854 EE84~ JR Z,CLRRAM1 ; E5 IS VALID
1855 EE84~ CP 16
1856 EE84~ JR C,CLRRAM1 ; 0-15 IS ALSO VALID
1857 EE84~ JR CLRRAM2 ; INVALID ENTRY! JUMP TO INIT
1858 EE84~ CLRRAM1:
1859 EE84~ ADD HL,DE ; LOOP FOR 32 ENTRIES
1860 EE84~ DJNZ CLRRAM0
1861 EE84~ ; JR CLRRAM2 ; *DEBUG*
1862 EE84~ JR CLRRAM3 ; ALL ENTRIES VALID, BYPASS INIT
1863 EE84~ CLRRAM2:
1864 EE84~ #ENDIF
1865 EE84~ LD BC,$01FB ; UNA FUNC = SET BANK
1866 EE84~ LD DE,BID_USR ; SWITCH BACK TO EXEC BANK FOR WRITESTR
1867 EE84~ CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
1868 EE84~
1869 EE84~ LD DE,STR_INITRAMDISK ; RAM DISK INIT MESSAGE
1870 EE84~ CALL WRITESTR ; DISPLAY IT
1871 EE84~
1872 EE84~ LD BC,$01FB ; UNA FUNC = SET BANK
1873 EE84~ LD DE,BID_RAMD0 ; FIRST BANK OF RAM DISK
1874 EE84~ CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
1875 EE84~
1876 EE84~ LD HL,0 ; SOURCE ADR FOR FILL
1877 EE84~ LD BC,$2000 ; LENGTH OF FILL IS 8K
1878 EE84~ LD A,$E5 ; FILL VALUE
1879 EE84~ CALL FILL ; DO IT
1880 EE84~ CLRRAM3:
1881 EE84~ LD BC,$01FB ; UNA FUNC = SET BANK
1882 EE84~ LD DE,BID_USR ; SWITCH BACK TO EXEC BANK
1883 EE84~ CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE)
1884 EE84~
1885 EE84~ #ENDIF
1886 EE84~
1887 EE84 #ELSE
1888 EE84 ;
1889 EE84 ; INITIALIZE RAM DISK BY FILLING DIRECTORY WITH 'E5' BYTES
1890 EE84 ; FILL FIRST 8K OF RAM DISK TRACK 1 WITH 'E5'
1891 EE84 ;
1892 EE84 #IF (CLRRAMDISK != CLR_NEVER)
1893 EE84 06 F0 LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
1894 EE86 0E 80 LD C,BID_RAMD0 ; FIRST BANK OF RAM DISK
1895 EE88 CD F0 FF CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
1896 EE8B
1897 EE8B~ #IF (CLRRAMDISK == CLR_AUTO)
1898 EE8B~ ; CHECK FIRST 32 DIRECTORY ENTRIES. IF ANY START WITH AN INVALID
1899 EE8B~ ; VALUE, INIT THE RAM DISK. VALID ENTRIES ARE E5 (EMPTY ENTRY) OR
1900 EE8B~ ; 0-15 (USER NUMBER).
1901 EE8B~ LD HL,0
1902 EE8B~ LD DE,32
1903 EE8B~ LD B,32
1904 EE8B~ CLRRAM0:
1905 EE8B~ LD A,(HL)
1906 EE8B~ CP $E5
1907 EE8B~ JR Z,CLRRAM1 ; E5 IS VALID
1908 EE8B~ CP 16
1909 EE8B~ JR C,CLRRAM1 ; 0-15 IS ALSO VALID
1910 EE8B~ JR CLRRAM2 ; INVALID ENTRY! JUMP TO INIT
1911 EE8B~ CLRRAM1:
1912 EE8B~ ADD HL,DE ; LOOP FOR 32 ENTRIES
1913 EE8B~ DJNZ CLRRAM0
1914 EE8B~ ; JR CLRRAM2 ; *DEBUG*
1915 EE8B~ JR CLRRAM3 ; ALL ENTRIES VALID, BYPASS INIT
1916 EE8B~ CLRRAM2:
1917 EE8B #ENDIF
1918 EE8B 06 F0 LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
1919 EE8D 0E 8E LD C,BID_USR ; SWITCH BACK TO USR BANK
1920 EE8F CD F0 FF CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
1921 EE92 11 90 F0 LD DE,STR_INITRAMDISK ; RAM DISK INIT MESSAGE
1922 EE95 CD 56 EA CALL WRITESTR ; DISPLAY IT
1923 EE98 06 F0 LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
1924 EE9A 0E 80 LD C,BID_RAMD0 ; SWITCH BACK TO FIRST BANK
1925 EE9C CD F0 FF CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
1926 EE9F 21 00 00 LD HL,0 ; SOURCE ADR FOR FILL
1927 EEA2 01 00 20 LD BC,$2000 ; LENGTH OF FILL IS 8K
1928 EEA5 3E E5 LD A,$E5 ; FILL VALUE
1929 EEA7 CD 1C EB CALL FILL ; DO IT
1930 EEAA CLRRAM3:
1931 EEAA 06 F0 LD B,BF_SYSSETBNK ; HBIOS FUNC: SET BANK
1932 EEAC 0E 8E LD C,BID_USR ; USR BANK (TPA)
1933 EEAE CD F0 FF CALL $FFF0 ; DO IT (RST 08 NOT SAFE)
1934 EEB1 #ENDIF
1935 EEB1 ;
1936 EEB1 #ENDIF
1937 EEB1 ;
1938 EEB1 C9 RET
1939 EEB2 ;
1940 EEB2 ;
1941 EEB2 ;__________________________________________________________________________________________________
1942 EEB2~ #IF (PLATFORM == PLT_UNA)
1943 EEB2~ ;
1944 EEB2~ DRV_INIT:
1945 EEB2~ ;
1946 EEB2~ ; PERFORM UBIOS SPECIFIC INITIALIZATION
1947 EEB2~ ; BUILD DRVMAP BASED ON AVAILABLE UBIOS DISK DEVICE LIST
1948 EEB2~ ;
1949 EEB2~ ; GET BOOT DEVICE/UNIT/LU INFO
1950 EEB2~ LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY
1951 EEB2~ RST 08 ; CALL UNA
1952 EEB2~ LD D,L ; SAVE L AS DEVICE/UNIT
1953 EEB2~ LD E,0 ; LU IS ZERO
1954 EEB2~ LD (BOOTVOL),DE ; D -> DEVICE/UNIT, E -> LU
1955 EEB2~ ;
1956 EEB2~ ; PERFORM UNA BIOS SPECIFIC INITIALIZATION
1957 EEB2~ ; UPDATE DRVMAP BASED ON AVAILABLE UNA UNITS
1958 EEB2~ ;
1959 EEB2~ ; SETUP THE DRVMAP STRUCTURE
1960 EEB2~ LD HL,(BUFTOP) ; GET CURRENT BUFFER TOP
1961 EEB2~ INC HL ; SKIP 1 BYTE FOR ENTRY COUNT PREFIX
1962 EEB2~ LD (DRVMAPADR),HL ; SAVE AS DRIVE MAP ADDRESS
1963 EEB2~ LD (BUFTOP),HL ; ... AND AS NEW BUFTOP
1964 EEB2~ ;
1965 EEB2~ LD B,0 ; START WITH UNIT 0
1966 EEB2~ ;
1967 EEB2~ DRV_INIT1: ; LOOP THRU ALL UNITS AVAILABLE
1968 EEB2~ LD C,$48 ; UNA FUNC: GET DISK TYPE
1969 EEB2~ LD L,0 ; PRESET UNIT COUNT TO ZERO
1970 EEB2~ CALL $FFFD ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!!
1971 EEB2~ LD A,L ; UNIT COUNT TO A
1972 EEB2~ OR A ; PAST END?
1973 EEB2~ JR Z,DRV_INIT2 ; WE ARE DONE
1974 EEB2~ PUSH BC ; SAVE UNIT
1975 EEB2~ CALL DRV_INIT3 ; PROCESS THE UNIT
1976 EEB2~ POP BC ; RESTORE UNIT
1977 EEB2~ INC B ; NEXT UNIT
1978 EEB2~ JR DRV_INIT1 ; LOOP
1979 EEB2~ ;
1980 EEB2~ DRV_INIT2: ; FINALIZE THE DRIVE MAP
1981 EEB2~ RET ; DONE
1982 EEB2~ ;
1983 EEB2~ DRV_INIT3: ; PROCESS CURRENT UNIT (SEE UNA PROTOIDS.INC)
1984 EEB2~ LD A,D ; MOVE DISK TYPE TO A
1985 EEB2~ ; CALL PC_LBKT ; *DEBUG*
1986 EEB2~ ; CALL PRTHEXBYTE ; *DEBUG*
1987 EEB2~ ; CALL PC_RBKT ; *DEBUG*
1988 EEB2~ ;
1989 EEB2~ CALL DRV_INIT4 ; MAKE A DRIVE MAP ENTRY
1990 EEB2~ LD A,D ; LOAD DRIVE TYPE
1991 EEB2~ CP $40 ; RAM/ROM?
1992 EEB2~ RET Z ; DONE IF SO
1993 EEB2~ ; CP $?? ; FLOPPY DRIVE?
1994 EEB2~ ; RET Z ; DONE IF SO
1995 EEB2~ CALL DRV_INIT4 ; ANOTHER ENTRY FOR HARD DISK
1996 EEB2~ LD A,1 ; BUT WITH SLICE VALUE OF 1
1997 EEB2~ INC HL ; BUMP TO SLICE POSITION
1998 EEB2~ LD (HL),A ; SAVE IT
1999 EEB2~ RET ; DONE
2000 EEB2~ ;
2001 EEB2~ DRV_INIT4:
2002 EEB2~ ; ALLOCATE SPACE IN DRVMAP
2003 EEB2~ PUSH BC ; SAVE INCOMING UNIT NUM
2004 EEB2~ LD BC,4 ; 4 BYTES PER ENTRY
2005 EEB2~ CALL ALLOC ; ALLOCATE
2006 EEB2~ CALL NZ,PANIC ; SHOULD NEVER ERROR HERE
2007 EEB2~ PUSH BC ; MOVE MEM PTR
2008 EEB2~ POP HL ; ... TO HL
2009 EEB2~ POP BC ; RECOVER UNIT NUM
2010 EEB2~ LD (HL),B ; SAVE IT IN FIRST BYTE OF DRV MAP ENTRY
2011 EEB2~ PUSH HL ; SAVE HL
2012 EEB2~ LD HL,(DRVMAPADR) ; POINT TO DRIVE MAP
2013 EEB2~ DEC HL ; BACK TO ENTRY COUNT
2014 EEB2~ INC (HL) ; INCREMENT THE ENTRY COUNT
2015 EEB2~ POP HL ; RECOVER HL
2016 EEB2~ RET ; DONE
2017 EEB2~ ;
2018 EEB2 #ELSE
2019 EEB2 ;
2020 EEB2 DRV_INIT:
2021 EEB2 ;
2022 EEB2 ; PERFORM HBIOS SPECIFIC INITIALIZATION
2023 EEB2 ; BUILD DRVMAP BASED ON AVAILABLE HBIOS DISK DEVICE LIST
2024 EEB2 ;
2025 EEB2 ; GET BOOT DEVICE/UNIT/LU INFO
2026 EEB2 06 F4 LD B,BF_SYSATTR ; HBIOS FUNC: GET/SET ATTR
2027 EEB4 0E 00 LD C,AID_BOOTVOL ; ATTRIB ID FOR BOOT DEVICE
2028 EEB6 CF RST 08 ; GET THE VALUE
2029 EEB7 ED 53 8E F0 LD (BOOTVOL),DE ; D -> DEVICE/UNIT, E -> LU
2030 EEBB ;
2031 EEBB ; SETUP THE DRVMAP STRUCTURE
2032 EEBB 2A 8C F0 LD HL,(BUFTOP) ; GET CURRENT BUFFER TOP
2033 EEBE 23 INC HL ; SKIP 1 BYTE FOR ENTRY COUNT PREFIX
2034 EEBF 22 3B E6 LD (DRVMAPADR),HL ; SAVE AS DRVMAP ADDRESS
2035 EEC2 22 8C F0 LD (BUFTOP),HL ; AND AS NEW BUFTOP
2036 EEC5 ;
2037 EEC5 ; SETUP TO LOOP THROUGH AVAILABLE DEVICES
2038 EEC5 06 1A LD B,BF_DIODEVCNT ; HBIOS FUNC: DEVICE COUNT
2039 EEC7 CF RST 08 ; CALL HBIOS, DEVICE COUNT TO B
2040 EEC8 78 LD A,B ; COUNT TO A
2041 EEC9 B7 OR A ; SET FLAGS
2042 EECA C8 RET Z ; HANDLE ZERO DEVICES (ALBEIT POORLY)
2043 EECB 0E 00 LD C,0 ; USE C AS DEVICE LIST INDEX
2044 EECD ;
2045 EECD DRV_INIT1: ; DEVICE ENUMERATION LOOP
2046 EECD C5 PUSH BC ; PRESERVE LOOP CONTROL
2047 EECE 06 1B LD B,BF_DIODEVINF ; HBIOS FUNC: DEVICE INFO
2048 EED0 CF RST 08 ; CALL HBIOS, DEVICE/UNIT TO C
2049 EED1 CD D9 EE CALL DRV_INIT3 ; MAKE DRIVE MAP ENTRY(S)
2050 EED4 C1 POP BC ; RESTORE LOOP CONTROL
2051 EED5 0C INC C ; INCREMENT LIST INDEX
2052 EED6 10 F5 DJNZ DRV_INIT1 ; LOOP AS NEEDED
2053 EED8 C9 RET ; FINISHED
2054 EED9 ;
2055 EED9 DRV_INIT3: ; PROCESS DEVICE/UNIT
2056 EED9 79 LD A,C ; DEVICE/UNIT TO A
2057 EEDA F5 PUSH AF ; SAVE DEVICE/UNIT
2058 EEDB CD EA EE CALL DRV_INIT4 ; MAKE A DRIVE MAP ENTRY
2059 EEDE F1 POP AF ; RESTORE DEVICE/UNIT
2060 EEDF FE 30 CP DIODEV_IDE ; FIRST SLICE CAPABLE DEVICE?
2061 EEE1 D8 RET C ; DONE IF NOT SLICE WORTHY
2062 EEE2 CD EA EE CALL DRV_INIT4 ; MAKE ANOTHER ENTRY IF HARD DISK
2063 EEE5 3E 01 LD A,1 ; ... BUT WITH SLICE = 1
2064 EEE7 23 INC HL ; BUMP TO SLICE POSITION
2065 EEE8 77 LD (HL),A ; SAVE IT
2066 EEE9 C9 RET ; DONE
2067 EEEA ;
2068 EEEA DRV_INIT4: ; MAKE A DRIVE MAP ENTRY
2069 EEEA ; ALLOCATE SPACE FOR ENTRY
2070 EEEA F5 PUSH AF ; SAVE INCOMING DEVICE/UNIT
2071 EEEB 01 04 00 LD BC,4 ; 4 BYTES PER ENTRY
2072 EEEE CD DE EF CALL ALLOC ; ALLOCATE SPACE
2073 EEF1 C4 66 EA CALL NZ,PANIC ; SHOULD NEVER ERROR HERE
2074 EEF4 C5 PUSH BC ; MOVE MEM PTR
2075 EEF5 E1 POP HL ; ... TO HL
2076 EEF6 F1 POP AF ; RECOVER DEVICE/UNIT
2077 EEF7 77 LD (HL),A ; SAVE IT IN FIRST BYTE OF DRVMAP
2078 EEF8 E5 PUSH HL ; SAVE ENTRY PTR
2079 EEF9 2A 3B E6 LD HL,(DRVMAPADR) ; POINT TO DRIVE MAP
2080 EEFC 2B DEC HL ; BACKUP TO ENTRY COUNT
2081 EEFD 34 INC (HL) ; INCREMENT THE ENTRY COUNT
2082 EEFE E1 POP HL ; RECOVER ENTRY POINTER
2083 EEFF C9 RET ; DONE
2084 EF00 ;
2085 EF00 #ENDIF
2086 EF00 ;
2087 EF00 ;
2088 EF00 ;__________________________________________________________________________________________________
2089 EF00 ;
2090 EF00 DPH_INIT:
2091 EF00 ;
2092 EF00 ; ITERATE THROUGH DRIVE MAP TO BUILD DPH ENTRIES DYNAMICALLY
2093 EF00 ;
2094 EF00 11 AE F0 LD DE,STR_DPHINIT ; POINT TO MSG
2095 EF03 CD 56 EA CALL WRITESTR ; DISPLAY IT
2096 EF06 CD 1C EA CALL NEWLINE ; FORMATTING
2097 EF09 ;
2098 EF09 ; ALLOCATE DPH POOL SPACE BASED ON DRIVE COUNT
2099 EF09 2A 3B E6 LD HL,(DRVMAPADR) ; LOAD DRIVE MAP POINTER
2100 EF0C 2B DEC HL ; BACKUP TO ENTRY COUNT
2101 EF0D 7E LD A,(HL) ; GET THE ENTRY COUNT
2102 EF0E 6F LD L,A ; PUT DRIVE COUNT
2103 EF0F 26 00 LD H,0 ; ... INTO HL
2104 EF11 29 ADD HL,HL ; MULTIPLY
2105 EF12 29 ADD HL,HL ; ... BY SIZE
2106 EF13 29 ADD HL,HL ; ... OF DPH (16)
2107 EF14 29 ADD HL,HL ; ... FOR TOTAL SIZE
2108 EF15 E5 PUSH HL ; MOVE POOL SIZE
2109 EF16 C1 POP BC ; ... INTO BC FOR MEM ALLOC
2110 EF17 CD DE EF CALL ALLOC ; ALLOCATE THE SPACE
2111 EF1A C4 66 EA CALL NZ,PANIC ; SHOULD NEVER ERROR
2112 EF1D ;
2113 EF1D ; SET DPHTOP TO START OF ALLOCATED SPACE
2114 EF1D C5 PUSH BC ; MOVE MEM POINTER
2115 EF1E E1 POP HL ; ... TO HL
2116 EF1F 22 88 F0 LD (DPHTOP),HL ; ... AND SAVE IN DPHTOP
2117 EF22 ;
2118 EF22 ; ALLOCATE DIRECTORY BUFFER
2119 EF22 01 80 00 LD BC,128 ; SIZE OF DIRECTORY BUFFER
2120 EF25 CD DE EF CALL ALLOC ; ALLOCATE THE SPACE
2121 EF28 C4 66 EA CALL NZ,PANIC ; SHOULD NEVER ERROR
2122 EF2B C5 PUSH BC ; MOVE MEM POINTER
2123 EF2C E1 POP HL ; ... TO HL
2124 EF2D 22 8A F0 LD (DIRBUF),HL ; ... AND SAVE IN DIRBUF
2125 EF30 ;
2126 EF30 ; SETUP FOR DPH BUILD LOOP
2127 EF30 2A 3B E6 LD HL,(DRVMAPADR) ; POINT TO DRIVE MAP
2128 EF33 2B DEC HL ; BACKUP TO ENTRY COUNT
2129 EF34 46 LD B,(HL) ; LOOP DRVCNT TIMES
2130 EF35 0E 00 LD C,0 ; DRIVE INDEX
2131 EF37 23 INC HL ; BUMP TO START OF DRIVE MAP
2132 EF38 ;
2133 EF38 DPH_INIT1:
2134 EF38 ; DISPLAY DRIVE LETTER
2135 EF38 79 LD A,C ; LOAD DRIVE INDEX
2136 EF39 C6 41 ADD A,'A' ; MAKE IT A DISPLAY LETTER
2137 EF3B 11 A8 F0 LD DE,STR_LDR ; LEADER STRING
2138 EF3E CD 56 EA CALL WRITESTR ; DISPLAY IT
2139 EF41 CD B6 EA CALL COUT ; DISPLAY DRIVE LETTER
2140 EF44 CD E0 E9 CALL PC_COLON ; DISPLAY COLON
2141 EF47 3E 3D LD A,'=' ; SEPARATOR
2142 EF49 CD B6 EA CALL COUT ; DISPLAY IT
2143 EF4C ; SETUP FOR DPH BUILD ROUTINE INCLUDING DPH BLOCK ALLOCATION
2144 EF4C 56 LD D,(HL) ; D := DEV/UNIT
2145 EF4D 23 INC HL ; BUMP
2146 EF4E 5E LD E,(HL) ; E := SLICE
2147 EF4F 23 INC HL ; BUMP
2148 EF50 CD 0E F0 CALL PRTDUS ; PRINT DEVICE/UNIT/SLICE
2149 EF53 7A LD A,D ; A := DEV/UNIT
2150 EF54 E5 PUSH HL ; SAVE DRIVE MAP POINTER
2151 EF55 F5 PUSH AF ; SAVE DEV/UNIT
2152 EF56 ; MATCH AND SAVE DEFAULT DRIVE BASED ON BOOT DEVICE/UNIT/SLICE
2153 EF56 21 8F F0 LD HL,BOOTVOL + 1 ; POINT TO BOOT DEVICE/UNIT
2154 EF59 7A LD A,D ; LOAD CURRENT DEVICE/UNIT
2155 EF5A BE CP (HL) ; MATCH?
2156 EF5B 20 09 JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT DEVICE/UNIT
2157 EF5D 2B DEC HL ; POINT TO BOOT SLICE
2158 EF5E 7B LD A,E ; LOAD CURRENT SLICE
2159 EF5F BE CP (HL) ; MATCH?
2160 EF60 20 04 JR NZ,DPH_INIT1A ; BYPASS IF NOT BOOT SLICE
2161 EF62 79 LD A,C ; LOAD THE CURRENT DRIVE NUM
2162 EF63 32 9A EB LD (DEFDRIVE),A ; SAVE AS DEFAULT
2163 EF66 DPH_INIT1A:
2164 EF66 F1 POP AF ; RESTORE DEV/UNIT
2165 EF67 ED 5B 88 F0 LD DE,(DPHTOP) ; GET ADDRESS OF NEXT DPH
2166 EF6B D5 PUSH DE ; ... AND SAVE IT
2167 EF6C ; INVOKE THE DPH BUILD ROUTINE
2168 EF6C C5 PUSH BC ; SAVE LOOP CONTROL
2169 EF6D CD 8A EF CALL MAKDPH ; MAKE THE DPH AT DE, DEV/UNIT IN A
2170 EF70 ;CALL NZ,PANIC ; FOR NOW, PANIC ON ANY ERROR
2171 EF70 C1 POP BC ; RESTORE LOOP CONTROL
2172 EF71 ; STORE THE DPH POINTER IN DRIVE MAP
2173 EF71 D1 POP DE ; RESTORE DPH ADDRESS TO DE
2174 EF72 E1 POP HL ; RESTORE DRIVE MAP POINTER TO HL
2175 EF73 28 03 JR Z,DPH_INIT2 ; IF MAKDPH OK, CONTINUE
2176 EF75 11 00 00 LD DE,0 ; ... OTHERWISE ZERO OUT THE DPH POINTER
2177 EF78 DPH_INIT2:
2178 EF78 73 LD (HL),E ; SAVE DPH POINTER
2179 EF79 23 INC HL ; ... IN
2180 EF7A 72 LD (HL),D ; ... DRIVE MAP
2181 EF7B 23 INC HL ; AND BUMP TO START OF NEXT ENTRY
2182 EF7C ; UPDATE DPH ALLOCATION TOP
2183 EF7C 3E 10 LD A,16 ; SIZE OF A DPH ENTRY
2184 EF7E EB EX DE,HL ; HL := DPH POINTER
2185 EF7F CD 0B EB CALL ADDHLA ; CALC NEW DPHTOP
2186 EF82 22 88 F0 LD (DPHTOP),HL ; SAVE IT
2187 EF85 ; HANDLE THE NEXT DRIVE MAP ENTRY
2188 EF85 EB EX DE,HL ; HL := NEXT DRIVE MAP ENTRY
2189 EF86 0C INC C ; NEXT DRIVE
2190 EF87 10 AF DJNZ DPH_INIT1 ; LOOP AS NEEDED
2191 EF89 C9 RET ; DONE
2192 EF8A ;
2193 EF8A MAKDPH:
2194 EF8A ;
2195 EF8A ; MAKE A DPH AT ADDRESS IN DE FOR DEV/UNIT IN A
2196 EF8A ;
2197 EF8A D5 PUSH DE ; SAVE INCOMING DPH ADDRESS
2198 EF8B ;
2199 EF8B~ #IF (PLATFORM == PLT_UNA)
2200 EF8B~ ;
2201 EF8B~ LD B,A ; UNIT NUM TO B
2202 EF8B~ LD C,$48 ; UNA FUNC: GET DISK TYPE
2203 EF8B~ CALL $FFFD ; CALL UNA
2204 EF8B~ LD A,D ; MOVE DISK TYPE TO A
2205 EF8B~ ;
2206 EF8B~ ; DERIVE DPB ADDRESS BASED ON DISK TYPE
2207 EF8B~ CP $40 ; RAM/ROM DRIVE?
2208 EF8B~ JR Z,MAKDPH0 ; HANDLE RAM/ROM DRIVE IF SO
2209 EF8B~ ; CP $?? ; FLOPPY DRIVE?
2210 EF8B~ ; JR Z,XXXXX ; HANDLE FLOPPY
2211 EF8B~ LD DE,DPB_HD ; ASSUME HARD DISK
2212 EF8B~ JR MAKDPH1 ; CONTINUE
2213 EF8B~ ;
2214 EF8B~ MAKDPH0: ; HANDLE RAM/ROM
2215 EF8B~ LD C,$45 ; UNA FUNC: GET DISK INFO
2216 EF8B~ LD DE,$9000 ; 512 BYTE BUFFER *** FIX!!! ***
2217 EF8B~ CALL $FFFD ; CALL UNA
2218 EF8B~ BIT 7,B ; TEST RAM DRIVE BIT
2219 EF8B~ LD DE,DPB_ROM ; ASSUME ROM
2220 EF8B~ JR Z,MAKDPH1 ; NOT SET, ROM DRIVE, CONTINUE
2221 EF8B~ LD DE,DPB_RAM ; OTHERWISE, MUST BE RAM DRIVE
2222 EF8B~ JR MAKDPH1 ; CONTINUE
2223 EF8B~ ;
2224 EF8B #ELSE
2225 EF8B ;
2226 EF8B ; DETERMINE APPROPRIATE DPB
2227 EF8B 11 D2 EB LD DE,DPB_ROM ; ASSUME ROM
2228 EF8E FE 00 CP DIODEV_MD+0 ; ROM?
2229 EF90 28 1C JR Z,MAKDPH1 ; YES, JUMP AHEAD
2230 EF92 11 E6 EB LD DE,DPB_RAM ; ASSUME ROM
2231 EF95 FE 01 CP DIODEV_MD+1 ; ROM?
2232 EF97 28 15 JR Z,MAKDPH1 ; YES, JUMP AHEAD
2233 EF99 E6 F0 AND $F0 ; IGNORE UNIT NIBBLE NOW
2234 EF9B 11 36 EC LD DE,DPB_FD144 ; ASSUME FLOPPY
2235 EF9E FE 10 CP DIODEV_FD ; FLOPPY?
2236 EFA0 28 0C JR Z,MAKDPH1 ; YES, JUMP AHEAD
2237 EFA2 11 FA EB LD DE,DPB_RF ; ASSUME RAM FLOPPY
2238 EFA5 FE 20 CP DIODEV_RF ; RAM FLOPPY?
2239 EFA7 28 05 JR Z,MAKDPH1 ; YES, JUMP AHEAD
2240 EFA9 11 0E EC LD DE,DPB_HD ; EVERYTHING ELSE IS ASSUMED TO BE HARD DISK
2241 EFAC 18 00 JR MAKDPH1 ; JUMP AHEAD
2242 EFAE ;
2243 EFAE #ENDIF
2244 EFAE ;
2245 EFAE MAKDPH1:
2246 EFAE ;
2247 EFAE ; BUILD THE DPH
2248 EFAE E1 POP HL ; HL := START OF DPH
2249 EFAF 3E 08 LD A,8 ; SIZE OF DPH RESERVED AREA
2250 EFB1 CD 0B EB CALL ADDHLA ; LEAVE IT ALONE (ZERO FILLED)
2251 EFB4
2252 EFB4 ED 4B 8A F0 LD BC,(DIRBUF) ; ADDRESS OF DIRBUF
2253 EFB8 71 LD (HL),C ; PLUG DIRBUF
2254 EFB9 23 INC HL ; ... INTO DPH
2255 EFBA 70 LD (HL),B ; ... AND BUMP
2256 EFBB 23 INC HL ; ... TO NEXT DPH ENTRY
2257 EFBC
2258 EFBC 73 LD (HL),E ; PLUG DPB ADDRESS
2259 EFBD 23 INC HL ; ... INTO DPH
2260 EFBE 72 LD (HL),D ; ... AND BUMP
2261 EFBF 23 INC HL ; ... TO NEXT ENTRY
2262 EFC0 1B DEC DE ; POINT
2263 EFC1 1B DEC DE ; ... TO START
2264 EFC2 1B DEC DE ; ... OF
2265 EFC3 1B DEC DE ; ... DPB
2266 EFC4 1B DEC DE ; ... PREFIX DATA (CKS & ALS BUF SIZES)
2267 EFC5 CD C9 EF CALL MAKDPH2 ; HANDLE CKS BUF, THEN FALL THRU FOR ALS BUF
2268 EFC8 C0 RET NZ ; BAIL OUT ON ERROR
2269 EFC9 MAKDPH2:
2270 EFC9 EB EX DE,HL ; POINT HL TO CKS/ALS SIZE ADR
2271 EFCA 4E LD C,(HL) ; BC := CKS/ALS SIZE
2272 EFCB 23 INC HL ; ... AND BUMP
2273 EFCC 46 LD B,(HL) ; ... PAST
2274 EFCD 23 INC HL ; ... CKS/ALS SIZE
2275 EFCE EB EX DE,HL ; BC AND HL ROLES RESTORED
2276 EFCF 78 LD A,B ; CHECK TO SEE
2277 EFD0 B1 OR C ; ... IF BC IS ZERO
2278 EFD1 28 05 JR Z,MAKDPH3 ; IF ZERO, BYPASS ALLOC, USE ZERO FOR ADDRESS
2279 EFD3 CD DE EF CALL ALLOC ; ALLOC BC BYTES, ADDRESS RETURNED IN BC
2280 EFD6 20 26 JR NZ,ERR_BUFOVF ; HANDLE OVERFLOW ERROR
2281 EFD8 MAKDPH3:
2282 EFD8 71 LD (HL),C ; SAVE CKS/ALS BUF
2283 EFD9 23 INC HL ; ... ADDRESS IN
2284 EFDA 70 LD (HL),B ; ... DPH AND BUMP
2285 EFDB 23 INC HL ; ... TO NEXT DPH ENTRY
2286 EFDC AF XOR A ; SIGNAL SUCCESS
2287 EFDD C9 RET
2288 EFDE ;
2289 EFDE ALLOC:
2290 EFDE ;
2291 EFDE ; ALLOCATE BC BYTES FROM BUF POOL, RETURN STARTING
2292 EFDE ; ADDRESS IN BC. LEAVE ALL OTHER REGS ALONE EXCEPT A
2293 EFDE ; Z FOR SUCCESS, NZ FOR FAILURE
2294 EFDE ;
2295 EFDE D5 PUSH DE ; SAVE ORIGINAL DE
2296 EFDF E5 PUSH HL ; SAVE ORIGINAL HL
2297 EFE0 2A 8C F0 LD HL,(BUFTOP) ; HL := CURRENT BUFFER TOP
2298 EFE3 E5 PUSH HL ; SAVE AS START OF NEW BUFFER
2299 EFE4 C5 PUSH BC ; GET BYTE COUNT
2300 EFE5 D1 POP DE ; ... INTO DE
2301 EFE6 19 ADD HL,DE ; ADD IT TO BUFFER TOP
2302 EFE7 3E FF LD A,$FF ; ASSUME OVERFLOW FAILURE
2303 EFE9 38 0E JR C,ALLOC1 ; IF OVERFLOW, BYPASS WITH A == $FF
2304 EFEB E5 PUSH HL ; SAVE IT
2305 EFEC 11 00 02 LD DE,$10000 - CBIOS_END ; SETUP DE FOR OVERFLOW TEST
2306 EFEF 19 ADD HL,DE ; CHECK FOR OVERFLOW
2307 EFF0 E1 POP HL ; RECOVER HL
2308 EFF1 3E FF LD A,$FF ; ASSUME FAILURE
2309 EFF3 38 04 JR C,ALLOC1 ; IF OVERFLOW, CONTINUE WITH A == $FF
2310 EFF5 22 8C F0 LD (BUFTOP),HL ; SAVE NEW TOP
2311 EFF8 3C INC A ; SIGNAL SUCCESS
2312 EFF9 ;
2313 EFF9 ALLOC1:
2314 EFF9 C1 POP BC ; BUF START ADDRESS TO BC
2315 EFFA E1 POP HL ; RESTORE ORIGINAL HL
2316 EFFB D1 POP DE ; RESTORE ORIGINAL DE
2317 EFFC B7 OR A ; SIGNAL SUCCESS
2318 EFFD C9 RET
2319 EFFE ;
2320 EFFE ERR_BUFOVF:
2321 EFFE 11 C8 F0 LD DE,STR_BUFOVF
2322 F001 18 05 JR ERR
2323 F003 ;
2324 F003 ERR_INVMED:
2325 F003 11 E5 F0 LD DE,STR_INVMED
2326 F006 18 00 JR ERR
2327 F008 ;
2328 F008 ERR:
2329 F008 CD 56 EA CALL WRITESTR
2330 F00B F6 FF OR $FF
2331 F00D C9 RET
2332 F00E ;
2333 F00E PRTDUS:
2334 F00E ;
2335 F00E ; PRINT THE DEVICE/UNIT/SLICE INFO
2336 F00E ; ON INPUT D HAS DEVICE/UNIT, E HAS SLICE
2337 F00E ; DESTROY NO REGISTERS OTHER THAN A
2338 F00E ;
2339 F00E~ #IF (PLATFORM == PLT_UNA)
2340 F00E~ ;
2341 F00E~ PUSH BC ; PRESERVE BC
2342 F00E~ PUSH DE ; PRESERVE DE
2343 F00E~ PUSH HL ; PRESERVE HL
2344 F00E~
2345 F00E~ LD B,D ; B := UNIT
2346 F00E~ LD C,$48 ; UNA FUNC: GET DISK TYPE
2347 F00E~ CALL $FFFD ; CALL UNA
2348 F00E~ LD A,D ; DISK TYPE TO A
2349 F00E~
2350 F00E~ CP $40
2351 F00E~ JR Z,PRTDUS1 ; IF SO, HANDLE RAM/ROM
2352 F00E~
2353 F00E~ LD DE,DEVIDE ; IDE STRING
2354 F00E~ CP $41 ; IDE?
2355 F00E~ JR Z,PRTDUSX ; IF YES, PRINT
2356 F00E~ LD DE,DEVPPIDE ; PPIDE STRING
2357 F00E~ CP $42 ; PPIDE?
2358 F00E~ JR Z,PRTDUSX ; IF YES, PRINT
2359 F00E~ LD DE,DEVSD ; SD STRING
2360 F00E~ CP $43 ; SD?
2361 F00E~ JR Z,PRTDUSX ; IF YES, PRINT
2362 F00E~ LD DE,DEVDSD ; DSD STRING
2363 F00E~ CP $44 ; DSD?
2364 F00E~ JR Z,PRTDUSX ; IF YES, PRINT
2365 F00E~
2366 F00E~ LD DE,DEVUNK ; OTHERWISE, UNKNOWN
2367 F00E~ JR PRTDUSX ; PRINT IT
2368 F00E~
2369 F00E~ PRTDUS1:
2370 F00E~ LD C,$45 ; UNA FUNC: GET DISK INFO
2371 F00E~ LD DE,$9000 ; 512 BYTE BUFFER *** FIX!!! ***
2372 F00E~ CALL $FFFD ; CALL UNA
2373 F00E~ BIT 7,B ; TEST RAM DRIVE BIT
2374 F00E~ LD DE,DEVROM ; ASSUME ROM
2375 F00E~ JR Z,PRTDUSX ; IF SO, DISPLAY ROM
2376 F00E~ LD DE,DEVRAM ; ELSE RAM
2377 F00E~ JR Z,PRTDUSX ; DO IT
2378 F00E~
2379 F00E~ PRTDUSX:
2380 F00E~ CALL WRITESTR ; PRINT DEVICE NAME
2381 F00E~ POP HL ; RECOVER HL
2382 F00E~ POP DE ; RECOVER DE
2383 F00E~ POP BC ; RECOVER BC
2384 F00E~ LD A,D ; LOAD DEVICE/UNIT
2385 F00E~ CALL PRTDECB ; PRINT IT
2386 F00E~ CALL PC_COLON ; FORMATTING
2387 F00E~ LD A,E ; LOAD SLICE
2388 F00E~ CALL PRTDECB ; PRINT IT
2389 F00E~ RET
2390 F00E~ ;
2391 F00E~ DEVRAM .DB "RAM$"
2392 F00E~ DEVROM .DB "ROM$"
2393 F00E~ DEVIDE .DB "IDE$"
2394 F00E~ DEVPPIDE .DB "PPIDE$"
2395 F00E~ DEVSD .DB "SD$"
2396 F00E~ DEVDSD .DB "DSD$"
2397 F00E~ DEVUNK .DB "UNK$"
2398 F00E~ ;
2399 F00E #ELSE
2400 F00E ;
2401 F00E D5 PUSH DE ; PRESERVE DE
2402 F00F E5 PUSH HL ; PRESERVE HL
2403 F010 7A LD A,D ; LOAD DEVICE/UNIT
2404 F011 0F RRCA ; ROTATE DEVICE
2405 F012 0F RRCA ; ... BITS
2406 F013 0F RRCA ; ... INTO
2407 F014 0F RRCA ; ... LOWEST 4 BITS
2408 F015 E6 0F AND $0F ; ISOLATE DEVICE BITS
2409 F017 87 ADD A,A ; MULTIPLE BY TWO FOR WORD TABLE
2410 F018 21 35 F0 LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE
2411 F01B CD 0B EB CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY
2412 F01E 7E LD A,(HL) ; DEREFERENCE HL TO LOC OF DEVICE NAME STRING
2413 F01F 23 INC HL ; ...
2414 F020 56 LD D,(HL) ; ...
2415 F021 5F LD E,A ; ...
2416 F022 CD 56 EA CALL WRITESTR ; PRINT THE DEVICE NMEMONIC
2417 F025 E1 POP HL ; RECOVER HL
2418 F026 D1 POP DE ; RECOVER DE
2419 F027 7A LD A,D ; LOAD DEVICE/UNIT
2420 F028 E6 0F AND $0F ; ISOLATE UNIT
2421 F02A CD 4D EB CALL PRTDECB ; PRINT IT
2422 F02D CD E0 E9 CALL PC_COLON ; FORMATTING
2423 F030 7B LD A,E ; LOAD SLICE
2424 F031 CD 4D EB CALL PRTDECB ; PRINT IT
2425 F034 C9 RET
2426 F035 ;
2427 F035 DEVTBL: ; DEVICE TABLE
2428 F035 59 F0 5C F0 .DW DEV00, DEV01, DEV02, DEV03
2428 F039 5F F0 64 F0
2429 F03D 68 F0 6E F0 .DW DEV04, DEV05, DEV06, DEV07
2429 F041 74 F0 77 F0
2430 F045 7D F0 83 F0 .DW DEV08, DEV09, DEV10, DEV11
2430 F049 55 F0 55 F0
2431 F04D 55 F0 55 F0 .DW DEV12, DEV13, DEV14, DEV15
2431 F051 55 F0 55 F0
2432 F055 ;
2433 F055 3F 3F 3F 24 DEVUNK .DB "???$"
2434 F059 4D 44 24 DEV00 .DB "MD$"
2435 F05C 46 44 24 DEV01 .DB "FD$"
2436 F05F 52 41 4D 46 DEV02 .DB "RAMF$"
2436 F063 24
2437 F064 49 44 45 24 DEV03 .DB "IDE$"
2438 F068 41 54 41 50 DEV04 .DB "ATAPI$"
2438 F06C 49 24
2439 F06E 50 50 49 44 DEV05 .DB "PPIDE$"
2439 F072 45 24
2440 F074 53 44 24 DEV06 .DB "SD$"
2441 F077 50 52 50 53 DEV07 .DB "PRPSD$"
2441 F07B 44 24
2442 F07D 50 50 50 53 DEV08 .DB "PPPSD$"
2442 F081 44 24
2443 F083 48 44 53 4B DEV09 .DB "HDSK$"
2443 F087 24
2444 F088 DEV10 .EQU DEVUNK
2445 F088 DEV11 .EQU DEVUNK
2446 F088 DEV12 .EQU DEVUNK
2447 F088 DEV13 .EQU DEVUNK
2448 F088 DEV14 .EQU DEVUNK
2449 F088 DEV15 .EQU DEVUNK
2450 F088 ;
2451 F088 #ENDIF
2452 F088 ;
2453 F088 00 00 DPHTOP .DW 0 ; CURRENT TOP OF DPH POOL
2454 F08A 00 00 DIRBUF .DW 0 ; DIR BUF POINTER
2455 F08C 81 EC BUFTOP .DW BUFPOOL ; CURRENT TOP OF BUF POOL
2456 F08E 00 00 BOOTVOL .DW ; BOOT VOLUME, MSB=BOOT DEVICE/UNIT, LSB=BOOT LU
2457 F090 ;
2458 F090 0D 0A 46 6F STR_INITRAMDISK .DB "\r\nFormatting RAMDISK...$"
2458 F094 72 6D 61 74
2458 F098 74 69 6E 67
2458 F09C 20 52 41 4D
2458 F0A0 44 49 53 4B
2458 F0A4 2E 2E 2E 24
2459 F0A8 0D 0A 20 20 STR_LDR .DB "\r\n $"
2459 F0AC 20 24
2460 F0AE 0D 0A 0D 0A STR_DPHINIT .DB "\r\n\r\nConfiguring Drives...$"
2460 F0B2 43 6F 6E 66
2460 F0B6 69 67 75 72
2460 F0BA 69 6E 67 20
2460 F0BE 44 72 69 76
2460 F0C2 65 73 2E 2E
2460 F0C6 2E 24
2461 F0C8 20 2A 2A 2A STR_BUFOVF .DB " *** Insufficient Memory ***$"
2461 F0CC 20 49 6E 73
2461 F0D0 75 66 66 69
2461 F0D4 63 69 65 6E
2461 F0D8 74 20 4D 65
2461 F0DC 6D 6F 72 79
2461 F0E0 20 2A 2A 2A
2461 F0E4 24
2462 F0E5 20 2A 2A 2A STR_INVMED .DB " *** Invalid Device ID ***$"
2462 F0E9 20 49 6E 76
2462 F0ED 61 6C 69 64
2462 F0F1 20 44 65 76
2462 F0F5 69 63 65 20
2462 F0F9 49 44 20 2A
2462 F0FD 2A 2A 24
2463 F100 ;
2464 F100 ;==================================================================================================
2465 F100 ;
2466 F100 ;==================================================================================================
2467 F100 ;
2468 F100 00 00 00 00 .FILL CBIOS_END - $,$00
2468 F104 00 00 00 00
2468 F108 00 00 00 00
2468 F10C 00 00 00 00
2468 F110 00 00 00 00
2468 F114 00 00 00 00
2468 F118 00 00 00 00
2468 F11C 00 00 00 00
2468 F120 00 00 00 00
2468 F124 00 00 00 00
2468 F128 00 00 00 00
2468 F12C 00 00 00 00
2468 F130 00 00 00 00
2468 F134 00 00 00 00
2468 F138 00 00 00 00
2468 F13C 00 00 00 00
2468 F140 00 00 00 00
2468 F144 00 00 00 00
2468 F148 00 00 00 00
2468 F14C 00 00 00 00
2468 F150 00 00 00 00
2468 F154 00 00 00 00
2468 F158 00 00 00 00
2468 F15C 00 00 00 00
2468 F160 00 00 00 00
2468 F164 00 00 00 00
2468 F168 00 00 00 00
2468 F16C 00 00 00 00
2468 F170 00 00 00 00
2468 F174 00 00 00 00
2468 F178 00 00 00 00
2468 F17C 00 00 00 00
2468 F180 00 00 00 00
2468 F184 00 00 00 00
2468 F188 00 00 00 00
2468 F18C 00 00 00 00
2468 F190 00 00 00 00
2468 F194 00 00 00 00
2468 F198 00 00 00 00
2468 F19C 00 00 00 00
2468 F1A0 00 00 00 00
2468 F1A4 00 00 00 00
2468 F1A8 00 00 00 00
2468 F1AC 00 00 00 00
2468 F1B0 00 00 00 00
2468 F1B4 00 00 00 00
2468 F1B8 00 00 00 00
2468 F1BC 00 00 00 00
2468 F1C0 00 00 00 00
2468 F1C4 00 00 00 00
2468 F1C8 00 00 00 00
2468 F1CC 00 00 00 00
2468 F1D0 00 00 00 00
2468 F1D4 00 00 00 00
2468 F1D8 00 00 00 00
2468 F1DC 00 00 00 00
2468 F1E0 00 00 00 00
2468 F1E4 00 00 00 00
2468 F1E8 00 00 00 00
2468 F1EC 00 00 00 00
2468 F1F0 00 00 00 00
2468 F1F4 00 00 00 00
2468 F1F8 00 00 00 00
2468 F1FC 00 00 00 00
2468 F200 00 00 00 00
2468 F204 00 00 00 00
2468 F208 00 00 00 00
2468 F20C 00 00 00 00
2468 F210 00 00 00 00
2468 F214 00 00 00 00
2468 F218 00 00 00 00
2468 F21C 00 00 00 00
2468 F220 00 00 00 00
2468 F224 00 00 00 00
2468 F228 00 00 00 00
2468 F22C 00 00 00 00
2468 F230 00 00 00 00
2468 F234 00 00 00 00
2468 F238 00 00 00 00
2468 F23C 00 00 00 00
2468 F240 00 00 00 00
2468 F244 00 00 00 00
2468 F248 00 00 00 00
2468 F24C 00 00 00 00
2468 F250 00 00 00 00
2468 F254 00 00 00 00
2468 F258 00 00 00 00
2468 F25C 00 00 00 00
2468 F260 00 00 00 00
2468 F264 00 00 00 00
2468 F268 00 00 00 00
2468 F26C 00 00 00 00
2468 F270 00 00 00 00
2468 F274 00 00 00 00
2468 F278 00 00 00 00
2468 F27C 00 00 00 00
2468 F280 00 00 00 00
2468 F284 00 00 00 00
2468 F288 00 00 00 00
2468 F28C 00 00 00 00
2468 F290 00 00 00 00
2468 F294 00 00 00 00
2468 F298 00 00 00 00
2468 F29C 00 00 00 00
2468 F2A0 00 00 00 00
2468 F2A4 00 00 00 00
2468 F2A8 00 00 00 00
2468 F2AC 00 00 00 00
2468 F2B0 00 00 00 00
2468 F2B4 00 00 00 00
2468 F2B8 00 00 00 00
2468 F2BC 00 00 00 00
2468 F2C0 00 00 00 00
2468 F2C4 00 00 00 00
2468 F2C8 00 00 00 00
2468 F2CC 00 00 00 00
2468 F2D0 00 00 00 00
2468 F2D4 00 00 00 00
2468 F2D8 00 00 00 00
2468 F2DC 00 00 00 00
2468 F2E0 00 00 00 00
2468 F2E4 00 00 00 00
2468 F2E8 00 00 00 00
2468 F2EC 00 00 00 00
2468 F2F0 00 00 00 00
2468 F2F4 00 00 00 00
2468 F2F8 00 00 00 00
2468 F2FC 00 00 00 00
2468 F300 00 00 00 00
2468 F304 00 00 00 00
2468 F308 00 00 00 00
2468 F30C 00 00 00 00
2468 F310 00 00 00 00
2468 F314 00 00 00 00
2468 F318 00 00 00 00
2468 F31C 00 00 00 00
2468 F320 00 00 00 00
2468 F324 00 00 00 00
2468 F328 00 00 00 00
2468 F32C 00 00 00 00
2468 F330 00 00 00 00
2468 F334 00 00 00 00
2468 F338 00 00 00 00
2468 F33C 00 00 00 00
2468 F340 00 00 00 00
2468 F344 00 00 00 00
2468 F348 00 00 00 00
2468 F34C 00 00 00 00
2468 F350 00 00 00 00
2468 F354 00 00 00 00
2468 F358 00 00 00 00
2468 F35C 00 00 00 00
2468 F360 00 00 00 00
2468 F364 00 00 00 00
2468 F368 00 00 00 00
2468 F36C 00 00 00 00
2468 F370 00 00 00 00
2468 F374 00 00 00 00
2468 F378 00 00 00 00
2468 F37C 00 00 00 00
2468 F380 00 00 00 00
2468 F384 00 00 00 00
2468 F388 00 00 00 00
2468 F38C 00 00 00 00
2468 F390 00 00 00 00
2468 F394 00 00 00 00
2468 F398 00 00 00 00
2468 F39C 00 00 00 00
2468 F3A0 00 00 00 00
2468 F3A4 00 00 00 00
2468 F3A8 00 00 00 00
2468 F3AC 00 00 00 00
2468 F3B0 00 00 00 00
2468 F3B4 00 00 00 00
2468 F3B8 00 00 00 00
2468 F3BC 00 00 00 00
2468 F3C0 00 00 00 00
2468 F3C4 00 00 00 00
2468 F3C8 00 00 00 00
2468 F3CC 00 00 00 00
2468 F3D0 00 00 00 00
2468 F3D4 00 00 00 00
2468 F3D8 00 00 00 00
2468 F3DC 00 00 00 00
2468 F3E0 00 00 00 00
2468 F3E4 00 00 00 00
2468 F3E8 00 00 00 00
2468 F3EC 00 00 00 00
2468 F3F0 00 00 00 00
2468 F3F4 00 00 00 00
2468 F3F8 00 00 00 00
2468 F3FC 00 00 00 00
2468 F400 00 00 00 00
2468 F404 00 00 00 00
2468 F408 00 00 00 00
2468 F40C 00 00 00 00
2468 F410 00 00 00 00
2468 F414 00 00 00 00
2468 F418 00 00 00 00
2468 F41C 00 00 00 00
2468 F420 00 00 00 00
2468 F424 00 00 00 00
2468 F428 00 00 00 00
2468 F42C 00 00 00 00
2468 F430 00 00 00 00
2468 F434 00 00 00 00
2468 F438 00 00 00 00
2468 F43C 00 00 00 00
2468 F440 00 00 00 00
2468 F444 00 00 00 00
2468 F448 00 00 00 00
2468 F44C 00 00 00 00
2468 F450 00 00 00 00
2468 F454 00 00 00 00
2468 F458 00 00 00 00
2468 F45C 00 00 00 00
2468 F460 00 00 00 00
2468 F464 00 00 00 00
2468 F468 00 00 00 00
2468 F46C 00 00 00 00
2468 F470 00 00 00 00
2468 F474 00 00 00 00
2468 F478 00 00 00 00
2468 F47C 00 00 00 00
2468 F480 00 00 00 00
2468 F484 00 00 00 00
2468 F488 00 00 00 00
2468 F48C 00 00 00 00
2468 F490 00 00 00 00
2468 F494 00 00 00 00
2468 F498 00 00 00 00
2468 F49C 00 00 00 00
2468 F4A0 00 00 00 00
2468 F4A4 00 00 00 00
2468 F4A8 00 00 00 00
2468 F4AC 00 00 00 00
2468 F4B0 00 00 00 00
2468 F4B4 00 00 00 00
2468 F4B8 00 00 00 00
2468 F4BC 00 00 00 00
2468 F4C0 00 00 00 00
2468 F4C4 00 00 00 00
2468 F4C8 00 00 00 00
2468 F4CC 00 00 00 00
2468 F4D0 00 00 00 00
2468 F4D4 00 00 00 00
2468 F4D8 00 00 00 00
2468 F4DC 00 00 00 00
2468 F4E0 00 00 00 00
2468 F4E4 00 00 00 00
2468 F4E8 00 00 00 00
2468 F4EC 00 00 00 00
2468 F4F0 00 00 00 00
2468 F4F4 00 00 00 00
2468 F4F8 00 00 00 00
2468 F4FC 00 00 00 00
2468 F500 00 00 00 00
2468 F504 00 00 00 00
2468 F508 00 00 00 00
2468 F50C 00 00 00 00
2468 F510 00 00 00 00
2468 F514 00 00 00 00
2468 F518 00 00 00 00
2468 F51C 00 00 00 00
2468 F520 00 00 00 00
2468 F524 00 00 00 00
2468 F528 00 00 00 00
2468 F52C 00 00 00 00
2468 F530 00 00 00 00
2468 F534 00 00 00 00
2468 F538 00 00 00 00
2468 F53C 00 00 00 00
2468 F540 00 00 00 00
2468 F544 00 00 00 00
2468 F548 00 00 00 00
2468 F54C 00 00 00 00
2468 F550 00 00 00 00
2468 F554 00 00 00 00
2468 F558 00 00 00 00
2468 F55C 00 00 00 00
2468 F560 00 00 00 00
2468 F564 00 00 00 00
2468 F568 00 00 00 00
2468 F56C 00 00 00 00
2468 F570 00 00 00 00
2468 F574 00 00 00 00
2468 F578 00 00 00 00
2468 F57C 00 00 00 00
2468 F580 00 00 00 00
2468 F584 00 00 00 00
2468 F588 00 00 00 00
2468 F58C 00 00 00 00
2468 F590 00 00 00 00
2468 F594 00 00 00 00
2468 F598 00 00 00 00
2468 F59C 00 00 00 00
2468 F5A0 00 00 00 00
2468 F5A4 00 00 00 00
2468 F5A8 00 00 00 00
2468 F5AC 00 00 00 00
2468 F5B0 00 00 00 00
2468 F5B4 00 00 00 00
2468 F5B8 00 00 00 00
2468 F5BC 00 00 00 00
2468 F5C0 00 00 00 00
2468 F5C4 00 00 00 00
2468 F5C8 00 00 00 00
2468 F5CC 00 00 00 00
2468 F5D0 00 00 00 00
2468 F5D4 00 00 00 00
2468 F5D8 00 00 00 00
2468 F5DC 00 00 00 00
2468 F5E0 00 00 00 00
2468 F5E4 00 00 00 00
2468 F5E8 00 00 00 00
2468 F5EC 00 00 00 00
2468 F5F0 00 00 00 00
2468 F5F4 00 00 00 00
2468 F5F8 00 00 00 00
2468 F5FC 00 00 00 00
2468 F600 00 00 00 00
2468 F604 00 00 00 00
2468 F608 00 00 00 00
2468 F60C 00 00 00 00
2468 F610 00 00 00 00
2468 F614 00 00 00 00
2468 F618 00 00 00 00
2468 F61C 00 00 00 00
2468 F620 00 00 00 00
2468 F624 00 00 00 00
2468 F628 00 00 00 00
2468 F62C 00 00 00 00
2468 F630 00 00 00 00
2468 F634 00 00 00 00
2468 F638 00 00 00 00
2468 F63C 00 00 00 00
2468 F640 00 00 00 00
2468 F644 00 00 00 00
2468 F648 00 00 00 00
2468 F64C 00 00 00 00
2468 F650 00 00 00 00
2468 F654 00 00 00 00
2468 F658 00 00 00 00
2468 F65C 00 00 00 00
2468 F660 00 00 00 00
2468 F664 00 00 00 00
2468 F668 00 00 00 00
2468 F66C 00 00 00 00
2468 F670 00 00 00 00
2468 F674 00 00 00 00
2468 F678 00 00 00 00
2468 F67C 00 00 00 00
2468 F680 00 00 00 00
2468 F684 00 00 00 00
2468 F688 00 00 00 00
2468 F68C 00 00 00 00
2468 F690 00 00 00 00
2468 F694 00 00 00 00
2468 F698 00 00 00 00
2468 F69C 00 00 00 00
2468 F6A0 00 00 00 00
2468 F6A4 00 00 00 00
2468 F6A8 00 00 00 00
2468 F6AC 00 00 00 00
2468 F6B0 00 00 00 00
2468 F6B4 00 00 00 00
2468 F6B8 00 00 00 00
2468 F6BC 00 00 00 00
2468 F6C0 00 00 00 00
2468 F6C4 00 00 00 00
2468 F6C8 00 00 00 00
2468 F6CC 00 00 00 00
2468 F6D0 00 00 00 00
2468 F6D4 00 00 00 00
2468 F6D8 00 00 00 00
2468 F6DC 00 00 00 00
2468 F6E0 00 00 00 00
2468 F6E4 00 00 00 00
2468 F6E8 00 00 00 00
2468 F6EC 00 00 00 00
2468 F6F0 00 00 00 00
2468 F6F4 00 00 00 00
2468 F6F8 00 00 00 00
2468 F6FC 00 00 00 00
2468 F700 00 00 00 00
2468 F704 00 00 00 00
2468 F708 00 00 00 00
2468 F70C 00 00 00 00
2468 F710 00 00 00 00
2468 F714 00 00 00 00
2468 F718 00 00 00 00
2468 F71C 00 00 00 00
2468 F720 00 00 00 00
2468 F724 00 00 00 00
2468 F728 00 00 00 00
2468 F72C 00 00 00 00
2468 F730 00 00 00 00
2468 F734 00 00 00 00
2468 F738 00 00 00 00
2468 F73C 00 00 00 00
2468 F740 00 00 00 00
2468 F744 00 00 00 00
2468 F748 00 00 00 00
2468 F74C 00 00 00 00
2468 F750 00 00 00 00
2468 F754 00 00 00 00
2468 F758 00 00 00 00
2468 F75C 00 00 00 00
2468 F760 00 00 00 00
2468 F764 00 00 00 00
2468 F768 00 00 00 00
2468 F76C 00 00 00 00
2468 F770 00 00 00 00
2468 F774 00 00 00 00
2468 F778 00 00 00 00
2468 F77C 00 00 00 00
2468 F780 00 00 00 00
2468 F784 00 00 00 00
2468 F788 00 00 00 00
2468 F78C 00 00 00 00
2468 F790 00 00 00 00
2468 F794 00 00 00 00
2468 F798 00 00 00 00
2468 F79C 00 00 00 00
2468 F7A0 00 00 00 00
2468 F7A4 00 00 00 00
2468 F7A8 00 00 00 00
2468 F7AC 00 00 00 00
2468 F7B0 00 00 00 00
2468 F7B4 00 00 00 00
2468 F7B8 00 00 00 00
2468 F7BC 00 00 00 00
2468 F7C0 00 00 00 00
2468 F7C4 00 00 00 00
2468 F7C8 00 00 00 00
2468 F7CC 00 00 00 00
2468 F7D0 00 00 00 00
2468 F7D4 00 00 00 00
2468 F7D8 00 00 00 00
2468 F7DC 00 00 00 00
2468 F7E0 00 00 00 00
2468 F7E4 00 00 00 00
2468 F7E8 00 00 00 00
2468 F7EC 00 00 00 00
2468 F7F0 00 00 00 00
2468 F7F4 00 00 00 00
2468 F7F8 00 00 00 00
2468 F7FC 00 00 00 00
2468 F800 00 00 00 00
2468 F804 00 00 00 00
2468 F808 00 00 00 00
2468 F80C 00 00 00 00
2468 F810 00 00 00 00
2468 F814 00 00 00 00
2468 F818 00 00 00 00
2468 F81C 00 00 00 00
2468 F820 00 00 00 00
2468 F824 00 00 00 00
2468 F828 00 00 00 00
2468 F82C 00 00 00 00
2468 F830 00 00 00 00
2468 F834 00 00 00 00
2468 F838 00 00 00 00
2468 F83C 00 00 00 00
2468 F840 00 00 00 00
2468 F844 00 00 00 00
2468 F848 00 00 00 00
2468 F84C 00 00 00 00
2468 F850 00 00 00 00
2468 F854 00 00 00 00
2468 F858 00 00 00 00
2468 F85C 00 00 00 00
2468 F860 00 00 00 00
2468 F864 00 00 00 00
2468 F868 00 00 00 00
2468 F86C 00 00 00 00
2468 F870 00 00 00 00
2468 F874 00 00 00 00
2468 F878 00 00 00 00
2468 F87C 00 00 00 00
2468 F880 00 00 00 00
2468 F884 00 00 00 00
2468 F888 00 00 00 00
2468 F88C 00 00 00 00
2468 F890 00 00 00 00
2468 F894 00 00 00 00
2468 F898 00 00 00 00
2468 F89C 00 00 00 00
2468 F8A0 00 00 00 00
2468 F8A4 00 00 00 00
2468 F8A8 00 00 00 00
2468 F8AC 00 00 00 00
2468 F8B0 00 00 00 00
2468 F8B4 00 00 00 00
2468 F8B8 00 00 00 00
2468 F8BC 00 00 00 00
2468 F8C0 00 00 00 00
2468 F8C4 00 00 00 00
2468 F8C8 00 00 00 00
2468 F8CC 00 00 00 00
2468 F8D0 00 00 00 00
2468 F8D4 00 00 00 00
2468 F8D8 00 00 00 00
2468 F8DC 00 00 00 00
2468 F8E0 00 00 00 00
2468 F8E4 00 00 00 00
2468 F8E8 00 00 00 00
2468 F8EC 00 00 00 00
2468 F8F0 00 00 00 00
2468 F8F4 00 00 00 00
2468 F8F8 00 00 00 00
2468 F8FC 00 00 00 00
2468 F900 00 00 00 00
2468 F904 00 00 00 00
2468 F908 00 00 00 00
2468 F90C 00 00 00 00
2468 F910 00 00 00 00
2468 F914 00 00 00 00
2468 F918 00 00 00 00
2468 F91C 00 00 00 00
2468 F920 00 00 00 00
2468 F924 00 00 00 00
2468 F928 00 00 00 00
2468 F92C 00 00 00 00
2468 F930 00 00 00 00
2468 F934 00 00 00 00
2468 F938 00 00 00 00
2468 F93C 00 00 00 00
2468 F940 00 00 00 00
2468 F944 00 00 00 00
2468 F948 00 00 00 00
2468 F94C 00 00 00 00
2468 F950 00 00 00 00
2468 F954 00 00 00 00
2468 F958 00 00 00 00
2468 F95C 00 00 00 00
2468 F960 00 00 00 00
2468 F964 00 00 00 00
2468 F968 00 00 00 00
2468 F96C 00 00 00 00
2468 F970 00 00 00 00
2468 F974 00 00 00 00
2468 F978 00 00 00 00
2468 F97C 00 00 00 00
2468 F980 00 00 00 00
2468 F984 00 00 00 00
2468 F988 00 00 00 00
2468 F98C 00 00 00 00
2468 F990 00 00 00 00
2468 F994 00 00 00 00
2468 F998 00 00 00 00
2468 F99C 00 00 00 00
2468 F9A0 00 00 00 00
2468 F9A4 00 00 00 00
2468 F9A8 00 00 00 00
2468 F9AC 00 00 00 00
2468 F9B0 00 00 00 00
2468 F9B4 00 00 00 00
2468 F9B8 00 00 00 00
2468 F9BC 00 00 00 00
2468 F9C0 00 00 00 00
2468 F9C4 00 00 00 00
2468 F9C8 00 00 00 00
2468 F9CC 00 00 00 00
2468 F9D0 00 00 00 00
2468 F9D4 00 00 00 00
2468 F9D8 00 00 00 00
2468 F9DC 00 00 00 00
2468 F9E0 00 00 00 00
2468 F9E4 00 00 00 00
2468 F9E8 00 00 00 00
2468 F9EC 00 00 00 00
2468 F9F0 00 00 00 00
2468 F9F4 00 00 00 00
2468 F9F8 00 00 00 00
2468 F9FC 00 00 00 00
2468 FA00 00 00 00 00
2468 FA04 00 00 00 00
2468 FA08 00 00 00 00
2468 FA0C 00 00 00 00
2468 FA10 00 00 00 00
2468 FA14 00 00 00 00
2468 FA18 00 00 00 00
2468 FA1C 00 00 00 00
2468 FA20 00 00 00 00
2468 FA24 00 00 00 00
2468 FA28 00 00 00 00
2468 FA2C 00 00 00 00
2468 FA30 00 00 00 00
2468 FA34 00 00 00 00
2468 FA38 00 00 00 00
2468 FA3C 00 00 00 00
2468 FA40 00 00 00 00
2468 FA44 00 00 00 00
2468 FA48 00 00 00 00
2468 FA4C 00 00 00 00
2468 FA50 00 00 00 00
2468 FA54 00 00 00 00
2468 FA58 00 00 00 00
2468 FA5C 00 00 00 00
2468 FA60 00 00 00 00
2468 FA64 00 00 00 00
2468 FA68 00 00 00 00
2468 FA6C 00 00 00 00
2468 FA70 00 00 00 00
2468 FA74 00 00 00 00
2468 FA78 00 00 00 00
2468 FA7C 00 00 00 00
2468 FA80 00 00 00 00
2468 FA84 00 00 00 00
2468 FA88 00 00 00 00
2468 FA8C 00 00 00 00
2468 FA90 00 00 00 00
2468 FA94 00 00 00 00
2468 FA98 00 00 00 00
2468 FA9C 00 00 00 00
2468 FAA0 00 00 00 00
2468 FAA4 00 00 00 00
2468 FAA8 00 00 00 00
2468 FAAC 00 00 00 00
2468 FAB0 00 00 00 00
2468 FAB4 00 00 00 00
2468 FAB8 00 00 00 00
2468 FABC 00 00 00 00
2468 FAC0 00 00 00 00
2468 FAC4 00 00 00 00
2468 FAC8 00 00 00 00
2468 FACC 00 00 00 00
2468 FAD0 00 00 00 00
2468 FAD4 00 00 00 00
2468 FAD8 00 00 00 00
2468 FADC 00 00 00 00
2468 FAE0 00 00 00 00
2468 FAE4 00 00 00 00
2468 FAE8 00 00 00 00
2468 FAEC 00 00 00 00
2468 FAF0 00 00 00 00
2468 FAF4 00 00 00 00
2468 FAF8 00 00 00 00
2468 FAFC 00 00 00 00
2468 FB00 00 00 00 00
2468 FB04 00 00 00 00
2468 FB08 00 00 00 00
2468 FB0C 00 00 00 00
2468 FB10 00 00 00 00
2468 FB14 00 00 00 00
2468 FB18 00 00 00 00
2468 FB1C 00 00 00 00
2468 FB20 00 00 00 00
2468 FB24 00 00 00 00
2468 FB28 00 00 00 00
2468 FB2C 00 00 00 00
2468 FB30 00 00 00 00
2468 FB34 00 00 00 00
2468 FB38 00 00 00 00
2468 FB3C 00 00 00 00
2468 FB40 00 00 00 00
2468 FB44 00 00 00 00
2468 FB48 00 00 00 00
2468 FB4C 00 00 00 00
2468 FB50 00 00 00 00
2468 FB54 00 00 00 00
2468 FB58 00 00 00 00
2468 FB5C 00 00 00 00
2468 FB60 00 00 00 00
2468 FB64 00 00 00 00
2468 FB68 00 00 00 00
2468 FB6C 00 00 00 00
2468 FB70 00 00 00 00
2468 FB74 00 00 00 00
2468 FB78 00 00 00 00
2468 FB7C 00 00 00 00
2468 FB80 00 00 00 00
2468 FB84 00 00 00 00
2468 FB88 00 00 00 00
2468 FB8C 00 00 00 00
2468 FB90 00 00 00 00
2468 FB94 00 00 00 00
2468 FB98 00 00 00 00
2468 FB9C 00 00 00 00
2468 FBA0 00 00 00 00
2468 FBA4 00 00 00 00
2468 FBA8 00 00 00 00
2468 FBAC 00 00 00 00
2468 FBB0 00 00 00 00
2468 FBB4 00 00 00 00
2468 FBB8 00 00 00 00
2468 FBBC 00 00 00 00
2468 FBC0 00 00 00 00
2468 FBC4 00 00 00 00
2468 FBC8 00 00 00 00
2468 FBCC 00 00 00 00
2468 FBD0 00 00 00 00
2468 FBD4 00 00 00 00
2468 FBD8 00 00 00 00
2468 FBDC 00 00 00 00
2468 FBE0 00 00 00 00
2468 FBE4 00 00 00 00
2468 FBE8 00 00 00 00
2468 FBEC 00 00 00 00
2468 FBF0 00 00 00 00
2468 FBF4 00 00 00 00
2468 FBF8 00 00 00 00
2468 FBFC 00 00 00 00
2468 FC00 00 00 00 00
2468 FC04 00 00 00 00
2468 FC08 00 00 00 00
2468 FC0C 00 00 00 00
2468 FC10 00 00 00 00
2468 FC14 00 00 00 00
2468 FC18 00 00 00 00
2468 FC1C 00 00 00 00
2468 FC20 00 00 00 00
2468 FC24 00 00 00 00
2468 FC28 00 00 00 00
2468 FC2C 00 00 00 00
2468 FC30 00 00 00 00
2468 FC34 00 00 00 00
2468 FC38 00 00 00 00
2468 FC3C 00 00 00 00
2468 FC40 00 00 00 00
2468 FC44 00 00 00 00
2468 FC48 00 00 00 00
2468 FC4C 00 00 00 00
2468 FC50 00 00 00 00
2468 FC54 00 00 00 00
2468 FC58 00 00 00 00
2468 FC5C 00 00 00 00
2468 FC60 00 00 00 00
2468 FC64 00 00 00 00
2468 FC68 00 00 00 00
2468 FC6C 00 00 00 00
2468 FC70 00 00 00 00
2468 FC74 00 00 00 00
2468 FC78 00 00 00 00
2468 FC7C 00 00 00 00
2468 FC80 00 00 00 00
2468 FC84 00 00 00 00
2468 FC88 00 00 00 00
2468 FC8C 00 00 00 00
2468 FC90 00 00 00 00
2468 FC94 00 00 00 00
2468 FC98 00 00 00 00
2468 FC9C 00 00 00 00
2468 FCA0 00 00 00 00
2468 FCA4 00 00 00 00
2468 FCA8 00 00 00 00
2468 FCAC 00 00 00 00
2468 FCB0 00 00 00 00
2468 FCB4 00 00 00 00
2468 FCB8 00 00 00 00
2468 FCBC 00 00 00 00
2468 FCC0 00 00 00 00
2468 FCC4 00 00 00 00
2468 FCC8 00 00 00 00
2468 FCCC 00 00 00 00
2468 FCD0 00 00 00 00
2468 FCD4 00 00 00 00
2468 FCD8 00 00 00 00
2468 FCDC 00 00 00 00
2468 FCE0 00 00 00 00
2468 FCE4 00 00 00 00
2468 FCE8 00 00 00 00
2468 FCEC 00 00 00 00
2468 FCF0 00 00 00 00
2468 FCF4 00 00 00 00
2468 FCF8 00 00 00 00
2468 FCFC 00 00 00 00
2468 FD00 00 00 00 00
2468 FD04 00 00 00 00
2468 FD08 00 00 00 00
2468 FD0C 00 00 00 00
2468 FD10 00 00 00 00
2468 FD14 00 00 00 00
2468 FD18 00 00 00 00
2468 FD1C 00 00 00 00
2468 FD20 00 00 00 00
2468 FD24 00 00 00 00
2468 FD28 00 00 00 00
2468 FD2C 00 00 00 00
2468 FD30 00 00 00 00
2468 FD34 00 00 00 00
2468 FD38 00 00 00 00
2468 FD3C 00 00 00 00
2468 FD40 00 00 00 00
2468 FD44 00 00 00 00
2468 FD48 00 00 00 00
2468 FD4C 00 00 00 00
2468 FD50 00 00 00 00
2468 FD54 00 00 00 00
2468 FD58 00 00 00 00
2468 FD5C 00 00 00 00
2468 FD60 00 00 00 00
2468 FD64 00 00 00 00
2468 FD68 00 00 00 00
2468 FD6C 00 00 00 00
2468 FD70 00 00 00 00
2468 FD74 00 00 00 00
2468 FD78 00 00 00 00
2468 FD7C 00 00 00 00
2468 FD80 00 00 00 00
2468 FD84 00 00 00 00
2468 FD88 00 00 00 00
2468 FD8C 00 00 00 00
2468 FD90 00 00 00 00
2468 FD94 00 00 00 00
2468 FD98 00 00 00 00
2468 FD9C 00 00 00 00
2468 FDA0 00 00 00 00
2468 FDA4 00 00 00 00
2468 FDA8 00 00 00 00
2468 FDAC 00 00 00 00
2468 FDB0 00 00 00 00
2468 FDB4 00 00 00 00
2468 FDB8 00 00 00 00
2468 FDBC 00 00 00 00
2468 FDC0 00 00 00 00
2468 FDC4 00 00 00 00
2468 FDC8 00 00 00 00
2468 FDCC 00 00 00 00
2468 FDD0 00 00 00 00
2468 FDD4 00 00 00 00
2468 FDD8 00 00 00 00
2468 FDDC 00 00 00 00
2468 FDE0 00 00 00 00
2468 FDE4 00 00 00 00
2468 FDE8 00 00 00 00
2468 FDEC 00 00 00 00
2468 FDF0 00 00 00 00
2468 FDF4 00 00 00 00
2468 FDF8 00 00 00 00
2468 FDFC 00 00 00 00
2469 FE00 ;
2470 FE00 SLACK .EQU (CBIOS_END - BUFPOOL)
2471 FE00 .ECHO "CBIOS buffer space: "
2472 FE00 .ECHO SLACK
2473 FE00 .ECHO " bytes.\n"
2474 FE00 ;
2475 FE00 .ECHO "CBIOS total space used: "
2476 FE00 .ECHO $ - CBIOS_LOC
2477 FE00 .ECHO " bytes.\n"
2478 FE00 ;
2479 FE00 ; PAD OUT AREA RESERVED FOR HBIOS PROXY
2480 FE00 FF FF FF FF .FILL $10000 - $
2480 FE04 FF FF FF FF
2480 FE08 FF FF FF FF
2480 FE0C FF FF FF FF
2480 FE10 FF FF FF FF
2480 FE14 FF FF FF FF
2480 FE18 FF FF FF FF
2480 FE1C FF FF FF FF
2480 FE20 FF FF FF FF
2480 FE24 FF FF FF FF
2480 FE28 FF FF FF FF
2480 FE2C FF FF FF FF
2480 FE30 FF FF FF FF
2480 FE34 FF FF FF FF
2480 FE38 FF FF FF FF
2480 FE3C FF FF FF FF
2480 FE40 FF FF FF FF
2480 FE44 FF FF FF FF
2480 FE48 FF FF FF FF
2480 FE4C FF FF FF FF
2480 FE50 FF FF FF FF
2480 FE54 FF FF FF FF
2480 FE58 FF FF FF FF
2480 FE5C FF FF FF FF
2480 FE60 FF FF FF FF
2480 FE64 FF FF FF FF
2480 FE68 FF FF FF FF
2480 FE6C FF FF FF FF
2480 FE70 FF FF FF FF
2480 FE74 FF FF FF FF
2480 FE78 FF FF FF FF
2480 FE7C FF FF FF FF
2480 FE80 FF FF FF FF
2480 FE84 FF FF FF FF
2480 FE88 FF FF FF FF
2480 FE8C FF FF FF FF
2480 FE90 FF FF FF FF
2480 FE94 FF FF FF FF
2480 FE98 FF FF FF FF
2480 FE9C FF FF FF FF
2480 FEA0 FF FF FF FF
2480 FEA4 FF FF FF FF
2480 FEA8 FF FF FF FF
2480 FEAC FF FF FF FF
2480 FEB0 FF FF FF FF
2480 FEB4 FF FF FF FF
2480 FEB8 FF FF FF FF
2480 FEBC FF FF FF FF
2480 FEC0 FF FF FF FF
2480 FEC4 FF FF FF FF
2480 FEC8 FF FF FF FF
2480 FECC FF FF FF FF
2480 FED0 FF FF FF FF
2480 FED4 FF FF FF FF
2480 FED8 FF FF FF FF
2480 FEDC FF FF FF FF
2480 FEE0 FF FF FF FF
2480 FEE4 FF FF FF FF
2480 FEE8 FF FF FF FF
2480 FEEC FF FF FF FF
2480 FEF0 FF FF FF FF
2480 FEF4 FF FF FF FF
2480 FEF8 FF FF FF FF
2480 FEFC FF FF FF FF
2480 FF00 FF FF FF FF
2480 FF04 FF FF FF FF
2480 FF08 FF FF FF FF
2480 FF0C FF FF FF FF
2480 FF10 FF FF FF FF
2480 FF14 FF FF FF FF
2480 FF18 FF FF FF FF
2480 FF1C FF FF FF FF
2480 FF20 FF FF FF FF
2480 FF24 FF FF FF FF
2480 FF28 FF FF FF FF
2480 FF2C FF FF FF FF
2480 FF30 FF FF FF FF
2480 FF34 FF FF FF FF
2480 FF38 FF FF FF FF
2480 FF3C FF FF FF FF
2480 FF40 FF FF FF FF
2480 FF44 FF FF FF FF
2480 FF48 FF FF FF FF
2480 FF4C FF FF FF FF
2480 FF50 FF FF FF FF
2480 FF54 FF FF FF FF
2480 FF58 FF FF FF FF
2480 FF5C FF FF FF FF
2480 FF60 FF FF FF FF
2480 FF64 FF FF FF FF
2480 FF68 FF FF FF FF
2480 FF6C FF FF FF FF
2480 FF70 FF FF FF FF
2480 FF74 FF FF FF FF
2480 FF78 FF FF FF FF
2480 FF7C FF FF FF FF
2480 FF80 FF FF FF FF
2480 FF84 FF FF FF FF
2480 FF88 FF FF FF FF
2480 FF8C FF FF FF FF
2480 FF90 FF FF FF FF
2480 FF94 FF FF FF FF
2480 FF98 FF FF FF FF
2480 FF9C FF FF FF FF
2480 FFA0 FF FF FF FF
2480 FFA4 FF FF FF FF
2480 FFA8 FF FF FF FF
2480 FFAC FF FF FF FF
2480 FFB0 FF FF FF FF
2480 FFB4 FF FF FF FF
2480 FFB8 FF FF FF FF
2480 FFBC FF FF FF FF
2480 FFC0 FF FF FF FF
2480 FFC4 FF FF FF FF
2480 FFC8 FF FF FF FF
2480 FFCC FF FF FF FF
2480 FFD0 FF FF FF FF
2480 FFD4 FF FF FF FF
2480 FFD8 FF FF FF FF
2480 FFDC FF FF FF FF
2480 FFE0 FF FF FF FF
2480 FFE4 FF FF FF FF
2480 FFE8 FF FF FF FF
2480 FFEC FF FF FF FF
2480 FFF0 FF FF FF FF
2480 FFF4 FF FF FF FF
2480 FFF8 FF FF FF FF
2480 FFFC FF FF FF FF
2481 10000 ;
2482 10000 .END
tasm: Number of errors = 0