home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG082.ARK
/
SDNUSER.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
7KB
|
302 lines
TITLE 'SDNUSER -- MARTIN USER ROUTINES OF 06/14/81'
;
; THESE ROUTINES PROVIDE CONSOLE AND LIST FUNCTIONS
; FOR CP/M 2.2, USING THE HARDWARE OF THE MARTIN
; RESEARCH MACHINE. THE ROUTINES ARE LOADED INTO
; THE NON-CONTIGUOUS 1K OF HIGH RAM BY THE BOOTSTRAP
; ROUTINE. ALL COMMUNICATION WITH THESE ROUTINES
; IS THROUGH THE JUMP VECTORS AT THE FRONT.
;
; WHEN GENNING A NEW SYSTEM, THIS CODE MUST BE
; LOADED INTO MEMORY AT 1F80H. THE EQUATE "LOADR",
; WHICH IS SET TO 1F80H-USER, IS PROVIDED FOR
; CONVENIENCE. SINCE USER WILL PROBABLY ALWAYS
; HAVE THE VALUE 0A000H, THE LOAD OFFSET WOULD
; THEN BE 7F80H. NOTE THAT IF THE ORIGIN OF THIS
; MODULE CHANGES, THE VALUE OF THE USER EQUATES
; IN THE SDNBOOT AND SDNBIOS MODULES MUST ALSO
; BE CHANGED.
;
IOBYT EQU 3
;
KBREQ EQU 0E500H ;MEM-MAPPED KB STATUS IN
KBCHR EQU 0E700H ;MEM-MAPPED KB DATA IN
MODEM EQU 0F100H ;MEM-MAPPED MODEM DATA
MSTAT EQU 0F300H ;MEM-MAPPED MODEM STATUS
LBEL EQU 1 ;BEEPER BIT
SSBIT EQU 4 ;SUPER SHIFT (ALPHA LOCK) BIT
SOS EQU 07C00H ;START OF MEM-MAPPED SCREEN
EOS EQU 08000H ;END OF MEM-MAPPED SCREEN
SLEN EQU EOS-SOS ;LENGTH OF SCREEN MEMORY
LLEN EQU 40H ;LENGTH OF SCREEN LINE
LMSK EQU 0C0H ;LINE MASK
ILMSK EQU 03FH ;INVERTED LINE MASK
BLANK EQU 20H ;ASCII BLANK
CR EQU 0DH ;ASCII CARRIAGE RETURN
LF EQU 0AH ;ASCII LINE FEED
BS EQU 08H ;ASCII BACKSPACE
BELL EQU 07H ;ASCII BELL
;
BTI EQU 0B0EDH ;Z80 BLOCK XFER OP
;
USER: EQU 0A000H ;LOCATED IN HIGH RAM
LOADR: EQU 1F80H-USER ;DDT LOAD OFFSET
;
ORG USER
;
;JUMP TABLE - CP/M JUMPS HERE FOR I/O
;JUMPS MUST REMAIN HERE, IN SAME ORDER
INIT JMP INITR ;INITIALIZATION
CONST JMP TTYST ;CONSOLE STATUS CHECK
CONIN JMP TTYIN ;CONSOLE INPUT
CONOUT JMP TTYOUT ;CONSOLE OUTPUT
LIST JMP LSTOUT ;LIST OUTPUT
PUNCH JMP TTYOUT ;PUNCH OUTPUT
READER JMP TTYIN ;READER INPUT
LISTST XRA A ;LIST STATUS
DCR A ;ALWAYS RETURN READY
RET
JMP MSGOT ;MSG STRING OUTPUT ROUTINE
JMP HXBOT ;HEX CONVERSION ROUTINE
JMP DSKERR ;DISK I/O ERROR REPORTER
;
;BEGIN USER DRIVER ROUTINES HERE
;
TTYST LDA KBREQ ;KEYBOARD STATUS CHECK
ANI 20H ;RESET BEING HELD DOWN?
JZ NORSET ;BRIF NOT
LDA MODE ;FLIP ALPHA LOCK STATE IF SO
XRI SSBIT
STA MODE
STA KBCHR ; AND FIX LITES
RSET LDA KBREQ ;DEBOUNCE
ANI 20H
JNZ RSET
NORSET LDA KBREQ ;GET STATUS AGAIN
ANI 80H
RZ ;A=0 IF NO CHAR WAITS
MVI A,0FFH
RET ;A=0FFH IF CHAR
;
TTYIN CALL TTYST ;CONSOLE INPUT DRIVER
JZ TTYIN
LDA KBCHR ;READ IN CHAR
CPI 0C8H ;IS CHAR 'SEARCH' KEY?
JNZ NOTESC ;BRIF NOT
MVI A,01BH ;MAP TO ASCII ESC IF SO
RET
NOTESC ANI 7FH ;STRIP PARITY
CPI 'Z'+20H+1 ;SEE IF L.C. A-Z
RNC ;DONE IF NOT
CPI 'A'+20H
RC
PUSH PSW ;SAVE IF SO
LDA MODE ;CHECK ALPHA LOCK
ANI SSBIT
JNZ NOFOLD ;PASS IF OFF
POP PSW
SUI 20H ;FOLD TO U.C. IF ON
RET
NOFOLD POP PSW
RET
;
TTYOUT XRA A ;CONSOLE OUTPUT DRIVER
CMP C ;IS CHAR NULL?
RZ ;TOSS IF SO
PUSH H ;SAVE REGS IF NOT
PUSH D
PUSH B
LHLD BUFPT ;CURR SCREEN POS
MOV A,M ;REMOVE CURSOR
ANI 7FH
MOV M,A
MOV A,C ;GET CHAR TO OUTPUT
ANI 7FH ;REMOVE ITS PARITY TOO
CPI CR ;IS IT <CR>?
JZ CRET ;GO PROCESS IF SO
CPI LF ;<LF>?
JZ LFEED
CPI BS ;BACKSPACE?
JZ BKSPC
CPI BELL ;BELL?
JZ RING
ANI 7FH ;NORMAL CHAR, STRIP HIGH BIT
CPI 7FH ;IS CHAR RUBOUT?
JZ CURSE ;TOSS IF SO
CPI 20H ;CONTROL CHAR?
JC CURSE ;TOSS THAT TOO
MOV M,A ;IF OK, WRITE TO DISPLAY
INX H ;UPDATE THE PTR
JMP CURSE ;GO UPDATE CURSOR
;
; BELL - RING IT
;
RING MOV A,M ;PUT CURSOR BACK
ORI 80H
MOV M,A
LDA MODE ;PRESERVE LITE STATUS
LXI H,160H ;SUITABLE BELL-RING CONSTANT
LXI D,-1 ;TO DEC WITH
RING5 XRI LBEL ;FLIP BELL BIT
STA KBCHR ;TURN BELL OFF OR ON
MVI B,20H ;LEAVE BELL IN THAT STATE
RING10 DCR B
JNZ RING10
DAD D ;RANG LONG ENUFF?
JC RING5 ;IF NOT, GO OSCILLATE
JMP COUT7 ; ELSE GO RESTORE REGS
;
; BACKSPACE - BACK UP PTR 1 POSITION
;
BKSPC MOV A,L ;SEE IF ALREADY AT FRONT
ANI ILMSK
JZ CURSE ;NO BACKSPACE IF SO
DCX H ;BACKSPACE THE PTR
JMP CURSE
;
; LINE FEED - PT TO SAME POS NEXT LINE
;
LFEED LXI B,LLEN ;LINE LENGTH
DAD B ;PT SAME POS NEXT LINE
JMP CURSE ; THEN PROCEED
;
; CARRIAGE RETURN - PT TO START CURR LINE
;
CRET MOV A,L ;LOW BYTE OF PTR
ANI LMSK ;PT TO START OF LINE
MOV L,A ; THEN FALL INTO CURSE
;
; OUTPUT CURSOR CHAR AND RESTORE REGS. IF PTR
; OFF SCREEN, SCROLL UP ONE LINE.
;
CURSE MOV A,H ;HI BYTE OF SCREEN PTR
CPI EOS SHR 8 ;OFF SCREEN?
JNC SCROLL ;BRIF SO
COUT5 SHLD BUFPT ;SAVE SCREEN PTR
MOV A,M ;SET CURSOR
ORI 80H
MOV M,A
COUT7 POP B ;RESTORE REGS
POP D
POP H
MOV A,C ;RET OUTPUT CHAR IN ACC
RET ;CHAR IS OUTPUT
;
; MOVE EACH LINE ON SCREEN UP ONE LINE
;
SCROLL PUSH H ;SAVE CURR SCREEN PTR
LXI D,SOS
LXI B,SLEN-LLEN
LXI H,SOS+LLEN
DW BTI ;BLOCK XFER
;
; FILL LAST LINE WITH BLANKS
;
MOV H,D ;MOVE DE TO HL
MOV L,E
MVI M,BLANK ;BLANK 1ST CHAR
INX D
LXI B,LLEN-1
DW BTI ;BLOCK XFER
POP H ;RESTORE SCREEN PTR
LXI B,-LLEN ;NEG LINE LENGTH
DAD B ;MOVE PTR UP ONE LINE
JMP COUT5 ;GO FINISH UP
;
LSTOUT: LDA MSTAT ;LIST CHAR
ANI 20H ;WAIT FOR MODEM READY
JZ LSTOUT
MOV A,C
STA MODEM ; THEN OUTPUT CHAR
RET
;
INITR XRA A ;STORE 0
STA IOBYT ;AT IOBYT LOCATION
LDA FLAG
ORA A
RNZ ;INIT ALREADY DONE
MVI A,1
STA FLAG
LXI H,SOS ;BLANK THE SCREEN
PUSH H ;SAVE PTR OVER BTI
MVI M,BLANK
LXI D,SOS+1
LXI B,SLEN-1
DW BTI
POP H ;RESTORE SOS PTR
MVI M,BLANK+80H ;MAKE CURSOR
SHLD BUFPT ;REMEMBER BUF PTR
MVI A,7FH
STA KBCHR ;TURN OFF KB LITES
STA MODE ;SAVE MODE TOO
STA 0F750H ;SET MODEM FOR 300 BAUD
STA 0F5F8H ;8 BITS, 1 STOP, NO PARITY
LDA KBCHR ;FLUSH KB INPUT
RET
;
; MSGOT DISPLAYS STRING OF CHARS PT'ED AT BY HL ON
; CONSOLE, UNTIL CHAR WITH PARITY BIT SET IS OUTPUT.
;
MSGOT: PUSH PSW ;SAVE CALLER FLAGS
MSGL: MOV C,M ;LOAD CHAR
CALL TTYOUT ;OUTPUT IT, COMES BACK IN A
INX H ;LEAVE PTR ON NEXT CHAR
RAL ;IS HIGH BIT ON?
JNC MSGL ;GO BACK IF NOT
POP PSW ; ELSE RESTORE FLAGS
RET ; AND RETURN
;
; DISK ERRORS REPORTED HERE, BECAUSE STUPID BDOS GIVES
; NO USEFUL INFORMATION. CALLED WITH MESSAGE PREAMBLE
; IN HL, HSTTRK IN D, HSTDSK IN E, AND ERSEC IN ACC.
;
DSKERR: PUSH PSW ;SAVE INFO
PUSH D
PUSH H ;SAVE BODY ADDRESS
LXI H,CRLF ;EJECT LINE
CALL MSGOT
POP H
CALL MSGOT ;REPORT BODY
POP D
PUSH D
MOV A,E ;THIS DISK
ADI 'A'
STA ASCDSK
LXI H,ERRMSG
CALL MSGOT
POP D
MOV A,D ;THIS TRACK
CALL HXBOT
LXI H,SECMSG
CALL MSGOT
POP PSW ;THIS SECTOR
;DROP INTO HXBOT TO FINISH
;
; HXBOT DISPLAYS HEXIDECIMAL EQUIV OF ACC CONTENTS.
;
HXBOT: PUSH PSW ;SAVE CHAR
RRC ;SWAP NIBBLES
RRC
RRC
RRC
CALL HXNOT ;OUTPUT HIGH NIBBLE
POP PSW ; THEN LOW NIBBLE
HXNOT: ANI 0FH ;STRIP HIGH NIBBLE
ADI 90H ;CVT TO ASCII DECIMAL
DAA
ACI 40H
DAA
MOV C,A ;CHAR TO C
JMP TTYOUT ;GO OUTPUT LAST CHAR
;
ERRMSG: DB ' err '
ASCDSK: DB ' : trk',' '+80H
SECMSG: DB ' sec',' '+80H
CRLF: DB CR,LF+80H
;
FLAG DB 0 ;BEEN HERE BEFORE BYTE
BUFPT DW 0 ;SCREEN CURSOR ADDRESS
MODE DB 0 ;LITES STATE AND ALPHA LOCK MODE
;
END