@ -19,9 +19,10 @@ TRUE: .EQU !FALSE
DSKY_OSC: .EQU 3000000 ; OSCILLATOR FREQ IN HZ
;
BDOS: .EQU TRUE ; BDOS OR DIRECT TO 8250ISH
DSKY_PROTO: .EQU FALSE ; SET FOR DSKYNG PROTOTYPE
;
UART_BASE: .EQU $ 68 ; UART BASE IO ADDRESS
PPI_BASE: .EQU $ 60 ; PPI BASE IO PORT
PPI_BASE_DEF : .EQU $ 60 ; PPI BASE IO PORT
;
; LED SEGMENTS (BIT VALUES)
;
@ -56,10 +57,10 @@ PPI_BASE: .EQU $60 ; PPI BASE IO PORT
; 10 10 10 10 10
; 20 20 20 20 20
;
PPIA: .EQU PPI_BASE + 0 ; PORT A
PPIB: .EQU PPI_BASE + 1 ; PORT B
PPIC: .EQU PPI_BASE + 2 ; PORT C
PPIX: .EQU PPI_BASE + 3 ; PIO CONTROL PORT
PPIA: .EQU 0 ; PORT A OFFSET
PPIB: .EQU 1 ; PORT B OFFSET
PPIC: .EQU 2 ; PORT C OFFSET
PPIX: .EQU 3 ; PIO CONTROL PORT OFFSE T
;
DSKY_PPIX_RD: .EQU % 10010010 ; PPIX VALUE FOR READS
DSKY_PPIX_WR: .EQU % 10000010 ; PPIX VALUE FOR WRITES
@ -72,7 +73,15 @@ DSKY_PPIX_WR: .EQU %10000010 ; PPIX VALUE FOR WRITES
; SETTING BITS 3 & 4 WILL ASSERT /CS ON 3279
; CLEAR BITS 1 OR 2 TO ASSERT READ/WRITE
;
DSKY_PPI_IDLE: .EQU % 00000110
DSKY_PPI_IDLE: .EQU % 01100000
;
# IF ( DS KY_PROTO )
DSKY_RDBIT .EQU 6
DSKY_WRBIT .EQU 5
# ELSE
DSKY_RDBIT .EQU 2
DSKY_WRBIT .EQU 1
# ENDIF
;
DSKY_CMD_CLR: .EQU % 11011111 ; CLEAR (ALL OFF)
DSKY_CMD_CLRX: .EQU % 11010011 ; CLEAR (ALL ON)
@ -90,10 +99,22 @@ DSKY_PRESCL: .EQU DSKY_OSC / 100000 ; PRESCALER
LD SP , STACK
;
CALL PRTSTRD
.DB "\r\nNextGenDSKY Test Program, v1.3, 2021-07-15$"
.DB "\r\nNextGenDSKY$"
;
# IF ( DS KY_PROTO )
CALL PRTSTRD
.DB "\r\nPPI port 0x$"
LD A , PPI_BASE
.DB " Prototype$"
# ENDIF
;
CALL PRTSTRD
.DB " Test Program, v1.4, 2021-07-18$"
;
CALL GET_BASE
JP NZ , EXIT
;
CALL PRTSTRD
.DB "\r\nDSKYng PPI base port: 0x$"
LD A ,( PPI_BASE )
CALL PRTHEXBYTE
CALL NEWLINE
;
@ -295,27 +316,30 @@ EXIT:
;
DSKY_PPIWR:
PUSH AF
PUSH BC
;
LD A ,( PPI_BASE )
ADD A , PPIX
LD C , A
;
; CHECK FOR WRITE MODE
LD A ,( DS KY_PPIX_VAL )
LD A ,( PPIX_VAL )
CP DS KY_PPIX_WR
JR Z , DS KY_PPIWR1
;
; SET PPI TO WRITE MODE
LD A , DS KY_PPIX_WR
OUT ( PPIX ), A
LD ( DS KY_ PPIX_VAL), A
OUT ( C ), A
LD ( PPIX_VAL ), A
;
; RESTORE PORT C (MAY NOT BE NEEDED)
LD A , DS KY_PPI_IDLE
OUT ( PPIC ), A
;
; ; DIAGNOSTIC
; LD A,'W'
; CALL COUT
DEC C
OUT ( C ), A
;
DSKY_PPIWR1:
;
POP BC
POP AF
RET
;
@ -324,22 +348,29 @@ DSKY_PPIWR1:
;
DSKY_PPIRD:
PUSH AF
PUSH BC
;
LD A ,( PPI_BASE )
ADD A , PPIX
LD C , A
;
; CHECK FOR READ MODE
LD A ,( DS KY_PPIX_VAL )
LD A ,( PPIX_VAL )
CP DS KY_PPIX_RD
JR Z , DS KY_PPIRD1
;
; SET PPI TO READ MODE
LD A , DS KY_PPIX_RD
OUT ( PPIX ), A
LD ( DS KY_ PPIX_VAL), A
OUT ( C ), A
LD ( PPIX_VAL ), A
;
; ; DIAGNOSTIC
; LD A,'R'
; CALL COUT
; RESTORE PORT C (MAY NOT BE NEEDED)
LD A , DS KY_PPI_IDLE
DEC C
OUT ( C ), A
;
DSKY_PPIRD1:
POP BC
POP AF
RET
;
@ -365,18 +396,23 @@ DSKY_INIT:
;
DSKY_RES:
;
PUSH BC
LD A ,( PPI_BASE )
ADD A , PPIC
LD C , A
; SETUP PPI
CALL DS KY_PPIRD
; INIT 8279 VALUES TO IDLE STATE
LD A , DS KY_PPI_IDLE
OUT ( PPI C), A
OUT ( C ), A
; PULSE RESET SIGNAL ON 8279
SET 7 , A
OUT ( PPI C), A
OUT ( C ), A
RES 7 , A
OUT ( PPI C), A
OUT ( C ), A
; DONE
CALL DS KY_PPIIDLE
POP BC
RET
;
; COMMAND IN A
@ -401,7 +437,9 @@ DSKY_DOUT2:
CALL DS KY_PPIWR
;
; SETUP
LD C , PPIC
LD A ,( PPI_BASE )
ADD A , PPIC
LD C , A
;
; SET ADDRESS FIRST
LD A , DS KY_PPI_IDLE
@ -417,14 +455,18 @@ DSKY_DOUT2:
LD B , A
;
; ASSERT DATA BYTE VALUE
DEC C
DEC C
POP AF
OUT ( PPIA ), A
OUT ( C ), A
INC C
INC C
;
; PULSE /WR
RES 1 , B
RES DS KY_WRBIT , B
OUT ( C ), B
NOP ; MAY NOT BE NEEDED
SET 1 , B
SET DS KY_WRBIT , B
OUT ( C ), B
;
; DEASSERT /CS
@ -458,7 +500,9 @@ DSKY_DIN2:
CALL DS KY_PPIRD
;
; SETUP
LD C , PPIC
LD A ,( PPI_BASE )
ADD A , PPIC
LD C , A
;
; SET ADDRESS FIRST
LD A , DS KY_PPI_IDLE
@ -474,14 +518,18 @@ DSKY_DIN2:
LD B , A
;
; ASSERT /RD
RES 2 , B
RES DS KY_RDBIT , B
OUT ( C ), B
;
; GET VALUE
IN A ,( PPIA )
DEC C
DEC C
IN A ,( C )
INC C
INC C
;
; DEASSERT /RD
SET 2 , B
SET DS KY_RDBIT , B
OUT ( C ), B
;
; DEASSERT /CS
@ -643,6 +691,27 @@ DSKY_READ1:
DJNZ DS KY_READ1
RET
;
;
;
GET_BASE:
CALL PRTSTRD
.DB "\r\nDSKYng PPI base port [0x$"
LD A ,( PPI_BASE )
CALL PRTHEXBYTE
CALL PRTSTRD
.DB "]: $"
LD A ,( PPI_BASE )
CALL GETHEXBYTE
JR C , GET_BASE1
LD ( PPI_BASE ), A
XOR A
RET
;
GET_BASE1:
CALL PRTSTRD
.DB "\r\nInvalid DSKYng PPI base port value!$"
JR GET_BASE
;
; OUTPUT CHARACTER FROM A
;
COUT:
@ -651,7 +720,7 @@ COUT:
PUSH DE ;
PUSH HL ;
# IF BDOS
# IF ( BDOS )
LD C , 2 ; BDOS FUNC: CONSOLE OUTPUT
LD E , A ; CHARACTER TO E
CALL $ 0005 ; CALL BDOS
@ -732,35 +801,6 @@ WAITKEY:
JP Z , EXIT
POP AF
RET
;
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
;
HEXASCII:
LD D , A
CALL HEXCONV
LD E , A
LD A , D
RLCA
RLCA
RLCA
RLCA
CALL HEXCONV
LD D , A
RET
;
; CONVERT LOW NIBBLE OF A TO ASCII HEX
;
HEXCONV:
AND 0FH ;LOW NIBBLE ONLY
ADD A , 90H
DAA
ADC A , 40H
DAA
RET
;
;==================================================================================================
; UTILITY FUNCTIONS
@ -957,6 +997,119 @@ PRTHEXWORDHL:
POP AF
RET
;
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
;
HEXASCII:
LD D , A
CALL HEXCONV
LD E , A
LD A , D
RLCA
RLCA
RLCA
RLCA
CALL HEXCONV
LD D , A
RET
;
; CONVERT LOW NIBBLE OF A TO ASCII HEX
;
HEXCONV:
AND 0FH ;LOW NIBBLE ONLY
ADD A , 90H
DAA
ADC A , 40H
DAA
RET
;
;
;
GETHEXBYTE:
PUSH AF ; SAVE INCOMING VALUE
LD C , 0AH ; BDOS READ CONSOLE BUFFER
LD DE , CONBUF
CALL 5 ; GET EDITED STRING
CALL NEWLINE
POP DE ; RESTORE INCOMING TO D
; OK WE SHOULD NOW HAVE A STRING WITH A HEX NUMBER
LD HL , CONBUF
INC HL
LD A ,( HL ) ; GET CHARACTER COUNT
INC HL
CP 3
JR C , GHB0 ; OK IF <= 2 CHARS
SCF ; SIGNAL ERROR
RET ; AND RETURN
GHB0:
OR A ; SET FLAGS
JR NZ , GHB1 ; GOT CHARS, GO AHEAD
LD A , D ; RESTORE INCOMING VALUE
OR A ; SIGNAL SUCCESS
RET ; AND DONE
GHB1:
LD B , A ; COUNT TO B
LD C , 0 ; INITIAL VALUE
GHB2:
LD A ,( HL ) ; GET NEXT CHAR
INC HL
CALL ISHEX
RET C ; ABORT ON NON-HEX CHAR
; OK WE ARE HERE WHEN WE HAVE A VALID CHARACTER (0-9,A-F,A-F) NEED TO CONVERT TO BINARY
; CHARACTER IS STILL IN A
CP 3AH ; TEST FOR 0-9
JP M , GHB2C
CP 47H ; TEST FOR A-F
JP M , GHB2B
CP 67H ; TEST FOR A-F
JP M , GHB2A
GHB2A: SUB 20H ; CHARACTER IS A-F
GHB2B: SUB 07H ; CHARACTER IS A-F
GHB2C: SUB 30H ; CHARACTER IS 0-9
RLC C ; MULTIPLY CUR VALUE BY 16
RLC C
RLC C
RLC C
ADD A , C ; ADD TO ACCUM
LD C , A ; PUT BACK IN C
DJNZ GHB2 ; LOOP THRU ALL CHARS
LD A , C ; INTO A FOR RETURN
OR A ; SIGNAL SUCCESS
RET ; DONE
ISHEX:
CP 30H ; CHECK IF LESS THAN CHARACTER 0
JP M , NOTHEX
CP 3AH ; CHECK FOR > 9
JP M , ISHX1 ; OK, CHARACTER IS 1-9
CP 41H ; CHECK FOR CHARACTER LESS THAN A
JP M , NOTHEX
CP 47H ; CHECK FOR CHARACTERS > F
JP M , ISHX1
CP 61H ; CHECK FOR CHARACTERS < A
JP M , NOTHEX
CP 67H ; CHECK FOR CHARACTER > F
JP M , ISHX1
NOTHEX:
SCF ; SET CARRY TO INDICATE FAIL
RET
ISHX1:
SCF
CCF
RET
;
; SHORT DELAY FUNCTIONS. NO CLOCK SPEED COMPENSATION, SO THEY
; WILL RUN LONGER ON SLOWER SYSTEMS. THE NUMBER INDICATES THE
; NUMBER OF CALL/RET INVOCATIONS. A SINGLE CALL/RET IS
@ -982,16 +1135,16 @@ ADDHLA:
RET NC
INC H
RET
;
; STORAGE
;
DSKY_PPIX_VAL: .DB 0
PPI_BASE: .DB PPI_BASE_DEF
;
CONBUF: .DB 8 ; MAXIMUM CHARS
.DB 0 ; COUNT
.FILL 8 ; SIZE OF BUFFER
;
PPIX_VAL: .DB 0
;
DSPBUF: .FILL 16 , 0
;