home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG001.ARK / ASSIGN.ASM next >
Assembly Source File  |  1984-04-29  |  8KB  |  330 lines

  1. ;*****************************************************;
  2. ;
  3. ;        ASSIGNMENT UTILITY
  4. ;
  5. ;        VERSION 1.0 05/77
  6. ;
  7. ;*****************************************************;
  8.  
  9.  
  10. IOBYTE    EQU    3    ;IO ASSIGNMENTS BYTE -  WHAT THIS PROGRAM SETS
  11. STRLOC    EQU    80H    ;WHERE CCP LEAVE ARGUMENT STRING
  12. ENTRY    EQU    5    ;SYSTEM CALL ENTRY POINT
  13. REBOOT    EQU    0    ;WHERE TO JMP TO REBOOT SYSTEM
  14. TBASE    EQU    100H    ;WHERE PROGRAM BEGINS
  15.  
  16. ;EQUATES FOR ASCII CONTROL CHARACTERS
  17. CTRLC    EQU    3
  18. TAB    EQU    9
  19. LF    EQU    0AH
  20. CR    EQU    0DH
  21. RUBOUT    EQU    7FH
  22.  
  23.  
  24.  
  25.  
  26.     ORG TBASE
  27.  
  28.     JMP ASSIGN    ;NORMAL ENTRY
  29.     JMP DTEST    ;DDT DEBUGGING ENTRY
  30.  
  31.  
  32. ; *********** DEVICE TABLES **************
  33.  
  34. ;THESE TABLES GIVE THE LOGICAL DEVICE NAMES
  35. ;AND THE PHYSICAL DEVICE NAMES ASSOCIATED WITH EACH, AND THE
  36. ;CORRESPONDING IOBYTE VALUES.
  37.  
  38. ;TO CHANGE DEVICE NAMES OR IOBYTE VALUES, THE USER
  39. ;NEED ONLY CHANGE THESE TABLES.
  40.  
  41.  
  42. ;LOGICAL DEVICE TABLE: NAMES ACCEPTED BEFORE '='
  43. ;    FORMAT: ASCII NAME (OMIT COLON), SPACE, MASK FOR
  44. ;        ZEROING IOBYTE FIELD RELATED TO NAME (1 BYTE),
  45. ;        ADDRESS OF PHYSICAL DEVICE TABLE FOR THIS LOG DEVICE.
  46. ;
  47.  
  48. LDEVTAB:        ;A LONG AND A SHORT NAME FOR EACH --
  49.     DB 'CON ',11111100B
  50.      DW CONFDEV
  51.     DB 'CONSOLE ',11111100B
  52.      DW CONFDEV
  53.     DB 'RDR ',11110011B
  54.      DW RDRFDEV
  55.     DB 'READER ',11110011B
  56.      DW RDRFDEV
  57.     DB 'PUN ',11001111B
  58.      DW PUNFDEV
  59.     DB 'PUNCH ',11001111B
  60.      DW PUNFDEV
  61.     DB 'LST ',00111111B
  62.      DW LSTFDEV
  63.     DB 'LIST ',00111111B
  64.      DW LSTFDEV
  65.     DB 0FFH        ;THIS MARKS END OF TABLE
  66.  
  67.  
  68. ;PHYSICAL DEVICE NAME TABLES: NAMES ACCEPTABLE AFTER '='.
  69. ;ONE FOR EACH LOGICAL DEVICE.
  70. ;    FORMAT: NAME, SPACE, PROPERLY POSITIONED IOBYTE VALUE
  71.  
  72. CONFDEV:    ;FOR CONSOLE - INPUT AND OUTPUT
  73.     DB 'TTY ',0
  74.     DB 'CRT ',1
  75.     DB 'BATCH ',2    ;BATCH MODE: INPUT LOGICAL READER, OUTPUT LIST.
  76.     DB 'CON3 ',3    ;FOR A USER-ADDED DEVICE
  77.     DB 0FFH
  78.  
  79. RDRFDEV:    ;SYSTEM READER DEVICE
  80.     DB 'TTY ',0
  81.     DB 'RDR ',100B        ;HIGH SPEED READER (UNIMPLEMENTED)
  82.     DB 'RDR2 ',1000B    ;UNIMPLEMENTED - FOR USER-ADDED DEVICE
  83.     DB 'RDR3 ',1100B    ; DITTO
  84.     DB 0FFH
  85.  
  86. PUNFDEV:    ;SYSTEM PUNCH DEVICE
  87.     DB 'TTY ',0
  88.     DB 'PUN ',10000B    ;HI SPEED PUNCH (UNIMPLEMENTED)
  89.     DB 'PUN2 ',100000B    ;UNIMPLEMENTED - FOR USER DEVICE
  90.     DB 'PUN3 ',110000B    ;DITTO
  91.     DB 0FFH
  92.  
  93. LSTFDEV:    ;SYSTEM LIST DEVICE
  94.     DB 'TTY ',0
  95.     DB 'CRT ',01000000B
  96.     DB 'LPT ',10000000B    ;IMSAI LINE PRINTER
  97.     DB 'PRN ',10000000B    ;SYNONYM FOR LPT
  98.     DB 'LST3 ',11000000B    ;FOR USER-ADDED DEVICE
  99.     DB 0FFH
  100. ;
  101.  
  102.  
  103.  
  104. ; ************* MAIN PROGRAM ********************
  105.  
  106.  
  107. ASSIGN:
  108.     LXI H,0! DAD SP! SHLD CALLERSP        ;SAVE CALLER'S STACK
  109.     LXI SP,STACK        ;SET UP OURS
  110. ;
  111. ; ANALYZE AND EXECUTE GIVEN COMMAND
  112. ;
  113.     LXI H,STRLOC    ;STRING POINTER STAYS IN HL
  114. ;INPUT IS COUNT FOLLOWED BY CHARACTERS. PUT CR AT END.
  115.     PUSH H
  116.     MOV E,M            ;COUNT
  117.     MVI D,0! DAD D! INX H    ;POINT CHR POSN AFTER END
  118.     MVI M,CR        ;PUT CR THERE
  119.     POP H            ;RESTORE POINTER TO BEGINNING
  120.  
  121. ;IF NULL ARG, GO ASSIGN FROM  SWITCHES
  122.     CALL PASS$SP! CPI CR! JZ ASSWITCHES
  123.  
  124. ;PARSE LOGICAL DEVICE NAME
  125.     DCX H! CALL SCANDVN    ;SCAN NAME, SET C=LEN,DE=START
  126.  
  127. ;ALLOW A SEPERATING CHARACTER IN ADDITION TO SPACES
  128.     CPI '='! JZ PASSEP
  129.     CPI '_'! JZ PASSEP
  130.     CPI ','! JZ PASSEP
  131.     DCX H        ;ELSE CURRENT CHAR STARTS PHYS DEV NAME
  132. PASSEP:    PUSH H        ;SAVE STRING POINTER
  133.  
  134. ;SEARCH LOGICAL DEVICE TABLE
  135.     LXI H,LDEVTAB-4
  136.     PUSH D
  137.     MVI B,0! PUSH B
  138. ;LOOP OVER ENTRIES
  139. SLDTL:    POP B! POP D! PUSH D! PUSH B
  140.     INX H! INX H! INX H! INX H    ;PASS DATA FOR PREVIOUS ENTRY
  141. ;LOOP OVER CHARS OF ENTRY
  142. SLDEL:    MOV A,M            ;CHAR OF ENTRY
  143.     CPI 0FFH! JZ LDEVNF    ;TEST FOR END OF TABLE
  144.     CPI ' '! JZ ENDLENTRY    ;TEST FOR END THIS ENTRY KEY
  145.     LDAX D! CMP M! JZ SLDTL2    ;COMPARE TO CHAR OF ARGUMENT
  146.     INR B            ;CHAR DOESN'T MATCH, FLAG AND CONTINUE
  147. SLDTL2:    INX H! INX D! DCR C! JMP SLDEL    ;KEEP TESTING  ENTRY
  148. ;END OF CURRENT ENTRY
  149. ENDLENTRY: MOV A,C        ;TEST FOR LENGTH CORRECT
  150.     ORA B            ;TEST FOR ALL CHARS MATCHING
  151.     JNZ SLDTL        ;IF EITHER WRONG, TRY
  152. ;FOUND IT, FETCH VALUES FROM TABLE
  153.     INX H! MOV A,M! STA MASK    ;MASK FOR CHANGING IOBYTE
  154.     INX H! MOV A,M! INX H! MOV H,M! MOV L,A
  155.                 ;LOCATION PHYS DEV TAB FOR THIS LOG DEV
  156.     POP D! POP D        ;CLEAR STACK
  157. ;
  158.     XTHL        ;PUT PHYS DEV TAB PTR, GET STRING POINTER
  159. ;
  160.  
  161. ; PARSE PHYS DEV NAME
  162.     CALL SCANDVN
  163.  
  164. ;CHECK TERMINATING CHAR
  165.     CPI CR! JNZ SYNER
  166. ;
  167.     POP H        ;DISCARD STRING PTR, GET PHYS DEV TBL LOC
  168.  
  169. ;SEARCH PHYS DEV TABLE (HL)
  170. ;PARALLEL TO LOG DEV TABLE SEARCH ABOVE
  171.     DCX H! DCX H        ;ADJUST TABLE PTR FOR INX'S BELOW
  172.     PUSH D
  173.     MVI B,0! PUSH B
  174. SFDTL:    POP B! POP D! PUSH D! PUSH B
  175.     INX H! INX H
  176. SFDEL:    MOV A,M
  177.     CPI 0FFH! JZ FDEVNF
  178.     CPI ' '! JZ ENDFENTRY
  179.     LDAX D! CMP M! JZ SFDTL2
  180.     INR B
  181. SFDTL2:    INX H! INX D! DCR C! JMP SFDEL
  182. ENDFENTRY: MOV A,C
  183.     ORA B
  184.     JNZ SFDTL
  185. ;FOUND IT
  186. ;UPDATE IOBYTE
  187.     INX H
  188.     LDA IOBYTE! MOV B,A
  189.     LDA MASK! ANA B
  190.     ORA M! STA IOBYTE
  191. ;DONE, EXIT TO CCP
  192.     JMP GDEXIT
  193.  
  194. ;
  195. ; DDT CHECKOUT MAIN PROGRAM
  196. ;
  197. DTEST:    LXI SP,DSTACK
  198. ;INPUT STRING TO SAME PLACE CCP DOES & MAKE IT LOOK THE SAME
  199.     LXI H,STRLOC-1        ;BUFFER LOC
  200.     MVI M,72        ;LENGTH
  201.     MVI C,10        ;BUFFERED CONSOLE INPUT FUNCTION
  202.     MOV D,H! MOV E,L
  203.     CALL ENTRY
  204.     MVI A,LF! CALL CONO    ;ECHO LF AFTER CR
  205. ;NOW USE ASSIGN PROGRAM
  206.     CALL ASSIGN
  207.     RST 7            ;THEN RETURN TO DDT
  208. ;
  209.  
  210.  
  211. ; ***** NORMAL FLOW OF PROGRAM ENDED ABOVE, EXECPTION CASES FOLLOW ******
  212.  
  213. ;
  214. ; ASSIGN FROM SWITCHES
  215. ;
  216. ASSWITCHES:
  217. ;GET USER TO CONFIRM, SINCE IF THERE'S A WRONG
  218. ; VALUE IN SWITHCES, HIS CONSOLE SOULD DISSAPPEAR
  219.     LXI D,ASWMSG! CALL TMSG        ;"SET SWITCHES, TYPE RETURN"
  220.     MVI C,1! CALL ENTRY    ;INPUT CHARACTER FROM CONSOLE
  221.     CPI RUBOUT! JZ GDEXIT    ;IGNORE IF RUBOUT
  222.     CPI CTRLC! JZ REBOOT    ;RELOAD SYSTEM ON ^C
  223.     CPI CR! JNZ QUES    ;"?" ON CHAR OTHER THAN CR
  224. ;NOW INPUT AND STORE SWITCHES
  225.     IN 0FFH        ;PUTS SWITCHES VALUE IN A
  226.     STA IOBYTE    ;STORE IT
  227.     JMP GDEXIT
  228.  
  229. ASWMSG:    DB 'SET SWITCHES TO DESIRED IOBYTE VALUE, TYPE RETURN$'
  230.  
  231. ;LOGICAL DEVICE NOT FOUND IN TABLE
  232. LDEVNF:    CALL TDEVN    ;TYPE DEVICE NAME AND COLON
  233.     CALL INLMSGEXIT! DB ' UNRECOGNIZED LOGICAL DEVICE$'
  234.  
  235. ;PHYSICAL DEVICE NOT FOUND IN TABLE
  236. FDEVNF:    CALL TDEVN
  237.     CALL INLMSGEXIT! DB ' NOT LEGAL PHYSICAL DEVICE FOR GIVEN LOGICAL DEVICE$'
  238.  
  239. ;GENERAL SYNTAX ERROR: TYPE LINE AND ?
  240. SYNER:    LXI D,STRLOC
  241.     LDAX D! MOV C,A        ;CHAR COUNT TO C
  242.     INX D! CALL TDEVN    ;TYPE LINE
  243. QUES:    CALL INLMSGEXIT! DB ' ?$'
  244. ;
  245.  
  246. ;
  247. ; ************* SUBROUTINES *******************
  248. ;
  249.  
  250. ;PASS SPACES, GET CHARACTER
  251. PASS$SP: INX H! MOV A,M! CPI ' '! JZ PASS$SP! RET
  252.  
  253.  
  254. ;SCAN DEVICE NAME (HL), RET BEG DE, COUNT C, NEXT CHAR A
  255.  
  256. SCANDVN:
  257. SCD1:    INX H! MOV A,M! CPI ' '! JZ SCD1    ;PASS PRECEDING SPACES
  258.     PUSH H        ;SAVE BEGINNING
  259.     MVI C,0        ;CHAR COUNTER (RUNS 1 HI)
  260.     DCX H
  261. ;SCAN NAME INSELF
  262. SCDL:    INR C! INX H! MOV A,M    ;NEXT CHARACTER
  263.     ;END SCAN ON : = CR _ OR SPACE
  264.     CPI ' '! JZ SCD4! CPI ':'! JZ SCD4! CPI CR! JZ SCD4
  265.     CPI '='! JZ SCD4! CPI '_'! JNZ SCDL
  266. ;
  267. SCD4:    DCR C! JZ SYNER        ;ERROR IF NO CHARACTERS IN NAME
  268. ;PASS UP FOLLOWING COLON
  269.     CPI ':'! JNZ $+4! INX H! MOV A,M
  270.     POP D        ;POINTER TO BEGINNING
  271. SCD6:    CPI ' '! RNZ! INX H! MOV A,M! JMP SCD6    ;PASS FOLLOWING SPACES
  272.  
  273.  
  274. ;TYPE DEVICE NAME AFTER SEARCH ERROR
  275. ;DE POINTS BEGINNING, C GIVES LENGTH
  276.  
  277. TDEVN:    XCHG
  278. TDEVN1:    MOV A,M! CALL CONO! INX H! DCR C! JNZ TDEVN1
  279.     MVI A,':'! JMP CONO
  280.  
  281. ;TYPE MESSAGE FOLLOWING CALL AND EXIT
  282.  
  283. INLMSGEXIT:    POP D        ;MESSAGE IS AT CALLING LOC
  284.  
  285. ;TYPE MESSAGE (DE) AND ABORT
  286.  
  287. MSGABORT:    CALL TMSG
  288.  
  289. ;ERROR RETURN TO CCP
  290.  
  291. EREXIT:    MVI A,1! JMP $+4
  292.  
  293. ;GOOD RETURN TO CCP
  294. GDEXIT:    XRA A
  295.     CALL CRLF
  296.     LHLD CALLERSP! SPHL! RET
  297. ;
  298.  
  299.  
  300. ;OUTPUT CRLF TO CONSOLE & CLOBBER DE
  301.  
  302. CRLF:    LXI D,CRLFM
  303.  
  304. ;OUTPUT MESSAGE (DE) TO CONSOLE
  305.  
  306. TMSG:    PUSH PSW! PUSH B! PUSH D! PUSH H
  307.     MVI C,9
  308.     JMP CALLEN
  309.  
  310. CRLFM:    DB CR,LF,'$'
  311.  
  312. ;OUTPUT CHARACTER (A) TO CONSOLE
  313.  
  314. CONO:    PUSH PSW! PUSH B! PUSH D! PUSH H
  315.     MOV E,A! MVI C,2
  316. CALLEN:    CALL ENTRY
  317. RETREGS: POP H! POP D! POP B! POP PSW! RET
  318.  
  319.  
  320.  
  321. ;
  322. ; ************ STORAGE **************
  323. ;
  324. CALLERSP: DS 2        ;CALLER'S STACK POINTER
  325. MASK:    DS 1        ;BIT MASK FOR IOBYTE FIELD TO CHANGE
  326.  
  327.     DS 40
  328. STACK:    DS 10
  329. DSTACK:    END DTEST
  330.