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 >
Assembly Source File  |  1984-04-29  |  11KB  |  476 lines

  1. ; 7 SEPT,NIGHT.I RE-REPAIR CHARIN...
  2. ;
  3. ; FIX TO INCORPORATE TYPE 4 AND TYPE 7
  4. ; BY CHANDRA AND MCCHAREN ON AUGUST 25 '79
  5. ;
  6. ; PARM: INPARM & OUTPARM BY WITTENBERG. SOME
  7. ; FIXES (INCLUDING THE 'RESCALE' OP IMBEDDED) BY
  8. ; MOSHELL.
  9. ;
  10. ; INPUT CONDITIONS:
  11. ;
  12. ; PGMCTR ( OR FPC ) POINTS TO THE 'TYPE' BYTE OF THE PARAMETER.
  13. ;
  14. ; OUTPUT CONDITIONS:
  15. ;
  16. ; INPAR RETURNS THE VALUE OF THE PARAMETER IN D-E.
  17. ;
  18. PGMCTR    EQU    110H
  19. TYPBITS    EQU    0E0H
  20. DATA5    EQU    01FH
  21. CONSTAT    EQU    503FH
  22. CPM    EQU    0H
  23. DISPOFF    EQU    5057H
  24. CHAR    EQU    5094H
  25. CO    EQU    502AH
  26. CI    EQU    5027H
  27. CRLF    EQU    5024H
  28. PRINT    EQU    502DH
  29. HEXPRT    EQU    5042H
  30. DISPHL    EQU    5045H
  31. RANGTABL EQU    2F70H
  32. STOP    EQU    '$'
  33. INREG   EQU     4C06H
  34. OUTREG   EQU     4D66H
  35. *
  36.     ORG    5700H
  37. INPAR:    PUSH    H ! PUSH PSW
  38.     LHLD    PGMCTR    ;LOOK AT FIRST (TYPE) BYTE OF CURRENT PARM
  39.     MOV    A,M
  40.     ANI    TYPBITS    ;REMOVE ALL BUT TYPE CODE BITS
  41.     ADD    A    ;ADJUST SO THAT TYPE BITS SET CY,SIGN,& PPARITY FLAGS
  42.     JNC    ILESS4    ;IF CY NOT SET, TYPE # < 4
  43.     JP    ILESS6    ;IF SIGN NOT SET, TYPE 4 OR 5
  44.     ORA    A    ;SET PARITY FLAG
  45.     JPO    ITYPE6    ;IF PARITY ODD, TYPE IS 6
  46. *
  47. *  TYPE4 IS ARRAY, INDEXED BY ONE OF THE REGISTER CONTENTS
  48. * TYPE 7 REFERS TO REGISTER CONTENTS
  49. * INPAR CALLS OUTREG WITH THE PARMETER HEADER IN REG C
  50. * OUTREG RETURNS THE PARAMETER VALUE AS FOLLOWS:
  51. * REG A - LOW ORDER BYTE
  52. * REG B - HIGH ORDER BYTE
  53. *
  54. ITYPE47:   PUSH    B!    PUSH    H
  55.        MOV   C,M     ; PICK UP PARAMETER -HEADER.
  56.            CALL  OUTREG  ; OUTREG RETURNS THE PARM-VALUE IN 
  57.            MOV   E,A     ; A ( LOW ORDER BYTE ) & B ( HIGH ORDER BYTE )
  58.            MOV   D,B
  59.        POP    H    !POP    B
  60.        INX    H
  61.        SHLD PGMCTR
  62.            POP   PSW
  63.            POP   H
  64.            RET
  65. * TYPE 6 PARM IS A 16 BIT VARIABLE
  66. ITYPE6:    INX    H    ;GET ADDR. OF WORD WANTED TO RETURN
  67.     MOV    E,M
  68.     INX    H
  69.     MOV    D,M
  70.     INX    H    ;SAVE NEW PROGRAM COUNTER
  71.     SHLD    PGMCTR
  72.     XCHG        ;GET ADDRESS OF WANTED WORD INTO HL
  73.     MOV    E,M    ;GET WORD INNTO DE
  74.     INX    H
  75.     MOV    D,M
  76.     POP    PSW    ;RESTORE REGS AND RETURN
  77.     STC        ;TELL CALLER THAT VALUE IS 16 BITS
  78.     POP    H
  79.     RET
  80. *
  81. *  TYPE IS EITHER 4 OR 5
  82. ILESS6: ORA     A       ; SET THE PARITY FLAG
  83.         JPE     ITYPE47 ; IF THE PARITY IS EVEN,TYPE 4.
  84. *
  85. * TYPE 5 IS 16 BIT CONSTANT.
  86. *
  87. ITYPE5: INX     H       ; GET NEXT 16 BITS INTO D-E
  88.     MOV    E,M
  89.     INX    H
  90.     MOV    D,M
  91.     INX    H    ;UPDATE PROGRAM COUNTER
  92.     SHLD    PGMCTR
  93.     POP    PSW
  94.     STC        ;TELL CALLER THAT PPARM IS 16 BIT VALUE
  95.     POP    H
  96.     RET
  97. *
  98. * TYPE IS 0, 1, 2, OR 3
  99. *
  100. ILESS4:    JP    ILESS2    ;IF SIGN NOT SET, MUST BE 0 OR 1
  101.     ORA    A    ;SET PARITY FLAG
  102.     JPO    ITYPE2    ;IF PARITY ODD, TYPE MUST BE 2
  103. * TYPE 3 IS AN INPUT PORT
  104. * THESE ARE "STANDARDIZED" AS BELOW IN ORDER TO ACCESS
  105. * PORT INPUTS IN A MACHINE INDEPENDENT FASHION
  106. *    0  CONSOLE CTRL & STATUS: BIT 0=1 IF IN-DATA IS READY, 0 ELSE
  107. *    1  CONSOLE DATA (WAIT-LOOP AND ECHO BUILT IN)
  108. *    8  X1 \
  109. *    9  Y1  \
  110. *    A  X2   A/D CONVERTER (JOYSTICKS)
  111. *    B  Y2  /
  112. *    C  Z1  (EXTRA A/D CHANNEL ON JS-1...UNUSED NOW)
  113. *    D  Z2  ('POT' ON JS-2;USED FOR 'THETA')
  114. *    E  AUXILIARY SWITCH REG. (E.G. ON JOYSTICKS)
  115. *    F  SWITCH REGISTER
  116. ITYPE3:    PUSH    H    ;GET PROGRAM COUNTER OUT OF THE 0T OF FIRE
  117.     MOV    A,M    ;GET PORT NUMBER INTO A
  118.     ANI    DATA5
  119.     CALL    INPORT    ;CALL PROPER INPUT ROUTINE
  120.     POP    H    ;GET PROGRAM COUNTER BACK
  121.     INX    H    ;UPDATE IT AND STORE IT
  122.     SHLD    PGMCTR
  123.     MOV    E,A    ;PUUT RETURN VALUE INTO E
  124.     MVI    D,0    ;ZERO OUT HI-BYTE OF RESULT
  125.     POP    PSW
  126.     ORA    A    ;TELL CALLER RETURNN VALUE IS 8 BITS
  127.     POP    H
  128.     RET
  129. * TYPE 2 IS AN 8 BIT VARIABLE
  130. ITYPE2:    INX    H    ;GET ADDRESS OF BYTE WANTED INTO DE
  131.     MOV    E,M
  132.     INX    H
  133.     MOV    D,M
  134.     INX    H    ;UPDATE AND SAVE PROGRAM COUNTER
  135.     SHLD    PGMCTR
  136.     XCHG        ;GET BYTE'S ADDRESS INTO HL
  137.     MOV    E,M    ;GET BYTE INTO RETURN REG
  138.     MVI    D,0
  139.     POP    PSW
  140.     ORA    A    ;RETURN VALUE IS 8 BITS
  141.     POP    H
  142.     RET
  143. *
  144. *TYPE IS 0 OR 1
  145. *
  146. ILESS2:    ORA    A    ;SET PARITY FLAG
  147.     JPE    ITYPE0    ;IF PARITY IS EVEN, TYPE IS 0
  148. *TYPE 1 IS 8 BIT CONSTANT
  149. ITYPE1:    INX    H
  150.     MOV    E,M    ;GET BYTE RIGHT AWAY
  151.     MVI    D,0
  152.     INX    H    ;UPDATE AND STORE PROGRAM COUNTER
  153.     SHLD    PGMCTR
  154.     POP    PSW
  155.     ORA    A    ;RETURN VALUE IS 8 BITS; TELL CALLER
  156.     POP    H
  157.     RET
  158. * TYPE 0 IS A 5 BIT CONSTANT
  159. ITYPE0:    MOV    E,M    ;GET CONSTANT
  160.     MVI    D,0
  161.     INX    H        ;UPDATE AND SAVE PROGRAM COUNTER
  162.     SHLD    PGMCTR
  163.     POP    PSW
  164.     ORA    A        ;TELL CALLER THAT RETURN VALUE IS 8 BITS
  165.     POP    H
  166.     RET
  167. *
  168. * THIS ROUTINE TAKES A "STANDARD" PORT NUMBER IN A AND READS A BYTE
  169. * FROM THAT PORT INTO A.
  170. *
  171. INPORT:    MOV    L,A    ;MAKE HL A DISPLACEMENT VALUE
  172.     STA    SELECT    ;USED AT 'FIXRANGE' TIME .
  173.     MVI    H,0
  174.     DAD    H
  175.     LXI    D,IPORTAB ;GET BASE ADDRESS
  176.     DAD    D    ;ADD BASE TO DISP
  177.     MOV    E,M    ;GET ROUTINE @ FROM TABLE
  178.     INX    H
  179.     MOV    D,M
  180.     XCHG        ;INTO HL
  181.     PCHL        ;JUMP TO DESIGNATED ROUTINE
  182. * TABLE OF INPUT PORT ROUTINES
  183. IPORTAB    EQU    $
  184.     DW    CONSTAT,CHARIN,NOPORT,NOPORT
  185.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  186.     DW    IJOY1X,IJOY1Y,IJOY2X,IJOY2Y
  187.     DW    INJOY1Z,INJOY2Z,IAUXSW,ISWREG
  188.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  189.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  190.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  191.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  192. * THIS ROUTINE IS CALLED WHEN A PORT IS ASKED FOR THAT DOESN'T
  193. * EXIST.  A NICE ERROR MESSAGE IS PRINTED AND THE INPUT IS IGNORED
  194. NOPORT:    LHLD    PGMCTR    ;DISPLAY THE CCURRENT PROGRAM COUNTER
  195.     CALL    DISPHL
  196.     MOV    A,M    ;GET PORT NUMBER
  197.     ANI    DATA5
  198.     PUSH    PSW    ;SAVE IT
  199.     LXI    H,PCEQ
  200.     CALL    PRINT    ;PRINT "=PC"
  201.     LXI    H,PORMES
  202.     CALL    PRINT    ;PRINT "ILLEGAL USE OF PORT"
  203.     POP    PSW    ;RESTORE PORT NUMMBER
  204.     CALL    HEXPRT    ;PRINT PORT NUMMBER
  205.     CALL    CRLF
  206.     RET
  207. PCEQ    DB    '=PC ',STOP
  208. INMESS1    DB    '<--PARAMETER TYPE ',STOP
  209. INMESS2    DB    ' IS NOT YET IMPLEMENTED',STOP
  210. PORMES    DB    '<--ILLEGAL USE OF PORT ',STOP
  211. * THE FOLLOWING ROUTINES READ BYTES FROM DEVICES WHICH DO NOT
  212. * ALREADY HAVE CP/M ROUTINES ASSIGNED TO THEM
  213. *
  214. X1    EQU    19H
  215. Y1    EQU    1AH
  216. X2    EQU    1BH
  217. Y2    EQU    1CH
  218. Z1    EQU    1DH
  219. Z2    EQU    1EH
  220. BUTTONS    EQU    18H
  221. SWITCH    EQU    0FFH
  222. CHARIN:    LDA    CHAR    ;LOOK AT EXEC-TRAPPED CHARACTER.
  223.     ORA    A    ;IS IT ZERO?
  224.     JZ    GETACHAR
  225.     PUSH    PSW
  226.     XRA    A    ;SHOW WE GOT IT.
  227.     STA    CHAR
  228.     POP    PSW
  229.     RET
  230. GETACHAR:CALL    CI    ;GET ONE
  231.     CPI    03H    ;CTRL/C?
  232.     RNZ
  233.     CALL    DISPOFF
  234.     JMP    CPM
  235. *
  236. * GET THE X COORDINATE FROM JOYSTICK 1
  237. *
  238. IJOY1X:    IN    X1
  239.     JMP    FIXRANGE
  240. *
  241. * GET THE Y COORDINATE FROM JOYSTICK 1
  242. *
  243. IJOY1Y:    IN    Y1
  244.     JMP    FIXRANGE
  245. *
  246. * GET THE X COORDINATE FROM JOYSTICK 2
  247. *
  248. IJOY2X:    IN    X2
  249.     JMP    FIXRANGE
  250. *
  251. * GET THE Y COORDINATE FROM JOYSTICK 2
  252. *
  253. IJOY2Y:    IN    Y2
  254.     JMP    FIXRANGE
  255. *
  256. *
  257. * GET THE Z COORDINATE FROM JS 1
  258. INJOY1Z:IN    Z1
  259.     JMP    FIXRANGE
  260. * GET THE Z ('THETA')COORD FROM JS 2
  261. INJOY2Z:IN    Z2
  262.     JMP    FIXRANGE
  263. * GET THE BYTE CORRESPONDING TO INPUT FROM THE JOYSTICK BUTTONS
  264. *
  265. IAUXSW:    IN    BUTTONS
  266.     CMA        ;"NORMALIZE" IT
  267.     RET
  268. *
  269. * GET A BYTE FROM THE SWITCH REGISTER
  270. *
  271. ISWREG:    IN    SWITCH
  272.     RET
  273. ; THIS 'RANGE' SET SYSTEM SCALES THE VARIOUS ANALOG (OR ANY OTHER)
  274. ; INPUTS IN THIS WAY: IF RANGE IS 0,NO SCALE;RANGE=1,DIVIDE BY
  275. ; 2 (SO MAX VAL. IS +-64)...UP TO RANGE=7,MAXVAL=+-1. THE
  276. ; RANGE IS SET BY THE 'RESCALE' OP,
  277. ;
  278. FIXRANGE:PUSH    D
  279.     LHLD    SELECT    ;WHICH DEVICE'S SCALE-FACTOR?
  280.     LXI    D,RANGTABL
  281.     DAD    D    ;HL POINTS INTO RANGE-TABLE.
  282.     MOV    E,M    ;E HAS RANGE(0-7)
  283. ;
  284. DIVLOOP:DCR    E
  285.     JM    GOTIT    ;ENOUGH ALREADY
  286.     ORA    A    ;SIGN OF A?
  287.     JM    NEGCASE
  288. ;POSCASE:
  289.     ANA    A    ;CLEAR CARRY
  290.     RAR        ;DIV BY 2
  291.     JMP    DIVLOOP
  292. NEGCASE:STC        ;SIGN EXTENSION
  293.     RAR
  294.     JMP    DIVLOOP
  295. GOTIT:    POP    D
  296.     RET
  297. SELECT    DB    0,0    ;SELECTOR FOR WHICH DEVICE.
  298. ;
  299. *
  300. * <OUTPAR>
  301. *
  302. * INPUT CONDITIONS:
  303. * THE FPC POINTS TO THE TYPE BYTE OF THE PARAMETER
  304. * THE VALUE TO BE ASSIGNED TO THE PARAMETER IS IN THE D-E PAIR
  305. *
  306.     ORG    58B0H
  307. OUTPAR:    PUSH    H ! PUSH PSW
  308.     LHLD    PGMCTR    ;LOOK AT TYPE BYTE OF CURRENT PARMM
  309.     MOV    A,M
  310.     ANI    TYPBITS    ;REMOVE ALL BUT TYPE CODE BITS
  311.     ADD    A    ;ADJUST AS IN "INPAR"
  312.     JNC    OLESS4
  313.     JP    OLESS6
  314.     ORA    A    ;SET PARITY
  315.     JPO    OTYPE6
  316. *
  317. * TYPE 7 PARM REFERS TO REGISTER CONTENTS
  318. * TYPE 4 IS A 16 BIT ARRAY, INDEXED BY THE REGISTER CONTENTS
  319. * OUTPAR CALLS INREG, WHICH INSERTS THE CONTENTS OF THE D-E PAIR 
  320. * INTO THE APPROPRIATE MEMORY LOCATION/REGISTER
  321. *
  322. OTYPE47: PUSH    B!    PUSH    H
  323.      MOV C,M      ; C HAS 'TYPE' BYTE.
  324.          CALL INREG
  325.      POP    H!    POP    B
  326.      INX    H
  327.      SHLD    PGMCTR
  328.          POP  PSW
  329.          POP  H
  330.          RET
  331. *
  332. * TYPE 6 IS A 16 BIT VARIABLE
  333. OTYPE6:    PUSH    D    ;SAVE VALUE
  334.     INX    H    ;GET ADDRESS OF WORD WANTED IN DE
  335.     MOV    E,M
  336.     INX    H
  337.     MOV    D,M
  338.     INX    H    ;UPDATE AND SAVE PROGRAM COUNTER
  339.     SHLD    PGMCTR
  340.     XCHG        ;GET WORD @ INTO HL
  341.     POP    D    ;GET VALUE BACK
  342.     MOV    M,E    ;STORE DE VALUE INTO SPECIFIED WORD
  343.     INX    H
  344.     MOV    M,D
  345.     POP    PSW
  346.     POP    H
  347.     RET
  348. *
  349. * TYPE IS EITHER 4 OR 5
  350. *
  351. OLESS6:    ORA    A    ;SET PARITY
  352.     JPE    OTYPE47
  353. * TYPE 5 IS A 16 BIT CONSTANT (ILLEGAL)
  354. OTYPE5:    CALL    NOCONS
  355.     INX    H    ;UPDATE AND STORE THE PROGRAM COUNTER
  356.     INX    H
  357.     INX    H
  358.     SHLD    PGMCTR
  359.     POP    PSW
  360.     POP    H
  361.     RET
  362. *
  363. * TYPE IS 0, 1, 2, OR 3
  364. *
  365. OLESS4:    JP    OLESS2
  366.     ORA    A    ;SET PARITY
  367.     JPO    OTYPE2
  368. * TYPE 3 IS OUTPUT PORT
  369. * THESE ARE "STANDARDIZED" AS BELOW IN ORDER TO ACCESS
  370. * I/O PORTS IN A MACHINE INDEPENDENT FASHION
  371. *    1  PRINT A CHARACTER ON THE CONSOLE
  372. *    8  SPEAKER ON JOYSTICK 1
  373. *    A  SPEAKER ON JOYSTICK 1
  374. *    F  PANEL LIGHTS
  375. OTYPE3:    PUSH    H    ;GET PROGRAM COUNTER OUT OF WAY
  376.     MOV    A,M    ;GET PORT # INTO A
  377.     ANI    DATA5
  378.     CALL    OUTPORT    ;CALL PROPER OUTPUT ROUTINE
  379.     POP    H    ;RETRIEVE PROGRAM COUNTER
  380.     INX    H    ;UPDATE AND STORE IT
  381.     SHLD    PGMCTR
  382.     POP    PSW
  383.     POP    H
  384.     RET
  385. * TYPE 2 IS AN 8 BIT VARIABLE
  386. OTYPE2:    PUSH    D    ;SAVE VALUE
  387.     INX    H    ;GET ADDRESS OF WANTED BYTE INTO DE
  388.     MOV    E,M
  389.     INX    H
  390.     MOV    D,M
  391.     INX    H    ;UPDATE AND SAVE PC
  392.     SHLD    PGMCTR
  393.     XCHG        ;GET ADDRESS INTO HL
  394.     POP    D    ;GET VALUE BACK
  395.     MOV    M,E    ;PUT BYTE WHER IT BELONGS
  396.     POP    PSW
  397.     POP    H
  398.     RET
  399. *
  400. * TYPE IS EITHER 1 OR 0
  401. *
  402. OLESS2:    ORA    A    ;SET PARITY
  403.     JPE    OTYPE0
  404. * TYPE 1 IS AN 8 BIT CONSTANT (ILLEGAL)
  405. OTYPE1:    CALL    NOCONS
  406.     INX    H
  407.     INX    H
  408.     SHLD    PGMCTR
  409.     POP    PSW
  410.     POP    H
  411.     RET
  412. OTYPE0:    CALL    NOCONS
  413.     INX    H
  414.     SHLD    PGMCTR
  415.     POP    PSW
  416.     POP    H
  417.     RET
  418. *THIS ROUTINE HANDLES ILLEGAL "OUTS" (I.E. TO CONSTANTS)
  419. NOCONS:    PUSH    H
  420.     MOV    A,M    ;GET FRESH COPY
  421.     ANI    TYPBITS
  422.     RLC    ! RLC    ! RLC    ;GET TYPE CODE # INTO LO BITS OF A
  423.     PUSH    PSW    ;SAVE IT
  424.     CALL    DISPHL    ;PRINT THE PROGRAM COUNTER
  425.     LXI    H,PCEQ
  426.     CALL    PRINT    ;PRINT "=PC"
  427.     LXI    H,INMESS1
  428.     CALL    PRINT    ;PRINT "PARM TYPE"
  429.     POP    PSW    ;RETRIEVE PARM TYPE
  430.     CALL    HEXPRT    ;PRINT THE PARM TYPE #
  431.     LXI    H,CONMES
  432.     CALL    PRINT    ;PRINT "IS A CONSTANT...ILLEGAL"
  433.     XCHG
  434.     CALL    DISPHL    ;DISPLAY VALUE WANTING STORAGE
  435.     XCHG
  436.     LXI    H,CONMES2
  437.     CALL    PRINT
  438.     CALL    CRLF
  439.     POP    H
  440.     RET
  441. CONMES    DB    ' IS A CONSTANT.  ATTEMPT TO STORE VALUE ',STOP
  442. CONMES2    DB    ' ABORTED',STOP
  443. * THIS ROUTINE TAKES A "STANDARD" OUTPUT PORT NUMBER IN A AND 
  444. * WRITES THE BYTE IN E TO THE GIVEN DEVICE
  445. OUTPORT: MOV    L,A    ;MMAKE HL A DISPLACEMENT VALUE
  446.     MVI    H,0
  447.     DAD    H
  448.     MOV    A,E    ;GET OUTPUT VALUE INTO A
  449.     LXI    D,OPORTAB ;GET BASE ADDRESS
  450.     DAD    D    ;ADD BASE TO DISP
  451.     MOV    E,M    ;GGET ROUTINE @ FROM TABLE
  452.     INX    H
  453.     MOV    D,M
  454.     XCHG        ;INTO HL
  455.     PCHL        ;JUMP TO PROPER ROUTINE
  456. OPORTAB    EQU    $
  457.     DW    NOPORT,CO,NOPORT,NOPORT
  458.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  459.     DW    SPEAKR1,NOPORT,SPEAKR2,NOPORT
  460.     DW    NOPORT,NOPORT,NOPORT,LIGHTS
  461.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  462.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  463.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  464.     DW    NOPORT,NOPORT,NOPORT,NOPORT
  465. SPEAKR1: OUT    X1
  466.     RET
  467. SPEAKR2: OUT    X2
  468.     RET
  469. PANEL    EQU    0FFH
  470. LIGHTS:    CMA
  471.     OUT    PANEL
  472.     RET
  473.