Browse Source

Refactor of device summary

pull/44/head
b1ackmai1er 7 years ago
parent
commit
a3a4e84965
  1. 192
      Source/HBIOS/hbios.asm
  2. 39
      Source/HBIOS/pio.asm
  3. 27
      Source/HBIOS/util.asm

192
Source/HBIOS/hbios.asm

@ -1357,18 +1357,23 @@ HB_SPDTST:
PRTX(STR_PLATFORM) PRTX(STR_PLATFORM)
; ;
LD A,(HB_CPUTYPE) ; GET CPU TYPE LD A,(HB_CPUTYPE) ; GET CPU TYPE
OR A ; SET FLAGS
LD DE,HB_STRZ80 ; Z80
JR Z,HB_PCPU ; IF Z80, PRINT IT
DEC A ; NEXT CPU TYPE
LD DE,HB_STRZ180 ; Z80180
JR Z,HB_PCPU ; IF Z80180, PRINT IT
DEC A ; NEXT CPU TYPE
LD DE,HB_STRZS180K ; Z8S180 REV K
JR Z,HB_PCPU ; IF Z8S180-K, PRINT IT
LD DE,HB_STRZS180N ; Z8S180 REV N
LD DE,HB_CPU_STR ; DISPLAY IT
CALL PRTIDXDEA
; OR A ; SET FLAGS
; LD DE,HB_STRZ80 ; Z80
; JR Z,HB_PCPU ; IF Z80, PRINT IT
; DEC A ; NEXT CPU TYPE
; LD DE,HB_STRZ180 ; Z80180
; JR Z,HB_PCPU ; IF Z80180, PRINT IT
; DEC A ; NEXT CPU TYPE
; LD DE,HB_STRZS180K ; Z8S180 REV K
; JR Z,HB_PCPU ; IF Z8S180-K, PRINT IT
; LD DE,HB_STRZS180N ; Z8S180 REV N
JR HB_PCPU ; PRINT Z8S180-N JR HB_PCPU ; PRINT Z8S180-N
; ;
HB_CPU_STR:
HB_STRZ80 .TEXT " Z80$" HB_STRZ80 .TEXT " Z80$"
HB_STRZ180 .TEXT " Z80180$" HB_STRZ180 .TEXT " Z80180$"
HB_STRZS180K .TEXT " Z8S180-K$" HB_STRZS180K .TEXT " Z8S180-K$"
@ -3016,7 +3021,6 @@ PRTD3M2:
CALL COUT CALL COUT
PRTD3M3: PRTD3M3:
RET RET
;
;================================================================================================== ;==================================================================================================
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES ; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
;================================================================================================== ;==================================================================================================
@ -3026,58 +3030,100 @@ PRTSUM:
LD DE,PS_STRHDR ; POINT TO HEADER LD DE,PS_STRHDR ; POINT TO HEADER
CALL WRITESTR ; PRINT IT CALL WRITESTR ; PRINT IT
; ;
; PRINT DISK DEVICES
LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
LD C,BF_SYSGET_DIOCNT ; SUBFUNC: DISK UNIT COUNT
RST 08 ; E := DISK UNIT COUNT
LD B,E ; MOVE TO B FOR LOOP COUNT
LD A,E ; MOVE TO ACCUM
OR A ; SET FLAGS
JR Z,PRTSUM1A ; IF NONE, BYPASS
LD C,0 ; C WILL BE UNIT INDEX
PRTSUM1:
PUSH BC ; SAVE LOOP CONTROL
CALL PS_DISK ; PRINT DISK INFO
POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP DISK UNIT INDEX
DJNZ PRTSUM1 ; LOOP THRU ALL DISK DEVICES
LD C,BF_SYSGET_CIOCNT ; CHARACTER DEVICES
LD HL,PS_SERIAL
CALL PRT_ALLD
; ;
PRTSUM1A:
; PRINT SERIAL DEVICES
LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
LD C,BF_SYSGET_CIOCNT ; SUBFUNC: SERIAL UNIT COUNT
RST 08 ; E := SERIAL UNIT COUNT
LD B,E ; MOVE TO B FOR LOOP COUNT
LD A,E ; MOVE TO ACCUM
OR A ; SET FLAGS
JR Z,PRTSUM2A ; IF NONE, BYPASS
LD C,0 ; C WILL BE UNIT INDEX
PRTSUM2:
PUSH BC ; SAVE LOOP CONTROL
CALL PS_SERIAL ; PRINT SERIAL INFO
POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP SERIAL UNIT INDEX
DJNZ PRTSUM2 ; LOOP THRU ALL SERIAL DEVICES
LD C,BF_SYSGET_DIOCNT ; DISK DRIVES
LD HL,PS_DISK
CALL PRT_ALLD
LD C,BF_SYSGET_VDACNT ; VIDEO DEVICES
LD HL,PS_VIDEO
CALL PRT_ALLD
RET
; ;
PRTSUM2A:
; PRINT VIDEO DEVICES
PRT_ALLD:
LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
LD C,BF_SYSGET_VDACNT ; SUBFUNC: VIDEO UNIT COUNT
RST 08 ; E := SERIAL UNIT COUNT
RST 08 ; E := UNIT COUNT
LD B,E ; MOVE TO B FOR LOOP COUNT LD B,E ; MOVE TO B FOR LOOP COUNT
LD A,E ; MOVE TO ACCUM LD A,E ; MOVE TO ACCUM
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,PRTSUM3A ; IF NONE, BYPASS
JR Z,PRT_ALLD1 ; IF NONE, BYPASS
LD C,0 ; C WILL BE UNIT INDEX LD C,0 ; C WILL BE UNIT INDEX
PRTSUM3:
PRT_ALLD1:
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
CALL PS_VIDEO ; PRINT VIDEO INFO
PUSH DE
PUSH HL
CALL JPHL ; CALL THE ROUTINE PASSED IN HL
POP HL
POP DE
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
INC C ; BUMP VIDEO UNIT INDEX
DJNZ PRTSUM3 ; LOOP THRU ALL VIDEO DEVICES
INC C ; BUMP DISK UNIT INDEX
DJNZ PRT_ALLD1 ; LOOP THRU ALL DISK DEVICES
RET
; ;
PRTSUM3A:
RET ; DONE
;==================================================================================================
; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES
;==================================================================================================
;
;PRTSUM:
; CALL NEWLINE2 ; SKIP A LINE
; LD DE,PS_STRHDR ; POINT TO HEADER
; CALL WRITESTR ; PRINT IT
;
; ; PRINT DISK DEVICES
; LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
; LD C,BF_SYSGET_DIOCNT ; SUBFUNC: DISK UNIT COUNT
; RST 08 ; E := DISK UNIT COUNT
; LD B,E ; MOVE TO B FOR LOOP COUNT
; LD A,E ; MOVE TO ACCUM
; OR A ; SET FLAGS
; JR Z,PRTSUM1A ; IF NONE, BYPASS
; LD C,0 ; C WILL BE UNIT INDEX
;PRTSUM1:
; PUSH BC ; SAVE LOOP CONTROL
; CALL PS_DISK ; PRINT DISK INFO
; POP BC ; RESTORE LOOP CONTROL
; INC C ; BUMP DISK UNIT INDEX
; DJNZ PRTSUM1 ; LOOP THRU ALL DISK DEVICES
;
;PRTSUM1A:
; ; PRINT SERIAL DEVICES
; LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
; LD C,BF_SYSGET_CIOCNT ; SUBFUNC: SERIAL UNIT COUNT
; RST 08 ; E := SERIAL UNIT COUNT
; LD B,E ; MOVE TO B FOR LOOP COUNT
; LD A,E ; MOVE TO ACCUM
; OR A ; SET FLAGS
; JR Z,PRTSUM2A ; IF NONE, BYPASS
; LD C,0 ; C WILL BE UNIT INDEX
;PRTSUM2:
; PUSH BC ; SAVE LOOP CONTROL
; CALL PS_SERIAL ; PRINT SERIAL INFO
; POP BC ; RESTORE LOOP CONTROL
; INC C ; BUMP SERIAL UNIT INDEX
; DJNZ PRTSUM2 ; LOOP THRU ALL SERIAL DEVICES
;
;PRTSUM2A:
; ; PRINT VIDEO DEVICES
; LD B,BF_SYSGET ; FUNC: SYSTEM INFO GET
; LD C,BF_SYSGET_VDACNT ; SUBFUNC: VIDEO UNIT COUNT
; RST 08 ; E := SERIAL UNIT COUNT
; LD B,E ; MOVE TO B FOR LOOP COUNT
; LD A,E ; MOVE TO ACCUM
; OR A ; SET FLAGS
; JR Z,PRTSUM3A ; IF NONE, BYPASS
; LD C,0 ; C WILL BE UNIT INDEX
;PRTSUM3:
; PUSH BC ; SAVE LOOP CONTROL
; CALL PS_VIDEO ; PRINT VIDEO INFO
; POP BC ; RESTORE LOOP CONTROL
; INC C ; BUMP VIDEO UNIT INDEX
; DJNZ PRTSUM3 ; LOOP THRU ALL VIDEO DEVICES
;
;PRTSUM3A:
; RET ; DONE
; ;
; PRINT ONE LINE DISK UNIT/DEVICE INFO, DISK UNIT INDEX IN C ; PRINT ONE LINE DISK UNIT/DEVICE INFO, DISK UNIT INDEX IN C
; ;
@ -3348,32 +3394,16 @@ PSPRTPC0:
JP Z,PS_PRTNUL ; $FF == NO CONFIG DEFINED JP Z,PS_PRTNUL ; $FF == NO CONFIG DEFINED
; ;
PS_PRTPC0: PS_PRTPC0:
LD A,E
RLCA
RLCA
LD A,E ; CONVERT THE TYPE TO
RLCA ; A TABLE INDEX 0..5
RLCA ; AND DISPLAY THE TYPE
AND 00000011B AND 00000011B
JR NZ,PSPRTPC1
PRTS("Output$")
RET
PSPRTPC1:
DEC A
JR NZ,PSPRTPC2
PRTS("Input$")
RET
PSPRTPC2:
DEC A
JR NZ,PSPRTPC3
PRTS("Bidirectional$")
RET
PSPRTPC3:
DEC A
JR NZ,PSPRTPC4
PRTS("BitCtrl$")
RET
PSPRTPC4:
PRTS("Undefined$")
PUSH DE
LD DE,PIO_MODE_STR
CALL PRTIDXDEA
POP DE
RET RET
;
PS_PRTSC1: PS_PRTSC1:
; PRINT TERMINAL CONFIG ; PRINT TERMINAL CONFIG
LD A,C ; GET ATTRIBUTE VALUE LD A,C ; GET ATTRIBUTE VALUE
@ -3578,10 +3608,14 @@ PS_STTERM .TEXT "Terminal$"
PS_STPPT .TEXT "Parallel$" PS_STPPT .TEXT "Parallel$"
; ;
PS_STPARMAP .DB "NONENMNS" PS_STPARMAP .DB "NONENMNS"
; ;
; SERIAL TYPE STRINGS
; PIO TYPE STRINGS
; ;
PIO_MODE_STR:
.TEXT "Output$"
.TEXT "Input$"
.TEXT "Bidirectional$"
.TEXT "BitCtrl$"
; ;
; VIDEO DEVICE STRINGS ; VIDEO DEVICE STRINGS
; ;

