forked from MirrorRepos/RomWBW
5 changed files with 757 additions and 1 deletions
@ -0,0 +1,14 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
set TOOLS=../../../Tools |
|||
set PATH=%TOOLS%\tasm32;%PATH% |
|||
set TASMTABS=%TOOLS%\tasm32 |
|||
|
|||
echo Building HTalk... |
|||
tasm -t80 -g3 -fFF htalk.asm htalk.com %htalk.lst || exit /b |
|||
|
|||
copy /Y htalk.com ..\..\..\Binary\Apps\ || exit /b |
|||
rem copy /Y *.ovr ..\..\..\Binary\Apps\ || exit /b |
|||
rem copy /Y *.hlp ..\..\..\Binary\Apps\ || exit /b |
|||
rem copy /Y *.doc ..\..\..\Binary\Apps\ || exit /b |
|||
@ -0,0 +1,7 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
if exist dev.com del dev.com |
|||
if exist *.hex del *.hex |
|||
if exist *.lst del *.lst |
|||
if exist *.zip del *.zip |
|||
@ -0,0 +1,10 @@ |
|||
OBJECTS = htalk.com |
|||
#DOCS = htalk.txt
|
|||
DEST = ../../../Binary/Apps |
|||
DOCDEST = ../../../Binary/Apps |
|||
TOOLS = ../../../Tools |
|||
include $(TOOLS)/Makefile.inc |
|||
|
|||
%.com: USETASM=1 |
|||
|
|||
|
|||
@ -0,0 +1,725 @@ |
|||
;=============================================================================== |
|||
;HTALK - BARE MINIMUM TERMINAL INTERFACE |
|||
; |
|||
; CONSOLE TALKS TO ARBITRARY CHARACTER DEVICE. |
|||
;=============================================================================== |
|||
; |
|||
; AUTHOR: TOM PLANO (TOMPLANO@PROTON.ME) |
|||
; |
|||
; USAGE: |
|||
; HTALK $<CHAR_DEVICE_NUM> |
|||
; |
|||
;_______________________________________________________________________________ |
|||
; |
|||
; CHANGE LOG: |
|||
; I'VE NOTATED SECTIONS OF CODE THAT ARNT REQUIRED IF THIS APP IS |
|||
; INCORPORATED INTO DBGMOD WITH A <OPT> TAG |
|||
; |
|||
;_______________________________________________________________________________ |
|||
; |
|||
; TODO: |
|||
; SEE ENUM_DEV1 TODO |
|||
; |
|||
; |
|||
;_______________________________________________________________________________ |
|||
; |
|||
;=============================================================================== |
|||
; DEFINITIONS |
|||
;=============================================================================== |
|||
; |
|||
STKSIZ .EQU $FF |
|||
; |
|||
; HBIOS SYSTEM CALLS AND ID STRING ADDRESS |
|||
; |
|||
ROMWBW_ID .EQU $FFFE ; ROMWBW ID STRING ADDRESS |
|||
HBIOS_SYS .EQU $FFF0 ; HBIOS SYSCALL ADDRESS |
|||
|
|||
H_SYSGET .EQU $F8 ; GET SYSTEM INFO |
|||
H_CIOCNT .EQU $00 ; GET CHAR DEV COUNT SUBFUNCTION |
|||
|
|||
BF_CIOIN .EQU $00 ; HBIOS CHAR INPUT |
|||
BF_CIOOUT .EQU $01 ; HBIOS CHAR OUTPUT |
|||
BF_CIOIST .EQU $02 ; HBIOS CHAR INPUT STATUS |
|||
BF_CIOOST .EQU $03 ; HBIOS CHAR OUTPUT STATUS |
|||
BF_CIOINIT .EQU $04 ; HBIOS CHAR I/O INIT |
|||
BF_CIOQUERY .EQU $05 ; HBIOS CHAR I/O QUERY |
|||
BF_CIODEVICE .EQU $06 ; HBIOS CHAR I/O DEVICE |
|||
; |
|||
; SUPPORTED HBIOS CIO DEVICE TYPES |
|||
; |
|||
CIODEV_UART .EQU $00 ; 16C550 FAMILY SERIAL INTERFACE UART.ASM |
|||
CIODEV_ASCI .EQU $10 ; Z180 BUILT-IN SERIAL PORTS ASCI.ASM |
|||
CIODEV_TERM .EQU $20 ; TERMINAL ANSI.ASM |
|||
CIODEV_PRPCON .EQU $30 ; PROPIO SERIAL CONSOLE INTERFACE PRP.ASM |
|||
CIODEV_PPPCON .EQU $40 ; PARPORTPROP SERIAL CONSOLE INTERFACE PPP.ASM |
|||
CIODEV_SIO .EQU $50 ; ZILOG SERIAL PORT INTERFACE SIO.ASM |
|||
CIODEV_ACIA .EQU $60 ; MC68B50 ASYNCHRONOUS INTERFACE ACIA.ASM |
|||
CIODEV_PIO .EQU $70 ; ZILOG PARALLEL INTERFACE CONTROLLER PIO.ASM |
|||
CIODEV_UF .EQU $80 ; FT232H-BASED ECB USB FIFO UF.ASM |
|||
CIODEV_DUART .EQU $90 ; SCC2681 FAMILY DUAL UART DUART.ASM |
|||
CIODEV_Z2U .EQU $A0 ; ZILOG Z280 BUILT-IN SERIAL PORTS Z2U.ASM |
|||
CIODEV_LPT .EQU $B0 ; PARALLEL I/O CONTROLLER LPT.ASM |
|||
|
|||
; HBIOS CURRENT CONSOLE NUMBER |
|||
CIO_CONSOLE .EQU $80 |
|||
|
|||
; SPECIAL CHARS |
|||
CTRLC .EQU $03 |
|||
CHR_BEL .EQU $07 |
|||
CHR_CR .EQU $0D |
|||
CHR_LF .EQU $0A |
|||
CHR_BS .EQU $08 |
|||
CHR_ESC .EQU $1B |
|||
CHR_DEL .EQU $7F |
|||
|
|||
; |
|||
;=============================================================================== |
|||
; BEGIN MAIN PROGRAM |
|||
;=============================================================================== |
|||
; |
|||
.ORG $0100 |
|||
; |
|||
; SETUP STACK (SAVE OLD VALUE) |
|||
; <OPT> HANDLED BY DBGMON |
|||
LD (STKSAV),SP |
|||
LD SP,STACK |
|||
|
|||
|
|||
; |
|||
; INITIALIZATION + STARTUP MESSAGE + HBIOS DETECT |
|||
; <OPT> HANDLED BY DBGMON |
|||
CALL INIT_PROG |
|||
JP NZ,EXIT |
|||
; |
|||
; LIST HBIOS DEV OPTIONS FOR REFERENCE |
|||
; ALSO GETS MAX CONN |
|||
; |
|||
; <OPT> THIS IS OPTIONAL BECAUSE IF A CHAR DEVICE DOESNT EXIST, WE NEVER READ OR |
|||
; WRITE TO IT, WE SIMPLY CALL CIOIST AND CIOOST OVER AND OVER ON IT, WITHOUT |
|||
; EVER PUSHING DATA TO IT |
|||
CALL ENUM_DEV |
|||
JP NZ,EXIT |
|||
; |
|||
; PARSE COMMAND LINE |
|||
; |
|||
CALL PARSE |
|||
JP NZ,EXIT |
|||
; |
|||
; RUN CONVERSTION WITH CHAR DEVICE |
|||
; |
|||
CALL TALK |
|||
; |
|||
; DONE |
|||
JP EXIT |
|||
|
|||
|
|||
; |
|||
; CLEAN UP AND RETURN TO CALLING PROCESS |
|||
; |
|||
EXIT: |
|||
CALL NEWLINE ; ... |
|||
LD HL,STR_EXITMSG ; LOAD EXIT STRING |
|||
CALL PRTSTR ; PRINT IT |
|||
CALL NEWLINE ; ... |
|||
LD SP,(STKSAV) ; RESET STACK |
|||
RET ; RETURN TO CALLER |
|||
|
|||
|
|||
; |
|||
;=============================================================================== |
|||
; END MAIN PROGRAM |
|||
;=============================================================================== |
|||
; |
|||
|
|||
; |
|||
;=============================================================================== |
|||
; BEGIN MAIN PROGRAM SUBROUTINES |
|||
;=============================================================================== |
|||
; |
|||
|
|||
INIT_PROG: |
|||
LD HL, STR_BANNER ; LOAD WELCOME BANNER |
|||
CALL PRTSTR ; PRINT IT |
|||
CALL NEWLINE ; ... |
|||
LD HL,(ROMWBW_ID) ; GET FIRST BYTE OF ROMWBW MARKER |
|||
LD A,(HL) ; ... THROUGH HL |
|||
CP 'W' ; MATCH? |
|||
JP NZ,NOTHBIOS ; ABORT WITH INVALID CONFIG BLOCK |
|||
INC HL ; NEXT BYTE (MARKER BYTE 2) |
|||
LD A,(HL) ; LOAD IT |
|||
CP ~'W' ; MATCH? |
|||
JP NZ,NOTHBIOS ; ABORT WITH INVALID CONFIG BLOCK |
|||
LD HL,STR_HBIOS ; POINT TO HBIOS STR |
|||
CALL PRTSTR ; PRINT IT |
|||
CALL NEWLINE ; ... |
|||
RET |
|||
; |
|||
; HBOIS NOT DETECTED, BAIL OUT W/ ERROR |
|||
; |
|||
NOTHBIOS: |
|||
LD HL,STR_BIOERR ; LOAD HBIOS NOT FOUND STR |
|||
CALL PRTSTR ; PRINT IT |
|||
CALL NEWLINE ; ... |
|||
AND $FF ; SET FLAGS |
|||
RET |
|||
|
|||
ENUM_DEV: |
|||
; |
|||
; CHAR COUNT HEADER |
|||
; |
|||
LD HL,STR_DEVS_FOUND |
|||
CALL PRTSTR |
|||
; |
|||
;GET COUNT OF CHAR UNITS |
|||
; |
|||
LD B,H_SYSGET ; LOAD SYSGET HBIOS FUNCTION |
|||
LD C,H_CIOCNT ; LOAD SYSGET CHAR DEV COUNT SUBFUNCTION |
|||
CALL HBIOS_SYS ; JUMP TO HBIOS |
|||
OR A ; SET FLAGS |
|||
JP NZ, EXIT ; JUMP TO EXIT ON FAILED |
|||
LD A,E ; NUM CHAR DEVICES NOW IN A |
|||
|
|||
DEC A ; DEC NUM DEVICES TO BE 0 INDEXED |
|||
LD (CIODEV_CNT), A ; STORE BEFORE PRINT |
|||
LD (CIODEV_MAX), A ; STORE BEFORE PRINT |
|||
INC A ; RESTORE NUM DEVICES VALUE |
|||
|
|||
CALL PRTHEX ; PRINT NUMBER OF UNITS FOUND |
|||
CALL NEWLINE ; ... |
|||
|
|||
ENUM_DEV1: |
|||
|
|||
LD IX, TGT_DEV |
|||
; TODO: H AND L DONT ALWAYS GET SET BY THE DRIVERS. FIND SOME WAY TO MASK |
|||
; THEM OUT IF THEY ARE THE SAME BEFORE AND AFTER THE CALL? |
|||
LD B, BF_CIODEVICE ; LOAD HBIOS FUNCTION TO QUERRY DEVICE INFO |
|||
LD HL, CIODEV_CNT ; REQUEST A CHAR DEVICE |
|||
LD C, (HL) ; ... |
|||
LD (IX), C ; REMEMBER WHAT DEVICE WE ASKED FOR BEFORE BE |
|||
CALL HBIOS_SYS ; EXECUTE HBIOS SUBROUTINE |
|||
OR A ; SET FLAGS |
|||
RET NZ ; RETURN FAILED |
|||
; |
|||
; STORE RESULTS OF HBOIS DEVICE QUERRY |
|||
; |
|||
LD A,C ; MOVE C TO A |
|||
LD (IX+1), A ; STORE A DEVICE ATTRIBUTES, SKIP FIRST ENTRY |
|||
LD A,D |
|||
LD (IX+2), A |
|||
LD A,E |
|||
LD (IX+3), A |
|||
LD A,H |
|||
LD (IX+4), A |
|||
LD A,L |
|||
LD (IX+5), A |
|||
; |
|||
; PRINT FORMATED DATA LOOP |
|||
; |
|||
LD B, $06 ; PRINT THE 5 ELEMENTS OF DEV_STR_TBL |
|||
LD HL,DEV_STR_TBL ; TABLE BASE PTR |
|||
|
|||
PLOOP_BASE: |
|||
CALL PRTSTR ; PTRSTR INCREMENTS HL FOR US |
|||
LD A, (IX) |
|||
CALL PRTHEX |
|||
LD A, '|' |
|||
CALL COUT |
|||
INC IX |
|||
DJNZ PLOOP_BASE |
|||
|
|||
CALL NEWLINE |
|||
|
|||
LD A, (CIODEV_CNT) |
|||
DEC A |
|||
LD (CIODEV_CNT), A |
|||
JP P, ENUM_DEV1 ; JUMP WHILE CIODEV_CNT >=0 |
|||
AND $00 |
|||
RET |
|||
|
|||
|
|||
; |
|||
; RUN CONVERSTION WITH CHAR DEVICE |
|||
; |
|||
TALK: |
|||
; |
|||
; INIT PING PONG DEVICE POINTERS |
|||
; |
|||
LD IX, USER_CON ; LOAD VALUE AT ADDR USER_CON |
|||
LD A, (IX) ; LOAD VALUE AT ADDR USER_CON |
|||
LD (RF_DEV), A ; STORE TO ADDR RF_DEV |
|||
LD A, (IX+1) ; LOAD VALUE AT ADDR TARGET_CON |
|||
LD (WT_DEV), A ; STORE TO ADDR WT_DEV |
|||
; |
|||
; READ FROM RF_DEV -> WRITE TO WT_DEV |
|||
; |
|||
TALK_LOOP: |
|||
; |
|||
; CHECK FOR DATA ON RF_DEV |
|||
; |
|||
LD B,BF_CIOIST ; SET HBIOS FUNCTION TO RUN |
|||
LD HL, RF_DEV |
|||
LD C,(HL) |
|||
CALL HBIOS_SYS ; CHECK FOR CHAR PENDING ON INPUT BUFFER USING HBIOS |
|||
OR A ; SET FLAGS |
|||
JP Z,TALK_NEXT ; JUMP NO CHARACTERS READY |
|||
JP M,TALK_NEXT ; JUMP ERROR ON READ |
|||
; |
|||
; EXEC READ FROM RF_DEV |
|||
; |
|||
LD B,BF_CIOIN ; SET FUNCTION TO RUN |
|||
LD HL, RF_DEV |
|||
LD C,(HL) ; RETRIEVE CON_DEV_NUM TO READ/WRITE FROM ACTIVE CONSOLE |
|||
CALL HBIOS_SYS ; CHECK FOR CHAR PENDING USING HBIOS |
|||
LD A,E ; MOVE RESULT TO A |
|||
CP CTRLC ; CHECK FOR EXIT REQUEST (CTRL+C) |
|||
RET Z ; IF SO, BAIL OUT |
|||
PUSH AF ; SAVE THE CHAR WE READ |
|||
; |
|||
; CHECK FOR SPACE ON WT_DEV |
|||
; |
|||
LD B,BF_CIOOST ; SET HBIOS FUNCTION TO RUN |
|||
LD HL, WT_DEV |
|||
LD C,(HL) |
|||
CALL HBIOS_SYS ; CHECK FOR SPACE IN OUTPUT BUFFER USING HBIOS |
|||
|
|||
OR A ; 0 OR 1 IS A VALID RETURN |
|||
JP Z,TALK_NEXT ; JUMP NO SPACE |
|||
JP M,TALK_NEXT ; JUMP ERROR ON WRITE |
|||
; |
|||
; EXEC WRITE TO WT_DEV |
|||
; |
|||
LD B,BF_CIOOUT ; SET HBIOS FUNCTION TO RUN |
|||
LD HL, WT_DEV |
|||
LD C,(HL) ; RETRIEVE TGT_DEV_NUM TO READ/WRITE FROM TARGET CHAR DEVICE |
|||
; |
|||
POP AF ; RECOVER THE CHARACTER |
|||
LD E,A ; MOVE CHARACTER TO E |
|||
CALL HBIOS_SYS ; WRITE CHAR USING HBIOS |
|||
|
|||
TALK_NEXT: |
|||
; |
|||
; SWAP RF_DEV AND WT_DEV |
|||
; |
|||
LD IX, RF_DEV ; LOAD VALUE AT ADDR USER_CON |
|||
LD A, (IX) ; LOAD VALUE AT ADDR RF_DEV |
|||
LD B, (IX+1) ; LOAD VALUE AT ADDR WT_DEV |
|||
LD (IX+1), A ; STORE TO OLD RF_DEV TO ADDR WT_DEV |
|||
LD A, B ; MOVE OLD WT_DEV TO A |
|||
LD (IX), A ; STORE TO OLD WT_DEF TO ADDR RF_DEV |
|||
JP TALK_LOOP ; LOOP |
|||
|
|||
; |
|||
;=============================================================================== |
|||
; END MAIN PROGRAM SUBROUTINES |
|||
;=============================================================================== |
|||
; |
|||
|
|||
; |
|||
;=============================================================================== |
|||
; BEGIN ROUTINES THAT ARE NOT COMPATIBLE WITH DBGMON |
|||
;=============================================================================== |
|||
; |
|||
|
|||
|
|||
PARSE: |
|||
; |
|||
LD HL,$81 ; POINT TO START OF COMMAND TAIL (AFTER LENGTH BYTE) |
|||
CALL NONBLANK ; SKIP LEADING BLANKS, |
|||
CALL HEXBYTE |
|||
JP C,ERRHEXRD ; IF NOT, ERR |
|||
LD (TARGET_CON),A ; REQUESTED TARGET CONN |
|||
|
|||
LD B,A ; MOVE TO B |
|||
|
|||
LD HL,CIODEV_MAX ; GRAB MAX VALUE OF TARGETCON |
|||
LD A,(HL) |
|||
|
|||
CP B ; CHECK IF B<=A |
|||
JP M, ERROOR ; IF B>A, and both are less then 80 then S SET, ERR |
|||
JP C, ERROOR ; IF B> 80 carry set instead (signed numbers problem) |
|||
; swap A and B |
|||
|
|||
JP PE, ERROOR ; IF B>A, C SET, ERR |
|||
|
|||
LD HL, MSGTALKING ; PRINT TARGET DEVICE |
|||
CALL PRTSTR |
|||
LD A, B ; RETRIEVE TARGET CON |
|||
CALL PRTHEX |
|||
CALL NEWLINE |
|||
|
|||
AND $00 |
|||
RET |
|||
|
|||
|
|||
|
|||
; |
|||
;NOT COMPATIBLE WITH THE DBGMON FUNCTION OF THE SAME NAME |
|||
; |
|||
NONBLANK: |
|||
LD A,(HL) ; LOAD NEXT CHARACTER |
|||
OR A ; STRING ENDS WITH A NULL |
|||
RET Z ; IF NULL, RETURN POINTING TO NULL |
|||
CP ' ' ; CHECK FOR BLANK |
|||
RET NZ ; RETURN IF NOT BLANK |
|||
INC HL ; IF BLANK, INCREMENT CHARACTER POINTER |
|||
JR NONBLANK ; AND LOOP |
|||
|
|||
; |
|||
; |
|||
;=============================================================================== |
|||
; END ROUTINES THAT ARE NOT COMPATIBLE WITH DBGMON |
|||
;=============================================================================== |
|||
; |
|||
|
|||
|
|||
|
|||
|
|||
; |
|||
;=============================================================================== |
|||
; BEGIN ROUTINES THAT ARE LIFTED FROM DBGMON |
|||
;=============================================================================== |
|||
; |
|||
|
|||
|
|||
; |
|||
; PRINT THE VALUE IN A IN HEX WITHOUT DESTROYING ANY REGISTERS |
|||
; |
|||
PRTHEX: |
|||
PUSH DE ; SAVE DE |
|||
CALL HEXASCII ; CONVERT VALUE IN A TO HEX CHARS IN DE |
|||
LD A,D ; GET THE HIGH ORDER HEX CHAR |
|||
CALL COUT ; PRINT IT |
|||
LD A,E ; GET THE LOW ORDER HEX CHAR |
|||
CALL COUT ; PRINT IT |
|||
POP DE ; RESTORE DE |
|||
RET ; DONE |
|||
|
|||
; |
|||
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE |
|||
; |
|||
|
|||
HEXASCII: |
|||
LD D,A ; SAVE A IN D |
|||
CALL HEXCONV ; CONVERT LOW NIBBLE OF A TO HEX |
|||
LD E,A ; SAVE IT IN E |
|||
LD A,D ; GET ORIGINAL VALUE BACK |
|||
RLCA ; ROTATE HIGH ORDER NIBBLE TO LOW BITS |
|||
RLCA |
|||
RLCA |
|||
RLCA |
|||
CALL HEXCONV ; CONVERT NIBBLE |
|||
LD D,A ; SAVE IT IN D |
|||
RET ; DONE |
|||
|
|||
; |
|||
; CONVERT LOW NIBBLE OF A TO ASCII HEX |
|||
; |
|||
HEXCONV: |
|||
AND $0F ; LOW NIBBLE ONLY |
|||
ADD A,$90 |
|||
DAA |
|||
ADC A,$40 |
|||
DAA |
|||
RET |
|||
; |
|||
|
|||
|
|||
; |
|||
; ADD THE VALUE IN A TO HL (HL := HL + A) |
|||
; |
|||
ADDHL: |
|||
ADD A,L ; A := A + L |
|||
LD L,A ; PUT RESULT BACK IN L |
|||
RET NC ; IF NO CARRY, WE ARE DONE |
|||
INC H ; IF CARRY, INCREMENT H |
|||
RET ; AND RETURN |
|||
|
|||
|
|||
; |
|||
;__________________________________________________________________________________________________ |
|||
; |
|||
; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS |
|||
; |
|||
;__________________________________________________________________________________________________ |
|||
; |
|||
PC_SPACE: |
|||
PUSH AF |
|||
LD A,' ' |
|||
JR PC_PRTCHR |
|||
PC_COLON: |
|||
PUSH AF |
|||
LD A,':' |
|||
JR PC_PRTCHR |
|||
PC_CR: |
|||
PUSH AF |
|||
LD A,CHR_CR |
|||
JR PC_PRTCHR |
|||
|
|||
PC_LF: |
|||
PUSH AF |
|||
LD A,CHR_LF |
|||
JR PC_PRTCHR |
|||
|
|||
PC_PRTCHR: |
|||
CALL COUT |
|||
POP AF |
|||
RET |
|||
|
|||
NEWLINE2: |
|||
CALL NEWLINE |
|||
NEWLINE: |
|||
CALL PC_CR |
|||
CALL PC_LF |
|||
RET |
|||
|
|||
PRTSTR: |
|||
LD A,(HL) |
|||
INC HL |
|||
CP '$' |
|||
RET Z |
|||
CALL COUT |
|||
JR PRTSTR |
|||
|
|||
; |
|||
;__COUT_______________________________________________________________________ |
|||
; |
|||
; OUTPUT CHARACTER FROM A |
|||
;_____________________________________________________________________________ |
|||
; |
|||
COUT: |
|||
; SAVE ALL INCOMING REGISTERS |
|||
PUSH AF |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
; |
|||
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS |
|||
LD E,A ; OUTPUT CHAR TO E |
|||
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C |
|||
LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR |
|||
CALL HBIOS_SYS ; HBIOS OUTPUTS CHARACTER |
|||
; |
|||
; RESTORE ALL REGISTERS |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
POP AF |
|||
RET |
|||
; |
|||
;__CIN________________________________________________________________________ |
|||
; |
|||
; INPUT CHARACTER TO A |
|||
;_____________________________________________________________________________ |
|||
; |
|||
CIN: |
|||
; SAVE INCOMING REGISTERS (AF IS OUTPUT) |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
; |
|||
; INPUT CHARACTER FROM CONSOLE VIA HBIOS |
|||
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C |
|||
LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR |
|||
CALL HBIOS_SYS ; HBIOS READS CHARACTER |
|||
LD A,E ; MOVE CHARACTER TO A FOR RETURN |
|||
; |
|||
; RESTORE REGISTERS (AF IS OUTPUT) |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;__CST________________________________________________________________________ |
|||
; |
|||
; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) |
|||
;_____________________________________________________________________________ |
|||
; |
|||
CST: |
|||
; SAVE INCOMING REGISTERS (AF IS OUTPUT) |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
; |
|||
; GET CONSOLE INPUT STATUS VIA HBIOS |
|||
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C |
|||
LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS |
|||
CALL HBIOS_SYS ; HBIOS RETURNS STATUS IN A |
|||
; |
|||
; RESTORE REGISTERS (AF IS OUTPUT) |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
|
|||
|
|||
; |
|||
;__ISHEX______________________________________________________________________ |
|||
; |
|||
; CHECK BYTE AT (HL) FOR HEX CHAR, RET Z IF SO, ELSE NZ |
|||
;_____________________________________________________________________________ |
|||
; |
|||
ISHEX: |
|||
LD A,(HL) ; CHAR TO AS |
|||
CP '0' ; < '0'? |
|||
JR C,ISHEX1 ; YES, NOT 0-9, CHECK A-F |
|||
CP '9' + 1 ; > '9' |
|||
JR NC,ISHEX1 ; YES, NOT 0-9, CHECK A-F |
|||
XOR A ; MUST BE 0-9, SET ZF |
|||
RET ; AND DONE |
|||
ISHEX1: |
|||
CP 'A' ; < 'A'? |
|||
JR C,ISHEX2 ; YES, NOT A-F, FAIL |
|||
CP 'F' + 1 ; > 'F' |
|||
JR NC,ISHEX2 ; YES, NOT A-F, FAIL |
|||
XOR A ; MUST BE A-F, SET ZF |
|||
RET ; AND DONE |
|||
ISHEX2: |
|||
OR $FF ; CLEAR ZF |
|||
RET ; AND DONE |
|||
; |
|||
;__HEXBYTE____________________________________________________________________ |
|||
; |
|||
; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A |
|||
;_____________________________________________________________________________ |
|||
; |
|||
HEXBYTE: |
|||
LD C,0 ; INIT WORKING VALUE |
|||
HEXBYTE1: |
|||
CALL ISHEX ; DO WE HAVE A HEX CHAR? |
|||
JR NZ,HEXBYTE3 ; IF NOT, WE ARE DONE |
|||
LD B,4 ; SHIFT WORKING VALUE (C := C * 16) |
|||
HEXBYTE2: |
|||
SLA C ; SHIFT ONE BIT |
|||
RET C ; RETURN W/ CF SET INDICATING OVERFLOW ERROR |
|||
DJNZ HEXBYTE2 ; LOOP FOR 4 BITS |
|||
CALL NIBL ; CONVERT HEX CHAR TO BINARY VALUE IN A & INC HL |
|||
OR C ; COMBINE WITH WORKING VALUE |
|||
LD C,A ; AND PUT BACK IN WORKING VALUE |
|||
JR HEXBYTE1 ; DO ANOTHER CHARACTER |
|||
HEXBYTE3: |
|||
LD A,C ; WORKING VALUE TO A |
|||
OR A ; CLEAR CARRY |
|||
RET |
|||
|
|||
; |
|||
;__NIBL_______________________________________________________________________ |
|||
; |
|||
; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A |
|||
;_____________________________________________________________________________ |
|||
; |
|||
NIBL: |
|||
LD A,(HL) ; GET K B. DATA |
|||
INC HL ; INC KB POINTER |
|||
CP 40H ; TEST FOR ALPHA |
|||
JR NC,ALPH |
|||
AND 0FH ; GET THE BITS |
|||
RET |
|||
ALPH: |
|||
AND 0FH ; GET THE BITS |
|||
ADD A,09H ; MAKE IT HEX A-F |
|||
RET |
|||
|
|||
|
|||
; |
|||
;=============================================================================== |
|||
; END ROUTINES THAT ARE LIFTED FROM DBGMON |
|||
;=============================================================================== |
|||
; |
|||
|
|||
|
|||
|
|||
|
|||
; |
|||
;=============================================================================== |
|||
; ERROR RESPONCES |
|||
;=============================================================================== |
|||
; |
|||
|
|||
ERROOR: ; REQUESTED DEV OUT OF RANGE (SYNTAX) |
|||
CALL NEWLINE |
|||
LD A, 'R' |
|||
CALL COUT |
|||
LD HL,TARGET_CON |
|||
LD A,(HL) |
|||
CALL PRTHEX |
|||
|
|||
|
|||
LD A, ':' |
|||
CALL COUT |
|||
LD A, 'M' |
|||
CALL COUT |
|||
LD HL,CIODEV_MAX |
|||
LD A,(HL) |
|||
CALL PRTHEX |
|||
|
|||
LD HL,MSGOOR |
|||
JR ERROR |
|||
ERRHEXRD: ; COMMAND HEX READ ERROR (SYNTAX) |
|||
LD HL,MSGHEXRD |
|||
JR ERROR |
|||
ERRUSE: ; COMMAND USAGE ERROR (SYNTAX) |
|||
LD HL,MSGUSE |
|||
JR ERROR |
|||
ERRPRM: ; COMMAND PARAMETER ERROR (SYNTAX) |
|||
LD HL,MSGPRM |
|||
JR ERROR |
|||
ERROR: ; PRINT ERROR STRING AND RETURN ERROR SIGNAL |
|||
CALL NEWLINE ; PRINT NEWLINE |
|||
CALL PRTSTR ; PRINT ERROR STRING |
|||
OR $FF ; SIGNAL ERROR |
|||
RET ; DONE |
|||
|
|||
;=============================================================================== |
|||
; STORAGE SECTION |
|||
;=============================================================================== |
|||
; |
|||
|
|||
; CHAR DEV COUNT |
|||
CIODEV_CNT .DB $0 |
|||
CIODEV_MAX .DB $0 |
|||
|
|||
;TALK LOOP DATA, DEFAULT TO LOOPBACK |
|||
USER_CON .DB $80 |
|||
TARGET_CON .DB $80 |
|||
|
|||
; PING PONG POINTERS |
|||
RF_DEV .DB 0 |
|||
WT_DEV .DB 0 |
|||
|
|||
; TARGET CHARACTER DEVICE DATA |
|||
TGT_DEV: |
|||
.DB 0 ; HBIOS CHAR NUM |
|||
.DB 0 ; C: DEVICE ATTRIBUTES |
|||
.DB 0 ; D: DEVICE TYPE |
|||
.DB 0 ; E: DEVICE NUMBER |
|||
.DB 0 ; H: DEVICE MODE |
|||
.DB 0 ; L: DEVICE I/O BASE ADDRESS |
|||
|
|||
; STRING LITERALS |
|||
MSGUSE .TEXT "USAGE: HTALK <CIO_DEV_ID>$" |
|||
MSGPRM .TEXT "PARAMETER ERROR$" |
|||
MSGOOR .TEXT "CIO VAL TOO LARGE$" |
|||
MSGHEXRD .TEXT "HEX READ ERR$" |
|||
MSGTALKING .TEXT "CONNECTING TO CHAR:$" |
|||
|
|||
|
|||
DEV_STR_TBL: |
|||
.TEXT "CHAR:$" |
|||
.TEXT "ATTR:$" |
|||
.TEXT "TYPE:$" |
|||
.TEXT "NUMB:$" |
|||
.TEXT "MODE:$" |
|||
.TEXT "ADDR:$" |
|||
|
|||
STR_DEVS_FOUND .TEXT "NUM CHAR DEVICES FOUND - $" |
|||
STR_EXITMSG .TEXT "HTALK DONE$" |
|||
STR_BANNER .TEXT "HTALK V1.0 (CTRL-C TO EXIT)$" |
|||
STR_HBIOS .TEXT "HBIOS DETECTED$" |
|||
STR_BIOERR .TEXT "*** UNKNOWN BIOS - BAILING OUT ***$" |
|||
|
|||
STKSAV .DW 0 ; STACK POINTER SAVED AT START |
|||
.FILL STKSIZ,0 ; STACK |
|||
STACK .EQU $ ; STACK TOP |
|||
; |
|||
.END |
|||
Loading…
Reference in new issue