home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug018.ark / PROCSELF.ASM < prev    next >
Assembly Source File  |  1985-02-10  |  46KB  |  1,984 lines

  1. ;
  2. ;    THIS IS THE PROCESSOR TECHNOLOGY SELF CONTAINED SYSTEM
  3. ;      (ALSO CALLED SOFTWARE PACKAGE NO. 1)
  4. ;
  5. ; THIS ROUTINE INITILALIZES THE FILE AREA FOR SUBSEQUENT PROCESSING
  6.     ORG    100H
  7. INITA:
  8.     MVI    A,3
  9.     OUT    20Q
  10.     MVI    A,21Q
  11.     OUT    20Q        ;SET UP ACIA
  12.     LXI    H,FILE0
  13.     MVI    C,MAXFIL*FELEN
  14.     XRA    A
  15. INIT2:    MOV    M,A
  16.     INX    H
  17.     DCR    C
  18.     JNZ    INIT2
  19. ; THIS IS THE STARTING POINT OF THE SELF CONTAINED SYSTEM ONCE
  20. ; THE SYSTEM HAS BEEN INITIALIZED.  COMMANDS ARE READ FROM THE USER,
  21. ; EXECUTED, AND CONTROL RETURNS BACK TO THIS POINT TO READ ANOTHER
  22. ; USER COMMAND.
  23. ;
  24. SYS8:    LXI    SP,AREA+18
  25.     CALL    READ        ;READ INPUT LINE
  26.     INX    H
  27.     MOV    A,M        ;FETCH FIRST CHARACTER
  28.     CPI    '9'+1        ;COMMAND OR LINE NUMBER
  29.     JC    LINE        ;JUMP IF LINE FOR FILE
  30.     CALL    VALC        ;GET COMMAND VALUES
  31.     CALL    COMM        ;CHECK LEGAL COMMANDS
  32. EOR:    CALL    CRLF        ;GET HERE WHEN ROUTINE IS DONE
  33.     JMP    SYS8
  34. ; THIS ROUTINE READS IN A LINE FROM THE TTY AND PLACES IT IN AN
  35. ; INPUT BUFFER
  36. ; THE FOLLOWING ARE SPECIAL CHARACTERS
  37. ;     CR    - TERMINATES READ ROUTINE
  38. ;     LF    - NOT RECOGNIZED BY ROUTINE
  39. ; CONTROL X - DELETE CURRENT LINE
  40. ; DEL       - DELETE CHARACTER
  41. ; ALL DISPLAYABLE CHARACTERS BETWEEN BLANK-Z AND THE ABOVE
  42. ; ARE RECOGNIZED BY THE READ ROUTINE.  ALL OTHERS ARE SKIPPED
  43. ; THE ROUTINE WILL NOT ACCEPT MORE CHARACTERS THAN THE INPUT
  44. ; BUFFER WILL HOLD.
  45. READ:    LXI    H,IBUF        ;SET INPUT BUFFER ADDRESS
  46.     SHLD    ADDS        ;SAVE ADDRESS
  47.     MVI    E,2        ;INITIALIZE CHAR COUNT
  48. NEXT:    CALL    IN8        ;READ A LINE
  49.     MOV    A,B
  50.     CPI    24        ;CHECK FOR CONTROL X
  51.     JNZ    CR
  52.     CALL    CRLF        ;OUTPUT A CRLF
  53.     JMP    READ
  54. CR:    CPI    ASCR        ;GET AN ASCII CR
  55.     JNZ    DEL
  56.     MOV    A,L
  57.     CPI    IBUF AND 0FFH
  58.     JZ    READ
  59.     MVI    M,ASCR        ;PLACE CR AT END OF LINE
  60.     INX    H
  61.     MVI    M,1        ;PLACE OEF INDICATOR IN LINE
  62.     INX    H
  63.     MVI    A,IBUF+83
  64.     CALL    CLER        ;CLEAR REMAINING BUFFER
  65.     LXI    H,IBUF-1
  66.     MOV    M,E        ;SAVE CHAR COUNT
  67.     RET
  68. DEL:    CPI    127        ;CHECK FOR DELETE CHAR
  69.     JNZ    CHAR
  70.     MVI    A,IBUF
  71.     CMP    L        ;IS THIS FIRST CHAR
  72.     JZ    NEXT
  73.     DCX    H        ;DECR POINTER
  74.     DCR    E        ;DECR COUNT
  75. BSPA:    MVI    B,5FH
  76.     CALL    OUT8
  77.     JMP    NEXT
  78. CHAR:    CPI    ' '        ;CHECK FOR LEGAL CHAR
  79.     JC    NEXT
  80.     CPI    'Z'+1
  81.     JNC    NEXT
  82.     MOV    B,A
  83.     CALL    OUT8        ;ECHO CHAR
  84.     MOV    M,A
  85.     MVI    A,IBUF+81
  86.     CMP    L        ;CHECK FOR END OF LINE
  87.     JZ    BSPA
  88.     INX    H
  89.     INR    E        ;INCR CHAR COUNT
  90.     JMP    NEXT
  91. ; THIS ROUTINE IS USED TO BLANK OUT A PORTION OF MEMORY
  92. CLER:    CMP    L
  93.     RZ
  94.     MVI    M,' '
  95.     INX    H
  96.     JMP    CLER
  97. ; THIS ROUTINE IS USED TO READ BYTE OF DATA FROM THE UART
  98. IN8:
  99.     IN    20Q        ;GET STATUS
  100.     RRC        ;MOVE INTO CARRY
  101.     JNC    IN8
  102.     IN    21Q        ;GET THE DATA
  103.     ANI    7FH        ;MASK OFF PARITY BIT
  104.     MOV    B,A
  105.     RET
  106. ; THIS ROUTINE OUTPUTS A BYTE OF DATA TO THE UART
  107. OUT8:
  108.     IN    20Q        ;GET STATUS
  109.     RRC
  110.     RRC
  111.     JNC    OUT8
  112. OK:    MOV    A,B
  113.     OUT    21Q        ;SEND OUT THE DATA
  114.     RET
  115. ;
  116. ;  THIS ROUTINE WILL OUTPUT A CARRIAGE RETURN AND LINE FEED
  117. ; FOLLOWED BY TWO DELETE CHARACTERS WHICH PROVIDE TIME FOR A 
  118. ; PRINT HEAD TO RETURN
  119. CRLF:    MVI    B,13        ;CR
  120.     CALL    OUT8
  121. LF:    MVI    B,10        ;LF
  122.     CALL    OUT8
  123.     MVI    B,127
  124.     CALL    OUT8
  125.     CALL    OUT8
  126.     RET
  127. ; THIS ROUTINE JUMPS TO A LOCATION IN MEMORY GIVEN BY THE
  128. ; INPUT COMMAND 
  129. EXEC:    CALL    VCHK        ;CHECK FOR PARAMETER
  130.     CALL    CRLF
  131.     LHLD    BBUF        ;FETCH ADDRESS
  132.     PCHL        ;JUMP TO PROGRAM
  133. ; THIS ROUTINES CHECKS THE INPUT COMMAND AGAINST ALL LEGAL COMMANDS
  134. ; STORED IN A TABLE.  IF A LEGAL COMMAND IS FOUND A JUMP IS
  135. ; MADE TO THAT ROUTINE; OTHERWISE AN ERROR MESSAGE IS OUTPUT
  136. ; TO THE USER
  137. COMM:    LXI    D,CTAB        ;COMMAND TABLE ADDRESS
  138.     MVI    B,NCOM        ;NUMBER OF COMMANDS
  139.     MVI    A,4        ;LENGTH OF COMMAND
  140.     STA    NCHR        ;SAVE
  141.     CALL    COMS        ;SEARCH TABLE
  142.     JNZ    WHAT        ;JUMP IF ILLEGAL COMMAND
  143.     PCHL        ;JUMP TO ROUTINE
  144. ; THIS ROUTINE CHECKS IF A BASE CHARACTER STRING IS EQUAL TO 
  145. ; ANY OF THE STRINGS CONTAINED IN A TABLE POINTED TO BY
  146. ; D,E.  THE LENGTH OF THE STRINGS ARE <256.  ON RETURN IF THE 
  147. ; ZERO FLAG IS SET A MATCH WAS FOUND; IF THE ZERO FLAG IS CLEAR,
  148. ; NO MATCH WAS FOUND.  REGISTER B CONTAINS THE NUMBER OF 
  149. ; STRINGS TO COMPARE.
  150. ; THE TABLE CONSISTS OF ANY NUMBER OF CHARS, WITH 2 BYTES CONTAINING
  151. ; VALUES ASSOCIATED WITH IT.  IT CAN BE USED TO SEARCH THROUGH 
  152. ; A COMMAND TABLE OR SYMBOL TABLE.
  153. ; ON RETURN D,E POINT TO THE LAST BYTE ASSOCIATED WITH THE CHARACTER
  154. ; STRING IF A MATCH WAS FOUND.  IF NO MATCH WAS FOUND, D,E POINT TO 
  155. ; THE NEXT LOCATION AFTER THE END OF THE TABLE.
  156. COMS:    LHLD    ADDS        ;FETCH COMPARE ADDRESS
  157.     LDA    NCHR        ;GET LENGTH OF STRING
  158.     MOV    C,A
  159.     CALL    SEAR        ;COMPARE STRINGS
  160.     LDAX    D
  161.     MOV    L,A
  162.     INX    D
  163.     LDAX    D        ;FETCH VALUE
  164.     MOV    H,A
  165.     RZ
  166.     INX    D        ;SET TO NEXT STRING
  167.     DCR    B        ;DECR COUNT
  168.     JNZ    COMS
  169.     INR    B        ;CLEAR ZERO FLAG
  170.     RET
  171. ; THIS ROUTINE CHECKS IF TWO CHARACTER STRINGS CONTAINED IN MEMORY
  172. ; ARE EQUAL.  THE STRINGS ARE POINTED TO BY H,L AND D,E.
  173. ; ON RETURN, THE ZERO FLAG SET INDICATES A MATCH. REGISTER C
  174. ; INDICATES THE LENGTH OF THE STRINGS.  ON RETURN, THE POINTERS
  175. ; POINT TO THE NEXT ADDRESS AFTER THE CHARACTER STRINGS
  176. SEAR:    LDAX    D        ;FETCH CHAR
  177.     CMP    M        ;COMPARE STRINGS
  178.     JNZ    INCA
  179.     INX    H
  180.     INX    D
  181.     DCR    C        ;DECR CHAR COUNT
  182.     JNZ    SEAR
  183.     RET
  184. INCA:    INX    D
  185.     DCR    C
  186.     JNZ    INCA
  187.     INR    C        ;CLEAR ZERO FLAG
  188.     RET
  189. ; THIS ROUTINE ZEROS OUT A BUFFER IN MEMORY WHICH IS THEN 
  190. ; USED BY OTHER SCANNING ROUTINES
  191. ZBUF:    XRA    A        ;GET A ZERO
  192.     LXI    D,ABUF+12        ;BUFFER ADDRESS
  193.     MVI    B,12        ;BUFFER LENGTH
  194. ZBU1:    DCX    D        ;DECR ADDR
  195.     STAX    D        ;ZERO BUFFER
  196.     DCR    B
  197.     JNZ    ZBU1
  198.     RET
  199. ; THIS ROUTINE CALLS ETRA TO OBTAIN THE INPUT PARAMETER VALUES
  200. ; AND CALLS AN ERROR ROUTINE IF AN ERROR OCCURS
  201. VALC:    CALL    ETRA        ;GET INPUT PARAMETERS
  202.     JC    WHAT        ;JUMP IF ERROR
  203.     RET
  204. ; THIS ROUTINE EXTRACTS THE VALUES ASSOCIATED WITH A COMMAND
  205. ; FROM THE INPUT STREAM AND PLACES THEM IN THE ASCII BUFFER (ABUF)
  206. ; IT ALSO CALLS A ROUTINE TO CONVERT THE ASCII HEXADECIMAL TO BINARY
  207. ; AND STORES THEM IN THE BINARY BUFFER (BBUF)
  208. ; ON RETURN, CARRY SET INDICATES AN ERROR IN INPUT PARAMETERS
  209. ETRA:    LXI    H,0        ;GET A ZERO
  210.     SHLD    BBUF+2        ;ZERO VALUE
  211.     SHLD    FBUF        ;SET NO FILE NAME
  212.     CALL    ZBUF        ;ZERO BUFFER
  213.     LXI    H,IBUF-1        ;INPUT BUFFER ADDRESS
  214. VAL1:    INX    H
  215.     MOV    A,M        ;FETCH INPUT CHAR
  216.     CPI    ' '        ;LOOK FOR FIRST BLANK
  217.     CMC
  218.     RNC
  219.     JNZ    VAL1        ;JUMP IF NO BLANK
  220.     SHLD    PNTR        ;SAVE POINTER
  221.     CALL    SBLK        ;SCAN TO FIRST PARAMETER
  222.     CMC
  223.     RNC        ;RETURN IF CR
  224.     CPI    '/'
  225.     JNZ    VAL5        ;NO FILE NAME
  226.     LXI    D,FBUF        ;NAME FOLLOWS PUT IN FBUF
  227.     MVI    C,NMLEN
  228. VAL2:    INX    H
  229.     MOV    A,M
  230.     CPI    '/'
  231.     JZ    VAL3
  232.     DCR    C
  233.     JM    WHAT
  234.     STAX    D        ;STORE FILE NAME
  235.     NOP
  236.     INX    D
  237.     JMP    VAL2    
  238. VAL3:    MVI    A,' '        ;GET AN ASCII SPACE
  239. VAL4:    DCR    C
  240.     JM    DONE
  241.     STAX    D        ;FILL IN WITH SPACES
  242.     INX    D
  243.     JMP    VAL4
  244. DONE:    CALL    SBL2
  245.     CMC
  246.     RNC
  247. VAL5:    LXI    D,ABUF
  248.     CALL    ALPS        ;PLACE PARAMETER IN BUFFER
  249.     MOV    A,B        ;GET DIGIT COUNT
  250.     CPI    5        ;CHECK NUMBER OF DIGITS
  251.     CMC
  252.     RC        ;RETURN IF TOO MANY DIGITS
  253.     LXI    B,ABUF
  254.     CALL    AHEX        ;CONVERT VALUE
  255.     RC        ;ILLEGAL CHAR
  256.     SHLD    BBUF        ;SAVE IN BINARY BUFFER
  257.     LXI    H,ABUF
  258.     CALL    NORM        ;NORMALIZE ASCII VALUE
  259.     CALL    SBLK        ;SCAN TO NEXT PARAMETER
  260.     CMC
  261.     RNC        ;RETURN IF CR
  262.     LXI    D,ABUF+4
  263.     CALL    ALPS        ;PLACR PARAMETER IN BUFFER
  264.     MOV    A,B
  265.     CPI    5        ;CHECK NUMBER OF DIGITS
  266.     CMC
  267.     RC        ;RETURN IF TOO MANY DIGITS
  268.     LXI    B,ABUF+4
  269.     CALL    AHEX        ;CONVERT VALUE
  270.     RC        ;ILLEGAL CHAR
  271.     SHLD    BBUF+2        ;SAVE IN BINARY BUFFER
  272.     LXI    H,ABUF+4
  273.     CALL    NORM        ;NORMALIZE ASCII VALUE
  274.     ORA    A        ;CLEAR CARRY
  275.     RET
  276. ;
  277. ; THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED BY
  278. ; REGISTERS B,C AND CONVERST THE ASCII DECIMAL DIGITS INTO
  279. ; BINARY.  UP TO A 16 BIT VALUE CAN BE CONVERTED.  THE SCAN
  280. ; STOPS WHEN A BINARY ZERO IS FOUND IN THE BUFFER
  281. ADEC:    LXI    H,0        ;GET A 16 BIT ZERO
  282. ADE1:    LDAX    B        ;FETCH ASCII DIGIT
  283.     ORA    A        ;SET ZERO FLAG
  284.     RZ        ;RETURN IF FINISHED
  285.     MOV    D,H        ;SAVE CURRENT VALUE
  286.     MOV    E,L        ;SAVE CURRENT VALUE
  287.     DAD    H        ;TIMES TWO
  288.     DAD    H        ;TIMES TWO
  289.     DAD    D        ;ADD IN ORIGINAL VALUE
  290.     DAD    H        ;TIMES TWO
  291.     SUI    '0'        ;ASCII BIAS
  292.     CPI    10        ;CHECK FOR LEGAL VALUE
  293.     CMC
  294.     RC        ;RETURN IF ERROR
  295.     MOV    E,A
  296.     MVI    D,0
  297.     DAD    D        ;ADD IN NEXT DIGIT
  298.     INX    B        ;INCREMENT POINTER
  299.     JMP    ADE1
  300. ; THIS ROUTINE FETCHES DIGITS FROM THE BUFFER ADDRESSED BY
  301. ; REGISTERS B,C AND CONVERTS THE ASCII HEXADECIMAL DIGITS INTO
  302. ; BINARY.  UP TO A 16 BIT VALUE CAN BE CONVERTED.  THE SCAN STOPS
  303. ; WHEN A BINARY ZERO IS FOUND IN THE BUFFER
  304. AHEX:    LXI    H,0        ;GET A 16 BIT ZERO
  305. AHE1:    LDAX    B        ;FETCH ASCII DIGIT
  306.     ORA    A
  307.     RZ        ;RETURN IF ZERO
  308.     DAD    H        ;LEFT SHIFT
  309.     DAD    H
  310.     DAD    H
  311.     DAD    H
  312.     CALL    AHS1        ;CONVERT TO BINARY
  313.     CPI    10H        ;CHECK FOR LEGAL VALUE
  314.     CMC
  315.     RC        ;RETURN IF ERROR
  316.     ADD    L
  317.     MOV    L,A
  318.     INX    B        ;INCR POINTER
  319.     JMP    AHE1
  320. ; THIS ROUTINE CONVERTS ASCII HEX DIGITS INTO BINARY
  321. AHS1:    SUI    '0'        ;ASCII BIAS
  322.     CPI    10        ;DIGIT 0-10
  323.     RC
  324.     SUI    7        ;ALPHA BIAS
  325.     RET
  326. ; THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII HEXADECIMAL
  327. ; AND OUTPUTS THE CHARACTERS TO THE TTY
  328. HOUT:    CALL    BINH        ;CONVERT VALUE
  329.     LXI    H,HCON        ;CONVERSION AREA
  330. CHOT:    MOV    B,M        ;FETCH OUTPUT CHARACTER
  331.     CALL    OUT8        ;OUTPUT CHAR
  332.     INX    H
  333.     MOV    B,M        ;FETCH CHAR
  334.     CALL    OUT8        ;OUTPUT CHAR
  335.     RET
  336. ;
  337. ; THIS ROUTINE DOES THE SAME AS ABOVE BUT OUTPUTS A BLANK
  338. ; AFTER THE LAST CHAR
  339. HOTB:    CALL    HOUT        ;CONVERT AND OUTPUT
  340.     CALL    BLK1        ;OUTPUT A BLANK
  341.     RET
  342. ; THIS ROUTINE CONVERTS A BINARY VALUE TO ASCII DECIMAL
  343. ; DIGITS AND OUTPUTS THE CHARACTERS TO THE TTY
  344. DOUT:    CALL    BIND        ;CONVERT VALUE
  345.     CALL    HOUT+3        ;OUTPUT VALUE (2 DIGITS)
  346.     INX    H
  347.     MOV    B,M        ;GET LAST DIGIT
  348.     CALL    OUT8        ;OUTPUT
  349.     RET
  350. ; THIS ROUTINE OUTPUTS A BLANK
  351. BLK1:    MVI    B,' '
  352.     CALL    OUT8
  353.     RET
  354. ; THIS ROUTINE IS USED BY OTHER ROUTINES TO INCREMENT THE
  355. ; STARTING ADDRESS IN A COMMAND AND COMPARE IT WITH THE FINAL
  356. ; ADDRESS IN THE COMMAND.  ON RETURN THE CARRY FLAG SET
  357. ; INDICATES THAT THE FINAL ADDRESS HAS BEEN REACHED
  358. ACHK:    LHLD    BBUF        ;FETCH START ADDRESS
  359.     LDA    BBUF+3        ;STOP ADDRESS (HIGH)
  360.     CMP    H        ;COMPARE
  361.     JNZ    ACH1    
  362.     LDA    BBUF+2        ;STOP ADDRESS (LOW)
  363.     CMP    L        ;COMPARE
  364.     JNZ    ACH1
  365.     STC        ;SET CARRY IF EQUAL
  366. ACH1:    INX    H        ;INCREMENT START ADDRESS
  367.     SHLD    BBUF        ;STORE START ADDRESS
  368.     RET
  369. ; THIS ROUTINE OUTPUTS CHARACTERS FROM A CHARACTER STRING UNTIL
  370. ; A CARRIAGE RETURN IS FOUND
  371. SCRN:    MOV    B,M        ;FETCH CHAR
  372.     MVI    A,13        ;CARRIAGE RETURN
  373.     CMP    B        ;CHAR = CR
  374.     RZ
  375.     CALL    OUT8        ;OUTPUT CHAR
  376.     INX    H        ;INCREMENT ADDRESS
  377.     JMP    SCRN
  378. ; THIS ROUTINE CONVERTS THE BINARY VALUE IN REG A INTO
  379. ; ASCII HEXADECIMAL DIGITS AND STORES THEM IN MEMORY
  380. BINH:    LXI    H,HCON        ;CONVERSION ADDRESS
  381.     MOV    B,A        ;SAVE VALUE
  382.     RAR
  383.     RAR
  384.     RAR
  385.     RAR
  386.     CALL    BIN1
  387.     MOV    M,A
  388.     INX    H
  389.     MOV    A,B
  390.     CALL    BIN1        ;CONVERT TO ASCII
  391.     MOV    M,A
  392.     RET
  393. ; THIS ROUTINE CONVERTS A VALUE TO HEXADECIMAL
  394. BIN1:    ANI    0FH        ;LOW FOUR DIGITS
  395.     ADI    '0'        ;MODIFY FOR ASCII
  396.     CPI    '0'+10        ;DIGIT 0-9
  397.     RC
  398.     ADI    7        ;MODIFY FOR A-F
  399.     RET
  400. ; THIS ROUTINE CONVERTS THE BINARY VALUE IN THE A REG
  401. ; TO ASCII DECIMAL DIGITS AND STORES THEM IN MEMORY
  402. BIND:    LXI    H,HCON        ;CONVERSION ADDRESS
  403.     MVI    B,100
  404.     CALL    BID1        ;CONVERT HUNDREDS DIGIT
  405.     MVI    B,10
  406.     CALL    BID1        ;CONVERT TENS DIGIT
  407.     ADI    '0'        ;GET UNITS DIGIT
  408.     MOV    M,A        ;STORE IN MEMORY
  409.     RET
  410. ; THIS ROUTINE CONVERTS A VALUE TO DECIMAL
  411. BID1:    MVI    M,'0'-1        ;INITIALIZE DIGIT COUNT
  412.     INR    M
  413.     SUB    B        ;CHECK DIGIT
  414.     JNC    BID1+2
  415.     ADD    B        ;RESTORE VALUE
  416.     INX    H
  417.     RET
  418. ; LEGAL COMMAND TABLE
  419. ;
  420. CTAB:    DB    'DUMP'        ;DUMP COMMAND
  421.     DW    DUMP
  422.     DB    'EXEC'
  423.     DW    EXEC
  424.     DB    'ENTR'
  425.     DW    ENTR
  426.     DB    'FILE'
  427.     DW    FILE
  428.     DB    'LIST'
  429.     DW    LIST
  430.     DB    'DELT'
  431.     DW    DELL
  432.     DB    'ASSM'
  433.     DW    ASSM
  434.     DB    'PAGE'
  435.     DW    PAGE
  436.     DB    'PROM'
  437.     DW    PROM
  438.     DB    'CUST'
  439.     DW    0E000H
  440. ; THIS ROUTINE CHECKS IF ANY PARAMETERS WERE ENTERED
  441. ; WITH THE COMMAND; IF NOT, AN ERROR MESSAGE IS ISSUED
  442. VCHK:    LDA    ABUF        ;FETCH PARAMETER BYTE
  443.     ORA    A        ;SET FLAGS
  444.     JZ    WHAT        ;NO PARAMETER
  445.     RET
  446. ; THIS ROUTINE DUMPS THE CONTENTS OF MEMORY FROM
  447. ; THE START TO FINAL ADDRESSES GIVEN IN THE COMMAND
  448. DUMP:    CALL    VCHK        ;CHECK FOR PARAMETERS
  449.     MVI    A,16        ;LOCATIONS PER LINE
  450.     STA    SCNT        ;DUMP COUNTER
  451. DUMS:    CALL    CRLF        ;START NEW LINE
  452.     LDA    BBUF+1        ;FETCH ADDRESS
  453.     CALL    HOUT        ;OUTPUT ADDRESS
  454.     LDA    BBUF    
  455.     CALL    HOTB        ;OUTPUT ADDRESS
  456.     LDA    SCNT        ;FETCH LINE COUNTER
  457. DUM1:    STA    DCNT
  458.     LHLD    BBUF        ;FETCH MEMORY ADDRESS
  459.     MOV    A,L        ;GET LOW ORDER ADDRESS
  460.     OUT    PADO        ;SET PROM ADDRESS
  461.     MOV    A,H
  462.     CPI    0EFH
  463.     MOV    A,M
  464.     JNZ    DUM2
  465.     IN    PDAI        ;READ PROM DATA
  466. DUM2:    CALL    HOTB        ;OUTPUT VALUE
  467.     CALL    ACHK        ;CHECK ADDRESS
  468.     RC        ;RETURN IF FINISHED
  469.     LDA    DCNT        ;FETCH COUNTER
  470.     DCR    A        ;DECR COUNTER
  471.     JNZ    DUM1
  472.     JMP    DUMS
  473. ; THIS ROUTINE WILL MOVE 1 PAGE (256 BYTES) FROM 1ST ADDRESS GIVEN
  474. ; IN COMMAND TO 2ND ADDRESS IN COMMAND
  475. PAGE:    CALL    VCHK        ;CHECK FOR PARAMETER
  476.     LDA    ABUF+4        ;FETCH 2ND PARAMETER
  477.     ORA    A        ;DOES 2ND PARAMETER EXIST?
  478.     JZ    WHAT
  479.     LHLD    BBUF        ;FETCH MOVE FROM ADDRESS
  480.     XCHG
  481.     LHLD    BBUF+2        ;FETCH MOVE TO ADDRESS
  482.     MVI    B,0        ;SET COUNTER
  483. PAG1:    MOV    A,E
  484.     OUT    PADO        ;SET PROM ADDRESS
  485.     MOV    A,D
  486.     CPI    0FFH        ;CHECK FOR PROM ADDRESS
  487.     LDAX    D        ;GET DATA
  488.     JNZ    PAG2
  489.     IN    PDAI        ;READ PROM DATA
  490. PAG2:    MOV    M,A
  491.     INX    H
  492.     INX    D
  493.     DCR    B        ;DECR COUNT
  494.     JNZ    PAG1
  495.     RET
  496. ; THIS ROUTINE INITIALIZES THE BEGINNING OF FILE ADDRESS
  497. ; AND END OF FILE ADDRESS AS WELL AS THE FILE AREA 
  498. ; WHEN THE FILE COMMAND IS USED
  499. FILE:    CALL    CRLF
  500.         ;CHECK FOR FILE PARAMETERS
  501.     LDA    FBUF
  502.     ORA    A
  503.     JZ    FOUT        ;NO GO LIST
  504.     CALL    FSEA        ;LOOK UP FILE
  505.     XCHG        ;PNTR IN DE
  506.     JNZ    TEST        ;IF FOUND
  507.         ;NO ENTRY
  508.     LDA    ABUF        ;CHECK FOR PARAM
  509.     ORA    A
  510.     JZ    WHA1        ;NO?? - GIVE EM HELL
  511.         ;CHECK FOR ROOM IN DIRECTORY
  512.     LDA    FEF
  513.     ORA    A
  514.     JNZ    ROOM
  515.     LXI    H,EMES1
  516.     JMP    MESS
  517.         ;ENTRY FOUND ARE THESE PARAMETERS
  518. TEST:    LDA    ABUF
  519.     ORA    A
  520.     JZ    SWAPS
  521.     LHLD    BBUF
  522.     MOV    A,H
  523.     ORA    L
  524.     JZ    SWAPS
  525.     LXI    H,EMES2        ;NO-NO    CAN'T DO
  526.     JMP    MESS
  527.         ;MOVE FILE NAME TO BLOCK POINTED TO BY FREAD
  528. ROOM:    LHLD    FREAD
  529.     XCHG        ;DIRECT POINTER IN D,E
  530.     LXI    H,FBUF        ;FILE NAME POINTER IN H,L
  531.     PUSH    D
  532.     MVI    C,NMLEN        ;NAME LENGTH COUNT
  533. MOV23:    MOV    A,M
  534.     STAX    D
  535.     INX    D
  536.     INX    H
  537.     DCR    C        ;TEST COUNT
  538.     JNZ    MOV23
  539.     POP    D        ;RESTORE ENTRY PTR, MAKE CURRENT
  540.         ;MAKE FILE POINTED TO BY D,E CURRENT
  541. SWAPS:    LXI    H,FILE0
  542.     MVI    C,FELEN        ;ENTRY LENGTH
  543. SWAP:    LDAX    D
  544.     MOV    B,M
  545.     MOV    M,A
  546.     MOV    A,B
  547.     STAX    D
  548.     INX    D        ;BUMP POINTERS
  549.     INX    H
  550.     DCR    C        ;TEST COUNT
  551.     JNZ    SWAP
  552.         ;CHECK FOR 2ND PARAMETER, => INITIALIZE NEW
  553.     LDA    ABUF
  554.     ORA    A
  555.     JZ    FOOT        ;NO SECOND PARAMETER
  556.         ;PROCESS SECOND PARAMETER
  557.     LHLD    BBUF        ;GET ADDRESS
  558.     SHLD    BOFP        ;SET BEGIN
  559.     SHLD    EOFP        ;SET END
  560.     MOV    A,L        ;IS ADDRESS ZERO?
  561.     ORA    H
  562.     JZ    FIL35        ;YES
  563. FIL30:    MVI    M,1        ;NON-ZERO - SET EOF
  564. FIL35:    XRA    A
  565.     STA    MAXL        ;AND MAX LINE #
  566.     JMP    FOOT        ;OUTPUT PARAMETERS
  567. FOUT:    LDA    IBUF+4
  568.     CPI    'S'        ;IS COMMAND FILES
  569.     MVI    C,MAXFIL
  570.     JZ    FOUL
  571. FOOT:    MVI    C,1
  572.         ;OUTPUT THE # OF ENTRIES IN C
  573. FOUL:    LXI    H,FILE0
  574.     MOV    A,C
  575. FINE:    STA    FOCNT        ;SAVE COUNT
  576.     PUSH    H
  577.     LXI    D,NMLEN
  578.     DAD    D
  579.     MOV    A,M
  580.     ORA    A
  581.     JNZ    FOOD        ;NON-ZERO, OK TO OUTPUT
  582.     INX    H
  583.     ADD    M
  584.     INX    H
  585.     JNZ    FOOD
  586.     INX    SP
  587.     INX    SP
  588.     INX    H
  589.     INX    H
  590.     JMP    FEET
  591.         ;HAVE AN ENTRY TO OUTPUT
  592. FOOD:    POP    H        ;PTR
  593.     MVI    C,NMLEN
  594. FAST:    MOV    B,M        ;LOAD CHAR TO B
  595.     CALL    OUT8        ;OUTPUT
  596.     DCR    C
  597.     INX    H
  598.     JNZ    FAST        ;DO THE REST
  599.         ;NOW OUTPUT BEGIN-END PTRS
  600.     CALL    FOOL        ;OUTPUT BEGIN
  601.     CALL    FOOL        ;OUTPUT END
  602.     CALL    CRLF        ;AND CR
  603.         ;TEST COUNT, H,L POINTS PAST EOFP
  604. FEET:    LXI    D,FELEN-NMLEN-4
  605.     DAD    D        ;MOVE TO NEXT ENTRY
  606.     LDA    FOCNT
  607.     DCR    A        ;TEST COUNT
  608.     JNZ    FINE        ;MORE TO DO
  609.     RET
  610.         ;OUTPUT NUMBER POINTED TO BY H,L
  611.         ;ON RET, H,L POINT 2 WORDS LATER
  612. FOOL:    CALL    BLK1        ;SPACE
  613.     INX    H
  614.     MOV    A,M
  615.     DCX    H
  616.     PUSH    H
  617.     CALL    HOUT        ;OUTPUT
  618.     POP    H
  619.     MOV    A,M
  620.     INX    H
  621.     INX    H
  622.     PUSH    H
  623.     CALL    HOTB        ;OUTPUT
  624.     POP    H        ;RESTORE H,L
  625.     RET
  626. ; SEARCH THE FILE DIRECTORY FOR THE FILE
  627. ; WHOSE NAME IS IN FBUF.
  628. ; RETURN IF FOUND, ZERO IS OFF, H,L POINT TO
  629. ; ENTRY WHILE SEARCHING.  ON ENTRY FOUND WITH ADDR
  630. ; ZERO, SET FEF TO > 0 AND FREAD TO THE ADDR OF ENTRY
  631. FSEA:    XRA    A
  632.     STA    FEF        ;CLAIM NO FREE ENTRIES
  633.     MVI    B,MAXFIL        ;COUNT OF ENTRIES
  634.     LXI    D,FILE0        ;TABLE ADDRESS
  635. FSE10:    LXI    H,FBUF
  636.     MVI    C,NMLEN
  637.     CALL    SEAR        ;TEST STRINGS
  638.     PUSH    PSW        ;SAVE FLAG
  639.     PUSH    D
  640.     LDAX    D        ;GET BOFP
  641.     ORA    A        ;EMPTY ENTRY?
  642.     JNZ    FSE20
  643.     INX    D        ;TEST OTHER WORD
  644.     LDAX    D
  645.     ORA    A
  646.     JNZ    FSE20        ;NOPE-GO TEST FOR MATCH
  647.     XCHG        ;H,L GET MIDDLE OF FREE ENTRY
  648.     LXI    D,-NMLEN-1
  649.     DAD    D        ;MOVE TO BEGINNING
  650.     SHLD    FREAD        ;SAVE ADDR
  651.     MOV    A,D
  652.     STA    FEF        ;SET FREE ENTRY FOUND
  653.     POP    H        ;RESTORE INTERIM POINTER
  654.     POP    PSW        ;UNJUNK STACK
  655. ; MOVE TO NEXT ENTRY
  656. FSE15:    LXI    D,FELEN-NMLEN
  657.     DAD    D
  658.     XCHG        ;NEXT ENTRY ADDR IN DE
  659.     DCR    B        ;TEST COUNT
  660.     RZ        ;DONE?
  661.     JMP    FSE10        ;TRY NEXT
  662. ; ENTRY WASN'T FREE, TEST FOR MATCH
  663. FSE20:    POP    H
  664.     POP    PSW
  665.     JNZ    FSE15        ;IF ZERO CLEAR, NO MATCH
  666. ; ENTRY FOUND
  667.     LXI    D,-NMLEN        ;BACKUP
  668.     DAD    D        ;H,L POINTS TO ENTRY
  669.     MOV    A,D
  670.     ORA    A        ;CLEAR ZERO
  671.     RET        ;THAT'S ALL
  672. ; OUTPUT ERROR MESSAGE FOR ILLEGAL COMMAND
  673. WHAT:    CALL    CRLF        ;OUTPUT CRLF
  674. WHA1:    LXI    H,EMES        ;MESSAGE ADDRESS
  675. MESS:    CALL    SCRN
  676.     JMP    EOR
  677. EMES:    DB    'WHAT?',13
  678. EMES1:    DB    'FULL',13
  679. EMES2:    DB    'NO NO',13
  680. ; CALL ROUTINE TO ENTER DATA INTO MEMORY
  681. ; AND CHECK FOR ERROR ON RETURN
  682. ; THIS ROUTINE IS USED TO ENTER DATA VALUES INTO MEMORY.
  683. ; EACH VALUE IS ONE BYTE AND IS WRITTEN IN HEXADECIMAL
  684. ; VALUES GREATER THAN 255 WILL CAUSE CARRY TO BE SET
  685. ; AND RETURN MADE TO CALLING PROGRAM
  686. ENTR:    CALL    VCHK        ;CHECK FOR PARAMETERS
  687.     CALL    ENTS
  688.     JC    WHAT
  689.     CALL    CRLF
  690.     RET
  691. EEND    EQU    '/'        ;TERMINATION CHAR
  692. ENTS:    CALL    CRLF
  693.     CALL    READ        ;READ INPUT DATA
  694.     LXI    H,IBUF        ;SET LINE POINTER
  695.     SHLD    PNTR        ;SAVE POINTER
  696. ENT1:    CALL    ZBUF        ;CLEAR BUFFER
  697.     CALL    SBLK        ;SCAN TO FIRST VALUE
  698.     JC    ENTS        ;JUMP IF CR FOUND
  699.     CPI    EEND
  700.     RZ        ;CARRY IS ZERO
  701.     CALL    ALPS        ;PLACE VALUE IN BUFFER
  702.     MOV    A,B        ;GET DIGIT COUNT
  703.     CPI    3        ;CHECK NUMBER OF DIGITS
  704.     CMC
  705.     RC        ;RETURN IF MORE THAN 2 DIGITS
  706.     LXI    B,ABUF        ;CONVERSION ADDRESS
  707.     CALL    AHEX        ;CONVERT VALUE
  708.     RC        ;ERROR IN HEX CHARACTER
  709.     MOV    A,L
  710.     LHLD    BBUF        ;FETCH MEMORY ADDRESS
  711.     MOV    M,A        ;PUT IN MEMORY
  712.     CALL    ACH1        ;INCREMENT MEMORY LOCATION
  713.     JMP    ENT1
  714. ; THIS ROUTINE IS USED TO ENTER LINES INTO THE FILE
  715. ; AREA.  THE LINE NUMBER IS FIRST CHECKED TO SEE IF IT IS
  716. ; A VALID NUMBER (0000-9999). NEXT IT IS CHECKED TO SEE IF IT IS 
  717. ; GREATER THAN THE MAXIMUM CURRENT LINE NUMBER.  IF IT IS, THE NEW
  718. ; LINE IS INSERTED AT THE END OF THE CURRENT FILE AND THE MAXIMUM
  719. ; LINE NUMBER IS UPDATED AS WELL AS THE END OF FILE POSITION
  720. ; LINE NUMBERS THAT ALREADY EXIST ARE INSERTED INTO THE FILE AREA
  721. ; AT THE APPROPRIATE PLACE AND ANY EXTRA CHARACTERS IN THE OLD
  722. ; LINE ARE DELETED
  723. LINE:    MVI    C,4        ;NO OF DIGITS TO CHECK
  724.     LXI    H,IBUF-1        ;INITIALIZE ADDRESS
  725. LICK:    INX    H
  726.     MOV    A,M        ;FETCH LINE DIGIT
  727.     CPI    '0'        ;CHECK FOR VALID NUMBER
  728.     JC    WHAT
  729.     CPI    '9'+1
  730.     JNC    WHAT
  731.     DCR    C
  732.     JNZ    LICK
  733.     SHLD    ADDS        ;FIND ADDRESS
  734.     LXI    D,MAXL+3        ;SET ADDRESS
  735.     CALL    COM0
  736.     JNC    INSR
  737. ; GET HERE IF NEW LINE IS GREATER THAN MAXIMUM CURRENT LINE #
  738.     INX    H
  739.     CALL    LODM        ;GET NEW LINE NUMBER
  740.     LXI    H,MAXL+3
  741.     CALL    STOM        ;MAKE IT MAXIMUM LINE NUMBER
  742.     LXI    D,IBUF-1
  743.     LHLD    EOFP        ;END OF FILE POSITION
  744.     MVI    C,1
  745.     CALL    LMOV        ;PLACE LINE IN FILE
  746. SEOF:    MVI    M,1        ;END OF FILE INDICATOR
  747.     SHLD    EOFP        ;END OF FILE ADDRESS
  748.     JMP    EOR
  749. ; GET HERE IF NEW LINE MUST BE INSERTED INTO ALREADY EXISTING
  750. ; FILE AREA
  751. INSR:    CALL    FIN1        ;FIND LINE IN FILE
  752.     MVI    C,2
  753.     JZ    EQUL
  754.     DCR    C        ;NEW LN NOT EQUAL TO SOME OLD LINE
  755. EQUL:    MOV    B,M
  756.     DCX    H
  757.     MVI    M,2        ;MOVE LINE INDICATOR
  758.     SHLD    INSP        ;INSERT LINE POSITION
  759.     LDA    IBUF-1        ;NEW LINE COUNT
  760.     DCR    C
  761.     JZ    LT        ;NEW LINE NOT = OLD LINE
  762.     SUB    B        ;COUNT DIFFERENCE
  763.     JZ    ZERO        ;LINE LENGTHS EQUAL
  764.     JC    GT
  765. ; GET HERE IF NO OF CHARS IN OLD LINE > NO OF CHARS IN NEW LINE
  766. ; OR NEW LINE NUMBER WAS NOT EQUAL TO SOME OLD LINE NUMBER
  767. LT:    LHLD    EOFP        ;END OF FILE ADDRESS
  768.     MOV    D,H
  769.     MOV    E,L
  770.     CALL    ADR        ;MOVE TO ADDRESS
  771.     SHLD    EOFP        ;NEW END OF FILE ADDRESS
  772.     MVI    C,2
  773.     CALL    RMOV        ;OPEN UP FILE AREA
  774.     JMP    ZERO
  775. ; GET HERE IF NO OF CHARS IN OLD LINE < NO OF CHARS IN NEW LINE
  776. GT:    CMA
  777.     INR    A        ;COUNT DIFFERENCE
  778.     MOV    D,H
  779.     MOV    E,L
  780.     CALL    ADR
  781.     XCHG
  782.     CALL    LMOV        ;DELETE EXCESS CHARS IN FILE
  783.     MVI    M,1        ;EOF INDICATOR
  784.     SHLD    EOFP        ;EOF ADDRESS
  785. ; GET HERE TO INSERT CURRENT LINE INTO FILE AREA
  786. ZERO:    LHLD    INSP        ;INSERT ADDRESS
  787.     MVI    M,ASCR
  788.     INX    H
  789.     LXI    D,IBUF-1        ;NEW LINE ADDRESS
  790.     MVI    C,1        ;CHECK VALUE
  791.     CALL    LMOV        ;PLACE LINE IN FILE
  792.     JMP    EOR
  793. ; THIS ROUTINE IS USED TO FIND A LINE IN THE FILE AREA
  794. ; WHICH IS GREATER THAN OR EQUAL TO THE CURRENT LINE NUMBER
  795. FIND:    LXI    H,ABUF+3        ;BUFFER ADDRESS
  796.     SHLD    ADDS        ;SAVE ADDRESS
  797. FIN1:    LHLD    BOFP        ;BEGIN FILE ADDRESS
  798. FI1:    CALL    EO1        ;CHECK FOR END OF FILE
  799.     XCHG
  800.     LHLD    ADDS        ;FETCH FIND ADDRESS
  801.     XCHG
  802.     MVI    A,4
  803.     CALL    ADR        ;LINE ADDRESS
  804.     CALL    COM0        ;COMPARE LINE NUMBER
  805.     RC
  806.     RZ
  807. FI2:    MOV    A,M
  808.     CALL    ADR        ;NEXT LINE ADDRESS
  809.     JMP    FI1
  810. ; THIS ROUTINE CHECKS IF THE CURRENT ADDRESS
  811. ; IS THE END OF FILE
  812. EOF:    INX    H
  813. EO1:    MVI    A,1        ;EOF INDICATOR
  814.     CMP    M
  815.     RNZ
  816.     JMP    EOR
  817. ; THIS ROUTINE IS USED TO ADD A VALUE TO AN ADDRESS
  818. ; CONTAINED IN REGISTER H,L
  819. ADR:    ADD    L
  820.     MOV    L,A
  821.     RNC
  822.     INR    H
  823.     RET
  824. ; THIS ROUTINE WILL MOVE CHARACTER STRINGS FROM ONE LOCATION
  825. ; OF MEMORY TO ANOTHER
  826. ; CHARACTERS ARE MOVED FROM LOCATION ADDRESSED BY D,E TO LOCATION
  827. ; ADDRESSED BY H,L.  ADDITIONAL CHARACTERS ARE MOVED BY
  828. ; INCREMENTING MEMORY UNTIL THE CHARACTER IN REGISTER C IS FETCHED
  829. LMOV:    LDAX    D        ;FETCH CHAR
  830.     INX    D
  831.     CMP    C        ;TERMINATION CHAR
  832.     RZ
  833.     MOV    M,A
  834.     INX    H
  835.     JMP    LMOV
  836. ; THIS ROUTINE IS SIMILAR TO THE ABOVE EXCEPT THAT THE CHARACTER
  837. ; ADDRESS IS DECREMENTED AFTER EACH FETCH AND STORE
  838. RMOV:    LDAX    D        ;FETCH CHAR
  839.     DCX    D
  840.     CMP    C        ;TERMINATION CHAR
  841.     RZ
  842.     MOV    M,A        ;STORE CHAR
  843.     DCX    H        ;DECR STORE ADDRESS
  844.     JMP    RMOV
  845. ; THIS ROUTINE IS USED TO LOAD FOUR CHARACTERS FROM
  846. ; MEMORY INTO REGISTERS
  847. LODM:    MOV    B,M        ;FETCH CHAR
  848.     INX    H
  849.     MOV    C,M
  850.     INX    H
  851.     MOV    D,M
  852.     INX    H
  853.     MOV    E,M
  854.     RET
  855. ; THIS ROUTINE STORES FOUR CHARACTERS FROM REGISTERS INTO MEMORY
  856. STOM:    MOV    M,E
  857.     DCX    H
  858.     MOV    M,D
  859.     DCX    H
  860.     MOV    M,C
  861.     DCX    H
  862.     MOV    M,B
  863.     RET
  864. ; THIS ROUTINE IS USED TO COMPARE TWO CHARACTER STRINGS
  865. ; OF LENGTH 4.  ON RETURN ZERO FLAG SET MEANS BOTH
  866. ; STRINGS ARE EQUAL.  CARRY FLAG = 0 MEANS STRING ADDRESSED
  867. ; BY D,E WAS GREATER THAN OR EQUAL TO CHARACTER STRING 
  868. ; ADDRESSED BY H,L
  869. COM0:    MVI    B,1        ;EQUAL COUNTER
  870.     MVI    C,4        ;STRING LENGTH
  871.     ORA    A        ;CLEAR CARRY
  872. CO1:    LDAX    D        ;FETCH CHARACTER
  873.     SBB    M        ;COMPARE CHAR
  874.     JZ    CO2
  875.     INR    B        ;INCREMENT EQUAL COUNTER
  876. CO2:    DCX    D
  877.     DCX    H
  878.     DCR    C
  879.     JNZ    CO1
  880.     DCR    B
  881.     RET
  882. ; THIS ROUTINE IS SIMILAR TO THE ABOVE EXCEPT ON RETURN, CARRY = 0
  883. ; MEANS THAT THE CHAR STRING ADDRESSED BY D,E IS STRICTLY GREATER
  884. ; THAN STRING ADDRESSED BY H,L
  885. COM1:    MVI    C,4        ;STRING LENGTH
  886.     LDAX    D        ;FETCH CHAR
  887.     SUI    1
  888.     JMP    CO1+1
  889. ; THIS ROUTINE WILL TAKE ASCII CHARS AND ADD ANY
  890. ; NECESSARY ASCII ZEROES SO THE RESULT IS A 4 CHARACTER
  891. ; ASCII VALUE
  892. NORM:    CALL    LODM        ;LOAD ZEROES
  893.     XRA    A
  894.     CMP    B
  895.     RZ
  896. NOR1:    CMP    E
  897.     CNZ    STOM        ;STORE VALUES
  898.     RNZ
  899.     MOV    E,D
  900.     MOV    D,C
  901.     MOV    C,B
  902.     MVI    B,'0'
  903.     JMP    NOR1
  904. ; THIS ROUTINE IS USED TO LIST THE CONTENTS OF THE FILE
  905. ; AREA STARTING AT THE LINE NUMBER GIVEN IN THE COMMAND
  906. LIST:    CALL    CRLF
  907.     CALL    FIND        ;FIND STARTING LINE
  908.     INX    H
  909. LIS1:    CALL    SCRN        ;OUTPUT LINE
  910.     CALL    CRLF
  911.     CALL    EOF        ;END OF FILE
  912.     IN    SWCH        ;READ SWITCHES
  913.     ANI    80H
  914.     RNZ
  915.     INX    H
  916.     JMP    LIS1
  917. ; THIS ROUTINE IS USED TO PROGRAM A 1702A PROM
  918. PROM:    CALL    VCHK        ;CHECK FOR PARAMETER
  919. PRO1:    CALL    CRLF
  920.     LDA    BBUF        ;GET ADDRESS (LOW)
  921.     CALL    HOTB        ;OUTPUT ADDRESS
  922.     MVI    D,3        ;NUMBER OF ATTEMPTS
  923.     LHLD    BBUF        ;GET ADDRESS
  924. PRO2:    MOV    A,L
  925.     OUT    PADO
  926.     MOV    A,M        ;GET DATA
  927.     OUT    PDAO        ;OUTPUT TO PROM
  928.     MVI    A,2
  929.     OUT    PCTO        ;ENABLE PROGRAMMER
  930.     CALL    DLAY        ;500 MSEC DELAY
  931.     XRA    A
  932.     OUT    PCTO        ;DISABLE PROGRAMMER
  933.     IN    PDAI        ;READ DATA
  934.     CMP    M        ;COMPARE DATA
  935.     JZ    PRO3
  936.     MVI    B,'?'
  937.     CALL    OUT8
  938.     DCR    D        ;NUMBER OF ATTEMPTS
  939.     JNZ    PRO2        ;TRY AGAIN
  940.     RET
  941. PRO3:    CALL    ACHK        ;FINAL ADDRESS
  942.     RC        ;RETURN IF FINISHED
  943.     JMP    PRO1        ;NEXT LOCATION
  944. DLAY:    MVI    E,150
  945. DLA1:    XRA    A        ;GET A ZERO (256)
  946. DLA2:    DCR    A
  947.     JNZ    DLA2
  948.     DCR    E
  949.     JNZ    DLA1
  950.     RET
  951. ; THIS ROUTINE IS UDED TO DELAETE LINES FROM THE FILE AREA
  952. ; THE REMAINING FILE AREA IS THEN MOVED IN MEMORY SO THAT
  953. ; THERE IS NO EXCESS SPACE IN MEMORY
  954. DELL:    CALL    VCHK        ;CHECK FOR PARAMETER
  955.     CALL    FIND        ;FIND LINE IN FILE AREA
  956.     SHLD    DELP        ;SAVE DELETE POSITION
  957.     LXI    H,ABUF+7
  958.     MOV    A,M        ;CHECK FOR 2ND PARAMETER
  959.     ORA    A        ;SET FLAGS
  960.     JNZ    DEL1    
  961.     LXI    H,ABUF+3        ;USE FIRST PARAMETER
  962. DEL1:    SHLD    ADDS        ;SAVE FIND ADDRESS
  963.     XCHG
  964.     LXI    H,MAXL+3    
  965.     CALL    COM0        ;COMPARE LINE NO
  966.     LHLD    DELP        ;LOAD DELETE POSITION
  967.     JC    NOVR
  968. ; GET HERE IF DELETION INVOLVES END OF FILE
  969.     SHLD    EOFP        ;CHANGE EOF POSITION
  970.     MVI    M,1        ;SET EOF INDICATOR
  971.     XCHG
  972.     LHLD    BOFP        ;GET BEGIN FILE ADDRESS
  973.     XCHG
  974.     MVI    B,13        ;SET SCAN SWITCH
  975.     DCX    H        ;DECREMENT FILE ADDRESS
  976. DEL2:    MOV    A,L        ;CHECK FOR BOF
  977.     SUB    E
  978.     MOV    A,H
  979.     SBB    D
  980.     MVI    A,ASCR        ;LOOK FOR CR
  981.     JC    DEL4
  982.     DCR    B
  983.     DCX    H
  984.     CMP    M        ;FIND NEW MAX LINE NO
  985.     JNZ    DEL2
  986.     DCX    H
  987.     MOV    A,L
  988.     SUB    E
  989.     MOV    A,H
  990.     SBB    D
  991.     JC    DEL5
  992.     CMP    M        ;END OF PREVIOUS LINE
  993.     INX    H
  994.     INX    H
  995.     JZ    DEL3
  996.     INX    H
  997. DEL3:    CALL    LODM        ;LOAD NEW MAX LINE NO
  998.     LXI    H,MAXL+3        ;SET ADDRESS
  999.     CALL    STOM        ;STORE NEW MAX LINE NO
  1000.     RET
  1001. DEL4:    CMP    B        ;CHECK SWITCH
  1002. DEL5:    XCHG
  1003.     JNZ    DEL3-1
  1004.     STA    MAXL        ;MAKE MAX LINE NO A SMALL NUMBER
  1005.     RET
  1006. ; GET HERE IF DELETION IS IN MIDDLE OF FILE AREA
  1007. NOVR:    CALL    FI1        ;FIND END OF FILE AREA
  1008.     CZ    FI2        ;NEXT LINE IF THIS LINE NO IS EQUAL
  1009. NOV1:    XCHG
  1010.     LHLD    DELP        ;CHAR MOVE TO POSITION
  1011.     MVI    C,1        ;MOVE TERMINATION
  1012.     CALL    LMOV        ;COMPACT FILE AREA
  1013.     SHLD    EOFP        ;SET EOF POSITION
  1014.     MVI    M,1        ;SET EOF INDICATOR
  1015.     RET
  1016. ; STARTING HERE IS THE SELF ASSEMBLER PROGRAM
  1017. ; THIS PROGRAM ASSEMBLES PROGRAMS WHICH ARE
  1018. ; IN THE FILE AREA
  1019. ASSM:    CALL    VCHK        ;CHECK FOR PARAMETER
  1020.     LDA    ABUF+4        ;GET 2ND PARAMETER
  1021.     ORA    A        ;CHECK FOR PARAMETERS
  1022.     JNZ    ASM4
  1023.     LHLD    BBUF        ;FETCH 1ST PARAMETER
  1024.     SHLD    BBUF+2        ;STORE INTO 2ND PARAMETER
  1025. ASM4:    LDA    IBUF+4        ;FETCH INPUT CHAR
  1026.     CPI    'E'        ;ERROR ONLY INDICATOR
  1027.     JNZ    ASM5
  1028.     XRA    A        ;SET FOR ONLY ERRORS
  1029. ASM5:    STA    AERR        ;SET ERROR SWITCH
  1030.     XRA    A        ;GET A ZERO
  1031.     STA    NOLA        ;INITIALIZE LABEL COUNT
  1032. ASM3:    STA    PASI        ;SET PASS INDICATOR
  1033.     LHLD    BBUF        ;FETCH ORIGIN
  1034.     SHLD    ASPC        ;INITIALIZE PC
  1035.     LHLD    BOFP        ;GET START OF FILE
  1036.     SHLD    APNT        ;SAVE ADDRESS
  1037. ASM1:    LHLD    APNT        ;FETCH LINE POINTER
  1038.     LXI    SP,AREA+18
  1039.     MOV    A,M        ;FETCH CHAR
  1040.     CPI    1        ;END OF FILE
  1041.     JZ    EASS        ;JUMP IF END OF FILE
  1042.     XCHG
  1043.     INX    D        ;INCREMENT ADDRESS
  1044.     LXI    H,OBUF        ;BLANK START ADDRESS
  1045.     MVI    A,IBUF-5        ;BLANK END ADDRESS
  1046.     CALL    CLER        ;BLANK OUT BUFFER
  1047.     MVI    C,ASCR        ;STOP CHAR
  1048.     CALL    LMOV        ;MOVE LINE INTO BUFFER
  1049.     MOV    M,C        ;PLACE CR IN BUFFER
  1050.     XCHG
  1051.     SHLD    APNT        ;SAVE ADDRESS
  1052.     LDA    PASI        ;FETCH PASS INDICATOR
  1053.     ORA    A        ;SET FLAGS
  1054.     JNZ    ASM2        ;JUMP IF PASS 2
  1055.     CALL    PAS1
  1056.     JMP    ASM1
  1057. ASM2:    CALL    PAS2
  1058.     LXI    H,OBUF        ;OUTPUT BUFFER ADDRESS
  1059.     CALL    AOUT        ;OUTPUT LINE
  1060.     JMP    ASM1
  1061. ; THIS ROUTINE IS USED TO OUTPUT THE LISTING FOR AN ASSEMBLY
  1062. ; IT CHECKS WHETHER ALL LINES ARE PRINTED OR ONLY THOSE
  1063. ; WITH ERRORS DEPENDING UPON THE ERROR SWITCH
  1064. AOUT:    LDA    AERR        ;FETCH ERROR SWITCH
  1065.     ORA    A        ;SET FLAGS
  1066.     JNZ    AOU1        ;OUTPUT ALL LINES
  1067. AOU2:    LDA    OBUF+18        ;FETCH ERROR INDICATOR
  1068.     CPI    ' '        ;CHECK FOR AN ERROR
  1069.     RZ        ;RETURN IF NO ERROR
  1070. AOU1:    LXI    H,OBUF        ;OUTPUT BUFFER ADDRESS
  1071.     CALL    CRLF
  1072.     CALL    SCRN        ;OUTPUT LINE
  1073.     RET
  1074. ; PASS 1  OF ASSEMBLER.  USED TO FORM SYMBOL TABLE
  1075. PAS1:    CALL    ZBUF        ;CLEAR BUFFER
  1076.     STA    PASI        ;SET FOR PASS 1
  1077.     LXI    H,IBUF        ;INITIALIZE LINE POINTER
  1078.     SHLD    PNTR        ;SAVE ADDRESS
  1079.     MOV    A,M        ;FETCH CHAR
  1080.     CPI    ' '        ;CHECK FOR A BLANK
  1081.     JZ    OPC        ;JUMP IF NO LABEL
  1082.     CPI    ';'        ;CHECK FOR COMMENT
  1083.     RZ        ;RETURN IF COMMENT
  1084. ; PROCESS LABEL
  1085.     CALL    SLAB        ;GET AND CHECK LABEL
  1086.     JC    OP5        ;ERROR IN LABEL
  1087.     JZ    ERRD        ;DUPLICATE LABEL
  1088.     CALL    LCHK        ;CHECK CHAR AFTER LABEL
  1089.     JNZ    OP5        ;ERROR IF NO BLANK
  1090.     MVI    C,LLAB        ;LENGTH OF LABELS
  1091.     LXI    H,ABUF        ;SET BUFFER ADDRESS
  1092. MLAB:    MOV    A,M        ;FETCH NEXT CHAR
  1093.     STAX    D        ;STORE IN SYMBOL TABLE
  1094.     INX    D
  1095.     INX    H
  1096.     DCR    C        ;DECR COUNT
  1097.     JNZ    MLAB
  1098.     XCHG
  1099.     SHLD    TABA        ;SAVE TABLE ADDRESS FOR EQU
  1100.     LDA    ASPC        ;FETCH PC (LOW)
  1101.     MOV    M,A        ;STORE IN TABLE
  1102.     INX    H
  1103.     LDA    ASPC+1        ;FETCH PC (HIGH)
  1104.     MOV    M,A        ;STORE IN TABLE
  1105.     LXI    H,NOLA
  1106.     INR    M        ;INCR NUMBER OF LABELS
  1107. ; PROCESS OPCODE
  1108. OPC:    CALL    ZBUF        ;ZERO WORKING BUFFER
  1109.     CALL    SBLK        ;SCAN TO OPCODE
  1110.     JC    OERR        ;FOUND CARRIAGE RETURN
  1111.     CALL    ALPS        ;PLACE OPCODE IN BUFFER
  1112.     CPI    ' '        ;CHECK FOR BLANK AFTER OPCODE
  1113.     JC    OPCD        ;CR AFTER OPCODE
  1114.     JNZ    OERR        ;ERROR IF NO BLANK
  1115.     JMP    OPCD        ;CHECK OPCODE
  1116. ;  
  1117. ; THIS ROUTINE CHECKS THE CHAR AFTER A LABEL FOR A BLANK
  1118. ; OR A COLON
  1119. LCHK:    LHLD    PNTR
  1120.     MOV    A,M        ;GET CHAR AFTER LABEL
  1121.     CPI    ' '        ;CHECK FOR A BLANK
  1122.     RZ        ;RETURN IF A BLANK
  1123.     CPI    ':'        ;CHECK FOR A COLON
  1124.     RNZ
  1125.     INX    H
  1126.     SHLD    PNTR        ;SAVE POINTER
  1127.     RET
  1128. ; PROCESS ANY PSEUDO OPS THAT NEED TO BE IN PASS 1
  1129. PSU1:    CALL    SBLK        ;SCAN TO OPERAND
  1130.     LDAX    D        ;FETCH VALUE
  1131.     ORA    A        ;SET FLAGS
  1132.     JZ    ORG1        ;ORG OPCODE
  1133.     JM    DAT1        ;DATA STATEMENT
  1134.     JPO    EQU1        ;EQU OP
  1135.     CPI    5
  1136.     JC    RES1        ;RES OPCODE
  1137.     JNZ    EASS        ;JUMP IF END
  1138. ; DO DW PSEUDO OP
  1139. ACO1:    MVI    C,2        ;2 BYTE INSTRUCTION
  1140.     XRA    A        ;GET A ZERO
  1141.     JMP    OCN1        ;ADD VALUE TO PROGRAM COUNTER
  1142. ; DO ORG PSEUDO OP
  1143. ORG1:    CALL    ASCN        ;GET OPERAND
  1144.     LDA    OBUF+18        ;FETCH ERROR INDICATOR
  1145.     CPI    ' '        ;CHECK FOR AN ERROR
  1146.     RNZ        ;IF ERROR DON'T CHANGE PC
  1147.     SHLD    ASPC        ;STORE NEW ORIGIN
  1148.     LDA    IBUF        ;GET FIRST CHAR
  1149.     CPI    ' '        ;CHECK FOR LABEL
  1150.     RZ        ;NO LABEL
  1151.     JMP    EQUS        ;CHANGE LABEL VALUE
  1152. ; DO EQU PSEUDO OP
  1153. EQU1:    CALL    ASCN        ;GET OPERAND
  1154.     LDA    IBUF        ;FETCH 1ST CHAR
  1155.     CPI    ' '        ;CHECK FOR LABEL
  1156.     JZ    ERRM        ;MISSING LABEL
  1157. EQUS:    XCHG
  1158.     LHLD    TABA        ;SYMBOL TABLE ADDRESS
  1159.     MOV    M,E        ;STORE LABEL VALUE
  1160.     INX    H
  1161.     MOV    M,D
  1162.     JMP    AOU2        ;OUTPUT IF ERROR
  1163. ; DO DS PSEUDO OP
  1164. RES1:    CALL    ASCN        ;GET OPERAND
  1165.     MOV    B,H
  1166.     MOV    C,L
  1167.     JMP    RES21        ;ADD VALUE TO PROGRAM COUNTER
  1168. ; DO DB PSEUDO OP
  1169. DAT1:    JMP    DAT1X
  1170. ;
  1171. ; PERFORM PASS 2 OF THE ASSEMBLER
  1172. ;
  1173. PAS2:    LXI    H,OBUF        ;SET OUTPUT BUFFER ADDRESS
  1174.     LDA    ASPC+1        ;FETCH PC (HIGH)
  1175.     CALL    BINH+3        ;CONVERT FOR OUTPUT
  1176.     INX    H
  1177.     LDA    ASPC        ;FETCH PC(LOW)
  1178.     CALL    BINH+3        ;CONVERT FOR OUTPUT
  1179.     SHLD    OIND        ;SAVE OUTPUT ADDRESS
  1180.     CALL    ZBUF        ;CLEAR BUFFER
  1181.     LXI    H,IBUF        ;INITIALIZE LINE POINTER
  1182. PABL:    SHLD    PNTR        ;SAVE POINTER
  1183.     MOV    A,M        ;FETCH FIRST CHAR
  1184.     CPI    ' '        ;CHECK FOR LABEL
  1185.     JZ    OPC        ;GET OPCODE
  1186.     CPI    ';'        ;CHECK FOR COMMENT
  1187.     RZ        ;RETURN IF COMMENT
  1188.     CALL    SLAB        ;SCAN OFF LABEL
  1189.     JC    ERRL        ;ERROR IN LABEL
  1190.     CALL    LCHK        ;CHECK FOR A BLANK OR COLON
  1191.     JNZ    ERRL        ;ERROR IF NOT A BLANK
  1192.     JMP    OPC
  1193. ; PROCESS PSEUDO OPS FOR PASS 2
  1194. PSU2:    LDAX    D
  1195.     ORA    A        ;SET FLAGS
  1196.     JZ    ORG2        ;ORG OPCODE
  1197.     JM    DAT2        ;DATA OPCODE
  1198.     RPO        ;RETURN IF EQU
  1199.     CPI    5
  1200.     JC    RES2        ;RES OPCODE
  1201.     JNZ    EASS        ;END OPCODE
  1202. ; DO DW PSEUDO OP
  1203. ACO2:    CALL    TYS6        ;GET VALUE
  1204.     JMP    ACO1
  1205. ; DO DS PSEUDO OP
  1206. RES2:    CALL    ASBL        ;GET OPERAND
  1207.     MOV    B,H
  1208.     MOV    C,L
  1209.     LHLD    BBUF+2        ;FETCH STORAGE COUNTER
  1210.     DAD    B        ;ADD VALUE
  1211.     SHLD    BBUF+2        ;GET A ZERO
  1212. RES21:    XRA    A
  1213.     JMP    OCN2
  1214. ; DO DB PSEUDO OP
  1215. DAT2:    CALL    TYS5        ;GET OPERAND
  1216. DAT1X:    XRA    A        ;GET A ZERO
  1217.     MVI    C,1        ;BYTE COUNT
  1218.     JMP    OCN1
  1219. ; DO ORG PSEUDO OP
  1220. ORG2:    CALL    ASBL        ;GET NEW ORIGIN
  1221.     LDA    OBUF+18        ;GET ERROR INDICATOR
  1222.     CPI    ' '        ;CHECK FOR AN ERROR
  1223.     RNZ
  1224.     XCHG
  1225.     LHLD    ASPC        ;FETCH PC
  1226.     XCHG
  1227.     SHLD    ASPC        ;STORE NEW PC
  1228.     MOV    A,L
  1229.     SUB    E        ;FORM DIFFERENCE OF ORIGINS
  1230.     MOV    E,A
  1231.     MOV    A,H
  1232.     SBB    D
  1233.     MOV    D,A
  1234.     LHLD    BBUF+2        ;FETCH STORAGE POINTER
  1235.     DAD    D        ;MODIFY
  1236.     SHLD    BBUF+2        ;SAVE
  1237.     RET
  1238. ; PROCESS 1 BYTE INSTRUCTIONS WITHOUT OPERANDS
  1239. TYP1:    CALL    ASTO        ;STORE VALUE IN MEMORY
  1240.     RET
  1241. ; PROCESS STAX AND LDAX 
  1242. TYP2:    CALL    ASBL        ;FETCH OPERAND
  1243.     CNZ    ERRR        ;ILLEGAL REGISTER
  1244.     MOV    A,L        ;GET LOW ORDER OPERAND
  1245.     ORA    A
  1246.     JZ    TY31        ;OPERAND = 0
  1247.     CPI    2        ;OPERAND = 2
  1248.     CNZ    ERRR        ;ILLEGAL REGISTER
  1249.     JMP    TY31
  1250. ; PROCESS PUSH,POP,INX,DCX,DAD INSTRUCTIONS
  1251. TYP3:    CALL    ASBL        ;FETCH OPERAND
  1252.     CNZ    ERRR        ;ILLEGAL REGISTER
  1253.     MOV    A,L        ;GET LOW ORDER OPERAND
  1254.     RRC        ;CHECK LOW ORDER BIT
  1255.     CC    ERRR        ;ILLEGAL REGISTER
  1256.     RAL        ;RESTORE OPERAND
  1257.     CPI    8
  1258.     CNC    ERRR        ;ILLEGAL REGISTER
  1259. TY31:    RLC        ;MULTIPLY BY 8
  1260.     RAL
  1261.     RAL
  1262. TY32:    MOV    B,A
  1263.     LDAX    D        ;FETCH OPCODE BASE
  1264.     ADD    B        ;FORM OPCODE
  1265.     CPI    118        ;CHECK FOR MOV M,M
  1266.     CZ    ERRR        ;ILLEGAL REGISTER
  1267.     JMP    TYP1
  1268. ; PROCESS ACCUMULATOR, INR,DCR,MOV,RST INSTRUCTION
  1269. TYP4:    CALL    ASBL        ;FETCH OPERAND
  1270.     CNZ    ERRR        ;ILLEGAL REGISTER
  1271.     MOV    A,L        ;GET LOW ORDER OPERAND
  1272.     CPI    8
  1273.     CNC    ERRR        ;ILLEGAL REGISTER
  1274.     LDAX    D        ;FETCH OPCODE BASE
  1275.     CPI    64        ;CHECK MOV INSTRUCTION
  1276.     JZ    TY41    
  1277.     CPI    199    
  1278.     MOV    A,L
  1279.     JZ    TY31        ;RST INST
  1280.     JM    TY32        ;ACCUMULATOR INST
  1281.     JMP    TY31        ;INR,DCR
  1282. ; PROCESS MOV INSTRUCTION
  1283. TY41:    DAD    H        ;MULTIPLY OPERAND BY 8
  1284.     DAD    H
  1285.     DAD    H
  1286.     ADD    L        ;FORM OPCODE
  1287.     STAX    D        ;SAVE OPCODE
  1288.     CALL    MPNT        ;INCR POINTER
  1289.     CALL    ASCN        ;GET NEXT OPERAND
  1290.     CNZ    ERRR        ;ILLEGAL REGISTER
  1291.     MOV    A,L        ;FETCH LOW ORDER OPERAND
  1292.     CPI    8
  1293.     CNC    ERRR        ;ILLEGAL REGISTER
  1294.     JMP    TY32
  1295. ;
  1296. ; PROCESS IMMEDIATE INSTRUCTIONS
  1297. ; IMMEDIATE BYTE CAN BE BETWEEN -256 AND +255
  1298. ; MVI INSTRUCTION IS A SPECIAL CASE AND CONTAINS 2 ARGUMENTS
  1299. ; IN OPERAND
  1300. TYP5:    CPI    6        ;CHECK FOR MVI INST
  1301.     CZ    TY56    
  1302.     CALL    ASTO        ;STORE OBJECT CODE BYTE
  1303. TYS5:    CALL    ASBL        ;GET IMMEDIATE ARGUMENT
  1304.     INR    A
  1305.     CPI    2        ;CHECK OPERAND FOR RANGE
  1306.     CNC    ERRV        ;OPERAND OUT OF RANGE
  1307.     MOV    A,L
  1308.     JMP    TYP1
  1309. ; FETCH 1ST ARGUMENT FOR MVI AND LXI INSTRUCTIONS
  1310. TY56:    CALL    ASBL        ;FETCH ARG
  1311.     CNZ    ERRR        ;ILLEGAL REGISTER
  1312.     MOV    A,L        ;GET LOW ORDER ARGUMENT
  1313.     CPI    8
  1314.     CNC    ERRR        ;ILLEGAL REGISTER
  1315.     DAD    H        ;MULTIPLY BY 8
  1316.     DAD    H
  1317.     DAD    H
  1318.     LDAX    D        ;FETCH OPCODE BASE
  1319.     ADD    L        ;FORM OPCODE
  1320.     MOV    E,A        ;SAVE OBJECT BYTE
  1321. MPNT:    LHLD    PNTR        ;FETCH POINTER
  1322.     MOV    A,M        ;FETCH CHARACTER
  1323.     CPI    ','        ;CHECK FOR COMMA
  1324.     INX    H        ;INCR POINTER
  1325.     SHLD    PNTR    
  1326.     JNZ    ERRS        ;SYNTAX ERROR IN NO COMMA
  1327.     MOV    A,E        ;GET OBJECT BYTE
  1328.     RET
  1329. ; PROCESS 3 BYTE INSTRUCTIONS
  1330. ; LXI IS A SPECIAL CASE
  1331. ;
  1332. TYP6:    CPI    1        ;CHECK FOR LXI
  1333.     JNZ    TY6        ;JUMP IF NOT LXI
  1334.     CALL    TY56        ;GET REGISTER
  1335.     ANI    8        ;CHECK FOR ILLEGAL REGISTER
  1336.     CNZ    ERRR        ;REGISTER ERROR
  1337.     MOV    A,E        ;GET OPCODE
  1338.     ANI    0F7H        ;CLEAR BIT IN ERROR
  1339. TY6:    CALL    ASTO        ;STORE OBJECT BYTE
  1340. TYS6:    CALL    ASBL        ;FETCH OPERAND
  1341.     MOV    A,L
  1342.     MOV    D,H
  1343.     CALL    ASTO        ;STORE 2ND BYTE
  1344.     MOV    A,D
  1345.     JMP    TYP1
  1346.     RET
  1347. ; THIS ROUTINE IS USED TO STORE OBJECT CODE PRODUCED
  1348. ; BY THE ASSEMBLER DURING PASS 2 INTO MEMORY
  1349. ASTO:    LHLD    BBUF+2        ;FETCH STORAGE ADDRESS
  1350.     MOV    M,A        ;STORE OBJECT BYTE
  1351.     INX    H
  1352.     SHLD    BBUF+2
  1353.     LHLD    OIND        ;FETCH OUTPUT ADDRESS
  1354.     INX    H
  1355.     INX    H
  1356.     CALL    BINH+3        ;CONVERT OBJECT BYTE
  1357.     SHLD    OIND
  1358.     RET
  1359. ; GET HERE WHEN END PSEUDO OP IS FOUND OR WHEN END OF FILE
  1360. ; OCCURS IN SOURCE STATEMENTS.  CONTROL IS SET FOR EITHER PASS 2
  1361. ; OR ASSEMBLY TERMINATES IF FINISHED.
  1362. EASS:    LDA    PASI        ;FETCH PASS INDICATOR
  1363.     ORA    A        ;SET FLAGS
  1364.     JNZ    EOR        ;JUMP IF FINISHED
  1365.     CALL    CRLF
  1366.     MVI    A,1        ;PASS INDICATOR FOR PASS 2
  1367.     JMP    ASM3        ;DO 2ND PASS
  1368. ; THIS ROUTINE SCANS THROUGH A CHARACTER STRING UNTIL
  1369. ; THE FIRST NON-BLANK CHARACTER IS FOUND
  1370. ; ON RETURN CARRY = 1 INDICATES A CR AS FIRST NON BLANK CHARACTER
  1371. SBLK:    LHLD    PNTR        ;FETCH ADDRESS
  1372. SBL1:    MOV    A,M        ;FETCH CHAR
  1373.     CPI    ' '        ;CHECK FOR A BLANK
  1374.     RNZ        ;RETURN IF NOT BLANK
  1375. SBL2:    INX    H    
  1376.     SHLD    PNTR        ;SAVE POINTER
  1377.     JMP    SBL1
  1378. ; THIS ROUTINE IS USED TO CHECK THE CONDITION CODE MNEMONICS
  1379. ; FOR CONDITIONAL JUMPS, CALLS, AND RETURN.
  1380. COND:    LXI    H,ABUF+1
  1381.     SHLD    ADDS
  1382.     MVI    B,2        ;2 CHARACTERS
  1383.     CALL    COPC
  1384.     RET
  1385. ; THE FOLLOWING IS THE OPCODE TABLE
  1386. OTAB:    DB    'ORG',0,0
  1387.     DB    'EQU',0,1
  1388.     DB    'DB',0,0,-1
  1389.     DB    'DS',0,0,3
  1390.     DB    'DW',0,0,5
  1391.     DB    'END',0,6,0
  1392.     DB    'HLT',76H
  1393.     DB    'RLC',7
  1394.     DB    'RRC',0FH
  1395.     DB    'RAL',17H
  1396.     DB    'RAR',1FH
  1397.     DB    'RET',0C9H
  1398.     DB    'CMA',2FH
  1399.     DB    'STC',37H
  1400.     DB    'DAA',27H
  1401.     DB    'CMC',3FH
  1402.     DB    'EI',0,0FBH
  1403.     DB    'DI',0,0F3H
  1404.     DB    'NOP',0,0
  1405.     DB    'XCHG',0EBH
  1406.     DB    'XTHL',0E3H
  1407.     DB    'SPHL',0F9H
  1408.     DB    'PCHL',0E9H,0
  1409.     DB    'STAX',2
  1410.     DB    'LDAX',0AH,0
  1411.     DB    'PUSH',0C5H
  1412.     DB    'POP',0,0C1H
  1413.     DB    'INX',0,3
  1414.     DB    'DCX',0,0BH
  1415.     DB    'DAD',0,9,0
  1416.     DB    'INR',4
  1417.     DB    'DCR',5
  1418.     DB    'MOV',40H
  1419.     DB    'ADD',80H
  1420.     DB    'ADC',88H
  1421.     DB    'SUB',90H
  1422.     DB    'SBB',98H
  1423.     DB    'ANA',0A0H
  1424.     DB    'XRA',0A8H
  1425.     DB    'ORA',0B0H
  1426.     DB    'CMP',0B8H
  1427.     DB    'RST',0C7H,0
  1428.     DB    'ADI',0C6H
  1429.     DB    'ACI',0CEH
  1430.     DB    'SUI',0D6H
  1431.     DB    'SBI',0DEH
  1432.     DB    'ANI',0E6H
  1433.     DB    'XRI',0EEH
  1434.     DB    'ORI',0F6H
  1435.     DB    'CPI',0FEH
  1436.     DB    'IN',0,0DBH
  1437.     DB    'OUT',0D3H
  1438.     DB    'MVI',6,0
  1439.     DB    'JMP',0,0C3H
  1440.     DB    'CALL',0CDH
  1441.     DB    'LXI',0,1
  1442.     DB    'LDA',0,3AH
  1443.     DB    'STA',0,32H
  1444.     DB    'SHLD',22H
  1445.     DB    'LHLD',2AH,0
  1446. ; CONDITION CODE TABLE
  1447.     DB    'NZ',0
  1448.     DB    'Z',0,8
  1449.     DB    'NC',10H
  1450.     DB    'C',0,18H
  1451.     DB    'PO',20H
  1452.     DB    'PE',28H
  1453.     DB    'P',0,30H
  1454.     DB    'M',0,38H,0
  1455. ; THIS ROUTINE IS USED TO CHECK A GIVEN OPCODE AGAINST TO LEGAL
  1456. ; OPCODES CONTAINED IN THE OPCODE TABLE
  1457. COPC:    LHLD    ADDS
  1458.     LDAX    D        ;FETCH CHAR
  1459.     ORA    A
  1460.     JZ    COP1        ;JUMP IF TERMINATION CHAR
  1461.     MOV    C,B
  1462.     CALL    SEAR        ;COMPARE STRINGS
  1463.     LDAX    D
  1464.     RZ        ;RETURN IF MATCH
  1465.     INX    D        ;NEXT STRING
  1466.     JMP    COPC        ;CONTINUE SEARCH
  1467. COP1:    INR    A        ;CLEAR ZERO FLAG
  1468.     INX    D        ;INCR ADDRESS
  1469.     RET
  1470. ; THIS ROUTINE CHACKS THE LEGAL OPCODES IN BOTH PASS 1 AND
  1471. ; PASS 2.  IN PASS 1 THE PROGRAM COUNTER IS INCREMENTED BY THE
  1472. ; CORRECT NUMBER OF BYTES.  AN ADDRESS IS ALSO SET SO THAT
  1473. ; AN INDEXED JUMP CAN BE MADE TO PROCESS THE OPCODE FOR 
  1474. ; PASS 2
  1475. OPCD:    LXI    H,ABUF        ;SET ADDRESS
  1476.     SHLD    ADDS
  1477.     LXI    D,OTAB        ;OPCODE TABLE ADDRESS
  1478.     MVI    B,4        ;CHAR COUNT
  1479.     CALL    COPC        ;CHECK OPCODES
  1480.     JZ    PSEU        ;JUMP IF A PSEUDO OP
  1481.     DCR    B        ;3 CHAR OPCODES
  1482.     CALL    COPC
  1483.     JZ    OP1
  1484.     INR    B        ;4 CHAR OPCODES
  1485.     CALL    COPC
  1486. OP1:    LXI    H,TYP1        ;TYPE 1 INST
  1487. OP2:    MVI    C,1        ;1 BYTE INST
  1488.     JZ    OCNT
  1489. OPC2:    CALL    COPC        ;CHECK FOR STAX, LDAX
  1490.     LXI    H,TYP2
  1491.     JZ    OP2
  1492.     CALL    COPC        ;CHECK FOR PUSH,POP,INX,DCX,DAD
  1493.     LXI    H,TYP3
  1494.     JZ    OP2
  1495.     DCR    B        ;3 CHAR OPCODES
  1496.     CALL    COPC        ;ACCUMULATOR INST'S,INR,DCR,MOV,RST
  1497.     LXI    H,TYP4
  1498.     JZ    OP2
  1499. OPC3:    CALL    COPC        ;IMMEDIATE INSTRUCTIONS
  1500.     LXI    H,TYP5
  1501.     MVI    C,2        ;2 BYTE INSTRUCTIONS
  1502.     JZ    OCNT
  1503.     INR    B        ;4 CHAR OPCODES
  1504.     CALL    COPC        ;JMP,CALL,LXI,LDA,STA,LHLD,SHLD OPCODES
  1505.     JZ    OP4
  1506.     CALL    COND        ;CONDITIONAL INSTRUCTIONS
  1507.     JNZ    OERR        ;ILLEGAL OPCODE
  1508.     ADI    0C0H        ;ADD BASE VALUE OF RETURN
  1509.     MOV    D,A
  1510.     MVI    B,3        ;3 CHAR OPCODES
  1511.     LDA    ABUF        ;FETCH FIRST CHAR
  1512.     MOV    C,A        ;SAVE CHAR
  1513.     CPI    'R'        ;CONDITIONAL RETURN
  1514.     MOV    A,D
  1515.     JZ    OP1
  1516.     MOV    A,C
  1517.     INR    D        ;FORM CONDITIONAL JUMP
  1518.     INR    D
  1519.     CPI    'J'        ;CONDITIONAL JUMP
  1520.     JZ    OPAD
  1521.     CPI    'C'        ;CONDITIONAL CALL
  1522.     JNZ    OERR        ;ILLEGAL OPCODE
  1523.     INR    D        ;FORM CONDITIONAL CALL
  1524.     INR    D
  1525. OPAD:    MOV    A,D        ;GET OPCODE
  1526. OP4:    LXI    H,TYP6
  1527. OP5:    MVI    C,3        ;3 BYTE INSTRUCTION
  1528. OCNT:    STA    TEMP        ;SAVE OPCODE
  1529. ; CHECK FOR OPCODE ONLY CONTAINING THE CORRECT NUMBER OF CHARACTERS
  1530. ; THUS, SAY, ADDQ WOULD GIVE AN ERROR
  1531.     MVI    A,ABUF        ;LOAD BUFFER ADDRESS
  1532.     ADD    B        ;ADD LENGTH OF OPCODE
  1533.     MOV    E,A
  1534.     MVI    A,ABUF SHR 8        ;LOAD BUFFER ADDRESS
  1535.     ACI    0        ;GET HIGH ORDER PART
  1536.     MOV    D,A
  1537.     LDAX    D        ;FETCH CHAR AFTER OPCODE
  1538.     ORA    A        ;IS SHOULD BE ZERO
  1539.     JNZ    OERR        ;OPCODE ERROR
  1540.     LDA    PASI        ;FETCH PASS INDICATOR
  1541. OCN1:    MVI    B,0
  1542.     XCHG
  1543. OCN2:    LHLD    ASPC        ;FETCH PROGRAM COUNTER
  1544.     DAD    B        ;ADD IN BYTE COUNT
  1545.     SHLD    ASPC        ;STORE PC
  1546.     ORA    A        ;WHICH PASS
  1547.     RZ        ;RETURN IF PASS 1
  1548.     LDA    TEMP        ;FETCH OPCODE
  1549.     XCHG
  1550.     PCHL
  1551. OERR:    LXI    H,ERRO        ;SET ERROR ADDRESS
  1552.     MVI    C,3        ;LEAVE 3 BYTES FOR PATCH
  1553.     JMP    OCN1-3
  1554. PSEU:    LXI    H,ABUF+4        ;SET BUFFER ADDRESS
  1555.     MOV    A,M        ;FETCH CHAR AFTER OPCODE
  1556.     ORA    A        ;SHOULD BE A ZERO
  1557.     JNZ    OERR
  1558.     LDA    PASI        ;FETCH PASS INDICATOR
  1559.     ORA    A
  1560.     JZ    PSU1
  1561.     JMP    PSU2
  1562. ;  
  1563. ; THIS ROUTINE IS USED TO PROCESS LABELS
  1564. ; IT CHECKS WHETHER A LABEL IS IN THE SYMBOL TABLE OR NOT
  1565. ; ON RETURN Z=1 MEANS A MATCH WAS FOUND AND H,L CONTAIN THE VALUE
  1566. ; ASSOCIATED WITH THE LABEL.  OTHERWISE D,E POINT TO THE NEXT AVAILABLE
  1567. ; LOCATION IN THE TABLE.  THE REGISTER NAMES A,B,C,D,E,H,L,M 
  1568. ; ARE PREDEFINED BY THE SYSTEM AND NEED NOT BE ENTERED BY THE USER
  1569. ; ON RETURN C=1 INDICATES A LABEL ERROR
  1570. SLAB:    CPI    'A'        ;CHECK FOR LEGAL CHAR
  1571.     RC        ;RETURN IF ILLEGAL CHAR
  1572.     CPI    'Z'+1
  1573.     CMC    
  1574.     RC        ;RETURN IF ILLEGAL CHAR
  1575.     CALL    ALPS        ;PLACE SYMBOL IN BUFFER
  1576.     LXI    H,ABUF        ;SET BUFFER ADDRESS
  1577.     SHLD    ADDS        ;SAVE ADDRESS
  1578.     DCR    B        ;CHECK IF ONE CHAR
  1579.     JNZ    SLA1
  1580. ; CHECK IF PREDEFINED REGISTER NAME
  1581.     INR    B        ;SET B=1
  1582.     LXI    D,RTAB        ;REGISTER TABLE ADDRESS
  1583.     CALL    COPC        ;CHECK NAME OF REGISTER
  1584.     JNZ    SLA1        ;NOT A PREDEFINED REGISTER
  1585.     MOV    L,A
  1586.     MVI    H,0        ;SET VALUE (HIGH)
  1587.     JMP    SLA2
  1588. SLA1:    LDA    NOLA        ;FETCH SYMBOL COUNT
  1589.     MOV    B,A
  1590.     LXI    D,SYMT        ;SET SYMBOL TABLE ADDRESS
  1591.     ORA    A        ;ARE THERE ANY LABELS
  1592.     JZ    SLA3        ;JUMP IF NO LABELS
  1593.     MVI    A,LLAB        ;FETCH LENGTH OF TABLE
  1594.     STA    NCHR
  1595.     CALL    COMS        ;CHECK TABLE
  1596. SLA2:    STC    
  1597.     CMC        ;CLEAR CARRY
  1598.     RET
  1599. SLA3:    INR    A        ;CLEAR ZERO FLAG
  1600.     ORA    A        ;CLEAR CARRY
  1601.     RET
  1602. ; PREDEFINE REGISTER VALUES IN THIS TABLE
  1603. RTAB:    DB    'A',7
  1604.     DB    'B',0
  1605.     DB    'C',1
  1606.     DB    'D',2
  1607.     DB    'E',3
  1608.     DB    'H',4
  1609.     DB    'L',5
  1610.     DB    'M',6
  1611.     DB    0        ;END OF TABLE INDICATOR
  1612. ; THIS ROUTINE SCANS THE INPUT LINE AND PLACES THE OPCODES AND
  1613. ; LABELS IN THE BUFFER.  THE SCAN TERMINATES WHEN A CHARACTER
  1614. ; OTHER THAN 0-9 OR A-Z IS FOUND
  1615. ALPS:    MVI    B,0        ;SET COUNT
  1616. ALP1:    STAX    D        ;STORE CHAR IN BUFFER
  1617.     INR    B        ;INCR COUNT
  1618.     MOV    A,B        ;FETCH COUNT
  1619.     CPI    11        ;MAX BUFFER SIZE
  1620.     RNC        ;RETURN IF BUFFER FILLED
  1621.     INX    D        ;INCR BUFFER
  1622.     INX    H        ;INCR INPUT ADDRESS
  1623.     SHLD    PNTR        ;SAVE LINE POINTER
  1624.     MOV    A,M        ;FETCH CHAR
  1625.     CPI    '0'        ;CHECK FOR LEGAL CHAR
  1626.     RC
  1627.     CPI    '9'+1
  1628.     JC    ALP1
  1629.     CPI    'A'
  1630.     RC
  1631.     CPI    'Z'+1
  1632.     JC    ALP1
  1633.     RET
  1634. ; THIS ROUTINE IS USED TO SCAN THROUGH THE INPUT LINE TO 
  1635. ; FETCH THE VALUE OF THE OPERAND FIELD.  ON RETURN THE VALUE OF THE
  1636. ; OPERAND IS CONTAINED IN REGISTERS H,L
  1637. ASBL:    CALL    SBLK        ;GET FIRST ARGUMENT
  1638. ASCN:    LXI    H,0        ;GET A ZERO
  1639.     SHLD    OPRD        ;INITIALIZE OPERAND
  1640.     INR    H
  1641.     SHLD    OPRI-1        ;INITIALIZE OPERAND INDICATOR
  1642. NXT1:    LHLD    PNTR        ;FETCH SCAN POINTER
  1643.     DCX    H
  1644.     CALL    ZBUF        ;CLEAR BUFFER
  1645.     STA    SIGN        ;ZERO SIGN INDICATOR
  1646. NXT2:    INX    H        ;INCR POINTER
  1647.     MOV    A,M        ;FETCH NEXT CHAR
  1648.     CPI    ' '+1
  1649.     JC    SEND        ;JUMP IF CR OR BLANK
  1650.     CPI    ','        ;FIELD SEPARATOR
  1651.     JZ    SEND
  1652. ; CHECK FOR OPERATORS
  1653.     CPI    '+'        ;CHECK FOR PLUS
  1654.     JZ    ASCI    
  1655.     CPI    '-'        ;CHECK FOR MINUS
  1656.     JNZ    ASC2
  1657.     STA    SIGN
  1658. ASCI:    LDA    OPRI        ;FETCH OPERAND INDICATOR
  1659.     CPI    2        ;CHECK FOR TWO OPERATORS
  1660.     JZ    ERRS        ;SYNTAX ERROR
  1661.     MVI    A,2
  1662.     STA    OPRI        ;SET INDICATOR
  1663.     JMP    NXT2
  1664. ; CHECK FOR OPERANDS
  1665. ASC2:    MOV    C,A        ;SAVE CHAR
  1666.     LDA    OPRI        ;GET INDICATOR
  1667.     ORA    A        ;CHECK FOR TWO OPERANDS
  1668.     JZ    ERRS        ;SYNTAX ERROR
  1669.     MOV    A,C
  1670.     CPI    '$'        ;LC EXPRESSION
  1671.     JNZ    ASC3
  1672.     INX    H
  1673.     SHLD    PNTR        ;SAVE POINTER
  1674.     LHLD    ASPC        ;FETCH LOCATION COUNTER
  1675.     JMP    AVAL
  1676. ; CHECK FOR ASCII CHARS
  1677. ASC3:    CPI    2 TABLE END ADDRESS
  1678. ASPC:    DS    2        ;ASSEMBLER PROGRAM COUNTER
  1679. PASI:    DS    1        ;PASS INDICATOR
  1680. NCHR:    DS    1        ;LENGTH OF STRING FOR COMPARE
  1681. PNTR:    DS    2        ;LINE POINTER STORAGE
  1682. NOLA:    DS    1        ;NUMBER OF LABELS
  1683. SIGN:    DS    1        ;SIGN STORAGE FOR SCAN
  1684. OPRD:    DS    2        ;OPERAND STORAGE
  1685. OPRI:    DS    1        ;OPERAND FOUND INDICATOR
  1686. TEMP:    DS    1
  1687. APNT    EQU    INSP        ;ASSEMBLER LINE POINTER
  1688. AERR    EQU    SCNT        ;ASSEMBLER ERROR PRINT SWITCH
  1689. OIND:    DS    2        ;OUTPUT ADDRESS
  1690. LLAB    EQU    5        ;LENGTH OF LABELS
  1691. AREA:    DS    18
  1692. OBUF:    DS    25        ;OUTPUT BUFFER AREA
  1693.     DS    5:    CPI    '0'        ;CHECK FOR NUMERIC
  1694.     JC    ERRA        ;ILLEGAL CHAR
  1695.     CPI    '9'+1
  1696.     JNC    ALAB
  1697.     CALL    NUMS        ;GET NUMERIC VALUE
  1698.     JC    ERRA        ;ARGUMENT ERROR
  1699. AVAL:    XCHG
  1700.     LHLD    OPRD        ;FETCH OPERAND
  1701.     XRA    A        ;GET A ZERO
  1702.     STA    OPRI        ;STORE IN OPERAND INDICATOR
  1703.     LDA    SIGN        ;GET SIGN INDICATOR
  1704.     ORA    A        ;SET FLAGS
  1705.     JNZ    ASUB
  1706.     DAD    D        ;FORM RESULT
  1707. ASC7:    SHLD    OPRD        ;SAVE RESULT
  1708.     JMP    NXT1
  1709. ASUB:    MOV    A,L
  1710.     SUB    E
  1711.     MOV    L,A
  1712.     MOV    A,H
  1713.     SBB    D
  1714.     MOV    H,A
  1715.     JMP    ASC7
  1716. ALAB:    CALL    SLAB
  1717.     JZ    AVAL
  1718.     JC    ERRA        ;ILLEGAL SYMBOL
  1719.     JMP    ERRU        ;UNDEFINEσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσR ADDRESS
  1720.     CPI    'H'        ;IS IT HEX
  1721.     JZ    NUM2
  1722.     CPI    'D'        ;IS IT DECIMAL
  1723.     JNZ    NUM1
  1724.     XRA    A        ;GET A ZERO
  1725.     STAX    D        ;CLEAR D FROM BUFFER
  1726. NUM1:    CALL    ADEC        ;CONVERT DECIMAL VALUE
  1727.     RET
  1728. NUM2:    XRA    A
  1729.     STAX    D        ;CLEAR H FROM BUFFER
  1730.     CALL    AHEX        ;CONVERT HEX
  1731.     RET
  1732. ; PROCESS REGISTER ERROR
  1733. ERRR:    MVI    A,'R'        ;GET INDICATOR
  1734.     LXI    H,0
  1735.     STA    OBUF+18        ;SET IN OUTPUT BUFFER
  1736.     RET
  1737. ; PROCESS SYNTAX ERROR
  1738. ERRS:    MVI    A,'S'
  1739.     STA    OBUF+18
  1740.     LXI    H,0
  1741.     RET
  1742. ; PROCESS UNDEFINED SYMBOL ERROR
  1743. ERRU:    MVI    A,'U'
  1744.     JMP    ERRS+2
  1745. ; PROCESS VALUE ERROR
  1746. ERRV:    MVI    A,'V'
  1747.     JMP    ERRR+2
  1748. ; PROCESS MISSING LABEL ERROR
  1749. ERRM:    MVI    A,'M'
  1750.     STA    OBUF+18
  1751.     CALL    AOU1
  1752.     RET
  1753. ; PROCESS ARGUMENT ERROR
  1754. ERRA:    MVI    A,'A'
  1755.     JMP    ERRS+2
  1756. ; PROCESS OPCODE ERROR
  1757. ; STORE 3 BYTES OF ZERO IN OBJECT CODE TO PROVIDE FOR PATCH
  1758. ERRO:    MVI    A,'O'
  1759.     STA    OBUF+18
  1760.     LDA    PASI        ;FETCH PASS INDICATOR
  1761.     ORA    A
  1762.     RZ        ;RETURN IF PASS 1
  1763.     MVI    C,3        ;NEED 3 BYTES
  1764. ERO1:    XRA    A        ;GET A ZERO
  1765.     CALL    ASTO        ;PUT IN LISTING AND MEMORY
  1766.     DCR    C
  1767.     JNZ    ERO1
  1768.     RET
  1769. ; PROCESS LABEL ERROR
  1770. ERRL:    MVI    A,'L'
  1771.     JMP    ERRO+2
  1772. ; PROCESS DUPLICATE LABEL ERROR
  1773. ERRD:    MVI    A,'D'
  1774.     STA    OBUF+18
  1775.     CALL    AOUT
  1776.     JMP    OPC
  1777. ; DEFINE INPUT AND OUTPUT PORTS
  1778. ;
  1779. USTA    EQU    0        ;UART STATUS
  1780. UDAI    EQU    1        ;DATA IN
  1781. UDAO    EQU    1        ;DATA OUT
  1782. PDAI    EQU    6        ;PROM DATA IN
  1783. PADO    EQU    7        ;PROM ADDRESS OUT
  1784. PDAO    EQU    8        ;PROM DATA OUT
  1785. PCTO    EQU    9        ;PROM CONTROL OUT
  1786. SWCH    EQU    0FFH
  1787. ; FILE AREA PARAMETERS
  1788. MAXFIL    EQU    6        ;MAX # OF FILES
  1789. NMLEN    EQU    5        ;NAME LENGTH
  1790. FELEN    EQU    NMLEN+8        ;DIRECTORY ENTRY LENGTH
  1791. FILE0:    DS    NMLEN
  1792. BOFP:    DS    2
  1793. EOFP:    DS    2
  1794. MAXL:    DS    4
  1795. FILTB:    DS    (MAXFIL-1)*FELEN
  1796. INSP:    DS    2        ;INSERT LINE POSITION
  1797. DELP    EQU    INSP        ;DELETE LINE POSITION
  1798. ASCR    EQU    13        ;ASCII CARRIAGE RETURN VALUE
  1799. HCON:    DS    2
  1800. ADDS    EQU    HCON        ;FIND ADDRESS
  1801. FBUF:    DS    NMLEN        ;FILE NAME BUFFER
  1802. FREAD:    DS    2        ;FREE ADDRESS IN DIRECTORY
  1803. FEF:    DS    1        ;FREE ENTRY FOUND FLAG
  1804. FOCNT    EQU    FEF        ;OUTPUT COUNTER
  1805. ABUF:    DS    12        ;ASCII BUFFER
  1806. BBUF:    DS    4        ;BINARY BUFFER
  1807. SCNT:    DS    1    
  1808. DCNT:    DS    1        ;DUMP ROUTINE COUNTER
  1809. NCOM    EQU    10        ;NUMBER OF COMMANDS
  1810. TABA:    DS    2        ;SYMBOL TABLE END ADDRESS
  1811. ASPC:    DS    2        ;ASSEMBLER PROGRAM COUNTER
  1812. PASI:    DS    1        ;PASS INDICATOR
  1813. NCHR:    DS    1        ;LENGTH OF STRING FOR COMPARE
  1814. PNTR:    DS    2        ;LINE POINTER STORAGE
  1815. NOLA:    DS    1        ;NUMBER OF LABELS
  1816. SIGN:    DS    1        ;SIGN STORAGE FOR SCAN
  1817. OPRD:    DS    2        ;OPERAND STORAGE
  1818. OPRI:    DS    1        ;OPERAND FOUND INDICATOR
  1819. TEMP:    DS    1
  1820. APNT    EQU    INSP        ;ASSEMBLER LINE POINTER
  1821. AERR    EQU    SCNT        ;ASSEMBLER ERROR PRINT SWITCH
  1822. OIND:    DS    2        ;OUTPUT ADDRESS
  1823. LLAB    EQU    5        ;LENGTH OF LABELS
  1824. AREA:    DS    18
  1825. OBUF:    DS    25        ;OUTPUT BUFFER AREA
  1826.     DS    5
  1827. IBUF:    DS    83
  1828. SYMT    EQU    $        ;START OF SYMBOL TABLE
  1829.     END
  1830.