Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II
  3. ; Autor: Joerg Vollandt
  4. ; erstellt am : 21.05.1994
  5. ; letzte Aenderung am : 02.08.1994
  6. ; Bemerkung : Routinen fuer die Speicherverwaltung
  7. ;
  8. ; Dateiname : mem1.asm
  9. ;
  10.  
  11. ;=====================================================================
  12. ; Definitionen der Funktionen des Seichermoduls
  13.  
  14. ;INIT_MEM        Initialisieren des Speichermoduls
  15. ;DEINIT_MEM      Deinitialisieren des Speichermoduls
  16. ;CLEAR_MEM       Speicher loeschen
  17. ;RESET_MEM       Speicher zum lesen zuruecksetzen
  18. ;PUT_ELEMENT_MEM Element anf naechste freie Position schreiben
  19. ;GET_ELEMENT_MEM Element von akt. Position lesen
  20. ;WR_MEM_PC       Speicher auf dem PC speichern.
  21. ;RD_MEM_PC       Speicher vom PC laden.
  22.  
  23. ;------------------------------------------------------------------------------
  24.  
  25. ;Messagedefinitionen
  26.  
  27. ;1.Dateityp (Bit 0 und Bit 1)
  28. Msg_PC_To_Net           equ     00b             ;direkte Eingabe von Hex-Messages fБr das Netz
  29. Msg_Frs_Datei           equ     01b             ;FrДstischdatei
  30. Msg_Rob_Teach_Datei     equ     10b             ;Roboter-Teach-In-Datei
  31. Msg_Frs_Teach_Datei     equ     11b             ;FrДstisch-Teach-In-Datei
  32.  
  33. ;2.Aktion (Bit 2 und Bit 3)
  34. Msg_PC_Get              equ     0000b           ;Rekordanfrage an PC
  35. Msg_PC_Put              equ     0100b           ;Rekordspeichern Slave=>PC, Rekordausgabe PC=>Slave
  36. Msg_PC_Reset            equ     1000b           ;PC Datei Фffnen zum Lesen
  37. Msg_PC_Rewrite          equ     1100b           ;PC Datei Фffnen zum Schreiben
  38.  
  39. ;3.Slaveadresse Slave=>PC ; Msg_From_PC PC=>Slave
  40. Msg_From_PC             equ     00000000b       ;Antwort auf Anfrage
  41.  
  42. EOF_Record              equ     0ffffh          ;
  43. PC_Slave_Adr            equ     0eh             ;
  44.  
  45. ;------------------------------------------------------------------------------
  46. ; Speicherdefinitionen
  47.  
  48.  
  49.         SEGMENT DATA
  50.  
  51. CHECKSUMME      DW      ?
  52.  
  53.  
  54.         SEGMENT XDATA
  55.  
  56. POINTER         DW      ?               ; fuer Test
  57. NEXT_FREE       DW      ?
  58. RD_POINTER      DW      ?
  59. BLOCKNR         DW      ?
  60.  
  61. MEM_ANF         DB      1000 DUP (?)      ; Speichergroesse in Bytes
  62. MEM_ENDE
  63.  
  64. ;---------------------------------------------------------------------
  65.         SEGMENT CODE
  66. ;---------------------------------------------------------------------
  67. ; Funktion : Initialisieren des Speichermoduls
  68. ; Aufrufparameter : -
  69. ; Ruechgabeparameter : -
  70. ; Veraenderte Register : -
  71. ; Stackbedarf :
  72. ; Zeitbedarf :
  73. ;
  74.  
  75. INIT_MEM:
  76.         PUSH PSW
  77.         PUSH_DPTR
  78.         MOV DPTR,#MEM_ANF
  79.         SET_16 NEXT_FREE
  80.         SET_16 RD_POINTER
  81.         MOV CHECKSUMME,#0
  82.         MOV CHECKSUMME+1,#0
  83.         CLR READY
  84.         CLR CRC
  85.  
  86.         POP_DPTR
  87.         POP PSW
  88.         RET
  89.  
  90. ;---------------------------------------------------------------------
  91. ; Funktion : Deinitialisieren des Speichermoduls
  92. ; Aufrufparameter : -
  93. ; Ruechgabeparameter : -
  94. ; Veraenderte Register : -
  95. ; Stackbedarf :
  96. ; Zeitbedarf :
  97. ;
  98.  
  99. DEINIT_MEM:
  100.  
  101.         RET
  102.  
  103. ;---------------------------------------------------------------------
  104. ; Funktion : Speicher loeschen
  105. ; Aufrufparameter : -
  106. ; Ruechgabeparameter : -
  107. ; Veraenderte Register : -
  108. ; Stackbedarf :
  109. ; Zeitbedarf :
  110. ;
  111.  
  112. CLEAR_MEM:
  113.         PUSH PSW
  114.         PUSH_DPTR
  115.         MOV DPTR,#MEM_ANF
  116.         SET_16 NEXT_FREE
  117.         SET_16 RD_POINTER
  118.         MOV CHECKSUMME,#0
  119.         MOV CHECKSUMME+1,#0
  120.         CLR READY
  121.         CLR CRC
  122.  
  123.         POP_DPTR
  124.         POP PSW
  125.         RET
  126.  
  127. ;---------------------------------------------------------------------
  128. ; Funktion : Speicher zum lesen zuruecksetzen
  129. ; Aufrufparameter : -
  130. ; Ruechgabeparameter : -
  131. ; Veraenderte Register : -
  132. ; Stackbedarf :
  133. ; Zeitbedarf :
  134. ;
  135.  
  136. RESET_MEM:
  137.         PUSH_DPTR
  138.         MOV DPTR,#MEM_ANF
  139.         SET_16 RD_POINTER
  140.  
  141.         POP_DPTR
  142.         RET
  143.  
  144. ;---------------------------------------------------------------------
  145. ; Funktion : Speicher von MEM_ANF bis NEXT_FREE auf dem PC speichern.
  146. ; Aufrufparameter : -
  147. ; Ruechgabeparameter : -
  148. ; Veraenderte Register : -
  149. ; Stackbedarf :
  150. ; Zeitbedarf :
  151. ;
  152.  
  153. WR_MEM_PC:
  154.         PUSH_ALL
  155.         ; MOV A,#MSG_PC_REWRITE+MY_SLAVE_ADR1*16
  156.         MOV A,MY_SLAVE_ADR
  157.         SWAP A                             ; *16
  158.         ADD A,#MSG_PC_REWRITE
  159.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  160.         SETB ACC.1
  161.         MOV R0,A
  162.         MOV A,#PC_Slave_Adr                       ; Datei oeffnen
  163.         MOV B,#8
  164.         SEND_NET
  165.  
  166.         ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16
  167.         MOV A,MY_SLAVE_ADR
  168.         SWAP A                             ; *16
  169.         ADD A,#MSG_PC_PUT
  170.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  171.         SETB ACC.1
  172.         MOV R0,A
  173.         MOV A,#PC_Slave_Adr                       ; Header zusammenstellen
  174.         MOV B,#8
  175.         MOV DPTR,#0
  176.         SET_16 BLOCKNR                  ; Blocknr.=0 setzen
  177.         MOV R1,DPL                      ; Blocknr.
  178.         MOV R2,DPH
  179.         GET_16 NEXT_FREE
  180.         SUBB_DPTR MEM_ANF
  181.         MOV R3,DPL                      ; Anzahl Bytes
  182.         MOV R4,DPH
  183.         LCALL CHECK_SUM
  184.         MOV R5,CHECKSUMME               ; Pruefsumme
  185.         MOV R6,CHECKSUMME+1
  186.         SEND_NET                        ; Header senden
  187.  
  188.         MOV DPTR,#MEM_ANF
  189.         SET_16 POINTER                  ; Zeiger auf MEM_ANF setzen
  190.  
  191. WR_MEM_MSG:
  192.         LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!!
  193.         JNC WR_MEM_MSG1
  194.         LJMP WR_MEM_CLOSE               ; keine Bytes mehr -> close datei
  195. WR_MEM_MSG1:
  196.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  197.         MOV R3,A                        ; Message aufbauen
  198.         LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!!
  199.         JNC WR_MEM_MSG2
  200.         LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben
  201. WR_MEM_MSG2:
  202.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  203.         MOV R4,A                        ; Message aufbauen
  204.         LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!!
  205.         JNC WR_MEM_MSG3
  206.         LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben
  207. WR_MEM_MSG3:
  208.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  209.         MOV R5,A                        ; Message aufbauen
  210.         LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!!
  211.         JNC WR_MEM_MSG4
  212.         LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben
  213. WR_MEM_MSG4:
  214.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  215.         MOV R6,A                        ; Message aufbauen
  216.         LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!!
  217.         JNC WR_MEM_MSG5
  218.         LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben
  219. WR_MEM_MSG5:
  220.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  221.         MOV R7,A                        ; Message aufbauen
  222.         PUSH_DPTR
  223.         GET_16 BLOCKNR
  224.         INC DPTR
  225.         SET_16 BLOCKNR                  ; Blocknr.=+1 setzen
  226.         MOV R1,DPL                      ; Blocknr.
  227.         MOV R2,DPH
  228.         POP_DPTR
  229.         ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16
  230.         MOV A,MY_SLAVE_ADR
  231.         SWAP A                             ; *16
  232.         ADD A,#MSG_PC_PUT
  233.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  234.         SETB ACC.1
  235.         MOV R0,A
  236.         MOV A,#PC_Slave_Adr
  237.         MOV B,#8
  238.         SEND_NET                        ; Message senden
  239.         LJMP WR_MEM_MSG                 ; naechste Message
  240.  
  241. WR_MEM_REST:
  242.         PUSH_DPTR                       ; nicht volle MSG schreiben
  243.         GET_16 BLOCKNR
  244.         INC DPTR
  245.         SET_16 BLOCKNR                  ; Blocknr.=+1 setzen
  246.         MOV R1,DPL                      ; Blocknr.
  247.         MOV R2,DPH
  248.         POP_DPTR
  249.         ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16
  250.         MOV A,MY_SLAVE_ADR
  251.         SWAP A                             ; *16
  252.         ADD A,#MSG_PC_PUT
  253.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  254.         SETB ACC.1
  255.         MOV R0,A
  256.         MOV A,#PC_Slave_Adr
  257.         MOV B,#8
  258.         SEND_NET                                ; Message senden
  259.  
  260. WR_MEM_CLOSE:
  261.         ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16
  262.         MOV A,MY_SLAVE_ADR
  263.         SWAP A                             ; *16
  264.         ADD A,#MSG_PC_PUT
  265.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  266.         SETB ACC.1
  267.         MOV R0,A
  268.         MOV         A,#PC_Slave_Adr            ; Datei schlieсen
  269.         MOV         B,#8
  270.         MOV         R1,#(EOF_RECORD#256)
  271.         MOV         R2,#(EOF_RECORD/256)
  272.         SEND_NET
  273.         POP_ALL
  274.         RET
  275.  
  276. ;---------------------------------------------------------------------
  277. ; Funktion : Speicher vom PC laden.
  278. ; Aufrufparameter : -
  279. ; Ruechgabeparameter : -
  280. ; Veraenderte Register : -
  281. ; Stackbedarf :
  282. ; Zeitbedarf :
  283. ;
  284.  
  285. RD_MEM_PC:
  286.         PUSH_ALL
  287.         ; MOV A,#MSG_PC_RESET+MY_SLAVE_ADR1*16
  288.         MOV A,MY_SLAVE_ADR
  289.         SWAP A                             ; *16
  290.         ADD A,#MSG_PC_RESET
  291.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  292.         SETB ACC.1
  293.         MOV R0,A
  294.         MOV A,#PC_Slave_Adr                       ; Datei oeffnen
  295.         MOV B,#8
  296.         SEND_NET
  297.         ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16
  298.         MOV A,MY_SLAVE_ADR
  299.         SWAP A                             ; *16
  300.         ADD A,#MSG_PC_GET
  301.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  302.         SETB ACC.1
  303.         MOV R0,A
  304.         MOV A,#PC_Slave_Adr                       ; Header laden
  305.         MOV B,#8
  306.         MOV DPTR,#0
  307.         SET_16 BLOCKNR                          ; Blocknr.=0 setzen
  308.         MOV R1,DPL                              ; Blocknr.
  309.         MOV R2,DPH
  310.         SEND_NET                                ; Header anfordern
  311.         POP_ALL
  312.         RET
  313.  
  314.  
  315. GET_FROM_PC:
  316.         PUSH_ALL
  317.         CJNE R1,#0,GET_NO_HEADER1       ; wenn Blocknr.=0, dann
  318.         CJNE R2,#0,GET_NO_HEADER1       ; Header
  319.         LJMP GET_HEADER
  320. GET_NO_HEADER1:
  321.         LJMP GET_NO_HEADER
  322. GET_HEADER:
  323.         CJNE R3,#0,GET_NOT_EMPTY_JMP    ; testen ob 0 Bytes in Datei
  324.         CJNE R4,#0,GET_NOT_EMPTY_JMP
  325.         LJMP GET_EMPTY
  326. GET_NOT_EMPTY_JMP:
  327.         LJMP GET_NOT_EMPTY
  328.  
  329. GET_EMPTY:                              ; Datei leer
  330.         LCALL INIT_MEM                  ; Speicherreset
  331.         ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16
  332.         MOV A,MY_SLAVE_ADR
  333.         SWAP A                          ; *16
  334.         ADD A,#MSG_PC_PUT
  335.         MOVB ACC.0,P3.5                 ; Datei fuer Roboter oder Fraese
  336.         SETB ACC.1
  337.         MOV R0,A
  338.         MOV         A,#PC_Slave_Adr     ; und Datei schlieсen
  339.         MOV         B,#8
  340.         MOV         R1,#(EOF_RECORD#256)
  341.         MOV         R2,#(EOF_RECORD/256)
  342.         SEND_NET
  343.         POP_ALL
  344.         SETB READY
  345.         LCD 40H,"Teachin- Datei leer.                    "
  346.         RET
  347.  
  348. GET_NOT_EMPTY:                          ; Datei nicht leer
  349.         MOV DPL,R3                      ; Groesse nach DPTR
  350.         MOV DPH,R4
  351.         ADD_DPTR MEM_ANF
  352.         SET_16 NEXT_FREE                ; neues Speicherende setzen
  353.         MOV CHECKSUMME,R5               ; neue Checksumme laden
  354.         MOV CHECKSUMME+1,R6
  355.         PUSH_DPTR
  356.         GET_16 BLOCKNR
  357.         INC DPTR
  358.         SET_16 BLOCKNR                  ; Blocknr.=+1 setzen
  359.         MOV R1,DPL                      ; Blocknr.
  360.         MOV R2,DPH
  361.         POP_DPTR
  362.         ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16
  363.         MOV A,MY_SLAVE_ADR
  364.         SWAP A                             ; *16
  365.         ADD A,#MSG_PC_GET
  366.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  367.         SETB ACC.1
  368.         MOV R0,A
  369.         MOV A,#PC_Slave_Adr
  370.         MOV B,#8
  371.         SEND_NET                        ; 1. Block anfordern
  372.  
  373.         MOV DPTR,#MEM_ANF
  374.         SET_16 POINTER                  ; Zeiger auf MEM_ANF setzen
  375.  
  376.         POP_ALL
  377.         RET
  378.  
  379. GET_NO_HEADER:
  380.         GET_16 POINTER                  ; Schreibzeiger laden
  381.         MOV A,R3
  382.         LCALL ACC_WR_MEM                ; in den Speicher schreiben
  383.         LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei
  384.         JNC GET_MORE2
  385.         LJMP GET_CLOSE                  ; wenn nicht Datei schliessen
  386. GET_MORE2:
  387.         MOV A,R4
  388.         LCALL ACC_WR_MEM                ; in den Speicher schreiben
  389.         LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei
  390.         JNC GET_MORE3
  391.         LJMP GET_CLOSE                  ; wenn nicht Datei schliessen
  392. GET_MORE3:
  393.         MOV A,R5
  394.         LCALL ACC_WR_MEM                ; in den Speicher schreiben
  395.         LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei
  396.         JNC GET_MORE4
  397.         LJMP GET_CLOSE                  ; wenn nicht Datei schliessen
  398. GET_MORE4:
  399.         MOV A,R6
  400.         LCALL ACC_WR_MEM                ; in den Speicher schreiben
  401.         LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei
  402.         JNC GET_MORE5
  403.         LJMP GET_CLOSE                  ; wenn nicht Datei schliessen
  404. GET_MORE5:
  405.         MOV A,R7
  406.         LCALL ACC_WR_MEM                ; in den Speicher schreiben
  407.         LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei
  408.         JNC GET_MORE6
  409.         LJMP GET_CLOSE                  ; wenn nicht Datei schliessen
  410. GET_MORE6:
  411.         SET_16 POINTER
  412.         GET_16 BLOCKNR
  413.         INC DPTR
  414.         SET_16 BLOCKNR                  ; Blocknr.=+1 setzen
  415.         MOV R1,DPL                      ; Blocknr.
  416.         MOV R2,DPH
  417.         ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16
  418.         MOV A,MY_SLAVE_ADR
  419.         SWAP A                             ; *16
  420.         ADD A,#MSG_PC_GET
  421.         MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese
  422.         SETB ACC.1
  423.         MOV R0,A
  424.         MOV A,#PC_Slave_Adr
  425.         MOV B,#8
  426.         SEND_NET                        ; naechsten Block anfordern
  427.         POP_ALL
  428.         RET
  429.  
  430.  
  431. GET_CLOSE:
  432.         ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16
  433.         MOV A,MY_SLAVE_ADR
  434.         SWAP A                             ; *16
  435.         ADD A,#MSG_PC_PUT
  436.         MOVB ACC.0,P3.5                      ; Datei fuer Roboter oder Fraese
  437.         SETB ACC.1
  438.         MOV R0,A
  439.         MOV         A,#PC_Slave_Adr               ; und Datei schlieсen
  440.         MOV         B,#8
  441.         MOV         R1,#(EOF_RECORD#256)
  442.         MOV         R2,#(EOF_RECORD/256)
  443.         SEND_NET
  444.         MOV R0,CHECKSUMME
  445.         MOV A,CHECKSUMME+1
  446.         LCALL CHECK_SUM
  447.         CJNE A,CHECKSUMME+1,GET_CRC_ERROR
  448.         MOV A,R0
  449.         CJNE A,CHECKSUMME,GET_CRC_ERROR
  450.         POP_ALL
  451.         CLR CRC
  452.         SETB READY
  453.         LCD 40H,"Teachin- Datei fehlerfrei geladen.      "
  454.         RET
  455.  
  456. GET_CRC_ERROR:
  457.         POP_ALL
  458.         SETB CRC
  459.         SETB READY
  460.         LCD 40H,"FEHLER bei Laden der Teachin- Datei.    "
  461.         RET
  462.  
  463. ;---------------------------------------------------------------------
  464. ; Funktion : Testen ob DPTR zum LESEN auf belegten Speicher zeigt.
  465. ;               C=0 ==> MEM_ANF <= DPTR < NEXT_FREE
  466. ;               C=1 ==> sonst
  467. ; Aufrufparameter : DPTR = Pointer
  468. ; Ruechgabeparameter : -
  469. ; Veraenderte Register : PSW
  470. ; Stackbedarf :
  471. ; Zeitbedarf :
  472. ;
  473.  
  474. CHECK_RD_POINTER:
  475.         PUSH PSW
  476.         PUSH ACC
  477.         MOV A,#((MEM_ANF-1)/256)
  478.         CJNE A,DPH,CH_RD1               ; Test ob Pointer >= MEM_ANF
  479. CH_RD1: JC CH_RD_OK1
  480.         CJNE A,DPH,CH_RD_ERROR          ;
  481.         MOV A,#((MEM_ANF-1)#256)
  482.         CJNE A,DPL,CH_RD2
  483. CH_RD2: JC CH_RD_OK1
  484.         LJMP CH_RD_ERROR                ;
  485. CH_RD_OK1:
  486.         PUSH_DPTR
  487.         MOV DPTR,#(NEXT_FREE+1)
  488.         MOVX A,@DPTR
  489.         POP_DPTR
  490.         CJNE A,DPH,CH_RD3               ; Test ob Pointer < NEXT_FREE
  491. CH_RD3: JC CH_RD_ERROR
  492.         CJNE A,DPH,CH_RD_OK2            ;
  493.         PUSH_DPTR
  494.         MOV DPTR,#NEXT_FREE
  495.         MOVX A,@DPTR
  496.         POP_DPTR
  497.         CJNE A,DPL,CH_RD4
  498. CH_RD4: JC CH_RD_ERROR
  499.         CJNE A,DPL,CH_RD_OK2
  500.         LJMP CH_RD_ERROR                ;
  501.  
  502. CH_RD_OK2:
  503.         POP ACC
  504.         POP PSW
  505.         CLR C                           ; o.k.
  506.         RET
  507.  
  508. CH_RD_ERROR:
  509.         POP ACC
  510.         POP PSW
  511.         SETB C                          ; Fehler
  512.         RET
  513.  
  514. ;---------------------------------------------------------------------
  515. ; Funktion : Testen ob DPTR zum SCHREIBEN auf belegten Speicher zeigt.
  516. ;               C=0 ==> MEM_ANF <= DPTR <= NEXT_FREE
  517. ;               C=1 ==> sonst
  518. ; Aufrufparameter : DPTR = Pointer
  519. ; Ruechgabeparameter : -
  520. ; Veraenderte Register : PSW
  521. ; Stackbedarf :
  522. ; Zeitbedarf :
  523. ;
  524.  
  525. CHECK_WR_POINTER:
  526.         PUSH PSW
  527.         PUSH ACC
  528.         MOV A,#((MEM_ANF-1)/256)
  529.         CJNE A,DPH,CH_WR1               ; Test ob Pointer >= MEM_ANF
  530. CH_WR1: JC CH_WR_OK1
  531.         CJNE A,DPH,CH_WR_ERROR          ;
  532.         MOV A,#((MEM_ANF-1)#256)
  533.         CJNE A,DPL,CH_WR2
  534. CH_WR2: JC CH_WR_OK1
  535.         LJMP CH_WR_ERROR                ;
  536. CH_WR_OK1:
  537.         PUSH_DPTR
  538.         MOV DPTR,#(NEXT_FREE+1)
  539.         MOVX A,@DPTR
  540.         POP_DPTR
  541.         CJNE A,DPH,CH_WR3               ; Test ob Pointer <= NEXT_FREE
  542. CH_WR3: JC CH_WR_ERROR
  543.         CJNE A,DPH,CH_WR_OK2            ;
  544.         PUSH_DPTR
  545.         MOV DPTR,#NEXT_FREE
  546.         MOVX A,@DPTR
  547.         POP_DPTR
  548.         CJNE A,DPL,CH_WR4
  549. CH_WR4: JNC CH_WR_OK2
  550.         LJMP CH_WR_ERROR                ;
  551.  
  552. CH_WR_OK2:
  553.         POP ACC
  554.         POP PSW
  555.         CLR C                           ; o.k.
  556.         RET
  557.  
  558. CH_WR_ERROR:
  559.         POP ACC
  560.         POP PSW
  561.         SETB C                          ; Fehler
  562.         RET
  563.  
  564. ;---------------------------------------------------------------------
  565. ; Funktion : Testen ob DPTR < MEM_ENDE.
  566. ;               C=0 ==> DPTR < MEM_ENDE
  567. ;               C=1 ==> sonst
  568. ; Aufrufparameter : DPTR = Pointer
  569. ; Ruechgabeparameter : -
  570. ; Veraenderte Register : PSW
  571. ; Stackbedarf :
  572. ; Zeitbedarf :
  573. ;
  574.  
  575. CHECK_EOM_POINTER:
  576.         PUSH PSW
  577.         PUSH ACC
  578.         MOV A,#(MEM_ENDE/256)
  579.         CJNE A,DPH,CH_EOM3               ; Test ob Pointer < MEM_ENDE
  580. CH_EOM3: JC CH_EOM_ERROR
  581.         CJNE A,DPH,CH_EOM_OK2            ;
  582.         MOV A,#(MEM_ENDE#256)
  583.         CJNE A,DPL,CH_EOM4
  584. CH_EOM4: JC CH_EOM_ERROR
  585.         CJNE A,DPL,CH_EOM_OK2
  586.         LJMP CH_EOM_ERROR                ;
  587.  
  588. CH_EOM_OK2:
  589.         POP ACC
  590.         POP PSW
  591.         CLR C                           ; o.k.
  592.         RET
  593.  
  594. CH_EOM_ERROR:
  595.         POP ACC
  596.         POP PSW
  597.         SETB C                          ; Fehler
  598.         RET
  599.  
  600. ;---------------------------------------------------------------------
  601. ; Funktion : ACC in den Speicher schreiben, DPTR increminieren.
  602. ; Aufrufparameter : ACC = Wert, DPTR = Pointer
  603. ; Ruechgabeparameter : -
  604. ; Veraenderte Register : DPTR
  605. ; Stackbedarf :
  606. ; Zeitbedarf :
  607. ;
  608.  
  609. ACC_WR_MEM:
  610.         MOVX @DPTR,A
  611.         INC DPTR
  612.         RET
  613.  
  614.  
  615. ;---------------------------------------------------------------------
  616. ; Funktion : ACC aus dem Speicher lesen, DPTR increminieren.
  617. ; Aufrufparameter : DPTR = Pointer
  618. ; Ruechgabeparameter : ACC = Wert
  619. ; Veraenderte Register : ACC, DPTR
  620. ; Stackbedarf :
  621. ; Zeitbedarf :
  622. ;
  623.  
  624. ACC_RD_MEM:
  625.         MOVX A,@DPTR
  626.         INC DPTR
  627.         RET
  628.  
  629. ;---------------------------------------------------------------------
  630. ; Funktion : Pruefsumme ueber den Speicher bilden.
  631. ; Aufrufparameter : -
  632. ; Ruechgabeparameter : -
  633. ; Veraenderte Register : -
  634. ; Stackbedarf :
  635. ; Zeitbedarf :
  636. ;
  637.  
  638. CHECK_SUM:
  639.         PUSH PSW
  640.         PUSH ACC
  641.         PUSH_DPTR
  642.         MOV CHECKSUMME,#0
  643.         MOV CHECKSUMME+1,#0
  644.         MOV DPTR,#MEM_ANF               ; Pointer auf MEM_ANF setzen
  645. CHECK_SUM1:
  646.         LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!!
  647.         JC CHECK_SUM_ENDE
  648.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  649.         ADD A,CHECKSUMME
  650.         MOV CHECKSUMME,A
  651.         MOV A,#0
  652.         ADDC A,CHECKSUMME+1
  653.         MOV CHECKSUMME+1,A
  654.         LJMP CHECK_SUM1
  655.  
  656. CHECK_SUM_ENDE:
  657.         POP_DPTR
  658.         POP ACC
  659.         POP PSW
  660.         RET
  661.  
  662. ;---------------------------------------------------------------------
  663. ; Funktion : Element in den Speicher auf die naechste frei Position schreiben.
  664. ; Aufrufparameter : ACC = Wert
  665. ; Ruechgabeparameter : C=0 ==> o.k., C=1 ==> Speicherueberlauf
  666. ; Veraenderte Register : -
  667. ; Stackbedarf :
  668. ; Zeitbedarf :
  669. ;
  670.  
  671. PUT_ELEMENT_MEM:
  672.         PUSH PSW
  673.         GET_16 NEXT_FREE
  674.         LCALL CHECK_EOM_POINTER         ; testen ob DPTR < MEM_ENDE
  675.         JC GET_ELEMENT_ERROR            ; wenn nicht Fehler
  676.         LCALL CHECK_WR_POINTER          ; testen ob MEM_ANF <= DPTR <= NEXT_FREE
  677.         JC PUT_ELEMENT_ERROR            ; wenn nicht Fehler
  678.         LCALL ACC_WR_MEM                ; Byte aus MEM lesen
  679.         SET_16 NEXT_FREE
  680.  
  681. PUT_EL_OK1:
  682.         POP PSW
  683.         CLR C
  684.         RET
  685.  
  686. PUT_ELEMENT_ERROR:
  687.         POP PSW
  688.         SETB C
  689.         RET
  690.  
  691.         RET
  692.  
  693. ;---------------------------------------------------------------------
  694. ; Funktion : Element von der akt. Position aus dem Speicher lesen.
  695. ; Aufrufparameter : -
  696. ; Ruechgabeparameter : ACC = Wert
  697. ;                      C=0 ==> o.k., C=1 ==> Schreib- gleich Lesezeiger
  698. ;                      oder Lesezeiger ausserhalb des gueltigen Bereiches
  699. ; Veraenderte Register : ACC, PSW
  700. ; Stackbedarf :
  701. ; Zeitbedarf :
  702. ;
  703.  
  704. GET_ELEMENT_MEM:
  705.         PUSH PSW
  706.         GET_16 RD_POINTER
  707.         LCALL CHECK_EOM_POINTER         ; testen ob DPTR < MEM_ENDE
  708.         JC GET_ELEMENT_ERROR            ; wenn nicht Fehler
  709.         LCALL CHECK_RD_POINTER          ; testen ob MEM_ANF <= DPTR < NEXT_FREE
  710.         JC GET_ELEMENT_ERROR            ; wenn nicht Fehler
  711.         LCALL ACC_RD_MEM                ; Byte aus MEM lesen
  712.         SET_16 RD_POINTER
  713.  
  714. GET_EL_OK1:
  715.         POP PSW
  716.         CLR C
  717.         RET
  718.  
  719. GET_ELEMENT_ERROR:
  720.         POP PSW
  721.         SETB C
  722.         RET
  723.  
  724. ;=====================================================================
  725. ;        END
  726. ;---------------------------------------------------------------------
  727.  
  728.