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 >
Assembly Source File  |  1984-04-29  |  7KB  |  302 lines

  1.     TITLE    'SDNUSER -- MARTIN USER ROUTINES OF 06/14/81'
  2. ;
  3. ;  THESE ROUTINES PROVIDE CONSOLE AND LIST FUNCTIONS
  4. ; FOR CP/M 2.2, USING THE HARDWARE OF THE MARTIN
  5. ; RESEARCH MACHINE. THE ROUTINES ARE LOADED INTO
  6. ; THE NON-CONTIGUOUS 1K OF HIGH RAM BY THE BOOTSTRAP
  7. ; ROUTINE. ALL COMMUNICATION WITH THESE ROUTINES
  8. ; IS THROUGH THE JUMP VECTORS AT THE FRONT.
  9. ;
  10. ;  WHEN GENNING A NEW SYSTEM, THIS CODE MUST BE
  11. ; LOADED INTO MEMORY AT 1F80H. THE EQUATE "LOADR",
  12. ; WHICH IS SET TO 1F80H-USER, IS PROVIDED FOR
  13. ; CONVENIENCE. SINCE USER WILL PROBABLY ALWAYS
  14. ; HAVE THE VALUE 0A000H, THE LOAD OFFSET WOULD
  15. ; THEN BE 7F80H. NOTE THAT IF THE ORIGIN OF THIS
  16. ; MODULE CHANGES, THE VALUE OF THE USER EQUATES
  17. ; IN THE SDNBOOT AND SDNBIOS MODULES MUST ALSO
  18. ; BE CHANGED.
  19. ;
  20. IOBYT    EQU    3
  21.     ;
  22. KBREQ    EQU    0E500H    ;MEM-MAPPED KB STATUS IN
  23. KBCHR    EQU    0E700H    ;MEM-MAPPED KB DATA IN
  24. MODEM    EQU    0F100H    ;MEM-MAPPED MODEM DATA
  25. MSTAT    EQU    0F300H    ;MEM-MAPPED MODEM STATUS
  26. LBEL    EQU    1    ;BEEPER BIT
  27. SSBIT    EQU    4    ;SUPER SHIFT (ALPHA LOCK) BIT
  28. SOS    EQU    07C00H    ;START OF MEM-MAPPED SCREEN
  29. EOS    EQU    08000H    ;END OF MEM-MAPPED SCREEN
  30. SLEN    EQU    EOS-SOS ;LENGTH OF SCREEN MEMORY
  31. LLEN    EQU    40H    ;LENGTH OF SCREEN LINE
  32. LMSK    EQU    0C0H    ;LINE MASK
  33. ILMSK    EQU    03FH    ;INVERTED LINE MASK
  34. BLANK    EQU    20H    ;ASCII BLANK
  35. CR    EQU    0DH    ;ASCII CARRIAGE RETURN
  36. LF    EQU    0AH    ;ASCII LINE FEED
  37. BS    EQU    08H    ;ASCII BACKSPACE
  38. BELL    EQU    07H    ;ASCII BELL
  39.     ;
  40. BTI    EQU    0B0EDH    ;Z80 BLOCK XFER OP
  41.     ;
  42. USER:    EQU    0A000H    ;LOCATED IN HIGH RAM
  43. LOADR:    EQU    1F80H-USER    ;DDT LOAD OFFSET
  44. ;
  45.     ORG    USER
  46.     ;
  47.     ;JUMP TABLE - CP/M JUMPS HERE FOR I/O
  48.     ;JUMPS MUST REMAIN HERE, IN SAME ORDER
  49. INIT    JMP    INITR    ;INITIALIZATION
  50. CONST    JMP    TTYST    ;CONSOLE STATUS CHECK
  51. CONIN    JMP    TTYIN    ;CONSOLE INPUT
  52. CONOUT    JMP    TTYOUT    ;CONSOLE OUTPUT
  53. LIST    JMP    LSTOUT    ;LIST OUTPUT
  54. PUNCH    JMP    TTYOUT    ;PUNCH OUTPUT
  55. READER    JMP    TTYIN    ;READER INPUT
  56. LISTST    XRA    A    ;LIST STATUS
  57.     DCR    A    ;ALWAYS RETURN READY
  58.     RET
  59.     JMP    MSGOT    ;MSG STRING OUTPUT ROUTINE
  60.     JMP    HXBOT    ;HEX CONVERSION ROUTINE
  61.     JMP    DSKERR    ;DISK I/O ERROR REPORTER
  62.     ;
  63.     ;BEGIN USER DRIVER ROUTINES HERE
  64.     ;
  65. TTYST    LDA    KBREQ    ;KEYBOARD STATUS CHECK
  66.     ANI    20H    ;RESET BEING HELD DOWN?
  67.     JZ    NORSET    ;BRIF NOT
  68.     LDA    MODE    ;FLIP ALPHA LOCK STATE IF SO
  69.     XRI    SSBIT
  70.     STA    MODE
  71.     STA    KBCHR    ; AND FIX LITES
  72. RSET    LDA    KBREQ    ;DEBOUNCE
  73.     ANI    20H
  74.     JNZ    RSET
  75. NORSET    LDA    KBREQ    ;GET STATUS AGAIN
  76.     ANI    80H
  77.     RZ        ;A=0 IF NO CHAR WAITS
  78.     MVI    A,0FFH
  79.     RET        ;A=0FFH IF CHAR
  80. ;
  81. TTYIN    CALL    TTYST    ;CONSOLE INPUT DRIVER
  82.     JZ    TTYIN
  83.     LDA    KBCHR    ;READ IN CHAR
  84.     CPI    0C8H    ;IS CHAR 'SEARCH' KEY?
  85.     JNZ    NOTESC    ;BRIF NOT
  86.     MVI    A,01BH    ;MAP TO ASCII ESC IF SO
  87.     RET
  88. NOTESC    ANI    7FH    ;STRIP PARITY
  89.     CPI    'Z'+20H+1    ;SEE IF L.C. A-Z
  90.     RNC        ;DONE IF NOT
  91.     CPI    'A'+20H
  92.     RC
  93.     PUSH    PSW    ;SAVE IF SO
  94.     LDA    MODE    ;CHECK ALPHA LOCK
  95.     ANI    SSBIT
  96.     JNZ    NOFOLD    ;PASS IF OFF
  97.     POP    PSW
  98.     SUI    20H    ;FOLD TO U.C. IF ON
  99.     RET
  100. NOFOLD    POP    PSW
  101.     RET
  102. ;
  103. TTYOUT    XRA    A    ;CONSOLE OUTPUT DRIVER
  104.     CMP    C    ;IS CHAR NULL?
  105.     RZ        ;TOSS IF SO
  106.     PUSH    H    ;SAVE REGS IF NOT
  107.     PUSH    D
  108.     PUSH    B
  109.     LHLD    BUFPT    ;CURR SCREEN POS
  110.     MOV    A,M    ;REMOVE CURSOR
  111.     ANI    7FH
  112.     MOV    M,A
  113.     MOV    A,C    ;GET CHAR TO OUTPUT
  114.     ANI    7FH    ;REMOVE ITS PARITY TOO
  115.     CPI    CR    ;IS IT <CR>?
  116.     JZ    CRET    ;GO PROCESS IF SO
  117.     CPI    LF    ;<LF>?
  118.     JZ    LFEED
  119.     CPI    BS    ;BACKSPACE?
  120.     JZ    BKSPC
  121.     CPI    BELL    ;BELL?
  122.     JZ    RING
  123.     ANI    7FH    ;NORMAL CHAR, STRIP HIGH BIT
  124.     CPI    7FH    ;IS CHAR RUBOUT?
  125.     JZ    CURSE    ;TOSS IF SO
  126.     CPI    20H    ;CONTROL CHAR?
  127.     JC    CURSE    ;TOSS THAT TOO
  128.     MOV    M,A    ;IF OK, WRITE TO DISPLAY
  129.     INX    H    ;UPDATE THE PTR
  130.     JMP    CURSE    ;GO UPDATE CURSOR
  131. ;
  132. ;  BELL - RING IT
  133. ;
  134. RING    MOV    A,M    ;PUT CURSOR BACK
  135.     ORI    80H
  136.     MOV    M,A
  137.     LDA    MODE    ;PRESERVE LITE STATUS
  138.     LXI    H,160H    ;SUITABLE BELL-RING CONSTANT
  139.     LXI    D,-1    ;TO DEC WITH
  140. RING5    XRI    LBEL    ;FLIP BELL BIT
  141.     STA    KBCHR    ;TURN BELL OFF OR ON
  142.     MVI    B,20H    ;LEAVE BELL IN THAT STATE
  143. RING10    DCR    B
  144.     JNZ    RING10
  145.     DAD    D    ;RANG LONG ENUFF?
  146.     JC    RING5    ;IF NOT, GO OSCILLATE
  147.     JMP    COUT7    ; ELSE GO RESTORE REGS
  148. ;
  149. ;  BACKSPACE - BACK UP PTR 1 POSITION
  150. ;
  151. BKSPC    MOV    A,L    ;SEE IF ALREADY AT FRONT
  152.     ANI    ILMSK
  153.     JZ    CURSE    ;NO BACKSPACE IF SO
  154.     DCX    H    ;BACKSPACE THE PTR
  155.     JMP    CURSE
  156. ;
  157. ;  LINE FEED - PT TO SAME POS NEXT LINE
  158. ;
  159. LFEED    LXI    B,LLEN    ;LINE LENGTH
  160.     DAD    B    ;PT SAME POS NEXT LINE
  161.     JMP    CURSE    ; THEN PROCEED
  162. ;
  163. ;  CARRIAGE RETURN - PT TO START CURR LINE
  164. ;
  165. CRET    MOV    A,L    ;LOW BYTE OF PTR
  166.     ANI    LMSK    ;PT TO START OF LINE
  167.     MOV    L,A    ; THEN FALL INTO CURSE
  168. ;
  169. ;  OUTPUT CURSOR CHAR AND RESTORE REGS. IF PTR
  170. ; OFF SCREEN, SCROLL UP ONE LINE.
  171. ;
  172. CURSE    MOV    A,H    ;HI BYTE OF SCREEN PTR
  173.     CPI    EOS SHR 8 ;OFF SCREEN?
  174.     JNC    SCROLL    ;BRIF SO
  175. COUT5    SHLD    BUFPT    ;SAVE SCREEN PTR
  176.     MOV    A,M    ;SET CURSOR
  177.     ORI    80H
  178.     MOV    M,A
  179. COUT7    POP    B    ;RESTORE REGS
  180.     POP    D
  181.     POP    H
  182.     MOV    A,C    ;RET OUTPUT CHAR IN ACC
  183.     RET        ;CHAR IS OUTPUT
  184. ;
  185. ;  MOVE EACH LINE ON SCREEN UP ONE LINE
  186. ;
  187. SCROLL    PUSH    H    ;SAVE CURR SCREEN PTR
  188.     LXI    D,SOS
  189.     LXI    B,SLEN-LLEN
  190.     LXI    H,SOS+LLEN
  191.     DW    BTI    ;BLOCK XFER
  192. ;
  193. ;  FILL LAST LINE WITH BLANKS
  194. ;
  195.     MOV    H,D    ;MOVE DE TO HL
  196.     MOV    L,E
  197.     MVI    M,BLANK ;BLANK 1ST CHAR
  198.     INX    D
  199.     LXI    B,LLEN-1
  200.     DW    BTI    ;BLOCK XFER
  201.     POP    H    ;RESTORE SCREEN PTR
  202.     LXI    B,-LLEN ;NEG LINE LENGTH
  203.     DAD    B    ;MOVE PTR UP ONE LINE
  204.     JMP    COUT5    ;GO FINISH UP
  205.     ;
  206. LSTOUT: LDA    MSTAT    ;LIST CHAR
  207.     ANI    20H    ;WAIT FOR MODEM READY
  208.     JZ    LSTOUT
  209.     MOV    A,C
  210.     STA    MODEM    ; THEN OUTPUT CHAR
  211.     RET
  212.     ;
  213. INITR    XRA A        ;STORE 0
  214.     STA IOBYT    ;AT IOBYT LOCATION
  215.     LDA FLAG
  216.     ORA A
  217.     RNZ        ;INIT ALREADY DONE
  218.     MVI A,1
  219.     STA FLAG
  220.     LXI    H,SOS    ;BLANK THE SCREEN
  221.     PUSH    H    ;SAVE PTR OVER BTI
  222.     MVI    M,BLANK
  223.     LXI    D,SOS+1
  224.     LXI    B,SLEN-1
  225.     DW    BTI
  226.     POP    H    ;RESTORE SOS PTR
  227.     MVI    M,BLANK+80H ;MAKE CURSOR
  228.     SHLD    BUFPT    ;REMEMBER BUF PTR
  229.     MVI    A,7FH
  230.     STA    KBCHR    ;TURN OFF KB LITES
  231.     STA    MODE    ;SAVE MODE TOO
  232.     STA    0F750H    ;SET MODEM FOR 300 BAUD
  233.     STA    0F5F8H    ;8 BITS, 1 STOP, NO PARITY
  234.     LDA    KBCHR    ;FLUSH KB INPUT
  235.     RET
  236. ;
  237. ;  MSGOT DISPLAYS STRING OF CHARS PT'ED AT BY HL ON
  238. ; CONSOLE, UNTIL CHAR WITH PARITY BIT SET IS OUTPUT.
  239. ;
  240. MSGOT:    PUSH    PSW        ;SAVE CALLER FLAGS
  241. MSGL:    MOV    C,M        ;LOAD CHAR
  242.     CALL    TTYOUT        ;OUTPUT IT, COMES BACK IN A
  243.     INX    H        ;LEAVE PTR ON NEXT CHAR
  244.     RAL            ;IS HIGH BIT ON?
  245.     JNC    MSGL        ;GO BACK IF NOT
  246.     POP    PSW        ; ELSE RESTORE FLAGS
  247.     RET            ; AND RETURN
  248. ;
  249. ;  DISK ERRORS REPORTED HERE, BECAUSE STUPID BDOS GIVES
  250. ; NO USEFUL INFORMATION. CALLED WITH MESSAGE PREAMBLE
  251. ; IN HL, HSTTRK IN D, HSTDSK IN E, AND ERSEC IN ACC.
  252. ;
  253. DSKERR:    PUSH    PSW        ;SAVE INFO
  254.     PUSH    D
  255.     PUSH    H        ;SAVE BODY ADDRESS
  256.     LXI    H,CRLF        ;EJECT LINE
  257.     CALL    MSGOT
  258.     POP    H
  259.     CALL    MSGOT        ;REPORT BODY
  260.     POP    D
  261.     PUSH    D
  262.     MOV    A,E        ;THIS DISK
  263.     ADI    'A'
  264.     STA    ASCDSK
  265.     LXI    H,ERRMSG
  266.     CALL    MSGOT
  267.     POP    D
  268.     MOV    A,D        ;THIS TRACK
  269.     CALL    HXBOT
  270.     LXI    H,SECMSG
  271.     CALL    MSGOT
  272.     POP    PSW        ;THIS SECTOR
  273.                 ;DROP INTO HXBOT TO FINISH
  274. ;
  275. ;  HXBOT DISPLAYS HEXIDECIMAL EQUIV OF ACC CONTENTS.
  276. ;
  277. HXBOT:    PUSH    PSW        ;SAVE CHAR
  278.     RRC            ;SWAP NIBBLES
  279.     RRC
  280.     RRC
  281.     RRC
  282.     CALL    HXNOT        ;OUTPUT HIGH NIBBLE
  283.     POP    PSW        ; THEN LOW NIBBLE
  284. HXNOT:    ANI    0FH        ;STRIP HIGH NIBBLE
  285.     ADI    90H        ;CVT TO ASCII DECIMAL
  286.     DAA
  287.     ACI    40H
  288.     DAA
  289.     MOV    C,A        ;CHAR TO C
  290.     JMP    TTYOUT        ;GO OUTPUT LAST CHAR
  291. ;
  292. ERRMSG: DB    ' err '
  293. ASCDSK: DB    ' : trk',' '+80H
  294. SECMSG: DB    ' sec',' '+80H
  295. CRLF:    DB    CR,LF+80H
  296.     ;
  297. FLAG    DB 0    ;BEEN HERE BEFORE BYTE
  298. BUFPT    DW 0    ;SCREEN CURSOR ADDRESS
  299. MODE    DB 0    ;LITES STATE AND ALPHA LOCK MODE
  300.     ;
  301.     END
  302.