home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / nstar / genusr48.asm < prev    next >
Encoding:
Assembly Source File  |  1994-07-13  |  57.6 KB  |  2,471 lines

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