mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-07 15:03:13 -06:00
Compare commits
26 Commits
v3.3.0-dev
...
v3.3.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b90e4d932a | ||
|
|
5457a7e7fd | ||
|
|
8f5cc510ee | ||
|
|
0475f5e853 | ||
|
|
5b7dee0689 | ||
|
|
6532f61747 | ||
|
|
4bdae4eccb | ||
|
|
efb9840b86 | ||
|
|
308a11cb32 | ||
|
|
3a7421de33 | ||
|
|
21a58397b6 | ||
|
|
9ae61806dc | ||
|
|
87ac6f07f8 | ||
|
|
1cd5313259 | ||
|
|
04c1ff04ac | ||
|
|
0e1a0afa2c | ||
|
|
5227bb68b5 | ||
|
|
fb68941768 | ||
|
|
8747ec8d02 | ||
|
|
abd939625f | ||
|
|
69716abb25 | ||
|
|
1f526d440a | ||
|
|
84374c86e6 | ||
|
|
45ea46b105 | ||
|
|
1333d6a491 | ||
|
|
b7e865dbf1 |
11
.github/pull_request_template.md
vendored
Normal file
11
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<!--
|
||||
BEFORE YOU CREATE A PULL REQUEST:
|
||||
|
||||
- Please base all pull requests against the dev branch
|
||||
- Include a clear description of your change
|
||||
- Reference related Issue(s) (e.g., "Resolves Issue #123")
|
||||
|
||||
Thank you for contributing to RomWBW! I will review your pull request as soon as possible.
|
||||
|
||||
DELETE EVERYTHING IN THIS COMMENT BLOCK AND REPLACE WITH YOUR COMMENTS
|
||||
-->
|
||||
BIN
Doc/Aztec_C_1.06_User_Manual_Mar84.pdf
Normal file
BIN
Doc/Aztec_C_1.06_User_Manual_Mar84.pdf
Normal file
Binary file not shown.
@@ -7,7 +7,11 @@ Version 3.3
|
||||
- WBW: Support per-drive floppy configuration
|
||||
- WBW: Support for Bill Shen's VGARC
|
||||
- WBW: Support for MG014 Parallel Port module + printer
|
||||
- WBW: Support for Zip Drive on emm interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for EMM Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for PPA Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for SyQuest SparQ Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for ATAPI Disk Drives (not CD-ROMs) on IDE and PPIDE interfaces
|
||||
- R?P: Added new disk images: Aztec C, MS BASIC Compiler, MS Fortran, Games, HiTech-C, Turbo Pascal, SLR Z80ASM
|
||||
|
||||
Version 3.2.1
|
||||
-------------
|
||||
|
||||
11351
Doc/HI-TECH Z80 C Compiler Manual.txt
Normal file
11351
Doc/HI-TECH Z80 C Compiler Manual.txt
Normal file
File diff suppressed because it is too large
Load Diff
4090
Doc/Microsoft_FORTRAN-80_Users_Manual_1977.pdf
Normal file
4090
Doc/Microsoft_FORTRAN-80_Users_Manual_1977.pdf
Normal file
File diff suppressed because one or more lines are too long
@@ -6,8 +6,8 @@
|
||||
*** ***
|
||||
***********************************************************************
|
||||
|
||||
This directory ("Doc") is part of the RomWBW System Software
|
||||
distribution archive. It contains documentation for components of
|
||||
This directory ("Doc") is part of the RomWBW System Software
|
||||
distribution archive. It contains documentation for components of
|
||||
the system.
|
||||
|
||||
ChangeLog.txt
|
||||
@@ -34,9 +34,9 @@ ROM Applications documents.
|
||||
CPM Manual ("CPM Manual.pdf")
|
||||
-----------------------------
|
||||
|
||||
The original DRI CP/M 2.x Operating System Manual. This should be
|
||||
considered the primary reference for system operation. The section
|
||||
on CP/M 2 Alteration can be ignored since this work has already been
|
||||
The original DRI CP/M 2.x Operating System Manual. This should be
|
||||
considered the primary reference for system operation. The section
|
||||
on CP/M 2 Alteration can be ignored since this work has already been
|
||||
completed as part of the RomWBW distribution.
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ Manual for the DDTZ v2.7 debug tool included on the ROM drive.
|
||||
FDisk Manual ("FDisk Manual.pdf")
|
||||
---------------------------------
|
||||
|
||||
The operational manual for John Coffman's hard disk partitioning
|
||||
The operational manual for John Coffman's hard disk partitioning
|
||||
program. This program is included in RomWBW as FDISK80.
|
||||
|
||||
|
||||
@@ -78,9 +78,9 @@ NZCOM operating system operation manual.
|
||||
ZCPR Manual ("ZCPR Manual.pdf")
|
||||
-------------------------------
|
||||
|
||||
ZCPR is the command proccessor portion of Z-System. This is the
|
||||
manual for ZCPR 1.x as included in RomWBW. The installation
|
||||
instructions can be ignored since that work has already been
|
||||
ZCPR is the command proccessor portion of Z-System. This is the
|
||||
manual for ZCPR 1.x as included in RomWBW. The installation
|
||||
instructions can be ignored since that work has already been
|
||||
completed as part of the RomWBW distribution.
|
||||
|
||||
ZCPR D&J Manual ("ZCPR-DJ.doc")
|
||||
@@ -92,9 +92,9 @@ ZCPR D&J User Manual. This manual supplements the ZCPR Manual.
|
||||
ZSDOS Manual ("ZSDOS Manual.pdf")
|
||||
---------------------------------
|
||||
|
||||
ZSDOS is the DOS portion of Z-System. This is the manual for ZSDOS
|
||||
1.x as included in RomWBW. The installation instructions can be
|
||||
ignored since that work has already been completed as part of the
|
||||
ZSDOS is the DOS portion of Z-System. This is the manual for ZSDOS
|
||||
1.x as included in RomWBW. The installation instructions can be
|
||||
ignored since that work has already been completed as part of the
|
||||
RomWBW distribution.
|
||||
|
||||
Microsoft Basic-80 Reference Manual v5.0 (Microsoft Basic-80 Reference Manual v5.0.pdf)
|
||||
@@ -110,7 +110,6 @@ QP/M 2.7 Features and Facilities ("qcp27.pdf")
|
||||
|
||||
Official documentation set for QP/M 2.7 from original QP/M distribution.
|
||||
|
||||
|
||||
SIO+CTC Baud Rate Options (SIO+CTC Baud Rate Options.pdf)
|
||||
---------------------------------------------------------
|
||||
|
||||
@@ -133,4 +132,37 @@ UCSD p-System Users Manual ("UCSD p-System Users Manual.pdf")
|
||||
Official user manual for p-System operating system included with
|
||||
RomWBW.
|
||||
|
||||
--WBW 5:18 PM 3/16/2023
|
||||
|
||||
Z80 Assembler User Manual (z80asm (SLR Systems).pdf)
|
||||
----------------------------------------------------
|
||||
|
||||
Official user manual for the Z80 Macro Assembler by SLR Systems
|
||||
included in the z80asm disk image.
|
||||
|
||||
|
||||
HI-TECH C Compiler User Manual (HI-TECH Z80 C Compiler Manual.txt)
|
||||
------------------------------------------------------------------
|
||||
|
||||
Official user manual for the HI-TECH C Compiler included in the
|
||||
hitechc disk image.
|
||||
|
||||
|
||||
Borland TurboPascal User Manual (Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf)
|
||||
------------------------------------------------------------------------------------
|
||||
|
||||
Official user manual Borland TurboPascal included in the pascal disk image.
|
||||
|
||||
|
||||
Aztec C Compiler User Manual (Aztec_C_1.06_User_Manual_Mar84.pdf)
|
||||
-----------------------------------------------------------------
|
||||
|
||||
Official user manual for the Aztec C Compiler included in the aztecc disk image.
|
||||
|
||||
|
||||
FORTRAN-80 User Manual (Microsoft_FORTRAN-80_Users_Manual_1977.pdf)
|
||||
---------------------------------------------------------------
|
||||
|
||||
Official user manual for Microsoft's FORTRAN-80 compiler included in the fortran
|
||||
disk image.
|
||||
|
||||
--WBW 5:18 PM 6/14/2023
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
49495
Doc/Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf
Normal file
49495
Doc/Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf
Normal file
File diff suppressed because one or more lines are too long
BIN
Doc/z80asm (SLR Systems).pdf
Normal file
BIN
Doc/z80asm (SLR Systems).pdf
Normal file
Binary file not shown.
@@ -3,7 +3,7 @@
|
||||
**RomWBW ReadMe** \
|
||||
Version 3.3 \
|
||||
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
|
||||
23 May 2023
|
||||
20 Jun 2023
|
||||
|
||||
# Overview
|
||||
|
||||
@@ -183,6 +183,10 @@ let me know if I missed you!
|
||||
|
||||
- The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
|
||||
- Rob Prouse has created many of the supplemental disk images including
|
||||
Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft BASIC Compiler,
|
||||
Microsoft Fortran Compiler, and a Games compendium.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
RomWBW ReadMe
|
||||
Wayne Warthen (wwarthen@gmail.com)
|
||||
23 May 2023
|
||||
20 Jun 2023
|
||||
|
||||
|
||||
|
||||
@@ -185,6 +185,10 @@ let me know if I missed you!
|
||||
|
||||
- The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
|
||||
- Rob Prouse has created many of the supplemental disk images
|
||||
including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games compendium.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
|
||||
|
||||
@@ -30,11 +30,11 @@
|
||||
; 2021-12-06 [WBW] Fix inverted ROM/RAM DPB mapping in buffer alloc
|
||||
; 2022-02-28 [WBW] Use HBIOS to swap banks under CP/M 3
|
||||
; Use CPM3 BDOS direct BIOS call to get DRVTBL adr
|
||||
; 2023-06-19 [WBW] Update for revised DIODEVICE API
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
; ToDo:
|
||||
; 1) Do something to prevent assigning slices when device does not support them
|
||||
; 2) ASSIGN C: causes drive map to be reinstalled unnecessarily
|
||||
; 1) ASSIGN C: causes drive map to be reinstalled unnecessarily
|
||||
;_______________________________________________________________________________
|
||||
;
|
||||
;===============================================================================
|
||||
@@ -1405,12 +1405,11 @@ chkdev: ; HBIOS variant
|
||||
; get device/unit info
|
||||
ld b,$17 ; hbios func: diodevice
|
||||
ld c,a ; unit to C
|
||||
rst 08 ; call hbios, D := device, E := unit
|
||||
ld a,d ; device to A
|
||||
rst 08 ; call hbios, C := device attributes
|
||||
;
|
||||
; check slice support
|
||||
cp $30 ; A has device/unit, in hard disk range?
|
||||
jr c,chkdev1 ; if not hard disk, check slice val
|
||||
bit 5,c ; high capacity device?
|
||||
jr z,chkdev1 ; if not high cap, check slice val
|
||||
xor a ; otherwise, signal OK
|
||||
ret
|
||||
;
|
||||
@@ -1920,7 +1919,7 @@ dev08 .db "PPPSD",0
|
||||
dev09 .db "HDSK",0
|
||||
dev10 .db "PPA",0
|
||||
dev11 .db "IMM",0
|
||||
dev12 .equ devunk
|
||||
dev12 .db "SYQ",0
|
||||
dev13 .equ devunk
|
||||
dev14 .equ devunk
|
||||
dev15 .equ devunk
|
||||
@@ -1943,10 +1942,10 @@ stack .equ $ ; stack top
|
||||
; Messages
|
||||
;
|
||||
indent .db " ",0
|
||||
msgban1 .db "ASSIGN v1.5 for RomWBW CP/M ",0
|
||||
msgban1 .db "ASSIGN v1.6 for RomWBW CP/M ",0
|
||||
msg22 .db "2.2",0
|
||||
msg3 .db "3",0
|
||||
msbban2 .db ", 28-Feb-2022",0
|
||||
msbban2 .db ", 16-Jun-2023",0
|
||||
msghb .db " (HBIOS Mode)",0
|
||||
msgub .db " (UBIOS Mode)",0
|
||||
msgban3 .db "Copyright 2021, Wayne Warthen, GNU GPL v3",0
|
||||
|
||||
@@ -2291,8 +2291,8 @@ INIT2:
|
||||
LD C,(HL) ; PUT UNIT NUM IN C
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,C ; GET ATTRIBUTES
|
||||
AND %00111000 ; ISOLATE TYPE BITS
|
||||
CP %00101000 ; TYPE = RAM?
|
||||
AND %10001111 ; ISOLATE TYPE BITS
|
||||
CP %00000101 ; NOT FLOPPY, TYPE = RAM?
|
||||
JR NZ,INIT2X ; IF NOT THEN DONE
|
||||
;
|
||||
; CHECK IF SECOND UNIT IS ROM OR FLASH
|
||||
@@ -2303,10 +2303,10 @@ INIT2:
|
||||
LD C,(HL) ; PUT UNIT NUM IN C
|
||||
RST 08 ; CALL HBIOS
|
||||
LD A,C ; GET ATTRIBUTES
|
||||
AND %00111000 ; ISOLATE TYPE BITS
|
||||
CP %00100000 ; TYPE = ROM?
|
||||
AND %10001111 ; ISOLATE TYPE BITS
|
||||
CP %00000100 ; NOT FLOPPY, TYPE = ROM?
|
||||
JR Z,INIT2A ; IF SO, ADJUST DEF DRIVE
|
||||
CP %00111000 ; TYPE = FLASH?
|
||||
CP %00000111 ; NOT FLOPPY, TYPE = FLASH?
|
||||
JR NZ,INIT2X ; IF NOT THEN DONE
|
||||
;
|
||||
INIT2A:
|
||||
@@ -2904,59 +2904,51 @@ DRV_INIT:
|
||||
LD HL,DRVLST ; INIT HL PTR TO DRIVE LIST
|
||||
;
|
||||
DRV_INIT2:
|
||||
PUSH BC ; SAVE LOOP CNT & UNIT
|
||||
CALL DRV_INIT3 ; CHECK DRIVE
|
||||
POP BC ; RECOVER LOOP CNT & UNIT
|
||||
INC C ; NEXT UNIT
|
||||
DJNZ DRV_INIT2 ; LOOP
|
||||
LD A,D ; TOTAL DEVICE COUNT TO D
|
||||
LD A,D ; TOTAL DEVICE COUNT TO A
|
||||
LD (DRVLSTC),A ; SAVE THE COUNT
|
||||
JR DRV_INIT4 ; CONTINUE
|
||||
;
|
||||
DRV_INIT3:
|
||||
; GET DEVICE ATTRIBUTES
|
||||
PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER)
|
||||
PUSH HL ; SAVE DRIVE LIST PTR
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
|
||||
RST 08 ; CALL HBIOS, UNIT TO C
|
||||
LD A,D ; DEVICE TYPE TO A
|
||||
LD A,C ; DEVICE ATTRIBUTES TO A
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
POP HL ; RESTORE DRIVE LIST PTR
|
||||
POP DE ; RESTORE DE
|
||||
CP DIODEV_IDE ; HARD DISK DEVICE?
|
||||
JR NC,DRV_INIT3A ; IF SO, HANDLE SPECIAL
|
||||
LD (HL),C ; SAVE UNIT NUM IN LIST
|
||||
INC HL ; BUMP PTR
|
||||
INC D ; INC TOTAL DEVICE COUNT
|
||||
RET
|
||||
LD B,A ; ATTRIBUTES TO B
|
||||
;
|
||||
DRV_INIT3A:
|
||||
; CHECK FOR HARD DISK REMOVABLE CARTRIDGE DRIVES
|
||||
CP DIODEV_PPA ; PPA (ZIP DRIVE) IS REMOVABLE
|
||||
JR Z,DRV_INIT3B ; IF SO, SKIP MEDIA CHECK
|
||||
CP DIODEV_IMM ; IMM (ZIP DRIVE) IS REMOVABLE
|
||||
JR Z,DRV_INIT3B ; IF SO, SKIP MEDIA CHECK
|
||||
|
||||
; CHECK FOR ACTIVE AND RETURN IF NOT
|
||||
; IF DEVICE IS NOT REMOVABLE, THEN CHECK TO ENSURE IT IS
|
||||
; ACTUALLY ONLINE. IF NOT, SKIP UNIT ENTIRELY.
|
||||
BIT 6,B ; REMOVABLE?
|
||||
JR NZ,DRV_INIT3A ; IF SO, SKIP MEDIA CHECK
|
||||
PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER)
|
||||
PUSH HL ; SAVE DRIVE LIST PTR
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
|
||||
LD B,BF_DIOMEDIA ; HBIOS FUNC: SENSE MEDIA
|
||||
LD E,1 ; PERFORM MEDIA DISCOVERY
|
||||
RST 08
|
||||
|
||||
RST 08 ; DO IT
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
POP HL ; RESTORE DRIVE LIST PTR
|
||||
POP DE ; RESTORE DE
|
||||
|
||||
RET NZ ; IF NO MEDIA, JUST RETURN
|
||||
|
||||
DRV_INIT3B:
|
||||
; IF ACTIVE...
|
||||
RET NZ ; OFFLINE, SKIP ENTIRE UNIT
|
||||
;
|
||||
DRV_INIT3A:
|
||||
LD (HL),C ; SAVE UNIT NUM IN LIST
|
||||
INC HL ; BUMP PTR
|
||||
INC D ; INC TOTAL DEVICE COUNT
|
||||
BIT 5,B ; HIGH CAPACITY?
|
||||
RET Z ; DONE IF NOT
|
||||
INC E ; INCREMENT HARD DISK COUNT
|
||||
RET ; AND RETURN
|
||||
RET ; DONE
|
||||
;
|
||||
DRV_INIT4: ; SET SLICES PER VOLUME (HDSPV) BASED ON HARD DISK VOLUME COUNT
|
||||
LD A,E ; HARD DISK VOLUME COUNT TO A
|
||||
@@ -2985,7 +2977,8 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE
|
||||
LD C,(HL) ; GET UNIT NUM FROM LIST
|
||||
PUSH BC ; PRESERVE LOOP CONTROL
|
||||
LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO
|
||||
RST 08 ; CALL HBIOS, D := DEVICE TYPE
|
||||
RST 08 ; CALL HBIOS, C := DEVICE ATTRIBUTES
|
||||
LD A,C ; DEVICE ATTRIBUTES TO A
|
||||
POP BC ; GET UNIT INDEX BACK IN C
|
||||
PUSH BC ; RESAVE LOOP CONTROL
|
||||
CALL DRV_INIT7 ; MAKE DRIVE MAP ENTRY(S)
|
||||
@@ -2999,10 +2992,9 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE
|
||||
DRV_INIT7: ; PROCESS UNIT
|
||||
LD E,0 ; INITIALIZE SLICE INDEX
|
||||
LD B,1 ; DEFAULT LOOP COUNTER
|
||||
LD A,D ; DEVICE TYPE TO ACCUM
|
||||
LD D,C ; UNIT NUMBER TO D
|
||||
CP DIODEV_IDE ; HARD DISK DEVICE?
|
||||
JR C,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1
|
||||
BIT 5,A ; HIGH CAPACITY DEVICE?
|
||||
JR Z,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1
|
||||
LD A,(HDSPV) ; GET SLICES PER VOLUME TO ACCUM
|
||||
LD B,A ; MOVE TO B FOR LOOP COUNTER
|
||||
;
|
||||
@@ -3401,7 +3393,7 @@ DEV08 .DB "PPPSD$"
|
||||
DEV09 .DB "HDSK$"
|
||||
DEV10 .DB "PPA$"
|
||||
DEV11 .DB "IMM$"
|
||||
DEV12 .EQU DEVUNK
|
||||
DEV12 .DB "SYQ$"
|
||||
DEV13 .EQU DEVUNK
|
||||
DEV14 .EQU DEVUNK
|
||||
DEV15 .EQU DEVUNK
|
||||
@@ -3413,7 +3405,7 @@ DIRBUF .DW 0 ; DIR BUF POINTER
|
||||
HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP
|
||||
BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT UNIT, LSB=BOOT SLICE
|
||||
HDSPV .DB 2 ; SLICES PER VOLUME FOR HARD DISKS (MUST BE >= 1)
|
||||
DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURINT DRV_INIT
|
||||
DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURING DRV_INIT
|
||||
DRVLSTC .DB 0 ; ENTRY COUNT FOR ACTIVE DRIVE LIST
|
||||
;
|
||||
#IFDEF PLTWBW
|
||||
|
||||
@@ -156,7 +156,9 @@ dinit:
|
||||
ld hl,drvlst ; init hl ptr to drive list
|
||||
;
|
||||
dinit2:
|
||||
push bc ; save loop cnt & unit
|
||||
call dinit3 ; check drive
|
||||
pop bc ; recover loop cnt & unit
|
||||
inc c ; next unit
|
||||
djnz dinit2 ; loop
|
||||
ld a,d ; total device count to d
|
||||
@@ -169,46 +171,35 @@ dinit3:
|
||||
push bc ; save loop control
|
||||
ld b,17h ; hbios func: report device info
|
||||
rst 08 ; call hbios, unit to c
|
||||
ld a,d ; device type to a
|
||||
ld a,c ; device attributes to a
|
||||
pop bc ; restore loop control
|
||||
pop hl ; restore drive list ptr
|
||||
pop de ; restore de
|
||||
cp 30h ; hard disk device?
|
||||
jr nc,dinit3a ; if so, handle special
|
||||
ld (hl),c ; save unit num in list
|
||||
inc hl ; bump ptr
|
||||
inc d ; inc total device count
|
||||
ret
|
||||
ld b,a ; attributes to b
|
||||
;
|
||||
dinit3a:
|
||||
; check for hard disk removable cartridge drives
|
||||
cp 0A0h ; ppa (zip drive) is removable
|
||||
jr z,dinit3b ; if so, skip media check
|
||||
cp 0B0h ; imm (zip drive) is removable
|
||||
jr z,dinit3b ; if so, skip media check
|
||||
|
||||
; check for active and return if not
|
||||
; if device is not removable, then check to ensure it is
|
||||
; actually online. if not, skip unit entirely.
|
||||
bit 6,b ; removable?
|
||||
jr nz,dinit3a ; if so, skip media check
|
||||
push de ; save de (hard disk volume counter)
|
||||
push hl ; save drive list ptr
|
||||
push bc ; save loop control
|
||||
|
||||
ld b,18h ; hbios func: sense media
|
||||
ld e,1 ; perform media discovery
|
||||
rst 08
|
||||
|
||||
rst 08 ; do it
|
||||
pop bc ; restore loop control
|
||||
pop hl ; restore drive list ptr
|
||||
pop de ; restore de
|
||||
|
||||
ret nz ; if no media, just return
|
||||
|
||||
dinit3b:
|
||||
; if active...
|
||||
ret nz ; offline, skip entire unit
|
||||
;
|
||||
dinit3a:
|
||||
ld (hl),c ; save unit num in list
|
||||
inc hl ; bump ptr
|
||||
inc d ; inc total device count
|
||||
bit 5,b ; high capacity?
|
||||
ret z ; done if not
|
||||
inc e ; increment hard disk count
|
||||
ret ; and return
|
||||
ret ; done
|
||||
|
||||
dinit4: ; set slices per volume (hdspv) based on hard disk volume count
|
||||
ld a,e ; hard disk volume count to a
|
||||
@@ -245,7 +236,8 @@ dinit6:
|
||||
push bc ; preserve loop control
|
||||
push hl ; preserve dph pointer
|
||||
ld b,17h ; hbios func: report device info
|
||||
rst 08 ; call hbios, d := device type
|
||||
rst 08 ; call hbios, a := device attributes
|
||||
ld a,c ; device attributes to a
|
||||
pop hl ; restore dph pointer
|
||||
pop bc ; get unit index back in c
|
||||
push bc ; resave loop control
|
||||
@@ -260,10 +252,9 @@ dinit6:
|
||||
dinit7: ; process a unit (all slices)
|
||||
ld e,0 ; initialize slice index
|
||||
ld b,1 ; default loop counter
|
||||
ld a,d ; device type to accum
|
||||
ld d,c ; unit number to d
|
||||
cp 030h ; hard disk device?
|
||||
jr c,dinit8 ; nope, leave loop count at 1
|
||||
bit 5,a ; high capacity device?
|
||||
jr z,dinit8 ; nope, leave loop count at 1
|
||||
ld a,(hdspv) ; get slices per volume to accum
|
||||
ld b,a ; move to b for loop counter
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ found:
|
||||
| INTTEST | No | Yes | Yes |
|
||||
| FAT | No | Yes | Yes |
|
||||
| TUNE | No | Yes | Yes |
|
||||
| WDATE | No | Yes | Yes |
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
@@ -1128,3 +1129,85 @@ can be used to reduce your processor speed.
|
||||
|
||||
VGMPLAY is still under development. The source code is provided in the
|
||||
RomWBW distribution.
|
||||
|
||||
`\clearpage`{=latex}
|
||||
|
||||
# WDATE
|
||||
|
||||
`wdate` is a utility for CP/M systems that have Wayne Warthen's
|
||||
ROMWBW firmware. It reads or sets the real-time clock, using function
|
||||
calls in the BIOS. It should work on any RTC device that is supported by
|
||||
ROMWBW, including the internal interrupt-driven timer that is is available
|
||||
on some systems.
|
||||
|
||||
`wdate` differs from the `rtc.com` utility that is provided with the
|
||||
ROMWBW version of CP/M in that it only gets and sets the date/time.
|
||||
`rtc.com` can also manipulate the nonvolatile RAM in certain clock
|
||||
devices, and modify the charge controller. However, `wdate` is (I would
|
||||
argue) easier to use, as it takes its input from the command line, which
|
||||
can be edited, and it's less fussy about the format. It doesn't require
|
||||
the date to be set if you only want to change the time, for example.
|
||||
In addition, `wdate` has at least some error checking.
|
||||
|
||||
`wdate` displays the day-of-week and month as English text, not
|
||||
numbers. It calculates the day-of-week from the year, month, and day.
|
||||
RTC chips usually store a day-of-week value, but it's useless in this
|
||||
application for two reasons: first, the BIOS does not expose it. Second,
|
||||
there is no universally-accepted way to interpret it (which day does
|
||||
the week start on? Is '0' a valid day of the week?)
|
||||
|
||||
## Syntax
|
||||
|
||||
| `WDATE`
|
||||
| `WDATE ` *`<hr> <min>`*
|
||||
| `WDATE ` *`<hr> <min> <sec>`*
|
||||
| `WDATE ` *`<year> <month> <day> <hr> <min> <sec>`*
|
||||
|
||||
## Usage
|
||||
|
||||
A> wdate
|
||||
Saturday 27 May 13:14:39 2023
|
||||
|
||||
With no arguments, displays the current date and time.
|
||||
|
||||
A> wdate hr min
|
||||
|
||||
With two arguments, sets the time in hours and minutes, without changing date
|
||||
or seconds
|
||||
|
||||
A> wdate hr min sec
|
||||
|
||||
With three arguments, sets the time in hours, minutes, and seconds, without
|
||||
changing date
|
||||
|
||||
A> wdate year month day hr min sec
|
||||
|
||||
With six arguments, sets date and time. All numbers are one or two digits. The
|
||||
two-digit year starts at 2000.
|
||||
|
||||
A> wdate /?
|
||||
|
||||
Show a summary of the command-line usage.
|
||||
|
||||
## Notes
|
||||
|
||||
I've tested this utility with the DS1302 clock board designed by Ed
|
||||
Brindly, and on the interrupt-driven timer built into my Z180 board.
|
||||
However, it does not interact with hardware, only BIOS; I would expect
|
||||
it to work with other hardware.
|
||||
|
||||
wdate checks for the non-existence of ROMWBW, and also for failing
|
||||
operations on the RTC. It will display the terse "No RTC" message in
|
||||
both cases.
|
||||
|
||||
The ROMWBW functions that manipulate the date and time operate on BCD
|
||||
numbers, as RTC chips themselves usually do. wdate works in decimal, so
|
||||
that it can check that the user input makes sense. A substantial part of
|
||||
the program's code is taken up by number format conversion and range
|
||||
checking.
|
||||
|
||||
## Etymology
|
||||
|
||||
The `WDATE` application was written and contributed by Kevin Boone.
|
||||
The source code is available on GitHub at
|
||||
[https://github.com/kevinboone/wdate-cpm/blob/main/README.md](https://github.com/kevinboone/wdate-cpm/blob/main/README.md).
|
||||
|
||||
@@ -172,6 +172,11 @@ please let me know if I missed you!
|
||||
|
||||
* The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
|
||||
* Rob Prouse has created many of the supplemental disk images
|
||||
including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games
|
||||
compendium.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
@@ -757,28 +757,36 @@ of memory because it avoids a double copy.
|
||||
Reports device information about the specified Disk Unit (C). The
|
||||
Status (A) is a standard HBIOS result code.
|
||||
|
||||
Bit 7 of the Device Attribute (C) value returned indicates whether the
|
||||
device is a floppy disk. If it is a floppy disk, the Device Attribute
|
||||
(C) value is encoded as follows:
|
||||
The Device Attribute (C) value returned indicates various
|
||||
feature indicators related to the device being referenced
|
||||
by the specified Disk Unit (C). The high 3 bits apply to
|
||||
all devices. The definition of the low 5 bits depends on
|
||||
whether the device is a Floppy (indicated by bit 5).
|
||||
|
||||
The common bits are:
|
||||
|
||||
| **Bits** | **Definition** |
|
||||
|---------:|--------------------------------------------------|
|
||||
| 7 | = 1 (Floppy Disk) |
|
||||
| 6-5 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other |
|
||||
| 4 | Sides: 0=SS, 1=DS |
|
||||
| 3-2 | Density: 0=SD, 1=DD, 2=HD, 3=ED |
|
||||
| 1-0 | Reserved |
|
||||
|
||||
If the Disk Unit (C) specified is a not floppy disk, then the Device
|
||||
Attribute (C) encoding is as follows:
|
||||
|
||||
| **Bits** | **Definition** |
|
||||
|---------:|--------------------------------------------------|
|
||||
| 7 | = 0 (not Floppy Disk) |
|
||||
| 7 | Floppy |
|
||||
| 6 | Removable |
|
||||
| 5-3 | Type: 0=Hard, 1=CF, 2=SD, 3=USB, |
|
||||
| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH |
|
||||
| 2-0 | Reserved |
|
||||
| 5 | High Capacity (>8 MB) |
|
||||
|
||||
The Floppy specific bits are:
|
||||
|
||||
| **Bits** | **Definition** |
|
||||
|---------:|--------------------------------------------------|
|
||||
| 4-3 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other |
|
||||
| 2 | Sides: 0=SS, 1=DS |
|
||||
| 1-0 | Density: 0=SD, 1=DD, 2=HD, 3=ED |
|
||||
|
||||
The non-Floppy specific bits are:
|
||||
|
||||
| **Bits** | **Definition** |
|
||||
|---------:|--------------------------------------------------|
|
||||
| 4 | LBA Capable |
|
||||
| 3-0 | Media Type: 0=Hard Disk, 1=CF, 2=SD, 3=USB, |
|
||||
| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH, 8=CD-ROM, |
|
||||
| | 9=Cartridge |
|
||||
|
||||
Device Type (D) indicates the specific hardware driver that handles the
|
||||
specified Disk Unit (C). Values are listed at the start of this
|
||||
|
||||
@@ -2213,18 +2213,23 @@ file which is bootable.
|
||||
output will be garbled if no such terminal or emulator
|
||||
is used for console output.
|
||||
|
||||
* There is no straightforward mechanism to move files in
|
||||
* There is no built-in mechanism to move files in
|
||||
and out of p-System. However, the .vol files in Source/pSys
|
||||
can be read and modified by CiderPress. CiderPress is able
|
||||
to add and remove individual files.
|
||||
|
||||
Andrew Davidson has created a Python script that can extract p-System
|
||||
volumes from an existing disk image file. The script is also capable
|
||||
of inserting a modified volume back into the disk image file.
|
||||
This tool is available at
|
||||
<https://github.com/robosnacks/psysimg>.
|
||||
|
||||
## FreeRTOS
|
||||
|
||||
Phillip Stevens has ported FreeRTOS to run under RomWBW. FreeRTOS is
|
||||
not provided in the RomWBW distribution. FreeRTOS is available under
|
||||
the
|
||||
[MIT licence](https://www.freertos.org/a00114.html) and further general
|
||||
information is available at
|
||||
the [MIT licence](https://www.freertos.org/a00114.html)
|
||||
and further general information is available at
|
||||
[FreeRTOS](https://www.freertos.org/RTOS.html).
|
||||
|
||||
You can also contact Phillip for detailed information on the Z180
|
||||
@@ -3152,6 +3157,46 @@ directed to complete a partial flash using the /P command line switch.
|
||||
|
||||
`E>FLASH WRITE ROM.UPD /P`
|
||||
|
||||
# Related Projects
|
||||
|
||||
Outside of the hardware platforms adapted to RomWBW, there are a variety
|
||||
of software projects that either target RomWBW specifically or provide
|
||||
a RomWBW-specific variation.
|
||||
|
||||
## Z88DK
|
||||
|
||||
Z88DK is a software powerful development kit for Z80 computers
|
||||
supporting both C and assembly language. This kit now provides
|
||||
specific library support for RomWBW HBIOS. The Z88DK project is
|
||||
hosted at <https://github.com/z88dk/z88dk>.
|
||||
|
||||
## Paleo Editor
|
||||
|
||||
Steve Garcia has created a Windows-hosted IDE that is tailored to
|
||||
development of RomWBW. The project can be found at
|
||||
<https://github.com/alloidian/PaleoEditor>.
|
||||
|
||||
## p-System Volume Management Script
|
||||
|
||||
Andrew Davidson has created a Python script to automate the insertion
|
||||
and deletion of volumes within the p-System disk image. These scripts
|
||||
are hosted at <https://github.com/robosnacks/psysimg>.
|
||||
|
||||
## Z80 fig-FORTH
|
||||
|
||||
Dimitri Theulings' implementation of fig-FORTH for the Z80 has a
|
||||
RomWBW-specific variant. This fig-FORTH is built into the RomWBW
|
||||
ROM. However, the project itself is hosted at
|
||||
<https://github.com/dimitrit/figforth>.
|
||||
|
||||
## RomWBW Date/Time Utility
|
||||
|
||||
Kevin Boone has created a generic application that will display or
|
||||
set the date/time of an RTC on RomWBW. The application runs on all of
|
||||
the CP/M OS variants. This tool (`WDATE`) is included on the RomWBW
|
||||
OS disk images. The project is hosted at
|
||||
<https://github.com/kevinboone/wdate-cpm>.
|
||||
|
||||
# Acknowledgments
|
||||
|
||||
I want to acknowledge that a great deal of the code and inspiration
|
||||
@@ -3217,6 +3262,11 @@ please let me know if I missed you!
|
||||
|
||||
* The RomWBW Disk Catalog document was produced by Mykl Orders.
|
||||
|
||||
* Rob Prouse has created many of the supplemental disk images
|
||||
including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games
|
||||
compendium.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
@@ -3901,6 +3951,7 @@ may be discovered by RomWBW in your system.
|
||||
| GDC | Video | uPD7220 Video Display Controller |
|
||||
| HDSK | Disk | SIMH Simulator Hard Disk |
|
||||
| IDE | Disk | IDE/ATA Hard Disk Interface |
|
||||
| IMM | Disk | IMM Zip Drive on PPI |
|
||||
| INTRTC | RTC | Interrupt-based Real Time Clock |
|
||||
| KBD | Kbd | 8242 PS/2 Keyboard Controller |
|
||||
| KIO | System | Zilog Serial/ Parallel Counter/Timer |
|
||||
@@ -3910,6 +3961,7 @@ may be discovered by RomWBW in your system.
|
||||
| I2C | System | I2C Interface |
|
||||
| PIO | Char | Zilog Parallel Interface Controller |
|
||||
| PPIDE | Disk | 8255 IDE/ATA Hard Disk Interface |
|
||||
| PPA | Disk | PPA Zip Drive on PPI |
|
||||
| PPK | Kbd | Matrix Keyboard |
|
||||
| PPPSD | Disk | ParPortProp SD Card Interface |
|
||||
| PPPCON | Serial | ParPortProp Serial Console Interface |
|
||||
@@ -3922,6 +3974,7 @@ may be discovered by RomWBW in your system.
|
||||
| SIO | Char | Zilog Serial Port Interface |
|
||||
| SN76489 | Sound | SN76489 Programmable Sound Generator |
|
||||
| SPK | Sound | Bit-bang Speaker |
|
||||
| SYQ | Disk | Iomega SparQ Drive on PPI |
|
||||
| TMS | Video | TMS9918/38/58 Video Display Controller |
|
||||
| UART | Char | 16C550 Family Serial Interface |
|
||||
| USB-FIFO | Char | FT232H-based ECB USB FIFO |
|
||||
|
||||
@@ -34,8 +34,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
|
||||
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
|
||||
;
|
||||
FPLED_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .SET $A0 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .SET $A0 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
;
|
||||
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
|
||||
;
|
||||
|
||||
@@ -35,7 +35,9 @@ Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3)
|
||||
Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3)
|
||||
;
|
||||
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .SET $A0 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .SET $A0 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
;
|
||||
LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED)
|
||||
;
|
||||
|
||||
@@ -256,6 +256,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -320,17 +320,24 @@ LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR
|
||||
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2)
|
||||
PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014]
|
||||
PPAMODE .EQU PPAMODE_SPP ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014]
|
||||
PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA
|
||||
PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2)
|
||||
IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMMMODE .EQU IMMMODE_SPP ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2)
|
||||
SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
SYQMODE .EQU IMMMODE_SPP ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014]
|
||||
SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
|
||||
@@ -255,6 +255,13 @@ IMMMODE .EQU IMMMODE_SPP ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2)
|
||||
SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
SYQMODE .EQU IMMMODE_SPP ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014]
|
||||
SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
|
||||
@@ -258,6 +258,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
|
||||
@@ -251,6 +251,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
|
||||
@@ -260,7 +260,7 @@ LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
|
||||
LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014]
|
||||
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
|
||||
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR
|
||||
LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR
|
||||
LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR
|
||||
;
|
||||
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
@@ -277,6 +277,13 @@ IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2)
|
||||
SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014]
|
||||
SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -264,7 +264,7 @@ LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
|
||||
LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014]
|
||||
LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2)
|
||||
LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR
|
||||
LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR
|
||||
LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR
|
||||
;
|
||||
PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
@@ -281,6 +281,13 @@ IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2)
|
||||
SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014]
|
||||
SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -275,6 +275,13 @@ IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2)
|
||||
SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014]
|
||||
SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -240,6 +240,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
|
||||
@@ -239,6 +239,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
|
||||
@@ -67,7 +67,7 @@ SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES
|
||||
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ]
|
||||
;
|
||||
FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPLED_IO .EQU $0D ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS
|
||||
FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS
|
||||
FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES
|
||||
@@ -271,6 +271,13 @@ IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014]
|
||||
IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2)
|
||||
SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
|
||||
SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014]
|
||||
SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -210,6 +210,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -181,6 +181,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -192,6 +192,8 @@ PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM)
|
||||
;
|
||||
IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM)
|
||||
;
|
||||
SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM)
|
||||
;
|
||||
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
|
||||
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)
|
||||
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP
|
||||
|
||||
@@ -231,12 +231,12 @@ FDMM_8 .DB FDM111, $FF
|
||||
; FDT_ VALUES DEFINED IN STD.ASM
|
||||
;
|
||||
FD_DEVATTR:
|
||||
.DB %11100000 ; DRIVE TYPE NONE
|
||||
.DB %11010100 ; DRIVE TYPE 3.5 DD
|
||||
.DB %11011000 ; DRIVE TYPE 3.5 HD
|
||||
.DB %10110100 ; DRIVE TYPE 5.25 DD
|
||||
.DB %10111000 ; DRIVE TYPE 5.25 HD
|
||||
.DB %10010100 ; DRIVE TYPE 8
|
||||
.DB %11000000 ; DRIVE TYPE NONE
|
||||
.DB %11010101 ; DRIVE TYPE 3.5 DD
|
||||
.DB %11010110 ; DRIVE TYPE 3.5 HD
|
||||
.DB %11001101 ; DRIVE TYPE 5.25 DD
|
||||
.DB %11001110 ; DRIVE TYPE 5.25 HD
|
||||
.DB %11000101 ; DRIVE TYPE 8
|
||||
;
|
||||
; FDC COMMANDS
|
||||
;
|
||||
|
||||
@@ -3245,6 +3245,9 @@ HB_INITTBL:
|
||||
#IF (IMMENABLE)
|
||||
.DW IMM_INIT
|
||||
#ENDIF
|
||||
#IF (SYQENABLE)
|
||||
.DW SYQ_INIT
|
||||
#ENDIF
|
||||
#IF (PRPENABLE)
|
||||
.DW PRP_INIT
|
||||
#ENDIF
|
||||
@@ -6372,6 +6375,15 @@ SIZ_IMM .EQU $ - ORG_IMM
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (SYQENABLE)
|
||||
ORG_SYQ .EQU $
|
||||
#INCLUDE "syq.asm"
|
||||
SIZ_SYQ .EQU $ - ORG_SYQ
|
||||
.ECHO "SYQ occupies "
|
||||
.ECHO SIZ_SYQ
|
||||
.ECHO " bytes.\n"
|
||||
#ENDIF
|
||||
;
|
||||
#IF (TERMENABLE)
|
||||
ORG_TERM .EQU $
|
||||
#INCLUDE "term.asm"
|
||||
@@ -6732,7 +6744,7 @@ PS_DISK:
|
||||
;
|
||||
; DEVICE COLUMN
|
||||
LD B,BF_DIODEVICE ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C
|
||||
RST 08 ; DE:=DEVTYP/NUM, H:=DISK ATTRIBUTES
|
||||
RST 08 ; DE:=DEVTYP/NUM, C:=DISK ATTRIBUTES
|
||||
PUSH BC ; SAVE ATTRIBUTES
|
||||
LD HL,PS_DDMD ; POINT TO DISK DEVICE TYPE NAME TABLE
|
||||
CALL PS_PRTDEV ; PRINT DISK DEVICE NMEMONIC PADDED TO FIELD WIDTH
|
||||
@@ -6756,7 +6768,7 @@ PS_PRTDT:
|
||||
|
||||
LD C,E
|
||||
LD DE,PS_DTHARD
|
||||
LD A,00111000B
|
||||
LD A,00001111B
|
||||
CALL PRTIDXMSK
|
||||
CALL PS_PAD18 ; PAD TO 18 SPACES
|
||||
RET
|
||||
@@ -6768,10 +6780,7 @@ PS_PRTDC:
|
||||
LD A,E ; ATTRIBUTE TO ACCUM
|
||||
BIT 7,A ; TEST FOR FLOPPY
|
||||
JR NZ,PS_PRTDC2 ; HANDLE FLOPPY
|
||||
RRCA ; ISOLATE TYPE BITS
|
||||
RRCA
|
||||
RRCA
|
||||
AND $07
|
||||
AND $0F ; ISOLATE TYPE BITS
|
||||
CP 4 ; ROM DISK?
|
||||
JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB
|
||||
CP 5 ; RAM DISK?
|
||||
@@ -6809,15 +6818,15 @@ PS_PRTDC1:
|
||||
PS_PRTDC2:
|
||||
LD C,E ; ATTRIBUTE TO C FOR SAFE KEEPING
|
||||
;
|
||||
LD A,01100000B ; DISPLAY FORM FACTOR
|
||||
LD A,%00011000 ; DISPLAY FORM FACTOR
|
||||
LD DE,PS_FLP_FSTR ; WHICH IS DEFINED IN
|
||||
CALL PRTIDXMSK ; BITS 5 AND 6.
|
||||
;
|
||||
LD A,00010000B ; DISPLAY SIDES
|
||||
LD A,%00000100 ; DISPLAY SIDES
|
||||
LD DE,PS_FLP_SSTR ; WHICH IS DEFINED
|
||||
CALL PRTIDXMSK ; IN BIT 4
|
||||
;
|
||||
LD A,00001100B ; DISPLAY DENSITY
|
||||
LD A,%00000011 ; DISPLAY DENSITY
|
||||
LD DE,PS_FLP_DSTR ; WHICH IS DEFINED IN
|
||||
CALL PRTIDXMSK ; BITS 2 AND 3.
|
||||
;
|
||||
@@ -7158,6 +7167,7 @@ PS_DDPPPSD .TEXT "PPPSD$"
|
||||
PS_DDHDSK .TEXT "HDSK$"
|
||||
PS_DDPPA .TEXT "PPA$"
|
||||
PS_DDIMM .TEXT "IMM$"
|
||||
PS_DDSYQ .TEXT "SYQ$"
|
||||
;
|
||||
; DISK TYPE STRINGS
|
||||
;
|
||||
@@ -7170,6 +7180,8 @@ PS_DTROM .TEXT "ROM Disk$"
|
||||
PS_DTRAM .TEXT "RAM Disk$"
|
||||
PS_DTRF .TEXT "RAM Floppy$"
|
||||
PS_DTFSH .TEXT "Flash Drive$"
|
||||
PS_DTCD .TEXT "CD-ROM$"
|
||||
PS_DTCRT .TEXT "Cartridge$"
|
||||
PS_DTOTHER .TEXT "???$"
|
||||
;
|
||||
; FLOPPY ATTRIBUTE STRINGS
|
||||
@@ -7570,6 +7582,52 @@ HB_HASFP .DB 0 ; NON-ZERO MEANS FP EXISTS
|
||||
;
|
||||
HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER
|
||||
;
|
||||
;
|
||||
;
|
||||
#IFDEF MG014_MAP
|
||||
;
|
||||
.FILL 32 - ($ & (32 - 1)) ; ALIGN TO 32 BYTE BOUNDARY
|
||||
|
||||
MG014_STATMAPLO:
|
||||
; LOWER NIBBLE
|
||||
.DB $08 ; 00
|
||||
.DB $0C ; 01
|
||||
.DB $00 ; 02
|
||||
.DB $04 ; 03
|
||||
.DB $0A ; 04
|
||||
.DB $0E ; 05
|
||||
.DB $02 ; 06
|
||||
.DB $06 ; 07
|
||||
.DB $09 ; 08
|
||||
.DB $0D ; 09
|
||||
.DB $01 ; 0A
|
||||
.DB $05 ; 0B
|
||||
.DB $0B ; 0C
|
||||
.DB $0F ; 0D
|
||||
.DB $03 ; 0E
|
||||
.DB $07 ; 0F
|
||||
;
|
||||
MG014_STATMAPHI:
|
||||
; UPPER NIBBLE
|
||||
.DB $80 ; 00
|
||||
.DB $C0 ; 01
|
||||
.DB $00 ; 02
|
||||
.DB $40 ; 03
|
||||
.DB $A0 ; 04
|
||||
.DB $E0 ; 05
|
||||
.DB $20 ; 06
|
||||
.DB $60 ; 07
|
||||
.DB $90 ; 08
|
||||
.DB $D0 ; 09
|
||||
.DB $10 ; 0A
|
||||
.DB $50 ; 0B
|
||||
.DB $B0 ; 0C
|
||||
.DB $F0 ; 0D
|
||||
.DB $30 ; 0E
|
||||
.DB $70 ; 0F
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
HB_END .EQU $
|
||||
;
|
||||
SLACK .EQU BNKTOP - $
|
||||
|
||||
@@ -323,6 +323,7 @@ DIODEV_PPPSD .EQU $80
|
||||
DIODEV_HDSK .EQU $90
|
||||
DIODEV_PPA .EQU $A0
|
||||
DIODEV_IMM .EQU $B0
|
||||
DIODEV_SYQ .EQU $C0
|
||||
;
|
||||
; RTC DEVICE IDS
|
||||
;
|
||||
|
||||
@@ -166,7 +166,7 @@ HDSK_GEOM:
|
||||
HDSK_DEVICE:
|
||||
LD D,DIODEV_HDSK ; D := DEVICE TYPE
|
||||
LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK
|
||||
LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK
|
||||
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
||||
LD L,HDSK_IO ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,11 +9,14 @@
|
||||
; INTENDED TO CO-EXIST WITH LPT DRIVER.
|
||||
;
|
||||
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS.
|
||||
; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX).
|
||||
; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX).
|
||||
; - https://github.com/EtchedPixels/FUZIX
|
||||
; - https://github.com/torvalds/linux
|
||||
;
|
||||
; 5/23/2023 WBW - INITIAL RELEASE
|
||||
; 5/26/2023 WBW - CLEAN UP, LED ACTIVITY
|
||||
; 5/27/2023 WBW - ADDED SPP MODE
|
||||
; 05/23/2023 WBW - INITIAL RELEASE
|
||||
; 05/26/2023 WBW - CLEAN UP, LED ACTIVITY
|
||||
; 05/27/2023 WBW - ADDED SPP MODE
|
||||
; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE
|
||||
;
|
||||
;=============================================================================
|
||||
;
|
||||
@@ -71,22 +74,18 @@
|
||||
;
|
||||
; TODO:
|
||||
;
|
||||
; - OPTIMIZE READ/WRITE LOOPS
|
||||
;
|
||||
; NOTES:
|
||||
;
|
||||
; - THIS DRIVER IS FOR THE ZIP DRIVE IMM INTERFACE. IT WILL SIMPLY
|
||||
; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE OLDER PPA INTERFACE.
|
||||
; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP
|
||||
; DRIVE IS IMM OR PPA. SIGH.
|
||||
; DRIVE IS PPA OR IMM. SIGH.
|
||||
;
|
||||
; - THERE ARE SOME HARD CODED TIMEOUT LOOPS IN THE CODE. THEY ARE
|
||||
; WORKING OK ON A 7 MHZ Z80. THEY ARE LIKELY TO NEED TWEAKING ON
|
||||
; FASTER CPUS.
|
||||
;
|
||||
; - THIS DRIVER OPERATES PURELY IN NIBBLE MODE. I SUSPECT IT IS
|
||||
; POSSIBLE TO USE FULL BYTE MODE (PS2 STYLE), BUT I HAVE NOT
|
||||
; ATTEMPTED IT.
|
||||
; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255
|
||||
; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN
|
||||
; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND
|
||||
; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE
|
||||
; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT.
|
||||
;
|
||||
; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE
|
||||
; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN
|
||||
@@ -130,6 +129,17 @@ IMM_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE)
|
||||
IMM_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
|
||||
IMM_LBA .EQU 8 ; OFFSET OF LBA (DWORD)
|
||||
;
|
||||
; MACROS
|
||||
;
|
||||
#DEFINE IMM_WCTL(VAL) LD A,VAL \ CALL IMM_WRITECTRL
|
||||
#DEFINE IMM_WDATA(VAL) LD A,VAL \ CALL IMM_WRITEDATA
|
||||
;
|
||||
; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE
|
||||
;
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
#DEFINE MG014_MAP
|
||||
#ENDIF
|
||||
;
|
||||
;=============================================================================
|
||||
; INITIALIZATION ENTRY POINT
|
||||
;=============================================================================
|
||||
@@ -184,8 +194,8 @@ IMM_INIT4:
|
||||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
|
||||
;
|
||||
CALL IMM_RESET ; RESET/INIT THE INTERFACE
|
||||
#IF (IMMTRACE == 0)
|
||||
CALL IMM_PRTSTAT
|
||||
#IF (IMMTRACE <= 1)
|
||||
CALL NZ,IMM_PRTSTAT
|
||||
#ENDIF
|
||||
JR NZ,IMM_INIT6
|
||||
;
|
||||
@@ -219,6 +229,11 @@ IMM_INIT6:
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
IMM_DETECT:
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nDETECT:$")
|
||||
#ENDIF
|
||||
;
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
; INITIALIZE 8255
|
||||
LD A,(IY+IMM_IOBASE) ; BASE PORT
|
||||
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT
|
||||
@@ -226,29 +241,53 @@ IMM_DETECT:
|
||||
LD A,$82 ; CONFIG A OUT, B IN, C OUT
|
||||
OUT (C),A ; DO IT
|
||||
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE
|
||||
#ENDIF
|
||||
;
|
||||
; WE USE THIS SEQUENCE TO DETECT AN ACTUAL IMM DEVICE ON THE
|
||||
; PARALLEL PORT. THE VALUES RECORDED IN THE FINAL CALL TO
|
||||
; IMM_DISCONNECT ARE USED TO CONFIRM DEVICE PRESENCE.
|
||||
; NO ACTUAL SCSI COMMANDS ARE USED.
|
||||
; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND
|
||||
; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE
|
||||
; YET. THIS IS DONE BLIND ASSUMING IT IS THERE.
|
||||
CALL IMM_DISCONNECT
|
||||
CALL IMM_CONNECT
|
||||
CALL IMM_RESETPULSE ; ISSUE A SCSI BUS RESET
|
||||
LD DE,62 ; WAIT A BIT
|
||||
CALL VDELAY
|
||||
;
|
||||
; USE AN ABBREVIATED VERSION OF SELECT PROCESSING TO
|
||||
; CHECK IF DEVICE EXISTS.
|
||||
IMM_WCTL($0C)
|
||||
CALL IMM_READSTATUS
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
; READY FOR SELECT?
|
||||
AND $08
|
||||
CP $00
|
||||
JR NZ,IMM_DETECT1
|
||||
;
|
||||
IMM_WCTL($04)
|
||||
LD A,$80 | (1 << IMM_TGT)
|
||||
CALL IMM_WRITEDATA
|
||||
IMM_WCTL($0C)
|
||||
IMM_WCTL($0D)
|
||||
CALL DELAY
|
||||
CALL IMM_READSTATUS
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
; DID SELECT SUCCEED?
|
||||
AND $08
|
||||
CP $08
|
||||
;
|
||||
IMM_DETECT1:
|
||||
PUSH AF
|
||||
CALL IMM_DISCONNECT
|
||||
;
|
||||
; THE IMM_SN VALUES ARE RECORDED IN THE CPP ROUTINE USED BY
|
||||
; IMM_CONNECT/DISCONNECT.
|
||||
; EXPECTING S1=$B8, S2=$18, S3=$38
|
||||
LD A,(IMM_S1)
|
||||
CP $B8
|
||||
RET NZ
|
||||
LD A,(IMM_S2)
|
||||
CP $18
|
||||
RET NZ
|
||||
LD A,(IMM_S3)
|
||||
CP $38
|
||||
RET NZ
|
||||
;
|
||||
XOR A
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
;=============================================================================
|
||||
@@ -289,7 +328,7 @@ IMM_READ:
|
||||
;
|
||||
;
|
||||
IMM_WRITE:
|
||||
CALL HB_DSKREAD ; HOOK DISK WRITE CONTROLLER
|
||||
CALL HB_DSKWRITE ; HOOK DISK WRITE CONTROLLER
|
||||
LD A,SCSI_CMD_WRITE ; SETUP SCSI WRITE
|
||||
LD (IMM_CMD_RW),A ; AND SAVE IT IN SCSI CMD
|
||||
JP IMM_IO ; DO THE I/O
|
||||
@@ -297,9 +336,18 @@ IMM_WRITE:
|
||||
;
|
||||
;
|
||||
IMM_IO:
|
||||
LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
PUSH HL
|
||||
CALL IMM_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO
|
||||
POP HL
|
||||
JR NZ,IMM_IO3 ; BAIL OUT ON ERROR
|
||||
;
|
||||
LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
LD A,IMM_LBA
|
||||
CALL LDHLIYA
|
||||
CALL HB_DSKACT ; SHOW ACTIVITY
|
||||
#ENDIF
|
||||
;
|
||||
; SETUP LBA
|
||||
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
|
||||
@@ -313,10 +361,9 @@ IMM_IO:
|
||||
LD A,(IY+IMM_LBA+0)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
;
|
||||
; DO SCSI IO
|
||||
LD DE,(IMM_DSKBUF) ; DISK BUFFER TO DE
|
||||
LD BC,512 ; ONE SECTOR, 512 BYTES
|
||||
LD A,1 ; BLOCK I/O, ONE SECTOR
|
||||
LD HL,IMM_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE
|
||||
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
|
||||
CALL Z,IMM_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS
|
||||
@@ -358,7 +405,7 @@ IMM_RESET:
|
||||
IMM_DEVICE:
|
||||
LD D,DIODEV_IMM ; D := DEVICE TYPE
|
||||
LD E,(IY+IMM_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%01000000 ; C := REMOVABLE HARD DISK
|
||||
LD C,%01111001 ; C := REMOVABLE HARD DISK
|
||||
LD H,(IY+IMM_MODE) ; H := MODE
|
||||
LD L,(IY+IMM_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -445,6 +492,10 @@ IMM_WRITECTRL:
|
||||
#IF (IMMMODE == IMMMODE_MG014
|
||||
XOR $0B | $80 ; HIGH BIT IS MG014 LED
|
||||
#ENDIF
|
||||
;#IF (IMMMODE == IMMMODE_SPP
|
||||
; AND %00001111
|
||||
; OR %11000000
|
||||
;#ENDIF
|
||||
LD C,(IY+IMM_IOBASE) ; GET BASE IO ADDRESS
|
||||
INC C ; BUMP TO CONTROL PORT
|
||||
INC C
|
||||
@@ -503,28 +554,28 @@ IMM_READSTATUS5:
|
||||
;
|
||||
IMM_CPP:
|
||||
PUSH AF
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,$AA \ CALL IMM_WRITEDATA
|
||||
LD A,$55 \ CALL IMM_WRITEDATA
|
||||
LD A,$00 \ CALL IMM_WRITEDATA
|
||||
LD A,$FF \ CALL IMM_WRITEDATA
|
||||
IMM_WCTL($0C)
|
||||
IMM_WDATA($AA)
|
||||
IMM_WDATA($55)
|
||||
IMM_WDATA($00)
|
||||
IMM_WDATA($FF)
|
||||
CALL IMM_READSTATUS
|
||||
AND $B8
|
||||
LD (IMM_S1),A
|
||||
LD A,$87 \ CALL IMM_WRITEDATA
|
||||
IMM_WDATA($87)
|
||||
CALL IMM_READSTATUS
|
||||
AND $B8
|
||||
LD (IMM_S2),A
|
||||
LD A,$78 \ CALL IMM_WRITEDATA
|
||||
IMM_WDATA($78)
|
||||
CALL IMM_READSTATUS
|
||||
AND $38
|
||||
LD (IMM_S3),A
|
||||
POP AF
|
||||
CALL IMM_WRITEDATA
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,$0D \ CALL IMM_WRITECTRL
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,$FF \ CALL IMM_WRITEDATA
|
||||
IMM_WCTL($0C)
|
||||
IMM_WCTL($0D)
|
||||
IMM_WCTL($0C)
|
||||
IMM_WDATA($FF)
|
||||
;
|
||||
; CONNECT: S1=$B8 S2=$18 S3=$30
|
||||
; DISCONNECT: S1=$B8 S2=$18 S3=$38
|
||||
@@ -567,23 +618,23 @@ IMM_DISCONNECT:
|
||||
CALL IMM_CPP
|
||||
;
|
||||
; TURNS OFF MG014 LED
|
||||
LD A,$8C \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($8C)
|
||||
;
|
||||
RET
|
||||
;
|
||||
; INITIATE A SCSI BUS RESET.
|
||||
;
|
||||
IMM_RESETPULSE:
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
LD A,$40 \ CALL IMM_WRITEDATA
|
||||
IMM_WCTL($04)
|
||||
IMM_WDATA($40)
|
||||
CALL DELAY ; 16 US, IDEALLY, 1 US
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,$0D \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($0C)
|
||||
IMM_WCTL($0D)
|
||||
CALL DELAY ; 48 US, IDEALLY, 50 US
|
||||
CALL DELAY
|
||||
CALL DELAY
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($0C)
|
||||
IMM_WCTL($04)
|
||||
RET
|
||||
;
|
||||
; SCSI SELECT PROCESS
|
||||
@@ -592,44 +643,29 @@ IMM_SELECT:
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nSELECT: $")
|
||||
#ENDIF
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
;
|
||||
LD HL,500 ; TIMEOUT COUNTER
|
||||
IMM_WCTL($0C)
|
||||
;
|
||||
LD B,0 ; TIMEOUT COUNTER
|
||||
IMM_SELECT1:
|
||||
CALL IMM_READSTATUS
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
AND $08
|
||||
JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT
|
||||
JR IMM_SELECT1
|
||||
DJNZ IMM_SELECT1
|
||||
JP IMM_CMD_TIMEOUT ; TIMEOUT
|
||||
;
|
||||
IMM_SELECT2:
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
; PLACE HOST AND TARGET BIT ON DATA BUS
|
||||
LD A,$80 | (1 << IMM_TGT)
|
||||
CALL IMM_WRITEDATA
|
||||
CALL DELAY ; CONFIRM DELAY TIME?
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL IMM_READSTATUS
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
LD A,$0D \ CALL IMM_WRITECTRL
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL IMM_READSTATUS
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
LD HL,500 ; TIMEOUT COUNTER
|
||||
IMM_WCTL($0C)
|
||||
IMM_WCTL($0D)
|
||||
;
|
||||
LD B,0 ; TIMEOUT COUNTER
|
||||
IMM_SELECT3:
|
||||
CALL IMM_READSTATUS
|
||||
#IF (IMMTRACE >= 3)
|
||||
@@ -638,14 +674,11 @@ IMM_SELECT3:
|
||||
#ENDIF
|
||||
AND $08
|
||||
JR NZ,IMM_SELECT4 ; IF SET, MOVE ON
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT
|
||||
JR IMM_SELECT3
|
||||
DJNZ IMM_SELECT3
|
||||
JP IMM_CMD_TIMEOUT ; TIMEOUT
|
||||
;
|
||||
IMM_SELECT4:
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($0C)
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
@@ -675,7 +708,7 @@ IMM_SENDCMD:
|
||||
;
|
||||
INC HL ; BACK TO FIRST CMD BYTE
|
||||
IMM_SENDCMD1:
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
LD A,(HL) ; LOAD CMD BYTE
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
@@ -686,8 +719,8 @@ IMM_SENDCMD1:
|
||||
CALL IMM_WRITEDATA ; PUT IT ON THE BUS
|
||||
INC HL ; BUMP TO NEXT BYTE
|
||||
DEC B ; DEC LOOP COUNTER
|
||||
LD A,$05
|
||||
CALL IMM_WRITECTRL \ LD A,(HL) ; LOAD CMD BYTE
|
||||
IMM_WCTL($05)
|
||||
LD A,(HL) ; LOAD CMD BYTE
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
@@ -696,11 +729,11 @@ IMM_SENDCMD1:
|
||||
;
|
||||
CALL IMM_WRITEDATA ; PUT IT ON THE BUS
|
||||
INC HL ; BUMP TO NEXT BYTE
|
||||
LD A,$00 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($00)
|
||||
DJNZ IMM_SENDCMD1 ; LOOP TILL DONE
|
||||
;
|
||||
IMM_SENDCMD2:
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
;
|
||||
RET
|
||||
;
|
||||
@@ -718,20 +751,23 @@ IMM_WAITLOOP:
|
||||
;
|
||||
IMM_WAIT:
|
||||
LD HL,500 ; GOOD VALUE???
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($0C)
|
||||
CALL IMM_WAITLOOP
|
||||
JP Z,IMM_CMD_TIMEOUT ; HANDLE TIMEOUT
|
||||
PUSH AF
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
POP AF
|
||||
AND $B8
|
||||
RET ; RETURN W/ RESULT IN A
|
||||
;
|
||||
; MAX OBSERVED IMM_WAITLOOP ITERATIONS IS $0116B3
|
||||
; MAX OBSERVED WAITLOOP ITERATIONS IS $0116B3 @ 7.3728 MHZ ON MG014
|
||||
; MAX OBSERVED WAITLOOP ITERATIONS IS $028EFE @ 8.000 MHZ ON MBC SPP
|
||||
;
|
||||
IMM_LONGWAIT:
|
||||
LD B,3 ; VALUE???
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ
|
||||
SRL A ; DIVIDE BY 2, GOOD ENOUGH
|
||||
LD B,A ; USE FOR OUTER LOOP COUNT
|
||||
IMM_WCTL($0C)
|
||||
IMM_LONGWAIT1:
|
||||
LD HL,0
|
||||
CALL IMM_WAITLOOP
|
||||
@@ -741,7 +777,7 @@ IMM_LONGWAIT1:
|
||||
;
|
||||
IMM_LONGWAIT2:
|
||||
PUSH AF
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
;
|
||||
#IF 0
|
||||
CALL PC_GT
|
||||
@@ -761,19 +797,19 @@ IMM_NEGOTIATE:
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nNEGO: $")
|
||||
#ENDIF
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
CALL DELAY ; 16 US, IDEALLY 5 US
|
||||
LD A,$00 \ CALL IMM_WRITEDATA
|
||||
IMM_WDATA($00)
|
||||
LD DE,7 ; 112 US, IDEALLY 100 US
|
||||
CALL VDELAY
|
||||
LD A,$06 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($06)
|
||||
CALL DELAY ; 16 US, IDEALLY 5 US
|
||||
CALL IMM_READSTATUS
|
||||
PUSH AF ; SAVE RESULT
|
||||
CALL DELAY ; 16 US, IDEALLY 5 US
|
||||
LD A,$07 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($07)
|
||||
CALL DELAY ; 16 US, IDEALLY 5 US
|
||||
LD A,$06 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($06)
|
||||
;
|
||||
POP AF
|
||||
;
|
||||
@@ -799,7 +835,7 @@ IMM_NEGOTIATE:
|
||||
;
|
||||
IMM_GETBYTE:
|
||||
CALL IMM_WAIT
|
||||
LD A,$06 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($06)
|
||||
CALL IMM_READSTATUS
|
||||
AND $F0
|
||||
RRCA
|
||||
@@ -807,32 +843,31 @@ IMM_GETBYTE:
|
||||
RRCA
|
||||
RRCA
|
||||
PUSH AF
|
||||
LD A,$05 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($05)
|
||||
CALL IMM_READSTATUS
|
||||
AND $F0
|
||||
POP HL
|
||||
OR H
|
||||
PUSH AF
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR
|
||||
; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE
|
||||
; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS
|
||||
; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN
|
||||
; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
|
||||
; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS
|
||||
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
|
||||
; CHECK IN THIS CASE).
|
||||
;
|
||||
; THIS IS A NIBBLE READ.
|
||||
;
|
||||
; DE=BUFFER
|
||||
; HL=LENGTH (0 FOR VARIABLE)
|
||||
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
|
||||
;
|
||||
IMM_GETDATA:
|
||||
; BRANCH TO CORRECT ROUTINE
|
||||
LD A,H
|
||||
OR L ; IF ZERO
|
||||
JR NZ,IMM_GETDATALEN ; DO BURST READ
|
||||
OR A
|
||||
JR NZ,IMM_GETBLOCK ; DO BLOCK READ
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nGETDATA:$")
|
||||
@@ -844,8 +879,7 @@ IMM_GETDATA1:
|
||||
POP HL ; RESTORE BYTE COUNTER
|
||||
CP $98 ; CHECK FOR READ PHASE
|
||||
JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
LD A,$06 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($06)
|
||||
CALL IMM_READSTATUS ; GET FIRST NIBBLE
|
||||
AND $F0 ; ISOLATE BITS
|
||||
RRCA ; AND SHIFT TO LOW NIBBLE
|
||||
@@ -853,7 +887,7 @@ IMM_GETDATA1:
|
||||
RRCA
|
||||
RRCA
|
||||
PUSH AF ; SAVE WORKING VALUE
|
||||
LD A,$05 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($05)
|
||||
CALL IMM_READSTATUS ; GET SECOND NIBBLE
|
||||
AND $F0 ; ISOLATE BITS
|
||||
POP BC ; RECOVER LOW NIBBLE
|
||||
@@ -861,8 +895,7 @@ IMM_GETDATA1:
|
||||
LD (DE),A ; AND SAVE THE FULL BYTE VALUE
|
||||
INC DE ; NEXT BUFFER POS
|
||||
INC HL ; INCREMENT BYTES COUNTER
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
JR IMM_GETDATA1 ; LOOP TILL DONE
|
||||
;
|
||||
IMM_GETDATA2:
|
||||
@@ -873,57 +906,112 @@ IMM_GETDATA2:
|
||||
PRTS(" BYTES$")
|
||||
#ENDIF
|
||||
;
|
||||
IMM_WCTL($0C)
|
||||
RET
|
||||
;
|
||||
IMM_GETDATALEN:
|
||||
IMM_GETBLOCK:
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nGETDLEN:$")
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXWORDHL
|
||||
PRTS(" BYTES$")
|
||||
PRTS("\r\nGETBLK:$")
|
||||
#ENDIF
|
||||
;
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_GETDATALEN1:
|
||||
LD A,$06 \ CALL IMM_WRITECTRL
|
||||
CALL IMM_READSTATUS ; GET FIRST NIBBLE
|
||||
AND $F0 ; ISOLATE BITS
|
||||
RRCA ; MOVE TO LOW NIBBLE
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
PUSH AF ; SAVE WORKING VALUE
|
||||
LD A,$05 \ CALL IMM_WRITECTRL
|
||||
CALL IMM_READSTATUS ; GET SECOND NIBBLE
|
||||
AND $F0 ; ISOLATE BITS
|
||||
POP BC ; RECOVER FIRST NIBBLE
|
||||
OR B ; COMBINE
|
||||
LD (DE),A ; SAVE FINAL BYTE VALUE
|
||||
INC DE ; NEXT BUFFER POS
|
||||
DEC HL ; DEC LOOP COUNTER
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
LD A,H ; CHECK LOOP COUNTER
|
||||
OR L
|
||||
JR NZ,IMM_GETDATALEN1 ; LOOP IF NOT DONE
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
LD B,0 ; LOOP COUNTER
|
||||
EXX ; SWITCH TO ALT REGS
|
||||
EX AF,AF' ; SWITCH TO ALT AF
|
||||
; SAVE ALT REGS
|
||||
PUSH AF
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
; C: PORT C
|
||||
LD A,(IY+IMM_IOBASE) ; BASE PORT
|
||||
INC A ; STATUS PORT
|
||||
LD (IMM_GETBLOCK_A),A ; FILL IN
|
||||
LD (IMM_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE
|
||||
INC A ; CONTROL PORT
|
||||
LD C,A ; ... TO C
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
; DE: CLOCK VALUES
|
||||
LD D,$06 ^ ($0B | $80)
|
||||
LD E,$05 ^ ($0B | $80)
|
||||
; HL: STATMAP
|
||||
LD H,MG014_STATMAPLO >> 8
|
||||
#ENDIF
|
||||
#IF (IMMMODE == IMMMODE_SPP)
|
||||
; DE: CLOCK VALUES
|
||||
LD D,$06
|
||||
LD E,$05
|
||||
#ENDIF
|
||||
EXX ; SWITCH TO PRI REGS
|
||||
EX AF,AF' ; SWITCH TO PRI AF
|
||||
CALL IMM_GETBLOCK1 ; LOOP TWICE
|
||||
CALL IMM_GETBLOCK1 ; ... FOR 512 BYTES
|
||||
; RESTORE ALT REGS
|
||||
EXX ; SWITCH TO ALT REGS
|
||||
EX AF,AF' ; SWITCH TO ALT AF
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
POP AF
|
||||
EXX ; SWITCH TO PRI REGS
|
||||
EX AF,AF' ; SWITCH TO PRI AF
|
||||
IMM_WCTL($0C)
|
||||
RET
|
||||
;
|
||||
IMM_GETBLOCK1:
|
||||
EXX ; ALT REGS
|
||||
OUT (C),D ; SEND FIRST CLOCK
|
||||
IMM_GETBLOCK_A .EQU $+1
|
||||
IN A,($FF) ; GET LOW NIBBLE
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
AND $0F ; RELEVANT BITS ONLY
|
||||
ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR
|
||||
LD L,A ; PUT IN L
|
||||
LD A,(HL) ; LOOKUP LOW NIBBLE VALUE
|
||||
EX AF,AF' ; ALT AF, SAVE NIBBLE
|
||||
#ENDIF
|
||||
#IF (IMMMODE == IMMMODE_SPP)
|
||||
AND $F0 ; RELEVANT BITS ONLY
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
LD L,A ; SAVE NIBBLE IN L
|
||||
#ENDIF
|
||||
OUT (C),E ; SEND SECOND CLOCK
|
||||
IMM_GETBLOCK_B .EQU $+1
|
||||
IN A,($FF) ; GET HIGH NIBBLE
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
AND $0F ; RELEVANT BITS ONLY
|
||||
ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR
|
||||
LD L,A ; PUT IN L
|
||||
EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE
|
||||
OR (HL) ; COMBINE WITH HIGH NIB VALUE
|
||||
#ENDIF
|
||||
#IF (IMMMODE == IMMMODE_SPP)
|
||||
AND $F0 ; RELEVANT BITS ONLY
|
||||
OR L ; COMBINE WITH HIGH NIB VALUE
|
||||
#ENDIF
|
||||
EXX ; SWITCH TO PRI REGS
|
||||
LD (DE),A ; SAVE BYTE
|
||||
INC DE ; BUMP BUF PTR
|
||||
DJNZ IMM_GETBLOCK1 ; LOOP
|
||||
RET ; DONE
|
||||
;
|
||||
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR
|
||||
; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE
|
||||
; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS
|
||||
; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
|
||||
; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS
|
||||
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
|
||||
; CHECK IN THIS CASE).
|
||||
;
|
||||
; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES.
|
||||
;
|
||||
; DE=BUFFER
|
||||
; HL=LENGTH (0 FOR VARIABLE)
|
||||
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
|
||||
;
|
||||
IMM_PUTDATA:
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,IMM_PUTDATALEN
|
||||
; BRANCH TO CORRECT ROUTINE
|
||||
OR A
|
||||
JR NZ,IMM_PUTBLOCK ; DO BLOCK WRITE
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nPUTDATA:$")
|
||||
@@ -935,21 +1023,21 @@ IMM_PUTDATA1:
|
||||
POP HL ; RESTORE BYTE COUNTER
|
||||
CP $88 ; CHECK FOR WRITE PHASE
|
||||
JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
;IMM_WCTL($04)
|
||||
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR)
|
||||
CALL IMM_WRITEDATA ; PUT ON BUS
|
||||
INC DE ; BUMP TO NEXT BUF POS
|
||||
INC HL ; INCREMENT COUNTER
|
||||
LD A,$05 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($05)
|
||||
LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR)
|
||||
CALL IMM_WRITEDATA ; PUT ON BUS
|
||||
INC DE ; BUMP TO NEXT BUF POS
|
||||
INC HL ; INCREMENT COUNTER
|
||||
LD A,$00 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($00)
|
||||
JR IMM_PUTDATA1 ; LOOP TILL DONE
|
||||
;
|
||||
IMM_PUTDATA2:
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
@@ -959,33 +1047,47 @@ IMM_PUTDATA2:
|
||||
;
|
||||
RET
|
||||
;
|
||||
IMM_PUTDATALEN:
|
||||
IMM_PUTBLOCK:
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nPUTDLEN:$")
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXWORDHL
|
||||
PRTS(" BYTES$")
|
||||
PRTS("\r\nPUTBLK:$")
|
||||
#ENDIF
|
||||
;
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_PUTDATALEN1:
|
||||
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR)
|
||||
CALL IMM_WRITEDATA ; PUT ON BUS
|
||||
INC DE ; INCREMENT BUF POS
|
||||
DEC HL ; DEC LOOP COUNTER
|
||||
LD A,$05 \ CALL IMM_WRITECTRL
|
||||
LD A,(DE) ; GET NEXT BYTE (SECOND OF PAIR)
|
||||
CALL IMM_WRITEDATA ; PUT ON BUS
|
||||
INC DE ; INCREMENT BUF POS
|
||||
DEC HL ; DEC LOOP COUNTER
|
||||
LD A,$00 \ CALL IMM_WRITECTRL
|
||||
LD A,H ; CHECK LOOP COUNTER
|
||||
OR L
|
||||
JR NZ,IMM_PUTDATALEN1 ; LOOP TILL DONE
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
LD B,0 ; LOOP COUNTER
|
||||
LD A,(IY+IMM_IOBASE) ; GET BASE IO ADR
|
||||
LD (IMM_PUTBLOCK_A),A ; FILL IN
|
||||
LD (IMM_PUTBLOCK_B),A ; ... DYNAMIC BITS OF CODE
|
||||
INC A ; STATUS PORT
|
||||
INC A ; CONTROL PORT
|
||||
LD C,A ; ... TO C
|
||||
; HL: CLOCK VALUES
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
LD H,$05 ^ ($0B | $80)
|
||||
LD L,$00 ^ ($0B | $80)
|
||||
#ENDIF
|
||||
#IF (IMMMODE == IMMMODE_SPP)
|
||||
LD H,$05
|
||||
LD L,$00
|
||||
#ENDIF
|
||||
CALL IMM_PUTBLOCK1 ; ONE LOOP CUZ BYTE PAIRS
|
||||
IMM_WCTL($04)
|
||||
RET
|
||||
;
|
||||
IMM_PUTBLOCK1:
|
||||
LD A,(DE) ; GET NEXT BYTE
|
||||
IMM_PUTBLOCK_A .EQU $+1
|
||||
OUT ($FF),A ; PUT ON BUS
|
||||
INC DE ; INCREMENT BUF POS
|
||||
OUT (C),H ; FIRST CLOCK
|
||||
LD A,(DE) ; GET NEXT BYTE
|
||||
IMM_PUTBLOCK_B .EQU $+1
|
||||
OUT ($FF),A ; PUT ON BUS
|
||||
INC DE ; INCREMENT BUF POS
|
||||
OUT (C),L ; SECOND CLOCK
|
||||
DJNZ IMM_PUTBLOCK1 ; LOOP
|
||||
RET ; DONE
|
||||
;
|
||||
; READ SCSI COMMAND STATUS
|
||||
;
|
||||
IMM_GETSTATUS:
|
||||
@@ -1015,13 +1117,13 @@ IMM_GETSTATUS:
|
||||
;
|
||||
RET
|
||||
;
|
||||
; TERMINATE A BULD READ OPERATION
|
||||
; TERMINATE A BULK READ OPERATION
|
||||
;
|
||||
IMM_ENDREAD:
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
LD A,$0C \ CALL IMM_WRITECTRL
|
||||
LD A,$0E \ CALL IMM_WRITECTRL
|
||||
LD A,$04 \ CALL IMM_WRITECTRL
|
||||
IMM_WCTL($04)
|
||||
IMM_WCTL($0C)
|
||||
IMM_WCTL($0E)
|
||||
IMM_WCTL($04)
|
||||
RET
|
||||
;
|
||||
; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE
|
||||
@@ -1029,7 +1131,7 @@ IMM_ENDREAD:
|
||||
;
|
||||
; HL: COMMAND BUFFER
|
||||
; DE: TRANSFER BUFFER
|
||||
; BC: TRANSFER LENGTH (0=VARIABLE)
|
||||
; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK)
|
||||
;
|
||||
IMM_RUNCMD:
|
||||
; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT
|
||||
@@ -1038,7 +1140,7 @@ IMM_RUNCMD:
|
||||
; SEE IMM_CMD_ERR BELOW.
|
||||
LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS
|
||||
LD (IMM_DSKBUF),DE ; SAVE BUF PTR
|
||||
LD (IMM_XFRLEN),BC ; SAVE XFER LEN
|
||||
LD (IMM_XFRMODE),A ; SAVE XFER LEN
|
||||
PUSH HL
|
||||
CALL IMM_CONNECT ; PARALLEL PORT BUS CONNECT
|
||||
CALL IMM_SELECT ; SELECT TARGET DEVICE
|
||||
@@ -1069,7 +1171,7 @@ IMM_RUNCMD_PHASE:
|
||||
;
|
||||
IMM_RUNCMD_WRITE:
|
||||
LD DE,(IMM_DSKBUF) ; XFER BUFFER
|
||||
LD HL,(IMM_XFRLEN) ; XFER LENGTH
|
||||
LD A,(IMM_XFRMODE) ; XFER MODE
|
||||
CALL IMM_PUTDATA ; SEND DATA NOW
|
||||
JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH
|
||||
;
|
||||
@@ -1078,7 +1180,7 @@ IMM_RUNCMD_READ:
|
||||
CALL IMM_WAIT ; WAIT TILL READY
|
||||
; CHECK FOR STATUS $98???
|
||||
LD DE,(IMM_DSKBUF) ; XFER BUFFER
|
||||
LD HL,(IMM_XFRLEN) ; XFER LENGTH
|
||||
LD A,(IMM_XFRMODE) ; XFER MODE
|
||||
CALL IMM_GETDATA ; GET THE DATA NOW
|
||||
CALL IMM_ENDREAD ; TERMINATE THE READ
|
||||
JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH
|
||||
@@ -1135,14 +1237,15 @@ IMM_CHKCMD:
|
||||
IMM_CHKCMD1:
|
||||
; USE REQUEST SENSE CMD TO GET ERROR DETAILS
|
||||
LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF
|
||||
LD BC,0 ; VARIABLE LENGTH REQUEST
|
||||
LD A,0 ; VARIABLE LENGTH REQUEST
|
||||
LD HL,IMM_CMD_SENSE ; REQUEST SENSE CMD
|
||||
CALL IMM_RUNCMD ; DO IT
|
||||
JP NZ,IMM_IOERR ; BAIL IF ERROR IN CMD
|
||||
;
|
||||
; REQ SENSE CMD COMPLETED
|
||||
#IF (IMMTRACE >= 3)
|
||||
LD A,16
|
||||
PRTS("\r\nSENSE:$")
|
||||
LD A,$19
|
||||
LD DE,HB_WRKBUF
|
||||
CALL Z,PRTHEXBUF
|
||||
#ENDIF
|
||||
@@ -1171,6 +1274,8 @@ IMM_CHKERR:
|
||||
; (RE)INITIALIZE DEVICE
|
||||
;
|
||||
IMM_INITDEV:
|
||||
;
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
; INITIALIZE 8255
|
||||
LD A,(IY+IMM_IOBASE) ; BASE PORT
|
||||
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT
|
||||
@@ -1178,6 +1283,7 @@ IMM_INITDEV:
|
||||
LD A,$82 ; CONFIG A OUT, B IN, C OUT
|
||||
OUT (C),A ; DO IT
|
||||
CALL DELAY ; SHORT DELAY FOR BUS SETTLE
|
||||
#ENDIF
|
||||
;
|
||||
CALL IMM_DISCONNECT ; DISCONNECT FIRST JUST IN CASE
|
||||
CALL IMM_CONNECT ; NOW CONNECT TO BUS
|
||||
@@ -1199,7 +1305,7 @@ IMM_INITDEV1:
|
||||
;
|
||||
; REQUEST SENSE COMMAND
|
||||
LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA
|
||||
LD BC,0 ; READ WHATEVER IS SENT
|
||||
LD A,0 ; READ WHATEVER IS SENT
|
||||
LD HL,IMM_CMD_SENSE ; POINT TO CMD BUFFER
|
||||
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
|
||||
JR NZ,IMM_INITDEV2 ; CMD PROC ERROR
|
||||
@@ -1210,7 +1316,8 @@ IMM_INITDEV1:
|
||||
JR NZ,IMM_INITDEV2 ; IF ERROR, LOOP
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
LD A,16
|
||||
PRTS("\r\nSENSE:$")
|
||||
LD A,$19
|
||||
LD DE,HB_WRKBUF
|
||||
CALL PRTHEXBUF
|
||||
#ENDIF
|
||||
@@ -1228,13 +1335,14 @@ IMM_INITDEV2:
|
||||
IMM_INITDEV3:
|
||||
; READ & RECORD DEVICE CAPACITY
|
||||
LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE
|
||||
LD BC,0 ; READ WHATEVER IS SENT
|
||||
LD A,0 ; READ WHATEVER IS SENT
|
||||
LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD
|
||||
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
|
||||
CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS
|
||||
RET NZ ; BAIL ON ON ERROR
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
#IF (IMMTRACE >= 3)
|
||||
PRTS("\r\nRDCAP:$")
|
||||
LD A,8
|
||||
LD DE,HB_WRKBUF
|
||||
CALL PRTHEXBUF
|
||||
@@ -1293,7 +1401,7 @@ IMM_ERR:
|
||||
LD (IY+IMM_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
IMM_ERR2:
|
||||
#IF (IMMTRACE >= 1)
|
||||
#IF (IMMTRACE >= 2)
|
||||
CALL IMM_PRTSTAT
|
||||
#ENDIF
|
||||
OR A ; SET FLAGS
|
||||
@@ -1390,7 +1498,7 @@ IMM_STR_NOHW .TEXT "NOT PRESENT$"
|
||||
IMM_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING
|
||||
IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER
|
||||
IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH
|
||||
IMM_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES)
|
||||
IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS
|
||||
;
|
||||
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED)
|
||||
|
||||
@@ -21,9 +21,9 @@ MD_LBA .EQU 2 ; OFFSET OF LBA (DWORD)
|
||||
MD_MID .EQU 6 ; OFFSET OF MEDIA ID (BYTE)
|
||||
MD_ATTRIB .EQU 7 ; OFFSET OF ATTRIBUTE (BYTE)
|
||||
;
|
||||
MD_AROM .EQU %00100000 ; ROM ATTRIBUTE
|
||||
MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE
|
||||
MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE
|
||||
MD_AROM .EQU %00010100 ; ROM ATTRIBUTE
|
||||
MD_ARAM .EQU %00010101 ; RAM ATTRIBUTE
|
||||
MD_AFSH .EQU %00010111 ; FLASH ATTRIBUTE
|
||||
;
|
||||
MD_FDBG .EQU 0 ; FLASH DEBUG CODE
|
||||
MD_FVBS .EQU 1 ; FLASH VERBOSE OUTPUT
|
||||
|
||||
@@ -9,11 +9,14 @@
|
||||
; INTENDED TO CO-EXIST WITH LPT DRIVER.
|
||||
;
|
||||
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS.
|
||||
; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX).
|
||||
; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX).
|
||||
; - https://github.com/EtchedPixels/FUZIX
|
||||
; - https://github.com/torvalds/linux
|
||||
;
|
||||
; 5/23/2023 WBW - INITIAL RELEASE
|
||||
; 5/26/3023 WBW - CLEAN UP, LED ACTIVITY
|
||||
; 5/27/2023 WBW - ADDED SPP MODE
|
||||
; 05/23/2023 WBW - INITIAL RELEASE
|
||||
; 05/26/3023 WBW - CLEAN UP, LED ACTIVITY
|
||||
; 05/27/2023 WBW - ADDED SPP MODE
|
||||
; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE
|
||||
;
|
||||
;=============================================================================
|
||||
;
|
||||
@@ -71,22 +74,18 @@
|
||||
;
|
||||
; TODO:
|
||||
;
|
||||
; - OPTIMIZE READ/WRITE LOOPS
|
||||
;
|
||||
; NOTES:
|
||||
;
|
||||
; - THIS DRIVER IS FOR THE ZIP DRIVE PPA INTERFACE. IT WILL SIMPLY
|
||||
; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE OLDER PPA INTERFACE.
|
||||
; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE NEWER IMM INTERFACE.
|
||||
; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP
|
||||
; DRIVE IS PPA OR PPA. SIGH.
|
||||
; DRIVE IS PPA OR IMM. SIGH.
|
||||
;
|
||||
; - THERE ARE SOME HARD CODED TIMEOUT LOOPS IN THE CODE. THEY ARE
|
||||
; WORKING OK ON A 7 MHZ Z80. THEY ARE LIKELY TO NEED TWEAKING ON
|
||||
; FASTER CPUS.
|
||||
;
|
||||
; - THIS DRIVER OPERATES PURELY IN NIBBLE MODE. I SUSPECT IT IS
|
||||
; POSSIBLE TO USE FULL BYTE MODE (PS2 STYLE), BUT I HAVE NOT
|
||||
; ATTEMPTED IT.
|
||||
; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255
|
||||
; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN
|
||||
; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND
|
||||
; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE
|
||||
; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT.
|
||||
;
|
||||
; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE
|
||||
; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN
|
||||
@@ -130,6 +129,20 @@ PPA_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE)
|
||||
PPA_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
|
||||
PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD)
|
||||
;
|
||||
; MACROS
|
||||
;
|
||||
#DEFINE PPA_WCTL(VAL) LD A,VAL \ CALL PPA_WRITECTRL
|
||||
#DEFINE PPA_WDATA(VAL) LD A,VAL \ CALL PPA_WRITEDATA
|
||||
;
|
||||
#DEFINE PPA_DPUL(VAL) LD A,VAL \ CALL PPA_DPULSE
|
||||
#DEFINE PPA_CPUL(VAL) LD A,VAL \ CALL PPA_CPULSE
|
||||
;
|
||||
; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE
|
||||
;
|
||||
#IF (IMMMODE == IMMMODE_MG014)
|
||||
#DEFINE MG014_MAP
|
||||
#ENDIF
|
||||
;
|
||||
;=============================================================================
|
||||
; INITIALIZATION ENTRY POINT
|
||||
;=============================================================================
|
||||
@@ -185,8 +198,8 @@ PPA_INIT4:
|
||||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
|
||||
;
|
||||
CALL PPA_RESET ; RESET/INIT THE INTERFACE
|
||||
#IF (PPATRACE == 0)
|
||||
CALL PPA_PRTSTAT
|
||||
#IF (PPATRACE <= 1)
|
||||
CALL NZ,PPA_PRTSTAT
|
||||
#ENDIF
|
||||
JR NZ,PPA_INIT6
|
||||
;
|
||||
@@ -220,6 +233,11 @@ PPA_INIT6:
|
||||
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
||||
;
|
||||
PPA_DETECT:
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nDETECT:$")
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PPAMODE == PPAMODE_MG014)
|
||||
; INITIALIZE 8255
|
||||
LD A,(IY+PPA_IOBASE) ; BASE PORT
|
||||
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT
|
||||
@@ -227,35 +245,39 @@ PPA_DETECT:
|
||||
LD A,$82 ; CONFIG A OUT, B IN, C OUT
|
||||
OUT (C),A ; DO IT
|
||||
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE
|
||||
#ENDIF
|
||||
;
|
||||
LD A,$AA \ CALL PPA_WRITEDATA
|
||||
PPA_WDATA($AA)
|
||||
CALL PPA_DISCONNECT
|
||||
CALL PPA_CONNECT
|
||||
LD A,$06 \ CALL PPA_WRITECTRL
|
||||
PPA_WCTL($0E)
|
||||
CALL PPA_READSTATUS
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
AND $F0
|
||||
CP $F0
|
||||
AND $08
|
||||
CP $08
|
||||
JR NZ,PPA_DETECT_FAIL
|
||||
LD A,$04 \ CALL PPA_WRITECTRL
|
||||
;
|
||||
PPA_WCTL($0C)
|
||||
CALL PPA_READSTATUS
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
AND $F0
|
||||
CP $80
|
||||
AND $08
|
||||
CP $00
|
||||
JR NZ,PPA_DETECT_FAIL
|
||||
LD A,$AA \ CALL PPA_WRITEDATA
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
CALL PPA_CONNECT
|
||||
LD A,$40 \ CALL PPA_WRITEDATA
|
||||
LD A,$08 \ CALL PPA_WRITECTRL
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
;
|
||||
CALL PPA_DISCONNECT
|
||||
;
|
||||
PPA_WDATA($AA)
|
||||
PPA_WCTL($0C)
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
@@ -263,7 +285,6 @@ PPA_DETECT:
|
||||
PPA_DETECT_FAIL:
|
||||
OR $FF ; SIGNAL FAILURE
|
||||
RET NZ
|
||||
|
||||
;
|
||||
;=============================================================================
|
||||
; DRIVER FUNCTION TABLE
|
||||
@@ -303,7 +324,7 @@ PPA_READ:
|
||||
;
|
||||
;
|
||||
PPA_WRITE:
|
||||
CALL HB_DSKREAD ; HOOK DISK WRITE CONTROLLER
|
||||
CALL HB_DSKWRITE ; HOOK DISK WRITE CONTROLLER
|
||||
LD A,SCSI_CMD_WRITE ; SETUP SCSI WRITE
|
||||
LD (PPA_CMD_RW),A ; AND SAVE IT IN SCSI CMD
|
||||
JP PPA_IO ; DO THE I/O
|
||||
@@ -311,9 +332,18 @@ PPA_WRITE:
|
||||
;
|
||||
;
|
||||
PPA_IO:
|
||||
LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
PUSH HL
|
||||
CALL PPA_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO
|
||||
POP HL
|
||||
JR NZ,PPA_IO3 ; BAIL OUT ON ERROR
|
||||
;
|
||||
LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
LD A,PPA_LBA
|
||||
CALL LDHLIYA
|
||||
CALL HB_DSKACT ; SHOW ACTIVITY
|
||||
#ENDIF
|
||||
;
|
||||
; SETUP LBA
|
||||
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
|
||||
@@ -330,7 +360,7 @@ PPA_IO:
|
||||
;
|
||||
; DO SCSI IO
|
||||
LD DE,(PPA_DSKBUF) ; DISK BUFFER TO DE
|
||||
LD BC,512 ; ONE SECTOR, 512 BYTES
|
||||
LD A,1 ; BLOCK I/O, ONE SECTOR
|
||||
LD HL,PPA_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE
|
||||
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
|
||||
CALL Z,PPA_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS
|
||||
@@ -372,7 +402,7 @@ PPA_RESET:
|
||||
PPA_DEVICE:
|
||||
LD D,DIODEV_PPA ; D := DEVICE TYPE
|
||||
LD E,(IY+PPA_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%01000000 ; C := REMOVABLE HARD DISK
|
||||
LD C,%01111001 ; C := REMOVABLE HARD DISK
|
||||
LD H,(IY+PPA_MODE) ; H := MODE
|
||||
LD L,(IY+PPA_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
@@ -440,32 +470,6 @@ PPA_GEOM:
|
||||
; FUNCTION SUPPORT ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
;
|
||||
;
|
||||
PPA_DELAY:
|
||||
PUSH AF
|
||||
CALL DELAY
|
||||
CALL DELAY
|
||||
CALL DELAY
|
||||
CALL DELAY
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPA_WAITDONE:
|
||||
LD HL,0 ; TIMEOUT COUNTER
|
||||
PPA_WAITDONE1:
|
||||
CALL PPA_READSTATUS
|
||||
AND $F0
|
||||
BIT 7,A
|
||||
RET NZ
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT
|
||||
JR PPA_WAITDONE1
|
||||
;
|
||||
; OUTPUT BYTE IN A TO THE DATA PORT
|
||||
;
|
||||
PPA_WRITEDATA:
|
||||
@@ -541,64 +545,87 @@ PPA_READSTATUS5:
|
||||
;
|
||||
PPA_DPULSE:
|
||||
CALL PPA_WRITEDATA
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
LD A,$0E \ CALL PPA_WRITECTRL
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
LD A,$04 \ CALL PPA_WRITECTRL
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
PPA_WCTL($0C)
|
||||
PPA_WCTL($0E)
|
||||
PPA_WCTL($0C)
|
||||
PPA_WCTL($04)
|
||||
PPA_WCTL($0C)
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPA_CPULSE:
|
||||
CALL PPA_WRITEDATA
|
||||
LD A,$04 \ CALL PPA_WRITECTRL
|
||||
LD A,$06 \ CALL PPA_WRITECTRL
|
||||
LD A,$04 \ CALL PPA_WRITECTRL
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
PPA_WCTL($04)
|
||||
PPA_WCTL($06)
|
||||
PPA_WCTL($04)
|
||||
PPA_WCTL($0C)
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPA_CONNECT:
|
||||
LD A,$00 \ CALL PPA_CPULSE
|
||||
LD A,$3C \ CALL PPA_CPULSE
|
||||
LD A,$20 \ CALL PPA_CPULSE
|
||||
LD A,$8F \ CALL PPA_CPULSE
|
||||
PPA_CPUL($00)
|
||||
PPA_CPUL($3C)
|
||||
PPA_CPUL($20)
|
||||
PPA_CPUL($8F)
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPA_DISCONNECT:
|
||||
LD A,$00 \ CALL PPA_DPULSE
|
||||
LD A,$3C \ CALL PPA_DPULSE
|
||||
LD A,$20 \ CALL PPA_DPULSE
|
||||
LD A,$0F \ CALL PPA_DPULSE
|
||||
PPA_DPUL($00)
|
||||
PPA_DPUL($3C)
|
||||
PPA_DPUL($20)
|
||||
PPA_DPUL($0F)
|
||||
;
|
||||
; TURNS OFF MG014 LED
|
||||
PPA_WCTL($8C)
|
||||
;
|
||||
RET
|
||||
;
|
||||
; INITIATE A SCSI BUS RESET.
|
||||
;
|
||||
PPA_RESETPULSE:
|
||||
PPA_WDATA($40)
|
||||
PPA_WCTL($08)
|
||||
CALL DELAY ; 32 US, IDEALLY 30 US
|
||||
PPA_WCTL($0C)
|
||||
RET
|
||||
;
|
||||
; SCSI SELECT PROCESS
|
||||
;
|
||||
;
|
||||
PPA_SELECT:
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nSELECT: $")
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PPA_READSTATUS
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
LD A,1 << PPA_TGT
|
||||
CALL PPA_WRITEDATA
|
||||
LD A,$0E \ CALL PPA_WRITECTRL
|
||||
LD A,$0C \ CALL PPA_WRITECTRL
|
||||
PPA_WCTL($0E)
|
||||
PPA_WCTL($0C)
|
||||
LD A,1 << PPA_SELF
|
||||
CALL PPA_WRITEDATA
|
||||
LD A,$08 \ CALL PPA_WRITECTRL
|
||||
;
|
||||
LD HL,0 ; TIMEOUT COUNTER
|
||||
PPA_WCTL($08)
|
||||
;
|
||||
LD B,0 ; TIMEOUT COUNTER
|
||||
PPA_SELECT1:
|
||||
CALL PPA_READSTATUS
|
||||
OR $F0
|
||||
RET NZ
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
RET Z ; TIMEOUT
|
||||
JR PPA_SELECT1
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
AND $40
|
||||
CP $40
|
||||
RET Z
|
||||
DJNZ PPA_SELECT1
|
||||
JP PPA_CMD_TIMEOUT
|
||||
;
|
||||
; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF
|
||||
; COMMAND BYTES. THE LENGTH OF THE COMMAND STRING MUST PRECEED
|
||||
@@ -608,16 +635,448 @@ PPA_SELECT1:
|
||||
; DATA OUTPOUT IS BURSTED (NO CHECK FOR BUSY). SEEMS TO WORK FINE.
|
||||
;
|
||||
PPA_SENDCMD:
|
||||
JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nSENDCMD:$")
|
||||
#ENDIF
|
||||
;
|
||||
DEC HL ; BACKUP TO LENGTH BYTE
|
||||
LD B,(HL) ; PUT IN B FOR LOOP COUNTER
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
LD A,B
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
PRTS(" BYTES$")
|
||||
#ENDIF
|
||||
;
|
||||
INC HL ; BACK TO FIRST CMD BYTE
|
||||
;
|
||||
PPA_SENDCMD1:
|
||||
;PPA_WCTL($0C)
|
||||
LD A,(HL) ; LOAD CMD BYTE
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
CALL PPA_WRITEDATA ; PUT IT ON THE BUS
|
||||
INC HL ; BUMP TO NEXT BYTE
|
||||
PPA_WCTL($0E)
|
||||
PPA_WCTL($0C)
|
||||
DJNZ PPA_SENDCMD1 ; LOOP TILL DONE
|
||||
;
|
||||
RET
|
||||
;
|
||||
;
|
||||
; WAIT FOR SCSI BUS TO BECOME READY WITH A TIMEOUT.
|
||||
;
|
||||
PPA_WAITLOOP:
|
||||
CALL PPA_READSTATUS
|
||||
BIT 7,A
|
||||
RET NZ ; DONE, STATUS IN A
|
||||
DEC HL
|
||||
LD A,H
|
||||
OR L
|
||||
RET Z ; TIMEOUT
|
||||
JR PPA_WAITLOOP
|
||||
;
|
||||
PPA_WAIT:
|
||||
LD HL,500 ; GOOD VALUE???
|
||||
PPA_WCTL($0C)
|
||||
CALL PPA_WAITLOOP
|
||||
JP Z,PPA_CMD_TIMEOUT ; HANDLE TIMEOUT
|
||||
;PUSH AF
|
||||
;IMM_WCTL($04)
|
||||
;POP AF
|
||||
AND $F0
|
||||
RET ; RETURN W/ RESULT IN A
|
||||
;
|
||||
; MAX OBSERVED WAITLOOP ITERATIONS IS $0116B3 @ 7.372 MHZ ON MG014
|
||||
; MAX OBSERVED WAITLOOP ITERATIONS IS $028EFE @ 8.000 MHZ ON MBC SPP
|
||||
;
|
||||
PPA_LONGWAIT:
|
||||
LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ
|
||||
SRL A ; DIVIDE BY 2, GOOD ENOUGH
|
||||
LD B,A ; USE FOR OUTER LOOP COUNT
|
||||
PPA_WCTL($0C)
|
||||
PPA_LONGWAIT1:
|
||||
LD HL,0
|
||||
CALL PPA_WAITLOOP
|
||||
JR NZ,PPA_LONGWAIT2 ; HANDLE SUCCESS
|
||||
DJNZ PPA_LONGWAIT1 ; LOOP TILL COUNTER EXHAUSTED
|
||||
JP PPA_CMD_TIMEOUT ; HANDLE TIMEOUT
|
||||
;
|
||||
PPA_LONGWAIT2:
|
||||
;PUSH AF
|
||||
;PPA_WCTL($04)
|
||||
;
|
||||
#IF 0
|
||||
PUSH AF
|
||||
CALL PC_GT
|
||||
LD A,B
|
||||
CALL PRTHEXBYTE
|
||||
CALL PC_COLON
|
||||
CALL PRTHEXWORDHL
|
||||
POP AF
|
||||
#ENDIF
|
||||
;
|
||||
;POP AF
|
||||
AND $F0
|
||||
RET ; RETURN W/ RESULT IN A
|
||||
;
|
||||
; GET A BYTE OF DATA FROM THE SCSI DEVICE. THIS IS A NIBBLE READ.
|
||||
; BYTE RETURNED IN A.
|
||||
;
|
||||
PPA_GETBYTE:
|
||||
CALL PPA_WAIT
|
||||
PPA_WCTL($04)
|
||||
CALL PPA_READSTATUS
|
||||
AND $F0
|
||||
PUSH AF
|
||||
PPA_WCTL($06)
|
||||
CALL PPA_READSTATUS
|
||||
AND $F0
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
POP HL
|
||||
OR H
|
||||
PUSH AF
|
||||
PPA_WCTL($0C)
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR
|
||||
; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
|
||||
; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS
|
||||
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
|
||||
; CHECK IN THIS CASE).
|
||||
;
|
||||
; THIS IS A NIBBLE READ.
|
||||
;
|
||||
; DE=BUFFER
|
||||
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
|
||||
;
|
||||
PPA_GETDATA:
|
||||
; BRANCH TO CORRECT ROUTINE
|
||||
OR A
|
||||
JR NZ,PPA_GETBLOCK ; DO BLOCK READ
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nGETDATA:$")
|
||||
#ENDIF
|
||||
;
|
||||
PPA_GETDATA1:
|
||||
PUSH HL ; SAVE BYTE COUNTER
|
||||
CALL PPA_WAIT ; WAIT FOR BUS READY
|
||||
POP HL ; RESTORE BYTE COUNTER
|
||||
CP $D0 ; CHECK FOR READ PHASE
|
||||
JR NZ,PPA_GETDATA2 ; IF NOT, ASSUME WE ARE DONE
|
||||
PPA_WCTL($04)
|
||||
CALL PPA_READSTATUS ; GET FIRST NIBBLE
|
||||
AND $F0 ; ISOLATE BITS
|
||||
PUSH AF ; SAVE WORKING VALUE
|
||||
PPA_WCTL($06)
|
||||
CALL PPA_READSTATUS ; GET SECOND NIBBLE
|
||||
AND $F0 ; ISOLATE BITS
|
||||
RRCA ; AND SHIFT TO LOW NIBBLE
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
POP BC ; RECOVER LOW NIBBLE
|
||||
OR B ; COMBINE
|
||||
LD (DE),A ; AND SAVE THE FULL BYTE VALUE
|
||||
INC DE ; NEXT BUFFER POS
|
||||
INC HL ; INCREMENT BYTES COUNTER
|
||||
JR PPA_GETDATA1 ; LOOP TILL DONE
|
||||
;
|
||||
PPA_GETDATA2:
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXWORDHL
|
||||
PRTS(" BYTES$")
|
||||
#ENDIF
|
||||
;
|
||||
PPA_WCTL($0C)
|
||||
RET
|
||||
;
|
||||
PPA_GETBLOCK:
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nGETBLK:$")
|
||||
#ENDIF
|
||||
LD B,0 ; LOOP COUNTER
|
||||
EXX ; SWITCH TO ALT
|
||||
EX AF,AF' ; SWITCH TO ALT AF
|
||||
; SAVE ALT REGS
|
||||
PUSH AF
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
; C: PORT C
|
||||
LD A,(IY+PPA_IOBASE) ; BASE PORT
|
||||
INC A ; STATUS PORT
|
||||
LD (PPA_GETBLOCK_A),A ; FILL IN
|
||||
LD (PPA_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE
|
||||
INC A ; CONTROL PORT
|
||||
LD C,A ; ... TO C
|
||||
#IF (PPAMODE == PPAMODE_MG014)
|
||||
; DE: CLOCK VALUES
|
||||
LD D,$04 ^ ($0B | $80)
|
||||
LD E,$06 ^ ($0B | $80)
|
||||
; HL: STATMAP
|
||||
LD H,MG014_STATMAPLO >> 8
|
||||
#ENDIF
|
||||
#IF (PPAMODE == PPAMODE_SPP)
|
||||
; DE: CLOCK VALUES
|
||||
LD D,$04
|
||||
LD E,$06
|
||||
#ENDIF
|
||||
EXX ; SWITCH TO PRI
|
||||
CALL PPA_GETBLOCK1 ; LOOP TWICE
|
||||
CALL PPA_GETBLOCK1 ; ... FOR 512 BYTES
|
||||
; RESTORE ALT REGS
|
||||
EXX ; SWITCH TO ALT REGS
|
||||
EX AF,AF' ; SWITCH TO ALT AF
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
POP AF
|
||||
EXX ; SWITCH TO PRI REGS
|
||||
EX AF,AF' ; SWITCH TO PRI AF
|
||||
RET
|
||||
;
|
||||
;
|
||||
PPA_GETBLOCK1:
|
||||
EXX ; ALT REGS
|
||||
OUT (C),D ; SEND FIRST CLOCK
|
||||
PPA_GETBLOCK_A .EQU $+1
|
||||
IN A,($FF) ; GET HIGH NIBBLE
|
||||
#IF (PPAMODE == PPAMODE_MG014)
|
||||
AND $0F ; RELEVANT BITS ONLY
|
||||
ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR
|
||||
LD L,A ; PUT IN L
|
||||
LD A,(HL) ; LOOKUP HIGH NIBBLE VALUE
|
||||
EX AF,AF' ; SAVE NIBBLE
|
||||
#ENDIF
|
||||
#IF (PPAMODE == PPAMODE_SPP)
|
||||
AND $F0 ; RELEVANT BITS ONLY
|
||||
LD L,A ; SAVE NIBBLE IN L
|
||||
#ENDIF
|
||||
OUT (C),E ; SEND SECOND CLOCK
|
||||
PPA_GETBLOCK_B .EQU $+1
|
||||
IN A,($FF) ; GET LOW NIBBLE
|
||||
#IF (PPAMODE == PPAMODE_MG014)
|
||||
AND $0F ; RELEVANT BITS ONLY
|
||||
ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR
|
||||
LD L,A ; PUT IN L
|
||||
EX AF,AF' ; RECOVER HIGH NIBBLE VALUE
|
||||
OR (HL) ; COMBINE WITH LOW NIB VALUE
|
||||
#ENDIF
|
||||
#IF (PPAMODE == PPAMODE_SPP)
|
||||
AND $F0 ; RELEVANT BITS ONLY
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
RLCA ; MOVE TO LOW NIBBLE
|
||||
OR L ; COMBINE WITH HIGH NIB VALUE
|
||||
#ENDIF
|
||||
EXX ; SWITCH TO PRI
|
||||
LD (DE),A ; SAVE BYTE
|
||||
INC DE ; BUMP BUF PTR
|
||||
DJNZ PPA_GETBLOCK1 ; LOOP
|
||||
RET ; DONE
|
||||
;
|
||||
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR
|
||||
; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES)
|
||||
; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS
|
||||
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN
|
||||
; CHECK IN THIS CASE).
|
||||
;
|
||||
; DE=BUFFER
|
||||
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK)
|
||||
;
|
||||
PPA_PUTDATA:
|
||||
; BRANCH TO CORRECT ROUTINE
|
||||
OR A
|
||||
JR NZ,PPA_PUTBLOCK ; DO BLOCK WRITE
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nPUTDATA:$")
|
||||
#ENDIF
|
||||
;
|
||||
PPA_PUTDATA1:
|
||||
PUSH HL ; SAVE BYTE COUNTER
|
||||
CALL PPA_WAIT ; WAIT FOR BUS READY
|
||||
POP HL ; RESTORE BYTE COUNTER
|
||||
CP $C0 ; CHECK FOR WRITE PHASE
|
||||
JR NZ,PPA_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE
|
||||
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR)
|
||||
CALL PPA_WRITEDATA ; PUT ON BUS
|
||||
INC DE ; BUMP TO NEXT BUF POS
|
||||
INC HL ; INCREMENT COUNTER
|
||||
PPA_WCTL($0E)
|
||||
PPA_WCTL($0C)
|
||||
LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR)
|
||||
JR PPA_PUTDATA1 ; LOOP TILL DONE
|
||||
;
|
||||
PPA_PUTDATA2:
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXWORDHL
|
||||
PRTS(" BYTES$")
|
||||
#ENDIF
|
||||
;
|
||||
RET
|
||||
;
|
||||
PPA_PUTBLOCK:
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nPUTBLK:$")
|
||||
#ENDIF
|
||||
;
|
||||
LD B,0 ; LOOP COUNTER
|
||||
LD A,(IY+PPA_IOBASE) ; GET BASE IO ADR
|
||||
LD (PPA_PUTBLOCK_A),A ; FILL IN
|
||||
INC A ; STATUS PORT
|
||||
INC A ; CONTROL PORT
|
||||
LD C,A ; ... TO C
|
||||
; HL: CLOCK VALUES
|
||||
#IF (PPAMODE == PPAMODE_MG014)
|
||||
LD H,$0E ^ ($0B | $80)
|
||||
LD L,$0C ^ ($0B | $80)
|
||||
#ENDIF
|
||||
#IF (PPAMODE == PPAMODE_SPP)
|
||||
LD H,$0E
|
||||
LD L,$0C
|
||||
#ENDIF
|
||||
CALL PPA_PUTBLOCK1 ; DO BELOW TWICE
|
||||
CALL PPA_PUTBLOCK1 ; ... FOR 512 BYTES
|
||||
RET
|
||||
;
|
||||
PPA_PUTBLOCK1:
|
||||
LD A,(DE) ; GET NEXT BYTE
|
||||
PPA_PUTBLOCK_A .EQU $+1
|
||||
OUT ($FF),A ; PUT ON BUS
|
||||
INC DE ; INCREMENT BUF POS
|
||||
OUT (C),H ; FIRST CLOCK
|
||||
OUT (C),L ; SECOND CLOCK
|
||||
DJNZ PPA_PUTBLOCK1 ; LOOP
|
||||
RET ; DONE
|
||||
;
|
||||
; READ SCSI COMMAND STATUS
|
||||
;
|
||||
PPA_GETSTATUS:
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nSTATUS:$")
|
||||
#ENDIF
|
||||
;
|
||||
CALL PPA_GETBYTE ; GET ONE BYTE
|
||||
LD (PPA_CMDSTAT),A ; SAVE AS FIRST STATUS BYTE
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
CALL PPA_WAIT ; CHECK FOR OPTIONAL SECOND BYTE
|
||||
CP $F0 ; STILL IN STATUS PHASE?
|
||||
RET NZ ; IF NOT, DONE
|
||||
CALL PPA_GETBYTE ; ELSE, GET THE SECOND BYTE
|
||||
LD (PPA_CMDSTAT+1),A ; AND SAVE IT
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
RET
|
||||
;
|
||||
; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE
|
||||
; ON THE BUS, SENDS THE COMMAND, THEN PROCESSES THE RESULT.
|
||||
;
|
||||
; HL: COMMAND BUFFER
|
||||
; DE: TRANSFER BUFFER
|
||||
; BC: TRANSFER LENGTH (0=VARIABLE)
|
||||
; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK)
|
||||
;
|
||||
PPA_RUNCMD:
|
||||
; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT
|
||||
; ARE CALLED HERE. HERE WE SAVE THE STACK SO THAT WE CAN
|
||||
; EASILY AND QUICKLY ABORT OUT OF ANY NESTED ROUTINE.
|
||||
; SEE PPA_CMD_ERR BELOW.
|
||||
LD (PPA_CMDSTK),SP ; FOR ERROR ABORTS
|
||||
LD (PPA_DSKBUF),DE ; SAVE BUF PTR
|
||||
LD (PPA_XFRMODE),A ; SAVE XFER LEN
|
||||
PUSH HL
|
||||
CALL PPA_CONNECT ; PARALLEL PORT BUS CONNECT
|
||||
CALL PPA_SELECT ; SELECT TARGET DEVICE
|
||||
CALL PPA_WAIT ; WAIT TILL READY
|
||||
POP HL
|
||||
CALL PPA_SENDCMD ; SEND THE COMMAND
|
||||
;
|
||||
PPA_RUNCMD_PHASE:
|
||||
; WAIT FOR THE BUS TO BE READY. WE USE AN EXTRA LONG WAIT
|
||||
; TIMEOUT HERE BECAUSE THIS IS WHERE WE WILL WAIT FOR LONG
|
||||
; OPERATIONS TO COMPLETE. IT CAN TAKE SOME TIME IF THE
|
||||
; DEVICE HAS GONE TO SLEEP BECAUSE IT WILL NEED TO WAKE UP
|
||||
; AND SPIN UP BEFORE PROCESSING AN I/O COMMAND.
|
||||
CALL PPA_LONGWAIT ; WAIT TILL READY
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nPHASE: $")
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
CP $C0 ; DEVICE WANTS TO RCV DATA
|
||||
JR Z,PPA_RUNCMD_WRITE
|
||||
CP $D0 ; DEVICE WANTS TO SEND DATA
|
||||
JR Z,PPA_RUNCMD_READ
|
||||
CP $F0 ; DEVICE WANTS TO BE DONE
|
||||
JR Z,PPA_RUNCMD_END
|
||||
JR PPA_CMD_IOERR
|
||||
;
|
||||
PPA_RUNCMD_WRITE:
|
||||
LD DE,(PPA_DSKBUF) ; XFER BUFFER
|
||||
LD A,(PPA_XFRMODE) ; XFER MODE
|
||||
CALL PPA_PUTDATA ; SEND DATA NOW
|
||||
JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH
|
||||
;
|
||||
PPA_RUNCMD_READ:
|
||||
LD DE,(PPA_DSKBUF) ; XFER BUFFER
|
||||
LD A,(PPA_XFRMODE) ; XFER MODE
|
||||
CALL PPA_GETDATA ; GET THE DATA NOW
|
||||
JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH
|
||||
;
|
||||
PPA_RUNCMD_END:
|
||||
CALL PPA_GETSTATUS ; READ STATUS BYTES
|
||||
CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
PPA_CMD_IOERR:
|
||||
LD A,PPA_STIOERR ; ERROR VALUE TO A
|
||||
JR PPA_CMD_ERR ; CONTINUE
|
||||
;
|
||||
PPA_CMD_TIMEOUT:
|
||||
LD A,PPA_STTO ; ERROR VALUE TO A
|
||||
JR PPA_CMD_ERR ; CONTINUE
|
||||
;
|
||||
PPA_CMD_ERR:
|
||||
LD SP,(PPA_CMDSTK) ; UNWIND STACK
|
||||
PUSH AF ; SAVE STATUS
|
||||
;CALL PPA_RESETPULSE ; CLEAN UP THE MESS???
|
||||
LD DE,62 ; DELAY AFTER RESET PULSE
|
||||
CALL VDELAY
|
||||
CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT
|
||||
LD DE,62 ; DELAY AFTER DISCONNECT
|
||||
CALL VDELAY
|
||||
POP AF ; RECOVER STATUS
|
||||
JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING
|
||||
;
|
||||
; ERRORS SHOULD GENERALLY NOT CAUSE SCSI PROCESSING TO FAIL. IF A
|
||||
@@ -642,14 +1101,15 @@ PPA_CHKCMD:
|
||||
PPA_CHKCMD1:
|
||||
; USE REQUEST SENSE CMD TO GET ERROR DETAILS
|
||||
LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF
|
||||
LD BC,0 ; VARIABLE LENGTH REQUEST
|
||||
LD A,0 ; VARIABLE LENGTH READ
|
||||
LD HL,PPA_CMD_SENSE ; REQUEST SENSE CMD
|
||||
CALL PPA_RUNCMD ; DO IT
|
||||
JP NZ,PPA_IOERR ; BAIL IF ERROR IN CMD
|
||||
;
|
||||
; REQ SENSE CMD COMPLETED
|
||||
#IF (PPATRACE >= 3)
|
||||
LD A,16
|
||||
PRTS("\r\nSENSE:$")
|
||||
LD A,$19
|
||||
LD DE,HB_WRKBUF
|
||||
CALL Z,PRTHEXBUF
|
||||
#ENDIF
|
||||
@@ -678,6 +1138,8 @@ PPA_CHKERR:
|
||||
; (RE)INITIALIZE DEVICE
|
||||
;
|
||||
PPA_INITDEV:
|
||||
;
|
||||
#IF (PPAMODE == PPAMODE_MG014)
|
||||
; INITIALIZE 8255
|
||||
LD A,(IY+PPA_IOBASE) ; BASE PORT
|
||||
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT
|
||||
@@ -685,8 +1147,88 @@ PPA_INITDEV:
|
||||
LD A,$82 ; CONFIG A OUT, B IN, C OUT
|
||||
OUT (C),A ; DO IT
|
||||
CALL DELAY ; SHORT DELAY FOR BUS SETTLE
|
||||
#ENDIF
|
||||
;
|
||||
JP PPA_NOTSUP
|
||||
; BUS RESET
|
||||
CALL PPA_CONNECT
|
||||
CALL PPA_RESETPULSE
|
||||
LD DE,62 ; 1000 US
|
||||
CALL VDELAY
|
||||
CALL PPA_DISCONNECT
|
||||
LD DE,62 ; 1000 US
|
||||
CALL VDELAY
|
||||
;
|
||||
; INITIALLY, THE DEVICE MAY REQUIRE MULTIPLE REQUEST SENSE
|
||||
; COMMANDS BEFORE IT WILL ACCEPT I/O COMMANDS. THIS IS DUE
|
||||
; TO THINGS LIKE BUS RESET NOTIFICATION, MEDIA CHANGE, ETC.
|
||||
; HERE, WE RUN A FEW REQUEST SENSE COMMANDS. AS SOON AS ONE
|
||||
; INDICATES NO ERRORS, WE CAN CONTINUE.
|
||||
LD B,4 ; TRY UP TO 4 TIMES
|
||||
PPA_INITDEV1:
|
||||
PUSH BC ; SAVE LOOP COUNTER
|
||||
;
|
||||
; REQUEST SENSE COMMAND
|
||||
LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA
|
||||
LD A,0 ; READ WHATEVER IS SENT
|
||||
LD HL,PPA_CMD_SENSE ; POINT TO CMD BUFFER
|
||||
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
|
||||
JR NZ,PPA_INITDEV2 ; CMD PROC ERROR
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nSENSE:$")
|
||||
LD A,$19
|
||||
LD DE,HB_WRKBUF
|
||||
CALL PRTHEXBUF
|
||||
#ENDIF
|
||||
;
|
||||
; CHECK SENSE KEY
|
||||
LD A,(HB_WRKBUF + 2) ; GET SENSE KEY
|
||||
OR A ; SET FLAGS
|
||||
;
|
||||
PPA_INITDEV2:
|
||||
POP BC ; RESTORE LOOP COUNTER
|
||||
JR Z,PPA_INITDEV3 ; IF NO ERROR, MOVE ON
|
||||
DJNZ PPA_INITDEV1 ; TRY UNTIL COUNTER EXHAUSTED
|
||||
JP PPA_IOERR ; BAIL OUT WITH ERROR
|
||||
;
|
||||
PPA_INITDEV3:
|
||||
; READ & RECORD DEVICE CAPACITY
|
||||
LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE
|
||||
LD A,0 ; READ WHATEVER IS SENT
|
||||
LD HL,PPA_CMD_RDCAP ; POINT TO READ CAPACITY CMD
|
||||
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE
|
||||
CALL Z,PPA_CHKCMD ; CHECK AND RECORD ANY ERRORS
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
#IF (PPATRACE >= 3)
|
||||
PRTS("\r\nRDCAP:$")
|
||||
LD A,8
|
||||
LD DE,HB_WRKBUF
|
||||
CALL PRTHEXBUF
|
||||
#ENDIF
|
||||
;
|
||||
; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND
|
||||
; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO
|
||||
; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY
|
||||
; COUNT INSTEAD OF A LAST LBA VALUE.
|
||||
LD A,PPA_MEDCAP ; OFFSET IN CFG FOR CAPACITY
|
||||
CALL LDHLIYA ; POINTER TO HL
|
||||
PUSH HL ; SAVE IT
|
||||
LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT
|
||||
CALL LD32 ; LOAD IT TO DE:HL
|
||||
LD A,L ; FLIP BYTES
|
||||
LD L,D ; ... BIG ENDIAN
|
||||
LD D,A ; ... TO LITTLE ENDIAN
|
||||
LD A,H
|
||||
LD H,E
|
||||
LD E,A
|
||||
CALL INC32 ; INCREMENT TO FINAL VALUE
|
||||
POP BC ; RECOVER SAVE LOCATION
|
||||
CALL ST32 ; STORE VALUE
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
LD (IY+PPA_STAT),A ; RECORD IT
|
||||
RET
|
||||
;
|
||||
;=============================================================================
|
||||
; ERROR HANDLING AND DIAGNOSTICS
|
||||
@@ -719,7 +1261,7 @@ PPA_ERR:
|
||||
LD (IY+PPA_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
PPA_ERR2:
|
||||
#IF (PPATRACE >= 1)
|
||||
#IF (PPATRACE >= 2)
|
||||
CALL PPA_PRTSTAT
|
||||
#ENDIF
|
||||
OR A ; SET FLAGS
|
||||
@@ -772,7 +1314,7 @@ PPA_PRTPREFIX:
|
||||
PUSH AF
|
||||
CALL NEWLINE
|
||||
PRTS("PPA$")
|
||||
LD A,(IY+IMM_DEV) ; GET CURRENT DEVICE NUM
|
||||
LD A,(IY+PPA_DEV) ; GET CURRENT DEVICE NUM
|
||||
CALL PRTDECB
|
||||
CALL PC_COLON
|
||||
POP AF
|
||||
@@ -816,7 +1358,7 @@ PPA_STR_NOHW .TEXT "NOT PRESENT$"
|
||||
PPA_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
PPA_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING
|
||||
PPA_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER
|
||||
PPA_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH
|
||||
PPA_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES)
|
||||
PPA_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS
|
||||
;
|
||||
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
;
|
||||
; TODO:
|
||||
; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION
|
||||
; - DATA TRANSFERS LIMITED TO 512 BYTES WHICH IS INSUFFICIENT FOR CD=ROM MEDIA
|
||||
;
|
||||
; NOTES:
|
||||
; - WELL KNOWN PPIDE PORT ADDRESSES:
|
||||
@@ -135,6 +136,8 @@ PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1 | $03 ; LBA BYTE 0 (BITS 0-7) (R/W)
|
||||
PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1 | $04 ; LBA BYTE 1 (BITS 8-15) (R/W)
|
||||
PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1 | $05 ; LBA BYTE 2 (BITS 16-23) (R/W)
|
||||
PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1 | $06 ; LBA BYTE 3 (BITS 24-27) (R/W)
|
||||
PPIDE_REG_BCL .EQU PPIDE_CTL_CS1 | $04 ; PKT BYTE COUNT LOW (BITS 0-7) (R/W)
|
||||
PPIDE_REG_BCH .EQU PPIDE_CTL_CS1 | $05 ; PKT BYTE COUNT HIGH (BITS 8-15) (R/W)
|
||||
PPIDE_REG_STAT .EQU PPIDE_CTL_CS1 | $07 ; STATUS REGISTER (R)
|
||||
PPIDE_REG_CMD .EQU PPIDE_CTL_CS1 | $07 ; COMMAND REGISTER (EXECUTE) (W)
|
||||
PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3 | $06 ; ALTERNATE STATUS REGISTER (R)
|
||||
@@ -143,13 +146,14 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3 | $07 ; DRIVE ADDRESS REGISTER (R)
|
||||
;
|
||||
; COMMAND BYTES
|
||||
;
|
||||
PPIDE_CIDE_NOP .EQU $00
|
||||
PPIDE_CIDE_DEVRES .EQU $08
|
||||
PPIDE_CMD_NOP .EQU $00
|
||||
PPIDE_CMD_DEVRES .EQU $08
|
||||
PPIDE_CMD_RECAL .EQU $10
|
||||
PPIDE_CMD_READ .EQU $20
|
||||
PPIDE_CMD_WRITE .EQU $30
|
||||
PPIDE_CIDE_DEVDIAG .EQU $90
|
||||
PPIDE_CIDE_IDPKTDEV .EQU $A1
|
||||
PPIDE_CMD_DEVDIAG .EQU $90
|
||||
PPIDE_CMD_PACKET .EQU $A0
|
||||
PPIDE_CMD_IDPKTDEV .EQU $A1
|
||||
PPIDE_CMD_IDDEV .EQU $EC
|
||||
PPIDE_CMD_SETFEAT .EQU $EF
|
||||
;
|
||||
@@ -175,6 +179,7 @@ PPIDE_STRDYTO .EQU -5
|
||||
PPIDE_STDRQTO .EQU -6
|
||||
PPIDE_STBSYTO .EQU -7
|
||||
PPIDE_STNOTSUP .EQU -8
|
||||
PPIDE_STNOTRDY .EQU -9
|
||||
;
|
||||
; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER)
|
||||
;
|
||||
@@ -407,10 +412,6 @@ PPIDE_INIT5:
|
||||
JP NZ,PPIDE_PRTSTATSTR ; EXIT VIA PRINT STATUS STRING
|
||||
;
|
||||
PPIDE_INIT6:
|
||||
LD A,(IY+PPIDE_TYPE) ; GET DEVICE TYPE
|
||||
CP PPIDE_TYPEATA ; ATA?
|
||||
RET NZ ; IF NOT, THEN DONE
|
||||
;
|
||||
LD DE,PPIDE_STR_8BIT
|
||||
BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS?
|
||||
CALL NZ,WRITESTR
|
||||
@@ -526,12 +527,12 @@ PPIDE_IO:
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
#ENDIF
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
|
||||
CALL PPIDE_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO
|
||||
POP BC ; RESTORE COUNTERS
|
||||
JR NZ,PPIDE_IO3 ; BAIL OUT ON ERROR
|
||||
PPIDE_IO1:
|
||||
PUSH BC ; SAVE COUNTERS
|
||||
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
|
||||
LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
|
||||
CALL JPHL ; ... AND CALL IT
|
||||
JR NZ,PPIDE_IO2 ; IF ERROR, SKIP INCREMENT
|
||||
@@ -571,10 +572,14 @@ PPIDE_STATUS:
|
||||
PPIDE_DEVICE:
|
||||
LD D,DIODEV_PPIDE ; D := DEVICE TYPE
|
||||
LD E,(IY+PPIDE_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%01111001 ; ATAPI ATTRIBUTES
|
||||
LD A,(IY+PPIDE_TYPE) ; CHECK TYPE VALUE
|
||||
CP PPIDE_TYPEATAPI ; ATAPI?
|
||||
JR Z,PPIDE_DEVICE1 ; IF SO, DONE
|
||||
LD C,%00110001 ; COMPACTFLASH ATTRIBUTES
|
||||
BIT 0,(IY+PPIDE_MED) ; TEST CF BIT IN FLAGS
|
||||
LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK
|
||||
JR Z,PPIDE_DEVICE1 ; IF Z, WE ARE DONE
|
||||
LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH
|
||||
JR NZ,PPIDE_DEVICE1 ; IF SET, DONE
|
||||
LD C,%00110000 ; GENERIC HARD DISK ATTRIBUTES
|
||||
PPIDE_DEVICE1:
|
||||
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
||||
LD L,(IY+PPIDE_DATALO) ; L := BASE I/O ADDRESS
|
||||
@@ -644,8 +649,6 @@ PPIDE_GEOM:
|
||||
; FUNCTION SUPPORT ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_SETFEAT:
|
||||
PUSH AF
|
||||
#IF (PPIDETRACE >= 3)
|
||||
@@ -674,32 +677,6 @@ PPIDE_SETFEAT:
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_NOP:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_PRTPREFIX
|
||||
PRTS(" NOP$")
|
||||
#ENDIF
|
||||
LD A,(PPIDE_DRVHD)
|
||||
;OUT (PPIDE_IO_DRVHD),A
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_DRVHD
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
; EXECUTE THE NOP COMMAND, BUT DON'T WAIT FOR DRDY, JUST
|
||||
; MAKE SURE BUSY IS CLEAR. THIS COMMAND IS USED DURING
|
||||
; DEVICE DETECTION/INITIALIZATION AND ATAPI DEVICES WILL
|
||||
; NOT ASSERT DRDY AFTER RESET.
|
||||
LD A,PPIDE_CIDE_NOP ; CMD = NOP
|
||||
LD (PPIDE_CMD),A ; SAVE IT
|
||||
CALL PPIDE_WAITBSY
|
||||
RET NZ
|
||||
JP PPIDE_RUNCMD1 ; RUN COMMAND AND EXIT
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_IDENTIFY:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_PRTPREFIX
|
||||
@@ -715,8 +692,13 @@ PPIDE_IDENTIFY:
|
||||
#ENDIF
|
||||
LD A,PPIDE_CMD_IDDEV
|
||||
LD (PPIDE_CMD),A
|
||||
CALL PPIDE_RUNCMD
|
||||
CALL PPIDE_RUNCMD_ND
|
||||
RET NZ
|
||||
;
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_STAT
|
||||
BIT 3,A ; IS DRQ SET?
|
||||
JP Z,PPIDE_NOMEDIA
|
||||
;
|
||||
LD HL,HB_WRKBUF
|
||||
JP PPIDE_GETBUF ; EXIT THRU BUFRD
|
||||
@@ -729,21 +711,21 @@ PPIDE_IDENTIFYPACKET:
|
||||
PRTS(" IDPKTDEV$")
|
||||
#ENDIF
|
||||
LD A,(PPIDE_DRVHD)
|
||||
;OUT (PPIDE_IO_DRVHD),A
|
||||
;OUT (PPIDE_REG_DRVHD),A
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_DRVHD
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
LD A,PPIDE_CIDE_IDPKTDEV
|
||||
LD A,PPIDE_CMD_IDPKTDEV
|
||||
LD (PPIDE_CMD),A
|
||||
CALL PPIDE_RUNCMD
|
||||
CALL PPIDE_RUNCMD_ND
|
||||
RET NZ
|
||||
;
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_STAT
|
||||
BIT 6,A ; IS DRQ SET?
|
||||
BIT 3,A ; IS DRQ SET?
|
||||
JP Z,PPIDE_NOMEDIA
|
||||
;
|
||||
LD HL,HB_WRKBUF
|
||||
@@ -751,6 +733,33 @@ PPIDE_IDENTIFYPACKET:
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_PACKET:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_PRTPREFIX
|
||||
PRTS(" PACKET$")
|
||||
#ENDIF
|
||||
LD A,(PPIDE_DRVHD)
|
||||
;OUT (PPIDE_REG_DRVHD),A
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_DRVHD
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
XOR A ; ZERO
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_FEAT ; FEATURE REG = 0
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_BCL
|
||||
LD A,8
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_BCH ; BYTE COUNT = 512????
|
||||
LD A,PPIDE_CMD_PACKET
|
||||
LD (PPIDE_CMD),A
|
||||
JP PPIDE_RUNCMD_ND
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_RDSEC:
|
||||
;
|
||||
#IF (PPIDETRACE >= 3)
|
||||
@@ -764,6 +773,17 @@ PPIDE_RDSEC:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
LD A,(IY+PPIDE_TYPE)
|
||||
CP PPIDE_TYPEATA
|
||||
JR Z,PPIDE_ATA_RDSEC
|
||||
CP PPIDE_TYPEATAPI
|
||||
JR Z,PPIDE_PKT_RDSEC
|
||||
JP PPIDE_CMDERR
|
||||
;
|
||||
PPIDE_ATA_RDSEC:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS(" ATA$")
|
||||
#ENDIF
|
||||
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
|
||||
LD A,PPIDE_CMD_READ
|
||||
@@ -773,6 +793,38 @@ PPIDE_RDSEC:
|
||||
LD HL,(PPIDE_DSKBUF)
|
||||
JP PPIDE_GETBUF
|
||||
;
|
||||
PPIDE_PKT_RDSEC:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS(" PKT$")
|
||||
#ENDIF
|
||||
; SETUP LBA
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
LD A,PPIDE_LBA
|
||||
CALL LDHLIYA
|
||||
CALL HB_DSKACT ; SHOW ACTIVITY
|
||||
#ENDIF
|
||||
;
|
||||
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
|
||||
LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB)
|
||||
LD A,(IY+PPIDE_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,(IY+PPIDE_LBA+1)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,(IY+PPIDE_LBA+0)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD HL,PPIDE_PKTCMD_RW10
|
||||
LD A,SCSI_CMD_READ10
|
||||
LD (HL),A
|
||||
XOR A ; READ DIRECTION
|
||||
LD (PPIDE_XFRDIR),A ; SAVE IT
|
||||
CALL PPIDE_RUNPCMD
|
||||
JP NZ,PPIDE_CHKPCMD
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_WRSEC:
|
||||
@@ -788,6 +840,17 @@ PPIDE_WRSEC:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
LD A,(IY+PPIDE_TYPE)
|
||||
CP PPIDE_TYPEATA
|
||||
JR Z,PPIDE_ATA_WRSEC
|
||||
CP PPIDE_TYPEATAPI
|
||||
JR Z,PPIDE_PKT_WRSEC
|
||||
JP PPIDE_CMDERR
|
||||
;
|
||||
PPIDE_ATA_WRSEC:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS(" ATA$")
|
||||
#ENDIF
|
||||
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
|
||||
LD A,PPIDE_CMD_WRITE
|
||||
@@ -797,6 +860,38 @@ PPIDE_WRSEC:
|
||||
LD HL,(PPIDE_DSKBUF)
|
||||
JP PPIDE_PUTBUF
|
||||
;
|
||||
PPIDE_PKT_WRSEC:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS(" PKT$")
|
||||
#ENDIF
|
||||
; SETUP LBA
|
||||
;
|
||||
#IF (DSKYENABLE)
|
||||
LD A,PPIDE_LBA
|
||||
CALL LDHLIYA
|
||||
CALL HB_DSKACT ; SHOW ACTIVITY
|
||||
#ENDIF
|
||||
;
|
||||
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN
|
||||
LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB)
|
||||
LD A,(IY+PPIDE_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,(IY+PPIDE_LBA+1)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD A,(IY+PPIDE_LBA+0)
|
||||
LD (HL),A
|
||||
INC HL
|
||||
LD HL,PPIDE_PKTCMD_RW10
|
||||
LD A,SCSI_CMD_WRITE10
|
||||
LD (HL),A
|
||||
OR $FF ; WRITE DIRECTION
|
||||
LD (PPIDE_XFRDIR),A ; SAVE IT
|
||||
CALL PPIDE_RUNPCMD
|
||||
JP NZ,PPIDE_CHKPCMD
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPIDE_SETADDR:
|
||||
@@ -807,8 +902,8 @@ PPIDE_SETADDR:
|
||||
CALL HB_DSKACT ; SHOW ACTIVITY
|
||||
#ENDIF
|
||||
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER
|
||||
; IDE_IO_LBA3 HAS ALREADY BEEN SET
|
||||
; HSTLBA2-0 --> IDE_IO_LBA2-0
|
||||
; IDE_REG_LBA3 HAS ALREADY BEEN SET
|
||||
; HSTLBA2-0 --> IDE_REG_LBA2-0
|
||||
LD A,(IY+PPIDE_LBA+2)
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
@@ -847,6 +942,16 @@ PPIDE_SETADDR:
|
||||
; COMMAND PROCESSING
|
||||
;=============================================================================
|
||||
;
|
||||
; RUN AN ATA COMMAND. THERE ARE TWO ENTRY POINTS. THE NORMAL ENTRY
|
||||
; POINT WILL WAIT FOR DRIVE READY. THE _ND ENTRY POINT ONLY WAITS
|
||||
; FOR THE DEVICE TO BE NOT BUSY. THE CORRECT ENTRY POINT DEPENDS ON
|
||||
; THE COMMAND.
|
||||
;
|
||||
PPIDE_RUNCMD_ND:
|
||||
CALL PPIDE_WAITBSY ; WAIT WHILE DEVICE BUSY
|
||||
RET NZ ; BAIL OUT ON TIMEOUT
|
||||
JR PPIDE_RUNCMD1 ; CONTINUE
|
||||
|
||||
PPIDE_RUNCMD:
|
||||
CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY
|
||||
RET NZ ; BAIL OUT ON TIMEOUT
|
||||
@@ -871,54 +976,153 @@ PPIDE_RUNCMD1:
|
||||
JP NZ,PPIDE_CMDERR
|
||||
RET
|
||||
;
|
||||
; PACKET COMMAND PROCESSOR
|
||||
; HL: ADDRESS OF PACKET COMMAND BUFFER
|
||||
;
|
||||
PPIDE_RUNPCMD:
|
||||
PUSH HL
|
||||
CALL PPIDE_PACKET
|
||||
POP HL
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS("\r\nPKTCMD:$")
|
||||
PUSH HL
|
||||
POP DE
|
||||
LD A,12
|
||||
CALL PRTHEXBUF
|
||||
#ENDIF
|
||||
;
|
||||
; IF ZIP DRIVE HAS FALLEN ASLEEP, THEN IT WILL NEED EXTRA
|
||||
; TIME HERE TO WAKE UP BEFORE ACCEPTING THE COMMAND. USE
|
||||
; LONG TIMEOUT TO ACCOMMODATE THIS.
|
||||
LD DE,(PPIDE_TIMEOUT) ; GET CURRENT TIMEOUT
|
||||
PUSH DE ; SAVE IT
|
||||
LD DE,PPIDE_TOSLOW ; SLOW TIMEOUT FOR THIS
|
||||
LD (PPIDE_TIMEOUT),DE ; SET IT
|
||||
LD B,6 ; 6 WORDS ALWAYS
|
||||
CALL PPIDE_PUT
|
||||
POP DE ; RECOVER TIMEOUT
|
||||
LD (PPIDE_TIMEOUT),DE ; SET IT
|
||||
RET NZ
|
||||
;
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_STAT
|
||||
BIT 3,A ; IS DRQ SET?
|
||||
RET Z ; IF NOT, ALL DONE
|
||||
;
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_BCL
|
||||
LD C,A
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_BCH
|
||||
LD B,A
|
||||
;
|
||||
; BELOW ASSUMES MAX TRANSFER OF 512 BYTES!!!
|
||||
PUSH BC ; SAVE BYTE COUNT
|
||||
SRL B ; CONVERT
|
||||
RR C ; ... TO WORDS
|
||||
LD B,C
|
||||
;LD HL,HB_WRKBUF ; SET XFR BUFFER
|
||||
LD HL,(PPIDE_DSKBUF) ; SET XFR BUFFER
|
||||
|
||||
LD A,(PPIDE_XFRDIR)
|
||||
OR A
|
||||
JR NZ,PPIDE_RUNPCMD2 ; NZ = WRITE
|
||||
CALL PPIDE_GET ; GET SOME DATA
|
||||
JR PPIDE_RUNPCMD3
|
||||
PPIDE_RUNPCMD2:
|
||||
CALL PPIDE_PUT ; PUT SOME DATA
|
||||
PPIDE_RUNPCMD3:
|
||||
POP BC ; RESTORE BYTE COUNT
|
||||
RET NZ ; BAIL OUT ON ERRORS
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; THE FOLLOWING IS USED TO ASSESS ANY ERROR THAT OCCURS DURING
|
||||
; RUNCMD AND SET AN APPROPRIATE ERROR CODE.
|
||||
;
|
||||
PPIDE_CHKPCMD:
|
||||
;
|
||||
LD HL,HB_WRKBUF
|
||||
LD (PPIDE_DSKBUF),HL
|
||||
LD HL,PPIDE_PKTCMD_SENSE
|
||||
CALL PPIDE_RUNPCMD
|
||||
RET NZ
|
||||
;
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_BCL
|
||||
;
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL NEWLINE
|
||||
LD DE,HB_WRKBUF
|
||||
CALL PRTHEXBUF
|
||||
#ENDIF
|
||||
;
|
||||
; ASSESS SENSE DATA AND SET APPROPRIATE ERROR
|
||||
LD A,(HB_WRKBUF+12)
|
||||
CP $3A
|
||||
JP Z,PPIDE_NOMEDIA
|
||||
CP $04
|
||||
JP Z,PPIDE_NOTRDY
|
||||
;
|
||||
JP PPIDE_CMDERR
|
||||
;
|
||||
; HL=BUFFER
|
||||
;
|
||||
PPIDE_GETBUF:
|
||||
LD B,0
|
||||
; FALL THRU!!!
|
||||
;
|
||||
; HL=BUFFER
|
||||
; B=WORD COUNT, 0=256
|
||||
;
|
||||
PPIDE_GET:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS(" GETBUF$")
|
||||
PRTS(" GET$")
|
||||
#ENDIF
|
||||
;
|
||||
; WAIT FOR BUFFER
|
||||
PUSH BC
|
||||
PUSH HL
|
||||
CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY
|
||||
POP HL
|
||||
POP BC
|
||||
RET NZ ; BAIL OUT IF TIMEOUT
|
||||
;
|
||||
; SETUP PPI TO READ
|
||||
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ
|
||||
;OUT (PPIDE_IO_PPI),A ; DO IT
|
||||
;OUT (PPIDE_REG_PPI),A ; DO IT
|
||||
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
|
||||
OUT (C),A ; WRITE IT
|
||||
;
|
||||
; SELECT READ/WRITE IDE REGISTER
|
||||
LD A,PPIDE_REG_DATA ; DATA REGISTER
|
||||
;OUT (PPIDE_IO_CTL),A ; DO IT
|
||||
;OUT (PPIDE_REG_CTL),A ; DO IT
|
||||
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
OUT (C),A ; DO IT
|
||||
LD E,A ; E := READ UNASSERTED
|
||||
XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT
|
||||
LD D,A ; D := READ ASSERTED
|
||||
;
|
||||
; LOOP SETUP
|
||||
XOR A ; IMPORTANT, NEEDED FOR LOOP END COMPARISON
|
||||
LD B,0 ; 256 ITERATIONS
|
||||
LD A,B ; LOOP COUNTER IN A
|
||||
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
;
|
||||
BIT 1,(IY+PPIDE_ACC) ; 8 BIT?
|
||||
JR Z,PPIDE_GETBUF1 ; IF NOT, DO 16 BIT
|
||||
CALL PPIDE_GETBUF8 ; FIRST PASS (FIRST 256 BYTES)
|
||||
CALL PPIDE_GETBUF8 ; SECOND PASS (LAST 256 BYTES)
|
||||
JR PPIDE_GETBUF2 ; CONTINUE
|
||||
PPIDE_GETBUF1:
|
||||
CALL PPIDE_GETBUF16 ; FIRST PASS (FIRST 256 BYTES)
|
||||
CALL PPIDE_GETBUF16 ; SECOND PASS (LAST 256 BYTES)
|
||||
PPIDE_GETBUF2:
|
||||
JR Z,PPIDE_GET1 ; IF NOT, DO 16 BIT
|
||||
CALL PPIDE_GET8 ; 8-BIT READ
|
||||
JR PPIDE_GET2 ; CONTINUE
|
||||
PPIDE_GET1:
|
||||
CALL PPIDE_GET16 ; 16-0BIT READ
|
||||
PPIDE_GET2:
|
||||
CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED!
|
||||
RET NZ
|
||||
CALL PPIDE_GETRES
|
||||
JP NZ,PPIDE_IOERR
|
||||
RET
|
||||
;
|
||||
PPIDE_GETBUF8: ; 8 BIT WIDE READ LOOP
|
||||
; ENTER W/ C = PPIDE_IO_CTL
|
||||
PPIDE_GET8: ; 8 BIT WIDE READ LOOP
|
||||
; ENTER W/ C = PPIDE_REG_CTL
|
||||
OUT (C),D ; ASSERT READ
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
@@ -926,12 +1130,19 @@ PPIDE_GETBUF8: ; 8 BIT WIDE READ LOOP
|
||||
INC C ; LSB -> MSB
|
||||
INC C ; MSB -> CTL
|
||||
OUT (C),E ; DEASSERT READ
|
||||
CP B ; B == A == 0?
|
||||
JR NZ,PPIDE_GETBUF8 ; LOOP UNTIL DONE
|
||||
OUT (C),D ; ASSERT READ
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
INI ; READ FROM LSB
|
||||
INC C ; LSB -> MSB
|
||||
INC C ; MSB -> CTL
|
||||
OUT (C),E ; DEASSERT READ
|
||||
DEC A
|
||||
JR NZ,PPIDE_GET8 ; LOOP UNTIL DONE
|
||||
RET
|
||||
;
|
||||
PPIDE_GETBUF16: ; 16 BIT WIDE READ LOOP
|
||||
; ENTER W/ C = PPIDE_IO_CTL
|
||||
PPIDE_GET16: ; 16 BIT WIDE READ LOOP
|
||||
; ENTER W/ C = PPIDE_REG_CTL
|
||||
OUT (C),D ; ASSERT READ
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
@@ -940,30 +1151,41 @@ PPIDE_GETBUF16: ; 16 BIT WIDE READ LOOP
|
||||
INI ; READ MSB FOR 16 BIT
|
||||
INC C ; MSB -> CTL
|
||||
OUT (C),E ; DEASSERT READ
|
||||
CP B ; B == A == 0?
|
||||
JR NZ,PPIDE_GETBUF16 ; LOOP UNTIL DONE
|
||||
DEC A
|
||||
JR NZ,PPIDE_GET16 ; LOOP UNTIL DONE
|
||||
RET
|
||||
;
|
||||
;
|
||||
; HL=BUFFER
|
||||
;
|
||||
PPIDE_PUTBUF:
|
||||
LD B,0
|
||||
; FALL THRU!!!
|
||||
;
|
||||
; HL=BUFFER
|
||||
; B=WORD COUNT, 0=256
|
||||
;
|
||||
PPIDE_PUT:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS(" PUTBUF$")
|
||||
PRTS(" PUT$")
|
||||
#ENDIF
|
||||
;
|
||||
; WAIT FOR BUFFER
|
||||
PUSH BC
|
||||
PUSH HL
|
||||
CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY
|
||||
POP HL
|
||||
POP BC
|
||||
RET NZ ; BAIL OUT IF TIMEOUT
|
||||
;
|
||||
; SETUP PPI TO WRITE
|
||||
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE
|
||||
;OUT (PPIDE_IO_PPI),A ; DO IT
|
||||
;OUT (PPIDE_REG_PPI),A ; DO IT
|
||||
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
|
||||
OUT (C),A ; WRITE IT
|
||||
;
|
||||
; SELECT READ/WRITE IDE REGISTER
|
||||
LD A,PPIDE_REG_DATA ; DATA REGISTER
|
||||
;OUT (PPIDE_IO_CTL),A ; DO IT
|
||||
;OUT (PPIDE_REG_CTL),A ; DO IT
|
||||
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
OUT (C),A ; DO IT
|
||||
LD E,A ; E := WRITE UNASSERTED
|
||||
@@ -971,26 +1193,22 @@ PPIDE_PUTBUF:
|
||||
LD D,A ; D := WRITE ASSERTED
|
||||
;
|
||||
; LOOP SETUP
|
||||
XOR A ; IMPORTANT, NEEDED FOR LOOP END COMPARISON
|
||||
LD B,0 ; 256 ITERATIONS
|
||||
LD A,B ; LOOP COUNTER IN A
|
||||
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
;
|
||||
BIT 1,(IY+PPIDE_ACC) ; 8 BIT?
|
||||
JR Z,PPIDE_PUTBUF1 ; IF NOT, DO 16 BIT
|
||||
CALL PPIDE_PUTBUF8 ; FIRST PASS (FIRST 256 BYTES)
|
||||
CALL PPIDE_PUTBUF8 ; SECOND PASS (LAST 256 BYTES)
|
||||
JR PPIDE_PUTBUF2 ; CONTINUE
|
||||
PPIDE_PUTBUF1:
|
||||
CALL PPIDE_PUTBUF16 ; FIRST PASS (FIRST 256 BYTES)
|
||||
CALL PPIDE_PUTBUF16 ; SECOND PASS (LAST 256 BYTES)
|
||||
PPIDE_PUTBUF2:
|
||||
JR Z,PPIDE_PUT1 ; IF NOT, DO 16 BIT
|
||||
CALL PPIDE_PUT8 ; SECOND PASS (LAST 256 BYTES)
|
||||
JR PPIDE_PUT2 ; CONTINUE
|
||||
PPIDE_PUT1:
|
||||
CALL PPIDE_PUT16 ; FIRST PASS (FIRST 256 BYTES)
|
||||
PPIDE_PUT2:
|
||||
CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED!
|
||||
RET NZ
|
||||
CALL PPIDE_GETRES
|
||||
JP NZ,PPIDE_IOERR
|
||||
RET
|
||||
;
|
||||
PPIDE_PUTBUF8: ; 8 BIT WIDE WRITE LOOP
|
||||
PPIDE_PUT8: ; 8 BIT WIDE WRITE LOOP
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
OUTI ; WRITE NEXT BYTE (LSB)
|
||||
@@ -998,11 +1216,18 @@ PPIDE_PUTBUF8: ; 8 BIT WIDE WRITE LOOP
|
||||
INC C ; MSB -> CTL
|
||||
OUT (C),D ; ASSERT WRITE
|
||||
OUT (C),E ; DEASSERT WRITE
|
||||
CP B ; B == A == 0?
|
||||
JR NZ,PPIDE_PUTBUF8 ; LOOP UNTIL DONE
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
OUTI ; WRITE NEXT BYTE (LSB)
|
||||
INC C ; LSB -> MSB
|
||||
INC C ; MSB -> CTL
|
||||
OUT (C),D ; ASSERT WRITE
|
||||
OUT (C),E ; DEASSERT WRITE
|
||||
DEC A
|
||||
JR NZ,PPIDE_PUT8 ; LOOP UNTIL DONE
|
||||
RET
|
||||
;
|
||||
PPIDE_PUTBUF16: ; 16 BIT WIDE WRITE LOOP
|
||||
PPIDE_PUT16: ; 16 BIT WIDE WRITE LOOP
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
OUTI ; WRITE NEXT BYTE (LSB)
|
||||
@@ -1011,8 +1236,8 @@ PPIDE_PUTBUF16: ; 16 BIT WIDE WRITE LOOP
|
||||
INC C ; MSB -> CTL
|
||||
OUT (C),D ; ASSERT WRITE
|
||||
OUT (C),E ; DEASSERT WRITE
|
||||
CP B ; B == A == 0?
|
||||
JR NZ,PPIDE_PUTBUF16 ; LOOP UNTIL DONE
|
||||
DEC A
|
||||
JR NZ,PPIDE_PUT16 ; LOOP UNTIL DONE
|
||||
RET
|
||||
;
|
||||
;
|
||||
@@ -1057,7 +1282,7 @@ PPIDE_RESET:
|
||||
;
|
||||
; SETUP PPI TO READ
|
||||
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ
|
||||
;OUT (PPIDE_IO_PPI),A ; DO IT
|
||||
;OUT (PPIDE_REG_PPI),A ; DO IT
|
||||
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
|
||||
OUT (C),A ; WRITE IT
|
||||
;
|
||||
@@ -1082,13 +1307,13 @@ PPIDE_RESET:
|
||||
PRTS(" HARD$")
|
||||
#ENDIF
|
||||
LD A,PPIDE_CTL_RESET
|
||||
;OUT (PPIDE_IO_CTL),A
|
||||
;OUT (PPIDE_REG_CTL),A
|
||||
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
OUT (C),A
|
||||
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
|
||||
CALL VDELAY
|
||||
XOR A
|
||||
;OUT (PPIDE_IO_CTL),A
|
||||
;OUT (PPIDE_REG_CTL),A
|
||||
OUT (C),A
|
||||
LD DE,20
|
||||
CALL VDELAY
|
||||
@@ -1125,7 +1350,7 @@ PPIDE_RESET2:
|
||||
PRTS(" SOFT$")
|
||||
#ENDIF
|
||||
LD A,%00001110 ; ASSERT RESET, NO INTERRUPTS
|
||||
;OUT (PPIDE_IO_CTRL),A
|
||||
;OUT (PPIDE_REG_CTRL),A
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_CTRL
|
||||
LD DE,20 ; DELAY 320US (SPEC IS >= 25US)
|
||||
@@ -1224,7 +1449,7 @@ PPIDE_PROBE:
|
||||
;
|
||||
; SELECT DEVICE (MASTER/SLAVE)
|
||||
LD A,(PPIDE_DRVHD)
|
||||
;OUT (IDE_IO_DRVHD),A
|
||||
;OUT (IDE_REG_DRVHD),A
|
||||
CALL PPIDE_OUT
|
||||
.DB PPIDE_REG_DRVHD
|
||||
#IF (PPIDETRACE >= 3)
|
||||
@@ -1275,7 +1500,7 @@ PPIDE_PROBE:
|
||||
;
|
||||
; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE
|
||||
; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1
|
||||
; IS TO MAINTAIN CONSISTENCY WITH TGHE THE PPIDE DRIVER BECAUSE
|
||||
; IS TO MAINTAIN CONSISTENCY WITH THE THE PPIDE DRIVER BECAUSE
|
||||
; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE
|
||||
; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE.
|
||||
;
|
||||
@@ -1326,22 +1551,26 @@ PPIDE_INITDEV:
|
||||
PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS
|
||||
#ENDIF
|
||||
;
|
||||
; IF THE IDE STATUS BYTE IS $00, WE HAVE EITHER A NON-PRESENT SLAVE
|
||||
; OR AN ATAPI DEVICE. TO DIFFERENTIATE THESE POSSIBILITIES, WE RUN
|
||||
; A NOP COMMAND. IF WE HAVE AN ATAPI DEVICE, THIS WILL CAUSE THE
|
||||
; STATUS BYTE TO BE "NORMAL" (NON-ZERO). IF THE STATUS IS STILL
|
||||
; ZERO, WE ABORT WITH A NO MEDIA STATUS. NOTE THAT THE NOP COMMAND
|
||||
; RETURNS A COMMAND ERROR BY DESIGN. WE JUST IGNORE THE ERROR.
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_REGDUMP
|
||||
#ENDIF
|
||||
;
|
||||
; ON ENTRY, WE HAVE ALREADY CHECKED THAT THE BUSY BIT IS CLEARED AND
|
||||
; DRDY SHOULD BE SET. IF DRDY IS NOT SET, IF COULD MEAN EITHER A
|
||||
; NON-EXISTENT SLAVE DEVICE OR AN ATAPI DEVICE. TO AVOID UNNECESSARY
|
||||
; TIMEOUTS, WE CHECK FOR DRDY. IF IT IS NOT SET, THEN WE ASSUME THIS
|
||||
; MUST BE AN ATAPI DEVICE AND GO TRY TO DO THE ATAPI INITIALIZATION.
|
||||
; IF THIS WAS ACTUALLY A NON-EXISTENT SLAVE, THE ATAPI INITIALIZATION
|
||||
; WILL HANDLE THIS PRETTY WELL.
|
||||
;
|
||||
CALL PPIDE_NOP
|
||||
CALL PPIDE_IN
|
||||
.DB PPIDE_REG_STAT
|
||||
OR A
|
||||
JP Z,PPIDE_NOMEDIA
|
||||
BIT 6,A ; DRDY?
|
||||
JR Z,PPIDE_INITPDEV ; ODD, MIGHT BE ATAPI
|
||||
|
||||
;
|
||||
; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE
|
||||
;
|
||||
PPIDE_INITDEV0A:
|
||||
BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS?
|
||||
JR Z,PPIDE_INITDEV0 ; NO, DO 16 BIT INIT
|
||||
LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
|
||||
@@ -1358,8 +1587,12 @@ PPIDE_INITDEV0:
|
||||
;
|
||||
PPIDE_INITDEV00:
|
||||
;
|
||||
; WE NOW USE AN IDENTIFY DEVICE COMMAND TO CONFIRM THE
|
||||
; DEVICE IS REALLY THERE AND GET SOME ATTRIBUTES. IF THE
|
||||
; COMMAND FAILS, IT MAY BE THAT WE HAVE AN ATAPI DEVICE AND
|
||||
; SO WE GO TO THE ATAPI INITIALIZATION ON FAILURE.
|
||||
CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND
|
||||
JR NZ,PPIDE_INITDEVP ; ON ERROR, TRY PACKET DEVICE
|
||||
JR NZ,PPIDE_INITPDEV ; TRY ATAPI ON FAILURE
|
||||
;
|
||||
; DECLARE WE ARE ATA
|
||||
LD A,PPIDE_TYPEATA ; OTHERWISE TYPE=ATA
|
||||
@@ -1371,13 +1604,6 @@ PPIDE_INITDEV00:
|
||||
#ENDIF
|
||||
;
|
||||
LD (IY+PPIDE_MED),0 ; CLEAR MEDIA FLAGS
|
||||
;
|
||||
; DETERMINE IF CF DEVICE BY TESTING FOR CF CARD SIGNATURES
|
||||
; IN THEORY, THERE ARE SOME OTHER POSSIBLE VARIATIONS, BUT
|
||||
; THEY ARE NOT RECOMMENDED BY THE CF CARD SPEC AND MIGHT
|
||||
; OVERLAP WITH "REAL" HARD DISK SIGNATURES. I HAVE NEVER
|
||||
; SEEN A CF CARD THAT DID NOT USE ONE OF THE BELOW.
|
||||
; CREDIT TO LASZLO SZOLNOKI
|
||||
;
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_PRTPREFIX
|
||||
@@ -1417,9 +1643,15 @@ PPIDE_INITDEV2:
|
||||
;
|
||||
RET ; RETURN, A=0, Z SET
|
||||
;
|
||||
; (RE)INITIALIZE PACKET DEVICE
|
||||
;
|
||||
PPIDE_INITPDEV:
|
||||
;
|
||||
#IF (PPIDETRACE >= 3)
|
||||
CALL PPIDE_PRTPREFIX
|
||||
PRTS(" INITPDEV$") ; LABEL FOR IO ADDRESS
|
||||
#ENDIF
|
||||
;
|
||||
PPIDE_INITDEVP:
|
||||
CALL PPIDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
@@ -1432,17 +1664,98 @@ PPIDE_INITDEVP:
|
||||
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
|
||||
#ENDIF
|
||||
;
|
||||
LD (IY+PPIDE_MED),0 ; CLEAR FLAGS
|
||||
LD (IY+PPIDE_MED),0 ; CLEAR FLAGS
|
||||
SET 1,(IY+PPIDE_MED) ; SET FLAGS BIT FOR LBA (ASSUMED)
|
||||
;
|
||||
; DONE FOR NOW, ATAPI NOT INPLEMENTED
|
||||
; WAIT FOR UNIT READY
|
||||
LD B,0 ; MAX LOOPS
|
||||
LD C,4 ; MAX ERRORS
|
||||
PPIDE_INITPDEV1:
|
||||
DEC B ; CHECK LOOP COUNTER EXCEEDED
|
||||
JP Z,PPIDE_NOMEDIA ; TREAT AS NO MEDIA
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD HL,PPIDE_PKTCMD_TSTRDY ; TEST UNIT READY
|
||||
XOR A ; READ DIRECTION
|
||||
LD (PPIDE_XFRDIR),A ; SAVE IT
|
||||
CALL PPIDE_RUNPCMD ; ISSUE PACKET COMMAND
|
||||
CALL NZ,PPIDE_CHKPCMD ; IF ERROR, DIAGNOSE IT
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
JR Z,PPIDE_INITPDEV2 ; IF NO ERROR, CONTINUE
|
||||
CP PPIDE_STNOMEDIA ; EXPLICIT NO MEDIA RESULT?
|
||||
RET Z ; EXIT REPORTING NO MEDIA
|
||||
CP PPIDE_STNOTRDY ; BECOMING READY?
|
||||
JR Z,PPIDE_INITDEVP1A ; IF SO, NOT AN ERROR, LOOP
|
||||
DEC C ; DEC ERROR LIMIT
|
||||
RET Z ; BAIL OUT, ERR LIMIT EXCEEDED
|
||||
JR PPIDE_INITPDEV1 ; LOOP
|
||||
PPIDE_INITDEVP1A:
|
||||
LD DE,100000/16 ; WAIT 1/10 SECOND
|
||||
CALL VDELAY ; DO IT
|
||||
JR PPIDE_INITPDEV1 ; AND LOOP
|
||||
;
|
||||
; RETURN NOT SUPPORTED STATUS
|
||||
JP PPIDE_NOTSUP ; NOT SUPPORTED
|
||||
PPIDE_INITPDEV2:
|
||||
#IF (PPIDETRACE >= 3)
|
||||
LD A,B
|
||||
NEG
|
||||
PRTS("\r\nLOOPS=$")
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
;
|
||||
; ; RECORD STATUS OK
|
||||
; XOR A ; A := 0 (STATUS = OK)
|
||||
; LD (IY+PPIDE_STAT),A ; SAVE IT
|
||||
; RET
|
||||
; GET AND RECORD CAPACITY
|
||||
LD HL,HB_WRKBUF
|
||||
LD (PPIDE_DSKBUF),HL
|
||||
LD HL,PPIDE_PKTCMD_RDCAP
|
||||
XOR A ; READ DIRECTION
|
||||
LD (PPIDE_XFRDIR),A ; SAVE IT
|
||||
CALL PPIDE_RUNPCMD
|
||||
JP NZ,PPIDE_CHKPCMD
|
||||
;
|
||||
#IF (PPIDETRACE >= 3)
|
||||
PRTS("\r\nRDCAP:$")
|
||||
LD A,8
|
||||
LD DE,HB_WRKBUF
|
||||
CALL PRTHEXBUF
|
||||
#ENDIF
|
||||
;
|
||||
; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND
|
||||
; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO
|
||||
; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY
|
||||
; COUNT INSTEAD OF A LAST LBA VALUE.
|
||||
LD A,PPIDE_MEDCAP ; OFFSET IN CFG FOR CAPACITY
|
||||
CALL LDHLIYA ; POINTER TO HL
|
||||
PUSH HL ; SAVE IT
|
||||
LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT
|
||||
CALL LD32 ; LOAD IT TO DE:HL
|
||||
LD A,L ; FLIP BYTES
|
||||
LD L,D ; ... BIG ENDIAN
|
||||
LD D,A ; ... TO LITTLE ENDIAN
|
||||
LD A,H
|
||||
LD H,E
|
||||
LD E,A
|
||||
CALL INC32 ; INCREMENT TO FINAL VALUE
|
||||
POP BC ; RECOVER SAVE LOCATION
|
||||
CALL ST32 ; STORE VALUE
|
||||
;
|
||||
; CHECK BLOCK LENGTH. WE CURRENTLY ONLY SUPPORT 512 BYTE
|
||||
; BLOCKS. CD-ROM DEVICES (WHICH USE 2k BLOCKS) WILL FAIL
|
||||
; HERE AS NOT SUPPORTED.
|
||||
LD HL,HB_WRKBUF+4 ; POINT TO BLK SIZE IN RESULT
|
||||
CALL LD32 ; LOAD IT TO DE:HL
|
||||
; VALUE IS BIG ENDIAN, SO LH:ED MUST BE EXACTLY 0000:0200
|
||||
LD A,L ; CHECK THAT LH
|
||||
OR H ; ... IS ZERO
|
||||
JP NZ,PPIDE_NOTSUP ; IF NOT, FAIL AS NOT SUP
|
||||
LD A,D ; LOAD D
|
||||
OR A ; SET FLAGS
|
||||
JP NZ,PPIDE_NOTSUP ; IF NOT ZERO, FAIL AS NOT SUP
|
||||
LD A,E ; LOAD E
|
||||
CP 2 ; CHECK IT IF IS 2
|
||||
JP NZ,PPIDE_NOTSUP ; IF NOT, FAIL AS NOT SUP
|
||||
;
|
||||
; RECORD STATUS OK
|
||||
XOR A ; A := 0 (STATUS = OK)
|
||||
LD (IY+PPIDE_STAT),A ; SAVE IT
|
||||
RET
|
||||
;
|
||||
; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG
|
||||
;
|
||||
@@ -1535,19 +1848,19 @@ PPIDE_IN:
|
||||
EX (SP),HL ; GET PARM POINTER ; 19TS
|
||||
PUSH BC ; SAVE INCOMING BC ; 11TS
|
||||
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS
|
||||
;OUT (PPIDE_IO_PPI),A ; DO IT
|
||||
;OUT (PPIDE_REG_PPI),A ; DO IT
|
||||
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD ; 19TS
|
||||
OUT (C),A ; WRITE IT ; 12TS
|
||||
;
|
||||
LD B,(HL) ; GET CTL PORT VALUE ; 7TS
|
||||
;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE
|
||||
;LD C,PPIDE_REG_CTL ; SETUP PORT TO WRITE
|
||||
;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
DEC C ; SET IDE ADDRESS ; 4TS
|
||||
OUT (C),B ; SET ADDRESS LINES ; 12TS
|
||||
SET 6,B ; TURN ON READ BIT ; 8TS
|
||||
OUT (C),B ; ASSERT READ LINE ; 12TS
|
||||
;
|
||||
;IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE
|
||||
;IN A,(PPIDE_REG_DATALO) ; GET DATA VALUE FROM DEVICE
|
||||
DEC C ; 4TS
|
||||
DEC C ; 4TS
|
||||
IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12
|
||||
@@ -1569,13 +1882,13 @@ PPIDE_OUT:
|
||||
PUSH BC ; SAVE INCOMING BC
|
||||
PUSH AF ; PRESERVE INCOMING VALUE
|
||||
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE
|
||||
;OUT (PPIDE_IO_PPI),A ; DO IT
|
||||
;OUT (PPIDE_REG_PPI),A ; DO IT
|
||||
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
|
||||
OUT (C),A ; WRITE IT
|
||||
POP AF ; RECOVER VALUE TO WRITE
|
||||
;
|
||||
LD B,(HL) ; GET IDE ADDRESS VALUE
|
||||
;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE
|
||||
;LD C,PPIDE_REG_CTL ; SETUP PORT TO WRITE
|
||||
;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
DEC C ; SET IDE ADDRESS
|
||||
OUT (C),B ; SET ADDRESS LINES
|
||||
@@ -1584,7 +1897,7 @@ PPIDE_OUT:
|
||||
;
|
||||
DEC C
|
||||
DEC C
|
||||
;OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE
|
||||
;OUT (PPIDE_REG_DATALO),A ; SEND DATA VALUE TO DEVICE
|
||||
OUT (C),A ; SEND DATA VALUE TO DEVICE
|
||||
INC C
|
||||
INC C
|
||||
@@ -1634,6 +1947,10 @@ PPIDE_NOTSUP:
|
||||
LD A,PPIDE_STNOTSUP
|
||||
JR PPIDE_ERR
|
||||
;
|
||||
PPIDE_NOTRDY:
|
||||
LD A,PPIDE_STNOTRDY
|
||||
JR PPIDE_ERR
|
||||
;
|
||||
PPIDE_ERR:
|
||||
LD (IY+PPIDE_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
@@ -1706,6 +2023,9 @@ PPIDE_PRTSTATSTR:
|
||||
INC A
|
||||
LD DE,PPIDE_STR_STNOTSUP
|
||||
JR Z,PPIDE_PRTSTATSTR1
|
||||
INC A
|
||||
LD DE,PPIDE_STR_STNOTRDY
|
||||
JR Z,PPIDE_PRTSTATSTR1
|
||||
LD DE,PPIDE_STR_STUNK
|
||||
PPIDE_PRTSTATSTR1:
|
||||
CALL WRITESTR
|
||||
@@ -1723,7 +2043,7 @@ PPIDE_REGDUMP:
|
||||
CALL PC_SPACE
|
||||
CALL PC_LBKT
|
||||
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ
|
||||
;OUT (PPIDE_IO_PPI),A ; DO IT
|
||||
;OUT (PPIDE_REG_PPI),A ; DO IT
|
||||
LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD
|
||||
OUT (C),A ; WRITE IT
|
||||
LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS
|
||||
@@ -1731,12 +2051,12 @@ PPIDE_REGDUMP:
|
||||
LD B,7
|
||||
PPIDE_REGDUMP1:
|
||||
LD A,E ; REGISTER ADDRESS
|
||||
;OUT (PPIDE_IO_CTL),A ; SET IT
|
||||
;OUT (PPIDE_REG_CTL),A ; SET IT
|
||||
OUT (C),A ; REGISTER ADDRESS
|
||||
XOR PPIDE_CTL_DIOR ; SET BIT TO ASSERT READ LINE
|
||||
;OUT (PPIDE_IO_CTL),A ; ASSERT READ
|
||||
;OUT (PPIDE_REG_CTL),A ; ASSERT READ
|
||||
OUT (C),A ; ASSERT READ
|
||||
;IN A,(PPIDE_IO_DATALO) ; GET VALUE
|
||||
;IN A,(PPIDE_REG_DATALO) ; GET VALUE
|
||||
DEC C ; CTL -> MSB
|
||||
DEC C ; MSB -> LSB
|
||||
IN A,(C) ; GET VALUE
|
||||
@@ -1744,7 +2064,7 @@ PPIDE_REGDUMP1:
|
||||
INC C ; MSB -> CTL
|
||||
CALL PRTHEXBYTE ; DISPLAY IT
|
||||
;LD A,C ; RELOAD ADDRESS W/ READ UNASSERTED
|
||||
;OUT (PPIDE_IO_CTL),A ; AND SET IT
|
||||
;OUT (PPIDE_REG_CTL),A ; AND SET IT
|
||||
OUT (C),E ; RELOAD ADDRESS W/ READ UNASSERTED
|
||||
;DEC C ; NEXT LOWER REGISTER
|
||||
DEC E ; NEXT LOWER REGISTER
|
||||
@@ -1785,6 +2105,7 @@ PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$"
|
||||
PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
|
||||
PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
|
||||
PPIDE_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
|
||||
PPIDE_STR_STNOTRDY .TEXT "NOT READY$"
|
||||
PPIDE_STR_STUNK .TEXT "UNKNOWN ERROR$"
|
||||
;
|
||||
PPIDE_STR_NO .TEXT "NO$"
|
||||
@@ -1806,5 +2127,14 @@ PPIDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS
|
||||
PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
|
||||
;
|
||||
PPIDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
|
||||
PPIDE_XFRDIR .DB 0 ; 0=READ, NON-0=WRITE
|
||||
;
|
||||
PPIDE_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
;
|
||||
; SCSI COMMAND TEMPLATES (ALWAYS 12 BYTES FOR ATAPI)
|
||||
;
|
||||
PPIDE_PKTCMD_RW .DB $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00 ; READ/WRITE SECTOR
|
||||
PPIDE_PKTCMD_SENSE .DB $03, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00 ; REQUEST SENSE DATA
|
||||
PPIDE_PKTCMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY
|
||||
PPIDE_PKTCMD_RW10 .DB $28, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00 ; READ/WRITE SECTOR
|
||||
PPIDE_PKTCMD_TSTRDY .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; TEST UNIT READY
|
||||
|
||||
@@ -689,7 +689,7 @@ PPPSD_RESET:
|
||||
PPPSD_DEVICE:
|
||||
LD D,DIODEV_PPPSD ; D := DEVICE TYPE
|
||||
LD E,(IY+PPPSD_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD
|
||||
LD C,%01110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD
|
||||
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
||||
LD L,PPPBASE ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
@@ -546,7 +546,7 @@ PRPSD_RESET:
|
||||
PRPSD_DEVICE:
|
||||
LD D,DIODEV_PRPSD ; D := DEVICE TYPE
|
||||
LD E,(IY+PRPSD_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD
|
||||
LD C,%01110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD
|
||||
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
||||
LD L,PRP_IOBASE ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
@@ -178,7 +178,7 @@ RF_GEOM:
|
||||
RF_DEVICE:
|
||||
LD D,DIODEV_RF ; D := DEVICE TYPE
|
||||
LD E,(IY+RF_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE RAM FLOPPY
|
||||
LD C,%00010110 ; C := ATTRIBUTES, NON-REMOVABLE RAM FLOPPY
|
||||
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
||||
LD L,(IY+RF_IOAD) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
@@ -450,10 +450,9 @@ fp_hdboot1:
|
||||
push bc ; save loop control
|
||||
ld b,BF_DIODEVICE ; HBIOS Disk Device func
|
||||
rst 08 ; unit in C, do it
|
||||
bit 5,C ; high capacity disk?
|
||||
pop bc ; restore loop control
|
||||
ld a,d ; device type to A
|
||||
cp DIODEV_IDE ; type IDE or greater is HD
|
||||
jr c,fp_hdboot2 ; if not, continue loop
|
||||
jr z,fp_hdboot2 ; if not, continue loop
|
||||
push bc ; save loop control
|
||||
ld b,BF_DIOMEDIA ; HBIOS Sense Media
|
||||
ld e,1 ; perform media discovery
|
||||
@@ -488,11 +487,10 @@ fp_flopboot1:
|
||||
push de ; save floppy down ctr
|
||||
ld b,BF_DIODEVICE ; HBIOS Disk Device func
|
||||
rst 08 ; unit in C, do it
|
||||
ld a,d ; device type to A
|
||||
bit 7,c ; floppy device?
|
||||
pop de ; restore loop control
|
||||
pop bc ; restore floppy down ctr
|
||||
cp DIODEV_FD ; type FD?
|
||||
jr nz,fp_flopboot3 ; if not floppy, skip
|
||||
jr z,fp_flopboot3 ; if not floppy, skip
|
||||
dec e ; decrement down ctr
|
||||
jr z,fp_flopboot2 ; if ctr expired, boot this unit
|
||||
fp_flopboot3:
|
||||
@@ -1017,6 +1015,18 @@ diskboot:
|
||||
cp e ; compare to count
|
||||
jp nc,err_nodisk ; handle no disk err
|
||||
;
|
||||
; If non-zero slice requested, confirm device can handle it
|
||||
ld a,(bootslice) ; get slice
|
||||
or a ; set flags
|
||||
jr z,diskboot0 ; slice 0, skip slice check
|
||||
ld a,(bootunit) ; get disk unit
|
||||
ld c,a ; put in C for func call
|
||||
ld b,BF_DIODEVICE ; HBIOS func: device info
|
||||
rst 08 ; do it
|
||||
bit 5,c ; high capacity device?
|
||||
jp z,err_noslice ; no such slice, handle err
|
||||
;
|
||||
diskboot0:
|
||||
; Sense media
|
||||
ld a,(bootunit) ; get boot disk unit
|
||||
ld c,a ; put in C for func call
|
||||
@@ -1026,18 +1036,6 @@ diskboot:
|
||||
jp nz,err_diskio ; handle error
|
||||
ld a,e ; media id to A
|
||||
ld (mediaid),a ; save media id
|
||||
;
|
||||
; If non-zero slice requested, confirm device can handle it
|
||||
ld a,(bootslice) ; get slice
|
||||
or a ; set flags
|
||||
jr z,diskboot1 ; slice 0, skip slice check
|
||||
ld a,(bootunit) ; get disk unit
|
||||
ld c,a ; put in C for func call
|
||||
ld b,BF_DIODEVICE ; HBIOS func: device info
|
||||
rst 08 ; do it
|
||||
ld a,d ; device type to A
|
||||
cp DIODEV_IDE ; IDE is max slice device type
|
||||
jp c,err_noslice ; no such slice, handle err
|
||||
;
|
||||
#endif
|
||||
;
|
||||
|
||||
@@ -928,7 +928,7 @@ SD_RESET:
|
||||
SD_DEVICE:
|
||||
LD D,DIODEV_SD ; D := DEVICE TYPE
|
||||
LD E,(IY+SD_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD
|
||||
LD C,%01110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD
|
||||
LD H,SDMODE ; H := MODE
|
||||
LD L,(SD_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
@@ -260,6 +260,12 @@ IMMMODE_NONE .EQU 0 ; NONE
|
||||
IMMMODE_SPP .EQU 1 ; IBM PC STANDARD PAR PORT (SPP)
|
||||
IMMMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE
|
||||
;
|
||||
; SYQ DRIVER MODE SELECTIONS
|
||||
;
|
||||
SYQMODE_NONE .EQU 0 ; NONE
|
||||
SYQMODE_SPP .EQU 1 ; IBM PC STANDARD PAR PORT (SPP)
|
||||
SYQMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE
|
||||
;
|
||||
; GDC MONITOR SELECTIONS
|
||||
;
|
||||
GDCMON_NONE .EQU 0
|
||||
@@ -451,13 +457,15 @@ SPD_LOW .EQU 2 ; PLATFORM CAN CHANGE SPEED, STARTS LOW
|
||||
;
|
||||
; SCSI COMMAND CODES (SHOULD BE IT IT'S OWN FILE)
|
||||
;
|
||||
SCSI_CMD_READ .EQU $08
|
||||
SCSI_CMD_INQ .EQU $12
|
||||
SCSI_CMD_TEST .EQU $00
|
||||
SCSI_CMD_START .EQU $1B
|
||||
SCSI_CMD_SENSE .EQU $03
|
||||
SCSI_CMD_WRITE .EQU $0A
|
||||
SCSI_CMD_RDCAP .EQU $25
|
||||
SCSI_CMD_TSTRDY .EQU $00
|
||||
SCSI_CMD_SENSE .EQU $03
|
||||
SCSI_CMD_READ .EQU $08
|
||||
SCSI_CMD_WRITE .EQU $0A
|
||||
SCSI_CMD_INQ .EQU $12
|
||||
SCSI_CMD_START .EQU $1B
|
||||
SCSI_CMD_RDCAP .EQU $25
|
||||
SCSI_CMD_READ10 .EQU $28
|
||||
SCSI_CMD_WRITE10 .EQU $2A
|
||||
;
|
||||
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE
|
||||
;
|
||||
|
||||
1464
Source/HBIOS/syq.asm
Normal file
1464
Source/HBIOS/syq.asm
Normal file
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,13 @@ call BuildDisk.cmd cpm3 fd wbw_fd144 ..\cpm3\cpmldr.sys || exit /b
|
||||
call BuildDisk.cmd zpm3 fd wbw_fd144 ..\zpm3\zpmldr.sys || exit /b
|
||||
call BuildDisk.cmd ws4 fd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd qpm fd wbw_fd144 d_qpm\u0\qpm.sys || exit /b
|
||||
call BuildDisk.cmd z80asm hd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd aztecc hd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd hitechc hd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd tpascal hd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd bascomp hd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd fortran hd wbw_fd144 || exit /b
|
||||
call BuildDisk.cmd games hd wbw_fd144 || exit /b
|
||||
|
||||
echo.
|
||||
echo Building Hard Disk Images (512 directory entry format)...
|
||||
@@ -26,6 +33,13 @@ call BuildDisk.cmd zpm3 hd wbw_hd512 ..\zpm3\zpmldr.sys || exit /b
|
||||
call BuildDisk.cmd ws4 hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd dos65 hd wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b
|
||||
call BuildDisk.cmd qpm hd wbw_hd512 d_qpm\u0\qpm.sys || exit /b
|
||||
call BuildDisk.cmd z80asm hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd aztecc hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd hitechc hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd tpascal hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd bascomp hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd fortran hd wbw_hd512 || exit /b
|
||||
call BuildDisk.cmd games hd wbw_hd512 || exit /b
|
||||
|
||||
if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp hd wbw_hd512 || exit /b
|
||||
|
||||
@@ -43,6 +57,13 @@ call BuildDisk.cmd cpm3 hd wbw_hd1k ..\cpm3\cpmldr.sys || exit /b
|
||||
call BuildDisk.cmd zpm3 hd wbw_hd1k ..\zpm3\zpmldr.sys || exit /b
|
||||
call BuildDisk.cmd ws4 hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd qpm hd wbw_hd1k d_qpm\u0\qpm.sys || exit /b
|
||||
call BuildDisk.cmd z80asm hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd aztecc hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd hitechc hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd tpascal hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd bascomp hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd fortran hd wbw_hd1k || exit /b
|
||||
call BuildDisk.cmd games hd wbw_hd1k || exit /b
|
||||
|
||||
if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp hd wbw_hd1k || exit /b
|
||||
|
||||
|
||||
Binary file not shown.
BIN
Source/Images/Common/All/WDATE.COM
Normal file
BIN
Source/Images/Common/All/WDATE.COM
Normal file
Binary file not shown.
BIN
Source/Images/Common/UTILS/BBCBASIC.COM
Normal file
BIN
Source/Images/Common/UTILS/BBCBASIC.COM
Normal file
Binary file not shown.
369
Source/Images/Common/UTILS/BBCBASIC.TXT
Normal file
369
Source/Images/Common/UTILS/BBCBASIC.TXT
Normal file
@@ -0,0 +1,369 @@
|
||||
BBC BASIC (Z80)
|
||||
|
||||
Generic CP/M Version 3.00
|
||||
|
||||
(C) Copyright R.T.Russell 1982-1999
|
||||
|
||||
1. INTRODUCTION
|
||||
|
||||
BBC BASIC (Z80) has been designed to be as compatible as possible with
|
||||
Version 4 of the 6502 BBC BASIC resident in the BBC Micro Master series.
|
||||
The language syntax is not always identical to that of the 6502 version,
|
||||
but in most cases the Z80 version is more tolerant.
|
||||
|
||||
BBC BASIC (Z80) is as machine independent as possible and, as supplied,
|
||||
it will run on any CP/M 2.2 (or later) system using a Z80 processor
|
||||
(checks are carried out to ensure that the processor is a Z80 and that
|
||||
the version of CP/M is at least 2.2). It is minimally configured for an
|
||||
ADM3a-compatible VDU.
|
||||
|
||||
Few CP/M systems offer colour graphics of the quality provided as
|
||||
standard on the BBC Microcomputer, and no software can provide colour
|
||||
high-resolution graphics from a monochrome character-orientated computer.
|
||||
However, many CP/M system users are interested in the advanced program
|
||||
structures available from BBC BASIC and, within the limitations of the
|
||||
host computer, BBC BASIC (Z80) provides the programming structures and
|
||||
the non-graphic commands and functions specified for BBC BASIC.
|
||||
|
||||
In order to make full use of the facilities available in BBC BASIC (Z80)
|
||||
it is necessary to install a small patch to adapt it to the capabilities
|
||||
of the host computer. The source code of the patch present in the
|
||||
distribution version is supplied as BBCDIST.MAC.
|
||||
|
||||
This documentation should be read in conjunction with a standard BBC
|
||||
BASIC manual. Only those features which differ from the standard Acorn
|
||||
versions are documented here.
|
||||
|
||||
|
||||
2. MEMORY UTILISATION
|
||||
|
||||
BBC BASIC (Z80) requires about 16 Kbytes of code space, resulting in a
|
||||
value of PAGE of about &3E00. The remainder of the user memory is
|
||||
available for BASIC programs, variables (heap) and stack. Depending on
|
||||
the system configuration, HIMEM can have a value up to &FE00.
|
||||
|
||||
|
||||
3. COMMANDS, STATEMENTS AND FUNCTIONS
|
||||
|
||||
The syntax of BASIC commands, statements and functions is in most cases
|
||||
identical to that of the BBC Micro version (BASIC 4). The few
|
||||
differences are documented here:
|
||||
|
||||
ADVAL
|
||||
This function is not implemented.
|
||||
|
||||
CALL
|
||||
CALL sets up a table in RAM containing details of the parameters; the
|
||||
processor's IX register is set to the address of this parameter table.
|
||||
The other processor registers are initialised as follows:
|
||||
|
||||
A is initialised to the least significant byte of A%
|
||||
B is initialised to the least significant byte of B%
|
||||
C is initialised to the least significant byte of C%
|
||||
D is initialised to the least significant byte of D%
|
||||
E is initialised to the least significant byte of E%
|
||||
F is initialised to the least significant byte of F%
|
||||
H is initialised to the least significant byte of H%
|
||||
L is initialised to the least significant byte of L%
|
||||
|
||||
The parameter types are:
|
||||
|
||||
Code No. Parameter Type Example
|
||||
0 Byte (8 bits) ?A%
|
||||
4 Word (32 bits) !A% or A%
|
||||
5 Real (40 bits) A
|
||||
128 Fixed string $A%
|
||||
129 Movable string A$
|
||||
|
||||
On entry to the subroutine the parameter table contains the following
|
||||
values:
|
||||
|
||||
Number of parameters 1 byte (at IX)
|
||||
|
||||
Parameter type 1 byte (at IX+1)
|
||||
Parameter address 2 bytes (at IX+2, IX+3, LSB first)
|
||||
|
||||
Parameter type ) repeated as often as necessary
|
||||
Parameter address )
|
||||
|
||||
Except in the case of a movable string (normal string variable), the
|
||||
parameter address given is the absolute address at which the item is
|
||||
stored. In the case of movable strings (type 129) it is the address of a
|
||||
4-byte parameter block containing the current length, the maximum length
|
||||
and the start address of the string (LSB first) in that order.
|
||||
|
||||
Integer variables are stored in twos complement form with their least
|
||||
significant byte first.
|
||||
|
||||
Fixed strings are stored as the characters of the string followed by a
|
||||
carriage return (&0D).
|
||||
|
||||
Floating point variables are stored in binary floating point format with
|
||||
their least significant byte first; the fifth byte is the exponent. The
|
||||
mantissa is stored as a binary fraction in sign and magnitude format.
|
||||
Bit 7 of the most significant byte is the sign bit and, for the purposes
|
||||
of calculating the magnitude of the number, this bit is assumed to be set
|
||||
to one. The exponent is stored as an integer in excess 127 format (to
|
||||
find the exponent subtract 127 from the value in the fifth byte).
|
||||
|
||||
If the exponent byte of a floating point number is zero, the number is an
|
||||
integer stored in integer format in the mantissa bytes. Thus an integer
|
||||
can be represented in two different ways in a real variable. For example
|
||||
the value +5 can be stored as:
|
||||
|
||||
05 00 00 00 00 Integer 5
|
||||
00 00 00 20 82 (0.5 + 0.125) * 2^3
|
||||
|
||||
COLOUR (COLOR)
|
||||
This statement is not implemented.
|
||||
|
||||
DRAW
|
||||
This statement is not implemented.
|
||||
|
||||
EDIT
|
||||
A command to edit or concatenate and edit the specified program line(s).
|
||||
The specified lines (including their line numbers) are listed as a single
|
||||
line. By changing only the line number you can use EDIT to duplicate a
|
||||
line.
|
||||
|
||||
EDIT 230
|
||||
EDIT 200,230
|
||||
|
||||
The following control functions are active both in the EDIT mode and in
|
||||
the immediate entry mode (i.e. at the BASIC prompt):
|
||||
|
||||
Move the cursor one character position to the left
|
||||
Move the cursor one character position to the right
|
||||
Move the cursor to the start of the line
|
||||
Move the cursor to the end of the line
|
||||
Insert a space at the current cursor position
|
||||
Delete the character at the current cursor position
|
||||
Backspace and delete the character to the left of the cursor
|
||||
Delete all characters to the left of the cursor
|
||||
Delete all characters from the cursor to the end of the line
|
||||
|
||||
The choice of which keys activate these functions is made when BBC BASIC
|
||||
is configured for a particular system. The distribution version uses ^H,
|
||||
^I, ^K, ^J, ^A, ^E, DEL (&7F), ^L and ^X.
|
||||
|
||||
To exit EDIT mode and replace the edited line, type RETURN (ENTER).
|
||||
|
||||
To abort the edit and leave the line unchanged, type ESCape.
|
||||
|
||||
ENVELOPE
|
||||
This statement is not implemented.
|
||||
|
||||
GET
|
||||
This function waits for a character to be typed at the keyboard, and
|
||||
returns the ASCII code.
|
||||
|
||||
GET can also be used to read data from a processor I/O port; full 16-bit
|
||||
port addressing is available:
|
||||
|
||||
N% = GET(X%) : REM input from port X%
|
||||
|
||||
INKEY
|
||||
This function waits for a specified maximum number of centiseconds for a
|
||||
character to be typed at the keyboard. If no character is typed in that
|
||||
time, the value -1 is returned. In the distribution version the delay is
|
||||
determined by a simple software timing loop, and may be very inaccurate.
|
||||
The customisation patch allows this to be adjusted to suit the system in
|
||||
use.
|
||||
|
||||
INPUT#
|
||||
The format of data files is different from that used by the BBC Micro, in
|
||||
part to improve compatibility with standard CP/M files. Numeric values
|
||||
are stored as five bytes in the format documented under CALL; if the
|
||||
fifth byte is zero the value is an integer. Strings are stored as the
|
||||
characters of the string (in the correct order!) followed by a carriage
|
||||
return (&0D).
|
||||
|
||||
MODE
|
||||
This statement is not implemented.
|
||||
|
||||
MOVE
|
||||
This statement is not implemented.
|
||||
|
||||
PLOT
|
||||
This statement is not implemented.
|
||||
|
||||
POINT
|
||||
This function is not implemented.
|
||||
|
||||
PRINT#
|
||||
The format of data files is different from that used by the BBC Micro, in
|
||||
part to improve compatibility with standard CP/M files. Numeric values
|
||||
are stored as five bytes in the format documented under CALL; if the
|
||||
fifth byte is zero the value is an integer. Strings are stored as the
|
||||
characters of the string (in the correct order!) followed by a carriage
|
||||
return (&0D).
|
||||
|
||||
PUT
|
||||
A statement to output data to a processor port. Full 16-bit addressing
|
||||
is available.
|
||||
|
||||
PUT A%,N% : REM Output N% to port A%
|
||||
|
||||
SOUND
|
||||
This statement is not implemented.
|
||||
|
||||
TIME
|
||||
This pseudo-variable is not implemented in the distribution version, but
|
||||
can be supported by means of the customisation patch. See BBCDIST.MAC.
|
||||
|
||||
USR
|
||||
As with CALL, the processor's registers are initialised as follows:
|
||||
|
||||
A is initialised to the least significant byte of A%
|
||||
B is initialised to the least significant byte of B%
|
||||
C is initialised to the least significant byte of C%
|
||||
D is initialised to the least significant byte of D%
|
||||
E is initialised to the least significant byte of E%
|
||||
F is initialised to the least significant byte of F%
|
||||
H is initialised to the least significant byte of H%
|
||||
L is initialised to the least significant byte of L%
|
||||
|
||||
USR returns a 32-bit integer result composed of the processor's H, L, H'
|
||||
and L' registers, with H being the most significant.
|
||||
|
||||
|
||||
4. RESIDENT Z80 ASSEMBLER
|
||||
|
||||
The in-line assembler is accessed in exactly the same way as the 6502
|
||||
assembler in the BBC Micro version of BBC BASIC. That is, '[' enters
|
||||
assembler mode and ']' exits assembler mode.
|
||||
|
||||
All standard Zilog mnemonics are accepted: ADD, ADC and SBC must be
|
||||
followed by A or HL. For example, ADD A,C is accepted but ADD C is not.
|
||||
However, the brackets around the port number in IN and OUT are optional.
|
||||
Thus both OUT (5),A and OUT 5,A are accepted. The instruction IN F,(C)
|
||||
is not accepted, but the equivalent code is produced from IN (HL),C
|
||||
|
||||
The pseudo-ops DEFB, DEFW and DEFM are included. DEFM works like EQUS in
|
||||
the 6502 version.
|
||||
|
||||
|
||||
5. OPERATING SYSTEM INTERFACE
|
||||
|
||||
The following resident Operating System ("star") commands are
|
||||
implemented. They may be accessed directly (e.g. *BYE) or via the OSCLI
|
||||
statement (OSCLI "BYE").
|
||||
|
||||
Control characters, lower-case characters, DEL and quotation marks may be
|
||||
incorporated in filenames by using the 'escape' character '|'. However,
|
||||
there is no equivalent to the BBC Microcomputer's '|!' to set bit 7.
|
||||
|
||||
*BYE
|
||||
Returns control to the operating system (CP/M).
|
||||
|
||||
*CPM
|
||||
Same as *BYE.
|
||||
|
||||
*. [filespec]
|
||||
*DIR [filespec]
|
||||
List the files which match the (optional) ambiguous filespec. If the
|
||||
filespec is omitted, all .BBC files are listed:
|
||||
*DIR List all .BBC files on the disk
|
||||
*DIR B:*.* List all files on disk B:
|
||||
*.*.* List all files on the current disk
|
||||
|
||||
*DRIVE d:
|
||||
Select drive d as the default drive for subsequent disk operations.
|
||||
|
||||
*ERA filespec
|
||||
Erase (delete) the specified disk file or files. The extension defaults
|
||||
to .BBC if omitted.
|
||||
|
||||
*ESC [ON|OFF]
|
||||
*ESC OFF disables the abort action of the ESCape key; after *ESC OFF the
|
||||
ESCape key simply returns the ASCII code ESC (27). *ESC ON, or *ESC,
|
||||
restores the normal action of the ESCape key.
|
||||
|
||||
*EXEC filespec
|
||||
Accept console input from the specified file instead of from the
|
||||
keyboard. If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*LOAD filespec aaaa
|
||||
Loads the specified file into memory at address aaaa. The load address
|
||||
must be specified. If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*OPT [n]
|
||||
Select the destination for console output characters. The value n is in
|
||||
the range 0 to 2, as follows:
|
||||
|
||||
0 Send characters to the console output
|
||||
1 Send characters to the auxiliary output
|
||||
2 Send characters to the printer (list) output
|
||||
|
||||
*REN newfile=oldfile
|
||||
*RENAME newfile=oldfile
|
||||
Renames 'oldfile' as 'newfile'. If the extension is omitted, .BBC is
|
||||
assumed.
|
||||
|
||||
*RESET
|
||||
Rest the disk system (CP/M function 13). This command does not close any
|
||||
files nor does it perform any other housekeeping function. You should
|
||||
use *RESET after you have changed a disk.
|
||||
|
||||
*SAVE filespec aaaa bbbb
|
||||
*SAVE filespec aaaa +llll
|
||||
This command saves a specified range of memory to disk. The address range
|
||||
is specified either as start (aaaa) and end+1 (bbbb) or as start (aaaa)
|
||||
and length (llll). If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*SPOOL [filespec]
|
||||
Copy all subsequent console output to the specified file. If the filename
|
||||
is omitted, any current spool file is closed and spooling is terminated.
|
||||
If the extension is omitted, .BBC is assumed.
|
||||
|
||||
*TYPE filespec
|
||||
Type the specified file to the screen. If the extension is omitted, .BBC
|
||||
is assumed.
|
||||
|
||||
*| comment
|
||||
This is a comment line. Anything following the | is ignored.
|
||||
|
||||
|
||||
6. ERROR MESSAGES AND CODES
|
||||
|
||||
Untrappable:
|
||||
|
||||
No room RENUMBER space
|
||||
Silly LINE space
|
||||
Sorry Bad program
|
||||
|
||||
Trappable - BASIC:
|
||||
|
||||
1 Out of range 24 Exp range
|
||||
2 25
|
||||
3 26 No such variable
|
||||
4 Mistake 27 Missing )
|
||||
5 Missing , 28 Bad HEX
|
||||
6 Type mismatch 29 No such FN/PROC
|
||||
7 No FN 30 Bad call
|
||||
8 31 Arguments
|
||||
9 Missing " 32 No FOR
|
||||
10 Bad DIM 33 Can't match FOR
|
||||
11 DIM space 34 FOR variable
|
||||
12 Not LOCAL 35
|
||||
13 No PROC 36 No TO
|
||||
14 Array 37
|
||||
15 Subscript 38 No GOSUB
|
||||
16 Syntax error 39 ON syntax
|
||||
17 Escape 40 ON range
|
||||
18 Division by zero 41 No such line
|
||||
19 String too long 42 Out of DATA
|
||||
20 Too big 43 No REPEAT
|
||||
21 -ve root 44
|
||||
22 Log range 45 Missing #
|
||||
23 Accuracy lost
|
||||
|
||||
Trappable - OS:
|
||||
|
||||
190 Directory full 214 File not found
|
||||
192 Too many open files 222 Channel
|
||||
196 File exists 253 Bad string
|
||||
198 Disk full 254 Bad command
|
||||
200 Close error 255 CP/M error
|
||||
204 Bad name
|
||||
|
||||
225
Source/Images/Common/UTILS/BBCDIST.MAC
Normal file
225
Source/Images/Common/UTILS/BBCDIST.MAC
Normal file
@@ -0,0 +1,225 @@
|
||||
TITLE BBCDIST.Z80 (C) R.T.RUSSELL 1982
|
||||
;
|
||||
;BBC BASIC (Z80) - CP/M VERSION 2.30 & 3.00
|
||||
;(C) COPYRIGHT R.T.RUSSELL, 1982.
|
||||
;ALL RIGHTS RESERVED.
|
||||
;
|
||||
;THIS PROGRAM ALLOWS THE USER TO ADAPT BBC BASIC TO THE
|
||||
;PARTICULAR CHARACTERISTICS OF HIS SYSTEM HARDWARE ETC.
|
||||
;
|
||||
;THE PROGRAM RESIDES AT 100H FOR EASE OF LOADING.
|
||||
;*** IT MUST NOT EXCEED 256 BYTES IN TOTAL LENGTH ***
|
||||
;
|
||||
;PLEASE NOTE THAT A Z80 PROCESSOR AND CP/M VERSION 2.2
|
||||
;OR LATER ARE REQUIRED.
|
||||
;
|
||||
;R.T.RUSSELL, 11-03-1984, 03-05-1989
|
||||
;ALTERNATE REGISTERS SAVED FOR BDOS CALL, 04-06-2000
|
||||
;
|
||||
CPM EQU 5
|
||||
COLD EQU 200H
|
||||
;
|
||||
GLOBAL CLRSCN
|
||||
GLOBAL PUTCSR
|
||||
GLOBAL GETCSR
|
||||
GLOBAL PUTIME
|
||||
GLOBAL GETIME
|
||||
GLOBAL GETKEY
|
||||
GLOBAL BYE
|
||||
;
|
||||
ASEG
|
||||
ORG 100H
|
||||
;
|
||||
;JUMP TABLE - BASIC makes calls to hardware-dependent
|
||||
;features via this table:
|
||||
;
|
||||
JP INIT
|
||||
CLRSCN: JP CLS ;CLEAR SCREEN
|
||||
PUTCSR: JP PCSR ;SET CURSOR POSN.
|
||||
GETCSR: JP GCSR ;READ CURSOR POSN.
|
||||
PUTIME: JP PTIME ;SET ELAPSED TIME
|
||||
GETIME: JP GTIME ;READ ELAPSED TIME
|
||||
GETKEY: JP INKEY ;READ KEY (TIME LIMIT)
|
||||
BYE: JP REBOOT ;RETURN TO CP/M
|
||||
;
|
||||
;THE CODE WHICH FOLLOWS IS A SKELETON VERSION SUITABLE
|
||||
;FOR ANY CP/M SYSTEM. IT HAS BEEN CONFIGURED FOR A VT100 TO SOME DEGREE
|
||||
;BY PETER SCHORN.
|
||||
;
|
||||
|
||||
PRSTR EQU 9
|
||||
|
||||
;INIT - Perform hardware initialisation (if any).
|
||||
;
|
||||
INIT: LD A,2
|
||||
INC A
|
||||
LD DE,NOTZ80
|
||||
JP PE,FAIL
|
||||
LD C,12
|
||||
CALL BDOS
|
||||
OR A
|
||||
LD DE,NOTV2
|
||||
JP NZ,COLD
|
||||
FAIL: LD C,PRSTR
|
||||
CALL BDOS
|
||||
RST 0
|
||||
;
|
||||
NOTZ80: DEFB 'Wrong processor$'
|
||||
NOTV2: DEFB 'Wrong CP/M version$'
|
||||
;
|
||||
;REBOOT - Switch off interrupts and return to CP/M
|
||||
;
|
||||
REBOOT: RST 0
|
||||
;
|
||||
;GTIME - Read elapsed-time clock.
|
||||
; Outputs: DEHL = elapsed time (centiseconds)
|
||||
; Destroys: A,D,E,H,L,F
|
||||
;
|
||||
GTIME: LD DE,0
|
||||
LD HL,0
|
||||
RET
|
||||
;
|
||||
;PTIME - Load elapsed-time clock.
|
||||
; Inputs: DEHL = time to load (centiseconds)
|
||||
; Destroys: A,D,E,H,L,F
|
||||
;
|
||||
PTIME: RET
|
||||
;
|
||||
;CLS - Clear screen for VT100.
|
||||
; Destroys: A,D,E,H,L,F
|
||||
;
|
||||
CLS: PUSH BC ; save BC
|
||||
LD C,PRSTR ; command for output string
|
||||
LD DE,CLSSTR ; start address of string
|
||||
CALL BDOS ; output to terminal
|
||||
POP BC ; restore BC
|
||||
RET
|
||||
CLSSTR: DEFB 27,'[2J$' ; VT100 string for clear screen
|
||||
|
||||
;
|
||||
;INKEY - Sample keyboard with specified wait.
|
||||
; This version uses a simple software timing loop.
|
||||
; Modify to use hardware/interrupt timer if available.
|
||||
; Inputs: HL = Time to wait (centiseconds)
|
||||
; Outputs: Carry reset indicates time-out.
|
||||
; If carry set, A = character typed.
|
||||
; Destroys: A,D,E,H,L,F
|
||||
;
|
||||
INKEY: PUSH BC
|
||||
PUSH HL
|
||||
LD C,6
|
||||
LD E,0FFH
|
||||
CALL BDOS ;CONSOLE INPUT
|
||||
POP HL
|
||||
POP BC
|
||||
OR A
|
||||
SCF
|
||||
RET NZ ;KEY PRESSED
|
||||
OR H
|
||||
OR L
|
||||
RET Z ;TIME-OUT
|
||||
PUSH BC
|
||||
LD A,-1
|
||||
LD BC,1250 ;DELAY CONSTANT
|
||||
WAIT: DEC BC
|
||||
CP B
|
||||
JP NZ,WAIT ;WAIT FOR APPROX 10ms
|
||||
POP BC
|
||||
DEC HL
|
||||
JR INKEY
|
||||
;
|
||||
;PCSR - Move cursor to specified position.
|
||||
; Inputs: DE = horizontal position (LHS=0)
|
||||
; HL = vertical position (TOP=0)
|
||||
; called by TAB(column, row)
|
||||
PCSR: LD B,L ; vertical = line (row)
|
||||
CALL CONV ; normalized and convert to decimal
|
||||
LD (LIN),HL ; and store into string
|
||||
LD B,E ; horizontal = column
|
||||
CALL CONV ; normalized and convert to decimal
|
||||
LD (COL),HL ; and store into string
|
||||
LD C,PRSTR ; output string command
|
||||
LD DE,CURS ; start of string
|
||||
JR BDOS ; output string to terminal
|
||||
|
||||
; VT100 sequence for cursor positioning
|
||||
CURS: DEFB 27, '['
|
||||
LIN: DEFW 0 ; high byte, low byte for decimal line
|
||||
DEFB ';'
|
||||
COL: DEFW 0 ; high byte, low byte for decimal column
|
||||
DEFB 'H$'
|
||||
|
||||
; convert binary B (0 <= B < 99, not checked) into B+1 in decimal.
|
||||
; L = upper byte, H = lower byte. ready for LD (...), HL
|
||||
; destroys A, B, L, H
|
||||
; optimized for space over time
|
||||
CONV: INC B ; normalize, home in VT100 is (1,1)
|
||||
LD A,'0' ; A is counter for low byte of result
|
||||
LD L,A ; L is counter for high byte of result
|
||||
CONVLP: INC A ; now B times increment AL in decimal
|
||||
CP '9'+1 ; low byte overflow?
|
||||
JR NZ,CONT ; no, continue incrementing
|
||||
LD A,'0' ; reset low byte
|
||||
INC L ; and increment high byte
|
||||
CONT: DJNZ CONVLP ; B times
|
||||
LD H,A ; put low byte into right place
|
||||
RET
|
||||
|
||||
|
||||
;BDOS - Save the IX and IY and alternate registers
|
||||
; before performing a CP/M function call.
|
||||
;
|
||||
BDOS: PUSH IX
|
||||
PUSH IY
|
||||
EXX
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
EXX
|
||||
EX AF,AF'
|
||||
PUSH AF
|
||||
EX AF,AF'
|
||||
CALL CPM
|
||||
EX AF,AF'
|
||||
POP AF
|
||||
EX AF,AF'
|
||||
EXX
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
EXX
|
||||
POP IY
|
||||
POP IX
|
||||
RET
|
||||
|
||||
|
||||
;GCSR - Return cursor coordinates.
|
||||
; Outputs: DE = X coordinate (POS)
|
||||
; HL = Y coordinate (VPOS)
|
||||
; Destroys: A,D,E,H,L,F
|
||||
;
|
||||
GCSR: LD DE,0
|
||||
LD HL,0
|
||||
RET
|
||||
;
|
||||
IF $ GT 1F4H
|
||||
ERROR 'INSUFFICIENT SPACE'
|
||||
ENDIF
|
||||
;
|
||||
ORG 1F4H
|
||||
;
|
||||
DEFB 80 ;WIDTH
|
||||
DEFB 'E' AND 1FH ;CURSOR UP
|
||||
DEFB 'X' AND 1FH ;CURSOR DOWN
|
||||
DEFB 'A' AND 1FH ;START OF LINE
|
||||
DEFB 'F' AND 1FH ;END OF LINE
|
||||
DEFB 'T' AND 1FH ;DELETE TO END OF LINE
|
||||
DEFB 'H' AND 1FH ;BACKSPACE
|
||||
DEFB 'U' AND 1FH ;CANCEL LINE
|
||||
DEFB 'S' AND 1FH ;CURSOR LEFT
|
||||
DEFB 'D' AND 1FH ;CURSOR RIGHT
|
||||
DEFB 'G' AND 1FH ;DELETE CHARACTER
|
||||
DEFB 'V' AND 1FH ;INSERT CHARACTER
|
||||
;
|
||||
FIN: END
|
||||
|
||||
13
Source/Images/Common/UTILS/BBCDIST.SUB
Normal file
13
Source/Images/Common/UTILS/BBCDIST.SUB
Normal file
@@ -0,0 +1,13 @@
|
||||
; patch BBCBASIC with BBCDIST
|
||||
; need M80 and L80
|
||||
xsub
|
||||
m80 =bbcdist/z
|
||||
l80 bbcdist,bbcdist/n/e
|
||||
ddt bbcbasic.org
|
||||
ibbcdist.com
|
||||
r
|
||||
g0
|
||||
save 58 bbcbasic.com
|
||||
era bbcdist.rel
|
||||
era bbcdist.com
|
||||
|
||||
BIN
Source/Images/Common/UTILS/GENHEX.COM
Normal file
BIN
Source/Images/Common/UTILS/GENHEX.COM
Normal file
Binary file not shown.
BIN
Source/Images/Common/UTILS/LS.COM
Normal file
BIN
Source/Images/Common/UTILS/LS.COM
Normal file
Binary file not shown.
BIN
Source/Images/Common/UTILS/LSWEEP.COM
Normal file
BIN
Source/Images/Common/UTILS/LSWEEP.COM
Normal file
Binary file not shown.
@@ -4,20 +4,29 @@
|
||||
SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys ../ZPM3/zpmldr.sys
|
||||
|
||||
FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_nzcom.img \
|
||||
fd144_cpm3.img fd144_zpm3.img fd144_ws4.img fd144_qpm.img
|
||||
fd144_cpm3.img fd144_zpm3.img fd144_ws4.img fd144_qpm.img \
|
||||
fd144_z80asm.img fd144_aztecc.img fd144_hitechc.img \
|
||||
fd144_bascomp.img fd144_fortran.img fd144_games.img \
|
||||
fd144_tpascal.img
|
||||
HD512IMGS = hd512_cpm22.img hd512_zsdos.img hd512_nzcom.img \
|
||||
hd512_cpm3.img hd512_zpm3.img hd512_ws4.img
|
||||
HD512XIMGS = hd512_z80asm.img hd512_aztecc.img hd512_hitechc.img \
|
||||
hd512_bascomp.img hd512_fortran.img hd512_games.img \
|
||||
hd512_tpascal.img hd512_dos65.img hd512_qpm.img
|
||||
# HDIMGS += hd512_bp.img
|
||||
HD1KIMGS = hd1k_cpm22.img hd1k_zsdos.img hd1k_nzcom.img \
|
||||
hd1k_cpm3.img hd1k_zpm3.img hd1k_ws4.img
|
||||
HD1KXIMGS = hd1k_z80asm.img hd1k_aztecc.img hd1k_hitechc.img \
|
||||
hd1k_bascomp.img hd1k_fortran.img hd1k_games.img \
|
||||
hd1k_tpascal.img hd1k_qpm.img
|
||||
# HD1KIMGS += hd1k_bp.img
|
||||
|
||||
HD512PREFIX =
|
||||
HD1KPREFIX = hd1k_prefix.dat
|
||||
|
||||
OBJECTS = $(FDIMGS)
|
||||
OBJECTS += $(HD512IMGS) hd512_combo.img hd512_dos65.img hd512_qpm.img$(HD512PREFIX)
|
||||
OBJECTS += $(HD1KIMGS) hd1k_combo.img hd1k_qpm.img $(HD1KPREFIX)
|
||||
OBJECTS += $(HD512IMGS) $(HD512XIMGS) hd512_combo.img $(HD512PREFIX)
|
||||
OBJECTS += $(HD1KIMGS) $(HD1KXIMGS) hd1k_combo.img $(HD1KPREFIX)
|
||||
|
||||
OTHERS = blank144 blankhd512 blankhd1k
|
||||
|
||||
@@ -61,7 +70,7 @@ blankhd512:
|
||||
@echo Making Blank HD512 of size $(HD512SIZE)k
|
||||
@LC_ALL=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=$(HD512SIZE)
|
||||
@hexdump $@
|
||||
|
||||
|
||||
blankhd1k:
|
||||
@echo Making Blank HD1K of size $(HD1KSIZE)k
|
||||
@LC_ALL=en_US.US-ASCII tr '\000' '\345' </dev/zero | dd of=$@ bs=1024 count=$(HD1KSIZE)
|
||||
@@ -122,7 +131,7 @@ clean::
|
||||
@rm -f *.ls
|
||||
|
||||
imgdiff:
|
||||
@for i in $(FDIMGS) $(HD512IMGS) $(HD1KIMGS) ; do \
|
||||
@for i in $(FDIMGS) $(HD512IMGS) $(HD512XIMGS) $(HD1KIMGS) $(HD1KXIMGS) ; do \
|
||||
echo $$i ; \
|
||||
if echo $$i | grep -q ^fd144_ ; then \
|
||||
fmt=wbw_fd144 ; \
|
||||
|
||||
26
Source/Images/d_aztecc/Readme.txt
Normal file
26
Source/Images/d_aztecc/Readme.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
===== Aztec C II compiler v1.06D =====
|
||||
|
||||
Aztec C is a discontinued programming language for a variety of platforms
|
||||
including MS-DOS, Apple II DOS 3.3 and PRoDOS, Commodore 64, Macintosh and
|
||||
Amiga. This disk contains the CP/M version of that compiler. A cross-compiler
|
||||
for MS-DOS or Windows XP is also available.
|
||||
|
||||
For full documentation, see https://www.aztecmuseum.ca/
|
||||
|
||||
The user manual is available in the Doc directory
|
||||
Aztec_C_1.06_User_Manual_Mar84.pdf
|
||||
|
||||
== License ==
|
||||
|
||||
I herewith grant you a non-exclusive conditional licence to use any and
|
||||
all of my work included with this compiler for whatever use you deem fit,
|
||||
provided you do not take credit for my work, and that you leave my
|
||||
copyright notices intact in all of it.
|
||||
|
||||
I believe everything I have written to be correct. Regardless, I, Bill
|
||||
Buckels, do not guarantee, or warranty, in whole or in part, any of this,
|
||||
and further do not offer support for any of this. All of this is provided
|
||||
as-is.
|
||||
|
||||
Bill Buckels
|
||||
bbuckels@mts.net
|
||||
BIN
Source/Images/d_aztecc/u0/ARCV.COM
Normal file
BIN
Source/Images/d_aztecc/u0/ARCV.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/AS.COM
Normal file
BIN
Source/Images/d_aztecc/u0/AS.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/C.LIB
Normal file
BIN
Source/Images/d_aztecc/u0/C.LIB
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/CC.COM
Normal file
BIN
Source/Images/d_aztecc/u0/CC.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/CC.MSG
Normal file
BIN
Source/Images/d_aztecc/u0/CC.MSG
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/CNM.COM
Normal file
BIN
Source/Images/d_aztecc/u0/CNM.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/CRC.COM
Normal file
BIN
Source/Images/d_aztecc/u0/CRC.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/CZ.COM
Normal file
BIN
Source/Images/d_aztecc/u0/CZ.COM
Normal file
Binary file not shown.
9
Source/Images/d_aztecc/u0/EXMPL.C
Normal file
9
Source/Images/d_aztecc/u0/EXMPL.C
Normal file
@@ -0,0 +1,9 @@
|
||||
main()
|
||||
{
|
||||
char buf[80];
|
||||
printf("please enter your name: ");
|
||||
gets(buf);
|
||||
printf("hello, %s, welcome to the growing community of Aztec C users\n", buf);
|
||||
}
|
||||
|
||||
|
||||
267
Source/Images/d_aztecc/u0/HEADER.ARC
Normal file
267
Source/Images/d_aztecc/u0/HEADER.ARC
Normal file
@@ -0,0 +1,267 @@
|
||||
libc.h
|
||||
/* Copyright (C) 1981, 1982 by Manx Software Systems */
|
||||
|
||||
extern int errno;
|
||||
#define FLT_FAULT 0 /* vector for floating-point faults */
|
||||
extern int (*Sysvec[])();
|
||||
|
||||
#define NULL 0
|
||||
#define EOF -1
|
||||
#define BUFSIZ 1024
|
||||
|
||||
#define _BUSY 0x01
|
||||
#define _ALLBUF 0x02
|
||||
#define _DIRTY 0x04
|
||||
#define _EOF 0x08
|
||||
#define _IOERR 0x10
|
||||
|
||||
typedef struct {
|
||||
char *_bp; /* current position in buffer */
|
||||
char *_bend; /* last character in buffer + 1 */
|
||||
char *_buff; /* address of buffer */
|
||||
char _flags; /* open mode, etc. */
|
||||
char _unit; /* token returned by open */
|
||||
char _bytbuf; /* single byte buffer for unbuffer streams */
|
||||
int _buflen; /* length of buffer */
|
||||
} FILE;
|
||||
|
||||
extern FILE Cbuffs[];
|
||||
extern char *Stdbufs; /* free list of buffers */
|
||||
long ftell();
|
||||
|
||||
#define stdin (&Cbuffs[0])
|
||||
#define stdout (&Cbuffs[1])
|
||||
#define stderr (&Cbuffs[2])
|
||||
#define getchar() agetc(stdin)
|
||||
#define putchar(c) aputc(c, stdout)
|
||||
#define feof(fp) (((fp)->_flags&_EOF)!=0)
|
||||
#define ferror(fp) (((fp)->_flags&_IOERR)!=0)
|
||||
#define clearerr(fp) ((fp)->_flags &= ~(_IOERR|_EOF))
|
||||
#define fileno(fp) ((fp)->_unit)
|
||||
errno.h
|
||||
extern int errno;
|
||||
#define ENOENT -1
|
||||
#define E2BIG -2
|
||||
#define EBADF -3
|
||||
#define ENOMEM -4
|
||||
#define EEXIST -5
|
||||
#define EINVAL -6
|
||||
#define ENFILE -7
|
||||
#define EMFILE -8
|
||||
#define ENOTTY -9
|
||||
#define EACCES -10
|
||||
|
||||
#define ERANGE -20
|
||||
#define EDOM -21
|
||||
fcntl.h
|
||||
#define O_RDONLY 0
|
||||
#define O_WRONLY 1
|
||||
#define O_RDWR 2
|
||||
#define O_CREAT 0x0100
|
||||
#define O_TRUNC 0x0200
|
||||
#define O_EXCL 0x0400
|
||||
#define O_APPEND 0x0800
|
||||
io.h
|
||||
/* Copyright (C) 1982 by Manx Software Systems */
|
||||
/*
|
||||
* if MAXCHAN is changed then the initialization of chantab in croot.c
|
||||
* should be adjusted so that it initializes EXACTLY MAXCHAN elements of
|
||||
* the array. If this is not done, the I/O library may exhibit
|
||||
* strange behavior.
|
||||
*/
|
||||
#define MAXCHAN 11 /* maximum number of I/O channels */
|
||||
|
||||
/*
|
||||
* argument to device routines.
|
||||
* this is a typedef to allow future redeclaration to guarantee
|
||||
* enough space to store either a pointer or an integer.
|
||||
*/
|
||||
typedef char *_arg;
|
||||
|
||||
/*
|
||||
* device control structure
|
||||
*/
|
||||
struct device {
|
||||
char d_read;
|
||||
char d_write;
|
||||
char d_ioctl; /* used by character special devices (eg CON:) */
|
||||
char d_seek; /* used by random I/O devices (eg: a file) */
|
||||
int (*d_open)(); /* for special open handling */
|
||||
};
|
||||
|
||||
/*
|
||||
* device table, contains names and pointers to device entries
|
||||
*/
|
||||
struct devtabl {
|
||||
char *d_name;
|
||||
struct device *d_dev;
|
||||
_arg d_arg;
|
||||
};
|
||||
|
||||
/*
|
||||
* channel table: relates fd's to devices
|
||||
*/
|
||||
struct channel {
|
||||
char c_read;
|
||||
char c_write;
|
||||
char c_ioctl;
|
||||
char c_seek;
|
||||
int (*c_close)();
|
||||
_arg c_arg;
|
||||
} ;
|
||||
extern struct channel chantab[MAXCHAN];
|
||||
|
||||
struct fcb {
|
||||
char f_driv;
|
||||
char f_name[8];
|
||||
char f_type[3];
|
||||
char f_ext;
|
||||
char f_resv[2];
|
||||
char f_rc;
|
||||
char f_sydx[16];
|
||||
char f_cr;
|
||||
unsigned f_record; char f_overfl;
|
||||
};
|
||||
|
||||
struct fcbtab {
|
||||
struct fcb fcb;
|
||||
char offset;
|
||||
char flags;
|
||||
char user;
|
||||
};
|
||||
|
||||
#define OPNFIL 15
|
||||
#define CLSFIL 16
|
||||
#define DELFIL 19
|
||||
#define READSQ 20
|
||||
#define WRITSQ 21
|
||||
#define MAKFIL 22
|
||||
#define SETDMA 26
|
||||
#define GETUSR 32
|
||||
#define READRN 33
|
||||
#define WRITRN 34
|
||||
#define FILSIZ 35
|
||||
#define SETREC 36
|
||||
|
||||
#define Wrkbuf ((char *)0x80)
|
||||
math.h
|
||||
double sin(), cos(), tan(), cotan();
|
||||
double asin(), acos(), atan(), atan2();
|
||||
double ldexp(), frexp(), modf();
|
||||
double floor(), ceil();
|
||||
double log(), log10(), exp(), sqrt(), pow();
|
||||
double sinh(), cosh(), tanh(), fabs();
|
||||
|
||||
#define HUGE 5.2e+151
|
||||
#define LOGHUGE 349.3
|
||||
#define TINY 7.5e-155
|
||||
#define LOGTINY -354.8
|
||||
setjmp.h
|
||||
/* Copyright (C) 1983 by Manx Software Systems */
|
||||
#define JBUFSIZE (5*sizeof(int))
|
||||
|
||||
typedef char jmp_buf[JBUFSIZE];
|
||||
sgtty.h
|
||||
/* Copyright (C) 1983 by Manx Software Systems */
|
||||
|
||||
#define TIOCGETP 0 /* read contents of tty control structure */
|
||||
#define TIOCSETP 1 /* set contents of tty control structure */
|
||||
#define TIOCSETN 1 /* ditto only don't wait for output to flush */
|
||||
|
||||
struct sgttyb {
|
||||
char sg_erase; /* ignored */
|
||||
char sg_kill; /* ignored */
|
||||
short sg_flags; /* control flags */
|
||||
};
|
||||
|
||||
/* settings for flags */
|
||||
#define _VALID 0x3a
|
||||
#define RAW 0x20 /* no echo or mapping of input/output BDOS(6) */
|
||||
#define CRMOD 0x10 /* map input CR to NL, output NL to CR LF */
|
||||
#define ECHO 0x08 /* ignored unless CBREAK is set */
|
||||
#define CBREAK 0x02 /* input using BDOS(1), unless echo off then */
|
||||
/* same as RAW */
|
||||
stdio.h
|
||||
/* Copyright (C) 1982, 1984 by Manx Software Systems */
|
||||
#define fgetc getc
|
||||
#define fputc putc
|
||||
#define NULL 0
|
||||
#define EOF -1
|
||||
|
||||
#ifdef TINY
|
||||
struct fcb {
|
||||
char f_driv;
|
||||
char f_name[8];
|
||||
char f_type[3];
|
||||
char f_ext;
|
||||
char f_resv[2];
|
||||
char f_rc;
|
||||
char f_sydx[16];
|
||||
char f_cr;
|
||||
unsigned f_record; char f_overfl;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
char *_bp;
|
||||
struct fcb _fcb;
|
||||
char user;
|
||||
} FILE;
|
||||
|
||||
#else
|
||||
|
||||
#define BUFSIZ 1024
|
||||
#define MAXSTREAM 11
|
||||
|
||||
#define _BUSY 0x01
|
||||
#define _ALLBUF 0x02
|
||||
#define _DIRTY 0x04
|
||||
#define _EOF 0x08
|
||||
#define _IOERR 0x10
|
||||
|
||||
typedef struct {
|
||||
char *_bp; /* current position in buffer */
|
||||
char *_bend; /* last character in buffer + 1 */
|
||||
char *_buff; /* address of buffer */
|
||||
char _flags; /* open mode, etc. */
|
||||
char _unit; /* token returned by open */
|
||||
char _bytbuf; /* single byte buffer for unbuffer streams */
|
||||
int _buflen; /* length of buffer */
|
||||
} FILE;
|
||||
|
||||
extern FILE Cbuffs[];
|
||||
FILE *fopen();
|
||||
long ftell();
|
||||
|
||||
#define stdin (&Cbuffs[0])
|
||||
#define stdout (&Cbuffs[1])
|
||||
#define stderr (&Cbuffs[2])
|
||||
#define getchar() agetc(stdin)
|
||||
#define putchar(c) aputc(c, stdout)
|
||||
#define feof(fp) (((fp)->_flags&_EOF)!=0)
|
||||
#define ferror(fp) (((fp)->_flags&_IOERR)!=0)
|
||||
#define clearerr(fp) ((fp)->_flags &= ~(_IOERR|_EOF))
|
||||
#define fileno(fp) ((fp)->_unit)
|
||||
#define fflush(fp) flsh_(fp,-1)
|
||||
#endif
|
||||
ctype.h
|
||||
/* Copyright (C) 1984 by Manx Software Systems */
|
||||
|
||||
extern char ctp_[];
|
||||
|
||||
#define isalpha(x) (ctp_[(x)+1]&0x03)
|
||||
#define isupper(x) (ctp_[(x)+1]&0x01)
|
||||
#define islower(x) (ctp_[(x)+1]&0x02)
|
||||
#define isdigit(x) (ctp_[(x)+1]&0x04)
|
||||
#define isxdigit(x) (ctp_[(x)+1]&0x08)
|
||||
#define isalnum(x) (ctp_[(x)+1]&0x07)
|
||||
#define isspace(x) (ctp_[(x)+1]&0x10)
|
||||
#define ispunct(x) (ctp_[(x)+1]&0x40)
|
||||
#define iscntrl(x) (ctp_[(x)+1]&0x20)
|
||||
#define isprint(x) (ctp_[(x)+1]&0xc7)
|
||||
#define isgraph(x) (ctp_[(x)+1]&0x47)
|
||||
#define isascii(x) (((x)&0x80)==0)
|
||||
|
||||
#define toascii(x) ((x)&127)
|
||||
#define _tolower(x) ((x)|0x20)
|
||||
#define _toupper(x) ((x)&0x5f)
|
||||
|
||||
BIN
Source/Images/d_aztecc/u0/HEX80.COM
Normal file
BIN
Source/Images/d_aztecc/u0/HEX80.COM
Normal file
Binary file not shown.
2583
Source/Images/d_aztecc/u0/LIBASRC.ARC
Normal file
2583
Source/Images/d_aztecc/u0/LIBASRC.ARC
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Source/Images/d_aztecc/u0/LIBC.REL
Normal file
BIN
Source/Images/d_aztecc/u0/LIBC.REL
Normal file
Binary file not shown.
2099
Source/Images/d_aztecc/u0/LIBCSRC.ARC
Normal file
2099
Source/Images/d_aztecc/u0/LIBCSRC.ARC
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Source/Images/d_aztecc/u0/LIBUTIL.COM
Normal file
BIN
Source/Images/d_aztecc/u0/LIBUTIL.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/LN.COM
Normal file
BIN
Source/Images/d_aztecc/u0/LN.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/M.LIB
Normal file
BIN
Source/Images/d_aztecc/u0/M.LIB
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/MATH.REL
Normal file
BIN
Source/Images/d_aztecc/u0/MATH.REL
Normal file
Binary file not shown.
2829
Source/Images/d_aztecc/u0/MATHSRC.ARC
Normal file
2829
Source/Images/d_aztecc/u0/MATHSRC.ARC
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Source/Images/d_aztecc/u0/OVBGN.O
Normal file
BIN
Source/Images/d_aztecc/u0/OVBGN.O
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/OVLOADER.O
Normal file
BIN
Source/Images/d_aztecc/u0/OVLOADER.O
Normal file
Binary file not shown.
404
Source/Images/d_aztecc/u0/OVLY.ARC
Normal file
404
Source/Images/d_aztecc/u0/OVLY.ARC
Normal file
@@ -0,0 +1,404 @@
|
||||
r.c
|
||||
/* Copyright (C) 1984 by Manx Software Systems */
|
||||
#include <stdio.h>
|
||||
|
||||
main(argc, argv)
|
||||
char **argv;
|
||||
{
|
||||
register int (*func)();
|
||||
int (*prgload())();
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "usage: r progname args ...\n");
|
||||
exit(4);
|
||||
}
|
||||
++argv;
|
||||
if ((func = prgload(*argv)) == 0) {
|
||||
fprintf(stderr, "Cannot load program\n");
|
||||
exit(4);
|
||||
}
|
||||
(*func)(argc-1, argv);
|
||||
}
|
||||
|
||||
#define OVMAGIC 0xf1
|
||||
|
||||
struct header {
|
||||
int magic;
|
||||
unsigned ovaddr;
|
||||
unsigned ovsize;
|
||||
unsigned ovbss;
|
||||
int (*ovbgn)();
|
||||
};
|
||||
|
||||
static int (*prgload(argv0))()
|
||||
char *argv0;
|
||||
{
|
||||
int fd;
|
||||
char *topmem, *ovend, *sbrk();
|
||||
unsigned size;
|
||||
struct header header;
|
||||
char name[20];
|
||||
|
||||
strcpy(name, argv0);
|
||||
strcat(name, ".ovr");
|
||||
if ((fd = open(name, 0)) < 0)
|
||||
return 0;
|
||||
if (read(fd, &header, sizeof header) < 0)
|
||||
return 0;
|
||||
/* check magic number on overlay file */
|
||||
if (header.magic != OVMAGIC || header.ovsize == 0)
|
||||
return 0;
|
||||
|
||||
topmem = sbrk(0);
|
||||
ovend = header.ovaddr + header.ovsize + header.ovbss;
|
||||
if (topmem < ovend) {
|
||||
if (sbrk(ovend - topmem) == (char *)-1)
|
||||
return 0;
|
||||
}
|
||||
if (read(fd, header.ovaddr, header.ovsize) < header.ovsize)
|
||||
return 0;
|
||||
close(fd);
|
||||
return header.ovbgn;
|
||||
}
|
||||
crbegin.asm
|
||||
; Copyright (C) 1983 by Manx Software Systems
|
||||
; :ts=8
|
||||
public .ovbgn
|
||||
extrn main_
|
||||
extrn _Uorg_, _Uend_
|
||||
bss saveret,2
|
||||
.ovbgn:
|
||||
lxi h,_Uorg_
|
||||
lxi b,_Uend_-_Uorg_
|
||||
mvi e,0
|
||||
clrbss:
|
||||
mov m,e
|
||||
inx h
|
||||
dcx b
|
||||
mov a,c
|
||||
ora b
|
||||
jnz clrbss
|
||||
;
|
||||
pop h
|
||||
shld saveret
|
||||
call main_
|
||||
lhld saveret ;get return addr
|
||||
pchl ;return to caller
|
||||
end .ovbgn
|
||||
rext.asm
|
||||
extrn .begin
|
||||
extrn execv_
|
||||
extrn execl_
|
||||
extrn agetc_
|
||||
extrn aputc_
|
||||
extrn atoi_
|
||||
extrn atol_
|
||||
extrn calloc_
|
||||
extrn Croot_
|
||||
extrn fdopen_
|
||||
extrn fgets_
|
||||
extrn fopen_
|
||||
extrn freopen_
|
||||
extrn format_
|
||||
extrn fprintf_
|
||||
extrn fputs_
|
||||
extrn fread_
|
||||
extrn fscanf_
|
||||
extrn fseek_
|
||||
extrn ftell_
|
||||
extrn fwrite_
|
||||
extrn getchar_
|
||||
extrn gets_
|
||||
extrn getw_
|
||||
extrn ioctl_
|
||||
extrn isatty_
|
||||
extrn lseek_
|
||||
extrn realloc_
|
||||
extrn malloc_
|
||||
extrn free_
|
||||
extrn creat_
|
||||
extrn open_
|
||||
extrn close_
|
||||
extrn posit_
|
||||
extrn printf_
|
||||
extrn fclose_
|
||||
extrn putchar_
|
||||
extrn puterr_
|
||||
extrn puts_
|
||||
extrn putw_
|
||||
extrn qsort_
|
||||
extrn rename_
|
||||
extrn scanfmt_
|
||||
extrn scanf_
|
||||
extrn setbuf_
|
||||
extrn sprintf_
|
||||
extrn sscanf_
|
||||
extrn ungetc_
|
||||
extrn unlink_
|
||||
extrn bios_
|
||||
extrn index_
|
||||
extrn movmem_
|
||||
extrn rindex_
|
||||
extrn sbrk_
|
||||
extrn rsvstk_
|
||||
extrn setjmp_
|
||||
extrn setmem_
|
||||
extrn strcat_
|
||||
extrn strncat_
|
||||
extrn strcmp_
|
||||
extrn strncmp_
|
||||
extrn strcpy_
|
||||
extrn strlen_
|
||||
extrn strncpy_
|
||||
extrn swapmem_
|
||||
extrn toupper_
|
||||
extrn tolower_
|
||||
extrn getusr_
|
||||
extrn setusr_
|
||||
extrn rstusr_
|
||||
extrn .dv,.ud
|
||||
extrn .ml
|
||||
mrext.asm
|
||||
extrn .begin
|
||||
extrn atof_
|
||||
extrn frexp_, ldexp_, modf_
|
||||
extrn ftoa_
|
||||
extrn asin_
|
||||
extrn acos_
|
||||
extrn arcsine_
|
||||
extrn atan2_
|
||||
extrn atan_
|
||||
extrn exp_
|
||||
extrn floor_
|
||||
extrn ceil_
|
||||
extrn log10_
|
||||
extrn log_
|
||||
extrn pow_
|
||||
extrn ran_
|
||||
extrn randl_
|
||||
extrn cos_
|
||||
extrn sin_
|
||||
extrn sinh_
|
||||
extrn cosh_
|
||||
extrn sqrt_
|
||||
extrn cotan_
|
||||
extrn tan_
|
||||
extrn tanh_
|
||||
|
||||
extrn execv_
|
||||
extrn execl_
|
||||
extrn agetc_
|
||||
extrn aputc_
|
||||
extrn atoi_
|
||||
extrn atol_
|
||||
extrn calloc_
|
||||
extrn Croot_
|
||||
extrn fdopen_
|
||||
extrn fgets_
|
||||
extrn fopen_
|
||||
extrn freopen_
|
||||
extrn format_
|
||||
extrn fprintf_
|
||||
extrn fputs_
|
||||
extrn fread_
|
||||
extrn fscanf_
|
||||
extrn fseek_
|
||||
extrn ftell_
|
||||
extrn fwrite_
|
||||
extrn getchar_
|
||||
extrn gets_
|
||||
extrn getw_
|
||||
extrn ioctl_
|
||||
extrn isatty_
|
||||
extrn lseek_
|
||||
extrn realloc_
|
||||
extrn malloc_
|
||||
extrn free_
|
||||
extrn creat_
|
||||
extrn open_
|
||||
extrn close_
|
||||
extrn posit_
|
||||
extrn printf_
|
||||
extrn fclose_
|
||||
extrn putchar_
|
||||
extrn puts_
|
||||
extrn putw_
|
||||
extrn qsort_
|
||||
extrn rename_
|
||||
extrn scanfmt_
|
||||
extrn scanf_
|
||||
extrn setbuf_
|
||||
extrn sprintf_
|
||||
extrn sscanf_
|
||||
extrn ungetc_
|
||||
extrn unlink_
|
||||
extrn bios_
|
||||
extrn index_
|
||||
extrn movmem_
|
||||
extrn rindex_
|
||||
extrn sbrk_
|
||||
extrn rsvstk_
|
||||
extrn setjmp_
|
||||
extrn setmem_
|
||||
extrn strcat_
|
||||
extrn strncat_
|
||||
extrn strcmp_
|
||||
extrn strncmp_
|
||||
extrn strcpy_
|
||||
extrn strlen_
|
||||
extrn strncpy_
|
||||
extrn swapmem_
|
||||
extrn toupper_
|
||||
extrn tolower_
|
||||
extrn getusr_
|
||||
extrn setusr_
|
||||
extrn rstusr_
|
||||
extrn .dv,.ud
|
||||
extrn .ml
|
||||
ovloader.c
|
||||
/* Copyright (C) 1983, 1984 by Manx Software Systems */
|
||||
|
||||
#define OVMAGIC 0xf1
|
||||
|
||||
struct header {
|
||||
int magic;
|
||||
unsigned ovaddr;
|
||||
unsigned ovsize;
|
||||
unsigned ovbss;
|
||||
int (*ovbgn)();
|
||||
};
|
||||
|
||||
static char *ovname;
|
||||
|
||||
#asm
|
||||
public ovloader
|
||||
ovloader:
|
||||
lxi h,2
|
||||
dad sp
|
||||
mov e,m
|
||||
inx h
|
||||
mov d,m
|
||||
xchg
|
||||
shld ovname_
|
||||
;
|
||||
call _ovld_
|
||||
pchl
|
||||
#endasm
|
||||
|
||||
static
|
||||
_ovld()
|
||||
{
|
||||
int fd, flag;
|
||||
auto struct header hdr;
|
||||
extern char *_mbot;
|
||||
auto char filename[64];
|
||||
|
||||
flag = 0;
|
||||
strcpy(filename, ovname);
|
||||
for (;;) {
|
||||
strcat(filename, ".ovr");
|
||||
if ((fd = open(filename, 0)) >= 0)
|
||||
break;
|
||||
if (flag++)
|
||||
loadabort(10);
|
||||
strcpy(filename, "a:");
|
||||
strcat(filename, ovname);
|
||||
}
|
||||
|
||||
if (read(fd, &hdr, sizeof hdr) != sizeof hdr)
|
||||
loadabort(20);
|
||||
|
||||
/* check magic number on overlay file */
|
||||
if (hdr.magic != OVMAGIC)
|
||||
loadabort(30);
|
||||
|
||||
if (_mbot < hdr.ovaddr+hdr.ovsize+hdr.ovbss)
|
||||
loadabort(40);
|
||||
|
||||
if (read(fd, hdr.ovaddr, hdr.ovsize) < hdr.ovsize)
|
||||
loadabort(50);
|
||||
close(fd);
|
||||
return hdr.ovbgn;
|
||||
}
|
||||
|
||||
static
|
||||
loadabort(code)
|
||||
{
|
||||
char buffer[80];
|
||||
|
||||
sprintf(buffer, "Error %d loading overlay: %s$", code, ovname);
|
||||
bdos(9, buffer);
|
||||
exit(10);
|
||||
}
|
||||
ovbgn.asm
|
||||
; Copyright (C) 1983, 1984 by Manx Software Systems
|
||||
; :ts=8
|
||||
public .ovbgn, ovexit_
|
||||
extrn ovmain_
|
||||
extrn _Uorg_, _Uend_
|
||||
bss ovstkpt,2
|
||||
bss saveret,2
|
||||
bss bcsave,2
|
||||
bss ixsave,2
|
||||
bss iysave,2
|
||||
;
|
||||
.ovbgn:
|
||||
lxi h,_Uorg_
|
||||
lxi b,_Uend_-_Uorg_
|
||||
mvi e,0
|
||||
clrbss:
|
||||
mov m,e
|
||||
inx h
|
||||
dcx b
|
||||
mov a,c
|
||||
ora b
|
||||
jnz clrbss
|
||||
;
|
||||
mov h,b
|
||||
mov l,c
|
||||
shld bcsave
|
||||
xra a
|
||||
adi 3
|
||||
jpe savedone
|
||||
db 221
|
||||
shld ixsave
|
||||
db 253
|
||||
shld iysave
|
||||
savedone:
|
||||
pop h
|
||||
shld saveret
|
||||
pop d
|
||||
lxi h,0
|
||||
dad sp
|
||||
shld ovstkpt ;save stack pointer for ovexit
|
||||
call ovmain_
|
||||
xchg ;save return value
|
||||
ovret:
|
||||
lhld saveret ;get return addr
|
||||
push h ;place dummy overlay name ptr on stack
|
||||
push h ;place return addr on stack
|
||||
xchg ;restore return value to hl
|
||||
ret ;return to caller
|
||||
;
|
||||
ovexit_:
|
||||
lhld bcsave
|
||||
mov b,h
|
||||
mov c,l
|
||||
xra a
|
||||
adi 3
|
||||
jpe restdone
|
||||
db 221
|
||||
lhld ixsave
|
||||
db 253
|
||||
lhld iysave
|
||||
restdone:
|
||||
lxi h,2 ;get return value
|
||||
dad sp
|
||||
mov e,m
|
||||
inx h
|
||||
mov d,m
|
||||
lhld ovstkpt ;restore original stack pointer
|
||||
sphl
|
||||
jmp ovret
|
||||
end .ovbgn
|
||||
|
||||
BIN
Source/Images/d_aztecc/u0/R.O
Normal file
BIN
Source/Images/d_aztecc/u0/R.O
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/RBEGIN.O
Normal file
BIN
Source/Images/d_aztecc/u0/RBEGIN.O
Normal file
Binary file not shown.
4
Source/Images/d_aztecc/u0/RBUILD.SUB
Normal file
4
Source/Images/d_aztecc/u0/RBUILD.SUB
Normal file
@@ -0,0 +1,4 @@
|
||||
as rext.asm
|
||||
ln -ro r.com r.o rext.o -lc
|
||||
pip r.lib=r.rsm[o],rbegin.o[o]
|
||||
|
||||
73
Source/Images/d_aztecc/u0/REXT.ASM
Normal file
73
Source/Images/d_aztecc/u0/REXT.ASM
Normal file
@@ -0,0 +1,73 @@
|
||||
extrn .begin
|
||||
extrn execv_
|
||||
extrn execl_
|
||||
extrn agetc_
|
||||
extrn aputc_
|
||||
extrn atoi_
|
||||
extrn atol_
|
||||
extrn calloc_
|
||||
extrn Croot_
|
||||
extrn fdopen_
|
||||
extrn fgets_
|
||||
extrn fopen_
|
||||
extrn freopen_
|
||||
extrn format_
|
||||
extrn fprintf_
|
||||
extrn fputs_
|
||||
extrn fread_
|
||||
extrn fscanf_
|
||||
extrn fseek_
|
||||
extrn ftell_
|
||||
extrn fwrite_
|
||||
extrn getchar_
|
||||
extrn gets_
|
||||
extrn getw_
|
||||
extrn ioctl_
|
||||
extrn isatty_
|
||||
extrn lseek_
|
||||
extrn realloc_
|
||||
extrn malloc_
|
||||
extrn free_
|
||||
extrn creat_
|
||||
extrn open_
|
||||
extrn close_
|
||||
extrn posit_
|
||||
extrn printf_
|
||||
extrn fclose_
|
||||
extrn putchar_
|
||||
extrn puterr_
|
||||
extrn puts_
|
||||
extrn putw_
|
||||
extrn qsort_
|
||||
extrn rename_
|
||||
extrn scanfmt_
|
||||
extrn scanf_
|
||||
extrn setbuf_
|
||||
extrn sprintf_
|
||||
extrn sscanf_
|
||||
extrn ungetc_
|
||||
extrn unlink_
|
||||
extrn bios_
|
||||
extrn index_
|
||||
extrn movmem_
|
||||
extrn rindex_
|
||||
extrn sbrk_
|
||||
extrn rsvstk_
|
||||
extrn setjmp_
|
||||
extrn setmem_
|
||||
extrn strcat_
|
||||
extrn strncat_
|
||||
extrn strcmp_
|
||||
extrn strncmp_
|
||||
extrn strcpy_
|
||||
extrn strlen_
|
||||
extrn strncpy_
|
||||
extrn swapmem_
|
||||
extrn toupper_
|
||||
extrn tolower_
|
||||
extrn getusr_
|
||||
extrn setusr_
|
||||
extrn rstusr_
|
||||
extrn .dv,.ud
|
||||
extrn .ml
|
||||
|
||||
BIN
Source/Images/d_aztecc/u0/ROM.LIB
Normal file
BIN
Source/Images/d_aztecc/u0/ROM.LIB
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/SIDSYM.COM
Normal file
BIN
Source/Images/d_aztecc/u0/SIDSYM.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/SQZ.COM
Normal file
BIN
Source/Images/d_aztecc/u0/SQZ.COM
Normal file
Binary file not shown.
BIN
Source/Images/d_aztecc/u0/T.LIB
Normal file
BIN
Source/Images/d_aztecc/u0/T.LIB
Normal file
Binary file not shown.
332
Source/Images/d_aztecc/u0/TINYSRC.ARC
Normal file
332
Source/Images/d_aztecc/u0/TINYSRC.ARC
Normal file
@@ -0,0 +1,332 @@
|
||||
croot.c
|
||||
/* Copyright (C) 1981, 1982 by Manx Software Systems */
|
||||
/* Copyright (C) 1983 by Manx Software Systems */
|
||||
|
||||
#define MAXARGS 30
|
||||
static char *Argv[MAXARGS];
|
||||
static char Argbuf[128];
|
||||
static int Argc;
|
||||
|
||||
Croot()
|
||||
{
|
||||
register char *cp;
|
||||
|
||||
movmem((char *)0x81, Argbuf, 127);
|
||||
Argbuf[*(char *)0x80 & 0x7f] = 0;
|
||||
Argv[0] = "";
|
||||
cp = Argbuf;
|
||||
Argc = 1;
|
||||
while (Argc < MAXARGS) {
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
++cp;
|
||||
if (*cp == 0)
|
||||
break;
|
||||
Argv[Argc++] = cp;
|
||||
while (*++cp)
|
||||
if (*cp == ' ' || *cp == '\t') {
|
||||
*cp++ = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
main(Argc,Argv);
|
||||
_exit();
|
||||
}
|
||||
|
||||
exit(code)
|
||||
{
|
||||
_exit();
|
||||
}
|
||||
|
||||
getchar()
|
||||
{
|
||||
register int c;
|
||||
|
||||
if ((c = bdos(1)) == '\r') {
|
||||
bdos(2,'\n');
|
||||
c = '\n';
|
||||
} else if (c == 0x1a)
|
||||
c = -1;
|
||||
return c;
|
||||
}
|
||||
|
||||
putchar(c)
|
||||
{
|
||||
if (c == '\n')
|
||||
bdos(2,'\r');
|
||||
bdos(2,c);
|
||||
return c&255;
|
||||
}
|
||||
fprintf.c
|
||||
/* Copyright (C) 1981,1982 by Manx Software Systems */
|
||||
/* Copyright (C) 1982 Thomas Fenwick */
|
||||
#include "stdio.h"
|
||||
|
||||
static FILE *Stream;
|
||||
|
||||
fprintf(stream,fmt,args)
|
||||
FILE *stream; char *fmt; unsigned args;
|
||||
{
|
||||
int fpsub();
|
||||
|
||||
Stream = stream;
|
||||
return format(fpsub,fmt,&args);
|
||||
}
|
||||
|
||||
static
|
||||
fpsub(c)
|
||||
{
|
||||
return aputc(c,Stream);
|
||||
}
|
||||
printf.c
|
||||
/* Copyright (C) 1981, 1982 by Manx Software Systems */
|
||||
/* Copyright (C) 1983 by Manx Software Systems */
|
||||
|
||||
printf(fmt,args)
|
||||
char *fmt; unsigned args;
|
||||
{
|
||||
int putchar();
|
||||
|
||||
format(putchar,fmt,&args);
|
||||
}
|
||||
|
||||
format(putsub, fmt, args)
|
||||
register int (*putsub)(); register char *fmt; unsigned *args;
|
||||
{
|
||||
register int c;
|
||||
char *ps;
|
||||
char s[8];
|
||||
static char *dconv(), *hexconv();
|
||||
|
||||
while ( c = *fmt++ ) {
|
||||
if ( c == '%' ) {
|
||||
switch ( c = *fmt++ ) {
|
||||
case 'x':
|
||||
ps = hexconv(*args++, s+7);
|
||||
break;
|
||||
case 'u':
|
||||
ps = dconv(*args++, s+7);
|
||||
break;
|
||||
case 'd':
|
||||
if ( (int)*args < 0 ) {
|
||||
ps = dconv(-*args++, s+7);
|
||||
*--ps = '-';
|
||||
} else
|
||||
ps = dconv(*args++, s+7);
|
||||
break;
|
||||
case 's':
|
||||
ps = *args++;
|
||||
break;
|
||||
case 'c':
|
||||
c = *args++;
|
||||
default:
|
||||
goto deflt;
|
||||
}
|
||||
|
||||
while ( *ps )
|
||||
(*putsub)(*ps++);
|
||||
|
||||
} else
|
||||
deflt:
|
||||
(*putsub)(c);
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
dconv(n, s)
|
||||
register char *s; register unsigned n;
|
||||
{
|
||||
*s = 0;
|
||||
do {
|
||||
*--s = n%10 + '0';
|
||||
} while ( (n /= 10) != 0 );
|
||||
return s;
|
||||
}
|
||||
|
||||
static char *
|
||||
hexconv(n, s)
|
||||
register char *s; register unsigned n;
|
||||
{
|
||||
*s = 0;
|
||||
do {
|
||||
*--s = "0123456789abcdef" [n&15];
|
||||
} while ( (n >>= 4) != 0 );
|
||||
return s;
|
||||
}
|
||||
fopen.c
|
||||
/* Copyright (C) 1981, 1982 by Manx Software Systems */
|
||||
/* Copyright (C) 1983, 1984 by Manx Software Systems */
|
||||
#include "stdio.h"
|
||||
#include "errno.h"
|
||||
|
||||
#define MAXFILE 4
|
||||
#define RBUFSIZ 1024
|
||||
#define WBUFSIZ 1024
|
||||
#define RDNSCT (RBUFSIZ/128)
|
||||
#define WRNSCT (WBUFSIZ/128)
|
||||
|
||||
#define OPNFIL 15
|
||||
#define CLSFIL 16
|
||||
#define DELFIL 19
|
||||
#define READSQ 20
|
||||
#define WRITSQ 21
|
||||
#define MAKFIL 22
|
||||
#define SETDMA 26
|
||||
#define READRN 33
|
||||
#define WRITRN 34
|
||||
#define FILSIZ 35
|
||||
#define SETREC 36
|
||||
|
||||
static FILE Cbuffs[MAXFILE];
|
||||
static char writbuf[WBUFSIZ];
|
||||
static char readbuf[RBUFSIZ];
|
||||
static char *bufeof;
|
||||
static FILE *curread;
|
||||
static FILE *writfp;
|
||||
|
||||
FILE *
|
||||
fopen(name,mode)
|
||||
char *name,*mode;
|
||||
{
|
||||
register FILE *fp;
|
||||
int user;
|
||||
|
||||
fp = Cbuffs;
|
||||
while ( fp->_bp ) {
|
||||
if ( ++fp >= Cbuffs+MAXFILE ) {
|
||||
errno = ENFILE;
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if ((user = fcbinit(name,&fp->_fcb)) == -1) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (user == 255)
|
||||
user = getusr();
|
||||
fp->user = user;
|
||||
setusr(user);
|
||||
if (*mode == 'r') {
|
||||
if (bdos(OPNFIL,&fp->_fcb) == 0xff) {
|
||||
errno = ENOENT;
|
||||
rstusr();
|
||||
return NULL;
|
||||
}
|
||||
fp->_bp = readbuf;
|
||||
curread = 0;
|
||||
} else {
|
||||
if ( writfp )
|
||||
return NULL;
|
||||
bdos(DELFIL, &fp->_fcb);
|
||||
if (bdos(MAKFIL,&fp->_fcb) == 0xff) {
|
||||
errno = ENOENT;
|
||||
rstusr();
|
||||
return NULL;
|
||||
}
|
||||
fp->_bp = writbuf;
|
||||
writfp = fp;
|
||||
}
|
||||
rstusr();
|
||||
fp->_fcb.f_overfl = fp->_fcb.f_record = 0;
|
||||
return fp;
|
||||
}
|
||||
|
||||
fclose(ptr)
|
||||
register FILE *ptr;
|
||||
{
|
||||
register int err;
|
||||
|
||||
err = 0;
|
||||
if (ptr == writfp) { /* if writing flush buffer */
|
||||
err = flush(ptr->_bp - writbuf);
|
||||
writfp = 0;
|
||||
} else if (ptr == curread)
|
||||
curread = 0;
|
||||
setusr(ptr->user);
|
||||
if (bdos(CLSFIL,&ptr->_fcb) == 0xff)
|
||||
err = -1;
|
||||
rstusr();
|
||||
ptr->_bp = 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
agetc(ptr)
|
||||
register FILE *ptr;
|
||||
{
|
||||
register int c;
|
||||
|
||||
top:
|
||||
if ((c = getc(ptr)) != EOF) {
|
||||
switch (c &= 127) {
|
||||
case 0x1a:
|
||||
--ptr->_bp;
|
||||
return EOF;
|
||||
case '\r':
|
||||
case 0:
|
||||
goto top;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
getc(ptr)
|
||||
register FILE *ptr;
|
||||
{
|
||||
register int j;
|
||||
|
||||
if (ptr != curread) {
|
||||
readit:
|
||||
curread = 0; /* mark nobody as current read */
|
||||
setusr(ptr->user);
|
||||
if ((j = RDNSCT - blkrd(&ptr->_fcb,readbuf,RDNSCT)) == 0)
|
||||
return -1;
|
||||
rstusr();
|
||||
ptr->_fcb.f_record -= j;
|
||||
bufeof = readbuf + j*128;
|
||||
curread = ptr;
|
||||
}
|
||||
if (ptr->_bp >= bufeof) {
|
||||
ptr->_fcb.f_record += (bufeof-readbuf) >> 7;
|
||||
ptr->_bp = readbuf;
|
||||
goto readit;
|
||||
}
|
||||
return *ptr->_bp++ & 255;
|
||||
}
|
||||
|
||||
aputc(c,ptr)
|
||||
register int c; register FILE *ptr;
|
||||
{
|
||||
c &= 127;
|
||||
if (c == '\n')
|
||||
if (putc('\r',ptr) == EOF)
|
||||
return EOF;
|
||||
return putc(c,ptr);
|
||||
}
|
||||
|
||||
putc(c,ptr)
|
||||
int c; register FILE *ptr;
|
||||
{
|
||||
*ptr->_bp++ = c;
|
||||
if (ptr->_bp >= writbuf+WBUFSIZ) {
|
||||
if (flush(WBUFSIZ))
|
||||
return EOF;
|
||||
ptr->_bp = writbuf;
|
||||
}
|
||||
return (c&255);
|
||||
}
|
||||
|
||||
flush(len)
|
||||
register int len;
|
||||
{
|
||||
while (len & 127)
|
||||
writbuf[len++] = 0x1a;
|
||||
setusr(writfp->user);
|
||||
if (len != 0 && blkwr(&writfp->_fcb,writbuf,len>>7) != 0) {
|
||||
rstusr();
|
||||
return EOF;
|
||||
}
|
||||
rstusr();
|
||||
return 0;
|
||||
}
|
||||
|
||||
11
Source/Images/d_bascomp/Readme.txt
Normal file
11
Source/Images/d_bascomp/Readme.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
===== Microsoft Basic-80 Compiler v.5.30a =====
|
||||
|
||||
The Microsoft BASIC Compiler is a highly efficient programming tool that
|
||||
converts BASIC programs from BASIC source code into machine code. This
|
||||
provides much faster BASIC program execution than has previously been
|
||||
possible. It can make programs run an average of 3 to 10 times faster than
|
||||
programs run under BASIC-80. Compiled programs can be up to 30 times
|
||||
faster than interpreted programs if maximum use of integer variables is
|
||||
made.
|
||||
|
||||
View BASCOM.HLP included in the disk image using HELP.COM for documentation.
|
||||
BIN
Source/Images/d_bascomp/u0/BASCOM.COM
Normal file
BIN
Source/Images/d_bascomp/u0/BASCOM.COM
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user