39
Source/HBIOS/pio.asm

@ -24,8 +24,8 @@
; would be required to support this configuration. As the HBIOS only has an allocation of ; would be required to support this configuration. As the HBIOS only has an allocation of
; 16, a full implmentation is impractical. ; 16, a full implmentation is impractical.
; ;
; The compromise solution is to allow 4 interrupts for the PIO driver.; All remaining PIO's
; are limited to Bit mode or blind read and writed to the input/output ports.
; The compromise solution is to allow 4 interrupts for the PIO driver. All remaining PIO's
; are limited to Bit mode or blind read and write to the input/output ports.
; ;
; Zilog PIO reset state: ; Zilog PIO reset state:
; ;
@ -130,7 +130,7 @@ PIO_PREINIT0:
; PUSH HL ; SAVE IT ; PUSH HL ; SAVE IT
; POP IY ; ... TO IY ; POP IY ; ... TO IY
CALL IDXCFG
CALL IDXCFG
LD (HL),C LD (HL),C
@ -215,8 +215,12 @@ SKPINIT:DJNZ PIO_PREINIT0 ; LOOP UNTIL DONE
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND RETURN RET ; AND RETURN
; ;
; X24
; INDEX INTO THE CONFIG TABLE
; ON ENTRY C = UNIT NUMBER
; ON EXIT IY = CONFIG DATA POINTER
; ON EXIT DE = CONFIG TABLE START
; ;
; EACH CONFIG TABLE IS 24 BYTES LONG
; ;
CFG_SIZ .EQU 24 CFG_SIZ .EQU 24
; ;
@ -778,14 +782,9 @@ PIO_PRTCFG:
; PRINT THE PIO TYPE ; PRINT THE PIO TYPE
CALL PC_SPACE ; FORMATTING CALL PC_SPACE ; FORMATTING
LD A,(IY+1) ; GET PIO TYPE BYTE LD A,(IY+1) ; GET PIO TYPE BYTE
RLCA ; MAKE IT A WORD OFFSET
LD HL,PIO_TYPE_MAP ; POINT HL TO TYPE MAP TABLE
CALL ADDHLA ; HL := ENTRY
LD E,(HL) ; DEREFERENCE
INC HL ; ...
LD D,(HL) ; ... TO GET STRING POINTER
CALL WRITESTR ; PRINT IT
;
LD DE,PIO_TYPE_STR ; POINT HL TO TYPE MAP TABLE
CALL PRTIDXDEA
; ALL DONE IF NO PIO WAS DETECTED ; ALL DONE IF NO PIO WAS DETECTED
LD A,(IY+1) ; GET PIO TYPE BYTE LD A,(IY+1) ; GET PIO TYPE BYTE
OR A ; SET FLAGS OR A ; SET FLAGS
@ -812,16 +811,11 @@ PIO_DEV .DB 0 ; DEVICE NUM USED DURING INIT
; ;
; DESCRIPTION OF DIFFERENT PORT TYPES ; DESCRIPTION OF DIFFERENT PORT TYPES
; ;
PIO_TYPE_MAP:
.DW PIO_STR_NONE
.DW PIO_STR_PIO
.DW PIO_STR_8255
.DW PIO_STR_PORT
PIO_STR_NONE .DB "<NOT PRESENT>$"
PIO_STR_PIO .DB "Zilog PIO$"
PIO_STR_8255 .DB "i8255 PPI$"
PIO_STR_PORT .DB "IO Port$"
PIO_TYPE_STR:
PIO_STR_NONE .TEXT "<NOT PRESENT>$" ; IDX 0
PIO_STR_PIO .TEXT "Zilog PIO$" ; IDX 1
PIO_STR_8255 .TEXT "i8255 PPI$" ; IDX 2
PIO_STR_PORT .TEXT "IO Port$" ; IDX 3
; ;
; Z80 PIO PORT TABLE - EACH ENTRY IS FOR 1 CHIP I.E. TWO PORTS ; Z80 PIO PORT TABLE - EACH ENTRY IS FOR 1 CHIP I.E. TWO PORTS
; ;
@ -974,6 +968,7 @@ PIO_INIT1:
; POP AF ; POP AF
; CALL ADDHLA ; HL := ENTRY ADDRESS ; CALL ADDHLA ; HL := ENTRY ADDRESS
; PUSH HL ; COPY CFG DATA PTR ; PUSH HL ; COPY CFG DATA PTR
; POP IY ; ... TO IY
; POP IY ; ... TO IY ; POP IY ; ... TO IY
CALL IDXCFG CALL IDXCFG

27
Source/HBIOS/util.asm

@ -295,7 +295,32 @@ DB_CONTD:
JP DB_BLKRD ; JP DB_BLKRD ;
DB_END: DB_END:
RET ;
RET
;
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $
; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS
; TO THE START OF THE STRING LIST.
;
; SLOW BUT IMPROVES CODE SIZE, READABILITY AND ELIMINATES THE NEED HAVE
; LIST OF POINTERS OR A LIST OF CONDITIONAL CHECKS.
;
PRTIDXDEA:
PUSH BC
LD C,A ; INDEX COUNT
OR A
PRTIDXDEA1:
JR Z,PRTIDXDEA3
PRTIDXDEA2:
LD A,(DE) ; LOOP UNIT
INC DE ; WE REACH
CP '$' ; END OF STRING
JR NZ,PRTIDXDEA2
DEC C ; AT STRING END. SO GO
JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH
PRTIDXDEA3:
POP BC
; CALL WRITESTR ; FALL THROUGH TO WRITESTR
; RET
; ;
; OUTPUT A '$' TERMINATED STRING AT DE ; OUTPUT A '$' TERMINATED STRING AT DE
; ;

Loading…
Cancel
Save