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
/
CPMUG035.ARK
/
PARM.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
11KB
|
476 lines
; 7 SEPT,NIGHT.I RE-REPAIR CHARIN...
;
; FIX TO INCORPORATE TYPE 4 AND TYPE 7
; BY CHANDRA AND MCCHAREN ON AUGUST 25 '79
;
; PARM: INPARM & OUTPARM BY WITTENBERG. SOME
; FIXES (INCLUDING THE 'RESCALE' OP IMBEDDED) BY
; MOSHELL.
;
; INPUT CONDITIONS:
;
; PGMCTR ( OR FPC ) POINTS TO THE 'TYPE' BYTE OF THE PARAMETER.
;
; OUTPUT CONDITIONS:
;
; INPAR RETURNS THE VALUE OF THE PARAMETER IN D-E.
;
PGMCTR EQU 110H
TYPBITS EQU 0E0H
DATA5 EQU 01FH
CONSTAT EQU 503FH
CPM EQU 0H
DISPOFF EQU 5057H
CHAR EQU 5094H
CO EQU 502AH
CI EQU 5027H
CRLF EQU 5024H
PRINT EQU 502DH
HEXPRT EQU 5042H
DISPHL EQU 5045H
RANGTABL EQU 2F70H
STOP EQU '$'
INREG EQU 4C06H
OUTREG EQU 4D66H
*
ORG 5700H
INPAR: PUSH H ! PUSH PSW
LHLD PGMCTR ;LOOK AT FIRST (TYPE) BYTE OF CURRENT PARM
MOV A,M
ANI TYPBITS ;REMOVE ALL BUT TYPE CODE BITS
ADD A ;ADJUST SO THAT TYPE BITS SET CY,SIGN,& PPARITY FLAGS
JNC ILESS4 ;IF CY NOT SET, TYPE # < 4
JP ILESS6 ;IF SIGN NOT SET, TYPE 4 OR 5
ORA A ;SET PARITY FLAG
JPO ITYPE6 ;IF PARITY ODD, TYPE IS 6
*
* TYPE4 IS ARRAY, INDEXED BY ONE OF THE REGISTER CONTENTS
* TYPE 7 REFERS TO REGISTER CONTENTS
* INPAR CALLS OUTREG WITH THE PARMETER HEADER IN REG C
* OUTREG RETURNS THE PARAMETER VALUE AS FOLLOWS:
* REG A - LOW ORDER BYTE
* REG B - HIGH ORDER BYTE
*
ITYPE47: PUSH B! PUSH H
MOV C,M ; PICK UP PARAMETER -HEADER.
CALL OUTREG ; OUTREG RETURNS THE PARM-VALUE IN
MOV E,A ; A ( LOW ORDER BYTE ) & B ( HIGH ORDER BYTE )
MOV D,B
POP H !POP B
INX H
SHLD PGMCTR
POP PSW
POP H
RET
*
* TYPE 6 PARM IS A 16 BIT VARIABLE
ITYPE6: INX H ;GET ADDR. OF WORD WANTED TO RETURN
MOV E,M
INX H
MOV D,M
INX H ;SAVE NEW PROGRAM COUNTER
SHLD PGMCTR
XCHG ;GET ADDRESS OF WANTED WORD INTO HL
MOV E,M ;GET WORD INNTO DE
INX H
MOV D,M
POP PSW ;RESTORE REGS AND RETURN
STC ;TELL CALLER THAT VALUE IS 16 BITS
POP H
RET
*
* TYPE IS EITHER 4 OR 5
*
ILESS6: ORA A ; SET THE PARITY FLAG
JPE ITYPE47 ; IF THE PARITY IS EVEN,TYPE 4.
*
* TYPE 5 IS 16 BIT CONSTANT.
*
ITYPE5: INX H ; GET NEXT 16 BITS INTO D-E
MOV E,M
INX H
MOV D,M
INX H ;UPDATE PROGRAM COUNTER
SHLD PGMCTR
POP PSW
STC ;TELL CALLER THAT PPARM IS 16 BIT VALUE
POP H
RET
*
* TYPE IS 0, 1, 2, OR 3
*
ILESS4: JP ILESS2 ;IF SIGN NOT SET, MUST BE 0 OR 1
ORA A ;SET PARITY FLAG
JPO ITYPE2 ;IF PARITY ODD, TYPE MUST BE 2
* TYPE 3 IS AN INPUT PORT
* THESE ARE "STANDARDIZED" AS BELOW IN ORDER TO ACCESS
* PORT INPUTS IN A MACHINE INDEPENDENT FASHION
* 0 CONSOLE CTRL & STATUS: BIT 0=1 IF IN-DATA IS READY, 0 ELSE
* 1 CONSOLE DATA (WAIT-LOOP AND ECHO BUILT IN)
* 8 X1 \
* 9 Y1 \
* A X2 A/D CONVERTER (JOYSTICKS)
* B Y2 /
* C Z1 (EXTRA A/D CHANNEL ON JS-1...UNUSED NOW)
* D Z2 ('POT' ON JS-2;USED FOR 'THETA')
* E AUXILIARY SWITCH REG. (E.G. ON JOYSTICKS)
* F SWITCH REGISTER
ITYPE3: PUSH H ;GET PROGRAM COUNTER OUT OF THE 0T OF FIRE
MOV A,M ;GET PORT NUMBER INTO A
ANI DATA5
CALL INPORT ;CALL PROPER INPUT ROUTINE
POP H ;GET PROGRAM COUNTER BACK
INX H ;UPDATE IT AND STORE IT
SHLD PGMCTR
MOV E,A ;PUUT RETURN VALUE INTO E
MVI D,0 ;ZERO OUT HI-BYTE OF RESULT
POP PSW
ORA A ;TELL CALLER RETURNN VALUE IS 8 BITS
POP H
RET
* TYPE 2 IS AN 8 BIT VARIABLE
ITYPE2: INX H ;GET ADDRESS OF BYTE WANTED INTO DE
MOV E,M
INX H
MOV D,M
INX H ;UPDATE AND SAVE PROGRAM COUNTER
SHLD PGMCTR
XCHG ;GET BYTE'S ADDRESS INTO HL
MOV E,M ;GET BYTE INTO RETURN REG
MVI D,0
POP PSW
ORA A ;RETURN VALUE IS 8 BITS
POP H
RET
*
*TYPE IS 0 OR 1
*
ILESS2: ORA A ;SET PARITY FLAG
JPE ITYPE0 ;IF PARITY IS EVEN, TYPE IS 0
*TYPE 1 IS 8 BIT CONSTANT
ITYPE1: INX H
MOV E,M ;GET BYTE RIGHT AWAY
MVI D,0
INX H ;UPDATE AND STORE PROGRAM COUNTER
SHLD PGMCTR
POP PSW
ORA A ;RETURN VALUE IS 8 BITS; TELL CALLER
POP H
RET
* TYPE 0 IS A 5 BIT CONSTANT
ITYPE0: MOV E,M ;GET CONSTANT
MVI D,0
INX H ;UPDATE AND SAVE PROGRAM COUNTER
SHLD PGMCTR
POP PSW
ORA A ;TELL CALLER THAT RETURN VALUE IS 8 BITS
POP H
RET
*
* THIS ROUTINE TAKES A "STANDARD" PORT NUMBER IN A AND READS A BYTE
* FROM THAT PORT INTO A.
*
INPORT: MOV L,A ;MAKE HL A DISPLACEMENT VALUE
STA SELECT ;USED AT 'FIXRANGE' TIME .
MVI H,0
DAD H
LXI D,IPORTAB ;GET BASE ADDRESS
DAD D ;ADD BASE TO DISP
MOV E,M ;GET ROUTINE @ FROM TABLE
INX H
MOV D,M
XCHG ;INTO HL
PCHL ;JUMP TO DESIGNATED ROUTINE
* TABLE OF INPUT PORT ROUTINES
IPORTAB EQU $
DW CONSTAT,CHARIN,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
DW IJOY1X,IJOY1Y,IJOY2X,IJOY2Y
DW INJOY1Z,INJOY2Z,IAUXSW,ISWREG
DW NOPORT,NOPORT,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
* THIS ROUTINE IS CALLED WHEN A PORT IS ASKED FOR THAT DOESN'T
* EXIST. A NICE ERROR MESSAGE IS PRINTED AND THE INPUT IS IGNORED
NOPORT: LHLD PGMCTR ;DISPLAY THE CCURRENT PROGRAM COUNTER
CALL DISPHL
MOV A,M ;GET PORT NUMBER
ANI DATA5
PUSH PSW ;SAVE IT
LXI H,PCEQ
CALL PRINT ;PRINT "=PC"
LXI H,PORMES
CALL PRINT ;PRINT "ILLEGAL USE OF PORT"
POP PSW ;RESTORE PORT NUMMBER
CALL HEXPRT ;PRINT PORT NUMMBER
CALL CRLF
RET
PCEQ DB '=PC ',STOP
INMESS1 DB '<--PARAMETER TYPE ',STOP
INMESS2 DB ' IS NOT YET IMPLEMENTED',STOP
PORMES DB '<--ILLEGAL USE OF PORT ',STOP
* THE FOLLOWING ROUTINES READ BYTES FROM DEVICES WHICH DO NOT
* ALREADY HAVE CP/M ROUTINES ASSIGNED TO THEM
*
X1 EQU 19H
Y1 EQU 1AH
X2 EQU 1BH
Y2 EQU 1CH
Z1 EQU 1DH
Z2 EQU 1EH
BUTTONS EQU 18H
SWITCH EQU 0FFH
CHARIN: LDA CHAR ;LOOK AT EXEC-TRAPPED CHARACTER.
ORA A ;IS IT ZERO?
JZ GETACHAR
PUSH PSW
XRA A ;SHOW WE GOT IT.
STA CHAR
POP PSW
RET
GETACHAR:CALL CI ;GET ONE
CPI 03H ;CTRL/C?
RNZ
CALL DISPOFF
JMP CPM
*
* GET THE X COORDINATE FROM JOYSTICK 1
*
IJOY1X: IN X1
JMP FIXRANGE
*
* GET THE Y COORDINATE FROM JOYSTICK 1
*
IJOY1Y: IN Y1
JMP FIXRANGE
*
* GET THE X COORDINATE FROM JOYSTICK 2
*
IJOY2X: IN X2
JMP FIXRANGE
*
* GET THE Y COORDINATE FROM JOYSTICK 2
*
IJOY2Y: IN Y2
JMP FIXRANGE
*
*
* GET THE Z COORDINATE FROM JS 1
INJOY1Z:IN Z1
JMP FIXRANGE
* GET THE Z ('THETA')COORD FROM JS 2
INJOY2Z:IN Z2
JMP FIXRANGE
* GET THE BYTE CORRESPONDING TO INPUT FROM THE JOYSTICK BUTTONS
*
IAUXSW: IN BUTTONS
CMA ;"NORMALIZE" IT
RET
*
* GET A BYTE FROM THE SWITCH REGISTER
*
ISWREG: IN SWITCH
RET
; THIS 'RANGE' SET SYSTEM SCALES THE VARIOUS ANALOG (OR ANY OTHER)
; INPUTS IN THIS WAY: IF RANGE IS 0,NO SCALE;RANGE=1,DIVIDE BY
; 2 (SO MAX VAL. IS +-64)...UP TO RANGE=7,MAXVAL=+-1. THE
; RANGE IS SET BY THE 'RESCALE' OP,
;
FIXRANGE:PUSH D
LHLD SELECT ;WHICH DEVICE'S SCALE-FACTOR?
LXI D,RANGTABL
DAD D ;HL POINTS INTO RANGE-TABLE.
MOV E,M ;E HAS RANGE(0-7)
;
DIVLOOP:DCR E
JM GOTIT ;ENOUGH ALREADY
ORA A ;SIGN OF A?
JM NEGCASE
;POSCASE:
ANA A ;CLEAR CARRY
RAR ;DIV BY 2
JMP DIVLOOP
NEGCASE:STC ;SIGN EXTENSION
RAR
JMP DIVLOOP
GOTIT: POP D
RET
SELECT DB 0,0 ;SELECTOR FOR WHICH DEVICE.
;
*
* <OUTPAR>
*
* INPUT CONDITIONS:
*
* THE FPC POINTS TO THE TYPE BYTE OF THE PARAMETER
* THE VALUE TO BE ASSIGNED TO THE PARAMETER IS IN THE D-E PAIR
*
ORG 58B0H
OUTPAR: PUSH H ! PUSH PSW
LHLD PGMCTR ;LOOK AT TYPE BYTE OF CURRENT PARMM
MOV A,M
ANI TYPBITS ;REMOVE ALL BUT TYPE CODE BITS
ADD A ;ADJUST AS IN "INPAR"
JNC OLESS4
JP OLESS6
ORA A ;SET PARITY
JPO OTYPE6
*
* TYPE 7 PARM REFERS TO REGISTER CONTENTS
* TYPE 4 IS A 16 BIT ARRAY, INDEXED BY THE REGISTER CONTENTS
* OUTPAR CALLS INREG, WHICH INSERTS THE CONTENTS OF THE D-E PAIR
* INTO THE APPROPRIATE MEMORY LOCATION/REGISTER
*
OTYPE47: PUSH B! PUSH H
MOV C,M ; C HAS 'TYPE' BYTE.
CALL INREG
POP H! POP B
INX H
SHLD PGMCTR
POP PSW
POP H
RET
*
* TYPE 6 IS A 16 BIT VARIABLE
OTYPE6: PUSH D ;SAVE VALUE
INX H ;GET ADDRESS OF WORD WANTED IN DE
MOV E,M
INX H
MOV D,M
INX H ;UPDATE AND SAVE PROGRAM COUNTER
SHLD PGMCTR
XCHG ;GET WORD @ INTO HL
POP D ;GET VALUE BACK
MOV M,E ;STORE DE VALUE INTO SPECIFIED WORD
INX H
MOV M,D
POP PSW
POP H
RET
*
* TYPE IS EITHER 4 OR 5
*
OLESS6: ORA A ;SET PARITY
JPE OTYPE47
* TYPE 5 IS A 16 BIT CONSTANT (ILLEGAL)
OTYPE5: CALL NOCONS
INX H ;UPDATE AND STORE THE PROGRAM COUNTER
INX H
INX H
SHLD PGMCTR
POP PSW
POP H
RET
*
* TYPE IS 0, 1, 2, OR 3
*
OLESS4: JP OLESS2
ORA A ;SET PARITY
JPO OTYPE2
* TYPE 3 IS OUTPUT PORT
* THESE ARE "STANDARDIZED" AS BELOW IN ORDER TO ACCESS
* I/O PORTS IN A MACHINE INDEPENDENT FASHION
* 1 PRINT A CHARACTER ON THE CONSOLE
* 8 SPEAKER ON JOYSTICK 1
* A SPEAKER ON JOYSTICK 1
* F PANEL LIGHTS
OTYPE3: PUSH H ;GET PROGRAM COUNTER OUT OF WAY
MOV A,M ;GET PORT # INTO A
ANI DATA5
CALL OUTPORT ;CALL PROPER OUTPUT ROUTINE
POP H ;RETRIEVE PROGRAM COUNTER
INX H ;UPDATE AND STORE IT
SHLD PGMCTR
POP PSW
POP H
RET
* TYPE 2 IS AN 8 BIT VARIABLE
OTYPE2: PUSH D ;SAVE VALUE
INX H ;GET ADDRESS OF WANTED BYTE INTO DE
MOV E,M
INX H
MOV D,M
INX H ;UPDATE AND SAVE PC
SHLD PGMCTR
XCHG ;GET ADDRESS INTO HL
POP D ;GET VALUE BACK
MOV M,E ;PUT BYTE WHER IT BELONGS
POP PSW
POP H
RET
*
* TYPE IS EITHER 1 OR 0
*
OLESS2: ORA A ;SET PARITY
JPE OTYPE0
* TYPE 1 IS AN 8 BIT CONSTANT (ILLEGAL)
OTYPE1: CALL NOCONS
INX H
INX H
SHLD PGMCTR
POP PSW
POP H
RET
OTYPE0: CALL NOCONS
INX H
SHLD PGMCTR
POP PSW
POP H
RET
*THIS ROUTINE HANDLES ILLEGAL "OUTS" (I.E. TO CONSTANTS)
NOCONS: PUSH H
MOV A,M ;GET FRESH COPY
ANI TYPBITS
RLC ! RLC ! RLC ;GET TYPE CODE # INTO LO BITS OF A
PUSH PSW ;SAVE IT
CALL DISPHL ;PRINT THE PROGRAM COUNTER
LXI H,PCEQ
CALL PRINT ;PRINT "=PC"
LXI H,INMESS1
CALL PRINT ;PRINT "PARM TYPE"
POP PSW ;RETRIEVE PARM TYPE
CALL HEXPRT ;PRINT THE PARM TYPE #
LXI H,CONMES
CALL PRINT ;PRINT "IS A CONSTANT...ILLEGAL"
XCHG
CALL DISPHL ;DISPLAY VALUE WANTING STORAGE
XCHG
LXI H,CONMES2
CALL PRINT
CALL CRLF
POP H
RET
CONMES DB ' IS A CONSTANT. ATTEMPT TO STORE VALUE ',STOP
CONMES2 DB ' ABORTED',STOP
* THIS ROUTINE TAKES A "STANDARD" OUTPUT PORT NUMBER IN A AND
* WRITES THE BYTE IN E TO THE GIVEN DEVICE
OUTPORT: MOV L,A ;MMAKE HL A DISPLACEMENT VALUE
MVI H,0
DAD H
MOV A,E ;GET OUTPUT VALUE INTO A
LXI D,OPORTAB ;GET BASE ADDRESS
DAD D ;ADD BASE TO DISP
MOV E,M ;GGET ROUTINE @ FROM TABLE
INX H
MOV D,M
XCHG ;INTO HL
PCHL ;JUMP TO PROPER ROUTINE
OPORTAB EQU $
DW NOPORT,CO,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
DW SPEAKR1,NOPORT,SPEAKR2,NOPORT
DW NOPORT,NOPORT,NOPORT,LIGHTS
DW NOPORT,NOPORT,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
DW NOPORT,NOPORT,NOPORT,NOPORT
SPEAKR1: OUT X1
RET
SPEAKR2: OUT X2
RET
PANEL EQU 0FFH
LIGHTS: CMA
OUT PANEL
RET