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 / RCPM / FASTGO11.AQM / FASTGO11.ASM
Assembly Source File  |  2000-06-30  |  15KB  |  632 lines

  1. ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  2. ;$ Program name: FASTGO vers. 1.1 $
  3. ;$ Program author: James Whorton  $
  4. ;$ Originally written: 04/25/84   $
  5. ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  6. ;
  7. ;FASTGO 1.1 : A PROGRAM DESIGNED TO MAKE IT EASIER
  8. ;TO MOVE TO A SPECIFIC, LABELED DRIVE/USER AREA.
  9. ;INTENDED MAINLY FOR HARD DISK SYSTEMS, BUT SHOULD
  10. ;WORK EQUALLY WELL ON ANY 2.2 SYSTEM. ALLOWS PASSWORD
  11. ;PROTECTING AND CHAINING TO ANOTHER PROGRAM AFTER
  12. ;ENTERING NEW USER-AREA. FOR USAGE, TYPE GOTO.
  13. ;
  14. ;***************************************************
  15. ;REVISIONS:
  16. ;
  17. ;05/06/84 VERS. 1.1:
  18. ;          ADDED RELOCATION OF CODE TO HIGHMEM SO
  19. ;          THAT A .COM FILE MAY BE LOADED AND RAN FROM
  20. ;          100H. ADDED DRIVE AND USER # DISPLAY TO
  21. ;          USAGE ROUTINE. (JHW)
  22. ;***************************************************
  23. ;
  24. ;WHEN EXECUTED, THIS PROGRAM DOES THE FOLLOWING:
  25. ;
  26. ;1. RELOCATES ITSELF TO HIGH MEM (SET BY USER).
  27. ;2. CHECKS FOR INPUT, PRINTS OPTIONS AND QUITS IF NONE.
  28. ;3. EVALUATES INPUT, SEEKING A MATCH FROM THE TABLE.
  29. ;4. IF NO MATCH FOUND, TELL USER, DISPLAY OPTIONS AND QUIT.
  30. ;5. ON MATCH, CHECK FOR PASSWORD STATUS AND GET IT IF NEEDED.
  31. ;6. IF PASSWORD DOESN'T MATCH, ABORT.
  32. ;7. SELECT SPECIFIED USER-AREA.
  33. ;8. IF RUNCOM = TRUE, LOAD AND RUN A .COM FILE.
  34. ;9. EXIT TO SYSTEM.
  35. ;
  36. ;NOTE: I'VE SEEN A UTILITY OF THIS TYPE ON OTHER
  37. ;SYSTEMS, BUT HAVE NEVER BEEN ABLE TO LOCATE THE
  38. ;SOURCE CODE. SO I WROTE THIS ONE. THIS CODE IS CRUDE,
  39. ;BUT IT DOES THE JOB. I'M PLANNING ON MOVING UP TO A
  40. ;HARD DISK SYSTEM IN THE FAIRLY NEAR FUTURE SO I'M
  41. ;GATHERING UTILITIES FOR IT. 
  42. ;
  43. ;RENAME THIS FILE TO GOTO.COM.
  44. ;  GOTO           DISPLAYS USAGE AND VALID USER-AREAS
  45. ;  GOTO USER-AREA MOVES TO USER-AREA. IF PASSWORDED,
  46. ;                 GETS SAME FROM USER BEFORE MOVING.
  47. ;
  48. ;JAMES H. WHORTON
  49. ;402-346-4206  DATA
  50. ;402-341-0770  VOICE
  51. ;
  52. ;---------------------------------------------------
  53. ;THIS IS THE RUNNING LOCATION OF THE MAIN CODE. PUT IT
  54. ;HIGH ENOUGH SO THAT THE .COM FILE YOU LOAD, IF ANY,
  55. ;WILL NOT OVERLAY IT.
  56. ;
  57. DEST    EQU    0A000H    ;RUNNING LOCATION
  58. ;.....
  59. ;EQUATES SECTION
  60. ;
  61. WARM    EQU    0    ;WARM START
  62. BDOS    EQU    5    ;BDOS CALL VECTOR
  63. CIN    EQU    1    ;CONSOLE IN
  64. COUT    EQU    2    ;CONSOLE CHAR. OUT
  65. DIO    EQU    6    ;DIRECT I/O CALL
  66. CSTAT    EQU    12    ;CONSOLE STATUS
  67. RSTDSK    EQU    13    ;RESET DISK SUBSYSTEM
  68. STDSK    EQU    14    ;SET DEFAULT DISK
  69. OPEN    EQU    15    ;OPEN FILE
  70. READ    EQU    20    ;READ SEQUENTIAL RECORD
  71. STDMA    EQU    26    ;SET DMA ADDRESS
  72. STUSR    EQU    32    ;GET/SET USER #
  73. FCB    EQU    05CH    ;FIRST FCB
  74. CR    EQU    13    ;CARRAIGE RETURN
  75. LF    EQU    10    ;LINE FEED
  76. BELL    EQU    7    ;CONSOLE BELL
  77. TRUE    EQU    0FFH
  78. FALSE    EQU    0
  79. DEFBYT    EQU    4    ;CURRENT DRIVE/USER BYTE
  80. ;
  81. ;...................................................
  82. ; USER SETTABLE OPTIONS
  83. ;
  84. WIDTH    EQU    3    ;# OF COLUMNS TO PRINT ACROSS
  85. RUNCOM    EQU    TRUE    ;SET TO TRUE IF CHAIN DESIRED
  86. COMDRV    EQU    'A'-40H    ;DRIVE COM FILE IS ON
  87. COMUSR    EQU    0    ;USER # COM FILE IS IN
  88. DIVID    EQU    '|'    ;DIVIDER CHARACTER FOR DISPLAY
  89. ;
  90. ;...................................................
  91. ;PROGRAM STARTS HERE
  92. ;
  93.     ORG    0100H
  94. ;
  95. ;THE FOLLOWING ROUTINE MOVES THE BODY OF THE
  96. ;PROGRAM UP TO SAFE MEMORY. THE TECHNIQUE OF THE
  97. ;$+OFFSET LABELS AND THE LOAD .COM FILE CODE ARE
  98. ;ASLO FROM BYE.
  99. ;
  100. MOVEUP:    LXI    B,PEND-START+1    ;NUMBER OF BYTES TO MOVE
  101.     LXI    H,DEST+PEND-START+1 ;END OF MOVED CODE
  102.     LXI    D,SOURCE+PEND-START ;END OF SOURCE CODE
  103. ;
  104. MOVLOP:    LDAX    D    ;GET BYTE
  105.     DCX    H    ;BUMP POINTERS
  106.     MOV    M,A    ;NEW HOME
  107.     DCX    D
  108.     DCX    B    ;BUMP BYTE COUNT
  109.     MOV    A,B    ;CHECK IF ZERO
  110.     ORA    C
  111.     JNZ    MOVLOP    ;IF NOT, DO SOME MORE
  112. ;
  113.     PUSH    H    ;SAVE RETURN ADDRESS
  114.     RET        ;RETURN TO NEW ADDRESS
  115. ;
  116. SOURCE    EQU    $    ;BOUNDARY MEMORY MARKER
  117. ;
  118. OFFSET    EQU    DEST-SOURCE ;RELOCATION AMOUNT
  119. ;
  120. ;THE FOLLOWING CODE IS THE MAIN BODY OF THE PROGRAM.
  121. ;IT IS FIRST MOVED TO DEST, THEN EXECUTED. FROM THIS
  122. ;POINT ON, ALL LABELS MUST BE IN THIS FORMAT:
  123. ;     LABEL    EQU    $+OFFSET
  124. ;SO THAT THE RELOCATION WILL WORK PROPERLY.
  125. ;
  126. START    EQU    $+OFFSET
  127. ;
  128. ;===================================================
  129. ;
  130. ;CHECK IF USER-AREA SPECIFIED.
  131. ;
  132.     LDA    FCB+1    ;GET FIRST BYTE OF FCB
  133.     CPI    32    ;BLANK?
  134.     JZ    USAGE    ;YES, PRINT USAGE AND QUIT
  135. ;
  136. ;OK, A USER-AREA WAS SPECIFIED. LET'S SEE HOW LONG
  137. ;IT IS
  138.     MVI    B,0    ;SET UP COUNTER
  139.     LXI    H,FCB+1    ;SET UP POINTER
  140. LENCHK    EQU    $+OFFSET
  141.     MOV    A,M    ;GET A BYTE
  142.     INX    H    ;INCREMENT POINTER
  143.     INR    B    ;INCREMENT COUNTER
  144.     CPI    32    ;IS IT A BLANK?
  145.     JNZ    LENCHK    ;NO, GO AGAIN
  146.     MOV    A,B
  147.     STA    USRLEN    ;STORE COUNT FOR LATER USE
  148. ;
  149. ;NOW LET'S START CHECKING THE NAME SPECIFIED AGAINST
  150. ;THE TABLE
  151.     LXI    H,TABLE+2;SET UP POINTER
  152.     SHLD    CHARP    ;SAVE POINTER
  153. NAMCHK    EQU    $+OFFSET
  154.     LHLD    CHARP    ;GET TABLE POINTER
  155.     MOV    A,M    ;CHECK FOR END OF TABLE
  156.     CPI    0    ;ARE WE THERE?
  157.     JZ    NOMATCH    ;YES, ERROR MESSAGE AND USAGE
  158.     LXI    D,FCB+1    ;POINT TO INPUT
  159.     LDA    USRLEN    ;GET LENGTH OF INPUT
  160.     MOV    B,A    ;MOVE IT TO B
  161.     CALL    COMPAR    ;DO THE COMPARISON
  162.     JZ    MATCH    ;IT'S A MATCH, SO DO IT
  163.     LXI    D,25    ;INCREMENT THE POINTER
  164.     LHLD    CHARP    ;GET THE POINTER BACK
  165.     DAD    D    ;ADD IT
  166.     SHLD    CHARP    ;SAVE IT
  167.     JMP    NAMCHK    ;TRY NEXT ENTRY
  168. ;
  169. ;A MATCH WAS FOUND, SEE IF PWD PROTECTED
  170. ;
  171. MATCH    EQU    $+OFFSET
  172.     LHLD    CHARP    ;GET ENTRY POINTER
  173.     DCX    H    ;BACK UP 1 BYTES
  174.     MOV    A,M    ;GET ACCESS CODE
  175.     CPI    '*'    ;NEED A PASSWORD?
  176.     JNZ    SELECT    ;NOPE, GO AHEAD AND DO IT
  177. ;GET A PASSWORD FROM USER
  178.     CALL    ILPRT    ;PROMPT USER
  179.     DB    'Password ? ',0
  180.     LXI    H,USRPWD;POINT TO STORAGE AREA
  181.     MVI    B,0    ;MAX CHARS ALLOWED = 080H
  182. PWD1    EQU    $+OFFSET
  183.     PUSH    H
  184.     PUSH    B
  185.     MVI    E,0FFH    ;SEE IF CHAR THERE
  186.     MVI    C,DIO
  187.     CALL    BDOS
  188.     POP    B
  189.     POP    H
  190.     CPI    0    ;CHAR READY?
  191.     JZ    PWD1    ;NOT YET
  192.     CPI    CR    ;END OF INPUT?
  193.     JZ    PWD2    ;YES
  194.     MOV    M,A
  195.     INX    H    ;INCREMENT POINTER
  196.     INR    B    ;INCREMENT CHAR COUNTER
  197.     MOV    A,B    ;GET COUNTER IN A TO CHECK
  198.     CPI    080H    ;BUFFER FULL?
  199.     JZ    PWD2    ;NOPE, GET ANOTHER CHAR
  200.     MOV    B,A
  201.     JMP    PWD1
  202. ;PAD INPUT BUFFER WITH SPACES
  203. PWD2    EQU    $+OFFSET
  204.     MOV    B,A    ;GET COUNTER BACK
  205.     MVI    A,32    ;FILL INPUT WITH NULLS
  206.     MOV    M,A    ;PUT IT IN STORAGE
  207.     INX    H
  208.     INR    B
  209.     MOV    A,B    ;CHECK COUNTER
  210.     CPI    080H    ;FULL YET?
  211.     JNZ    PWD2    ;NOPE, TRY IT AGAIN
  212. ;
  213. ;NOW DO THE CHECK
  214. PWD3    EQU    $+OFFSET
  215.     LHLD    CHARP;POINT TO TABLE ENTRY
  216.     LXI    D,13
  217.     DAD    D
  218.     LXI    D,USRPWD
  219.     MVI    B,10    ;CHECK 10 CHARS (PWD LENGTH)
  220.     CALL    COMPAR    ;DO A COMPARISON
  221.     JZ    SELECT    ;CORRECT PASSWORD SUPPLIED
  222.     CALL    ILPRT    ;NOPE, SAY FORGET IT
  223.     DB    BELL,'++ Invalid password.',CR,LF,0
  224.     JMP    DONE    ;DISPLAY CORRECT AREAS
  225. ;
  226. ;WE GOT THIS FAR, LET'S CHANGE THE USER # AND DRIVE
  227. SELECT    EQU    $+OFFSET
  228.     LHLD    CHARP    ;POINT TO TABLE
  229.     DCX    H    ;BACK UP 2 BYTES
  230.     DCX    H
  231.     MOV    A,M    ;GET VALUE FROM TABLE
  232.     PUSH    H
  233.     STA    DEFBYT    ;PUT IT IN MEMORY BYTE
  234.     STA    DRVUSR
  235.     ANI    0FH    ;MASK OUT USER #
  236.     STA    NEWDRV    ;SAVE FOR LATER
  237.     MOV    E,A
  238.     MVI    C,STDSK    ;SELECT THE DRIVE
  239.     CALL    BDOS
  240.     POP    H    ;NOW SET THE USER #
  241.     MOV    A,M    ;GET THE BYTE
  242.     ANI    0F0H    ;MASK OUT DRIVE
  243.     RAR        ;ROTATE 4 TIMES TO GET USER #
  244.     RAR        ;IN PROPER POSITION
  245.     RAR
  246.     RAR
  247.     STA    NEWUSR    ;SAVE IT FOR LATER
  248.     MOV    E,A    ;DO IT
  249.     MVI    C,STUSR
  250.     CALL    BDOS
  251.     MVI    C,RSTDSK
  252.     CALL    BDOS
  253. ;
  254. ;ROUTINE TO LOAD THE COM FILE
  255. ;
  256.     IF    RUNCOM
  257. LODCOM    EQU    $+OFFSET
  258. ;SELECT USER # TO LOAD FROM
  259.     MVI    E,COMUSR
  260.     MVI    C,STUSR
  261.     CALL    BDOS
  262. ;
  263.     MVI    A,COMDRV;INITIALIZE FCB
  264.     STA    COMFIL
  265.     LXI    H,COMFIL+12
  266.     MVI    B,21
  267. ;
  268. ZLOOP    EQU    $+OFFSET
  269.     MVI    M,0
  270.     INX    H
  271.     DCR    B
  272.     JNZ    ZLOOP
  273. ;
  274.     MVI    C,OPEN    ;NOW OPEN THE FILE
  275.     LXI    D,COMFIL
  276.     CALL    BDOS
  277.     INR    A    ;SHOULD BE NON-ZERO
  278.     JZ    NOFILE    ;NO FILE, ABORT
  279. ;
  280. ;NOW LOAD THE FILE
  281.     LHLD    6    ;GET TOP OF MEMORY
  282.     LXI    D,-80H    ;RECORD LOADS CAN'T START..
  283.     DAD    D    ;..ABOVE (BDOS) - 80H
  284.     PUSH    H    ;SAVE ON STACK
  285. ;
  286.     LXI    D,80H    ;TPA-80H
  287.     LXI    B,0    ;KEEP A RECORD COUNTER
  288.     PUSH    B    ;SAVE COUNTER
  289.     PUSH    D    ;AND LOAD ADDRESS
  290. ;
  291. GLOOP    EQU    $+OFFSET
  292.     POP    D    ;GET TPA ADRS
  293.     LXI    H,80H    ;POINT TO NXT ADRS TO READ TO
  294.     DAD    D    ;HL HAS THE ADDRESS
  295.     POP    B    ;INCREMENT THE COUNTER
  296. ;CHECK FOR LOAD PAST TOP-OF-MEMORY
  297.     POP    D    ;GET (TOP-OF-MEMORY)
  298.     PUSH    D    ;RE-SAVE FOR NEXT TIME
  299.     MOV    A,E    ;SUBTRACT: (TOP) - (ADRS)
  300.     SUB    L
  301.     MOV    A,D    ;ONLY THE CARRY NEEDED
  302.     SBB    H
  303.     JNC    SIZEOK    ;CY= BETTER MOVCPM
  304.     CALL    ILPRT    ;SO TELL THE STORY
  305.     DB    BELL,'++ Program area too small ++  Aborting...',0
  306.     JMP    DONE    ;EXIT
  307. ;
  308. SIZEOK    EQU    $+OFFSET
  309.     INX    B
  310.     PUSH    B
  311.     PUSH    H    ;SAVE TPA ADRS
  312.     XCHG        ;ALIGN REGISTERS
  313.     MVI    C,STDMA ;TELL BDOS WHERE TO PUT RECORD
  314.     CALL    BDOS
  315.     LXI    D,COMFIL ;NOW READ THE RECORD
  316.     MVI    C,READ
  317.     CALL    BDOS
  318.     ORA    A
  319.     JZ    GLOOP    ;A=0 IF MORE TO READ
  320.     POP    B    ;UNJUNK STACK
  321.     POP    B    ;THIS IS OUR COUNTER
  322.     POP    H    ;MORE JUNK ON STACK
  323.     MOV    A,B    ;CHECK FOR ZERO
  324.     ORA    C
  325.     JZ    NOFILE    ;WE SHOULD HAVE READ SOMETHING
  326.     LXI    D,80H    ;WE DID, RESET DMA TO 80H
  327.     MVI    C,STDMA
  328.     CALL    BDOS
  329. ;
  330. LOADOK    EQU    $+OFFSET
  331.     MVI    A,' '    ;MAKE THE LOADED PROGRAM THINK
  332.     STA    FCB+1    ;THAT NOTHING WAS PASSED IN THE
  333.             ;COMMAND LINE
  334.     LDA    NEWDRV
  335.     ADI    1    ;MAKE IT RIGHT FOR FCB
  336.     STA    FCB    ;PUT THE PROPER DRIVE INTO THE FCB
  337. ;BEFORE JUMPING TO THE .COM FILE, RESET USER # AND DRIVE
  338.     LDA    NEWUSR    ;USER #
  339.     MOV    E,A
  340.     MVI    C,STUSR
  341.     CALL    BDOS
  342.     LDA    NEWDRV    ;DRIVE
  343.     MOV    E,A
  344.     MVI    C,STDSK
  345.     CALL    BDOS
  346.     MVI    C,RSTDSK;RESET DISK SYSTEM
  347.     CALL    BDOS
  348. ;
  349. ;BLANK THE FCB
  350.     MVI    B,11
  351.     LXI    H,FCB+1
  352. QLOOP    EQU    $+OFFSET
  353.     MVI    M,' '
  354.     INX    H
  355.     DCR    B
  356.     JNZ    QLOOP
  357.     LXI    H,FCB+1
  358. ;
  359. ;NOW JUMP TO THE CHAIN FILE
  360.      JMP    0100H    ;NOW RUN IT.
  361. ;
  362. NOFILE    EQU    $+OFFSET
  363.     CALL    ILPRT
  364.     DB    CR,LF
  365.     DB    BELL,'++ Cannot find COM file ++',0
  366. ;
  367.     ENDIF
  368.     JMP    DONE    ;QUIT
  369. ;
  370. NOMATCH    EQU    $+OFFSET
  371.     CALL    ILPRT
  372.     DB    CR,LF,BELL,'++ Invalid user-area specified ++',0
  373. ;
  374. ;
  375. ;NO OPTION SPECIFIED, OR BAD ONE, SO LIST USAGE AND
  376. ;TABLE OF DEFINITIONS.
  377. ;
  378. USAGE    EQU    $+OFFSET
  379.     CALL    ILPRT
  380.     DB    CR,LF,'FASTGO 1.1  05/06/84  James Whorton'
  381.     DB    CR,LF,LF,'GOTO            Displays user-area info.'
  382.     DB    CR,LF,'GOTO USER-AREA  Moves to the specified user-area.'
  383.     DB    CR,LF,LF,'Defined user-areas are --'
  384.     DB    CR,LF,0
  385. ;
  386. ;THIS ROUTINE PRINTS THE DEFINITION TABLE. IT PRINTS
  387. ;<WIDTH> COLUMNS ACROSS AND DOES NOT DISPLAY ANY PASSWORDS.
  388.     LXI    H,TABLE+2;POINT TO NAMES
  389.     MVI    D,13    ;# OF BYTES PER ENTRY TO PRINT
  390.     MVI    B,WIDTH    ;# OF COLUMNS TO PRINT
  391.     CALL    HEADER    ;PRINT FIRST ENTRY HEADER
  392. ;NOW SEND CHAR AND CHECK FOR END OF ENTRY
  393. INFO1    EQU    $+OFFSET
  394.     CALL    ENDCHK
  395.     MOV    A,M    ;BE SURE IT'S THERE
  396.     CALL    CTYPE    ;SEND IT
  397.     INX    H    ;INCREMENT POINTER
  398.     DCR    D    ;DECREMENT CHAR COUNTER
  399.     MOV    A,D    ;GET CHAR COUNT TO CHECK
  400.     CPI    0    ;END OF ENTRY?
  401.     JNZ    INFO1    ;NO, DO ANOTHER BYTE
  402. ;
  403. ;DONE WITH ONE ENTRY, SO EVALUATE
  404. ;FIRST, SKIP PAST PASSWORD SECTION, PRINT DIVIDER
  405. ;AND NEW LINE
  406.     MVI    D,13    ;RESET CHAR COUNTER
  407.     MVI    A,12    ;# OF CHARS TO SKIP
  408. SKIP    EQU    $+OFFSET
  409.     INX    H    ;INCREMENT POINTER
  410.     DCR    A    ;DECREMENT CHAR COUNTER
  411.     CPI    0    ;PAST IT YET?
  412.     JNZ    SKIP    ;NOPE, NOT YET
  413. ;
  414.     CALL    ENDCHK    ;SEE OF END OF TABLE REACHED
  415.     DCR    B    ;DECREMENT COLUMN COUNT
  416.     MOV    A,B    ;GET COUNT
  417.     CPI    0    ;NEED A NEW LINE?
  418.     JZ    SKIP1    ;YES
  419. ;PRINT A DIVIDER SECTION
  420.     PUSH    H
  421.     PUSH    D
  422.     PUSH    B
  423.     MVI    E,DIVID
  424.     MVI    C,COUT
  425.     CALL    BDOS
  426.     POP    B
  427.     POP    D
  428.     POP    H
  429.     CALL    HEADER    ;PRINT HEADER
  430.     JMP    INFO1    ;NOW BACK TO THE GRIND
  431. SKIP1    EQU    $+OFFSET
  432.     MVI    A,CR    ;START A NEW LINE
  433.     CALL    CTYPE
  434.     MVI    A,LF
  435.     CALL    CTYPE
  436.     MVI    B,3    ;RESET COLUMN COUNTER
  437.     CALL    ENDCHK
  438.     CALL    HEADER
  439.     JMP    INFO1
  440. ;
  441. ;CHECK FOR END OF ENTRY TABLE
  442. ;
  443. ENDCHK    EQU    $+OFFSET
  444.     PUSH    D
  445.     PUSH    B
  446.     MOV    A,M    ;GET BYTE
  447.     CPI    0    ;END OF TABLE?
  448.     JZ    DONE    ;YES, QUIT
  449.     POP    B
  450.     POP    D
  451.     RET
  452. ;
  453. DONE    EQU    $+OFFSET
  454.     JMP    WARM    ;QUIT
  455. ;
  456. ;SUBROUTINES
  457. ;
  458. ;DISPLAY THE DRIVE AND USER # FROM THE TABLE ENTRY
  459. HEADER    EQU    $+OFFSET
  460.     PUSH    D    ;SAVE REGISTERS
  461.     PUSH    B
  462.     DCX    H    ;BUMP DOWN 2
  463.     DCX    H
  464.     SHLD    CHARP    ;SAVE POINTER FOR LATER
  465.     MOV    A,M    ;GET BYTE
  466.     ANI    0FH    ;GET DRIVE
  467.     ADI    65    ;MAKE ASCII
  468.     MOV    E,A
  469.     MVI    C,COUT
  470.     CALL    BDOS
  471.     LHLD    CHARP    ;GET POINTER BACK
  472.     MOV    A,M    ;GET BYTE AGAIN
  473.     ANI    0F0H    ;GET USER #
  474.     RAR        ;ROTATE 4
  475.     RAR
  476.     RAR
  477.     RAR
  478.     CPI    9    ;IS IT > 9?
  479.     JNC    DECOUT    ;YES, BRANCH TO SUBROUTINE
  480.     ADI    48    ;NO, SO MAKE ASCII AND PRINT
  481.     MOV    E,A
  482.     MVI    C,COUT
  483.     CALL    BDOS
  484.     CALL    ILPRT
  485.     DB    '> ',0
  486. HEADFIN    EQU    $+OFFSET
  487.     POP    B    ;RESTORE REGISTERS
  488.     POP    D
  489.     LHLD    CHARP    ;GET POINTER BACK ONE MORE TIME
  490.     INX    H    ;BUMP BACK TO WHERE IT CAME FROM
  491.     INX    H
  492.     RET        ;FINISHED, RETURN
  493. ;
  494. DECOUT    EQU    $+OFFSET
  495.     MOV    B,A    ;SAVE IT FOR A SEC
  496.     PUSH    B
  497.     MVI    E,'1'    ;PRINT FIRST HALF OF VALUE
  498.     MVI    C,COUT
  499.     CALL    BDOS
  500.     POP    B    ;GET VALUE BACK
  501.     MOV    A,B
  502.     SUI    10    ;VALUE-10=SECOND DIGIT VALUE
  503.     ADI    48    ;MAKE IT ASCII
  504.     MOV    E,A
  505.     MVI    C,COUT
  506.     CALL    BDOS
  507.     MVI    E,'>'
  508.     MVI    C,COUT
  509.     CALL    BDOS
  510.     JMP    HEADFIN    ;FINISHED
  511. ;
  512. ;CONVERT THE ASCII VALUE IN A TO A 2 DIGIT DECIMAL VALUE
  513. ;AND PRINT IT
  514. ;
  515. OUTDEC    EQU    $+OFFSET
  516.     
  517. ;
  518. ;DO A COMPARISON, ABORT IF MATCH FOUND
  519. ;
  520. ;COMPARE ROUTINE, # OF CHARS IN B, TEXT TO CHECK IN
  521. ;DE (INPUT) AND HL (TABLE)
  522. ;IF A MATCH, ZERO FLAG WILL BE SET ON EXIT
  523. COMPAR    EQU    $+OFFSET
  524.     LDAX    D    ;GET A CHAR.
  525.     CALL    UCASE    ;MAKE SURE IT'S UPPER CASE
  526.     CMP    M    ;CHECK IT AGAINST TEXT
  527.     RNZ
  528.     INX    H
  529.     INX    D
  530.     DCR    B
  531.     JNZ    COMPAR
  532.     RET
  533. ;
  534. ILPRT    EQU    $+OFFSET
  535.     XTHL
  536. ILPLP    EQU    $+OFFSET
  537.     MOV    A,M
  538.     ORA    A
  539.     JZ    ILPRET
  540.     CALL    CTYPE
  541.     INX    H
  542.     JMP    ILPLP
  543. ILPRET    EQU    $+OFFSET
  544.     XTHL
  545.     RET
  546. ;
  547. CTYPE    EQU    $+OFFSET
  548.     PUSH    B
  549.     PUSH    D
  550.     PUSH    H
  551.     MOV    E,A
  552.     MVI    C,COUT
  553.     CALL    BDOS
  554.     POP    H
  555.     POP    D
  556.     POP    B
  557.     RET
  558. ;
  559. UCASE    EQU    $+OFFSET
  560.     CPI    061H    ;CONVERTS LOWER CASE...
  561.     RC        ;IN A TO UPPER CASE
  562.     CPI    07BH
  563.     RNC
  564.     ANI    05FH
  565.     RET
  566. ;==================================================
  567. ;END OF PROGRAM AREA
  568. ;
  569. ;STORAGE AREA
  570. ;
  571. USRPWD    EQU    $+OFFSET
  572.     DS    080H    ;STORAGE FOR INPUT
  573. NEWDRV    EQU    $+OFFSET
  574.     DS    1    ;STORE NEW DRIVE
  575. DRVUSR    EQU    $+OFFSET
  576.     DS    1
  577. ;
  578. ;*****
  579. ;THIS IS THE DEFINITION TABLE SECTION.
  580. ;
  581. ;FORMAT:
  582. ;       DB    1,'233333333333334444444444'
  583. ;
  584. ;BYTE      PURPOSE
  585. ;--------- -----------------------------------------
  586. ;  1       USER # AND DRIVE  (EXAMPLES FOLLOW):
  587. ;       00H=A0,01H=B0,010H=A1,011H=B1, ETC.
  588. ;  2       ACCESS CODE(* FOR PASSWORDED)
  589. ;  3-15    USER-AREA NAME
  590. ; 16-25    PASSWORD (IF INDICATED IN ACCESS CODE)
  591. ;THE EXAMPLES MAY BE CHANGED, ADDED TO OR DELETED
  592. ;AS LONG AS THE PROPER FORMAT IS KEPT. ALL ENTRIES
  593. ;IN TABLE SHOULD BE IN UPPER CASE.
  594. ;
  595. ;FORMAT GUIDE...  1, '233333333333334444444444'
  596. TABLE    EQU    $+OFFSET
  597.     DB    00H, ' REMOTE                 '
  598.     DB    01H, ' IWOJIMA                '
  599.     DB    021H,' FILES                  '
  600.     DB    010H,'*RESERVED     SORTX     '               
  601.     DB    011H,'*SECRET       HOWDY     '
  602.     DB    012H,' KEEP                   '
  603.     DB    0A1H,' HIGHMEM                '
  604. ;NOTE: THE FOLLOWING 4 BYTES MUST BE KEPT AT THE
  605. ;END OF THIS TABLE!
  606.     DB    0,0,0,0
  607. ;
  608. ;
  609. ;IF YOU WISH TO AUTOBOOT A .COM FILE UPON ENTERING THE
  610. ;NEW USER-AREA, SET RUNCOM TO TRUE AND INSERT THE PROPER
  611. ;FILE NAME IN COMFIL.
  612. ;NOTE: THE .COM FILE YOU CHAIN TO MUST EXIT TO CP/M
  613. ;WITH A WARM BOOT OR THE USER-AREA WILL NOT BE CORRECTLY
  614. ;SELECTED.
  615. ;
  616. COMFIL    EQU    $+OFFSET
  617.     DB    0,'SD      COM'
  618. ;                  ^^^^^^^^^^^ <--MUST BE 11 CHARS.
  619. ;
  620. CHARP    EQU    $+OFFSET
  621.     DS    2    ;NEXT CHAR. ADDRESS POINTER
  622. USRLEN    EQU    $+OFFSET
  623.     DS    1    ;LENGTH OF USER-AREA SPECIFIED
  624. NEWUSR    EQU    $+OFFSET
  625.     DS    1    ;NEW USER # TO MOVE TO
  626. ;
  627. ;** THIS MARKS THE END OF THE CODE TO BE RELOCATED.
  628. ;
  629. PEND    EQU    $+OFFSET
  630. ;
  631.     END
  632.