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 >
Wrap
Assembly Source File
|
1984-04-29
|
8KB
|
330 lines
;*****************************************************;
;
; ASSIGNMENT UTILITY
;
; VERSION 1.0 05/77
;
;*****************************************************;
IOBYTE EQU 3 ;IO ASSIGNMENTS BYTE - WHAT THIS PROGRAM SETS
STRLOC EQU 80H ;WHERE CCP LEAVE ARGUMENT STRING
ENTRY EQU 5 ;SYSTEM CALL ENTRY POINT
REBOOT EQU 0 ;WHERE TO JMP TO REBOOT SYSTEM
TBASE EQU 100H ;WHERE PROGRAM BEGINS
;EQUATES FOR ASCII CONTROL CHARACTERS
CTRLC EQU 3
TAB EQU 9
LF EQU 0AH
CR EQU 0DH
RUBOUT EQU 7FH
ORG TBASE
JMP ASSIGN ;NORMAL ENTRY
JMP DTEST ;DDT DEBUGGING ENTRY
; *********** DEVICE TABLES **************
;THESE TABLES GIVE THE LOGICAL DEVICE NAMES
;AND THE PHYSICAL DEVICE NAMES ASSOCIATED WITH EACH, AND THE
;CORRESPONDING IOBYTE VALUES.
;TO CHANGE DEVICE NAMES OR IOBYTE VALUES, THE USER
;NEED ONLY CHANGE THESE TABLES.
;LOGICAL DEVICE TABLE: NAMES ACCEPTED BEFORE '='
; FORMAT: ASCII NAME (OMIT COLON), SPACE, MASK FOR
; ZEROING IOBYTE FIELD RELATED TO NAME (1 BYTE),
; ADDRESS OF PHYSICAL DEVICE TABLE FOR THIS LOG DEVICE.
;
LDEVTAB: ;A LONG AND A SHORT NAME FOR EACH --
DB 'CON ',11111100B
DW CONFDEV
DB 'CONSOLE ',11111100B
DW CONFDEV
DB 'RDR ',11110011B
DW RDRFDEV
DB 'READER ',11110011B
DW RDRFDEV
DB 'PUN ',11001111B
DW PUNFDEV
DB 'PUNCH ',11001111B
DW PUNFDEV
DB 'LST ',00111111B
DW LSTFDEV
DB 'LIST ',00111111B
DW LSTFDEV
DB 0FFH ;THIS MARKS END OF TABLE
;PHYSICAL DEVICE NAME TABLES: NAMES ACCEPTABLE AFTER '='.
;ONE FOR EACH LOGICAL DEVICE.
; FORMAT: NAME, SPACE, PROPERLY POSITIONED IOBYTE VALUE
CONFDEV: ;FOR CONSOLE - INPUT AND OUTPUT
DB 'TTY ',0
DB 'CRT ',1
DB 'BATCH ',2 ;BATCH MODE: INPUT LOGICAL READER, OUTPUT LIST.
DB 'CON3 ',3 ;FOR A USER-ADDED DEVICE
DB 0FFH
RDRFDEV: ;SYSTEM READER DEVICE
DB 'TTY ',0
DB 'RDR ',100B ;HIGH SPEED READER (UNIMPLEMENTED)
DB 'RDR2 ',1000B ;UNIMPLEMENTED - FOR USER-ADDED DEVICE
DB 'RDR3 ',1100B ; DITTO
DB 0FFH
PUNFDEV: ;SYSTEM PUNCH DEVICE
DB 'TTY ',0
DB 'PUN ',10000B ;HI SPEED PUNCH (UNIMPLEMENTED)
DB 'PUN2 ',100000B ;UNIMPLEMENTED - FOR USER DEVICE
DB 'PUN3 ',110000B ;DITTO
DB 0FFH
LSTFDEV: ;SYSTEM LIST DEVICE
DB 'TTY ',0
DB 'CRT ',01000000B
DB 'LPT ',10000000B ;IMSAI LINE PRINTER
DB 'PRN ',10000000B ;SYNONYM FOR LPT
DB 'LST3 ',11000000B ;FOR USER-ADDED DEVICE
DB 0FFH
;
; ************* MAIN PROGRAM ********************
ASSIGN:
LXI H,0! DAD SP! SHLD CALLERSP ;SAVE CALLER'S STACK
LXI SP,STACK ;SET UP OURS
;
; ANALYZE AND EXECUTE GIVEN COMMAND
;
LXI H,STRLOC ;STRING POINTER STAYS IN HL
;INPUT IS COUNT FOLLOWED BY CHARACTERS. PUT CR AT END.
PUSH H
MOV E,M ;COUNT
MVI D,0! DAD D! INX H ;POINT CHR POSN AFTER END
MVI M,CR ;PUT CR THERE
POP H ;RESTORE POINTER TO BEGINNING
;IF NULL ARG, GO ASSIGN FROM SWITCHES
CALL PASS$SP! CPI CR! JZ ASSWITCHES
;PARSE LOGICAL DEVICE NAME
DCX H! CALL SCANDVN ;SCAN NAME, SET C=LEN,DE=START
;ALLOW A SEPERATING CHARACTER IN ADDITION TO SPACES
CPI '='! JZ PASSEP
CPI '_'! JZ PASSEP
CPI ','! JZ PASSEP
DCX H ;ELSE CURRENT CHAR STARTS PHYS DEV NAME
PASSEP: PUSH H ;SAVE STRING POINTER
;SEARCH LOGICAL DEVICE TABLE
LXI H,LDEVTAB-4
PUSH D
MVI B,0! PUSH B
;LOOP OVER ENTRIES
SLDTL: POP B! POP D! PUSH D! PUSH B
INX H! INX H! INX H! INX H ;PASS DATA FOR PREVIOUS ENTRY
;LOOP OVER CHARS OF ENTRY
SLDEL: MOV A,M ;CHAR OF ENTRY
CPI 0FFH! JZ LDEVNF ;TEST FOR END OF TABLE
CPI ' '! JZ ENDLENTRY ;TEST FOR END THIS ENTRY KEY
LDAX D! CMP M! JZ SLDTL2 ;COMPARE TO CHAR OF ARGUMENT
INR B ;CHAR DOESN'T MATCH, FLAG AND CONTINUE
SLDTL2: INX H! INX D! DCR C! JMP SLDEL ;KEEP TESTING ENTRY
;END OF CURRENT ENTRY
ENDLENTRY: MOV A,C ;TEST FOR LENGTH CORRECT
ORA B ;TEST FOR ALL CHARS MATCHING
JNZ SLDTL ;IF EITHER WRONG, TRY
;FOUND IT, FETCH VALUES FROM TABLE
INX H! MOV A,M! STA MASK ;MASK FOR CHANGING IOBYTE
INX H! MOV A,M! INX H! MOV H,M! MOV L,A
;LOCATION PHYS DEV TAB FOR THIS LOG DEV
POP D! POP D ;CLEAR STACK
;
XTHL ;PUT PHYS DEV TAB PTR, GET STRING POINTER
;
; PARSE PHYS DEV NAME
CALL SCANDVN
;CHECK TERMINATING CHAR
CPI CR! JNZ SYNER
;
POP H ;DISCARD STRING PTR, GET PHYS DEV TBL LOC
;SEARCH PHYS DEV TABLE (HL)
;PARALLEL TO LOG DEV TABLE SEARCH ABOVE
DCX H! DCX H ;ADJUST TABLE PTR FOR INX'S BELOW
PUSH D
MVI B,0! PUSH B
SFDTL: POP B! POP D! PUSH D! PUSH B
INX H! INX H
SFDEL: MOV A,M
CPI 0FFH! JZ FDEVNF
CPI ' '! JZ ENDFENTRY
LDAX D! CMP M! JZ SFDTL2
INR B
SFDTL2: INX H! INX D! DCR C! JMP SFDEL
ENDFENTRY: MOV A,C
ORA B
JNZ SFDTL
;FOUND IT
;UPDATE IOBYTE
INX H
LDA IOBYTE! MOV B,A
LDA MASK! ANA B
ORA M! STA IOBYTE
;DONE, EXIT TO CCP
JMP GDEXIT
;
; DDT CHECKOUT MAIN PROGRAM
;
DTEST: LXI SP,DSTACK
;INPUT STRING TO SAME PLACE CCP DOES & MAKE IT LOOK THE SAME
LXI H,STRLOC-1 ;BUFFER LOC
MVI M,72 ;LENGTH
MVI C,10 ;BUFFERED CONSOLE INPUT FUNCTION
MOV D,H! MOV E,L
CALL ENTRY
MVI A,LF! CALL CONO ;ECHO LF AFTER CR
;NOW USE ASSIGN PROGRAM
CALL ASSIGN
RST 7 ;THEN RETURN TO DDT
;
; ***** NORMAL FLOW OF PROGRAM ENDED ABOVE, EXECPTION CASES FOLLOW ******
;
; ASSIGN FROM SWITCHES
;
ASSWITCHES:
;GET USER TO CONFIRM, SINCE IF THERE'S A WRONG
; VALUE IN SWITHCES, HIS CONSOLE SOULD DISSAPPEAR
LXI D,ASWMSG! CALL TMSG ;"SET SWITCHES, TYPE RETURN"
MVI C,1! CALL ENTRY ;INPUT CHARACTER FROM CONSOLE
CPI RUBOUT! JZ GDEXIT ;IGNORE IF RUBOUT
CPI CTRLC! JZ REBOOT ;RELOAD SYSTEM ON ^C
CPI CR! JNZ QUES ;"?" ON CHAR OTHER THAN CR
;NOW INPUT AND STORE SWITCHES
IN 0FFH ;PUTS SWITCHES VALUE IN A
STA IOBYTE ;STORE IT
JMP GDEXIT
ASWMSG: DB 'SET SWITCHES TO DESIRED IOBYTE VALUE, TYPE RETURN$'
;LOGICAL DEVICE NOT FOUND IN TABLE
LDEVNF: CALL TDEVN ;TYPE DEVICE NAME AND COLON
CALL INLMSGEXIT! DB ' UNRECOGNIZED LOGICAL DEVICE$'
;PHYSICAL DEVICE NOT FOUND IN TABLE
FDEVNF: CALL TDEVN
CALL INLMSGEXIT! DB ' NOT LEGAL PHYSICAL DEVICE FOR GIVEN LOGICAL DEVICE$'
;GENERAL SYNTAX ERROR: TYPE LINE AND ?
SYNER: LXI D,STRLOC
LDAX D! MOV C,A ;CHAR COUNT TO C
INX D! CALL TDEVN ;TYPE LINE
QUES: CALL INLMSGEXIT! DB ' ?$'
;
;
; ************* SUBROUTINES *******************
;
;PASS SPACES, GET CHARACTER
PASS$SP: INX H! MOV A,M! CPI ' '! JZ PASS$SP! RET
;SCAN DEVICE NAME (HL), RET BEG DE, COUNT C, NEXT CHAR A
SCANDVN:
SCD1: INX H! MOV A,M! CPI ' '! JZ SCD1 ;PASS PRECEDING SPACES
PUSH H ;SAVE BEGINNING
MVI C,0 ;CHAR COUNTER (RUNS 1 HI)
DCX H
;SCAN NAME INSELF
SCDL: INR C! INX H! MOV A,M ;NEXT CHARACTER
;END SCAN ON : = CR _ OR SPACE
CPI ' '! JZ SCD4! CPI ':'! JZ SCD4! CPI CR! JZ SCD4
CPI '='! JZ SCD4! CPI '_'! JNZ SCDL
;
SCD4: DCR C! JZ SYNER ;ERROR IF NO CHARACTERS IN NAME
;PASS UP FOLLOWING COLON
CPI ':'! JNZ $+4! INX H! MOV A,M
POP D ;POINTER TO BEGINNING
SCD6: CPI ' '! RNZ! INX H! MOV A,M! JMP SCD6 ;PASS FOLLOWING SPACES
;TYPE DEVICE NAME AFTER SEARCH ERROR
;DE POINTS BEGINNING, C GIVES LENGTH
TDEVN: XCHG
TDEVN1: MOV A,M! CALL CONO! INX H! DCR C! JNZ TDEVN1
MVI A,':'! JMP CONO
;TYPE MESSAGE FOLLOWING CALL AND EXIT
INLMSGEXIT: POP D ;MESSAGE IS AT CALLING LOC
;TYPE MESSAGE (DE) AND ABORT
MSGABORT: CALL TMSG
;ERROR RETURN TO CCP
EREXIT: MVI A,1! JMP $+4
;GOOD RETURN TO CCP
GDEXIT: XRA A
CALL CRLF
LHLD CALLERSP! SPHL! RET
;
;OUTPUT CRLF TO CONSOLE & CLOBBER DE
CRLF: LXI D,CRLFM
;OUTPUT MESSAGE (DE) TO CONSOLE
TMSG: PUSH PSW! PUSH B! PUSH D! PUSH H
MVI C,9
JMP CALLEN
CRLFM: DB CR,LF,'$'
;OUTPUT CHARACTER (A) TO CONSOLE
CONO: PUSH PSW! PUSH B! PUSH D! PUSH H
MOV E,A! MVI C,2
CALLEN: CALL ENTRY
RETREGS: POP H! POP D! POP B! POP PSW! RET
;
; ************ STORAGE **************
;
CALLERSP: DS 2 ;CALLER'S STACK POINTER
MASK: DS 1 ;BIT MASK FOR IOBYTE FIELD TO CHANGE
DS 40
STACK: DS 10
DSTACK: END DTEST