|
|
|
@ -3725,42 +3725,51 @@ HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION |
|
|
|
; ALL REGISTERS PERSERVED |
|
|
|
; |
|
|
|
HB_DSKACT: |
|
|
|
; SAVE EVERYTHING |
|
|
|
PUSH AF |
|
|
|
PUSH BC |
|
|
|
PUSH DE |
|
|
|
PUSH HL |
|
|
|
LD DE,DSKY_HEXBUF+3 ; START AT END |
|
|
|
LD B,3 ; 3 BYTES OF SECTOR ADDRESS |
|
|
|
; |
|
|
|
; COPY VALUE TO LOCAL HEXBUF |
|
|
|
CALL LD32 |
|
|
|
; |
|
|
|
HB_DSKACT1: |
|
|
|
LD A,(HL) ; GET FIRST BYTE |
|
|
|
LD (DE),A ; AND STORE IN BUF |
|
|
|
INC HL ; NEXT SRC BYTE |
|
|
|
DEC DE ; NEXT DEST BYTE |
|
|
|
DJNZ HB_DSKACT1 ; LOOP |
|
|
|
LD BC,DSKY_HEXBUF |
|
|
|
CALL ST32 |
|
|
|
; |
|
|
|
; USE DISK UNIT NUMBER FOR MSB |
|
|
|
LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM |
|
|
|
LD (DE),A ; PUT AT HEAD OF BUF |
|
|
|
HB_DSKACT2: |
|
|
|
LD HL,DSKY_HEXBUF ; BINARY BUF |
|
|
|
LD DE,DSKY_BUF ; DISPLAY BUF |
|
|
|
CALL DSKY_BIN2SEG ; CONVERT TO SEG DISPLAY BUF |
|
|
|
LD A,(DSKY_BUF+1) ; SECOND SEGMENT |
|
|
|
OR %10000000 ; TURN ON DOT |
|
|
|
LD (DSKY_BUF+1),A ; SAVE IT |
|
|
|
LD (DSKY_HEXBUF+3),A ; REPLACE HIGH BYTE W/ DISK # |
|
|
|
; |
|
|
|
; CONVERT TO SEGMENT DISPLAY |
|
|
|
LD HL,DSKY_HEXBUF ; INPUT POINTER |
|
|
|
LD DE,DSKY_BUF ; TEMP BUF FOR OUTPUT |
|
|
|
CALL DSKY_BIN2SEG ; CONVERT TO SEG DISPLAY |
|
|
|
; |
|
|
|
; DECIMAL POINT FOR DISK UNIT SEPARATION |
|
|
|
LD HL,DSKY_BUF+1 ; SECOND CHAR OF DISP |
|
|
|
SET 7,(HL) ; TURN ON DECIMAL PT |
|
|
|
; |
|
|
|
; DECIMAL POINT TO INDICATE WRITE ACTION |
|
|
|
LD A,(HB_DSKFUNC) ; GET CURRENT I/O FUNCTION |
|
|
|
CP BF_DIOWRITE ; IS IT A WRITE? |
|
|
|
JR NZ,HB_DSKACT3 ; IF NOT, NO DOT, SKIP AHEAD |
|
|
|
LD A,(DSKY_BUF+7) ; LAST SEGMENT |
|
|
|
OR %10000000 ; TURN ON DOT |
|
|
|
LD (DSKY_BUF+7),A ; SAVE IT |
|
|
|
HB_DSKACT3: |
|
|
|
EX DE,HL ; SEG DISPLAY BUF TO HL |
|
|
|
LD B,BF_DSKYSHOWSEG |
|
|
|
CALL DSKY_DISPATCH |
|
|
|
JR NZ,HB_DSKACT2 ; IF NOT, SKIP |
|
|
|
LD HL,DSKY_BUF+7 ; POINT TO CHAR 7 |
|
|
|
SET 7,(HL) ; SET WRITE DOT |
|
|
|
; |
|
|
|
HB_DSKACT2: |
|
|
|
; UPDATE DISPLAY |
|
|
|
LD HL,DSKY_BUF ; SEG DISPLAY BUF TO HL |
|
|
|
LD B,BF_DSKYSHOWSEG ; SHOW SEG FUNCTION |
|
|
|
CALL DSKY_DISPATCH ; DO IT |
|
|
|
; |
|
|
|
; CLEAN UP AND GO AWAY |
|
|
|
POP HL |
|
|
|
POP DE |
|
|
|
POP BC |
|
|
|
POP AF |
|
|
|
RET |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
; THIS IS THE CHS VARIANT OF THE ABOVE. THIS IS USED BY CHS ORIENTED |
|
|
|
; DISK DRIVERS (BASICALLY JUST FLOPPY). |
|
|
|
@ -3777,23 +3786,10 @@ HB_DSKACTCHS: |
|
|
|
PUSH BC |
|
|
|
PUSH DE |
|
|
|
PUSH HL |
|
|
|
LD DE,DSKY_HEXBUF ; START OF HEX BUF |
|
|
|
LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM |
|
|
|
LD (DE),A ; PUT AT HEAD OF BUF |
|
|
|
INC DE ; NEXT BYTE OF BUF |
|
|
|
LD A,(HL) ; LSB OF TRACK |
|
|
|
LD (DE),A ; ADD TO BUF |
|
|
|
INC DE ; NEXT BYTE OF BUF |
|
|
|
INC HL ; BUMP TO HEAD |
|
|
|
INC HL ; " |
|
|
|
INC HL ; " |
|
|
|
LD A,(HL) ; GET HEAD |
|
|
|
LD (DE),A ; ADD TO BUF |
|
|
|
INC DE ; NEXT BYTE OF BUF |
|
|
|
DEC HL ; BACK TO SECTOR |
|
|
|
LD A,(HL) ; GET SECTOR |
|
|
|
LD (DE),A ; ADD TO BUF |
|
|
|
JR HB_DSKACT2 |
|
|
|
CALL LD32 ; DE:HL = HSCC |
|
|
|
; MAP HSCC -> CCHS |
|
|
|
EX DE,HL |
|
|
|
JR HB_DSKACT1 |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
@ -5141,37 +5137,29 @@ HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY |
|
|
|
; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) |
|
|
|
; |
|
|
|
DSKY_BIN2SEG: |
|
|
|
PUSH HL |
|
|
|
PUSH DE |
|
|
|
LD B,4 ; 4 BYTES OF INPUT |
|
|
|
EX DE,HL |
|
|
|
LD A,B ; PUT IN ACCUM |
|
|
|
CALL ADDHLA ; PROCESS FROM END (LITTLE ENDIAN) |
|
|
|
DSKY_BIN2SEG1: |
|
|
|
LD A,(DE) ; FIRST NIBBLE |
|
|
|
SRL A |
|
|
|
SRL A |
|
|
|
SRL A |
|
|
|
SRL A |
|
|
|
PUSH HL |
|
|
|
LD HL,DSKY_HEXMAP |
|
|
|
CALL ADDHLA |
|
|
|
LD A,(HL) |
|
|
|
POP HL |
|
|
|
LD (HL),A |
|
|
|
INC HL |
|
|
|
LD A,(DE) ; SECOND NIBBLE |
|
|
|
AND 0FH |
|
|
|
PUSH HL |
|
|
|
LD HL,DSKY_HEXMAP |
|
|
|
CALL ADDHLA |
|
|
|
LD A,(HL) |
|
|
|
POP HL |
|
|
|
LD (HL),A |
|
|
|
INC HL |
|
|
|
INC DE ; NEXT BYTE |
|
|
|
DJNZ DSKY_BIN2SEG1 |
|
|
|
POP DE |
|
|
|
POP HL |
|
|
|
RET |
|
|
|
DEC HL ; DEC PTR (LITTLE ENDIAN) |
|
|
|
LD A,(HL) ; HIGH NIBBLE |
|
|
|
RRCA \ RRCA \ RRCA \ RRCA ; ROTATE BITS |
|
|
|
CALL DSKY_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF |
|
|
|
LD A,(HL) ; LOW NIBBLE |
|
|
|
CALL DSKY_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF |
|
|
|
DJNZ DSKY_BIN2SEG1 ; LOOP FOR ALL INPUT BYTES |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
DSKY_BIN2SEG_NIB: |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,DSKY_HEXMAP ; POINT TO SEG MAP TABLE |
|
|
|
AND $0F ; ISOLATE LOW NIBBLE |
|
|
|
CALL ADDHLA ; OFFSET INTO TABLE |
|
|
|
LD A,(HL) ; LOAD VALUE FROM TABLE |
|
|
|
POP HL ; RESTORE HL |
|
|
|
LD (DE),A ; SAVE VALUE TO OUTPUT BUF |
|
|
|
INC DE ; BUMP TO NEXT OUTPUT BYTE |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
|