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 / CPM / NSTAR / GENUSR37.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  56KB  |  2,155 lines

  1. ;**********************************************************
  2. ;                              *
  3. ;           HORIZON USER MODULE  -- 1/12/82          *
  4. ;                              *
  5. ;            R. L. PLOUFFE               *
  6. ;                              *
  7. MSIZE    EQU    62        ;MEMORY SIZE THIS VERS      *
  8.                 ;CHANGE TO YOUR SIZE HERE *
  9. OVERLAY    EQU    OVERLAY        ;COMPUTED SYSGEN OVERLAY  *
  10. ;                              *
  11. ; Requires North Star Horizon, PMMI modem, H19 terminal,  *
  12. ; and Computime T102 clock. Can be adapted for others.    *
  13. ;                              *
  14. ; This version can be assembled with ASM.COM          *
  15. ;**********************************************************
  16. ;
  17. ;           GENEUSER  VERSION 3.7
  18. ;
  19. ;    1/10/82 vers 3.6, cleaned up the code
  20. ;
  21. ;    12/30/81 vers 3.5, added H89 mode so that H89
  22. ;    games that use a 16 bit counter at 000BH inc-
  23. ;    remented by a clock interrupt will work properly.
  24. ;    The H89 command sets this mode and provides a prompt
  25. ;    for entry of the game file name.  It auto resets at
  26. ;    end of game, on a warm boot, or whenever CCP prompts.
  27. ;    This mode is used if you have a H19, or Z19 terminal.
  28. ;    Also added PARTYLN mode to the CCP-included 'BYE'
  29. ;    command to require ring back. (conditional assy.)
  30. ;    In all cases now, when the 'BYE' code is executed a
  31. ;    prompt of  *> appears indicating that the system is
  32. ;    in auto-answer mode.  The local console can get to
  33. ;    CP/M by hitting the ESC key.
  34. ;
  35. ;    12/14/81 vers 3.0, major revision to bring
  36. ;    GENEUSER up to date with XTCPM vers 1.5
  37. ;    Major difference from previous release is that
  38. ;    transients may have 3 levels of password pro-
  39. ;    tection (none, level 1, & level 2) just by
  40. ;    placing them in USER 13, 14, or 15 respectively.
  41. ;    Transients so placed will be universal in all
  42. ;    user areas only on drive A depending on password
  43. ;    level achieved.
  44. ;            *** RESTRICTION ***
  45. ;    Do not change file attributes (R/W R/O DIR SYS)
  46. ;    with STAT on your sytem disk in the 'A' drive unless
  47. ;    you know the file is in the user area that you are
  48. ;    logged to,  otherwise the file will now be owned
  49. ;    by the new user area. For that reason also, don't
  50. ;    use wild card changes to file attributes on A drive.
  51. ;    Once you make up your system disk with the files you
  52. ;    wish at password levels 0, 1, and 2 placed in users
  53. ;    13, 14, and 15 respectively, change file attributes
  54. ;    if you wish one file at a time and while logged to
  55. ;    the user area the file is in.  Then write-protect
  56. ;    your system disk.
  57. ;            Also, you can now log to a drive
  58. ;    and user area on one command line. i.e, B: 3 will
  59. ;    log you to drive B, user 3.
  60. ;
  61. ;
  62. ;    NOTE: Requires HELP.COM..See GENEHELP.ASM.
  63. ;    or use HELP20.ASM  Place HELP.COM in user 13
  64. ;    and the .HLP files in user 0, both on A drive.
  65. ;
  66. ;    FOR USE WITH CP/M VERS 1.45, 2.01, 2.2, 2.21A
  67. ;    AND 2.22 ON NORTH STAR DISK WITH LIFEBOAT BIOS.
  68. ;
  69. ;    THIS MODULE NOW PROVIDES FOR N ADDITIONAL CCP
  70. ;    COMMANDS INTEGRATED WITH THE ORIGINAL CCP. LOOK
  71. ;    AT THE FILE TO DISCOVER THEM ALL. 'BYE' IS ONE
  72. ;    OF THE INCLUDED CCP COMMANDS AND INCLUDES AN
  73. ;    'ANSWR' COMMAND THAT CAN BE USED LOCALLY TO GO
  74. ;    TO IMMEDIATE ANSWER TONE OR FROM A REMOTE TO
  75. ;    CHANGE BAUD RATE, SINCE IT WAITS FOR C/R'S OR
  76. ;    CONTROL-C'S TO SENSE NEW BAUD RATE. ALSO INCLUD-
  77. ;    ED IS AN 'ORIG' COMMAND THAT DEFAULTS TO 300 BAUD
  78. ;    OR ORIGINATES AT 110, 300, 450, OR 600 BAUD
  79. ;    BY ENTERING A 1, 3, 4, OR 6 ON THE COMMAND LINE
  80. ;    WITH 'ORIG', INITIATE CALL MANUALLY AND THEN
  81. ;    ENTER 'ORIG [X]' TO GO ON LINE. THE CCP COMMANDS
  82. ;    ARE DIVIDED INTO PUBLIC AND PRIVATE COMMANDS
  83. ;    WITH PASSWORD ENTRY FROM 'BYE' AND AN ADDITIONAL
  84. ;    PASSWORD REQUIRED FOR PRIVILEGED COMMANDS AND
  85. ;    USER AREAS ABOVE MAXUSER. 
  86. ;
  87. ;    THE MODULE ALSO INCLUDES A BACKGROUND MEMORY
  88. ;    TEST THAT CONSTANTLY RUNS WHENEVER THE CURRENT
  89. ;    CONSOLE IS AWAITING INPUT. ALSO, AN INTERRUPT
  90. ;    IS USED TO DISCONNECT THE LINE WHENEVER CARRIER
  91. ;    IS LOST. IT WILL ALSO TURN OFF THE COMPUTER
  92. ;    IF THE PMMI AUXILIARY INTERFACE IS IMPLEMENTED.
  93. ;    THE INTERRUPT IS INITIATED BY THE HORIZON REAL
  94. ;    TIME CLOCK EVERY 3.328 MS. TO IMPLEMENT, CONNECT
  95. ;    PIN 12 TO 13 ON THE CLOCK HEADER (10A) AND PIN
  96. ;    7 TO 16 ON THE INTERRUPT HEADER (1A). THE 'ID'
  97. ;    JUMPER AT LOC 7E ON THE Z80 BOARD MUST ALSO BE
  98. ;    CUT SO AS TO ENABLE INTERRUPTS. IN THE H89 MODE,
  99. ;    A COUNTER AT 000BH WILL BE INCREMENTED EVERY 3.33
  100. ;    MS.  THE TEST TO DISCONNECT THE LINE IF CARRIER IS
  101. ;    LOST USES THE SAME CLOCK INTERRUPT BUT IS DONE ONLY
  102. ;    ONCE EVERY 1000H INTERVALS (SO ONCE EVERY 13 SECS.).
  103. ;
  104. ;    THESE FEATURES ARE AVAILABLE ONLY WITH THE S201, S22
  105. ;    OR S22X CONDITIONAL ASSEMBLY AND NOT WITH S145
  106. ;    ASSEMBLY NOT CHECKED FOR CPM145.
  107. ;    
  108. ;    AS DISTRIBUTED HERE, ALL OF THE FEATURES ARE
  109. ;    AVAILABLE WITH ONLY ONE KILOBYTE OF SPACE ABOVE
  110. ;    CP/M. THUS, YOU CAN RUN A CP/M 62K SYSTEM IF YOUR
  111. ;    CONTROLLER PROM IS AT FC00H.
  112. ;
  113. ;    THE UTILITY, GENESYS.COM, IS USED TO GEN THE SYSTEM
  114. ;    TO OBTAIN THE ADDITIONAL 1KB RESIDENT ON THE NORTH
  115. ;    STAR SYSTEM DISK TRACKS. THE NEW VERSION, GENSYS32,
  116. ;    NOW WORKS WITH LIFEBOAT VERS 2.22 BIOS AS WELL AS
  117. ;    PREVIOUS VERSIONS (1.45, 2.01, 2.2, 2.21A). BE SURE
  118. ;    TO READ GENEUSYS.DOC FOR INSTRUCTIONS.
  119. ;
  120. ***********************************************************
  121. ;
  122. ;        SYSTEM EQUATES
  123. ;
  124. FALSE    EQU    0
  125. TRUE    EQU    NOT FALSE    ;SEE OPTIONS BLOCK
  126.                 ;TO SELECT ALL OPTIONS
  127. ; must select one, and only one, of these TRUE
  128. S145    EQU    FALSE
  129. S201    EQU    FALSE
  130. S22    EQU    FALSE
  131. S22X    EQU    TRUE    ;TRUE FOR 2.21A & 2.22
  132. ;
  133. ;
  134.     IF    S201 OR S22 OR S22X
  135. BIOS    EQU    (MSIZE*1024)-0D00H    ;BASE OF BIOS
  136. CCP    EQU    BIOS-1600H        ;BASE OF CCP
  137. USER1    EQU    BIOS+0700H        ;BASE OF THIS MODULE
  138. USER2    EQU    MSIZE*1024        ;BASE 2ND USER AREA
  139. PROMLOC    EQU    BIOS+6F5H        ;LOC OF PROMHI BYTE
  140. OVERLAY    EQU    2000H-BIOS        ;COMPUTED OVERLAY
  141.     ENDIF
  142.     ;
  143.     IF    S145
  144. BIOS    EQU    (MSIZE*1024)-200H    ;BASE OF BIOS
  145. CCP    EQU    BIOS-1500H        ;BASE OF CCP
  146. USER1    EQU    BIOS+500H        ;BASE OF THIS MODULE
  147. USER2    EQU    MSIZE*1024+800H        ;BASE OF 2ND USER AREA
  148. PROMLOC    EQU    CCP-100H+0CH        ;LOC OF PROMHI BYTE.
  149.                     ;PLACED HERE BY COLD
  150.                     ;BOOT LOADER PATCHED
  151.                     ;IN BY GENESYS.COM
  152. OVERLAY    EQU    2400H-USER1        ;COMPUTED OVERLAY
  153.     ENDIF
  154.     ;
  155. BDOS    EQU    CCP+800H        ;BASE OF BDOS
  156.     ;
  157.     IF    S22 OR S22X
  158. STACK    EQU    BDOS+341H        ;ROOM IN SYSTEM FOR A
  159.                     ;A 24 LEVEL STACK. 12 REQ.
  160.     ENDIF
  161.     ;
  162.     IF    S201
  163. STACK    EQU    BIOS+6DDH        ;24 LEVEL STACK
  164.     ENDIF
  165.     ;
  166. COMBUF    EQU    CCP+7H            ;LOC OF CMD BUFFER
  167. ;
  168. IOBYTE    EQU    0003H            ;I/O BYTE ADDRESS
  169. INIT    EQU    CCP-900H        ;ORG FOR INIT CODE
  170. DRIVE    EQU    0004H            ;LOC OF CURR DRV BYTE
  171. HOLE4    EQU    CCP+1F5H        ;20 BYTES
  172. INTCNTR    EQU    1000H            ;INTERRUPT COUNTER VALUE
  173. ;
  174. ;**********************************************************
  175. ;**********************************************************
  176. ;
  177. ;        SYSTEM OPTIONS
  178. ;    ALL OPTIONS ARE IN THIS BLOCK.
  179. ;
  180. IOBYT    EQU    00000001B    ;VALUE OF IOBYTE
  181.         ; ; ; ;---------;CONSOLE IS TTY:    00
  182.         ; ; ;        ;        CRT:    01
  183.         ; ; ;        ;        BAT:    10
  184.         ; ; ;        ;        UC1:    11
  185.         ; ; ;-----------;READER IS  TTY:    00
  186.          ; ;        ;        RDR:    01 
  187.         ; ;        ;        UR1:    10 
  188.         ; ;        ;        UR2:    11 
  189.         ; ;-------------;PUNCH IS   TTY:    00 
  190.         ;        ;        PUN:    01 
  191.         ;        ;        UP1:    10 
  192.         ;        ;        UP2:    11  
  193.         ;---------------;LIST IS    TTY:    00 
  194.                 ;        CRT:    01 
  195.                 ;        LPT:    10 
  196.                 ;        UL1:    11 
  197. ;                               
  198. PASBYT    EQU    00100100B    ;PASSWORD BYTE       
  199.           ;  ;----------;PASSWORD 2 REQUIRED       
  200.           ;-------------;PASSWORD 1 REQUIRED       
  201. ;
  202.     ORG    HOLE4
  203. ;These are the passwords for entry to CP/M from BYE       
  204. ;and to USER area and command privileges above MAXUSER       
  205. ;repectively. Passwords must be exactly 10 characters, and   
  206. ;may be filled out to this value with spaces. The password
  207. ;checking routine sets bit 7 of the char it gets from the
  208. ;console (including remote) high, so add 80H to each char
  209. ;of the password (including any spaces) that will be entered.
  210. ;Fill out passwords shorter than 10 chars w/spaces without
  211. ;bit 7 set high.  This prevents the ASCII characters from
  212. ;being visible with a monitor.  They look like code instead.           
  213. ;
  214. PAS1:    DB    'P'+80H        ; 1  PASSWORD1
  215.     DB    'A'+80H        ; 2
  216.     DB    'S'+80H        ; 3
  217.     DB    'S'+80H        ; 4
  218.     DB    'W'+80H        ; 5
  219.     DB    'O'+80H        ; 6
  220.     DB    'R'+80H        ; 7
  221.     DB    'D'+80H        ; 8
  222.     DB    '1'+80H        ; 9
  223.     DB    ' '        ; 10
  224.     ;
  225. PAS2:    DB    'P'+80H        ; 1  PASSWORD2
  226.     DB    'A'+80H        ; 2
  227.     DB    'S'+80H        ; 3
  228.     DB    'S'+80H        ; 4
  229.     DB    'W'+80H        ; 5
  230.     DB    'O'+80H        ; 6
  231.     DB    'R'+80H        ; 7
  232.     DB    'D'+80H        ; 8
  233.     DB    '2'+80H        ; 9
  234.     DB    ' '        ; 10    
  235. ;                               
  236.             ;20 BYTES AVAILABLE AT HOLE4
  237. ;
  238. ;                               
  239. PARTYLN    EQU    FALSE    ;WANT PARTY LINE OPERATION? 
  240.             ;NOTE - IF PARTYLN IS SET TRUE
  241.             ;AND ALL OTHER OPTIONS ARE TRUE,
  242.             ;THEN U WILL NEED MORE THAN 1K
  243.             ;RESERVED ABOVE CP/M. 
  244. RUNHELP    EQU    TRUE    ;WANT TO RUN HELP.COM WHEN PHONE
  245.             ;IS ANSWERED BY 'BYE'?
  246. PARITY    EQU    TRUE    ;WANT TO SET PARITY MEMORY       
  247. SCRCLR    EQU    TRUE    ;WANT TO CLEAR SCREEN ON BOOT      
  248. CLOCK    EQU    TRUE    ;WANT TIME FROM CLOCK BOARD        
  249. ;                               
  250. FASTCLK EQU    TRUE    ;SET TRUE FOR 4 MHZ CLOCK       
  251. ;                               
  252. MAXUSER    EQU    2    ;FOR EXAMPLE..MAX PUBLIC USER AREA 
  253. ;                               
  254.     IF    S201 OR S22 OR S22X
  255.     ORG    USER1-8H                   
  256. CONFG:    DB    00000000B    ;SAME AS IN NORTH STAR DOS 
  257.                 ;BITS 0,1,2,3 SET INDICATE 
  258.                 ;FASTSTEPPING IN ORDER A,  
  259.                 ;B,C,D. BITS 7,6,5,4 SET   
  260.                 ;INDICATE DOUBLE SIDED IN  
  261.                 ;ORDER A,B,C,D.           
  262.     ORG    USER1-13H                   
  263.     JMP    WINIT        ;REPLACE THE JMP WITH RET  
  264.                 ;IF YOU DO NOT WANT THE    
  265.                 ;WINIT RTNE.           
  266. ;                               
  267. JOFTEN:    RET            ;REPLACE WITH A JMP       
  268.     DW    0000H        ;PATCH IN ADDR OF YOUR RTNE
  269.     ENDIF                           
  270. ;                               
  271.     IF    S145
  272.     ORG    USER1-4H                   
  273. DENSITY:                           
  274.     DB    10101010B    ;BITS 1,3,5,7 DD ON A,B,C,D
  275. BUFFER:                               
  276.     DW    USER1+100H    ;BIOS BUFFER LOCATION       
  277.                 ;YOU CAN CHANGE THIS IF YOU 
  278.                 ;WISH BUT IN 1K INCREMENTS 
  279.     ENDIF                           
  280. ;                               
  281.     ORG    USER1-1H                   
  282. MODE:    DB    RAW+EIBIT+CAUTO    ;MODE BYTE       
  283. ;                               
  284.     ONEDRV    EQU    80H    ;BIT 7=1 INDICATES 1 DRIVE 
  285.     RAW    EQU    40H    ;SET READ AFTER WRITE      
  286.     EIBIT    EQU    10H    ;ENABLE INTERRUPTS AFTER   
  287.                 ;DISK ACCESS           
  288.     NMOUNT    EQU    8    ;USE DRVPAR PARAMETERS       
  289.     WAUTO    EQU    2    ;WARM BOOT AUTO FUNCTION   
  290.     CAUTO    EQU    1    ;COLD BOOT AUTO FUNCTION   
  291. ;                               
  292. ;END OF OPTIONS BLOCK                       
  293. ;***********************************************************
  294. ;***********************************************************
  295. ;
  296. ;        HORIZON I/O PORT ASSIGNMENTS
  297. ;
  298. ;Be sure to check memory, modem, and clock port assignments
  299. ;for your system.
  300. ;
  301. PARAL    EQU    0    ;PARALLEL I/O PORT
  302. SER1D    EQU    2    ;LEFT SERIAL PORT DATA
  303. SER1ST    EQU    3    ;LEFT SERIAL PORT STATUS
  304. SER2D    EQU    4    ;RIGHT SERIAL PORT DATA
  305. SER2ST    EQU    5    ;RIGHT SERIAL PORT STATUS
  306. MOTHER    EQU    6    ;MOTHERBOARD COMMAND/STATUS
  307. MEMORY    EQU    0C0H    ;PARITY MEMORY PORT
  308. MODEM    EQU    0E0H    ;PMMI MODEM BASE PORT
  309. CLKBRD    EQU    0CH    ;DATA PORT FOR COMPUTIME BOARD
  310. ;
  311. ;**********************************************************
  312. ;START OF USER1 CODE
  313. ;
  314. ;        JUMP TABLE LINKS BIOS TO GENEUSER
  315. ;        The rest of the jumps are at base
  316. ;        of the BIOS.
  317. ;
  318. ;DO NOT CHANGE THE NUMBER OF BYTES FROM HERE TO 'CONOUT:'.
  319. ;
  320. ;**********************************************************
  321.     ORG    USER1
  322.     JMP    INITIAL        ;USER INIT ROUTINE
  323.     IF    S22X
  324.     JMP    WINIT        ;USED BY 221A & HIGHER ONLY
  325.     ENDIF
  326. ;
  327. CRTIN:    IN    SER1D    ;GET DATA
  328. STRPRET: ANI    7FH    ;STRIP PARITY
  329.     RET
  330. PASBYTE: DB    0    ;BUFFER FOR PASSWORD BYTE
  331. ;
  332. ;***********************************************************
  333. ;
  334. ;        IOBYTE PROCESSOR
  335. ;    INCLUDING SCANNER OF MODEM & CONSOLE
  336. ;
  337. ;***********************************************************
  338. ;
  339. CONOUT:
  340.     LDA    MDMBYT        ;MODEM MODE?
  341.     ORA    A
  342. DB    JRNZ,    CONOUT0-$-1    ;IF NOT ,SKIP MODEM CHK
  343.     ;
  344.     IN    TPORT
  345.     ANI    P0TBMT        ;XMIT BUFFER EMPTY?
  346. DB    JRZ,    CONOUT-$-1 AND 0FFH
  347.     ;
  348.     MOV    A,C
  349.     OUT    DPORT
  350.     ;    
  351. CONOUT0: ;CONSOLE OUTPUT ROUTINE
  352.     CALL    CONSOL        ;COMMON ROUTINE
  353.     DW    TTYOUT        ;TTY OUTPUT
  354.     DW    CRTOUT        ;CRT OUTPUT
  355.     DW    LIST        ;LIST OUTPUT 
  356.     DW    UC1OUT        ;USER CONSOLE OUTPUT
  357. ;
  358. CONSOL:
  359.     MVI    A,CONCNT    ;SHIFT COUNTER
  360. ;
  361. DISPAT:    ;I/O DISPATCHER - TO MAP LOGICAL TO PHYSICAL
  362.     XTHL             ;GET RETURN ADDR & SAVE HL
  363.     PUSH    B        ;SAVE BC
  364.     PUSH    D        ;SAVE DE
  365.      MOV    B,A        ;PUT COUNTER VALUE IN B
  366.     LDA    IOBYTE        ;GET THE IO BYTE
  367.     ;
  368. DISPAT1:
  369.     DCR    B        ;SHIFT IOBYTE UNTIL
  370. DB    JRZ,    DISPAT2-$-1    ;COUNT IN B=0
  371.     RRC
  372.     RRC
  373. DB    JR,    DISPAT1-$-1 AND 0FFH ;SHIFT NEXT TWO BYTES
  374.     ;
  375. DISPAT2:
  376.     ANI    03H        ;MASK OUT BITS 0,1
  377.     RLC            ;DOUBLE
  378.     MVI    D,0        ;CLEAR D
  379.     MOV    E,A        ;
  380.     DAD    D        ;H,L POINTS TO ENTRY
  381.     MOV    A,M        ;GET LOW BYTE
  382.     INX    H        ;POINT TO HIGH BYTE
  383.     MOV    H,M        ;GET HIGH BYTE
  384.     MOV    L,A        ;H,L POINTS TO SUBR.
  385.     POP    D        ;RESTORE DE
  386.     POP    B        ;RESTORE BC
  387.     XTHL            ;RSTR HL & PUT RET ON STACK
  388.     RET
  389. ;
  390. CONST:
  391.     LDA    MDMBYT        ;GET MODEM BYTE
  392.     ORA    A        ;ZERO?
  393. DB    JRNZ,    CONST0-$-1    ;IF NOT, SKIP MODEM CHECK
  394.     ;
  395. ;CHECK FOR MODEM CHAR READY
  396.     IN    TPORT        ;GET MODEM STATUS
  397.     ANI    P0DAV        ;DATA AVAILABLE?
  398. DB    JRZ,    CONST0-$-1    ;NO, TEST KEYBOARD
  399.     ;
  400. ;GOT CHAR FROM MODEM
  401.     MVI    A,0FFH        ;SHOW TRUE
  402.     ORA    A        ;RESET FLAGS
  403.     RET
  404.     ;
  405. CONST0:    ;CONSOLE STATUS, RETURN 0FFH IF READY ,0 IF NOT
  406.     CALL    CONSOL        ;COMMON ROUTINE
  407.     DW    TTYST        ;TTY STATUS
  408.     DW    CRTST        ;CRT STATUS
  409.     DW    RDRST        ;READER STATUS 
  410.     DW    UC1ST        ;USER CONSOLE STATUS
  411. ;
  412. CONIN:    CALL    TEST        ;BACKGROUND MEMORY TEST
  413.     CALL    CONST
  414.     ORA    A        ;SET CC
  415. DB    JRZ,    CONIN-$-1 AND 0FFH
  416. ;TEST KEYBOARD FIRST
  417.     CALL    CONST0
  418.     ORA    A        ;SET CC
  419. DB    JRZ,    KEYNK-$-1    ;NO KEYBOARD CHAR
  420.     ;
  421. ;GOT KEYBOARD CHAR
  422. CONIN0:    ;CONSOLE INPUT ROUTINE
  423.     CALL    CONSOL        ;COMMON CONSOLE ROUTINE
  424.     DW    TTYIN        ;TTY INPUT
  425.     DW    CRTIN        ;CRT INPUT
  426.     DW    READER        ;READER INPUT 
  427.     DW    UC1IN        ;USER CONSOLE INPUT
  428.     ;
  429. KEYNK:    ;GET CHAR FROM MODEM IF READY
  430.     LDA    MDMBYT
  431.     ORA    A
  432.     MVI    A,0FFH        ;RET FF IF NO CARRIER
  433.     RNZ
  434.     ;
  435.     IN    TPORT        ;STATUS
  436.     ANI    P0DAV        ;RECEIVE CHAR?
  437. DB    JRZ,    CONIN-$-1 AND 0FFH ;NO MODEM CHAR
  438.     IN    DPORT        ;GET DATA
  439.     JMP    STRPRET        ;STRIP PARITY & RETURN
  440. ;
  441. READER0: CALL TEST        ;BACKGROUND MEM TEST
  442. READER:    ;READER INPUT ROUTINE
  443.     MVI    A,RDRCNT    ;SHIFT COUNTER
  444.     CALL    DISPAT        ;GO TO LOOKUP ROUTINE
  445.     DW    TTYRDR        ;READER IS TTY KBD.
  446.     DW    HSRIN        ;IS HIGH SPEED READER
  447.     DW    UR1IN        ;USER READER ONE
  448.     DW    UR2IN        ;USER READER TWO
  449. ;
  450. PUNCH:    ;PUNCH OUTPUT ROUTINE
  451.     MVI    A,PCHCNT    ;SHIFT COUNTER
  452.     CALL    DISPAT        ;LOOK UP ROUTINE
  453.     DW    TTYOUT        ;PUNCH IS TTY
  454.     DW    PUNOUT        ;HIGH SPEED PUNCH
  455.     DW    UP1OUT        ;USER PUNCH ONE
  456.     DW    UP2OUT        ;USER PUNCH TWO
  457. ;
  458. LIST:    ;LIST OUTPUT ROUTINE
  459.     MVI    A,LSTCNT    ;SHIFT COUNTER
  460.     CALL    DISPAT        ;GO TO DISPATCHER
  461.     DW    TTYOUT        ;LIST DEVICE IS TTY
  462.     DW    CRTOUT        ;LIST DEVICE IS CRT
  463.     DW    LPTOUT        ;LINE PRINTER
  464.     DW    UL1OUT        ;USER LIST DEVICE
  465. ;
  466. LISTST:    ;LIST DEVICE STATUS ROUTINE
  467.     MVI    A,LSTCNT    ;SHIFT COUNTER
  468.     CALL    DISPAT        ;LOOK UP ROUTINE
  469.     DW    TTYST        ;RETURN TTY STATUS
  470.     DW    CRTST        ;RETURN CRT STATUS
  471.     DW    LPTST        ;LINE PRINTER STATUS
  472.     DW    UL1ST        ;USER LIST DEVICE STATUS
  473. ;
  474. ;**********************************************************
  475. ;
  476. ;           NORTH STAR HORIZON I/O DRIVERS
  477. ;
  478. ;**********************************************************
  479. ;
  480. ;        CRT DRIVERS (LEFT SERIAL PORT)
  481. ;
  482. CRTST:    ;CRT STATUS
  483.     IN     SER1ST    ;GET SERIAL ZERO STATUS
  484. DB    JR,    TSTSTAT-$-1
  485. ;
  486. CRTOUT:    ;CRT OUTPUT
  487.     IN    SER1ST    ;GET STATUS FOR LEFT SERIAL
  488.     ANI    OUTRDY    ;READY TO RECEIVE DATA?
  489. DB    JRZ,    CRTOUT-$-1 AND 0FFH    ;NO, LOOP TIL READY
  490.     MOV    A,C    ;GET DATA
  491.           OUT    SER1D    ;SEND TO DATA PORT
  492.     RET
  493. ;
  494. ;        TTY DRIVERS (RIGHT SERIAL PORT)
  495. ;
  496. TTYST:        ;TTY INPUT STATUS
  497.     IN    SER2ST    ;GET SERIAL TWO STATUS
  498. DB    JR,    TSTSTAT-$-1
  499. ;
  500. TTYRDR:    ;TTY KEYBOARD AS READER
  501.     IN    SER2ST
  502.     ANI    INRDY
  503.     JZ    READER0
  504. TTYIN:    IN    SER2D    ;GET DATA
  505.     JMP    STRPRET    
  506. ;
  507. TTYOUT:    ;TTY OUTPUT
  508.     IN    SER2ST    ;GET STATUS FOR SERIAL PORT 1
  509.     ANI    OUTRDY    ;READY FOR DATA?
  510. DB    JRZ,    TTYOUT-$-1 AND 0FFH    ;NO, WAIT TIL READY
  511.     MOV    A,C    ;GET DATA
  512.     OUT    SER2D    ;SEND TO SERIAL 2 DATA PORT
  513.     RET
  514. ;
  515. ;        READER DRIVER (PARALLEL INPUT PORT)
  516. ;
  517. RDRST:                ;READER STATUS
  518.     IN    MOTHER        ;GET STATUS
  519. TSTSTAT:
  520.     ANI    INRDY        ;MASK FOR READY
  521.     RRC            ;SHIFT TO LSB
  522. DCRCMA:
  523.     DCR    A        ;IF ZERO, MAKE FF
  524.     CMA            ;COMPLEMENT THE ACC.
  525.     RET
  526.  
  527. HSRIN:                ;HIGH-SPEED READER INPUT 
  528.     IN    MOTHER        ;GET STATUS
  529.     ANI    INRDY        ;READY WITH DATA?
  530.     JZ    READER0        ;LOOP UNTIL PI FLAG
  531.     IN    PARAL        ;GET PARALLEL INPUT DATA
  532.     ANI    07FH        ;STRIP PARITY
  533.     MOV    B,A        ;SAVE
  534.     MVI    A,30H        ;LOAD COMMAND BYTE TO A
  535.     OUT    MOTHER        ;RESET PI FLAG
  536.     MOV    A,B        ;RECOVER DATA
  537.     RET
  538. ;
  539. ;        PUNCH DRIVER (PARALLEL OUTPUT PORT)
  540. ;
  541. PUNOUT:                ;HIGH-SPEED PUNCH OUTPUT 
  542. LPTOUT:                ;LINE PRINTER OUT
  543.     ;PUNOUT AND LPTOUT ARE SAME ROUTINE
  544.     IN    MOTHER        ;GET STATUS
  545.     ANI    OUTRDY        ;READY FOR DATA
  546. DB    JRZ,     LPTOUT-$-1 AND 0FFH    ;NO, WAIT TIL READY
  547.     MOV    A,C        ;GET DATA
  548.     OUT    PARAL        ;SEND TO PARALLEL PORT
  549.     MVI    A,20H        ;COMMAND BYTE
  550.     OUT    MOTHER        ;RESET PO FLAG
  551.     MOV    A,C        ;GET DATA AGAIN
  552.     RET
  553. ;
  554. LPTST:                ;LINE PRINTER STATUS 
  555.     IN    MOTHER        ;GET STATUS
  556.     ANI    OUTRDY        ;READY TO RECEIVE CHAR
  557. DB    JR,    DCRCMA-$-1 AND 0FFH
  558. ;
  559. ;**********************************************************
  560. ;
  561. ;    USER WARM INITIALIZATION ROUTINE
  562. ;        
  563. ;**********************************************************
  564. ;
  565. WINIT:
  566. PRNTIM:
  567.     IF    NOT CLOCK
  568.     CALL    ILPRT2
  569.     DB    ESC,EXGRAPH,0
  570.     RET
  571.     ENDIF
  572. ;
  573.     IF     CLOCK AND NOT S145
  574.     CALL    TIME
  575.     DCX    B
  576.     DCX    B
  577.     JMP    PRNSTR1
  578.     ENDIF
  579.     ;
  580. ;
  581. ;**********************************************************
  582. ;This patch which is called from the CCP provides for a
  583. ;report of USER number at the prompt....i.e. A2> for USER 2,
  584. ;'A' drive.
  585. ;
  586.     IF    NOT S145
  587. UPATCH:    CALL    GETUSR        ;GET USER NUMBER
  588.     ANI    0FH        ;KILL UNWANTED BITS
  589. DB    JRZ,    UPA2-$-1    ;IF USER 0, DON'T REPORT
  590.     CPI    10
  591. DB    JRC,    UPA1-$-1    ;JIF USER NUM = 0 THRU 9
  592.     SUI    10        ;USER NUM = 10 THRU 15
  593.     PUSH    PSW
  594.     MVI    C,'1'
  595.     CALL    CONOUT        ;PRINT A '1'
  596.     POP    PSW
  597.     ;
  598. UPA1:    ADI    '0'
  599.     MOV    C,A
  600.     CALL    CONOUT        ;PRINT DIGIT
  601.     ;
  602. UPA2:    MVI    C,'>'
  603.     CALL    CONOUT        ;PRINT '>', EXIT
  604.     LDA    H89FLG
  605.     ORA    A        ;H89 MODE?
  606.     CNZ    DARMCLK        ;DISARM REAL TIME CLOCK
  607.     XRA    A
  608.     STA    TRAPBYT        ;CLEAR THE TRAPS
  609.     STA    H89FLG        ;SET H89 MODE TO FALSE
  610.     JMP    RSTPRMS        ;RESET PARAMETERS & RETURN
  611. ;
  612. ;**********************************************************
  613. ;The password checking routine- uses string comparator
  614. ;that is contained in the CCP.
  615. ;
  616. CKPASS0: LXI    H,PASBYTE
  617. DW    BIT2M
  618. DB    JRZ,    OK-$-1
  619.     LXI    H,PAS2
  620.     SHLD    STRPTR
  621.     LXI    H,PASTBL2
  622.     SHLD    CMDPTR
  623. DB    JR,    CKPASS-$-1
  624.     ;
  625. PASSINT: CALL    LOGTST
  626. DB    JRZ,    OK-$-1
  627.     LXI    H,PAS1
  628.     SHLD    STRPTR
  629.     LXI    H,PASTBL1
  630.     SHLD    CMDPTR
  631.     ;
  632. CKPASS:    MVI    A,1
  633.     STA    CMDCNT
  634.     MVI    A,10
  635.     STA    CMDLEN
  636.     MVI    C,4    ;GIVES 4 TRIES
  637.     PUSH    B
  638.     ;
  639. CKAGIN:    CALL    ILPRT
  640.     DB    'Password:  ',0
  641.     POP    B
  642.     MVI    B,14    ;TO KEEP HIM FROM CLOBBERING
  643.             ;THE CODE
  644.     LXI    H,FCBFN
  645. DRCON:
  646.     CALL    CONIN
  647. DW    SET7A        ;SET BIT 7 OF PASSWORD CHAR HIGH
  648.     CPI    CR+80H
  649. DB    JRNZ,    DRCN2-$-1
  650.     MVI    A,20H
  651.     MVI    B,1
  652. DRCN2:    MOV    M,A
  653.     INX    H
  654.     DCR    B
  655. DB    JRNZ,    DRCON-$-1 AND 0FFH    
  656.     ;
  657.     DCR    C
  658.     JZ    RELOG0
  659.     PUSH    B
  660.     JMP    SRCHCMD
  661.     ;
  662. ;**********************************************************
  663. ;Routine to set 2nd password bit so that entry of 2nd
  664. ;password is required again.
  665. ;
  666. LOCK:    LXI    H,PASBYTE
  667. DW    SET2M
  668.     ;
  669. ;fall through
  670. ***********************************************************
  671. ;Say ok.
  672. OK:    CALL    ILPRT
  673.     DB    'Ok',0
  674.     JMP    RETCCP
  675. ;
  676. ;**********************************************************
  677. ;ROUTINE TO SET UP THE MODEM UART PARAMETERS.
  678. ;
  679. SETUP:    MOV    A,M
  680.     ORA    A
  681. DB    JRNZ,    SETURT-$-1
  682.     LXI    H,UART
  683. SETURT:    LXI    D,BAUDRT
  684.     LXI    B,5
  685. DW    LDIR
  686.     RET
  687. ;
  688. ;**********************************************************
  689. ;ROUTINE TO CHECK EXIT REQUEST FROM A LOOP
  690. ;
  691. REQEXIT: CALL    CONST
  692.     ORA    A
  693.     RZ
  694.     CALL    CONIN
  695.     RET
  696. ;
  697.     ENDIF
  698. ;
  699. ;**********************************************************
  700. ;Print hex subroutines used in the background memory test.
  701. ;
  702. PRTHX:    PUSH    PSW
  703.     RRC
  704.     RRC
  705.     RRC
  706.     RRC
  707.     CALL    PRTHX1
  708.     POP    PSW
  709. ;
  710. PRTHX1:    ANI    0FH
  711.     CPI    10
  712. DB    JRC,    PRTHX2-$-1
  713.     ADI    7
  714. ;
  715. PRTHX2:    ADI    '0'
  716.     MOV    C,A
  717.     JMP    CONOUT
  718. ;
  719. ;**********************************************************
  720. ;DISARM CLOCK INTERRUPT BEFORE RETURNING TO CCP
  721. ;
  722. CCPRET:    XRA    A
  723.     STA    PASBYTE
  724.     MVI    A,P3CLEAR
  725.     OUT    CPORT    ;BE SURE PHONE LINE DISCONNECTED
  726.     ;
  727.     CALL    DARMCLK    ;IN CASE RETURNING TO CCP
  728.     JMP    RELOG0
  729. ;
  730. USR1END: EQU    $        ;END OF USER1 CODE FOR NOW
  731. USR1SIZE EQU    USR1END-USER1    ;MUST NOT EXCEED SPACE 
  732.                 ;ALLOCATED IN USER1
  733. ;
  734. ;**********************************************************
  735. ;
  736. ;    THIS IS THE INIT ROUTINE.  IT WILL RUN AT CCP-900H
  737. ;    AND WILL MOVE THE USER2 CODE JUST ABOVE CPM WHERE
  738. ;    YOU MUST HAVE RESERVED EITHER 1 OR 2K, SIZING YOUR
  739. ;    SYSTEM ACCORDINGLY. THE INIT CODE IS NOT MOVED
  740. ;    AND WILL BE OVERWRITTEN BY TRANSIENT PROGRAMS.
  741. ;
  742.     ORG    INIT
  743. ;
  744. INITIAL:
  745.     LXI    H,SOURCE    ;SOURCE OF USER2 CODE
  746.     LXI    D,USER2        ;DEST OF USER2 CODE
  747.     LXI    B,USR2END-USER2    ;# OF BYTES TO MOVE
  748. DW    LDIR            ;MOVE THEM
  749. ;
  750.     MVI    A,IOBYT        ;THE VALUE
  751.     STA    IOBYTE        ;THE LOCATION
  752. ;
  753.     XRA    A        ;SET TO CLEAR MOTHERBOARD
  754.     OUT    MOTHER
  755.     OUT    MOTHER        ;EXTRAS FOR TIMING, 
  756.     OUT    MOTHER
  757.     OUT    MOTHER        ;DON'T ASK
  758.     OUT    CPORT
  759.     OUT    TPORT
  760. ;
  761.     MVI    A,40H        ;DISABLE PARITY LOGIC
  762.     OUT    MEMORY        ;BEFORE READING RAM
  763.     ;
  764.     LHLD    PROMLOC-1    ;POINT TO LOC OF PROMHI.
  765.                 ;AT 0CH OF CLDBT FOR 1.45.
  766.                 ;AT BIOS+6F5H FOR 2.0,2.2,
  767.                 ;&2.21A 
  768.     MVI    L,0        ;ZERO L
  769.     ;
  770.     IF    PARITY        ;WANT PARITY SETTING CODE?
  771.     MOV    D,H
  772.     MOV    E,L
  773.     LXI    B,-1023        ;NUMBER OF BYTES TO CLEAR
  774. DW    LDDR            ;SET PARITY ON ALL RAM
  775.     MVI    A,41H        ;PARITY ENABLE CODE
  776.     OUT    MEMORY        ;REARM PARITY LOGIC
  777.     ENDIF
  778.     ;
  779.     LXI    H,MODE        ;POINT TO MODE BYTE
  780. DW    SET4M            ;SET MODE BYTE SO THAT
  781.                 ;INTERRUPTS ARE ENABLED
  782.                 ;AFTER DISK ACCESS
  783.     MVI    A,USER2/256    ;PAGE ADDR OF PARITY ERROR
  784.                 ;ROUTINE
  785. DW    MOVIVA            ;PUT HI BYTE IN IV REGISTER
  786. DW    IM2            ;SET INTERRUPT MODE 2
  787.     EI
  788. ;
  789.     MVI    A,0CEH        ;INITIALIZE UARTS
  790.                 ;2 STOPS, 16X CLOCK
  791.                 ;8 BITS, NO PARITY
  792.     OUT    SER1ST
  793.     OUT    SER2ST
  794. ;
  795.     MVI    A,37H        ;COMMAND: RTS, ER,
  796.                 ;RXF, DTR, TXEN
  797.     OUT    SER1ST
  798.     OUT    SER2ST
  799. ;
  800. ;
  801.     IN    DPORT        ;CLEAR MODEM PORT
  802.     IN    SER1D        ;CLEAR INPUT BUFFER
  803.     IN    SER2D        ;CLEAR INPUT BUFFER
  804.     IN    PARAL        ;CLEAR PARALLEL PORT
  805.     MVI    A,PASBYT
  806.     STA    PASBYTE
  807. ;
  808. DB    JR,    TINU-$-1
  809. ;
  810. ; ***THIS IS A SPECIAL ORG FOR THE LIFEBOAT FORMAT BYTE****
  811. ; BE SURE THAT PRECEEDING CODE DOES NOT OVERWRITE THIS LOC.
  812.     ORG    INIT+5CH
  813.     DS    1        ;STORAGE FOR FORMAT BYTE
  814. ;
  815. TINU:    MVI    A,0C3H
  816.     STA    52H
  817.     LXI    H,TIME
  818.     SHLD    53H
  819.     MVI    A,30H        ;RESET PI FLAG
  820.     OUT    MOTHER
  821.     RET
  822. ;
  823. INITEND:EQU    $
  824. INITSIZE EQU    INITEND-INIT
  825. ;
  826. ;**********************************************************
  827. ; USER2 code starts here. Will be relocated to just above
  828. ; CP/M by the INIT code.
  829. ;
  830. SOURCE:    EQU    $        ;SOURCE OF USER2 CODE
  831. OFFSET:    EQU    USER2-SOURCE    ;OFFSET FOR USER2 CODE
  832. FR:    EQU    -1-OFFSET    ;FORWARD RELATIVE
  833. BR:    EQU    FR+0FFH+1    ;BACKWARD RELATIVE
  834. ;
  835. ;**********************************************************
  836. ; THIS IS RAM PARITY ERROR ROUTINE FOR USE WITH NORTH STAR
  837. ; PARITY MEMORY BOARDS. INITIALIZATION IN INIT MUST BE TO
  838. ; Z80 INTERRUPT MODE 2 AND PARITY ERROR SHOULD ACTIVATE INT-
  839. ; ERRUPT VECTOR 5 BY JUMPERING ON MEMORY BOARDS. DO NOT 
  840. ; CHANGE THE ORG FOR THIS CODE + SEE THE WARNING BELOW AT
  841. ; LABEL 'STORE'.
  842. ;
  843. PERR:    EQU    $+OFFSET
  844.     PUSH    PSW
  845.     CALL    ILPRT
  846.     DB    'Ram parity error',0
  847.     MVI    A,40H
  848.     OUT    MEMORY        ;DISARM PARITY LOGIC
  849.     POP    PSW
  850.     ;
  851. ;**********************************************************
  852. ;Routines to disconnect the line upon clock interrupt and
  853. ;carrier not detected. The routines are peculiar to the
  854. ;North Star Horizon hardware. Provide your own service
  855. ;routines for other hardware. This routine also provides for
  856. ;incrementing a counter at 000BH every 3.33 ms. for the use
  857. ;of some H89 games. Carrier checking is done only one out of
  858. ;every 1000H interrupts which are provided by the real time
  859. ;clock every 3.33 ms.
  860. ;
  861. DISCONN: EQU    $+OFFSET
  862.     PUSH    PSW
  863.     PUSH    H
  864.     LHLD    COUNTER
  865.     DCX    H        ;DECREMENT COUNTER
  866.     MOV    A,H        ;TO TEST FOR ZERO
  867.     ORA    L        ;
  868.     SHLD    COUNTER
  869.     PUSH    PSW
  870.     LDA    H89FLG
  871.     ORA    A
  872. DB    JRZ,    NOTH89-$+FR
  873.     LHLD    000BH
  874.     INX    H
  875.     SHLD    000BH
  876. NOTH89:    EQU    $+OFFSET
  877.     CALL    RSTCLK
  878.     POP    PSW
  879. DB    JRNZ,    DUN-$+FR
  880.     LXI    H,INTCNTR
  881.     SHLD    COUNTER
  882.     LDA    H89FLG
  883.     ORA    A
  884. DB    JRNZ,    DUN-$+FR
  885.     CALL    CHECK
  886. DUN:    EQU    $+OFFSET
  887.     POP    H
  888.     POP    PSW
  889.     RET
  890. ;
  891. ARMCLK:    EQU    $+OFFSET
  892.     DI
  893.     LXI    H,INTCNTR
  894.     SHLD    COUNTER
  895.     MVI    A,0C0H    ;ARM CLOCK INTERRUPT
  896.     OUT    MOTHER
  897.     ;
  898. RSTCLK:    EQU    $+OFFSET
  899.     MVI    A,50H
  900.     OUT    MOTHER
  901.     EI
  902.     RET
  903. ;
  904. ;**********************************************************
  905. ;Computime T-102 clock routine
  906. ;
  907.     IF    CLOCK
  908. TIME:    EQU    $+OFFSET     ;DISPAYS DATE AND TIME
  909.     IN    CLKBRD        ;CLOCK STATUS
  910.     INR    A        ;NO CLOCK BOARD?
  911.     LXI    D,NOCLOCK
  912.     RZ            ;SAY NO CLOCK BOARD
  913.     ;
  914.     LXI    H,HHMM        ;POINT TO START OF HR.,MIN.
  915.     XRA    A        ;TO GET THE HR. TENS
  916.     CALL    GETDIG        ;GET THE DIGITS
  917.     LXI    H,MMDD        ;POINT TO DATE DIGITS
  918.     MVI    A,8        ;TO GET MONTH TENS
  919.     CALL    READ        ;READ IT
  920.     CPI    63        ;TEST TO SUPPRESS LEADING 0
  921. DB    JRNZ,    NOBLNK-$+FR
  922.     MVI    A,20H        ;SUPPRESS WITH A BLANK
  923. NOBLNK:    EQU    $+OFFSET
  924.     MOV    M,A        ;PUT IN MEMORY
  925.     INX    H        ;POINT TO NEXT DIGIT
  926.     MVI    A,9        ;SET TO READ MONTH UNITS
  927.     CALL    GETDIG        ;GET IT
  928.     LXI    D,DTMSG        ;POINT TO DATE/TIME MSG
  929.                 ;SUPPLY YOUR OWN OUT ROUTINE
  930.     PUSH    D
  931.     XCHG
  932.     POP    D
  933.     PUSH    D
  934.     POP    B        ;NOTE, THAT BC, DE, & HL ALL
  935.                 ;CONTAIN ADDRESS OF DATE/TIME
  936.                 ;MESSAGE FOR THE CONVENIENCE
  937.                 ;OF YOUR APPLICATIONS. 
  938.                 ;string terminator is 0 or '$'
  939.     RET
  940. ;
  941. READ:    EQU    $+OFFSET     ;READ A DIGIT, CONV TO ASCII
  942.     OUT    CLKBRD        ;SEND FUNCT # TO CLOCK BOARD
  943.     CALL    CLKDLY
  944.     IN    CLKBRD        ;DIGIT RETURNED IN A
  945.     ANI    0FH        ;MASK
  946.     ADI    30H        ;CHANGE TO ASCII
  947.     RET
  948. ;
  949. GETDIG:    EQU    $+OFFSET     ;GET A DIGIT AND STORE IT
  950.     CPI    12        ;DONE WITH DATE?
  951.     RZ
  952.     CPI    6        ;DONE WITH TIME?
  953.     RZ
  954.     MOV    B,A        ;SAVE A FOR AWHILE
  955.     CALL    READ        ;GET DIGIT FROM CLOCK
  956.     MOV    C,A        ;SAVE FOR AWHILE
  957.     MOV    A,M        ;READ CHAR IN MEMORY
  958.     CPI    2FH        ;IS IT / ?
  959. DB    JRNZ,    SKIP1-$+FR
  960.     INX    H        ;IF SO GO INCREMENT POINTER
  961. SKIP1:    EQU    $+OFFSET
  962.     CPI    3AH        ;IS IT : ?
  963. DB    JRNZ,    SKIP2-$+FR    ;ADVANCE POINTER TO SKIP
  964.     INX    H
  965. SKIP2:    EQU    $+OFFSET
  966.     MOV    M,C        ;PUT DIGIT IN MEMORY
  967.     MOV    A,B        ;GET SAVE CLOCK FUNCT VALUE
  968.     INX    H        ;POINT TO NEXT DIGIT
  969.     INR    A        ;ADVANCE TO NEXT FUNCTION
  970.     JMP    GETDIG        ;AND GET ANOTHER DIGIT
  971. ;
  972.     DB    ESC,EXGRAPH
  973. DTMSG:    EQU    $+OFFSET     ;DATE/TIME STORAGE LOCATION
  974.     DB    'Time '
  975. HHMM:    EQU    $+OFFSET
  976.     DB    'HH:MM:'
  977. SECX10:    EQU    $+OFFSET
  978.     DB    'S'
  979. SECX1:    EQU    $+OFFSET
  980.     DB    'S'
  981. ;
  982. DATE:    EQU    $+OFFSET
  983.     DB    '  Date '
  984. MMDD:    EQU    $+OFFSET
  985.     DB    'MM/DD/'
  986. YY:    EQU    $+OFFSET
  987.     DB    '1982'
  988.     DB    0,'$'
  989. ;
  990.     DB    ESC,EXGRAPH
  991. NOCLOCK:    EQU    $+OFFSET
  992.     DB    'NoClk',0,'$'
  993.     ENDIF
  994. ;
  995. ;**********************************************************
  996. ;LOSS OF CONNECTION TEST
  997. ;
  998. CARCK:    EQU    $+OFFSET
  999. ;
  1000. ;THE PMMI MODEM AUTOMATICALLY HANGS UP THE PHONE AFTER
  1001. ;15 SECONDS OF LOSS OF CARRIER, PROVIDING YOU OUTPUT TO
  1002. ;PORT 0 TO ALLOW IT (WHICH THIS PROGRAM DOES).
  1003. ;
  1004. ;..SO, THIS ROUTINE FIRST CHECKS IF THE MODEM HAS HUNG UP,
  1005. ;AND IF SO, RETURNS WITH CARRY SET.  IF NOT, IT CHECKS FOR
  1006. ;CARRIER AND RETURNS IF CARRIER IS ON; OTHERWISE WAITS FOR
  1007. ;CARRIER WHILE STILL TESTING FOR DISCONNECT.
  1008. ;
  1009. ;IT TESTS THE PMMI "CTS" (CLEAR TO SEND) BIT
  1010. ;WHICH IS 0 WHEN THERE IS CARRIER.
  1011. ;
  1012.     IN    RPORT    ;GET STATUS
  1013.     ANI    P2CONN    ;CONNECTED?
  1014.     STC        ;(IN CASE NOT)
  1015.     RNZ        ;HUNG UP.
  1016. ;STILL CONNECTED, CHECK FOR CARRIER
  1017.     CALL    CKCTS    ;SEE IF CLEAR TO SEND
  1018.     RZ
  1019. ;LOOP UNTIL EITHER CONNECTION LOST, OR CARRIER RETURNS
  1020. DB    JR,    CARCK-$+BR
  1021. ;
  1022. ;**********************************************************
  1023. ;DELAY ROUTINES
  1024. ;
  1025. ; .1 SEC DELAY
  1026. ANSDLY:    EQU    $+OFFSET
  1027.     PUSH    B
  1028.     ;
  1029.     IF    FASTCLK
  1030.     LXI    B,16667    ;4 MHZ
  1031.     ENDIF
  1032.     ;
  1033.     IF    NOT    FASTCLK
  1034.     LXI    B,8334    ;2 MHZ
  1035.     ENDIF
  1036.     ;
  1037.     JMP    DELAY1
  1038.     ;
  1039. ;**********************************************************
  1040. ;The values at TABLE and TABLE1 must be at 0EFH and 0F7H
  1041. ;respectively in this page.  They are the addresses of the
  1042. ;parity error message and phone disconnect service routines.
  1043. ;Those addresses are called by the Z80 mode 2 interrupt 
  1044. ;when a parity error is detected on a north star memory 
  1045. ;board and phone line disconnect with a PMMI modem using 
  1046. ;interrupts 5 and 6 respectively.
  1047. ;
  1048. STORE:    EQU    $+OFFSET
  1049.     DS    USER2+00EFH-$-OFFSET
  1050. ;
  1051. ;**************************************
  1052. ;    *****WARNING*****          *
  1053. ; IF YOU ADD CODE IN USER2 ABOVE THIS *
  1054. ; POINT, BE CERTAIN THAT THE LOCATION *
  1055. ; OF THE FOLLOWING TABLE ADDRESS IS   *
  1056. ; EQUAL TO OR > THAN THE ADDRESS      *
  1057. ; AT 'STORE' AND THAT THE LO BYTE IS  *
  1058. ; 0EFH IN THIS PAGE OR ELSE THE RAM   *
  1059. ; PARITY ERROR MESSAGE WON'T WORK.    *
  1060. ;**************************************
  1061. ;
  1062. TABLE:    EQU    $+OFFSET    ;THIS ADDRESS MUST BE AT 
  1063.                 ;0EFH IN SAME PAGE AS PERR
  1064.     DW    PERR
  1065. ;
  1066. ;Routine to check carrier
  1067. ;
  1068. CKCTS:    EQU    $+OFFSET
  1069.     IN    RPORT    ;LOOK AT STATUS
  1070.     ANI    P2CTS    ;GET CARRIER DETECT BIT
  1071.     RET
  1072.     DB    0        ;SPARE, DO NOT REMOVE
  1073. ;
  1074. TABLE1: EQU    $+OFFSET    ;THIS ADDRESS MUST BE AT 
  1075.                 ;0F7H IN THIS PAGE
  1076.     DW    DISCONN        ;ADDR OF ROUTINE TO HANGUP
  1077.                 ; THE LINE
  1078. ;
  1079. H89FLG:    EQU    $+OFFSET
  1080.     DB    0    ;INITIAL VALUE
  1081. ;
  1082. ***********************************************************
  1083. ; 2 MSEC DELAY
  1084. ;
  1085. CLKDLY:    EQU    $+OFFSET
  1086.     PUSH    B
  1087.     ;
  1088.     IF    FASTCLK
  1089.     LXI    B,333
  1090.     ENDIF
  1091.     ;
  1092.     IF    NOT FASTCLK
  1093.     LXI    B,167
  1094.     ENDIF
  1095.     ;
  1096. DELAY1:    EQU    $+OFFSET
  1097.     DCX    B
  1098.     MOV    A,B
  1099.     ORA    C
  1100. DB    JRNZ,    DELAY1-$+BR
  1101.     POP    B
  1102.     RET
  1103. ;
  1104. ;**********************************************************
  1105.     IF    (S201 OR S22 OR S22X)
  1106. ;This is Ward's 'BYE' program modified to run as CCP-includ-
  1107. ;ed command. It comes up in auto-answer mode and requires a
  1108. ;password using the CCP-included LOGIN command routine. You
  1109. ;may exit locally to the system by hitting the ESCape key.
  1110. ;You can also enter the command ANSWR after you are in the
  1111. ;system to give an immediate answer tone. (The remote can
  1112. ;then send a few C/R's to set to his baud rate and will get
  1113. ;in without requiring a password.)  After the remote is in,
  1114. ;he may enter the ANSWR command, return to his system to 
  1115. ;change his speed, and then come back with C/R's to change 
  1116. ;the answer baud rate. In each case, a second password must 
  1117. ;be entered to obtain CCP privilege to higher USER areas and 
  1118. ;CCP command/transients using the PASS command. 
  1119. ;
  1120. BYE:    EQU    $+OFFSET
  1121.     CALL    PRNTIM
  1122.     CALL    ILPRT    ;PRINT THIS MSG:
  1123.     DB    'Goodbye, call again',CR,LF,0
  1124.     ;
  1125. HANGUP: EQU    $+OFFSET
  1126. ;
  1127. ;SET BIT 7, PMMI AUX INTERFACE, CAUSING POWER TO GO OFF
  1128. ;(has no effect if aux interface is not implemented)
  1129.     MVI    A,OFFPWR
  1130.     OUT    CPORT    
  1131.     ;
  1132. OFF:    EQU    $+OFFSET
  1133.     MVI    A,PASBYT
  1134.     STA    PASBYTE
  1135.     CALL    RSTMDM    ;TO RESET THE MODEM BYTE
  1136.     ;
  1137. ;CLEAR DTR CAUSING PHONE TO HANG UP
  1138.     MVI    A,P3CLEAR
  1139.     OUT    CPORT
  1140.     CALL    ARMCLK
  1141.     CALL    ILPRT2
  1142.     DB    CR,'*>',0
  1143. SETPRMS: EQU    $+OFFSET
  1144.     CALL    RSTPRMS
  1145. ;
  1146. ;AWAIT RINGING
  1147. RINGWT:    EQU    $+OFFSET
  1148. ;
  1149. ;CHECK LOCAL KEYBOARD FOR 'ESC' EXIT REQUEST.
  1150.     CALL    REQEXIT
  1151.     CPI    ESC
  1152.     JZ    CCPRET  ;YES, --EXIT-- TO CP/M
  1153.     IN    RPORT    ;GET THE STATUS
  1154.     ANI    P2RDET    ;RINGING?
  1155. DB    JRNZ,    RINGWT-$+BR    ;NO, WAIT
  1156. ;
  1157.     IF    PARTYLN
  1158.     CALL    DARMCLK
  1159. ;NOW WAIT UNTIL RING IS FINISHED
  1160. ENDRING: EQU    $+OFFSET
  1161.     CALL    ANSDLY        ;.1 SEC DELAY FOR DEBOUNCE
  1162.     IN    RPORT        ;GET STATUS
  1163.     ANI    P2RDET        ;STILL RINGING?
  1164. DB    JRZ,    ENDRING-$+BR    ;WAIT UNTIL RING FINISHED
  1165. ;
  1166. ;PHONE IS RINGING
  1167. ;
  1168. ;      THIS ROUTINE MINIMIZES THE COMPUTER'S INTERFERENCE
  1169. ;      WITH NORMAL HOUSEHOLD PHONE USE BY HAVING COMPUTER
  1170. ;      FOLK DIAL, LET THE PHONE RING ONCE, HANG UP AND 
  1171. ;      THEN DIAL AGAIN.  WHEN THE PHONE RINGS ONLY ONCE IT
  1172. ;      ALERTS THE COMPUTER WHICH THEN WAITS FOR AND ANSWERS
  1173. ;      ANY RING WHICH OCCURS WITHIN THE NEXT 40 SECONDS.
  1174. ;
  1175.     MVI    L,45        ;DELAY 4.5 SECONDS FOR NEXT RING
  1176. WAITNX:    EQU    $+OFFSET
  1177.     CALL    ANSDLY        ;WAIT .1 SECONDS
  1178.     DCR    L        ;MORE TO GO?
  1179. DB    JRNZ,    WAITNX-$+BR    ;YES?...LOOP
  1180.     IN    RPORT        ;GET THE STATUS
  1181.     ANI    P2RDET        ;RINGING AGAIN?
  1182. DB    JRNZ,    EXPECT-$+FR    ;NO?...ITS FOR ME
  1183. ;CALL NOT FOR COMPUTER - WAIT UNTIL RINGING DONE, THEN RESET
  1184. WAITNR:    EQU    $+OFFSET
  1185.     MVI    L,100        ;WAIT FOR 10 SECS NO RINGING
  1186. WAITNRL: EQU    $+OFFSET
  1187.     CALL    ANSDLY         ;DELAY .1 SECONDS
  1188.     IN    RPORT        ;GET THE STATUS
  1189.     ANI    P2RDET        ;STILL RINGING?
  1190. DB    JRZ,    WAITNR-$+BR    ;YES, WAIT 10 MORE SECONDS
  1191.     DCR    L        ;NO RING, MAYBE WE'RE DONE
  1192. DB    JRNZ,    WAITNRL-$+BR    ;NO, LOOP SOME MORE
  1193. DB    JR,    HANGUP-$+BR
  1194. ;
  1195. EXPECT:    EQU    $+OFFSET
  1196.     LXI    H,400        ;40 SECONDS TO REDIAL
  1197. LOOKAGN: EQU    $+OFFSET
  1198.     IN    RPORT
  1199.     ANI    P2RDET        ;RINGING AGAIN?
  1200. DB    JRZ,    ANSWER-$+FR
  1201.     CALL      ANSDLY
  1202.     DCX    H
  1203.     MOV    A,H
  1204.     ORA    L
  1205. DB    JRNZ,    LOOKAGN-$+BR
  1206.     JMP    HANGUP
  1207.     ENDIF
  1208. ;
  1209. DB    JR,    ANSWER-$+FR
  1210. ;    
  1211. MDMBYT:    EQU    $+OFFSET
  1212.     DB    0FFH    ;MODEM BYTE, 0FFH=OFF
  1213. ;
  1214. DARMCLK: EQU    $+OFFSET
  1215.     MVI    A,40H    ;DISARM CLOCK INTERRUPT
  1216.     OUT    MOTHER
  1217.     RET
  1218. ;
  1219. ;SETUP MODEM
  1220. ANSWR:    EQU    $+OFFSET ;IMMEDIATE ANSWER TONE
  1221.     LXI    H,PASBYTE ;POINT TO PASSWORD BYTE
  1222. DW    RES5M        ;NO 1RST PASSWORD REQUIRED
  1223.     ;
  1224. ANSWER:    EQU    $+OFFSET
  1225.     CALL    ARMCLK
  1226.     LXI    H,UART
  1227.     CALL    SETMDM    ;SET MODEM BYTE
  1228. SYNCH:    EQU    $+OFFSET
  1229.     LDA    DTR    ;TURN ON DTR
  1230.     OUT    CPORT    ;.. AND SET FILTER VALUE
  1231.     CALL    ANSDLY    ;TIME TO TURN ON
  1232.     MVI    A,P0110+P0ANSW
  1233.     OUT    TPORT    ;ANSWER PHONE
  1234.     CALL    ANSDLY
  1235.     LDA    UARTWD
  1236.     OUT    TPORT
  1237.     IN    DPORT    ;..CLEAR MODEM
  1238.     IN    DPORT    ;..MAKE SURE IT'S CLEAR
  1239.     LDA    BAUDRT
  1240.     OUT    RPORT    ;SET BAUD RATE DIVISOR
  1241.     CALL    CONIN    ;GET CHARACTER FROM MODEM
  1242.     CPI    CR    ;IF A CARRIAGE RETURN...
  1243. DB    JRZ,    WELCOME-$+FR 
  1244.     CPI    LF    ;LINE FEED?
  1245. DB    JRZ,    WELCOME-$+FR
  1246.     CPI    'C'-40H    ;IF A CONTROL-C
  1247. DB    JRZ,    WELCOME-$+FR  ;YES, EXIT
  1248.     CALL    SETUP
  1249. DB    JR,    SYNCH-$+BR ;TEST MORE - INVALID BAUD RATE
  1250. ;
  1251. UART:    EQU    $+OFFSET
  1252.     DB    B300,P3TODTR,P0NOPY+P08BIT,'30'
  1253.     DB    B450,P3TODTR-20H,P0NOPY+P08BIT,'45'
  1254.     DB    B110,P3TODTR,P0NOPY+P08BIT+P0TSB,'11'
  1255.     DB    B600,P3TODTR-20H,P0NOPY+P08BIT,'60'
  1256. ;    DB    B520,P3TODTR-20H,P0NOPY+P08BIT,'52'
  1257. ;    DB    B220,P3TODTR,P0NOPY+P08BIT,'22'
  1258. ;    DB    B710,P3TODTR-20H,P0NOPY+P08BIT,'71'
  1259.     DB    0
  1260. BAUDRT:    EQU    $+OFFSET
  1261.     DB    B600
  1262. DTR:    EQU    $+OFFSET
  1263.     DB    P3TODTR-20H
  1264. UARTWD:    EQU    $+OFFSET
  1265.     DB    P0NOPY+P08BIT
  1266. RATE:    EQU    $+OFFSET
  1267.     DB    '600 baud',0
  1268. ;
  1269. WELCOME: EQU    $+OFFSET
  1270.     LXI    B,RATE
  1271.     CALL    PRNSTR1    ;SHOW THE BAUD RATE
  1272.     CALL    PRNTIM
  1273.     LXI    H,SIGNON
  1274.     CALL    PRNSTR2    ;SHOW SIGN-ON STRING W/O SCRCLR
  1275.     ;
  1276.     IF    RUNHELP
  1277.     JMP    GETCMD    ;RUN 'HELP'
  1278.     ENDIF
  1279.     ;
  1280.     IF    NOT RUNHELP
  1281.     JMP    RETCCP
  1282.     ENDIF    
  1283.     ;
  1284. ;**********************************************************
  1285. ;Routines to trap transient files if they are resident
  1286. ;on drive A.  If DIR.COM not present, then the CCP code for
  1287. ;the DIR command will be executed. If TYPE.COM not present,
  1288. ;then the CCP code for the TYPE command will be executed.
  1289. ;This trapping is useful for SD.COM and MLIST.COM re-named
  1290. ;to DIR.COM and TYPE.COM respectively.
  1291. ;**NOTE**  Do not use a Directory transient that scans user
  1292. ;areas such as SD-21 or SD-22. KDIR is ok.  You can use SD-42
  1293. ;if you set AOPT to FALSE and add an IF AOPT and ENDIF around
  1294. ;the [lda,newusr; cmp m; jnz mordir] sequence at the label,
  1295. ;SYSFOK. Otherwise you will defeat the universal user area
  1296. ;features in this program so far as directories are concerned,
  1297. ;although the universallity will still apply to execution and
  1298. ;finding of files in users 13, 14, and 15.
  1299. ;
  1300. DIR1:    EQU    $+OFFSET
  1301.     LXI    H,TRAPBYT
  1302. DW    SET0M            ;SET DIR TRAP
  1303.     JMP    GETRANS
  1304.     ;
  1305. TYPE1:    EQU    $+OFFSET
  1306.     LXI    H,TRAPBYT
  1307. DW    SET1M
  1308.     JMP    GETRANS
  1309.     ;
  1310. HUH0:    EQU    $+OFFSET
  1311.     LXI    H,TRAPBYT
  1312. DW    BIT0M            ;SEE IF DIR TRAP SET
  1313.     JNZ    DIR        ;CCP DIR CODE IF NOT
  1314. DW    BIT1M            ;SEE IF TYPE TRAP SET
  1315. DW    RES1M
  1316.     JNZ    TYPE        ;CCP TYPE CODE IF NOT
  1317.     CALL    ILPRT
  1318.     DB    'No, ',BELL,0
  1319.     CALL    LOGTST
  1320.     JNZ    RELOG
  1321.     JMP    HUH+3        
  1322.     ;
  1323. ;**********************************************************
  1324. ;Routine for ORIG(inate) command.
  1325. ;
  1326. ORIG:    EQU    $+OFFSET
  1327.     LDA    MDMBYT
  1328.     ORA    A
  1329.     JZ    HUH
  1330.     CALL    WRFCB
  1331. ORIG1:    EQU    $+OFFSET
  1332.     LXI    H,UART
  1333. ROTATE:    EQU    $+OFFSET
  1334.     CALL    SETUP
  1335.     JZ    HUH
  1336.     PUSH    H
  1337.     LXI    H,BAUDRT+3
  1338.     LDA    FCBFN
  1339.     CPI    20H
  1340. DB    JRNZ,    COMPR-$+FR
  1341.     MVI    A,'3'    ;DEFAULT TO 300 BAUD
  1342. COMPR:    EQU    $+OFFSET
  1343.     CMP    M
  1344.     POP    H
  1345. DB    JRNZ,    ROTATE-$+BR
  1346.     MVI    A,P3CLEAR
  1347.     OUT    CPORT
  1348.     LXI    B,RATE
  1349.     CALL    PRNSTR1
  1350.     MVI    A,P0ORIG
  1351.     OUT    TPORT
  1352.     LDA    DTR
  1353.     OUT    CPORT
  1354. WTCTS:    EQU    $+OFFSET
  1355.     CALL    REQEXIT
  1356.     CPI    'E'-40H
  1357.     JZ    CCPRET
  1358.     CALL    CKCTS
  1359. DB    JRNZ,    WTCTS-$+BR
  1360.     LDA    BAUDRT
  1361.     OUT    RPORT
  1362.     LDA    UARTWD
  1363.     OUT    TPORT
  1364. COMLOOP: EQU    $+OFFSET
  1365.     IN    TPORT
  1366.     ANI    P0DAV
  1367. DB    JRZ,    NOMDAT-$+FR
  1368.     IN    DPORT
  1369.     ANI    7FH
  1370.     MOV    C,A
  1371.     CALL    CONOUT
  1372. NOMDAT:    EQU    $+OFFSET
  1373.     CALL    CONST
  1374.     ORA    A
  1375. DB    JRZ,    COMLOOP-$+BR
  1376.     CALL    CONIN
  1377.     OUT    DPORT
  1378.     CPI    'D'-40H
  1379.     JZ    CCPRET
  1380.     CPI    'E'-40H
  1381.     JZ    RETCCP
  1382. DB    JR,    COMLOOP-$+BR
  1383. ;
  1384. ;**********************************************************
  1385. ;This is the command string which is divided into private
  1386. ;and public sections. Do not use more than five letters for
  1387. ;the name of any command/transient and fill out each string
  1388. ;to exactly five characters by using spaces below. Strings
  1389. ;must occur at 5 character intervals.  If you use some
  1390. ;other string length such as 4 as in the original CCP, just
  1391. ;change string lengths below and change the LENCMD equate
  1392. ;from 5 to 4.  I use 5 below so that LOGIN can fit.
  1393. ;
  1394. CMDSTR2: EQU    $+OFFSET
  1395.     DB    'ERA  REN  SAVE H89  LOCK BOOT '
  1396. CMDSTR1: EQU    $+OFFSET
  1397.     DB    'TYPE USER PASS DIR  ANSWRORIG '
  1398. CMDSTR0: EQU    $+OFFSET
  1399.     DB    'DIR  LOGINOFF  BYE  QUIT '
  1400. ;
  1401. ;**********************************************************
  1402. ;This is the command address table which is divided into
  1403. ;private and public areas. The address of the routine to be
  1404. ;jumped to must be here for CCP-included code as well as
  1405. ;any that you put in your customized BIOS.
  1406. ;You can expand the table to any extent that you have space
  1407. ;and the command string above must be expanded in synchronism.
  1408. ;
  1409. CMDTBL2: EQU    $+OFFSET
  1410.     DW    ERA    ;ERA....PRIVATE COMMANDS
  1411.     DW    REN    ;REN
  1412.     DW    SAVE    ;SAVE
  1413.     DW    H89    ;SET H89 MODE (temporarily)
  1414.     DW    LOCK    ;SET 2ND PASSWORD TO REQUIRED
  1415.     DW    BOOT    ;RE- BOOT THE SYSTEM
  1416. CMDTBL1: EQU    $+OFFSET
  1417.     DW    TYPE1    ;TYPE..In case MLIST.COM renamed
  1418.             ;to 'TYPE.COM'. Put the transient
  1419.             ;in USER 14 on drive A.
  1420.     DW    USER    ;USER
  1421.     DW    CKPASS0    ;PASS(word) to gain access to
  1422.             ;private user areas.
  1423.     DW    DIR1    ;DIR....If you wish to use SD or
  1424.             ;KDIR as a CCP transient instead of
  1425.             ;the CCP DIR code, just change the
  1426.             ;name of your transient to DIR.COM
  1427.             ;and put it in USER 14 on drive A.
  1428.             ;The transient will run only if 1rst
  1429.             ;password level has been achieved.
  1430.             ;If transient not present then CCP
  1431.             ;'DIR' code will run.
  1432.     DW    ANSWR    ;ANSWR routine
  1433.     DW    ORIG    ;ORIGinate routine
  1434. ;These commands will be the only ones allowed until the user
  1435. ;logs in to the system with LOGIN.
  1436. CMDTBL0: EQU    $+OFFSET
  1437.     DW    DIR    ;WILL RUN THE CCP 'DIR' CODE
  1438.     DW    PASSINT    ;LOGIN
  1439.     DW    OFF    ;
  1440.     DW    BYE    ;BYE
  1441.     DW    BYE    ;QUIT
  1442. GETRAN0: EQU    $+OFFSET ;This must be last entry in table.
  1443.     DW    GETRANS    ;GET THE TRANSIENT AND EXECUTE OR
  1444.             ;RETURN TO CCP W/HUH MESSAGE IF NOT
  1445.             ;ON DISK.
  1446. ;
  1447. ;**********************************************************
  1448. ;Routines to reset parameters for string matching and other
  1449. ;purposes.
  1450. ;
  1451. RSTPRMS: EQU    $+OFFSET
  1452.     MVI    A,LENCMD
  1453.     STA    CMDLEN
  1454.     LXI    H,PASBYTE
  1455. DW    BIT5M
  1456. DB    JRNZ,    RST0-$+FR
  1457. DW    BIT2M
  1458. DB    JRNZ,    RST1-$+FR
  1459.     ;
  1460. RST2:    EQU    $+OFFSET
  1461.     LXI    H,CMDSTR2
  1462.     SHLD    STRPTR
  1463.     MVI    A,(GETRAN0-CMDTBL2)/2
  1464.     STA    CMDCNT
  1465.     LXI    H,CMDTBL2
  1466.     SHLD    CMDPTR
  1467.     MVI    A,16
  1468.     STA    TSTUSR
  1469.     RET
  1470.     ;
  1471. RST1:    EQU    $+OFFSET
  1472.     LXI    H,CMDSTR1
  1473.     SHLD    STRPTR
  1474.     MVI    A,(GETRAN0-CMDTBL1)/2
  1475.     STA    CMDCNT
  1476.     LXI    H,CMDTBL1
  1477.     SHLD    CMDPTR
  1478.     MVI    A,MAXUSER+1
  1479.     STA    TSTUSR
  1480.     RET
  1481.     ;
  1482. RST0:    EQU    $+OFFSET
  1483.     MVI    A,(GETRAN0-CMDTBL0)/2
  1484.     STA    CMDCNT
  1485.     LXI    H,CMDSTR0
  1486.     SHLD    STRPTR
  1487.     LXI    H,CMDTBL0
  1488.     SHLD    CMDPTR
  1489.     MVI    A,1
  1490.     STA    TSTUSR
  1491.     RET
  1492. ;
  1493. ;**********************************************************
  1494. ;This routine will make USER 13, 14, and/or 15 universal on
  1495. ;drive A only depending on password level. Files placed in
  1496. ;user 13 will be universal without any password. Files placed
  1497. ;in user 14 will additionally be universal on drive A at the
  1498. ;first password level, and files placed in user 15 will be
  1499. ;universal at the second password level in addition to those
  1500. ;in users 13 and 14.
  1501. ;    ***** WARNING *****
  1502. ;NEVER have two files by the same name & extension on the
  1503. ;same disk (one in USER 15 and the other in some other
  1504. ;USER) because CP/M will take which ever one comes first
  1505. ;in the directory.
  1506. ;
  1507. UNIV:    EQU    $+OFFSET
  1508.     MOV    A,B        ;duplicate instruction overlayed
  1509.     ORA    A        ;check pointer for zero byte
  1510. DB    JRNZ,    UNIV1-$+FR    ;skip if not zero byte of fcb
  1511.     ;
  1512.     LDA    CURDSK        ;get current disk
  1513.     ANI    0FH        ;mask out high nibble
  1514.     CPI    0        ;is it drive A? (may be changed
  1515.                 ;to any drive. 0,1,2.. = A,B,C..)
  1516. DB    JRNZ,    UNIV1-$+FR    ;skip if not
  1517.     ;
  1518.     LDAX    D        ;get fcb first byte
  1519.     CPI    0E5H        ;check for erased
  1520. DB    JRZ,    UNIV1-$+FR    ;skip if erased
  1521.     ;
  1522.     LDA    PASBYTE
  1523. DW    BIT5A
  1524. DB    JRNZ,    DFU13-$+FR
  1525. DW    BIT2A
  1526. DB    JRNZ,    DFU14-$+FR
  1527.     ;
  1528.     MOV    A,M
  1529.     CPI    15        ;and check for user 15
  1530. DB    JRZ,    MATCH0-$+FR    ;jump if zero
  1531.     ;
  1532. DFU14:    EQU    $+OFFSET
  1533.     MOV    A,M
  1534.     CPI    14        ;check for user 14
  1535. DB    JRZ,    MATCH0-$+FR
  1536.     ;
  1537. DFU13:    EQU    $+OFFSET
  1538.     MOV    A,M
  1539.     CPI    13        ;check for user 13
  1540. MATCH0:    EQU    $+OFFSET
  1541.     JZ    MATCH
  1542.     ;
  1543. UNIV1:    EQU    $+OFFSET
  1544.     MOV    A,B        ;duplicate instuction overlayed
  1545.     CPI    0DH        ;    "    "    "
  1546.     JMP    TINUSRCH    ;and return where routine left off
  1547.     ;
  1548. ;**********************************************************
  1549. ;This is the in-line print subroutine.
  1550. ;
  1551. ILPRT:    EQU    $+OFFSET
  1552. DB    EXX    
  1553.     CALL    CRLF
  1554. DB    EXX
  1555. ILPRT2:    EQU    $+OFFSET
  1556.     XTHL        ;SAVE HL, GET MSG
  1557.     ;
  1558. ILPLP:    EQU    $+OFFSET
  1559.     MOV    C,M    ;GET CHAR
  1560.     CALL    CONOUT    ;OUTPUT IT
  1561.     INX    H    ;POINT TO NEXT
  1562.     MOV    A,M    ;TEST
  1563.     ORA    A    ;..FOR END
  1564. DB    JRNZ,    ILPLP-$+BR
  1565.     XTHL        ;RESTORE HL, RET ADDR
  1566.     RET        ;RET PAST MSG
  1567. ;
  1568. ;***********************************************************
  1569. ;ROUTINE TO TEST LOG IN
  1570. ;
  1571. LOGTST:    EQU    $+OFFSET
  1572.     LXI    H,PASBYTE
  1573. DW    BIT5M
  1574.     RET
  1575. ;
  1576. ;**********************************************************
  1577. ;ROUTINE TO CHECK FOR CARRIER LOST
  1578. ;
  1579. CHECK:    EQU    $+OFFSET
  1580.     CALL    CARCK    ;SEE IF CARRIER STILL ON
  1581.     RNC        ;ALL OK
  1582.     ;
  1583. ;CARRIER IS LOST
  1584.     LXI    SP,STACK
  1585.     JMP    HANGUP
  1586. ;
  1587. ;**********************************************************
  1588. ;This routine, which is exercised by the H89 command, sets
  1589. ;H89 mode to on. Each return to the CCP prompt will set the
  1590. ;H89 flag to zero and disable the clock interrupt if the
  1591. ;H89 flag indicates that the mode is on.  Invoke H89 games
  1592. ;by entering: H89 and then when the prompt 'Game: ' appears
  1593. ;enter the name of the game to run it.
  1594. ;
  1595. H89:    EQU    $+OFFSET
  1596.     LDA    MDMBYT
  1597.     ORA    A
  1598.     JZ    HUH
  1599.     MVI    A,0FFH
  1600.     STA    H89FLG
  1601.     CALL    ARMCLK
  1602.     CALL    ILPRT
  1603.     DB    'Game: ',0    
  1604.     JMP    GETCMD-3
  1605.     ;
  1606. COUNTER: EQU    $+OFFSET
  1607.     DW    INTCNTR    ;INITIAL VALUE
  1608. ;
  1609. ;**********************************************************
  1610. ;Routine to reboot the system. Can be invoked only by local
  1611. ;terminal and only at highest password level.
  1612. ;
  1613. BOOT:    EQU    $+OFFSET
  1614.     LDA    MDMBYT
  1615.     ORA    A
  1616.     JZ    HUH
  1617.     LHLD    PROMLOC-1
  1618.     MVI    L,0
  1619.     PCHL
  1620. ;
  1621. ;**********************************************************
  1622. ;This is a background memory test that runs whenever the
  1623. ;current console (including remote) is waiting for an input
  1624. ;character to be typed.
  1625. ;
  1626. ;TEST ROUTINE TO CONSTANTLY TEST MEMORY
  1627. ;
  1628. TEST:    EQU    $+OFFSET
  1629.     DI
  1630.     PUSH    H
  1631.     LHLD    TSTPT
  1632.     INX    H
  1633.     MOV    A,H
  1634.     CPI    ($+OFFSET)/100H
  1635. DB    JRNZ,    TEST1-$+FR
  1636.     LXI    H,0
  1637. ;
  1638. TEST1:    EQU    $+OFFSET
  1639.     SHLD    TSTPT
  1640.     MOV    A,M
  1641.     CMA
  1642.     MOV    M,A
  1643.     CMP    M
  1644. DB    JRZ,    TEST2-$+FR
  1645.     XRA    M
  1646.     PUSH    PSW
  1647.     PUSH    H
  1648.     CALL    CRLF
  1649.     POP    H
  1650.     POP    PSW
  1651.     PUSH    PSW
  1652.     CALL    PRTHX
  1653.     CALL    ILPRT2
  1654.     DB    'H Bits bad: ',0
  1655.     MOV    A,H
  1656.     CALL    PRTHX
  1657.     MOV    A,L
  1658.     CALL    PRTHX
  1659.     POP    PSW
  1660. ;
  1661. TEST2:    EQU    $+OFFSET
  1662.     CMA
  1663.     MOV    M,A
  1664.     POP    H
  1665.     EI
  1666.     RET
  1667.     ENDIF
  1668. ;
  1669. ;END OF CONSTANT MEMORY TEST
  1670. ;**********************************************************
  1671. ;
  1672. ;        USER DEFINED I/O DEVICE DRIVERS
  1673. ;
  1674. ;**********************************************************
  1675. ;
  1676. UC1ST:    EQU    $+OFFSET    ;USER CONSOLE 1 STATUS
  1677. UL1ST:    EQU    $+OFFSET    ;USER LIST DEVICE STATUS
  1678.     MVI    A,0FFH        ;ALWAYS READY
  1679.     RET
  1680. ;
  1681. UC1OUT:    EQU    $+OFFSET    ;USER CONSOLE 1 IN (NULL)    
  1682. UP1OUT:    EQU    $+OFFSET    ;USER PUNCH ONE OUT (NULL)
  1683. UP2OUT:    EQU    $+OFFSET    ;USER PUNCH TWO OUTPUT "
  1684. UL1OUT:    EQU    $+OFFSET    ;USER LIST OUTPUT (NULL)
  1685.     MOV    A,C        ;CHARACTER INTO A
  1686.     RET
  1687. ;
  1688. UC1IN:    EQU    $+OFFSET    ;USER CONSOLE 1 IN (NULL)
  1689. UR1IN:    EQU    $+OFFSET    ;USER READER ONE INPUT
  1690. UR2IN:    EQU    $+OFFSET    ;USER READER TWO INPUT
  1691.     MVI    A,EOF        ;END OF FILE FOR NOW
  1692.     RET
  1693. ;
  1694. USR2END: EQU    $+OFFSET    ;END OF USER2 CODE FOR NOW
  1695. INITSIZE EQU    INITSIZE    ;
  1696. USR2SIZE EQU    USR2END-USER2    ;DO NOT EXCEED SPACE ALLOCAT-
  1697.                 ;ED ABOVE YOUR RUNNING CP/M. 
  1698.                 ;WHEN MAKING A 2KB USER2 AREA,
  1699.                 ;THE SPACE OCCUPIED BY INIT-
  1700.                 ;SIZE WILL BE AVAILABLE AS
  1701.                 ;SCRATCH AREA ABOVE USER2 AND
  1702.                 ;REDUCES THE CODE THAT IS ACT-
  1703.                 ;UAL USER2 CODE BY THAT AMOUNT.
  1704.                 ;GOOD PLACE TO PUT YOUR STACK.
  1705. ;
  1706. ;**********************************************************
  1707. ;    EQUATES FOR CCP PATCHES
  1708. LENCMD    EQU    5        ;LENGTH OF CCP CMD STRINGS
  1709. BUFSIZE    EQU    CCP+6H        ;LOC. OF CMD BUF SIZE BYTE
  1710. GETUSR    EQU    CCP+113H    ;GET USER #
  1711. SETUSR    EQU    CCP+115H    ;SET USER #
  1712. TSTUSR    EQU    CCP+692H    ;TEST USER #
  1713. USRSAV    EQU    CCP+118H
  1714. CCPPASS    EQU    CCP+7CH        ;LOCATION OF CCP PASSWORD
  1715. UPATCH0    EQU    CCP+390H
  1716. UPATCH1    EQU    CCP+393H
  1717. HUH    EQU    CCP+209H    ;CCP HUH RESPONSE
  1718. CRLF    EQU    CCP+98H        ;CCP CR/LF FUNCTION
  1719. RCCPNL    EQU    CCP+789H    ;RSTRT CCP W/O LOG OF DFLT DRV
  1720. RETCCP  EQU    CCP+382H    ;RE-ENTRY TO CCP
  1721. GETCMD0    EQU    CCP+37BH    ;CK IF CMD ENTERED AND GET IT
  1722. GETCMD    EQU    CCP+398H    ;GET THE ENTERED COMMAND
  1723. SRCHCMD    EQU    CCP+3B1H    ;ENTRY TO SEARCH OF COMMANDS
  1724. BUFPTR    EQU    CCP+88H        ;LOC OF CMD BUFFER POINTER
  1725. CMDPTR    EQU    CCP+3B5H    ;LOC OF CMD ADDR TBL PTR
  1726. GETRPTR    EQU    CCP+3AFH    ;LOC OF GET TRANS PTR
  1727. STRPTR    EQU    CCP+32FH    ;POINTER TO CCP CMD STRINGS
  1728. CMDCNT    EQU    CCP+335H    ;BYTE VALUE = # OF COMMANDS
  1729. CMDLEN    EQU    CCP+33BH    ;BYTE VALUE = LENGTH OF EACH
  1730.                 ;COMMAND STRING.
  1731. TSTOPN    EQU    CCP+6DCH    ;TEST FILE OPEN FUNCTION
  1732. CMDDRV    EQU    CCP+7F0H    ;BYTE INDICATES DRV IN CMD
  1733. CMDERR    EQU    CCP+76BH    ;HUH RESPONSE IF DR #
  1734. FCBFN    EQU    CCP+7CEH    ;LOC FOR FN IN FCB
  1735. XTNSN    EQU    CCP+7D6H    ;STORAGE LOC FOR FILE TYPE,
  1736.                 ;EXT #, AND RECORD COUNT
  1737. RELOOK    EQU    CCP+6CDH    ;RELOOK W/INDICATED DRIVE
  1738. TPASUB    EQU    CCP+75DH    ;LOC TO SUSTITUTE BEFORE
  1739.                   ;CALLING THE TPA
  1740. CONTINUE EQU    CCP+75FH    ;CONTINUE AFTER CALL TO TPA
  1741. GETRANS    EQU    CCP+6A8H    ;GET TRANS OR CCP COMMAND
  1742. ERA    EQU    CCP+51FH    ;ADDR OF ERA ROUTINE
  1743. REN    EQU    CCP+610H    ;ADDR OF REN ROUTINE
  1744. SAVE    EQU    CCP+5ADH    ;ADDR OF SAVE ROUTINE
  1745. DIR    EQU    CCP+477H    ;ADDR OF DIR ROUTINE
  1746. TYPE    EQU    CCP+55DH    ;ADDR OF TYPE ROUTINE
  1747. USER    EQU    CCP+68EH    ;ADDR OF USER ROUTINE
  1748. TPA    EQU    100H        ;OR YOUR TPA ADDRESS
  1749. STKPTR1    EQU    CCP+35DH
  1750. STKPTR2    EQU    CCP+760H
  1751. STKPTR3    EQU    CCP+383H
  1752. PRNSTR1    EQU    CCP+0A7H    ;PRINT STRING WITH LEADING
  1753.                 ;CR/LF..POINT TO IT WITH BC
  1754. PRNSTR2    EQU    CCP+0ACH    ;PRINT STRING..POINT WITH HL
  1755. WRFCB    EQU    CCP+3F8H    ;RTNE IN CCP TO WRITE FCB
  1756. CCPSPARE EQU    CCP+7F2H    ;14 SPARE BYTES AT END CCP
  1757. BDOSPARE EQU    BDOS+0DEEH    ;18 SPARE BYTES AT END BDOS
  1758.     ;Addresses of holes left in CCP that are filled in
  1759.     ;with patches.
  1760. HOLE1    EQU    CCP+310H    ;30 BYTES
  1761. HOLE2    EQU    CCP+3C1H    ;24 BYTES
  1762. HOLE3    EQU    CCP+79BH    ;16 BYTES
  1763. HOLE4    EQU    CCP+1F5H    ;20 BYTES
  1764. HOLE5    EQU    CCP+6A5H    ;3 BYTES    
  1765. ;
  1766.     IF    (S201 OR S22 OR S22X)
  1767. ;**********************************************************
  1768. ;    CCP patches
  1769. ;**********************************************************
  1770. ;Patch the turnkey start string into the CCP command buffer.
  1771.     ORG    COMBUF
  1772. TNKY:    DB    08,'OFF HELP',0            
  1773. ;
  1774.     ORG    GETRPTR
  1775.     DW    GETRANS
  1776. ;**********************************************************
  1777. ;These two patches allow changing the user area on the
  1778. ;command line after X: where X is drive letter.
  1779. ;
  1780.     ORG    CCP+6C2H
  1781.     DW    USER
  1782.     ORG    CCP+69DH
  1783.     DW    RCCPNL
  1784. ;
  1785. ;**********************************************************
  1786. ;To trap the HUH message.
  1787. ;
  1788.     ORG    HUH
  1789.     JMP    HUH0
  1790. ;
  1791. ;**********************************************************
  1792. ;To redirect the CCP stack so a larger stack is available.
  1793. ;
  1794.     ORG    STKPTR1
  1795.     DW    STACK
  1796.     ORG    STKPTR2
  1797.     DW    STACK
  1798.     ORG    STKPTR3
  1799.     DW    STACK
  1800. ;
  1801. ;**********************************************************
  1802. ; This patch is used to restrict access to the higher user
  1803. ; areas while leaving the lower user areas public. The high-
  1804. ; est available public user area is defined by MAXUSER.
  1805. ;
  1806.     ORG    USRSAV
  1807.     DW    SAVUSR
  1808.     ;
  1809.     ORG    HOLE2
  1810. SAVUSR:    MOV    A,E
  1811.     CPI    0FFH
  1812.     JZ    BDOSFNC
  1813.     RLC
  1814.     RLC
  1815.     RLC
  1816.     RLC
  1817.     MOV    B,A
  1818.     LDA    DRIVE
  1819.     ANI    0FH
  1820.     ORA    B
  1821.     STA    DRIVE
  1822.     JMP    BDOSFNC
  1823. ;
  1824.     DB    0    ;SPARE
  1825.             ;DO NOT EXPAND
  1826.             ;24 BYTES AVAILABLE AT HOLE2
  1827. ;
  1828.     ORG    HOLE3
  1829. OK2:    LXI    H,PASBYTE
  1830. DW    RES2M
  1831.     ;
  1832. OK1:    LXI    H,PASBYTE
  1833. DW    RES5M
  1834.     JMP    OK
  1835. ;
  1836. TRAPBYT:
  1837.     DB    0
  1838.     DB    0,0    ;SPARES
  1839.             ;DO NOT EXPAND
  1840.             ;16 BYTES AT HOLE3
  1841. ;
  1842. ;**********************************************************
  1843. ; This patch causes user number to be reported at the cp/m
  1844. ; prompt.....i.e. - A2>.  User 0 report is suppressed.
  1845. ;
  1846.     ORG    UPATCH0
  1847.     MVI    C,USRFNC
  1848.     ORG    UPATCH1
  1849.     DW    UPATCH
  1850.     ;the routine UPATCH is located in the USER1 area
  1851. ;**********************************************************
  1852. ; This patch causes the CCP of a cp/m 2.x system to look on
  1853. ; drive A when you are logged into a drive other than A and
  1854. ; call for a .COM file that does not exist on that drive.
  1855. ; Giving an explicit drive reference overrides this feature,
  1856. ; so that you can always force the file to be loaded from a
  1857. ; specific drive.
  1858. ;
  1859.     ORG    TSTOPN
  1860.     DW    APATCH        ;REPLACES 'CMDERR'
  1861. ;
  1862.     ORG    CCPSPARE
  1863. APATCH:    LXI    H,CMDDRV    ;GET DRIVE FROM CURRENT CMD.
  1864.     ORA    M        ;FETCHES DRIVE
  1865.     JNZ    CMDERR        ;GIVE ERR IF CMD HAS DRIVE #
  1866.     INR    M        ;FORCE TO DRIVE A
  1867.     LXI    D,XTNSN        ;UNDO WHEN...
  1868.     JMP    RELOOK        ;REENTERING CCP
  1869. ;
  1870. ;**********************************************************
  1871. ;This patch extends the CCP to include up to N additional
  1872. ;commands that are user defined. The commands may be either
  1873. ;CCP-included or transient, and may be either private or
  1874. ;public depending on password privilege.
  1875. ;
  1876.     ORG    CMDPTR
  1877. CMDPTR:    DW    CMDTBL0
  1878.     ;
  1879.     ORG    STRPTR
  1880. STRPTR:    DW    CMDSTR0        
  1881.     ;
  1882.     ORG    CMDCNT
  1883. CMDCNT:    DB    (GETRAN0-CMDTBL0)/2
  1884.              ;TO LIMIT PUBLIC ACCESS TO CCP
  1885.              ;COMMANDS. RESET TO ALL WHEN 
  1886.              ;PASSWORD IS ENTERED FOR USER
  1887.              ;AREAS ABOVE MAXUSER.
  1888.     ORG    CMDLEN
  1889. CMDLEN:    DB    LENCMD     ;LENGTH OF CCP COMMAND STRINGS
  1890. ;
  1891. ;The rest of this patch is in USER1 and 2 code areas.
  1892. ;
  1893. ;**********************************************************
  1894. ;
  1895.     ORG    HOLE1
  1896. RELOG0:    CALL    CRLF
  1897. RELOG:    CALL    LOGTST
  1898. DB    JRZ,    EXIT-$-1
  1899.     CALL    ILPRT2
  1900. DB    'Login please',0
  1901. EXIT:    JMP    RETCCP
  1902.     ;
  1903.     DB    0,0,0    ;SPARES
  1904.             ;DO NOT EXPAND
  1905.             ;30 BYTES AVAILABLE AT HOLE1
  1906. ;
  1907. ;**********************************************************
  1908. ;
  1909. BDOSPARE EQU    BDOS+0DEEH    ;18 SPARE BYTES AT END BDOS
  1910. MATCH    EQU    BDOS+077CH
  1911. CURDSK    EQU    BDOS+342H
  1912. TINUSRCH EQU    BDOS+761H
  1913. ;
  1914.     ORG    BDOS+75EH
  1915.     JMP    UNIV
  1916. ;
  1917.     ORG    BDOSPARE
  1918. ;These routines are part of the 'BYE' command stuffed here
  1919. ;for convenience.
  1920. ;
  1921. PASTBL1:
  1922.     DW    OK1
  1923.     DW    CKAGIN
  1924. PASTBL2:
  1925.     DW    OK2
  1926.     DW    CKAGIN
  1927.     DB    0    ;SPARE
  1928. ;
  1929. ;SET THE MODEM BYTE TO CAUSE SCAN OF MODEM AND CONSOLE
  1930. SETMDM:    XRA    A
  1931. DB    JR,    MDMRST-$-1    
  1932.     ;
  1933. ;RESET THE MODEM BYTE SO ONLY CONSOLE IS LOOKED AT
  1934. RSTMDM:    MVI    A,0FFH
  1935. MDMRST:    STA    MDMBYT
  1936.     RET        ;18 bytes here
  1937. ;
  1938.     ORG    HOLE5
  1939.     DB    0,0,0    ;SPARES -- 3 BYTES AVAIL AT HOLE5
  1940.     ENDIF
  1941. ;
  1942. ;**********************************************************
  1943. ;BIOS patches.  This jump table overlays the table at the 
  1944. ;base of the BIOS thus making it unecessary to have all of 
  1945. ;the jumps in the jump table at the base of the USER1 area.
  1946.     ;
  1947.     ORG    BIOS+06H
  1948.     JMP    CONST
  1949.     JMP    CONIN
  1950.     DS    3
  1951.     JMP    LIST
  1952.     JMP    PUNCH
  1953.     JMP    READER
  1954.     ;
  1955.     ORG    BIOS+2DH
  1956.     JMP    LISTST
  1957.     ;
  1958.     IF    NOT S201    
  1959.     ORG    BIOS+36H
  1960.     ENDIF
  1961.     IF    SCRCLR AND NOT S201
  1962.     DB    ESC,SCRN    ;SEQUENCE TO CLEAR SCREEN
  1963.     ENDIF
  1964.     ;    
  1965.     IF    (S22 OR S22X) 
  1966. SIGNON:
  1967. DB    CR,LF,'RLP RCPM McLean, Va.      ',CR,LF
  1968. ;             ^                         ^ DO NOT EXPAND
  1969.     ENDIF
  1970.     IF    S22X
  1971.     DB    'CP/M 2.2x ' 
  1972. ;        ^          ^             "
  1973.     ENDIF
  1974.     IF    S22
  1975.     DB    'CP/M 2.2  '
  1976. ;        ^       ^             "
  1977.     ENDIF
  1978.     IF    (S22 OR S22X)
  1979.     DB    MSIZE/10+30H
  1980.     DB    MSIZE MOD 10 + 30H
  1981.     DB    'K system',CR,LF,0,'$'
  1982. ;        ^        ^             "
  1983.     ENDIF
  1984.     ;
  1985.     IF    S201
  1986.     ORG    BIOS+36H
  1987.     ENDIF
  1988. ;
  1989. TSTPT:    DW    0
  1990. ;
  1991.     IF    S201
  1992.     ORG    BIOS+0D8H
  1993.     DW    BDOS+0DB6H
  1994.     ENDIF    
  1995.     ORG    BDOS+0DB6H
  1996.     IF    S201 AND SCRCLR
  1997.     DB    ESC,SCRN
  1998.     ENDIF
  1999.     ;
  2000.     IF    S201
  2001. SIGNON:
  2002. DB    CR,LF,'RLP RCPM McLean, Va.      ',CR,LF
  2003. ;          ^                 ^ ;DO NOT EXPAND
  2004.     DB    'CP/M 2.01 '
  2005. ;        ^       ^    ;DO NOT EXPAND
  2006.     DB    MSIZE/10+30H
  2007.     DB    MSIZE MOD 10 + 30H
  2008.     DB    'K system',CR,LF,0,'$'
  2009. ;        ^     ^    ;DO NOT EXPAND        
  2010.     ENDIF
  2011. ;
  2012. ;************************************************************
  2013. ;
  2014. ;        SPECIAL ASCII CODES
  2015. ;
  2016. LF    EQU    0AH    ; LINE FEED
  2017. CR    EQU    0DH    ; CARRIAGE RETURN
  2018. EOF    EQU    1AH    ; END OF FILE
  2019. BELL    EQU    07H    ; DING
  2020. NULL    EQU    00H    ; NOTHING
  2021. ESC    EQU    1BH    ; ESCAPE - USED IN TWO CHAR COMMANDS
  2022. ;the following are specific to an H19 terminal.-put yours here
  2023. LIN    EQU    6CH    ; CHAR AFTER ESCAPE TO CLEAR LINE
  2024. SCRN    EQU    45H    ; CHAR AFTER ESCAPE TO CLEAR SCREEN
  2025. EXGRAPH    EQU    47H    ; CHAR AFTER ESCAPE TO EXIT GRAPHICS
  2026. UPCRSR    EQU    41H    ; CHAR AFTER ESCAPE TO DO UP-CURSOR
  2027. ;
  2028. ;        STATUS MASKS
  2029. ;
  2030. INRDY    EQU    02H    ;INPUT READY MASK
  2031. OUTRDY    EQU    01H    ;OUTPUT READY MASK
  2032. ;
  2033. ;    POSITION OF BIT PAIR IN IOBYTE
  2034. ;
  2035. CONCNT    EQU    1    ;CONSOLE BITS 0,1
  2036. RDRCNT    EQU    2    ;READER  BITS 2,3
  2037. PCHCNT    EQU    3    ;PUNCH   BITS 4,5
  2038. LSTCNT    EQU    4    ;LIST    BITS 6,7
  2039. ;
  2040. ;**********************************************************
  2041. ;
  2042. ;        Z80 EQUATES
  2043. ;
  2044. JR    EQU    18H    ;JUMP RELATIVE
  2045. JRZ    EQU    28H    ;JUMP RELATIVE ON ZERO
  2046. JRNZ    EQU    20H    ;JUMP RELATIVE ON NOT ZERO
  2047. JRC    EQU    38H    ;JUMP RELATIVE ON CARRY
  2048. JRNC    EQU    30H    ;JUMP RELATIVE IF CARRY RESET
  2049. DJNZ    EQU    10H    ;DECR B AND JMP REL IF B NOT=0
  2050. LDIY    EQU    21FDH    ;LD 16 BIT VAL TO IY REG
  2051. CPIY    EQU    0BEFDH    ;CMP MEM WITH LOC IN IY+DISPL
  2052. INCIY    EQU    23FDH    ;INCREMENT IY
  2053. LDIR    EQU    0B0EDH    ;MEMORY BLOCK MOVE
  2054. LDDR    EQU    0B8EDH    ;MOVE BLOCK UNTIL COUNTER=0
  2055. MOVIVA    EQU    47EDH    ;MOVE ACC TO INTERRUPT REGISTER
  2056. IM2    EQU    5EEDH    ;SET INTERRUPT MODE 2
  2057. BIT0A    EQU    47CBH    ;TEST BIT 0 IN ACC.
  2058. BIT2A    EQU    57CBH    ;TEST BIT 2 IN ACC
  2059. BIT3A    EQU    5FCBH    ;TEST BIT 3 IN ACC.
  2060. BIT4A    EQU    67CBH    ;TEST BIT 4 IN ACC.
  2061. BIT5A    EQU    6FCBH    ;TEST BIT 5 IN ACC.
  2062. BIT0M    EQU    46CBH    ;TEST BIT 0 IN MEM
  2063. BIT1M    EQU    4ECBH    ;TEST BIT 1 IN MEM
  2064. BIT2M    EQU    56CBH    ;TEST BIT 2 IN MEM
  2065. BIT5M    EQU    6ECBH    ;TEST BIT 5 IN MEM
  2066. SET0M    EQU    0C6CBH    ;SET BIT 0 IN MEM
  2067. SET1M    EQU    0CECBH    ;SET BIT 1 IN MEM
  2068. SET2M    EQU    0D6CBH    ;SET BIT 2 IN MEM
  2069. SET4M    EQU    0E6CBH    ;SET BIT 4 IN MEM
  2070. SET5M    EQU    0EECBH    ;SET BIT 5 IN MEM
  2071. SET7A    EQU    0FFCBH    ;SET BIT 7 IN MEM
  2072. RES0M    EQU    86CBH    ;RESET BIT 0 IN MEM
  2073. RES1M    EQU    8ECBH    ;RESET BIT 1 IN MEM
  2074. RES2M    EQU    96CBH    ;RESET BIT 2 IN MEM
  2075. RES5M    EQU    0AECBH    ;RESET BIT 5 IN MEM
  2076. MOVDM    EQU    53EDH    ;MOVE BC TO MEM, DIRECT ADDR
  2077. EXX    EQU    0D9H    ;EXCH REG PAIRS B, D, & H
  2078. EXAF    EQU    08H    ;EXCH AF PAIRS
  2079. ;
  2080. ;**********************************************************
  2081. ;
  2082. ;    PMMI    MODEM PORT ASSIGNMENTS
  2083. ;
  2084. TPORT    EQU    MODEM    ;UART    CONTROL/STATUS PORT
  2085. DPORT    EQU    TPORT+1    ;DATA PORT
  2086. RPORT    EQU    TPORT+2    ;RATE GEN/MODEM STATUS
  2087. CPORT    EQU    TPORT+3    ;MODEM CONTROL PORT
  2088. ;
  2089. ;**********************************************************
  2090. ;
  2091. ; MODEM CONTROL COMMAND WORDS
  2092. P3CLEAR    EQU    3FH    ;IDLE MODE
  2093. OFFPWR    EQU    80H    ;TO TURN POWER OFF THRU PMMI
  2094.             ;AUXILIARY INTERFACE
  2095. ;
  2096. ; SET FOLLOWING TO 5FH FOR >300 BAUD
  2097. ;
  2098. P3TODTR    EQU    7FH    ;TURN ON DTR
  2099. ;
  2100. ;**********************************************************
  2101. ;
  2102. ; SWITCH HOOK AND MODEM COMMANDS..OUT TO TPORT
  2103. ;
  2104. P0BYE    EQU    0    ;ON HOOK, OR DIALING BREAK
  2105. P0ORIG    EQU    1    ;OFF HOOK, ORIG
  2106. P0ANSW    EQU    2    ;ANSWER PHONE
  2107. P08BIT    EQU    0CH    ;8 DATA BITS
  2108. P0NOPY    EQU    10H    ;NO PARITY
  2109. P0EPS    EQU    20H    ;EVEN PARITY SELECT
  2110. P0TSB    EQU    40H    ;2 STOP BITS
  2111. P0EI    EQU    80H    ;ENABLE INTERRUPTS
  2112. P0NORM    EQU    P08BIT+P0NOPY ;8 BITS, NO PARITY
  2113. P0110    EQU    P08BIT+P0NOPY+P0TSB ;SAME W/2 STOP BITS
  2114. ;
  2115. ;**********************************************************
  2116. ;
  2117. ; MODEM STATUS, INPUT ON RPORT
  2118. ;
  2119. P2DTD    EQU    1    ;DIAL TONE DETECT
  2120. P2RDET    EQU    2    ;RING DETECT
  2121. P2CTS    EQU    4    ;CTS (CARRIER DETECT)
  2122. P2RXBRK    EQU    8    ;RECEIVE BREAK
  2123. P2CONN    EQU    10H    ;CONNECTED? (0=YES)
  2124.             ;1=MODEM HUNG UP THE PHONE LINE
  2125. P2TMPUL    EQU    80H    ;TIMER PULSES (40% UP CYCLE)
  2126. ;
  2127. ;**********************************************************
  2128. ;
  2129. ; PMMI MODEM STATUS MASKS
  2130. ;
  2131. P0TBMT    EQU    1    ;XMIT BUFFER EMPTY
  2132. P0DAV    EQU    2    ;DATA AVAILABLE
  2133. P0TEOC    EQU    4    ;TEST END OF CHAR.
  2134. P0RPE    EQU    8    ;REC'D PARITY ERROR
  2135. P0ORUN    EQU    10H    ;OVERRUN
  2136. P0FERR    EQU    20H    ;FRAMING ERROR
  2137.  
  2138. TRATE    EQU    250    ;VALUE FOR .1 SEC
  2139. ;
  2140. B300    EQU    52    ;DIVISOR FOR 300 BAUD
  2141. B110    EQU    142    ;   "        110
  2142. B220    EQU    71    ;   "        220
  2143. B450    EQU    35    ;   "        450
  2144. B520    EQU    30    ;   "         520
  2145. B600    EQU    26    ;   "        600
  2146. B710    EQU    22    ;   "        710
  2147. ;
  2148. ;
  2149. ;BDOS EQUATES
  2150. ;
  2151. BDOSFNC    EQU    BDOS+6H
  2152. USRFNC    EQU    32
  2153. ;
  2154.     END
  2155.